do_su_0805's blog

dairyquestions は typo です。

ファイル名が意図しないものがあったら異常終了させるワンライナー、およびそれを GitHubActions で動かすまで

TL;DR

  • find は対象が見つかろうが見つからなかろうが exit 0 する
  • find を異常終了させるには -exec false {} + が楽そう
  • せっかくなので GithubActions で動かしてみたよ

ことのあらまし

  • 特定の拡張子のファイルを見て処理を行う仕組みがあった。
  • ある時、ファイルをアップロードして処理されないと言う事件が起きた。
    • 原因が拡張子の誤りだったんだけど、一文字間違いくらいでなかなか気づけなかった。
  • これは人間が確認すべきじゃないので CI に載せたくて、とりあえず「特定の拡張子でないファイルが現れたら異常終了する」術がないかなぁと調べ始めた

「特定の拡張子でないファイルが現れたら異常終了する」術

例として、 .json 以外出て来れられたらおかしい世界を考える

  • ぱっと思いついたのは find . | grep -v "\.json$" みたいな話
    • だけど grep は「条件に引っ掛かったら exit 0」という世界なので、日頃問題ない世界では exit 1 される
    • いろいろパイプなり、いっそスクリプトにするなどしたら使えるけど今回はもうちょっと気楽にやりたかった
  • 次に思いついたのは 「 find 自体でどうにかできないか? 」だった
    • 試してみたところ、どうやら「コマンドオプション自体がエラーじゃないととにかく正常終了する」世界
      • そりゃそうだ、一覧を出すだけだからね
  • 試しに 「find returncode」 とかで調べたところ、こんな記事が引っ掛かった
  • ちょうど同じニーズっぽい。中段くらいにある false を使う例がスッキリしていたので試したみたところ、ちゃんと「 json しかない時は正常終了し、json 以外がある時は異常終了する」世界ができた。
    • find -not -name "*.json" -exec "false {} +"
  • とはいえ、CI で実行時に失敗だけ言われても辛いので、見つけたファイルも出すようにした。
    • find -not -name "*.json" -exec "false {} +" -print

術が生まれたので GithubActions で自動検知させてみた

do-su-0805/Unintentional_filename_detection_example に例をおいてみました。

やっていることはこんな感じ。先ほど生み出した術を走らせる最小構成です。jsondir というディレクトリに *.json 以外が紛れ込んだら落ちる CI が完成です。

on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - master
jobs:
  detector:
    name: Detect unintentional file ( not "*.json" )
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: exec detection
      working-directory: jsondir
      run: find . -type f -not -name "*.json" -exec false {} + -print

実際に動いている例としては unintentional file exemple by do-su-0805 · Pull Request #1 · do-su-0805/Unintentional_filename_detection_example に用意しました。json フォルダに yaml をおいてしまったという世界です。

f:id:do_su_0805:20200703204150p:plain
検知例。ちゃんと test.yaml を検知してエラー落ちしていますね。

こういう細かいところを機械がみてくれるのは心地よいですね。

hangout meets の MacOS におけるロック状態での挙動

まとめ

  • 画面配信 + ビデオ配信中に、 Mac をロック状態にすると、
    • 画面配信は切れる。復帰後も配信は中止されている。
    • ビデオ配信は継続される。復帰後もそのまま

試した環境

やったこと

  • hangout meets に JOIN
  • 画面配信とビデオ配信をしたまま、「画面をロック」を実施
    • 左上のりんごマークから行けるやつ。タッチバーの鍵っぽいあいこんのあれ
  • その後、別端末から当該 meets に JOIN して状況を確認した。

確認できたこと

  • 文頭「まとめ」通り

ghq look 廃止に伴う PS1 変更スクリプトを供養する

あとで Quyo | つづろう、モノの思い出 にも供養します

先日 ghqで仕事用と趣味用でディレクトリ分けしてリポジトリ管理しやすくなりました | おそらくはそれさえも平凡な日々 で発表されていましたが、ghq version 0.99.0 より、 ghq look コマンドが廃止となりました。

廃止の経緯などは上述の id:Songmu さんの記事に書かれていますが、僕もどちらかというと「普段使いに ghq look を使う」人間でした。 様々な「こうしたほうがいい」「王道」「回避策」などがありますが、ここではその辺りには触れずに、 ghq look 利用時に「 ghq look で開いたサブシェルかどうか」を判定していた方法を供養しておきます。

やってたこと

いたってシンプルなのですが、 ghq look で開かれたサブシェルの時は、環境変数 GHQ_LOOKghq.root 以下の移動先パスになります。 それを検知して、ghq look 配下時には PS1 先頭に [g] と出すようにしていました。

if [ "X${GHQ_LOOK}" != "X" ];then
  ghq_flag="[g]"
fi
PS1='\[\e[31;40m\]${ghq_flag}\[\e[m\]\[\e[36;40;4m\][bash] \u@\h:\W\[\e[m\]\[\e[31;40m\]$(__git_ps1 " (%s)") \[\e[m    \]\$ '

実際に使うとこんな感じ

[bash] do-su-0805@hostname:~ $ ghq get --look do-su-0805/repoA
    exists /Users/do-su-0805/.ghq/src/github.com/do-su-0805/repoA
[g][bash] do-su-0805@hostname:repoA (master) $

ある意味「サブシェルによって環境変数が引き継がれないこと」を便利に使っていたので、 ghq get --look を継続して使うかは悩みどころですが、まぁいい感じにしていきたいですね。

ちなみに

id:astj さんも同様のことをされていたらしいというのは調べていて見つけました。 対する id:Songmu さんの応答で ghq get --look で同等の動作をすることを知りました。

FAI が動く環境を構築して、Debian 9.8 install が自動でできるまで

TL;DR

  • Ubuntu 18.04.02 LTS 上に FAI をインストールした。
    • 一部、デフォルトの設定だと動かなかったので、環境に合わせた修正を実施した。
  • デフォルトで内包されている DebianGnome install が、PXE boot で自動的に完了することを確認した。
続きを読む

雑に nginx 1.15.9 の変更差分を眺めた

という tweet を見かけ、 nginx 1.15.9 の CHANGES を見てきた

Changes with nginx 1.15.9 26 Feb 2019

*) Feature: variables support in the "ssl_certificate" and "ssl_certificate_key" directives.

*) Feature: the "poll" method is now available on Windows when using Windows Vista or newer.

*) Bugfix: if the "select" method was used on Windows and an error occurred while establishing a backend connection, nginx waited for the connection establishment timeout to expire.

*) Bugfix: the "proxy_upload_rate" and "proxy_download_rate" directives in the stream module worked incorrectly when proxying UDP datagrams

  • ssl_certificatessl_certificate_key が変数対応した
  • poll 関数が windows vista 以降なら使えるようになった
  • select メソッドのバグフィックス
  • proxy_upload_rate / proxy_download_rate が、UDP で不完全に動いていたのを直した。

なるほどなぁと思いつつ、proxy_*_ratessl_cerificate なんたらについて気になったので、ソースコードを見てみようと思って、いい感じの diff にたどり着くまでのお話です。

ソースコードのありか

nginx のソースコードは、公式ページからたどると https://trac.nginx.org/nginx/browser にあるらしい。

また、これを一時間に一回同期している、 https://github.com/nginx/nginx というリポジトリもある

いい感じに github で diff を見たい

  • 下記に掲載されているように、 compare/(from)...(to) という方法で差分が見れるということらしい。 kanonji.hatenadiary.com

今回は、 release-1.15.8release-1.15.9 の差分を見ることにする - https://github.com/nginx/nginx/compare/release-1.15.8...release-1.15.9

雑に見てみた感想

ちゃんとコードを追ったりはしてないけど、ここら辺中心に見たらssl関連はいろいろ面白そうという勘だけおいておく。どっかで気が向いたら見る

  • 新設関数 or ifdef による挙動新設があるものうち、関係がありそうなもの
    • int ngx_http_ssl_certificate(ngx_ssl_conn_t *ssl_conn, void *arg)
    • int ngx_stream_ssl_certificate(ngx_ssl_conn_t *ssl_conn, void *arg)
    • ngx_int_t ngx_ssl_connection_certificate(ngx_connection_t *c, ngx_pool_t *pool,ngx_str_t *cert, ngx_str_t *key, ngx_array_t *passwords)
    • ngx_int_t ngx_http_test_required_predicates(ngx_http_request_t *r,ngx_array_t *predicates)
    • static ngx_int_t ngx_http_ssl_compile_certificates(ngx_conf_t *cf,ngx_http_ssl_srv_conf_t *conf);
    • static ngx_int_t ngx_stream_ssl_compile_certificates(ngx_conf_t *cf,ngx_stream_ssl_conf_t *conf)
    • static X509 *ngx_ssl_load_certificate(ngx_pool_t *pool, char **err, ngx_str_t *cert, STACK_OF(X509) **chain)
    • static EVP_PKEY *ngx_ssl_load_certificate_key(ngx_pool_t *pool, char **err,ngx_str_t *key, ngx_array_t *passwords)
    • ngx_array_t *ngx_ssl_preserve_passwords(ngx_conf_t *cf, ngx_array_t *passwords)
  • ngx_ssl_certificate 関数の挙動
    • X509 の STACK_OF である *chain が表れて、 sk_X509_pop_free とかに突っ込まれている
  • nginx_ssl_session_* な関数の引数増加
    • ngx_ssl_session_cachengx_ssl_session_id_contexngx_array_t *certificates という今回の変更ど直球ぽい引数追加
  • ngx_http_request_t *ngx_http_create_request(ngx_connection_t *c) の挙動が新設され、以前の挙動が static ngx_http_request_t *ngx_http_alloc_request(ngx_connection_t *c) に一部移植されている
  • ngx_event_openssl.c まぁ名前的にしょうがないとはいえ、 #ifdef が広範囲に広がっており、読むのに注意がいる
  • 個人的に気になったのは、 ngx_freebsd_config.h に微妙な変更が入ってる。多分、ngx_file_aio_read.c の変更向け
    • FreeBSD_version < 700005 って、FreeBSD 7 か?

2月からやりたいこと

今年もよろしくお願いします。

新年入って、京都に引っ越して時間ができるようになりました。 また、転職後初の評価が終わり、新しい半期に入りました。

やっと引っ越しの片づけが落ち着いてきたので、改めて今考えているやりたいことをいったん書き出してみようという企画です。 手を動かさないとねという気持ちは最近強くなってきました。

ネットワーク設計

  • 出口は VRRP しておきたい。
    • メインは IX2105 + 光回線環境
      • 下りが遅い。上りはめちゃくちゃ早い
    • サブとして、 IX2005 + JCOM 回線環境
      • 上りが遅い。下りは結構早い
      • VRRP の対向として、1GbE の NVR500 があるけど、NEC / YAMAHA は怖い気もする
  • ローカルネットワークは 2 つか 3 つ切っておく
    • 1 つ目は一般的な機器。
    • 2 つ目はお客様
    • 3 つ目は仮想マシン類。一旦はサーバに NIC 増やすもの大変だし、置いておく。
      • 1 つ目に含めておく?かな。しばらくは。
      • これを実現するために、 VLAN を切るというのもありかなぁ。

サーバについて

  • 現状スペック
    • i7-3770k / 32GB ME
  • 最低限必要なサーバ
    • syslog サーバ あるいはこれに準ずるもの
  • それ以外は遊び場になる
    • ディスク構成が結構不安な状況なので、いろいろ考えよう
      • 160GB 単発がシステムディスク
      • 320GB * 2(Linux md) で、lvm 運用してる
      • システムディスク死なれると悲しい + 仮想ホストだしこっち安めの SSD でも探そうかな
        • M.2 SSD と 256GB SSD 買ってくれば、デスクトップから 256GB SSD 引きはがして交換できなくはない
      • データディスクは基本領域用は 320GB * 2 のままでもいい気がする
        • または 1本にして、1本はバックアップを別途とるようにするか
      • 追加で大容量データ用に 1TB か、デスクトップに刺さってる 500GB をいい加減掃除して持っていくか

やりたいこと

プロビジョニングツールの上達/習得

  • chef / ansible

xen 環境の操作

  • KVM はもう一台足せたら考える

仮想マシンポコポコ立てていろいろ試す

  • 実はデスクトップが 16thread / 32GB MEMなので、こっちにも建てられるけど、寝るときはデスク消したい
    • こっちは、遊ぶ時の手元環境として一台くらい VirtualBox / VMware / Hyper-V かな…
    • 一瞬、Linux メイン / グラボを PCIe パススルーして仮想マシンwindows も考えたけど、結局寝るとき消したいので利点があまりない
  • ノートパソコンも T450s で、 i7-4600U?(なのか?忘れた) / 20GB MEM なので建てられるけど、また違う…
    • こっちは「いろいろできなくもない」とかの想定でメモリガン積み中古ノートにした
  • 試したいことの概要
    • DB いろいろ試したい
    • Web アプリケーション
      • わからないことがわかってきた(無知の知

まずやること

  • 出口が気になっていることから、ネットワークをどうにかしよう
    • お客様もすぐにはいらない。とりあえず出口のことを考えよう
    • syslog はどうする?すぐにはいいか。

whywaita さんはどこにでもいるよ

この記事は、whywaita Advent Calendar 2018 - Adventar20日目の記事です。

初めましての方は初めまして。 id:do_su_0805 と申します。

whywaita さんとは直接話した機会は片手程度な気がする仲ではありますが、気づくと「知人の知人が whywaita 」というケースであったり、場合によっては同組織に所属していた期間があったりと世間は狭いなぁというお話をさせてください。1

なお、この記事を書くにあたって、結果的にこのエントリーを出す前に転職エントリを執筆する必要が出てきたため、先行で公開しております。

転職エントリ - do_su_0805's blog

自己紹介

改めまして初めまして。 id:do_su_0805 と申します。

簡単に経歴を紹介させていただくと、

という経歴を辿ってきたものです。

kosen10s という、「2010年度に高専に入学した人たちのコミュ二ティ」に所属しています。

whywaita さんとの繋がり

whywaita さんとのパス その1 ICTトラブルシューティングコンテスト

直接の関わりはなかったのですが、私自身、ICTトラブルシューティングコンテストというイベントの運営学生だったことがあります。
前職の同期がもともと初代優勝者、2回目以降ずっと運営に携わっておられる方で、「参加してみない?」とお声掛けをいただき、参加しました。
なお、ネットワーク機器の設定なんてあまりやったこともなかった人間だったため、最後は人間redmineアサイン機になったりしていました。ご迷惑をおかけいたしました・・・。

どうやらその次の 第四回 から whywaita さんは継続的に運営に参加されておられます。
この記事で「運営に誘ってくれた」とある id:jackson58 や、「技術的な支援をしてくださった」とある id:kuro_m88 とかと一緒に運営委員をやっていました。
世間は狭いです。

whywaita さんとのパス その2 電気通信大学

kosen10s 関連などで電気通信大学に友人が何名かいます。2
また、 whywaita 氏も電気通信大学に所属しておられます。
まぁかち合わないわけがなく、twitter などで何度もお見受けし、初めて存在を認識したのがこの辺りだと思います。

whywaita さんとのパス その3 kosen10s

これもう、後述の #5 の時は理解が追いつかなかったんですが、whywaita 氏は kosen10s のイベント、 kosen10s LT #5#12 などに参加されています。
自他共に認める「準高専生」という称号があり、これもまたすごいなぁと思いました。 確かにシンパシーを感じる瞬間は多々あります。 この辺りから、「世間って狭いなぁ」と思い始めました。

whywaita さんとのパス その4 前職

先ほど転職エントリをあげさせていただきましたが、つい4ヶ月くらい前までさくらインターネット株式会社に所属しておりました。
自身が twitter に挙げられていたので引用させていただきますが、

というわけで、whywaita 氏もさくらインターネット株式会社でアルバイトとして就業しておられ、勤続的に重なった期間が少なからずあります。
ここはもう完全に「世間って(ry)」となりましたが、気づいた頃から彼が僕の分報チャンネルにいた気がします。3

whywaita さんとのパス その5 現職

同じく先ほど転職エントリにて触れましたが、現在株式会社はてなに所属しています。
まず入社直後からメンターをしてもらってる方が、「whywaita とは同じアルバイト先だったよ」と話になり驚き、
この AdventCalendar を毎年作成されている id:masawada さんなども同僚になりました。そういえば初対面の話は whywaita さんのお話でした。
いやはや、whywaita 氏どこでも知り合いがいてすごいなぁと本当に思いました。

最後に

ISUCON8 優勝おめでとうございます!
これからもご活躍を草むらの陰から追っていけたらと思います。 改めてどうぞよろしくお願いいたします!


  1. きっとみなさんも多いと思うのですが・・・ひとえに whywaita さんの活動範囲の広さの賜物と思っており、尊敬しています。

  2. 何かプレゼンテーションかの授業で、kosen10s のメンバーが僕の自己紹介スライドを作っていた(?)らしく、先ほどの「運営に誘ってくれた」方が驚いていたのを覚えています。 (https://twitter.com/staybuzz/status/598498171484966912)

  3. ひとりごとうるさくてごめんね