2012年3月30日

夢か

漠然とだけど、好きなプログラミング言語使って好きなように自由にプログラムが作ることかな
GUIで無い、サーバーで動くようなものやライブラリなんか作りたいね
SQLを使わなくてもよくて、別にRDBとかとやり取りをしないものとかいいね
RDBとかSQLにはなんか嫌われてる気がするから
やっぱりGUIでもいいや、GUI楽しいもんね
なんか便利なライブラリとかあるんだったらGUIでもいいね
.NET Frameworkだとライブラリとしては少し物足りないけど
WPFとかどうなんだろうか、まあいいや
誰にでも動かせるように実行環境に制限があるようなものじゃなくてこっちで環境を指定できるようなものとかいいね
PHPしか動かないからPHPで作るとか最悪、吐き気モヨオス、ゲロゲロ
そうなるとJavaScriptで全部ダウンロードしてもらうことになるとできそうだな
一番現実味がありそうだな
だけどなるべくなら静的に型付けされている言語の方がいいような気がするんだけど
今まで動的型付けの言語で本格的に開発したことないから良く分からないんだよね
他には要求とかイチイチ考えなくてもいい、これ作れって指示されてそれを作るだけ
黙々とプログラム書くだけ
要求仕様を考えなくてよくてプログラムのことだけ考えればいい
どんなもん作るかは勝手に考えてくれてその機能を実現するだけ
使い方を俺に決めさせたら俺が一番使いやすい物になるに決まってるじゃんか
少し具体的に言うとHaskellでなにか作るってのが理想に近いんじゃないかなと思う
本当はCommon Lisp使いたいのだけど少し不安
Common Lispはとても魅力的だけど理想状態を考えるとHaskellの方が理想に近そう
あるいはErlangでもいいかな
なんか面白そうなプログラミング言語使って好きなようにプログラムできるんだったらなんか良さそうだなと思う
それが具体的になんなのかさっぱり分からないけど
エディタなんかもいいかもね
でもエディタだったらVimがあるからな
なんか楽しそうな案件ないかな

2012年3月26日

Google Code Jam練習問題

2011の予選問題に挑戦

Problem C.

相変わらず問題の意味は良く分からないですがとりあえずxorすればいいのかなってことで解きました
xorでまとめただけです


(defun compute (lst)
  (if (zerop (reduce #'logxor lst))
    (reduce #'+ (cdr (sort lst #'<)))
    "NO"))

(dotimes (i (read))
  (let ((r nil))
    (dotimes (j (read))
      (setf r (cons (read) r)))
    (format t "Case #~A: ~A~%" (1+ i) (compute (nreverse r)))))

2012年3月22日

Google Code Jam練習問題

Google Code Jam 2012のエントリー受付中なので早速登録しました
Lisper目指してますので回答はCommon Lispで挑戦していきます
事前準備と言うことで練習問題に挑戦しました

2011の予選問題に挑戦

Problem A.
は問題のまま素直にプログラム組むとターンで繰り返すようになりますが、そうすると遅そうなので距離をまとめて引き算して次のスイッチの距離までを一気に計算するようにしました
BなのかOなのかの判断がイマイチ野暮ったい回りくどい記述になっているなと思います
この辺りをなんとかするともう少しスッキリしたものになるんじゃないかなと

(defun operate (input)
  (labels ((getrobot (lst) (car (car lst)))
    (getdistance (lst) (cdr (car lst)))
    (getnextpos (robot lst) (if (assoc robot lst) (cdr (assoc robot lst)) 0))
    (getdiff (pos lst) (abs (- pos (getdistance lst))))
    (getpos (pos target dist)
     (cond ((< pos target) (if (< (+ pos dist) target) (+ pos dist) target))
    (t (if (< (- pos dist) target) target (- pos dist)))))
    (rec (lst bpos opos turn)
  (cond ((null (cdr lst))
         (if (eq 'b (getrobot lst))
    (+ turn (getdiff bpos lst))
    (+ turn (getdiff opos lst))
    ))
        ((eq 'b (getrobot lst))
         (let ((diff (getdiff bpos lst)))
    (rec (cdr lst) (getdistance lst) (getpos opos (getnextpos 'o lst) (1+ diff)) (1+ (+ turn diff)))))
        (t
   (let ((diff (getdiff opos lst)))
     (rec (cdr lst) (getpos bpos (getnextpos 'b lst) (1+ diff)) (getdistance lst) (1+ (+ turn diff)))))
        )
  )
    )
    (rec input 1 1 1)
    )
  )

(dotimes (i (read) i)
  (let ((r nil))
    (dotimes (j (read) j)
      (setf r (cons (cons (read) (read)) r)))
    (format t "Case #~A: ~A~%" (1+ i) (operate (nreverse r)))))


Problem B.
は問題の意味が分からない
英語が辛いです

2012年1月17日

ストラウストラップのプログラミング入門を読み終えて

すごく時間かけて全部読みきったのですけど感想について

すごく細かく丁寧に書かれている本
心構えや姿勢みたいなものまで触れている
内容は本当に入門だから、これを読み終えても他にもいろいろ勉強しないとプログラム書けるようにはならない

この本は本当に入門に適しているかと問われると疑問が残ると思います
覚悟ができていないとこれだけの量を読むことは難しいと思うからです
覚悟ができている人には適しているでしょうね
だけどこの本を読んでもC++の良さについてはあまり学べないような気がしますが、それはやっぱり他の言語を使ってみて分かることだと思うので

メタプログラミングの説明が無いですね
無くて正解だと思いますけどね
テンプレートの説明のついでにメタプログラミングについてさらっと触れられているのかと思ったけどそんなことなかったなあ

一番面白かったところは言語の紹介の22章かな
だったら別にC++の本じゃなくてもいいじゃないかって感じですね

2012年1月3日

27章

C言語について
C++プログラマがC言語を利用しなければならない機会は必ず訪れるそうなのでC言語の注意点について

26章

テストについて
どうやってテストを進めていくか
なにをテストしないといけないか
どうやってテストするか
テストしやすいプログラムの作り方

2012年1月2日

25章

組み込みシステムプログラミグについて
オープンな環境ではなくて特殊だったり閉じた世界でのプログラミングについての注意点
例えばヒープが利用できない環境でvectorを利用したい場合どうするか
ものすごく低レベルなプログラムについて
ビット演算などとコーディング標準について

2012年1月1日

24章

数値の桁数、オーバーフロー、アンダーフロー、切捨てなど
コンピュータが扱う整数と実数の間での差について
記憶領域のサイズや誤差について
行列計算を連立一次方程式と解きながら実践する
あと乱数や三角関数などの一般的な数学関数について

23章

テキスト操作について
C++にはstringが用意されているのでテキストは比較的容易に扱えるようになっています
その説明と正規表現について
テキスト処理と言えば正規表現なのですがC++の入門書で正規表現について記述があるものは珍しいと思うのですが知っていると非常に有利だと思うのでC++の範囲から外にでるけどきちんと習得しておくことをオススメします

22章

歴史ですね
黎明期に利用された、あるいは現在のプログラミング言語に影響を与えたようなプログラミング言語についての解説
C++が入っているのが笑える
この本がC++なんだから入れなくてもいいような気がするんだけど
この章は一般教養のようなものでしょうね

2011年12月31日

HP 35s

Common Lisp脳を鍛えるために役立つかどうか半信半疑ですが、逆ポーランド電卓買いました
HP 35s
後置演算対応の電卓です
Common Lispは前置だから完全に一致しているわけではないのですが、中置よりは全然力になるかなと思いました
と、言うのは購入に対する言い訳で、昔会社の人と休みの日にサッカーしてた時期がありましてですね、せっかくなんでサッカー好きな友達を誘って一緒にやろうぜって誘ったんですけどその友達は確か結局1回か2回しかサッカーしなかったんですよね
結局スパイクが欲しくて、当時ベッカム全盛期だったのですけどその友達はベッカムモデルのアディダスのスパイクが欲しかった
ただサッカーしないのにスパイクだけ買うってのがどうもなっとくいかなかったみたいでそこで俺がサッカー誘ったからこりゃ絶好の機会だねってことで早速スパイク買ってましたよ
サッカーするんだからスパイクなかったら話にならないってことでスパイク買ってた
HPの逆ポーランド電卓かったのも完全に欲しかったからなだけで、Common Lisp脳を鍛えるなんてのは購入に対する言い訳でしかないのですけどね

2011年12月30日

21章

STLアルゴリズムについて
と言っても一般的なアルゴリズムの解説ではなくてコンテナやイテレータを利用してSTLでどうやって汎用性のあるアルゴリズムを提供しているかについて
また、STLアルゴリズムの利用方法について
コンテナを選ぶときの基準
STLって不慣れな人にはすごく利用しづらいものだと思うので、例えばテンプレートとか引数とか一目見ただけだとなんのことなのか良く分からないと思うのでそれらの解説
アルゴリズムを利用する際の要になる関数オブジェクトについての説明、使い方
昔、関数オブジェクト全然理解できなかったのだよねってことを思い出しながら読みました
コンテナ、イテレータ、アルゴリズムが独立しているこのSTLの概念に触れるたびにすごいなと関心しっぱなしです、本当にスゴイと思う

20章

コンテナとイテレータについてとそれぞれの内部のカラクリに関して
それぞれがどうなっているか、どういった機能が必要でそれを実現する方法について
色々なコンテナ、イテレータを区別しないで利用できる利点、必要性に関して

2011年12月24日

19章

やっとテンプレートの説明登場。
待ってましたと言った感じです。
アロケータとかでてきましたね。
なんか一気にレベルが上がった気がするのですが。
テンプレートの登場で一気に抽象度が上がったように感じるな。
面白くなってきましたね。
アロケーターについて説明があってやっと意味が分かった。
意味と言うか存在理由というか、なんのためにこれがあるのか不思議だったので。

18章

コンストラクタについて。
コピーコンストラクタ、代入の意味や扱い方について。
浅いコピー、深いコピー。
浅いコピー、深いコピーについはクラスを扱う上では絶対必要になる。
クラスにどんなコンストラクタ、デストラクタが必要かのヒント。
あとは構文の見た目が自然になるように演算子オーバーロードについて。
配列についての考察とポインタとの関連。
値渡し、参照渡し、ポインタ渡しについて。
ポインタの問題点、注意点が詳しく記述されているので特に注意しておくといいと思う。

17章

vectorを作りつつ色々学ぼうということ。
vectorと配列の違いやポインタについて。
アドレスとかデリファレンスの説明やなんでそんなもんがあるのかなど。
この説明がやっと登場するあたりさすがC++って感じですね。
このポインタやアドレスの説明読むとまあしょうがないそりゃそうだと思えるのだけど世間でよく言うように普通に挫折してそしてPHPやらなんやらで満足することになるのだろうな。
確かに初学者がこれ読んで「なるほど面白い」と思えるかと言うと素直にそうは思えないですがこれは非常に重要なことなので是非この難関を突破して欲しいところですね。
そしてクラスの説明もやっと登場。
とてもとても初歩的なクラスの説明だけど基本は大事だからしっかり身につけたいところ。

2011年11月13日

16章

GUIについて。
あるいはWindowシステムかな。
ユーザーとの対話に利用するボタンやテキストの入出力をGUIでどうやって行うか。
前章まではプログラマが一方的に実行するだけだったものをユーザーとやりとりしてその変化を画面に表示させる方法。

15章

いままでの説明から実際にグラフを描画するための注意点のまとめ。
グラフの生成に関してなにに注意してどうやって描画するかの手順。

14章

仮想関数とかオーバーライドを解説してある。
ここはいっきに難しくなっている。
抽象化とかについて。
仮想関数の実現方法なんかいきなり言われてもピンとこないだろうけど説明は必要だと思うのでちょっと難しくなっているのはしょうがないかな。
話がグラフィックから離れ気味でクラスについての説明、オブジェクト指向の考え方についてになっている。

p.453の
「言語の達人になることはお勧めしない。」
はなかなか感慨深いお言葉だと思います。

13章

グラフィッククラスの説明。
ついでに継承とか階層について。
継承関係の説明でグラフィッククラスを例にしている点は非常に理にかなっていると思う。
各クラスの関係性が割りと理解しやすいと思うので。