VFPWiki升級之路(3)-MySQL

搞了半天,才發現MySQL版本裝錯。於是就先移除掉,再重新安裝。
可是卻無法啟動,看了/var/log/daemon.log之後,發現有這麼一行錯誤訊息:

Fatal error: Can’t open privilege tables: Table ‘mysql.host’ doesn’t exist

原來是 /var/lib/mysql 路徑下沒有 mysql 這個資料夾,於是我們改採手動建立,並且變更 owner 以及 permission。
再執行 mysql_install_db 來建立基本資料庫即可。

#cd /var/lib/mysql
#mkdir mysql
#chown mysql:mysql mysql
#chmod g+w mysql
#chmod o-rx mysql
#mysql_install_db

重新啟動 mysql,雖然是順利啟動了,可是卻出現錯誤訊息:

/usr/bin/mysqladmin: connect to server at ‘localhost’ failed
error: ‘Access denied for user: ‘debian-sys-maint@localhost’ (Using password: YES)’

停止mysql時也一樣有錯誤訊息:

/usr/bin/mysqladmin: shutdown failed; error: ‘Access denied. You need the SHUTDOWN privilege for this operation’

看來都是一樣的問題,所以需要手動GRANT權限給debian-sys-maint這個user,首先參考/etc/mysql/debian.cnf,得知帳號與密碼,再使用GRANT指令即可:

#cat /etc/mysql/debian.cnf
#mysql
>GRANT all on mysql.* TO ‘debian-sys-maint’@’localhost’ IDENTIFIED BY ‘your_password’;
>GRANT SHUTDOWN on *.* TO ‘debian-sys-maint’@’localhost’;

完工。

SQL 與 Text

今天想到蠻有趣的構想。
SQL 一如我們所知,是查詢資料表格用的。除此之外,也可以查詢 Excel 或是 具有特定格式的 Text。
如果今天以 regular expression 用來查詢一個文字檔,像這樣:

select pos from mybase.txt where str=’a*c’

或是這樣

select pos from mybase.txt where str=’\d\d\d\d’

然後我們就得到一份表格,告知我們 ‘a*c’ 或 ‘\d\d\d\d’ 在 mybase.txt 裡出現的位置。
喔~這看來很方便呢~~
如果要替換某些字串呢?像這樣

update mybase.txt set str=’abcd’ where str=’\d\d\d\d’

把所有是四個位數的數字替換成 abcd。
刪除也可以囉~

delete from mybase.txt where str=’^void’

把所有一開頭是 void 的 void 都刪掉…
新增?沒啥特殊功能可以加上,就是 append 到最後吧…

insert into mybase.txt ( str ) values (‘end of file’)

歸納一些關鍵字如下:

  • str 表示要找的字串或是找到的字串
  • pos 則表示在檔案中的位置,也許可以再延伸出 line 與 column,來表示列與行的位置。
  • 當然也要支援 count() 之類的函數,這樣就可以統計共出現幾次。

我想我會找時間來完成這個有趣的構想吧…
補充:
剛剛又想到,其實也可以以 Lucene 來當作資料來源,這樣也很有趣…

VFPWiki升級之路(2)-安裝必要的套件

大抵有下列套件需要安裝
mysql-server 4.x, apache2, php4, phpmyadmin, proftpd
因為無法登入實體 server 的 console,幾個方針要特別注意:

  1. 資料庫資料的匯入盡量利用 phpmyadmin。
  2. 程式盡量利用 ftp 上載。

但是卻遇到了最大的困難,資料量過大,無法利用 phpmyadmin 來匯入資料庫。
有沒有什麼更好的方法呢?

印度出差所看完的電影

這次去印度,瘋狂地看完了以下電影:

  • Scary movie 4 (IMDB, Wikipedia),台譯:驚聲尖笑4。這集比較不好笑…
  • Below (IMDB, Wikipedia),台譯:鬼潛艇。有點毛毛的,主要還是在利用人的心理在營造恐怖氣氛…
  • Over the Hedge (IMDB, Wikipedia),台譯:森林保衛戰。寓教於樂的故事
  • Danny the dog/Unleashed (IMDB, Wikipedia),台譯:鬥犬。普普通通
  • Inside man (IMDB, Wikipedia),台譯:臥底。我覺得還不錯,如果你夠細心的話,從一開始,你就可以推敲出這不是一件搶案。
  • V for Vendetta (IMDB, Wikipedia),台譯:V怪客。小悶的一部片,誠如廣告所打的 slogan,全片的目的就是要追求自由。
  • Ice Age: The Meltdown (IMDB, Wikipedia),台譯:冰原歷險記2。,卡通片,個人覺得不如第一集好看。
  • She is the man (IMDB, Wikipedia),台譯:足球尤物。Amanda show 的主持人領銜主演,之前在美國看電視的時候,就有注意到她,她真的是異常地活潑。
  • 情義知我心,接續上次沒看完的部份,想不到最後的結局竟是以悲劇收場,蠻感人的故事。
  • Wedding Crashers (IMDB, Wikipedia),台譯:婚禮破壞者。還可以的一部片,挺有趣的。
  • Ultraviolet (IMDB, Wikipedia),台譯:紫光任務。全片一路打到底,喜歡動作片的一定喜歡。

VFPWiki升級之路(1) – VMWare server on Fedora Core 5

因為太久沒更新wiki版本,又為了避免站主過於操煩,所以我決定架設一個跟他環境一樣的 server,來先行實驗升級看看。
首先,到VMWare官方網站下載官方提供的 rpm,並且索取 serial-number。
接著就是安裝:

#rpm -ivh VMware-server-1.0.0-28343.i386.rpm

畢竟以前也裝過幾次,接著就是設定 VMWare

#vmware-config.pl

這部份應該沒問題,依照問題回答即可,大部分都只要按下 Enter 選擇預設值即可。
這個問題是比較詭異的,他說 gcc-4.1.1 可能會有問題;不過我不管他,還是輸入了 yes,等有問題的時候再說吧。

Your kernel was built with “gcc” version “4.1.0”, while you are trying to use
“/usr/bin/gcc” version “4.1.1”. This configuration is not recommended and
VMware Server may crash if you’ll continue. Please try to use exactly same
compiler as one used for building your kernel. Do you want to go with compiler
“/usr/bin/gcc” version “4.1.1” anyway? [no] yes

安裝完成以後,可以在Gnome環境下的 應用程式>系統工具 下找到 VMWare server console,執行他。
這可以幫助我們建立一個virtual machine。
下載 debian 的網路安裝光碟映像檔:debian-31r2-i386-netinst.iso,大約只有一百多MB,算是很小。
之後我們將利用 apt-get 直接從網路下載並安裝。
所以就直接把 virtual macine 的光碟機對應到這個映像檔上,進行 Power On,接下來就跟安裝 Debian Linux 一樣啦(不知道怎麼作的話,去買書吧)。
安裝完成之後,記得先暫時關閉 virtual machine,將光碟機對應到實體磁碟機上,免得又要再安裝一次。
開機之後,Debian 會很貼心的進行首次使用前的設定,也是照步驟進行即可。
這樣就大功告成啦,下次來安裝 apache + mysql + php。

印度的交通

印度的交通,前兩天去真是非常驚訝,不過,後來也就習慣了。

如果不能看的話,點選這裡

How to branch/tag in TortoiseSVN

Subversion手冊裡面詳細的介紹了關於 trunk / branches,實際上所謂的 branches,其實也就是把 trunk 搬到 branches 目錄下並換個名稱而已。
TortoiseSVN建 branch/tag 的方法相當簡單。

  • 首先在 checkout 出來的目錄上,按下滑鼠右鍵,選擇 TortoiseSVN > branch/tags
  • 指定 url,改成 http://xxxxx/branches/your_branch_name,填上說明,左下角打勾,這樣 branches 完之後,TortoiseSVN會幫你把整個目錄切換到指定的 branch
  • 大功告成

ok, 那麼要怎麼切換回 trunk (主要開發分支) 呢?

  • 首先在 checkout 出來的目錄上,按下滑鼠右鍵,選擇 TortoiseSVN > Switch
  • url 改為 https://xxxxx/trunk
  • 大功告成

7/13 Hyderabad 的第一天

今天是來到印度的第一天,早餐以後約九點多,與 A 到 P 公司去,路上真是充滿驚奇!
印度與日本一樣,車子都是靠左駕駛,駕駛座則是在右邊。路上到處都是竄走的機車、汽車與人,有人說台北的交通很恐怖,現在在我眼裡看來,台北的交通算是非常有秩序的了。過了不久,我更發現一件驚人的事情,那就是沒有紅綠燈!所有的車子都是靠喇叭在開車,所以你不時會聽到喇叭的聲音在催促前面的車子或者是亂過馬路的人,很難以想像這樣的交通居然還頗為順暢。
到了晚上八點多,A 與我打道回 Hotel,路上還是很多車子跟人在走來走去,基本上情況跟早上九點多差不了多少,這真是令人吃驚..

Hyderabad, India

經過幾天的心情轉換之後,總算是覺得好些了。~_~
即將要前往 India,目的地是海得拉巴,看起來真是一個好地方。
中文的介紹或許還不夠,但英文的可就很清楚了…
Hyderabad 是印度第五大城,很多資訊公司都在此建立基地,以爭取印度的軟體人才,像是微軟、Portal Player…等等。所以看起來應該是沒什麼問題,希望是不會像背包客棧自助旅行論壇所說的那麼嚇人就好,我可是老實人,很容易上當的。
這次去大約九到十天,假日兩天,印度的夏天非常炎熱,據說都超過 40 度,所以白天還是盡可能不要出外活動的好,而晚上又太過危險,不太想出來亂跑。
結論是,盡情享受咖哩與飯店設施吧…
=_=”

IronPython(4) – 類別、繼承、模組化

基本上還是跟上次的一樣,只是我們要重新寫過,直接繼承 Form 類別,然後模組化。
Python 定義類別的方法相當簡單:

class classname( parentclass ):
  def __init__( self ):
    # initialize
  def doSomething( self ):
    # do something

他是以左邊的縮排來決定範圍,所以同樣縮排就表示是同一區塊。
self 則是表示自己,也就類似 c# 的 this。
所以我們把昨天的程式碼重新寫過:

import clr
clr.AddReferenceByPartialName(“System.Windows.Forms”)
clr.AddReferenceByPartialName(“System.Drawing”)
from System.Windows.Forms import *
from System.Drawing import *
class OptionForm( Form ):
  def __init__(self):
    self.InitializeComponent()
  def InitializeComponent(self):
    self.Text = “RSSMSN – customize your msn personal message”
    # Initialize Label
    lblHello = Label(Text=”Hello world!” )
    lblHello.Visible=True
    lblHello.Location=Point( 10, 10 )
    lblHello.AutoSize=True
    self.Controls.Add( lblHello )
    # Initialize NotifyIcon
    notifyIcon1 = NotifyIcon( Visible=True, Text=”RSSMSN”, Icon=Icon(“Matrix.ico”) )
    # Initialize Form
    self.StartPosition=FormStartPosition.CenterScreen

大致上就會是這樣子,我們將這個檔案命名為 fmOption.py。
主程式則另外放到 main.py:

import clr
clr.AddReferenceByPartialName(“System.Windows.Forms”)
clr.AddReferenceByPartialName(“System.Drawing”)
from System.Windows.Forms import *
from System.Drawing import *
from fmOption import *
f = OptionForm()
Application.Run(f)

你可以看到主程式變得簡單許多。這邊只需要將剛剛寫好的 fmOption.py 引用進來,再將 OptionForm 實體化,請 Application 類別去把窗開出來就好了。
Python 引用其他檔案的方法,統一都是 from your_module import classname。
這個 your_module 可以是 assembly name 也可以是 module name。
大致上就是這樣子了。
下次的目標是加上 destructor 以確保 System Tray 的 Icon 會在程式結束時消失。
參考資料: