だめな子

だめな子ですが頑張って成長してゆくのです。

SICP その4

ちょっと間が空いたけど、Schemeはやっぱり学習しておきたいし構文解析やら抽象構文木やらコンパイラの実装やらも興味が出てきたので頑張って読むよ!
1.2.3 増加の程度
計算するには資源が必要
実行時間(ステップ数)かもしんないし、メモリの量かもしんない。
フツー計算機は一定時間に計算できる量は変わらないだし。
同じことを計算するでも、アルゴリズムによって必要な資源の量(と質も)変化するのですよ
問題1.14
やべぇしばらくSICP読んでなかったから木構造なんてまったくわからん
しかしまぁ(define (cc〜〜〜のとこの最後のとこが
(+ (cc 〜〜〜) (cc 〜〜〜))
ってな感じで線形反復ではないのは明らか
よって、金額が増えると使うスペースとステップ数が増えることも明らか
で、増加の程度かぁ… わからん
解答見ちゃう
木構造は理解できるけど、答えが理解できない。
O記法とかも全然わからんので、これはせうらいへの課題としてしまふことにする。
問題 1.15
数学よくわかんない
1.2.4 べき乗
べき乗ってなんだっけ
5! = 1 * 2 * 3 * 4 * 5 → 120
こんなのか
Wikipedia見るもわからん
あってんの?ほんとあってんの? ! とか階乗じゃないの?俺頭悪くね?
PLAIN TEXT
SCHEME:

(define (expt b n)

    (if (= n 0)

        1

        (* b (expt b (- n 1)))))

 

(display (expt 5 3))

で、これはΘ(n)ステップでΘ(n)スペースらしい
問題 1.14の解答からして
計算数(計算の回数?)がステップ数で
スペースは簡約しつつ計算したときに一番深くなったときのネストの深さ(日本語難しい)ってことなんだろか
よくわからないのでそこらへんに落ちてた姉御さんにべき乗を説明してもらったら
5C3とか昔やったべとか5P3とか意味のわからないことをおっしゃるのでわかりました わかりません
飴は独り占めしちゃいけませんよって言われた
線形反復だとΘ(n)ステップでΘ(1)スペースですね
でも、逐次平方だともっとスゴいよ!
bの8乗を例にとると
b * b * b [...]

Read the rest of SICP その4

FEZSNS Scraper v0.1くらい

作った!GUIつけた!でもなんか不恰好!まぁいいや!!
FEZSNS Scraper v0.1
一応ソースもはいってるよ
 Q.このソフトなに?
 A.FEZのSNSから戦争データを読み込んでデータベースにするソフトだよ
 Q.どういう原理なの?
 A.このプログラム内にブラウザが内蔵されてて自動で
  1.SNSへログイン
  2.戦争リストページへアクセス (http://fesns.com/?m=fe&a=page_h_war_record_list ←コレとか)
  3.戦争リストページの解析
  4.戦争ページへアクセス (http://fesns.com/?m=fe&a=page_war_record&target_unit_id=2&target_seq=37564 ←コレとか)
  5.戦争ページの解析
  6.データベースに保存
  大体こんな感じの作業をやってる
まぁ大体こんなん
あとはもう中に入ってるテキストファイル読んでって感じ

Read the rest of FEZSNS Scraper v0.1くらい

とりあえずwxWidgetsを選んだわけ

GUIを作れるようになりたいなぁと思った俺なのであった

フリー
ソース手動で書くんじゃなくてツールでGUI構築
多くの言語から使えると嬉しい
マルチプラットフォームだと嬉しい
ルック&フィールがOSネイティブになるべく近いといいな
開発が継続して行われてるほうが安心な気がする

そしたらwxWidgetsがいいなぁってなった
なんかサンプルコードも仰山あってすげーらしいぜ!すげー!
とりあえずRubyだとwxRubyとゆーらしい
gem install wxruby→すげー!
で、wxWidgetsはXRCっていうXML形式でのGUIの情報を取り込むことも可能らしい
VBとかC#みたく、コード上でGUIをゴリゴリ書くことも可能なんだって
コード上でゴリゴリ書く形式だと、複数言語に対応しててもデザイナがそれぞれの形式で吐けないと嬉しくないんだろうけど
XRC形式で吐けばどの言語向けのwxWidgetsでも利用可能に違いない(憶測
とりあえず使ってみるけど全然わかんねぇ…wxRuby APIとか見つつ手探り
wxRuby付属のサンプルを元に最小限で動くとこまでコードを削ってみる
PLAIN TEXT
RUBY:

#!ruby -Ku

 

begin

  require 'wx'

rescue LoadError => e

  begin

    require 'rubygems'

    require 'wx'

  rescue LoadError

    raise e

  end

end

 

#

# Application class.

#

class XrcApp <Wx::App

  def on_init

    # Create a resource handler

    $xml = Wx::XmlResource.get();

    $xml.init_all_handlers();

 

    # Load a resource file

    xrc_file = File.join(File.dirname(__FILE__), 'test.xrc')

    $xml.load(xrc_file)

 

  [...]

Read the rest of とりあえずwxWidgetsを選んだわけ

ActiveRecord

FEZSNSのを書きなおそー…となんとなく思ったのでやってみる
前回はSQL直書きだったので、今回はORマッパーのActiveRecordを使ってみる
ActiveRecordといえばRailsで有名だよね
ていうかActiveRecord以外Railsで知ってるものないよネ
テーブル定義とかをActiveRecorsに親和性高そな感じに書きなおしてみた
ActiveRecordは複合キーが使えないらしいのでコレを突っ込む
PLAIN TEXT
RUBY:

require 'rubygems'

require 'kconv'

require 'activerecord'

require 'composite_primary_keys'

 

class WarResult <ActiveRecord::Base

  set_primary_keys :server, :war_no

end

 

require 'logger'

ActiveRecord::Base.logger = Logger.new("debug.log")

ActiveRecord::Base.establish_connection(

  :adapter  => "sqlite3",

  :database => "FEZSNS.db"

)

 

elem = WarResult.new

elem.server = "Briah"

elem.war_no = 10000

elem.offense = "カセドリア".toutf8

elem.defense = "ゲブランド".toutf8

elem.time = "20:14"

elem.end_time = "2008-02-23 14:00"

elem.place = "ゴブリンフォーク".toutf8

 

elem.save

 

elem = WarResult.find(["Briah", 10000])

 

puts elem.server

puts elem.war_no

puts elem.offense

puts elem.defense

puts elem.time

puts elem.end_time

puts elem.place

すげー!
簡単!!
でも、複数テーブル対象にトランザクション作る方法がわかんない…
どーすればいいんだー
一回DBにclassっていう列作っちゃってActiveRecordがclass作っちゃって本来のclassメソッドがシャドゥイングされちゃったらしく
/var/lib/gems/1.8/gems/composite_primary_keys-0.9.92/lib/composite_primary_keys/attribute_methods.rb:62:in `method_missing': undefined method `generated_methods' for nil:NilClass (NoMethodError)
とか言われて原因気がつかなくて3時間くらいつまった!
ちきしょーばかやろー
参考
has_とかの分かりやすい解説

Read the rest of ActiveRecord

Y Combinatorとは?

今までYコンビネータってよく耳にしたけど、なんのこっちゃらよくわからなかった。
で、ひょんなことから分かりやすい解説をしてるサイトをめっけて分かったような気持ちになったからメモっておく。
Y Combinator = 不動点演算子みたいな表記をしてるサイトもあったけど、違うものだよみたいな書き方をしてるサイトもあった。
ていうか不動点て何?
http://www.loveruby.net/ja/misc/ycombinator.html

動機
再帰関数は再帰するときに自分自身を名前で呼ぶのが普通である。これをなんとかして名前を使わず、関数そのものを呼ぶようにさせたい。

らしい。
だから?って感じだけど、名前をつけなくていい→名前空間が汚れない、影響を受けないってことだし、1回しか使わないような再帰的な処理に名前なんかつけたくねーよってことなんだろー。
Schemeとかだとローカル関数とかあるしRubyだとProcとかあるし、別にYコンビネータなんかなくたっていいじゃんな気がする
けど、見た目の美しさ的にはlambda式の中にローカル関数とか書きたくないしなぁ、ってことだろか
λ式だけで再帰関数がかけます!素敵!ふーん
"Y Combinator"っていう単語なんじゃなくて、Yっていう名前がついてるCombinatorらしい

手続き名も含む「変数」がすべて束縛変数である (引数になっている) λ式のこと。そういうλ式はまわりの環境に依らずに同じ動作ができる……つまり完全に自分自身の意味が固定されている。

だって。コンビネータの動作は完全に固定されてて、引数で動作を変える(コンビネータ + λ式 = 超必殺返り値)みたいな。合体=強いという方程式がここでも成り立つ、ということかー。
http://www.loveruby.net/ja/misc/ycombinator.html
Schemeで
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/35058
Rubyで
http://d.hatena.ne.jp/amachang/20080124/1201199469
JavaScriptで
arguments.calleeって何それ めちゃめちゃかっこいいじゃん すげー便利そうじゃん JavaScript変態だな
http://d.hatena.ne.jp/tanakh/20040813
http://haskell.g.hatena.ne.jp/hyuki/20060531/factorial
Haskellで
http://ja.doukaku.org/150/
どう書く?.org の不動点演算子を各言語で実装するお題
http://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/fix.html
不動点演算子について

また、SchemeのletrecやLispのlabelsとかも、 Yオペレータと役割が一緒なので不動点オペレータと呼ばれる事がある。

ほほぅ
色々な言語をちょっとっつかじってるので大体のものが読めるのは嬉しい
全然関係ないけど、嬉しさ検索、みたいなサービスが欲しいなぁ
「Y Combinator」で検索するとY Combinator使って嬉しくなっちゃった例をずらずらあげてくれるようなサービス
「Smalltalk」とか「モナド」とか「Windows Vista」とかで検索するとどうなるんだろーなー

Read the rest of Y Combinatorとは?