ikura1's log

備忘録

競プロ入門の社内勉強会やってみた

はじめに

社内で競プロを2人でやっているのですが、もっと仲間を増やしたいということで勉強会を行いました。

準備したこと

  • 目的設定
  • 流れ・内容を決める
  • 資料集め・調査
  • スライド作成
  • バーチャルコンテスト
    • バーチャルコンテストの仕様確認
    • 問題選定
  • 社内への告知
  • 場所の確認
    • テーブル・席の配置
    • プロジェクターの確認

目的 アルゴリズムの勉強会を社内でしたいという話が出たので、いきなりアルゴリズムの話をしても身にならないと思い、まずは競プロ仲間を増やそうと入門を開こうとしました。ターゲットとしては名前は知っているがやったことのない人をメインにすえて、まずは競プロをやってみてどんなものかわかってもらおうということ目的にしました。

流れ

  • 目的の説明
  • 競プロの説明
  • 基本的な操作の説明
  • バーチャルコンテスト
  • 問題の解説
  • ABCの宣伝

他の入門資料を参考に上記の流れでやりました。ほぼ参考そのままなのでこれ自体はぶれませんでした。

資料集め 参考にする情報でスライドや記事を探しました。みんなしっかり書いていてすごい参考になりました。 cocodrips.hateblo.jp 競技プログライングのススメ

www.slideshare.net

スライド作成 まずは流れに沿ってDropbox paperでざっくりこんなこと話す予定で型を作りました。型を作ってテストというなの練習をしてまた修正を加えるといった形です。ある程度喋れる状態になってから、今回はGoogleスライドで作りました。スライドを話すページ分作成してページの題目だけ書いて、その後な内容を書きました。1番時間がかかったのは基本操作のスクリーンショットです。

バーチャルコンテスト 競争を楽しいと思う人種なので、勉強会やろうという話し合いで初めて知ったんですが、組み込みました。どう使えばいいのか、どういう仕様なのかわからなかったので確認しました。システムの仕様は公式から解答を取得して仮想的にコンテスト開いてると認識しました。システムを二つ行き来するので若干不安がありました。

社内への告知 告知を行わないと誰を来てくれないとつらいので、参加してくれそうな2人に先に声をかけました。そのあと開発全体に告知しました。、5日前と前日朝、直前に社内のグループチャットに行いました。根回しすることで不安感が少し薄れて良かったです。

場所 人数によっては会議室を切り替えるようにするか初めは考えていました。参加しやすいように、参加しなくても雰囲気がわかるように目がつきやすいところにするか考えましたが、外部の影響を考慮したくないという判断でオープンな場所ではなく会議室で開催するよう決定しました。あとはプロジェクターのプロジェクターを使うのが初めてだった

スライド

speakerdeck.com

反応はどうだったか

上々でした!やっぱり名前だけ聞いているのとやってみるのとは全然違うので、それは非常に良かったと思います。操作で詰る所が多々あったのと、フロントエンドを触る人が多くjavascriptでの競プロだったので、言語的に難しいのもありました。でも、1人の時に詰ると投げ出してしまうかもしれませんが、みんなでやっており、すぐ助けることができたので良かったと考えています。

反省点

  • 問題の難易度が高かったかも
    • 4問用意していただいていた
    • 30分で2問目のところまでだった
  • 問題ではなくバーチャルコンテストやAtCoderの操作で詰っていた
    • 問題ではない所で詰るのはよくない
    • よくないのですが、1人のときじゃなくて良かったような気がします
  • バーチャルコンテストやるべきではなかった
    • ややこしかった
    • 2回会員登録
    • AtCoderとVirtualContestの行き来
      • どっちにいるかわからんくなってた
    • 複数コンテストから問題を持ってくると
      • そのままB問題を始めてしまうパターンがあった
    • 詰り所を増やしてしまった
    • 競い合うより解くのが楽しい・勉強になるにフォーカスするべきだった
      • 競い合うは次の段階だった
  • 操作説明用に問題を準備するべきだった
    • 説明が理解されていなかった
    • 操作が伴わないとわからない
    • もしくは説明が悪い
  • 貸しPCのキーボードがUS配列になってた
    • こまられた
    • AtCoder以外の所で詰られるのは非常に良くない

次回どうするか

未定です。勉強会のアンケートを簡易にでも取っていないため、このあとのアルゴリズムやバーチャルコンテストに需要があるかが不明なためです。アカウントからABCに参加したかどうかは把握できるので、それをメトリクスとして動いても良いのですが、今はいったん様子見といった形になります。

アジャイルとの出会いの話

はじめに

なんとなくお風呂に入っていて、アジャイルとの出会いの話を前大学のDiscordに書いたのを思い出して、ブログにも書いておこうかなっと思った次第です。これを書くきっかけになったのは、omoiyari.fmの第0回です。

lean-agile.fm

アジャイルとの出会い

アジャイルとの出会いは、大学のOBの方々が行っている講座のコミュニケーション講座の枠でチーム開発について教えていただいたのが、アジャイルとのきっかけになります。出会いとしては講座で、そのあとも様々なことで背中を押していただいた行動(転職)のきっかけになりました。出会い背中を押していただいて、最後に後押ししたのは、Podcastでした。転職でチームのことが自分ごとになっている状態で、Podcastで楽しく考えがんばっていることが話から伝わってきて、それが羨ましく、自分もそうなりたくなりました。
それが僕とアジャイルとの出会いと目覚めの話ですね。

---完---

Django環境の切り替えメモ

[Django]設定ファイルの切り替え

はじめに

Djangoの設定でセキュリティ設定をした場合、開発環境が楽しくない形になるので分けたい。
元々cookiecutter-djangoリポジトリを参考にしていたので、設定ファイルの切り替えを行いたかった。
だけど、Djangoでサイトを作ることを優先したので後回しにしていた。
セキュリティの設定で行う必要が出てきたので、やっていきます。

django-environ

django-environは環境変数の指定が気持ちよくなります。

インストール

pipenv install django-eviron

概要

django-environがないときー

import os

DEBUG = os.environ["DJANGO_DEBUG"]

DATABASES = {
    "default": {
        "ENGINE": os.environ["POSTGRES_ENGINE"],
        "NAME": os.environ["POSTGRES_NAME"],
        "USER": os.environ["POSTGRES_USER"],
        "PASSWORD": os.environ["POSTGRES_PASSWORD"],
        "HOST": os.environ["POSTGRES_HOST"],
        "PORT": os.environ["POSTGRES_PORT"],
    }
}

あるときー!

import environ

DEBUG = env.bool("DJANGO_DEBUG", default=False)

DATABASES = {"default": env.db("DATABASE_URL")}

はい、スマートになりましたね。
最高です。

詰った点

困ったのは、GAEを使っているんですが、CloudSQLの参照設定に詰りました。
ローカルの設定は下記になるんですが、ColudSQLの場合はunix_socketにインスタンス名を指定することを知らずに設定が反映されねえ!!
って悩んでいました。

CloudSQLはhostではなく、unix_socketにインスタンスを設定するんですね。

  • ローカルでの設定
f"mysql://{USER}:{PASSWORD}@{HOST}:{PORT}/{DBNAME}"
"mysql://hoge:hogehoge@127.0.0.1:3306/hoge_db"
  • CloudSQLでの設定
f"mysql://{USER}:{PASSWORD}@/{DB_NAME}?unix_socket=/cloudsql/{INSTANCE_CONNECTION_NAME}"
"mysql://hoge:hogehoge@/hoge_db?unix_socket=/cloudsql/todo:asia-northeast2:todo-db"

環境の分離

フォルダ構成

フォルダ構成をcookiecutterを参考に下記にした。

$ tree ./config/ -I '__pycache__'
./config/
├── __init__.py
├── settings
│   ├── __init__.py
│   ├── base.py
│   ├── local.py
│   └── production.py
├── urls.py
└── wsgi.py

1 directory, 7 files

cookiecutterはローカルと本番以外に、test環境用の設定が存在する。
テストコードがまだ書けていないので、今回は保留して後日追加します。

開発と本番での設定分離

開発環境で設定すると閲覧できなくなるセキュリティ回りやDBの参照回りを本番のみの設定として、他はbaseで共有するという形です。
設定でわからない部分がありますが、cookiecutter-djangoでは設定項目の上にドキュメントのurlが書いてあるので非常に助かる。
作成は参考にしつつ、コピペしつつ、書きつつといった感じです。

↓は添付用にざっくり削ってます。
開発

# local.py
from .base import *
from .base import env

# GENERAL
# ------------------------------------------------------------------------------
# https://docs.djangoproject.com/en/dev/ref/settings/#debug
DEBUG = True
# https://docs.djangoproject.com/en/dev/ref/settings/#secret-key
# localと本番で同じDBを使っているため今はenvを参照している
# TODO: 設定回りの調整が終わり次第, DBを分離させる
SECRET_KEY = env(
    "DJANGO_SECRET_KEY",
    default="ObpY86bMfPs0X5HfluLGFslLDFnHdLQ2sjR8QX17xivRR0XRPFK7fMU0uqWE10nK",
)

ALLOWED_HOSTS = ["localhost", "0.0.0.0", "127.0.0.1"]

本番

# production.py
from .base import *
from .base import env

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = env("DJANGO_SECRET_KEY")

ALLOWED_HOSTS = ["timetask.appspot.com"]

# ADMIN
# ------------------------------------------------------------------------------
ADMIN_URL = env("DJANGO_ADMIN_URL")

# SECURITY
# ------------------------------------------------------------------------------
# HSTS
# SECURE_HSTS_SECONDS = 518400
# https://docs.djangoproject.com/en/dev/topics/security/#ssl-https
# https://docs.djangoproject.com/en/dev/ref/settings/#secure-hsts-seconds
# TODO: set this to 60 seconds first and then to 518400 once you prove the former works
SECURE_HSTS_SECONDS = 60
SECURE_HSTS_INCLUDE = True
# https://docs.djangoproject.com/en/dev/ref/settings/#secure-hsts-include-subdomains
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
# https://docs.djangoproject.com/en/dev/ref/settings/#secure-hsts-preload
SECURE_HSTS_PRELOAD = True

参照の切り替え

参照元をsettings.pyのところをsettings.localとsettings.productionに切り替えました。

  • Before
# wsgi.py
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
# manage.py
def main():
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
  • After
# wsgi.py
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production")
# manage.py
def main():
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local")

次にやること

  • セキュリティ項目でわからんことのドキュメント読む
  • テスト書く
  • ファイルアップロード回りの実装
    • アカウントアイコンにする

参考サイト

https://github.com/audreyr/cookiecutter

https://github.com/pydanny/cookiecutter-django

https://qiita.com/moonwalkerpoday/items/9da47dda80d3ddac9a62