2009-08-03
■ [ruby] RubyForge, githubに続く第3のgem配布サイトが登場
____ / \ / _ノ ヽ、_ \ / o゜((●)) ((●))゜o \ RubyForgeはなんか使いにくいお…… | (__人__) | \ ` ⌒´ /
____ / \ / _ノ ヽ、_ \ / o゜⌒ ⌒゜o \ かといってgithubはどれが公式か分かりにくいお…… | (__人__) | \ ` ⌒´ /
____ /⌒ ⌒\ /( ●) (●)\ /::::::⌒(__人__)⌒::::: \ だからgemcutter作ったお! | |r┬-| | \ `ー'´ /
こうですかわかりません!
gemcutterでgemを公開する方法
$ sudo gem install gemcutter $ sudo gem tumble $ sudo gem push myproject-0.0.1.gem
簡単ですねー
ソースとかメモとかはこちら
比較
- RubyForge
- デフォルトでsourcesに入ってる
- ディレクトリ方式のプロジェクト一覧がある
- デファクトスタンダード
- (簡単な)申請が必要
- 公開がめんどくさい(hoeとかで自動化できるけど、自動化しないといけないのがそもそもスマートではない)
- github
- 申請不要、手軽
- gem名が「作者名-プロジェクト名」になってしまう、どれが公式なのか分かりにくい
- gemspecをアップロードするだけでいい
- github上でビルド・配布してもらうので15分くらい待たないといけない
- gemcutter
- 申請不要
- gem名に作者名が入らない
- "gem push *.gem"一発でgemを公開できる
- gemcutterの開発はまだ始まったばかりだぜ
gemspecにはAuthorとかHomepageとか全部書いてあるんだから、それをサイト情報として使えばいいじゃん?というのは確かにその通り。 でもプロジェクトのページ(例)でAuthorの名前をクリックしたらその人のgem一覧が…とかは欲しいよなぁ。
まあとりあえず
$ sudo gem sources -a http://gemcutter.org
は、やっておくといいんじゃないですかね。
2009-08-04
■ [ruby] Enumerable#else
Pythonだと、forやwhileにelseを付けられるらしいですが、似たような挙動をRubyで実装する方法について。
module Enumerable def else(&block) self.respond_to?('empty?') && self.empty? ? yield : self end end
とすると、
<% results.each do |x| %> <%= x %> <% end.else do %> no data <% end %>
と書ける!
予約語もメソッド名に使えるRubyならではですね。
via http://d.hatena.ne.jp/ursm/20090316/1237220104
コメント欄では
ary.each do |i| puts i end.any? or puts 'none'
という案や、
<% if results.empty? -%> no hits found <% else -%> <% results.each do |x| -%> hit:<%=x-%> <% end -%> <% end -%>
でよくね?という人も。
■ [rails] CSSを構造化したい→それLessで
あるいは、Sassはカッコイイけどインデントが嫌だ→それLessで (という意図を機能から感じる…)
Lessは、
table#main { tr { ... } td { ... } }
みたいに、ちょっとイイ感じな記法でCSSを書くツールである。 独自記法?じゃあコンパイルが面倒じゃないですか? いいえ、Railsならプラグイン入れるだけでなんかよろしくやってくれるんです。楽ちんですね。
Less for Railsの使い方
- gem install less
- script/plugin install git://github.com/augustl/less-for-rails.git
- public/stylesheets/foobar.less を編集
- レイアウトに <%= stylesheet_link_tag "foobar" %> とか書く
- 自動的に public/stylesheets/foobar.css にコンパイルされる(※developmentモード)
productionでは起動時に全CSSをコンパイルし、自動コンパイルは行われません。 起動時に作るのは「デプロイしたらCSSが生成されてなくて真っ白」みたいのを防ぐためですね。
Lessのいいところベスト3
1. 定義をネストできる
「div#footer内のdiv.date」とか、ネストしてるものはネストして書きたいですよね。
#footer { .date{ color: green } .version{ font-weight: bold; } }
2. 変数が使える
@から始めると変数になる。
@base_width = 10em;
しかも四則演算ができる!
.wide { width: @base_width * 2; }
3. コメントに「//」が使える
// this is comment color: red
地味に嬉しい。
その他の機能(mixinとか)は→ http://lesscss.org/docs.html
2009-08-05
■ [chuck] 強く時間付けされた並列実時間言語、Chuck
社内勉強会でオーディオプログラミング言語のChuckというものを教えていただいた。
独自の言語(DSLですな)を書くと音が鳴ったり、フィルターが掛かったりするもので、実行中に新しいプログラムを評価したりして、 リアルタイムに音を変えて演奏できるという感じ。
んで、
この「指パッチン」がどうしてもやりたかったのでいろいろ試してみた。
- とりあえず、マイクとスピーカーが近すぎるのでどうしてもハウリングしてしまう
- そこでローパスフィルタLPFですよ
- おお、高音がなくなった
- ついでにGainで音大きくしようぜ
- …あれ、入力にローパスフィルタかけたら結局低い音しか出せなくね?
んで元ページ見たら「正帰還を作らないように注意」って書いてあった。ヘッドホンか……。
2009-08-06
■ [prog] ReverseHttpに関する俺の理解 (WebHookでクライアントマシンに通知を送る技術)
- [背景] WebHookは便利だお!
- [問題点]でもローカルマシンは通知先にできないお……*1
- [解決法] だからwww.reversehttp.net/ に中継させるお!
(AA略)
ということだと理解した。
つまり「ReverseHttpとは、localhostをWebHookの通知先にする技術である」。
もっというと、「ReverseHttpとは、WebHookを使ってクライアントマシンに通知を送る技術である」。
- Q. cometと何が違うの?
- A. 中で利用してる技術はlong pollとかで一緒だったりするけど、その使い方が違う。cometはサービス提供者がwebサーバと別にcometサーバ立てたりして面倒だけど*2、ReverseHttpは中継サーバがそのへんを面倒見てくれるため、サービス提供者はWebHookを使ってクライアントを表すURLに通知を送るだけで良い。
- Q. クライアントはブラウザじゃないといけないんですか?
- A. cometにしろReverseHttpにしろ、「HTTPプロトコルを使って通知を送る技術」なだけで、別にブラウザはなくてもいい。例えば冒頭のリンク先のデモとかね。
- Q. クライアントマシンに情報を送るのってそんなに大変なんですか?
- A. HTTPは基本的にプル型の技術でプッシュ型ではないからねぇ。「イベントが発生したタイミングで即」情報を送るには何か凝ったことをしないといけない。
- Q. FlashならTCPで接続できますよ
- A. でもそれはサーバ側もTCP喋らないといけないわけだよ。WebHookならURLにアクセスするだけだから確かに簡単ではある。
- Q. cometといえばチャットですが…
- Q. チャットみたいな頻度で通知送っても中継サーバは大丈夫なんですかね?
- Q. チャット以外にプッシュしてほしい情報とかあるんでしょうか
- A. それがないからcometは流行らな(ry)。そんなこと言ってる暇があったら何か面白い使い道を考えた方が楽しいですよ。
2009-08-07
■ [prog] githubがレコメンデーションに関するコンテストを開催中 (-8/30)
スコア表にあんまり日本人がいない?みたいなので紹介します。
参加者には、githubのどのユーザがどのリポジトリをwatchしているかのリストが与えられます。 ただしユーザ名は匿名化されており、また一部のwatch情報が意図的に取り除かれています。 その削除された情報をレコメンデーション技術を駆使して当ててください…という内容のようです。
優勝者にはgithubの生涯永続のlargeアカウントと、最高のバーボンが贈られるそうです。バーボンw
メタ推理(データからユーザ名の復元を試みるアプローチ)は技術的には可能かもしれないが禁止だそうです。
開催期間は8/30まで。日本時間だと8/31の朝までですね。
2009-08-10
■ [ruby] 複素数リテラルはどうなった
Ruby 1.9では、「require 'complex'」なしにComplexクラスが使えるようになっていることにお気づきでしょうか。これに伴い(?)、 7/22-7/24頃にruby-devで、Ruby 1.9.2に複素数リテラルを導入するかどうかの議論がありました。 (bladeが止まっててリンクが張れない…。)
議論があっただけで、まだ何も変更は入ってないようなので、 複素数リテラルが欲しい人は1.9.2の仕様がfreezeされる前にruby-devとかruby-listに催促メールしましょう。1.9.2の仕様はあなたが作る!
虚数リテラル案
2i 2.0i
- 1+2iは 1 + 2i (Interger#+の呼び出し)なので、「複素数リテラル」ではなく「虚数リテラル」が正確
- 1.9.2には有理数リテラルがないので、1/3iは1/(3i)になってしまう
- 1+2iはいいけど、2をnに変えたいと思ったとき、1+niとは書けないのでComplex(1, n)に直さなければならない
虚数化文法案
1+(2)i 1+(n)i
- 文法をいじるので実装がでかい
それComplex::Iでできるよ案
1 + n * Complex::I あるいは、include Complexして 1 + n * I
- 既に実装されている
Numeric#i案
1 + 2.i 1 + n.i
- すっきりしてて良さそう?
User-defined literals案
2i #=> 2.literal_i
- C++0xではできるらしい。さすがC++さん
- ユーザが好きにリテラル定義しまくるとカオスになるのでは
感想
Numeric#iを入れて、虚数リテラルは入れない、でいいんじゃないかなぁと思いました。 メソッドの導入で済むなら文法は増やさない方が、parse.y的にも学習コスト的にもリファレンス的にも良いんじゃないかなと。
■ [sinatra][javascript] SinatraがJavaScriptにも移植されたようです(Sammy)
いろんな言語に波及しているRuby用のWebフレームワーク、Sinatraですが、 今度はJavaScriptでの実装が現れた模様。
といっても、サーバサイドJSではありません。サンプルコード。
get('#/', function() { with(this) { $element().text('Click form!'); }});
aタグのリンク先を "#/foo/bar" のように「pathっぽいアンカー」にすることで、Sinatra風のイベント定義を実現しているようです。
GUIのボタンにpathを振るというアイデアはRuby Shoesがやっていましたが、 これをWebアプリに逆輸入した形になりますね。
2009-08-11
■ [ruby] ruby-talkウォッチ
しばらく見てなかったruby-talkのANN関係で気になったものを。 後に行くほどおもしろい…かも知れない。
allgems
RubyForgeの全gem(?)のrdocが見れる。テーマにはhannaを使用(インクリメンタル検索があるやつ)。
looksee
pみたいな「lp」メソッドを提供するライブラリ。あるオブジェクトに対して呼べるメソッドを、Class/Module別に表示する。
irb(main):001:0> lp [] => Array & concat frozen? push taguri * count hash rassoc taguri= ...
jake
js用のRake? JavaScriptのライブラリのパッケージを作るためのツールらしい。
gibbler
Gitのようなハッシュ(例:c8027100ecc54945ab15ddac529230e38b1ba6a1)をオブジェクトに付加するライブラリ。 オブジェクトの変更履歴を残したりもできるらしい。
sequence
Enumerableの拡張版のような、Sequenceというクラスを提供する。
RedParse
Pure RubyのRuby言語パーサ。まだ100%ではないけど、99%のRubyスクリプトはパースできるそうな。
RubyMacros
RubyにLisp的マクロを追加するプリプロセッサ。README。マクロスとは関係ないw
macro loop(body) :(while true ^body end ) end
マクロの例。
Rubyの場合、requireをフックすればかなり透過的にプリプロセッサを噛ませられるんだね。
LiveConsole
ネットワーク越しのIRBを提供する。
Ruby Beutifier
ビューティファイアー。Rubyスクリプトの自動整形を行うらしい。
hijack
動いているRubyスクリプトを乗っ取る(笑)。
$ ruby hijack 16451 => Hijacking... => Mirroring: 100% => Hijacked 16451 (my_script.rb) (ruby 1.8.7 [i686-darwin9]) >>
乗っ取られる側にhijackのコードを埋め込む必要は*ない*らしい。どうなってんのこれ!? (gdbを使ってなんかするらしいが…)
BitStruct
Rubyでバイナリデータを扱うためのライブラリ。もうpack/unpackは嫌だお!という人に。
class IP < BitStruct unsigned :ip_v, 4, "Version" unsigned :ip_hl, 4, "Header length" unsigned :ip_tos, 8, "TOS" unsigned :ip_len, 16, "Length"
retrograph
「late-80s 8-bit game」みたいな描画方式を実現するライブラリらしい。READMEにメモリマップが載ってるw
string19
最後は、ライブラリではなくドキュメント…なのだが、Rubyスクリプト。 Ruby1.9の文字列クラスについて、「動くスクリプト」を例にしながら解説したもの。
感想
世にライブラリの種は尽きまじ!
■ [ruby] Rubyの拡張ライブラリをgem化する方法
まずextconf.rb → make → make install でインストールできるようにする。 それができたら、あとは gemspecのextensionに["ext/foo/extconf.rb"]とか設定するだけ。
すると、gemのインストール時に
$ cd ext/foo $ ruby extconf.rb $ make $ make install
的なコマンドが実行されるようになる。
「的」というのは、ソース読めばわかるのだが(lib/rubygems/ext/builder.rb)、こんなことをしてたりするからだw
mf = File.read('Makefile') mf = mf.gsub(/^RUBYARCHDIR\s*=\s*\$[^$]*/, "RUBYARCHDIR = #{dest_path}") mf = mf.gsub(/^RUBYLIBDIR\s*=\s*\$[^$]*/, "RUBYLIBDIR = #{dest_path}") File.open('Makefile', 'wb') {|f| f.print mf}
この辺の話を仕様に書いといてほしいな、と思った。
ちなみにextconf.rb以外にも、以下のようなバリエーションがある。
- /configure/パターン
- sh configure --prefix=なんちゃら
- make
- make install
- /rakefile/iパターン
- rake
- /mkrf_conf/iパターン
- ruby mkrf_conf
- rake
まあextconf.rbが一般的かな、と思う。
extensionでコンパイルできるのはライブラリだけで、実行コマンドをCで書くことはできないことに注意 (少なくとも簡単にはできないと思う)。 まあコンパイルまではできるので、実行コマンド用のRubyスクリプトを書いて(bin/foo)、execしてやればいいんじゃないかな。
…という方法でとりあえずrsdlのgem化には成功した。最終的には gem install rubysdl でrsdlコマンドがインストールされるようにしたい。
2009-08-17
■ [event] 天下一カウボーイ大会に参加します
月末の天下一カウボーイ大会に参加します。 一応、3分くらい喋る予定です。入場料金が割引になれば、それで良かったんですけど…(笑)。 内容は書いていいのか分からないので書きませんが、既出ネタです。
そういうわけでLLTVには参加できない…と思ったのですが、 両方に出ている人もいるな(shiroさん、田川さん)。
カウボーイ大会はなんとなく僕の観測範囲とあまり参加者が被っていない気がして、 実際 http://wccc.onosendai.jp/entry/1751 を見る限りでは、kzkさんしか分からんのですが、 まあ本名しか書いてないのでよく分からないですね(本名なんて飾りです)。
2009-08-20
■ [ruby] _whyが失踪した
_whyのtwitter、ブログ、その他サイトが軒並み消失している模様。
本件に対し、_why本人による唯一の?コメントは:
SeanLazer: もし麻薬組織に捕まったのなら、githubのリポジトリを消さしてくれたりしないと思うよ
[http://github.com/why/because/tree/masterより引用]
なんなの?
とりあえずgithubに関してはミラーが作られた模様。http://github.com/whymirror
(8/22追記:各プロジェクトを、みんなで協力してメンテナンスしていくことになったようです。詳細は http://whymirror.github.com/ にて。shoesやsyckにもメンテナが付いてますね。)
2009-08-21
■ [web] livedoor Readerで、日本語を含むURLにピンを立ててはいけない
LDRで、URLに日本語を含む記事(↓例)にピンを立てると、動作がおかしくなることがある。
- http://satoshi.blogs.com/life/2009/08/twitterの有効な使い方その1.html
具体的には、ピンを消化しても、LDRをリロードするとピンが復活してしまうという現象。 これを直すには、ピンが立っている当該記事を探して、Pキーでピンを外してやればいい (探すのが面倒なときは、ブログを一旦unsubscribeして購読しなおすのが簡単)
2009-08-26
■ [ruby][memo] サンプルコード
- 標準クラスのサンプルコード
- bitclustに装備?
- 海外の人はどうするの
- リファレンスとは独立したサイト(A)であるべきか
- そこにrubydocなりbitclustなりからリンクする
- gemなどのサンプルコード
- (A)とは別サイト?
- gem配布サイトが複数あるので特定のgem配布サイトが実装するわけにはいかない
- http://gemcutter.org/ が本当に公式になれば、そこにサンプルコード書ける機能があると楽しそうだ
結論
- サンプルコード自体に価値があるものだからどこに書いてもいい、定番サイトができればそこに移住すればいい。
- Rurimaphone++
■ [scheme] 小さすぎるR5RS、大きすぎるR6RSに対するScheme分割案が登場
- R5RSの範囲では実用的なプログラムが書けない
- R6RSはいろんなものを入れすぎて純粋さに欠ける
- どうやったら純粋さと実用性を両立できるのか→もういっそ2つに分けたらいいんじゃね?
Small Scheme
- 教育用、ちょっと実装してみたい人用、研究目的、埋め込み言語、純粋主義者
- 「現代風R5RS」
- 仕様の策定には90%の賛成を必要とする
Large Scheme
- Schemeプログラマ用、Scheme実装者用
- 「R6RSのトゥルーエンド」
- 仕様の策定は75%の賛成でいい (※R6RSは66%の賛成で承認された)
真面目な説明はShiroさんのチャットログを。純粋なSmall Schemeと、それを使って実装されるLarge Schemeということかな。 R6RSでも「コア」と「ライブラリ」には分けていたけど、コアをもっと、それ以上小さくできない位に小さくすると。 libraryもコアから外す?どうするんだろ。
2009-08-27
■ [ruby][prog] JRuby開発チームの@headiusが新しい言語を始めたようです
from http://blog.headius.com/2009/08/introducing-surinx.html
Duby = Rubyの見た目+Javaの型システム+静的型、型推論
Surinx = Rubyの見た目+Javaの型システム+動的言語
だそうです。
■ [javascript] 他人のブラウザでJSのテストを動かす「TestSwarm」のα版が公開
from John Resig - Test Swarm Alpha Open
John ResigといえばjQueryの作者ですが、jQueryくらいのユーザ層になると、 とにかく各OS・各ブラウザでのテストが大変だそうな。例えばWindows(IE, Fx)、 Mac(Safari, Fx)、Linux(Fx)で試すだけで5ブラウザ。実際はこれにChromeやOperaが加わり、 さらにブラウザのバージョンやOSのバージョンまで考えると途方もない数に…! もはや、JavaScriptのライブラリは個人でテストできる範囲を超えています。
そこで考案されたのがTestSwarm。 ブラウザでTestSwarmのページを開いておくと、たまにサーバからユニットテストのコードが降ってきて、 実行され、結果がサーバに送信されます。つまり、「個人でテストできないなら人海戦術でやれば いいんじゃね?」ということ。
トップランカーになると9ブラウザを同時に起動し続けているようですが、 さすがにそこまでやらなくてもいいので(笑)、jQueryなどのライブラリにお世話になっている人は とりあえず1窓、開いておくと良いのではないでしょうか。
自作のライブラリをTestSwarmでテストする方法など、詳細情報についてはこちらを。
2009-08-28
■ [biwascheme] www.biwascheme.orgを公開しました
公式サイトできたよー。
まだAPIの項がないんですが、折角なのでJSONで取ってきてインクリメンタル検索とかやってみたいですね。
あと、次のリリースに向けて一個だけ非互換を入れます。(sleep 1000)を(sleep 1)にします。 (sleep 500)は(sleep 0.5)です。影響を受けるのはsleep, timer, set-timer!です。
BiwaScheme 0.5用のプログラムをお持ちの方(zickさんとか)にはお手数をおかけします。すいません。 次期リリース(0.6かな?)に上げる際にはご注意ください。
2009-08-30
■ [event] 第参回天下一カウボーイ大会
面白かった。ちょっと今日は脳を使いすぎたんじゃない?
いろんな人(知ってる人/初対面の人/知らない人)と話して、最近考えてたいくつかの問題についてヒントをもらった。
この世にはまだまだ考えることがあるね。
カウボーイ大会とは何か
普通の技術系イベントと、大体一緒。20分のトークと、3分のLTがある。LTは一般/学生別だった(今回は)。
トークのテーマは、コンピュータに関するいろいろ。研究系あり、実装系あり、ビジネス系あり。
LTのテーマはガジェット系(コンピュータの外のデバイスを制御するようなもの)が一番多かったかなぁ。 普段、100%ソフトウェアなクラスタにいるのでちょっと新鮮だった。
あとトーカーがすごく豪華。来年あるかまだ未定だと思いますが、いつもと違う刺激を受けたい人は参加してみるといいと思います。
final alty party THE FINAL
alty party(懇親会みたいなもの)については今回が最後だそうなのであまり書かない。一言で言うと「やりたい放題」(笑)。
会場のBGMがOwl-Zoo(しかもFM音源)で感激した。
メモ
メモです。
- 最先端のスパコンの性能が、10年くらいでコモディティになる
- そろそろ家庭で使い切れる規模を越えてしまわないか (家庭に入らない→数が作れない→コモディティにならない→つまらん)
- ご家庭で計算量爆発するようなアプリを考えないと
- クラウドの実装として大量発注してもらえればおk
- 今のペースだと2025年(だっけ)くらいにスパコンで人間の神経系が
- BiwaSchemeの性能はどれくらい出るのか
- 測ってないですすいません (アプリでまだ困るほど遅くないので)
- そういえばアセンブラの代わりにCommon Lispに落とすコンパイラとかどうか (CLからネイティブまではコンパイラがある)
- Cで手書きするよりCLの最適化コンパイラに任せた方が速いんだ(Let Over Lambda理論)
- 近年は最適化が大変になっているので、人手的な理由でCLコンパイラがgccに(あるいはIntel compilerに)追いつけない可能性が…
- マクロでどこまで畳めるのか
- 3段以上になると、define-macroの場合バッククオートが大変、syntax-rulesの場合「...」に注意が必要。
- 関数呼び出しの階層はそこで切り分けられるが、マクロ呼び出しの階層は内側のマクロを内包してることがあって切り分けられない(←まだちゃんと理解してない。書いてみないとだめだな)
- アランケイ「ちょっと2万行でOS作るわ」
- http://www.vpri.org/html/work/ifnct.htm
- 現代のソフトウェアは大きくなりすぎ(数百万行)→人間の把握できる規模を越えている→どうにかして行数を減らさないといけない
- 2万行でOSとその上で動くアプリをネイティブコードまで
- OSといってもLinuxみたいなのじゃなく、Smalltalkの環境みたいなものかも (ということは畳むのに都合がいい仕様にする余地がある?)
- とりあえず1000行で高級言語のコンパイラが書けてる (ブートストラップ。その1000行を自分自身に食わすとコンパイラができる)
- プロジェクト応援に見る超循環
- 開発を行う人(0)、それを応援する人(1)、応援できる人を育てる人(2)、応援できる人を育てる人を育てる人(3)...
- これだけではメタなだけで循環ではない
- 開発を行う人が、年を取って若者を応援するようになるとメタサーキュラー
- Cが生き残ってる理由
- アセンブラは機械語に近すぎて、プロセッサの変化に弱い
- Cはプロセッサの変化にあまり影響されないぎりぎりのラインなのが偉い
- コードはアートか問題
- 同じ動作を複数の方法で記述できる冗長さがあるということは、アートの余地があるのではないか