Latest steps to install Xubuntu (Ubuntu) on T100TA

First of all:

Please read these webpages:
  1. http://www.jfwhome.com/2016/01/04/latest-steps-to-install-ubuntu-on-the-asus-t100ta/
  2. http://askubuntu.com/questions/392719/32-bit-uefi-boot-support
  3. https://wiki.debian.org/InstallingDebianOn/Asus/T100TA
and forgive my broken English.


Introduction:

Pros in using Ubuntu rather than Windows on T100:
  • Nothing special, but I want.
  • Graphics: VLC can play ANY 1080p videos, even in high compression (while broken pictures in Windows VLC).
Cons in using Ubuntu rather than Windows on T100:
  • Touchscreen: Most software doesn't support touchscreen, only Evince and Eye of GNOME do. You can install add-ons in Firefox and Chrome to emulate, and no other software supports.
  • Touchscreen: OS can detect multitouch, but most software cannot recognize it (You can use two fingers to zoom in/out at Evince only).
  • Backlight: I can't try out any working solution, maybe I did something wrong.
  • Camera: Drop out thinking of it, it won't work anymore.
  • Bluetooth: I can't get it right, so I give up making it working.


Pros in using Xubuntu rather than Ubuntu on T100:
  • Less memory usage: Xubuntu only use 14% out of 2G after boot, while Ubuntu use 25% after boot. Even you open memory monster Firefox, it only consume about 22% memory.
  • Less QT-base program relative: I love KDE desktop, but it's not suitable installing on a 2G memory computer. Xubuntu can install GTK-based GUI program without re-installing GTK environment, this is why I choose Xubuntu.
Cons in using Xubuntu rather than Ubuntu on T100:
  • As of 16.04.1, built-in picture browsing software doesn't support touch screen. Use Eye of GNOME instead, it support basic touch gesture.


Pros in using x86 Xubuntu rather than x64 on T100:
  • Slightly less memory: about 2%.
  • Slightly running faster: a psychological effects, maybe.
Cons in using x64 Xubuntu rather than x86 on T100:
  • Google stop supporting softwares on x86 linux, like Google Chrome and Google Earth. It is not a big deal if you choose Chromium instead, but I must install Chrome Remote Desktop, so I give up x86 at last.




Installation:

  1. Media preparation:
  2. Take a USB drive, format to FAT32, copy all Xubuntu (Ubuntu, Kubuntu) ISO files to it, nothing special.

    Downlad debian-*-amd64-i386-netinst.iso from here, then do every steps on second link above. I have tried x86 and x64 installation, it both works.

    For x64: copy debian.iso/efi/boot/bootia32.efi to USB/EFI/BOOT/, and copy debian.iso/efi/boot/grub/i386-efi USB/boot/grub.

    Note 1:
    Using file manager is OK, rsync is not necessary.

    Note 2:
    Do NOT use bootloader bootia32.efi in first page link above (as he said), it is a little bit outdated. I used that file, and T100 got a lot of IO error while installing, it waste me 4 hours to try.

    Note 3:
    Please remove micro SD before installation, or you may get trouble.



  3. Xubuntu installer:
  4. At disk partition page, I wipe out the disk (create new table). I didn't use swap partition, it works fine until now. If you are worrying about this, you can add swap file after installation.

    Click "Next", and the installer will ask where are you.


    WAIT A SECOND!

    If the installer prompt a dialog ask you whether to continue(about UEFI and legacy BIOS booting, like this), PLEASE click "Continue" NOW. If you click at next step(ask your keyboard), the installer will hang. In this case, I reboot and start over the installation progress.

    Note 1:
    If the installer (or whole OS) hangs during installing progress, don't hesitate and reboot. I got this situation several times.

    Note 2:
    To prevent hangs, I move my mouse every 2 minutes at last, and wish T100 won't hang.

  5. First boot
  6. Just follow "First boot" to "Completing the installation" session in first link, but don't reboot at last instruction.

    Install grub manually(taken from third link):

    sudo apt install grub-efi-ia32
    sudo grub-install --target i386-efi

    And reboot.

  7. Sound

  8. Do "Sound" session on first link.

  9. Screen rotation

  10. Follow third link "Screen rotation" session. Script provided in first link doesn't work correctly.

Linux 中簡便的 No-IP 轉址服務指令

No-IP.com 有提供免費的轉址服務,在 Microsoft Windows® No-IP 官方有提供程式可以更新網址,但 Linux-based 上面卻没有,官方只有提供一個弱弱的程式還要自己編繹。在這裡提供一個很簡單的小批次檔方便大家:

if [ "`dig +short myip.opendns.com @208.67.220.222`" != "``dig +short example.no-ip.info @208.67.220.222``" ]; then
    wget -q -O - "https://example%40example.com:examplepassword@dynupdate.no-ip.com/nic/update?hostname=example.no-ip.info"
fi

  1. 要先安裝 dig ,以下是常見的安裝包:
  2. example.no-ip.info 請改成要更新的域名。
  3. example%40example.com 請改登入的信箱,注意「@」要改成「%40」。
  4. examplepassword 請改登入的密碼。
  5. 本批次檔是以 208.67.220.222 的 myip.opendns.com 和 example.no-ip.info 比對,不相符則要求 No-IP 更新。
  6. 會選 208.67.220.222 是希望可以不要去影響 OpenDNS 主要伺服器的負載,另外也不使用 resolver4.opendns.com 也是這個道理。
  7. 最後加上 cron 更新就非常好用了,也不用權限。
  8. 要注意本批次檔密碼傳輸時不會加密,使用時一定要注意。

使用 YouTube 的神器

youtube-dl:
用 Python 寫的下載器,在很多作業系統都可以使用。以下是常用到的參數:

  • -U, --update
  • 它會自動更新,但要注意如果是用套件安裝的話不要這樣更新。
  • --playlist-end NUMBER
  • 只分析從現在往前算幾個使用者或頻道所上傳的影片。
  • --match-title REGEX
  • 用正規表示法選擇要處理的影片;但個人不建議,先全部下載再分析比較好。
  • --dateafter YYYYMMDD
  • 某時間點之後的影片。
  • --download-archive FILE
  • 用一個 FILE 紀錄之前處理過哪些影片,下一次就不會重複處理。
  • -o, --output TEMPLATE
  • 輸出檔名,預設是 '%(title)s-%(id)s.%(ext)s',建議用 '%(title)s.%(ext)s'。
  • --restrict-filenames
  • 用不會出現亂碼的字,Windows 下有機率會用到。Linux 下只要在 /etc/locale.conf 設定 LC_ALL 是某個 UTF8 就不需要這個參數了。
  • --skip-download
  • 所有事情都會做,除了下載。
  • -f, --format FORMAT
  • 畫質,詳見維基百科。也可疊加,如 bestvideo+bestaudio 但要配合 FFmpeg 使用。
  • -F, --list-formats
  • 看 YouTube 有提供的畫質。

其他指令請自行去看 --help 推敲,因為上面這些就很夠用了。



youtube-upload:
在 Linux 下的程式,以下是常用到的參數:

  • --email=
  • --password=
  • --title=""
  • --description=""
  • 不用解釋。
  • --category=
  • 可以用 --get-categories 看。
  • --keywords=""
  • 逗號分隔。
  • --private
  • --unlisted
  • 任君選擇。

上傳 15 分要先手機認證,認證後還是超過的電視影片隔一段時間還是會先將影片設成私人,需要手動去解開。



kej.tw/flvretriever:
很陽春麻煩的網頁下載方式,但好處是永遠不會失效,出外只有瀏覽器時很好用。



以下是寫給酷看的: YouTube 大量批次下載、大量批次上傳、臨時行動可攜(Portable)下載方法。

Archlinux + KDE 安裝經驗

在 Archlinux 的維基頁面上的 Beginners' Guide 寫得又臭又長,所以在下寫一個精簡版來給個方便。
  1. 製作隨身碟
    • 最快的方法(UEFI)
    • 7-Zip光碟上除了 [BOOT] 資料夾之外全部複製到光碟,把隨身碟標籤換成 ARCH_201402 (請換成當年月, Linux 請安裝 mtools 用 mlabel -i /dev/sdX ::ARCH_201402 來改)。完成後重開機用 UEFI 開啟即可。

    • 標準作法(BIOS)
    • 用 dd、 Win32 Disk Imager 強制寫入(需用 fdisk 復原);或用 Universal USB InstallerYUMI 製作,但目前這二個軟體內建的 Syslinux 版本太舊無法支援(2014-02-08)。
  2. 連上網路
    • 以下是在有 DHCP 下的情況。

    • 有線網路
    • dhcpcd
    • 無線網路
    • wifi-menu
  3. 分割硬碟
  4. 先 lsblk 看你是哪一顆要割(假設是 /dev/sda), 1 GB = 1024 MB。

    • 主開機紀錄(Master Boot Record,MBR)
    • fdisk /dev/sda

      p 顯示、d 刪除、n 新增(大小可以用 +20G)、p 顯示、w 寫入。

    • 統一可延伸韌體介面(Unified Extensible Firmware Interface, UEFI)
    • gdisk /dev/sda

      d 刪除、n 新增(大小可以用 +20G、EFI System Partition 請設成 ef00)、p 顯示、w 寫入。

  5. 格式化分割區
  6. mkfs.ext4 /dev/sda1
    mkfs.vfat -F 32 /dev/sda1
    mkfs.ntfs /dev/sda1

  7. 掛載
    • 主開機紀錄(Master Boot Record,MBR)
    • mount /dev/sda1 /mnt

    • 統一可延伸韌體介面(Unified Extensible Firmware Interface, UEFI)
    • mount /dev/sda2 /mnt
      mkdir /mnt/boot
      mount /dev/sda1 /mnt/boot

  8. 編輯 Pacman 更新來源
  9. nano /etc/pacman.d/mirrorlist

    用 Ctrl+\ 取代 Server 成 ## Server ,再用 Ctrl+W 搜尋 Taiwan 來還原。

  10. 安裝系統
  11. pacstrap -i /mnt base base-devel

  12. 更新開機預設掛載
  13. genfstab -U -p /mnt >> /mnt/etc/fstab

  14. 進入系統設定
  15. arch-chroot /mnt

  16. 設定語系
  17. 不一定要設定(如果會英文可以跳過),開 .UTF-8 就好。後二行是設成預設,但不建議,因為中文支援度不好。

    nano /etc/locale.gen
    locale-gen
    echo LANG=zh_TW.UTF-8 > /etc/locale.conf
    export LANG=zh_TW.UTF-8

  18. 設定時區
  19. ln -s /usr/share/zoneinfo/Asia/Taipei /etc/localtime

  20. 設定系統名稱
  21. echo Username >/etc/hostname

  22. 設定 root 密碼
  23. passwd

  24. 設定新使用者
  25. 非必要,但有要用桌面環境一定要。

    useradd -m -g users -s /bin/bash user

  26. 設定新使用者密碼
  27. passwd user

  28. 安裝啟動程式
  29. 個人偏好 GRUB (雖然讓我很失望)。

    • 主開機紀錄(Master Boot Record,MBR)
    • pacman -S grub
      grub-install --target=i386-pc --recheck /dev/sda
      grub-mkconfig -o /boot/grub/grub.cfg

    • 統一可延伸韌體介面(Unified Extensible Firmware Interface, UEFI)
    • pacman -S grub efibootmgr
      grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=arch_grub --recheck
      grub-mkconfig -o /boot/grub/grub.cfg

  30. 網路再設定
  31. 如果沒有要裝桌面環境的請自行設定 netctl (複製 /etc/netctl/examples/ 範本到 /etc/netctl/ 中啟用, wifi-menu 也會產生);桌面環境的請不要設定,因為 NetworkManager 會設定。
    • 有線網路
    • 重開機再使用 dhcpcd 。
    • 無線網路
    • 先安裝 dialog、 wpa_supplicant, 重開機再使用 wifi-menu。

  32. 卸載重開機
  33. 重開機完成以 root 登入。

    exit
    mount -R /mnt
    reboot


  34. 先喝優酪乳
  35. 請慢慢打字。

    pacman -S wget

    wget https://aur.archlinux.org/packages/pa/package-query/package-query.tar.gz
    tar xzf package-query.tar.gz
    cd package-query
    makepkg -s -asroot
    pacman -U *.xz
    cd ..
    rm -rf package-query

    wget https://aur.archlinux.org/packages/ya/yaourt/yaourt.tar.gz
    tar xzf yaourt.tar.gz
    cd yaourt
    makepkg -s -asroot
    pacman -U *.xz
    cd ..
    rm -rf yaourt


  36. 補雜項
  37. pacman -S bash-completion
    EDITOR=nano visudo
    在 root ALL=(ALL) ALL 下一行補自己的使用者。

  38. 安裝 Xorg
  39. pacman -S pacman -S xorg-server xorg-server-utils xorg-xinit

  40. 安裝 KDE
  41. pacman -S kdebase-konsole kdebase-plasma kdebase-dolphin kdebase-kdialog kdebase-kfind kdesdk-kate kdesdk-dolphin-plugins kdemultimedia-kmix kdeadmin-ksystemlog

    字體選 ttf-dejavu ,多媒體選 phonon-vlc 。只裝這些就夠了,這樣就要下載 ~300MB 左右了。若是安裝 kdebase 至少還要多個 kde-wallpapers 100MB,原始 kde 或 kde-mesa 要下載 2GB 以上。如有需要可以再安裝下列程式:

    pacman -S kdegraphics-kcolorchooser kdegraphics-ksnapshot kdeartwork-sounds kdeartwork-styles kdeutils-kcalc kdeutils-print-manager

  42. 啟動 KDE
  43. 跳回去終端機的方法是 Ctrl + Alt + F4 。
    systemctl enable kdm
    systemctl start kdm

  44. 設定優酪乳
  45. cp /etc/yaourtrc ~/.yaourtrc
    nano ~/.yaourtrc

    設定 BUILD_NOCONFIRM=1 和 EDITFILES=0 。

  46. 安裝網路
  47. yaourt -S networkmanager kdeplasma-applets-plasma-nm
    sudo systemctl enable NetworkManager
    sudo systemctl start NetworkManager

  48. 安裝輸入法
  49. yaourt -S fcitx-im kcm-fcitx kdeplasma-addons-applets-kimpanel fcitx-chewing fcitx-table-extra

  50. 字體設定
  51. 先去維基對字體說明選幾個字體來裝。

    yaourt -S freetype2-ubuntu fontconfig-ubuntu cairo-ubuntu

  52. 自動對時
  53. yaourt -S ntp
    yaourt -S /etc/ntp.conf

    改成
    server tock.stdtime.gov.tw
    server watch.stdtime.gov.tw
    server time.stdtime.gov.tw
    server clock.stdtime.gov.tw
    server tick.stdtime.gov.tw
    完成之後
    sudo systemctl enable stpd
    sudo systemctl start stpd



以下是寫給酷看的: Archlinux 到 KDE 的安裝指令詳解。本文是參考 Archlinux 的維基而來,只留下必要的部份。

命令提示字元 00:教學目錄

網路上對於命令提示字元得出學者教學根本找不到,但這是所有想要深入電腦領域的必備知識,因此在這裡野人獻曝一番。本教學針對 Microsoft© Windows® 10 所寫的教學,版本是 1703。

在閱讀時有任何問題歡迎在下面直接留言,也歡迎老手來指教,就直接點下面的連結開始吧!

  1. 基本常識
  2. 熟悉環境
  3. 入門指令
  4. 小試身手
  5. 基本指令
  6. 承先啟後
  7. 符號總輯
  8. 進階指令
  9. 條件判斷
  10. 變數指令
  11. 目錄變數
  12. 檔案複製
  13. 撰批次檔
  14. 淺入淺出
  15. 外掛加持
  16. 文字文件
  17. 變數變換
  18. 迴圈入門
  19. 迴圈進階
  20. 說文解字
  1. 鵬程萬里




以下是給酷狗看的:本篇是命令提示字元的教學,採用 Microsoft© Windows® 10, Version 1703 繁體中文(zh-TW, Traditional Chinese)作業系統,即 cmd 或 command。

FFmpeg 簡易教學

若對「命令提示字元」不熟,可以先學習之後再來。



  1. FFmpeg 是什麼?
  2. 轉神。

  3. FFmpeg 可以吃嗎?
  4. 不可以。

  5. FFmpeg 要從哪裡開始理解啊?
  6. 起源。

  7. 啥?
  8. 「FFmpeg」、「Mplayer」和「VLC」是三個很早就開始開發的的大型程式,「FFmpeg」主攻影音轉檔、「Mplayer」主攻影音串流、「VLC」主攻影音播放。但之後三個互通有無,所以三個都有彼此的功能。

  9. 又再講古了。
  10. 還有很多古沒說!「FFmpeg」早期多在支援 VCD、DVD 等格式,所以使用上會有很多問題,經常會當掉。但最近大力開發解碼、libx264 ,讓使用上大幅加分。

  11. 還有古嗎?
  12. 因為 FFmpeg 希望有容乃大,所以裡面盡量包山包海,再加上 FFmpeg 利用 Linux 的特性,使用「lib」函式庫的特性,讓使用者可以選擇需要用的編碼或解碼器自行編譯,製出符合自己的 FFmpeg。

  13. 等一下,作業系統是怎麼回事?
  14. 因為開發環境的便利、作業系統穩定因素等等, FFmpeg 使用 Linux 做為開發環境,而 Windows 版相繼有很多人釋出編譯版本,目前最大的是 Zeranoe 的 FFmpeg。

  15. 等於說我們不用自己下載 FFmpeg 來編譯了嗎?
  16. 對,大型作業系統都有很多人編譯完成,只要去下載使用即可。事實上編譯 FFmpeg 是一個浩大工程,不但要知道需要加入什麼函式庫,更要知道發現錯誤時要怎麼解決。

  17. 可以開始了嗎?
  18. 好吧。 Windows 請去 http://ffmpeg.zeranoe.com/builds/ 下載最新 Static 版本。早期版本有差,但現在己經沒有那種問題了;而請它的作業系統請去軟體中心找 FFmpeg 安裝。Linux 的使用者可以直接透過軟體管理工具安裝,又或者可以選其他 Static 方案,像是這裡

  19. 接下來呢?
  20. Windows 請解開並取出 \bin\ffmpeg.exe,跟其它作業系統一樣,打 FFmpeg 就可以執行了。其他作業系統可以直接使用 ffmpeg。

  21. 要如何叫出說明?
  22. ffmpeg -h


  23. 這沒有人看的懂啊!
  24. 沒錯,但這已經是縮小版的了,可以看 ffmpeg -h long 或是 ffmpeg -h full 更長,而之前的說明都是完整說明,根本沒有人想看。

  25. 有沒有速解法啊?
  26. 最基本的用法如:
    ffmpeg -i input.mpg output.mp4


  27. 咦?什麼資訊都沒有加?
  28. 對, FFmpeg 會用預設的參數執行。在 -i 後面加上輸入檔,最後一個參數指定輸出檔,它會自動判斷檔名來使用不同的編碼器。

  29. 可是這不一定是我要的結果啊!
  30. 所以開始要加參數了嘛,如函式庫、轉檔要求等。

  31. 函式庫?有什麼?
  32. 對於「.mp4」檔案,影像常用的是「h264」,音訊常用的是「aac」。

  33. 所以要怎麼用?
  34. 去「ffmpeg -codecs」找,可以看到有「h264」和「aac」可以使用,這時只要加上參數變成:

    ffmpeg -i input.mpg -c:v libx264 -c:a aac output.mp4


    c:v 的意思是說,對於影片,用 libx264 的編碼器,c:a 的意思是說,對於聲音,用 aac 的編碼器。
  35. 那要怎麼調比碼率(Bit Rate)?
  36. 用 -b:v 和 -b:a ,注意不同編譯版單位不同,大寫的 K 和小寫的 k 是差很多的,可以去説明看。

    ffmpeg -i input.mpg -c:v libx264 -c:a aac -b:v 1M -b:a 256k output.mp4


  37. 使用 libx264 有什麼需要注意的?
  38. 這是一個很複雜的議題,請前往這裡看。

  39. 還要自己確認複寫,好累喔!
  40. 可以加上不確認複寫的參數,如:

    ffmpeg -y -i i.mpg -c:v libx264 -c:a aac -b:v 1M -b:a 256k -pass 1 o.mp4
    ffmpeg -y -i i.mpg -c:v libx264 -c:a aac -b:v 1M -b:a 256k -pass 2 o.mp4


  41. 難道只能用 .mp4 檔案?
  42. Xvid 也可以啊,如:

    ffmpeg -i i.mp4 -c:v mpeg4 -c:a mp3 o.mpg


  43. 那可以做成 DVD 的格式嗎?
  44. 可以啊,如:

    ffmpeg -i i.mp4 -target ntsc-dvd dvd.mpg


  45. 不能燒啊,你騙我。
  46. 其實用 FFmpeg 做實在太累了,建議用 DVDStyler

  47. FFmpeg 就只有這樣嗎?
  48. 「這樣」就已經煉了好幾年。當然,FFmpeg 不只這樣,其實有一個基本的功能沒有說。

  49. 你混啊!到底是什麼?
  50. FFmpeg 可以重新對一個影片重新整理(mux),像是如果要把格式換成 .mpg,可以下指令如下:

    ffmpeg -i i.ts -c copy o.mpg


    這裡必須要提醒輸出的格式必須是有意義的,像是上述的範例是原始 i.ts 就是用 MPEG 的編碼,要不然轉檔會失敗。
  51. 這好像也沒有什麼了不起啊?
  52. FFmpeg 可以使用方便的映射功能,範例如下:

    ffmpeg -i i.ts -map 0:0 -map 0:2 -map 0:1 o.mpg


    可以用 ffmpeg -i i.ts 看每一軌的編號,再依序用 -map 指令放進去,亦可指定放入的方式,如 -map 1:2 是指第一個 -i 的第三軌(從 0 開始),而 -c:a:2 是指依 -map 放入的音軌中第二個要使用的編碼器。也可以放入多個檔案,如 ffmpeg -i i1.ts -i i2.ts。

  53. 它會重新轉檔嗎?
  54. 在以前,若要直接複製一軌,要分別下 -c:v copy -c:a copy ,但現在只要:

    ffmpeg -i i.ts -c copy o.mpg


  55. 這用不到,下一個。
  56. FFmpeg 也可以用來切割影片, -ss 是指定從哪裡開始切, -t 是從 -ss 開始切幾秒。如:

    ffmpeg -i i.ts -ss 00:05:00.0 -t 00:55:00.0 o.ts


    有一些新的 FFmpeg 有提供 -to 的指令,是切出 -ss 到 -to 這段時間影片。
  57. 這個動好像有點久?
  58. 在 FFmpeg 的説明中,有説到把 -ss 放在 -i 後面是慢速搜尋,FFmpeg 會從檔案的一開始搜尋,直到找到影格為止。如果把指令放在前面,如下:

    ffmpeg -ss 00:05:00.0 -i i.ts -t 00:55:00.0 o.ts


    會用快速搜尋,FFmpeg 會直接用關鍵影格(Keyframe)搜尋,會比較快,在 FFmpeg 2.1 版後有提高精準度,可以考慮使用。
  59. 那要怎麼合併影片檔?
  60. 這個問題學問不淺,這裡提供基本做法,建議是在使用上述切影片的方式切出影片後,再行合併會比較没有問題。

    ffmpeg -f concat -safe 0 -i mylist.txt -c copy -map 0 o.ts


    其中 mylist.txt 是:

    file 'file1.ts'
    file 'file2.ts'
    file 'file3.ts'
  61. 還有嗎?
  62. FFmpeg 現在已經加入 FontConfig ,可以輕易實現字幕內嵌的功能。

  63. 聴起來不錯。
  64. 首先,要去 http://oss.netfarm.it/mplayer-win32.php 最新版的 Mplayer ,把裡面的 \fonts 資料夾解出來與 ffmpeg.exe 同一資料夾。其他作業系統應該裝 Mplayer 就可以了。

  65. 再來呢?
  66. 就可以轉檔了:

    ffmpeg -i i.mp4 -filter:v ass=i.ass o.mp4


    這個方法是把字幕嵌進影片,之後是没有辦法移除,如果只是單純的放字幕,可以考慮直接放進去(ffmpeg -i i.ass)就好。
  67. 這好像是濾鏡喔?
  68. FFmpeg 支持很多濾鏡,上例 ass 是其中一個,有興趣的可以看看。



在此提供一些往下延伸的教學網站:


寫完了,FFmpeg 是很強大但問題不少,有使用上的問題可以提問看看。但 FFmpeg 本身太複雜不可能一一回答,在中國大陸還有網友成立一整個論壇就是在討論 FFmpeg ,以個人微薄之力不可能全部回答。不過還是可以試試看,也許是這篇教學不完整也說不定。



以下是寫給酷看的: FFmpeg 在影音轉檔上經常受到重視,這也是這篇教學的主要目地。這篇教學也改用 Libav 的新指令,也都有基本範例。

命令提示字元 99:鵬程萬里

寫了這個標題也挻好笑的,但也想不出其他的,因為有了命令提示字元的基礎後就可以深造:

  • PowerShell
  • 微軟© 所提供進階使用的命令列工具,其實 PowerShell 才夠用。

  • 終端機
  • 終端機是 Linux-based 在使用的命令列工具,詳細教學鳥哥全部都有,有興趣的可以去買他的書。

其實在寫這篇教的時候原本打算只寫十章左右,但後來發現很多還是要提,所以加到二十章。這篇教學花了大概二個多月寫,寫起來還算順手,畢竟也用了一、二年了。在這裡要補足一下 Linux 終端機跟微軟© 命令提示字元的差異,因為很多東西不一樣:
  • 作業系統
  • 建議使用 Ubuntu 。

  • 檔案架構
  • 沒有 C:\ 這種東西了,取而代之的是 / ,下面有 /etc, /usr, /mnt, /boot, /home 等等,可以把任一個指定資料夾分到任一磁碟分割區,如 / 分到第一個分割區, /home 分到第二個分割區,這樣下次重灌不用再備份資料。

  • 權限
  • Linux 的權限是很複雜的,由其多了一個「執行」權限,即要有可執行權限才可執行程式。

  • 正規表示法
  • 用來處理字串的方法,幾乎可以處理大部份的問題,但要學也真的不好學。

  • 指令查詢
  • 除了 /? 、-h 、--help 的方法, Linux 還多了 man 的指令,如可用 man echo 查詢 echo 的用法。

  • 文字編輯
  • 內建命令列的文字編輯器 vi 雖然要背很多指令但很重要,要熟悉。

命令提示字元 16:文字文件

這章是要討論文字編碼及命令提示字元對於 Unicode 的支援。首先先來看最單純的:

ASCII

這是美國國家標準協會(ANSI)所制定的文字編碼方法,一共 128 個字,詳見維基百科



但 128 個實在沒有全球通用,所以國際標準化組織(ISO)就定義通用字符集 ISO 10646(Universal Character Set,UCS)來統一所有字集,經由統一碼聯盟(主要是一些企業)整理誕生了:

Unicode

有鑑於 ASCII 一個位元組(1 byte)不夠用,所以 Unicode 就用二個位元組(2 byte)來表示一個字,可達 65536 個字。對應字元的動作是「轉換格式」(Unicode Transformation Format,簡稱為 UTF),而二個位元組 Unicode 實作是:

UTF-16

這是 Unicode 的標準的名稱,在 ISO 的標準叫作 UCS-2 。另外 ISO 也定義了四個位元組,其 Unicode 實作是:

UTF-32

這是 Unicode 的標準的名稱,在 ISO 的標準叫作 UCS-4 。但實際上沒有那麼簡單,在麥金塔和個人電腦上讀取字元順序不同,如「U+4E59」,在個人電腦(像是 Windows)會取「4E59」的「乙」字;但麥金塔會取「594E」的「奎」字。為了區分,前者叫作大端序:

UTF-16 Big Endian (UCS-2 BE)
UTF-32 Big Endian (UCS-4 BE)

後者叫作小端序:

UTF-16 Little Endian (UCS-2 LE)
UTF-32 Little Endian (UCS-4 LE)

為了區別二者,編碼時會在文件第一個字加入位元組順序記號(Byte-Order Mark,BOM),第一個字是 U+FFFE 表示小端序;第一個字是 U+FEFF 表示大端序。



但原本 UTF-16 實在太粍空間了,原 ASCII 字集竟然要用二個位元組(2 byte),所以 Unicode 就創造了只用一個位元組(1 byte)存放的方法:

UTF-8

就是把 ASCII 字集第一位元(bit)置「0」以作識別,而其他字就是 UTF-16 字集。 UTF-8 因為編碼過所以不用考慮位元組序(因為很好辨識),但是微軟視窗作業系統的記事本就在所有文字文件檔(.txt)前面加上 0xEFBBBF 這個字來表示這是 UTF-8 ,但在大部份不支援的軟體(尤其是編譯器)會有問題,所以才會有另外一種文字文件產生:

UTF-8 without BOM

非常之好笑的是命令提示字元是不吃 BOM 的,當它被餵 BOM 時它會認為前面多一個字。



講那麼多是要接接下來的解釋,在前面也看到大部份的字元都要用到 Unicode ,當然在批次檔也有可能會用到,不過很可惜,命令提示字元支援得很差,啟用方法有二種,第一種是:

cmd /u

而第二種方法是:

chcp 65001

從 Windows® 10 中命令提示字元己經可以做一些 Unicode 的操作,這是相較之前幾版非常大的改進。連 .cmd 存成 Unicode 也是可以正常支援,這在以往是不行的。讀者可以嘗試對 Unicode 字元顯示,應該不會有什麼問題。但是 Unicode 字元眾多,使用時還是要再三確認執行是否正常,以免日後的批次檔出問題。

命令提示字元對 Unicode 支援進行大幅的改善,謝天謝地,這在之前是連想都不用想。字元編碼的部份也多少會一下,本教學已經整理得很精簡了,以後在使用上也不會有問題。下一章也跟這章性質很接近,會用到但不重要。



下一章:變數變換




  • 2012-09-11 初次發佈。
  • 2013-07-20 部分字句修改。
  • 2017-07-12 更新成 Windows 10 的版本。

命令提示字元 20:說文解字

這一章是來寫為何要寫整篇教學,就是要來寫「for」的說明到底在寫什麼東西。

for

首先,先來看看功用:

對一組檔案中的每個檔案執行指定的命令。

看完就引人發笑,看起來好像有說什麼,實際上又好像沒有。而且,「對一組檔案」根本是錯的。反正不可能用一句話完全解釋,就寫個「迴圈處理」就好了嘛。

FOR %variable IN (set) DO 命令 [command-parameters]

  %variable  指定一個可以取代的參數。
  (set)      指定由一或多個檔案組成的檔案組。您可使用通配字元。
  command    指定命令來執行每一個檔案。
  command-parameters
             為所指定的命令指定變數或參數。

如果要在批次程式中使用 FOR 命令,請指定 %%variable,而不要指定
%variable。變數名稱有大小寫的區分,所以 %i 不同於 %I。

這邊有很多地方寫得很引人模糊:
  1. 括弧裡面用「set」不懂的人會誤為是「set」指令。
  2. 「DO 命令」的「命令」就翻譯,那後面「[command-parameters]」為何不翻?下面「command」為何不翻?
  3. 注意喔,這邊是用「通配字元」。
  4. 「指定命令來執行每一個檔案」跟上面犯了同一個錯誤。
  5. 注意喔,這邊是用「參數」。
  6. 自行任意斷行,明明可以一行結束,或者是句號成一行,這樣看起來很痛苦。
繼續下去:

如果您啟用擴充命令,則額外支援下列的 FOR 命令格式:

這邊用「擴充命令」,天曉得它在說什麼?其實就是「參數」啦!後面「額外支援」也不知道額外支援什麼。

FOR /D %variable IN (set) DO command  [command-parameters]

    如果 set 中包含萬用字元,則指定與目錄名稱相符,
    而不是與檔案名稱相符。

這邊又用「萬用字元」,上面是「通配字元」。「則指定與目錄名稱相符,而不是與檔案名稱相符」它是說它會只丟執行目錄下的所有目錄,果然是天書。

FOR /R [[drive:]path] %variable IN (set) DO command  [command-parameters]

    在樹狀目錄中切換 [drive:] 路徑,並於樹狀目錄的每
    一個目錄下執行 FOR 陳述式。如果未在 /R 之後指定
    目錄規格,則採用目前的目錄。如果 set 只是單一句
    點 (.) 字元,則它只會列舉樹狀目錄。

「在樹狀目錄中切換」也是很奇怪的文句,「遞迴傳回」不就好了。「目錄規格」是?「採用目前的目錄」是?「則它只會列舉樹狀目錄」是指說它不會丟檔案,它指會丟底下所有目錄進去。

FOR /L %variable IN (start,step,end) DO command [command-parameters]

    set 是從開頭到結尾一次跳一步的連續數字。所以
    (1,1,5) 會產生連續值 (1 2 3 4 5) 而 (5,-1,1)
    會產生連續值 (5 4 3 2 1)

「從開頭到結尾一次跳一步的連續數字」天啊!這是哪一國的語言啊?

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

    或,如果使用 usebackq 選項:

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ('string') DO command [command-parameters]
FOR /F ["options"] %variable IN (`command`) DO command [command-parameters]

中間的「file-set」「string」「command」應該要翻譯,因為是要取代掉的字。可以看到的是他這邊又改成「選項」了,上面出現過「參數」、「擴充命令」。

    file-set 可以是一或多個檔案名稱。繼續進行 file-set 中的下個
    檔案之前,都已開啟、讀取及處理過每個檔案。處理程序包括讀取
    檔案、將它分割成獨立的文字行,然後將每一行剖析成零或多個語
    法。使用已設成找到之語法字串的變數值,呼叫 For 迴圈的內容。
    依照預設,/F 會從每個檔案的每一行傳送第一個以空格分隔的權
    杖。空白行會被略過。您可以指定選擇性的 "options" 參數來覆寫
    預設的剖析行為。這是有引號的字串,包含一或多個指定不同剖析
    選項的關鍵字。

前面四行看要有耐心,它是在說「for」的運作過程。「空格分隔的權杖」,來看看教育部對於「權杖」的解釋:「象徵某種權力的手杖」,也許個人國語不好,對不起。現在又用「參數」,接下來「剖析」本來就很奇怪,加上「行為」更可顯其冗。

    關鍵字是:

        eol=c           - 指定一個行尾註解字元 (只有一個)
        skip=n          - 指定在檔案開頭要略過的行數。
        delims=xxx      - 指定分隔符號集。這會取代預設的空格
                          與定位字元的分隔符號集。
        tokens=x,y,m-n  - 指定每一行的哪些語法應該被傳到 for
                          的內部以進行每一個重複操作。這會造
                          成配置額外的變數名稱。m-n 格式代表
                          一個範圍,指定了第 m 個到第 n 個權
                          杖。如果 tokens= 字串的最後一個字
                          元是星號,則會配置一個額外的變數並
                          在最後一個語法被剖析後接收該行中的
                          其他文字。
        usebackq        - 指定新語義開始作用。其中反括號的字
                          串會被當作命令來執行,而單引號字串
                          是純文字字串命令,並且允許使用雙引
                          號來引用 file-set 中的檔名。

是我理解錯誤嗎?「eol」應該是用在行首啊!「tokens」更是文謅謅到極致,「指定新語義開始作用」更是無法理解。

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

    這會剖析 myfile.txt 檔案中的每一行,它不會去管以分號開頭的行數
    ,直接將第 2 個及第 3 個語法從每一行傳到 for 主體,而其語法是
    用逗號和/或空格分開的。請注意,for 主體陳述式參照 %i 以取得第
    二個語法,參照 %j 以取得第三個語法,使用 %k 取得第三個語法之
    後的剩餘字串。因為檔案名稱含有空格,您必須用雙引號來括住檔案名
    稱。要這樣使用雙引號,您必須使用 usebackq 參數。否則雙引號會被
    解譯成用來定義一般文字。

「行數」「語法」都是亂翻,「主體」跟之前的「陳述式」不同,「用逗號和/或空格」邏輯跟本是錯的,「或」就夠了。又來了一個「參照」,而且「因為檔案名稱含有空格」在「myfile.txt」的哪裡?

    使用 %i 明白地在 for 陳述式中宣告,並透過 tokens= option 使用
    %j 作暗示性的宣告。您可以藉由 tokens= line 來指定最多 26 個語
    法,前提是它宣告的變數不能高於字母 'z' 或 'Z'。請記住,FOR 變
    數是單一字元的,同時在任一時間內,您不能同時使用超過 52 個 FOR
    變數。

「暗示性」是說它會把剩的丟到「%j」、「%k」等等。「不能高於字母 'z'」有什麼字母比 'z' 還高?「同時在任一時間內」,這是指現在、過去、還是未來?

    您也可以使用 FOR /F 命令在立即字串中剖析邏輯,方法是將括弧之間的
    file-set 變成一個引號字串。它會被視為從檔案輸入的單行,並加
    以剖析。

    最後,您可以使用 FOR /F 命令來剖析一個命令的輸出。方法是將括弧
    內的 file-set 變成單引號字串。它將被視為一個命令列,這個命令
    行將會傳到子 CMD.EXE,而輸出將會被擷取到記憶體中,當成檔案來分
    析。所以下列的範例:

        FOR /F "delims==" %i IN ('set') DO @echo %i

    將列舉目前環境中的環境變數名稱。

第一段就是「FOR /F 也可以用來剖析字串。」,第二段就是「FOR /F 也可以用來剖析其他程式的輸出。」

此外,已經加強了 FOR 變數參考的取代功能。
您現在可以選用下列選擇性的語法:

    %~I         - 展開 %I 且移除包圍的引號 (")
    %~fI        - 展開 %I 為一個完整合格路徑名稱
    %~dI        - 只展開 %I 為磁碟機代號
    %~pI        - 只展開 %I 為路徑
    %~nI        - 只展開 %I 為檔名
    %~xI        - 只展開 %I 為副檔名
    %~sI        - 展開的路徑只包含短檔名
    %~aI        - 展開 %I 為檔案的檔案屬性
    %~tI        - 展開 %I 為檔案的日期/時間
    %~zI        - 展開 %I 檔案的長度
    %~$PATH:I   - 搜尋所有列在 PATH 環境變數內的目錄且展開 %I
                  為第一個找到的完全符合檔名。如果沒有定義環境
                  變數名稱或是搜尋找不到檔案,則這個修飾元會展
                  開為空字串。

「此外,已經加強了」誰?「變數參考」是?「您現在可以」從?「選擇性的語法」是?「完整合格路徑名稱」是?「短檔名」是?「修飾元」是?

修飾元可以合併使用以獲得綜合的結果:

    %~dpI       - 只展開 %I 為磁碟機代號與路徑
    %~nxI       - 只展開 %I 為檔名與副檔名
    %~fsI       - 只展開 %I 為含短檔名的完全路徑
    %~dp$PATH:I - 為 %I 搜尋所有列在 PATH 環境變數內的目錄
                  且展開第一個找到的項目為磁碟機代號及路徑。
    %~ftzaI     - 展開 %I 為像 DIR 一樣的輸出行

這段看起來還可以看。

在上面的範例中 %I 和 PATH 能用其他的合法值取代。%~ 語法是由合法的
FOR 變數名稱來終止。如果選用像 %I 的大寫名稱可以增加可讀性而且避免
和修飾元的混淆,因為這些並不區分大小寫。

前面是在說所有 set 變數可以類似「%~$PATH:I」用法。中間是說以「%~」開頭的要以有宣告在「for」的變數作結尾(癈話)。後面是說大寫比較好,不容易搞混。



說完了,整篇教學也完了。其他像「set」「if」的說明也很經點,值得去看看。下一章有結語,有興趣的可以去看看。



下一章:鵬程萬里




  • 2012-09-11 初次發佈。

命令提示字元 19:迴圈進階

「/f」到底有什麼魅力呢?他功能多到必須要先解釋。首先,括弧裡面可用三種模式:

(檔案)
("字串")
('指令')

這樣沒有人看得懂,所以範例:

for /f %i in (Test.txt) do echo %i

因為預設是以空白(Space)或跳位(Tab)做切割,所以不是整行讀取。

for /f %i in ("This is a test.") do echo %i

也是以空白做分隔。

for /f %i in ('dir /b') do echo %i

這樣就可以知道「/f」的魅力了吧?



在前面參數可以自訂以取得想要的結果,用以下文字文件來解釋:


第一個「delims」:

for /f "delims=]" %i in (Test.txt) do echo %i

就是指定字元去分割字串,當然「]」不存在,所以整句會直接上去,預設是空白(Space)或跳位(Tab)。而下面這樣會比較好懂:

for /f "delims=a" %i in (Test.txt) do echo %i

二個字也行喔:

for /f "delims=ai" %i in (Test.txt) do echo %i

接下來是「skip」:

for /f "skip=1" %i in (Test.txt) do echo %i

就是第一行不要處理啦!下一個是「eol」:

for /f "eol=$" %i in (Test.txt) do echo %i

就是前面有符號「$」不要處理啦!下一個「tokens」比較複雜:

for /f "tokens=1,2,3" %i in (Test.txt) do echo %i %j %k

他是說,把字串以空白切出來,所以「This is a test.」會被切成「This」「is」「a」「test.」,而取其中第 1, 2, 3 段分別丟到 %i, %j, %k 中。這是「tokens」特殊用法,被切出來的會依序從原指令 in 前面的 %i 開始丟。下面這樣也可以:

for /f "tokens=1,2,3" %i in (Test.txt) do echo %i %j %k

用連字號也沒有問題。最後一個是沒有用過的「usebackq」:

for /f "usebackq" %i in ("Test.txt") do echo %i

是指原本用來表示「(檔案)」改成「("檔案")」、「("字串")」改成「('字串')」、「('指令')」改成「(`指令`)」。應該是為了要避免跳脫字元的關係,但個人沒有過的原因那就直接用跳脫字元就好了啊!補充一下:

for /f "eol=$ skip=1 tokens=1-4 delims=a" %i in ("Test.txt") do echo %k

參數是可以混搭的,要注意「delims」有可能需要用空白,所以建議擺在最後一個,避免判斷錯誤。



「for /f」實在是一個很實用的指令,但也是整個教學裡面最難學的。不過學完這個應該也會覺得還好,命令提示字元也不過爾爾,沒錯!的確沒有很難。下一章沒有新知識了,博君一笑罷了。



下一章:說文解字




  • 2012-09-11 初次發佈。
  • 2017-07-12 更新成 Windows 10 的版本。