Riot.js を使ってみた

少し前ですが、ちょっとウェブアプリケーションを作る機会があったので使ってみました。

Riot.js とは

http://riotjs.com/ja/riotjs.com

A React-like user interface micro-library の謳い文句通り React ライクなライブラリです。つい最近 v3 がリリースされたみたいです。私が使ったバージョンは v2.5.0 でした。公式のガイドで大枠を掴んだら examples で具体例を見ることができます。

Riot.js でウェブアプリケーションを作る

Riot は MVC でいう View のためのライブラリでありフレームワークではありません。アプリケーションを作る際には自分で枠組みを考える必要があります。

tag の分類

React (Redux) ではコンポーネントを Presentational components と Container components に分類する考え方があるようなのでこれを取り入れてみました。前者は表示のみを行うステートレスな (= 状態を持たない) コンポーネントで、後者はそれらに具体的なデータを与えるステートフルな (= 状態を持つ) コンポーネントです。

qiita.com

今回は各画面のルートコンポーネントのみを Container Components とし、残りはすべて再利用可能な Presentational Components として実装しました。

ディレクトリ構成

以下の構成としました。

    .
    ├── config
    ├── public
    │   ├── assets
    │   │   └── images
    │   │   └── js
    │   │       └── bundle.js
    │   └── index.html
    └── src
         ├── stores
         └── tags
             ├── components
             ├── containers
             └── mixins
  • src/

    Riot の tag は tags/ に配置しています。汎用的な機能はミックスインにしておいて各々の tag から利用しています。 stores/ にはバックエンドの API と通信を行う処理全般を配置しています。

  • public/

    画像などの静的ファイルを配置しています。 assets/js/bundle.jssrc/ 配下のファイルをコンパイルしたものです。

  • config/

    config のための JSON を配置しています。

ビルド

ES5 で書いているのでトランスパイラ (Babel) は使っていません。タスクランナー には gulp.js を使用しました。

  1. configconfig/ から設定を取得して src/stores/ 内の API の URL を置換
  2. riotsrc/ 配下のファイルを public/assets/js/bundle.jsコンパイル
  3. superstatic でサーバを立てて public/ のファイルを配信
  4. run-sequence で 1 から 3 を 順番に実行

上記のような task を作って gulp run で実行できるようにしています。また、開発中は都度コンパイルするのが面倒なので gulp.watch()src/ を監視して変更があったらリコンパイルするようにしていました。

感想

View のためのライブラリとして見たとき Riot は学習コストも少なく扱いやすい印象でした。 tag は見慣れた HTML / CSS / JavaScript が集合しただけのものなので、初見でも心理的抵抗が少ないように思います。共同で作業したデザイナ (非エンジニア) も 10 分ほどの説明ですぐに理解してくれました。ただウェブアプリケーションを作ろうと思ったとき参考になる情報が少なくて苦労する場面も多かったです。同じ View のためのライブラリである React には FLUX というアーキテクチャがあり、そのポピュラーな実装として Redux があります。 Riot でもそのあたりの話が多くなるとよりユーザが採用しやすくなるのではないかと思いました。

Swagger 仕様を複数ファイル出力する goa プラグイン Multiswagger を作った

作りました。

github.com

goa とは

Go でマイクロサービスな Web API を作るためのライブラリです。

github.com

goa の DSL で design と呼ばれる定義を書いたら、 goagen というジェネレータを使ってサーバやクライアントなど各種のコードを生成することができます。日本語だと @ikawaha さんによる連載記事が非常にわかりやすくてオススメです。

ikawaha.hateblo.jp

Multiswagger とは

Swagger 仕様を出力するための goagen のプラグインです。 goagen に内蔵されているデフォルトの Swagger ジェネレータと互換性がありますが、Description() という DSLJSON のとき、そのキー毎に Swagger 仕様を出力します。

apidsl.Description(`{
    "key1": "value1",
    "key2": "value2"
}`)

例えば上記のような design を入力としたとき

swagger.key1.json と swagger.key1.yaml

description: value1

が、 swagger.key2.json と swagger.key2.yaml

description: value2

が出力されます。

i18n のために各言語の説明を書いてそれぞれ別のファイルに出力する、という使い方が考えられます。

apidsl.Description(`{
    "en": "This is an english description.",
    "ja": "これは日本語の説明です。"
}`)

というか他のユースケースが思いつきませんでした🤔

非常にニッチなコードですがよければ使ってみてください。

golang: goa 勉強会で発表してきた

発表してきました。

connpass.com

春頃から goa を使ってきて自分なりのノウハウが溜まってきたところだったので、このような場で発表させて頂けてありがたかったです。スライドのボリューム不足を心配していたんですが 20 分というのは思ったよりも短くて、結果的には少しオーバーしてしまいました。 (すみません ...) もしまた発表する機会があったらもっとペース配分に気をつけようと思いました。

How I create a Microservice using goa - Slideck

他の方の発表も実践的な内容が多くて勉強になりました。使ったことないライブラリを知れることは勉強会に参加する意義のひとつですね。

参加した皆さま、特に主催の @ikawaha さんお疲れさまでした。

ほんと骨身に沁みますね。

2016 年上半期振り返り

カンファレンス

せっかくゴーコン行ったのに書き忘れてたなぁ ...

Go Conference 2016 Spring gocon.connpass.com

OSS

半年で 13 件のプルリクエストを出しました。

Search · author:tchssk created:2016-01-01..2016-06-30 · GitHub

数字にするととても少なく感じるなぁ。下半期はもう少しやりたいですね。

後半は GitHub - goadesign/goa: Design-based microservices in Go がほとんどだったけど、これはとても気に入っているので今後も貢献して行きたいと思っています。日本ではあまり使われていない (ような気がする) けど、ドキュメントの翻訳でもしたら利用者増えるだろうか。

仕事

twitter.com

ツラい。

Shibuya.go#2 に行ってきた

先週にGopher Night に行ったばかりですが、また Go のイベント (Shibuya.go#2) に行って来ました。

shibuyago.connpass.com

RDBを叩くだけのRuby製バッチプログラムをgoにしただけで20倍速くなった件

by ajiyoshi さん (Voyage Group)

https://dl.dropboxusercontent.com/u/31719381/shibuya.go.pdf

Ruby のバッチを Go にリプレースした話。ORM は使わず variadico/scaneosql.Rows.Scan() する関数を生成しているということでした。構造体にメソッドを生やすときは埋め込みじゃなくてユーザ定義型でも大丈夫な気がした。

type Int struct {
    sql.NullInt64
}

func (i Int) Method() {
// Do something.
}

じゃなくて

type Int sql.NullInt64

func (i Int) Method() {
// Do something
}

こういう感じ。

Slackのプロキシサーバ( github.com/cubicdaiya/slackboard )をGoで書いた話

by cubicdaiya さん (Mercari)

speakerdeck.com

Slackboard という Slack 用プロキシサーバの話。 Warning や Critical みたいに通知レベルを設けて出力時に色をつけられるのが便利そうでした。

stretcherの実装について

by fujiwara さん (Kayac)

speakerdeck.com

Pull 型のデプロイツール Strecher の話。ちょうどデプロイ周りのスクリプトを綺麗にしようと思っていたので興味深々でした。「実装について」とタイトルについているだけあってコードの細かい話が多かったです。知らないライブラリやコードの書き方がいくつかあって、非常にお得感のある発表でした。

Redisの調査についてとrmlp (LT)

by Konboi さん (Kayac)

speakerdeck.com

Redis の調査のノウハウとログ整形ツールの話。 LT だからというのもあると思いますが非常にテンポのいい発表でした。ときどき小笑を挟んで来てズルい。

Sparc Solaris向けにGoのクロスコンパイル環境を作った話 (LT)

by snowcrush さん

https://tanstaafl.0pt.jp/slides/solaris-gccgo/

Go のサポートに Solaris は含まれているが Sparc は含まれていないらしいです。珍しい環境だと情報も少なくて大変そうでした。Solaris ユーザはいますか、という問いかけに手を挙げたのは 1 人だけ (!) でした。

イベント全体の感想

会場のみならずピザと飲み物まで提供して下さって Voyage Group さんは太っ腹ですね。広々としたシンプルな会議室でしたが、エントランスや他の部屋は装飾が施されていてオシャレな雰囲気でした。機会があれば覗いてみたいですね。

Gopher Night #1 に行ってきた

Eureka さん主催の Gopher Night #1 に行って来ました。

eure.connpass.com

社内の画像変換サーバーを Goで置き換えた話

by ieee0824 さん (Livesense)

www.slideshare.net

仕事のコードを Go にリプレースしたという実践的な内容でした。画像関係のライブラリなども紹介されていました。何をするにもだいたい既にライブラリがあるということで、 Go はライブラリがない、というのはもう過去の話ですね。

ExcelとGo

by shibukawa さん

www.slideshare.net

Excelスプレッドシートから Go のコードをジェネレートする話。ネタといいつつもちゃんと AST 取得したりしている凝り様。どこの会社にも何人かいる Excel エキスパートおばちゃんが Gopher 化する可能性を期待させる LT でした。

asynchronous workloads via beanstalkd

by Louis さん (Orb)

スライド見つからず。 beanstalkd でキューイングするライブラリの話でした。

DB.SetConnMaxlifetime()

by methane さん (KLab)

docs.google.com

sql/database のコネクションプール周りのパッチがマージされるまでの経緯を説明されていて個人的にすごく面白かったです。 この機能は Go 1.6 から入っているらしいので試してみようと思いました。 (まだ 1.6 にしていないのでまず upgrade しなければ ...)

SensorBeeのご紹介

by disktnk さん (Preferred Networks)

スライド見つからず。 SensorBee という IoT 向けのストリーム処理エンジンの紹介でした。途中、ラブライブの映像に笑い男を合成するデモがあり、当日一番とも言える盛り上がりを見せました。

例えば、正規表現を避ける

by songmu さん (Hatena)

例えば、正規表現を避ける

正規表現は便利だけど strings パッケージの関数などで代替できる場合も多いという話。これは普段から心がけているので頷いてしまう内容でした。後半はコマンドラッパーの horenso について。これは cron などで実行するコマンドをラッピングしてレポーティングを行うコマンドだそうです。便利そうなので今度使ってみようと思いました。

go-plugin の紹介

by morikawa さん (Eureka)

スライド見つからず。 hashicorp/go-plugin のコードリーディングをした感想という感じでした。冒頭、 hashicorp 嫌いな人いたらすみません、という前置きで笑いが起きました。みんな大好き hashicorp 。

イベント全体の感想

写真を撮り忘れてしまったのですが、会場となった Eureka さんのセミナースペースは広くて綺麗でした。ただ私の尻が薄いこともあって椅子の座面の固さがちょっと辛かったです。発表では Gopher くんの可愛さに触れている方が多く Gopher くん (と Go) 愛されてるなと思いました。Eureka さんは Go を盛り上げようと色々イベントを企画されていて素晴らしいですね。 Go 盛り上がってる ʕ◔ϖ◔ʔ

f:id:tchssk:20160318132045j:plain

2015 年振り返り

転職

とにかく今年はこれなくして語れない一年でした。とあるプロジェクトにアサインされたのをきっかけに前職の SIer を続けていく気持ちが完全に途切れてしまい、 1 月から転職活動を始めました。利用したのは CodeIQPaiza という、いわゆるコード転職を実現するサービス。私は Java プログラマだったので両方とも Java でエントリしたのですが、嬉しいことに数十件スカウトが来て、最終的にはその中の一社に入社しました。

Go

転職後は主に Go を書いています。 Java プログラマだった者としては、オブジェクト指向とは違う (と私は思っている) Go の考え方に最初は戸惑いましたが、今ではかなりお気に入りの言語になりました。入社したとき既に本番で稼働していた Java のシステムを Go にリプレースしたのがハイライトでした。

DevOps

気付いたら CI ツールの導入を主導する立ち位置になっていました。あと社内で Git の質問に答えたりしているうちに社内 Git おじさんと化していました。

社外活動

OSS

何件か Pull Request を送りマージされました。来年はもっと貢献していきたいです。

ISUCON

会社の同僚と記念参加。予選敗退してしまいましたが、思っていたよりも悪くないスコアだったので、来年出ることがあれば決勝の緊張感を味わってみたいです。

カンファレンス

Docker Meetup Tokyo #5 くらいしか行けず。 Go Conference 2015 Winter の抽選に外れてしまったので来年こそは GoCon 行きたいです。

Advent Calendar

Vim Advent Calendar 2015Go その2 Advent Calendar 2015 にエントリしました。 Vim の記事に予想外のはてブが付き、社内の人に「見たよ」と言われる事案が発生しました。

総括

Life changing な一年になりました。自分の望んでいた仕事ができるようになり、とても充実しています。

来年の豊富

もっともっとコードを書く。