Connecting to remote production node is very useful to debug or observe production. target node local node Sometimes, you should set port forwarding up to connect to target node via a particular node. References http://blog.plataformatec.com.br/2016/05/tracing-and-observing-your-remote-node/ https://mfeckie.github.io/Remote-Profiling-Elixir-Over-SSH/More
Category Archives: development
[Android]codelabsがいろいろ参考になる
最近、Googleのcodelabsを覗きながらGoogleIOであった新しめなツールの把握をしています。 https://codelabs.developers.google.com/ どのくらい時間かかりそうかも書いているし、実際経験したことある人だと表示されている時間ほどチュートリアルにも時間がかからないので効率的にざっとした内容は把握できそうな気がします。 ConstraintLayout ConstraintLayoutを試してみました。 こちら AppleのStoryBoard上でAutoLayoutを操作する感じで使えますね。 サンプルを基に、自分で少しやってみました。 https://github.com/KazuCocoa/myconstraintlayout XMLは微調整をする時以外見なくてよさそうな感じまでなると良いですね。古くからAndroidアプリ開発されている方はXMLとの対話の方がまだ効率的なのかな。 Android Testing Codelab こちら これはオマケみたいなものです。 Espressoを使ったサンプルと、MVCの説明ですね。Activityへの依存性を少なくしてテスト可能な範囲を広げるとか、interfaceを定義してその実装をstub/mockするやり方とか、そこらへんの導入が書いています。 Espresso-contrib はRecyclerViewに対して使えるメソッドを提供していたのは知ってたのですが、 DrawerActions や DrawerMatchers に対してもそうであったのですね。ここは知らなかった… (と思ったら、ATSLのページには書かれていた.. Espresso-contrib for DatePicker, RecyclerView, Drawer actions, Accessibility checks, CountingIdlingResource) あと、@SmallTest, @MediumTest, @LargeTestの説明あったけれど、社内で定めた基準とだいたい同じ感じ。 そういえば、Espressoでは、waitとか用意しなくて良いのね。Espressoのテスト、ちょっと調整しよう。 Espresso waits until the UI is idle before it moves to the next operation. Likewise, it waits for AsyncTask…More
[Swift]protocol、再び
Object Orientedではなく、Protocol Oriented(Swift)への理解を深めたい最近です。 https://www.raywenderlich.com/109156/introducing-protocol-oriented-programming-in-swift-2 の記事をざっと読みながら思ったのですが、protocolでは let の定義がつかえないことに疑問を覚えました。StackOverflowでも確かにありました。 http://stackoverflow.com/questions/34385897/why-i-cant-use-let-in-protocol-in-swift protocolは抽象インタフェースになるので、具体的な値が入りません。letはconstantな振る舞いが必要ですが、protocol自体は具体的な値はその具体化されたstructやclass、enumなどで変化するためですね。なので、protocolでは var を使う必要があります。ただ、そのstructなどのprotocolを引き継ぐ時はその先で let を使ったりできます。 なるほどね。 ちなみに、以下がprotocolとそれを使ってstructやenum、extensionした簡単な例です。protocolで { set } を指定していると、当然ながらemutableではいられないので継承した先で同名の変数は let で定義することはできません。 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…More
[Elixir]add search box
ある人に検索窓まだー?と言われたので、メモがてら軽くサンプル実装してみた。 こんなもんで良いかな… controller def search_email(conn, %{“search” => %{“query” => query}}) do result = User.search_user_with_email_ilike query <> “%” users = Repo.all(User) render(conn, “search_index.html”, users: users, assigns: result) end model def search_user_with_email_ilike(email) do from(user in User, where: ilike(user.email, ^email)) |> Repo.all end web/router.ex post “/search”, UserController, :search_email search_index.html %script function sample(users) { window.alert(users) } – form_for @conn,…More
[Erlang][Elixir]if condition in Erlang/Elixir
昨夜のElixirのifの使いかたに対しての話に参加して。メモ。 Elixirのifって、以下の通りcaseから構成されるmacroとしてKernelに定義されているのですよね。nilとfalseに一致したら else を行い、それ以外は if を行うと言う。 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 # https://github.com/elixir-lang/elixir/blob/v1.2.5/lib/elixir/lib/kernel.ex#L2321 defmacro if(condition, clauses) do build_if(condition, clauses)…More
[iOS]EarlGreyを使ってシナリオを記述する
過去、 EarlGreyが出たての頃に試してみた のですが、最近またプライベートで使ってみたので自身のために残しておきます。 対象のproject: https://github.com/KazuCocoa/MyGithubSearch 対応コミット: https://github.com/KazuCocoa/MyGithubSearch/commit/bd83bf8668260978ec6941bd8c003470c9443167 幾つかサンプルではなくて自分で使ってみて、Appiumとの使い分けやテストレベルの対応などもある程度私の中で腑に落ちた感じがしました。 EarlGreyについて EarlGreyは、XCUITestみたいに描画要素に対して何らかの操作を行うライブラリです。面白いのは、 UIView をハックしてなにか操作を模倣するのではなく、 UIAccessibility Protocolを操作する。 リポジトリはこちら。 https://github.com/google/EarlGrey EarlGrey自体の説明はあるのでここでは書きません。 セットアップ、導入 https://github.com/google/EarlGrey/blob/master/docs/install-and-run.md Swiftサンプル https://github.com/google/EarlGrey/blob/master/Demo/EarlGreyExample/EarlGreyExampleSwiftTests/EarlGrey.swift 何か困った時 使えるAPIや、使い方がわからないとか、そういう時はテストコード読んだりAPIドキュメント見るとある程度対応できます。 APIドキュメント https://github.com/google/EarlGrey/blob/1.0.0/docs/api.md Matcherの実装 – どのように動作しているか、といった説明も書かれているので、ざっと一読することをお勧めします – https://github.com/google/EarlGrey/blob/master/EarlGrey/Matcher/GREYMatchers.h – AccessibilytLabelやidentifierの他にも、Valueなど多くの要素が使えるのよいですね – ただ、 We strongly recommend using an accessibility identifier as it uniquely identifies an element. と書かれているように、やぱり accessibilityIdentifier を使うことが良いことには変わりなさそう。ここは激しく同意。 Other Tips 要素を見つけたい時 シミュレータだと、AccessibilityのAccessibility Inspectorを有効にしてそれを使うと良いです…More
Reading “Raft” – consensus algorithm
Raftという、合意アルゴリズムが存在する。これは、多数決を元にした多数派の意見を決定するためのアルゴリズムで、分散環境下における合意形成でも使える。最近、分散系の幾つかのWebサイトを眺めていると見つけた。 私は、こういう系統の技術分野は大学院の頃にByzantine General Problemを扱ってから比較的興味を持っている。 実際のツールだと、CoreOSのetcdやhashicopeのconsulなんかで使われているみたい。 Raft自体に関係するところは以下。 https://raft.github.io/ http://thesecretlivesofdata.com/raft/ 幾つかの言語で実装されているみたい。etcdではgolangぽい。 Erlang実装の1つ https://github.com/dreyk/zraft_lib Elixir実装の1つ。 https://github.com/mururu/rafute 幾つかRaftの論文のreferencesを見てみましたが、Byzantine faultなんかはやぱり参考にされていました。2014年が論文としては初出? LESLIE LAMPORT氏によるByzantine General Problemの問題は、懐かしさがある(大学院の頃によく読んでいた)。最近はご無沙汰だけれど、技術だけの話でいうとこれ系が関わる仕事はしてみたいな。 参考 http://blog.obfuscatism.net/2014/12/01/raft.html http://kumagi.hatenablog.com/entry/distributed_system_taxonomy_part4More
[Elixir]concurrent integration test with Hound and handle it with tag
雑にしか書きませんが、Phoenixのcontrollerのテストでは、あるURLへの操作に対する結果のチェックにはstatus codeが何か、そのtitle要素は何かといった簡単なHTML要素をみます。そこは静的な要素をチェックできるのですが、画面の遷移が絡んでくるとintegration testと呼ばれる段階のテストを用意する必要があります。 Elixirでは、その手のツールに以下の2つがあります。 Hound Wallaby Wallabyのほうが後発です。これはconcurrentなテストを主眼に開発されているようです。ただ、対応ブラウザがPhantomJSだけだったので、私はHoundを選びました。 そして、concurrent integration testを行うにはphoenix_ecto3.0 + Ecto 2.0を使う必要があります。これは、Ecto2.0から入ったownership制のsandbox環境を使い、concurrentなテストを実行する必要があるためです。 ※Ectoのこのownership制の話とか気になる人はこちらを読むと良いと思います。コード 設定 以下の設定説明を参考にすると、基本的なところは完了。サクッと実行できます。なのでここではリンクだけ… https://github.com/phoenixframework/phoenix_ecto#concurrent-acceptance-tests https://github.com/phoenixframework/phoenix_ecto#hound 私はfirefoxとWebDriverのstandaloneを使ってサクッと実行しました。 WebDriverはこちらからダウンドード可能です=> https://selenium-release.storage.googleapis.com/index.html tips 通常、この手のintegration testはブラウザを使うのでテスト実行が遅かったり不安定だったりします。そのため、その他のmodelやcontrollerのテストとは別に制御できるようにして、不要なときはskipするなりしたいです。 ここでは、tagを使って制御しましょう。ただ、よくあるメソッドごとに @tag をつけるのでは煩雑になるいっぽうなので、 integration_case.ex なんかを作って、それを読み込んだ全てのモジュールに対して勝手にtagがつくようなやり方です。 tagを付与する support/integration_case.ex にtagを設定する 以下のようにヘルパーを作ってあげると、 use MyApp.IntegrationCase したモジュールは自動的に @moduletag :integration のtagが付与されます。 This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than…More
とてか04で多くのものを拾ってきた
とてか04とは 『とちぎテストの会議04』が正式名称。 toRubyを主催している方々が、主に”テスト”に関わる何かを主において開くイベントです。 その中で、今回は以下の通り「つくるいとなむ」を主なタイトルとして開かれました。 http://d.hatena.ne.jp/tochigitestnokaigi/20160423 私 私は以下のようにLTの1番目として発表いたしました。 これ自体は私の普段の学び方だったり、その中で特に業務に活かすために特に疑問に感じていたことをお話し致しました。 「チョットデキル人に訊け!」ででた”テストをうまくなるには?” こちら、何が自分、ひいては周りの向上を誘うか、ですよね。私も考えてみたのですが、やっぱり以下のようにやりたいことベースでいろいろ学ぶなーと感じました。それ以外だと、業務上だったり一時の知的好奇心から、というのはちらほら。 うまくなるには、みたいな話、私なりに考えてみると結局はやりたいことあるからベースが一番強そうです。 #toteka — KazuCocoa (@Kazu_cocoa) April 25, 2016 これ以外だと、何か興味を持っていることの周辺でテストに絡めて学ぶ、というのが面白いのでないですかね。 拾ってきたもの 多くの方々とのつながり。 とてか03で初めて足を運んだとてか。そこから1年後の2回目。前回よりもいろいろな人と話をしましたし、つながりもできました。これは私にとってとても良いつながりだと感じます。ありがとうございました。More
[Elixir]Ecto.RepoのRepository Patternを見る
Mediumでたまたま Repository Pattern を見たこともあって、 Ecto.Repo を見てみました。こういうまとまっているフレームワーク見ると、手軽なデザインパターンの理解や頭の整理にもなりますよね。 Ecto.Query付近は随分前にざっと見ているので、今回は別。 [Elixir]EctoのQueryを少し読み解く ~ コードに前提条件が書かれるので読み解きやすいですね ~ Ecto 2.0から、 Ecto.Repo.first とかもdeprecatedになったので、その対応をついでにメモ。 以下の User は、 Ecto.scheme によって定義されたmodelです。それに対して、1件のemailに合致するデータを引っ張ってくるという処理です。 この Repo.first がdeprecatedなので、それをQueryを使って書き直すと以下のように書くことができます。 この時、 Ecto.Query.first の結果は以下のようになります。 ここは、実際にSQLを出す前のQueryを構築するところです。この Repo.one が実施されると、SQLが発行されてその結果がmodelの結果として得られます。以下は Repo.one まで行われた結果です。 Ecto.Query.first ではリクエストしたいSQLの構築、 Repo.one で実行と、クエリ構築とその実行が分離されていますね。 変更したdiffを合わせて置いておきます。 https://github.com/KazuCocoa/web_qa_vote/commit/4a0242455fb3b9c15d5c68d5e8e78336a2474b54More