トップ 最新 追記

Route 477



2007-01-04

[ruby] rubyzip

RubyでZIPファイルを扱うためのライブラリ。zlib.soを使用。

Rubyの添付ライブラリでもgzipは扱えるんですが、 zipは扱えないんですよねぇ。 アルゴリズムは同じzlib なんだから、rubyzipも標準添付だったら良いのに。

インストールはgemかsourceforgeから。

[ruby] Exerbコアのメンテナ決まる

ruby-list:43082 で募集されていたコアのメンテナですが、 artonさんに決まったようです(exerb-dev:0499〜)。

[javascript] dp.SyntaxHighlighterが重過ぎる件

repotch(年末に作り始めたリポジトリブラウザ)にdp.SyntaxHighlighter を突っ込んでみたんだが、1000行クラスのソースコードをハイライトしようとすると遅すぎてブラウザが固まる…。orz まぁ、ブログに貼り付ける短いコードとかを想定してると思うので仕方ないのだけど。

なんかハイライト用の良いライブラリないですかね?

  • いろんな言語に対応している
  • Rubyから使える

という条件を満たせばわりと何でも良いんですが(あ、できればインストールが簡単な方が良いかも)。

[rskit] Ruby/SDLスターターキット 1.2.0b

サイロスさんに指摘されていたi386-mswin32/以下のファイルが読み込めない件について、修正版をリリースしました。 「年内に出す」とか言ってたのに遅くなってすみません。

1.2.0aでは再配布はファイルを全部コピーしてもらう予定だったので「通常版」と「特盛版」に分けていたのですが、 1.2.0bでは後者に一本化しました。

そういうわけで、次のリリースではexe生成器が同梱される…予定です。

本日のツッコミ(全2件) [ツッコミを入れる]

tokuhirom [langscan? http://gonzui.sourceforge.net/langscan/index.htm..]

yhara [gonzuiに使われてるやつですよね。 ちょっと触ってみます。ありがとうございます。]


2007-01-05

[tDiary] 選択されたセクションのタイトルだけ表示させたい

ということで、highlight.rbをONにしてみた。


2007-01-06

[Ruby/SDL] Ruby/SDL Users

Ruby/SDLに関するWikiを置いてみました。Tipsとか、Ruby/SDLで作られたゲームの紹介がメインになる予定です。 あとは「逆引き」とかやりたい。

まだ「あとで書く」なページが多いですが、Ruby/SDLはリファレンス が非常に充実しているのでこれを読めばなんとかなると思います^^;*1

*1 英語版もあるよ! http://www.kmc.gr.jp/~ohai/rubysdl_doc.en.html


2007-01-07

[ruby][softs] crb (Clipboard Ruby)

crb(Clipboard Ruby)は、クリップボードに貼り付けられた文字列をRubyスクリプトとして実行するものです。

電卓などとして利用できます。慣れれば電卓アプリケーションを使うより便利です。

「Time.now」という文字列をCtrl-CしてCtrl-Vすると、「Mon Jan 08 01:42:55 東京 (標準時) 2007」になる(笑)。おもすれー。

scim-rubyのWindows版として使えるかも?

[mac] Mac miniを手に入れた

ひょんなことからMac miniを入手しました。自宅サーバでも始めるかなぁ。

とりあえず、チェックボックス一つで外からSSH接続できるのには驚いた!Mac恐るべし。

メモ

  • USBキーボードが必要(家にはPS/2しかなかった)
  • 無線LAN内蔵なのでLANケーブルは不要

[ruby] 最近のRSpecはすごいね

すごいところ:

ドキュメントが充実した

英語ですけど。http://rspec.rubyforge.org/

いちいちクラス作らなくてよくなった

spec_archiver.rbに

context "Archiver" do
  setup do
    @archiver = Archiver.new
  end
  specify "should unpack a zip file" do
    @archiver.unpack "sample.zip"
    File.should_exist "sample.txt"
  end
end

とか書いておいて、

$ spec spec_archiver.rb

のようにして起動する。requireもclassも不要!

  • あと失敗したときのエラーメッセージが "Archiver should unpack a zip file" みたいになるので非常に分かりやすい
  • -cオプションを付けると色つきになるぜ

より英文に近くなった

例えば「obj.items.size.should == 2」が、「obj.should_have(2).items」 みたいに書けるらしい

他にも上の例の「File.should_exist(path)」*1とか、 method_missingを駆使していろいろと。

Mockが便利

my_mock = mock("foo")
my_mock.should_recieve(:bar).and_return(3)

のようにすると、「my_mock.bar」が3を返すようになる。

あとメソッドの呼ばれるべき回数や順序を指定できたりけっこう高機能。

既存のオブジェクトにshould_receiveとかを指定することも可能(Partial Mock)。

呼ばれ方をチェックしないでいいときはMethod Stubを使う。

my_mock.stub!(:bar).and_return(3)

まとめると

触ったときからいろいろと進化している模様。 BDDはTDDと比べて云々…といった話を抜きにしても、単純にツールとしてTest::Unitよりも「楽」に使えるので もっと広まって欲しい。

*1 一般に obj.pred? が obj.should_pred に対応する

[hiki] Wikiにもtrackfeedのリンクを置いてみた

tDiaryとHikiだけで運営してると楽でいいですな。

Hikiで生HTMLを書く方法がわかんなかったので(というか安全上できないんですよね)、プラグイン(というほどのものでもないが) を書いた。

trackfeedプラグイン


2007-01-08

[softs] F11で全画面

SleipnirにはF11で全画面モードになる機能がある。こんなんいつ使うんだ?と思っていたが、 ノートパソコンのような狭い画面だと便利なことに気付いた。 特に今この瞬間は38個のタブが6段に渡って表示されているので狭いことこの上ない。 が、F11を押せばなんともないぜ!(畳めよ)

いや、いつもはタブは4段までに抑えてるんだが…、ちょっと複雑な調べ物をするとすぐタブが一杯になってしまう。 だいたい人間がいちいちタブを閉じないといけないのが面倒だよね。経過時間に応じて自動的に「揮発」するような ブラウザがあればいいのかも。

[server][memo] ポート開け

80番通すのにえらい苦労した。ブロードバンドルータと無線LAN用ルータの2段構成になってるからなんだが…。

結局

  1. ブロードバンドルータのポートマッピングで、80番に来たパケットを無線LANルータに
  2. 無線LANルータのポートマッピングで、80番に来たパケットをサーバマシンに

という風にすればよかったみたい。

もちろんパケットフィルタで外から来るパケットを弾いている場合は80番だけ通すようにしないといけないが、 今回はどちらのルータも「指定したパケットのみを弾く」ようになっていたので設定は変更なし。

それって危険なんじゃね?と思ったんだが、

家庭向けBBRのフィルタリングポリシーは、基本的に暗黙のAllowになっている。

[サーバ公開のための設定 より引用]

らしい。まぁどのマシンに転送すればいいのか分からんので捨てられるから安全、ということか。

チェックは以下のcgiを使うのが便利(LAN内からグローバルIPを指定しても見えないので)。


2007-01-09

[softs] タブ閉じられない症候群

昨日の続き。

要するにタブ(とかウィンドウとか)を閉じないのは、一回閉じるともう一回開けるのが面倒だからなんだよな。

閉じるときに「あとで使う」みたいなマークを付けられると良いのかも。

[softs] firefoxで

Shift+クリックで新しいウィンドウが開くのはなんとかならんのか?(なんのためのタブブラウザかと…)


2007-01-11

[zsh] 技術メモ帳 - [unix]zshのurl-quote-magicでURL文字列を自動エスケープ

便利まくる!

autoload -U url-quote-magic
zle -N self-insert url-quote-magic

「no matches found:」ともこれでおさらばだぜ


2007-01-12

[softs] fub使ってみた

メニューの開き方がわかるまでに40分かかったorz

[softs] fub最初の一歩

Windows用のタブブラウザfubの導入方法。

特徴

  • シンプルながら高いカスタマイズ性
  • 多段タブ(グループタブ)が実装されているので、タブを開きまくっても大丈夫
  • grep検索とかインクリメンタル検索とか
  • お気に入りはIEと共通
  • 「しいて挙げれば起動が遅いです。」だそうです。

ダウンロード

公式サイトの「導入方法」から fub_net_full.zipをダウンロード。

インストール

解凍するだけ。

初期設定

起動すると、メニューバーがないのにびっくりするかも知れません。fubではツールバーの青いアイコンからメニューを開きます。 その隣(★)がお気に入り、その隣(時計)が履歴、その隣がエクスプローラバーの表示/非表示です。

fub menu

とりあえず最低限の設定を済ませてしまいましょう。

ツールバー
表示→ツールバーから表示するツールバーを選択しましょう。
プロキシ
ツールバーの緑の三角マークをクリックすると、プロキシのON/OFFができます(明るい緑のときがON)。右クリックするとプロキシのアドレスを設定できます。
マウスジェスチャ
オプション→マウスジェスチャの設定 から。「←で戻る」とか「↓で閉じる」とかそういうやつです。
タブ
F4キー(またはオプション→設定)で設定画面が開きます。タブ→新規タブ のページで、「新規タブをどこに追加するか」「タブを新しく開くかどうか」「開いたタブをアクティブにするかどうか」を設定しましょう。
グループタブ
デフォルトではOFFになっています。F4キーで設定画面を出して、グループタブ→表示 からONにできます(再起動が必要)

とまあとりあえずこんなところで。より詳しいことはヘルプをどうぞ。

[javascript] JavaScriptの簡易プロファイラ(非prototype版)

http://d.hatena.ne.jp/llamerada/20050919/1127096571 がうまく動かなかったので、 prototype.js非依存にしたバージョンを作ってみた。

Array.prototype.sum = function(){
        for(var i = 0, sum = 0; i < this.length; i++){
                sum += this[i];
        }
        return sum;
}
Array.prototype.mean = function(){
        return (this.length > 0) ? (this.sum() / this.length) : 0;
}
Array.prototype.max = function(){
        if(this.length == 0){
                return 0;
        }
        for(var i = 1, max = this[0]; i < this.length; i++){
                if(this[i] > max){
                        max = this[i];
                }
        }
        return max;
}
Array.prototype.min = function(){
        if(this.length == 0){
                return 0;
        }
        for(var i = 1, min = this[0]; i < this.length; i++){
                if(this[i] < min){
                        min = this[i];
                }
        }
        return min;
}

function Profiler() {
        this.keys = [];
        this.records = {};
}
Profiler.prototype.observe = function(object, name){
        name = name || "Method";
        for (property in object) {
                if(typeof object[property] == "function"){
                        var key = name + "::" + property;
                        this.keys.push(key);
                        this.records[key] = [];
                        object[property] = function(__method, __timeRecord){
                                return function(){
                                        var start = new Date;
                                        var rv =  __method.apply(this, arguments);
                                        __timeRecord.push( (new Date) - start);
                                        return rv;
                                }
                        }(object[property], this.records[key])
                }
        }
}
Profiler.prototype.result = function(){
        var out = []
                for(var i = 0; i < this.keys.length; i++){
                        var rs = this.records[this.keys[i]];
                        out.push("<td>"+ this.keys[i] +
                                        "</td><td>count</td><td>" + rs.length +
                                        "</td><td>total</td><td>" + rs.sum() +
                                        "</td><td>mean</td><td>" + Math.floor(rs.mean() * 10) / 10 +
                                        "</td><td>max</td><td>" + Math.floor(rs.max() * 10) / 10 +
                                        "</td><td>min</td><td>" + Math.floor(rs.min() * 10) / 10 + "</td>"
                                );
                }
        return "<table><tr>"+out.join("</tr><tr>")+"</tr></table>";
}

単純に書き換えただけですね。あとresultをテーブル形式にした。

使い方は

p = new Profiler;
p.observe(ClassA.prototype);
p.observe(ClassB.prototype);
//重たい処理
document.write("<div align=left>"+p.result()+"</div>");

とか。


2007-01-14

[hiki] スパムきた

Wikiの方のページがSPAMにやられた。しかもページの新規作成じゃなくて、編集の方。

バックアップを取ってなかったので焦った。今回はgoogleキャッシュから拾えたからいいけど、 凍結するかsvnバックエンド使うかなんかせんとなぁ。

[repotch] ツリービュー

ディレクトリ構造をツリー表示できるようになった。実装はYahoo UI Libraryのtreeview + Ajax + JSONで。

が、IEだと挙動が不審(node.refresh()がちゃんと動いてくれない)。むう。

tree

javascriptがオフの環境のために、普通のテーブル形式の表示も実装する予定。


2007-01-15

[ruby] exe生成器

RubyスクリプトをExerb化すると、$0への代入がエラーになるようだ。

$0 = "main.rb"
packer.rb:36: $0 not initialized (RuntimeError)

これは仕様?

まぁ、今回は回避可能なんで大丈夫だが。

[ruby] exe生成器(2)

基本部分ができてきた。

  • packer.exe : 設定画面
  • packer.exe --mkexy : exyファイルの作成(内部利用)
  • packer.exe --exerb : exeファイルの作成(内部利用)

という感じで行く予定。

本日のツッコミ(全2件) [ツッコミを入れる]

shinpei@ec4.technowave.ne.jp [> まぁ、今回は回避可能なんで大丈夫だが。 どうやったんですか? 自分もExerbで同じエラーが出たんです。]

yhara [ごめんなさい、全く覚えてないです。 「$0に代入しない」とかだったかも。]


2007-01-17

[ruby] RubyのWWW::Mechanizeの日本語リファレンス

なんとなくWWW::Mechanizeが使いたくなったので、とりあえずリファレンスを訳してみた。

続きを読む

[tDiary] 褒めてはいけない

同じパターンのコメントスパムが一杯来るので、設定画面で「(Good|Cool) site. Thank(s| you)!!」みたいなのをはじくことにした。

具体的には

[\w\s]+ site\. Thank[\w\s]+

というパターンがコメント本文に含まれていると投稿できません。これ以降、このサイトを褒めたいときは別の表現を使用してください :-)

[rskit] 褒められた!

Ruby は...、なんだろう?とりあえず今弄ってる奴の元になったサンプルが素晴らしく理解しやすい&弄りやすかったというべきだろうか?

[http://d.hatena.ne.jp/isshiki/20070109/p4より引用]

実はあのサンプルの300行に3日くらいかけてたりするので^^; 非常に嬉しいです。 サンプルコードはこれから製作されるゲームに再利用される可能性が高いので気が抜けないですね。 部内でもDown!!のソースとかたまにコピペされてたりするし(※今から参考にするなら断然apple catcherの方がお奨めです)。

まぁプログラミング経験者にとって理解しやすいのと非経験者にとって理解しやすいのはまた違うかも知れません…ということで、 より初心者向けなソース解説をるびまに記事として書かせてもらえることになりました。 1ヵ月後くらいには掲載されると思うので乞うご期待。

あと 他言語から来た人のためのRubyメモ *1は Stringクラスの便利なメソッドについても書こうと思ってたんですが…、放置している間にRuby初心者で無くなってしまった…。 何を書こうと思ってたんだっけなぁ。

鉄は熱いうちに打たんと。

*1 最初は「Ruby初心者のためのTips」という名前だったが、あんまり適切じゃない気がして改名

[ruby] 知らなかった

File.readの実体がIO.readだったなんて!

リファレンスにFile.readの項が無かったんでびっくりした。こんなに良く使うのになぁ。

本日のツッコミ(全2件) [ツッコミを入れる]

isshiki [なんか雑記の一文に反応してくださったのに今更気がつきました。反応遅くなって申し訳ないです。 件のシューティングですが..]

yhara [いえいえ、昨日の晩に書いたところなんで全然遅くないですよ^^; シューティングの方、期待して待ってます。ソースについ..]


2007-01-18

[softs] Xうごいた

(前回までのあらすじ) scim-anthyのためにVMWare Player上のDebianをtestingに上げたyharaだったが、etchではXがx.orgに 変わっているという罠が!xinitしてもエラーで起動しないXをyharaはなんとかできるのか!?

結論から言うと

apt-get install xserver-xorg-input-vmmouse
apt-get install xserver-xorg-video-vmware

して、dpkg-reconfigure xserver-xorgしたらなんか動いた。選択肢を忘れちゃったので何の参考にもならん。すいません…。 基本的にわかんないとこはスルー(Enter)もしくは"vmware"とか。

参考:

ちなみにscimの起動にはまだ成功していません^^;


2007-01-19

[kmc] fonのルータが発送されたようです

この度は、フォン・ジャパン株式会社をご利用いただき、誠にありがとうございました。
2007年1月7日にご注文をいただきました商品を、2007年1月19日に発送いたしました。
        ↑                                           ↑

遅いよ^^;;;;

あやうくもう一個申し込むところだったぜ…!

[softs] デスクトップがどっかからダウンロードしたpdfで一杯なんだが

ファイル名が020010.pdfとか、msg4001.pdfとかでどれがどれやら…。

かといってダウンロードするときにいちいち意味のあるファイル名付けるのも面倒なんですよね。

自動で、配布元のURLとページタイトル*1をファイル名に付加してくれる ソフトがあると嬉しいかも。greasemonkeyでできたりせんかな。

*1 セクションタイトルもあるとなおいい

本日のツッコミ(全3件) [ツッコミを入れる]

hanya [僕のデスクトップにはあと4つぐらいしかファイルを置くスペースがありません!]

yhara [1.新しいフォルダを作る 2.デスクトップ上のアイコンを全部突っ込む 3.すっきり!]

mts [発想を逆転して、pdfを簡単に閲覧できるpdf explorerとかどうかな? http://www.forest...]


2007-01-21

[kmc] おおさと杯

部内の若者向けプログラミングコンテスト、通称「おおさと杯」の第3回が行われました。

基本的にICPCのような感じ(風船マークもあるよ!)で3時間6問なんですが、言語はC系だけではなく、RubyとHaskellも 使えるという充実ぶり。

僕はせっかくなのでRubyで参加しましたが、問題を読み間違ったりなんだりで結局3問しか解けず…駄目駄目ですね。 とはいえ、Rubyでコンテスト的なプログラムを書くのもなかなか新鮮で楽しかったです。次回はHaskellか!?(入力が一番大変そうだ…^^;)

[spoj] Sphere Online Judge

で、Rubyとかが使えるOnline Judgeとかないよねーという話をしたら、Sphere Online Judge(SPOJ) というサイトがあると教えてもらいました。

uvaPKUのような感じで、使用可能な言語は なんと驚きの35種類!

C (gcc 4.0.0-8)
C99 strict (gcc 4.0.0-8)
C++ (g++ 4.0.0-8)
Pascal (gpc v20030830)
Pascal (fpc 2.0.4)
Java (j2se jdk 5.0)
Nice (nicec 0.9.6)
JAR (j2se jdk 5.0)
C# (mcs 1.0.1)
Nemerle (ncc 0.2.1)
Smalltalk (gst 2.1.7)
Assembler (nasm 0.98.38)
Algol (a60 0.20a-4)
Fortran (g77 3.3.3)
ADA 95 (gnat 3.15p)
Bash (bash 2.05b-15)
Perl (perl 5.8.3)
Python (python 2.4)
Ruby (ruby 1.8.1)
Lua (lua 5.0.2)
Icon (iconc 9.4.2)
Pike (pike 7.4.35)
PHP (php 4.3.8-9)
Scheme (guile 1.6)
Scheme (qobi 0.9+0.10a)
Common Lisp (gcl 2.6.5)
Common Lisp (clisp 2.33.2)
Haskell (ghc 6.4.1)
Ocaml (ocaml 3.08.1)
Clips (clips 6.21)
Prolog (swipl 5.2.7)
Whitespace (wspace 0.3)
Brainf**k (bf2c)
Intercal (ick 0.24)
Text (pure text)

C/C++/C#/Java等の基本的なところからPerl/Python/Ruby/Pike/Luaのようなスクリプト言語、Lisp,Scheme/Haskell/Ocamlのような関数型言語から Bash/nasm/Whitespace/Brainf**kのような変り種まで幅広く取り揃えられています。

…しかし最後の「Text」ってのはどういう言語なんでしょうか? 期待されるoutputをすべてそのまま予想したらAccept?

[spoj] SPOJをネタにRaccを使ってみるテスト

1. TEST

こりゃー簡単ですよね。インタプリタ走らすまでもなく解けるぜ!

…と思ったら改行の処理を忘れて1miss _|‾|○

2. PRIME1

require 'mathn' してPrime#each使ったら一発じゃね!? と思ったのですが、TLE。もうちょっと真面目にやらないと駄目なようです。 ああ、難易度順に並んでるというわけではないのね。

3. SBSTR1

文字列Aに文字列Bが含まれているかを判定する問題。これこそString#include?一発では?と思ったら…

Please note, that the solution may only be submitted in the following languages: Brainf**k, Whitespace and Intercal.

ちょwww

4. ONP

四則演算+αの式を逆ポーランド記法に直す問題。要するにパーサ書けばいい、んですが…

せっかくだから俺はこの青のRaccを使うぜ!

いや、いいんですよ!Raccの練習だから!

gotokenさんの記事 (今は亡きCマガ…;涙) を見つつ、onp.y を書いてみる。

# exp = exp (+,-,*,/,^) exp |
#       '(' exp ')' |
#     = IDENT
class OnpParser
  prechigh
    left '^'
    left '/'
    left '*'
    left '-'
    left '+'
  preclow
rule
  exp : exp '+' exp { result += "#{val[2]}+" }
      | exp '-' exp { result += "#{val[2]}-" }
      | exp '*' exp { result += "#{val[2]}*" }
      | exp '/' exp { result += "#{val[2]}/" }
      | exp '^' exp { result += "#{val[2]}^" }
      | '(' exp ')' { result = val[1] }
      | IDENT
      ;
end

こんな感じかね?

あとスキャナ部分も書かんといかんらしいので、

require 'onp.tab.rb'
class OnpParser
  def parse(str)
    scan(str)
    do_parse
  end

  private
  def scan(str)
    @q = []
    until str.empty?
      case str
      when /\A\s+/
        # skip
      when /\A([a-z])/
        @q.push [:IDENT, $1]
      when /\A./
        # +-*/^()
        c = str[0].chr
        @q.push [c, c]
      end
      str = $'
    end
    @q.push [false, '$end']
  end

  def next_token
    @q.shift
  end
end

gets
while line=gets
  puts OnpParser.new.parse(line.chomp)
end

こんな感じで。要するにパーザクラスのnext_tokenメソッドで [トークンの種類、トークンの中身] という配列をひとつずつ返せばいいらしい。 上では記事の例と同じように、scanメソッドで一気に全てのトークンを切り出しています。

というわけでONPは解けた、と思う、んですが…

submitしたらNZEC(non-zero exit codeらしい)だったよ!

require 'racc/parser' だけでもNZECになるので、どうもraccは使えない予感。

…ですよねー(´・∀・`)


2007-01-25

[ruby] ホワイの(感動的)Rubyガイド

読んだ。なんというシュール…。

Tシャツが欲しくなった。

[junk] PS3とWiiの大きさに関する重大な事実

並べてみるとそれほど差はない

むしろWiiの方が大きく感じられる

PS3とWii(の箱)

#冗談ですよ


2007-01-29

[junk] あーてすてす

4797336021

[prog] flapjax

d.y.d.より。JavaScript で Reactive Programming らしい。熱い。

Reactive Programmingというのは、 x = f(a); と書いておくとaの値が変化したときに xを勝手に再計算してくれるようなシステムである(と思う)。 GUIとかアニメーションとかに向いているらしい。*1

*1 ゲームにも有効なんだろうか?

[prog] Circular Program

同じくd.y.d.より。 「木を1回traverseするだけで全てのノードを最小値に置き換えるとかいうのに使う技」らしい。

同じような話を見た覚えがあるなあ、と思って「今日の一行」を見直してみたのだが、 素朴な実装は分かったけど 回答例の方は技巧的でよく分からん^^; (図に描いてみないと…)

疑問:

  • Circular Programを普通の形式に直すと何が嬉しいのか?
  • 回答例のやり方はCircular Programに含まれる?

2007-01-31

[prog] anarchy golf始まったな

おおお格好いい!

というわけでテストも兼ねて、Hello, wolrd!の投稿されてない 言語をひととおり埋めてみました。

最初の方は真面目にやってたんですが…Adaあたりからだんだん分からなくなって…、 なんというかその、Wikipediaは便利ですね(おい!)

あと残り4つ。

  • Io : なんかtimeoutになってしまう ("Hello, world!" print であってますよね?)
  • whitespace : なんか何も出力されなくてfailedになる
  • sed : わかんないんです(><)
  • x86(exe) : アセンブラ書けないんです(><)*1

(2/2追記:ioとwhitespace(とbefunge)については修正が入ったようです。ありがとうございます。)

*1 サイズが10KBを越えてはいけないのである