平常運転

アニソンが好き

過去記事とかは記事一覧で見れます

2018年のおたくイベント振り返り

すっかりブログを書かなくなって久しい2018年だけど、年の瀬なのでこの1年でアニソン/声優系のイベントに行ったのを振り返っておこうと思う。関東には何回行ったか分からないし、海外にも3回(台北上海台北)行くなどかなりフットワーク軽く飛び回った1年だった。
ちなみに長々と感想を書くと永遠に終わらないのでサクサク書いていきます。

1月

  • 1/6, 7: THE IDOLM@STER ニューイヤーライブ‼︎ 初星宴舞
  • 1/13, 14: ガルパーティ!in東京 / ガルパライブ
  • 1/27, 28: リスアニ!LIVE 2018 (SATURDAY STAGE / SUNDAY STAGE)

astj.hatenablog.com
astj.hatenablog.com

1月から関東のイベント2デイズ*3で勢いがある。どれも楽しかったけれど、どれか一つを挙げろと言われたらやっぱり初星演舞かなあと思う。久々の765AS単独ライブは本当に良かった。

2月

astj.hatenablog.com

長崎まで飛んだハウステンボスのイベントはめちゃめちゃ楽しかった。ライブの楽曲自体もさることながら、メンバー同士の仲が良いところを沢山見られたのも幸せだったし、ライブ以外のミニイベントみたいなのもいろいろあって充実してた。ワルキューレは2ndのときよりもさらにパワーアップしていて本当に良かった。 Blu-Ray も買いました。TrySail は友達に誘われて。なんだかんだと単独は初めてだったのだけどナルホドーという感じで楽しかった。
舞台が1個混じってるけれど、これは Poppin'Party の西本りみさんが出演されてるということで見に行ったという感じ。小劇場系の舞台見るのは初めてだったので新鮮だった。
この月は関東1往復ですね。イベント行った文脈とは関係ないけど仕事でも1往復していたようだった。

3月

  • 3/3: ANIMAX MUSIX 2018 OSAKA
  • 3/25: AnimeJapan 2018 (2日目)
  • 3/25: THE THIRD(仮)1st LIVE

astj.hatenablog.com

ANIMAX MUSIX は恒例。 Poppin'Party が大阪の大舞台に!という観点でも素晴らしかったし、 Fate セレクションではガッツポーズしてしまった。
AnimeJapan はよなきに(声優ラジオ番組「夜中メイクが気になったから」)の出演者お渡し会に。AnimeJapan自体初めてだったので見て回るのおもしろかった。
そして THE THIRD(仮)1st LIVE が同日。ぜったい楽しいと思って行ったファーストライブはすごく楽しかったしエモかった。

4月

  • 4/7, 8: THE IDOLM@STER CINDERELLA GIRLS Initial Mess@ge
  • 4/19: 「第五回課外授業『ゴリラ~GORILLA~』」
  • 4/22: OBC『夜中メイクが気になったから』Presents YONAKINI THE LIVE! Passion!! (第一部)

Initial Mess@ge で台湾に行っていた。アイマスライブとしては1年ぶりの台湾単独公演。前年はライブに行って帰るだけけど、今年は旅程を長めにとってしっかり観光もした。
初期曲からアニメ曲、最近の曲までいいところを押さえていてとても充実した中身だった。2日目の流れ星キセキではまた泣いてしまったね。。
2月につづいて西本さんの出演する舞台も見に行った。たしか仕事で東京出張してたんだったと思う。

5月

astj.hatenablog.com
astj.hatenablog.com

バンドリ5thライブのあった月。ブログにも書いたけど、本当にハッピーになった1日目と、永遠に記憶に焼き付ける一瞬だった2日目だった。
5/13の空き時間にMRまで行ってきていて、正直この時点での期待値は低かったんだけどいざ行くとすごく楽しかった。
松澤さんのアルバムリリースパーティはしばらく前に偶然目について日程の都合が良かったから参加したのだけど、本質な感想はこのツイートに集約される。


6月

  • 6/1: YURIKA ENDO FINAL LIVE - Emotional Daybreak-
  • 6/2,3: THE IDOLM@STER MILLION LIVE! 5thLIVE BRAND NEW PERFORM@NCE!!!
  • 6/16: LIVEPASSION直前 ここいば歌唱楽曲大発表会
  • 6/16: FLOW 15th Anniversary TOUR 2018「アニメ縛り」大阪公演
  • 6/24: あいみあやさちゃんの ドキドキ! Girls前線成長中!
  • 6/24: THE IDOLM@STER MILLION LIVE! MILLION THE@TER GENERATION 07&08 発売記念イベント (2回目)

astj.hatenablog.com

Emotional Daybreak はブログを書いていた。ミリオン5thもブログ書けてないあたりこの辺で習慣が力尽きてることが伺える。
ミリオン5thはミリシタ開始後初の大型ライブということで、ミリシタのライブだ!というのが強く感じられた。ただまぁどうしてもソロ曲新曲が多いので選曲の自由度が低いというか新曲並べました感が出ちゃったかなぁとは思わなくもなかった。
6/16はふしぎな感じだけど、ここいばリスナーの友達が FLOW とあわせて誘ってくれたのでいってきたという感じ。ライブパートの選曲はどれも良かった。 FLOW はいわずもがなめちゃめちゃ楽しかった!

7月

  • 7/7,8: V-STATION THE LIVE! Passion!! 2018
  • 7/14: 愛美のPerfect Woman ~Perfect meeting~ (昼の部)
  • 7/17: THE THIRD(仮) 2nd LIVE
  • 7/21: BILIBILI MACRO LINK - STAR PHASE × ANISONG WORLD MATSURI 2018
  • 7/22: BILIBILI WORLD (3日目)

この辺から予定の滅茶苦茶感が増してくる。 Poppin'Party が各地のアニソンイベントに出演して回ってさながらライブツアーか、という夏が始まったのがこの7月。
LIVE! Passion!! はラジオ大阪V-STATION の番組間のつながりを感じられて連帯感のあるいいライブだった。お目当てである Poppin'Party やよなきにのステージが大満足だったのは言うまでもないけど、鈴村健一さんの SHIPS のことが強く記憶に残っている。
THE THIRD のセカンドライブはファーストライブよりさらにパワーアップしていて大満足だった。新メンバーが加入して RAISE A SUILEN という名前になるなど、セカンドライブも大きな節目という感じだったので行けて良かった。
そしてこの7月は Poppin'Party とアイマス(シンデレラとミリオン両方)を追いかけて上海のアニソンフェスまで行った。豪華な出演者で大満足だったんだけれど、ライブで一番心を打たれたのはその3者ではなく T.M.RevolutionガンダムSEED曲3連発(INVOKE => Ignited => Meteor)かもしれない。SEED 大好きだったんですよ。。。。
7/22 の BILIBILI WORLD は Poppin'Party のトークステージを見に行ったのが主なんだけど、前日のライブともども中国でのバンドリの人気っぷりを見てちょっと感動してしまった。

8月

  • 8/4,5: THE IDOLM@STER PRODUCER MEETING 2018 “What is TOP!!!!!!!!!!!!!?”
  • 8/8: コカ・コーラ SUMMER STATION 音楽LIVE 18/08/08 Poppin'Party
  • 8/19:「声優 愛美さん ブロマイドお渡し会」in ブシロードストア (第一部)
  • 8/19: 大塚紗英 ファンミーティング『SAE Vo.yage!vol.2~I’m an Egg!~』(2部)
  • 8/24,25,26: Animelo Summer Live 2018 “OK!”

astj.hatenablog.com

改めて書き出すと恐ろしいスケジュール。この月は4回関東に行っている。
7月のところにも書いた Poppin'Party のライブに関しては、この夏はシンガポールのイベント出演以外は行ったんじゃないかな。。 サマステではオルスタらしいオルスタ、ボリューム的にも大満足という内容だったし、アニサマもすごくよかった。
アイマス的にはプロミが大事なイベントだった。爆笑パートは爆笑だったんだけれどね。

9月

astj.hatenablog.com

9/2は同僚(リアル)が当てたカラオケキャンペーンの結果発表イベントというのに連れて行ってもらい、ついでに(というと言葉は悪いが)一度行ってみたかった VR ZONE のニュージェネのを見に行っていた。

SS3Aは現地は初日のみ。アイマスライブで久々にチケット取れなくてライブビューイングという形になった気がする。どういうライブなんだろうと思いながら向かった訳だけど、リアレンジやリミックスは新鮮だったし、ライブ初出しも素敵な曲/パフォーマンスが多くてすごくよかった。あとシンデレラガールズの一員としての鈴木みのりさんの歌を聴いて、やっぱこの人歌うめえなと改めて感じ入ったのもこのライブだった。
9/30 は本当はよなきにのイベントがあったのだけど台風で流れてしまって、当日にチケットを譲ってもらって鈴木みのりさんのバースデーイベントに雪崩れ込んだ。多分SS3Aがなかったら行こうと思わなかったと思う。ライブコーナーもとても良かったのだけど、ピアノ伴奏だけでの Crosswalk が特に心に刺さっている。

10月

  • 10/7: THE IDOLM@STER MR STAGE!! MUSIC♪GROOVE☆ (亜美真美主演回)
  • 10/13: バンドリーマー感謝キャラバン (大阪)
  • 10/27: 刈谷アニメcollection スーパーライブ2018

秋のMRでついに亜美真美主演回登場なのだけど10/7の1日だけ!! なんとこの日は3公演全部行った。曲もMCも、まさに亜美真美のステージで本当にめでたかったし楽しかった。
10/27の刈谷のイベントはイベント終盤しか行けなかったのだけど、 RAISE A SUILEN のステージを満喫できてすごくよかった。あと同僚が近くに住んでいたのでそのままスムーズに飲みに行けたのでおもしろかった。

11月

  • 11/05: 大塚紗英ファンミーティング『SAE Vo.yage! vol.3 ~MAGICALOGIC!~』
  • 11/07: Roselia Live「Vier」
  • 11/10,11: THE IDOLM@STER CINDERELLA GIRLS 6thLIVE MERRY-GO-ROUNDOME!!! 埼玉公演
  • 11/25: 夜中メイクが気になったから ~愛美大卒業式振替編~

シンデレラの西武ドームの直前の月曜と水曜日にイベントが出現したためまるまる1週間関東にいたおそろしい月。そのシンデレラは大きなドームを目一杯使った大満足のライブだった。しかし西武ドームは交通アクセスがね。。。と思い知らされてしまった。

12月

  • 12/01,02: THE IDOLM@STER CINDERELLA GIRLS 6thLIVE MERRY-GO-ROUNDOME!!! 愛知公演
  • 12/07,08: BanG Dream! 6th☆LIVE
  • 12/12: アニメ「BanG Dream! 2nd Season」制作発表会
  • 12/15: リスアニ!LIVE TAIWAN 2018 (SATURDAY STAGE)
  • 12/25: AIMI Birthday Christmas PARTY 2018

年の瀬も沢山イベントに行った。まさか1年で2回台湾にライブ見に行くことになるとは思うまい。海外行ったことない友達が出演者的に是非行きたいということで、じゃあ僕もいくか〜と半分付き添いみたいな気持ちで行ったのだけど、どのアーティストも良くて大満足だった。本人ソロ名義での出演だった沼倉さんがミリオンの最後の Brand New Theater! に登場したあの光景はたまらないものだった。

シンデレラ6thは4公演で春夏秋冬をテーマにする、というのはいいコンセプトだったと思う。しかしこういう明らかなコンセプトにしても季節曲でセトリに収まらない曲が出てしまうあたり、シンデレラの広がりはすごい!というのも改めて思った。全体的に満足度高かったけど、ナゴヤドームはソロ曲の選曲でぶっささるものが多くて大変よかった。あとやっぱり流れ星キセキはダメです!!!!!
バンドリは単純にぶち上げで楽しかったという話題だと金曜日の RAS がピカイチ。土曜日の Poppin'Party は1月からのアニメOPのキズナミュージック♪が既に大好きなのでライブで聞けて本当に良かった。本当に良かった。そして翌週のアニメ制作発表会に行けたのもよかった。ミニライブ楽しかったし、偶々通路側の席だったら目の前をキャストの皆さんが通っていってめっちゃドキドキしてしまった。

愛美さんのバースデーイベントに行くのは3年目。今年はライブハウスが会場ということで歌(カラオケ)が多くて去年とはまた違う印象のイベントだったけれど、イベントに参加できてお祝いできるのはめでたかったですね。

振り返り

何回東京に行ったかとか何回イベントに行ったかとかを考えるのは怖くてやめた!!!!
下半期がどんどんスケジュールに無茶をきかせるようになってきており、行きたいイベントがそこにあるから仕方ないよ〜とは思いつつ、来年も身体と財布が壊れない範囲で無理して楽しくやっていきたいですね。

Go で JSON を扱うにあたっての個人的なメモ

個人的なメモです。というのは全てにおいて予防線として扱われる。

omitempty

JSON tag につける omitempty は、 JSON の Marshal 時に参照される。 empty value だった際にそのフィールドがまるごとスキップされる。

The "omitempty" option specifies that the field should be omitted from the encoding if the field has an empty value, defined as false, 0, a nil pointer, a nil interface value, and any empty array, slice, map, or string.

https://golang.org/pkg/encoding/json/#Marshal

(なので、 UnMarshal にしか使わないような構造体の JSON tag につけても意味はない)

Unmarshal 時のフィールド名の対応

JSON のあるフィールドが JSON のどのフィールドに対応づけられるかのルール:

How does Unmarshal identify the fields in which to store the decoded data? For a given JSON key "Foo", Unmarshal will look through the destination struct's fields to find (in order of preference):

  • An exported field with a tag of "Foo" (see the Go spec for more on struct tags),
  • An exported field named "Foo", or
  • An exported field named "FOO" or "FoO" or some other case-insensitive match of "Foo".
https://blog.golang.org/json-and-go

つまり、(Unmarshal する都合においてのみ言うと)、JSON 上で hogeHoge というフィールドのものを構造体の HogeHoge や Hogehoge などにマッピングしたい場合、 JSON タグはつけなくてもマッピングされる。
逆に、この Case-Insensitive match を無効にするオプション今のところないようなので、 Case-sensitive な厳格な JSON デコーダは実現できないことになる。今触ってるコードだとこれが結構キツいんだけどどうしようか悩んでいる。諦める???

未知のフィールドを除外する

func (*Decoder) DisallowUnknownFields() を使う。

DisallowUnknownFields causes the Decoder to return an error when the destination is a struct and the input contains object keys which do not match any non-ignored, exported fields in the destination.

https://golang.org/pkg/encoding/json/#Decoder.DisallowUnknownFields

ちなみに前述したような Case-insensitive match が無効になる訳ではない。

missing key

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
)

func main() {
	var data struct {
		Name      string   `json:"name"`
		Memo      string   `json:"memo"`
		Nicknames []string `json:"nicknames"`
	}
	buffer := bytes.NewBufferString("{\"name\":\"tom\"}")
	decoder := json.NewDecoder(buffer)
	if err := decoder.Decode(&data); err != nil {
		fmt.Println(err.Error())
	}
	fmt.Println(data)
}

https://play.golang.org/p/PtPrJd0TIE0

構造体の期待するフィールドが JSON 側になかったとき、デコーダは特にエラーにならずに empty value を自然と埋める。緩く扱うにはメリットだけれど、ユーザ入力をきちんとハンドリングしたい時にはちょっと困る気もする。

null as array

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
)

func main() {
	var data struct {
		Name      string   `json:"name"`
		Nicknames []string `json:"nicknames"`
	}
	buffer := bytes.NewBufferString("{\"name\":\"tom\", \"nicknames\": null}")
	decoder := json.NewDecoder(buffer)
	if err := decoder.Decode(&data); err != nil {
		fmt.Println(err.Error())
	}
	fmt.Println(data)
}

https://play.golang.org/p/go69_sBuVZ1

リストっぽいところに null を渡すと空のリストになる。上記の missing key と組み合わせると、ふつうにやると以下の3つは Unmarshal された構造体からは区別できない

  • null
  • []
  • (そもそもフィールドが渡されてこなかった)

2018/09/04 01:19: 複数のフィールドが同じタグを持っている

package main

import (
	"encoding/json"
	"fmt"
)

type Single struct {
	Name1 string `json:"name"`
	Name2 string `json:"name"`
}

type Inner1 struct {
	Name1 string `json:"name"`
}

type Inner2 struct {
	Name2 string `json:"name"`
}

type Inner3 struct {
	Name3 string `json:"name3"`
}

type OuterA struct {
	*Inner1
	*Inner2
}

type OuterB struct {
	*Inner1
	*Inner3
}

func main() {
	data := &Single{}
	if err := json.Unmarshal([]byte("{\"name\":\"tom\"}"), &data); err != nil {
		fmt.Println(err.Error())
	}
	fmt.Println(data)

	dataA := &OuterA{}
	if err := json.Unmarshal([]byte("{\"name\":\"tom\"}"), &dataA); err != nil {
		fmt.Println(err.Error())
	}
	fmt.Println(dataA.Inner1, dataA.Inner2)

	dataB := &OuterB{}
	if err := json.Unmarshal([]byte("{\"name\":\"tom\"}"), &dataB); err != nil {
		fmt.Println(err.Error())
	}
	fmt.Println(dataB.Inner1, dataB.Inner3)
}

https://play.golang.org/p/2Ovn3J7ChfQ

複数のフィールドにうっかり同じタグをつけてしまった場合、どちらにも Unmarshal されない。ちなみに playground つけてないけど Marshal もされない気がする。
上記の Playground の `Single` のように単一の struct にタグが複数ついてると go vet が怒ってくれるけれど、 Outer~ のように embedding だと go vet でも気付かないので難しい。(過去にこれでミスったことがある)

THE IDOLM@STER CINDERELLA GIRLS new generations★Brilliant Party! に行ってきた

アイドルマスターのライブといえばキャストの声優さんが歌い踊る方のリアルライブを普段は指すのだけれど、最近はキャラクター達が歌い踊るバーチャルライブの試みも幾つか生まれている。そのうちの一つの、シンデレラガールズの new generations 主演のバーチャルライブを見に行ってきた。

vrzone-pic.com

f:id:astj:20180902130738j:plain

まだ期間中なので一応具体的なセトリの話はしないでおこうと思います。期間が終わったら追記するかも。

続きを読む

コカ・コーラ SUMMER STATION 音楽LIVE で Poppin'Party を見てきた

コカ・コーラ SUMMER STATION 音楽LIVE というイベントが7~8月にあり、そのうち8/8に Poppin'Party が出演するということで見てきた。

www.tv-asahi.co.jp

当日は関東に台風が接近し、開催がギリギリまで危ぶまれていたけど無事開催できて本当によかった。Poppin'Party のライブでは久々のオルスタらしいオルスタで間近な距離感の中、曲数的にも充実感がある楽しいライブだった。

続きを読む

体重を計り始めた

最近同僚から Withings のハイテク体重計を譲り受けた。何がハイテクかというと、体重や体脂肪率、脈拍などを自動的にサーバーに送信して、スマホアプリからそれらのスタッツの変化を確認することができる。

あと IFTTT にも対応してるので、(体重だけになってしまうけど) iOS のヘルスケアアプリに結果を流し込むこともできる。専ら関心があるのは体重なので普段はこっちで見ている。

一人暮らしをして4年ちょっとになるけど、これまでは体重計を持ってなかったから体重といえば銭湯か健康診断でたまに計ってふーん、となるだけだった。今回体重計を手に入れたことで日々の体重の変化を追跡できるようになった。何しろズボラなので自分の体重がどう変化しているかなんて覚えられないし能動的に記録する気もないのだけど、これなら寝る前に体重計に乗るだけで勝手にアプリに記録されていくので助かっている。

それにしても、思ったより体脂肪率が低かったりそもそも体重もちょっと軽かったので、これはどうしたものかという感じもある。これ以上体重が減っても全く嬉しくないし、さりとて贅肉で増えてもそれはそれで嬉しくない。筋肉で増量できると一番幸せなのだけど、今の所特に努力するつもりもないので自然に身を任せて体重の変化を見守っていきたい。

29歳

なった。前日まで海外(上海)に遊びに行っており、帰りの飛行機が遅延した結果家へ帰る阪急電車の中で7/23を迎えることになった。

去年はこれ。

astj.hatenablog.com

所感は去年と似ている気がするけれど、なんとなく1年(特に後半)で仕事で考えることの目線が少し変わったような、別にそうでもないような……という感じはしている。まあ働き出して5年目ともなればそういうこともあるだろう。オタクとしては年々極まってきている自覚があり、身を壊さない程度に遊んでいきたいですね、と思っている。あと楽器を弾く機会になんだかんだと恵まれたし、どうやら29歳も恵まれそうである。

そうそう、その上海にいる間に向こうの人に「学生ですか?」とか「学生さんだと思った」と言われる機会があり、若く見られて喜ぶという訳でもなく、年相応というか経歴相応の社会性がないのだなということを思ったりした……

泣いても笑っても二十代最後の1年なので遊んで駆け抜けようと思います。

docker-compose で - や _ で始まるプロジェクト名を使ってはいけない

こういうなんでもないプロジェクトがあったとする。

[astj@gemmy01 /Users/astj/sandbox/myproject]$ cat Dockerfile
FROM debian:8
[astj@gemmy01 /Users/astj/sandbox/myproject]$ cat docker-compose.yml
version: "3"

services:
  debian:
    build:
      context: .
      dockerfile: Dockerfile
[astj@gemmy01 /Users/astj/sandbox/myproject]$ docker-compose build
Building debian
Step 1/1 : FROM debian:8
 ---> ce40fb3adcc6
Successfully built ce40fb3adcc6
Successfully tagged myproject_debian:latest

ここで docker-compose のプロジェクト名を - や _ で始まるものにすると、直感的じゃないエラーメッセージを吐いて失敗する。

[astj@gemmy01 /Users/astj/sandbox/myproject]$ docker-compose -p -myproject build
Building debian
ERROR: invalid reference format
[astj@gemmy01 /Users/astj/sandbox/myproject]$ docker-compose -p _myproject build
Building debian
ERROR: invalid reference format

verbose オプションをつけて辿ると、 Docker API から 500 が帰ってきていることが分かる。そうだよねという感じ。

[astj@gemmy01 /Users/astj/sandbox/myproject]$ docker-compose -p -myproject --verbose build
compose.config.config.find: Using configuration files: ./docker-compose.yml
docker.utils.config.find_config_file: Trying paths: ['/Users/astj/.docker/config.json', '/Users/astj/.dockercfg']
docker.utils.config.find_config_file: Found file at path: /Users/astj/.docker/config.json
docker.auth.load_config: Found 'auths' section
(snip)
docker.auth.load_config: Found 'credsStore' section
urllib3.connectionpool._make_request: http://localhost:None "GET /v1.25/version HTTP/1.1" 200 566
compose.cli.command.get_client: docker-compose version 1.21.1, build 5a3f1a3
docker-py version: 3.3.0
CPython version: 3.6.4
OpenSSL version: OpenSSL 1.0.2o  27 Mar 2018
compose.cli.command.get_client: Docker base_url: http+docker://localhost
compose.cli.command.get_client: Docker version: Platform={'Name': ''}, Components=[{'Name': 'Engine', 'Version': '18.03.1-ce', 'Details': {'ApiVersion': '1.37', 'Arch': 'amd64', 'BuildTime': '2018-04-26T07:22:38.000000000+00:00', 'Experimental': 'true', 'GitCommit': '9ee9f40', 'GoVersion': 'go1.9.5', 'KernelVersion': '4.9.87-linuxkit-aufs', 'MinAPIVersion': '1.12', 'Os': 'linux'}}], Version=18.03.1-ce, ApiVersion=1.37, MinAPIVersion=1.12, GitCommit=9ee9f40, GoVersion=go1.9.5, Os=linux, Arch=amd64, KernelVersion=4.9.87-linuxkit-aufs, Experimental=True, BuildTime=2018-04-26T07:22:38.000000000+00:00
compose.cli.verbose_proxy.proxy_callable: docker inspect_network <- ('myproject_default')
urllib3.connectionpool._make_request: http://localhost:None "GET /v1.25/networks/myproject_default HTTP/1.1" 404 50
compose.service.build: Building debian
compose.cli.verbose_proxy.proxy_callable: docker build <- (path='/Users/astj/sandbox/myproject', tag='-myproject_debian', rm=True, forcerm=False, pull=False, nocache=False, dockerfile='Dockerfile', cache_from=None, labels=None, buildargs={}, network_mode=None, target=None, shmsize=None, extra_hosts=None, container_limits={'memory': None}, gzip=False, isolation=None, platform=None)
docker.api.build._set_auth_headers: Looking for auth config
(snip)
urllib3.connectionpool._make_request: http://localhost:None "POST /v1.25/build?t=-myproject_debian&q=False&nocache=False&rm=True&forcerm=False&pull=False&dockerfile=Dockerfile HTTP/1.1" 500 39
compose.cli.verbose_proxy.proxy_callable: docker build -> <generator object APIClient._stream_helper at 0x1049ba570>
ERROR: compose.cli.errors.log_api_error: invalid reference format

明示的にこういうプロジェクト名をつけることはないと思うけど、 docker-compose のプロジェクト名のデフォルトはカレントディレクトリの basename から決まるので、例えばディレクトリ名が - で始まる場合も同じ状況になる。

[astj@gemmy01 /Users/astj/sandbox/-myproject]$ docker-compose build
Building debian
ERROR: invalid reference format

(逆に、この場合でも安全なプロジェクト名を明示的に渡せばきちんと動く。)

[astj@gemmy01 /Users/astj/sandbox/-myproject]$ docker-compose -p mymyproject build
Building debian
Step 1/1 : FROM debian:8
 ---> ce40fb3adcc6
Successfully built ce40fb3adcc6
Successfully tagged mymyproject_debian:latest

ディレクトリ名が - で始まることも普段そうそうないような気がするが、たとえば Jenkins ではビルドプロジェクトの名前に - が入っていると、 truncate された結果こういうディレクトリが出現することがある。。以下のディレクトリは、Hoge-Foobar プロジェクトの様子である。つまり今回ハマった実例……

drwxr-xr-x 14 jenkins jenkins 4096 Jun 14 00:22 -Foobar_better_dockerfile-7R67AOHUZ25GOP2ZOFPGO2JCU7R5KFETCWFFHQJGSXNWUUACIIAA

原因が分かってしまえば納得感があるのだけれど、エラーメッセージがわかりにくいし、 docker-compose がバリデーションしてくれる訳でもないし、さらにカレントディレクトリが暗黙に使われていると非常に気付きづらい。気をつけましょう。。