跳到主要內容

發表文章

Python MySQLdb SQL裡含有特殊字元的處理

在文本的處理中,無論是網路上抓取的資料,還是由實際資料轉換而來的文本,已結構化處理的資料我都習慣放至資料庫中儲存和管理。一直以來都很習慣的使用 PHP 語言來做資料的整理和處理,一方面是因爲最熟悉這個語言,一方面是 PHP 也可以很容易的做成網頁來呈現結果。 而有些近來處理的資料,需要經過中文斷詞(中文分詞)的處理,雖然 PHP 已有人發展出 SCWS 中文分詞工具,主要運用在 GBK 和 UTF-8 上,對於繁體中文的斷詞目前則不如其他工具來的好用。也因此我最近選擇了 Python 作爲文本處理的主要語言,使用 JieBa 這套斷詞工具(斷詞的細節在這裡我就不多琢磨)。以往 PHP 操作 MySQL 的方式現在要改成 Python 了,也還好 python 有 MySQLdb Library 來幫助操作。 在 PHP 中爲了避免 Single quote 或是 double quote 等特殊字元可能造成 SQL injection,多半會使用  addslashes() 或 mysqli::real_escape_string() 函數來事先處理。而在 python 的 MySQLdb 中也有雷同的函數 MySQLdb.escape_string() 可是使用來跳脫特殊字元,我所處理的文本資料是 utf-8 編碼,在第一次使用就出現了如下的錯誤訊息: MySQLdb.escape_string(sql) UnicodeEncodeError: 'ascii' codec can't encode character... 讓我傷透了腦筋以爲是 unicode 造成的問題,陸續找了其他像 replace 或 regular expression 的方式來替換,也試過字串以參數代入的方式,但都無法盡善盡美。 最後我又回到了這個錯誤訊息,錯誤訊息總是會有解答的 Hint :)。 原來 MySQLdb.escape_string() 試圖將 query 的內容 encode 成字串,預設使用的 encode 編碼是 ascii,而我們所使用的 query 無法被 encode 成 ascii 而產生錯誤。所以我們 必須告訴 MySQLdb 要使用的編碼是 utf-8 ,方法如下: MySQLdb.e...

安裝 MariaDB 10.1 與解決套件 unmet dependencies 問題

自從昇陽(Sun)公司被併購入 Oracle 之後對於很多原本的 Open Source 專案都有莫大的影響,加上 Oracle 公司本身主要的產品是資料庫,因此,許多使用者都開始感到擔心 MySQL 這個許多專案都愛用的資料庫軟體,有朝一日會開始朝向收費一途前進,MySQL 在去年的版本更新時偷偷更換了 GPL 授權一事( MySQL man pages silently relicensed away from GPL ),相信不少人的心爲之一振,萌生離去的念頭 。 Oracle 並不是第一次驅使使用者離去,已有 OpenOffice 和 OpenSolaris 的前車之鑑,於是決定開始先熟悉與嘗試由 MySQL 元老 Michael Widenius 發起的 MariaDB。其中 Oracle 帶來的風風雨雨和變動,網路已有不少網友心痛分享在此則不再多做贅述。 MariaDB 由一開始的 MySQL 分支,保持和 MySQL 相同的版本號以維持使用者對於兩個資料庫相容的認知。在 2013 年 4 月 SKySQL 和 MariaDB 的原開發公司 Monty Program Ab 合併 後,便共同開發下一代的 MariaDB。在今年 2014 年 3 月的時候釋出 MariaDB 10 的新版本號,由 5.5 直接跳至 10,也象徵著一個全新的開始。在 MariaDB 10 中主要新增了 3 個新的特色:( 參考資料 ) 新增高效複製功能,可以平行複製資料以及更先進的集體提交功能(Group Commit)。 增加原生NoSQL支援。新版增加了Connect 引擎來做外部資料管理。 內建分片(Sharding)功能,提升對分散式架構的支援。 在這次的安裝中,我選擇了 MariaDB 10.1 的版本號在 uBuntu 14.04 Desktop x64 中安裝。10.1 是建立在 MariaDB 10.0 和源自 MySQL 5.6、5.7 的功能以及一些新功能( 更新記錄 )。安裝方式是使用官方提供的方式,加入 Mirror 的 Repositories 來安裝( Repository Configuration Tool ),跟著步驟一個一個點選安裝即可。 不曉得之前是否有安裝其他軟體造成衝突,在 sudo a...

在 uBuntu 中移動 MySQL 的資料存放位置

在 uBuntu 中,MySQL 的資料預設存放位置在 /var/lib/mysql 資料夾底下,有時候我們會因爲某些需求,將資料預設儲存的位置更改至其他位置。 在 uBuntu 中更改預設儲存位置的方法,除了修改 /etc/mysql/my.cnf 中的 datadir 路徑,還需要修改 /etc/apparmor.d/usr.sbin.mysqld 這個 AppArmor 設定檔,否則重新啓動 MySQL 的時候會出現失敗的錯誤訊息。 假設我們要移動的目標資料夾爲 /data/mysql,修改的方法如下: 暫時停止 MySQL 服務 $ sudo service mysql stop (or sudo /etc/init.d/mysql stop) 修改 my.cnf 設定檔,將 datadir 註解並填上新的路徑 $ sudo vim /etc/mysql/my.cnf # datadir = /var/lib/mysql datadir = /data/mysql 複製原先的資料到新的資料夾中 $ sudo cp -R -p /var/lib/mysql /data/mysql 修改 usr.sbin.mysqld 設定檔,將原本路徑爲 /var/lib/mysql 的都改到 /data/mysql $ sudo vim /etc/apparmor.d/usr.sbin.mysqld 重新啓動 AppArmor 與 MySQL 服務 $ sudo service apparmor restart $ sudo service mysql start 能夠順利啓動的話,就沒有什麼問題了!啓動後登入 MySQL 觀察一下。

架設 Gitlab 於 uBuntu 12.04.3 LTS(Non-root path)

有一個 GUI 的界面對我們的親和力總是比較高的,即使是習慣 Coding 的人還是會想有一個好的介面來使用 Git,諸如 github 與 bitbucket 此類的 Code hosting,也都設計了想當好的 Web Interface 提供相當好的使用體驗。如果我們想要有好的界面,但是又想自己 Hosting Code 在自己的伺服器呢?目前有許多 Open Source 的專案提供了這類的  Web 應用,我比較喜歡的是 Indefero (基於PHP) 和 Gitlab (基於Ruby) 這兩套。Indefero 是類似 Google Code 的網站,而 GitLab 則是類似 Github 的界面。 Indefero GitLab 由於個人比較喜歡 GitLab 的界面,所以雖然對 Ruby 不是很熟悉,決定來挑戰一下安裝 GitLab。參考了  Tsung's Blog:將 GitLab 架設 於 Ubuntu 12.04 (Precise) 和 官方的安裝說明文件 ,不同的地方主要是在前述方法會成爲主要的 Root 網站,但我運行的伺服器還有運行其他的 Web 服務,所以要安裝在非主目錄。尋找解決方法和測試,花了將近 8 個小時,爲了方便自己記憶,決定記錄下整個過程。 套件需求 Python 2.5+ ruby 1.9.3+ git 1.7.10+ redis 2.0+ MySQL(or PostgreSQL) 基本環境安裝 更新套件庫資料 $ sudo apt-get update $ sudo apt-get dist-upgrade 安裝 VIM 作爲編輯工具,並設定爲預設編輯器(若已安裝請略過) $ sudo apt-get install -y vim $ sudo update-alternatives --set editor /usr/bin/vim.basic 安裝必要的套件 $ sudo apt-get install -y build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev ...

更換 LibreOffice 圖示爲 Flat Icons

在 uBuntu/Mint/Fedora Linux 安裝好之後,就會自帶一套開源的跨平臺辦公室軟體 LibreOffice,以前各家 Linux 發行版都是預設 OpenOffice,在 2009 年 Oracle 合併 Sun 之後,因爲 Oracle 的態度和作爲,使得原先開發 OpenOffice 的人員另外成立 The Document Foundation  ,並在 Oracle 不同意捐出 OpeneOffice 名稱後,另外以 LibreOffice 名稱單獨發行。 LibreOffice 預設的 Icon 爲 Tango ,是屬於多彩且立體的風格(如下圖一),習慣線上使用 Google Doc 單色簡單的平面風格,也想替 LibreOffice Toolbar 換上 簡約的圖示風格。 LibreOffice 看來似乎有一個新的圖示集合( Flat Icon Set )符合我想要的條件,是基於 Gnome 的  Symbolic icons 發展而來的。 在 uBuntu 中的安裝方式是先安裝 LibreOffice Crystal icons 後,再下載 Flat icons 取代 Crystal 圖示。如下面步驟: 安裝 LibreOffice Crystal icons $ sudo apt-get install libreoffice-style-crystal 將圖示集下載至 /tmp 資料夾下 $ cd /tmp && wget https://github.com/hotice/myfiles/raw/master/images_flat.zip 複製並取代 Crystal 圖示集合 $ sudo cp images_flat.zip /usr/share/libreoffice/share/config/images_crystal.zip LibreOffice 中設定使用已交換的 Flat Icon Set,工具列 Tools -> Options -> LibreOffice ->> View -> Icon size and style,將選項裏的內容選至 Crystal 即可。 更換後的...

釋放 Linux 中的記憶體空間

Linux kernel 在版本 2.6.16 之後增加了 Drop Caches ( Drop Caches )的機制,在這之後的 kernel 版本能夠簡單地清出多餘的記憶體空間。只要利用簡單的指令以數字讀寫 /proc/sys/vm/drop_cache,或使用 sysctl 指令就可以達成釋放的目的。 即時查看目前使用記憶體的情形: # watch -n 1 free -m 不同的數值代表的意義: 1:釋放 pagecache,捨棄一般沒使用的 cache 2:釋放 dentries 和 inodes 所佔用的 cache memory 3:等同於1+2的效果,釋放 pagecache、dentries 和 inodes 可以使用下面方式指令來釋放記憶體: Command 1 # sysctl -w vm.drop_caches=3 Command 2 #  sync && echo 3 | sudo tee /proc/sys/vm/drop_caches 註:釋放前必須要先執行 sync 見資料寫入硬碟,避免錯誤發生

Linux 中將現有的專案加到 GitHub

按時備份自己的文件或 code 是一個好習慣,以前尚未進入資訊科學這個領域時,最常使用的備份方式大概就是 Copy & Paste + Rename (Ex: Test .txt -> Test_20130723.txt)。這個方法很簡單也很快速,但是,有些小小的問題,如 1. 時間久了檔案佔用會很大的空間,2. 不知道每一個複製的版本究竟修改了什麼,3. 協同合作的時候檔案覆蓋即一去不復返。 上述的問題讓我開始找尋其他的方案來管理程式碼,並且可以與其他人協同合作。幾年前,在 synology 的 NAS 上安裝 SVN Server,開始使用 subversion 做版本管控。SVN 的 Client-Server 架構,在個人使用上倒也還蠻順利,沒出過什麼亂子,直到發生沒有網路就沒有辦法版本更新的事情,才開始注意到分散式版本管控的好處。另外,在 OpenSource 的場合中也常常聽到討論使用 GitHub 作爲 Git Server 的專案,決定來接觸接觸。Git 有下面幾項優點: 便宜的 Branch:Git 對 branch 是對整個資料夾做快照(snapshot)的方式,追蹤的是檔案的內容,即使在不同的 branch 內也只會有一個實體,所以既省空間又比較有效率。 聰明的 commit:Git 是與 snapshot 作比對不是單純的使用 diff 來比較 commit 的檔案。 分散式管理:Git 本地端有自己的 repository,即使沒有連線的狀態下仍然可以 commit,有網路時再 push 到 server 上就好。 Repository 毀壞的風險低:分散式的架構在每一份 Client 都會有一份 repository,即使 Server 上的 repository 毀損還是可以由其他的 Client 端恢復。 在這篇文章中,不討論如何在自己的 Server 上架設 Git Server,會着重在 Linux 中如何把現有的專案加入 GitHub 上。有機會再和大家分享自己架設 Git Server 的經驗 :) 如果還沒安裝 git,在 uBuntu / Mint 中請輸入 $ sudo apt-get install git-core 在 fedora 中請輸入 $ sudo yum in...