Thursday, December 6, 2012

[iOS] Get current location and city name


1. Add CoreLocation.framework to your project

2. Add CLLocationManagerDelegate to your viewController

3. Initialize CLLocationManager in viewDidLoad

4. Get current location in  the delegate method
- (void)locationManager:(CLLocationManager*)managerdidUpdateLocations:(NSArray*)locations;

5. Use CLGeocoder to reverseGeocodeLocation

Full Code here

Thursday, November 8, 2012

My Mac App List V1.1

更新了一下軟體列表,請參考。有*的是要付費才能好好使用的。
  • 生產力軟體(Productivity)
    • SizeUp:多視窗管理,很方便 (免費使用,會跳Demo視窗,但不礙事)
    • Mou:Markdown 即時預覽編輯器
    • Dash*:快速Snippets與文件查詢工具 (2012之後會一直叫你花NT300買不然就會一直干擾…請謹慎)
  • 瀏覽器(Browser)
    • Firefox 
    • Chrome
    • Chrome Canary : For Web Developer Only, power new future chrome
  • 儲存(Storage)
    • Dropbox : Best Cloud File Storage
    • SkyDrive:Microsoft Cloud File Storage 因為有之前活動獲得的25G,所以還是用一下。
    • Google Drive : Google Cloud File Storage
  • 開發與編輯器(Development & Editor)
    • Sublime Text:我最愛的純文字編輯器,設定可以參考這篇
    • SmartGit:目前覺得最好用的Git Client (SourceTree把我repo搞爛過...)
    • Evernote : 日常生活必備的筆記App
    • HTTP Client* : 視覺模擬HTTP Request用
    • XCode:iOS Development
  • 網路與多媒體(Network & Mutimedia)
    • 好照片:方便的照片特效處理軟體
    • FireAlpaca : 免費的圖像編輯軟體
    • Skitch:螢幕截圖軟體,附上基本畫筆可以標記
    • KKBox* : 到處聽音樂,不用下載占空間 (支持台灣軟體發展!高雄Oh~Ya)
    • VLC Player : 目前找到最通用的Video Player 
    • HandBrake : 步驟很簡單的影片轉檔軟體
    • iGetter : 續傳軟體
  • 終端機相關(Terminal)
    • Go2Shell:可以直接在Finder上開啟該目錄的Terminal
    • iTerm2:加強版Terminal,自動完成/畫面切割對於CLI愛好者很適合
  • 社交軟體(Social)
    • TweetDeck:Twitter Client, 管理多帳號的時候很方便(我還有jsdc.tw的帳號...)
    • Skype : 微軟沒了MSN,只剩下他了
    • Line : 目前最夯的即時通訊App
  • 系統軟體
    • Alfred:好用的快速啟動工具(比Spotlight強大一些 )
    • AppCleaner:自動掃描並乾淨刪除軟體的工具
    • CCleaner:非常棒的系統清理軟體,會針對安裝的一些軟體清除暫存檔案,PC/MAC都有支援。
    • CheatSheet:按下 ⌘ 幾秒就可以show出該軟體支援的快捷鍵
    • coconutBattery:電池狀態顯示軟體
    • Gas Mask : 快速切換不同Hosts檔的好工具
    • OmniDiskSweeper:磁碟剩餘空間掃描軟體,可找出佔用最大空間的資料夾或檔案
    • Synergy:跨系統多螢幕作業軟體,多台電腦適用
    • Yahoo! KeyKey:中文輸入法
    • ntfsMounter:多系統者必備, 掛載NTFS專用
    • XtraFinder : Finder 加強工具,支持多Tab/ 快速開啟Terminal/ 垂直對照等功能

Saturday, October 27, 2012

看Steve Jobs - The Lost Interview 後感

因為週末實在太忙,下週又都排滿了,所以就很趕時髦的,在這部電影上映的今天就去看了。
結果… 不得不讓我再次覺得,Steve Jobs 真的是非常非常厲害。
(以下有部分電影內容 不喜者請勿繼續看)

--------------------------------------------------------------------------------------------------------------------
Steve Jobs 在受訪時,顯得有點緊張,當時是1995年(隔年NeXT才被Apple買下),其中很多他的觀點,在現今的公司(不管是大企業或是新創公司)都可以作為參考。
以下,就以我理解的話來闡述這些觀點,如果有什麼問題,歡迎指教。

行銷跟業務只有在非獨佔性的事業(像是可樂公司)會領導整個企業,因為產品本身沒有更新的很快,在這部份著手才是上策,但科技業並不是這樣。
如果有些公司要copy國外的點子來做,卻將重點放在技術研發,那只能說,失敗率會很高,因為放錯重點...
獨佔性的企業不見得是大公司,可能只是一個小點子但沒人做(出來),或者是擁有特定的技術與架構的科技。執行面上,我相當認同EZTABLE CEO所說的,專注在產品細節

很多人認為好的點子就占了90%,但實際上執行是非常重要的。
頂尖的點子跟頂尖的產品之間,有著頂尖的技術。點子會在開發(執行)的過程中逐漸進化,並且變的更好;
所以必須雇用A咖,這些頂尖人才,會互相激勵,有時候還會爭論,吵架;但這對團隊目標是好的。

但這些A咖是最難管理的,所以他們需要一個領導者(就是講Steve Jobs自己)
要好管的A咖是絕對不可能的,訪問者也提到Apple中一堆跟隨Steve Jobs的人後來都跑了XDDDD 一個好的軟體公司,就一定會希望建立好的文化,帶起整個團隊的正向循環,從不斷的嘗試與失敗中,做出最好的產品。只是很常見的是用錯了人,只懂得執行或者沒有辦法在細節上琢磨思考,最後只為了遵循原本粗略的規格與規範,反而被限制,無法在產品中真正的去帶給使用者想要傳遞的價值。

時常有人認為Steve Jobs是獨裁者,但在影片中他不斷強調,公司是員工的不是老闆的。回家路上,我想起前幾天看到很喜歡的一篇文章:為什麼我們常愛說外國人「個人英雄主義」,但又常說「外國人比臺灣人懂得團隊合作」

我們可以說,Steve Jobs是一個擁有強勢領導到風格的領導者。他樂於受到團隊成員的遲疑,不妥協的團員對他而言是助力,不是阻力。他也很能夠直來直往的與團員們溝通,甚至進而說服自己的團員讓彼此一起往同一個方向走,是很正確的作法。訪談中,Steve Jobs認為:"真正的頂尖人才,是不需要去呵護(Baby Care)他們的自尊心"。只有暢所欲言的領導人,才有暢所欲言的團隊成員。

上面那篇文章中,所提到台灣的產業中,有著"一群不敢發問,大家沉默,排擠跳出來思考、發問的人,一群冷漠的寒蟬便形成了妥協而安靜的團隊",問題可能不只是台灣的教育教出不發問的小孩,而是團隊領導者沒有辦法接受不妥協(原因?顧慮團員面子/太愛面子/官僚保位/思考紊亂/脾氣不好/...自行想像)。最終下場都是採取高壓政策,請下面的人閉嘴。這樣的團隊,甭說是好產品,可能連產品都還沒做出來就被終止了。

產品的內容(Content)遠比程序(Process)來的重要,真正的靈魂是內容,不是那些程序。
這跟前一陣子XDiteㄉㄉ寫的文章 也許你該停下來聽聽工程師怎麼說 不謀而合。常見的像是一個只懂得管理進度不在乎內容文化的Project Manager,就很有可能搞爛一整個產品。
當然,反過來說,R&D懂得的內容,也不能僅止於技術部分,而是將需求/人性等納入考量,並以技術的邏輯實現。最後,將文化帶入產品,讓使用者親身感受到。(再次呼應上面,A咖才做的到這些)

真正的懂得內容的人,也才能將產品所需的成本給估算清楚。
有些主管or老闆認為,R&D只是資產,今天寫了這些Code能動就好,不要太在乎架構,進度比較重要。

過一陣子,換了一批新的<del>肝</del>R&D,所花費的維護成本卻高的嚇人,這也是理所當然的,因為前人考量的少,後人就多花點功砍掉重練再加再改。這些成本,都是隱性的,只有從內容的角度去了解,才不會傻傻的花費額外的時間精力,最終導致產品失敗或錯失良機。

Programming將在未來十年大行其道,每個人都該寫程式。
寫程式這件事情是訓練人們的釐清自己的思考。人們寫程式是因為想分享他們的感覺,想用這個工具創造出自己的世界。
1995年的Steve Jobs… 預言了2012年的 Code Year 這趨勢正夯。訪問中也提到了他對未來十年的看法,當時Jobs非常看好網路的發展,認為不管是印表機還是個人電腦都會因為網路而讓整個產業大變動。他還順便裱了一下Micro$oft,說還好網路技術不是被這個不會創新的公司所擁有。最後,他甚至預言,網路會成為未來社交的重要媒介。

今天,2012年,事實證明,Facebook/Twitter,
到後來Apple的 Air Print 都仍然是在他的視野內發展,真的不得不佩服他的先知灼見。


順手打打心得居然三點多了… 剩下想到再補上…

Thursday, October 25, 2012

Update Enterprise Apps for iOS Devices only ONE TAP ! (faster OTA)

We all know that Apple provides a easy way (OTA - Over The Air) to distribute your in-house application through a simple web link like following.
<a href="itms-services://?action=download-manifest&url=http://example.com/
manifest.plist">Install App</a> 
Sure, we can use the same way to update the app. That means we have to send a email or url to our device owner, then they can click it. But in my case, we serve some people who are very busy. Thus we need a faster to update the app.

Usage : 
Simply One Tap on the AutoUpdate Icon


Then the browser will show up and ask you to update the app


How to : 
1. Create a html file with following code

2. Add it to the home screen.
Remember to update the apple-touch-icon link 

Demo:
Use you iOS device browser : http://goo.gl/HNJuV

Download:
ota-test.zip - This zip include the sample app-touch-icon, sample-plist, and sample html.






Wednesday, October 24, 2012

推薦 XCode Plug-in - ColorSense + CodePilot



以目前來說,iOS的Developer大部分都還是使用XCode來做為主要的開發工具。
但只要用過就知道,XCode充滿了許多神祕的問題:
嗯… 其實XCode真的很需要釋出開發Plug-in的API,就算有廣大的回響,官方目前似乎對於這件事情還是沒有什麼反應
一山還有一山高還是有很多高手,弄出了一些好用的Plug-In,也就是今天要介紹的內容。

第一套:ColorSense 

說明
一般我們在Objective-C裡面,時常會使用到UIColor,不過每次都要請視覺設計師大大給或是自己去找詳細的RGBA實在很麻煩。加入這個Plug-In,一個正常的UIColor Syntax(例如: [UIColor redColor]) 上面就會出現色塊,點擊之後就會出現Mac OS X的Color Panel供選擇,非常方便。

上面是我自己的螢幕截圖,身為一個Web Developer,我另外裝了Hex Color Picker,使得我的Color Panel還可以得到Hex值。
安裝方式:
  1. 到官方的Git Repo,下載整個Project (git clone)
  2. 用XCode開啟ColorSense專案
  3. Build ColorSense專案
  4. 重啟XCode
這樣就完成了!!
官方網址(Git Repo) 
https://github.com/omz/ColorSense-for-Xcode

第二套:CodePilot

說明
XCode有自己的一套檔案管理方式,並不是按照實際的資料夾排列,而是使用群組的觀念,讓檔案在開發環境中看起來是整齊的。但是開發久了專案大了,或是加了很多其他Library,還是難免會有找不到檔案的情形。一直都很希望XCode可以像是Sublime Text 2 或是 Alfred 一樣有個快速簡便的尋找檔案方式。於是我找到了CodePilot 這個Plug-in。


以上是截圖。
安裝方式
  1. 將下載下來的檔案解壓
  2. 把 CodePilot2.xcplugin 放到 "~/Library/Developer/Xcode/Third-Party Plug-ins" (目前我是使用App Store抓下來的Xcode 4.5.1)
  3. 重啟XCode
啟動的快捷健是Shift + Command + X (X)
是不是很好找呢~?
官方網址
http://codepilot.cc/

Wednesday, October 3, 2012

[iOS] 在ViewController 之間傳值

在iOS的開發中,我們經常會使用ViewController來控制每一個畫面的行為,
剛開始的時候最常遇到的問題就是


"怎麼在兩個ViewController之間傳遞資訊"
這篇文章中我列出了幾種常見的方法,提供給大家做參考。

1. 透過實體(Instance)傳遞資訊

我們都知道,每一個ViewController 的類別(Class),不管是用Storyboard還是Nib的方式,都要先初始化(alloc + init),然後再透過這些實體(Instance)物件做操作。所以,要在彼此之間傳遞資訊,必須要取得這些實體

如果傳遞的資訊比較簡單,或是傳遞資訊的動作只有一次的時候,透過物件的實體是比較簡單的方式

範例A: 透過 Nib 的方式,取得ViewController2 的實體,傳遞資訊,指定user的值



範例B:在StoryBoard中,透過Segue 取得的實體,傳遞資訊,指定user的值


2.透過單例(Singleton)物件傳遞
透過物件的實體來傳遞固然很方便,但是很多時候,資訊的共享並不只存在於兩個ViewController之間,例如這個應用程式的作者資訊、目前登入者的暫存資料等等,應該是在一個共通的地方,每個人都是去同一個地方存取共通的資訊。這時我們就可以透過Singleton的方式,讓資訊傳遞更簡單。


以下是範例程式碼

Wednesday, September 26, 2012

My Sublime Text 2 Plug-in V2

Sublime Text 2  is one of my favorite plain text editor. It supports hundred of plugin(still growthing) with highly productivity features.

I have listed my plugin on Windows 7 64bit in previous post. This is the updated version of my MacBook Air.

Productivity

  • SublimeLinter
    • automatically show potential error of code after saving 
  • Http Requester
    • Direct request url on new tab
    • [Cmd] + [Option] + [R]
  • LiveReload
    • reload web page directly after saving (need browser extension)
  • DocBlockr
    • Doc block generator 
    • [Tab]
  • AdvancedNewFile
    • Quick folder/file creator, even with path.
    • [Cmd] + [Option] + [N]
  • All Autocomplete
    • Enable all opened file complete
    • [Tab]
  • Gist
  • Terminal
  • SublimeCodeIntel
  • ZenCoding

Code Operation (Align, format, encode)

  • Alignment
  • EncodingHelper
    • Enable reopen file in different encoding
  • HtmlTidy
  • Indent XML
  • JsFormat
  • Prefixr
    • Useful css formatter with prefix complete feature
    • [Ctrl] + [Cmd] + [X]
  • SideBarEnhancements
  • SmartMarkdown
  • Sublime-HTMLPrettify

Syntax & Snippets

  • CSS Snippets
  • EJS
  • HTML5
  • Jade
  • jQuery
  • jQuery Snippets pack
  • jQuery Mobile Snippets
  • LESS
  • Plist Binary
  • Stylus

Saturday, September 22, 2012

Simple one-step web(http) Server


We all know Mac OS has a powerful sharing feature called AirDrop, but it too simple to share to multiple users. Sometimes we really need a simple web server for sharing our static resource, For instance,  HTML file, simple folder,  or some multimedia files.

 
We can use Python on Ubuntu...
Python
Usage : 
$ python -m SimpleHTTPServer [port]

And I have to work under Micro$oft Windows sometimes...
F5 
http://www.getf5.com/

Install : 
Download the F5 application
Usage : 
Simply drag your folder or file into the application, it will shows the browsable URL.


But i prefer nodejs based...
NodeJS 
Simple http server

Install : 
$ npm install simple-http-server -g
Usage : 
$ nserver


Thursday, September 13, 2012

Apple 0912 發表重點


  • iPhone 5
    • A6 晶片處理器
    • 更輕 更薄 (~20%) 雙色 防滑
    • 四吋螢幕 : 326ppi (跟4s一樣) Retina Display
      >> 據聞電池效能也變好了... 希望不要跟The new ipad 一樣熱呼呼又耗電很快
      >> 後來有說電池效能比iphone 4s好一點點
    • 1136*640 解析度  
    • 變長了,多一排App
      >> 長一點 應該可以顯示更多資訊 --> 據說開發者可以很輕易的轉換上去(?)
    • LTE ...
      >> 台灣悲劇了 ... 種花電信...  趕不上時代的政府與公家單位
    • 8百萬像素相機 (3264*2448),低光源,分享Photo Stream(ios6),光圈f2.4
    • 全景照片:兩千八百萬象素(28 megapixel)
    • 1080p 攝影(可以邊錄影邊照)
      >> 看來這一次真的完全超越一般小相機了
    • 新的雙面插頭(8pin) Lightning
      >> 以前的都不能用了?(可以... 會給你轉接頭=_=)
    • 沒有NFC,無線充電

價錢:$199, $299, $399鎂


台灣一樣第三波國家....

  • iOS 6 (很多老梗...)
    • Apple 地圖 - Yelp, 3D地圖
    • iCloud Tab - Mountain Lion 也有
    • Passbook 
    • Siri - 更生活化 人性化 
    • 日期:Sep. 19
    • 版本:ipad 2+ , ipod 4g+,  iphone3gs+
  • iPod + iTunes
    • 新介面
    • FB結合


Friday, September 7, 2012

iOS Developer Enterprise Program How To

Following are steps add a new developer to your iOS Developer Enterprise Program
Blue for Administrator / Green for Developer

1. Add new member 
2. Request certificate by using Keychain Access
3. Approve request
4. Download and install certificates
    Development certificate + WWDR intermediate certificate
5. Admin create provisioning profile (Wildcard & non-wildcard bundle ID)
    Must select new member's name and add devices who can use
6. Download new provisioning profile
7. Select code signing provisioning profile (in XCode)
    > Debug : Wildcard bundle ID
    > Destribution(Release) : Specific bundle ID


Diagram:



Sunday, September 2, 2012

Facebook被盜帳號處理措施123


今天下午連續收到兩位朋友請我"幫忙"收一下Y拍的購物簡訊...

看來這種詐騙方式還是不斷的存在,請大家小心謹慎不要幫忙收簡訊,也不要在奇怪的地方(圖書館, 網咖, 莫名的無線網路...) 登入自己的Facebook. 避免有心人士竊取帳號密碼。

如果發現自己被盜了,請馬上按照以下的方式處理
1. 改密碼
被盜帳號一定有原因,不管如何,避免自己朋友也受騙上當才是上策。
以下是改密碼的步驟~

到Facebook帳號設定

選擇"一般" -> "密碼" 來變更



2. 登出所有其他的連線 (Session)
每一台電腦/手機登入都會有一個連線維持著,讓使用者不會斷線重登入。
這一步驟就是要把除了現在自己登入的連線保留,其他都斷掉。

選取"帳號保安" -> "有效的連線"(Active Session) 並且把其他的裝置/連線全部都登出
新增說明文字

3.增加自己的帳號安全性

參考電腦玩物的這篇教學,學習如何設定以下兩招
  1. 在不同地方登入需要記錄裝置
  2. 登入的時候會寄信到自己信箱(當他人登入時,就馬上會知道)




希望大家能好好的保護自己的帳號,這種詐騙手法在MSN / Google Talk / Facebook 都有,
如果收到"請求幫忙"訊息的時候,請好心的告訴自己朋友喔!




Sunday, August 26, 2012

Mac 新手上路記錄 (App, Widget, Configure)

        剛入手的MacBook Air 13" 

第一天拿到就更新了 OS X 10.8.1,速度很快,非常舒服。

以下記錄一下安裝的東西

首先是Mac Application (免費為主, 付費的... 過陣子再說...)

  • 生產力軟體(Productivity)
    • SizeUp:多視窗管理,很方便(但是會跳Demo視窗)
    • Mou:Markdown 即時預覽編輯器
    • Dash:快速Snippets與文件查詢工具
    • Calendar for Mac:MenuBar上的Calendar - 看的到event! (2012/09/01新增)
  • 瀏覽器(Browser)
    • Firefox
    • Chrome
    • Opera
  • 儲存(Storage)
    • Dropbox
    • SkyDrive:因為有之前活動獲得的25G,所以還是用一下。
  • 開發與編輯器(Development & Editor)
    • Sublime Text:我最愛的純文字編輯器,設定可以參考這篇
    • SmartGit:目前覺得最好用的Git Client (SourceTree把我repo搞爛過...)
    • XCode:iOS Development
  • 多媒體(Mutimedia)
    • 好照片:方便的照片特效處理軟體
    • Skitch:螢幕截圖軟體,附上基本畫筆可以標記
    • KKBox
    • VLC Player (2012/09/01新增)
  • 終端機相關(Terminal)
    • Go2Shell:可以直接在Finder上開啟該目錄的Terminal
    • iTerm:加強版Terminal
  • 社交軟體(Social)
    • Adium:MSN/Gtalk/... 整合即時通訊
    • MenuTab for Facebook:非常棒的Facebook整合
    • TweetDeck:Twitter Client, 管理多帳號的時候很方便(我還有jsdc.tw的帳號...)
    • Skype
    • Line
  • 系統軟體
    • Alfred:好用的快速啟動工具(比Spotlight強大一些 )
    • AppCleaner:自動掃描並乾淨刪除軟體的工具
    • Bodega:類似AppShopper的app分類整理軟體,可以設定Wishlist很方便
    • CCleaner:非常棒的系統清理軟體,會針對安裝的一些軟體清除暫存檔案,PC/MAC都有支援。
    • CheatSheet:按下 ⌘ 幾秒就可以show出該軟體支援的快捷鍵
    • coconutBattery:電池狀態顯示軟體
    • Flux:螢幕亮度自動調整軟體
    • OmniDiskSweeper:磁碟剩餘空間掃描軟體,可找出佔用最大空間的資料夾或檔案
    • Synergy:跨系統多螢幕作業軟體,多台電腦適用
    • Yahoo! KeyKey:中文輸入法
    • ntfsMounter:多系統者必備, 掛載NTFS專用(2012/09/01新增)

另外還有Dashboard Widgets (尚在摸索中)

  • iStat Pro
  • Currency Converter
  • Day Counter
  • HSLider
  • Page Capture
  • PEMDAS
  • Translator

由於從來沒有擁有過MacBook 所以

  • 認真研究了一下快捷鍵(Keyboard Shortcut) 的部份。
還有因為一直改系統配置,不斷的開開關關讓我覺得很煩,所以後來也把


另外記錄一下幾個指令與小秘訣

  • 顯示隱藏檔案指令指令
defaults write com.apple.finder AppleShowAllFiles TRUE
killall Finder

  • 列出安裝的package(.pkg)-- (包裹還是套件阿~~~~~~?
pkgutil --pkgs


  • 螢幕取色
使用內建的DigitalColor Meter 




  • 最後透過MacPorts安裝了常用的一些工具(ex:htop),其他有想到再補。



尚未解決:
想找一套好的Blog編輯軟體,但是還在MarsEdit 3 / Ecto 等等的尋找中...

其他參考
40 Useful Mac OS X Shell Scripts and Terminal Commands

Sunday, May 13, 2012

Dropbox 舉辦的 Dropquest 2012 快速破關

為了容量 …
活動首頁
https://www.dropbox.com/dropquest2012

各關解答…


lv1. 先到Dropbox 的競賽資料夾(Dropquest 2012) 放入46637.txt
lv2. 連接到 https://www.dropbox.com/dropquest2012/CRANE
lv3. SMUDGES
lv4. SOMA
lv5. MAD LIB
lv6. 嘗試以下連結 
https://www.dropbox.com/events?ns=false&n=0&d=1-7-2003
https://www.dropbox.com/events?ns=false&n=0&d=3-21-2005
https://www.dropbox.com/events?ns=false&n=0&d=11-28-2001
lv7. 嘗試以下連結
https://www.dropbox.com/dropquest2012/LEADING
https://www.dropbox.com/dropquest2012/DEALING
https://www.dropbox.com/dropquest2012/aligned
lv8. triumphant
lv9. https://www.dropbox.com/tour/6 邀請 http://goo.gl/VBzx 出現的mail
lv10. 試 MEXICO or Argentina or KOREA
lv11. Southpole
lv12. 到Dropbox去把Chapter 12.txt 還原到上一版https://www.dropbox.com/help 點 "Security and Privacy"
lv14. 拼出答案 - 解答 http://goo.gl/FD9AG
lv15. https://www.dropbox.com/share ,點彩虹
lv17. shanghai
lv18. http://goo.gl/piAHw (用瀏覽器) 把13689號檔案 放到Category 1 剩下放2
lv20. https://www.dropbox.com/dropquest2012/apollo13
lv21. ABUSIVELY
lv22. FACED or MACAU or BADGE or BASED or ADAGE
lv23. Machu Picchu
lv24. colosseum

Wednesday, April 25, 2012

iOS Web 畫面閃爍問題 (CSS 3)


在iOS (iPhone 4s/ iPad 2/iPod Touch) 上測試 Mobile Web的時候出現了閃爍問題
和Team member 花了一段時間發現一個很詭異的問題
狀況
1. 父節點(DIV)因為要做Transition使用了
transform: translate3d(…)

2. 畫面處理完成後,觸動事件將子節點(DIV)的CSS改變
left : *px

就在這個更改子節點的瞬間 iOS 的畫面一定會閃爍一下 測試過了 iPad / iP4s / iPod Touch 都有這問題 但是Android 2.x 4.x 都沒有…

處理方式

原本以為是iOS 的 webkit 在處理特定 position 的 left 造成子節點重畫的問題,
後來想想覺得這 也太基本了吧 不太可能,經過嘗試以及搜尋,發現很多人都有類似問題。

像是StackOverflow 這篇 還有 這篇 他是改 CSS top 導致發生神秘的閃爍事件…

最後使用動態增加translatde3d 並且 reset 的 爛招 解法   

後來將以下的 css 指定給子節點 問題就解決了
transform: translate3d(0,0,0);
-webkit-transform: translate3d(0,0,0);

補充
回家後看到jsconsole/jsbin的作者 Remy Sharp 大大的影片



造成我畫面閃動的原因 應該是跟iOS的硬體加速有關

故需要Reset translate3d …..



真。他x的  上一次遇到這種神秘的問題 是面對高級瀏覽器 IE 6 …………… 



References
http://stackoverflow.com/questions/tagged/translate3d

Thursday, March 22, 2012

Responsive Media Query Quick Reference


Just a reminder which helps me doing responsive design's Media Query.

@media (max-width: 767px)
@media (max-width: 480px) 
@media (min-width: 768px) and (max-width: 979px)
@media (min-width: 980px)
@media (min-width: 1200px)

注意 :上面的順序是有意義的 更改順序會導致CSS被蓋掉

Thursday, March 8, 2012

My Sublime Text 2 on Windows 7 64bit



Sublime, the awesome, amazing editor.
1. Get 64bit portable version
2. Install Package Control
This is the most complex step.
Type Ctrl + ` and enter following python code
import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print 'Please restart Sublime Text to finish installation'
3. Install Packages (All from package control)
  • Alignment
    • Format shortcut – Ctrl + Alt + a
  • BracketHighlighter
  • CoffeeScript
  • Display Functions (Java)
  • Edit History
    • Jump to next/previous edit location
    • Add Key Binding
      • { "keys": ["ctrl+alt+e"], "command": "previous_edit" },
        { "keys": ["ctrl+e"], "command": "next_edit" }
  • FileDiffs
    • Usage
      • Right click on tab (Or use command popup then search “Diff”)
        • Diff with clipboard – Text Diff
        • Diff with another file – Text Diff + Visual Diff Tool
          (KDiff3, WinMerge, DiffMerge…)
    • Install KDiff3
    • Modify Code (file_diffs.py)
      Under WINMERGE 
      if not WINMERGE:
          if os.path.exists("%s\KDiff3\KDiff3.exe" % os.environ['ProgramFiles(x86)']):
              WINMERGE = '"%s\KDiff3\KDiff3.exe"' % os.environ['ProgramFiles(x86)']
          else:
              WINMERGE = '"%s\KDiff3\KDiff3.exe"' % os.environ['ProgramFiles']
      ……
      End of run_diff function
      
      if from_file == 'from_file' or to_file == 'to_file':
                  cmd_line = '%s "%s" "%s"' % (WINMERGE, from_file, to_file)
                  print "KDiff3 command: " + cmd_line
                  Popen(cmd_line)
  • Git
  • HTML5
    • Snippets
  • IndentGuides
    • Indent line for editors
  • jQuery
    • Snippets
  • jQuery Snippets pack
    • Hint : Need enable jQuery support by command
    • Snippets
  • JS Minifier
    • Minify shortcut – Ctrl + Alt + m
  • JsFormat
    • Format shortcut – Ctrl + Alt + f
  • Pretty JSON
    • Format shortcut – Ctrl + Alt + j
  • Prefixr
    • Format shortcut – Ctrl + Alt + x (For CSS)
  • SideBarGit
  • SideBarEnhancement
  • SublimeCodeIntel (Must Have)
    • Autocomplete (Popup)
  • Tag
    • “/”to end tag
    • Format shortcut – Ctrl + Alt + f
    • Features : Edit –> Tag …
  • Terminal
    • Open file shortcut – Ctrl + Shift + t
    • Open folder shortcut – Ctrl + Shift + Alt + t
  • Tortoise
    • Need  TortoiseGit or TortoiseSVN
    • Update : 20120314 - error: [Error 2] The system cannot find the file specified
      • Because TortoiseGit use mysysgit as default Git under Windows 7 64bit version,
        we need to modify Tortoise.py
        class Git():
            def __init__(self, tortoise_proc_path, root_dir):
                self.git_path = os.path.abspath('C:\\PATH\\git.exe')
  • WinMerge
    • Compare shortcut – Ctrl + Alt + d (Current file with previous edit file)
    • Modify Code (WinMerge.py)
      WINMERGE = "F:\WinMerge-2.12.4\WinMergeU.exe"
  • ZenCoding (AWESOME!!)
    • Trigger – Tab
Editor Shortcut
  • Toggle sidebar (file explorer) – Ctrl + K then B
  • Command List - Ctrl + Shift + P
  • File Search – Ctrl + P
    • Search  Text in File – Ctrl + P then enter #searchText
    • Jump to specific paragraph(Function/Class/Tag) – Ctrl + P then enter @searchMethod
    • Go to specific line – Ctrl + P then enter :lineNumber
Right Click Menu Support



  • Modify the Path of following regestries
  • Save following text into a .reg file then double click on it to apply

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\SublimeText]
@="Edit With Sublime Text2"
"Icon"="D:\\WindowsApp\\Sublime\\sublime_text.exe"
"Position"="Bottom"

[HKEY_CLASSES_ROOT\*\shell\SublimeText\command]
@="D:\\WindowsApp\\Sublime\\sublime_text.exe %1"

Tuesday, March 6, 2012

《鐵娘子The Iron Lady》筆記

這篇文章我從Twitter 打到 Tumblr, 從Tumblr 打到 Blogger

昨天才看完電影,今天全憑記憶打,不知不覺就打了好多,部分英文可能有錯就不要太在意了

教育相關

  • 我們要不堅持立場,要不乾脆一事無成
    (We will stand on principle, or we will not stand at all)
  • 過去人們總是努力要完成某件事,現在卻是要努力成為某個人
    (It used to be about trying to do something, Now it’s about trying to be someone)
  • 如果父母總是要求孩子跟自己走一樣的路,那要怎麼要求孩子更傑出?
    > 教育是適性發展,不是要跟隨前人腳步

政治相關

  • 以前政治是關於如何做事,現在是關於如何出名
  • 我們想要一個人民可以自由的選擇、犯錯、持有寬容及同情心的社會。這就是我們所謂的道德社會;不是一個國家要負所有責任,而沒有人須要為國家負責的社會。
  • 假裝我們都是平等的沒有任何好處,我們並不是相同的,從來沒有過,也永遠不會是
  • 人們已經不思考了,他們全憑感覺。一下說我覺得不妥,一下子又說抱歉我們組織覺得如何如何。
    當代最重大的問題之一就是我們被這樣一群人所統治
  • > 一個領導人不能只靠"感覺",要理性地去思考每一步策略.
  • 那些人不是無能,就是懦弱
    > 這是鐵娘子教女兒開車時的話,其實正是暗指當時政客們的狀況
  • 總有人應該面對問題,說出難聽的真相! (對政客說) 你們這些人膽子太小了
  • In politics, If you want anything said, ask a man; If you want anything done, ask a woman

人生相關

  • 生活本來就是自由選擇
  • 思想會化成語言,語言會化成行動,行動會變成習慣,習慣會變成個性,而個性會決定命運!
    我們想甚麼,就會造就自己成為什麼樣的人
    (Watch your thoughts for they become words. Watch your words for they become actions. Watch your actions for they become… habits. Watch your habits, for they become your character. And watch your character, for it becomes your destiny! What we think we become.)
  • 小心你想些什麼,因為它們會從你口中溜出來
    (Watch your thoughts for they become words)
  • 你想改變這個國家(團體/公司),就去領導它
    (If you want to change the party, lead it. If you want to change the country, lead it.)
    > 要堅定立場,做出自己的風格. 還記得某個網路圈的名人曾在FB上說過,如果你不喜歡你的(公司)環境,不是該抱怨,而是該改造它(然後我就按讚)

 

 

最後一句看似簡單但卻意義非凡的話

One’s life must mean more than that.

正適合送給所有正在為自己理性/夢想打拼的人

加油!

Monday, March 5, 2012

Request Https resource (Pass Authentication + Trust All Certificates) in Java

 

A post to remember

  • Request resource from : https://a.b.c.d/test-metadata.xml
    • Trust all certificates (PKIX path building failed)
    • Pass SSL handshake verification (javax SSLHandshakeException)
    • Pass basic (username/password) authentication (401, Authentication Required)

Basic Java Way :

import java.io.*;
import java.net.*;
import java.security.cert.*;
import javax.net.ssl.*;

public class
HttpsRequestClient {
private final String USERNAME = "flyworld"
;
private final String PASSWORD = "mypwd"
;
private final String TESTURL = "https://a.b.c.d/test-metadata.xml"
;

public static void main(String
[] args) {
HttpsRequestClient client =
new
HttpsRequestClient();
switch
(args.length) {
case
0:
client.testURL();
break
;
case
1:
client.testURL(args[0]);
case
3:
client.testURL(args[0], args[1], args[2]);
default
:
client.testURL();
}

}

public void
testURL() {
testURL(TESTURL, USERNAME, PASSWORD);
}

public void testURL(String
url) {
testURL(url, USERNAME, PASSWORD);
}

public void testURL(String testURL, final String name, final String
pwd) {

HttpsURLConnection testConnection =
null
;
try
{
// Trust All HttpsCertificates
SSLContext sc = SSLContext.getInstance("SSL"
);
sc.init(
null, new TrustManager[] { new AllPassTrustManager() }, null
);

// Pass handshake verification
HostnameVerifier myHostnameVarifier = new HostnameVerifier() {
public boolean verify(String
urlHostName, SSLSession session) {
return true
;
}
};

// Configuration
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(myHostnameVarifier);
Authenticator.setDefault(
new
Authenticator() {
protected
PasswordAuthentication getPasswordAuthentication() {
return new
PasswordAuthentication(name, pwd.toCharArray());
}
});

testConnection = (HttpsURLConnection)
new URL
(testURL).openConnection();

printHttpsCertificates(testConnection);
printResponseContent(testConnection);

}
catch (MalformedURLException
e) {
e.printStackTrace();
}
catch (IOException
e) {
e.printStackTrace();
}
catch (Exception
e) {
e.printStackTrace();
}
finally
{
if (testConnection != null
)
testConnection.disconnect();
}

}

private static void
printHttpsCertificates(HttpsURLConnection con) {
try
{
System.out.println("-----Certificates-----"
);
System.out.println("Response Code : "
+ con.getResponseCode());
System.out.println("Cipher Suite : "
+ con.getCipherSuite());
System.out.println(System.getProperty("line.separator"
));

Certificate
[] certs = con.getServerCertificates();
System.out.println("Certificate Number : "
+ certs.length);
for (int
i = 0; i < certs.length; i++) {
Certificate
cert = certs[i];
System.out.println("No : "
+ i);
System.out.println("Cert Type : "
+ cert.getType());
System.out.println("Cert Hash Code : "
+ cert.hashCode());
System.out.println("Cert Public Key Algorithm : "
+ cert.getPublicKey().getAlgorithm());
System.out.println("Cert Public Key Format : "
+ cert.getPublicKey().getFormat());
System.out.println(System.getProperty("line.separator"
));
}
}
catch
(SSLPeerUnverifiedException e) {
e.printStackTrace();
}
catch (IOException
e) {
e.printStackTrace();
}
}

private static void
printResponseContent(HttpsURLConnection con) {
try
{
System.out.println("-----Content-----"
);
BufferedReader br = new BufferedReader(
new InputStreamReader
(con.getInputStream()));
String
input;
while ((input = br.readLine()) != null
) {
System
.out.println(input);
}
br.close();
}
catch (IOException
e) {
e.printStackTrace();
}
}

/**
     * A TrustManager which passes all certificates
     *
     * @see TrustManager
     */
private class AllPassTrustManager implements
TrustManager, X509TrustManager {
public
X509Certificate[] getAcceptedIssuers() {
return null
;
}

public void checkServerTrusted(X509Certificate[] certs, String authType) throws
CertificateException {
return
;
}

public void checkClientTrusted(X509Certificate[] certs, String authType) throws
CertificateException {
return
;
}
}

}

With HttpClient, the testURL method become easier





public void testURL(String testURL, String name, String pwd) {
DefaultHttpClient httpclient = new DefaultHttpClient();
try {
// Trust all https certificates
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, new TrustManager[] { new AllPassTrustManager() }, null);
// Use apache SSLSocketFactory
httpclient.getConnectionManager().getSchemeRegistry()
.register(new Scheme("https", 443, new SSLSocketFactory(sc)));
httpclient.getCredentialsProvider().setCredentials(
new AuthScope(AuthScope.ANY_HOST, 443),
new UsernamePasswordCredentials(name, pwd));
HttpGet httpget = new HttpGet(testURL);
ResponseHandler<String> handler = new ResponseHandler<String>() {
public String handleResponse(HttpResponse response)
throws ClientProtocolException, IOException {
System.out.println("Response Status : " + response.getStatusLine());
System.out.println("-----Content-----");
HttpEntity entity = response.getEntity();
if (entity != null) {
return EntityUtils.toString(entity);
} else {
return null;
}
}
};
System.out.println(httpclient.execute(httpget, handler));
} catch (Exception e) {
e.printStackTrace();
} finally {
httpclient.getConnectionManager().shutdown();
}
}

Reference :


http://www.mkyong.com/java/java-https-client-httpsurlconnection-example/
http://hc.apache.org/httpcomponents-client-ga/examples.html

Friday, February 24, 2012

談創業家與專業經理人

 

這是今天在Twitter上回應了@Deduce大大的一段話

我覺得專業經理人跟創業家有很大的相似點, 只是喜歡的生活型態不同罷了.

這樣講或許有點草率,不過專業經理人和創業家的異同,其實在很多地方都有這類的討論

到底這兩者差在哪?

下圖為 孫易新心智圖法 網站彙整EMBA雜誌第295期文章”創業家和專業經理人有何不同”所得到的心智圖

中午吃飯時順口問了同事對於這兩者之間的看法.

TonyQ:字不一樣(當場毆飛)

Ian覺得這兩者的驅動(Driven)不同, 專業經理人是透過指標(例如股價,效率,收入)來驅動, 創業家是透過目標(創造更好的Todo List, 雲端筆記本, 社群互動…)來驅動. (簡言之:Different motivation)。

這兩者在現今社會也有著非常不同的印象

  • 專業經理人 : 普遍認知為妥善運用目前資源追求極大利益者
  • 創業家 : 普遍認知為尋求偉大夢想的實踐者

加上在執行層面上來說,這兩者的確有非常大的重疊. 甚至有非常多的例子是從專業經理人成了創業家,從創業家到執行長。所以不論是企業管理研究或是創業圈都對這兩者有許許多多的討論與分析。

好多年前在BBS上有轉錄一篇文章, 叫做”天生注定當老闆”(剛剛Google找不到原文…只有許多轉載與片段)
其中提到的創業家特質,很大一部分跟專業經理人所必須具備的特質是一樣的。不過其中也提到創業家與專業經理人天生性格上最大的鴻溝是對於不可測及不確定變數的容忍 (簡言之就是對於風險的容忍程度。)

用一個比喻來說,這兩者就像從不同的登山口,穿戴類似的裝備兩個登山者,不論面對颳風下雨都有著堅忍不拔的毅力,但面對每一個突發狀況的處理方式卻不完全相同。

身為一個創業家需不需要有專業經理人的思維呢 ?

許多巨型企業(如IBM, Manpower)都有一個制度,就是把較為成熟的產品部門或技術團隊,切出去當成Branch。整個Branch的五管(包含支出與收入)都獨立運作責任自付。這造就出了許多十八般武藝樣樣精通的專業領導人才,若這些人離開後,踏上創業路,也往往都能建立起自己的一片天。

剛剛在翻舊文時從我的Evernote發現一篇之前有意思的文章 「專業經理人」比「創業家老闆」更愛錢?其中談到非金錢動機在進場與退場行為中扮演的角色. 這篇文章提供了幾個假設供需要了解分析一間公司的人做參考

ec

其中提出三個假設

  1. 在由專業經理人所掌管的公司裡,「市場經濟吸引力」與「進場可能性」呈正相關的可能性,大於由所有人管理的公司。
  2. 由專業經理人管控的公司,比起由企業所有人身兼經理人的公司,更有可能因為經濟誘因愈小,而提高退出市場的可能性。
  3. 在由專業經理人所管理的公司裡,「市場經濟吸引力」與「公司價格」兩者之間的正向關係,比起在由所有人管理的公司裡更為強烈。

在所謂浪頭上的產業(白話:市場熱錢的聚集處),只有極少部分的公司是由所謂的專業經理人管理。排除企業導師等等的外部協助,身為一個資訊創業者,除了從做中學之外,對於專業經理人的思維與管理態度也必須要有一定程度的狩獵(最常見的切入點是行銷,專案管理,與人力資源管理),否則就算募了一大筆錢或是擁有很好的Business Model,也很有可能被時代的潮流淹沒。

 

去創業好還是去當專業經理人好?

隨著Diablo 3 即將發行,用這張D2圖來解釋最合理也不過

skill

這世界上本來就沒有所謂完美的Career Path, 你想玩什麼就玩什麼,如果現階段的環境無法達到滿足或讓你覺得生活無趣,那代表你需要一點改變了。上述提到的創業家的特質與中山大學創意管理教授劉常勇提出的10D是很可以參考的指標。

基本上,累積自己的價值(點技能)都不會有壞處,但是在有限的資源(例如時間)內如何將這些技能在正確的時間發揮,就是每一個人都需要好好思考的了。