2015年4月8日 星期三

PHP CodeIgniter - 透過 Apache RewriteRule 限制 CGI 功能

基於一些開發需求,想要侷限網站的功能。剛好這個網站服務是用 PHP CodeIgniter 開發的,整套都是走 RewriteRule 來進行,例如一個 URL 位置,都一律導向到 PHP CodeIgniter Project 的 index.php?/path 來分析。

假設原本網站有 3 個主要網址,分別是 /api, /shopping, / 等,假設想要讓此網站只開啟 /api 時,這時就可以透過 Apache RewriteRule 來限制:

<VirtualHost *:80>
DocumentRoot /ci-project/
DirectoryIndex index.html index.php index.htm

# empty page
Alias /empty     /var/www/html/

<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>

<Directory /var/www/html/>
Options FollowSymLinks
AllowOverride None
DirectoryIndex index.html index.php index.htm
Require all granted
Satisfy Any
</Directory>

<Directory /ci-project>
Options FollowSymLinks
DirectoryIndex index.php
AllowOverride None
#AllowOverride All
Require all granted
Satisfy Any

<IfModule mod_rewrite.c>
RewriteEngine On
#LogLevel alert rewrite:trace6
RewriteBase /

# disable index.php with empty QUERY_STRING
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^index\.php$ /empty/ [L]

RewriteCond $1 !^(index\.php|images|css|js|favicon\.ico)
# enable /api only
RewriteCond $1 ^api.*$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php?/$1 [L,QSA]
</IfModule>
</Directory>
</VirtualHost>


如此一來,只要使用者逛 / 位置,則會顯示 /var/www/html 的資料,而逛 /api 系列時,則是可以正常引導到 PHP CodeIgniter 相關程式碼來處理。

2015年4月5日 星期日

人生第一台 NAS - Synology DS215j 與 DiskStation 初體驗


假日閒聊時,發現家人正困惑著資料儲存的問題,四五年前買的筆電、桌機有的硬碟大概才 256GB、512GB 而已,隨著數位相機、手機拍照的盛起,有越來越多資料不知該怎樣處理,甚至許多歷史因素懶得處理 Orz 想著想著,看來是個時機點,買一台 NAS 了!周邊有花錢買 NAS 的,有八成以上有抓 BT 的習慣,少數是本身就是拍照的愛好者,有的甚至就是用外接硬碟來備份,為此也困惑許久,最後就當作嘗鮮吧 XD

至於為何買 Synology ?單純看到前同事用這系列,而型號只是單純買 2015 年的產品。雖然我自己土砲一下要裝個 server 也不是難事,只是時間寶貴啊,花一點錢試試看別人的產品,一台機殼、主機板,算起來跟自己去組一台要花的成本相當,差只差在自己組裝的硬體規格會比較好,可以接的硬碟會比較多,但通常也不會比專門做 NAS 的省電,並且整體空間設計也很難比別人好看。

 

使用心得還不賴!以前也開發過這類產品,例如一個 embedded linux 搭配 Web UI 來提供服務,但直到我試了 Synology DiskStation 的介面,真的輸人輸太多!Synology 真的做得很好 :P 過去開發產品容易執著在技術上,而使用者其實更在意絕對是 UIUX 的部分。

安裝完硬碟且接上網路後,只要是在同一個無線網路 AP 下,直接用瀏覽器輸入 find.synology.com 即可連線到,透過 DNS 的機制 UIUX 做的真的不錯,十分親民。而 Mobile app 也是一樣的道理,下載完專屬的 app 後,可以透過本地網路的瀏覽方可找到機器。而機器的設定全部都走 Web UI ,沒點幾下就都搞定了!



不少服務擴充:





整體上,對我這個產品的門外漢來說,做的真的不錯,分數有 90 分以上 :P 目前使用上都還順利,若真的要挑惕的話,大概是我買的這台是兩顆碟,已備份技術來看,就是會損失一顆硬碟的空間(買兩顆 1TB,一顆備份,真正只能用 1TB空間),另外則是我在 MBP 2012 機器上,透過 FileZilla 走 FTP 傳資料時,若一口氣開 10 個連線,平均 5~10分鐘會出現連線 timeout 的現象,不確定是 MBP 跑不動,還是 NAS 連線數應付不來。

2015年4月3日 星期五

iOS 開發筆記 - 使用 Facebook iOS SDK 4 之處理 FBSDKLoginManager result.isCancelled = true 問題

很久沒用 FB iOS SDK 了,一不小心發現已經進入到 4.0 版本,接著一堆 code 失效 Orz 接著,又來適應一下新板 SDK 的情況。

看著文件刻了一下:

#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <FBSDKLoginKit/FBSDKLoginManager.h>
#import <FBSDKLoginKit/FBSDKLoginManagerLoginResult.h>
- (void)testFB {
    if (![FBSDKAccessToken currentAccessToken]) {
        NSLog(@"do login");
     
        FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
        [login logInWithPublishPermissions:@[@"publish_actions"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
            if (error) {
                // Process error
                NSLog(@"Process error");
            } else if (result.isCancelled) {
                // Handle cancellations
                NSLog(@"Handle cancellations: %@, %@, %@", result, result.grantedPermissions, [FBSDKAccessToken currentAccessToken]);
            } else {
                if ([result.grantedPermissions containsObject:@"publish_actions"]) {
                    NSLog(@"with publish_actions");
                } else {
                    NSLog(@"without publish_actions");
                }
            }
        }];
        return;
    } else if ([[FBSDKAccessToken currentAccessToken] hasGranted:@"publish_actions"]) {
        NSLog(@"use publish_actions");
    }
 
    NSLog(@"token: %@", [FBSDKAccessToken currentAccessToken]);
}


很奇妙地,無論使用者如何授權此 Facebook app ,永遠都會落入 result.isCancelled == true 的事件中,然後 token 永遠都 null。

追了一下,原來還要設定 AppDelegate 太久沒用都忘記了,啊 FB iOS SDK 文件上也沒提醒 Orz

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    return [[FBSDKApplicationDelegate sharedInstance] application:application
                                                          openURL:url
                                                sourceApplication:sourceApplication
                                                       annotation:annotation];
}


如此一來,有幾種情境就都能抓到了:
  • 使用者不想授權此 app => Handle cancellations
  • 使用者授權此 app ,但不想給 publish_actions 權限 => without publish_actions
  • 使用者授權此 app ,並給予 publish_actions 權限 => with publish_actions

2015年4月2日 星期四

Android 開發筆記 - 嘗試取出 WebView Javascript console.log @ 小米2S Android 4.1.1

原先 Android 4.4 已經有漂亮的解法:Debugging Web Apps,但是,對於其他版本的就 糟糕了。

所幸小米2S的系統還算 ok,只需啟動開發者模式,並播打電話 *#*#717717#*#* 後,即可開啟完整的開發者模式,透過 adb 連線。

$ adb devices
...至少要看到小米2S機器

$ adb logcat com.android.chromium:* | grep 'WebViewerFragment'
...
D/WebViewerFragment(25584): onScroll:192.34418
D/WebViewerFragment(25584): onScroll:344.65582
D/WebViewerFragment(25584): onFling:-4593.181
D/WebViewerFragment(25584): onScroll:-71.85919
D/WebViewerFragment(25584): onScroll:-183.00793
D/WebViewerFragment(25584): onScroll:-61.014893
D/WebViewerFragment(25584): onScroll:-77.11798
D/WebViewerFragment(25584): onFling:5177.8477
D/WebViewerFragment(25584): onScroll:-42.316345
D/WebViewerFragment(25584): onScroll:-70.78821
D/WebViewerFragment(25584): onScroll:-89.440186
D/WebViewerFragment(25584): onScroll:-105.551575
D/WebViewerFragment(25584): onScroll:-117.46338
D/WebViewerFragment(25584): onFling:8612.66
...


如此,簡易版搞定 :P 上述訊息是 javascript console.log。另一外提的是,我把小米2s系統預設瀏覽器改成 chrom browser ,不知使用系統預設 browser 是否一樣,以及我安裝的 app 可能是 debug 版本,有一說 release 版本可能看不到。

2015年3月29日 星期日

大隱隱於市



下午跟家人一起看電視時,剛好看到節目在介紹一位在上海的畫家,主持人很好奇他怎樣在這樣的環境下創作,於是乎畫家就說了這句話: 「大隱隱於市...」

搭火車時,突然想起查了一下典故,看來像是個俗語似的,本意是說厲害的隱者不必到清幽的環境才能修煉,而更完整的句字:
大隱隱於朝;中隱隱於市;小隱隱於林
還滿不錯的意境。

更有一則相關詩句:中隱(白居易 唐詩)

大隱住朝市,小隱入丘樊
丘樊太冷落,朝市太囂喧
不如作中隱,隱在留司官
似出復似處,非忙亦非閑
不勞心與力,又免飢與寒
終歲無公事,隨月有俸錢
君若好登臨,城南有秋山
君若愛游蕩,城東有春園
君若欲一醉,時出赴賓筵
洛中多君子,可以恣歡言
君若欲高臥,但自深掩關
亦無車馬客,造次到門前
人生處一世,其道難兩全
賤即苦凍餒,貴則多憂患
唯此中隱士,致身吉且安
窮通與豐約,正在四者間