「技術」カテゴリーアーカイブ

dockerizeコマンドで他のDockerコンテナの立ち上げを待つ

「Docker で動くようにすること」(to dockerize)じゃない、ツールの方の dockerize (jwilder さん作)を使って、同じDocker network 内(setup_remote_docker したもの)に立ち上げ中のコンテナの準備ができるのを待たせる方法。

# 名前が紛らわしいのは検索性を低めてると思いますが

どうせならツールも自力でセットアップせずに docker hub にあるものを呼べばよいということで、

docker run jwilder/dockerize -wait http://sample.test/ -timeout 3m -wait-retry-interval 5s

上は、http://sample.test/ が応答を返すまで、最大3分間、5秒おきに問い合わせ。

CircleCI の中で待ちたかった(コンテナの立ち上げが終わってからテストを流す)ので、ターゲットのコンテナと同じ Docker network でこれを呼ぶと、.circleci/config.yml は

    - steps:
       (中略)
      - run:
          name: Run Docker Containers
          command: docker-compose up -d
      - run:
          name: Wait until the target docker container fully set up
          command: |
            docker run --network my_network \
              jwilder/dockerize -wait http://my_service/about/ -timeout 3m -wait-retry-interval 5s
      - run:
          name: テストとか

こんな感じでいけました。

CircleCI公式のDocker image には dockerize も入ってる

しかし、その後、CircleCIの用意してくれているDockerベースのDocker Container を使う場合、そのコンテナには Docker だけでなく Docker Compose や Dockerize も含まれているということに気づきました。

「あれ? じゃ上のコード無意味で、直接 dockerize を呼べばいいだけでは?」と思い直し、これを試してみたのですが、

      - run:
          name: Wait until docker container fully set up, from the same docker network
          command: |
            dockerize -wait http://my_service/api/doc -timeout 3m -wait-retry-interval 10s

ネットワークが違うのでアクセスできません。そりゃそうか。CircleCIの中で立ち上がったDocker MachineのIPアドレスが取れれば、それでアクセスできそうだけど。

ドキュメントにありました。同じコンテナか、同じネットワークのコンテナからのアクセスとするのが正しいやり方のようです。CircleCIが使ってるprimary のコンテナにはもう Dockerize コマンドの実体があるので、同じものを再度リモートから取得するのはもったいない気もしますが。

sleepでwait

CircleCI のドキュメントのサンプルでも

      - run:
          command: |
            git push heroku fan-in-fan-out:master
            heroku run rake db:migrate
            sleep 5 # sleep for 5 seconds to wait for dynos
            heroku restart

みたいなことが書いてあって、”sleep 5″って、それいつでも大丈夫なの? と思ったので調べました。まあサンプルはサンプルなので。

Docker+Traefikで同一ホストのサブフォルダとルートフォルダで別バックエンドを見に行かせる

Traefik をリバースプロキシにしてアクセスをバックエンドの Docker コンテナに振り分ける実験をしていたのですが、http://example.com/app1 と http://example.com/app2 をコンテナ app1 と app2 に振り分けることは無事できたものの、http://example.com/ へのアクセスがどちらにもいかず404になってしまいました。

docker-compose.yml の label で Traefik の動作指定をしていたのですが、どちらかの app に / を含めてしまうと、/ を書いた方の定義が優先されてしまい、もう一方のサブフォルダが振り分けされなくなってしまいました。

では、/ を含む方の定義に2つの条件を書けばいいのでは、と思いましたが、一行の中にセミコロンで複数条件を書くのは、それらの AND を表していて、OR にはなりません。それでは、と、二つの条件を2行に並べて書くと、後で書いた方だけが有効になるよう。

公式の github project を検索すると、ラベルにサービス名をつけることで複数の条件を OR で指定できるようです。

Allow multiple rules from docker labels containers with traefik.<servicename>.* properties by benoitf · Pull Request #1257 · containous/traefik

この修正が今年の3月で、version 1.3.0 に入っている。ということは使えるということ。

iPad のカメラをボタンにするハック

iPad を Mac 用のタッチパッドにするアプリ Astropad が、新しいハックによって iPad にないボタンを増やした、とブログで発表しています。

ホームボタンが廃止されていく中で「アップルのミニマリズムへの追及に備えるため」と、カメラをボタンにする、その名も「カメラボタン」を思いついたということ。

カメラの上に指を置いて隠すと、カメラが隠されたことを持って「押された」ことにする、という仕組みです。

Astropad のようなお絵かきアプリでは、ボタンを押すとメニューが出てくるボタン、をどこかに置く必要があります。これを画面内に配置することももちろん可能ですが、画面のどこかにあるということは、描いている絵が一部隠れてしまうということになります。画面にボタンを置かずに、メニューボタンを実現したい(ホームボタンが無くなっても)、ということで考えた末に思いついた、とブログでは述べています。

ずっとカメラが動いてると電池の減りが早いのではないか? という疑問に対しては、指で隠されたことを検知するコードを頑張って、CPU使用量を1%以下に収めたそうです。

また、プライバシーの問題についても、オンオフに必要なぼんやりした画像のみを取り込むようにし、またカメラから来たデータがiPadの中に保存されたりすることのない構成にしたということ。まあこのへんはアプリ開発者を信じるかどうかになってしまうと思いますが。

カメラボタン機能自体を、設定でオフにすることもできるので、このUIしか使えないというわけではありません。

いろいろ考えるものだなあ。もちろん Apple が望んだ使い方では無いので、AppStore から消されるなどのリスクもあるかもしれないですね。

Astropad Standard

カテゴリ: Productivity, Photo & Video
言語: EN, JA, ZH, ZH
価格: 30 (USD)
バージョン: 2.3

開発者: Astro HQ
公開日: 2015年2月17日
評価(全バージョン):
(3643人のレビュー)
評価(現バージョン):
(926人のレビュー)

スクリーンショット

screenshot 0screenshot 1screenshot 2screenshot 3screenshot 4

via The Verge

Mood Color – 熱で色が変わるヘアカラー

PRAVANA 社のMood Colorは、熱を与えた時だけ色が変わる髪染め染料です。

こちらの Instagram で男性がデモをしていますが、ドライヤーの熱風と冷風の切り替えだけで、髪の色が変わっています。

https://www.instagram.com/p/BYKfC55jeqD/

温冷の切り替えの温度はかなり狭いようで、息を当てたり、手で触っただけでも変化する模様。外出して太陽の陽に当たることでも変化するそうです。

地の髪の色を染めておくことで、変化するグラデーションにさらに独自のバリエーションをつけられるようです。

染め方は、薬剤を混ぜて、塗って、乾かすだけ。temporary(一時的な)ヘアカラーとあり、シャンプーで落ちるレベルのもののようです。

今日から発売ということですが、エンドユーザー向けの市販ではなく、美容院向けにのみ卸しで販売ということ。また、この同じ染料を使ったエクステンションも勧めています。この売り方からすると、動画では簡単にできそうだけど、実際にこのヘアカラーでうまく染めるのは難しいのかもしれません。

温度の制御が上手くできて、もっと長い間落ちないようなものができれば、学校に行く時や就職の面接の時だけおとなしくするとかもできるのかもしれないですね。(学業や仕事に関係ない髪の色で人を判断する方がどうなんだ、という話は置いておくとして)

via Bored Panda

Anyprint – いろんな言語のprint命令がPythonで使えるライブラリ

ライブラリ anyprint をインポートするだけで、Python で以下のような出力文が書けるようになります。


printf("printf %d\n", 10);

fmt.Println("hello")

cout << "Hello, C++!" << endl;

Print["Hello from Mathematica!"]

console.log("yes");

io.write("lua land")

System.out.printf("java stuff\n");

System.Console.WriteLine("C# looks awkard");

Ada.Text_IO.Put_Line("Ada is cool")

IO.puts("elixir")

現在サポートされている他言語は、go, Java, VB .NET, C(とその類似言語), ActionScript, Ada, Amiga E, ASP, B, D, PureBasic, Clipper, C++, C#, Delphi, JavaScript, Lua, Mathematica, matlab, nim, Pascal, Pike, Elixir のようです。

Objective-C の NSLog, Ruby のp はプルリクエストが出ています。Closure風 と Rust風は Python の中では難しいと作者が答えていますが、誰か解決できる人がいたら挑戦してみてはどうでしょうか。

Pythonがメインの言語でない人でも、これを入れておけば自分の慣れた方法でprintできますね。

利用者からの推薦文が載ってますが、味わい深いです。

  • 「おかしいよあんた」
  • 「馬鹿馬鹿しいし役立たずだ」
  • 「僕の推薦文を追加してよ『なんて正確な推薦文たち』」
  • 「kragniz, おかしなPythonのメタモジュールばっかり公開するのはよせよ」

via Hacker News

「ギャンブラーの誤謬」ダイスプログラム

「ギャンブラーの誤謬(ごびゅう)」と呼ばれる言葉がある。コイン投げで表、表、表と連続して表が出ると、次は裏が出そうな気がする心理傾向である。実際は何回表が連続して出ようとも、次に表が出る確率は1/2である。なぜなら、コイン投げは、毎回独立事象(前回の結果と次のコイン投げは無関係)だからである。

ギャンブラーの誤謬 : カイジに学ぶ

現実のサイコロをまっとうにプログラムで再現すれば、乱数を使って毎回同じ確率で出るようになりますが、あえてギャンブラーが間違うような結果を出すサイコロを書くこともできます。Javascript で書かれたギャンブラーダイス

このダイスクラス、コンストラクタで与えた数字の面のサイコロとなります。6ならD6, 20ならD20。物理的な制約がないのでD7でもD13でも何でもできます。

このダイスでは、6面サイでたとえば1が出ると、次回は1が出にくくなります。何度も1が出れば、次に1が出る確率はどんどん下がっていきます。「これだけ1が続いたから、次は1は来ないだろう」というギャンブラーの思い込みが、本当に再現してしまうわけですね。

ボードゲームでこのようなダイスを用意するのは大変ですが、コンピューターゲームなら、こういった判定機を使うことで、プレイヤーがギャンブラーの誤謬のせいで「こんなはずはない」「騙されている気がする」と感じにくいようにすることもできるんでしょうね。実際やってるゲームがあるのかも。

via Hacker News
image credit: Flickr James Bowe