2015年6月6日 星期六

SSH ProxyCommand to tunnel connections

在講解使用SSH proxycommand前, 要先談到為什麼需要tunnel機 (或是稱跳板機)

1. 在管理機房的大量機器時, 為了安全性還有Public IP有限的情況下, 我們會將一些機器擺在內網內, 而一般情況下外面的機器連不進裡面的機器, 例如資料庫, 或是一些檔案系統 (NFS)的機器。

2. 當我們的機器越來越多時, 不太可能一台一台的去設定使用者的帳號密碼, 尤其是公司能access機器的人越來越多時, 這是一件不可能的任務 為了解決以上兩點, 我們就要動用tunnel或是稱bastion機的solution, 詳細像下圖

為了要能連進內網, 我剛開始都是用SSH agent forwarding的方式, 這個也是大部份人 比較熟悉的方式, 詳情可以看ihower前輩的講解

而這篇其實是要記錄使用SSH proxyCommand 的方式連結, 先講解如何使用
修改~/.ssh/config
Host bastion
  User                   kakashi
  HostName               tunnel.test.com (or ip address)
  ProxyCommand           none
  IdentityFile           ~/.pem/your-tunnel.pem
  BatchMode              yes
  PasswordAuthentication no

Host *.test.com
  ServerAliveInterval    60
  TCPKeepAlive           yes
  ProxyCommand           ssh -q -W %h:%p bastion
  User                   ubuntu
  IdentityFile           ~/.pem/your-server.pem

在這裡可以先測試看看能不能連上Bastion server
ssh bastion

可以連上後再試試看, 使用
ssh server1.test.com

可以看到我們使用ProxyCommand的方式, 在bastion和server1.test.com中間建立一道proxy 而這邊要注意的的地方, 是需要使用-W的方式, 就可以直接forward你的SSH client, 這部分跟SSH agent forwarding的方式很像

後話: 有人會問, 為什麼要繞一大圈使用ProxyCommand的方式去連接target server呢?原本使用Agent forwarding的方式就不錯了啊。其實有下列兩個原因:

1. 因為最近在學習ansible作部署, 而ansible要透過bastion連接target server 好像只能用這種方式, 因為ssh agent forwarding只能用交談模式, 必須先連上bastion在連上target server

2. 在網路上看到這篇文章, http://heipei.github.io/2015/02/26/SSH-Agent-Forwarding-considered-harmful/ 使用Agent forwarding時, 其實是有security的問題的, 去man ssh就可以看到下列講解

-A  Enables forwarding of the authentication agent connection.  
    This can also be specified on a per-host basis in a
    configuration file.

    Agent forwarding should be enabled with caution.  
    Users with the ability to bypass file permissions on theremote host (for the agent's 
    UNIX-domain socket) can access the local agent through the forwarded connection.
    An attacker cannot obtain key material from the agent, however they can perform 
    operations on the keys that enable them to authenticate using the identities loaded 
    into the agent.


Ref:
http://backdrift.org/transparent-proxy-with-ssh
http://heipei.github.io/2015/02/26/SSH-Agent-Forwarding-considered-harmful/
http://alexbilbie.com/2014/07/using-ansible-with-a-bastion-host/

2014年11月29日 星期六

MongoDB使用一年小小心得

過去一年,重新投入軟體開發的懷抱,因為工作需要,有很多時間都需要接觸MongoDB,遙想四年前,還是各家NoSQL大戰,在那個勝負不明的時期,就有小試了一下MongoDB,只是沒想到他能夠撐那麼久,並且讓那麼多公司採用,還頗讓人驚訝的。

MongoDB是NoSQL中偏向document-level的一隻, 先講講優點好了

1. scheme-less 算是他最大的好處,以往開發程式,為了決定資料的scheme,常常要花一番工夫,而當之後要改scheme,又是另外一個麻煩的事情,更者關聯式資料庫常常會陷入要不要正規化的矛盾中,對於一些小型程式要做快速開發算是額外的overhead。

 2. 容易上手,MongoDB的query的語法設計的非常好,加上對於不同程式語言的Driver都有一定要求,簡單的command如find,update,delete都非常容易實現,而且也不容易有SQL injection的問題,不過使用PHP或Perl的人可能會詬病使用 $ 當作運算元。

 3. 容易水平擴充,由於一開始的設計就是為了能夠很好的scale,MongoDB在處理replica(複製),sharding(資料庫分割)方面算是下了不少工夫, 在sharding部分採用自己設計的Bson index, 而不像一般資料庫用incremental的id,就是為了能夠很好的自動處理sharding, 雖然早期被人詬病auto sharding很不給力,不過到了2.4後多了hash index,成功地解決了這個問題。

 4. Fail over的機制完備,在使用官方推薦的replica set狀態下,三台機器中,當Primay機器下線後,會自動選出新的Primary機器。

接著是討論一下缺點

1. scheme-less聽起來好像很不錯,但是其實scheme-less是scheme-plus,需要在每個document中塞入data的scheme,相對上面是浪費空間,所以MongoDB官方才會推薦,要把key設越短越好,以節省硬碟還有記憶體的使用量。

2. 不同的scheme塞入同一張collection內,容易造成Disk和Memory的Fragmentation,進而使效率降低,不同版本的資料還需要在程式邏輯端去避開,強烈建議scheme在脫離prototype後,一定要有固定的格式。

 3. Mongodb完全靠Mmap處理檔案操作,並沒有對Disk IO操作或是容量有什麼過多的設計,而對於硬碟空間就是浪費過多,加上Index tree是傳統B-tree結構,在硬碟的讀寫上沒有做任何優化,導致request增加,就需要對硬體做升級。

4. 一樣是B-tree的問題,當資料量大到一定時,讀寫就會變慢,就不得不做sharding或是將硬體升級,另外range query並沒有辦法做最佳化,需要常常做range query操作的資料,要好好考慮是否使用MongoDB

5. 目前2.4支援collection lock,lock系統也是MongoDB的濫傷,從一推出的Global lock,過了四五年了,還沒進化到document level的lock,就寫入而言就是只有悲劇可言,目前的Roadmap是說2.8就會把這個解掉。

2014年4月24日 星期四

Flask Note 1

想要來寫個Flask筆記, 這個系列會把一些看到, 或是曾經使用過的技術給記錄下來

環境需求:python2.7以上, python套件pip & virtualenv安裝

0. 建立virtualenv環境, 使用virturlenv目的就是為了建立一個乾淨的開發環境, 可以去掌握你撰寫的python程式跟其他package的相依性, 利於你的程式部署到其他機器上
$ pip install virtualenv
Requirement already satisfied (use --upgrade to upgrade): virtualenv in /Library/Python/2.7/site-packages
Cleaning up...
$ virtualenv .env
New python executable in .env/bin/python
Installing Setuptools..............................................................................................................................................................................................................................done.
Installing Pip.....................................................................................................................................................................................................................................................................................................................................done.
$ source .env/bin/activate #進入virtualenv環境
(.env) $
1. 在virtual environment 下安裝 Flask
$ virtualenv .env
(.env) $ pip install flask
2. 產生app instance
from flask import Flask
app = Flask(__name__)
3. 建立Route
from flask import Flask
app = Flask(__name__) 

@app.route('/')
def index():
    return 'Hello World !!!'

@app.route('/user/<name>/')
def user(name):
    return 'hello %s' % name

if __name__ == '__main__':
    app.run(debug=True);
4. run script by python interpreter
$(.env) python hello.py
*Running on http://127.0.0.1:5000/
*Restarting with reloader
接下來可以打開瀏覽器輸入http://127.0.0.1:5000/看看
還有http://127.0.0.1:5000/user/test
       http://127.0.0.1:5000/user/world

2014年3月29日 星期六

平庸的惡

1960年以色列情報單位"摩薩德"在阿根廷綁架了阿道夫·艾希曼(Adolf Eichmann)。

在以色列的法庭上, 艾希曼被指控是屠殺600萬猶太人的劊子手, 因為當年他是負責
猶太人問題最終方案的指揮官, 並且將一批批的猶太人送進了集中營和處死。

但看過相當多的資料後, 尤其是"阿倫特"為了這場審判而寫的"平凡的邪惡:
艾希曼耶路撒冷大審紀實", 發現艾希曼其實總體來說並不是一個惡人,
特別是以他自己的角度出發, 他自己宣稱只是依照上級指示,
甚至說自己對猶太人並沒有任何的仇恨。

「我發現以服從和接受指令為基礎的生活, 確實是一種舒適的生活。這種生活
讓一個人對思考的需要減到最小。」艾希曼在受審時說了, 在他的認知中,
自己只是個普通公務員, 每天盡責的處理上級交代的事。

阿倫特下的結論是這種平庸的惡會產生, 都是因為停止思考, 而進而使良知停擺。
此種良知危機將會導致惡的生成, 那麼更根本的問題, 應該是追問何以人會拒絕思考?

自己的感想是, 就算是在民主社會下面, 也是看得到許多平庸的惡,
許多人如果不關心國家事務, 很容易就被有心人士操控或是洗腦,
又抑或是為了利益或是權力, 而內化成停止思考, 停止去考慮其他人的福祉。

2013年7月20日 星期六

宗教亂想

話說最近在失眠的時侯,看了好多有存在主義內涵的小說和戲劇,以前其實不太了解為什麼歐洲會有文藝復興,最近才瞭解到中古歐洲被宗教深深的影響,基督教(天主教)的勢力龐大,宗教雖然可以救贖人心,但另外一方面也變成了一些有心人士操作利用的工具。

達文西的惡魔(Davici’s Devil)這部戲,先讓我開了眼界,戲裡面的羅馬教廷(教皇國)一整個淫亂邪惡,運用著上帝的名義,貪污,籠絡其他諸侯,還可以決定誰違反了上帝的旨意,背不出聖經裡面內容就可以處死(異教徒),教皇自己其實也違反教義,養了一堆妓女雛童,並且還公開收賄。達文西有幸在文藝復興時期的佛羅倫斯成長,在那個地方宗教的力量並沒有那麼強大,也是因為教會的腐敗,知識分子對其的反感,思想的發展變成對神權的革命,還有抨擊以往的制度,進而從人本出發對已有的事物(科學、文學、藝術、音樂、建築)做不一樣的學習與發展。

不過單純如我,原本以為戲裡面那些教皇是亂演的,沒想到卻是在歷史上真真正正的發生,讓我很吃驚的是,這個國家(教皇國)居然還存在著,也就是羅馬的梵蒂岡,不過我相信因為沒有權力了,所以現在應該已經恢復宗教的本質,這不經讓我不斷的思考,到底宗教的力量是不是抵不過權力和慾望,抑或是宗教根本沒有那麼大的力量,在日常生活中,也確實看到一些虔誠的教徒,作些落井下石,或是毫無同理心的事情,整個讓我大困惑,會不會他們每個人接受到上帝的旨意都不同呢?又會不會這根本就是從人的心中出發的,才會造成那麼大的差別。


註:沒有要貶低宗教的意味,之後要打一下機槍教父的心得,一個受到基督教改變的男人,還去拯救非洲國家的小朋友。

2012年9月16日 星期日

Ariane 5 的失敗

1996年的6月4日, 歐洲太空總署試射了一架無人駕駛Ariane 5火箭,這個計畫共花了十年和7千萬美金,但是這架火箭居然在發射後的36.7幾秒就爆炸了,意外事件的報告在兩個禮拜後出爐,指出了爆炸原因是因為程式設計的錯誤。

在飛行使用的慣性導航系統(IRS),正在處理一小段的資料時,因為無法轉換64bit的浮點數到16bit的整數,而造成了overflow的發生,隨即這個系統就關機了,而這段資料也被傳輸到另外一個備用的運算單元,這個重複的運算單元,就是怕原本的系統有問題而增設的,但是在幾毫秒後,這個備用的單元也關機了,原因就是這個系統跟原本的是一模一樣的,所以一樣無法處理那段資料,所以意外就發生了。

照一般程式處理的方式,當這個例外處理產生的時候,因為在realtime的系統上,我們會想辦法回復系統的狀態,而其實Ariane 5的IRS系統也做了很多這樣的處理,而因為這個系統是從Ariane 4就有的,而Ariane 5的速度比Ariane 4還要快上很多,一個無法被處理的值就這樣產生了,而原本Ariane 4的程式卻是假設不可能出現這樣的值(我想應該是為了效能的關係),而這個BUG對應的處理居然是直接關閉系統,也間接干擾了其他的系統。 

這個意外導致了很多的損失,追根究底卻是因為一個小小的程式BUG引起的,我想在這個系統越來越複雜的世界,真的有賴工程師的細心,尤其是寫realtime system的設計師,更是需要考慮各種不同的情況去做好例外處理,才能避免類似的情況發生阿。

2012年5月7日 星期一

復仇者聯盟




這個禮拜趁著勞動節去看了avengers, 不能不說的確是值得一看的大作,

不過談到劇情上面,而且想當然耳,這部片的劇情,大致上又是壞蛋入侵

然後被超級英雄打跑,最後大家過著幸福快樂的日子,但是要達到這個目的下,

必須要好好的把中間的過程好好的串聯起來,也就是如何讓大家感覺敵人非常

強大,而這些超級英雄一定要合作,我是覺得中間的鋪陳,雖然有些地方有點不合理,

不過大部份是可以接受.

而這部片最讓我覺得過癮的是,在那麼多主角的情況下,這部片的分鏡真的很不賴,

不會讓你有角色切換上面或是場景切換上面太唐突的狀況,而且每個人的能力值

做得很均當,不過有誰搶了誰的丰采,而且在刻畫不同主角個性的不同時,也帶入了

很多的笑點,能夠讓大家哈哈大笑,礙於這篇文不想爆太多雷,所以好笑的劇情我

也只能記在腦海中了,

在復仇者聯盟中,我最喜歡的超級英雄大概就是鋼鐵人了,我想大概是我的資工背景吧,

每次stark在詢問J.A.R.V.I.S的時候都讓我很興奮,要到那一天我們的人工智慧才能做到

那麼厲害呢,不過後來有去查wiki,原來漫畫裡面的J.A.R.V.I.S是個真人阿,不過還是電影

的設定酷多了,總而言之,這部片還蠻適合大家去看的

difference between present perfect and present perfect continuous

From now on, I decide to write some article in English, because I want to sharp my writing skill in English. Therefore, I need to find out some topic worth to be record. I realize that English grammar is
always difficult to me. I usually use wrong tense and can not express my meaning exactly. To this end, I would like to noted down some of knowledge.

There is a pretty awesome website called stackexchange. Today I read a question that also harasses me.
That is : "what's the difference between present perfect and present perfect continuous"  In someone's briefly explanation, I know that present perfect continuous form is used to talk about event happened in recent past, but this event have not been finished. Moreover, this form often is found with "for" and "since".

There are some examples.

I’ve done my homework' (it’s finished) / 'I’ve been doing my homework' (it’s not finished)
‘I’ve drunk my coffee' (it’s all gone) / ‘I’ve been drinking my coffee’ (there’s some left)
‘It’s rained every day since the weekend’ (repeated rain) / ‘It’s been raining all day’ (continuous rain)

2012年4月14日 星期六

補心安神

話說我從小到大就不是個很健康的人,在加上以前大學的時候出了車禍,到底有很多奇奇怪怪的病,其實從前就有認識中醫社的學長,在加上去上了幾堂社課,讓我了解到身體的病痛有時候是互相有關聯的,並不是頭痛醫頭,腳痛醫腳就會好的.

在上班一陣子後,原本就氣血不足的我,加上久坐缺乏運動的狀況,又讓我的身子很不爽快,所以就去看了新竹光復路上的劉中醫,因為我的小問題很多,所以這次開的藥單先針對最重要的部份,也就是我的元神(心)的功能去加強,以下是藥單的內容:
         
           天王補心丹:4g
           柴胡龍骨牡蠣湯:4g
           雞血藤:1g
           甘麥大棗湯:4g

主要治療的是心悸,我其實沒有跟醫生說我心悸的問題,因為那不是很常發生,只有我非常非常不舒服的時候才會,而劉醫生把脈的功力真的很強,不像很多中醫師只是照本宣科,而這帖的作用就是滋陰養血,補心安神,養心安神,和中緩急,也就是要讓我睡得好,不要緊張,讓身體放鬆並且補補血氣,天王補心丹看起來是主藥,從醫砭看到方中生地滋陰清熱以安神為主,所以要先把元神安定了,其他部份才能仰賴它去運作,接下來好幾個禮拜,我要好好的休養身心了

2012年3月16日 星期五

踩地雷

「我好希望他可以多請個幾天假。」小張趁傑夫離開工程師的辦公區時,趕緊跟隔壁的強尼小聲的訴苦,兩個人臉上都露出無奈的表情。

傑夫是某半導體廠的一個經理,剛從國外回來的他趾高氣昂,算算以他在國外的資歷能談到這個這個職位,可是相當的得意,而且頭上的老闆也分了幾個不錯的工程師給他,雖然在台灣的薪水沒有比在國外高,但是這裡所承受的壓力卻是比之前小很多,加上他深知台灣人的個性,可以讓他沒有後顧之憂的去分配工作。

「真不知道為什麼是我們要掛到他底下。」強尼對小張說。
「國外回來的人都自以為厲害,當年真的該出去闖闖,回來做個主管多好,只要動動嘴巴就好。」小張應道,
「case急的時候就跑來我們這邊喊加油,還跟上面老闆說我們會比deadline還快搞定,根本就是要搞死我們阿。」也是同部門的健泰也參與了討論。

傑佛森端了一杯咖啡到傑夫的座位,「傑夫阿,來喝杯咖啡。」傑夫順手接過,「昨天面試的新人怎麼樣阿?」傑佛森問道,「怎麼,你也想知道阿?他是從電心那邊過來的,你也知道他們搞了一顆CPU不值錢阿。」傑夫邊說著,邊想著(這個人我可不能讓給你,他可是做CPU的高手),又回答道「雖然我們給他資深工程師位階,但是我想他的火侯還沒到阿,你也知道我們缺人啦。」經理階層之間的搶人大戰,傑夫早就經歷過了,是不會那麼容易就上當。

「你知道嗎?新來的火哥遞辭呈了!」小張說。
「這麼快?我們都還沒有混熟呢。」強尼回應。
「聽說傑夫丟給他一堆事情,還說他沒有資深工程師的價值,結果他一狀告到大老闆那邊去,你也知道大老闆根本不想管這種鳥事。」小張說。
小張,強尼和健泰的這個小區塊不斷小聲討論的這件事情。

這天,部門的大會議舉行,「今天我們有重大的人事異動要宣佈,傑夫暫時改當技術經理,他手下的人都掛去傑佛森下面,新一年度,我們有一些重要的計畫...」。「哇靠,傑夫被架空了喔?」「我們解脫了嗎?」「沒人讓他使喚,傑夫還能幹麼?」傑夫下面的人竊竊私語,而這時傑夫腦袋早就一片空白了。