2013年9月20日 星期五

鐵架式松果收納

用塑膠抽屜的好處是方便存取+防灰塵+乾燥劑有效利用, 搬家的時候也省得再裝箱, 繩子綁一下就方便搬動.

用鐵架則是堅固耐用, 不太容易積灰塵, 相較於木頭櫃子也經濟實惠又耐久壓使用.

鐵架是用這種鍍鉻鐵架: 【鐵架王】四層鍍鉻架(90x45x150cm)

不過我用的規格是 90x45x180cm, 大潤發就有賣, 不過現在大都是會生銹, 層網中間軟趴趴的便宜貨...

塑膠抽屜用這個規格: R099 R099特大彩虹抽屜整理箱 Rainbow Drawer Storage Box (XL)


考慮層板的承重, 以及塑膠抽屜疊放的承受力, 鐵架就用上面那張圖的方式來組層板, 一層可以左右兩個疊兩個總共四個, 三個層板就可以放十二個抽屜.


下層抽屜的外殼底部有用繩子綁在鐵架層板上, 以免遇到地震搖晃過大而滑動.

下層放比較重的小說, 一整個抽屜約 30KG 左右, 上層就放漫畫, 通常不到 20KG. 塑膠抽屜的外殼承重久了會變形, 還在研究怎麼用 L 型鐵片做結構補強.

鐵架最下面的底層一定要裝層板(卡在柱子的最下面一格刻度), 這樣子整個鐵架會比較穩固, 另一個原因是比較不會受潮, 打掃地板也比較方便.

最上面因為沒有柱子卡住抽屜, 所以可以就用來放滑輪整理箱, 裡面裝些比較輕的松果以策安全.


至於 CD 試到這種塑膠抽屜, 剛好可以放兩排 CD, 中間的縫隙可以留著方便拿 CD, 或是多塞一片進去放.


鐵架的層板若是用 120x45 的話, 就可以左右各放ㄧ個大抽屜, 中間塞這種放 CD 的小抽屜剛好.

150x45 的層板目前還沒試出最有效利用空間的抽屜組法.

有人問為什麼不用 90x60 120x60 150x60 這種寬 60 規格的層板? 這樣 R099 不就剛好整個放在層板上, 而不會在鐵架後面凸出來?

因為在用寬 45 的層板放 R099 的時候, 剛好是層板的邊框堅固地撐住抽屜的重量, 用寬 60 的層板就會有一邊是軟趴趴的層網撐住抽屜, 不夠堅固, 而且放久了之後層網會受重變形.

目前這種鐵架的便宜版本說層板支撐重量有幾十到一百公斤的, 實際上是框架才有這種支撐力, 中間的層網大都軟趴趴不堪負重, 長 120 或 150 的層板才有在層網做結構補強的設計, 不過目前還是 90x45 層板的空間使用效率最高, 就像上面的照片一樣一組剛好塞滿滿十二個抽屜.

有的地方可以買到木板的取代鐵網的版本(像是特力屋), 這種我覺得反而不耐庫存使用, 從重量來猜測這是木屑膠合板, 重量相當重, 而且承重久了會變形, 木頭材質也有機會受潮後散發出不酥胡的霉味, 當書桌用倒是還不錯.

2013年8月16日 星期五

Synology DS213j 測試文


官方網站: DS213j

在 pchome 線上購物 Synology DS213j 2Bay網路儲存伺服器 買入, 圖片亦取自此網頁





測試硬碟: Seagate 500G SATA2 HDDx2

運作模式: Synology Hybrid RAID (SHR) (With data protection of 1 disk fault-tolerance) 也就是 RAID 1


開始使用的時候要先把硬碟裝好(請參考隨箱附上的快速安裝說明)再打開電源開關, 在個人電腦執行瀏覽器, 從網頁介面連進去.

初次安裝需要上傳隨箱附上的光碟片裡的 DSM 檔案之後, 進行初始化硬碟(預設運作模式就是上面寫到的 SHR)及其他設定程序.

再次重開後需要等久一點, 才連得上網頁介面, 然後會自動跑 RAID 1 的 parity check(這詞用在 RAID 1 怪怪的), 放著跑就可以先睡覺去.
(500G 就可以從 22:52:05 跑到 04:26:29 才結束, 那裝 4TB 硬碟不就更久了...)


建好的檔案系統是 ext4, 故意直接拔掉電源再插回去開機後, 並不會因為 fsck 卡很久.


在 Control Panel 的 Shared Folder 設定分享資料夾之後, 透過網路芳鄰塞一些糟糕的壓縮檔跟比一雞還大的糟糕影片進去,

大略測試得到循序寫入速度/sequential write 70MB/sec 左右, 循序讀取速度/sequential read 90MB/sec 左右.

小檔案會被 DS213j cache 住, 重複讀取的時候不會產生硬碟 I/O 動作, 真不愧是 embedded linux.


故意關機拔掉一顆硬碟(這機型沒有熱插拔設計), 開機後會持續嗶嗶叫提醒有故障狀況發生.
(可以在 Storage Manager 的 Volumn 點 Beep off 關掉, 或是在 Control Panel 的 Hardware 的 Beep Control 關掉)

此時 RAID 狀態是降級(degrade)運作, 網芳仍然能夠存取 NAS 裡面的檔案. 

再次關機把硬碟接回去, 開機後仍然會持續嗶嗶叫, Storage Manager 裡面會顯示不認插上去的硬碟, 就算是本來 RAID 1 的另外一顆硬碟也是不認, 得在 Storage Manager 的 Volume 的 Manage 選 repair 進行修復, 並不會自動 rebuild.

修復的行為是從原本 RAID 1 的硬碟 raw read 再 raw write 到插上去的硬碟裡, 速度還比 parity check 快 -_-
(500G 的 10% 進度需時約 13~15 分鐘, 整個跑完將近兩個半小時)

跑完後有出現提醒訊息, 表示這種狀況要修復的話, 原本的 RAID 1 的硬碟至少要有一顆維持接在上面, 拔了再插就不認來用了.


目前唯一有問題的地方是... pchome 跟官方網頁上都是寫記憶體 512MB, 可是我在 System Information 怎麼只看到 256MB, 難道連記憶體也 RAIDM 1 了嗎?

寫信去客服問 -_-

--
官方回信:

很抱歉,因軟體問題造成您的困擾,還請多多包涵。

您遇到的問題是已知的軟體BUG,我們已於 8/8 修復錯誤狀況 http://www.synology.com.tw/releaseNote_cht/DS213j.php?lang=cht。

您可至官網上 DS213j 的下載中心去更新作業系統的版本:DSM 4.2-3226,以解決記憶體顯示錯誤問題,按此連結

2013年7月1日 星期一

strcmp() 傳 NULL 進去的神秘現象...

作業環境:
Linux li475-173 3.5.2-linode45 #1 SMP Wed Aug 15 14:10:55 EDT 2012 i686 GNU/Linux
gcc version 4.4.5 (Debian 4.4.5-8)

-

test code: (已經簡化到最少)

#include <stdio.h>
#include <string.h>

int main(void)
{
    char *na = NULL;
    char *nb = NULL;
    int ret = 1234;

    strcmp(NULL, NULL);  // case 1
    strcmp(na, nb);  // case 2
    ret = strcmp(NULL, NULL);  // case 3
    ret = strcmp(na, NULL);  // case 4
    ret = strcmp(NULL, nb);  // case 5
    ret = strcmp(na, nb);  // case 6

    printf("%d\n", ret);

    return 0;
}

case 1-6 只會使用其中一行進行編譯(gcc test.c), 不加其他編譯參數.

若加上 -Wall 可以看到類似這樣的警告訊息:
warning: null argument where non-null required

-

case 1 2 3 可以執行無誤, case 4 5 6 都會噴 Segmentation fault

-rwxr-xr-x  1 slzzp admin      4520 Jul  1 20:35 a.out.1
-rwxr-xr-x  1 slzzp admin      4520 Jul  1 20:36 a.out.2
-rwxr-xr-x  1 slzzp admin      4520 Jul  1 20:36 a.out.3
-rwxr-xr-x  1 slzzp admin      4622 Jul  1 20:36 a.out.4
-rwxr-xr-x  1 slzzp admin      4622 Jul  1 20:36 a.out.5
-rwxr-xr-x  1 slzzp admin      4622 Jul  1 20:36 a.out.6

b3b2d33b3f5dca1b9df14eed6056d216  a.out.1
b3b2d33b3f5dca1b9df14eed6056d216  a.out.2
015e405413b165b7539f3dfd6f0601f2  a.out.3
2e64c7055fae7e606412ef2adede6d87  a.out.4
8b620ac644f8a18e5cbb953d19b8ede5  a.out.5
d8987fb39dbb7046b772cb86a11f149e  a.out.6

故意把 case 1 跟 case 2 多複製幾行, 編譯後的 a.out 檔案大小跟 md5 
都相同, case 3 的執行結果 ret 是 0, 應該都被自動 -O 過了.

所以 case 1 2 3 根本沒進去 strcmp 執行過... oroz

補充: ret 是 0 表示 strcmp() 的結果是 TRUE, 理論上來說 NULL 跟 NULL
相比的確是一樣的沒錯.


那 case 4 5 6 的狀況呢...

查了幾下之後, 得到這個結論:
Passing a null pointer to strcmp() results in undefined behaviour.
Don't do it.

--
嗚嗚, libc/strcmp 沒有做防呆檢查...
只好再想想 test unit / test process 要怎麼改了... T_T

2013年2月22日 星期五

記錄一下經手過的網路規格

住處: CHT, 光世代 50/10 (2013/3/17 自動升速至 60M/15M)
老家: CHT, 忘了
大姑家: 忘了
小叔家: 忘了
姑婆家: 忘了
六姨家: 忘了

2013年1月9日 星期三

品愛情PimLove 的年齡搜尋功能

品愛情PimLove 好印象搜尋 年齡從 18 至 18 的女性


竟然沒有 18 歲的人? 可是找 18 至 19 歲的就會出現 18 歲的人...

品愛情PimLove 好印象搜尋 年齡從 17 至 18 的女性


怎麼冒出一個 19 歲的... -_-

--
找 6 至 12 歲的話, 這網站不會自動報警查 ip 吧? XD