2017年1月6日 星期五

使用 zenity 進度條的小眉角

zenity 是一個小程式用來顯示簡單的 GTK+ 對話框,其中也有進度條的選項。

$ zenity --help-progress
用法:
  zenity [選項…]

進度列選項
  --progress                              顯示進度指示窗
  --text=文字                             指定對話方塊中的文字
  --percentage=百分比                     指定開始時的百份比數值
  --pulsate                               令進度列內的方塊來回移動
  --auto-close                            當進度達到 100% 時關閉對話方塊
  --auto-kill                             若按下取消按鈕則中止父程序
  --no-cancel                             隱藏取消按鈕
  --time-remaining                        估計當進度到達 100% 的時間

使用上可將其它程式的標準輸入當成輸入,例如:

$ for i in {0..100..20}; do echo $i; sleep 1; done | \
  zenity --progress

如果想讓進度達到百分之百時自動結束可以加上 --auto-close

$ for i in {0..100..20}; do echo $i; sleep 1; done | \
  zenity --progress --auto-close
或是加上 --no-cancel 讓確定跟取消的按鈕都不見。
$ for i in {0..100..20}; do echo $i; sleep 1; done | \
  zenity --progress --auto-close --no-cancel

再加上 --time-remaining 剩餘時間的估計。

$ for i in {0..100..20}; do echo $i; sleep 1; done | \
  zenity --progress --auto-close --no-cancel --time-remaining

當然還可以使用其它元件都有的 --title 跟 --text 來客製對話框的訊息。

$ for i in {0..100..20}; do echo $i; sleep 1; done | \
  zenity --progress --auto-close --no-cancel --time-remaining --title "新建築正在倒塌中" --text "貓在鋼琴上昏倒了"

另外就是 --text 有支援一些簡單的 HTML 標籤,所以可以有一些變化。

$ for i in {0..100..20}; do echo $i; sleep 1; done | \
  zenity --progress --auto-close --no-cancel --time-remaining --title "新建築正在倒塌中" --text "<b>貓</b>在<u>鋼琴</u>上<i>昏倒</i>了\n謠言真可怕"

最後就是要小心其它程式所產生的標準輸出,像是 apt-get upgrade --yes 的輸出有時候會有數字開頭的訊息,這樣的訊息在使用 zenity --progress --auto-close 時都會導致對話框突然結束,任何超過 100 的數字都會結束程式。

2016年9月5日 星期一

Linux 系統上面的 NVIDIA 圖形顯示的私有驅動程式

NVIDIA 官方網站上面有提供驅動程式的下載,只是不曉得是否有支援我們正在使用的顯示晶片。

最直接的方式是將驅動程式下載後解開來看裡面的 README.txt 的內容,例如目前最新的 Beta 版本 NVIDIA-Linux-x86_64-370.23.run,下載後可執行以下指令來解開它。

$ bash NVIDIA-Linux-x86_64-370.23.run -x

然後就可以去查看 NVIDIA-Linux-x86_64-370.23 目錄底下的 README.txt 檔案。

然後直接跳轉到 Appendix A. Supported NVIDIA GPU Products 的地方,就可以看到許多的 Device PCI ID,這時候再去對一下自己系統上面的 lspci -vnn 的輸出上面的 NVIDIA 顯示都是 10de 開頭的。

Appendix A. Supported NVIDIA GPU Products
______________________________________________________________________________
...
A1. NVIDIA GEFORCE GPUS


    NVIDIA GPU product                    Device PCI ID*     VDPAU features
    ----------------------------------    ---------------    ---------------
    GeForce GTX 480                       06C0               C
    ...
    GeForce GT 620M                       0DE9 1025 0692     C
    ...
...

像是 06C0 對應到 [10de:06c0] 只要對一組 PCI ID 就好了,而 0DE9 1025 0692 則是對應到 [10de:0de9] 然後還要檢查 Subsystem ID 是不是 [1025:0692],類似下面的輸出(假造的)。

00:02.0 VGA compatible controller [0300]: NVIDIA GeForce GT 620M [10de:0de9] (rev 00) (prog-if 00 [VGA controller])
 Subsystem: Foo bar system [1025:0692]

如果系統上面的 Device PCI ID 跟 Subsystem PCI ID 有跟 README.txt 裡面的符合就表示這個驅動程式應該有支援,如果沒有出現在 README.txt 裡面的話,就是沒有支援。

而 Ubuntu 上面的 NVIDIA 私有驅動也是透過同樣的 README.txt 轉換成 dh-modaliases 使用的格式,讓使用者可以透過 ubuntu-drivers 來自動找到合適的驅動程式。

$ apt-cache show nvidia-361
Package: nvidia-361
Priority: optional
Section: restricted/misc
Installed-Size: 292039
Maintainer: Ubuntu Core Developers <...>
Architecture: amd64
Source: nvidia-graphics-drivers-361
...
Description: NVIDIA binary driver - version 361.42
Description-md5: 2f2445ec5e04329593078984a32bc2ae
Modaliases: nvidia_361(pci:v000010DEd000006C0sv*sd*bc03sc*i*,...

2016年7月28日 星期四

LTS 不等於 Stable

很多 Ubuntu 使用者都搞不清楚 LTS (Long Term Support) 與 Stable 的分別。

目前 Ubuntu 最穩定的版本應該是 Ubuntu 12.04.5 LTS (Precise Pangolin),次穩定的版本應該是下個月初才會釋出的 Ubuntu 14.04.5 LTS (Trusty Tahr),而最新的 Ubuntu 16.04.1 LTS (Xenial Xerus) 反而是 LTS 三個版本之中最不穩定的版本,因為它才釋出沒多久,更不用提前一個版本 Ubuntu 16.04 LTS (Xenial Xerus) 一定是問題更多的版本。

每個 Ubuntu LTS 第一個版本的釋出,只是代表著 code base freeze 然後開始不斷地修正裡面的問題,讓它越來越穩定,而 LTS 只是提供更長的維護時間。

如果想要使用很穩定的 Ubuntu 16.04 版本,請等到未來的 Ubuntu 16.04.5 LTS (Xenial Xerus) 釋出後再去使用吧。

Debian 也是一樣的,最穩定的釋出版本其實是 oldoldstable,再來是 oldstable,接下來是 stable,為什麼時間越久的越穩定是因為回報問題跟修正問題都需要時間,剛釋出的跨版號軟體一定不是最穩定的版本,要經過幾次反覆的修正之後才會慢慢地穩定下來,這也就為什麼像是 Linux kernel 還是 Python, Perl 等程式語言,在釋出後還會持續不斷地提供同版號的 minor fixes 的釋出。

2016年7月25日 星期一

Disable Secure Boot in shim-signed

The latest Ubuntu kernel updates bring some Secure Boot enhancement for the kernel modules when the Secure Boot is enabled in BIOS settings. However there is no easy way to sign those kernel modules in DKMS packages automatically so far. If we want to use those DKMS packages, we need to disable Secure Boot in BIOS settings temporarily or we can also disable Secure Boot in shim-signed temporarily. The following steps introduced how to disable Secure Boot in shim-signed.

  1. Open a terminal by Ctrl + Alt + T, execute `sudo update-secureboot-policy` and then select ‘Yes’.
  2. Enter a temporary password between 8 to 16 digits. (For example, 12345678, we will use this password later.)
  3. Enter the same password again to confirm.
  4. Reboot the system and press any key when you see the blue screen (MOK management).
  5. Select “Change Secure Boot state”.
  6. Press the corresponding password character and press Enter. Repeat this step several times to confirm previous temporary password like ‘12345678’ in step 2&3. For exmaple, '2' for this screen.
  7. Select ‘Yes’ to disable Secure Boot in shim-signed.
  8. Press Enter key to finish the whole procedure.

We can still enable Secure Boot in shim-signed again. Just execute `sudo update-secureboot-policy --enable` and then follow the similar steps above.

2016年5月30日 星期一

編譯 Ubuntu 的 Linux kernel 來使用 USB to RS-232 輸出訊息

如果曾經有參加過台北的 Ubuntu Hardware Summit,應該都會拿到一本橘色小手冊 Ubuntu Debugging,當中有提到可以設定幾個 Linux kernel 編譯選項中

CONFIG_USB_SERIAL_CONSOLE=y
CONFIG_USB_SERIAL=y
CONFIG_USB_SERIAL_PL2303=y

然後就可以在 Linux kernel 開機參數加上

console=tty console=ttyUSB0,115200n8

這樣就可以透過 USB to RS-232 傳輸線將 Linux kernel 訊息輸出到另外一台電腦上面,為什麼要這樣做有時候是因為 Linux kernel 開機時是什麼畫面也沒有,也不曉得中間到底發生了什麼事情,又或者是 Linux kernel 訊息出現的太快了,來不及看清楚完整的訊息一下子就過去了,也沒有來得及儲存到檔案系統上面就當機了,有著許許多多不同的情況可能會需要。

但是實際上要怎麼做才能夠編譯出 Ubuntu 上面所使用的 Linux kernel 呢?

首先是將 Ubuntu 所使用的 Linux kernel 的原始碼下載回來。

$ git clone git://kernel.ubuntu.com/ubuntu/ubuntu-xenial.git

然後我自己 commit 了一些修改 (主要是針對 amd64)。

$ git diff HEAD^..HEAD
diff --git a/debian.master/abi/4.4.0-22.39/amd64/generic.modules b/debian.master/abi/4.4.0-22.39/amd64/generic.modules
index e1b9392..53d7914 100644
--- a/debian.master/abi/4.4.0-22.39/amd64/generic.modules
+++ b/debian.master/abi/4.4.0-22.39/amd64/generic.modules
@@ -2873,7 +2873,6 @@ pixcir_i2c_ts
 pkcs7_test_key
 pktcdvd
 pktgen
-pl2303
 platform_lcd
 plat_nand
 plat-ram
@@ -4236,7 +4235,6 @@ usblp
 usbmon
 usbmouse
 usbnet
-usbserial
 usb-serial-simple
 usbsevseg
 usb-storage
diff --git a/debian.master/config/annotations b/debian.master/config/annotations
index 825012f..167ab6e 100644
--- a/debian.master/config/annotations
+++ b/debian.master/config/annotations
@@ -6609,7 +6609,7 @@ CONFIG_USB_STORAGE_ENE_UB6250                   policy<{'amd64': 'm', 'arm64': '
 CONFIG_USB_UAS                                  policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
 
 # Menu: Device Drivers >> USB support >> Support for Host-side USB >> USB Serial Converter support
-CONFIG_USB_SERIAL                               policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
+CONFIG_USB_SERIAL                               policy<{'amd64': 'y', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
 CONFIG_USB_SERIAL_GENERIC                       policy<{'amd64': 'y', 'arm64': 'y', 'armhf': 'y', 'i386': 'y', 'powerpc': 'y', 'ppc64el': 'y'}>
 CONFIG_USB_SERIAL_SIMPLE                        policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
 CONFIG_USB_SERIAL_AIRCABLE                      policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
@@ -6641,7 +6641,7 @@ CONFIG_USB_SERIAL_MOS7715_PARPORT               policy<{'amd64': 'y', 'arm64': '
 CONFIG_USB_SERIAL_MOS7840                       policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
 CONFIG_USB_SERIAL_MXUPORT                       policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
 CONFIG_USB_SERIAL_NAVMAN                        policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
-CONFIG_USB_SERIAL_PL2303                        policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
+CONFIG_USB_SERIAL_PL2303                        policy<{'amd64': 'y', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
 CONFIG_USB_SERIAL_OTI6858                       policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
 CONFIG_USB_SERIAL_QCAUX                         policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
 CONFIG_USB_SERIAL_QUALCOMM                      policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
diff --git a/debian.master/config/config.common.ubuntu b/debian.master/config/config.common.ubuntu
index 505a3c7..7cb1284 100644
--- a/debian.master/config/config.common.ubuntu
+++ b/debian.master/config/config.common.ubuntu
@@ -8391,7 +8391,8 @@ CONFIG_USB_RIO500=m
 CONFIG_USB_RTL8150=m
 CONFIG_USB_RTL8152=m
 CONFIG_USB_S2255=m
-CONFIG_USB_SERIAL=m
+CONFIG_USB_SERIAL=y
+CONFIG_USB_SERIAL_CONSOLE=y
 CONFIG_USB_SERIAL_AIRCABLE=m
 CONFIG_USB_SERIAL_ARK3116=m
 CONFIG_USB_SERIAL_BELKIN=m
@@ -8439,7 +8440,7 @@ CONFIG_USB_SERIAL_OMNINET=m
 CONFIG_USB_SERIAL_OPTICON=m
 CONFIG_USB_SERIAL_OPTION=m
 CONFIG_USB_SERIAL_OTI6858=m
-CONFIG_USB_SERIAL_PL2303=m
+CONFIG_USB_SERIAL_PL2303=y
 CONFIG_USB_SERIAL_QCAUX=m
 CONFIG_USB_SERIAL_QT2=m
 CONFIG_USB_SERIAL_QUALCOMM=m

接著開始編譯 Linux kernel (在有八個 CPU cores 的電腦上)

$ CONCURRENCY_LEVEL=8 fakeroot debian/rules clean binary-generic

最後就會在上層目錄產生 Ubuntu 所使用的 Linux kernel 的 Debian packages 了。

$ ls -1 ../*.deb
../linux-cloud-tools-4.4.0-22-generic_4.4.0-22.40_amd64.deb
../linux-headers-4.4.0-22-generic_4.4.0-22.40_amd64.deb
../linux-image-4.4.0-22-generic_4.4.0-22.40_amd64.deb
../linux-image-extra-4.4.0-22-generic_4.4.0-22.40_amd64.deb
../linux-tools-4.4.0-22-generic_4.4.0-22.40_amd64.deb

這樣就可以將這些 Debian packages 拿去安裝使用了。

最後我放了一份在 http://people.ubuntu.com/~fourdollars/usb2rs232/ 上面,也許有人剛好也需要想要測試一下效果如何。

參考資料:https://wiki.ubuntu.com/Kernel/KernelDebuggingTricks

2016年5月29日 星期日

在 Ubuntu 16.04 上面使用自然人憑證報稅

發現完全可以依照兩年前寫過的在 Ubuntu 14.04 上面使用自然人憑證報稅的步驟,現在不管是 i386 的或是 amd64 的都可以運作。

只是我不明白為什麼自然人憑證用戶端元件安裝 (HiPKIClient) 上面完全沒有提到有 amd64 的版本可以使用。

這樣一來我就不用設法去生一個 i386 的環境來使用。

另外今年大家都會遇到的問題是 HiPKIClient 沒有合法簽章,因為現在的 Firefox 預設上都強制要求 extension/plugin 要有合法簽章才能夠使用,不然的話就要手動停用強制簽署的功能。

「你可以在 Firefox 設定編輯器(about:config 頁面)將 xpinstall.signatures.required 修改成 false 來暫時停用強制簽署的功能。」

還有要注意安裝 EZ-100PU 讀卡機的驅動程式有沒有符合系統的版本,通常使用指令

uname -i
就可以知道當下的系統是 i386 還是 x86_64 (aka amd64) 了。

$ unzip -l 201511920271676073.zip 
Archive:  201511920271676073.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2011-08-10 15:04   EZUSB_Linux/
    69340  2011-08-10 14:54   EZUSB_Linux/EZUSB_Linux_x86_64_v1.5.3.zip (amd64)
    58687  2011-08-10 14:54   EZUSB_Linux/EZUSB_Linux_x86_v1.5.3.zip    (i386)
       58  2008-04-09 13:12   Archive created by free jZip.url
---------                     -------
   128085                     4 files

最後就是要安裝 Java 7 才能夠正常使用,但是 Oracle 已經不再維護 Java 7 了,Oracle 目前建議使用的是 Java 8,但是 Java 8 完全無法在 Ubuntu 16.04 (amd64) 上面的 Firefox 46.0.1 正常使用,不曉得國稅局何時才會請中華電信還是關貿網路來解決這個問題。

出社會工作後都是用 Linux 系統在報稅,可是十幾年過去了,還是覺得政府做得很糟糕。:-(

2016年5月8日 星期日

在 Ubuntu 16.04 上面製作 FreeDOS 開機的 USB 隨身碟

首先是安裝 makebootfat 這個套件。

$ sudo apt install makebootfat

然後就可以參考 /usr/share/doc/makebootfat/README.Debian 這份文件來製作 FreeDOS 開機的 USB 隨身碟,只不過文件內容有點錯誤,所以我根據我的喜好調整了一下,以下假設 USB 隨身碟的 device node 在 /dev/sdb。

$ mkdir ~/tmp/fs-root
$ cd ~/tmp

$ wget http://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/distributions/1.0/pkgs/kernels.zip
$ unzip kernels.zip source/ukernel/boot/fat*.bin
$ cp -v source/ukernel/boot/fat*.bin .

$ wget http://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/distributions/1.0/pkgs/commandx.zip
$ wget http://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/distributions/1.0/pkgs/unstablx.zip
$ unzip commandx.zip bin/command.com
$ unzip unstablx.zip bin/kernel.sys
$ cp -v bin/kernel.sys bin/command.com fs-root/

$ sudo makebootfat -o /dev/sdb -L FreeDOS -E 255 -1 fat12.bin -2 fat16.bin -3 fat32lba.bin -m /usr/lib/syslinux/mbr/mbr.bin fs-root/

這樣就可以產生 FreeDOS 開機的 USB 隨身碟,不過真正在使用時似乎還是會遇到一些相容性的問題,像是我在 Dell 電腦的 Legacy BIOS mode 都可以正常使用,但是在我自己的 Lenovo ThinkPad X200 上面就不能用。

2017/02/14 補充:做了一個快速使用的腳本程式 mkfreedos.sh