RUBY
JMeterはとても強力なツールなんですが、UIがいまいち(ですよね?)なのとテストケースがXMLなので、あまり積極的に使っていませんでした。 しかし、どうしてもJMeterを使わざるを得ないケースが出てきて*1、GUIツールとXMLを避ける方法をいろいろと探して…
勉強もかねてfluent-plugin-kinesis-altという、fluentdのプラグインを書いてみました。 ちょうあるふぁばんです。 2013/12/24 追記 fluent-plugin-kinesisにマージできないかお伺いを立ててます https://github.com/imaifactory/fluent-plugin-kinesis/issu…
AWS SDK for RubyがKinesisに対応したので、ちょっと触ってみました。 なにはさておき… aws-sdkを1.31.3以上にしましょう。 1.30.0はバグがあってまともに動かないです。 Kinesisについて コンセプトとかについてはドキュメントを読めばだいたい分かると思い…
AWS Advent Calendar 2013の2日目のエントリです。 RubyからAWSのAPIをたたくときはAWS SDK for Rubyを使うことが多いと思いますが、公式のSDKでも新しい機能のAPIに未対応な場合があります。(例: aws-sdk 1.24.0 での describe_load_balancer_attributes …
Amazon Linuxを起動したら、だいたい一番最初にRuby 2.0.0のビルドを始めるのだけれど、まいどまいど同じことをやっているのでrpmを自動作成するようにしてみた。 https://github.com/winebarrel/ruby-2.0.0-rpm Ruby 2.0.0のspecファイルを公開している人が…
libjqが簡単に使えたので、NokogiriっぽいRubyのバインディングを作りました。 https://bitbucket.org/winebarrel/ruby-jqJSONはHTMLほど複雑ではないですが、ネストの深いデータを一発でとってこれるのは便利…かも知れないです。以下はGitHub APIでファイル…
Piculet https://bitbucket.org/winebarrel/piculetKelbim https://bitbucket.org/winebarrel/kelbim 以前作成したRoadworkerと同様に、AWSの設定をRubyのDSLで管理します。Piculetはセキュリティグループを、KelbimはELBを対象としています。 Piculetのほう…
サーバ require 'msgpack/rpc' require 'msgpack/rpc/transport/unix' class MyHandler def add(x,y) return x+y end end listener = MessagePack::RPC::UNIXServerTransport.new('/var/tmp/hoge.sock') server = MessagePack::RPC::Server.new server.liste…
https://bitbucket.org/winebarrel/ddbcli DynamoDBのmysqlコマンド的なクライアントを作りました。ほんとはAWS Tools Hackathonでこのネタをやろうとしていたのですが、DynamoDBのAPIにさわり始めたらあれよあれよと実装が進んでしまいまして。本番どうする…
あまりがっつりとSimpleDBを使い込んでいる訳ではないですが、ちょっとしたデータをつっこんでおくにはなかなか便利です。特にログを残しておきたいときは特別なミドルウェアを用意する必要がないので、サーバやミドルウェアの検証をやるときにはよく使って…
#!/usr/bin/env ruby require 'cgi' require 'base64' require 'net/https' require 'openssl' require 'optparse' require 'rexml/parsers/pullparser' require 'time' require 'yaml' Net::HTTP.version_1_2 class EC2Client API_VERSION = '2012-12-01' S…
class Brainfuck options no_result_var rule exp: | exp ope ope: '>' { @ptr += 1 } | '<' { @ptr -= 1 } | '+' { @ary[@ptr] ||= 0 @ary[@ptr] += 1 } | '-' { @ary[@ptr] ||= 0 @ary[@ptr] -= 1 } | '.' { print (@ary[@ptr] || 0).chr } | ',' { @ary[@…
kyowa.y class Kyowa options no_result_var rule exp: | exp ope ope: '(」・ω・)」きょう(/・ω・)/わー' { @ptr += 1 } | '(」・ω・)」きょう!!(/・ω・)/わー!!' { @ptr -= 1 } | '(」・ω・)」きょう!(/・ω・)/わー!' { @ary[@ptr] ||= 0 @ary[@ptr]…
ruby-binlogを使ったサンプル。mysql2mongo.rbは以下の通り。 #!/usr/bin/env ruby require "rubygems" require "binlog" require "mongo" # カラム情報はMySQLから取得した方がよいかも… TABLE_COLUMNS = { "employees" => %w(id name age), } def insert(e…
少し前に話題に上ったmysql-replication-listener(libreplication)のRubyバインディングを書きました。https://bitbucket.org/winebarrel/ruby-binlog/ require "binlog" client = Binlog::Client.new("mysql://repl:repl@nyarlathotep") client.connect c…
例によってシンプルな情報が少ないので、すこしまとめてみた。 設定の確認とCredentialの作成 Management Consoleの「SES > SMTP Settings」でSMPTの設定の確認と、Credentialを作成。*1 メールアドレスの認証 sandbox状態だと認証された送信者・受信者でし…
同期の問題は大変デスネー Hostヘッダ渡さなくてもレスポンス返してくれたのがちょっと意外だった。 hHatena Blogはレスポンス返してくれるのかな? #!/usr/bin/env ruby require 'rubygems'a require 'eventmachine' class Backend < EM::Connection def i…
あ、さっきの嘘だ。 普通にラウンドロビン実装できた。 #!/usr/bin/env ruby require 'rubygems' require 'eventmachine' class Backend < EM::Connection def initialize(proxy) @proxy = proxy end def receive_data(data) @proxy.send_data(data) end end…
重い処理はバックグラウンドに回すのが正解なのかな。 基本的にmutableなオブジェクトの共有はNGな気がするな。 #!/usr/bin/env ruby require 'rubygems' require 'eventmachine' class HTTP < EM::Connection def receive_data(data) operation = lambda do…
#!/usr/bin/env ruby require 'cgi' require 'base64' require 'net/https' require 'openssl' require 'rexml/document' Net::HTTP.version_1_2 class EC2Client API_VERSION = '2011-12-15' SIGNATURE_VERSION = 2 def initialize(accessKeyId, secretAcce…
ちょっとしたメタ情報を取るのにec2-api-toolsだと遅いし(JAVA_HOMEとかの設定も必要だし)、gemでライブラリをインストールするのもいやなので、rubyの標準ライブラリだけで簡易的なクライアントを作ってみた。*1 #!/usr/bin/env ruby require 'cgi' requi…
さらっと読むかぎり、/dev/urandomと時刻とpidと変数seedのアドレスをシードにいている模様。 S_ISCHRで何を判別しているんだろう? static VALUE random_seed() { static int n = 0; struct timeval tv; int fd; struct stat statbuf; int seed_len; BDIGIT…
200回ぐらい回せば大体、Weightに従って分布してくる…と思う。 def wrr(addr_weights, n) addrs = [] ary = [] addr_weights.each do |a, w| w.times { ary << a } end ary = ary.sort_by{ rand } loop do addrs << ary.shift addrs.uniq! if addrs.size >= …
ゴシッププロトコルによる冗長化と負荷分散の検証 View more presentations from winebarrel 謝辞 懇親会で話しかけてくださった方々ありがとうございます。全力で懇親会を避けていた自分としては、あの手の懇親会での立ち位置が未だによくわかりません。マ…
https://bitbucket.org/winebarrel/murakumo/大体できてきた。あとはパフォーマンスのチェックとか、細かい動作確認。
mysqlへの接続時にホスト名に紐付くIPアドレスが帰ってきたらどうなるのかと思って少し調査中。 libcのレベルでは複数のgetaddrinfoが複数のIPアドレスをそのまま返している。 http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/getaddrinfo.3.html Ru…
Mersenne Twisterを使っていたはずだけど、きちんとしたドキュメントを見つけられなかったので、一応、ソースコードを確認。 /* * call-seq: * rand(max=0) => number * * Converts <i>max</i> to an integer using max1 = * max<code>.to_i.abs</code>. If the result is zero, …
class Calcp prechigh nonassoc UMINUS left '*' '/' left '+' '-' preclow options no_result_var rule target: exp | { result = [] } exp: exp '+' exp { val[0] + val[2] + ['+'] } | exp '-' exp { val[0] + val[2] + ['-'] } | exp '*' exp { val[0] +…
class Calcp prechigh nonassoc UMINUS left '*' '/' left '+' '-' preclow options no_result_var rule target: exp | { result = [] } exp: exp '+' exp { val[0] + val[2] + [lambda {|a, b| a + b }] } | exp '-' exp { val[0] + val[2] + [lambda {|a, …
#!/usr/bin/env ruby require 'cgi' require 'base64' require 'net/https' require 'openssl' class SDBClient API_VERSION = '2009-04-15' SIGNATURE_VERSION = 2 def initialize(accessKeyId, secretAccessKey, endpoint = 'sdb.amazonaws.com', algorith…