2011年8月13日土曜日

「文字列を先頭から見て同じところまで除去」をGaucheで解いてみた



お題:文字列を先頭から見て同じところまで除去 - No Programming, No Life

をGaucheで解いてみた。多分0.9じゃないと動かないです。



つぶやける長さになった!



学校卒業するまでの間はSchemeいっぱい書いて生きたい。

追記


あまりにも説明なさ過ぎな気がしたのでちょっとだけ説明も書いてみる。

後述するstring-prefix-lengthっていう便利な関数を使うため(use srfi-13)でSchemeのライブラリsrfi-13を読み込む。

(define (q . los) ~)のように書くとqに渡された引数が全て入ったリストがlosに束縛される。

qの中身を内側から見て行く。

srfi-13に用意されているstring-prefix-lengthを使うと2つの文字列の先頭から見て同じとこまでの長さが得られる。

(map (^s (string-prefix-length (first los) s)) los)


(^s ~)は(lambda (s) ~)のシンタックスシュガー、Gaucheの機能。

mapを使ってlosの全ての文字列sとlosの最初の文字列、2つの文字列の「先頭から見て同じとこまでの長さ」のリストを得る。

(apply min ~)でもっとも短い「先頭から見て同じとこまでの長さ」を取り出す。

そしてstring-dropでlosの全ての文字列sから、もっとも短い「先頭から見て同じとこまでの長さ」の分の文字を取り除く。

そんな流れです。

自分の理解を助けるためにも、もう一度さっくりまとめると



  • 2つの文字列の「先頭から見て同じとこまでの長さ」を返す便利な関数、string-prefix-lengthがsrfi-13で定義されてるのでそれを使う。

  • 関数に渡された全ての引数(文字列)をリストとして受け取る

  • 全ての文字列と最初に渡された文字列との「先頭から見て同じとこまでの長さ」を求める

  • 一番短い「先頭から見て同じとこまでの長さ」まで文字を取り除いた文字列を返す。

以上です。まじめに書こうとすると日本語難しい。

追記


何も考えず別解。



引数の中に空文字列か、先頭の1文字が他のと同じでない文字列があったら引数をそのまま返す。

それ以外の場合は引数の文字列を先頭から1文字取り除いて再帰

再帰! 再帰!




2011年8月12日金曜日

Scheme修行を読む。



Scheme手習いについて


Scheme手習いを読み終わりました。


Scheme手習い







本読んで内容を書いてhanachin/TheLittleSchemer ? GitHubにアップしてブログを書いてid:yamanetoshiさんに読んだエントリ投入のお知らせを書いて、疑問点等補足してもらって…という感じで読み進めました。

エントリあげる間隔はちょっとゆっくり目でしたが orz

ひとまず一冊読み終える事が出来て嬉しいです。

Scheme手習いの冒頭には2度以下で読むなと書いてあったので今度は同級生の方ともう一度読んでみようかと思ってます。

Scheme修行について


続編のScheme修行も購入しました。


Scheme修行







以前から手元にあって、手習いを読み終わったら読もうと思ってわくわくしていた本です。

手習いを読み終わった翌日、もう我慢出来なくなってしまって早速読書用のリポジトリhanachin/TheSeasonedSchemer ? GitHubを建ててマクドナルドに居座り一気に1章読んでしまいましたw

前回の書き方

前回は質問に対応したテストを読みながら書いていって、その質問の答えを定義して、テストが通るか確認して、というTDD的な流れで進めました。

テストケースのファイルを章ごとに1.scm、2.scm、3.scm...と作っていって、テスト用のマクロをtest-util.scmで少しだけ定義してテストケース冒頭で読み込み、本に出て来る関数の定義は全部func.scmの1ファイルに書いて、という感じの構成にしてみましたが最終的にfunc.scmが985行になりました。

全部1つに定義しちゃうと1章ごとにやった内容を確認しづらいし区切りがつけづらいかな、と思ったり。

あとコミットメッセージも謎の英語でぱっと見分からなかったような orz

今回はどうしよう

テストケースを書いてから答えを書く姿勢はそのままで行こうと思います。

テストケースになりそうな質問を本文から全て拾ってから答えを考え読み進めるようにします。

ファイルの構成は、前回func.scmが大きくなったのをふまえ、それぞれの章で使う関数の定義や質問の答えを11.scm、12.scm、13.scm...という風に1章1ファイルで書いていこうかと。

よく重複して定義してしまう関数は別途切り出したり、前章で定義した関数を使う際はloadで前章を読み込もうかと。

テストケースはtest11.scm、test12.scm、test13.scm...のようにtestを頭につけて1章1ファイルずつ作っていきます。

加えてnotes.orgにメモを取って、それもgitで管理する事にします。

後、コミットメッセージを日本語でちゃんと書くようにしてみます。

目標


前回、1章読む間隔が結構あいてしまったので1週間に1章は読むようにして、3ヶ月以内に読了していけるように頑張りたいです。

Scheme手習いだと2回以下で読み切るな、だったのがScheme修行だと5回以下で読み切るな、となってるので前回以上に読み込まなければならないですね…

楽しんで読めると嬉しいな。1章読んだエントリは後ほどあげます。




2011年8月9日火曜日

Scheme手習い Chapter 10



ついに10章まで来てしまった。この章で最後。手習いを終えたら修行が待っている。


いつも通り読みながらの気づき等


読みながらのメモ




  • エントリ(entry)とは(集合のリスト ←と同じ長さの値のリスト)のペア

  • (new-entry setl l)でエントリを作れる

  • lookup-in-entryはnameとentryとentry-fを取る


    • entryの名前の集合からnameを探して対応する値を返す

    • entryの中でnameが見つから無かった時はentry-fにnameを渡して呼び出す

    • entryをnamesとvaluesに分解して、lookup-in-entry-helpを呼んでいる



  • テーブル(table)はエントリ(entry)のリスト


    • 環境ともいう



  • extend-tableはエントリを古いテーブルの先頭に付け加え、新しいテーブルを作る

  • lookup-in-tableはnameとtableとtable-fを取る


    • テーブルの中の先頭のエントリから順にnameの値を探して対応する値を返す

    • tableの中でnameが見つから無かった時はtable-fにnameを渡して呼び出す

    • tableから先頭のエントリを取り出してlookup-in-entryを呼んでいる

    • 先頭のエントリの中でnameが見つからなかった時に次のエントリを探せるように、entry-fにtableへの参照を持ったクロージャを渡している



  • 式(Expression)


    • eはexpressionの略

    • タイプが6つある

    • *const

    • *quote

    • *identifier

    • *lambda

    • *cond

    • *application

    • タイプを関数、actionとして表現する

    • 8章のatom-to-functionのようにexpression-to-actionを定義

    • atomならatom-to-action

    • listならlist-to-action


      • carを見て判断





  • expression-to-actionがきちんと動作するならvalueとmeaningを定義出来る

  • valueはSchemeのevalと同じ。引数で式を取る


    • meaningに式と空の環境を渡して呼び出す



  • meaningは式と環境を引数に取る


    • expression-to-actionでタイプの表現、関数を取り出す

    • 式と環境を渡しその関数を呼び出す



  • タイプを表現するアクション達

  • 非基本関数と基本関数


    • 基本関数は何をするものか知っている関数

    • 非基本関数は引数と関数本体によって定義される関数

    • 仮引数と関数本体を覚えておく必要がある。

    • (lambda (x) x)でいうcdrの((x) x)の部分

    • それに加えテーブルを覚えておく。

    • この3つでクロージャレコード



  • evcon


    • null?の質問がないまま再帰しているのでquestion-ofが真になるlineが無かったらエラーが出るため、少なくとも1つの質問は真である必要がある。



  • evlis


    • listの全ての意味をmeaningで求めて新しいlistにして返す、のかな



  • apply


    • primitiveかそうでないか、でapply-primitiveとapply-closureに処理を振り分けてる。




気づき疑問等




  • extend-tableで新しいエントリを先頭につけるのは、carを使って先頭から探るため?

  • p183のadd1?sub1?はadd1、sub1の間違い?

  • *identifierの中のinitial-tableは…

  • evconはeval-condの略?

  • evlisはeval-list?

  • :atom?をatom?だと思っててハマった orz

  • あと:atom?がキーワードとして認識されちゃったのでmy-atom?に変更

  • ページの順番通りに*applicationを定義した後applyを定義してハマった。


    • 最初に*applicationを定義する時、中でapplyを使ってる

    • 自前applyを定義する前に*applicationを定義するとGaucheに元からあるapplyを見ちゃう

    • 自前applyを定義するのを*applicationの前にもってきて解決



  • defineが出てきてないのに「再帰はYコンビネータによって得られるので、必要はありません。」という答え方は素敵だと思った


    • 全部lambdaで書けばdefine使わなくてok的な

    • でも「Scheme修行も見てください。」とのこと。



  • 「Yコンビネータによる変形を行うとインタプリタ上でインタプリタを走らせる事が可能である」


    • 前の章で出てきたYコンビネータがしっかりとインタプリタで動く事を確認してちょっと感動。動きを追ってみたい。

    • loopはYコンビネータで出来るし、evalは今作った。後はreadとprintだけ用意してやればREPLが出来る!?




感想


最後の章でもapplyのところで処理を分けたり、table関連でうまく抽象化しててすごく分かりやすい。


lookup-in-tableの中でlookup-in-entryに渡すentry-fのクロージャ(cdr table)の部分が好き。



(lambda (name)
(lookup-in-table name (cdr table) table-f))


この10章だけでも何回も読めそう。


冒頭にある読者へのガイドラインでは



急いでこの本を読まないでほしい。注意深く読むこと。有益なヒントがテキスト全体にちりばめてある。この本を2回以下で読み切ろうとしないこと。系統的に読むこと。ある章が完全には理解できなければ、次の章はもっと理解できなくなる。質問はだんだん難しくなるように並べてある。前の方が解けないと、後ろのほうはもっと難しい。

と書いてあるけど、もう一周読んでみても楽しめそうです。


前半部分は何度も読んでるけど8, 9, 10とそこらへんは理解度足りてない感じもするのでもうちょい読み込む予定…


最初にエントリをあげたのが2011年4月14日で、今は8月10だから大体4ヶ月ほど。


特にYコンビネータのところでコミットの感覚が20日以上あいてるのでそこが一番難しかったような。


前の方から後ろに行けばいくほど楽しかったです。





2011年8月6日土曜日

メモ



メモ



$ make osx-uninstall
make -f compile/Make_osx.mak uninstall
rm -f /usr/local/lib/libmigemo.1.dylib
rm -f /usr/local/lib/libmigemo.1.1.0.dylib
rm -f /usr/local/lib/libmigemo.dylib
rm -f /usr/local/share/migemo/migemo-dict*
rm -f /usr/local/include/migemo.h
rm -f /usr/local/share/doc/migemo/README_j.txt
rm -f /usr/local/bin/cmigemo
rm -rf /usr/local/share/migemo
rm -rf /usr/local/share/doc/migemo





2011年8月3日水曜日

ApacheでPHPとMySQL動かすまでの設定めも



Apache


最初に入れたPow(MacBook Airを買いました。 - はなちん C-x C-c参照)とポート被っててWeb共有スタート出来なかったので


Pow と Apache を共存させる - すぱぶらの日記


/private/etc/apache2/other/以下に8080.conf作って



Listen 8080

でとりあえず起動するようになった。


localhost:8080でアクセス。


PHP


PHPの設定は/etc/apache2/httpd.confの



#LoadModule php5_module libexec/apache2/libphp5.so

をコメントアウト。


MySQL


本家からダウンロードしてきて入れた!


PATHは/usr/local/mysqlに通した





2011年8月2日火曜日

Vundleをインストール



参考


gmarik/vundle ? GitHub


blog.shu-cream.net: 2011年のVimプラグインの管理はVundleで


手順通り



git clone http://github.com/gmarik/vundle.git ~/.vim/bundle/vundle


とりあえず



set nocompatible
filetype off

set rtp+=~/.vim/bundle/vundle/
call vundle#rc()

" let Vundle manage Vundle
" required!
Bundle 'gmarik/vundle'
Bundle 'sudo.vim'
Bundle 'rails.vim'


これだけ書いて、vim開いて:BundleInstallした。


アップデートは:BundleInstall!


sudo.vimの:w sudo:%覚えた。





2011年8月1日月曜日

MacBook Airを買いました。



買っちゃいました。


備忘録をかねて追記しながら。


f:id:h6n:20110801190310j:image


結構箱でかいと思ったら中に入ってる模様


f:id:h6n:20110801190918j:image


おお


f:id:h6n:20110801191148j:image


ででーん!


f:id:h6n:20110801191452j:image


付属品たち。


f:id:h6n:20110801191548j:image


前使ってたMacBookよりも付属の電源アダプタがちっさくなってる。


f:id:h6n:20110801192125j:image


奇麗ですね。畳の上でもAirは奇麗ですね。


f:id:h6n:20110801192229j:image


薄い!


f:id:h6n:20110801192242j:image


薄さを伝えるために比較写真を。ハッカーと画家より薄い!


f:id:h6n:20110801192413j:image


んで開きました。


f:id:h6n:20110801192517j:image


電源オン、ぼーん。


この瞬間から写真を撮るのを忘れて触りっぱなしという、ブロガーにあるまじき行為。


f:id:h6n:20110801192552j:image


キーボードも光る。かっこいい。かっこよすぎて目が悪くなるのに暗い中使ってしまいそう。


f:id:h6n:20110801194724j:image


もちろんUS配列です。写真が歪んでいても心はUS一直線。


f:id:h6n:20110801192731j:image


初めてマルチタッチのジェスチャー操作を使用して感じたこと


もうマルチタッチ無しには戻れない。今までMacBook2,1を使っていました。Core2Duo、マルチタッチ非対応のままSnow Leopardまで使ってしまった。


こんなに快適だとは思わなかったなー。Magic Trackpad買っておけばよかったと思う。いやほんと。


フルスクリーンアプリで1画面占有して広く使ってそれを3本指ドラッグですいすい切り替えできてすごく楽。


f:id:h6n:20110801224221p:image


3本指でドラッグしながら上に動かすとミッションコントロールの画面が出て、デスクトップ一覧、ウィンドウ一覧が出る。


何枚デスクトップが作れるのか分かんないけどとりあえず10個ぐらい作ってみた。


f:id:h6n:20110801224630p:image


もちろんこの状態でも左右にスクロールでデスクトップの切り替えが出来る。


んでウィンドウ掴んで他のデスクトップに移動する事も出来る。何コレやばい。


後はFirefoxがフルスクリーン等に対応してくれたら幸せだな。Vimperatorがある限りFirefoxを離れる事は出来ないのでw


Launchpadはこんな感じ。ユーティリティのフォルダ開いてみた。iPhoneみたいだね。


f:id:h6n:20110801225836p:image


地味にびっくりしたのがアプリを起動し直すと前に開いていたウィンドウがそのまま戻ってくる事。


便利だけどちょっと怖いなー。


んで、プレビューで見てたの閉じて何も開いてない状態で他のアプリにフォーカス移すと勝手に終了してくれる。こまかい所に手が届くね。


そういえばSafariでGmailにログインしたらMail、iCal、iChatにアカウントを設定しますか?みたいなポップアップが出て、はいを押したらそのまま何もいじる事なくMailでメール読めるようになって、iCalもiChatも出来るようになった。凄く楽や。


そうそう、楽といえばことえりで推測された言葉の候補が出てくる!いいなーこれ。変換中に辞書が出てくるのも良い。


f:id:h6n:20110801230849p:image


f:id:h6n:20110801230844p:image


とりあえずやった事のメモ


いかんせんこのままでは何をいじったか忘れる。


とりあえず列挙




開発云々の下準備


Xcodeを入れ終わったら次はHomebrew ? MacPorts driving you to drink? Try Homebrew!入れてみます。


Installation ? mxcl/homebrew Wiki ? GitHubとOS X LionのMacbookAirを買ってからRailsの開発環境整えるためにやったことメモ | 野ログはノロキュアMaxHeartを参考に。


ターミナル開いて



/usr/bin/ruby -e "$(curl -fsSL https://raw.github.com/gist/323731)"


インストール成功したら



brew install git
brew update


後は必要そうなのを入れる。


Rubyとか


brew install readline
bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)
echo '[[ -s "/Users/sei/.rvm/scripts/rvm" ]] && source "/Users/sei/.rvm/scripts/rvm"' >> .bashrc
brew link readline
rvm install 1.9.2 -C --with-readline-dir=/usr/local
rvm install 1.8.7 -C --with-readline-dir=/usr/local
rvm use 1.9.2 --default
curl get.pow.cx | sh


Powのアンインストールは



`curl get.pow.cx/uninstall.sh | sh`


よく分かってないので間違ってるとこいっぱいあるかも。


Powが上手く動いてるか確認するために試しに作ってみる。


ついでにpowderってgemも入れてみる。



gem install sinatra
gem install powder


testappを作る


~/testapp/testapp.rb



require 'sinatra'

get '/' do
'Hello world!'
end


~/testapp/config.ru



require './testapp'
run Sinatra::Application


PowでRuby 1.9.2を使ってくれるように


~/testapp/.rvmrc



rvm 1.9.2


作って



cd testapp
powder


でtestapp.devでアクセスしてHello Worldできたかな。


ふむ、分からん。コピペしまくったから。


Emacs


[brew][lion] OS X Lionにhomebrewでemacsとかをインストール - SOSOG


ここ参考にmd5のとこだけ改変してインストールした。



brew install emacs --cocoa


Ctrl+SpaceでSpotlightが出ちゃうのでCtrl+Option+Spaceに置き換え。


f:id:h6n:20110802032524p:image


Android


feb19.jp blog - Mac OS X Lion に Android SDK を入れる


ここを参考にしながら進めていく。



brew install android-sdk
android


ひたすらSDKのダウンロードが終わるのを待つ。ああ、家がADSLじゃなければと思う瞬間。


寝て起きたら終わってた。NDKも入れとく。



brew install ndk


Aptana


Aptana


授業で使うので。


Vertual Box


Downloads ? Oracle VM VirtualBox


仮想マシン。中身に何か入れるかは決めてない。


おわり


最後かなりずれましたね。何の記事なのやら。


眠たいです。でもすっごく快適です。もう元のマシン、Windows環境には戻れない。


前のMacのデータはそのうち持って来ます。


なんかずっと膝上で使ってたらやっぱり暑いです。(特にXcode入れたあたりからファンが鳴ってる)