dockerホスト環境メモ

boot2docker

  • docker-machine + virtualboxのデフォルト
  • 基本はdocker-machineで管理するのが楽
  • アップデートが超簡単
  • dockerは常に新しい
    • docker本体がリリースされてすぐにdocker-machine upgradeすると新しくなる
  • カーネルは若干古い(4.4)
  • aufs

rancheros

  • docker-machine + virtualboxで使える
    • ただしアップデートできない
  • dockerは若干古い
  • カーネルはboot2dockerよりは新しい(4.9)
  • overlay2
  • boot2dockerより少しでかい

coreos

  • カーネル、dockerともに新しい(alpha channelの場合)
  • overlay2
  • 本体にgitとかも入っていて、多少は操作に耐えうる
    • git-lfsは入ってない
  • 割とでかい

alpine linux

  • 無理やりdockerを入れることができる
  • overlay2
  • カーネルはboot2dockerと同じくらい(4.4)
  • apkで色々なソフトを入れられる。dockerもedgeを有効にすればapkで入る
  • dockerは新しい

fedora25 atomic

  • atomicと言いつつ、でかい
  • カーネルは新しい(4.11)
  • dockerはとても古い
  • devicemapper
  • dnfで色々入る…と思いきやdnfが入ってない

いつも使っているのはdocker-machineなのでboot2docker。この構成は鉄板なのだが、boot2dockerはaufsにこだわっているせいかカーネルが古いのが気になるところ。設定だけならboot2dockerでもoverlayfsを使えないことはない。全体的に、新しさとして問題ないのはcoreosのalphaだが…

vagrantか何かでcoreosを上げて、docker-machine -d genericで使えば相当に快適に使える可能性が。ただ、docker-machineのcoreos用のprovisionerが古いのか分からないけど、ちょっと試した感じだとあんまりうまく行かない。vagrantでのネットワーク設定が悪いのかもしれない。試行錯誤してみる価値はあるだろうか?

川崎4-0イースタンSC (ハイネル無双)

会社を早退して、久々のバックSゾーンへ。

序盤から負けるはずのない相手だなという感じだった。ほぼ90分間、ハーフコートで試合を進める。ソンリョン、暇そうだったな…

小林悠が痛んで長谷川のアップを待ってから交代。無理させずにすぐに下げたほうが良かったと思いますね。数分の間なら、一人少なくても危険はなかったと思う。ちょっと嫌な感じもする序盤だった。こういう試合は先制点が重要ですが、最初のCKでドフリーのヘッドは枠外だったが、そのあとも攻め込み続けて左からのクロス。GKは出ましたが触れなかったです。これをハイネルが頭で合わせて先制に成功する。

あとは技術の差を見せつけて、割とやりたい放題かな。ただCKが当たっていたのと、相手GKが良くなかったのと、ハイネルが無双状態に入った感じで4-0で試合を締めくくった。久々に復帰した家長が出てきて会場を沸かせ、ビッグチャンスを2度得るがいずれも枠を捉えきれず、「持ってないのかこいつは…」とも思わせた。それでもテクニックもあるし他の選手との違いは見せてくれたので、今後は期待できる。

おまけに裏で広州と水原が引き分けて、なんと首位通過。まあ無敗ですからね。

とにかくいい夜でした。

CLIツールのライブラリ

最近はよくCLIのツールを作る。CLIツールと言えばオプションの解析処理だ。実際は最近だと何でもかんでもサブコマンドで作っていくから、サブコマンドの指定、グローバルオプション、サブコマンドごとのオプション、という解析が必要になる。

古くはGNU getoptの一強という時代があった。C言語だと今でもこいつなんじゃないかな。ただサブコマンドを書けないんじゃないかと思う。CやC++を使ってた頃はサブコマンド作る習慣がなかったもので…

時代は下り、数年前だとRubyのthorかGolangのcodegangsta(現urfave。どっちにしてもすごい名前だね)のcliをよく使っていた。いずれもサブコマンドを快適に使える。ついでにサブコマンドのみを使ってサブコマンドやオプションを補完してくれるREPLまで用意してくれればいいのだけど、、、と思って作ったのが→ github.com/wtnb75/go-cmdrepl だが、これcodegangsta時代のやつだな。今度urfaveに変えとこう。

仕事になるとCLIツールの作成をRubyかGolangで、というわけにも行かなくて、ごく最近だとPythonのClickやJavaのargs4jを使っている。言語の制約というのはどうしてもあるんですね。ライブラリとしてはthorやClickやargs4jは世代が新しいような感じ。今となってはurfave/cliはちょっと負けてるような気がする。せっかくGolangなら、structのメンバのtagで書かなきゃだよね。こんな感じのイメージ↓です。

type Args struct {
  Filename string `arg:"-f,--filename,help=your file name"`
  Verbose bool    `arg:"-v"
}

このくらい、自分で作ってみようかな…サブコマンドはどう表現しようか?

あとは…他にちょくちょく使う言語としてはnodejsがあるけど、commanderとかyargsというのがあるらしい。今度機会があれば使ってみようと思う。

(追記)

Golangの第2世代はgo-flagsってのがあるみたいですね。かなり便利そうな外観をしている。今度GolangでCLIツールを作る機会があったらこっちにしよう。

TVのごみ箱

今はHDDレコーダーに頼らずとも、テレビにHDDをつないで録画できる時代。うちは旧SHARP末期に買ったAQUOSを使っています。しかしこの録画システムは正直あまり具合が良くないみたいだ。みたいだ、というのは私がほとんど使っていないため。以下は家族からの伝聞になります。

  • 見終わった番組が勝手に消えてくれない
    • 満タンになりそうなら、視聴済み&消さないマークをつけてないやつを自動で消して欲しい。こういう機能はかなり昔からある。TiVoとか。SonyのTiVoクローン…製品名忘れたけど私は昔持ってた。それには部分的にあった。画面のUIは最悪の部類だったが
    • まあトラブルやクレームのタネになる機能だから入れたくない気持ちは分かるが、大多数の人にとっては新規録画が失敗するほうがヤバイでしょう。設定できて欲しい
    • 興味のありそうなものを勝手に録画してくれる機能は別に必要ないみたい?
    • TiVoのサービスインは1998年みたいだから、そろそろ特許も切れる頃? …まだ切れてないのか
  • 録画を削除したら復元できない
    • 「ごみ箱」システムがない。これ最初の項目と連動していて、勝手に消えないので「見た番組は削除する」ことを子供に言い聞かせているが、親も見たい番組を子供だけで見たときに先に消されてしまう…すると親が見れない事態に
    • ごみ箱なんてWindows 95の時代にすでにあったし、Macは初代からあったらしいよ(というかMacの前のLisaにもあったらしい)
    • 東芝のやつには「ごみ箱」があるらしい?
  • 録画予約の番組数に上限がある
    • 子供番組とかは短い時間の番組が多いが、子供がやたらに予約するので奥さんが予約しようとした時にできなかったりする
    • 常にギリギリの状態で回している模様
    • 同時録画の制限とかなら分かるけど、録画予約数に制限をかける意味がない

家電製品のUIについては、私がよくTVを見ていた時代でもPCから見て数世代は確実に遅れていたわけだが、話を聞いた感じだといまだに(このTVの発売は3年前ですが)変わってないっぽいですね。子供のリモコン操作と画面の様子を見てても、洗練されてない感じを強く受けるんだよね。普段使ってるはずのPCやスマートフォンの猿真似をするだけで飛躍的にユーザエクスペリエンスが向上するのに。だって開発者がごみ箱の存在を知ってから少なくとも20年は経ってるはずなんだよ?

あーでも、SonyだかどっかのTVの操作を電気屋さんで見たときになかなか良くなってたような感じがしたなぁ。最近だとFire TVの操作とかも快適なんだろうな、見たことないけど。当時SonyのTV買ってたらこういう感想は持たなかったのかもしれないね。Sonyに「ごみ箱」あるのか知らないけどw

川崎3-0新潟 (いつ以来の快勝?)、川崎93-86渋谷 (奇跡は起きる!)

凄まじく晴れ晴れとした天気。長男が日影の席にしようと。うんうん、そうだよね。なんて用意周到な奴なんだこいつは。

しかしバック2F席には日影になる席などほぼ存在せず、超満員の等々力でようやく確保できた座席にはサンサンとタイヨーのヒカリが降りそそぎ…これはマジでキツかった。ときどきコンコースに避難したりしていたが。途中でジュースが売り切れたのは痛かったね。絶望感。軽く熱中症になった人も多かったのでは。ガラガラだったらメインにアップグレードしてたとこだけど。

試合の方は快勝という結果。帰ってきた10番、大島がさすがのテクニックやパスセンスを見せ、阿部が役に立ち、ハイネルも頑張って。いい感じでしたね。武岡も戻ってきて戦力はかなり充実。あとは憲剛か…

試合後はアリーナでブレイブサンダースの消化試合を観戦。消化試合と言っても年間勝率トップの一番シードになるには今日か明日の試合に勝たなければならない。

これが非常に劇的な試合になりました。途中でかなり突き放されたが、なんとラスト8秒で同点に追いつき、延長に。延長では勢いそのままに万全の勝利を収めたという。

1Qは#14辻を始めとしてスリーポイントがよく決まって優位に立ったけど、攻撃がうまく回らなくなってあっという間に逆転された。会場はGWで割引券を近隣にばらまいたおかげでかなり入っていた。私の記憶では等々力アリーナ史上(?)最大の大入り。そして盛り上がるのね。アリーナも換気能力が追いついてなかったかも。熱気が凄くて気持ち悪くなりそうだった。

試合展開は、#12が崩壊しかけた試合を守備で救い、最後は当然#22ファジーカスが締めた。わたし的にはだから、MoMは#12でした。あいつがいなきゃどうにもならなかった試合だった。しかし渋谷はこれで負けるとは厳しいですね。終盤は時間使えば普通に勝てていたように思う。あと外しまくったFTを1つでも決めてたら…あのラストプレーでファウルもらえてれば…とタラレバの渦に吸い込まれそうな感じ。こんな試合もあるんだなって思った。奇跡は起きる! 何度でも!!

帰り道、ルールも分からずスコアとどっちが何点勝ってるかを30秒おきに聞いてきた三男は#22が気に入ったらしく、あの22番のひと、ちゅごいよね、と連呼したので、改めて今シーズンの個人スコアを見ると相変わらず凄くて、2位に500点差(!)をつけた得点王だった…

帰宅は20時を余裕で回ってたので子供の生活リズムには良くなかったし、自分としても異常に疲れた一日だった。

Chromeの人はネットのことを分かっていないのでは?

なぜ

  • .localドメインや127.0.0.1で
  • パスワードを入力する

…という条件でこう↓表示するんだろう?

たぶん、そういうの考えるの、もうめんどくさくなってしまってるんでしょうね。まあ面倒だから多めに出しとくか、みたいな。

でも、見なくてもいい警告(…(i)は情報であって警告ではないか)を出しまくるとユーザが慣らされて警告自体を見なくなるから、世界のセキュリティレベルは落ちていくでしょう? 社会正義に反すると思います。

まーみんなSafari使ってるから影響ないのかな。

最近の電話のゲーム事情 2017-04

この超個人的通勤電車スマホゲー動向シリーズは何度か書いてますが、最近の更新。

Math Puzzles

数学パズル。法則を見つけて回答するというもの。例えばこんなの。

IF,
  5, 3 = 28
  9, 1 = 810
  8, 7 = 115
  6, 2 = 48
THEN,
  7, 5 = ?

答え分かります? 序盤の問題なんで、このへんならスラスラ解けないと辛いと思います。この調子でいろんなパターンの問題が出てくる。フリー版では全75問ですが、55/60問くらいのところでギブアップ。序盤はヒントもあるんですけど、途中からヒントはなくなる。そして終盤に突入したところで難易度が上がりすぎて私の頭ではどうやっても解けない領域になってきているので、そろそろやめようと思ってます。非常に優秀なパズルゲームでした。問題は人力で考えてるんでしょうけど、どんな人なんでしょうね。

Mahjong King

いわゆる上海。判定が甘い代わりに積み方がえげつない感じ? まあまあ楽しめてましたが、そろそろ飽きてきた。

Entangled

迷路を作るゲーム。短い時間で遊べる。高得点が難しい。あんまり頭を使わないのでもう少しで飽きそう。

Puzzlerama

いろんなパズルで問題がたくさん。ただ斬新なパズルはなくて、詰め合わせてるからやってる、みたいな…最近だとUnblockという、本名は知らないですけどブロックをスライドさせて水色のブロックを外に連れて行くというのを中心にやっている。

まるばつ

これが傑作だった。元ルールはニコリとかかもしれず、Google Playの中でも同一ルールのゲームがいくつかあり(例えばbionoid, Mr. Binario, Subiku, Binary Puzzle, LogiBrain Binary)、ルール自体の正式名称は分からない。エラー表示は若干弱い(3つ並んだ時のエラーが表示されないので間違いに気づかずに最後までやってしまってあれあれ、となることがたまにある…)が同一列表示の補助があってアンドゥがちゃんとできて見やすいのでこの「まるばつ」を中心に、たまにbionoidをやっている感じ。あーあと初期配置のマスが判別できないという問題もあるか…。ただ表示の見やすさは特に大切なんだよ。

基本、マスにマルかバツをつけていくんだけど、ルールは簡単で、

  • 行内・列内でマルもしくはバツが3つ連続→NG
  • 行内・列内のマルとバツの総数は同じ
  • 行同士、あるいは列同士が全部同一→NG

というもの。法則はいくつか見えてきたので軽くPythonでソルバも書いてみたけど、難易度が高いものはまだ自作のソルバでは解けない感じ。盤面が広くなるとどうしても難しくなるけど、それが人力のミスや見落としが起きやすくなるためか、それとも読み方のパターンが増えるためなのか…。ソルバの方は、もうちょっと法則を仕込んでダメならバックトラックを実装したら解決するかも、と思っている。

bionoidは解が一意でないケースがあるような気がする。まるばつは盤面が小さく難易度が高いという問題がない。盤面がでかいと3並びのエラー表示がないのが致命的になるんだよなぁ…

…まあ今はこんな感じ。前回と比べると、ポケモンGOはずいぶん前にアンインストールしました。移動が楽になり、電池があまり減らなくなった。Kuromasuも結局全問クリアしたのでアンインストール。他はまだ残してあるけどほとんど起動してないです。スマホゲーって、夢中になるものであってもゲームあたりのプレー期間はずいぶん短いもんですね。

nginx + WordPressのBrute Force Login対策

このサーバをnginxに移行するまでは、WordPressでBrute Force Login Protection(BFLP)というプラグインを使っていた。これはログイン失敗の履歴を取っていって、一定以上に達すると.htaccessにdenyと書いてくれるというすぐれもの。WordPressは攻撃の標的になりやすい運命を持っているため、こういうプラグインは割と便利に使える。PHPに入る前にApacheの設定で切ってしまうというのも良い。で、実害があるとも思わなかったため、nginxに移行したあともこのプラグインをアンインストールしなかったのです。

「実害」か…実はこれ問題があった。

nginxは.htaccessを見たりはしない。だからBFLPが検出して管理者にメールを送り、.htaccessにdeny行を追加したあとも攻撃者はひたすらログイン試行を続けることができる。このような状況で何が起こるのかというと、私のメールスプールがすごいことになるというわけだ。まじですか。

先日朝起きたらすごい量のメールが飛んできていた。慌てたけどログイン成功というログは出ていなかったのでとりあえず一日放置していたら収まったのだが、このままやり過ごすのは気持ちが良くない。

nginxの場合、limit_reqで単位時間あたりのアクセス試行数を制限できる。WordPressのログインURLはwp-login.phpだから、この機能を使って、例えば1分にログイン試行10回までに制限するには、こんな感じの設定にすることになる。

http {
  limit_req_zone $binary_remote_addr zone=one:10m rate=10r/m;
  server {
     :
     location = /path/wp-login.php {
      limit_req zone=one burst=5 nodelay;
      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_pass unix:/var/run/php-fpm.sock;
    }
  }
}

これでBFLPの設定でログイン試行回数10回で制限をかけるようにしていると仮定すると、あなたが受け取るメールの量は1分につき1通、一日あたりたったの1440通にまで減らせる。しかし私としてはこれではあんまり芸がないような気がした。だって、見て分かる通り(↓)、BFLPのdeny対象はもっと広い。

# BEGIN Brute Force Login Protection
<FilesMatch ".*\.(php|html?|css|js|jpe?g|png|gif)$">
deny from xxx.xxx.xxx.xxx;
</FilesMatch>
# END Brute Force Login Protection

BFLPはスクリプトどころか、画像ファイルやCSSのダウンロードすら許さないのだ! 私としても、ウクライナの奴ら(←今回のアクセス元IPアドレス)に関してはserver全体でdenyしてしまいたい。ログインURLだけ制限するなんて生ぬるいと思えるわけだ。

そこで、incronを使って.htaccessファイルを監視し、変更があったらnginxの設定を更新してリロードをかければ良いではないか、と思った。つまり、こうだ。

# nginxの設定
http {
  server {
    :
    include /etc/nginx/bflp.conf;
  }
}

そして、bflp.confはこんな感じのシェルスクリプトで生成する。

#! /bin/sh
# Usage: $0 from to

from=$1
to=$2

[ -r ${from} ] || exit 1
[ -w ${to} ] || exit 1

awk '/# BEGIN Brute Force Login Protection/{flag=1;}/# END Brute Force Login Protection/{flag=0;}(flag==1 && /deny from/){print "deny",$3";";}' ${from} > ${to}
#sudo nginx -s reload
sudo systemctl reload nginx

あとはincronでIN_CLOSE_WRITEイベント発生時にこのスクリプトが叩かれるようにすればいいだろう。

# incrontab -l
/path/to/wordpress/.htaccess IN_CLOSE_WRITE /path/to/update-bflp.sh /path/to/wordpress/.htaccess /etc/nginx/bflp.conf

このスクリプトをrootで実行するのは気がひけるから、/etc/nginx/bflp.confをユーザwritableにして、一般ユーザのincrontabに登録する。ただしnginxのreloadはrootになる必要があるから、sudoのrequirettyをオフにしてNOPASSWDにしとくのを忘れずに。

ここまで設定したら、BFLPの設定画面からblacklistをいじりながら、/etc/nginx/bflp.confの動きやsystemctl status incrondやsystemctl status nginxでリロードが来ているかどうかを確認しよう。

それから、意外にやりがちなのが、incrondを初めて入れた時に起動し忘れたり自動起動にするのを忘れたり、といったところ。

これでしばらく様子を見ようと思っている。

JavaのDIを愛するような奴はうんこうんこうんこ…

そんな奴にうちの大事な娘をやるわけにはいかん!! ← お茶パシャ〜

JavaのDIを愛する奴にロクな奴はいないの続き。この↓問題ね。

package org.abc.def;
@Component
public class Xyz extends BaseX {

package org.abc.efg;
@Component
public class Xyz extends BaseX {

別パッケージに同一名のクラスを作りたい場合の対応方法。

確かに@Componentに引数をつけて@Component(“blablabla”)とすれば、起動時のエラーはなくなる。ただし、Context.getBean(org.abc.def.Xyz.class)するときにエラーになる。例外の名前は忘れたけど…クソが。

ではどうするか。

正解は、クラスを与えて”blablabla”部分を求めるメソッドがあるから、そちらを呼んで”blablabla”側の文字列を使ってインスタンスを作る、でした。なんて便利なんだろう? 革命的な便利さだよ?

…これをアホと言う以外の評し方をするのが難しいよ。単にnewでいいじゃんか。書くことが増えてハマりやすく、不便になって、その挙句に遅いときた。いちいちログ出し過ぎなんだよ。クソが。

川崎2-2清水 (最近勝ってないよね…)

当然の権利を行使して会社を早退し、等々力へ。明るいうちに飲み干すビールがうまい。幸せなひととき。そして試合は始まり、そして終わったのだが…この試合の評価は難しい。パスは回せていたし、技術の差は歴然としていたと思う。しかし先制されて逆転して…そしてラストプレーで追いつかれて終了。アバンテ中は得点も失点も許可されていないはずなんだが?

前半はネットが最終ラインの位置まで降りてボールを配給し、パスがスパスパ回っていく。しかしネットがあの位置にいるのはちょっと不安があるんだよね。守備があんまり上手くないので、確実にファウルになるようなアタックになるんだよね彼は。今日もそれでカードもらったり危ない位置でFKを与えていた。清水に訪れた最初のチャンス、カウンターの対応にしくじってファーサイドに流れたボールを冷静にゴールに送り込まれて失点。これがJリーグ20000ゴール目となる記念すべき以下省略。主審はこの記念ボールを保管に回していた。さすが西村主審、そういうところはしっかりしています。

後半、ネットに替えて森谷を頭から投入。これで否応無しにゲームは動き始めた。森谷は彼にしては低いボランチの位置で素早いパスを繰り返してリズムを変えて全体を掌握、森谷のゲームといった様相に。そして三好→阿部の移籍初ゴールが飛び出し、小林悠が打てないところからスライドしての狙いすました憲剛へのパス…を憲剛が芸術的に決めて逆転…おー今日は全部こっち側か。よしよし、と思っていたんです。ラストプレーについては…まあ書かないでいいや。

試合後はテセが川崎側に挨拶に来た。いまだ人気は衰えていませんね。