0

バージョン管理システムの歴史

最初のバージョンがリリースされた年

SCCS 1972年
RCS 1980年
CVS 1990年
SVN 2000年
Mercurial 2005年
Git 2005年

昔は10年周期、最近は5年周期ですかね?

俺MercurialとGitしか使ったこと無いけど、この調子だと2020年までにはGitオワコンとか言われてそう。
とくにcheckoutコマンドに色々機能載せすぎ感あるので、内部のアルゴリズム等はそのままでコマンドを綺麗にしたgit2のような物がでてくるのではないかと思う

0

YouTubeのAPI

検索


youtube_searchっていうgemが便利だった
gem install youtube_search


検索すると配列が何十件か返ってきて、その中にhashで検索結果が入ってる
タイトルやvideo_idが取れる。
#!/usr/bin/env ruby
require 'rubygems'
require 'youtube_search'

video = YoutubeSearch.search('隕石').first
puts video["video_id"]


プレイヤー


JSでプレイヤーを作れるAPIがあったので、ためしてみた。
なんかAPIがかっこわるい。あとURLから動画を再生する関数が動いてない気がする。video_idから再生はできる。

http://shokai.github.com/youtube-js-api-study

0

ブラウザ用EventEmitterを作った

もうあるので車輪の再発明だけど、作った
https://github.com/shokai/event_emitter.js


元々sinatra-cometioの中で使っていたのを切り出して、テストとか書いた。

Ruby版といっしょに使うと楽しい。

event emitterとは


Node.jsに含まれているライブラリ。をWebブラウザだけで動くように実装しなおした。


こんな感じでapplyすると
var User = function(){
new EventEmitter().apply(this);
this.name = '';
};

イベント登録して
var user = new User();
user.name = 'shokai';
user.on('go', function(data.place){
alert(user.name+' -> '+data.place);
});

呼び出せるようになる
user.emit('go', {place: 'mountain'}); // "shokai -> mountain"

あと、onのかわりにonceで登録すると1回だけ呼び出せるイベントになったりとかある。
JavaScriptの全てオブジェクトに簡単にイベント機能が追加できる。
くわしくはREADMEを見て。


test


ブラウザで使うjsだけどterminalでテストしたかったので、nodeunitを使った。


このようにnode実行した時はnode moduleとして読み込めるように、event_emitter.jsの末尾でmodule.exportsに登録しておいた。
var EventEmitter = function(){
/** 略 **/
};

if(typeof module !== 'undefined' && typeof module.exports !== 'undefined'){
module.exports = EventEmitter;
}

あとはnodeunitでテストを書いた。


JavaScriptの圧縮


uglify-jsで圧縮した

0

queryの安全な呼び出し

webサービスに独自query言語を実装したい事とか、稀によくあるけどevalすると危ないし、きっちりパーサ書くのも面倒

Rubyだと、Object::__send__ Symbol が使えるのかなという話になった
__send__だとprivateの関数も呼び出せちゃうとかあるけど、どうなんですかね。
ORMapperに渡してDBの中身を返すような用途を想定している。


今日食べる物が蓄積されて配列で返ってくるquery

puts "## メソッドチェーン"
p Meshiya.new.zanmai.kazusuke(3).marutaka.foods

puts "## __send__ :symbol で関数呼び出せる"
p Meshiya.__send__(:new).__send__(:zanmai).__send__(:kazusuke, 3).__send__(:marutaka).__send__(:foods)


puts "## eval"
puts "## 引数つきの関数はparseが面倒なので省略"
query = "zanmai.kazusuke.marutaka.foods"
p eval "Meshiya.new."+query

puts "## __send__で安全に呼び出し"
arr = query.split('.')
arr.unshift Meshiya.new
p arr.inject{|a,b|
a.__send__ b.to_sym
}


結果
## メソッドチェーン
["肉", "ホルモン", "ホルモン", "ホルモン", "魚"]
## __send__ :symbol で関数呼び出せる
["肉", "ホルモン", "ホルモン", "ホルモン", "魚"]
## eval
## 引数つきの関数はparseが面倒なので省略
["肉", "ホルモン", "魚"]
## __send__で安全に呼び出し
["肉", "ホルモン", "魚"]


meshiya.rb はこれ
# -*- coding: utf-8 -*-
class Meshiya

attr_reader :foods
def initialize
@foods = []
end

def zanmai(count=1)
count.times do
@foods << "肉"
end
self
end

def kazusuke(count=1)
count.times do
@foods << "ホルモン"
end
self
end

def marutaka(count=1)
count.times do
@foods << "魚"
end
self
end

end

0

HerokuでSinatra+PhantomJS

ためしに、URLを入れるとaタグのhref属性とxy座標と幅と高さが取れる簡単なアプリを作ってみた。herokuでwebkitが動いててサーバー側でいったんページをレンダリングしてるから、座標とかがわかる。

http://phantom-getlinks.herokuapp.com/


ソースコード https://github.com/shokai/sinatra-heroku-phantomjs

readmeに書いてある通りやればローカルでもHerokuでもすぐ動かせるのでcloneしてみるとよい。


PhantomJSでページをレンダリングしてからaタグの座標とか読む


PhantomJSはプロセス内にwebブラウザ(webkit)を起動して、しかもその中のJavaScriptにアクセスできる
橋本商会 » PhantomJSでwebページ内のJavaScriptを読む


PhantomJSでページに注釈を付けてスクリーンショット撮るやつ – hitode909の日記
を見ていたら、injectJSという関数でPhantomJS内のwebkitにjQueryを読み込ませて好き勝手やってた。

hitodeさんのを参考にして、aタグの位置とかをJSONで吐き出すスクリプトを用意した。


HerokuでPhantomJSとRubyを同時に使えるようにする


まずローカルでSinatraアプリを普通に作る。phantomjsコマンドを呼び出して結果のJSONをブラウザに返すアプリを作る。

それをHerokuで動かすにはbuildpack機能を使う。1つのアプリでRubyとPhantomJSが同時に使えるようになる。

参考:herokuでRubyとphantomjsを使う #Ruby #heroku #PhantomJS – Qiita


create –stack cederの代わりにbuildpackを指定してアプリを作る
% heroku create --buildpack git://github.com/ddollar/heroku-buildpack-multi.git

.buildpacksファイルを作る
https://github.com/stomita/heroku-buildpack-phantomjs.git
https://github.com/heroku/heroku-buildpack-ruby.git
この2行を書く。

あとは普段どおりGemfile, Gemfile.lock, Procfileと.buildpacksをgit addしてcommitして、herokuにgit pushする。

最後に環境変数を設定して、phantomjsコマンドにパスが通って完了
% heroku config:add LD_LIBRARY_PATH=/usr/local/lib:/usr/lib:/lib:/app/vendor/phantomjs/lib
% heroku config:add PATH=bin:vendor/bundle/ruby/1.9.1/bin:/usr/local/bin:/usr/bin:/bin:/app/vendor/phantomjs/bin

ローカルでもHerokuでも問題なく動く。