ffmpeg で動画を結合する方法 2 mpd ファイル編(memo)

ffmpeg で動画を結合する方法

ffmpeg で MPEG-DASH を扱う | ニコラボ

基本的な手順は上記の URL を参照しつつ実施しました。
上記の手順で詰まったところを補足しています。

環境

ffmpeg は今回 WSL 入れて、Ubuntu 上で下記を実施してインストールしました。

sudo apt install ffmpeg

手順

  1. mp4 ファイルを作成。作成方法は問わず。
  2. 下記コマンドを実行する
ffmpeg -re -i test.mp4 -map 0 -map 0 -c:v:0 copy -c:a:0 copy \
-filter:v:1 "scale=-2:360" -c:v:1 libx264 -profile:v:1 main -b:v:1 600k -c:a:1 aac -b:a:1 128k \
-f dash -window_size 5 -adaptation_sets "id=0,streams=v id=1,streams=a" \
-movflags +faststart test.mpd

ログ

ffmpeg version 3.4.6-0ubuntu0.18.04.1 Copyright (c) 2000-2019 the FFmpeg developers built with gcc 7 (Ubuntu 7.3.0-16ubuntu3) configuration: --prefix=/usr --extra-version=0ubuntu0.18.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared libavutil 55. 78.100 / 55. 78.100 libavcodec 57.107.100 / 57.107.100 libavformat 57. 83.100 / 57. 83.100 libavdevice 57. 10.100 / 57. 10.100 libavfilter 6.107.100 / 6.107.100 libavresample 3. 7. 0 / 3. 7. 0 libswscale 4. 8.100 / 4. 8.100 libswresample 2. 9.100 / 2. 9.100 libpostproc 54. 7.100 / 54. 7.100 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4': Metadata: major_brand : mp42 minor_version : 0 compatible_brands: isommp42 creation_time : 2017-08-25T06:57:06.000000Z Duration: 00:01:11.84, start: 0.000000, bitrate: 1383 kb/s Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720 [SAR 1:1 DAR 16:9], 1253 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc (default) Metadata: creation_time : 2017-08-25T06:57:06.000000Z handler_name : ISO Media file produced by Google Inc. Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default) Metadata: creation_time : 2017-08-25T06:57:06.000000Z handler_name : ISO Media file produced by Google Inc. Stream mapping: Stream #0:0 -> #0:0 (copy) Stream #0:1 -> #0:1 (copy) Stream #0:0 -> #0:2 (h264 (native) -> h264 (libx264)) Stream #0:1 -> #0:3 (aac (native) -> aac (native)) Press [q] to stop, [?] for help [libx264 @ 0x7fffb9ffba00] using SAR=1/1 [libx264 @ 0x7fffb9ffba00] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2 [libx264 @ 0x7fffb9ffba00] profile Main, level 3.0 [libx264 @ 0x7fffb9ffba00] 264 - core 152 r2854 e9a5903 - H.264/MPEG-4 AVC codec - Copyleft 2003-2017 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x1:0x111 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=11 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=abr mbtree=1 bitrate=600 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00 [dash @ 0x7fffb9fa0980] Opening 'init-stream0.m4s' for writing [dash @ 0x7fffb9fa0980] Opening 'init-stream1.m4s' for writing [dash @ 0x7fffb9fa0980] Opening 'init-stream2.m4s' for writing [dash @ 0x7fffb9fa0980] Opening 'init-stream3.m4s' for writing Output #0, dash, to 'test.mpd': Metadata: major_brand : mp42 minor_version : 0 compatible_brands: isommp42 encoder : Lavf57.83.100 Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 1253 kb/s, 30 fps, 30 tbr, 15360 tbn, 30 tbc (default) Metadata: creation_time : 2017-08-25T06:57:06.000000Z handler_name : ISO Media file produced by Google Inc. Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default) Metadata: creation_time : 2017-08-25T06:57:06.000000Z handler_name : ISO Media file produced by Google Inc. Stream #0:2(und): Video: h264 (libx264), yuv420p(progressive), 640x360 [SAR 1:1 DAR 16:9], q=-1--1, 600 kb/s, 30 fps, 15360 tbn, 30 tbc (default) Metadata: creation_time : 2017-08-25T06:57:06.000000Z handler_name : ISO Media file produced by Google Inc. encoder : Lavc57.107.100 libx264 Side data: cpb: bitrate max/min/avg: 0/0/600000 buffer size: 0 vbv_delay: -1 Stream #0:3(und): Audio: aac (LC), 44100 Hz, stereo, fltp, 128 kb/s (default) Metadata: creation_time : 2017-08-25T06:57:06.000000Z handler_name : ISO Media file produced by Google Inc. encoder : Lavc57.107.100 aac [dash @ 0x7fffb9fa0980] Opening 'test.mpd.tmp' for writing bitrate=N/A speed=0.996x [dash @ 0x7fffb9fa0980] Opening 'chunk-stream0-00001.m4s.tmp' for writingpeed=0.999x [dash @ 0x7fffb9fa0980] Opening 'chunk-stream1-00001.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream3-00001.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'test.mpd.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream2-00001.m4s.tmp' for writingpeed=0.998x [dash @ 0x7fffb9fa0980] Opening 'test.mpd.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream0-00002.m4s.tmp' for writingpeed= 1x [dash @ 0x7fffb9fa0980] Opening 'chunk-stream1-00002.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream3-00002.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'test.mpd.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream0-00003.m4s.tmp' for writingpeed=0.999x [dash @ 0x7fffb9fa0980] Opening 'chunk-stream1-00003.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream3-00003.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'test.mpd.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream2-00002.m4s.tmp' for writingpeed=0.999x [dash @ 0x7fffb9fa0980] Opening 'test.mpd.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream0-00004.m4s.tmp' for writingpeed= 1x [dash @ 0x7fffb9fa0980] Opening 'chunk-stream1-00004.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream3-00004.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'test.mpd.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream2-00003.m4s.tmp' for writingpeed=0.999x [dash @ 0x7fffb9fa0980] Opening 'test.mpd.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream0-00005.m4s.tmp' for writingpeed= 1x [dash @ 0x7fffb9fa0980] Opening 'chunk-stream1-00005.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream3-00005.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'test.mpd.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream0-00006.m4s.tmp' for writingpeed= 1x [dash @ 0x7fffb9fa0980] Opening 'chunk-stream1-00006.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream3-00006.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'test.mpd.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream2-00004.m4s.tmp' for writingpeed= 1x [dash @ 0x7fffb9fa0980] Opening 'test.mpd.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream0-00007.m4s.tmp' for writingpeed= 1x [dash @ 0x7fffb9fa0980] Opening 'chunk-stream1-00007.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream3-00007.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'test.mpd.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream2-00005.m4s.tmp' for writingpeed= 1x [dash @ 0x7fffb9fa0980] Opening 'test.mpd.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream0-00008.m4s.tmp' for writingpeed=0.999x [dash @ 0x7fffb9fa0980] Opening 'chunk-stream1-00008.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream3-00008.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'test.mpd.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream0-00009.m4s.tmp' for writingpeed= 1x [dash @ 0x7fffb9fa0980] Opening 'chunk-stream1-00009.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream3-00009.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'test.mpd.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream2-00006.m4s.tmp' for writingpeed= 1x [dash @ 0x7fffb9fa0980] Opening 'test.mpd.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream0-00010.m4s.tmp' for writingpeed=0.999x [dash @ 0x7fffb9fa0980] Opening 'chunk-stream1-00010.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream3-00010.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'test.mpd.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream2-00007.m4s.tmp' for writingpeed= 1x [dash @ 0x7fffb9fa0980] Opening 'test.mpd.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream0-00011.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream1-00011.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream3-00011.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'test.mpd.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream0-00012.m4s.tmp' for writingpeed= 1x [dash @ 0x7fffb9fa0980] Opening 'chunk-stream1-00012.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream3-00012.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'test.mpd.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream2-00008.m4s.tmp' for writingpeed= 1x [dash @ 0x7fffb9fa0980] Opening 'test.mpd.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream0-00013.m4s.tmp' for writingpeed= 1x [dash @ 0x7fffb9fa0980] Opening 'chunk-stream1-00013.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream3-00013.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'test.mpd.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream0-00014.m4s.tmp' for writingpeed= 1x [dash @ 0x7fffb9fa0980] Opening 'chunk-stream1-00014.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream2-00009.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'chunk-stream3-00014.m4s.tmp' for writing [dash @ 0x7fffb9fa0980] Opening 'test.mpd.tmp' for writing frame= 2155 fps= 30 q=-1.0 Lq=-1.0 size=N/A time=00:01:11.84 bitrate=N/A speed=0.997x video:16469kB audio:2223kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown [libx264 @ 0x7fffb9ffba00] frame I:9 Avg QP:20.69 size: 40942 [libx264 @ 0x7fffb9ffba00] frame P:588 Avg QP:23.30 size: 6658 [libx264 @ 0x7fffb9ffba00] frame B:1558 Avg QP:28.54 size: 850 [libx264 @ 0x7fffb9ffba00] consecutive B-frames: 2.8% 1.8% 2.1% 93.4% [libx264 @ 0x7fffb9ffba00] mb I I16..4: 14.3% 0.0% 85.7% [libx264 @ 0x7fffb9ffba00] mb P I16..4: 0.6% 0.0% 1.2% P16..4: 38.9% 22.2% 17.1% 0.0% 0.0% skip:20.1% [libx264 @ 0x7fffb9ffba00] mb B I16..4: 0.0% 0.0% 0.0% B16..8: 41.3% 2.9% 0.8% direct: 1.6% skip:53.4% L0:42.2% L1:51.6% BI: 6.1% [libx264 @ 0x7fffb9ffba00] final ratefactor: 23.12 [libx264 @ 0x7fffb9ffba00] coded y,uvDC,uvAC intra: 78.9% 60.9% 23.5% inter: 10.5% 5.6% 0.1% [libx264 @ 0x7fffb9ffba00] i16 v,h,dc,p: 25% 31% 8% 36% [libx264 @ 0x7fffb9ffba00] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 19% 30% 11% 5% 8% 6% 10% 5% 7% [libx264 @ 0x7fffb9ffba00] i8c dc,h,v,p: 57% 22% 15% 5% [libx264 @ 0x7fffb9ffba00] Weighted P-Frames: Y:3.2% UV:0.2% [libx264 @ 0x7fffb9ffba00] ref P L0: 59.5% 17.3% 13.7% 9.3% 0.2% [libx264 @ 0x7fffb9ffba00] ref B L0: 82.9% 12.7% 4.5% [libx264 @ 0x7fffb9ffba00] ref B L1: 89.8% 10.2% [libx264 @ 0x7fffb9ffba00] kb/s:624.49 [aac @ 0x7fffba073ba0] Qavg: 57434.145

dig の status の見方 memo

dig の見方 第1弾 status

第2弾はないかもしれないが。気が付いたベースのメモ。
ANSWER SECTION の見方はわかってるが、それ以外の見方についてあまり意識してこなかったので、ちょこっとメモを残しておく。

一例

; <<>> DiG 9.10.3-P4-Ubuntu <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53541
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

↑の場合、google.com を dig った結果。名前解決もばっちり。 なので、status が NOERROR になっている。

status 意味 実際に打ってみたコマンド
NOERROR エラーとなっているが、No Error なので、ちゃんと結果が返ってきた証拠 dig google.com
NXDOMAIN どんな型のレコードも存在しない。ネームサーバ未登録のドメインとか。要は名前解決できなかった場合。 dig hogehoge.fugafuga.com
NODATA 例えば Aレコードを解決しようとして、A はないけど他はあるよ、という場合? (調査中)
CNAME CNAME の名前解決をしたとき? (調査中)
referral/委任 他の権威DNSサーバが知っている。親のネームサーバに聞きに行ったときとか? (調査中)
REFUSED 名前解決不可なネームサーバに名前解決しに行ったとき? (調査中)

( 参考 URL ) https://www.geekpage.jp/blog/?id=2014/7/25/1 https://qiita.com/hypermkt/items/610b5042d290348a9dfa

behave での実行方法備忘録(memo)(作成中)

概要

behave 使って自動化試み中なので、試行錯誤の情報をまとめておく。
なお、日々少しずつ進めているので、途中でも自分用のメモとしてあげて、ちょこちょこ更新する予定。

behave に関するリンク集

www.ainoniwa.net

githubja.com

behave.readthedocs.io

使用した環境

> python --version
Python 3.7.3

anaconda Command line client (version 1.7.2)

ファイルの配置

example L features L behave-test.feature L environment.py L steps (ディレクトリ) L step1-login.py

feature の書き方

@common
  Scenario: 契約を作る
    Given ログイン画面を開く 
      And ログインする
     When 契約作成ボタンを押す
      And 値を設定する
       | hostname       | 
       | behave-comon  | 
      And 確認ボタンを押す
      And 設定ボタンを押す
     Then 完了と表示される

TSIGについてまとめてみた(未整理)

TSIG って何

ゾーン転送における、スレイブサーバ側の、マスターサーバからのなりすまし防止のための仕組み。

スレーブ・サーバのゾーン転送とセキュリティ (3/3):実用 BIND 9で作るDNSサーバ(5) - @IT
http://www.tatsuyababa.com/NW-DNS/NW-200302-DNS07.pdf
https://jprs.jp/tech/material/rfc/RFC2845-ja.txt

TSIG(Transaction Signature)。
TSIGはサーバとクライアントで共通の秘密鍵保有し、DNSメッセージ全体に署名を行うことでメッセージの完全性の保証やリクエスト認証を可能にします。

鍵生成コマンド

結構時間がかかる。中々結果が返らなくてもあせらない。

/usr/sbin/dnssec-keygen -a HMAC-MD5 -b 512 -n HOST example.com
# 結果
$ ll *key
 Kexample.com.+157+13212.key ( key の前の数字はランダム?)
$ ll *private
 Kexample.com.+157+13212.private ( private の前の数字はランダム?)

bind への設定 (マスターサーバ・スレーブサーバ両方での設定)

生成された「Kexample.com.+157+*.key」ファイルを開くと以下のようになる。

cat  Kexample.com.+157+13212.key
example.com. IN KEY 512 3 157 jRRJA...(省略)

の 157 以降「jRRJA...(省略)」部分を /etc/bind/tsig-keys/example.com.key (bind:bind 600) で以下のように保存。
なお、本操作は root 権限での実施が望ましい。(というかじゃないと操作できなかったっぽい)

key example.com {
    algorithm hmac-md5;
    secret "jRRJA...(省略)";
};

bind への設定方法

http://www.tatsuyababa.com/NW-DNS/NW-200302-DNS07.pdf
に記載の通り。named.conf に以下のように記載する。

TSIG付きDNSダイナミックアップデートの設定(named.confファイル)

# 正引きゾーン sample
zone "example.com" {
        type master;
        file "example.com.zone";
        allow-update { key ddns.example.com.; };
};
# 逆引きゾーン  sample
zone "0.168.192.in-addr.arpa" {
        type master;
        file "0.168.192.in-addr.arpa.zone";
        allow-update { key ddns.example.com.; };
};
# TSIG鍵の設定  sample
key ddns.example.com. {
        algorithm hmac-md5;
        secret "iSUuKtizDJEK/9ptgewTHQ==";
};

セカンダリサーバにおけるゾーン転送の設定(named.confファイル)

// TSIGを使用するサーバの設定
server 192.168.0.10 {
keys { axfr.example.com.; };
};
// TSIG鍵の設定
key axfr.example.com. {
algorithm hmac-md5;
secret "nAgPY1cTo8HJ/FXw1waaow==";
};

NAPTR レコードについて調べたページまとめ(未整理)

とりあえずURLリスト

お仕事で調べたり、これから使いそうな NAPTR に関する URL集。
あとで優先度順に並べるのと感想を書く。 途中でも公開。

RFC

その他

レコードはこんな感じらしい

Regexp が謎。

NAPTR * Label * zone apex のみ可

  • Order

    • 16bit符号無し整数 (0-65535)
  • Preference

    • 16bit符号無し整数 (0-65535)
  • Flags

    • NAPTR レコードの DNS 検索動作を指定します
    • 種別
      • "u" or "U":URI を出力
      • "s" or "S":Replacement フィールドのラベルを SRV 検索したものを最終結果として出力
      • "a" or "A":Replacement フィールドのラベルを A, AAAA 検索したものを最終結果として出力
      • "p" or "P":アプリケーション依存の動作を行う (未定義)
      • "":DDDS の反復処理
  • Services

    • リソースレコードが対象としているサービスを指定
      • SIPサービス:E2U+sip
      • H.323サービス:E2U+h323
      • 電子メールサービス:E2U+msg:mailto
      • Webサービス:E2U+web:http
  • Regexp

    • E.164番号 (ENUM 番号) からURIを生成するための置換文字列を指定
  • Replacement

    • Regexp とは排他で、使用しないときは "." を指定

SRVレコードについて調べたページまとめ(未整理)

とりあえずURLリスト

お仕事で調べたり、これから使いそうな SRV に関する URL集。
あとで優先度順に並べるのと感想を書く。 途中でも公開。

RFC

RFC2782 サービスの場所を指定するDNS資源レコード(DNS SRV)
RFC2219 ネットワークサービスへのDNS別名の利用

RFC2052 日本語訳 - [RFC/技術資料] ぺんたん info 2052 よりは、2782 のほうがわかりやすそう?目的が違うのかしら?

その他

www.atmarkit.co.jp
www.atmarkit.co.jp
そもそもの発端。NAPTR を調べてたら、SRV の話が出てきたので調べ始めた。

レコードはこんな感じらしい

左辺 Service (アンスコ)始まり 大文字・小文字の区別が必要 Proto (アンスコ)始まり 大文字・小文字の区別が不要 Name 右辺 Priority 0-65535 Weight 0-65535 Port 0-65535 Target 参照先が CNAME は NG RData が外部 or 内部で A/AAAA を登録 を登録してないとだめ ホスト名ではなく「.」とした場合は、サービスが利用不可

WACATE 2019 夏 ~ テスト計画半端ないって ~

はじめに

注意:WACATE のテーマとタイトルが違うのは、私が一番大事だと思ったことをタイトルにしたからです。正確には「WACATE2019 夏 〜納期半端ないって!〜」です。

WACATE 翌日で、当日よりは落ち着いてるけどまだ当日分の加速装置が働いている状態で書いています。
今回の記事のメインターゲットは「」。 正確には「未来の私」です。
なので、なんか違うなって思ったら関係リンク先にどうぞ!

関係リンク

BPPセッション

speakerdeck.com

中村さんのセッション

www.slideshare.net

中野さんのセッション(BGMは矢野顕子)

www.slideshare.net

toggetter

togetter.com

WACATE のページ

wacate.jp

WACAくないけど WACATE に行ってきました!夏

というわけで、予防線を張りつつ、感想です。
今回の WACATE のメインテーマは「納期半端ないって!」です。

まずは 2019年夏のWACATE について、ズバッとよかったこと、感銘を受けたこと、その他感想を箇条書きで並べます!

  • 記事名の通り。テスト計画スゲー――――!!!!!
  • 夜の分科会で、ブロッコリーさんと中村さんのお話を聞けてとても良かった(詳細は内密)
  • 中野さんのセッションマジよかった。脳疲労と達成感で脱力しまくっている中でもちゃんと頭に入ってきたし、ワークをやったからこそ、より染み入った
  • The 10 Minute Test Plan 私もまずは取り組んでみよう
  • Rex Black スゲーーーーーー!
    • テスト計画を作るよりも、合意形成、期待を合わせることが大事
    • テスト計画はステークホルダーに意思表示すること、責務を知らせることが重要
  • テスト計画の可能性をあきらめない(だったっけ…?)ということ。これ、テスト計画に限らずだなあと思った。どうせ使えない、じゃなくて、なぜ使えないのかを考えようと思う
  • バグを見つけるためにはまず整理されていた方が効率的に見つけることができる
  • チームマネジメントは難しいし、テスト方針を貫くことも難しい
  • テスト設計、実装、実行のすべては、テスト計画、分析があってこそだなあと思った

当たり前じゃん、と思うことも多いかもしれないですが、改めて体感できてよかったと思うことと、そそそそそうだったのかーーーーー!と驚くこともありました。
きっと未来の私は「こんなの当たり前に実践できてるよ!」って見返したときに言うはず。

かように学ぶことは大量でした。

行く前の感想

現在の業務について、まずは説明しますね。これが前提になってくるので。

  • テスト対象:法人向けのWebサービス
  • テスト納期:基本は 2,3週間前後でテスト計画から出荷判定までを行う
  • テストレベル:とりあえず開発がコンポーネントテストまではやってくれてるといいなあという状態。システムテスト相当の評価を実施
  • 現在の状況:上記の基本 PRJ のほかに、Phaseが複数に分かれる、約 半年に渡る評価 PRJ を担当。常時 2、3 PRJ の PL をしている

という状況で、WACATE 夏のテーマを知った私は「ウェーーーーーーイ!これは私のためのプログラムなのでは?」と浮かれ果ててました。 何しろ、上記の状態なのにテスト計画もろくにない状態でプロジェクトを日々進めていたからです。
この状況を打開せねばならない、しかし、まさに木こりのジレンマ状態。振り上げた斧を下ろすことも、ましてや研ぐこともできない状態でした。(まあ今もまだそうです)

ちなみに、1年前の私はポジぺにこんなことを書いてましたね…

サイクルの早いテストをこなすのでいっぱいいっぱいになってしまい、本来やるべきテストプロセスがおろそかになっている。

か、、、変わってない、、、。(つд⊂)エーン
以前に比べると「要求分析をちゃんと明示的に行うようになった」「開発チームと評価項目のレビューを行うことがプロセスに明示的に組み込まれるようになった」という点では変わりました。
しかし、その中で何をやるのかは各PLに任されており、誰もがこれでいいのか…?と思っている状態でした。(たぶん…。いや私以外はもしかしたらこれで完璧って思ってるのかもしれないですけど)

行った後の感想

作ったものに対してステークホルダーに共有して合意をとる、というのが大事なのは「知って」いました。
だけど、実際には先にあげたとおりの「スピード感」というワードでやらないことをごまかしていたように思います。
実際、テスト計画まではいかなくても、テスト方針を書いて伝えたプロジェクトでは、テスト設計で大きなぶれなくテストができたことを思い出しました。
その時は設計者と PL の間だけのものだったけど、それをちゃんとプロジェクトの開始時点で開発と握って、変わりそうなら開発と握りつつ進めないといけなかったんだな、と思いました。

私に足りなかったのは「テスト計画をステークホルダーと握ること。」
「何のためにテスト計画を作るのかをちゃんとは理解していなかったこと」
この 2 点かなあ。

QAエンジニアになって今更感はあるけど、少しずつチームにテスト計画の意義を共有、浸透していければいいと思いました。

最後に

当時の自分のつぶやきを残して、記事を終えたいと思います。