2014年9月28日 星期日

iOS 開發筆記 - iPhone Simulator Document Path

開發 iOS app 時,若有資料儲存時,常常會想直接去翻 iPhone Simulator 的真實儲存位置,久了就記住位置:

$ ls ~/Library/Application\ Support/iPhone\ Simulator/7.1/Applications/

最近改用 iOS 8 時,卻找不到 8.0 位置 XD 直到在 App 中印出位置才得知換了,粗略位置:

$ ls ~/Library/Developer/CoreSimulator/Devices/########-####-####-####-###########/data/Containers/Data/Application/

2014年9月22日 星期一

[OSX] 找尋 ISO 639 和 ISO 3166 定義的 language list @ Mac OS X 10.9.5

想說翻一下 wiki 又有點 ooxx... 偷問一下高手,高手非常直觀地跟我說,用一下 /usr/share/locale !

由於我是用 Mac OS X ,該產品語言已經做得很不錯了!果真的輕輕鬆鬆找出我要的東西:

$ ls /usr/share/locale | grep -v "\\." | grep "_"
af_ZA
am_ET
be_BY
bg_BG
ca_ES
cs_CZ
da_DK
de_AT
de_CH
de_DE
el_GR
en_AU
en_CA
en_GB
en_IE
en_NZ
en_US
es_ES
et_EE
eu_ES
fi_FI
fr_BE
fr_CA
fr_CH
fr_FR
he_IL
hr_HR
hu_HU
hy_AM
is_IS
it_CH
it_IT
ja_JP
kk_KZ
ko_KR
lt_LT
nl_BE
nl_NL
no_NO
pl_PL
pt_BR
pt_PT
ro_RO
ru_RU
sk_SK
sl_SI
sr_YU
sv_SE
tr_TR
uk_UA
zh_CN
zh_HK
zh_TW


高手獻技:

$ cd /usr/share/locale && echo ??_??
af_ZA am_ET be_BY bg_BG ca_ES cs_CZ da_DK de_AT de_CH de_DE el_GR en_AU en_CA en_GB en_IE en_NZ en_US es_ES et_EE eu_ES fi_FI fr_BE fr_CA fr_CH fr_FR he_IL hr_HR hu_HU hy_AM is_IS it_CH it_IT ja_JP kk_KZ ko_KR lt_LT nl_BE nl_NL no_NO pl_PL pt_BR pt_PT ro_RO ru_RU sk_SK sl_SI sr_YU sv_SE tr_TR uk_UA zh_CN zh_HK zh_TW


後來又找到對應表: http://www.localeplanet.com/icu/

<?php
// http://www.localeplanet.com/icu/
$lang_map = array(
        'af_ZA' => 'Afrikaans (Suid-Afrika)',
        'am_ET' => 'አማርኛ (ኢትዮጵያ)' ,
        'be_BY' => 'беларуская (Беларусь)' ,
        'bg_BG' => 'български (България)',
        'ca_ES' => 'català (Espanya)',
        'cs_CZ' => 'čeština (Česká republika)',
        'da_DK' => 'dansk (Danmark)',
        'de_AT' => 'Deutsch (Österreich)',
        'de_CH' => 'Deutsch (Schweiz)',
        'de_DE' => 'Deutsch (Deutschland)',
        'el_GR' => 'Ελληνικά (Ελλάδα)',
        'en_AU' => 'English (Australia)',
        'en_CA' => 'English (Canada)',
        'en_GB' => 'English (United Kingdom)',
        'en_IE' => 'English (Ireland)',
        'en_NZ' => 'English (New Zealand)',
        'en_US' => 'English (United States)',
        'es_ES' => 'español (España)',
        'et_EE' => 'eesti (Eesti)' ,
        'eu_ES' => 'euskara (Espainia)',
        'fi_FI' => 'suomi (Suomi)',
        'fr_BE' => 'français (Belgique)',
        'fr_CA' => 'français (Canada)',
        'fr_CH' => 'français (Suisse)',
        'fr_FR' => 'français (France)',
        'he_IL' => 'עברית (ישראל)',
        'hr_HR' => 'hrvatski (Hrvatska)',
        'hu_HU' => 'magyar (Magyarország)',
        'hy_AM' => 'Հայերէն (Հայաստանի Հանրապետութիւն)',
        'is_IS' => 'íslenska (Ísland)',
        'it_CH' => 'italiano (Svizzera)' ,
        'it_IT' => 'italiano (Italia)',
        'ja_JP' => '日本語(日本)',
        'kk_KZ' => 'kk_KZ',
        'ko_KR' => '한국어(대한민국)',
        'lt_LT' => 'lietuvių (Lietuva)',
        'nl_BE' => 'Nederlands (België)',
        'nl_NL' => 'Nederlands (Nederland)',
        'no_NO' => 'no_NO',
        'pl_PL' => 'polski (Polska)',
        'pt_BR' => 'português (Brasil)',
        'pt_PT' => 'português (Portugal)',
        'ro_RO' => 'română (România)',
        'ru_RU' => 'русский (Россия)',
        'sk_SK' => 'slovenčina (Slovenská republika)',
        'sl_SI' => 'slovenščina (Slovenija)',
        'sr_YU' => 'sr_YU',
        'sv_SE' => 'svenska (Sverige)',
        'tr_TR' => 'Türkçe (Türkiye)',
        'uk_UA' => 'українська (Україна)',
        'zh_CN' => '中文(简体中文、中国)',
        'zh_HK' => '中文(繁體中文,中華人民共和國香港特別行政區)',
        'zh_TW' => '中文(繁體中文,台灣)'
);

2014年9月19日 星期五

[OSX] 使用 App Store 更新 Xcode 發生錯誤 @ Mac OS X 10.9.5, MBA


主因也有可能是空間太少了 :P
除了準備空間外,可以試看看 App Store Debug 界面:

$ defaults write com.apple.appstore ShowDebugMenu -bool true

接著重新打開 App Store 後,上方最右邊有 Debug 選項 -> Reset Application,大概多做幾次即可。如果很不幸的一直不幸,最終解法就是反安裝後,再下載。

2014年9月18日 星期四

iOS 開發筆記 - 驗證 Apple Push Notification PEM File 以及 Remove PEM Password

半年前曾開發過: 使用 Apple Push Notification service (APNs),最近更新 PEM  後,要驗證一下 PEM 是否正確。

驗證還滿簡單的,單純用 openssl 進行,假設是 dev 模式,對象就是 snadbox:

$ openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert cert.pem -key key.pem

其中 cert.pem 跟 key.pem 也可以合在一起:

$ cat cert.pem key.pem > out.pem
$ openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert out.pem


假設產出的 key.pem 有密碼保護,為了圖方便想要去密碼的話,可以用:

$ openssl rsa -in key.pem -out nopass.pem

如此一來就搞定了,若測試的是 Production PEM ,記得改用 gateway.push.apple.com:2195 即可。

$ openssl s_client -connect gateway.push.apple.com:2195 -cert cert.pem -key key.pem

2014年9月12日 星期五

[Python] 使用 Apache Web Server Access.log 把玩 CartoDB 視覺化地圖 @ Ubuntu 12.04



只要資料有 Geolocation,就能夠把玩 CartoDB 了 :P 若可以的話,再加上時間就更完美了。因此,最容易拿到的測資是 Apache web server log,把 access.log 挑點東西出來即可,至於 Geolocation 就用 ip 反查吧!

從 access.log 取出 ip list:

$ grep -v "^localhost\|::1" /var/log/apache2/access.log | awk '{print $1}' | uniq

首先,先到 Maxmind 下載最新的 GeoLite2-City 資訊:

$ wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz
$ gunzip GeoLite2-City.mmdb.gz


安裝 geoip-bin 工具:

$ sudo apt-get install geoip-bin
$ geoiplookup 8.8.8.8
GeoIP Country Edition: US, United States

$ geoiplookup -f GeoLite2-City.mmdb 8.8.8.8
Error Traversing Database for ipnum = 134744072 - Perhaps database is corrupt?
Segmentation fault (core dumped)


囧...只好裝一下新版 maxmind python sdk 寫一段小 code:

$ sudo pip install geoip2

$ vim t.py
mport sys
import geoip2.database
reader = geoip2.database.Reader('GeoLite2-City.mmdb')
try:
        response = reader.city(sys.argv[1])
        print str(response.location.latitude)+","+str(response.location.longitude)
except Exception, e:
        pass
$ python t.py 8.8.8.8
37.386,-122.0838


接著,就乾脆寫 python 來處理 access.log 吧 XDD 用 command line 好像太冗長了。

$ sudo cp /var/log/apache2/access.log /tmp/access.log
$ sudo chmod 644 /tmp/access.log
$ vim log.py
import geoip2.database
reader = geoip2.database.Reader('GeoLite2-City.mmdb')
try:
        log = open('/tmp/access.log','rb').read()
        for rec in log.split('\n'):
                fields = rec.split(' ')
                try:
                        if fields[0] == 'localhost' or fields[0] == '::1' :
                                continue
                        response = reader.city(fields[0])
                        print fields[3][1:]+","+str(response.location.latitude)+","+str(response.location.longitude)
                except Exception, e:
                        pass
except Exception, e:
        pass

$ python log.py > log.csv
$ cat log.csv
...
07/Sep/2014:22:12:43,35.685,139.7514
07/Sep/2014:22:13:53,39.4899,-74.4773
...


對於時間格式不用擔心,直接丟進 cartodb.com 請他幫你處理!




匯入後,預設都是 string,可以把 field1 設成 date type,field2 跟 field3 都設成 number type,弄完順便 rename 一下,接著再點選 geo 欄位,可以採用 field2 跟 field3 來生成,如此就完成 CartoDB  table 製作。








最後再去視覺化那邊,挑一下以 date 為基準的時間變化,就可以有不錯的視覺圖表。