TAG

首都機能移轉 (2) 歌詞 (2) 靠北文 (40) 戲言 (30) 糟糕 (7) ACG (23) Assembly (2) Boost (2) C (31) C++ (69) CMake (4) CSIE (67) Debian (34) Design_Pattern (2) Django (1) Eclipse (1) en_US (13) FFmpeg (3) FoolproofProject (26) FreeBSD (2) Git (4) GNU_Linux (65) IDE (5) Java (11) JavaScript (19) KDE (15) Khopper (16) KomiX (3) Kubuntu (18) Life (1) Lighttpd (2) Mac_OS_X (2) Opera (1) PHP (2) PicKing (2) Programing (21) Prolog (1) Python (7) QSnapshot (2) Qt (30) Qt_Jambi (1) Regular_Expression (1) Shell_Script (7) Talk (98) VirtualBox (7) Visual_Studio (13) Windows (18) zh_TW (36)

2009年12月25日 星期五

Suspend USB devices (turn the power off)

昨天朋友問我把 USB 裝置停電的實際命令,Google 了一下找到了方法,筆記一下。
首先要知道你的 USB 裝置代號,可以在插入後使用 dmesg 查看[?]。例:
[ 8944.330557] usb 1-8: USB disconnect, address 8
[ 9023.580525] usb 1-8: new high speed USB device using ehci_hcd and address 9
[ 9023.714733] usb 1-8: New USB device found, idVendor=0b27, idProduct=0163
[ 9023.714737] usb 1-8: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 9023.714739] usb 1-8: Product: USB Mass Storage Device
[ 9023.714741] usb 1-8: Manufacturer: USBest Technology
[ 9023.714743] usb 1-8: SerialNumber: 000000000016F3
[ 9023.714828] usb 1-8: configuration #1 chosen from 1 choice
[ 9023.715549] scsi7 : SCSI emulation for USB Mass Storage devices
[ 9023.715694] usb-storage: device found at 9
[ 9023.715696] usb-storage: waiting for device to settle before scanning
[ 9028.712208] usb-storage: device scan complete
[ 9028.713173] scsi 7:0:0:0: Direct-Access     Ut163    USB2FlashStorage 0.00 PQ: 0 ANSI: 2
[ 9028.717275] sd 7:0:0:0: [sdd] 1974271 512-byte logical blocks: (1.01 GB/963 MiB)
[ 9028.718294] sd 7:0:0:0: [sdd] Write Protect is off
[ 9028.718299] sd 7:0:0:0: [sdd] Mode Sense: 00 00 00 00
[ 9028.718301] sd 7:0:0:0: [sdd] Assuming drive cache: write through
[ 9028.725637] sd 7:0:0:0: [sdd] Assuming drive cache: write through
[ 9028.725645]  sdd: sdd1
[ 9028.837666] sd 7:0:0:0: [sdd] Assuming drive cache: write through
[ 9028.837672] sd 7:0:0:0: [sdd] Attached SCSI removable disk
[ 9149.868714] Shorewall:net2fw:DROP:IN=eth0 OUT= MAC=00:1f:d0:37:37:0a:00:30:88:12:54:d6:08:00 SRC=189.1.169.123 DST=123.205.248.119 LEN=40 TOS=0x00 PREC=0x00 TTL=92 ID=256 PROTO=TCP SPT=6000 DPT=1433 WINDOW=16384 RES=0x00 SYN URGP=0
[ 9231.369074] sd 7:0:0:0: [sdd] 1974271 512-byte logical blocks: (1.01 GB/963 MiB)
[ 9231.369566] sd 7:0:0:0: [sdd] Assuming drive cache: write through
[ 9231.370687] sd 7:0:0:0: [sdd] Assuming drive cache: write through
[ 9231.370690]  sdd: sdd1
因為它寫 usb 1-8,所以要控制的 USB 接口代號就是 1-8,很簡單吧?反正找有 usb 字樣的就對了。底下的 sd 是表示它被分配到哪個磁區代號,因為這支是隨身碟才會是這樣,其他類型的裝置會有不同的訊息,不過這不是重點,所以沒差啦。
然後請到 /sys/bus/usb/devices 裡找剛剛的接口代號的資料夾,在那裡面找 power/level,該檔是一個文字檔,或者說看起來是文字檔,內容應該是 on。只要把 on 改成 suspend 就可以把電源切斷。注意不是 off,如果輸入錯誤的字串它會無法存檔,不用擔心會改錯。
以本例來說是 1-8 所以是:
# echo suspend > /sys/bus/usb/devices/1-8/power/level
電源燈就會熄了。
噢,當然你要有相當於 root 的權限。

2009年12月18日 星期五

Ubuntu 又被婊了

這陣子為了 CMake 嘗試轉用 KDevelop 做為開發平台,不過在其首頁上看到一個聳動的標題:Don’t install Ubuntu 9.10 if you want a stable KDevelop - apaku。究竟 Ubuntu 哪裡惹到 KDevelop 了呢?
原來是 Ubuntu 把 KDevelop 4 beta 5 放進 Karmic 的官方套件庫裡,導致 KDevelop 的 upstream 被一堆重複回報的 bug 淹沒,而且其中還有己在 beta 6 修正的 bug。
其實作者要抱怨的不是這堆實際上沒什麼用的 bug report,而是 Ubuntu 把尚未正式釋出的軟體放到正式釋出的套件庫裡。然後自動回報又設定成回報給 KDevelop upstream,而不是 Ubuntu 的 package maintainer,因此 upstream 才會一直收到重複的 bug report。
有人反駁目前穩定的 KDevelop 3 使用的是 KDE3,而現在己不再被 upstream 支援,因此對 Ubuntu 來說別無選擇。但是有趣的是 KOffice 在 Karmic 裡就有分成 koffice (for KDE3, stable) 和 koffice-kde4 (for KDE4, unstable)。
由於作者釋出 beta 的目的是為了測試,但是 Ubuntu 的釋出並不是為了讓使用者測試並回報 bug,並且由於 Ubuntu 本身定位成給新手使用的發行版,他們遇到 bug 大多不會自己解決,也不會看 bug 有沒有被回報過,或是自行從 upstream 下載己修正的最新版原碼回來使用。
作者本人的建議是,尚未正式釋出的軟體不是不能放,而是應該放到另外的套件庫,不要預設就能裝這些不穩定的軟體。他用過的其他發行版都不會有這些問題(Arch, Gentoo, Debian)。
以我正在重度使用的 Debian 來說,它雖龜毛,但是也有龜毛的好處。它的 stable 依然停留在 KDE3,避開了 KDE4 目前尚未被證明的穩定度;而 testing 和 unstable 則是用無接縫升級,因為它們一開始就明講這些軟體尚未經過足夠測試,其使用者多少會有點心理準備;它甚至還提供 experimental 來放那些連 unstable 的條件都無法滿足的軟體。Ubuntu 經常為了新軟體而犧牲其穩定度。

2009年12月11日 星期五

CMake to QMake note

前幾天腦袋壞掉把手上的 Qt project 全換成 CMake,原因是 QMake 的功能實在是不太夠用。最糟糕的一點是建置的彈性太差,你很難在 qmake 的執行選項裡更改專案的設定,通常你要直接修改 *.pro files。然後是它的 install 和設定相依性的能力也很差,跟前述的問題一樣,都是寫死的。
CMake 做為一個建置系統(應該說前端)就還算是優秀,對於相依性的處理可以自己寫一套 script 來自動設定,找不到也可以讓使用者手動設定,雖然有些聲音認為 pkg-config 的方式較為方便,但是畢竟在 Windows(Mac 我不確定) 上這東西是不流行的,而且也不是每個專案都有附上 *.pc 設定。
以下是我從 QMake 到 CMake 轉換的對應處理:
前置動作
find_package(Qt4 REQUIRED)
include(${QT_USE_FILE})
這會檢查 Qt4 的設定,然後把該有的 macro 和變數引入。
子專案設定
TEMPLATE = subdirs
SUBDIRS = dir1 dir2
轉換為
add_subdirectory(dir1)
add_subdirectory(dir2)
如果有
CONFIG += ordered
的子專案間相依設定的話,要在各子資料夾內加上設定
add_dependencies(A B)
執行檔的設定
SOURCES = a.cpp b.cpp # ... program sources
TARGET = exec
TEMPLATE = app
改為
set(SOURCES a.cpp b.cpp ... )
add_executable(exec ${SOURCES})
動態連結函式庫
TARGET = shared
TEMPLATE = lib
由於 add_library 預設是生成靜態連結函式庫,要明確指定 SHARED
add_library(shared SHARED ${SOURCES})
Qt plugin
TARGET = $$qtLibraryTarget(plugin)
TEMPLATE = lib
CONFIG += plugin
這裡要自己加上 Qt 的 flags
add_definitions(${QT_DEFINITIONS} -DQT_PLUGIN -DQT_SHARED)
add_library(plugin SHARED ${SOURCES})
Qt 模組,預設是會打開 QtCore 和 QtGui 兩個。
QT += phonon
set(QT_USE_PHONON TRUE)
除了 QtCore 和 QtGui 分別是 QT_DONT_USE_QTCORE 和 QT_DONT_USE_QTGUI 外,其他的都是 QT_USE_XXX。如果發生找不到 header 或是連結錯誤的話,變數分別是 QT_XXX_INCLUDE_DIR 和 QT_XXX_LIBRARY。
QMake 會自動找需要 moc 的 header, 但是 CMake 在這個功能上還沒有完整支援,qt4_automoc macro 需要在原始碼最後加上 #include "header.moc"。如果你不是採用此做法,就只好手動加入需要 moc 的 header;怎麼找呢?找連結錯誤的 compile unit 就好了。
qt4_wrap_cpp(MOC_SOURCES a.h b.h)
add_executable(exe ${SOURCES} ${MOC_SOURCES})
Resource system
RESOURCES = a.qrc b.qrc
一樣要透過 wrapper
qt4_add_resources(RCC_SOURCES a.qrc b.qrc)
add_executable(exe ${SOURCES} ${RCC_SOURCES})
header 位置
INCLUDEPATH += src
include_directories(src)
連結
LIBS += -la -lb
記得也要連結 Qt 自己的 library
target_link_libraries(exe ${QT_LIBRARIES} a b)
如果什麼都沒做的話,在 MSVC 底下會出現多餘的 console prompt,需要做一點手腳
add_executable(exe WIN32 ${SOURCES})
target_link_libraries(exe ${QT_LIBRARIES} ${QT_QTMAIN_LIBRARY})
版本設定
VERSION = 1.2.3
set_target_properties(exe PROPERTIES VERSION 1.2.3)
set_target_properties(lib PROPERTIES VERSION 1.2.3 SOVERSION 1.2.3)
輸出路徑
DESTDIR = build
set(EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}/build")
set(LIBRARY_OUTPUT_PATH "${CMAKE_BINARY_DIR}/build")
基本上是建議除非你真的很閒才轉啦 ...