!kiyoka.blog.2009_05 RSSPLAIN

Related pages: !kiyoka.blog.list
355355555555555555555555555555550555555555555555555520555555555555555555555555555555555554055555555555555555555555555555555555555555555555555555555555555555555555055555555555055555555555555555555555555555555555555555555550555555555055555555555555555555555555555555555555555555555555555550555555555555555555555555555555555555555555555550155555555555555555505
3

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

5

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

5

kiyoka.blog_header 

3

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

5

5

 

5

 

5

kiyoka.2009_05_29[Ruby] Scheme脳に偏った変なコーディングについて

5

私はRubyでプログラミングする時、次の様にRubyらしからぬコーディングスタイルを取る。(仕事では同僚とコード共有するのであまりやらないけど)

5
  1210-1240955589bN31
5

 

5
1. return は書かない
5

最後の評価値がそのブロックまたはメソッドの戻り値なので、あえてreturnを書く必要なし。

5

 

5
2. 内部関数を定義する
5

methodの内側にローカル関数を定義したい時は lambdaを使って関数定義する。

5

どこかのrubyバージョンからdefをネストで定義できる様になったんだっけかな?

5

 

5
3. 配列に対しての破壊的操作を避ける。
5

このような書きかたをするなら

5
 newArr = []
5
 arr.each { |x|
5
  newArr.push( hoge( !x ))
5
 end
5

代わりにmapやselect等の高階関数を使って次の様に書く(関数型スタイル)

5
 newArr = arr.map{ |x| hoge( x ) }
5

 

5

たぶん 3番 は万人に許容されると思うが、1,2番 はダメという人もいるだろう。

5

昔あるお客さんが書かれたサンプルコードで 1,2番 が使われているのを見てうちの社員がうげぇーとなっていたっけ。

5

Javaのような平均的なプログラミング言語に慣れた人には、ちょっと受けいれられないのだろう...

5

そうそう、JavaScript + Prototype.jsの組合せでも同じようなスタイルでプログラミング出来るよ。

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2009_05_27[Lingr] LingrのGauche部屋の過去ログを整理して公開します

5

以前、『kiyoka.2009_05_19[Lingr] Lingrの過去ログの問題点』というエントリで書いた問題を解決したデータを公開します。

5

前に公開したファイルは同名のファイル名で上書きしたので、再ダウンロードしてください。

5

内容物の説明はtar.gzに含まれるREADME.txtに書いています。

5

 

5
 kiyoka.gzimage
5
 messages_of_gauche_room.tar.gz(XMLファイル)EXT
5
 md5.txt(同チェックサム値)EXT
5

 

5

他にも、Gauche部屋のHTMLコンテンツを再帰的に取得したものを以下のURLに展開しておきます。

5
 kiyoka.lingr_logo
5
 2009年5月までのGauche部屋コンテンツEXT
5

これで、Lingr.comのサイトがクローズしても過去の議論はGoogleで検索可能です。

5

 

5

いつかChatonEXTの過去ログとして復元できる時が来たら、XMLデータとニックネームのリストから復元しましょう。

5

 

2

COMMENTStevany

A pleasingly rational aenswr. Good to hear from you.

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2009_05_25[Lingr] さようならLingr、こんにちはChatonEXT

5

もっと早く書きたかったのだけど。なんとか5月中に書けた。

5

LingrというWebサービス終了した。ヒジョウに残念。

5
 LingrとRejawサービス終了のお知らせ:江島健太郎 / Kenn's Clairvoyance - CNET JapanEXT
5
 今回は残念なお知らせがあります。
5
 
5
 5月末をもって、LingrとRejawの両サービスをシャットダウンすることになり
5
 ました。いずれのサービスも、すでに新規サインアップは受付停止済み、5月
5
 15日までユーザデータのダウンロード依頼を受け付け、5月16日からは新規発
5
 言ができなくなり、5月末の完全停止までの間にデータをダウンロードしてい
5
 ただく段取りになります。
5
 
5
 今まで支えてくださったユーザの皆さんには、このような結末になってしまい
5
 本当に申し訳なく思っています。シャットダウンという最終決定を下すまでに
5
 は多少の猶予をいただき、営業譲渡などでサービスを存続させる方法も模索し
5
 ていたのですが、受け入れ先を見つけることができませんでした。
5
 
5

終了したのは、ビジネスという形態を取る以上避けられないと思う。

5

そんな中、shiroさんがChatonEXTという同様のサービス(というかオープンソースソフトウェア)を構築された。

5

shiroさんも書かれているかも知れないけど、Webチャットというものについて私も書いてみたい。(Webチャットとは、特別なクライアントソフトが不要なブラウザだけでチャットできるサービス)

5

LingrのようなWebチャットサービスでないとできないことはやっぱりあって、メーリングリストやTwitterやICRとは空気感がちょっと違う。

5

ユーザ登録なしでリアルタイム性があって、しかもみんな同じVIEWを見ているので長い議論もできる。TwitterではVIEWが違うのでまとまった議論は不可能だ。

5

IRCはクライアントが色々あったり文字コードが一意に決ってなかったり、敷居がちょっとだけ高い。

5

その点Webチャットは敷居が低い。Lingrはそれを気づかせてくれた。そして、私達は手放せなくなった。

5

江島さん、shiroさんありがとう。こんな形でWebチャット生まれ、そして使い続けられるとは思ってもみませんでした。ほんとうにありがとう。

5

 

5

P.S.

5

LingrからexportしたGauche部屋で議論された貴重な過去データは現在整理中です。そのうち公開します。

5

 

5

COMMENTMito Memel

Lingrもどき作ってみました。

http://www.cometeo.com/

まだ実験段階で不安定ですが、よかったら使ってみてください。

5

COMMENTkiyoka

Mito Memelさん、コメントありがとうございます。

早速cometeoのサンプルを使ってみました。

Lingrに続いていろんなWebチャットが生まれるのを楽しみにしています。

ところで、cometeoのサーバ側はどんな言語で書かれているのでしょうか。

5

COMMENTMito Memel

サーバはC++でhttpdごと書きました。

接続管理はnine、http周りはPOCO C++を使用しています。

同時接続数の問題に柔軟に対応できるのが利点ですが、

とってもめんどくさいのでフルスクラッチはあまりお薦めしません:-)

4

COMMENTkiyoka

C++ですかー。ツワモノでいらっしゃいますね。すばらしい。

これで性能問題はクリアできそうですね。

やっぱりなんでも一度はフルスクラッチでやってみるというのも勉強になりますよね。

私も見習いたいです。

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2009_05_19[Lingr] Lingrの過去ログの問題点

5

先日、Lingr.comからエクスポートしたXMLを公開したが、これだけでは過去ログとして情報が不十分であることが発覚した。

5

大きな問題は次の一点。『XML中のuser_idからnicknameが復元できない』ことである。

5
 以下messages-0018.xmlの抜粋
5
  <message>
5
    <timestamp>2009-05-03T13:30:49+09:00</timestamp>
5
    <user_id>2p5nzjurykD</user_id>
5
    <text>http://practical-scheme.net/chaton/gauche/</text>
5
    <id>66777672</id>
5
  </message>
5
  <message>
5
    <timestamp>2009-05-03T13:31:19+09:00</timestamp>
5
    <user_id>2p5nzjurykD</user_id>
5
    <text>"chatterie"は長すぎると思うようになったので"chaton"に改名。</text>
5
    <id>66777696</id>
5
  </message>
5
  <message>
5
   <timestamp>2009-05-03T13:31:20+09:00</timestamp>
5
    <user_id>2p5nzjurykD</user_id>
5
    <text>こねこ。</text>
5
    <id>66777697</id>
5
  </message>
5

exportできたデータは自分が出入りした部屋や、自分のプロフィール、そして自分がオーナーだった部屋(Gauche部屋のみ)だったので、自分のuser_idだけはわかるんだけど。

5
 [profile.xml]
5
<?xml version="1.0" encoding="UTF-8"?>
5
<profile>
5
 <description>Emacs大好きGauche大好きな人間です。
5
オールドタイプ向けWikiエンジン「OldType」を開発しています。
5
  http://oldtype.sumibi.org/
5
アカウントじゃんじゃん発行しますので、お気軽に書き込みお願いします。
5
5
他にも、Sumibi.orgという日本語入力サイトを運営しています。
5
  http://www.sumibi.org/
5
</description>
5
  <user_id>4vW0GrwN7Rs</user_id>
5
  <default_nickname>kiyoka</default_nickname>
5
</profile>
5

 

5

とりあえず、user_idの出現回数ランキングを作って、10回以上発言したユーザーのニックネームだけを復元するなどの次善の策でいこうかな。

5

念の為、wgetもしておこう。

5

Lingr.comは5月末に完全にシャットダウンしてしまうらしいので、それまでにやっとかねば。

5

 

5

追記:

5
 Gauche部屋のランキング作った
5
 全部で83ユーザーもいる。こりゃあ骨だわ。どうしようかな。
5
  18480     5huYmptY2Yv
5
  13320     fWgq83gLChj
5
   8444     j1gvh0f5Nfo
5
   8084     2p5nzjurykD
5
   7244     39rIGbmbyE8
5
   4488     iYcFe5YZunw
5
   3571     8JNdzMlduTh
5
   3220     4E0HliGiNxt
5
   2799     4vW0GrwN7Rs
5
   1548     lAk6wOyi1fb
5
    904     e9wcdQTvQVU
5
    343     jCoEIHEIcPj
5
    315     4sM3aIpdcfh
5
    297     fj79rE6EAdT
5
    272     1JwlElDyM7i
5
    264     g7uKV4HrnHk
5
    234     28bM9U5Z9k7
5
    162     7crvNIIAFrV
5
    132     iQsGKAxvt0b
5
    .
5
    .
5
    .
5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2009_05_18[Lingr] LingrのGauche部屋の過去ログをゲット

5

Lingr.comからエクスポートしたXMLをここに置いときます。

5
 messages_of_gauche_room.tar.gz(XMLファイル)EXT
5
 md5.txt(同チェックサム値)EXT
5

理想的にはchatonのGauche部屋の過去ログに変換できれば良いのだけど、まだchatonのデータにストレートに変換可能かどうか分からないため、とりあえず置いておきます。

5

Lingr.comが完全にシャットダウンしてしまうと過去ログを検索出来なくなるので、その時は困るかなあ。

5

だれか時間のある方、またはパワーのある方が別の形式に変換してくれれば有難いです。

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2009_05_13[Ruby][Nendo] Rubyのメソッドはファーストクラスオブジェクトだった

5

Yuguiさんのエントリーより引用

5
 ファーストクラスオブジェクトとしてのメソッド - 世界線航跡蔵EXT
5
 やー、Rubyのメソッドはファーストクラスですよ。返り値にできて、変数に格
5
 納して演算できて、引数にできるという意味では。
5
 確かに、RubyはPythonやJavaScriptやSchemeに比べると高階関数を陽に使うプ
5
 ログラミング*1 は不格好になる。Pythonなら簡単なのに、
5
   bound_function = obj.hoge
5
   bound_function(arg1, arg2, arg3)
5
 Rubyは余計なメソッド呼び出しがくっついて不格好だ。
5
   method = obj.method(:hoge)
5
   method.call(arg1, arg2, arg3)
5
 私もこの点が気にくわなくてまつもとさんに「メソッドがファーストクラスだっ
5
 たらいいのに」と言ったことがある。でも、まつもとさんの考えではすでに
5
 ファーストクラスということだった。
5

 

5
 名前空間
5
 もう細かいところは記憶が定かでないので、以下は私の理解になる。メソッド
5
 はただ、名前空間が違うんだ。
5
 既存のメソッドと同名の識別子に値を代入すると、それはローカル変数の初期
5
 化になる。けれども、メソッド呼び出しでは依然として元のメソッドを参照す
5
 る。
5
   p = 1
5
   p p #=> 1
5

 

5

Matzさんのブログより引用

5
 Matzにっき(2008-02-01)EXT
5
 Lisp-1とLisp-2
5
 ここで説明もなくLisp-1とかLisp-2とか書いたが、そういえば日本語であまり
5
 この用語を見たことがないので補足しておく。
5
 基本的に名前空間が一つしかないLispのことをLisp-1と呼ぶ。たとえばSchemeがそう。
5
 (略)
5
 Lisp-1とLisp2の区別はLisp以外のプログラミング言語でも存在する。たとえ
5
 ば、PythonやJavaScriptはLisp-1であり、 RubyはLisp-2である。
5

ということで、RubyはLisp-2だから識別子に入れた手続きを呼びだすために callメソッドがが容易されているという理解。

5

 

5

これが分かれば、NendoからRubyのメソッドを呼びだす文法が正しく定義できそうだ。

5

もうちょっとでメソッドと識別子に登録されたProcオブジェクトは全く別物だと勘違いするところだった。

5

 

5

こういうエントリーもある。

5
 Rubyの呼び出し可能オブジェクトの比較(1) - 世界線航跡蔵EXT
5

Nendoの開発にはドンピシャの情報。Yuguiさんすばらしい。ありがたや。

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2009_05_12[Git] NendoGitHubEXTに移してみた。

5
 こちら
5
 kiyoka's nendo at master - GitHubEXT
5

CodeReposに置いていあるNendoのソースはそのうち消す予定。

5

Emacs用のgit.elを試して納得したら心おきなくこのWikiシステム兼ブログシステムを(OldType)もCodeReposからGitHubに移そうかな。

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2009_05_09[Nendo] undefined variable エラーをRubyの例外システムの上に実装してみた

5

NendoはせっかくRubyの上に構築している言語なので、エラー処理などもRubyの例外処理をそのまま使って実装してみた。

5

もちろん、バックトレースの情報にもエラーが起きた行番号を埋めこむ処理も入れた。

5

以下は、nendo処理系の動作結果 ( rubyExp=<<< >>> という部分はトランスレートされた後のRubyコードをデバッグ表示したもの )

5

 

5
 xという変数はどこにも束縛されていない(未定義)のためエラーとなる。
5
 Rubyの例外システムをそのまま使っている。
5
$ ./nendo
5
nendo> x
5
          rubyExp=<<< begin x ; rescue NameError => __e ; __e.set_backtrace( ["(stdin):1"] + __e.backtrace ) ; raise __e ; end >>>
5
undefined local variable or method `x' for #<Evaluator:0x75904>
5
        from (stdin):1
5
        from (stdin):1:in `initialize'
5
        from ./nendo.rb:433:in `initialize'
5
        from ./nendo.rb:871:in `new'
5
        from ./nendo.rb:871:in `initialize'
5
        from ./nendo:10:in `new'
5
        from ./nendo:10:in `main'
5
        from ./nendo:19
5
5

 

5
 xを束縛する
5
nendo> (define x 1)
5
          rubyExp=<<< x = 1 >>>
5
1
5

 

5
 その後は例外が発生しない
5
nendo> x
5
          rubyExp=<<< begin x ; rescue NameError => __e ; __e.set_backtrace( ["(stdin):3"] + __e.backtrace ) ; raise __e ; end >>>
5
1
5

 

5

できれば、このままあらゆるエラー処理をRubyの例外に載せることができればいいのだけど...

5

やってみないと分からないというのが正直なところ。

5

たぶん誰かは既に同じ様なことをやってみてるんだろうなぁ。

5

でも、そういう、順を追って問題にぶつかりながら解決策を考えるのも、オレ言語を実装する楽しみの一つだと分かってきた。

5

オレ言語はいろんな事を考えるキッカケを与えて来れる良い学習方法だと思う。

5

 

5

まだまだ、Matz氏のいう『コンピュータサイエンスの総合芸術』という域まで達していないけど、多くの事を同時に考えてバランスを取る大変さが分かって来た気がするぞ。

5
 まつもとゆきひろのハッカーズライフ:第7回 言語の重要性その2 (2/2) - ITmedia エンタープライズEXT
5
 しかし、自分言語を作ることで何かメリットがあるのでしょうか?
5
  ええ、あるんです。
5
  1つ目のメリットは、言語処理系というものがプログラミングの中でしばしば
5
 登場するテクニックの集合体であることです。例えば、設定ファイルを読み込
5
 むルーチンなどは、言語処理系の字句解析、構文解析そのものです。また、言
5
 語処理系はコンピュータサイエンスの総合芸術ですから、処理系を実装するた
5
 めに用いたテクニックはあらゆるプログラミングに応用できます。
5
  また、良い言語をデザインしようという行為は、人間の気持ちをより深く考
5
 えることでもあります。つまり、インタフェースのあるべき姿について、よ
5
 り深い考察を行うことでもあるわけです。自分言語を作る2つ目のメリットと
5
 しては、言語レベルでの使い勝手を考えることで、プログラムの使い勝手に
5
 関するより深い経験と知識を身に着けられることがありそうです。
5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2009_05_04[Ruby][RSpec] RSpecでraise_errorマッチャの使いかたを勘違いしていた

5

RSpecのexpectationの書き方で、気を付けないと行けないところ

5

 

5

raise_errorマッチャはProcに対してのみ有効

5

『あるexampleで例外TypeErrorが出ること。』という仕様を記述する際、『shouldを付ける対象はProcでないといけない』ということは簡単に間違えそう。

5

 

5

ある関数でTypeErrorが出ることを宣言したい場合、次の例は間違い。

5
 @anObj.aMethod.should raise_error( TypeError )
5

このままでは、RSpecのspecコマンド本体が例外で止まるので、次の様にしていた。

5
 begin
5
   @anObj.aMethod.should raise_error( TypeError )
5
 rescue
5
 end
5

こうすることによって、エラーがでなくなり、テストにパスしていたいのでOKだと思ってしまっていた。

5

でも実は、ちゃんと検査できていなかっただけ。

5

 

5

正解はコチラ

5
 lambda{ @anObj.aMethod }.should raise_error( TypeError )
5

Procのインスタンスにするためにlambdaで囲っている。

5

この場合、 @anObj.aMethodが TypeError以外の例外をraiseしたり、何も例外をraiseしなかった場合、ちゃんとfailしてくれる。

5

 

5

(TestDriven Development:TDD)の基本

5

上の例はちゃんと失敗するところを見届けてなかったからこんな勘違いをしたのだ。

5

 

5

TDD の進め方と原則を引用しておきます。ちゃんと守らないと。

5
 Rubyist Magazine - スはスペックのス 【第 1 回】 RSpec の概要と、RSpec on Rails (モデル編)EXT
5
 TDD の進め方と原則
5
 TDD の進め方はいたって簡単です。TDD は以下の 3 つのステップから構成されます。
5
  1. プロダクトコードを書く前にテストコードを書き、それが失敗することを
5
     確認する (レッド)
5
  2. テストに成功するようにプロダクトコードを書く (グリーン)
5
  3. プログラムの振る舞いを変えないように、プロダクトコードの重複などを
5
     整理する (リファクタリング)
5
  4. (最初に戻る)
5
 
5
 「レッド」や「グリーン」といった表現は、いわゆる xUnit*1 の実行結果表
5
 示バーの伝統的な色づかいに由来しています。RSpec でもレッド/ グリーンと
5
 いった色使いの伝統が踏襲されています。
5

 

5

ところで、Nendoの開発はspecファイルをガシガシ書き足しているところだが、まだまだNendoを書き捨てスクリプティングに使えるようになるまでは先が長そう。

5

7月のShibuya.lispのLTをする段階で一応ダウンロードして遊べるようにしときたいなぁ。

5

そのために、シンタックスエラーとかランタイムエラー表示まわりを強化しようと頑張っているところです。

5

プログラミング言語処理系はこういう地道な作業が山積みで骨が折れる。

5

 

0

comment (disabled)

1

 

5

5

 

5

 

5

kiyoka.2009_05_03[本][オープンソース] GitをMacにインストールした

5

WEB+DB PRESSのGit特集を読んでGitを使ってみる気になった。

5
 477413838X  WEB+DB PRESS Vol.50: WEB+DB PRESS編集部
5

 

5

NendoCodeReposからGitHubEXTに移してみようかなと思う。

5

Subversionと違って、オフラインでもコミットできるので、カフェでプログラミングにも有利だ。

5

これは育児の合間の時間でもできるな。

5

 

5

追記:

5

結局、git version 1.6.2.4をソースからインストールした。

5

自分のMac(PowerBook G4)はCPUがIntelではなく、PowerPCなので、本家サイトに置いてあるIntel専用バイナリが使えない。

5

もうそろそろ、PowerPCは取り残される時代が来てしまったかな。

5

YouTubeがHQをサポートした頃から動画再生処理も重く、コマ落ちが酷くてまともに觀れないし、いろいろ不便になってきた。

5

故障でもしたら買いかえるんだけど。

5

 

0

comment (disabled)

5