山pの楽しいお勉強生活

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

GroovyでJSONをPOSTする

概要

  • ↓をGroovyでやりたい。
curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":"abcdef","user":{"name":"tarou","age":20,"email":"example@example.com","result":true}}' https://script.google.com/macros/s/xxxxxxxxx/exec
  • groovy.json.JsonBuilder を利用してJSONを作成。
  • groovyx.net.http.HTTPBuilder を利用してPOSTする。

コード

@Grab("org.codehaus.groovy.modules.http-builder:http-builder:0.7.1")

import groovyx.net.http.HTTPBuilder
import groovy.json.JsonBuilder
import static groovyx.net.http.ContentType.*

def json = new JsonBuilder()
json {
  id "abcdef"
  user {
    name "tarou"
    age 20
    email "example@example.com"
    result true
  }
}
def postBody = json.toString()

assert postBody == $/{"id":"abcdef","user":{"name":"tarou","age":20,"email":"example@example.com","result":true}}/$
/*
{
  "id":"abcdef",
  "user":{
    "name":"tarou",
    "age":20,
    "email":"example@example.com",
    "result":true
  }
}
*/

def http = new HTTPBuilder("https://script.google.com/macros/s/xxxxxxxxx/")

http.post( path: 'exec', body: postBody,
           contentType: JSON ) { resp ->
  println "POST Success: ${resp.statusLine}"
}

参考

JSONをPOSTしてGoogle SpreadSheetに書き込む

はじめに

  • GAS(Google Apps Script)でPOSTを受け付けて、SpreadSheetに書き込む手順です。
  • 認証はありませんので、URLがわかれば誰でもPOSTできてしまうので注意。
  • GroovyからSpreadSheetに書き込みたかったが、GData APIを使用するためのライブラリである、gdata-java-clientをGrapeで入れようとしたら、うまく入らなかったのでやめたという経緯があったりします。

仕様

{
  "id":"abcdef",
  "user":{
    "name":"tarou",
    "age":20,
    "email":"example@example.com",
    "result":true
  }
}

手順

  • スプレッドシートを作成
    • 適当にヘッダとか作っときます。
  • ツール → スクリプトエディタ
  • GASのコードを書く。
    • doPostはPOST、doGetはGETの時に呼ばれます。
    • 今回はPOSTで作成。
function doPost(e) {
  var jsonString = e.postData.getDataAsString();
  var data = JSON.parse(jsonString);

  var id = data.id;
  var name = data.user.name;
  var age = data.user.age;
  var email = data.user.email;
  var result = data.user.result;

  // シート取得
  var ss = SpreadsheetApp.openById(SpreadsheetApp.getActiveSpreadsheet().getId());
  var sheet = ss.getSheetByName("シート1");
  
  // データ入力
  sheet.appendRow([id, name, age, email, result]);
}
  • 保存
  • 公開 → ウェブアプリケーションとして公開
  • プロジェクトバージョン
    • 新規作成
    • コミットコメント
  • 次のユーザとしてアプリケーションを実行
    • 自分
  • アプリケーションにアクセスできるユーザー
    • 全員(匿名ユーザーを含む)
    • ↑に設定することで認証が行われない。
  • 「承認が必要です」というダイアログが表示される。
    • 許可を確認 → 許可
  • 「現在のウェブアプリケーションのURL」をメモ。
  • POST(URLは↑で確認したURLに置換してください。)
curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":"abcdef","user":{"name":"tarou","age":20,"email":"example@example.com","result":true}}' https://script.google.com/macros/s/xxxxxxxxx/exec
  • 確認 f:id:yamap_55:20170509025238p:plain

参考

We Are JavaScripters! @6thに参加してきた #WeJS #21cafe

はじめに

4月27日(木)に「We Are JavaScripters! @6th」という勉強会に参加してきた時の自分用メモです。*1

全てLTなので、資料見たほうが早いかと思いますw

概要

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

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

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

※誰でも怖がらずに登壇できる空気を作りたいだけだけなので、もちろん玄人のみなさんも登壇大歓迎です!!
  • イベント申込時の主催者アンケートだと、JavaScript初心者が半分くらいだったらしいです。
    • 個人的には怪しいと思ってますがw

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

LT.2:Elmの話(仮) @boiyaa

関連ツイート↓

LT.3:==と=== @IganinTea

関連ツイート↓

LT.4:そろそろwebpackと真剣に向き合ってみる。 @Nao-bt

  • 公式ページ
  • 大量のJSを書くと死ぬ。
  • 大量のJSのコードをモジュールごとに分ける。
  • 言語仕様としてはモジュールをサポートしていない。
  • ↓の4個を覚えとけ
  • Entry
    • アプリの中で最初に読み込むファイル
  • Output
    • ビルドの結果を出力する設定
  • Loaders
    • ビルドの際にモジュールのソースコードに適用される変換を指定する。
    • testって書かないとエラーとなるのがハマりどころらしい。
  • Plugins
    • ビルド時の設定を行う。
    • ビルドの際にファイルの圧縮だったり、コンパイルエラーを無視?するとか。

LT.5:TypeScriptでDDD~RepositoryとEntity編~ @mrdShinse

LT.6:jsのGCについて @brn0227

  • Javascript Garbage Collector overview
    • 発表資料
  • 関数は会議
  • Stackはホワイトボード
    • 関数単位で割り当てられるので、終了すると自動で廃棄
  • Heapは議事録
    • プログラムで制御

LT.7:はじめてのReact: ES2015の実用 @Jay

  • はじめてのReact
  • HelloWorldの代わりになる自分のやったことの発表
  • セミコロンレスで書いたらしい。

LT.8:オブジェクトの作成とコンストラクタの話 @chikoski

*1:公開が遅れて申し訳ありません。(書いたとばっかり思ってました。。。)

JJUGナイトセミナーに参加してきた(4/24) #JJUG

4/24に開催されたJJUGナイトセミナーに参加してきた際のメモ。(後で追記予定

概要

今回はテスティング特集と称しまして、JUnit他についてその道のプロの方々にお話いただきます!

「Modern unit testing with JUnit 5」

概要

JUnit is the tool of choice when it comes to unit testing in Java. The current version JUnit 4 has been working reliably for many years but despite some advancements it has now reached its limits. JUnit version 5 is a complete rewrite and will be released soon. In the session, we will discuss what is new in JUnit 5 and what needs to be considered when upgrading.

メモ

  • JUnit5の説明。英語セッション。
  • JUnit4と互換性がとられているらしい。
    • そのままで動くとのこと
  • パラメーター渡すテストや、DisplayNameはかなり便利そう。
    • ParameterizedTest
    • 直接値渡す以外に、CSVで渡すこともできる。
  • 逆にタグ付けや、繰り返しは使うタイミングは少なそう。
  • インターフェイスのテストの箇所はよくわからなかったので後で復習。
  • IDEは対応してくれているみたい。
    • NetBeansは?ってなってたw後で誰か補足してくれるかな?
  • Maven、Gradle共にJUnitチームがプラグインを開発しているらしい。
  • Jenkins対応は?ってなってた。XML出力すれば勝手に読んでくれるような気がするけど。。。
  • 現時点ではM4
  • 7月にリリース予定?けど遅れそうなのかな?(笑いが出てた)

アジャイルテスティング -バグ埋め込みを年間1件にまで減らした戦略-」

概要

アジャイル開発におけるソフトウェアテストへの態度に関する発表です。4年間開発しているチームにおける品質向上の取り組みで、次のスライドの再演になります
https://speakerdeck.com/kyonmm/aziyairutesuteingu-bagumai-meip-miwonian-jian-1jian-nimadejian-rasitazhan-lue-number-nagoyatesting

メモ

  • バグの数を年1件にした話。
  • バグの根源はムリからきている。そのバグをテストで取り除こうとするのはムダ。
  • やったこと
    • バグの分析
    • チームの分析
    • 理想像を構築
    • チームを帰る情熱と理論を構築、共有
  • ↑の普通のことをどう進めるのか。
  • ビジョンをはっきり持つ。
    • そのためのリスクは許容する。
    • なんども伝える。(400ー800位言う
  • 基本に立ち返る。
    • 失敗しているなら、まずは基本と違うところを基本に戻してから考える。
    • 基本に立ち返ると比較しやすい。
  • 積極的な暗黙知
    • これはちょっと同意できないけど、どうなんだろうか?
    • チームメンバーのレベルが高いといけるのか?
  • 凄い高品質なドキュメントがあった(作成した)としても、それをうまく使う方法論はない。
  • 最小6分、最大1時間の単位でタスクを全て書き出している。
    • 12ー18分のタスクが多いらしい。

「pact-jvmではじめるコンシューマー駆動契約」

概要

マイクロサービスアーキテクチャーの普及を始めとする近年の開発トレンドの風潮により、サービスのコンポーネントをテストする上でサービス間の依存関係を考慮することが必要とし、テストの難易度が増してきています。このセッションではサービス相互のインターフェースの仕様と実装の妥当性を検証する方法としてコンシューマー駆動契約にスポットをあて、その実装であるpact-jvmを例にして解説します。

メモ

  • pact-jvm
  • よくある話
    • モックが多すぎる
    • テストのメンテナンスが辛い
  • マイクロサービス化の流れがきているが、三層アーキテクチャー(MVC)に縛られすぎている。
  • トーリーではなくジャーニーをテストする
    • 外部に対するサービス呼び出しをモック化。
  • pact-jvmとはPactのJVM言語向け移植版
  • テスト自動化ピラミッドの考え方はコンシューマー駆動契約を導入しなくても有効。
  • ユニットテスト、エンドツーエンドテスト双方を補完する。

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