轉換超級大的檔案為 MySQL 可用的 .sql 檔

在大致看過原始檔案以後,可以知道原始檔案大致的格式是是這樣:

  • 每筆記錄以只有 ‘@’ 存在的行做分隔。
  • 每筆欄位,也就是每行以 @field: value 存在。
  • @content: 該行比較特別,有可能是多行,有可能是單行。

最簡單的想法就是逐行解析。一開始是先寫了一個小程式,確定一下有哪些欄位,結果這樣就執行了好久好久。所以為了實驗方便,後來改以 head -n 2000000 | tail -n 1000000 大致取了一小段來使用,來確定有多少欄位。為了以防萬一,有刻意改變數字,從尾段取部分、從中段取部分,確定三者得到的欄位都一致,就確定了 MySQL table 所需的欄位。這應該也算是統計吧,以採樣的方式來取得概略值。(之後稱這些部分的檔案為樣本檔)

接著用 grep ‘@content:’ | wc -l 算了一下樣本檔,想不到這樣就有上萬筆!! 看來逐行解析然後新增到 MySQL 伺服器裡是不太現實的,不管是新增或是導出 SQL 敘述檔案肯定都會花許多的時間。因此就改變策略,要把每筆記錄都輸出到檔案,然後再根據檔案來逐檔轉換。但是這樣也出了問題,Linux 檔案系統的 inode 就這樣被我用盡,即使 df 的結果顯示還有空間,但就是沒辦法再新增檔案了。只好再次改變策略,分割為每十萬筆記錄為一個檔案。

針對檔案的解析並不難,那想要直接輸出 SQL 敘述,使用字串參數的方式未免太麻煩。這裡藉助了 mosql 模組的幫忙,只要丟一個 dict 進去,可以很簡單的輸出 SQL INSERT 敘述。

接著為了要讓 CPU 能用到所有核心,使用了 python 的 multiprocessing 模組,先把上述分割好的檔案名稱存為 list,然後以 multiprocessing.Pool 的 map 方法去執行,這樣就大幅的縮短了處理時間。

針對大型的檔案處理,必須要分割為多個小檔案,才能善用運算資源,速度才會快。

電影流水帳(2013/11/29~2013/12/06)

左為 Ashley Hinshaw,在超能失控裡飾演 Matt 的女友。

  • The Iron Lady (IMDB, Wikipedia),中譯:鐵娘子-堅固柔情。故事以穿插的方式進行,一開始是老年的柴契爾夫人的現況,她接受精神科醫師的治療,同時也享受以前所帶來的惡果,子女都跟她不那麼親密。在她的生活裡,她已經死去的丈夫卻仍然在跟他聊天、對話,並且一邊回憶著過去。柴契爾夫人在剛剛畢業就投入政治運動,並認識丈夫 Denis。她對於自己是小雜貨店老闆的女兒有相當程度的自卑。之後跟 Denis 結婚,生下雙胞胎兒女,但她因為工作的關係,跟兒女並不是那麼的親密,幸好 Denis 全力支持她在政壇的活動,並照料家裡。到後來受到啟發,決定成為首相來改變英國。成為首相的這段期間,她面臨罷工以及全球經濟衰退,但她硬撐過來了,讓英國再次的強盛。及至後來與阿根廷的戰爭,她強硬的態度為英國帶來勝利。鐵腕的作風讓人又愛又恨,最後有點算是眾叛親離吧,黯然下臺。故事以她終於割捨 Denis 的東西,與 Denis 的告別做終。雖然沒看過關於柴契爾夫人的訪問,但我覺得 Meryl Streep 的演出相當傳神,能得獎當之無愧。
  • Chronicle (IMDB, Wikipedia),中譯:超能失控。3個年青人意外得到超能力的故事。Andrew 長期受到家庭暴力,被父親毆打,於是他買了攝影機,要把這個拍攝下來。故事也由此開始,他拿著攝影機到處拍,在學校不受歡迎。後來跟著表哥 Matt 認識了 Steve ,然後他們意外發現了一個洞穴,並因此得到超能力。他們三人一起鑽研超能力,並且獲得許多樂趣。可是,某次 Andrew 跟父親發生爭吵,他非常生氣,在暴風雨飛到空中,但過度使用能力的結果,三人一起都流了鼻血。Steve 心知有異,飛到空中去找 Andrew,在談話的過程中,Andrew 一個不小心情緒失控引發雷電,打中 Steve,Steve 因此死去。葬禮過後,Andrew 的父親沒有錢買藥,Andrew 利用他的超能力去搶錢,搶劫過程中,發生意外,Andrew 入院。母親在家裡死去,父親去了醫院看 Andrew ,並責罵、抱怨昏迷的他都不聽話。Andrew 此時暴怒,超能力整個爆發,把父親丟下醫院。再次因為流血感知到 Andrew 有益的 Matt 及時趕到,救了 Andrew 的父親,然後開始勸 Andrew。但 Andrew 始終都不聽,兩人爭執並且發生打鬥,讓城市面目全非。Matt 最後沒辦法,只好殺了 Andrew,並且逃走。Matt 之後把 Andrew 的攝影機放在西藏,並且說會試著找出為什麼有超能力的原因。這部電影的故事還蠻不錯的,運鏡也有別於其他電影,是以第一人稱的方式拍攝的,在中段以後,有因為超能力的關係,而可以從別的角度拍攝,讓運鏡不至於枯燥,蠻值得看看的電影。

其他影評:

 

InSync in CentOS5

InSync 本身可以使用 insync-headless 來啟動(http://goo.gl/bsKS2N),輸入 insync-headless –help 就可以看到可使用的指令。第一次要先 start ,然後 add_account ,add_account 時,會告訴你一個網址,你需要用 browser 去訪問這個網址,最後會取得 authcode。把 authcode 複製起來,輸入 insync-headless add_account authcode $HOME/insync 就可以把帳號加進去了。之後就只要 insync-headless start 就行。

在 CentOS 5 會比較麻煩的是,InSync 網站上取得的 portable 版本使用的是 GLIBC 2.7 ,但 CentOS 5 用的卻是 GLIBC 2.5。幸好,在 InSync 支援網站上有人詢問,而 InSync 也釋出了給 CentOS 5 使用的版本:Test CentOS 5.9 build 。這個版本裡只有 insync-portable 這指令,因此要把前面的 insync-headless 改為 insync-portable,這樣就行了。

Windows XP 的自動更新不簡單

之前幫家裡電腦重新安裝 Windows XP,結果在升級到 Service Pack 3 以後, Windows Update 頻頻失敗,我還以為是我安裝步驟出錯,重裝了好幾次,很氣人。上網找解決方案,是有找到幾個,但是都沒辦法真正徹底解決。

後來想,好像有人自己弄 Service Pack 4,不如找來試試看吧,於是就找到三秒的偽 SP4 :三秒練功房v3: (偽) Windows XP Pre-SP4。下載的網址在 github 上,檔案很小,解開以後可以看到裡面只有下載的 batch file 跟 wget.exe,點選 build.cmd 以後,就會開始去微軟網站下載個別的更新檔案。下載完畢以後,還沒 SP3 的,就升級到 SP3,然後裝 IE8、WMP11 。裝好以後,點選 hotfix.cmd 就開始真正的安裝 SP4 。

安裝完成以後,重新開機,Windows Update 就可以順利運作並且安裝其他更新了。

百度雲網盤檔案的下載

前一陣子有趁中國那邊拼的火熱的時候去申請,拿到 1TB,現在升級成 2TB 了,是說也不知道該放些什麼。

後來才聽朋友說,可以 BT 下載,只要上傳種子以後,百度雲就會幫你下載。如果已經有人下載過,會一瞬間就下載完成,我試過幾個 Linux distro 都是如此,真的是瞬間下載好。但是人生往往就是這個 But,雖然已經下載好放到雲端,你還是要從雲端拉回本地端,這時候就杯具了,你要不就用百度提供的軟體,要不就只能用瀏覽器慢慢下載。我自己大部分時間都在 Linux 上,只能用瀏覽器,還蠻斷線的,而且還不能續傳。

後來找到好方法,可以取得真正的下載網址,然後就可以用續傳軟體下載。我自己是用 Firefox,然後在 http://userscripts.org 上找到 baidupandownloadhelper ,安裝以後,當你在百度雲的網頁介面上勾選要下載的檔案之後,上方會出現「批量下載」的按鈕,按下去以後,就可以看到連結,就可以拿這個連結來下載了。

我後來是額外安裝了 aria2,可以在 console 下載的工具,正好 baidupandownloadhelper 也可以直接複製 aria2 指令,真的是相得益彰。

WinAMP 與 VFP

不,WinAMP 與 VFP 一點關係都沒有,相似的只是命運。

WinAMP 在前一陣子宣佈停止下載,也就是說,未來不會有更新了。今天在 solidot 上看到「Winamp用戶請求AOL開源代碼」,然後我就想到之前 Visual FoxPro 也是如此。微軟在 Visual Studio 6 之後,宣佈 VFP 將不再包含在 Visual Studio 裡;VFP 後續仍然有持續的更新,直到 9,然後微軟宣佈不再繼續開發,在當時就有不少人希望微軟能釋出原始碼到公眾領域,讓 VFP 能繼續存活下去。但是之後僅僅只有在 Codeplex 網站上有個 VFPX 在持續更新,為 VFP 9 提供 addon。

在 VFP 最大的社群 – Visual FoxPro Wiki 上,有一頁就是在討論這件事情,當然是不了了之。2010 年,Ken Levy 在他的 blog 發表了 Visual FoxPro Strategy at Microsoft ,他曾經擔任 VFP 的 Product Manager (也是最後一任),文章提到 VFP 的歷史以及為什麼微軟不開放的原因,主要原因就是 VFP 裡的許多技術與演算法已經被廣泛的應用在微軟其他產品上,像是 SQL Server 跟 Access,在商言商的結果,當然也不可能開放出來讓大眾檢視。

未來 WinAMP 的原始碼是否會釋出?我想如果沒有衝突到商業利益的話,也許會吧。

Log 與 Slog

在設定裡USB debugging 被關閉的情況下,Log 並沒有真正的輸出到 logcat。這種情況下就要使用 Slog,這樣子即使沒有 USB debugging 也會輸出到 logcat,但這時候要注意另外一點,因為 logcat 的緩衝區是有限制的,如果輸出過多,之前的訊息就會被刷掉。

執行指定的 CTS 項目

首先在 mydroid 目錄下要有 buildspec.mk,在編譯之後,再使用 make cts 就可以編譯完成。

使用的時候就執行 mydroid/out/host/linux-x86/cts/android-cts/tools/cts-tradefed ,接著就會出現 cts-tf > 的提示字元。這裡可以使用 help 查看可以使用的指令,要執行單一項目就是使用  run cts -c android.telephony.cts.TelephonyManagerTest -m testGetDeviceId 即可。

電影流水帳(2013/11/20~2013/11/26)

alice Mia Wasikowska ,飾演 The Kids are all right 裡的 Joni ,上網一查,發現她演過的電影還蠻多的,像 Alice in wonderland 就是。

  • The Kids Are All Right (IMDB, Wikipedia),中譯:性福拉警報。描寫同性戀家庭的故事,兩個女同性戀 Jules 跟 Nic 組成家庭,並且透過精子銀行,使用同個人 Paul 的精子,兩人懷孕分別生下一男一女,Joni 與 Laser。Laser 在 Joni 滿 18 以後,問她要不要找捐精人,也就是自己親生的父親。後來 Joni 答應了,於是他們透過精子銀行與 Paul 聯絡。Paul 跟他們一見如故,也介入了他們的家庭。Jules 跟 Nic 看似恩愛,但兩人卻有小心結,因此 Jules 在遇到 Paul 之後,動搖了,兩人天雷勾動地火,發生了肉體關係。Paul 愛上了 Jules,Jules 很掙扎。Nic 卻不喜歡 Paul,而其他三人都對 Paul 有好感,Nic 有被孤立的感覺,於是她提議一起去 Paul 家裡吃飯,以便讓她能更瞭解 Paul。Jules 外遇的事情在四人去 Paul 家裡吃飯後爆發,這一幕很精彩,Nic 在晚餐間去上了廁所,在廁所發現了滿是頭髮的梳子,在浴缸排水孔發現了毛髮,又到 Paul 的床邊發現了髮圈,Nick 的心裡有了底。回到餐桌上的時候,導演用慢動作模擬 Nic 的視線,她緩緩的望著自己的伴侶 Jules,自己的孩子 Joni 跟 Laser,然後是 Paul,把那種被背叛的感覺描寫的很好,但 Nic 沒有在當場爆發。回到家以後,Nic 質問 Jules,Jules 才哭著說出真相,兩人爭吵了一下,發現孩子在外面偷聽。孩子們不諒解 Paul 跟 Jules,Paul 則發現自己愛上 Jules,想說乾脆就在一起吧,但 Jules 不肯。到了最後,Jules 跟 Nic 與自己的孩子道歉,終於才獲得諒解,然後一起送 Joni 去大學宿舍。回程的路上,Nic 緊握著 Jules 的手,說明已經釋然。我覺得很不錯的一部電影,特別是在目前討論多元成家方案的時刻,這部電影更顯出他的意義。
  • Yogi Bear (IMDB, Wikipedia),中譯:瑜珈熊。在東森 Yoyo 台看的,故事平鋪直敘,女主角是我滿喜歡的 Anna Faris 。故事就是市長想要染指 Jellystone 公園,將這個自然的綠地轉換為經濟利益,就藉口了一些事情,將這裡的警衛 Tom 調走。Yogi 跟 Boo 發現 Tom 調走了以後,這個公園不再有遊客,因此也不再有人類的食物;同時,也出現了許多伐木的蹤跡。他們兩個決心阻止,就去找調到市區的 Tom。找到以後,回到公園遇到 Rachel,Rachel 是紀錄片的工作者,她發現了這個公園有疑似瀕臨絕種的烏龜。這隻烏龜就成了他們拯救 Jellystone 公園的救命稻草,經過一番歷險之後,他們將烏龜公諸於世,阻止了市長摧毀 Jellystone 公園,公園也恢復了原來人來人往的景況,而 Yogi 跟 Boo 又有食物吃了。

Android 與網路攝影機(2)

在可以播放以後,會想到的是能不能順便錄影?

Android 上的錄影在網路上可以找到的範例,多半是用既有的 MediaRecorder (Android 應用程式開發:如何錄製影片) 或是發 Intent 給可以錄影的 app (Recording Videos Simply) 來做。由於之前選用的是 Motion JPEG,這兩個方法都不可行。MediaCodec 似乎可用,但沒認真去找範例。

延續前篇,看了 MjpegView 原始碼,裏面的 MjpegViewThread 是使用 MjpegInputStream 在讀取 Motion JPEG,讀到一張圖,就畫在 SurfaceView 上。在 StackOverflow 上有看到 jcodec,可以餵給他 bitmap ,然後會壓縮出 H.264 影片。這正好是我所需要的,就拿來試試看了。

套用以後的結果放在 github 上,這裡就不貼程式碼了。實際上,jcodec 是合用,而且有特別針對 Android 提供一些方便的 Helper function,但是還是有缺點,第一個文件不是很齊全,StackOverflow 上能找到的 jcodec 範例或多或少都有點問題,建議是去下載最新的版本,然後參考裏面的 example 來使用;第二個是編碼後的影片不是每個裝置都能播放,電腦上播放倒是沒問題。第二個問題還蠻大的,關於這點,有人回報給 jcodec 的 issue tracker 了:Generate MP4 viewable on all versions of Android? · Issue #25 · jcodec/jcodec

後來沒繼續再深究下去,僅針對曾經有看過的部份做個筆記,就這樣。