2015年12月21日 星期一

[開箱] Microsoft 明星商品禮盒包 - 萬用折疊式鍵盤 - 設計師藍牙滑鼠

年底聖誕節即將來臨,公司工作也總算告一段落,終於可以來整理一下舊電腦的資料,但無奈時間太久沒有整理,而且 MAC 主力 SSD 硬碟也快被佔滿,加上一直想找個合適的鍵盤來在 iPad 上面工作者作,這樣有些文書工作就可以專心移到 iPad 上面處理了!

上了 PCHOME 24H 逛了一下,剛好看到微軟的藍芽鍵盤滑鼠組在特賣,感覺也蠻適合攜帶的,就先敗了一組,等到假日有時間了再來進行開箱作業!


收到的盒子包裝非常精美,而且有獨立的塑膠袋密封起來,送禮或是自用感覺都非常方便,可以很明顯感覺到現在很多包裝都效法了 Apple 的包裝手法,要讓使用者在收到產品的時候,能夠有感覺到產品在包裝上也是也下過一番苦心的!這點在這個產品的包裝上也感覺得到,在推出內盒包裝後可以看到滑鼠在最上層,將滑鼠取出並不會很困難,不需要將盒子倒過來也取得出,而滑鼠下方就是鍵盤包裝盒,可以看到由於鍵盤包裝盒較小,在右側和下方又各加了一條小紙盒來把空間填滿,但也由於它填滿了空間,也沒準備方便讓使用者取出鍵盤包裝的設計,這次就真的要倒置才拿得出來了!希望下次這種小細節微軟也能注意到才是!



首先來將鍵盤包裝打開,盒蓋上標示著簡易的使用步驟,基本上算是清楚明瞭,淺顯易懂,可以看到鍵盤上夾著一張紙,方便使用者將鍵盤取出,這個設計就有想到,前面怎麼忘了呢~







鍵盤包裝盒中間應該是規格說明書+產品指南+品質保證書,對一般使用者並不太重要,可能都會被直接丟棄或是收進抽屜,但我原以為他們只是簡單被圈在一起而已,沒想到那個圈住的透明塑膠圈居然被黏在盒子上,雖然使用者是可以抽出來,但黏住我就搞不懂為什麼了!因為變不好拿了!失敗~

在包裝上著墨這麼久,我們來檢視一下主角之一的鍵盤,整體大小大約是 iPad Air 一半小一點,本體使用 mini-usb 當作充電接口,產品本身無開關設計,基本上只要闔上就是關機,打開就是開機,很簡單的設計,本身支援配對兩個不同裝置,系統支援 Windows/Android/iOS ,身為專為行動設計的鍵盤,這三種系統是一定要通吃的啦~按鍵上由於需要支援折疊,中間的按鍵大小部分有調整一下,使用上需要稍微熟悉一下,但不至於太困難適應便是!



左側鍵盤上方配置為 Esc/裝置 1/裝置 2/靜音/聲音調小/聲音調大 六個按鍵,右側為前一章(倒轉)/播放/後一章(快轉)/搜尋/鎖定/作業系統切換 六個按鍵。左側下方依序為 Ctrl/Home/Alt(Option)/Fn(Cmd)/空白,右側下方依序為 空白/Alt(Option)/四個方向鍵,基本上我個人覺得配置的還可以,並不會需要花太大的力氣去熟悉,因為大部分的相對位置還是一樣的!



實際與 iPad 連線測試,配對只需要輸入配對號碼就完成配對了!曾經使用過藍芽相關裝置的人應該都不陌生,打字的反應速度我覺得很及時,並不會有延遲的感覺,所以輸入起來感覺還不錯!鍵盤按鍵觸感不錯,不會有太生硬的感覺。

目前我只需要解決自己第一次在 iPad 上面寫文章遇到的一些鍵盤操作問題(切換輸入法/特定標點符號輸入~),其他鍵盤在使用上並無遇到太大的問題!還不賴!

再來來看看另一個主角滑鼠,它的面積寬度和長度大約就是鍵盤折疊起來後的一半,厚度一定和鍵盤沒得比的,但它電池蓋有個我目前我第一次看到的設計,就是磁吸式的電池蓋',換電池只需將滑鼠下方突起處下壓,就可以從上方將電池蓋取出,更換完畢後也只需吸回去就可以了!這設計真方便~大大加分!目前唯一扣分的大概就是上方滾輪了,它有一點緊,所以手感上沒那麼順,由於造型也已經朝扁平發展,當然手握感就比較沒有那麼扎實,使用上感覺有一點怪怪的,但還可以接受就是了!







滑鼠比較沒有著墨太多是因為其實除了電池蓋設計比較特別,其他都還好!一樣都是無線藍芽滑鼠,它羅技的滑鼠差異實在是不太大!電池的續航力就要靠時間來測試了!

話說這篇文章就是我第一次在 iPad 上面寫的!我還蠻滿意的!
打完後的感想:果然簡單的文書處理真的不需要在電腦上完成,在平板上如果有程式可以完成一樣的作業,為什麼我們要在電腦上作業?


2015年10月17日 星期六

[筆記] 變更預設使用 Xcode server/wiki/網站 的順序 Part 2

很久以前寫過一篇 「變更預設使用 Xcode server/wiki/網站 的順序」文章,介紹了怎樣把 Xcode server、wiki、網站的顯示順序變更,但好景不常,它…沒用了!

照著文章不管我怎麼調整,Xcode server 依舊先顯示了出來,所以只好來研究一下新版的伺服器做了什麼好事!畢竟都是基於 Apache 設定修改出來的,應該可以找到以前熟悉的東西!

首先找到網頁伺服器的設定目錄 "/Library/Server/Web/Config/apache2",看了一下目錄裡的檔案,有一個 ReadMe.txt 文字檔,先打開來快速瀏覽一下,Apple 也沒偷懶,這文件有重新寫成他們修改後的說明,裡面看到 Apache 的主要設定檔已改成 "httpd_server_app.conf" 了,所以問題看起來要在這裡面看看了!

先快速瀏覽一次檔案,直覺上看起來就是如果網頁伺服器服務打開,那伺服器就會把 "/Library/Server/Web/Config/apache2/sites/" 裡面的設定檔讀進來,如果網頁伺服器服務關閉,那伺服器就只需要把 "virtual_host_global.conf"、"0000_127.0.0.1_34580_.conf"、"0000_127.0.0.1_34543_.conf" 三個設定檔照順序讀進來。

先來來看看 "/Library/Server/Web/Config/apache2/sites/" 這個目錄裡面到底賣什麼藥,裡面的東西如下:
server:sites user$ ls -al
total 128
drwxr-xr-x  18 root  wheel   612 10 16 23:48 .
drwxr-xr-x  40 root  wheel  1360 10 16 23:50 ..
-rw-r--r--@  1 root  wheel  1583 10 16 23:48 0000_127.0.0.1_34543_.conf
-rw-r--r--   1 root  wheel  2256 10  4 08:14 0000_127.0.0.1_34543_.conf.default
-rw-r--r--@  1 root  wheel  1583 10 16 23:35 0000_127.0.0.1_34543_.conf.prev
-rw-r--r--@  1 root  wheel  1254 10 16 23:48 0000_127.0.0.1_34580_.conf
-rw-r--r--   1 root  wheel  2392 10  4 08:14 0000_127.0.0.1_34580_.conf.default
-rw-r--r--@  1 root  wheel  1254 10 16 23:35 0000_127.0.0.1_34580_.conf.prev
-rw-r--r--   1 root  wheel  2172 10  4  2014 0000_any_443_.conf.default
-rw-r--r--   1 root  wheel  5778 10  4 08:14 0000_any_443_.conf.orig
-rw-r--r--@  1 root  wheel  5778  9 10 09:11 0000_any_443_.conf.prev
-rw-r--r--   1 root  wheel  2307 10  4  2014 0000_any_80_.conf.default
-rw-r--r--   1 root  wheel  3978 10  4 08:14 0000_any_80_.conf.orig
-rw-r--r--@  1 root  wheel  3978  9 10 09:11 0000_any_80_.conf.prev
-rw-r--r--@  1 root  wheel   282 10 16 23:48 virtual_host_global.conf
-rw-r--r--   1 root  wheel   301 10  4 08:14 virtual_host_global.conf.default
-rw-r--r--   1 root  wheel   301 10  4 08:14 virtual_host_global.conf.orig
-rw-r--r--@  1 root  wheel   282 10 16 23:35 virtual_host_global.conf.prev

server:sites user$ ls -l *.conf
-rw-r--r--@ 1 root  wheel  1583 10 16 23:48 0000_127.0.0.1_34543_.conf
-rw-r--r--@ 1 root  wheel  1254 10 16 23:48 0000_127.0.0.1_34580_.conf
-rw-r--r--@ 1 root  wheel   282 10 16 23:48 virtual_host_global.conf
的確,修改一下網頁伺服器「索引檔案」實驗一下,每次修改索引檔案順序的時候,這三個檔案都會有新的版本。 看看檔案內容中,DirectoryIndex 真的有修改成我修改的順序,但是怎麼還是有問題?再次仔細看看內容,埠號好像怪怪的,埠號34543 似乎對應了埠號 443 的變更,埠號 34580 對應了埠號 80 的變更!怎麼會變得這麼奇怪呢?那其他的檔案有用嗎?上網拜一下谷歌大神,原來其他的檔案是舊版本使用的,從 Server 5.0.4 之後,就做了這個修改!那...只好來看看伺服器在什麼時候做了轉址的事了!

根據搜尋到的參考文章[1],知道有個 "/Library/Server/Web/Config/Proxy/apache_serviceproxy.conf" 需要關心一下,打開檔案來看看,在 "virtualhost" 裡面,看到它又參考了 "/Library/Server/Web/Config/Proxy/apache_serviceproxy_slash_default*.conf",而對應的目錄裡面只有 "apache_serviceproxy_slash_default.conf" 這個檔案,一打開它就知道應該是找到了!因為可以看到下面這些設定:
RewriteCond %{ENV:DEFAULT_SITE} =YES
RewriteCond %{ENV:WEBDAV_REQUEST} =NO
RewriteCond %{ENV:XCODE} -f
RewriteCond %{ENV:WIKI} -f
RewriteCond %{ENV:WEB} -f
RewriteRule "^/$"  "%{ENV:proto}://%{SERVER_NAME}/xcode" [R,L,E=nocache:1]

RewriteCond %{ENV:DEFAULT_SITE} =YES
RewriteCond %{ENV:WEBDAV_REQUEST} =NO
RewriteCond %{ENV:WIKI} -f
RewriteCond %{ENV:XCODE} -f
RewriteRule "^/$"  "%{ENV:proto}://%{SERVER_NAME}/wiki" [R,L,E=nocache:1]

RewriteCond %{ENV:DEFAULT_SITE} =YES
RewriteCond %{ENV:WEBDAV_REQUEST} =NO
RewriteCond %{ENV:XCODE} -f
RewriteCond %{ENV:WEB} -f
RewriteRule "^/$"  "%{ENV:proto}://%{SERVER_NAME}/xcode" [R,L,E=nocache:1]

RewriteCond %{ENV:DEFAULT_SITE} =YES
RewriteCond %{ENV:WEBDAV_REQUEST} =NO
RewriteCond %{ENV:WIKI} -f
RewriteCond %{ENV:WEB} -f
RewriteRule "^/$"  "%{ENV:proto}://%{SERVER_NAME}/wiki" [R,L,E=nocache:1]

RewriteCond %{ENV:DEFAULT_SITE} =YES
RewriteCond %{ENV:WEBDAV_REQUEST} =NO
RewriteCond %{ENV:WIKI} -f
RewriteRule "^/$"  "%{ENV:proto}://%{SERVER_NAME}/wiki" [R,L,E=nocache:1]

RewriteCond %{ENV:DEFAULT_SITE} =YES
RewriteCond %{ENV:WEBDAV_REQUEST} =NO
RewriteCond %{ENV:XCODE} -f
RewriteRule "^/$"  "%{ENV:proto}://%{SERVER_NAME}/xcode" [R,L,E=nocache:1]
這裡簡單來說就是它會根據目前的伺服器設定來決定要重新導向到什麼位置去,由於我啟用了 web + wiki + Xcode Server,所以如果瀏覽的網址上沒有指定位置或檔案,會直接導向至 Xcode Server!看起來這裡就是我的問題所在了!

另外從 "apache_serviceproxy_slash_default.conf" 這個檔案的時間來看,這個檔案似乎不會被更改,因為一直維持在我更新 Server 程式的時間,但未來 Apple 會不會再更新修改它,這就不掛保證了!

將 "RewriteRule "^/$" "%{ENV:proto}://%{SERVER_NAME}/xcode" [R,L,E=nocache:1]" 修改成 "RewriteRule "^/$" "%{ENV:proto}://%{SERVER_NAME}/" [R,L,E=nocache:1]" 之後重新開機完成修改(對!是重新開機,重開網頁伺服器看起來沒辦法~殘念!)

來來回回加上寫這個記錄也花了兩小時,Apple 真是讓人家傷腦筋阿!

Reference:
[1] Server 5.0.4 Default Ports Changes

2015年10月1日 星期四

[心得] 看不到的「我的照片串流」和「iCloud 照片共享」使用限制

今年暑假期間全家去南臺灣玩的時候,與老婆用 iPhone 6 和 iPhone 6 plus 拍了很多照片,由於帶了兩個小拖油瓶,當我抱著孩子的時候,自然不可能拿出我的手機出來拍攝,照片便是會存在老婆手機裡,反之亦然!

而且旅途中總是要跑很多的景點,所以就會有很多機會可以趁拉車的時候,做一些美美的照片拼貼,但問題來了,因為是使用不同的 Apple ID 帳號,所以我拍攝的照片並不會串流至老婆的手機上,老婆拍的當然也不會在我的手機上,所以當下實驗起了  iCloud 照片共享!

Apple 設計的使用方式挺簡單,使用方法不多說,超多教學文章可以參考,這裡要提的是使用上的限制。

Apple 的「照片串流」和「iCloud 照片共享」都受的 iCloud 的限制條件影響,iCloud 會限制每小時、每天或每個月內可以上傳至「照片串流」或「iCloud 照片共享」的照片數量,以防止不小心或濫用的情況,我幫忙整理如下:

「我的照片串流」上傳限制:
  • 每小時上傳到「我的照片串流」:1000 張照片
  • 每天上傳到「我的照片串流」:10,000 張照片
  • 每月上傳到「我的照片串流」:25,000 張照片
「我的照片串流」中的相片會存放 30 天,但是為了節省儲存空間,iPhone、iPad 和 iPod touch 只會在「我的照片串流」相簿中保存最近 1000 張照片,所以最好還是同步回家裡的電腦,比較不會遺失重要的照片!

「iCloud 照片共享」上限:
  • 每個共享相簿每小時來自所有協作人的照片和影片總數上限:1000
  • 每個共享相簿每天來自所有協作人的照片和影片總數上限:10,000
「共享相簿」總共可容納 5000 張(部)照片和影片,由於是分享 iCloud 上面的照片,並不會與「我的照片串流」上傳限制互相干擾!大概只要記得一小時內不要分享太多照片就好了!

另外「共享相簿」有一些額外限制:
  • 持有人可分享的共享相簿數量上限:100
  • 使用者可訂閱的共享相簿數量上限:100
  • 每個共享相簿的訂閱者人數上限:100(每個共享相簿的訂閱者人數)
  • 每個共享相簿來自所有協作人的照片和影片總數上限:5000
  • 共享相簿每一照片或影片的評論數量上限:200(評論可以是按「讚」或文字輸入)
  • 每則評論的字元數上限:200
  • 共享相簿持有人每日可傳送的邀請數量上限:200
很好玩的是 Apple 把這些限制分散在三個文件裡面,像是我老婆這種一般人,怎麼可能會去一堆文件中翻出這資訊來看!不過正常使用上我還沒遇過達到限制這種問題,大概要超重度使用者才會很容易踩到吧!

但其實…最容易遇到的是啟用了「iCloud 照片圖庫」之後,系統自動備份「照片」+「影片」至 iCloud 中,發生「空間不足」的問題,這 Apple 給的小小 5GB 免費空間怎麼夠用,但這個又是該用另一篇文章發表牢騷了!

參考連結:
「我的照片串流」FAQ
iCloud 照片共享 FAQ
iCloud 照片圖庫 FAQ
我的照片串流和 iCloud 照片共享限制

2015年9月9日 星期三

[教學] 簡單一行指令啟用第三方 SSD Trim 支援

話說因為我的 Mac mini server 硬碟損壞,在經過一番折騰後,終於把硬碟拆下並換上新的 SSD,但第三方硬碟安裝完畢後就算復原系統,Trim 的支援也是不會打開的,在 Yosemite 10.10.3 (包括 10.10.3),需要輸入一大串指令才能啟用 Trim,但在 Yosemite 10.10.4 之後,Apple 提供了一個新的指令 "trimforce" ,只要一行指令就可以完成過去所有的麻煩事了!
MacUser:~ sudo trimforce enable
之後所有的問答都選擇 Y,在自動重新啟動之後就可以至 關於這台 Mac > 系統報告… > SATA/SATA Express 中看到 Trim 啟用囉!

參考資料:
TRIM Enabler for OS X Yosemite 10.10.3

2015年8月24日 星期一

[教學] 簡單八個步驟幫你從 Perforce 搬家到 Git

由於公司主要的程式碼都是存放在 Perforce Server,但是因為公司開發部門橫跨兩岸,台北的部門常常需要與放在上海的 Perforce Server 連線,而且非常不幸,雙方連線非常不穩定,甚至已經嚴重到影響台北公司出版本給客戶了!

為了之後方便不要這麼的依賴與伺服器的連線品質,決定使用分散式的管理系統 Git 來解決這個問題!原來的連線問題當然還是無法解決,但是至少不會再因為只能存取上海伺服器而造成出版本的困擾!

安裝環境:Windows XP
安裝步驟:
1. 安裝 Git 1.9.5,安裝過程中變更選擇至 "Use Git from the Windows Command Prompt",其餘項目使用預設值
$ git config --global user.name "[使用者名稱]"
$ git config --global user.email "[電子郵件信箱位址]"
2. 安裝 Python 2.7.10,並選擇加入路徑 PATH
3. 安裝 Perforce Command Line Tools
4. 新增 P4CLIENT 至 Windows 環境變數,可以使用你目前使用的 P4 Client 或是建一個新的
5. 下載 git-p4.py
6. 將下載回來的 "git-p4.py" 更名為 "git-p4" 並複製至 "C:\Program Files\Git\libexec\git-core\" 目錄下,取代原來的 "git-p4"

恭喜!到這個步驟如果沒遇上任何問題,基本上環境已經搭建完成了!再來請你這麼做:
7. 先使用 P4V 登入 Perforce Server [很重要!]
8. 透過下列命令將 P4 全部的變更都同步進 Git 中:
$ git p4 clone "[P4 專案目錄]@all" "[下載回來要產生的 Git 目錄名稱]"

等待指令完成後,就會有一個包含所有 Perforce server 紀錄的 Git 程式庫了!
下次再來分享同步資料變更回 Perforce server 的一些甘苦談吧!

其他相關的指令請服用官方文件 git-p4 !

參考資料:
从Perforce到Git的迁移
How to set up git-p4 in Windows
Support for perforce
Git with Python support?

2015年7月7日 星期二

[筆記] iOS 使用 Sending Messages 該注意的小細節

今天遇到一個 Crash 的問題,是呼叫關於 Sending Messages 這系列的 API:
- performSelector:
- performSelector:withObject:
- performSelector:withObject:withObject:

一開始也是一頭霧水,一樣請出大神拜一下,在 stackoverflow 找到了解答!

文章提到,根據 Apple 文件上的記載:
「For methods that return anything other than an object, use NSInvocation.」

也就是說當你呼叫這系列 API 的時候,請記得如果你呼叫的介面並不回傳物件,而是其他像是 BOOL, NSInteger...之類的型別,那就要改使用 NSInvocation 來解決你的需求!

這是我遇到的狀況就是回傳 BOOL 型別,我一開始根據某篇一樣在 stackoverflow 的文章(我已經忘記連結了),認為這系列的 API 會將 BOOL 包裝成 NSNumber 物件,所以我哏開心的把公司程式中的邏輯變更掉,結果 QA 回報說會 Crash,真是踩到了地雷阿!

NSInvocation 是用起來也不困難,另有一篇 stackoverflow 的文章寫了一個範例,這裡把它列出來做個記錄:
SEL selector = NSSelectorFromString(@"someSelector");
if ([someInstance respondsToSelector:selector]) {
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:
                                [[someInstance class] instanceMethodSignatureForSelector:selector]];
    [invocation setSelector:selector];
    [invocation setTarget:someInstance];
    [invocation invoke];
    float returnValue;
    [invocation getReturnValue:&returnValue];
    NSLog(@"Returned %f", returnValue);
}

在沒有去看文件的狀況之下,這的確蠻容易被忽略的~畢竟不管它似乎也好像是對的!但這就是隱藏地雷阿!

所以不要再一股腦兒用 performSelector 了!記得也要根據實際狀況變更呼叫的 API!

參考資料:
How to return any type value like -performSelector?
Return value for performSelector:

2015年6月24日 星期三

[教學] Mac 新版「照片」程式隱藏功能,變更程式預設的「照片圖庫」儲存位置

如果你跟我一樣,使用 Mac 已經好幾個年頭了,應該不可能沒有使用過 iPhoto 或是 Aperture 來管理和編輯自己的照片吧!

新版的「照片」程式已經出來很久,但是一直都沒時間好好使用它,原因在於我不知道怎麼切換程式預設的「照片圖庫」儲存位置!今天終於看到官方於四月二十四釋出的教學文章,就稍微為大家介紹一下!

請大家根據下列步驟來指定系統的「照片圖庫」:
  1. 離開「照片」程式
  2. 請按著option按鈕然後執行「照片」程式。其中一個「照片圖庫」已經被指定為系統的「照片圖庫」了!
  3. 在其中選擇一個想要作為系統「照片圖庫」的圖庫
  4. 等到「照片」程式將圖庫打開之後,在在上方選單中選擇「照片」=> 偏好設定,點選「一般」頁籤
  5. 點選「作為系統照片圖庫」按鈕

做完這些步驟,恭喜看倌,下次再執行「照片」程式就會自動切換到設定的「照片圖庫」了!

參考資料:Designate a System Photo Library in Photos

2015年6月11日 星期四

[教學] 如何取出 VMware Tools 裡面預設的驅動程式

最近因為需要做簡易版 XP,方便快速架設所需要的模擬環境,所以研究了一下 nLite這套免費工具,這真是一套非常好用的軟體,有興趣的朋友可以搜尋相關的介紹。

但是當精簡的太誇張的時候,可能會造成連驅動程式都找不到,這時候就會想要將 VMware Tools 裡面用來安裝的驅動程式抽取出來,再嵌入至光碟檔中了,還好官方有提供提取的方法,這裡就幫大家介紹一下:
1. 將 VMware Tools ISO 檔載入虛擬 CD/DVD 光碟機中〈舉例來說載入後為磁碟 D〉
2. 在磁碟 C 下面建立一個名為 Extract 的目錄
3. 啟動命令模式並將磁碟機切換至磁碟 D
4. 執行下列命令:
setup.exe /A /P C:\Extract

5. 如果有視窗彈出要求輸入安裝或抽取位置,請輸入在步驟 2 產生的目錄 Extract
6. 當程序完成,請點選結束
7. 瀏覽 C:\Extract 目錄來讀取抽取的驅動程式

原文網址:Extracting the drivers from VMware Tools bundled with VMware Workstation

2015年6月10日 星期三

[筆記] 一個簡單的方法來偵測使用者是否開啟 Window 10 的 Tablet Mode


Windows 10 即將在 7/29 上市,維護產品相容性的責任自然而然就會被降臨在工程師頭上,尤其是 OEM 測試到的問題竟更是推託不掉!

最近回報了一個問題,說是我們的產品在 Windows 10 上的 Tablet Mode 有操作上問題,請我們這裡查清楚並解決它!老實說我們的產品並不支援平板操作阿!OEM 的老大你們是在哀號什麼意思的阿?

好吧!既然問題都來了,就來操作看看倒底是發生了什麼事情吧!取得 Windows 10 環境並研究如何開啟 Tablet Mode 之後發現,原來這個模式不能做「復原視窗化」的動作!

Tablet Mode 可以參考下面這段影片展示:


什麼是「復原視窗化」的動作?就是在程式視窗最大化之後,按下位於關閉的按鈕左邊的鄰居,這時候就是做「復原視窗化」的動作,讓程式回到視窗模式!但 Tablet Mode 強迫所有的程式都執行在最大化或是最小化,是沒有視窗模式的!而我們的程式在回到視窗的時候對介面做了一點小手腳,造成了使用者操作的問題!

屁話一堆,那怎麼偵測現在當前是否開啟了 Tablet Mode 呢?

首先從 Windows message 分析:

當啟動或關閉 Tablet Mode 時候,程式會收到 WM_SETTINGCHANGE 的訊息,並且透過這個訊息告訴程式說:系統的 UserInteractionMode 這個設定改變囉!
從 WinRT 的  windows.ui.viewmanagement.h 中可以找到這個設定相關的物件,但是我們的程式不是 UAP,這條路似乎不通,只好另謀方法!『實際上這裡我是寫了一個測試程式,寫完在連結的時候找不到對應的 GUID 連結,估計大概是不知道哪裡設定錯誤了,以至於連結不到對的 Library,有鑑於也沒有 MSDN 可以查詢,暫時先跳過!但如果可以連結個到對應的 GUID,我'想物件應該是拿得出來的!』

利用 ProcessMonitor 觀察系統做了些什麼改變:

首先當然一開始會錄到一堆雜七雜八的變動,但我們知道微軟的 SHELL 應該跟 Explorer.EXE 比較有關係,所以在經過一陣大過濾後,終於將記錄降低至可以搜尋的狀態,也才終於看到一個非常面熟的值「TabletMode」,位置如下:
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\ImmersiveShell]
"TabletMode"=dword:00000000

經過測試,這個鍵值的確可以拿來判斷目前使用者是否有啟用 Tablet Mode,但有個不幸缺點是它並不在訊息 WM_SETTINGCHANGE 接收到的時候就已經修改完畢了,所以在接收到 WM_SETTINGCHANGE 的時候去詢問它會拿到錯誤的值,如果要正確一點,可以透過 RegNotifyChangeKeyValue() 這個方法去監控這個鍵值,程式就可以反應使用者的選擇而改變介面的外觀,我相信雖然這是可行的辦法,但應該不是正解,如果有更正確的方法,麻煩請賜教,我會相當感激的!

好了,這就是目前的 Workaround 解法囉! 希望不會誤導大家!

2015年5月25日 星期一

[教學] 用小程式協助 Windows 8.1 斷線自動重播

買了電視後,把 GB-BXI3H-4010 這部沒有接螢幕的小電腦移至客廳,由於家裡網路佈線的問題,我只能將 GB-BXI3H-4010 直接接到中華的光世代小烏龜上,所以就只能使用撥接上網了!

但問題才剛剛開始,不像過去的版本,Windows 8.1 的系統沒有預設的功能支援開機就自動撥接上網,只好上網求助 Google 大神!問的人不少,所以這方面的問題微軟也有官方的解決方法提供!在實際操作之後發現微軟提供的解決方案比較可靠並可行!其他的方法不是有問題就是不直覺,有興趣的請拜讀「如何才能在 Windows 8 啟動時,自動撥號上網且不需手動關閉視窗呢?(一點通系列)」。

微軟的解決辦法大概就是寫個撥接的批次檔,設定在作業系統「開始」的時候執行該撥接批次檔,藉以解決開機自動撥接上網的問題!算是很直覺的解決方法!

解決了第一個問題後,第二個問題就是怎麼在斷線後自動撥接,再次請教 Google 大神發現,原來在 Windows 8.1 之後,微軟把以前系統支援的斷線後重播的功能拿掉了!

怎麼辦?中文的討論串有很奇怪的解決方法,而且很少資料,看來只好轉戰國外的搜尋結果!把關鍵字換成英文搜尋,在用我緩慢的腦袋翻譯過濾資訊後,找到了一篇文章解決了斷線重播的問題!想看原文的可以點過去看看!

網路上最常看到的方法不外乎就是寫一個批次檔來偵測網路狀況來重新撥接,而我找到的文章裡面它的方法是「使用第三方撥接程式 Reconnect 1.5」。既然都要寫小程式來偵測了,那灌個程式也是剛好而已!
這個程式雖然介面是英文的,但是其實很好理解而且也很方便!
一、它會自動抓到已經設定完成的寬頻連線,帳號密碼自動帶入程式!
二、支援自動斷線重播,可以設定重播間隔和重試次數!
三、可以設定開機後自動執行,開機後自動撥接(這部份我沒使用也沒測試,因為我已經先套用了微軟的解決方案)。
四、可以記錄連線狀況。
五、連線後自動最小化,總是在最上層視窗顯示。
六、可以設定自動斷線時間或自動關機時間!(這應該不太實用)

另外我發現這個程式已經找不到原始開發網站了,估計這也是以前寫給舊的作業系統用的程式!所以既然新的作業系統也可以使用,那當然就可以回頭找其它的舊的撥接程式來給 Windows 8.1 使用!

我現在怎麼使用?當然就是拿找到的這個程式先用囉!畢竟安裝了之後就可以自動解決我的問題!讓我管理家裡六部電腦的生活更簡單囉!

檔案下載位址:ReConnect 1.5

2015年5月20日 星期三

[筆記] Mac 一定要知道的顯示隱藏檔案的小技巧


由於預設 Mac 會隱藏不少檔案,尤其是以小數點開頭的目錄或是檔案也一律不會顯示,在給客戶檔案的時候,這些檔案都會困擾客戶,那難道我們就沒辦法讓它顯示出來嗎?

其實方法是有的,只是非常的不友善!
使用下列兩個指令在終端機上就可以達成:
$ defaults write com.apple.finder AppleShowAllFiles YES;
$ killall Finder /System/Library/CoreServices/Finder.app

第一個指令變更 Finder 控制顯示檔案的隱藏設定設定為顯示。
第二個指令砍掉 Finder 讓它自動重啟並套用剛剛做的變更。

參考資料裡面有教你怎麼少打一些字做到這件事,但是我覺得...反正複製貼上也很方便,我就先記錄到這樣就可以了!

參考資料:
Quickly Show/Hide Hidden Files on Mac OS X Mavericks & Yosemite

2015年5月15日 星期五

[筆記] 34 個好用的 iOS 應用程式設定擋 info.plist 設定

我想最早的文章應該就是:應用程式的設定檔info.plist
這裡再分享一次並針對這些鍵值做一些整理!一定要看到後面啊!
1.
鍵名:UIApplicationExistsOnSuspend
顯示的名稱:Application does not run in background
說明:
當你在應用程式執行的時候按下 Home 鍵,應用程式並不會中斷目前的執行,而是躲到背景去了。因此希望使用者在按下 Home 鍵之後就要中斷目前程式的執行,請設定這個選項。

2.
鍵名:LSRequiresIPhoneOS
顯示的名稱:Application requires iPhone environment
說明:
iOS 的家族主要包含了 iPhone、iPad、iPod Touch 這三種設備。因此如果你的應用程式只能在 iPhone 環境下使用的話,請設定這個選項。

3.
鍵名:UIFileSharingEnabled
顯示的名稱:Application supports iTunes file sharing
說明:
在 iTunes 9.1 之後的版本增加了一個檔案共享的功能,只要打開這個選項,然後把你要共享的檔案儲存在 Documents 目錄裡面,就可以在 iTunes 裡面的應用程式標籤頁看到這份文件。反之亦可從 iTunes 上傳檔案至裝置上!

4.
鍵名:UIRequiresPersistentWiFi
顯示的名稱:Application uses Wi-Fi
說明:
如果你的應用程式需要使用的 WiFi 來連線的話,那麼你可以開啓這個功能。當使用者在執行這個應用程式的時候並未開啓 WiFi,那麼在畫面上會自動跳出對話框要求開啓 WiFi。

5.
鍵名:CFBundleSignature
顯示的名稱:Bundle creator OS Type code
說明:
CFBundleSignature 是一個四個字母長度的字串,用以表示開發者對於應用程式的標識。例如:在一個文字編輯的應用程式,你可以標識為 ”ttext”。

6.
鍵名:CFBundleDisplayName
顯示的名稱:Bundle display name
說明:
應用程式本土化的顯示名稱,預設值為 ${PRODUCT_NAME}。這個變數可以在雙敲擊Targets後出現的專案設定畫面中修改,找到”Product Name”後修改為你的產品名稱就可以了,編譯後的 .app 也會以這個名稱命名。

7.
鍵名:CFBundleIdentifier
顯示的名稱:Bundle identifier
說明:
用來標示應用程式的唯一 ID,通常是以反向的 DNS 方式命名的,例如:com.myCompany.myApp,這個名稱應該在 iTunes Connect 裡面新增的應用程式 ID 一致。

8.
鍵名:CFBundleName
顯示的名稱:Bundle name
說明:
應用程式的短名稱,通常就是你的應用程式名稱。

9.
鍵名:CFBundlePackageType
顯示的名稱:Bundle OS Type code
說明:
用來標識整個封包的(bundle)的類型。在 Mac 裡面,一個封包可能是一個檔案或目錄,其目的在於將軟體使用到的資源包在一起。例如應用程式應標識為 APPL。

10.
鍵名:CFBundleVersion
顯示的名稱:Bundle version
說明:
用以標識編譯版本(Bundle number),你可以使用任何字串格式來表示這個版本。例如使用一個數字來表示編譯次數。

11.
鍵名:CFBundleShortVersionString
顯示的名稱:Bundle version string, short
說明:
應用程式的版本,通常是以三個數字來表示版本號,例如:1.0.1。

12.
鍵名:LSExcutableArchitectures
顯示的名稱:Executable architectures
說明:
為一個陣列形態的設定值。為一個陣列形態的設定值。用以設定執行擋可以運行的架構環境,例:i386,ppc,ppc64,x86_64

13.
鍵名:CFBundleExecutable
顯示的名稱:Executable file
說明:
執行檔的名稱。

14.
鍵名:UIAppFonts
顯示的名稱:Fonts provide by application
說明:
為一個陣列形態的設定值。用來指定應用程式所使用的外部字型。你可以在應用程式內使用自己的字型檔,只要將字型檔案加入到專案內,在設定值指定字型檔名稱就可以在程式碼裡面使用到這些字型了。如果字形是使用免費的,把它加在這裡是最好的選擇了!

15.
鍵名:CFBundleGetInfoString
顯示的名稱:Get Info string
說明:
用於 Mac 的 Finder 上的應用程式的描述。

16.
鍵名:UIPrerenderedIcon
顯示的名稱:Icon already includes gloss effects
說明:
指定應用程式的圖示是否加上光暈效果,如果不希望加上光暈效果,那麼勾選此選項。

17.
鍵名:CFBundleIconFile
顯示的名稱:Icon file
說明:
用來設定應用程式的圖示檔,如果沒有指定的話,則使用預設值 Default.png,依照 Apple 的規定,這個圖是必須是 57x57 的圖形檔。

18.
鍵名:CFBundleIconFiles
顯示的名稱:Icon files
說明:
由於 iPhone 與 iPad 的開發工具以及 SDK 都是相同的,因此同一個應用程式也可以同時在兩個設備上使用,只不過兩著的圖是不太一樣。這個鍵值是一個陣列類型的設定值,用來指定 iPhone 與 iPad 的應用程式圖示,你只要給兩個圖示檔名,其中 iPhone 的圖示為 57x57 pixel,iPad 則為 72x72 pixel,系統會自動依照圖示大小判斷該圖示是使用在哪種設備上。

19.
鍵名:CFBundleInfoDictionaryVersion
顯示的名稱:Info dictionary version
說明:
info.plist格式的版本。一般來說,我們不會變動這個數值。

20.
鍵名:UIInterfaceOrientation
顯示的名稱:Initial interface orientateon
說明:
指定應用程式初始時的方向。

21.
鍵名:UILaunchImageFile
顯示的名稱:Launch image
說明:
用以指定應用程式啓動時的圖檔。

22.
鍵名:CFBundleDevelopmentRegion
顯示的名稱:Localization native development region
說明:
應用程式原始的語系版本。

23.
鍵名:CFBundleLocalizations
顯示的名稱:Localizations
說明:
用以指定應用程式所支援的語系。

24.
鍵名:CFBundleAllowedMimxedLocalizations
顯示的名稱:Localized resources can be mixed
說明:
是否允許應用程式可以取得框架庫內的語系檔。

25.
鍵名:NSMainNibFile
顯示的名稱:Main nib file base name
說明:
主要的Nib檔案名稱,預設值為MainWindow。

26.
鍵名:UIViewEdgeAntialiasing
顯示的名稱:Renders with edge antialisasing
說明:
設定core animation的圖層是否開啓抗鋸齒功能。

27.
鍵名:UIViewGroupOpacity
顯示的名稱:Renders with group opacity
說明:
設定core animation的圖層使否繼承上一層透明度。

28.
鍵名:UIBackgroundModes
顯示的名稱:Required background modes
說明:
設定當應用程式進入背景執行後,哪些動作要繼續在背景執行。這個鍵值是一個陣列類型的設定,可設定動作包括:audio,location,voip。

29.
鍵名:UIRequiredDeviceCapabilities
顯示的名稱:Required device capabilities
說明:
設定應用程式需要使用到的硬體,如此可以確定應用程式在該設備上執行時不會發生錯誤。

30.
鍵名:UIStatusBarHidden
顯示的名稱:Status bar is initially hidden
說明:
設定狀態列是否一開始隱藏。

31.
鍵名:UIStatusBarStyle
顯示的名稱:Status bar style
說明:
設定狀態列的顯示類型。

32.
鍵名:UISupportedExternalAccessoryProtocols
顯示的名稱:Supported external accessory protocols
說明:
指定應用程式與外界硬體配件間支援的通訊協定,這個鍵值是一個陣列設定,可以指定多個通訊協定。

33.
鍵名:UISupportedInterfaceOrientations
顯示的名稱:Supported interface orientateons
說明:
設定應用程式所支援的顯示模式(肖像模式或風景模式),這個鍵值是一個陣列,可以支援多個不同的顯示模式。

34.
鍵名:UIUpgradeOtherBundleIdentifier
顯示的名稱:Supported interface orientations
說明:
設定應用程式所支援的顯示模式(肖像或是風景模式),這個鍵值可以支援多個不同的顯示模式。

貼了之後才發現,33 和 34 是甚麼鬼東西, 看起來不是一樣的東西嗎?請出 Google 大神問了一下,發現一堆人也是直接就貼來參考用,根本就沒仔細看的感覺!
根據 Apple Developer 的討論串,某位 Apple 員工說「它不會照你想像的運作」、「請不要使用它了!」有興趣的可以進 Apple Developer 看看這篇討論!

所以...其實只有 33 個好用的設定列在這裡啦!

Apple Reference:
iOS Keys

2015年5月12日 星期二

[筆記] 自動遞增 iOS App 版本號碼

圖檔來源:TechOrange
由於公司 iOS 程式已經開發進入尾聲,所以需要開始定義版本號碼的演進,上網看了一下大家對於 iOS 的版本號討論和 Apple 的文件,目前 iOS App 關於版號有兩個欄位可以更改:
1. CFBundleShortVersionString:
此版號預設為 1.0,依據 Apple 文件,可以分成三個欄位,Major version、reversion 和 maintenance release。
依據這個規則,在下面的 script 中,它用來協助我更新 maintenance release,每次 build 都會自動加一。如果有其它需求的話,因為我已經把三個欄位分開了,相信應該不難再修改成其它需求才是!

2. CFBundleVersion:
依據 Apple 文件,此欄位應該只允許數字和小數點組成的字串,第一位數字必須大於 0,如果以 0 作為開頭的話,該 0 會被系統忽略!
但是實務上我發現其實限制好像沒那麼嚴苛,所以我目前先用 Build 的日期時間當做它的值,並且把它以 16 進位儲存。

網路上也看到文章說 CFBundleShortVersionString 主要是給使用者看的,所以我覺得這只要讓使用者知道有在改進就好了,而 CFBundleVersion 比較傾向於給內部使用,讓 QA 和 RD 主要用它來溝通,而不依據 CFBundleShortVersionString 來聯繫,我覺得也還不錯!

所以下面就是我目前最後用的 script,也分享給大家囉!

#!/bin/bash

bundleShortVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" $INFOPLIST_FILE)
bundleVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" $INFOPLIST_FILE)
major_id=$(echo $bundleShortVersion | grep -o '^[0-9]')
revision_id=$(echo $bundleShortVersion | grep -o '[0-9]\+.[0-9]' | grep -o '[0-9]\+$')
maintenance_id=$(echo $bundleShortVersion | grep -o '[0-9]\+$')
maintenance_id=`expr $maintenance_id + 1`
bundleShortVersion=$major_id"."$revision_id"."$maintenance_id
bundleVersion=$(date +"%y%m%d%H%M")
bundleVersion=$(printf "%X" $bundleVersion)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $bundleVersion" "$INFOPLIST_FILE"
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $bundleShortVersion" "$INFOPLIST_FILE"

Reference:
Information Property List Key Reference

2015年4月23日 星期四

[筆記] 快速將檔案名稱全部換成小寫字元

最近在處理 Dolby Certification 的時候,由於 Dolby 提供的參考解碼器是用大寫的檔案名稱,但是我需要在 Uniux like 的環境編譯他們的程式,他們的程式內是使用小寫的檔案名稱,這造成了編譯錯誤,索性在 Windows 上面用下面的方把把檔案全部換成小寫再拿去編譯!

for /f "Tokens=*" %f in ('dir /l/b/a-d') do (rename "%f" "%f")

遞迴版本:
for /f "Tokens=*" %f in ('dir /r/l/b/a-d') do (rename "%f" "%f")


如果想要將這段 script 寫在 Batch 檔案裡,必須要用 "%%f" 來取代 "%f" 喔!

2015年4月19日 星期日

[開箱] 技嘉 BRIX 迷你準系統 Intel Core i3 套裝機 (GB-BXI3H-4010) 使用短評

一直以來用 Mac mini 當作寢室內簡易的電腦終端裝置,一來佔的體積小,二來當時想要買來寫 iOS 的程式,然後就一直沒換過電腦了!算一算也已經用了XX年了!在使用優勝美地的狀態下其實已經跑得非常吃力了!

先前已經在逛 PCHome 24HR 購物的時候買了一部 Intel WX3-QPC321-4S12A,當時就覺得現在原來很多公司已經有出這麼小的電腦了,所以又追加查看了每間公司在網站上賣的產品,看到了技嘉 BRIX 迷你準系統 Intel Core i3 套裝機 ,直覺真是全部當中 CP 值最高的,不但包含了SSD和記憶體,價格也算是蠻親民的!不過當下卻是在缺貨狀態,所以設定了關注後就沒再注意了!

一月中早上收到網站通知進貨,上網查看一下進了兩部,當下直覺應該要趕快做決定,但是因為趕著上班,到了公司後又忙了一堆事,到了中午再看已經剩下一部了!這時當然是立馬先下單了!

在加了 16G RAM 之後使用了一個多月下來,開了四部 VM 在上面跑起來還算是四平八穩的,不算太吃力,再加上不占空間,我又使用 TeamViewer 進行連線控制,可以說它就是一部小盒子在那裏工作,而不佔去我太多空間,實在是太方便了!

2015年2月26日 星期四

[心得] 無網不利,用 PureVPN 突破 IP 數量限制

之所以要介紹這間 VPN,主要因為它價錢還不錯,一年US$49.95可以有五部裝置可以同時使用,相較於一些有口碑的 VPN 只提供兩部裝置可以同時使用的狀況下相對方便很多!可以提供很方便的應用情境!一些主要的優點列出如下:
  • 可以同時給五部裝置同時使用
  • 不限流量
  • 在 89 個國家總共有 450 部以上的伺服器
  • 77,000 以上的 IP 支援

我會使用它主要是看上了"可以同時給五部裝置同時使用"這個優點,讓家裡的網路可以多支援五組 IP!在使用上更為靈活!

PureVPN 的 Client 端非常容易安裝與使用,如果在中國要使用,下載的時候要下載大陸使用的版本,不然可能會有連線的問題。不過這部分我無法測試,因為我並沒有在中國使用過!台灣地區則使用一般的版本就可以了!
 


Client 端在設定上非常簡單直覺,也支援斷線自動重連,基本的使用上大概只需要把使用者名稱和密碼填入之後,選擇要連線的國家的伺服器,按快速連線就可以直接連接上 VPN 伺服器了!這裡值得注意的是它並不會列出該國家所有的伺服器,而是它會自己去選擇連線的伺服器,每個國家提供的 IP 數量不一樣,像是台灣不管怎麼重新連線就是同一組 IP,日本還蠻多組的,美國的部分也不少,至少在我使用的過程中,五部裝置並無出現重複的 IP,我覺得還不錯!

再來就是上網的速度了!目前我的應用只是瀏覽網頁而已,所以我比較不在意速度的問題,但是它提供了 P2P 之類的應用可以連線的伺服器選擇,我想大概是針對這種應用他們有流量分配的方式吧!改天有空再來幫大家測試連線速度!最近工作量實在有點大,想抽空寫部落格都快沒時間了!

省錢密技:
連線到他們的網頁之後,先隨便看看他們家的網頁〈我不確定這是必須的〉,他們家的網頁會隨機的跳出10%折價選項,所以等到它跳出來之後再去購買,這樣可以省下快 US$5 喔!

2015年1月15日 星期四

一定不能錯過的 Mac 應用,Duet Display 使用 iPad 當第二個螢幕試玩!!


最近接連在國外的報導和國內的報導中看到 Duet Display 可以拿舊的 iPad 來當做延伸的桌面,當下就很有興趣,所以今天就買來玩看看囉!

基本上這個應用分成兩個部分,第一個是在 Mac 上面,第二個是在 iPad 上面,第一個部分是不用錢的,但是第二個部分要價台幣 300 元,這價錢不算太貴,以能夠多出一個顯示空間來說算是划算的!

拿出平時給小朋友看看 Youtube 的 iPad 3,連接上 2006 年的 MacBook,預設值跑起來延遲不算太高,還在可以接受的範圍,拿來看看網頁、查資料應該是不成問題的,另外我沒有測試跑遊戲類的軟體,因為沒有現成的可以用!

Mac 軟體安裝後預設會自動啟動,工具列顯示如下圖:


點選後介面如下:


右下腳的設定點開後如下:


總體跑起來除了 CPU 使用率略高之外,倒是沒什麼好抱怨的,畢竟才花了台幣 300 元,相信如果是新一點的電腦,解析度/楨數應該可以再往上調整!跑起來也應該更加順暢才是!