Global Game Jam Sapporo 2018に参加してきた #ggjsap #ggj

今年もGGJ札幌会場に参加してガッとゲーム作ってきました.

Global Game Jam Sapporo

全体の流れはtogetterがいい感じにまとまっていてオススメです(記事書いてて思ったけどサムネがひどい).

togetter.com

今回はUnityでゲームを開発するチームに参加し,グラフィック周りを担当しました.

成果物

f:id:ttata:20180129230639p:plain

『はーとふるラブレター』

Hatoful Love-letter | Global Game Jam®

ここから遊べます

ハトのモデリングに全力を注ぎました.他のモデリングは適当にシュッとやりました.

こっちは未使用リソースです

そういえば他にもゲームクリア時のアニメーションをUnityのTimelineを使って作りました.初めて触る機能だったんですが,チームメンバーのかまたさん(@kamayuki_fs)にオススメして頂いた以下の記事のおかげで,なんとかそれっぽいものが出来上がりました.

www.shibuya24.info

ゲームのアップロード後,本会での制作したゲームの発表が終わってから懇親会までの間に時間があったので,難易度を微妙に変えたバージョンを作成して懇親会会場で公開してました.クリアできたのは5,6人だったと思います.ちなみに僕はクリアできてません.

感想

GGJに参加するのは3回目なんですが,今年はエンジョイ勢としてたくさんツイッターをしながらゲームを作りました.楽しかったです.みなさんお疲れ様でした!

樽前FMについて

この記事は苫小牧高専アドベントカレンダー2017 24日目の記事ですが25日に書いています.メリークリスマス🎉🎉🎉

はじめに

tarumaefm.com

樽前FM,ご存知でしょうか.苫小牧高専関係者の方をゲストに呼び,適当に世間話をするpodcastです.MCは後輩の@mktakuyaがやってます. 今年の1月あたりに最初のエピソードが公開,そしてつい先日22日に新しいエピソードが投稿され,現時点で全10話ほど公開されています.その中で僕は初回のEP01とEP08でゲストとして出演させていただきました.今回の記事ではそんな樽前FMについて,ゲスト目線でちょっとだけお話してみようと思います.

きっかけ

自分は何年か前から@mktakuyaと,あまり真面目に作業しないさぎょいぷ(しかもskypeですらない)を定期的にしています.技術的な話からエモい話まで眠くなるまでざっくばらんに世間話をしているんですが,そこでほぼ毎回,お互い普段聴いてるrebuild.fmというエンジニア向けのpodcastの感想の話をしてるんですよね.で,確か大体1年くらい前にその話の流れで,podcastやってみないか,みたいな話になり,オッ,マジか,と最初は思ったんですけど,なんか最終的にまあやってみてもいいかなと.そして,僕も@mktakuyaもお互いそういった技術系から雑談系まで横断的に扱うpodcastの雰囲気を共有できてたので,今後の樽前FMの方向性をなんとなく形作る意味合いも兼ねて,第一回の収録の方で出演する運びとなりました.確かこんな感じの経緯だったと思います.ちなみにタイトルの"樽前"こと樽前山は,苫小牧高専付近にある,現在も定期的に地震や水蒸気噴火等のピクつきが観測される,やっていきに満ち溢れた活火山です.テスト期間になると皆が噴火を祈ります.山岳信仰ですね🙏

実際に喋ってみて思ったこと

 収録を聴いてくれる人を意識して喋るのが面白かったです.この樽前FMはエンジニアというよりもどちらかというと(苫小牧)高専関係者向けのお話をするpodcastっぽいので(そうだよね?)話題の選定や,妙ちくりんなテクニカルタームの使用に配慮した方がいいかなー?とか考えながら話をしてます.こんなふうに,その場にいない人を想定して世間話をすることは普段なかなか無いので,頭の変なところが回る感じがありました.

最後に

みなさんお手柔らかに聴いてみてください.また,苫小牧高専関係者(在校生,卒業生等)で,こういう雰囲気のやっていきで自分も面白い世間話を一緒にしてみたい,という方は@mktakuyaまで連絡していただけると色々と楽しいんじゃないかと思います:)

クリエイティブコーディングフレームワークarmosに追加された機能まとめ2017年版

この記事はD言語 Advent Calendar 2017 19日目の記事です.

今年2017年にクリエイティブコーディングフレームワークarmosに追加された機能等を紹介していきます🎉

Mac OS Support

自分がmac book proを使い始めたのでサポートしました. 論理ピクセルと物理ピクセルのサイズが異なるretinaディスプレイへの対応として,interface WindowにframeBufferSize()を追加しました.これは既存のWindow.size()がウィンドウサイズを論理ピクセルで返すのに対し,こちらはウィンドウの物理ピクセルで返します.

頂点座標からの頂点法線情報の生成

armos.graphics.Meshクラスのメンバ関数calcNormal()でスムージングされた頂点法線情報を生成できます.生成された法線情報はMeshのメンバnormalsに保存されます.

シンプルな2Dのグラフィックを表示するexample.

単純な2DのMeshのアニメーションを行うexamples/primitives2dを追加しました.armosに触れる際,一番最初に見ていただくと雰囲気がなんとなく掴めるかと思います.

フォント読み込み機能の実装

https://pbs.twimg.com/media/C8jCzc8VwAAlvFQ.png

Fontクラスでフォントを扱えます.内部でfreetypeを使用しており,フォントのデータをラスタライズしてテクスチャとして描画することができます.

exitApp()の追加

Applicationのinterfaceに追加しました.Applicationの内部でこのメンバ関数を呼ぶことでApplicationを終了させることができます.

リアルタイムの音声入力

音声入力デバイスを扱うクラスarmos.audio.Recorderを実装しました. 実際の使い方はexamples/audiocaptureを参考にしてください.

Colorクラスの仕様変更

従来のColorのRGBAの値はそれぞれ256段階の整数型でしたが,OpenGLとの相性を考え,0から1までのfloat型に変更されました.

generate commandによるテンプレートファイル/フォルダの自動生成機能

armosを使った開発を加速させるCLIツールを追加しました. 以下詳細

glslify support

glslifyを用いてshaderのglslのモジュール化,importができるようになりました. 以下詳細

マルチウィンドウ対応

複数のウィンドウを扱うことができるようになりました.OpenGLのcontextはデフォルトではウィンドウ間で共有されていませんが,アプリケーションの初期化時,Windowを生成する際にコンストラクタへ引数としてcontextを与えることで同じcontextを扱うことができるようになります.

auto config = new armos.app.WindowConfig();
auto window1 = new armos.app.GLFWWindow(config);
auto window2 = new armos.app.GLFWWindow(config);
auto window3 = new armos.app.GLFWWindow(config, window2.context); //share context.

armos.app.mainLoop.register(new MainApp, window1)
                  .register(new SubApp,  window2)
                  .register(new SubApp,  window3)
                  .loop; // call loop function after application and window registations.

実際の使い方はexamples/multiplewindowsを参考にしてください.

MIDI input

armos.communication.MidiStreamを用いることでMIDI信号の入力を扱うことができます.

メンバ関数popMessagesを呼ぶことで受け取ったMIDIメッセージを取り出すことができます. 実際の使い方はexamples/midiinputを参考にしてください.

Reactive Extensions

Rxはじめました.@lempiji氏が開発しているdlang実装のRxを利用させて頂いてます.

現在のarmosのイベントシステムは全てRxに置き換わっており,armos.app.currentObservables()で全てのarmosのイベントのobservableが包含されたCoreObservablesへアクセスすることができます.

マウス入力関係のイベントの追加

Rxの導入によるイベントシステムの刷新に際して,mouse dragとmouse scrollのイベントハンドラをサポートしました.対応するシグネチャは以下の通りです.

void mouseDragged(int currentX, int currentY, int button)
void mouseDragged(int firstX, int firstY, int currentX, int currentY, int button)
void mouseDragged(Vector2f currentPosition, int button)
void mouseDragged(Vector2f firstPosition, Vector2f currentPosition, int button)
void mouseDragged(Vector2i currentPosition, int button)
void mouseDragged(Vector2i firstPosition, Vector2i currentPosition, int button)
void mouseScrolled(float xOffset, float yOffset)
void mouseScrolled(Vector2i position)
void mouseScrolled(Vector2f position)
    

EasyCamのサポート

マウス操作で簡単に視点を操作する機能が組み込まれたcameraの実装です.名前のとおりopenFrameworksのEasyCamと似た挙動になってます.実際の使い方はexamples/easycam/を参考にしてください.

今後の予定

OpenGLのContextを一箇所にまとめる大規模改修

現在,Cinderの設計を参考にしてcontextの管理を局所化する設計変更を行っており,それに伴って既存のRendererのリファクタリングも行っています.影響箇所が多いので開発版のdevブランチに取り込まれるのはもう少し先になりそうです.

映像のサポート

現在ffmpegを用いたVideoTextureを実装しています.また,ライセンスの都合からarmos本体とは別リポジトリで,armosの拡張という形でのリリースを検討しています.途中で上の大規模改修が始まったため,こちらの作業は一時的に中断しており,改修が終り次第再開しようと考えています

ベクタデータの取扱

未着手です.ベクタデータが扱えるようになると,フォントのアウトラインを変形させるような表現等,幅広く応用できそうです.

東京Node学園祭2017のアフターパーティーでVJをやってきた #nodefest

はじめに

12/25,12/26に開催された,Node.jsコミュニティのカンファレンス,東京Node学園祭のアフターパーティーでVJをやってきた.今回は運営スタッフのamagi(@amagitakayosi)さんに誘って頂いた.amagiさんとは,彼が開発しているVEDAというAtomでライブコーディングを行うプラグインへのContributeを通して知り合いになった.

下ごしらえ

まず,VEDAで映像素材を切り替えるためのサンプラーを外部のアプリケーションとしてarmosを用いて新規に開発した.Ableton liveのセッションビューのような操作体系で,登録したキーを押すことで設定したBPMに同期して映像を切り替えることができる.なお映像の再生速度も同期される.また,タップ入力によるBPMの変更機能付きで,流れている曲に合わせてスペースキーを押すことでいい感じに検出してくれる.入力される音声信号からのリアルタイム検出による自動化もやりたかったが不安要素が多かったのでそのへんは今度やることにした.(昔実装した非リアルタイムBPM検出のアルゴリズムと想定される計算量を比較してみたが,両方で用いられるFFTがΟ(n log n)なので,サンプル数が少ないリアルタイム処理なら速度的に割といけそうな予感がしている)なお,VEDA本体との通信は,Open Sound Control(以下OSC)というプロトコルで行う.VEDAはOSCによる外部からのglslのuniform変数の変更をサポートしているが,映像素材の切り替え機能は今のところ無いので,そのへんの機能をいくつか無理矢理追加する改造を施した.サンプラー側はosc-dというOSCの実装のpackageを用いた.開発の途中でいくつかバグに気がつけたので良かった(修正済み).dogfoodingは最高.

次に,Blender(あと仕上げで少しだけAfterEffects)で普通の4n拍(n∈N)くらいの尺の映像と,2つの映像をミックスするための白黒の映像をいくつか作成した. BlenderはTimeline周りの操作体系も3Dのモデリングと直交性があるので快適にモーションを組むことができる.また,2Dっぽい見た目のモーショングラフィックスを作る際もオブジェクトを三次元的に配置できるので凝ったことができる.

映像素材の制作中は,レンダリング作業の効率化のためlightweightなBlenderレンダリングファームを開発し,計算用のarch linuxのサーバ上で稼働させていた.僕が作業している間,休憩している間に,予め投げておいたキューが逐次処理されていく.ちなみに処理が完了する度にするとtwitterでリプを飛ばしてくれる.

当日

日中は空いた時間に本会場の廊下で,実際の環境を想定して念のためにveda-samplerの全ての操作をmidiコントローラで行えるよう,無限コーヒーを飲みながらバキバキコードを書いていた.楽しかった.

アフターパーティーはfreeeさんのオフィスを借りて行った. 設営からお手伝いさせていただいたが,レイアウト等試行錯誤の末に出来上がったパフォーマンス用のブースが広くて凄みがあり,一体何のイベントのアフターパーティーなんだろう感がにじみ出ていた. freeeさんの社員の方が「会社ってこんなこともできるんだ」的な旨のことを言っていたのを覚えている.

自分のVJ中は記録映像を撮る余裕が無かったので他の方が撮ってくれた様子を以下に引用させて頂きます.(撮影ありがとうございます🙏)

まとめ

  • 実験的な要素を盛り込んだパフォーマンスができて勉強になった.
  • VJ,メディアアート,クリエイティブコーディング系の知り合いが増えた.
  • OSSの活動がきっかけでOSSのイベントに招待して頂いてVJのパフォーマンスをするという素敵な体験ができた.

TipsとしてのVJボツ案供養

本番では使われなかったボツ案です.ご査収ください.

VEDAでsyphonの入力を使いたい

VEDAネイティブでやるのは大変.懇親会でamagiさんと話をしたけどなかなかしんどい(chromiumに手を入れる必要がある).レイテンシを気にしないのであれば,syphoncamTwistを経由してVEDAのcamera入力に渡すという手段がある.

VEDAで透過映像を扱いたい

f:id:ttata:20171129002912p:plain

VEDAが内部で使用しているThree.jsで直接透過映像を扱うのは難しい.そこで,映像のフレームに透過マップをくっつける(この処理はffmpegopenCV等の画像処理ライブラリを使って適当にツールを書いておくと楽).これはgooglechromeの技術デモ『3 Dreams of Black』で用いられていている手法で,以下の動画が参考になる.

このアプローチをnormal mapやdepth map等の複数種類のソースに拡張することで,deferred shadingをVEDA側で行うことができる.ちなみに,基本的にカラー以外の情報は縮小しても粗さに気が付きにくいため,付加されるマップについては1/2サイズのものにしておくと処理の負荷を抑えることができる.

armos devlog 3f1b057 and 6aab220

github.com

以下の機能がarmosのdev branchに取り込まれた.

  • CLIでのarmos generateコマンドによるコード生成
  • glslifyによるShaderのprecompile

また,今回の変更によりarmosの動作にはnpmを要求するようになった.

(この解説では便宜上,プロジェクトのルートディレクトリを/として表記する)

armos generateコマンド

$ armos generate <target>

いくつかの種類のディレクトリやソースコードを自動生成する.generateの部分はgに省略可能. <target>は以下がサポートされている.

  • project
  • material
  • glslsource(glslsources)

project target

$ armos generate project [<projectpath>] [<options...>]

armosコマンドの<target>projectを指定した場合,新規に指定したパス<projectname>にarmosのプロジェクトを生成する. <projectname>を省略した場合,現在のワーキングディレクトリにプロジェクトが生成される(dub initと同様の挙動と考えて良い).

このコマンドは以下の処理を行う.

  1. dub initの実行によるプロジェクトの生成,
  2. armosのアプリケーションの雛形となるMainApp classとそのエントリーポイントを含んだコードをsource/app.dへ上書き.
  3. glslifyがnpmのglobalに存在しない場合,インストールを行う.

以下のoptionにより,デフォルトで生成されるapp.dに追加するコンポーネントを指定できる.

  • --defaultcamera string

他のコンポーネントについてのoptionは今後追加していく予定.

--defaultcamera string

armos.graphics.camera.DefaultCameraを追加する.このoptionはインスタンスの名前を指定するために文字列の値を設定する必要がある.

material target

$ armos generate material <ClassName> [<path>] [<options...>]

armos.graphics.materialを継承したクラスの定義が書かれたコードを生成する.<ClassName>には生成するクラスの名称を指定する.pathを指定しないこと(e.g. foo/BoxMaterial). 生成されたコードは/source/<projectname>/materials/<classname>.dとして保存される.

以下のoptionが使用可能.

glslsource (glslsources) target

ここでは機能が似ている2つのtargetについて説明する.

$ armos generate glslsource <filepath> [<options...>]

glslsourceは一つのglslファイルを生成する.<filepath>に指定したファイルを/shadersディレクトリ内に生成する. 生成されるファイルがvertex shaderかfragment shaderか,あるいはgeometry shaderかは,<filepath>で指定された文字列の拡張子により判別される. 拡張子は以下を用いること.

  • .vert vertex shader
  • .frag fragment shader
  • .geom geometry shader

optionには以下を使用できる.

$ armos generate glslsources <dirpath> [<options...>]

glslsourcesは vertex shader, fragment shader, geometry shaderの3つのglsl sourceを含んだディレクトリを/shadersディレクトリ内に<dirpath>として生成する. 以下のoptionが使用できる.

  • --no-vert vertex shaderを生成しない
  • --no-geom geometry shaderを生成しない
  • --no-frag fragment shaderを生成しない
  • --path string /ディレクトリからの相対パスで生成先を指定.dirpathより優先される..

今後は--typeoptionにより様々な種類のglsl sourceを生成できるようにしていく予定. .

glslify Shader Precompile

armos.graphics.shaderでglsl sourceをコンパイルする前に行われるソースコードの展開(precompile)にnpmのパッケージであるglslifyを使用するようにした.

この変更により,以下の機能が提供される.

  • glsl sourceのモジュール化と読み込み
  • npmによるglsl-*系パッケージの手軽な利用

詳細は以下の記事を参照.

qiita.com

なお,dlangのソースコードにハードコードされたglsl sourceをarmos.graphics.Shader.loadSourcesに渡した場合, そのコードは/にあると見なされる.glslifyの相対パスによるmodule読み込みの際には注意すること.

引っ越しした

山奥から札幌に引っ越しした.色々と落ち着いてきたのでこの記事を書いている.出自が野蛮な男子寮なので(夜中に人間の鳴き声が聞こえる等.スズメがドン引きするレベル),世間の常識的にどこまで騒いでいいのかよくわからずビクビクしながら静かに生活している.

自炊

f:id:ttata:20170125224143j:plain:w500

朝はシリアルで軽く食べて,昼と夜はスパゲティとかスープ系とかを作って食べている.今日は舞茸とキャベツのペペロンチーノを作った.具が多すぎて野菜炒めみたいになってしまったが,キャベツのやさしい味がして美味しかった.あとシチューとかもこの前作った.ふたり分作ってしまって残りは冷蔵庫に突っ込んでおけるので楽.また,米については炊飯器は買わずに普通の鍋で炊く予定だったが,ここ数日美味しいごはんの食べたみが出てきたので,つい先ほど土鍋と米を買ってしまった.土鍋は頑丈そうで米も炊けそうな銀峯 花三島の8号ってやつを選んだ.ちょっと大きめなので誰かと鍋をつつくのにも使えると思う. これで生活の文明レベルが弥生時代まで急激に発達した.土鍋×ガスの最高のごはん体験楽しみ.とりあえずこの後は,土鍋を調理に使う前に,目止めというならし作業を行うので,実際にごはんを炊くのは明日以降になると思う.

インターネット

さて,引っ越してから1週間が経過して家具や家電は概ね揃ったが,未だに不足しているインフラがある.インターネットだ.今は無線の容量制限付きの回線でなんとかしのいでいるが,半身をwebに置いているような人間なので正直そろそろ息苦しい.予定では2/1には使えるようになるので,それまでに届くよう無線ルーターもポチった.NEC Aterm WG1800HP2ってやつ.回線が整い次第本気出しますよろしくお願いします. 

キリンガラナ500ml缶

この記事は苫小牧高専 Advent Calendar 2016 23日目の記事です。

 冷蔵庫からキリンガラナ500ml缶(以下ガラナ)を取り出した.この記事を書くときに飲もうと取っておいた最後の一缶だ.できるだけ体温で温度が上がらないよう,上面の縁をつまむようにして机へ運ぶ.下面に書かれた製造番号は「NA/1EI59」."NA"が製造工場の識別番号で,スラッシュの後ろがロットになる.この500ml缶は全て,岩内町にある「日本アスパラガス」という工場で生産されていると友人から聞いた.恐らく識別番号は"Nihon Asparagus"の頭文字をとったのだろう.この工場は缶詰の製造ノウハウを清涼飲料水のパッケージングに転用したとかなんとか.さて,ロット違いのものが他にあれば飲み比べもできるが今回はこの一缶だけ.プルタブを引き起こす.炭酸の勢い良く漏れる音と共に鼻の奥を優しく刺激するフルーティーな香りが漂う.最初の一口,喉で味わう.いつもより炭酸は控えめで甘めの味付けだ.冷蔵庫で冷やしただけなので舌触りはサラッとした感触.凍る直前まで冷やすとまろやかになるが,一歩間違えると破裂する恐れがあるので最近はやっていない.高専の寮にいた時は,冬の朝に二重窓の間に置いておいたガラナが破裂し,窓が飴色に染まったのを思い出す――

 僕が寮にいた5年間で一体何本のガラナを飲んだだろうか.一年のうち2/3は寮で生活していたとすると,一日に一本は飲んでいたので,大体1200本は飲んだことになる.いつも買う寮の食堂の前のアホみたいな品揃えの自販機はガラナを100円で販売していたので120000円分ガラナに注ぎ込んだ計算になる.まじか.ドン引きなんだけど.多分計算間違いだと思う.入学したばかりのころはそこまで飲んでいなかったような気がするし.

f:id:ttata:20161223223359j:plain

食堂前,アホみたいな品揃えの自販機(なお周波数の都合で一部点灯してないように見えるがテスト期間につき全て売り切れ)

 授業が終わり,一度寮へ帰る.部活へ行く途中,食堂の前の自販機でガラナを買う.すぐにでも飲みたいが,外の空気に触れると味が変わってしまうので開けずに部室まで縁をつまんで持っていく.未だに不思議なのが,屋内の空気と触れるだけではそこまで味が変わらない点だ.開封したまま外を歩くと,どうしても埃っぽい味になってしまう.まあ,その季節その時間の空気の香りをガラナと一緒に楽しむことができる,という考え方もあるかもしれない.夜は寮の風呂から上がった後に食堂の前の自販機でガラナを買う.そのまま缶を片手に自分の部屋に戻ったり,誰かの部屋に遊びに行ったり.基本的に1日1本だけどテスト期間だと2本目に手を出すことがある.で,そういう時期には寮の自販機のガラナが売り切れたりする.

 卒研室の冷蔵庫には常にガラナが入っていた.というのも,当時の僕を含めた卒研室の5年生はほとんどがガラナ飲みで,いつも机に500ml缶を置きながら研究に励んでいた.あといつの間にか卒研担当の先生もガラナにハマっていた.こうしてそれぞれ買ってきたガラナを冷蔵庫で冷やすようになった.

 ガラナについてのある仮説が提唱されたのもこの場所だった気がする.

ガラナの味が違う」

半分冗談だったけど.甘さや香り,炭酸の強さが,飲む度に微妙に異なることに気がついたのだ.ここでいくつかの仮説が立てられた.

  1. 体調説
  2. ロット説
  3. 経年劣化(熟成)説

まず,体調説の検証は難しそうなのでパス.でも体調で味覚が左右される話はよく聞くので,可能性としては大いにあると思う.また,ロット説については,研究室のメンバーが異なる複数のロットのものを仕入れるため,それぞれ別のルート,寮の食堂前の自販機,学生会館の購買等からガラナを入手し飲み比べをした.確か味が異なっていた記憶がある.要追実験.最後に,経年劣化(熟成)説は,事前に僕が,食堂前の自販機のガラナが売り切れた際の戦略備蓄として,自分の部屋の机の引き出しに保存しておいた,購入から1年が経過したガラナをサンプルとして利用し,検証する予定だった.でも結局,なかなか開封するタイミングがつかめずに卒業してしまった.あの熟成ガラナは当時の卒研室のメンバーだった僕の友人に譲渡した気がする.今もまだあるのだろうか.

 ガラナのアレンジは,他のジュースと混ぜるあたりでやめておいたほうが良いのかもしれない.ガラナを少し飲んだ後にレッドブルを混ぜたガラナブルはテスト期間等切羽詰っている時にお世話になった.あとレモンを絞ると美味しいらしい.これは友人から聞いただけで実はまだ一度も試せてない.ポッカレモンよりも生のレモンが良いとか.

 問題はここからで,ある時ふと魔が差して固形物のガラナを食べたくなってしまって,フライパンでガラナを煮詰めてガラナ飴を作った.いい感じに箸に巻きつけて,それっぽい見た目にすることには成功した.ただ,どうにも若干火加減が強かったらしく,焦げてしまったらしい.ほろ苦い大人向けの仕上がりになってしまった.もともとの液体の色がキャラメル色なので,判断が難しいんだと思う.誰かこの失敗を活かして美味しいガラナ飴を作って欲しい.

f:id:ttata:20161223224247j:plain

ガラナ飴 苦い

 で,最悪だったのがホットガラナ.元のガラナが美味しいだけに,これは本当に驚いた.コニカルビーカーに入れて湯煎したので見た目に凄みがあったのも大きいかもしれない.僕と,共犯の1人は口に含んだ直後に吐き出した.なお別の共犯者は普通に飲んでたので個人差があるのかもしれない.まあ,あれは本当に最悪のエクスペリエンスだった.簡単にできるのでこの記事を読んだ人はぜひ実践していただきたい.

f:id:ttata:20161223224345j:plain

吐き気を催す邪悪

 大事な話をするのを忘れていたんだけど,キリンガラナって,容器によって味が微妙に異なる.これは僕のまわりのガラナ飲みからコンセンサスが得られてるんだけど,500ml缶が至高.ペットボトルだと味に雑味が入る.アルミのボトルタイプのものも同様.どちらもフタ付きで飲みきりではないので何らかの保存料が追加で含まれているのかもしれない.ただこれだと190ml,350ml缶の味が500ml缶に劣る理由が説明できない.なんでだろう.誰か調べてみてほしい.(あとキリンガラナの他にもコアップとか色々な種類のガラナがあるけどキリンガラナが一番美味しいと思います)

 そろそろ開けたガラナも無くなりそうなのでこの記事もこのへんでまとめていこうと思う.昔からガラナについて何か記事を書いておこうと考えてはいたけどタイミングが見つけられなかった.そこで今回,苫高専AdventCalendar23日目という機会を頂いたので,ポエムを献上させて頂いた次第.しかしこうして昔のことを思い返すと僕も友人たちも本当に脳にガラナが回ってたんじゃないかと不安になる.まあ,在校していた当時から,卒業して今に至るまで,ガラナを本当に沢山の人と飲みながら,下らないことから大事なことまで色々な話をしたし,きっとこれからも,昔の友人と会うときはガラナで乾杯するのだろう.

ガラナはいいぞ.

f:id:ttata:20161223232431j:plain:w340

明日,24日の記事はhanaken_nさんの「クリスマスイブデートを断って後輩たちに捧げるポエムです。それでは聴いてください。『あえて言おう、mkは休学すると』」です.僕もmkくんは無傷で専攻科を卒業できるとは思っていないのでとても楽しみにしてます.