(きこえる) CIDR アドレス計算ツール
(きこえる) CIDR アドレス計算ツール by tily
ソース: tily/cidrcalc
仕事で必要になったとき、(今さら)CIDRアドレス計算ツール by yamagata21 にお世話になっていたんだけど、IPをそのままコピペできない点とかがやや不便だったので、勉強がてらに自分がほしい感じの CIDR アドレス計算ツールを作った。下記が工夫した点です。
- オクテット毎の入力ではなく IP アドレスをそのままペーストできる
- クライアントサイドだけで完結しているのでサーバーサイドに IP アドレスを送らなくていい
- ボタンをおさなくても正しい IP アドレスを入力すれば結果が反映される
- パーマリンクをはれる
- 8 進数・16 進数・整数の表示は必要になることが少ないので思い切って削った
あと、どうせなら何か機能を追加しようと思い、2 進数にした IP アドレスを 32 分音符に見立てて、音として聴ける機能を追加してみた。Web Audio API を使っているのでそれなりにちゃんと聴こえるのではないかと思います。10. ではじまる IP アドレス、192.168. ではじまる IP アドレス、172. ではじまるIP アドレスぐらいは聴き分けられそうでおもしろい。
YouTube の動画を組み合わせて新しい音楽を作れる YouSample というウェブアプリを作った
最近サンプリングベースの HIPHOP が好きで、YouTube の動画を並べるだけで新しい音楽を作れたら面白いんじゃないかなと思い作ってみた。
作例なので適当でセンスない感じだけど、こういう感じの (http://bit.ly/1orEbbL http://bit.ly/1iyH9mG) とかを簡単に作れます。最大 4 つの YouTube 動画を埋め込むので結構重いかも。あと、Mac+Google Chrome でしか動作確認していません。
ハッシュに JSON を埋め込むのは前に hitode909 さんがやっていたのを真似しました。タイミング制御に mohayonao/MutekiTimer を使おうとしたのだけどうまくできなかったのでそのうち再チャレンジしたい。
追記(2014/06/15)
Mac+Google Chrome でしか動作確認していなかったら、ほんとにそれ以外の環境ではまともに動かないことが分かりました。無念。どうも音が細切れに再生されてしまうような気がするんだけど、何が悪いのかよく分からないので分かったら直したいです。
あと、ブックマークコメントで renu さんから「ミュートボタンで音をオンオフとか面白いなあ」というのを頂戴したのですが、似たようなものを作ろうとしている人のために書いておくと、YouTube Player API Reference for iframe Embeds では、一度プレイヤーをstopVideo() すると seekTo() してもすぐに指定した位置に戻って再生してくれないので、常にプレイヤーの状態を playing にしたまま unMute() して指定した時間が経ったら mute() するような実装になっています。
ボタン一発で @nifty ID を切り替える Google Chrome 拡張 Nifty Id Switcher
インストール:Chrome Web Store - nifty id switcher
ソース:tily/nifty-id-switcher
ものすごくニッチな感じの Google Chrome 拡張を作りました。
ニフティクラウドで複数のアカウントを使い分けている人とかにおすすめです。
本当に基本的な機能しか実装しておらず、デザインも適当なのでプルリクをお願いします。
- 個人の製作物でありニフティ株式会社とは一切関係ありません
- パスワードを含む @nifty ID アカウント情報を Google Chrome のローカルストレージへ保存します、自己責任でご利用ください
追記:ログアウトのロジックが足りないのとか、もろもろ不具合に気づいたので近日中に直します。
Chef のレシピから serverspec のテストを自動生成する chef-serverspec-handler という gem を作ってみた
『Chef のレシピは「こうあるべき」を記述するものだから、レシピからテストが自動生成できるべきだよな』とずっと思っていたんだけど、最近触りはじめた serverspec がシンプルで簡単に自動生成できそうなのでやってみた。
使い方は上記リンクに書いてある通りなのですが、たとえば Chef のレシピにこう書いてあるやつを、
template '/var/tmp/template.txt' do source 'template.txt.erb' mode 0777 owner 'root' group 'root' variables(:val1 => 'val1', :val2 => 'val2', :val3 => 'val3') action :create end
このような serverspec のテストに自動変換してくれます。
context file('/var/tmp/template.txt') do it { should be_file should be_mode 777 should be_owned_by 'root' should contain 'val1' should contain 'val2' should contain 'val3' } end
この形がよいのかどうかはよく分からないけど Chef の Handler として実装してあり、--why-run オプションと組み合わせて使うことを想定しています。
コンセプトコードみたいなものなので、ちゃんと動かないところがたくさんあるかも。というか試しに Opscode コミュニティの wordpress クックブック + ニフティクラウドの CentOS 6.3 64bit Plain サーバーで試したら、自動生成された 77 テスト中 4 つのテストが失敗した。
Failures: [18/829] 1) apache2::default Package "apache2" Failure/Error: it { should be_installed } rpm -q apache2 パッケージ apache2 はインストールされていません。 expected Package "apache2" to be installed # ./spec/localhost/apache2/default_spec.rb:5:in `block (3 levels) in <top (required)>' 2) apache2::mod_php5 Package "php package" Failure/Error: it { should be_installed } rpm -q php\ package パッケージ php package はインストールされていません。 expected Package "php package" to be installed # ./spec/localhost/apache2/mod_php5_spec.rb:9:in `block (3 levels) in <top (required)>' 3) mysql::server File "/etc/my.cnf" Failure/Error: should contain 'false' grep -q -- false /etc/my.cnf expected File "/etc/my.cnf" to contain "false" # ./spec/localhost/mysql/server_spec.rb:73:in `block (3 levels) in <top (required)>' 4) wordpress::default File "/etc/httpd/sites-available/wordpress.conf" Failure/Error: should contain '{:template=>"wordpress.conf.erb", :enable=>true, :docroot=>"/var/www/wordpress", :server_name=>"localhost", :server_aliases=>["localhost"], :na me=>"wordpress"}' grep -q -- \{:template\=\>\"wordpress.conf.erb\",\ :enable\=\>true,\ :docroot\=\>\"/var/www/wordpress\",\ :server_name\=\>\"localhost\",\ :server_aliases\=\>\[\"localhost\" \],\ :name\=\>\"wordpress\"\} /etc/httpd/sites-available/wordpress.conf expected File "/etc/httpd/sites-available/wordpress.conf" to contain "{:template=>\"wordpress.conf.erb\", :enable=>true, :docroot=>\"/var/www/wordpress\", :server_name=>\"l ocalhost\", :server_aliases=>[\"localhost\"], :name=>\"wordpress\"}" # ./spec/localhost/wordpress/default_spec.rb:44:in `block (3 levels) in <top (required)>'
1,2 は CentOS なのに Debian/Ubuntu のパッケージをインストールしようとしているのでレシピが悪いように思うのですが、
3,4 は chef-serverspec-handler が template リソースの variables で指定されたハッシュの値を単純に should contain しているのがダメで、そもそも variables は単純な値の埋め込み以外にも true/false を渡してテンプレートの内容を切り分けるような用途にも使うので、テンプレートの内容を論理的に解析する必要があり、対応するのがむずかしそうに思った。
というようにマダマダな感じなのですが、既存のレシピ資産にテストを書く足がかりにはなると思うので、よかったらお試しください。
Chef の Cookbooks を一発で NIFTYCloud クラウドストレージにアップロードする ncss-cookbooks コマンド
ニフティクラウド上で手軽に Chef を試したいときには、ニフティクラウドストレージへ tgz 形式でアップロードした上で chef-solo コマンドの -r オプションで URL を指定する方法が便利です。
$ chef-solo -j node.json -r https://my-bucket.ncss.nifty.com/v0.0.0/cookbooks.tgz
上記コマンドを打つと、chef-solo は -r に指定された tgz アーカイブファイルをウェブ経由で取得し、ローカルへ展開した上で cookbooks を実行してくれます。
chef-solo -r で取得できるのは便利なのですが、いちいち cookbooks を tgz に書庫化してニフティクラウドストレージへアップロードする部分が面倒なので、これを自動化するコマンドを作りました。
インストール
$ gem install ncss-cookbooks
使い方
管理している cookbooks レポジトリの直下に VERSION というファイルを作成してバージョンを書き込みます。
$ echo "0.0.0" > VERSION
環境変数でニフティクラウドストレージの API キーを設定します。
$ export ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX $ export SECRET_ACCESS_KEY=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
あとはバケットを作成するコマンドと、作成したバケットに cookbooks.tgz をアップロードするコマンドを叩くだけです。
$ ncss-cookbooks create my-bucket $ ncss-cookbooks upload my-bucket Version is v0.0.0 Creating directory /tmp/ncss-cookbooks-20130519-30448-2im9m1/cookbooks/ Copying files from /home/tily/dev/ncss-cookbooks to /tmp/ncss-cookbooks-20130519-30448-2im9m1/cookbooks/ Excluded /home/tily/dev/ncss-cookbooks/.git Archiving /tmp/ncss-cookbooks-20130519-30448-2im9m1/cookbooks/ to /tmp/ncss-cookbooks-20130519-30448-2im9m1/cookbooks.tgz Uploading /tmp/ncss-cookbooks-20130519-30448-2im9m1/cookbooks.tgz to bucket:my-bucket, object:v0.0.0/cookbooks.tgz Temporary directory /tmp/ncss-cookbooks-20130519-30448-2im9m1 will be deleted automatically Uploaded to https://my-bucket.ncss.nifty.com/v0.0.0/cookbooks.tgz
発行された URL は chef-solo -r から利用できます。
$ chef-solo -j node.json -r https://my-bucket.ncss.nifty.com/v0.0.0/cookbooks.tgz
あとがき
- 特に大したことはやっていないのですが、バージョン管理の運用と組み合わせて使えるので結構便利なのではないかと思います
- 最初 knife コマンドに組み込もうと思ったのですが、knife は色々なファイルをロードして結構重いので単体のコマンドにしてみました
- 個人的には前に作ったニフティクラウドを vagrant のように使える some コマンドと組み合わせて使おうと思っています
- そもそも chef-solo -r が BASIC 認証等に対応していないので cookbooks.tgz を認証なしの URL に置かなければならないのが少し厳しい感じがします、やはり本格的に運用するなら Chef サーバーでしょうか
ニフティクラウドを vagrant のように使える some コマンド
heroku の中の人が作った sumo (相撲)というツールがあります。vagrant のような感覚で amazon ec2 のインスタンスを作ったり Chef で設定したり削除できたりするやつです。これを修正してニフティクラウドでも使えるようにしてみました。独自の機能もいろいろ追加してあります。
詳しくは上記 github の README を参照していただきたいのですが、ここでは mysql サーバーを立てる例を簡単に説明してみます。
設定ファイルを書く
~/.some ディレクトリを作成し、~/.some/config.yml に下記の設定を書き込みます。
- ~/.some/config.yml
--- access_key: XXXXXXXXXXXXXXXXXXXX secret_key: YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY cookbooks_url: http://some.ncss.nifty.com/cookbooks.tgz role: mysql: | { "run_list": [ "recipe[mysql::server]" ], "mysql": { "server_root_password": "mysql", "server_debian_password": "mysql", "server_repl_password": "mysql", "bind_address": "ZZZ.ZZZ.ZZZ.ZZZ", "allow_remote_root": true } }
some コマンド実行
実行するのは 2 つのコマンドのみです。
$ some launch mysql ---> Launch instance... 0ebfa18a (8.4s) ---> Acquire hostname... AAA.AAA.AAA.AAA (82.5s) ---> Wait for ssh... done (0.0s) ---> Bootstrap chef... done (63.3s) ---> Setup mysql... done (145.4s)
$ some openfw 3306 port 3306 scheduled for open
ここまで終われば SSH ログインができるようになっているし、
$ some ssh AAA.AAA.AAA.AAA Enter passphrase for key '/home/tily/.some/keypair.pem': (パスワードを入力) [root@localhost ~]#
外部から mysql サービスに接続できるようになっています。便利。
$ mysql -h AAA.AAA.AAA.AAA -u root -p Enter password: (パスワードを入力) Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.1.67-log Source distribution Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql>
何が行われているか
簡単に流れを説明します。
$ some launch mysql
- 存在しなければ something という名前の FW を作成する
- 存在しなければ something という名前の SSH キーを作成してローカルの ~/.some/keypair.pem に保存する
- FW=something, SSH キー=something でサーバーを作成する
- サーバーが起動し SSH が疎通するまで待つ
- SSH が疎通したら SSH 経由でサーバーに Chef をインストールし /etc/chef/solo.rb を設定する
- config.yml に書いてある mysql の設定をサーバーの /etc/chef/dna.json に置く
- config.yml の cookbooks_url から cookbooks を取得し chef-solo を実行する
$ some openfw 3306
- something FW の 3306 ポートを開放する
という感じです。ちなみに要らなくなったサーバーはコマンド一発で削除することができます。
$ some terminate 0ebfa18a ---> Wait to stop... done (20.8s) AAA.AAA.AAA.AAA scheduled for termination
編集後記
自分でガシガシ使えそうなツールが作れたのでよかった。
あと最近 vagrant が流行っているようなんだけど、個人的にはクラウドは面倒を他人に委ねることだから、sumo や cucumber-chef のように本番環境だけでなく検証やテストも外部に委ねられるようになるのが未来だと思っています。
cookbook とか用意しなくても chef を試せる patty.rb というスクリプトを書いた
オハイ! Chef はよくも悪くも仕組みが大げさなので、思いついたときにぱっと試すのが面倒くさいと前々から思っていた。
なんとか cookbook を作らなくても簡単に試す仕組みを作れないかなと思って、自分のアプリケーションから Chef Solo を呼び出す — Gist とか 手軽に chef-solo を実行するためにスケルトンを作ってくれるやつ (ユースケース要検討) — Gist とか色々試していたんだけど、先日Opscode 社 Chef ハンズオン・トレーニングに出席したときに shef がかなり理想に近いことが分かったので、shef のコードを読み、インタラクティブ・シェルではなく 1 枚のファイルの中にレシピとテンプレートを記述できる仕組みを作ってみた。
こんな感じのレシピファイルを作成して、
- recipe.rb
file '/tmp/hello.txt' do content "hello!\n" end template "/tmp/hello2.txt" do local true source "hello" variables :name => 'world' end template "/tmp/foobar.txt" do local true source "foobar" variables :name => 'tily' end __END__ @@ hello hello, <%= @name %> @@ foobar this is another template: name is <%= @name %>
こんな風に実行すると、
- 実行方法
ruby patty.rb recipe.rb
chef-solo っぽくスタンドアロンで Chef を実行できる。
- 実行結果
bash-3.2$ ruby patty.rb recipe.rb Loading....[2012-11-10T12:48:58+09:00] DEBUG: Building node object for linwttaa.local [2012-11-10T12:48:58+09:00] DEBUG: Extracting run list from JSON attributes provided on command line [2012-11-10T12:48:58+09:00] DEBUG: Applying attributes from json file [2012-11-10T12:48:58+09:00] DEBUG: Platform is mac_os_x version 10.7 [2012-11-10T12:48:58+09:00] INFO: Run List is [] [2012-11-10T12:48:58+09:00] INFO: Run List expands to [] done. [2012-11-10T12:48:59+09:00] INFO: Processing file[/tmp/hello.txt] action create ((eval) line 2) --- /var/folders/9q/tq6hwz3j7qd_nctywdr_4mp40000gn/T/chef-tempfile20121110-23863-enwe0z 2012-11-10 12:48:59.000000000 +0900 +++ /var/folders/9q/tq6hwz3j7qd_nctywdr_4mp40000gn/T/chef-diff20121110-23863-vo0wbv 2012-11-10 12:48:59.000000000 +0900 @@ -0,0 +1 @@ +hello! [2012-11-10T12:48:59+09:00] INFO: entered create [2012-11-10T12:48:59+09:00] INFO: file[/tmp/hello.txt] created file /tmp/hello.txt [2012-11-10T12:48:59+09:00] INFO: Processing template[/tmp/hello2.txt] action create ((eval) line 6) [2012-11-10T12:48:59+09:00] DEBUG: Current content's checksum: [2012-11-10T12:48:59+09:00] DEBUG: Rendered content's checksum: 853ff93762a06ddbf722c4ebe9ddd66d8f63ddaea97f521c3ecc20da7c976020 --- /var/folders/9q/tq6hwz3j7qd_nctywdr_4mp40000gn/T/chef-tempfile20121110-23863-4d1443 2012-11-10 12:48:59.000000000 +0900 +++ /var/folders/9q/tq6hwz3j7qd_nctywdr_4mp40000gn/T/chef-rendered-template20121110-23863-8svaro 2012-11-10 12:48:59.000000000 +0900 @@ -0,0 +1 @@ +hello, world [2012-11-10T12:48:59+09:00] INFO: template[/tmp/hello2.txt] updated content [2012-11-10T12:48:59+09:00] INFO: Processing template[/tmp/foobar.txt] action create ((eval) line 12) [2012-11-10T12:48:59+09:00] DEBUG: Current content's checksum: [2012-11-10T12:48:59+09:00] DEBUG: Rendered content's checksum: 04fc2a8f0333e6412a408e347ca49aab17b1b179f42be3d4cc2fd42fc4bcdf50 --- /var/folders/9q/tq6hwz3j7qd_nctywdr_4mp40000gn/T/chef-tempfile20121110-23863-1woio2b 2012-11-10 12:48:59.000000000 +0900 +++ /var/folders/9q/tq6hwz3j7qd_nctywdr_4mp40000gn/T/chef-rendered-template20121110-23863-1ai39uj 2012-11-10 12:48:59.000000000 +0900 @@ -0,0 +1 @@ +this is another template: name is tily [2012-11-10T12:48:59+09:00] INFO: template[/tmp/foobar.txt] updated content
実験的なスクリプトなのであまり品質は高くないかも。でもなんかこういう「Chef をカンタンに使える仕組み」がもっとあっていいと思っている。