tag:blogger.com,1999:blog-83415915230301312992024-03-14T00:49:42.039+09:00ググれカスググればでてくることだけだとは限らない。
嘘を嘘と見抜けないと(掲示板を使うのは)難しい。akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.comBlogger70125tag:blogger.com,1999:blog-8341591523030131299.post-91447412354203260112016-09-23T20:24:00.000+09:002016-09-23T20:24:39.539+09:00PyconJP2016でライトニングトーク2回してきたお疲れ様です。<br />
<br />
今年もPyconJPに行ってきました。<br />
結論から言うとめっちゃ楽しかったです。<br />
<br />
最初はトーク枠で参加予定だったんですけど、諸事情(詳しく聞きたい方は直接聞いてくださいwwwwww)により辞退してしまいました。残念。<br />
<br />
その代わりと言ってはなんですが、ライトニングトークでそのストレスを発散してきました。<br />
思いの外すぐに枠が埋まり始めて、私がエントリーしようとした時はすでに残り2、3枠という面白い状況でした。<br />
(ちなみに<a href="http://togetter.com/li/1027521" target="_blank">これ</a>の3番目と<a href="http://togetter.com/li/1027739" target="_blank">これ</a>の4番目が私です。空気読まず2回エントリーしました。ライトニングトークって自由でいいよね。togetterの中の方、ありがとうございます。)<br />
<br />
ワークボードに所属している企業の求人情報も置いておきました。<br />
私の名刺も置いておいたのですが、何枚か取っていってくれている方もいてうれしかったです。ブロックチェーンのキャラクターmijinのクリアファイルの方が早くなくなりましたが。<br />
<br />
当日始発で大阪を出発したので、途中で眠くなる可能性をひしひしと感じていたのですが、全くそんなことはなく、面白いイベントと人間に囲まれ、人生って素晴らしいなとまで思ってしまいました。<br />
<br />
二日目昼のFintech関連の会合とPyconJP公開ミーティングも楽しかったです。<br />
<a href="http://pyconjp.blogspot.jp/2016/06/python-boot-camp-in-kyoto.html" target="_blank">Python Boot Camp</a>で講師をした時の関係者の方や、普段Twitterでしか関われない方を肉眼で拝見することもでき、年に一度のお祭りを堪能できたと思っています。<br />
<br />
Pythonにおける地方の活性化の名の下、大阪でもどんどんイベント開いていきたいなと思っています。<br />
<br />
以上です。akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0tag:blogger.com,1999:blog-8341591523030131299.post-39398271388385179472016-05-07T22:55:00.003+09:002016-05-07T22:58:44.309+09:00また性懲りもなくPyconJP 2016のプレゼンにエントリーしてみた<a href="http://togetter.com/li/884827" target="_blank">去年のあれ</a>で味をしめたので、今年もエントリーしてみた。<br />
SNSで拡散しろとのことなので、しておきます。<br />
<br />
タイトルは「<a href="https://pycon.jp/2016/ja/proposals/vote/9/" target="_blank">Pythonからクラウドサービスを使い倒して、ビッグデータを解析した話</a>」です。<br />
当日までにタイトルなどは変わる可能性あります。<br />
<br />
また選ばれたらPycon行こうと思う。<br />
でもまぁ、選ばれなくても結局行こうと思う。<br />
<br />
ちなみにPython Boot Camp(詳細は<a href="https://www.pycon.jp/support/bootcamp.html" target="_blank">こちら</a>)なるものの、講師候補になってます。<br />
縁があれば講師やってると思います。<br />
今はその授業で使うテキストを、時間みつけて作ってます。<br />
<br />
人生が楽しくなるといいね。<br /><br />
<br />
<br />
<br />
<br />
<br />akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0tag:blogger.com,1999:blog-8341591523030131299.post-90812525461326275232016-03-17T20:27:00.001+09:002016-04-05T20:58:12.534+09:00BigQuery使って困ったことBigQueryのメリットやデメリットは巷で溢れている情報なので、個々では割愛<br />
<br />
個人的に困ったのは下記のエラー<br />
<br />
<b id="docs-internal-guid-8e4fac63-844f-0b2f-a18e-3a04be36ca27" style="font-weight: normal;"><span style="background-color: transparent; color: red; font-family: "arial"; font-size: 13.333333333333332px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Resources exceeded during query execution. For more information, see https://cloud.google.com/bigquery/troubleshooting-errors</span></b><br />
<br />
<b id="docs-internal-guid-8e4fac63-844f-0b2f-a18e-3a04be36ca27" style="font-weight: normal;"><span style="background-color: transparent; font-family: "arial"; font-size: 13.3333px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">今回の場合、 主な原因としては、</span></b><br />
<ol>
<li><b id="docs-internal-guid-8e4fac63-844f-0b2f-a18e-3a04be36ca27" style="font-weight: normal;"><span style="background-color: transparent; font-family: "arial"; font-size: 13.3333px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></b><b id="docs-internal-guid-8e4fac63-844f-0b2f-a18e-3a04be36ca27" style="font-weight: normal;"><span style="background-color: transparent; font-family: "arial"; font-size: 13.3333px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">クエリ</span></b><span style="font-weight: normal;"><span style="background-color: transparent; font-family: "arial"; font-size: 13.3333px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">で</span></span><b id="docs-internal-guid-8e4fac63-844f-0b2f-a18e-3a04be36ca27" style="font-weight: normal;"><span style="background-color: transparent; font-family: "arial"; font-size: 13.3333px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">order句を利用し</span></b><span style="font-weight: normal;"><span style="background-color: transparent; font-family: "arial"; font-size: 13.3333px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">ており、検索結果の量もあいまって、リソースを大量消費したこと</span></span></li>
<li><b id="docs-internal-guid-8e4fac63-844f-0b2f-a18e-3a04be36ca27" style="font-weight: normal;"><span style="background-color: transparent; font-family: "arial"; font-size: 13.3333px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></b><b id="docs-internal-guid-8e4fac63-844f-0b2f-a18e-3a04be36ca27" style="font-weight: normal;"><span style="background-color: transparent; font-family: "arial"; font-size: 13.3333px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">クエリで外部結合をしており、検索結果が大量に存在したこと</span></b></li>
</ol>
<b id="docs-internal-guid-8e4fac63-844f-0b2f-a18e-3a04be36ca27" style="font-weight: normal;"><span style="background-color: transparent; font-family: "arial"; font-size: 13.3333px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">であった。</span></b><br />
<b id="docs-internal-guid-8e4fac63-844f-0b2f-a18e-3a04be36ca27" style="font-weight: normal;"><span style="background-color: transparent; font-family: "arial"; font-size: 13.3333px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></b>
<b><span style="font-weight: normal;"><span style="background-color: transparent; font-family: "arial"; font-size: 13.3333px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">回避策として、order句や外部結合を使用せずに、検索結果を内部メモリに保存して、モジュールのロジックにてグローピング、ソートを行った</span></span></b><br />
<br />
<span style="font-weight: normal;"><span style="background-color: transparent; font-family: "arial"; font-size: 13.3333px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">これが世に言う富豪プログラミング です。</span></span><b id="docs-internal-guid-8e4fac63-844f-0b2f-a18e-3a04be36ca27" style="font-weight: normal;"><span style="background-color: transparent; font-family: "arial"; font-size: 13.3333px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b><br />
<span style="font-weight: normal;"><span style="background-color: transparent; font-family: "arial"; font-size: 13.3333px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">早く中間テーブルを使った対策を取らねば</span></span><br />
<b id="docs-internal-guid-8e4fac63-844f-0b2f-a18e-3a04be36ca27" style="font-weight: normal;"><span style="background-color: transparent; font-family: "arial"; font-size: 13.3333px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><b> </b></span></b>akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0tag:blogger.com,1999:blog-8341591523030131299.post-57162546187493448192016-01-08T19:43:00.001+09:002016-01-08T19:43:33.163+09:00Python使って仕事してるので、pypiデビューしてみた。<br />
アップしたのは<a href="https://pypi.python.org/pypi/file_lib" target="_blank">ファイル操作のライブラリ</a>と<a href="https://pypi.python.org/pypi/cloud_lib" target="_blank">クラウドサービスのライブラリ</a>。<br />
このリンクからGitHubもたどれるので、何かあったらプルリクください。<br />
関数仕様もそこに書いてます。 <br />
これからも更新していく予定。<br />
<br />
地味にマルチバイトが関わるCSVの処理とか、クラウドサービスのPythonからの操作って<br />
メンドくさい事が多い。特に2系。boto3も使ってみたかったし。<br />
<br />
BigQueryやCloudStorage、EC2やS3の操作がだいぶ楽になるはず。。。akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0tag:blogger.com,1999:blog-8341591523030131299.post-22743381324301143142015-10-13T16:18:00.000+09:002015-10-15T07:08:24.606+09:002015/10/10にPyCon JP 2015に行って<a href="http://togetter.com/li/884827" target="_blank">プレゼン</a>してきた。<br />
名前は『なぜWeb画面自動テストはうまく行かないのか』です<br />
PyconなのにPythonの話ぜんぜんしてないけど、思いのほか反応よかったので、たぶん成功といえると思われる。
<br />
ついでに資料は<a href="https://docs.google.com/presentation/d/1cWX8fyHUl1rqhZf3eIJHu0JvyYxJLQfkBP6CTMP3sYc/edit?usp=sharing">ここ</a>akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0tag:blogger.com,1999:blog-8341591523030131299.post-66951548937448104842015-09-30T21:04:00.000+09:002015-09-30T21:04:18.690+09:00ブラウザテスト環境提供サービスの比較世の中には便利なものがあって、最近はSeleniumでブラウザを起動するための環境を<br />
手前で用意する必要は無い。<br />
ネットワークの関係か、日本から動作させるといかんせん遅いような気もするが、<br />
それでも十分なサービスが次の3つ。<br />
各メリット、デメリットつきで記述する。<br />
<br />
<ol>
<li> CrossBrowserTesting</li>
この3つのサービスのうち、一番安定して動作している気がする。ただし、起動できるブラウザの種類が少なく(Androidデフォルトブラウザのテストができない!)、ChromeやFireFoxの最新版も導入されるスピードが遅い。UIもシンプルだが低機能。ほかの2つと違って、テストのステータスを取得するAPIも存在しない。
<li> BrowserStack</li>
最新ブラウザに 対応し、直感的でわかりやすいUI、APIを伴っている。チュートリアルもわかりやすい。ただしIPhoneやAndroidの動作がいかんせん不安定。<br />
<li> SauceLabs</li>
全てにおいて及第点。 </ol>
<ol> </ol>
お勧めはSauceLabs。もちろん現時点ではの話。<br />
<br />akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0tag:blogger.com,1999:blog-8341591523030131299.post-92055646693367958232015-03-22T07:28:00.002+09:002015-03-22T07:28:42.135+09:00requestsでurlに同一キーの複数パラメータを付与する方法pythonの<a href="http://requests-docs-ja.readthedocs.org/en/latest/" target="_blank">requests</a>モジュールは<a href="http://docs.python.jp/2/library/urllib2.html" target="_blank">こういう</a>めんどくさい人たちに比べてかなり使い勝手がいい。<br />
でもでも、urlのパラメータをdictで指定する(<a href="http://qiita.com/sqrtxx/items/49beaa3795925e7de666#4-1" target="_blank">参考</a>)ため、同一キーのパラメータは指定不可能<br />
だと思っていた。<br />
<br />
で、もやもやしている日曜の早朝に、<br />
<br />
\ __ /<br />_ (m) _ ピコーン<br /> |ミ| <br />/ `´ \<br /> ( ゚∀゚)<br /> ノヽノ |<br /> < < <br />
ってなって、実際に試してみたら、出来たので、共有がてら。<br />
<br />
結論から言うと、配列で渡せばいい。<br />
<br />
例)<br />
query = {<br /> 'hoge': 'hoge1',<br /> 'huga': ['huga1','huga2']<br /> 'fuge': True<br /> }<br /> r = requests.get('http://testhost/test.json', params=query)<br /> orint r.url<br /> >>u'http://testhost/test.json?hoge=hoge1&huga=huga1&huga=huga2&fuge=True <br />
<br />
<br />
こんな感じ。<br />
今あるソース全部書き換えたい。。。akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0tag:blogger.com,1999:blog-8341591523030131299.post-38901289934188288812015-02-13T21:40:00.000+09:002015-02-25T21:36:21.722+09:00Pycharmが素敵すぎる件Pycharmからnoseを使った単体テストを実行できるので、<br />
日本語の情報がなかったので、備忘録として。<br />
<br />
File→setting→tools→Python Integrated Tools→{対象プロジェクト}→Default test runner<br />
<br />
ちなみにここからrequirements.txtの場所も指定できる。<br />
<br />
また、他のプロジェクトのソースを参照したい場合は<br />
<br />
File→setting→project→project Dependencies<br />
<br />
から指定出来る <br />
<br />
<br />akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0tag:blogger.com,1999:blog-8341591523030131299.post-46706527139681426242015-01-12T12:43:00.003+09:002016-03-17T20:19:45.147+09:00Pythonとスレッドモジュールの速度改善を行うために、Pythonで行うthread処理について調べることになった。<br />
<br />
<span id="goog_218608346"></span><a href="https://www.blogger.com/"></a><span id="goog_218608347"></span>どうやらJavaみたいにクラスを分割だけではなく、<a href="http://ja.pymotw.com/2/threading/" target="_blank">メソッド単位でスレッドかできるらしい。</a><br />
<br />
同時に複数スレッドからlistにpushしたりpopしたりするものも、独自に作成する必要は無く、<br />
<a href="http://momijiame.tumblr.com/post/38303376206/python-threading-condition" target="_blank">いい感じにロックをかけてくれるものもあるらしい</a>。<br />
<br />
シンプルなものになると<a href="http://ja.pymotw.com/2/Queue/" target="_blank">こんな感じ</a>。<br />
<br />
Pythonって便利。akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0tag:blogger.com,1999:blog-8341591523030131299.post-4354660356894001812014-09-14T13:26:00.001+09:002014-09-14T13:26:06.379+09:00boot2docker起動時のエラー最近、仕事で仮想環境にかかわることが多い。<br />
その時に詰まったことを共有する。<br />
<br />
<br />
<a href="http://knowledge.sakura.ad.jp/tech/2322/" target="_blank">ここ</a>を参考にして、boot2dockerをインストールして起動すると、エラーが発生した。<br />
<br />
error in run failed to get machine "boot2docker-vm": exec:
"%VBOX_MSI_INSTALL_PATH%;C:\\Program
Files\\Oracle\\VirtualBox\\VBoxManage.exe": file does not exist<br />
<br clear="none" />
error
in run failed to initialize machine "boot2docker-vm": exec:
"%VBOX_MSI_INSTALL_PATH%;C:\\Program
Files\\Oracle\\VirtualBox\\VBoxManage.exe": file does not exist<br />
<br />
結論から言うと、環境変数:VBOX_INSTALL_PATHを<br />
"%VBOX_MSI_INSTALL_PATH%;C:\\Program
Files\\Oracle\\VirtualBox\\VBoxManage.exe"<br />
から<br />
"%C:\\Program
Files\\Oracle\\VirtualBox\\VBoxManage.exe" <br />
に修正すると回避できた。<br />
<br />
boot2dockerの中身を見てみたが、観光変数が『;』で区切られている場合の考慮がされていなかった。<br />
<br />
まだまだ荒いところはあるけど、dockerっていいよね。 akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0tag:blogger.com,1999:blog-8341591523030131299.post-80608742312275930312014-03-06T11:05:00.002+09:002014-03-06T11:21:08.257+09:00seleniumからブラウザを起動するときのオプション情報1.キャッシュやクッキーをクリアした状態でIEを起動する方法(Ver.2.35から可能) <br />
<br />
<br />
DesiredCapabilities ieCap = DesiredCapabilities.internetExplorer(); <br /> ieCap.setCapability(InternetExplorerDriver.IE_ENSURE_CLEAN_SESSION, true);<br /> WebDriver driver = new InternetExplorerDriver(ieCap);<br />
<br />
こんな感じ<br />
<br />
2.marionetteのFireFoxを起動する方法(Ver.2.34から可能) <br />
<br /> System.setProperty("webdriver.firefox.marionette", "true");<br />
WebDriver driver = new FirefoxDriver();<br />
プロファイルやバイナリの設定が必要になることもあるが、そのあたりは<br />
コンストラクタを変更すればいい。(詳細は過去ログ)<br />
<br />
そもそもマリオネットモードのFireFox環境を構築するにはFireFoxのビルドも<br />
しなくちゃいけないらしく、そっちのほうが大変なような気がする。<br />
<br />
*そもそもmarionetteって何?って人は<a href="https://developer.mozilla.org/en-US/docs/Mozilla/QA/Marionette" target="_blank">ここ</a>が詳しい<br />
ようは別筐体にインストールしたFireFoxをソケットでつないで動作させるモード。 akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0tag:blogger.com,1999:blog-8341591523030131299.post-82446573630829119442013-04-29T08:59:00.000+09:002013-04-29T09:01:42.962+09:00WebDriverでのalert(confirm)検知方法WebDriverでのalertを検知する方法として、<br />
switchToメソッドを使ってalertオブジェクトを取得する方法等が存在した。<br />
しかしながら、この方法ではオブジェクトを取得するまでに一定時間待機してしまい<br />
時間がかかりすぎてしまう。<br />
<br />
<a href="http://rostislav-matl.blogspot.jp/2011/04/moving-to-selenium-2-on-webdriver-part.html" target="_blank">先人の知恵</a>を元に強制js書き換えを行うのが通例とされてきたが、2.32から<br />
selenium自体がこの方法をラッピングしてくれた。<br />
<br />
<br />
WebDriver driver = new ChromeDriver();<br />
AlertOverride alertOverride = new AlertOverride(true);<br />
alertOverride.replaceAlertMethod(driver); //①<br />
<br />
・<br />
・<br />
・<br />
if(alertOverride.isAlertPresent(driver)){ //②<br />
String alertMsg = alertOverride.getNextAlert(driver); //③<br />
}<br />
if(alertOverride.isConfirmationPresent(driver)){ //④<br />
String confirmMsg = alertOverride.getNextConfirmation(driver);//⑤<br />
}<br />
<br />
<br />
①でwindow.alert、confirmを上書きし、内部バッファに溜め込むようにしている<br />
②でalertが発生しているかどうか確認し、③でそのメッセージを取得している。<br />
④、⑤も同様。 <br />
<br />
Jsの書き換えを行っているため、各画面を開くごとに実行する必要があるところが<br />
注意点。WebDriverぐらい内部に保持して、いちいち引数に指定しなくて<br />
いいようにしてほしいなと思う今日この頃。<br />
<br />
alertやconfirmはスクリーンショットで取得できないので、実装ミスによる<br />
alertが表示された場合、この方法をとらないとどんなメッセージが表示されたか<br />
わからない。 <br />
<br />
JQueryのメッセージボックスを使用していて、alertやconfirmは使用していないという<br />
場合は、あらいざらいこの方法ですくってやればいい。<br />
<br />akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0tag:blogger.com,1999:blog-8341591523030131299.post-58472942775634535162013-03-03T00:17:00.000+09:002013-03-03T00:17:11.053+09:00【JavaFX2】コントローラクラスコンポーネントのイベントを貼り付けたりコンポーネントにアクセスするために<br />
フィールド変数を保持したり、何かと忙しいコントローラクラス。<br />
<br />それに対する覚書。<br />
<br />
1.コントローラでないとコンポーネントを認識しない<br />
@FXMLアノテーションをつけることによって、java側から画面のコンポーネントにアクセスするが、<br />
そもそもこの機能はコントロールクラスでないと動作しないようだ。<br />
<br />
2.フォーム1つにつきコントローラも1つ<br />
SCENE Buiderを見る限り、どうもそうっぽい。最終的にごちゃごちゃしてくるのではないだろうか。<br />
<br />
3.初期処理はinitializeで<br />
コンポーネントに対する初期処理は、コントロールクラスに<span class="st">Initializableを実装し、</span><br />
<span class="st"> initializeメソッドでやるのが流儀のようだ。</span><br />
<br />
<span class="st"> 4.コントローラのインスタンス取得方法</span><br />
<span class="st"> URL file = new File("fxmlファイルパス").toURI().toURL();</span><br />
<span class="st"> FXMLLoader loder = new FXMLLoader();</span><br />
<span class="st"> Conroller controller = (Controller) loader.getController()</span><br />
<span class="st"> こんな感じ。</span><br />
<br />
<span class="st">さくさく十同できますなぁ。 </span><br />SCENE Buider自体のバグが気になるけど。akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0tag:blogger.com,1999:blog-8341591523030131299.post-6042287347469538982013-02-24T00:01:00.000+09:002013-02-24T00:01:35.612+09:00JavaFX2での実装所感たぶん生きてる間はJavaはなくならないと思うんだ、cobol的に。<br />
<br />
いまさらながら、JavaFX2に触れてみた。<br />
・NetBeans最新版ダウンロード<br />
・JavaFXSDKダウンロード<br />
・Scene Builderダウンロード<br />
基本これだけで開発環境が構築される。eclipseとはまだまだ親和性が低い模様。<br />
<br />
実装方法もVisual StudioやDelphiと同じくコンポーネントをマウスで設定したり<br />
イベントを紐付けて記述したりと、今までのノウハウがそのまま使えていい感じ。<br />
<br />
Mavenで開発環境を構築しようとしたら、ソースのコンパイルはうまくいくが、<br />
JavaFX関連のクラスが参照できず、デバッグ実行がうまくいかなかった。 <br />
<br />
ローカルに配置したJavaFXSDKのパスをMavenのsettingファイルに環境変数として登録し、<br />
参照させる(ネットワーク経由では参照できない)らしく、やってもうまくいかないので、<br />
いったん保留。<br />
<br />
標準のメッセージボックスが存在しないという点が今のところ驚いた点になる。<br />
フリーのライブラリを使用するか、出なければ独自にwindowをモーダル生成し、実装するしかない。<br />
<br />
とはいえ、画面をソースで直接記述するSwingよりはかなりいい。関連書籍が少ないのが気になるが。<br />
画面ファイル(fxmlファイル)で他の画面ファイルを継承したり出来るのだろうか。<br />
<br />
数年後に消えませんように。<br />
<br />akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0tag:blogger.com,1999:blog-8341591523030131299.post-88497833424503764942013-02-20T00:09:00.000+09:002013-02-20T00:09:05.079+09:00v2.30の追加機能いろいろな不具合を直しつつ、新機能としては<br />
<br />
1. Chromeの動作ログが出力されるようになった。<br />
<br />
System.setProperty(ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY,"C:\\abc.log");<br />WebDriver chrome = new ChromeDriver();<br />
<br />
こんな感じ<br />
<br />
2.IEの起動オプションが追加<br />
DesiredCapabilities caps = DesiredCapabilities.internetExplorer();<br />caps.setCapability(InternetExplorerDriver.ENABLE_PERSISTENT_HOVERING, true);<br />caps.setCapability(InternetExplorerDriver.REQUIRE_WINDOW_FOCUS, true);<br />WebDriver ie = new InternetExplorerDriver(caps);<br />
<br />
こんな感じ<br />
<br />
<br />
正直秋田。<br />
違う方向性を探らなければ。<br />
<br />
今のところ、一番興味があるのはJavaFX2。<br />
適当にもの作って、再配布しても著作権的に問題にならないかが気になるところ。akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0tag:blogger.com,1999:blog-8341591523030131299.post-55966765112527645262013-01-05T12:07:00.000+09:002013-01-06T19:50:54.226+09:00WebDriverでjs単体テスト最近Seleniumとphantomjsが怪しい。<br />
2.27からごちょごちょやっていて、2.28になって、こんなことを言い出した。<br />
<br />
「Added the PhantomJS bindings to the release」<br />
<br />
DesiredCapabilities caps = new DesiredCapabilities();<br />
caps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, "/usr/local/bin/phantomjs");<br />
WebDriver driver = new PhantomJSDriver(caps);<br />
driver.get("http://gugurekasu.blogspot.jp/"); <br />
System.out.println("TITLE : " + driver.getTitle());<br />
System.out.println("URL : " + driver.getCurrentUrl());<br />
<br />
こんな感じで使える。<br />
<br />
http://cdn.ivandemarino.me/slides/speed_up_selenium_with_phantomjs/index.html#title<br />
上記に書いているが、画面を表示しない分、速度が速くなる。 <br />
ただしjsのエンジンがwebkit固定なので、WindowsFireFoxなどとはお庭が違う。<br />
そういう意味では、JsTestDriverのほうが起動ブラウザを選択できる分優秀。<br />
<br />
残念。akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0tag:blogger.com,1999:blog-8341591523030131299.post-51814649377798629112012-11-24T14:08:00.002+09:002012-11-24T14:08:29.788+09:00seleniumの2.26になってかわったこと その2<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-yESJ-r0SLUA/ULBTkArzV_I/AAAAAAAAFG0/tw3E0cGY0sM/s1600/arrows_tab_wifi-500x375.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="150" src="http://2.bp.blogspot.com/-yESJ-r0SLUA/ULBTkArzV_I/AAAAAAAAFG0/tw3E0cGY0sM/s200/arrows_tab_wifi-500x375.jpg" width="200" /></a></div>
事前に検証することは大事である。ちゃんとやっておけば<br />
「ワンセグ見れる5万のタブレットを買ったものの、<br />
お風呂までワンセグの電波が届かない。<br />
こんなことならNEXUS買っときゃよかった」<br />
なんてことにはならない。 <br />
<br />
<br />
2.26で出来るようになったことの続き<br /><br />1.Platformクラスのwindows8対応<br /> OSの情報を取得できるPlatformクラスがWindows8に対応した。<br /> [使い方]<br /> for(String inf:Platform.getCurrent().getPartOfOsName()){<br /> System.out.println(inf);<br /> }<br />
Windows8環境上記メソッドを実行すると<br />
<br />
Windows Server 2012<br /> windows 8<br /> win8 <br />
<br />
って出力される<br /><br />2.プロキシ自動設定、https、socksプロキシに対応<br /> <br /> [使い方]<br /> Proxy proxy = new Proxy();<br />
FirefoxProfile profile = new FirefoxProfile();<br />
<br />
//自動設定の場合<br />
proxy.setProxyAutoconfigUrl("http://192.168.0.10/proxy.pac");<br />
<br />
//socksの場合<br />
proxy.setSocksProxy("hostname.com:1234")<br /> .setSocksUsername("user")<br /> .setSocksPassword("pass");<br />
<br />
//httpsの場合<br />
proxy.setHttpsProxy("hostname:1234");<br /><br />
profile.setProxyPreferences(proxy);<br /> WebDriver driver = new FirefoxDriver(profile);<br />
<br />3.Colorクラスでカラーを文字で指定可能に<br /> [使い方]<br /> Color clr = Color.fromString("SILVER");<br />
System.out.println(clr.asRgb());<br />
指定できる文字はColorsクラスが保持している<br /><br />その他<br />・driverのCapabilitiesを使用するコンストラクタのDeprecatedが消えた、なぜに<br /><br />akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0tag:blogger.com,1999:blog-8341591523030131299.post-29619709514639725482012-11-24T13:05:00.001+09:002012-11-24T13:51:58.968+09:00seleniumの2.26になってかわったこと その1<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-N2YlzCIqi8I/ULBEbVUjtmI/AAAAAAAAFGk/kD2FuPTV8dM/s1600/hitsuji.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="197" src="http://3.bp.blogspot.com/-N2YlzCIqi8I/ULBEbVUjtmI/AAAAAAAAFGk/kD2FuPTV8dM/s200/hitsuji.jpg" width="200" /></a></div>
<br />
3DSドラゴンクエスト7に求めること<br />
・職業レベルがMAXになって、早く転職したいのに、急に世界から隔離されて、<br />
ダーマ神殿に行けなくなるタイミングがある。<br />
・マリベルがいい感じに賢者に転職できた頃に強制離脱するシナオリオ<br />
・操作キャラクターが5人いるのに、つれて歩けるのが4人まで。<br />
中途半端なので一人減らすか、馬車などの一緒に連れていく方法を増やしてほしい。 <br />
・特技『怒涛の羊』の威力はそのままで。<br />
<br />
それはさておき、去年まで2回/月だったseleniumのバージョンアップが<br />
2、3ヶ月に1回になった。<br />
ただし、いまだにIE対応は躓くところが多いのか、IEDriverのみ<br />
バージョンアップを繰り返すことがおおい。<br />
コツとしては、新バージョンのselenium動作検証あと、1、2週間まって、<br />
IEDriverの世間での安定性を確認すればいいかなと。<br />
<br />
2.26で出来るようになったことを一通り。<br />
<br />
1.Architectureクラス<br />
新規追加クラス。クライアントのCPU情報などを取得してくれる。<br />
[使い方]<br />
String myArch = Architecture.getCurrent().toString();<br />
System.out.println(myArch);//x86って出力される。<br />
<br />
2.kyesクラスがunicodeに対応した<br />
unicodeを指定して、キーオブジェクトを取得することが出来るようになった。<br />
[使い方]<br />
①Keys.getKeyFromUnicode('\uE008'); <br />
②Keys.getKeyFromUnicode(Keys.SHIFT.charAt(0));<br />
①と②は同じキーオブジェクトを返却する。<br />
<br />
3.ActionsクラスcontextClickメソッド(引数無しバージョン)追加<br />
Actions.contextClick()で、その場で右クリックしてくれるようになった。<br />
以前からも Actions.contextClick(null)で同じことは出来たけれども<br />
<br />
<br />
その他<br />
・DatabaseStorageクラスがDeprecatedアノテーションくらった<br />
(使ってる人、少ないと思うけど、、)<br />
・IEから useLegacyServerオプションが完全に撤去された。<br />
これからはIEDriverを使いましょう<br />
・毎度のログ周りの大きな変更<br />
・毎度のsafari周りの大きな変更<br />
<br />
<br />
続きはまた今度。 <br />
<br />
<br />
<br />akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0tag:blogger.com,1999:blog-8341591523030131299.post-11550474132456188552012-11-04T00:11:00.001+09:002012-11-04T00:11:06.471+09:00待ったことをアピールしてみる<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-twSAFiTLGdI/UJUxqxi7RmI/AAAAAAAADnA/HXH-LNdD8Ts/s1600/imgf2ef179b4p98ds.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="138" src="http://2.bp.blogspot.com/-twSAFiTLGdI/UJUxqxi7RmI/AAAAAAAADnA/HXH-LNdD8Ts/s200/imgf2ef179b4p98ds.jpeg" width="200" /></a></div>
フランスっていいよね。<br />
<br />
3ヶ月ぶりにseleniumがVerUpしたので、久々に燃料投下。<br />
<br />
ざっと見た感じ2.25から2.26への主な変更点は<br />
1.共通ライブラリが一気に更新(operadriverとか)<br />
2.IE、FireFoxでの安定化(FireFox15、16のnativeイベント対応) <br />
3.プロキシurl自動設定、https、socksプロキシに対応<br />
4.ログまわりの大きな変更<br />
5.kyesクラスのunicode対応 <br />
6.名前からcolorクラスを生成可能に<br />
7.safari操作系統がっつり変更<br />
<br />
<br />
という感じ。<br />
結論から言えば、あげるといいと思うよというところ。<br />
IEでのhover不具合なども直っており、1と2だけでも結構なお得だとおもったり。<br />
<br />
詳細な実装方法とかはまた今度。 akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0tag:blogger.com,1999:blog-8341591523030131299.post-81224476665534841932012-09-10T22:07:00.000+09:002012-09-10T22:07:19.257+09:00DWRのオプションで速度改善DWRの仕様を確認するために、公式サイトを見てみる。<br />
<br />
内容をかいつまむと<br />
・メーリスみろよ<br />
・ヘルプみろよ<br />
・トラブルシューティングみろよ<br />
って書いてある。ようは自分で調べろってことで。<br />
<br />
多重アクセス時の速度改善に役に立ちそうな情報としてはweb.xmlのオプションで<br />
・maxWaitingThreads(同時ブラウザ最大接続数:デフォルト100)<br />
・maxHitsPerSecond(同時処理数:デフォルト40)
<br />
・scriptCompressed(dwrに関するjsの圧縮:デフォルトfalse)
<br />
このあたりを変更すればいいかもね。<br />
<br />
<br />
<br />
<br />akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0tag:blogger.com,1999:blog-8341591523030131299.post-16883392964619932182012-08-26T20:11:00.000+09:002012-08-26T20:11:00.085+09:00JsTestDriverでDOM操作を行うための妄想(その2)<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-FVNe87EEmhg/UDl_Mw9LTDI/AAAAAAAADlA/JcCN7W3KLFY/s1600/images+(1).jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-FVNe87EEmhg/UDl_Mw9LTDI/AAAAAAAADlA/JcCN7W3KLFY/s1600/images+(1).jpg" /></a></div>
妄想に取り付かれると、無敵のキラ様に殺されたりする。<br />
<br />
さっきの続き。<br />
<br />
JsTestDriverでDOM操作のテストを実行するには<br />
・DOM API(docment.~とかJQueryのものとか)をつかう。<br />
・ 【/*:DOC foo = <div><p>foo</p></div>*/】って擬似DOMにアクセスする<br />
の2パターン存在する。<br />
その他のjs単体テストモジュールと違い、静的なhtmlファイルを参照したりすることは<br />
できない(あくまで現時点では)。<br />
オプションでいかにも静的なhtmlを参照できるかのような物が存在するが、<br />
あれは非同期通信の時などに参照するためのものであって、決して<br />
DOMテスト用ではない。引っかからないように。<br />
<br />
まだきちんと試せたわけではないが、後者はthisの扱いがちょっとおかしい。<br />
理由として、jsでthisといえば、<br />
・イベントが発生している時はその発生もとのコンポーネント<br />
・そうでないときは自分自身(クラスとか)<br />
だったりするが、JsTestDriver的にはthisは【:DOC foo】で指定した要素を指してしまう<br />
ので、挙動がおかしかったりする。<br />
<br />
そんな感じで怖いから、前者を使いたい。<br />
<br />
とはいうものの、今度はそのDOM APIがめんどくさくなってくる。<br />
解決方法としては、seleniumと連携して、htmlを取得し、そのhtmlを解析してDOM APIに置換。<br />
testjs自体に結果をインサートして使用するとかになるのかな。<br />
<br />
そんなめんどくさいことしなきゃakira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0tag:blogger.com,1999:blog-8341591523030131299.post-59756652660243973322012-08-26T10:40:00.002+09:002012-08-26T10:40:25.614+09:00JsTestDriverでDOM操作を行うための妄想(その1)<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-Kpgpn709PJ8/UDlxvtyts4I/AAAAAAAADkw/W_Brpow4nA4/s1600/images.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-Kpgpn709PJ8/UDlxvtyts4I/AAAAAAAADkw/W_Brpow4nA4/s1600/images.jpg" /></a></div>
仕事(がうまくいくためにどうすればいいかを妄想するの)が好き。<br />
<br />
Seleniumを使って自動テストをするのはいいけれど、世の中うまい話には裏がある。<br />
ネックとしては<br />
・実行時間<br />
・環境の構築<br />
この2点。<br />
<br />
どうしても実際の通信、およびブラウザ動作を行うSeleniumは実行するのに<br />
時間がかかるし、DBやHTTPサーバーといった環境も含めて<br />
運用を考えないといけないから手間もかかる。<br />
<br />
この2点をクリアできるのが単体テストであり、有名どころとしては<br />
javaでいうとJUnit。javascriptでいうとJsTestDriverだったりする。<br />
<br />
理想的な住み分けとしては<br />
・カバレッジやデグレ防止のためのテストケースを増やしたりしたりするには<br />
出来る限り単体テストで。<br />
・単体テストで無理な部分(業務的な処理フロー等)は画面テストで行い、<br />
実行時間を短くする<br />
のがいいのかなと現時点では思っている。<br />
<br />
で、そこで今度問題になってくるのが単体テストにおける擬似操作データ、<br />
および擬似通信になってくる。<br />
画面テストにおいては、実際にブラウザも立ち上げ、データベースや<br />
アプリケーションサーバーも存在するから、環境さえ用意してしまえば、<br />
「どのように動かすか」を設定してあげればいいだけ。<br />
だけど単体テストはそうも行かない。あくまで「単体」だから、いわゆるMock的な物が<br />
必要になってくる。<br />
<br />
具体的な物の一つに、JsTestDriverでいうところのDOMの操作を行うテストが<br />
当てはまる。akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0tag:blogger.com,1999:blog-8341591523030131299.post-61987289675625541362012-08-25T19:31:00.000+09:002012-08-25T19:31:23.505+09:00JMeterでDWR通信<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-BN28N52W7vc/UDimMEILveI/AAAAAAAADh8/JP2lzJvqsRQ/s1600/analog_09.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="144" src="http://1.bp.blogspot.com/-BN28N52W7vc/UDimMEILveI/AAAAAAAADh8/JP2lzJvqsRQ/s320/analog_09.jpg" width="320" /></a></div>
ところがどっこい、そういうわけにはいかない。<br />
<br />
JMeterでDWR通信を行う際に気をつけなければいけないことがある。<br />
1.httpSessionId<br />
2.scriptSessionId<br />
3.URLパラメータ区切り文字<br />
<br />
<br />
1.httpSessionId<br />
2.scriptSessionId<br />
<br />
JMeter自身が積んでるエンジンでJavascriptが実行できるが、<br />
独自関数は実行できないため、Javascriptを実行して各idを取得することは<br />
出来ない。<br />
なので、これらはレスポンスから正規表現を駆使し、取得する必要がある。<br />
<br />
3.が結構なはまりどころ。<br />
JMeterには自身をプロキシサーバーにしたて、http通信を傍受し、テストケースを<br />
作成する機能がある。<br />
いかんせん便利すぎるこの機能の落とし穴。JMeterが取得したhttpリクエストは<br />
各パラメータが半角スペースで区切られており、このままだとサーバーサイドで<br />
パラメータを認識できず、下記のようなエラーが帰ってくる。<br />
<br />
********************************************************************<br />
<br />
throw 'allowScriptTagRemoting is false.';<br />
//#DWR-REPLY<br />
if (window.dwr) dwr.engine.remote.handleBatchException({ name:'java.lang.IllegalArgumentException', message:'Failed to find parameter: scriptSessionId' });<br />
else if (window.parent.dwr) window.parent.dwr.engine.remote.handleBatchException({ name:'java.lang.IllegalArgumentException', message:'Failed to find parameter: scriptSessionId' });<br />
********************************************************************<br />
<br />
これを解決するには半角スペースを全て改行コードに置換してやる必要がある。<br />
お勧めとしてはユーザー定義変数を作成意思、名前に【RN】、<br />
値に【${__javaScript("\r\n",)}】と設定する。<br />
<br />
その後、パラメータの空白部分に${RN}と設定すれば、通信パラメータが改行で区切られることになり、無事通信が走るようになる。<br />
akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0tag:blogger.com,1999:blog-8341591523030131299.post-22013719549863031442012-08-25T11:45:00.000+09:002012-08-25T11:45:05.619+09:00JMeterの正規表現<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-wu3XlHsi-z0/UDg5mfg_1lI/AAAAAAAADhs/rTdZJxO_njA/s1600/20091123145336188.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="244" src="http://4.bp.blogspot.com/-wu3XlHsi-z0/UDg5mfg_1lI/AAAAAAAADhs/rTdZJxO_njA/s320/20091123145336188.png" width="320" /></a></div>
乱数を使って色違いミュウツーを取る簡単なお仕事です。<br />
<br />
日ごろから(ポケモン的に)乱数を駆使して、いい思いをしているが、<br />
今回は足元を救われた例。<br />
<br />
JMeterという便利ツールがこの世には存在する。(詳細はググっておください)<br />
で、このJMeter、httpレスポンスから正規表現を駆使して値を取得し、<br />
変数に格納することができ、その値を使って以降のhttpリクエストに<br />
使用したりすることができる。<br />
<br />
で、その正規表現の設定がなんともいえない。<br />
<br />
参照名:変数名称を記述する。<br />
正規表現:レスポンスから値を取得するための正規表現を記述する。<br />
テンプレート:複数取得時の番号を指定する。<br />
一致番号:無視してok<br />
初期値:初期値を記述する。<br />
<br />
ってな感じでどこぞのHPに書いてあったので、そのとおりに設定していたが、<br />
いかんせんうまくいかなかった。<br />
<br />
原因は一致番号の設定内容。<br />
空白のままだとなんとランダムで正規表現の内容を引っ張ってくるらしい。(詳細不明)<br />
<br />
具体的には、DWR3の通信内容からScriptSessionIdなるものを取得しようとして、<br />
出来るときと出来ないときがあった。(2日つぶした、、)<br />
<br />
無視していい設定なんてないんだね、よかったね。<br />
<br />akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0tag:blogger.com,1999:blog-8341591523030131299.post-67326926450723925092012-08-25T11:29:00.000+09:002012-08-25T11:30:10.458+09:00(人やDWRと)通信することはむずかしい。<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-E7SI43SVhYc/UDgz-jilA3I/AAAAAAAADhc/FSuvs1IooP4/s1600/c0031550_19324628.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://4.bp.blogspot.com/-E7SI43SVhYc/UDgz-jilA3I/AAAAAAAADhc/FSuvs1IooP4/s320/c0031550_19324628.jpg" width="314" /></a></div>
シロのおうとうには答えていきたかったりする。<br />
<br />
<br />
DWRがブラウザとの通信を行う際、httpパラメータに【http session id】なるものと【script session id】なるものを保持しており、このパラメータをつかって、APサーバーとの通信してる。<br />
<br />
なので、純粋にjmeterでhttp通信を捕まえて動作をエミュレートさせようとしても、捕まえた時点でのセッションidをそのまま使用しているため、まともに動作できない。<br />
<br />
なので、jmeterのテストケース内で動的にパラメータを取得し、編集する必要がある。<br />
<br />
【DWR2の場合】<br />
engine.jsの応答データから正規表現で引っ張ってくればいい。<br />
【DWR3の場合】
<br />
ページロードリクエスト(リクエストパスに《__System.pageLoaded.dwr》と設定されている)の<br />
応答データから正規表現で引っ張ってくればいい。<br />
<br />
DWR3の方法がどこにも書いていなくて、あせったりした。<br />
でも本当にあせったのはjmeterの正規表現仕様だったりする。akira_taniguchihttp://www.blogger.com/profile/03314609062071575571noreply@blogger.com0