Slack Events API + GASで簡易的にGitHubのアクティビティを見てみる
この記事は Ubiregi Advent Calendar 2020 21日目のエントリです。
本日は、GitHub上のアクティビティを監視・集計する方法としてこんなやり方もできる、という小ネタをご紹介。
Pull Request(以下、PR)やIssueの状況をウォッチするために、GitHubのSlack Appを連携させて使っている人も多いだろう。
対象のリポジトリや項目をスラッシュコマンドで設定すれば、それぞれのアクティビティがSlack上に流れてくるというもの。
これはつまり、GitHub上のアクティビティをSlackのチャンネル投稿イベントとしてSlack Events APIで扱うことができるということでもある。
GitHub連携をしているSlackチャンネルの投稿を監視するだけで、マージ待ちのPRをリスト化したり、PRのopenからcloseまでの時間を計測したりといったことが簡易的ながら可能になる。
そんなことしなくても普通にGitHub webhooks使えばいいじゃん、と言われればまったくその通り。
そこが小ネタたる所以である。
とはいえ、Slack Events APIをすでに使い慣れている場合はもちろんのこと、
といった特徴があるので、こちらの方が使いやすい場面ももしかしたらあるかもしれない。
ここでは、GASでSlack上のGitHub通知の内容を取得できるようにするまでの流れと、取得した情報のどこに何が入っているかまでを紹介する。
GASプロジェクトの準備
Slack Appの実装にここではGoogle Apps Script(以下、GAS)を使用する。
GASを選択するメリットとして次のようなものが挙げられる。
- Googleアカウントがあればすぐに使い始められる
- 実行回数が無制限
- 1回あたりの実行時間には6分までという制限があるが、Slackの投稿イベントで飛んでくるjsonはとても小さいので、よほど複雑で重たい集計をしようとしない限りは収まるはず
- スプレッドシートなど他のGoogleサービスとの連携が容易
- 集計結果をそのまま共有可能な形にしたり、スプレッドシートの数式も組み合わせて集計自体を楽にすることもできる
※V8ランタイム登場前に書いた少し古いコードであること、元々jsが専門外であることなどから、洗練されたコードにはなっていない点は何卒ご容赦いただきたい。
プロジェクトの作成
GASのホームから「新しいプロジェクト」を押して新規のGASプロジェクトを作成する。
スプレッドシートと組み合わせて使うことが決まっていれば、まずスプレッドシートを作成して ツール>スクリプトエディタ
と進んでシートに紐づいたプロジェクトとして作成してもいい。
URL確認イベントへの対応
このプロジェクトでSlackからのイベント通知を扱っていくわけだが、イベント通知の送信先URLを設定すると同時にURLの確認イベントが飛んでくる。
中身を実装する前に、まずその対応を先に入れておくと設定がスムーズである。
GASでは doPost()
という名前の関数を実装しておくと、WebアプリとしてデプロイしたときのPOSTリクエストの受け口になる。
こんな感じで、url_verification
イベントが飛んできたらその中に含まれるchallenge
というフィールドの値をそのまま返すようにする。
function doPost(e) { if (e.postData == "FileUpload") { var contents = JSON.parse(e.postData.contents); var type = contents.type; //URL確認 if (type == "url_verification") { return ContentService.createTextOutput(JSON.stringify(contents.challenge)).setMimeType(ContentService.MimeType.TEXT); } } }
ここまででいったん、右上の デプロイ>新しいデプロイ
から、現在の状態をWebアプリとしてデプロイする。
ここで「アクセスできるユーザー」は「全員」になっている必要がある。
一度デプロイすると、 デプロイ>デプロイを管理
からURLが取得できるようになる。
Slack Appの準備
Slack Events APIのイベントを受け取るにはSlack Appを作成することになる。
ここでは今回やること向けに特化したポイントに絞って説明していくので、Slack App自体のセットアップ方法などについては別途ドキュメントを参照されたい。
Enabling interactions with bots | Slack
スコープの設定
作成したSlack AppのOAuth & Permissionsのメニューからスコープを設定する。
投稿イベントの取得自体は、Bot Tokenのチャンネル投稿の読み取り権限 channels:history
さえあれば動作する。
集計結果を投稿させたい場合などは書き込み権限 chat:write
も必要になる。
User Tokenはここでは使用しない。
イベントへの登録
Event Subscriptionsのメニューから Enable Events
のスイッチをOnにし、受け取るイベントを設定する。
前述の通りチャンネル投稿を見たいだけなので、Bot User Eventsの message.channels
を選べばOK。
channels:history
スコープが必要なことはここで言われるので、こちらを先に設定しても良い。
イベントの通知先URLの設定
同じくEvent Subscriptionsのメニューで、イベントの通知先URLを設定する。
Request URL
の欄に先ほど作ったGASプロジェクトのURLを貼り付ける。
先ほど作っておいたURL確認の実装が正しければ、すぐに確認が完了し Verified
というラベルと緑色のチェックマークがつく。
これで、Slackからチャンネル投稿を受け取る準備ができた。
GitHub通知の投稿内容の取得
message.channels
イベントで飛んでくるjsonの中身はこのようになっている。
ここから event
要素を取り出して見れば良いのだが、全てのチャンネルに投稿があるたびにこの関数が呼び出されることになるので、まず扱うケースを適切に絞り込んでいく必要がある。
チャンネルIDが監視したいチャンネルでない・発言者がGitHub Appではない投稿は全て除外してしまおう。
function doPost(e) { if (e.postData == "FileUpload") { var contents = JSON.parse(e.postData.contents); var type = contents.type; //URL確認 if (type == "url_verification") { return ContentService.createTextOutput(JSON.stringify(contents.challenge)).setMimeType(ContentService.MimeType.TEXT); } else if (type == "event_callback") { var event = contents.event; var event_type = event.type; if (event_type == "message") { var user = event.user; //投稿したユーザーID var channel = event.channel; //投稿があったチャンネルID if(channel == <監視したいチャンネルID> && user == <GitHub AppのユーザーID>){ //投稿内容を取得 var attachment = event.attachments[0]; } //それ以外は何もしない return null; } } } }
GitHub Appの投稿から情報を取得する際にわかりにくいのが、内容が全て attachments
扱いであるという点。
attachments
は配列として返されるので、内容にアクセスする前にまず配列として取得してから1つ目の要素を取り出す必要がある。
Pull request opened by hogehoge
のメッセージなどいかにも本文、 text
であるように見えるのに、実際は attachments
の中の pretext
要素である。
attachments
要素のフィールド一覧は公式ドキュメントの以下のセクションで見ることができる。
Creating rich message layouts | Slack
GitHubの通知の項目はそれぞれ以下のフィールドに格納されている。
項目 | attachments内のフィールド名 |
---|---|
本文(Pull request opened by hogehoge など) |
pretext |
PRやIssueのauthor名 | author_name |
PRやIssueのタイトル | title |
PRやIssueへのリンク | title_link |
PRやIssueの本文 | text |
リポジトリ名 | footer |
イベントが作成された日時のタイムスタンプ | ts |
さらに、タイトルについては #id タイトル
の形式にまとめられているので、少し乱暴だが
var title = attachment.title; var id = title.match(/[0-9\s+]/g).join(''); id = id.split(' ')[0];
こんなことをやると、PRやIssueのIDだけを取り出すことも可能になる。
ステータスについては pretext
に opened
、merged
、closed
などの単語が含まれているかどうか、で簡易的に判別が可能である。
全てのイベントは日時も一緒にわかっているので(タイムスタンプからの変換は必要だが)、これらの項目を使った集計となるとけっこういろんなことができる。
集計以外にも、例えばPRがマージされたらデプロイ手順を投稿する、といった使い方もできる。
簡易的に、を繰り返しているのはこれらの仕様は変わる可能性があるためである。
Slack向けGitHub Appのソースコードは以下で公開されているので、「なんか挙動変わったかな」と思ったら覗いてみると良いかもしれない。
(この記事は過去の実装経験に加え現時点でのGitHub Appのコードもざっと確認した上で書いている。が、もし見落としがあればご容赦願いたい)
https://github.com/integrations/slack
応用例についてはまた機会があれば触れる……かもしれない。
iOSDC 2020感想!
めちゃくちゃお久しぶりです。
半年ぶりくらいだろうか、生きてます。
始めてすぐから月に1回くらいしか書いていなかったが、まあ見事にサボっている。
ところで、このブログを始めたときのご挨拶が以下の記事。
そう、iOSDC。
iOSDC!!(大声)
さすがにこれは何か書かないと、このブログを作った意味がないと言っても過言ではない。
特に印象に残ったトークのピックアップとその一言感想まとめを並べるくらいしかできなさそうだが、最初のハードルを下げておかないとほんとうにやらない人間なので、とにかくやってみることにする。
前提:iOSDCとわたし
- iOSDCには2017年から参加しており、今回が4回目
- いずれも、参加形態はトークを伴わない一般参加枠
- iOSDC中、よくランチについて大騒ぎしている食い意地の塊がわたし
#iosdc 言う機会逃してましたが毎日提供されるお昼ごはんがすっっっっっごく美味しかったんですよ去年に引き続き カンファレンス体験としては地味に重要なところなのではないでしょうか……!おいしいごはん、だいじ。
— Y.Grace (@y_01011001) 2018年9月2日
お昼休みが終わる前に食い意地の張った疑問を放流しますけど、お弁当どれ選んでも必ず入ってる赤紫色の天ぷらみたいなやつって何者でしょうね……?昨日は部屋が暗いから分からないとおもってたけど、今日明るい部屋で改めて見ても何だか分からなかった……気になって夜しか眠れない #iosdc
— Y.Grace (@y_01011001) 2019年9月7日
前夜祭
- オーディオの処理に明るくなくとも聞きやすいと感じるわかりやすさ
- 某広告SDKで、広告のAVSessionを取り出して設定をしておかないと(それ自体は音声を扱わないアプリであっても)裏で再生中の音楽が動画広告に止められてしまう、などというアクシデントを経験したりもしたので、この辺りは自分が直接音声を扱わなくても知っておくに越したことはないなと思った
- ハードウェア側の知識がさっぱりぽんなのでハードルを感じていたHome Kitだったが、案外何とかできそう、やってみたいかも、という気持ちになれた
- 最近、家電の制御をちょいちょい自動化したり音声入力対応しているチームメイトがちらほら居るので、少し気になってきているところ
1日目
- RxSwiftがいまいちあたまに入らず、まあ3rd partyだし無理に入れなくても……と言い訳して避けてきた身で、Combineこそは向き合わねばならないと思いつつ全然向き合えていなかったので、ここまで詳しい解説に出会えたのは幸いだった
- タイムシフト期間中にもう少し見返して、理解を深めたいところ
- もう1年経つのか……確かにそろそろやらなきゃか……という気持ちに実際なったので、このタイトルすごいと感じた
- 設計に関しての意識が弱いまんま生きてきてしまったわたしが、今頃になってようやく学んでいるのがまさにこういう話で、今聞けてとてもありがたかった
- 勉強になった、とだけ言ってしまうと月並みなので、何だろうな……漠然としていた疑問から、もう少し具体的に考えていけそうなきっかけをもらえた気がする
- 処理の流れを一方向にする、という話についてはここ↓などでも読んでいて、改めてこれが肝の一つなのだなと実感した
Clean architecture for iOS (VIPER/VIP) | by Saad El Oulladi | Medium
- 今の会社に移って初めてiPadを扱うことになったわたしが最初に取り組んだのがマルチタスク(Slide OverやSplit View)対応だったが、複数ウィンドウ対応については見送っていて知識が少ないところだったので興味深く聞いていた
- SceneDelegate対応……しないとな……
- iOS 12は年末頃には切れそうかなー
2日目
- Storyboardの分割ってRefactorメニューからできたんだ……というのを初めて知った。今までコピペしてた……
- 特定のOSバージョンだけ表示する画面の分け方など、コード側でif availableを書きまくるしかないとばかり思っていたので、なるほど……!と言いまくっていた
- 現代のプログラミング教育必須化には懐疑的な立場なのだが、こういうことを教われる場があるのはいいな〜〜〜と思えた、ほんとうに大切なこと
- 初回審査のリジェクト0という成果が半端ない
全体
- オンライン開催ゆえ、遅刻しても最初から聴けるし、同時刻の別トラックのトークもその日のうちに聴けるのはありがたかった
- Today's updateとかで長谷川さんが画面に登場するのすごくよかった、後述の通り寂しかったので……
- コメント欄にさりげなくご本人が降臨してたりするのがちょっと面白かったが、さっと質疑応答できてたところなど見ると事前収録なのはよかったのだろうなと思った
- LTがちょっと大変そうだった、Zoom越し(だっけ)のLiveとなると自分の音声がどう聞こえているかとかチェック難しいよね
- オーディオ勢の音声が安定しているのはさすがと思ったが、それ以外のスピーカーさんもほとんど音声クリアですごいと思った
個人的反省
- オンライン開催だからって油断していたらチケットを買うのが遅れてしまった……気がついたときにはすでにノベルティボックス終了、無念……
- ニコニコ動画とかログインしたのが10年以上ぶりで、そもそも使い方ろくに知らないので右も左もわからなかった……もうちょっと予習しておくんだった
- 「あれ、居たの?見かけなかったけど」と思ってくださった方もいるかもしれない。家の用事が重なったり、具合が悪くてちょっと寝たりで絶妙に時間が合わなくて、ほとんどのトークを追っかけ再生で見ることになり、コメントはできないわDiscordも間に合わないわ、時間ずれちゃってるから実況ツイも全くできないわで、けっこう寂しいことになってしまった
- 反省の反省なのだが、時間外だからと諦めきってDiscordは覗きもしなかったのだが、雑談chならもしかしたら誰か居たかもしれない……覗いてみればよかった
余談:個人的進歩
- 「サンプルコードが……読める……読めるぞ……!」
- やっとSwiftにも目が慣れてきたので、今年はみなさんのサンプルコードをスッと読めるようになった。やったね。
総合的な感想としては「よかったけど、来年はオフラインがいい」かなーという気持ち。
来年はわいわいお話できたらいいな。
お疲れ様でした!
45cm水槽に引越し
今年の目標の一つであった水槽のサイズアップが無事に完了してしばらく経ったので、記録を残しておく。
どう変わったか
水槽
27cmキューブ オールガラス水槽 アクロ27
→ 45cmフレーム水槽 プログレ450
水量にして約15L→約37L
旧環境に言及したことがなかったが、27cmキューブという小型も小型の水槽であった。
30cmキューブではでかすぎる気がして、かと言って25cmキューブでは心許なくて選んだサイズだった。
20kgくらいだからギリギリ……とメタルラックにおそるおそるハードウレタンを敷いてこの27cmキューブを置いていた。
そんな自己責任アクアリウムからもついに卒業である。
とはいえ最初に覚える水槽としてはちょうど良いサイズ感だったかもしれないとも思うし、トリートメント水槽として今後も使うことになりそう。
実に約2.5倍のサイズアップになった。
この大きさでフレームレスは怖いなと感じたので、枠付きのプログレを選択した。
使えなくなったり使いにくくなった機材もあるにはあるが、基本的には安定感があって安心できる印象。
水槽台はGEXの2段式のものを使用。
下段にはいまのところ予備のプラケースやバケツなどを置いているが、こちらも45cm水槽一式を置けるつくりになっているので、稚魚などのプラケースなどはここに置けそう。
現環境で一つ心配なのが水位。
旧環境では濾過が水作エイトのみで、水位はヒーターさえ浸かっていればOKだったので、地震に備えて水位を上から5cm以下に抑えた結果だいたい15Lだったのだが、今回は上部フィルターの都合でかなりギリギリまで水を入れないといけなくなり、約37Lが死守ラインになってしまった。
この線の上まで水を入れてください!を厳守するとフレームの上から3cmくらいしかない。
地震が来たときに溢れないか、夏場に冷却ファンを回したらあっという間に最低水位線を下回らないか、色々不安である。
これでも従来品よりも水中モーターの位置を下げたと書いてあったので、以前は本当にスレスレだったのかもしれない。
濾過
水作エイトS
→スーパーターボトリプルボックス450+ボトムボックス450
水作エイトにはずいぶん世話になったのだが、45cm水槽でMを使うかというと……現物の大きさを見るとやっぱやめようという気持ちになった。
検討の結果、上部+底面の組み合わせにした。
外部は私のようなうっかり屋が使うとメンテのたびに外し方を間違えて床を水浸しにすると思ったので避けた。
プロホースを使った底砂の掃除はけっこう好きな方でサボらない自信があったので、底面フィルターを採用してみた。
上部フィルターとの組み合わせなので、エアーポンプは使わず水中モーターのみ。
エアーポンプを動かさないのは外掛けフィルターを使っていたとき以来だが、やはり静か……。
置き場所が旧環境よりも枕元から離れたのもあり、モーター音はほぼ気にならず、水の流れる音が聞こえる程度。
(旧環境で使っていたエアーポンプは水作の水心で、エアーポンプとしてはかなり静かなものではあるのだが、やはりないと違う)
ちなみにこの組み合わせで繋ぐのであればボトムボックス用接続パーツは不要だったのだが、要ると思って買ってしまった……。
ヒーター
温度固定式55W
→GEX ヒートナビ 120
買い替えついでに、温度可変式にしてみた。
稚魚水槽で温度可変式を使っていて、水中モーターや気温の変動など水温に影響する外部要因があるときに調整ができるのが便利だと感じたので。
温度可変式だとONになっているときにランプが点くものが多いので動作状況が見えやすいというのもある。
縦でも横でも置けるのが地味に便利。
25℃に設定して、25.5℃あたりにキープしてくれている。
照明
ニッソー スマートタッチ
→フラットLED SS 4052
これはプログレのセットに入っていたのをそのまま使っている。
防滴仕様でないので水槽に蓋をした状態でないと危ないため、蓋を開けるたびに濡れない場所にどかさないといけないのが少々面倒ではあるが、軽さと明るさと色味は好き。
楊貴妃のオレンジがとても綺麗に見える。
底砂
水作のメダカ飼育基本6点セットに付属していた砂利
→水作 珪砂
これには色々あって、ほんとうは同じものを買ったつもりだった。
たぶん商品としては同じもののモデルチェンジの境目を跨いだのではないかという気がする。
というのも、水作のメダカ飼育基本6点セットの箱での底砂の表記が「底砂(珪砂)」となっていて、某通販で水作の「珪砂」という商品を見るとまさにそれと同じ姿をしていたので、同じものを買い足すつもりで買った。
すると届いたのは水作の珪砂という名の、まったく特性の異なる砂であった。
いま水作のホームページを見にいけば珪砂という名で載っているのはこの砂なので、某通販が入れ間違えたのでもない。
おそらく昔は珪砂という名前で砂利を販売していたのが現在の砂にモデルチェンジして、私が買ったメダカ飼育基本6点セットに入っていたのは旧モデルの砂利の生き残りだったのではないかと勝手に推測している。
想定より細かい砂が来てしまったので、ボトムボックスには百均の洗濯ネットを被せて使っていて、いまのところ詰まった様子はない。
とはいえ、明るい色のとても綺麗な砂なので、これはこれで良かったと思う。
水草
小さなマツモ数本
→ すごく立派なマツモ大量、アヌビアスナナ付き流木
水草はいずれもアクアフォレストで購入。
アヌビアスナナは水槽を大きくするなら入れてみたいとかねがね思っていた。
流木付きなので置くだけでかんたん、かわいい。
基本的にはマツモ中心にしておこうと思っていたので、お店で元気よく
「(^o^)マツモ5本クダサーイ!」
と叫んだところ1本の大きさを勘違いしていて、マツモのおばけみたいなのが5房きた。
あっという間にマツモの森ができあがった。
水草専門店のマツモを完全にナメていた。
少し多すぎだろうかと心配したのだが、いまのところ夜間に酸素が不足する様子もなく、むしろいじめっ子に追いかけ回された子がスッと隠れるなどして逃げ切ることができていたり、時折葉の間で休んでいたりと、マツモの森の居心地はそう悪くないようだ。
おまけに硝酸塩をガンガン吸ってくれているようで、増加ペースはかなり緩やか。
あるのとないのとでは大違いだと思った。
ただしすごい勢いで伸びるので、週に1回はトリミングしないとえらいことになる。
作業期間
セットから引っ越しまでおよそ7日間。
置き場所を変えたので、置き換えではなく予めセットしておいてそこに移すという通常の引越し。
まずキッズに先に移動してもらい、1日様子を見て問題ないことを確認してからおとなたちも移動、と引越しには2日をかけた。
なかなかの強行日程だったとはおもうが、現環境にすぐに慣れてくれたようで、各自のんびり過ごしている。
所感
水槽台を置くために大きな古い本棚を撤去する必要があったり、なかなか大掛かりな移行作業だった。
セットこそ大変だったが、水量が多い方が水質の変化が緩やかというのは言われている通りの印象。
何よりめだかたちが心なしか以前より伸び伸び暮らせていそうなのが嬉しい。
広さに余裕ができたところで新しい子をお迎えしたい気持ちになってくるが、それが叶うのはいつになるだろうか……。
繁殖ふりかえり
卵の状態で年を越して1月上旬に孵った稚魚たちが、先日ようやく親水槽に合流を果たした。
めだかを飼い始めて最初の繁殖はこれでひと段落したと言って良さそうなので、少しはエンジニアらしく、KPTの形で振り返ってみる。
(iOS話もしたためてはいるのだがなかなかまとまらなくて……)
Keep
ゾウリムシ
これは非常に万能で役に立った。
スポイトで水槽に適量放り込んでおくだけで良く、粉のえさのようにあげ過ぎを気にすることもない(もちろん限度はある)。
これのおかげで、日中えさをあげられない我が家でも多くの針子たちが生き延びてくれた。
稚魚の他にも、ボスめだかにえさを独占されてお腹を空かせていた大人のめだかにこっそり食べてもらうものとしても役立った。
米の研ぎ汁だけで簡単に殖やせて維持も簡単なので、育てておいて損はない。
猛烈に臭いという痛い欠点はあるが、口の狭い容器にそっと蓋を置いておくくらいなら部屋に置いていてもそれほど気にならなかった。
与えるときにはどうしても臭うのでそのときは仕方ない、むせる。
培養容器はペットボトルのほかに、チャームで水草ポットとして売られていたパスタ入れのような容器も使っている。
この容器は円筒形をしているぶんペットボトルよりも足し水がし易く、けっこう扱いやすい。
メダカバイコム
バイコムシリーズのメダカ向けモデル。
今回稚魚水槽で初めて使ったのだが、キャップで測って入れるだけのこいつは非常に使いやすく、効果も実感できた。
稼働後間もないスポンジフィルターとバイオろ材をセットしたばかりのスペースパワーフィットプラスを併用した環境に投入したところ、数日で亜硝酸が出なくなり、硝酸塩の増加もかなり緩やかで、減ったぶんの足し水と掃除のみで基本的に水換えは不要の環境ができた。
(稚魚6匹に対して約7Lのプラケースを用いたので水量の余裕も関係あったとは思う)
毛糸の産卵床
市販のスポンジ製の産卵床をなかなか使ってくれず、結局そのへんに落として「卵?どっかやっちゃったー」とお母さんめだかが言うので、茶色の毛糸を使って自作してみた。
目指したのはホテイアオイの根である。
ちょっと長すぎて存在感がありすぎたのだが、ちゃんと使ってくれた。
これを使い始めてからやっと採卵できるようになった。
この色は使わないなあと余らせていた糸だったので、使い道が見つかってありがたい。
でかいスポイト
GEXから出ている、めだかの稚魚育成用にという触れ込みのでかいスポイト。
ほんとうにでかいのでけっこう扱いは難しいのだが、卵をそーっと移動したりするにはこのくらいの太さが良い。
また水槽の底掃除に大変便利な大きさだった。
便利なのだが扱いはほんとうに難しい。
吸い込んだあと先の方からどうしても少しこぼすので、卵を運ぶときは吸い込んだらすぐに反対側の手で先を塞ぐようにして持つことでなんとかした。
卵だからそうしたが、ゴミを捨てるときにはあまりやりたくないものである……。
Problem
投げ込み式フィルター
わかってた……わかってたはずなのだ、稚魚に投げ込み式はいかんというのは。
最初に使っていたプラケースは深さが足りず、手持ちのスポンジフィルターが設置できなかった。
まだ針子と言えば針子だが隙間に対してギリギリくらいの大きさにはなっているから、水作エイトコアミニくらいなら大丈夫だろう!と油断した。
エアレーションもしていたから、そのエアストーンがぶくぶくに変わるだけで問題ないと思っていたのだ。
大問題だった。
せっかくゾウリムシのおかげで生き延びていた針子たちの半数近くが吸い込まれて亡くなった。
申し訳ないことをしてしまった……。
Try
最初から大きなプラケースで孵化させる
もうこうして言葉にしてしまうと当然なのだが、最初からスポンジフィルターを設置できる大きさのプラケースを用いるべき。
ただ無精卵でないかどうか・発眼しているかどうか見極めるには小さい容器が見やすかったので、採卵したらまず見やすい容器に取り分けて数日観察した後、発眼を確認できたらスポンジフィルターを稼働させたプラケースにでかいスポイトでそーっと移動するのが良さそうだと思った。
一番やらかしたのはとにかくフィルター吸い込み事件だったと思う……
それでもなんとか6匹の稚魚が幼魚まで育ってくれている。
大変ではあったがやはりこれも醍醐味だよなあと実感したので、殖やしていきたいと思ったし、今後めだか以外の魚も飼うとしたら水槽で繁殖できる種類を選ぶと思う。
それには現在の27cmキューブ水槽では小さすぎるので、今年の目標は実に『45cm水槽立ち上げ』である。
現在絶賛準備中。
地震にビビる。水位と蓋は大事
久々の緊急地震速報で飛び起きた。
めだかたちを家に迎えてから初めて震度3級の地震を経験したが、なかなかに怖かった。
真っ先にやばいとおもったのがベビー水槽。
昔使っていたプラケースを引っ張り出してきて使っていたもので、蓋がなかった。
おまけに前の晩の水換え時に少し水を多く入れすぎ、蓋がないからじきに蒸発するだろうとそのまま寝たらおもいっきりフラグであった。
飛び起きてすぐに手で押さえて揺れの影響を軽減させようとしたが、次第に揺れが大きくなってきたので棚から離す必要があるとおもい、持ち上げたまま頑張って静止するように努めてなんとか凌げた。
咄嗟に持ち上げられたのは3.5Lのプラケースならではであったとおもう。
それで手が塞がってしまったのでおとな水槽には何もできず、不安の中見守っていたが、もともと水位を少し浅めにしていて上から5cm以上の余裕があったおかげか、幸い蓋の隙間から溢れるようなことはなかった。
外掛けフィルターを使用していた頃は上から2〜3cmくらいまで水が入っていたので、その状態だったらどうなっていたか……。
めだかたちは少々パニックだったが、水面よりも底の方が揺れないことに早々に気付いてサッと土管の中に隠れる子も居た。賢い。
現在7匹居るベビーはそろそろベビーというよりはキッズの大きさになってきて、倍のサイズのプラケースに引っ越しを考えて立ち上げている途中だった。
そんなわけで手が塞がっていたのでその立ち上げ途中のキッズ水槽も見守ることしかできなかったのだが、そちらも水位には余裕を持たせてあったので溢れることはなかった。
が、やはり蓋はあるに越したことはないので自作したほうがいいかもしれない。
一方おとな水槽も、ガラス蓋があるとはいえ、上部フィルターや外掛けフィルターを使用しない状態ではガラス蓋は隙間が多すぎると今回改めて感じたので、別の蓋のほうがいいのかもしれない。
蓋自作の機運高まる……?
水槽立ち上げまでの道のり
水槽を始めたのはごく最近で、前職を辞めて有給消化に入ってからのこと。
辞め側の一番しんどかった時期に、帰宅後なぜか「熱帯魚 飼い方」でググったまま寝落ちていたことが何度もあった。
まったく脈絡のないことでなぜそんなことをしていたのか自分でも謎なのだが、子供の頃から水族館が大好きだった私が極限の状態で求めた癒しがお魚ということだと捉え、ググって寝落ちた検索結果を片っ端から眺めるうちに改良めだかに興味を持ち、有給消化に入ると同時に最初のめだか水槽を始めた。
一度のリセットを経て現在は楊貴妃4匹、幹之1匹の計5匹と、年明けに生まれたばかりのベビーたちと暮らしている。
12月の親水槽。楊貴妃たちが合流して間もない頃
しれっと書いたが最初に作った水槽は様々な失敗を重ね、おむかえした6匹全員を失い、1ヶ月足らずでリセットする羽目になった。
外掛けフィルターを訳もわからずそのまま使ったり、底砂掃除の正しいやりかたも弁えていないのに底砂を厚く敷いたり、水面にえさを大量にぶちまけてしまったのに換水の対処が遅れたり……失敗が山盛りであったと反省しているが、そのうえさらに不運も重なった。
おむかえした子の中に元々尾腐れ病と水カビ病の初期症状を併発していた子が居たり(初日に気付けず、後日これはもしや?となったときに初日に撮った写真を見返したら最初からだった)、さらに水草には貝、極め付けにミズメイガの幼虫までついてくるという不運ぶり。
水草は水道水でジャブジャブ濯いではあったが、そんなものでは足りないことも知らず……。
不自然にスパッと切れたアナカリスの葉をあちこちで見かけては不思議におもいながら過ごし、やがて誰も居なくなった水槽を洗おうと覗き込んだら羽化したてのミズメイガと目が合って絶叫したものだった。
めだかたちを死なせてしまったのは完全に自分の責任ではあるものの、病気の子が紛れていたのは事実なので、なんとなく通販で生体を買うのはやめておこうかな……という気持ちに。
あとアナカリス。蛾はつらい。
第2陣は地元のホームセンターから楊貴妃1ペア、幹之1ペアをおむかえ。
輸送時間が短ければ負担も少ないはず、と踏んだからだったが、また気合いが色々と空回りして、トリートメント水槽で様子を見ていた僅か1週間の間に実に4匹のうち3匹が☆に。
その中にはものすごく美人の楊貴妃♀も居り、気に入っていたのでかなり凹んだ。
唯一生き延びたヒレ長気味の幹之♂はよほど丈夫らしい。
最初は水面からえさを食べられず水中に落としてやる必要があったが、他の子が居なくなってひとりになるとふつうに水面から食べられるようになった。
それからはよく食べるし好き嫌いもしない。
その横でメイン水槽を作り直した。
フィルターは素直に投げ込み式にして、水草を植えないので底砂は掃除のしやすさのために浅めに敷いた。
実際に底砂掃除をしてみると掃除がしやすく、この方法は自分には合っていたと思う。
投げ込み式にした理由は、せっかくバクテリアが住み着いたかもしれないろ材を2〜3週間に一度のペースでまるごと捨ててしまう外掛けは初心者にとって扱いが難しいのでは?と感じたため。
写真にも写っている通り、水草はマツモにした。
アナカリスはちょっとトラウマである。
少しの間、幹之くんは水槽を広々と使って一人暮らしを謳歌することに。
第3陣は新宿のアクアフォレストから楊貴妃2ペアをおむかえ。
この子たちは実に丈夫で、トリートメント水槽に来た初日こそ落ち着かなさそうにしていたものの、2日目以降はえさはよく食べるしフンの状態も良く、病気もしたことがない。
問題なさそうだったので2週間ほどでメイン水槽に合流。
うち1匹は間もなくお母さんにもなった。
父親は幹之ではないかと見ているがまだ子供に特徴が出ていないので定かでない。
ただ彼らは仲はあまり良くないようで、しょっちゅう喧嘩をする。
約15Lに5匹で暮らしているので、そこまで過密というほど過密でもないはずなのだが、閉鎖空間ゆえ縄張りが気になるのかもしれない。
繁殖行動が見られた時期には鰭が傷つくくらいに激しい喧嘩をしていて悩んだが、最近は落ち着いてきた。
この5匹が集結してようやく、水槽が立ち上がったと言ってもいいかもしれないところまで水が落ち着いてきた。
飼育を始めてから実に2ヶ月後のことである。
おとなたちはだいぶ落ち着いてきてくれたので、最近は初の稚魚飼育で毎日あたふたしている。
なんとかこの子たちも無事におとなまで育て上げ、親たちと一緒に暮らせるようにしたい。
ごあいさつ
ずっとブログを作ろう作ろうと思いながらなかなか踏み切れず、この度ようやくスタートを切るに至った。
記念すべき1記事目ということで、まずは自己紹介と、このブログを作るに至った経緯でも。
かんたんに自己紹介
Y.Graceと申します。
読むときはYは飛ばしてグレイスとお呼びいただければ。
2011年からiOS開発をやっているエンジニア。
つい最近、人生初の転職をした。
Objective-Cが大好きで何の不便も感じていなかったため、Swiftを使い始めたのは現在の会社に入ってから。
開発対象のデバイスもiPhone + Apple WatchからiPadに変わり、新しい仲間に支えられながら地道に鍛錬中。
ブログを作ろうと思った理由と作るに至らなかった理由
最初のきっかけは「iOSDCの感想を書く場がほしかったから」。
iOSDCには2回目から毎回参加しているのだが、実況はTwitterでしてきたものの、改めて感想をまとめて書く場を持っていなかった。
その度にブログ作ろうかな……と思いながらも足踏みしていたのには理由がある。
言ってしまえばちょっとした劣等感のようなものがあって、「技術のことならたくさんの人がすでに書いているし、私から発信できることもないかな……」と、発信することを考えた途端に急に自信をなくしてしぼんでしまうのだった。
そんな心境で技術ブログをやろうとしたところで気持ちが続かないだろう。
何かしらのアウトプットをしたい気持ちに変わりはなかったが、この自分で作ってしまっている精神的障壁をまずなんとかする必要があった。
やっと踏み切れたきっかけ
いま在籍している部署で、アドベントカレンダー企画があった。
同僚たちの記事はとてもワクワクするものばかりで、私も参加してみたいと思いはしたものの、結局名乗りを上げるには至らなかった。
入社からまだ間もなかったために勇気が出なかったこともあるが、何より発表の場となる媒体をまた用意できなかったから。
来年こそはなんとかしたい……そう思いながら水槽のめだかたちを眺めていたときに思いついたのが、水槽についての日記なら気楽に書けるのでは?ということ。
手元では毎日記録をつけているのだが完全に自分向けメモなので、それよりもう少し外向けにしたものを。
そこに時折、エンジニアとしての話題を入れ込めばよい。
内容も気張らず、よくやらかすのでやらかして覚えたことであるとか、考えたことであるとか。
それならできそうな気がする。
性格を考えるとマメな更新は望めないが、まずは続けることを目標に。
よろしくお願いします。