2009年11月20日 星期五

一個有趣的小程式 - sm (screen message)

哈,其實我是想順便測試一下wp-codebox這個外掛....:P

這個小程式很有趣,可以做全螢幕的大字報/看板之類的,下面是我自己做的範例:

sm

別懷疑,這就是一整個螢幕大小!

我曾經拿這隻程式來做舉牌小弟,或是在一些場合可以(娛樂性質的)打廣告或是發表意見之類的XD 總之很好玩就是了~

下面是他的python版本的程式碼,才140行而已!值得注意的是,第70行的字型我改成我喜歡的字型了,畢竟這類型的應用,還是用黑體最好看了~嘿嘿~:P

#!/usr/bin/python
# encoding:utf8

# vlshow.py
# Copyright (C) 2006 Joachim Breitner
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

import pygtk
pygtk.require('2.0')
import gtk
import pango
import sys
import gobject

window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_decorated(False)
window.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("white"))
window.fullscreen()

settings = gtk.settings_get_default()

draw = gtk.DrawingArea()
draw.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("white"))
draw.set_size_request(400,300)

pixmap = gtk.gdk.Pixmap(None, 1, 1, 1)
color = gtk.gdk.Color()
cursor = gtk.gdk.Cursor(pixmap, pixmap, color, color, 0, 0)

tv = gtk.TextView()
tb = tv.get_buffer()

def get_text():
return tb.get_text(tb.get_start_iter(), tb.get_end_iter())

if len(sys.argv) > 1:
tb.set_text(" ".join(sys.argv[1:]))
else:
tb.set_text("")

quit = gtk.Button(stock=gtk.STOCK_QUIT)
quit.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("white"))
quit.connect("clicked",gtk.main_quit)

hbox = gtk.HBox()
hbox.pack_start(tv, expand=True, fill=True)
hbox.pack_start(quit, expand=False,fill=False)

vbox = gtk.VBox()
vbox.pack_start(draw, expand=True, fill=True)
vbox.pack_start(hbox, expand=False, fill=False)
window.add(vbox)

font = pango.FontDescription()
font.set_family("LiHeiPro")
font.set_size(60*pango.SCALE)
layout = draw.create_pango_layout(get_text())
layout.set_font_description(font)
layout.set_alignment(pango.ALIGN_CENTER)

accel = gtk.AccelGroup()
key, mod = gtk.accelerator_parse("Q")
accel.connect_group(key, mod, 0, gtk.main_quit)
key, mod = gtk.accelerator_parse("Escape")
#accel.connect_group(key, mod, 0, gtk.main_quit)
#key, mod = gtk.accelerator_parse("C")
accel.connect_group(key, mod, 0, (lambda x,y,z,v: tb.set_text("")))
window.add_accel_group(accel)

window.show_all()

need_resize=True
need_quick=True

def resize(w=None,rect=None):
global need_resize
draw.window.set_cursor(cursor)
(w1,h1) = layout.get_pixel_size()
if h1>0 and w1>0:
(x,y,w2,h2) = draw.get_allocation()
s = font.get_size()
s = min ( int (s*w2/w1), int (s*h2/h1) )
font.set_size(s)
layout.set_font_description(font)
need_resize=False
else:
need_resize=True

def redraw(w=None,e=None):
global need_resize, need_quick
if layout.get_text(): # Fails for empty lines :-(
gc = draw.get_style().fg_gc[gtk.STATE_NORMAL]
(w1,h1) = layout.get_pixel_size()
if h1>0 and w1>0:
(x,y,w2,h2) = draw.get_allocation()
draw.window.draw_layout(gc,(w2-w1)/2,(h2-h1)/2,layout)
hq(True)

quality = False
def hq(q,force=False):
global quality
if q != quality:
if q:
settings.set_long_property("gtk-xft-antialias",1,"Hier halt")
else:
settings.set_long_property("gtk-xft-antialias",0,"Hier halt")
else:
if force:
draw.queue_draw()

quality = q
return False

def newtext(w):
global timeout_id
layout.set_text(get_text())
resize()
hq(False, True)

draw.connect("configure-event", resize)
draw.connect("expose-event", redraw)
tb.connect("changed", newtext)

gtk.main()

另外附上我學弟對這個程式的介紹,我想他的文筆應該比我好吧....|||

或是您也可以直接去Google搜尋「screen message」(千萬不要只搜尋簡寫...orz) 有很多相關資料~:P

Ubuntu的使用者也可以直接 $ sudo apt-get install sm 來安裝唷~(不過好像是C語言版本的,C語言版本在我的電腦上運作會跟compiz搭配得不太好...)

2009年11月1日 星期日

在Ubuntu 9.10上自行編譯安裝PCManX 0.3.9

該是發技術性文章的時候了....XD

剛剛才把Ubuntu給升到9.10,要重灌pcmanx,結果沒想到裝完要執行竟然出現:

pcmanx: error while loading shared libraries: libpcmanx_core.so.0: cannot open shared object file: No such file or directory

這個錯誤,於是乎簡單查了一下資料,答案也很簡單:「$ sudo ldconfig」。以下是完整的編譯+安裝教學:

2009年8月25日 星期二

FreeBSD相見歡?

今天總算拿到主機板了....(唉 運作得好好的主機板竟然重灌的時候發現抓不到PS/2鍵盤)

呃 不對 哪有一開始就離題的...

今天嘗試安裝FreeBSD 其實也不是第一次 但是之前裝起來沒多久就被我砍掉了XD 這次一定要努力!
首先是安裝的部份...用光碟開機之後 會進到FreeBSD的啟動畫面(boot loader) 選擇預設值就可以進去安裝畫面了XD 我用的是custom的設定 只是覺得這樣可以學比較多東西....一樣一樣東西去摸索到設定完成...

跑安裝花了15分鐘!(可以說是「而已」吧~)

安裝後第一步就是連上網路 還有啟動sshd....sshd的啟動不難 因為sysinstall(就是那個安裝程式)裏面就有選項可以選了 打開就好 至於連上網路的部份 因為我用的是ADSL 要設定PPPoE的連線.....**不知道有沒有現成的工具可以用!** 我是照著 http://twbsd.org/cht/book/index.php?ch=05 的教學把那些資訊都打上去...(手打真的好累..) 噢 然後就可以上網了!還算滿無痛的說~

可以遠端連線之後 接下來就開始摸系統了....以下條列式:
1. 我的個人帳號沒辦法su成root: 編輯/etc/group把帳號加進wheel群組就好
(哇勒 crash了 硬碟出錯....先寫到這邊 除錯去....~"~)
(強迫重開機....我不知道發生什麼事了orz)
2. 安裝bash跟vim: 進去/usr/ports裏面找到要裝的 然後make install就好
3. 安裝vim到一半就出狀況...看訊息像是I/O error...重開機後自己會進去single user mode 此時我做了fsck 然後全都選y....XD 不知道這樣是否正確...不過至少重開機後可以正常登入了~
4. root不能ssh進來: 這個沒關係 我知道是為了安全性 不過我也想知道哪裡可以調...之後再研究看看
5. ports安裝實在好慢....XD 要等好久 看來這種爛機器不適合自己編程式...

暫時是這個樣子 這篇文章沒有參考價值! 噢 之前是裝FreeBSD6.3 現在裝的是7.2

2009年7月23日 星期四

我會C++嗎?

剛剛看到這篇文章 自認並沒有很熟 但是會寫一點C++的我想試著回答看看....究竟.....我可以答對多少呢?

1. 什麼是virtual inheritance? 請舉例說明。
當有一個class(稱為D好了)繼承自兩個有共同parent class(稱為A)的class時 必須使用virtual inheritance以避免來自兩個parent class(稱為B與C)的method產生衝突

2. 什麼是virtual function? 什麼是pure virtual function?
virtual function會在runtime的時候進行binding 也就是若透過parent class的pointer呼叫某method時 會根據實際指向之child class(或是事實上是該parent class)而呼叫相對應之method 若非dynamic binding的話 則會根據pointer的型態呼叫相對應的程式碼(static binding)
而pure virtual function則不指向某一段程式碼 僅用來作為一個呼叫child class的method的入口 擁有pure virtual function的class是abstract class 不可產生instance(可以產生的話就奇妙了...沒有實做的程式碼要怎麼跑...)

3. pointer與reference的差別?
pointer是一個獨立的變數 儲存的是另一個物件的位址(address) 要取得位址需使用&運算元 要dereferencing需使用*運算元
reference是一個....reference...||| 僅僅是參考到其指向的物件 相當於該物件的別名(alias) 同時也不像pointer一樣可以更換參考目標 使用時與一般變數之syntax並無不同 僅僅是宣告時要加上&

4. 什麼是static_cast, dynamic_cast, reinterpret_cast, const_cast? 他們之間的差異是?
static_cast較類似C語言的cast 在compilation time進行cast
dynamic_cast是在runtime進行cast 所以cast的成功與否會等到runtime才能獲知(例如有B,C兩個class都繼承自A 而有個A*指向B的物件 此時若要將這個pointer dynamic_cast成C就會產生問題)
reinterpret_cast我不知道
const_cast做常數性(const)的cast 我也不清楚詳細用途

2009年7月18日 星期六

openSUSE安裝flashplayer plugin

要趕快記下來不然會忘記!XD

這是小弟今天的實驗結果 使用的平台是openSUSE 11.0 + Firefox 3.0.11

本來一直找不到可用的flash player plugin 套件庫的都有點問題(我是以能不能看YouTube當成能不能順利使用的指標...XD) 今天在實驗室剛好跟學弟聊到 就來試試看!

首先是學弟用Google找到的連結(關鍵字:64bit flash):
http://labs.adobe.com/technologies/flashplayer10/
這是Adobe Labs的網站 裡面有flash plugin 10的的prerelease版本可以下載 下載解壓縮後 只有看到一個libflashplayer.so檔 使用file查看:
$ file libflashplayer.so
libflashplayer.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, stripped

學弟要我把他放到 ~/.mozilla/plugins/ 裡面 不過我希望可以達到全系統的設定 所以暫時不這樣做(但後來證明這樣做是OK的)

首先 我試著把libflashplayer.so放到 /usr/lib64/mozilla/plugins/ 裡面 不過firefox找不到他:(

接著 我放到 /usr/lib/mozilla/plugins/ 裡面 firefox還是找不到他:(

只好搜尋「opensuse 11 安裝 libflashplayer.so」找到黑眼珠大大的這篇文章 不過其實我看不太懂....XD 不過 仔細閱讀之後 發現他把libflashplayer.so放在 /usr/lib/browser-plugins/ 裡面!!!!(他裡面提到nspluginwrapper 不過因為我抓的應該就是for linux的了 所以應該不需要處理就可以用) 我就如法泡製 把libflashplayer.so放在 /usr/lib64/browser-plugins/ 裡面(小弟實在是很白目 硬要先用自己覺得合理的方法做!XD) 恩 到這為止就成功了!firefox已經可以順利播放flash 雖然不知道有沒有什麼bug 但是暫時是OK的!!!

題外話 在 /usr/lib/browser-plugins/ 裡面也有一個libflashplayer.so 用file去查看發現他是32bits的:
$ file libflashplayer.so
libflashplayer.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
這就難怪我本來的firefox不能用flash了...

另外 我跟學弟討論為什麼不是放在 /usr/lib(64)/mozilla/plugins/ 底下 他說應該是openSUSE自己改的...這其實不太能確定啦~不過的確是讓人滿困惑的XD

結論 只要有正確版本的flashplayer plugin 可以放在以下3個地方來讓firefox正常執行:
1. ~/.mozilla/plugins/
2. /usr/lib64/mozilla/plugins/
3. /usr/lib/mozilla/plugins/
個人私心認為2是最好的選擇(64 bits的lib就放在lib64很合理嘛..) 而如果是非管理員的user則可以選擇放在1

這是一篇很緊張的速記 未來也沒有重構的打算 但若是有錯誤也歡迎提供指教!