ansible-lintのルールに関するメモ

ansible-lintを使ってみているのだが、ルールの一部がよくわからなかったりしたので調べて簡単にまとめてみた。

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のパッケージ管理システム版。statelatestを指定していると警告が出る。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.typesincludeして、別途指定したい場合は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周りについてどう書かれているかをそれぞれの本でチェックした。

詳しく書かれている順に、

  1. マスタリングNginx. 設定値による挙動の変更がかなり具体的に書かれていた。
  2. nginx実践入門。マスタリングNginxほどではないものの、十分に詳しく書かれていた。
  3. Nginxポケットリファレンス。1, 2と比べるとだいぶ不足しているが、一応目安となる設定値は書かれていた。
  4. nginx実践ガイド。ほぼ公式リファレンスと同等のことしか書かれていなかった。また、索引にproxy_bufferingがなぜか載っていなかった。

なお実際に買った本以外は記憶ベースで書いてるんで、おかしいところとかあるかも。

購入した本

迷ったが最終的にnginx実践入門を購入した。

内容的にはマスタリングNginxがよさそうだったが、nginx実践入門もだいぶよさそう。かつ実践入門は、

  1. ちょっと安い。300円くらい?
  2. ちょっと新しい。3年くらい。

あたりがあったので。もし物足りなかったらマスタリングNginxを追加で買うかもしれないが、まあWebサーバとかそこまで自分でどうこうしないので、どうかな。

やっぱりリアル書店は比較検討しやすいのがいい。ただ、できれば電子書籍で買いたかった。店頭で普通に電子書籍も置いてくれると助かるのだが。

Twitterで読んだ本のメモってるのまとめてみる

大したこと書いてないし流れるままでいいかなと思ってたんだけど、この間読んだ当時の感想が役に立つことがあったので。

マンガとか読んだこともたまーに書いてるけど、そっちは後で見直してもしゃーないのでまとめない。

あと、返信はわざわざ張らない。

2017年だけやたら多いのは読んだ量もあるけど、書く割合が増えたのもある。2018年のは一年終わってからまとめる。

2014年

2016年

2017年

EloquentでのNULLABLEな日付の扱いでoptional()ヘルパ関数が便利

アクセサの値を普通に表示するだけなら、?:演算子だけでいい。PHPnullechoしても特に問題ないので。

<?php
echo $obj->created_at ?: 'default';

ただ、フォーマットしたい場合はちょっとやっかい。以下はcreated_atNULLの場合、nullのメソッドを呼び出してエラーになる。

<?php
echo $obj->created_at->format('Y/m/d') ?: 'default';

そこでoptional()を使うと便利。

<?php
echo optional($obj->created_at)->format('Y/m/d') ?: 'default';

optional()nullIlluminate\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ではあるんだけど、軽く探した感じどうも出所がわからなくて、このままでは使いたくない。ということでもうちょっと探した結果、以下のようにすることで見つかった。

  1. Google Chromeの公式サイトに移動。
  2. 「別のプラットフォーム向けの Chrome をダウンロード」で.rpmをダウンロード、インストール
  3. 2のダイアログの注に「注: Google Chrome をインストールすると Google レポジトリが追加され」とある通り、/etc/yum.repos.d/google-chrome.repoができてる。
  4. その中にhttp://dl.google.com/linux/chrome/rpm/stable/x86_64がある
  5. 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);
});

注意点がいくつかあって、

  1. :selected擬似セレクタではなく、[selected=selected]を使う。
  2. selected属性がどのoption要素にもない場合に、ブラウザっぽく最初のoption要素をselectedにするようにする。
  3. selectedにするのにはval(), attr()あたりではなくprop()を使う。