2013年11月29日 星期五

iOS 開發筆記 - 重溫 iOS app development


Developing iOS 7 Apps for iPhone and iPad
by Stanford

這星期一口氣連追了 12 堂課,把史丹佛 CS193P 2013 Fall 目前放出來的課程看完了 XD 距離我上一次看它可能是 2011 年,而我第一次看則是 2010 年的春天。說真的,老外上課有豐富的肢體語言,所以不必真的聽懂每一個字,看看投影片、程式碼就真的都學得會啦。

過去從 iOS 3.1 開始接觸 iPhone app development ,跟幾個同好討論怎樣把 UI 搞的炫炫的等等,當時 iOS 3 的特色大概是提出 In-App purchases,接著有幸還追到 iOS 4,帶出了 Background Tasks 跟 Objective C blocks 的概念,之後,我漸漸落伍了,如 iOS 5 提出 Storyboard 、iOS 6 帶入 iCloud 到現在的 iOS 7 等,基本上都沒有正式用過。

最近看了 CS193P 後,才真的理解 Storyboard 跟 Core Data 的好用之處,的確,沒有他們一樣可以做完事,但我相信,再過個一兩年,可能就完全跟不上潮流了

此外,想起前陣子跟新學 iOS 的聊天,被問起到底會什麼,說真的這種問題不是很好 Orz 不是不願意回答,而是答出來跟沒答出來的價值差不了多少。舉個例來說, C 跟 C99 的語法差在哪邊,知道或不知道都不會很大地影響一位工程師,同理 iOS 一直在更新,工作這種事,碰到在學就對了。至於 C 跟 C99 差別嘛,只要記得會用 Google 去查一下就好 XD

經過這次的複習,深深覺得資訊界的技術真的很難撐過兩年 XD 其中的心酸豈可不是 out of date 幾個字可道盡的。

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--