ElixirでBinary Searchを実装してみた。メモ。 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 defmodule Search do def binary(_, []), do: -1 def binary(search, [head|tail]) when…More
Category Archives: development
[Swift]XCUITestにおけるCoverageとScreenshotの在り処
XCUITestでは、自動的にスクリーンショットを取得してくれます。それがどこに保存されるか?というと、以下のように Attachments に保存されました。保存されるファイル名に統一感がないのですが、 plist にテストケースとスクショの結びつけを保存しているのですね。テスト結果をXcode以外からうまいこと見ることできないかなーと思ってたのですが、すんなりホイとはできなさそうな感じです。 /Users/user-name/Library/Developer/Xcode/DerivedData/TestProject-randome-values/Logs/Test/Attachments あと、スクショのタイミングを任意なタイミングではできないので画像比較のためにそれを使う、というのには使えなさそうな感じです。んー。テスト失敗した時の参考になる以上ではちょっと使いにくい感じです。 ついでに、XCUITestでも、カバレッジを取得できる模様?ちゃんと計測はしていないのですが、うまいこと使えれば使えそうでした。 そのほか XCUITest、いろいろ調べてみましたが通知のダイアログなどのシステム設定をリセットする手段ないので、ちょっとテストケースの管理に難しさを感じました。 ちなみに、wait/sleepは適度にwaitしてくれるので、さほど気にしすぎなくても良いのですね。 waitUntil のようなメソッドを定義したのですが、それを使うのは限定的になりそう。retryが内包されているのはGUIから操作するテストケースではありですね。Exceptionを出す種類も、 XCTAssert 系以外にもいくつかあったのですが、ここはXCTestの頃からそのまま使っているもののようですね。 このfastlaneのsnapshotも、このXcode7(XCUITest)対応したみたいですね。 https://github.com/fastlane/snapshotMore
[Swift]SwiftでParameterized Test?
Swift2.1でParameterized Testをどう書こうか、と考えた時、以下な感じでできそうに思えたのでメモ。 parametarized() にBlockとデータセットを与えることで、そのBlockの中の要素を全てBlockにて与えた処理を行う 与えるパラメータは、 struct で定義する 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 import XCTest class xctestSampleTests: XCTestCase { //…More
[Swift]The Swift Programming Language(Swift2.1)を読んで写経して学んだ
主に、Language Guideの箇所を全て読んで、写経して学びました。Swift2.0になって段階になったと周りから聞いたし、色々と本格的に関わる必要がでてきたので、ですね。 iBookで読んだのですが、HTMLでもあるのですね。こちらから参照することができました。 基礎的な言語仕様を写経しながら学んだので、OS提供のAPIに沿って何か開発できるところまではまだやってません。ただ、Test Engineerとしては言語仕様側をある程度知っておくことは入り口として必要なのでこちらから踏み入ってたりします。 Swiftは Class は参照型(reference type)、 enum や struct は値渡し(always copied)なのですね。なるほど。 Because classes are reference types, it is possible for multiple constants and variables to refer to the same single instance of a class behind the scenes. (The same is not true for structures and enumerations, because they are always copied when…More
[Elixir]1worker、1portでリクエストを待ってHTTPのリクエストをProxyする
HerokuがErlang製のHTTP Proxyを公開しましたね。少し中身見てみたのですが、彼らもForkしたCowboyを使ってProxyを構築しているっぽい。他にも軽く読んでは見たのですが、Erlangも多少読めるようになっててびっくり。 https://github.com/heroku/vegur 話は少し変わって、[Elixir]Elixirで簡単なHTTP Proxyを書いているときに出会ったエラーのメモで、Supervisorのworkerごとに異なるportを待ち受けてそれぞれが独立したproxyとして動作する機構を書いてたのですが、PIDの衝突の発生で思った感じでできてませんでした。 でも、考えるほどにやっぱりできるはずだよなーと思いもう少しやってみました。それと、先ほどのVegurでもやっぱり異なるPortで待ち受ける処理が書いてあって、やっぱり実装間違ってるなと確信。 もう一度考え直してみると、今回は考えた通りに書いていったら期待通り動作することができました。 結局は、 Plug.Adapters.Cowboy.http に対して与えている ref の与え方が間違っていた、という情けないミスでした… リポジトリ: https://github.com/KazuCocoa/http_proxy 前回の誤り 今回 これで、例えば以下のような実装を書いたときに、Supervisorで監視される各々のWorkerが異なるProcessとPortでリクエストを待つことができるようになります。 HttpProxy.Handle のモジュールに、先ほどのCowboyの起動が実装されていることを想定しています。 修正時のコミット(ファイルの置き換えあり): https://github.com/KazuCocoa/http_proxy/commit/8b5368f15a2e149ac7069a33379e4c190cf93374 Elixir/Erlangさわりはじめて、大学の頃もでしたが、やっぱり私は分散系に対して技術的な興味を持っているのだなーと感じました。More
[Elixir]ex_topで各PIDの動作をみる
Elixir/Erlangのprocessに対してtopコマンドを実行できるライブラリ https://github.com/utkarshkukreti/ex_topMore
[Elixir]Elixirで簡単なHTTP Proxyを書いているときに出会ったエラーのメモ
追記 2015/11/08 [Elixir]1worker、1portでリクエストを待ってHTTPのリクエストをProxyする で解消済 最近、簡単なHTTP Proxyを書いてみています。Elixir/Erlangの多プロセスで動作する点を利用して、軽量なproxyとして動作できるのかなー?というところがあってです。 https://github.com/KazuCocoa/http_proxy 以下のような感じでportを指定したら、そのportに対してどんなパスでアクセスしたかで接続先を制御できる感じにしています。 Plug や Cowboy を結局は使っています。Supervisorのworkerとしてプロセスは起動するようにもしています。 この動作確認の中で、ElixirのSupervisorで複数のPlugを持つ同一モジュールを動かそうとしたらPIDの競合でエラーがでたのでメモ。少し調べてみると、それはPlugが Plug.Adapters.Cowboy.httpや Plug.Adapters.Cowboy.https をSupervisorで起動するときに :name で __MODULE__ を指定しているのが原因な気がしています。 というのも、例えばSupervisorで呼ばれたときにまず起動するここらへんで使われる、start_link で最初に呼ばれるところで ref: を与えたり、 workerで与える :id を変えても変化なかったためです。ここな感じ。More
[Elixir]GenServerのcallとhandle_callにおける:nameによる指定
GenServer.start_link __MODULE__, default, [name: __MODULE__] で name を指定することの必要性に関してメモ。 以下の通り、Sample.neko を読んだ時、 __MODULE__ にメッセージが送られてGenServerのコールバックであるhandle_call にメッセージが送られる。そのパターンマッチで処理される handle_call が決定、実際にプロセスで処理される。という一連の処理を作るために、 start_link では名前をちゃんと与えることが必要。そうでなければ、process idを直接指定しなくてはいけない。(それはあまり現実的ではない..) 関連した修正はこちら https://github.com/KazuCocoa/my_bot_ex/commit/b9be93de02e47b97a2a2e93dcbb46104ddb47004More
[iOS]XCUITestを既存サンプルコードに適用してみた
別用もあって、XCUITestをちゃんと触ってみました。 XCUITestに対して多くのプロジェクトで問題になるのって、多分既存コードに組み込むことができるか?だと思うのですよね。(私もそうです) なので、iOS6.0をdeploy targetにしているAppiumのサンプルコードを引っ張ってきて、それを7.0にあげた状態で動くか、というところから確認してみました。結果的に、アプリは7.0を保ちつつ、XCUITestはiOS9.0を対象にしてテストを回す、ということができました。Xcode8頃から怪しくなりそうな気がしているInstruments越しのUIAutomationを見ると、できるところからiOS9系だけでもXCUITestを視野に入れ始めたほうがよさそうですね。 修正したコードは以下に入れています。 git clone して、iOS9シミュレータをターゲットに設定して command + u で実行できます。 https://github.com/KazuCocoa/XCUITestExample/tree/master やったことは、 サンプルコードを取得する iOS7.0をミニマムにする XCUItestのターゲットを追加する 幾つかのテストコード書く(ついでに、accessibility付与したり、要素の結合したり) https://github.com/KazuCocoa/XCUITestExample/blob/master/TestAppUITests/TestAppUITests.swift accessibilityIdentifier や title、private methodへの切り出し くらいです。 そのほか Storyboardから、 accessibilityIdentifier を設定できるようになっていました。Storyboard中心になるのは、実装とUIを切り分けできているので良いのではないかなと思います。 ただ、動的に変化する要素に対してaccessibilityIdentifierを付与する、というのはやっぱりコード読み書き必要だし、テストコードはやっぱりSwift/Objective-Cになるだろうので、中身見ることができる人は必要、というのは変わらなくて良いのですけどね。 XCWaitCompletionHandler がwaitとしてつかえそうだったりと、Instruments越しのUIAutomationよりは、個人的に安定した並列実行とかもできるのでは?と少し期待。 これの成果物、Amazon Device Farmなんかにも適用できるかなー。 This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review,…More
[Elixir][Swift]ElixirやSwiftのprotocolなどの話
たまたま見つけて。 Comparing protocols and extensions in Swift and Elixir http://blog.plataformatec.com.br/2014/06/comparing-protocols-and-extensions-in-swift-and-elixir/ ElixirはClojureに影響されているのですね。protocol周辺の使い道。 パッと、 defimpl の対象となるタイプを思い出せなかったので以下にURLを一応。 http://elixir-lang.org/docs/stable/elixir/Kernel.html#defprotocol/2 こんな感じ。 defimpl の 第一引数のタイプ によって、どのタイプに対する実装かを示しています。 Swiftは、記事のものは古いので省略。も少しあとで。More