山pの楽しいお勉強生活

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

GrailsアプリケーションをTravis CI、Herokuと連携する

アジェンダ

概要

  • タイトルの通りの事をやろうとしたら、結構戸惑ったためメモ。
    • Grails、Gradle、Travis CI、Heroku全てが全くわかっていなかったという事を実感。。。
  • 尚、Herokuの設定については公式にドキュメントがあった上、サンプルリポジトリまである事に全部終わってから気づきました。こちらを参照した方が良いかと思います。
  • 特に難しいことはしていませんが、誤っている点、もっと簡単な方法等がありましたらコメント、ブコメTwitterなどで教えてください。

環境

  • Grails Version: 3.2.8
  • Groovy Version: 2.4.10
  • JVM Version: 1.8.0_121

前準備

Grailsのデフォルトアプリを作成

  • grailsコマンドでアプリケーションを作成。
grails create-app grails-heroku-example2
  • アプリケーションを起動
cd grails-heroku-example2
./grailsw run-app

Herokuで動作させる

task stage {
  dependsOn build
}
web: java -Dserver.port=$PORT $JAVA_OPTS -jar build/libs/grails-heroku-example2-0.1.war
  • Gitで管理する
git init
git add .
git commit -m "first commit"
  • Heroku CLIでログイン
    • heroku login
    • メールアドレスとパスワード入力。
  • Heroku上にアプリケーションを作成
    • heroku create grails-heroku-example2
    • アプリ名は省略も可能。
    • アプリ名はHeroku全体でユニークである必要があるので注意。
  • リモートリポジトリが追加されていることを確認。
    • git remote -v
heroku   https://git.heroku.com/grails-heroku-example2.git (fetch)
heroku  https://git.heroku.com/grails-heroku-example2.git (push)
  • Herokuへデプロイ
    • git push heroku master
    • BUILD SUCCESSFUL的なメッセージが表示されればOK
  • 確認
    • heroku open
    • ローカルで実行時と同じ画面が出ればOK

GitHubにpush

git remote add origin git@github.com:yamap55/grails-heroku-example2.git
git push -u origin master

Travis CIと連携

  • Travis CIにログイン
  • ↑でGitHubに作ったリポジトリをEnableにする。
    • 2017/04/04現在だと、My Repositoriesの横の+か、右上の自分のアイコンをクリックすることで自分のリポジトリの一覧が表示される。
    • リポジトリが表示されない場合には右上の「Sync account」を押下することで再同期されます。
  • 空の連携設定ファイルをカレントに作成
touch .travis.yml
  • .travis.yml を設定
    • travis setup heroku
  • .travis.yml に設定を追加
    • language: groovy
    • ファイルの先頭に追加。
  • 設定例
language: groovy
deploy:
  provider: heroku
  api_key:
    secure: (略)
  app: grails-heroku-example2
  on:
    repo: yamap55/grails-heroku-example2
git add .
git commit -m "comment"
git push origin
  • 確認
    • heroku open
    • herokuのログを確認

メモ

参考URL

退職します。

はじめに(っというか概要

  • エンジニアとして、人として、自分が得たもの、反省点とか、忘れないようにメモ。
  • 基本ポエム。
  • 2017/03/17が最終出社
  • 在籍は3月いっぱい
  • 退職にあたり、特に大きな不満があった訳ではなく、転職先に大きな魅力があった。
    • この辺りは別記事で書ければいいなぁ
  • 今後についてはそのうち。
  • 多分4月はニートしてるので声かけてください。

私はそれなりにコード書けるという自信。

  • 逆に凄いできる訳ではない。
  • ↓とも関係するが、人にコードを見てもらう事が殆どなかったので、できない訳ではない事に気づけたことが重要。
  • 最後の方は割りと技術的なことを相談されることが多かった気がする。

会社やアプリケーションに依存している事に対しての気付きと変化を与えることの難しさ。

  • 正直、前職でも感じてはいたが、改めて実感。
  • エンジニアとしてレベルが高いにも関わらず、仕事に閉じているのは勿体無いと感じた。
  • 外部勉強会への参加、blogやQiitaへのアウトプットなどが必須とは思わないが、楽しいし褒められるし評価されるし、いいことだらけなのになぁと思った。
    • 自作ツールが社内で評価されていて、自身もかなり便利だと感じたなら公開すればいいのにとか。
  • プライベートは個人個人なので、強制するものではないが、エンジニアとして頑張っていきたいと思っているなら多少はっとも思った次第。
  • 外部の勉強会へのお誘いや、社内勉強会の開催、GitHubとQiitaでOrganaizationの登録などなど色々やってみましたが、結局あまり盛り上がらず。
    • 自分の力不足も多分にあったと思う。
    • 自分は初回は半分無理やりだったので、初回はある程度強制で体験してもらうのもありだったかも?

自分の書いたコードを人にレビューしてもらうという経験。

  • 私は細かいミスが多いという事実。
    • 昔から言われていたので知ってはいたけど、コードとして見せられるとわかりやすい。
  • 人に指摘される事に加えて、人に説明することで気づく事実も多い。
  • レビューされるという事実自体が緊張感を持ってコードを書ける。

非エンジニアの方に数分-1時間程度で作成できる程度のツールをプレゼントすることで、何十時間もの工数を削減できるという事。

  • 非エンジニアの方は行っているやり方が効率的でない事に気づいていないことが多い。
  • 非エンジニアの方の仕事に積極的に関わっていくことで、ちょっとした手伝えることが結構ある。
    • そして、それは往々にして凄い喜ばれ、褒められる!
  • 使用工数に対する効果、満足度(使用者作成者共に)がかなり高いので、これは今後も実践していく予定。

人に教えること

  • 社会人経験で直接教える後輩がいた事が殆どなかったため、経験できたのはかなりの収穫。
  • より多くの事を教えた?伝えた?のが、エンジニア歴数年の後輩1名、非エンジニアの新卒2名(メンター)。
  • 私は人に教えることは向いてるっぽい。
    • 私は人に教える事がかなり好きらしい。
    • 私は人に教えると結構好かれるっぽい。
  • 自分の知識の再確認になり、あやふやな事が明確になる。
  • 自分が伝えたいことを伝えるのは難しい。
  • 自分の語彙力が乏しい。
  • 伝えたいときには自信を持って。

何事も自分から動かなければいけないということ

  • あれを使いたい、あれをやりたいと言えば、ある程度は何でもできる職場だったにも関わらず、○○を作った!○○を行った!と、胸を張って言えるような事はできなかった。
  • 最後の辺りには自ら簡易的なWebアプリケーションなども作っていたが、まだまだ積極性が足りていない。
  • 自分が興味ある、知識のある事はまず作って見せる事が大事。

まとめ

  • いい人に囲まれ、いい職場だった。
  • 良い所は継続し、反省点は意識して直していく!

KotlinでHelloWorld

はじめに

先日、私の送別会の場でKotlinやるという話を聞いて、悔しかったので少しは触っておこうと思った次第です。

で、忘れないようにとりあえずblog書く。

Kotlinとは

環境構築

HelloWorld

  • 以下のコードをhello.ktとして保存。
fun main(args: Array<String>) {
    println("Hello, World!")
}

公式に乗ってた

  • jarを作成
    • kotlinc hello.kt -include-runtime -d hello.jar
  • 実行
    • java -jar hello.jar

classにして実行

REPL

  • kotlinc-jvm

script

  • 以下のコードをhello.ktsとして保存。
println("Hello World")
  • 実行
    • kotlinc -script hello.kts

はじめてMacを使って困ったことまとめ

はじめに

年末にはじめてMacを購入しました。(MacBook Pro 2016 13インチ)

10年以上ずっとWindowsのみだった*1私がMacを触ったら困ったことだらけだった上、基本的な事がわからない場合には、調べても出て事ないという事が結構ありました。

WindowsからMacを触る方の役に立つかもしれないので、私の経験を記載しておきます。

基本操作

  • ctrl + space 日本語切り替え
    • 英字キーボードの場合は英数、かなキーがない*2
  • ctrl + クリック 右クリックメニュー
  • 2本指でスクロール
  • アプリケーションのメニューバーは最上部
    • Windowの上ではなく、画面の最上部
  • FinderがWindowsでいうExplorer
    • 特定のディレクトリを開きたい場合は、メニュー → 移動 → フォルダへ移動

超基本ショートカット

  • command + c コピー
  • command + v 貼り付け

キーの読み方?

  • command ⌘
  • shift ⇧
  • option ⌥
  • control ⌃
  • caps lock ⇪

Windowsと比較した場合の修飾キーについて

  • WindowsでCtrlは大体CommandでOK。たまにCtrlの場合も。
  • WindowsでALTはOption

Spotlite検索

  • command + space Spotlite検索
    • これさえ覚えておけばアプリケーション名入れれば呼び出せる
    • これを知るまでターミナルの開き方すらわからず。。。(terminalを入力すれば出てくる。)

インストール

  • 何かアプリケーションをインストールする場合、Windowsのようなインストーラーが出た場合は問題ないが、↓のようなのが出る場合があります。
    • これが出たら、アイコンをドラッグしましょう。
    • アプリケーションフォルダにバイナリを移動している?

f:id:yamap_55:20170309200002p:plain

エスケープ文字

  • Option + ¥
    • Macでは円マーク(¥)とバックスラッシュ(\)はちゃんと区別される。

英字キーボードで英数、かなキー

Karabiner-Elements

  • どこでもかしこでも勧められている。
  • 以下の事前インストールが必要
    • XCode
    • Boost
      • 調べても入れ方出てこない。
      • brew install boost

Gitのインストール

  • Homebrewインストール時に必要となるXCodeのCommandLine Toolsでインストールされる
  • が、バージョン低かったりと使いにくいのでHomebrewで別途インストールがオススメ
    • brew install git

ちなみに個人的な課題

  • トラックパッドの使い方
  • Windowsで言うHOME、END的なショートカット
    • アプリによってfnだったり、Commandだったり。。。
  • Optionキーをほとんど使ってない。
  • Dockの整理
    • っというかDock使ってない。

*1:業務でLinuxを触ることはありますし、Macもアプリケーションの動作確認程度ならばありますが。。。

*2:当たり前

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が変更されていてハマった事があったりします。こういうのって誰もがハマるものなんですかね。