2007年9月29日土曜日

pythonでOpenGL

pythonでOpenGLでも使いましょうということで、

1.setuptools のインストール
パッケージインストールツール。windows pythonにはデフォルトでインストール
されていないのでインストールする必要がある。
PyOpenGLのインストールに必要である。

インストール方法:
python-setuptools のセットアップファイルをダウンロード
#wget http://peak.telecommunity.com/dist/ez_setup.py
#python ./ez_setup.py

2.glut のインストール
OpenGLを使用するためのライブラリ
glut-3.7.6-bin.zipをダウンロードして、解凍する。
*dll を
C:WINDOWSsystemへコピーする。
C:WINDOWSsystem32へコピーする。

3.PyOpenGL のインストール
PyOpenGL-3.0.0a6.tar.gzをダウンロードして展開をする。
#cd PyOpenGL-3.0.0a6
#python setup.py install
これでインストール完了。

4.pygame のインストール
pygame-1.7.1release.win32-py2.5.exeをダウンロードして
インストールする。


4 はついでにインストールしましたw

これでpythonでOpenGLが使えるようになります。

以下簡単なサンプル
#!/usr/bin/python
import sys
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *

init_flag = 0

def display():
global init_flag
if not init_flag:
glEnable( GL_LIGHTING )
glEnable( GL_LIGHT0 )
glEnable( GL_DEPTH_TEST )
init_flag = 1

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT )
glPushMatrix()
gluLookAt( 0,3,-10, 0,0,0, 0,1,0 )
glutSolidTeapot( 2 )
glPopMatrix()
glFlush()

def reshape(w,h):
glViewport( 0, 0, w, h )
glMatrixMode( GL_PROJECTION )
glLoadIdentity()
gluPerspective( 45.0, 1.0*w/h, 0.1, 100.0 )
glMatrixMode( GL_MODELVIEW )
glLoadIdentity()

def keyboard(key,x,y):
if key==chr(27): sys.exit(0)

glutInit( sys.argv )
glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH )
glutInitWindowSize( 256, 256 )
glutCreateWindow( 'teapot' )
glutReshapeFunc( reshape )
glutKeyboardFunc( keyboard )
glutDisplayFunc( display )
glutMainLoop()

2007年9月22日土曜日

画像のファイルフォーマットについて

C言語でファイルフォーマットチェック関数を簡単に作ってみました。
今後はファイルサイズなどもチェックできるように使用と思います。
JPEGフォーマットについて:
http://siisise.net/jpeg.html#format

int checkextent( char* chp_file ) {
int in_cnt = 0;
int in_ret = 0;

char* chp_ret = NULL;
char cha_buff[ BUFF_SIZE + 1];

FILE* fp = NULL;

chp_ret =fgets( cha_buff, BUFF_SIZE , fp );
if ( *chp_ret = 0xFFFFFFFF && *(chp_ret+1) == 0xFFFFFFD8 ) {
return JPEG_FORMAT;
}else if ( *chp_ret == 'G' && *(chp_ret +1 ) == 'I' &&
*(chp_ret +2)== 'F' ) {
return GIF_FORMAT;
}else if ( *chp_ret == 0xFFFFFF89 && *(chp_ret +1 ) == 0x50 &&
*(chp_ret +2 ) == 0x4E &&
*(chp_ret +3 ) == 0x47 &&
*(chp_ret +4 ) == 0x0D &&
*(chp_ret +5 ) == 0x0A ) {
chp_ret = fgets( cha_buff, BUFF_SIZE , fp );
if ( *(chp_ret ) ==0x1A &&
*(chp_ret +1 ) == 0x0A ) {
return PNG_FORMAT;
}
}
fclose( fp );
return NG;
}

2007年9月17日月曜日

FTPやらtelnetなどを使ってみる。

windowsから色々な場所へftp,telnetをしたくなる場合があるため、ちょっと調べてみました。


■FTPモジュールの使い方
基本的なftpモジュールの操作
結構primitiveなことができるため、ftpを覚えるという点からもよいかもしれない。
from ftplib import FTP
ftp = FTP( SERVER )
ftp.login( USER , PASS )
ftp.cwd( PUT_PATH )
fp_up = open( i , "r" )
ftp.storlines( "STOR "+PUT_FILE , fp_up )
fp_up.close()
ftp.close()

※FTPとかによく使う豆知識
現在のディレクトリを取得
import os
print os.path.dirname(os.path.abspath(__file__))


■telnetモジュールの使い方
これはまぁ、そのままです。
import telnetlib
tn =telnetlib.Telnet( FUMIDAI )
response=tn.read_until( PROMPT[cnt] )
tn.write( WRITE_DATA[cnt]+ '\n' )
tn.close()

2007年9月14日金曜日

プログラムのお勉強

【アセンブラの勉強】
とりあえず、gcc -vでコンパイルの詳細情報を出力する。
# gcc -v sample.c
Reading specs from /usr/lib/gcc-lib/i586-suse-linux/3.3.4/specs
Configured with: ../configure --enable-threads=posix --prefix=/usr --with-local-prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --enable-languages=c,c++,f77,objc,java,ada --disable-checking --libdir=/usr/lib --enable-libgcj --with-gxx-include-dir=/usr/include/g++ --with-slibdir=/lib --with-system-zlib --enable-shared --enable-__cxa_atexit i586-suse-linux
Thread model: posix
gcc version 3.3.4 (pre 3.3.5 20040809)
/usr/lib/gcc-lib/i586-suse-linux/3.3.4/cc1 -quiet -v -D__GNUC__=3 -D__GNUC_MINOR__=3 -D__GNUC_PATCHLEVEL__=4 sample.c -quiet -dumpbase sample.c -auxbase sample -version -o /tmp/cclBAc0J.s
GNU C version 3.3.4 (pre 3.3.5 20040809) (i586-suse-linux)
compiled by GNU C version 3.3.4 (pre 3.3.5 20040809).
GGC heuristics: --param ggc-min-expand=55 --param ggc-min-heapsize=48247
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include
/usr/i586-suse-linux/include
/usr/include
End of search list.
/usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../../i586-suse-linux/bin/as -V -Qy -o /tmp/cco4tK3p.o /tmp/cclBAc0J.s
GNU assembler version 2.15.91.0.2 (i586-suse-linux) using BFD version 2.15.91.0.2 20040727 (SuSE Linux)
/usr/lib/gcc-lib/i586-suse-linux/3.3.4/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../crt1.o /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../crti.o /usr/lib/gcc-lib/i586-suse-linux/3.3.4/crtbegin.o -L/usr/lib/gcc-lib/i586-suse-linux/3.3.4 -L/usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../../i586-suse-linux/lib -L/usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../.. /tmp/cco4tK3p.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc-lib/i586-suse-linux/3.3.4/crtend.o /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../crtn.o


まとめると。
cc1、as、collect2を使ってコンパイルを行っている。
cc1はCのソースをアセンブラコードに落とし、asでアセンブラからオブジェクトコードに変換し,
collect2はリンカでオブジェクトファイルをリンカなどで紐付ける。

もっとわかりやすくすると。
cc1 -quiet -v -D__GNUC__=3 -D__GNU_MINOR__=3 -D__GNU_PATCH_LEVEL__=4 sample.c -quiet -dumpbase sample.c -auxbase sample -version -o sample.s
これは色々なマクロ変数を定義し、sample.cを元にsample.sを作成する

次にアセンブラコードを
as -V -Qy -o sample.o sample.s
これでオブジェクトファイルを作成。

collect2 を使ってオブジェクトファイルから実行ファイルを作成する。
また、ldコマンドを実行しても同じことが作れる。

/usr/lib/gcc-lib/i586-suse-linux/3.3.4/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../crt1.o /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../crti.o /usr/lib/gcc-lib/i586-suse-linux/3.3.4/crtbegin.o -L/usr/lib/gcc-lib/i586-suse-linux/3.3.4 -L/usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../../i586-suse-linux/lib -L/usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../.. /tmp/cco4tK3p.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc-lib/i586-suse-linux/3.3.4/crtend.o /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../crtn.o


最後の collectはすっげーめんどくさい。

実際のコンパイルはこんなことをやっています。

次回はアセンブラコードを書いて、標準出力するサンプルを作ってみようかと。

2007年9月12日水曜日

画像フォーマット

・PNGフォーマット
http://www.libpng.org/pub/png/spec/1.0/PNG-Contents.html

・ JPEGフォーマット
http://www.marguerite.jp/Nihongo/Labo/Image/JPEG2.html

・ GIFフォーマット
http://www.tohoho-web.com/wwwgif.htm#GIFAbout

ハフマン符号:
エントロピー符号化:


・JPEG
静止画像の圧縮する形式。基本的に不可逆。
符号化方式:
離散コサイン変換を用いて空間領域から周波数領域へ変換する。
変換データを量子化して、ハフマン符号を行い、圧縮することができる。

ノイズ:
ブロック単位変換のため、圧縮率を上げると、ブロック境界にノイズが
現れる。これをモスキートノイズという。

周波数変換で低周波成分の画像エネルギーが集中しているため、高周波成分では
エネルギーがゼロ。
画像は急激な変化を十分に表現できない。

赤は弱く画像を小さくすると、赤の部分でノイズが乗りやすい。


調べる単語:
エントロピー符号化、ハフマン符号。

2007年9月11日火曜日

readelf

ELFヘッダを見る方法:
readelf -h [オブジェクト]
ELFのマジックナンバーは「177ELF」という文字列になっている。

ABI:Application Binary Interface


・プログラムヘッダ
readelf -l sample

・セクションヘッダ
readelf -S sample

・ストリングヘッダ
ストリングヘッダが.shstrtabにあたるのでオフセットが0012f5、サイズが000158バイトのストリングテーブルがある。
od --skip-bytes 0x0012f5 --read-bytes 0x158 -t x1z sample

・シンボルテーブル
readelf -s sample
ELFヘッダから読み取ってみると。
シンボルテーブルとしては.dynsymがあることがわかる。
そしてダンプしてみると。

od --skip-bytes 0x0001ac --read-bytes 0x000060 -t x1z sample


・再配置情報

2007年9月6日木曜日

GDについて

gdImageCopyResized
とgdImageCopyResampled

の比較。

Resizedのほうが画質が悪く感じられる。


gdImageCopyResampled:

四角形のイメージを別のイメージにコピーする際に使う関数。
スムーズにピクセル値を修正する。
イメージのサイズを減らす際にclarityを保つためである。
オリジナルとターゲットのX,Y座標は適度に領域を延ばしたり、
縮めたりする結果、変化させることが可能
ピクセル値を修正しない場合には gdImageCopyResizedを見る。


gdImageCopyResized:
四角形をイメージから別のイメージへコピーすることができる。
オリジナル画像のX,Y座標とターゲット画像のX,Y座標を適度に
領域を延ばし縮みさせることで変化されることが可能。
イメージ間のコピーでの重要点:
イメージは同じカラーテーブルをもっている必要はないので、
ピクセルはコピーするための同じカラーインデックスをセットしない。
gdImageCopyは同じRGB値をgdImageColorExactに頼って探そうとする。
しかし値が見つからなかった場合にはgdImageColorAllocateで使われたカラーでallocateしようとする。



書いてある内容からするとResampledを使ったほうがよさそうな気がする。