ansible-lintのルールに関するメモ
ansible-lintを使ってみているのだが、ルールの一部がよくわからなかったりしたので調べて簡単にまとめてみた。
- ANSIBLE0002: Trailing whitespace
- ANSIBLE0004: Git checkouts must contain explicit version
- ANSIBLE0005: Mercurial checkouts must contain explicit revision
- ANSIBLE0006: Using command rather than module
- ANSIBLE0007: Using command rather than an argument to e.g. file
- ANSIBLE0008: Deprecated sudo
- ANSIBLE0009: Octal file permissions must contain leading zero
- ANSIBLE0010: Package installs should not use latest
- ANSIBLE0011: All tasks should be named
- ANSIBLE0012: Commands should not change things if nothing needs doing
- ANSIBLE0013: Use shell only when shell functionality is required
- ANSIBLE0014: Environment variables don't work as part of command
- ANSIBLE0015: Using bare variables is deprecated
- ANSIBLE0016: Tasks that run when changed should likely be handlers
- ANSIBLE0017: become_user requires become to work as expected
- ANSIBLE0018: Deprecated always_run
ANSIBLE0002: Trailing whitespace
これはほんとそのまんま。いずれかの行の末尾に空白があれば警告が出る。
ANSIBLE0004: Git checkouts must contain explicit version
git
モジュールでversion
を指定しなかったり、HEAD
に指定したりすると警告が出る。
ANSIBLE0005: Mercurial checkouts must contain explicit revision
ANSIBLE0004のhg
版。revision
を指定しなかったり、default
に指定したりすると警告が出る。
ANSIBLE0006: Using command rather than module
git
, curl
, service
その他、Ansibleモジュールが使えるところでcommand
, shell
を直接叩いてると警告が出る。
ANSIBLE0007: Using command rather than an argument to e.g. file
chmod
, mkdir
, rm
その他、file
モジュールの引数でできることでcommand
, shell
を直接叩いていると警告が出る。
ANSIBLE0008: Deprecated sudo
become
, become_user
でなくsudo
, sudo_user
を使っていると警告が出る。
ANSIBLE0009: Octal file permissions must contain leading zero
file
モジュールなどでmode
の指定時に0666
のような表記ではなく666
のような表記をしていると警告が出る。
ANSIBLE0010: Package installs should not use latest
ANSIBLE0004のパッケージ管理システム版。state
にlatest
を指定していると警告が出る。ANSIBLE0004などでは未指定の場合も警告が出るが、yum
などのstate
はデフォルトがlatest
ではなくpresent
なので、未指定の場合は警告が出ない。
ANSIBLE0011: All tasks should be named
すべてのタスクにname
をつけろというルール。そこは問題ないのだがこのルールバグってて、yum
のように引数にname
があるものだと、偽陰性になってしまう……。
ANSIBLE0012: Commands should not change things if nothing needs doing
command
, shell
などがwhen
, creates
などで条件つき実行になっていない場合警告される。
ANSIBLE0013: Use shell only when shell functionality is required
パイプやリダイレクトなどを使うわけでもないのにshell
を使ってると警告される。
ANSIBLE0014: Environment variables don't work as part of command
command
, shell
のコマンド内でPATH+=XXX command
みたいなのはできないよ、という警告だと思うのだが自信がない……。
ANSIBLE0015: Using bare variables is deprecated
{{ var }}
形式じゃない生の変数を使った場合に警告される。この「生の変数」を俺はそもそも知らなかったんだが、以下みたいな感じらしい。
--- - tasks: - name: example for "Using bare variables is deprecated" rule yum: name: item with_items: items
ANSIBLE0016: Tasks that run when changed should likely be handlers
when: result.changed
みたいなことやるなら普通にhandlers
使えば変更あった場合のタスク実行できるからそうしよう、みたいなルール。
ANSIBLE0017: become_user requires become to work as expected
become
なしでbecome_user
してると警告される。
ANSIBLE0018: Deprecated always_run
always_run
を使っていると警告される。check_mode
が代替とのこと。
Nginxでtypesは上書きできるのか
nginx実践入門をちまちま進めている。今日は第3章を進めていたのだが、いくつか気になることがあったので検証してみた。
typesディレクティブの設定値は上書きできるか?
実践入門には、基本mime.types
をinclude
して、別途指定したい場合はmime.types
を直接修正する、みたいな感じで書いてあった。
個人的にはそういうのはmime.types
はそのままにしておいて、必要なものだけ上書きする形でできたらいいなあと思ったので、できないのか試してみた。
# ... http { include mime.types; types { text/html txt; } } # ...
結果、Nginxを起動した時点で以下の警告が出た。その上で上書きはされるようだ。うーん、その仕様はどうなのか……。
2018/04/19 11:27:35 [warn] 1833#1833: duplicate extension "txt", content type: "text/html", previous content type: "text/plain" in ./etc/nginx.conf:17
ググったところ、以下のようにする感じでハックできると出てきた。
# ... http { include mime.types; server { # ... location ~ \.txt$ { types { text/html txt; } } } } # ...
https://serverfault.com/questions/678673/nginx-how-to-override-add-single-mime-type
その後調べると、公式リファレンスにもあった。上記のとは違い、types
は空にして、default_type
を使ってる。
http://nginx.org/en/docs/http/ngx_http_core_module.html#types
これはこれで微妙……。
access_logは複数設定するとどうなるのか?
access_log
を同じように複数設定した場合の挙動が気になったのでこれも一応確認してみた。予想通り、複数のファイルにアクセスログを出力してくれる。便利。
複数回同じディレクティブを書いた場合の挙動もちゃんと公式リファレンスに書かれてるとよかったんだが。
Nginxの技術書どれがよさそうか、中身を比較した上で買ってきた
動機
Nginx関係で知りたいことがあったんだけど、公式リファレンスだけだと十分詳しく載ってなかった。軽くググった感じでもなかった。英語の記事とかまで探す範囲を広げたらありそうだったけど、それも大変なので一冊本を買おうかなと。
Amazonのレビュー見たり、目次見たりしたけどどれがよさそうがなんとも言えない感じだったので、物理本屋に行って比較検討・購入してきた。
検討した本
比較検討したのは以下の4冊。古い順。
- マスタリングNginx (2013)
- Nginxポケットリファレンス (2015)
- nginx実践入門 (2016)
- nginx実践ガイド (2017)
Amazonでググった感じ、日本語の本ではほかに「ハイパフォーマンスHTTPサーバ Nginx入門」というのがあるらしかったが今日行った本屋にはなかった。見た感じ絶版っぽい。マスタリングNginxよりさらに古く2011年の本のようなので致し方なしか。
比較方法
あまり長々チェックするのもいろいろアレなんで、前書きその他をざっと見て感じをつかんだ上で、知りたかったことの一部、proxy_buffering周りについてどう書かれているかをそれぞれの本でチェックした。
詳しく書かれている順に、
- マスタリングNginx. 設定値による挙動の変更がかなり具体的に書かれていた。
- nginx実践入門。マスタリングNginxほどではないものの、十分に詳しく書かれていた。
- Nginxポケットリファレンス。1, 2と比べるとだいぶ不足しているが、一応目安となる設定値は書かれていた。
- nginx実践ガイド。ほぼ公式リファレンスと同等のことしか書かれていなかった。また、索引にproxy_bufferingがなぜか載っていなかった。
なお実際に買った本以外は記憶ベースで書いてるんで、おかしいところとかあるかも。
購入した本
迷ったが最終的にnginx実践入門を購入した。
内容的にはマスタリングNginxがよさそうだったが、nginx実践入門もだいぶよさそう。かつ実践入門は、
- ちょっと安い。300円くらい?
- ちょっと新しい。3年くらい。
あたりがあったので。もし物足りなかったらマスタリングNginxを追加で買うかもしれないが、まあWebサーバとかそこまで自分でどうこうしないので、どうかな。
やっぱりリアル書店は比較検討しやすいのがいい。ただ、できれば電子書籍で買いたかった。店頭で普通に電子書籍も置いてくれると助かるのだが。
Twitterで読んだ本のメモってるのまとめてみる
大したこと書いてないし流れるままでいいかなと思ってたんだけど、この間読んだ当時の感想が役に立つことがあったので。
マンガとか読んだこともたまーに書いてるけど、そっちは後で見直してもしゃーないのでまとめない。
あと、返信はわざわざ張らない。
2017年だけやたら多いのは読んだ量もあるけど、書く割合が増えたのもある。2018年のは一年終わってからまとめる。
2014年
実践Vim読了。最初ちょっとぬるすぎたかと不安になったものの、読み終わってみるとまだまだ知らないこといっぱいあってよかった。
— イカまがい (@xxmagai) 2014年6月3日
2016年
情熱プログラマー読了。
— イカまがい (@xxmagai) 2016年4月9日
情熱?なところあるし個人的な好みとも合わなかったが、最後まで読み通せる程度には楽しいし学ぶところもあった。
「はじめて学ぶ ソフトウェアのテスト技法」読了。開発者向けではない全般的なテストの知識が載っていた。深くは読み込めてないけど、いろいろ得るものがあった。テストの本の一冊目としては、なかなかよかったかも。次は開発者向けかつ TDD 系じゃないのを一冊読みたい。
— イカまがい (@xxmagai) 2016年4月20日
「SQLアンチパターン」読了。あるあるなアンチパターンに、実践的な対処法がついてるいい本だった。自分の知識レベルとマッチしたのかもしれないが、なかなか読み進めやすかった。後半や付録Aの正規化の話はまとまりがいまいちだったが、それ含めても総合的にはかなりよかった。
— イカまがい (@xxmagai) 2016年11月13日
2017年
「キラーストレス 心と体をどう守るか」読了。ストレスに対する現代的・科学的なアプローチがどんな感じかの概観。悪い本ではないが、だいぶあっさりめ。NHKの番組でやったネタがベースだし、こんなものか。
— イカまがい (@xxmagai) 2017年1月9日
「レガシーソフトウェア改善ガイド」読了。レガシーなソフトウェアをどうにかする方法について、ちょっと薄くはあるがかなり網羅的に書かれていた。「リファクタリング」や「レガシーコード改善ガイド」よりだいぶ抽象より中の話で読み進めやすいので、レガシーなソフトウェアを扱うならまずこれかな。
— イカまがい (@xxmagai) 2017年1月13日
「SMARTCUTS」読了。コツコツやるだけじゃなくて工夫しないと駄目だよ、成功者はその辺うまいことやってるよ、みたいな話? 検証ベースでなく経験ベース目。DHH の話とか出てくるのでプログラマには楽しいかも。割と聞いたことあるような方法論ばかりだけど、まとまってるし読みやすい。
— イカまがい (@xxmagai) 2017年1月18日
「何をやっても続かないのは、脳がダメな自分を記憶しているからだ」読了。脳科学の知見に基いた、習慣化ややる気についての話。いろんな研究ベースなので、経験ベースのものよりは信頼性がありそうだが、一部まだ怪しそうなネタが入ってくるのだけマイナス。
— イカまがい (@xxmagai) 2017年1月30日
「屈折くん」読了。ファンは読んで損なし。感想はいろいろあるけどまとまらないのでなし。
— イカまがい (@xxmagai) 2017年2月11日
「アナタはなぜチェックリストを使わないのか?」読了。チェックリストは結局手動で実行するプログラムなのでその有用性については今更。ただそれがどういう場面で、どういう風に有効なのかについては参考になった。コミュニケーションにも有用、というのは想定外。出てくる事例も興味深いいい本。
— イカまがい (@xxmagai) 2017年2月13日
「NHK「100分de名著」ブックス ブッダ 真理のことば」読了。上座部仏教でもない、より初期の本書に倣うと「釈迦の仏教」の話。薄くてかなり読みやすい本で、内容的には新鮮なところはなかったがまあまとまっていた。参考文献がいろいろ挙げられているので、その辺からまたなにか読みたい。
— イカまがい (@xxmagai) 2017年2月26日
「入門 犯罪心理学」読了。タイトルから想像されるのと違い、エビデンスに基く最新の犯罪・更生に関する知識が詰まったすごい本だった。新書としての出来も素晴らしく、内容の割に相当読みやすい。犯罪について考えるなら、その前にとにかくこの本読んどけってレベルの本。超おすすめ。必読。
— イカまがい (@xxmagai) 2017年2月28日
「パーフェクトソフトウェア テストにまつわる幻想」読了。哲学的な本で、なぜテストするのか、そもそもテストとはなんなのか、みたいなことが書かれていた。今までprivateなメソッドはテストすべきではない、みたいなこと聞く度に考えたり迷ったりしていたが、もうそれはなくなりそう。
— イカまがい (@xxmagai) 2017年3月16日
「真田信繁 幸村と呼ばれた男の真実」読了。信頼できる資料の少ない信繁の生涯を丁寧に追った本。前半は父親(真田昌幸)の話で後半が大阪の陣の話、な感じになってた。少ない資料から信繁の実像をミステリのように浮かび上がらせていくのは見事。今更だけど真田丸が見たくなった。
— イカまがい (@xxmagai) 2017年3月18日
「達人プログラマー」読了。旧版。プログラミングに関するかなり広範な知識が、あまりまとまっていない雑多な形で載っていた。原著は1999年発行の古い本だが、具体的なツールの話など以外は古びていない。当時最新だっただろう知識が現在では基本的な知識に、みたいな部分はさすがに多いが。
— イカまがい (@xxmagai) 2017年4月8日
「まつもとひろゆき 言語のしくみ」読了。楽しかった。プログラミング言語の開発を追体験しながら、プログラミング言語に必要なあれこれの技術をわかりやすくさらっと学べた。「動くまでが大変」「とにかく動くところまで持っていかないと」的な文章が何度も出てきたが、ほんとそれと思った。
— イカまがい (@xxmagai) 2017年4月22日
「Selenium デザインパターン&ベストプラクティス」読了。Selenium を使ってWebアプリケーションをテストする方法について一から順を追って、具体的なコードで端的に説明してくれる本。かつ帯や監訳者まえがきにあるように、システムテストについての良著でもあった。
— イカまがい (@xxmagai) 2017年4月27日
「入門Ansible」読了。個人出版なやつ。チュートリアル的な内容だけど、割と網羅性もある感じか。2014年に出た本なので対象バージョンがちょっと古い。Ansible に慣れる前に読んでもあまりピンとこなかったが、ある程度慣れてからおさらい的に読むとなかなかよかった。
— イカまがい (@xxmagai) 2017年5月1日
「いつも「時間がない」あなたに 欠乏の行動経済学」読了。*題の前半は内容とは無関係*。10年に1冊の最重要な本、必読。内容を簡単にまとめると、欠乏を感じているときに人は欠乏しているものに対してばかり気を取られ、ほかのことが手につかなくなる、ということについての話、かな。
— イカまがい (@xxmagai) 2017年5月26日
「無気力なのにはワケがある 心理学が導く克服のヒント」読了。副題にある「克服のヒント」はあまり期待しない方がいいかな。学習性無力感の話。研究・実験の引用が主な感じで本としては読みやすいが面白さはそんなにない。ただ、紹介されている内容自体がかなり興味深い。またいろいろ調べてみたい。
— イカまがい (@xxmagai) 2017年7月4日
「サイロ・エフェクト 高度専門化社会の罠」読了。専門性の深化によってほかの専門とのコミュニケーション不全になるみたいな問題に関する話。面白いし、内容もよかったが、元々社会から切り離されて生きているような自分にはぴんとこない部分もあった。あと表紙はもうちょっとなんとかならんかったの
— イカまがい (@xxmagai) 2017年8月1日
「トンネラーの法則」読了。アレな題名だが中身も割とアレなんでアレ。逆境から抜け出せる人と抜け出せない人はどう違うかみたいな話で、一応研究ベースな感じなんだけどどうも恣意的な引用になってる部分があるように見える。書き方も自己啓発系の本みたいなノリだし。そこまで酷い本でもないけど、
— イカまがい (@xxmagai) 2017年8月10日
「反応しない練習」読了。ブッダの教えをベースに、いろいろつらいのは外からの刺激に無駄に反応するからで、そうしないようにすれば楽になれる、みたいな内容の本。自己啓発系。すぐキレるのをなんとかしたくて読んでみて、自分としてはいろいろ考えさせられるところもあったが、人に薦めるほどでは。
— イカまがい (@xxmagai) 2017年8月16日
「任天堂ノスタルジー 横井軍平とその時代」読了。横井軍平の伝記に近い話で、「枯れた技術の水平思考」に関してはおまけ程度。横井軍平は好きなのでまあ楽しめた。GUNPEY久々にやりたくなったけどあれ今プレイするならなにでやればいいの?
— イカまがい (@xxmagai) 2017年8月18日
「百合のリアル 増補版」読了。百合とあるがLGBTとかそれ系に関する軽めの読み物。ただ実質はさらにもうちょっと違って、自己認識・自己同一性の話のように感じた。その辺いろいろ共感するところがあった。
— イカまがい (@xxmagai) 2017年8月31日
「仕事・お金・依存症・ダイエット・人間関係 自分を見違えるほど変える技術 チェンジ・エニシング」読了。アレなタイトルからわかるように中身もちょっとアレだけど、思ったよりアレではなかった。一部短絡的な決め付けに感じる個所はあったが全体的にはエビデンスと経験に基いてる感じ。
— イカまがい (@xxmagai) 2017年9月5日
「闇ネットの住人たち」読了。闇ネットと書いてダークネットと読む。とにかく楽しかった。終わった後、もっと読みたかった気分になる本だった。いちばん興味があるのが1章の「荒らし」の話だったので1章終えた後その後が心配だったが、けっきょく最後までずっと楽しんで読めた。
— イカまがい (@xxmagai) 2017年9月7日
「バットを倒しにアフリカへ」読了。Twitterでも一時期冒頭ページが話題になってた本。なかなか面白かった。ずっとのんびりアフリカ研究ライフかと思いきや、最後盛り上がってくる。研究内容についての話が少ないので、最新の研究成果をまとめた次の本を期待。
— イカまがい (@xxmagai) 2017年9月10日
「熊とワルツを リスクを愉しむプロジェクト管理」読了。途中までは坦々と読んだが、終盤はなかなか楽しく読めた。プロジェクトのリスク管理のための1冊目としていい感じじゃないかな。個人的にはこれだけで満足で、2冊目の必要は感じない。ぜんぶは無理でも、少しずつリスク管理していかなきゃな。
— イカまがい (@xxmagai) 2017年9月24日
「誰も語りたがらない 鉄道の裏面史」読了。軽い読み物。事故・事件系は知っている話が多かったが、事故に至る流れなんかはかなりわかりやすく書かれていてよかった。国鉄関係の話はほとんど知らない話でこれも楽しかった。軽い読み物だが、けっこうしっかり書かれていた。
— イカまがい (@xxmagai) 2017年10月11日
「朱子学と陽明学 (小島毅)」読了。風雲児たちを一気読みした後、関係のあるネタの本を読みたいと積読から引っ張り出してきた。基礎的・網羅的な内容かと思ったら、前書きにもあるように「思想文化史」的な内容で、朱子学・陽明学自身というより外から見ての動きの話だった。
— イカまがい (@xxmagai) 2017年10月15日
EloquentでのNULLABLEな日付の扱いでoptional()ヘルパ関数が便利
アクセサの値を普通に表示するだけなら、?:
演算子だけでいい。PHPはnull
をecho
しても特に問題ないので。
<?php echo $obj->created_at ?: 'default';
ただ、フォーマットしたい場合はちょっとやっかい。以下はcreated_at
がNULL
の場合、null
のメソッドを呼び出してエラーになる。
<?php echo $obj->created_at->format('Y/m/d') ?: 'default';
そこでoptional()
を使うと便利。
<?php echo optional($obj->created_at)->format('Y/m/d') ?: 'default';
optional()
はnull
をIlluminate\Support\Optional
クラスのオブジェクトでラップして返してくれる。このオブジェクトは、値がオブジェクトでない場合はメソッドを呼び出さないようになっている。
(なお、ドキュメントでは実装と違って、null
の場合のみエラーを防げるように書いてある)
Linux用Google ChromeのyumリポジトリのURLはどうやって探せばいいのか
2019-08-30追記
2のあたり、「別のプラットフォーム向けの Chrome をダウンロード」なくなってるっぽい。フッタのメニューに、「他のプラットフォーム」というのがあって、そこで行けそう。
追記ここまで
Linuxデスクトップは使ってないんだけど、自動テストとか用にChromeが欲しくて、ちょっと調べたところ以下のURLが出てきた。
http://dl.google.com/linux/chrome/rpm/stable/$basearch
まあ、google.comではあるんだけど、軽く探した感じどうも出所がわからなくて、このままでは使いたくない。ということでもうちょっと探した結果、以下のようにすることで見つかった。
- Google Chromeの公式サイトに移動。
- 「別のプラットフォーム向けの Chrome をダウンロード」で.rpmをダウンロード、インストール。
- 2のダイアログの注に「注: Google Chrome をインストールすると Google レポジトリが追加され」とある通り、
/etc/yum.repos.d/google-chrome.repo
ができてる。 - その中に
http://dl.google.com/linux/chrome/rpm/stable/x86_64
がある x86_64
部分は$basearch
同等なので、これが最初のURLにつながる。
ブラウザの「戻る」で戻ったときに選択しているoption要素を戻す方法
select要素のonchangeで即ページ遷移するような実装をすることがたまにある。ボタン押して普通にsubmitさせろよとも思うけど、手順一つ省略したい気持ちもまあわかる。
$('select').on('change', function () { $(this).closest('form').submit() });
まあ、こんな感じに。
これ自体は問題ない。問題はこの後にブラウザの「戻る」で戻った場合で、ほとんどのブラウザの実装では、キャッシュがある限り、フォームコントロールはそのまま戻ることになる。
普通ならそれで問題はないのだが、select要素でonchangeでやってる場合ちょっとやっかいなことになる。なぜかというと、select要素をクリックして、メニューを開いた後、選択を変えずにメニューを閉じた場合、onchangeは発火しないから。
だからこのような使い方をする場合、HTML上のselected属性の通りに選択されていて欲しい。それをどう実現するか?
結論から言うと、window.onload
と、Firefoxなど向けにwindow.onshowpage
に、HTML上のselectedをじっさいの選択に合わせる関数を登録すればいい。jQueryでやるならこんな感じ。
function init() { if ($('select option[selected=selected]').attr('selected')) { $('select').val($('select option[selected=selected]').val()); } else { $('select option:first').prop('selected', 'selected'); } } jQuery(function () { init(); $(window).on('pageshow', init); });
注意点がいくつかあって、
:selected
擬似セレクタではなく、[selected=selected]
を使う。- selected属性がどのoption要素にもない場合に、ブラウザっぽく最初のoption要素をselectedにするようにする。
- selectedにするのには
val()
,attr()
あたりではなくprop()
を使う。