2012年11月1日

SFカーニバル

http://www.tsogen.co.jp/np/isbn/9784488605032

タイムマシン
笑った笑った
会社の帰りに電車の中で読んでたんですけどあのアホな繰り返しのところで思わず笑っちゃった
なんでバイクにのった狂った猿から逃れるために木の枝に何回も何回も飛び移るのか意味わかんないし、しかも何回も何回も繰り返すからさ
今思い出しても笑える
電車乗ってるから必死でこらえたんですけど笑っちゃった
あー、可笑しかった
ジョーという名のロジック
意味わかんなかったな
でもなんかインターネットのこと言ってるみたいだなと思った
ミュータント
火星人来襲
勘違いものですね
地球に来られるくらいなのに火星人弱いな
SF作家失格
SF作家は基本的に売れっ子じゃないところがリアルだなと思う
結局アレンジするくらいじゃないとSF作家じゃないんだろうな
恐竜パラドックス
女子大生ナンパするのが自分と言うところがいいね
時間移動よりそっちの方に興味津々
ヴァーニスの戦士
宇宙サーカス
ロボット編集者
地球=火星自動販売機

2012年8月25日

JavaScript第6版

第6版が出版されたので読書中
まだ本のはじめのほうの文法のところを読んでいるところですがまあ複雑な文法だなと改めて感じます
Common Lispの単純な簡潔な文法と比べると暗黙的な動作が多くてやたら説明が冗長に感じられます
Common Lispはよく括弧が多くて悲惨とかって言う批判を耳にしますが文法は非常に簡単で覚えることって凄く少ないし暗黙的な動作が少なくて沢山の括弧のおかげで明示的に記せることは利点になっていると思えるくらいだけど
括弧が利点と言うと「またLisp使いが自虐的な寒いギャグを言っておる」と捉えられがちですがやっぱり全然そんなことないと思う
計算の優先順位があったり右に結合するやらブロックがどうとか、そういうことがあるととにかく鬱陶しいと思うのだけど
覚えるのも癪に障るがCommon Lispほど余計な気遣い一切無くプログラミングに集中しやすい言語はないんじゃないのかと思えてくるよね
JavaScriptはなかなか素晴らしい言語だと思ってるんだけどやっぱりこの基本的な文法とかルールがかったるいな
しょうがないけどもったいないな

2012年6月23日

Haskell難しい

すごいHaskellたのしく学ぼう!
ですが第11章難しい
なに言ってるんだかさっぱりわからん
嫌になってきた

2012年6月18日

Haskellでcode jamに挑戦

2012年の予選問題
Problem C. Recycled Numbers

出題範囲の数を全部列挙して、それぞれrecycled numberを作り出して出題範囲に収まっているかどうか調べてからrecycled numberだけを畳み込んで数える

import Data.List

toInteger' s = read s :: Integer

rotate lower upper n = let f1 n = n `div` 10
      f2 n = (n `mod` 10) * 10 ^ (digitcount - 1)
      f3 n = f1 n + f2 n
      digitcount = length $ show n
      rec _ 0 r = length (filter (\x -> x >= lower && x <= upper) $ Data.List.nub r) - 1
      rec n d r = rec (f3 n) (d - 1) ((f3 n) : r)
      in rec n (digitcount - 1) (n:[])

scan lower upper = (foldl' (\acc x -> acc + (rotate lower upper x)) 0 [lower..upper]) `div` 2

compute s = let f = map (toInteger') (words s)
  in scan (head f) (last f)

main = do
 line <- getLine
 contents <- getContents
 putStrLn $ unlines $ map (\(i, line) -> "Case #" ++ show i ++ ": " ++ show (compute line)) $ zip [1..] $ lines contents

Haskellの注意点

Haskellは割り算を/(スラッシュ)でやってしまうとえらいことになってしまう
/(スラッシュ)じゃなくてdivが用意されているから気をつけないといけない

2012年6月5日

すごいHaskellたのしく学ぼう!読書感想

「すごいHaskellたのしく学ぼう!」を読みながらHaskell修行中
Haskellの楽しいところは非正格評価で必要になるまで評価されない点だと思う
整数配列が[1..]と書けるところが素晴らしい
あとは他の言語でもあるのだけどリスト内包表記だね
これがあると繰り返していちいちリスト作るのが面倒で仕方が無くなる
この本に載っている直角三角形を求める例も素晴らしい例だと思う
ワンライナーだけど全然読みづらくなくて逆に直感的で分かりやすい記述だと思う

Haskellは型推論がしっかりしてるから普通でいきなりジェネリックなところも素晴らしいですね
結局型宣言書くことになるのだけど実際のプログラム自体に余計な記述が入り込まないから簡潔になっていいですね
Common Lispは大好きでたいへん尊敬しているのですが動的型付はどうも性に合わないんですよね
静的型付のほうがしっくりくるので型推論は非常に嬉しいです

でもなんだかんだいっても結局Haskellの魅力は関数の構文の素晴らしさですね
パターンマッチ、ガード、where、let、caseとあって手続き型だと結局ifかswitch程度しかなくてなんとも貧弱なのですがHaskellはやっぱりこの辺りが洗練されているなと思います

次に続くのが超目玉のカリー化だったり部分適応だったりで
これらを駆使してmapやfoldを利用するために関数合成、$での関数適用でソースを読みやすくして
ポイントフリースタイルでさらに関数合成を洗練させられる
まあ当然ラムダも素晴らしいんですけどね

とりあえず5章まで読んだんですけどここまででもHaskellの素晴らしさ魅力はあふれんばかりだと思います
この本はモナドやIOがなかなか登場しないですね

まあなんにしても5章まででも十分すぎるほど読む価値あると思います

この本は関数型について学びたい人には向いてないかな
Haskellを使えるようになりたい人には向いていると思います
関数型についてだったらF#やOCamlの本の方がいいんじゃないかな

2012年6月2日

読書感想

「プログラミングClojure」を読んであらためてCommon Lispの素晴らしさがわかったような気がします
Clojureの本なんですけどこの本に書いてあることはCommon Lispで全てできる
Common Lispのパワーを改めて感じられました
やっぱりCommon Lispすげーや
Clojureって言っても、Common Lispのマクロ拡張セットじゃないかなと

LET OVER LAMBDA
この本は何回読んでも難しい
全然理解できない
意味わかんないと言うか頭がついていかない
実際コード入力してやってみても意味わかんないし
とにかく難しい
前回読んだときより多少理解できるようになってきてるのでまた一年後くらいに読むことになるのだけどその時はもう少しわかるようになっているかな

「すごいHaskellたのしく学ぼう!」
Haskellの本は4冊目くらいかな
一向にできるようにならないですね
関数のCase、ガード、whereが上手く使いこなせない気がします
このあたりは練習あるのみではないかなと

「ドメイン特化言語」
マーチン・ファウラー著の本が近所の普通の本屋で売ってたので思わず買ってしまった
なんでこんな本仕入れたのかまったく理解できないですね
今日買いました

2012年4月30日

コンピュータの構成と設計

通称「パタヘネ」を読んでいます
内容の半分くらいは大学で習ったことで、あとの半分は薄々知ってはいたけど本当はどうなっているか想像でしか知らなかったことですね
内容は低レベルな話でプログラム格納方式のコンピュータがどうやって計算を行っているかの話
MIPSの命令セットを例としてC言語のプログラムがどうやってマシン語になるかとか、コンパイルする際の最適化についても記述されています
今の時代(2012年)はもうこんな最適化はやらないけど知識として知っているといいプログラムが書けるようになると思います
スタックの説明、リンカの説明がもう少し詳しくてもいいかなと思いました

まあそれにしてもこの本に載っているようなことを誰かが考えてくれたおかげでコンピュータが簡単に利用できるようになってるってことに感謝ですよね

2012年4月26日

驚きの連続

驚きと言うかここまでくると逆に呆れてしまうほどにマクロはスゴイ
すがすがしいですね
なんか手品でも見ているよう
コードの魔術師って感じですね
やってることって全然簡単というか初歩も初歩関数呼び出すだけだったり制御構造の条件分岐だったりするだけなのにこの力の差を見せつけられた感じはなんなんだろうか
プログラミング言語は最初にCommon Lisp習うのがいいんじゃないのかな?
C言語習うより身になるんじゃないのかなと思う
Common Lisp習いたかったよ
FortranやBasicなんかやってる場合じゃないよね

2012年4月25日

マクロは

On Lispを読んでいるんですけど、この本に載っているマクロはどれも短いものばかりで単純なプログラムとしてみるだけだとなんてことないような気がするのだけどやっぱり難しい。
コンパイル時に置き換えられた後の形を思い浮かべてさらに実行時にどうやって実行されるか考えないといけないので負担が多すぎる。
慣れてくると、一歩すすむと、このコンパイル時と実行時の挙動の理解があっさりできるようになるのだろうか?
ポールグレハム級になってくるとマクロも空気のような存在になっているのか不思議でしょうがない。
でも普通の人、プログラムとか全然やったこと無い人にとっては普通のプログラムでも理解するのが難儀なので俺もそのうちマクロが難なく理解できるようになる日がやってくるのだろうか。
マクロをいちいち理解しようとすると全然読み進まないです。
On Lispに載っている例はマクロじゃなければ、全てのプログラムはすごく簡単なものばかりなのだけどマクロになると途端に抽象度が上がって難易度がグンと跳ね上がるな。

「マクロを定義するマクロ」なんて正直、もうついていけないのだけど。
落ち着いて一つ一つ分解していけばなんとかなるけどメチャクチャ時間がかかるのだよね。
難しい。

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++なんだから入れなくてもいいような気がするんだけど
この章は一般教養のようなものでしょうね