Gebをはじめる時に遭遇する例外の対処について #gebAdvent
お約束?
この記事は「Geb Advent Calendar 2016」の3日目の記事です。*1
はじめに
私は、少し前にGeb(じぇぶ)を触ったことがありました。
ただ、久しぶりに再び触ってみたらやたらとエラーやら例外に遭遇したので、その例外と対処法を紹介します。
最初に結論
- 各種関連ツールのバージョンは最新にしましょう
- Java
- Groovy
- ブラウザ
- Driver
とりあえず始める前に上記をチェック!!
1つ前のバージョンでも動作しなかったりします。
遭遇するエラーやら例外
下記以外のエラーや例外も発生した記憶がありますが再現できませんでした。。。
- Groovyのバージョンが低い時
- 2.4.7が最新の際に2.4.4で発生。
- 1つ前の2.4.6でも発生した記憶あり
Caught: BUG! exception in phase 'conversion' in source unit 'C:\work\github\work\20161118_geb\code.groovy' # Licensed to the Apache Software Foundation (ASF) under one or more BUG! exception in phase 'conversion' in source unit 'C:\work\github\work\20161118_geb\code.groovy' # Licensed to the Apache Software Foundation (ASF) under one or more Caused by: java.lang.ClassNotFoundException: # Licensed to the Apache Software Foundation (ASF) under one or more
- Javaのバージョンが低い時
- 1.8.0_112が最新の際に1.8.0_20で発生。
- 1.8.0._60辺りでも発生した記憶ありますが再現せず。
Starting ChromeDriver 2.25.426923 (0390b88869384d6eb0d5d09729679f934aab9eed) on port 29345 Only local connections are allowed. 12 04, 2016 3:47:40 �ߌ� org.openqa.selenium.remote.ProtocolHandshake createSession ����: Attempting bi-dialect session, assuming Postel's Law holds true on the remote end 12 04, 2016 3:47:43 �ߌ� org.openqa.selenium.remote.ProtocolHandshake createSession ����: Detected dialect: OSS Caught: java.lang.VerifyError: Bad <init> method call from inside of a branch Exception Details: Location: geb/navigator/SearchContextBasedBasicLocator.<init>(Lorg/openqa/selenium/SearchContext;Lgeb/navigator/factory/NavigatorFactory;)V @91: invokespecial Reason: Error exists in the bytecode (略)
*1:遅れて申し訳ありません orz
We Are JavaScripters! @1st #wajs に参加したメモ
はじめに
11月24日(木)に「We Are JavaScripters!」という勉強会に参加してきました。
※メモとってまとめてましたが、blogに書くの忘れてたので1週間遅れながらうpします。
概要
「JSの勉強会って、登壇する人がハイレベルな人ばっかりだな〜」 と思ったのがきっかけで作った勉強会、「We Are JavaScripters」!
自分が学んだこと/気づいたこと/面白かったこと/失敗したこと/ハマったこと/挑戦したこと/デバッグテクニック/オススメツール・開発環境/お気に入りのライブラリ/オレオレライブラリ/実はこうだった言語仕様/tips などなど、
お酒を片手に、気軽に発信できる場を目指しています^^/
※誰でも怖がらずに登壇できる空気を作りたいだけだけなので、もちろん玄人のみなさんも登壇大歓迎です!!
最初
- JavaScriptの勉強会は初。
- 会場はかなりカジュアルな感じ。
- デスクとかない。
- なんていうか、コワーキングスペース的な?
- 奥に作業スペースっぽいのがあるけど、ひな壇みたいなとこに座ってプロジェクター見る感じ。
- っと思ったら「21cafe」というエンジニア向け無料イベントスペースらしい。
- ギークス株式会社は「21cafe」を運用しているとの事。
- 開始前に酒を配り、乾杯してからSTART!
- どっかに写真あがるのかな?
- swift愛好会というのもゆるい勉強会らしい
- Facebookでユーザーグループを作るらしい。
LT
LT.1:JSの基本的なことをちょっと掘り下げてみる話 ~this編~ - @Tammy
- 凄いわかりやすいthisの説明。
- スライドっというか、コード公開されたら見るのオススメ。
LT.2:電卓アプリで理解するReact/Redux入門(仮)- @Toshiharu Nishina
- スライドとか
- ReactやReduxの流れ的な感じ。
- 電卓アプリ作るのは練習に良さそう。
- このSlideもかなり良さげ。
- 作って(触ってみると)かなりいいかも。
- ReactはViewの役割
- Reduxはデータの状態管理
- Reduxは正直よくわからないが、Reactをちょっと触った感じで抜けてる部分が補完された。
LT.3:人となりもよく知らないのにnode.jsと付き合ってました。ごめんなさい。 - @Kayoko
- GirlsDoItというポッドキャストやってるらしい。
- node.jsはスタバ風レジ
- LT.4:TypeScript?なにそれ?おいしいの? - @Jay Hori
- TypeScriptはメンテしやすい
- inferenceはないものとして使うといい感じらしい。
- typescriptさっぱりなので、ざっくり説明されている良い資料?
- ただし英語。
LT.5:必要な知識はJavaScriptだけ!さくっと作ろうAPIサーバー! - @fukamiiiiinmin
- 必要な知識はJavascriptだけ!さくっと作ろうAPIサーバ!
- taskey?というサービスやってるらしい。
- GASの話し!!
- GASで簡易的なAPIサーバ。JSONを返す簡易的なテスト的な奴とか。
LT.6:本当は…仲良くなりたいES2015 - @taka
- ES2015を取り入れたい時に。
- ES2015の簡易的な紹介。
LT.7:大規模WEBサイト開発でES2015を使ってみた話(仮)- @takanorip
- 大規模ウェブサイト開発でES2015を使ってみた話
- Reactハンズオン(もくもく会)やってるらしい
- 機能毎にJS分割できる
- コードの再利用性が高まる
- 複数人で開発するのが楽
- 今まで少し面倒だった部分を解決する手助けをしてくれる
- ビルド環境の最適化は難しい
LT.8:Introduction to Flow - @yamadayuki
- Introduction to Flow
- Flowの話し
- Facebookが作ってるらしい
- babelのプラグイン
- 型を定義できる?のかな?
- Typeチェックのツール
flow check
とコマンド打つとチェックしてくれる(そのまま)
LT.9:ポートフォリオにReact(仮)を導入してSPAもどきにしたよ - @atsuco
- KnockoutからReactに乗り換えたいはなし
- knockout.jsからReactに乗り換えたい話しっというタイトルに変更。
- なんかまぁ、正直イマイチだけど3時間で移行できた。
LT.10:JavaScirpt の勉強のために最初にやったこと - @chikoski
- 20161124-wajs-fizzbuzz
- 最初はFizzBuzzの実装
- 基礎の話しw
- FizzBuzzだけでも奥が深い
- 頭の体操は楽しい!
デール・カーネギー・トレーニングに参加して
はじめに
2016/03/12 ~ 2016/06/11まで、12回に渡りデール・カーネギー・トレーニングに参加してきました。
約半額を会社に負担してもらったこともあり、自分が学んだこと、感じたことを社内勉強会で発表しました。
せっかくなのでそのスライドを一応blogにも書いておきます。
スライド
Grails3.0をWindowsではじめる
結論
ダウンロードして、PATH通せばOK。
はじめに
- WindowsにはSDKMANがない。
- とりあえず環境作成まで。
前提(多分)
- JDK7以上がインストールされている。
- JAVA_HOMEに↑が指定されている。
手順
- Grailsダウンロード
- https://grails.org/download.html
- 今時、何故にして直接ファイルをダウンロードせないかんのか。。。
- 1で取得したファイルを解凍。
- 環境変数設定
- PATHに${2のファイル}/binを通す。
- 例 :
C:\tools\grails\grails-3.1.8\bin
試す
- バージョン確認
C:\Users\yamap_55>grails --version | Grails Version: 3.1.8 | Groovy Version: 2.4.6 | JVM Version: 1.8.0_91
- アプリケーション作成
- 作業フォルダに移動。
- 動かしてみる
- アプリケーション作成
grails create-app myapp
- 起動
- 初回起動時は「
Resolving Dependencies. Please wait...
」がかなり長いですので気長に待ちましょう。
- 初回起動時は「
cd myapp
grails run-app
- ブラウザでアクセス
- ↑のコマンド実行後にURLが表示されるのでブラウザでアクセス。
| Running application... Grails application running at http://localhost:8080 in environment: development
- 以下の画面が表示されたらOK。
参考
Groovyでのアスタリスクは便利!
Groovyはアスタリスクが便利に使えるのは知っていたけど、結局いつも忘れて使っていませんでした。 で、調べてみたら思った以上に機能があったのでまとめ。
assert 2 * 3 == 6 assert 3 ** 3 == 27 def i1 = 2 i1 *= 3 assert i1 == 6 def i2 = 3 i2 **= 3 assert i2 == 27 def m1 = [a:"a1",b:"b1"] def m2 = [a:"a2",c:"c2"] def m3 = [a:"a3",b:"b3"] def list1 = [m1,m2,m3] assert list1*.a == ["a1","a2","a3"] assert list1*.b == ["b1",null,"b3"] def str1 = "あいうえお" def str2 = "abc" def list2 = [str1, str2] assert list2*.size() == [5,3] assert list2.collect{it.size()} == [5,3] // 今までこう書いてた。 def function1 = {x,y,z -> x * y + z } def args1 = [1,2,3] assert function1(*args1) == 5 def args2 = [4,5] assert function1(*args2, 6) == 26 def list3 = [2,3] assert [1,*list3,4] == [1,2,3,4] assert [1,list3,4].flatten() == [1,2,3,4] // 今までこう書いてた。 def m4 = [c:3,d:4] assert [a:1,b:2,*:m4] == [a:1,b:2,c:3,d:4] assert [a:1,b:2,*:m4,d:99] == [a:1,b:2,c:3,d:99]
参考
- Groovy Language Documentation 1.2.8. Other operators
- ↑見て「@」があるのを思い出しました。使ってないなぁ。。。
ユーザスクリプトで普段の業務を楽にする
はじめに
社内勉強会で「ユーザスクリプトのすゝめ」というタイトルで発表を行いました。
割りと良い反応をもらえたので、ブログ用に一部変更して公開したいと思います。
アジェンダ
ユーザスクリプトとは
Webページを開くときに、ブラウザ側で指定しておいたJavaScriptを実行させる機能です。特定のページ(Googleの検索結果など)をカスタマイズして表示したりできます。 FirefoxのGreasemonkeyが有名ですが、現在は主要ブラウザのほとんどで利用できます。
↑に引用した通りですが、Webページ上で任意のJavaScriptを動かすものです。
つまり、JavaScriptが動くということはなんでもできるという事で、そのWebページを好きに変更できる!
ブックマークレットを自動実行するできるという事でもあります。
使いドコロ
ユーザスクリプトで調べるとやたら高度な事をしていますが、私がオススメする使いドコロはもっと身近な所です。
例えば、以下のログイン画面を持つシステムを開発している場合。*1。
こんなユーザスクリプトを使用するとちょっと業務が捗ります。
// ==UserScript== // @name New Userscript // @namespace http://tampermonkey.net/ // @version 0.1 // @description try to take over the world! // @author You // @match https://www.chi-bus.jp/ // @require http://code.jquery.com/jquery-2.2.3.min.js // @grant none // ==/UserScript== (function() { 'use strict'; var l = ["","admin","user01","user02"]; var se = $("<select>").attr({"name":"hoge","id":"hoge"}).on("change",function(){$("[name='USER']").val($(this).val());$("[name='PASSWORD']").val($(this).val());}).appendTo($("form").parent()); $.each(l,function(i,v){ se.append($("<option>").val(v).text(v)); }); })();
上記のユーザスクリプト。見ていただければわかりますが、jQueryを使用してselectを作ってappendしているだけです。(ヘッダに色々書いてありますが、そこは気にしないでOK。)
で、↑こうなります。
コードの通り、selectを選択するとログインIDとパスワードが入力される。ただそれだけ。
ただ、このログイン画面を持つシステムを作っている場合、確認のために何百回、何千回とログインをするかと思います。
管理者ユーザ、一般ユーザのIDを毎回入力したり、adminをadimnとタイポしたり、実は結構時間使い、小さなストレスの元になっていたりすると思うのです。
そんなどうでもいいイライラを簡単に防げるのは良い思いませんか?
同じ用途では検索画面の開発時などでも同様に使用できるかと思います。
また、登録画面では適当な値を入力したり、画面遷移を繰り返して行かなければならない画面にリンクを貼ったりなどはどうでしょうか?
私が開発時以外で使用している箇所としては、うちの会社は使い勝手の悪い勤怠管理システムを使用しているので、入力補助ボタンを勝手につけたりしています。(各タスクにかけた時間をテキストボックスに入力する必要があるのですが、30分は0030、1時間は0100と入力する必要があるので、30分入力ボタン、1時間入力ボタンなどをつけました。)
Chromeの場合の使い方
Tampermonkeyという拡張機能を使用します。*2Chromeウェブストアからインストールしてください。
後は、追加されたアイコンをクリックして「新規スクリプトを追加」を選択すれば作成できます。
Firefoxの場合の使い方
greasemonkeyという拡張機能を使用します。こちらからインストールしてください。
使い方は本家のwikiか、
greasemonkeyは前から有名な拡張機能なので、検索すれば日本語でも大量に出てきますのでそちらを参照してください。
最後に
ユーザスクリプトは簡単に使用でき、普段の業務にも活用することができます。上記したようなちょっとしたスクリプトでも役立ち度はかなり高いと思いますので、是非使ってみてください。
また、greasyfork等で、世界中のユーザが作成したユーザスクリプトも使用できます。業務的に使用できるものは少ないかと思いますが、ニコニコ動画用などは結構数があるので、プライベートでいんたーねっつを楽しむ上では使えるものがあるかもしれません。