[筆記] Mongodb 特色,缺點,優化

經由J同事的介紹,第一次聽到 MongoDB

剛好我們的 project 的情況滿適合的(schema會一直變動,每次schema變動,interface都要改,很痛苦)

就試用了一下,也 survey 一些筆記,有錯請指正,謝謝 🙂

MongoDB 特色

(括號:代表網路上 survey 到,還沒有實際體驗)

  1. 減少 join:以JSON的格式儲存資料,一個 document 中的資料,以往在 MySQL 中都要存在好幾個 table ,減少 join 速度就快。(當然 MySQL 也可以作 denormalization,只是這也是一門學問啊)
  2. 強大的 query 能力
  3. schema-free:不再怕 schema 改變,當資料量一多,多一個 column,也是很花時間的。
  4. (sharding & replication)
  5. (第三方支持豐富)

繼續閱讀 “[筆記] Mongodb 特色,缺點,優化"

[筆記] 地圖上的即時問答服務 ex: LocalMind, 面包圈

xx餐廳最近有什麼特價?
xx電影院排隊的人多不多?
xx店今天有沒有開?

如果你常常有之類的問題,那麼 LocalMind, 面包圈 這兩個服務就很適合你

你可以在上面選一個地點,或是一個區城,問一個問題

它會把問題發給在那裡打卡的其他人,讓他們來回答你

需求面:

這種服務,我會想用。

發問方的好處:第一,我可以節省去其他地方搜尋的時間。第二:我可以得到更即時的資訊。第三:可能是其他地方都得不到的資訊。

回答方的好處:如果沒有其他實質的好處 (ex: 錢,你是那家店的老闆),那大概就是幫助人的滿足感吧。

實作面:

我覺得除了這種媒合類型的服務都有的問題 (ex: 冷開始,問答的品質 等等)

還有一個問題是,目前 LocalMind,面包圈 的作法,都很依靠 外在打卡的服務

(LocalMind 是吃 FourSquard,面包圈 是吃 新浪 和 騰訊 微博)

我覺得如果那些打卡服務也要作 即時問答服務,門檻會低非常多,畢竟是基於原先使用者之上。

[筆記] WordPress 同步發文至 Facebook, twitter, plurk, Google Buzz 等社群網路

WordPress to 社群網路
圖片來源Pseric

現在幾乎會上網的,都有用 社群網路
台灣地區熱門的像是 Facebook, plurk, murmur 等等

如何在 WordPress 發文章時,自動同布到常用的 社群網路 中來增加 blog 文章的曝光度?

使用環境 wordpress 3.0.5
社群網路 Facebook, twitter, Google Buzz, Plurk 繼續閱讀 “[筆記] WordPress 同步發文至 Facebook, twitter, plurk, Google Buzz 等社群網路"

[筆記] 如何設定 sudo 權限?

>sudo 的權限是設定在 /etc/sudoers (需要root權限才能修改)

/etc/sudoers 的格式:

# 使用者   登入來源主機=(可切換的帳號)  可下達的指令
root  ALL=(ALL) ALL

# 群組   登入來源主機=(可切換的帳號)  可下達的指令
%sudo ALL=(ALL) ALL

如果想將 user1 可以用 sudo 來 執行 ls

user  ALL=(ALL) /bin/ls #需要是絕對路徑!

方便設定一群 sudoers 的話,就是開一個 group (groupadd),ex: admin
將 sudoers 加入 admin 群組中 (in /etc/group)
再加入一行至 /etc/sudoers

%admin ALL=(ALL) ALL

如何 減少 寫程式 的 風險,作出 較精確的 時程估計

>最近兩周在完成一份工作
要把之前作的兩份研究,整合到另一個專案中
面對的問題大概是這樣子:

記錄一下實作時的想法

一開始,是一片混亂,不知道從哪邊開始著手
不確定這兩個研究是否還可以順利操作
不知道如何規畫時間,不知道兩周是否能完成

之前在 Head First OOAD 書上提到 減少風險 的想法
最大的風險來自無知,要減少風險就是要 減少不確定的因素
那麼就先來設計程式的流程吧

1. Top-down 設計程式流程

設計出 來源 –> 目標 的 overview flow (如左圖)
來確定每一個 function block (藍色方塊) 的 輸入 / 輸出 是什麼?
大致的想好 function block 的可行性
如果有需要 再為 function block 畫出其流程圖 (如右圖)
(function block 要到多細? 個人的感覺是,可以很快的想出其 pseudo code 時,就差不多了)

先設計程式的流程,有幾個好處

  • 對程式流程有大概的了解,了解問題有多嚴重? XD
  • 提早發現不確定的地方,不可行的地方,需要其他支援/技術的地方
  • 實作時不會迷失方向,能設計出較好的介面
  • 可以較精確的估計時程,這是最重要的,減少不確定性,才能作出合理的預估

2. 開始寫程式,要從什麼開始寫?
秉持著 減少風險 –> 減少不確定的因素 的想法
我選擇從 頭尾的 block (Fetcher / Inserter) 開始寫,
因為這兩個是對外的介面,完成對外的介面,剩下的都是在自已可以掌控的範圍內,相較之下風險較小

先寫出所有對外的介面,有什麼好處:

  • 優先解決不確定的因素,剩下可以完全自已掌控的環境
  • 隔絕外界的干擾,讓你的程式可以與外界更獨立的運作,就算面對的外在環境改變,就只用改介面部份的程式就好

3. 寫程式的過程中,使用 unit test / recorded test
為什麼要寫 unit test? 以及 什麼是 unit test? 可以參考 fcamel 大大 所寫的文章 為什麼要寫 unit test? 為什麼要先寫測試?
概念就是,為你的程式的每一個 function (unit),寫測試,而且最好要先寫
寫測試的效果大家都知道,就是確保你的程式的正確性
除此避免 bug 外,它也是一種減少風險的方法

  • 避免過度設計 (over-design):先寫測試,可以讓你了解 function 的輸入 和 輸出,只用寫出滿足輸入 / 輸出正確就行了,往往 “這功能以後很可能會用到" 的寫出來的功能,多半都是用不到。更何況,要用到,以後再寫就好。
  • 提高程式的可讀性 (readability):程式常常無法重新利用的原因,都是看不懂它在幹嘛 或是 跑出來的結果跟想像不一樣。測試 就 是許多的 use case,可以很快的幫助了解程式。
  • 提高程式的重用性 (re-usability):當一個 function 覺得難以測試時,就代表它該被拆成多個小 function。例如: 要寫一個 function 來以 統計 文件中 各個字 出現的數量,字以空白就分隔。這當然可以寫成一個 function 來解決,只是這測試起滿麻煩的;較好的寫法是,拆成3個 functions,一個讀入檔案,一個切空白,一個統計次數。如此一來 各 function 的定位簡單易懂,如此也提高了重用性,假設之後要 以 tab 作分隔 或是 算出文章的長度,都只用再改一個 function 就好了
以上,是最近的一些想法
運作的還滿順利的,時程都比較在掌握之中
記得 人月神話 中提到的
完成一個專案,1/2在 debug,1/3 在作規畫,只有1/6在寫程式
還滿符合這次的經驗 (最後,我大概花了4天在 de 一個 bug… orz)

其他 highlight code syntax 方法

>上一篇介紹了 SyntaxHighter: 在 blogspot 上顯示漂亮的 code 格式

還有其他的方法
1. code-prettify
一個介紹它的網站,可以看一下它 highlight syntax 的外觀
沒有選擇這一個,純粹是因為我覺得 Syntaxhighlighter 比較漂亮,而且有行數

2. Online syntax highlighting
超方便的 syntax highlighter
完全不用安裝,而是用 html 語法,來改變字的顏色和背景
有支援許多種語言
可惜我選不到喜歡的樣式,以及希望有行數

範例:

class X(object):
def __init__(self, x=set([])):
self.x = x

好用連結:
http://www.elliotswan.com/postable/
幫你轉換 <, > 等字元,在貼code時很好用!

SyntaxHighter: 在 blogspot 上顯示漂亮的 code 格式

>SyntaxHighlighter 目前出到 3.0.83 版
以下是簡單的如何使用在 blogspot 上的流程,官網有詳細的說明

1. 安裝 SyntaxHighlighter的 core 和 theme
在 <header> … </header> 之間加上

<link href='http://alexgorbatchev.com.s3.amazonaws.com/pub/sh/3.0.83/styles/shCore.css' rel='stylesheet' type='text/css'/>  
http://alexgorbatchev.com.s3.amazonaws.com/pub/sh/3.0.83/scripts/shCore.js

注意:blogspot 一定要加上 SyntaxHighlighter.config.bloggerMode = true;

4. 使用
語法:

<pre class="brush: <code 的語言>">
... code ...
</pre>

例子: Python code

<pre class="brush: py">
class X(object):
def __init__(self, x=set([])):
self.x = x
</pre>

顯示:

class X(object):
def __init__(self, x=set([])):
self.x = x

使用實例: Python: default value to a constructor’s parameter