2014年12月13日 星期六

[野人獻曝] 使用 GitLab 來寫個簡單的 git log 介面

因為公司的版本管理用 Git,所以裝個 GitLab 也是很正常的事!

說是這麼說啦,不過我也不算啥 Git 達人,所以研究這個東西只是基於我工作上需求而做的。

使用這隻API的方式很簡單,只要:
  • 先到個人的帳號頁面拿到專屬的 private_token
  • 然後看 GitLab 提供的 API 有什麼可用的,然後自己實作功能就好了
以下是實作列出專案的大略程式碼:

2014年6月8日 星期日

[野人獻曝] 讓 solr 將查出的資料作亂數排序

第一步:打開你的索引核心目錄中的 schema.xml
分別找到 fields 和 types 兩個區塊,並在區塊內加上以下內容:
<fields>
......
<dynamicField name="random*" stored="false" indexed="true" type="rand" />
</fields>
<types>
......
<fieldType name="rand" class="solr.RandomSortField"  indexed="true" />
</types>

注意:紅字的地方名稱務必要一樣,不然索引應該會失敗。

第二步:重新啟動 solr ,完工!

如果你有設定 Replication 的話,
理論上應該會將這份 schema.xml 同步到 slave 機上。

接著你可以在 solr 的查詢介面中試著用 sort = random* [desc | asc] 試試看,
應該會看到不同查詢排序結果。
(注:*可以是任何字元,但是儘量不要用同一組字元,因為會得到同樣的結果,就沒有 random 的意義了)

以上,打完收工!

2014年6月1日 星期日

[野人獻曝] 在Server上安裝linux儀表板

有些時候想看系統上的一些資訊要自己下一票指令,
如果熟悉這些指令的話倒也就罷了,
但很多時候其實並不這麼熟悉,
所以就有人做了一個儀表板
可以用網頁的形式顯示系統資訊,
一眼就可以看出來系統狀況。

他的安裝基本上很簡單:

確定系統上安裝了php5和php5-json(我想一般機器都會有

  • 沒裝的話自行敲個 yum install / apt-get install 吧
下載檔案並解壓縮到網站目錄中
為了保險起見將這個目錄加上簡單的密碼保護
  • 如果是用 nginx 的話,可以在 /etc/nginx/sites-enabled/default 下加上以下內容
location 目錄路徑 {
auth_basic    "提示要求輸入密碼的內容" 
auth_basic_user_file  "密碼檔路徑"

  • 然後利用這個工具產生密碼檔的內容,並且貼到密碼檔中,接著重新啟動 nginx 即可。
以上動作完成,輸入網址並且打上帳號密碼應該就可以看到你現在的系統狀態了。

以下是實際執行的畫面:
 



2014年5月10日 星期六

[野人獻曝] 將Cloudfront的資源加上防外連機制

最近因為 Cloudfront 的流量費用越來越可怕了,
所以牙一咬就決定擋掉圖片的所有外連圖個減少開銷。

Cloudfront 正好有提供 Signed URL 這個玩意可以達成我的要求。

這玩意簡單來說就是在所要求的資源(如:圖片、檔案等)的網址後面多加一串 Query String。
例如:http://www.example.com/a.txt經過改造後會變成http://www.example.com/a.txt?blahblah
而Server只要認那串 Query String 就可以決定是否要出所要求的內容,
就可以控制不必要的外連。

那接著就不提廢話,直接實作吧!

第一步要先到 AWS 的 Security Credentials
然後頁面往下拉找到一個 Key Pairs 的 tab,
接著點擊 Create a new key pair
他會產生一組pem檔並且要求下載,
請把這個檔案下載儲存。
同時頁面上也會顯示一組 Axxxxxxxxxx 的 key ,
請務必把這組字串複製下來。

第二步要寫出一個產生 Signed URL 的 function,
內容大概如下

<?php
/**
  * $resource:要處理的檔案網址  例如http://www.example.com/a.txt
  * $expire:過期的時間,單位是秒,這裡我預設有效時間為一個小時
*/
function create_signed_url ($resource, $expire = 3600)
{
    $aws_key = 'Axxxxxxxx';  // 就是上述所提到的key
    $pem_file = '';   // 剛才下載的pem檔案放置路徑
    $expire_time = time() + $expire;  // 這裡的值是個 Unix timestamp
    // 以下是 Cloudfront 的存取策略,內容基本上是個json string
    // 但是千萬不要用json_encode這個函式去編出內容,因為格式會不一樣
    // 詳細可以參考:
    // 以下是指特定的檔案(即$resource)在$expire_time之後即無法取得內容
    $policy = '{
        "Statement":[{
            "Resource":"' . $resource . '",
            "Condition":{
                "DateLessThan":{
                    "AWS:EpochTime":'. $expire_time . '
                }
            }
        }]
    }';
    // 接下來要利用openssl的相關函式產生所需的簽章內容
    $private_key_content = file_get_contents($pem_file);

    // 先把內容丟到openssl_get_privatekey算出私鑰
    $pkey = openssl_get_privatekey($private_key_content);
    // 接著呼叫openssl_sign取得簽章內容
    // $policy是上面設定的讀取策略,產生的結果會放在$signature中
    openssl_sign($policy, $signature, $pkey);
    // 接著釋放這組key內容
    openssl_free_key($pkey);

    // 然後要真正產生簽章過的URL
    // 請注意:Policy和Signature的內容要用base64_enocde編碼外,還要把特定的三個符號替換掉    // 否則產生的url也會無法取得資源
    return $resource."?".http_build_query(array(
        'Policy'            =>  str_replace(
            array('+', '=', '/'),
            array('-', '_', '~'),
            base64_encode($policy)
        ),
        'Key-Pair-Id'       =>  $aws_key,
        'Signature'         =>  str_replace(
            array('+', '=', '/'),
            array('-', '_', '~'),
            base64_encode($signature)
        ),
    ));

}
?>

然後在網頁上用到該資源的連結/圖片全部用這個function處理後,
輸出的url應該就會有一長串的Query String了。

但是這樣作還不夠,
我們還要進去 Cloudfront 的控制台設定哪些項目需要被限制存取。
所以進入控制台後請選擇目標項目後點擊 Distribution Settings
接著選擇 Behaviors
如果沒意外的話有一組 Path Pattern 為 Default(*) 的項目,
請點擊他後按下Edit。
出現編輯畫面後請往下拉,
找到 Restrict Viewer Access (Use Signed URLs) 並選擇 Yes 後儲存。
這樣這個項目內所有資源就會被限制存取。
(當然也可以設定什麼樣的檔案才要被限制,這個設定可以寫在 Path Pattern 中)

上面的動作做完後,等 Cloudfront 佈署完成後應該就會生效了。
你應該會發現沒加一長串簽章的網址全部都出現 Access Denied 或是其他之類的錯誤訊息,
而有一長串簽章的網址都應該是可以正確讀取,
這樣表示就一切正常了。