2014年2月25日 星期二

[Linux] 從 MongoDB Standalone (Single-Noe) 到 MongoDB HA (Replica Set) 的線上轉移方式(without shutdown/offline) @ Ubuntu 12.04

不關機的轉換原理應該都差不多?例如把水管從 A 處改接到到 B 處,只是情境跟操作手法適不適用是需要考慮的重要因素,在此先敘述使用情境:
  • 一隻 PHP 定期收到資料後,把資料存在 /tmp 區,再透過 popen 在背景發動一隻 pymongo 程式讀取 /tmp  資料,由 pymongo client 連到 mongodb server 塞資料,塞完後就斷線的模式。所以 CGI 有自己的 PID,而 pymongo 寫的 tool 也有自己的 PID。
  • 資料的單純作 insert 為主,還沒有負責處理 query 的需求,故 mongodb 只要能確保資料有被記錄起來,沒有損失即可,但無法保證讓 Replica Set 的資料馬上就跟 Standalone 一致。
線上轉換原理:
  1. 架設 MongoDB Replica Set
  2. 將更改 pymongo 程式,將 mongodb server 位置改到 Replica Set 即可
  3. 將 Standalone MongoDB 用 mongoexport 匯出資料 table.json, table2.json, ...
  4. 將資料用 mongoimport 方式匯入到 Replica Set 之 PRIMARY node 即可
在上述的使用情境下,資料的收集就不會間斷,至於官方介紹的方式也可以參考一下,屬於把 mongod 關掉後重開:Convert a Standalone to a Replica Set

此外,一些心得:
  • 原先資料就使用系統 _id 管理,不覆蓋 _id ,而 _id 有時間資訊,匯入新的機器(Replica Set) 沒有問題
  • 匯入資料若碰到 _id 一樣時,會 skip 掉,所以不必擔心重複匯入的問題
  • 如果匯錯資料時,例如預計到 table 1,結果不小心匯到 table 2 時,假設兩種資料格式有關鍵的差異點,例如在 table 1 的 record 才有 {"helloworld":0} 的屬性,那就好辦,把這類 record 找出來刪掉即可

# 找尋 table2 中,record 裡 hellworld 屬性的資料筆數
firstset:PRIMARY> db.table2.find({helloworld: { $ne : null } }).count()
firstset:PRIMARY> db.table2.remove({helloworld: { $ne : null } })

[Linux] ~/.dropbox-dist/dropboxd : Segmentation fault (core dumped) @ Ubuntu 12.04 64Bit

三天前還正常...不知為何突然掛了。

$ ~/.dropbox-dist/dropboxd
Segmentation fault (core dumped)

試過了砍掉 ~/.dropbox 和重裝還是一樣

$ rm -rf ~/.dropbox ~/.dropbox-dist
$ cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -
$ ~/.dropbox-dist/dropboxd
Segmentation fault (core dumped)


最後找到解法:

$ sudo apt-get install nautilus
$ ~/.dropbox-dist/dropboxd
This computer isn't linked to any Dropbox account...
Please visit https://www.dropbox.com/cli_link?host_id=xxxxxxxx to link this device.

2014年2月23日 星期日

人生各自精彩!



話說,若要這麼計較的話,從第一份工作就是跟 startup 相關的,在一個鼓吹以技術進行 spinoff 的單位且之後的旅程也差不多...但 startup/spinoff 不見得是因為理想,而是為了營運管理類的。

隨著年紀增長,週邊的同輩、學長弟妹一個個地跳入大家口中的 startup 了,不少人在喊:離開舒適圈、精實創業。今年初漸漸對這些口號麻木了,大概也得知許多八卦吧(大多是底心底薪的欲望),據前輩的分享,在矽谷的生態中,其實 startup 可是早就被當成商品在公司之間賣來賣去的,所以...聽首歌好了 XD



今年的新體悟:
口號一切都源自于人性層面,所謂的 startup ,粗略定義:自己當老闆。廣義一點是做自己想做的事,甚至第一手享受到成果。然而,回鄉接爸媽的事業就稱不上嗎?把自己的生活過得更充實稱不上嗎?把家庭顧好稱不上嗎? 體驗不一樣的生活稱不上嗎?
我想,站在經濟推動上,可以增加工作機會,對社會有幫助仍是十分鼓勵的。但是,單純在喊離開舒適圈等等的說詞(有些startup還過得比較爽),就比較像廣告台詞、算命先常說,那種統計學很容易打到底心話:你是否爾偶覺得沒人懂你,或是天氣預報:晴時多雲偶陣雨 XD

現在我比較會推薦別人,先想想自己要過怎樣的生活 :) 至於要不要 startup 倒是其次的(但鼓勵持著 startup 珍惜資源的精神去做規劃),並且其含義可以延伸許多相關事物,看看自己要挑哪樣就好:
  • 個人角度,珍惜時間並規劃時程,看是要學哪個語言、樂器、興趣、運動或是旅行增廣閱歷都是十分好的以個人為基準的 startup ,不見得一定要掙錢角度,只要珍惜光陰都是!因為時間是生命中絕對有限資源
  • 公司角度,珍惜資源,把角色做好尋求貢獻度,也稱得上團體中的 startup 吧 XD 有股份的就幫公司掙錢,沒股份的,就找尋個人成就感、作出自己的代表作

2014年2月20日 星期四

當 MicroUSB <-> USB 傳輸線一條不用 25 元時...

MicroUSB <-> USB

記得兩三年前看過一則影片是在講經濟學的事情:
當貧富差距越大時,奢侈品的花費 >> 民生必需品
例如在看一場電影是要花很多錢,但吃一頓飯則不用,這不是國家很貧窮,而是貧富差距大,導致只有有錢人才可以看電影院,為了電影院的營運,只好收費提升。然而,正當我在路邊攤看到手機傳輸線兩條賣 50 元時,我開始在想,智慧手機是不是變成民生用品啦?既然我路邊攤買的到一條 25 元,那肯定有地方賣更便宜...

於是我找一下露天...果真如此...一條 1M 的只賣 9元 XDDD

當這種 USB <-> MicroUSB 傳輸線已經進入像牙籤、口罩、牙刷等民生用品的價碼時,站在經濟學的角度,是不是有什麼慢慢顯現了?搜尋露天:彩色麵條

彩色麵條

[Linux] 使用 MAXMIND GeoLite2 Free 進行 Offline 查詢 IP 與 Country 和 City 對應 @ Ubuntu 12.04

使用 MAXMIND DB 進行 Offline 查詢 IP 與 Country 和 City 對應

雖然網路上還有不少可以線上查詢的服務,將 IP 轉成地區資訊,如:

$ curl ipinfo.io/8.8.8.8
{
  "ip": "8.8.8.8",
  "hostname": "google-public-dns-a.google.com",
  "city": null,
  "region": null,
  "country": "US",
  "loc": "38.0000,-97.0000",
  "org": "AS15169 Google Inc."
}


不過,大多都有查詢次數的限制,所以,自己架一個來處理吧,在此就挑選 MAXMIND GeoLite2 Free 來使用,其中 FREE 版本就只提供查詢 Country 跟 City 而已。

以 GeoLite2-City.mmdb 為例:

<?php

$target_ip = isset( $_REQUEST['ip'] ) && !empty($_REQUEST['ip']) ? $_REQUEST['ip'] : ( isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : NULL ) ;
// $target_ip = '8.8.8.8';

require( 'MaxMind/Db/Reader.php' );
require( 'MaxMind/Db/Reader/Decoder.php' );
require( 'MaxMind/Db/Reader/InvalidDatabaseException.php' );
require( 'MaxMind/Db/Reader/Metadata.php' );

$reader = new MaxMind\Db\Reader('/path/GeoLite2-City.mmdb');
$record = $reader->get($target_ip);
$reader->close();
echo "<pre>";
print_r( $record );
echo "</pre>";


其中 MaxMind 程式碼可在 github.com/maxmind/MaxMind-DB-Reader-php 下載,此外,在 Ubuntu apt-get 上也有 php5-geoip - GeoIP module for php5 可安裝。

查詢 8.8.8.8:

Array
(
    [continent] => Array
        (
            [code] => NA
            [geoname_id] => 6255149
            [names] => Array
                (
                    [de] => Nordamerika
                    [en] => North America
                    [es] => Norteamérica
                    [fr] => Amérique du Nord
                    [ja] => 北アメリカ
                    [pt-BR] => América do Norte
                    [ru] => Северная Америка
                    [zh-CN] => 北美洲
                )

        )

    [country] => Array
        (
            [geoname_id] => 6252001
            [iso_code] => US
            [names] => Array
                (
                    [de] => USA
                    [en] => United States
                    [es] => Estados Unidos
                    [fr] => États-Unis
                    [ja] => アメリカ合衆国
                    [pt-BR] => Estados Unidos
                    [ru] => США
                    [zh-CN] => 美国
                )

        )

    [location] => Array
        (
            [latitude] => 38
            [longitude] => -97
        )

    [registered_country] => Array
        (
            [geoname_id] => 6252001
            [iso_code] => US
            [names] => Array
                (
                    [de] => USA
                    [en] => United States
                    [es] => Estados Unidos
                    [fr] => États-Unis
                    [ja] => アメリカ合衆国
                    [pt-BR] => Estados Unidos
                    [ru] => США
                    [zh-CN] => 美国
                )

        )

)


查詢台灣IP:

Array
(
    [city] => Array
        (
            [geoname_id] => 1668341
            [names] => Array
                (
                    [de] => Taipeh
                    [en] => Taipei
                    [es] => Taipéi
                    [fr] => Taipei
                    [ja] => 台北市
                    [pt-BR] => Taipé
                    [ru] => Тайбэй
                    [zh-CN] => 台北市
                )

        )

    [continent] => Array
        (
            [code] => AS
            [geoname_id] => 6255147
            [names] => Array
                (
                    [de] => Asien
                    [en] => Asia
                    [es] => Asia
                    [fr] => Asie
                    [ja] => アジア
                    [pt-BR] => Ásia
                    [ru] => Азия
                    [zh-CN] => 亚洲
                )

        )

    [country] => Array
        (
            [geoname_id] => 1668284
            [iso_code] => TW
            [names] => Array
                (
                    [de] => Republik China
                    [en] => Taiwan
                    [es] => Taiwán
                    [fr] => Taïwan
                    [ja] => 中華民国
                    [pt-BR] => Taiwan
                    [ru] => Тайвань
                    [zh-CN] => 台湾
                )

        )

    [location] => Array
        (
            [latitude] => 25.0392
            [longitude] => 121.525
            [time_zone] => Asia/Taipei
        )

    [registered_country] => Array
        (
            [geoname_id] => 1668284
            [iso_code] => TW
            [names] => Array
                (
                    [de] => Republik China
                    [en] => Taiwan
                    [es] => Taiwán
                    [fr] => Taïwan
                    [ja] => 中華民国
                    [pt-BR] => Taiwan
                    [ru] => Тайвань
                    [zh-CN] => 台湾
                )

        )

    [subdivisions] => Array
        (
            [0] => Array
                (
                    [geoname_id] => 7280290
                    [names] => Array
                        (
                            [de] => Taipeh
                            [en] => Taipei
                            [es] => Taipéi
                            [ja] => 台北市
                            [pt-BR] => Taipé
                            [ru] => Тайбэй
                        )

                )

        )

)