2009年11月5日木曜日
Dependency Walker
Dependency Walker(ディペンデンシーウォーカー)は、32ビット/64ビット(exe、dll、ocx、sysなど)のWindowsモジュールをスキャンするユーティリティです。全ての依存モジュールの階層的ツリーダイアグラムを表示します。
2009年10月26日月曜日
gdbでテストを行う
1.gdbで入力したコマンドを下記で記録できる
(gdb) set history filename test-pattern1
(gdb) set history save on
2.記録したファイルを下記コマンドで起動できる
> gdb a.out -x test-pattern1
3.詳しくは下記を参考に
http://www.fireproject.jp/feature/gdb/advanced/auto-test.html
(gdb) set history filename test-pattern1
(gdb) set history save on
2.記録したファイルを下記コマンドで起動できる
> gdb a.out -x test-pattern1
3.詳しくは下記を参考に
http://www.fireproject.jp/feature/gdb/advanced/auto-test.html
2009年10月22日木曜日
linux svn server (tested in fedora 11)
svn server setup tutorial in fedora core 9
1. First you should Create a SVN Repository
svnadmin create $REPO_URL/svnrepos
2. Then Create a SVN User
vi $REPO_URL/svnrepos/conf/svnserve.conf
In that file add these three lines below:
anon-access = none
auth-access = write
password-db = passwd
Create a password file:
vi $REPO_URL/svnrepos/conf/passwd
In that file add a line for your user:
# add users in the format : user = password
tony = mypassword
3. Now Import Your Project
(assuming you’ve put your project files in /projects/mytestproj)
svn import /projectsToImport/mytestproj file://$REPO_URL/svnrepos/mytestproj
4. Start the SVN Server as Daemon, Lets Ahead
svnserve -d -r $REPO_URL
^^ -r is used to tell the server to refer to the REPO_URL directly.
now you have a SVN server running with one project named mytestproj.
Try checking it out of the repository:svn co svn://$YOUR_IP/svnrepos/mytestproj
original page
http://codefighters.blogspot.com/2009/02/svn-server-setup-tutorial-in-fedora.html
1. First you should Create a SVN Repository
svnadmin create $REPO_URL/svnrepos
2. Then Create a SVN User
vi $REPO_URL/svnrepos/conf/svnserve.conf
In that file add these three lines below:
anon-access = none
auth-access = write
password-db = passwd
Create a password file:
vi $REPO_URL/svnrepos/conf/passwd
In that file add a line for your user:
# add users in the format : user = password
tony = mypassword
3. Now Import Your Project
(assuming you’ve put your project files in /projects/mytestproj)
svn import /projectsToImport/mytestproj file://$REPO_URL/svnrepos/mytestproj
4. Start the SVN Server as Daemon, Lets Ahead
svnserve -d -r $REPO_URL
^^ -r is used to tell the server to refer to the REPO_URL directly.
now you have a SVN server running with one project named mytestproj.
Try checking it out of the repository:svn co svn://$YOUR_IP/svnrepos/mytestproj
original page
http://codefighters.blogspot.com/2009/02/svn-server-setup-tutorial-in-fedora.html
2009年10月19日月曜日
about gdb(sth hard to remember)
(gdb) display /i $pc
-> display pc register
(gdb) undisplay 1
-> undisplay it.
(gdb)i r //info register
-> display register info
(gdb)i r pc
-> display pc register info
(gdb)disas 0xd0dc53 0xd0dc78
反汇编一段指令。可以带零个、一个或两个参数。第一个参数是反汇编开始地址,第二个参数是反汇编结束地址。
メモリダウンプ
(gdb) dump binary memory /tmp/outputFile.log 0x080483ce 0x08058383
-> display pc register
(gdb) undisplay 1
-> undisplay it.
(gdb)i r //info register
-> display register info
(gdb)i r pc
-> display pc register info
(gdb)disas 0xd0dc53 0xd0dc78
反汇编一段指令。可以带零个、一个或两个参数。第一个参数是反汇编开始地址,第二个参数是反汇编结束地址。
メモリダウンプ
(gdb) dump binary memory /tmp/outputFile.log 0x080483ce 0x08058383
2009年8月24日月曜日
2009年8月20日木曜日
2009年8月12日水曜日
2009年8月7日金曜日
ftp のモード
active モード:ftpサーバからクライアントにデータ転送接続を行う。
passiveモード:クライアントからftpサーバにデータ転送接続を行う。
クライアント側のfirewallの設定で、外部から内部へ接続が拒否される場合、passiveモードを利用する。
参考。
1.http://www.atmarkit.co.jp/fnetwork/rensai/troutol05/01.html
passiveモード:クライアントからftpサーバにデータ転送接続を行う。
クライアント側のfirewallの設定で、外部から内部へ接続が拒否される場合、passiveモードを利用する。
参考。
1.http://www.atmarkit.co.jp/fnetwork/rensai/troutol05/01.html
2009年8月6日木曜日
ディレクトリ配下全ファイルを小文字に変換する
#!/bin/sh
for filename in $(find $1); do
if [ -f $filename ]; then
# 変更対象のファイル名を画面表示
basename $filename |grep -q '[[:upper:]]' 2> /dev/null && basename $filename
# ファイル名の変更
basename $filename |grep -q '[[:upper:]]' 2> /dev/null \
&& mv -i $filename $(echo $filename | tr 'A-Z' 'a-z')
fi
done
for filename in $(find $1); do
if [ -f $filename ]; then
# 変更対象のファイル名を画面表示
basename $filename |grep -q '[[:upper:]]' 2> /dev/null && basename $filename
# ファイル名の変更
basename $filename |grep -q '[[:upper:]]' 2> /dev/null \
&& mv -i $filename $(echo $filename | tr 'A-Z' 'a-z')
fi
done
2009年7月29日水曜日
ファイルパスをクリップボードにcopy
下記をcpc.shに記述して、保存する。
#!/bin/bash
echo -n `pwd`\/$1 | xsel -b
"cpc.sh ファイル名" でそのファイルのフルパスをクリップボードにcopyしてくれる。
#!/bin/bash
echo -n `pwd`\/$1 | xsel -b
"cpc.sh ファイル名" でそのファイルのフルパスをクリップボードにcopyしてくれる。
2009年7月21日火曜日
通常出力とエラー出力を別々に出力する
ls ~root ~ > hoge1.txt 2> hoge2.txt
通常出力はhoge1.txtに出力され、エラーはhoge2.txtに出力される。
エラーを通常出力と同じにする場合
"2>&1"を利用する
通常出力はhoge1.txtに出力され、エラーはhoge2.txtに出力される。
エラーを通常出力と同じにする場合
"2>&1"を利用する
linux の background 実行
コマンドラインの一番最後に'&'をつけることによって、バックグランドで実行してくれる。
[root@HouTou java]# tar -cjf j2sdk1.4.2_17.tar.bz2 j2sdk1.4.2_17 &
[1] 5125
実行した後、プロセスを確認できる。
[root@HouTou java]# ps | grep 5125
5125 pts/4 00:00:00 tar
終了したら、下記メッセージが出る。
[1]+ 終了 tar -cjf j2sdk1.4.2_17.tar.bz2 j2sdk1.4.2_17
[root@HouTou java]# tar -cjf j2sdk1.4.2_17.tar.bz2 j2sdk1.4.2_17 &
[1] 5125
実行した後、プロセスを確認できる。
[root@HouTou java]# ps | grep 5125
5125 pts/4 00:00:00 tar
終了したら、下記メッセージが出る。
[1]+ 終了 tar -cjf j2sdk1.4.2_17.tar.bz2 j2sdk1.4.2_17
2009年7月19日日曜日
stardict
StarDict更多词典的安装
http://alexandermail.blog.hexun.com/23159549_d.html
可以在官网找到很多的词典
下载你喜欢的词典后只需把它解压到 ~/.stardict/dic 或 /usr/share/stardict/dic
现在以安装文件名为a.tar.bz2 的词典为例:
tar -xjvf a.tar.bz2
sudo mv a /usr/share/stardict/dic
注意:a.tar.bz2是词典文件,a 是解压出来的词典目录
重新启动stardict,新的词典就会被自动加载了。
安装 WyabdcRealPeopleTTS
如果你的源中有该软件包,直接
sudo apt-get install wyabdcrealpeopletts
没有的话,请到wiki_ubuntu_ftp下载后执行
sudo tar -xvf WyabdcRealPeopleTTS.tar.gz -C /usr/share
安装OtdRealPeopleTTS(确保空闲空间>3G)
下载後手动安装
注意:需下载112.3M,安装後会消耗2.9G空间
解压缩,然後执行
sudo apt-get install python mpg321 #先安装python及mpg321
./INSTALL #安装OtdRealPeopleTTS
发音设置
如果您安装的是 ubuntu/gnome, 那么只要安装真人发音包之後不需要任何设置,stardict 就可以发音了。
如果您确认安装的是 statdict-gtk ,并且安装了 sox , 那么无须任何设置就可以发音了, 不过依然推荐修改下让星际译王用 alsa , 启动stardict後,点击主界面右下角按钮进入设置页面 -> 词典 -> 声音 -> 在启用声音前打钩,并将play改为aplay。 改完後如下图所示
http://alexandermail.blog.hexun.com/23159549_d.html
可以在官网找到很多的词典
下载你喜欢的词典后只需把它解压到 ~/.stardict/dic 或 /usr/share/stardict/dic
现在以安装文件名为a.tar.bz2 的词典为例:
tar -xjvf a.tar.bz2
sudo mv a /usr/share/stardict/dic
注意:a.tar.bz2是词典文件,a 是解压出来的词典目录
重新启动stardict,新的词典就会被自动加载了。
安装 WyabdcRealPeopleTTS
如果你的源中有该软件包,直接
sudo apt-get install wyabdcrealpeopletts
没有的话,请到wiki_ubuntu_ftp下载后执行
sudo tar -xvf WyabdcRealPeopleTTS.tar.gz -C /usr/share
安装OtdRealPeopleTTS(确保空闲空间>3G)
下载後手动安装
注意:需下载112.3M,安装後会消耗2.9G空间
解压缩,然後执行
sudo apt-get install python mpg321 #先安装python及mpg321
./INSTALL #安装OtdRealPeopleTTS
发音设置
如果您安装的是 ubuntu/gnome, 那么只要安装真人发音包之後不需要任何设置,stardict 就可以发音了。
如果您确认安装的是 statdict-gtk ,并且安装了 sox , 那么无须任何设置就可以发音了, 不过依然推荐修改下让星际译王用 alsa , 启动stardict後,点击主界面右下角按钮进入设置页面 -> 词典 -> 声音 -> 在启用声音前打钩,并将play改为aplay。 改完後如下图所示
2009年7月10日金曜日
linux shortcut keys
CTRL + A Moves the cursor to the head of a line
CTRL + E Moves the cursor to the end of a line
CTRL + R Search a command from the command history.
CTRL + B Moves the cursor backward one character.
CTRL + F Moves the cursor forward one character.
CTRL + D Logs out of the current session.
CTRL + H Erase one character. Similar to pressing backspace.
CTRL + W Deletes the last word typed in. For example, if you typed 'mv file1 file2' this shortcut would delete file2.
CTRL + U Erases the complete line.
CTRL + P Paste previous line and/or lines.
CTRL + N Paste next line and/or lines.
CTRL + S Stops all output on screen (XOFF).
CTRL + Q Turns all output stopped on screen back on (XON).
CTRL + Z Cancels current operation, moves back a directory and/or takes the current operation and moves it to the background. See bg command for additional information about background.
CTRL + E Moves the cursor to the end of a line
CTRL + R Search a command from the command history.
CTRL + B Moves the cursor backward one character.
CTRL + F Moves the cursor forward one character.
CTRL + D Logs out of the current session.
CTRL + H Erase one character. Similar to pressing backspace.
CTRL + W Deletes the last word typed in. For example, if you typed 'mv file1 file2' this shortcut would delete file2.
CTRL + U Erases the complete line.
CTRL + P Paste previous line and/or lines.
CTRL + N Paste next line and/or lines.
CTRL + S Stops all output on screen (XOFF).
CTRL + Q Turns all output stopped on screen back on (XON).
CTRL + Z Cancels current operation, moves back a directory and/or takes the current operation and moves it to the background. See bg command for additional information about background.
2009年6月30日火曜日
ubuntu 9 + ssh
sudo apt-get install openssh-server
sudo vi /etc/ssh/sshd_config
PermitRootLogin no ←rootでのログインを禁止
...
IgnoreRhosts yes ←.rhostsおよびhost.equivファイルでの認証を許可しない
...
RhostsAuthentication no ←パスワードなしでログインできるrhosts認証を禁止
...
RSAAuthentication yes ←RSA鍵ファイルを利用したユーザー認証を許可
...
RhostsRSAAuthentication yes ←RSA鍵の交換でrhosts認証を許可(noのまま編集なし)
...
PermitEmptyPasswords no ←パスワードなしでのログインを禁止
...
AllowUsers user ←SSHでログインできるユーザーを限定
(例:ユーザー名が"user"の場合)
sudo /etc/init.d/ssh restart
sudo vi /etc/ssh/sshd_config
PermitRootLogin no ←rootでのログインを禁止
...
IgnoreRhosts yes ←.rhostsおよびhost.equivファイルでの認証を許可しない
...
RhostsAuthentication no ←パスワードなしでログインできるrhosts認証を禁止
...
RSAAuthentication yes ←RSA鍵ファイルを利用したユーザー認証を許可
...
RhostsRSAAuthentication yes ←RSA鍵の交換でrhosts認証を許可(noのまま編集なし)
...
PermitEmptyPasswords no ←パスワードなしでのログインを禁止
...
AllowUsers user ←SSHでログインできるユーザーを限定
(例:ユーザー名が"user"の場合)
sudo /etc/init.d/ssh restart
2009年6月20日土曜日
javadoc のインストール
元ネタ
http://www.db.is.kyushu-u.ac.jp/rinkou/javaintro/javadoc.html
ダウンロードと Eclipse での設定
1. http://java.sun.com/javase/ja/6/download.html を使用.このWebページで,「Java SE 6 ドキュメント」のところにある「ダウンロード」をクリック.
2. jdk-6-doc.zip あるいは jdk-6-doc-ja.zip をダウンロード(前者は英語版,後者は日本語版)
3. JDK のインストールディレクトリ (c:\Program Files\Java\jdk1.6.0_11のような名前のはず)の下に解凍.
c:\Program Files\Java\jdk1.6.0_11\docs のようなディレクトリができる.
4. Eclipse で,JAVA_HOME を JDK 1.6.0 に設定
Eclipse で「Window(ウィンドウ)」→「Preferences(設定)」→「Java」→「Installed JREs(インストール済みのJRE)」
5. 「c:\Program Files\Java\jdk1.6.0_11」のように,JDK を設定した行があれば,それをクリック.(なければ,「追加」ボタンをクリックして,c:\Program Files\Java\jdk1.6.0_11を追加する).
6. 「編集」をクリック. JRE の編集ウインドウが開く.
7. JRE の編集ウインドウの中に「...rt.jar」の行があるので,クリック.
8. 「Javadoc ロケーション」をクリック.
「Javadoc ロケーション・パス」に,先ほど解凍したディレクトリの下の ja\api ディレクトリ,つまり, c:\Program Files\Java\jdk1.6.0_11\docs\ja\api を設定(日本語版の場合).
英語版の場合には, c:\Program Files\Java\jdk1.6.0_11\docs\api を設定
9. 「検証」をクリック
10. 「OK」をクリックして,元に戻る.
使ってみよう
Eclipse で,プログラム中の調べたい単語で「SHIFT + F2」 (ファンクションキー2)を押すと,Javadoc が開きます.
但し,上記の設定では,JDK の Javadoc (String とかファイル関係とか)しか出ません.自前で追加した jar の Javadoc などは出ないということです.
2009年6月19日金曜日
enable remote display on your PC:
* * set the follows only once
$ su - root
Passwod:
# svccfg
svc:> select application/x11/x11-server
svc:/application/x11/x11-server> setprop options/tcp_listen = boolean: true
svc:/application/x11/x11-server> listprop options/tcp_listen
options/tcp_listen boolean true
svc:> exit
# logout
- Logout from your desktop, and re-login
* * Add permission to display to your desktop everytime after you restart your PC(I have added the follow setting to ~/.bashrc)
- $ xhost +
$ su - root
Passwod:
# svccfg
svc:> select application/x11/x11-server
svc:/application/x11/x11-server> setprop options/tcp_listen = boolean: true
svc:/application/x11/x11-server> listprop options/tcp_listen
options/tcp_listen boolean true
svc:> exit
# logout
- Logout from your desktop, and re-login
* * Add permission to display to your desktop everytime after you restart your PC(I have added the follow setting to ~/.bashrc)
- $ xhost +
2009年6月18日木曜日
2009年6月15日月曜日
2009年6月9日火曜日
2009年6月8日月曜日
thunderbirdとvimの連携
Thunderbirdの拡張機能で External Editor
HTMLメール設定を必ず無効にすること。
スペルチェックを有効にするには下記設定で
/usr/bin/gvim -f -c "set spell"
文字化けが発生する場合がある。その場合は下記対応
1. iconv.dllをvimのインストールディレクトリにcopy
2. encode_japan.vimをpluginフォルダにcopy
2009年5月27日水曜日
install jdk to ubuntu 9
The following command was all that was required:
sudo apt-get install sun-java6-bin sun-java6-jre sun-java6-jdk
More info can be found here:
http://www.cyberciti.biz/faq/howto-ubuntu-linux-install-configure-jdk-jre/
首先需要安装JDK 6
sudo apt-get install sun-java6-jdk(确定添加了可用源,doc自己下:http://java.sun.com/javase/downloads/)
之后需要设置默认的java程序
sudo update-alternatives --config java
按照提示输入对应的选项,指定为JDK 6
下面设置
sudo gedit /etc/environment
在其中添加如下两行:
CLASSPATH=./usr/lib/jvm/java-6-sun/lib(这个点要加上我可被它搞苦了)
JAVA_HOME=/usr/lib/jvm/java-6-sun
如果其中已经设置了CLASSPATH和JAVA_HOME,则将其修改为上面的形式,按保存退出。
接下来安装Eclipse
sudo apt-get install eclipse
需要注意的是,此时Eclipse并不关心之前设置的update-alternative
所以应该修改Eclipse的配置。首先将 SUN-JDK-6彻底设为系统默认:
sudo update-java-alternatives -s java-6-sun
然后编辑JVM配置文件:
sudo gedit /etc/jvm
在文件顶部添加
/usr/lib/jvm/java-6-sun
(如果没有则自己新建)
sudo gedit /etc/eclipse/java_home
也是在文件顶部添加
/usr/lib/jvm/java-6-sun
之后启动Eclipse,选择Help->About Eclipse SDK,选择Configuration Details,可以看到JDK6的设置已经生效。
sudo apt-get install sun-java6-bin sun-java6-jre sun-java6-jdk
More info can be found here:
http://www.cyberciti.biz/faq/howto-ubuntu-linux-install-configure-jdk-jre/
首先需要安装JDK 6
sudo apt-get install sun-java6-jdk(确定添加了可用源,doc自己下:http://java.sun.com/javase/downloads/)
之后需要设置默认的java程序
sudo update-alternatives --config java
按照提示输入对应的选项,指定为JDK 6
下面设置
sudo gedit /etc/environment
在其中添加如下两行:
CLASSPATH=./usr/lib/jvm/java-6-sun/lib(这个点要加上我可被它搞苦了)
JAVA_HOME=/usr/lib/jvm/java-6-sun
如果其中已经设置了CLASSPATH和JAVA_HOME,则将其修改为上面的形式,按保存退出。
接下来安装Eclipse
sudo apt-get install eclipse
需要注意的是,此时Eclipse并不关心之前设置的update-alternative
所以应该修改Eclipse的配置。首先将 SUN-JDK-6彻底设为系统默认:
sudo update-java-alternatives -s java-6-sun
然后编辑JVM配置文件:
sudo gedit /etc/jvm
在文件顶部添加
/usr/lib/jvm/java-6-sun
(如果没有则自己新建)
sudo gedit /etc/eclipse/java_home
也是在文件顶部添加
/usr/lib/jvm/java-6-sun
之后启动Eclipse,选择Help->About Eclipse SDK,选择Configuration Details,可以看到JDK6的设置已经生效。
2009年5月15日金曜日
set gvim to linux
1.download the newest vim source
http://www.vim.org/download.php#unix
2.configure it like follows
$ ./configure \
--prefix=/usr/local/vim72 \ # install directory
--with-x --enable-gui=gtk2 \ # configure gvim
--with-features=huge
3.set links
# mv /usr/bin/vim /usr/bin/vim61 # backup old link
# ln -s /usr/local/vim72/bin/vim /usr/bin/vim # copy new executable vim
4.copy plugin
copy the follow plugins from
https://vimsetup.googlecode.com/svn/trunk
to
/usr/local/vim72/share/vim/vim72/plugin
taglist.vim
hz_ja.vim
encode_japan.vim
5.copy .vimrc to ~/
http://www.vim.org/download.php#unix
2.configure it like follows
$ ./configure \
--prefix=/usr/local/vim72 \ # install directory
--with-x --enable-gui=gtk2 \ # configure gvim
--with-features=huge
3.set links
# mv /usr/bin/vim /usr/bin/vim61 # backup old link
# ln -s /usr/local/vim72/bin/vim /usr/bin/vim # copy new executable vim
4.copy plugin
copy the follow plugins from
https://vimsetup.googlecode.com/svn/trunk
to
/usr/local/vim72/share/vim/vim72/plugin
taglist.vim
hz_ja.vim
encode_japan.vim
5.copy .vimrc to ~/
2009年5月4日月曜日
2009年4月16日木曜日
vimで重複行を一括削除
vim7.2だと、下記コマンドで一発重複行を削除できる。
:sort u
旧操作(お勧めしない)
操作目的:下記ファイルに存在する重複行を削除
====================================
a
b
a
b
a
c
c
====================================
削除後の想定状態
====================================
a
b
c
====================================
手順
:%s/^\(.*\)\n\(\1\n\)*/\1/
where is the character sequence that represents a return in your file type.
下記の旧手順は複雑すぎるので、お勧めしません。
:%sort
->全ファイルをソートする
qa
:%s/^\(.*\)\n\1/\1/
q
100@a
->となり同士の同じ行を削除する動作を100回繰り返す
100で足りるかについて上記操作を完了した後
:%s/^\(.*\)\n\1/\1/
をもう一度実施し、ヒットしませんでした旨のエラーメッセージ
が出れば、完了、そうでなければもう一度適当回数で下記を実施する
100@a
:sort u
旧操作(お勧めしない)
操作目的:下記ファイルに存在する重複行を削除
====================================
a
b
a
b
a
c
c
====================================
削除後の想定状態
====================================
a
b
c
====================================
手順
:%s/^\(.*\)\n\(\1\n\)*/\1
where
下記の旧手順は複雑すぎるので、お勧めしません。
:%sort
->全ファイルをソートする
qa
:%s/^\(.*\)\n\1/\1/
q
100@a
->となり同士の同じ行を削除する動作を100回繰り返す
100で足りるかについて上記操作を完了した後
:%s/^\(.*\)\n\1/\1/
をもう一度実施し、ヒットしませんでした旨のエラーメッセージ
が出れば、完了、そうでなければもう一度適当回数で下記を実施する
100@a
2009年4月8日水曜日
2009年3月25日水曜日
2009年3月23日月曜日
英語の勉強を始める
http://books.google.cn/books?id=zBkMEw5CmsgC&printsec=frontcover&dq=The+Cprogramming+language&lr=lang_en&as_drrb_is=q&as_minm_is=1&as_miny_is=2009&as_maxm_is=12&as_maxy_is=2009&as_brr=0&as_pt=ALLTYPES&source=gbs_summary_r&cad=0#PPP1,M1
とりあえず一番詳しいCからスタート
とりあえず一番詳しいCからスタート
2009年3月18日水曜日
可変長ログの出し方
ユースケース
DEBUG_LOGでprintfと同じような書き方で利用し、ログを出力する。
int main(void)
{
int tryInt = 305419896; // 4 byte
ENTER;
DEBUG_LOG("yao daoding = %d\n", tryInt);
return 0;
}
1. __VA_ARGS__を利用できない場合、C99をサポートしていないコンパイラ
#ifdef D_DEBUG
#define DEBUG_LOG printf("%s %d %s:", __FILE__, __LINE__, __FUNCTION__),printf
#else
#define DEBUG_LOG(...)
#endif
//DEBUG_LOG(...)で記述するところをわざとDEBUG_LOGとして記述するのはミソ
2. 上記は\nを手動で追加しないと、改行を出力してくれないという欠点が
ある。
要は下記記述で、改行を出力することはできない。
DEBUG_LOG("yao daoding = %d", tryInt);
それを防ぐためにはC99がサポートしているという前提だったら、
以下の対策がある。
#ifdef D_DEBUG
#define WGT_TRY_BY_TOU(fmt, ...) printf("%s %d %s "fmt"\n", __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__)
#else
#define DEBUG_LOG(...)
#endif
3. しかし、上記にも欠点があり、引数は一つしかない場合、コンパイルエラーに
なる。
DEBUG_LOG("daoding");
gcc -E main.cで確認すると、下記とおりに展開されているようである。
printf("%s %d %s ""daoding""\n", "main.c", 77, __FUNCTION__, );
余っている,を削除するために、下記方法は考えられる。
#define ENTER WGT_ENTER_LOG2("%s", "Enter", "")
#define WGT_DEBUG_LOG(...) WGT_ENTER_LOG2(__VA_ARGS__, "")
#define WGT_ENTER_LOG2(fmt, ...) \
{ \
printf("%s %d %s ", __FILE__, __LINE__, __FUNCTION__); \
printf(fmt"%s\n", __VA_ARGS__); \
}
すると下記はそれぞれ正常に展開される。
DEBUG_LOG("daoding");
DEBUG_LOG("yao daoding = %d\n", tryInt);
{ printf("%s %d %s ", "main.c", 76, __FUNCTION__); printf("daoding""%s\n", ""); };
{ printf("%s %d %s ", "main.c", 75, __FUNCTION__); printf("yao daoding = %d""%s\n", tryInt, ""); };
4. 運がよければ、下記も利用できるかも
引数は一つしかない場合、##は直前のあまった,を削除してれる。これはC99にはないので、ご注意を
#ifdef D_DEBUG
#define WGT_TRY_BY_TOU(fmt, ...) printf("%s %d %s "fmt"\n", __FILE__, __LINE__, __FUNCTION__, ## __VA_ARGS__)
#else
#define DEBUG_LOG(...)
#endif
DEBUG_LOGでprintfと同じような書き方で利用し、ログを出力する。
int main(void)
{
int tryInt = 305419896; // 4 byte
ENTER;
DEBUG_LOG("yao daoding = %d\n", tryInt);
return 0;
}
1. __VA_ARGS__を利用できない場合、C99をサポートしていないコンパイラ
#ifdef D_DEBUG
#define DEBUG_LOG printf("%s %d %s:", __FILE__, __LINE__, __FUNCTION__),printf
#else
#define DEBUG_LOG(...)
#endif
//DEBUG_LOG(...)で記述するところをわざとDEBUG_LOGとして記述するのはミソ
2. 上記は\nを手動で追加しないと、改行を出力してくれないという欠点が
ある。
要は下記記述で、改行を出力することはできない。
DEBUG_LOG("yao daoding = %d", tryInt);
それを防ぐためにはC99がサポートしているという前提だったら、
以下の対策がある。
#ifdef D_DEBUG
#define WGT_TRY_BY_TOU(fmt, ...) printf("%s %d %s "fmt"\n", __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__)
#else
#define DEBUG_LOG(...)
#endif
3. しかし、上記にも欠点があり、引数は一つしかない場合、コンパイルエラーに
なる。
DEBUG_LOG("daoding");
gcc -E main.cで確認すると、下記とおりに展開されているようである。
printf("%s %d %s ""daoding""\n", "main.c", 77, __FUNCTION__, );
余っている,を削除するために、下記方法は考えられる。
#define ENTER WGT_ENTER_LOG2("%s", "Enter", "")
#define WGT_DEBUG_LOG(...) WGT_ENTER_LOG2(__VA_ARGS__, "")
#define WGT_ENTER_LOG2(fmt, ...) \
{ \
printf("%s %d %s ", __FILE__, __LINE__, __FUNCTION__); \
printf(fmt"%s\n", __VA_ARGS__); \
}
すると下記はそれぞれ正常に展開される。
DEBUG_LOG("daoding");
DEBUG_LOG("yao daoding = %d\n", tryInt);
{ printf("%s %d %s ", "main.c", 76, __FUNCTION__); printf("daoding""%s\n", ""); };
{ printf("%s %d %s ", "main.c", 75, __FUNCTION__); printf("yao daoding = %d""%s\n", tryInt, ""); };
4. 運がよければ、下記も利用できるかも
引数は一つしかない場合、##は直前のあまった,を削除してれる。これはC99にはないので、ご注意を
#ifdef D_DEBUG
#define WGT_TRY_BY_TOU(fmt, ...) printf("%s %d %s "fmt"\n", __FILE__, __LINE__, __FUNCTION__, ## __VA_ARGS__)
#else
#define DEBUG_LOG(...)
#endif
2009年3月16日月曜日
C言語のスタック変数について
下記をredhat9で実行すると、以下のようにメモリに展開されている
ことを確認できる。
int main(void)
{
char tryChar = 'a';
char tryChar2= 'b';
short tryShort= 4660;
int tryInt = 305419896;
int tryInt2 = 0x10abcdef;
return 0;
}
0xbfffd64c : ef <- tryInt2 address
0xbfffd64d : cd
0xbfffd64e : ab
0xbfffd64f : 10
0xbfffd650 : 78 <- tryInt address
0xbfffd651 : 56
0xbfffd652 : 34
0xbfffd653 : 12
0xbfffd654 : 34 <- tryShort address
0xbfffd655 : 12
0xbfffd656 : 62 <- tryChar2 address
0xbfffd657 : 61 <- tryChar address
・先に宣言された変数のアドレスの値は大きい、なので、
スタックに入っていることはわかる。
・0x12345678のはずのintは実際に78563412のようにメモリに
配置している。
・tryChar2をコメントアウトすると、tryCharとtryShortの間に
1バイトのゴミが生成されたことを確認できる。
int main(void)
{
char tryChar = 'a';
// char tryChar2= 'b';
short tryShort= 4660;
int tryInt = 305419896;
int tryInt2 = 0x10abcdef;
return 0;
}
0xbfffd64c : ef <- tryInt2 address
0xbfffd64d : cd
0xbfffd64e : ab
0xbfffd64f : 10
0xbfffd650 : 78 <- tryInt address
0xbfffd651 : 56
0xbfffd652 : 34
0xbfffd653 : 12
0xbfffd654 : 34 <- tryShort address
0xbfffd655 : 12
0xbfffd656 : 01 <- バイトアライメント
0xbfffd657 : 61 <- tryChar address
ことを確認できる。
int main(void)
{
char tryChar = 'a';
char tryChar2= 'b';
short tryShort= 4660;
int tryInt = 305419896;
int tryInt2 = 0x10abcdef;
return 0;
}
0xbfffd64c : ef <- tryInt2 address
0xbfffd64d : cd
0xbfffd64e : ab
0xbfffd64f : 10
0xbfffd650 : 78 <- tryInt address
0xbfffd651 : 56
0xbfffd652 : 34
0xbfffd653 : 12
0xbfffd654 : 34 <- tryShort address
0xbfffd655 : 12
0xbfffd656 : 62 <- tryChar2 address
0xbfffd657 : 61 <- tryChar address
・先に宣言された変数のアドレスの値は大きい、なので、
スタックに入っていることはわかる。
・0x12345678のはずのintは実際に78563412のようにメモリに
配置している。
・tryChar2をコメントアウトすると、tryCharとtryShortの間に
1バイトのゴミが生成されたことを確認できる。
int main(void)
{
char tryChar = 'a';
// char tryChar2= 'b';
short tryShort= 4660;
int tryInt = 305419896;
int tryInt2 = 0x10abcdef;
return 0;
}
0xbfffd64c : ef <- tryInt2 address
0xbfffd64d : cd
0xbfffd64e : ab
0xbfffd64f : 10
0xbfffd650 : 78 <- tryInt address
0xbfffd651 : 56
0xbfffd652 : 34
0xbfffd653 : 12
0xbfffd654 : 34 <- tryShort address
0xbfffd655 : 12
0xbfffd656 : 01 <- バイトアライメント
0xbfffd657 : 61 <- tryChar address
2009年3月13日金曜日
vimのインストール先
vimを開いて、下記コマンドを実行すると、vimのインストール先が表示される。
:cd $VIMRUNTIME [enter]
ubuntu 8.10の場合、/usr/share/vim/vim71が表示される。
:cd $VIMRUNTIME [enter]
ubuntu 8.10の場合、/usr/share/vim/vim71が表示される。
2009年3月12日木曜日
2009年3月6日金曜日
一番簡単のmakefile
main.cというファイルが存在しているという前提で
下記makefileを作成する
==============================================
OBJS = main.o
TARGET ?= main
CFLAGS += -g
CFLAGS += -Wall
CC = gcc
all : $(TARGET)
$(TARGET) : $(OBJS)
$(CC) $(OBJS) -o $(TARGET) $(CFLAGS)
.c.o : $*.c
$(CC) -c $*.c $(CFLAGS)
clean :
rm -f $(OBJS) $(TARGET)
下記makefileを作成する
==============================================
OBJS = main.o
TARGET ?= main
CFLAGS += -g
CFLAGS += -Wall
CC = gcc
all : $(TARGET)
$(TARGET) : $(OBJS)
$(CC) $(OBJS) -o $(TARGET) $(CFLAGS)
.c.o : $*.c
$(CC) -c $*.c $(CFLAGS)
clean :
rm -f $(OBJS) $(TARGET)
2009年2月17日火曜日
svnサーバ上のファイルリストを表示する
svn list -R svn://172.16.100.26/dev-doc/
svn://172.16.100.26/dev-doc/に保存しているファイルを再帰的に全部表示する。
svn://172.16.100.26/dev-doc/に保存しているファイルを再帰的に全部表示する。
URLデコード
URLエンコードとURLデコード
URIの規則を定める RFC 3986 では、URIにASCIIの非予約文字以外の文字か'=','&','%','+'を記述する場合、"%XX" (XX=2桁の16進数)に変換することを定めている。
URLデコードのアルゴリズムは文字コードの種類によって異なっている。
下記例の場合、以下のように変換
"2009はチェンジ(change)の年"
2 0 0 9 は チ ェ ン ジ ( c h a n g e ) の 年
Shift_JIS 3230 3039 82cd 8360 8346 8393 8357 2863 6861 6e67 6529 82cc 944e
Shift_JIS URLエンコード 2 0 0 9 %82%cd %83%60 %83F %83%93 %83W %28c h a n g e%29 %82%cc %94N
EUC 3230 3039 a4cf a5c1 a5a7 a5f3 a5b8 2863 6861 6e67 6529 a4ce c7af
EUC URLエンコード 2 0 0 9 %a4%cf %a5%c1 %a5%a7 %a5%f3 %a5%b8 %28c h a n g e%29 %a4%ce %c7%af
UTF-8 3230 3039 e381af e38381 e382a7 e383b3 e382b8 2863 6861 6e67 6529 e381ae e5b9b4
UTF-8 URLエンコード 2 0 0 9 %e3%81%af %e3%83%81 %e3%82%a7 %e3%83%b3 %e3%82%b8 %28c h a n g e%29 %e3%81%ae %e5%b9%b4
エンコードする際は文字コードの前に%をつけ、デコードする際は、%を外す。
URIの規則を定める RFC 3986 では、URIにASCIIの非予約文字以外の文字か'=','&','%','+'を記述する場合、"%XX" (XX=2桁の16進数)に変換することを定めている。
URLデコードのアルゴリズムは文字コードの種類によって異なっている。
下記例の場合、以下のように変換
"2009はチェンジ(change)の年"
2 0 0 9 は チ ェ ン ジ ( c h a n g e ) の 年
Shift_JIS 3230 3039 82cd 8360 8346 8393 8357 2863 6861 6e67 6529 82cc 944e
Shift_JIS URLエンコード 2 0 0 9 %82%cd %83%60 %83F %83%93 %83W %28c h a n g e%29 %82%cc %94N
EUC 3230 3039 a4cf a5c1 a5a7 a5f3 a5b8 2863 6861 6e67 6529 a4ce c7af
EUC URLエンコード 2 0 0 9 %a4%cf %a5%c1 %a5%a7 %a5%f3 %a5%b8 %28c h a n g e%29 %a4%ce %c7%af
UTF-8 3230 3039 e381af e38381 e382a7 e383b3 e382b8 2863 6861 6e67 6529 e381ae e5b9b4
UTF-8 URLエンコード 2 0 0 9 %e3%81%af %e3%83%81 %e3%82%a7 %e3%83%b3 %e3%82%b8 %28c h a n g e%29 %e3%81%ae %e5%b9%b4
エンコードする際は文字コードの前に%をつけ、デコードする際は、%を外す。
2009年2月10日火曜日
vim と cscopeの連携
下記ところにひとつのプロジェクトtargetProjectがあるとします。
/root/usr/loca/targetProject
1.タグファイルcscope.outを生成する
$cd /root/usr/loca/targetProject
$cscope -bR -P /root/usr/loca/targetProject
b:生成後、cscopeを起動しない
R:フォルダの配下のすべてのフォルダを再帰的に探す
P:cscope.outの絶対パス
2.vimの設定ファイルに下記内容を追加
:cs add /root/usr/loca/targetProject/cscope.out /root/usr/loca/targetProject
3.vimを起動し、:cs -helpを入力してください。
:cs f g XXX だと、XXXの定義値は検索してれる
:cs showだと現在つながっているタグデータベース一覧をリストアップする
/root/usr/loca/targetProject
1.タグファイルcscope.outを生成する
$cd /root/usr/loca/targetProject
$cscope -bR -P /root/usr/loca/targetProject
b:生成後、cscopeを起動しない
R:フォルダの配下のすべてのフォルダを再帰的に探す
P:cscope.outの絶対パス
2.vimの設定ファイルに下記内容を追加
:cs add /root/usr/loca/targetProject/cscope.out /root/usr/loca/targetProject
3.vimを起動し、:cs -helpを入力してください。
:cs f g XXX だと、XXXの定義値は検索してれる
:cs showだと現在つながっているタグデータベース一覧をリストアップする
2009年2月8日日曜日
thinkpadT43 + ubuntuトラックポイントを有効にする方法
下記ファイルを新規生成し、/etc/hal/fdi/policy/mouse-wheel.fdi
以下内容を書き込むだけ。元ネタは下記です。
http://psung.blogspot.com/2008/09/scrolling-with-thinkpads-trackpoint-in.html
2009年2月6日金曜日
シェルに引数を渡す方法
try.sh
------------------------
#!/bin/bash
HIKISUU=1
echo "$HIKISUU" | ./hoge.sh
------------------------
hoge.sh
------------------------
#!/bin/bash
if [ "$1" = "1" ]
then
echo "OK"
else
echo "NG"
fi
------------------------
$./try.sh
を実行すると
------------------------
#!/bin/bash
HIKISUU=1
echo "$HIKISUU" | ./hoge.sh
------------------------
hoge.sh
------------------------
#!/bin/bash
if [ "$1" = "1" ]
then
echo "OK"
else
echo "NG"
fi
------------------------
$./try.sh
を実行すると
2009年2月5日木曜日
linuxのftpシェル
linuxでシェルでファイルをFTP経由でアップする場合、下記シェルが考えられます。
sarver 192.168.0.1 にuser:guest password:dogcatでhoge.txtをアップする手順
以下二つのファイルを用意する
ftpGo.sh
-------------------------
#!/bin/bash
ftp -n < foobar
#shutdown 下記を有効にすれば、アップした後、自動的にシャットダウンする。
#shutdown now
-------------------------
foobar
-------------------------
open 192.168.0.1
user guest dogcat
bin
prompt
put hoge.txt
quit
-------------------------
下記コマンドで実施する
$chmod 777 ftpGo.sh
$./ftpGo.sh
これでhoge.txtはFTPサーバにアップするはず。
sarver 192.168.0.1 にuser:guest password:dogcatでhoge.txtをアップする手順
以下二つのファイルを用意する
ftpGo.sh
-------------------------
#!/bin/bash
ftp -n < foobar
#shutdown 下記を有効にすれば、アップした後、自動的にシャットダウンする。
#shutdown now
-------------------------
foobar
-------------------------
open 192.168.0.1
user guest dogcat
bin
prompt
put hoge.txt
quit
-------------------------
下記コマンドで実施する
$chmod 777 ftpGo.sh
$./ftpGo.sh
これでhoge.txtはFTPサーバにアップするはず。
2009年1月21日水曜日
2009年1月19日月曜日
2009年1月17日土曜日
2009年1月15日木曜日
2009年1月10日土曜日
整形スクリプト
kill.cの96行から157行のコメントを取り出し、整形するスクリプト
sed -n '96,157p' kill.c | grep "\/\*.*\*\/" | perl -p -e 's/^(\s*\/\*)(.*)(\*\/\s*)/\2
\n/'
sed -n '96,157p' kill.c | grep "\/\*.*\*\/" | perl -p -e 's/^(\s*\/\*)(.*)(\*\/\s*)/\2
\n/'
amule
以下引用自
http://blog.donews.com/extreme001/archive/2006/05/01/852861.aspx
我用FC4,内核2.6.11.1369
终于解决Linux下安装设置aMule(就是Linux下的电驴客户端),并能成功下载软件了,经验总结如下:
1、安装aMule
我是用Synaptic自动下载的,同时还把很多依赖的软件包给更新了
或者你用apt-get, yum自动安装都行,因为它们都能帮你自动解决依赖问题
推荐用自动安装。
直接安装RPM包的话,如果你的gcc不是4.0.2版本似乎会出错
然后运行/usr/bin/amule,aMule就成功运行啦~
2、设置
安装之后,设置昵称为 [CHN][VeryCD]xxxx,然后服务器设置为:
名称:DonkeyServer No1 地址:62.241.53.2:4242
其他的服务器还有:
名称:华语P2P源动力 地址:61.152.93.254:4661
名称:Razorback 2 地址:195.245.244.243:4661
然后让Firefox支持ed2k:///协议
在 Firefox地址栏中键入:about:config,打开配置页。右键点击配置列表,创建“布尔”项network.protocol- handler.external.ed2k,值为 true,然后在创建一个“字符串”项network.protocol-handler.app.ed2k,值为 /usr/bin/ed2k.amule。这样就可以了。
http://blog.donews.com/extreme001/archive/2006/05/01/852861.aspx
我用FC4,内核2.6.11.1369
终于解决Linux下安装设置aMule(就是Linux下的电驴客户端),并能成功下载软件了,经验总结如下:
1、安装aMule
我是用Synaptic自动下载的,同时还把很多依赖的软件包给更新了
或者你用apt-get, yum自动安装都行,因为它们都能帮你自动解决依赖问题
推荐用自动安装。
直接安装RPM包的话,如果你的gcc不是4.0.2版本似乎会出错
然后运行/usr/bin/amule,aMule就成功运行啦~
2、设置
安装之后,设置昵称为 [CHN][VeryCD]xxxx,然后服务器设置为:
名称:DonkeyServer No1 地址:62.241.53.2:4242
其他的服务器还有:
名称:华语P2P源动力 地址:61.152.93.254:4661
名称:Razorback 2 地址:195.245.244.243:4661
然后让Firefox支持ed2k:///协议
在 Firefox地址栏中键入:about:config,打开配置页。右键点击配置列表,创建“布尔”项network.protocol- handler.external.ed2k,值为 true,然后在创建一个“字符串”项network.protocol-handler.app.ed2k,值为 /usr/bin/ed2k.amule。这样就可以了。
这样,当点出ed2k://的链接里就会把地址加入相应软件了(此时aMule要打开)
推而广之,也应该可以用来注册其他协议
登録:
投稿 (Atom)