guntamania

キャッチアップ中

[2018-09-12 水]

かなり職場で暇になってきたので、いろいろキャッチアップを行っている。 何かしらアウトプットできればいいのだけれど。

忘れずに何をキャッチアップしたかリストアップしておこう

Webフロントエンド

WebはVue.jsを少しやったのと、Typescriptをやっていた。 Typescript使って、Chrome用の拡張を作れるらしく、 それをやっていたのだが、Chrome APIのほうが難しいのであった。

TypeScriptで簡単にChrome Extensionを作る方法 | Qiita

これで一個アウトプットできればいいなと思ったんだけど、 思ったものができる直前で飽きてしまった。 あんまりTypescriptっぽく書けていない気がする.. もうちょっと世のコードを読むべきかもしれない。

そもそものモチベーションとしては、TypeScriptが人気になってきたことだ。

TypeScript finally joins the TIOBE top 100 | jaxenter

たんなるAltjsなのにねえ。 これからこの分野は発展していくのだろうか。

Android

Androidアプリを最近まともに書いてなかったので、割とちゃんと書いている。 Kotlinでチャットアプリを書いているんだけど、 ついでにRailsのActionCableも使いたかったので、 必然的にRailsアプリもキャッチアップ中。 認証とかも真面目にやっている。

今どきはFirebaseなんだろうけど、まあ、いきなりFirebase使うより、 いろいろ幅が広がっていいんでない?って感じで。 そういやRealmもいいってきいたなあ。 これもさっくり調べてみるか。

ActionCableとAndroid

[2018-09-13 木]

AndroidでActionCableをサブスクライブしたい。 ActionCableはRailsで用いられるPush通信のライブラリだ。 中身はWebSocketだから、Androidでもサブスクライブできるはずだ。

で、調べてみると以下の記事がヒット。

ActionCableをAndroidからOkHttpで使ってみる | Qiita

そのものズバリの記事なんだが、OkHttpのバージョンが違うのか、 うまくいかない。 OkHttp本家のgithubのサンプルを見てみると、以下のようになっていた。

OkHttpClient client = new OkHttpClient.Builder()
    .readTimeout(0,  TimeUnit.MILLISECONDS)
    .build();

Request request = new Request.Builder()
    .url("ws://echo.websocket.org")
    .build();
client.newWebSocket(request, this);

WebSocketEcho.java | github

WebSocketCall call = WebSocketCall.create(client, request); から変化しているようだ。どうも古い書き方なのか。

その後、上記のgithubをコピーして進めるものの、 404が返ってきて先へ進めない。

どうやら

Request request = new Request.Builder()
    .url("ws://echo.websocket.org")

の箇所が ws から http へ変換しているようなのだ。また、同様に wsshttps に変換されている。 つまり wss://sample.com から https://sample.com へ わざわざ変換してしまっているのだ。

なぜそんな実装が‥ そのため、404がかえってきている気がする。

ライブラリに手を入れてみたものの、いろいろやってもうまくいかない。

諦めて以下を使うことにした。

actioncable-client-java | github

これも名前はそのものズバリだが、はたして。

ActionCableまとめ

[2018-09-29 Sat]

あれからほどなくしてチャットアプリの試作は完了した。 単純に文字に起こすのを面倒くさがって、 記録に残すのが今日になってしまった(言い訳)

また、結局試作に終わってしまい、世に出すようなものには 程遠い出来となった。 今は他のことに興味が写ってしまったわけだが、まあ、 サイドプロジェクトなんてのはそんなものですし(言い訳2)

で、結局前回の404エラーはなんだったかっていうと スキーマ変換が原因なのではなくて、 単純にRailsサーバの設定ミスだったらしい。

config/environments/production.rb 内に以下を追加した。

config.action_cable.disable_request_forgery_protection = true

リクエストフォージェリがデフォルトで禁止されているんだけど、 それを解除する設定。

まあ、本番環境だと危険なんで、例えばapi配下だけこれを有効にするとか、 そういう配慮は本当は必要なんだけど、まあ、今回はそういうもんだし、 ということでどうか。

あと、そういや、これも必要なのかもしれない。

config/routes.rb

mount ActionCable.server => '/cable'

ただ、ローカル環境では、これつけなくても動いていたので、 本当に必要かは未調査。

で、成果物は以下

ActionCableをAndroidでサブスクライブする試作アプリ。 一応Rails側も実装している。

以下でサーバ側は稼働している。

https://dammy-chat-server.herokuapp.com/users/sign_in

やっぱりというか、なんというか、ActionCableをRailsで扱うのは 結構楽ちんなんだけど、それを外部でも使おうとした瞬間に 中身わかってないわけだから、結構苦労するなあと思った。