Home » 2013 » February

換 NoSQL 前的建議...

原文是「Medium Data: things to try before abandoning SQL」,放棄 SQL 前應該要嘗試的事情,原文一開始就用粗體說明帶有強烈的偏見 XD

First, my thesis: a lot of less-experienced developers are using big data and NoSQL technologies because they are new and cool, and because SQL is old and hard. A lot of these people would save themselves time and effort by learning more about SQL and tuning their databases and hardware just a little bit.

文章寫的相當概念性,主要是說明幾件事情:

  • 其實 SQL 可以解決大部分的事情,大家都知道 SQL 的瓶頸在哪裡,有哪些 workaround 可以避開。
  • 不要因為 MySQL 做不到就覺得 SQL 不好用,在這種情況下,PostgreSQL 的功能與成熟度很值得看看。
  • 不要用 Oracle 官方版本的 MySQL... XD
  • 通常可以用 cache 解決的就用 cache 試著解看看,雖然 invalidate 問題不太好處哩... XD
  • 如果是 Read 數量太多,可以用 replication 解決不少問題。
  • 試著去理解 index 的「原理」,也就是資料結構,這對於要怎麼用 index 絕對有強力的幫助。
  • 當上面都做完而發現還是不夠的時候就 sharding 吧。

在 FreeBSD ports 裡用 local patch 修正問題...

FastCGITrac,遇到 Trac 常常出現 MySQL server has gone away 的問題,官方看起來非常的 open source style:我沒遇到,不太想要處理這個問題... XD

Anyway,這個問題可以透過「#3645 (MySQL connections don't reconnect after idle timeout) – The Trac Project」的 comment:8 給 workaround 掉,但我不希望在升級後問題又跑出來,所以就用「Apache 2.2 worker MPM 與 mod_fastcgi 的問題」這邊的解法來解了:

www/trac: NO_CHECKSUM=yes | PATCH_SITES=http://freebsd-patches.s3.amazonaws.com/trac/ | PATCHFILES=patch-trac__db__mysql_backend.py

不過 NO_CHECKSUM=yes 有點討厭,來找看看有沒有辦法「增加 checksum」而非「忽略 checksum」...

MySQL 5.5 與 5.6 的預設值差異...

Oracle 放出 MySQL 5.6 後,Percona 將 MySQL 5.5 與 5.6 設定值的差異整理列出來:「MySQL 5.5 and 5.6 default variable values differences」。

因為這是直接 dump 系統設定值比較,理論上所有「可以設定的值」都可以透過這個方法找出差異,不是靠設定值的改變就沒辦法了...

文章後面有對作者覺得比較需要講的部份提出來。其中 innodb_file_per_table 終於變成預設值了 XD

先繼續觀望...

用 C Macro 實作的紅黑樹...

用 C Macro 實作的紅黑樹 (Red-black tree) 很經典,不過每次都忘記怎麼用... XD

紅黑樹是平衡二元搜尋樹的一種,除了二元搜尋樹有的結構外,節點的資訊多了顏色。然後利用顏色達到平衡的特性。

先定義單一節點的資料結構:

struct element {
    char *key;

    int value1;
    char *value2;

    RB_ENTRY(element) meta;
};

紅黑樹的每個節點都需要紀錄母、左、右節點的指標,以及顏色,其中 RB_ENTRY() 所代表的資料結構會負責紀錄這些值。

再來是定義母節點的資料結構,這樣之後就可以使用 struct tree tree1;struct tree tree2;struct tree tree3; 產生許多 tree 了:

RB_HEAD(tree, element);

這樣就會產生 struct tree 這個資料結構。如果只用一次可以偷懶寫成:

RB_HEAD(tree, element) tree1;

定義完資料結構後,接著比較函數 (要如何在兩個元素之間挑出大的那個):

int element_cmp(struct element *a, struct element *b)
{
    return strcmp(a->key, b->key);
}

接著就可以產生 C 語言的 function prototype,以及實際的 function:

RB_PROTOTYPE(tree, element, meta, element_cmp);
RB_GENERATE(tree, element, meta, element_cmp);

然後程式裡面就可以這樣初始化:

struct tree tree1;
RB_INIT(&tree1);

其中 tree1 就變成之後所有操作的基礎。

增加元素:

struct element *el;
el = malloc(sizeof(struct element));
el->key = strdup("key1");
el->value1 = 1;
el->value2 = strdup("value2");
RB_INSERT(tree, &tree1, el);

如果要尋找的話可以用 RB_FIND()

el->key = "key2";
pointer = RB_FIND(tree, &tree1, el);

其他的就翻 tree.h 檔裡面類推...

給新手看的入門:要怎麼用 Google Reader 接收資訊

在公司內被問過好幾次了,用口頭講都比較概略性的講一講。這篇文章算是欠稿欠很久了...

對於剛開始用 Google Reader,或是很少用的人,我給的建議「不要一次想要訂太多東西」,一步一步去試,每個人讀文章的習慣都不一樣,用 Google Reader 整理的「最佳方式」當然也會不一樣。

可以嘗試的幾個方向:

開 Official 的分類來放官方 blog/feed

官方的 blog (或是 feed) 通常文章數量都不多,而因為官方的 blog 都官腔官腔,看的時候也需要抱著「這是官方的 blog」的心態看。拆一個獨立的分類放,集中一起看會是不錯的方式。

你可能一時間想不到有哪些官方的 blog 可以訂。再拆細一點,你可以先從有付費的服務表列,這些是我有付錢的服務,如果有可以訂閱的 feed 我都一定會訂起來看:

然後可以把現在沒付錢的常用服務也訂起來:

然後常用的硬體、軟體都可以訂:

訂可以放空腦袋的圖片 blog/feed

等到你的 Google Reader 放了不少資訊類的 feed 之後 (而且是只有資訊類的 feed),你開 Google Reader 的次數就會愈來愈低... XD 為了解決這個問題,你要放「大量」可以放空腦袋的 feed,第一類推薦的就是圖片 (開個獨立的分類來放吧),這可以去 Tumblr 上找,像是:

  • ak47 (偶而有 NSFW 類的圖,不過大多數情況應該還好)

如果你喜歡吃東西,就找美食 blog 訂。如果你喜歡旅遊,就找遊記 blog 訂。

附帶提醒,如果你發現裡面很多置入性行銷的文章,就再另外分一個類別吧 :p

最後的提醒...

中文 (母語) 與其他語言的 blog 要分到不同分類,如果你對簡體中文不熟悉的話,把簡體中文的 blog 也拆開。因為看母語與看其他語言的速度是不一樣的,如果看很多 feed 的時候,步調不一樣會很累。

希望對一直不知道要怎麼使用 Google Reader 的人有幫助... XD

看到許多其他的 CDN...

維基百科的「Content delivery network」條目裡面有份列表 (「Notable content delivery service providers」這個段落),不過剛剛在「HTTP Archive: new stats」這篇文章裡面又看到一些沒看過的名字 (在「Sites hosting HTML on CDN」這個段落),實際看了看發現還不少沒看過名字的 CDN...

一個是 cubeCDN,一家公司在土耳其的 CDN,但官網上一堆連結都失效 XD

另外一個是 Azion,一家以巴西為主的 CDN,除了巴西以外,還有美東、英國、荷蘭、新加坡、日本。缺了美西是哪招...

Archives