nikkie-ftnextの日記

イベントレポートや読書メモを発信

イベントレポート | PythonでLINE botを作ろう!! ITわいわい!! サポーター参加 #nipponrick

はじめに

だんないよ、nikkieです。
6/16にLINE Bot ハンズオンにサポーター参加してきました。そちらのレポートです。

勉強会の概要

PythonでLINE botを作ろう!! ITわいわい!! - connpass

■ご案内
IT技術者同士のつながりの輪を広げたい思いからわいわい交流会が始まりました。 第2回目となる今回は、『PythonでLINE botを作ろう』をテーマにハンズオンを実施致します。
Pythonに興味はあるけど一人ではなかなか先へ進めない方など、この機会にPythonに触れてみませんか。

講師のFumiさんとは3月のサポーターズ勉強会で知り合い、
次回ハンズオンでお手伝いさせてくださいと申し出たところ、今回の機会をいただきました。 イベントレポート | 【サポーターズCoLab勉強会】Python勉強会(LINE Botハンズオン)#spzcolab - nikkie-ftnextの日記

微力ながら次回はメンターや運営の手伝いなどお手伝いしたいと思いますので、お気軽にお声がけください。

LINE Bot作成

資料は以下に公開されています。(第1回目の内容をベースに、4択クイズ機能が追加された内容です)
Python勉強会(#002) 『PythonでLINE botを作ろう!!』公開資料 – Python勉強会

コードに関しては以下のような手順で手を入れていきました。

  • GitHubのline-bot-sdk-pythonのサンプルコードをベースにする
  • 接続確認でエラーにならないように修正
    • サンプルコードのエンドポイントが存在しないので、存在するエンドポイントに修正(スライド87)
    • 接続確認では返信先がないことによるエラーが出ないように修正(スライド90)
  • 4択クイズBotに機能追加

感想

  • ほとんどの人が4択Botを動かせたようでよかったです。機能追加する際はコードを少し変えて動かして挙動を見て、理解を深めていくような感じでしょうか。気になる箇所をprintしてもよさそうです。
  • LINE Bot SDKはFlaskで動いているようです。AzureのWebAppsの知識と掛け合わせたところ、オウム返しBotをWebAppsで動かせました!ざっくりとした手順1
    • WebAppsインスタンス作成(Python3.6を使うように設定2)
    • GitHubのline-bot-sdk-pythonのサンプルコードについて以下を行う(main.pyとして保存する)
      • 上記の「接続確認でエラーにならないように修正」2点
      • YOUR_CHANNEL_ACCESS_TOKEN,YOUR_CHANNEL_SECRET環境変数から読み込むようにする(os.getenv())
    • WebAppsで動かすために必要なファイルを追加 参考: https://github.com/ftnext/python-docs-hello-world
      • .skipPythonDeployment
      • ptvs_virtualenv_proxy.py
      • web.config
      • requirements.txt
    • WebApps側に環境変数設定

▼動かしてみた様子はこちらから

  • 懇親会でサポートのしむどんさんがPyNyumonのテキストを作られたことを知りました。あのテキストは何度も参照しました。今回は私一人では解決できない部分をフォローしていただきありがとうございました!
  • 事前に調べたり、当日対応したりして環境構築について少し理解が進みました。(PyNyumonでメンターのみなさんが何と戦っているかその一端を垣間見た気がします)

ハンズオン参加者の皆さま、運営の皆さま、どうもありがとうございました。
質問に答えることで理解を深められましたし、いろいろな方とつながれた素敵な時間でした。

脚注


  1. 再現性を担保するべく、近日中にソースコード公開して記事にまとめます。

  2. 不要かもしれないですが、Python3.6を境にjson.loads()の動きが変わっていたことで1週間ハマりました ToTの経験からバージョンは揃えると心に決めています

イベントレポート | Azureもくもく会@新宿 No.20 Azure Database for MySQLのSSLの調査、WebAppsでFlaskの循環importが発生しないようにする方法調査 #あずもく新宿

はじめに

だんないよ、nikkieです。
1時間ほどもくもくしてきたので、成果発表をベースにブログに残します。

勉強会の概要

Azureもくもく会@新宿 No.20 - connpass

みんなで集まって、Microsoft Azureに関する作業をする会です。
新しい機能を試したり周りと相談したりしてAzureを楽しみましょう。

20回記念の今回のテーマは「みんな好きなことをやろう!」でした。
業務でWebApps × Flask × Azure DB for MySQLを使っているのですが、調べきれていないところを調べる時間にしました。

調査事項

  • Azure DB for MySQLSSL設定
  • Web Apps × FlaskでDBを使うときのベストプラクティス?を調べる

Azure DB for MySQLSSL設定

MySQLWorkbenchやFlaskのアプリケーションでのSSL接続の方法を調べる時間的猶予がなく、
SSL接続を無効にして使ってきました。気になっていたので調べました。

以下のドキュメントを参考にするとよさそうです。
https://docs.microsoft.com/ja-jp/azure/mysql/howto-configure-ssl:tilte

  • ドキュメント中のリンクからSSL証明書を取得
  • MySQLWorkbenchから接続する場合
    • SSL CA Fileを設定する
  • Flaskのコードから接続する場合(Flask-SQLAlchemy使用)
    • 接続文字列にssl_ca=として取得したSSL証明書のパスを取得すればよさそう1
    • イメージ: mysql+pymysql://user:password@host/dbname?ssl_ca=ssl/ca_file/path

Web Apps × FlaskでDBを使うときのベストプラクティス?を調べる

気になっていたこと: 循環import
https://twitter.com/ftnext/status/1006188837519814656

Azure WebApps x Flaskの組合せで少しつまづいた。
wfastcgiはmain.py (1)をimportしているらしく、循環import (2)が発生した
(1)app.run するファイル(ローカルサーバ立てるのに走らせる)
(
2)main.py でappを作ってからSQLAlchemyのdbを作る(続

https://twitter.com/ftnext/status/1006189297639100416

循環import続き
main.py でSQLAlchemyのdb使ったモジュールimportしにいく →そのモジュールではmain.py からdbをimportする必要があるで循環発生
「SQLAlchemyのdb使ったモジュール」をmain.py の先頭から使っている関数の先頭に移したらエラーは消えた

ご助言いただきました。誠にありがとうございます!

教えていただいたThe Flask Mega-Tutorial Part IV: Database - miguelgrinberg.com
以前触ったことがあった2. Flaskチュートリアル — study flask 1 ドキュメントをもとに試行錯誤していました。

今回できたもの:https://gist.github.com/ftnext/63279bed7b1d0dbe0ab5015682fb78c0

感想

  • 既存の Azure App Service と Azure Database for MySQL の接続 | Microsoft Docsに「方法 1 - すべての IP アドレスを許可するファイアウォール ルールを作成する」とあるのを発見。元も子もない解決策のような。。
  • もしかしたらDockerでFlaskサーバを動かす方法確立しちゃうほうが早いかも(WebApps利用はベンダーロックインされるように思えてきた。。)←AKS調査の成果発表の影響もあるかも
  • CustomVisionServiceで物体検知が可能になっていることを知った(サッカーの試合シーンからサッカーボールを検知するデモ)。機械学習の結果がAPIからどんどん利用できるようになってるな〜。学習済みのモデルが返すJSONには精度順に検出した物体情報が含まれるとのことで、APIの仕様、気になります。

Azureの最新情報も収集でき、成果発表の機会もいただき、どうもありがとうございました。皆さまお疲れさまでした。

脚注


  1. 未検証です。今回調べた限りでは動作するのだろうと期待しています. http://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine

  2. <add key="WSGI_ALT_VIRTUALENV_HANDLER" value="main.app" /> https://github.com/Azure-Samples/python-docs-hello-world/blob/master/web.3.4.config#L4 の部分のことです。main.pyのappはこれでimportできるようなのですが、app/__init__.pyのmyappはどう書けばimportされるのでしょうか?(宿題事項)

イベントレポート | (第89回)Python mini Hack-a-thon : Flaskのロギングの調査、LINE Botを少しだけ触る #pyhack

はじめに

だんないよ、nikkieです。
6/9の pyhack 成果発表をもとにブログにしました。
今回はMarkdownで書いているので、いつもと体裁が異なります。

勉強会の概要

(第89回)Python mini Hack-a-thon - connpass

スプリントのゆるい版みたいな感じで各自自分でやりたいことを持ってきて、勝手に開発を進めています。

取り組んだこと

成果

  • Flaskのログ出力について疑問は解決できた
  • LINE Botでオウム返しできた

Flaskのログ出力から書いていきます。

疑問

Flaskインスタンスをrunしているファイル(app.py)では以下のようにしてdebug.logにログ出力ができます。1
app.pyにimportしているファイル(logtest.py)のログをdebug.logに出力するにはどうすればいいのか調べてみました。

# app.py
import logging
from logging.handlers import RotatingFileHandler
import os

from flask import Flask

from logtest import fabulous_message

app = Flask(__name__)
formatter = logging.Formatter(
    '%(asctime)s %(levelname)s: %(message)s '
    '[in %(pathname)s:%(lineno)d]'
)
debug_log = os.path.join(app.root_path, 'debug.log')
debug_file_handler = RotatingFileHandler(
    debug_log, maxBytes=100000, backupCount=1
)
debug_file_handler.setLevel(logging.INFO)
debug_file_handler.setFormatter(formatter)
app.logger.setLevel(logging.INFO)
app.logger.addHandler(debug_file_handler)

@app.route('/')
def hello():
    app.logger.info('GET Access')
    message = fabulous_message()
    return message


if __name__ == '__main__':
    app.run()

わかったこと

  • ロガーの子孫構造を使う
  • 子孫構造を使わない場合、ロガーを設定して使えばよさそう(ロギング設定ファイルも導入したい)

ロガーの子孫構造を使う2

# logtest.py
import logging


logger = logging.getLogger('__main__.'+__name__)

def fabulous_message():
    logger.info('fabulous message create start')
    return 'Hello, World!'
2018-06-09 15:30:34,008 INFO: GET Access [in app.py:25]
2018-06-09 15:30:34,009 INFO: fabulous message create start [in /Users/.../logtest.py:21]

ロガーの子孫構造について https://docs.python.jp/3/howto/logging.html#loggers

たとえば、名前が foo であるロガーがあったとして、 foo.bar, foo.bar.baz, foo.bam といった名前のロガーはすべて foo の子孫になります。

ロガーの子孫構造を使っているため、logtest.pyの中でロガーの設定は不要と理解しました。
app.loggerは標準モジュール logging のロガーを使っていると確認できました。3
python app.pyと実行したとき、app = Flask(__name__)__name____main__が入るため、
logtest.pylogger = logging.getLogger('__main__.'+__name__)としたことで子孫構造が設定できました。4

logtest.pylogger = logging.getLogger(__name__)としたところ
debug.logにはログ出力されませんでした。(子孫構造が設定されていないためと考えています)

ロガーを設定して使う

以下のようにロガーを設定しても、importしたファイルからdebug.logにログ出力できました。5
(これだと「他のファイルにも同じように書かないといけないじゃん!」と思い、同じようなコードを繰り返さない方法を探して、子孫構造に至りました)

# logtest.py
import logging
from logging.handlers import RotatingFileHandler

logger = logging.getLogger(__name__)
formatter = logging.Formatter(
    '%(asctime)s %(levelname)s: %(message)s '
    '[in %(pathname)s:%(lineno)d]'
)
debug_file_handler = RotatingFileHandler(
    'debug.log', maxBytes=100000, backupCount=1
)
debug_file_handler.setLevel(logging.INFO)
debug_file_handler.setFormatter(formatter)
logger.setLevel(logging.INFO)
logger.addHandler(debug_file_handler)

def fabulous_message():
    logger.info('fabulous message create start')
    return 'Hello, World!'
2018-06-09 15:58:07,321 INFO: GET Access [in app.py:25]
2018-06-09 15:58:07,323 INFO: fabulous message create start [in /Users/.../logtest.py:21]

ロギング設定ファイル

importするファイル全てに書くのは大変そうなので、ロギング設定ファイルを使ってみようと思います。(宿題事項)

https://docs.python.jp/3/howto/logging.html#configuring-logging

ロギング設定ファイルを作り、それを fileConfig() 関数を使って読み込む。

動作環境

LINE Bot でオウム返し

f:id:nikkie-ftnext:20180610105316j:plain:w400

感想

takanoryさんから「Logging HOWTO — Python 3.6.5 ドキュメント」を教えていただき、ロギングの理解を深めることができました。教えていただきありがとうございました!
次の1週間を乗り切る準備ができたかなと思います。(勤務先でソロでPython使い続けるために毎週末に翌週の準備をしています。例外は直近では使わなさそうだから、またの機会に調べよう)

今回ははじめて来られた方がいつもより多かったと思います。
先日の #PyNyumon から来られた方もいて、メンターにトライした身として嬉しかったです。
来月は合宿ということで、私も思い切って飛び込んでみようと思います。(申込みました!)

脚注


  1. ロギングは次のコードを参考にしています。 http://study-flask.readthedocs.io/ja/latest/07.html#logging

  2. StackOverflowの次の回答を参考にしています。 https://stackoverflow.com/a/39863901

  3. http://flask.pocoo.org/docs/0.12/api/#flask.Flask.logger

  4. python app.pyの実行ではない本番環境で子孫構造が想定どおり働くかは検証の必要があります。

  5. RotatingFileHandlerに'debug.log'と直に渡しているのが気になるので、pathlibのPathを使うやり方に今後アップデートします。(ソフトウェアデザイン2018年2月号を参考にします)

イベントレポート | Chainer x Azure ML Hackathon CV編 #dllab

はじめに

だんないよ、nikkieです。
「Chainer x Azure ML Hackathon CV編」に参加してきました。

nikkieのレベル感

  • Azure ML Studioで機械学習(特にレコメンド)は業務で数ヶ月の経験あり
  • 深層学習について、用語は聞いたことがあるが、手を動かしたことがない

深層学習に踏み出したかったので参加しました。

勉強会の概要

いよいよ、ディープラーニングをエンジニアが使いこなす時代がやってきています。柔軟性が高く直感的な記述が可能なDeep Learning Framework Chainerと機械学習プロジェクトをEnd to EndでサポートするAzure Machine Learningを使って、画像認識、画像分類のExampleを作るハッカソンを行います。様々なデータセット(CIFAR10/100, ImageNet, MNIST, ResNet, YOLO)を使って、データ準備、モデル構築、モデルデプロイまでを行います。ExampleはDLLABのGitHubで公開します。今後も継続的にやっていきますよ!
ハッカソンと銘打っていますが、ハンズオンに近そうな印象を受け、初学者でもいけるだろうとエントリーしました。
各自でやることを決めて取り組む形式だったので、もくもく会の趣でした。

取り組んだこと

深層学習のイメージは、GPUと画像分類チュートリアル(CIFAR10など)でした。
そこで、AzureにGPUインスタンスを立てて、チュートリアルをやることにしました。

AzureにGPUインスタンスを立てる:DSVM
Chainerの名を冠するイベントなので、Chainerを使おうとWindows OSのData Science VMを作成。
(Data Science Virtual Machine - Windows 2016のNC6。月9万円程度)

Azure での Windows データ サイエンス仮想マシンのプロビジョニング | Microsoft Docs

Linux OSの方が慣れているのですが、UbuntuCentOSもドキュメント中にChainerの文字がありませんでした。
 そのため、Chainerが構築時から入っているWindows OSを使うことにしました)
 
Azure ML Workbenchからアクセスを試みる
Machine Learning 実験を作ってWorkbenchからアクセスを試みたところ認証でハマりました。(認証中から先に進まない状態になりました。。)
サインインすると、Workbench によって Azure サブスクリプション内で検出された最初の実験アカウントが使用され、
今回使ったアカウントにはいくつかのディレクトリが紐付いています。
Workbench側が全然関係ないディレクトリの認証情報入力を求めてきたので
虱潰しに検出するものなのかと入力したのですが、それ以降進まなくなりました。
後述のRDPという代替手段を見つけたので、深入りしませんでしたが、
トラブルシューティングのドキュメントを参考に、キャッシュファイルをクリアするとWorkbenchを復旧できるそうです。

DSVMにアクセスする
最初はSSHでつなごうとしたのですが、タイムアウトでうまくいきませんでした。
(ネットワークセキュリティグループの受信規則にSSHを追加したのですが、解決しませんでした。。)
リモートデスクトップ(RDP)ってMacからはできないものと思いこんでいたのですが、
上記ドキュメントのリンクから入手したアプリであっさり接続できました。

チュートリアルのための環境設定

DSVMにRDPしてJupyterでチュートリアルを進めることにしました。

チュートリアルを進めるに当たり、DSVMのChainerをv4にバージョンアップする手順がアナウンスされました。
コマンドプロンプトから以下を順に実施しました)
  • pip uninstall chainer
  • pip uninstall cupy
  • pip install chainer
  • pip install cupy-cuda90

DSVMはハッカソン後に消えるので、仮想環境は使わず、OSデフォルトのPython3.6.3とpipで進めています。

MNIST

ビギナー向けチュートリアル(上記リンク)のMNISTを進めました。
▼成果物
https://gist.github.com/ftnext/cd763fc4cec9f44373ad330443cad5aa
「全結合層のみからなる多層パーセプトロン」のGPUを使った学習まで進めたところで時間切れとなりました。

MacからRDP接続するとUSキーボードになったので苦労しました。

Mac からのRDP 接続で日本語キーボードを設定する

時間が限られていたので、以下のサイトをもとに読み替えて進めました。

USキーボードと日本のキーボードの違い

()はShift+9,0だったり、:はshift+;だったり、=はShift+^だったりとだいぶ混乱したので、設定をしたほうが作業が進んだかもしれません。

 

成果物のダウンロード

ファイル共有設定をすることで、DSVMで作成したnotebookがmacにダウンロードできました。

MacからWindowsにリモート接続する際のファイル共有 | ITBeginner

「ファイル共有」ということは、事前にmacでnotebookを用意することで
お高いDSVMの稼働時間を削減できそうです。(ファイルを送るか、コピペをする想定)

感想

深層学習に一歩踏み出しました!
今回進めたチュートリアルはわかりやすく、「エポック」や「ミニバッチ」などの用語をつかめた感触があります。

ただ、chainerのコードは呪文状態なので、勉強することはまだまだたくさんあります。
dllabさんからは手を動かす機会を定期的にいただけそうなので、今後もチェックしたいと思います。

chainerはscikit-learnみたいな書き方をするんだなと気づきました。
機械学習フレームワークはどれもオブジェクト指向で書いているのかも)

RDPははじめて触ったのですが、驚くほど使いやすかったです。

平日ハードワークのためか寝過ごしてしまい、午後からの参加でした(お恥ずかしい限りです)。
遅刻対応していただけて本当にありがたがったです。
「かたじけない、この御恩は必ず」という思いです。

あと、以下の質問をしたところ、バラバラだったAzureのサービスがつながり、
Azureを触っている身として進むべき方向が見えた気がします。
咀嚼しきれていないところもありますが、Azureについて学習するモチベーションが上がりました!

質問:Azure ML StudioとAzure ML Serviceの違いはなにか?

Azure ML Studioは触ったことがある。(ブラウザでGUI機械学習できるツール)
Azure ML Serviceは言葉だけ聞いているが、Studioとの違いが今ひとつわからなかった。

回答:

  • StudioはJupyterと同等
  • ServiceはJupyterの限界を取り払った(IoTやHololensまで広がる世界 & 自動化)

Studioは大量データの扱いに限界がある
StudioにはDeep Neural Networkがない
StudioはCPUで動く
StudioはAPIのデプロイが数クリックでできる

WorkbenchはPython + Dockerでできている。(※Serviceの主要構成要素としてWorkbenchがあると理解しました)
日付や文字データであればpandasのdatasetとしてデータ加工してくれる
トレーニング環境の使い分けができる(ローカル、GPU(DSVM)、Azure Batch(GPUインスタンスが複数立ち上がる)、Spark)
WorkbenchはモデルをBlob Storageに保存。モデルのマトリックス(ハイパーパラメタ × エポック数)からモデルを選抜すればよい
データ加工、学習、デプロイ全てでCLIを提供→自動化を見据えている

IoTHubからデバイス(ラズパイ)を指定して、モデルを流せる。(Dockerを使う。Azure Container Registoryに保存)
 buildではデバイスのツールキットを発表。今は1000円程度だが、このコストは今後激減すると見込まれる
Windows間ではモデルはONNX形式でやり取りできる。→Hololensに渡せる

 

以上です。
ハッカソン関係者と参加者の皆さま、どうもありがとうございました。1日お疲れ様でした。

 
 
 
 

イベントレポート | Pythonもくもく自習室 #10 @ Rettyオフィス #rettypy

はじめに

だんないよ、nikkieです。
5/26は#rettypyでもくもくしてきました。

 

勉強会の概要

Pythonもくもく自習室 #10 @ Rettyオフィス - connpass

この勉強会について

週末の昼下がりに、Pythonに関するやりたいことを各自持ち寄り、ゆるゆると「自習」を進めていく会です。

  • 本を読む
  • PythonDjangoなどのチュートリアルをすすめる
  • コミュニティの作業や執筆etc...
  • 他の参加者と情報交換をしたり学んだり
  • おいしいご飯と共に楽しむ(?)

など、Python使いおよびエンジニアライフのオアシス&知見を身につける「自習室」としてゆるくご活用いただければと思います。

※初心者歓迎です!(なお,ハンズオンなどはありません)

主催の @shinyorke さんいわく

3月以来ひと月ぶりの参加でした。
Web系(Django、Flask)、機械学習系(Deep Learning本、kaggle)、データ分析系(pandas)、電子工作系(ラズパイ)など、
バランスよくもくもく内容がわかれていました。

取り組んだこと

udemyの講座はセクション3を写経(セクション4の冒頭で時間切れ)。気づいた点としては

  • from flask import FlaskのFlaskは「クラス」。クラスをimportしているって感覚なかったなあ
  • お店のリスト→お店は辞書で表す→お店は商品のリストを持つ→商品はリスト
    なるほど、API叩くと辞書とリストが入り交ざったJSONが返ってくる裏には、こういう考えがあったのか
  • nameを指定してstoreを作ったら、できたことを示すために、storeを返す挙動にしている(storeの名前を確認でき、アイテムがないことも確認できる)
  • 決め打ちのAPIでよければ、セクション3の内容で作れる(サーバ止めるとデータ消えちゃうけど)

 

成果発表から

 

感想

ランチの時間、すごく楽しかったです。カレーが美味しかったし、Pythonの話ができたのが嬉しかった!
社内ではソロでPython書いているので、Pythonの話ができる人がいないんですよね。。

コードレビューしてくれる人がいないので、動いているけど自己流の書き方で不安を感じていますと話したら、
「動いていることに価値がある」「稼動期間が1年程度のプロダクトであれば多少汚いコードでも気にしすぎなくてよい」という考え方を教えていただき、目からウロコでした。
上の障害報告書の記事にも通じる考え方だと思います。
今は汚いコードでも、日頃の勉強を積み重ねることで、
次回似た内容のコードを書くときは数段レベルアップしたコードを書けるようになると信じ、取り組んでいきます。

みんなのPython勉強会のLT練習と宣伝もさせていただきありがとうございました。

もくもく会関係者と出席者の皆さま、1日どうもありがとうございました! お疲れ様でした。

イベントレポート | カイゼン・ジャーニー 著者による本読みの会 第05話「明日を味方につける」#kaizenJ

はじめに

だんないよ、nikkieです。
今朝は「カイゼン・ジャーニー 著者による本読みの会 第05話『明日を味方につける』」に参加してみました。

 

勉強会の概要

カイゼン・ジャーニー 著者による本読みの会 第05話「明日を味方につける」 - DevLOVE | Doorkeeper

「著者による本読みの会」 では、著者2人がカイゼン・ジャーニーを1話ずつとりあげて、内容を解説したり、深掘りしたり、脱線したりします。カイゼン・ジャーニーってどんな本なの?あの話のことをもっと聞いてみたい!という方、耳を傾けてみてください。
1話あたり 30分 。仕事の息抜きに、ぜひどうぞ。
カイゼン・ジャーニー』は私の仕事のやり方に大きな影響を与えている本です。
一人だと見えていないこともあるんだろうなと思い、偶然見つけた本読み会に参加してみました。
今回は「一人朝会」の章です。
 

メモ

  • ふせんでタスクの優先度を洗い出しているが、管理できておらず埋没してしまう。
    「締め切りを踏み抜く」

  • 朝会と朝礼の違い
    朝礼は一歩通行なニュアンス 偉い人が喋る
     朝会はメンバー自分たちでコントロール 自分ごと

  • チームとグループの差
    人が集まればチームになるわけではない
    寄せ集めのグループにすぎない お互い何やってるかわからない

  • 突っ伏した新人 一人で遅くまで
    個人で仕事をしていると溜め込みすぎて辞めてしまう
    「朝会で共有するのがいいということを表したい」 →江島と対比

  • 昨日やったこと
    今日やること
    困っていること
    チームメンバー6-7人で朝会を15-30分に収めるため上記の事項に絞る

  • 問題の共有だけでなくタスクの再計画(リファインメント)が重要
    スケジュールはメンテナンスするもの ←スクラムガイドにも書いてある

  • 明日を味方につける
    今日のタスクマネジメントは明日のタスクマネジメントである
    1週間すら読み切れないが、今日どこまで行けそうかは想像できる 今日できないことは明日へ
    今日と明日の間で境界を引いてやりくりする

  • 毎日のタスクのメンテナンス
    →リズム 1週間まとめての振り返り 翌週につなげる

  • 1on1
    最初はGoogleなどから
    1人1人と向き合っていく取り組み 面談ほど固くない
    何を考えているか

  • マネージャーの仕事として、メンバーが気持ちよく成果をあげられるようにする。
    コミュニケーションは必要
    日頃の会話の中でできるとベター
    毎週30分会話の時間をとる タイムボックスを区切ると流されなくなる
    慣れていなければコーヒータイムや雑談の延長でよい
    上司、部下で考えていることを共有する

  • メラビアンの法則

    「見た目/表情/しぐさ/視線等」の視覚情報が55% 、「声の質/話す速さ/声の大きさ/口調等」の聴覚情報が38%、「言葉そのものの意味/話の内容等。」の言語情報が7%


    メラビアンの法則とは - コトバンク
    1on1はフェイス・トゥ・フェイスが重要

  

感想

この章は「明日を味方につける」の意味がわかって鳥肌が立った章です。
それだけに「タスクマネジメント」に目が向きすぎていたかもしれません。

著者のお二人のお話は、タスクマネジメント以外の部分(この本を通してのエッセンスの部分)にも
目を向けるきっかけになったように感じています。
ふりかえりと同じで、他人の思考を取り入れることで自分の限界を越えていけるわけですね。

著者のお二人、本読みの会出席者の皆さま、素敵な機会をどうもありがとうございました。
今後も参加していきます!

 

イベントレポート | DjangoCongress Day1 #djangocongress

はじめに

だんないよ、nikkieです。
DjangoCongress Day1に参加してきました。
Django Girls Tutorialsをやった程度でDjangoの経験値が少なく、咀嚼しきれていない内容が多いです。
後々見返すために発表スライドをまとめておきます。

 

イベントの概要

DjangoCongress JPは日本で開催されるDjango Webフレームワークのカンファレンスです。
DjangoCongress JPは、Djangoでアプリケーションを開発している人、Djangoを学んでいる人などDjangoに関わる全ての人が参加できます。
参加する全ての人がDjangoについて交流し、出会い、学び、楽しみ、深い理解を得ることを目的にしています。
実務でDjangoを使えるようになりたいので、情報収集目的で参加しました。
フルスタックのDjangoは身近に聞ける人の少ない環境では敷居が高いと判断し、
Flaskでサーバサイドの開発をしています。)
 

聞いたTaiks

テストコードを書けば、(コード変更の)恐れを退屈に変えられるというケント・ベックの言葉、すごく印象的でした。
モダンなプログラマになって、テスト結果見せながら
「コード変更の影響? ないですよ」って言えるようになりたい。
 

speakerdeck.com

DjangoはSingle Page Applicationに不向き、Multiple Page Applicationに向いている。
フロントエンドの話になると言語関係なくついていけない(知識が足りない)という自分の課題が見えました。(pjaxって始めて知った)

 

speakerdeck.comミドルウェアに処理を持たせるというのは初めて知りました。
デプロイでハマってWSGIってなんだ?って悔しい思いをしたので
このスライドとソースコードをもとに、WSGIの理解を自分のものにしたい。

 

speakerdeck.comほかの人が自分と同じ失敗をしないように、失敗を共有するTalk
リファクタリング前後のコードを見返して、何が失敗でどう修正したか理解する必要あり。

 

www.slideshare.netデモあり、サンプルコードありと、非常に力の入ったTalkでした。
ユーザ認証はこれまでノータッチでしたが、認証バックエンドというものを今回学べました。
ネット上に転がっているフィールド混同のサンプルコードには要注意。

 

slideship.comDRFは触ったことのない状態で聞きました。
DRFが使えたらこんな感じになるのかとおぼろげながらイメージできました。
Serializer使うほうが、Flaskのjsonifyでdict作るよりも扱いやすそうな印象です。
DRFという選択肢も用意するため、素振りしていきたいところ。

 

聞いていないTalks

▼データベースバックエンドについてのTalk

DjangoCongressJP 2018 の発表資料(2018-05-19) · GitHub

 

speakerdeck.com

speakerdeck.com

 

感想

Djangoの深さを体感した1日でした。Tutorialの先にこんなにも様々な世界が広がっているとは!
(JSなどフロントエンドの技術もDjangoの世界を広げるのに一役買っているんですね)

実はチケット譲っていただけて参加できています。譲っていただきありがとうございました!
この機会を自分のものにするために気合を入れて素振りをしないといけません。

来年も予定しているそうなので、もう少し参加者の人数を広げていただけるとうれしいです。
運営、発表者、参加者の皆さま、ありがとうございました。1日お疲れさまでした。