2008年3月23日 星期日

openSUSE 11.0 預覽

這裡安裝的是 openSUSE 11.0 alpha3
注意:開發版本並不適合拿來工作使用,但歡迎您測試與回報錯誤
我在 openSUSE 10.3 上用 VirtualBox 來安裝
遇到的問題很多
您可以看一下 http://en.opensuse.org/Bugs:Most_Annoying_Bugs_11.0_dev#openSUSE_11.0_Alpha3
這次安裝的是 KDE CD 的版本(因為下載 DVD 實在太久了,下一版再來測)
這版本是沒有其他語系的
所以安裝完後要自行安裝字型、輸入法及翻譯檔
然後變更語系
這樣就跟中文版差不多了
安裝過程抓圖(使用 virtualbox)
openSUSE 11.0 alpha3

只有前半段安裝過程,因為後半段的美工還沒做好
所以只有藍白的文字介面,所以就不抓圖了


和上面的比較看看

圖片會繼續上傳到相簿中

2008年3月22日 星期六

bookmarks and grub language

1. 如果您的 firefox 沒辦法使用 google toolbar 的書籤(bookmarks)
您一定是和我一樣忘了看說明
您要安裝 libstdc++5
在 openSUSE 的套件名稱是 compat-libstdc++
預設是不安裝的

2. 如果您的 openSUSE 10.3 的 grub 選單中顯示"簡體中文"
並不是因為政治迫害
也不是翻譯檔的錯誤
您可以參考這裡來修改
我將它改成了 script:
fix_grub_zhtw.sh
#!/bin/bash
cd $HOME
cp /boot/message message-orig
mkdir msg
cd msg
cpio -iv < ../message-orig
echo "zh_TW" > languages
find | cpio -o > ../newmessage
sudo cp ../newmessage /boot/message
cd $HOME
rm -rf msg

2008年3月16日 星期日

熱血!純幫推

原文出處:
http://www.ubuntu.org.tw/modules/newbb/viewtopic.php?topic_id=8407&forum=25&post_id=40216#forumpost40216
http://www.ubuntu.org.tw/modules/newbb/viewtopic.php?topic_id=8408&forum=25&post_id=40225#forumpost40225
近期即將推出自由學電腦系列,
主要針對國小電腦課程教材,
希望國小資訊教師多多採用

[新聞轉貼]套件包裝日II-2008年4月4/5日

翻譯自 http://news.opensuse.org/2008/03/14/opensuse-packaging-days-ii-april-4th5th-2008/

在為您的最愛發行版本找尋您最愛的軟體套件時遭遇困難了嗎?您是一個應用程式開發者或某計劃的貢獻者,想要學習如何自動化為所有受歡迎的發行版本(包括 openSUSE)提供二位元套件嗎?

使用 openSUSE Build Service,您可以為大部份最受歡迎的發行版本提供套件。不用維護不同的系統來編譯建構套件,您可以享用 openSUSE Build Service 為您帶來的好處,讓他來為您做大部份的工作。

要學習如何操作這個建構平台,在 4 月 4 日和 5 日在 IRC 上加入 openSUSE 社群來淬鍊您的套件建構技術。 Packaging Days II 的活動將在 Freenode 的 #opensuse-buildservice 舉行。社群成員將會隨時待命以提供您支援及回答有關使用建構平台與包裝套件的問題。

找尋更多關於 Packaging Days II 的活動訊息,參考:
http://en.opensuse.org/Packaging/Packaging_Day(英文網頁)
http://zh_tw.opensuse.org/Packaging/Packaging_Days(中文網頁)

2008年3月11日 星期二

使用 openSUSE Build Service (以 LilyTerm 為例)

openSUSE Build Service (OBS) 可以讓您不用真的有機器就可以真的編譯打包套件
不過您得先註冊一個帳戶
先到 http://lilyterm.luna.com.tw/ 下載最新版的 lilyterm-0.7.6.tar.gz
您應該先解開看看裏面的說明
在 INSTALL 中可以看到此套件需要 libgtk2.0-dev 和 libvte-dev
(他們在 SUSE/openSUSE 中相對應的套件則是 gtk2-devel 和 vte-devel,
您可以用套件管理程式查一下就會知道)
安裝方法是直接進入 src/ 中 make 然後 make install
(沒有 configure 檔)

現在登入進入您的 Home Project

在 Build Repositories 旁的 + 按一下,選您要在哪個環境打包套件
包含了 SuSE 10.0 到 openSUSE Factory
Debian Etch
Fedora 6, 7, 8 ,CentOS 5
Mandriva 2006, 2007, 2008
xUbuntu 6.10, 7.04, 7.10

當然要 build deb 就不是像我下面所說的了
請參考 http://en.opensuse.org/Build_Service/Deb_builds
在 Packages 旁邊的 + 上按一下新增套件
填寫名稱和描述,核取下方建立 RPM SPEC 檔的模板

儲存後會自動進入此套件的頁面

把上游的 URL 填一下,然後在 lilyterm.spec 旁的 [Edit] 點一下進行修改

上面就是預設的樣板
將 Name: 改成 lilyterm
Version: 改成 0.7.6
Release: 維持 1
(OBS 會自己加上 release 的數字,如果 build 越多次(不管成功與否)數字就越大)
License: 改成 2-clause BSD-like license, see COPYING
BuildRequires: gtk2-devel vte-devel
加上一行
Source0: %{name}-%{version}.tar.gz
表示原始檔的名稱為 lilyterm-0.7.6.tar.gz (以後我們改 Version: 的地方就可以了)
Group: System/Terminals
Summary: 寫短一點
%description
可以寫長一點
在 %prep 下面加上
%setup 這樣會幫您解壓縮並切換到 %{name}-%{version} (也就是 lilyterm-0.7.6)的目錄下
%build 下面通常是加上 ./configure
不過因為 lilyterm 還沒提供 configure 所以依照 INSTALL 中所述
加上
cd src
make
%install 底下我通常填上 DESTDIR=$RPM_BUILD_ROOT make install
不過 lilyterm 的 Makefile 裏面沒有 DESTDIR 這個變數
而是指定安裝在 libdir 和 datadir 中
bindir = /usr/bin, datadir = /usr/share
而且 Makefile 不是放在 lilyterm-0.7.6 底下
所以要先切到 src 然後在 make 時指定 bindir 和 datadir 到 buildroot 下
還要先建立目錄
所以要改成
mkdir -p $RPM_BUILD_ROOT/usr/bin
mkdir -p $RPM_BUILD_ROOT/usr/share/pixmaps
cd src
make bindir=$RPM_BUILD_ROOT/usr/bin datadir=$RPM_BUILD_ROOT/usr/share install
在 %files 和 %defattr(-,root,root) 底下加上
%doc AUTHORS COPYING ChangeLog NEWS TODO README
雖然有些還是空白,以後總是會補上,所以還是列入文件中
INSTALL 是使用原始碼安裝的說明,對 rpm 安裝就沒用了
依照 Makefile 看來
install: 只會安裝 /usr/bin/lilyterm 和 /usr/share/pixmaps/lilyterm.png
所以在最下面加上
%_bindir/lilyterm
%_datadir/pixmaps/lilyterm.png
有時在這裡不知道有哪些檔案時,就先留白
rpm 會檢查哪些被安裝的檔案沒有被包進來
我們再從 Log 中找出來
最後可以順利 build 的 lilyterm.spec:
Name:           lilyterm
Version: 0.7.6
Release: 1
License: 2-clause BSD-like license, see COPYING
BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildRequires: gtk2-devel vte-devel
Source0: %{name}-%{version}.tar.gz
Group: System/Terminals
Summary: Ligth-weighted X terminal emulator

%description
A light and easy to use libvte based X Terminal Emulator

%prep
%setup
%build
cd src
make
%install
mkdir -p $RPM_BUILD_ROOT/usr/bin
mkdir -p $RPM_BUILD_ROOT/usr/share/pixmaps
cd src
make bindir=$RPM_BUILD_ROOT/usr/bin datadir=$RPM_BUILD_ROOT/usr/share install

%clean
rm -rf "$RPM_BUILD_ROOT"

%files
%defattr(-,root,root)
%doc AUTHORS COPYING ChangeLog NEWS TODO README
%_bindir/lilyterm
%_datadir/pixmaps/lilyterm.png


儲存後會回到 lilyterm 專案的頁面
然後按一下 [Add File]
上傳 lilyterm-0.7.6.tar.gz

上傳完後不用任何動作
OBS 偵測到變化會就會自行啟動

您可以到 [Build Log] 中看它運作
正如我們在自己的電腦上編譯一樣

您最好保佑能成功,因為每重作一次
OBS 就會重新建立一個虛擬機器(Xen)
加上常常排不到機器
所以...(這就是所謂的用時間換取(磁碟)空間嗎?)
上面的 lilyterm.spec 可以在 openSUSE 10.3 上 build
(這時差不多已經 build 10次了,前面有注意事項的都是代表一次失敗)
(怪自己太肉腳)
但是 10.2, 10.1 ... 其他都不行
+ /bin/mkdir -p /var/tmp
+ /bin/mkdir /var/tmp/lilyterm-0.7.6-build
+ cd lilyterm-0.7.6
+ cd src
+ make -I/opt/gnome/include
gcc -c menu.c `pkg-config --cflags gtk+-2.0`
In file included from menu.c:26:
menu.h:30:21: error: vte/vte.h: No such file or directory
make: *** [all] Error 1
error: Bad exit status from /var/tmp/rpm-tmp.76634 (%build)

因為10.2 之前的版本 vte/vte.h 在 /opt/gnome/include/
不知怎麼傳參數進去
只好改 Makefile 了(亂改一下試試看)
$ cd lilyterm-*/src
$ cp Makefile Makefile-orig

然後修改 Makefile

`pkg-config --cflags gtk+-2.0`

改成
$(CFLAGS) `pkg-config --cflags gtk+-2.0`

增加一個 CFLAGS 的變數
再將 install: 中的敘述依照上面所說修改
增加一個 DESTDIR 的變數
在 lilyterm-* 目錄下建立 diff 檔案
$ diff -uN src/Makefile-orig src/Makefile > Makefile.diff


Makefile.diff
--- src/Makefile-orig    2008-03-07 23:05:25.000000000 +0800
+++ src/Makefile 2008-03-11 09:26:41.000000000 +0800
@@ -4,11 +4,11 @@

.PHONY: all
all: main.h main.c notebook.h notebook.c config.h config.c menu.h menu.c
- gcc -c menu.c `pkg-config --cflags gtk+-2.0`
- gcc -c config.c `pkg-config --cflags gtk+-2.0`
- gcc -DIM_PATCH -c notebook.c `pkg-config --cflags gtk+-2.0`
- gcc $(INCLUDES) -c main.c `pkg-config --cflags gtk+-2.0`
- gcc -o lilyterm main.o notebook.o config.o menu.o `pkg-config --cflags --libs gtk+-2.0 vte`
+ gcc -c menu.c $(CFLAGS) `pkg-config --cflags gtk+-2.0`
+ gcc -c config.c $(CFLAGS) `pkg-config --cflags gtk+-2.0`
+ gcc -DIM_PATCH -c notebook.c $(CFLAGS) `pkg-config --cflags gtk+-2.0`
+ gcc $(INCLUDES) -c main.c $(CFLAGS) `pkg-config --cflags gtk+-2.0`
+ gcc -o lilyterm main.o notebook.o config.o menu.o $(CFLAGS) `pkg-config --cflags --libs gtk+-2.0 vte`
strip lilyterm

.PHONY: no-im-patch
@@ -28,8 +28,10 @@

.PHONY: install
install:
- install lilyterm $(bindir)
- install ../data/lilyterm.png $(datadir)/pixmaps
+ mkdir -p $(DESTDIR)$(bindir)
+ mkdir -p $(DESTDIR)$(datadir)/pixmaps
+ install lilyterm $(DESTDIR)$(bindir)
+ install ../data/lilyterm.png $(DESTDIR)$(datadir)/pixmaps

.PHONY: uninstall
uninstall:


接下來順便修改 lilyterm.desktop 的內容
讓所有的終端機都放在同一個選單目錄中
lilyterm.desktop.diff
--- data/lilyterm.desktop-orig    2008-03-04 15:43:17.000000000 +0800
+++ data/lilyterm.desktop 2008-03-10 17:11:35.000000000 +0800
@@ -9,4 +9,4 @@
Icon=lilyterm
Type=Application
Terminal=false
-Categories=GTK;Utility;TerminalEmulator;
+Categories=System;TerminalEmulator;

將這個兩個檔案傳到 OBS 上,

修改 lilyterm.spec
加上 Patch0: Makefile.diff
Patch1: lilyterm.desktop.diff
在 %setup 下加上 %patch0 和 %patch1
在 %build 部份 make 加上 CFLAGS='-I/opt/gnome/include'
並修改 %install
安裝 lilyterm.desktop
在 %files 中加入 lilyterm.desktop
Name:           lilyterm
Version: 0.7.6
Release: 1
License: 2-clause BSD-like license, see COPYING
BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildRequires: gtk2-devel vte-devel
Source0: %{name}-%{version}.tar.gz
Patch0: Makefile.diff
Patch1: lilyterm.desktop.diff
Group: System/Terminals
Summary: Ligth-weighted X terminal emulator

%description
A light and easy to use libvte based X Terminal Emulator

%prep
%setup
%patch0
%patch1
%build
cd src
make CFLAGS='-I/opt/gnome/include'
%install
mkdir -p $RPM_BUILD_ROOT/usr/share/applications
install data/lilyterm.desktop $RPM_BUILD_ROOT/usr/share/applications
cd src
make DESTDIR=$RPM_BUILD_ROOT install

%clean
rm -rf "$RPM_BUILD_ROOT"

%files
%defattr(-,root,root)
%doc AUTHORS COPYING ChangeLog NEWS TODO README
%_bindir/lilyterm
%_datadir/pixmaps/lilyterm.png
%_datadir/applications/lilyterm.desktop

如此便可以順利在 10.2 和 10.3 編譯
至於 10.1 和之前版本,則出現下面錯誤
+ cd src
+ make CFLAGS=-I/opt/gnome/include
gcc -c menu.c -I/opt/gnome/include `pkg-config --cflags gtk+-2.0`
gcc -c config.c -I/opt/gnome/include `pkg-config --cflags gtk+-2.0`
gcc -DIM_PATCH -c notebook.c -I/opt/gnome/include `pkg-config --cflags gtk+-2.0`
notebook.c: In function 'edit_page_label_dialog':
notebook.c:213: warning: passing argument 1 of 'gtk_entry_set_text' from incompatible pointer type
gcc -DICONDIR=\"/usr/share/pixmaps\" -c main.c -I/opt/gnome/include `pkg-config --cflags gtk+-2.0`
gcc -o lilyterm main.o notebook.o config.o menu.o -I/opt/gnome/include `pkg-config --cflags --libs gtk+-2.0 vte`
notebook.o: In function `add_page':
notebook.c:(.text+0x25c): undefined reference to `gtk_notebook_set_tab_reorderable'
notebook.c:(.text+0x28d): undefined reference to `gtk_notebook_set_tab_detachable'
collect2: ld returned 1 exit status
make: *** [all] Error 1
error: Bad exit status from /var/tmp/rpm-tmp.7184 (%build)

看起來不是加上編譯參數就能解決的了

2008年3月9日 星期日

在 kiba-feeder.py 改用 time 模組來處理 rss feed 的時間標記

在 kiba-feeder.py 中原本用 20081208182341 這個字串來代替
Sat, 08 Mar 2008 18:23:41 +0000
並選擇最大的放在 /tmp/Status.txt 作為最新 feed 的時間標記
但無法處理類似
2008-03-08T03:26:56.686+08:00 的時間字串
經過上次修改可以用 200803081823 和 200803080326 來處理
但是要將這一串字減掉 8 小時得到統一的 UTC 時間不大好處理(我不會而已啦)
所以再次修改用 python 的 time 模組中提供的功能來標記最新的 feed 時間
參考:
http://www.freebsd.org.hk/html/python/tut_tw/tut.html
http://docs.python.org/lib/module-time.html

--- kiba-feeder.py-orig    2008-03-05 20:38:37.000000000 +0800
+++ kiba-feeder.py 2008-03-09 07:56:05.000000000 +0800
@@ -12,6 +12,7 @@
import dbus
from dbus.mainloop.glib import DBusGMainLoop
import gobject
+import time

PLUGIN_NAME = "kiba-feeder"

@@ -31,6 +32,10 @@
'http://www.neowin.net/fb.php?page=gamers', \
'http://www.neowin.net/fb.php?page=main', \
'http://www.neowin.net/fb.php?page=software', \
+ 'http://swyear.blogspot.com/feeds/posts/default', \
+ 'http://planet.linux.org.tw/atom.xml', \
+ 'http://hyperrate.com/rss.php?eid=1', \
+ 'http://planetsuse.org/rss20.xml', \
'')

#Set this if you want to use a custom Theme THEME_DIRECTORY
@@ -79,28 +84,34 @@
while True:
if FeedNumber == (len(FEED_URLS)-1):
break
-
+
+ def time_zone(time_string):#check Time Zone eg. +0080, +08:00;return time offset in seconds
+ if time_string[-1] in '1234567890':#Sat, 08 Mar 2008 23:55:02 +0800 or 2008-03-08T22:39:03+00:00
+ if time_string[-3] == ':':#2008-03-08T22:39:03+00:00
+ return int(time_string[-6] + '1') * (int(time_string[-5:-3])*3600 + int(time_string[-2:])*60)
+ else:#Sat, 08 Mar 2008 23:55:02 +0800
+ return int(time_string[-5] + '1') * (int(time_string[-4:-2])*3600 + int(time_string[-2:])*60)
+ else:#Sat, 08 Mar 2008 22:22:00 GMT or 2006-04-18T18:11:15Z;fix me for other time zone string
+ return 0
+
Feed = feedparser.parse(FEED_URLS[FeedNumber])

FeedTitle = Feed['channel']['title']
LatestItemTitle = Feed['items'][0]['title']
LatestItemURL = Feed['items'][0]['link']
LatestItemDate = Feed['items'][0]['date']
-
- Year = str(LatestItemDate.split(' ')[3])
- Month = str(12)
- Day = str(LatestItemDate.split(' ')[1])
- Time = str(LatestItemDate.split(' ')[4])
- Hour = str(Time.split(':')[0])
- Minute = str(Time.split(':')[1])
- Second = str(Time.split(':')[2])
-
- if int(Year + Month + Day + Hour + Minute + Second) > self.TimeCalc:
- self.TimeCalc = int(Year + Month + Day + Hour + Minute + Second)
-
+ time_offset = time_zone(LatestItemDate)
+ if LatestItemDate[1] in '1234567890':#2008-03-08T03:26:56.686+08:00 or 2008-03-08T22:39:03+00:00
+ time_string = LatestItemDate[:19]
+ local_time = time.strptime(time_string,"%Y-%m-%dT%H:%M:%S")
+ else:
+ time_string = LatestItemDate[:25]#Sat, 08 Mar 2008 23:55:02 +0800
+ local_time = time.strptime(time_string,"%a, %d %b %Y %H:%M:%S")
+ utc_time_stamp = time.mktime(local_time) - time_offset
+ if utc_time_stamp > self.TimeCalc:
+ self.TimeCalc = utc_time_stamp
self.description = ('%s : %s' % (FeedTitle,LatestItemTitle))
self.URL = LatestItemURL
-
FeedNumber = (FeedNumber + 1)

self.status = open(STATUS_DIR + '/Status.txt','r')


寫程式很有趣,但我如果是靠這個吃飯,應該會過勞死吧
(也因為對程式語言不熟的緣故)

2008年3月7日 星期五

在 openSUSE 10.3 安裝 kiba-dock


遵循 http://www.kiba-dock.org/components/com_mambowiki/index.php?title=Installing_Kiba-Dock
從 svn 安裝 kiba-dock (因為 X11:/XGL 似乎已不維護 kiba-dock 了,故無法從這個套件庫安裝)
要使用 svn 您需要先安裝 subversion
當然您還需要編譯的基本基本套件 gcc 和 make
通常從 svn 編譯還需要 automake autoconf libtool intltool gettext-devel
編譯 akamaru 需要 glib2-devel (在最近的版本 akamaru 無法使用,所以維護者暫時不加入 akamaru 支援)
編譯 kiba-dock 需要 gtk2-devel cairo-devel pango-devel libxml2-devel dbus-1-glib-devel
如果要繼續編譯 kiba-plugins 則還要加 librsvg-devel,若要加上 akamaru 支援,akamaru 也要裝上
編譯 kiba-plugins 需要 python-gtk-devel libgnomeui-devel gnome-menus-devel gnome-vfs2-devel libgtop-devel kiba-dock dbus-1-devel librsvg-devel
編譯 kiba-dbus-plugins 需要 gtk2-devel dbus-1-devel python-gtk-devel kiba-dock
編譯 kiba-gaim-plugin 需要 glib2-devel dbus-1-devel librsvg-devel kiba-dock pidgin-devel
編譯 kiba-ephy-extension 則未成功過,可能需要再加上 epiphany-devel gnome-common?
(在此就不安裝了,因為要求 Epiphany = 2.18,但 openSUSE 10.3 提供的是 2.20,openSUSE 10.2 則是 2.16)
現在要用套件庫一次裝起來
使用 smart :
# smart install subversion gcc make automake autoconf libtool intltool gettext-devel glib2-devel gtk2-devel cairo-devel pango-devel libxml2-devel dbus-1-glib-devel librsvg-devel python-gtk-devel libgnomeui-devel gnome-menus-devel gnome-vfs2-devel libgtop-devel dbus-1-devel pidgin-devel

使用 zypper :
# zypper in subversion gcc make automake autoconf libtool intltool gettext-devel glib2-devel gtk2-devel cairo-devel pango-devel libxml2-devel dbus-1-glib-devel librsvg-devel python-gtk-devel libgnomeui-devel gnome-menus-devel gnome-vfs2-devel libgtop-devel dbus-1-devel pidgin-devel

安裝完成後就開始進行編譯與安裝 kiba-dock 的工作
$ svn co https://kibadock.svn.sourceforge.net/svnroot/kibadock/trunk/ kiba

此時會建立一個 kiba 的目錄,裏面有 akamaru, kiba-dock, kiba-plugins, kiba-dbus-plugins, kiba-gaim-plugin, kiba-ephy-extension 等子目錄
請依照 akamaru(如果需要) -> kiba-dock -> 其他目錄來操作
$ cd kiba/kiba-dock/
$ ./autogen.sh
$ make
$ su
# make install
# exit
$ cd ../kiba-plugins
$ ./autogen.sh
$ make
$ su
# make install

應該可以很順利安裝 kiba-dock 和 kiba-plugins
接著您可以先在終端機執行 kiba-dock
在按右鍵進行設定
看看是否有任何錯誤訊息

新增一個 firefox 啟動器時
會將啟動命令設為 firefox 0
請自行將 0 去除

啟用 sysinfo 時出現
** (kiba-dock:15281): WARNING **: Error (sysinfo.c @ line 441):
KibaSysinfo: failed to load theme

For a core dump, run kiba-dock with --g-fatal-warnings.

您可以在 Sysinfo 設定視窗中選擇 theme,就會出現刻度表了

啟用 Tray 時出現
** (kiba-dock:15281): WARNING **: Error (plugin.c @ line 239):
'/usr/lib/kiba-dock/libtray.so' is not loadable

For a core dump, run kiba-dock with --g-fatal-warnings.

表示您可能有其他的系統匣正在運作
請關閉其他的系統匣即可


若沒有問題,您可以關閉該終端機(您作的變更設定已經儲存)
然後依您需求照上面方法裝上 kiba-dbus-plugins 和 kiba-gaim-plugin
再重新測試一次
Traceback (most recent call last):
File "/usr/share/kiba-dock/dbus_scripts/kiba-feeder.py", line 6, in
import feedparser
ImportError: No module named feedparser
Traceback (most recent call last):
File "/usr/share/kiba-dock/dbus_scripts/kiba-signal.py", line 11, in
import dbus
ImportError: No module named dbus
Traceback (most recent call last):
File "/usr/share/kiba-dock/dbus_scripts/kiba-battery.py", line 11, in
import dbus
ImportError: No module named dbus
Traceback (most recent call last):
File "/usr/share/kiba-dock/dbus_scripts/kiba-mail.py", line 11, in
import dbus
ImportError: No module named dbus
Traceback (most recent call last):
File "/usr/share/kiba-dock/dbus_scripts/kiba-weather.py", line 12, in
import dbus
ImportError: No module named dbus

表示 feedparser 和 dbus 模組沒有安裝
請安裝 python-feedparser 和 dbus-1-python
然後在設定中啟動 dbus 中您要的設定
Traceback (most recent call last):
File "/usr/share/kiba-dock/dbus_scripts/kiba-mail.py", line 178, in
kiba_mail=KibaMailPlugin()
File "/usr/share/kiba-dock/dbus_scripts/kiba-mail.py", line 83, in __init__
self.check_mails()
File "/usr/share/kiba-dock/dbus_scripts/kiba-mail.py", line 94, in check_mails
self.Server = POP3(SERVER_NAME)
File "/usr/lib/python2.5/poplib.py", line 84, in __init__
for res in socket.getaddrinfo(self.host, self.port, 0, socket.SOCK_STREAM):
socket.gaierror: (-2, 'Name or service not known')

表示您未設定您的信箱
但您會發現即使設定信箱,也會有相同的訊息
請檢查 /usr/share/kiba-dock/dbus_scripts/kiba-mail.py 的內容
將所有的 gset-kiba 替換成 kiba-settings
若出現無法儲存設定的情況,請直接編輯修改
~.kiba-dock/config.xml
下面是我修改完後的樣子(使用 gmail,請先到 gmail 帳戶啟用 pop3 功能)

我設定使用 kmail 來開啟郵件
若您要使用瀏覽器介面,直接設定成
firefox http://mail.google.com/mail

mail 的圖示按下去後沒有反應(並未依照您設定的 mail-client 開啟信箱)
請修改 /usr/share/kiba-dock/dbus_scripts/kiba-mail.py
def button_release_handler(self, id):
if id != PLUGIN_NAME:
return
self.kiba.LaunchCommand('%s' % (LAUNCHER))
其他修正包含了 mail 的提示列越來越長
還有可能是 BLINK == 'yes' 時引起的崩潰
請參考 kiba-mail.py.diff
--- kiba-mail.py-orig    2008-03-05 19:54:10.000000000 +0800
+++ kiba-mail.py 2008-03-06 23:44:18.000000000 +0800
@@ -18,28 +18,30 @@
CHECK_INTERVALL = 300000

# Should the icon blink on and off? And for how long? (Seconds)
-BLINK = 'yes'
+BLINK = 'no'
BLINK_DURATION = 30

## MAIL SERVER
-VISUAL_NAME = 'Mail Account'
+VISUAL_NAME = getoutput("kiba-settings --get-char mail_server_name")
+if VISUAL_NAME == "Unable to find Option 'mail_server_name' in the Settings File":
+ VISUAL_NAME = 'Mail Account'

if getoutput("kiba-settings --get-bool mail_enable") != "TRUE":
exit()

-LAUNCHER = getoutput("gset-kiba --get-char mail_client")
+LAUNCHER = getoutput("kiba-settings --get-char mail_client")
if LAUNCHER == "Unable to find Option 'mail_client' in the Settings File":
LAUNCHER = 'mozilla-thunderbird'
-SERVER_NAME = getoutput("gset-kiba --get-char mail_server_name")
+SERVER_NAME = getoutput("kiba-settings --get-char mail_server_name")
if SERVER_NAME == "Unable to find Option 'mail_server_name' in the Settings File":
SERVER_NAME = ''
-SERVER_TYPE = getoutput("gset-kiba --get-char mail_server_type")
+SERVER_TYPE = getoutput("kiba-settings --get-char mail_server_type")
if SERVER_TYPE == "Unable to find Option 'mail_server_type' in the Settings File":
SERVER_TYPE = ''
-USER_NAME = getoutput("gset-kiba --get-char mail_username")
+USER_NAME = getoutput("kiba-settings --get-char mail_username")
if USER_NAME == "Unable to find Option 'mail_username' in the Settings File":
USER_NAME = ''
-PASSWORD = getoutput("gset-kiba --get-char mail_password")
+PASSWORD = getoutput("kiba-settings --get-char mail_password")
if PASSWORD == "Unable to find Option 'mail_password' in the Settings File":
PASSWORD = ''

@@ -101,7 +103,7 @@
self.Messages = self.Server.list()[1]
self.Counter = (self.Counter + len(self.Messages))
if len(self.Messages) > 0:
- self.Detailed = self.Detailed + ', ' + VISUAL_NAME + ': ' + str(len(self.Messages)) + ' New'
+ self.Detailed = ', ' + VISUAL_NAME + ': ' + str(len(self.Messages)) + ' New'

#IMAP
#imap = imaplib.IMAP4(SERVER_NAME)
@@ -148,10 +150,11 @@
def context_menu_handler(self, id):
if id != PLUGIN_NAME:
return
-
+
def button_release_handler(self, id):
if id != PLUGIN_NAME:
return
+ self.kiba.LaunchCommand('%s' % (LAUNCHER))

def close_handler(self, sender=None):
self.icon_added=0
@@ -165,7 +168,7 @@

self.check_mails()
self.set_icon_and_titel()
- if self.Counter > 0 and Blink == 'yes':
+ if self.Counter > 0 and BLINK == 'yes':
gobject.timeout_add(1000, self.blink_icon)

return 1


要設定 feeder 要自行修改 /usr/share/kiba-dock/dbus_scripts/kiba-feeder.py 的內容
依照格式將 feed 放在 FEED_URLS 裏面
例如:
FEED_URLS = ( \
'http://www.neowin.net/fb.php?page=gamers', \
'http://www.neowin.net/fb.php?page=main', \
'http://www.neowin.net/fb.php?page=software', \
'http://swyear.blogspot.com/feeds/posts/default', \
'http://planet.linux.org.tw/atom.xml', \
'http://hyperrate.com/rss.php?eid=1', \
'')

這時可能會出現問題
Traceback (most recent call last):
File "/usr/share/kiba-dock/dbus_scripts/kiba-feeder.py", line 166, in
kiba_feeder=KibaFeeder()
File "/usr/share/kiba-dock/dbus_scripts/kiba-feeder.py", line 72, in __init__
self.check_feeds()
File "/usr/share/kiba-dock/dbus_scripts/kiba-feeder.py", line 93, in check_feeds
Year = str(LatestItemDate.split(' ')[3])
IndexError: list index out of range

這是因為 rss feed 日期格式不同所造成的
可能的格式(說不定有更多):
Wed, 05 Mar 2008 10:52:46 +0000
2008-03-06T01:16:54+00:00
2008-02-26T20:04:08.578+08:00
修改起來有點小複雜
您可以試著套用下面的差別檔
kiba-feeder.py.diff
--- kiba-feeder.py-orig    2008-03-05 20:38:37.000000000 +0800
+++ kiba-feeder.py 2008-03-06 21:24:30.000000000 +0800
@@ -31,6 +31,9 @@
'http://www.neowin.net/fb.php?page=gamers', \
'http://www.neowin.net/fb.php?page=main', \
'http://www.neowin.net/fb.php?page=software', \
+ 'http://swyear.blogspot.com/feeds/posts/default', \
+ 'http://planet.linux.org.tw/atom.xml', \
+ 'http://hyperrate.com/rss.php?eid=1', \
'')

#Set this if you want to use a custom Theme THEME_DIRECTORY
@@ -80,6 +83,34 @@
if FeedNumber == (len(FEED_URLS)-1):
break

+ def month_number(month):
+ if month == 'Jan':
+ return '01'
+ elif month == 'Feb':
+ return '02'
+ elif month == 'Mar':
+ return '03'
+ elif month == 'Apr':
+ return '04'
+ elif month == 'May':
+ return '05'
+ elif month == 'Jun':
+ return '06'
+ elif month == 'Jul':
+ return '07'
+ elif month == 'Aug':
+ return '08'
+ elif month == 'Sep':
+ return '09'
+ elif month == 'Oct':
+ return '10'
+ elif month == 'Nov':
+ return '11'
+ elif month == 'Dec':
+ return '12'
+ else:
+ print "error month name"
+
Feed = feedparser.parse(FEED_URLS[FeedNumber])

FeedTitle = Feed['channel']['title']
@@ -87,16 +118,24 @@
LatestItemURL = Feed['items'][0]['link']
LatestItemDate = Feed['items'][0]['date']

- Year = str(LatestItemDate.split(' ')[3])
- Month = str(12)
- Day = str(LatestItemDate.split(' ')[1])
- Time = str(LatestItemDate.split(' ')[4])
- Hour = str(Time.split(':')[0])
- Minute = str(Time.split(':')[1])
- Second = str(Time.split(':')[2])
+ if LatestItemDate[1] in '1234567890':
+ Year = str(LatestItemDate.split('-')[0])
+ Month = str(LatestItemDate.split('-')[1])
+ DayPartOne = str(LatestItemDate.split('-')[2])
+ Day = str(DayPartOne.split('T')[0])
+ Time = str(LatestItemDate.split('T')[1])
+ Hour = str(Time.split(':')[0])
+ Minute = str(Time.split(':')[1])
+ else:
+ Year = str(LatestItemDate.split(' ')[3])
+ Month = month_number(str(LatestItemDate.split(' ')[2]))
+ Day = str(LatestItemDate.split(' ')[1])
+ Time = str(LatestItemDate.split(' ')[4])
+ Hour = str(Time.split(':')[0])
+ Minute = str(Time.split(':')[1])

- if int(Year + Month + Day + Hour + Minute + Second) > self.TimeCalc:
- self.TimeCalc = int(Year + Month + Day + Hour + Minute + Second)
+ if int(Year + Month + Day + Hour + Minute) > self.TimeCalc:
+ self.TimeCalc = int(Year + Month + Day + Hour + Minute)

self.description = ('%s : %s' % (FeedTitle,LatestItemTitle))
self.URL = LatestItemURL
如果得到下面的錯誤
Traceback (most recent call last):
File "/usr/share/kiba-dock/dbus_scripts/kiba-feeder.py", line 187, in
kiba_feeder=KibaFeeder()
File "/usr/share/kiba-dock/dbus_scripts/kiba-feeder.py", line 81, in __init__
self.check_feeds()
File "/usr/share/kiba-dock/dbus_scripts/kiba-feeder.py", line 130, in check_feeds
self.status = open(STATUS_DIR + '/Status.txt','r')
IOError: [Errno 2] No such file or directory: '/tmp/Status.txt'

請執行
touch /tmp/Status.txt


但有時仍會有嚴重的程式崩潰
Traceback (most recent call last):
File "/usr/share/kiba-dock/dbus_scripts/kiba-feeder.py", line 193, in timeout_func
self.set_icon_and_titel()
File "/usr/share/kiba-dock/dbus_scripts/kiba-feeder.py", line 159, in set_icon_and_titel
self.kiba.SetIcon(PLUGIN_NAME, self.icon)
File "/usr/lib/python2.5/site-packages/dbus/proxies.py", line 135, in __call__
**keywords)
File "/usr/lib/python2.5/site-packages/dbus/connection.py", line 603, in call_blocking
message, timeout)
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.ServiceUnknown: The name :1.21 was not provided by any .service files

不知道和什麼有關...

如果您想用套件庫安裝 kiba-dock
您可以加入 http://download.opensuse.org/repositories/home:/swyear/openSUSE_10.3/ 套件庫