I ♥ WordPress

[時間割:C言語]『はじめてのC言語完全入門』その7
2008/10/15 00:36 posted by kunkichi

連休明けですががんばります。ということで先週〜連休中にかけての分はそのうちアップします。今日は『C言語』。

はじめてのC言語 完全入門 (標準プログラマーズライブラリ)
塚越 一雄
技術評論社
売り上げランキング: 420963


高度な選択文

  • else if、switch、ifのネスト、三項演算子、この辺はほぼ他言語と同じ。
  • 論理演算子のTIPS(というかひねりが効いたやり方)
    #include <stdio.h>
     
    int main()
    {
      int num1, num2;
      
      num1=0;
      num2=0;
      
      printf("整数? ");
      scanf("%d",&num1);
      
      if( num1 && (num2=100) )
        printf("num1=%d, num2=%d \n",num1,num2);
      else
        printf("num1=%d, num2=%d \n",num1,num2);
      
      return 0;
    }
    ./sample
    整数? 0
    num1=0, num2=0
    $ ./sample
    整数? 1
    num1=1, num2=100
    すなわち、&&を使った論理演算子の場合、最初の評価が偽だった場合は二つ目の評価は行わない。これを利用して、最初の評価が真だった場合のみ、代入を行う。
  • ||の場合は逆になり、最初が真だった場合は二つ目の評価を行わずに、最初が偽だった場合のみ、二つ目の評価で代入を行う。#include <stdio.h>
     
    int main()
    {
      int num1, num2;
      
      num1=0;
      num2=0;
      
      printf("整数? ");
      scanf("%d",&num1);
      
      if( num1 || (num2=100) )
        printf("num1=%d, num2=%d \n",num1,num2);
      else
        printf("num1=%d, num2=%d \n",num1,num2);
      
      return 0;
    }
    $ ./sample
    整数? 0
    num1=0, num2=100
    $ ./sample
    整数? 1
    num1=1, num2=0

反復文

  • 代入演算子、インクリメント、デクリメントは全く同じ。
  • while、do〜while、も同じ。do〜whileってあんまり使ったことないのだけど、入力検査に使うのは納得。
  • forも同じやけど、Cの場合、ループ変数の宣言は別途せなあかんと、、、

この辺、目新しいところは特になかったな。まあ初歩レベルってことで。

あやっくす?
2008/10/08 23:38 posted by kunkichi

本屋でこんなの見つけた。

Ajaxセキュリティ
Ajaxセキュリティ
posted with amazlet at 08.10.08
Billy Hoffman Bryan Sullivan
毎日コミュニケーションズ
売り上げランキング: 27811

表紙がw

ajax_security.jpg

どストレートだなぁ、サッカー好きなSEとかプログラマは1回はこれを想像したはずではあるw

9月の時間割達成度レビュー
2008/10/07 21:53 posted by kunkichi

10月に入ったので、先月の時間割の達成度をここでレビューしてみます。

200809jikanwari.jpg

とりあえず飽きっぽい僕にしては、最初としてはまあまあかなぁ、と。でもやってるうちにいろいろと見直さないといけない点や反省が出てきたのでその辺を今後に活かしていかないと。

  • 「絵」の時間に関しては達成率ほぼ撃沈。
    言い訳をしておくと、教科書として選んだ『1分スケッチ』が途中から、ドリルや問題集的に次はここまでやる、っていう雰囲気が少し薄れちゃってて、何を描いたらいいんだろう?、みたいな感じになっちゃったんだよね。気にせず適当に描きたいものを描けばいいんだろうけど、「絵」はまったくの初心者なので、もうちょっと具体的に進めてほしい感じ。教科書を変えてみようかなぁ。
  • 金曜日や祝日はお休み前&お休みなこともあってサボりがちになってしまうので注意しなきゃ。1週空くと結構忘れてしまう。
  • 「読書」の時間は毎日欠かさずやっているので通勤時間は間違いなく有効活用できているのだけど、やっぱりアウトプットが難しい。毎日少しだけアウトプット、読み終わったらまとめてアウトプット、どっちもどっちなんだよなぁ。必然的に銀メダルが多くなってしまう。
  • 全体的にちょっと散漫な印象。もう少し科目は減らした方がいいかも。
  • 月末は、仕事が忙しい&風邪ひいた、のがあってサボり気味になってしまった。継続するためには、体調管理はとても重要。

やっぱりアウトプットが一番難しいかなぁ。勉強している時間よりもアウトプットに費やす時間の方が長くかかる気がする。まあその分、理解力が深まるということなんだけどね。ここはちょっと、金メダルを増やす意味でもやり方を見直そうかなと。

逆に良かった点は以下。

  • 毎日コツコツ努力するのは遠いようでやっぱり一番の近道。毎日少しずつ蓄積していったことが、ある時に「わかった!」と感じる瞬間、実際に役に立ったケースがいくつかあった。
  • いろいろ平行してやるのは、デメリットも感じてるけれど、気分転換ができる点と、プログラミングとかならある程度同じようなことも出てくるので「一般的な理解」ができる点は非常にメリット。
  • 達成率を記録しておくのはいろんな意味でメリット。パッと見で先月の状態がわかるし、反省を次に活かせる。
  • やっぱり銀メダルよりも金メダル。アウトプットへのモチベーションが出た。

少し見直しを考えつつ、今月もまたがんばりたいと思います。

[時間割:C言語]『はじめてのC言語完全入門』その6
2008/10/07 20:54 posted by kunkichi

火曜日は『C言語』です。ちょいご無沙汰でした(^^; がんばります。

入力プログラムの応用

  • 定数はdefineを使う。#define TEISU 400
  • 行の最後までが有効になる。
  • スペースを含んでもOK。
  • 行をまたぐ場合は最後に¥を使う。
  • サンプル:#include <stdio.h>
    #define STR "word and space"
    #define PARAGRAPH "This is test for paragraph.\
    new line"
     
    int main()
    {
     
        printf("%s\n" , STR);
        printf("%s\n" , PARAGRAPH);
        return 0;
    }
    実行結果:$ ./en
    word and space
    This is test for paragraph. new line
  • 定数を置き換えるのはプリプロセッサの地点。gcc -E でプリプロセスだけ行うとよくわかる。$ gcc -E sample.c
    ・・・
    int main()
    {
     
        printf("%s\n" , "word and space");
        printf("%s\n" , "This is test for paragraph. new line");
        return 0;
    }

ifを使った選択文

  • 他言語とほとんど一緒。
  • 代入「式」を条件に使うif( a = 4 )a=4;
    if(a)
    と同じ。

やっと本の半分弱まで来ました。日々の努力が大事です。

[時間割:Perl]『ミニマルPerl』その4
2008/10/06 22:40 posted by kunkichi

風邪も落ち着いたので今週からまたがんばります!月曜日は『Perl』です。次はPerlでいろいろな*grepコマンドの機能を実装しようという話です。

ミニマルPerl Unix/LinuxユーザのためのPerl習得法
Tim Maher
オライリージャパン
売り上げランキング: 96883
  • *grepの代わりにPerlを使うと方言を統一できる。
    • *grepだと特定のメタキャラクタが使えたり使えなかったり(単語境界の¥bとか)
    • *grepごとの正規表現の方言の違いがあったり
  • 制御文字用のエスケープが豊富。
    • *grepだとあったりなかったり
    • タブを表すのに、Ctrl+V+タブとかで実際に打つよりも長い、とか。
    • ¥dとか¥tとかコンパクトに表せる
  • その他の正規表現の方言も考えなくてよい
    • 繰り返し、より便利な後方参照、メタキャラクタ自体のクォート、コメントの挿入、もっと高度なものまで。
  • マッチング機能
    • レコードの単位を段落にしたりファイルにしたり
    • 行をまたいでマッチング
    • バイナリも扱える
    • ディレクトリは自動的に無視
  • 拡張機能
    • マッチした部分を正規表現の外側で参照
    • 出力レコードのセパレータを変更して出力をカスタマイズ
  • マッチ演算子
    • 通常は/〜/で$_に対するマッチング
    • mで始めるとデリミタを変更できる。%をデリミタにすると、m%〜%
    • =~で変数に対するマッチング。もちろんここでもデリミタは変更できる$str =~ /example/$str =~ m|example|
    • 1行だとこんな感じ$ perl -wnl -e '/example/ and print;' /tmp/sample.txt$ cat /tmp/sample.txt | perl -wnl -e '/example/ and print;'
    • -nと-pはディレクトリを無視してくれる。例えば/etc/yum*を参照する場合、$ ls -td /etc/yum*
      drwxr-xr-x 3 root root 4096  7月 20 20:43 /etc/yum
      drwxr-xr-x 2 root root 4096  7月 16 00:46 /etc/yum.repos.d
      -rw-r--r-- 1 root root  346  6月 22 09:35 /etc/yum.conf
      $ perl -wnl -e '/yum/ and print;' /etc/yum*
      cachedir=/var/cache/yum
      logfile=/var/log/yum.log
      # Note: yum-RHN-plugin doesn't honor this.
      # in /etc/yum.repos.d
      ディレクトリは無視してyum.confファイルの中身だけを参照してくれる。
    • シェルだとシングルクォートのネストはできないので、文字列エスケープ(¥047)を使えばOK。Perlでは普通にバックスラッシュでエスケープできるけど、コマンドラインから実行する場合はあくまでもシェルの制約内。

最近は意識して、仕事でもgrepが使えるケースでもPerlで書いてみるようにしてるので大分なれてきたな〜、この調子この調子。

風邪から復活、、、
2008/10/04 00:38 posted by kunkichi

先週末ぐらいから、疲れがちょっと溜まっていたのと、週明けに風邪を引いた、というダブルパンチで少しダウン気味でちょっと時間割サボり気味でした、、、でも一応、通勤時間の「読書」と、水曜日の「サーバ」の時間だけはなんとか続けていたので、その分だけ成果をアップしておきます。

読書その1

覚悟のすすめ (角川oneテーマ21 A 87) (角川oneテーマ21 A 87)
金本 知憲
角川グループパブリッシング
売り上げランキング: 276

読了。まあ「精神論」といっちゃあそれまでなのですが、「覚悟」はやっぱり必要。それ以外にもいくつか「チーム力」とかにも絡みそうなところがあったのでいくつかピックアップ。

  • プロとして100%の責任を全うすることを目指す。90%を目指すと次は80%と妥協してしまう。
  • やってみればできることもある。やる前から「無理だ」と自分で結論を出してしまえばそこまで。「諦めたらそこで試合終了ですよ?」ってやつだな。
  • 良いと思うことは試してみる。「常識」を妄信しない。
  • 可能性がある範囲で、できるだけ高い目標を設定することが、努力するためには必要。
  • 「あいつがやるならおれも」と全員が刺激しあうことで、強いチームになる。
  • 自分からできないのなら無理矢理やらせることも必要。ようは「きっかけ」。それがいつか自分からやることにつながる場合もある。
  • 常に最悪の場合を想定する。そしてそのときにどうするか?何ができるか?が重要。そのために日頃の準備・努力を行う。

単なる精神論だけじゃない、ではない部分もちゃんとあるよね。うんうん。

読書その2

3分間 ネットワーク 基礎講座
網野 衛二
技術評論社
売り上げランキング: 56339
3分間ルーティング基礎講座
網野 衛二
技術評論社
売り上げランキング: 14132

少し前からネットワークの勉強ももっとしないといけないなと思ってたところに、技評のニュースメールで紹介されていたので早速ゲット。いや、amazonの評価通り、良書でした。一通りの基本はきちんと押さえてある上に、とても読みやすい・わかりやすい。早速「ネットワーク」の方は読了して、今「ルーティング」の真ん中ぐらいです。スイッチやルータもわかるようになれば、全体の設計ももっと理解できるようになるしね。そのうち、まとめをアップしたいと思います。

サーバ

20081004069.jpg
20081004064.jpg

うっひっひ、ついに買っちまいました、Sun Fire V120!Sparcマシンですよ!数年前だったら標準価格100万ぐらいだったよねぇ〜。これが5000円で買えちゃうという、ほんとヤフオク様々です。とりあえず、Q6600あたりとパフォーマンス比較してみたい。まああっちはマルチコアなので本来はT1/T2プロセッサ搭載マシンと比較しないといけないのだろうけど、さすがにアレは高すぎる、、、

とりあえず、Solaris10でいろいろとしてます。その辺りはTracにアップ中です。

しっかし、さすがに1Uサーバはうるさい、笑
あ、ちなみに上にあるのはバッファローのL3(!)スイッチです。スイッチも勉強するぞということで。

少し休んだおかげで、疲れも少しとれたし風邪も直ってきたみたいなので、また勉強再開です!

[時間割:Python]『みんなのPython』その6
2008/09/26 02:31 posted by kunkichi

はい、木曜は『Python』です。

先週はちょっとさぼってしまいましたが、実は前にも『はじめてのPython』の時にもあった「リファレンス」がやっぱりちょっとわかりにくかったので、まとめきれませんでした。

ということで、今週もう一度読み直してみたので、まとめてみます。

みんなのPython
みんなのPython
posted with amazlet at 08.08.21
柴田 淳
ソフトバンククリエイティブ
売り上げランキング: 50252


  • Pythonは参照渡しが基本。なので変数はオブジェクト(実体)と結びついている。
  • ただし数値、文字列などの「書き換え不能」なオブジェクトの場合は値渡し。 つまり、リスト、辞書などの「書き換え可能」なオブジェクトはリファレンスとなるので、オブジェクトを呼び出すようなメソッドを使うと、元の変数も変わってしまうので注意。>>> a=[1,2,3,4]
    >>> b=a
    >>> a
    [1, 2, 3, 4]
    >>> b
    [1, 2, 3, 4]
    >>> a.append(5)
    >>> a
    [1, 2, 3, 4, 5]
    >>> b
    [1, 2, 3, 4, 5]
  • これを回避するためには、リストをリテラルで代入するか、リストのコピーを代入する。>>> a=[1,2,3,4]
    >>> b=[1,2,3,4]
    >>> a
    [1, 2, 3, 4]
    >>> b
    [1, 2, 3, 4]
    >>> a.append(5)
    >>> a
    [1, 2, 3, 4, 5]
    >>> b
    [1, 2, 3, 4]
    リストのコピーを作るにはスライスを使う。>>> a=[1,2,3,4]
    >>> b=a[:]
    >>> a
    [1, 2, 3, 4]
    >>> b
    [1, 2, 3, 4]
    >>> a.append(5)
    >>> a
    [1, 2, 3, 4, 5]
    >>> b
    [1, 2, 3, 4]
    辞書の場合はスライスは使えないのでcopyモジュールを使う。>>> a={1:"one",2:"two",3:"three"}
    >>> import copy
    >>> b=copy.copy(a)
    >>> a
    {1: 'one', 2: 'two', 3: 'three'}
    >>> b
    {1: 'one', 2: 'two', 3: 'three'}
    >>> a[4]="four"
    >>> a
    {1: 'one', 2: 'two', 3: 'three', 4: 'four'}
    >>> b
    {1: 'one', 2: 'two', 3: 'three'}
  • copy関数は「浅い」コピー。多次元配列とか書き換え可能なオブジェクトを含む辞書などは「深い」コピー、deepcopy関数を使う。
  • 書き換え可能なオブジェクトを関数の引数として渡して関数内でそれを変更すると、関数の外でもオブジェクトが書き換えられるので注意。>>> def add_str(list):
    ...   list.append('added!')
    ...
    >>> a=[1,2,3,4]
    >>> add_str(a)
    >>> a
    [1, 2, 3, 4, 'added!']
  • 関数の引数デフォルト値に書き換え可能なオブジェクトを指定して関数内でそれを変更しても、デフォルト値の代入は1回しか行われないので注意。関数内の変更だけが繰り返される。>>> def add_str(list=[1,2,3]):
    ...   list.append('added!')
    ...   print list
    ...
    >>> add_str()
    [1, 2, 3, 'added!']
    >>> add_str()
    [1, 2, 3, 'added!', 'added!']
    >>> add_str()
    [1, 2, 3, 'added!', 'added!', 'added!']
    >>> add_str([1,2,3])
    [1, 2, 3, 'added!']
    >>> add_str([1,2,3])
    [1, 2, 3, 'added!']
    >>> add_str([1,2,3])
    [1, 2, 3, 'added!']
    >>> add_str()
    [1, 2, 3, 'added!', 'added!', 'added!', 'added!']

うーん、Perlでも参照渡しとか普通に使うし、Cで言うポインタも最近仕組みがわかってきたので意味は理解できるんやけど、やっぱりちょっと考えないとサッとイメージできないなぁ。ポインタが鬼門と言われるわけだ。

ちょこちょこスクリプト書いて体で覚えないとね。

[時間割:読書] スポーツ本2冊
2008/09/25 00:22 posted by kunkichi

たまにはちょっとコンピュータから離れて少しエンタテイメントな感じのものを、ということで、この前まで読んでいたのと、今日から読み始めたのをご紹介。

戦術に関してはこの本が最高峰―これぞサッカーの「戦術学」全世界30クラブ解体新書
西部 謙司 浅野 賀一
東邦出版
売り上げランキング: 10639

サッカー雑誌とかではおなじみ西部さんによる世界各有名クラブの戦術を紹介した一冊。速攻で読み終わりました。

アフィリエイトのリンクを貼ってて初めて気づいたのだけど、amazonのレビュー軒並み評価低い〜、笑。「内容薄い」とかは、カタログ的にパラパラみるにはそれなりに楽しいと思うし、「間違ってる」とかは、そこまでマニアックではないのでどこが間違ってるのかわかんない、爆。でも読んでて普通に面白い、というか、『Foot!』でビミョーに浮いた発言の多い西部さんの文章は初めて読んだので、印象としては「思ったより書けるんじゃん」と思ってたり、爆。ま、西部さんのなんちゃって戦術本は他にもおもしろい本があるようなので、そっちも見てみたいと思います。FIFA09に備えて予習予習、笑

でもう一冊は今日から読み始めたところで、まだ途中なんだけど、タイトルが前から気になっていた1冊。

覚悟のすすめ (角川oneテーマ21 A 87) (角川oneテーマ21 A 87)
金本 知憲
角川グループパブリッシング
売り上げランキング: 203

タイガースの4番、金本選手の初の自伝的著書。十数年来のカープファンとしては、タイガースで活躍してる金本選手を見るのは非常に複雑な心境ではあるのですが、苦笑、でもカープ時代のこともたくさん書いてあるのでよしとします。

ってかね、これをなんで買ったのか?って、タイトルが全てなんですよ。「覚悟」。もう最近の個人的なテーマになりつつあるけど、最初の何ページか読んで、やっぱり痛感した。

この道でやっていくんだという覚悟。
それがなきゃ向上も成長もない。

この前の伊藤直也さんのジュンク堂セミナーでもあったのだけど、

ものすごく当たり前のことだけど、理想の自分になるために自分に足りないものを考えるとその道の遠さに挫折することの方が多い。でも、「この道で食っていくんだ!」「この世界に何かを残すんだ!」という強い意志と、日々のたゆまぬ努力、この二つがあれば、それは「不可能」ではないんだよね。やっぱり「男気」が大事だと再認識。

これだよ、ほんとうにこれが大事。「精神論」って言っちゃうとアレなんだけどさ、不条理な体力勝負みたいな精神論ではなくて、自分をモチベートするための精神論っていうのかな、それはほんとうに大事。それは野球選手であっても、ITエンジニアであっても、変わらないよね、土俵が違うだけで「プロ」としては同じなのだから。

絶対負けない、諦めない。

[時間割:サーバ]『コンピュータの構成と設計(上)』読了
2008/09/24 23:39 posted by kunkichi

ふぅ〜、ちょっとバタバタしててアウトプットが追いつきません、泣
でもちゃんと勉強はしてます。

水曜日は『サーバ』の時間、ということで、やっと読了しました、パタヘネ本上巻。

コンピュータの構成と設計~ハードウエアとソフトウエアのインタフェース 第3版 (上)
デイビッド・A. パターソン ジョン・L. ヘネシー
日経BP社
売り上げランキング: 9857

いやー、ちょっとさすがにこれは難しかった。

何が難しいかって、

  • 上巻はCPUの実装についてがほとんど。ガチッと「わかった!」っていう感はほとんどなし。せいぜい「な〜んとなくイメージが見えてきたかなぁ〜、、、」っていうレベルが限界です、、、
  • Cのプログラムがコンパイラでアセンブラになる過程、ってアセンブラの一つ一つの命令まで落とされるとさすがに未知の世界。しかもMIPS。2、3章はかなり苦しかった、、、

だもんな〜、くぅ〜、泣

でも、苦しいながらも、非常にためになった箇所もたくさんあって、

  • 半導体が作られる過程って初めて知った!
  • レジスタとかスタックとかヒープとか。CPUとかメモリとかがボトルネックになったような経験はないのだけど、OSの動作原理として、やっぱりこういうデータのやり取りの流れを知るのはほんと楽しい。
  • コンパイラの変換ステップとか最適化の仕組みとか。最適化を進めることで捨てなきゃいけないものが出てくると。
  • 性能評価については、パフォーマンスとか機器増設計画とか、いつも気になっていることに直接関連することなので、考え方はものすごく参考になった。

あたりは非常に面白かった。噂通りの良書でした。もっとスキルあげて、この本をもう一度読んだときに一緒に成長を感じ取れるようにがんばらないと。

引き続き、下巻に移りたいと思います。

コンピュータの構成と設計~ハードウエアとソフトウエアのインタフェース 第3版 (下)
デイビッド・A. パターソン ジョン・L. ヘネシー
日経BP社
売り上げランキング: 15038

[時間割:C言語]『はじめてのC言語完全入門』その5
2008/09/17 23:01 posted by kunkichi

火曜日の『C言語』を忘れてたので今日はがんばります!

12章「書式付き入力(その1)」から。

はじめてのC言語 完全入門 (標準プログラマーズライブラリ)
塚越 一雄
技術評論社
売り上げランキング: 420963


  • scanfで定型フォーマットのデータを標準入力scanf("変換仕様",&変数名)
  • 複数のデータの場合は以下のような感じで空白で区切るとわかりやすい。scanf("%c %d %f",&変数名1,&変数名2,&変数名3)とりあえず、区切りの空白は無視されるものとする。
  • 標準入力に含まれる空白の扱いに注意
    • 空白をフィールドの区切りとする
    • 先頭部分の空白は削除される
    • ただし、文字の場合のみ空白も改行も含まれる形で入力をとる。
  • 変換仕様中の空白は無視されるとしたけど、実際は空白を含めると、入力データの空白を除去したのと同じになる。よって
    • 空白を入力したい場合は文字書式(%c)等の前に空白を入れない。
    • 空白を除去したい場合は文字書式(%c)等の前に空白を入れる。
  • scanfは決まったフォーマットでデータを受けとる前提になっているので、入力エラーに対応できない。ではどうするか?
  • scanfはintを返す。返す値は入力に成功したフィールドの数。これを使えば、エラーチェックができる。int ret;
    ret = scanf( "%d", &arg1 );
    retが1ならOK。0ならNG。でも数値は文字列ともとれるから、単に数値かどうかのチェックしかできない気がする。やっぱり正規表現がいいなぁ、それはまたあとで出てくるのかな?
  • ただし複数フィールドの場合に最初のフィールドでエラーになったらscanfはそこで終わってしまうので、その場合はscanfを複数に分ける。scanf("%d",&argv1);
    scanf("%c",&argv2);
    1行目でエラーになっても2行目のscanfは実行される。
  • EOF(キーボードならCtrl+D)の場合はscanfは-1を返す。
  • 入力フィールドをスキップするには、変換仕様のフォーマットに*を含める。scanf("%d %*d %d", &arg1, &arg3 )この例だと元データの2番目のフィールドはスキップされる。
  • EOF(キーボードならCtrl+D)の場合はscanfは-1を返す。
  • scanfの書式文字列に、変換仕様や空白以外を含めると、その文字列を含めた一連のフォーマット文字列の入力とすることができる。日付とかで便利かも。scanf("%s/%s/%s", &y, &m, &d);
  • scanfの書式文字列に”¥n”を含めると入力が終わらなくなるので注意!

ふぅ〜、とりあえずこれで入出力を両方できるようになりました。でもこれじゃちょっと入力チェックが弱すぎだな〜。もう少し進めば正規表現とかも出てくるのかな?がんばります。

『サーバ』は引き続き↓読んでます。アウトプットがなかなか難しいですが、そのうち。

コンピュータの構成と設計~ハードウエアとソフトウエアのインタフェース 第3版 (上)
デイビッド・A. パターソン ジョン・L. ヘネシー
日経BP社
売り上げランキング: 37621
このページの先頭へ