【ネタバレ注意】家族計画の話

 FDというより完結編と呼びたいんだけど、『家族計画 〜そしてまた家族計画を〜』をプレイし終えた。生きてから死ぬまでどう時間を消費したかという、本当にそんな話だった。

 人は生まれてから死ぬまでに、必ず人と接するだろう。けれど、どれくらい、どのように接するかは人によって大きく異なる。そんな人と人との付き合い方をもがき苦しみながら考えて、必死で生きた彼らの姿の"最後"がこうなんだ。良くも悪くも結局人は死ぬんだ。やっぱり人生は死ぬまでの道だった。でも悪いものじゃないなと思った。

 書いていて思ったけど、私にはこのことを文章にできない。本当に、「なんと言っていいかわからない」という言葉が似合う。

 いつものごとく、胸に刺さる言葉を並べてみる。

「……これは……司が作った最後の料理なんだ」「誰がなんと言おうと、食べる」

「それ以上、どんな理由がいるというんだね? あかり君」

 特に後者。まず第一に、思い出ボムであるということ。そして第二に、人生は自分で変えられるんだと間違いなく言えるということ。

 この言葉に涙腺緩むのは本編をプレイしていることが条件だと思うが、まさかこんな爆弾を抱えているなんて思ってもいなかった。この作品(完結編)において、たったこの一行だけで泣いた。けれどこの作品が一行だけじゃ泣けないんだ。

 人は結局、必ず人と接するだろう。けれど、人と接する理由なんて大したものじゃないんだ。学校で出会った友人、ネットの世界で出会った仲間、すべてが偶然に始まっていて、何気ないことで特別なものに変わるのだ。

 ベタでクサい言葉になってしまうけど、出会いを大切にしたいと思った。助けたいと思うのも、好きだなと思うのも、理由なんていらないのだから。そう思ったなら、そうすればいい。


 人が社会で生きていくことという概念に対して真っ向から描いた作品だった。司の生き方が正しいとか、そういうことはない。それぞれの選択がそれぞれの人生になっていくのであって、人生に正解はないんだろう。

 私は死ぬときに、「まずまずの人生だった」と思えるならいいなと、司の人生をほんの少しだけ覗いて願ってみた。もしくは「楽しかった」かもしれない。楽しいことは大好きなんだ。

 家族計画、とても面白かった。一周するのもそこそこの体力が必要なんだけど、たまーにこの家族のもとに足を運んで泣きたいなと思える作品だった。この心に残る何かを味わってほしい。ぜひDLsiteとかGyuttoとかで買ってください。おすすめです。

 それではまた、次の記事とかTwitterでお会いしましょう。

2018年のコードを振り返る(後編)

あけましておめでとうございます!!!!

ということで続き。前編はこちらです。

7月

前半はあまり目についたコミットがなくて、後半で課題のために勢いよく書いたHow to solveというサービスが生まれた。

createElementとかappendChildとか、datasetとか使うようになってる。もうこのときには今と同じくらい書けるようになってるぽいですね。

let newLink = document.createElement("a");

8月

現在非公開の所属団体で作ってるやつのコードを書いてた。そんな事情なので例はなしです。

VueやWebpackに初めて触った。けどこのときはまだ理解の浅いところだったかも。

9月

ホームページの再制作とISUCONに出たりした。

ホームページにはJSを使ってないけど、SCSSを使って構造的に書けてるんじゃないかなとか思った。ちなみになぜかprefixが-webkit-で動いちゃってるからわからん。多分修正したほうがいい。

あと縦位置が微妙なズレでおかしくなるので、設計からやり直したほうがいいかなーと反省してる。とりあえず値決めて、ずれてたので簡単に計算して修正……みたいなことやってたけど、そもそもユーザーの目線とかいろいろ考えてみたほうが良かった。

でも線が好きという感情をようやく形に出来るようになってきたかなと思えた一歩。1月に作ったホームページにも書いたけど、『作りたいものを作れる人に』というのが大きな目標なので、今後もいろいろ取り組んでいきたいと考えてる。あと最近はデザインの理論にも興味が出てきた。『センス』って言葉で終わらせないために学びたい(すごく負けず嫌いなところが出てる)。

background: -webkit-repeating-linear-gradient(270deg,

Transparent Dream

10月

前半、Apache Thriftというやつの調査をしてた。ここで内部実装とか機械生成されたコードを読む興味深さに気がついた。知らないことを知るための技術を得た大きな一歩。

後半、Vino.jsというやつの試し書きをしてた。これもこれまでと違って、自分で新しい形を産もうとして、どういう形でライブラリを作れば使いやすいか悩んだ。

新しい仕組みを考えるために悩むというのはこれまでなかった。どうやって実装すればいいのか?という悩みから、どういう仕組みを実装したら便利だろう?という悩みに変わった。

Vino.jsについてはこちらの記事で話してます。参考にどうぞ。

11月

ここも8月と同様に非公開のやつです。サーセン

でもこのときはVueってものがリアクティブという概念の上にいるということを知ったし、それを理解しようと取り組んだ。なんというか、哲学的なレベルにまでわかったという気はないけど、こういう仕組みがやりたいんだなというのは理解できた。

たしかこの理解もVino.jsの開発を止める理由の一つになった。歴史的にたくさんの人間がたくさんの仕組みを考えて、その中から決定される事項を生み出すという労力がとてつもないということがわかったし、まずはいろいろなものを知るべきだと考えた。

というのとぶっちゃけそのサービスの制作スケジュールがやべえので手を離せないという事情がある。

12月

この月もほぼ非公開のサービス書いてた。けど、一週間だけ諸事情で作業停止したときにSubsShotStudioというのを書いた。

書き忘れていたけど、11月頃からそのサービスのフロントエンドがTSに変更され、TypeScriptHandbookToCがないことに苛立ったぼくは突然UserScriptを書いた。

んでこの直後にLTが予定されていたので、UserScriptの知見を直近で得たこともあってネタ画像作れるやつほしいなと思ったので作った。ちなみに結局これがLTのネタになった。

f:id:Marco3jp:20190101011820p:plain

やってません! 私無実です~!

f:id:Marco3jp:20190101011449p:plain

体が受け付けないんだって

ぶっちゃけコード自体はそこまで進化してなくて、夏休み明けくらいからはほぼ書いてる感覚変わってない。変わっているのはJSがTSになったこととか、ちゃんと型を意識して、適切にHTMLElementのメソッドを叩いて……という姿勢かも。

単純にMDNを(日常的に)読むことが増えて、こんな書き方あるんだって見つけたらそのまま吸収する流れが出来ているからかなーと考えている。もう新たにJSを吸う必要は少なくて、それ以上に設計とかに頭を向けたほうがいいタイミングだと思う。

それはそうと、英語版MDNから順次各言語で書かれている継承図が結構わかりやすくて好き。でもEventTargetだけは今のところ嫌い。

あと今回はリリースを活用して、cdnと紐づけておけばtampermonkeyとかで自動更新できるようになってる。結構リリース駆動を意識してみたんですが、どんどん『リリースしました』って言えるので気分がいい。割とめっちゃいい。おすすめ。

まとめ

まだTS自体には慣れていなくて、Interfaceと型(: numberなど)しか使ってないので、今後はそのあたりが課題かなと思ってます。これはもうオブジェクト指向プログラミングをしっかり理解しないとなーという課題でもある。

まあそうはいいつつ一年間ですごく成長できたと思うし、とても楽しかった一年です。ちょいちょいバックエンドでGoが出てきてるんですけど、正直理解は浅いので機会があれば知っておいて損はないなーと思ってます。(がこのあたりは時間の投資問題みたいなレベルになってくるかも)

いつも私の意味のわからん質問に答えてくれる方のおかげでここまでやってこれました。本当にありがとうございます。今後も『作りたいものを作れる人に』なるため、たくさんの『作りたい』を形にしていきます。

年度末にも振り返り記事書くかもですけど、とりあえず今回は技術的な成長を中心に書きました。ここまで読んでくださった方々、ありがとうございます。

さて、それでは、素晴らしい一年を過ごせますように。

2018年のコードを振り返る(前編)

数日前、Twitterで #今年の絵を振り返る みたいなタグが流れていたことに触発されてやります。

成長が見れて割と面白かったです。年内は前半のみ投下します。

 

1月

自分のサイト作ってました。

まだ変数名定義がvarだし、いろいろとおかしいですね。

document.getElementsByClassName("word")[0].innerHTML = htmlText;

2月

大学のバス時刻をひと目でわかるやつを作ってました。ちなみに自作のAPIもクソです。

document.getElementById("mode").innerHTML = "行き";

3月

なにもしてなかったぽい。所属団体のいろいろ(新入生関係)を処理してたぽいIssueがあったので、多分そういうことしてたんじゃないかと。

4月

学習のためにビンゴっぽいやつ書いてた。

クラスベースのコードを書こうとしたような記憶がある(本当にミニマムなコード)。割とまともになり始めた?

JUDGE_ELEMENT.insertAdjacentHTML('beforeend',listhtml);

5月

時間割を見れるやつ作った。indexedDB使おうと思って考えた記憶がある。

コードが結構変わった。まず定義がletになってるし、querySelector使ってる。

でも実はMVCっぽい作りにしようとして失敗してる。

class Ui {
    constructor(){
        let that = this;
        let detailMode = document.querySelector(".switch-detail-and-editmode");
        let quickMode = document.querySelector(".switch-quickmode");
        let helpMode = document.querySelector(".switch-helpmode");
        ...(ry

リンク

6月

律子誕生日の企画やってた。実はコード書くのが間に合わず、可動してない。

fetchAPIを使う過程でpromise解決出来るようになったぽい。あと前回よりはまともにMVCしてるかも。未だに理解してるか怪しい。

fetch(endpoint).then(function (response) {

NW-A50シリーズのDAC機能について

※随時更新。特に技術的な部分は学習と検証の後に記載します。

A50シリーズについて

ソニーが作る超有名音楽プレイヤーであるWalkmanの入門帯(20k~30k程度)、Aシリーズの最新モデル(2018年10月発売)。ちなみにこの下には、バッテリーの長さなどの利便性を追求したSシリーズがある。

フルデジタルアンプ「S-Master HX」を搭載し、音源のアップスケーリングを実現する「DSEE HX」など、従来Aシリーズ通りの機能を全体的に揃えている。他にもBluetooth環境向けに、ソニーが自社で開発している「LDAC」コーデックに対応。

音作りについては各地家電量販店で聴いてみるといいかもしれません。ここのインタビューでも挙げられている通り、結構低音が主張してきます。高音に集中したいという方には向かないと思います。

特筆すべき機能

ガジェヲタというわけではないんですが、以下の機能が面白いです。

それぞれ取り上げていきます。

Bluetoothレシーバー機能

名前の通り、Bluetoothのレシーバーになります。

スマートフォンからBluetooth対応イヤホンにつなぐように、Walkmanとつなぐことができるのです。もちろん出力はイヤホンジャックからとなり、先述したデジタルアンプやDSEEなどの高音質化技術の恩恵を受けることが出来ます。

注意すべき点として、受信コーデックはSBCとLDAC、AACのみとなり、aptX系は使えません(参照)。チップセットの関係か、もしくはライセンスの問題かもしれませんが気をつけましょう。

USB Audio対応

私の本命、USBAudioです。ここの項のために記事を書いたと言っても過言ではないです。

公式には、USB-DAC機能とポタアン・USB-DACアンプとデジタル接続可能という二項目をあわせていますが、ここではUSB-DAC機能についてのみ書きます

また、技術的な解説(ArchLinux環境において簡単な確認をする程度)は後日追記します。

免責事項:公式サイトには特定ソフトウェアが推奨であり、別途ドライバのインストールも必要とあるため、以下の文章はすべてサポート外です。私もサポートしません。

最初に結論から述べておくと、Windows・ArchLinux・Android *1 で動作確認が出来ました。Windowsのみ(一応)推奨ドライバをインストールしましたが、他環境では特に問題なく動きました。(Arch環境については追記予定)

USB AudioによるUSB-DAC機能においても、Bluetoothレシーバー機能と同様に各高音質化技術の恩恵を受けることが出来ます。

欠点として、おそらく500msほどの遅延が発生します。公式の過去Q&Aにもありますが、この機能は音楽専用の機能です。ただ、VLCプレイヤーなどで同期を行えば映像作品にも使えるとは思います。流石にゲームは無理ですね。

今後試したいこと

  • USB-DAC状態でBluetoothイヤホンと接続
  • ブラウザ上の音声を同期(映像を500ms遅らせる)させる

*1:MicroUSB TypeB to USB Type Aの変換あり

プリティーリズム・ディアマイフューチャーを見終えたメモ

見終えた。とても面白かった。みおん様かわいい。

第一作に見劣りしない、とても多面的な作品だと思った。

こちらも前回同様、一度で全体を俯瞰するのは難しいのでタグっぽいもので表してみる。ただ、ディアマイフューチャーはオーロラドリームよりも多面的というか、各キャラクターや各視点にフォーカスを当てることですごく大きく広がるので、その点を一旦考えず全体を見る。

  • 夢 + 未来
  • ライバル・仲間・友達

多分これくらいです。あとは本当に、各キャラクターや視点に寄っていると思います。それでいて、これらの要素が最高に重要です。

オーロラドリームでは夢という要素しか書きませんでしたが、今回は未来という要素も加算してみました。時間軸という点が結構生かされて書かれていたように思えて、今であるということがすごく重いものでした。特に終盤、青春というキーワードが何度か出てきましたが、これがディアマイフューチャーというタイトルにもつながっている気がします。

それと、オーロラドリームよりも強調されたライバルであり仲間であり友達であるという関係性。特に今作は同チームではなく、本来利益を共有しない別チームでした。けどそんな利益とかどうでもいいんですよ。みんなをハピラキにすること、それだけが何よりも大事なことだったのです。そしてそれは、自分たちもハピラキでなければいけません。

なんかちょっと頭の中がまとまりきってないので、良かったセリフをひとつだけ上げます。

みんなが進む道は明るいって、未来は美しく輝いているって、あたしたちが言わなきゃ誰が言うんだ!!! (50話)

なんていうんでしょう。すごく自分の背中を押してくれるというか、勇気をくれるセリフです。それはもう自分にとっての使命であるという論調が、自分もこう言いたいと思わせてきます。私もやらなきゃいけない、私がやらなければ誰がやるんだ。私にしか出来ないんだと。

あとは29話とか、48,9話とかもすごく好きなセリフがあるので見ていただきたいです。

二週間?ほどで計100話くらい見たんですけど、本当に二作とも面白かったです。もちろん考察とかしなくても、子どもたちのように歌と踊り、ストーリーに魅了されても面白いですし、各キャラクターや視点にフォーカスして解釈・考察していくのも興味深いです(割と細々とした解釈が多めでTwitterに投げてたりします)。ディアマイフューチャーについては、割と阿世知欽太郎について読み解きたいなと思わせてきます。

もう朝が近づいてまいりました。おやすみなさいませ。それはそうとみおん様めっちゃかわいくないですか。かわいい。

Vino.js開発日記 その1

お久しぶりです。Marcoです。ブログっぽい記事を書くのは久しぶりです。

今回は私が今開発中(厳密には構想・設計中)のVino.jsについてダラダラと書いてみようかなと思います。

Vino.jsとは

Vino.jsとはVisual Novel JavsScriptの略で、ビジュアルノベルを作るためにめんどくさい部分を解消したいとの思いから考案されました。

五つの柱

  • 製作時のめんどくさいを解消すること
  • 最低限動作させるのは簡単であること
  • フラグ・パラメータの管理手段を提供すること
  • 様々な表現に対応できる柔軟性を持つこと
  • 仕組み上の不可能をなくすこと

ライブラリ制作が初めてなので、どういった思想のもとで作るかというのを定めた五本の柱を考案しました。

基本的に、この方針に従って制作を進めていきます。

五本目について補足

不可能をなくすというのはOSをも作れるようにという意味ではありません。

例えばシナリオを遡る演出であったり、スタイルを大きく変化させるもの、Webという環境を活かすもの、それらを『Vinoの仕組みじゃ不可能だよ』と言いたくないのです。そういう思いを込めた方針です。

開発言語

いやあ、JavaScriptで書こうと思ったんですけど、TypeScriptになる可能性が高いかなと思います。

軽くJSで書いた感じ、自前Objectを展開しまくるので、JSDocでどうにかするよりTSを採用したほうがいいかなという理由です。

他プロジェクトでTSを採用する予定も出てきたので、自分自身のリソース的にも悪くない選択じゃないかなと思います。TypeScript HandbookにToCを付けるスクリプトを書いたりして、結構いい環境も作れたと思います。

予定図

全体の構造は現在考え中なので次回あたりのブログで書こうかなと思うのですが、ざっくり言えばオブジェクト直下にオブジェクトやらfunctionやらおいていくという具合です。

表示のために使われる値などはPrivateで定義され、基本的に触れることができないようにします。

柔軟性を持つという点が一番の悩みどころです。イベントを提供したり、コールバック関数を持たせることを可能にすることなど検討していますが、いろいろ調べている限りまだ知識不足なところだなと感じていて、調査に時間がかかりそうです。

脳内にある仮案処理フロー

  1. Vinoが実体化される
  2. 引数から設定やパラメータ、storyScriptなどを展開する
  3. VinoEcosystemのイベントを生成する
  4. 生成終了のイベントが発火する
  5. Vinoが動くためのイベントを登録する
  6. innerBoxなどを描画する処理が走る
  7. 遷移イベントが発火する
  8. ユーザー提供のメソッドが実行される*1
  9. 遷移メソッドが実行される
  10. 以降7~9の繰り返し
解説

3~4はPromiseによって管理され、5~6が非同期に処理されます。

7については、ユーザーがEventLockをかけることで一旦処理を止めることが出来ます。これは4のあと、イベントリスナーを登録し終えるまでの間に遷移イベントが発火してしまうことを防ぐものです。(((ロジックは未定です、こんな具合にしたいなというものです。ProxyによってSet時の処理を置き換えちゃうとかでもいいんですかね。あともちろん、内部ではVinoのイベント登録待ちも用意します)))

7~8がどのような処理になるか未調査です。useCaptureフラグが有効になっていても、何らかの非同期処理が走ってしまうことで順序が異なってしまうことも考えられます。その場合はまた別途検討する必要があると思います。

あとはユーザーの挟み込む処理->Vinoの処理……という具合で動きます。基本的にイベントはsectionの切り替わりごとに発生します。若干心配しているのは、従来のシステムを完全に覆すような、破壊的な挙動をするゲームを制作することが担保できないことです。

案としては、Vinoの処理を行わないようにするAdvanceOptionを用意して、描画周りのAPIを触れやすいように作るというものを考えています。Event bubblingも軽く読んでみたんですが、第二の柱を維持するのが難しいかなという印象です。発火->UserMethod->VinoMethodの流れが固定になりますからね……。

まだまだ予定だらけで、MDN読みながらこんな案もいいななんて考えている最中なので、今後大きく変更したり、新しい仕組みを提案することもありえます。開発日記なので、こういう経緯も残していければいいかなと。

個人的な文章

難しいな。難しい。考えるの難しい。でも楽しい。

どんな仕組みでJSを活かしたら使いやすいかな?と思っても、他人のコードをたくさん読むこともなくて、ライブラリに触れた経験もあまりなくて、ほんとに独学で突き進んでいくしかないんじゃないかって思ってしまう。ようやくJS歴一年の記念パーティーを開催するというような時期がきた。不安に思うことも仕方がないんだ。そうだ。

まあ仕事ではないし、私の脳内にある夢地図をぶつけていけばいいと思うと少しは気が楽になる。まさしくこれは私の夢地図のような存在だ。私が知っているJavaScriptを活かす作りと、こんな感じでゲームが作れたらいいなと思う願いを詰め込んでいる。プリティーリズムを三日連続でずっと見ていたせいで、想いを心に閉じ込めておくことは出来なくなっているみたいだ。文章にしてしまいたくなる。

それでも、周囲の方々と違ってコードを書く以外に浮気ばかりしていまう人間なので、作業時間の確保というものが難しい。これは精神的なところとか、自己管理的なところなので、もう技術の面ですらない。多分、今一周年を迎えているのもこれが理由じゃないのかなあ。何か長く続くってことが自分にとって珍しいことなのだ。お恥ずかしいことに。

まあダラダラとこれ以上書き連ねていても、私が大好きな私の文章を量産するだけになってしまうので、このあたりで切り上げよう。

次回はJavaScriptにおけるイベント周りの勉強をしてから書こうと思う。それはそうと、流石にそろそろ働かないとまずいなと思うのでまたバイトを探すことにしなくては……。

読んでいただきありがとうございました。文章書くのは最高に楽しい!

*1:useCaptureをtrueにすることで先に実行されます