RUBY

ruby-jmeter

JMeterはとても強力なツールなんですが、UIがいまいち(ですよね?)なのとテストケースがXMLなので、あまり積極的に使っていませんでした。 しかし、どうしてもJMeterを使わざるを得ないケースが出てきて*1、GUIツールとXMLを避ける方法をいろいろと探して…

fluent-plugin-kinesis-alt というのを作りました

勉強もかねてfluent-plugin-kinesis-altという、fluentdのプラグインを書いてみました。 ちょうあるふぁばんです。 2013/12/24 追記 fluent-plugin-kinesisにマージできないかお伺いを立ててます https://github.com/imaifactory/fluent-plugin-kinesis/issu…

RubyでKinesisを使ってみた

AWS SDK for RubyがKinesisに対応したので、ちょっと触ってみました。 なにはさておき… aws-sdkを1.31.3以上にしましょう。 1.30.0はバグがあってまともに動かないです。 Kinesisについて コンセプトとかについてはドキュメントを読めばだいたい分かると思い…

AWS SDK for Rubyに無理矢理メソッドを追加する

AWS Advent Calendar 2013の2日目のエントリです。 RubyからAWSのAPIをたたくときはAWS SDK for Rubyを使うことが多いと思いますが、公式のSDKでも新しい機能のAPIに未対応な場合があります。(例: aws-sdk 1.24.0 での describe_load_balancer_attributes …

drone.io+VagrantでRuby 2.0.0のrpmを自動作成するようにしてみた

Amazon Linuxを起動したら、だいたい一番最初にRuby 2.0.0のビルドを始めるのだけれど、まいどまいど同じことをやっているのでrpmを自動作成するようにしてみた。 https://github.com/winebarrel/ruby-2.0.0-rpm Ruby 2.0.0のspecファイルを公開している人が…

ruby-jq 0.1.0

libjqが簡単に使えたので、NokogiriっぽいRubyのバインディングを作りました。 https://bitbucket.org/winebarrel/ruby-jqJSONはHTMLほど複雑ではないですが、ネストの深いデータを一発でとってこれるのは便利…かも知れないです。以下はGitHub APIでファイル…

Piculet/Kelbimというツールを作りました

Piculet https://bitbucket.org/winebarrel/piculetKelbim https://bitbucket.org/winebarrel/kelbim 以前作成したRoadworkerと同様に、AWSの設定をRubyのDSLで管理します。Piculetはセキュリティグループを、KelbimはELBを対象としています。 Piculetのほう…

MessagePack-RPCでドメインソケットを使う

サーバ 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…

ddbcli - 対話型のDynamoDBクライアント

https://bitbucket.org/winebarrel/ddbcli DynamoDBのmysqlコマンド的なクライアントを作りました。ほんとはAWS Tools Hackathonでこのネタをやろうとしていたのですが、DynamoDBのAPIにさわり始めたらあれよあれよと実装が進んでしまいまして。本番どうする…

SimpleDBで手軽に集計処理を行う

あまりがっつりとSimpleDBを使い込んでいる訳ではないですが、ちょっとしたデータをつっこんでおくにはなかなか便利です。特にログを残しておきたいときは特別なミドルウェアを用意する必要がないので、サーバやミドルウェアの検証をやるときにはよく使って…

Ruby版ec2-describe-spot-price-history

#!/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…

Brainf*ck

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]…

MySQLからMongoDBへレプリケーションする

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のバインディングを書きました…が

少し前に話題に上ったmysql-replication-listener(libreplication)のRubyバインディングを書きました。https://bitbucket.org/winebarrel/ruby-binlog/ require "binlog" client = Binlog::Client.new("mysql://repl:repl@nyarlathotep") client.connect c…

Ruby+SES(smtp)でメールを送信

例によってシンプルな情報が少ないので、すこしまとめてみた。 設定の確認とCredentialの作成 Management Consoleの「SES > SMTP Settings」でSMPTの設定の確認と、Credentialを作成。*1 メールアドレスの認証 sandbox状態だと認証された送信者・受信者でし…

EventMachineで簡単なロードバランサーを書いてみた

同期の問題は大変デスネー Hostヘッダ渡さなくてもレスポンス返してくれたのがちょっと意外だった。 hHatena Blogはレスポンス返してくれるのかな? #!/usr/bin/env ruby require 'rubygems'a require 'eventmachine' class Backend < EM::Connection def i…

EventMachineで簡単なロードバランサーを書いてみた その2

あ、さっきの嘘だ。 普通にラウンドロビン実装できた。 #!/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…

EventMachineでHTTPd

重い処理はバックグラウンドに回すのが正解なのかな。 基本的にmutableなオブジェクトの共有はNGな気がするな。 #!/usr/bin/env ruby require 'rubygems' require 'eventmachine' class HTTP < EM::Connection def receive_data(data) operation = lambda do…

Scheduled Eventチェック用Nagiosプラグイン

#!/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クライアント

ちょっとしたメタ情報を取るのにec2-api-toolsだと遅いし(JAVA_HOMEとかの設定も必要だし)、gemでライブラリをインストールするのもいやなので、rubyの標準ライブラリだけで簡易的なクライアントを作ってみた。*1 #!/usr/bin/env ruby require 'cgi' requi…

srandのデフォルトのシード

さらっと読むかぎり、/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 >= …

クックパッドの勉強会でMurakumoの話をしました

ゴシッププロトコルによる冗長化と負荷分散の検証 View more presentations from winebarrel 謝辞 懇親会で話しかけてくださった方々ありがとうございます。全力で懇親会を避けていた自分としては、あの手の懇親会での立ち位置が未だによくわかりません。マ…

Murakumo

https://bitbucket.org/winebarrel/murakumo/大体できてきた。あとはパフォーマンスのチェックとか、細かい動作確認。

TCPSocket.newのDNSラウンドロビンの調査

mysqlへの接続時にホスト名に紐付くIPアドレスが帰ってきたらどうなるのかと思って少し調査中。 libcのレベルでは複数のgetaddrinfoが複数のIPアドレスをそのまま返している。 http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/getaddrinfo.3.html Ru…

Rubyのrand

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, …

Amazon SimpleDBのクライアント

#!/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…