Visual Studio Code 拡張機能 (Indent-Rainbow)

VSCodeにインストールした拡張機能でいいなーと思ったやつの紹介です。

Twitterでおすすめしている人がいたので、私もインストールして良かった!

画面イメージ

テキストファイル

Indent-Rainbowのデフォルトでは、テキストファイルは対象外となっている。これは、settings.jsonを編集することでテキストファイルも対象にすることができる。

説明に従ってsettings.jsonを編集

公式サイト

indent-rainbow - Visual Studio Marketplace

終わりに

きもーちインデントの区別がつきやすくなったと思う。

Visual Studio Code で Python の unittest が動かなくなった件について

VSCodeのバージョンを上げたら、unittestが動かなくなって焦った件です。

原因

Python extension のバージョンに問題があるっぽい

解決策

Python extension のバージョンを変更する(上げる/下げる)

NG -> v2020.12.424452561
OK -> v2020.8.109390
※2021年1月5日時点

事象

  • アクティビティバーに「テスト」が表示されない
  • VSCodeのコマンドパレットで「Python: Run All Tests」を実行したところ、下記のエラーメッセージが表示される
コマンド 'Python: すべての単体テストを実行' でエラー (command 'python.runtests' not found) が発生しました

終わりに

そのうち修正版がリリースされると思うが、早めに直してほしいものです。

参考サイト

https://www.blog.umentu.work/vs-codeのpythonプラグインの最新版でcomannd-not-foundが発生する模様/

https://github.com/Microsoft/vscode-python/issues/3591

https://stackoverflow.com/questions/46944549/visual-studio-code-command-python-runtests-not-found-what-is-this

Docker : Redmineを構築する

Docker で Redmine を構築したいと思う。

環境

  • CentOS 7.7
  • Docker 19.03.6
  • Docker Compose 1.18.0

事前準備

PJディレクトリを作成する(任意のディレクトリで可)。

# mkdir docker-redmine

Redmine の設定ファイルを格納するディレクトリを作成する。

# cd docker-redmine
# mkdir redmine
# mkdir mysql

Redmine のデータが保存されるディレクトリを作成する。

# mkdir redmine_data
# mkdir mysql_data

Redmine

このステップは、E-mail の送信をしないならばスキップして良い。
Dockerfile に記載されているredmine:4.1.0-alpineを後述するdocker-compose.ymlに記載してください。

Dockerfile

Dockerfile を作成する。

# touch redmine/Dockerfile

Dockerfile に下記を追加する。

FROM redmine:4.1.0-alpine

COPY ./configuration.yml /usr/src/redmine/config

configuration.yml

configuration.yml を作成する。

# touch redmine/configuration.yml

configuration.yml に下記を追加する(内容は各環境に合わせてください)。

default:
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      address: localhost
      port: 25
      domain: redmine.example.com

MySQL

Dockerfile

Dockerfile を作成する。

# touch mysql/Dockerfile

Dockerfile に下記を追加する。

FROM mysql:5.7

COPY ./my.cnf /etc/mysql

my.cnf

my.cnf を作成する。

# touch mysql/my.cnf

my.cnf に下記を追加する。

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8

[mysqld]
character-set-server=utf8

Docker Compose

docker-compose.yml を作成する。

# touch docker-compose.yml

docker-compose.yml に下記を追記する。

version: '3'
services:
  redmine:
    build: ./redmine
    container_name: redmine
    restart: always
    environment:
      REDMINE_DB_MYSQL: mysql
      REDMINE_DB_DATABASE: redmine
      REDMINE_DB_USERNAME: redmine
      REDMINE_DB_PASSWORD: redmine
      REDMINE_DB_ENCODING: utf8
      REDMINE_SECRET_KEY_BASE: supersecretkey
    volumes:
      - ./redmine_data/files:/usr/src/redmine/files
      - ./redmine_data/log:/usr/src/redmine/log
    links:
      - "mysql"
    ports:
      - "8160:3000"
  mysql:
    build: ./mysql
    container_name: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: P@ssw0rd
      MYSQL_DATABASE: redmine
      MYSQL_USER: redmine
      MYSQL_PASSWORD: redmine
    volumes:
      - ./mysql_data:/var/lib/mysql
    expose:
      - 3306

コンテナ起動

コンテナを起動する。

# docker-compose up -d

動作確認

ブラウザでhttp://localhost:8160/へアクセスし、アプリケーションが稼働しているかを確認する。 f:id:saito_shion:20200413144923p:plain

終わりに

Redmine を Docker で動かすことができた。メールの設定やMySQL文字コードの問題で、公式イメージをそのまま使えなかったのは残念である。何かもっと良い方法があるのかな?

参考サイト

https://hub.docker.com/_/redmine?tab=description

https://qiita.com/bezeklik/items/b5c39136a8db23e2e81c

https://qiita.com/bezeklik/items/b9d75ee74e0ae4c6d42c

Docker : GitLab の構築

Docker を使って、GitLab を立ち上げたいと思う。

環境

  • CentOS 7.7
  • Docker 19.03.6
  • Docker Compose 1.18.0

Docker Compose

PJディレクトリを作成する(任意のディレクトリで可)。

# mkdir docker-gitlab

GitLab のデータが保存されるディレクトリを作成する。

# cd docker-gitlab
# mkdir gitlab_home

docker-compose.yml を作成する。

# touch docker-compose.yml

docker-compose.yml に下記を追記する。

version: '3'
services:
  gitlab:
    image: gitlab/gitlab-ce:latest
    container_name: gitlab
    hostname: localhost
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://my.domain.com:8929/'
    volumes:
      - ./gitlab_home/gitlab/config:/etc/gitlab
      - ./gitlab_home/gitlab/logs:/var/log/gitlab
      - ./gitlab_home/gitlab/data:/var/opt/gitlab
    ports:
      - "8929:8929"

動作確認

コンテナを起動する。

# docker-compose up -d

http://[your host]:8929Webブラウザでアクセスし、root ユーザのパスワードを設定する。 f:id:saito_shion:20200409143922p:plain Username にroot、Password に設定したパスワードを入力し、ログインする。 f:id:saito_shion:20200409144201p:plain ログインすると、トップページヘアクセスできる。 f:id:saito_shion:20200409144425p:plain

終わりに

GitLab を動かすポートを8080にして起動しようとしたら全然動かなくて困った、内部で利用しているぽい。

とりあえず、立ち上げることはできたので、Git でソースの管理とかをしたいと思う。

参考サイト

https://docs.gitlab.com/omnibus/docker/README.html#after-starting-a-container

https://qiita.com/ryuichi1208/items/1c08523b0ef34d05026f

https://mikoto2000.blogspot.com/2018/06/gitlab-docker-image-https.html

Python Flask ちょっとしたWebアプリケーション

Python と Flask を使って簡易なWebアプリケーションを作成してみた。

環境

手順

Flask と jinja2 をインストールしておく。

> pip install flask jinja2

フォルダ構成は下記の通り。

src
├ static
│    └ css
│        └ bootstrap.min.css
├ templates
│    ├ base.html
│    ├ home.html
│    └ jump.html
└ app.py

bootstrap.min.cssをダウンロードする。

https://getbootstrap.com/docs/4.0/getting-started/download/

app.pyを作成し、下記のコードをコピーアンドペーストする。

from flask import Flask
from flask import request
from flask import render_template
 
app = Flask(__name__)

@app.route('/', methods=["GET"])
def home():
    return render_template('home.html')

@app.route('/jump', methods=["POST"])
def test():
    res: str = ''
    if request.method == 'POST':
        res = request.form['post_value']

    return render_template('jump.html', res=res)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

base.htmlを作成し、下記のコードをコピーアンドペーストする。

<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>Jinja2 Tutorial</title>
        <link href="{{ url_for('static', filename='css/bootstrap.min.css') }}" rel="stylesheet">
    </head>
    <body>
        <div class="navbar navbar-dark bg-dark box-shadow">
            <div class="container d-flex justify-content-between">
                <a class="navbar-brand" href="{{ url_for('home')}}">Jinja2 Tutorial</a>
            </div>
        </div>
        <div class="container">
            {% block container %}
            {% endblock %}
        </div>
    </body>
</html>

home.htmlを作成し、下記のコードをコピーアンドペーストする。

{% extends "base.html" %}
{% block container %}
    <h2>hello world !!</h2>
    <br>
    <form action="/jump" method="post">
        <input name="post_value" type=text/>
        <button name="post_button">post submit</button>
    </form>
{% endblock %}

jump.htmlを作成し、下記のコードをコピーアンドペーストする。

{% extends "base.html" %}
{% block container %}
    {{res}}
{% endblock %}

動作確認

Flask を起動する。

> flask run

localhost:5000Webブラウザでアクセスする。 f:id:saito_shion:20200408170831p:plain

テキストボックスに適当な値を入力し、ボタンを押下する。 f:id:saito_shion:20200408170838p:plain

入力した値が画面に表示されることを確認する。 f:id:saito_shion:20200408170820p:plain

終わりに

簡単なWebアプリケーションを作成することができた。

画面項目を増やしたりして、もう少しできることを増やしていこうと思う。

参考サイト

https://qiita.com/bookun/items/7ae5de21307d101b4759

https://www.python.ambitious-engineer.com/archives/1647

Python VSCode 環境構築

環境

手順

  • Python 3.7.7 をインストール

  • Virtualenv をインストール

> python -m pip install virtualenv
  • VS CodePython Extension Pack をインストール

  • プロジェクトフォルダの作成

> mkdir C:\vsc-workspace\hello_world
  • プロジェクトフォルダを VS Code で開く

  • Ctrl+@ でターミナルを開く

  • 新しい仮想環境の作成
    venv を使うと pip によるパッケージの導入状態をプロジェクトごとに独立させることができる。

> python -m venv venv
> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
  • 作成した仮想環境でアクティベート
> .\venv\Scripts\activate
  • Flask をインストール
> pip install flask
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return "Hello World!"

if __name__ == '__main__':
    app.run()
  • アプリケーションを実行
> python .\app.py
  • Web ブラウザから、localhost:5000へアクセス f:id:saito_shion:20200402175000p:plain

  • 仮想環境の使用を終了

> deactivate

PowerShell でのプロキシ設定

PowerShell で下記を実行する。

$env:http_proxy="http://[username]:[password]@proxy.example.com:8080"
$env:https_proxy="https://[username]:[password]@proxy.example.com:8080"

参考サイト

https://www.python.jp/install/windows/virtualenv.html

GCPを始める ~Deployment Manager~

GCP の Deployment Manager を触ってみる。

自動で環境を構築することができるみたいである。 今までやってきたことを GCP Console ではなく、Deployment Manager でやったらどうなるか、ということを試して行きたいと思う。

cloud.google.com

前提条件

  • GCP のアカウントを登録していること
  • 1つ以上のプロジェクトを作成していること
  • GCP プロジェクトに対して課金が有効になっていること

ゴール

下記と同等の状態を構築することをゴールとする。

作成手順

Google Cloud Shell へ接続します。 f:id:saito_shion:20200327114349p:plain YAML ファイルを作成します。

$ touch deploy.yml

下記をdeploy.pyにコピーアンドペーストする。
※[Your Project Id] は、GCP のプロジェクト ID を指定してください。
※[Your Service Account] は、Compute Engine のサービスアカウントを指定してください。

resources:
- type: compute.v1.network
  name: app2-network
  properties:
    autoCreateSubnetworks: false
    routingConfig:
      routingMode: REGIONAL
- type: compute.v1.subnetwork
  name: app2-sub
  properties:
    network: https://compute.googleapis.com/compute/v1/projects/[Your Project Id]/global/networks/app2-network
    ipCidrRange: 10.0.3.0/24
    region: us-west1
  metadata:
    dependsOn:
    - app2-network
- type: compute.v1.firewall
  name: ce-allow-ssh
  properties:
    network: https://compute.googleapis.com/compute/v1/projects/[Your Project Id]/global/networks/app2-network
    priority: 1000
    sourceRanges:
    - 0.0.0.0/0
    allowed:
    - IPProtocol: tcp
      ports:
      - 22
    direction: INGRESS
    logConfig:
      enable: false
    disabled: false
  metadata:
    dependsOn:
    - app2-network
- type: compute.v1.firewall
  name: ce-allow-icmp
  properties:
    network: https://compute.googleapis.com/compute/v1/projects/[Your Project Id]/global/networks/app2-network
    priority: 1000
    sourceRanges:
    - 0.0.0.0/0
    allowed:
    - IPProtocol: icmp
    direction: INGRESS
    logConfig:
      enable: false
    disabled: false
  metadata:
    dependsOn:
    - app2-network
- type: compute.v1.firewall
  name: ce-allow-flask
  properties:
    network: https://compute.googleapis.com/compute/v1/projects/[Your Project Id]/global/networks/app2-network
    priority: 1000
    sourceRanges:
    - 0.0.0.0/0
    allowed:
    - IPProtocol: tcp
      ports:
      - 5000
    direction: INGRESS
    logConfig:
      enable: false
    disabled: false
  metadata:
    dependsOn:
    - app2-network
- type: compute.v1.instance
  name: instance-2
  properties:
    status: RUNNING
    zone: us-west1-b
    machineType: https://www.googleapis.com/compute/v1/projects/[Your Project Id]/zones/us-west1-b/machineTypes/f1-micro
    disks:
    - deviceName: instance-2
      type: PERSISTENT
      mode: READ_WRITE
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: https://www.googleapis.com/compute/v1/projects/centos-cloud/global/images/family/centos-7
        diskSizeGb: 10
        diskType: https://www.googleapis.com/compute/v1/projects/[Your Project Id]/zones/us-west1-b/diskTypes/pd-standard
    networkInterfaces:
    - network: https://www.googleapis.com/compute/v1/projects/[Your Project Id]/global/networks/app2-network
      subnetwork: https://www.googleapis.com/compute/v1/projects/[Your Project Id]/regions/us-west1/subnetworks/app2-sub
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT
    serviceAccounts:
    - email: [Your Service Account]
      scopes: https://www.googleapis.com/auth/cloud-platform
  metadata:
    dependsOn:
    - app2-network
    - app2-sub

下記のコマンドを実行します。

$ gcloud deployment-manager deployments create quickstart --config deploy.yml

f:id:saito_shion:20200327134128p:plain

削除手順

Google Cloud Shell へ接続し、下記のコマンドを実行します。

$ gcloud deployment-manager deployments delete quickstart

f:id:saito_shion:20200327142608p:plain

困ったときは

公式ドキュメントには詳細な書き方とか、どうしたらいいか、ということはあまり書いていない。

困ったときは、下記を探してリンクを開くと良い。JSONベースで記述を参照でき、これを YAML ファイルにコピペすることができる。 f:id:saito_shion:20200327143705p:plain

終わりに

Redis と Bigtable は自動化できないようである、ショック。

まぁ、最低限のことは自動化できるようなので、利用する価値はある。GCP が今後拡張してくれることを祈るばかりである。

参考サイト

https://cloud.google.com/deployment-manager/docs/configuration/supported-resource-types