u-ryo's blog

various information for coding...

Geb Is Great

| Comments

Geb([jeb])が凄いです。 要はSeleniumのwrapperなんですが、 Page Modelとか駆使すると、 GUI testもspockのSpec本体には具体的なtag名出さずにlogicalに書けますね。 frameなpageでは、

1
2
3
4
<frameset>
  <frame id="head">...</frame>
  <frame id="main">...</frame>
</frameset>

とあったら、Page Objectに

1
2
3
4
static content = {
  header(page: HeaderPage) { $('#head') }
  main(page: MainPage) { $('#main') }
}

と書いて、

1
2
3
withFrame(main) {
  ...
}

と使えます。

しかし、 そもそもイマドキframeなんか使う方がおかしいんですけどね。 html5ではaccessibilityの観点から廃止されてるのに。

最近よくある、mouse overしてmenuをdrop downさせるものについては、

1
2
3
4
interact {
  moveToElement(...)
  click(...)
}

<select>やradio buttonsといったform関係要素については、 以下のようにmoduleを使って簡単に操れます。

1
2
3
4
5
6
7
8
import geb.module.RadioButtons
import geb.module.Select
import geb.module.Textarea
$('select#...').module(Select).selected = 'some value'
$('select#...').module(Select).selectedText == 'label text'
$('select#...').module(RadioButtons) = 'some value'
$('select#...').module(RadioButtons).checked == 'some value'
$('select#...').module(Textarea).text = 'A sentence with\na new line.'

withFrameでのassertionは、末尾に|| trueが必要でした。

1
2
3
4
withFrame(main) {
  leaveRequest.approver.selectedText == '西 部長'
  leaveRequest.approvalDate.text == new Date().format('yyyy/MM/dd')
} || true

frame内の変化があるので、Page Module内要素はrequired: falseつけまくりでした。

1
2
3
4
static content = {
  requestType(wait: true, required: false) { $('input#rdo12').module(RadioButtons) }
  requester(required: false) { $('span#select2-chosen-1') }
}

あと適宜waitFor {...}が必要ですね。

browser alertの処理は厄介でした。 driver.switchTo().alert().accept()かと思ったら、withAlert(wait: true){...}でいいんですか。 普通の(javascriptによる)popup dialogに対しても。 「browser alertが出たら」ってどう書くんでしょう。

1
2
3
withAlert(wait: true) {
  ...
} == 'modal dialog message'

まぁ、geb manualを読めってことですね。

これはgroovyのことですが、日付のformatが簡単です。

1
leaveRequest.approvalDate.text == new Date().format('yyyy/MM/dd')

http accessはHttpURLClientを用い、またcookieの取得も簡単です。

1
2
3
4
5
@Grab('org.codehaus.groovy.modules.http-builder:http-builder')
import groovyx.net.http.HttpURLClient
def jsessionId = driver.manage().getCookieNamed("JSESSIONID").value
def http = new HttpURLClient(url: 'https://my-ocr.herokuapp.com/')
tryLogin(userId, password, http.request(path: jsessionId).data)

Koding Has Changed

| Comments

Kodingが、何かいきなりTeam codingとかいって、renewalしてました。 新しくなるのはいいんですけど、 githubのaccountで入れなくなったり、 AWSが必須だかlocalのLinuxにkdとかいうのをinstallするのが必須だか、 free and Web上で完結しなくなっているようだったり、 というのはやめて欲しいです。 今更ながら、nitrous.ioに乗り換えます。 Cloud9だとGrainw compile出来ないので。

Security Check

| Comments

NHK SpecialのCYBER SHOCK 狙われる日本の機密情報見てたら、 標的型攻撃による情報流出が怖くなりました。 JIPDECとか、表面化してないだけで絶対やられてるんじゃないのかな、 とか思うんですが、それをみるために、 gatewayで宛先IPとportをcheckしたらいいんじゃないのかな、 と思いました。 まず自分のマシンでやってみようと思いました。 隗より始めよ、ですね。 iptablesでOUTPUTのACKなtcpのdportとIPをLOGすれば、 と思ったんですけど、 それだったらsnortの方がいいですか。 でもsnortでoutboundな通信のlogってどうやるんでしょう。 また、それでIPあげつらったとしても、 それをどう検証するのか。 blacklistでもないかなぁ、と思ったら、 カペルスキーとかセキュリティ専門会社は独自blacklist持ってるんですね。

...と、この辺まで書いてたら、 Kodingに「週間使用量をexceedしている」とかいわれて止められちゃいました。 書こうとしてた時に勢いを止められるのはつらいです。 書いた文章もURLも消えちゃいましたし、何書こうとしてたか忘れちゃいました。

blacklist、IP addressで検索していたら、 whatismyipaddressのBlacklist Check、 でもこれは、接続元IPがspammerのblacklistに載っているか、 一括して調べるもの。どこかに載ってたら、 過去にspamを送っていたことがある、 何らかのmalwareに感染してた可能性がある、 ということです。

check your very own IP for any botnet infections というのがあって、これも同じようなserviceなんでしょうか。

C&C serverとのcommunicationは、 DNSのTXT recordでやるそうですね。 そんなのってdetect出来るんでしょうかね。出来そうですね。 何かtoolないのかな。

脆弱性診断研究会には、 よさ気な情報が載ってます。 ↑に載ってましたが、 VAddyというJenkinsに組み込んでCIで脆弱性診断をしてくれる serviceがあるそうです。free planだとSQL injection、XSSしか見てくれないそうですが、 freeで何度も使えるならいいですね。

脆弱性検査tools

  • OWASP ZAP
  • Vega(Java, included in Kali Linux)

Bug hunterとして生計を立てているKinugawa masatoさんのページが とても勉強になります。徳丸先生の日記は言わずもがな。 ヒロミチュ先生のところは、 最近技術的な話題少ないんですかね。

Minimal Set for Sinatra on Heroku

| Comments

heroku久しぶりだったので、やり方忘れちゃいましたよ。

Cloud9上で、

1
2
3
4
5
6
7
8
9
10
11
12
13
$ cat Gemfile
source 'https://rubygems.org'
gem 'sinatra'

$ cat Procfile
web: exec ruby app.rb -p $PORT

$ cat app.rb
require 'sinatra'

get '/' do
  'Hello World!'
end

最低この3ファイル、なんですが、 gitにcommitしてherokuにdeployするのは あと自動生成される Gemfile.lock も必要になります。 Gemfile.lock は、一旦rubyを動かさないと出来ないのかな? ruby app.rb で試せます。

herokuへは、

1
2
3
4
5
6
$ heroku create my-application
$ git init
$ git add Gemfile Gemfile.lock Procfile app.rb
$ git commit -a
$ bundle install
$ git push heroku master

で上手く行く筈、なんですが、 git remoteを設定しないとダメかも。 その辺は適宜。