ボクノス
ちょっとはまって調べてみたら、もっとはまってしまった・・・。値の変更が出来る文字列についての格闘記。 値の変更について func(char *s) { *s = 'a' } func("moge"); というアホなプログラムを書いてしまった・・・値が変更が出来る訳が無い!! なんとなく気になったので、値の変更について調べることにした。 値の変更について調べてみた。 strcpyで値をコピーしてみる。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char s1[] = "hoge"; const char s2[] = "piyo"; /* 普通 */ strcpy(s1, "copy"); printf("%s\n", s1); /* 警告は出るけど値の変更はできる */ strcp
2-4より先に2-5をやる。 文字列のマッチングをして、一致する文字の位置を返す問題。 mixi時代にkusakabeさんに激しく突っ込まれたのでよく覚えてる。 #include <stdio.h> #include <stdlib.h> int any(char *s, char *match) { int i = 0; char *sp; char *mp; for (;*s != '\0'; s++, i++) { if (*s == *match) { sp = s; mp = match; for (;*sp == *mp; sp++, mp++) ; if (*mp == '\0') return i; } } return -1; } int main(void) { printf("%d\n", any("01234567", "345")); /* 3 */ printf
GNU catのソース読んでます。長くなってきたので分割しました。 ソースコードのありか オンラインで見るときはCVSを sources Index of /coreutils/coreutils/src ソースはftpからゲットせよ。 Coreutils - GNU core utilities グローバル グローバル変数static int input_descが入力ファイルディスクリプタ。超重要。 小さな関数 usageの処理はGNU定番の超絶テク。必見。 行番号の処理が凄い。写経しよう。 解析結果 -> ボクノス - GNU catを読む - next_line_num()編 main() getopt_longは定番の処理。 fstat (STDOUT_FILENO, &stat_buf)の意味がイマイチわからん。STDOUTのfstat??何が出てくる?? 調べた。cat >
昨日、catのソースを読んでいて謎だったnext_line_num()の処理を解析してみた。 実際の動作を確認する。 cat -nで行番号表示が出来る。 % cat -n next_line_num.c 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define LINE_COUNTER_BUF_LEN 20 5 static char line_buf[LINE_COUNTER_BUF_LEN] =表示桁数が固定なのが痛いが、catで行番号を表示することはまず無さそうなので、こんなもんかなぁと思う。 解析してみる。 next_line_num()を抜き出して遊んでみた結果。 解析結果はコメントに書いた。 #include <stdio.h> #include <stdlib.h> // 頭悪すぎコメント。 /* Buffer for li
Vimの本ってなかなか無いんですよね・・・世界中で使われてるグレイトなエディタなのに〜なぜだぁぁぁ!! と思ってたら、でた、でた、でたぁぁぁ〜Vim7本!! (洋書だけど) Hacking Vim: A Cookbook to Get the Most Out of the Latest Vim Editor 作者: Kim Schulz出版社/メーカー: Packt Publishing発売日: 2007/05/18メディア: ペーパーバック購入: 2人 クリック: 122回この商品を含むブログ (3件) を見る Cookbook形式なので欲しいとこだけ拾い読み出来そう。Vim7対応で新機能の解説があるのが魅力。ただ、ページ数が228ページで7019円!! うぅぅぅ。たけぇ。欲しいけど、高い。しかも洋書。迷う。迷うなぁ・・・ あ、サンプルページはvim onlineからのリンクにありまし
チャーチ数 0 1 2 3 4 5 ... 僕等が普段接している世界は自然数の世界だ。 0 0に1を足して1 0に1を足して1を足して2 0に1を足して1を足して1を足して3ラムダ計算を生み出したチャーチは、自然数の世界を抽象的に捉えた。 xはzero xにfをしてone xにfをしてfをしてtwo xにfをしてfをしてfをしてthreeschemeに直すとこうだ。 (define zero (lambda (f) (lambda (x) x))) (define one (lambda (f) (lambda (x) (f x)))) (define two (lambda (f) (lambda (x) (f (f x))))) (define three (lambda (f) (lambda (x) (f (f (f x)))))) xにfを何回適用したか。というのがチャーチ数であ
演習2-1 変数の範囲を調べる問題。 面倒なのでマクロで自動生成してみた。 #include <stdio.h> #include <stdlib.h> #include <limits.h> #include <float.h> #define UCHAR_MIN 0 #define USHRT_MIN 0 #define UINT_MIN 0 #define size(s, t, S) printf("%-15s : %2d byte %2d bit %16" #t "%16" #t "\n", \ #s, sizeof (s), sizeof (s) * 8, S ## _MIN, S ## _MAX) int main(void) { size(unsigned char, d, UCHAR); size(char, d, CHAR); size(unsigned short, d
最近cflowの便利さに気づいたtanakaです。 % cflow cat.c | grep ':$' | sed 's/<.*//' main() usage() simple_cat() cat() write_pending() next_line_num()コールグラフが一目瞭然でっす。超便利。 便利過ぎなので関数のみ抽出するシェルスクリプト作った。 fflow() { cflow $@ | grep ':$' | sed 's/ <.*//' } やばい。死ねる。 boolって何よ? で、cflowのテストにGNU catのソースを使ってみたら、思わぬ拾い物。 bool ok = true; boolにtrue。なんだコレ? マクロの正体は、 #include <stdbool.h> 調べてみたら、標準Cライブラリの実装 stdbool.hあった。どうやらC99からの新機能らしい
GNUインデント 世の中には様々なインデント方式がある。その中でも最も奇妙なインデント方式がGNUであろうと思う。 最初にGNU方式を目にしたときはハァ?ナンダコレ?などと思ったが、今はそのインデント方式が少し理解できるようになった。 スマートタブ さて、今回はGNUで使われているインデント方式であるスマートタブに変換せよという問題です。 「8個スペースが続いたら、tabに変換する」 という奇妙なインデント方式。tabとスペースを混在させて使っている所がポイント。 今回のソースはGNU方式で書いてみたぞ。 #include <stdio.h> #include <stdlib.h> // #define TAB "\t" // #define TAB ">-------" #define TAB "\033[1;30m>-------\033[0m" int main (void) { i
僕がVimでデバッグするときは、 :!!と、前のコマンド実行をしているんですが、前のコマンドで:「!rm *」なんて事をしていると、ファイルをまるごと消してひどい目にあったりするので、なんか良い手はないかなぁ・・・と思ってたら、「そうだ、マクロがあった!!」 ふふ。便利な技を思いついてしまったので、Vimのマクロをキーボードの記録以外で使ってみようと思う。 マクロの使い方。 マクロの使い方を復習しておこう。 qaiほげほげ<ESC>qqでマクロ開始。次のaはレジスタ名。なんか打って、qで終了。 @a@aで、レジスタにa登録しておいたマクロを開始する。 そう、マクロには「レジスタ」を使うのだ。 :regで確認してほしい。 ってことは、 ソースにデバッグコードを埋め込んでおいて、マクロ実行すればいい!! /* 手抜きcat.c :!gcc -o cat cat.c && ./cat < cat
世界中を飛び回ってみたけど演習1-16は(世界中で?)評判が悪い。問題の意味が全くわからない。 「プログラミング言語C(第2版)」第一章演習の答え を参考に書いた。(ほぼコピペ) バッファがオーバーフローした時は読み飛ばして、1行を取得せよ? int main(void) { int len; int max = 0; char line[MAX_LENGTH]; char longest[MAX_LENGTH]; int c; while ((len = getline(line, MAX_LENGTH)) > 0) { if (len == MAX_LENGTH - 1 && line[len - 1] != '\n') { // オーバーフロー中 while((c = getchar()) != EOF) { len++; if (c == '\n') // ココが正しい位置。 br
ハッカーと画家 オンラインでも読めるけど買ってみた。 ハッカーと画家 コンピュータ時代の創造者たち 作者: ポールグレアム,Paul Graham,川合史朗出版社/メーカー: オーム社発売日: 2005/01/01メディア: 単行本購入: 109人 クリック: 4,884回この商品を含むブログ (582件) を見る 翻訳書なのに、英語のようなリズム感が心地よい。川合氏の素晴らしい翻訳に感動しました。 何かしたくなったら、ナイキのコマーシャルみたいにするんだ「とにかく、やる(Just do it)」 SICPとK&Rを読もう!! 勿論Paul Graham氏もSICPを読んだひとり。ハッカーとSICPにも強い相関関係があるらしい。 原書にリンク張っとこう。 Essays 読みやすい英語。翻訳読んだ後ならなんとか読めそう。 英語の本 長い文章が何故読めないかって?短い文章が読めないからだ。短い
JavaScriptのプロトタイプってこんな感じかなぁと思って、C言語でJavaScript風プロトタイブを再現してみた。 配列だけど。 #include <stdio.h> #include <stdlib.h> struct p2d { double x; double y; double (**prototype)(struct p2d *); }; typedef struct p2d Point2D; typedef double (*Point2D_method)(Point2D *); // メソッド型 enum {GET_X, GET_Y, END}; // 名前テーブル Point2D_method *point2d_prototype; // メソッドの配列としてプロトタイプの内容を宣言 // コンストラクタ Point2D *point2d_new(double x,
まったりとLFS中です。LFSの基本は ダウンロード → 解凍 → コンパイル を繰り返す。つまり、一番使うコマンド郡はwget,tar,make。 今回は、理解の足らないtarついて調べようと思う。 tarとは tarは"Tape ARchive" の略。って、いつの時代から使われているんだ・・・。 元々は、「複数のファイルをまとめて tar 形式というアーカイブファイルにする機能」がメイン。 つまり、catよりちょっと凄い奴。圧縮解凍機能はおまけ。 よく使うコマンド .tar.gzの解凍 % tar xzf hoge.tar.gzこれだけ覚えておけば生きていける。 簡単なオプション x 解凍 c 圧縮 なし .tar z .tar.gzip形式 j .tar.bz2形式 v 詳細オプション有効 f ファイル指定。必ず最後に付ける。必修 manを見ると、 コピペ。 tar <operat
K&R 「K&Rを参照せよ」と、書いてあることが多いので、Cのバイブルと言われるK&Rを買ってみた。 プログラミング言語C 第2版 ANSI規格準拠 作者: B.W.カーニハン,D.M.リッチー,石田晴久出版社/メーカー: 共立出版発売日: 1989/06/15メディア: 単行本購入: 28人 クリック: 721回この商品を含むブログ (199件) を見る 311刷・・・売れすぎ・・・。 バイブルと呼ばれる理由がわからないが、OS自作入門 mallocとK&R mallocの実装がほぼ一緒だったのには驚いた。 練習問題をこなせば、力がつきそうです。 でも、読むならSICPの方がいいと思う。 ゲーム理論 立ち読みで気になった本。 ゲーム理論 (図解雑学) 作者: 渡辺隆裕出版社/メーカー: ナツメ社発売日: 2004/08/01メディア: 単行本購入: 12人 クリック: 70回この商品を含
OSを作りはじめて1年になる。この1年を振り返ってみたい。 葛藤 OSを作りはじめて1年。 この1年間ずっとひとつの葛藤がある。 「遠回りなんじゃないか・・・」 今は「基本を学びたい」という思いからSICPを読んでいる。 かなり遠回りである。 「遠回りが正しい道なのか?」 この1年間の遠回りを検証したいと思う。 1年前の僕 Web屋だった僕はブラウザの中の人だった。 1年前の僕はこうだ。 ポインタ知らない。 アルゴリズム知らない。 データ構造知らない。 アセンブラ知らない。 C言語を知らない。 Linuxコマンドを知らない。 makeなんて聞いたこともなかった。 最新の技術を追いかけ、基本をとことん飛ばしてきた。 基本を飛ばしたことにも気づいていなかった。 そして、一冊の本に出会う。 「OS自作入門」 この本が自分を変えるきっかけになった。 1年前〜半年前 - OS自作入門期 仕事が忙しか
インド数学ドリルより。 「インド人は2桁の掛け算を暗算でこなすことが出来る」 しかし、かなり訓練が必要ということがわかってきた。 78 * 96 の計算をするときは、 70 8 +-----+-+ 90| | | | | | +-----+-+ 6 | | | +-----+-+頭の中に、こんな図を浮かべる。 式に直すと、 78 * 96 = (7 * 9) * 100 + ((9 * 8) + (7 * 6)) * 10 + (8 * 6) = 6300 + (720 + 420) + 48 = 6300 + 1140 + 48 = 7488となる。 暗算しようと思うと、途中の計算結果を頭のスタックの中に貯めておかなければならない。 特に、(9 * 8) + (7 * 6)を一気に計算するあたりは至難の技。 これは相当訓練が必要。 難しいので、1桁*2桁にしてみた。 7 * 28をやろう
Linuxでよく出てくるけど、よくわからない単語をメモっておきます。 invoke (神に)祈る。(精霊を)呼び出す。 派生して、(アプリケーションを)起動する。(関数を)呼び出す。 例) zsh invoked Firefox. zshはFirefoxを呼び出した。 invoke main function. main関数を呼び出す。 祈りながらね。僕等は魔術師だから。 verbose 多弁な, くどい。 つまり、--verboseでよく喋る。詳細表示オプションを有効にする。 名詞は、冗長。"じょうちょう" 冗長化(じょうちょうか) バックアップを取る。予備を用意する。 ネットワークの冗長化 回線を複数用意したりすること。 ストレージの冗長化 バックアップを取ったり、パリティを取ったり。 つまり、障害等に備えて「まわりくどく」、何かを用意すること。 参考 in・voke - goo 辞書
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く