2007/07/31

[Linux] Inkscape 中文有問題!


版本 0.45-0ubuntu4 做過 sf.net 上的版本測試: 0.45~ 0.43 全部不行。
一直追溯到 0.42 才能用。

測試方法:
1. 畫一個 text label 內容為 "中文測試"

字體設定為"標楷體"

2. 清除自定字體,只剩下 firefly new sung 和 bkai00mp.ttf 及 bsmi00lp.ttf ,重複上面的測試。

結論:
目前的 inkscape 0.45 版在 Ubunutu 7.04 feisty 上使用有問題。

更新:
晚上在 inkscape 官網的 autopackage 裡面找看有沒有能用的版本,非常幸運的,目前最新的版本是可以用的。
這樣我就不用委屈去用舊版的 inkscape 了。

感謝辛苦的開發人員。

再更新:
subversion 裡面的版本經測試也是可以正常使用的:
svn co https://inkscape.svn.sourceforge.net/svnroot/inkscape/inkscape/trunk inkscape
// 我的插圖都是用 inkscape 畫的。

再再更新:
inkscape 最新版本也解決了快捷鍵的問題。

2007/07/30

[蝦米] 不正式的 UNLiu 表格發表

關於 UNLiu 表格的內容:

1. 最早整理是用 nosee 表格,目前由於該表格授權上有問題,故已將該部份剔除。 anton 未盡察查審核的責任,以致引發爭議或對表格「整理者」的困擾,特此向 nosee 表格的著作權擁有人及整理者道歉。

2. 本表格係由輸入法工具整理而成,在工作的部份可以參考本 blog 文章:製作自已的輸入法

3. 本表格目前暫停下載服務,未來將重新編審常用字的部份提供使用,敬請稍候。

4. 表格的填寫過程將透明公開以昭公信,歡迎指教。

感謝 ileadU 及 funny2005 上的團隊合作造就新的蝦米表格的生命。
目前這份表格的條目數量直逼 10 萬筆。(因為 這個表格還在修增中)

以上表格,感謝名單如下:
常用字﹑次常用字區:
antontw (追補)

funny2005 團隊協助 extA , extB 的部份:
千古罪人 小定 開天闢地 克萊德 kcwu 杏林學子 觀察者 □□□□ □□□
兵燹 等人的鼎力相助! (上面□是:kurasaki ichigo)

另外因為工作進度的關係,所以之前的時程作了點調整,
等暑假過後,才會是 UNLiu 表格由我手上發出的最後一個版次。
不過在這之前,我也只會再在 UTF8 符號表像 音符﹑西洋棋之類的符號上做工。XD
剩下的都是配合 ileadU 那邊的工作。 (真是辛苦他了)

註一:
參考( http://patentog.tipo.gov.tw/tipo/twpat.htm 輸入「劉重次」三個字查詢。 )

公告專利權消滅案件
專利權號數 I035347
專利申請案號 076103932
公告卷號 32
期數 12
申請名稱 漢字數理碼輸入法暨其鍵盤裝置
申請人 劉重次
消滅日期 0921111
消滅原因 未依限繳費(專利權當然消滅)
公告層圖檔頁碼 30

參考連結:
1. UNLiu 的表格製作進度 http://antontw.blogspot.com/2008/11/unliu.html

2007/07/23

[Programming] Xlib 抓 Window Status

Status st;
XWindowAttributes xtt;
st = XGetWindowAttributes(gui->display,gui->keyboard_win->window,&xtt);
if (xtt.map_state==0)
return False;
else
return True;


// 0 是 isunmaped, 2 是 isviewable

2007/07/20

[Programming] 用 Perl 抓 BBS 文章 (bbsget)

今天才發現的工具 bbsget
使用說明:
bbsget [ -d ] bbsname board login[:password] [ recno... ]

範例:
% ./bbsget elixus melix
抓 elixus 站台上的 melix 板最新的一篇文章。

--

嗯,這比 PHPTelnet 好用多了。
不過... 要重溫習一下 perl 了。

2007/07/12

[Programming] 用 PHP 抓取 BBS

用 PHP 抓 BBS 的文章,大概不好抓,除了轉信板的文章之外,好處理的方式可以說幾乎沒有。不過並不是從此絕望了, PHP 有提供 socket 的部份可以應用,以下一個範例:
Class sock
{
var $socket;
var $port;
var $address;

function Connect()
{
return socket_connect($this->socket, $this->address, $this->port);
}

function ReadMsg()
{
$out=socket_read($this->socket, 1024,PHP_BINARY_READ);
$out=iconv("big5","utf8",$out);
return $ans;
}
function SendMsg($msg)
{
$timeout = 30;
socket_write($this->socket, $msg, strlen($msg));
$ans="";
while (1)
{
$out=socket_read($this->socket, 1024,PHP_BINARY_READ);
if ($out=="") $timeout --;
echo ".";
$out=iconv("big5","utf8",$out);
$ans.=$out;
if ($timeout<=0) { echo "break\n"; break; }
if(socket_last_error($this->socket) == 104) echo "Connection closed";
}
return $ans;
}
function Close()
{
return socket_close($this->socket);
}
}

$s = new sock();
$s->port = getservbyname('telnet', 'tcp');
$s->address = gethostbyname('ptt.cc');
$s->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$result = $s->Connect();
$response = $s->SendMsg("antontw\r\n\r\n");
echo "'".strlen($response)."'\n";
flush();
$result = $s->Close();
?>


然而,我試了幾次,這個範例還不是很好用,直到發現有人開發了 PHP Telnet 這個物件, 似乎又重新打開了希望。

這個物件在測試 SayYa的時候沒有什麼大問題,不過在測試 PTT的時候發生了一些狀況,看起來還是有很多地方要注意。

以下是應用的範例:
require_once "PHPTelnet.php";
function arraytostring($array, $depth = 0)
{
if (!is_array($array)) return $array;
if($depth > 0)
$tab = implode('', array_fill(0, $depth, "\t"));
$text.="array(\n";
$count=count($array);
foreach ($array as $key=>$value)
{
$x++;
if (is_array($value))
{
if(substr($text,-1,1)==')') $text .= ',';
$text.=$tab."\t".'"'.$key.'"'." => ".arraytostring($value, $depth+1);
continue;
}
$text.=$tab."\t"."\"$key\" => \"$value\"";
if ($count!=$x) $text.=",\n";
}
$text.="\n".$tab.")\n";
if(substr($text, -4, 4)=='),),')$text.='))';
return $text;
}
//$out = iconv("big5","utf8",$arr[$i]);

$telnet = new PHPTelnet();
$telnet->show_connect_error=0;
$result = $telnet->Connect('ptt.cc','antontw','密碼!');
if ($result==0) echo "開始下命令\n"; else echo "有錯誤\n";

$telnet->DoCommand('q', $result);
$ans = arraytostring($result);
$ans = iconv("big5","utf8",$ans);
echo $ans;

echo "\n正常退出\n";
$telnet->Disconnect();
?>

2007/07/05

[Linux] Sound Device Programming

先丟參考網址:
http://www.oreilly.de/catalog/multilinux/excerpt/ch14-01.htm

oreilly 線上書籍。

http://www.linuxjournal.com/article/6735
linux journal libasound

http://www.linux.com/articles/113775
幾乎所有的 api/ lib 都介紹到了

Win32
http://www.codeguru.com/cpp/g-m/multimedia/article.php/c1575/

上面的參考資料什麼都好,就是少了 mute 的說明。
mute 以前在 OSS 底下的時候可方便了, 三行解決:

int mute;
ioctl (mixer_fd, SOUND_MIXER_READ_MUTE, &mute);
return mute;


不過現在到了改用 asound ,哇勒真的是麻煩到一整個不行:
// 以下是怕我自已忘掉怎麼做的 sample code ,parse_sample_id 的部份可以參考 amixer.c
// 那段更是長到不行

int
main() {
snd_mixer_selem_channel_id_t chn;
int err;
int psw;
static snd_mixer_t *handle = NULL;
snd_mixer_elem_t *elem;
snd_mixer_selem_id_t *sid;
snd_mixer_selem_id_alloca(&sid);
if (parse_simple_id("PCM", sid)) {
printf("error\n");
return 1;
}
snd_mixer_open(&handle, 0);
if (err = snd_mixer_attach(handle, card) < 0) {
error("Mixer attach %s error: %s", card, snd_strerror(err));
snd_mixer_close(handle);
handle = NULL; return err;
}
if ((err = snd_mixer_selem_register(handle, smixer_level > 0 ? &smixer_options : NULL, NULL)) < 0) {
error("Mixer register error: %s", snd_strerror(err));
snd_mixer_close(handle);
handle = NULL;
return err;
}
snd_mixer_load(handle);
elem = snd_mixer_find_selem(handle, sid);
if (!elem) { printf("No ELEM!!!!sid='%d'\n",sid); return err; }
printf("Simple mixer control '%s',%i\n",
snd_mixer_selem_id_get_name(sid),
snd_mixer_selem_id_get_index(sid)
);
chn = 0;
snd_mixer_selem_get_playback_switch(elem, chn, &psw);
printf(" [%s]\n", psw ? "on" : "off");

snd_mixer_close(handle);

return 0;
}

2007/07/04

[Linux] Linux 上的台股看盤軟體

嗯... 其實是沒有! ☔ :<

不過如果就這樣放棄,就不足以稱作一個有勇有謀的 Linuxer 了。
所以藉由 wine 的幫助,我們可以很輕鬆的在 Linux 上面再安裝一些 win32 的看盤軟體來操作。以下是實行畫面 (因為某些原因,所以作者看盤只能偷偷看 .... XD)



以下是建議的安裝流程,雖然是用 wine 來跑,但是官方的 ii wine-0.9.39~winehq0~ubuntu~6.10-1
跑的讓人很火大,所以筆者用了暗步,把 ie4linux (ie6) 先裝起來,再來在裡頭跑 日盛 HTS 的看盤/下單軟體,就可以了。

更新:

實際的動作其實很簡單~
$ export WINEPREFIX="/home/anton/.ies4linux/ie6"
$ wine HTS_Plaitumn.exe

這樣就可以了。

2007/07/03

[Linux] 輸入法的設定

// 我習慣先說一大堆再來實作,所以不看的人,請按 END

其實現在的 (至少fc5以後), ubuntu 6.10 以後都已經實做了 im-switch, 所以 exportXMODIFIERS 跟 GTK_IM_MODULE 的做法有時反而造成負擔。

im-switch 的做法是:
建立 ~/.xinput.d/ 在底下依據 locale (如 zh_TW, zh_CN 建立備份及目前使用的輸入法) 的目錄,用這個目錄來存輸入法設定的資料。 如此,可以在同一個 wm 底下開一個日文 console 時用日文輸入法 (ex: kinput),開繁中用 gcin/oxim/scim, 開簡中用 scim/拼音 等等,不必強求一個輸入法要滿足各種語言上的功能需求。


im-swicth 使用說明:
1. 列出目前可以使用的輸入法及預設設定:

im-switch -l
// 預設使用
=======================================================
The configuration "/home/anton/.xinput.d/zh_TW" is defined as a link pointing
tooxim
This private configuration supersedes the system wide default.
// 系統預設使用
=======================================================
The system wide default is pointed by "/etc/alternatives/xinput-zh_TW" .
xinput-zh_TW - status is auto.
link currently points to scim-chewing
scim-chewing - priority 50
scim - priority 50
scim-immodule - priority 0
Current `best' version is scim-chewing.

// 可用列表
=======================================================
The available input method configuration files are:
default none oxim scim scim-chewing scim-immodule scim_xim th-xim

設定方式:


im-switch [-v][-z ll_CC] -s inputmethodname

例如:

$ im-switch -s scim-immodule (將使用 scim 的 immodule 輸入法)
(default 設到目前使用的 locale)
$ im-switch -z zh_CN -s oxim (將 oxim 設到 zh_CN 時使用的輸入法)


以上,所以在沒有 export 前文提到的 XMODIFIERS 跟 GTK/QT_IM_MODULE 時,用 im-switch 是沒有太大的問題的,但是如果有在 .bashrc 底下做時,開新的 console 就要小心一下。

[Windows] git-bash 底下的工具

因為工作轉到 Windows 平台上的關係,所以很多工具改到 Windows 上面運作,跟著在 TortoiseGit 底下使用 git-bash 來維護自己的專案原始碼。結果就是裝了前面提過的 auto-hotkey 使用熱鍵來提昇自己的平台操作速度; 但除了 hotkey...