Sean's Note: 3月 2016

2016年3月23日 星期三

在 didFinishLaunchingWithOptions 時不使用 storyboard 直接載入 nib 檔

  
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] ;

     // Override point for customization after application launch.

     MyViewController *test = [[MyViewController alloc]     initWithNibName:@"MyViewController" bundle:nil];
     UINavigationController *nav = [[UINavigationController alloc]  initWithRootViewController:test];
     self.window.rootViewController = nav;

     [self.window makeKeyAndVisible];

     return YES;
  }

2016年3月20日 星期日

Setting Up Environment for PyQt 5 on Mac with Python 2.7

要用 Python 2.7 來開發 Qt 5,需要安裝下列三樣:
  1. SIP 4.17
  2. PyQt 5.5.1
  3. Qt 5

安裝 sip

  1. 下載 sip-4.17.tar.gz
  2. 解壓縮:tar -xf sip-4.17.tar.gz
  3. 切換目錄到 sip-4.17
  4. python config.py,產生 Makefile
  5. make
  6. make install

安裝 Qt 5

本來是用官網的  Online Installer,但選擇下載 Qt 5.6.1 後,不僅要吃 13.06 GiB,還一直卡在某個進度,只先好作罷。改用 Cakebrew 下載 Qt 5.6.0,而且只要 310.7M。

安裝 PyQt 5.5.1

安裝方式和 sip 一樣
  1. 下載 PyQt-gpl-5.5.1.tar.gz
  2. 解壓縮:tar -xf PyQt-gpl-5.5.1.tar.gz
  3. 切換目錄到 PyQt-gpl-5.5.1
  4. python config.py,產生 Makefile
    • 此時可能會有找不到 qmake 指令的錯誤,qmake 在安裝好的 PyQt 路徑下,設定好路徑就行了。export PATH=/usr/local/Cellar/qt5/5.6.0/bin:$PATH
  5. make  (這裡會需要等一下子)
  6. make install
大功告成! 立馬開啟 PyCharm 來試試第一個程式吧!


Ref: http://www.time-eater.net/?p=302

2016年3月14日 星期一

SetEnvironmentVariable VS getenv

最近發現一個奇怪的現象,
就是在 VS 的 cpp 裡呼叫 SetEnvironmentVariable 設定環境變數,
但從 Python code 裡印出 os.osenviron 卻看不到所設定的變數,
一查才發現,Python 裡的 os.osenviron 是用 getenv實作的。
GetEnvironmentVariable/SetEnvironmentVariable 是 Windows API,
而 setenv/getenv 是 CRT 函式。CRT 在開始的時候便會透過 Windows API GetEnvironmentStrings 將回傳值存入自己的資料結構之下(EX: MSVCR80!environ),
而此後 getenv 便是對這份副本做操作。

結論就是不要混用 SetEnvironmentVariable 和 getenv 啊!!

Ref:
  1. https://bugs.python.org/issue16633
  2. http://blogs.msmvps.com/senthil/2009/10/13/when-what-you-set-is-not-what-you-get-setenvironmentvariable-and-getenv/

2016年3月12日 星期六

System permissions

Android 從 6.0 (API Level 23)開始,把 System permissions 分成了兩類 normal and dangerous permissions。

Normal Permissions 

這類的權限對使用者的隱私或對其他 APP 的操作有極小的影響,所以這類的權限僅需要宣告在 AndroidManifest 裡,在安裝期間系統自然會賦予這些權限給 APP。
  • ACCESS_LOCATION_EXTRA_COMMANDS
  • ACCESS_NETWORK_STATE
  • ACCESS_WIFI_STATE
  • BLUETOOTH
  • BLUETOOTH_ADMIN
  • CHANGE_NETWORK_STATE
  • CHANGE_WIFI_MULTICAST_STATE
  • CHANGE_WIFI_STATE
  • EXPAND_STATUS_BAR
  • INSTALL_SHORTCUT
  • INTERNET
  • KILL_BACKGROUND_PROCESSES
  • MODIFY_AUDIO_SETTINGS
  • NFC
  • SET_ALARM
  • SET_TIME_ZONE
  • SET_WALLPAPER
  • SET_WALLPAPER_HINTS
  • UNINSTALL_SHORTCUT
  • USE_FINGERPRINT
  • VIBRATE
  • WAKE_LOCK
... 等等。

Dangerous permissions

這類的權限對使用者的隱私或對其他 APP 的操作有潛在的影響,所以這類的權限不僅需要宣告在 AndroidManifest 裡,在執行期間,還需要經過使用者的同意。以下的 Permission groups 都是屬於 dangerous permission 的權限:
  • CALENDAR
  • CAMERA
  • CONTACTS
  • LOCATION
  • MICROPHONE
  • PHONE
  • SENSORS
  • SMS
  • STORAGE
Ref: