PI Study #7 「Gebを用いたWebテスト入門(ハンズオン)」に参加してきた
2015年04月12日 19時28分
PI Study #7 「Gebを用いたWebテスト入門(ハンズオン)」に参加してきました。
https://pistudy.doorkeeper.jp/events/22425
E2Eテスト関係の勉強会は第2回 日本Seleniumユーザーコミュニティ勉強会、第1回Geb勉強会と結構参加している気がする。
その時の記事はこれ。(Geb勉強会の方はまとめ記事書いてなかった)
第2回 日本Seleniumユーザーコミュニティ勉強会に参加してきた
Geb勉強会に参加したは良いものの、最近は仕事でWebサイトを扱う機会が少なくなり触っていませんでした。
そういうタイミングでその場で手を動かして学習できるハンズオン。行くしかないでしょう。
実際の勉強会の流れはdoorkeeperに書かれているアジェンダを確認してもらって、ここで1つ自戒を込めて強く報告したいことがあります。
それはハンズオンでの事前準備についてです。
ハンズオンで事前に環境が提示されている場合、トラブった時に自分で何とかできる自信がない時は極力OSやソフトウェアをバージョンも含めて合わせること。
というのは私、初っ端からハマりました。
講師の方が「コピペして動かしてみてください」と言われて実行したスクリプトが動かなかったのです。
勉強会の告知ページで提示された環境は以下。
-
JDK 1.7.0_17
-
Eclipse 4.3.2
-
Groovy Console 2.3.7
私の環境は最新にしておけば間違いないやろということで全部最新。
IDEも別物。
-
JDK 1.8.0_31
-
IntelliJ IDEA 14.1.1
-
Groovy Console 2.4.3
それでトラブってサポートしてくれってのも無理は話。
RuntimeException: error grabbing Grapes — [download faild: org.seleniumhq.selenium#selenium-firefox-driver;2.45.0
見たいなエラーが出て動かない。
IDE上ではスクリプトが動いたのでそっちに逃げましたが、エラー内容を見てすぐに対応できる程groovy周りに精通していないので逃げの手段がなかったらもうお手上げです。
自分だけ困ってる分には構わないのですがハンズオンの場合、この原因究明のために講師の方や周りの人にも迷惑をかけてしまいよろしくありません。
ということで環境は揃えましょう。
懇親会ではテスト自動化についてや今回の勉強会についての話が聞けました。
講師の永井さんはこの勉強会のためにGebを勉強されたとのこと。
初めて触る人がどうすれば分かりやすく勉強できるか考えられているとハンズオン中も感じていましたが通りで分かりやすかった訳です。
素のGebを使ったテストを作成してから、Spockを使用してのテストに変更。
Geb単体でも気持ち良いくらい簡潔に書けていたのですが、それに加えてテストが宣言的に書けて綺麗になるのを体感できました。
その界隈の第一人者の発表を聞く勉強会も新しい知見が多く有意義なのですが、やっぱり手を動かすハンズオンは楽しいです。
デブサミは3時間でバテバテだったのに4時間があっという間でした。
場所を提供していただいたテラインターナショナルさん、会を開催していただいた関係者の皆様、ありがとうございました。
qnote猫社員 膝乗せコレクション2015
2015年03月09日 21時15分
先日、はなが膝の上に乗ったことによりqnoteの(猫社員)膝載せコレクションが完成しました!
(猫社員の紹介はこちら)
-
-
かーちゃん(腹枕)
-
-
かーちゃん、りぼん
-
-
さくら(腕枕)
-
-
かーちゃん、さくら
-
-
ちまき(ジト目)
-
-
さくら(熟睡)
-
-
部長(変顔)
-
-
みぃさん
-
-
はな
見てくれている人に訴えたいのは、1匹を除いて猫社員自ら僕の上に乗ってきたということです。
例外の1匹はかーちゃんで、自らは乗ってこずに抱っこしろと足をバリバリしてくるのでこれもまた自ら抱っこされにきたと言ってもいいでしょう。
大変満足です。
デブサミ2015参加メモ
2015年02月19日 20時37分
3セッション参加してきたのでメモの書き起こし。
ゲンバのSwift
クラスメソッドさんの発表。
テストに関して
使用OSS
Quick/Nimbleを使用。
QuickでDSL記述してNimbleでテスト実行。
BDDテストフレームワークなので宣言的にテストがかける。
iOS7でのSwift OSS
iOS7ではダイナミックライブラリ形式のインポートが使えないので
cocoapodsでは対応できないとかどうとか…
なのでgit submoduleで対応している。
よく使うライブラリ
注意
後方互換の無い破壊的変更が多い。
0.0.1のマイナーアップデートでも結構ある。
Swiftのメイン開発者でLLVMのメイン開発者でもあるChris Lattnerの哲学は
「過去の判断を見直して、より良い変更は積極的に行う」だそうで、、、
利用する側もそれに則っていかないと辛いよと締めてました。
LineのWeb開発
- 基本Native
- ここ最近Webアプリ(WebView)も増えてきた
- WebView内でNativeな機能を使いたい場合はApache Cordova( http://cordova.apache.org/ )を使用
-
- In App WebViewはほとんどがSPA
デバッグ方法
- 主な使用アプリ
-
-
- Safari(Chrome) Remote Debbuger
- 実機での確認は早めに!
- UI/UXをNativeに近づける
- ブラウザ依存、バージョン依存のバグが多発するが無理しすぎない(Android 2.x …)
使用フレームワーク紹介
- Lineバイト 安定性重視の選択
backbone, knockout
- Line@ ライブラリが充実していて高速開発
AngularJS
- Lineタクシー ???
zepto.js
JSフレームワーク選定の大まかな目安
- Vue.js
-
-
-
- AngularJS
-
-
- Backbone.js
-
-
- Knockout.js
-
-
- zepto.js
-
- jQuery
-
-
使用ライブラリ紹介
JSフレームワークの歩き方
いろいろと紹介
- AngularJS
-
-
-
-
-
-
-
-
- Ember.js
-
-
-
-
-
-
- 柔軟性に欠ける(作者もEmber.jsのサポートしないことをするならEmber.jsを使用するべきではないと公言)
- Backbone.js
-
-
-
-
-
-
- Backbone.jsを用いて(オレオレ)フレームワークを作る必要がある
- React.js
-
-
-
-
-
-
-
- Ampersand.js
-
-
-
-
-
-
-
- Aurelia.js
-
-
-
-
-
使用例
- 大規模サイトのスタートアップにAngularJSを使用。既存サイトを置き換えるには向かない。
- 管理画面にEmber.jsを使用。Ember.jsの固さが生きる
- 既存サイトのmvc化にはBackbone.jsを使用。軽量で組み込みやすい。
その他
html/cssが蔑ろにされていることが多い。
DOMが汚いとJavaScriptも自然と汚くなるのでまずはhtml/cssを綺麗に記述すること。
GitBucketが簡単に起動しなかった
2015年02月08日 02時17分
会社で使っているのがGitLabだったんで前はGitLab設置していたんだけどどうもアイコンが苦手でたまらない。
そこだけcssなりで変更すれば良いのかもしれないのだけどコマンド追加されるのも嫌だったし、会社で使ってるのがとても重かったり(スペック的な問題らしい)Omnibusで突っ込むと自分用のPostgreSQLとかRedisとか入れられるしと良い印象がない。
ということで設置が簡単で有名な日本製GitHub cloneのgitbucketを試してみた。
tomcat用意してwar設置して完了な簡単なお仕事…のはずだったんだけど以下のエラーが出て起動しない。
———–
05-Feb-2015 00:07:10.573 SEVERE [crossl.net-startStop-1] org.apache.catalina.core.StandardContext.listenerStart クラス servlet.AutoUpdateListener のリスナインスタンスにコンテキスト初期化イベントを送信中の例外です
org.h2.jdbc.JdbcSQLException: ファイル “/xxxxxxxxxxx” を作成中にエラーが発生しました
Error while creating file “/home/tomcat” [90062-180]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
at org.h2.message.DbException.get(DbException.java:179)
at org.h2.message.DbException.get(DbException.java:155)
at org.h2.store.fs.FilePathDisk.createDirectory(FilePathDisk.java:263)
at org.h2.store.fs.FileUtils.createDirectory(FileUtils.java:42)
at org.h2.store.fs.FileUtils.createDirectories(FileUtils.java:297)
at org.h2.store.fs.FileUtils.createDirectories(FileUtils.java:296)
at org.h2.mvstore.db.MVTableEngine.init(MVTableEngine.java:70)
at org.h2.engine.Database.getPageStore(Database.java:2368)
at org.h2.engine.Database.open(Database.java:663)
at org.h2.engine.Database.openDatabase(Database.java:263)
at org.h2.engine.Database.(Database.java:257)
at org.h2.engine.Engine.openSession(Engine.java:60)
at org.h2.engine.Engine.openSession(Engine.java:167)
at org.h2.engine.Engine.createSessionAndValidate(Engine.java:145)
at org.h2.engine.Engine.createSession(Engine.java:128)
at org.h2.engine.Engine.createSession(Engine.java:26)
at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:347)
at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:108)
at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:92)
at org.h2.Driver.connect(Driver.java:72)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:247)
at servlet.AutoUpdateListener.getConnection(AutoUpdateListener.scala:243)
at servlet.AutoUpdateListener.contextInitialized(AutoUpdateListener.scala:214)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4720)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5154)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:714)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:917)
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1701)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
05-Feb-2015 00:07:11.467 SEVERE [crossl.net-startStop-1] org.apache.catalina.core.StandardContext.startInternal Error listenerStart
05-Feb-2015 00:07:11.481 SEVERE [crossl.net-startStop-1] org.apache.catalina.core.StandardContext.startInternal 以前のエラーのためにコンテキストの起動が失敗しました [/xxxxxxx]
05-Feb-2015 00:07:11.488 WARNING [crossl.net-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [xxxxxxx] registered the JDBC driver [org.h2.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
———–
H2 Databaseのjdbcドライバが云々、、、
WAR配置して終了ちゃうやん、、、って思ってGitHub眺めてたら保存するデータに関しての記述を見つけた。
———–
To upgrade GitBucket, only replace gitbucket.war. All GitBucket data is stored in HOME/.gitbucket. So if you want to back up GitBucket data, copy this directory to the other disk.
———–
yumでtomcatをインストールするとバージョンが古かったりOpen JDKが入ってきたりするのが嫌だったのでtomcatもマニュアルインストールしたんだけど、その際tomcatユーザのホームディレクトリってどうしたかなと調べてみたら/rootだった。
そりゃこけるがな。
ということでusermodでホームディレクトリを変えたら問題なく動きました。
バケツ!
良い感じ
参考書や専門書をネットで買うならhonto.jpがおすすめ
2015年02月04日 06時54分
よくネットで参考書を買う時にamazonを使ってたのですが、ジュンク堂でhontoカードを作ってからはなるべくhonto.jpを使うようになりました。
よく使うようになった理由。
01.ポイント付与がすごい
提携リアル店舗でも使えるポイントが購入額の100円につき1ポイント付与されます。
これだとちょっとポイントついてるな〜程度でわざわざサイトに個人情報突っ込んで登録して購入するまでの動機としては弱いです。
02.キャンペーンが多い
メルマガ登録しておくと週1、2回ぐらいキャンペーンのお知らせがきます。
電子書籍が対象のものが多めなのですがたまに書籍も対象にしたものがあります。
そのタイミングで購入すれば10%ポイント還元や金額に応じたボーナスポイントの付与などかなりの還元率になります。(キャンペーン駆動型購入)
03.あしあとポイントで最大260円ポイントもらえる
honto.jpにはあしあとポイントという仕組みがあります。
サイトにログインして「あしあとをつける」というボタンを押すだけの簡単なお仕事です。
このあしあとポイントは1ポイントが翌月そのまま1ポイントになります。
そしてあしあとの数に応じてボーナスポイントが付与されます。
10あしあと / 10ポイント
20あしあと / 50ポイント
皆勤賞 / 100ポイント
つまり30日ある月に毎日忘れずにあしあとをつけると翌月に30 + 100の130ポイント付与されることになります。
あしあとポイントで付与されたポイントの有効期限は購入で付与されたポイントと違い有効期限が2ヶ月と短めです。
ですが2ヶ月分は貯めれるのであしあとポイントだけで260ポイント貯めれることになります。
毎日あしあとをつけるのが面倒くさいと思うかもしれませんが、毎日facebookでいいねを押すのをhonto.jpのあしあとに変えればいいだけと思って頑張りましょう。
ちなみに私のfacebookはほぼ非アクティブです。
04.フィルムコートオプションが良い
発送が購入翌日ではなくなってしまいますが時間に余裕がある場合におすすめしたいのがフィルムコートです。
図書館で借りると施されている本を保護するコートを120円で行ってくれます。(対応していない本もある)
私の場合は家と会社で読みたいのでよく持ち運ぶのですが、持ち運び時に角がよれてしまうことがままありました。
ブックカバーはなんか野暮ったくて苦手なので困っていたのですが、フィルムコートでこの問題は解決しました。
ただフィルムコートを選ぶと1週間ぐらい発送が伸びますのでその点は注意が必要です。
05.たまにクーポンくれる
某掲示板のhontoスレを見ると配布対象者がハッキリとしませんがたまにクーポンをくれます。
500円クーポンとかそういうやつです。
期限は短めに設定されている、かつ本当にたまになのであまり期待せずに購入タイミングで使えたらラッキー程度に思っているスタンスが良いと思います。
逆に視点を変えて「今すぐ必要ではないがいつかは欲しい」系の本はクーポンがきたら購入するという考え方もできます。(クーポン駆動型購入)
勿論、購入金額の下限があるので400円の漫画が無償で購入できるなんてことはできません。
今までの話を踏まえて最近購入した購入履歴のキャプチャを晒してみます。
honto購入履歴
クーポン駆動型購入の例で500円のクーポン通知が来たので、前から欲しかった勉強会で紹介された本を購入しました。
ポイントとクーポンの割引で975円引かれています。
ポイントの内訳も457円中約260ポイントはあしあとポイントですし、残りの215ポイントも21,500円購入して付与されたポイントなわけもなくキャンペーンで付与されたポイントが大半でしょう。
ただ電子書籍は専用アプリが必要でDRMフリーでもなさそうなのでオススメしません。
gihyoやO’Reilly Japan、達人出版会などがオススメです。
そんな訳で紙媒体の単価の高い参考書や専門書を購入するならhonto.jpはホントおすすめです!