/var/log

技術ネタ多めで思ったことを書きます。※内容は個人の発言であり、所属する組織を代表するものではありません。

ASUS Chromebook C434TA を手に入れた

背景

学生時代からずっとMacを使ってきましたが、 仕事柄もっとクラウドを有効活用したいと思うようになったので ChromebookGCPでいこうという試みです。 OSにとらわれず、環境に囚われず。。。というのが理想です。

マシン構成など

マシン

ASUS Chromebook C434TA

ASUS Chromebook Flip C434TA | 2-in-1 製品 | ASUS 日本

選定理由としては以下になります。 (本当は米国Amazonから直輸入すればよいのかもですが 初のChromebookということもありヒヨリました)

  • サポートが最低でも2024年までは続くこと
  • RAMが4GBではなく、8GBであること
  • タッチパネルであること
  • 国内で手厚いサポート(主に修理)ができること

OS

Google Chrome OS
バージョン: 75.0.3770.129(Official Build) (64 ビット)

※2019/07/12時点でOSアップデートを行いました。

アカウント

Gmailのアカウントを2つ使ってます。 一つは普段の生活で使っているアカウント、もう一つは開発などを行う際に使うアカウントです。 ON/OFFを切り替える。。。という意味もありますが、このあたりは好みかと。

Chromebookの場合、ログイン中に他のアカウントへの切り替えも簡単にできるので ちょっと面倒ですが、まぁ使えなくはないといった感じです。

追加APL

Play Storeに対応しているので、とりあえず使いそうなものを各アカウントでインストールしました。

UdemyとかCourseraはChromeブラウザから利用できるので要らないかも。 ブラウザで出来るものは、ブラウザを使う方が世界観として正しい?

開発環境(Python)

ネットワークに接続していないときに完全に文鎮になるのが嫌なので Linux(Crostini)を有効にしてローカルにも開発環境を構築中。 当面はPython使いになると思うので、以下の手順でPython3.7をインストールしてみた。

git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
source .bash_profile

sudo apt-get install gcc
sudo apt-get install make
sudo apt-get install zlib1g-dev
sudo apt-get install build-essential checkinstall
sudo apt-get install libreadline-gplv2-dev libncursesw5-dev libssl-dev \
    libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev
sudo apt install libffi-dev

pyenv install 3.7.3
pyenv versions
pyenv global 3.7.3
python --version

これで、3.7.3を表示されたら完了です。 DeepLearning系の実験をしたりを考えるとAnacondaでも良かったかもですが GoogleColab.などもあるので今回は見送りました。

IDEはとりあえず最近よく使ってるvscodeを入れる。 CrostiniなのでLinux的な手法であればインストールはできるとふんだ。

こちらの記事を参考にインストールする。

ChromebookでもVisual Studio Code を使おう - Satsangah - Medium

curl -L "https://go.microsoft.com/fwlink/?LinkID=760868" > vscode.deb
sudo apt install ./vscode.deb

これで「Linuxアプリ」にもVisualStdioCodeが入っていることが確認できる。

f:id:ambitious-kuromame:20190712025041p:plain

CloudShellでPython3をインストールしてみる。

目的

CloudShellにCodeEditorなるGUIエディタがあることを知った。 ベータ版とはいえ、Eclipseのプロジェクトが元になっているらしいので、これ使えないかな? 諸事情があってブラウザで開発が完結する環境がほしかったのでPython環境を整える。 (まずは使ってみるの精神)

手順

CloudShellは裏はおそらく何某かのコンテナだと思います。 Debianとはいえ、apt-getなどでソフトを入れると接続するたびに内容が消えてしまう。 /homeはpersistentディスクとして提供されているので、ここにインストールする必要があると考えた。

実際、StackOverFlowでも同じ話があった。

stackoverflow.com

これを参考にすると、定番のpyenvを使ってインストールするのが良さそうだったので。 pyenvを使ってPython3.7.3をインストールしてみた。 インストール手順、そのものは公式のGitに手順が乗っているのでそちらを参考にした。

https://github.com/pyenv/pyenv#installation

$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
$ source .bash_profile
$ pyenv install 3.7.3
$ pyenv global 3.7.3

なにか動かしてみる。

flaskでHello World的なものを使って動かしてみる。

pip install flask

CodeEditorを使って以下のコードを作成する。

from flask import Flask

app = Flask(__name__)

@app.route("/")
def home():
    return "Hello, World!"
    
if __name__ == "__main__":
    app.run(debug=True)

こんな感じで実行すると待受ポートがわかる。 あとは、「ウェブでプレビュー」を使って、動作確認をする。

$ python main.py                                                 
 * Serving Flask app "main" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 198-418-586

まとめ

CloudShell関連の機能をつかって無料の範囲で簡単な開発はできることがわかった。

感想としては業務の基幹システムを作るわけではないので個人レベルなら、まぁありかなと思いました。 マイクロサービスアーキテクチャの考え方に従って、サービスを細かく作るなら世界観なら悪くない気がします。 あとはDBとか外部のI/Fまわりをローカルで開発するときにどうするのか?など、あるある話をどうするかですね。 クラウドの時代、それすらもOn DemandでVM作るなり、GAEのようなPaaSを使えば良いので本質ではないか。

GitHubで100MBを超えるファイルを。

GitHubで100MBを超えるファイルを扱う

職場がまだSVNを使っているので長らくGitも触ってなかったのですが、

諸事情でいろいろとGitHubにコードを公開・非公開で管理したい理由ができて来ました。

本来はコードをアップロードするのでそんな大きなファイルを上げることは滅多に無いのですが ふと大きなファイルをアップロードしようとしたらできなかったので対策。

Mac

システム全体で有効にするまで。

brew install git-lfs
git lfs install
git lfs init --system

Windows

システム全体で有効にするまで。

https://git-lfs.github.com/

からダウンロードして

git lfs install
git lfs init --system

GCP de Kaggleの事始め

GCP de Kaggleの事始め

DeepLearning系の資格も一通り取得したのでKaggleに本格参戦するため、GCPを使っていこうと思います。

なぜGCPかというと、BigQueryを将来的に使いたいからです。 このあたりはAWSより優れていると思ってます(AWSも好きなサービスではあるのですが)。 近いうちにGCPの資格も取得しようと思ってますので、もし取得出来たら感想でも書こうかと思います。

環境構築の方法とコマンドのメモを残そうと思います。

環境構築

以下を参考にしました。

qiita.com

qiita.com

無料枠のまま、何もしないとGPUが使えないのでGPU(All Region)が使えるように申請を出すのがポイントでした。 リージョンごとの設定も必要ですが、この全体設定的なやつが盲点でした。 何も知らないで申請したらデプロイに失敗して、はて?と思って時間を浪費しました。。。

コマンド

※随時追加していきます。

# インスタンス一覧
gcloud compute instances list

# 電源ON
gcloud compute instances start --zone us-west1-b kaggle-base-vm

# 停止
gcloud compute instances stop --zone us-west1-b kaggle-base-vm

# VMにsshで接続(VM名がkaggle-base-vmで、デフォルトリージョンに存在する場合)
gcloud compute ssh kaggle-base-vm

# Docker Build(イメージを作る時)
# Dockerfile等は同じディレクトリにある。
docker build ./ -t kaggle_baase

# コンテナ起動(projectをmount状態で起動)
mkdir project
docker run --runtime=nvidia -p 8888:8888 -d -v ~/project:/root/user/project --name test kaggle_base /sbin/init

# コンテナ状態確認
docker ps

# コンテナ接続
docker exec -it test /bin/bash

# JypyterNoteBook起動@コンテナ
cd project
mkdir code data
jupyter notebook --ip=0.0.0.0 --port 8888 --allow-root

# 手元のPCからJupyterNoteBookに接続(Windowsだと-N -f -Lの-fは不要だった)
gcloud compute ssh "kaggle-base-vm" -- -N -L 28888:localhost:8888

Dockerコンテナが消えた!?

事件です。

Windowsをアップデート(1709)したら、 DockerDesktop(Windows)でMobyLinuxVMがHyper-Vに登録されなくなりました。

リセットで、MobyLinuxVM自体が消えるとは思いもせず。。。

原因

どうもHyper-VにMobyLinuxVMを登録するときに問題が発生しているようで。 以下のようなエラーが出力されるようになりました。

Unable to create: ユーザー設定変数 "ErrorActionPreference" または共通パラメーターが Stop に設定されているため、実行中のコマンドが停止しました。Inconsistent parameters PolicyStore PersistentStore and Dhcp Enabled

対策

最近は英語圏でも調査したほうが沢山情報があると思ってるので、本家のStackOverFlowなどで調査しました。 結果的に有効なのはCiscoAnyConnectを停止してDockerを起動することでした。 VPN接続のために使っている(使わされている)のですが、どうにも相性が悪いらしく。 CiscoAnyConnectが停止中はDockerが元気になります。 DriveShareも動くようになりました。

例えばこんな感じで停止させて。

$services = @("nam","namlm","vpnagent")

foreach($service In Get-Service $services | Where-Object {$_.status -ne "stopped"}){
    Stop-Service $service
}
echo "`r`n<<<  Cisco Any Connect Service Status  >>>"
Get-Service $services | Format-Table -Property DisplayName, Status

例えばこんな感じで起動。

$services = @("nam","namlm","vpnagent")

foreach($service In Get-Service $services | Where-Object {$_.status -eq "stopped"}){
    Start-Service $service
}

echo "`r`n<<<  Cisco Any Connect Service Status  >>>"
Get-Service $services | Format-Table -Property DisplayName, Status

するようなバッチなりを用意するのが良さそうです。

GoogleColab.のタイムアウトを防ぐ

GoogleColabを使っていると以下のルールがあるらしく計算途中に計算結果が失われる模様。

  • 【12時間ルール】新しいインスタンスを起動してから12時間経過
  • 【90分ルール】ノートブックのセッションが切れてから90分経過

12時間ルールは如何ともし難いので以下を参考にして、Chrome拡張機能で凌ぐことにしました。
↓↓↓
https://qiita.com/Gimina_Graph/items/4bdf3e3c3658eeb0eba8

  これでDeepLearningFromScratchの自習が捗るはず。
(PCが貧弱すぎて。。。)