tag:blogger.com,1999:blog-52521799813004993322024-02-23T00:11:03.342+08:00爪哇小子每日都是珍貴的一天,而您的堅持將使它更完美。Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.comBlogger301125tag:blogger.com,1999:blog-5252179981300499332.post-35572394401310267622019-11-14T22:57:00.000+08:002019-11-14T22:57:00.974+08:00【筆記】Git中用關鍵字刪除本地的分枝(branch)先在終端機或Git Bash視窗輸入
<pre class="brush: bash">
git branch
</pre>
來看目前本機的分枝有那些,例如目前在我的電腦中有:
<pre class="brush: bash">
Dog
Dog-101
* cat
dog-123
master
video-store
vv
</pre>
現在你想刪掉名字中有「dog」,而且不分大小寫的分枝,可以先用下列指令先確認:
<pre class="brush: bash">
git branch | grep -i 'dog'
</pre>
結果就會列出名字中有「dog」的分技:
<pre class="brush: bash">
Dog
Dog-101
dog-123
</pre>
確認後,就可以執行下列的指令去刪掉想不需要的分枝:
<pre class="brush: bash">
git branch | grep -i 'dog' | xargs git branch -D
</pre>
注意!執行上列指令前,請先checkout到你要留下的分枝再執行,執行成功後,就會列出已被刪除的分枝:
<pre class="brush: bash">
Deleted branch Dog (was 21eb956).
Deleted branch Dog-101 (was 21eb956).
Deleted branch dog-123 (was 21eb956).
</pre>
若你覺得這些指令好用,可以在
<code>.bashrc</code>或<code>.bash_profile</code>中自己新增簡單的function:
<pre class="brush: bash">
function git-list-all-match {
git branch | grep -i $1
}
function git-del-all-match {
git branch | grep -i $1 | xargs git branch -D
}
</pre>
建立完成後,執行:
<pre class="brush: bash">
git-list-all-match dog
</pre>
結果:
<pre class="brush: bash">
* Dog
Dog-101
dog-123
</pre>
接著執行:
<pre class="brush: bash">
git-del-all-match dog
</pre>
結果:
<pre class="brush: bash">
Deleted branch Dog (was 21eb956).
Deleted branch Dog-101 (was 21eb956).
Deleted branch dog-123 (was 21eb956).
</pre>
注意!執行上列指令前,請先checkout到你要留下的分枝再執行喔!
你可以參考<code>grep</code>指令的用法,去寫出最適合你自己的指令和function。
<br />
<br />
<b>參考資料</b>
<br />
<ul>
<li>
<a href="https://medium.com/@rajsek/deleting-multiple-branches-in-git-e07be9f5073c" target="_blank">Deleting Multiple Branches in Git</a>
</li>
<li>
<a href="https://www.digitalocean.com/community/tutorials/using-grep-regular-expressions-to-search-for-text-patterns-in-linux" target="_blank">Using Grep & Regular Expressions to Search for Text Patterns in Linux</a>
</li>
<li>
<a href="https://blog.gtwang.org/linux/xargs-command-examples-in-linux-unix/" target="_blank">Linux 系統 xargs 指令範例與教</a>
</li>
</ul>
Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0tag:blogger.com,1999:blog-5252179981300499332.post-684529463875017582019-11-13T21:45:00.000+08:002019-11-13T22:13:19.814+08:00【筆記】河內塔 - 用Java實作河內塔的問題是用來學習遞迴(Recursion),之前看了很多例子,寫法都大同小意,前陣子就自己也依樣畫葫蘆,並把註解寫在程式碼中,用意是讓自己可以一目瞭然,若你也曾被這樣的程式碼感到困惑過,希望這個例子可以讓你更明白。
<pre class="brush: java">
package idv.jk.tryit.algorithm;
public class TowerOfHanoi {
/**
* 河內塔實作。在第一根柱子上的n個盤子,搬到第三根柱子上。規則:
* 1. 一次搬一個盤子
* 2. 搬運過程中大盤子必需在小盤子之下
*
* @param numberOfDisks 要移動的盤子數目
* @param beginning 盤子的開始位置所在的柱子
* @param auxiliary 移動過程中做為輔助暫放盤子用的柱子
* @param destination 盤子的目的地位置所在的柱子
*/
public void move(int numberOfDisks,
String beginning,
String auxiliary,
String destination) {
if (numberOfDisks == 1) {
//遞迴的重點之一在於要有結束條件,就是當條件符合時,
//就不會再呼叫自身的這個方法(method)
System.out.println(String.format("Moving disk from %s to %s",
beginning,
destination));
} else {
//第一步,先把 n - 1 塊盤子從第一根柱子(beginning)搬到第二根柱子,
//此時, 需要使用第三根柱子當做輔助。
//所以最上面傳進來的 auxiliary 參數當成目的地的柱子,
//最上面傳進來的 destination 參數當成輔助的柱子。
//下面這一行執行完後,在第一根柱子上,除了最下面的盤子以外的盤子,
//都會被搬到第二根柱子上。
move(numberOfDisks - 1, beginning, destination, auxiliary);
//第二步,再把第一根柱子上剩下的最下面的盤子從第一根柱子搬到第三根柱子上。
move(1, beginning, auxiliary, destination);
//第三步,再把現在在第二根子上 n - 1 塊盤子從第二根柱子搬到第三根柱子,
//此時, 需要使用第一根柱子當做輔助。
//所以最上面傳進來的 auxiliary 參數當成開始的柱子,
//最上面傳進來的 beginning 參數當成輔助的柱子。
move(numberOfDisks - 1, auxiliary, beginning, destination);
}
}
public static void main(final String[] argv) {
/*
第一根柱子標註為 A,
第二根柱子標註為 B,
第三根柱子標註為 C。
現在要從 A 柱上的 3 個盤子搬到 C 柱上
*/
new TowerOfHanoi().move(3, "A", "B", "C");
}
}
</pre>Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0tag:blogger.com,1999:blog-5252179981300499332.post-88845304060378762882016-03-07T23:49:00.000+08:002016-03-07T23:49:35.557+08:00【分享】安全地清理升級Windows 10後的舊安裝檔在升級至<span class="techn">Windows 10</span>之後,無意間在C槽發現了一個「Windows.old」的資料夾,Google了一下後,才發現是之前<span class="techn">Windows 8</span>遺留下的資料夾,因為C槽快爆了,所以有必要將其刪除。<br />
<br />
首先找到「磁碟清理」這個工具:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS3m6mHyPJcmebJAXxVg8BeFjspIUYlkSUWbNgVzxGOi0JGWvHFyTlYz6tpm1yMcqnmHcAYcbZbqvqBoJ3VojHhMaNKnoncTW5o8C5JSTS9y4F97_PyexiTZokzeOtYMAcb7UbjRiYQBxQ/s1600/01_search_clean.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS3m6mHyPJcmebJAXxVg8BeFjspIUYlkSUWbNgVzxGOi0JGWvHFyTlYz6tpm1yMcqnmHcAYcbZbqvqBoJ3VojHhMaNKnoncTW5o8C5JSTS9y4F97_PyexiTZokzeOtYMAcb7UbjRiYQBxQ/s320/01_search_clean.png" width="201" /></a></div>
<br />
點選後,在開啟中,會先看到一個「計算中」的小視窗:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1bbsrtDD0Dk_o2NjjTCLATVJFt0xzmm5DpA4QMRR6gNoFAD_PZwrt81PFCJhVZ1PunhKPonv5mKNXf41f6NKfIHv5wb4qokha1kGixcxQff8XnUn3SxTU8Up0cfWg9QZF0fCAl6-XBOeR/s1600/02_calculating.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="133" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1bbsrtDD0Dk_o2NjjTCLATVJFt0xzmm5DpA4QMRR6gNoFAD_PZwrt81PFCJhVZ1PunhKPonv5mKNXf41f6NKfIHv5wb4qokha1kGixcxQff8XnUn3SxTU8Up0cfWg9QZF0fCAl6-XBOeR/s320/02_calculating.png" width="320" /></a></div>
<br />
開啟後,再選擇要清理的磁碟機,因為之前是安裝在C槽,所以選擇如下:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio-xvX4mh6ncsB1p-YsNf10TgAZIENyqAeRYm_7M5T3isydDFR3gtSbb4HT808_QsD9egmRilqXr91HARZiBwVEvSkMzVD_TwogyVyRb7gAkPpZLeXEdswmGsfriA2CgbtzhwV1As28lm3/s1600/03_select_the_disk_you_installed_Windows.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="177" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio-xvX4mh6ncsB1p-YsNf10TgAZIENyqAeRYm_7M5T3isydDFR3gtSbb4HT808_QsD9egmRilqXr91HARZiBwVEvSkMzVD_TwogyVyRb7gAkPpZLeXEdswmGsfriA2CgbtzhwV1As28lm3/s320/03_select_the_disk_you_installed_Windows.png" width="320" /></a></div>
<br />
再來,不要急著勾選要清理的項目,而是先點按【清理系統檔】:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-497HUrE4L7pgW4EbIUuAhGBMWvgFkFlj9NAvzt4hmvkPNvpJtJv9Uad37JYA19loYnhA3yiZAO4FOuoZqLMD1ZFwBzQxYNVolV78KQcQP8XGbYIfY8S-2YHSy9CZxS2MJnrsEEo5Aufi/s1600/04_Clean_up_system_files.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-497HUrE4L7pgW4EbIUuAhGBMWvgFkFlj9NAvzt4hmvkPNvpJtJv9Uad37JYA19loYnhA3yiZAO4FOuoZqLMD1ZFwBzQxYNVolV78KQcQP8XGbYIfY8S-2YHSy9CZxS2MJnrsEEo5Aufi/s320/04_Clean_up_system_files.png" width="259" /></a></div>
<br />
之後,會需要再次選擇要清理的磁碟機:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvn23dmrw4E_ayafX3Z71OiArib-i-Ef2AqvcHRn0ugUqFIfTTxq8LoB355wSoNqEHEt32wd8D4-Bs8pu5oLyQfBN1yycU9jAxyb2Xh_ZUrfVMaqq97b9ceLTMX_TmIN7cYp9lxDDx16uc/s1600/05_select_the_disk_you_installed_Windows.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="178" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvn23dmrw4E_ayafX3Z71OiArib-i-Ef2AqvcHRn0ugUqFIfTTxq8LoB355wSoNqEHEt32wd8D4-Bs8pu5oLyQfBN1yycU9jAxyb2Xh_ZUrfVMaqq97b9ceLTMX_TmIN7cYp9lxDDx16uc/s320/05_select_the_disk_you_installed_Windows.png" width="320" /></a></div>
<br />
點按【確定】後,會再出現「計算中」的小視窗,耐心地等它執行完。<br />
<br />
再來找到要移除的「之前的Windows安裝」,再點按【確定】:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit0McyqRZwO_wm4RHZoPIgv2f2rdpTjxVhqMgtC3YYvo2ACpiTTt6hN1TglgFXR3JtdAXzltvp-DyYiqS-SS5-7SY8UBYeCta0g-MZVQq8Cb0Lp76tpjgSV3Ce4pOFu0I7vUSIqL9Jpzzw/s1600/06_previous_Windows_installation.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit0McyqRZwO_wm4RHZoPIgv2f2rdpTjxVhqMgtC3YYvo2ACpiTTt6hN1TglgFXR3JtdAXzltvp-DyYiqS-SS5-7SY8UBYeCta0g-MZVQq8Cb0Lp76tpjgSV3Ce4pOFu0I7vUSIqL9Jpzzw/s320/06_previous_Windows_installation.png" width="260" /></a></div>
<br />
再來會再次確定是否要刪除檔案,<b><span style="color: red;">務必請三思後並確認要刪除</span></b>,再點按【刪除檔案】:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiStKvR0W1VPZAkfbA29gX3O-LE0-eyk7clAELxp3iDluFONwHjlSS8csE6cpqZDMXB-qrd_9RIfBxB7O1RCs7RWYha8FC-i7jh7LHEE_Jq-Ga9Y4i6vD4nuZ1xZroy_KWlrriq-oOjGapK/s1600/07_sure_to_delete.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="120" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiStKvR0W1VPZAkfbA29gX3O-LE0-eyk7clAELxp3iDluFONwHjlSS8csE6cpqZDMXB-qrd_9RIfBxB7O1RCs7RWYha8FC-i7jh7LHEE_Jq-Ga9Y4i6vD4nuZ1xZroy_KWlrriq-oOjGapK/s320/07_sure_to_delete.png" width="320" /></a></div>
<br />
當磁碟清理程式發現刪除的是先前舊的安裝檔時,會再提示一次,<b><span style="color: red;">請再次確認真的要刪除後,再點按【是】</span></b>:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ-zVfpYG685pgoivbiVxIiQNE6BGAnb13FEOxs5IZpKxYOI2fEJuThnRinaVFqOn-1qLJ1rZzdOsDqS8dd-3TEAlIOi3szgNNoaNMm_cKDmRnABaNoVqcW2Amn4KovwsfP_dOIPt2g-L-/s1600/08_r_u_sure_again.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="111" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ-zVfpYG685pgoivbiVxIiQNE6BGAnb13FEOxs5IZpKxYOI2fEJuThnRinaVFqOn-1qLJ1rZzdOsDqS8dd-3TEAlIOi3szgNNoaNMm_cKDmRnABaNoVqcW2Amn4KovwsfP_dOIPt2g-L-/s320/08_r_u_sure_again.png" width="320" /></a></div>
<br />
下列小視窗會顯示目前的作業內容,等它關閉後,清理就完成了。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR2KfasBYGVhzO3O7Z1B84ur-dRd891JIrHjHBIb6jtm8WhcBCn1hq830glnNt8liN8nmUK_Ew-tPSaEsIfJ6Zvgb1bTdMFzlr6cplbLU16DFaUxn8hVDaO2cmZN5jUq3H_xEP75s2qcdI/s1600/10_finally.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="133" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR2KfasBYGVhzO3O7Z1B84ur-dRd891JIrHjHBIb6jtm8WhcBCn1hq830glnNt8liN8nmUK_Ew-tPSaEsIfJ6Zvgb1bTdMFzlr6cplbLU16DFaUxn8hVDaO2cmZN5jUq3H_xEP75s2qcdI/s320/10_finally.png" width="320" /></a></div>
<br />
參考資料<br />
<ul>
<li><a href="http://www.cnet.com/how-to/how-to-delete-the-windows-old-folder-from-windows-10/" target="_blank">How to delete the Windows.old folder from Windows 10</a></li>
</ul>
Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0tag:blogger.com,1999:blog-5252179981300499332.post-50625964834854684772015-11-18T11:07:00.001+08:002019-11-13T21:40:46.431+08:00【分享】收集個人覺得不錯的英文教學影片經過朋友的介紹,知道這位Rachel老師的Youtube,最近很愛看這個,也著實學到很多美國人道地的說話方式,獲益匪淺。
<div style="text-align: center;">
<iframe width="560" height="315" src="https://www.youtube.com/embed/OtT3GIO0Tqg" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
來看賴世雄老師談如何學英文,我大概在高二開始(二十年前)每天聽半時他的常春藤解析英語,一直到大學聯考,幫助是不管期中考試,或大學聯考,英文這科拜歐其實都不太需要準備,聯考也考了個還可以的89分。<br />
<br />
現在還會推薦賴世雄老師演講的原因在於,拜歐自己聽了一遍這影片一次,有點感慨,發現自己真能在前面的二十年前利用自己零星,虛渡過的那些時間,照影片中的方式去學習,現在英語無論在聽、說、讀、寫,跟現在比較,一定是雲泥之別。<br />
<br />
PS.若時間不多,你可以跳過前一小時,XD<br />
<br />
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/d-wEagX2uI4" width="560"></iframe>
</div>
<br />
【IDIOM 100】昰介紹一百個英語中的常用語,雖然字幕是日文和英文,但片中全部都是用英語講說,加上這個老師發音很標準,所以講的速度對拜歐來講,是適中且易懂的。<br />
<br />
她的講解都會搭配個情境小卡來幫助理解的,是個來學英語中慣用語很棒的教學影片。<br />
<br />
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/videoseries?list=PL89B4E44876DF4867" width="560"></iframe></div>
<br />
<br />
<a href="https://www.ted.com/" target="_blank">TED</a>對拜歐來講,有些演講者講得速度太快,而且有些主題是比較專業,可能會有很多不熟的單字出現,聽起來會很吃力,很難跟上。<br />
<br />
拜歐的方法是挑一些熟悉的主題,而且講者的速度是比較慢一點的,多看幾次,應該對聽力有所幫助。<br />
<br />
像下面這個講者的主題跟教育有關,而且速度比較慢且發音很標準,是拜歐比較聽得懂的。
<br />
<br />
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="315" mozallowfullscreen="" scrolling="no" src="https://embed-ssl.ted.com/talks/lang/en/carol_dweck_the_power_of_believing_that_you_can_improve.html" webkitallowfullscreen="" width="560"></iframe></div>
<br />
【秧秧教英語】是拜歐無意間看到的影片,一系列用大家所熟悉的美國熱門影集來教大家美國日常會用到的慣用詞等,趣味性是一百分,也讓人覺得學英語是很有意思的,更一進步貼近生活。
<br />
<br />
應該因為是滿久前的影片了,大部份影片的畫質也不是很理想,還有拜歐喜歡的六人行,也只有這幾部,令人只覺得可惜,但也不失為一個學習英文的好地方。<br />
<br />
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/videoseries?list=PLIVMZd1VIbdwbcle5Kns1vBHmVy-Pgd0g" width="560"></iframe></div>
Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0tag:blogger.com,1999:blog-5252179981300499332.post-70855791906921913912015-10-16T13:04:00.000+08:002015-10-16T13:04:35.606+08:00【筆記】使用Java練習觀察者模式(Observer pattern)<code>Subject.java</code>
<pre class="brush: java">
package idv.jk.study.designpattern.observer;
import java.util.ArrayList;
import java.util.List;
public abstract class Subject
{
private String mMessage;
List<Observer> mObserverList = new ArrayList<Observer>();
public void add(Observer observer)
{
mObserverList.add(observer);
}
public void remove(Observer observer)
{
mObserverList.remove(observer);
}
public void broadcast()
{
for(Observer o : mObserverList)
{
o.update();
}
}
public String getMessage()
{
return mMessage;
}
public void setMessage(String message)
{
this.mMessage = message;
}
}
</pre>
<code>Observer.java</code>
<pre class="brush: java">
package idv.jk.study.designpattern.observer;
public abstract class Observer
{
protected String mName;
protected Subject mSubject;
public abstract void update();
}
</pre>
<code>Sheep.java</code>
<pre class="brush: java">
package idv.jk.study.designpattern.observer;
public class Sheep extends Observer
{
public Sheep(String name, Subject subject)
{
this.mName = name;
this.mSubject = subject;
subject.add(this);
}
@Override
public void update()
{
System.out.printf("通知 %s:%s%n", mName, mSubject.getMessage());
}
}
</pre>
<code>SheepDog.java</code>
<pre class="brush: java">
package idv.jk.study.designpattern.observer;
public class SheepDog extends Subject
{
}
</pre>
<code>Main.java</code>
<pre class="brush: java">
package idv.jk.study.designpattern.observer;
public class Main
{
public static void main(String[] args)
{
//Shaun the sheep中的那隻牧羊犬
SheepDog bitzer = new SheepDog();
//chief actor
Sheep shaun = new Sheep("Shaun", bitzer);
//Shaun's cousin, is the flock's only lamb,
Sheep timmy = new Sheep("Timmy", bitzer);
//Shirley is the largest member of the flock
Sheep shirley = new Sheep("Shirley", bitzer);
//Nuts, is quite an eccentric, but useful sheep and usually like the rest of the flock, accompanies and helps Shaun.
Sheep nuts = new Sheep("Nuts", bitzer);
bitzer.setMessage("主人回來了,快點恢復正常羊的樣子");
bitzer.broadcast();
System.out.println("晚上了...");
//晚上了,Timmy比較早睡,Bitzer就不通知他
bitzer.remove(timmy);
bitzer.setMessage("星星出來了,大家快來看啊");
bitzer.broadcast();
}
}
</pre>Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0tag:blogger.com,1999:blog-5252179981300499332.post-28669010012809142012015-10-13T22:03:00.001+08:002015-10-13T22:03:58.727+08:00【筆記】使用Java來做快速排序(quick sort)的簡單範例上次真正去接觸、實作快速排序,想想是當年上職訓課,老實講,當時也是一知半解,XD
<pre class="brush: java">
package idv.jk.study.algorithm.sort;
/**
* Created by bioyang on 2015/10/10.
*/
public class QuickSort
{
public static void main(String[] args)
{
int[] numberArray = new int[]{6, 1, 2, 7, 9, 3, 4, 5, 10, 8};
new QuickSort().quickSort(0, numberArray.length - 1, numberArray);
for(int n : numberArray)
{
System.out.print(n + "\t");
}
}
/**
*
* @param left 最左邊那個數字的index
* @param right 最右邊那個數字的index
* @param numberArray 要排序的整數陣列
*/
public void quickSort(int left, int right, int[] numberArray)
{
if(left > right)
{
//代表排序已結束
return;
}
int startIndex = left; //代表最左邊那個數字的起始index
int endIndex = right; //代表最右邊那個數字的起始index
int baseValue = numberArray[left]; //用來儲存要排序的數字陣列最左邊的數字
int temp; //用來暫存交換時的值
while (startIndex != endIndex)
{
//要先從右往左找
while (numberArray[endIndex] >= baseValue && startIndex < endIndex)
{
endIndex--;
}
while (numberArray[startIndex] <= baseValue && startIndex < endIndex)
{
startIndex++;
}
if (startIndex < endIndex)
{
temp = numberArray[startIndex];
numberArray[startIndex] = numberArray[endIndex];
numberArray[endIndex] = temp;
}
}
numberArray[left] = numberArray[startIndex];
numberArray[startIndex] = baseValue;
//這裡會叫用遞迴,想起有次聽到良葛格說;「遞迴只應天上有,人間只能用迴圈」,XD
//將原本最左邊的數字歸位後,開始排序以比這個數小的那群數字
quickSort(left, startIndex - 1, numberArray);
//將原本最左邊的數字歸位後,開始排序以比這個數大的那群數字
quickSort(startIndex + 1, right, numberArray);
}
}
</pre>Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0tag:blogger.com,1999:blog-5252179981300499332.post-48869966523421160792015-10-12T21:03:00.000+08:002015-10-12T21:03:31.689+08:00【筆記】用Java實作備忘錄(memoto)模式的簡單範例嘗試用說故事的方弍來寫看看,XD
<code>Main.java</code>
<pre class="brush: java">
package idv.jk.study.designpattern.memoto;
/**
* Created by bioyang on 2015/10/12.
*/
public class Main
{
public static void main(String[] args)
{
//有一個叫小明的工程師
Programmer smallMing = Programmer.beforeWork();
//他在上班前的身心狀態
System.out.printf("開始工作前的HP為 %d, 憤怒條為 %d\r\n",
smallMing.getHitPoint(), smallMing.getAngryPoint());
//為了確認明天是全新的一天,他的大腦要把上班前的狀態給記下來
ProgrammerBrain brainOfSmallMing = new ProgrammerBrain();
brainOfSmallMing.setBodyStateMemoto(smallMing.getBodyStateMemoto());
//小明修了一個Bug
smallMing.fixBug();
//這對他的身心狀態沒有太大的影響
System.out.printf("修了一個Bug的HP為 %d, 憤怒條為 %d\r\n",
smallMing.getHitPoint(), smallMing.getAngryPoint());
//客戶改了需求
smallMing.requirementChanged();
//要殺死一個工程師,只要改一個需求
System.out.printf("知道客戶改了需求後的HP為 %d, 憤怒條為 %d\r\n",
smallMing.getHitPoint(), smallMing.getAngryPoint());
//但一天過去了,又是美好、新的一天
smallMing.recoverBodyStateMemoto(brainOfSmallMing.getBodyStateMemoto());
System.out.printf("隔天起床工作前的HP為 %d, 憤怒條為 %d\r\n",
smallMing.getHitPoint(), smallMing.getAngryPoint());
}
}
</pre>
<code>Programmer.java</code>
<pre class="brush: java">
package idv.jk.study.designpattern.memoto;
/**
* Created by bioyang on 2015/10/12.
*/
public class Programmer
{
/**
* 生命值
*/
private int hitPoint;
/**
* 憤怒條
*/
private int angryPoint;
private BodyStateMemoto mBodyStateMemoto;
public BodyStateMemoto saveState()
{
return new BodyStateMemoto(this.hitPoint, this.angryPoint);
}
public static Programmer beforeWork()
{
Programmer programmer = new Programmer();
programmer.setHitPoint(100);
programmer.setAngryPoint(0);
return programmer;
}
public void fixBug()
{
this.hitPoint -= 5;
this.angryPoint += 10;
}
public void requirementChanged()
{
this.hitPoint = 0;
this.angryPoint = 200;
}
public BodyStateMemoto getBodyStateMemoto()
{
return new BodyStateMemoto(getHitPoint(), getAngryPoint());
}
public void recoverBodyStateMemoto(BodyStateMemoto bodyStateMemoto)
{
setHitPoint(bodyStateMemoto.getHitPoint());
setAngryPoint(bodyStateMemoto.getAngryLevel());
}
public int getHitPoint()
{
return hitPoint;
}
public void setHitPoint(int hitPoint)
{
this.hitPoint = hitPoint;
}
public int getAngryPoint()
{
return angryPoint;
}
public void setAngryPoint(int angryPoint)
{
this.angryPoint = angryPoint;
}
}
</pre>
<code>BodyStateMemoto.java</code>
<pre class="brush: java">
package idv.jk.study.designpattern.memoto;
/**
* Created by bioyang on 2015/10/12.
*/
public class BodyStateMemoto
{
/**
* 生命力
*/
private int hitPoint;
/**
* 憤怒值
*/
private int angryLevel;
public BodyStateMemoto(int hitPoint, int angryLevel)
{
this.hitPoint = hitPoint;
this.angryLevel = angryLevel;
}
public int getHitPoint()
{
return hitPoint;
}
public void setHitPoint(int hitPoint)
{
this.hitPoint = hitPoint;
}
public int getAngryLevel()
{
return angryLevel;
}
public void setAngryLevel(int angryLevel)
{
this.angryLevel = angryLevel;
}
}
</pre>
<code>ProgrammerBrain.java</code>
<pre class="brush: java">
package idv.jk.study.designpattern.memoto;
/**
* Created by bioyang on 2015/10/12.
*/
public class ProgrammerBrain
{
private BodyStateMemoto mBodyStateMemoto;
public void setBodyStateMemoto(BodyStateMemoto bodyStateMemoto)
{
this.mBodyStateMemoto = bodyStateMemoto;
}
public BodyStateMemoto getBodyStateMemoto()
{
return mBodyStateMemoto;
}
}
</pre>Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0tag:blogger.com,1999:blog-5252179981300499332.post-19860226262313145012015-10-10T17:55:00.000+08:002015-10-15T10:00:37.847+08:00【筆記】ReactJS呼叫外部API練習-顯示YouBike站點列表最近有機會碰到<span class="techn"><a href="https://facebook.github.io/react/" target="_blank">React</a></span>除了做完它的<a href="https://facebook.github.io/react/docs/tutorial.html" target="_blank">教學</a>增加點自信外,再來嘗試做一些套用API的練習,這裡使用台北市政府提供的<a href="http://data.taipei/opendata/datalist/datasetMeta;jsessionid=2C200B6BB0296D86774D2EDC16C61F90?oid=8ef1626a-892a-4218-8344-f7ac46e1aa48" target="_blank">YouBike臺北市公共自行車即時資訊</a>來取得YouBike站點資訊。
<br />
<br />
這裡拜歐先用
<span class="techn"><a href="https://nodejs.org/en/" target="_blank">Node JS</a></span>開一個網頁伺服器,主要是因為若用<span class="techn">JavaScript</span>去對上述的<span class="techn">API</span>送要求的話,會有<span class="techn">Cross Domain</span>呼叫的問題,會比較麻煩,所以這裡就用<span class="techn">Node</span>在伺服器送出要求,取回所需要的資料。
<br />
<br />
先寫一支名為<code>server.js</code>的程式:
<br />
<pre class="brush: javascript">var path = require('path');
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
var request = require('request');
app.set('port', (process.env.PORT || 9999));
app.use('/', express.static(path.join(__dirname, 'public')));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.get('/api/comments', function(req, res) {
res.end('abc');
});
app.get('/youbike/:pageSize/:offset', function(req, res){
var pageSize = req.params.pageSize,
offset = req.params.offset;
request('http://data.taipei/opendata/datalist/apiAccess?scope=resourceAquire&rid=ddb80380-f1b3-4f8e-8016-7ed9cba571d5&limit=' + pageSize + '&offset=' + offset,
function(err, response, body){
if(err)
{
console.log(err);
}
else if(response.statusCode == 200)
{
res.end(body);
}
})
});
app.listen(app.get('port'), function() {
console.log('Server started: http://localhost:' + app.get('port') + '/');
});
</pre>
上列程式中,會用到<span class="techn"><a href="http://expressjs.com/" target="_blank">Express</a></span>這個<span class="techn">Framwork</span>,以及<span class="techn"><a href="https://www.npmjs.com/package/request" target="_blank">request</a></span>這個<span class="techn">package</span>,它主要的功能就是在受到用戶端的要求時,再組成查詢的<span class="techn">URL</span>向<span class="techn">API</span>送出要求,取回<span class="techn">JSON</span>格式的資料。<br />
<br />
再來會有一支名為<code>index.html</code>的<span class="techn">HTML</span>程式來顯示資料:
<pre class="brush: html">
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="/css/youbike.css"/>
<style>
div#container{width:80%;margin:auto;}
button{margin:5px;}
</style>
</head>
<body>
<div id="container">
</div>
<script type="text/javascript" src="/js/jquery.min.js"></script>
<script type="text/javascript" src="/js/react.min.js"></script>
<script type="text/javascript" src="/js/react-dom.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.24/browser.min.js"></script>
<script type="text/babel" src="/js/youbike.jsx"></script>
</body>
</html>
</pre>
那我們主要的
<span class="techn">React</span>是寫在<code>youbiks.jsx</code>中,其中主要定義了<code>YouBikeSite</code>、<code>YouBikeSiteRow</code>和<code>YouBikeTable</code>等三個元件:
<pre class="brush: javascript">
var YouBikeSite = React.createClass({
getInitialState : function(){
return {
site : [],
};
},
render : function(){
var site = this.props.site;
return (
<div className="row">
<div className="column">{site.sno}</div>
<div className="column">{site.sarea}</div>
<div className="column">{site.sna}</div>
<div className="column">{site.sbi}</div>
<div className="column">{site.mday}</div>
</div>
);
}
});
var YouBikeSiteRow = React.createClass({
render : function(){
console.log('YouBikeSiteList');
return (
<div className="dataBody">
{this.props.siteList.map(function(site) {
//console.log(site);
return (<YouBikeSite site={site} />);
})}
</div>
);
}
});
var YouBikeTable = React.createClass({
getInitialState : function(){
return {
siteList : [],
page : 1
};
},
componentDidMount : function(){
this.loadYouBikeSiteInfo();
},
loadYouBikeSiteInfo : function(){
console.log('this.state.page: ' + this.state.page);
var pageSize = 10,
offset = (this.state.page >= 1 ? this.state.page - 1 : 0) * pageSize;
console.log(offset);
var youBikeSiteUrl = '/youbike/' + pageSize + '/' + offset;
$.ajax({
url : youBikeSiteUrl,
dataType : 'json',
cache : false,
success : function(data){
if(data.result && data.result.results)
{
this.setState({
siteList : data.result.results
});
}
//console.log(this.state.siteList);
}.bind(this),
error : function(xhr, status, err){
console.error(youBikeSiteUrl, status, err.toString());
}.bind(this)
});
},
nextPage : function()
{
this.state.page += 1;
this.loadYouBikeSiteInfo();
},
previousPage : function()
{
this.state.page -= 1;
if(this.state.page < 0)
{
this.state.page = 0;
}
this.loadYouBikeSiteInfo();
},
render : function(){
return (
<div className="youBikeView">
<h2>YouBike Site Information</h2>
<div className="youBikeTable">
<div className="dataHead">
<div className="row">
<div className="column">場站代號</div>
<div className="column">場站區域</div>
<div className="column">場站名稱</div>
<div className="column">目前車輛數</div>
<div className="column">資料更新時間</div>
</div>
</div>
<YouBikeSiteRow siteList={this.state.siteList}/>
</div>
<div className="buttonList">
<button onClick={this.previousPage}>上一頁</button>
<button onClick={this.nextPage}>下一頁</button>
</div>
</div>
)
}
});
ReactDOM.render(
<YouBikeTable />,
document.getElementById('container')
);
</pre>
完整的範例可以到
<span class="techn"><a href="https://github.com/javakidx/node-react" target="_blank">GitHub</a></span>下載。Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0tag:blogger.com,1999:blog-5252179981300499332.post-84881086431131688392015-09-23T00:15:00.001+08:002015-09-24T01:25:40.564+08:00【筆記】用Java來做氣泡排序法的簡單範例一直以來,想給自己補一下在演算法等基礎的不足,所以就從最基本的排序法開始,希望可以持續下去,XD
<br />
<br />
下列程式是拜歐依書中的範例改成<span class="techn">Java</span>版本的。
<br />
<pre class="brush: java">package idv.jk.study.algorithm.sort;
import java.util.Scanner;
/**
* Created by javakid on 15/9/22.
*/
public class BubbleSort
{
public static void main(String[] args)
{
int scores[] = new int[100];
int size;
System.out.println("輸入分數的總數...");
Scanner scanner = new Scanner(System.in);
size = scanner.nextInt();
System.out.println("輸入分數(用,隔開)...");
String strNumbers = scanner.next();
String numbers[] = strNumbers.split(",");
//把輸入的數字存入到陣列中
for(int i = 0; i < numbers.length; i++)
{
scores[i] = Integer.parseInt(numbers[i]);
}
int temp; //於大小比對時暫存數字的變數
//開始對所有數字做排列
for(int i = 0; i < size; i++)
{
//size - i表第2次只要比對size-1個數字,
// 第3次只要比對size-2個數字,以此類推
for (int j = 0; j < size - i; j++)
{
//由小至大,兩兩比對做數字交換
if (scores[j] < scores[j+1])
{
temp = scores[j];
scores[j] = scores[j+1];
scores[j+1] = temp;
}
}
}
//印出結果
for(int i = 0; i < size; i++)
{
System.out.printf("%d ", scores[i]);
}
}
}
</pre>
重點
<br />
<ul>
<li>若有 <i>n</i> 個數字要進行排多,只需將 <i>n-1</i> 個數字歸位</li>
<li>相鄰的數字比較後,依需要做大小交換</li>
<li>時間複雜度為<i>O(N<sup>2</sup>)</i></li>
</ul>
<br />
若真想打好演算法的底子,建議您拜歐正在念的這本:
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.books.com.tw/exep/assp.php/bioankeyang/products/0010656544?utm_source=bioankeyang&utm_medium=ap-books&utm_content=recommend&utm_campaign=ap-201509" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDHOAyVnS0FBJHc-wK9cq1NfSFYvJXrjiZUI3jpT6W3eRQQfGKHKBgXYD6QXSqrvyaIik_PfAAsIkR-o31OdPDTd_06auDT-Xms1egaqDm877SaKmqY1RKxj0jUEFxasJT74ffi5gfQm-j/s200/getImage.jpeg" width="200" /></a></div>
<br />
<br />Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0tag:blogger.com,1999:blog-5252179981300499332.post-76022008962449523492015-08-28T12:12:00.001+08:002015-08-28T12:12:14.850+08:00【心得】初老宣言XD<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7DrzMD-eIyQDYrDCs5GUJw0f9Vw67Fndx38bWo52DmgdZvC7WknxFUHt2XLA9MYMA5dy8iztS5Ad7eFBDljCeAUFyjK2BNClsuTIov3BVzh-0J6qKhsV9SNWsycO6dpTX_zMmiVZtvpiO/s1600/photo-1429198739803-7db875882052.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7DrzMD-eIyQDYrDCs5GUJw0f9Vw67Fndx38bWo52DmgdZvC7WknxFUHt2XLA9MYMA5dy8iztS5Ad7eFBDljCeAUFyjK2BNClsuTIov3BVzh-0J6qKhsV9SNWsycO6dpTX_zMmiVZtvpiO/s400/photo-1429198739803-7db875882052.jpg" width="266" /></a></div>
<div style="text-align: center;">
<span style="font-size: x-small;">圖片來源:https://images.unsplash.com/photo-1429198739803-7db875882052?q=80&fm=jpg&s=73fc6976c560896a0561a6d4119803a0</span></div>
<br />
<ul>
<li>趁年輕好好聽歌,好好流淚。</li>
</ul>
Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0tag:blogger.com,1999:blog-5252179981300499332.post-75537461477502295602015-08-27T00:21:00.001+08:002015-09-10T00:40:09.348+08:00【筆記】Android Studio的快捷鍵交互地用<span class="techn">Mac</span>和<span class="techn">Windows</span>,有些快捷鍵真的會忘,來記一下吧!<br />
<br />
<table cellspacing="0" class="data_table"><tbody>
<tr class="header">
<td style="text-align: center;"><b>Mac快捷鍵</b></td>
<td style="text-align: center;"><b>Windows快捷鍵</b></td>
<td style="text-align: center;"><b>動作</b></td>
</tr>
</tbody><tbody>
<tr>
<td></td>
<td><b>Alt</b> + ↑(方向鍵上)、<b>Alt</b> + ↓(方向鍵上)</td>
<td>在相鄰的方法間上下來回</td>
</tr>
<tr>
<td><b>command</b>+ <b>delete</b></td>
<td><b>Ctrl</b> + <b>Y</b></td>
<td>刪除整行</td>
</tr>
<tr>
<td><b>command</b> + <b>fn</b> + <b>F12</b></td>
<td><b>Ctrl</b> + <b>F12</b></td>
<td>在類別中搜尋方法</td>
</tr>
<tr>
<td><b>command</b> + <b>N</b></td>
<td><b>Alt</b> + <b>insert</b></td>
<td>Generate,可以產生建構子、Getter、Setter、覆寫方法等</td>
</tr>
<tr>
<td><b>command</b> + <b>shift</b> + <b>U</b></td>
<td></td>
<td>選取的字串轉換大小寫</td>
</tr>
<tr>
<td><b>Ctrl</b> + <b>I</b></td>
<td><b>Ctrl</b> + <b>I</b></td>
<td>實現(implement)介面或抽像類別的方法(method)</td>
</tr>
<!--
<tr>
<td></td>
<td></td>
<td></td>
</tr>
-->
</tbody>
</table>
<br />
參考資料
<br />
<ul>
<li><a href="https://developer.android.com/sdk/installing/studio-tips.html" target="_blank">Android Studio Tips and Tricks</a></li>
</ul>
Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0tag:blogger.com,1999:blog-5252179981300499332.post-31728707761404041522015-08-21T18:39:00.000+08:002015-11-05T09:36:08.041+08:00【心得】工作上的一些想法<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMbGLVbutCtv_Pplv9sjzJ6GD2H2FXFoylsPiVYsvq34SCjVZYwFTbgk8Qki-m4Pcms4b7L7R_N08LAaMEuIUvvaAdnvhOVIFI05DVQirrFdeFeWyM7BOGjUuSeOLVpq2k0DcvNJzesyih/s1600/photo-1436915947297-3a94186c8133.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMbGLVbutCtv_Pplv9sjzJ6GD2H2FXFoylsPiVYsvq34SCjVZYwFTbgk8Qki-m4Pcms4b7L7R_N08LAaMEuIUvvaAdnvhOVIFI05DVQirrFdeFeWyM7BOGjUuSeOLVpq2k0DcvNJzesyih/s400/photo-1436915947297-3a94186c8133.jpg" width="400" /></a></div>
<ul>
<li>某產品還沒受精時,就在想老闆怎麼會打分數,可以直接跟該產品說:「你已經死了」。</li>
<li>愛抱怨的小孩,很難長大。</li>
<li>做事不要只擔心著會被老闆打搶,偶爾也想想怎樣能給老闆打一槍。</li>
<li>適時的溝通很重要,不要忍著讓原本可以討論的事變成抱怨;最後,把工作環境染成互相消費的氣圍。</li>
<li>不要選擇太安逸的環境,這個時代,安逸代表很低的機會可以長進。</li>
</ul>
Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0tag:blogger.com,1999:blog-5252179981300499332.post-72798048150219430652015-08-20T20:35:00.003+08:002015-08-20T20:48:33.891+08:00【筆記】Android模擬器(emulator)的快捷鍵<table cellspacing="0" class="data_table">
<tbody>
<tr class="header">
<td style="text-align: center;"><b>Mac快捷鍵</b></td>
<td style="text-align: center;"><b>Windows快捷鍵</b></td>
<td style="text-align: center;"><b>效用</b></td>
<td style="text-align: center;"><b>備註</b></td></tr>
</tbody><tbody>
<tr>
<td></td>
<td>Ctrl + F12</td>
<td>垂直、水平翻轉</td>
<td></td>
</tr>
<tr>
<td></td>
<td>Esc</td>
<td>返回</td>
<td>對應到裝置的「Back」按鈕</td>
</tr>
<tr>
<td></td>
<td>F7</td>
<td>鎖定螢幕,解除螢幕鎖定</td>
<td></td>
</tr>
<tr>
<td></td>
<td>Home</td>
<td>回首頁畫面</td>
<td>對應到裝置的「Home」按鈕</td>
</tr>
<!--
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
-->
</tbody>
</table>
<br />
參考資料
<br />
<ul>
<li><a href="http://developer.android.com/tools/help/emulator.html" target="_blank">Android Emulator</a></li>
</ul>Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0tag:blogger.com,1999:blog-5252179981300499332.post-62395063156920121122015-06-24T23:52:00.000+08:002015-06-24T23:52:37.155+08:00【筆記】用Java做蛇與樓梯(snakes and ladders)遊戲的簡單範例今天在書上看到一個蛇與樓梯的程式,其規則大致如下:<br />
<br />
<ol>
<li>擲骰子來決定要走的步數。</li>
<li>從數字1開始走到最大數字(如下圖中的25)。</li>
<li>若走到梯子下,就可以延著梯子爬上去(前進)。</li>
<li>若走到蛇頭,就要延著蛇身滑下去(倒退)。</li>
</ol>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvrGF7ZGsRtYzJ4qVwigJ2IbmrttU9ef49cqYf44ckUhY9pymJn-zEM5wBmtWvJzyU2k1lE0cMyJQk1LIhvzfmxgsgX_QVNOpdDYM_Egj0UEfB9Xjg0ld80qh30zRIAw8hyphenhyphengf7q8qMf2H_/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E6%2588%25AA%25E5%259C%2596+2015-06-24+23.37.04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvrGF7ZGsRtYzJ4qVwigJ2IbmrttU9ef49cqYf44ckUhY9pymJn-zEM5wBmtWvJzyU2k1lE0cMyJQk1LIhvzfmxgsgX_QVNOpdDYM_Egj0UEfB9Xjg0ld80qh30zRIAw8hyphenhyphengf7q8qMf2H_/s320/%25E8%259E%25A2%25E5%25B9%2595%25E6%2588%25AA%25E5%259C%2596+2015-06-24+23.37.04.png" width="318" /></a></div>
<div>
<br /></div>
<br/>
其程式碼如下:
<pre class="brush: java">
package idv.jk.fun;
public class SnakesAndLadders
{
private static final int finalSquare = 25;
public static void main(String[] args)
{
int[] board = new int[finalSquare + 1];
for(int i = 0; i <= finalSquare; i++)
{
board[i] = 0;
}
//定義走到的格子要上樓梯或滑下蛇後,要前進或後退幾格
board[3] = +8;
board[6] = +11;
board[9] = +9;
board[10] = +2;
board[14] = -10;
board[19] = -11;
board[22] = -2;
board[24] = -8;
int diceNumber = 0;//擲出的點數
int step = 0; //走到第幾格
while(step < finalSquare)
{
//擲骰子
diceNumber = (int)(Math.random() * 6 + 1);
System.out.print("擲出的點數: " + diceNumber + ", ");
step += diceNumber;
if(step < board.length)
{
if(board[step] > 0)
{
System.out.print("上樓梯, 爬上 " + board[step] + " 格, ");
}
else if(board[step] < 0)
{
System.out.print("下蛇身, 滑下 " + board[step] + " 格, ");
}
step += board[step];
}
System.out.println("前進到第 " + step + " 格");
}
System.out.println("結束");
}
}
</pre>
執行結果為:
<pre>
擲出的點數: 3, 上樓梯, 爬上 8 格, 前進到第 11 格
擲出的點數: 3, 下蛇身, 滑下 -10 格, 前進到第 4 格
擲出的點數: 3, 前進到第 7 格
擲出的點數: 5, 前進到第 12 格
擲出的點數: 1, 前進到第 13 格
擲出的點數: 1, 下蛇身, 滑下 -10 格, 前進到第 4 格
擲出的點數: 4, 前進到第 8 格
擲出的點數: 4, 前進到第 12 格
擲出的點數: 6, 前進到第 18 格
擲出的點數: 6, 下蛇身, 滑下 -8 格, 前進到第 16 格
擲出的點數: 4, 前進到第 20 格
擲出的點數: 1, 前進到第 21 格
擲出的點數: 4, 前進到第 25 格
結束
</pre>Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0tag:blogger.com,1999:blog-5252179981300499332.post-25821598250868776692015-06-09T00:16:00.000+08:002015-06-09T21:14:51.086+08:00【筆記】在Ubuntu 14.04中,用python來連線並查詢MySQL中的資料先到<a href="http://dev.mysql.com/get/Downloads/Connector-Python/mysql-connector-python_2.0.4-1debian7.6_all.deb" target="_blank">這裡</a>下載<code>mysql-connector-python_2.0.4-1debian7.6_all.deb</code>:
<pre class="brush: bash">
wget http://dev.mysql.com/get/Downloads/Connector-Python/mysql-connector-python_2.0.4-1debian7.6_all.deb
</pre>
並將其安裝:
<pre class="brush: bash">
sudo dpkg -i mysql-connector-python_2.0.4-1debian7.6_all.deb
</pre>
安裝完成後,就開始來寫程式吧!這裡將程式存成<code>mysql_query.py</code>:
<pre class="brush: python">
#!/usr/bin/python
import mysql.connector
cnx = mysql.connector.connect(user='cbuser', password='cbpass',
host='127.0.0.1',
database='cookbook')
cursor = cnx.cursor();
query = "select a, b from test"
cursor.execute(query)
for(a, b) in cursor:
print("column a is {}, column b is {}".
format(a, b))
cursor.close()
cnx.close()
</pre>
在<code>test</code>這個資料表中的資料如下:
<pre>
+---+------+
| a | b |
+---+------+
| 1 | abc |
| 2 | xyz |
+---+------+
</pre>
最後執行程式:
<pre class="brush: bash">
python mysql_query.py
</pre>
執行結果為:
<pre>
column a is 1, column b is abc
column a is 2, column b is xyz
</pre>Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0tag:blogger.com,1999:blog-5252179981300499332.post-43696049588183721802015-06-03T01:33:00.001+08:002015-06-04T23:14:21.522+08:00【筆記】使用MapReduce來替換字串(replace string)的簡單程式拜歐先把要替換的檔案上傳到<span class="techn">HDFS</span>中。
<br />
<br />
上傳完成後,使用下列指令檢視其內容:
<br />
<pre class="brush: bash">hdfs dfs -cat /user/javakid/replace/replace.txt</pre>
輸入的檔案為<code>replace.txt</code>,其內容如下:
<br />
<pre class="brush: bash">foo1234foo567foo890foo123foo
foo1234foo567foo890foo123foo
foo1234foo567foo890foo123foo
foo1234foo567foo890foo123foo
foo1234foo567foo890foo123foo
foo1234foo567foo890foo123foo
foo1234foo567foo890foo123foo
foo1234foo567foo890foo123foo
foo1234foo567foo890foo123foo
foo1234foo567foo890foo123foo
</pre>
再來開始寫程式,拜歐是用<span class="techn">Intellij IDEA</span>來撰寫程式,在專案設定中,將編譯的輸出目錄(compile output path)設定為<code class="folder">/home/javakid/study/hadoop/classpath</code>。<br />
<br />
第一個要寫的是 <span class="techn">mapper</span>:
<br />
<pre class="brush: java;highlight: 27">package idv.jk.study.hadoop.myself;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
/**
* Created by javakid on 2015/6/3.
*/
public class StringReplaceMapper
extends Mapper<LongWritable, Text, NullWritable, Text>
{
private static final String TARGET = "foo";
private static final String REPLACEMENT = "bar";
@Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException
{
String line = value.toString();
if(line.indexOf(TARGET) >= 0)
{
context.write(NullWritable.get(),
new Text(line.replaceAll(TARGET, REPLACEMENT)));
}
}
}
</pre>
在<span class="techn">mapper</span>的輸出,拜歐要的只是替換後的每一行字串,這些值的key是什麼,並不重要,所以在上列程式中的第27行,用<span class="techn"><a href="https://hadoop.apache.org/docs/current/api/org/apache/hadoop/io/NullWritable.html" target="_blank">NullWritable</a></span>來做為輸出的key。
<br />
<br />
再來要寫的是 <span class="techn">reducer</span>:
<br />
<pre class="brush: java;highlight: 21">package idv.jk.study.hadoop.myself;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
/**
* Created by javakid on 2015/6/3.
*/
public class StringReplaceReducer
extends Reducer<NullWritable, Text, NullWritable, Text>
{
@Override
protected void reduce(NullWritable key, Iterable<Text> values, Context context)
throws IOException, InterruptedException
{
for(Text text : values)
{
context.write(NullWritable.get(), text);
}
}
}
</pre>
在<span class="techn">reducer</span>中,拜歐要的也只是將已經在<span class="techn">mapper</span>替換好的字串輸出,在第21行一樣使用<span class="techn"><a href="https://hadoop.apache.org/docs/current/api/org/apache/hadoop/io/NullWritable.html" target="_blank">NullWritable</a></span>來做為輸出的key。
<br />
<br />
最後是主程式:
<br />
<pre class="brush: java;highlight:[36,37]">package idv.jk.study.hadoop.myself;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
/**
* Created by javakid on 2015/6/3.
*/
public class StringReplace
{
public static void main(String[] argv)
throws IOException, ClassNotFoundException, InterruptedException
{
if(argv.length != 2)
{
System.err.println("Usage: StringReplace <input path> <output path>");
System.exit(-1);
}
Job job = new Job();
job.setJarByClass(StringReplace.class);
job.setJobName("String replacement");
FileInputFormat.addInputPath(job, new Path(argv[0]));
FileOutputFormat.setOutputPath(job, new Path(argv[1]));
job.setMapperClass(StringReplaceMapper.class);
job.setReducerClass(StringReplaceReducer.class);
job.setOutputKeyClass(NullWritable.class);
job.setOutputValueClass(Text.class);
System.out.println(job.waitForCompletion(true) ? 0 : 1);
}
}
</pre>
上列<code>setOutputKeyClass</code>和<code>setOutputValueClass</code>這兩個方法控制<span class="techn">reduce</span>方法中輸出的型別,而且與<span class="techn">reducer</span>中產出的輸出中設定,兩者必須是相同的。<br />
<br />
先將<code>HADOOP_CLASSPATH</code>設定好後,用<code>hadoop</code>指令來執行主程式:
<br />
<pre class="brush: bash">export HADOOP_CLASSPATH=/home/javakid/study/hadoop/classpath
hadoop idv.jk.study.hadoop.myself.StringReplace \
/user/javakid/replace/replace.txt /user/javakid/replace/output
</pre>
執行完成後,使用下列指令來確認結果:
<br />
<pre class="brush: bash">hdfs dfs -cat /user/javakid/replace/output/part-r-00000
</pre>
預期結果如下:
<br />
<pre class="brush: bash">bar1234bar567bar890bar123bar
bar1234bar567bar890bar123bar
bar1234bar567bar890bar123bar
bar1234bar567bar890bar123bar
bar1234bar567bar890bar123bar
bar1234bar567bar890bar123bar
bar1234bar567bar890bar123bar
bar1234bar567bar890bar123bar
bar1234bar567bar890bar123bar
bar1234bar567bar890bar123bar
</pre>
你可以在這裡找到<a href="https://github.com/javakidx/hadoopstudy" target="_blank">原始</a>碼。Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0tag:blogger.com,1999:blog-5252179981300499332.post-32177495557528575642015-05-30T01:07:00.003+08:002015-09-17T10:00:52.627+08:00【筆記】在Ubuntu 14.04建立Hadoop多節點叢集-分散式架構(Multi-node cluster)這裡使用的版本是<code>2.6.0</code>,之前有些設定如設定<span class="techn">JAVA_HOME</span><br />
或是<span class="techn">ssh</span>等,在<a href="http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-common/SingleCluster.html" target="_blank">Setting up a Single Node Cluster</a>己經完成,若有撞牆的地方,可以回去參考一下。<br />
<br />
在拜歐的<span class="techn">cluster</span>中,會有四台機器,分別為:<br />
<ul>
<li><span class="techn">javakid01</span>:做為<span class="techn">master</span>,會用它來跑<span class="techn">NameNode</span>和<span class="techn">SecondaryNameNode</span></li>
<li><span class="techn">jkserver01</span>:做為<span class="techn">slaves</span>,會用它來跑<span class="techn">DataNode</span></li>
<li><span class="techn">jkserver02</span>:做為<span class="techn">slaves</span>,會用它來跑<span class="techn">DataNode</span></li>
<li><span class="techn">jkserver03</span>:做為<span class="techn">slaves</span>,會用它來跑<span class="techn">DataNode</span></li>
</ul>
<br />
若要改<code>hostname</code>,你可以這樣做:
<br />
<pre class="brush: bash">sudo vi /etc/hostname
</pre>
上列四台機器中,先確認已經安裝好<span class="techn">Java</span>和<span class="techn">Hadoop</span>。
<br />
<br />
先對<span class="techn">javakid01</span>(master),進行設定,在<code class="folder">/etc/hosts</code>中加入:
<br />
<pre class="brush: bash">10.211.55.10 javakid01
10.211.55.7 jkserver01
10.211.55.13 jkserver02
10.211.55.14 jkserver03
</pre>
再來編輯<code class="folder">$HADOOP_INSTALL/etc/hadoop/core-site.xml</code>加入下列設定:
<br />
<pre class="brush: xml"><configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://javakid01:9000</value>
</property>
</configuration>
</pre>
接著編輯<code class="folder">$HADOOP_INSTALL/etc/hadoop/hdfs-site.xml</code>加入下列設定:
<br />
<pre class="brush: xml"><configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/opt/data/hadoop/hadoop_data/hdfs/namenode</value>
</property>
</configuration>
</pre>
上面設定好後,使用下列指令建立上列設定的目錄,建立前請確定有足夠的權限:
<br />
<pre class="brush: bash">mkdir -p opt/data/hadoop/hadoop_data/hdfs/namenode
</pre>
接著編輯<code class="folder">$HADOOP_INSTALL/etc/hadoop/mapred-site.xml</code>加入下列設定:
<br />
<pre class="brush: xml"><configuration>
<property>
<name>mapred.job.tracker</name>
<value>javakid01:54311</value>
</property>
</configuration>
</pre>
接著編輯<code class="folder">$HADOOP_INSTALL/etc/hadoop/yarn-site.xml</code>加入下列設定:
<br />
<pre class="brush: xml"><configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>javakid01:8025</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>javakid01:8030</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>javakid01:8050</value>
</property>
</configuration>
</pre>
最後,在<code class="folder">$HADOOP_INSTALL/etc/hadoop/slaves</code>中加入做為<span class="techn">DataNode</span>的<code>hostname</code>
<br />
<pre class="brush: bash">jkserver01
jkserver02
jkserver03
</pre>
下面要開始對做為<span class="techn">slaves</span>的機器進行設定,其中<code>jkserver01</code>、<code>jkserver02</code>與<code>jkserver03</code>的設定幾乎是相同的。
<br />
<br />
<!-- data node -->
一樣先在<code class="folder">/etc/hosts</code>中加入:
<br />
<pre class="brush: bash">10.211.55.10 javakid01
10.211.55.7 jkserver01
10.211.55.13 jkserver02
10.211.55.14 jkserver03
</pre>
請注意!上列的IP會因機器不同而有差異,這裡設定是以我的機器為例。
<br/><br/>
再來編輯<code class="folder">$HADOOP_INSTALL/etc/hadoop/core-site.xml</code>加入下列設定:
<br />
<pre class="brush: xml"><configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://javakid01:9000</value>
</property>
</configuration>
</pre>
接著編輯<code class="folder">$HADOOP_INSTALL/etc/hadoop/hdfs-site.xml</code>加入下列設定:
<br />
<pre class="brush: xml"><configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/opt/data/hadoop/hadoop_data/hdfs/datanode</value>
</property>
</configuration>
</pre>
上面設定好後,使用下列指令建立上列設定的目錄,建立前請確定有足夠的權限:
<br />
<pre class="brush: bash">mkdir -p opt/data/hadoop/hadoop_data/hdfs/datanode
</pre>
接著編輯<code class="folder">$HADOOP_INSTALL/etc/hadoop/mapred-site.xml</code>加入下列設定:
<br />
<pre class="brush: xml"><configuration>
<property>
<name>mapred.job.tracker</name>
<value>javakid01:54311</value>
</property>
</configuration>
</pre>
接著編輯<code class="folder">$HADOOP_INSTALL/etc/hadoop/yarn-site.xml</code>加入下列設定:
<br />
<pre class="brush: xml"><configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>javakid01:8025</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>javakid01:8030</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>javakid01:8050</value>
</property>
</configuration>
</pre>
最後,也要將讓<span class="techn">DataNode</span>知道<span class="techn">slaves</span>的設定。在<code class="folder">$HADOOP_INSTALL/etc/hadoop/slaves</code>中加入做為<span class="techn">DataNode</span>的<code>hostname</code>
<br />
<pre class="brush: bash">jkserver01
jkserver02
jkserver03
</pre>
接下來,為了讓<span class="techn">master</span>不用密碼就可登入<span class="techn">slaves</span>的話,需要進行<span class="techn">SSH</span>連線的設定。
<br />
<br />
回到<code>javakid01</code>這台機器,在終端機下執行:
<br />
<pre class="brush: bash">ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
</pre>
然後執行:
<br />
<pre class="brush: bash">ssh-copy-id -i ~/.ssh/id_rsa.pub javakid@jkserver01
</pre>
完成後,由<code>javakid01</code>登入<code>jkserver01</code>,第一次登入會需要在<code>jkserver01</code>上的使用者密碼:
<br />
<pre class="brush: bash">ssh jkserver01
</pre>
對<code>jkserver02</code>與<code>jkserver03</code>進行相同設定,在<code>javakid01</code>執行:
<br />
<pre class="brush: xml">ssh-copy-id -i ~/.ssh/id_rsa.pub javakid@jkserver02
</pre>
登入<code>jkserver02</code>:
<br />
<pre class="brush: xml">ssh jkserver02
</pre>
接著執行:
<br />
<pre class="brush: xml">ssh-copy-id -i ~/.ssh/id_rsa.pub javakid@jkserver03
</pre>
登入<code>jkserver03</code>:
<br />
<pre class="brush: xml">ssh jkserver03
</pre>
全部設定完成後,在<code>javakid01</code>執行下列指令對<span class="techn">HDFS</span>進行格式化:
<br />
<pre class="brush: bash">hadoop namenode -format
</pre>
接著啟動<span class="techn"> HDFS Daemons</span>:
<br />
<pre class="brush: bash">$HADOOP_INSTALL/sbin/start-dfs.sh
</pre>
成功啟動後,在<code>javakid01</code>執行<code>jps</code>指令:
<br />
<pre class="brush: bash">jps
</pre>
應該可以看到下列的結果:
<br />
<pre class="brush: bash">27964 NameNode
28220 SecondaryNameNode
29695 Jps
</pre>
再來若是到<code>jkserver01</code>、<code>jkserver02</code>或<code>jkserver03</code>任一台機器執行<code>jps</code>,應該可以看到下列結果:
<br />
<pre class="brush: bash">2204 DataNode
2378 Jps
</pre>
若在瀏覽器輸入<code>http://javakid01:50070</code>這個網址,應該在<span class="techn">Datanodes</span>這個頁籤看到三台機器的資訊:
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjME_QZ-A-_crZW9mCFKYy199KfPxVBJMedK_w6E2ljvmhGmAoOTmNRWA9IecZC6OSuMeYjgTgeVtdvufgDIoEU8UIdjJ5R3MrmHyl8CU7Eh92qSCSAYuF9oVlDE_lyvBI5x8sa959mRn-F/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E6%2588%25AA%25E5%259C%2596+2015-05-30+01.06.38.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="135" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjME_QZ-A-_crZW9mCFKYy199KfPxVBJMedK_w6E2ljvmhGmAoOTmNRWA9IecZC6OSuMeYjgTgeVtdvufgDIoEU8UIdjJ5R3MrmHyl8CU7Eh92qSCSAYuF9oVlDE_lyvBI5x8sa959mRn-F/s400/%25E8%259E%25A2%25E5%25B9%2595%25E6%2588%25AA%25E5%259C%2596+2015-05-30+01.06.38.png" width="400" /></a></div>
<br />Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0tag:blogger.com,1999:blog-5252179981300499332.post-42169649861282764652015-05-26T12:55:00.000+08:002015-06-30T13:05:36.833+08:00【筆記】Hadoop名詞解釋<table cellspacing="0" class="data_table">
<tbody>
<tr class="header"><td style="text-align: center;"><b>名詞</b></td><td style="text-align: center;"><b>意思</b></td><td style="text-align: center;"><b>備註</b></td></tr>
</tbody><tbody>
<tr><td>metrics</td><td>HDFS與MapReduce daemon會收集一些與事件以及量測相關的資訊,這些總稱為metrics</td><td>例如,datanode會收集已寫入的byte數、已複製的block總數等metrics</td></tr>
<tr><td>data locality optimization</td>
<td>Hadoop在執行map task時,會盡全力將該task放到存放輸入該task資料的那台node去執行,以免使用到寶貴的頻寬進行資料的傳送</td>
<td></td></tr>
<tr><td>shuffle</td>
<td>A proccess by which the system performs the sort and transfers the map outputs to the reducers as inputs.</td>
<td></td></tr>
<tr><td>speculative execution</td>
<td>Hadoop doesn't try to diagnose and fix slow-running tasks; instead, it tries to detect when a task is running slower than expected and launches another equivalent task as a backup.</td>
<td></td></tr>
</tbody>
</table>Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0tag:blogger.com,1999:blog-5252179981300499332.post-2546239988732754252015-05-05T01:49:00.000+08:002015-05-05T01:49:28.804+08:00【分享】解決Java連Mongo DB時,出現no such cmd: saslStart錯誤今天在使用<span class="techn">Java</span>連
<span class="techn">Mongo DB</span>時發生了一個錯誤,訊息如下:
<br />
<pre class="brush: plain">Exception in thread "main" com.mongodb.CommandFailureException: { "serverUsed" : "192.168.55.12:22004" , "ok" : 0.0 , "errmsg" : "no such cmd: saslStart"}
</pre>
我使用的
<span class="techn">Java MongoDB Driver</span>是
<span class="techn">2.12.3</span>而連線的<span class="techn">Mongo DB</span>版本是<span class="techn">2.4.3</span>。<br />
<br />
使用的程式碼如下:
<br />
<pre class="brush: java">
MongoCredential credential = MongoCredential.createPlainCredential("foo", "testDB", "bar".toCharArray());
MongoClient mongoClient = new MongoClient(new ServerAddress("192.168.55.12", 22004), Arrays.asList(credential));
DB db = mongoClient.getDB("testDB");
</pre>
後來發現在使用<code>MongoCredential.createPlainCredential</code>這個方法時,在<span class="techn">Mongo DB</span>的<span class="techn">2.6</span>版本是才支援的,詳細可以參考<a href="http://api.mongodb.org/java/2.12/" target="_blank">文件</a>內說明。
<span class="techn"></span><span class="techn"></span>Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0tag:blogger.com,1999:blog-5252179981300499332.post-9365075021282675342015-04-28T01:25:00.000+08:002015-04-28T01:39:36.744+08:00【分享】解決MacBook Pro 開機、關機變慢的問題<h3>
開機變慢</h3>
<br />
好像在上周更新過<span class="techn">OS X Yosemite</span>之後,開機就明顯變得很慢:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdFmYSCOUYq3Y277aCQqxh_6yRGiwSt-UCu6DyMQV5gMHQw6WMDII_PVTxd1t2GrvZXwpqrd9pCh4-cPHsQpcUMx92Ov_GqjLeAnTGSyYD-iuAQYOFBJWCpwELJr7dOueRYlMKBFJS6yz5/s1600/%E8%9E%A2%E5%B9%95%E6%88%AA%E5%9C%96+2015-04-28+00.24.51.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdFmYSCOUYq3Y277aCQqxh_6yRGiwSt-UCu6DyMQV5gMHQw6WMDII_PVTxd1t2GrvZXwpqrd9pCh4-cPHsQpcUMx92Ov_GqjLeAnTGSyYD-iuAQYOFBJWCpwELJr7dOueRYlMKBFJS6yz5/s1600/%E8%9E%A2%E5%B9%95%E6%88%AA%E5%9C%96+2015-04-28+00.24.51.png" height="95" width="400" /></a></div>
<br />
<span style="color: red;">這裡無法確認更新是否為確切造成開機變慢的原因,只是剛好在此時間點後,狀況變得明顯。</span><br />
<br />
一開始在網路上找到的解法,不外乎是「修復磁碟權限」、把不必要的「登入項目」關閉,或是清除桌面等,該試的都試過了,拜歐一開機等白蘋果出來前,還是要望著非常久的黑螢幕,想著為何會變這麼慢。
<br />
<br />
後來找到這串討論串:<a href="http://www.mobile01.com/topicdetail.php?f=177&t=978067" target="_blank">請問各位大哥 為什麼MBP 開機會變慢</a>,六樓朋友的回應,解決了拜歐開機速度慢的問題。<br />
<br />
拜歐是這樣做的,先到【系統徧好設定】,在下方倒收第二排有個【啟動磁碟】:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbgBMlL5TVn6CZgj16rix7v4b_AxR5jzOFhR19PbTqNy0pqRm289DeXUNfMxqb1zR0wD_9e3imQLdw2Ae7d9_2a2gFSQm4yBlZ4ihH8N4W1Bxz6Fbp2mOB9t8DHZBmkwWlzhnzgapvUdkQ/s1600/%E8%9E%A2%E5%B9%95%E6%88%AA%E5%9C%96+2015-04-28+01.15.49_02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbgBMlL5TVn6CZgj16rix7v4b_AxR5jzOFhR19PbTqNy0pqRm289DeXUNfMxqb1zR0wD_9e3imQLdw2Ae7d9_2a2gFSQm4yBlZ4ihH8N4W1Bxz6Fbp2mOB9t8DHZBmkwWlzhnzgapvUdkQ/s1600/%E8%9E%A2%E5%B9%95%E6%88%AA%E5%9C%96+2015-04-28+01.15.49_02.png" height="357" width="400" /></a></div>
<br />
點進去後,在「請選擇要用來開機的系統」中,選擇要開機的硬碟後,再重新開機:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtCwCROs-aUmy0kjuSo1fhEx82ho5doIuh29nFkouCqJw2AxyHa_7WLxmmjmACAbuJlcNNz1bTjxvVz0Fd19lEmQF1YVNEauWhBUqDQXU5Ha-HU3EUEdXeFVapZ_dTrOjrqvujRB5ewCSG/s1600/%E8%9E%A2%E5%B9%95%E6%88%AA%E5%9C%96+2015-04-28+01.19.09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtCwCROs-aUmy0kjuSo1fhEx82ho5doIuh29nFkouCqJw2AxyHa_7WLxmmjmACAbuJlcNNz1bTjxvVz0Fd19lEmQF1YVNEauWhBUqDQXU5Ha-HU3EUEdXeFVapZ_dTrOjrqvujRB5ewCSG/s1600/%E8%9E%A2%E5%B9%95%E6%88%AA%E5%9C%96+2015-04-28+01.19.09.png" height="212" width="400" /></a></div>
<br />
上面的做法解決了拜歐的問題,不禁猜想,會不會是兒子三不五時,找到機會就偷敲鍵盤造成設定跑掉的,XD<br /><br />
<h3>
關機變慢</h3>
<br />
在<span class="techn">Google</span>上打了「macbook pro 關機變慢」的關鍵字,第一筆出現這一篇:<a href="http://www.mobile01.com/topicdetail.php?f=481&t=4124704" target="_blank">解決升上Yosemite-OS X10.10關機速度慢的問題</a>,這位樓主分享了一篇在<span class="techn"><a href="https://discussions.apple.com/welcome" target="_blank">Apple Support Communities</a></span>上討論到<a href="https://discussions.apple.com/thread/6603318" target="_blank">Slow shutdown on Yosemite</a>的問題。<br />
<br />
這個提到<span class="techn">MacBook Pro</span>會變慢的原因,可能是有裝舊版本的<span class="techn">Parallels Desktop</span>,受其影響的關係,拜歐的<span class="techn">MacBook Pro</span>也有裝,心想,有可能是這個原因。<br />
<br />
其解決方法提到,要到<code class="folder">~/Library/LaunchAgents</code>和<code class="folder">~/Library/LaunchDaemons</code>把有「parallels」字眼的檔案都清掉,在拜歐的電腦中只找到<code class="folder">~/Library/LaunchAgents</code>這個資料夾,而就索性把<code class="folder">~/Library/LaunchAgents</code>裡面的檔案全刪了,果然,關機就感覺有恢復跟原來一樣的速度,而<span class="techn">Parallels Desktop</span>也能正常運作。
<br />
<br />
<span style="color: red;">請注意,這解決了拜歐的問題,不一定適用看倌您的情境,請在刪不知用途的檔案前,請三思而後行XDD
</span><br />
<br />
討論串中還有一位仁兄提到<code class="folder">~/Library/Preferences</code>這個資料夾中和「parallels」有關的檔案也要刪,這裡面的拜歐沒動,就不知道有沒有助益了。<br />
<br />
<br />Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0tag:blogger.com,1999:blog-5252179981300499332.post-75964411009244806792015-04-25T02:05:00.000+08:002015-04-25T02:09:32.157+08:00【筆記】在PHP中太長的數字以科學符號(scientific notation)顯示的解決方案寫過<span class="techn">PHP</span>的人一定遇到,過長的數字<code>echo</code>出來後,非所預期地以科學符號顯示的問題,如:
<br />
<pre class="brush: php">$f1 = 201504242111234;
$f2 = 201504191213211;
echo $f1 . ',' . $f2;
</pre>
一般預期的結果應該為:
<br />
<pre class="brush: plain">201504242111234,201504191213211
</pre>
但實際上,結果可能為:
<br />
<pre class="brush: plain">2.0150424211123E+14,2.0150419121321E+14
</pre>
這時若只是要在網頁上顯示所要的格式,可以使用<code>printf</code>(<a href="http://php.net/manual/zh/function.printf.php" target="_blank">文件</a>)這個方法,它的用法是:
<br />
<pre class="brush: php">int printf ( string $format [, mixed $args [, mixed $... ]] )
</pre>
其中,第一個參數為要印出的格式設定,詳細說明可以參考<a href="http://php.net/manual/zh/function.sprintf.php" target="_blank">這裡</a>。
<br /><br />
據此,可以把上面<code>echo</code>的這一行替換成下面程式:
<br />
<pre class="brush: php">printf('%.0f,%.0f', $f1, $f2);
</pre>
這裡<code>%.0f</code>的意思是說,以浮點數的格式去顯示後面傳入的參數,在其中的<code>0</code>是指小數點後要顯示的位數為「0」。
<br />
<br />
另外,因為<code>%.0f</code>有兩個,後面要傳入對應的兩個浮點數。
<br />
<br />
有時,在一些情況下需要在程式中將兩個浮數數串在一起,好讓後面的程式使,這時就要使用到<code>sprintf</code>(<a href="http://php.net/manual/zh/function.sprintf.php" target="_blank">文件</a>)這個方法:
<br />
<pre class="brush: php">
string sprintf ( string $format [, mixed $args [, mixed $... ]] )
</pre>
從上面可以看到,它回傳的是一個字串,所以可以這樣使用:
<pre class="brush: php">
$s1 = sprintf('%.0f', $f1);
$s2 = sprintf('%.0f', $f2);
$s3 = $s1 . ',' . $s2;
//$s3有可能有其他如做為SQL的運用
//這裡僅把它印出來
echo $s3;
</pre>Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0tag:blogger.com,1999:blog-5252179981300499332.post-58762231481239354392015-04-25T01:30:00.000+08:002015-04-25T01:30:39.725+08:00【分享】學習正規表示式(Regular Expression)的資源<span class="techn">Regular Expression</span>翻做中文為正規表示式,又稱正則表達式、正規表示法、正規運算式、規則運算式、常規表示法(<a href="http://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F" target="_blank">wiki</a>),在此拜歐習慣使用正規表示式這個翻譯,因為它唸起來最順,XD。
<br />
<br />
之前斷斷續續地涉略或鑽研正規表示式的用法,期間也找到一些在網路上覺得不錯的資源,因此在此記錄與分享。<br />
<br />
<h3>
OCPSoft</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1vTOi-lmcsq3FxP2v-MGMLMIjn7WNFVQ2n7hZX4PWxvPYXGswT1QfL9R8NAszCoO_9psrpmIUDm1_FGkC71osaclZlIUAPR9p4mbpPrhCMXRRxSY4RszuZk1BsbYo3wrgM89edc5MaiWM/s1600/2015-04-24_110414.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1vTOi-lmcsq3FxP2v-MGMLMIjn7WNFVQ2n7hZX4PWxvPYXGswT1QfL9R8NAszCoO_9psrpmIUDm1_FGkC71osaclZlIUAPR9p4mbpPrhCMXRRxSY4RszuZk1BsbYo3wrgM89edc5MaiWM/s1600/2015-04-24_110414.png" height="195" width="400" /></a></div>
<br />
<a href="http://www.ocpsoft.org/" target="_blank">OCPSoft</a>是一群喜好開放原始碼開發者的組織,在它的網站上找到兩篇講述<span class="techn">Java</span>和正規表示式的教學資源。<br />
<br />
<h4>
<a href="http://www.ocpsoft.org/opensource/guide-to-regular-expressions-in-java-part-1/" target="_blank">Guide to Regular Expressions in Java (Part 1)</a></h4>
<br />
<h4>
<a href="http://www.ocpsoft.org/opensource/guide-to-regular-expressions-in-java-part-2/" target="_blank">Guide to Regular Expressions in Java (Part 2)</a></h4>
Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0tag:blogger.com,1999:blog-5252179981300499332.post-2088465049996375472015-04-24T00:31:00.000+08:002015-04-24T00:31:57.951+08:00【筆記】在JavaScript中使用正規表示式擷取目標字串<pre class="brush: javascript">
(function(){
var input = '1990Mar02Taipei35';
var num = /(\d+)\D+(\d+)(\D+)(\d+)/g;
var result = num.exec(input);
console.log(RegExp.$1 + ' 年在 ' + RegExp.$3 + ' 的數值是: '
+ RegExp.$4);
})();
</pre>Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0tag:blogger.com,1999:blog-5252179981300499332.post-65179519741176076652015-04-24T00:23:00.004+08:002015-05-28T09:01:09.499+08:00【筆記】在Java中使用正規表示式(Regular Expression)切割字串在工作上若碰到要在一行字串去擷取資料時,如下面記錄某年某月某日某地區的某個數值:
<br />
<pre class="brush: plain">1990Mar02Taipei28
</pre>
常是以<code>substring</code>算好位置去截取各個資料,若有時可能應程式更新造成了一些例外,如上面的月份是英文簡寫,但程式更新後,記錄月份的方式變成:
<br />
<pre class="brush: plain">1991March03Tainan35
</pre>
這時若再用<code>substring</code>來切字串,就可能要做一些判斷來算位置。
<br />
<br />
當每一行資料的模式都是一樣時,如上面兩筆資料,都是數字、英文字、數字、英文字、數字時,就可以使用<code>Pattern</code>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#MULTILINE">文件</a>)搭配<code>Matcher</code>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html">文件</a>),以正規表示式來切字串:
<br />
<pre class="brush: java">package idv.jk.util.regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatcherTest
{
public static void main(String[] arv)
{
String input = "1990Mar02Taipei28\r\n1991March03Tainan35";
Pattern pattern = Pattern.compile("(\\d+)(\\D+)(\\d+)(\\D+)(\\d+)",
Pattern.MULTILINE);
Matcher matcher = pattern.matcher(input);
while(matcher.find())
{
System.out.println("The value at " + matcher.group(4) +
" in " + matcher.group(2) +
" " + matcher.group(1)+
" is " + matcher.group(5));
}
}
}
</pre>
結果為:
<br />
<pre class="plain">The value at Taipei in Mar 1990 is 28
The value at Tainan in March 1991 is 35
</pre>
上面範例用簡單的資料,來說明正規表示式的功用,在現實的工作上,資料模式通常都複雜許多,但若能熟悉正規表示式並應用得當,在檔案處理上必能得心應手。
<br />
<br />
若想進一步鑽研,可以考慮這一本:
<br />
<br />
<div style="text-align: center;">
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="//ws-na.amazon-adsystem.com/widgets/q?ServiceVersion=20070822&OneJS=1&Operation=GetAdHtml&MarketPlace=US&source=ac&ref=qf_sp_asin_til&ad_type=product_link&tracking_id=javakid-20&marketplace=amazon&region=US&placement=0596528124&asins=0596528124&linkId=UDVMLCB3MNPLQCOG&show_border=true&link_opens_in_new_window=true" style="height: 240px; width: 120px;">
</iframe></div>
<br />
它也有<a href="http://www.books.com.tw/exep/assp.php/bioankeyang/products/0010546974?utm_source=bioankeyang&utm_medium=ap-books&utm_content=recommend&utm_campaign=ap-201504" target="_blank">中文版</a>,XDBiohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0tag:blogger.com,1999:blog-5252179981300499332.post-11014769431743026062015-04-22T13:20:00.000+08:002015-04-22T13:23:49.268+08:00【筆記】在Ubuntu 14.04.2 Server安裝Redis(版本3.0.0)<span class="techn">Redis</span>目前官方有支援的版本就是<span class="techn">Linux-based</span>的作業系統,在這裡拜歐是在<span class="techn">Ubuntu 14.04.2 Server</span>安裝<span class="techn">Redis</span>,版本為<span class="techn">3.0</span>,先到<a href="http://download.redis.io/releases/redis-3.0.0.tar.gz" target="_blank">這裡</a>下載<span class="techn">Redis</span>。<br /><br />
在終端機中,輸入下列指令下載:
<br />
<pre class="brush: bash">wget http://download.redis.io/releases/redis-3.0.0.tar.gz
</pre>
下載完成後,將其解壓縮:
<br />
<pre class="brush: bash">
tar xzv -f redis-3.0.0.tar.gz
</pre>
進入<code>redis-3.0.0</code>目錄中執行<code>make</code>指令:
<br />
<pre class="brush: bash">
cd redis-3.0.0
make
</pre>
若顯示找不到<code>make</code>指令的訊息,請執行下列指令進行安裝:
<br />
<pre class="brush: bash">
sudo apt-get install make
</pre>
再來若遇到下列錯誤訊息:
<br />
<pre class="brush: plain;highlight:1">/bin/sh: 1: cc: not found
make[1]: *** [adlist.o] Error 127
make[1]: Leaving directory `/home/javakid/tools/nosql/redis-3.0.0/src'
make: *** [all] Error 2
</pre>
這裡要注意的是第一行的訊息,若是出現這個訊息,請執行下列指令進行安裝:
<br />
<pre class="brush: bash"> sudo apt-get install build-essential
</pre>
若有什麼檔案找不到的,如下列訊息:
<br />
<pre class="brush: plain">In file included from adlist.c:34:0:
zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory
#include <jemalloc/jemalloc.h>
^
</pre>
解決辦法只要去把缺的檔案make出來:
<br />
<pre class="brush: bash">cd deps
make jemalloc
</pre>
然後再回到redis-3.0.0目錄,再執行<code>make</code><br />
。
<br />
若是有再遇到下列訊息:
<br />
<pre class="brush: plain">cc: error: ../deps/hiredis/libhiredis.a: No such file or directory
cc: error: ../deps/lua/src/liblua.a: No such file or directory
make[1]: *** [redis-server] Error 1
make[1]: Leaving directory `/home/javakid/tools/nosql/redis-3.0.0/src'
make: *** [all] Error 2
</pre>
一樣先到<code class="techn">deps</code>執行,把缺的檔案make出來:
<br />
<pre class="brush: bash">cd deps
make hiredis lua jemalloc linenoise
</pre>
完成後,再回到上一層再執行<code>make</code>:
<br />
<pre class="brush: bash">cd ../
make
</pre>
<code>make</code>執行完畢後,執行下列指令,開始執行指令啟動<span class="techn">Redis</span>:
<br />
<pre class="brush: bash"> src/redis-server
</pre>Biohttp://www.blogger.com/profile/07925546615867453817noreply@blogger.com0