2010年11月22日 星期一

Windows下Eclipse CDT 觀看C++反組譯的組合語言

最近很喜歡看一些程式碼變成組合語言的時候是長什麼樣子

正巧eclipse CDT就有提供類似的功能

當ecliplse 切換到debug view的時候

可以在Window->Show View  裡面找到Disassembly的選項

而在裡面還有像是Memory跟Registers(看暫存器內容)等好用的選項



Debug View的介紹可以看看

http://help.eclipse.org/galileo/index.jsp?topic=/org.eclipse.jdt.doc.user/reference/views/debug/ref-debug_view.htm

不過我一開始在試驗的時候出現了

Error while launching command: gdb --version

這樣的一個錯誤

因為Debug View的功能必須在debug而非run的時候才有其功用

而我用的MiniGW版本裡面卻沒有debug必須要有gdb元件

所以後來上網下載gdb.exe放到C:\MinGW\bin裡面就解決了這個問題

找windows的gdb載點也花了不少功夫

下面提供一個6.8版的直接載點(不知道會活到什麼時候)

http://sourceforge.net/projects/mingw/files/MinGW/BaseSystem/GDB/Release%20Candidate_%20GDB%206.8-3/gdb-6.8-mingw-3.tar.bz2/download?use_mirror=nchc

2009年12月17日 星期四

Spring單元測試一點筆記

前一陣子去參加OSSF的Annotation講座
裡面有提到JUnit4作單元測試

下面一個參考網站
http://liyiye.javaeye.com/blog/443239

以往作單元測試的時候都必須去繼承TestCase類別
這無疑阻礙了測試程式的設計,但是使用Annotation為基礎作Unit test的話
不只函式名稱不用被綁死,在設計上也更簡單


2009年12月14日 星期一

[Java]Java呼叫C/C++ DLL

接續上一篇,這一陣子要寫可以動態連結的程式,其實我最先開始想到的就是用windows的DLL(Dynamic-link library )或是Linux的SO(Shared Object)

一來這樣速度快二來這樣子也有個更新的彈性,只是這樣一來可能就無法實現跨平台的優點。
在Java有提供JNI來實驗呼叫c\c++的dll功能

放幾個我參考的網站

一般來說會先寫個.java檔去產生Header。假設今天我一隻程式叫Hello.java
那我可以寫一個批次檔(.bat)去幫我產生要用的header

makeHeader.bat

javac Hello.java
javah -jni Hello
@pause

其中javah這個指令就是用來產生JNI Header,之後產生一個標頭檔叫Hello.h
寫一個.c或是.cpp去實作他產生DLL之後就可以給Java呼叫
不過老實說這樣很不方便,萬一Hello.java要增加新函式就會變得很不方便
因此我會比較建議用JNA+CDT的方式去做,如果要用Windows+Eclipse去開發C++的話,有兩個套件要先裝起來,一個是MinGW,另一個則是CDT


[Java]URLClassLoader運用上的一點筆記

這一陣子接了一個case必須要撈一些網站的資料
由於這是必須多人maintain 的一個系統,要防止對方網頁改版而撈不到資料
因此我想到了Java的dynamic binding功能

在Java原生支援dynamic binding,而他主要又分成Implicit(隱式)explicit(顯式)兩大類

參考資料:http://www.yuloo.com/news/2008-08-27/112873.html 


2009年11月3日 星期二

PHP:mail函式 標題出現亂碼問題

今天受託替人寫自動回信的功能
因為功能很小,所以我很自然使用mail()函式去做
但是卻出現了標題有全形符號變成亂碼的問題,像是『』,≠ 等等

後來找的一些資料
http://blog.roodo.com/rocksaying/archives/2998451.html
http://blog.roodo.com/rocksaying/archives/2950655.html

原來這問題存在已久了,mail()函式之下還有個mb_send_mail()函式,mail()函式裡面會用到mb_send_mail()進行傳信的動作,所以我只要將原先的寄信程式
mail("del680202@gmail.com",$title,$count,$option);


修改成用mb_send_mail()的方式去自定編碼寄送就可以解決問題

mb_internal_encoding("UTF-8"); \\定義編碼方式
mb_send_mail("del680202@gmail.com",$title,$count,$option);


不過這種函式處裡太底層了點,所以還是用別人寫好的套件像是PHPMailer來進行工作或許會是比較好的選擇

Goolge 學術搜尋 導入BibTeX 功能

今天再找paper的時候突然的發現Google有提供導入BibTeX的功能
平常我們在寫reference的時候都必須去找那篇paper的出處來作成Bibtex
有了這個功能的話可以省下不少時間



首先進入學術搜尋後,點選旁邊的[學術搜尋偏好],之後到[文獻管理軟体]那一項
選擇[的鏈接] ,之後搜尋的結果就可以看到[導入BibTeX]








  點進去之後就能看到我們寫論文要用的BibText,或許格式不會符合Lab要求,但是可以減少我們找資料的時間

2009年9月28日 星期一

undefined reference to `pow'

今天重灌了ubuntu

想要寫些程式的時候出現了下面的錯誤訊息

undefined reference to `pow'
也不只這個,凡是跟數學函式相關的使用就會出現這類錯誤
像是undefined reference to `sqrt'等等

但是我有確實的include <math.h>,卻仍然找不到

而後來google了一下,發現可以從gcc下手解決
我把原來的
gcc -o xxx xxx.c
加上-lm 如下
gcc -lm -o xxx xxx.c
就成功解決這個問題

再找這問題的時候額外的一個問題
警告: 隱含宣告與內建函式 「printf」 不相容
這是因為從新安裝的時候沒有安裝包含lib的套件
所以只要輸入下面指令安裝就可以解決

sudo apt-get install build-essential

2009年9月11日 星期五

無法存取 \\XXX 。您可能沒有使用這個網路資源的權限。請聯絡這個網路伺服器的系統管理員,了解您是否有存取權限。 登入失敗:使用者帳戶限制。可能原因為不允許空的密碼,登入時數限制,或強的原則限制。

今天幫學長處裡電腦問題
平常我們都使用\\IP或是\\SrverName或是從網路芳鄰去存取遠端電腦上的資源
但是今天出現的問題是我們這邊一堆電腦
每一台都能連到Server就是學長那台電腦不能
他存取的時候會出現

無法存取 \\XXX 。您可能沒有使用這個網路資源的權限。請聯絡這個網路伺服器的系統管理員,了解您是否有存取權限。
登入失敗:使用者帳戶限制。可能原因為不允許空的密碼,登入時數限制,或強的原則限制。

這樣的錯誤訊息(從別的地方copy來的,可能會有些不同)


2009年9月10日 星期四

window中文網頁移植到Linux變成無法解讀

今天把一些網頁從windows上轉移到Linux上的時候
部分網頁發生變成亂碼的情況,後來看了一下
windows上的網頁都是big5編碼,而Linux上則是utf-8
但是這種情況我加上header
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
一點用都沒有

後來找了些資料,發現Linux上有轉碼的指令

iconv -f [fromcode ]-t [tocode] [file]


透過這種編碼指令可以替我解決這種部分網頁編碼問題
iconv -f big5 -t utf8 index.php > index_utf8.php

參考資料

2009年9月9日 星期三

Apache:You don't have permission to accesson this server.

今天幫別人用Linux建帳號的時候
須要每個user都有屬於自己專屬的www家目錄,很幸運的apache就有這種功能了

先去找apache的設定檔 /etc/httpd/conf/httpd.conf

去裡面尋找UserDir的設定值

<IfModule mod_userdir.c>
........
UserDir public_html

</IfModule >

一般來講預設都是public_html,也就是說只要user家目錄下有個public_html目錄
那就會是他的wwwroot目錄
一般來說都是要自己建,假設我有個帳號Tom
那user家目錄就是
/home/Tom
我可以用mkdir去建我要的public_html
mkdir /home/Tom/public_html
但是我要存取的時候出現了錯誤訊息
You don't have permission to accesson this server.
上網google一下資料,看到人家說要修改

<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all

< /Directory >

參考資料

把deny改成allow,不過後來發現早就設定好了 所以上面那招並沒解決問題
後來想想應該是權限問題,但是用ls -al 查了一下,我public_html跟其下權限都已經是755了

後來去看了一下鳥哥的文章,原來是使用者家目錄本身也要設定成755
新建的user帳號的家目錄權限是drwx----- ,必須修改成drwx-xr-x才能讓apache存取該目錄
所以建public_html正確順序應該如下

root狀態

~]$ cd /home/Tom
~]$ mkdir public_html
~]$ chmod 755 public_html
~]$ chmod 755 /home/Tom


user狀態


~]$ cd ~
~]$ mkdir public_html
~]$ chmod 755 public_html
~]$ chmod 755 ~

2009年9月6日 星期日

ubuntu 9.04 PCMAN X 亂碼問題

今天剛灌好ubuntu 9.04來玩
看到他很貼心的提供了BBS工具,想說上個ptt
結果上去看到一堆方方塊塊的亂碼

後來找到解決方法就是開啟上方menu的[檢視]->[字型]
選擇[AR PL Ukai TW]
就能正常顯示中文了



Linux設定DNS

之前windows要設置DNS很容易
不過Linux下要設定要去修改文件/etc/resolv.conf
vi /etc/resolv.conf
最簡單的設定

nameserver xxx.xxx.xxx.xxx #第一個DNS Server位置
nameserver xxx.xxx.xxx.xxx #第二個DNS Server位置


我在裝ubuntu 9.04的時候/etc找不到resolv.conf文件,到是有一個resolv.conf資料夾
不過要設置DNS還是一樣去設/etc/resolv.conf,自己創造一resolv.conf個就可以了

題外話,在玩Ubuntu 9.04的時候,桌面特效的menu不見了
要使用的話要再去安裝,安裝指令如下
sudo apt-get install compizconfig-settings-manager
之後就會出現compizconfig-settings-manager讓我們使用桌面特效了
參考資料

vsftpd:530 This FTP server is anonymous only.

今天實驗室server重開的時候 FTP忽然登不進去了,沒辦法使用一般帳號登入 只能用匿名帳號登入
錯誤訊息如下
530 This FTP server is anonymous only.
後來google了一下資料,要去修改/etc/vsftpd/vsftpd.conf
看到有說要增加

pam_service_name=vsftpd

或是

local_enable=YES

以我的情況,我是屬於後者 我查了vsftpd.conf
local_enable被設置成NO(有的人是被#註解調)
local_enable要設置了才能讓機器上的實體帳號才能登入

可是設置之後卻還是不能登入,server也restart過了
後來在找了一下資料,我的vsftpd是被xinetd啟動的,xinetd的設置檔是放在/etc之下
所以我把/etc/vsftpd/vsftpd.conf整份複製到/etc/vsftpd.conf就可以了
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd.conf

但是啟動後出現另一個錯誤訊息
500 OOPS: could not bind listening IPv4 socket
查了一下原因是因為port 21衝突,21 port被重複使用了

我之前用/etc/init.d/vsftpd去啟動了vsftpd,但是xinetd也啟動了vsftpd
關掉其中一個就好了,我是選擇關掉xinetd啟動那個
輸入

vi /etc/xinetd.d/vsftpd

修改xinetd的vsftpd設定


# default: on
# description:
# The vsftpd FTP server serves FTP connections. It uses
# normal, unencrypted usernames and passwords for authentication.
# vsftpd is designed to be secure.
service ftp
{
socket_type = stream
wait = no
user = root
server = /usr/local/sbin/vsftpd
# server_args =
# log_on_success += DURATION USERID
# log_on_failure += USERID
nice = 10
disable = yes
}


把disable設定成yes,之後輸入
/etc/init.d/xinetd restart
重新啟動服務就可以了

2009年8月31日 星期一

PHP呼叫父類別建構子

在Java的時候呼叫父類別方法是用super關鍵字
在C#則是使用base關鍵字
到了PHP必須使用另一個他預設的parent關鍵字

今天我想呼叫父類別建構式的話方法如下

class Base{
var $db;
function __construct($db){
$this->db=$db;
}
}
class Child extends Base{

function __construct($db){
parent::__construct($db);/*呼叫父類別方法*/
}
}


2009年8月30日 星期日

float:left時,div區塊會穿透過去問題

今天再用css作layout的時候遇到的一些問題
想說用smarty寫個留言版給blog用,於是模擬了下列欄位

HTML

<div class="guestpost">
<div class="header"><!--{$curr->topic}--></div>
<div class="info">
<div class="icon"><!--{$curr->icon}--></div>
<div class="item"><!--{$curr->name}--></div>
<div class="item"><!--{$curr->email}--></div>
</div>
<div class="post"><!--{$curr->post}--></div>
<div class="floor"><!--{$curr->date}--></div>
</div>


css碼

.guestpost{ border:1px #C00 solid}
.guestpost .header{ border:1px #009 solid}
.guestpost .info .icon{ float:left; width:100px; height:100px; border:1px #009 solid;}
.guestpost .info .item{ border:1px #0a9 solid; }
.guestpost .post{ clear:both; border:1px #d09 solid; min-height:200px;}
.guestpost .floor{ text-align:right; border:1px #dd9 solid}


結果如下圖所示


class為item區塊他的border延伸到icon區塊,float:left效果只對文字作出反應
但是對於div原先的size並沒有做出相對的反應,所以他的邊界依然跟icon區塊重疊

後來想到用overflow:hidden來隱藏那不該顯示的區塊

.guestpost{ border:1px #C00 solid}
.guestpost .header{ border:1px #009 solid}
.guestpost .info .icon{ float:left; width:100px; height:100px; border:1px #009 solid;}
.guestpost .info .item{ border:1px #0a9 solid; overflow:hidden ; }
.guestpost .post{ clear:both; border:1px #d09 solid; min-height:200px;}
.guestpost .floor{ text-align:right; border:1px #dd9 solid}


結果如下


好極了,這次item區塊的邊界沒有透到icon區塊去
但是後來測試發現,這效果在IE6下沒有用(又是IE)
儘管IE7、8還有firefox都能正常顯示,但是還是得顧慮到IE6的用戶

後來發現把item的position屬性設置就能解決IE6的這個bug

最終css碼如下

.guestpost{ border:1px #C00 solid}
.guestpost .header{ border:1px #009 solid}
.guestpost .info .icon{ float:left; width:100px; height:100px; border:1px #009 solid;}
.guestpost .info .item{ border:1px #0a9 solid; overflow:hidden ; position:relative }
/*overflow:hidden一定要加 不然框線會向左突出到float:left的區塊 position:relative 針對IE6 設定了overflow才有效果 */
.guestpost .post{ clear:both; border:1px #d09 solid; min-height:200px;}
.guestpost .floor{ text-align:right; border:1px #dd9 solid}

PHP date函數時差八小時的解決方法

使用date函數取得的時間會跟系統時間相差八小時
他有兩個解決方法
  1. 在date函式之前加上date_default_timezone_set(PRC);
  2. 修改PHP.ini的date.timezone 改成date.timezone=PRC
  3. 暴力法自己修正那八小時date(”Y-m-d H:i:s”, time()+8*60*60);
參考資料:http://www.maxgo.org/2009/01/php-date-default-timezone-set/

2009年8月27日 星期四

PHP include file 時使用dirname取得絕對路徑

今天想寫網站時候育到的一個問題
我include的file找不到檔案,但是我檢查了語法並無問題
我架構大改長下面這樣

MyProject
-index.php
-core
|
-config.php
-Model
|
-DBHelper.php

MyProject資料夾底下有一個檔案(index.php)跟兩個資料夾(core,Model)
我index.php去include config.php

require_once 'core/config.php';

而 config.php又去include DBHelper.php

require_once '../Model/DBHelper.php';


奇怪的是他竟然跟我說找不到DBHelper.php,看了一下路徑設置並沒有錯
後來找了一下資料require_once參考的路徑是"現在程式"所在路徑
所以我以為config.php會很自然往上一層到MyProject資料夾在到Model找DBHelper.php
但是由於我現在程式是MyProject資料夾之下的index.php,所以他變成先到MyProject的上一層資料夾在去Model資料夾找

但是這樣很麻煩阿,我很多程式都會include config.php藉著他去include DBHelper.php
有沒有辦法在不同資料夾下尋找呢?
後來想到了用程式去叫出config.php的絕對路徑,在以此路徑去尋找相對位置

之前有提過__FILE__可以幫我們找出檔案的絕對位置,他不會受include影響
儘管是index.php去include config.php,只要__FILE__是寫在config.php
他抓出來的就是config.php的絕對路徑
因此我將程式碼修改如下

define("CONFIG_DIR",dirname(__FILE__));//抓出config.php的絕對path dir
require_once CONFIG_DIR.'../Model/DBHelper.php';//就像是/www/MyProject/core/../Model/DBHelper.php

如此一來,就能解決include時路徑不同的問題

2009年8月24日 星期一

PHP include file時轉碼

今天幫人寫網頁的時候,所遇到的一個小問題
平常都會習慣把網頁的像是header啦floor啦弄成template
再用include的方式include近來

但是當我想把big5碼的檔案include到utf-8的網頁
或者我想把utf-8的網頁include到big5的網頁就會出問題
用file_get_contents嘛,因為我習慣template加進html宣告標籤 又不合用
有沒有辦法把include進來的檔案從新編碼

後來找到了用output buffer的方式,先把include近來的檔案放進buffer而不輸出
再把output buffer的內容進行編碼,這樣就可以解決我遇到的問題了
範例如下

ob_start();
include 'template/header.tpl';/*把include的file先不輸出到螢幕 放到緩衝*/
$table=ob_get_contents();/*從緩衝取得include內容*/
ob_end_clean(); /*關閉並結束緩衝*/
/*輸出*/
echo iconv("utf-8","big5",$table);
ob_flush();
flush();

2009年8月22日 星期六

javascript 取得網頁最後修改日期

這兩天幫別人做網站,有要求下方要標註修改日期
手動修改太麻煩了,找找javascript有沒有方法
後來找到javascript可以用document.lastModified取得文見最後修改日期
如果lastModified提供的格式不符合需求的話
也可以用內建的Date物件重新包裝
舉個例子

var lastModDate = new Date(document.lastModified);
document.write("最後修改日期:" +lastModDate.toDateString());

PHP 的__XXX

PHP有些是前面帶有兩個底線 '__'所組成的預設函式或變數
因為我比較不喜歡季這些有特別涵義的東西,簡單做個筆記把他記下來


__construct


這是個供類別使用的函式,就如同字面上意義,他可以代表類別建構式
一般沒寫這個函式的時候,PHP會去尋找同名的functoin當建構式
儘管大小寫不同,舉個例子

class People{

function people(){
echo 'people';
}
}
$p=new People();

//output:
people

但是如果有寫__construct的話,則會優先使用__construct,而原先同名的function則可以當member function使用

class People{
function __construct(){
echo 'construct';
}
function people(){
echo 'people';
}
}
$p=new People();// call __construct()
$p->people();//call member function people()

//output:
construct
people


__destruct


物件解構式,物件銷毀時要做的事情

class People{
function __destruct(){
//TODO
}
}


__get,__set


PHP的setter跟getter function,當object使用->去取值或用->=去設值的時候會呼叫的函式
儘管那個member從未定義一樣會去呼叫,__get須要一個參數,而__set則須要兩個參數
假設我用$p->Data,就像呼叫$p->__get("Data");
而如果我使用$p->Data="Tom"; 就像呼叫$p->__set("Data","Tom");

class People{
function __get($name){
echo "get function para: $name";
}

function __set($name,$value)
{
echo "set function para: name=$name,value=$value";
}
}

$p=new People();
$p->iget;//呼叫 __get($name) 並將iget當參數傳入
$p->iset=100;//呼叫 __set($name,$value) 並將iset跟100當參數傳入

//output:
get function para: iget
set function para: name=iset,value=100

這樣的好處是能夠把一些變數資訊隱藏起來
User不須要知道我變數是如何操作,昨天在透視 WebMVC看到的一個蠻妙的作法,跟關連陣列結合使用

class People{
var $arr=array();//一個空陣列
function __get($name){
echo "get function para: $name ";
return (isset($this->arr[$name]))?$this->arr[$name]:" no \$arr[$name]";
}

function __set($name,$value)
{
echo "set function para: name=$name,value=$value ";
$this->arr[$name]=$value;
}
}
$p=new People();
echo "get:".$p->iget;
$p->iset=100;
echo "get:".$p->iset;

//output
get function para: iget
get: no $arr[iget]
set function para: name=iset,value=100
get function para: iset
get:100


__toString


這個函式可以讓物件配合echo像一般變數一樣輸出,他必須有個return值

class People{
function __toString(){
return "I am a people";
}
}
$p=new People();
echo $p;

//output
I am a people

__call


作overloading時可以用到,雖然一般都選擇預設參數的方式,這個我就不常用了
__call會傳進兩個參數,一個function name一個參數陣列
我使用$p->fun(1,2,3)就好像在呼叫$p->__call("fun",array(1,2,3))
他的好處,是function名稱不再受到綁定,參數也可以隨意
而fun必須是一個class未定意的function,如果有定義會採用以定義的
下面舉兩個例子,使用預設參數跟使用__call

class People{
function operation($a="abc",$b=123){
echo "default:"."$a : $b";
}
function __call($name,$args)
{
echo "call function $name args:";
if(isset($args))
foreach ($args as $arg)
{
echo "$arg ,";
}
}
}

$p=new People();
//default
$p->operation();
$p->operation(99);
$p->operation(99,234);
//__call
$p->call();
$p->call(1);
$p->call(1,"Tom");
$p->bye(1,2,3,4);

//output
default:abc : 123
default:99 : 123
default:99 : 234
call function call args:
call function call args:1 ,
call function call args:1 ,Tom ,
call function bye args:1 ,2 ,3 ,4 ,


其他一些__clone、__iset、__unset也大概都差不多用法,不過使用機率不大就是了,有興趣在去查手冊

__autoload


上面的__XXX都必須在class裡面,而這個__autoload則是個獨立function,當呼叫一個不存在的class的時候
他會就會呼叫__autoload去試圖將他載入,他會傳入一個參數,也就是呼叫的class name
當我用$p=new People();,假設People不存在現有類別,他就會去呼叫__autoload("People");
假設我把上面範例拆開

//strFunctionClass.php
class People{
}


//strFunction.php

function __autoload($class){
if($class=="People")
{
include_once 'strFunctionClass.php';
}
echo "call Class :$class";
}
$p=new People();

//output
call Class :People

也有人會把一個class一個php檔並設成同樣的名稱,這樣就可以把load動作簡化,這個在客制Lib的時候很好用


//People.php
class People{...}

//index.php
function __autoload($class){
include_once "$class.php";
}
$p=new People();


其他還有一些是__開頭的變數

echo nl2br("\n").__METHOD__;/*Class的方法名稱*/
echo nl2br("\n").__FILE__;/*檔案所在絕對位置*/
echo nl2br("\n").__CLASS__;/*Class 名稱 在Class內才有用*/
echo nl2br("\n").__FUNCTION__;/*Function 名稱 在function內才有用*/
echo nl2br("\n").__LINE__;/*程式碼所在行數*/

我比較常用到的只有__FILE__,可以取得程式檔案的絕對位置
像是c:\appser\www\xxx.php,可以配合dirname取得檔案目前目錄
像是dirname(__FILE__)可以得到c:\appser\www\

-------------------------------------
題外話,在看透視 WebMVC(這篇文章很推薦)的時候,看到了一個很有趣的用法
就是把變數字串弄成函式或是另一個變數

function fun(){}

$temp=9999;
$var="temp";
echo $$var;//output 9999 就像 echo $temp

$temp="fun";
$temp();//最後會變成fun();

而這個應用也可以用在class上

class Action{
var $_action;
function setAction($action)
{
$this->_action=$action;
}
function run(){
if(method_exists($this,$this->_action))//確定是否是class method
$this->{$this->_action}();//用大括弧刮起來
else
echo "not member function:".$this->_action;
}
function sayHello(){
echo "Hello";
}
function sayHi(){
echo "Hi";
}
}

$act=new Action();
$act->setAction("sayHello");
$act->run();
$act->setAction("sayHi");
$act->run();
$act->setAction("say");
$act->run();
//output
Hello
Hi
not member function:say