• HP ML310e gen8 V2 system update

    The latest SPP for HP ML310e gen8 V2 is SPP Gen 8.1 (SPPGen81.4.iso)

    iLO4 will be updated to v2.55 by this SPP

  • Deploy draw.io app website on local LAN

    Create a new ESXi host with 2G RAM/ 20G disk, Debian 10

    # Install java JRE

    sudo apt install openjdk-11-jre
    java –version

    # Install apache ant

    wget https://downloads.apache.org/ant/binaries/apache-ant-1.10.12-bin.tar.xz
    tar xvfJ apache-ant-1.10.12-bin.tar.xz
    sudo mv apache-ant-1.10.12/ /usr/local/ant
    sudo bash -c ” cat >>/etc/profile ” << EOF
    ANT_HOME=”/usr/local/ant”
    PATH=”$PATH:/usr/local/ant/bin”
    export ANT_HOME
    export PATH
    EOF
    source /etc/profile
    ant –version

    # Install Tomcat

    sudo apt-get install tomcat9 tomcat9-admin

    http://127.0.0.1:8080/
    http://${SERVER_IP}:8080/
    ls -l /var/lib/tomcat9/webapps/ROOT/

    # Build drawio, war package

    wget https://github.com/jgraph/drawio/archive/refs/tags/v17.1.3.tar.gz
    tar xvfz v17.1.3.tar.gz
    cd drawio-17.1.3
    ( cd etc/build && ant war )

    # Install drwaio

    sudo cp build/draw.war /var/lib/tomcat9/webapps

    http://127.0.0.1:8080/draw
    http://${SERVER_IP}:8080/draw

    # Change draw as the root of tomcat

    cd /var/lib/tomcat9/webapps
    sudo rm -rf ROOT
    sudo mv draw.war ROOT.war

    http://127.0.0.1:8080
    http://${SERVER_IP}:8080

    # Change tomcat to the http default port: 80

    sudo grep 8080 /etc/tomcat9/*
    sudo sed -i “s/8080/80/g” /etc/tomcat9/server.xml

    http://127.0.0.1
    http://${SERVER_IP}

  • logname

    A utility of coreutils, which Print the name of the current user

    Posix API: getlogin

  • 无法创建 VMFS 数据存储 music – 无法更改主机配置

    Detach the disk from vmware console

    Enable vmware SSH

    ssh login

    esxcli storage core path list

    ls -ltrh /vmfs/devices/disks/

    partedUtil getptbl “/vmfs/devices/disk/t10.ATA_____WDC_WD40EFRX2D68WT0N0_________________________WD2DWCC4ENXFK993”

    partedUtil setptbl “/vmfs/devices/disk/t10.ATA_____WDC_WD40EFRX2D68WT0N0_________________________WD2DWCC4ENXFK993” msdos

  • Blog Migration

    Due to the low internet transfer speed, the blog has been moved from owned-networks vps ( Dallas Texas) to hostus vps of London England.

  • Web audio codec guide

    https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Audio_codecs

    Type

    audio/ogg

    codecs= FLAC

    codecs= Opus

    codecs= Vorbis

    audio/mp4

    codecs= AAC

    codecs= FLAC

    codecs= mp3

    codecs= Opus

    codecs= ALAC

    audio/wave

    audio/wav

    audio/x-wav

    audio/x-pn-wav

    audio/mp3

    audio/mpeg

    audio/webm

    codecs= Opus

    codecs= Vorbis

    audio/3gpp

    audio/3gpp2

    audio/aac

    audio/flac

    audio/x-flac

    Ogg/opus is great for music over internet:

    High quality, Simple software implementation, and Free.

    but not support by iPad/iPhone

    Mp4/AAC LC is the best selection for music over internet for Apple mobile product.

    In LAN, we can select Loseloss codec:

    Android: Ogg/FLAC

    iPad/iPhone: Mp4/ALAC

  • Creating udev rule for USB DAC

    Target:

    Create a new udev rule which will:

    Stop the Jack Daemon if DAC power off

    Start the Jack Daemon if DAC power on

    Identify USB DAC Card:

    Power on USB DAC

    Check the name of USB DAC

    ls -l /proc/asound/
    lrwxrwxrwx 1 root root 5 11月 22 17:55 AUDIO -> card2
    dr-xr-xr-x 3 root root 0 11月 16 18:43 card0
    dr-xr-xr-x 4 root root 0 11月 16 18:43 card1
    dr-xr-xr-x 4 root root 0 11月 22 17:55 card2
    -r–r–r– 1 root root 0 11月 16 16:36 cards
    -r–r–r– 1 root root 0 11月 16 18:43 devices
    lrwxrwxrwx 1 root root 5 11月 16 18:43 Generic -> card0
    -r–r–r– 1 root root 0 11月 16 18:43 hwdep
    -r–r–r– 1 root root 0 11月 16 18:43 modules
    dr-xr-xr-x 2 root root 0 11月 16 18:43 oss
    -r–r–r– 1 root root 0 11月 16 18:43 pcm

    card2 is the name of DAC Card

    ls  /sys/class/sound
    card0  card2      controlC1  hwC0D0  pcmC0D3p  pcmC1D0p  pcmC2D0p
    card1  controlC0  controlC2  hwC1D0  pcmC1D0c  pcmC2D0c  timer
    
    
    

    Get the Attr List of card2

    udevadm info /sys/class/sound/card2
    P: /devices/pci0000:00/0000:00:12.0/usb2/2-4/2-4:1.0/sound/card2
    L: 0
    E: DEVPATH=/devices/pci0000:00/0000:00:12.0/usb2/2-4/2-4:1.0/sound/card2
    E: SUBSYSTEM=sound
    E: USEC_INITIALIZED=523137960408
    E: ID_PATH=pci-0000:00:12.0-usb-0:4:1.0
    E: ID_PATH_TAG=pci-0000_00_12_0-usb-0_4_1_0
    E: ID_FOR_SEAT=sound-pci-0000_00_12_0-usb-0_4_1_0
    E: SOUND_INITIALIZED=1
    E: ID_VENDOR_FROM_DATABASE=Actions Semiconductor Co., Ltd
    E: ID_VENDOR=ACTIONS
    E: ID_VENDOR_ENC=ACTIONS
    E: ID_VENDOR_ID=10d6
    E: ID_MODEL=USB_AUDIO
    E: ID_MODEL_ENC=USB\x20AUDIO
    E: ID_MODEL_ID=dd01
    E: ID_REVISION=0100
    E: ID_SERIAL=ACTIONS_USB_AUDIO_4512482ADF0FEEEE
    E: ID_SERIAL_SHORT=4512482ADF0FEEEE
    E: ID_TYPE=audio
    E: ID_BUS=usb
    E: ID_USB_INTERFACES=:010100:010200:030000:
    E: ID_USB_INTERFACE_NUM=00
    E: ID_USB_DRIVER=snd-usb-audio
    E: ID_ID=usb-ACTIONS_USB_AUDIO_4512482ADF0FEEEE-00
    E: SYSTEMD_WANTS=sound.target
    E: TAGS=:systemd:seat:
    
    udevadm info --path=/sys/class/sound/card2 --attribute-walk
    
    looking at device '/devices/pci0000:00/0000:00:12.0/usb2/2-4/2-4:1.0/sound/card2':
        KERNEL=="card2"
        SUBSYSTEM=="sound"
        DRIVER==""
        ATTR{number}=="2"
        ATTR{id}=="AUDIO"
    
      looking at parent device '/devices/pci0000:00/0000:00:12.0/usb2/2-4/2-4:1.0':
        KERNELS=="2-4:1.0"
        SUBSYSTEMS=="usb"
        DRIVERS=="snd-usb-audio"
        ATTRS{supports_autosuspend}=="1"
        ATTRS{bInterfaceProtocol}=="00"
        ATTRS{authorized}=="1"
        ATTRS{bNumEndpoints}=="00"
        ATTRS{bInterfaceClass}=="01"
        ATTRS{bInterfaceNumber}=="00"
        ATTRS{bInterfaceSubClass}=="01"
        ATTRS{bAlternateSetting}==" 0"
    
      looking at parent device '/devices/pci0000:00/0000:00:12.0/usb2/2-4':
        KERNELS=="2-4"
        SUBSYSTEMS=="usb"
        DRIVERS=="usb"
        ATTRS{devpath}=="4"
        ATTRS{bDeviceProtocol}=="00"
        ATTRS{bmAttributes}=="c0"
        ATTRS{quirks}=="0x0"
        ATTRS{tx_lanes}=="1"
        ATTRS{product}=="USB AUDIO"
        ATTRS{busnum}=="2"
        ATTRS{bcdDevice}=="0100"
        ATTRS{bNumConfigurations}=="1"
        ATTRS{manufacturer}=="ACTIONS"
        ATTRS{bNumInterfaces}==" 4"
        ATTRS{bDeviceClass}=="00"
        ATTRS{configuration}==""
        ATTRS{maxchild}=="0"
        ATTRS{devnum}=="20"
        ATTRS{serial}=="4512482ADF0FEEEE"
        ATTRS{bMaxPower}=="300mA"
        ATTRS{idVendor}=="10d6"
        ATTRS{bDeviceSubClass}=="00"
        ATTRS{urbnum}=="25748"
        ATTRS{idProduct}=="dd01"
        ATTRS{version}==" 1.00"
        ATTRS{removable}=="unknown"
        ATTRS{authorized}=="1"
        ATTRS{bMaxPacketSize0}=="64"
        ATTRS{speed}=="12"
        ATTRS{rx_lanes}=="1"
        ATTRS{lATTRS{avoid_reset_quirk}=="0"
        ATTRS{bConfigurationValue}=="1"
    
      looking at parent device '/devices/pci0000:00/0000:00:12.0/usb2':
        KERNELS=="usb2"
        SUBSYSTEMS=="usb"DRIVERS=="usb"
        ATTRS{configuration}==""
        ATTRS{idProduct}=="0001"
        ATTRS{version}==" 1.10"
        ATTRS{tx_lanes}=="1"
        ATTRS{bNumInterfaces}==" 1"
        ATTRS{bDeviceClass}=="09"
        ATTRS{removable}=="unknown"
        ATTRS{authorized_default}=="1"
        ATTRS{bDeviceSubClass}=="00"
        ATTRS{interface_authorized_default}=="1"
        ATTRS{busnum}=="2"
        ATTRS{bDeviceProtocol}=="00"
        ATTRS{bMaxPower}=="0mA"
        ATTRS{quirks}=="0x0"
        ATTRS{speed}=="12"
        ATTRS{bcdDevice}=="0419"
        ATTRS{maxchild}=="5"
        ATTRS{idVendor}=="1d6b"
        ATTRS{devpath}=="0"
        ATTRS{manufacturer}=="Linux 4.19.0-9-amd64 ohci_hcd"
        ATTRS{avoid_reset_quirk}=="0"
        ATTRS{bMaxPacketSize0}=="64"
        ATTRS{rx_lanes}=="1"
        ATTRS{bmAttributes}=="e0"
        ATTRS{urbnum}=="511"
        ATTRS{bNumConfigurations}=="1"
        ATTRS{product}=="OHCI PCI host controller"
        ATTRS{serial}=="0000:00:12.0"
        ATTRS{bConfigurationValue}=="1"
        ATTRS{ltm_capable}=="no"
        ATTRS{devnum}=="1"
        ATTRS{authorized}=="1"
    
        
    
    # Get kernel prop
    udevadm monitor --kernel --property --subsystem-match=usb
    monitor will print the received events for:
    KERNEL - the kernel uevent
    
    KERNEL[1083.319560] add      /devices/pci0000:00/0000:00:12.0/usb2/2-4 (usb)
    ACTION=add
    DEVPATH=/devices/pci0000:00/0000:00:12.0/usb2/2-4
    SUBSYSTEM=usb
    DEVNAME=/dev/bus/usb/002/002
    DEVTYPE=usb_device
    PRODUCT=10d6/dd01/100
    TYPE=0/0/0
    BUSNUM=002
    DEVNUM=002
    SEQNUM=2112
    MAJOR=189
    MINOR=129

    Write your udev rule based on selected attrs

    cat /opt/local/libexec/udev/rules.d/99-AD-86d.rules

    ACTION=="add",SUBSYSTEM=="sound",ATTR{id}=="AUDIO",RUN+="/opt/local/bin/add_ad_86d.sh"
    ACTION=="remove",SUBSYSTEM=="usb",ATTRS{idVendor}=="10d6",ATTRS{idProduct}=="dd01",RUN+="/opt/local/bin/remove_ad_86d.sh"
  • Split Music Image in Debian

    Share my script used to split music image file into indivdual track of wav or flac

    OS: Debian/ununtu

    Install necessary tool:

    sudo apt-get clean

    sudo apt-get update

    sudo apt-get install -y shntool dos2unix enca flac ffmpeg

    Convert

    # output track in wav format

    sudo split.sh CDImage.wav wav

    # output track in flac format

    sudo split.sh CDImage.wav flac

    Split.sh

    #/bin/bash
    
    if [ $# -ne 2 ] && [ $# -ne 1 ]
    then
    
    echo "Usage:   sudo split.sh FILE [DECODE]"
    echo "Example: sudo split.sh CDImage wav"
    echo "         sudo split.sh CDImage flac"
    echo "         sudo split.sh CDImage.wav"
    echo "         sudo split.sh CDImage.wav flac"
    echo "         sudo split.sh CDImage"
    echo "Note:"
    echo "         The Input Audio File =   FILE.wav or FILE.flac or FILE.ape"
    echo "         DECODE               =   wav or flac (Output Audio Format)"
    echo "         The Input CUE File   =   FILE.cue"
    exit
    
    fi
    
    
    BFILE=$1
    
    if [ -f ${BFILE} ];then
      AUDIO_FILE=${BFILE}
      EXT=${BFILE##*.}
      case $EXT in
        "wav"|"WAV")
           FORMAT="wav"
           ;;
        "flac"|"FLAC")
           FORMAT="flac"
           ;;
        "ape"|"APE")
           FORMAT="ape"
           ;;
        esac
    else if [ -f $BFILE.wav ];then
           AUDIO_FILE=$BFILE.wav
           FORMAT="wav"
         else if [ -f $BFILE.flac ];then
                 AUDIO_FILE=$BFILE.flac
                 FORMAT="flac"
              else if [ -f $BFILE.ape ];then
                     AUDIO_FILE=$BFILE.ape
                     FORMAT="ape"
                   else
                     echo "Not found audio file: $1.wav or $1.flac or $1.ape "
                     echo "Exit"
                     exit
                   fi
              fi  
         fi
    fi
    
    
    if [ $# -ne 1 ];then
    DECODE=$2
    fi
    
    if [ "A${DECODE}B" = "AB" ];then
      DECODE="wav"
    fi
    
    
    if [ "A${FORMAT}B" = "AB" ];then
      FORMAT="${DECODE}"
    fi
    
    if [ "A${DECODE}B" = "AapeB" ];then
      DECODE="wav"
    fi
    
    
    echo "Audio  File   = ${AUDIO_FILE}"
    echo "Input  Format = ${FORMAT} " 
    echo "Output Format = ${DECODE} "
    
    
    if [ "$FORMAT" = "ape" ]
    then
    echo -e "First, convert ape format to ${DECODE} format, waite a minute..."
    DECODE_FILE=$BFILE.${DECODE}
    #avconv -i "$AUDIO_FILE" "$DECODE_FILE"
    ffmpeg -i "$AUDIO_FILE" "$DECODE_FILE"
    AUDIO_FILE=$DECODE_FILE
    CONVERT="true"
    FORMAT="${DECODE}"
    fi
    
    
    #if [ ! "$DECODE" = "$FORMAT" ];then
    #echo -e "First, convert ${FORMAT} format to ${DECODE} format, waite a 
    #minute..."
    #DECODE_FILE=$BFILE.${DECODE}
    #avconv -i "$AUDIO_FILE" "$DECODE_FILE"
    #ffmpeg -i "$AUDIO_FILE" "$DECODE_FILE"
    #AUDIO_FILE=$DECODE_FILE
    #CONVERT="true"
    #fi
    
    
    CUE_FILE=$BFILE.cue
    CUE_FILE_LINUX=$BFILE-linux.cue
    
    if [ ! -f ${CUE_FILE} ];then
      MY_DIR="`dirname ${BFILE}`"
      MY_NAME="`basename ${BFILE}`"
      MY_BASE="${MY_NAME%.*}"
      CUE_FILE=${MY_DIR}/${MY_BASE}.cue
      if [ ! -f ${CUE_FILE} ];then
       echo "unable to find cue file of:"
       echo "  $BFILE.cue or ${CUE_FILE} "
       exit
      fi
    fi
    
    CODE="`enca ${CUE_FILE} |grep ";"|sed "s/.*; //"`"
    echo "CODE=${CODE}"
    
    echo iconv -f "${CODE}" -t utf8 "$CUE_FILE" -o "$CUE_FILE_LINUX"
    
    iconv -f "${CODE}" -t utf8 "$CUE_FILE" -o "$CUE_FILE_LINUX"
    
    
    dos2unix "$CUE_FILE_LINUX"
    
    
    echo shntool split -t "%n-%t" -f "$CUE_FILE_LINUX" -o $DECODE "$AUDIO_FILE"
    shntool split -t "%n-%t" -f "$CUE_FILE_LINUX" -o $DECODE "$AUDIO_FILE"
    
    
    if [ "$CONVERT" = "true" ]
    then
    if [ ! "AB" = "A${DECODE_FILE}B" ];then
      if [ -f ${DECODE_FILE} ];then
       echo -e "Remove temporary flac file: $DECODE_FILE"
       rm -f "$DECODE_FILE"
      fi
    fi
    
    fi