!kiyoka.blog.2010_07 RSSPLAIN

Related pages: !kiyoka.blog.list
15515552222222222222222222222222222222222222222222222222022233333333333333333333333333333333333333333033355555555555550555555555555555550555555555555555555555555505555555555555505555555555555555555505555555555555555055545555555555055555555555555555550555555555555555555505
1

kiyoka日記。NendoSekkaの開発や、最近思うことなど

5

最新10件!kiyoka.blog   過去記事一覧!kiyoka.blog.list

5

kiyoka.blog_header 

1

このブログを書いている人: 西山 清香(kiyoka) - twitter: @kiyokaEXT

5

5

 

5

 

2

kiyoka.2010_07_30[Nendo] Rubyのブロック構文をサポートした

2

私がRubyで書いているLisp方言、 Nendoについて。

2

 

2

新しく追加したブロック生成構文

2

NendoでRubyのブロックを生成する構文を追加した。

2

Rubyのブロック構文とは、以下のような {} で囲んだコード片(クロージャ)をメソッドに渡す構文である。

2
#  ファイルの1行目を読み込んで出力する
2
open( "file.txt" ) { |f|
2
  puts f.readline
2
}
2

Rubyのライブラリにはブロックを受けとるメソッドが多く、NendoからRubyのライブラリをまともに使おうと思ったらNendoでブロックを生成する方法が必須となる。

2

いろいろ考えた結果、&block というプリミティブなキーワードを追加することにした。他に考えた案よりも、実装が簡単だった。

2

(NendoのlambdaはRubyのブロックとは仮引数の渡しかたが違うため、Nendo/no lambdaをそのままブロックとして渡すことができない)

2

&blockの構文は lambda と類似しており (&block (arg ...) body ...) のように "lambda"のかわりに"&block" と書くだけ。

2

上記のコードをNendoで書くとこうなる。

2
;; ファイルの1行目を読み込んで出力する
2
(.open "file.txt" (&block (f)
2
  (.puts (f.readline))))
2

 

2

Rubyでも別の書き方にすると、Nendoのコードと似た感じになるのはRubyに詳しい人ならご存知だろう。

2
#  ファイルの1行目を読み込んで出力する
2
open( "file.txt", &Proc.new { |f| 
2
  puts f.readline
2
} )
2

 

2

※ 他にも (& (lambda ...)) と書くとRubyのブロックに変換してくれるという案もあったけど、実装の簡単さと視認性が大きく変わらないという理由で上記のようにした。

2

 

2

sortライブラリを楽して実現

2

前からNendoのために自前でsortアルゴリズムを書くのはいやだなと思っていた。

2

せかっくRubyが組込みでsortを用意してくれているので、それを使わない手はない。かなりチューニングしてくれているハズだし。

2

今回、ブロック生成構文を使って sort と sort-by ができた。

2
(define (sort lst . cmpfn)
2
  (let1 cmpfn (get-optional cmpfn #f)
2
    (to-list
2
     (if cmpfn
2
         (lst.to_arr.sort (&block (a b) (cmpfn a b)))
2
         (lst.to_arr.sort)))))
2
2
2
(define (sort-by lst keyfn)
2
  (to-list
2
   (lst.to_arr.sort_by (&block (item) (keyfn item)))))
2

 

2

まとめ

2
(&block (arg ...) body ...) というRubyのブロックを生成できる構文を用意した。
2
それを使ってNendoのsortライブラリはRubyのsortをそのまま使えた。
2

 

2

いろんなライブラリで、もうちょっと&blockを試してみて、問題なさそうならこの仕様で行く予定。

2

 

0

comment (disabled)

2

2

 

2

 

3

kiyoka.2010_07_29[仕事術] 『スタートダッシュ型仕事術』を見習いたい

3
 FpPHju
3
 引用: Life is beautiful: スタートダッシュ型仕事術:実践編EXT
3
   まず最初に言っておくと、「仕様がころころ変更になる」のはソフトウェア
3
 の宿命。どんなに頭の良い人が設計しても、「作ってみなければ分からない」
3
 「使ってみなければ分からない」ことはどうしてもあるので、「アーキテクチャ
3
 の大幅な変更」「ユーザーインターフェイスの大幅な変更」があるのはあたり
3
 まえ。
3
   ぜひとも認識して欲しいのは、「だからこそスタートダッシュで肝となる部
3
 分を一気に作って、早めに(仕様変更が必用かどうかの)見極めをする必用が
3
 ある」という点。特に「作って見なければ分からない」部分の見極めのための
3
 コーディングの時間を惜しんでいては、良いものは作れない。紙の上での設計・
3
 仕様書作り・会議に時間をかければかけるほど、そのかけた時間そのものが足
3
 かせになって柔軟な発想ができなくなる。それよりも、発想が浮かんだ時点で
3
 実際にコードを書いてみて「これで行けるかどうか」の実感をつかむことが大
3
 切。
3

(略)

3
 
3
  この段階で大切なことは、
3
 
3
   * 書いたプログラムを捨てることを恐れないこと
3
   * この段階で仕様書を書くことは時間の無駄と認識すること
3
   * 細かなことを無視して、一番難しい部分を最初に作ること
3
   * できるだけ早く、一気に「見極めが出来るところ」まで持って行くこと
3
   * コードは多少汚くても良いが、モジュール間のインターフェイスだけはキチンと設計すること
3
 
3
 の5つである。とにかく、このプロセスの目的は、「このアーキテクチャのままで製品化できるのかどうか」「想定し
3
 ているユーザーシナリオに合致したものができるかどうか」の「見極め」をすることなので、それ以外のこと(たとえ
3
 ば仕様書を書く、ミーティングに出席する、ユーザーインターフェイスの細部を決めるなど)に時間を使わず、とにか
3
 く一日でも早く「見極め」ができるところまで持って行く。
3

 

3

製品化されるプロジェクトでなくても同じだな...

3

プロジェクトの一番のキモになる部分が自分の想定したイメージ通りかを先に試す必要がある。

3

プライベートのプロジェクトでは自分の時間を投資しているわけだから、キモが実現出来るかどうかを早目に見極めて続けるか/やめるかを速い段階で決断しないといけないわけだし。

3

 

3

この記事を読んで、早速Nendoの開発の優先順位が変わった。

3

define-rulesとかどうでもいいので(誰がいつやっても実装できるに決まっている) 先にRubyとの連携部分をもっと詰めるべきだと思った。

3

 

3

よし。いろんなgemsを使ってみて問題点を洗いだし、先に解決していこう。(そのためにはそれなりに使えるツールを作る必要あり?)

3

SRFIライブラリの充実とかは後でじっくりやればいいのだよな。(util.listだけは普段必要としているので先にポーティングするかも)

3

 

0

comment (disabled)

3

3

 

3

 

5

kiyoka.2010_07_27[Debian] Debian lenny(5.0)にCUI環境のDropBoxをインストールした

5

Sambaでファイル共有していた頃と比べて格段に便利になった。

5

自宅の2台のMacとDebian Linuxのサーバー1台のファイル共有がシンプルになった。(それにiPod touchも共有できるのでさらに便利)

5

Sambaだと、サスペンドするとmount状態が解除されるのがめんどうだったのと、MacBook Proを持ち出した時はオフラインなのでそもそも共有ができないのが不便だった。

5

今後、自分のデータはどんどんDropBoxに置くことになりそう。

5
 officiallogo-50 +  dropbox_icon_128
5

 

5
 参考記事
5
 CUI only dropbox for all Linux OS
5
 http://wiki.dropbox.com/TipsAndTricks/TextBasedLinuxInstall
5

自分でリンク先の手順をやった時、途中でX11のGUIが出てきてDropBoxのパスワード認証をする必要があった。

5

それ以外はリンク前の手順どおり。

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2010_07_26[本] 『計算論 計算可能性とラムダ計算』を借りる

5

図書館で借りれた。別の市町村にしかなかったので、図書館が又貸ししてくれた。

5

そのおかげで、2週間での返却制限が付く。

5

 

5

しかし、こんな数式だらけの本を2週間しか借りられないのはつらいなあ。

5

たぶん、買うべきなんだろうけど。

5
 4764901846  計算論 計算可能性とラムダ計算  高橋 正子
5

 

5

中をちらっと見てみたが、これを学習したからといって、役に立つかというと微妙かも。

5

自作処理系がβ簡約とかの最適化を真面目にやるならたぶん役に立つだろう。

5

Haskellはあまりやったことが無いので間違っているかも知れないが、Haskellとかでバリバリプログラミングする人はこの本でラムダ計算を学習しておくと、Haskellらしいコードが書けるのかも…

5

 

5

買って積読しておくよりも、今回は流し読みして必要になるまで買わないことにしよう。

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2010_07_25[Nendo] Nendo 0.3.3 リリース

5

Nendo 0.3.3をリリースしました。(リリースノート: Nendo.ReleaseNote)

5

rubygems_icon_128

5

あいかわらずチュートリアルと、リファレンスマニュアルはまだ書きかけですが...

5

Nendo.Tutorial 

5

Nendo.ReferenceManual 

5

 

5

今回の目玉はsrfi-1のサポートと末尾再帰最適化でしょう。

5

SRFI 1: リスト ライブラリEXTはScheme単体では貧弱なリスト処理ユーティリティを増強するものです。

5

Scheme処理系のほとんどは、このライブラリをサポートしており、これが無いとそもそも処理系を使ってもらえないほどの必須ライブラリと言えます。

5

 

5

末尾再帰最適化は、再帰的に記述したコードのスタックオーバーフローを軽減する機能でR5RS Schemeでは必須とされている機能です。それがNendoにも入りました。

5

例えば、以下のコードはスタックオーバーフローせず無限ループします。

5
(define (foo)
5
  (foo))
5

 

5

今後はR5RSのdefine-syntax define-rules等の健全なマクロを実装して、より多くのSRFIライブラリをサポートしていく予定です。

5

Nendoは独自仕様のLisp処理系を作ろうとして開発を始めましたが、Scheme(R5RSですが)を参考にすればするほどSchemeはシンプルにまとまった良い仕様だということが分かってきて、現在はSchemeにどんどん近づいていっています。

5

将来的にはRuby gemsを簡単に利用できるSchemeライクな言語という位置付けになりそうです。

5

 

5

普段の利用シーンとして、ハイパフォーマンスなプログラムを作りたい場合はGaucheを、Ruby gemsで見つけたライブラリを使って手早くツールを書きたい場合はNendoを使うという風に、二つの処理系をスイッチしてもあまりストレスが無いようにできればいいなあと思っています。

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2010_07_23[サーバ管理] 自宅サーバマシンが復旧した

5

結局原因がわからず仕舞い。

5

Linuxカーネルを 2.6.8 から 2.6.34 に上げたらオンボードのNICを認識した。

5

ただ、最新のカーネルはUSBストレージをちゃんと認識してくれたり、plug-and-playまわりが進化しているので使いやすくなった。

5

区切りとして、一応USBハードディスクにファイルシステムをdump中。なんと /home パーティションの推定完了は35時間後だそうな。

5

サーバにモニタをつないだ状態にしているし、これを機に Debianを 4.0 から 5.0 (lenny) にアップグレードしておこうかな。

5

lennyにすると「Dropboxが簡単にインストールできる」とか「security fixが早い」とかいろいろ良いことがありそう。

5

 

5

P.S.

5

先程までブログコメントを入力しようとするとエラーになっていた。環境設定忘れを正し、復旧した。

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2010_07_22[サーバ管理] 自宅サーバマシンが起動しなくなって、考えたこと

5

このブログをホスティングしているサーバなので、しばらくブログが503になっていた。503といってもリーバイスでなくてhttpのリザルトコードのほうね。

5

2年に一度くらい、マザーボードやハードディスクが故障する。

5

大概マザーボードが故障することが多く、2年毎にマザーボードを新調することになる。(今回はオンボードのNICが死んだ模様)

5

マザーボードを買うと、CPUソケットが新世代になってしまっているので、手持ちのCPUは捨てないといけいない。メモリも同様。

5

結局2年に3万円ほどの出費と手間がかかっているのが現実なので、もうどこかのVPSでホスティングするという選択肢も考え中。

5

 

5

やっと2年で3万円くらいで借りれるVPSが出てきたので、Kahuaだけを動かすならそちらに載せ替えても良いかな。

5

ファイルサーバはDropbox、メールはGmail、自分のこれまでのデータはMacBook Proに入れるようにすれば、もうLinuxサーバは不要なのかも。

5

なんかクラウドって便利だなぁ。

5

 

5

ただ、その反面、そのサービスが終了したらオシマイというリスクもあるのでそこは考えようだなぁ。

5

それに、自分でサーバー維持してると、サーバーが落ちたタイミングで、障害解析したり最新のLinux Kernelやディストリビューションにアップグレードしたりしてノウハウが更新できて良い面もある。

5

そんなサーバー周りのノウハウが役に立つかはわからないけど、実際に自分でやっておくと仮想化されたインフラを使う時、肌感覚として知っておくのと知らないのでは大きな差になるんじゃないかな。

5

 

5

そんなこんなで、迷いつつ今回はサーバーを新調せずになんとかする方法を調査中だったりする。

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2010_07_12[Life] 電動アシスト自転車買った

5

この自転車を買った。

5

color_zoom_04  ヤマハ パス リトルモアリチウム 【2010年モデル】

5

2010年モデルを買ったので、最大3分の2まで電動モーターがアシストしてくれる。(自分の脚力は3分の1しか使わなくて良い)

5

ほとんど自分の脚力を使わないので、まるでスクーターに乗っているような感じ。

5

前カゴに乗った2歳児のR君も鼻歌混じりでルンルンで楽しそう。自転車大好き。

5

 

5

買った次の日は調子に乗って、坂道を登りまくっていたらさすがに少し筋肉痛になった。

5

電動アシストでない自転車の時は、坂道が来たらあきらめて歩いていたので、筋肉痛にはならなかった。

5

??? 何かオカシイ気もするが...

5

これでちょっと遠くの公園に行くにもストレスが無くなったぞ。

5

梅雨が開けたら本格的に活躍しそう。

5

 

0

comment (disabled)

5

5

 

5

 

4

kiyoka.2010_07_08[Nendo] srfiのポーティング(2)

5

私がRubyで書いているLisp方言、 Nendoについて。

5

 

5

Olin Shiversさんのリファレンス実装のポーティングの続き。

5

call-with-current-continuation(継続)を使わない様に書きなおした。

5

ちゃんとソースコードを読んだら、call-with-current-continuationが使われている理由は、map系関数の高速化の為だった。

5

null-listが渡されたら、早めに処理を中断してムダな計算をしないようにするため。

5

そうと分かれば、書き換えは簡単。

5

しかし、テストスイートをどうやって用意するかが問題だ。

5

他の処理系から頂戴して来たいがライセンスとかがあるのでちょっと選別しないといけない。

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2010_07_05[Nendo] srfiのポーティング(1)

5

私がRubyで書いているLisp方言、 Nendoについて。

5

 

5

srfi-1のポーティングに挑戦中。

5

Olin Shiversさんのリファレンス実装はsyntax-rulesが使われていないが、call-with-current-continuation(継続)が使われている。

5
 リファレンス実装の情報はこちら: SRFI 1: List LibraryEXT
5
 そして、ソースコードはこちらEXT
5

これを、継続を使わない形式に書きなおしていく予定。

5

継続が使われている理由を推測すると、おそらくmap関数などに長いリストを渡してもスタックオーバーフローしないようにしているのだろう。

5

mapが一つのリストを受けとった場合については、末尾再帰で書くのは簡単だけど、複数のリストを受けとった場合も考慮すると、継続なしで効率の良いコードは書けない気がする。(セルの大量コピーが発生しても良いなら書けるかも)

5

Nendoについては、セルの大量コピー版でいくか...

5

 

5

srfi-1以外についてはNendoはsyntax-rulesが未実装なので、syntax-rulesを先にサポートする必要が有りそう。

5

外の処理系のsyntax-rulesの実装を見てまわっているが、Scheme自身で書かれていたり(chibi-scheme)、Rubyで書かれて言たり(heist)、いろいろだ。(Gaucheは何で書かれているのか読み切れなかった。どこに有るのか見つけられなかった。Gaucheはチューニングの工夫が入りすぎていて、簡単にソースが追えないなあ...)

5

それにしても、Scheme処理系の実装方法の幅は広いなあ。いろいろソースを読むのも楽しい。

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2010_07_02[Nendo] 高速化のアイデア

5

私がRubyで書いているLisp方言、 Nendoについて。

5

 

5

関数呼び出しが重たいのがわかっている。

5

 

5

例えば、現在のNendoは関数の引数が1個の時でも、次のような引数変換用のcallProcedure関数を通る。

5
 callProcedure( '関数名', @_func, Cell.new( 1 ))
5

 

5

これを

5
 @_func.call( 1 )
5

のように、目的のクロージャを直接呼びだす様にすれば、オーバーヘッドが無くなる。

5

 

5

これは計測の結果、ボトルネックだと確実に分かっている。

5

(例えば、fib(20)が10倍ほども高速化された)

5

先にsrfi-1等のポーティングをやってから取り掛かろう。

5

 

0

comment (disabled)

5