強欲で謙虚なツボツボ

趣味の読書の書の方

【外付けSSD】MacでDockerイメージを外へ

概要

最近、容量の空きがあと僅かだから整理しろとかいうバッジ通知が頻繁に表示される。
他にも、容量不足だから強制終了させるアプリを選べとかもよく出てくる。
今まではなんとかやれていたけど、どうしても必要なものがあって無理になったから外付けSSDを使ってみることにした。

f:id:taopo:20211021151854p:plain

パンパンでやばい

 

購入物

適当に価格.comで一位だったやつを買った。

【価格.com】外付けSSD | 通販・価格比較・製品情報

評判が一番いいのはSanDiskのエクストリームとかいうやつっぽい。

 

繋げてみる

届いたので早速PCに繋いでみる。

f:id:taopo:20211021151936p:plain

1TB!!

「USB外部物理ボリューム」とならない場合は、一度「消去」をやってからまた繋ぎ直すといいらしい。

Docker Imageの保存先を移そう

なんか色々とdockerでやるようになってから容量がイカれ始めた気がするので、まずはそれを解消するために、イメージの保存場所をSSD内に変更する。
ただ、Docker imageが全部消えてしまうのでそこはやり直さないといけない。

SSD内にdocker_imagesフォルダを作成して、Docker Imageの保存先を変更する。

f:id:taopo:20211021160602p:plain

Preferences > Resources > Advanced > Disk image location

 

Apply & Restartを押してしばらく待つと...

f:id:taopo:20211021162707p:plain

容量が空いた!!

f:id:taopo:20211021162723p:plain

Docker imageの保存場所が作成されてる

 

終わり

めでたく容量を空けることができました。
イメージやコンテナは全部消えてしまうので、また作り直さないといけないけどdockerならすぐにできるね。

せっかく買ったし、外付けSSDUbuntuを入れるとか色々できたら楽しいかも。

はてなブログ(無料版)でGoogleアドセンスを利用してみたい

概要

いつも月間PVが10~20とかだったのに最近は300くらいあったりするし、広告とかやってみるか。
審査があるけど通るかは知らない。とりあえず審査に出すところまでをやってみる。
Googleアナリティクスは結構前に入れてみたが、色々みれてまあまあ面白いかったしアドセンスも面白いはず。

 

公式ヘルプ

公式は正義だ。
審査のコツとか申請してみたとかあるが、公式のヘルプページがあるからそれに従う。

help.hatenablog.com

 

プライバシーポリシー

このページはCookieを利用します的なやつだ。
適当に検索してよさそうなやつをコピペして作った。
無料ユーザーなので推奨されてるサイドバーへのリンク追加だけやった。

プライバシーポリシー - 強欲で謙虚なツボツボ

サイドバーにモジュールを設置する - はてなブログ ヘルプ 

f:id:taopo:20210920131151p:plain

プライバシーポリシーへのリンクをサイドバーに設置

 

Googleアドセンス

公式ヘルプがとても丁寧です。
公式以上のものを書けないので補足だけ書きます。

アカウント取得

ページ右上のご利用開始をクリック。
サイトのURLは無料版なら「xxx.hatenablog.com」ですかね。僕は「taopo.hatenablog.com」です。

Google AdSense - ウェブサイトを収益化

審査の申請

進むとGoogleアドセンスのホームが表示されます。
「お支払い」と「サイト」が必須になっているので入力します。

f:id:taopo:20210920132813p:plain

Googleアドセンスのホーム画面(ブックマークしておくといいかも)

f:id:taopo:20210920133905p:plain

設定したら審査中になった

 

終わり

アドセンスの登録はそんなにやることなくて簡単だった。
調べながら1時間くらいで終わった。
申請通ったら面白いけど、1円でも出たら確定申告することが増えて面倒そうだからすぐやめるかも。

追記: 2日待ったら審査通ってました。

プライバシーポリシー

プライバシーポリシー

個人情報の利用目的

当ブログでは、お問い合わせや記事へのコメントの際、名前やメールアドレス等の個人情報を入力いただく場合がございます。
取得した個人情報は、お問い合わせに対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、これらの目的以外では利用いたしません。

広告について

当ブログでは、第三者配信の広告サービス(Googleアドセンス)を利用しており、ユーザーの興味に応じた商品やサービスの広告を表示するため、Cookieを使用しております。
Cookieを使用することで当サイトはお客様のコンピュータを識別できるようになりますが、お客様個人を特定できるものではありません。

Cookieを無効にする方法やGoogleアドセンスに関する詳細は「広告 – ポリシーと規約 – Google」をご確認ください。

アクセス解析ツールについて

当ブログでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しております。トラフィックデータは匿名で収集されており、個人を特定するものではありません。

 

お問い合わせについて

お問い合わせは当ブログ著者のTwitterアカウントへのDMやリプライをご利用ください。

ぢ (@pvYuWQykF52nTNy) | Twitter

【selenium + headless-chrome + docker】動かしてみる

概要

webのスクレイピングなどの自動操作でchromeseleniumで動かそうとしたけど、chromeのバージョンに合わせてドライバーを選ばないといけないからPCによって動かなかったりchromeの更新で動かなかくなったりする。
Dockerを使えばイメージを作成した時から環境が変わることもなくて、そういう面倒なことを解消できそうなのでやってみることにした。
サーバや仮想環境内でchromeとか動かせるのかと思っていたけど、調べてみるとheadless-chromeというのでブラウザーのUIを出さずに実行できるらしい。

developers.google.com

 

やったこと

  • Docker Desktop for Mac をインストール
  • Dockerfileを作成
  • コンテナ内で実行するpythonファイルを作成

以下の記事を参考に(コピペ)して起動したdockerのコンテナ内でchromeを実行する。
記事ではubuntu16.04だったが18.04でやった。
あと、いろいろエラーが出たので対応した。

qiita.com

 

Docker Desktop for Macをインストール

チップがintel製かApple製かで間違えないように。
「このMacについて」のプロセッサを見るとintelとか書いてある。
最近のだとApple製のM1チップというのが使われているらしい。

Install Docker Desktop on Mac | Docker Documentation

 

Dockerfileを作成(エラー対応)

適当なディレクトリを作成してDockerfileを記述。
まずは、上であげた参考記事のDockerfileをそのまま使う

From ubuntu18.0.4
# ... 略 ...
RUN groupadd -g 1000 developer && \
    useradd  -g      developer -G sudo -m -s /bin/bash 作成したいユーザー名 && \
    echo '作成したいユーザー名:そのパスワード' | chpasswd
# ... 略 ...
User 作成したいユーザー名
# ... 略 ...

dockerのイメージを作成するとエラーが出た。

docker build -t 任意のイメージ名 .

f:id:taopo:20210818134238p:plain

エラーログの上の方

f:id:taopo:20210818134352p:plain

エラーログの最後

どうやらpythonのdistutilsというモジュールがないらしいのでDockerfileに追記。

    # apt-get update && \ の下
    apt-get install -y python3 curl python3-distutils && \

再度docker buildをするとまたエラーが出た。

f:id:taopo:20210818134830p:plain

エラーログの最後

どうやらwgetというのがないらしいのでDockerfileに追記。

    # apt-get update && \ の下
    apt-get install -y wget && \

再度docker buildをするとまたエラーが出た。

f:id:taopo:20210818135100p:plain

エラーログの最後

どうやらunzipというのがないらしいのでDockerfileに追記。

    # apt-get update && \ の下
    apt-get install -y unzip && \

再度docker buildをするとまたエラーが出た。

f:id:taopo:20210818135234p:plain

エラーログの最後

どうやらchromeをインストールするのに必要なパッケージが足りていないらしいのでDockerfileに追記。

    # touch /etc/default/google-chrome && \ の上
    apt-get install -y libatk-bridge2.2-0 libatspi2.2-0 libgbm1 libgtk-3-0 libxkbcommon0 && \

再度docker buildをするとイメージ生成が成功した。

f:id:taopo:20210818135553p:plain

dockerイメージの生成に成功

最終的なDockerfile。不要なパッケージのインストールもあるかもしれない

FROM ubuntu:18.04

# Install.
RUN \
  apt-get update && \
  apt-get install -y wget && \
  apt-get install -y unzip && \
  apt-get install -y python3 curl python3-distutils && \
  curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \
  python3 get-pip.py && \
  pip install --upgrade pip && \
  pip install selenium && \
  pip install beautifulsoup4 && \
  apt-get install -y libfontconfig && \
  mkdir -p /home/root/src && cd $_ && \
  wget -q -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip && \
  unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/ && \
  apt-get install -y libappindicator1 fonts-liberation libasound2 libnspr4 libnss3 libxss1 lsb-release xdg-utils && \
  apt-get install -y libatk-bridge2.0-0 libatspi2.0-0 libgbm1 libgtk-3-0 libxkbcommon0 && \
  touch /etc/default/google-chrome && \
  wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && \
  dpkg -i google-chrome-stable_current_amd64.deb && \
  apt-get install -y fonts-migmix

RUN apt-get install -y sudo

# add sudo user
RUN groupadd -g 1000 developer && \
    useradd  -g      developer -G sudo -m -s /bin/bash 作成したいユーザー名 && \
    echo '作成したいユーザー名:作成したいパスワード' | chpasswd

RUN echo 'Defaults visiblepw'          >> /etc/sudoers
RUN echo '作成したいユーザー名 ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

# Set japanese
RUN apt-get install -y language-pack-ja-base language-pack-ja
RUN locale-gen ja_JP.UTF-8

# Set environment variables.
ENV LANG ja_JP.UTF-8
ENV PYTHONIOENCODIND utf_8

USER 作成したいユーザー名

# Define default command.
CMD ["/bin/bash"]

 

コンテナ内で実行するpythonファイルを作成

適当にmain.pyというのを作る。

f:id:taopo:20210818140039p:plain

ファイルの場所(どこでもいい)
# main.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=options)
driver.get('https://www.google.com')
print(driver.title)

これをdockerコンテナ内で実行するとhttps://www.google.comのタイトルタグ、つまりGoogleと表示されるはず。

さっき作成したイメージからコンテナを起動。

docker run --privileged -v "Dockerfileを作成したディレクトリのパス:/home/Dockerfileに記述した作成したいユーザー名" -ti 作成したイメージの名前

Dockerfileで作成したユーザー(今回はotam)があって、-vで指定したホスト側のディレクトリがボリュームされている。
そして、pythonファイルを実行するとGoogleと表示されるので正常にselenium + headless-chromeが動作していることがわかる。

f:id:taopo:20210818140718p:plain

main.pyを実行するとGoogleと表示される

 

終わりに

とりあえず良さそうで安心した。
次はログインとかCookieを保存してリクエスト結果を見たりしてみたい。

【EC2 + nginx + laravel】nginxとphp-fpmの設定

概要

EC2インスタンス上にnginxとphpを入れてgitに上がっているlaravelプロジェクトをブラウザで確認したい。
EC2はAmazon Linux 2を使う。

なんかhtmlは見れるけどphpは見れないみたいなこともあったから書き残しておく。(→ここ

 

やること

  1. nginxをインストールしてnginx.confを編集
  2. laravelのサーバ要件を満たすようにphp及びphp拡張をインストール
  3. php-fpm.d/www.confを編集
  4. composerをインストール
  5. gitをインストール
  6. laravelの.env編集とマイグレーション
  7. nginxとphp-fpmを起動
  8. ブラウザで確認

 

はじめに

いつもの。rootユーザーに切り替えてやる。

sudo su -
yum update

 

nginxをインストールしてnginx.confを編集

インストール。

amazon-linux-extras install nginx1

nginx.confを編集。
/etc/nginx/nginx.conffastcgi_passでphp-fpm.sockとしていたらhtmlにアクセスできるのにphpだとサーバーエラーとなった。
確認したら/run/php-fpmにはwww.sockがあるだけだったのでそれに合わせたらちゃんとphpも見れるようになった。

server {
    # ...略...
    root /var/www/laravelのプロジェクト/public;
    index index.php index.html index.htm;
    
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    
    location ~ \.php$ {
        fastcgi_pass    unix:/run/php-fpm/www.sock; # php-fpmディレクトリにあるsockに合わせて
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include         fastcgi_params;
    }
    
    error_page 404 /404.html;
    location = /40x.html {
        root /usr/share/nginx/html; # 40x.htmlがあるディレクトリのパス(上の方のrootを上書き)
    }
    
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html; # 50x.htmlがあるディレクトリのパス(上の方のrootを上書き)
    }
    # ...略...
}

 

laravelのサーバ要件を満たすようにphp及びphp拡張をインストール

インストール。

amazon-linux-extras install php7.4

php拡張をインストール。

# 必要なphp拡張を確認(https://runebook.dev/ja/docs/laravel/docs/8.x/installation#server-requirementsphp -m | grep -e bcmath -e PDO -e ctype -e fileinfo -e json -e mbstring -e openssl -e pdo -e tokenizer -e ^xml$
# インストール
yum install php-bcmath php-mbstring php-xml -y

 

php-fpm.d/www.confを編集

以下の部分を探して編集。

user = nginx
group = nginx
location.owner = nginx
location.group = nginx
location.mode = 0660

 

composerをインストール

以下のsudo mv composer.phar /usr/local/bin/composerまでやればいい。

getcomposer.org

 

gitをインストール

httpでもsshでも好きなようにgitを使えばいい。個人的にはsshの方が好き。

yum install git
cd /var/www
git clone laravelプロジェクトをあげたgitリポジトリ

 

laravelの.env編集とマイグレーション

DB設定を.envに記述する。DBほにゃららを設定する。EC2使ってるなら多分RDSだと思う。

マイグレーション。(あれば)

php artisan migrate

 

nginxとphp-fpmを起動

起動。

systemctl start nginx
systemctl start php-fpm

インスタンスを停止して起動した時に自動でnginxとphp-fpmが起動するようにする。

systemctl enable nginx
systemctl enable php-fpm

実行状態を確認。

systemctl status nginx
systemctl status php-fpm

 

ブラウザで確認

ブラウザでIPにアクセスすればLaravelプロジェクトのpublic/index.phpにアクセスされるので確認できる。

【AWS EC2】ssh接続ユーザーの作成とec2-userの削除

概要

毎回、インスタンスを作成するたびに調べてやっていたのでもう調べないという決意を込めての記録

デフォルトでec2-userというユーザーが作成されているが、セキュリティを強化するために別にユーザーを作成してデフォルトのは消す。
よくある初回ログイン時に初期パスワードを変更するみたいなノリ。

 

手順

手順というほど大したものはない。

  1. ec2-userでssh接続してrootユーザーに切り替え
  2. ユーザー作成と権限設定
  3. ~/.sshディレクトリをコピーして権限設定
  4. 作成したユーザーで再度ssh接続
  5. rootユーザーに切り替えてec2-userを削除

 

ユーザー作成

# ssh接続
ssh -i "keypairのパス" ec2-user@ec2インスタンスのip
# rootユーザーに切り替え
sudo su -
# ユーザー作成
adduser new-user
# ユーザーのパスワード設定(このユーザーでrootユーザーに切り替えるときに使う)
passwd new-user
# root権限をもつグループに追加
usermod -aG wheel new-user

確認

# new-userディレクトリが作成されている
ls /home
# new-userがwheelグループに追加されている
less /etc/group | grep wheel

 

sshディレクトリ設定

# ec2-userの.sshをnew-userへコピー
cp -r /home/ec2-user/.ssh /home/new-user
# 所有者を変更
chown -r new-user:new-user /home/new-user/.ssh
# パーミッションを変更
chmod 700 /home/new-user/.ssh
chmod 600 /home/new-user/.ssh/authorized_keys

確認

# sshディレクトリがdrwx------、authorized_keysが-rw-------
ls -la /home/new-user/.ssh

 

ec2-user削除

# ssh接続
ssh -i "keypairのパス" new-user@ec2インスタンスのip
# rootユーザーに切り替え(passwdで設定したパスワード)
sudo su -
# ec2-user削除
deluser ec2-user

確認

# ec2-userが削除されている
ls /home
# ec2-userでssh接続できない
ssh -i "keypairのパス" ec2-user@ec2インスタンスのip

 

終わり

大したことではないけどよくやるからちゃんと覚えておこう。

他に作業ユーザー作るときはちゃんとssh-keygenして公開鍵をauthorized_keysにコピーして使おう。

【WSL2+Docker+GPU】機械学習のために環境構築を~仮想環境編

あらすじ

機械学習の勉強のためにいろいろな環境を作れるようにしようということで、前回までに最新のwindows OS ビルドやWSLをインストールしてきた。
今回はDockerを使って仮想環境をつくる。

 

今回の登場物とそのバージョン

  • Docker Desktop for Windows 3.5.2
  • NGC pytorch:21.06-py3

 

流れ

windows作業編:1~3(前回
仮想環境編  :4~5(今回)

  1. windows10 build 20150(以上)をインストール
  2. NVIDIA Drivers for CUDA on WSL
  3. CUDA Toolkitをインストール
  4. Docker Desktop for Windowsをインストール
  5. NGCコンテナを動かす

 

Docker Desktop for Windowsをインストール

macではよく使ったけどwindowsは初めてやる。
インストール後、再起動すると立ち上がるのでチュートリアルとかをやろう。

Dockerコンテナはいろいろインストールして環境構築済みのPCとでも思っておけばいいかもしれない。ミスったと思ったら簡単に消せるところがいいね。
Dockerイメージはコンテナの設計書と考えておけばいい。

www.docker.com

 linux上にdockerやCUDAをインストールしてもいい

Docker Desktopがあるのでやらなくてもいいけど、別にもやり方があるというだけ。
正直、dockerを学びたいわけではないのでCUIGUIでやりやすい方を選ぶといい。
なのでやりかたは省略。

Dockerの設定

日本語にしない方が分かりやすいと思う。
最初から設定がほとんどされていたからあまりすることは無かった。

docs.docker.com

f:id:taopo:20210715000151j:plain

docker run --rm -it --gpus=all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark

↑ の実行結果。こんな感じに表示されていれば問題ないらしい。


NGCNVIDIA GPU Cloud)コンテナを動かす

カタログサイトを見るとなんだかたくさん種類があるが、おススメは左上の法則よりPyTorchを選んでみる。その隣のTensorFlowが一番人気な気がするけど。

ContainerとかCollectionとか分類もいくつかあるけど基本コンテナしか使わなそう。

ngc.nvidia.com

とりあえず、先にフォルダだけ作っておく。
wslを起動すると/mnt/c/Users/userとかいう場所にいるが、/mnt配下でdockerするのが良くないとのことなので、適当に/home/user/pythorchというフォルダを作った。
適当にtest.txtみたいなファイルも作って/pytorch下に置いておくと後で確認しやすい。

Best practices

To get the best out of the file system performance when build-mounting files, we recommend strong source code and other data that is bind-mounted into Linux containers (i.e., with docker run -v <host-path>:<container-path> ) in the Linux file system, rather than the Windows file system. You can also refer to the from recommendation Microsoft.

・  Linux containers only receive file change events (“inotify events”) if the original files are stored in the Linux filesystem. For example, some web development workflows rely on inotify events for automatic reloading when files have changed.

・  Performance is much higher when files are bind-mounted from the Linux filesystem, rather than remoted from the Windows host. Therefore avoid docker run -v /mnt/c/users:/users (where /mnt/c is mounted from Windows).

・  Instead, from a Linux shell use a command like docker run -v ~/my-project:/sources <my-image> where ~ is expanded by the Linux shell to $HOME.

If you have concerns about the size of the docker-desktop-data VHDX, or need to change it, take a look at the WSL tooling built into Windows.

If you have concerns about CPU or memory usage, you can configure limits on the memory, CPU, Swap size allocated to the WSL 2 utility VM.

To avoid any potential conflicts with using WSL 2 on Docker Desktop, you must uninstall any previous versions of Docker Engine and CLI installed directly through Linux distributions before installing Docker Desktop.

コマンドをコピペして実行。
待ってる時間にPyTorchの使い方とかを調べておくといい。

※Docker Desktopを起動した状態でdockerコマンドを実行すること。起動してないとdockerコマンドはありませんとエラーになる。

docker pull nvcr.io/nvidia/pytorch:21.06-py3
# ...
# 実行結果
Status: Downloaded newer image for nvcr.io/nvidia/pytorch:21.06-py3
nvcr.io/nvidia/pytorch:21.06-py3

f:id:taopo:20210715111038j:plain

ちゃんとImageができてる

コピペと変えた部分

  • local_dir:さっき作ったpytorchフォルダを指定
  • container_dir:/workspaceが作業ディレクトリっぽかったので、その配下にpytorchを置く。(-v は自分のPCと仮想環境のどのフォルダをコピーするか的なノリ)
  • --name pytorch:コンテナに名前を付ける。なくてもいいけど見やすくなる。
  • 21.06:選んだバージョン
docker run --gpus all -it --rm -v /home/user/pytorch:/workspace/pytorch --name pytorch nvcr.io/nvidia/pytorch:21.06-py3

f:id:taopo:20210715115006j:plain

コンテナが起動した。環境構築済みのPCにログインした的な感じ。

ちゃんと/workspaceにpytorch/test.txtがある。

 

自分のPC側でtest.txtを編集保存すると、コンテナ側のtest.txtに編集が反映される。
また、その逆も同様。
今後はホスト側で実装して、それをコンテナ側で実行することでGPUで処理を行うことができる。なので、一応これで環境構築としては完了。

※コンテナ内に全てあるので自分のPCにpythonをインストールする必要すらない。
ただ、エディターでwarningは表示されるかも。

f:id:taopo:20210715115755j:plain

Docker Desktopにも表示されている

 

おわり

これで機械学習のための環境構築ができたと思う。というよりもdockerを使うための準備だったと言えそう。
バージョン管理や依存関係に悩まされることなくやっていけそう。飽きてもdockerのcontaier, imageを削除したらきれいさっぱり元通りにできる。
仮想化っていいね。

 

おまけ

PytorchにしろTensorflowにしろ、使い方はそれぞれの公式チュートリアルをやって覚えようと思う。
当面は買った本の写経をして、そのあとにそれをPytorchで書き換えるようにしよ。
先はまだ長そう。