2018年10月21日日曜日

DockerでTextpattern4.7.1とMariaDBがインストールされたコンテナ(Alpine 3.8)を構築する

TextpatternはPHP製のCMSです。
以下の手順で、TextpatternとMariaDBのコンテナを構築・実行します。

○Textpatternの画面


○構築方法
1. Textpatternイメージの作成(Dockerfileがあるフォルダで実行)
docker build -t textpattern .

Dockerfile
FROM alpine:3.8
WORKDIR /
RUN  apk update \
  && apk add --nocache apache2 php7-apache2 php7-mysqli php7-pdo php7-mbstring php7-session php7-curl php7-json php7-xml php7-simplexml php7-zip openssl openrc \
  && rm -rf /var/cache/apk/* \
  && wget https://textpattern.com/File+download/86/textpattern-4.7.1.tar.gz \
  && tar xvfz textpattern-4.7.1.tar.gz \
  && rm -f textpattern-4.7.1.tar.gz \
  && mkdir /opt \
  && mv textpattern-4.7.1 /opt/textpattern \
  && chown -R apache:apache /opt/textpattern \
  && mkdir -p /run/apache2 \
  && echo $'\n\
Options Indexes FollowSymLinks \n\
AllowOverride All\n\
Require all granted\n\
' >> /etc/apache2/httpd.conf \
  && ln -s /opt/textpattern /var/www/localhost/htdocs \
  && sed -i -e 's|#LoadModule rewrite_module modules/mod_rewrite.so|LoadModule rewrite_module modules/mod_rewrite.so|' /etc/apache2/httpd.conf
EXPOSE 80
VOLUME /opt/textpattern
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

2. TextpatternとMariaDBコンテナの構築・実行(docker-compose.ymlがあるフォルダで実行)
docker-compose up -d

docker-compose.yml
version: "2"
services:
  textpattern:
    image: textpattern
    container_name: "textpattern"
    volumes:
      - "textpattern-data:/opt/textpattern"
    ports:
      - "80:80"
    depends_on:
      - db
    environment:
      TEXTPATTERN_DB_HOST: "db:3306"
  db:
    image: mariadb:10.3
    container_name: "textpattern-db"
    volumes:
      - "db-data:/var/lib/mysql"
    environment:
        MYSQL_DATABASE: textpattern
        MYSQL_ROOT_PASSWORD: textpattern
volumes:
  db-data:
    driver: local
  textpattern-data:
    driver: local

3. ブラウザからhttp://<Dockerホスト名またはIP>/textpattern/textpattern/setup/index.phpにアクセス
インストール言語として日本語を選択して、submitボタンをクリックする


4. 以下の項目を入力し、「次へ」ボタンをクリックする
MySQLログイン: root
MySQLパスワード:textpattern
MySQLサーバ:db
MySQLデータベース:textpattern
テーブルプリフィックス:(空のまま)


5. 画面に表示されたconfig.phpの内容をコピーして、config.phpとして保存して、以下のコマンドを実行する
docker cp config.php textpattern:/opt/textpattern/textpattern
実行後、「行いました!」ボタンをクリックする


6. 管理者ユーザの情報を入力、管理ページのテーマを選択して「次へ」ボタンをクリックする


7. 完了画面から「今すぐログイン」ボタンをクリックする



○関連情報
・Textpatternに関する他の記事はこちらを参照してください。

JupyterとdatapackageでIMFの人口(百万人単位)データを取得する

Jupyterとdatapackageで、IMFの人口(百万人単位)データを取得してグラフ描画するには、以下のコードを実行します。

〇出力グラフ


サンプルコード

以下のコードで、IMFの人口(百万人単位)データを取得してグラフを描画します。
%matplotlib inline
import matplotlib.pyplot as plt
from datapackage import Package
import pandas as pd

package = Package('https://datahub.io/core/imf-weo/datapackage.json')

for resource in package.resources:
  if resource.name == "values_csv":
    df = pd.read_csv(resource.descriptor['path']) 
    df = df.query("Indicator=='LP' and Country in ('JPN', 'USA', 'MYS')")
    df = df[['Country','Year','Value']]
    df['Value'] = df['Value'].astype(float)
    df.set_index(["Country", "Year"], inplace=True)
    ax = df.unstack(level=0).plot()
    plt.xticks(rotation=90)
    plt.legend(loc='best')
    plt.show()

動作確認バージョン

datapackage=1.14.1 (2020/07/15確認)

関連情報

様々なデータを取得できるdatapackageのまとめ

・datapackageに関する他の記事はこちらを参照してください。

Jupyterとwbdataで世界銀行のCO2排出量データを取得する

Jupyterとwbdataで、世界銀行のCO2排出量(メータートン)を取得して、グラフ描画します。

〇出力画面


使用指標

EN.ATM.CO2E.PC
CO2排出量 - CO2 emissions (metric tons per capita)

サンプルコード

以下のコードをJupyterから実行してください。
%matplotlib inline
import matplotlib.pyplot as plt
import wbdata

df = wbdata.api.get_dataframe({"EN.ATM.CO2E.PC":"Metric tons per capita"}, country=["JP","US", "DE"], convert_date=True)
df.unstack(level=0).plot()
plt.legend(loc='best')
plt.show()

関連情報

・世界銀行のデータを取得・可視化する記事のまとめは以下のページを参照してください。
世界銀行のデータを取得できるwbdataパッケージのまとめ

wbdataパッケージをインストールしたコンテナを作成するには、以下のページを参照してください。
DockerでJupyter Notebookと世界銀行の情報が取得できるwbdataパッケージがインストールされたコンテナのイメージを作成する

コンテナではなく、仮想マシンを構築する場合は、以下を参照します。
VagrantでJupyter Lab、wbdata、BokehとMariaDBをインストールした仮想マシン(Ubuntu18.04)を構築する

・世界銀行のデータを取得することができるwbdataパッケージに関する他の記事はこちらを参照してください。

2018年10月20日土曜日

JupyterとdatapackageでIMFの失業率(労働人口比)データを取得する

Jupyterとdatapackageで、IMFの失業率(労働人口比)データを取得して、グラフ描画するには、以下のコードを実行します。

〇出力グラフ


サンプルコード

以下のコードで、IMFの失業率(労働人口比)データを取得してグラフを描画します。
%matplotlib inline
import matplotlib.pyplot as plt
from datapackage import Package
import pandas as pd

package = Package('https://datahub.io/core/imf-weo/datapackage.json')

for resource in package.resources:
  if resource.name == "values_csv":
    df = pd.read_csv(resource.descriptor['path']) 
    df = df.query("Indicator=='LUR' and Country in ('JPN', 'USA', 'GBR')")
    df = df[['Country','Year','Value']]
    df['Value'] = df['Value'].astype(float)
    df.set_index(["Country", "Year"], inplace=True)
    ax = df.unstack(level=0).plot()
    plt.xticks(rotation=90)
    plt.legend(loc='best')
    plt.show()

動作確認バージョン

datapackage=1.14.1 (2020/07/15確認)

関連情報

様々なデータを取得できるdatapackageのまとめ

・datapackageに関する他の記事はこちらを参照してください。

Jupyterとwbdataで世界銀行の実質金利データを取得する

Jupyterとwbdataで、実質金利データを取得して、グラフ描画します。

〇出力画面


使用指標

FR.INR.RINR
実質金利 - Real interest rate (%)

サンプルコード

以下のコードをJupyterから実行してください。
%matplotlib inline
import matplotlib.pyplot as plt
import wbdata

df = wbdata.api.get_dataframe({"FR.INR.RINR":"Percent"}, country=["JP","US", "NZ"], convert_date=True)
df.unstack(level=0).plot()
plt.legend(loc='best')
plt.show()

関連情報

・世界銀行のデータを取得・可視化する記事のまとめは以下のページを参照してください。
世界銀行のデータを取得できるwbdataパッケージのまとめ

wbdataパッケージをインストールしたコンテナを作成するには、以下のページを参照してください。
DockerでJupyter Notebookと世界銀行の情報が取得できるwbdataパッケージがインストールされたコンテナのイメージを作成する

コンテナではなく、仮想マシンを構築する場合は、以下を参照します。
VagrantでJupyter Lab、wbdata、BokehとMariaDBをインストールした仮想マシン(Ubuntu18.04)を構築する

・世界銀行のデータを取得することができるwbdataパッケージに関する他の記事はこちらを参照してください。

Raspberry Pi上のDockerでMezzanine、MariaDB10.2がインストールされたコンテナ(Alpine3.8)を構築する

MezzanineはPython製のCMSです。

○Mezzanineの画面


○構築方法
以下の手順で、Mezzanineのコンテナを構築・実行します。

1. Mezzanineイメージの作成(Dockerfileがあるフォルダで実行)
docker build -t mezzanine .

Dockerfile
FROM python:3.6-alpine3.8

RUN mkdir -p /opt/mezzanine
WORKDIR /opt/mezzanine
RUN apk update \
  && apk add --no-cache --virtual=build-deps jpeg jpeg-dev zlib-dev musl-dev gcc mariadb-dev build-base \
  && pip install mezzanine \
  && pip install mysqlclient \
  && apk del mariadb-dev build-base build-deps gcc \
  && apk add mariadb-client mariadb-connector-c \
  && rm -rf /var/cache/apk/* \
  && mezzanine-project mysite \
  && echo $'#!/bin/sh \n\
until mysql -h db -u root -pmezzanine mezzanine\n\
do \n\
  echo -n "." \n\
  sleep 1 \n\
done \n\
cd /opt/mezzanine/mysite \n\
sed -i -e \'s/"ENGINE": "django.db.backends.sqlite3",/"ENGINE": "django.db.backends.mysql",/\' /opt/mezzanine/mysite/mysite/local_settings.py \n\
sed -i -e \'s/"NAME": "dev.db",/"NAME": "mezzanine",/\' /opt/mezzanine/mysite/mysite/local_settings.py \n\
sed -i -e \'s/"USER": "",/"USER": "root",/\' /opt/mezzanine/mysite/mysite/local_settings.py \n\
sed -i -e \'s/"PASSWORD": "",/"PASSWORD": "mezzanine",/\' /opt/mezzanine/mysite/mysite/local_settings.py \n\
sed -i -e \'s/"HOST": "",/"HOST": "db",/\' /opt/mezzanine/mysite/mysite/local_settings.py \n\
sed -i -e \'s/"PORT": "",/"PORT": "3306",/\' /opt/mezzanine/mysite/mysite/local_settings.py \n\
sed -i -e \'s/ALLOWED_HOSTS = \[.*\]/ALLOWED_HOSTS  = ["*"]/\' /opt/mezzanine/mysite/mysite/local_settings.py \n\
python manage.py createdb --noinput \n\
python manage.py migrate --noinput \n\
python manage.py runserver 0.0.0.0:80' > /opt/mezzanine/mysite/start.sh \
  && chmod +x /opt/mezzanine/mysite/start.sh
EXPOSE 80
VOLUME /opt/mezzanine/mysite
CMD ["/opt/mezzanine/mysite/start.sh"]

2. Mezzanine用のMariaDBイメージの作成(Dockerfile-mariadbとsetupdb.shのあるディレクトリで実行)
docker build -f Dockerfile-mariadb -t mariadb-mezzanine .

Dockerfile-mariadb
FROM alpine:3.8
COPY ./setupdb.sh /
RUN apk --no-cache add mariadb mariadb-client \
  && addgroup mysql mysql \
  && chmod +x /setupdb.sh
VOLUME /var/lib/mysql
EXPOSE 3306
ENTRYPOINT ["/setupdb.sh"]

setupdb.sh
#!/bin/sh
if [ ! -d "/run/mysqld" ]; then
  mkdir -p /run/mysqld
  chown -R mysql:mysql /run/mysqld
fi
if [ ! -e /usr/my.cnf ]; then
  cat << EOF > /usr/my.cnf
[mysqld]
datadir=/var/lib/mysql
log-bin = /var/lib/mysql/mysql-bin
port = 3306
user = mysql
symbolic-links=0
character-set-server = utf8
pid-file=/run/mysqld/mysqld.pid
EOF
  chown -R mysql:mysql /var/lib/mysql
  mysql_install_db --user=mysql
  nohup /bin/sh /usr/bin/mysqld_safe \
    --datadir=/var/lib/mysql \
    --socket=/run/mysqld/mysqld.sock \
    --pid-file=/run/mysqld/mysqld.pid \
    --basedir=/usr \
    --user=mysql \
    --skip-grant-tables \
    --skip-networking &
  while :
  do
    [ -r /run/mysqld/mysqld.pid ] || continue
    if ps -ef | grep -q $(cat /run/mysqld/mysqld.pid) ; then
        break
    fi
    sleep 10
  done
  cat << EOF > /tmp/setupdb.sql
USE mysql;
UPDATE mysql.user SET Password=PASSWORD('mezzanine') WHERE User='root';
FLUSH PRIVILEGES;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'mezzanine';
FLUSH PRIVILEGES;
EOF
  /usr/bin/mysql < /tmp/setupdb.sql
  cat << EOF > /tmp/createdb.sql
CREATE DATABASE mezzanine DEFAULT CHARACTER SET utf8mb4;
EOF
  /usr/bin/mysql -uroot -pmezzanine < /tmp/createdb.sql
  kill `cat /run/mysqld/mysqld.pid`
  sleep 10
fi
exec /usr/bin/mysqld --defaults-file=/usr/my.cnf --console --user=mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

3. MezzanineとMariaDBコンテナの構築・実行(docker-compose.ymlがあるフォルダで実行)
docker-compose up -d

docker-compose.yml
version: "2"
services:
  db:
    image: mariadb-mezzanine
    container_name: "mezzanine-db"
    volumes:
      - "db-data:/var/lib/mysql"
    ports:
      - "3306:3306"
  mezzanine:
    image: mezzanine
    container_name: "mezzanine"
    volumes:
      - "mezzanine-data:/opt/mezzanine/mysite"
    ports:
      - "80:80"
    depends_on:
      - db
volumes:
  db-data:
    driver: local
  mezzanine-data:
    driver: local

4.ブラウザから以下のURLにアクセス
http://<Dockerホスト名またはIP>/
※デフォルトユーザとパスワードはadmin/defaultです。

〇参考情報
Raspberry PiにDockerとdocker-composeをインストールするには以下の記事を参照してください。
Raspberry Pi Raspbian GNU/Linux 9 (stretch)にdocker-composeをインストールする

・Raspberry Pi上のDockerに関する他の記事はこちらを参照してください。

2018年10月19日金曜日

Jupyterとpandas、foliumで栃木県の地域子育て支援拠点を地図に描画する

Jupyterとpandas、foliumを使用して、以下のコードで栃木県の地域子育て支援拠点を地図に描画する事ができます。

〇出力画面


〇サンプルコード
import folium
import pandas as pd
import math

df = pd.read_csv("http://tochigiken.jp/index.php?action=multidatabase_action_main_filedownload&download_flag=1&upload_id=978&metadata_id=3", encoding="cp932")
#display(df)
fm = folium.Map(location=[36.565725, 139.883565], zoom_start=9)

for i, dt in df.iterrows():
  if not math.isnan(dt['緯度']):
    folium.Marker(location=[dt['緯度'], dt['経度']], popup=dt['拠点名']).add_to(fm)
fm

〇元データ
栃木県-こども政策課
http://tochigiken.jp/index.php?key=mu1kbtvmc-20#_20