2 months ago

前言

隨著使用時間越來越久,磁碟的容量也漸漸不夠用了,又加上一開始創立儲存空間的時候手殘選到了 SHR,導致沒辦法手動選擇我要的 RAID 型態,因此決定趁 Seagate 硬碟特價來升級。

在升級之前也猶豫了很久,究竟要選擇 Raid 5 還是 Raid 6,兩者各有優缺,對於只有四顆硬碟的我選擇 Raid 6 就只剩下兩顆硬碟的容量可以用,也是有點傷,但經過多方面的詢問,Raid 5 的死亡率比我想像的還要高一些,後來還是決定採用Raid6來保護我的資料。

升級流程規劃

Synology 並沒有提供簡單的轉換儲存空間方法,不能無腦一鍵轉換,而直接無腦把整個 volume1 的東西丟到 volume2 然後期待一切可以順利的心臟實在太大顆了,因此我決定採取比較漸進式的轉移方法:

  • 先將所有 shared folder 都轉到 volume2 上
  • 用 Hyper Backup 備份所有套件
  • 移除所有套件,重新安裝在 volume2
  • 還原所有套件
  • 移除 volume1
  • 將 volume2 從 Raid 1 改為 Raid 5
  • 將 volume2 從 Raid 5 改為 Raid 6

列出來之後發現真的是一個大工程,大概要耗掉很多時間,且一定會有不少的 down-time,但硬碟都買了,儲存空間也是真的不夠,只好硬著頭皮衝了

開始

一開始就發現事情沒那麼簡單,因為搬移 volume 沒辦法一次搬移,只能一個一個搬,也沒辦法排程,因此會花很多時間在等待搬移並準備搬下一個,一開始先搬一些不會影響到服務的 share 例如 backup / download 之類的,這步驟還算簡單輕鬆。

接著為了節省時間,在搬移 share 的過程中也順便移除一些不相關的套件,如 Text Editor 這種就算砍掉重裝也不會掉資料,並一一安裝到 volume2 上。

Docker

接著開始轉移 Docker,在 Docker 上我跑了一個網站、Redis、兩個 proxy server,都是有挖進 container 做一些修改,所以不能直接重新載 image 下來使用,搬移 share 並把 Docker 重新安裝到 volume2 之後發現 -- 所有 container 和 images 全掉了...

趕快關掉 nas 重新打開,一切都是假的,是業障太重。
/volume1 下面看了一下發現 @docker 這資料夾有 87% 像是存 image 和 container 的地方,趕緊複製到 volume2 重新打開 docker,結果服務再起不能...

看了一下 /var/log/message 發現沒有任何資訊, /var/log/synopkg.log 也沒有甚麼有幫助的資訊,直接執行看看 /var/packages/Docker/scripts/start-stop-status start 之後發現錯誤 :

ERRO[0000] Failed to GetDriver graph btrfs /lxc/docker  
FATA[0000] Error starting daemon: error initializing graphdriver: driver not supported 

稍微 google 了一下發現是 aufs 不能在 btrfs 上執行的錯誤,因為之前 volume1 是使用 ext4 檔案格式,而 volume2 是用 btrfs ,導致之前的 container / image 沒辦法直接在新的 btrfs 上使用。這聽起來很棘手,但或許我可以試試先安裝回 volume1 ,然後用 docker export 把 container 倒出來,再用 import 把它倒回去,這樣就可以完成 Docker 的轉移,只是 port 那些要重新設定稍微麻煩了一點。

Cloud Station Server

Cloud statoin server 要移轉也很簡單,先在設定裡面選取 volume2 之後解安裝重裝即可

MariaDB / pgsql

其中讓我最棘手的莫過於 postgres 和 MariaDB 了
postgres 是系統內建且沒支援備份就算了,MariaDB 我用 Hyper backup 進行 restore 也重裝到 volume2 之後,居然還是 link 到 /volume1/@database/mysql,解決方法和 postgres 一樣,就是先停用之後複製到 volume2 再改 symbolic link

root> synopkg stop MariaDB
root> rsync -PavxH /volume1/\@database/mysql /volume2/\@database
root> rm /var/packages/MariaDB/target/mysql
root> ln -s /volume2/\@database/mysql /var/packages/MariaDB/target/mysql
root> synopkg start MariaDB

PostgresSQL 則是

root> initctl stop pgsql
root> rsync -PavxH /volume1/\@database/pgsql /volume2/\@database
root> rm /var/services/pgsql
root> ln -s /volume2/\@database/pgsql /var/services/pgsql
root> initctl start MariaDB

接著把其餘所有套件備份還原、安裝到 volume2 之後總算可以成功按下 raid1 -> raid5 了,接著再按下 raid5 -> raid6 就大功告成囉!

結語

總之在一開始買回 nas 之後要好好想清楚之後要用的檔案型態以及硬碟型態,不要傻傻的選擇 SHR 之後就會欲哭無淚 Q_Q
升級的過程無比艱辛,還好最後在沒有掉資料的情況之下完成升級

 
about 1 year ago

前陣子在最佳化公司的 WebAPI 效能,學習到不少寶貴的經驗。

還沒進公司的時候,寫 WebAPI 主要使用 php,接過的案子也都不大,不太需要做太徹底的最佳化,頂多自己玩玩技術。
以下為之前嘗試過的效能最佳化:

  • 前端:靜態元素使用 CDN、lazy load javascript、預先快取圖片、minimize resource、cookie-free domain for static files、yslow 分析
  • CDN:採用 cloudflare,進行過細部的效能調整
  • Reverse proxy:使用 varnish,並和 application custom header 搭配調整快取效能
  • Web Server:apache + php-cgi -> apache-worker / event + php-fpm -> nginx + php-fpm
  • PHP:調整 fpm 設定、加入 php opcode cache,關閉動態更新功能、session改存在redis中、HHVM / PHP7
  • Application:整頁快取 + 部份快取機制(php-apc)

這些是我架設網站會使用的效能最佳化技巧,但是進公司就要面對公司的複雜的噁心的架構,往往和自己做會有不少差異。敝公司的 WebAPI 全都是使用 C++ 寫成(什麼?PHP HipHop?我們不需要XD),但就算是 C++,在架構日益龐大的情況下還是可能發生效能問題。

我們是一間很重視效能的公司,但就跟其他公司一樣,feature都做不完了還管效能,當然是先上再說,就像 IOS7 剛出的時候舊ipad升級之後解鎖要等30秒我現在都還餘悸猶存。但成山的feature做完之後,該面對的還是要面對。

最近公司的 API 比上一個大版本來的緩慢,找了很久發現速度的瓶頸其實是在 dlopen 時載入的 so 太多,導致一隻 API 所用到,全部 so 載入進來至少需要 80ms 以上的時間,對比上一個大版本大概只要 3x ms,足足落後了一倍以上。進行夾板測試之後,我們發現是 library 拆小的策略所導致,在這一季我們將大的 library 拆成很多個小 library,導致 so 數量是以往的兩倍以上。

知道原因之後,接下來我們就開始進行兩個方針,其一為所有 project link 的時候都加上 -Wl,--as-needed,避免連結到不必要的 so;其二為將 webapi 基本使用到的 library 再拆小,用不到的就不要 link,這兩個方針下下去之後,我們成功的將延遲時間提升到 30 ms 左右。

 
about 2 years ago

VM雙螢幕雙人使用
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1033435

新酷音 on Mac OSX 10.9.4
https://www.ptt.cc/bbs/MAC/M.1408164898.A.DC9.html

 
over 2 years ago

這次HITCON因為在美國奪得DEFCON CTF亞軍導致聲名大噪,我也是看熱鬧的鄉民之一XD
原本只是路過,好奇心驅使之下前一天晚上幫忙寫了Maze的QR code converter,協助拿到那題
之後就更有興趣的一直玩到四點,可惜沒寫出任何一題(畢竟不是資安專業XD)
隔天晚上看到24這題覺得很有趣莫名就拿到分數了XD

  • Maze
    telnet 210.71.253.213 8473
    
    這題telnet進去之後就發現名符其實的是一個迷宮,走一走沒看到有什麼異狀,原本以為是個很複雜需要DFS的迷宮(傳聞說有傳送們),結果Glue Crow走一走發現他是個QR Code!!(靠到底怎麼發現的)

這題有兩種作法,要馬是寫telnet emulator模擬telnet行為建立出QR array,不然就是就是我們用的---手畫

有截圖版本的

也有純文字版本的

http://pastebin.com/A0c5Urth

有鑑於兩種都很難讀,我就立馬寫了一個QR code viewer

http://ensky.tw/mmmmmmmmmmm.php

最後居然還要手動修正錯誤的QR code(比照正確的去修XD),終於解出答案Orz

  • 24
    Let's play a game!
    nc 210.65.89.59 2424
    
    連進去之後
    ===================================================
    === Welcome to the 24 game! ===
    === You have 2 minutes to answer all questions. ===
    ===================================================
    
    
    

    Question (1 of 24): [1, 9, 4, 10]
    Answer:



    雖然不知道24 game是怎樣的遊戲,不過看起來是要回答問題,那直覺猜想就是用+-*/都出結果是24的式子
    試了一下發現果然沒錯
    ===================================================
    === Welcome to the 24 game! ===
    === You have 2 minutes to answer all questions. ===
    ===================================================
    
    Question (1 of 24): [1, 9, 4, 10]
    Answer: 1+9+4+10
    Great!
    

    也就是要在2分鐘內解完24題,聽起來就不是人腦可以作到的事情,所以用python寫了個solver

    我的邏輯滿簡單的,既然數字的數量固定,並且測試後發現可以用括號

    Answer: asdfadsf
    ERROR!!! Answer should match [-+*/0-9()]+
    

    因此救窮舉出了全部的解法。

    // 四個數字加上三個運算子(operator)
       1  op1   2  op2  3  op3  4
    // 括號位置有三種可能
    (            ) or    )
              (           )   or   )
                       (            )
    

    因此窮舉上也很簡單,就直接一直包for就結束了

    測試結果是某些情況下會無解,經提醒發現可以使用python的**(平方)和//(取整除數)運算子

    再使用node.js寫了個簡易的 stream piper 將 nc 和 python 的 stdio 接起來讓程式可以自動跑

    卻發現程式還是有些解會跑不出來,手動測了測發現每個數字都可以在前面加上-變成負的

    改了這個邏輯之後有成功讓程式跑到23題,但24題始終過不了

    試了好久也沒有頭緒,就在要放棄的時候Nier說順序可以調換

    加個permutation之後就瞬間結案XDD

    最後code在此,不能期待有多漂亮畢竟是一次性Hack而已XD

    https://gist.github.com/ensky/c97778d5858be505006f

    但身為沒有資安專業的資工人居然可以在CTF拿到分數還是很爽XD

 
over 2 years ago

https://github.com/ensky/Proxy.js/

前言

最近因為另外一份專案需要使用Crawler爬別人家的網站,而傳統proxy不太容易作到Connection pool,他們通常妳抓多快就用多快速度去抓,但因為我的Backend使用PHP,每次抓取是用不同的process去抓的,若沒有Connection pool很容易造成被抓取網站的困擾。

Related works

之前使用過Squid, TrafficServer和Varnish,其中Squid效能普普,使用記憶體頗多,而TrafficServer那時測試結果不太穩定(2012),之後就沒有使用,最後Varnish沒辦法用來做Forward proxy,因此打算自己寫一個

實做

採用Node.js當proxy server主體 + Redis用來存放LRU快取資訊以及當Memory cache,使用到的package大概主要是connect, request, http-proxy, redis等
主要邏輯就像我在github寫的一樣,做些前置動作之後就依序check memory, disk,若都不在則fetch, 最後存回cache中, 並更新LRU table

var main = function () {
    proxy.use(initialPass)
        .use(hitCheck('memory'))
        .use(hitCheck('disk'))
        .use(fetch)
        .use(saveCache('disk'))
        .use(saveCache('memory'));
    http.createServer(proxy).listen(conf.proxy.port);
};

LRU實做部份則使用HashMap和List實做。用List模擬Queue資料結構,重複的Item被插進去的時候會在HashMap中counter+=1,這樣就知道List中共有多少筆重複的Item,刪除的時候先做Counter --,若Counter != 0則不要刪掉他。

 
over 2 years ago

最近8comic改了一次圖片網址產生的方式,這次不再是用|做分割,取而代之的是用一種似乎是他們自己發明的編碼方法。
而我們知道8comic的工程師一直都不怎麼強,看他們的js寫作風格可以略知一二,想必編碼方法應該也很好破解。

Read on →
 
about 3 years ago

林宏昱 (Hung-Yu, Lin; Ensky Lin)

聯絡方式 (Contacts)

  • enskylin (AT) gmail (DOT) com

興趣

寫網頁、羽球、網管、騎車、教學、學新東西。

擅長

網頁設計、網頁程式架構、網路管理(FreeBSD)、網路程式設計、資料庫。

  • Language
    • Advanced
      • Front-end Web development(Javascript, CSS, HTML5, jQuery, Backbone, Underscore.js, ...)
    • Back-end Web development(PHP, Node.js)
    • Chrome extension development
    • Fine
    • Network Programming (C++)
    • Python
    • Good
    • Java
    • Beginner
    • Android development

經歷

  • 2014.9 - now: Synology Inc, Software Product Developer.
  • 2013.7 - 9: Yahoo! Inc, Engineer Intern, Frontend Engineer
  • 助教
    • 2014: 計算機概論、資料庫系統概論
    • 2013: 計算機系統管理、物件導向與程式設計
  • 2012 - 2014: 交通大學計算機中心助教, BSD, WWW(leader), Network, BBS
  • 2013: WikiUrSchool, 網頁架構諮詢
  • 2013 - 2014: 交通大學藝文中心, 系統管理
  • 2011: con-come, 網頁程式設計師
  • 2010: Heroxhero, 網頁程式設計師
  • 2010: NBL, 網頁程式設計師

學歷

  • 國立交通大學資訊科學與工程研究所碩士
  • 國立交通大學資訊工程學系學士

作品

 
almost 4 years ago

簡介

最近Facebook似乎常常出現諸如「你的好友關係圖」之類的App,有些很有趣;然而總覺得那些App就只是把按讚數和留言數加起來排名而已(或許有些還有共同圖片數量),感覺並沒有很好用。身為一個使用者,我可能更想知道一些其他的資訊,像是「到底排名最高朋友是亂按了哪些讚」或者「xxx在我的文章上都留些什麼言」之類的有趣訊息,就開始寫這個Work了。

演算法

其實FriendMining說實在根本就沒有「Mining」,充其量只是做統計(statistic)而已,並沒有真正在做資料探勘的動作(classification, clustering...)

我做的事情就只是把FB的graph api丟回來的東西做個分群sorting而已,我分成「回應」、「讚」還有「兩者加起來」三條queue,插入的時候做插入排序。

由於FB有一次抓取資料限制,一次抓越多等待時間也越長,為了節省等待時間我讓JS每抓回來一堆資料之後就立刻re-render一次,因此你會注意到邊抓的時候就可以邊呈現抓好的資料結果。

使用技術

  • Facebook JS SDK
  • Twitter Bootstrap => CSS Framework
  • jQuery => for DOM
  • jQuery UI => for AutoComplete
  • Underscore.js => for template
  • BackBone.js => for router
  • Showdown.js => help頁面使用Markdown
  • Chosen => 朋友塗鴉牆選擇

心得

20130104這個值得紀念的一天的下午我居然就花在這個work上面了,雖然說滿有趣的,但也有點淡淡的哀傷...XD

分享到EZsoft、BS2上的反應還不錯,還被免費資源網頁社群介紹,算是有點小小成就感:D

 
about 4 years ago

簡介

新酷音真的比新注音輸入法好用太多,智慧選字、全形標點,怎樣都不想換回新注音輸入法。

不過新酷音對64bit的支援一直都有點問題,網路上有人提供64bit的載點和解法,但經測試過後並不成功。

於是就絞盡腦汁的嘗試XD,終於給我嘗試成功!

測試過程

經觀察後發現windows在安裝輸入法的時候,若發現他是32bit的輸入法,會將檔案放在C:\Windows\SysWOW64\下;而64bit的則會放在C:\Windows\System32\下

新酷音經熱心網友改版之後有了
32bit
64bit兩種版本,於是分別放在syswow64和system32下的話,就可以成功使用囉!

安裝步驟

  1. 下載並解壓縮到C:\下
  2. 去控制台->時鐘、語言和區域->變更鍵盤或其他輸入方法->變更鍵盤->新增->新酷音輸入法->確定
  3. 大功告成!
 
about 4 years ago

Versions

  • v2.0 - 終於更新了下載原尺寸相片的功能XD
  • v1.6 - paypal修改連結、i18N加上中文語系
  • v1.5 - 新增反向排序功能
  • v1.4.1 - 版權宣告
  • v1.4 - 效能調校 - 讓圖片不會一次全顯示出來
  • v1.3 - 自訂相簿名稱
  • v1.2 - 效能調校 - zip壓縮改用html5 worker模式
  • v1.1 - 修好壓縮檔的問題
  • v1.0 - 壓縮檔下載(不過是壞的)
  • v0.1 - 最初版本,僅能直接從FB相簿頁面下載

Introduction

前陣子找到一款FB相簿下載Chrome extension,不過好像被下架了,於是我就自己做了一個功能更強大的XD。

Feature

  • 下載頁面極簡、方便好用
  • zip打包下載功能,且可設定檔案名稱以及排序

Snapshot

Download

Facebook Album Downloader