vue+firebase+datepickerでめちゃくちゃハマった
概要
Vue+firebaseで簡単なWebアプリケーション作成中に、Datepickerで選択しようとした時にハマった話
原因
Firebaseには日付型が保存できない。
対策
文字列で保存する。
/* newTodo: { name: '', task: '', selectedDate: new Date('2019/01/01') } */ // firebaseに保存する前に文字列に var saveDate = newTodo.selectedDate.toDateString()
めちゃくちゃ簡単なことに非常に時間を取られてしまった・・・
原因2
vue-material(https://github.com/vuematerial/vue-material)を使用しているのですが、特定バージョンでmd-datepickerをしようするとduplicate errorが出て保存されないみたいです。
参考
https://github.com/vuematerial/vue-material/pull/1379 fix(MdDatepicker): duplicate keys by Samuell1 · Pull Request #1379 · vuematerial/vue-material · GitHub
GAE+FlaskでHello, world!
概要
最近GAEとFlaskの勉強をし始めようと思ったのでその備忘Log とりあえずハローワールドまで。
GAEについて
Google App Engineの略で、Google Cloud Platformで利用できるPasSの一つ。
インフラの管理を担ってくれるので、アプリケーション開発に集中することができるというのが一番のメリットです。
PythonのフレームワークであるFlaskを用いて、簡単なAPIサーバを構築します。
ディレクトリ構造
GAEの設定ファイルとFlaskのファイルのディレクトリ構造です。
ディレクトリ構造
app_dir/ アプリケーションのディレクトリ - main.py メインスクリプト - app.yaml GAEの設定ファイル - lib/ ライブラリのディレクトリ(GAEでサードパーティライブラリを使用する場合は必須) - appengine_config.py libを読み込ませる - requirements.txt ライブラリ管理テキスト
SampleApp実装
python3系を使います
app.yaml
runtime: python37 handlers: - url: /.* secure: always script: auto
main.py
from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return 'hello world!', 200 if __name__ == '__main__': app.run()
アクセスすると'hello world!'と返す簡単なWebアプリケーションをFlaskで作って見ましょう(なんとこれだけでハローワールドが完成!)
appengine_config.py
from google.appengine.ext import vendor vendor.add('lib')
libディレクトリを読み込むことを示すPythonファイルです。
pip install -r requirements.txt -t lib
libディレクトリにライブラリをインポートします。
ローカル環境でのテスト
GAEでは通常、
dev_appserver.py app.yaml
コマンドによってローカルでサーバーのテストを行えるのですが、Python3系は未対応なので行えません。
ですので通常のPythonサーバーを立ち上げ、テストを行います。
python main.py
http://localhost:5000/にアクセスし hello world!が表示されるか確認します。
デプロイ
ローカルで挙動を確認後、デプロイを行います。
glocud app deploy app.yaml # 2回目以降はapp.yamlは不要 Services to deploy: descriptor: [/任意のディレクトリ/app.yaml] source: [/任意のディレクトリ] target project: [GCPプロジェクトID] target service: [サービス名] target version: [20181230] target url: [https://サービス名-dot-GCPプロジェクトID.appspot.com] Do you want to continue (Y/n)?Y ... Updating service [サービス名]...done. Setting traffic split for service [サービス名]...done. Deployed service [サービス名] to [https://サービス名-dot-GCPプロジェクトID.appspot.com] You can stream logs from the command line by running: $ gcloud app logs tail -s サービス名 To view your application in the web browser run: $ gcloud app browse -s サービス名
GAEはデプロイに時間がかかるイメージです。
この程度のアプリでも3分程度かかる時もあります。
最終行の
gcloud app browse
によって自分のサービスをブラウザからアクセスできます。 次回は今回簡単に立ち上げたAPIを拡張していきます。
Rails consoleが動かない
Rails Tutotrial中にrails consoleが動かなくなり、ググったのでその時の概要と対策です。
概要
rails c # 何も反応しない bundle exec rails c # 当然何も反応しない
探してみる
rails consoleが裏で動いているのかなと思い、プロセスを探して見ました。
ps aux | grep rails vagrant 21566 0.0 0.0 12492 684 pts/0 R+ 06:16 0:00 grep --color=auto rails # 見つからない
ググってみる
rails consoleを動かすと、springというプロセスが一緒に走るらしいので、それを探して見ました。
ps aux | grep spring # 発見!!! kill -9 15304 # springプロセスをキル rails c # 動いた!
反省
今回なぜこの現象が起きたかというと、同じようなアプリケーション名で消したり作ったりしてたので、起きたっぽいです。 サーバーとかコンソールとかちゃんと切らないと次動かすときにプロセスが動いてます的なエラー多いので注意しよう。
参考
AWS に Anaconda + Python3 + jupyter notebook + keras/tensorflow環境導入
概要
そもそもjupyter をAWSに入れればいいんじゃねと思った時の備忘録です。
環境は以下
MyPC
・macOS High Sierra 10.13.4
・VirtualBox 5.2.1
・Vagrant 2.0.4
AWS
・CentOS7
・Anaconda3-5.2.0
・Python3.6.5(Anaconda経由でインストール)
機械学習ライブラリ
・tensorflow-1.8.0
・keras 2.2.0
AWSアカウントとEC2インスタンスの作成
もともとAWSアカウントは持っていたので割愛。
AWS EC2でWebサーバーを構築してみる - Qiita
こちらとか参考になります。 注意点としてjupyter notebookを立ち上げる際に、ポート8888を解放して繋げるので、セキュリティグループのルールを新しく作成する必要があります。 こんな感じ
SSHの設定
自分のPCからAWSインスタンスに簡単にアクセスするために、SSHの設定を行います。
MyPC上で設定
Host deep-dev(エイリアスの作成、任意のホスト名) hostname ec2------.us-west-2.compute.amazonaws.com(EC2) identityfile ~/.ssh/----.pem (AWSで発行した鍵) user cents(ログインユーザー)
# SSH接続
ssh deep-dev
これを~/.ssh/configに記述することで、SSH接続が簡単にできるようになります。
ソフトウェアインストール
sshでインスタンスに繋がったらいよいよ各種パッケージのインストールです。
AWSインスタンスで設定
# yumのアップデート sudo yum update # 色々インストール sudo yum -y install git vim gcc gcc-c++ python-setuptools python-devel postgresql-devel
Anacondaのインストール
# anacondaのバージョン確認 pyenv install -l | grep anaconda # 最新版インストール pyenv install anaconda3-5.2.0 pyenv rehash # anacondaをpythonのデフォルトに設定 pyenv global anaconda3-5.2.0 echo 'export PATH="$PYENV_ROOT/versions/anaconda3-5.2.0/bin/:$PATH"' >> ~/.bashrc source ~/.bashrc # condaの更新(これしないとたまにダメ) conda update setuptools
jupuyter notebookの設定
jupyter notebook --generate-config ipython In [1]: from notebook.auth import passwd In [2]: passwd() Enter password: ○○○○ Verify password: ○○○○ Out[2]: 'sha1:○○○○○○○○○○'
出力された'sha1:○○○○'を
vim ~/.jupyter/jupyter_notebook_config.py
... c.NotebookApp.ip = '*' ... c.NotebookApp.open_browser = False c.NotebookApp.port = 8888 # パスワードをコピー c.NotebookApp.password = 'sha1:○○○○'
これでパスワードログインが可能になります。
# jupyter notebookサーバを起動する。 # nohupとつけるとターミナルを閉じてもコマンドを実行してくれる。 nohup jupyter notebook $
最後にローカル側のブラウザからEC2ダッシュボードのパブリックDNSの名前:ポート番号(8888)でアクセス パスワードログイン! これで完了!
参考
CentOS7 に Keras/tensorflow導入
概要
Vagrantで立ち上げたCentOS7にKerasを導入して、サンプルを動かすまでです。
前回記事 mashi-prog.hatenablog.com
環境は以下
ホスト
・macOS High Sierra 10.13.4
・VirtualBox 5.2.1
・Vagrant 2.0.4
ゲスト
・CentOS7
・Anaconda3-5.2.0
・Python3.6.5(Anaconda経由でインストール)
機械学習ライブラリ
・tensorflow-1.8.0
・keras 2.2.0
関連ライブラリのインストール
多分必要となるであろう、ライブラリなどをインストールします。
sudo yum group install "Development Tools" sudo yum install openssl-devel readline-devel zlib-devel bzip2-devel
tensorflow/kerasの設定
作業ディレクトリの作成、anacondaでの環境の作成を行います。
# 作業ディレクトリの作成 mkdir ~/tensorflow-test && cd $_ # condaで環境の作成 conda create -n tensorflow source activate tensorflow pyenv local anaconda3-5.2.0 (set by /home/vagrant/.pyenv/version) # version指定の確認 pyenv versions system anaconda3-5.2.0 * anaconda3-5.2.0/envs/tensorflow (set by /home/vagrant/tensorflow-test/.python-version)
tensorflowとkerasをインストールします。
conda install -c condo-forge tensorflow
pip install keras
サンプルコードの実行
前回紹介したjupyter notebook でサンプルコードを実行してみましょう。
# env tensorflowにはjupyter がないため、インストール conda install jupyter # jupyter 起動 jupyter notebook --no-browser --ip=0.0.0.0
前回と同じように、ホストのブラウザからアクセスしてみます。
http://192.168.33.10:8888/(環境によってアドレスは異なります。)
New -> Python3からノートブックを作成して、MNISTのサンプルコードを実行してみましょう。
import keras from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Dropout from keras.optimizers import RMSprop batch_size = 128 num_classes = 10 epochs = 20 # the data, shuffled and split between train and test sets (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train = x_train.reshape(60000, 784) x_test = x_test.reshape(10000, 784) x_train = x_train.astype('float32') x_test = x_test.astype('float32') x_train /= 255 x_test /= 255 print(x_train.shape[0], 'train samples') print(x_test.shape[0], 'test samples') # convert class vectors to binary class matrices y_train = keras.utils.to_categorical(y_train, num_classes) y_test = keras.utils.to_categorical(y_test, num_classes) model = Sequential() model.add(Dense(512, activation='relu', input_shape=(784,))) model.add(Dropout(0.2)) model.add(Dense(512, activation='relu')) model.add(Dropout(0.2)) model.add(Dense(num_classes, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer=RMSprop(), metrics=['accuracy']) history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test)) score = model.evaluate(x_test, y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1])
Shift + Enterで実行します。
画像みたいな感じで学習が進めば成功です!
次回はMNISTのサンプルコードを見てみたいと思います。
参考
Vagrant + Anaconda + Python3 + jupyter notebook環境導入
概要
Macbook上にVagrantを用いて、Python3の環境導入を行います。
環境は以下
ホスト
・macOS High Sierra 10.13.4
・VirtualBox 5.2.1
・Vagrant 2.0.4
ゲスト
・CentOS7
・Anaconda3-5.2.0
・Python3.6.5(Anaconda経由でインストール)
Mac
MacへのVirtualBoxとVagrantは適当にGUIでインストール
Vagrantfile
VagrantでVitual Machine(VM)を作成するには、設定ファイルであるVagrantfileが必要です。 VMを作成するためのディレクトリを作成して、コマンドを実行
mkdir vagrant_dir cd vagrant_dir vagrant init
これでVagrantfileが作成されます。 次にVagrantfileの編集。
vim vagrant file Vagrant.configure("2") do |config| # Box config.vm.box = "centos/7" # 仮想マシンのネットワーク環境設定 # "private_network"を指定するとホストOSからのみアクセス可 config.vm.network "private_network", ip: "192.168.33.10", auto_config:true config.vm.network "forwarded_port", guest: 8888, host: 8888 # ホスト側とゲスト側で共有するフォルダ。この場合Vagrantfileが存在するフォルダが/var/www/shareになります。 config.vm.synced_folder "./", "/var/www/share" # プロバイダの指定 config.vm.provider "virtualbox" do |vb| # GUI今回は不使用 vb.gui = false # 仮想マシンの名前 vb.name = "CentOS" # メモリ(MB) vb.memory = "2048" # CPU vb.cpus = 2 end end
Boxの追加
Vagrantbox.es (http://www.vagrantbox.es/) からお目当のボックスを探しましょう。
vagrant box add centos7.1 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.1/vagrant-centos-7.1.box
Vagrantの起動
起動します。次回からはこれ以降の手順がスタートです。
# 対象ディレクトリに移動 cd vagrant_dir # 起動 vagrant up #仮想環境へ接続 vagrant ssh
Vagrantのシャットダウン、休止
# シャットダウン vagrant halt # 一時停止 vagrant suspend
CentOS
ここからはゲストOSでの作業になります。
##firewall停止 sudo systemctl stop firewalld sudo systemctl disable firewalld sudo set enforce 0
gitのインストール
sudo yum -y install git
pyenvのインストール
zshを使用している方は bashrcをzshrcで読み替えてください。
git clone https://github.com/yyuu/pyenv.git ~/.pyenv echo 'export PYENV_ROOT="HOME/.pyenv"' >> ~/.bashrc echo 'export PATH="PYENV_ROOT/bin:PATH"' >> ~/.bashrc echo 'eval "(pyenv init -)"' >> ~/.bashrc source ~/.bashrc
anacondaのインストール
# anacondaのバージョン確認 pyenv install -l | grep anaconda # 最新版インストール pyenv install anaconda3-5.2.0 pyenv rehash # anacondaをpythonのデフォルトに設定 pyenv global anaconda3-5.2.0 echo 'export PATH="PYENV_ROOT/versions/anaconda3-5.2.0/bin/:PATH"' >> ~/.bashrc source ~/.bashrc # condaのアップデート conda update conda
Jupyter notebook
jupyter notebookはノートブックと呼ばれる形式で作成したプログラムを実行し、結果を記録しながらデータの分析を行うことができます。
変数の中身を見たり、デバッグをしたりといったことも簡単に行えるので機械学習の際は超お世話になります。
Anacondaをインストールした段階で、勝手にインストールされているので起動してみましょう。
# --ip=0.0.0.0 はlocalhost以外でのアクセスをする場合に必要。 jupyter notebook --no-browser --ip=0.0.0.0 # 起動後はCtrl + c でサーバー停止出来ます。
PC上のブラウザからVagrant上のJupyterへアクセス
Vagrant上のIPアドレスでアクセス
http://192.168.33.10:8888
tokenが必要みたいなことを言われるので、ホストOSで
# Jupiter のlist表示
jupiter notebook list
を実行し、tokenを貼り付ける。
サンプルコードの実行
ブラウザの右上に表示されているプルダウンメニューから New -> Python3 を選んで下記のコードを実行
%matplotlib inline import numpy as np import matplotlib.pyplot as plt x = np.arange(-10, 10, 1) y = np.sin(x) plt.plot(x, y)
こんな感じの出力がされたらOKです。