Googleの各種サービスの状態を一覧。
詳しくはSlashdot。
書籍、Webサイト | web版 |
計算機プログラムの構造と解釈 | Structure and Interpretation of Computter Programs |
The Little Schemer | Google Books - The Little Schemer |
The Seasoned Schemer | Google Books - The Seasoned Schemer |
プログラミングGauche | Google Books - プログラミングGauche Gaucheプログラミング(立読み版) |
初めてのRuby | Google Books - 初めてのRuby |
JavaScript第5版 | Google Books - JavaScript第5版 |
Joel on Software | Joel on Software |
Practical Common Lisp | |
Real World Haskell | |
Let Over Lambda—50 Years of Lisp |
その他
ハッカーと画家 | プロジェクト杉田玄白 ハッカーと画家に収録されている話が多数掲載されている。 ただし、他にたくさんの翻訳物が掲載されている。 例)、『聖書』、『独立宣言』、『マッチ売りの少女』、『不思議の国のアリス』、『The GNU Project』、『劣化ウラン:原因、被曝および健康への影響 ――概要―― 』、『ヴェニスの商人』 |
Fine Software Writings | Fine Software Writings ソフトウェア開発に関する文章の翻訳 たとえば「FizzBuzz」の騒動の火種になった「どうしてプログラマに・・・プログラムが書けないのか?」など |
青空文庫 | 青空文庫 この辺を参考に? 青空文庫 アクセスランキング 一太郎で「青空文庫」ダウンロード・ランキング -ALL- 青空文庫で読めるオススメ |
リレーショナルデータベースの世界 | リレーショナルデータベースの世界 例)、SQL For Practitioners、CASE式のススメ、SQLプログラミング作法、3値論理――神のいない論理 |
Google ブック検索ってどうなるんだろうね。
ようやく購入できました。
The Little Schemer posted with amazlet at 09.02.28 Daniel P. Friedman Matthias Felleisen Mit Pr 売り上げランキング: 19756 おすすめ度の平均: 小さなScheme処理系で学ぶ数学基礎理論 Schemeが好きになります 英語であるのが苦痛にならない楽しさ 面白いスタイル |
どうやらScheme初学者にはかなりオススメらしい。
どうやら「Scheme(スキーム)手習い―直感で学ぶLisp」というのが邦訳らしいが、絶版とのこと。それならということで、amazonで購入しようと思いましたが、出品者が国外ばかりで、よくわかりませんでしが。
ということで、今回は「紀伊国屋書店BookWeb」で購入しました。購入手順がとてもわかりやすくて好感が持てました。海外への発注ということで、注文から2週間かかって手元に到着しました。
SICP(計算機プログラムの構造と解釈)を読むために、「プログラミングGauche」と「The Little Schemer」を購入しましたwんで、このブログはSICPとGaucheの学習履歴的な記事が多いし、今後も多くなると思われます。The Little Schemer関連の記事も。
プログラミングGauche posted with amazlet at 09.02.28 Kahuaプロジェクト オライリージャパン 売り上げランキング: 135232 おすすめ度の平均: 日本が米国に先行している稀な事例 |
計算機プログラムの構造と解釈 posted with amazlet at 09.02.28 ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン ピアソンエデュケーション 売り上げランキング: 10647 おすすめ度の平均: 訳が酷い 紙と鉛筆と計算機と 内容最高。翻訳最低。 食わず嫌いでした。 プログラマにとって必読の本です |
@Rem IPON.bat @Rem 会社用 netsh interface ip set address "ローカル エリア接続" static 192.168.1.215 255.255.255.0 192.168.1.254 none netsh interface ip set dns "ローカル エリア接続" static 192.168.1.254 |
@Rem IPOFF.bat @Rem 家 netsh interface ip set address "ローカル エリア接続" dhcp netsh interface ip set dns "ローカル エリア接続" dhcp |
@Echo Off Echo --------------------------------------------------- Echo --- Change Network Config --- Echo --- 2009/02/26 valvallow --- Echo --------------------------------------------------- :TOP Echo. Set AREA="ローカル エリア接続" Set line=--------------------------------------------------- IPConfig | Find ". : " Echo. :Menu Echo %line% Set /p m="* Select memu 0:? / 1:on / 2:off / 3:end * " If %m%==0 (GoTo HELP) If %m%==1 (GoTo IP_ON_CONFIG) If %m%==2 (GoTo EXEC_OFF) If %m%==3 (GoTo END) ELSE (GoTo END) :IP_ON_CONFIG Echo %line% Set /p m="* 0:input / 1:default * " If %m%==0 (GoTo INPUT) If %m%==1 (GoTo DEFAULT) ELSE (GoTo END) :DEFAULT Set IP=192.168.1.215 Set SubNetMask=255.255.255.0 Set DefaultGateway=192.168.1.254 Set DNS=192.168.1.254 GoTo EXEC_ON :INPUT Echo %line% Set /p IP="IP Address = " Set /p SubNetMask="Sub Net Mask = " Set /p DefaultGateway="Default Gateway =" Set /p DNS="DNS = " GoTo EXEC_ON :EXEC_ON Echo %line% Echo AREA=%AREA% Echo IP=%IP% Echo SubNetMask=%SubNetMask% Echo DefaultGateway=%DefaultGateway% Echo DNS=%DNS% Echo %line% Echo now setting.... Netsh Interface IP Set Address %AREA% static %IP% %SubNetMask% %DefaultGateway% none Netsh Interface IP Set DNS %AREA% static %DNS% Echo %line% IPConfig | Find ". : " GoTo END :EXEC_OFF Echo %line% Echo AREA=%AREA% Echo IP="" Echo SubNetMask="" Echo DefaultGateway="" Echo DNS="" Echo %line% Echo now setting.... Netsh Interface IP Set Address %AREA% dhcp Netsh Interface IP Set DNS %AREA% dhcp Echo %line% IPConfig | Find ". : " GoTo END :HELP Echo %line% Echo "Help" Echo 0:? Call Help Echo 1:on Network Configs ON (Input or Default Values) Echo 2:off Network Configs OFF (To Empty) Echo 3:end Exit this bat GoTo Menu :END Echo %line% Set /p continue="* Exit or Continue? e/c * " If %continue%==c (GoTo Menu) Set AREA="" Set IP="" Set SubNetMask="" Set DefaultGateway="" Set DNS="" Set continue="" Set line="" Set m="" :EOF |
Setで変数に値をセット。 |
Set hoge="hoge" Set moge=1 |
変数を使用する際は%で囲む。 |
Echo %hoge% |
実行するとコンソールにhogeってでます。 |
コメント |
Rem コメント |
出力 |
Rem コンソールに出力 Echo Hello, worlld !! Rem 指定したテキストに出力 Echo Hello, world !! > C:\log.log Rem 指定したテキストに追記 Echo Hello, world !! >> C:\log.log Rem どこにも出力しない Echo Hello, world !! > nul Rem 改行 Echo. |
条件分岐 ()で囲めば複数のコマンド可 |
If %m%==3 (GoTo END) ELSE (GoTo END) |
入力を変数に受け取る Set /p 変数 |
Set /p m="* Select memu 0:? / 1:on / 2:off / 3:end * " |
パイプ(コマンドの出力を次のコマンドに渡す) |
Rem IPConfigの結果から". : "という文字列がある行だけ出力 IPConfig | Find ". : " |
ラベル (GoTo ラベル名 でジャンプ) |
:DEFAULT |
今日の日付が取れます。 下記の結果は20090227 |
Echo %date:/=% |
forループもあります。 下記の例だと192.168.1.1 ~ 192.168.1.254までのIPアドレスにpingを打ちます(笑)ping結果はIP.txtに保存されます。意外に結構役に立つ。 |
for /L %%f in (1,1,254) do ping -n 1 -w 50 192.168.1.%%f >>IP.txt |
SQLServerが入ってれば・・・ クエリ発行バッチとか作れたりします。 |
@SET /p SERVERNAME="サーバー名→" @SET /p DBNAME="データベース名→" @SET /p USERNAME="ユーザー名" @SET /p PASSWORD="パスワード→" @SET Q="DELETE FROM HogeTable" @osql -U%USERNAME% -P%PASSWORD% -S%SERVERNAME% -d%DBNAME% -Q%Q% |
もちろんSELECTも可。結果がコンソールに表示される。 |
@SET /p SERVERNAME="サーバー名→" @SET /p DBNAME="データベース名→" @SET /p USERNAME="ユーザー名" @SET /p PASSWORD="パスワード→" @SET Q="SELECT * FROM HogeTable" @osql -U%USERNAME% -P%PASSWORD% -S%SERVERNAME% -d%DBNAME% -Q%Q% |
Pathに探したいディレクトリのパス、eに拡張子を入れると、ヒットしたファイルがコンソールに一覧され、冗長ですが、ログファイルにも同じだけループして結果を書き出します。(再帰探索はしません) ポイントはログ名。「%~n0」で実行されている自分自身の名前を取れます。 |
@Set /p d="Path : " @Set /p e="Extention : " @Echo --------------------------------------------------- @for %%a in (%d%\*%e%) do @echo %%a @for %%a in (%d%\*%e%) do @echo %%a >>%~n0.log @Echo --------------------------------------------------- @Echo ----- Press any key to exit ----- @pause > nul |
netsh interface ipコマンドでIPアドレスを設定する http://itpro.nikkeibp.co.jp/article/COLUMN/20060809/245476/ 持ち歩いているノート PC で簡単に TCP/IP の設定を変えたい http://www.monyo.com/technical/windows/26.html Rem ローカルエリア接続設定切替え用スクリプト(Windows2000/XP) http://www.bais.chubu.ac.jp/~tatsuoka/apnet21/page2.html |
追記: タイトルを「オブジェクト指向(OOP)を習得するために必要なこと」 改め 「私の静的型付けクラスベース OOP の理解を助けたもの」すればよかったなーという話です。 参考:
ところで、やっぱ追記は最後に書くべき? |
さらに追記: 中の人がどう思っているかと,外からどう思われているか
|
以下当初の本文:
オブジェクト指向プログラミング(Object Oriented Programming)以下OOP
OOPを習得するには、OOPの三本柱を理解する必要があります。
恐らく、最も難解なのがポリモーフィズムではないでしょうか。
「ポリモーフィズム(多態性)」という名称からして高圧的です。
イメージの沸きようがなく、とっつきにくく、敬遠したくなります。
ポリモーフィズムを理解するにはAbstractクラス(抽象クラス)やinterface(インターフェース)の機能と役割を十分に理解する必要があります。
これらについて理解するのに特に有効なのが「デザインパターン」を学ぶことです。
OOPを理解する道程は長いかもしれません。
ここは一つ、取っ掛かりとして「抽象クラス」について学習してみてはいかがでしょうか。
デザインパターン紹介―GoF以外のパターンを紹介します―Abstract Classパターン |
興味が沸いたら、上記ページの書籍(増補改訂版JAVA言語で学ぶデザインパターン入門)が最高の(良)入門書としておすすめです。
各デザインパターンの具体的な説明に簡潔なコード。付加的な情報も豊富です。
Javaの経験がなくてもまったく問題なく読めると言い切れます。
以下余談:
これらは主にJavaやC#などの静的で型付けの強いクラスベースのOOP言語に言えることだと思います。
JavaScriptのようなプロトタイプベースの言語や、P言語系(PythonやRubyなど)ではまた違った話かもしれません。
私のようなOOP初学者がOOPを語るのも大変恐縮なのですが、他の初学者の方々の一助になれば幸いです。OOPの習得ってすごく難しいと思うんです。少なくとも私は「そういうことか!」と思えるまでに大変長い時間を要しました。
プログラミングができる人と、そうでない人との間には途轍もなく深い溝があるという話があります(プログラマの壁)。「できない」から「できる」に遷移する時には、「ちんぷんかんぷん」から「突然世界がひらける」衝撃的な瞬間を経験します。私はそういうタイプでした。もちろんその先にはまた広大で途方もない「先」があるのですが・・・。
少し話が逸れましたが、OOPの習得にも同じように大きなパラダイムシフトが発生するのではないかと私は感じました。それを引き起こしてくれたのが、この本だったというわけです。
最後に、偶然にも今まで参考にしたサイト、読み漁った記事のURLを保存してましたので、ある程度絞り込んで示します。
(AOPとかDIとかも混ざってますが)
参考:
Meadowって「メドウ」って読むらしいですね。「ミードウ」って読んでました。
ところで、M-x tetrisってコマンドたたいてください。
Emacsでゲームもする
;; .emacsファイルに追加する設定 (load "quack") (setq quack-pretty-lambda-p t) |
(load "unparen") |
;;; ツールバーを非表示 ;; M-x tool-bar-mode で表示非表示を切り替えられる (tool-bar-mode -1) |
(setq inhibit-startup-message t) |
(scheme-other-window) |
「プログラミングGauche」P.75~76 構文の拡張とマクロ
取り合えず「quate」がまだ正式に出てきてない段階なので「quate」「'」があまりよくわからないので少し試し書き。
evalとか試してみた。引数が2つ必要みたいだけど、何を渡したらいいのか調べず、取り合えず'()を渡したら動いたので続行。
;; (define double (lambda (x)(* x x))) -> (define (double x)(* x x))
exp
(eval exp '())
double
(double 5)
(define double 1)
exp |
'(define double (lambda (x)(* x x)))に対してのcarとcdrの動作を確認してみる。
;; (define double (lambda (x)(* x x))) -> (define (double x)(* x x)) |
ようやく本題。lambda記法をmit記法に変換。コメントのために少しインデントを崩してます。
;; (define double (lambda (x)(* x x)))
(lambda->mit exp)
(define a (lambda->mit exp))
(eval a '())
(double 3) |
「プログラミングGauche」P.75 ~ 76 構文の拡張とマクロ
こうして考えるとLisp自身を使って構文を追加できそうに思えてきませんか。 |
思えてきます!
ほぼ写経ですが。手続きの名前は好みで変えました。本ではmit-form->primitive-form。
「'(define (double x)(* x x))」を「(define double (lambda (x) (* x x))」に変換するmit->lambda手続き。
(define (mit->lambda exp) |
コメント付けてみた。MeadowでM-;が便利。
;; mit -> lambda
(mit->lambda '(define (double x)(* x x))) |
「すべてがリスト」ってのはホンマですね。
指定した位置にある要素を取得する。
(list-ref '(1 2 3 4 5) 3)
(list-ref '(1 3 4 5 6) 0) |
タイトルの「プログラミングとは名前付け(bind)である」って、名言だな。
追記:
「プログラミングとは名前付け(bind)である」のページのweekday-name手続きを自分なりに書いてみた。
(define (weekday-name index) |
自分なりにって言っても範囲判定の部分をbetweenにして、範囲外はそのまま#<undef>が返るだけだけど。
第一回KPF勉強会を開催しました!!
KPFでもブログ書くまでが勉強会です♪
(↑のKPFのロゴ画像はrosylillyさん作)
KPFとは
「熊本プログラミングフリークス」
(Kumamoto Programming Freaks)
熊本でプログラマのための勉強会及び読書会などを継続的に開催していくためのコミュニティです。
「熊本のプログラミング大好きなプログラマ集れ!!」的なコミュニティ!
詳しくはKPFのサイトをご覧ください。
メーリングリストもどうぞ。
参加者は以下の通り。
以上8名+私の9名でした!
詳しくはKPFのメンバーのページをどぞ。
猛烈に熱かった!熱かったです!熊本のプログラマは熱い!
大成功だと言わざるを得ませんwすごい盛り上がりでしたw
勉強会も4時間近く時間があったので、時間が余るかもしれないと心配していましたが見事に足りませんでしたw勉強会後の懇親会も17:30~0:00までプログラミングの話で盛り上がりました。未だに余韻が覚めやらぬ日曜の午後、この記事を書いています。ブログを書くまでが勉強会!
みんな本当にプログラミングを愛しているのだと感じました><
こんな人たちが熊本にいるなんて!技術的な話、ビジネス的な話、プログラミングの話、みんなそんな話がしたくて仕方なかったんだなぁーと。私もそうです。
プログラミングが大好きなプログラマって、ソフトウェア開発会社で働いていても滅多にお目にかかれません。「大好きなこと」の話がしたいのに盛り上がれる同士がなかなか見つからないというのは鬱憤がたまるものです。そんなプログラミング大好きなプログラマが集った昨日の勉強会は、ダム決壊的な怒涛の白熱プログラミングトークw
まとめて面倒みてやるぜ!!なんちって♪
プログラミングが好きな人はKPFへどうぞ。
熊本県に住んでる必要はありません。
プログラミングが大好きなプログラマは取り合えずKPFへ!
昨日のKPF勉強会の流れ
・主催挨拶 (valvallow)
・KPFの概要と成り立ち
・発表
・ディスカッション
・KPFの今後の活動
・勉強会、読書会について
・その他多種多様なディスカッション
発表はrosylillyさんと私valvallowの二人が行いました。
最後に、懇親会での「その発想はなかったわ。」をメモメモ。
熊本では今までプログラミングの勉強会はほぼ開催されていませんでした。
(過去には開催された形跡がWeb上にちらほら)
福岡では数十のプログラマ向け勉強会があり、毎月いくつも勉強会や読書会が開かれています。
そんな状況を見て、熊本でも勉強会を開催したいという思いでKPFを立ち上げました。この状況を見ると福岡の方が圧倒的に良い環境にも思えますが、勉強会が多いことにも弊害はあるようです。
その一つが、勉強会がたくさんあると、その分優秀な技術者が分散してしまうという状態を作り出すということです。
その点、「熊本に一つだけのKPF」は優秀/有望なプログラマが一点に集るというおもしろい状態を作り出せるのではないでしょうか。そうなれば、九州の中心にある熊本は九州のプログラマをつなげるハブのような役割をも担うことができるすばらしいコミュニティになる可能性を秘めているのでは!?
そんな壮大な話です。
他の参加者の感想はこちら
・第1回KPF(Kumamoto Programming Freaks)勉強会に参加してきました
http://d.hatena.ne.jp/shunsuk/20090207/1234012737
・KPF勉強会、第一回
http://generation1991.g.hatena.ne.jp/rosylilly/20090208/1234062915
・第一回クマモトプログラミングフリークス
http://mixi.jp/view_diary.pl?id=1074721269&owner_id=5046838
次は3月末にまた「第二回KPF勉強会」を開催しますよん♪
;; list ;; MIT (define (my-list . a) a) ;; lambda (define my-list (lambda a a)) (my-list 1 2 3 4 5) ;; => (1 2 3 4 5) (my-list 1) ;; => (1) (my-list) ;; => ()
;; MIT (define (func . a) (print a)) (func 1 2 3 func + '() "aaa" 4 5 6) ;; => (1 2 3 #<closure func> #<subr +> () aaa 4 5 6) ;; lambda (define func (lambda a (print a)) (func 1 2 3 func + '() "aaa" 4 5 6) ;; => ;; => (1 2 3 #<closure func> #<subr +> () aaa 4 5 6)
;; higher order varargs mapping (map (lambda a (print a) a) '(1 2 3) '(1 2 3 4 5)) ;; => (1 1) ;; => (2 2) ;; => (3 3) ;; => ((1 1) (2 2) (3 3))
;; print ;; MIT (define (my-print . a) (map (lambda (s)(display s)(newline)) a)) (my-print 1 2 3) ;; => 1 ;; => 2 ;; => 3 ;; => (#<undef> #<undef> #<undef>) ;; lambda (define my-print (lambda a (map (lambda (s)(display s)(newline)) a))) (my-print 1 2 3 4 5) ;; => 1 ;; => 2 ;; => 3 ;; => 4 ;; => 5 ;; => (#<undef> #<undef> #<undef> #<undef> #<undef>)
「プログラミングGauche」P.67
これは、この発想はなかった。
高階プログラミングが身についてない証拠かも。
手続きにリストを逆順に適用する走査手続きを生成する手続き。
(define (reversed walker) |
(define (tree-walk walker proc tree) (tree-walk for-each (lambda (n)(print n)) '(1 (2 3 (4 5)) 6 (7 8 9) 10)) |
「プログラミングGauche」 P.66
map リストの各要素に引数の手続きを適用し、結果をリストにして返す。 リスト内の順序は保持されても、引数の手続きがリストの順番通りに適用される保証はない。 |
map
;; map |
mapにprint手続きを渡してみる。
(map (lambda (n) (print n)) '(1 2 3 4 5)) |
mapにlambdaを渡してみる。
(map (lambda (n) (* n 2)) '(1 2 3 4 5)) |
木構造リストの末端要素(リーフ)に手続き(proc)を適用するtree-walk。
走査手続きwalkerにはfor-each手続きを渡してみる。
;; tree-walk |
tree-walkにmapを渡してみる。
;; tree-walk with map |
以前も書いたがリストを逆順にするreverse手続きを使う。
;; reverse (reverse '(1 2 3 4 5));; => (5 4 3 2 1)
;; reverse (reverse '(1 2 3 4 5)) ;; => (5 4 3 2 1) |
逆順に手続きを適用する。
;; reverse-map (reverse-map (lambda (n) n) '((1 2) 3 (4 (5 6 (7))) 8)) (tree-walk reverse-map (lambda (n) n) '((1 2) 3 (4 (5 6 (7))) 8)) |
MessageBoxを自動で閉じたいなーと思ったら、こんな裏技(力技)が!
WSHを使って表示時間を指定したMessageBoxを表示するというテクニック(?)みたいです。
[.NET][C#][Code]一定時間で自動的に閉じるメッセージボックス
http://d.hatena.ne.jp/akiramei/20040921/p1
WshShellClassクラスを使うには参照設定でCOMから「Windows Script Host Object Model」を参照して「IWshRuntimeLibrary」をusingディレクティブに加えればOK。
詳しくはここ↓を参照。
[C#] ショートカットファイルの作成
http://d.hatena.ne.jp/gsf_zero1/20070419
ちゃんとやるんなら、自分で専用のクラスを作るべきなんでしょうかね、やっぱ。
まぁでもXP以降ならWSHはプリインストールされてるみたいだし、いいんじゃね。
;; let (let ((a 2) (b 3)) (* a b)) ;; => 6 ;; nested let (let ((a 2) (b 3)) (let ((c 4)) (* a b c))) ;; => 24 ;; let with lambda (let ((a 2) (b 3) (c (lambda (x y) (* x y)))) (c a b)) ;; => 6 ;; cに束縛しようとしているlambda式内からは変数cが見えていない。 ;; let with recursion (let ((a '(1 2 3 4 5)) (b 2) (c (lambda (ls x) (if (pair? ls) (c (cdr ls) x) (print (* (car ls) x)))))) (c a b)) ;; => ERROR: unbound variable: c
;; letrec recursion (letrec ((sum (lambda (ls) (cond ((null? ls) 0) ((number? (car ls))(+ (car ls)(sum (cdr ls)))) (else (sum (cdr ls))))))) (sum '(1 2 3 4 5 6 7 8 9 10)))
;; letrec odd adn even double recursion (letrec ((even? (lambda (n) (cond ((zero? 0) #t) ((> n 0) (odd? (- n 1))) (else (odd? (+ n 1)))))) (odd? (lambda (n) (cond ((zero? n) #f) ((> n 0) (even? (- n 1))) (else (even? (+ n 1))))))) (even? 10))
;; let* (let* ((a 2) (b 3) (c (* a a))) (* a b c)) ;; => 24 ;; let* はネストした let と同等 (let ((a 2) (b 3)) (let ((c (* a a))) (* a b c)))
・[電話番号]
([0-9]{2,4}-[0-9]{2,3}-[0-9]{4})|([0-9]{8,11})
・[携帯電話]
([0-9]{3}-[0-9]{4}-[0-9]{4})|([0-9]{11})
・[郵便番号]
[0-9]{3}-[0-9]{4}
・[西暦(数値のみ)]
([0-9]{4})(0([1-9])|1([0-2]))(([0-2][0-9])|(3[01]))
・[メールアドレス]
[a-zA-Z0-9!$&*.=^`|~#%'+\/?_{}-]+@([a-zA-Z0-9_-]+\.)+[a-zA-Z]{2,4}
・[全角文字列]
[^ -~。-゚]*
・[半角文字列]
[ -~。-゚]*
・[数値]
([0-9]+\.[0-9]+)|([0-9]+)
・[「.」区切りの数字]
[0-9]+(\.[\.0-9]+)[0-9]
正規表現いいよねー。自分はつい先日まで正規表現使ったことありませんでした。
使ってみたら、なぜもっと早く学ばなかったのか強烈な後悔が押し寄せたものです。
取り合えず、「入門 正規表現」って本をザッと読んだら、少し書けるようになった。
少し書けるようになった今、もう一度読みたい。