来週はF1に行って1週間いないので、研究をがんばって進め中…
今読んでいる論文はTCP/IPを無線リンク向けにチューニングしましょうという話。
研究室入るまではTCP/IPはほとんどわかっていなかったので、
基礎から色々勉強しなおさなければなりません。
今週はネットワークを流れるパケットをのぞいてみるプログラムを作りました。

「基礎からわかるTCP/IPネットワーク実験プログラミング」
↑この本を参考にパケットをモニタするプログラムを組みます
実際にネットワークカードに流れ込むすべてのパケットの
ヘッダの値や内容を見ることができるプログラムを作れます。
![]()
TTL値やACKのシーケンス値、WindowSizeなどが実際に見れると面白いですね!
Pingを発行するとICMPのパケットも見れますし、ARPパケットものぞけます。
それぞれのプロトコルを理解する大きな助けになることでしょう。
2005,10,04 : 04:05 | 修正 | トラックバック (0)
この前作ってみたiアプリ公開します。
車の燃費計算するやつ。
たぶんエラーとかいっぱい出そうだけどご勘弁を。
友達の携帯では動いたみたいです。
ちなみにドコモの人限定だけどね。
下からダウンロードできるよ~
http://www.f.csce.kyushu-u.ac.jp/~koga/k/
なんかこういうアプリ作ってほしい!とかいうのない?
2005,07,19 : 23:35 | 修正 | コメント (3) | トラックバック (0)
ふとiアプリが作りたくなったのでやってみました。
俺はAuだからiアプリ動かないんだけど・・・
開発環境はWindowsでeclipseを使います。
開発言語はJavaです。
まずはiモードのページにいって
http://www.nttdocomo.co.jp/p_s/imode/java/tool_505i.html
から iαppli Development Kit for DoJa 3.0 をダウンロードします。
あとはインストールしましょう。
インストールはカスタム設定で行い、
Eclipse用のプラグインもインストールして下さい。
2005,07,15 : 23:15 | 修正 | コメント (2) | トラックバック (0)
今日はQt続編です。
1日入門書を読みながら、サンプルアプリを実行したりしました。
簡単なペイントアプリは作れるようになったかなー
とりあえず簡単なGUIアプリを作成してみましょう。
HelloWorldのボタンをウィンドウに表示させてみます。
GUIアプリケーションは基本的に「ウィジェット」を
追加しながら構成していきます。
「ウィジェット」とはコントロールみたいなもので、
ボタンやスクロールバーなどのことを指します。
以下のサンプルコードでは、QPushButtonウィジェットを追加しています。
#include <qapplication.h>
#include <qpushbutton.h>
int main(int argc,char* argv[])
{
QApplication app(argc,argv);
QPushButton btn("Hello World!",0);
btn.resize(150,30);
app.setMainWidget(&btn);
btn.show();
return app.exec();
}
上のコードをapp1.cppと名前を付けて保存します。
インストール時に作成したシェルスクリプトを
実行してコンパイル&実行しましょう。
#qt app1.cpp
#./app1
HelloWorldの文字を持つボタンが表示されましたか?
このようにしてGUIプログラミングが非常に簡単に行えるのがQtです。
今後暇があれば、いろいろなスクリプトを公開していきたいと思います。
2005,06,06 : 16:53 | 修正 | トラックバック (0)
研究室の先輩からGUIはQtを使うのがいいネと
すすめられたのでトライしてみることにした。
学校の図書館でオライリーの「Qtプログラミング」を
発見したので、即借りました。
ついでに「VisualC++6.0入門」も借りてしまった。
MFCプログラミングも少し知りたいなってことで。
QtとはTrolltechが考案したクロスプラットフォームの
C++のGUIアプリを作成するためのクラスライブラリです。
これを使えば簡単にC++でGUIアプリケーションを作成できます。
ではVineLinuxでQtのプログラミング環境を整えましょう!
Synapticパッケージ管理マネージャからインストールできます。
#synaptic
以下のパッケージをインストールしましょう。
qt qt-devel
簡単にコンパイルできるようにシェルを書いておきましょう。
#cd /usr/local/sbin
#emacs qt &
以下の内容のシェルスクリプトを、パスが通っている
ディレクトリに作成します。
#!/bin/sh
var1=`echo ${1} | awk '{printf "%s",substr($1,1,index($1,".")-1)}'`
echo 'Compiling' $var1
c++ -I/usr/lib/qt-3.3.4/include -L/usr/lib/qt-3.3.4/lib -lqt -o $var1 $1
これでインストール完了です。
次回は簡単なプログラムを書いてみます。
2005,06,05 : 23:31 | 修正 | トラックバック (0)
ここのところは激しくJava言語に打ち込んでおります。
非常に構造化されていて、慣れるとなかなか面白くなってきました。
かなり敷居が高いと感じていたんですけどね。
今日はキーボードからの入力を受け取ってみましょう。
KeyListenerクラスをインプリメントして実装しました。
このようなアプレットを作ってみました。
このプログラムを以下に示します。
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class Key extends Applet implements KeyListener{
String str = new String();
FontMetrics fo;
public void init(){
setBackground(Color.WHITE);
setFont(new Font("Serif",Font.ITALIC,120));
fo = getFontMetrics(getFont());
addKeyListener(this);
}
public void keyReleased(KeyEvent arg0) {}
public void keyTyped(KeyEvent arg0) {}
//キーが押されたときの処理をオーバーライドする
public void keyPressed(KeyEvent arg0) {
str += arg0.getKeyChar();
repaint();
}
public void paint(Graphics g){
g.drawString(str,20,100);
}
}
2005,05,26 : 23:03 | 修正 | トラックバック (0)
研究室では、今日からPDA上で動くJavaアプリケーションの開発をします。
PDAを何台か使って、あるゲームプログラムを作成することになりました。
手始めにJavaのGUIを勉強して来いとのこと。
クラスとかいろいろあって、リファレンス読むのが結構メンドイ・・・
Javaが敷居高いっていわれるのもわかる気がするなぁ。
とりあえず、簡単なお絵かきプログラム作ってみた。
http://www.freebbs.biz/mt/images/App3.html
↑こんな感じ
プログラムも数行で終わるのだが・・・
なかなか難しいですね。
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class App3 extends Applet implements MouseMotionListener{
int x = -10, y = -10;
public void init(){
addMouseMotionListener(this);
setBackground(Color.white);
}
public void mouseMoved(MouseEvent e){}
public void mouseDragged(MouseEvent e){
x = e.getX();
y = e.getY();
repaint();
}
public void update(Graphics g){
paint(g);
}
public void paint(Graphics g){
g.drawOval(x,y,5,5);
}
}
2005,05,24 : 23:19 | 修正 | トラックバック (0)
研究室でやったJavaプログラミングの覚え書き。
http://java.sun.com/j2se/1.5.0/ja/download.html
から開発ツールJDKをダウンロード&インストール
http://www.eclipse.org/downloads/index.php
Language PacksとEclipse本体をダウンロード
2つのバージョンをあわせておきましょう。
5/8時点で3.0.1
Eclipseを解凍し、Language Packsを解凍したものを上書きします。
eclipse.exeを実行して起動させます。
これで開発環境は整いました。
Eclipseメニューバーの「ファイル」⇒「新規」⇒「プロジェクト」でプロジェクト作成
左側パッケージエクスプローラーのプロジェクト名の上で右クリックし、
「新規」⇒「クラス」でクラスを追加します。
簡単なアプレットを作ってみましょう。
上記の手順でクラスApp1を追加してください。
以下のソースを打ちます。
import java.applet.Applet;
import java.awt.Graphics;
public class App1 extends Applet {
public void paint(Graphics g) {
g.drawString("Hello Applet !" , 30 , 30);
}
}
クラスApp1はAppletクラスを継承します。
Hello Applet ! という文字列を表示させるアプレットです。
実行はメニューの「実行」⇒「実行」で「Javaアプレット」を選択してください。
サンプルはこちら
上のサンプルが見れないときはSunJavaVMがインストールされていないか
MicrosoftVMが有効になっている、またはJavaが許可されていない可能性があります。
MicrosoftVMは「ファイル名を指定して実行」から
RunDll32 advpack.dll,LaunchINFSection java.inf,UnInstall
と入力するとアンインストールできます。
2005,05,08 : 22:53 | 修正 | トラックバック (0)
今日も昼過ぎに研究室へ。
C言語でカレンダーを表示させるプログラムを作った。
祝日も対応のなかなか便利なカレンダーです!
使い方は第一引数に年、第二引数に月を入れて実行
#include <stdio.h>
#include <string.h>
int zeller(int,int,int);
int hantei(int,int,int,int);
/* 第1引数:年 第2引数:月 */
int main(int argc,char *argv[]){
int i,youbi,day,y = atoi(argv[1]),m = atoi(argv[2]);
int flag=0; // 振り替え休日判定Flag
printf("\n\t\tYear:%d Month:%d\n\n\x1b[;31mSun\x1b[;0m\tMon\tTue\tWed\tThu\tFri\t\x1b[;34mSat\x1b[;0m\n",y,m);
/* 日数を設定 */
if(m == 2){
if(y%400 == 0 || (y%100 != 0 && y%4 == 0)){
day = 29;
}
else{
day = 28;
}
}
else if(m == 4 || m == 6 || m == 9 || m == 11){
day = 30;
}
else{
day = 31;
}
/* 1日の曜日を求めます */
youbi = zeller(y,m,1);
for(i=1;i<=day+youbi;i++){ //day+youbi回ループさせる
// (i-youbi)が日付、(i-1)%7が曜日となる
if(i-youbi<1){printf("\t");} //1日までタブ
else{
if(hantei(y,m,i-youbi,(i-1)%7) == 2){
printf("\x1b[;31m");
printf("(%d)\t",i-youbi);
printf("\x1b[;0m");
flag = 1; // 日曜と祝日が重なったらflagをたてる
}
else if(hantei(y,m,i-youbi,(i-1)%7) == 1 || flag == 1){
printf("\x1b[;31m");
printf("(%d)\t",i-youbi);
printf("\x1b[;0m");
flag = 0;
}
else if((i-1)%7 == 6){ // 土曜日
printf("\x1b[;34m");
printf("%d\t",i-youbi);
printf("\x1b[;0m");
}
else{
printf("%d\t",i-youbi); //日付を出力
flag = 0;
}
if((i-1)%7 == 6){printf("\n");} //土曜のあとは改行
}
}
return 0;
}
/* Zellerの公式 */
int zeller(int y,int m,int d){
if(m==1 || m==2){
y--;
m += 12;
}
return ((y + (int)(y/4) - (int)(y/100) + (int)(y/400) + (int)(2.6*m + 1.6) + d) % 7);
}
/* 祝日判定関数(祝日なら0以外を返す) */
int hantei(int y,int m,int d,int youbi){
if((m==3 && d== (int)(20.8431 + 0.242194*(y-1980) - (y-1980)/4)) // 春分の日
|| (m==9 && d== (int)(23.2488 + 0.242194*(y-1980) - (y-1980)/4)) // 秋分の日
|| (m==1 && d==1) // 元旦
|| (m==1 && d>7 && d<15 && youbi==1) // 成人の日
|| (m==2 && d==11) // 建国記念日
|| (m==4 && d==29) // みどりの日
|| (m==5 && d==3) // 憲法記念日
|| (m==5 && d==4) // 国民の祝日
|| (m==5 && d==5) // 子供の日
|| (m==7 && d>14 && d<22 && youbi==1) // 海の日
|| (m==9 && d>14 && d<22 && youbi==1) // 敬老の日
|| (m==10 && d>7 && d<15 && youbi==1) // 体育の日
|| (m==11 && d==3) // 文化の日
|| (m==11 && d==23) // 勤労感謝の日
|| (m==12 && d==23))// 天皇誕生日
{
if(youbi == 0){// 日曜と休日が重なった処理
return 2;
}
else{
return 1;
}
}
if(youbi == 0){ // 日曜日
return 1;
}
return 0;
}
2005,04,27 : 18:41 | 修正 | トラックバック (0)
今日は15時から研究室でJava講座。
今日からいよいよ本格的にJavaの特徴であるオブジェクト指向プログラミングを学ぶ。
昨日、クラスについては説明を受けた。
クラスは各フィールドを持ち、コンストラクタ、メソッドなどで構成される。
(例)Helloクラスを作る
public class Hello {
String str; // この部分はフィールド
Public Hello(String str) { // この部分はコンストラクタ(必ずクラス名と同名)
this.str = str;
}
Public void helloView () { // この部分はメソッド(メソッド名の先頭は小文字)
System.out.println(this.str);
}
}
インスタンスは実際の変数で表されたクラスの分身である。
Hello instance = new Hello("Hello World !");
このように書くとHelloクラスの属性を持つインスタンスが作成される。
コンストラクタとはnewでインスタンスを作成するときに最初に実行される関数である。
上の例のようにnewを実行したら、instanceの中のstr変数にHello World !が設定される。
instance.helloView();
と書くとメソッドが実行されHello World !が画面に表示される。
今日はスレッドを使ったタイマプログラムを作成した。
スレッドとはプロセスを細かく処理単位ごとに区切ったものである。
ソフトウェア実験でやったマルチタスクカーネルを思い出すなぁ・・・
とにかく2つのプログラム片を同時に動かしたりできるんですよね~
この辺になると結構頭を使わないとキビシイですね・・・
明日からソケットを使ったネットワークプログラミングをやるらしい。
かなり面白い内容になってきた。
構造化された美しいプログラムが組めていいっすよ!
Javaマジすげーやんけ!!
Tomcatを導入してJavaサーブレットにもチャレンジしてみたいね~
(サブレットじゃないっすヨ!!)
2005,04,14 : 21:20 | 修正 | トラックバック (0)
今日も研究室へ。
これから毎日毎日引きこもり生活を送らねばなりません。
今日はjava言語で生まれて初めてプログラムを組みました。
感想。
C言語とあんまり変わらんやん。簡単。
今日は簡単なサンプルプログラムを組まされただけで終了。
以下のコードは万年暦のプログラム。
コマンドプロンプトから
java Mannen 2005 4
という風に実行すると2005年4月のカレンダーが表示される。
うるう年などすべての月に対応!
public class Mannen {
public static void main (String[] args) {
int[] mt = {31,28,31,30,31,30,31,31,30,31,30,31};
int y = Integer.parseInt(args[0]),m =Integer.parseInt(args[1]),w,sum;
int bias;
m--;
if((y % 4)==0 && (y % 100)!=0 || (y % 400)==0){
mt[1] = 29;
}
bias = y + (y-1)/4-(y-1)/100+(y-1)/400;
sum = 0;
for(int k=0;k<m;k++){
sum += mt[k];
}
w = (bias + sum) % 7;
for(int k=0;k<w;k++){
System.out.print("\t");
}
for(int k=0;k<mt[m];k++){
System.out.print(k+1);
System.out.print("\t");
if((w+k)%7 == 6){
System.out.print("\n");
}
}
}
}
2005,04,11 : 23:01 | 修正 | トラックバック (0)
簡単なHTTPクライアント(ブラウザ)
使用例 ./http-client www.yahoo.co.jp 80 /index.html
#define BUF_LEN 1024 /* バッファのサイズ */
int main(int argc, char *argv[]){
int fd; /* ソケットのためのファイルディスクリプタ */
int error,l;
struct addrinfo hints, *res, *ai;
char buffer[BUF_LEN];
FILE *fp; /* ファイルポインタ */
if(argc != 4){
fprintf(stderr,"usage:%s
exit(1);
} /* 引数チェック */
memset(&hints,0,sizeof(hints)); /* hintsの初期化 */
hints.ai_family = PF_UNSPEC; /* IPv6についても検索 */
hints.ai_socktype = SOCK_STREAM;
error = getaddrinfo(argv[1],argv[2],&hints,&res);
if(error != 0){
printf("getaddrinfo error:%s,%s\n",argv[1],gai_strerror(error));
exit(1);
} /* エラーチェック */
for(ai=res;ai!=NULL;ai=ai->ai_next){
/* すべてのアドレスファミリについて検索 */
fd = socket(ai->ai_family,ai->ai_socktype,ai->ai_protocol);
/* ソケットを作成 */
if(fd < 0){
fprintf(stderr,"can't create socket\n");
continue;
}
if(connect(fd,ai->ai_addr,ai->ai_addrlen)==0){
break;
}
fprintf(stderr,"can't connect server\n");
close(fd);
}
if(res!=NULL){
freeaddrinfo(res);
}
if(ai == NULL){
fprintf(stderr,"can't connect to all servers\n");
exit(1);
}
fp = fdopen(fd,"r+"); /* fprintfなどを使えるようにする */
if(fp == NULL){
fprintf(stderr,"fdopen failed\n");
return 1;
}
setvbuf(fp,NULL,_IONBF,0); /* バッファリングOFF */
fprintf(fp,"GET %s HTTP/1.0\r\n",argv[3]);
fprintf(fp,"Host: %s:%s\r\n",argv[1],argv[2]);
fprintf(fp,"\r\n"); /* GETをサーバーに送信 */
while(1){
if(fgets(buffer,sizeof(buffer),fp) == NULL){
break;
}
printf("%s",buffer);
}
fclose(fp);
close(fd);
return 0;
}
2004,11,22 : 00:40 | 修正 | トラックバック (0)
仕様は void my_qsort(void *base, size_t num, size_t width, int (*compare)(char*,char*)) であるがvoid型のポインタの処理が結構難しかった。
スワップ関数
| void my_swap(void *base, int x, int y, size_t width){ char *temp = (char*)malloc(width); memcpy(temp,base+x*width,width); memcpy(base+x*width,base+y*width,width); memcpy(base+y*width,temp,width); free(temp); } |
left番目からright番目までrightを基準値にして大小を分割する関数
| int partition(void *base, size_t width, int left, int right, int (*compare)(char*, char*)){ int i,j; i = left - 1; j = right; char *pivot = (char*)(base+right*width); while(1){ while((*compare)((char*)(base+(++i)*width),pivot) < 0) ; while(i < j-- && (*compare)(pivot,(char*)(base+j*width)) < 0) ; if(i >= j) break; my_swap(base,i,j,width); } my_swap(base,i,right,width); return i; } |
クイックソート本体
| void my_qsort(void *base, size_t num, size_t width, int (*compare)(char*, char*)){ int right,left,mid,sp; int low[STACK_SIZE], high[STACK_SIZE]; low[0] = 0; high[0] = num - 1; sp = 1; while(sp > 0){ sp--; left = low[sp]; right = high[sp]; if(left > right) ; else{ mid = partition(base,width,left,right,compare); if(mid - left < right - mid){ low[sp] = mid +1; high[sp++] = right; low[sp] = left; high[sp++] = mid - 1; } else{ low[sp] = left; high[sp++] = mid - 1; low[sp] = mid + 1; high[sp++] = right; } } } } |

