2013/01/11

變數內容對調的方法

一般我們都是用以下的方法來對調變數的內容:
int temp;
temp = var1;
var1 = var2;
var2 = temp;
今天學到一個有趣的新方法:
var1 ^= var2;
var2 ^= var1;
var1 ^= var2;
蠻酷的。


2012/12/04

自建 Ubuntu 的動態 Wallpaper

Ubuntu 真的好用,當然也有缺點。其中之一,就是想對桌面作一些調整時會比較麻煩。譬如,動態 Wallpaper 是既有的功能,但你想建立自己的版本,就要花一點心思。發行較久的 Ubuntu,可能已經有人開發 GUI 來簡化這個程序。但這套 GUI 又不見得可以適用於最新的 Ubuntu 發行版。我在 Ubuntu 12.10 就遇到這個問題。底下是我的解決方法。

首先,建立動態 wallpaper 的定義,譬如:~/wallpaper.xml:
<background>
  <starttime>
    <year>2003</year>
    <month>6</month>
    <day>14</day>
    <hour>05</hour>
    <minute>30</minute>
    <second>00</second>
  </starttime>
  <static>
    <duration>1795.0</duration>
    <file>/path/to/picture-1.png</file>
  </static>
  <transition>
    <duration>5.0</duration>
    <from>/path/to/picture-1.png</from>
    <to>/path/to/picture-2.png</to>
  </transition>
  <static>
    <duration>1795.0</duration>
    <file>/path/to/picture-2.png</file>
  </static>
  <transition>
    <duration>5.0</duration>
    <from>/path/to/picture-2.png</from>
    <to>/path/to/picture-1.png</to>
  </transition>
</background>
其中:
  • 可以是過去或未來。若是未來,就是等到那個時間才會更換 wallpaper;若是過去,設好就馬上生效。
  • 就是設定要顯示哪一個圖形?要顯示多少秒數?
  • 就是設定從一個圖形轉換到另外一個圖形要轉換多久?轉換到哪一個圖形?
  • 要成對出現,而且要設成可以頭尾連接。
Wallpaper.xml 設定檔完成之後,就要告訴系統以此作為 wallpaper:
gsettings set org.gnome.desktop.background picture-uri 'file:///path/to/wallpaper.xml'

2012/08/02

將 HTML 轉成 PDF 檔 (支援中文)

在 Ubuntu 上將 HTML 轉成 PDF 檔非常簡單。用 Firefox 或 Chromium 打開這個 HTML 檔 (或連上該網站),然後「列印至 PDF 檔案」即可。不過,你若在其他平台,或想自動完成這項工作,就比需要有其他工具了。

網路上這類工具還不少,不過不是安裝複雜就是不支援中文。在這裡推薦一套安裝簡單又好用的轉換工具,wkhtmltopdf

安裝有多簡單?下載之後解開即可 (我只在 Ubuntu 上試過)。

有多好用?這類轉換工具對 HTML 檔的處理能力參差不齊,若加上需要支援中文,就更難找到讓人滿意的解決方案。但 wkhtmlpdf 是以 WebKit/QT 為核心,而 WebKit 是 Apple Safari 和 Google Chrome 的網頁處理器,所以處理能力毋庸置疑。

最簡單的執行範例:
wkhtmltopdf http://news.chinatimes.com/ news.pdf
若你想加上封面、頁首、頁尾等也可以,請自行參閱 wkhtmltopdf -H 的說明。

新版 Ubuntu 使用者注意事項

直接下載上述網頁編譯完成的 binary 在較新版本的 Ubuntu,譬如 12.04,似乎無法執行:
QSslSocket: cannot call unresolved function SSLv23_client_method4%
QSslSocket: cannot call unresolved function SSL_CTX_new
QSslSocket: cannot call unresolved function SSL_library_init
QSslSocket: cannot call unresolved function ERR_get_error
QSslSocket: cannot call unresolved function SSLv23_client_method
QSslSocket: cannot call unresolved function SSL_CTX_new
QSslSocket: cannot call unresolved function SSL_library_init
QSslSocket: cannot call unresolved function ERR_get_error
解決辦法是下載 source 自己編譯。不要擔心,編譯非常簡單:
$ sudo apt-get install qt4-dev-tools
$ wget http://wkhtmltopdf.googlecode.com/files/wkhtmltopdf-0.11.0_rc1.tar.bz2
$ tar xvjf wkhtmltopdf-0.11.0_rc1.tar.bz2
$ cd wkhtmltopdf-0.11.0_rc1/
$ qmake && make
$ sudo apt-get make install

Keywords: html2pdf, html-to-pdf, web2pdf, web-to-pdf

2012/07/11

Ccache 的陷阱

Ccache 簡單說是 C/C++ 編譯加速器。開發 Android 這類大型專案的人,完整重編常常需要一至數個小時,所以很有可能會用這個工具。若開發環境不是你建立的,你甚至有可能不知道你用了這個工具。

Ccache 有何陷阱?就是 cache 住的資料有錯的時候。若你發現明明沒改過的程式,昨天還可以編譯成功,今天就一直有問題。很有可能就是掉入這個陷阱了。

一般不會發生這種問題,發生的原因通常是跑 cache 的機器不正常關機,造成 cache 毀損。解決這個問題的簡單方法是將 cache 完全清乾淨。

2012/07/06

xdg-open

Windows 有個命令列指令 start。在此指令之後可以接執行檔檔名,也可以接其他各式各樣的文件檔,start 會自動找出對應的程式開啟此文件。

聽說 MacOS 也有類似的指令,open。那 GNU/Linux 上呢?當然也有,不過比較不好記:xdg-open

2012/01/20

Oneiric Ocelot 的 mpeg4ip-utils 套件

Ubuntu 更新到 Oneiric Ocelot 之後,有些套件已經不支援了,例如 mpeg4ip-utils。臨時有急用,所以只好跟 Natty Narwhal 借。

方法是從 https://launchpad.net/ubuntu/+source/mpeg4ip 下載以下套件:
  • libmp4v2-0_1.6dfsg-0.2ubuntu9_amd64.deb
  • libmpeg4ip-0_1.6dfsg-0.2ubuntu9_amd64.deb
  • mpeg4ip-utils_1.6dfsg-0.2ubuntu9_amd64.deb
然後用 dpkg 依序安裝即可:
dpkg -i libmp4v2-0_1.6dfsg-0.2ubuntu9_amd64.deb
dpkg -i libmpeg4ip-0_1.6dfsg-0.2ubuntu9_amd64.deb
dpkg -i mpeg4ip-utils_1.6dfsg-0.2ubuntu9_amd64.deb

2011/12/11

保留 Firefox 的列印設定

我習慣將網路上看到的好文章列印成 PDF 檔保存。在 Ubuntu 上列印成 PDF是標準功能,不需額外安裝和設定。不過,在 Ubuntu 11.10 上用 Firefox 列印網頁,卻有幾個小困擾:
  1. FF 的預設印表機是 Postscript 印表機,不是 PDF 印表機
  2. FF 提供額外的頁首頁尾等資訊,但預設值都不是我想要的
因此,每次列印時都要重新點選相關設定,非常麻煩。經過一番努力,終於找出手動修改預設值的方法。
  1. 在網址列輸入 about:config 然後按 Enter (Firefox 會提醒你要小心修改)
  2. 在 Filter 輸入 default.print 縮小範圍,然後修改或新增以下項目:
printer_PostScript/default.print_footercenter =>
printer_PostScript/default.print_footerleft =>
printer_PostScript/default.print_footerright =>
printer_PostScript/default.print_headercenter =>
printer_PostScript/default.print_headerleft =>
printer_PostScript/default.print_headerright =>
printer_PostScript/default.print_to_filename => ~/firefox.pdf
以上是將列印檔名預設為 firefox.pdf,頁首頁尾設成空白。若你的設定不一樣,要先在列印對話框的 Options 做好設定列印一次,再重新進入 about:config。找出以下看起來是亂碼的設定項目:
printer_列印至檔案.print_...
就可以看出設定字串如何寫 (譬如 "&T"),將此字串複製到 default.print 對應那一部份就可以了。