主夫ときどきプログラマ

データベース、Webエンジニアリング、コミュニティ、etc

OSS Gateワークショップ京都を開催しました

f:id:masayuki14:20190824182012j:plain
記念撮影。みんなので O S S G !!

OSS Gateワークショップを1年ぶりに開催しました。会場は株式会社 マネーフォワード 京都支社 さんにご協力いただきました。

今回も進行役として参加し、ビギナー、サポーターは共に1名というかなりこじんまりとした開催になりました。 最少催行人数ってやつですね。

oss-gate.doorkeeper.jp

進行も4回目ということで特に緊張はしませんでしたが、内容を思い出しながらやった手前、同じことを何度も言ったりする場面もあったり。 とはいえ全体としては「わかりやすかった」との感想もいただけたのでうまくこなせたと思います。

あらためてワークショップをやってみて感じたのが

  • 作業メモをとる
  • 自分の気持を理解して整理する
  • 相手がわかるように書く

などのポイントが普段の仕事やコミュニケーションにも通じていることです。

自分も新しいことをやるときにはGitHubのIssueを使って作業メモを残しますし、それを元にブログやスライドを作ったりすることもあり役立っています。 また仕事でドキュメントを書く時はなるべく「初めて使う人」を想定して書いていたりします。
3年前にワークショップに初めて参加しましたが、そのとき得た経験がいまでも生かされていることに気付きました。

また、フィードバックをユーザー視点、開発者視点それぞれ別の視点からみることで違う面が見えてくるように、コミュニケーションでも自分視点、相手視点のそれぞれで考えてみると違ったものが見えてきそうです。

次回については未定ですが、マネーフォワードさんが会場提供に好意的なのでまたお願いして開催できそう。半年以内にできるといいなという感じです。

ワークショップの様子

今回で訪れるのは4度目ですが、いつきてもオシャレなエントランスですね。行灯もいい雰囲気です!!

f:id:masayuki14:20190824164851j:plain f:id:masayuki14:20190824165102j:plain

対象OSSをビギナーとサポーターが相談しながら決めていきます。
今回は python-prompt-toolkit に決まりました!

f:id:masayuki14:20190825165354j:plain

公式READMEに沿って動かしていきます。

f:id:masayuki14:20190825165424j:plain

休憩のおやつには、船はしや のあられを用意しました。船はしやは三条大橋のたもとに佇む老舗のあられ屋さんです。今まで気になってはいたものの一度も食べたことなかったのでチョイスしてみました。
お醤油とごまの風味が香ばしく、歯ざわりよくパリパリと食べられて大変おいしゅうございました。おすすめです。

f:id:masayuki14:20190824145746j:plain
f:id:masayuki14:20190824145959j:plain
f:id:masayuki14:20190824150017j:plain

後半では前半に見つけたポイントを整理して、開発元にフィードバックします。前半とちがい自分で考えてアウトプットする必要があるのでけっこう時間がかかります。

f:id:masayuki14:20190825172106j:plain

フィードバックを提出し(今回はGitHubにてIssueの作成)OSS開発者の仲間入りをはたしました!

f:id:masayuki14:20190824170953j:plain

今回はテーブルを使わせていただきましたが、隣には大きな和室もあります。Kyoto.rbや私の主催するはんなりPythonではこちらを使わせて頂いています。
そして、遂に、座布団が導入されました!!しばらくしたら座椅子も導入されるようです。これで長時間座っていても足が痛くならない!!
ありがとうございます!!

今回もそうですが、マネーフォワードさんは京都のいろいろなコミュニティに協力的で会場の提供などを行っていただいています。いつもありがとうございます!

f:id:masayuki14:20190824142611j:plain  

ステッカーも自由に頂けます!

f:id:masayuki14:20190824165200j:plain

書棚の技術書も充実しております!

f:id:masayuki14:20190824165938j:plain

ソファに座るにはブラウンさんに一言ことわってください!

f:id:masayuki14:20190824170036j:plain

OSS Gate Workshopの他にもいろいろな勉強会が開催されているので、マネーフォワードさんが気になる方は一度足を運んでみてください!

過去の開催の様子

masayuki14.hatenablog.com

labs.spookies.co.jp

Compose on Kubrenetes をGKEで動かす - まずはローカルで動くようにする

f:id:masayuki14:20190607132605j:plain

以前この記事で書いたように Compose on Kubernetes をローカルで試した。

masayuki14.hatenablog.com

サンプルのYamlで動かすことは出来たけど、自プロダクトのYamlは動かなかったのでまずはそれを解消することを目指した。また Kubernetes もそうが、Docker自体への理解も深めることも必要だった。

やったこと

  • 本読み : 体系的に理解する
  • Dockerfile にソースを含める
  • ローカルレジストリの設置

今回のゴールは自プロダクトで使っている docker-compose.yml をローカルのCompose on Kubernetes で動作させること。 そのためにやったことは前述の3つ。

本読み : 体系的に理解する

購入した書籍はこちら。

Docker/Kubernetes 実践コンテナ開発入門

Docker/Kubernetes 実践コンテナ開発入門

まずは1章から5章までを読んだ。Dockerに関しての基礎から、Compose、Swarmを経てKubernetesを理解できる。 いままで独学でDockerを使ってきたけど、体系的に学べて理解も深まった。

構成として1章から順に読んでいかないといけないような構成なので、いきなり5章のKubernetesを読むのは避けたほうがよさそう。ちゃんとはじめから読もう。OSSのツールや実践的なDockerfileの作り方など得られることがとても多かった。

Dockerfile にソースを含める

今回は Dash といPythonのツールを使って可視化アプリを開発している。そのアプリケーション・サーバーとしてdockerを使っていて構成は以下のようになっている。アプリの実行は python app.py をするだけ良い。

.
├── docker-compose.yml
└── dash
     ├── Dockerfile
     └── app.py
# Dockerfile
FROM python:3.7
RUN pip install dash==0.42.0
RUN pip install dash-daq==0.1.0
RUN pip install mysql-connector-python==8.0.15
# docker-compose.yml
version: '3.7'
services:
  dash:
    build:
      context: ./dash
      dockerfile: Dockerfile
    command: ["python", "/work/app.py"]
    volumes:
      - ./dash:/work
    ports:
      - 8050:8050

もともと開発用にdocker-composeを使っていたのでDockerfileへソースコードをコピーしていない。しかしKubernetesで実行する場合はBuildもしないしVolumeも使わない。そのためImageにソースコードを含めた上でBuildし、コンテナを起動するだけでアプリケーションが起動するようにしないといけない。

ソースコードのコピーは COPY コマンドで実行できる。

# Dockerfile
FROM python:3.7
RUN pip install dash==0.43.0
RUN pip install dash-daq==0.1.0
+COPY ["app.py", "/work"]
+CMD ["python", "/work/app.py"]

こうしてやればコンテナ単体で起動した時にもアプリケーション・サーバーは起動するし、開発時はData Volumeを使って/work を上書きしてやれば良い。

# docker-compose.yml
version: '3.7'
services:
  dash:
    build:
      context: ./dash
      dockerfile: Dockerfile
    # 開発時は data volume でソースコードをコンテナとホストで共有し
    # 本番時はコメントアウトする
    volumes:
      - ./dash:/work
    ports:
      - 8050:8050

環境変数で挙動を制御できるように

先の本にも書いてあるが、コンテナを運用するにあたり環境変数でコンテナの挙動を外部から制御できるようにすることが重要なポイントになる。 Dashの場合はサーバー起動を app.run_server(debug=True) で行う。 debugモードを環境変数する場合は以下のようにする。

import dash
import os

app = dash.Dash(__name__)

debug_mode = True if os.environ['DASH_ENV'] == 'development' else False
app.run_server(debug=debug_mode, host='0.0.0.0')

こうしておけば、 DASH_ENV=development環境変数が設定されている場合にだけdebugモードで起動する。 docker-compose.yml環境変数を指定する場合はこうする。

# docker-compose.yml
version: '3.7'
services:
  dash:
    build:
      context: ./dash
      dockerfile: Dockerfile
    volumes:
      - ./dash:/work
    ports:
      - 8050:8050
    environment:
      DASH_ENV: development

ローカルレジストリの設置

Docker Compose を使う時、Dockerfile を用意して build & run をして起動することは便利だし特に問題は起こらないと思う。でもCompose on Kubernetes を使う場合はbuildができない。

# docker-compose.yml
version: '3.7'
services:
  dash:
    build:
      context: ./dash
      dockerfile: Dockerfile
    volumes:
      - ./dash:/work
    ports:
      - 8050:8050

この docker-compose.yml をDocker Compose で起動するとイメージのビルドが実行され、コンテナが起動される。

$ docker-compose up --build

--build オプションをつけて実行すると毎回ビルドし、そのイメージを使ってコンテナを起動してくれる。しかし、Compose on Kubernetesではビルドしてくれないので、コンテナイメージを指定する必要がある。なのでそのまま Compose on Kubernetes を実行しても起動されない。

$ docker stack deploy --orchestrator=kubernetes -c docker-compose.yml kubesample
Ignoring unsupported options: build

service "dash": build is ignored
Waiting for the stack to be stable and running...

Ignoring unsupported options: build とメッセージが表示される。
事前に $ docker build -t sample_app ./dash とビルドし sample_app というイメージを指定すれば起動できるが、せっかくなのでレジストリを使いたい。GKEで動かすことを考えると、レジストリを使う必要がある。

ローカル環境でDockerレジストリを使う

DockerレジストリといえばDocker Hubが有名だ。docker コマンドもデフォルトではDocker Hubからイメージをダウンロードする。他にはQuayというサービスもある。

まずはローカルでレジストリを用意して push & pull の利用になれたほうが良いだろう。レジストリ公式のDockerImageが公開されてるのでそれを利用できる。

$ docker run \
    -v $(pwd)/registry:/var/lib/registry \
    -p 5000:5000 \
    registry:latest

これで localhost:5000レジストリにアクセスできる。タグに localhost:5000 を含めてやればローカルレジストリに push できる。

$ docker build -t localhost:5000/myapp ./dash
$ docker push localhost:5000/myapp

すでに作成済のイメージやDockerHubからダウンロードしたイメージもpushできる。

# すでに my_web_app というtagでビルドされたイメージがある場合
# 新しくタグをつけてpush
$ docker tag my_web_app localhost:5000/my_web_app
$ docker push localhost:5000/my_web_app

# 公式イメージをローカルにpush
$ docker pull mysql
$ docker tag mysql localhost:5000/mysql
$ docker push localhost:5000/mysql

これでレジストリを利用できるので docker-compose.yml を以下のようにしてやれば、Compose on Kubernetes でも利用可能となる。

# docker-compose.yml
version: '3.7'
services:
  dash:
    image: localhost:5000/myapp
    ports:
      - 8050:8050

ローカルで Compose on Kubernetes

これでローカルでCompose on Kubernetesを実行できる

$  docker stack deploy --orchestrator=kubernetes -c docker-compose.yml kubesample

次はGKEへのCompose on Kubernetes のインストールです。よろしくおねがいします。

MySQLの入門セミナーに参加しました

f:id:masayuki14:20190531204702j:plain
今回のノベルティ!!

Oracleが主催している MySQLセミナーに参加しました。会場はOracle大阪オフィス。
本当は3月にあったMySQL 8.0 入門セミナー ~チューニング基礎編、SQLチューニング編~」の方が参加したかったですが、都合がつかず・・・。
今回はMySQL 8.0 入門セミナー ~インストール&アーキテクチャ基礎編~」で、昨年夏の開催にも参加したのであまり内容は変わっていないだろうなぁという感じ。実際にはメインに8.0を据えていることもあり5.7への言及はなく、資料もボリュームアップしていました。

個人的には入門編ということもあり知っていることも多かったですが、よい復習になりました。

そんな中でもいくつかキャッチアップできたポイントがあるので紹介します。

インストール時の依存関係

rpmでmysql8.0をインストールする場合は、依存関係があるので、以下の3つを同時にインストールする必要がある、というもの。

  • mysql-community-libs-compat
  • mysql-community-libs
  • mysql-community-common

以前 ubuntu に APT でインストールした時には特に依存関係でハマったことはないし、インストールガイドも充実してるので大丈夫なんじゃないかなあという印象。最近はDockerで使うことも多くなってるし。

dev.mysql.com

コマンド例

shell> tar xvf mysql-8.0.16-2.el7.x86_64. rpm-bungle.tar
shell> rpm -Uvh mysql-community-libs-compat-8.0.16-2.el7.x86_64.rpm \
    mysql-community-libs-8.0.16-2.el7.x86_64.rpm
    mysql-community-common-8.0.16-2.el7.x86_64.rpm
shell> rpm -ivh mysql-community-server-8.0.16-2.el7.x86_64.rpm \
    mysql-community-client-8.0.16-2.el7.x86_64.rpm \
shell> sudo systemctl start mysqld
shell> sudo systemctl stop mysqld

innodb_dedicated_server

MySQL8.0から追加されたパラメータで、innodb_buffer_pool_size などを自動で設定してくれるオプションです。デフォルトでは OFFとなります。 サーバーマシンがMySQL専用として使える場合に利用できるもので、WebサーバーやAppサーバーが一緒に動いているサーバーマシンで利用すると良くないことが起こる可能性があります。

innodb_buffer_pool_size はデフォルトの設定(128MB)では大抵の場合に小さすぎるため、リソースの消費量をホストにマッチさせられないかどうか、という課題に対して導入されたパラメータのようです。 このパラメータを ON にすると以下のルールに従っていくつかのパラメータが自動で設定されます。

**innodb_buffer_pool_size**

server_memory < 1G ? 128M (デフォルトと同じ)
server_memory <= 4G ? server_memory * 0.5
server_memory > 4G ? server_memory * 0.75

**innodb_log_file_size**

buffer_pool_size < 8GB ? 512M
buffer_pool_sieze <=128GB ? 1024M
buffer_pool_size > 128GB ? 2048M


**innodb_log_files_in_group**

buffer_pool_size < 8GB ? ROUND(buffer pool size)
buffer_pool_size <= 128GB ? ROUND(buffer pool size * 0.75)
buffer_pool_sieze > 128GB ? 64

**innodb_flush_method**

innodb_flush_method = O_DIRECT_NO_FSYNC

あまり使うことないかなぁと思ったけど、コンテナで使う場合によさそうです。 まだ不勉強なので dockerコンテナのメモリ割り当てがどうなってるかわからないけど、このオプションをつけて、MySQLに任せてしまってもいいかもしれない。

ドキュメントはこちら。 dev.mysql.com

1台のマシンで複数のmysqldを動かすには

1台のサーバーで複数のmysqldを動かすには以下のパラメータをそれぞれ変えて起動すれば良いとのこと。

  • datadir
  • port
  • socket
  • pid-file
  • log-error
  • log-bin
  • server_id

これらのパラメータをそれぞれ変えて設定した my.cnf を用意して以下のように実行すれば良いです。

$ mysqld --defaults-file=my1.cnf
$ mysqld --defaults-file=my2.cnf

Master-Slave のレプリケーションInnoDB Cluster を試す時にはこれでOKですね。

フリスビーもらえた

途中で質問コーナーがあったので、「複数マシンでmysqldを動かすときに innodb_dedicated_server をONにするとまずいですよね」という旨の質問をしました(セミナー中には専有マシンで使える、ということは理解できていなかった)。

最前列に座っていたからか、最初に質問したからかわかりませんがMySQLロゴ入りのフリスビーをいただきました。これ結構レアなんじゃないか。ボールペンと合わせて2つのノベルティをゲットしました。

次回の開催は

今回のセミナー資料は こちら で公開されるとのことです。 また7月頃にも関西で別のセミナーが開催されるようです。またいこう。

クラシックレンズを使いたい [Super-Multi-Coated TAKUMAR 28mm F3.5] + [PENTAX K20D]

今回も古いレンズを使って撮影しました。このレンズはPENTAX SPというフィルムカメラを使っているときに買ったものです。 APS-Cでの28mmは換算43mmということなので標準レンズのように使え、前回の55mmよりも広い範囲を撮影できます。

masayuki14.hatenablog.com

このレンズもアサヒペンタックスのレンズで、こちらのページが詳しいです。

とにかく安い広角オールドレンズ SMC Takumar 28mm F3.5 - まあるい頭をしかくくするブログ

全体的にフィルムっぽい写りになるなぁという印象でした。 もともとフィルムの時から使っていてそれに似ていると感じるので、フィルムっぽいというかこれがこのレンズの写りってことですね。

御幸町通を四条から三条にかけて散歩しながら撮ってきました。

写真

f:id:masayuki14:20190517173618j:plain

夏の風物詩、川床が設置されています。視点が変わると建物の印象も変わりますね。

f:id:masayuki14:20190517174030j:plain

京都の天狗は南座の屋根の上で休憩するそうな。いちどは歌舞伎を見てみたいものです。

f:id:masayuki14:20190517174159j:plain

桜も散り、新緑がきれいになってきました。

f:id:masayuki14:20190517174501j:plain

高瀬川に灯籠がならんでいました。北側には人がうじゃうじゃいるんだけど、南側は閑散としていて不思議。別世界か。

f:id:masayuki14:20190517174718j:plain

ハンカチ屋さんの看板。Handkerchief BAKERY のシェフだろうか、可愛いハンカチがたくさん並んでいた。

f:id:masayuki14:20190517181830j:plain f:id:masayuki14:20190517181933j:plain 向かい合う居酒屋。明るいうちからお酒飲んでうらやましいなぁ。日本酒好きには良さそうです。 ところでぶら下がってるあの天然素材の玉、あれなんなんですか?

f:id:masayuki14:20190517182110j:plain

錦市場に到着。やはり京都の通りはまっすぐだなぁ。

f:id:masayuki14:20190517182409j:plain

ミニクーパーがすごく雰囲気よかった。有名店なんでしょうか、撮影があったと言っていました。

f:id:masayuki14:20190517182515j:plain

その奥に停まっていたこの車もクラシック感がすごくて、昭和の写真といってもおかしくない。

f:id:masayuki14:20190517182736j:plain

ハンバーガーとクラフトビールって最高か。このマークは一乗寺ブリュワリーのものらしい。

f:id:masayuki14:20190517182836j:plain

照明の使い方がおしゃれだなぁ。庇も瓦っぽいデザイン。

f:id:masayuki14:20190517183022j:plain

こういう路地にいいお店があったりするんだよな。めいてい、行ってみたい。

f:id:masayuki14:20190517182934j:plain

かめはめ波

f:id:masayuki14:20190517183422j:plain

京都では古い町家が改装されたショップが珍しくない。

f:id:masayuki14:20190517183720j:plain

工房って感じの自転車屋さん。こだわりが詰まった自転車が買えそうだけど、店なのか?

f:id:masayuki14:20190517184037j:plain

カラフルな傘がたくさん。骨が多い傘っていいよね。

f:id:masayuki14:20190517184437j:plain

よくわからないけど、若者って感じの人達の行列。タピオカって感じ。

f:id:masayuki14:20190517184611j:plain

三条に到着。かに道楽って京都が本店なの!?

このあと天然物のたい焼きを片手に、勉強会へ向かうのでした。

はんなりPython#17 でDocker〜KubernetesについてLTをしてきました

f:id:masayuki14:20190517182409j:plain
会場入り前の散歩中に撮った写真。車と建物のクラシック感がとても良かった。

最近はKubernetesに取り組んでいるので、個人的にまとめたものでLTをしてきました。 10分という短い時間で以下の4つのことを詰め込んだのでどれも概要程度のことしか話をしてません。

  • Docker
  • Docker Compose
  • Docker Swarm
  • Docker Kubernetes

自分の中ではうまく整理できたので良かったと思います。

ただPythonはぜんぜん出てこない。僕がPython出来ないのに運営やってるってのはみなさんご存知なので、これからはPythonに関係なくいろいろ発表していこうという感じです。

スライドはこちら。

勉強会の様子

今回はLT7本という盛りだくさんの内容でした。やってみた系の話は、成果も見えるし内容もわかりやすいのでみなさんの反応もいいですね。 Cookiecutter 使って PYPI パッケージを10秒で作成する @fx-kirin の発表が、ちゃんと言語としてのPythonを扱っていたのでもっとちゃんと聞きたいなぁと思いました。

他の様子は毎度ながら、運営の id:mazarimono さんがささーっとレポートを書いてくれています。ほんと筆まめ。ありがとうございます。

hannaripython.hatenadiary.com

他にも参加者の方々がブログを書かれています。

kunai-lab.hatenablog.jp

www.mazarimono.net

Special Thanks

今回はマネーフォワード 京都オフィス の方々に会場提供などご協力いただきました。ありがとうございました。 当日対応してくださったスタッフの方、なんと12年くらい前にアルバイトと社員という関係で一緒に仕事をしたことがある方でした。何という偶然と再会。世間はせまいなぁ。

次回はPandasHandsonです。みんなでPythonコードを書きましょう!

hannari-python.connpass.com