2009/02/28

[Google]Apps Status Dashboard

Googleの各種サービスの状態を一覧。

詳しくはSlashdot

WS0595

[Book][Site]Webで読める名著【追加】

 

書籍、Webサイト web版
計算機プログラムの構造と解釈計算機プログラムの構造と解釈 Structure and Interpretation of Computter Programs
The Little SchemerThe Little Schemer Google Books - The Little Schemer
The Seasoned SchemerThe Seasoned Schemer Google Books - The Seasoned Schemer
プログラミングGaucheプログラミングGauche Google Books - プログラミングGauche
Gaucheプログラミング(立読み版)
初めてのRuby初めてのRuby Google Books -  初めてのRuby
JavaScript第5版JavaScript 第5版 Google Books - JavaScript第5版
Joel on SoftwareJoel on Software Joel on Software
Practical Common Lisp (Books for Professionals by Professionals) Practical Common Lisp
Real World Haskell Real World Haskell
Let Over Lambda Let Over Lambda—50 Years of Lisp

 

その他

ハッカーと画家ハッカーと画家 コンピュータ時代の創造者たち プロジェクト杉田玄白
ハッカーと画家に収録されている話が多数掲載されている。
ただし、他にたくさんの翻訳物が掲載されている。
例)、『聖書』、『独立宣言』、『マッチ売りの少女』、『不思議の国のアリス』、『The GNU Project』、『劣化ウラン:原因、被曝および健康への影響 ――概要―― 』、『ヴェニスの商人』
Fine Software Writings Fine Software Writings
ソフトウェア開発に関する文章の翻訳
たとえば「FizzBuzz」の騒動の火種になった「どうしてプログラマに・・・プログラムが書けないのか?」など
青空文庫 青空文庫
この辺を参考に?
青空文庫 アクセスランキング
一太郎で「青空文庫」ダウンロード・ランキング -ALL-
青空文庫で読めるオススメ
リレーショナルデータベースの世界 リレーショナルデータベースの世界
例)、SQL For PractitionersCASE式のススメSQLプログラミング作法3値論理――神のいない論理

 

 

Google ブック検索ってどうなるんだろうね。

[scheme][Gauche][Book]The Little Schemer

 

ようやく購入できました。

The Little Schemer
The Little Schemer
posted with amazlet at 09.02.28
Daniel P. Friedman Matthias Felleisen
Mit Pr
売り上げランキング: 19756
おすすめ度の平均: 5.0
5 小さなScheme処理系で学ぶ数学基礎理論
5 Schemeが好きになります
5 英語であるのが苦痛にならない楽しさ
5 面白いスタイル

 

どうやらScheme初学者にはかなりオススメらしい。

どうやら「Scheme(スキーム)手習い―直感で学ぶLisp」というのが邦訳らしいが、絶版とのこと。それならということで、amazonで購入しようと思いましたが、出品者が国外ばかりで、よくわかりませんでしが。

 

ということで、今回は「紀伊国屋書店BookWeb」で購入しました。購入手順がとてもわかりやすくて好感が持てました。海外への発注ということで、注文から2週間かかって手元に到着しました。

 

SICP(計算機プログラムの構造と解釈)を読むために、「プログラミングGauche」と「The Little Schemer」を購入しましたwんで、このブログはSICPとGaucheの学習履歴的な記事が多いし、今後も多くなると思われます。The Little Schemer関連の記事も。

プログラミングGauche
プログラミングGauche
posted with amazlet at 09.02.28
Kahuaプロジェクト
オライリージャパン
売り上げランキング: 135232
おすすめ度の平均: 5.0
5 日本が米国に先行している稀な事例
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 10647
おすすめ度の平均: 3.0
1 訳が酷い
4 紙と鉛筆と計算機と
1 内容最高。翻訳最低。
5 食わず嫌いでした。
5 プログラマにとって必読の本です

2009/02/27

[bat][バッチ][コマンドライン]Windowsのバッチとかコマンドラインとか

WS0594
会社と家でネットワークの設定を切り替えたりしたい時。IPアドレス等の設定って面倒ですよね。わざわざネットワークの設定画面開くのとか。
会社でノートパソコン使ってる人なんかは、家と会社で設定が違うので大変です。今までは、拾ってきたバッチを使ってたんですが、懐かしくってちょっとバッチプログラミングしてみましたので晒してみます。
下の方に一部解説とか、小技載せてみましたw
結構おもしろかった(笑)こんどWindows DOS/コマンドプロンプト辞典でも読みなおして遊んでみようかな~w

今まで使ってたやつ。
これらを家で会社でコマンドランチャからピコってやってます。
@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


で、別に上記のものでよかったのですが、というより、上記のものの方が良かったかもしれませんが、ONとOFFを一緒くたにしたのを作ってみました。結構楽しかったw
(コピーすれば使えますが、DEFAULTラベルのところの値はお使いの環境用に書き換えて下さい。)
@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


後は関係ないけど、SQLサーバー向けとか、思い出したのでついでに。
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%

さらに関係ないけど、しょぼいフォルダ検索とかw
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


Windows DOS/コマンドプロンプト辞典マスタリングTCP/IP 入門編 第4版 プログラマのためのSQL 第2版SQL Hacks ―データベースを自由自在に操るテクニック

2009/02/23

[OOP][C#][DesignPattern]オブジェクト指向(OOP)を習得するために必要なこと+追記

追記:

タイトルを「オブジェクト指向(OOP)を習得するために必要なこと」 改め 「私の静的型付けクラスベース OOP の理解を助けたもの」すればよかったなーという話です。

参考:
[OOP] “オブジェクト指向”の本質
http://d.hatena.ne.jp/sumim/20080415/p1
[OOP] 三系統の“オブジェクト指向”を「北斗の拳」に例えてみる
http://d.hatena.ne.jp/sumim/20080416/p1
Rees Re: OO
http://practical-scheme.net/trans/reesoo-j.html
Yoshiyuki Nakamura / nakayoshix
いわた / iratqq

ところで、やっぱ追記は最後に書くべき?

 

さらに追記:

中の人がどう思っているかと,外からどう思われているか
http://d.hatena.ne.jp/NyaRuRu/20080504/p2


オブジェクト指向言語においてpolymorphism というと,「あるメソッド呼び出し式において呼び出されるメソッドが,呼び出されるオブジェクトの(静的型ではなく) 実行時の型(クラス) によって決まること」を指すことが多い.これはad-hoc polymorphism とsubtype polymorphism の組み合わせであると考えられる.

ソフトウェア基礎論配布資料(6) - パラメタ多相とSystem F

 

 

以下当初の本文:

 

 

オブジェクト指向プログラミング(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とかも混ざってますが)

 

 

参考:

結城浩 - The Essence of Programming
増補改訂版Java言語で学ぶデザインパターン入門
学べるのは、デザインパターンだけじゃない。
http://www.hyuki.com/dp/

デザインパターン紹介
―GoF以外のパターンを紹介します―
http://www.hyuki.com/dp/dpinfo.html

VB.NETとC#でデザインパターン
http://hccweb1.bai.ne.jp/tsune-1/

窓際プログラマーの独り言 -C#の話題を中心に
C#デザインパターン Index
http://blog.livedoor.jp/gushwell/archives/50333227.html

デザインパターン
http://www.tom.sfc.keio.ac.jp/~fjedi/wiki/index.php?%A5%C7%A5%B6%A5%A4%A5%F3%A5%D1%A5%BF%A1%BC%A5%F3#x6f5a638

ぼくにもわかるデザインパターン 第2章
GoFパターン大カタログ ~パターンがみるみる頭にしみこむ~
http://www.ulsystems.co.jp/technology/development_010_01.html

Bug Catharsisデザインパターン
http://d.hatena.ne.jp/zecl/archive?word=%2a%5b%a5%c7%a5%b6%a5%a4%a5%f3%a5%d1%a5%bf%a1%bc%a5%f3%5d

.NETで始めるデザインパターン
http://www.atmarkit.co.jp/fdotnet/designptn/index/

GoFデザインパターン一覧
http://homepage3.nifty.com/satoshis/oo/patterns.html

Object型をツリー構造で管理するTreeElementクラス
http://codezine.jp/article/detail/435?p=1

矢沢久雄の早わかりGoFデザインパターン---目次:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20051201/225570/

デザインパターンの骸骨たち (RE-BONE)
Skeleton of GOF's Design Patterns
http://www002.upp.so-net.ne.jp/ys_oota/mdp/index.htm

デザインパターンの塗り薬
Sample Application for GOF's Design Pattern
http://www002.upp.so-net.ne.jp/ys_oota/mdp2/index.htm

NET Framework 開発者ガイド:高度な開発技術
http://msdn.microsoft.com/ja-jp/library/a493kdy6(VS.80).aspx

Yohta's Object World ~YOHTAのオブジェクト指向研究 デザイン ...
http://www002.upp.so-net.ne.jp/ys_oota/

OGIS-RI OBJECT SQUARE:オブジェクトの広場
http://www.ogis-ri.co.jp/otc/hiroba/index.html

DI コンテナの本当の使いどころ
http://www.ulsystems.co.jp/technology/development_013_01.html

DIコンテナ【Dependency Injection Container】
http://itpro.nikkeibp.co.jp/article/COLUMN/20060628/241982/

AspectDNGで始める.NETのAOP:CodeZine
http://codezine.jp/article/detail/446?p=1

NETでアスペクト指向プログラミング(AOP):アーキテクト360
http://architect360.apricot-jp.com/300/netaop.html

MSDN Magazine & Microsoft News
AOP:コードのカプセル化と再利用を推進するアスペクト指向プログラミング
http://ascii.asciimw.jp/pb/msdn/article/a25_0045.html

 
以下PDF直リンク
 

デザインパターンによるオブジェクト指向分析/設計入門
http://www.shinsahara.com/www/seminar/SRC/DP/Tutorial/all.pdf

デザインパターンを用いたオブジェクト分析/設計技法[基礎編]
http://www.shinsahara.com/www/seminar/SRC/DP/Basic/all.pdf

Acyclic Visitor
http://www.objectmentor.com/resources/articles/acv.pdf

2009/02/20

とうこうてすと

携帯からテスト

どうた?

[Meadow][Emacs]Tetris

Meadowって「メドウ」って読むらしいですね。「ミードウ」って読んでました。

ところで、M-x tetrisってコマンドたたいてください。

WS0593

 

Emacsでゲームもする

http://www.kototone.jp/com/games_on_emacs.html

Test

bloggerへのメールによる記事投稿テスト+Twitterへの通知+mixiへの通知。
どうだ?

Test

One more test.
(´・ω・`)

Mail Post Test

メールで投稿テスト。

ふろむじーめーる。

('A`)

2009/02/14

[scheme][Emacs]MeadowでGaucheやる時に便利なやつ

昨日Twitterでiratqq/いわたさんにいろいろ教えて頂いたものをメモメモ。
まずquack.elは、Schemeのシンタックスハイライト(キーワードの色分けとか)をもっとわかりやすくしてくれます。なんかフォントサイズとかフォントも変わった気がするけど私は気になりませんでした。
あと、改行時にインデントを自動でやってくれます。
さらに・・・。
WS0591
fact手続きのところを見るとわかるようにlambdaがλになってますwかわいいw
quack.elを所定の場所に置いて、.emacsに以下の設定を追加すればおk。
詳しくはquack.elのダウンロードページを見る方がわかりやすいです。
ダウンロードはquack.elのページの下部「download」項目。
;; .emacsファイルに追加する設定
(load "quack")
(setq quack-pretty-lambda-p t)


次にunparen.elは、括弧を消してくれます。(でもこれじゃScheme書けない><)
WS0592
下記の設定を.emacsファイルに追加して、M-x unparenとするとおk。元に戻す場合も同様。
(load "unparen")


次にscheme-complete.elは、試してみたものの何が起きたのか良くわからなかりませんでした。どうも入力補完をしてくれるみたいなのですが・・・。

その他には以前も書いたように、ツールバーを消してます。
;;; ツールバーを非表示
;; M-x tool-bar-mode で表示非表示を切り替えられる
(tool-bar-mode -1)

起動時のメッセージを消す。
(setq inhibit-startup-message t)

起動時からscheme-modeにしておく。
(scheme-other-window)

他にRuby、JavaScript、C#のシンタックスハイライトの設定もしています。
行番号を表示したいのですが、setnu.elがダウンロードできずに困っています・・・。
参考:Meadowさん


追記:
昨日はダメだったけど、今試したらダウンロードできた♪setnu.el

quack.el
http://www.neilvandyke.org/quack/
unparen.el
 http://www.emacswiki.org/cgi-bin/wiki/UnParenMode
scheme-complete.el
http://groups.google.co.jp/group/comp.lang.scheme/browse_thread/thread/7ba720878da3bd50

入門 GNU Emacs 第3版入門Meadow/EmacsプログラミングGauche

[scheme][Gauche]lambda記法⇒MIT記法

プログラミングGauche」P.75~76 構文の拡張とマクロ

 

 

取り合えず「quate」がまだ正式に出てきてない段階なので「quate」「'」があまりよくわからないので少し試し書き。

evalとか試してみた。引数が2つ必要みたいだけど、何を渡したらいいのか調べず、取り合えず'()を渡したら動いたので続行。

;; (define double (lambda (x)(* x x))) -> (define (double x)(* x x))
(define exp '(define double (lambda (x)(* x x))))

 

exp
;; => (define double (lambda (x)(* x x)))

 

(eval exp '())
;; => double

 

double
;; => #<closure double>

 

(double 5)
;; => 25

 

(define double 1)
double
;; => 1

 

exp
;; => (define double (lambda (x)(* x x)))


(eval exp '())
;; => double


(double 5)
;; => 25

 

'(define double (lambda (x)(* x x)))に対してのcarとcdrの動作を確認してみる。

;; (define double (lambda (x)(* x x))) -> (define (double x)(* x x))
(define exp '(define double (lambda (x)(* x x))))


(car exp)
;; => define


(car (cdr exp))
;; => double


(car (cdr (car (cdr (cdr exp)))))
;; => (x)


(cdr (cdr (car (cdr (cdr exp)))))
;; => ((* x x))

 

ようやく本題。lambda記法をmit記法に変換。コメントのために少しインデントを崩してます。

;; (define double (lambda (x)(* x x)))
;; lambda -> mit
(define (lambda->mit exp)
  (cons (car exp) ;; -> define
        (cons (cons (car (cdr exp)) ;; => double
                    (car (cdr (car (cdr (cdr exp)))))) ;; => (x)
              (cdr (cdr (car (cdr (cdr exp))))) ;; => ((* x x))
              ) ;; => ((double x) (* x x))
        ) ;; => (define (double x) (* x x))
  );; => lambda->mit

 

(lambda->mit exp)
;; => (define (double x) (* x x))

 

(define a (lambda->mit exp))
;; => a

 

(eval a '())
;; => double

 

(double 3)
;; => 9

[scheme][Gauche]MIT記法をlambda式による定義に変換する

プログラミング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)
  (cons (car exp)
        (cons (car (car (cdr exp)))
              (cons (cons 'lambda
                          (cons (cdr (car (cdr exp)))
                                (cdr (cdr exp))))
                    ()))))

 

コメント付けてみた。MeadowでM-;が便利。

;; mit -> lambda
(define (mit->lambda exp)
  ;; define
  (cons (car exp)
        ;; double
        (cons (car (car (cdr exp)))
              ;; lambda
              (cons (cons 'lambda
                          ;; (x)
                          (cons (cdr (car (cdr exp)))
                                ;; ((* x x))
                                (cdr (cdr exp))))
                    ()))))

 

(mit->lambda '(define (double x)(* x x)))
;; => (define double (lambda (x) (* x x)))

 

「すべてがリスト」ってのはホンマですね。

2009/02/10

[scheme][Gauche]list-ref+追記

 

指定した位置にある要素を取得する。

(list-ref '(1 2 3 4 5) 3)
;; => 4

 

(list-ref '(1 3 4 5 6) 0)
;; => 1

 

Gaucheプログラミング(立読み版)

プログラミングとは名前付け(bind)である

 

タイトルの「プログラミングとは名前付け(bind)である」って、名言だな。

 

追記:

プログラミングとは名前付け(bind)である」のページのweekday-name手続きを自分なりに書いてみた。

(define (weekday-name index)
  (let ((day-names '("月" "火" "水" "木" "金" "土" "日"))
          (between (lambda (min n max)
                               (and (<= min n)(<= n max)))))
    (if (between 0 index 6)
        (list-ref day-names index))))


(weekday-name 0)
;; => "月"
(weekday-name -1)
;; => #<undef>
(weekday-name 7)
;; => #<undef>
(weekday-name 6)
;; => "日"

 

 

自分なりにって言っても範囲判定の部分をbetweenにして、範囲外はそのまま#<undef>が返るだけだけど。

2009/02/08

[KPF][勉強会]第一回KPF勉強会

kpf.logo.main

第一回KPF勉強会を開催しました!!
KPFでもブログ書くまでが勉強会です♪

(↑のKPFのロゴ画像はrosylillyさん作)

 

KPFとは
「熊本プログラミングフリークス」
Kumamoto Programming Freaks

WS0589 

熊本でプログラマのための勉強会及び読書会などを継続的に開催していくためのコミュニティです。
「熊本のプログラミング大好きなプログラマ集れ!!」的なコミュニティ!

詳しくはKPFのサイトをご覧ください。
メーリングリストもどうぞ。

 

 

参加者は以下の通り。

  • Rubyを内からぶっ壊す!RubyでJavaScriptっちゃう仰天16歳はRubylist。
  • 九州3傑ぷよぷよの猛者!オーバークロック大好きSilverLighter。
  • 言語の話が止まらない!寝るより食うよりコーディング!C/C++/C#er。
  • 異色の研究員プログラマ!過去と未来がフリーランスなRubylist。
  • レコード屋からWebプログラマへ転身!RubyをやりたいPHPer。
  • バイクと水槽とチャリと釣り!バイク屋からプログラマへ転身そして独立C#er。
  • 昨日辞表!独立しちゃう野心あふれる静かなC#erなRubylist。
  • 毎日がクアッドディスプレイ!独立起業のビジネスマンPHPer。

以上8名+の9名でした!
詳しくはKPFのメンバーのページをどぞ。

 

 

猛烈に熱かった!熱かったです!熊本のプログラマは熱い!
大成功だと言わざるを得ませんwすごい盛り上がりでしたw

 

勉強会も4時間近く時間があったので、時間が余るかもしれないと心配していましたが見事に足りませんでしたw勉強会後の懇親会も17:30~0:00までプログラミングの話で盛り上がりました。未だに余韻が覚めやらぬ日曜の午後、この記事を書いています。ブログを書くまでが勉強会!

 

みんな本当にプログラミングを愛しているのだと感じました><
こんな人たちが熊本にいるなんて!技術的な話、ビジネス的な話、プログラミングの話、みんなそんな話がしたくて仕方なかったんだなぁーと。私もそうです。

 

プログラミングが大好きなプログラマって、ソフトウェア開発会社で働いていても滅多にお目にかかれません。「大好きなこと」の話がしたいのに盛り上がれる同士がなかなか見つからないというのは鬱憤がたまるものです。そんなプログラミング大好きなプログラマが集った昨日の勉強会は、ダム決壊的な怒涛の白熱プログラミングトークw

 

  • 熊本のプログラマはKPFに参加すべき !!

 

まとめて面倒みてやるぜ!!なんちって♪
プログラミングが好きな人はKPFへどうぞ。
熊本県に住んでる必要はありません。
プログラミングが大好きなプログラマは取り合えずKPFへ!

 

 

昨日のKPF勉強会の流れ
・主催挨拶 (valvallow
KPFの概要と成り立ち
・発表
・ディスカッション
    ・KPFの今後の活動
    ・勉強会、読書会について
    ・その他多種多様なディスカッション

発表はrosylillyさんと私valvallowの二人が行いました。

 

rosylillyさん

Ruby + JS to Roptotype

Prototype.rb

 

valvallow

プログラミング言語Scheme

 

 

 

最後に、懇親会での「その発想はなかったわ。」をメモメモ。

 

熊本では今までプログラミングの勉強会はほぼ開催されていませんでした。
過去には開催された形跡が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勉強会」を開催しますよん♪

2009/02/07

[scheme][Gauche]可変長引数、練習問題list

プログラミングGauche」P.72~

P.74 練習問題
;; 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記法と非MIT記法での可変長引数
;; 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)

mapに複数のリストを渡してみる。
手続きも可変長引数を取れるように。
;; 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関数を自前で実装してみる。
;; 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

[scheme][Gauche]reversed

プログラミングGauche」P.67

 

これは、この発想はなかった。

高階プログラミングが身についてない証拠かも。

 

手続きにリストを逆順に適用する走査手続きを生成する手続き。

(define (reversed walker)
  (lambda (proc ls)
    (walker proc (reverse ls))))

 

(define (tree-walk walker proc tree)
  (walker (lambda (ele)
      (if (list? ele)
        (tree-walk walker proc ele)
        (proc ele)))
    tree))

(tree-walk for-each (lambda (n)(print n)) '(1 (2 3 (4 5)) 6 (7 8 9) 10))
(reversed for-each)
(tree-walk (reversed for-each) (lambda (n)(print n)) '(1 2 3 (4 5 6)))
(reversed map)
(tree-walk (reversed map) (lambda (n)(+ n n)) '(1 2 3 (4 5 6 (7 8 9)) 10))

[scheme][Gauche]map

プログラミングGauche」 P.66

 

map
リストの各要素に引数の手続きを適用し、結果をリストにして返す。
リスト内の順序は保持されても、引数の手続きがリストの順番通りに適用される保証はない。

 

map

;; map
(map (lambda (n) (* n n)) '(1 2 3 4 5))
;; => (1 4 9 16 25)

 

mapにprint手続きを渡してみる。

(map (lambda (n) (print n)) '(1 2 3 4 5))
;; => gosh> 1
;; => 2
;; => 3
;; => 4
;; => 5
;; => (#<undef> #<undef> #<undef> #<undef> #<undef>)

 

 

mapにlambdaを渡してみる。

(map (lambda (n) (* n 2)) '(1 2 3 4 5))
;; => (2 4 6 8 10)

 

木構造リストの末端要素(リーフ)に手続き(proc)を適用するtree-walk。

走査手続きwalkerにはfor-each手続きを渡してみる。

;; tree-walk
(define (tree-walk walker proc tree)
  (walker (lambda (ele)
      (if (list? ele)
        (tree-walk walker proc ele)
        (proc ele)))
    tree))

 

tree-walkにmapを渡してみる。

;; tree-walk with map
(tree-walk map (lambda (n) (* n n)) '((1 2) 3 (4 (5 6 (7))) 8))
;; => ((1 4) 9 (16 (25 36 (49))) 64)

 

以前も書いたがリストを逆順にするreverse手続きを使う。

;; reverse
(define (reverse ls)
  (define (rev-iter ls ret)
    (if (null? ls)
      ret
      (rev-iter (cdr ls)(cons (car ls) ret))))
  (rev-iter ls '()))

(reverse '(1 2 3 4 5));; => (5 4 3 2 1)

 

;; reverse
(define (reverse ls)
  (fold cons '() ls))

(reverse '(1 2 3 4 5)) ;; => (5 4 3 2 1)

 

逆順に手続きを適用する。

;; reverse-map
(define (reverse-map proc ls)
  (map proc (reverse ls)))

(reverse-map (lambda (n) n) '((1 2) 3 (4 (5 6 (7))) 8))
;; => (8 (4 (5 6 (7))) 3 (1 2))

(tree-walk reverse-map (lambda (n) n) '((1 2) 3 (4 (5 6 (7))) 8))
;; => (8 (((7) 6 5) 4) 3 (2 1))

[C#][WSH]メッセージボックスを自動で閉じたい

 

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はプリインストールされてるみたいだし、いいんじゃね。


WSHクイックリファレンス 第2版

2009/02/06

scheme, Gauche: let、let*、letrec

それぞれの let

let

初期値式が先に評価されて、その後、変数名に束縛される。
初期値式の中で同レベル(同一スコープ)の変数を参照しようとしても、変数は unbound(束縛されていない) variable(変数)となる。
;; 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

初期値式が評価されるときに同レベル(同一スコープ)の変数が見えている。
ローカルスコープでの再帰が可能。
;; 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)))

P.72 の「ローカルな相互再帰手続き」の例の写経
;; 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*
(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)))

Gauche には他にもたくさんの let 系マクロがある。let1, rlet1, if-let1, match-let, let-values, let/cc などなど。


プログラミングGauche

[Regexp][正規表現]正規表現メモ

 

・[電話番号]
([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]

 

 

 

正規表現いいよねー。自分はつい先日まで正規表現使ったことありませんでした。

使ってみたら、なぜもっと早く学ばなかったのか強烈な後悔が押し寄せたものです。

 

取り合えず、「入門 正規表現」って本をザッと読んだら、少し書けるようになった。

少し書けるようになった今、もう一度読みたい。