第10回 Jenkins勉強会 に参加しました
場所: テクマトリックス株式会社
発表者用とTwitter垂れ流し用のプロジェクターが用意されていて非常に良かった。
挨拶
日本Jenkinsユーザー会のドメインが変わったとのこと。
講演1:「第三版Jenkins 実践入門 What’s newから見るJenkinsのトレンド」 @yuki_iwnrさん
www.slideshare.net
Jenkins 実践入門の内容紹介
発表中に口頭で取ったアンケートでは、参加者のほぼ全員がプロジェクトでJenkinsを使っていて、5~6割くらいが 2.0 を使っていて 3割くらいが Jenkinsfile を使っていた。 Jenkinsfile はもっと広まるといいのになぁ。
Jenkinsfileに慣れたらもう戻れない... #jenkinsstudy
— yasuhiroki (@duck_yasuhiroki) 2017年7月7日
Jenkins本、Declarative Pipeline がリリースされたので急遽書き直したとのこと。お疲れ様でした... #jenkinsstudy
— yasuhiroki (@duck_yasuhiroki) 2017年7月7日
Declarative/Scripted はまだ悩んでる。Declarativeだと動的に stage や parallel を作れなくて、一部だけ Scripted にしてる。 #jenkinsstudy
— yasuhiroki (@duck_yasuhiroki) 2017年7月7日
Declarative と Scripted のどっちを使うかは悩ましい… Jenkinsfileが大きくなると関数化したくなるんだけど、Declarative だと自分で定義した関数が使えない。 かといって Scripted は自由すぎてメンテし辛い。 今のところ Declarative をメインに使って、どうしても関数化・共通化したい部分だけ Scripted を使うようにしてる。
Jenkinsの情報収集方法について紹介があって凄く助かった。 Pluginの検索ページが新しくなってたの知らなかった…
https://t.co/eCupTD7ULl Jenkinsのプラグイン検索ページ。おしゃれになってる。 #jenkinsstudy
— yasuhiroki (@duck_yasuhiroki) 2017年7月7日
講演2:「Multibranch Pipeline with Docker 入門編」@kimullaaさん
t.co
Jenkinsを使っていたプロジェクトの悩みを、新しいJenkinsでどのように解決していったか、という話。
Jenkins Pipeline の step は確かに種類多い。使いたいものが分かっているので困らないけど、びっくりはするなぁ #jenkinsstudy
— yasuhiroki (@duck_yasuhiroki) 2017年7月7日
Multibranch で設定する古いビルド履歴の保持数は、実際のビルド履歴ではなくてブランチ毎に作られるジョブの数のこと。そうだったのか...! #jenkinsstudy
— yasuhiroki (@duck_yasuhiroki) 2017年7月7日
Jenkins で Docker を使う方法がいくつかあって、その説明と、どう選択したかの話が凄く自分にとってタイムリーで参考になった。
開発者の手元でも同じように Docker を使えるよう
— yasuhiroki (@duck_yasuhiroki) 2017年7月7日
sh step で Docker を使うようにした。 なるほどー。 #jenkinsstudy
Docker pipeline plugin を使ったほうが便利だった。なるほどー! #jenkinsstudy
— yasuhiroki (@duck_yasuhiroki) 2017年7月7日
LT
ピザとビールが振る舞われた! Jenkinsユーザー会から出ているとのこと….。ありがたや!
LT1:「巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱」 @kiy0taka さん
Jenkins の ビルドの通知について。
Jenkins SSE Plugin を使うとジョブに設定しなくても通知を受け取れる。知らなかった!便利だ! #jenkinsstudy
— yasuhiroki (@duck_yasuhiroki) 2017年7月7日
LT2:「Multibranch Pipelineでいろいろ学んだこと」 @AHA_oretamaさん
Multibranch Pipeline を使いはじめて得た知見のあれこれ。 ビルドのTrigger設定はちょうどいじってたばかりなので、大変参考になった。
LT3:「Jenkinsfileのlintで救える命がある」 @miyajanさん
Declarative Pipeline の構文チェックについて。
jflint というツールを作ったとのこと
違うツールもあるらしい
Pipeline Unit Testing Frameworkというやつもあるらしいです。3rd partyで。 https://t.co/VboE94wOym #jenkinsstudy
— ゆーき (@yuki_iwnr) 2017年7月7日
LT4:「来週から始める本番環境の継続的デリバリー 」 @int128さん
お堅い組織で本番環境デプロイするには、な話。
検証環境で実績を作って、本番でも同じ方法で行う、を徹底した。
ビルド職人の待遇改善! #jenkinsstudy
— yasuhiroki (@duck_yasuhiroki) 2017年7月7日
LT5:「プルリクエストCI時の2つのTIPS」 @ikikkoさん
プルリクエスト駆動開発でのCIについて。
Jenkins pipeline は CircleCI や TravisCI と同じようにリポジトリにビルド情報(Jenkinsfile)を置くので、プルリクエストと抜群に相性が良くて、使わない手はない。
リポジトリ間に依存関係がある場合のCIについての話が参考になった。
リポジトリをまたがる場合はブランチ名を揃えて、Jenkinsfile内で依存先に同じブランチ名があれば取り込む。なるほどー。 #jenkinsstudy
— yasuhiroki (@duck_yasuhiroki) 2017年7月7日
メモ
スライド見ててふと、自分の Jenkinsfile の先頭に groovy のシェバン付けてなかったことに気付いた。
そりゃあ vim でハイライトされなくて書き辛いわけだ…。
Kotlin の coroutines + Android で簡単なカウントダウンタイマー
環境
- Android
- Android Studio 3.0.0-alpha4
- compileSdk 25
- minSdk 19
- Kotlin 1.1.2-5
- coroutines 0.16
Kotlin の coroutines 環境セットアップ
ググっても、Kotlinのバージョンによって差がありそうだったので素直に公式を見る。
私の手元では、↓2つのファイルに手を加えればOK
build.gradle (Module)
dependencied { ... def kotlin_coroutines_version='0.16' implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version" ... }
gradle.properties
kotlin.coroutines=enable
coroutine を使う
非同期処理自体はこんな感じ。
launch は kotlinx.coroutines.experimental.launch
UI は kotlinx.coroutines.experimental.android.UI
delay は kotlinx.coroutines.experimental.delay
kotlinで全て完結する。
launch(UI) { while(isActive) { delay(1000) time-- } }
launch
の戻り値は kotlinx.coroutines.experimental.Job
で、 start()
や stop()
といったいかにもなメソッドを持ってる。
なので、それをプロパティにもたせて、
class Timer(time: Int) { private var countDownJob: Job? = null fun countDownStart() { if (countDownJob != null) { return } countDownJob = launch(UI) { while(isActive) { delay(1000) time-- } } countDownJob?.start() } fun countDownStop() { countDownJob?.cancel() countDownJob = null } }
といった感じにすれば、カウントダウンタイマーの処理部分ができあがる。
*1
*1:毎回 launch してるのが無駄な気がする。
firedropを使ってみた
ずっと前に Subscribe してて忘れてたんだけど、beta版のお誘いメールが来て思い出したのでやってみた。
タイトルとリンクしか無いけど、作ってみたのが↓。
https://yasuhiroki.firedrop.me/
「AIがデザインしてくれる貴方のWebサイトを作るサービス」という触れ込みなんだけど、
今のところは、チャット形式で進むチュートリアルで簡単にWebサイトを公開できるサービスな感じ。
チャットっぽい画面に幾つかの選択肢が用意されていて、
たとえば Change Layout とか Publish Site といったボタンがあるのでクリックしてWebサイト作りを進める。
LayoutとかColorは勝手にいい感じにしてくれる…らしいんだけど、レパートリーが少ない気がする。
Beta版なので機能が少ないだけかな。
私自身、デザインはからっきしなので、機械にお願いできるならお願いしたい。期待してる。
Elixir Conf 2017 に行ってきた
行ってきた。Elixir歴2週間(といってもハンズオンでちょっと触った程度)でも十分楽しめた。
経緯
Elixirはずっと気になってたので、イベントが告知された段階ですぐに申し込んだ。
全く触ってなくてもとりあえず行ってみようと思っていたが、Elixir Confの申込後にハンズオンの募集が始まったので、
- Elixir Conf 申し込み
- ハンズオン申し込み
- ハンズオンに行く
- Elixir Conf に行く
というスタックのようなスケジュールだった。
当初は、全く経験なしでも行こう、と思っていたが、実際のところ、ハンズオンで説明を受けながら触った経験があって良かった。
それが無かったら、今ほど Conf を楽しめてなかったかもしれない。
感想
始めはElixir作者 José さんのKeynote。
ゆっくりで、簡単な英語を使ってくれていて分かりやすかった。
今後の予定として型について言及があり、質問もTwitterも盛り上がってた。
午前中は基礎的な話。
Rubyが好きだけど業務ではJavaScriptなエンジニアなので、関数型プルぐラミング・並列プログラミングのどちらも馴染みがなかったが、
どちらもきちんと説明してくれていたので有難かった。
「Elixir Way」を分かってないと、逐次的な実装になりがちで、それって並列で処理されないからせっかくElixirで書いてるのにもったいない、らしい。頭で分かっても実際に実装できるかは…慣れだなぁ….。
午後からはガチ話が増えてきて、分かるようで分からない話がちらほら。OTPはまだ全く分かってない。
Elixir/Erlangの特性が活きる、小さな処理を大量にさばくために活用している話がほとんど。
もう少し触ってからスライドを見直すのが良さそうだけど、そもそも今の私には紹介されたような事例と出会う場面がなさそう。
LTはやっぱり楽しい。こういうイベントにLTは欲しい。
特別枠はすごく熱い話だった。
最後に時雨堂のVさんのKeynoteで締めくくり。
フリートークに近い話の進め方だったけど、Erlangをがっちり使い続けた方の話なので、これが面白くないわけがない。楽しすぎる。
全体を通して刺激ある一日だった。
無線環境も安心のCONBUさんで快適だった。
電源がなかったことだけが悩みだった・・・。
Elixir初心者向けハンズオンに行ってきた
Elixir楽しい。
きっかけ
1年くらい前に Rebuild.fm や 勉強会などで Elixir の名前を知って興味を持っていたが、 同じくらいの頃に業務で TypeScript を触り始めたので、同時 2つの言語を勉強する力が無く、ずっと放置していた。 最近になって、ようやく時間に余裕ができたぞ、と思ったタイミングでこのイベントを知り、すぐに申し込んだ。
流れ
会場はレバレジーズ。 会場の案内や挨拶の後、 @ohrdevさんによるElixirの概要説明を受け、いざハンズオン。
やったこと
↑を進めてElixir でチャットアプリを作った。 Pub/Subも WebSocket も初めてだったけどすんなり動いた。
Twitter/Gitter/口頭で質問できるので、進捗ダメです、なことにはならない、と思う。
一通り終わったら人によってやることは様々で、私は Elixir School を読み進めてた。 パターンマッチ面白い。この辺もっと深掘りしたい。
メモ
以下、メモ書き
- Elixirはコンパイル言語(知らなかった!)
%{a: 1, b: 2}
==%{:a => 1, :b => 2}
!=%{"a" => 1, "b" => 2 }
- OTP
- Open Telecom Platform
- 並列プログラミング用のフレームワーク・開発環境・ライブラリ集
- 汎用的な処理のパターン(ビヘイビア)を提供
- 全く分かってないので調べる
- mix
- mixコマンドで Elixir のプロジェクトを作成・管理する
- こういうツールが標準で入ってると便利…
- mixコマンドで Elixir のプロジェクトを作成・管理する
おまけ
ファイルの空行を削除するElixirのワンライナー書いた
空行を消す
— yasuhiroki (@duck_yasuhiroki) 2017年3月11日
elixir -e '"./file"|>https://t.co/zdQoPhQr2e|>elem(1)|>String.split("\n")|>Enum.filter(&(&1 != ""))|>Enum.join("\n")|>IO.puts'
FLOCSSなディレクトリ・ファイルを作成するシェル
無理やりワンライナーっぽくしてみた。
echo foundation/{_base,_reset} \ layout/{_footer,_header,_main,_sidebar} \ object/component/{_button,_dialog,_grid,_media} \ object/project/{_articles,_comments,_gallery,_profile} \ object/utility/{_align,_clearfix,_margin,_position,_size,_text} \ | \ xargs -n1 -I% bash -c \ 'mkdir -p $(dirname scss/%); [ ! -f scss/%.scss ] && { : > scss/%.scss; echo "@import \"%\";" >> scss/app.scss; }'
もうちょっと綺麗にできるといいなぁ。
yarnpkgは~/.yarnrcを見ている
なので、シェルをカスタムするためのオレオレ設定を ~/.xxxrc
に書いてるとあかんよ、という話。
yarnを使おうとしてインストールしたけど動かなかった。
$ yarn init yarn init v0.15.1 error SyntaxError: Unknown token 1:0 at Parser.unexpected (/usr/local/Cellar/yarn/0.15.1/libexec/lib/node_modules/yarn/lib-legacy/lockfile/parse.js:218:11) at Parser.parse (/usr/local/Cellar/yarn/0.15.1/libexec/lib/node_modules/yarn/lib-legacy/lockfile/parse.js:323:14) at exports.default (/usr/local/Cellar/yarn/0.15.1/libexec/lib/node_modules/yarn/lib-legacy/lockfile/parse.js:13:17) at /usr/local/Cellar/yarn/0.15.1/libexec/lib/node_modules/yarn/lib-legacy/registries/yarn-registry.js:105:62 at next (native) at step (/usr/local/Cellar/yarn/0.15.1/libexec/lib/node_modules/yarn/node_modules/babel-runtime/helpers/asyncToGenerator.js:17:30) at /usr/local/Cellar/yarn/0.15.1/libexec/lib/node_modules/yarn/node_modules/babel-runtime/helpers/asyncToGenerator.js:28:20 at run (/usr/local/Cellar/yarn/0.15.1/libexec/lib/node_modules/yarn/node_modules/core-js/library/modules/es6.promise.js:87:22) at /usr/local/Cellar/yarn/0.15.1/libexec/lib/node_modules/yarn/node_modules/core-js/library/modules/es6.promise.js:100:28 at flush (/usr/local/Cellar/yarn/0.15.1/libexec/lib/node_modules/yarn/node_modules/core-js/library/modules/_microtask.js:18:9)
lockfile
がどうのと言っているが、 yarn.lock ファイルは作ってない。
GitHubのIssueを漁ったところ
Getting SyntaxError when running basic command · Issue #613 · yarnpkg/yarn · GitHub
~/.yarnrc
が原因だと判明。
私は、色々なツール・コマンド用のオレオレ設定を ~/.xxxrc
に書いて source
で読み込むようにしていた。
その癖で ~/.yarnrc
を作って、 export PATH=~/.yarn/bin:$PATH
などと設定していたのだけど、それが悪かった。
現在のyarnは、yarn自身の設定を ~/.yarnrc
から読み込む。
設定ファイルの管理場所考え直そう..