Foreverly

メモ帳

ISUCON7に参加〜そして敗北へ〜

ISUCON初参加しました。

敗北

お題は「isutaba」というチャットツール

画像はファイルに書き出して参照させるぞ!! →できんな? 

やったこ

当日まで

  • 社内ISUCON(復習)

当日(まずはじめに)

  • 複数台サーバまじ?構成確認
  • DBのスキーマ情報確認
  • show create table hoge;
  • SELECT * FROM hoge LIMIT 10;
  • myprofilerを入れる
  • pt-query-digest (percona-toolkit)
  • アクセスログ集計

Nginx

  • worker_connections
  • proxy_pass
  • expires

MySQL

  • INDEX追加
    • (user.name)
    • (message.user_id)
    • (message.channel_id, message.created_at)
    • (haveread.user_id, haveread.channel_id)
    • (image.name)

アプリ改修

画像はファイルに書き出して参照させるぞ!! → できんな? 

やればよかった(忘れていた)

  • ソケット通信化

やりたかったけど、できなかった

  • 画像の脱DB化
  • /icons/* を倒す
  • N+1撲滅

きづけない(次回は気づけるようにしような)

  • SELECT *の撲滅
  • Cache-Control
  • If-None-Match、If-Modified-Since、eTag
  • 304
  • /fetch
  • JSONレスポンス

感想

FlaskとMySQLdbを使ってアプリかこうな やるべきこと気づいて、実装できず悶々して無力だった

PyCon2017 一日目のれぽーと

PyCon2017 一日目

後日に動画とslideがまとまってくれると嬉しい。

英語のセッションばかり聴いていたらとっても難しかった。 VOES 稼働後 after VOES launchが一番おもしろかったです。 VOESという音ゲーを開発している台湾の人のセッションで ゲームのbackend開発でDB周りやCDN、キャッシュ周りの話をしてくれました。 メンテナンスの話ではF○Oの48時間メンテナンスをネタにしたりもしていました。

Industrial Test Automation with Asyncioでは asyncioの実装例周りを実際に書いておきたいと思います。 3.6系を勉強するならnon-blockingIOとか使いたい。。 以外とpyramid使いがいた気がします。人数としてはすくないですが。 Tornadoの話は特に聞かなかったです。

そういえばアンケートではPythonでWEBアプリを書いている人は3割ほどでした。 PyConはデータサイエンティストの集まりと化しているようです。 そもそもプロダクション環境でPythonでアプリをリリースしている企業が少ないということなんでしょう。 PHPRubyでアプリを書いて、分析基盤をPythonを使うという使い分けなのが多そう。

Keynote

Pythonは教育として使われる言語で、いろんな分野の人が使う共通言語になる データサイエンスはソフトウェア開発ではない。 解析に使うのはsoftware(ソフトウェア)なく、thoughtware(思考)である。 予測できることはほとんどない。「未来を予測する最もよい方法は、それを発明すること」byアランケイ ビジネスがオープンソースを好む理由。ベンダーロックインを防ぐ(特にデータ)。 また、自分たちの都合に合わせて変更、機能追加できる。 Pythonはレゴのようなもので組み立てていろんなものを作り上げることができる。

  • Peter Wang
    • Anacondaデータサイエンスエコシステムの製品エンジニアリングチームを率いている人。
  • Over 20 Million Downloards
  • Other Problebms in 2012
  • Pythonは人気がある
    • イブサンローランの香水のCMでIPython のプロンプトが出てくる
  • Why Python for Data
    • not system language but intended to teaching language for prototype
  • Pythonにはいくつかの部族がある
    • Analyst,Data Developer,programmerも使える共通言語
  • Data Science !=Software Development
  • Era of Data Literacy
  • A Few Predictions
    • 未来を予測する最もよい方法は、それを発明すること
  • Open Source and Developers
    • Pythonはレゴのようなもの
  • ビジネスがオープンソースを好む理由。ベンダーロックインを防ぐ(特にデータ)。また、自分たちの都合に合わせて変更、機能追加できる。
  • 解析に使う言語は'thoughtware'で'software'ではない

セッション

Industrial Test Automation with Asyncio

asyncio

  • Industry use
    • Railway Test Automation Project
    • Communication via TCP and UDP based protocals
  • How to talk to N computers at the same time?
  • Trying without Asyncio
  • import socket
  • とても長い、
  • Since the network is the bottleneck
  • and we only talk to
  • The Splution
  • socketモジュール使うより短く書けるよ
import asyncio

tasks - {
     machine.sya("Hello, hoe are you?")
     for maching is machines
}

await asyncio.wait(tasks)
  • The difference
    • In the second ecample ,there is no immediate ececution
    • Only promise creates"please
    • Calling asyncio,wait forces runtime ri ewaolce taskas
  • How do N things at the same time
    • Missing ingeedient Non-blocking IO
    • Many implementations pthread,libuOS level"kqueue,select,epoll
    • How t do N things at the same time
    • リクエスト⇔レスポンスを一台ずつやるのがblocking-IO
    • 一気に複数にリクエストを投げつけるのがnon-blockingIO
    • asyncioの使用例
Python asyncio sockets
reader, wtiter = loop.open_connvtion()
writer.senf(b'Hello, World)
awsit wruterr,drain(
  anser - await reader,read(199)
    )
  • Test Usage
    • シナリオ例
    • ABCからDへ同じパケットを送る
    • DhaAkaradakeケットを受け取るか、
  • slow and incorrect eith blocking I/O
    • In the eqal world
    • network devices do not wait
    • Now with non-blockingI/O
  • 正しい振る舞いだけでなく、テスト実行が3倍早くなった
  • Ecaluation
    • think about use cascadefind tools,and learng about best practices
    • apply,improce,share
  • Synchronoously
    • Code is easy to understand
    • No mental overhead for locking/transactions
    • Easy oo interface with existing
  • Asynchtronously
    • Specian sysntax needed asunc awaot
    • locking always necesary,even though single threaded
    • necessary for teatm to learn new programmin paradigm
  • What you should avoid
    • Using asyncio because It is fast I/ve been thereSpeedup onluy observable in I/O biund
    • If you mix COU and I/O bound rasks and need adcice taks to me
  • Why I like asyncio
    • Incerediblu powerful standard library
    • Easy to implement protocals o n TCP useing OOP:asyncoo.protocalo
    • Context managers for locking promitives
  • If you create something aweasome write a blof post
  • Got o your local python meetio and tals aavuoit Asynip
  • Contribute back to ppen souece :Rreport Bugs,Help Beginners,Write

Pythonで大量データ処理!PySparkを用いたデータ処理と分析のきほん

  • Apache Sparkの紹介
  • PythonといえばPyDataというくらいライブラリがそろっている
  • 大規模データを扱いたい、データ量がスケールしても動く仕組みがほしい
  • SparkはOSSの並列分散処理フレームワーク
    • 処理が失敗してもリカバリフレームワークがやってくれる
    • タスクのスケジューリングもやってくれる
    • サーバのスケールアウトによって、スループットが線形に近い形で向上する
    • リソース値用最適化ノク婦がされている
    • オンメモリベースの処理
    • JVMのオーバヘッドを改善sるProject Tungsten
    • キャッシュ、遅延評価
    • S[ark2.2だと3.4以上に対応
    • 機械学習やストリーム処理、処理の流れが見えるUI
    • サーバ一台でも動く
    • Spark2.2.0からpipでもインストールできたけど、localのみで分散処理はできない
    • Dockerでもお試しできる
  • Hadoopクラスタ上で動作する、Amazon EMRやGoogle DataProcなどのマネージドサービスを使うと楽
  • Sparkの3つのプログラミングモデル
  • RDDとDataframe
    • RDD,コレクション操作のように処理を記述する
    • DataframehaSQLライクに処理を記述する
    • Dataframeはオプティマいさによる最適化
    • Dataframenoオプティマイザによる最適化
    • 高地的な処理の順番に入れ替えれ実行してくれる
    • データソースによててはギル田処理をデータ・ソース側d行い必要なデータのみを読み込むようにする
  • RDD
    • ワーカーノードでの処理ではPythonプロセスで行われる
  • Dataframe
    • ワーカーノードでの処理はJVM上で行われる
    • ただしUDHはPytohonプロセスで実行される
  • パフォーマンス上の問題点
    • Iterator単位でのserializationとpythonプロセスへのパイプが発生
  • RDDPythonは遅い
  • DFだったらScalaと同じくらい
  • RDDの中でNumpyやScipyを使う
  • 集計結果をPandas DataFrameに変換してMatplitlibで可視化する
  • PySParkではppandas DataFrameとDparkDataFtaneの相互変換可能

  • Apache Arrow

    • データフォーマットの仕様とそれをりようするためのライブラリ
    • 異なる言語プロダクト感でのデータ連携コストを下げる
  • Apache Zeppelom
    • レコメンデーション、異常検知とか
  • DAたFrameをつかう 
  • 処理するデータ量を減らす
  • ストレージの利用
    • D3,HDFA
  • データフォーマットはParwuetを利用
  • メモリ
  • yarnによってコンテナが きっlareruera-ga
  • okiyasui

VOES 稼働後 after VOES launch

Hsueh-Tsung Kuo

how to resolve problems of mobile game server development and service maintenance

  • VOES
  • DBのアトミックを守る
  • database chache mechanism
    • redis or memchached in RAM:fast
  • AからBへのサーバへデータを移すとき
  • database server reliableを保つ
  • def gacha
  • FGOメンテナンス48時間突破
  • Python is so slow
  • from database to static failures
  • statistics
    • crontabでBigQueryを叩いて結果を初滅
    • 結果はGoogle Cloug Storageなどに突っ込む
  • Server operation with CSB
    • CDNでキャッシュミスしたらServerにリクエストを投げる
    • CDNのCache invalidationは不毛だしrevisionごとにURL作ろう
  • service downtime and update
  • timezone
    • TZ=Asia/Taipei
    • イベント処理には困らないからUTC使わない

Why you should do text analysis in python

Bhargav Srinivasa Desikan

https://github.com/hari-allamraju/pycon-talk-taxidata/tree/master/slides

  • why python
    • ease of use
    • regex,parsing, adn generators(pipeline text)
    • incredible suport in form of libraries
    • awesome community
  • why text proxessing
    • data everywhere
    • with machine learning,deep insights
    • fun - from a personal point of view
    • employability - from a progessinal point of view
  • so what can you do?
    • glean insights from your own text
    • chatbots
    • language translation
      • machine learning,deep learnings,tenserflow
    • research - especially in the humanities
  • where is the data
  • pre-processing
    • garbage in , garbage out
    • ease of reading and writing to files
    • also - libraried for pre-processing
  • machine learnng in text
    • gensim
      • トピック分析できるライブラリ
    • scikit- learn
    • keras/tensorflow
  • world embeddings
    • king - man + woman = Queen
  • computational linguitstics
    • Part of Speech tagging
    • Named Entity Recognition
  • Japanse relevance
    • spaCy has started alpha suppprt for Japanese
    • you can contribute and help expand it
    • as for ML, it is largely language agnostic
  • so now
    • python is great at quick and dirty text pre-processing
    • and has a great ,great library support
    • and woth data everywhere

PythonでOauthサーバを構築した話

設定やパラメータの話 規約があるので、規約どおりに実装しようという話

  • Tech bureau Coap.で働いている
  • APIの話
    • secret & key を利用する場合
    • OAuth(token)を利用する場合
  • OAuthサーバの作り方
  • OAuthとは
  • OAuth2.0の話
    • 日本語で規約がある
    • 全て規約が決まっている
  • 使ったもの
    • Python3
    • Pyramid
    • SQLArchemy
    • Nginx
  • トークン発行、利用、再発行
  • 名称、サービス名称
  • cliend_id
    • どのサーバに紐付ければいいのか
  • responce_type
  • state
    • なりすまし対策
  • redirect_url
    • リダイレクト用のURL必須ではない
  • 認証が通ったあと

How (and Why) We speak in Unicord

Devon Peticolas

  • Morse
    • Encording
  • Baudot
    • パンチカード
  • ASCⅡ
  • The 8th bit
    • Latin-1
    • Hebrew
    • Meanwhile in Japan
    • Kanji
    • Katakarna
    • AA
  • Japanese Encodeiisa
  • Unicodeはどの言語でもつかる
  • utf-8
  • utf-16
  • utf-32

Secrets of a WSGI master

Graham Dumpletonさん

  • WGSI == Web Server Gateway Interfaces
    • Webサーバとアプリをつなぐもの
  • WSGI is a specification for an Application Programming Interface
  • Friends don’t let friends use raw WSGI
  • django,Flask,Bottle,などなど
  • You still need a way to host a WSGI Application
  • The development servers builtin to a framework are not good enough
  • Installing mod_wsgi the easy way
    • pip install mod_wsgi
  • Run mod_wsgi from the command Line
    • mod_wsgi-express start-server wsgi.py
    • No Apache configuration required
  • Automatic code reloading
    • python manage.pu runmodwsgi –reload-on-changes
  • Friends don’t let friends use Python without a Python virtual enviroment
  • warpdrive
  • Same tools for development
    • warpdrive project mypyapp
    • warpdrive build
    • warpdrive start
  • Generate image with no Dockerfile
    • warpdrive image mypyapp
    • docker run –rm -p 80:8080 mypyapp
  • Source-to-Image
  • Embedded mode
  • Daemon mode
  • Request monitoring
  • Openshift
  • Friends don’t let friends use Windows for running Python web Applications
  • Friends don’t let friends use the mod_wsgi which comes packaged with the operating system
  • Friends don’t let friends use those other WSGI servers
  • Friends don’t let friends make things too complicated,simple is good

LT

ギャル語翻訳

  • pyladiesの人たちのプロジェクト
  • hack-a-thon
  • ニュースサイトをギャル語にした
  • Mecab,Tornado,Azure,Data ScirnceVM,Azure Redis cache
  • 辞書は手書き
  • Cheomeの拡張機能で設定
  • 辞書をディープラーニング化したい
  • ギャル語の情報を取得したい

ymyzk

  • 計測する
  • profileをつかう
  • wsgi_lineprof
  • PythonでISUCONかちましょう

Respect is built-in names

  • sum,idに代入しない
  • list に listを突っ込まない
  • dictにdictを突っ込まない
  • jsonjsonをつっこまない

誰でも簡単に暗号取引botができるライブラリを作った

  • Zaifbot

OSSFriday

  • OSSに貢献しよう

ローカル環境でもDockerをドカドカ使う

  • builderscon来年もやるらしい
  • テスト環境でも使うのはよい

Pythonの実装をみる

カラオケおじさん

  • 英日中の歌詞判別

ジョブフェア

  • モノタロウ
    • 東京オフィス作る
    • データ分析に基づき仕事をしている
  • Line
    • サーバレスでLINE botつくれる
  • Retty
  • iRidge
    • 何やっているかよくわからない会社

Closing

Pyconのスタッフ多い。40人ぐらい? 1クラス分以上いた気がする。

Y8 2017で登壇デビューしました

Y8 2017 Spring in Shibuyaで登壇デビューしたので振り返りのブログ記事です。

発表資料はこれです。

動画もまとめられたみたいですね。

うずら on Twitter: "#y8spring のトーク動画を公開しました!チャンネル登録お願いします!!(言ってみたかっただけ) / “トーク動画を公開いたしました!! · Y8 2017 spring in Shibuya” https://t.co/d2hJy2moEG"

今回は初心者枠というものが設けられていて、 登壇デビューしたい人には良い発表する機会だったと思います。 そんな場を設けて頂いて皆様感謝でございます。

発表のいきさつ

去年のY8の発表でkoudaiiiさんの発表をみて自分のインフラエンジニアとして危機感を覚えたり、 懇親会でfujiwaraさんに勉強会にきても勉強にはならない、新しいことを知ることができるだけで、 発表したほうがいいよ。聴く人たちも発表している人に悪く言わないから恐れることはないみたいなことを言っていただいたり、 koemuさんにも発表しないとダメだ!死ぬぞ!みたいなことを言われたので絶対発表するぞ!!!とずっと思ってました。 今回それを実行できて満足です。

今回の発表はしてよかったと思うので、反省点とかまとめて、 次回の発表できるよう知見を貯めようと思います。

伝えたかったこと

プログラミング楽しい!技術をおうの楽しい!ってことです。

プログラミングの勉強がしたいってだけの人いますよね。 特にプログラミングできなくても仕事できてしまっている人や、 プログラミングできるようになりたいけど、作りたいものがない人。 中には増田でプログラミングできなくて辛いみたいなことを書く人もいると思うのですが、 そんな人たちに、そもそもプログラミングを書くの単純に面白いので、 まずは面白いってことを実感できるところからスタートするといいよって話をしたかったのです。

伝えられなかったこと

時間が20分だったので発表できなかったことは以下です。

  • プログラミングを毎日書く仕組みづくり
    • 仲間を作る
    • 師匠を作る
    • slackチャンネルでコミュニティを形成する
  • おすすめの本
  • おすすめのスライド発表

これらは好みがあると思うので略にしました。

戦略

アプリ開発を始めてプログラミング入門の話をしようと思ったのですが、 アプリが完成しなかったので、それだけの話は断念させ、 プログラミングができるとUNIXプログラミングやネットワークプログラミングができるようになり OSやプロセス、TCPサーバの実装やHTTPプロトコルの話などインフラよりの話も内容に盛り込むことにしました。 なので5月頭からはアプリ開発と並行してネットワークプログラミングやなるほどUNIXの本を読みました。 あとはchibicodeさんのスライドを使うことを許可いただき、虎の威を借ることにして 発表に説得力をつけるようにしました。

発表してよかったこと

発表したあとは恐怖でハッシュタグを見れなかったのですが、 少し冷静さを取り戻したあとに観たら、意外といい話と言っていただいたりしたので みなさん優しいって思いました。 僕もハッシュタグに感想を書くとき、いい話っていう感想をたくさんつぶやきました。 初心者枠を設けて頂いて助かった〜〜発表してよかった〜〜 100人規模の会場で話すのはどういうことなのかを知れたのは良かったです。

反省点

LTじゃないので、自己紹介をもう少し詳しくした方がよかったなあと思いました。 緊張してPCの画面をみて発表してしまし、 常に下を向いて、マイクに声が通らなかった。 ターミナル拡大に手間取ったので、 練習するか、スライドにコードを抜粋すればよかったです。 みんなコードをスライドに埋め込む人が多かった。 特にだれとも話さなかったのは只管後悔です。 知り合い作りたかった〜〜 あとは一発目で10:00からだったので、遅刻しないように緊張して寝れなかったので ちゃんと寝れるようにしたほうがよかったです。

次回にむけて

マイクを手に持って聴衆とスライド画面を見れるように発表することが大事で、 PCには触らない見ないをできるように発表の練習が必要だと思いました。 (PCに触るときはターミナル操作やデモを入れるときだけ) そのためには黒曜石を買って使おうと思います。 あとはDecksetの使い方にもなれようと思います。

これならわかるGit/Github入門

git/githubについてよくわかっていないので、
簡単に調べてまとめました。
だいたいGithub実践入門のまとめですが。。
これシュタインズゲートのルートを例にしてまとめたら楽しかったろうなあ後で思った。

Git初期設定

gitの初期設定をしていきます

git config --global user.name "(your name)"
git config --global user.email "(your email)"
git config --global color.ui true
$ git config --global alias.co checkout
$ git config --global alias.st status
$ git config --global alias.br branch
$ git config --global alias.ci commit
git config -l

Githubの設定とチュートリアル

公式サイトのガイドでrepository作成、branchを切って,commit,pull request,mergeの一通りができます。
Githubのアカウント作成、設定とSSH鍵の設定もしておきましょう。
SSH鍵を作成してfingerprintの内容をGithubSSH鍵に登録します。

$ ssh-keygen -t rsa -C メールアドレス

SSH接続できれば完了!

$ ssh -T git@github.com

githubにpushしてみる

チュートリアルで作成したリポジトリにpushしてみる
git cloneしてリポジトリを持ってきます。

$ git clone git@github.com:hogehoge/hello-world.git

リポジトリを持ってこれていることを確認

$ cd hello-world/
$ ll
total 8
-rw-r--r--  1 hoge  hoge  xx  xx xx xx:xx README.md

かんたんなスクリプトを上げてみます。
スクリプトリポジトリに登録されていないので
untracked filesとなり、git addしてねと言われています。
親切ですね。

$ vim hello_world.php
$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   hello_world.php
nothing added to commit but untracked files present (use "git add" to track)

git addしてステージ領域登録してあげます。

git add .で全てのファイルをステージ領域にあげることができますが、
上げたくないファイルはどうすればよいでしょうか。
.gitignoreファイルを作成して*.logとかすればよいです。

$ git add hello_world.php

commitしましょう。

$ git commit -m "Add hello world script by php"

 create mode 100644 hello_world.php

git logでコミット内容を確認しましょう。
- pオプションを付ければコミットメッセージの後ろにファイルの差分が表示されます。
--pretty=shortではコミットメッセージの1行目のみを表示します。
--onelineで一行のみ表示させます。
--statで、どこが変更されたかではなく、どのファイルが何箇所変更されたかをみることができます。

$ git log

    Add hello world script by php

commitできているのでGithubにあげます。
Githubに登録されていれば完了。

$ git push

変更差分の表示

git diffでワークツリー、ステージ領域、最新コミット間の差分を確認できます。
差分がないと表示されません。
README.mdという空ファイルを編集して確認してみます。

$ git diff
$ ll
total 0
-rw-r--r--  1 hoge  hoge  0  xx xx xx:xx README.md

# Gitチュートリアルと編集してみるとワークツリーとステージ領域の差分が表示されました。

$ vim README.md 
$ git diff
diff --git a/README.md b/README.md
index e69de29..cb5dc9f 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1 @@
+# Gitチュートリアル

git addでステージ領域に追加すると差分がないので、表示されません。
最新コミットとの差分の確認はどうやるのでしょうか。
git diff HEADで確認できます。
あとは問題なければコミットしてみましょう。
HEADは作業しているブランチの最新コミットを参照するポインタです
git diff --cachedでもステージ領域に上がっていないけど、
コミットされていないファイルの「どこがどう次のコミットで変更されるか」がわかります。

$ git add README.md 
$ git diff
$ git diff HEAD
diff --git a/README.md b/README.md
index e69de29..cb5dc9f 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1 @@
+# Gitチュートリアル

ちなみにgit addなどして、gitが管理したファイルはrmやmvを使うのでなく
git rmgit mvでないといけませんので、ご注意を。

ブランチの操作

ブランチができると複数人で作業ができるようになる便利概念です
現在のブランチを確認すると、masterブランチにいます。

$ git branch
* master

ブランチを作成して、移動しましょう。

$ git checkout -b feature-A
Switched to a new branch 'feature-A'
$ git branch
* feature-A
 master

ちなみに上のコマンドは以下のコマンドを1行でやりました。

$ git branch feature-A
$ git checkout feature-A

今、コミットするとfeature-Aブランチにコミットされて、ブランチを育てることになります。
以下の内容でコミットしてみます。

$ vim README.md 
$ cat README.md 
# Gitチュートリアル

- feature-A
$ git add README.md 
$ git commit -m "Add feature-A"
[feature-A 4948954] Add feature-A
 1 file changed, 2 insertions(+)
 ```

 masterブランチには反映されていないことを確認

 ```
$ git checkout master
Switched to branch 'master'
$ cat README.md 
# Gitチュートリアル
$ git checkout -
Switched to branch 'feature-A'

feature-Aブランチを統合ブランチであるmasterにマージしてみます。
masterブランチに移動してgit merge –no-ff ブランチ名
--no-offオプションを付けるとマージコミットのメッセージを記入するためにエディタが立ち上がります。

$ git checkout -
Switched to branch 'master'
$ git merge --no-ff feature-A
Merge made by the 'recursive' strategy.
 README.md | 2 ++
 1 file changed, 2 insertions(+)

git log –graphで視覚的にみると、トピックブランチ(feature-A)で
コミットされた内容がマージされていることがわかります。

$ git log --graph
*   commit HASH値
|\  Merge: 1a433cc 4948954
| | Author: 
| | Date:   
| | 
| |     Merge branch 'feature-A'
| |   
| * commit HASH値
|/  Author: 
|   Date:   
|   
|       Add feature-A
|  

コミット変更操作

feature-Aブランチを分岐させる前に戻ってfix-bブランチを作成させるとします。
git reset --hart 戻りたい場所のハッシュ値

$ git reset --hard 1a433ccb5a6acebe742234de5

fix-Bというブランチを切ってファイルを編集してcommitします。

$ git checkout -b fix-B
Switched to a new branch 'fix-B'
$ vim README.md 
$ cat README.md 
# Gitチュートリアル

- fix-B
$ git add .
$ git commit -m "Fix B"
[fix-B 01ee7fc] Fix B
 1 file changed, 2 insertions(+)

feature-Aブランチをmergeした後の状態に進み、fix-Bのブランチをmergeさせます。
git relogでfeature-Aブランチをmergeしたハッシュ値
masterブランチに戻り、git reset –hardで選択して戻ります。

$ git reflog
01ee7fc HEAD@{0}: commit: Fix B
1a433cc HEAD@{1}: checkout: moving from master to fix-B
1a433cc HEAD@{2}: reset: moving to 1a433ccb5a6acebe742234de5
0165311 HEAD@{3}: merge feature-A: Merge made by the 'recursive' strategy.
$ git checkout -
Switched to branch 'master'
$ git reset --hard 0165311
HEAD is now at 0165311 Merge branch 'feature-A'

fix-Bの内容をマージさせるとCONFLICTが発生しました。

$ git merge --no-ff fix-B
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

ファイルを編集してCONFLICTを解消させましょう。

$ vim README.md 
# Gitチュートリアル

<<<<<<< HEAD
- feature-A
=======
- fix-B
>>>>>>> fix-B

今回は以下の内容に編集しました。

$ cat README.md 
# Gitチュートリアル

- feature-A
- fix-B

この状態でmergeさせることができるようになりました。

$ git add .
$ git commit -m "Fix conflict"
[master 30b1cb4] Fix conflict

コミットメッセージの編集もしてみましょう。

$ git commit --amend
[master 38ffc4c] Merge branch 'fix-b'

視覚的にみるとわかりやすいですね。

$ git log --graph
*   commit ハッシュ値
|\  Merge: 
| | Author: 
| | Date:   
| | 
| |     Merge branch 'fix-b'
| |   
| * commit ハッシュ値
| | Author: 
| | Date:  
| | 
| |     Fix B
| |     
* |   commit ハッシュ値
|\ \  Merge: 
| |/  Author: 
|/|   Date:   
| |   
| |       Merge branch 'feature-A'
| |   
| * commit ハッシュ値
|/  Author: 
|   Date:  
|   
|       Add feature-A
|  

歴史改変

トピックブランチをマージする前に、すでにコミットした内容にちょっとしたミスを見つけたら、
修正のコミットをして、改変しましょう。

featture-Cブランチを作成して試してみます。
タイポをしたままcommitしてしまいました。
これをマージする前に修正したい。

$ git checkout -b feature-C
Switched to a new branch 'feature-C'
$ vim README.md 
$ cat README.md 
# Gitチュートリアル

- feature-A
- fix-B
- feaaature-C
$ git commit -am "Add feature-C"
[feature-C 02f4faf] Add feature-C
 1 file changed, 1 insertion(+), 1 deletion(-)

Gitの歴史を改ざんしてしまいましょう。
タイポしなかった世界線へと移動させます。
今回は現在のブランチのHEADを含めた2つまでのcommitを対象にしてエディタを立ち上げさせます。

$ git rebase -i HEAD~2

pick 02f4faf Add feature-C
pick 7e0f931 Fix Typo

# Rebase 95aeef1..7e0f931 onto 95aeef1
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

下のように修正しましょう。

fix-up 7e0f931 Fix Typo

git logで確認するとtypoのコミットメッセージがなくなり、
Add feature-Cのコミットが書き換わっています。
後はmasterブランチにマージします。

$ git checkout master
Switched to branch 'master'
$ git merge --no-ff feature-C
Merge made by the 'recursive' strategy.
 README.md | 1 +
 1 file changed, 1 insertion(+)

Gitで育てたリポジトリGithubに登録する

Github上でgit-tutorialというリポジトリを作成します。
リポジトリのパスが表示されるので、git remote addコマンドで指定します。

$ git remote add origin git@github.com:user-name/git-tutorial.git

git pushコマンドで現在のブランチのローカルリポジトリの内容を
リモートリポジトリに送信します。
今回はmaster => master
- uでローカルリポジトリの現在のブランチの上流はoriginリポジトリのmastertブランチであると設定したことになります。
これをつけるとリモートリポジトリの内容をgit pullするときに、
このローカルリポジトリのブランチはoriginのmasterブランチから取得することになります。

$ git push -u origin master

pushが終わったら、Githubで内容を確認してみましょう。

masterブランチ以外のブランチへ送信

リモートリポジトリにはmaster以外のブランチも作成できるのでpushしてみます。

$ git checkout -b feature-D
$ git push -u origin feature-D

リモートリポジトリのGithubにfeature-Dブランチが確認できました。

リモートリポジトリから取得

別のディレクトリにローカルリポジトリを用意して
リモートリポジトリのfeature-Dを取得して変更してみましょう。

$ mkdir git-tutorial2
$ cd git-tutorial2/
$ ll
$ git config -l
user.name=
user.email=
color.ui=true
$ git clone git@github.com:user-name/git-tutorial.git
$ cd git-tutorial/

-aをつけてリモートリポジトリを含むブランチ情報を確認します。
リモートリポジトリにfeature-Dがあることを確認できました。

$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/feature-D
  remotes/origin/master

feature-Dブランチをローカルリポジトリにチェックアウトしてみます。
git checkout -b 作成するブランチ名 リモートリポジトリにあるブランチ名
修正してcommitして、pushします。

$ git checkout -b feature-D origin/feature-D
Branch feature-D set up to track remote branch feature-D from origin.
Switched to a new branch 'feature-D'
$ git diff
$ vim README.md 
$ git diff
diff --git a/README.md b/README.md
index 50de722..125f990 100644
--- a/README.md
+++ b/README.md
@@ -3,3 +3,4 @@
 - feature-A
 - fix-B
 - feature-C
+- feature-D
$ git commit -am "Add feature-D"
[feature-D 4a5676c] Add feature-D
 1 file changed, 1 insertion(+)
$ git push

   feature-D -> feature-D

Github上のfeature-Dブランチが修正されていることを確認

最新のリモートリポジトリブランチを取得

ローカルリポジトリのfeature-Dブランチはcommitしていないので、
リモートリポジトリからgit pullでコードを取得してみましょう。

$ git pull origin feature-D
$ cat README.md 
# Gitチュートリアル

- feature-A
- fix-B
- feature-C
- feature-D
$ git branch
  feature-A
  feature-C
* feature-D
  fix-B
  master

取得できました。
git push/pull を競合が起きないように気をつければ開発に便利ですね。

タグ機能

git logのコミットIDではわかりずらいとき、タグを付けると便利です。
git logの最近のコミットにタグを付けるときは、タグ名を指定すればよいです。

$ git tag v1.0
$ git tag

git showはコミットの内容を表示しますが、IDを指定せずともタグ名で表示できます。

$ git show v1.0

他のコミットにタグを付けたいときはタグ名の後ろにコミットIDを指定すればよいです。
また-dでタグを削除できます。

$ git tag v0.9 abb3e8e5440be9ef819aae3d3d10de3
$ git show v0.9
$ git tag -d v0.9
Deleted tag 'v0.9' (was abb3e8e)

とりあえず基本はこれぐらいで。

PyconJP 2016〜2日目〜

PyconJP 2016の2日目も行ってきました。 初のPyconJPでしたが、楽しかったです。 スタッフの皆さん、スピーカーの方々ありがとうございました!

忘れないようにメモ代わりに雑に書きます。 よかったらPyconJP 2016〜1日目〜も読んで下さい。

Keynote

眠くて間に合うか心配でしたが、ギリギリ間に合いました。 雨で電車が止まらなくてよかった。

2日目はAndrey Vlasovskikhの基調講演でした。 Pythonの型ヒントにcommitしてる人らしいです。 ロシアから来てくださって、故郷のサンクトペテルブルクはモスクワの次に多きいところで、 日本でいえば大阪みたいなところと言って面白かったw 写真を見せてくれましたが、北ヨーロッパに属するらしく 情景が美しかったです。

話の内容としてはPython3.6の機能についてでした。 文字列リテラルと変数、数値リテラルの変更点など、 詳しくはドキュメント読みましょう。 Python3推しは無理にしないで、客観的に話すと言っていました。 あるアンケートではPython2と3の使ってつ人の比率は50%が3系で、 56%は2系を使っているらしく、一部重複しているのは2と3を使っている人がいるから。 PyconUS2020でPython2のさよならパーティがあるらしく、 これからPython書くなら3系ですね。 2017年に、Django2.0でのpython2のサポートも消えるらしいです。

Pythonの型ヒントはPython3.0から登場したが、当初はSyntaxだけで、semanticsは提供されなかった。 3.5で標準化されたて、Mypy,PyCharmで使えるようになった。 Python3の型ヒントの良くないところは静的型付けなのでコードを書く量が増えるし、小さいプロジェクトなら不要。 あとは100%の互換性があるわけではない。

型付けのケーススタディはPython2からPython3に準拠させたら6万ドルかかった企業(twisted)があった。 また、Dropboxでは型ヒントを追加してからPython3に移行した。

Async-Awaitは3.6ではyieldとawaitとasyncが使えるようになる。 Async-Awaitのいいところ。Coroutineとawaitable。 Async-Awaitのわるいところ。同期版があれば非同期版をかかないといけない。 DjangoとFlaskが使えなくなるので、Tornadoやaiohttoに移動しないといけない。 TornadoはFlaskと同じくらいpopularになってきたらしいので、 Tornadoも触っておきたいです。

質問では英語で質問する人が多かったので同時通訳の人が大変そうだった。。。 個人的には日本語で質問して、英語で話したいのなら懇親会とかセッションの合間とかに 話すのがいいんじゃないかなあとカンファレンス行くと毎回思う。

You Might Not Want Async (in Python)

台湾の方で、発表のネタがアジアっぽかった。 syncよりasyncの方がCPU待ち全然ないのすごかったです。 Python3.5の機能良さありました。

Lunch

ビュッフェ形式でした。美味しかったです。 特にだれとも話さずモクモク食べてた。

ジョブフェア

ビュッフェ形式ならジョブフェア人が少ないのではと思ったけど、 そんなことなかったです。 朝会してるとか、リモートワークの是非とかありました。 リモートワークの話題でrebuild.fmの名前が出てきたw リモートワークはワークライフスタイルではないので、 個人的には日本だとリモートワークをワークライフスタイルって考えてるから 上手くいかないんだろうなあと思います。 リモートワークは世界に展開してなかったり、 地方などにいる優秀なエンジニアを雇いたいって企業がやるものなので、 リモートワークやっている企業の人が、多様性を持ちたいから海外の人を雇うために リモートワークをしていると言っていて、 まさしくそうで、外国籍の人を雇いたいって企業がリモートワークやればいいだけの話で、 ウチは反対ですっていう会社はそもそもやる必要がないんですよね。

HTTPプロクシライブラリproxy2の設計と実装

1日目のやつが移動してきたセッションですね。

proxy2の話で、gzipとdeflateモジュールを使って実装したらしいです。 RFC2616, RFC7230も読んだそうです。 ssl.wrap_socketとかBaseHTTPserver, hyyplib,threading,select.ssl, deflate,gzipなど標準モジュールだけで作れるらしい。

Building Distributed System with Celery on Docker Swarm

台湾の方の英語セッションで Docker Swarmということを期待して参加しました。 Celeryも少し調べておきます。

from celery import celery

発表中に発表聞かないで、自分の発表資料作る人がいて、う〜んって感じだった。

おやつ

カップケーキでした。すごいかわいいし、美味しかったです。

はじめて作るDjangoプラグイン

ぎぎにゃんの発表。 ク社rails 使ってるイメージだけど、趣味でDjango使ってるのかなと思ったら、 まさしくそうらしいです。

ぎぎにゃんが作ったプラグインの紹介 django-debug-toolbar-vcs-info

ぎぎにゃんの友達が作ったプラグインの紹介 django-permission

プラグインまとめサイトの紹介(2年近く放置されているらしいです。。。) awesome-Django

プラグインを書くときの注意点を紹介してくれました。

実装、テスト(TDDでも可)をやってから色んなCI環境を整える。 全ての環境で通ったらドキュメントを書いて公開する。 というのが流れらしいです。

2.3両方サポートするようにテストは厚くするのが大事で、 後方互換性を気にして3で書くのがオススメ。

ディレクトリ構造の紹介。 ソースを置くディレクトリがパッケージ名になる。 テストのディレクトリ。 ドキュメントのファイルとディレクトリ。 パッケージ、ディストリブューシャン用。

  • キーワード

sixは2と3の互換をしてくれるもの。 compat.py run tests.py toxは複数バージョンでテストするのによい。 Django.test.utils Mock setting.pyとTravis.xyl Toz-Travis Readme.xtxtはマークダウンではなくrsdで書く。

Bottle.py ライブコーディング&リーディング

buttol.pyでのwebアプリ作成の紹介

Lightning Talks

1日目よりかは真面目内容だったな。

Closing

虫の鳴き声が聞こえてきて秋を感じる中、クロージング。

会場を貸してくださった早稲田大学ありがとうございました! トイレで喫煙をした人がいたらしい、、、 トイレで喫煙はヤバイでしょ...昭和の不良かな? スポンサーからのプレゼントコーナーはよかったですね モノタロウの工具すごかったwめっちゃデカかったので 当たっても大変だけどよかったですねw

まとめ

来年はLTのネタぐらいは作っておきたいなとおもいました。 普通に知り合いがほしいっすね。 あとは英語セッションも聞けるようになりたいので、NHK英語やっていきだ。 あとは数式も読めるように数学もやっていきだ。 Python3系の機能も覚えるぞ! 来年も参加したいイベントでした。スタッフの方々お疲れ様でした。 楽しかったです。ありがとうございました!

PyconJP 2016〜1日目〜

PyconJP2016の1日目に参加してきたので、 メモ代わりに雑に書きます。

Pycon自体は初参加で、会社のマネーでこれました(感謝)。 会場は早稲田大学だったので、近くて助かりました。 大久保駅新大久保駅から歩いていける距離だったので、 西早稲田が近いことに気づけて知見を得ました。

Keynote

Pythonコミュニティに多大なる貢献をしているJessica McKellarKeynoteでした。(Last Nameはなんて読むかはわからない。) 同時通訳機が置いていない席に座ったので、英語を頑張って聞きましたが、 半分も理解できませんでした。なんとなく、コミュニティ活動について話していた気がする。。。 彼女はプログラミング教育にも力を入れているので、とても尊敬しています。 Python入門の動画を見たり、O'reillyの動画も観たことある。 Hello AppというDjango入門書にもJessica McKellarの動画がおすすめされていたりするので、 Pythonでプログラミングをこれから学ぼうという人はきっと彼女の活動の恩恵を受けるのだろう。 あと、Closingで話に上がったCode of ConductはこのKeynote関連だったんだろうな。。

マイクロサービスを利用する側のパフォーマンス向上策

Pythonでマイクロサービスは珍しいなあと思って聞きました。 モノタロウの方だったのですが、モノタロウってヨッピーさんがインタビューしていた会社だっけかな。 マイクロサービスの話というかパフォーマンスの話で、IO負荷をどうするかという話でした。 マイクロサービス化すすめるとAPIコールが増えて、負荷が増えるようで、 varnishキャッシュやmemcachedAPIサーバに入れて対策したけど、 IO待ちへの対策が不十分だったのでgeventを使うというお話でした。

書き方で、下のような記述をみて闇っぽいなと思いクスッとしました。

from gevent import monkey
monkey.patch_all()

マイクロサービスで負荷増えるってう〜んという感じで、 スケールアウトすれば良いのではという感じもした。

Lunch

お昼はお弁当が出てよかった。しかも豪華! 特に誰とも話さずぼっち飯かましました。。。

Python入門 コードリーディング

たった一ファイルの python スクリプトから始める OSS 開発入門も気になったのですが、 録画されてなさそうなビギナーセッションを観ました。

ファイルの場所とpdbのモジュールの読むとっかかり join,splitの実装を確認して、 どこにファイルがあるのかを確認し、ドキュメントと照らし合わせて読んで見るという使い方を教えてくれました。

ファイルの場所とpdbの使い方

[root@shuhei pywork]# python
Python 3.5.2 (default, Jul 18 2016, 05:05:01)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-17)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import oa.path
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'oa'
>>> import os.path
>>> os.path
<module 'posixpath' from '/root/.pyenv/versions/3.5.2/lib/python3.5/posixpath.py'>
>>> os.path.dirname(".")
''
>>> os.path.dirname("D://")
'D:'
>>> os.path.join("spam", "egg")
'spam/egg'
>>> print(os.path.join("spam", "egg"))
spam/egg
>>> os.path
<module 'posixpath' from '/root/.pyenv/versions/3.5.2/lib/python3.5/posixpath.py'>
>>> os.path
<module 'posixpath' from '/root/.pyenv/versions/3.5.2/lib/python3.5/posixpath.py'>
>>> os.path.__file__
'/root/.pyenv/versions/3.5.2/lib/python3.5/posixpath.py'

モジュールの読むとっかかり join,splitの実装を確認 どこにファイルがあるのか、確認し、ドキュメントと照らし合わせて読んで見る。

>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
>>> this.__file__
'/root/.pyenv/versions/3.5.2/lib/python3.5/this.py'

ROT13のwiki 暗号化をかけると文章がでてくる

pdbというデバッガを使って一行ずつ確認してみる

import pdb; pdb.set_trace()

d = {}
import pdb; pdb.set_trace()
for c in (65, 97):
    for i in range(26):
        d[chr(i+c)] = chr((i+13) % 26 + c)

print("".join([d.get(c, c) for c in s]))
d = {}
for c in (65, 97):
    for i in range(26):
        d[chr(i+c)] = chr((i+13) % 26 + c)
        if chr(i+c) == 'E':
                import pdb; pdb.set_trace()

print("".join([d.get(c, c) for c in s]))
  • コマンド
l 複数行
s ステップ実行
c 続ける
b
  • antigravityモジュール
>>> import antigravity
>>> antigravity.__file__
'/root/.pyenv/versions/3.5.2/lib/python3.5/antigravity.py'
>>> import webbrowser
>>> webbrowser.__file))
  File "<stdin>", line 1
    webbrowser.__file))
                     ^
SyntaxError: invalid syntax
>>> webbrowser.__file__
'/root/.pyenv/versions/3.5.2/lib/python3.5/webbrowser.py'
  • os
>>> import os
>>> os.__file__
'/root/.pyenv/versions/3.5.2/lib/python3.5/os.py'

built-inならpythonに組み込まれているからcの実装 cpython,github python自身のソースをみないとだめ。 

>>> import ita
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'ita'
>>> import itaotools
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'itaotools'
>>> import itertools
>>> itertools.__file__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'itertools' has no attribute '__file__'
>>> itertools
<module 'itertools' (built-in)>

数学的基礎から学ぶDeep Lerning

途中から数式が完全に理解できなくてすやぁっとなった。。。 NumpyとScipyで機械学習をやるとのことだったのですが、難しい。。。 微妙に行列っぽくなったと思ったら、いきなりシンプルな線形性のある数式になったふぁっ!?ってなった。 偏微分方程式は解いたこと無いのでわからず。。。 ただ、このセッションでやっていたことが先行発売されていた オライリー社から出版されるゼロから作るDeep Learningで近いので、 この本を読むと良さそうだった。その前に数学だと思うけど。

Python入門 ライブコーディング

ここのコードは不備があるので読み飛ばして下さい。後で修正するつもり。

基礎から学ぶWebアプリケーションフレームワークの作り方は録画にまかせて ビギナーセッションに参加してきました。 Web API の呼び出しといったコードを書いてくれました。

テストツール flake8

インタラクティブシェル ipython

なにが良いかというとtab補完

ipyhonを使わないならreadlineを使うと良いが、ipythonを使った方が楽。

>>> import readline, rlcompleter
>>> readline.parse_and_bind('tag: complete')
>>> import sys
sys
>>> import sys

デバッグツール pdb ipdb 処理止められて変数を確認できる

c continu
n nextで一行図ス

slack apicurl で実行する

pip install request

import requests
import sys

# print(sys.argv)
# sys.exit(0)

url = slackのapiのurl

r = requests.get(
    'https://api.github.com/user') # urlのパラメータと分離左折
token =

channel = 

# text =
# text = 'こんにちは'
if len(sys.argv) < 1: # 例外処理
    print('引数を指定してください')
    sys.exet(0)
text = sys.argv[1]

pretty = 0

params = {
    'token': token,
    'channel': channel,
    'type':
    'pretty': 
    'as_user': True,
}

r = requests.get(url, params=params)
# print(r.text)
data = r.json()
# import ipdb; ipdb.set_trace()
# print(data)

import pprint
pprint.pprint(data)
pp data
type(data)
pp data['channnel']

git cloneしてlocalにライブラリドキュメントもってきて調べるとよい。

import requests
import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()

url = ''

app_id =

params = {
    'appid': appi,
    'category': id,
}
r = rewuests.get*url, params-params)
# print(r.text)
root = ET.fromstring(r.text)
pritn(root)
for resut in root:
    for item in enumerate(resut, 0);:
            if i == 0:
                    continu
            import ipdb; ipdb.set_trace()
            print(item)

xmlをパースする xml.extree

for i in root:oprint:i)
for j in root:result
pp item
for i in item: print(i)
item.find('{urn:yahoo:jp:auc"}')

python入門ビギナー向け勉強会で続きをやってくれるとのことでした。

How Python helped create the visual effects for an Emmy nominated TV show

英語セッションでよくわからなかった。。。 英語やらなあかんね。。。

LT

  • カラオケ採点
  • 師匠探し
  • 仮想通貨
  • 振り返り
  • 虹工房

すべて良いLTでした。 虹工房はLTはもったいない内容。

Closing

Code of Conduct守ろうな話。

Party

TwitterでFollowしているけど、会ったことがない人達(ハムカズ先生とくーむさん)に会ってみようと目標を立てて参加。

すてにゃんさんはやぱちーで会ったことがあったけど、 顔とTwitter ID絶対に一致されてないだろうなと思ったので、長く話せてよかった。 アイドルなだけあり、みんながすてにゃんさんに話しかけていて、自分はそのついでに話をさせていただいたりした。 すてにゃんというハブで他の参加者が繋がるというのは良さあった。

hamukazu先生とも話せてよかった。まともな言動をする立派な大人だった。仕事も忙しそうだ。 コミュニティでの活動をしているからか、知り合いが多そうで、色んな人が声をかけていた。

くーむさんはすてにゃんさんが紹介というか話すついでに話せた。 Twitterのアイコンを認識されていたのだろうかはわかんないけど、 これを機に覚えていて貰えれば幸いです。

あとはツイッターIDを交換したり、しなかったりですが、 繋がりを大事にしていきたいと思いました。

来年も参加したい。というか2日目寝坊しないようにしたい。

Docker入門

Dockerとは何か。

軽量な仮想環境を実現するためのツール。 OSやアプリの設定したものをイメージ化して保存できる。 Docker環境の別のマシンにも移すことができる。

なにをする。

DockerがインストールされたOSを用意する。 OSやアプリが入った実行imageを実行するdocker run 今回は実行imageはDocker Indexから取ってくるdocker pull 実行したらContainerというものができる。 Containerで設定やアプリ、インストールしたりして設定する。 そこから新しくimageを作る場合はdocker commit 作成したimageを他のマシンで動かしたい場合は docker pushでimageをDocker Indexに持って行き、 移したい先のマシンでdocker pull , docker runをすればよい。 imageを持ってきたらContainerができる。

OSインストール

Vagrantbox.esから Official Ubuntu 14.04 daily Cloud Image amd64 (Development release, No Guest Additions)のイメージを使用します。

使い方

To use the available boxes just replace {title} and {url} with the information in the table below.

$ vagrant box add {title} {url}
$ vagrant init {title}
$ vagrant up

なので

$ vagrant box add trusty64 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box
$ mkdir Docker
$ cd Docker/
$ vagrant init trusty64
$ vi Vagrantfile

config.vm.network “private_network”, ip: “192.168.33.10”

config.vm.network “private_network”, ip: “192.168.55.44”

$ vagrant up
$ vagrant ssh

公式サイトを参照してインストールします。

Docker1.12.1がインストールされました。

$ sudo docker --version
Docker version 1.12.1, build 23cf638

また、CentOS7にインストールするならyumで良いと思います。

yum -y install docker
systemctl start docker
systemctl enable docker

Dockerの操作

DockerでcentosのimageをsearchでDocker Indexから探してみます。 imageが見つかったらdocker pullで引っ張ってきます。 docker imagesでimageをもってこれたことを確認しました。 imageを消すにはdocker rmiで削除できます。

$ sudo docker search centos |more
NAME                            DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
centos                          The official build of CentOS.                   2613      [OK]
jdeathe/centos-ssh              CentOS-6 6.8 x86_64 / CentOS-7 7.2.1511 x8...   29                   [OK]
jdeathe/centos-ssh-apache-php   CentOS-6 6.8 x86_64 / Apache / PHP / PHP M...   19                   [OK]
nimmis/java-centos              This is docker images of CentOS 7 with dif...   15                   [OK]
million12/centos-supervisor     Base CentOS-7 with supervisord launcher, h...   12                   [OK]
torusware/speedus-centos        Always updated official CentOS docker imag...   8                    [OK]
[以下略]
$ sudo docker pull centos
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              980e0e4c79ec        7 hours ago         196.7 MB
hello-world         latest              c54a2cc56cbb        9 weeks ago         1.848 kB
$ sudo docker inspect [IMAGE-ID]
$ sudo docker images
$ sudo docker rmi [IMAGE ID]
$ sudo docker images

centosというimageを実行してContainerを作りコマンドを実行します。

$ sudo docker run centos echo "Hello World"
Hello World

Containerが作られたかを確認するためにdocker psを実行しても確認できません。 動作が完了してしまっているので表示されませんでした。 既に完了しているContainerを確認するためにはps -aとします。

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS                          PORTS               NAMES
7b88f37bfa42        centos              "echo 'Hello World'"   About a minute ago   Exited (0) About a minute ago                       compassionate_bassi
5fb7e2f68a58        hello-world         "/hello"               About an hour ago    Exited (0) About an hour ago                        amazing_kowalevski

最新5つのContainerを表示させるにはps -a -n=5です。 削除するにはrm CONTAINER IDで削除できます。

vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker ps -a -n=5
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                         PORTS               NAMES
7b88f37bfa42        centos              "echo 'Hello World'"   5 minutes ago       Exited (0) 5 minutes ago                           compassionate_bassi
5fb7e2f68a58        hello-world         "/hello"               About an hour ago   Exited (0) About an hour ago                       amazing_kowalevski
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker rm 7b
7b
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                         PORTS               NAMES
5fb7e2f68a58        hello-world         "/hello"            About an hour ago   Exited (0) About an hour ago                       amazing_kowalevski

今度は実行中のContainerを確認してみます。 バックグラウンドで動かすにはrun -d CONTAINER IDが出力されるので、 logs CONTAINER IDで実行中のタスクログを確認できる。

vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker run -d centos free -s 3
9396f8bf834796370f781293f9effd11f4af71e45a58025dbad6f8ba133cac20
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker logs 939
              total        used        free      shared  buff/cache   available
Mem:         501712      120312      137480         736      243920      359839
Swap:             0           0           0

              total        used        free      shared  buff/cache   available
Mem:         501712      119892      137796         736      244024      360327
(以下略)

フォアグラウンドに持って行く時はattachを使います。 止めるにはCtrl + C

$ sudo docker attach --sig-proxy=false 939

実行中のタスクをストップするにはkillstop 再開させるにはstart

vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
9396f8bf8347        centos              "free -s 3"         2 minutes ago       Up 2 minutes                            modest_brattain
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker stop 939
939
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES
9396f8bf8347        centos              "free -s 3"         2 minutes ago       Exited (137) 12 seconds ago                       modest_brattain
5fb7e2f68a58        hello-world         "/hello"            2 hours ago         Exited (0) 2 hours ago                            amazing_kowalevski
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker start 939
939
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS               NAMES
9396f8bf8347        centos              "free -s 3"         3 minutes ago       Up 2 seconds                                 modest_brattain
5fb7e2f68a58        hello-world         "/hello"            2 hours ago         Exited (0) 2 hours ago                       amazing_kowalevski

Containerに変更して、imageを作成する まずは-iインタラクティブモードにし、 -tでターミナルを立ち上げ、 imageを指定、 bashを指定してシェルを立ち上げContainerに入ります。

Containerに入れたので/home配下に移動してtest.txtを作成してみます。

$ sudo docker run -i -t centos /bin/bash
# ll
total 68
-rw-r--r--   1 root root 18307 Sep  6 14:02 anaconda-post.log
lrwxrwxrwx   1 root root     7 Sep  6 13:59 bin -> usr/bin
drwxr-xr-x   5 root root   380 Sep  7 20:23 dev
drwxr-xr-x  48 root root  4096 Sep  7 20:23 etc
drwxr-xr-x   2 root root  4096 Aug 12  2015 home
lrwxrwxrwx   1 root root     7 Sep  6 13:59 lib -> usr/lib
lrwxrwxrwx   1 root root     9 Sep  6 13:59 lib64 -> usr/lib64
drwx------   2 root root  4096 Sep  6 13:59 lost+found
drwxr-xr-x   2 root root  4096 Aug 12  2015 media
drwxr-xr-x   2 root root  4096 Aug 12  2015 mnt
drwxr-xr-x   2 root root  4096 Aug 12  2015 opt
dr-xr-xr-x 111 root root     0 Sep  7 20:23 proc
dr-xr-x---   2 root root  4096 Sep  6 14:02 root
drwxr-xr-x  10 root root  4096 Sep  6 14:02 run
lrwxrwxrwx   1 root root     8 Sep  6 13:59 sbin -> usr/sbin
drwxr-xr-x   2 root root  4096 Aug 12  2015 srv
dr-xr-xr-x  13 root root     0 Sep  7 20:23 sys
drwxrwxrwt   7 root root  4096 Sep  6 14:02 tmp
drwxr-xr-x  13 root root  4096 Sep  6 13:59 usr
drwxr-xr-x  18 root root  4096 Sep  6 14:02 var
# cd home/
# ll
total 0
# touch test.txt
# ll
total 0
-rw-r--r-- 1 root root 0 Sep  7 20:23 test.txt

Containerから抜けたらps -aでContainerを確認します。 先ほどできたContainerがあるので、IDを指定してimageを作ります。 docker commitで作成できます。「username/任意の名前」でimageの名前をつけます。 今回では「hoge/test」としました。 sudo docker imagesでimageが作成されたことを確認します。 hoge/testが作成されています。これを元にContainerを作成します。 sudo docker run -i -t hoge/test /bin/bashでContainerに入り、 test.txtがあることを確認。 これでContainerからimageを作成することができました。

# exit
~$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                      PORTS               NAMES
35695d6c9cef        centos              "/bin/bash"         About a minute ago   Exited (0) 26 seconds ago                       kickass_euclid
9396f8bf8347        centos              "free -s 3"         15 hours ago         Up 15 hours                                     modest_brattain
5fb7e2f68a58        hello-world         "/hello"            17 hours ago         Exited (0) 17 hours ago                         amazing_kowalevski
~$ sudo docker commit 356 hoge/test
sha256:c44f82ed12cc43c6b9a24256b0a99f62e69e9ac75ead52e9035f58214904511e
~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hoge/test           latest              c44f82ed12cc        8 seconds ago       196.7 MB
centos              latest              980e0e4c79ec        23 hours ago        196.7 MB
hello-world         latest              c54a2cc56cbb        9 weeks ago         1.848 kB
~$ sudo docker run -i -t hoge/test /bin/bash
# cd home/
# ll
total 0
-rw-r--r-- 1 root root 0 Sep  7 20:23 test.txt
  • Dockerコマンドのライフサイクルに関わる動作
サブコマンド 意味 実行後の状態
run デプロイ・起動 起動が成功したら稼働中/失敗したら停止中
stop 稼働中のDockerコンテナを停止 停止が成功したら停止中
start 停止中のDockerコンテナを起動 起動が成功したら稼働中
rm デプロイしたDockerコンテナを削除 存在しなくなる(startできなくなる)
  • Dockerコンテナの操作
サブコマンド 意味
exec 稼働中のコンテナでコマンドを実行
logs コンテナのログ(標準出力、標準エラー出力)をする
inspect コンテナ/イメージの詳細情報を表示
  • Dockerイメージ操作のコマンド
サブコマンド 意味
images DockeデーモンにあるDockerイメージ一覧を表示する
rmi DockerデーモンにあるDockerイメージを削除する

Dockerfile

docker build imageから新しいimage作成の自動化 自動化のスクリプトがDockerfile

Dockerfileを作成

vagrant@vagrant-ubuntu-trusty-64:~$ vi Dockerfile

FROMで何のイメージを元にするか指定します。 MAINTAINERで誰が書いたか記述します。 名前とメールアドレスを書いておきます。 コメントは#です。 今回コマンド2つ指定します。 RUNはbuildされるときに実行されるもの。 色んな物をインストールしたりすることができます。 今回はインストールではなく、now building...とだけ表示させます。 CMDはbuildされたimageを元に、runするときに実行されるもの。 (imageからContainerを作るときのこと) 書き方は実行したいものを,で区切り、[]で囲みます。

FROM centos
MAINTAINER FirstName LastName <email address>
# RUN: build時に実行
RUN echo "new building..."
# CMD: run時に実行
# CMD: echo "now runnning..."
CMD ["echo", "new running..."]

buildをしてみます。 sudo docker buildに新しいimageの名前をつけます。 -t hoge/test2とします。 カレントディレクトリにあるDockerfileを使うので.をつけます。 実行するとnow building...と出力されているのが確認できました。

vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker build -t hoge/test2 .
Sending build context to Docker daemon 13.31 kB
Step 1 : FROM centos
 ---> 980e0e4c79ec
Step 2 : MAINTAINER Gen dockerid <mailaddress>
 ---> Running in f506910e9ee7
 ---> b1af5b08522a
Removing intermediate container f506910e9ee7
Step 3 : RUN echo "new building..."
 ---> Running in b9c7c9ec39a1
new building...
 ---> feb31b681b6d
Removing intermediate container b9c7c9ec39a1
Step 4 : CMD echo new running...
 ---> Running in 858b8d74a51f
 ---> a646d9c9c705
Removing intermediate container 858b8d74a51f
Successfully built a646d9c9c705

sudo docker imagesを実行して、hoge/test2があることを確認できました。 実行するとnew running...と出力されることが確認できます。

vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hoge/test2          latest              a646d9c9c705        12 seconds ago      196.7 MB
hoge/test           latest              c44f82ed12cc        About an hour ago   196.7 MB
centos              latest              980e0e4c79ec        24 hours ago        196.7 MB
hello-world         latest              c54a2cc56cbb        9 weeks ago         1.848 kB
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker run hoge/test2
new running...

次はインストールを試してみます。

ApacheインストールするVagrantfileを書きます

build時にRUNでインストールさせます。 imagesの中にファイルを取り込むにはADDを使います。 index.htmlを/var/www/html/にコピーします。 EXPOSEで80番ポートを開けます。 runの時に実行するコマンドを CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]とします。 ※ index.htmlはHello World!という内容で作りました。

FROM centos
MAINTAINER Gen docker id <mailaddress>
RUN yum -y install httpd
ADD ./index.html /var/www/html/
EXPOSE 80
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
# CMD ["/usr/sbin/httpd", "-DFOREGROUND"] でもOK

buildでインストールします。

$ sudo docker build -t hoge/httpd .

ホスト側の8080番ポートをContainer側の80番ポートにリダイレクトさせ、 バックグラウンドで走らせます。 runを実行するとContainerのhttpdが立ち上がります。

$ sudo docker run -p 8080:80 -d hoge/httpd
e23a0bb40467f42650d9dc33dbd77f1927efe7b828d1bb2ba2f18d957a04cf44

Containerのhttpdが立ち上がっているのを確認。

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
e23a0bb40467        hoge/httpd          "/usr/sbin/httpd -D F"   14 seconds ago      Up 13 seconds       0.0.0.0:8080->80/tcp   nauseous_einstein

http://192.168.55.44:8080/にWEBブラウザでアクセスすると Hello World!が表示されました!

docker hubにコンソールからログインします。 Docker Hubにimageをpushします。

~$ sudo docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: hoge
Password:

▽
Login Succeeded
~$ sudo docker push hoge/httpd

ブラウザで、Docker HUBにログインして Repositoryのところに、hoge/httpdがあることを確認