m_shige1979のささやかな抵抗と欲望の日々

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

AWS Workspaceを試す

AWS Workspaces

aws.amazon.com

始める

今すぐ始める

f:id:m_shige1979:20210921234829p:plain

高速セットアップを選択

f:id:m_shige1979:20210921234949p:plain
VPCとかを指定したい場合は詳細で設定する必要あり

無料版があったんで選択

f:id:m_shige1979:20210921235004p:plain

起動したら暫く待つ

f:id:m_shige1979:20210921235018p:plain
※多分、最大20分待つ

起動するまで待機

f:id:m_shige1979:20210921235047p:plain

f:id:m_shige1979:20210921235058p:plain

f:id:m_shige1979:20210921235110p:plain

メール確認

メールを確認してリンクをクリックする

f:id:m_shige1979:20210921235121p:plain

初回のアクセスパスワードを更新

f:id:m_shige1979:20210921235132p:plain

クライアントをダウンロード

f:id:m_shige1979:20210921235144p:plain

クライアントアプリをインストール

f:id:m_shige1979:20210921235200p:plain

f:id:m_shige1979:20210921235212p:plain

クライアントで起動

メールの登録キーを設定

f:id:m_shige1979:20210921235224p:plain

ユーザーとパスワードを設定

f:id:m_shige1979:20210921235236p:plain

アクセス

f:id:m_shige1979:20210921235248p:plain

所感

今回はちょっとお試し、
データをどのように管理できるかとか
Workspaceからインターネットへの接続制限などをどのようにやるかでセキュリティを保てるかを試してみたい

docker-composeでnginx+php(cakeph4)+MySQLの環境を構築する

構成(雑)

f:id:m_shige1979:20210908070301p:plain

手順

docker-compose.yml

version: "3"

services:
  # web
  web:
    # コンテナ名
    container_name: web
    # image
    image: nginx:alpine
    # 他のコンテナ起動後に起動するように制御
    depends_on:
      - php
      - db
    # ポート開放
    ports:
      - "80:80"
    # ボリューム
    volumes:
      - "./nginx/conf.d:/etc/nginx/conf.d"
      - "./app:/var/www/html"

  # app
  php:
    # コンテナ名
    container_name: php
    # ビルド
    build: ./dockers/php
    # コンテナに入るようにできる
    tty: true
    # 他のコンテナが起動後に動くように制御
    depends_on:
      - db
    # ボリューム
    volumes:
      - "./app:/var/www/html"
    # ポート
    ports:
      - 9000:9000
      - 4321:4321
    # 環境変数
    environment:
      TZ: "Asia/Tokyo"
  # DB
  db:
    # コンテナ名
    container_name: mysql
    # イメージ
    image: mysql
    #
    tty: true
    # 再起動
    restart: always
    # 環境変数
    environment:
      MYSQL_ROOT_USER: "root"
      MYSQL_ROOT_PASSWORD: "password"
      MYSQL_DATABASE: sample
      MYSQL_USER: hoge
      MYSQL_PASSWORD: foofoo
      TZ: "Asia/Tokyo"
    # ボリューム
    volumes:
      - mysql_data:/var/lib/mysql
    # ポート
    ports:
      - 3306:3306

# 名前付きボリュームをdockerホストの管理下で作成
volumes:
  mysql_data: {}

nginx/conf.d/vhost1.conf

server {
    listen   80;
    listen   [::]:80;
    server_name example.com;

    root   /var/www/html/webroot;
    index  index.php;

    #access_log /var/www/example.com/log/access.log;
    #error_log /var/www/example.com/log/error.log;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;
        fastcgi_pass   php:9000;
        fastcgi_index index.php;
        fastcgi_intercept_errors on;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

dockers/php/Dockerfile

# PHPイメージ
FROM php:7.4.23-fpm-buster

# 関連パッケージをインストール
RUN apt-get update && \
    apt-get install -y vim && \
    apt-get install -y unzip && \
    apt-get install -y libicu-dev && \
    docker-php-ext-install intl && \
    docker-php-ext-install pdo_mysql

# composerをインストール
COPY --from=composer /usr/bin/composer /usr/bin/composer

phpイメージ用のDockerfileでphpのパッケージインストーラーであるcomposerをインストールしておく

f:id:m_shige1979:20210908065000p:plain

参考

インストール - 4.x

Docker の Nginx + MySQL 環境で CakePHP 4 を動かす / Twin Turbo Computing

CakePHP4 の開発環境をDockerを使って構築する - Qiita

github

github.com

docker-composeでnginxを使用してリバースプロキシを行う

dockerでnginxを利用してアプリサーバをリバースプロキシしたい

こんなやつ

f:id:m_shige1979:20210904220418p:plain

設定

docker-compose.yml

version: "3"

services:
  # nginx
  nginx:
    # コンテナ名
    container_name: nginx
    # image
    image: nginx:alpine
    # スタブサーバー起動後に動く
    depends_on:
      - mocky
      - staticsite
    # コンテナに入るようにできる
    tty: true
    # ポート
    ports:
      - "80:80"
    # ボリューム(マウント)
    volumes:
      - ./dockers/nginx/conf.d:/etc/nginx/conf.d

  # スタブサーバ用
  mocky:
    # コンテナ名
    container_name: mocky
    # Dockerfile場所
    build: ./dockers/mocky
    # コンテナに入るようにできる
    tty: true
    # ボリューム
    volumes:
      - "./dockers/mocky/app:/usr/src/app"
    # ポート
    ports:
      - "4321:4321"
    # 作業ディレクトリ
    working_dir: /usr/src/app
    # 実行コマンド
    entrypoint: npm start

  # 静的サーバ用
  staticsite:
    # コンテナ名
    container_name: staticsite
    # image
    image: panubo/staticsite
    # コンテナに入るようにできる
    tty: true
    # ポート
    ports:
      - "8000:80"
    # ボリューム
    volumes:
      - "./dockers/staticsite/html:/var/www/html"

docker-compose.yml自体はほとんど変化なし 2つのホストでそれぞれ異なるサーバへプロキシを行う検証として1つコンテナは追加しました。

dockers/nginx/conf.d/vhost1.conf

# スタブサーバ接続用設定
upstream backend1 {
    server host.docker.internal:4321;
}
server {
  listen       80;
  server_name  sample.mocky.com;
  root         /var/www/html;
  
  location / {
    proxy_set_header  Host                $host;
    proxy_set_header  X-Real-IP           $remote_addr;
    proxy_set_header  X-Forwarded-Host    $host;
    proxy_set_header  X-Forwarded-Server  $host;
    proxy_set_header  X-Forwarded-For     $proxy_add_x_forwarded_for;
    proxy_pass        http://backend1/;
  }  
}

dockers/nginx/conf.d/vhost2.conf

# スタブサーバ接続用設定
upstream backend2 {
    server host.docker.internal:8000;
}
server {
  listen       80;
  server_name  sample.staticsite.com;
  root         /var/www/html;
  
  location / {
    proxy_set_header  Host                $host;
    proxy_set_header  X-Real-IP           $remote_addr;
    proxy_set_header  X-Forwarded-Host    $host;
    proxy_set_header  X-Forwarded-Server  $host;
    proxy_set_header  X-Forwarded-For     $proxy_add_x_forwarded_for;
    proxy_pass        http://backend2/;
  }  
}

基本的なプロキシ設定自体は同じ それぞれ異なるポートを利用すること

結果

sample.mocky.com/

 % curl http://sample.mocky.com/api/v01/users | jq

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    42    0    42    0     0   8400      0 --:--:-- --:--:-- --:--:--  8400
{
  "users": [
    {
      "name": "hoge"
    },
    {
      "name": "foo"
    }
  ]
}
%

sample.staticsite.com

 % curl http://sample.staticsite.com

<html>
    <head>
        <title>test</title>
    </head>
    <body>
        <p>
            test
        </p>
    </body>
</html>
%

コンテナから他のコンテナへのアクセス

コンテナ名を指定したり、ネットワークを作成して割り当てる方法などもあるようですが、 今回はhost.docker.internalで対応

参考

Docker上のリバースプロキシで静的コンテンツを複数コンテナ間と共有 | Tech Memo

GitHub - panubo/docker-staticsite: Docker image with nginx, awscli and scripts for automated configuration and deployment of static sites

Dockerコンテナ内からホストへ`localhost` でアクセスしてみる | iret.media

github

https://github.com/mshige1979/mocky_docker_sample/tree/nginx

docker-composeで簡易的なスタブサーバを作成

普段、簡易サーバを用意する場合って

毎回、nodejsとかphpとかでデモを一から用意するんですよね… まあ、それでも良いのですが ちょっとだけ楽したいってことがあります。

よく使うの

github.com

使い方の参考リンク

Node.js の mocky を使用し スタブREST API を作成してみる、その1 - Qiita

mocky を使ってちょっと賢いスタブAPIサーバを作る - Qiita

dockerでやりたい

最終的にはnginxとか使いたいけどとりあえず、docker~composeでの試作版を用意する

docker版

ディレクトリ構成

.
├── LICENSE
├── README.md
├── docker-compose.yml
└── dockers
    └── mocky
        ├── Dockerfile
        ├── README.md
        └── app
            ├── api
            │   ├── api.js
            │   └── user.js
            ├── index.js
            ├── package-lock.json
            └── package.json

dockers/mocky/app/package.json

{
  "name": "mocky",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "start": "nodemon --exec node --experimental-modules index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "mocky": "^0.1.11",
    "nodemon": "^2.0.7"
  },
  "dependencies": {
    "canvas": "^2.6.1",
    "html-pdf": "^2.2.0"
  }
}

dockers/mocky/app/index.js

import mocky from "mocky";
import Api from "./api/api.js";

mocky.createServer([Api.getUser, Api.getUsers]).listen(4321);

※各APIのコードはgithubに記載

docker-compose.yml

version: "3"

services:
  # スタブサーバ用
  mocky:
    # コンテナ名
    container_name: mocky
    # Dockerfile場所
    build: ./dockers/mocky
    # コンテナに入るようにできる
    tty: true
    # ボリューム
    volumes:
      - "./dockers/mocky/app:/usr/src/app"
    # ポート
    ports:
      - "4321:4321"
    # 作業ディレクトリ
    working_dir: /usr/src/app
    # 実行コマンド
    entrypoint: npm start

dockers/mocky/Dockerfile

# ベースイメージ
FROM node:12

# 作業ディレクトリ
WORKDIR /usr/src

# package.jsonをコピー
# ホスト側はDockerfileの場所からの相対パス
COPY ./app/package*.json ./

# パッケージインストール
RUN npm install --no-optional && npm cache clean --force
ENV PATH /usr/src/node_modules/.bin:$PATH

# 作業ディレクトリ
WORKDIR /usr/src/app

# ホスト側はDockerfileの場所からの相対パス
COPY ./app/. ./

# 実行
CMD ["npm", "start"]

起動

 % docker-compose up -d
Creating network "mocky_default" with the default driver
Creating mocky ... done
%

 % curl http://localhost:4321/api/v01/users | jq

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    42    0    42    0     0  14000      0 --:--:-- --:--:-- --:--:-- 14000
{
  "users": [
    {
      "name": "hoge"
    },
    {
      "name": "foo"
    }
  ]
}
%

参考情報

Dockerでmockyを使ったスタブサーバを立ち上げる - Qiita

DockerでNode.jsアプリをイイ感じに保つ4つの方法 #docker - クリエーションライン株式会社

Github

https://github.com/mshige1979/mocky_docker_sample

raspberry pi zeroを起動してみた

材料

キーボードとマウスは自前のものを利用

参考

Raspberry Pi OS (Raspbian)のインストール – 公式Imager対応 – Indoor Corgi

MacでRaspberryPi入門 - Qiita

Pi/OS/Raspbian・Stretchの初期セットアップ手順 - ミニPC&シングルボードコンピュータ活用術

raspberry pi用SDカードインストーラーツール

Raspberry Pi OS – Raspberry Pi へアクセス

f:id:m_shige1979:20210521225534p:plain

インストール

f:id:m_shige1979:20210521225632p:plain

起動

「CHOOSE OS」を選択 f:id:m_shige1979:20210521225906p:plain

OSを選択

f:id:m_shige1979:20210521230058p:plain

書き込みdiskを選択

f:id:m_shige1979:20210521230429p:plain

SDカードを選択

f:id:m_shige1979:20210521230619p:plain

書き込み

f:id:m_shige1979:20210521230739p:plainf:id:m_shige1979:20210521231032p:plainf:id:m_shige1979:20210521231126p:plain

うーん、遅い

f:id:m_shige1979:20210522055110p:plain

セットアップ

接続

f:id:m_shige1979:20210522055451j:plain

電源接続

f:id:m_shige1979:20210522060351j:plain キター

言語設定

f:id:m_shige1979:20210522060650j:plain よくわからんので一応日本語にする

パスワードを設定

f:id:m_shige1979:20210522061042j:plain

スクリーン設定

なんか、画面の周りに枠があったらチェックすると良いらしい f:id:m_shige1979:20210522061340j:plain

wifi設定

f:id:m_shige1979:20210522063346p:plain

ソフトウェアアップデート

f:id:m_shige1979:20210522063452j:plain しばらく待つ

f:id:m_shige1979:20210522075707j:plain

再起動

f:id:m_shige1979:20210522075843j:plain

設定

設定画面を開く

f:id:m_shige1979:20210522080548j:plain

切り替え

f:id:m_shige1979:20210522081130p:plain

再起動

f:id:m_shige1979:20210522081230j:plain

IP確認

f:id:m_shige1979:20210522081732j:plain

% ssh pi@192.168.10.18
The authenticity of host '192.168.10.18 (192.168.10.18)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.10.18' (ECDSA) to the list of known hosts.
pi@192.168.10.18's password:
Linux raspberrypi 5.10.17+ #1414 Fri Apr 30 13:16:27 BST 2021 armv6l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat May 22 08:14:40 2021

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

pi@raspberrypi:~

一旦はここまで

play frameworkをVSCodeで開発環境を整える

VSCodeでコードを書く

できなくはないはず、 ただJavaの開発環境とかの問題もあるから試す

java拡張機能を導入

f:id:m_shige1979:20210503115120p:plain

拡張の初期設定

f:id:m_shige1979:20210503115749p:plain

Java11をインストール

f:id:m_shige1979:20210503120713p:plain

play2のプロジェクトを作成

前回と同じ

% cd
 % cd work/java/play2
% sbt new playframework/play-java-seed.g
[info] welcome to sbt 1.5.1 (N/A Java 15.0.2)
[info] loading global plugins from /Users/xxxx/.sbt/1.0/plugins
[info] set current project to play2 (in build file:/Users/xxxx/work/java/play2/)
[info] set current project to play2 (in build file:/Users/xxxx/work/java/play2/)

This template generates a Play Java project

name [play-java-seed]: app01
organization [com.example]:

Template applied in /Users/xxxx/work/java/play2/./app01
%

ディレクトリ構成

% tree -L 1 app01
app01
├── app
├── build.sbt
├── conf
├── project
├── public
└── test

初回起動を行う

% cd app01
% sbt run

f:id:m_shige1979:20210503122032p:plain

VSCodeで開くと

f:id:m_shige1979:20210503122259p:plain

原因としては

まあ、jarとかが連携されていないことが問題 以下に設定することで対応はできると思われるが、数が多いとめんどくさいのでやりたくない

一旦、eclipse形式に変換する

project/plugins.sbt

// The Play plugin
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.8.8")

// Defines scaffolding (found under .g8 folder)
// http://www.foundweekends.org/giter8/scaffolding.html
// sbt "g8Scaffold form"
addSbtPlugin("org.foundweekends.giter8" % "sbt-giter8-scaffold" % "0.11.0")

// 追加
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "5.2.4")

eclipse用の形式に変換する

% sbt
[app01] $ 
[app01] $ eclipse
[info] About to create Eclipse project files for your project(s).
[info] Successfully created Eclipse project files for project(s):
[info] app01
[app01] $

VSCodeを開き直す

f:id:m_shige1979:20210503123544p:plain

VSCodeワークスペースに入れる

「ファイル」>「フォルダをワークスペースに追加」

f:id:m_shige1979:20210503123754p:plain

ワークスペースを保存する

f:id:m_shige1979:20210503124019p:plain

{
  "folders": [
    {
      "path": "."
    }
  ],
  "settings": {
    "workbench.colorTheme": "Monokai Dimmed",
    "files.exclude": {
      "**/.classpath": false,
      "**/.project": false,
      "**/.settings": false,
      "**/.factorypath": false
    },
    "java.home": "/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home",
    "files.watcherExclude": {
      "**/target": true
    }
  }
}

classpathに以下を追加

 <classpathentry kind="lib" path="target/scala-2.13/classes"/>

※viewsのテンプレートを新規に作成しても参照ができずにエラーとなるため ※viewsのテンプレートは一度、画面を表示して再ビルドすることが必要

あとは色々いじってみる まあ、Intelij Ideaやeclipseの方がやりやすいかもしれんがwww

playframeworkを試す(helloworldのみ)

環境

MacOS

インストール環境

Javaのみ

sbtをインストール

brew install sbt

% sbt version
[info] welcome to sbt 1.5.1 (N/A Java 15.0.2)
[info] loading project definition from /Users/xxxx/project
[info] set current project to shigeharu (in build file:/Users/shigeharu/)
[info] 0.1.0-SNAPSHOT
%

helloworldを取得して、実行

手順

wget https://example.lightbend.com/v1/download/play-samples-play-java-hello-world-tutorial -O play-java-helloworld.zip
unzip play-java-helloworld.zip
cd play-samples-play-java-hello-world-tutorial
sbt run

f:id:m_shige1979:20210502123110p:plain デフォルトのポートは9000のよう

ディレクトリ構成

.
├── LICENSE
├── NOTICE
├── README.md
├── app
├── build.sbt
├── conf
├── logs
├── project
├── public
├── sbt
├── sbt-dist
├── sbt.bat
├── scripts
├── target
└── test

テンプレートを利用して、プロジェクトを作成

手順(テンプレートをwebから拾ってくるため、多少時間がかかります)

mkdir sample1
cd sample1
sbt new playframework/play-java-seed.g8
cd sample1
cd sample1
sbt run

f:id:m_shige1979:20210502123415p:plain うーん、寂しい

ディレクトリ構成

.
├── project
│   └── target
├── sample1
│   ├── app
│   ├── build.sbt
│   ├── conf
│   ├── logs
│   ├── project
│   ├── public
│   ├── target
│   └── test
└── target
    ├── global-logging
    └── task-temp-directory

とりあえず、ここまで