nikkie-ftnextの日記

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

nikkie流PyConトークの歩き方 #pyconjp

はじめに

いつも心は虹色に! nikkieです。
いよいよカンファレンスですね。
Pythonを通じて新しい知識や人とどんな出会いがあるかワクワクしています。
今回はPyConでトークを聞いて知りたいことを整理するために書き出しました。

アクセス

実は16日に会場に行っている1のですが、京急でのアクセスは、以下の「アクセス方法」がわかりやすかったです。
交通アクセス|大田区産業プラザPiO

PyCon履修決め

カンファレンス - PyCon JP 2018
自分の取り組みに関係が深そうなトークを生で聞くという方針で選択しました。
もくもく会で面識のある方のトークが重なっていたりして、どちらを聞くか非常に悩みました。
公開されたYouTubeは可能な限り消化しようと思っています。(むしろYouTube公開されてからが本番ですね)

基調講演など複数トラック並行でないところは省きました。
現地で関心を引かれて、聞くトークが変わる可能性があります。

17日 13:30-

Why you should care about types: Python Typing in the Facebook Backend
@小展示ホール

  • 普段Pythonで型を意識することはあまりないのですが、型を意識するとどんなメリットがあるか知って、コーティングに取り入れたいです
  • TypeScriptを触ったことがあるので、型の導入は期待してます
  • FBのエンジニアがどんな働き方しているかというのも知られたら嬉しいです(キラキラしている企業に弱い)

17日 14:30-

Building Maintainable Python Web App using Flask @A+B会議室

  • Flaskは独学から業務で利用したのですが、コードの保守性には課題を感じました
  • ユニットテストやDDDの話をされるそうなので、Flaskのコードを書く上で実践できそうなことを知るために聞きます

17日 15:45-

Jupyterで広がるPythonの可能性(どりらんさん)
@コンベンションホール

  • これまでのもくもく会での準備を見て、Jupyterの機能を全然知らなかったと思い知り、トークを聞きたくなりました
  • 先日stapyでトークした機械学習モデルのデプロイにもう少し取り組むので、Jupyterの知識はモデル作成時に活かせそうです
  • スライドをGitPitchからJupyterに切り替えるかも迷っているので情報収集したいです

17日 16:30-

Pythonistaの選球眼(せんきゅうがん) - エンジニアリングと野球の目利きになる技術(shinyorkeさん) @A+B会議室

  • 『イシューからはじめよ』は最近読んだので、エンジニアとどう結びつけるのか気になっています
  • 1年弱の自分の取り組みを振り返る観点を見つけられるんじゃないかと期待しています

18日 11:15-

niconicoにおけるコンテンツレコメンドの取り組み
@コンベンションホール

  • レコメンドはAzure Machine LearningやPySparkで経験のある身なので、大規模なレコメンドの事例として興味があります
  • レコメンドを実装する上で使うパッケージの情報が知られたら嬉しいです

18日 13:30-

Djangoだってカンバンつくれるもん(Django Channels + Vue)
@特別会議室

  • 業務でフロントエンドも必要になってくるので、簡単なものを1つ作ってみたいと思っています。トークで扱っている題材の写経が1つの候補です

18日 14:30-

Notebook as Web API: Turn your notebook into Web API
@D会議室

  • この拡張でどこまでできるのか興味があります
  • 機械学習モデルをDockerでデプロイするよりも使いやすそうなら乗り換えも検討したいです

18日 15:45-

From Data to Web Application: Anime Character Image Recognition with Transfer Learning
@A+B会議室

  • アニメ題材なので即決でした
  • トークをもとに手を動かしてみようと思っています(転移学習)

18日 16:30-

AltJSとしてのPython - フロントエンドをPythonで書こう
@D会議室

  • フロントエンドを学習するまでの繋ぎとしてPythonで書く方法に興味があります
  • どこまでできるのか、限界やデメリットはあるのかというところを知りたいです

マークダウンでとったメモを休憩時間にHackMDに上げていく予定です。

トークの他にブース回りも予定しています。
LTは落ちた身なので、どんな題材が通ったのか研究して、普段のネタ決めに取り入れるつもりです。
本当にワクワクしますね。

よーし、楽しむぞ!


  1. 先日の転職と関係があります。後ほどブログで状況報告しようと思います。

イベントレポート | #モグモグDjango にてDockerでDjango+MySQLの環境構築の知見を得ました

はじめに

いつも心は虹色に! nikkieです。
#モグモグDjango にお邪魔してDockerでDjango+MySQLの環境を構築するノウハウをつかみました。

勉強会の概要

第2回 モグモグDjango - connpass

Djangoもくもく会 モグモグDjango を開催します. Django初心者の方から,上級者の方までどなたでもご参加下さい(^^)
この会では,しーーっんとしているもくもく会ではなく,質問や分からないところがあったら,その場で聞くことができる環境にしたい!と思っています.

7月に続いて2回目開催の#モグモグDjango
『現場で使える基礎Django』や加筆版(Kindle版ペーパーバック版)の著者akiyokoさんが今回もいらっしゃり、Djangoユーザにとって充実のもくもく環境でした。

休憩の王道ドーナツ(mamixさん持参)もあり、上質な甘さを堪能していました。(本当に美味しかった。。ごちそうさまでした)

取り組んだこと

Django Girls Tutorial翻訳でお世話になっているkaizumakiさんが、前回からDockerでDjango+MySQLの環境を構築するのに取り組まれていたので、一緒に調べていました。

本当はやりたいことを用意していたのですが、業務がオーバーフローしてしまい、何をするかが詰められないままの参加でした。1(ここは要反省です。。)

Django+MySQLの環境構築で得られた知見

以下のブログをベースに取り組みました。2

以下の2つの点が収穫です。

  • PyMySQLが必要
  • db-datadirというディレクトリをホスト側に作って、MySQLのデータを永続化する

わかったことをまとめていきます。

実行環境

  • macOS 10.13.6
  • Docker Client/Server 18.06.1-ce

Dockerfile

Dockerの公式ドキュメントの書き方が納得できないので、以下のように修正しました。

FROM python:3.6
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
  • Python3.6系を使うためベースイメージを変更(FROM命令)
  • ファイルやフォルダの単なるコピーであれば、ADD命令よりCOPY命令のほうが好ましいと認識しているので、COPY命令を使用

requirements.txt

Django~=2.0.6
PyMySQL
  • Django Girls Tutorialと同様に2.0系の最新を指定
  • Dockerの公式ドキュメントにあるpsycopg2PostgreSQL接続用3

docker-compose.yml

version: '3'

services:

  # https://hub.docker.com/r/mysql/mysql-server/
  db:
    image: mysql/mysql-server:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=P@ssw0rd
      - MYSQL_ROOT_HOST=%
    volumes:
      - ./db-datadir:/var/lib/mysql
      - ./sql:/docker-entrypoint-initdb.d

  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
  • ホストからdbコンテナの3306ポートにアクセスしないだろうとdbにportsは設定していません(コンテナ間はDockerのネットワークで通信できる認識)
  • webコンテナにdepends_on設定しているので、webの方がdbより先に立ち上がることはないと考え、commandのsleep 3;は削除しました
  • volumesの./db-datadir:/var/lib/mysqlという書き方でMySQLのデータが永続化できることを初めて知りました。ホスト側にdb-datadirディレクトリができて、データが永続化されます。
    • これまでは以下のように宣言したdb-volumeを指定してきました。(関連箇所を抜粋)
services:
  db:
    volumes:
      - db-volume:/var/lib/mysql
volumes:
  db-volume:

参考記事ではsqlファイルを作成しているのですが、よくわからなかった私はスキップして先に進みました(注意: ハマりたくなければ、スキップしないでください)。

フォルダ構成

  • Dockerfile
  • requirements.txt
  • docker-compose.yml

プロジェクト作成

$ docker-compose up -d db
$ docker-compose run web django-admin startproject mysite .
$

フォルダ構成

  • db-datadir/
  • mysite/
  • manage.py
  • Dockerfile
  • requirements.txt
  • docker-compose.yml

[ハマった] DBの接続設定をして、migrationを実施

mysite/settings.pyを以下のように変更

import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django',
        'USER': 'django',
        'PASSWORD': 'P@ssw0rd_django',
        'HOST': 'db',
        'OPTIONS': {
            'charset': 'utf8mb4',
        },
    }
}
  • PORTは指定不要の認識です(デフォルトで3306ポートと通信している認識です)

webコンテナで プロジェクトを作成しよう! · Django Girls Tutorial にならってコマンドを実行させました。

$ docker-compose run web python manage.py migrate
 :
django.db.utils.OperationalError: (1045, "Access denied for user 'django'@'172.19.0.3' (using password: YES)")
$

djangoユーザでMySQLに接続できず落ちます。

現状の問題4

  • MySQLdjangoデータベースが作成されていない
  • MySQLdjangoユーザが作成されていない

これはsqlを作成して実行していないことが原因です。
必要なsqlを作成していきます。

DB初期化用SQLファイル作成 + 初期化実施

sql/001_setup_application_database.sql

CREATE DATABASE IF NOT EXISTS django CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER IF NOT EXISTS 'django'@'%' IDENTIFIED BY 'P@ssw0rd_django';
GRANT ALL PRIVILEGES ON django.* TO 'django'@'%';

フォルダ構成

  • db-datadir/
  • mysite/
  • sql/
  • manage.py
  • Dockerfile
  • requirements.txt
  • docker-compose.yml

sqlファイル作成後にdocker-compose up -d dbをしても、初期化は実施されません。
データを永続化しているdb-datadirディレクトリを削除する必要がありました。5
(参考記事中の「DBを作成し直す場合の手順」をもとにしました)

$ docker-compose down
$ rm -rf db-datadir
$ docker-compose up -d db
$ docker-compose run web python manage.py migrate
$

dbコンテナが立ち上がるまで少し時間を置く必要がありましたが、これでデータベースとユーザが作られ、マイグレーションが実行できました。
sqlファイルにより、手動でデータベースやユーザを作る作業をなくしているんだなと気づきました。

superuser作成

$ docker-compose run web python manage.py createsuperuser
 :
$

以上で設定が終わったのでdocker-compose up -dしてから、http://127.0.0.1:8000/adminにアクセスすると。。

f:id:nikkie-ftnext:20180908205552p:plain

管理画面にログインできました^ ^

他に情報提供したこと

  • Docker関連でもう1件サポート: ポートの設定が食い違っていました
    • runでポート設定を8000:8000と指定
    • コンテナに接続してから0.0.0.0:8080でrunserver
  • k8sでデプロイされる方がいらっしゃったので、知っている情報を提供
    • 無事デプロイできたそうでおめでとうございます!

成果発表から

興味深かった情報を挙げていきます。

  • 男性OKのPyLadies Event PyLadies Tokyo - 4周年記念パーティ - connpass
    • 10/8の技術書典と重なるのですが、LTドリブンでなにかやりたかったので申し込んでみました
  • 年内いっぱい応募期間だそうで、力試ししてもいいかも Urban Data Challengeアーバンデータチャレンジ
  • どりらんさんのPyConトーク「Jupyterで広がるPythonの可能性」の頭出し。Jupyterのマジックコマンドすごかった
  • akiyokoさんの新刊応用編はすごくほしい内容でした。技術書典全体で見ると3冊程度Django本があるらしい?
  • 懇親タイムで OSS Gate | Doorkeeper 教えていただきました。ありがとうございます。駆け出しの身でも、コードでなくて翻訳でも、貢献できるそうなので、飛び込んでみよう!

感想

独学してきたDockerでお役に立てて嬉しく思います。
人に教えると自分の学びにもなるんですよね(データ永続化の理解が進みました!)。
一緒に考えるスタンスで、たまった知見を引き続き共有していきます。

今回「Pythonもくもく会でAzureでハマっている人」という通り名を得ました。
言い得て妙ですね。笑
まだまだハマる日々は続きそうですので、温かい目で見守っていただけると幸いです。

次回も予定されているそうで非常に楽しみです(akiyokoさんの新刊でもくもく予定です)。
皆さん、どうもありがとうございました!

脚注


  1. 月曜日から5営業日、勤務先のブログをVPSWordPressで構築していました。7日(金)の夜に設定漏れが見つかり、もくもくの時間の一部を使って対応させていただきました。。

  2. Dockerの公式ドキュメント Quickstart: Compose and Django | Docker DocumentationMySQL版とのことです。助かりました。ありがとうございます!

  3. ここはkaizumakiさんの疑問で調べたため、つまずかずに済みました(私は書いてあっても問題ないだろうと先走っていました)。ありがとうございました。

  4. docker exec -it <dbコンテナ> bashしてからrootユーザでmysqlに接続し、突き止めました

  5. docker-compose build dbで再ビルドしてもデータベースとユーザが作られず、同様のエラーでした

イベントレポート | Pythonもくもく自習室 #13 あやめの分類器をAPIに組み込み、Dockerイメージ作成 #rettypy

はじめに

いつも心は虹色に! nikkieです。
rettypyにお邪魔してstapyのDockerトーク準備を進めてきました。
9/12に話します:みんなのPython勉強会#38 - connpass

勉強会の概要

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

週末の昼下がりに、Pythonに関するやりたいことを各自持ち寄り、ゆるゆると「自習」を進めていく会です。
本を読む
PythonDjangoなどのチュートリアルをすすめる
コミュニティの作業や執筆etc...
他の参加者と情報交換をしたり学んだり
おいしいご飯と共に楽しむ(?)
など、Python使いおよびエンジニアライフのオアシス&知見を身につける「自習室」としてゆるくご活用いただければと思います。

今回はPyCon準備枠が設けられ、皆さま粛々と登壇準備されていました。
主催のshinyorkeさんがまとめてくださいました。

私はトークの題材を転換することにし、以下に取り組みました。

  • 機械学習のモデルを作る
  • モデルをFlaskでAPIにする
  • FlaskアプリケーションをDockerコンテナにする

トークの題材の転換

1週間前のトークの構成: DockerでのPythonの環境構築について
イベントレポート | 第31回 Pythonもくもく会 〜Dockerトーク準備〜 #mokupy - nikkie-ftnextの日記

  • docker run の使い方がメイン
  • メッセージ: 機械学習の環境とWeb開発の環境、どちらもDockerで省力化して構築できます

この1週間、stapy参加者で環境構築の話を聞きたい人っている?と自問を繰り返した1ところ、
あまりいないのではないかということに気づく。

  • 機械学習の環境: そもそも数モジュールならpipで入る。Anacondaで入れている人には魅力がなさそう
  • Webの環境: stapy参加者のメインは、エンジニアでないがPythonを始めた or 他の言語もやっているがPythonも始めた方(あくまで私の印象です)
    • Pythonをはじめる大きな理由は機械学習という印象。-> Webの話は興味をもたれづらいか。。

そこで、デプロイの面を語ることで立て直しを測る。

  • 機械学習: モデルをAPIにする際にデプロイが発生。ここでFlaskを使うことが多い
  • Web: デプロイというトピックには興味もっていただけそう

機械学習のモデルを作る

機械学習については入門レベルなので、本を参考に。
Python機械学習プログラミング2の3章でscikit-learnであやめの分類器を作るのをなぞりました。
python-machine-learning-book/ch03.ipynb at master · rasbt/python-machine-learning-book · GitHub

iris = datasets.load_iris()
# Petal(花びら)のlengthとwidthから品種を分類する
X = iris.data[:, [2, 3]]
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=0)
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)
ppn = Perceptron(max_iter=40, eta0=0.1, random_state=0, shuffle=True)
ppn.fit(X_train_std, y_train)
  • scikit-learnとnumpyの他にscipyを入れる必要があった(datasetsのimportで落ちて判明)
  • DeprecationWarningへの対応: from sklearn.model_selection import train_test_split
  • DeprecationWarningへの対応: Perceptronにはn_iterに代えてmax_iterとtolを使う3

モデルをFlaskでAPIにする

Flaskのアプリケーション側でロードするために、モデルとScalerを掃き出しておきます。4

from sklearn.externals import joblib
joblib.dump(ppn, 'ppn_iris.pkl')
joblib.dump(sc, 'sc_iris_petal.pkl')
  • 作ったモデルはPetal(花びら)のlengthとwidthから品種を分類
  • APIにはPetal(花びら)のlengthとwidthからなるJSONがPOSTされると想定

  • 受け取ったlengthとwidthはそれぞれStandardScalerで標準化する

  • 標準化した値を分類器に与える
  • 分類器の返した値をAPIの返り値とする
@app.route('/predict', methods=['POST'])
def predict():
    input_ = request.get_json()
    length = float(input_['length'])
    width = float(input_['width'])
    input_std = sc.transform(np.array([[length, width]]))
    prediction = ppn.predict(input_std)
    response = jsonify({'prediction': int(prediction[0])})
    response.status_code = 200
    return response

FlaskアプリケーションをDockerコンテナにする

過去にAzureで動かせたアプリケーションをベースに作成。
(今後デプロイして確認します→9/2 Azure WebAppsでは動かず、復旧及び原因調査中)
参考:chhantyal/flask-docker

FROM python:3.6
RUN apt update && apt install python-dev -y
COPY . /home
RUN cd /home && pip install -r requirements.txt
EXPOSE 5000
WORKDIR /home/app
ENTRYPOINT ["gunicorn", "-b", "0.0.0.0:5000", "--access-logfile", "-", "--error-logfile", "-"]
CMD ["app:app"]

残り時間はここまでをスライドに移植していました。

成果発表から

PyConが近く非常に濃い時間でした。触ってみたいものをピックアップ

  • NuxtUI:きれいに動いていて一目惚れ
  • TranscriptPythonJavascriptに変換。知っているPythonでフロントエンドがどの程度作れるのか触っておきたい
  • tsumiki:Jupyterのスライドでセルを横に並べる配置を可能に!GitPitchから乗り換えるまでありますね

終わりに

成果発表の時間が濃くてめちゃくちゃモチベーション上がりました。
Dockerトーク、用語の説明が課題ですが、ご指摘いただいた観点を取り込みつつ、
自分の理解を言葉にして説明してみようと思います。

参加者の皆さま、1日ありがとうございました。お疲れ様でした。
PyConで発表聞きに行くの楽しみです。


  1. 勤務先でペルソナを考えるようになった影響だと思います

  2. ちょうど手元にあった旧版を参照しました。増補した第2版が発売しています

  3. tolは設定しなくても本と同じ結果になりました。時間があれば今後調べます。

  4. 参考:A Flask API for serving scikit-learn models

イベントレポート | 第31回 Pythonもくもく会 〜Dockerトーク準備〜 #mokupy

はじめに

いつも心は虹色に! nikkieです。
8/25はmokupyにお邪魔して登壇準備を進めてきました。

勉強会の概要

第31回 Pythonもくもく会 - connpass

主にPythonに関するやりたいことを各自持って来て、進めていく感じのゆるい会です。 もくもく開発をして情報共有したり、交流を深めることができればと思っています。 是非お気軽にご参加ください。(Python初心者の方でも大歓迎です!)

ゆるさが持ち味のもくもく会です。

取り組んだこと:Dockerトーク準備

10分枠の登壇の機会をいただいたので、Pythonista向けにDockerを使い出す話をします。
みんなのPython勉強会#38 - connpass
Dockerを独学したところ、環境構築の大変さがだいぶ和らぐという印象です。
PythonはWeb開発も機械学習もできますが、分野をまたぐときに環境構築が発生します。
ここをDockerで省力化できますよと共有する予定です。

複数のPython環境を用意する

docker runで簡単にできます。

$ docker run -i -t --rm python:3.6 bash
root@d12b897d5783:/# python -V
Python 3.6.6
root@d12b897d5783:/# exit
$ docker run -i -t --rm python:3.7 bash
Unable to find image 'python:3.7' locally
3.7: Pulling from library/python
 :
Status: Downloaded newer image for python:3.7
root@d62346cb3a11:/# python -V
Python 3.7.0
root@d62346cb3a11:/# exit
$

docker run -vでフォルダを共有する

version.py

from platform import python_version


if __name__ == '__main__':
    print(python_version())

※前提: カレントディレクトリからは./first/version.pyという配置です。

$ docker run -i -t -v "$(pwd)"/first:/home --rm python:3.6 bash
root@fc43deb1393b:/# cd home/
root@fc43deb1393b:/home# ls -l
total 4
-rw-r--r-- 1 root root 91 Aug 25 02:40 version.py
root@fc43deb1393b:/home# python version.py 
3.6.6
root@fc43deb1393b:/home# exit
$ docker run -i -t -v "$(pwd)"/first:/home --rm python:3.7 bash
root@9e518e76f970:/# cd home/
root@9e518e76f970:/home# ls -l
total 4
-rw-r--r-- 1 root root 93 Aug 25 02:42 version.py
root@9e518e76f970:/home# python version.py 
3.7.0
root@9e518e76f970:/home# exit
$

"$(pwd)"の仕組み


成果発表の時間で発表させていただき、気づいたのは2点。

  • Dockerの説明、必要なところだけにしたつもりでも時間全然足りない。もっとやること絞らないと
  • 先日のk8sハンズオンを参考に、テンプレートとなるdocker runコマンドを用意して数パターン実行というのはどうだろう

読書会に向けて帰り道にpypro読んでの気づき

  • 仮想環境にもよさはある。Dockerはデプロイ簡単にしてくれるのと、複雑な環境構築を簡略化してくれる役割で使うのがよさそう(仮想環境の代わりにDockerで統一というのはやりすぎと認識。銀の弾丸などないということですね)

成果発表から

だいぶ盛り上がりました。

終わりに

想いを寄せているDockerの良さを伝えられるよう、引き続き準備して臨もうと思います。
参加者の皆さま、1日ありがとうございました。お疲れ様でした。

LT報告 | 私が仕事についてアイマスから学んだこと @ITエンジニアのための”アニメ”から学びを得る勉強会 #aniben

はじめに

いつも心は虹色に! nikkieです。
あにべん!で アニメ × 仕事 でLTしてきました。
LTに盛り込めなかったことを追加し、ブログで報告します。
(今回はアニメの話がメインです。仕事に絡めて話します)

勉強会の概要

[増枠] ITエンジニアのための”アニメ”から学びを得る勉強会 | あにべん! - connpass

アニメを通じて仕事を楽しくしていくために、
ITエンジニアがアニメから得た学びを共有する勉強会です。

アニメから得た学びのLT大会を行います。
ひとりあたりの制限時間は5分または10分です。

大のアニメ好きなのですが、アニメについて話す機会はあまりないので、LTに手を上げました。

LT: 何かを決めるということ

アイマスから得た学びをLTしました。1

  • 開発の仕事をしていく中で、駆け出しの身でも決めなければならないことがあり、不安を感じる
  • アイマス 天海春香もしかしたら、もっといい方法があるのかもだけど でも、私は天海春香だから。
  • 経験豊富なエンジニアから見たらもっといい方法はきっとあるが、自分が最善と思った答えを信じて先に進もうと考えを変えられた
  • 自分の答えは暫定的なものにすぎないので、勉強してもっといい答えを出せるようにすることを心がけている2

強者と言われるエンジニアもはじめは自分と同じだったはずで、
駆け出しの身で結論を出すことに引け目を感じる必要はない、
間違えてもいいからまず自分の結論を出そうと考えられるようになりました。3

私の考えを変えた春香の言葉は以下で聞けます。(1分15秒くらいから8秒程度)


「THE IDOLM@STER MOVIE」本予告

補足1: 「どんな仕事だって代わりはいても、結果はその人にしか出せないことがある」

サクラクエスト』(2017)4の5話より。

Iターンしてきたデザイナーが「どんな仕事にも代わりはいる」とこぼすのですが、
それに対して主人公(国王)の木春由乃が言った言葉がこちらです。

春香の言葉と結びつくなあと非常に感銘を受けました。
天海春香だから」と言って出した結論、それを進めて手にした結果は春香にしか出せない結果だと思います。
同じように、駆け出しの自分にとって最善だからと出した結論は、 その時点の自分にしか出せない結果をもたらすと思えました。

補足2: 自分の考えを信じて失敗したらどうするのか?

誰しも考えると思います。自分の考えを信じたことを後悔するんじゃないかと不安もあります。
そちらに対して指針となる言葉もアニメの中にありました。

一度後悔したことは、二度と繰り返さないようにすればいいんじゃないかな
それが後悔した意味なんだと思う

多田くんは恋をしない』(2018)5の8話より。

過去に戻ってやり直したいと後悔を伝えるヒロインに 「過去には戻れないからな」と言って主人公 多田光良は上の言葉を続けます。
この言葉にならって、失敗の原因を振り返り、繰り返さないようにしようと考えています。
(例えば、知識がなくて結論がまずかったなら、手を動かして知識を深め、もっといい結論を出せるようにします)

エンジニアって後悔を繰り返さないってことに関してはプラクティスを持っていますよね。
KPTで振り返ったり、再発防止策考えて実行したり。
失敗を恐れず、結果は受け入れ、軌道修正すればいいと私は考えています。

終わりに

アニメとなるとついついいろいろ話したくなってしまって5分に収めるのが大変でした。6
感想や自分はこう思うなど、お気軽にコメントやTwitterにいただければと思います。
(そういったところから見方が深まるのもアニメを語る面白さだと思います)
LTの機会や他のエンジニアのアニメガタリを聞く機会をいただき、どうもありがとうございました!

なお、週末にGitPitch触ったのはこのLTのためです。
週末ログ | マークダウンでスライドが作れる!GitPitchを触る - nikkie-ftnextの日記


  1. スライド中ちょこちょこネタを入れています^ ^(タイトルやまとめ、文字の色など)

  2. これを続けた結果、技術の勉強にハマり、アウトプットの抵抗もなくなりました。

  3. 自分の考えをもってから相談するというのは前職の中小規模の受託開発の会社で叩き込まれました。手取り足取り教える人員の余裕はなく、駆け出しの自分の結論がチームとしてお客様に提案されることもありました。お客様はプロとして見てくるので、駆け出しの自分のこの結論でいいのか?と不安でした

  4. P.A.WORKSによるオリジナル作品、お仕事シリーズ第3弾。国王と4人の大臣が地方の町おこしに取り組みます。 サクラクエスト - Wikipedia 毎回題材がすごくリアルで引き込まれました(過疎でバス廃止など)。このブログに登場する「だんないよ」はクラクエの影響です(富山の方言で「大丈夫」「問題ないよ」という意味だそうです)

  5. 月刊少女野崎くん』のスタッフが集結したオリジナル作品で、『ローマの休日』を現代にアレンジした恋愛ものです。多田くんは恋をしない - Wikipedia 個人的には今年ベスト。このブログに登場する「いつも心は虹色に!」や「かたじけない」は多田恋の影響です

  6. 話したいことが多くなりすぎて、このブログ記事が生まれました!

週末ログ | マークダウンでスライドが作れる!GitPitchを触る

はじめに

いつも心は虹色に! nikkieです。
8/20の週にLTが控えているので、週末はGitPitchでスライドを作っていました。
わかったことを備忘録として残します。

GitPitchとは

マークダウンでスライドが作れるサービスです。
GitHubなどのリポジトリにPITCHME.mdというファイルを置き、
ユーザ名やリポジトリ名をURIに含めてGitPitchにブラウザでアクセスします。
すると、PITCHME.mdをもとにスライドがレンダリングされます。
reveal.jsなるものを使っているそうです。

以下の記事でイメージが掴めます。

久しぶりにWikiを見に行ったところ、体裁の整ったDocumentが用意されていました。
GitPitch Documentation :: GitPitch Docs

LTするときはほとんどGitPitchなのですが、
これまでレイアウトは工夫せずに済ませて来ました。
CSSを勉強しているので、今回は積極的にスタイルを試してみました。

お品書き

  • 画像をいい感じに扱う
  • アイコンの扱い
  • その他Tips

画像をいい感じに扱う

これまでに知っていたこと

  • ![altテキスト](ルートからのパス)でインラインに埋め込める
  • ページの区切り記号に続けて+++image=<ルートからのパス>とすることで背景に埋め込める

今回知ったこと: Snap レイアウト

サンプルコード1@ulについては2へ)

@snap[north]
<h4>Present Step-by-Step</h4>
@snapend

@snap[west]

@ul
- There are
- Many reasons
- To @fa[heart]
- [GitPitch](https://gitpitch.com)
- Presentations
@ulend

@snapend

@snap[east]

![](assets/images/daftpunkocat.gif)

@snapend

snapレイアウトを使うと、
画像を左側、説明を右側に配置するスライドが実現できるようです。
snapレイアウトが自在に組めれば、
パワポやキーノートから卒業できる気がします。

アイコンの扱い

@fa[icon-name]というシンタックスでFont Awesomeのアイコンが埋め込めます。
Font Awesome Icons :: GitPitch Docs

先のサンプルコード中に色も変えつつアイコンを使っていた例があり、
参考になりました。
@color[black](@fa[git fa-4x])
これまではspanタグでクラス指定して色をつけていました。

その他Tips

宿題事項

  • classを設定したspanを使って、一部のa要素のfont-familyを変えようとしたが、上書きできなかった
    • うまくいかなかった例:.serif-font { font-family: serif; } <span class="serif-font">[a要素タイトル](a要素リンク)</span>
    • CSSの優先度の問題?
    • フォント変更は1箇所だけなので、spanのstyle属性で直接指定して一旦解決

デスクトップツール

できたそうです。
GitPitch Desktop Markdown → Preview → Present

現在のスライド作成フローは実験失敗コミットができがちです。

  1. ローカルで編集(ドキュメントを見て試す)
  2. リモートリポジトリにプッシュ
  3. ブラウザでリロードして体裁確認(期待通り動かないときは1に戻る)

コミットが大量にできる問題は、デスクトップツールで今後解消しそうです。

終わりに

ドキュメントも整ってきたGitPitch、個人的にはバンバン使っていきたいです。
CSSに慣れていない分、時間はかかっているのですが、
パワポやキーノートよりは時短できていると思います。

snapレイアウトなど突っ込んだ情報は日本語では出てこないようなので、
そこが普及のネックなのかなと感じています。
興味持たれた方は使ってみてはいかがでしょうか?
Happy GitPitch life!


  1. https://raw.githubusercontent.com/gitpitch/gitpitch/d94c994fc99653d6802aadd2365dec426e134845/PITCHME.md

  2. @ulというショートカットができていました。https://gitpitch.com/docs/markdown-features/fragments

  3. 最近CSSの勉強をしているのですが、サルワカさんの記事は図が多く、基礎から説明してくださるので、わかりやすくおすすめです。

週末ログ | Django Girls Tutorial翻訳レビュー 100%到達!

はじめに

いつも心は虹色に! nikkieです。
最近は暑さが厳しくなく過ごしやすいですね。
この週末で翻訳レビューが100%に達しました!

Django Girls Tutorial翻訳レビュー

Django2.0.x系対応日本語版の Djangoフォーム · Django Girls Tutorial (残していた箇所)をレビューしました。

前回のレビュー:イベントレポート | (第91回)Python mini Hack-a-thon ~Django Girls Tutorial翻訳レビュー~ #pyhack - nikkie-ftnextの日記

PythonAnywhereではこんな感じです。 f:id:nikkie-ftnext:20180819222021p:plain

Djangoフォーム

機能追加はお決まりの以下を進めます。

  • 新規ページへ遷移するリンクを追加
  • 新規ページのURL設定
  • 新規ページのビュー作成
  • 新規ページのテンプレート作成

チュートリアルではPostモデルしか登場しませんが、機能によっては新規モデル作成も必要ですね。

Bootstrap3のGlyphiconを使ってアイコン追加
(4系ではどうするんだろう? font awesome?)
Bootstrap Glyphicon Components
+ボタンで遷移する新規ポスト作成画面
f:id:nikkie-ftnext:20180819222113p:plain

編集ボタンを導入
f:id:nikkie-ftnext:20180819222224p:plain
編集可能に
f:id:nikkie-ftnext:20180819222253p:plain

adminにログインしていない場合、追加ボタンや編集ボタンは表示しない
(Extension Tutorialに根本対応があるそうです) f:id:nikkie-ftnext:20180819222412p:plain
f:id:nikkie-ftnext:20180819222424p:plain

PythonAnywhereコマンド覚書

  • ソースコードの配置されたディレクトリに移動(Bashを立ち上げた後に必要。git pullの前に使う):cd ~/$USER.pythonanywhere.com
  • 仮想環境の有効化(カレントディレクトリによらずに実行できそう。collectstaticの前に使う):workon $USER.pythonanywhere.com

残った箇所の対応

フォームのレビューを終えたら99%だったので、えいやっと残りもやってしまいました。

終わりに

私の貢献は1割程度ですが、少しずつ力を合わせた末に、翻訳・レビューともに100%に達しました。
やり遂げました!感無量です。
現在最新の訳の反映をお願いしています。
手を動かしたことでPythonAnywhereなどのノウハウも溜まってきたので、次はチュートリアル自体を手伝えたらと考えています。

チュートリアルを手がかりに、Djangoドキュメントを参照して深掘りというのも面白そうです。
それではまた1週間気合い入れていきましょう!