2015年10月29日 星期四

開發 ubiquity - 環境架設


首先先確定系統中有裝 ubiquity (程式核心) 和 ubiquity-slideshow-ubuntu-gnome (gnome 桌面環境下播放的 ubiquity slides),如果沒裝,要先裝
sudo apt-get install ubiquity ubiquity-slideshow-ubuntu-gnome ubiquity-frontend-gtk
因為 Ubuntu 桌面環境預設使用由 gnome 開發,所以這邊選擇安裝 -ubuntu-gnome。如果你想開發的桌面環境是其他種類,例如 kubuntu 或是 lubuntu,請分別選擇不同的 suffix,例如 ubiquity-slideshow-kubuntu 。

frontend 的部份也是一樣的意思,如果使用 kde ,請裝 ubiquity-frontedn-kde 。

因為我想開發 oem 安裝模式下的 ubiquity 行為,所以我的系統還要先有安裝 oem-config
sudo apt-get install oem-config
接著創建一個用來放開發用程式碼的資料夾
mkdir -p src/ubiquity
進到這個資料夾中[1],
然後取得架設環境用的 script (你可能要事先安裝 bzr),
sudo apt-get install bzr 
bzr branch lp:~taihsiangho/+junk/ubiquity-scripts scripts
或是從這裡也可以取得(我是從這 copy 的,免得原作者有天把來源拿掉)
bzr branch lp:~agateau/+junk/ubiquity-scripts scripts
取得 ubiquity 中播放的 slides
bzr branch lp:ubiquity-slideshow-ubuntu slideshow
取得 ubiquity 原始碼(到時要開發這一份)
bzr branch lp:ubiquity code
整個環境架設的核心概念是把下載下來的部份原始碼,使用 symbolic link 去代替在系統中的程式碼(這種作法可以生效是因為 ubiquity 核心本身是 python 這個直譯式語言寫成的關係),所以開發時直接改 code 就會好像直接改系統中的 ubiquity 程式一樣。

上面的步驟可以整合為
sudo apt-get install ubiquity ubiquity-slideshow-ubuntu-gnome ubiquity-frontend-gtk oem-config && mkdir -p src/ubiquity && cd src/ubiquity && sudo apt-get install bzr && bzr branch lp:~taihsiangho/+junk/ubiquity-scripts scripts && bzr branch lp:ubiquity-slideshow-ubuntu slideshow && bzr branch lp:ubiquity code
使用這個指令去準備開發環境[2]
./scripts/setup setup
done!! 至此為止所有東西都準備好了。所以我們切換到開發狀態
./scripts/setup dev
修改好程式後,接著啟動 ubiquity 。我在這裡想開發的是 oem 模式下的行為,所以啟動方式是
sudo oem-config
而不是標準的 ubiquity
sudo ubiquity



本篇主要參考
http://agateau.com/2013/hacking-on-ubiquity-the-setup/
我已經將虛擬機器的部份拿掉,著重在最核心的概念:使用原始碼替換系統中的程式碼。讀者可依照自己的需求,將此環境設置方式自行搭配必要的虛擬環境,免得把自己的主系統弄髒。

[1] 注意不要漏掉這一步,不然後面的 ./scripts/setup 不會正確工作。
[2] 如果系統沒有安裝 qt 相關的 ubiquity 的話;setup 這個 script 中 qt 相關的動作要被移除,來保證 script 執行沒有中斷。免得行為不符合預期。


Trouble Shooting

sudo oem-config 啟動後沒反應

遠端啟動時,是否有指定環境變數 DISPLAY

/usr/sbin/oem-config 會先檢查是否有 DISPLAY 環境變數,如果有才 import Gtk module。所以不指定的話就會有如下錯誤:

Jan  3 18:41:12 201606-22347 ubiquity[23735]: Ubiquity 2.21.63.3 (oem-config)
Jan  3 18:41:13 201606-22347 ubiquity[23735]: Exception in GTK frontend (invoking crash handler):
Jan  3 18:41:13 201606-22347 ubiquity[23735]: Traceback (most recent call last):
Jan  3 18:41:13 201606-22347 ubiquity[23735]:   File "/usr/sbin/oem-config", line 649, in <module>
Jan  3 18:41:13 201606-22347 ubiquity[23735]:     main(oem_config)
Jan  3 18:41:13 201606-22347 ubiquity[23735]:   File "/usr/sbin/oem-config", line 635, in main
Jan  3 18:41:13 201606-22347 ubiquity[23735]:     install(query=options.query)
Jan  3 18:41:13 201606-22347 ubiquity[23735]:   File "/usr/sbin/oem-config", line 264, in install
Jan  3 18:41:13 201606-22347 ubiquity[23735]:     wizard = ui.Wizard(distro)
Jan  3 18:41:13 201606-22347 ubiquity[23735]:   File "/usr/lib/ubiquity/ubiquity/frontend/gtk_ui.py", line 228, in __init__
Jan  3 18:41:13 201606-22347 ubiquity[23735]:     self.builder = Gtk.Builder()
Jan  3 18:41:13 201606-22347 ubiquity[23735]: NameError: name 'Gtk' is not defined

例如可以這樣指定

export DISPLAY=:0 ; sudo oem-config

檢查 /var/log/syslog

合併 tail -f /var/log/syslog 的監控技巧,執行 oem-config。目前發現在 Xenial proposed stack 上有點問題;這應該是因為最新的 ubiquity source 和 Xenial 的環境有不相容之處。可以切回 ./scripts/setup distro 使用系統原本的試試是否可以起來。

Jan  3 18:41:30 201606-22347 ubiquity[23742]: Ubiquity 2.21.63.3 (oem-config)
Jan  3 18:41:30 201606-22347 ubiquity[23742]: Exception in GTK frontend (invoking crash handler):
Jan  3 18:41:30 201606-22347 ubiquity[23742]: Traceback (most recent call last):
Jan  3 18:41:30 201606-22347 ubiquity[23742]:   File "/usr/sbin/oem-config", line 649, in <module>
Jan  3 18:41:30 201606-22347 ubiquity[23742]:     main(oem_config)
Jan  3 18:41:30 201606-22347 ubiquity[23742]:   File "/usr/sbin/oem-config", line 635, in main
Jan  3 18:41:30 201606-22347 ubiquity[23742]:     install(query=options.query)
Jan  3 18:41:30 201606-22347 ubiquity[23742]:   File "/usr/sbin/oem-config", line 264, in install
Jan  3 18:41:30 201606-22347 ubiquity[23742]:     wizard = ui.Wizard(distro)
Jan  3 18:41:30 201606-22347 ubiquity[23742]:   File "/usr/lib/ubiquity/ubiquity/frontend/gtk_ui.py", line 278, in __init__
Jan  3 18:41:30 201606-22347 ubiquity[23742]:     ''')
Jan  3 18:41:30 201606-22347 ubiquity[23742]: GLib.GError: gtk-css-provider-error-quark: <data>:8:24'min-height' is not a valid property name (3)

2015年10月20日 星期二

除錯技巧心得 - 以 GConf 參數為例



安裝

sudo apt-get install gconf-editor

啟動

gconf-editor

如果已經知道 schema 的話,按照 schema 去找;若是不知道 gconf-editor 有 Find 功能可用。


把設定界面打開,一邊調整一邊觀察。所以就會知道該怎麼調整 gnome 設定。



gnome 的說明 https://projects.gnome.org/gconf/

gconf-editor
GNOME has a prototype-quality unfinished program called gconf-editor which is sort of the GUI equivalent of gconftool. Try it out.


dconf 是比較新的工具,先用 dconf,找沒有想要的屬性的話再用 gconf 查找。原本的回答很不錯,直接引用:
dconf is a new way for applications to store settings, and it is intended to replace gconf. dconf-editor and gconf-editor are for their respective configuration systems, and they don't talk to each other. At the moment that transition is still a work in progress, so many applications continue to use gconf. In addition, some applications still have settings left over in gconf even though they are using dconf now.
Almost all of the software that is installed by default - everything that comes from GNOME - uses dconf (if anything). Almost everything else that is available uses gconf, though this is of course changing as older software is brought up to date.
So, yes, changing a setting in gconf is likely to do something! If you did a fresh install of Ubuntu 11.10 and didn't migrate your gconf settings, it's likely that everything you see with gconf-editor is being looked at and understood by some current application. If your settings predate 11.10, there may be stuff there that isn't being used.
As a rule of thumb, check dconf first and if what you're looking for isn't there, try gconf.

https://askubuntu.com/questions/91403/when-to-use-gconf-vs-dconf