tag:blogger.com,1999:blog-46768509139431101702024-03-08T16:42:57.532+08:00瑞元のアトリエjekyll based 個人網站建構中 https://ryuanlu.github.io/
Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.comBlogger74125tag:blogger.com,1999:blog-4676850913943110170.post-31296859046219765252015-09-06T23:37:00.001+08:002015-09-06T23:37:17.390+08:00pidgin 上使用 Line 通訊協定傳送訊息與貼圖Linux 下要玩 Line 大概就幾個解法:<br />
<ol>
<li>用 wine 跑 Windows Line client</li>
<li>Chrome 裝官方的 extension</li>
<li>pidgin 裝 pidgin-line plugin</li>
</ol>
本文講的是第三種解,首先是 plugin 的專案首頁:<br />
<br />
<br />
<a href="http://altrepo.eu/git/purple-line">http://altrepo.eu/git/purple-line</a><br />
<br />
<br />
<br />
如果你用 Debian Jessie 又懶得自己 build,可以用作者編譯好的 deb 套件:<br />
<br />
<a href="https://dl.dropboxusercontent.com/u/13723674/debian/pool/jessie/main/purple-line_20150815-1_amd64.deb">purple-line_20150815-1_amd64.deb</a><br />
<br />
<br />登入帳號用 email。id 我不知道為什麼登不進去,登入出錯太多次會被 ban 一段時間。<br />
<br />
使用者輸入的訊息會被顯示成兩行一樣的文字,實際送出去的訊息只有一行。對方的訊息送過來不會有問題。<br />
<br />
plugin 有實作貼圖的機制,但是沒有實作貼圖的清單。你必須先知道貼圖的 id 才能用特殊命令送出貼圖。<br />
<br />方法就是先用手機 Line 送出一張貼圖,然後在 pidgin 上對貼圖按右鍵加入。這時候會跳出一個視窗告訴你 [LINE sticker ?/????/????? []],問號表示一堆數字,那串就是貼圖的 id。<br />
<br />
要送這張貼圖,直接在聊天視窗中打 /sticker ?/????/????? 就可以了,也就是複製 sticker 那串把前後多餘的東西去掉,然後最前面多加一個斜線。<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0tag:blogger.com,1999:blog-4676850913943110170.post-60340762288421747772014-02-12T10:57:00.003+08:002014-02-12T10:58:07.909+08:00解決 Twitch.tv 播放錄影存檔會讓 CPU 飆高、系統停頓不知道是 Twitch.tv 的 flash 播放器比較特殊還是怎樣,CPU 使用率比看 Youtube 時還要高很多。尤其是在網頁看錄影存檔的時候,更是會讓 firefox 反應遲鈍,CPU 使用率比收看實況時還要再高出一倍。<br />
<br />
在嘗試過幾個針對 Flash player for Linux 的效能調校方法以後,發現以下的設定可以改善這個問題:<br />
<br />
在 /etc/adobe/mms.cfg 中加入 WindowlessDisable=trueAnonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0tag:blogger.com,1999:blog-4676850913943110170.post-77898883827182575822013-12-22T15:18:00.001+08:002013-12-22T15:18:39.816+08:00SONY DUALSHOCK©4 Wireless Controller & Debian Wheezy已經有很多消息指出 PS4 的手把相容於 PC,不論是走 USB 線還是藍牙都可以正常工作。雖然說部份的功能可能還沒辦法透過 HID 支援啦。<br />
<br />
在 Debian Wheezy 上要使用 DS4 手把流程如下:<br />
<br />
<ol>
<li>DS4 按下【PS】+【SHARE】,手把會閃白燈。</li>
<li>Gnome 會提示你要不要授權配對,點 always 以後成功配對。</li>
<li>執行 sudo hidd --connect btaddr 手動啟用 HID 裝置。(需要裝 bluez-compat,DS4 走 Bluetooth 2.1 + EDR)<br />hidd search 會找不到手把,所以要自己啟用。啟用前請確定藍牙已經確實連線,DS4 燈號會持續亮著。</li>
</ol>
Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0tag:blogger.com,1999:blog-4676850913943110170.post-36154545057961290372013-11-06T00:51:00.000+08:002013-11-06T00:54:01.245+08:00Xlib 防止 gnome-screensaver 啟用一般來說看影片或者像是用搖桿、手把玩遊戲的時候鍵盤滑鼠都不會有輸入,所以應用程式通常會自動停用螢幕保護程式,以防影片看到一半、電動打到一半被中斷。<br />
<br />
在 X window 環境下要實作這個功能,可以每隔一段時間執行以下的 code:
<br />
<pre><code>DPMSForceLevel(display, DPMSModeOn);
XResetScreenSaver(display);
XFlush(display);</code></pre>
<br />間隔時間可以取 DPMS 設定或者 xscreensaver、gnome-screensaver 的 timeout:<br />
<pre><code>DPMSGetTimeouts(display, &standby, &suspend, &offtime);
XGetScreenSaver(display, &timeout, &interval, &prefer_blanking, &allow_exposures);</code></pre>Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0tag:blogger.com,1999:blog-4676850913943110170.post-61411382382478082312013-10-24T15:35:00.002+08:002013-10-24T15:36:10.737+08:00gcc 控制符號的可見性在某些情況下我們會想要把一些函數或變數隱藏起來,不要讓它們出現在 symbol table 裡。<br />
<br />
<br />
<b>static</b><br />
<br />
將全域變數或函數宣告成 local,只有該 object file 內的 function 看得到它。有 static 的話會無視 visibility 屬性宣告。<br />
<br />
<br />
<b><span style="font-size: small;"><span style="font-family: inherit;"><span class="st">__attribute__((visibility ("hidden")))</span></span></span></b><br />
<br />
全域變數或函數宣告預設是宣告成 global,加上 visibility 屬性後可見性設定為隱藏。編譯期間會標示成 global,但名稱會變成 .hidden function。最後連結產生 shared object 的時候該 symbol 不會出現在 dynamic symbol table,但是會在 symbol table 中出現且標示為 local。如果要做到完全隱藏,產生 shared object 以後要 strip 拔掉 symbol table。<br />
<br />
<br />
<b><span style="font-size: small;"><span style="font-family: inherit;"><span class="st">-fvisibility=hidden</span></span></span></b><br />
<br />
<span style="font-size: small;"><span style="font-family: inherit;"><span class="st">同 __attribute__((visibility ("hidden"))),不過這是從編譯器的命令列參數,等於是設定預設的 visibility。</span></span></span><br />
<br />Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0tag:blogger.com,1999:blog-4676850913943110170.post-48025020574615072212013-10-17T23:16:00.000+08:002013-10-17T23:16:09.132+08:00DEB 套件 control 檔 template<pre><code>Package:
Version:
Architecture:
Maintainer:
Installed-Size:
Depends:
Pre-Depends:
Recommends:
Suggests:
Breaks:
Replaces:
Provides:
Section:
Priority:
Multi-Arch:
Homepage:
Description:
</code></pre>Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0tag:blogger.com,1999:blog-4676850913943110170.post-65738323150282897452013-10-15T22:47:00.003+08:002013-10-15T22:47:58.179+08:00hplip plugin 備用 mirrorhplip 安裝、設定印表機的時候會到 www.openprinting.org 去抓 hplip-x.xx.x-plugin.run。萬一這個網站掛了,可以到 http://hplipopensource.com/hplip-web/plugin/ 抓一樣的檔案來用。<br />
<br />
Debian Wheezy 收錄的是 <a href="http://hplipopensource.com/hplip-web/plugin/hplip-3.12.6-plugin.run">3.12.6</a>Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0tag:blogger.com,1999:blog-4676850913943110170.post-45418399660208297352013-10-04T00:04:00.001+08:002013-10-04T00:04:17.887+08:00xboxdrv 模擬 XBOX360 手把為了對付某些只吃 XBOX360 手把的遊戲(Runner2),我們需要 xboxdrv 將我們的 xpad 相容手把偽裝成正牌 XBOX360 手把。<br />
<br /><pre><code>$ sudo xboxdrv --silent --type xbox360 --device-by-id 046d:c21f --mimic-xpad --detach-kernel-driver</code></pre><br />
046d:c21f 是 Logitech F710 Wireless Gamepad,請自行代換其 USB device ID(用 lsusb 查)。<br />
<br />Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0tag:blogger.com,1999:blog-4676850913943110170.post-28538970791747670942013-10-01T00:42:00.001+08:002013-10-01T00:43:06.883+08:00tsocks 掛 SOCKS proxy雖然不是所有的網路程式都有內建 SOCKS proxy 支援,但我們可以透過 tsocks 讓任何程式走 SOCKS proxy 進行連線。<br />
<br />
一般 distro 應該都有附,設定也只需要改 /etc/tsocks.conf、指定 SOCKS server 而已。<br />
<br />
執行程式的時候只要在前面加個 LD_PRELOAD=/usr/lib/libtsocks.so 讓連結器優先載入 tsocks 的 shared object,就可以讓目標程式使用指定的 SOCKS proxy 連線。Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0tag:blogger.com,1999:blog-4676850913943110170.post-57308337487870366092013-07-13T21:57:00.002+08:002013-10-10T23:46:34.357+08:00人工封裝 deb 套件deb 套件基本上是 debian-binary、control.tar.gz、data.tar.gz 三個檔案由 ar 壓起來的壓縮檔。debian-binary 內容為 deb 檔案格式的版本號,通常是 2.0。control.tar.gz 可以解出含有套件資訊的相關檔案,data.tar.gz 則為套件要安裝的內容本身。control 與 data 並不一定要 tar.gz,可以選用其他支援的壓縮格式。<br />
<br />
以 Gnome 的 Archive Manager 將 deb 套件解壓縮會直接將 control.tar.gz 解成 DEBIAN 資料夾,並和 data.tar.gz 解出來的東西放在一起。debian-binary 則略過。<br />
<br />
如果要解開成原始的三個檔案,可以用原始的 ar 命令:<br />
<pre><code>$ ar x package.deb</code></pre>
<br />
壓回去的話要注意 debian-binary 一定要放最前面:<br />
<pre><code>$ ar r package.deb debian-binary control.tar.gz data.tar.gz</code></pre>
<br />
更方便的作法是利用 fakeroot 和 dpkg-deb 直接把 DEBIAN 資料夾和要安裝的東西包成 deb 套件:
<br />
<pre><code>$ fakeroot dpkg-deb -b [input_dir] [output_deb]</code></pre>
Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0tag:blogger.com,1999:blog-4676850913943110170.post-58808697727949409032013-05-30T21:26:00.001+08:002013-05-30T21:26:26.943+08:00empathy 登入時硬碟大量 I/O 造成系統停頓Gnome 從 3.2 開始提供 gnome online account 服務,使用者可以加入 Google Talk 與 Facebook 帳號讓 empathy 自動連線並與 gnome-shell 整合。<br />
<br />
不知道是不是 telepathy 的 bug 還是設計上本來就這樣,聯絡人的頭像似乎每次登入都會重新做快取,這對 Facebook 這種有大量聯絡人的帳號來說影響很大。每次登入 FB 帳號的時候都會因為硬碟狂轉導致系統停住好幾秒,運氣差的話可能還會觸發 gnome-shell 的當機 feature。<br />
<br />
個人的解法是,既然他每次登入都重刷快取(快取都不快取了),那乾脆就丟 ramdisk 吧。在 ~/.cache/telepathy/ 建立一個指向 /tmp 的 symbolic link 並命名為 avatars:<br />
<br />
<pre><code>$ ln -s /tmp ~/.cache/telepathy/avatars</code></pre><br />
<br />
原本的 avatars 資料夾可以刪除。這樣登入 FB 就不會讓系統卡住了。<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0tag:blogger.com,1999:blog-4676850913943110170.post-31343869954956483432013-05-24T13:33:00.001+08:002013-05-24T13:33:25.160+08:00系統全域的 PATH 與 alias 設定簡單地說會動到以下的設定檔:<br />
<ol>
<li>/etc/bash.bashrc</li>
<li>/etc/profile 或 /etc/profile.d</li>
<li>/etc/login.defs</li>
</ol>
<br />
<br />
首先來看 alias 放不同地方的效果:<br />
<ol>
<li>所有的 interactive shell 有效</li>
<li>login shell 有效,用 su 切換的使用者無效</li>
</ol>
<br />
再來是 PATH:<br />
<ol>
<li>所有的 interactive shell 有效,X session 無效,su 後無效</li>
<li>su 後無效其他有效</li>
<li>只有 su 有效</li>
</ol>
<br />
結論:<br />
<br />
alias 放 /etc/bash.bashrc<br />
<br />
PATH 寫在 /etc/profile 或 /etc/profile.d/*.sh<br />
<br />
修改 login.defs 的 ENV_SUPATH 和 ENV_PATH 跟上面同步 <br />
<br />Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0tag:blogger.com,1999:blog-4676850913943110170.post-82359992322933134042013-05-06T13:55:00.000+08:002015-07-14T11:00:58.765+08:00目前的開發環境<table border="1"><tbody>
<tr><td>CPU</td><td>AMD Phenom x4 945 @3.0GHZ</td></tr>
<tr><td>MB</td><td>Gigabyte GA870A-UD3 rev. 2.0</td></tr>
<tr><td>RAM</td><td>Kingston DDR3 1600 8GB (2GB x 4)</td></tr>
<tr><td>VGA</td><td>MSI NVIDIA GTX460 768MB</td></tr>
<tr><td>HDD</td><td>Liteon S100 64GB, WD FAEX SATA 6g 1TB</td></tr>
<tr><td>DVD-RW</td><td>LITEON iHAS324</td></tr>
<tr><td>PSU</td><td>Seasonic X650</td></tr>
<tr><td>LCD</td><td>AOC e2440h</td></tr>
<tr><td>Sound card</td><td>Onkyo SE200PCI</td></tr>
<tr><td>TV/Capture card</td><td>Timeleak U1, Compro E650</td></tr>
<tr><td>OS</td><td>Debian 8.1 Jessie</td></tr>
</tbody></table>
Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0tag:blogger.com,1999:blog-4676850913943110170.post-23262211062067038332013-04-24T17:30:00.001+08:002013-04-24T17:31:31.159+08:00Debian 修改並重編譯套件下載 source package<br />
<br />
<pre><code>$ apt-get source [package]</code></pre>
<br />
<br />
下載編譯時期需要的套件<br />
<br />
<pre><code>$ apt-get build-dep [package]</code></pre>
<br />
<br />
修改原始碼以後,撰寫 changelog<br />
<br />
<pre><code>$ dch -i</code></pre>
<br />
<br />
編譯並產生套件<br />
<br />
<pre><code>$ debuild -uc -us -b</code></pre>
<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0tag:blogger.com,1999:blog-4676850913943110170.post-74095077822889862302013-04-24T16:48:00.001+08:002013-04-24T16:48:21.309+08:00Debian Wheezy ibus-chewing 新酷音部份設定值無法儲存的 bug這個 bug 會發生在你變更 ibus-chewing 設定值的時候發生,症狀就是設定完按儲存以後重登,部份的設定值會被重設為最小值。最惱人的地方就是最大容納中文字數會只剩下八。單位似乎是 byte,所以在 utf8 環境下你大概打三個中文字就會被強制送出去。<br />
<br />
新版的 ibus-chewing 已經修正了這個問題,但 Debian Wheezy 收錄的版本卻還是舊的 1.3.10。雖然個人四月初在 gentoo 那邊找到社群的 patch,也轉錄了這個 issue & patch 到 debian(<a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=704947">#704947</a>),不過似乎在 Wheezy 正式 release 之前是不會收的。<br />
<br />
在 Debian 正式接受 patch 之前,可以暫時用筆者包的安裝檔:<br />
<ul>
<li><a href="https://dl.dropboxusercontent.com/u/13723674/ibus-chewing_1.3.10%2Bclean-4_amd64.deb">ibus-chewing_1.3.10+clean-4_amd64.deb</a></li>
<li><a href="https://dl.dropboxusercontent.com/u/13723674/ibus-chewing_1.3.10%2Bclean-4_amd64.deb.asc">ibus-chewing_1.3.10+clean-4_amd64.deb.asc </a></li>
</ul>
<ul>
<li><a href="https://dl.dropboxusercontent.com/u/13723674/ibus-chewing_1.3.10%2Bclean-4_i386.deb">ibus-chewing_1.3.10+clean-4_i386.deb</a></li>
<li><a href="https://dl.dropboxusercontent.com/u/13723674/ibus-chewing_1.3.10%2Bclean-4_i386.deb.asc">ibus-chewing_1.3.10+clean-4_i386.deb.asc </a></li>
</ul>
<br />Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0tag:blogger.com,1999:blog-4676850913943110170.post-3166442889312516862013-04-24T15:32:00.000+08:002013-04-24T15:33:25.633+08:00GnuPG 實用命令<br />
匯出公鑰<br />
<br />
<pre><code>$ gpg --export -a -o [filename] [name]</code></pre>
<br />
<br />
匯出私鑰<br />
<br />
<pre><code>$ gpg --export-secret-key -a -o [filename] [name]</code></pre>
<br />
<br />
為檔案產生分離式簽章(detached signature)<br />
<br />
<pre><code>$ gpg --detach-sign -a [input_file]</code></pre>
<br />
<br />
驗證檔案簽章<br />
<br />
<pre><code>$ gpg --verify [signature_file]</code></pre>
<br />
<br />
檔案簽名並加密<br />
<br />
<pre><code>$ gpg -sea [input_file]</code></pre>
<br />
<br />
檔案解密<br />
<br />
<pre><code>$ gpg -d [encrypted_file]</code></pre>
<br />
<br />Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0tag:blogger.com,1999:blog-4676850913943110170.post-13863091869126177332013-04-11T12:10:00.003+08:002014-10-29T10:21:48.979+08:00ssh 建立 SOCKS proxy 讓 Firefox 走 ssh tunnel 或 reverse tunnel在受限制的網路環境下可以透過建立 SOCKS server 讓 Firefox 穿牆。<br />
<br />
<pre><code>$ ssh -D [local_port] -Nf [remote_host]</code></pre>
<br />
[local_port] 填入要在 localhost 監聽的 port,[remote_host] 填入 ssh 連線的位址。"-N" 是指不要 login shell,"-f" 放背景執行,也許還可以加個 "-C" 進行壓縮。<br />
<br />
之後 Firefox 開啟 proxy 設定,選用 SOCKS v5。主機填 localhost,port 照上面填就可以了。<br />
<br />
若要反過來建立一個可以從自由公開網路連進私有網路的 SOCKS server,只要先建立一條 reverse tunnel 即可。<br />
<br />
在網路受限的主機上建立 reverse tunnel: <br />
<br />
<pre><code>$ ssh -NfR [remote_port]:localhost:22 [remote_host]</code></pre>
<br />
在自由網路上的主機需要在 /etc/ssh/sshd_config 裡加上 GatewayPorts=yes,不然會綁到 localhost 去而不是開放網路。<br />
<br />
在自由網路上的主機建立 SOCKS server:<br />
<br />
<pre><code>$ ssh -D [local_port] -Nf localhost -p [remote_port]</code></pre>
<br />
另外為了預防自動斷線,可以在 ~/.ssh/config 中加入 serveraliveinterval 60。Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0tag:blogger.com,1999:blog-4676850913943110170.post-50712689772958977842013-03-30T18:25:00.003+08:002013-03-30T18:25:44.844+08:00PSN 頭像<pre><code>getCookieValueFromServer("userinfo");</code></pre>
<br />
只能提示到這裡,低調使用…<br />
Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0tag:blogger.com,1999:blog-4676850913943110170.post-72981066560178835782013-01-22T22:09:00.000+08:002013-04-12T09:18:32.305+08:00DVD 字幕擷取在 Linux 下從 DVD 裡擷取字幕真不是件容易的事。擷取的方法不只一種,但是抓出來的東西真的能用的卻不多。像是 mencoder、Avidemux 它們雖然可以抽出 idx/sub 字幕檔,但是仔細校對以後發現它的時間軸會偏掉(個人猜測是 VFR 的緣故)。<br />
<br />
個人在嘗試許多方法以後找到一個比較能接受的解:用 transcode 解 sub 字幕檔。這個工具解出來的 sub 字幕雖然時間軸稍微偏個幾毫秒,不過只要平移一下就能解決。<br />
<br />
詳細方法如下:<br />
<br />
工具:<br />
<ol>
<li>mplayer</li>
<li>transcode</li>
<li>subtitleripper</li>
<li>Aegisub</li>
</ol>
步驟:<br />
<ol>
<li>先用<a href="http://rueiyuanlu.blogspot.tw/2012/07/linux-dvdrip.html">之前文章</a>提到的方法解出目標 .vob 檔案</li>
<li>用 transcode 提供的工具解出 .vob 檔中的 .sub 字幕<br /><pre><code>$ tccat -i target.vob | tcextract -x ps1 -t vob -a 0x20 > target.sub</code></pre>
其中 0x20 是語言碼。0x20 是中文,0x22 是英文。</li>
<li>用 subtitleripper 提供的 subtitle2pgm 產生 .pgm 圖檔和 .srtx 字幕時間軸<br /><pre><code>$ subtitle2pgm -o output_prefix -c 0,255,0,0 < target.sub</code></pre>
</li>
</ol>
這樣會產生許多字幕圖檔(黑底白字)和我們需要的 .srtx 範本
<br />
<br />
<li>以 Aegisub 載入 .srtx 字幕調整時間軸並修改翻譯</li>
Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0tag:blogger.com,1999:blog-4676850913943110170.post-48057388490972483662013-01-08T16:51:00.000+08:002013-01-08T17:04:05.126+08:00Pango Cairo 畫游標Pango Cairo 可以靠 pango_layout_get_cursor_pos 這個 function 來取得游標的位置(像素為單位),只要傳字串的 index(單位為 byte)就可以知道該字元的游標應該畫在哪裡。<br/>
<pre><code>PangoRectangle strong;
PangoRectangle weak;
pango_layout_get_cursor_pos(pango_layout, strlen("あい"), &strong, &weak);
cairo_line_to(cairo_context, strong.x/PANGO_SCALE, strong.y/PANGO_SCALE);
cairo_rel_line_to(cairo_context, 0, strong.height/PANGO_SCALE);
cairo_stroke(cairo_context);</code></pre>Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0tag:blogger.com,1999:blog-4676850913943110170.post-19401524388836168042013-01-07T17:07:00.004+08:002013-01-07T17:15:12.484+08:00XIM client 範例程式這個程式示範如何用最少的程式碼在 X window 程式中接收 XIM 輸入法的輸入字串。Input style 為 Over the spot。<br />
<pre><code>#include <stdio.h>
#include <string.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
#include <X11/Xlocale.h>
#define TITLE_STRING "XIM test"
int main(int argc, char **argv)
{
	int quit = False;
	Display* display = NULL;
	Window window;
	XTextProperty title;
	XEvent event;
	Atom wm_delete_window;
	XIM xim;
	XIC xic;
	int xim_status;
	KeySym keysym;
	int count = 0;
	unsigned long fevent;
	char buffer[256]= {};
	/* Call XSetLocaleModifiers before initialize XIM */
	setlocale(LC_ALL, "");
	XSetLocaleModifiers("");
	display = XOpenDisplay(NULL);
	window = XCreateWindow(display, RootWindow(display, 0), 0, 0, 512, 512, 0, CopyFromParent, CopyFromParent, CopyFromParent, 0, NULL);
	XSetWindowBackground(display, window, BlackPixel(display, 0));
	title.value = (unsigned char*)TITLE_STRING;
	title.encoding = XA_STRING;
	title.format = 8;
	title.nitems = strlen(TITLE_STRING);
	XSetWMProperties(display, window, &title, &title, NULL, 0, NULL, NULL, NULL);
	wm_delete_window = XInternAtom(display, "WM_DELETE_WINDOW", False);
	XSetWMProtocols(display, window, &wm_delete_window, 1);
	XMapWindow(display, window);
	/* XIM initialization */
	xim = XOpenIM(display, NULL, NULL, NULL);
	xic = XCreateIC(xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing ,XNClientWindow, window, NULL);
	/* We need IC event to switch IME */
	XGetICValues(xic, XNFilterEvents, &fevent, NULL);
	XSelectInput(display, window, ExposureMask | KeyPressMask | FocusChangeMask | StructureNotifyMask | fevent);
	XSetICFocus(xic);
	while(!quit)
	{
		XNextEvent(display, &event);
		if(XFilterEvent(&event, None))
		 continue;
		switch(event.type)
		{
		case KeyPress:
			count = XmbLookupString(xic, &event.xkey, buffer, 256, &keysym, &xim_status);
			/* Cut redundant chars */
			buffer[count] = 0;
			if(xim_status == XLookupChars || xim_status == XLookupBoth)
				fprintf(stderr, "%s\n", buffer);
			break;
		case ClientMessage:
			if(event.xclient.data.l[0] == wm_delete_window)
			{
				XDestroyWindow(display, window);
				quit = True;
			}
			break;
		case FocusIn:
			XSetICFocus(xic);
			break;
		case FocusOut:
			XUnsetICFocus(xic);
			break;
		}
	}
	XCloseDisplay(display);
	return 0;
}</code></pre>Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0tag:blogger.com,1999:blog-4676850913943110170.post-27996885615484900212013-01-07T16:06:00.002+08:002013-01-07T16:07:49.465+08:00Xlib 基本視窗程式以下程式碼使用 Xlib 建立一個背景為黑色、大小為 512x512 的視窗。<br />
<pre><code>#include <string.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
#define TITLE_STRING "Xlib test"
int main(int argc, char **argv)
{
	int quit = False;
	Display* display = NULL;
	Window window;
	XTextProperty title;
	XEvent event;
	Atom wm_delete_window;
	display = XOpenDisplay(NULL);
	window = XCreateWindow(display, RootWindow(display, 0), 0, 0, 512, 512, 0, CopyFromParent, CopyFromParent, CopyFromParent, 0, NULL);
	XSetWindowBackground(display, window, BlackPixel(display, 0));
	title.value = (unsigned char*)TITLE_STRING;
	title.encoding = XA_STRING;
	title.format = 8;
	title.nitems = strlen(TITLE_STRING);
	XSetWMProperties(display, window, &title, &title, NULL, 0, NULL, NULL, NULL);
	wm_delete_window = XInternAtom(display, "WM_DELETE_WINDOW", False);
	XSetWMProtocols(display, window, &wm_delete_window, 1);
	XSelectInput(display, window, ExposureMask | KeyPressMask | StructureNotifyMask);
	XMapWindow(display, window);
	while(!quit)
	{
		XNextEvent(display, &event);
		switch(event.type)
		{
		case ClientMessage:
			if(event.xclient.data.l[0] == wm_delete_window)
			{
				XDestroyWindow(display, window);
				quit = True;
			}
			break;
		}
	}
	XCloseDisplay(display);
	return 0;
}</code></pre>Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0tag:blogger.com,1999:blog-4676850913943110170.post-33226216479506012952012-12-19T23:39:00.000+08:002013-01-03T09:27:54.958+08:00利用 libudev 實作 USB 熱拔插偵測功能udev 是 Linux kernel 的裝置管理服務,我們可以用它提供的 libudev 撰寫裝置熱拔插相關的程式。以下是一個實際範例程式。它每隔一小段時間就會檢查是否有收到 USB 熱拔插事件,並且將收到事件內容顯示到螢幕上。<br />
<pre><code>#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libudev.h>
#define PROBE_INTERVAL (500)
int main(int argc, char** argv)
{
	struct udev* udev = NULL;
	struct udev_monitor* udev_monitor = NULL;
	struct udev_device* dev = NULL;
	int udev_fd = -1;
	fd_set fds;
	struct timeval tv;
	int ret;
	char node_string[64] = {};
	char serial_string[10] = {};
	const char* tmp = NULL;
	udev = udev_new();
	udev_monitor = udev_monitor_new_from_netlink(udev, "udev");
	udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, "usb", NULL);
	udev_monitor_enable_receiving(udev_monitor);
	udev_fd = udev_monitor_get_fd(udev_monitor);
	while(1)
	{
		FD_ZERO(&fds);
		FD_SET(udev_fd, &fds);
		tv.tv_sec = 0;
		tv.tv_usec = 0;
		ret = select(udev_fd + 1, &fds, NULL, NULL, &tv);
		if(ret > 0 && FD_ISSET(udev_fd, &fds))
		{
			dev = udev_monitor_receive_device(udev_monitor);
			tmp = udev_device_get_devtype(dev);
			if(dev && tmp && !strcmp(tmp, "usb_device"))
			{
				if(!strcmp(udev_device_get_action(dev), "add"))
				{
					serial_string[0] = 0;
					strcat(serial_string, udev_device_get_sysattr_value(dev,"idVendor"));
					strcat(serial_string, udev_device_get_sysattr_value(dev,"idProduct"));
					fprintf(stderr, "USB Device [%s] added\n", serial_string);
					fprintf(stderr, "Node \"%s\" created\n", udev_device_get_devnode(dev));
				}else if(!strcmp(udev_device_get_action(dev), "remove"))
				{
					fprintf(stderr, "USB Device removed\n", serial_string);
					fprintf(stderr, "Node \"%s\" deleted\n", udev_device_get_devnode(dev));
				}
				udev_device_unref(dev);
			}
		}
		usleep(1000 * PROBE_INTERVAL);
	}
	udev_monitor_unref(udev_monitor);
	udev_unref(udev);
	udev = NULL;
	udev_monitor = NULL;
	return EXIT_SUCCESS;
}</code></pre>
Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0tag:blogger.com,1999:blog-4676850913943110170.post-30966645184717090452012-11-19T16:52:00.000+08:002012-11-19T16:52:33.520+08:00隱藏 gvfs 中的硬碟分割區圖示目前有許多檔案管理程式包括 Nautilus、Thunar、PCManFM,使用 gvfs 來存取檔案系統。在預設的情況下,它會把硬碟中的各個分割當成可卸除式磁碟一樣在桌面上或檔案管理視窗中顯示圖示,如果不希望它們被當成隨身碟一樣掛載到 /media/,可以在 /etc/udev/rules.d/ 新增一項規則:<br />
<br />
<pre><code>KERNEL=="sda1", ENV{UDISKS_PRESENTATION_HIDE}="1"</code></pre>
<br />
這樣就可以把 sda1 的圖示隱藏,其他的分割區依此類推把 sda1 替換掉。規則可以寫到 /etc/udev/rules.d/10-local.rules。<br />
<br />Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0tag:blogger.com,1999:blog-4676850913943110170.post-36049734472588017202012-11-02T23:20:00.001+08:002012-11-07T14:59:10.845+08:00Linux 下的 DVD shrink 替代方案一般商業 DVD 通常因為區碼和加密而需要像 DVD shrink 這樣的軟體才能做備份,Linux 下除了用 wine 跑 DVD shrink 以外,其實還有 dvdbackup 這個套件可以用。<br />
<br />
要做整片 DVD 備份,只需要以下的指令:<br />
<br />
<pre><code>$ dvdbackup -M</code></pre>
<br />
這樣就可以將整張 DVD 備份到目前的工作目錄。另外記得要裝 libdvdcss2 來支援解密,Debian users 可以從 Debian multimedia 下載這個套件。<br />
<br />Anonymoushttp://www.blogger.com/profile/03808457499183048208noreply@blogger.com0