There's an echo in my head

日々のメモ。

Capistranoで今処理しようとしているhostの属するroleを判定する

host.rolesを叩くと、role(のSymbol)のSetが返ってくる。

task :foo do
  on release_roles :all do |host|
    host.roles #=> #<Set: {:web, :app, :db}> 
  end
end

git_strategyの中でもcontextを通して同じことができる。

set :git_strategy, MyGitStrategy

module MyGitStrategy
  def release
    context.host.roles #=> #<Set: {:web, :app, :db}> 
  end
end

一定時間だけS3のオブジェクトにアクセスできるURLを生成する

プライベートなバケットなんだけど、特定のURLを知ってる人だけがダウンロードするのを許可したいというときに使うやつ。

aws-sdk-rubyのv1だとAWS::S3Object#url_forで生成できたらしいんだけど、v2ではやり方が変わってるとのことなので試しにv2でやってみた。というかこれのコピペ。

# Gemfile
gem "aws-sdk", "~> 2"

# irbとか
require "aws-sdk"

s3 = Aws::S3::Client.new
signer = Aws::S3::Presigner.new(client: s3)
url = signer.presigned_url(:get_object, bucket: "my-private-bucket", key: "path/to/file.txt")

デフォルトだと15分。presigned_url:expires_inオプションで制限時間を秒数単位で指定できる。なおアクセス回数には制限がなくて、時間内であれば異なるブラウザ等から複数回アクセスできる。

詳しくは公式のドキュメントに記載されている。

で、試しにs3_signed_urlという、S3オブジェクトに対してGETできるURLを発行するコマンドを作ってgemにした。*1

例えばexamplebucketバケットのtest.txtに対してURLを発行するには次のようにする。

$ s3_signed_url s3://examplebucket/test.txt --expire 60
https://s3.amazonaws.com/examplebucket/test.txt?...

--expireオプションでURLが有効な秒数を指定できる。デフォルトだとSDKにもとづいて15分。

新しくファイルをアップロードしたい場合にも対応していて、--uploadオプションでパスを指定する。

$ s3_signed_url s3://examplebucket/test.txt --upload /path/to/test.txt
https://s3.amazonaws.com/examplebucket/test.txt?...

そんな感じ。

こういうコマンド系はaws-sdk-goを使って1ファイルにまとめたほうが便利なんだろうけど、ひとまず習作として。

*1:リネームした関係で2回yankした…。

Mac OSXでMariaDBをソースからビルドする

Mac OSX 10.9.5 MavericksでMariaDB 10.0.13をビルドした。

wget http://archive.mariadb.org//mariadb-10.0.13/source/mariadb-10.0.13.tar.gz
tar zxf mariadb-10.0.13.tar.gz
cd mariadb -10.0.13
cmake . \
   -DCMAKE_INSTALL_PREFIX=$HOME/opt/mariadb/10.0.13 \
   -DDEFAULT_CHARSET=utf8 \
   -DDEFAULT_COLLATION=utf8_general_ci \
   -DENABLED_LOCAL_INFILE=true \
   -DWITH_INNOBASE_STORAGE_ENGINE=1 \
   -DWITH_EXTRA_CHARSETS=all \
   -DWITH_READLINE=ON \
   -DWITHOUT_TOKUDB=1
make
make install

ちなみに

  • 一度tokudbを有効にしたままビルドしようとしたらエラーが出たので無効化した
  • 10.0.16をビルドしようとしたらlibgroonga.a(mrb_id.c.o) has no symbolsというエラーが出たので諦めた

参考

mysqlのスローログの出力をオンラインで停止、再開する

停止:

mysql> SET GLOBAL slow_query_log = 0;

再開:

mysql> SET GLOBAL slow_query_log = 1;

現状:

mysql> show variables like "slow_query_%";

mysqldumpしたデータをインポートしていたらことごとくスローログに積もり積もっていって慌てて停止したという次第。オンラインでできてよかった(mysql 5.1から)。

参考

/dev/twitterでTwitterと通信するようなのを作る

cat /dev/twitterで最新のツイートを取得したり、echo ねむい > /dev/twitterでツイートしたりするのが欲しくなったので試してみてる。

ロードマップとしては次のような感じ。

  1. Linuxカーネルモジュールのキャラクタデバイスとして/dev/twitterを作る
  2. HTTPで通信する
  3. HTTPSで通信する
  4. OAuth 1.0aでTwitterと通信する

2までは変なところもありつつなんとかなっているんだけど、3がつらい。もともとユーザ空間ではなくカーネル空間での話になるのでglibcなどのライブラリが使えないためOpenSSLも使えず、かといってHTTPS自体の仕様も詳しくない。幸いKernel 3.7以降でRSAが実装されているので、自力でなんとかなりそうではあるけども…。

ひとまず。

tipsはQiitaに書こう、そうしよう

http://qiita.com/ikm

あまり使ってこなかったけど、編集リクエストあるしシンタックスハイライトも見慣れてるしでそっちのほうが便利かと思った次第。

こっちはなんか妄想とかそういうやつに使おう。

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。