[Swift][Elixir]implement chat server and client

Implement Chat Server with Phoenix and chat client with iOS application. Server https://github.com/KazuCocoa/my_chat_ex/tree/master After running the server, you can open chat page, http://localhost:4000/, via browser. The server has no DB. So, history will be deleted if someone reload browser. Client https://github.com/KazuCocoa/WebSocketDemoForiOS/tree/master connect to http://localhost:4000/socket/websocket as websocket Only join the room and send pre-set message to…More

[Elixir]Channelを使った実装とテストコード

Phoenixは、WebSocketを提供するためにChannelという機構を持っています。少し探せば色々参考になるコードもあるのですが、テストコードも書いてみたのでここに備忘録としてのせておきます。 Pathの設定 Phoenix v1.2 の時点では、以下の通り endpoint.ex 内でWebSocketのコネクションを成功させるパスとその処理先を決めます。 https://github.com/KazuCocoa/my_chat_ex/blob/master/lib/my_chat_ex/endpoint.ex#L4 例えば、 とした時、 /socket にWebSocketで接続を確立するとその処理先は MyChatEx.UserSocket、 /socket/other に対しては MyChatEx.OtherSocket が処理先になります。 WebSocketの確立では、transportの指定が必要です。このtransportの指定により、Phoenix Frameworkでは処理対象がWebSocketか、Long pollingかを判定します。 これは、 user_socket.ex におけるChannel Routesの指定箇所で合わせて処理されます。具体的には、以下のようにwebsocketを指定します。 これにより、最終的には以下のパスが構築され、このパスへのWebSocketの通信がそのまま MyChatEx.UserSocket などの処理へ通されます。 このパスは、たとえばChromeのinspectionにより確認可能です。 Channel Channelにおける内部処理は use Phoenix.Channel によるコールバックの実装で最低限は実現可能になります。同期的に通信する応答や、非同期で行う通信など。 https://github.com/KazuCocoa/my_chat_ex/blob/dc536e573c9b01d313cc4aaad89cf76208a8da13/web/channels/my_room_channel.ex Channelに対する認証 このChannelには、認証をかけることが容易に出来ます。これをうまく使うと、WebSocketの確立なども認証されていないものは弾く、という処理が容易に可能です。 https://github.com/KazuCocoa/my_chat_ex/blob/dc536e573c9b01d313cc4aaad89cf76208a8da13/web/channels/user_socket.ex#L24 https://github.com/KazuCocoa/myChatEx/blob/dc536e573c9b01d313cc4aaad89cf76208a8da13/web/router.ex#L28 Test code Channelに対するテストコードは以下 https://github.com/KazuCocoa/myChatEx/blob/dc536e573c9b01d313cc4aaad89cf76208a8da13/test/channels/my_room_channel_test.exs 最後に Elixir x Phoenixにて、このようなWebSocket実装などをBEAM VM上に構築できるというのは良いですね。それに特化した形でフレームワークのサポートもしていますし。More

[Elixir]diff of struct against elixir 1.2.6 and 1.3.1

pattern match with struct Structでもpattern matchingすることができる [Kernel] Allow variable struct names when matching, for example, %module{key: “value”} = struct __struct__ __struct__ が補完候補に出てこない。けれど、使うことは可能。 Elixir 1.2.6 Elixir 1.3.1 ただし、Elixir1.3.1でも、 と使うことは可能。More

[Elixir]Calendar Type in Elixir 1.3

in Elixir 1.3, calendar type was introduced. Usually, we use except for NaiveDateTime in application layer. NaiveDateTime is for developers who develop 3rd party libraries. Date http://elixir-lang.org/docs/stable/elixir/Date.html Time http://elixir-lang.org/docs/stable/elixir/Time.html DateTime http://elixir-lang.org/docs/stable/elixir/DateTime.html NaviDateTime http://elixir-lang.org/docs/stable/elixir/NaiveDateTime.html Developers should avoid creating the NaiveDateTime struct directly and instead rely on the functions provided by this module as well as the…More

Learn Deep Learning with www.udacity.com

Googleが公開しているdeep learningのコースを学ぶことにした。実務よりな知見として。 私の基礎は、大学院までで学んだcomputer scienceと、最近だと人工知能学会から出版された深層学習を読んだくらい。 Stanfordの Courseraが有名どころぽいですが、モデル自体を学んで作るより、TensorFlowをなぞりながら学ぶ方が今の私には適度かなと思いましたので、こちらから。学術的なところも必要になったらその時学ぼう。 コースはこれ Deep Learning Lesson 1では、SGDをざっくり学んだ感じ。classificationとか、学習曲線の形とか、有意差(と、誤差)とか。比較的漠然と学んだ感じ。ネイピア数出たりと、数学感あって楽しかったです。ゆっくり話してくれるので、今の所英語は問題なし。 SGDって、stochastic gradient descentの省略形なのですが、省略しない形がパッと覚えられなかった… TensorFlowについているExampleも順に解いていくとちょうど良い感じぽい。 Pythonに慣れないとな感… 数年前に少し触れた程度だ… 普段、Ruby/Elixir/Erlangを手軽に使う言語として触れていると return を忘れてしまう… Java/Swift/ObjCの感覚で書かないとね。 Python、return必要だった… — KazuCocoa (@Kazu_cocoa) June 19, 2016 TensorFlowのforked repository: https://github.com/KazuCocoa/tensorflow/tree/my_practiceMore

[Android]Try Espresso Test Recorder

AS2.2 Preview3がリリースされましたね。その中で、個人的に待っていたEspresso Test Recorderが実装されたので試してみました。 https://sites.google.com/a/android.com/tools/recent/androidstudio22preview3available 生成されたコードはこちら。 This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters Show hidden characters package com.kazucocoa.droidtodo; import android.support.test.espresso.ViewInteraction; import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4;…More

[Android]Dive into Toothpick

過去の調査に加えて、Toothpickに潜ってみました。 簡単なまとめ @inject アノテーションが付いている要素を、 scope.getInstance(); したクラスでinjectionして利用することができる。 inject可能な要素は木構造で表現され、親scopeに含まれる要素をinjectしたメソッド/クラスとして利用することができる scope外の要素を使おうとするとクラッシュ bind(IFoo.class).to(Foo.class) で Foo.class を使い回すことができるし、 bind(IFoo.class).to(new Foo()) では都度新しいinstanceを生成して利用可能 ActivityやFragmentといったライフサイクルに対して Toothpick.openScopes(getApplication(), this) してscopeを設定した場合、そのライフサイクルの onDestroy のタイミングでそのscopeをcloseする必要がある Scopeはアノテーションベースでも独自で設定できる 導入 ライブラリとして利用するための導入は こちらのWiki に任せて省略。 例えば、以下のFooクラスに対してinjectしようとします。 この時、scope.getInstance(Foo.class) したら、そのクラス内でこの Foo.class でinjectされている Foo、Bar、setQurtz を @Inject で指定して使い回すことが可能となります。 ついでに bind に関して少し触れておきます。以下のようにbindすると、 それぞれのケースにおいて以下のようになります。 case1 では、すでにFoo.class のインスタンスが存在するならそれを使い、それをIFoo.classに紐付ける case2 では、常に新たな Foo.class のインスタンスを使い、それをIFoo.classに紐付ける Scopeの種類 Scopeの種類としては2つ存在します。 a binding 都度、bindされるたびに新しいインスタンスとして利用される 子要素では親要素を上書き可能 bind(IFoo.class).to(Foo.class); みたいな感じで都度bindされるやつです scoped…More

[Elixir](UndefinedFunctionError) function List.Chars.to_charlist/1 is undefined or private with Elixir 1.3.0

https://github.com/elixir-lang/elixir/releases/tag/v1.3.0-rc.0 Elixir 1.3.0では to_char_list がsoft deprecatedになり、 to_charlist にリネームされました。 そのため、例えばelixir 1.2.x以前でビルドしていたバイナリが存在している状態で 1.3.0 で 再ビルドなし でコマンドを実行した場合、エラーが発生します。 例えば、 Doctest の場合、以下のようなエラーが表示されました。 これを解決するには、 _build を削除して再ビルドすればOK。この逆もありました。注意が必要ですね。 あと、もう1つ。ExUnitに標準で describe/2 が入ったことは良いですね。1段のコンテキストの分離はだいぶグルーピングに使えそう。 shouldi を使わなくても良くなりそうです。 注意が必要。More

[Android]ToothpickでTree Based DI

最近、Tree Based DIツールのToothpickを知りました。 https://github.com/stephanenicolas/toothpick このメンテナは、RoboGuiceをメンテしていたGrouponの人です。RoboGuiceの更新を見に行った時にたまたま見つけました。ここ数ヶ月で作り上げられたDIライブラリのようです。このリポジトリWikiのあるページに、AndroidにおけるDIの歴史や経験をまるっと学ぶことができて良かったです。 https://github.com/stephanenicolas/toothpick/wiki/FAQ#why-creating-toothpick- さらには、彼らがRoboguiceからDagger1/2と触れた上でこのToothpickを作るに至った流れも書いています。 まだWikiと簡易サンプルをさっと眺めた程度なのですが、備忘録がてら。 AndroidでToothpick Toothpick自体はJavaのTree Based DIです。これ単体ではAndroidはサポートしていません。Androidをサポートするために、smootheがあります。 このサンプルにあるように、Toothpickはsmoothieを介してAndroidにDIを提供します。 幾つかのDIツールとの速度比較 Roboguice4/Dagger1/Dagger2/Toothpickのinjectionするメソッドの個数による速度差が以下の通り。 https://github.com/stephanenicolas/toothpick/wiki/Benchmark#benchmark-raw-data Androidの環境でいうと、injectionするメソッド数が1000個超えるとかな大規模なものになることはまだそこまで多くはないはずなので、速度としては申し分ないのではないでしょうか。 初期設定では一部reflectionを使っている 以下の通り、default設定ではfactoriesの読み込みやmember injectorsを読み込むにあたりreflectionを使っているらしいです。 https://github.com/stephanenicolas/toothpick/wiki/Configurations ただ、このreflectionはOFFにすることができるそうな。そのためには以下の通りToothpickを使う時に reflectionFree の設定を与える必要があるとのこと。これにより、完全にToothpickはreflectionなく動作し、高速になると。 ベンチマークはこちら => ★ 確かに、reflectionの有無で何倍も速度差がでますね。ここら辺の積み重ねで性能差が大きく出てきそうな。 scopeにより意図しないクラッシュを避ける Scopeという概念を入れることで、Scopeに属さないfragmentなんかを意図せず読んだ時にクラッシュする、というような不用意なinjectionを回避できるようにしているそうな。ここはまだこのツールの中身を追ってはいないのでなるほどなという感じ。 あと、ここなんかでは、メモリリークに対するこのツールの見解といったところも記述されています。 締め まだざっとWikiなんかを眺めただけで中身を追ってはいないのですが、tree based DIが、学習コストがあまり高くなくとも比較的容易に使えるライブラリなのであれば結構有力なDIの選択肢になるのではないかなと感じています。個人的には、toothpickにはテストコード向けの機能も提供しているので、テストコード書くにあたってもかきやすいものであればなお嬉しいなという感じです。シンプルにinjectionするモジュールの関係性や使い方を理解して使えるのであれば、内部品質向上へ大きく寄与するし、テストコードを描きやすいのであればクラッシュや機能不全などの外部品質の担保にも寄与できると期待できるためです。 ちなみに、過去、私はDagger2を学んでいました。このBlogの過去のDagger2関係 => 検索 その中でDagger2を使ってテストコードのDIによるテストも書きはしたのですが、そんなに簡単に書けた!というほどでもなかった記憶が。。。 ともあれ、Dagger2と同じくらいには使い方などを追ってみようと思っています。(少し気長に…)More