2013年11月2日 星期六

致我們終將失去的...專案

鬥獸場

趕著週五下班享受週末前,在忠孝復興等捷運時,眼前的白髮蒼蒼母親,正與手邊一位貌似唸國小的聊天,不知為何,這讓我想起了「致青春」這部電影的宣傳語,但妙的是,我很直接的用『專案』代替了青春,不曉得是不是「小孩」讓我想到了產出?

熱血的學弟覺得最近的我太悲觀了,或許這正是三十歲的更年期?還是去了一趟義大利被『時間』給震撼住了 XD

聊聊三十歲的同濟在做什麼好了,漸漸看不到追求夢想的身影,看到的是如何計較手中的銅板,大概出社會後衝了幾年後,失敗了幾次後,看重的是每一次真正留在手上的是什麼。面對未來,大家不再講公司的夢想有多大,頂多上進的還能繼續追求卓越的技術。

這是一個很現實的問題,畢竟專案可能會消失,儘管錢會貶值卻仍存在啊!其次,對於股票的價值也不怎看重,並不是股票不在意,而是要談先把現金拉到水準,股票是多餘的那種。如果創業十間只有一間成功,那發的股票是不是要先乘個 10% 算個期望值呢 XD



這陣子讀了不少跟“時間”有關的文章影片,某個角度上,生活就是不斷地把時間換成世俗間最容易評估的價值:貨幣。若不認同公司走法時,要不就拿錢做事,要不換個環境吧!孟母三遷人人皆知,人定勝天在某個條件下不是不可能,但為何要折磨自己呢 XD 或許,更要傻傻地做,不要得太多資訊,以免亂了陣腳 XD

我想,三十歲、同濟、臺北,這三個東西混起後,特別刺鼻。某個角度來說,該想想自己在做什麼,到底想要怎樣的未來了!如果環境不能讓你持續進步,或許再過個三、五年就真的毫無競爭力了(如果人人都能寫程式???)。還有,對岸的環境越來越優渥了!!政府都還會打造免水電租金的辦公室供新創公司進駐(創業、創新 我在台北與成都),想著想著,是不是該放手一下啊?

想清楚自己想要的,不要人云亦云,正是三十歲需要好好思考的一件事。套句數學系同學說的話:「偉大的數學家,都是在四十歲前成名的」,好好珍惜時間吧。

2013年11月1日 星期五

使用 mutt 產生 message/rfc822 測資 @ Ubuntu 12.04

最近正在研究 email 格式,其中一個 content-type: message/rfc822 很神秘,好像很久沒看過了?甚至 2010 年 GMail 相關討論串 中,仍看得到抱怨 GMail 不處理 (現況經測試,GMail 都會將 message/rfc822 展開)

接著就是來產生 message/rfc822 了,這似乎比較常從 outlook 那邊看到,但懶得用outlook 產品,直接用 mutt 吧!

使用 mutt 時,可以設定 mime forward 機制後,接著每一封轉信都可以用 message/rfc822 格式寄出。

$ vim ~/.muttrc
set mime_forward=yes
set mime_forward_rest=yes


或是使用 mutt 時,按 : 去設定上述兩個值亦可。

一封寄給自己的信:

Return-Path: <changyy@vm>
X-Original-To: changyy@vm
Delivered-To: changyy@vm
Received: by vm (Postfix, from userid 1000)
        id 03701604E5; Sat, 26 Oct 2013 10:53:47 +0800 (CST)
Date: Sat, 26 Oct 2013 10:53:47 +0800
From: changyy <changyy@vm>
To: changyy <changyy@vm>
Subject: Test message/rfc822
Message-ID: <20131026025347.GA17760@vm>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
User-Agent: Mutt/1.5.21 (2010-09-15)
Status: RO
Content-Length: 9
Lines: 1

as title


把上述那封用 message/rfc822 轉寄給自己:

Return-Path: <changyy@vm>
X-Original-To: changyy@vm
Delivered-To: changyy@vm
Received: by vm (Postfix, from userid 1000)
        id B96A9604E5; Sat, 26 Oct 2013 10:54:13 +0800 (CST)
Date: Sat, 26 Oct 2013 10:54:13 +0800
From: changyy <changyy@vm>
To: changyy <changyy@vm>
Subject: [changyy@vm: Test message/rfc822]
Message-ID: <20131026025413.GB17760@vm>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="KsGdsel6WgEHnImy"
Content-Disposition: inline
User-Agent: Mutt/1.5.21 (2010-09-15)
Status: RO
Content-Length: 703
Lines: 29


--KsGdsel6WgEHnImy
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

forward test

--KsGdsel6WgEHnImy
Content-Type: message/rfc822
Content-Disposition: inline

Return-Path: <changyy@vm>
X-Original-To: changyy@vm
Delivered-To: changyy@vm
Received: by vm (Postfix, from userid 1000)
        id 03701604E5; Sat, 26 Oct 2013 10:53:47 +0800 (CST)
Date: Sat, 26 Oct 2013 10:53:47 +0800
From: changyy <changyy@vm>
To: changyy <changyy@vm>
Subject: Test message/rfc822
Message-ID: <20131026025347.GA17760@vm>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
User-Agent: Mutt/1.5.21 (2010-09-15)

as title

--KsGdsel6WgEHnImy--

2013年10月30日 星期三

[Linux] 監控記憶體使用量,以 python 為例 @ Ubuntu 12.04

監控方式就...去翻 /proc/pid/status 來看

粗略測試方式:
  • 寫一隻程式,最後一行跑 loop 讓程式不會結束,或是讀 io卡住也行
  • 用 ps 得知此程式 pid,接著翻 /proc/pid/status 出來
例如我想知道 python 記憶體使用上會不會 copy by reference 或 copy by reference,那就重複把某個 string data 設值給別人看看,最後用一個 loop 卡住,讓程式不會結束,接著就用 ps aux | grep 'test.py' 去找出來 PID ,再去 cat /proc/PID/status 出來。

test.py:

import time

data = open('tmp').read()
i = 1000
co = []
while i > 0 :
        #co.append(str(data)+"1")
        #co.append(str(data)+"")
        co.append(str(data))
        i -= 1
print "Done:", len(co)
while True:
        time.sleep(1)


連續動作:

$ ps aux | grep test.py | grep -v "grep\|vim" | awk '{system("cat /proc/"$2"/status");}' | grep -i "pid\|vm\|name"

當 co.append(str(data)) 跟 co.append(str(data)+"") 時,i 數值變大對記憶體增加不多:

Name:   python
Pid:    12180
PPid:   11910
TracerPid:      0
VmPeak:    32532 kB
VmSize:    32532 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:      5676 kB
VmRSS:      5676 kB
VmData:     2700 kB
VmStk:       136 kB
VmExe:      2496 kB
VmLib:      5240 kB
VmPTE:        72 kB
VmSwap:        0 kB


但 co.append(str(data)+" ") 時,i 數值變大對記憶體就開始噴了:

Name:   python
Pid:    12189
PPid:   11910
TracerPid:      0
VmPeak:   340532 kB
VmSize:   340532 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:    313496 kB
VmRSS:    313496 kB
VmData:   310700 kB
VmStk:       136 kB
VmExe:      2496 kB
VmLib:      5240 kB
VmPTE:       680 kB
VmSwap:        0 kB

2013年10月26日 星期六

[Linux] 研究 c-icap modules 與 Squid 相關設定 @ Ubuntu 12.04

前鎮子剛用 pyicap 完成簡單的 ICAP 實作,但 pyicap 還是有一點不順,所以就來試試 c-icap 吧!盡管在 wikipeida 上查閱了幾種 icap server 的實作,但不少已經說不繼續維護,然後就叫大家去看 c-icap 啦,再加上 c-icap 也可以在 apt-get 上方便取得,所以,就來摸摸 so 吧!(據說中國那邊還很盛行,ISP還是會幫忙把網頁加上自家廣告)

先聊一下 c-icap 的部分,它是一隻用 C 實作 ICAP server 的角色,而 Squid 本身就內建 ICAP client 的角色了。使用 c-icap 的理由,則是他提供模組的方式,將你想做的事寫成 module ,設定後可變成 c-icap 的一個 service ,僅需依照 c-icap 的框架實作必要的函式,可省去實作 ICAP 協定。

此篇記錄著重在如何實作 c-icap module ,而網路資料不多,最佳解就是看程式碼 :P

$ apt-get source c-icap libc-icap-mod-urlcheck

此過程會產生兩個目錄:c-icap-0.1.6 和 c-icap-modules-0.1.6,其中 c-icap-modules-0.1.6 環境可以專門拿來編 c-icap modules,但其實最簡單的 c-icap-module 是在 c-icap-0.1.6/services/echo/srv_echo.c,如其名,echo 這只是個範例,但註解非常豐富,看他就夠啦。

其中比較特別的,就是查看 c-icap-module 框架,請參考這段:

CI_DECLARE_MOD_DATA ci_service_module_t service =
{
"echo", /* mod_name, The module name */
"Echo demo service", /* mod_short_descr,  Module short description */
ICAP_RESPMOD | ICAP_REQMOD, /* mod_type, The service type is responce or request modification */
echo_init_service, /* mod_init_service. Service initialization */
NULL, /* post_init_service. Service initialization after c-icap configured. Not used here */                                            
echo_close_service, /* mod_close_service. Called when service shutdowns. */
echo_init_request_data, /* mod_init_request_data */
echo_release_request_data, /* mod_release_request_data */
echo_check_preview_handler, /* mod_check_preview_handler */
echo_end_of_data_handler, /* mod_end_of_data_handler */
echo_io, /* mod_service_io */
NULL,
NULL
};


各項簡介:
  • 此 c-icap module service 啓動與關閉:echo_init_service, echo_close_service
  • 當 request 進來:echo_init_request_data
  • 取得 request preview:echo_check_preview_handler
  • 當 request 處理中:echo_io
  • 當 request 處理完:echo_release_request_data

舉個例來說,如果要用 PCRE 去做處理,一開始要初始化 PCRE 的項目可以擺在 echo_init_service ,而釋放 PCRE 的資源可以擺在 echo_close_service,而每次處理 request 前需要初始化資源則擺在 echo_init_request_data,釋放在 echo_release_request_data。

至於更深的應用就要去 c-icap-modules-0.1.6/service 翻 clamav 和 url_check,這兩項都跟資安相關,前者是掃毒軟體,後者則是可以拿來過濾惡意網站。有興趣可以翻一輪,比較特別的是處理 request 進來的資料,有用到 ci_simple_file_* 和 ci_membuf_* 系列的函式庫,簡言之就是記憶體擺不下就放檔案,或是有些函式只支援掃檔,那就先擺在檔案去進行。這邊便就不多講了。

設定 c-icap:

$ sudo cp output/changyy.so /usr/lib/c_icap/
$ sudo vim /etc/c-icap/c-icap.conf
Service changyy changyy.so
$ sudo /etc/init.d/c-icap restart


設定 squid:

icap_enable on
icap_send_client_ip on
icap_send_client_username on
icap_client_username_encode off
icap_client_username_header X-Authenticated-User
icap_preview_enable on
icap_preview_size 1024

icap_service service_req reqmod_precache bypass=1 icap://localhost:1344/changyy
adaptation_access service_req allow all
icap_service service_resp respmod_precache bypass=1 icap://localhost:1344/changyy
adaptation_access service_resp allow all


其中 icap://localhost:1344/changyy 在此的意義就是 c-icap 中的 Service changyy 啦,最後一提的是 c-icap.conf 有 DebugLevel ,這個數字攸關 debug 訊息,在 c-icap-modules 中許多實作都會用 ci_debug_printf 來印訊息,其中第一個數字若小於等於 DebugLevel 才會被印出來。而輸出的 log 可以在 /var/log/c-icap/server.log 查到。

2013年10月24日 星期四

[OSX] 製作 Mac OS X Mavericks USB 安裝碟 @ Mac 10.9

既然 Mac OS X Mavericks 已經大方到變成免費了!那製作 USB 安裝碟也是必要的技能啊

首先,在先從 App Store 下載 OS X Mavericks 安裝程式,下載完時,先不要去安裝他,可以用以下指令製作 USB 安裝碟,此處假設隨身碟是在 /Volumns/8GB:

$ sudo /Applications/Install\ OS\ X\ Mavericks.app/Contents/Resources/createinstallmedia --volume /Volumes/8GB --applicationpath /Applications/Install\ OS\ X\ Mavericks.app --nointeraction

如此一來就完成啦。