發表文章

目前顯示的是有「小程式」標籤的文章

Change font in web pages

圖片
參加過三次Google I/O, 但都沒有去過它的codelab, 現在回頭看一下他的教材, 還真是好物... 一個是用appengine把pipeline, log, google storage, big query, bootstrap, channel api全部串起來, 做一個log分析程式. 那個很有趣, 之後再另外寫心得. 另外一個是教CSS,  http://io12-css-codelab.appspot.com/lessons/index.html . 也不是頂難的東西, 但是一步一步這樣教, 好有FU喔. 其中換字型原來這麼簡單. 1. 去 http://www.google.com/webfonts/ 挑字型. 它已經有很多工具可以讓你看不同大小的字型, 或是該字型當標題或內文時的感覺. 2. 選定後可以按該字型下面的Quick-use, 它還會跟你說因為用了這個字型, 造成網頁loading overhead的高低. 如果是綠色的應該影響就很小吧... 3. 再往下面看有兩個簡單的code要copy & paste. 只要把 <link href='http://fonts.googleapis.com/css?family=Quando' rel='stylesheet' type='text/css'> 放在html的header裡. 然後就可以在後續的css style裡用font-family: 'Quando', serif;來指定該字型囉... 真是想不到的簡單.

Unix scripts (sed & bash for)

圖片
今天工作上有個小任務, 一個目錄裡有47張圖, 巧合的是他們只有兩種解析度, 分別是480x84及480x720. 需要把它們分別放到兩個目錄裡. 大概記錄一下怎麼做的, 不然永遠記不得... 用file取得檔案的解析度, 先不要480x84的. file *.png | grep -v "x 84" | sed 's/\(.*\):.*/\1/' > list 再在bash cmdline寫一行的script for i in `cat list`; do `mv $i 720`; done 再把剩下的搬去84目錄下. mv *.png 84 收工

How to use FTP over TLS?

Filezilla Site Manager->New Site->Encryption->Require explicit FTP over TLS. lftp lftp id@ip set ftp:ssl-protect-data true get filename

Send SMS

圖片
現在是個手機門號比人頭還多的年代. 簡訊幾乎是每個人都有"能力"收的一個媒介. 如果service有狀況, 用簡訊通知是最有效的! 之前在survey transcribe service時, 找到了一個叫 twilio 的網站. 它提供的服務可多了, 可以用程式打電話給使用者(1), 然後再唸一段文字給使用者聽(2), 可以錄下使用者的回話(3), 還可以把使用者的回話轉譯成文字(4). 手機的部份則可以送簡訊(5), 還可以收使用者送來的簡訊(6)當做request, 再另外做對應的事. 可以很簡單地把程式跟電話整合在一起. 價錢看起來不太貴(打電話一分鐘2 cents, 接電話一分鐘1 cent, 每送一個SMS 1cent). 我倒也沒比較過類似服務收費就是了... 註冊的方式很簡單, 只要在它的首頁上點 Try Twilio Free , 填上基本資料就可以使用他們的API了, 還有附送30 USD的credit可供試用. 之後它還會試著吸引你upgrade成正式用戶, 比如說再另外送25 USD的credit. 主要是要吸引你提供信用卡資料就是了... 之前帳號申請就放在那裡, 忘了! 今天剛好有一個場合可以試這個API. 主要是用crontab持續的去偵測目前server的狀況. 如果有需要注意的時候, 它會即時送SMS將當時的狀況送給能夠處理的人, 免得問題擴大. 它有提供各種不同語言的API, 最近都在用python, 所以就用它的python來達成目的. 真是無敵簡單的. 1. 安裝 在ubuntu上只要打sudo apt-get install pip, sudo pip install twilio, 基本上就將必需的python package裝好了. 2. 使用 在coding之前, 有兩個資訊是需要知道的, account id與token. 這兩個值可以在login後的dashboard上看到. 用了它,  twilio  才知道要跟誰收錢. 可以把這兩個值直接寫在程式碼裡, 或者是存成TWILIO_ACCOUND_SID與TWILIO_AUTH_TOKEN這兩個環境變數. 官方文件是建議存成環境變數, 這樣就不用擔心程式碼放到source...

Entity group

慢慢對 App engine 的 data model 有感覺了, 之前還習慣用SQL的時候, 總覺得要抓什麼都得用query, 所以在 App engine 裡也不自覺地動不動就用下面這三種方法來抓data, 即使只要抓一筆資料回來.

用cron來觸發mapreduce job

GAE + mapreduce雖然好用, 但是老要用它那個簡單的介面來觸發一個job. 不能自動化的每天自動起來做些統計的事, 感覺挺蠢的. 一直在找要怎麼加, 才能在cron.yaml裡觸發. 終於被我試出來了. 首先, 先指定一個url給特定的handler. 最簡單就是在app.yaml把所有link都導到main.py. app.yaml - url: .*   script: main.py 然後在main.py裡加一段 def main():     application = webapp.WSGIApplication(...         ('/tasks/summary', SummaryHandler)],         debug=True)     util.run_wsgi_app(application) 重點就是這個SummaryHandler. class SummaryHandler(webapp.RequestHandler):     def get(self):         name = 'count'         handler_spec = 'main.process'         reader_spec = 'mapreduce.input_readers.DatastoreInputReader'         reader_parameters = {'entity_kind': 'main.Client'}         start_map(name, handler_spec, reader_spec, reader_parameters) 當然啦, 前面要from mapreduce.con...

一定要自己踢過一次鐵板才能學會 (二)

圖片
經過一夜的蒐集資料, 看了 Google I/O 的影片, 覺得用 MapReduce 就是正解啦. 用法很簡單 Step 1 Download最新的 MapReduce , 在local自己的appengine程式的地方執行. svn checkout http : //appengine-mapreduce.googlecode.com/svn/trunk/python/src/mapreduce Step 2 修改app.yaml, 固定都是加上下列這段code. - url: /mapreduce(/.*)? script: mapreduce/main.py login: admin Step 3 新增一個mapreduce.yaml檔 mapreduce: - name: Count the number of entities mapper: input_reader: mapreduce.input_readers.DatastoreInputReader handler: jobs.process params: - name: entity_kind default: main.Report 第一個name, 就是之後會顯示在mapreduce的網頁介面上的job name. input_reader, 目前有四種reader可以選, 詳情可見 這裡 . 主要是從DataStore裡抓, 或是從BlobStore裡抓, 或是從zip檔裡抓資料. handler, 指定之後會被MapReduce call的function. 這裡有點tricky, 文件寫得不是很清楚, 查了MapReduce的source才知道要填什麼. 簡單的說它可以吃三四種格式, 會試著用不同的方法去找到對應的python檔, class定義跟function定義. 最簡單的方法就是"file.function". 像這裡就是有一個叫jobs.py的檔, 裡面有一個process(). 之後MapReduce就會一直重覆地呼叫這個function. param, 這裡可以指定一些參數, 最重要的是entity_kind這個欄位, 這裡指定了預設值是main.py裡定義的R...

App Engine心得

現在試著用 App Engine + Closure Library 寫一個小程式 (暫時放棄 django 了, 花了一段時間比較到底用 helper 好還是用 patch 好. 兩邊都有擁護者. 等我熟一點後再來自已判斷吧) 所以又到記流水帳的時候了,把一些我在寫的過程中搞不清楚, 要查資料的點記錄下來, 希望之後可以查資料的頻率低一點.

App engine

一直對App engine有興趣, 也寫了一些小小不成樣的程式自己玩. 在Google I/O的時候Google說他們內部用的 CloudCourse open source了! 就想花點時間來看看別人怎麼用Appengine來寫程式. 在 CloudCourse 網站上把它的source code抓回來, 發現裡面用了 app-engine-patch 這個東西, 讓 django 可以用appengine的database. 再把這個 app-engine-patch 抓回來玩玩, CloudCourse 是用1.1版的, 再到它的網站上去看看它的文件. 才又發現它已經停止support了, 要大家改用 Django-nonrel 這個project. 另外, CloudCourse 還用到了 Closure Library . 唉, 真是學海無涯呀...

vim的search

原來我錯的離譜! 在用vi的經驗中, 經常會覺得很奇怪, search有時按n會是往上跳, 有時是往下跳. 今天終於真相大白了, 原來一切都是我一廂情願. 我在vi裡經常是用#這個鍵來search同一份文件裡目前focus到的這個字. 我預期它的結果跟我在command mode下按/, 再打那個字一樣. 就在剛才想要追根究柢一下, 原來#這個鍵本來就是往上查目前focus的字, 而*才是往下查. 我用了這麼多年vi, 一直把它用錯了!

awk

每次寫script用到sed跟awk都要再查半天用法, 這裡當作筆記吧. awk ex. grep ^version: app.yaml | awk {'print $2'}   從app.yaml裡找出version那一行, 印出第二欄的內容. awk麻煩的地方是command要用'包起來. 永遠都記不住...

VIM in MacOS

在MacOS裡的VIM是沒有syntax highlight的, 拿它來看python的code總是一片黑白. 只要加一小段設定在/usr/share/vim/vimrc就好了. set ai " auto indenting set history=100 " keep 100 lines of history set ruler " show the cursor position syntax on " syntax highlighting set hlsearch " highlight the last searched term filetype plugin on " use the file type plugins

我第一個Android程式上架了...

上星期逛到一個網站, aNobii , 好像已經出現很久了, 我現在才發現. 它是個藏書網站, 我一發現就愛不釋手, 想把自己所有的書都放上去. 無奈它加書的方式, 是要把ISBN打進去. 一個ISBN有10或13碼兩種, 無論哪種, 我都打很慢. 看著書櫃上的書, 似乎要把它全部打上去要很久. 然後我就想到Android上不是有個Barcode Scanner的程式嗎? 它可以把各種條碼的值掃出來. 那我最近又在玩Android, 何不寫個程式, 用手機先把條碼一個一個掃出來, 存在database裡, 掃完後再一次用GMail寄出來. 然後再到PC上用browser copy & paste, 把書加進去呢? 於是乎就在前兩天, 我的第一個Android程式 aNobii Scanner 在Android Market上架了. 目前已經有兩百多個人在用它了, 評價3.3顆星... :p PS. 之所以要用GMail這種迂迴的方式, 實在是因為aNobii這個網站本身提供的API, 只能讓外面的程式來Query, 而不能由外面來塞書的ISBN號碼進來. 所以只要分成兩段, 前半段手機處理, 後半段還是要用手工去Copy & Paste. 不過還好的是aNobii有提供multiple add的功能, 所以copy & paste只要做一次就好. 還算不是太麻煩.

在Seminar時錄音...

圖片
在Seminar的時候做筆記是十分重要的, 不過我的字很醜, 寫字又不快. 自己寫的筆記幾乎是沒有回去再看過. 看到吉米丘說聽演講可以用相機跟錄音筆做記錄, 我就建立一套方法吧. Audacity , 它不只是個錄音程式喔, 它是個相當專業的Sound Editor. 不過在這裡只拿來當錄音程式用. 等我摸熟它, 看它怎麼把錄音後的結果調得更好一點再另文說明. 但是用它來錄音是非常簡單的, 畫面上有一個很大的紅色圓型按鈕, 按下去就對了. 存檔格式: Speex 很多人直接就會覺得聲音就是要存成MP3或是WMA. 當然它們各有技術上的特點, 有音質或壓縮比的差異, 不過最重要的它通常是要license的. 所以我們就存成license free的speex格式吧. 它是一個專門給語音用的codec. 所以在同樣bitrate跟檔案大小的情況下, 效果應該是會比MP3, WMA這些general的codec來的好一點. 先用Audacity把錄好的聲音存成WAV檔, 然後用在 這裡 抓到的小程式, 裡面的speexenc把它轉成spx檔. speexenc input.wav output.spx 這樣就好啦! 檔案大小應該是在1/10以下. 在Windows下要裝 Ogg Directshow Filters . 之後就可以用Media Player來聽了.

免錢的XML Notepad 2007

圖片
平常不太有機會去讀/寫XML檔, 但是偶爾要用到的時候, 光用IE去看, 用Ultra Edit去改, 實在不是那麼就手. 光看那一堆tag跟因為完美主義總想要去把那些對不齊的indentation排好, 就很痛苦. 在鳥窩上看到有人推薦 XML Notepad 這個免費的東西. 它呢, 是MS出品的. 而且是個歷史悠久的程式, 從 1998年 起就有了. 初步用起來感覺功能還算齊全. 以後不用搞個XML SPY這種大部頭程式來用.

久違了, PCMAN...

我最喜歡用的Telnet client, PCMAN , 終於出新版了... 而且還是Open Source的喔! 雖然我不知道Telnet client還能有什麼新功能, 不過我總是喜歡新版的東西. 大家上吧!

TeraCopy

在鳥窩上看到有人推薦這個小軟體, 因為它加了一個buffer在copy的動作中, 大幅降低了DISK IO的次數, 試用了幾次似乎速度真的有變快, 謹此為記... TeraCopy

怎麼在兩台linux server間用scp而不需打密碼?

最近在弄一個可以daily build的系統, 希望可以每天一來就看到編好的東西, 然後測試... 這個daily build的script大致已經寫好, 主要的動作就是從SVN上checkout一份最新的code, 然後開始去一個一個package的目錄裡build, 再把所有編出來需要的東西, copy到某特定目錄, 最後用tar把它包起來, 取名為像20070315-1940.tgz這樣子的檔名. 丟到某個目錄去. 等我明天一早來看. 這樣子的缺點是我是在我自己的linux上build的, 希望能夠把我build的東西, 上傳到大家用的server上. 用samba或是為它寫個expact script都是個辦法. 不過好像總沒有比直接cp來得方便. 那麼, 就用scp來copy吧, 唯一的缺點就是要打密碼. 小小的研究了一下, 相當的容易, 方法如下. 1. 在自己的linux上打ssh-keygen, 然後接下來的問題都直接按enter跳過. 2. 上一步應該會在~/.ssh/裡產生幾個檔, 把其中id_rsa.pub copy到對方的~/.ssh/, 並改名為authorized_keys (如果已經存在了, 就append到它後面吧) 3. 完成 這樣就可以直接在script裡, scp xxx.tgz 192.168.1.xxx:/var/www/html/dailybuild/ 把編出來的東西送上server去囉...

Mess with MSN Messenger

好用的小東西

鍵盤按鍵指派程式

IBM的Thinkpad, 之前都很死硬的不加上Windows key, 然後又很多事的在方向鍵的上面加了兩個莫名其妙的"上一頁", "下一頁"兩個鍵. 所以囉, 山不轉路轉, 把右邊極少用到的alt鍵換成Windows鍵, 然後把上一頁換成PgUp, 下一頁換成PgDn... 用的tool是title那個link來的...