如何在 Runtime 移除 Objective-C instance method
https://gist.github.com/zonble/6374245
不知道什麼時候會用到就是了。
One Nice Bug Per Day
Alisa U Zemlji Chuda
h
dirt enthusiast
Jules of Nature
TVSTRANGERTHINGS


Janaina Medeiros
NASA

⁂

Discoholic 🪩

oozey mess
let's talk about Bridgerton tea, my ask is open
🪼
PUT YOUR BEARD IN MY MOUTH

shark vs the universe
RMH
d e v o n

@theartofmadeline

Andulka
seen from United States
seen from United States

seen from United Kingdom
seen from Canada
seen from Japan

seen from Malaysia

seen from Germany
seen from United States

seen from Philippines

seen from United Kingdom
seen from United States
seen from United States
seen from Malaysia
seen from United States
seen from United States
seen from United States

seen from United Kingdom
seen from United States

seen from Malaysia

seen from United States
@kkdevs
如何在 Runtime 移除 Objective-C instance method
https://gist.github.com/zonble/6374245
不知道什麼時候會用到就是了。

Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
Free to watch • No registration required • HD streaming
2013 年 8 月 15 日,台北 Cocoaheads
Jenkins 的 cron job 設定
Willy: 最新版Jenkins 的 job 的 cron 可以設定成 H * * * * * ,把所有 job 都這樣設,就會自動錯開 job 執行時間,還蠻方便的〜
在程式裡頭方便寫註解的 Xcode plug-in。
如果你在跑 OCUnit 的時候遇到有些 test case 莫名其妙就是一直過不了
willy: 剛剛發現,如果 test case 的 log 太長,會被 Xcode 當成 failed XD
zonble: @_@
zonble: 啥啊
willy: 把 log 剪短就好了 XD

Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
Free to watch • No registration required • HD streaming
快速建立與刪除 Facebook 測試帳號,Ruby 版本
跟前一篇文章裡頭提到的程式功能一模一樣,不過這個是用 Ruby 寫的。
用的是 Ruby 1.8.7,需要另外用 gem 安裝 json library。
https://gist.github.com/zonble/5092067
快速建立與刪除 Facebook 測試帳號的 Python Script
這年頭做各種網路應用,難免要去做一些與 Facebook 整合的功能;要不就是要讓使用者可以產生內容貼到 Facebook 上污染其他使用者的眼睛,要不就是讓其他人可以用 Facebook 帳號直接登入。總之,有用到 Facebook,就會遇到怎麼在 Facebook 上面測試的問題。
我們之前手動開了一個測試帳號,然後拿這個帳號定時跑相關測試,包括使用 CI 系統跑 Unit Test 什麼的,然後,這個帳號就會三不五時被停權。原因是 Facebook 認為你的測試帳號在做的各種測試的行為,其實是在 spamming。
但是,我們還是會有測試的需求啊!所以 Facebook 說,你不應該拿一般的帳號來測試,而是應該建立特殊的測試帳號,其他會員不會看到這些測試帳號,以及貼出來的資料,這樣就不會干擾其他人平時的使用。
相關文件請參考 https://developers.facebook.com/docs/test_users/
從上面的文件可以看到,Facebook 雖然提供了建立與刪除測試帳號的 API ,不過在工作上,我們通常還是會希望拿一個包裝好的物件來與這些 API 互動。所以,我們寫了下面這個 Python script:
https://gist.github.com/zonble/5088322
升級 PyObjC
Mac OS X 10.8 所提供的 PyObjC 是 2.3.x 版本,在做一些事情的時候會遇到一些問題,但是升級到最新的 2.5.x 就比較沒有問題。升級的流程是 1. 首先要安裝 pip 2. 然後升級流程是,先升級 pyobjc-core,再升級 pyobjc,指令如下 sudo pip install pyobjc-core --upgrade sudo pip install pyobjc --upgrade 這樣便可以完成安裝。
在一套 iOS app 裡頭,直接安裝 AppStore 裡頭的另外一套 App
像是 Facebook 的 iOS App 等應用程式,在最近的改版中出現了一項功能,就是在點選頁面中的一些 iOS app 的廣告的時候,可以在 App 中直接出現一個 Modal View,在 App 裡頭就可以直接安裝另外的 App,而不需要跳出 App,開啟 AppStore。 要實作這樣的功能,其實只要實作 iOS 6 SDK 中所提供的 [SKStoreProductViewController](http://developer.apple.com/library/ios/#documentation/StoreKit/Reference/SKITunesProductViewController_Ref/Introduction/Introduction.html) 這個新的 Class 即可。
在 Mac OS X 上設定 org-mode 表格可以正確對齊的中文字體設定
話說這種問題,就還真的只能夠去對岸的網站找答案,但是在繁體中文環境底下要看得順眼,還是得自己調整一下。 (eval-when-compile (require 'cl)) (defun set-font (english chinese english-size chinese-size) (set-face-attribute 'default nil :font (format "%s:pixelsize=%d" english english-size)) (dolist (charset '(kana han symbol cjk-misc bopomofo)) (set-fontset-font (frame-parameter nil 'font) charset (font-spec :family chinese :size chinese-size)))) (set-font "Monaco" "LiHei Pro" 20 24) 效果如下 

Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
Free to watch • No registration required • HD streaming
使用 Sphinx 透過 LaTeX 輸出中文 PDF
安裝 Sphinx ----------- Sphinx 是一套 Python 的套件(Python Egg),所以,我們在 command line 底下,使用 easy_install 或是 pip 安裝即可。直接輸入 ``sudo easy_install sphinx`` 或是 ``sudo pip install sphinx`` 。 安裝 LaTeX ---------- 網路上面已經有人包裝好給 Mac OS X 使用的 LaTeX,請至 http://www.tug.org/mactex/ 下載 MacTeX.pkg 之後點選安裝。這個套件還頂大的,要稍微花一點耐心。 安裝完畢之後,我們要改一下 shell 設定,加入以下 path: ``/usr/local/texlive/2012/bin/universal-darwin`` 。 執行 Sphinx ----------- 建立一個空目錄,在這個目錄中,執行 sphinx-quickstart,接下來會問你一連串的問題,像是專案的名稱、版本號,要不要也輸出 epub、要不要使用 JavaScript 顯示數學式等等。大部分狀況下直接按 Enter 就好了。 接下來我們可以從 index.rst 開始編輯。Sphinx 所使用的文字格式叫做 [reStructuredText](http://docutils.sourceforge.net/rst.html) ,文件格式可以參考 Sphinx 網站上的說明: http://sphinx-doc.org/rest.html 。 修改 LaTeX 輸出設定: --------------------- 改一下我們專案目錄下的 conf.py ,找到 latex_elements 這個變數,調整一下,加入中文字體設定。我們在這邊將中文設定成儷宋、英文設定成 Georgia,也可以根據自己的需求修改字體。 latex_elements = { 'preamble': ''' \usepackage{fontspec} \usepackage{xeCJK} \setmainfont{Georgia} \setCJKmainfont[BoldFont=LiHeiPro, ItalicFont=BiauKai]{LiSungLight} \setCJKmonofont{Osaka-Mono} \setCJKsansfont{LiHeiPro} \setCJKfamilyfont{song}[BoldFont=LiSungLight]{LiSungLight} \setCJKfamilyfont{sf}[BoldFont=LiSungLight]{LiSungLight} \XeTeXlinebreaklocale "zh" \XeTeXlinebreakskip = 0pt plus 1pt ''', 'babel': '\\usepackage[english]{babel}', # The paper size ('letterpaper' or 'a4paper'). 'papersize': 'a4paper', # The font size ('10pt', '11pt' or '12pt'). 'pointsize': '12pt', } 編譯、輸出 ---------- - 到專案目錄下,執行 ``make latex`` - 到 _build/latex 目錄下,用 xelatex 輸出我們剛剛產生的 .tex 檔案,例如 ``xelatex Test.tex`` 。
Localizer - 一套用來解決語系翻譯問題的工具
 我們最近做了一套用來協助在 Mac OS X/iOS 軟體開發過程中,管理翻譯字串的工具,叫做 Localizer。因為目前還仍然在不斷開發中,我們暫時先不提供包裝好的安裝版本,不過,由於這是一個 OpenSource 專案,程式碼可於 [Github](https://github.com/ninja31312/Localizer/) 取得,使用 Xcode 編譯執行即可使用。 ## 問題 我們在 2008 年起,在 Mac/iOS 上開發公司產品的第一個版本起,就提供了多國語文的支援,支援英文、簡體中文與繁體中文三種語系。 蘋果從傳統的 Mac OS 進步到 Mac OS X 以來(一晃眼居然已經是十年多的事情了),就提供一套還不錯的多國語文架構,同一套軟體不需要分別包裝、推出不同語言的版本,在同一個應用程式的 Application Bundle 中,可以插入多國語言的字串以及 resource 檔案,系統也會自動偵測目前使用者選擇的是哪一種語言,自動以該語言呈現程式介面。 在 Xcode 中製作多國語系支援也非常容易,如果要在不同語系下使用不同的 Nib 或是圖片,只要在 Xcode 中選擇這個檔案,按下「Add Localization」,接下來就只需要使用 Interface Bulder 編輯 XIB 檔案,或是換一張圖片即可。要翻譯程式中的字串也很容易,每一個需要翻譯的 NSString 字串,只需要放在一個叫做 NSLocalizableString() 的 function 中,再來編輯一個叫做 Localizable.strings 的檔案即可。檔案格式大概是這樣: "Original string" = "翻譯過的字串"; 順道一提,蘋果目前所使用的各種設定檔案的格式,叫做 plist(Property List),我們目前所看到的 plist 檔案,像是每個應用程式都會有一個決定程式基本設定的 Info.plist 檔案,都是 XML 格式。不過,像是前述翻譯字串時所使用的格式,其實就是最古老的 plist 格式,當年在 NEXTSTEP 中的 Info.plist 用的可是這種格式。 程式中每增加一個字串,我們就要在 Localizable.strings 中增加一筆記錄,這種作法實在沒什麼效率。所以蘋果在開發工具中提供一個 command line 工具,叫做 genstrings,可以幫助你掃描程式碼,從指定的程式碼中抽出字串,存在文字檔中,接下來只要編輯這個文字檔就好了。 隨著專案的發展,你會發現蘋果所提供的工具不敷使用。最大的問題出在,genstrings 這套工具假設你的工作流程都是,整個軟體在開發過程中,都是以英文當做主要語言開發,在出貨階段再整個做一次翻譯,但現實卻不是這樣:你可能用這樣的流程開發了第一版,但是你會繼續推出後續版本,你總不可能再下一個版本中,把之前做過的翻譯先全部刪掉,然後整個重做一次,必定是沿用既有的字串,有增有減,你需要檢查哪些字串還沒翻譯,以及應該刪除哪些已經沒用到的字串。 genstrings 的流程中,還有幾個明顯的缺點 * 我們將字串檔案交給翻譯人員之後,翻譯人員往往會搞錯檔案格式,尤其是字串內容中引號必須 escape 過(" 必須要寫成 \\"),如果寫錯,在 Xcode 中就會發生 parser error,但蘋果並沒有提供修正這類錯誤的工具。 * genstrings 需要指定要掃描的字串,但隨著軟體不斷的修改,程式碼有增有減,光是記得要掃描那些檔案,都很困難。 因此,許多人就自己開發管理字串檔的編輯工具,在 AppStore 上就可以看到不少套,像是: * [Localizable String Merge](https://itunes.apple.com/tw/app/localizable-strings-merge/id475333727?mt=12) * [String Editor](https://itunes.apple.com/tw/app/stringseditor/id502352498?mt=12) 而因為我們的需求,我們剛好也有位新同事 Joe Hsieh 要開始學 Mac OS X 上的軟體開發,我們就寫了 Localizer。一方面是自己需要用到的工具,另一方面,這也是一個不錯的練習。 ## Localizer 在設計上,Localizer 是以一個單一的 Localizable.strings 檔案為中心。使用時應該還算簡單:直接使用選單中的「開啟」,便可以使用一個文件視窗,管理這一份 Localizable.strings 檔案中的內容。接下來,我們可以將想要掃描的檔案或是目錄,加入到視窗下方的檔案列表中(使用工具列上的「加入掃描目錄或檔案」或是直接拖拉均可),而只要按下工具列上的「掃描」按鈕,就會從程式中尋找需要翻譯的字串。 存檔的時候,會將掃描路徑的資訊,也存放在 Localizable.strings 中,因此,當我們下次打開這個檔案,我們就直接可以知道上次掃描了哪些路徑,而不用每次都重新設置掃描路徑。 我們儲存的是相對路徑,而不是絕對路徑,主要考量現在大多數專案都使用 git 等版本管理工具管理程式碼,專案成員可能會將程式在不同的路經中 checkout,如此一來,每次 checkout 同一份專案,都不用重新設置掃描路徑 掃描結束後,所有的字串都會顯示在中央的列表中,除了可以顯示全部字串外,我們也可以只選擇過濾特定條件的字串,例如剛發現的字串,會以藍色顯示,至於程式中已經沒有用到的、不存在的字串,就以紅色顯示—代表其實我們可以刪除這些字串。而如果字串的 key 與對應的內容完全相同,就代表這個字串還沒有翻譯過,就是我們需要翻譯的對象。同時,在每個字串後方,也會顯示這個字串來自哪個檔案。 由於 Localizer 這套工具是一套標準的所謂 Document-based Applicaiton,在 Mac OS X 10.8 上,也可以直接享受作業系統提供給這類應用程式的好處,就是系統會幫你記住每一次儲存的版本,因此,如果發現修改過程中出現什麼問題,也可以輕鬆回復到過去儲存的版本。 本專案使用 New BSD License 授權,如果有什麼使用問題,也歡迎在 github 頁面上回報。
製造讓 WiFi 時有時無的環境
我們的軟體的一項特性是會去抓取大量的媒體檔案,所以一定會遇到因為網路環境並不暢通,所以使用體驗並不怎麼順暢的問題。這個問題在行動裝置上面格外嚴重,比方說在捷運站上,可能只有比較靠近車站的地方才會有網路,或是當你在龍山寺左右用得還好好的,但是接下來列車要稻江子翠之前,捷運路線整個都在新店溪底下,完全收不到訊號。 我們會想要克服這種問題,但是要克服這種環境,首先是要想辦法模擬這種環境:我們總不可能整天都在捷運列車上面寫 code。那,我們在辦公室裡頭,有什麼辦法可以讓行動裝置得 WiFi 訊號時有時無?想來也不可能去打公司 WiFI 基地台的主意,如果你這麼做,其他同時應該會想殺了你。 ## 開始的作法 我們一開始嘗試架設一個 proxy server,讓手機透過 proxy server 連線,然後定時關閉 server 然後重開。 實測之後發現,這麼做並不符合我們的要求,因為在 proxy server 關閉的時候,對於 device 來說,仍然是穩定的連到 Wifi 或是 3G 網路。也就是:這種作法模擬的並不是網路斷斷續續,而比較像是 server 突然整批死掉,機房整個跳電。這樣的 proxy server 還是會有些用處,但不是今天想要的。 ## 改個作法 我們現在透過 Mac OS X 所提供的 Internet 分享功能,將 Mac 主機的網路分享給測試用的 device,接下來便可以透過程式定時打開或是關閉 Internet 分享。打開 Internet 分享的方式是,啟動「系統偏好設定」(System Preference),接下來選擇「分享」(Sharing),如下圖  選擇 Internet Sharing,在右方設定成 Wifi,我們也可以設定 Wifi 密碼等選項,如下圖:  接下來跑一段簡短的 Python 程式,將以下內容儲存成 share.py 執行。 import os def share(): cmd = "/bin/launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist" os.system(cmd) def stop(): cmd = "/bin/launchctl unload -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist" os.system(cmd) while(1): import time print "Start sharing..." share() time.sleep(2 * 60) print "Stop sharing..." stop() time.sleep(2 * 60) 使用 command line 執行。由於切換 Internet 設定需要系統管理員權限,因此需要 sudo sudo python share.py 接下來,調整 device 的 Wifi 設定,使用我們設定分享網路的這台 Mac 即可。
新開始
開了一個新的 blog,來寫點東西。 不過根據過去的經驗,寫 blog 實在是一件很容易就荒廢的事情。