月 の 上

やりたいことをやるために、やりたいことをブログに書く

今年の抱負です。

今週のお題「2019年の抱負」

目次

去年は忙しかった

去年は後半妙に忙しくて、ずっと何かのイベントの準備で追われていた。 数えたところ、1年で11回も東京に行っている……

日付 内容 イベント 場所
4/28 講師 SPEKTRA 京都 MTRL KYOTO
5/11 VJ SMTP++ 京都 cafe la siesta
6/1 転職
6/10 結婚式
6/30 VJ POD 京都 FORUM KYOTO
7/7〜7/15 新婚旅行 コペンハーゲン/ヘルシンキ/タリン/上海
7/28 VJ POD 京都メトロ
8/27 VJ ADIRECTOR チャネル 表参道 DOLLHOUSE
9/15 VJ InfiniteRave 渋谷Cast
11/2 講師 MUTEK.jp お台場 日本科学未来館
11/10 VJ Algorave Osaka 大阪 Club Stomp
11/23 VJ Nodefest 2018 東京 Yahoo! Japan オフィス
12/1 講師 TokyoDemoFest 2018 東京 アーツ千代田 3331
12/8 講師 GLSL School 2018 東京 茅場町 Co-Edo

イベントが多いのは歓迎なんだけど、向こうからやってくるイベントを捌いてるだけで一年が終わってしまい、自分で考えて行動する、ということがあまり出来なかったな〜。

今年は、自分が何をやりたいのか、何をやるべきか、ちゃんと考えたい。 そのためには、文章としてのインプット・アウトプットを増やさないといけない。

インプット/アウトプットを増やす

読書量を増やす

去年は全然本を読めなかった。 有給消化期間にガッと3冊くらい読んだんだけど、それ以降は何を読んだかも覚えていない……。

razokulover.hateblo.jp

この記事に書かれている、「読書で知識が増えることで人生が面白くなる」というのは実感として持っていて、常に本を読みたいとは思っているんだけどなあ。

最近、CGやアート系の人々と接する事が増えたんだけど、彼/彼女らと話していると、自分の知識があまりにも足りてなく、議論のステージに立つことすら出来ていないな、と感じることがある。 これまではずっと「技術書メイン + その他サブ」というスタンスで情報を摂取していたけれど、これからはどちらもバランスよく学んでいかないといけない。いや、これまで疎かにしてきた分、しばらくは技術的でない分野について重点的に学んだほうがいいのかもしれない。

手始めに、冬のあいだは自転車ではなくバスで通勤して、待ち時間に本を読むことにした。 これで読書を習慣づけられると良いなあ。

考えた事をブログに書く

僕は考えた事を文章にしたりするのが苦手だ。 このブログもほとんどは技術的な内容か、制作物、またはイベント出演の紹介になっている。

でも、最近何かを作ったり、行動を人に伝えるには、結局考えていることを文章にまとめる能力が必要なんだなあ、ということをひしと感じている。 というわけで、今年は技術記事ではなくて、考えていることをブログにたくさん書くようにしたい。 なるべくハードルは低く、日記レベルでもいいので。

まずは週一くらいを目標に書けるといいな。

映像屋としてやりたいこと

制作を、やる

去年はだいたい2ヶ月に1回くらいのペースでVJをやってきた。 そのうち、ジェネ系のVJは4回、だったかな?半分くらい。

ジェネ系VJでは、素材やシステムを都度作ることになる。 規模にもよるんだけど、大抵は短期間で作り、同じパフォーマンスは2度しないという、インスタントなアウトプットになりがちだ。

8/27のADIRECTORチャネルでは、システムも映像ソースも1ヶ月かけてガッツリ作る事ができた。 技術的な挑戦にとどまってしまったという反省はあるものの、2018年を通じて最も手応えのあるアウトプットが出来たと思っている。

あんなふうに、しっかりと腰を据えて、自分の持てる物をぶつける制作を、今年はやっていきたい。 VJだけではなくて、映像制作的なことにも手を出せると良いのだけど。

また、去年は個人宛オファーの大部分が講師業だった。 それ自体はとても有難く、自分のプラスにもなるんだけど、なかなか新しい事を学ぶリソースが確保しづらいという問題がある。 もちろん講師業のオファーは大歓迎!なんだけど、軸足はつねに作る側に置いておきたい。

VJネタをストックする

普段からシェーダーで遊んだり、VJの仕込みをしていて生成したアニメーションをTwitterにポストしている。 手軽にアウトプットできるという利点はあるんだけど、高解像度で書き出してなかったり、コードも消失してしまっていて、せっかく色々作っているのに再利用できていない。

年末にVJの皆様が「今年作ったVJネタまとめ」みたいな物をシェアしていて、悔しい思いをした。

今年は、制作したものを何らかの形で残しておいて、VJや映像制作で再利用できるようにしたい。 まずは仕組みを作らなきゃな……昔作ったwebgl-studyを使い回すか……?

映像屋として名前を売る

まずはポートフォリオを作り直したり、リールってやつを作ってみたい。 個人名義での名刺も、今年こそ作らなきゃ。ビカビカな奴つくりたいな。

人間としてやりたいこと

家族を大事にするため、この先3年の身の振り方を考えないとなあ。 これからも色々変化がありそうだし。

Hubotで英語学習bot作った

f:id:amagitakayosi:20181127144718g:plain

どうも天城です。最近は戸籍について悩んでます。

きょうは英単語を覚えるためのSlack botを作ったので紹介します。 Slackの #dictionary に英単語とその意味をメモしておくと、トランプ大統領が定期的にクイズを出題してくれる。

もくじ

前回までのあらすじ

blog.gmork.in

TOEICではいい点数とれたけど、まだまだボキャブラリーが無いのでもっと勉強したい。

我が家では以前からSlackを利用しており、Hubotでを洗濯やゴミ出しのリマインダーを作っていた。 このSlackに #dictionary に単語をメモしていたのだが、このbotを利用して単語クイズができればいいな〜ということを思いついた。

単語学習サービスは既にAnkiなどがあるが、様々なデバイスでデータを共有するのが大変そうなのと、新たにツールを導入するのは面倒なので、既にあるHubotを利用することにした。

仕組み

HerokuでDBといえばPostgresだけど、無料だと10000行までという制約がある。 実際困る事はないかもしれないが、なんとなく制限のことを考えるのがめんどい。 HerokuのAdd-onは他もだいたい無料だと制限があるので見送り。

というわけで、今回はGoogle Spreadsheetを使うことにした。 Google Spreadsheetなら200万セルまでらしいので、1単語に5セル使っても400000単語まで記録できる。

API周りの処理は、node-google-spreadsheetを利用した。 Google謹製のgoogleapisというのもあるけど、前者のほうが認証周りがシンプルそうだった。

github.com

事前にSpreadsheetで以下のようなシートを作成しておき、botが記録/閲覧できるようにしておく。

f:id:amagitakayosi:20181127153932p:plain

サービスアカウント作成

botがSpreadsheetにアクセスするためには、Googleダッシュボード上でサービスアカウントを作成する必要がある。 詳しい手順はこの辺を参照。

https://github.com/theoephraim/node-google-spreadsheet#service-account-recommended-method

サービスアカウントを作成できたら認証用データの入ったJSONがダウンロードされる。 JSON内のメールアドレス、プライベートキー等は、Herokuの設定画面などから環境変数に入れておくとよい。

f:id:amagitakayosi:20181127154226p:plain

記録部分

特定の形式のメッセージが来たらスプレッドシートに記録する。 今回は以下の形式を採用。

*america* 
アメリカ

Hubotレポジトリの /scripts に以下のスクリプトを保存すると良い。 doc.addRow() を呼ぶだけで行を追加できて便利。

const GoogleSpreadsheet = require('google-spreadsheet');
const p = require('pify'); // promisify

// 認証周りのデータ
const doc = new GoogleSpreadsheet(process.env.SPREADSHEET_KEY);
const creds = { 
  client_email: process.env.SPREADSHEET_CLIENT_EMAIL,
  private_key: process.env.SPREADSHEET_PRIVATE_KEY,
};

// メッセージにマッチする正規表現
const re = /\*?([^\n\*]+)\*?\n(.+)/;

module.exports = (robot) => {
  robot.hear(re, async (res) => {
    let m = res.message.rawText.match(re);
    if (m) {
      // メッセージから英単語と意味を抽出
      const english = m[1];
      const japanese = m[2];

      // 認証
      await p(doc.useServiceAccountAuth)(creds); 

      // スプレッドシートに保存      
      p(doc.addRow)(1, { english, japanese })
        .then(() => res.send('OK, saved.'))
        .catch((e) => res.send('ERROR! Try again.'));
    }
  });
};

クイズ部分

こういう感じでSpreadsheetから単語を取得して

const GoogleSpreadsheet = require('google-spreadsheet');
const p = require('pify'); // promisify

const doc = new GoogleSpreadsheet(process.env.SPREADSHEET_KEY);
const creds = { 
  client_email: process.env.SPREADSHEET_CLIENT_EMAIL,
  private_key: process.env.SPREADSHEET_PRIVATE_KEY,
};

// 認証
await p(doc.useServiceAccountAuth)(creds); 

// 行を取得
const info = await p(doc.getInfo)();
const rows = p(info.worksheets[0].getRows)({}));

// セルのデータを取得
const words = rows.map(r => ({
  english: r.english,
  japanese: r.japanese,
}));

こういうのでSlackに発言すればよい。 send.trump はメッセージ送信部分のラッパー。

module.exports = async (robot, room) => {
  send.trump(robot, room, '@channel 今から皆さんに、英語に関するクイズを出すピィ〜♪\n');

  // 単語を取得
  let rows = await sheet.getRows();
  rows = shuffle(rows);

  for (let i = 0; i < limit; i++) {
    const r = rows[i];

    send.trump(robot, room, `*${r.english}* は何という意味でしょう?`)
    await sleep(5000);
    send.trump(robot, room, `正解は \`${r.japanese}\` でした!!\n.\n`);
    await sleep(5000);
  }

  await sleep(1000);
  send.trump(robot, room, 'お疲れ様!!今日も一日頑張ろうヾ(๑╹◡╹)ノ"');
};

実際には、同じ単語は3回までしかクイズに出ないようにしたり、一日の出題数を制限したりしてる。 大量にあると疲れてしまうので……


今回のbotは単語帳サービスみたいなものなので、英語に限らず何でも記録出来ます。 ことわざとか技術用語の学習に使ってもいいかも。

f:id:amagitakayosi:20181127153707p:plain