山pの楽しいお勉強生活

勉強の成果を垂れ流していきます

Gebでファイルをダウンロードする

概要

コード

@Grapes([
    @Grab("org.gebish:geb-core:1.1"),
    @Grab("org.seleniumhq.selenium:selenium-chrome-driver:3.0.1"),
])

import org.openqa.selenium.chrome.ChromeDriver
import geb.Browser

println "start ${new Date().format('yyyy/MM/dd HH:mm:ss')}"

// chromedriver.exeは前もって準備が必要。
System.setProperty("webdriver.chrome.driver", "./driver/chromedriver.exe")

def downLoadPath = $/C:\work\20170301/$

Browser.drive(driver : new ChromeDriver()) {
  go "http://gebish.org"
  def bytes = downloadBytes($("a")[0].@href)

  // ↑のURLは実際にはhtmlですがファイル名はzipで保存してみます。
  def outputPath = "${downLoadPath}/hoge.zip"
  new File(outputPath).newOutputStream().write(bytes)
}

println "end ${new Date().format('yyyy/MM/dd HH:mm:ss')}"

Groovyで今週の月曜日の日付を取得する

概要

今週の月曜日の日付を取得するという要件があったため色々考えましたが、シンプルになりませんでした。

もっとシンプルな方法があると思うのでどなたか教えてください。。。

コード

def f = {
  it - (it.day != 0 ? it.day - 1: it.day + 6)
}

assert f(new Date("2017/01/01")).format("yyyy年MM月dd日(E)") == "2016年12月26日(月)"
assert f(new Date("2017/01/02")).format("yyyy年MM月dd日(E)") == "2017年01月02日(月)"
assert f(new Date("2017/01/03")).format("yyyy年MM月dd日(E)") == "2017年01月02日(月)"
assert f(new Date("2017/01/04")).format("yyyy年MM月dd日(E)") == "2017年01月02日(月)"
assert f(new Date("2017/01/05")).format("yyyy年MM月dd日(E)") == "2017年01月02日(月)"
assert f(new Date("2017/01/06")).format("yyyy年MM月dd日(E)") == "2017年01月02日(月)"
assert f(new Date("2017/01/07")).format("yyyy年MM月dd日(E)") == "2017年01月02日(月)"
assert f(new Date("2017/01/08")).format("yyyy年MM月dd日(E)") == "2017年01月02日(月)"
assert f(new Date("2017/01/09")).format("yyyy年MM月dd日(E)") == "2017年01月09日(月)"
assert f(new Date("2017/01/10")).format("yyyy年MM月dd日(E)") == "2017年01月09日(月)"

PhantomJSDriverは「com.codeborne」を使用する

概要

GebでChromeからPhantomJSに変えようとしたらハマったのでメモします。

PhantomJSを使う場合、「phantomjsdriver」のグループIDは「com.codeborne」を使用しましょう。

Web上でサンプルを探すと、1.1は「com.github.detro.ghostdriver」、1.2は「com.github.detro」のようなグループIDがでてきますが、ghostdriverのリポジトリを見るともうサポートできないと書かれています。 で、色々forkされていますが、2017/02/06現在は「com.codeborne」を使用するのがベターみたいです。(codeborneはselenideを開発しているようなので、これからもアップデートされる確率は高いでしょう。)

Caused by: java.lang.ClassNotFoundException: org.openqa.selenium.browserlaunchers.Proxies

とか言われて泣いている人は試してみてください。

コード

@Grapes([
    @Grab("org.gebish:geb-core:1.1"),
    @Grab("com.codeborne:phantomjsdriver:1.3.0"),
])

import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.phantomjs.PhantomJSDriverService
import org.openqa.selenium.phantomjs.PhantomJSDriver

import geb.Browser
import geb.Configuration

println "start ${new Date().format('yyyy/MM/dd HH:mm:ss')}"

def caps = new DesiredCapabilities()
// phantomjs.exeは前もって準備が必要。
caps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY,"./driver/phantomjs.exe");

def conf = new Configuration()
conf.driver = new PhantomJSDriver(caps)

Browser.drive(conf) {
  go "http://gebish.org"
  assert title == "Geb - Very Groovy Browser Automation"
  assert $("h1#logo").text() == "Geb (pronounced “jeb”)"
}

println "end ${new Date().format('yyyy/MM/dd HH:mm:ss')}"

余談

ハマったので「geb-example-gradle」で試してみた所、PhantomJSは失敗します。理由はPhantomJS自体をダウンロードして配置してるのですが、中身が階層化されるように変更されたのか、取得できないという。。。(Windowsしか試していません。)

説明下手ですね。
geb-example-gradle\build\webdriver\phantomjs\phantomjs.exe」を期待しているのに、
geb-example-gradle\build\webdriver\phantomjs\bin\phantomjs.exe」となるので失敗します。

多分この辺りなので、余裕のある方はプルリクでも出せば取り込まれるような気がします。

更に余談

Geb自体も過去に「org.codehaus.geb」から「org.gebish」にグループIDが変更されていてハマった事があったりします。こういうのって誰もがハマるものなんですかね。

We Are JavaScripters! @3rdに参加してきた #wajs #21cafe

はじめに

1月30日(月)*1に「We Are JavaScripters! @3rd」という勉強会に参加してきた時のメモです。

今回で3回連続参加となった勉強会でしたが、今回も楽しめました。ただ、ちょっとした事という割にはそれなりにレベルが高くなっておりました。(ハイレベルという訳ではないです。)懇親会ではレベル下げていきたいという話も出ていたので、また初心者枠で何か発表しようかしら?

概要

「JSの勉強会って、登壇する人がハイレベルな人ばっかりだな〜」
と思ったのがきっかけで作った勉強会、「We Are JavaScripters」!

自分が学んだこと/気づいたこと/面白かったこと/失敗したこと/ハマったこと/挑戦したこと/デバッグテクニック/オススメツール・開発環境/お気に入りのライブラリ/オレオレライブラリ/実はこうだった言語仕様/tips などなど、

お酒を片手に、気軽に発信できる場を目指しています^^/

※誰でも怖がらずに登壇できる空気を作りたいだけだけなので、もちろん玄人のみなさんも登壇大歓迎です!!

LT.1:JSの基本的なことをちょっと掘り下げてみる話(prototype編・・かも) - @ta__miyan

  • prototypeというかコンストラクタ、Objectについて
  • ネイティブオブジェクトは全てコンストラクタ関数から生成されている。
  • JSの世界は全てオブジェクト?
  • プリミティブ型にプロパティの参照やメソッド呼び出しを行った場合、一時的にオブジェクトに変換されている。
  • 参照渡しと値渡しについてはググれ
  • 次回はprototypeの話をする。

LT.2:モテル駆動開発に基づくElmという選択 - @boiyaa

  • Elmはモテる
  • インストールだけすればOK。
  • Elmは純粋関数型言語
  • やさしく関数の世界にいざなってくれる。
  • 必ずモテる銀の弾丸ではない。
  • 半年に一回ペースで破壊的アップデートあり。
  • 純粋な?関数型言語用語?を使っていない。

LT.3:Angular2のChangeDetectionを観察する - @yuuta_moriyama_1

  • ディベートのオンラインシステムを開発。
    • 仲間募集中
  • リファクタリングプラン。
  • Immutable Objects
    • 通常は変更されたときに、全てのコンポーネントを見に行ってしまう。
    • 全てを見に行かないように制御する
  • Component Lifecycle
    • Componentには生成されてから削除されるまでにそれぞれのフェーズでフック可能。

LT.4:PrimeNGという選択肢 - @shinse

  • PrimeNGという選択肢について
  • ライブラリ
  • いわゆる大企業が業務フローを固めるために使うアプリケーション
  • Angular向けUIライブラリ
  • おじさん受けの良い機能が多い
  • コンシュマーみたいなUIを使いたがっている。
    • そんなおじさま方にうける。

LT.5:ES6で関数型プログラミング - @Kawabata_Lemon

  • ES6時代の関数型プログラミング
  • 関数型とは。
  • 値とどう向き合うか。
    • ある入力に対する出力がいつも同じ値を返す
  • 変数の巻き上げ。
    • varは呼び出し時に宣言していなくても、エラーとならない。
  • 関数型を使うと考え方が身につく
    • 問題が起こりにくい感覚がみにつく。

LT.6:anime.jsがいいらしい - @711fumi

LT.7:サーバサイドエンジニアにこそ試して欲しいBaaS - @moongift

LT.8:名前の話 - @chikoski

  • JavaScriptのモジュールはES2015で定義されている。
  • が、ブラウザでは実装は一切されていない。。。
  • モジュールを使うと、名前が外に出ないので、適当な名前でOKw

*1:なんでいつも月曜日?

Groovyでメール送信

概要

Groovyのスクリプトでメール送信する機会がありました。
AntBuilderで飛ばせる的な記載はありましたが、意外とサンプルそのまま動かせるものがなかったのでメモしておきます。

コード

@Grab(group='javax.activation', module='activation', version='1.1.1')
@Grab(group='javax.mail', module='mail', version='1.4.7')
@GrabConfig(systemClassLoader=true)

def ant = new AntBuilder()
ant.mail(
  from: "from@example.com",
  tolist: "to@example.com",
  message: "本文",
  subject: "タイトル",
  mailhost: "smtphost",
  messagemimetype: "text/html",
)

備考

  • messageを改行する場合は「<br/>」を使用する。
    • Gmailにて確認。
    • message.replaceAll("\n","<br/>")」という形になるか?
  • toが複数人の場合は「,」で繋げる。

参考

2017年の目標

ここ3,4年は目標立ててるものの、blogに書いてなかったので、今年は書いてみる。

基本的に、目標は低く緩く大雑把に立てるようにしています。 性格的に高すぎる目標は諦めてしまうので、やれば(頑張らなくても、時間かけずに)できることをやる。 それってどうでもいいことなんですけど、それを続けることで力になると信じてます。

どんな形でも目標立てると、やらなきゃいけない感がでるのでオススメ。

目標

英語を勉強

  • 具体的な最終目標はなし
  • なるべく毎日何かやる
  • TOEICを3月と12月に受験
    • 1月に受けたかったけど、すぐ申し込んですぐ受けられるというものではないらしい。
    • 1/5に申し込んで3月受験。

何か作る

今週のお題

レッドスターもらえるらしいのでノッてみる。

We Are JavaScripters! @2ndに参加してきた(そして初発表してきた)

はじめに

  • 12月26日(月)に「We Are JavaScripters! @2nd」という勉強会に参加してきた時のメモです。
  • 外部勉強で初めて発表させてもらいました!
    • 緊張する人なので、お酒飲んで発表できるのは凄く助かりました。
    • 発表自体はグタグタでしたが、自分的に大きな一歩を踏み出す事ができて感動!
  • 前回よりレベルが高くなっていて焦りましたが、なんとか自分にもついていけるレベルだったのでよし。
  • 次回も参加したい!

We Are JavaScripters!概要

「JSの勉強会って、登壇する人がハイレベルな人ばっかりだな〜」 と思ったのがきっかけで作った勉強会、「We Are JavaScripters」!

自分が学んだこと/気づいたこと/面白かったこと/失敗したこと/ハマったこと/挑戦したこと/デバッグテクニック/オススメツール・開発環境/お気に入りのライブラリ/オレオレライブラリ/実はこうだった言語仕様/tips などなど、

お酒を片手に、気軽に発信できる場を目指しています^^/

※誰でも怖がらずに登壇できる空気を作りたいだけだけなので、もちろん玄人のみなさんも登壇大歓迎です!!

最初に

  • 前回のまとめ
  • We are javascriptersという名前は外国の方からすると違和感があるらしい。
    • 別名募集中とのこと

LTメモ

LT.1:JSの基本的なことをちょっと掘り下げてみる話 Chapter02. 〜 デバッグ編 〜 - @ta__miyan

LT.3:React.js と TypeScript で趣味に走った SPA 作ってみた - @bird_tummy

  • React.js と TypeScript で趣味に走った SPA 作ってみた
  • 順番変わった?
  • React.jsとTypeScript
  • デザフェスというアートイベントの次回参加する人を探す!という部分をフォローするために作った。
  • infernoという軽いライブラリがある。
  • 開発環境作成が鬼門。
    • 正直、私のようなJavaScript初心者には環境作成のハードルは確かに高いのはわかる。。。
  • 20個位ライブラリを使った。
  • テストは是非書きましょう!
  • moxiosというライブラリでリクエストをモックできる
  • ライブラリ何を使うかは個人の好みによるところが大きい気がする
  • 作りたいもの作ると勉強にもなって凄く良い

LT.2:javascript開発のいろいろ - @chihiro_fujisawa_73

  • sequalizeとnodeの話し。
    • sequalizeはO/Rマッパー
  • データ量がちょっと増えたらめっちゃ遅くなった
    • SQL実行に時間がかかる
      • sequalizeが実際に投げるSQLがわかっていなかった。
    • Promiseの書き方が良くなかったため時々失敗するユニットテストが発生。
    • CIやっぱり重要。

LT.4:JavaScript is universal - @keita_moromizato

  • JavaScript is universal
  • 99%JavaScriptWebサービスを作る
  • Sails.jsはヤヴァイ
  • サーバサイドをTypeScriptで書くのはおすすめしない。
    • JavaScript書いているというより型を書く事になる。
  • サーバレス
  • GASは便利!
  • Yahooが文章の自動レビューAPIを公開しているらしい
  • JavaScript1つ知っていると、クライアント、サーバもできるし、APIも簡単に公開できる
  • システムのほぼすべてをJavaScriptで書くのは現実的になりつつある
  • どこでも動くJavaScriptを書くには若干のコツが必要

LT.5:web会議システムをつくる試行錯誤 - @yuuta_moriyama_1

次発表なので緊張してて、殆ど頭に入らず。。。

  • 汎用的なオンラインビデオ会議システムを作る
  • 元々エンジニアではないが、作りたいので頑張った!

LT.6:electron触ってみた - @yamap_55

LT.7:dexijs - @RyotaSuzuki

発表後なので放心状態。あまり聞けず。

  • Dexiejs
  • indexedDBのラッパーライブラリ
  • indexedDBは辛い
  • indexedDBは辛い
  • indexedDBは辛い
  • Dexi.js使えば読める!

LT.8:リスト処理と関数プログラミング - @chikoski

発表後なので放心状態。