Linux DKMS 機制導入筆記

公司基於 Debian/Ubuntu 的資訊產品裝配了幾個特殊配件,它們需要安裝驅動程式 (kernel module) 才能使用。原廠提供了驅動程式的源碼給我們,但並不是 deb/rpm 這類的套件。我原本用自己寫的工具 make-package 將原廠提供的特殊配件驅動程式源碼打包成 deb 套件。但公司的產品維護人員又反應一件事:有時執行系統套件更新之後,驅動程式就不見了或載入失敗。

仔細一查,原來出問題的套件更新內容包含了 Linux 核心升級。核心版本一升級,驅動程式就不匹配了,必須重新編譯。雖然安裝套件時已經把驅動程式源碼放在產品的檔案系統中,但要產品維護人員到源碼目錄一一編譯各配件的驅動程式,實在做不到。對產品維護人員來說,最簡單的標準操作流程就是重新安裝這些配件的驅動程式套件。就算如此還是很麻煩。因為產品維護人員並不會每次更新內容後都去檢查有無更新 Linux 核心。需要更自動化的驅動程式管理機制。所以我決定將 DKMS 機制導入我的驅動程式打包工作。

KDE - 關閉 baloo, nepomuk 與 akonadi

KDE 桌面環境提供了一整套非常智能的檔案索引與搜尋系統,由 nepomuk, akonadi, baloo 等套件組成。但是它太肥大了。有些人並不怎麼喜歡這套系統,也從來用不上它。

以我個人為例,我安裝 Debian 8 時,幾乎沒裝過完整的 nepomuk, akonadi, baloo 。但也從來沒發覺 KDE 使用上有何不便。本文將說明如何移除與關閉這一整套智能索引與搜尋系統。

學習 ECMAScript/JavaScript 6 - var, let 和 const

各位,又到了文字訓詁時間。在介紹 let 之前,我們需要先區分 blockscope 這兩個字在程式語言中的含義。ECMAScript/JavaScript 是 C 式語系的一枝,但是它對 blockscope 的定義,與大部份 C 式語系的語言不同。

block 就是區塊,是程式文章中的一塊獨立段落。 C 式語系中,由 { } 包起的內容就屬於一個 block (區塊),而在區塊之中還可以有小區塊。層層區塊組成文章的巢狀結構。在程式語言的演進歷史中,這是一個重要的足跡。伴隨著區塊而來的還有稱為 scope 的變數活動範圍、或稱作用域的觀念。程式語言用變數活動範圍劃分各個變數的可用範圍,讓符號名稱可以在不同的活動範圍中繫結不同的變數,也才有現在的區域變數常識。在計算機概論中,scope 通常也被視為 context

學習 ECMAScript/JavaScript 6 - Destructuring

在 JavaScript 的設計場景中,我們使用了大量的陣列內容與屬性值操作。甚至在定義函數時也會使用屬性表作為參數,以換取選用性參數與擴充參數項目的彈性。例如:

function func1(props) {
    if (props.width && props.height)
        set_size(props.width, props.height);
    if (props.x && props.y)
        set_pos(props.x, props.y);
}

func1({width:100, height:50});

為了簡化陣列內容與屬性值的操作, ES6 新增了 Destructuring (解構) 語法。 Destructuring 的用法簡單地說就是左值(等號左邊的對象)可以放一組由變數組成的結構,由 ES6 將右值的陣列內容指派給左值的每個變數。

共產主義本應消滅民族國家思想

原始的共產主義主張國際蘇維埃和無產階級專政,走國際主義路線,沒有國家和民族概念。所以現行的共產主義或社會主義,都偏離了原義。

國際蘇維埃指的就是將資本集中化形成一個什麼都能生產的總合企業組織。白話說就是將世界上的無產階級(蘇維埃)聯合起來,推翻各國由資產階級(布爾喬亞)控制的政府權力。世界不再有各國政府組織、不再有大大小小各種企業組織、不再有資產階級。只有一個世界蘇維埃組織,管理世界上所有人的生產與消費行為。讓每一個人都有工作、都有收入、都有住所。

學習 ECMAScript/JavaScript 6 - Generator

Generator 是 ECMAScript/JavaScript 6 新增的一項頗為有趣的語法功能。它的關鍵字是 yield

在上篇 介紹 for-of 與迭代器 時,我提到設計一件具有迭代能力的個體或類別時,需要添加額外資料以保存現行狀態。而 Generator 就是為了簡化這項設計工作而導入的新功能。

根據維基百科的說法, Generator 就是一種 Iterator (迭代器)。而 ECMAScript/JavaScript 算是很晚才加入這功能的主流程式語言。 C 語言也可以用 setjmp()/longjmp() 實現這功能,只是 setjmp() 是 POSIX 系統呼叫,不算程式語言功能。

學習 ECMAScript/JavaScript 6 - for-of 與 iterator

在 ECMAScript/JavaScript 6 之前, ECMAScript/JavaScript 的迭代迴圈有下列三種:

  • 計數式 for 迴圈。
  • 走訪個體屬性的 for-in 迴圈。
  • ES5 為陣列增加的 forEach 方法。

ES6 定義了更多資料集合型態,為讓這些資料集合型態有一致的迭代操作方式, ES6 也同時新增了 for-of 迴圈並讓程序人員自訂類別的迭代行為。

學習 ECMAScript/JavaScript 6 - Symbol

Symbol (符號) 的基本觀念和用途,我在 Name object 草案 一文說明過。在草案階段稱為 Name object ,正式定案後就給了一個通俗的名稱: Symbol ,正式規範的用法可參考 ES6 In Depth: Symbols

對以 JavaScript 為主要設計語言的程序人員來說,理解 Symbol 時需要把自己對變數與符號的關係認知,提高一級抽象層次。

學習 ECMAScript/JavaScript 6 - Template strings

Template strings 之用法可參考 ES6 In Depth: Template strings。基本的 template string 用法是字串內容必須用反引號 (`) ,而要插值的變數名稱則要包進 ${} 括號中。例如 `Hello ${myName}, template string.`

更進一步說,放在括號中的內容可以是任何有效的表達句。除了變數外,也能用函數或計算式。下列都是有效的例子:

  • 取陣列元素 ${abc[2]}
  • 字串切片: ${"slice of string".substr(3, 5)} .
  • 1 + 1 = ${1+1}
  • ` ${“a,b,c”.split(‘,’)[1]} `

樂多部落格文章轉移到 github pages 完工

已將樂多部格落上的文章轉移到 github pages ,新網址 rocksaying.tw 。並開啟 disqus 留言系統。

除了全站RSS訂閱,各分類頁的文章列表的上方,也有該分類的 RSS 訂閱連結。

announcement

準備將部落格從樂多搬移到 github pages 上管理。這樣發表或更新文章,只需要 git push 就完成,不需要再上樂多管理平台手動貼上。再者,現在從搜尋引擎找樂多的文章再連結閱讀時,都會先轉到所謂的閱讀模式,還要再點擊閱讀原本文章才行,太麻煩了。

Debian 8 and Github Pages.

github pages required ruby version above 1.9. debian 8 default ruby version is 2.1.

required package: ruby2.1 ruby ruby2.1-dev ruby-dev bundler rubygems-integration zlib1g-dev nodejs

  • gem issue: require package zlib1g-dev.
  • jekyllrb issue: require package nodejs.

Installing Jekyll: reference Using Jekyll with Pages

create Gemfile in the root of your github pages working copy.

source 'https://rubygems.org'
gem 'github-pages'

change directory to your github pages working copy then run bundle install.

My script to run Jekyll with GitHub Pages:

#!/bin/sh
cd ~/Public/rocksaying.github.io
exec bundle exec jekyll serve

Using web browser to open localhost:4000/.

Upgrade to Jekyll3

change directory to working copy then run gem update or bundle update.

add “gems: [jekyll-paginate]” in your _config.yaml if you need paginate.

gems: [jekyll-paginate]

See also: Upgrading from 2.x to 3.x

test css

摘要 excerpt. markdown 語法與部落格 CSS 展示。

Markdown.

分離 <--more-->

Kensington SlimBlade Trackball 軌跡球在 Linux 中的使用設定

我最近去日本時,趁便宜買了兩隻 Kensington 的軌跡球,分別是 Kensington SlimBlade Trackball 和 Kensington Orbit Trackball 。分別說明這兩隻軌跡球在 Linux 下使用的設定心得。

在 Debian 8 中,基本上不用設定任何項目便可正常使用。

如果你是左撇子,或者想要更快的捲頁速度,請繼續閱讀。

Kensington Orbit Trackball 軌跡球 在 Linux 中的使用設定

身為一位 Logitech Marble Trackball 木星軌跡球的用戶,我拿到 Kensington Orbit Trackball 軌跡球後第一眼就覺得這兩隻的球體大小似乎一樣。當場動手互換,證實 Orbit 軌跡球和 Logitech Marble 木星軌跡球的球體通用。

接著,我又比較了它和 Kensington SlimBlade Trackball 軌跡球的捲頁速度。 Orbit 軌跡球捲頁輪 (Scroll Ring) 的捲頁速度要快得多。還可用一根手指 360 度旋轉捲頁,真是爽快。唯一缺點就是少了實體中鍵。或許我當初該買 Kensington Expert Mouse 而非 SlimBlade 軌跡球。

Orbit 軌跡球最大缺點就是沒有實體中鍵,故接下來將著重說明在 Linux 如何設定中鍵模擬。

Ubuntu 啟動畫面與桌面(startx)啟動失敗的關係

我任職公司會用 Linux 系統訂製自己的視窗環境,具體作法請參考「如何訂製 Linux X 視窗環境」。在使用 Ubuntu 訂製環境時,我們將 Ubuntu 的 Display Manager (如 GDM, LigthDM) 拔掉,改為直接執行 startx 的方式,這時經常出現啟動畫面閃爍現象,以及偶爾發生 X 啟動失敗的錯誤,導致系統進入 X Window 的時間變得很長。但改回 DM 啟動模式後就沒事了。在 Debian 之下則很正常。

由於 Ubuntu 的啟動畫面由 plymouth 負責,我初步認為和 plymouth 有關。搜查了一下,可找到其他客製化系統的系統開發者者碰到相同的情況。

臉部辨識系統經驗談

Master Card 宣告加入臉部辨識認證。文中特別提了兩件事。一、它只是儲存了一個算法,而不是儲存了用戶的面容圖片;二、要做眨一眨眼的動作,避免歹徒利用卡主的照片騙過系統。

就我參與的國內生物辨識系統專案來看,大部份生物辨識系統都不會儲存原始照片。以臉部辨識為例,是從大頭照中分出特徵區域,再將特徵內容化為曲線函數儲存(就是算式),一般也不只一組。這些曲線函數組一般稱為 template 。比對時也一樣,拍照後將特徵轉為曲線函數,再比對曲線函數的差異性。

GCC 4.6 Linker Argument Picky

最近公司有一些 C 程式碼在 Ubuntu 12.04 上編譯時發生目標參照錯誤。原因在於 Ubuntu 12.04 採用的 gcc 4.6 有一項特殊的參數順序要求(argument picky),這個中間版本一定要把 linker 參數放最後面。這項要求在舊版沒有(~ 4.4),後來的 gcc 新版(4.8, 4.9)也拿掉了。所以 gcc 4.6 以外的版本, linker 參數順序怎麼放都行。

gcc 常見的 linker 參數有 -l, -L, -Wl 。

Debian gcc list: https://packages.debian.org/search?keywords=gcc

  • squeeze (v6): 4.4.5
  • wheezy (v7): 4.7.2 (x86 arch)
  • jessie (v8): 4.9.2

Ubuntu gcc list:

  • lucid (10.04): 4.4.3
  • precise (12.04): 4.6.3
  • trusty (14.04): 4.8.2

我這幾年的主要開發環境是在 Debian 上,剛好跳過 gcc 4.6 。現在想想,2011,2012 年時,確實有不少 gcc 用家抱怨過這件事。所以後來才又取消了這項限制吧。