読者です 読者をやめる 読者になる 読者になる

お互いをつなぐものについて

こう…。

メンバーに「もっと責任感を持って仕事して欲しい」とか。マネージャーに「もっと窮屈じゃない感じで仕事させてほしい」とか。そういう状況を良くするために最初にやるのは、お互いに信頼すること。かなぁ。

とか、ぼーっと思った。

お互いに、良いものを作りたいと思ってる、良い環境にしたいと思ってる。ということを信頼する。だけど、お互いに完璧じゃなくて、まだまだ学ぶことがあるし、失敗もする。ということを受け入れる。

お互いを信頼でつなぐと、支え合って良くしていける感じある。

そこに踏み込まずに、楽な方にながれちゃうと、ルールでつないでしまうことになるのかなぁ。マネージャーとしてこうあるべき、とか、メンバーとしてこうするべき、とか。

そうすると、失敗をしないように。今の自分が安心できる範囲の中で過ごしてしまいそうで。それって、学び続けてもまだまだ学ぶことがあるなぁって思ってるので、僕は困る。

今は信頼しあえてる環境にいる(と思ってる)ので、困ってない!

信頼する。ってのは「裏切られるのが怖い」とか言ってた10年前の僕には分からなかったことで。今少し分かる気がするのは、妻と娘たちのおかげなんだろう。

とか、ぼーっと思った。今週は東京。がんばる!

Headless ChromeをDockerに入れてGebで遊んでみた

昨日書いたんだけど、Kafkaを触ろうと思ってるんだよ?でも、触ろう触ろうと思ってると、違うものが目に入ってくるのであった。ということで

Headless Chromeで遊んでみた

Kafka一切関係なく、この記事を見かけたから。

Getting Started with Headless Chrome  |  Web  |  Google Developers

この辺のこともあるので、ちょっと見とこうかなって。

Phantom.jsのメンテナー、プロジェクトの将来に疑問を呈し、その座を降りる

ただ、今手元にある環境でごにょごにょするのもなんか嫌だなぁ・・・って思ったので、無駄にDockerに詰め込んでGebで遊んでみた。そして、そのせいで疲れた(ヽ´ω`)

できあがったものは

これ。

https://github.com/bufferings/sandbox-gebheadlesschrome

docker-composeで起動すると

$ docker-compose run app

Chrome(beta)とChromeDriverとGroovyがインストールされた状態で、インタラクティブモードで起動する。

root@4013e872287a:/geb# google-chrome --version
Google Chrome 59.0.3071.29 beta

root@4013e872287a:/geb# chromedriver --version
ChromeDriver 2.29.461571 (8a88bbe0775e2a23afda0ceaf2ef7ee74e822cc5)

root@4013e872287a:/geb# groovy --version
Groovy Version: 2.4.11 JVM: 1.8.0_131 Vendor: Oracle Corporation OS: Linux

Chromeを動かしてみる

これで動くかな?と思って、試しに叩いてみたらエラーになった。

# google-chrome --headless

ので、エラーメッセージからぐぐって、 dockerでGUIのアプリを使用する(chromium) | ぴあっこ作業日誌 を参考にして --no-sandbox をつけてみた。Dockerで実行してることが原因みたいね。

# google-chrome --headless --no-sandbox

一歩進んだけど、まだエラーが出るので Getting Started with Headless Chrome  |  Web  |  Google Developers をもういちど良く見てみたら、途中の例には書いてないけど、最初の方に --disable-gpu が今は必要って書いてあった

# google-chrome --headless --no-sandbox --disable-gpu

(∩´∀`)∩ワーイエラー消えた。

キャプチャとってみる

Getting Started with Headless Chrome  |  Web  |  Google Developers のサンプルに --no-sandbox --disable-gpu をつけて実行

# google-chrome --headless --no-sandbox --disable-gpu \
                --screenshot --window-size=412,732 https://www.chromestatus.com/

したらscreenshot.pngってファイルが作られてた(rootの600だったので666にした)。

あら・・・。

f:id:bufferings:20170503175152p:plain

もう一回実行したら撮れた。撮れるときと先走るときがあるみたいね。

f:id:bufferings:20170503175202p:plain

Gebで実行

Groovy入れといたのはGebで実行してみようかなと思って。なので、Geb動作確認用のファイルも置いといた。実行するとGebがHeadless Chromeを使って、 Googleのホームページを開いてキャプチャとる。そんな感じ。初回実行時は依存ライブラリーをとりにいくのでしばらく待たされる。

# groovy Hello

Gebからの画面キャプチャは、フォントが入ってないからこんなんだけど。撮れた。

f:id:bufferings:20170503164750p:plain

Chromeのキャプチャ

ヘッドレスかどうかに関係なく、Chromeのキャプチャは見えてる範囲だけみたいよね。

↓のサイトに「こんな風にして全画面キャプチャーツールとして使えるよ」ってあるけどよく分かってない。

Using headless Chrome as an automated screenshot tool

僕の作ったDockerfileの注意点

キャプチャーとかの出力ファイルがrootで作られるので、ホスト側から触るときにちょっとめんどくさい。

これ以降はたぶん全く忘れてるであろう1年後の自分への解説。

SDKMAN!

SDKMAN! the Software Development Kit Manager

を使って、JDKとGroovyを入れた。全然知らなかったんだけど簡単だったよ。

# Java & Groovy
RUN curl -s "https://get.sdkman.io" | bash \
    && echo "gvm_auto_answer=true" >> ~/.sdkman/etc/config \
    && /bin/bash -c "source /root/.sdkman/bin/sdkman-init.sh && sdk install java && sdk install groovy"

Chrome

この辺を参考にしてHeadlessに対応してるベータ版を入れた。

https://github.com/ebidel/lighthouse-ci/blob/master/builder/Dockerfile

# Chrome
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add - \
    && sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list' \
    && apt-get update \
    && apt-get install -y google-chrome-beta

ChromeDriver

ここを参考にして入れた。

docker-chromedriver/Dockerfile at master · RobCherry/docker-chromedriver · GitHub

# ChromeDriver
RUN CHROMEDRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` \
    && mkdir -p /opt/chromedriver-$CHROMEDRIVER_VERSION \
    && curl -sS -o /tmp/chromedriver_linux64.zip http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip \
    && unzip -qq /tmp/chromedriver_linux64.zip -d /opt/chromedriver-$CHROMEDRIVER_VERSION \
    && rm /tmp/chromedriver_linux64.zip \
    && chmod +x /opt/chromedriver-$CHROMEDRIVER_VERSION/chromedriver \
    && ln -fs /opt/chromedriver-$CHROMEDRIVER_VERSION/chromedriver /usr/local/bin/chromedriver

Grape

Gebを試しに動かしてみるのにGrapeってGroovyの依存管理機能を初めて使ってみた。CLOVERを読みながらやってみた。

Groovyの簡易依存関係管理ツール、Grapeを使ってみる - CLOVER

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

import geb.Browser

Browser.drive {
    go "https://google.com/"
    report "sample"
}.quit()

Grapeがライブラリを置いておくディレクトリ(~/.groovy/grapes)は、ボリュームマウントしておくことにした。2回目以降取りに行かなくていいように。

Geb

この部分は

Browser.drive {
    go "https://google.com/"
    report "sample"
}.quit()

Googleのホームページを開いて(go)、"sample"って名前でキャプチャ(htmlとpng)を取って(report)、ブラウザを閉じる(quit)。ってことね。

GebConfig

んで、今回のメインのGebConfigだけどオプションを3つ指定して起動してるだけ。

import org.openqa.selenium.chrome.ChromeDriver
import org.openqa.selenium.remote.DesiredCapabilities
import org.openqa.selenium.chrome.ChromeOptions

reportsDir = "target"

driver = {
  ChromeOptions options = new ChromeOptions()
  options.addArguments("--headless", "--no-sandbox", "--disable-gpu")

  DesiredCapabilities capabilities = DesiredCapabilities.chrome()
  capabilities.setCapability(ChromeOptions.CAPABILITY, options)

  new ChromeDriver(capabilities)
}

docker-compose

は、マウントとか指定するのが面倒だったから書いただけ。

version: '3'
services:
  app:
    build: .
    working_dir: "/geb"
    volumes:
    - ./geb:/geb
    - ./grapes:/root/.groovy/grapes

面白かった

Dockerじゃなかったらあっさりしてたと思う。おしまい。

2017-05-04 追記

やっぱり動かんかった。

root@42dbeb2a9909:/geb# google-chrome --no-sandbox --disable-gpu --screenshot --window-size=412,732 https://www.chromestatus.com/
root@42dbeb2a9909:/geb# [0503/235453.940351:ERROR:nacl_helper_linux.cc(311)] NaCl helper process running without a sandbox!
Most likely you need to configure your SUID sandbox correctly

Gebの方はこんな感じになった。

Caused by: org.openqa.selenium.WebDriverException: unknown error: Chrome failed to start: exited abnormally
  (Driver info: chromedriver=2.29.461571 (8a88bbe0775e2a23afda0ceaf2ef7ee74e822cc5),platform=Linux 4.8.0-49-generic x86_64) (WARNING: The server did not provide any stacktrace information)

Kafka触るのにVagrantとAnsibleで砂場環境を準備

Dockerだと関係ないところでハマりそうな気がしたのでVagrantにしてみた。ファイルはここに置いといた。

https://github.com/bufferings/sandbox-kafka

Vagrant + Ansible Local Provisioner

以前に触った時は、Ansible2系が出たばかりで、ちょっと手を入れなきゃ動かなかったけど、もう大丈夫だった。のでこんな風にすっきり。

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/xenial64"

  config.vm.provider "virtualbox" do |vb|
     vb.memory = "2048"
  end

  config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "playbook.yml"
  end
end

AnsibleでKafkaのQuickStartができる程度の環境を準備

っても、ファイルダウンロードして解凍するだけ。

playbookの書き方のルールとかよくわかってない。こんな感じに落ち着いた。

- hosts: all
  become: yes

  vars:
    scala_version: "2.11"
    kafka_version: "0.10.2.1"

    install_dir: "/opt"
    symlink_name: "kafka"
    kafka_name: "kafka_{{ scala_version }}-{{ kafka_version }}"
    kafka_download_url: "http://ftp.jaist.ac.jp/pub/apache/kafka/{{ kafka_version }}/{{ kafka_name }}.tgz"

  tasks:
  - name: ensure openjdk8 present
    apt:
      name: "openjdk-8-jdk"
      state: present
      update_cache: yes

  - name: ensure kafka present
    unarchive:
      remote_src: yes
      src: "{{ kafka_download_url }}"
      dest: "{{ install_dir }}"

  - name: ensure symlink present
    file:
      src: "{{ install_dir }}/{{ kafka_name }}"
      dest: "{{ install_dir }}/{{ symlink_name }}"
      mode: 0755
      state: link

ということで

クイックスタートする前に今日は力尽きた。動作確認を少ししただけ。

https://kafka.apache.org/quickstart

参照

以前にAnsible Local触った時:

bufferings.hatenablog.com

以前にKafka Streamsを触った時:

bufferings.hatenablog.com

それを読んだ時の僕:

#Java本格入門 は実践的だなー!

Java本格入門を読み終わりました。著者の谷本さんからいただきました。ありがとうございます。もし面白くなかったらどうしようwとドキドキしながら読み始めましたけど、全然そんなことはなくて色々と勉強になりました。本当に読んで良かったです。周りの人にもおすすめしたい一冊です。

楽天ブックス: Java本格入門 - モダンスタイルによる基礎からオブジェクト指向・実用 - 谷本心 - 9784774189093 : 本

機能ごとにひとめぐりしてくれてるところが良い

僕は1.4の頃にJavaに入門して、その後は新しい機能が追加されたらそれをチェックしていく、という感じでつけたしつけたしやってきたので、頭の中がごちゃごちゃしていたのですが。Java本格入門では、基本的な文法からJava8の機能までを時系列ではなく機能ごとにひとめぐりしてくれてるので、頭の中が整理されました。

また、自分が知識を更新していく中でキャッチアップできていなかった部分も結構あって、そのあたりを押さえることができたのも良かったです。「へー!」って言いながら読んでました。

新しい機能の情報だけじゃないところが良い

例えば、Date and Time APIみたいに新しい機能の情報はもちろんあるのですが、それと同時にDateやCalendarのような以前の機能の説明もしっかりしてくれているのが良かったです。仕事だと、何年か前に書かれたコードをメンテナンスしていくことも多く、ちょっと前の機能の知識も大切ですからね。

それと、「どういう経緯でこうなってるのか」みたいなところも分かって良いですね。FileとPathってなんで似たようなのがあるん?とか。

どのように使うのかが書いてあるのが良い

何ができるのか、だけじゃなくて、その機能をどのように使うのか、が書いてあるのが良かったです。文字列の結合機能の使い分けや、Listの実装クラスの使い分け。それから、日付の機能みたいに新旧あるものの使い分けなど。

説明の際には「筆者はこのように使っています。理由は…」と著者の方の経験や考えを示してくれているので、あぁ、そういうことかぁ、と、とても理解しやすいです。理由を説明してくれているので、自分の状況に合わせて考えられるのも良いですね。

どういう人におすすめか

上記の通り、Java8までの機能をひとめぐりしてくれていて、新旧機能を教えてくれていて、それぞれの機能をどのように使うか、までを著者の方々の経験を元に書いてくれているので、業務を見据えた、とても実践的な入門書だなと思いました。デザインパターンMavenCheckStyle、Jenkinsに触れているのも良いですね。

なので、

  • 2,3年目で「もう一歩深く入門したい!」という人や
  • 35歳らへんで「Java5あたりで現場から離れてしまって最近のJava全然知らんわ」って人や
  • あとは僕みたいに「仕事でなんとなく使ってしまってるけど、ちゃんともういちどおさらいしておきたい」って人におすすめです!

読み終わった後に、調べとくといいだろうなと思うのは

  • ExecutorServiceの使い方
  • お金周りの計算はBigDecimalでやる

かな。

個人的に好きなところ

は、サロゲートペアの説明があるところかな。

おもしろかったー!!!たまに読み返してみるー。

(´-`).。oO(Mob Programming)

Mob Programmingのことを考える機会があったので。

Mob Programming

のことを知ったのはRegional Scrum Gathering Tokyo 2017のRachelの基調講演。

↓のスライドのp.31のところ

https://www.slideshare.net/RachelDavies/growing-agile-practice-70951185#31

おぉ。って思った記憶がある。

Mob Programming

をなぜやるんだろう?って考えてたら Yotaro TAKAHASHI (@PoohSunny) | Twitter が色々意見を聞かせてくれて。

で、このYouTube見たらいいよって教えてくれたので見た。なるほどなぁって思った。

Mob Programming: A Whole Team Approach - Agile Singapore Conference 2016 - YouTube

「チームがやりたいと決めたからやってる」

って言ってるんだけど、じゃあチームはどうしてやりたいって思ったんだろう?理由なんてなくて「実際に楽しいし、実際にアウトプットも多くなってる」かもしれないけど。

僕だったらどういう理由でやりたいと思うだろう?って、実際に試してみる前にぼーっと考えてみた。

レビュー

スクラムとかペアワークとか導入してても、やっぱりレビュー。に時間がかかる。ペアワークでやってるからだいぶましにはなってるけど。

よくある質問は「レビュー対応のチケットにはどれくらいの時間を見積もったらいいか?」とかだったりするし。

時間がかかる原因

は、フィードバックループがちょい長いところかなぁ。それと、他のペアが知っていることがある。かな。

結局「チーム全員の叡智を集めてチームのアウトプットにする」という考えがあるから。

Mob Programming

チーム全員レビューを入れるくらいなら、Mob Programmingの方が良さそうかなって思った。

特に、方向性を決めるときが効きそう。そこで全員が経験と認識を共有できる、というのは良さそうだなぁ。

ルール

そういえば、Youtubeの中で、ルールとして「誰かのアイデアは別の誰かの手を通して入力されないといけない」ってのがあって。

あぁ、これは良い、と思った。Driverが考えて打ち込んだら、その考えは誰からも見えないもんね。

という雑なメモでした。

Azure上のDC/OSでDatadogを有効にしてみた

ここに書いてあるとおり、DC/OS UniverseにDatadogがあるのでAPI Keyを設定して有効にするだけ。

docs.microsoft.com

そしたらグラフが出てきた(喜

f:id:bufferings:20170410075851p:plain

全く分かってないけど、見た目には満足した。

ほんのちょっとだけDeep Learningを勉強するー

今月1ヶ月間だけに限定してDeep Learningを勉強してみよう!ってことになった。ので、本当に表面的なところを頑張ってみようかなと思う。

そもそもDeep Learningって何?

ってところからなので、ここを読んだ。分かりやすい。

blogs.nvidia.co.jp

あ、待って、そもそもGPUって何?

ってことで、ここを読んだ。これも分かりやすい。

bita.jp

その次に

GDG Kyoto上野山さんのスライド。分かりやすい。

TensorFlow を使った 機械学習ことはじめ (GDG京都 機械学習勉強会)

それから

Eureka香取さんの記事。分かりやすい。

developers.eure.jp

てことは

TensorFlowのチュートリアルをやればいいのかなぁ?ってウロウロしてたら、こんなの見つけた。

deeplearning4j.org

Deep Learning for Java!!

Javaなら頑張れる気がする!まずはチュートリアルでもやってみようかな。