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

github.com

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
# 動いた!

反省

今回なぜこの現象が起きたかというと、同じようなアプリケーション名で消したり作ったりしてたので、起きたっぽいです。 サーバーとかコンソールとかちゃんと切らないと次動かすときにプロセスが動いてます的なエラー多いので注意しよう。

参考

ruby on rails console hanging when loading - Stack Overflow

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を解放して繋げるので、セキュリティグループのルールを新しく作成する必要があります。 こんな感じ f:id:mashi-prog:20180611234809p:plain

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)でアクセス f:id:mashi-prog:20180612000623p:plain パスワードログイン! これで完了!

参考

qiita.com

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で実行します。
画像みたいな感じで学習が進めば成功です! f:id:mashi-prog:20180609125116p:plain 次回はMNISTのサンプルコードを見てみたいと思います。

参考

qiita.com

takemikami.com

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へのVirtualBoxVagrantは適当に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)

f:id:mashi-prog:20180609105713p:plain こんな感じの出力がされたらOKです。