2006/12/27

[C言語]バッファオーバーフローの練習

■今回のプログラム

長さ5のchar配列を作成。
gets()で標準入力。
printf()で標準出力。

■ソースファイル
#include <stdio.h>
#define NUM 5

int main(void)
{
//文字列バッファ宣言(長さは5)
char s[NUM];

printf("s address:%X¥n", &s);
printf("s length:%d¥n¥n", sizeof(s));
printf("input string:");
gets(s);//バッファのサイズを渡せないのでチェックのしようが無い
printf("%s¥n", s);
}
■実行結果
$ ./BOFTest
s address:BFFFFCBB
s length:5

warning: this program uses gets(), which is unsafe.
input string:fdsafdas
fdsafdas

親切にwarningが出てますが無視して大量入力。
宣言した領域をはみ出して書き込んでますね。
printf()も領域完全無視で読みにいってるみたいです。
fscanf()が嫌われてるのもこれが理由らしいです。
作るのは簡単(よりもたちが悪い)なだけに対策が難しいですね。

[C言語]文字列の検索

■処理の流れ

string1からstring2[i]の文字列を探す。
それだけ。

■ソースファイル
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]){
//検索される文字列
char string1[] = "Hey mommy where is my shoes.";

//検索する文字列(する、されるじゃいまいちわかり難いね)
char *string2[] = {"Hey", "mommy", "where", "is", "my", "shoes", NULL};

//string2のインデックス用
int i = 0;

//string1の表示と先頭アドレスの表示
printf("string1 = ¥"%s¥"¥n", string1);
printf("string1はここから始まってますよ:%X¥n",&string1);

//string2の単語を先頭から検索、NULLになったらやめる
while(string2[i] != NULL){
printf("%sはメモリの%X番地から始まってますよ。¥n", string2[i], (int)strstr(string1, string2[i]));
i++;
}
}
■実行結果
$ ./SearchTest
string1 = "Hey mommy where is my shoes."
string1はここから始まってますよ:BFFFFC8F
HeyはメモリのBFFFFC8F番地から始まってますよ。
mommyはメモリのBFFFFC93番地から始まってますよ。
whereはメモリのBFFFFC99番地から始まってますよ。
isはメモリのBFFFFC9F番地から始まってますよ。
myはメモリのBFFFFC96番地から始まってますよ。
shoesはメモリのBFFFFCA5番地から始まってますよ。

1文字1バイト=一つの番地に収まる。
という訳でこういう場合わかりやすいね。
あとはstrlen()と組み合わせていろいろできそう。

[C言語]ファイルに出力

■何となく流れっぽいもの

コマンドライン引数を取得。
引数一つを1行にしてoutput.txtに出力する。

■ソースファイル
#include <stdio.h>

int main(int argc, char *argv[])
{
int i;

//ファイルポインタ宣言
FILE *fp;

//ファイルオーオプン
fp = fopen("output.txt","w");

if(fp == NULL){
printf("Can not open...");
return 1;
}

//書き込む
fputs("書き込み開始\n", fp);
for(i=1; i <= argc; i++){
fputs(argv[i], fp);
fputs("\n", fp);
}
fputs("書き込み終了\n", fp);

//別な書き込み方
fprintf(fp, "書き込み開始\n");
for(i=1; i <= argc; i++){
fprintf(fp, "%s\n", argv[i]);
}
fprintf(fp, "書き込み終了\n");
//ファイルクローズ
fclose(fp);
}
■実行結果
$ ./FileOutputTest This is a pen.
$ cat output.txt
書き込み開始
This
is
a
pen.
(null)
書き込み終了
書き込み開始
This
is
a
pen.
(null)
書き込み終了
■ソース書くだけでいっぱいいっぱい

別に良いよね、需要無いし。
(こういう考え方がいけないんだ…)

2006/12/26

[Mac][備忘録]"\"バックスラッシュが打てない

■Win用のJISキーボードを使うと、¥(エン)マークしか打てない。

という訳でいろいろ調べてみた。
やっぱり解決方法がありましたよ。(ネタ元URL参照)
キーマップを自作して適用するらしい。

■必要なもの

Ukeleleのダウンロード

■手順

1.Uklele.appを開いたら"New Keyboard Layout"ってウィンドウで"Copy of other keyboard layout"を選択する。
2.Ukeleleのフォルダから"System Keyboards→Japanese→ROMAJI.keylayout"を選択。
3.メニューから"Keyboard→Set keyboard type..."
4."Select Keyboard Type"ウィンドウで(左)"Third party"、(右)JISとしてやる。
5."~/Library/Keyboard Layouts"に保存。
6.いったんログアウト。
7.システム環境設定→言語環境→入力メニューにさっき保存したキーボードがあるからチェックを入れる。
8.ことえりの入力モードに追加されているのでそれを選択する。

■こんな感じで

OKでした。

2006/12/21

[C言語]コマンドライン引数を使ってみる

■mainの第一引数に引数の数、第二引数に文字列配列

具体的にはこんな感じ。

#include <stdio.h>

int main(int argc,char *argv[])//argcが引数の数、argv[]が実際の引数
{
int i;
//第一引数から最後の引数まで順番に表示
for(i = 1; i <= argc; i++){
printf("第%d引数:%s\n",i,argv[i]);
}
return 0;
}

ちなみに、第零引数は実行ファイルへのパス。 (多分カレントディレクトリからの相対パス)

■実行結果
$ ./InputEcho Is this a pen ?
第1引数:Is
第2引数:this
第3引数:a
第4引数:pen
第5引数:?
第6引数:(null)

[C言語]ファイルから入力

■ファイル入力テスト

ソースファイルはこちら

#include <stdio.h>
#define NUM 256

int main(void)
{
FILE *fp;
char string[NUM];
char s1[NUM],s2[NUM];

//ファイルオープン
fp = fopen("inputfile.txt","r");

//オープン成否判定
if(fp == NULL){
printf("ファイルが開けませんよ?\n");
return 1;
}

printf("ファイル読み出し開始\n");
//ファイル読み出し
while(fgets(string, NUM, fp) != NULL){
printf("%s", string);
}
printf("ファイル読み出し終了\n");

//現在位置(どこから読み込むか)を先頭に戻す
fseek(fp, 0, 0);

printf("二度目のファイル読み出し開始\n");
//ファイル読み出し2
while(fscanf(fp, "%s %s", &s1, &s2) != EOF){
printf("名:%s 姓:%s\n", s1, s2);//fscanfの場合最後の改行は空白に変換されるらしい
}
printf("二度目のファイル読み出し終了\n");

//ファイルクローズ
fclose(fp);
return 0;
}

読み込むファイルはこれ

命 大雪
板 かまぼこ
だんご 笹

実行結果はこれ

ファイル読み出し開始
命 大雪
板 かまぼこ
だんご 笹
ファイル読み出し終了
二度目のファイル読み出し開始
名:命 姓:大雪
名:板 姓:かまぼこ
名:だんご 姓:笹
二度目のファイル読み出し終了

fscanfは嫌われているみたいね。
扱い方が独特らしい。 あとエラー処理が面倒くさくなるみたい。

2006/12/20

[ブログ改造日記]あちらをたてればこちらがたたず

■改行を<br />に変換…

なんて処理をbloggerまかせにしていたので、タグを使った編集すると改行入りまくりですよ。
やはりタグ使うと結構改行するので…。
古い設定を残すと新しいのに影響するという罠。
しかも今の設定も既に改善案があったりしてもうどうしたら良いのやら…。
WEBデザインは熟慮してから決めましょうねって話ですかね。

[ブログ改造日記]CSSの勉強

■中見出し

中見出しの中身。
こんな感じでどうですか?

■色分け表示

ファイルの内容とかコンソール画面とかはこういう表示。

> こんな感じで

どうよ?

2006/12/19

[JavaScript]JavaScript入門する

■直前の投稿で何かいたっけ?君…
なんていう突っ込みは受け付けません。

■.jsファイルの読み込み
スクリプトタグの中にsrc属性をつけてパスを指定する。
<script src="test.js" />
■どこが入門ですか?
そんな突っ込みも受け付けません。

[C言語]C言語入門してみる

■USBメモリをなくしたので…
Wiki2Html(Java)も一緒に行方不明です。
どうせもう一度作るなら勉強もかねてほかの言語にしましょうかね。
というわけで、C言語入門してみる。


■なぜ今C言語なのか?
  • 『C言語は現代のアセンブラ』って誰かが言ってた。(検索しても見つからず…)
  • ポインタ、構造体を知る=PCのメモリの使い方を知る?
     →クラス、メソッドとかの理解にも役立つ?
  • 古い技術を使うのはなんか格好良い(古いなんていっちゃだめか?)

■必要な機能
  • HTTPリクエスト
  • HTMLソース書き換え
  • 文字コード変換
  • ファイルへ保存
  • URLリストからDLする
  • 上階層を自動保存
  • WEBの構造も保存(フォルダ自動作成)
Javaでは以外に簡単(だけど面倒)だったけれどもCだとどうでしょうね。 ネットワーク関係がすごい面倒なんだっけ?


■ぼちぼち
やっていきます。

2006/12/18

[普通の日記] 昨日から今日にかけての日記

また終電で寝過ごす。
いつもと同じ道も飽きるのでいつもと違う道を通ってみる。
千葉県立中央博物館を発見。嫌な予感。
なんとか大学付属病院を発見。周囲をぐるりと回ろうと思ったらいつの間にか敷地内っぽいところへ迷い込む。 仕方ないので来た道を戻る。
結果、1時間くらいの寄り道。
しかしまぁ、良く寝るなぁ今月に入って5度目ですよ。
うわ、学習能力があるのかどうか不安になってくるなぁ…。

2006/12/17

[Mac][備忘録]MacでWindow用キーボード

Windows用キーボードにはMac用キーボードの[カナ/かな][英数]キーに対応するキーがない。
で、どうやって全角/半角を切り替えるかというと、

[Ctrl]+[スペース]

だそうだ。
いや、多分こっちの方が基本なのだろうけれどね。

ちなみにWinのキーボードでは、
コマンドキー→Windowsキー
オプションキー→Altキー
となっているようだ。

2006/12/15

[Mac][備忘録]Macでrootを有効にする

rootを有効にするには
Finder→アプリケーション→ユーティリティ→NetInfoマネージャ.appを選択(Spotlightで探しても良いね)。
メニューからセキュリティ→認証。
認証が終わったら同じくメニューのセキュリティからルートユーザを有効にする。
(実際はSUDOコマンド使う方が良いらしいけれど…)

[普通の日記]USBメモリをなくした…。

と、いうわけで、Wiki(php)2HTMLプログラムも一緒に紛失しました。
作り直すのも面倒くさいし手動アップロードもしんどい。

という訳でしばらくはBLOGのみの更新(この更新もしばらくぶりだけどね)
ちまちまやっていきたいと思います。

2006/12/10

[普通の日記]言わなきゃやらないので言ってみる

言ってもやらない可能性がなきにしもあらず。
ってか結構可能性高いかも…。

ネタになりそうなもの調べてはいるのだけれども、
まとめるのが面倒くさいのよ。
いや、言い訳ですがね。

予定としては優先順位順にこんな感じかね?
1.スコーラのネタをまとめる(CGIとフォーム)。
2.卒研
3.Javaの勉強
4.Macの使い方
5.SSHサーバの反応が遅い原因を調べる

あ、就職活動書いてないじゃん。
大丈夫か?俺?

2006/12/02

Windows(PortableApps日本語化)

firefoxとthunderbirdを日本語化してみました。
他はまた今度。

2006/12/01

Windows(PortableAppsを使ってみた)

有名どころのソフトをUSBにインストールできるようにしたもの?
うまく一言で表せませんね。
いろんなソフトをUSBにインストールして、USBポートさえあればどこでも同じ環境で使えるらしい。

ということで、スタンダード版をダウンロードして使ってみた。

USB1.0だと使い物になりませんね。
私の気が短いだけかもしれませんが。
USB2.0なら大丈夫な感じ。

firefoxとthunderbirdを使ってみたところ、意外に便利。
家PC以外だとマウスジェスチャー付いてないし。
メールもいろいろなところに分散しないでよい感じ。
(これは多分メール受信の仕方が悪い)
家の設定コピーして持ち歩いてみようかなと。
USBと自宅PCにメール保存しておけばよい感じにミラーリングっぽくなりそうだしね。

ちなみにスタンダード版に入っているのはこんな感じ。

画像でごめんなさいね。
書き写すのめんどうなんだわ。
使ったこと無いソフトもあるし、これを機会に試してみようかなと。
以下続くかも。

普通の日記(人体を通信路にする)

The human body as sound machine | Crave : The gadget blog
人間の体を通してプレイヤー、ヘッドホン間の音声データを送るらしい。
body area network
なんて技術を使っているらしい。

無線のような使い心地らしい。
いやな感じの痛みもないらしい。

…読めたのはこれくらい。
体に悪そうだと思うのはきっと古い人間だからなんだろうな。

ブログ改造日記(Google AdSense(2))

すっかり報告忘れてたのですが、
GoogleAdSense登録完了してました。

意外と審査はゆるいらしい。
(blogspot.comからの登録だからかもしれない)

後は振込み口座の登録と、実際に振り込めるかのテストして完了。

ということで早速ページ上下段に広告追加してみました。
ネタを絞っていないからどんなつながりがあるのか良く分からない広告が表示されてますね。
個別ページ行けばまだましになるのかな?

後はフィルタやら何やら設定できるらしいのでいろいろ試してみたいと思います。