Wednesday, April 25, 2012

那你拿了嗎?




學生:「眼前社會的科技發達、資訊流通更是誇張,這樣海量的知識流通,又幾乎都是免費的,大家的競爭更加接近,我們該怎麼脫穎而出?就像是滿山的buffet,該怎麼拿?」





林百里:「那你拿了嗎?」

Linux Keyboard Shortcuts

在Linux底下與Command相處的時候,總是希望可以打越少東西卻做很多事情,於是乎「快捷鍵(Shortcuts)」這東西就誕生了!

稍微翻譯整理一下在Shell上頭我們普遍都可以使用的快捷鍵(來源

  • X Window System
    • ctrl + alt + + :zoom in,即放大螢幕上文字
    • ctrl + alt + - :zoom out,即縮寫螢幕上的文字
    • 滑鼠中間鍵:在一般gnome的Linux環境中,滑鼠中間鍵可以把你目前有在任何一處圈選(反白)的文字複製貼上
  • Command Line <input>
    • Home or ctrl+a:跳至句首
    • End or ctrl+e:跳至句尾
    • * alt + b:跳到上一個單字首(word, 以空白分開者)
    • * alt + f:跳到下一個單字首(word, 以空白分開者)
    • tab太重要了!它可以在你沒打完單字的時候自動補上剩餘的字元,若是沒有辦法找到唯一的對應,多按一下tab,會列出所有可能對應的選項
    • ctrl + u:刪掉現在這行
    • ctrl + k:從當前的位置,往後刪除到行底
    • ctrl + w:從當前的位置,往前刪除一個單字
  • Command Line <output>
    • shift + page up:往上檢視
    • shift + page down:往下檢視
    • clear or ctrl+l:清空目前頁面
    • reset:清空、類似於重新開啟這個terminal。比如你cat一個binary檔案,在你之後輸入command時不斷有字元跑出來煩你時可以用(根據該網頁的講法)
  • Command Line <history> 翻閱先前打過的command
    • history:查用近期的command紀錄(可以用pipeline配合grep, more等指令使用)
    • 上方向鍵 or ctrl + p:顯示上一個執行過的指令(查閱history)
    • 下方向鍵 or ctrl + n:顯示下一個執行過的指令(查閱history)
    • ctrl + r:透過類似於搜尋的功能,邊打邊搜尋對應history裡的紀錄
  • Command Line <其他>
    • ctrl + c:強至中止當前的process
    • ctrl + z:讓目前的process(前景)到後景運作,透過fg指令可以喚回,ps可以查看背景process有哪些
    • ctrl + d:寄送出已經沒有輸入的訊息。可用來寄送EOF訊息給一般process,或是直接按下後便log out當前的terminal
    • ctrl + alt + del:當機時候可以使用,至於對應的反應可能因系統而不同,可以/etc/inittab設定
p.s. 加'*'者表示該指令不一定能在圖形化界面的terminal操作,因為該shortcut往往已經被map到系統的其他地方


Reference:

Tuesday, April 24, 2012

Learning VIM

接續上回VIM - That's Why Linux,學習VIM的方法很多。

沒想到現在竟然有可以透過網頁遊戲學習的方法!!


寓教於樂呀。

Monday, April 23, 2012

Sharing IPMI IP with the host

以下連結的網頁是針對 IPMI 板子與 host 共用 IP 的問題所作的討論:
http://serverfault.com/questions/259792/how-does-ipmi-sideband-share-the-ethernet-port-with-the-host

我在此稍微作筆記、翻譯

  • Sharing Ethernet means that LAN1 appears to have 2 MAC addresses(the IPMI interface, the standard Broadcom NIC)
    • 公用同一條網路線表示LAN1會有兩個對應到的MAC位址(IPMI和原本的網路卡)
  • Traffic to the IPMI interface is magically intercepted below the operating system level and never seen by whatever OS is running.
    • 原本到 IPMI 介面的流量會跑到作業系統底下,而不論使用什麼作業系統都將無法看到

Downsides for sharing the IP for IPMI and OS host
  • It's particularly difficult to partition the IPMI interface onto a separate subnet in a secure manner.
    • 很難做到將兩者分開成不同子網路以保證安全
  • The latest IPMI cards now support assigning a VLAN to the IPMI NIC, so you can get some semblance of separation - but the underlying OS could always sniff the traffic for that VLAN.
    • 最新的IPMI卡可以支持把VLAN轉到IPMI NIC的功能,所以你可以得到一個「看似」兩者區分開來的樣子,但是OS仍然可以監視到該通訊流
  • Older BMC controllers don't allow changing the VLAN at all, although tools like ipmitool or ipmicfg will ostensibly let you change it, it just doesn't work.
    • 比較舊的BMC控制器不允許你更便VLAN,雖然有像是ipmitool或ipmicfg等工具,但是就是辦不到
  • You're centralizing your failure points on the system. Doing configuration on a switch and manage to cut yourself off somehow? And, you've now cut off the primary network connection to your server AND the backup via IPMI. NIC hardware fail? Same problem,
    • 你把所有可能失敗的地方都集中在系統,要怎麼設定一個開關,然後要他關掉自己?你關掉最重要的到伺服器的網路連線和透過IPMI備份的機制。至於NIC硬體問題也會遇到一樣的狀況
照這份文章的解釋,不建議我們設法把 IPMI 和 host IP共用。

Chrome Theme Creator

在Chrome Store逛逛,看到一個叫做My Chrome Theme的App,可以製作自己的Chrome Theme,頗有趣的,於是自己做了一個,也有提供別人下載、安裝的功能:
https://www.mychrometheme.com/t/bt72bhq8ns74oxshp76ztsuie

然而一般放在Chrome Theme選單裡面的Theme應當不是用這樣的方法做成的,這個App的顏色選擇太少了,實在不能製作出比較精緻的設計。

Friday, April 20, 2012

VIM - That's Why Linux!

VIM這文字編輯器在Linux底下與系統間有很完美的結合,讓一切的Programming變得快速又好玩,我想這是我喜愛Linux的原因之一。

設定好:

打程式變得快速又好玩:

Thursday, April 19, 2012

Reference in C++


Reference : A simple reference datatype that is less powerful but safer than the pointer type inherited form C. (from Wiki)

Comparing to "Pointers"
  1. It's not possible to refer directly to a reference object after it is defined; any occurrence of its name refers directly to the object it references. (cannot be "reseated", which is often done with pointers) 
    • 在初次定義過後不能再指向其他物件(但pointer常常被用來做這件事情),故命名中會表達所指向的物件為何。
  2. References cannot be "null", whereas pointers can. (Note, containers of references are not allowed)
    • reference不能存「空」的值,也表示,一個「裝references」的容器是不被允許的。
  3. References cannot be uninitialized. Because it is impossible to reinitialize a reference, they must be initialized as soon as they are created.
    • 基於reference一定要在初次定義時候初始化(分配指向的物件),所以沒有「重新初始化」或是「消去初始值」類的東西。
Things About References
  1. [運作]不論上述三項目的不同之外,References與Pointer都是用「傳位址」的方法實現。
    • 當作函數參數值時,函數改變該參數內容,原本呼叫函數的地方,該參數對應的變數,值也會被更改。
    • 非「傳值」的方式,所以沒有傳送太大資料量的問題。
  2. [使用]作為函式傳入值使用的時候:
    • 呼叫函式的地方值用一般變數方法:int square( x, result ); // int result, int x=3;
    • 接傳入值的函數定義處要加"&":int square( int x, int &result ) {}
    • 函式內部使用該傳入值時,用一般變數的方法:result = x*x;
依照上頭[使用]中的方式操作,即可得到[運作]中的效果。

Wednesday, April 11, 2012

"unget" Function in C++

unget函式可以把一個已經讀進來的char吐回去,於是是一個簡易判斷使用者輸入為數字或是String等類似問題的解決方法,但是個人感覺這方法並不嚴謹,難以只透過一個char判斷出太多資訊,而且如此的方法比較沒有效率(如果input有數萬個表示要吐數萬次),已經讀進來的資料其實是可以透過程式設計的方法做後續的判斷的。
  • 只一個char透漏的資訊並不多
  • 沒有效率
相關資料:

Tuesday, April 10, 2012

Simple Web Server (nweb.c) Running On Windows

在計算機科學概論上老師給了一份叫做nweb.c的程式碼,許多人不清楚怎麼讓他在Windows上跑起來,所以在這裡寫一份note。

Class Website : http://people.cs.nctu.edu.tw/~cjtsai/courses/ics/index.html
Simple C code (nweb.c) here : http://people.cs.nctu.edu.tw/~cjtsai/courses/ics/homework/nweb.c

以下以Dev-C++為IDE的例子,直接把nweb.c打開按下F9(compile and run)會出現以下的情況:


下頭有很多undefined的變數,這種情況往往表示library沒有連結好,於是乎我們開始下面的Steps來使這份程式順利跑起來。

  1. Link Library
  2. Create C:\public_html Directory
  3. Create index.html and favicon.ico

1. Link Library

先解決變數沒有定義的問題我們必須連結這份C code需要的函式庫(WS2_32.lib),一般使用令命列gcc的人可以很清楚的了解,只要在gcc command後面加上"-lws2_32"就好了,在Dev-C++(或是其他類似的IDE)也只要稍微設定一下即可。Dev-C++方法如下:


  • 選最上方的"Tools"
  • 選"Compiler Options"
  • 將"Add these commands to the linker command line"打勾
  • 該下方的輸入方格中輸入" -lws2_32 "
  • 按下"Ok"按鍵,完成設定
之後再次compile就會成功了,但是...


2. Create C:\public_html Directory

我們必須使用cmd(命令提示字元)去執行這份程式(因為他沒有pause,若是有錯誤,我們直接執行、不用cmd的方法將看不到任何訊息)

先移動到程式放置的資料夾,如在桌面的話:
>> cd Desktop
執行程式
>> nweb.exe
看到這樣的訊息:


因為這份程式需要讀取C:\public_html這個資料夾,解決方法很簡單,在C槽建立一個叫做public_html的資料夾即可:


再次執行...但是...


3. Create index.html and favicon.ico


我們必須放置一份index.html在已經建立好的C:\public_html資料夾裡面讓nweb去讀,index.html是一份用html寫成的網頁,其實也只是一份文字檔。
懂html甚至可以用「記事本」依照html語法寫好之後即可(就可以用網頁瀏覽器開啟);不懂的人在這裡也可以隨意找一份完成的html檔案放在該資料夾底下即可(也可用我的HelloWorld HTML檔:http://dl.dropbox.com/u/20358682/index.html,按右鍵另存檔案下載)。

於是乎我們再次用cmd執行程式:


程式剛跑起來的時候會出現以上三行文字後停滯,此時用網頁瀏覽器(chrome, firefox, IE, etc.)開啟localhost(在網址列打localhost),會發現瀏覽器可以順利載入我們放置好的index.html檔案。

但是!同時也發現cmd這邊的程式在瀏覽器開啟網站時也結束了,這跟我們期待的不同,server應當處理多次個服務,所以可以讓第二個、第三個、...使用者也可以讀取到index.html才對。這份C code會產生一份log檔案(nweb.syslog)在同資料夾底下,此份log中會紀錄程式運行的狀況或是問題,開起來看看發生什麼事情吧(選用記事本開啟即可,這也是一份文字檔罷了了):


最後一個SORRY寫到"failed to open file:favicon.ico"得知原來我們缺少favicon.ico檔案!

favicon.ico即是網頁載入時上頭的小icon,可以到這個網頁:http://www.favicon.cc/ 畫一個可愛的圖案、下載後放到C:\public_html就好囉!

DONE!!

Linux 內建 C 函式庫 Manual

Linux中,對於不了解的command可以直接打"man <command>"即可得到該command的使用手冊,而其實對於 C 語言函式也可以,如"man printf"。

若發現有些明明是常見的 C 函式卻得到"No manual entry for <command>"的回覆,可以嘗試安裝"manpages",方法如下:

在Ubuntu:
$sudo apt-get install manpages-dev manpages-posix-dev
在Fedora:
$sudo yum install man-pages



Reference:


Sunday, April 8, 2012

Lua Programming Language

今天系上有一隻動物問我"Lua",一種程式語言,以前自己也不曾聽過,於是乎稍稍查了一下、作筆記。

首先在電腦(Fedora)上裝Lua,
$sudo yum install lua
Package lua-5.1.4-7.fc14.x86_64 already installed and latest version
發現他本來已經裝好了!

然後vim helloworld.lua
#!/usr/bin/lua
print ("Hello World!")

then,
$chmod +x helloworld.lua
$./helloworld 

Saturday, April 7, 2012

Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'

設定MySQL on Fedora時候,當mysql.sock不存在時,嘗試登入mysql root(mysql -u root -p)時候會出現:
Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'(2)
 即使touch該檔案(sudo touch /var/lib/mysql/mysql.sock)還是會出現:

Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'(111)
其實問題出在沒有啟動mysql,故需要以下指令即可:
sudo /etc/init.d/mysqld start

DocumentRoot does not exist

在Fedora底下,我嘗試把apache某個網頁設定檔的DocumentRoot指向home目錄的工作位置,可是在restart apache(sudo /etc/init.d/httpd restart)時候,得到Warning,寫著DocumentRoot [PATH/IS/HERE] does not exist,發現是SELinux把apache擋住了。

解決方法:

  1. 安裝policycoreutils-gui:sudo yum install -y policycoreutils-gui
  2. 執行system-config-selinux:system-config-selinux
  3. 點選左側"Boolean"選單
  4. 將"Allow httpd to read home directories"(httpd_enable_homedirs)的選項打勾(立即生效)
如此的方法不論之後重新開機也會保持設定,但是要注意安全問題,在測試的個人電腦可以如此操作,不建議在真的Web Server這麼做

Wednesday, April 4, 2012

Basic Linux Command Line Tutorial

高中時候在社團教學弟妹時候,自己寫了一份常用command的教學文件,最後包含怎麼在linux環境底下編譯一個C程式語言,近期同學們也開始操作linux,所以再次把文件翻出來分享。

其中關於Makefile的部份,在我往後的學習中發現有可以改進的地方。