2013年12月3日 星期二

iOS 開發筆記 - 解決 Storyboard UITableViewCell contentView 第一次設定 subViews frame 失效問題

為了讓自己趕快習慣 Storyboard 開發模式,瘋狂地用 Storyboard 做事 XD 除了降低原本的開發速度外,接著碰到一些好像是 bug 的奇妙問題?

這個問題是在 Storyboard 內已經拉好一個 UITableViewController ,接著在裡頭增加 UITableViewCell 後,再上頭加多個 ImageView 把玩,然而,希望 device rotation 後能後平均地顯示在 UITableViewCell 裡頭,例如有五個 ImageView 可以平均地分布。

此時在 (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 已經完成重新計算各個 ImageView 的 frame 座標。

由於 Storyboard 是以 Portrait 模式設計,因此裝置一開始從 Portrait 轉換到 Landscape 時,一切都正常顯示。但如果裝置一開始就是在 Landscape 模式時,反而那些 ImageView 卻還是依照 Storyboard 裡的 Portrait 模式設計,無論我把他們的 frame 座標更新也無用。(但經過 device rotation 後,會顯示正常)

不曉得這是不是 bug ?總之,最後就想到一招就是第一次強制 ImageView 重新歸位 XD 希望這招之後可以拿掉。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
        // ...

        if( cell.tag == 0 )
        {
                cell.tag = 1;
                for (UIView *v in [cell.contentView subviews])
                {
                        [v removeFromSuperview];
                        [cell.contentView addSubview:v];
                }
        }
        return cell;
}

iOS 開發筆記 - iOS app 狀態為 Pending Contract 的處理

通常看到這樣的問題,都是忘了填寫銀行等資訊,不過,若發生在免費的 iOS app 時,這時就請打電話給客服聊聊天吧(Worldwide Telephone Support,台灣打 0800-022-237 )

此例是登入 iTunesConnect 後,上頭一直顯示 program membership expired 訊息,但明明我幾個月前已經 renew 過了 :P 同理切換到 Contracts, Tax, Banking 裡頭,也叫我去 re-new 開發者帳號...打電話問客服...報一下 Apple ID (Email address) 後,得知是當初 re-new 時少完成一個流程(可能是少了某表單的同意,但現況又看不到表單),導致在 iOS Developer Center 是 OK ,但在 iTunesConnect 是不 OK 的現象,解法就是聊個天就解掉了...

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