tag:blogger.com,1999:blog-81685279998448097962024-03-13T09:20:44.447+08:00老宅筆記本工作經驗筆記Unknownnoreply@blogger.comBlogger56125tag:blogger.com,1999:blog-8168527999844809796.post-75519596333121549442020-02-22T23:12:00.001+08:002020-02-22T23:15:13.369+08:00[筆記]利用Arduino Nano重新燒錄Arduino Micro的Bootloader在開發Arduino接收藍芽資料程式時,為了測試,結果在Serial Port輸出太多東西,導致USB無回應,作業系統無法辨識,程式也燒錄不進去,差點以為這塊Arduino Micro就要毀了...<br />
<br />
還好經過搜尋,發現可以重新燒錄Bootloader,讓Arduino恢復出場狀態。但搜尋到的都是UNO燒Micro,或是Nano燒Pro Micro...UNO燒Micro需要用到一顆電容,我沒有<span style="font-size: x-small;"><i>(而且我連UNO都沒有XD)</i></span>;而Nano燒Pro Micro,因為這個Pro Micro是小板,跟Micro用一樣的處理晶片,所以或許有可能喔!!<br />
<br />
<a name='more'></a>仔細比對了一下兩者接腳,差異不大,燒錄Pro Micro時需要的針腳在Micro上都有(參考下圖)<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjMXb9hmeACEkOPTCtTsceln3xvg51DrRNuTNCqzSVBPNEeTXFx4M1wQghvN0VBj6f2bXiK4ylwLpWfoFO_y5fQJ9KKRpqzjuwevTBGRml_ga2U9IOZ8E9MOmL_dKIZGxO3Mk2PNli_QON/s1600/micro+vs+pro_micro.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="617" data-original-width="1322" height="297" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjMXb9hmeACEkOPTCtTsceln3xvg51DrRNuTNCqzSVBPNEeTXFx4M1wQghvN0VBj6f2bXiK4ylwLpWfoFO_y5fQJ9KKRpqzjuwevTBGRml_ga2U9IOZ8E9MOmL_dKIZGxO3Mk2PNli_QON/s640/micro+vs+pro_micro.png" width="640" /></a></div>
<br />
所以趕快來照著做吧!!<br />
<br />
<ol>
<li>將Nano連接到電腦上,開啟Arduino IDE,開啟範例11的ArduinoISP程式,開發板選擇Arduino Nano,處理器選擇ATmega3288P (Old bootloader),序列埠選擇實際的連接埠,將程式燒錄到Arduino Nano中<br />
<i><span style="color: #999999;">P.S. 其實這份程式碼最上方註解就 有說明所需要的針腳,主要就是MOSI、MISO、SCK這三腳,以及5V、GND、RST(Reset)</span></i>
</li>
<li>將Nano拔離電腦,照下圖接線(上方是Nano,下方是我們要燒錄bootloader的目標-Micro)<br /><div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz9gjVGZwffBYdblzfDxt4EFLVDDcmS-BovqbJu6AfATzMFQE6dGHPRp9OLJAtIase9pbLaB3w7sCW8RQk2sLrW6ObcpXI9YXvk5ctJlJ3WQM8wXLMGKQWbMVPOQ2uzbNyL6pH6jGvBWDZ/s1600/2020-02-22_222643.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="785" data-original-width="1257" height="396" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz9gjVGZwffBYdblzfDxt4EFLVDDcmS-BovqbJu6AfATzMFQE6dGHPRp9OLJAtIase9pbLaB3w7sCW8RQk2sLrW6ObcpXI9YXvk5ctJlJ3WQM8wXLMGKQWbMVPOQ2uzbNyL6pH6jGvBWDZ/s640/2020-02-22_222643.png" width="640" /></a></div>
</li>
<li>重新接上Nano,接著在IDE內將開發板選擇成Arduino Micro,燒錄器選擇Arduino as ISP,接著選燒錄Bootloader,沒意外的話等他跑完就OK囉,完成重新恢復Arduino Micro成出廠狀況了</li>
</ol>
<br />
參考資料:<a href="http://jasonjss.blogspot.com/2016/03/arduino-pro-microbootloader.html" target="_blank">Arduino Pro Micro燒錄Bootloader</a><br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8168527999844809796.post-91091591174628779102020-02-21T16:18:00.000+08:002020-02-21T17:15:32.601+08:00[筆記]Arduino與HC-06藍芽遠端控制WS2812B - [2] 控制Relay<a href="https://eric0806.blogspot.com/2020/02/app-ws2812b-arduino-bluetooth-p1.html" target="_blank">上一篇</a>我們講到如何控制藍芽模組來接收資料,這一篇來講講如何利用Arduino發送信號來控制開關。<br />
<br />
講到利用訊號控制開關,最簡單的就是Relay(繼電器)了,他是一個利用小電流去控制大電流的自動開關。<br />
<br />
我們會想,怎麼不用Arduino的5V輸出提供給LED燈條就好了呢?<br />
<br />
原因是Arduino能提供的電流實在太小了,每個輸出針腳最大只有20mA而已。<br />
<br />
<a name='more'></a><br />
<br />
而RGB彩色LED,每種顏色就需要20mA,一顆燈包含RGB三色,總共就要60mA,而燈條上不會只有一顆LED燈而已,所以我們需要額外的供電,在需要的時候利用Arduino發出訊號讓她打開,接通外部電源,這也就是Relay派上用場的時機了。(關於Relay更多知識請參考<a href="https://zh.wikipedia.org/wiki/%E7%BB%A7%E7%94%B5%E5%99%A8" target="_blank">維基百科-繼電器</a>)<br />
<br />
Relay基本工作與接線圖<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh8diXbqcLXjBtaABfc8wm-7OJ7zPklxx96q1iOm3cCm2nCtKxY6if0G6Xhgq3Dii8J59ikjAt2d5uZKHDY0HMUC_TMPoZ8M5xMgO0qphBgJV75s9w7zpFK9FDC2qwu6Xzo0AWH0hwzJYk/s1600/2020-02-21_153721.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="597" data-original-width="890" height="429" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh8diXbqcLXjBtaABfc8wm-7OJ7zPklxx96q1iOm3cCm2nCtKxY6if0G6Xhgq3Dii8J59ikjAt2d5uZKHDY0HMUC_TMPoZ8M5xMgO0qphBgJV75s9w7zpFK9FDC2qwu6Xzo0AWH0hwzJYk/s640/2020-02-21_153721.png" width="640" /></a></div>
<br />
<br />
了解為何要使用Relay和他的基本使用之後,我們可以利用手機發出開燈訊號,Arduino上的HC-06接收到訊號之後傳給Arduino,依據開和關讓數位針腳發出High或是Low的訊號給Relay控制腳,這樣就可以控制Relay要打開或是關閉。<br />
<br />
<br />
接線圖,因為我要控制兩條燈條,她們使用各自的電源,所以會用到兩顆Relay分別做控制:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwaAK5LHtSwv-YpNMH39rFiJH82VFEeo9feT3nNzGY38OZYDjh59Wj-f66ZMJ4ZjyRBnsHmg4urAYkG2Vmc35YbA_WLtFnAFhAQJ66BeKot387GilJ0tUtA6mHUZK7KWdXXRVUK0scGOTk/s1600/2020-02-21_144959.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="577" data-original-width="1082" height="340" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwaAK5LHtSwv-YpNMH39rFiJH82VFEeo9feT3nNzGY38OZYDjh59Wj-f66ZMJ4ZjyRBnsHmg4urAYkG2Vmc35YbA_WLtFnAFhAQJ66BeKot387GilJ0tUtA6mHUZK7KWdXXRVUK0scGOTk/s640/2020-02-21_144959.png" width="640" /></a></div>
<br />
5V由Arduino提供(包含上一篇提到的HC-06),兩顆Relay的控制腳分別接在Arduino的D3與D5,這邊只專注在Arduino與Relay連接,其他部分之後再談。<br />
<br />
電路圖中我用到兩顆Relay模組,因為軟體裡面找不到我用的,我實際上買的是這種雙路的Relay,5V和接地只要一組共用即可,然後是低電位觸發,也就是控制腳如果輸入5V,不會觸發動作,輸入0V(接地)就會觸發,讓常開端導通。<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjieLaCzVgf_g5Ye5r1cpCmPNyjG2tnXNmM8x615HsZtZaWE8oaBsa9VGc-VgpFB70c-vmDMVNHicMddvE0ucpEbG-DT3dyqEtgQmeHTtgEF7Ca99fEtILvnCq7_Gfis7Ft3ZOn1Is2RsSy/s1600/IMG_20200221_144359.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1200" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjieLaCzVgf_g5Ye5r1cpCmPNyjG2tnXNmM8x615HsZtZaWE8oaBsa9VGc-VgpFB70c-vmDMVNHicMddvE0ucpEbG-DT3dyqEtgQmeHTtgEF7Ca99fEtILvnCq7_Gfis7Ft3ZOn1Is2RsSy/s400/IMG_20200221_144359.jpg" width="300" /></a></div>
<br />
接著看看Arduino程式碼,全開或全關太單調了,我們讓他隔一秒交互開關:<br />
<pre>#define PIN1 3
#define PIN2 5
void setup() {
pinMode(PIN1, OUTPUT);
pinMode(PIN2, OUTPUT);
}
int i;
void loop() {
//使用的這顆relay是低電位觸發
i++;
if (i % 2 == 0) {
digitalWrite(PIN1, HIGH); //設為high為關閉relay
digitalWrite(PIN2, LOW); //設為low為開啟relay
}
else {
digitalWrite(PIN1, LOW);
digitalWrite(PIN2, HIGH);
}
delay(1000);
}</pre>
<br />
<br />
這樣就會像底下影片一樣兩顆Relay交互開關囉!!!<br />
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/jDpM1qKmFwc/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/jDpM1qKmFwc?feature=player_embedded" width="320"></iframe><br />
<br />
<br />
下期待續...<br />
<br />
--<br />
相關文章:<br />
<a href="https://eric0806.blogspot.com/2020/02/app-ws2812b-arduino-bluetooth-p1.html" target="">[筆記]Arduino與HC-06藍芽遠端控制WS2812B - [1] Arduino與HC-06</a><br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8168527999844809796.post-35198307886996767132020-02-20T18:39:00.000+08:002020-02-21T16:24:16.394+08:00[筆記]Arduino與HC-06藍芽遠端控制WS2812B - [1] Arduino與HC-06最近有個需求,有兩位美女需要能夠遠端控制RGB彩色燈條,讓他們閃爍及調整顏色。由於一般市面上RGB幻彩燈條都需要由控制器來控制,但常見的控制器一次都只能控制一條,而我們需要的效果要由兩條燈條來完成:兩條不同顏色、其中一條要有呼吸效果、兩條需要同時開和關,這樣就必須有兩個控制器、兩台手機來連接,而且控制器上的效果又不符合我想要的,剛好我喜歡在油管看看DIY的影片,現在蠻紅的Arduino是個很棒的東西,可以自訂各個接腳的功用,也可以連接各種外接設備,實在是太符合我的要求啦!!覺得自己硬幹一台好像也不是問題,於是這個專案就誕生了...<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<br />
<a name='more'></a>需求:<br />
<br />
<ol>
<li>由一台手機操控兩條不同的RGB燈條</li>
<li>效果由自己設定(很簡單,一條固定單色,另一條也固定單色但要有滑順穩定的呼吸效果)</li>
<li>同時開關</li>
</ol>
<div>
<br /></div>
<div>
<br /></div>
<div>
第一步,我們必須先讓Arduino和藍芽接收器結合,所以就準備了一台Arduino Micro、一台HC-06藍芽接收器,趕快來讓他們合體吧!!</div>
<div>
<br /></div>
<div>
介紹一下為什麼我會選Arduino Micro和HC-06。因為我要體積小,所以只能選Micro(其實還有Nano,但他的USB接頭是Mini USB,現在已經快淘汰了,<i><strike>而且我絕對不會說蝦皮上買到的Nano不是原廠出的,而Micro可以買到原廠的,用IDE燒錄程式比較順利</strike></i>)。藍芽接收設備有HC-05和HC-06,HC-05功能較多,但我只需要單純的接收由手機傳來的資料,所以買便宜一些些的HC-06就好了。</div>
<div>
<br /></div>
<div>
好了之後就來看一下接線圖:</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghczvoe4Ypf4KqlZElpwa0tXBCCWvokcuhJmVYOhk99_ggRpr15FPzTo7QP9nwTDCRUjKRQ4mwAcMU9Z5O-liFTq2cSqTmCkRIop1cIqYa_46WTP1T9h3INv2cvxDbqVpOu7vnM4tKSViL/s1600/2020-02-20_162019.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="691" data-original-width="836" height="528" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghczvoe4Ypf4KqlZElpwa0tXBCCWvokcuhJmVYOhk99_ggRpr15FPzTo7QP9nwTDCRUjKRQ4mwAcMU9Z5O-liFTq2cSqTmCkRIop1cIqYa_46WTP1T9h3INv2cvxDbqVpOu7vnM4tKSViL/s640/2020-02-20_162019.png" width="640" /></a></div>
<div>
<br /></div>
<div>
由於Arduino Micro提供了另外一組獨立的Serial Tx/Rx,所以我們可以不用插在Digital Pin,直接將HC-06的Tx接在Arduino的Rx,HC-06的Rx接在Arduino的Tx。</div>
<div>
<span style="color: red; font-size: large;"><b>注意!!</b></span>有看到那顆1k電阻嗎?因為HC-06的Tx/Rx最高只接受3.3V的電壓,而Arduino的輸出可能會達5V,為了怕燒壞HC-06,所以我們接了顆1k的限流電阻,意義跟LED的限流電阻一樣避免高電壓直接進入元件。</div>
<div>
<br /></div>
<div>
接好了之後就可以開啟Arduino IDE來編寫簡單的程式連線到HC-06,看看功能是否正常了!</div>
<div>
底下是程式碼:</div>
<div>
<br />
<pre>//使用Arduino Micro,Serial1使用獨立街口RX/TX
//上傳程式到Arduino時,請斷開與HC-06的連線
void setup() {
Serial.begin(9600);
while(!Serial){
//(重要)等待開啟Serial Port才可繼續下一步
}
Serial.println("Serial準備好了");
// 設定藍牙模組的連線速率(Arduino Micro提供另一組名為Serial1的序列埠,可直接使用Tx/Rx接腳
// 如果是HC-05,請改成38400
Serial1.begin(9600);
while(!Serial1){
//(重要)等待開啟Serial1 Port才可繼續下一步
}
Serial.println("Serial1準備好了");
}
void loop() {
// 若收到「序列埠監控視窗」的資料,則送到藍牙模組
if (Serial.available()){
Serial1.print(Serial.read());
}
// 若收到藍牙模組的資料,則送到「序列埠監控視窗」
if (Serial1.available()) {
Serial.print(Serial1.read());
}
}</pre>
</div>
<div>
<br /></div>
<div>
好了之後就可以上傳到Arduino內,注意在上傳前,先把Arduino上連接到HC-06的Tx/Rx接線拔掉,等上傳完成之後再插上,避免HC-06損壞。<br />
<br />
上傳完成之後,Reset Arduino,接著打開IDE上的「序列埠監控視窗」,若連接正確,應該可看到底下畫面:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaHvqGeirzW3cwvDbXEO6qUbsk_ReRpmP7JprFpixZ-CH3ci8tAXhv6wGBelQROmYtRls_UbO0GmsUo-N95L2il6_9Q6OmxeiJnynmj64LqYOV9spLiKkG_FszLDkRRitOXYw5yYyW955M/s1600/2020-02-20_180854.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="424" data-original-width="672" height="401" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaHvqGeirzW3cwvDbXEO6qUbsk_ReRpmP7JprFpixZ-CH3ci8tAXhv6wGBelQROmYtRls_UbO0GmsUo-N95L2il6_9Q6OmxeiJnynmj64LqYOV9spLiKkG_FszLDkRRitOXYw5yYyW955M/s640/2020-02-20_180854.png" width="640" /></a></div>
<br />
兩個序列埠都正常開啟的話就會顯示Serial is ready與Serial1 is ready。接著我們就可以輸入AT指令看看HC-06功能是否正常,但在對HC-06輸入指令前須注意底下兩者必須選擇正確:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLfFjGwRMycXyu6HCQwm-UMzuEPlDT1lArTz8bihB781FTuVB5gFkzYYIztiAck8cMPa93ZHDITPq15ZHK-2dVx_Ar_2A8vz-An_F6hlMgcnUmGmJz0k3pIQP67MnNu2I536iO_WNCVikE/s1600/2020-02-20_180857.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="424" data-original-width="672" height="401" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLfFjGwRMycXyu6HCQwm-UMzuEPlDT1lArTz8bihB781FTuVB5gFkzYYIztiAck8cMPa93ZHDITPq15ZHK-2dVx_Ar_2A8vz-An_F6hlMgcnUmGmJz0k3pIQP67MnNu2I536iO_WNCVikE/s640/2020-02-20_180857.png" width="640" /></a></div>
<br />
接著就可在上方文字框輸入AT,再按下enter或是右邊傳送鈕,沒意外的話應該可以看到下方會回應OK:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGu3_HuKN-Wcn7He9vUWyt2yKBlHflWMqrJoU6X_PW7fYvv4Of3wLukGYXcca8dAWN-eX2wjpjMy5JZ7_98-xEymTmStWWWQ6wd9SLg_BoWbe0uQh4avQ1q7gzluy2tat0aB6vb44PYYQI/s1600/2020-02-20_181003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="424" data-original-width="672" height="401" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGu3_HuKN-Wcn7He9vUWyt2yKBlHflWMqrJoU6X_PW7fYvv4Of3wLukGYXcca8dAWN-eX2wjpjMy5JZ7_98-xEymTmStWWWQ6wd9SLg_BoWbe0uQh4avQ1q7gzluy2tat0aB6vb44PYYQI/s640/2020-02-20_181003.png" width="640" /></a></div>
<br />
這樣就代表我們Arduino與HC-06連接正常啦!!!還有一些AT指令也可以使用:<br />
<br />
<ul>
<li><span style="color: purple;"><b>AT+NAME</b></span><span style="color: red;">XYZ</span>:將HC-06名稱改為XYZ</li>
<li><span style="color: purple;"><b>AT+PIN</b></span><span style="color: red;">8787</span>:將連線密碼改為8787</li>
</ul>
<br />
注意上面指令和參數是要連在一起的<br />
<br />
還有一點,HC-06在通電之後,但還未被藍芽連線之前,狀態燈是會快速閃爍,要在此狀態下才能執行AT指令。<br />
<br />
Arduino與HC-06連接沒問題之後,接著就準備增加我們需要的電路囉!<br />
<br />
<span style="font-size: x-small;">註:這篇文章只是我對這個控燈專案的一個筆記,所以只會介紹重點部分,對於各硬體的介紹網路有很多文章可以參考~</span><br />
<span style="font-size: x-small;"><br /></span>
<span style="font-size: x-small;">--</span><br />
相關文章:<br />
<a href="https://eric0806.blogspot.com/2020/02/app-ws2812b-arduino-bluetooth-p2.html">[筆記]Arduino與HC-06藍芽遠端控制WS2812B - [2] 控制Relay</a><br />
<br />
<br />
--<br />
<span style="font-size: x-small;">參考資料:</span><br />
<a href="https://swf.com.tw/?p=693" target="_blank"><span style="font-size: x-small;">HC-05與HC-06藍牙模組補充說明(一)</span></a><br />
<a href="https://swf.com.tw/?p=705" target="_blank"><span style="font-size: x-small;">HC-05與HC-06藍牙模組補充說明(二):連接電路</span></a><br />
<a href="https://swf.com.tw/?p=712" target="_blank"><span style="font-size: x-small;">HC-05與HC-06藍牙模組補充說明(三):使用Arduino設定AT命令</span></a><br />
<br />
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8168527999844809796.post-49620528355441149802018-01-31T16:09:00.001+08:002018-01-31T16:09:55.145+08:00[筆記] 解決Windows 10 1709分享資料夾,Linux無法連線的問題公司內的事務機有掃描檔案到電腦分享資料夾的功能,但最近某幾台電腦一直無法收到事務機傳來的掃描文件檔,非常奇怪!看了一下設定,跟別台功能正常的電腦設定也都一樣呀,為什麼這幾台就是不行呢?而且用windows直接連他們的分享資料夾都可以呀,為甚麼事務機不行???<br />
<br />
為了這個問題,花了我超多時間,甚至在公司重灌電腦後為了設定這個,加班研究到快天亮....還是不行!好吧,大概是這台電腦跟事務機犯沖,繞個圈用別的方法好了,但是心裡還是有個疙瘩在...<br />
<br />
<a name='more'></a><br />
<br />
然後就在幾周後的今天,重灌並設定了一台新電腦,還是不行!!!怎麼會?上一台電腦犯沖就算了,連新的一台都不行,那肯定不是犯沖的問題!!(廢話...)<br />
<br />
既然用Windows所有電腦都能連線,那就試著用Linux連了一下,嗯,事務機可以正常連線的電腦,用Linux連線也行;但事務機不能連線的電腦,Linux也不行....仔細推敲了下,好像不能連線的電腦,都是直接重灌新版Windows10(1079)耶!其他電腦雖然也是1709,但他們是從舊版升級升上來的,所以也許有保留舊版設定,而全新安裝的就沒有了。那會不會是SMB版本的問題?<br />
<br />
於是研究了下,首先利用底下PowerShell(記得用系統管理員)指令列出目前SMB使用的版本如何:<br />
<pre>Get-SmbServerConfiguration</pre>
<br />
結果發現如下:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6jHhnSRWzpIpofJ5UIsb3V7wPkOppznonLgaNTLpw41TwkuHmfiFQ7Wk6cUURoYzY0vlu7XADFKD_2sQ0-MZWPdIKGVWf1pjTbpJU4zwLlkLlzZ2_DmWk-mxtXN6yc-O7FXQb_REHfO00/s1600/2018-01-31_155916.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="808" data-original-width="673" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6jHhnSRWzpIpofJ5UIsb3V7wPkOppznonLgaNTLpw41TwkuHmfiFQ7Wk6cUURoYzY0vlu7XADFKD_2sQ0-MZWPdIKGVWf1pjTbpJU4zwLlkLlzZ2_DmWk-mxtXN6yc-O7FXQb_REHfO00/s640/2018-01-31_155916.png" width="532" /></a></div>
紅框的地方,SMBv1沒有打開,只有開啟SMBv2與SMBv3 (根據微軟的說明,SMBv2若開啟,v3也會一同開啟,反之如果是關閉亦同),也許事務機並沒有支援到v2以上,所以如果我們把v1打開,並關閉v2、v3就好囉??<br />
<br />
利用底下指令來打開SMBv11並關閉v2:<br />
<pre>Set-SmbServerConfiguration -EnableSMB1Protocol $True
Set-SmbServerConfiguration -EnableSMB2Protocol $False</pre>
<br />
結果在第一行就卡關了...<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFVudeHzDAVI4toEDncK3aKdmzBSiqOjbH894Ai53NMKHigAAbATHrbvrMh-QzKUaRwXr9nM1FR1ECpBfrBw0T3dx0mw0Dj1AGQ6PBx5IYrhXImAG8uirNMHAdZfKFrGeQaexXArhj-4ta/s1600/2018-01-31_160441.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="208" data-original-width="693" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFVudeHzDAVI4toEDncK3aKdmzBSiqOjbH894Ai53NMKHigAAbATHrbvrMh-QzKUaRwXr9nM1FR1ECpBfrBw0T3dx0mw0Dj1AGQ6PBx5IYrhXImAG8uirNMHAdZfKFrGeQaexXArhj-4ta/s640/2018-01-31_160441.png" width="640" /></a></div>
<br />
原來是SMB1的支援沒裝啊~~XD<br />
進到控制台->程式與功能->打開或關閉Windows功能內,找到 SMB 1.0/CIFS檔案共用支援,點開後把三個勾都勾起來,安裝好後會需要重新開機,重開好,再執行一次上面的指令,就可以囉!!<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyv7bnzKjOmKMU27N0iCjLEJtjzMalkIpdHCrP-9Q42ybugb73nek7-mtev9zZAS4XIbcYfjPcJYUsxh8F4Hi3pnw-_QEnrgCZURhI__K4Pg9dNt1p4i59EXoIewJQ8TTt5g7PtNcd4R0Y/s1600/2018-01-31_155727.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="364" data-original-width="414" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyv7bnzKjOmKMU27N0iCjLEJtjzMalkIpdHCrP-9Q42ybugb73nek7-mtev9zZAS4XIbcYfjPcJYUsxh8F4Hi3pnw-_QEnrgCZURhI__K4Pg9dNt1p4i59EXoIewJQ8TTt5g7PtNcd4R0Y/s1600/2018-01-31_155727.png" /></a></div>
<br />
<br />
事務機終於能連線了.....Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-8168527999844809796.post-7389555868355849392018-01-05T20:48:00.000+08:002018-01-05T20:48:24.962+08:00[筆記]Server 2008 R2移除Hyper-V之後網路卡無法連線的問題公司一台內部Server 2008 R2之前為了特殊需求,裝了Hyper-V,而最近已經沒這需求了,所以便把Hyper-V給移掉。但移除完成之後,竟然無法上網了?IP、遮罩、閘道設定都對,但就無法對外連線,可是改成DHCP又可以....這真是靈異事件了!<br />
<br />
<a name='more'></a><br />
<br />
雖說用DHCP可以正常連線,但Server是大家都要連的,總不可能用DHCP啊!一定還是得給他個固定IP才行,查了許久,發現有人提到可以重設Winsock與TCP/IP,指令如下:<br />
<br />
重設Winsock:<br />
<pre>netsh winsock reset</pre>
<br />
重設TCP/IP:<br />
<pre>netsh int ip reset</pre>
<br />
設定完之後需要重開機,心想這樣應該就OK啦~但是...重開機之後還是不行啊...<br />
<br />
後來想,當初在安裝Hyper-V的時候,好像他會新增一個虛擬網卡介面,內建的實體網卡似乎也會更改一些設定,會不會就是這個虛擬網卡造成的呢?<br />
<br />
但是Hyper-V移除之後,去裝置管理員也沒看到他當初所建的虛擬網卡,這時突然靈機一動,那我把實體網卡也移除,讓系統重裝看看是不是就正常了呢?<br />
<br />
結果....賓果!!真的讓系統重新建立網卡驅動就好了,他應該是有把設定全部初始化一遍,然後就正常啦~~這真是OOXX......<br />
<br />
所以沒事就不要做這種牽扯到整個系統的大變動 =_=<br />
<br />
筆記一下,如果有相同症狀的朋友可參考參考~Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8168527999844809796.post-63751094386689662972017-12-05T10:57:00.002+08:002018-01-05T21:46:23.929+08:00[筆記]如何在Visual Studio 2017內使用Rdlc報表<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihZ9pKZgwkkTSVK0o_jquI5hXT4Wkgh-uXJbasOEiSN0h40CNagHpCbjbfc62ZaItSLH1zDwDpkunCbQWqyE2qlz60GHhwpdZ-mYnC0gcUX3E36g2sTdXryvcUEvOhCAFxFP8CBRSNeyUH/s1600/2017-12-05_110009.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="714" data-original-width="983" height="464" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihZ9pKZgwkkTSVK0o_jquI5hXT4Wkgh-uXJbasOEiSN0h40CNagHpCbjbfc62ZaItSLH1zDwDpkunCbQWqyE2qlz60GHhwpdZ-mYnC0gcUX3E36g2sTdXryvcUEvOhCAFxFP8CBRSNeyUH/s640/2017-12-05_110009.png" width="640" /></a></div>
<br />
雖然Rdlc報表是很久前的產物了,但是要產生某些制式格式的檔案的時候,還是很好用!<br />
<br />
最近公司網站要導入電子發票,所以每張發票都要有張發票圖檔副本留存,這個時候就想到這個好用的東西,但Visual Studio 2017裡面,預設把報表相關的東西都拿掉了,所以我們必須手動加回去...<br />
<br />
<a name='more'></a>首先我們必須先到「工具」->「擴充功能與更新...」裡面,搜尋兩個工具:<br />
1. Microsoft Reporting Services Projects<br />
2. Microsoft Rdlc Report Designer for Visual Studio<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJZ2yR_qkzHIW78hV6Ykr3r8_a6c9FLl846AQ28_EAIPOX9slkks1vYASgdjH_DZKyD9XojWnpjaxAVq8Z3AwEFN5kf3YedFmI_maiCvxbRi2KsEKbySA4FmZhxQoRhQtjjfq1YDDDMM9S/s1600/2017-12-05_102410.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="636" data-original-width="1045" height="387" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJZ2yR_qkzHIW78hV6Ykr3r8_a6c9FLl846AQ28_EAIPOX9slkks1vYASgdjH_DZKyD9XojWnpjaxAVq8Z3AwEFN5kf3YedFmI_maiCvxbRi2KsEKbySA4FmZhxQoRhQtjjfq1YDDDMM9S/s640/2017-12-05_102410.png" width="640" /></a></div>
<br />
<br />
安裝好之後,我們就可以在專案裡面新增Rdlc報表檔案了!<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8pEfBgM3z1SAc4oKyM3UbL9SLKmHBRC4nqWLsIzkOhnftudS8ZxO16DqLcsQ1yp6GN9StFsFAwQyhwr8TzvFk2VUqD7PFN5tejpLviER3_lPFuOm59b7c54byw-8bhb5ocMSvJstLxJ6r/s1600/2017-12-05_102728.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="646" data-original-width="935" height="442" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8pEfBgM3z1SAc4oKyM3UbL9SLKmHBRC4nqWLsIzkOhnftudS8ZxO16DqLcsQ1yp6GN9StFsFAwQyhwr8TzvFk2VUqD7PFN5tejpLviER3_lPFuOm59b7c54byw-8bhb5ocMSvJstLxJ6r/s640/2017-12-05_102728.png" width="640" /></a></div>
<br />
<br />
但光是新增報表檔案還沒有用,必須還要可以處理才行!我的需求並不需要在網頁顯示報表,而只單純需要利用報表檔案來產生制式圖檔,所以在程式碼內處理就好了,可以是dll專案或是console專案即可。<br />
<br />
所以我們必須為專案增加參考,可使用NuGet安裝由微軟維護的套件,搜尋「Microsoft.ReportingServices.ReportViewerControl.Winforms」、「Microsoft.ReportingServices.ReportViewerControl.WebForms」這兩個套件並安裝,或是直接在套件管理器主控台內輸入:<br />
<pre>Install-Package Microsoft.ReportingServices.ReportViewerControl.Winforms
Install-Package Microsoft.ReportingServices.ReportViewerControl.WebForms</pre>
<br />
就可以安裝好。<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjY5CAMT14_CwRxaEMFgPOWtng1Dl5zPKPrvmmsm9oP56Cp-uP_00MyZsfumrMUAUlao1HEIYDmrui-D1zl9Maa3wzR6L4o80fv1CN-5a5DdC6MqE1HcB7fBrXQkovc7hxwal5Wxvlk1xgi/s1600/2017-12-05_103839.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="595" data-original-width="1491" height="254" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjY5CAMT14_CwRxaEMFgPOWtng1Dl5zPKPrvmmsm9oP56Cp-uP_00MyZsfumrMUAUlao1HEIYDmrui-D1zl9Maa3wzR6L4o80fv1CN-5a5DdC6MqE1HcB7fBrXQkovc7hxwal5Wxvlk1xgi/s640/2017-12-05_103839.png" width="640" /></a></div>
<br />
<br />
接著就可以寫程式來載入Rdlc報表並匯出成圖檔囉~<br />
可以參考底下我寫的小範例,就可以將參數傳到報表內,並匯出成PNG圖片檔了!
<br />
<pre>//產生LocalReport
var report = new LocalReport {
EnableExternalImages = true,
ReportPath = "report.rdlc"
};
//設定要傳入報表的參數
var paramList = new List<ReportParameter> {
new ReportParameter("Paramaaa", "abcdefg"),
new ReportParameter("Parambbb", "1234567")
};
//將參數傳入報表內
report.SetParameters(paramList);
//指定輸出格式為PNG(若不指定,則報表在Render成Image的時候,預設會是TIFF檔)
string deviceInfo = "<DeviceInfo><OutputFormat>PNG</OutputFormat></DeviceInfo>";
//取得報表Render成圖片後的內容
var bytes = report.Render("Image", deviceInfo,
out string mimeType, out string encoding, out string fileNameExtension,
out string[] streams, out Warning[] warnings);
//這行可以將報表Render成PDF檔
//var bytes = report.Render("PDF", null,
// out string mimeType, out string encoding, out string fileNameExtension,
// out string[] streams, out Warning[] warnings);
//指定一下檔名及路徑
var fileName = $"{Guid.NewGuid().ToString("N")}.{fileNameExtension}";
var savePath = "";
//存檔
using (FileStream fs = new FileStream(Path.Combine(savePath, fileName), FileMode.Create)) {
fs.Write(bytes, 0, bytes.Length);
}
</pre>
<br />
要注意的是,報表在Render成檔案,不管是圖片還是PDF,預設尺寸都會是A4格式,也就是說雖然在製作Rdlc檔案時,內容並沒有很大,但匯出時還是會變成A4大小喔,沒有滿的地方就會由空白補滿,這點是要注意一下的~如果想要有其他尺寸,記得在屬性那先設定一下喔~Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8168527999844809796.post-91895135853146695872017-08-24T11:02:00.003+08:002017-08-24T15:59:27.600+08:00達成成就 -「上傳一個自己開發的中文套件到NuGet」<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjODFtnlpirXn5GAFQe4sTFGA9cs_HcH3Tszp8sAImqDj0lLUOZudlX3p1mQe6TVrbCBmBvXR9KX5o3r0HndzPibEZzRk-O9PmXkq9A-VvL5yLNPWN-Ape8fz5NNRB6_AkyLsBFnHEpL68_/s1600/2017-08-24_104750.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="272" data-original-width="877" height="198" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjODFtnlpirXn5GAFQe4sTFGA9cs_HcH3Tszp8sAImqDj0lLUOZudlX3p1mQe6TVrbCBmBvXR9KX5o3r0HndzPibEZzRk-O9PmXkq9A-VvL5yLNPWN-Ape8fz5NNRB6_AkyLsBFnHEpL68_/s640/2017-08-24_104750.png" width="640" /></a></div>
幾年前,為了管理自己的照片,想說自己寫個小軟體依照相片拍攝日期分資料夾,但在讀取exif的時候遇到許多問題,或者是讀出來的樣子不是自己想要的,所以乾脆自己寫一個處理exif的元件。<br />
<br />
<a name='more'></a><br />
<br />
為了處理exif,從下載官方spec文件開始,慢慢k、慢慢了解規則,也終於寫出來了,雖然自覺好像沒寫得很好,但對於我自己的需求還夠用啦XD<br />
<br />
再過了幾年後的現在,又有其他的需求,想說先在NuGet上面尋找一下有沒有其他可簡易讀取exif的套件,下載了幾個試試,竟然覺得都沒有我寫的好耶!!!很多特殊tag的值都沒額外處理,簡直不能看,看看原始碼,也是很精簡,就只做了基本讀出的處理而已,這時才驚覺原來我當初做了這麼多呀!!!XD<br />
<br />
這時突然有了想放到NuGet試試水溫的念頭,也是因為好玩啦,稍微研究了一下如何製作NuGet套件,做好後就上傳囉。當然還有另一個重點,我用的是全正體中文!!XD<br />
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8_8MTCmvzV0h-MZys6Qx3wPlvT1o6Bj5rULpmHWFwHvZ_2tL5FbWo_jyhO3QiLMthSo8X7qDAvAI13ShDUKRWzxsXKVofmLDNTC5dTNjhcOTcY9asgm-t0EQ5t5N3Nc5DN1vRzXubG9Oo/s1600/2017-08-22_102730.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="855" data-original-width="1503" height="364" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8_8MTCmvzV0h-MZys6Qx3wPlvT1o6Bj5rULpmHWFwHvZ_2tL5FbWo_jyhO3QiLMthSo8X7qDAvAI13ShDUKRWzxsXKVofmLDNTC5dTNjhcOTcY9asgm-t0EQ5t5N3Nc5DN1vRzXubG9Oo/s640/2017-08-22_102730.png" width="640" /></a></div>
<br />
看看,在一片英文套件海中,正體中文套件是不是很突出呢??哈哈~<br />
<br />
在發表後兩天看了一下狀態,竟然也有48個下載了,真是又驚又喜啊XD<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOJ7TtZGg8qkKGV5NMpVB9GgKmVJhpLanW77VLnYKgWyyYhJy49nKienovgJ1J6L0VB3vip62zbRQZIgT4z9Z4DFuP8kARw0k0N597iorzCwawO_ux9gC9Ga74fNkgArRc5lZPqMUv2Ay7/s1600/2017-08-24_105752.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="170" data-original-width="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOJ7TtZGg8qkKGV5NMpVB9GgKmVJhpLanW77VLnYKgWyyYhJy49nKienovgJ1J6L0VB3vip62zbRQZIgT4z9Z4DFuP8kARw0k0N597iorzCwawO_ux9gC9Ga74fNkgArRc5lZPqMUv2Ay7/s1600/2017-08-24_105752.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
如果您有利用.Net程式讀出照片Exif的需求,也歡迎您試用看看本套件喔!!XD</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
NuGet網址:<a href="https://www.nuget.org/packages/SimpleExif/" target="_blank">https://www.nuget.org/packages/SimpleExif/</a></div>
<div class="separator" style="clear: both; text-align: left;">
github:<a href="https://github.com/eric0806/SimpleExif" target="_blank">https://github.com/eric0806/SimpleExif</a></div>
<br />
<br />
<script type="text/javascript" src="//js1.bloggerads.net/contentads.aspx?blogid=20140410000009" async></script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8168527999844809796.post-23615434558990492742017-07-30T00:16:00.000+08:002017-08-03T10:58:22.317+08:00[筆記]使用Ubuntu 16.04架設L2TP Over IPSec VPNUbuntu在16.04版本之後的套件庫,拿掉了openswan,所以要改用strongswan來設定IPSec,跟之前openswan有些許的不同,參考了<a href="https://bill.tt/2017/01/14/Ubuntu-16-04-%E9%85%8D%E7%BD%AEL2TP-VPN-Server/" target="_blank">這篇</a>之後架設成功,所以趕緊筆記一下~<br />
<br />
<span style="color: red; font-size: large;">注意,底下所有指令都用root身分執行,所以就不再打sudo了!</span><br />
<br />
<h2>
1.系統部分</h2>
首先安裝必要套件:<br />
<pre>apt-get install strongswan xl2tpd ppp lsof</pre>
<br />
<a name='more'></a><br />
<br />
再來設定轉發相關(打指令,可全部複製貼上):<br />
<pre class="lang-basic">echo "net.ipv4.ip_forward = 1" | tee -a /etc/sysctl.conf
echo "net.ipv4.conf.all.accept_redirects = 0" | tee -a /etc/sysctl.conf
echo "net.ipv4.conf.all.send_redirects = 0" | tee -a /etc/sysctl.conf
echo "net.ipv4.conf.default.rp_filter = 0" | tee -a /etc/sysctl.conf
echo "net.ipv4.conf.default.accept_source_route = 0" | tee -a /etc/sysctl.conf
echo "net.ipv4.conf.default.send_redirects = 0" | tee -a /etc/sysctl.conf
echo "net.ipv4.icmp_ignore_bogus_error_responses = 1" | tee -a /etc/sysctl.conf
sysctl -p</pre>
<br />
<br />
<br />
<h2>
2.IPSec部分</h2>
接著要來設定strongswan,編輯 /etc/ipsec.conf:<br />
<pre>config setup
conn L2TP-PSK-noNAT
authby=secret
#shared secret. Use rsasig for certificates.
auto=add
#the ipsec tunnel should be started and routes created when the ipsec daemon itself starts.
keyingtries=3
#Only negotiate a conn. 3 times.
ikelifetime=8h
keylife=1h
ike=aes256-sha1,aes128-sha1,3des-sha1
type=transport
#because we use l2tp as tunnel protocol
left=<span class="pre-highborder">1.2.3.4 #別忘了要改成VPN Server的真實IP喔</span>
#fill in server IP above
leftprotoport=17/1701
right=%any
rightprotoport=17/%any
dpddelay=10
# Dead Peer Dectection (RFC 3706) keepalives delay
dpdtimeout=20
# length of time (in seconds) we will idle without hearing either an R_U_THERE poll from our peer, or an R_U_THERE_ACK reply.
dpdaction=clear
# When a DPD enabled peer is declared dead, what action should be taken. clear means the eroute and SA with both be cleared.
</pre>
<br />
<br />
再來修改預先共用金鑰,編輯 /etc/ipsec.secrets,將PASSWORD改成你要的密碼:
<br />
<pre># This file holds shared secrets or RSA private keys for authentication.
# RSA private key for this host, authenticating it to any other host
# which knows the public part.
# 將底下PASSWORD改成你要的密碼,別忘了""不可刪除
%any : PSK "<span class="pre-highborder">PASSWORD</span>"</pre>
<br />
<br />
<h2>
3.L2TP部分</h2>
編輯 /etc/xl2tpd/xl2tpd.conf:<br />
<pre>[global]
ipsec saref = yes
saref refinfo = 30
;debug avp = yes
;debug network = yes
;debug state = yes
;debug tunnel = yes
[lns default]
ip range = 192.168.1.x-192.168.1.y ;這裡是要配發給client的內部IP區段
local ip = 192.168.1.z ;這裡是VPN Server的內部IP
require chap = yes
refuse pap = yes
require authentication = yes
;ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes</pre>
<br />
<br />
再來編輯 /etc/ppp/options.xl2tpd:<br />
<pre>require-mschap-v2
ms-dns 8.8.8.8
ms-dns 8.8.4.4
auth
mtu 1200
mru 1000
crtscts
hide-password
modem
name l2tpd
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4</pre>
<br />
<br />
增加使用者,編輯 /etc/ppp/chap-secrets:<br />
<pre># Secrets for authentication using CHAP
# client server secret IP addresses
username l2tpd PASSWORD *</pre>
<br />
別忘了server要填l2tp才行<br />
<br />
到這邊就設定完成了,可重啟服務:<br />
<pre>ipsec update
ipsec reload
ipsec restart
service xl2tpd restart</pre>
<br />
<br />
設定防火牆,並開放NAT功能,讓連進來的client也可連上網路,請參考底下(來源:<a href="http://linux.vbird.org/linux_server/0250simple_firewall.php#local_script" target="_blank">鳥哥</a>):<br />
<pre>mkdir -p /usr/local/virus/iptables
vim /usr/local/virus/iptables/iptables.rule
################## 增加底下 ###################
#!/bin/bash
# 請先輸入您的相關參數,不要輸入錯誤了!
EXTIF="eth0" # 這個是可以連上 Public IP 的網路介面
INIF="eth1" # 內部 LAN 的連接介面;若無則寫成 INIF=""
INNET="192.168.1.0/24" # 若無內部網域介面,請填寫成 INNET=""
export EXTIF INIF INNET
# 第一部份,針對本機的防火牆設定!##########################################
# 1. 先設定好核心的網路功能:
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
for i in /proc/sys/net/ipv4/conf/*/{rp_filter,log_martians}; do
echo "1" > $i
done
for i in /proc/sys/net/ipv4/conf/*/{accept_source_route,accept_redirects,send_redirects}; do
echo "0" > $i
done
# 2. 清除規則、設定預設政策及開放 lo 與相關的設定值
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 3. 啟動額外的防火牆 script 模組
if [ -f /usr/local/virus/iptables/iptables.deny ]; then
sh /usr/local/virus/iptables/iptables.deny
fi
if [ -f /usr/local/virus/iptables/iptables.allow ]; then
sh /usr/local/virus/iptables/iptables.allow
fi
if [ -f /usr/local/virus/httpd-err/iptables.http ]; then
sh /usr/local/virus/httpd-err/iptables.http
fi
# 4. 允許某些類型的 ICMP 封包進入
AICMP="0 3 3/4 4 11 12 14 16 18"
for tyicmp in $AICMP
do
iptables -A INPUT -i $EXTIF -p icmp --icmp-type $tyicmp -j ACCEPT
done
# 5. 載入允許進入的service表,用額外檔案以方便單獨設定,就不用每次都要下拉編輯
if [ -f /usr/local/virus/iptables/iptables.services ]; then
sh /usr/local/virus/iptables/iptables.services
fi
# 第二部份,針對後端主機的防火牆設定!###############################
# 1. 先載入一些有用的模組
modules="ip_tables iptable_nat ip_nat_ftp ip_nat_irc ip_conntrack ip_conntrack_ftp ip_conntrack_irc"
for mod in $modules
do
testmod=`lsmod | grep "^${mod} " | awk '{print $1}'`
if [ "$testmod" == "" ]; then
modprobe $mod
fi
done
# 2. 清除 NAT table 的規則吧!
iptables -F -t nat
iptables -X -t nat
iptables -Z -t nat
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
# 3. 若有內部介面的存在 (雙網卡) 開放成為路由器,且為 IP 分享器!
if [ "$INIF" != "" ]; then
iptables -A INPUT -i $INIF -j ACCEPT
echo "1" > /proc/sys/net/ipv4/ip_forward
if [ "$INNET" != "" ]; then
for innet in $INNET
do
iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE
done
fi
fi
# 如果你的 MSN 一直無法連線,或者是某些網站 OK 某些網站不 OK,
# 可能是 MTU 的問題,那你可以將底下這一行給他取消註解來啟動 MTU 限制範圍
# iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss \
# --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu
# 4. NAT 伺服器後端的 LAN 內對外之伺服器設定
# iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 80 \
# -j DNAT --to-destination 192.168.1.210:80 # WWW
# 5. 特殊的功能,包括 Windows 遠端桌面所產生的規則,假設桌面主機為 1.2.3.4
# iptables -t nat -A PREROUTING -p tcp -s 1.2.3.4 --dport 6000 \
# -j DNAT --to-destination 192.168.100.10
# iptables -t nat -A PREROUTING -p tcp -s 1.2.3.4 --sport 3389 \
# -j DNAT --to-destination 192.168.100.20
# 6. 最終將這些功能儲存下來吧!
# /etc/init.d/iptables save
# 在Ubuntu不一定有用就是了,就不用啦,反正每次開機都會執行一次
# iptables-save
########################### END OF iptables.rule #####################
vim /usr/local/virus/iptables/iptables.allow
################### 新增底下 #####################
#!/bin/bash
# 底下則填寫你允許進入本機的其他網域或主機啊!
#iptables -A INPUT -i $EXTIF -s 1.2.3.4 -j ACCEPT
########################## END OF iptables.allow #####################
vim /usr/local/virus/iptables/iptables.services
################### 新增底下 ####################
#!/bin/bash
# 將妳要對外開啟的服務設定在此
# iptables -A INPUT -p TCP -i $EXTIF --dport 21 --sport 1024:65534 -j ACCEPT # FTP
# iptables -A INPUT -p TCP -i $EXTIF --dport 22 --sport 1024:65534 -j ACCEPT # SSH
# iptables -A INPUT -p TCP -i $EXTIF --dport 25 --sport 1024:65534 -j ACCEPT # SMTP
# iptables -A INPUT -p UDP -i $EXTIF --dport 53 --sport 1024:65534 -j ACCEPT # DNS
# iptables -A INPUT -p TCP -i $EXTIF --dport 53 --sport 1024:65534 -j ACCEPT # DNS
# iptables -A INPUT -p TCP -i $EXTIF --dport 80 --sport 1024:65534 -j ACCEPT # WWW
# iptables -A INPUT -p TCP -i $EXTIF --dport 110 --sport 1024:65534 -j ACCEPT # POP3
# iptables -A INPUT -p TCP -i $EXTIF --dport 443 --sport 1024:65534 -j ACCEPT # HTTPS
<span class="pre-highbg">## !!!!!!這裡是 L2TP Over IPSec VPN 務必開放的Port!!!!!!!! ##
iptables -A INPUT -p UDP -i $EXTIF --dport 500 -j ACCEPT
iptables -A INPUT -p UDP -i $EXTIF --dport 4500 -j ACCEPT
iptables -A INPUT -p UDP -i $EXTIF --dport 1701 -j ACCEPT</span>
########################## END OF iptables.services #####################
chmod 700 /usr/local/virus/iptables/iptables.*</pre>
<br />
<br />
好了之後,編輯/etc/rc.local,增加一行 <br />
<pre>/usr/local/virus/iptables/iptables.rule</pre>
重新開機就可以囉~Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-8168527999844809796.post-82264742028342059182017-05-21T21:25:00.001+08:002017-05-21T21:25:33.691+08:00雲豹200換離合器片DIY<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbg4bW6NXnDPWBoF5_07yiV7FyDJnZwNttUqZOXcqLAPeeSyGzQJpOfr3B_2TfPLCgVGg2cpQ5K9znoTsV16hMt8sheVTox6nafI51Jha3Y83mciDSV8VrbM6h4hAyQvv7lmpURDMOfEaE/s1600/18558541_1319237368171978_6192012179084018245_o.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbg4bW6NXnDPWBoF5_07yiV7FyDJnZwNttUqZOXcqLAPeeSyGzQJpOfr3B_2TfPLCgVGg2cpQ5K9znoTsV16hMt8sheVTox6nafI51Jha3Y83mciDSV8VrbM6h4hAyQvv7lmpURDMOfEaE/s400/18558541_1319237368171978_6192012179084018245_o.jpg" width="400" /></a></div>
<br />
200豹最近一直有換檔時動力銜接不上的問題,有轉速但速度沒上去,估計是離合器片已經差不多了,雖然還能騎不過總是有那麼一點疙瘩在,於是備好料之後選定個黃道吉日就是今天來動工換一下啦~<br />
<br />
<a name='more'></a><br /><br />
所需零件:離合器片、case墊片<br />
所需工具:尖嘴鉗、拆C環專門的鉗子(我不知道那叫啥XD)、8號10號T桿、12號梅花及套筒、四角套筒特工<br />
加分工具:一字起、衝擊妻子、舊衣服、舊內褲<br />
<div>
<br /></div>
<div>
廢話不多說,趕快開始啦!!</div>
<div>
<br /></div>
<div>
<div>
本次主角,11年老黑</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV0a0GAZoVIuNAELUzLvAJNlKz_6PtwQshumWf10QjMj26-ysK3yl626MUE4j0MnN9yCZ4n4BiWlnp1BCWGsfkCRSUTBXYobl5zfK-nNFl7JRLqW1855pflfLI8fGaxudTjMdQPLs4Yc9Z/s1600/2017-05-21_0004.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV0a0GAZoVIuNAELUzLvAJNlKz_6PtwQshumWf10QjMj26-ysK3yl626MUE4j0MnN9yCZ4n4BiWlnp1BCWGsfkCRSUTBXYobl5zfK-nNFl7JRLqW1855pflfLI8fGaxudTjMdQPLs4Yc9Z/s640/2017-05-21_0004.jpg" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
先把機油漏光,所以最好是要換機油時順便做比較省</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjXGQA9frhChQ60aYiEPMRp8MmG95CMEpZyXuLb6rhFDmWrfXw7gFY94Ov0uC9fZcEI0YVWb-2ClvPTQYxiIIBx46RNF0RnUuGTjdG84vDmBFTwek4AXP4u-Dt4nXYMReqZPKjvI7pFZsP/s1600/2017-05-21_0008.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjXGQA9frhChQ60aYiEPMRp8MmG95CMEpZyXuLb6rhFDmWrfXw7gFY94Ov0uC9fZcEI0YVWb-2ClvPTQYxiIIBx46RNF0RnUuGTjdG84vDmBFTwek4AXP4u-Dt4nXYMReqZPKjvI7pFZsP/s640/2017-05-21_0008.jpg" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
先拆踩發桿,12號</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRi9ZhG2I6gB94OaM5hTJY5CSnXnCuzBbSHcjBfRsGjkA6HXWIbmv3EEnDhmnCGJVaTqliS4m9DvobODZLJP-5FvFR2J1YZxzBwQ9hIB0duXUqv-UyI_QeaTdrss3tZ_Z0QB6ipR3LiiJW/s1600/2017-05-21_0010.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRi9ZhG2I6gB94OaM5hTJY5CSnXnCuzBbSHcjBfRsGjkA6HXWIbmv3EEnDhmnCGJVaTqliS4m9DvobODZLJP-5FvFR2J1YZxzBwQ9hIB0duXUqv-UyI_QeaTdrss3tZ_Z0QB6ipR3LiiJW/s640/2017-05-21_0010.jpg" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
拆離合器線,尖嘴鉗</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjQl5w_QIUIhp4s86-huivutfdZiiBCwQ14jG76NcLURF3gyNpOcFgtn5512UJglbCXiDln2613051aq_nJYufHIgPAxp5ikDewVq8XibgEL_nUO_RpGDe8FmDsXBYNqyL3tHBERPHwcwM/s1600/2017-05-21_0015.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjQl5w_QIUIhp4s86-huivutfdZiiBCwQ14jG76NcLURF3gyNpOcFgtn5512UJglbCXiDln2613051aq_nJYufHIgPAxp5ikDewVq8XibgEL_nUO_RpGDe8FmDsXBYNqyL3tHBERPHwcwM/s640/2017-05-21_0015.jpg" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
接著用8號T桿將右case螺絲一一拆除,200豹共13顆,注意有一顆螺絲比較長,到時不要弄錯了。等等case拆掉會滴一些舊油,所以底下最好墊一塊布,這時舊衣服就派上用場了。</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrLRbX9zOQP5gM8f12HC-L2gWG_th1U6jxzaMm3NNVctSOV_o1yRGGKTQqWnuz_rjo-bFbMm9374mUHS2dHZ1YahpVvlYzFGRkVWlEkedHHsbPkUxg-i8E0FQtG1NHekSg4BSvoTGwFCXU/s1600/2017-05-21_0017.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrLRbX9zOQP5gM8f12HC-L2gWG_th1U6jxzaMm3NNVctSOV_o1yRGGKTQqWnuz_rjo-bFbMm9374mUHS2dHZ1YahpVvlYzFGRkVWlEkedHHsbPkUxg-i8E0FQtG1NHekSg4BSvoTGwFCXU/s640/2017-05-21_0017.jpg" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
就是最右側這顆螺絲比較長</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGuUeSMBA5FjnG-uvR-lcoMhlzGWrbWNlfJSHvFVXiCwRCWE4w8sfVMnP4Y-Lmjbzp_aU17qiZbIiaveeGvEpW6fRPMyqmh0uYEg1mdvzCkrh9xuxPxX_8mYpSrU7HXnz_PuYpDVGHOiKF/s1600/2017-05-21_0018.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGuUeSMBA5FjnG-uvR-lcoMhlzGWrbWNlfJSHvFVXiCwRCWE4w8sfVMnP4Y-Lmjbzp_aU17qiZbIiaveeGvEpW6fRPMyqmh0uYEg1mdvzCkrh9xuxPxX_8mYpSrU7HXnz_PuYpDVGHOiKF/s640/2017-05-21_0018.jpg" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
拆好就可以準備把case拆掉,可用膠槌稍微打一下。這裡卡第一個關,因為腳踏阻擋,拆不下來,所以要先把腳踏螺絲移除</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf5bCCzZUj2DA_rsaIPcvaiPMeW6fLe4CyXFVyQOn0EofcrTV9yuRb4lg7mcT17ceWXdZHUJZFe6B_Pc5aqtpAo3LVFjRpIeBBWMNCKgdaHjmXLz0gWS9cu8IgoS1hbEeDWfY3e2Nnl4hS/s1600/2017-05-21_0019-1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf5bCCzZUj2DA_rsaIPcvaiPMeW6fLe4CyXFVyQOn0EofcrTV9yuRb4lg7mcT17ceWXdZHUJZFe6B_Pc5aqtpAo3LVFjRpIeBBWMNCKgdaHjmXLz0gWS9cu8IgoS1hbEeDWfY3e2Nnl4hS/s640/2017-05-21_0019-1.jpg" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
腳踏螺絲就是這兩顆,12號</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhViv9NzSkgKTXuBs5iNYY7Bhx8vZzI1o2B18XKgEltswPAtfiBnsg5WhhDNVSirL2SRyKgiqG0rUZDIUOKocZBdkJ-7ey43IQDpnMRBzsmclZ4T521VCKJdjVgxD76YPlCaDB4rYm9kLHf/s1600/2017-05-21_0019-2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhViv9NzSkgKTXuBs5iNYY7Bhx8vZzI1o2B18XKgEltswPAtfiBnsg5WhhDNVSirL2SRyKgiqG0rUZDIUOKocZBdkJ-7ey43IQDpnMRBzsmclZ4T521VCKJdjVgxD76YPlCaDB4rYm9kLHf/s640/2017-05-21_0019-2.jpg" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
case拆掉就可露出內部啦~左邊舉升板中間有個推桿可以先拿掉(注意方向)</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp56laOkY-LjlHTdCp5lU0use0cg7BBlGQKocDOBQf8SNGu3atlZviOS40UYMZch28M_ISgqrsSy9nenp_Zz03JKCq2sWeplQSyj1sY4_UDdXb7BmH5R0b_ndtAzdejj38-lzdwBRB-rQU/s1600/2017-05-21_0020.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp56laOkY-LjlHTdCp5lU0use0cg7BBlGQKocDOBQf8SNGu3atlZviOS40UYMZch28M_ISgqrsSy9nenp_Zz03JKCq2sWeplQSyj1sY4_UDdXb7BmH5R0b_ndtAzdejj38-lzdwBRB-rQU/s640/2017-05-21_0020.jpg" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
拆下來的case,可先擦乾淨</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUDlhMQV6SkKjnP45swnpaw-a1RUqqscICYx6zUMq6sEZpa36C7HLVMKYCFnNph4esBIygH10UBTNFFhz8drMjwGd8P4raMD1ehGP2egQ7G553SwX5RR6VI0TDkmPW4QCVcuRHcL98Do3E/s1600/2017-05-21_0022.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUDlhMQV6SkKjnP45swnpaw-a1RUqqscICYx6zUMq6sEZpa36C7HLVMKYCFnNph4esBIygH10UBTNFFhz8drMjwGd8P4raMD1ehGP2egQ7G553SwX5RR6VI0TDkmPW4QCVcuRHcL98Do3E/s640/2017-05-21_0022.jpg" width="640" /></a></div>
<div style="text-align: center;">
<br /></div>
<div>
<br /></div>
<div>
<div>
再來準備對付這三顆機油離心室外蓋的螺絲,因為有舊機油殘留,可擦乾淨避免滑掉,<span style="color: red;">這是特規螺絲,務必小心處理!!建議使用衝擊<strike>妻子</strike>起子處理</span></div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhEzudC2qlxKXkB_6J3Q0jpzgGkvDG_Yi3_9CL1-TpwW_2yL_-U8GcTzTi5X4zvDft7fk41VWA-7RQvD-Y_B782BEpP_FdDKVhRMyO3z1QqdGHq-Nh4wNSz1V1eBT9-sEAvKvASZNW-1p4/s1600/2017-05-21_0023.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhEzudC2qlxKXkB_6J3Q0jpzgGkvDG_Yi3_9CL1-TpwW_2yL_-U8GcTzTi5X4zvDft7fk41VWA-7RQvD-Y_B782BEpP_FdDKVhRMyO3z1QqdGHq-Nh4wNSz1V1eBT9-sEAvKvASZNW-1p4/s640/2017-05-21_0023.jpg" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
使用衝擊妻子衝擊一下就下來囉~妻子真好~~😍</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdDFcC-2V-b0z9OxnXxcBzXIFPLYe7xfNQSR2sh1jZUbF7CPbZKkxMCDFFDGh2O8vgrMjweYid5B-yxuLAecd3z-lGTXvzeenUqtDaqcHTh8Sxcy8pxfKFwuuErHhy-q6El08j5p4ez2no/s1600/2017-05-21_0025.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdDFcC-2V-b0z9OxnXxcBzXIFPLYe7xfNQSR2sh1jZUbF7CPbZKkxMCDFFDGh2O8vgrMjweYid5B-yxuLAecd3z-lGTXvzeenUqtDaqcHTh8Sxcy8pxfKFwuuErHhy-q6El08j5p4ez2no/s640/2017-05-21_0025.jpg" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
接著對付這顆四角螺帽,使用特工四角套筒,再搭配衝擊妻子也是衝個幾下就下來了</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigHwtAavhP_VhxbwnH9rHfHf1TnMVHIkcJT0tKSObLnlweF4hBFEdM_m834SkyWbio8pZ7g0JYGkdJu_6syL4jG5IWJ8-bjEHoXJG0oIcwDqKmr9_ZtSw5hXli2k_hK4Jch_FQLdOuqNoK/s1600/2017-05-21_0026.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigHwtAavhP_VhxbwnH9rHfHf1TnMVHIkcJT0tKSObLnlweF4hBFEdM_m834SkyWbio8pZ7g0JYGkdJu_6syL4jG5IWJ8-bjEHoXJG0oIcwDqKmr9_ZtSw5hXli2k_hK4Jch_FQLdOuqNoK/s640/2017-05-21_0026.jpg" width="360" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
擦乾淨擺好,注意中間墊片方向</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy_wbl3t-JNpOix5oAvUAQzUszmtZhLocZREkRVs-xhgi1FLk2HGODGDRTuZ9X7Pej9rLUNreBD-5qRgqyXn0YLXnkaGHOwUX0ZGd4RGRnijSdJmvclnZxiBzKpi-jm6rMnUcJx6p7agaz/s1600/2017-05-21_0027.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy_wbl3t-JNpOix5oAvUAQzUszmtZhLocZREkRVs-xhgi1FLk2HGODGDRTuZ9X7Pej9rLUNreBD-5qRgqyXn0YLXnkaGHOwUX0ZGd4RGRnijSdJmvclnZxiBzKpi-jm6rMnUcJx6p7agaz/s640/2017-05-21_0027.jpg" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
接著拆除左邊舉升板,四顆10號螺絲,注意不要一次只拆一顆下來,因為有彈簧,要平均每次一顆轉一點下來</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-WJ9VcvFLnQJkXO1GCbMEwp6dp4KP6-Wn24kmjJHR-HA3L3MkMlDQXRghc4QEQxXS2m3zAs5Qy2XMHiMRTXq0aJPsH1sz4NditgDqMKpC9WXR08VVxUzweOCzS-Lz_py7SL38zkTqgh6X/s1600/2017-05-21_0028.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-WJ9VcvFLnQJkXO1GCbMEwp6dp4KP6-Wn24kmjJHR-HA3L3MkMlDQXRghc4QEQxXS2m3zAs5Qy2XMHiMRTXq0aJPsH1sz4NditgDqMKpC9WXR08VVxUzweOCzS-Lz_py7SL38zkTqgh6X/s640/2017-05-21_0028.jpg" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
拆掉後四個彈簧也拿掉擦乾淨</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi52lPxio9HKl8L01ZGqzibui8PKdnKjlta9gB43WdnTLkCnDY5vif7hsWmtStO2OjrL6E-wGBbNgNJUwwhhaK0DrFLvhlOrnj2laMRTmy8i3ep38E1gKYPXN1ZfKj9PQDd1gYveTPdrHzx/s1600/2017-05-21_0029.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi52lPxio9HKl8L01ZGqzibui8PKdnKjlta9gB43WdnTLkCnDY5vif7hsWmtStO2OjrL6E-wGBbNgNJUwwhhaK0DrFLvhlOrnj2laMRTmy8i3ep38E1gKYPXN1ZfKj9PQDd1gYveTPdrHzx/s640/2017-05-21_0029.jpg" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
舉升板也擦乾淨</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAQkhs51TjVPz3SAroXIFUIN4DcL_cCjMh8YDq7Ahdy7oakLzMByMtjk2QxT8XvEOG88NKjQx3KOd2l0ETWpnOFBO6LuuVhGt1P2oXYy3ZkGOBtdJoUE7ntB56NG5BLF_U2RlvPxftcEDg/s1600/2017-05-21_0030.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAQkhs51TjVPz3SAroXIFUIN4DcL_cCjMh8YDq7Ahdy7oakLzMByMtjk2QxT8XvEOG88NKjQx3KOd2l0ETWpnOFBO6LuuVhGt1P2oXYy3ZkGOBtdJoUE7ntB56NG5BLF_U2RlvPxftcEDg/s640/2017-05-21_0030.jpg" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
接下來要拆除C環,這裡卡第二關,因為它卡在一個凹槽內,沒有適當工具拆老半天,於是跑去買了一個專門拆C環的鉗子,搭配細一字起很快就尻出來了XD</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEja9Z6hXT75K3BnzidGJxEDW8iY9hUwm8frfzuhbQHEbB3ooclRH9Blj3bgqQ4xWlgwzEJuslxzOP8K4Asctw7Ml5duQoosI6Or3uAJjXHSku7kTHvDPrJgcRMjC-eefaYOBNI0mPIKNT1d/s1600/2017-05-21_0032.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEja9Z6hXT75K3BnzidGJxEDW8iY9hUwm8frfzuhbQHEbB3ooclRH9Blj3bgqQ4xWlgwzEJuslxzOP8K4Asctw7Ml5duQoosI6Or3uAJjXHSku7kTHvDPrJgcRMjC-eefaYOBNI0mPIKNT1d/s640/2017-05-21_0032.jpg" width="360" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both;">
拆掉啦,接著就可以把舊離合器片整個拿出來了</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHph3k9KB-5wr0nsaJXhVJtpQQb-jRUtTUpWGFl5ID4HW_xtMonsYWj9lfFvxTvyb41PkFzkcfe79RsooC4nOt_PC_ab8x3zWVV7M8ESrH0ohexljya5JMhLayHL-N2UBzABPKsZ4Pwu2x/s1600/2017-05-21_0033.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHph3k9KB-5wr0nsaJXhVJtpQQb-jRUtTUpWGFl5ID4HW_xtMonsYWj9lfFvxTvyb41PkFzkcfe79RsooC4nOt_PC_ab8x3zWVV7M8ESrH0ohexljya5JMhLayHL-N2UBzABPKsZ4Pwu2x/s640/2017-05-21_0033.jpg" width="360" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both;">
檢查一下澳打,看起來還OK沒有刮痕磨損,把它擦乾淨</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2eg8lWGOeQBlrpnO1kxDTxVa8x8VlrDqazozOcWTKzUEwMtRHDV4EbP-61mnUdq3mvjOo6NUlO8tkF3F_ZzRutZuBPcWAwPnQA1yFvyzOitQKSNRTs1QR5oe3OUQFwdfDB7ozBurz8KTJ/s1600/2017-05-21_0034.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2eg8lWGOeQBlrpnO1kxDTxVa8x8VlrDqazozOcWTKzUEwMtRHDV4EbP-61mnUdq3mvjOo6NUlO8tkF3F_ZzRutZuBPcWAwPnQA1yFvyzOitQKSNRTs1QR5oe3OUQFwdfDB7ozBurz8KTJ/s640/2017-05-21_0034.jpg" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
離合器片就是放在他們兩個中間</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9OoqBantUTcX9VYh9V1AeZVySV14cCURuRD2NwKy762Gy8g2r6of3uyjlzXYUeWY4cTmhJbvqZXr20_S9C0ubwvaPp1dOvvrlrxreh_sK1GEqP64EA4MJGug-kb5NwJWVVu1IwlcQ360K/s1600/2017-05-21_0035.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9OoqBantUTcX9VYh9V1AeZVySV14cCURuRD2NwKy762Gy8g2r6of3uyjlzXYUeWY4cTmhJbvqZXr20_S9C0ubwvaPp1dOvvrlrxreh_sK1GEqP64EA4MJGug-kb5NwJWVVu1IwlcQ360K/s640/2017-05-21_0035.jpg" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
舊離合器片,已經黑媽媽了XD</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUlVusuhKzK4HNHK7N04012ynzsWnzswVgV_1TEzNHeHaNYp3x9xdbjz6Q3ugXhVX1mHmgAmEawz_5cE5nqewob_6hiWJgrxmKfT13cwRusJQ0L41mhjvKYoE_Qhe-PXANDzenQNllrhr8/s1600/2017-05-21_0036.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUlVusuhKzK4HNHK7N04012ynzsWnzswVgV_1TEzNHeHaNYp3x9xdbjz6Q3ugXhVX1mHmgAmEawz_5cE5nqewob_6hiWJgrxmKfT13cwRusJQ0L41mhjvKYoE_Qhe-PXANDzenQNllrhr8/s640/2017-05-21_0036.jpg" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj34ivByt1vVLw4qsYg6wAVBnz4p1XPfz4KL7w9Y6UHCQQAJNinGubhsiKTaeva8kIe6tTZ-w5KzH-ng-CId_hRSBpbQSpoB5XPNGUdQsQZsgqwM5zHcKspa3t1egCR_D8Rd0jYsxXrDzsr/s1600/2017-05-21_0040.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj34ivByt1vVLw4qsYg6wAVBnz4p1XPfz4KL7w9Y6UHCQQAJNinGubhsiKTaeva8kIe6tTZ-w5KzH-ng-CId_hRSBpbQSpoB5XPNGUdQsQZsgqwM5zHcKspa3t1egCR_D8Rd0jYsxXrDzsr/s640/2017-05-21_0040.jpg" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
在拆的同時先用新機油醃漬一下新的離合器片,才比較入味可口~要平均每片都有醃漬到才行喔!!</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY3FouTfZ_5u_1-8wcAc-D0cH0gI3knNziDrBsVfZG63g5ckzuwl9zLOncOjKk5HIR8SAy1imS0TPAMa2RamZttb30lovw1Pgou1Xde7F9aHhL_NriKhvaZsk-TFk5rOmDKQH5V4tFo0zy/s1600/2017-05-21_0041.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY3FouTfZ_5u_1-8wcAc-D0cH0gI3knNziDrBsVfZG63g5ckzuwl9zLOncOjKk5HIR8SAy1imS0TPAMa2RamZttb30lovw1Pgou1Xde7F9aHhL_NriKhvaZsk-TFk5rOmDKQH5V4tFo0zy/s640/2017-05-21_0041.jpg" width="360" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both;">
醃好後就可將離合器片和金屬板放回去,因為我對動力沒那麼要求,所以還是用原廠的離合器片與原廠有壓花板。五片離合器片+四片金屬板,依照離合器片->金屬板->離合器片...順序放好</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLFxDvqe1oRpLBSelG-AmwNLwsG_hFdj2Pid8cvqPNDpIGIf5ikcIe_Fu4PEDKeWdJFvvWgE_SpMI-j5zo8kVn0Ck2Vv9ydnRzgu-dIJ7l0euIkQxTJCmEQfCH6uLN9D6sUc_q8-Yfmf8L/s1600/2017-05-21_0042.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLFxDvqe1oRpLBSelG-AmwNLwsG_hFdj2Pid8cvqPNDpIGIf5ikcIe_Fu4PEDKeWdJFvvWgE_SpMI-j5zo8kVn0Ck2Vv9ydnRzgu-dIJ7l0euIkQxTJCmEQfCH6uLN9D6sUc_q8-Yfmf8L/s640/2017-05-21_0042.jpg" width="360" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
放好後裝回。這裡注意因為新離合器片剛醃漬過,會有機油滴下,使用兒子舊內褲墊著,就不會滴的到處都是啦XD~裝好後把C環卡回去</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhY8Sd4f8AlCpuIjS2z3zh34IDkCE-jGLwHmBL_0q8XCa05ViQtUbdrj7r1uzjz1bYU2Pmakm6Mt2mjUP31tUATCHsIPZ5BctF97E_jvjcgJ5e4UYJAKE8xrDGOrhmI0rQqVy1YyGsrmYPm/s1600/2017-05-21_0043.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhY8Sd4f8AlCpuIjS2z3zh34IDkCE-jGLwHmBL_0q8XCa05ViQtUbdrj7r1uzjz1bYU2Pmakm6Mt2mjUP31tUATCHsIPZ5BctF97E_jvjcgJ5e4UYJAKE8xrDGOrhmI0rQqVy1YyGsrmYPm/s640/2017-05-21_0043.jpg" width="360" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
接著怎麼拆就怎麼裝回去,鎖上舉升板,一樣不要一次只鎖緊一顆,要平均每個轉動幾下</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDuQQXfrNOepvpfOCLxPhD-pvaravbNFQYZoJQ8UMIb07c57QpoT3SaCGBng9isp6PCKP9tOVkX6HXqdbMWb2774VQvgU4qCQXZk29Ve1H39LlzSM-yUULVV9GwotNqANBt5mrRUptptZC/s1600/2017-05-21_0045.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDuQQXfrNOepvpfOCLxPhD-pvaravbNFQYZoJQ8UMIb07c57QpoT3SaCGBng9isp6PCKP9tOVkX6HXqdbMWb2774VQvgU4qCQXZk29Ve1H39LlzSM-yUULVV9GwotNqANBt5mrRUptptZC/s640/2017-05-21_0045.jpg" width="360" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
再把機油離心室裝回,可再招喚妻子來衝擊鎖緊。推桿插回去</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmJhcA2W07-HtiGh7N8yUfy26skjMOpzdwbHoBtWgYw6oz8S4r1ymE_c56gYkLwevVHE1-7G6rh0fJnMKtTIaGEYkDVq2I8iBE47z_Dr2o406VHGgZw_RqJT27qY5PPUWjZTFuytsbC0y1/s1600/2017-05-21_0046.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmJhcA2W07-HtiGh7N8yUfy26skjMOpzdwbHoBtWgYw6oz8S4r1ymE_c56gYkLwevVHE1-7G6rh0fJnMKtTIaGEYkDVq2I8iBE47z_Dr2o406VHGgZw_RqJT27qY5PPUWjZTFuytsbC0y1/s640/2017-05-21_0046.jpg" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
用舊內褲擦拭一下外圍,有舊墊片殘留要刮乾淨</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg939oMO9_I1dFjeU519e-c8C5CvTXGiUYRLsVA3UmV5UY6XIOhs6B9jwzTokvbMw3o9sB805shchhFrTXlF7tnlze5PvxrJmbKk4eU2i_jM7AVqTbdbDeKJG0PWJMqpvJIigi0-KQd6tVP/s1600/2017-05-21_0047.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg939oMO9_I1dFjeU519e-c8C5CvTXGiUYRLsVA3UmV5UY6XIOhs6B9jwzTokvbMw3o9sB805shchhFrTXlF7tnlze5PvxrJmbKk4eU2i_jM7AVqTbdbDeKJG0PWJMqpvJIigi0-KQd6tVP/s640/2017-05-21_0047.jpg" width="360" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
放上新墊片</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDx2O5KObShIZp9YizUukwNYWXXOG4XAHNDJrrp04YobjZZCegzASP8ZV3aU89jhRtQjIMD27ZFvjdrCBnFUcTfiyNgshtgZ0jwHjyeFtNor8AwS4gZ8JuqiXDHr7sFuh7RB4cZV4PWUZB/s1600/2017-05-21_0048.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDx2O5KObShIZp9YizUukwNYWXXOG4XAHNDJrrp04YobjZZCegzASP8ZV3aU89jhRtQjIMD27ZFvjdrCBnFUcTfiyNgshtgZ0jwHjyeFtNor8AwS4gZ8JuqiXDHr7sFuh7RB4cZV4PWUZB/s640/2017-05-21_0048.jpg" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
再把case裝回,螺絲鎖緊即可。注意螺絲不要逼太緊,不然有斷掉或滑牙的風險~另外螺絲也要採用對角鎖緊,以免受力不均勻喔!!</div>
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFHQHDrJ5HqY7gGdt_60ByrpqdiEObMoeFphQPP7oqe7nBXEOMHyqLC7TE_zjogSId8Tln4h0Ump1M9tar2pandrSFoXusIznYI-X5luLDGEHbg7wRlVx_rBC27w1XGjv5790Hcn9GWoBh/s1600/2017-05-21_0049.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFHQHDrJ5HqY7gGdt_60ByrpqdiEObMoeFphQPP7oqe7nBXEOMHyqLC7TE_zjogSId8Tln4h0Ump1M9tar2pandrSFoXusIznYI-X5luLDGEHbg7wRlVx_rBC27w1XGjv5790Hcn9GWoBh/s640/2017-05-21_0049.jpg" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
最後再把腳踏鎖回、離合器線裝好、奸細調整。這裡注意,不要鎖好case就興奮的發動引擎試車,我們還沒加機油啊XD</div>
<div>
<br /></div>
<div>
<span style="font-size: large;"><b>加好新的機油再試車吧~</b></span></div>
</div>
<div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8168527999844809796.post-40764495539192085782017-05-06T10:59:00.000+08:002017-05-06T13:27:22.011+08:00[筆記] QNAP NAS增加手動排程公司規模比較小,所以使用NAS當作File Server,供大家存取共用檔案,也是挺方便的。<br />
<br />
而有時總是會有些需求,例如在某些時刻禁止某些使用者連線網路磁碟機,在web介面上沒這功能,所以就要自己寫啦~<br />
<br />
<a name='more'></a><br />
我們公司的NAS是TS-259 Pro+,首先先規劃一下流程:<br />
1. 登入ssh,然後在裡面新增設定的bash檔<br />
2. 修改crontab,加入排程執行我們的bash檔<br />
<br />
然後測試,看起來一切OK~好~重開個機吧,結果一重開,剛才寫好的bash檔都不見了!WTF!?<br />
<br />
原來,我們用SSH登入後看到的檔案系統,其實很多東西都是放在ramdisk內,如果我們直接在裡面新增檔案的話,重新開機就會不見囉!所以必須放在實體硬碟,而最好的方式就是放在共用資料夾,保證就會是實體硬碟,這樣開機也不會消失了,而且以後有要新增的指令只要先在自己的作業系統編輯好再放上即可,比較方便,只要我們權限設定好即可囉。<br />
<br />
首先我們登入web介面,先新增一個共用資料夾(例如schedule),這個資料夾目的是放置我們要設定排程指令的檔案,所以權限只限管理者可讀寫,並且隱藏(直接在網址打資料夾名稱還是進的去)。<br />
<br />
資料夾開好後,就可以放我們的bash檔,建議用notepad++編輯,因為用windows內建的記事本會因為格式不對而出錯。<br />
<br />
再來請用ssh登入NAS(記得要先把ssh可登入打開),ssh只限管理帳號登入喔!首先到<span style="font-family: "consolas";"><span style="color: red;">/share/MD0_DATA/</span>schedule</span>內,設定指令碼可執行:<br />
<pre>chmod 755 *.sh</pre>
<br />
<i>(上述紅字的路徑是TS-259 Pro+的分享資料夾路徑,必須依照自己的系統修改)</i><br />
<br />
接著編輯/etc/config/crontab檔案,增加你要甚麼時候執行sh檔即可。如:<br />
<pre>0 10 * * * /share/MD0_DATA/schedule/xx.sh</pre>
這行表示每天10點會執行一次xx.sh內容。<br />
<br />
編輯好了之後,執行一下<br />
<pre>crontab /etc/config/crontab && /etc/init.d/crond.sh restart</pre>
讓系統重新讀取一次crontab的設定,以及重新啟用crond服務即可。<br />
<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8168527999844809796.post-68259136675561467702015-12-05T05:03:00.002+08:002015-12-05T13:56:20.848+08:00「初始化字串的格式和開始於索引 0 的規格不相符的」問題<span style="color: #660000; font-size: large;"><i>「初始化字串的格式和開始於索引 0 的規格不相符」</i></span><br />
<span style="color: #660000; font-size: large;"><i><br /></i></span>
<span style="color: #660000; font-size: large;"><i>「Format of the initialization string does not conform to specification starting at index 0」</i></span><br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAnzjuC_k7Q_9YlJNPslkewnwGTKas6ckvw3xENus2R19dmn1GNVqwmJL0S1If84UBAHNyeJp2-e8Jzuir2edUgLyvZPBp-Ih6QEsy_SrJDt7epqBAijyLrO388zVLCwknpb6WtZ3S4atH/s1600/2015-12-05_044356.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAnzjuC_k7Q_9YlJNPslkewnwGTKas6ckvw3xENus2R19dmn1GNVqwmJL0S1If84UBAHNyeJp2-e8Jzuir2edUgLyvZPBp-Ih6QEsy_SrJDt7epqBAijyLrO388zVLCwknpb6WtZ3S4atH/s1600/2015-12-05_044356.png" /></a></div>
<br />
<br />
相信使用Entity Framework Code-First的開發者一定有人遇過,在本機開發環境做了Add-Migration XXX和Update-Database之後看起來都沒問題,發佈設定檔裡面也勾了啟用Code-First移轉,然後發佈到遠端主機上,開心的期盼.Net會自動更新資料庫,結果總是出現這個錯誤...<br />
<br />
<a name='more'></a><br />
<br />
<span style="color: red; font-size: large;"><b>教學書裡不會告訴你可能會有這個問題,也不會跟你講設定發佈時所要注意的重點</b>,</span>可是偏偏就是會遇到,而且死都找不出問題在哪!教學裡對發佈的步驟總是草草帶過,只會介紹基本設定,而不會提供太多細節,但發佈卻也是最重要的事,牽扯到上線後的網站能不能正常啊...<br />
<br />
<br />
一般我們會如下設定:<br />
<br />
使用Code-First,在發佈設定檔會將紅圈處的框框打勾(如下)<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIbpxpgZoIT4BB0lDWPO-Io2uUyxoSdv-P7Tp7c-7GF52B4fcz0kHyjxb3UaF-28KcUIK8dKrxK8VYt5Xku2QiWdxtV-to7wisaQJWkU_GUJLpa5tTREwLBSPKX4xBZoA-XyKCkPfCtIiX/s1600/2015-12-05_045017.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIbpxpgZoIT4BB0lDWPO-Io2uUyxoSdv-P7Tp7c-7GF52B4fcz0kHyjxb3UaF-28KcUIK8dKrxK8VYt5Xku2QiWdxtV-to7wisaQJWkU_GUJLpa5tTREwLBSPKX4xBZoA-XyKCkPfCtIiX/s1600/2015-12-05_045017.png" /></a></div>
<br />
<br />
然後Visual Studio會自動在發佈後轉換遠端主機上的web.config,加入Migration移轉的設定,我們來看看下圖,是預設發佈後遠端主機上的web.config:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5AeTC5HmDmwOZ6i8aL0Bc2h7UyrTDLyyC3kpCamX7RLzOSyhUwmO-17tFcnl_iHkO6Z5hB9MsQ_Yu9JaFjyiRJS5U5_-tFlpuYR2a7wbG4PQlNslAH4D38zrwj00RjHPAcJtKHLT-3mBR/s1600/2015-12-05_045405.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5AeTC5HmDmwOZ6i8aL0Bc2h7UyrTDLyyC3kpCamX7RLzOSyhUwmO-17tFcnl_iHkO6Z5hB9MsQ_Yu9JaFjyiRJS5U5_-tFlpuYR2a7wbG4PQlNslAH4D38zrwj00RjHPAcJtKHLT-3mBR/s640/2015-12-05_045405.png" width="640" /></a></div>
<br />
紅框處就是自動加上的,會多個名為「原本連線字串名稱_DatabasePublish」的連線字串設定,乍看之下好像都沒問題,原本我也以為connectionString裡面那樣就會自動轉換,好聰明...<br />
<b><br /></b>
<span style="color: red;"><b>結果問題就是出在這!</b></span>根本不會幫你轉換!!連不到資料庫,就出現錯誤了!<br />
<br />
我們只要把connectionString裡面那段文字改成上面真正的連線字串,問題就解決了...<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7XaUbTN9V0DJS1vBIRxtcHBOxeR6VgfqqnHufQggXA5IbrrDFyRFWsJhtTC4P_G6ZqF_71YKcxAn00ytJ8VvWpQi1Xi4LV7IJNpvNNF44N-slt82oeCGphUVN6R7nNq0nWjdC8uSNM8hP/s1600/2015-12-05_050227.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="216" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7XaUbTN9V0DJS1vBIRxtcHBOxeR6VgfqqnHufQggXA5IbrrDFyRFWsJhtTC4P_G6ZqF_71YKcxAn00ytJ8VvWpQi1Xi4LV7IJNpvNNF44N-slt82oeCGphUVN6R7nNq0nWjdC8uSNM8hP/s640/2015-12-05_050227.png" width="640" /></a></div>
<br />
<br />
簡單吧?但找出問題點實在是毫無頭緒啊....從很久之前用過Code-First移轉發佈就有這個問題了,當時只是因為在測試,資料也不是正式的所以刪掉沒差就沒理他。想不到到今天還是沒解決...<br />
<br />
但為了證實是否是bug還是其他問題,再在繼續研究下,發現發佈設定連線字串那邊,只要把使用Code-First的DbContext的文字框內,放入真正的ConnectionString,配合使用Code-First移轉勾選,發佈過去的Code-First移轉連線字串就會正常了!<br />
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwo9vxjgA7ZG15X2IK94X1i7mPGJXh4jkhL9bmLQ8UhCT9X5ova1bce0JLWDQyd0PvrOjpRtjdL1jwoV_I93OLDfXb-O0KepFBqgrh0p2W5zp1KCfk4DocbQVCoX5kNI1QUSMzzf9oZfIE/s1600/2015-12-05_133818.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwo9vxjgA7ZG15X2IK94X1i7mPGJXh4jkhL9bmLQ8UhCT9X5ova1bce0JLWDQyd0PvrOjpRtjdL1jwoV_I93OLDfXb-O0KepFBqgrh0p2W5zp1KCfk4DocbQVCoX5kNI1QUSMzzf9oZfIE/s1600/2015-12-05_133818.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqkiccrx8QMfty-HwU1uj_Nexp7zKdD23fQ-oZcaeBC0joXqL_dZAVesoWl3rCyOC8X3y1iV2mbXect6HeLhF8OeqkpH-3ielJRsxsc7AZ6x0PebLgu_ZxXbzQT83cOxGvAdFjqDozY_uM/s1600/2015-12-05_133954.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqkiccrx8QMfty-HwU1uj_Nexp7zKdD23fQ-oZcaeBC0joXqL_dZAVesoWl3rCyOC8X3y1iV2mbXect6HeLhF8OeqkpH-3ielJRsxsc7AZ6x0PebLgu_ZxXbzQT83cOxGvAdFjqDozY_uM/s1600/2015-12-05_133954.png" /></a></div>
<br />
這個小地方是幾乎所有發佈教學裡不會告訴你的事...多的是,你不知道的事~~<br />
<br />
而因為每個發佈環境我有自己的web.xxx.config,會自動轉換ConnectinoString,所以「在執行階段使用此連線字串(更新目標web.config)」我就沒有勾了。<br />
<br />
<br />
希望這篇文章能幫助到有同樣問題的朋友們~Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8168527999844809796.post-42653720991640461802015-11-14T23:50:00.001+08:002015-11-14T23:50:17.812+08:00[筆記]將Git快顯功能表內的功能移除最近遇到一個問題,移除了Git安裝新版,又移除再安裝,反覆過程中,原本的快顯功能表壞掉了...<br />
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmEJ4Ygmct7pOWXrDQtYMEH6Ou5Yv-DY73vuJ9S1YpCvqCdNxTE7gQfu58M5YpN0vS0aNLFo0ylP9TzkArnysKFyUAKBCZI5yu4MkH0ORCESVTjhz1SXsszbTCrTkjjJY4C46OsqoxSAAe/s1600/2015-11-14_234212.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmEJ4Ygmct7pOWXrDQtYMEH6Ou5Yv-DY73vuJ9S1YpCvqCdNxTE7gQfu58M5YpN0vS0aNLFo0ylP9TzkArnysKFyUAKBCZI5yu4MkH0ORCESVTjhz1SXsszbTCrTkjjJY4C46OsqoxSAAe/s1600/2015-11-14_234212.png" /></a></div>
<br />
<br />
可看圖,原本裝好git for windows之後,資料夾空白處按右鍵會有「Git Bash Here」、「Git GUI Here」這兩個功能,但因為過程中壞掉,導致移除的時候沒順便清掉這兩個,又因為再次安裝的位置不同<i><span style="font-size: x-small;">(這說來話長....總之跟git版本和Visual Studio的git第三方擴充有關)</span></i>,按下去會變成如下:<br />
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiabh2zIII2qYPSWc-iBsDdm8_Z80b0l_0MDMPc550HaIMZVL14oEYz7lyMllRPsrNlQZ0RzaJNLf18zJhYneLXb2k0Y0-73VjQ3EXqQzfzjFC4g6ygi-XUme8_Gmn9kz1oiU6DY1x42qSQ/s1600/2015-11-14_234241.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiabh2zIII2qYPSWc-iBsDdm8_Z80b0l_0MDMPc550HaIMZVL14oEYz7lyMllRPsrNlQZ0RzaJNLf18zJhYneLXb2k0Y0-73VjQ3EXqQzfzjFC4g6ygi-XUme8_Gmn9kz1oiU6DY1x42qSQ/s1600/2015-11-14_234241.png" /></a></div>
<br />
重新安裝git,選擇不加入快顯功能表也沒用,這兩個東西的指向位置還是錯誤,在試了超久之後,終於發現他的位置了!只要在<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell</span><br />
<br />
底下,把兩個資料夾刪掉就可以啦!<i><span style="font-size: x-small;">(圖中我因為已經刪掉一個做測試了,所以只剩一個,照理說會有兩個)</span></i><br />
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgl5pxYz7pvnzRuyPPl8wrbwFGwQwW20u16hAdxM1LWy6A-15GN0bBxIQev2C6XwMuDzdMMx50eIvWFwBZix8kR7dxXAOy48tjWJTS5ucJ3e_DlnVD88CRcA10GYnX7VfIBkJMs52UWQZez/s1600/2015-11-14_234808.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgl5pxYz7pvnzRuyPPl8wrbwFGwQwW20u16hAdxM1LWy6A-15GN0bBxIQev2C6XwMuDzdMMx50eIvWFwBZix8kR7dxXAOy48tjWJTS5ucJ3e_DlnVD88CRcA10GYnX7VfIBkJMs52UWQZez/s1600/2015-11-14_234808.png" /></a></div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8168527999844809796.post-38112578174269233862015-10-02T14:45:00.000+08:002015-10-02T15:30:34.430+08:00[筆記]讓新版EF6的Skip、Take語法支援SQL Server 2008最近在寫一個簡單MVC專案,有用到分頁,在本機測試時,分頁一切正常,但是發佈到遠端Server時,竟然出現底下錯誤:「<b><span style="color: #660000; font-size: large;">接近 OFFSET 之處的語法不正確。FETCH 陳述式中的選項 NEXT 使用方式無效</span></b>」<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtZJaaZCiX4uEzt7QBGaIOtoSCvHV8RZRyx1E9KXA3It4pEbmRCX5Dkh_vRo6es_Vr0llvzwK2y1rSFwGDY6-a6mp_wehYG9RHVqbr_IW9HhYIaFzNdowKPubmT48EYcV-ci87hyGC3tbw/s1600/2015-10-02_141924.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtZJaaZCiX4uEzt7QBGaIOtoSCvHV8RZRyx1E9KXA3It4pEbmRCX5Dkh_vRo6es_Vr0llvzwK2y1rSFwGDY6-a6mp_wehYG9RHVqbr_IW9HhYIaFzNdowKPubmT48EYcV-ci87hyGC3tbw/s1600/2015-10-02_141924.png" /></a></div>
<br />
<br />
覺得奇怪,到底花生省魔術?<br />
<br />
<a name='more'></a><br />
原本以為是PageList套件的問題,後來單純地用Skip與Take函數也是不行!因為錯誤訊息沒列出產生的SQL,所以用SQL Profiler查了一下跑出來的語法如下:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz6BV4FonrDeXqOv2d5gQwhmVt_NILcp1BciIWh0k7cgAik60oPvUwgHyjFC57ZHK12F9eaSE5BNBKkvyKHnV8zoV2bpmIn1TG3wGg_W-oP15P2VDSE73x0BPSSdFRmHiIR0_dVXpGncfw/s1600/2015-10-02_142258.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz6BV4FonrDeXqOv2d5gQwhmVt_NILcp1BciIWh0k7cgAik60oPvUwgHyjFC57ZHK12F9eaSE5BNBKkvyKHnV8zoV2bpmIn1TG3wGg_W-oP15P2VDSE73x0BPSSdFRmHiIR0_dVXpGncfw/s1600/2015-10-02_142258.png" /></a></div>
<br />
重點就是在紅框的語法,OFFSET指令是從2012版之後才加入的,本機開發使用的localDB,是2014版本,所以在本機測試執行沒問題。但遠端主機的SQL Server是2008 R2,不支援OFFSET語法(可看到OFFSET是黑色,並非藍色關鍵字),難怪會報錯囉!<br />
<br />
所以只要把EF的SQL Server版本調成2008就可以了!我們如果用DB First或是Model First,應該都會產生EDMX檔案,但直接點兩下會是以圖形方式顯示,所以我們在edmx檔按右鍵,選擇「開啟方式...」<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRxXU9w8DnuRQYTkcd-jJr7N3f6fx3IkJjL7-qjiXqjrr4VFL02PNyegHKlrTy4AQ2y0Ok-AuQtwmMYKxakU1wg72vkwnHSW38qvytkx13DuIEl5NfZmld_x_INBfrwkZJw0b26ckpNLzH/s1600/2015-10-02_142932.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRxXU9w8DnuRQYTkcd-jJr7N3f6fx3IkJjL7-qjiXqjrr4VFL02PNyegHKlrTy4AQ2y0Ok-AuQtwmMYKxakU1wg72vkwnHSW38qvytkx13DuIEl5NfZmld_x_INBfrwkZJw0b26ckpNLzH/s1600/2015-10-02_142932.png" /></a></div>
<br />
然後選擇「XML(文字)編輯器」,即可以文字方式開啟這個檔案。<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGNdjGzfKeZ9Z2WTw1orIo6_WKgvrjMvX5yq6LOQXYg0lPFJ2G3tZcWzrVWRHA-kvA8fl0wn7N-o5cGux1o3lq9i0HLhZT7yZ6UpPJme6Ebhclf19PyfUGwbhw2ceJGxm4m9mvST6ZUwdm/s1600/2015-10-02_153002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGNdjGzfKeZ9Z2WTw1orIo6_WKgvrjMvX5yq6LOQXYg0lPFJ2G3tZcWzrVWRHA-kvA8fl0wn7N-o5cGux1o3lq9i0HLhZT7yZ6UpPJme6Ebhclf19PyfUGwbhw2ceJGxm4m9mvST6ZUwdm/s1600/2015-10-02_153002.png" /></a></div>
<br />
<br />
在檔案中找到「<b>ProviderManifestToken</b>」這個屬性,可看到預設值是2012,我們把它改成2008,然後存檔,這樣執行就沒問題囉!<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgi3OE0XY6FBPMprES__EwRGS_n95qljbLPLNn8gMIljOivE9HM7MV1SIHHL4FwZYf2NMampJYHcP1bHjntIMeJugXS5F3vsQMSiwphKLIowNUxfrLG_-Jz_BrEh6gtVGp-l_zCB83LOHOv/s1600/2015-10-02_143538.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgi3OE0XY6FBPMprES__EwRGS_n95qljbLPLNn8gMIljOivE9HM7MV1SIHHL4FwZYf2NMampJYHcP1bHjntIMeJugXS5F3vsQMSiwphKLIowNUxfrLG_-Jz_BrEh6gtVGp-l_zCB83LOHOv/s1600/2015-10-02_143538.png" /></a></div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8168527999844809796.post-19208119953869176862015-07-07T21:24:00.001+08:002015-07-07T21:24:32.008+08:00[筆記]如何以自訂XML的方式對其他XML做驗證最近的專案內有個需求,對方會傳來一組XML,而我們必須針對不同的狀況來對這組XML做驗證,判斷Tag是否都符合所需;而不同的狀況所需要的Tag是不相同的,所以必須在資料庫內紀錄每個狀況所需要的XML Tag。<br />
<br />
其實重點就是,我們如何用特定的XML(以A來簡稱),去驗證其他XML(以B來簡稱),看看B是否符合A的規則?<br />
<br />
<a name='more'></a><br />
<br />
其實直接設定XSD是比較好的,因為可以直接拿來驗證XML是否符合XSD的規則,但XSD又臭又長又難寫,要開一組新規則還要研究XSD怎麼寫實在太麻煩了,所以規則採用XML來記錄,然後把規則XML轉乘XSD就好。<br />
<br />
例如我們有一組規則,必須符合底下的XML才算通過:<br />
<pre><Root><nodeA></nodeA><nodeB></nodeB></Root></pre>
<br />
我們就只要設定上面的XML規則,然後利用底下的程式碼將規則轉成XSD,就可以對對方傳來的XML做驗證了:<br />
<br />
<pre class="lang-cs">using System.Xml.Linq;
using System.Xml.Schema;
using System.Xml;
using System.IO;
public bool ValidateXml(string template, string xml) {
XDocument t = XDocument.Parse(template); //樣板Xml的XDocument物件
XDocument x = XDocument.Parse(xml); //對方傳來Xml的XDocument物件
//底下可產生樣板XML的XSD
XmlReader reader = XmlReader.Create(new StringReader(t.Root.ToString()));
XmlSchemaSet schemaSet = new XmlSchemaSet();
XmlSchemaInference schema = new XmlSchemaInference();
schemaSet = schema.InferSchema(reader);
bool result = true;
//使用XDocument裡的Validate擴充方法,將XSD傳入做驗證
x.Validate(schemaSet, (sender, e) => {
result = false; //如果驗證失敗才會進來的區塊,可自訂處理動作,這裡僅將結果設為false
});
return result;
}</pre>
<br />
如此只要把樣板XML與傳來的XML丟到這個function就可以囉~Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8168527999844809796.post-71621086193066873632015-01-14T13:20:00.001+08:002021-01-14T20:02:33.324+08:00.Net委派(delegate)的簡易解說與用法<script async="" src="//js1.bloggerads.net/p_imprscript.aspx?bid=20140410000009&pid=6310&ppid=1"></script><br />
.net程式寫久了,常會看到委派(delegate),但這個名稱實在有點玄,MSDN的解說也讓人百思不解,中文字都看得懂,但兜在一起就變成天書了...網路上搜尋到的解說也都太複雜,範例也用不切實際的例子來當解說,讓人更不了解。直到最近自己寫的一個專案,不得不用到委派,所以自己詳細的研究了一下,總算是了解了一些端倪,就筆記一下,希望能對委派苦手有些幫助。(因為是我自己的了解,所以有不完善或有錯誤請包涵)<br />
<br />
<span style="color: red; font-size: large;"><b>委派最常見的用處,就是將我們自己的function當成參數,傳到另一個function來跑。</b></span><br />
<br />
<a name='more'></a><br />
<br />
通常我們的function,傳的參數不外乎是物件,像string、int,或我們自己撰寫的類別實體。但某些時候,在function內需要動態的透過其他function來完成完全不一樣的事情,我們可以有兩種寫法:在function內用一堆if判斷,透過識別參數在不同的if區塊完成各自的動作;另一則是利用委派,所有功能放在同一function內,而獨立處理的功能則當成參數傳遞進去。<br />
<br />
一的好處是程式好寫,但缺點就是當各自要做的事很複雜時,程式碼會變得太長;而要增加新功能時,又要再多很多if,久了就很難維護。<br />
<br />
而利用委派的方式則解決上面的問題,因為不同功能有各自存在的地方,共同部分完全不用變,所以要維護就變得很簡單。<br />
<br />
好了,簡單概念講完,不免俗的馬上來個範例。這裡不討論C#不同版本對於委派不同做法的差異,免得一堆版本一堆程式碼看得頭昏眼花,只會說明什麼時候可以用委派,概念知道了再去深入了解不同版本的做法比較好。<br />
<br />
想像情境,有人來跟你借錢,我們一定會看對象再決定要不要借,而決定要借的話,又會依對象會有不同反應及動作,及最後決定借多少錢。這個情境就來當成我們的示範範例:<br />
<br />
<ol>
<li>正妹跟你借30萬</li>
<li>死黨跟你借100</li>
<li>魯蛇跟你借10塊錢</li>
</ol>
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc3jYsKhqdF1p2afZdq1UF6ac63iotRggkYuqeXZi4OQCNbRhx27c_OtqiUsNbzRAacJl7JLs7GHoVhwF-PnWuD6dNh3SAtvwhFtgBxZ1pKEXgeUE2ulcRVjkfPHVZ2kxZaf9ITHJwYqJz/s1600/2015-01-14_185116.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc3jYsKhqdF1p2afZdq1UF6ac63iotRggkYuqeXZi4OQCNbRhx27c_OtqiUsNbzRAacJl7JLs7GHoVhwF-PnWuD6dNh3SAtvwhFtgBxZ1pKEXgeUE2ulcRVjkfPHVZ2kxZaf9ITHJwYqJz/s1600/2015-01-14_185116.png" /></a></div>
<br />
<br />
我們先來寫個借錢的動作,裡面就是決定借或不借,要借多少錢,以及借之前的動作:<br />
<pre>/// <summary>
/// 借錢動作
/// </summary>
private void LendAction(string amount) {
txtResult.Text = string.Empty;
//決定要借出的金額
string finalAmount;
string commonRes;
if (!string.IsNullOrEmpty(finalAmount)) { //如果金額不是空白就要借出錢
commonRes = string.Format("借出{0}元", finalAmount);
}
else {
commonRes = "掉頭就走";
}
txtResult.Text += commonRes;
}
</pre>
<br />
這樣每個人借錢的事件就可以通用這個借錢動作:
<br />
<pre>/// <summary>
/// 正妹來借錢了
/// </summary>
private void btnGirl_Click(object sender, EventArgs e) {
LendAction("30萬");
}
/// <summary>
/// 死黨來借錢了
/// </summary>
private void btnFriend_Click(object sender, EventArgs e) {
LendAction("100");
}
/// <summary>
/// 魯蛇來借錢了
/// </summary>
private void btnLoser_Click(object sender, EventArgs e) {
LendAction("10");
}
</pre>
<br />
看到這裡,會有個疑問,那怎麼決定要借多少錢,以及借錢之前的動作呢?(也就是finalAmount的值從哪來)<br />
<br />
我們可以在這個借錢動作裡寫一堆if來判斷並執行自訂動作,但萬一動作非常的多,那整個function會變得非常的長,日後如果有再多新對象,會非常不好維護。<br />
<br />
換個思維,如果我們針對不同對象,有各自獨立的執行自訂動作與判斷金額的function,交由他們來判斷並執行自訂動作就好了呀!<br />
<br />
決定之後,我們就來撰寫針對不同對象的動作,輸入參數是金額,回傳參數也是金額(為了好示範所以都用string):<br />
<pre>/// <summary>
/// 借錢給正妹的自訂動作
/// </summary>
/// <param name="amount">跟你借的金額</param>
/// <returns>決定借出的金額</returns>
private string LendToGirl(string amount) {
//自訂動作:跟正妹狂聊,最後決定借五百萬
var res =
@"詢問正妹:真的只要借{0}嗎?夠不夠啊?
詢問正妹:要幫妳買點數卡嗎?
詢問正妹:可以加妳的Line嗎?
詢問正妹:妳幾歲呀?
詢問正妹:妳住哪?
詢問正妹:妳有男朋友嗎?
詢問正妹:妳三圍多少?
詢問正妹:禮拜六有空嗎?
...
.....
....
哇!服務這麼好喔!
....
.....
GGInInDer
OK~{1}沒問題!
....
...去提款機領{1}元
";
var finalAmount = "五百萬";
txtResult.Text = string.Format(res, amount, finalAmount);
//回傳最後決定的金額
return finalAmount;
}
/// <summary>
/// 借錢給死檔的自訂動作
/// </summary>
/// <param name="amount"></param>
/// <returns></returns>
private string LendToFriend(string amount) {
//自訂動作:馬上就決定
var res =
@"幹...
(錢包掏出{0}元)
";
txtResult.Text = string.Format(res, amount);
return amount;
}
/// <summary>
/// 借錢給魯蛇的自訂動作
/// </summary>
/// <param name="amount"></param>
/// <returns></returns>
private string LendToLoser(string amount) {
//自訂動作:什麼都不做
return string.Empty;
}
</pre>
<br />
<br />
寫好之後我們就可以把這些自訂動作(function)當作參數傳給主要借錢動作,讓他去判斷並執行,這樣我們就不用傷腦筋了。<br />
<br />
要怎麼做呢?委派就來囉!<br />
<br />
首先要定義好委派,不用想的太複雜,就當成定義介面一樣,委派也是規定這個實體的回傳型態、要傳入哪些參數,只是把interface關鍵字換成delegate:
<br />
<pre>delegate string CustomAction(string amount);</pre>
<br />
好了之後就可以產生他的參考:
<br />
<pre>CustomAction customAction;</pre>
<br />
接著修改原有的借錢動作,加入一個東西讓她幫助我們執行不同的判斷:
<br />
<pre>/// <summary>
/// 借錢動作
/// </summary>
/// <param name="amount"></param>
/// <param name="customAct"></param>
private void LendAction(string amount, <span class="pre-highborder">CustomAction customAct</span>) {
txtResult.Text = string.Empty;
//決定要借出的金額
string finalAmount;
//我們不需要知道這個customAct到底是什麼
//反正他跑完會回傳一個我們要的東西就對了
//在這裡回傳的就是最終借出金額
<span class="pre-highborder">finalAmount = customAct(amount);</span>
string commonRes;
if (!string.IsNullOrEmpty(finalAmount)) {
commonRes = string.Format("借出{0}元", finalAmount);
}
else {
commonRes = "掉頭就走";
}
txtResult.Text += commonRes;
}
</pre>
<br />
<br />
最後,我們要決定該傳入哪個判斷進去。回到不同人不同的處理方法中去指定:
<br />
<pre>/// <summary>
/// 正妹來借錢了
/// </summary>
private void btnGirl_Click(object sender, EventArgs e) {
//只要是符合委派格式的function,就可以指定給他
customAction = <span class="pre-highborder">LendToGirl;</span>
LendAction("30萬", customAction);
}
/// <summary>
/// 死黨來借錢了
/// </summary>
private void btnFriend_Click(object sender, EventArgs e) {
customAction = <span class="pre-highborder">LendToFriend;</span>
LendAction("100", customAction);
}
/// <summary>
/// 魯蛇來借錢了
/// </summary>
private void btnLoser_Click(object sender, EventArgs e) {
customAction = <span class="pre-highborder">LendToLoser;</span>
LendAction("10", customAction);
}
</pre>
<br />
<br />
可以這樣就完成我們想要的動作了。看看結果:<br />
魯蛇借錢囉:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCA1z4zZY-BuqRXzyOxu6SfiOcKjCriDcQYoQhV6-ZD0s4KKIJ4HjQ4qybQAA2vuBI_8jXJHgio-amhUUCROGEpxVuDh0XdWkfnmAQeJ0ugvK9muUdAtPkb-Xjud5nrMKXFiXJg3hZBmu_/s1600/2015-01-14_192720.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCA1z4zZY-BuqRXzyOxu6SfiOcKjCriDcQYoQhV6-ZD0s4KKIJ4HjQ4qybQAA2vuBI_8jXJHgio-amhUUCROGEpxVuDh0XdWkfnmAQeJ0ugvK9muUdAtPkb-Xjud5nrMKXFiXJg3hZBmu_/s1600/2015-01-14_192720.png" width="253" /></a></div>
<br />
死黨借錢囉:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj72ozZA9UBxpt4rwZL62TL4Cg51bY9XeNYTnf3Covi5e35C9Wvkr5wdVWXoFc_FG69d1djbvmxnfPqOcdN-RrVL4-yjdC1jwIDZo0utql8KwZbiCFUx13cMWQkduh1dPnncQWTJ90IruEe/s1600/2015-01-14_192728.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj72ozZA9UBxpt4rwZL62TL4Cg51bY9XeNYTnf3Covi5e35C9Wvkr5wdVWXoFc_FG69d1djbvmxnfPqOcdN-RrVL4-yjdC1jwIDZo0utql8KwZbiCFUx13cMWQkduh1dPnncQWTJ90IruEe/s1600/2015-01-14_192728.png" width="253" /></a></div>
<br />
正妹借錢囉:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmssspWkHLyP0pJYf-Q1iqwsa325LCKqbsw9P-qaBpiePRsUUluH4Z6ja2y7lQpqx8DDKQkEKrKs6utzg695ZhzK8wgHtUsaW1XCswzhDD9MjjwRIj7Jz1D6WnZJJy9xoSBGzWbv01r28e/s1600/2015-01-14_192741.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmssspWkHLyP0pJYf-Q1iqwsa325LCKqbsw9P-qaBpiePRsUUluH4Z6ja2y7lQpqx8DDKQkEKrKs6utzg695ZhzK8wgHtUsaW1XCswzhDD9MjjwRIj7Jz1D6WnZJJy9xoSBGzWbv01r28e/s1600/2015-01-14_192741.png" width="253" /></a></div>
<br />
<br />
使用委派處理這類型的問題好處多多,哪怕改天又多出了老闆、老師、老婆、老公、老爸老媽老哥老姊老弟老妹跟你借錢,<b><span style="color: red;">主功能LendAction()程式碼包含參數完全不用動</span></b>,只要在各個事件中將處理function及委派參考設定好就可以了,簡單好維護!!<br />
<br />
完整的程式碼:
<br />
<pre>public partial class Form1 : Form
{
/// <summary>
/// 定義一個自訂借錢動作的委派(想像成是定義一個介面,規定參數及回傳型態就對了)
/// </summary>
/// <param name="amount"></param>
/// <returns></returns>
delegate string CustomAction(string amount);
/// <summary>
/// 產生委派的參考
/// </summary>
CustomAction customAction;
public Form1() {
InitializeComponent();
}
/// <summary>
/// 正妹來借錢了
/// </summary>
private void btnGirl_Click(object sender, EventArgs e) {
//只要是符合委派格式的function,就可以指定給他
customAction = LendToGirl;
LendAction("30萬", customAction);
}
/// <summary>
/// 死黨來借錢了
/// </summary>
private void btnFriend_Click(object sender, EventArgs e) {
customAction = LendToFriend;
LendAction("100", customAction);
}
/// <summary>
/// 魯蛇來借錢了
/// </summary>
private void btnLoser_Click(object sender, EventArgs e) {
customAction = LendToLoser;
LendAction("10", customAction);
}
/// <summary>
/// 借錢動作
/// </summary>
/// <param name="amount"></param>
/// <param name="customAct"></param>
private void LendAction(string amount, CustomAction customAct) {
txtResult.Text = string.Empty;
//決定要借出的金額
string finalAmount;
//我們不需要知道這個customAct到底是什麼
//反正他跑完會回傳一個我們要的東西就對了
//在這裡回傳的就是最終借出金額
finalAmount = customAct(amount);
string commonRes;
if (!string.IsNullOrEmpty(finalAmount)) {
commonRes = string.Format("借出{0}元", finalAmount);
}
else {
commonRes = "掉頭就走";
}
txtResult.Text += commonRes;
}
/// <summary>
/// 借錢給正妹的自訂動作
/// </summary>
/// <param name="amount"></param>
/// <returns></returns>
private string LendToGirl(string amount) {
//自訂動作:跟正妹狂聊,最後決定借五百萬
var res =
@"詢問正妹:真的只要借{0}嗎?夠不夠啊?
詢問正妹:要幫妳買點數卡嗎?
詢問正妹:可以加妳的Line嗎?
詢問正妹:妳幾歲呀?
詢問正妹:妳住哪?
詢問正妹:妳有男朋友嗎?
詢問正妹:妳三圍多少?
詢問正妹:禮拜六有空嗎?
...
.....
....
哇!服務這麼好喔!
....
.....
GGInInDer
OK~{1}沒問題!
....
...去提款機領{1}元
";
var finalAmount = "五百萬";
txtResult.Text = string.Format(res, amount, finalAmount);
//回傳最後決定的金額
return finalAmount;
}
/// <summary>
/// 借錢給死檔的自訂動作
/// </summary>
/// <param name="amount"></param>
/// <returns></returns>
private string LendToFriend(string amount) {
//自訂動作:馬上就決定
var res =
@"幹...
(錢包掏出{0}元)
";
txtResult.Text = string.Format(res, amount);
return amount;
}
/// <summary>
/// 借錢給魯蛇的自訂動作
/// </summary>
/// <param name="amount"></param>
/// <returns></returns>
private string LendToLoser(string amount) {
//自訂動作:什麼都不做
return string.Empty;
}
}
</pre>
<br />
<br />
完整VS專案也可以在<a href="https://mega.co.nz/#!TcUTFb5L!5fz_hMQCiUifDerrn3Yh-javrTZS0EHCZX-k2n1UpoI" target="_blank">這裡</a>下載。<br />
<br />
<br />
當然這只是委派其中之一的使用時機,或許我的例子還是舉的不太好,但實際動手做過就會知道大概的原理,了解之後程式的寫法就會有更大的彈性!!<br />
<br />
--<br />
<span style="font-size: large;">補充:</span><br />
<br />
同事看到這個例子來跟我討論,由於事件數量過小,而且所有function全在同一個class,有可能看不出優點在哪。<br />
<br />
但想像一下,假設今天來借錢的人有1000個,那主function的if數量會多到驚人!而改用委派的話,我們可以將事件和自訂處理放在同一個class內,這樣的架構就變成如下:<br />
<br />
class 正妹<br />
<br />
<ul>
<li>正妹借錢事件</li>
<li>正妹借錢自訂動作</li>
</ul>
class 魯蛇<br />
<br />
<ul>
<li>魯蛇借錢事件</li>
<li>魯蛇借錢自訂動作</li>
</ul>
...<br />
.....<br />
class 千人斬<br />
<br />
<ul>
<li>千人斬借錢事件</li>
<li>千人斬借錢自訂動作</li>
</ul>
<br />
<br />
而主動作function還是完全不用動,要新增新對象,只要新增class即可;要修改某對象的動作,也只要前往該對象的class內即可輕鬆修改,程式的可讀性更是大大增加。<br />
<br />
--<br />
<br />
p.s. 會用到委派是因為最近自己寫的讀取EXIF專案,為了處理不同區塊卻有相同名稱的元素的實際值而使用的。<br />
<br />
例如區塊A、B、C都有某個叫Z的元素,裡面存放的值不同,但存取方法相同;不過有的值可能需要特殊處理,而區塊未來可能還有D、E、F...更多。<br />
<br />
所以我把存取值寫成獨立function(F1),判斷不同區塊需特殊處理的元素即用委派當成參數帶入,如此不同區塊物件在存取Z值的時候全部都可用F1,且F1完全不用動,只要各個物件寫好自己處理特殊元素的function(FF1~FFn),再帶入F1,F1即可處理共通值,或自動呼叫FFx處理特殊值。<br />
<br />
在未來簡介EXIF的時候有機會會寫到這個例子。不知道有沒有人會看,但還是敬請期待XD<br />
<br />
參考資料: <a href="https://docs.microsoft.com/zh-tw/dotnet/csharp/programming-guide/delegates/" target="_blank">MSDN delegate (C# 參考)</a>
<br /><br />
Unknownnoreply@blogger.com26tag:blogger.com,1999:blog-8168527999844809796.post-27298955263438118402014-11-24T14:09:00.000+08:002014-11-27T13:11:17.542+08:00ASP.NET MVC - 如何讓Form參數內的XML字串綁定到Model最近在學習MVC,目前有個需求,需要使用者將Form Post到某個Action內,裡面的參數還會有xml文字,整個參數會像底下一樣:<br />
<pre>A=123&B=abc&C=<Root><A>123</A><B>abc</B><C>kkk</C><D>iii</D></Root></pre>
<br />
其中A與B是普通字串,而C是XML字串<br />
<br />
在Visual Studio 2013裡有個好用的功能,可以將XML或JSON字串轉成Class,只要使用選擇性貼上即可。底下就是寫好的一個使用者參數的Model:<br />
<pre>public class SendModel
{
[Required(AllowEmptyStrings = false, ErrorMessage = "{0}不可為空")]
[StringLength(3, MinimumLength = 3, ErrorMessage = "{0}長度必須為{2}")]
public string A { get; set; }
[Required(AllowEmptyStrings = false, ErrorMessage = "{0}不可為空")]
[StringLength(3, MinimumLength = 3, ErrorMessage = "{0}長度必須為{2}")]
public string B { get; set; }
[Required(AllowEmptyStrings = false, ErrorMessage="xml不可為空,請檢查格式是否正確")]
public SendXmlModel C { get; set; }
//這個類別就是將XML貼上之後所產生的,格式相同就可序列化成字串或反序列化回該類別的物件
[Serializable]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute("Root", Namespace = "", IsNullable = false)]
public partial class SendXmlModel {
public string A { get; set; }
public string B { get; set; }
public string C { get; set; }
public string D { get; set; }
}
}</pre>
<br />
<br />
<a name='more'></a>其中SendXmlModel就是我們將XML以選擇性貼上之後,Visual Studio自動幫我們產生的Class。<br />
<br />
接下來我們產生新的Controller,裡面有個自訂的Action:<br />
<pre>[HttpPost]
[ValidateInput(false)]
public ActionResult Test(SendModel model)
{
if (!ModelState.IsValid) {
return Content("error");
}
return Content("aaa");
}</pre>
<br />
設定好之後,我們就將指定好的參數發送到這個Action裡面,它會自動為我們將參數綁定到指定好的Model裡面,而C只要XML格式對,我想應該會自動轉成XendXmlModel的物件才是。<br />
但結果會是顯示error!參數也都對啊,但為什麼還是會報錯呢?<br />
<br />
仔細看錯誤訊息:<br />
<br />
A與B都有正確綁定到Model內,但C是null...<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9BblJHPSrRh4bF2AlBs-RXiDov4hM9z0dDLlHzPRnuEk4ANDFaYvo7S6C_E069vBjSz0PSS2Fd5sdtOs7RRf6KsvKnsI6Hvuvxwa9Hm8aNiPmf8ZA6Pm1Pvm8XI82R91jhqLeZrghTl3Z/s1600/2014-11-24_125041.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9BblJHPSrRh4bF2AlBs-RXiDov4hM9z0dDLlHzPRnuEk4ANDFaYvo7S6C_E069vBjSz0PSS2Fd5sdtOs7RRf6KsvKnsI6Hvuvxwa9Hm8aNiPmf8ZA6Pm1Pvm8XI82R91jhqLeZrghTl3Z/s1600/2014-11-24_125041.png" height="395" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
再看,有回報錯誤訊息「從型別System.String到型別SendXmlModel的參數轉換失敗,因為沒有型別轉換器可以在這些型別之間轉換」<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHtlf0k05Lpc7eWUMJwWvqOjWZYhkWclQyGT3o4t5xVVFmM1oovkdswQDrGVOR5BF5R7H35gGYQAYSPl5MWyotZSSTJ1HaEQACWmeWgp5IiZmFg4UHTRXSUKk9Vb0LBlPoq3nSQhERqGpJ/s1600/2014-11-24_125136.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHtlf0k05Lpc7eWUMJwWvqOjWZYhkWclQyGT3o4t5xVVFmM1oovkdswQDrGVOR5BF5R7H35gGYQAYSPl5MWyotZSSTJ1HaEQACWmeWgp5IiZmFg4UHTRXSUKk9Vb0LBlPoq3nSQhERqGpJ/s1600/2014-11-24_125136.png" /></a></div>
<br />
<br />
看來是因為我們的Model裡面,C是屬於自訂的Class,預設的模型綁定沒辦法處理...問題應該就是在那個「<b>型別轉換器</b>」上了!<br />
<br />
為了這個問題我找了好幾天,網路上很難找到有類似的案例,後來終於查到,要自訂一個型別轉換器,也就是新的ValueProvider讓程式知道這個參數的型別才行(也就是錯誤訊息裡說的型別轉換器)。<br />
<br />
所以我們來寫一個自訂的ValueProviderFactory,繼承ValueProviderFactory:<br />
<pre>using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace WebApplication3.Provider
{
public class MyValueProviderFactory : ValueProviderFactory
{
public override IValueProvider GetValueProvider(ControllerContext controllerContext) {
}
}
}</pre>
<br />
接著再新增自訂ValueProvider,繼承IValueProvider介面:<br />
<pre>public class StringToXmlValueProvider : IValueProvider
{
private HttpContextBase httpContext;
public StringToXmlValueProvider(HttpContextBase httpContext) {
this.httpContext = httpContext;
}
public bool ContainsPrefix(string prefix) {
return prefix.Contains("C"); //指定如果參數名稱是C,則回傳true
}
public ValueProviderResult GetValue(string key) {
if (!ContainsPrefix(key)) { return null; } //參數如果是C,則進行底下轉換
string _xml = httpContext.Request[key];
SendXmlModel xml;
try {
xml = SerializeTool.XmlDeserialize<SendXmlModel>(_xml);
}
catch { xml = null; }
return new ValueProviderResult(xml, _xml, System.Globalization.CultureInfo.CurrentCulture);
}
}
</pre>
<br />
將兩個整合:<br />
<pre>public class MyValueProviderFactory : ValueProviderFactory
{
public override IValueProvider GetValueProvider(ControllerContext controllerContext) {
return new StringToXmlValueProvider(controllerContext.HttpContext);
}
public class StringToXmlValueProvider : IValueProvider
{
private HttpContextBase httpContext;
public StringToXmlValueProvider(HttpContextBase httpContext) {
this.httpContext = httpContext;
}
public bool ContainsPrefix(string prefix) {
return prefix.Contains("C"); //指定如果參數名稱是C,則回傳true
}
public ValueProviderResult GetValue(string key) {
if (!ContainsPrefix(key)) { return null; } //參數如果是C,則進行底下轉換
string _xml = httpContext.Request[key];
SendXmlModel xml;
try {
xml = SerializeTool.XmlDeserialize<SendXmlModel>(_xml); //這裡使用一個泛型的XML序列化與反序列化工具,程式碼最後會補上
}
catch { xml = null; }
return new ValueProviderResult(xml, _xml, System.Globalization.CultureInfo.CurrentCulture);
}
}
}
</pre>
<br />
最後將MyValueProviderFactory註冊到Global.asax的Application_Start()內,使用插入的方式,讓自訂的ValueProviderFactory可以優先被搜尋到:<br />
<pre> public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
ValueProviderFactories.Factories.Insert(0, new MyValueProviderFactory());
}
}
</pre>
<br />
再跑一下,可看到已經正常綁定了:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiD_QC44IDd7doOCYttkLbKN59KUuWoFCs0dso0PhOAyqcuF7KRbhlRVXnLZySOIVMo1_sPHJf3k8kBFHD84yufFrHNP2IKe2jTHMS4vWjtN2vdYWEG0LRmZsc5knNhGhl4VperE2Je1UGO/s1600/2014-11-24_132555.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiD_QC44IDd7doOCYttkLbKN59KUuWoFCs0dso0PhOAyqcuF7KRbhlRVXnLZySOIVMo1_sPHJf3k8kBFHD84yufFrHNP2IKe2jTHMS4vWjtN2vdYWEG0LRmZsc5knNhGhl4VperE2Je1UGO/s1600/2014-11-24_132555.png" height="539" width="640" /></a></div>
<br />
<br />
這樣就正常囉!!但要注意的是,我們在自訂的ValueProvider裡面,只有判斷參數名稱是「C」的時候,才要進行轉換,所以如果有這需求的話,參數名稱要注意一下使用相同名稱。<br />
<br />
<br />
事情到這邊,基本綁定就OK了,但我還有另一個特殊需求,必須檢查A和B參數的值,是否和C XML裡面的A與B參數是否相同,在Model裡面使用Compare驗證是沒有辦法的,所以我們必須再寫個自訂的模型綁定才行...<br />
<br />
新增一個自訂類別MyBinder,繼承DefaultModelBinder:<br />
<pre>public class MyBinder : DefaultModelBinder
{
}
</pre>
<br />
再來覆寫原有的BindModel方法,這裡判斷如果Model類型是我們自訂的SendModel,才要做處理,否則回傳預設的BindModel:<br />
<pre>public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {
if (bindingContext.ModelType == typeof(SendModel)) {
}
else {
return base.BindModel(controllerContext, bindingContext);
}
}
</pre>
<br />
完成後的完整程式:<br />
<pre>public class MyBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {
if (bindingContext.ModelType == typeof(SendModel)) {
//取得參數
var request = controllerContext.HttpContext.Request;
var reqA = request["A"];
var reqB = request["B"];
var _reqC = request["C"];
SendXmlModel reqC;
try {
reqC = SerializeTool.XmlDeserialize<SendXmlModel>(_reqC);
}
catch {
reqC = null;
}
//建立新的ModelBindingContext
ModelBindingContext NewBindingContext = new ModelBindingContext() {
ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(
() =&gt; new SendModel() {
A = reqA,
B = reqB,
C = reqC
},
typeof(SendModel)),
ModelState = bindingContext.ModelState,
ValueProvider = bindingContext.ValueProvider
};
//加入自訂的模型驗證與ModelState錯誤訊息
if (reqC != null) {
if (reqA != reqC.A) {
NewBindingContext.ModelState.AddModelError("A", "參數A必須與XML內的A相符");
}
if (reqB != reqC.B) {
NewBindingContext.ModelState.AddModelError("B", "參數B必須與XML內的B相符");
}
}
//回傳BindModel
return base.BindModel(controllerContext, NewBindingContext);
}
else {
return base.BindModel(controllerContext, bindingContext);
}
}
}
</pre>
<br />
完成後一樣要在Global.asax註冊:<br />
<pre>protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
ValueProviderFactories.Factories.Insert(0, new MyValueProviderFactory());
ModelBinders.Binders.Add(typeof(SendModel), new MyBinder());
}
</pre>
<br />
接著在Action裡面,也要用我們指定的綁定模型才行:<br />
<pre>[HttpPost]
[ValidateInput(false)]
public ActionResult Test([ModelBinder(typeof(MyBinder))] SendModel model)
{
if (!ModelState.IsValid) {
return Content("error");
}
return Content("aaa");
}
</pre>
<br />
<br />
來試試看,假設A參數與XML內的A不同的話,ModelState會回報驗證不通過:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOWXV9_BtwnCc_ZtwHAKSeYF1sjNNKMnc0mECgBscD2RuAm-gTMHQ26iQjD9yCyzaXo3xQtFr64uQSZOfnM1LFo1jB4A1hrMABulQ8l_D8Bct08YdgfZLhSCjJ1Ls9Q8c6nOyiNgeolZ2R/s1600/2014-11-24_135544.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOWXV9_BtwnCc_ZtwHAKSeYF1sjNNKMnc0mECgBscD2RuAm-gTMHQ26iQjD9yCyzaXo3xQtFr64uQSZOfnM1LFo1jB4A1hrMABulQ8l_D8Bct08YdgfZLhSCjJ1Ls9Q8c6nOyiNgeolZ2R/s1600/2014-11-24_135544.png" height="640" width="614" /></a></div>
<br />
<br />
這樣就完成我們的要求了。<br />
<br />
<br />
底下是好用的泛型將XML序列化或反序列化工具:<br />
<pre>using System.Xml;
using System.Xml.Serialization;
public class SerializeTool
{
/// <summary>
/// 以UTF-8編碼將XML物件序列化成字串
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value"></param>
/// <returns></returns>
public static string SerializeXml<T>(T value) {
if (value == null) { return null; }
XmlSerializer ser = new XmlSerializer(typeof(T));
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.NamespaceHandling = NamespaceHandling.Default;
settings.Encoding = Encoding.UTF8;
XmlSerializerNamespaces nspace = new XmlSerializerNamespaces();
nspace.Add("", "");
StringBuilder sb = new StringBuilder();
using (XmlWriter xmlWriter = XmlWriter.Create(sb, settings)) {
ser.Serialize(xmlWriter, value, nspace);
}
return sb.ToString();
}
/// <summary>
/// 將XML字串反序列化成指定型別物件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="xml"></param>
/// <returns></returns>
public static T DeserializeXml<T>(string xml) {
if (string.IsNullOrEmpty(xml)) {
return default(T);
}
XmlSerializer ser = new XmlSerializer(typeof(T));
XmlReaderSettings settings = new XmlReaderSettings();
// No settings need modifying here
using (StringReader textReader = new StringReader(xml)) {
using (XmlReader xmlReader = XmlReader.Create(textReader, settings)) {
return (T)ser.Deserialize(xmlReader);
}
}
}
}
</t></pre>
<br />
<br />
參考資料:<br />
<a href="http://stackoverflow.com/questions/5820637/custom-model-binding-model-state-and-data-annotations" target="_blank">http://stackoverflow.com/questions/5820637/custom-model-binding-model-state-and-data-annotations</a><br />
<br />
<a href="http://www.codeproject.com/Articles/605595/ASP-NET-MVC-Custom-Model-Binder" target="_blank">http://www.codeproject.com/Articles/605595/ASP-NET-MVC-Custom-Model-Binder</a><br />
<br />
<a href="http://donovanbrown.com/post/How-to-create-a-custom-Value-Provider-for-MVC.aspx" target="_blank">http://donovanbrown.com/post/How-to-create-a-custom-Value-Provider-for-MVC.aspx</a><br />
<br />
<a href="http://www.dotblogs.com.tw/maev85/archive/2010/09/16/17772.aspx" target="_blank">http://www.dotblogs.com.tw/maev85/archive/2010/09/16/17772.aspx</a><br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8168527999844809796.post-70602817313207376812014-10-06T13:06:00.001+08:002014-10-13T11:28:00.974+08:00雲豹200更換前叉油DIY<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNCHanWX6krtzKCDwB9yp7uHJngHr5ljG4im-abw8y4HRVub7Mr71RNZdqt1PguKMQsozi8NFHj35XwVeEduH5I-rPZ74YSv2ryFVMd2yRFPQMO1tFsTlGZx4dNxdm6Nwzb1zUaZC3WiUu/s1600/2014-09-07+11.15.10.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNCHanWX6krtzKCDwB9yp7uHJngHr5ljG4im-abw8y4HRVub7Mr71RNZdqt1PguKMQsozi8NFHj35XwVeEduH5I-rPZ74YSv2ryFVMd2yRFPQMO1tFsTlGZx4dNxdm6Nwzb1zUaZC3WiUu/s1600/2014-09-07+11.15.10.jpg" height="360" width="640" /></a></div>
<br />
200豹騎了也四萬多公里了,前叉變得很軟,尤其現在每天需要雙載,稍微一個煞車就點頭,台灣的拉力路面也是對避震非常的有挑戰性!(抱怨一下,每天需要走的汐止明峰街,那路面真他媽的爛...)所以興起了換一下前叉油的念頭。<br />
<br />
<a name='more'></a><br />
<br />
爬了文,不下前叉光用抽油的抽不乾淨,最乾淨的換法是整支前叉包含阻尼管全拆開清洗,但沒有氣動工具,固定阻尼棒的六角螺絲是拆不開的,所以選擇折衷作法,下前叉將油倒出,稍作清潔後再灌前叉油。<br />
<br />
好了廢話不多說,開始講解步驟:<br />
<br />
必備工具:22號梅花或套筒扳手(建議都有,才夠力)、12、14、17梅開扳手、6號六角扳手、前叉油、接油盆、量杯<br />
建議工具:一字起、鐵鎚、大量的布、WD-40或恐龍191、兩分半華司數片(增加預載用)<br />
<br />
1. 首先將把手的四顆12號螺絲拆下,將把手掛在大燈或油箱上(記得墊塊布以免刮傷)<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWU5cYyGxiIq9xlZt5oVN1NkSOHPqCMsgtsXLPSqGNzleXTJp_p5wa-JTCxwNMtYoZuIUQuSQ3iiPVO9kNHPvnwXYoGDCX2w6PL5WMD7Y_tZq3DKCi5H5rsqFmptV9wrW2yxrRUZNLVwB0/s1600/2014-10-04+13.56.29.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWU5cYyGxiIq9xlZt5oVN1NkSOHPqCMsgtsXLPSqGNzleXTJp_p5wa-JTCxwNMtYoZuIUQuSQ3iiPVO9kNHPvnwXYoGDCX2w6PL5WMD7Y_tZq3DKCi5H5rsqFmptV9wrW2yxrRUZNLVwB0/s1600/2014-10-04+13.56.29.JPG" height="640" width="360" /></a></div>
<br />
<br />
2. 鬆開上三角台的兩顆14號螺絲<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBCClu19PM3rDtiON7Gvf9hy9IxJasKZxIBAmA__Q173yx3dMGYdli7LGJps3p01IDr1vEOAh5PzmmzqMkTo1nxtA6NNEIE-9TQeA06-jWH7VfqIyFxv7iOUb4UIyZp_CMunWWjFxnTUh6/s1600/2014-10-04+14.00.29.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBCClu19PM3rDtiON7Gvf9hy9IxJasKZxIBAmA__Q173yx3dMGYdli7LGJps3p01IDr1vEOAh5PzmmzqMkTo1nxtA6NNEIE-9TQeA06-jWH7VfqIyFxv7iOUb4UIyZp_CMunWWjFxnTUh6/s1600/2014-10-04+14.00.29.JPG" height="640" width="360" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNAUC1B7XzmtTXIF2PrQacdu_0Pph-r2ILQGNH_aZh1p77PY5sWqnwHAjNYK4OyK9M418XLBy8XIxMNbK782BCD-MzWO9A8vJb3ow8Tmwzj3l9GrVuSbpaaCn2HMUj-r-VsEuGzVrEhvtq/s1600/2014-10-04+14.01.33.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNAUC1B7XzmtTXIF2PrQacdu_0Pph-r2ILQGNH_aZh1p77PY5sWqnwHAjNYK4OyK9M418XLBy8XIxMNbK782BCD-MzWO9A8vJb3ow8Tmwzj3l9GrVuSbpaaCn2HMUj-r-VsEuGzVrEhvtq/s1600/2014-10-04+14.01.33.JPG" height="360" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
3. 使用22號扳手轉開兩個前叉頂蓋,但這裡卡關...有夠緊的!使用梅花扳手不好施力,一個不小心會滑掉,看照片中頂蓋有點磨損就是太用力結果扳手跑掉,推薦使用套筒扳手比較好。花了一個小時打不開,先放棄,準備工具先。</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKsJ2tJJ-uiqcaHAV45vukgA7yNvyCOakak_WIqsk8TCEZPYFDjcqO_ZqtGlj950F5gKuahtRiKznvSAkrbv5hlBEvnPCpljVhtcCsRwgbtTPZNjqcICf-p49ypNyjRBj390rXH4-4pNyU/s1600/2014-10-04+14.24.06.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKsJ2tJJ-uiqcaHAV45vukgA7yNvyCOakak_WIqsk8TCEZPYFDjcqO_ZqtGlj950F5gKuahtRiKznvSAkrbv5hlBEvnPCpljVhtcCsRwgbtTPZNjqcICf-p49ypNyjRBj390rXH4-4pNyU/s1600/2014-10-04+14.24.06.JPG" height="640" width="360" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
4. 立馬去五金行買了四分套筒扳手(22號套筒本來就有,只缺扳手)</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCTbS3H8dGZhqIfkUXSkbmu1GzSiKg-wmy1mHjD0qVBAGAbqJx4Xev2PA7H9cqA0EWZ0qSNugmxkQyBK2Yhv9RY66oGghwZe4b3Cjv1IN36LJs8ywp8rFDOOjXa_XiMlpKjRVNuGFx29_g/s1600/2014-10-04+15.09.19.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCTbS3H8dGZhqIfkUXSkbmu1GzSiKg-wmy1mHjD0qVBAGAbqJx4Xev2PA7H9cqA0EWZ0qSNugmxkQyBK2Yhv9RY66oGghwZe4b3Cjv1IN36LJs8ywp8rFDOOjXa_XiMlpKjRVNuGFx29_g/s1600/2014-10-04+15.09.19.JPG" height="640" width="360" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
5. 再帶老婆小孩殺去牛排店吃飽補充體力XD</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsAm8ZJ_a23fzdYaTF8SdeJiRq1-WTyd6CAB81rWaJ-o73wJf0p0fHNPe9RiMDXN5Sky44E4rLfdXsSnUI2pZqUZ8PZjXsoRgD4vJtm9xeYlxiz7dszwDB_8ViEmakdjSpYjtB01MDzqv6/s1600/2014-10-04+16.52.11.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsAm8ZJ_a23fzdYaTF8SdeJiRq1-WTyd6CAB81rWaJ-o73wJf0p0fHNPe9RiMDXN5Sky44E4rLfdXsSnUI2pZqUZ8PZjXsoRgD4vJtm9xeYlxiz7dszwDB_8ViEmakdjSpYjtB01MDzqv6/s1600/2014-10-04+16.52.11.JPG" height="360" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
6. 好了吃飽喝足,也晚上了,轉戰停車場繼續...</div>
<div class="separator" style="clear: both; text-align: left;">
有了套筒就用套筒來轉開吧,結果還是一樣左開右開打不開...X的哩...</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjmv9jmETSgiqPb5d6CeVycixesG4kM9q03rFs_vyq2rnxwWTme5M9LPXKwDJ03uSvscdbMmbvpMvIkVu-F0Mi7dg9b8-NnM2fohGFY3Wbhc9p7CHqYKVr48Rn8rRNgLsUMLyA96be4T5R/s1600/2014-10-04+19.02.22.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjmv9jmETSgiqPb5d6CeVycixesG4kM9q03rFs_vyq2rnxwWTme5M9LPXKwDJ03uSvscdbMmbvpMvIkVu-F0Mi7dg9b8-NnM2fohGFY3Wbhc9p7CHqYKVr48Rn8rRNgLsUMLyA96be4T5R/s1600/2014-10-04+19.02.22.JPG" height="640" width="360" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
7. 只好拿出鐵槌,上敲敲、左敲敲、右敲敲,再把22梅花扳手套上加長力臂,終於在嘗試了不曉得第幾次之後,啪的一聲,打開了~~灑花~~光開這個蓋子花了我快兩個小時...乾....(加長力臂圖示是回家補拍的)</div>
<div class="separator" style="clear: both; text-align: left;">
<span style="color: red; font-size: large;">注意!前叉頂蓋只要鬆開即可,勿取下!!</span></div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8VRD0k1GchDqFtgy76YgQKAVLSJp_BMKye2oI0TvpSyEwSxJNqjXalSKheds8SUCDa6uyK_paivXRiE9kop4mOSN5Mr1WFoam7y2I2dp0PFEggaFVrdZidsOY1R0Gz1ul-Dd0vH-jzTxP/s1600/2014-10-04+22.52.31.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8VRD0k1GchDqFtgy76YgQKAVLSJp_BMKye2oI0TvpSyEwSxJNqjXalSKheds8SUCDa6uyK_paivXRiE9kop4mOSN5Mr1WFoam7y2I2dp0PFEggaFVrdZidsOY1R0Gz1ul-Dd0vH-jzTxP/s1600/2014-10-04+22.52.31.JPG" height="360" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
8. 最難的部分已經解決了,再來要放鬆下三角台。在鬆下三角台螺絲之前,先看一下喇叭有沒有擋住扳手的施力位置,有的話往後折一點</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh2hQ40XWjSli8yaRJrFrukWBxE_5a1TLDyRCVzYOW1kK7GCK9JPzNUVsVoHc8GxjErbweOmtEGywGBnEAf9Cpv8m87aKPIJw004UmrrOAmOffBA_6xhiSJsuPMcu5Fs8K3fH6buX6qrk5/s1600/2014-10-04+18.55.09.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh2hQ40XWjSli8yaRJrFrukWBxE_5a1TLDyRCVzYOW1kK7GCK9JPzNUVsVoHc8GxjErbweOmtEGywGBnEAf9Cpv8m87aKPIJw004UmrrOAmOffBA_6xhiSJsuPMcu5Fs8K3fH6buX6qrk5/s1600/2014-10-04+18.55.09.JPG" height="640" width="360" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
9. 用17號開口扳手鬆開兩顆下三角台螺絲,一樣放鬆即可。</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_HSEq-sCz-d9Vb47aDz47HYcTMrwLXEkZ5DlmOj3_oGm6HwA9q7XTQX4HvXSkqmFQRN7fb8-bmQLXXxzqhGQiwXomg8x11f0kh_AvElhniwR4yhoIS8YEV5-JRtc_14RvtNFoL7yKwFIy/s1600/2014-10-04+19.10.54.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_HSEq-sCz-d9Vb47aDz47HYcTMrwLXEkZ5DlmOj3_oGm6HwA9q7XTQX4HvXSkqmFQRN7fb8-bmQLXXxzqhGQiwXomg8x11f0kh_AvElhniwR4yhoIS8YEV5-JRtc_14RvtNFoL7yKwFIy/s1600/2014-10-04+19.10.54.JPG" height="640" width="360" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh84II518lbez_qlpNwx-Psl1xxRAck0_p0ZA_ZdnhQFNr4LL7HhJ_1KW7RezwjwnkHx1hMJ5RqNWiqndJBhJRx728khXZe4pbPsXDdtBUaoleDemjEl9rq_nNaGV9hvuClB4uFfkoH5T34/s1600/2014-10-04+19.11.12.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh84II518lbez_qlpNwx-Psl1xxRAck0_p0ZA_ZdnhQFNr4LL7HhJ_1KW7RezwjwnkHx1hMJ5RqNWiqndJBhJRx728khXZe4pbPsXDdtBUaoleDemjEl9rq_nNaGV9hvuClB4uFfkoH5T34/s1600/2014-10-04+19.11.12.JPG" height="640" width="360" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
10. 先拆下卡鉗,兩顆12號螺絲</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUCpI-SrO74sMcyTpwlQQDIWs6XKmtTX3jmYDT6lGvS16XKxokgXb31k94UlnHsTsWhztLQLDRCNca22FQeZ_73mC7UeUdsL_FTbgEiPySh7ApBT7hS3lj-0tUkWTGrslWgmgoXDIC5dCI/s1600/2014-10-04+20.05.39.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUCpI-SrO74sMcyTpwlQQDIWs6XKmtTX3jmYDT6lGvS16XKxokgXb31k94UlnHsTsWhztLQLDRCNca22FQeZ_73mC7UeUdsL_FTbgEiPySh7ApBT7hS3lj-0tUkWTGrslWgmgoXDIC5dCI/s1600/2014-10-04+20.05.39.JPG" height="640" width="360" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
11. 接著準備下前輪,在拆前輪之前,記得找東西頂住引擎,以免輪胎下來之後車子直接往前倒給你看XD</div>
<div class="separator" style="clear: both; text-align: left;">
我是用車子上的千斤頂,但有點短所以下面再墊了塊磚塊。</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZtSgwduKebwRX6Pkt8FPAXscb3oa-b3mYkfLUUrSwB6vk6pzPqHOrShaVrKSyB0zTrRITSaHwxq3IlIDAeqdD2Pj4Z1jE5N0b5kmt_ivfJna9zxUdzBngguJ2R8DRcporW-SkOJO4KZ4P/s1600/2014-10-04+20.05.21.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZtSgwduKebwRX6Pkt8FPAXscb3oa-b3mYkfLUUrSwB6vk6pzPqHOrShaVrKSyB0zTrRITSaHwxq3IlIDAeqdD2Pj4Z1jE5N0b5kmt_ivfJna9zxUdzBngguJ2R8DRcporW-SkOJO4KZ4P/s1600/2014-10-04+20.05.21.JPG" height="640" width="360" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
12. 下前輪,螺帽17號,輪軸14號,這裡沒什麼難度,螺帽下來之後拔出輪軸,前輪就下來了。如果輪軸拔不出,可用鐵鎚稍微敲一下。</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDpHuEZqJTH90ikK13XRYGkNtqjEHdFuta4C8CAtw0peqx3wXeOG_HMs2aK-575v6G1ar_uXeKYrw-2i67qEaYkpHVNoR1M_eFn4pQaoS-Ex29MET2kouTAu5YDMzY6W6XXK0aNdWTZKq-/s1600/2014-10-04+20.02.40.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDpHuEZqJTH90ikK13XRYGkNtqjEHdFuta4C8CAtw0peqx3wXeOG_HMs2aK-575v6G1ar_uXeKYrw-2i67qEaYkpHVNoR1M_eFn4pQaoS-Ex29MET2kouTAu5YDMzY6W6XXK0aNdWTZKq-/s1600/2014-10-04+20.02.40.JPG" height="640" width="360" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
前輪下來啦~</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiy5X05Kh8nmZwloaIXTtpspvXTKW2YpxuPTAVURtR_9zRq6p5G_DCX5j-gI_Gx5C8GxJtgUuozzVYQtud18ZUYak27HXIakLMzCWFc8_qwooZM_EyNaQ7cAFN0Ii8ViNSytp5xDriRPgR/s1600/2014-10-04+20.09.23.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiy5X05Kh8nmZwloaIXTtpspvXTKW2YpxuPTAVURtR_9zRq6p5G_DCX5j-gI_Gx5C8GxJtgUuozzVYQtud18ZUYak27HXIakLMzCWFc8_qwooZM_EyNaQ7cAFN0Ii8ViNSytp5xDriRPgR/s1600/2014-10-04+20.09.23.JPG" height="640" width="360" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
13. 要注意箭頭處那個套筒,不要弄丟了。</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvAEl7LRCZ7c6E0-IuC2SPGewTaDaXHvwbwqbfVolgTV0efPi9ujSDIJ448anJq31VsLJh_Tn2ebr0mzEpIf18_MtkqIgu9Dtxn4mirJf5r_eAisLkSsjU6Y3UFSSwLsPg-lfvjh1fimpv/s1600/2014-10-04+20.09.15.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvAEl7LRCZ7c6E0-IuC2SPGewTaDaXHvwbwqbfVolgTV0efPi9ujSDIJ448anJq31VsLJh_Tn2ebr0mzEpIf18_MtkqIgu9Dtxn4mirJf5r_eAisLkSsjU6Y3UFSSwLsPg-lfvjh1fimpv/s1600/2014-10-04+20.09.15.JPG" height="640" width="360" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
15. 接著拆下前土除,四顆6號內六角螺絲,很簡單就下來了。(催眠自己土除真乾淨...XD)</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNDzzX90_H5aMA5FWYVYfA2oU9MbndCv1WrXY1xvfu6RT_ikU6Xn5YZvaMNeHCjcI3ByMWw5zjpyhh0dCv5W6kmwMU5TxXzOD2pXcvvJADr2Y10XnxA724_spUIjksd8K51_57exQrp8KB/s1600/2014-10-04+20.09.40.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNDzzX90_H5aMA5FWYVYfA2oU9MbndCv1WrXY1xvfu6RT_ikU6Xn5YZvaMNeHCjcI3ByMWw5zjpyhh0dCv5W6kmwMU5TxXzOD2pXcvvJADr2Y10XnxA724_spUIjksd8K51_57exQrp8KB/s1600/2014-10-04+20.09.40.JPG" height="640" width="360" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
拆下來了,前叉內側也是髒兮兮...再度催眠自己很乾淨</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3LM_FCz5b0JlbRLQGShaj6zwqBqw96_ZezahodktOsP_WHDEv8ETtuSdo6y4umy6lwQHnSyZuOuPzGTqskOnQkT-T3OfB4r2QH92RalipeVGnbM05FejVr9qfVhKy7nh2pk5wlxE3s6ZL/s1600/2014-10-04+20.14.06.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3LM_FCz5b0JlbRLQGShaj6zwqBqw96_ZezahodktOsP_WHDEv8ETtuSdo6y4umy6lwQHnSyZuOuPzGTqskOnQkT-T3OfB4r2QH92RalipeVGnbM05FejVr9qfVhKy7nh2pk5wlxE3s6ZL/s1600/2014-10-04+20.14.06.JPG" height="640" width="360" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
16. 土除拆下後,握住兩支前叉內管部分,轉轉轉即可拆下來。</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkj81G-1nbEnzxAaWpLl4MYjCHZbUhmyDG14BJ1xLdqpaMDfdeB5C-ZVZw-eBfb-HKLBL2n2vywoeEnje_sA4qJoPavL3zBQdonvyNh6ZpS6TSS8skL6Zb5CYHR4oWDlNsoAg5ZIEBkNAL/s1600/2014-10-04+20.17.55.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkj81G-1nbEnzxAaWpLl4MYjCHZbUhmyDG14BJ1xLdqpaMDfdeB5C-ZVZw-eBfb-HKLBL2n2vywoeEnje_sA4qJoPavL3zBQdonvyNh6ZpS6TSS8skL6Zb5CYHR4oWDlNsoAg5ZIEBkNAL/s1600/2014-10-04+20.17.55.JPG" height="640" width="360" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
17. 拔開防塵蓋,先稍微清潔一下油封上的灰塵,可用噴氣罐+油漆刷,小心不要刮傷油封就好。</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_JRknviWMm5woPesb53d70jc3OJO_-FdgjYZWu1PemA4TX8p0WBCGywnuKTBEkwyKBTg_sVkbcEUiJEijo-lw_CllO8ycljov5M9aljD71uWkEF2_Kx2CWSfbYT6aIUnYVMD5LLPXLp0I/s1600/2014-10-04+20.30.39.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_JRknviWMm5woPesb53d70jc3OJO_-FdgjYZWu1PemA4TX8p0WBCGywnuKTBEkwyKBTg_sVkbcEUiJEijo-lw_CllO8ycljov5M9aljD71uWkEF2_Kx2CWSfbYT6aIUnYVMD5LLPXLp0I/s1600/2014-10-04+20.30.39.JPG" height="640" width="360" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
18. 轉開頂蓋,快開時稍微用手壓著,避免彈簧和隔筒彈出,打開後依序取出預載隔筒、原廠一片墊片、彈簧。</div>
<div class="separator" style="clear: both; text-align: left;">
這裡我發現原廠彈簧裝的方式是下密上疏,跟網路上大家推薦的上密下疏的裝法不同,所以還是決定等等依照上密下疏的方式裝回。</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhANdlHqOeX6ha3O8AzqXFDb_LT0h_WtWduW6LBshORQQM1r2s-Xm1mmUjUA2PmBgsEMLeQSWMSXFeXJ38xoXACzufynmPGfCLO-7MOLPgLbMGzhDwBRbSLkaEiAQpBGBHJ_KtGp7sQEFoh/s1600/2014-10-04+20.24.25.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhANdlHqOeX6ha3O8AzqXFDb_LT0h_WtWduW6LBshORQQM1r2s-Xm1mmUjUA2PmBgsEMLeQSWMSXFeXJ38xoXACzufynmPGfCLO-7MOLPgLbMGzhDwBRbSLkaEiAQpBGBHJ_KtGp7sQEFoh/s1600/2014-10-04+20.24.25.JPG" height="640" width="360" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
19. 倒出黑媽媽又腥臭的舊油,記得最後要把管子整根倒過來,抽插內管數下以利排出剩餘的舊油。</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghHLEhZfhJuFXZzd1F9AwZoJNSVU5XPstFvHj7_GRja2fgXdoF_1azn_F9MTBqlASyFSkyUs2vzexu6JO6RA7J2QCf_keg2R7Hw1hjabvgZvyoLQu5GtDNRUkBB8jT-lAxWgD_mFYuDRur/s1600/2014-10-04+20.33.44.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghHLEhZfhJuFXZzd1F9AwZoJNSVU5XPstFvHj7_GRja2fgXdoF_1azn_F9MTBqlASyFSkyUs2vzexu6JO6RA7J2QCf_keg2R7Hw1hjabvgZvyoLQu5GtDNRUkBB8jT-lAxWgD_mFYuDRur/s1600/2014-10-04+20.33.44.JPG" height="640" width="360" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
20. 用點煤油擦拭一下外觀,注意煤油不要沾到防塵蓋及油封!變乾淨些了~</div>
<div class="separator" style="clear: both; text-align: left;">
彈簧及墊片、隔筒也可用煤油清洗,但要注意煤油要完全乾燥才可裝回,不然會稀釋前叉油造成無效。或者就用乾淨的布擦拭即可。</div>
<div class="separator" style="clear: both; text-align: left;">
本來我是想倒一點點煤油到內管內,這樣可以清潔一下底部倒不出來的油泥,但因為是晚上又在停車場,沒有陽光的曝曬,煤油不容易揮發,就作罷了。下次換油的時候再說吧~</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7PDbNkJrfJPLUnLBv1PBmhJQ9KyULQVxqVccEtt2B2g81uMjEXTIXxodPb0UMLby4qv-eO4YiRgIGb6YO-1cm5nfb91nq0gn72yiG1SXmsXEV_5zc1BKWYJgV1fqXE6uyQV6OccWwulCQ/s1600/2014-10-04+20.41.10.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7PDbNkJrfJPLUnLBv1PBmhJQ9KyULQVxqVccEtt2B2g81uMjEXTIXxodPb0UMLby4qv-eO4YiRgIGb6YO-1cm5nfb91nq0gn72yiG1SXmsXEV_5zc1BKWYJgV1fqXE6uyQV6OccWwulCQ/s1600/2014-10-04+20.41.10.JPG" height="640" width="360" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
21. 接著準備乾淨的前叉油,我不知該如何選,於是先選擇IP的20w試試,反正之後可再多方測試。</div>
<div class="separator" style="clear: both; text-align: left;">
這次的數據:160cc + 八片墊片</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1OE4PVLkYtxADlbWsrZC77FCgTtAJkgOeUVcQ3-dHa7_RxOWXoJcZQbsTZ9jz_GePBH3Z2CNXfu-WCV5LnWjn2sFCJUkCtMn_cN69wQcJdXrQqyuLAxEBQTmda8qNWjEF0d54NsFJK5rH/s1600/2014-10-04+20.46.38.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1OE4PVLkYtxADlbWsrZC77FCgTtAJkgOeUVcQ3-dHa7_RxOWXoJcZQbsTZ9jz_GePBH3Z2CNXfu-WCV5LnWjn2sFCJUkCtMn_cN69wQcJdXrQqyuLAxEBQTmda8qNWjEF0d54NsFJK5rH/s1600/2014-10-04+20.46.38.JPG" height="360" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
22. 把油倒進內管時,注意不要一次倒完,每倒一點就抽插幾下內管,讓空氣排出,以及讓油順利進入最裡面。漸漸加完之後,抽插的聲音可以很明顯聽出有不同,在有空氣時,會有噗噗聲,但油蓋過阻尼棒空氣也排出後,聽到的就是咻咻聲了。</div>
<div class="separator" style="clear: both; text-align: left;">
沒意義的拍一下內部XD</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAFrqPGrd6GKWRQUG2whFbo4TZXuBl8VyP9md9CfHn6ilB-5vAPn9MgW0LmAq1wh4DKL8bhZMr90aD3RakL9MaU9t5VZbmJBdNBuo1_39mcbkm1HetOMrhCWAb44LHAD_EYYHq4qoUd8dt/s1600/2014-10-04+20.54.10.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAFrqPGrd6GKWRQUG2whFbo4TZXuBl8VyP9md9CfHn6ilB-5vAPn9MgW0LmAq1wh4DKL8bhZMr90aD3RakL9MaU9t5VZbmJBdNBuo1_39mcbkm1HetOMrhCWAb44LHAD_EYYHq4qoUd8dt/s1600/2014-10-04+20.54.10.JPG" height="640" width="360" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
23. 之後的步驟因為手油+有點累,就沒拍照,反正怎麼拆就把順序倒過來裝回去即可。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
24. 依序把彈簧(我是依照上密下疏的方式)、墊片、隔筒放回內管,然後左手將內管拉到最高hold住,右手稍微施力將頂蓋壓下轉回,轉緊即可。兩支前叉都一樣的做法。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
25. 上下三角台的洞擦乾淨,將前叉裝回,注意兩支前叉在上三角台突出的高度要相同!</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
26. 確定高度相同後,先將下三角台鎖緊,然後將前叉頂蓋鎖緊,有緊就好,不要緊到爆!!以免下次又拆到手痠!最後鎖緊上三角台螺絲</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
27. 裝回手把,之後比較好施力。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
28. 將土除鎖回,注意卡鉗那側,有片固定油管的鐵片,要鎖在前叉與土除中間。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
29. 裝回前輪,以面向車頭,左側把碼表線卡上,右邊把套筒套回,然後對準前叉軸心孔,將軸心插回。這部分可說是第二累的步驟...光要單手固定前輪+會跑走的零件就很累了,前輪想不到也是頗重@@</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
30. 前輪軸心鎖緊,卡鉗裝回,確定各部位螺絲確實鎖緊之後就去試個車吧~</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
步驟雖然很多,但其實除了頂蓋拆掉那邊容易卡關之外,其他的步驟都算簡單,自己動手來做過一次之後就會發現其實很容易,而且自己動手可以做得比較仔細,例如舊油漏乾淨和清潔零件之類的。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
這次油和預載的數據是160cc+八片,但試過之後還是覺得有點軟,要是再雙載可能更不行,所以下次大概要換彈簧吧!</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
--</div>
<div class="separator" style="clear: both; text-align: left;">
補充:</div>
<div class="separator" style="clear: both; text-align: left;">
實際上路騎乘,雖然還是有點軟,但頗Q,壓到哭辣或急煞也不太會點頭或觸底,表現還算OK!但後避震因為換了便宜YOSS,單人騎乘跟鐵條沒兩樣,雙載後避震又會觸底,與前叉實在很難搭配得起來,造成不平衡感,這如果調不出來適當的設定,就只能換掉了...@@</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
--</div>
<div class="separator" style="clear: both; text-align: left;">
2014-10-10 更新</div>
<div class="separator" style="clear: both; text-align: left;">
換了愛將後避震,將預載調整在中段(愛將原廠三段可調),然後兩隻前叉再各多加20cc前叉油及三片墊片,找了老婆試乘,非常舒適!!</div>
<div class="separator" style="clear: both; text-align: left;">
所以現在前叉內的數據是:前叉油180cc+11片墊片</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
愛將避震好物啊!!雙載的貧民神兵!!!但缺點是裝上雲豹後,會稍微提高屁股,導致中柱架起來後,後輪離底僅一公分左右,若停在不平整的地面可能會有倒車的風險,用側柱就還OK。</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjba5GoIdiC9L22Erv99szbOrRCM8Gmm3nK0LvAJHqqIe0uBEegQFFG-6ZRD6UDBF58mel7J-CO_Ixwdz7N8HvXs59ENt2FArjuZVlERqwx1rgqeD7l1jY_NlW0P9EIt4w-tOD9GBdnfUzd/s1600/2014-10-09+21.49.17.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjba5GoIdiC9L22Erv99szbOrRCM8Gmm3nK0LvAJHqqIe0uBEegQFFG-6ZRD6UDBF58mel7J-CO_Ixwdz7N8HvXs59ENt2FArjuZVlERqwx1rgqeD7l1jY_NlW0P9EIt4w-tOD9GBdnfUzd/s1600/2014-10-09+21.49.17.JPG" height="360" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7WVe1bPzhfPOjwTyG3_LkNtnnZiVKC2a-J8Z6WmXQiFD60brDeOXy-sa86cuLjY3a6LIOA-M1iRb9XG62a-hVyfFZjc5TcXWMbwaNQi00OcBQgcU9M9k4cbVwtPMKNjNSsFwQnOcotxSz/s1600/2014-10-09+21.49.29.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7WVe1bPzhfPOjwTyG3_LkNtnnZiVKC2a-J8Z6WmXQiFD60brDeOXy-sa86cuLjY3a6LIOA-M1iRb9XG62a-hVyfFZjc5TcXWMbwaNQi00OcBQgcU9M9k4cbVwtPMKNjNSsFwQnOcotxSz/s1600/2014-10-09+21.49.29.JPG" height="640" width="360" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8168527999844809796.post-14742689376703104222014-07-15T16:23:00.001+08:002014-07-16T22:31:38.658+08:00偵測檔案使用的編碼是Utf-8或Big5-新版前一篇文章討論到如何偵測檔案的編碼方式,但由於還是有很小的機會會誤判,心裡總是有疙瘩在,不確定廠商到底會丟怎樣的資料來(<span style="color: #cccccc;">廠商的代名詞就是腦X</span>),而且訂單XML內中文字的數量很少,若只有一筆,很可能只有三個中文字而已,於是從utf-8是如何編碼開始研究起。<br />
<br />
沒想到規則意外的簡單,因為我不須知道太詳細的細節,只需知道幾個重點:<br />
<br />
<ol>
<li>只要是0開頭的byte就表示是ascii編碼,也就是0xxxxxxx後面的七碼x相容於傳統ascii編碼</li>
<li>非ascii編碼,一律以1開頭再接0,並且最少兩個1</li>
<li>1的數量指出這個字是由幾個byte所組成,如1110xxxxx表示這個字要3個byte</li>
<li>其後每個子byte都為10開頭</li>
<li>最多每個字4個byte</li>
</ol>
<div>
<a name='more'></a>知道規則之後,要判斷就很簡單了,底下是判斷的流程和邏輯:</div>
<div>
<ol>
<li>依照規格,只要有非0、非110、非1110、非11110開頭的byte,就是非utf-8</li>
<li>110開頭的byte,需檢查是否有下一個byte,或底下一個byte是否為10開頭</li>
<li>1110開頭的byte,需檢查是否有下兩個byte,或底下兩個byte是否皆為10開頭</li>
<li>11110開頭的byte,需檢查是否有下三個byte,或底下三個byte是否皆為10開頭</li>
<li>全部byte跑完之後的指標是否等於檔案長度</li>
</ol>
<div>
底下就是程式碼了:</div>
</div>
<pre>/// <summary>
/// 檢查是否符合utf-8編碼的核心程式
/// </summary>
/// <param name="bytes">文字原始byte陣列</param>
/// <returns></returns>
private static bool _IsUtf8(byte[] bytes) {
int i = 0;
int size = bytes.Length;
//跑每一個byte,需要每個byte都符合utf-8編碼規則才算是utf-8編碼
while (i < size) {
int step = 0;
if ((bytes[i] & 0x80) == 0x00) {
//utf-8的ascii字元,為0開頭,OK跑下一個位元
step = 1;
}
else if ((bytes[i] & 0xE0) == 0xC0) {
/*
110xxxxx
& 11100000 (0xE0)
----------
11000000 (0xC0)
*/
//utf-8使用2bytes編碼格式為 110xxxxx 10xxxxxx
//如果是110xxxxx開頭,要判斷下個位元是否是10開頭
//如果下一個已經沒有資料了,表示這不是utf-8編碼
if (i + 1 >= size) { return false; }
//如果下個位元不是10開頭,也表示這不是utf-8編碼
if ((bytes[i + 1] & 0xC0) != 0x80) { return false; }
//繼續跑下2個
step = 2;
}
else if ((bytes[i] & 0xF0) == 0xE0) {
/*
1110xxxx
& 11110000 (0xF0)
----------
11100000 (0xE0)
*/
//utf-8使用3bytes編碼格式為 1110xxxx 10xxxxxx 10xxxxxx
//所以如果是1110xxxx開頭,要判斷下兩個byte是否都是10開頭
//如果下兩個已經沒有資料了,表示不是utf-8編碼
if (i + 2 >= size) { return false; }
//如果下兩個位元不是10開頭,也不是utf-8編碼
if ((bytes[i + 1] & 0xC0) != 0x80) { return false; }
if ((bytes[i + 2] & 0xC0) != 0x80) { return false; }
//繼續跑下3個
step = 3;
}
else if ((bytes[i] & 0xF8) == 0xF0) {
/*
11110xxx
& 11111000 (0xF8)
----------
11110000 (0xF0)
*/
//utf-8使用4bytes編碼格式為 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
//所以如果是11110xxx開頭,要判斷下3個byte是否都是10開頭
//如果下3個已經沒有資料了,表示不是utf-8編碼
if (i + 3 >= size) { return false; }
//如果下3個位元不是10開頭,也不是utf-8編碼
if ((bytes[i + 1] & 0xC0) != 0x80) { return false; }
if ((bytes[i + 2] & 0xC0) != 0x80) { return false; }
if ((bytes[i + 3] & 0xC0) != 0x80) { return false; }
//繼續跑下4個
step = 4;
}
else {
//如果都不是當然就不是utf-8了
return false;
}
i += step;
}
if (i == size) { return true; }
return false;
}
</pre>
<div>
<br /></div>
<div>
參考資料:</div>
<div>
<a href="http://zh.wikipedia.org/wiki/UTF8" target="_blank">維基百科</a></div>
<div>
<a href="http://www.rfc-base.org/txt/rfc-3629.txt" target="_blank">RFC-3629</a><br />
<a href="http://www.360doc.com/content/09/1023/02/406571_7695662.shtml" target="_blank">简述UTF-8编码原理及其文本文件的读写技术</a><br />
<a href="http://mfhsieh.blogspot.tw/2005/03/pda-zaurus-c760-35-utf-8-and-bom.html" target="_blank">[PDA] Zaurus C760 新手筆記 (35) - UTF-8 and BOM</a><br />
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8168527999844809796.post-28223406481144572012014-07-15T14:19:00.001+08:002014-07-15T14:19:49.775+08:00偵測檔案使用的編碼是Utf-8或Big5使用程式處理文字檔,最麻煩的就是要選擇開啟檔案時所採用的編碼方式。在台灣常見的就是utf-8或是big5兩種編碼,只要選錯了,那麼檔案裡面的中文字99.999%以上會變成亂碼或是莫名其妙的中文字。這也是非英語系國家的痛啊!<br />
<br />
<a name='more'></a><br />
<br />
當編碼配上XML,就會更慘...公司某專案就是每天固定要處理廠商所上傳的訂單XML檔,解析存到資料庫並做後續處理。但常常就有時候無法解析,常發生的就是編碼的問題,由於XML裡面也可帶Declaration指定編碼(如<?xml version="1.0" encoding="utf-8" ?>),但某些廠商不曉得是怎樣,總是有可能會帶錯誤的編碼或是不指定,就變成可能會有底下的情況:<br />
<br />
<br />
<ol>
<li>檔案utf-8編碼,不帶Declaration</li>
<li>檔案utf-8編碼,帶Declaration,encoding指定為utf-8</li>
<li><span style="color: red;">檔案</span><u><span style="color: blue;">utf-8</span></u><span style="color: red;">編碼,帶Declaration,encoding指定為</span><span style="color: blue;"><u>big5</u></span></li>
<li>檔案big5編碼,不帶Declaration</li>
<li>檔案big5編碼,帶Declaration,encoding指定為big5</li>
<li><span style="color: red;">檔案</span><u><span style="color: blue;">big5</span></u><span style="color: red;">編碼,帶Declaration,encoding指定為</span><span style="color: blue;"><u>utf-8</u></span></li>
</ol>
<div>
其中3和6的情況的廠商還真有,不曉得頭腦是發生甚麼事了...</div>
<div>
<br /></div>
<div>
而裡面還會有可能帶入XML不允許的特殊字元,這樣會造成程式無法解析的錯誤,所以我們必須先將裡面的特殊字元給過濾掉。但檔案總是要先開啟才能處理啊,這又回到一開始的問題,沒辦法知道檔案是用什麼編碼方式來編的。</div>
<div>
<br /></div>
<div>
如果採utf-8編碼,裡面有BOM,那就很好解決,.net程式很聰明,不管用utf-8或是big5的Encoding都可正常開啟,中文不會有亂碼。最怕的就是沒有BOM的utf-8編碼檔案,會跟big5混淆,選擇錯誤的編碼方式開啟就會造成檔案內的中文全變亂碼...</div>
<div>
<br /></div>
<div>
網路上搜尋過很多方式,多半都是教你判斷有EF BB BF就是utf-8,反之則不是,這根本沒講到重點,直到搜尋到黑暗執行緒的Jeffrey大所寫的一篇文章,他採用另一種思維方式:<br />
(連結:<a href="http://blog.darkthread.net/post-2012-04-11-detect-big5-encoding.aspx" target="_blank">CODE-偵測檔案是否為BIG5編碼</a>)</div>
<div>
<br /></div>
<div>
直接以二進位讀取檔案byte到陣列(byteAry1),然後以big5轉成文字,再轉成big5 byte陣列(byteAry2),判斷兩個陣列長度是否相同,如果相同,則表示可用big5開啟沒問題,反之則表示該採utf-8開。</div>
<div>
<br /></div>
<div>
上面那段可能有點繞口令搞不太清楚,所以我用我的理解來解釋一下:</div>
<div>
<br /></div>
<div>
utf-8對非標準ascii字元都採3個bytes編碼,而big5則是2個bytes。</div>
<div>
假設「你好」,用utf-8編碼是 <b><span style="color: #6aa84f;">A1 A2 A3</span> <span style="color: #3d85c6;">B1 B2 B3</span></b>,A1 A2 A3表示「你」,B1 B2 B3表示「好」;同樣的bytes變成big5編碼規則的話,A1 A2是第一個中文字<i>(假設對應到「<b>科</b>」)</i>,A3 B1是第二個中文字<i>(假設對應到「<b>啦</b>」)</i>,B2 B3是第三個中文字。但這樣編碼在big5裡並不會一定都有文字可對應,於是對應不到的中文字就會變成Ascii標準字元半形問號(?),而半形問號轉成byte編碼長度就只有1個byte,假設B2 B3在big5裡沒有中文字,所以對應不到的位元組轉成文字會變成「?」,然後再轉byte就變成3F(?的編碼)。這樣編碼會變成<span style="color: #6aa84f;">A1 A2</span> <span style="color: #3d85c6;">A3 B1</span> <span style="color: #f1c232;">3F</span>,長度只有5,與原始陣列長度6不相同,我們也就知道這個檔案不是big5編碼的了。</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
原始碼由暗黑執行緒Jeffrey大大提供:</div>
<pre>//偵測byte[]是否為BIG5編碼
public static bool IsBig5Encoding(byte[] bytes) {
Encoding big5 = Encoding.GetEncoding(950);
//將byte[]轉為string再轉回byte[]看位元數是否有變
return bytes.Length ==
big5.GetByteCount(big5.GetString(bytes));
}
//偵測檔案否為BIG5編碼
public static bool IsBig5Encoding(string file) {
if (!File.Exists(file)) return false;
return IsBig5Encoding(File.ReadAllBytes(file));
}
</pre>
<div>
<br /></div>
<div>
如此可輕鬆地得知檔案的編碼了。<br />
<br />
但,此方法不是100%準確,上面提到big5對應不到的編碼會變成?,而要有?,位元組陣列長度才會-1,但萬一原始utf-8三個一組的編碼,變成兩個一組的big5編碼,通通都對應的到字的話呢?陣列長度還是會一樣,函數會回傳True,這時如果以Big5編碼打開檔案,就會看到以亂碼顯示的文字了。回報之後Jeffrey大大的回應如下:<br />
<blockquote class="tr_bq">
你所說的誤判狀況是存在的,因UTF-8與BIG5的編碼區間重疊,故此法要達100%精準判斷是不可能的。<br />
<br />
所幸,當文字數愈多,其UTF-8編碼要完全相容BIG5的機率就愈低,在我的實務經驗裡,這個極簡便但非絕對精準的做法處理實際資料尚未出錯過(原因是系統所輸入文字檔均有一定長度),加上誤判造成的損失有限,仍可視為有效的解決方案。
</blockquote>
所以這個方法還是有效的解決方案,比只判斷EF BB BF的方式好太多了!!! </div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8168527999844809796.post-29708114923890098072014-06-23T09:36:00.002+08:002014-06-23T09:43:34.524+08:00如何讓Ubuntu Server在安裝時使用SoftRaid一般來說,如果要架設Server,最好使用硬體來做Raid,較省資源和穩定。但有時候預算或其他問題,沒辦法使用到硬體的Raid卡來做,那麼使用軟體提供的SoftRaid也很不錯。缺點是較吃CPU資源和效能影響及發生問題時恢復資料的難度較高。但現在電腦的CPU都很強大了,所以在有限的資源下也可考慮看看。<br />
<br />
現在網路上比較容易查到的,都是已經裝好Server作業系統,然後教你怎樣設定和加入Raid,但我是全新安裝(或重灌),在做Raid就卡關了是要怎麼把作業系統裝進去啊?<br />
<br />
沒關係,現在一步步來。<br />
<br />
<a name='more'></a><br />
<br />
系統環境(範例是在VM裡面做,但也可應用到實際機器上):<br />
實體硬碟兩顆,相同大小<br />
沒有硬體Raid卡(有些是利用主機板BIOS提供的Raid功能,或一些較便宜的直立式Server看似好像有Raid,其實那也不是真正的硬體Raid,但也不是軟體Raid,所以我們叫他做FakeRaid)<br />
作業系統Ubuntu Server 14.04<br />
<br />
1. 開始啦~安裝Ubuntu Server,一路進行到硬碟分割那,我們要選擇「手動」<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu89dOO4KzFe5pXNeVLf80MGRRGi_flDsnqULOPIPqA-Ss84gxgf44uluc-leA5SpjDZJprlhlXjxIcT6iRnTpulTnQI6xRmgMpq5iKgtExvaYZ5uNqy0MP_yMetlQT7DCg-OT2leII2sJ/s1600/UbuntuServer-2014-06-22-11-16-52.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu89dOO4KzFe5pXNeVLf80MGRRGi_flDsnqULOPIPqA-Ss84gxgf44uluc-leA5SpjDZJprlhlXjxIcT6iRnTpulTnQI6xRmgMpq5iKgtExvaYZ5uNqy0MP_yMetlQT7DCg-OT2leII2sJ/s1600/UbuntuServer-2014-06-22-11-16-52.png" height="480" width="640" /></a></div>
<br />
<br />
2. 來到下個畫面,我們可看到兩顆空白硬碟(如果你的硬碟有分割區,可以先利用其他硬碟工具清除,例如spfdisk,讓我們從空白開始比較不麻煩),先將選項移到第一顆硬碟(sda),然後按下Enter。<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrHS86FqMVyZ18YEkPb4q9hzhhDEXNJP7YXZawKi90-4pIEEn7us4OxV0IVMUqFkxIpFiIPVP16SLCBq4L93TBtaMuQBS-pCtg6bgg9gkW_71ktXxKMlvUi98HkbyOLdbm4OFO8HuABQf_/s1600/UbuntuServer-2014-06-22-11-17-06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrHS86FqMVyZ18YEkPb4q9hzhhDEXNJP7YXZawKi90-4pIEEn7us4OxV0IVMUqFkxIpFiIPVP16SLCBq4L93TBtaMuQBS-pCtg6bgg9gkW_71ktXxKMlvUi98HkbyOLdbm4OFO8HuABQf_/s1600/UbuntuServer-2014-06-22-11-17-06.png" height="480" width="640" /></a></div>
<br />
<br />
3. 選擇「是」<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTjJi9JTxLZ_7kqLKzlPtPoIN9d04oQ2HTykF3qWQPKSDctAtaG233JWIk-0HnWkP2_eJ0iPYK18WMJxJcFiLlILx5Zm_n7di_UqDNszlwvwIaCuntkgWAAVo3G6fr2MjsQXvO0npOe7SH/s1600/UbuntuServer-2014-06-22-11-17-16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTjJi9JTxLZ_7kqLKzlPtPoIN9d04oQ2HTykF3qWQPKSDctAtaG233JWIk-0HnWkP2_eJ0iPYK18WMJxJcFiLlILx5Zm_n7di_UqDNszlwvwIaCuntkgWAAVo3G6fr2MjsQXvO0npOe7SH/s1600/UbuntuServer-2014-06-22-11-17-16.png" height="480" width="640" /></a></div>
<br />
<br />
4. 選項移動到sda底下的「未使用空間」那,按下Enter<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2gv1FKkhOn_zu0B1l4SiwxMflaKe-g_pu9ePNBvwo61OzAaHH0DeRnPA69TQRFAj87gTF_y0JIznnOTu8dOWntl1cOgKLuxKdet0zF721E0URzxfem_vzzWPm4ycigVyQydAKMslHAMy9/s1600/UbuntuServer-2014-06-22-11-17-26.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2gv1FKkhOn_zu0B1l4SiwxMflaKe-g_pu9ePNBvwo61OzAaHH0DeRnPA69TQRFAj87gTF_y0JIznnOTu8dOWntl1cOgKLuxKdet0zF721E0URzxfem_vzzWPm4ycigVyQydAKMslHAMy9/s1600/UbuntuServer-2014-06-22-11-17-26.png" height="480" width="640" /></a></div>
<br />
<br />
5. 選擇「建立新分割區」<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgT_U3jOY9DoSrtQe6TBiv17km8N-HVuzgHYSGAjg-1Kh6FBt78x0Oge2BHN68fuRZijTWlvKu1JeM46dlX9thGGGQVQkflaf4t1pgs8jVVcE2T0wq01NFhfLRqpAD_nc4QbqNJeIjcLqLx/s1600/UbuntuServer-2014-06-22-11-17-34.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgT_U3jOY9DoSrtQe6TBiv17km8N-HVuzgHYSGAjg-1Kh6FBt78x0Oge2BHN68fuRZijTWlvKu1JeM46dlX9thGGGQVQkflaf4t1pgs8jVVcE2T0wq01NFhfLRqpAD_nc4QbqNJeIjcLqLx/s1600/UbuntuServer-2014-06-22-11-17-34.png" height="480" width="640" /></a></div>
<br />
<br />
6. 接著輸入這個分割區容量,我們還要考慮到Swap的空間,所以要記得減掉(這裡我準備給Swap 1.5G,所以輸入20G)。為了方便,範例只會用到兩個分割區,一個/一個swap。<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1wlP_zBkobGnJ73k8uwzo-BQwAShgh9W2fBVW3FFTMMYQ-GUkEEzljlzfORSVP9HE2VI7g5c8JtsmJKRoLRRBF7kRKO2jRL3rPII5eVU5kBMInDz9lOZpQH3saceqREZ5I0Wx1sE4DEMk/s1600/UbuntuServer-2014-06-22-11-18-34.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1wlP_zBkobGnJ73k8uwzo-BQwAShgh9W2fBVW3FFTMMYQ-GUkEEzljlzfORSVP9HE2VI7g5c8JtsmJKRoLRRBF7kRKO2jRL3rPII5eVU5kBMInDz9lOZpQH3saceqREZ5I0Wx1sE4DEMk/s1600/UbuntuServer-2014-06-22-11-18-34.png" height="480" width="640" /></a></div>
<br />
<br />
7. 選擇「主分割區」<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtAgeodSKWOTwYmtNOI5uLxBTr2Hh-SFKbeq0IPY4mRtY31_4e3aHseQdlh5CZYUXAPSHykAAK1E_qCXk85J13rvV9vMnp5SIuo3yx_wffLpxDdn3R4-iO6Q6J7h7FlEdn8iSPuS4O8WJu/s1600/UbuntuServer-2014-06-22-11-18-40.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtAgeodSKWOTwYmtNOI5uLxBTr2Hh-SFKbeq0IPY4mRtY31_4e3aHseQdlh5CZYUXAPSHykAAK1E_qCXk85J13rvV9vMnp5SIuo3yx_wffLpxDdn3R4-iO6Q6J7h7FlEdn8iSPuS4O8WJu/s1600/UbuntuServer-2014-06-22-11-18-40.png" height="480" width="640" /></a></div>
<br />
<br />
8. 我們把主要的空間放在開頭處比較好。<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2518pIbx6yeud3tO39rTAp0B6dVzg8ImedZIJ5l0kel7O176xwKmQZUNcVMsZXiS5apqlEoD0jRgsrMPJFz5S_1R5z_hQeAKdBavL51siYVrx307ahWTNZWarjf4YW1jnz-juZBqeBWQK/s1600/UbuntuServer-2014-06-22-11-18-46.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2518pIbx6yeud3tO39rTAp0B6dVzg8ImedZIJ5l0kel7O176xwKmQZUNcVMsZXiS5apqlEoD0jRgsrMPJFz5S_1R5z_hQeAKdBavL51siYVrx307ahWTNZWarjf4YW1jnz-juZBqeBWQK/s1600/UbuntuServer-2014-06-22-11-18-46.png" height="480" width="640" /></a></div>
<br />
<br />
9. 在下個畫面,用途預設是Ext4檔案系統,我們要換一下,所以選項移到那,然後按下Enter<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgx7kzJxMVqqPIymHSjgAeYNh2pS4T_fe0Eos_m3Hi5IjN6binwtAERGrZ2bvU3RqFl4IAXIexIlue-B5Kyy_ce7j1xKCK9viQg2iXKLpIy_v7LCojMRj4FkGpVfYqBUdDnwgxy8bSLVTp/s1600/UbuntuServer-2014-06-22-11-18-56.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgx7kzJxMVqqPIymHSjgAeYNh2pS4T_fe0Eos_m3Hi5IjN6binwtAERGrZ2bvU3RqFl4IAXIexIlue-B5Kyy_ce7j1xKCK9viQg2iXKLpIy_v7LCojMRj4FkGpVfYqBUdDnwgxy8bSLVTp/s1600/UbuntuServer-2014-06-22-11-18-56.png" height="480" width="640" /></a></div>
<br />
<br />
10. 選擇「Raid的Physical Volume」,再按下Enter<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZVWn5sUiLLer2YFxuNBHCX_fGyuSK-CCmgAYQ67bSJVL2UfUw1TrzqCkpeTozkRo96yPrZXPRsqouOPwLcz5zZKbkznODM2g8DZ61L5FwnI2HGWvLKm1SnYIw8ODPxotVEes_gCLVWvtf/s1600/UbuntuServer-2014-06-22-11-19-07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZVWn5sUiLLer2YFxuNBHCX_fGyuSK-CCmgAYQ67bSJVL2UfUw1TrzqCkpeTozkRo96yPrZXPRsqouOPwLcz5zZKbkznODM2g8DZ61L5FwnI2HGWvLKm1SnYIw8ODPxotVEes_gCLVWvtf/s1600/UbuntuServer-2014-06-22-11-19-07.png" height="480" width="640" /></a></div>
<br />
<br />
11. 可看到用途已經改了,然後移到下面"可開機",這個分割是給系統用的,當然一定要可開機啊,預設是「關」,所以按一下Enter讓他變成「開」。<b><span style="color: red;">這步很重要!</span></b><br />
然後選擇分割區設定完成,按下Enter。<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT6tNsksOQXI4Df6cuVLMi-Azuno8RE_44eJHzFnum-Kw3BeNWtzIKahtlC-hNcI9yQq8hc_vEr9UgOa16OxC0-VsISI4FwXY7pNjoJW2TGJdSnNq5Sir-YJsT3YTVbWuur7M6vAlc2xAl/s1600/UbuntuServer-2014-06-22-11-19-32.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT6tNsksOQXI4Df6cuVLMi-Azuno8RE_44eJHzFnum-Kw3BeNWtzIKahtlC-hNcI9yQq8hc_vEr9UgOa16OxC0-VsISI4FwXY7pNjoJW2TGJdSnNq5Sir-YJsT3YTVbWuur7M6vAlc2xAl/s1600/UbuntuServer-2014-06-22-11-19-32.png" height="480" width="640" /></a></div>
<br />
<br />
12. 回到手動主畫面,可以看到剛剛新增的一個分割區了,接著再把剩下的未使用空間給Swap用,由於流程一樣,就不多說明,看圖說故事吧。<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhipwyixAkmKe2huiWSPiosm30tRgz3VlGUc-PTT0Y0GWeuViTN8a6JKwa1D6eZzXa_iTUkVw7dZzjGRN15ffkLS9y3sZ1yVdGAzfG95dYvo4mSJ1xmdV1IhBZwUMCVtmq9Rb-ez9DYNUTT/s1600/UbuntuServer-2014-06-22-11-19-44.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhipwyixAkmKe2huiWSPiosm30tRgz3VlGUc-PTT0Y0GWeuViTN8a6JKwa1D6eZzXa_iTUkVw7dZzjGRN15ffkLS9y3sZ1yVdGAzfG95dYvo4mSJ1xmdV1IhBZwUMCVtmq9Rb-ez9DYNUTT/s1600/UbuntuServer-2014-06-22-11-19-44.png" height="480" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSBRg-cZ2LHol3iY1P3YDdzvGUy-ghLFfXOjQ0sD3oaAyOGn41TB0OCwZZcpTM1055I-7VjLhIkSh6qONyWmDkWP1Opu7G0dSjLVFJpz2O_-1SN8oEZyaX7LaB1purKwoNlyPLS3hqtSa1/s1600/UbuntuServer-2014-06-22-11-20-45.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSBRg-cZ2LHol3iY1P3YDdzvGUy-ghLFfXOjQ0sD3oaAyOGn41TB0OCwZZcpTM1055I-7VjLhIkSh6qONyWmDkWP1Opu7G0dSjLVFJpz2O_-1SN8oEZyaX7LaB1purKwoNlyPLS3hqtSa1/s1600/UbuntuServer-2014-06-22-11-20-45.png" height="480" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUw9nkjMcxRimZ9LN5T1tWx5923Vsq2ROVRD3vqhigDmQ9Dvi9rgvYsERpQBzkMbR7hQ43So4RfvTCMsZXMCQAn7K2OtwyRUIeYmoab0GC8ubMS7czQPzkPwLGnxFrUQo_MLwSv1SnTNyO/s1600/UbuntuServer-2014-06-22-11-20-55.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUw9nkjMcxRimZ9LN5T1tWx5923Vsq2ROVRD3vqhigDmQ9Dvi9rgvYsERpQBzkMbR7hQ43So4RfvTCMsZXMCQAn7K2OtwyRUIeYmoab0GC8ubMS7czQPzkPwLGnxFrUQo_MLwSv1SnTNyO/s1600/UbuntuServer-2014-06-22-11-20-55.png" height="480" width="640" /></a></div>
<br />
13. 這裡可開機要維持「關」<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkKF9FKSSNeRlrfYd1t_OgW_KWQcT0lRIsRHe9fxYVeMRdY9ayOigX1wm4P3a825rJnYQt-muoG3UkRMTTv7d3j3XeTP4ap7UgiX4lPwlOdQ8v1gGbYP5rZL-SUrDz_vJsosHjsD77eMuo/s1600/UbuntuServer-2014-06-22-11-21-06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkKF9FKSSNeRlrfYd1t_OgW_KWQcT0lRIsRHe9fxYVeMRdY9ayOigX1wm4P3a825rJnYQt-muoG3UkRMTTv7d3j3XeTP4ap7UgiX4lPwlOdQ8v1gGbYP5rZL-SUrDz_vJsosHjsD77eMuo/s1600/UbuntuServer-2014-06-22-11-21-06.png" height="480" width="640" /></a></div>
<br />
<br />
14. 回到列表,可看見sda的兩個分割區都設定好了,接著重複2~13步驟以相同方式設定sdb。<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRC8QQDN5YomOXClWinLCFAFhVXfwMSyGwImBogJrmn1-VcbYtjk7CRSlUppEMDk29VhinYd6u9sRPDJau7hpJ3itNiT4idQe8g-Lq8cUo4rK_pZ7bZdAVMfo14CLNGoXKVyvpjxmfrrFN/s1600/UbuntuServer-2014-06-22-11-21-27.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRC8QQDN5YomOXClWinLCFAFhVXfwMSyGwImBogJrmn1-VcbYtjk7CRSlUppEMDk29VhinYd6u9sRPDJau7hpJ3itNiT4idQe8g-Lq8cUo4rK_pZ7bZdAVMfo14CLNGoXKVyvpjxmfrrFN/s1600/UbuntuServer-2014-06-22-11-21-27.png" height="480" width="640" /></a></div>
<br />
<br />
15. sdb也設定好後,回到列表,確認下方紅框處,兩顆硬碟分割內容應該要一模一樣。確認好後,選擇「設定軟體RAID」,按下Enter。<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7_4XeZy_AN4LulENqzhXAkHtG250QIspcDJ0oCyXUWg8havW_8lYpV6ZqkJDYDJfDgHRJlxBnR32UvHQ7QnP4ekVVU3rSAb2T5Cx6JPEBmD6gGY1I0xn8DaYC9ZC3BuANzry8JmNXpaug/s1600/UbuntuServer-2014-06-22-11-22-35.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7_4XeZy_AN4LulENqzhXAkHtG250QIspcDJ0oCyXUWg8havW_8lYpV6ZqkJDYDJfDgHRJlxBnR32UvHQ7QnP4ekVVU3rSAb2T5Cx6JPEBmD6gGY1I0xn8DaYC9ZC3BuANzry8JmNXpaug/s1600/UbuntuServer-2014-06-22-11-22-35.png" height="480" width="640" /></a></div>
<br />
<br />
16. 這裡會要求要先將硬碟分割的變更寫入硬碟,選擇「是」<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmlzYxxRLH30EOvf8lGPuSxzFKoRzXDKJ7VMreCO5UiX-KWxwvvRjf0Ayk5ImMoMJ-LxiQpeAAtt-YBbmNOMtmzE7cJpe0L9bsCNMCbqzi2Bnz2Mq5e3tuIqKkxSOp7nMT2LFd4_B21-wn/s1600/UbuntuServer-2014-06-22-11-22-46.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmlzYxxRLH30EOvf8lGPuSxzFKoRzXDKJ7VMreCO5UiX-KWxwvvRjf0Ayk5ImMoMJ-LxiQpeAAtt-YBbmNOMtmzE7cJpe0L9bsCNMCbqzi2Bnz2Mq5e3tuIqKkxSOp7nMT2LFd4_B21-wn/s1600/UbuntuServer-2014-06-22-11-22-46.png" height="480" width="640" /></a></div>
<br />
<br />
17. 好了之後我們就來建立MD裝置<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWmD_6cUd2d8ZNKLEaLExEMvSY_zvil5pFZupeEZ_exDaH-3QaZ9WAHLz3CrNNZ5kLlYW_CcxQJXunZXOLzxloTi2GWytO4n04QdnJNzNtr4BqsPLe0hJftOYWTxeTd5c3y0XCDzZmrBJz/s1600/UbuntuServer-2014-06-22-11-22-54.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWmD_6cUd2d8ZNKLEaLExEMvSY_zvil5pFZupeEZ_exDaH-3QaZ9WAHLz3CrNNZ5kLlYW_CcxQJXunZXOLzxloTi2GWytO4n04QdnJNzNtr4BqsPLe0hJftOYWTxeTd5c3y0XCDzZmrBJz/s1600/UbuntuServer-2014-06-22-11-22-54.png" height="480" width="640" /></a></div>
<br />
<br />
18. 因為只有兩顆硬碟,所以只能選擇Raid0或Raid1,這裡選擇Raid1(在server上做Raid0很可怕的啊)<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvqT02gPK3DKIRjgUKlOnzGvEUmBum9l-eNfjWZLiry2VbIP3zK_AGNgaCBStj_YyhyphenhyphenWSV7ow4AC93hFRhmgA9Uvj2WQRMyN57v6NI3xw2Z2MQNGZu_JBus8E9p6Y4BRyy7bUEdhSeT3Bf/s1600/UbuntuServer-2014-06-22-11-23-12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvqT02gPK3DKIRjgUKlOnzGvEUmBum9l-eNfjWZLiry2VbIP3zK_AGNgaCBStj_YyhyphenhyphenWSV7ow4AC93hFRhmgA9Uvj2WQRMyN57v6NI3xw2Z2MQNGZu_JBus8E9p6Y4BRyy7bUEdhSeT3Bf/s1600/UbuntuServer-2014-06-22-11-23-12.png" height="480" width="640" /></a></div>
<br />
<br />
19. 裝置數輸入2,因為我們只有兩顆硬碟<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1S0fjGbE0eTzXJosg9O3XZfg5oNn8RaMSq1NeNCZ8ICogYlt0ijf_Rq3dPZZWCaHIp7axOHwdhSpNY6zXypIG7yFv5Unwr-9OHdpCrK_QEVJ9OM-EueWxVqiuuMRhLICE7obhzF8Zo9OQ/s1600/UbuntuServer-2014-06-22-11-23-24.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1S0fjGbE0eTzXJosg9O3XZfg5oNn8RaMSq1NeNCZ8ICogYlt0ijf_Rq3dPZZWCaHIp7axOHwdhSpNY6zXypIG7yFv5Unwr-9OHdpCrK_QEVJ9OM-EueWxVqiuuMRhLICE7obhzF8Zo9OQ/s1600/UbuntuServer-2014-06-22-11-23-24.png" height="480" width="640" /></a></div>
<br />
<br />
20. 因為我們沒其他備用硬碟了,所以備用裝置個數是0,如果有第三顆的話可以輸入1,這樣Raid裡面有某顆硬碟出問題的話,會掛上備用裝置讓Raid繼續作用<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-p6IauZF4LzGpY2p-F0gZZzKWblzXPNIrF-kJakW2hcOuzLOIlf_DBvdBFpGBOoosALYU5xqctacPnrq8wQLVpobzk9p5SyqurGjp2S6RKHRVJp-ox1UJxJQecplcHZqz3cWhW4V8jl4O/s1600/UbuntuServer-2014-06-22-11-23-36.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-p6IauZF4LzGpY2p-F0gZZzKWblzXPNIrF-kJakW2hcOuzLOIlf_DBvdBFpGBOoosALYU5xqctacPnrq8wQLVpobzk9p5SyqurGjp2S6RKHRVJp-ox1UJxJQecplcHZqz3cWhW4V8jl4O/s1600/UbuntuServer-2014-06-22-11-23-36.png" height="480" width="640" /></a></div>
<br />
<br />
21. 接下來就要選擇哪2個裝置,先建立系統資料裝置,所以選sda1和sdb1,然後按下繼續<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsm-sGtRthgJIl8iN6ohdwc97QphQQnokHpjMXt9cHaJM0o8iyrukay7yc1ZtqK_lpkrXA6_-jzCXb-o0qFJC8qnYa8vvhVrjQe_OsEdbg7FCR_8Veb86l6oyV8C3wWOE5xqOZhTmBjvKx/s1600/UbuntuServer-2014-06-22-11-23-48.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsm-sGtRthgJIl8iN6ohdwc97QphQQnokHpjMXt9cHaJM0o8iyrukay7yc1ZtqK_lpkrXA6_-jzCXb-o0qFJC8qnYa8vvhVrjQe_OsEdbg7FCR_8Veb86l6oyV8C3wWOE5xqOZhTmBjvKx/s1600/UbuntuServer-2014-06-22-11-23-48.png" height="480" width="640" /></a></div>
<br />
<br />
22. 回到這,繼續建立MD裝置<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2TmmnfA1XXEhbiK21flyXw14Ur1SOUJOV6n8F9lncR3f-Jo18KLXOwB0o7kNWfKkLOhY5Tp_4CtnfO-bWgmuAKL5T-Jq2ibQRdN0G2P3eKWCFEQx4rd16Otf30LCxhWlDT3SoeUNyT9Vr/s1600/UbuntuServer-2014-06-22-11-23-59.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2TmmnfA1XXEhbiK21flyXw14Ur1SOUJOV6n8F9lncR3f-Jo18KLXOwB0o7kNWfKkLOhY5Tp_4CtnfO-bWgmuAKL5T-Jq2ibQRdN0G2P3eKWCFEQx4rd16Otf30LCxhWlDT3SoeUNyT9Vr/s1600/UbuntuServer-2014-06-22-11-23-59.png" height="480" width="640" /></a></div>
<br />
<br />
23. 接下來步驟都相同,在選擇裝置就把最後兩個選上<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjorJP-DeA8M7u5AfKYIn07KgnKKVuX7b_xnASD1H6WMw-X5M7lhjGUmsAYD2RDQJQ-_BHQgQIbUNNNPX9IBkCkP2AJv6BlwWKApZ_u1mDVoA3-EOsypA0tCgTviGaKwwUWXgajBTK4UhaG/s1600/UbuntuServer-2014-06-22-11-24-16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjorJP-DeA8M7u5AfKYIn07KgnKKVuX7b_xnASD1H6WMw-X5M7lhjGUmsAYD2RDQJQ-_BHQgQIbUNNNPX9IBkCkP2AJv6BlwWKApZ_u1mDVoA3-EOsypA0tCgTviGaKwwUWXgajBTK4UhaG/s1600/UbuntuServer-2014-06-22-11-24-16.png" height="480" width="640" /></a></div>
<br />
<br />
24. 然後按下完成<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtaozFXDo9Ih-ZfcZdFl16YsmomwufufbgeIUPUzTJ2HL4EumpzmRVV7dAHY8phOKNof4hZmqSH05244yctILdrenJ7Byz-K8688XtwG-ibEz6SHOQIHVHNvK7nAwS0KlCfs8YbRAzIq6d/s1600/UbuntuServer-2014-06-22-11-24-53.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtaozFXDo9Ih-ZfcZdFl16YsmomwufufbgeIUPUzTJ2HL4EumpzmRVV7dAHY8phOKNof4hZmqSH05244yctILdrenJ7Byz-K8688XtwG-ibEz6SHOQIHVHNvK7nAwS0KlCfs8YbRAzIq6d/s1600/UbuntuServer-2014-06-22-11-24-53.png" height="480" width="640" /></a></div>
<br />
<br />
25. 回到清單,可看到會顯示Raid1的裝置了,這裡有第0和第1個裝置(md0, md1),接著我們要掛載檔案系統,先選系統資料的,按下enter<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUebNGAMZcwoKOJUQ-r1rNPV50KwTFNViGkGC0torvsoUqn4SETkfaH5ZIzrRX-4gyQwW3evf3nY78d53zqdMGhgPEzMY3wtpLAp4LQOpd2CxmuAGsTnypQ-uoLC8rEHcBZJl8qbFh0l-e/s1600/UbuntuServer-2014-06-22-11-25-12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUebNGAMZcwoKOJUQ-r1rNPV50KwTFNViGkGC0torvsoUqn4SETkfaH5ZIzrRX-4gyQwW3evf3nY78d53zqdMGhgPEzMY3wtpLAp4LQOpd2CxmuAGsTnypQ-uoLC8rEHcBZJl8qbFh0l-e/s1600/UbuntuServer-2014-06-22-11-25-12.png" height="480" width="640" /></a></div>
<br />
<br />
26. 將選項移到「用途:不使用」那,按下Enter<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf7dkSn3MeRogY0zIESHXrMMMEgaCBMMNoYE7qKLNifO25ptCIPqDm6EuyFlQdkExIc7_guq6ovFSZCXXl4TDcqa7U0VnoXnh3k_gRjnpDcFiKUJRMkHShyphenhyphenFacYfSJBLRIYTN54cgBfxcV/s1600/UbuntuServer-2014-06-22-11-25-21.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf7dkSn3MeRogY0zIESHXrMMMEgaCBMMNoYE7qKLNifO25ptCIPqDm6EuyFlQdkExIc7_guq6ovFSZCXXl4TDcqa7U0VnoXnh3k_gRjnpDcFiKUJRMkHShyphenhyphenFacYfSJBLRIYTN54cgBfxcV/s1600/UbuntuServer-2014-06-22-11-25-21.png" height="480" width="640" /></a></div>
<br />
<br />
27. 然後選擇「Ext4日誌式檔案系統」,按下Enter<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4XCjdaJ1ho4HL9aAkBQm_otqJfFsjs6pUHyJpSZ-AZYBZwH-WAIdtBLGZdZ4Ki2KNQeIj2PPPcqU4KFM6keTTIGsVigR_sz3LU2NQJEMOt6bp25BxgoXWNYIKXknUs83Mm04DILz7m865/s1600/UbuntuServer-2014-06-22-11-25-27.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4XCjdaJ1ho4HL9aAkBQm_otqJfFsjs6pUHyJpSZ-AZYBZwH-WAIdtBLGZdZ4Ki2KNQeIj2PPPcqU4KFM6keTTIGsVigR_sz3LU2NQJEMOt6bp25BxgoXWNYIKXknUs83Mm04DILz7m865/s1600/UbuntuServer-2014-06-22-11-25-27.png" height="480" width="640" /></a></div>
<br />
<br />
28. 接著移到掛載點,目前沒有掛載任何東西,所以先按下Enter<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2FPjO15ceRgLVb97nyL_ac6yCrnJLwQ4iuhCBF8rErLMO2vS1nosLtmn_ZnGfgXnyXUa7q0qH9AAWI98dLhkc4HJKmshUadURtRtPJBd-_eu5Yk83qiKqZBPSn2CNpvU4z2HigcuQRTUA/s1600/UbuntuServer-2014-06-22-11-25-37.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2FPjO15ceRgLVb97nyL_ac6yCrnJLwQ4iuhCBF8rErLMO2vS1nosLtmn_ZnGfgXnyXUa7q0qH9AAWI98dLhkc4HJKmshUadURtRtPJBd-_eu5Yk83qiKqZBPSn2CNpvU4z2HigcuQRTUA/s1600/UbuntuServer-2014-06-22-11-25-37.png" height="480" width="640" /></a></div>
<br />
<br />
29. 選擇第一個「/ - root 檔案系統」<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyrPgaN7JZ013j4dy0t0jZ0qiie7Uri_2CeuayimAttQxGyIROX3j25NmrCt-6dORK3c4dj0TbAowKSCWOHFr2V8TE0S0paAfrwHnn6s0EVXMUI9OUwGuHSt6qVhHINfW7hMf6T2XrDqyG/s1600/UbuntuServer-2014-06-22-11-25-42.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyrPgaN7JZ013j4dy0t0jZ0qiie7Uri_2CeuayimAttQxGyIROX3j25NmrCt-6dORK3c4dj0TbAowKSCWOHFr2V8TE0S0paAfrwHnn6s0EVXMUI9OUwGuHSt6qVhHINfW7hMf6T2XrDqyG/s1600/UbuntuServer-2014-06-22-11-25-42.png" height="480" width="640" /></a></div>
<br />
<br />
30. 這樣分割區就設定完成<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHKbBduUZgQrbOkcCFjpAQU0EeV4D_9dQ6wvC4vyLDeEgcMRx6JVNL376QTEr0xfPAuAfbd_TYi_G3Y5SKNvMl9GCc7OgbkYwfrZjuaHOxcl25pUisT0pqjrvh6UmW3f41Dm4KnAvaQHqy/s1600/UbuntuServer-2014-06-22-11-25-51.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHKbBduUZgQrbOkcCFjpAQU0EeV4D_9dQ6wvC4vyLDeEgcMRx6JVNL376QTEr0xfPAuAfbd_TYi_G3Y5SKNvMl9GCc7OgbkYwfrZjuaHOxcl25pUisT0pqjrvh6UmW3f41Dm4KnAvaQHqy/s1600/UbuntuServer-2014-06-22-11-25-51.png" height="480" width="640" /></a></div>
<br />
<br />
31. 接著來設定要當作Swap的分割<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4QMPXQn-WoDnC1Fcf2KJc71g8Y5ACWjM57eIxYyxGPEObrjUylye1Cwv0dhAnLUSLToWJSUczy7QkKn1rXJ7EZxrC_oEr0RAP-2JKTBY6z1oTG7tGIwHaJbWuf26kqWRBjfsdqhEYHp9M/s1600/UbuntuServer-2014-06-22-11-25-59.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4QMPXQn-WoDnC1Fcf2KJc71g8Y5ACWjM57eIxYyxGPEObrjUylye1Cwv0dhAnLUSLToWJSUczy7QkKn1rXJ7EZxrC_oEr0RAP-2JKTBY6z1oTG7tGIwHaJbWuf26kqWRBjfsdqhEYHp9M/s1600/UbuntuServer-2014-06-22-11-25-59.png" height="480" width="640" /></a></div>
<br />
<br />
32. 一樣在用途那邊按下enter<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEij6PoV3dB5fhSIk17UJQksxiCB-NfNW39R1ehQ7o1uSW5exZxzIZ-EH78czUCDgR_zK60HLWGeKEMEOfQewOf7hJThLY0A6fcW0DjSfONvFwVLqyc0VrZ6AAeJm8B4SBMgKthcQTw4OI6R/s1600/UbuntuServer-2014-06-22-11-26-05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEij6PoV3dB5fhSIk17UJQksxiCB-NfNW39R1ehQ7o1uSW5exZxzIZ-EH78czUCDgR_zK60HLWGeKEMEOfQewOf7hJThLY0A6fcW0DjSfONvFwVLqyc0VrZ6AAeJm8B4SBMgKthcQTw4OI6R/s1600/UbuntuServer-2014-06-22-11-26-05.png" height="480" width="640" /></a></div>
<br />
<br />
33. 這次選「置換空間」,也就是Swap啦<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii7VEfNTcKOpdPEr5NQZA_5b8OOcjzECe2CH2Ba1Kfe1RPPs0VhNnKr1GRVrSmCp0Y5ls2ZQoixPSQ6LV4s-PbXu86RmU5-4lXZHhjvH1etULZsOrFa52kVNk7SjITo1v7c0IN_YpXnqkX/s1600/UbuntuServer-2014-06-22-11-26-16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii7VEfNTcKOpdPEr5NQZA_5b8OOcjzECe2CH2Ba1Kfe1RPPs0VhNnKr1GRVrSmCp0Y5ls2ZQoixPSQ6LV4s-PbXu86RmU5-4lXZHhjvH1etULZsOrFa52kVNk7SjITo1v7c0IN_YpXnqkX/s1600/UbuntuServer-2014-06-22-11-26-16.png" height="480" width="640" /></a></div>
<br />
<br />
34. Swap不用,也無法掛載,所以就設定完成<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_NSmYp6lqHxTRrNR4ucQXmVeW96J75lXHFlHCFyw1ofXOljfLIhuBqYfABsBmH-E_7nrGzYJHVA08aeL9_0YlJaTQkShMmwfiotl4nadQvuuvEmZPq4MXSGkRPQ70gHtCmHrZM0WpvXjZ/s1600/UbuntuServer-2014-06-22-11-26-23.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_NSmYp6lqHxTRrNR4ucQXmVeW96J75lXHFlHCFyw1ofXOljfLIhuBqYfABsBmH-E_7nrGzYJHVA08aeL9_0YlJaTQkShMmwfiotl4nadQvuuvEmZPq4MXSGkRPQ70gHtCmHrZM0WpvXjZ/s1600/UbuntuServer-2014-06-22-11-26-23.png" height="480" width="640" /></a></div>
<br />
<br />
35. 終於做完了,在清單檢查一下對不對,然後就可結束磁碟分割作業並寫入磁碟囉<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6sAtHnW_lBFyV7ZPhOEpCMwvazyd6KietKcTpp_sCSkFfOgXA_CDFtXBGNiVWMPB_px457Q01GqCHlsuvd6vLAk3gNP_yK_i4q-jiNFrOv6yQ2LGmKg4oHchGcR1oVhhqMK3KWGGcV-xE/s1600/UbuntuServer-2014-06-22-11-26-35.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6sAtHnW_lBFyV7ZPhOEpCMwvazyd6KietKcTpp_sCSkFfOgXA_CDFtXBGNiVWMPB_px457Q01GqCHlsuvd6vLAk3gNP_yK_i4q-jiNFrOv6yQ2LGmKg4oHchGcR1oVhhqMK3KWGGcV-xE/s1600/UbuntuServer-2014-06-22-11-26-35.png" height="480" width="640" /></a></div>
<br />
<br />
36. YES<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj16uqJUb9u0Jdl1DVHz_f8IRxNB0u7hHIf3EwDZ56PXw1QIb0LxcTyyOekunYX63mIV5osbYCkZQdkzf_31Kdvc0UwmBJNuKsBoBE9f5d-LgdIYRkzpDatVEup-WAnC5pnU0SQ5Uu3mrKQ/s1600/UbuntuServer-2014-06-22-11-26-43.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj16uqJUb9u0Jdl1DVHz_f8IRxNB0u7hHIf3EwDZ56PXw1QIb0LxcTyyOekunYX63mIV5osbYCkZQdkzf_31Kdvc0UwmBJNuKsBoBE9f5d-LgdIYRkzpDatVEup-WAnC5pnU0SQ5Uu3mrKQ/s1600/UbuntuServer-2014-06-22-11-26-43.png" height="480" width="640" /></a></div>
<br />
<br />
37. 跑跑跑<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr4_GmrO88v95h2r4ce6VI4PbaQea8tTES1s7p8PZ-am8006r22ThPjE2uZ2B0KRh3DAGRZFdmbryubMRS5cA3ggFXQdl9IGl8yAMx6cRoIn7gewyz2IGQcJxDoIg982pKq9BPF3V7S3Kj/s1600/UbuntuServer-2014-06-22-11-26-48.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr4_GmrO88v95h2r4ce6VI4PbaQea8tTES1s7p8PZ-am8006r22ThPjE2uZ2B0KRh3DAGRZFdmbryubMRS5cA3ggFXQdl9IGl8yAMx6cRoIn7gewyz2IGQcJxDoIg982pKq9BPF3V7S3Kj/s1600/UbuntuServer-2014-06-22-11-26-48.png" height="480" width="640" /></a></div>
<br />
<br />
38. 然後就可繼續安裝流程,選擇要裝的套件之類。一直到最後要安裝grub開機管理程式時,選擇安裝在MBR上<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_9EQJ0gY2DVRFjeoISJN0Vipb62rRT6vu9e8BPX9AY414MKtxRaViU0ylhviGK9GWILDJ7PkbLZoomJuCTgKg_tBszsyI_-33DDXo59nQp9o3o70xbwF_bs-aJ1M0SD-FoVAFB6s1qKF4/s1600/UbuntuServer-2014-06-22-11-36-07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_9EQJ0gY2DVRFjeoISJN0Vipb62rRT6vu9e8BPX9AY414MKtxRaViU0ylhviGK9GWILDJ7PkbLZoomJuCTgKg_tBszsyI_-33DDXo59nQp9o3o70xbwF_bs-aJ1M0SD-FoVAFB6s1qKF4/s1600/UbuntuServer-2014-06-22-11-36-07.png" height="480" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-Hmbs2yd6SVJlJ9m3vw_4GMfGFYPiMUJ-eyhDNFvg8aHX0jCxNMr4G6b8DiIFb1LV0k5FXL0LSpan3PZtQ_mTYdMt6cZn1jGe9lkbxi-7ZQz1JMs53Bu2FKIKeCb17tRyTVS-cMsQ2uIq/s1600/UbuntuServer-2014-06-22-11-36-15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-Hmbs2yd6SVJlJ9m3vw_4GMfGFYPiMUJ-eyhDNFvg8aHX0jCxNMr4G6b8DiIFb1LV0k5FXL0LSpan3PZtQ_mTYdMt6cZn1jGe9lkbxi-7ZQz1JMs53Bu2FKIKeCb17tRyTVS-cMsQ2uIq/s1600/UbuntuServer-2014-06-22-11-36-15.png" height="480" width="640" /></a></div>
<br />
<br />
這樣就裝完啦!光碟片取出後重新開機吧,這樣我們就完成了以SoftRaid安裝Ubuntu囉!<br />
<br />
<br />
<br />
快樂的重開機後,ㄟ...怎麼會有這個畫面?<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAb0VQIYWZYX56oZCiVm9FGoDp8u2HWVLjcDpYwUpofT6AN2bT_vCR3G5-C4K9w5jgHMm7PiC7u_1Ii3mpdcIap1PfJPVkpREw8lmCVznJCAk50_XvAQkOyP0AkgjvW7C4niKnLwnU78nE/s1600/UbuntuServer-2014-06-22-11-37-01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAb0VQIYWZYX56oZCiVm9FGoDp8u2HWVLjcDpYwUpofT6AN2bT_vCR3G5-C4K9w5jgHMm7PiC7u_1Ii3mpdcIap1PfJPVkpREw8lmCVznJCAk50_XvAQkOyP0AkgjvW7C4niKnLwnU78nE/s1600/UbuntuServer-2014-06-22-11-37-01.png" height="480" width="640" /></a></div>
<br />
<br />
當時看到也嚇了一跳,以為辛苦那麼久結果失敗。但好像按下任意鍵或不理她,五秒後自動繼續,也可以完成開機,系統跑起來好像也沒啥問題,但就是覺得毛毛的,這個問題請<a href="http://eric0806.blogspot.tw/2014/06/ubuntu-1404-diskfilter-writes-are-not-supported.html" target="_blank">看這裡</a>解決。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8168527999844809796.post-51734746110313806192014-06-22T12:28:00.001+08:002014-06-22T12:28:47.541+08:00[筆記] 解決Ubuntu 14.04 使用SoftRAID或LVM開機出現diskfilter writes are not supportedUbuntu Server出了新版14.04,剛好最近公司Mail Server掛點,乾脆就重灌成這版吧,比起不熟悉的OpenSUSE,我還是更習慣Ubuntu<br />
<br />
使用SoftRAID安裝好後,重開機,但這時畫面卻出現這個:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKfnz0SwjPtQhbsTliQh2MfOWop7dmD7J0S_2rwnD0aAIAg94_N_bO8ZGw6MW1lnn5mJlejOIX32lE-zKu1eBTx4n1WL4F45h4xLIQqfpPdCrXh0wN08RGWQvUPIgUfOOgaUgdpX1abzuU/s1600/UbuntuServer-2014-06-22-11-37-01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKfnz0SwjPtQhbsTliQh2MfOWop7dmD7J0S_2rwnD0aAIAg94_N_bO8ZGw6MW1lnn5mJlejOIX32lE-zKu1eBTx4n1WL4F45h4xLIQqfpPdCrXh0wN08RGWQvUPIgUfOOgaUgdpX1abzuU/s1600/UbuntuServer-2014-06-22-11-37-01.png" height="480" width="640" /></a></div>
<br />
<br />
<a name='more'></a>雖然不理她,五秒鐘之後也會繼續開機,功能也都正常,但心裡總是不舒坦,覺得哪裡怪怪的....<br />
<br />
搜尋了一下,這個的確是14.04的Bug。還好,在Bug回報討論串有人提出<a href="https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/1274320/comments/34" target="_blank">已經解決</a>了。<br />
底下就是解法:<br />
<blockquote class="tr_bq">
<span style="background-color: white; color: #333333; font-family: monospace; font-size: 12px; line-height: 18px;">Fix from #28 extended to support LVM (so, I think, it is universal clean fix of this bug). Change recordfail section in /etc/grub.</span><wbr style="background-color: white; color: #333333; font-family: monospace; font-size: 12px; line-height: 18px;"></wbr><span style="background-color: white; color: #333333; font-family: monospace; font-size: 12px; line-height: 18px;">d/00_header to:</span></blockquote>
<pre>if [ "$quick_boot" = 1 ]; then
cat <<EOF
function recordfail {
set recordfail=1
EOF
GRUBMDDEVICE="$(grub-probe --target=disk "${grubdir}")"
GRUBLVMDEVICE="$(grub-probe --target=disk "${grubdir}")"
if echo "$GRUBMDDEVICE" | grep "/dev/md" > /dev/null; then
cat <<EOF
# GRUB lacks write support for $GRUBMDDEVICE, so recordfail support is disabled.
EOF
elif echo "$GRUBLVMDEVICE" | grep "/dev/mapper" > /dev/null; then
cat <<EOF
# GRUB lacks write support for $GRUBLVMDEVICE, so recordfail support is disabled.
EOF
else
FS="$(grub-probe --target=fs "${grubdir}")"
case "$FS" in
btrfs | cpiofs | newc | odc | romfs | squash4 | tarfs | zfs)
cat <<EOF
# GRUB lacks write support for $FS, so recordfail support is disabled.
EOF
;;
*)
cat <<EOF
if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env recordfail; fi; fi
EOF
esac
fi
cat <<EOF
}</pre>
<br />
接著執行update-grub,然後重新開機即可。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8168527999844809796.post-40033869350540617652014-06-20T11:01:00.000+08:002014-06-20T13:36:45.650+08:00Ubuntu 使用 bind9 架設DNS Server這是寫給自己看的安裝筆記,所以比較簡單。<br />
<br />
1. 首先安裝必要套件<br />
<pre>sudo apt-get install bind9 bind9-doc dnsutils</pre>
<br />
2. 進入到/etc/bind目錄,會看到底下目錄結構:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWCCK6yyLRx0EutE7ZZ9mSSa2et2bscJhpD2TdsDBQ4h_PZiF_kQnd3K0qoULKSiWEXsp92PX4Oz4YtxFvc8_ODGhg5rsmSZh5o9sbAfEjHjLrpQK5AoKtP0f79vkHVluZ3OEf0gCVS4Qr/s1600/2014-06-20_093058.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWCCK6yyLRx0EutE7ZZ9mSSa2et2bscJhpD2TdsDBQ4h_PZiF_kQnd3K0qoULKSiWEXsp92PX4Oz4YtxFvc8_ODGhg5rsmSZh5o9sbAfEjHjLrpQK5AoKtP0f79vkHVluZ3OEf0gCVS4Qr/s1600/2014-06-20_093058.png" /></a></div>
<br />
紅框的兩個檔案是我們要修改的。<br />
named.conf.local 裡面可以設定正反解的zone,如果不想改,也可以新增自己喜歡的檔案,但要記得在named.conf裡面include他<br />
named.conf.options 主要在設定dns的一些選項和安全性。<br />
其他的檔案就是預設的一些localhost的正反解相關,這裡我們不用理他沒關係。<br />
<br />
<a name='more'></a><br />
<br />
3. 首先設定named.conf.options,比較重要的是關閉recursion。底下是我的設定<br />
<pre><span class="pre-highborder">acl intra { 192.168.1.0/24; };</span>
options {
directory "/var/cache/bind";
// If there is a firewall between you and nameservers you want
// to talk to, you may need to fix the firewall to allow multiple
// ports to talk. See http://www.kb.cert.org/vuls/id/800113
// If your ISP provided one or more IP addresses for stable
// nameservers, you probably want to use them as forwarders.
// Uncomment the following block, and insert the addresses replacing
// the all-0's placeholder.
// forwarders {
// 0.0.0.0;
// };
//========================================================================
// If BIND logs error messages about the root key being expired,
// you will need to update your keys. See https://www.isc.org/bind-keys
//========================================================================
dnssec-validation auto;
auth-nxdomain no; # conform to RFC1035
// listen-on-v6 { none; };
listen-on port 53 { any; };
allow-query { any; };
allow-query-cache { none; };
<span class="pre-highborder">recursion no; //allow-recursion { intra; };</span>
also-notify { };
};
</pre>
<br />
最上面的紅框,是指定ACL群組,可以指定多個IP,等於當作變數來使用。<br />
下面的紅框,recursion no和allow-recursion只能指定一個,要嘛全關(開),要嘛就只有特定IP才開,裡面放的變數就是上面acl所指定的。這裡我是把他全關了。<br />
<br />
4. 接著設定zone,一個domain還包含正解和反解,所以會有兩個以上的zone。可以把zone的設定寫在named.conf.local底下。<br />
底下是範例:<br />
<pre><span class="pre-highborder">acl allow-trans-ip { x.x.x.x; y.y.y.y; };</span>
//---正解的區域---
//主要,如果要設定的zone是主要區域,就看這部分
zone "domain1.com" {
type master; //master為主要區域,也可設定為slave就是次要區域,可從主要區域複製資料過來
file "/etc/bind/zones/domain1.com.fwd"; //指定dns檔案位置,檔名可自取,但如果有多個zone要設定,檔名格式最好一致
//底下的是master才要設定,指定哪些IP可以從此台master複製資料,不然全開,網路所有DNS都可以從這裡取得資料也太危險
allow-transfer {
allow-trans-ip; //這個變數就是上面紅框處指定的
};
}
//次要,如果要設定的zone是要從master取得資料的次要區域,就看這部分
zone "slave.com" {
type slave;
file "slave.com.fwd";
//次要區域的檔案有點不太一樣,如果使用絕對路徑,應該會發生無法寫入(permission deny)的錯誤
//所以我們只使用檔名,那麼路徑呢?ubuntu預設是放在/var/cache/bind/底下
//可在named.conf.options底下看到directory的設定就是預設檔案存放路徑
//底下的是slave才要設定
<span class="pre-highborder">masters { x.x.x.x; };</span> //指定master是哪幾台,一樣可用acl指定IP群組
}
//...
//---反解的區域---
zone "3.2.1.in-addr.arpa" { //反解的命名規則,如果IP是1.2.3.x,那麼就要倒過來寫變成3.2.1.in-addr.arpa,格式要對
type master; //這裡就只寫master了,要設定slave的話跟上面一樣
file "/etc/bind/zonez/1.2.3.rev"; //檔名一樣可自取,多個zone的話檔名格式最好一致
allow-transfer { allow-trans-ip; };
};
</pre>
<br />
<br />
5. 接下來就是編輯每個zone的檔案了。如果是master的話一定要編輯,不然沒資料怎麼讓slave抓啊~<br />
如果是slave的話檔案不存在也可,從master抓來之後會自己產生,但要確定檔案存放的目錄能夠讓named有寫入權限。<br />
<br />
底下是正解檔案範例:<br />
<pre>$TTL 3600
;指定SOA紀錄
@ IN SOA ns1.domain1.com. webadmin.domain1.com. ( ;注意webadmin.domain1.com其實是email,只是把@改成.,所以意思是webadmin@domain1.com
2014062007 ;Serial,每次編輯該檔都要改序號,這個是為了通知slave,master有改變,要他們來更新資料,建議格式是YYYYMMDDnn,nn為當日流水號
1800 ;Refresh
900 ;Retry
86400 ;Expire
3600 );Default TTL
;指定NS紀錄
;一般DNS都會有兩台備用,所以如果有第二台當slave的話也記得要把該台寫到NS紀錄裡
@ IN NS ns1.domain1.com.
@ IN NS ns2.domain2.com.
;指定A紀錄
@ IN A 1.2.3.4 ;@表示該domain名稱,在本例也就是domain1.com
ns1.domain1.com. IN A 1.2.3.4 ;master的IP
ns2.domain1.com. IN A 1.2.3.5 ;slave的IP
web.domain1.com. IN A 1.2.3.6
mail1.domain1.com. IN A 1.2.3.7
main2.domain1.com. IN A 1.2.3.8
;指定CNAME
www.domain1.com. IN CNAME web.domain1.com.
;指定MX
@ 3600 IN MX 1 mail1.domain1.com. ;數字1表示優先權最大
@ 3600 IN MX 5 main2.domain2.com.
</pre>
<br />
底下是反解檔案範例:<br />
<pre>$TTL 3600
;指定SOA紀錄
@ IN SOA ns1.domain1.com. webadmin.domain1.com. (
2014062003
1800
900
86400
3600 )
;
;指定NS紀錄,SOA跟NS的寫法都跟正解一樣
@ IN NS ns1.domain1.com.
@ IN NS ns2.domain1.com
;指定PTR紀錄,反解裡面就只有PTR紀錄,說明IP要對應到哪個名稱
4.3.2.1.in-addr.arpa. IN PTR ns1.domain1.com. ;注意最前面的IP順序是相反的
4 IN PTR ns2.domain1.com. ;也可以用簡寫,只寫IP最後一碼即可,但注意簡寫後面不可加.
;...
</pre>
<br />
6. 接著重新啟動一下:/etc/init.d/bind9 restart<br />
這樣就啟動我們的dns服務了,如果是slave的話也就自動向master抓好資料了。<br />
<br />
參考資料:<br />
<a href="http://linux.vbird.org/linux_server/0350dns.php" target="_blank">鳥哥</a><br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8168527999844809796.post-47369030639196351282014-05-08T14:30:00.000+08:002014-07-16T22:35:46.955+08:00給windows使用者的簡易Git環境架設<div class="separator" style="clear: both; text-align: center;">
<a href="http://git-scm.com/images/logos/downloads/Git-Logo-2Color.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://git-scm.com/images/logos/downloads/Git-Logo-2Color.png" height="133" width="320" /></a></div>
<br />
<br />
我們公司屬於小型開發團隊,使用windows開發.net or asp程式,而開發的專案都屬於封閉專案,不能對外公開,所以要導入版本控制還是自己架設版控的Server比較保險。<br />
<br />
隱約還記得前一篇文章講到架設比較<a href="http://eric0806.blogspot.tw/2014/05/ubuntu-svn-server-with-websvn.html" target="_blank">簡易的SVN Server</a>(明明就沒幾天),現在閱讀完介紹Git的書之後,才發現原來自己大錯特錯! Git Server的架設超簡單的啊!<br />
<br />
雖然網路上搜尋如何架設Git Server的文章很多,但幾乎都只寫給Linux user看的,好我知道你們很強對指令都很熟悉,但難道使用windows的開發團隊就只能旁邊畫圈嗎?<br />
<br />
windows使用者看了google來的Git教學文章,應該通常第一個疑問就是:<br />
<blockquote class="tr_bq">
<b><span style="color: #674ea7;">「那些指令在哪打?命令提示字元(cmd)裡面沒有耶!」</span></b></blockquote>
對,所以假設你跟我一樣是超新手,底下從頭開始,順便幫自己筆記一下...<br />
<br />
<a name='more'></a>環境和需求就大概如下:<br />
<ol>
<li>想用Git</li>
<li>一個不對外公開的版控Server<br /><span style="color: #444444; font-size: x-small;">其實就個人使用,並不一定需要Server,但如果需要與別人共同開發專案,或是自己開發環境的電腦不只一台,那麼還是架個Server吧。</span></li>
<li>使用windows環境的client端(每個開發者的工作電腦)</li>
<li>人數不多</li>
<li>方便管控帳號</li>
<li>只利用ssh連線即可</li>
</ol>
<div>
<br /></div>
<div>
所以這篇文章主要就是給符合上述條件的人看。<br />
<br />
<span style="font-size: large;"><b>建議:</b></span>底下文章雖然是無腦照著做就可以架好,但要知道為何這麼做,最好是先了解一下Git在做啥,可以看<a href="http://git-scm.com/book/zh-tw" target="_blank">這本中文的電子書</a>,看完就了解Git怎麼運作啦,如果嫌太多想慢慢看,最起碼也要看到第三章完才行喔!<i><span style="color: #999999;">(如果全部看完,不錯,也不用看這篇文章了,因為電子書裡面全部都有寫XD)</span></i><br />
<br />
初步了解Git後,我們就趕快進行吧~</div>
<br />
<br />
流程:<br />
<ol>
<li>windows os可用的Git client環境</li>
<li>設定Git Server</li>
<li>設定client端連線</li>
<li>設定專案環境與使用者</li>
<li>測試一下</li>
<li>開始使用!快用啊!</li>
</ol>
<div>
<br /></div>
<br />
<h3>
一、建立好windows底下Git Client環境</h3>
<br />
<div>
首先必須裝好最基本的Git環境,請先到<a href="http://git-scm.com/downloads" target="_blank">http://git-scm.com/downloads</a>點下Download,下載一個Git client端。<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhNviSbB6buHHtQfBCY0RSw4L06sMCbCdjyCKVbajdXspWzfLxOiX3H5PmGDtyLdOerJtSohQHMW2BkHUu5uC8hkdGiq9j_GC4llMQs4c7c_TrzSWEUgkB4pYYlwcK8eXQPKfeG1h8AKd_/s1600/2014-05-08_100810.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhNviSbB6buHHtQfBCY0RSw4L06sMCbCdjyCKVbajdXspWzfLxOiX3H5PmGDtyLdOerJtSohQHMW2BkHUu5uC8hkdGiq9j_GC4llMQs4c7c_TrzSWEUgkB4pYYlwcK8eXQPKfeG1h8AKd_/s1600/2014-05-08_100810.png" height="386" width="640" /></a></div>
<br />
下載回來當然就開始安裝啦,有需要特別說明的會在底下提示,沒有的話就是按下一步即可。<br />
<br />
<br />
這裡可把紅框處打勾,這樣在打指令的視窗的字型會比較好看<i>(爽度問題)</i><br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWNvBwlrPhOqwLq5FzRXg5S5TJS_VSy74PmDlJ1OznFBInpFDzZ4L9V1rWhiUTP7pFla42CQ9d1D-JHxWcdQpz8rPz29upf40MIlAeDV768louEFbmFy6qR6DEzVka3TN-2AH0qv611ayH/s1600/2014-05-08_101919.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWNvBwlrPhOqwLq5FzRXg5S5TJS_VSy74PmDlJ1OznFBInpFDzZ4L9V1rWhiUTP7pFla42CQ9d1D-JHxWcdQpz8rPz29upf40MIlAeDV768louEFbmFy6qR6DEzVka3TN-2AH0qv611ayH/s1600/2014-05-08_101919.png" /></a></div>
<br />
<br />
選擇第一個即可,盡量不要讓Git指令干擾原本的cmd<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgumth6vO1kZSm_Va4q0QQhpKXb9LaVHUqEu_Trq7I-KnRStNotl3ZcsWc9_Mm1fMApmheZPBZIXHDCE0ZSQMNxS8sd62JPM3JLEtzjGbWpS8JdOPfmXJNYAVlTzc11Lm-GuGii2oaCHiB2/s1600/2014-05-08_101957.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgumth6vO1kZSm_Va4q0QQhpKXb9LaVHUqEu_Trq7I-KnRStNotl3ZcsWc9_Mm1fMApmheZPBZIXHDCE0ZSQMNxS8sd62JPM3JLEtzjGbWpS8JdOPfmXJNYAVlTzc11Lm-GuGii2oaCHiB2/s1600/2014-05-08_101957.png" /></a></div>
<br />
<br />
這裡就很重要了,如果你確定所有的開發人員都是windows電腦,未來,未來的未來也不會有非windows系統加入專案,那麼你可以選第三項,這樣不會有轉換換行符號的問題。<br />
不過保險點我們還是選擇第一項即可。這樣非windows使用者在從server讀取專案下來的時候也不會有換行符號的問題。<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5_iJmorEgZMrtFuc7iASbcinx0fjCQeU5ULOuIyUI4Yj0EsZYGlJ2S1fc1Z8RRwxsaulL-pZuBqx1KkKBzpiSpaOYTbirPkebT-1h8XarAb7SEM7-hre9fE5ucY8-tsrBBfmTQu_pGJtU/s1600/2014-05-08_102109.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5_iJmorEgZMrtFuc7iASbcinx0fjCQeU5ULOuIyUI4Yj0EsZYGlJ2S1fc1Z8RRwxsaulL-pZuBqx1KkKBzpiSpaOYTbirPkebT-1h8XarAb7SEM7-hre9fE5ucY8-tsrBBfmTQu_pGJtU/s1600/2014-05-08_102109.png" /></a></div>
<br />
<br />
接著讓他跑完即可。<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuT9d3h6rl-dpPwSNX891i4zN51Z-kuLhk2E5JJ9gIfEH0unXSYRiEVKEL0INFRvjGPFsJyTRWaSHge8XwFzlt7MggbBAd0L33ZWIbobgWNF_z3sidYH0wSEPU1Mr0saCQ5VQUleGvbsih/s1600/2014-05-08_102119.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuT9d3h6rl-dpPwSNX891i4zN51Z-kuLhk2E5JJ9gIfEH0unXSYRiEVKEL0INFRvjGPFsJyTRWaSHge8XwFzlt7MggbBAd0L33ZWIbobgWNF_z3sidYH0wSEPU1Mr0saCQ5VQUleGvbsih/s1600/2014-05-08_102119.png" /></a></div>
<br />
<br />
到此,windows環境的Git就已經裝好囉!<br />
<br />
<br />
<h3>
二、設定Git Server</h3>
雖然你可能不願意也不想碰Linux,但為了使用Git,我們還是必須使用Linux當Server才行,因為他本身就提供了ssh的支援。如果你有辦法讓windows支援ssh連入那其實也行,但是太麻煩了,所以還是用Linux吧!<br />
<br />
我們這裡的範例使用Ubuntu Server,可以用公司不要的小電腦來裝,怕不保險的話也可以使用Amazon EC2弄個最簡單的Ubuntu Server來跑。<br />
<br />
如果你是自己安裝,在選擇套件的時候只要記得OpenSSH有打勾即可,其他所有的服務都不用選。反正這台Server只要開22 Port就可以了。<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghAXMfGcXeKK6LDwuq23rxyTFUS5dWq_KG0vlG-a20TCdEErbxmw1YVXTk0QF-yHd30YwOesVjnkM-bvPuRWsQwsXEuRmtQn7uV5Nnaqdkv1Q4sh42uOb98w8WRUiMr6lHfCdzcjqCDVcF/s1600/UbuntuServer-2014-05-08-12-45-25.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghAXMfGcXeKK6LDwuq23rxyTFUS5dWq_KG0vlG-a20TCdEErbxmw1YVXTk0QF-yHd30YwOesVjnkM-bvPuRWsQwsXEuRmtQn7uV5Nnaqdkv1Q4sh42uOb98w8WRUiMr6lHfCdzcjqCDVcF/s1600/UbuntuServer-2014-05-08-12-45-25.png" height="480" width="640" /></a></div>
<br />
<br />
底下的操作都是在Server端,採用文字介面輸入指令完成。<br />
<br />
我測試Server的相關環境參數<span style="font-size: x-small;">(底下說明與截圖都在此環境下,操作時請依自己環境修改)</span>:<br />
IP:<span style="color: red;">192.168.140.131</span> <i><span style="font-size: x-small;">(依你自己環境的IP而定啊XD)</span></i><br />
管理者帳號:<span style="color: blue;">e</span><span style="color: blue;">ric </span><i><span style="font-size: x-small;">(依你自己環境的帳號而定啊XD)</span></i><br />
Git帳號:<span style="color: purple;">git</span><br />
版本庫放置位置:<span style="color: #6aa84f;">/home/git/repositories</span><br />
所需套件:Git<i>(Git主要程式)</i>、Gitosis<i>(好用的簡易權限、金鑰管控套件)</i><br />
<br />
<span style="color: red; font-size: large;"><b>注意!</b></span>因為帳號也有個git,所以版本控制的Git,<b>G</b>會是大寫,而帳號git的<b>g</b>則是小寫,避免分不清哪個是哪個(本文所有的git都是如此分)。<br />
<br />
再來安裝必要的東西<br />
<pre>sudo apt-get install git-core python-setuptools</pre>
<br />
建立git帳號<br />
<pre>sudo adduser --home /home/git --disabled-password git</pre>
按下幾次enter就完成git帳號建立。<br />
<br />
這邊講解一下為甚麼要如此做。其實如果真的是超小型的團隊,可能只有兩三個人,那不需建立git帳號也行,直接在Server上開好每個人的帳號,讓他們用自己的帳號登入即可。但考慮到管理的麻煩,日後擴編或是其他因素等等,如果用此法,那還要管理一堆server上的帳號,增加自己的負擔;還有個最主要的重點就是:每次push到server上都要輸入密碼啊!煩死了,小型封閉環境,ssh就夠安全了我不想每次都要輸入一次密碼。所以不建議如此做。就讓大家都用git帳號登入。<br />
<br />
而Gitosis套件就是為了解決此問題而產生的,他的管理系統非常好用,可以讓我們輕鬆的管理每個人的連線,而不需實際在主機上新增/移除帳號,這樣大家都可以用git@server:xxx.git這樣的格式來取得或上傳版本庫到Server上。管理者也可以輕鬆地維護帳號,只要把收到的金鑰檔放到本機資料夾,編輯一下設定檔,再同步回去Server即可。(這部分後面會提到,很酷!)<br />
<br />
所以我們馬上來安裝一下Gitosis<br />
<br />
下載最新Gitosis套件並且安裝:<br />
<pre>cd ~
git clone https://github.com/tv42/gitosis.git
cd gitosis
sudo python setup.py install</pre>
<br />
Gitosis預設會把/home/git這個目錄裡面的repositories資料夾當成所有repository根目錄,以後所有的專案就都放在裡面。<br />
<br />
到此,Git server已經將近完工,只差連線設定和產生專案資料夾了,快吧!<br />
<br />
<br />
<h3>
三、設定連線</h3>
<br />
server端和client端都要做設定,這裡先從client端開始<br />
<br />
<h4>
client端:</h4>
在桌面或任一資料夾空白處按滑鼠右鍵,在出現的選單裡面選擇「Git Bash」<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHGz6pn4GIRN7ojL6-HKDDoCH0gfpFps0tGmneWmFLkuJpeRNnj0rTQG3SaTjbv-6PiWZhhGwaHQ7TdC5-1I_C0_TMkAoLUGoHspNI-6oBoL0z9XvZYAi34RdhpPXVqB0BjdeZPLom2LU8/s1600/2014-05-08_112432.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHGz6pn4GIRN7ojL6-HKDDoCH0gfpFps0tGmneWmFLkuJpeRNnj0rTQG3SaTjbv-6PiWZhhGwaHQ7TdC5-1I_C0_TMkAoLUGoHspNI-6oBoL0z9XvZYAi34RdhpPXVqB0BjdeZPLom2LU8/s1600/2014-05-08_112432.png" /></a></div>
<br />
<br />
會跳出一個類似Linux的文字操作視窗,未來所有Git相關的操作我們都必須利用它來完成。這也解決了文章開頭第一個疑問,要在哪裡打指令?就是這裡啦!<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBKmPAwKFDT8XvMxN0VXxzji8sE27b6JSODZNA-RN1Tm_Egrxg67sv_RtDY2BpiseO2PwjZa2n18GeZEsh8bHI35uDa9huM63KuQSP2uw1Bmurl5X16KteZ1T_CQNj11eaMrirLhv4TiEr/s1600/2014-05-08_112833.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBKmPAwKFDT8XvMxN0VXxzji8sE27b6JSODZNA-RN1Tm_Egrxg67sv_RtDY2BpiseO2PwjZa2n18GeZEsh8bHI35uDa9huM63KuQSP2uw1Bmurl5X16KteZ1T_CQNj11eaMrirLhv4TiEr/s1600/2014-05-08_112833.png" height="371" width="640" /></a></div>
<br />
<br />
首先我們產生一個自己的公鑰與私鑰對,每台要連線到Server的「人」都要照底下步驟1~3產生一次。<br />
為什麼要特別註明是「人」呢?因為ssh連線是認金鑰的,就算你有很多台電腦都需要連線到Git Server(譬如公司和家裡的桌機和筆電),產生自己的金鑰也只要做一次,之後只要把自己的私鑰複製到其他台電腦的正確路徑就可以連線了。<br />
<br />
<br />
1. 輸入指令:<br />
<pre>ssh-keygen -t rsa -C "your@email"</pre>
<br />
<blockquote class="tr_bq">
參數-C的意思是指定這個金鑰的識別碼,預設是「帳號@這台電腦的主機名稱」,但我們為了好管理以「人」為主的金鑰,而不是以「電腦」為主,所以用每個人唯一的識別值Email比較好管理。</blockquote>
他會問你要把key放在哪,直接按enter用預設的位置就行。<br />
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPSlCYlxvevznl-sjF-YJOBPc9PKaF5nuISE399PbfG06vaXOKdeK7VYc3hrpaJaWcXijm6yYVMbn-OEyWVnrEpkt_okY1TmdqfCor5bDdzfeuinLow5Aln2WhFcMBYO464kwPMI1FAvTa/s1600/2014-05-09_113826.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPSlCYlxvevznl-sjF-YJOBPc9PKaF5nuISE399PbfG06vaXOKdeK7VYc3hrpaJaWcXijm6yYVMbn-OEyWVnrEpkt_okY1TmdqfCor5bDdzfeuinLow5Aln2WhFcMBYO464kwPMI1FAvTa/s1600/2014-05-09_113826.png" height="370" width="640" /></a></div>
<br />
<br />
2. 再來會問你這個金鑰是否要密碼,直接按兩次enter,這樣日後每次push到server就不用都要輸入密碼。<br />
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvypaIa_mpDu0AmLHkRswA5T0I6qu8LyvyJytwh14u6SeNNtnUne0VH_kak_nTyEoyMYSc62tL9DzIDtl5vosG17yHELdOvP7ccNF3pQjlJI5FJzWYAtrYJmpfEw_9FHvB6SJXir_D1xe-/s1600/2014-05-09_113909.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvypaIa_mpDu0AmLHkRswA5T0I6qu8LyvyJytwh14u6SeNNtnUne0VH_kak_nTyEoyMYSc62tL9DzIDtl5vosG17yHELdOvP7ccNF3pQjlJI5FJzWYAtrYJmpfEw_9FHvB6SJXir_D1xe-/s1600/2014-05-09_113909.png" height="370" width="640" /></a></div>
<br />
<br />
3. 產生完成,會有兩個檔案,副檔名有.pub的表示是公鑰,沒有副檔名的是私鑰,請好好保存你的私鑰。<br />
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxRrXxE0ajZ2ErvWHcEK1JjM4V7kDhl6v9hYhpSuBeN8GjD2AefzV_wUQCRcd-lsZJcuC5udpM2XUOIhp9yrV-NoL-BukcCm8WwXOpWNX4_h9vXRdaEzjdCimdm3a3bara_myKvgteAfxH/s1600/2014-05-09_114048-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxRrXxE0ajZ2ErvWHcEK1JjM4V7kDhl6v9hYhpSuBeN8GjD2AefzV_wUQCRcd-lsZJcuC5udpM2XUOIhp9yrV-NoL-BukcCm8WwXOpWNX4_h9vXRdaEzjdCimdm3a3bara_myKvgteAfxH/s1600/2014-05-09_114048-1.png" height="370" width="640" /></a></div>
<br />
<br />
<span style="color: red; font-size: large;">如果你是Git Server管理者,才需要做底下步驟,如果只是普通使用者,那麼只需要做到此,然後把產生的id_rsa.pub寄給管理者就行了。</span><br />
<br />
4. 接著要把管理者公鑰上傳到Server上,輸入<br />
<pre>cd <span class="pre-highborder">~/.ssh</span>
scp id_rsa.pub <span class="pre-highborder">eric</span>@<span class="pre-highborder">192.168.x.x</span>:<span class="pre-highborder">/tmp/id_rsa.user1.pub</span></pre>
第一個紅框就是剛才上面我們產生公私鑰的路徑,第二個紅框是Server上的管理者帳號(因為它才有權限寫入),第三個是Server的IP,第四個則是Server上暫時存放公鑰的路徑和檔名(檔名可以修改,這樣比較好知道是誰的公鑰,也避免被覆蓋)。<br />
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn1CNlmZiehBVkzwB3YpCBg9xRI6cDqF54FUfyUmU8o28wjKpLFnTxghN2I1e_Pc5adaolyp1107JQSnm_fLAgwF9VvPial6vzbtxy6mMO_dbsYJHNRCG0uqPH27ewlIg67p8TRcu5U1Vn/s1600/2014-05-09_114048.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn1CNlmZiehBVkzwB3YpCBg9xRI6cDqF54FUfyUmU8o28wjKpLFnTxghN2I1e_Pc5adaolyp1107JQSnm_fLAgwF9VvPial6vzbtxy6mMO_dbsYJHNRCG0uqPH27ewlIg67p8TRcu5U1Vn/s1600/2014-05-09_114048.png" height="370" width="640" /></a></div>
<br />
<br />
5. 首次使用ssh連線該server的話,他會問你是否要信任這台server,請輸入完整yes<br />
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5-tjqnvRbQgq5iGPomwTGP9M3cUq2mnHmSnt9vK14vrV9-FM_6iwblf5yWS9upAeDrTOYmMRSSMgj1QZqunH969NnoBbEEq1o0IIWLeVVl7yEpDb38tmVIYKW71kEJts162W5LHw5Jiz6/s1600/2014-05-09_114110.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5-tjqnvRbQgq5iGPomwTGP9M3cUq2mnHmSnt9vK14vrV9-FM_6iwblf5yWS9upAeDrTOYmMRSSMgj1QZqunH969NnoBbEEq1o0IIWLeVVl7yEpDb38tmVIYKW71kEJts162W5LHw5Jiz6/s1600/2014-05-09_114110.png" height="370" width="640" /></a></div>
<br />
<br />
6. 然後就會問你管理者密碼了,輸入之後就可上傳成功<br />
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7O0Gkos8hYdgwhNG7S-G97xLhc5-PorcndxT-6icwak5DOIA5Bgrs7FBWbuFqaDSvx6l-_ZUP6meAuNEd4Me3YEIiEMdvJjEfAM9KRY69kIbqk-ugc4yrYL5yTIgpgN8x0HFSYVZvMqzq/s1600/2014-05-09_114144.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7O0Gkos8hYdgwhNG7S-G97xLhc5-PorcndxT-6icwak5DOIA5Bgrs7FBWbuFqaDSvx6l-_ZUP6meAuNEd4Me3YEIiEMdvJjEfAM9KRY69kIbqk-ugc4yrYL5yTIgpgN8x0HFSYVZvMqzq/s1600/2014-05-09_114144.png" height="370" width="640" /></a></div>
<br />
到這邊client端的連線設定就完成了。接著讓我們回到server上,做完剩下一點點的小設定。<br />
<br />
<h4>
Server端:</h4>
<br />
1. 使用管理者登入後,到我們剛剛上傳的資料夾去看,應該就可看到剛剛上傳上來的公鑰檔了。<br />
<pre>eric@ubuntu:~$ cd /tmp
eric@ubuntu:/tmp$ ll
總計 16
drwxrwxrwt 2 root root 4096 5▒▒ 8 13:31 ./
drwxr-xr-x 22 root root 4096 5▒▒ 8 12:41 ../
-rw-r--r-- 1 eric eric 395 5▒▒ 8 13:22 id_rsa.user1.pub
eric@ubuntu:/tmp$
</pre>
<br />
<br />
2. 接著我們就要來初始化Gitosis<br />
<pre>eric@ubuntu:~$ <span class="pre-highborder">sudo -H -u git gitosis-init < /tmp/id_rsa.user1.pub</span>
[sudo] password for eric:
Initialized empty Git repository in /home/git/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /home/git/repositories/gitosis-admin.git/
eric@ubuntu:~$ <span class="pre-highborder">sudo chmod 700 /home/git</span>
eric@ubuntu:~$ <span class="pre-highborder">sudo chmod 700 /home/git/.ssh</span>
eric@ubuntu:~$ <span class="pre-highborder">sudo chmod 600 /home/git/.ssh/authorized_keys</span>
</pre>
<br />
第一行sudo指令,-H表示切換到使用者的家目錄執行,哪個使用者?就是後面-u參數所帶的git帳號。<br />
最後三行指令,是確保git的權限,這在某些Linux上如果沒有如此設定,會無法連線成功<span style="color: #666666; font-size: x-small;">(像如果是在QNap NAS上面架設的話,這三個資料夾的權限一定要如此設定,不然怎樣都無法讓你連線,我就是為了這個問題搞了好幾個小時....)</span><br />
這樣我們就完成了Gitosis的初始化,和建立管理者的連線設定了。<br />
<br />
此時稍微測試一下,回到你的電腦打開Git Bash,輸入<br />
<pre>ssh git@ServerIP</pre>
<br />
如果Gitosis有正確載入你的公鑰的話,應該會顯示底下訊息:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiirKuij1yfF4KD-kT-ePZershrIaHlDSs1aDGua51BezyNbGE6juBhC0-Oe5pHNkSNRmab0zRtzjo6tQl4anE9-K_bohK5o-5b6qDJfFQsjR0cbt6qnA49s1hvxVb8sWP_ktwzL-YNgZwS/s1600/2014-05-12_144706.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiirKuij1yfF4KD-kT-ePZershrIaHlDSs1aDGua51BezyNbGE6juBhC0-Oe5pHNkSNRmab0zRtzjo6tQl4anE9-K_bohK5o-5b6qDJfFQsjR0cbt6qnA49s1hvxVb8sWP_ktwzL-YNgZwS/s1600/2014-05-12_144706.png" height="370" width="640" /></a></div>
<br />
表示ssh連線正常。但Gitosis不允許除了Git以外的操作,所以會中斷連線。<br />
<br />
<br />
<h3>
四、管理Gitosis</h3>
<br />
我們前面說過,Gitosis有很酷的管理方式,他本身就是一個Git Repository,只要我們clone回來,修改裡面的檔案,再push回Git Server,他就會幫我們作好相關設定(譬如新增連線的公鑰、專案權限設定)。<br />
<br />
如果你是管理者(會照這篇文章做的應該就是管理者吧XD),馬上就來試一下看:<br />
<br />
首先我們把Server上的gitosis-admin專案給clone到本機電腦:<br />
<pre>git clone git@192.168.140.131:gitosis-admin.git</pre>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggw0cU4JB9TDxGzOte2ZxC1k4cRoQ3uCnKCDwUo7FNWtm3cHtMlc-XpymsEGgh1L22lfuZHLGfK7fJpwJraVIaCTCgznFZnB6rN6ecSfXT35LVtT1gvQPACKmAdM7Wp55IjOq_ZscBtkgL/s1600/2014-05-12_140237.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggw0cU4JB9TDxGzOte2ZxC1k4cRoQ3uCnKCDwUo7FNWtm3cHtMlc-XpymsEGgh1L22lfuZHLGfK7fJpwJraVIaCTCgznFZnB6rN6ecSfXT35LVtT1gvQPACKmAdM7Wp55IjOq_ZscBtkgL/s1600/2014-05-12_140237.png" height="370" width="640" /></a></div>
<br />
<br />
接著到專案目錄看一下,可看到底下結構:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb_VywyMXD8CiV6BeCccAGSwqhlV1SNrb7ZatDaaNCIWopRAieugawYUk3BEsXbMy2IHDKsBhvmWnyIT-g5leIPKBC0GJuQDaeD74ydob4ZDyWon4KEQPdp8QZTk_9_TMsfNQaFW8Ca7Hg/s1600/2014-05-12_140358.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb_VywyMXD8CiV6BeCccAGSwqhlV1SNrb7ZatDaaNCIWopRAieugawYUk3BEsXbMy2IHDKsBhvmWnyIT-g5leIPKBC0GJuQDaeD74ydob4ZDyWon4KEQPdp8QZTk_9_TMsfNQaFW8Ca7Hg/s1600/2014-05-12_140358.png" height="435" width="640" /></a></div>
<br />
<br />
keydir目錄裡面存放目前所有Git使用者的公鑰,以後要加入使用者,只要把他們的公鑰丟到這個目錄,編輯好設定檔之後,再同步回去到Server上即可。<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEIbyMsB6d1nuC6rWSq43mt-NS1xMq1E9d4aNDkAGjzP1-mWpcm0Df-9s5MoAMFoPHB1QpupKsZPvoAL_GlA4A84dv9WUlwUh70-cCMpal3TFuCXfp8iiuAwZXKqxJjYs5zULTbu3uUnvu/s1600/2014-05-12_140542.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEIbyMsB6d1nuC6rWSq43mt-NS1xMq1E9d4aNDkAGjzP1-mWpcm0Df-9s5MoAMFoPHB1QpupKsZPvoAL_GlA4A84dv9WUlwUh70-cCMpal3TFuCXfp8iiuAwZXKqxJjYs5zULTbu3uUnvu/s1600/2014-05-12_140542.png" height="434" width="640" /></a></div>
<br />
gitosis.conf就是主要的設定檔,我們可以編輯裡面的設定來加入專案或使用者。<br />
這是剛初始化好的內容,裡面指定了gitosis-admin管理員的公鑰名稱,只允許一個管理員來管理gitosis-admin<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitAuAf20rHR42sv1Bhoprt_sq6TUJDMD0IsbY9m3dHmRporJMq0T8z4lz1eKtN97HaKr-gJ-hv471ndE2tseOMIApoWpfT5Volq0jB1tXz-TZ0uE7DHRg0UmW18-ebvVOAhmgOl6RJie7I/s1600/2014-05-12_140725.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitAuAf20rHR42sv1Bhoprt_sq6TUJDMD0IsbY9m3dHmRporJMq0T8z4lz1eKtN97HaKr-gJ-hv471ndE2tseOMIApoWpfT5Volq0jB1tXz-TZ0uE7DHRg0UmW18-ebvVOAhmgOl6RJie7I/s1600/2014-05-12_140725.png" /></a></div>
<br />
我們首先來看一下要怎麼新增一個使用者:<br />
假設要新增的使用者email是dp1@email.com,讓他產生好自己的金鑰檔(注意-C參數),然後從他那取得他的公鑰檔,重新命名為dp1@email.com.pub之後,放到keydir目錄內。<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFZ6WT2gLkXgcfaFq6XppHhj6UhOLVKRjUkoUwCGlRyKbscuqqN0ln1q3qbKps-gQteUse9HEyBdT6PAL0QhRfvvkEZeioTxV45sHGQCQm5bouVtBMHd0nPROI0CNVTxa3zg8YdYjR-N0r/s1600/2014-05-12_142515.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFZ6WT2gLkXgcfaFq6XppHhj6UhOLVKRjUkoUwCGlRyKbscuqqN0ln1q3qbKps-gQteUse9HEyBdT6PAL0QhRfvvkEZeioTxV45sHGQCQm5bouVtBMHd0nPROI0CNVTxa3zg8YdYjR-N0r/s1600/2014-05-12_142515.png" height="414" width="640" /></a></div>
<br />
接著編輯gitosis.conf,加入專案名稱和擁有寫入權限的使用者:<br />
專案名:project1<br />
使用者:your@email.com, dp1@email.com<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPeyivNxAEegqmZC-ShfUL3zAyLt5O83M7-pJDPC8rVLG7yg_OQS135w7j5JZfHfN_VgeBc9jYI4kTfETkFcoCmuOC5CpdKgu96LWHrR5m8lMiSLeuKHHR7Z3eqIGTa5zbTjwA4LgycvEm/s1600/2014-05-12_142943.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPeyivNxAEegqmZC-ShfUL3zAyLt5O83M7-pJDPC8rVLG7yg_OQS135w7j5JZfHfN_VgeBc9jYI4kTfETkFcoCmuOC5CpdKgu96LWHrR5m8lMiSLeuKHHR7Z3eqIGTa5zbTjwA4LgycvEm/s1600/2014-05-12_142943.png" /></a></div>
<br />
接著提交更新,並同步回Server:<br />
<pre>git add .
git commit -m '看這次做了那些修改,描述一下'
git push origin master</pre>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0yAVgk7R5p-pJNTKhHMrVn0xTw7CuJ7CKmmm4p4EkESAjfU2dVqG3568LRwmo39EyiBsB0IhW0qwMuw7r6LfQ3ijRYe2lyZX_kOQiuhE1dIQPFs7H_Tq_uIAlKQQr9ipw1atFu1G9c6F_/s1600/2014-05-12_143911.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0yAVgk7R5p-pJNTKhHMrVn0xTw7CuJ7CKmmm4p4EkESAjfU2dVqG3568LRwmo39EyiBsB0IhW0qwMuw7r6LfQ3ijRYe2lyZX_kOQiuhE1dIQPFs7H_Tq_uIAlKQQr9ipw1atFu1G9c6F_/s1600/2014-05-12_143911.png" height="370" width="640" /></a></div>
<br />
同步回Server之後,Gitosis就會自動幫我們該做的事情都做好了,包括增加新的使用者公鑰到git帳號,做好權限,甚至不用我們自己開Repository,在本地端建立好之後Push到Server上,若是這個Repository不存在則會自己建立,超屌吧!<br />
<br />
<h3>
五、測試一下</h3>
<br />
再來我們可以測試一下是否成功了,隨便使用任何一台具有連線Git Server權限的電腦,先在本機上產生上面所說的project1 Git倉庫:<br />
<br />
1.先到你專案目錄產生一個project1資料夾<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVXNaDawKog7-QB19Ib-QylfvqXsABa86fK2-yXKLT_ekCONMBboPKvzeC6R6VgxzXN-rYaVc8G2thDinet9D7QKbMMkJ7-tVOhiwJIii7FBR2vjwdgPoEm25BM4adk8U-MXkJZuPWQCw1/s1600/2014-05-12_155306.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVXNaDawKog7-QB19Ib-QylfvqXsABa86fK2-yXKLT_ekCONMBboPKvzeC6R6VgxzXN-rYaVc8G2thDinet9D7QKbMMkJ7-tVOhiwJIii7FBR2vjwdgPoEm25BM4adk8U-MXkJZuPWQCw1/s1600/2014-05-12_155306.png" height="451" width="640" /></a></div>
<br />
<br />
2.進到該資料夾,空白處按滑鼠右鍵選Git Init Here<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRK23d78vrc523Sc8gFGZF2dvpUqjUYym1VYu_vvBtLd0OmDfQ6iEjZWuuOWP5aulXdHGi9yiup-6fuYmoWde7oOwX7PDXbeAA41kwd5aFULu0BCaqduKhqeaqGWK5OObGhCfsEUO77qL6/s1600/2014-05-12_155518.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRK23d78vrc523Sc8gFGZF2dvpUqjUYym1VYu_vvBtLd0OmDfQ6iEjZWuuOWP5aulXdHGi9yiup-6fuYmoWde7oOwX7PDXbeAA41kwd5aFULu0BCaqduKhqeaqGWK5OObGhCfsEUO77qL6/s1600/2014-05-12_155518.png" /></a></div>
<br />
<br />
3.隨便新增個檔案(如readme.txt)(因為要有檔案才能commit)<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiem8-VWgtcjA-LilZHx_pAW8hdnrbP8ZxFd0RKOhfaMscgBUvwbgkbOVJyjV3oZx4trhchPTzEA1LNNNT0P9-708H4ohKCjawiFhVZC3rOrbfQZg5Kipf9U0zfdSw2Y1Tlc92wirvGykin/s1600/2014-05-12_160526.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiem8-VWgtcjA-LilZHx_pAW8hdnrbP8ZxFd0RKOhfaMscgBUvwbgkbOVJyjV3oZx4trhchPTzEA1LNNNT0P9-708H4ohKCjawiFhVZC3rOrbfQZg5Kipf9U0zfdSw2Y1Tlc92wirvGykin/s1600/2014-05-12_160526.png" /></a></div>
<br />
<br />
4.打開Bash<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl9Ayjmw_41tOSfMqRvHyb5rpW-UIZOq26yNYXGk2Qd320GEWfdF_hnOAg9JknWfHeIVap6YgqY9MXpbjKy48T3BlZz162NpnEW2WgEuy4_t6tgE2XzQvIpYz2r1FH_D7z8ATzpz0gVzfY/s1600/2014-05-12_155623.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl9Ayjmw_41tOSfMqRvHyb5rpW-UIZOq26yNYXGk2Qd320GEWfdF_hnOAg9JknWfHeIVap6YgqY9MXpbjKy48T3BlZz162NpnEW2WgEuy4_t6tgE2XzQvIpYz2r1FH_D7z8ATzpz0gVzfY/s1600/2014-05-12_155623.png" /></a></div>
<br />
<br />
5.輸入<br />
<pre>git add .
git commit -m 'Init'
git remote add origin git@ServerIP:<span class="pre-highborder">project1.git</span>
git push origin master</pre>
注意紅框處,專案Repository要記得加.git<br />
這邊我們完全沒在Server上手動增加專案,Gitosis自動幫我們完成了,可看到Push之後的結果第一行,自動幫我們Initialized empty Git repository in /xxx,好用吧!<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL3UFovW-t4J8Hh8VKG5Yyu6IB9jjXAfEumXhJy0gofM77jB-8FWVPXvuac-vTVk6IKtXo-gtkmHgq4jSSmDkTlIQ6dnDqXHi2Eq4KF91-FXcaljX7vr1Hc6OY37UZ51TVBhdFo6bK43lU/s1600/2014-05-12_160744.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL3UFovW-t4J8Hh8VKG5Yyu6IB9jjXAfEumXhJy0gofM77jB-8FWVPXvuac-vTVk6IKtXo-gtkmHgq4jSSmDkTlIQ6dnDqXHi2Eq4KF91-FXcaljX7vr1Hc6OY37UZ51TVBhdFo6bK43lU/s1600/2014-05-12_160744.png" height="464" width="640" /></a></div>
<br />
<br />
6.其他共同協作者就可用<br />
<pre>git clone git@ServerIP:project1.git</pre>
指令,將Server上的Repository下載回來一起使用啦~~<br />
<br />
<h3>
五、開始使用</h3>
<br />
<div>
就可以開始使用Git做版本控管。</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
嗯?用啊?都架好了還放著做啥?XD</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br />
<br />
後記:網路上也有很多圖形化的Git GUI工具,可以讓我們不用打指令,也有清楚的介面讓我們知道專案流程如何。但真的誠心建議,先學會文字指令,知道甚麼指令在做甚麼事之後,使用GUI工具才會上手,不然也只是亂玩一通而已喔!</div>
<br />
<br />
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8168527999844809796.post-90544961940691018992014-05-07T10:38:00.002+08:002014-05-07T16:04:50.481+08:00使用Ubuntu架設SVN Server + WebSVN一直都想架設版本控管系統,雖然現在已經有Git這種分散式控管的版本控制,網路上也有像<a href="https://github.com/" target="_blank">github</a>、<a href="https://bitbucket.org/" target="_blank">bitbucket</a>這種很大又免費的Git Server,但小研究了一下,他的控管方式跟SVN不太一樣,可能會顛覆原本的觀念。公司開發程式的工程師就兩位,所有的專案又不能對外公開,那就先研究一下比較好架設的SVN就好,Git就等之後學會了再來慢慢轉換過去。<br />
<br />
目標:<br />
<ol>
<li>能夠版本控制(廢話)</li>
<li>可以透過svn://或是http://連線</li>
<li>能有web介面看到現在所有的專案</li>
<li>有帳號密碼才能存取</li>
</ol>
綜合網路上各篇文章吸收研究後,底下是我採用的方法,步驟紀錄就筆記一下。<br />
<br />
<a name='more'></a><br />
首先安裝好Ubuntu Server,接著分成三階段:<br />
<br />
<h3>
一、基本設定</h3>
<ol>
<li>先安裝相關套件<pre>sudo apt-get install apache2 subversion libapache2-svn php5 apache2-utils apache2-doc php-pear db5.1-util php5-json openssl-blacklist subversion-tools</pre>
<br />
</li>
<li>準備相關資訊:</li>
<ol>
<li>Repository根目錄: /home/svn</li>
<li>WebSvn根目錄: /var/www/websvn</li>
<li>svn帳號: svn</li>
<li>svn群組名稱: svngroup</li>
</ol>
<br />
<li>增加帳號,並把相關帳號放入群組<pre>sudo mkdir /home/svn
sudo addgroup svngroup
sudo useradd -d /home/svn -G svngroup svn
sudo usermod -G svngroup -a www-data
sudo usermod -G svngroup -a 妳的帳號</pre>
<br />
</li>
<li>先產生一個測試Repository(注意順序)<pre>sudo chown -R svn:svngroup /home/svn
sudo mkdir /home/svn/demo
sudo svnadmin create /home/svn/demo
sudo chmod -R g+rwx /home/svn/demo</pre>
<br />
</li>
</ol>
<div>
<div>
到此基本的設定就OK了,但還無法從client端取得資料,接著我們來設定相關協定。<br />
<br /></div>
</div>
<div>
<br /></div>
<div>
<h3>
二、設定http</h3>
</div>
<div>
<ol>
<li>編輯/etc/apache2/mods-available/dav_svn.conf,讓他變成如下:<pre><Location /repos>
DAV svn
SVNParentPath /home/svn
SVNListParentPath On
AuthType Basic
AuthName "Subversion Repository" #這個是跳出認證視窗提示文字
AuthUserFile /etc/subversion/passwd
Require valid-user
#LimitXMLRequestBody 0 #如果上傳太多檔案可能SVN會報錯,打開這個選項
</Location></pre>
<br />
</li>
<li>重新啟動apache讓他生效<pre>sudo /etc/init.d/apache2 restart</pre>
<br />
</li>
<li>產生認證帳號密碼檔,這樣從http存取Repository的時候就會跳出輸入帳號密碼視窗,就不會任何人都可修改<pre>sudo htpasswd -c /etc/subversion/passwd 帳號名稱</pre>
會要你輸入兩次密碼,輸入完成即可<br /><br />
以上指令僅限第一次使用,之後要再產生新帳號的話,必須把-c參數拿掉,不然會重新產生passwd的檔案,如下<pre>sudo htpasswd /etc/subversion/passwd 帳號名稱
</pre>
<br />
</li>
<li>確認剛才的帳號有產生<pre>sudo cat /etc/subversion/passwd
</pre>
<br />
</li>
<li>這樣應該就可以利用 http://網站IP或Domain/repos/REPO_NAME 存取Repository了,也可以使用瀏覽器瀏覽。</li>
</ol>
<div>
<br /></div>
<h3>
三、設定svn</h3>
</div>
<div>
<ol>
<li>當利用svnadmin create指令產生新的Repository之後,該目錄底下有個conf目錄,編輯svnserve.conf檔案<pre>[general]
anon-access = none #訪客不可存取
auth-access = write #認證使用者可寫入
password-db = passwd #帳號密碼表的檔案</pre>
<br />
</li>
<li>存檔好之後,我們再來編輯conf目錄底下passwd檔案(就是上面指定的帳號密碼表),加入可存取該Repository的帳號與密碼<pre>[users]
user = user-password</pre>
<br />
</li>
<li>啟動SVN<br />我們利用xinetd來委託啟動,如果server沒有安裝的話就先裝一下吧<pre>sudo apt-get install xinetd</pre>
<br />
</li>
<li>新增個svn檔<pre>sudo vi /etc/xinetd.d/svn</pre>
<br />
</li>
<li>加入底下<pre>service svn
{
disable = no
port = 3690
socket_type = stream
protocol = tcp
wait = no
user = <span class="pre-highborder">svn</span>
server = /usr/bin/svnserve
server_args = -i -r <span class="pre-highborder">/home/svn</span>
}</pre>
注意紅框處的值是要隨實際情況來改變的<br /><br />
</li>
<li>存檔好後執行<pre>sudo /etc/init.d/xinetd restart</pre>
即可。</li>
</ol>
<div>
<br /></div>
</div>
<h3>
四、websvn</h3>
<div>
<ol>
<li>變身root<pre>sudo -i</pre>
<br />
</li>
<li>下載websvn最新版(最新版只到2011/6就沒了)並解壓縮<pre>cd ~
wget http://websvn.tigris.org/files/documents/1380/49056/websvn-2.3.3.tar.gz
tar -zxvf websvn-2.3.3.tar.gz</pre>
<br />
</li>
<li>將所有檔案搬到/var/www底下<pre>mkdir /var/www/websvn
mv /root/websvn-2.3.3/* /var/www/websvn</pre>
<br />
</li>
<li>重新編輯一次/etc/apache2/mods-available/dav_svn.conf,在最底下加上<pre><Location /websvn>
Options FollowSymLinks
order allow,deny
allow from all
AuthType Basic
AuthName "Subversion Repository"
</Location></pre>
<br />
</li>
<li>增加程式碼高亮<pre>apt-get install enscript</pre>
<br />
</li>
<li>修改設定檔<pre>cd /var/www/websvn/include
cp distconfig.php config.php
vi config.php</pre>
<br />
</li>
<li>增加SVN Parent目錄與encscript<pre>$config->parentPath("/home/svn");
$config->setEnscriptPath('/usr/bin');</pre>
<br />
</li>
<li>重新啟動apache之後就可以在 http://網站IP或Domain/websvn 看到已經建立的Repository了</li>
</ol>
<div>
<br /></div>
</div>
<div>
以後要新增Repository:
<br />
<pre>cd /home/svn
svnadmin create RepositoryName
sudo chown -R svn:svngroup RepositoryName
sudo chmod -R ug+rwx RepositoryName
</pre>
然後編輯底下conf/svnserve.conf與passwd檔案即可
<br />
<br />
<br />
參考連結:</div>
<div>
<a href="http://wiki.ubuntu.org.cn/index.php?title=SubVersion&variant=zh-hant" target="_blank">http://wiki.ubuntu.org.cn/index.php?title=SubVersion&variant=zh-hant</a></div>
<div>
<a href="http://blog.tiger-workshop.com/apache2-subversion-server-and-websvn/" target="_blank">http://blog.tiger-workshop.com/apache2-subversion-server-and-websvn/</a></div>
<div>
<a href="https://help.ubuntu.com/community/Subversion" target="_blank">https://help.ubuntu.com/community/Subversion</a></div>
<div>
<a href="http://czetsuya-tech.blogspot.tw/2012/08/how-to-install-subversion-and-websvn-on.html#.U2hV3PmSwi9" target="_blank">http://czetsuya-tech.blogspot.tw/2012/08/how-to-install-subversion-and-websvn-on.html#.U2hV3PmSwi9</a></div>
<div>
<a href="http://asuralyc.blogspot.tw/2009/05/svn-websvn-ssl-trac-on-leopard.html" target="_blank">http://asuralyc.blogspot.tw/2009/05/svn-websvn-ssl-trac-on-leopard.html</a></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8168527999844809796.post-76848502050536760802014-05-01T19:15:00.000+08:002014-05-01T19:15:49.787+08:00為Visual Studio增強編寫網頁功能性之前用Visual Studio 2012開發網頁,有一天赫然發現它會自動幫我的js檔另存成最小化的.min.js,還有CSS檔只要有顏色相關的屬性設定,都會顯示顏色給你看。一開始還以為是內建功能,想說一直都沒發現原來VS這麼貼心,後來換成VS 2013,啊這些功能怎麼都沒有了?還以為2013比較不貼心...<br />
<br />
原來,只要裝了Web Essentials這個擴充套件就行啦!(我的VS2012之前不曉得什麼時候亂看擴充功能然後就裝了,一直都不知道XD)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioaKe8IKwPwb7Elts5PimSobABBKfTJhEGdRvsScv5OD7Pcm98LpHJprH6Jgw7_doUfo2iH_Ngt6AhLdiwMfZq7CApbduSYMwvQU5IzgymNeKs_oeYMOdfpbYP8I3HfQSNJQkrJ_wGakLr/s1600/2014-04-30_185608.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioaKe8IKwPwb7Elts5PimSobABBKfTJhEGdRvsScv5OD7Pcm98LpHJprH6Jgw7_doUfo2iH_Ngt6AhLdiwMfZq7CApbduSYMwvQU5IzgymNeKs_oeYMOdfpbYP8I3HfQSNJQkrJ_wGakLr/s1600/2014-04-30_185608.png" /></a></div>
<br />
<br />
<a name='more'></a>我們可以先到他的<a href="http://vswebessentials.com/" target="_blank">官方網站</a>去看看,支援的東西還真不少!!有興趣的可以去裡面看看它提供了那些額外的擴充功能。<br />
<br />
由於Visual Studio 2010之後的版本才開始提供擴充功能,所以如果是之前的版本(2005、2008),就很抱歉啦不能裝。<br />
<br />
打開擴充功能,搜尋web essentials就可找到套件,趕快安裝吧!<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAvXVOxk-CPJVZSynPPGDQaFpeJsVUkivmIHu-p8N2ZehZRvjbw2Q9UB8cKrAjgfv167LIUoEBdIlJ4SY2w5cGUO1bmjAj2U4Lp4A_tBf642t2PGU4sZ63w6_Fv7xbMip-gpGsbicXH-W0/s1600/2014-04-30_190209.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAvXVOxk-CPJVZSynPPGDQaFpeJsVUkivmIHu-p8N2ZehZRvjbw2Q9UB8cKrAjgfv167LIUoEBdIlJ4SY2w5cGUO1bmjAj2U4Lp4A_tBf642t2PGU4sZ63w6_Fv7xbMip-gpGsbicXH-W0/s1600/2014-04-30_190209.png" height="442" width="640" /></a></div>
<br />
<br />
裝好之後就可以看到功能表多了WEB ESSENTIALS,在方案總管上,HTML三<strike>頭龍</strike>龍頭(HTML、CSS、JS)檔上按右鍵也會有相關功能<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMhKZDk7iWb-4sZ8BXWg2ivnrcLB0WJK9lmQNDbZlYPJKvXk-b0f7FBgUp78z169gp_ViWyJYaNYem6x3QmKm1SMme49wOPUoiqiP0YqOac9atgMZyrg8SPh-eeY8Z8iUYo2PXSHcO5MCc/s1600/2014-05-01_191100.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMhKZDk7iWb-4sZ8BXWg2ivnrcLB0WJK9lmQNDbZlYPJKvXk-b0f7FBgUp78z169gp_ViWyJYaNYem6x3QmKm1SMme49wOPUoiqiP0YqOac9atgMZyrg8SPh-eeY8Z8iUYo2PXSHcO5MCc/s1600/2014-05-01_191100.png" height="404" width="640" /></a></div>
<br />
<br />
其中這個Minify JavaScript file(s)就是自動幫你產生.min.js的功能啦,除了JS,另外兩頭龍(HTML、CSS)檔案也可以產生最小化的檔案,以縮短載入時間。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpIbnPq3OKafPAoRoOpqRp9WVOqhk1heioeh_sZFP1PFI_EUezHcvgntaCbOUNfgfhM1lmNO-Z9LuX5oIeWU7rDQvdSD3XNgRTqEBMw4AEN5zzy9LikaRVsutp5ljPsiEm1yzVbCITtZpH/s1600/2014-05-01_191201.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpIbnPq3OKafPAoRoOpqRp9WVOqhk1heioeh_sZFP1PFI_EUezHcvgntaCbOUNfgfhM1lmNO-Z9LuX5oIeWU7rDQvdSD3XNgRTqEBMw4AEN5zzy9LikaRVsutp5ljPsiEm1yzVbCITtZpH/s1600/2014-05-01_191201.png" height="462" width="640" /></a></div>
<br />
<br />
其他還有更多強大的功能,就請自己發現囉~Unknownnoreply@blogger.com0