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生成器が同梱される…予定です。
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」 みたいに書けるらしいw
他にも上の例の「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 に対応する
2007-01-08
■ [softs] F11で全画面
SleipnirにはF11で全画面モードになる機能がある。こんなんいつ使うんだ?と思っていたが、 ノートパソコンのような狭い画面だと便利なことに気付いた。 特に今この瞬間は38個のタブが6段に渡って表示されているので狭いことこの上ない。 が、F11を押せばなんともないぜ!(畳めよ)
いや、いつもはタブは4段までに抑えてるんだが…、ちょっと複雑な調べ物をするとすぐタブが一杯になってしまう。 だいたい人間がいちいちタブを閉じないといけないのが面倒だよね。経過時間に応じて自動的に「揮発」するような ブラウザがあればいいのかも。
■ [server][memo] ポート開け
80番通すのにえらい苦労した。ブロードバンドルータと無線LAN用ルータの2段構成になってるからなんだが…。
結局
- ブロードバンドルータのポートマッピングで、80番に来たパケットを無線LANルータに
- 無線LANルータのポートマッピングで、80番に来たパケットをサーバマシンに
という風にすればよかったみたい。
もちろんパケットフィルタで外から来るパケットを弾いている場合は80番だけ通すようにしないといけないが、 今回はどちらのルータも「指定したパケットのみを弾く」ようになっていたので設定は変更なし。
それって危険なんじゃね?と思ったんだが、
家庭向けBBRのフィルタリングポリシーは、基本的に暗黙のAllowになっている。
[サーバ公開のための設定 より引用]
らしい。まぁどのマシンに転送すればいいのか分からんので捨てられるから安全、ということか。チェックは以下のcgiを使うのが便利(LAN内からグローバルIPを指定しても見えないので)。
2007-01-09
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最初の一歩
Windows用のタブブラウザfubの導入方法。
特徴
- シンプルながら高いカスタマイズ性
- 多段タブ(グループタブ)が実装されているので、タブを開きまくっても大丈夫
- grep検索とかインクリメンタル検索とか
- お気に入りはIEと共通
- 「しいて挙げれば起動が遅いです。」だそうです。
ダウンロード
公式サイトの「導入方法」から fub_net_full.zipをダウンロード。
インストール
解凍するだけ。
初期設定
起動すると、メニューバーがないのにびっくりするかも知れません。fubではツールバーの青いアイコンからメニューを開きます。 その隣(★)がお気に入り、その隣(時計)が履歴、その隣がエクスプローラバーの表示/非表示です。
とりあえず最低限の設定を済ませてしまいましょう。
- ツールバー
- 表示→ツールバーから表示するツールバーを選択しましょう。
- プロキシ
- ツールバーの緑の三角マークをクリックすると、プロキシの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()がちゃんと動いてくれない)。むう。
javascriptがオフの環境のために、普通のテーブル形式の表示も実装する予定。
2007-01-15
2007-01-17
■ [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」という名前だったが、あんまり適切じゃない気がして改名
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"とか。
参考:
- debian + vmware player http://d.hatena.ne.jp/papa33/
- ネットワーク http://mkosaki.blog46.fc2.com/blog-entry-32.html
- ネットワークの概要 http://www.ukkii.com/vmware/VMnet_Tips/VMnet_Tips.html
ちなみにscimの起動にはまだ成功していません^^;
2007-01-19
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) というサイトがあると教えてもらいました。
uvaやPKUのような感じで、使用可能な言語は なんと驚きの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?一発では?と思ったら…
ちょwwwPlease note, that the solution may only be submitted in the following languages: Brainf**k, Whitespace and Intercal.
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-29
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を越えてはいけないのである
□ tokuhirom [langscan? http://gonzui.sourceforge.net/langscan/index.htm..]
□ yhara [gonzuiに使われてるやつですよね。 ちょっと触ってみます。ありがとうございます。]