消化器官

腸炎になった。

腹は痛いわ熱が出てだるいわで散々なGWだった。

知識と食事は似ている気がする。 一度にたくさんは食べれないし、吸収できない。 超人はいるかもしれないけれど、 そこには限界があって、少しづつ齧って、少しづつ消化していくしかない。 時には料理もし、運動し、栄養バランスも考えて、食べる。 食べ過ぎは良くないか。消化不良を起こしてないか。腸は健康か。

バランスよく食べて、運動して、消化する。 これで健康な知識が付いていく気がする。

あと休息も。

Enumerator.new without a block is deprecated

rubyと同じように書けるというコンセプトでがんばってruby-enumeratorを作ったのに、 https://github.com/ksss/ruby-enumerator.js

ruby 2.0.0から

puts RUBY_VERSION
Enumerator.new([])

とすると

warning: Enumerator.new without a block is deprecated; use Object#to_enum

2.0.0

この記法は廃止される予定みたいです。

うーん。他人に頼ってるようではだめなのだろうか……。

macportsでruby2.0を入れた

$ sudo port selfupdate
$ sudo port install ruby20

なんかすごく早く終る。

シンボリックリンクで1.9とかと使い分ければOK。

$ sudo ln -s ruby2.0 ruby

あとは確認

$ ruby -v
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12]
#! /usr/bin/env ruby
puts RUBY_VERSION
#=> 2.0.0

ruby-enumerator.jsを作ってみて

一気にいろんな新しいことをしたのでかなり時間がかかってしまいました……。

元々はArrayやString、NumberなどもRubyのメソッドを追加して…と作っていたのですが、色々と問題があったりソースがデカくなり過ぎたりで挫折。一部だけ切り取ってruby-enumeratorを作り始めました。

RakefileもまずMakefileから勉強して、JSDocもテンプレートから書いて(できるだけRubyのドキュメントサイトに似せてみました)、npmに初登録して、初めてTravis-Ciを使って……などなど思い出深いです。

もっと早く色んな物を作れるように頑張りたいです。

RubyのEnumeratorをJavascriptに実装してみた

Rubyはデフォルトでメソッドがいっぱいあってズルい!

JSでも同じように書きたい!

そんな想いから作りました。

ruby-enumerator.js

https://github.com/ksss/ruby-enumerator.js

RubyのEnumeratorとEnumerableのメソッドを、JSで同じように書くことができます。

NodeとHTMLで使用可能です。

Rubyの場合

e = Enumerator.new([1,3,4,6])
e.chunk { |i|
  i.even?
}.each { |res, i|
  p [res,i]
  #=> [false, [1, 3]]
  #=> [true, [4, 6]]
}

ruby-enumerator.jsを使った場合

var e = new Enumerator([1,3,4,6]);
e.chunk(function(i){
  return i % 2 === 0;
}).each(function(res, i){
  console.log([res, i]);
  //=> [false, [1, 3]]
  //=> [true, [4, 6]]
});

無限リストもRuby(v1.9.3)と同様に扱えます。 Rubyの場合

fib = Enumerator.new { |y|
  a = b = 1
  loop {
    y << a
    a, b = b, a + b
  }
}
p fib.take(10) #=> [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

ruby-enumerator.jsを使った場合

var fib = new Enumerator(function(y){
  var a = 1;
  var b = 1;
  var tmp;
  for (;;) {
    y(a);
    tmp = b;
    b = a + b;
    a = tmp;
  }
});
console.log(fib.take(10).to_a()); //=> [1,1,2,3,5,8,13,21,34,55]

インストール方法は、nodeの場合npmで、htmlの場合コードを読み込めばEnumeratorオブジェクトが使用できるようになります。

nodeの場合

npm install ruby-enumerator
var Enumerator = require('ruby-enumerator').Enumerator;

htmlの場合

<script src="https://raw.github.com/ksss/ruby-enumerator.js/master/enumerator.js"></script>
<script src="./your.js"></script>

他のオブジェクトにruby-enumerator.jsの機能を追加することもできます。

Enumerator.extend(jQuery);
$('.foo').chunk(function(i){
  // ...
}).each(function(res,i){
  // ...
});

細かいところまでできるだけRubyに似せるように書いたのですが、同じ点と違う点があります。

同じ点

  • コールバック関数で宣言する引数の数によって変数に渡される値を変えます
var e = Enumerator({'a':1});
e.each(function(i){
  console.log(i); //=>['a',1]
});
e.each(function(key,value){
  console.log([key,value]); //=> ['a',1]
});
  • EnumeratorはEnumerableを継承しています
  • Enumerableに属するメソッドは全てeachメソッドを使用して実装されています。eachメソッドを上書きした場合ほぼ全てのメソッドに影響があります。

違う点

  • オブジェクト作成時のnewは省略できます。
  • functionでオブジェクトを作るとき、Rubyのyield(<<)メソッドではなく簡単化のため引数を単に関数として使います。
  • Rubyで配列を返す場合、ruby-enumerator.jsではメソッドチェインが可能なようにEnumeratorオブジェクトを返します。
  • イテレーター内から途中でbreakできませんが、throwで強制的に抜けることができます。
  • Staticなメソッドを幾つか追加しています。

Rubyの要素をJavascriptに入れると何が起きるか、これからが楽しみです。

javascriptで文字列を1文字ずつ処理するライブラリー

https://github.com/ksss/walk.js

書きました。
といっても全く大したことのない誰でも書ける内容です。
Good Partを参考にしました。
少しづつ積み上げてレベルアップしていきたいです。


use case

var Walk = require('./walk.js').Walk; // nodeの場合のrequire
var w = new Walk('foo bar baz');  // new でオブジェクトを作るときに引数の文字列がインスタンスの処理ソースになります
w.ch // => 'f' 今見てる文字
w.at // => 0  今見ている位置
w.next() // => 'o' 次の文字へ
w.next() // => 'o'
w.ch      // => 'o'
w.at       // => 2
w.next() // => ' '
w.white() // => 'b' 空白を無視
w.each(function(c){ // 1文字づつコールバックを処理
    return c + '*';
})              // => 'b*a*r* *b*a*z*'

ファイルの保存時に実行し、失敗した時だけメッセージを出すvim script

以下をvimrcに書いておくと、
vimphpファイルを保存するときに自動で構文チェックをしてくれて、
失敗した時だけメッセージを出してくれます。
いろいろ応用できそう。

augroup MyAutocmd
	au!
	
	function! s:phplint()
		let ret = system(printf("php -l %s", expand('%')))
		" 失敗した時だけ
		if ret !~ '^No.*'
			echomsg ret
		endif
	endfunction

	" PHP保存した時にlint
	au BufWritePost * if &filetype == "php" | call s:phplint() | endif
augroup END