長大祭&ブログリレー開催予告!!

こんにちは、雇われブログ管理人の kofuk です (?)。
長大祭が近づいてきました!長大祭の日程は 10/30〜10/31 です!Save the Date!
というわけで、今年も「長大祭まで毎日更新!ブログリレー 2021」を開催していきたいと思います!このブログリレーはサークルのメンバーに長大祭の意気込みや趣味などをテーマに語ってもらいます!各日程のテーマは以下のようになっています。
(一部の日程は内容が未定です。当日をお楽しみに)
毎日チェックして、私たちのサークルについて知っていただき、興味を持っていただけたらと思っています!
それではブログリレーは明日開幕です!Don’t miss it!

メール転送ボットのソースコードを公開しました

こんにちは、自称 OSS 担当の kofuk です(?)

以前、サークル関連の連絡メールをサークルで使用している Discord サーバに転送するボットを作成したという記事を書きました。先日、そのソースコードを GitHub 上で公開しましたので今回はその背景等を含めた報告をしていきたいと思います!

とりあえず、リポジトリの URL はこちらです。

まず、サークルで共通で使用する GitHub のアカウントのようなものはこれまで作ってこなかった (必要に応じてメンバーが個人のアカウントにリポジトリを作り、共有するということはあった) ので、Organization を作りました。とはいえ今のところサークルのメンバーの参加率はけっこう低いです。今後他の活動に使っていくにあたって参加率を高めていけたらという気持ちはありますが、まあそんなに急ぐものではないとは思っています。

あと、サークルの Organization に置こうと思った理由としてはこういうのは僕の個人のアカウントのものにしておくよりもサークルのものにしておいた方が僕がサークルを去った後も活用される可能性が多少は高いのかなと思ったからです。

公開後にやった主なこととしては、保守性は高めておいたほうがいいだろうと思ったので CI の導入をやったのと、Docker で動かせるようにしました (ただ、CI に関してはメールサーバとの通信周りのテストを書いていないという問題はあります。その部分もテストしていきたいのですが、モックを準備するとか適当に Docker とかでサーバ立てたりとかするのが面倒で……)。
あと、今までは Cron とかそれに類似するミドルウェアから起動されることを意図した設計になっていたのですが、Docker で動かすというというところで常時起動のサーバぽく動かせた方が良いので、その機能も足しました (ついでにそっちがデフォになった)。

最後に、もし不具合や機能追加の要望があれば、Issue や Pull request を上げていただけたらなと思っています。

サークル関連のメールをDiscordに転送するようにしてみた

お久しぶりです。kofuk です。
3 日くらい前にメールを Discord に転送するものを作った話を書きます。

コードも貼ろうと思ったんですが、貼るほどのコードがなかったです。欲しい方は連絡ください。
あと、この投稿を読んでも実装の詳細とかはあんまり分かんないです。まあアイデアの共有ということで……。

背景

なんか僕はサークルの連絡担当者ということになっていたんですが、まあこいうのは全員に見えたほうがよいだろうということで、メールを全部 Discord に送り込むことを思いつきました。決して面倒だったからとかそういう理由ではない。んで会長の God に相談したんですが、あんまり乗り気ではなさそうでしたが、どういうものが出てくるのかという興味から (かどうかは知らんが) やっていいと言ってくれたので、適当に作ったという次第です。

構成

何も難しいことはしてないです。IMAP でメールを見に行って、条件に合う未読メールがあったら落としてきて Discord に転送するという感じです。Discord は Webhook の URL に適当に POST するだけでメッセージ送れるから便利ですね。
ひとつ注意点として、このメールアドレスにはサークル関係のメール以外もどんどん来ているので片っ端から転送していると僕の正体が暴かれてしまいます (プライベートのメールが流出してしまうという意味)。アイドルとして (アイドルではない) そのようなことは許されませんね。そのへんをどう実装したかについても後ほど説明します。

実装

メールを見に行く部分

この部分で一番非自明なのは、他の用件のメールとサークル関係のメールを見分けるという部分と、一回転送したメールはそれ以降転送しないという部分だと思います。まあ結果的にこのへんは別に難しいということはなかったんですが。

一番簡単にできる方法を考えた結果、Outlook (そう、Outlook だったのです) のルール機能を使って、適当なフォルダーに放り込んでおいて、そのフォルダーのメールだけを転送対象にするのが楽だということで、そういう実装にしました。ちなみにここのフィルターは「学生団体各位」が入っているかどうかという非常にアドホックなものになっています。Cc に特定のアドレスが入っているかという条件が使えればいいんですけど…。

一回転送したメールをもう一度転送しないというのは、一回ダウンロードしたメールは既読になる仕様らしく、未読メールだけを処理すれば良かったので簡単でした。無知は罪ですね。

ひとつ注意点としては、iso-2022-jp でエンコードしてあるメールがそこそこあるので、その部分をうまく扱わないといけないことです。

Discord に送り込む部分

ここが一番自明な部分です。Discord に Webhook URL を貰ってきて、適当に JSON を POST しています。2000 文字の制限があるらしいので 2000 文字を超えるメールは分割しないといけないんですが、この部分はまだ何もやっていないです。文字数という概念はあまりにも難しすぎる………

その他

一応先頭行の「学生団体各位」という文字列を削ったり、メール末尾にくっついている署名を削ったりはしています。このへんはかなりアドホックなコードが入っています。

Minecraft のマップを生成するソフトウェアを書いた

はじめまして。kofuk です。このサークルに入ったのはたしか去年の11月くらいだったのでまだ新入部員です[要出典]。

もう数か月前になりますが,Minecraft のセーブデータをパーズして上空から見た画像を生成するソフトウェアを書いたので,その紹介をします。このサークルの活動とは直接は関係がないです。

こちらがそのソースコードのリポジトリです。
残念ながら,私一人で作っているので開発リソース的に GNU/Linux にしか対応していないです。以前は Windows にも対応していたのですが,Windows で使う人がいなかったので(そう,私の知りうる範囲では私しかユーザがいなかったのです)テストするのも面倒になってやめました。ただ *nix 的な API を使っているのは一部なので,Windows に移植するのはそんなに大変じゃないと思います(Windows に詳しい人がいたらプラットフォーム依存部分の移植をお願いしたい……)。

これは私が個人的に管理している Minecraft のワールドで,Web ページでマップを見られるようにするために使っています。あと指定した座標の一番上のブロックの ID を取る機能とかも実装していて,右クリックでブロック ID を確認できたりします。x, z 座標を与えられたらその座標の一番上のブロック ID を返すというのもこのソフトウェアの機能のひとつです。

以下は需要あまりない気がするけど技術的な話をつらつらと書いていきます。

最初は Python で書いていて(というのも Python だとよさげなライブラリがけっこうあったので)遅かったので,C++ で書き直したとかいう話があったりします。ただ C++ だと良くも悪くも書いた以上のことはあまりやってくれないので別の辛さはけっこうあったりします。余談ですが,先日もとの Python ライブラリの作者に GitHub でスターをいただきました。

まず Python だと遅かったという話をすると,Python だと GIL とかがあってマルチスレッドにしてもその分のパフォーマンスは発揮できないというのがあったりします。GIL というのは Global Interpreter Lock の略でデータ競合(並列処理で別の実行コンテキストが同じメモリ領域に書き込んでしまってバグるみたいな状態)を避けるために,同時に1つの Python のコードしか実行されないようになっているということです。Python には(Python じゃなくてもできるけど)スレッドじゃなくてプロセスでやるという方法もあったりしますが,それでも処理が遅くて不満だったりしたので,やっぱり C/C++ で書き直した方がいいだろう判断して移植しました。これには私が Python があまり気に入らないという背景もけっこう関係していたりします。インデントでブロックを表現するってのがコード足したりするときにけっこう厄介で。

ただ,GIL がないということは,競合条件でバグらないように自分で書いてあげないといけないので面倒くさいです。マルチスレッドって必要ないならなるべく書きたくない機能だと思います。(ちょっと危ないコードがあったりするんですが,適当なワークアラウンドで見ないふりをしたりしています,はい,だめです)。

最近の更新としては,前から気になっていた Unit テストを書き始めたことです。とりあえず導入して新しい機能のところから書いていけばいいだろうということで,実際にはあまり書いていないですが,書いたところでも既にバグが見つかりました。やっぱりテスト書くのは大切ですね。

直近の TODO としては,Minecraft の大型アップデートに対応するということだと思います。これがブロックの追加が多そうで面倒だなという感じで見ています。

ということで,今回はこれくらいですかね。最後までお読みいただき,ありがとうございました。