検索
リンク
タグ
ASP.NET
.NET
ASP.NET MVC
F#
Visual Studio
Azure
ASP.NET Core
ライトニングトーク
Plone
AJAX
Selenium
C#
jQuery
ADO.NET Entity Framework
SQL Server
JavaScript
LINQ
WebMatrix
EFCore
Fizz-Buzz
カテゴリ
最新の記事
最新のコメント
記事ランキング
最新のトラックバック
以前の記事
2023年 01月 2022年 12月 2022年 11月 2022年 10月 2022年 09月 2022年 08月 2022年 07月 2022年 06月 2022年 05月 2022年 04月 2022年 03月 2022年 02月 2022年 01月 2021年 12月 2021年 11月 2021年 10月 2021年 09月 2021年 08月 2021年 07月 2021年 06月 2021年 05月 2021年 04月 2021年 03月 2021年 02月 2021年 01月 2020年 12月 2020年 11月 2020年 10月 2020年 09月 2020年 08月 2020年 07月 2020年 06月 2020年 05月 2020年 04月 2020年 03月 2020年 02月 2020年 01月 2019年 12月 2019年 11月 2019年 10月 2019年 09月 2019年 08月 2019年 07月 2019年 06月 2019年 05月 2019年 04月 2019年 03月 2019年 02月 2019年 01月 2018年 12月 2018年 11月 2018年 10月 2018年 09月 2018年 08月 2018年 07月 2018年 06月 2018年 05月 2018年 04月 2018年 03月 2018年 02月 2018年 01月 2017年 12月 2017年 11月 2017年 10月 2017年 09月 2017年 08月 2017年 07月 2017年 06月 2017年 05月 2017年 04月 2017年 02月 2017年 01月 2016年 12月 2016年 11月 2016年 10月 2016年 09月 2016年 08月 2016年 07月 2016年 06月 2016年 05月 2016年 04月 2016年 03月 2016年 02月 2016年 01月 2015年 12月 2015年 11月 2015年 10月 2015年 09月 2015年 08月 2015年 07月 2015年 05月 2015年 04月 2015年 03月 2015年 02月 2015年 01月 2014年 12月 2014年 11月 2014年 10月 2014年 09月 2014年 08月 2014年 06月 2014年 04月 2014年 03月 2014年 02月 2014年 01月 2013年 12月 2013年 10月 2013年 09月 2013年 08月 2013年 07月 2013年 06月 2013年 05月 2013年 04月 2013年 03月 2013年 02月 2013年 01月 2012年 12月 2012年 11月 2012年 10月 2012年 09月 2012年 08月 2012年 07月 2012年 06月 2012年 05月 2012年 04月 2012年 03月 2012年 02月 2012年 01月 2011年 12月 2011年 11月 2011年 10月 2011年 09月 2011年 08月 2011年 07月 2011年 06月 2011年 05月 2011年 04月 2011年 03月 2011年 02月 2011年 01月 2010年 12月 2010年 11月 2010年 10月 2010年 09月 2010年 08月 2010年 07月 2010年 06月 2010年 05月 2010年 04月 2010年 03月 2010年 02月 2010年 01月 2009年 12月 2009年 10月 2009年 09月 2009年 07月 2009年 06月 2009年 05月 2009年 04月 2009年 03月 2009年 02月 2009年 01月 2008年 12月 2008年 11月 2008年 10月 2008年 09月 2008年 08月 2008年 07月 2008年 06月 2008年 05月 2008年 04月 2008年 03月 2008年 02月 2008年 01月 2007年 12月 2007年 11月 2007年 04月 2007年 03月 2007年 02月 2007年 01月 2006年 11月 2006年 10月 2006年 09月 2006年 08月 2006年 07月 ファン
ブログジャンル
画像一覧
|
2016年 12月 27日
Selenium と WebDriver"Selenium" とは、Web ブラウザをプログラムから "操作" できるようにする、主には自動化テストの実現などの目的で使用されるソフトウェア/ライブラリである。そして "Selenium WebDriver" とは、個々の OS/ブラウザ種類に応じて提供される、ブラウザ操作の終端を担うプログラムを指す用語である。 自分の場合、対象 OS は Windows で、且つ、以下の Web ブラウザに対応した Selenium WebDriver にかかわる機会がある。 - Microsoft Edge (MicrosoftWebDriver.exe) - Internet Explorer (IEDriverServer.exe) - Google Chrome (chromedriver.exe) - Mozilla Firefox (geckodriver.exe) WebDriver の新バージョンリリースをタイムリーに捕捉したいさて、詳細は割愛させていただくが、とある経緯から、上記の Selenium WebDriver プログラムについて、新バージョンがリリースされたら最大で1日程度のタイムラグを目安に、その新バージョンリリースを知る必要がある、という要件に迫られた。もちろん、自分が手作業で毎日先述の URL をブラウザで開いて目視でチェック、というやり方は除外。 どうにかコンピュータプログラムの力で解決したい。 ということで、各 WebDriver について、IT/プログラミングの力でどうやすれば新バージョンリリースを知ることができるか調べてみた。 FireFox 用は楽勝Mozilla Firefox 用の Windows 用 Selenium WebDriver "geckodriver.exe" は、開発元の GitHub リポジトリにて、"Release" としてアップロードされるようだ。幸い、GitHub の Releae ページは、その URL の末尾に ".atom" を足せば、同ページの内容が Atom フィードとして入手できるとの情報を得た(下記 URL)。 https://github.com/mozilla/geckodriver/releases.atom そこで自分の場合は "IFTTT" サービスを利用し、上記 Atom フィードについて新着更新があった場合は自分のメールアドレスに通知を送るように IFTTT を設定しておいた。 他にも Feedly をはじめとした RSS reader を利用してもよいだろうし、Release に限らず種々の通知を受け取って構わないならば単純に GitHub リポジトリの "Watch" を On にしておくだけでもよいだろう。 というわけで、以上で FireFox 用の WebDriver のリリースを検知する体制は整えることができた。 IE、Chrome の WebDriver はちょい面倒...Internet Explorer と Google Chrome 用の Windows 版 Selenium WebDriver (各々IEDriverServer.exe と chromedriver.exe) はそれぞれ下記 URL でアクセスできる Amazon S3 ストレージに格納されている。- https://chromedriver.storage.googleapis.com/ - https://selenium-release.storage.googleapis.com/ 上記 URL に HTTP GET 要求を送ると、XML 形式でストレージの収録内容が返ってくる。 但し返される XML のスキーマは Amazon S3 のもの。 Atom フィードをはじめとした公共(?)の規格ではない様子である。 いろいろ思案した限りでは、どうやらこの XML を何らかのプログラムで定期的に取得・監視して、新バージョンのリリースを検知するほかなさそう、との結論に至った。 Edge 用は構造化されたデータがない...さらには Microsoft Edge 用の Selenium WebDriver、"Microsoft WebDriver" であるが、こちらは、下記 URL のダウンロード用 Web サイトがあるのみ。XML や Atom フィードのような、構造化されたデータとしては入手可能な感じではなかった。 https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver となると残される道は、上記 URL で入手できる HTML コンテンツを、何かしらのプログラムによってどうにかスクレイピングしてリリース情報を抜き出すほかなさそうだ。 実装手段は?さてさて、ではでは、どういう形で先述の XML や HTML を定期的に監視し、新バージョンのリリースを検知して自分に知らせるようなプログラムを作成・運用できるだろうか?やり方は本当にいろいろあると思う。 24時間通電稼働させている自宅サーバーで cron で監視プログラムを定期実行とかもありだろう。 しかし自分は サーバー構築とかまっぴら御免なタイプ(!) なので、できれば SaaS、せいぜい頑張ってパブリッククラウドの PaaS で何とかしたい、と考えた。 そこで目を付けたのが Azure Functions だ。 Azure FunctionsAzure Functions とは、別途構成された URL への HTTP 要求だとか、cron のような時間による指定とか、Blob に何か追加されたとか、そういった "トリガー" によって起動され、ある一定の処理上限時間やメモリ消費量制約のもと、自分で作成した小さなプログラムコード = ファンクション (関数) が実行されるという、ある種の PaaS である。Microsoft のパブリッククラウドサービス「Microsoft Azure」に含まれる機能・サービスのうちのひとつだ。 "サーバーレス" という文脈で語られ、「Amazon Lambda の Azure 版」といえば通じる方もいるかと思う。 自分の場合は Azure の Web Apps サービスによる Web アプリ配置に慣れていることもあり、Amazon Lambda ではなく Azure Functions で実装してみることにした。 Azure Web Apps 上に自作 Web アプリを立てるのと比べると...Azure Web Apps でも同様のことは実現できる。自分で立てた Azure Web Apps 上の Web アプリにて、所定の URL に HTTP GET 要求が届いたら監視/リリース検知処理を実行するようにしておき、この URL に対して SetCronJob (https://www.setcronjob.com/) などで定期的に HTTP GET 要求を送るようにしてもよい。 しかしながら Azure Functions で作っておけば、課金が Web Apps とは違い、「その Web アプリを稼働させてる時間」ではなく、「トリガーによって所定のコードが起動され、終了するまでの時間とメモリ消費量」及び「実行回数」に対して課金されるため、 フトコロに優しい のだ。 さらに、 コード内容が「やりたいこと」に集中 できる。 自分の場合、得意なプログラミング言語が C# なので、Azure Web Apps 用に Web アプリを作るとなると ASP.NET という選択になる。 そうなると「Web.config がー」「URL ルーティングの登録をー」といったコード類を記述せざるを得ない。 その点、Azure Functions であれば、コードの "型" が決まっている代わりに、その定型コードの中身を埋めるかたちで自分のやりたいことを記述していくので、本来やりたいこと以外の余計なコードの記述量が各段に減るのだ。 実装結果ということで実践してみた結果がこちら。https://github.com/jsakamoto/WebDriverUpdateDetector 実装のプログラミング言語 - C# スクリプトを選択Azure Functions では、ファンクションの実装・記述に使えるプログラミング言語として、C# はもちろんのこと、他にも- Bash - Batch - F# - JavaScript - Php - PowerShell - Python といった豊富な選択肢から選べる。 自分の場合は、先述のとおり得意なプログラミング言語は C# なので、C# (より厳密には C# スクリプト、という形になる) でファンクションを実装することにした。 実装内容としては、Edge用・IE用・Chrome用にサブフォルダ x 3つに分け、サブフォルダごとに新バージョンリリースを監視/検知するファンクション ("Run.csx") を配置してある。 Edge用・IE用・Chrome用のいずれのファンクションでも同じ内容となる共通コードは、それらサブフォルダと並べて Shared サブフォルダを用意し、こちらに .csx ファイルとして収録。 Edge用・IE用・Chrome用の各 Run.csx からは「#load "..\Shared\SendMail.csx"」のように記述して、これら共通コードの .csx を読み込むようにした。 リリース情報コンテンツの入手と解析各 Run.csx 内では、冒頭で解説した URL から XML 及び HTML を HTTP GET で入手。入手した XML・HTML を解析して、それらコンテンツに掲載されている、目的の WebDriver ファイルの最新バージョン番号を読み取るようにした。 IE 用と Chrome 用は、Amazon S3 による XML で構造化されたデータが取得される。 この読み取った XML を LINQ to XML で内容探索する実装とした。 Edge 用はそのような構造化された状況とは言えない HTML コンテンツであった。 そこで真面目に HTML として解析することはやめて、その HTML コンテンツを単純な巨大な文字列として扱い、正規表現検索で WebDriver ファイルのダウンロードリンクを探索する実装とした。 NuGet パッケージの追加指定の URL から XML や HTML を HTTP GET で入手するために System.Net.Http NuGet パッケージの追加が必要になったりする。そのように必要となる追加の NuGet パッケージは、各サブフォルダ内の project.json に記述しておく。 起動条件などファンクションの構成起動条件や出力結果などは、同じく各サブフォルダ内の function.json で指定する。今回の要件は cron よろしく時間に基づいて定期的に実行したいわけだが、その内容を function.json に記載するわけだ。 とくに実行時間については、毎日、UTC 時刻にて 0:00 と 12:00 の1日2回の実行としてみた。 通知手段新バージョンリリースを検知した際の通知手段は e-mail での通知とすることにした。もちろん、Slack 等のチャットシステムに Bot よろしくテキストを送信することもできるだろう。 「今時メール~!?」みたいなことも言われた。 けれど人それぞれ色々背景理由があるのであって、詳細は面倒くさいので割愛するが、自分の場合は e-mail による通知が最適だったので、このような選択とした。 しかしこの実装を進めていた当時、Azure Functions における実行結果としての SendGrid API との連携方法などがよくわからず、結局 System.Net.Mail.SmtpClient による古典的なメール送信で実装した。 今ならば、SendGrid API と連携させる方法については下記を参照されるとよいかと思う。 Azure Function Appから定期的にメールを送る http://qiita.com/superriver/items/d245539b7652b7512f9b 状態の保存あと、新しいバージョンのリリースを検知するため、"前回チェックまでにおける最新バージョン" という「状態」を保存する必要に迫られた。「Functions に状態持たせるの~!?」と白目をむかれたこともあるが、要件と先述の利点とを考えると別に悪い選択ではないと思うのだが...どうなんでしょう...。 ...さておき、状態の保存/復元である。 これまた未だにそのような用途での何らかの記憶域との連携方法がわからず、最終的に Azure Table Storage を読み書きする実装とした。 なお、Azure Table Storage の読み書きにあたっては、Azure Functions だからといって特別なことはない。 普通に project.json に必要な NuGet パッケージを記載し、.csx ファイルに普通に Azure Table Storage の読み書き処理を記述するだけである。 アプリケーション構成値状態保存のための Azure Table Storage に接続するアカウント情報や、SmtpClient によるメール送信時の SMTP 認証情報といった情報は、.csx ファイル中に書いてはいけない。代わりに、Azure ポータルページ経由で「アプリケーション構成」に設定しておき、.csx 内からは ConfigurationManager.AppSettings 経由で読み取るべきだ。 この点は Azure Functions もその土台は Azure App Services ベースということで Web Apps のポータル画面と操作感は変わらなかった。 下記の過去記事も参考までに。 ASP.NET Web アプリで、APIキーなどの "秘密のキー" をどこに保存するべきか? http://devadjust.exblog.jp/20400427/ 成果この Selenium WebDriver 新バージョンリリースの監視/検知システム、11月末頃から本格稼働を始めた。以来、これまでに計2回ほど、IE 用 x 1回と Chrome 用 x 1回、の新バージョンリリースを検知している。 おかげて1日以内での新バージョンリリースを把握できるようになった。 しっかりと当初目標・要件を満たすことができ、満足である。 ※Microsoft Edge 及び Mozilla Firefox に関しては、2016年11月末以降現時点まで、まだ新バージョンがリリースされた実績がない。 課金かれこれ1ヶ月ほど運用したわけだが、課金のほうはいかほどかというと、この1ヶ月でざっくり、¥30 以下。 課金の内訳は、Azure Function が必要とする分と、先述の "状態保存" に使用する分の、双方の Azure Storage Account の料金がほぼすべてを占めていた。 ファンクションの実行時間/回数に関する課金は ¥1 に達していなかった。 そもそも実行時間/回数については無料枠がある。 今回のシステム程度の負荷では無料枠内で済んでしまうことだろう(下記リンク先参照)。 Functions の価格 https://azure.microsoft.com/ja-jp/pricing/details/functions/ まとめAzure Fuctions、ゆるーく1日数回の監視するような用途だと、
あと「よくなかった点」もあって、それは主に実装作業時・コーディング時におけるものなのだけど、それについては後日エントリを改めて触れたい。 そのほか、IE 用と Chrome 用に関しては、Amazon S3 での提供という形なので、もっと手抜きができる方法が実は存在するのではないかと気が気でならない。 「そんなにゴリゴリ書かなくても、ほら、こんな風にすれば新バージョンリリースの通知を受けられるよ!」 といった情報をお持ちの方がいらっしゃれば、本ブログへのコメントとか Twitter で触れていただくなど情報発信していただければ、自分の二の轍を踏む方が増えずに済むと思うのでぜひお願いしたい。 実際、@twit_ahf さんからも、Azure LogicApps/LogicFlow で実現する作例を教えていただいた。
LogicFlow で XML データを繰り返し処理する http://blogahf.blogspot.jp/2016/11/logicflow-xml.html せっかく教えてもらったのだが、自分の場合は贅沢にも、XML 全体の最終更新日での通知ではなく、特定アイテムの新バージョン出現に限って検知したく、Azure LogicApps/LogicFlow での上記作例の採用は見送ってしまったのだが、以上ご参考までに。
by developer-adjust
| 2016-12-27 22:01
| .NET
|
Comments(2)
![]()
今、Setcronjobはもう無料サービスを提供していません。 無料のcronjobサービスが必要な場合は、http://www.cronjobservices.comでリストを見つけることができます。
0
> 今、Setcronjobはもう無料サービスを提供していません
そうだったのですね。 他にも無料サービスが探せるとのこと、お知らせありがとうございます。 Setcronjob も無料サービスは提供していないとはいえ、最廉価の Silver プランで "年額で" $10 (\1,000 と数百円くらい?) なので、じゅうぶんお安いと考えられるかもですね。
|
ファン申請 |
||