2013年11月27日 星期三

人生中第二隻智慧手機 - 小米2s

小米2s 盒裝

扣除開發機外,第一支擁有的智慧手機是 Nexus S ,於 2011 年底買的,不幸地,它上週五離我而去。正當我思考要買哪隻手機時,iPhone 的確有引誘到我,但實在太貴了 XD 最後還是落入 CP 值的計算,窮嘛,至少要學會斤斤計較嘛。

過去 Google 原生機很誘人,可惜的是 LG Nexus 4 在台灣不怎盛行,連現在出到 LG Nexus 5 了,Google 的前兩代的 Galaxy Nexus 外頭空機還是要價一萬二起跳,所以,就直接買小米2s了,並且直接在官網買(台灣某門市賣的價錢跟官網一樣,但規格矮一階!),不等(買)紅米的主因是 4.7 吋對於一個不愛帶包包的人而言太大了點 :P

另外,不小心手滑了多買兩個配件(殼x1, 保護套x1) XD

小米2s & 添購配件

看到小米機的包裝,好精緻啊...連開箱都想多拍幾張,總之,這算是近期可以開心的事吧?十一月真是折磨人!

@ 2013/11/28:
看來衰運未過,拿到傳說會"自動關機"的小米2s XDD 馬上去維修報修,順利又換一台,這次終於不會自動關機了。 
自動關機的現象: 
  • 手機螢幕關掉 & 有 wifi 連線時,收到 Line, Skype, Facebook 甚至別人打電話進進來時,手機呼吸燈會亮,但不久後就關機或是準備按 power 鍵顯示時就關機
  • 玩遊戲的過程中會直接關機,開機時顯示電池只剩 1% 等奇異現象。
 解法:換一台即可!

2013年11月7日 星期四

[Python] Bottle + Nginx + uWSGI @ Ubuntu 12.04

環境:

$ sudo apt-get install python-bottle nginx uwsgi uwsgi-plugin-python

Python Bottle 範例 (/var/www/bottle_app):

$ vim /var/www/bottle_app/app.py
from bottle import Bottle, route, run, install, template, static_file
#from bottle_sqlite import SQLitePlugin

#import bottle
#application = bottle.default_app()

app = application = Bottle()
#app.install(SQLitePlugin(dbfile='/tmp/test.db'))

@app.route('/')
def index():
        return template('Hello world')

if __name__ == '__main__':
        run(app, host='0.0.0.0', port=1234)


設定 uWSGI:

$ sudo vim /etc/uwsgi/apps-available/bottle_app.ini
[uwsgi]
socket = /run/uwsgi/app/bottle_app/socket
chdir = /var/www/bottle_app
master = true
plugins = python
file = app.py
uid = www-data
gid = www-data
$ sudo ln -s /etc/uwsgi/apps-available/bottle_app.ini /etc/uwsgi/apps-enabled/bottle_app.ini
$ sudo service uwsgi restart


設定 nginx:

$ sudo vim /etc/nginx/sites-available/bottle_app
upstream _bottle {
server unix:/run/uwsgi/app/bottle_app/socket;
}

server {
listen 8080;
root /var/www/bottle_app;

location / {
try_files $uri @uwsgi;
}

location @uwsgi {
include uwsgi_params;
uwsgi_pass _bottle;
}
}

$ sudo ln -s /etc/nginx/sites-available/bottle_app /etc/nginx/sites-enabled/bottle_app
$ sudo service nginx restart


其他部分,對於 /var/www/bottle_app/app.py 留意 application 變數是 uwsgi 尋找的對象,若想要改變可以在 uwsgi 定義 callable (預設 callable = application)。

至於使用 bottle 開發上麻煩的地方是 templates(views) 更新後,必須重新啟動才能生效,就算改用 uwsgi 也沒有改善,不知是不是少設定甚麼,或是預設規劃就是如此?

除此之外,若不用那麼著重效率,還可以替換掉 Bottle 預設的 wsgiref WSGIServer (non-threading HTTP server),而且改法很簡單(switching-the-server-backend):

$ sudo apt-get install python-paste
$ vim app.py
...
if __name__ == '__main__':
import paste
run(
app ,
host='0.0.0.0',
port=1234,
server='paste'
)

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