wtatsuruの技術方面のブログ

はてなスタッフ id:wtatsuru です。日常ブログはこちら https://tatsuru.hatenablog.com/

crontab の割り算と大きな数字

crontab にこんなのが書いてありました

*/120 * * * * $COMMANDS

書いた人は2時間おきに実行したかったんだと思いますが、まあうそっぽいですよね。
ちなみに crontab(5) には "steps" と書いてあります。

       Ranges can include "steps", so "1-9/2" is the same as "1,3,5,7,9".

ISC cron 3.0 の entry.c を観察。
まず * は最小から最大まで、と同じ意味。なるほど。

	if (ch == '*') {
		/* '*' means "first-last" but can still be modified by /step
		 */
		num1 = low;
		num2 = high;

で、num1-num2/num3 の形式で記述されてると num3 を step として単純に num1 から num2 まで増やしてる。大きすぎる数字を入れると一発目しか実行されない。

	/* range. set all elements from num1 to num2, stepping
	 * by num3.  (the step is a downward-compatible extension
	 * proposed conceptually by bob@acornrc, syntactically
	 * designed then implmented by paul vixie).
	 */
	for (i = num1;  i <= num2;  i += num3)
		if (EOF == set_element(bits, low, high, i))
			return EOF;

結論

大きな数字を書いても意味がない

Twitterでのやりとり

@songmu さんの言う通りの結論でした。

新しいReserved Instance

AWSの新Reserved Instanceの話です。

Amazon Web Services ブログ: 【AWS発表】EC2のリザーブドインスタンスモデルがシンプルに
購入オプションを見ると、Heavy Usage がなくなって焦ったのでがんばって追いつきました。こちらの記事がたいへん参考になりました。

Amazon EC2のリザーブドインスタンスで重度の購入オプション拡充&軽度/中度の廃止 | cloudpack技術情報サイト

どうなったのか

三行で

  • 従来の "Heavy Utilization" のみに集約された
  • 初期費用の払い方で、最初に一括・半分払って残りは月々・初期費用無し月額のみ、の3つのオプションあり。真ん中が従来のと同じ
  • インスタンス起動の有無に関わらず料金は同じ

感想

基本Heavyで買って、AutoScale な部分をどうするか、〜〜〜、これは人間が考えるものではない!!!という議論をしていましたが、過去のものとなりました。使う分だけ買いましょう。
リソース確保のためだけに light っていうやり方ができなくなりました(最近はそんなに困らなくなったんでしょうか)。料金面では、頑張らなくて良くなった分、頑張っていたよりは高くなることもあるかもしれませんね。

おまけ

こういうので表にしました https://gist.github.com/tatsuru/fd048d331135b00b30b0

multilog が作るディレクトリのパーミッション

ここで固定されてる。
https://github.com/daemontools/daemontools/blob/master/src/multilog.c#L312
damontools-toaster で堅いこと言うなよ、というパッチを当てたりする。よい子は真似してはいけない。

diff -Naur ./src/multilog.c ../daemontools-0.76/src/multilog.c
--- ./src/multilog.c    2014-09-16 15:52:28.654130526 +0000
+++ ../daemontools-0.76/src/multilog.c  2014-09-16 15:51:25.779141973 +0000
@@ -309,7 +309,7 @@
   if (fchdir(fdstartdir) == -1)
     strerr_die2sys(111,FATAL,"unable to switch to starting directory: ");
 
-  mkdir(d->dir,0700);
+  mkdir(d->dir,0755);
   d->fddir = open_read(d->dir);
   if ((d->fddir == -1) || (fchdir(d->fddir) == -1))
     strerr_die4sys(111,FATAL,"unable to open directory ",d->dir,": ");

Docker Index Trusted Build してみた

Docker Index の Trusted Build ってやつをやってみた。
tatsuru/ikachan Repository | Docker Index
やり方はこの辺に書いてある通り Docker Index Help Documentation and Support | Docker Index

  • まずは適当にリポジトリを作る tatsuru/docker-images · GitHub
    • Dockerfile 1枚のリポジトリが並ぶのは嫌だったので、ikachan/ 以下に Dockerfile と README を置く。
  • Trusted Build のページから適当に Build 追加。Github の hook が作られる。
  • 自動ビルドされるので、 build statusのページ を眺めるだけ
    • Build Queue ってのがあって、自分の場合は20分くらい時間がかかった。CI的に使うには向いてなさそう。
  • ビルドされたら Transfer Queue に入って転送される。これはすぐに終わった。

repository information には README.md と Dockerfile がうまいこと結合されたやつが入ってた。
公開用のビルドは全部これでやると、たしかに安心できる。もうちょっと速くなればなぁ。

ikachan docker image

Ikachan が動く docker image 作った。
tatsuru/ikachan Repository | Docker Index
ikachan 動かしたいことがたまにあるけど、モジュールが入らなかったりして面倒だったので公開 docker コンテナにしてさくっと動かすようにした。何かツールを動かしたい時も、一式全部 docker コンテナにしておくと何も考えなくてよくなっていいな。
docker push が耐えられないほど遅くて、しかもたまにこけるので、よく使うやつじゃないとやる気がでない。

JAWS DAYS 2014 発表してきました

JAWS DAYS 2014
ちょっと前の話になりますが、JAWS DAYS 初参加・初発表してきました。発表については会社の方のレポートが詳しいのでそちらでどうぞ。
【イベント登壇レポート】JAWS DAYS 2014で、Miiverseの取り組みを弊社エンジニア渡辺が任天堂と共同で発表しました - Hatena Developer Blog
Jaws Days 2014 Miiverse // Speaker Deck

参加者としての感想をいくつか。

いろいろやりがいがある環境なのでどんどん改善していきたいと思います

よくサンプルにあるやつ

require 'aws-sdk'
ec2 = AWS::EC2.new(
  :access_key_id => ACCESS_KEY,
  :secret_access_key => SECRET_KEY,
  :ec2_endpoint => 'ec2.ap-northeast-1.amazonaws.com'
)

IAM role を設定したインスタンスだと、ACCESS_KEY, SECRET_KEY は自動で取得してくれて便利

ec2 = AWS::EC2.new

途中でリージョン変えるのは適当にこういう感じで

ec2 = ec2.regions[region]
ec2.instances.filter('instance-state-name', 'running')

client を使うとAPIだいたいそのまま叩けていいんだけど、この方法だと region 設定できないので注意する。そのまま多々気に入ってるだけみたい

ec2 = AWS::EC2.new
client1 = ec2.client  # これは us-east-1
client2 = ec2.regions['ap-northeast-1'].client # これも us-east-1
client3 = AWS::EC2.new(:ec2_endpoint => 'ec2.ap-northeast-1.amazonaws.com').client #ちゃんと設定すると ap-northeast-1 を向く

Regions and Endpoints - Amazon Web Services

はてなで一緒に働きませんか?