2012年12月27日 星期四

iOS 6 鬼打牆的 UINavigationController source 問題

錯誤訊息

Push segues can only be used when the source controller is managed by an instance of UINavigationController

下面左邊為主要 vc

裡面第二、第三個按鈕對應到圖中的兩個vc,使用 addsubview 方式貼上處理

一開始為了快速建立,有拉seque 關連,不過後來就使用 IBAction 方式而非 Seuqeready 方式處理

在 iOS 5 中,這樣的方式沒問題

但是在 iOS 6中,切換到這兩個 VC,按下完成按鈕執行 NSData datawithcontentofurl 動作時

會「直接」跳離 app

滴巴戈時,只有出現

Push segues can only be used when the source controller is managed by an instance of UINavigationController

處理了很久一直沒有頭緒

後來打開 storyboard,看到這兩個關連

決定死馬一下

沒想到竟然好了..

特此誌之

PastedGraphic-2012-12-28-12-04.png

2012年12月25日 星期二

iOS in-house 企業佈署相關知識

app 做好後進行封裝

封裝時要使用 enterprise distribution 相關設定

並把產生的 ipa 檔案和 plist 檔案放到相關人員可存取的位置

然後提供如下連結,告知 iDevice 進行安裝

使用此網址通知安裝

itms-services://?action=download-manifest&url=http://example.com/app.plist

itms-services 為 url-scheme, 告知 iOS 啟動安裝服務

action 為動作參數

url 為 plist 位置

伺服器要進行 MIME 設定

.IPA - application/octet-stream

.PLIST - text/plain.

iOS in-house 企業佈署 ipa 儲存修改了

2012年12月26日

使用 Xcode 4.5.2 build for archiving 之後

在 Organizer 中選擇 Distribution 要建立 in-house ipa 版本時

會發現傳統的 share 選項不見了

改成勾選 save for enterprise 建立

iTunes 開啟隱藏的僅啟動模式

iTunes 有隱藏的啟動模式,差別在於啟動模式下,iTunes 啟動 iDevice 完成後會自動退出

作法:找到 iTunes 執行檔

執行 iTunes.exe /setPrefInt StoreActivationMode 1

Type the following command and press ENTER to switch to the PC’s Program Files folder:

cd %programfiles%

Type the following command and press ENTER to turn on activation-only mode: iTunes\iTunes.exe /setPrefInt StoreActivationMode 1

復原

iTunes.exe /setPrefInt StoreActivationMode 0

MAC

iTunes.exe /setPrefInt StoreActivationMode 1

復原

iTunes.exe /setPrefInt StoreActivationMode 0

2012年12月4日 星期二

偏頗觀點:軟體工作者在南部找工作?

Well..

其實我是屏東人

可是目前完全沒有回屏東的打算(除非是靠人脈找到的管理職工作)

原因很多,不只是因為南部薪資少、或(相對北部更)軟體沙漠而已

當然這兩者佔很大因素

我想先從工作本質談起

除非家裡有錢,不然人要工作,這我承認

但是反過來,人活著不是為了工作

我可以接受一天工作 14 小時

但我無法接受每天工作 14 小時只是養活自己

兩者的差別在哪?

差別在於後者根本就是工作動物

不管一個人再厲害,除了可以超光速飛行的超人(有人懂這梗嗎? XD)

一天都只有 24 小時可以用

每天工作14小時,交通再加 1 小時,睡覺 5 小時好了

(請別用我以前一天只睡 3 小時戰我,

這邊是講長期,而非短期,如 2x 歲時代)

留給自己的只有 4 小時不到

這能做什麼?

理論上可以孝敬父母、溝通朋友、看養家庭

實際上呢?早上 8 點工作,晚上 10 點回來

找父母聊天?找網友比較實在

找朋友?找炮友比較快(還硬的起來的話)

看養家庭?找老婆友愛?硬得起來嗎?找小朋友聊天好讓小孩變夜貓子?

幫忙蓋棉被?好讓小孩子長大可以知道晚上有個從未謀面的(親生?)父親幫忙蓋棉被?

講難聽點,在跟老婆聚少離多、一天說不到幾句話,只能吃到他做冷盤晚餐情況下

我對小孩父親是我的這件事情,真沒那麼大信心

簡單來說,一天工作 14 小時這件事情會讓工作者失去幾乎所有的人際關係

大概只剩下幾年碰面幾次的高中同學、國中同學還會跟你聯絡..

其他人..嘿嘿嘿

有個前輩說過,在南部相對容易存錢

儘管薪資少,但生活花費、娛樂開銷也少

加上房價低,相對而言,更容易買到房子(這也是拜北部房價太高、平均薪水差異不夠大所賜)

這是真的

代價是..沒有代價,只是生活只剩下兩點一線

頂多回家路上多幾個熟到可以打折的路邊攤可坐

生活只剩下到公司工作、回(別人的?)家睡覺

朋友?如果還找得到非同事的朋友出來的話,大概就是路邊熱炒喝幾口酒,然後回家發酒瘋打(別人的?)老婆(然後打到變別人的)、打(別人的?)小孩這種小小娛樂吧

同事?同事相處很簡單,偶爾去路邊熱炒喝幾口酒,然後回家發酒瘋打(別人的?)老婆(然後打到變別人的)、打(別人的?)小孩這種小小娛樂吧

其他呢?

(以上都建構在一天工作 14 小時的情況下,並不代表所有南部工作者)

(怎麼有種南部工作者是特殊名詞的感覺 :p)

然後,一天工作 14 小時的情況下

能保證不會中年失業嗎?

萬一中年失業了,14 工作者有什麼機會嗎?

中年失業者通常最大的優勢是經驗(技術純熟度)和人脈

人脈聽起來很棒,如果有錢開公司或去當業務的話

如果是技術職,通常不會擔心中年失業問題,頂多被新公司凹新進員工價碼、拿 18k 薪水

(對於開得出這種薪水的公司,我一向抱持能閃則閃的原則

因為這不是公司,只是一群找不到其他更好工作人員的聚居地

如果公司營運不錯,那表示老闆根本不介意員工死活..

大概就是以前發退休金前就會倒閉換人重開的那一種)

但是,我很擔心的是,14 工作者的技術優勢是否存在

如果是不需要與時俱進的技術,例如木工、水電,通常代表工作 3 年與工作 30 年的純熟度差不多

只剩下經驗優勢,而不當上中階管理以上職位,經驗優勢很難換取對應的金錢報酬(頂多月薪多 1-3k)

如果是需要與時俱進的技術,例如軟體

除非工作需求,14 工作者有時間自我學習和進步嗎?

那樣的14 工作者一定很宅..宅到沒啥人際關係,很可能宅到不用中年就會失業 :p

嗯..等會要去繼續體驗 14 工作者的工作,晚點(還記得的話..)補完

該店的人員都很年輕,比較大的只有兩個人

我想,這也是正常的

這種服務業(咖啡店、門市等)對體力的消耗其實蠻大的

但我覺得消耗更大的是對從業人員的精神

個人會覺得拆成 8-8,之類早班、晚班會比較合理

不過有些老闆大概會覺得工作時間不差這幾小時(雖然他們算薪水時會覺得少這幾小時就該扣錢或扣對應的月薪)

app 大量發送簡訊討論

某案件說明:

希望能設計一個APP發訊軟體,自動搜尋手機名單大量發送簡訊,並強制送出文字簡訊而不需加入好友

網友

感覺上是用來發送垃圾短訊的APP?

個人感想

80% 可能性,剩下 20% 是用了避免每次傳簡訊都要使用者確認的 UX 問題。

傳簡訊確認很煩,尤其是要大量發送時。

以前手機不能安裝程式,只能使用者手動,所以確認發送動作執行者不是問題。

現在能安裝程式,沒人知道是使用者要求或程式自定(應該可以透過特定動作處理就是了..不過..下述),所以 iOS 對這東西擋光光,只能傳送到簡訊頁面由使用者透過系統程式處理,而且一次只能一個

Android 不確定,不過有人想避免這問題的話,我不會驚訝。

只是我會覺得,這問題不值得處理

因為在 Email/FB/line/msn/twitter 風行後,需要大量發送簡訊通知的情況並不多

寫內附美女圖的 email 又方便又能提昇點閱率(?

特殊情況是,當該 App 使用者的內容有即時性需求或基礎架構不足(例如南非之類 3G 建設不足的區域)時,文字簡訊可能就會是比較好的作法。

2012年11月30日 星期五

隨手程式碼 - mobile01.com 方向鍵換頁

結果: https://gist.github.com/4178423

花了兩個小時做的東西

僅適用 chrome

過程說明

想在 m01 上面使用方向鍵換頁的話,需要做到幾件事情

  1. 開啟特定網頁時,加入換頁程式碼
  2. 換頁程式碼會偵測特定按鈕(在此為左右方向鍵)並觸發事件
  3. 根據按鈕,修改網址,並前往新網址

第一件事情使用 chrome 的套件 Personalized Web 達成

這部份主要是需要 inject javascript 能力

其實可以透過其他擴充套件達成

第二件事情,使用 gist 中的程式碼處理

網路上找到的程式碼都使用 document.onkeypress

這招對方向鍵無效(或者是mac比較特別?)

要改成 onkeydown

裡面的eventobj 和 code 看起來很多餘

但是並不能省略

這是我嘗試了半小時的結果

有人有不同想法,且有成功的話,歡迎討論

第三件事情

主要是偵測網址、修改網址並前往

不過前往新網址後,使用 document.onkeydown 會發現在新頁面中程式碼無法觸發

必須要改用 window.onkeydown 才行..

因為卡了以上三個東西

本來估計頂多 20 分鐘處理好的小東西變成 2 小時的工作 orz

世界果然到處是眉眉角角…

追加:

google serach 左右鍵換頁

https://gist.github.com/4179848

使用側邊欄

http://userscripts.org/scripts/review/152796

2012年11月22日 星期四

mac 可以用 keyremap 一鍵切換輸入法

今天看到一篇文章,提到了KeyRemap4Macbook

這是一套可以自訂幾乎所有mac按鍵的套件

安裝之後(需要重開機),可以在偏好設定中找到設定

然後,根據

http://www.think-in-g.net/ghawk/blog/2011/11/os-x-mappging-a-single-key-to-select-input-source/comment-page-1/#comment-3500

的作法,就可以達成使用一顆按鈕切換輸入法的功能

切换到“Misc & Uninstall”页面,然后点击“Custom Setting”中的“Open private.xml”按钮,打开自定义规则文件。

2012年12月2日 修正:

原本作法會影響到keyremap 中的使用 right option + 方向鍵的設定

所以修改為下面三項中的第一項內容,改成使用右邊 shift + option 切換輸入法(需先按下 shift 才有作用)

其他兩項可以去掉

<?xml version="1.0"?>

<root>

<item>

<name>Switch Input Source by right Shift and option</name>

<appendix>Use the right option and right shift to select the next input source</appendix>

<identifier>private.switch_next_input_source_with_right_option_shift</identifier>

<autogen>--KeyToKey-- KeyCode::OPTION_R ,ModifierFlag::SHIFT_R , KeyCode::SPACE, ModifierFlag::OPTION_L | ModifierFlag::COMMAND_L</autogen>

</item>

<item>

<name>Switch Input Source by right option</name>

<appendix>Use the right Option key to select the next input source</appendix>

<identifier>private.switch_input_source_with_right_option</identifier>

<autogen>--KeyToKey-- KeyCode::OPTION_R, KeyCode::SPACE, ModifierFlag::OPTION_L | ModifierFlag::COMMAND_L</autogen>

</item>

<item>

<name>Switch Input Source by right command </name>

<appendix>Use the right Command key to select the next input source</appendix>

<identifier>private.switch_next_input_source_with_right_command</identifier>

<autogen>--KeyToKey-- KeyCode::COMMAND_R, KeyCode::SPACE, ModifierFlag::OPTION_L | ModifierFlag::COMMAND_L</autogen>

</item>

</root>

廢棄

該網頁的寫法在V7.5中不能用,請換成以下內容

<?xml version="1.0"?>

<root>

<item>

<name>Switch Input Source</name>

<appendix>Use the right Option key to select the next input source</appendix>

<identifier>private.switch_input_source_with_right_option</identifier>

<autogen>--KeyToKey-- KeyCode::OPTION_R, KeyCode::SPACE, ModifierFlag::OPTION_L | ModifierFlag::COMMAND_L</autogen>

</item>

<item>

<name>Switch Input Source</name>

<appendix>Use the right Command key to select the next input source</appendix>

<identifier>private.switch_next_input_source_with_right_command</identifier>

<autogen>--KeyToKey-- KeyCode::COMMAND_R, KeyCode::SPACE, ModifierFlag::OPTION_L | ModifierFlag::COMMAND_L</autogen>

</item>

</root>

事緩則圓

有些時候,我們提出了自以為正確,但其實也是正確的見解未必會被接受

這背後的因素未必是對方真的固執或聽不懂..

人的思考有兩種基本的呈現

情感,與理性

理性認同的代表可以理解

情感認同的則是可以接受

兩者都不認同的就不說了

理性認同但情感不認同的,就是可理解但不接受

白話來說,就是覺得應該這麼做但不想做

情感認同的但理性不認同的,就是可接受但不理解

白話來說,就是會做但不覺得應該這麼做

有時候事情就是會這樣..

事緩則圓

提出了理性見解讓對方有時間自己消化

並讓自己的理性去說服情感

在當下提出時,就算理性認同了,情感上未必就會認同,可能是因為面子、反應或任何其他因素

所以拋出完整說明的正確想法,確定對方能理解後,就可以先收手讓對方自行思考、說服自己

太咄咄逼人未必就是好事

可以打電話的相機

緣起

http://www.cool3c.com/article/63876

跟朋友討論這相機時

朋友說如果可以打電話會有興趣..

這點與我認知完全不合 XDDD

所以就開始了認真的討論

以前機種

Sony Ericsson Cyber-shot系列手機

        ▪        2006年7月-K800i

        ▪        2007年2月-K550i

        ▪        2007年4月-K550im

        ▪        2007年5月-K810i

        ▪        2007年10月-K770i K850i

        ▪        2008年-C902 C702 C905

        ▪        2009年-C510 C901 C903

這系列評價不是很好

大概和他的畫素有關.. 8M 只能定位為堪用

一台可以打電話的相機,目標市場在哪?

總有些使用者需要的只是基本手機功能

市面上很多 APP,但真的不是每個人都會用

有些使用者需要的可能只是其中的電話、簡訊、FB

其中,偏好攝影的使用者可能多了照片上傳、分享、濾鏡功能

稍微擴大的話,可能會發現一個大部分時間只需要用到基本電話(電話、簡訊)功能

但是對攝影有偏好,喜歡自拍、分享、編輯相片的使用者群體

(fb、tumblr、instagram 及其他濾鏡-

稍微擴大到使用者最常用 App 的話,可能可以加上 Line、Email 等

這些顧客追尋的是什麼?

一台堪用的電話

簡單/固定的社群應用和少部分的 App (遊戲?)

好用/強大的相機

在 Samsung Galaxy Camera 的基礎上,加入可以打電話的功能會怎樣?

除了第二點之外,應該都能滿足?

而至於第二點,使用內建 App (相關廠商應該會很高興收到授權費?)和觸控螢幕

也許可以讓使用者完成設定,並且在很長一段時間內都不需要再次設定?

2012年11月11日 星期日

普羅米修斯是部爛片..

網路上有些說明普的內容和寓意的,我並不覺得有錯

但是導演手法和劇情還是有許多沒有解釋清楚

不過令我不爽的是裡面的許多設定吐槽點太多了

一部電影最重要的是能自圓其說

科幻設定之類的,劇情能自圓其說就OK了,至於東西怎麼來的,還真的不重要

我可以接受普片中從古文明碎片中找到星系、弄了一台挾帶老人且沒人發現的船飛過去

甚至是弄了那台很雞巴的機器人都可以接受(雖然我還是會吐槽這點 吐舌頭

但是片中牽強、腦殘的片段也未免太多

 

1. 那兩個迷失的人的錄影裝置就算沒人監看,難道不會有錄影嗎?

補充,科學探險隊就不能帶武器?我從沒聽過這種設定阿..

這是人類起源星沒錯,但可不是外婆家

登陸的時候沒有人夾道歡送、張燈結綵,連起碼的智慧生物都沒有

不帶武器?你真以為這顆星球是外婆家啊?

就算是外婆家,這也是 n 千年前的外婆家,裡面的外婆都不知道改朝換代幾次,專門吃外婆的大野狼都不知道生多少小狼了

還不帶武器?

2. 工程師的行為未免太過古怪,開一堆船停在行星上

然後放著那些生化武器(?)不動進入冬眠?

它們冬眠總該有個目的吧?

比如說,大陸在釣魚台上蓋了一個核彈基地並且派駐人員,OK,這可接受

但是把人員冬眠掉?沒留個監視者?或者監視者掛了之後沒人叫醒睡著的人?

這是哪門子的怠忽職守怠掉自己的保命機會?

3. 異形的設定我可以接受,真的可以

就算他們和雄性人類、雌性人類或工程師搞在一起後會產生不同的物種也可以

但是,工程師搞出這種東西後留著幹嘛?

要監視的話,應該在月亮上蓋基地吧?

就算送人類到地球是從那顆星球出發,然後呢?

4. 機器人的行為真的他媽的詭異..

機器人行為三法則有沒聽過?

開發出這麼雞巴表自己人、不聽話的機器人,那老頭還真是自己死了活該

5. 機器人到底是從哪知道看到攻略的?

怎麼第一次進去就可以找到採集點?

6. 第一次開會時,弄了個全景很漂亮

沒人想過隔了 n 光年還可以獲得即時回應很不合科學嗎?

如果是出發前的錄影,那這錄影也太奇怪了吧?

(雖然後來發現那傢伙根本就在船上 XD)

7. 船長很有犧牲精神,good~

不過連原因都沒聽清楚就決定犧牲?

那女的(伊莉莎白)也是個腦殘,只會說你一定要做一定要這麼做,說一句那艘飛船是要去地球破壞,上面裝了很多武器或他要去通風報信之類的話有那麼難嗎?

8. 到底是怎樣的設計會提供船上操作說明給不小心按到鍵盤的人啊..

有人看過進入睡眠模式的電腦,被碰一下鍵盤就出現上一個人如何輸入密碼和輸入那些密碼的影片嗎?

(不過使用音階代替字母組合這設定倒是蠻有趣的

合理推論的話,工程師有可能是使用音階和和弦組成語言並套用到文字

音痴工程師大概和聾子+瞎子差不多了 XD

但是這樣的 UI 介面很難寫教學..只能用影片傳達,而文字相對而言很簡單,紙筆甚至木炭+牆壁都可以用

真要有這種語言的話,應該是文明發展後期演化出來的,不會是原生語言

針對這設定,我只能說很炫、很有意思,不過很不科學

尤其是使用這種介面的工程師基本上和人類很類似,如果是沒有眼睛只有耳朵的種族也許還能有一些討論空間)

9. 那個伊莉莎白,你為何上了逃生倉之後第一件事是拿氧氣罐…

好好的逃生艙不住(章魚明明還被關在裡面),硬是要往外面跑?

你都幾歲了,還在玩離家出走的梗?

10. 迷失的人碰到異形生物

說真的,一開始的好奇接觸行為是可接受的

不過都看到對方有反應了還不節制?

你在路上看到野狗會引誘一下,但是看到它疵牙裂嘴時還會想逗他嗎?

而且這不是看習慣的野狗,是外星生物耶…

話說那個同行(最後跌倒)也是蠻孬的…

2012年11月6日 星期二

windows 8 開發–loadState

原來 LoadState 只能用來記錄從下層回來時的狀態 (選了第五筆紀錄後跳到下一畫面後再回來,第五筆還是選取狀態)

而非再次從上層進入時的狀態 (選了第五筆紀錄後跳到上一畫面後再回來,第五筆紀錄的選取狀態已經被清空)

花了快 5 個小時在找不存在的Bug orz…

2012年11月5日 星期一

500 元的實價登錄網站

http://www.appledaily.com.tw/realtimenews/article/politics/20121105/150504/1

李鴻源還說,民眾自行製作「實價登錄地圖」,其實與內政部實價登錄網站不一樣,「我們是在蓋房子,他們在窗戶上貼了彩色玻璃」,但已交代,應讓網站使用更友善。

基本上,這是不可能做到的

只要還是政府公務員在主導整個案子的話

這不是說公務員不盡心、不盡力

或者是對案子抱著得過且過的心態

而是結構性使然

哪來的結構性?

一、(很多)政府專案的結案報告都是一堆..公務員在審

想想看,你們公司開了一個社群網站專案

然後外包給外面公司

定下案子的是覺得大家有我也要有的公司老闆

決定規格的是帶著老花眼鏡,有很多業務經驗,待了 10 年以上,只會用 Office 和 Yahoo 的業務主管

主導過程的是只想著準時下班,能閃則閃,網站成果和他沒一毛錢關係的櫃檯人員

外包公司問架構時,櫃檯人員都說可以

開發出草稿時,櫃檯人員也說可以

盡心盡力做出一個 UX 很好的網站時

主管就直接打槍:根據我多年經驗,這不是我們要的東西,重做!

再花 100% 精力做一版後

主管:根據我多年經驗,這個東西不合格

然後呢?專案人力、資源都快滿了

只好 60% 來一版

問櫃檯,櫃檯模擬兩可,okok

問主管,主管勉強點頭說可以

問老闆?

老闆就直接打槍:根據我多年經驗,這不是我們要的東西,重做!

再花 40% 精力做一版後

老闆:根據我多年經驗,這個東西不合格

然後時間到了

只好再花 20% 隨便改一改,趕快送出去

老闆出國考察

櫃檯幫忙遞交

主管不敢點頭答應,就開一個結案會議拉大家一起討論

大家看一看,那邊顏色不對、這邊圖片太小,這個版權宣告不正確

UX? UI? 那是啥鳥?

從頭到尾根本沒有人在乎這東西!

只有上面主管的思考是絕對的!

設計的再好、說服了再多人,都比不過最上面的摸不著頭緒、沒用過網站看一眼就說的一句話

這樣的公務員所「設計」出來的網站

能用才有鬼..

不過我沒接觸過政府資訊部門所開發的網站

都是一些小單位

所以以上說法也許有所偏頗(大概5-99%?)

還是請以實際經驗為準

--

不過公部門專案被主管打槍好像是常態就是了..

Windows 8 練習範例 檔案存取和選擇器 問題

今天練習 Win8 開發時卡住了

範例程式內的程式碼有問題

Windows 市集應用程式 > 文件 > 開始使用 > 選擇 C# 與 Visual Basic > 第四部分:檔案存取和選擇器

http://msdn.microsoft.com/zh-tw/library/windows/apps/jj655411.aspx

最後一部分「步驟 3:儲存和載入狀態」 一直無法成功

查了一下,發現進入 PhotoPage 時,LoadStae 中的 PageState 是空的..

因為對於 Win 8 還不熟,一直搞不定(以後要搞定才行)

所以就直接用了 ApplicationDataContainer

然後就 OK 了

可是這是 MS 本家的範例程式碼耶..

這樣真的可以嗎?

windows 8 市集修改區域設定

一直覺得 Windows 8 的市集內容很少

爆發點是保哥在 Facebook 上分享了 Khan

可是我怎樣都找不到

後來就查了一下怎麼修改 Windows 8 市集的區域設定

參考

http://mcakins.wordpress.com/enable-all-apps-windows-store-localizations/

請先開啟市集

滑到右邊開啟偏好設定

(Windows 8 的這個設計對於現在越來越寬的螢幕來說,非常不合適

MAC 也就算了,有滑動加速設計

對於 Windows 筆電來說,為了準確點選,通常不會設計的很快

結果就造成用觸控板至少要滑兩次才能到定位....)

取消其中的只顯示偏好語言

然後就可以看到所有市場的 App 了

進階作法是在區域中把英文加入偏好中並開啟偏好語言設定

這樣就可以挑選自己喜歡的語言

再 G 一個

Windows 8 市集的排序很..緊湊

這不是缺點,但可能也不是優點

資料太多就很難仔細看

對我來說,會出現一種懶得挑選、仔細看的壓力

他們應該把中間的留白多放一點

2012年11月3日 星期六

Acronis 2013 clone disk 失敗解法

從以前我就沒有成功使用過這功能..

以前是因為磁碟分割莫名變成動態,根本不能用

現在的電腦是 Sony S15 (這點很重要,等會會說)

使用 Clone Disk 功能也是一直失敗

一、在 Win7 上使用 Clone Disk

重開後,Clone Disk 工作不會繼續執行

二、使用 Rescue Media 開機光碟開機

記得要先把 Boot Mode 從 UEFI 改成 Legancy

會出現 "Run time exception; Failed to detect graphic output mode; code 21495812"

(是說 Acronis 官方有說使用 Rescue Media 開機執行 Clone Disk 會比較沒問題

不過在程式執行時完全沒有提示

提示一下很難嗎..)

三、使用 Yumi Multiboot + Rescue Iso 開機

參考網頁 http://forum.acronis.com/forum/33546?page=1#comment-104462

大致情況是直接使用 Rescue Media 開機時太早載入資料,會造成第二的問題

所以有人就使用 Multiboot + ISO 檔案

YUI 的使用方法請自己處理

iso 是 True Image 的 Rescue ISO

不過使用時會碰到和使用光碟開機一樣的問題

記得 Bios 要設定 boot mode 為 Legancy 才能使用 USB 碟上的 Acronis ISO 開機

進去後就一切正常了

竟然花了我快 6 個小時的時間..

2012年11月2日 星期五

windows 8 使用心得感想

MS 以前有出過一個產品,叫做 bob

http://zh.wikipedia.org/wiki/Microsoft_Bob

Microsoft Bob是一個介紹Windows功能的軟體。此軟體具有動畫助手和有趣的圖片,同漫遊 Windows XP 相似。但是,在Bob推出不久,他就在市場上立不了足了。

2012年11月1日 星期四

在 Custom 按鈕中建立 Border

按鈕是個很煩的東西..

背景圖片常沒有明顯邊界

有邊界的又會受限大小

所以可能的話,我一向偏好按鈕用背景圖和 Border

檔案要先 import QuartCore

指令

[btn_pick.layer setBorderColor:[[UIColor redColor] CGColor]];

[btn_pick.layer setBorderWidth:4.0];

btn_pick.layer.cornerRadius = 8.0;

Border 其實是 CALayer 做出來的

這表示所有的 view 基本上都可以套用

BoderColor 吃 CGColorRef, 所以要用 CGColor 方法轉換一下

用 UIWevView 呈現文字內容

這工作聽起來很簡單的東西

不過還是碰到了一些小問題

基本工作是設定 HTML 檔案

複製到 xCode 中

如果 html 中有使用目錄的話,這邊要注意選擇 create folder

然後使用以下指令載入

NSURL *indexFileURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"www"]];

[webView loadRequest:[NSURLRequest requestWithURL:indexFileURL]];

畫面呈現上,要注意一下

HTML 預設會有 40 px 的 padding

進 debug 模式查後,發現有 -webkit-padding-start: 40px; 的預設設定

我的解法是在 html body 中設定另一個替代性 div,然後設定 padding: 0

理論上應該是要放 body {} 中比較完美,但是一直無效(css 苦手...)

utf8, c 字串轉換(CLGeoCoder, 地址處理問題)

先來個簡單的 NSString CString 字串轉換

from http://mobiledevelopertips.com/c/converting-between-c-and-objective-c-strings.html

// NSString object to C

NSString *str = @"String object to a C string";

const char *ptr = [str cStringUsingEncoding:NSUTF8StringEncoding];

printf("%s\n", ptr);

// Another approach with the same result

const char *ptr2 = [str UTF8String];

printf("%s\n", ptr2);

// C string to NSString object

ptr = "C string to string object";

str = [NSString stringWithCString:ptr encoding:NSUTF8StringEncoding];

NSLog(@"%@", str);

然後更進一步,解 \uxxxx

NSString *s = [NSString stringWithUTF8String:"\u53f0\u7063 114 \u53f0\u5317\u5e02 \u65b0\u660e\u8def143\u5df7 4\u865f"];

NSLog(@"%@", s);

接下來是 \U

這邊其實有個問題,\U和\u並不相同

\U 是從 json parse 出來的結果

會處理這問題其實是因為取得資料時碰到一點小問題

如下字串:

\U53f0\U7063 114 \U53f0\U5317\U5e02 \U65b0\U660e\U8def143\U5df7 4\U865f

這組字串是從 CLGeocoder 的 FormattedAddressLines 中取出

原型是 NSArray,網路上的簡單處理方法是直接合併取得字串

NSString* ss = [[placemark.addressDictionary valueForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "];

不過這一串到底是怎麼來的我還是搞不清楚..

先在此做個註記,日後繼續處理

2012年10月26日 星期五

MKMapView 使用者拖移事件檢查

MKMapview有提供自己的- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated 事件監測地圖移動

唯一缺點是不能檢查是使用者拖動還是程式移動

對我而言,導致的主要問題是第一次進入時就會觸發事件

因為我打算在移動地圖時讓某些元件半透明增加可視區域

這問題會引起一些小小的 UX 遺憾

所以採用了額外的監測方式:

使用 UIGesture 檢查是否為使用者移動,是的話才呼叫程式

一、設定 UIGesture

//加入手勢偵測

UIPanGestureRecognizer *mapPan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(hideMapItems:)]; //使用者移動時隱藏物件

mapPan.delegate=self;

[mapPan setMinimumNumberOfTouches:1];

[mapPan setMaximumNumberOfTouches:1];

[self.h_map addGestureRecognizer:mapPan];

isMapPanned = NO; //flag

isMapPanned 這邊作為flag, 使用者第一次觸發後就成立,因為這時地圖已經載入完成,不需擔心regionDidChangeAnimated 事件被重複觸發(ios 5.1.1下,ios6 應該也不用擔心?)

另外要注意的是,mapview 不能直接套 UIGesture

因為 MKMapView 有自己的手勢偵測 http://stackoverflow.com/questions/5005597/uipangesturerecognizer-on-mkmapview

所以必須要指定委託並實作方法

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {

isMapPanned = YES;

return YES;

}

二、設定相關方法

//檢測使用者畫面移動

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{

//使用者開始移動結束,重新顯示物件

if (isMapPanned) {

[self showMapItems:nil];

}

}

此方法不算完美,在網路連線不佳時,有可能發生地圖資料尚未載入完成,使用者就先移動的情況

不過因為相關物件已經載入完成,所以實作上目前沒有看到問題

2012年10月25日 星期四

使用正規表示法處理大量 img 連結和書籤name

由於 http://adisonwu.blogspot.tw/2012/10/99.html 東西有點多 所以有人建議提供書籤方式 也由於內容實在有點多.. 所以使用了正規表示法處理 以下為處理步驟筆記
  1. 抓原始碼,去掉不處理的部份
  2. 為每行加入行號,作為稍後書籤名稱位置依據
  3. 過濾出不處理成書籤的部份移除行號:^\s?[0-9]+(.*(img)+.*)$,取代成 \1(a檔案)
  4. 先將上述內容複製一份,作為等會添加連結之用(b檔案)
  5. a檔案:將有行號的加入連結 ^\s*([0-9]+)(.*)$ ,取代成 <a name='\1'></a>\2
  6. B檔案:移除有img的行,^.*(img)+.*$,取代成空白,這邊會出現空白行,使用 \r+ 取代成\r
  7. b檔案:^\s*([0-9]+)(.*)$取代成 <a href='#\1'>\2</a>
  8. 整合 A檔案和 B檔案,收工
  9. 當然還是有一些小問題,例如有些圖片不只一行,這時候就需要手動檢查 b檔案內容,不過已經節省很多時間了

2012年9月24日 星期一

心得 台灣智慧型手機使用行為,Android 下載 47.3% 勝 iOS 的 34.1%

http://www.techbang.com/posts/10812-taiwan-used-smartphones-android-download-473-ios-341-the-most-common-type-of-app-released

減安
這篇分析有點亂來..
母體:智慧型手機使用者
統計行為:下載安裝app比率和種類

分析會變成這樣,不是PM太腦殘,就是業主有特殊要求
所以只好改分析方法取得要的結果:android使用者下載app的人比較多

不管anroid/ios下載比率的話,這篇文章還是有用的
基本上是可以把智慧型手機視為一個群體,看出這個群體的app使用下載行為偏好哪些方面
所以可以得到目前智慧型手機使用者最常用的類型依序為遊戲、IM、社交、股票+新聞、資訊(美食、旅遊)、照片、工具等
不過不同陣營的行為應該還是有差異
至少我覺得ios上面的工具程式app用量應該不大,主要應該都是anrdoi的系統管理,ios上沒啥好管理的

不過我常用手電筒和計算機(手電筒好好用阿!!!)
女性的話,可能偏好生理管理和記帳
不知道他們怎麼分類的


不過裡面的使用地點統計很有趣,家中第一?why?
光看這趨勢的話,會變成智慧手機成為第二電腦(隨身裝置),但是這與一般思考不符(行動使用為主而非居家使用)。
唯一想到的是在家裡玩遊戲、整理資訊

那樣的話,就變成遊戲市場為最大宗
而且設計上要以可長時間沉浸為主,可以隨時退出變成第二目標
以前都是可隨時中段、不用長時間沉浸為主要目標

2012年8月24日 星期五

人人都可以寫手機程式! 可是然後呢?


App inventor 中文學習網
http://www.appinventor.tw/
App Inventor (APP 發明家?)是個用樂高積木方式組合程式邏輯的..IDE?
好處是整合了一些可能很常用的方法(讀條碼之類)
最酷的是可以和樂高整合(阿吉+樂高,這兩個關鍵字讓我想到某人..恭喜他走出一條路,雖然我覺得他可以走得更好更酷..)

Sencha Touch 介紹
http://www.phpchengdu.com/html/news/2010/0706/1302.html


Titnaium

PhoneGap

Mono Touch (阿..我好懷念 C#)


以上都是讓"人"繞過 native code 開發手機程式的方法
也就是不用寫 Java, (像阿婆裹腳步長的) obj-C 開發手機程式的方法

可是,以我觀點,那些都是用來自爽的
ok,那些架構、方式都是有用的,都可以達到他們自己的目標和傳達的資訊:不用寫原生程式,甚至不用寫程式就可以寫出 App
然後呢?這些東西對開發 App 真的有用嗎?


對於一個想寫出手機 App的人來說
這些東西都只能解決 "部分程式面" 的問題
也就是說,他們無法解決非程式面的問題,即使是程式面的問題,也不一定能完全解決
非程式面的問題包括美工、上架流程、裝置 debug等等與程式無關、IDE 內無法解決的問題
程式面的問題簡單來說就是敲敲鍵盤就可以搞定的部份,壞消息是,這些東西是 APP 主體,但是佔據的開發成本和開發時間未必真的很多
無論是Light App 或 Heavy App..
當然,不可否認的是,這部份真的是 App 是否有效、能成立的最大因素
但是,app 中這部份所佔據的百分比真的不高

其實程式真的沒有那麼難
花點時間,有清楚的邏輯,學一下語法,看一下論壇
大部分問題都能搞定
要開發app的話,程式真的是最不重要的一環
或者說,花在 coding 的成本並不很高

產品開發週期,可以非常粗略的分成三部分
(是的,請把 app 當成產品別當成 程式,兩者差很多)
規劃設計、建置執行)和上架行銷

規劃設計是弄清楚想要的產品是什麼
最好能順便想清楚目標客群、行銷方向

建置執行在 App 開發中就是做出符合規劃的 APP
這部份內容包括了畫面設計、程式規劃和建置

上架行銷就是讓 APP 通過上架審查,讓顧客知道、了解、願意(購買)使用


雖然很多人(特別是政府機關公務員)覺得程式發包就是說我想要一個網站或我想要一個app之類一句話就可以搞定的事情
但這東西真的沒有那麼簡單.. (喔,對活在農業時代的公務員也許真的很難以了解..)
以最近接的一個案子來說
甲方的要求是一個可以經由晃動手機隨機選號並產生聲音提示和對應圖片的'簡單" app
預算是機密 :p
一開始的規劃是3周,最後拖了2個月,光是最後的ui修改就花了快三週..
畫面很簡單,三個畫面,大致是 A <-> B <-> C 的順序
這案子從規格看真的非常非常簡單
其實也真的不難,但是..收益非常不如預期

時間流程大致如下
大概是7/1開始接案
7/7 第一版雛形出現,這時圖片、聲音資源都尚未收到,所以使用網路圖片+隨便的聲音
7/15 顧客提供第一版聲音 (.m4a)
7/17 雛形套入聲音,顧客開始對聲音順序提出要求
7/20 原本的 model 逃了,挑選下一個受害者(喂..
        第一次修改結果頁面
7/23 提出加入 youtube 連結功能
8/1 提供第二版聲音 (.mp3)
8/5 提供圖片,圖片比率 3:2 合適應用於全螢幕,但程式並非使用全螢幕,因此需要修改程式
8/10 刪除 youtube 連結功能,改成 fb 粉絲團
        第二次修改結果頁面
8/12 提出簡體版對應需求(有加錢)
8/17 提供第三版聲音 (.eml)
        第三次修改結果頁面
8/18 fb粉絲團也不要了
8/20 遭遇多語系同時開發問題,決定先搞定繁體版後,再套用成簡體
8/23 送出最終版
8/25 準備產生 icon 圖片等上架用資訊

當然我不是整天在做這案子(是的話,7/15我就會準備閃人了..最晚7/23吧)
但是整體耗費時間大約是 50 小時
其中,溝通+交通時間約 30 小時
明面的專案成本包括拍照、錄音、程式(含申請 Apple 帳號)
其中程式佔據百分比約 1/3-1/4 (還好是手機程式.. 桌面、網站的話…也許是1/8以下?)
簡單的算式,coding 成本佔據專案成本約 1/6左右

為什麼會這麼低?
因為 coding 是工具而非產品
他是必要條件(沒有code,那些圖片、聲音無法產生關連和互動)
但他的必要依賴於所有相關元素的互動而存在
這就是說,設計比 coding 重要
code 一個完整的設計並不難
難的是弄出完整的設計..

以此案子來說,相對完美的作法會是
規劃設計:決定產品方向、取得產品資源、決定 App 動作流程和畫面設計
建置執行:建立 app, 連結搖動、圖片、聲音和畫面設計
行銷:交給 Jobs就好(Y)
以上是 PG 最喜歡的專案流程,不過實現可能性太低了..
原因很簡單,沒寫過程式的人永遠不知道什麼叫做程式規格..
這點要感謝 MS 在 Office 上面的成功
現在很多人(不只是公務員)對於程式/網站開發的工作看法都是:你就把這個方塊放到那邊去,把yahoo網頁上面的那個格子貼到那個畫面,這麼簡單就可以了
順便幫我換一下 google map上面我們機關位置圖案,幫我放個國旗,周邊道路弄成比較顯眼、漂亮的顏色
對於程式設計師來說,以上兩句話的吐槽點真是他媽的無敵多

顯眼、漂亮的顏色?紅?紅色有255階,哪一個比較漂亮?
周邊?50 m? 100M? 地圖縮放比不同時,要不要出現?要多大?
我就聽過要維持在地圖上有指甲大小的範圍的說法(google map可以從月亮看地球,這種超距離要不要考慮?那你的機關會比萬里長城還明顯喔… XDD )
放國旗?好啦..這其實不太難,調一下 icon就可以搞定,不過icon 是吃伺服器傳來的 json 資料設定的)
yahoo 格子阿、方塊阿我已經不想吐槽了..反正就是用 word 想法在看網頁開發就是了(如果寫個 vba 讓他們自己用word 寫網頁,不知道有沒有搞頭..)

回到原題
程式規格說實話,很複雜,不是很難理解,但就是很複雜
一個一個說起來很簡單,但是當要說的東西太多時
PG 問的煩,PM 傳得煩,顧客也會覺得這家公司很白痴
但是沒有這些看似很白痴的大量規格,程式就是不能跑
不然就是被顧客覺得白痴(這顏色這麼醜也敢用?你們的人是色盲嗎?),然後就兩邊互罵白痴(PG: 這甲方他喵的才是色盲,這顏色明明就很讚)(結果原因是因為兩邊的螢幕色差太大… orz )

再回到原題
這些非原生架構 IDE 真的有用嗎?
我的看法是有用的,但是最大用處不是用來產生 APP
我不懷疑他們能做出 Hello World 或控制畫面轉換
但是當碰到他們沒有支援的底層工作時,可能就必須要 hack,而這樣一個 hack所需的資源(時間、精力、知識)未必會比學習原生程式少
這種事情常發生嗎?是的..就我看法,每次都會發生,原因不是使用者偏好這些方法而是他們的想法中多少都會有一些特點(沒特點的東西,也不會想開發吧)
而這些特點往往就會觸碰到非原生程式未支援的部份,因為是特點,比較少人用,相對重要性不高,被支援的可能性相對會比較低

以上是無用的地方
但是有用的地方呢?
有用的地方在於可以讓這些人的手髒一下
了解他們的想法要實現時,實際需要的條件和作法
http://www.appinventor.tw/helloappinventor 來說
步驟 1-4 都是 word like的 UI 設定
步驟 6 就有趣了
按鈕? click ?參數?改內容?
按鈕不是按下去他就會自己去顯示的嗎?

第二個例子 http://www.appinventor.tw/barcodescanner
按鈕之後,相機不是應該就直接掃描條碼嗎?
為什麼要叫那個 BarcodeScanner.DoScan ?
掃描後結果不是就應該顯示在桌面嗎?
為什麼可以選擇送簡訊?撥號?

有了這些認識後,這些人才能了解程式設計不是叫程式設計師去設計
而是叫程式設計師實現他們的合理設計
雖然..我對於那些只會叫程式設計師去設計的人來學這些東西的機率覺得很絕望
但是,對於有自己的想法和設計,只是沒有程式設計基礎的人
我覺得學一下這些東西不錯
見效快,方便測試想法、了解瓶頸
等到確認想法和設計可行後
再來找人發專案或學原生語言都會比較好

2012年8月14日 星期二

翻譯軟體

這邊說的不是字典,是翻譯

字典軟體有查單字功能,可以作為翻譯輔助
但是有很多功能不夠完善
假設一個5000字的技術文章
開頭是 to learn about, 第2000字時也出現了,4300字也出現了
如何保證三個地方使用同樣字眼?
術語又是否正確?
如何保證沒有漏譯?
編輯如何確認?

翻譯軟體一般來說,會有幾種功能
  1. 字句分段,建立對應的多語區段,避免漏譯
  2. Term Database,字彙庫,詞彙查詢用
  3. Sentence Query,查詢之前翻法之類
SDL 系列軟體是我目前在學的
同一家公司目前有的產品線主要分為
SDL X
Trados 2007
Trados Studio 2009
Trados Studio 2011

其中,Trados 2007 包括了 SDL X
SDL X 應該是來自於一家被併購的產品
Trados 2007…不太熟,就目前所知,使用Traos 2007的似乎也不多
Trados 2007的存在意義/安裝目的對我而言只是為了 SDL X :p

Trados Studio 2009, 2011算是不同產品
Trados Studio 2011 相等於 Trados Studio 2009 Sp2
所用檔案格式與 Trados Studio 2009, Trados Studio 2009 Sp1有所不同
(可以當做 Trados Studio 2009 & 2009 Sp1已經消失?)


Trados Studio 2011 是主程式
裡面有許多相關程式
另外有一些不直接附屬於Trados Studio 2011的輔助程式

//以下尚未確認
SDL 的 Multiterm 是術語資料庫
Multiterm Extract 則是術語抽取程式,用於做成術語資料庫

AutoSuggest ,
AutoSuggest Creator,做成AutoSuggest 詞典

Passalo 是在地化工具,作用是抽取程式字彙做成i18n用文件
(i18n 國際化,對應的是 l10n 本地化)

使用注意
  1. 這些軟體很脆弱,最好給他一個安全、友善的環境,例如原生Window XD
  2. 軟體很脆弱,最好在安裝完成後給他一個隨時可以回溯的家,推薦使用Acronis..
  3. 軟體很脆弱,使用盜版時(聽說)有機率造成切換版本時的錯誤,有辦法的話,弄個正版
  4. 真的很脆弱,可能的話,買台專屬nb可能比較好 XDDD
SDL Trados Studio 2011 & Trados 2007 安裝順序
如果之前有安裝過相關軟體,先全部移除
安裝前建議先把 Office 和一些可能有關連的軟體安裝好(參見 SDL Installation Guide)
先安裝 Trados 2007
再安裝 Trados Studio 2011


//教學資源
象群網 (簡體)
http://www.xiangqun.net/forum?func=view&catid=2&id=4763

//名詞解釋
Translate Memory, T M包括兩個(主要?)來源,語料庫、術語庫
語料庫,根據句子建立的資料庫,如:how are you=你好嗎,使用WinAlign建立
術語庫,根據 words(單字)建立的資料庫,如:school = 學校,使用 Multiterm建立
對齊,Align, Alignment,將source text, translated text 對齊排在一起,用於建立語料庫
抽取,extract 抽取詞彙,用於建立術語庫
Concordance search (相關搜尋)從術語庫、語料庫中搜尋





2012年8月11日 星期六

專案開發 成本、流程與地雷


之前看過一篇文章討論 app 開發成本的
http://www.inside.com.tw/2010/10/17/how-much-to-develop-a-great-app
裡面的說法大致是,一個 app的開發成本不是只有app最後版本的成本
還要包括開發過程中的開發成本
例如,app最後呈現出來的版面/ui並不是一次就好的
過程中可能有上百種嘗試
上百種嘗試並不誇張
版面配置三種主要修改,對應這些配置,各種UI/按鈕/圖片的修改隨便算一下就會超過上百次
theme plus的開發過程中,光是logo就出現了30種嘗試,而那只是一個沒有任何ui的圖案
主題、地圖、地標的顯示也都至少有過 3 種不同的嘗試作法

ui/版面配置調整後,背後的程式碼當然也要調整
這部份的調整主要是在版面配置改變時發生
不過當顯示內容改變(例如表格背景從紅色換成粉紅),這部份也要有修改
而這部份的修改並不會只是程式端
程式改好後,還要讓美術看過才能過關,除非是單純的色塊或文字大小的修改
如果是漸層這種無法直接抓色碼的修改,沒有美術把關,很能做到
除非美術能給 方向、起始色碼等..,當然另一種選擇是給圖片,大家都愉快
不過圖片會碰到另一個色偏問題(這問題不只是圖片會發生就是了..)

iOS device和mac的螢幕很注重色彩正確性
但是這一點在win上基本悲劇,除非是超高級螢幕+專業調色
這意思是,美術在他的 win 電腦上設計出來的東西
放到ios上後,感覺可能就跑了(攤手
然後又要繼續調整..(悲劇阿…

回到開頭的文章
最近接了一個小案子,真的不大..
基本功能很簡單,但是業主沒有其他具體想法
結果就是做了兩三板
功能越來越多,但是價格一開始也說死了
算是學個經驗吧..

以後碰到這種只有功能沒有版面的案子
先照成本開三倍下去
如果有版面和功能,開個兩倍
萬一他沒有要改功能或版面的話,在把錢拿來找美術或加入動畫功能
不然的話,對於這種非專業的業主,照成本開基本悲劇..


2012年7月1日 星期日

Titanium 背景開啟webview


資料來源
http://developer.appcelerator.com/question/22871/how-to-start-the-app-then-render-html-in-background-then-show-it

基本作法
加入webview時,設定visible = fasle
然後加入load事件動作: 設定 visiable=true
這作法有個副作用是webview在顯示時會保存一開始設定網頁狀態,不會自動重新讀取,
除非跳離window或要求更新

code:
var webView = Titanium.UI.createWebView({url:'index.html', visible:false});
webView.addEventListener('load', function() { webView.visible = true; });

2012年6月24日 星期日

Pocket Plane心得


1. 飛行成本只看重量和路線,和起飛降落成本無關
本來以為中途多幾個轉運站會有成本問題,後來發現沒有影響
各機型的成本、速度、整體評價表可以看下面連結
https://docs.google.com/spreadsheet/ccc?key=0AuOfJLAqduq7dGFHZW1rNjRuRmc2Z3ZLbzlSYS1sSnc#gid=0
MAX earning和MAX earning per hour的差別在於前者是讓飛機自己飛,比較不常玩的話,可以選Max Earning高的機種
後者適合比較常玩的人
不過因為Max Earning和Max Earning Per hour的差異不太大
我是直接挑Max Earning高的機型為優先

2. 盡量買大城市就好
大城市的job比較多
城市配置在航程內盡量拉遠

3. 飛行途中會有bux/鈔票和金幣,初期蠻有用的

4. 起步
我是從亞洲開始
向外發展時,初期的機種航程不夠
所以我選擇買廣州向外延伸
北京、瀋陽並不合適作為到東南亞的轉運點
也別買Taipei..它對發展沒啥用,雖然我有買 :p
這邊有個重點是anan機型別買,它的預設645航程無法跨越廣州/瀋陽到DHAKA的距離
然後中間又沒有什麼好的機場候補..
所以我會建議別買Anan直升機機種

5. lv10以上
等到10左右,應該會開始進入class 2機型
不過有些event地點是class 1, 所以還是要保留幾台class 1
推薦保留Kangaroo作為運輸用
如果不怕麻煩的話,也可以使用anan作為短程運輸
不過ANAN距離太短,可能要偶爾買幾個小機場作為停靠點
買最小的大概1xxx可以搞定
如果願意花bux, 那ANAN由於速度快,是一個不錯的選擇
不過整體來看,我還是覺得KG比較順手

2012年6月20日 星期三

Titanium 動畫與view的關係

Titanium on iOS上,有提供動畫功能
不過有些view本身是不合適動態改變大小的
例如webview..

例如以下情況
viewA.top=0;
viewA.height=50;
viewA.animate({top: 100, height:200});

如果viewA是mapview,動畫效果會包括從0移動到100, 同時尺寸會從50成長為200
但viewA是web view時,動畫效果是viewA從50立刻變成200, 同時會從0移動到100
因此在使用動畫時,要注意viewA的類別是否為可動態改變大小的view

因為這問題,在處理時會需要考慮作法:如何讓動畫顯示的順暢



題外話:
同事比較偏好這作法

2012年6月18日 星期一

titanium table data在android上取用問題

在android上註冊table事件並取用資料,如e.source時
有時會有null問題

後來發現問題在於data item的設定方法

var dataitem= Ti.UI.createTableCellView({
        aa: '123'
});

dataitem.bb = '456';

在這寫法下,取得e.aa不會有問題
取得e.bb則會有10%成功機會

簡單來說就是把已知、必須的data item property盡量在create時就帶入

cheat sheet: 終於可以移除keycue了


keycue
http://www.osxtoy.com/2011/06/27/keycue-mac%E5%BF%AB%E6%8D%B7%E9%94%AE%E6%9F%A5%E7%9C%8B%E5%B7%A5%E5%85%B7/

cheatsheet
http://itunes.apple.com/tw/app/cheatsheet/id529456740?l=zh&mt=12

key cue和cheat sheet都是顯示hotkey的app
而且說真的,cheat sheet沒有keycue來的好看
可是!
keycue實在太誇張的貴了(20歐
我真的買不下手..

LAUNCHER 和alfred類似的自定義spotlight app


launcher
http://itunes.apple.com/tw/app/launcher/id402270706?l=zh&mt=12

alfred
http://itunes.apple.com/tw/app/alfred/id405843582?l=zh&mt=12

這兩個ap蠻類似的(快速鍵也被我設成一樣 :p
都提供自定義快速鍵功能展開程式介面,並在介面中執行一些工作
例如可以輸入 1+3=計算數字,或輸入 google os x查詢資料、define manager開啟字典之類功能

不過我覺得alfred比較好用(雖然power pack要錢..

聽說launcher+ geed tool能達到相同甚至更強效果
想省錢的人可以試試看

appbar 快速app查詢

http://itunes.apple.com/tw/app/app-bar/id464303501?l=zh&mt=12

dock能放的app有限
使用spotlight找app又會跳出一些奇怪的查詢
開finder顯示application folder時,總是爆慢
有這樣困擾的您,app bar是你的一個好選擇

他的作用很簡單,把status bar上面提供一個顯示application folder內容的快捷icon
點開來就會根據字母/筆劃顯示所有app讓你自己找
而且不會有delay問題

這樣的app有些時候其實不錯用..
雖然我有更好的想法..

menu pro 用快速鍵存取menu功能

http://itunes.apple.com/tw/app/menupop/id404747434?l=zh&mt=12

menu pro允許使用者使用自定的快速鍵在app中呼叫主選單
曾經得過apple獎

只是,以我來說
我會希望他能多加一個整合到右鍵的功能
快速鍵太多了,很難找到一個沒用過的global組合
不過那樣設計的話會無法通過sandbox測試..

aptus 測試網頁在不同裝置效果

http://itunes.apple.com/tw/app/aptus/id510487565?l=zh&mt=12

aptus可以設定多組裝置(瀏覽器、解析度)
並設定網址測試在裝置上的效果
因為是同時設定,所以可以取得在同樣設定下不同裝置上的效果
此外還可以將個別的結果整個擷取下來
如最後的圖就是擷取 iphone裝置設定時的網頁內容

有提供safari on mac/ios和IE7/8/9設定
但是我不確定顯示效果有沒有包含瀏覽器相容性問題
設計網頁時會很有用的一套APP



2012-06-18-17-52-22%252528370x480%252529-2012-06-18-17-55.png

foldertidy 自動分類檔案到資料夾

http://itunes.apple.com/tw/app/folder-tidy/id486626129?l=zh&mt=12

可以把一堆檔案/資料夾自動分類並新建對應名稱的資料夾
不過嘛..這樣弄出來的資料夾只是讓桌面好看
對於日後尋找並沒有用處

shipit icon處理用app

http://itunes.apple.com/tw/app/shipit!/id492043869?l=zh&mt=12

拖拉圖片進去,選擇要做成的目標(app icon大/小、itunesartwork或其他icon
就會自動放到指定資料夾

這種icon處理app好多…
如果他有提供指定區域resize/export就好了

icon處理的問題在於 57x57/ 114/114, 512/512或72x72, 50x50所需的大小和設計其實不同
一方面是所置放的位置(spiring board, iTunes, app setting)
一方面是大小問題
只有很簡單的icon可以直接用resize方式處理

cobook 同步FB/linkin/twitter聯絡人

http://itunes.apple.com/tw/app/cobook/id525225808?l=zh&mt=12

我不敢用..
理論上應該很需要,因為這樣就只需要處理一份通訊錄
不過FB/linkin/twitter上的朋友差異很大
尤其當FB有加一些遊戲用朋友時..

blue butler 藍牙裝置程式化

http://itunes.apple.com/tw/app/blue-butler/id509128601?l=zh&mt=12

應該可以用來設定當連接到藍牙裝置時,自動執行某些程式用的
也可用來同步圖片

恩..大概要一些藍牙重度使用者才有需要
我寧願要一個外接硬碟同步的程式

hazy html/js/css混淆器

http://itunes.apple.com/tw/app/hazy/id519328938?l=zh&mt=12

沒啥好說的
也沒測試過,不知道效果(攤手

2012年6月17日 星期日

appdropota 用網路分享app用於測試

2012/6/18 下午2:46
http://itunes.apple.com/tw/app/appdropota/id473083833?l=zh&mt=12

用網路把要測試的app直接丟到mac或iphone用為測試用
不過bug似乎頗多,前置要求也不少的樣子
app測試和圖片分享畢竟需求完全不同..

不太好用
skala preview(測試圖片用)就比較簡單了

status item check 用來確認 bar icon效果


http://itunes.apple.com/tw/app/status-item-checker/id511609329?l=zh&mt=12

用來檢查圖片放在status bar效果的app
把圖片放到app box中就會出現在status bar上
非常方便
不過他們說明好差..雖然是免費的 :p

PastedGraphic-2012-06-18-14-35.png

applause app排行榜背景

http://itunes.apple.com/us/app/applause/id436338263?mt=12

這是一套非常有趣的東西 XD
不過大概只對開發者和行銷人員有用

applause可以取得mac/iphone/ipad排行榜上最高的app
並把他們的icon顯示為桌面背景
對於某些對於app排行榜有興趣的人會很有用,不過也僅止於此..

pharo launcher 虛擬/實機檔案交換用

http://itunes.apple.com/us/app/pharo-launcher/id503025789?mt=12

一套用來處理虛擬機器和實機檔案交換的工具
我是用Paralles跑VM
對我而言,實用性沒那麼高

2012年6月10日 星期日

mac lion 修改time hine backup interval備份間隔

Mac 10.6 lion
lion time machine 的備份設定在 /System/Library/LaunchDaemons下的 com.apple.backup-auto.plist
開啟之後,有個設定StartInterval,如下
<key>StartInterval</key>
        <integer>3600</integer>
修改其中的數值即可
這數值是以分鐘計算,3600就是一小時

其他注意要點:

  1. 建議先備份檔案

  2. 這是系統資料夾,需要使用者權限,使用一般的編輯器時,儲存後記得再開啟一次確認檔案是否有更改

  3. 沒有可使用的編輯器時,可以使用以下指令 sudo pico /System/Library/LaunchDaemons/com.apple.backupd-auto.plist 修改完畢後,使用 ctrl+o 寫入檔案,再按一次enter確認覆蓋,最後使用ctrl+x 退出退出後可以再輸入一次指令確認是否更新成功,然後使用ctrl+x 退出

2012年6月6日 星期三

使用zoom level設定mapview

從這邊來的
http://troybrant.net/blog/2010/01/set-the-zoom-level-of-an-mkmapview/
作者透過對MKMapView設定
category加入了zoom level功能

code備份

// MKMapView+ZoomLevel.h
#import <MapKit/MapKit.h>

@interface MKMapView (ZoomLevel)

- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
zoomLevel:(NSUInteger)zoomLevel
animated:(BOOL)animated;

@end

// MKMapView+ZoomLevel.m
#import "MKMapView+ZoomLevel.h"

#define MERCATOR_OFFSET 268435456
#define MERCATOR_RADIUS 85445659.44705395

@implementation MKMapView (ZoomLevel)

#pragma mark -
#pragma mark Map conversion methods

- (double)longitudeToPixelSpaceX:(double)longitude
{
return round(MERCATOR_OFFSET + MERCATOR_RADIUS * longitude * M_PI / 180.0);
}

- (double)latitudeToPixelSpaceY:(double)latitude
{
return round(MERCATOR_OFFSET - MERCATOR_RADIUS * logf((1 + sinf(latitude * M_PI / 180.0)) / (1 - sinf(latitude * M_PI / 180.0))) / 2.0);
}

- (double)pixelSpaceXToLongitude:(double)pixelX
{
return ((round(pixelX) - MERCATOR_OFFSET) / MERCATOR_RADIUS) * 180.0 / M_PI;
}

- (double)pixelSpaceYToLatitude:(double)pixelY
{
return (M_PI / 2.0 - 2.0 * atan(exp((round(pixelY) - MERCATOR_OFFSET) / MERCATOR_RADIUS))) * 180.0 / M_PI;
}

#pragma mark -
#pragma mark Helper methods

- (MKCoordinateSpan)coordinateSpanWithMapView:(MKMapView *)mapView
centerCoordinate:(CLLocationCoordinate2D)centerCoordinate
andZoomLevel:(NSUInteger)zoomLevel
{
// convert center coordiate to pixel space
double centerPixelX = [self longitudeToPixelSpaceX:centerCoordinate.longitude];
double centerPixelY = [self latitudeToPixelSpaceY:centerCoordinate.latitude];

// determine the scale value from the zoom level
NSInteger zoomExponent = 20 - zoomLevel;
double zoomScale = pow(2, zoomExponent);

// scale the map’s size in pixel space
CGSize mapSizeInPixels = mapView.bounds.size;
double scaledMapWidth = mapSizeInPixels.width * zoomScale;
double scaledMapHeight = mapSizeInPixels.height * zoomScale;

// figure out the position of the top-left pixel
double topLeftPixelX = centerPixelX - (scaledMapWidth / 2);
double topLeftPixelY = centerPixelY - (scaledMapHeight / 2);

// find delta between left and right longitudes
CLLocationDegrees minLng = [self pixelSpaceXToLongitude:topLeftPixelX];
CLLocationDegrees maxLng = [self pixelSpaceXToLongitude:topLeftPixelX + scaledMapWidth];
CLLocationDegrees longitudeDelta = maxLng - minLng;

// find delta between top and bottom latitudes
CLLocationDegrees minLat = [self pixelSpaceYToLatitude:topLeftPixelY];
CLLocationDegrees maxLat = [self pixelSpaceYToLatitude:topLeftPixelY + scaledMapHeight];
CLLocationDegrees latitudeDelta = -1 * (maxLat - minLat);

// create and return the lat/lng span
MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta);
return span;
}

#pragma mark -
#pragma mark Public methods

- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
zoomLevel:(NSUInteger)zoomLevel
animated:(BOOL)animated
{
// clamp large numbers to 28
zoomLevel = MIN(zoomLevel, 28);

// use the zoom level to compute the region
MKCoordinateSpan span = [self coordinateSpanWithMapView:self centerCoordinate:centerCoordinate andZoomLevel:zoomLevel];
MKCoordinateRegion region = MKCoordinateRegionMake(centerCoordinate, span);

// set the region like normal
[self setRegion:region animated:animated];
}

@end

iOS下rich text file RTF檔案顯示方式

RTF檔案可以直接用UIWebview顯示
方法如下
NSBundle *bundle = [NSBundle mainBundle];
NSURL *indexFileURL = [bundle URLForResource:@"about" withExtension:@"rtf"];
[webView loadRequest:[NSURLRequest requestWithURL:indexFileURL]];

不過這方法無法更改字型大小
預設字型又超大,最後還是回頭用html了
這文章只是一個犯錯記錄

2012年6月4日 星期一

自訂scrollableview的pagecontrol 顏色

Tintaium scrollablevie有提供pageontrolColor屬性
不過這屬性設定的是pageControl的背景顏色
前景(dot)顏色不能自訂

查了一下,剛好有人針對這點做出一個自訂模組
原始版本
https://gist.github.com/2417902
加強:加入scrollableView.addEventListener("postlayout", onPostLayout);
https://gist.github.com/2729533


用法
if(sView && sView.views && sView.views.length > 0) {
require('PageControl');
var sViewPagingControl = new PagingControl(sView);
sView.add(sViewPagingControl);
window.add(sView);
}


不過這個模組有幾個缺點
  1. pageControl的顏色其實無法自訂,要自己修改
  2. paeControl的位置會固定在左邊中間,這也要自己修改
簡單改法
var container = Titanium.UI.createView({
                bottom:0, //置底
                left: 0,
                width: scrollableView.width,
                height: 20
        });

        for (var i = 0; i < numberOfPages; i++) {
                page = Titanium.UI.createView({
                        borderRadius: 4,
                        width: 8,
                        height: 8,
//讓pageControl保持在view中間
                        left: (scrollableView.width- (15*numberOfPages))/2+15 * i,
                        backgroundColor: pageColor,
                        opacity: 0.5
                });

2012年6月3日 星期日

rate app in titanium

在titanium 裡面加入 rate app 功能的作法


來源 https://gist.github.com/1011043


/**
* The following snippet will ask the user to rate your app the second time they launch it.
* It lets the user rate it now, "Remind Me Later" or never rate the app.
*/
var win = Ti.UI.createWindow({ backgroundColor: '#fff' });
win.addEventListener('open', checkReminderToRate);
win.add(Ti.UI.createLabel({ text: 'This is a simple app that will remind you to rate it.' }));
win.open();

function checkReminderToRate() {
var now = new Date().getTime();
var remindToRate = Ti.App.Properties.getString('RemindToRate');
if (!remindToRate) {
Ti.App.Properties.setString('RemindToRate', now);
}
else if (remindToRate < now) {
var alertDialog = Titanium.UI.createAlertDialog({
title: 'Please rate this app!',
message: 'Would you take a moment to rate this app?',
buttonNames: ['OK', 'Remind Me Later', 'Never'],
cancel: 2
});
alertDialog.addEventListener('click', function(evt) {
switch (evt.index) {
case 0:
Ti.App.Properties.setString('RemindToRate', Number.MAX_VALUE);
// NOTE: replace this with your own iTunes link; also, this won't WON'T WORK IN THE SIMULATOR!
if (Ti.Android) {
Ti.Platform.openURL('URL TO YOUR APP IN THE GOOGLE MARKETPLACE');
}
else {
Ti.Platform.openURL('URL TO YOUR APP IN THE ITUNES STORE');
}
break;
case 1:
// "Remind Me Later"? Ok, we'll remind them tomorrow when they launch the app.
Ti.App.Properties.setString('RemindToRate', now + (1000 * 60 * 60 * 24));
break;
case 2:
Ti.App.Properties.setString('RemindToRate', Number.MAX_VALUE);
break;
}
});
alertDialog.show();
}
}

2012年5月29日 星期二

titanium url cheme設定

SDK 2.0.1 GA2下
Titanium 會自動設定url scheme
預設是application id最後單字
例如 com.demo.theappname
url scheme就是theappname

不過有一各小例外
當使用 us.adison.TheAppName時
url scheme是Theappname(只有首字大寫)
如果還是有問題,打開builer下的檔案檢查看看
iPhone: builder/iphone/info.list
        <key>CFBundleURLName</key>
                        <string>com.demo.theappname</string>
                        <key>CFBundleURLSchemes</key>
                        <array>
                                <string>看這邊</string>

android
builder/android/AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.demo.theappname 這邊" android:versionCode="1"
        android:versionName="1">

使用url scheme的方式可以參考
http://developer.appcelerator.com/question/120393/custom-url-scheme---iphone--android

// Save initial launch command line arguments
Ti.App.launchURL = '';
Ti.App.pauseURL = '';
var cmd = Ti.App.getArguments();
if ( (getTypeOf(cmd) == 'object') && cmd.hasOwnProperty('url') ) {
Ti.App.launchURL = cmd.url;
Ti.API.info( 'Launched with url = ' + Ti.App.launchURL );
}

// Save launch URL at the time last paused
Ti.App.addEventListener( 'pause', function(e) {
Ti.App.pauseURL = Ti.App.launchURL;
});

// After app is fully resumed, recheck if launch arguments
// have changed and ignore duplicate schemes.
Ti.App.addEventListener( 'resumed', function(e) {
Ti.App.launchURL = '';
cmd = Ti.App.getArguments();
if ( (getTypeOf(cmd) == 'object') && cmd.hasOwnProperty('url') ) {
if ( cmd.url != Ti.App.pauseURL ) {
Ti.App.launchURL = cmd.url;
Ti.API.info( 'Resumed with url = ' + Ti.App.launchURL );
}
}
});

2012年5月28日 星期一

titanium visible, show, hide



Though hide() & show() are handled appropriately in views, the state of the property 'visible' is never changed. If you pass visible: false in the createXXX() method, it will be respected and used (the view will be hidden), but the value of .visible never changes again even after calling show().

這句話的意思大概是當使用hide/show()時
元件的visible屬性並沒有變化
例如建立一個 xxx {visible:false}後,使用xxxx.show()
這時去檢查visible也依然是false
所以別用visible檢查元件是否為可視狀態
要檢查可視狀態的話,另外設定一個bool值處理(好像有看過人這麼建議?)

是說Titanium好歹也提供一個toggle指令吧..

2012年5月26日 星期六

Titanium ios/android同專案開發心得

這篇算是一個階段性的總結
先說一下專案過程,這是一個LBS型態專案
其中使用了一些比較fancy的UI/UX
也使用到了一些分享功能(簡訊、email之類、fb)
一開始是從ios版本做起
之前有一個lite的iOS版本,也是用Titanium開發的

這次開發pro版本時
由於繼承了lite版本的不少程式碼(約一半)
基本上開發速度蠻快的
Titanium在某些方面是有它的優勢存在的
包括
可以使用JS語法處理:
無論是iOS或android,要搞懂他們的語法和架構多少都需要一些時間,甚至是不少時間
而Titan提供用JS語法進行開發的功能,這點對於許多了解JS語法的開發者而言,一定是一個利多
但是由於不是原生語法,如果專案中要用到一些比較底層的功能,就會很麻煩
如果是Titan沒有提供支援的功能,也會很麻煩

整合了一些常見/常用的元件和方法
Titan在網路傳輸這塊整合的不錯,此外還包括FB、資料庫的語法整合也很方便
不過這三個領域在andoird或ios上都有一些不錯的整合元件
真的要說的話,大概只有fb的整合算是比較獨特和省時間

一開始寫ios版本時
大部分的時間都花在調整UI/UX上面
好的UI/UX是一個app一定要有的元素
UI/UX也許不用很獨特、很絢麗
但至少要是一個讓使用者可以很快速了解、使用的介面設計

這部份加入前後的修改,和一些思考及功能上的調整,大約花費一個多月左右完成
這期間使用Titanium處理iOS時,有碰到一些問題,但沒有多少bug出現
比較特殊的大概是Titanium還不支援ios上的簡訊功能
所以有引用SMS模組,但是SMS模組在使用上有一些問題
由於之後設計變更,沒有繼續使用,所以現在不確定是因為SMS模組的問題
還是因為把SMS模組套用到scrollview中的按鈕上的問題
(這部份之後會提到,Titnaium中並非所有元件都能配合無誤,目前為止,很多元件放在scrollview中常會出現一些不可理解的行為,或稱為bug…

在決定使用同一套程式碼進行android開發時,才真正陷入bug地獄..
首先,我要說明一下,以下提到的情況未必都是titanium的問題
android的版本之多、硬體組成之複雜從來不是新聞
即使使用原生android程式碼,也很少有人能保證不會碰到問題
其中尤其以影音相關功能最為複雜
但是在Titanium上,影音相關的問題我這次碰到的情況並不多
最主要的大概只有使用相機拍攝照片並上傳時,會一次記錄兩張照片的功能而已..
喔,使用相片膠卷挑選照片上傳好像也會讓照片自我複製一次…

還是先從ios/andorid的基本元件設計開始談起好了..
iOS和andoird的基本畫面設計本身是不同的
最簡單的就是andorid沒有上方的navbar設計
這種設計當然是可以模擬出來的
但是對應的navigation group功能就不是簡單的模擬可以做到的了
這就是同一套程式碼要對應android和ios時要碰到的第一個問題
這問題會很煩,但不是無解
只是要多花費一些心力去處理畫面進出時的設計
不過由於有了本來的ti for ios程式碼,加入這設計時可能會讓程式看起來有一點雜亂

接下來我碰到的問題在於ios獨特的元件設計
例如toolbar, systembutton
android在這方面非常欠缺
最簡單的例子是刪除用的垃圾桶圖示
在titnaium中,可以使用iphone.systembutton.delete這樣的簡單語法提取iOS的垃圾桶圖示作為按鈕
(雖然只能放在toolbar或navbar上)
但是在android(2.2)中並沒有(Titanium官方只宣告支援2.2,其他的版本多少有相容性,但是個人建議別去踩那地雷..你之後還有很多地雷可以踩個夠..)
在android上少了這設計就表示你需要自己弄一個按鈕,自己標明"刪除鈕"
如果想要精美的垃圾桶圖示,請找美設人員討論..
平心而論,這不是大問題
就算是在iOS上,由於toolbar的限制,這種系統icon也不是隨時都可以使用的
而且這是ios/android 在基本架構上的不同,與titanium本身優劣並無干係
當一套app要在這兩個不同平台上開發時,這本來就是必須花的功夫之一
不過加入前面說的ti for ios程式碼後,會讓整個程式碼結構看起來更雜亂了一點
不過這部份和程式流程/UI結構關係並不大,其實還可以接受
修改起來也不是太麻煩
處理這部份問題時,我主要的工作都在於搜尋ios元件,然後替換成對應的android可使用元件

修改這部份後,原始專案終於可以在android平台上測試了
這時候android解析度不統一的問題就出來了
ios上由於有自動判斷解析度加入@2x而且長寬比不變的設計,在iphone 3gs/4/4s上只需要注意某些硬體元件是否存在就可以(雖然這三種機型的硬體元件只有規格差別而沒有是否存在的差異)
但是android上面的螢幕長寬比、解析度差異很大,在這部份就要特別小心
這部份我們所採用的是懶人作法:強制使用預設長寬比設計
主要是在tiapp.xml中加入一個簡單的設定

接下來才是正式的測試
首先碰到的是android平台在GPS定位上的速度比ios慢,慢很多..
所以需要修改原本的單線流程,改成使用callback方式,讓機器抓到GPS訊號後才執行對應程式碼
這部份ios可以通用(說實話這是比較好的作法)

但是接下來就是一堆地獄了..
說真的,現在想起來,我覺得titanium對於ios的支援程度好很多..
我並不真的確定原因..但是我覺得和ios的穩定性以及架構相對完整有很大關係
我們的專案由於有特地強調UI/UX,並加入一些作法減少使用者的等待時間
所以在物件架構上相對比較複雜,有2~4個物件常駐背景並等候呼叫和執行
這些物件在iOS上使用時,透過navigation group的push/pop方法就可以運用
但是在android上不行..在android上使用back或close時,物件就會被關閉
這問題的出現,一方面是因為我方原始的設計不夠成熟
但也不能忽略titanium在這方面的移植性設計不夠完善才導致這種令人騎虎難下的情況出現
由於時間壓力,這方面我們使用了簡單的show/hide方法繞過
使用這方法繞過的一個主要考量在於這些設計和程式行為有關
所以不再能像UI元件一樣使用簡單的if(iiOS them ooxx 方式來進行簡單的分支處理
可是這還沒結束…

titanium on android上,對於層層套疊的元件在編譯時很容易出問題
一個簡單的 xxx.hide指令
當xxx"直接"附屬於最底層的window時,是很正常的
但是當xxx放置在scollview,scrollview又放置在tablerow中時,hide指令就無效了..
在iOS上一開始也曾經出現類似問題,但是當時出現的問題主要在於效能方面(tableview先出現,一閃之後才會出現裡面的元件)
元件的基礎指令如hide 無效的問題並未被觀察到


另外,如同上上一段所說的,為了減少使用者等待時間,我們有一些物件是常駐背景處理的
因此無可避免的,我們有一些事件處理會呼叫這些背景物件執行,也會根據執行結果安排元件並顯示出來
但是在操作這些背景元件時,titanium對這些元件的處理方式有奇妙的不同
在iOS上,開啟一個window放置背景後,可以輕易的操控其中的元件屬性
並在操作完成後顯示window
但是在android上,這些元件未必是可操控的,這問題尤其容易發生在元件不直接附屬於window時
即使是在同一個active window中的元件,由於上一段所提及的因素,要操作其行為也未必可行
當元件是scroll開頭的scrollview或scrollableview時尤其明顯

另一個問題是,在android上,當在table row中加入一個圖片當按鈕
指定圖片點擊動作為開啟新的window,當window關閉時
android有可能出現z-order錯誤問題
這問題幾近無解
因為他牽涉到的是titanium編譯指令的方法和android的行為
唯一可信的解法是使用heavyweight方式開啟window,如 modal:true
不過這解法也並非100%完美..

整體而言,將這套在ios上完美的程式碼轉移到android平台時
只有和UI無關的傳值行為可以不用花心思處理
其他的諸如表格點擊之類動作都或多或少有一些相容性問題(ios上e.rowData可以用,android上可能就要測試e.source之類)

結論
如果將titanium定位在快速建立簡單的iphone app的話,titanium還蠻完美的
如果想用titanium開發簡單的android app,應該也不會碰到太大問題
但是想要用同一套程式碼同時覆蓋兩個平台的話,我會建議先行判斷你的app是否符合以下條件
畫面設計簡單:這方面說的不是功能上的簡單,而是UI架構上的簡單,建議最多不要超過二層
也就是頂多用到 base window/wrapper/ UI 這樣的設計就好
這條件並不表示你的畫面要維持素淨,只要在一層之內,你想加多少image其實都不是問題
如果可能的話,最好是只有一層如 window/lavel
程式架構簡單:盡量維持一次只有一個window,背景最好不要有其他元件
這條件可能會讓app在開啟新的畫面時多花費一些時間,但是可以有效的降低你處理背景物件時花費的時間。一些額外的好處則是可以節省app的記憶體空間
UX設計不要太複雜:一些動畫還是可以用的,但是別讓這些動畫擴及到active window以外的元件
盡量遵守MVC設計:程式歸程式,ui歸UI,資料歸資料,千萬別讓資料和ui卡在一起。
盡量使用callback:如果你不確定怎麼把app架構拆成MVC,起碼你可以使用callback方式來處理程式。當然兩者一起就更好了,這可以讓你的程式更好掌控和管理

最後一個問題,我會後悔學習Titanium或用它開發嗎?
我的回答是不會,Titanium在建立app上確實有它的優勢和特色,包括快速的學習曲線和快速的開發
但是它的應用範圍顯然沒有原生語言/IDE來的廣泛和深入(喔,Titanium沒有 xcode的interface builder之類拉畫面的附屬程式,不過反正android也沒有這種支援程式..應該沒有吧)
當然你可以自己建立Titanium module來擴展它的能力,不過走到那一步的話,你還能享受到多少快速/簡易特性?
titanium在原生UI元件的支援上未必100%支援(例如ios上的sms功能...)
不過一些簡單的元件如label, button之類,基本上都有支援

但是當ios上完美運作的程式卻在android上由於UI套疊後的存取/控制問題變成蟲族母巢後
我就開始後悔用它做這種開發了
記得,別給Titanium太大的發揮空間,能簡單就盡量簡單

補充幾點
Titanium的debug能力非常基本,除了簡單的語法錯誤和log方法之外,幾乎沒有其他debug作法
不過可以透過使用xcode/eclipse開啟編譯過專案的方式處理
和ios/android相比,Titanium api和開發資訊相對而言少很多
最後
Titanium用在iOS上比android穩定很多,如果只是用來顯示網頁資料的app,更是幾乎不會有任何問題

2012年5月24日 星期四

titanium android 下 ambiguous z order 問題

這篇文章給後來有碰到這問題的人當參考吧
SDK 2.0.1GA2
簡單結論:Titanium on android中,開啟new window時,
如果是tablerow , click事件請使用row內的button 別用其他元件(包括row.click事件
或者是使用 modal: ture方法開啟


把app轉換到android時
Titanium一直出現 ambiguous-z-order 問題
根據http://engineering.rentgeek.com/titanium-ambiguous-z-order-android 的說法
使用row中的button 事件開啟新視窗時,就不會有這問題
而使用 row click事件就會有

他推測這是因為點擊tab group.tap1.table.row 時
開啟新window後,按下close按鈕時執行倒退動作時
系統會嘗試去取得原本focus的元件(row)
但是由於這元件在window.table.row中,APP定位不出來,就造成了z order問題

他用了image 元件當說明,可是image和他推論的button應該是同一級別元件..
結果他也不知道為什麼image會有這問題 orz

他的解法是加入modal true設定來避開
可是這解法對我而言不適用..


追加
http://ti.masuidrive.jp/topic.php?id=333
這篇是使用table + scrollview/scrollable view
也是有z-index問題

2012年5月22日 星期二

假如七八十歲的人還在創新,我們問題就大了

原文 http://forum.inside.com.tw/viewthread.php?tid=1492
節錄:
一個多月以前我去台灣,在一個餐桌上,有一批年紀很大的企業家,頭髮都很白了,每個人都大談創新,怎麼創新?邊上有個人跟我講,台灣有希望,我想這麼大年紀的人還在創新。後來我說台灣沒希望了。 假如七八十歲的人還在創新,我們問題就大了,他們不相信年輕人比他們更會創新,其實他們應該是盡全力去努力幫助年輕人去創新,建個平台扶持他們創新、幫助他們創新。 所以我們認為比年輕人更聰明,那災難就出現了。

延伸閱讀
十九世紀的製冰業,派人在結冰的湖面或河裡,將冰塊鋸下給顧客使用,他們的工作後來被製冰廠取代,製冰廠又被電冰箱取代,假如他們願意擁抱改變,而不是去抗拒改變,他們將有機會轉進到新的技術領域,而不是眼睜睜看著自己的心血被別人取代。

老人用他們的想法創新,不接受小一輩的真正創新。

這想法就和冰塊製造廠老闆一直想創新冰塊,卻不接受電冰箱這種東西的情況類似。
對冰塊業創新是一條路,但是當電冰箱出來後,大家都能做冰塊,還守著舊思維思考怎麼運送冰塊好讓他不融化,而不去思考是否到處建小廠做冰塊,那註定失敗。
因為這是一種典範轉移、破壞(革命)性創新,而破壞性創新是不可能從原本的基礎上改進而來
同樣的問題出現在出版業、快遞業、ooxx行業,只思考怎麼更好的賣東西,而不是思考他們在賣的是東西還是資訊時,那註定會被淘汰
十九世紀的製冰業,派人在結冰的湖面或河裡,將冰塊鋸下給顧客使用,他們的工作後來被製冰廠取代,製冰廠又被電冰箱取代
有多少製冰業的老闆講創新時是在想製冰廠?製冰廠老闆有多少在思考電冰箱?
那些七八十歲的製冰廠老闆講創新時,我們都在弄電冰箱了,你相信他們和我們想的會視同一件事情嗎?
馬雲這次的觀點未必正確,不過他想講的東西是正確的,那些該放手的人就放手吧。
換個角度,台灣現在一線演員你 看得到多少3x, 4x的人?製作人呢?我們只看得到/聽得到楊佩佩之類6x,7x的人,3x/4x的人跑哪去了?是不存在還是整個被那些努力工作一輩子的人給壓住了?
當然很多東西需要時間養成,名氣、演技、成就都是,但是當這一代整個不在名單上時,這不叫做沒人成功,這叫做一種警訊
長輩活到90歲,工作到90,然後留給6x/7x的人擔子,6x/7x又活到100。這樣的企業/環境,真正新穎的想法怎麼出頭?
真正新穎的想法是沒有前例可循的, 提出來時,長輩一句你有經驗嗎?我有!沒有想法是能通過這句話的檢驗和長輩經驗門檻的
然後就是只能依循前例,大家繼續想怎麼更有效率的從河裡挖冰而不是去思考電冰箱怎麼用比較好(攤手
到了這地步,真正的創新就不可能了 XD

Titanium 雙行動平台 textarea行為差異


keyboard:
android沒有toolbar這設定,我也不確定是否有辦法在keyboard上另外添加view
這會牽涉到done/cancel這兩個必須按鈕的配置
如果可以的話,盡量使用modal window處理
如果是單行,可以用enter判斷

使用 Titanium 開發 android和iphone app心得


隨著andoir的改版進度
我對titanium dev on android越來越灰心
這裡面當然多少牽涉到原本的程式架構有點複雜的因素
不過多半的問題在於iphone與android的基本差別
另一個問題是Titanium只確定支援android 2.2

這裡面會牽涉到一些問題
android 4.0或更高版本是否支援Ti創建的APP?
在Ti中,怎麼用一套程式碼走遍android SDK 2.x -4.x甚至更高?
如果不行,這之間的支援怎麼解決?

如果你也要使用titanium進行開發
請盡量確保你的程式使用的元件夠基本、流程不要太複雜
盡量一次只使用一個畫面,使用適當的global var儲存資料
window open時才建立對應畫面展現(我這次有一半因素栽在這邊)
如果考慮使用相同layout, 在建立window時,就要考慮上方的navbar要怎麼在android中展現
//我想過建立一個custom winnow覆蓋title元件,不過下次再說吧
資料傳輸只牽涉到OSI前三層

不過以上條件如果全都達成
那做出來的app大概也沒啥特殊看頭,大概只會是專案app而不會是產品 XD
所以最好的作法可能會是在Ti中使用很嚴格的MVC架構,這樣才可能確保完整的移植性
可是能做到這點的人中,其中大部分的人轉學android或iphone可能也不會多花太多時間(有興趣的話..

如果讓我說,Titanium的用法應該是用來快速創建單一平台app
如果考慮要覆蓋多重平台,至少要把資料操作部分程式完全抽離
這樣就可以讓多重平台app使用同一套資料操作app,但使用各自的ui/controller方法
如果堅持要用同一專案,那至少可以使用不同的UI/control方法
放在同一個js中,判斷if android, 然後計算width/height並不會讓日子好過多少

Titanium在資料操作部分的程式轉換做得不錯,也整合的不錯
然後在前端ui部分,也許可以說是因為ios和android本身就有很大差距
但是用起來就是非常的不順暢!
當很順暢(隨便)的建立了單一平台app,然後想轉換到另一平台時
這UI的不同與相應產生的工作壓力所帶來的挫折感在這時最為明顯(例如此時的我 orz

Titanium SDK 2.0.1GA android下talbeviewrow高度

雖然從sdk2開始,height/width : 'auto'作法被官方捨棄
不過在2.0.1Ga下,android環境中tableviewrow使用height : Ti.UI.SIZE是有問題的(iphone則OK
所以還是要用height : 'auto'寫法

等sdk改版後,這問題可能也許大概就會被修掉?

2012/5/26 上午11:18
sdk 2.0.1ga2
andr下,width要使用 'auto',不支援Ti.UI.SIZE

2012年5月21日 星期一

android modal window無法出現兩次

根據
http://developer.appcelerator.com/question/123838/android-modal-window-wont-open-twice#215617

在android中,win1.open({modal: true})後
按下back鍵時,win1會被destroy
當win1是在事件程式碼外建立時,就會出錯

理論上應該有解決方法:win1中覆蓋android:back事件隱藏win1

不過由於使用modal方式開啟的window是heavyweight window, 不支援hide方法只支援close方法
而close方法也會destroy window reference… 等於是同一條路 orz
然後其他的方式如zIndex方法也無效..
簡單來說,就是使用modal方式開啟的window無法用close以外方式隱藏、關閉

雖然modal window可以支援android:back按鈕
不過使用modal window作為navigation group的替代方案是有問題的
還是乖乖使用tabgroup方式比較好

iOS UI設計27方針

來自 http://www.simonwhatley.co.uk/apples-27-guidelines-for-mobile-user-experience-design

The user experience of iOS-based devices revolves around streamlined interaction with content that people care about. Below are Apple’s 27 guidelines for mobile UX design:

我流翻譯開始
Focus on the Primary Task
(讓使用者)專注在主要工作上

Elevate the Content that People Care About
評估使用者真正想要的內容
這方針的問題在於通常我們都在評估老闆要的功能 :p

Think Top Down
從上到下思考(功能、UI設計)
其實我不是很懂這句(完全沒有前後文說明..),也可能是指content呈現上根據重要性從上到下排列

Give People a Logical Path to Follow
給予使用者一個有邏輯性的使用路徑
例如folder/catelog -> 內容或是start - edit -done 這樣的路徑,不要讓使用者一開始就在功能流程的中段而不知道從哪來、做什麼、往哪走

Make Usage Easy and Obvious
讓app的主要目標簡單且顯眼
別讓其他的次要目標和主要目標一樣顯眼,例如分享的icon..

Use User-Centric Terminology
用以使用者為中心的字彙
與其使用ID,不如使用account, 與其使用modify不如使用edit

Minimise the Effort Required for User Input
盡量減少使用者的輸入需求
包括建立合理的預設設定,想想看你開一份word結果要求你先輸入檔名、頁面、font, font size時你會多不爽

Downplay File-Handling Operations
盡量減低檔案處理動作在使用者眼中出現的次數(使用者需要的是處理內容而非處理檔案)
以照片編修軟體來說,別問要不要覆蓋,使用者存檔時就把照片存成新檔、建立不同版本或提示舊照片會不見

Enable Collaboration and Connectedness
提供協同合作和連接特性
app合適的話..而且這樣也能提高擴散可能性
不過這樣需付出的成本和單機app相比會提高很多..

De-emphasise Settings
盡量減少app設定的重要性
只有特別需要的東西才放到setting中
這和一般的想法有所相反:setting是放做得出來的功能但不確定最好選項的地方,例如頁面背景色之類 XD
其實這句話的基礎思維在於:別期望使用者會去使用setting, 把程式的預設選項做到最好,其他需要調整的東西盡量放在相關的頁面上,別放在那個和主要task完全搭不上邊的setting中

Brand Appropriately
使用合適的品牌/名稱(別用不相干的字眼或名稱作為app名稱或icon

Make Search Quick and Rewarding
搜尋功能應快速(使用、效率)且提供之前記錄
包括search功能應該隨時在畫面上
可以顯示之前的搜尋詞或結果
Entice and Inform with a Well-Written Description
通知/說明/placeholder/hint的說明要用心
包括簡潔、易懂、讓使用者知道這說明的目的,看完說明之後能了解要輸入什麼、做什麼、取得什麼結果

Be Succinct
簡潔
簡潔

Use UI Elements Consistently
UI元素要有一致性(風格)
這交給美術去傷腦筋 XD
PM只要記得問他們這些UI/版面的一致性在哪就可以了

Consider Adding Physicality and Realism
考慮加入物理/現實特性,讓使用者可以在其中找到和現實的關聯性
例如在書籤icon上使用現實中的書籤造型,edit使用紙筆icon

Delight People with Stunning Graphics
使用絢麗的圖像愉悅使用者(就是要炫…

Handle Orientation Changes
處理裝置轉向需求
就算只限定portrait也要開啟上下翻轉(何必呢…

Make Targets Fingertip-Size
別讓目標物件小於手指尺寸
apple建議44x44,不過他們自己的nab button就違反了 XD

Use Subtle Animation to Communicate
使用微動畫與使用者溝通
例如擺動圖標提醒使用者
這是因為人眼很容易受到移動的事物影響,就算不在主要視界中
不用開一個alert 視窗,一個小小搖動的icon或變色的icon就可以讓使用者注意到程式狀態的改變

Support Gestures Appropriately
適當的支援手勢功能
例如照片之類同樣性質但無法在同一頁顯示的內容就可以考慮加入手勢功能讓使用者直接切換
不過別為了手勢而手勢..(遙想當年..

Ask People to Save Only When Necessary
只在必要時請求使用者執行儲存
一般來說,使用者離開編輯畫面只有兩種情況,cancel與done
如果不是modal window,那可以考慮只出現cancel/reset按鈕,done由使用者離開當前編輯畫面事件觸發

Make Modal Tasks Occasional and Simple
減少modal window的出現,而且別讓modal window內的工作複雜
不要一直modal window! modal window中別讓使用者待超過30秒,走三層以上路徑

Start Instantly
立刻開始,別讓使用者等待
例如某些一定要等好幾秒的app logo畫面..

Always Be Prepared to Stop
在app的任何功能中都要考慮程式停止/離開時的處理
手機使用情況是隨時都有可能被關閉,確保程式在任何情況下離開都不會造成問題(以及可回復狀態

Don’t Quit Programmatically
別讓app無預警關閉(原文是別用程式處理app離開功能)
程式中任何會讓app關閉的按鈕都要讓使用者知道按下去後程式會關閉
以前看過的一個例子是遊戲過關後會顯示製作名單然後就離開遊戲
這種情況下,使用者就不知道是出問題或正常關閉

If Necessary, Display a License Agreement or Disclaimer
當有必要(使用者誤解導致被告可能性)時,顯示License Agreement 或 Disclaimer
明哲保身方針..反正大部分都只會按下確定 :p

titanium, tableview rowdata.click找不到e.rowData.xxxx資料

在titanium中
tableview下,同一段click事件中iPhone找得到row data.xxx資料,可是android不行..

tableview.addEventListener('click', function(e) {
                if(!e.rowData.xxxx) {
                        alert('no ios markerid');
                        return;
                }

這個問題非常古怪,古怪到我差點和夥伴翻臉討論是否要放棄titanium框架
不過解法異常簡單..
主要是塞row.xxxx的時機
使用以下方式設定資料即可
var row=Ti.ui.createtableviewrow({
xxx: 123,
yyy : 456
});
千萬別用
var row = Ti.ui.ceatetableviewrow({

});
row.xxx=123;
row.yyy=456;
這種用法在iphone正常
但是android(至少是google pai 2.2)下會有隨機性的資料遺失問題發生

2012/5/26 上午11:13更新
以上使用方法是正確的
不過當row是放在section中時
section1.add(row)

在android中,table.click事件
使用e.rowData會抓不到資料
目前確定這種情況下使用 e.row.xxx可以抓到資料
e.row在其他地方的適用性尚未測試

2012年5月20日 星期日

Titanium map annoyation點擊事件: android無法觸發

Titanium map annoyation點擊事件: android無法觸發
簡單來說,annotation點擊在

http://developer.appcelerator.com/question/117350/annotation-click-events-not-working-on-android

http://www.pastie.org/1756264

mapview.addEventListener('click', function(e) {
                        if(e.clicksource == "title" || e.clicksource == "subtitle") {
                                var win1 = Titanium.UI.createWindow({
                                        url:"club.js",
                                        club_id:e.annotation.myid,
                                        title:e.annotation.title
                                });
                                
                                Titanium.UI.currentTab.open(win1,{animated:true});
                        }
                });


//補充
http://developer.appcelerator.com/question/116634/map-annotation-not-showing-right-left-buttonview

2012年4月26日 星期四

optixxx 系列軟體.. 都很雞肋

onetrash
可以指定垃圾桶中的檔案進行個別刪除
不過這功能聽起來很雞肋..

cmdQuit: cmd + Q的強化版
可以選擇一次關閉所有程式、關閉程式、隱藏程式甚至關機
還是有點雞肋..

optimPref:
提供wifi, bluetooth, mute, 螢幕亮度增亮/變暗的工具介面..
雞肋
因為這些功能在鍵盤或toolbar都有,除了不會去這些地方找按鈕/功能的人之外
到底有誰會需要?

optimUSB
可能是這四個裡面最有用的
mac在刪除usb硬碟中的檔案時,其實是建立一個垃圾桶資料夾把檔案放進去
事實上沒有刪除,也無法取得空間
optimUSB會在刪除使用usb連接的硬碟/隨身碟時直接刪除檔案
比較沒那麼雞肋了(不過竟然賣11.99!? oops

optimapp : cmdQuit, oneTrash, optimUSB, optimxxx的整合介面
其實就是一個放以上四個app的工具列而已..

!app drop ota

待補完

非常有趣的東西,但是還沒搞定!

好像是可以把Xcode build出來的app直接傳送到機器上
可是還沒搞懂它的流程
另外目前有個bug是app名稱不能有空白

acron pixelmator簡單比較

我目前主要使用pixelmator處理圖像(主要是用來畫icon
剛剛玩了半小時的acron後大概能說出兩者的差別了

acron的筆劃、特效方面比較強而且比較順
但是pixelmator在圖形、線條的處理比較強
如果以應用方面來說
pixelmator用來畫icon之類的會比較有用
但是acron可以輕易的對圖片作多種有趣的處理
如果主要工作是處理圖片(上特效、加漸層、加上一些有趣的效果、打幾個字)之類工作
acron會比較合適

如果是要畫線條、填色、製作比較精密的圖形
那我會選擇pixelmator

以上是一點小參考
兩者都有試用版可以下載
建議以自己的主要工作內容做測試後自行決定
當然兩者都比不上PS大神,但是兩者的操作容易度和學習曲線都比ps來的低
ps已經發展成一個龐然大物了..

kopypasta 記事本歷史軟體

又是一個clip board記錄軟體
不過只能記錄文字
但是他的操作性比copyless好..因為他只要點一下就可以複製
copy less選取後還要按enter才有作用 orz

但是他只能記錄文字..

stundenplaner 功課表app

還記得上學的時候,每天都要記得星期幾、幾點鐘要上什麼課、在哪間教室上課
以前還會寫一份功課表放在皮夾中拿出來翻
大學時有了印表機後,就用word做文件然後印出來

stundenplaner就是這樣的一個功課表軟體
雖然流程有點不太順,不過主要的功能其實有達到
設計好的功課表會直接出現在桌面上(雖然會被其他視窗蓋住
大概是下圖的感覺(它的視窗是可以拖移的
除了功課表之外,如果是每週有固定行程的人其實也可以使用


PastedGraphic2-2012-04-27-05-49.png

app 連結 http://itunes.apple.com/us/app/stundenplaner/id482349383?mt=12

dotshotxpro 像素圖工具


這套軟體一開始讓我很疑惑
它看起來像是繪圖軟體,但是整個UI風格和流程和一般(photoshop like?)的繪圖軟體完全不同
也不是說完全不同..應該說操作的手法很類似
但是出來的效果和組合總是跟預期的有一些微妙的差別
但是程式效能又不差,看起來不像是隨隨便便寫出來的東西?
很難對這程式定位

後來google了一下,發現了這篇文章
http://mac.appbank.net/macapp/587.php

還是不太懂它的用處和用法
不過發現它可能是日本人開發的軟體..
用處可能和RPG地圖之類的東西有關..
感覺很有趣(雖然還是不會用 XDDD
總之先留下來了

mx clac-簡單好用可顯示計算過程的計算機


標題所言,看下面擷圖應該就可以了解了
這東西真是用來計算大量資料輸入時的好幫手阿..


PastedGraphic1-2012-04-27-05-09.png

apimac notepad-功能夠強又不夠強的編輯器

其實我忘記這軟體我有沒有付錢買了
雖然名字有notepad
不過事實上他是可以貼圖片進去的
以一個簡易的編輯器來說,他的功能強大
而且又有文件整合功能
理論上是可以作為簡單的文件記錄app使用的
可是他的圖片不能調整尺寸....(翻桌
應該說他只提供對文字的調整功能(畢竟是文字編輯器嗎..

以一個文字編輯器來說,apimac很強大
但是以文件編輯器來說,apimac就很虛了,只能處理文字

就看使用者要怎麼對他定義了
我本來是想把它作為工作日誌記錄用途的(因為有需要放程式擷取畫面作為討論用)
可是圖片不能調整就不合用處了(嘆


PastedGraphic-2012-04-27-04-57.png

lifestream 立意良好但是ux破功..

lifestream是個把一些常見的socail功能整合的軟體
看預覽畫面感覺很棒
功能其實也蠻順的
例如看FB時,就會把周圍的工具都清掉只留下塗鴉牆上的訊息
而且(理論上)可以快速切換到其他social服務

可是!!
他的切換按鈕非常奇怪..
感覺不是切換服務而是切換是否連接服務,但是連接之後不會切換畫面?
這一點真的非常奇怪..

finch - 程式時間記錄軟體

不知道為什麼
mac上有蠻多app可以記錄程式使用時間
可能和mac要偵測有哪些程式使用中很簡單有關..

anyway, finch是一個記錄程式使用時間的軟體
特色是他可以針對所開啟的程式標記tag(娛樂軟體、工作軟體之類)
之後就可以用來檢查自己的app使用時間(該程式為主視窗的時間)

ui很淺顯易懂,也沒啥特點..
雖然也可能是我看太多類似應用了..

2012年4月19日 星期四

Titanium SDK 2, studio 2釋出

號稱四月要放出的SDK 2終於出來了
對我而言最主要的優點是支援了Xcode4.3
終於可以使用xcode4.3了(因為偶爾有在開發其他程式..

此外,studio 2也可以用了
studio 2比studio 1好很多
反應比較迅速
支援自定的方法
雖然android模擬器的Ti.API.info方法不知道為何出現了問題..(不確定studio 1有沒有支援就是了
另外有一個小問題是我習慣使用暗系主題
但是studio 2在compile時,會自動對某些行列進行選取動作造成反白
這點蠻討厭的
除此之外,整體感覺良好

2012年4月14日 星期六

iphone icon的圓角距離


  • corner radius for the 512x512 icon = 80 (iTunesArtwork)
  • corner radius for the 114x114 icon = 18 (iPhone/iPod touch (Retina))
  • corner radius for the 72x72 icon = 11 (iPad)
  • corner radius for the 57x57 icon = 9 (iPhone/iPod touch)
資料來源
http://stackoverflow.com/questions/2105289/iphone-app-icons-exact-radius

2012年4月12日 星期四

Titanium iOS/android共同專案注意要點

android測試方法
成功安裝app後,出現錯誤選擇continue, 然後修改
修改完畢在模擬器重新執行app就可以了
錯誤會在android的runtime環境出現錯誤視窗,console無效..
目前測試 info是否有效中

  1. iOS有toolbar, android沒有,要用view代替
  2. 動畫功能只有ios有
  3. 見鬼的navigationgroup替代問題..
  4. android的GPS警告視窗不能關閉?
  5. iOS的Navagationgroup完全不能用,還好可以把navgrp的底層直接開起來執行。
  6. toolbar按鈕非常麻煩,這大概會是最花力氣的部份(把所有地雷踩光之後..
  7. android的GPS要開eclipse使用DDMS控制傳送座標
  8. android的GPS回應較慢,"一定要使用"callback方式或app.event方式處理gps事件
  9. mapview: android中每個應用程式中只能有一個mapview,這個問題很大、非常大
  10. 表格click事件:要使用e.source不能用e.rowData(SDK差異?還是平台差異?最有趣的是,iphone/android上的方法不同,在不同專案中也不同 orzT專案:android要用e.source, iOS要用e.rowDatac專案:and/ios都可以用e.source方法傳遞參數
  11. scrollable view的render方法不同:之前在scrabble view上使用的tp[=100方式插入view並保留上方title方式,在android中scrabble view不會露出背景,必須修改scrabble view才行(不過修改完結果還沒在iPhone上測試
  12. iOS.toolbar = android.menu: iOS的toolbar在android上的實作有點麻煩(本來想做在上方的title,學play作法,看來google也覺得iOS的作法不錯?)不過那設定有點麻煩..win.title還無法使用,所以比較直觀(偷懶)的作法是把ios.toolbar內容做成android.menu內容(而且還不用煩惱少了flex space後的位置問題 XD
  13. android和iOS的視窗起始有點不太一樣androi中,每個畫面都是一個window,使用一個全視窗view的情況並不多而iOS中,很多視覺效果都是靠view之間的切換而達成在設定並行版本時,這一點需要多加考慮
  14. 2012/4/23 最後還是卡在toolbar這一塊了 XDiOS中,很多情況下會把按鈕放在tile/navigation bar上不過android似乎沒有這樣的設計,主要是靠menu雖然最近有很多 android app也有tile bar設計,不過那個似乎是靠程式設計達成而非原生元件,簡單來說,就是要另外添加才行,因為位置是在最上面,一開始設計時沒有考慮到這點就會影響到所有物件位置。
其他問題
titanium在MAC上的anroid模擬器不太穩
同一個專案設定,跑google api 2.2, 顯示螢幕從HVGA換成WVGA854就不能執行
我已經放棄使用模擬器,直接跑實機了
而且模擬器也不支援Ti.API.info/debug…
最後,這樣做還有一個好處,修改完畢後可以直接測試ios版本與android版本
titanium studio記錄iOS debug資訊
eclipse記錄android debug資訊

2012年4月11日 星期三

web form builder lite

這app操作起來其實很順暢
用來建立web表單還不錯
不過我在操作過程中一直有個疑問,怎麼顯示html碼?

%2525E8%25259E%2525A2%2525E5%2525B9%252595%2525E5%2525BF%2525AB%2525E7%252585%2525A72012-04-12%2525E4%2525B8%25258A%2525E5%25258D%2525882.30.58-2012-04-12-02-31.png

最後我終於發現這是一個線上服務的client端程式
最後的結果必須要上傳到網站(然後要先建立帳號..)
所以..我移除了 :p

當然這有可能是lite版限制
從畫面來看,這app做出來的表單還是不錯看的
不過每個網站都有自己的風格
我實在看不出花69歐元買這套軟體的理由

backdrop 簡單的桌面隱藏工具

桌面隱藏app的功能基本上就是把桌面藏起來
然後其他app可以在上面繼續工作,如下圖就是使用了桌面隱藏的效果
backdrop提供了單色背景作為隱藏,很陽春,不過..算是夠用
不過他有個特色是還有提供pixel test功能
pixel test就是買螢幕時對亮暗點的測試(把整個螢幕變成黑白紅綠藍色)
這功能算是在情理之中(對螢幕作同樣的效果),意料之外(怎麼從桌面隱藏變成暗點測試了 XD)



%2525E8%25259E%2525A2%2525E5%2525B9%252595%2525E5%2525BF%2525AB%2525E7%252585%2525A72012-04-12%2525E4%2525B8%25258A%2525E5%25258D%2525882.23.48-2012-04-12-02-22.png

photoenhancer core

這軟體只能作兩件事情
增減圖片亮度和增強品質(銳利度?)
優點是有提供批次功能

不過..軟體本身的功能太差
左邊是使用軟體後的圖片,右邊是原圖
可以發現很容易造成亮度破表的情況
enhancer功能則是使用起來沒有感覺
%2525E8%25259E%2525A2%2525E5%2525B9%252595%2525E5%2525BF%2525AB%2525E7%252585%2525A72012-04-12%2525E4%2525B8%25258A%2525E5%25258D%2525882.17.21-2012-04-12-02-17.png

結論:移除

Network Logger

這app理論上是用來監測網站的
不過他的監測方式有點奇妙:提供主/副網站
重點在於這種工作理論上應該是server task
寫成app然後又提供超過一天的持續監測選項..
雖然不能排除有人用lion server跑這app
不過感覺還是很奇妙..
說實話,我沒有完整測試過,他要求的起始條件有點麻煩
我看完說明後就移除了..


%2525E8%25259E%2525A2%2525E5%2525B9%252595%2525E5%2525BF%2525AB%2525E7%252585%2525A72012-04-12%2525E4%2525B8%25258A%2525E5%25258D%2525882.11.35-2012-04-12-02-08.png

file viewer

如同名字一樣,一個用來檢視檔案資訊的小軟體
雖然小,不過功能還蠻完整的
注意下圖toolbar右邊四個按鈕
native是顯示檔案
text是用ascii顯示
hex是顯示16進位碼
icon則是該檔案類型的icon(包含四種解析度)
%2525E8%25259E%2525A2%2525E5%2525B9%252595%2525E5%2525BF%2525AB%2525E7%252585%2525A72012-04-12%2525E4%2525B8%25258A%2525E5%25258D%2525882.01.40-2012-04-12-01-56.png
檔案資訊方面,除了一些該有的東西之外(圖片就是exif、顏色空間、metadate之類)
還會顯示檔案的完整權限
左邊的info最下面有提供fileinfo網站上的對應檔案類型說明

整個來說,蠻完整的

iGreetingCard

電子賀卡軟體
製作出來的結果可以存成圖檔、上傳到FB、flickr或直接列印

優點是直接整合iphoto,可以直接拉iphoto的照片
新增文字、圖框也很方便
文字框、圖框都可以隨意選轉和加入陰影
雖然icon的設計不是很直覺
不過一般電子賀卡該有的功能算是達到80%以上了吧

%2525E8%25259E%2525A2%2525E5%2525B9%252595%2525E5%2525BF%2525AB%2525E7%252585%2525A72012-04-12%2525E4%2525B8%25258A%2525E5%25258D%2525881.54.24-2012-04-12-01-49.png

dimmer than dim 降眼壓app

這是一個很有趣的APP
他的概念是螢幕越亮,眼壓越高(我不知道這說法是否正確
所以dimmer提供調整螢幕亮度的方式讓使用者避免眼壓過高以及輻射
不過dimmer會保持滑鼠亮度(甚至提高)避免使用者找不到滑鼠
這作法有沒有效果..可能要問眼科專業人士才知道

http://itunes.apple.com/us/app/dimmer-than-dim/id418816854?mt=12

2012年4月9日 星期一

mac上建立android虛擬環境問題

延續上一篇的建立android..
可以參考這篇 http://justfly.idv.tw/2012/02/08/Just_1067.html


  1. 要把iPhone圖檔copy到android資料夾,不然compile不會過

  2. i18n檔名有所不同,iOS可以用的zh-Hant在android中似乎不接受?

  3. android的編譯檔案對於i18n檔案的檢查比iOS嚴格.. 在ios中沒有檢查出來的重複定義字串在andorid編譯時造成了錯誤

  4. Ti.API.info無效…必須要使用eclipse開啟DDMS查看log和info資訊。這點有些奇特,目前回報的人不多,不確定原因何在?

失敗的邊際線


失敗的測試
本來左右都有的留白間隔,加入裝飾線後變得擁擠了
比較好的作法應該是把線條只留一個
顏色也要淡一點
盡量降低存在感
%2525E8%25259E%2525A2%2525E5%2525B9%252595%2525E5%2525BF%2525AB%2525E7%252585%2525A72012-04-03%2525E4%2525B8%25258A%2525E5%25258D%2525889.45.48-2012-04-9-19-47.png

titanium iphone專案加入Android之環境設定

我一開始設定titanium專案時,直接把android排除
不過今天開始要測試android環境
然後就發現android不能勾選(這就叫自作孽? XDD

檢查了一下,發現有幾個地方需要調整
最基本的android SDK就不說了
在Titanium專案部分,有一些地方需要加入

resource下面需要加入android對應的資料夾
%2525E8%25259E%2525A2%2525E5%2525B9%252595%2525E5%2525BF%2525AB%2525E7%252585%2525A72012-04-09%2525E4%2525B8%25258B%2525E5%25258D%2525887.43.44-2012-04-9-19-44.png

Tiapp.xml中,需要加入運行環境

%2525E8%25259E%2525A2%2525E5%2525B9%252595%2525E5%2525BF%2525AB%2525E7%252585%2525A72012-04-09%2525E4%2525B8%25258B%2525E5%25258D%2525887.43.52-2012-04-9-19-44.png

同樣Tiapp.xml,加入SDK宣告%2525E8%25259E%2525A2%2525E5%2525B9%252595%2525E5%2525BF%2525AB%2525E7%252585%2525A72012-04-09%2525E4%2525B8%25258B%2525E5%25258D%2525887.43.58-2012-04-9-19-44.png

2012年3月30日 星期五

多國語言處理..又一個地雷

2012/3/30 下午8:24
Ti SDK: 1.8.2

Titanium的多國語言字串中不能放入特殊符號,例如<br />
例如 <string name="poidetail_share_title">分享給朋友<br />我要換行</string>
這樣的字串只會parse出"分享給朋友"字串
嘗試過\/都沒用
所以用自定的換行符號取代
沒想到又碰到第二個雷 XD
var str= L('poidetail_share_title');
str.replace('br', '<br />');
上面的指令是無效的
查了一下,有人提出類似問題
原因似乎是str不會被判斷為字串(Titanium SDK好像連JS的缺點都implement了...)
解決方法是把str toString()後再處理

阿阿阿阿阿阿阿
我討厭這種不指定型別的作法 orz

附帶說明
Titanium的string.format吃的是%s, 進階作法是$1%s, $2%s

2012年3月29日 星期四

titanium systembutton適用環境


根據http://developer.appcelerator.com/apidoc/mobile/latest/Titanium.UI.Button-object

system button只能用在以下環境

Titanium.UI.iOS.Toolbar. The items array can contain system buttons.

Titanium.UI.iPad.Popover. The leftNavButton and rightNavButton properties can refer to system buttons

Titanium.UI.iPad.SplitWindow. The toolbar array can contain system buttons.

以下環境需要用toolbar放置
Titanium.UI.TextField. The keyboardToolbar array can contain system buttons.

Titanium.UI.TextArea. The keyboardToolbar array can contain system buttons.

Titanium.UI.Window. The leftNavButton and rightNavButton properties can refer to system buttons
and the toolbar array can contain system buttons.

範例
var cancelButton = Ti.UI.createButton({ systemButton: Ti.UI.iPhone.SystemButton.CANCEL });

Headerview造成的錯亂..

2012/3/29 下午4:30
今天使用tableview的header作為資料呈現
塞了一個尺寸200的headerview進去之後
整個排版大混亂…

花了一些時間檢查、討論後
發現在header view中的view好像不能使用left+right作為定位
必須要使用 left/rigght+width, 和top/bottom + height這種方式定位
使用 left:0, right:10之類的定位方法就會造成混亂..
哀…又浪費了3個小時

2012年3月27日 星期二

取得使用者目前鍵盤/輸入法


目前用不上,還是備忘一下
http://stackoverflow.com/questions/1414876/detecting-current-iphone-input-language

https://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPInternational/Articles/ChoosingLocalizations.html


NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSString* preferredLang = [languages objectAtIndex:0];

不確定這作法抓到的是什麼就是了..


此外也可以監視使用者切換事件
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(inputModeDidChange:)
name:@"UIKeyboardCurrentInputModeDidChangeNotification"
object:nil];

- (void)inputModeDidChange:(NSNotification*)notification
{
id obj = [notification object];
if ([obj respondsToSelector:@selector(inputModeLastUsedPreference)]) {
id mode = [obj performSelector:@selector(inputModeLastUsedPreference)];
NSLog(@"mode: %@", mode);
}
}

2012年3月26日 星期一

textarea hinttext

2012/3/27 下午12:26
SDK 1.8.2
textarea竟然沒有支援hinttext…
(這個Titanium讓我有點看不懂了…
我一直以為他們是用JS模擬iOS SDK,現在看起來卻像是用自己的SDK為主找iOS中對應的部分套用?
希望SDK2能原生支援這些應該要有的的東西)
因此有人提出使用label作為替代的方法

http://developer.appcelerator.com/question/51081/hinttext-for-textarea


var value = "Whatever is going into the text area";
var hintText = "Notes";

var field = Ti.UI.createTextArea({
value: value,
color: 'blue'
});

var hint = Ti.UI.createLabel({
text: hintText,
color: 'gray',
textAlign: 'left',
left: '3%',
top: '20%',
height: '20%',
width: '100%',
backgroundColor: 'transparent',
touchEnabled: true
});

field.add(hint);

if (field.value.length > 0) {
hint.hide();
}

//*** Hint text appears when TextArea is blank, disappears when text is entered
field.addEventListener('change', function(e) {
if (e.source.value.length > 0) {
hint.hide();
} else {
hint.show();
}
});
//*** Make sure that TextArea gets focus if they tap the hint label
hint.addEventListener('click', function(e) {
field.focus();
});

//同場加映:避免textarea被觸發

  1. touchEnabled: false;

  2. captionText.addEventListener('focus', function(e)

  3. {

  4. //do nothing

  5. e.preventDefault();

  6. alert('test');

  7. });

Titanium navbar設定多重按鈕方式

Titanium navbar設定多重按鈕

Titanium的win基本上只有三個方式放按鈕
rightButton/leftButton, titleContent三種
titleContent的位置無法自訂,基本上和title的位置一樣
昨天測試了結果,left/right都無效,不過可以設定width

rightButton/leftButton基本上只能放單一按鈕
要放多重按鈕需要用到buttonbar,參考如下
https://jira.appcelerator.org/browse/TIMOB-1164

var bb1 = Titanium.UI.createButtonBar({
labels:['+', '-'],//文字方式
backgroundColor:'#336699',
style:Titanium.UI.iPhone.SystemButtonStyle.BAR,
});

win.rightNavButton = bb1;

也可以使用圖片
var bb1 = Titanium.UI.createButtonBar({
                labels : [{
                        image : 'ima/1.png',
                        width : 60
                }, {
                        image : 'ima/2.png',
                        width : 60
                }, {
                        image : 'ima/3.png',
                        width : 60
                }],
                backgroundColor : color_set['linen_red'],
                style : Titanium.UI.iPhone.SystemButtonStyle.BAR,
        });
不過不能直接放按鈕,最大的問題是不能使用系統預設icon..
這問題蠻煩的

Titanium deploy上傳錯誤

備忘一下
這是夥伴碰到的問題
Tintaium產生的專案上傳itunes會報錯誤
這問題好像還蠻常發生的

找到的結果如下
http://developer.appcelerator.com/question/120895/deploy-to-ios-device-error
從結果看來像是SDK和xcode的連結錯誤問題

2012年3月25日 星期日

Titanium: 設定按鈕背景漸層


有些時候就是懶得作圖片 :p

Titanium設定背景漸層的作法很簡單
按鈕的指令是setBackgroundGradient({});
不過沒有移除指令,要移除時設定為()即可

然後因為通常是一次要對多組按鈕設定
所以實務上(我的習慣)會先設定一個var儲存設定
如以下

var grad = {
type : 'linear',
colors : ['#111', '#666'],
startPoint : {
x : 0,
y : 0
},
endPoint : {
x : 0,
y : 40
},
backFillStart : false
};
if(type == 'note') {
btn_tabInfo.enabled = true;
btn_tabNote.enabled = false;
btn_tabImage.enabled = true;
btn_tabInfo.setBackgroundGradient({});
btn_tabNote.setBackgroundGradient(grad);
btn_tabImage.setBackgroundGradient({});
} else {...}

2012年3月23日 星期五

單鍵切換輸入法

今天看到一篇文章,提到了KeyRemap4Macbook
這是一套可以自訂幾乎所有mac按鍵的套件
安裝之後(需要重開機),可以在偏好設定中找到設定

然後,根據
http://www.think-in-g.net/ghawk/blog/2011/11/os-x-mappging-a-single-key-to-select-input-source/comment-page-1/#comment-3500
的作法,就可以達成使用一顆按鈕切換輸入法的功能
不過該網頁的寫法在V7.5中不能用,請換成以下內容

<?xml version="1.0"?>
<root>
<item>
<name>Switch Input Source</name>
<appendix>Use the right Option key to select the next input source</appendix>
<identifier>private.switch_input_source_with_right_option</identifier>
<autogen>--KeyToKey-- KeyCode::OPTION_R, KeyCode::SPACE, ModifierFlag::OPTION_L | ModifierFlag::COMMAND_L</autogen>
</item>
<item>
<name>Switch Input Source</name>
<appendix>Use the right Command key to select the next input source</appendix>
<identifier>private.switch_next_input_source_with_right_command</identifier>
<autogen>--KeyToKey-- KeyCode::COMMAND_R, KeyCode::SPACE, ModifierFlag::OPTION_L | ModifierFlag::COMMAND_L</autogen>
</item>
</root>

2012年3月22日 星期四

BBedit 小技巧蒐集(持續更新

1. 同步設定
BBedit會優先從dropbox目錄取得設定,沒有的話才去application support找/建立新設定
有dropbox的話,可以在dropbox根目錄建立Application Support目錄(必須要在dropbox根目錄!)
然後把application support下的bbedit整個搬過去(還是建議先備份
額外的優點是可以使用dropbox的版本功能在某些情況下回到舊版本
但是!有個缺點,bbedit會把autosave文件放在同一個目錄
所以有可能造成dropbox一直在同步 :p

BBedit 10.1.1 偏好設定介面

這篇說明BBedit 10.1的preference介面內容

PastedGraphic3-2012-03-23-06-26.png
上圖的
a. 開檔案時,(可以的話)把開啟畫面整合到front window(主window的意思?
b. 檔案被改變時自動更新
C. 最近開過的檔案列表個數,下面的子選項是要不要顯示完整路徑
d. 程式啟動/執行時,要做什麼
e. 是否自動開啟上次離開時開啟的檔案
        回復不安全的變動(如果上次離開的狀態和新的狀態不相符時,是否回復之前狀態(不確定..
        包括在server端的檔案

PastedGraphic7-2012-03-23-06-26.png
上圖很花我知道 :p
不過因為設定蠻多的,這樣比較容易說明(絕對不是因為我想少打幾個字!!
toolbar選項:
text optios:一些關於文件的個別設定(bbedit有提供整體設定選項,例如tab距離、顯示寬度、強制斷行等設定,但是也可以針對個別文件單獨設定,這就是那個介面
Document proxy icon:開啟finder到檔案位置

Navigation Bar:
Document navagation: 切換已開啟的文件
marker menu: 選擇marker用。bbedit可以在文件中的某個地方插入marker(類似html的檔案內書籤功能),透過這功能就可以快速切換到指定文件的指定部分,不用找來找去
counterpart button, 助手按鈕,事實上是開啟參考文件
include files menu: 開啟include的檔案
function menu:bbedit會尋找檔案中的function, 可以在這邊快速前往
不過他提供的內容蠻..繁瑣的,而且我覺得把這功能放在右邊做成列表比較好
雖然這樣會讓他看起來像是IDE而不是text editor XD

editing window: 主要編輯視窗的選項
tab stops: tab線,很好用的東西,尤其當tab寬度設定小於4,眼睛容易花的時候 :p
line number: 行數
Gutter: 左邊的箭頭,一個箭頭表示一個功能的起點,也是一個可以收折的起點
page guide at xx characters: 預設頁面寬度
下面是設定超過頁面寬度時,多出來的部分顏色處理法
這設定也是hard wrap(強制斷行)/soft wrap(虛擬斷行)的換行基準
hard wrap會將超過頁面寬度的文字強制換到下一行
soft wrap則是會將超過的部分顯示到下一行,但是不會插入換行符號

Text Status bar: 文件狀態
cursor position: 游標目前的位置(行數、字數)
language: 文件對應的語言
text encoding: 文件編碼
line break type: 文件換行方式(mac, classic mac, window的換行方式是不同的,在此不多做解釋)
document statistics: 統計資料,共有幾行、多少字
最下面的是列表的字型設定(和編輯時的字型設定不同


PastedGraphic8-2012-03-23-06-26.png
從上面開始
顯示輸入提示(text completion)
bbedit的輸入提示不限定要和語言相關
文件中有出現過的詞語都可能在提示中出現

第二段:要不要用字典中的字

第三段:虛擬斷行後,行數怎麼處理,取消的話,顯示行數就會根據hard wrap計算

第四段:虛擬斷行的縮排方式
第一個選項是置左
第二選項和第一行對齊
第三個是置右

最下面是行距設定


PastedGraphic9-2012-03-23-06-26.png
這一面是編輯器預設行為
auto-indent: 自動縮排,根據上一行的縮排位置縮排
balance while typing: 輸入' { [ 時自動帶出對應符號
tupographer's quote: 寫程式的人都用'"引號,但是寫文章時需要的可能是“ ” ‘ ’是這樣的符號,這就稱為tupographer's quote

auto-expnd tabs: 這設定可以把tab換成指定的空白數

show invisible characters: 是否顯示隱藏字元(例如tab, 換行、或其他無法列印出來的字

check spelling as you type: 使用拼字檢查功能
預設字型:編輯器預設字型


PastedGraphic10-2012-03-23-06-26.png
鍵盤設定
use tab key ooxx
使用tab在可輸入欄位中切換,使用shift-tab則是反向切換
home and end keys: 設定這兩者的行為是回到頁面最前/尾或行頭/尾
enter key generates return: 我不太確定這設定,感覺是因應unix shell中按下enter時會執行指令而產生
所以BBEdit提供此設定,讓使用在shell環境中按下enter時不會產生carriage而執行指令

allow tab eky to indent text blocks: 可以用tab對選擇的區塊縮行(不然就要用cmd+[/]方式
enable shift-delete for forward delete: 使用shift + delete執行向右刪除(必勾
when auto-indeing…. : 自動縮排時,移除前面的空白
按下option-¥顯示反斜線或¥(日文鍵盤限定..)
模擬Emacs鍵盤綁定(很邪惡的選項..

PastedGraphic11-2012-03-23-06-26.png
語言設定區,如果對語言有特殊設定,可以在這邊處理
這邊不做解釋,需要這個的人應該已經超出這文章的目標群眾了 :p

PastedGraphic12-2012-03-23-06-26.png
熱鍵設定

PastedGraphic13-2012-03-23-06-26.png
預覽用瀏覽器設定(為什麼MPlayer也會在裡面....)

PastedGraphic14-2012-03-23-06-26.png
列印用選項,包括列印用的字型、是否顯示文件框線、文件表頭、完整位置、行數、gutter
以及最重要的語法配色(使用黑色主題的人請別勾選或換成白色主題,不然很花墨水
下面是時間設定

PastedGraphic15-2012-03-23-06-26.png
語法配色設定
看了一下,bbedit 10以後吃的是bbcolors, v9以前好像是另一種
然後我要順便g一下,以前找這東西時超痛苦
找到了之後還不知道要放在哪邊..
這種東西寫一下是會死嗎!?
其實真的會耶,你自己去找吧 XDDDD
我絕對不會說要放在 /Application Support/BBedit/Color Schemes/ 目錄下的
抓到的bbcolors檔案可能有的會被判讀為執行檔,不用管他,丟下去就對了
另外這部份可能要重開bbedit才會更新,確定動作正確但沒結果的話,重開一次試試看

PastedGraphic16-2012-03-23-06-26.png
文件編碼設定
上面可以勾選自己用得到的編碼格式
中間是預設編碼
下面是當預設編碼無效時,用來測試的編碼順序

終於快完了..
PastedGraphic17-2012-03-23-06-26.png
文件設定
第一部分是換行設定
mac OSx請選擇 Unix
ensure file ends with line break:bbedit會確保文件最後面用換行符號結束
strip trailing whitespace: 勾選時,bbedit會把non-vertical whitespace去除(話說這是啥..

backups部分:備份設定
儲存前是否先備份?
是否保留歷史備份
(備份檔案)是否保留檔案名稱和類型