React + Go + MongoDBの環境をDocker Composeで作成した

現在、勉強がてら個人開発をしていて、せっかくの個人開発なので、今までさわったことがないReact, Go, MongoDBでwebアプリを作ります。 その最初の段階として、Docker Composeを使って環境構築を進めます。 Reactの環境構築 今回の開発では、プロジェクト配下をこんな感じにしています。 プロジェクト ├── backend ├── frontend Reactはfrontend配下に構築します。 Dockerfileの作成 DockerfileにDocker上で起動させるコンテナの構成情報を書きます。 frontend配下に以下内容で作成します。 FROM node:13.12.0-alpine3.10 WORKDIR /usr/src/app 1行目にはコンテナのDockerイメージ、2行目にはコンテナ内の作業ディレクトリを記載しています。 alpineはAlpine Linuxのことで、必要最低限の構成がされているおかげで、Dockerイメージの軽量化を図ることができます。 docker-compose.ymlの作成 docker-compose.ymlで複数のコンテナをまとめて起動することができます。拡張子は「.yml」「.yaml」どちらでも動きます。 どっちかに統一してくれればいいのに。 プロジェクト配下に以下内容で作成します。 version: '3' services: node: build: context: ./frontend dockerfile: Dockerfile volumes: - ./frontend:/usr/src/app command: sh -c "yarn start" ports: - "3000:3000" volumesではコンテナ内のusr/src/appをfrontendに永続化させます。 portsでは外部の3000ポートとコンテナ内の3000ポートをつなげています。ローカル環境ではlocalhost:3000でアクセスができるようになります。 Dockerイメージのビルド docker-compose.ymlのある階層で以下コマンドを叩きます。 docker-compose build Building node Step 1/2 : FROM node:13.12.0-alpine3.10 ---> b529a862f234 Step 2/2 : WORKDIR /usr/src/app ---> Using cache ---> b753b92fbf97 Successfully built b753b92fbf97 Successfully tagged プロジェクト名_node:latest 上記のような表示がされ、ビルドすることができます。...

April 11, 2020 · 3 min · 522 words · Yu

PythonでPoetryを使ってみた

先日、僕が入会しているオンラインサロンのメンバーの方に、「PipenvよりもPoetryの方がいい!」といったことをお聞きして、Poetryを知らなかったので調べて使ってみました。日本語に翻訳してくれている公式ドキュメントにそって進めていきます。 Poetryとは PEP 518で提案されたpyproject.tomlによるパッケージ管理を導入したツールです。 pyproject.tomlでrequirements.txt、setup.py、setup.cfg、MANIFEST.inを置き換えることができます。Pipenvはrequirements.txtの置き換えしかできないので、いろんなファイルを置き換えることができて良いですね。また、Pipenvで使用するPipfileは独自規格で今後継続的に採用されるか不明なので、PipenvよりPoetryを使う方が良さそうです。 Poetryインストール MacやLinuxでは以下コマンドでインストールします。 curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python $HOME/.poetry/binにインストールされます。 Poetryを更新したいときは、以下コマンドを実行します。 poetry self update Bash, Fish, Zshでの補完の有効化 僕はシェルにFishを使っていて、補完をサポートしてくるのでありがたいです。 公式ドキュメントには自分のシェルに合った次のコマンドどれかを使えばいいそうです。 # Bash poetry completions bash > /etc/bash_completion.d/poetry.bash-completion # Bash (macOS/Homebrew) poetry completions bash > $(brew --prefix)/etc/bash_completion.d/poetry.bash-completion # Fish poetry completions fish > ~/.config/fish/completions/poetry.fish # Zsh poetry completions zsh > ~/.zfunc/_poetry # Oh-My-Zsh mkdir $ZSH/plugins/poetry poetry completions zsh > $ZSH/plugins/poetry/_poetry 変更を効かせるために、シェルの再起動をしましょう。 プロジェクトのセットアップ Poetryを試すためのプロジェクトを作成します。 次のコマンドで作成できます。poetry-demoと名付けています。 poetry new poetry-demo するとpoetry-demoディレクトリが作成されます。...

April 5, 2020 · 2 min · 409 words · Yu

PythonでPipenvを使ってみた

Pipenvを使うと、個人開発の時だけではなく、複数人で開発する際にもパッケージ管理が楽になります。Pythonで作業環境を整えるのが非常に簡単になります。 公式によると Pipenvは、手動でパッケージのインストールおよびアンインストールを行うのと同じように Pipfile に対してパッケージの追加および削除を行うのに加え、自動でプロジェクト用の仮想環境を作成し管理します。 またPipenvは、いかなるときも重要な Pipfile.lock を生成し、これを利用しビルドが常に同じ結果になるようにします。 Pipenvは主にアプリケーションのユーザーと開発者に、簡単に作業環境を作れる方法を提供するためのツールです。 とのことです。 Pipenvインストール 僕はMacを使っているので、Homebrewでインストールします。 brew install pipenv プロジェクト作成&パッケージのインストール Pipenvを試すためのプロジェクトを作成します。 今回はpipenv-testディレクトリをホームディレクトリに作成して、その配下にPythonの静的解析ができるflake8をインストールをします。 mkdir pipenv-test cd pipenv-test pipenv install flake8 インストールをするとターミナルに以下のような表示がされます。 Creating a virtualenv for this project… Pipfile: /Users/ユーザーネーム/pipenv-test/Pipfile Using /usr/local/Cellar/pipenv/2018.11.26_4/libexec/bin/python3.8 (3.8.2) to create virtualenv… ⠋ Creating virtual environment...created virtual environment CPython3.8.2.final.0-64 in 719ms creator CPython3Posix(dest=/Users/ユーザーネーム/.local/share/virtualenvs/pipenv-test-x1ZFqoq_, clear=False, global=False) seeder FromAppData(download=False, pip=latest, setuptools=latest, wheel=latest, via=copy, app_data_dir=/Users/ユーザーネーム/Library/Application Support/virtualenv/seed-app-data/v1) activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator ✔ Successfully created virtual environment! Virtualenv location: /Users/ユーザーネーム/....

April 3, 2020 · 2 min · 315 words · Yu

Pythonコードを静的解析した

今回はflake8, autopep8を使って、Pythonコードを静的解析します。 静的解析とは コードを実行せずに行う解析です。コーディングルールチェックや、制御フローの解析、コードの複雑度の分析をすることでソースコードにある問題点を発見してくれます。 flake8とは pep8のチェック、pyflakesのチェック、及び循環的複雑度をチェックできるラッパーのことです。導入をすることで普段から綺麗なコーディングができます。 autopep8とは pep8のスタイルガイドに適用するように、自動的にPythonコードをフォーマットしてくれます。 flake8, autopep8インストール さっそくインストールしていきましょう。 以下コマンドでflake8をインストールできます。 pip install flake8 次にautopep8をインストールします。 pip install autopep8 とても簡単ですね。 使い方 flake8 flake8 <対象ファイルへのパス> このコマンドで対象ファイルを静的解析することができ、結果をターミナルに表示してくれます。 autopep8 autopep8 --in-place --aggressive --aggressive <filename> 公式ドキュメントにはこのように実行することを推奨しています。 --in--placeをつけることでファイルを更新してくれます。これがないとコードを自動的にフォーマットして、更新してくれません。 --aggressiveをつけることでコード整形のレベルを指定でき、2つつけることでレベル2になり修正対象のエラーが増えるそうです。 このコマンドで対象ファイルを静的解析することができ、結果をターミナルに表示してくれます。 試してみる test.pyを任意のディレクトリに作成します。 内容はこんな感じにしてみました。 def example(num_a,num_b,num_c,num_d,num_e,num_f,num_g,num_h): print(num_a+num_b+num_c+num_d+num_e+num_f+num_g+num_h) num_a,num_b,num_c,num_d,num_e,num_f,num_g,num_h = 1, 2, 3, 4, 5, 6, 7, 8 example( num_a, num_b, num_c, num_d,num_e, num_f, num_g, num_h ) 適切な改行や空白をいれることができていないし、文字列がとても長くなってしまっています。まずはflake8で静的解析をします。 test.py:1:18: E231 missing whitespace after ',' test.py:1:24: E231 missing whitespace after ',' test....

April 1, 2020 · 2 min · 246 words · Yu

AtCoder Beginner Contest 160の振り返り

今回で3回目のコンテスト参加となりました。前回が2月22日(土)だったので1ヶ月ぶりでした。この1ヶ月、AtCoderの問題に取り組んでいなかったので、散々な結果となりました。。(日頃からコツコツとやらないとダメですね。) 今回の結果はC問題が解けずに終わってしまい、悔しかったです。今後、類似問題が出てきても解けるように振り返りをします。 今回の僕の結果はこちらから。(弱弱なので、お恥ずかしい。笑) A - Coffee 問題文 ある長さ6の英小文字からなる文字列がcoffeeに似ているとは、3文字目と4文字目が等しく、5文字目と6文字目も等しいことを言います。与えられる文字列Sがcoffeeに似ているか判定してください。 制約 Sは長さ6の英小文字からなる文字列である。 解説 この問題は長さ6の文字列が3文字目 = 4文字目、5文字目 = 6文字目の時にYes、違う時にNoを表示すればOKです。 回答 N = input() if(N[2] == N[3] and N[4] == N[5]): print("Yes") else: print("No") B - Golden Coins 問題文 高橋君は金色の硬貨が好きです。自分が持っている500円硬貨1枚につき1000、5円硬貨1枚につき5の嬉しさを得ます。高橋君はX円を持っています。これを高橋君の嬉しさが最大になるように両替したとき、高橋君の嬉しさはいくらになりますか? (なお、利用できる硬貨は500円玉、100円玉、50円玉、10円玉、5円玉、1円玉の6種類とします。) 制約 0≤X≤10^9 Xは整数 解説 高橋君が持っているX円が500円何枚分(Y枚)あるのかを求めてから、X=X-500*Y円をして、同様にX円が5円何枚分(Z枚)あるか求めます。 その後、Y*1000+Z*5を表示すればOKです。 回答 math.floorを使うことで小数点以下を切り捨てしています。 import math X = int(input()) total_500 = 0 total_5 = 0 total_count = 0 if(X >= 500): total_500 = math.floor(X/500) total_count += total_500 * 1000 X -= total_500 * 500 if(X >= 5): total_5 = math....

March 29, 2020 · 1 min · 145 words · Yu