knaka Tech-Blog

AI, IoT, DIYエレクトロニクス, データサイエンスについて投稿予定です。

Laravel 5.6 + Vue.js の設定

index:

概要:

Laravel 5.6で、Vue.js を使用する場合の設定
についてメモです。

=> Vue.component を使用いていないので、
 推奨される方法では無いかもしれませんが
 正常動作を、確認できた部分のみ。記載したいと思います

環境とか

php7.1
Laravel 5.6
Vue.js

インスト

composer.phar create-project --prefer-dist laravel/laravel lara56 "5.6.*"
cd lara56
npm install
npm run dev

設定方法

=> 参考ページで、Vue.component
 を使用した例がありましたが。
bladeの、子テンプレートに Vue.jsを書くと
JSエラーが、出力されたり。回避できなかったので
対策方法みたいな。

・ resources\assets\js\app.js

require('./bootstrap');

=>bootstrap 以外を、削除
vue.js の定義等を、消す

・npm run dev の 再実行。
public\js\app.js が生成されるはず。
vue.js なし。

・ blade ,親template
=> vue.js読みます

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>

resources/views/Layout/base2.blade.php

#
<!DOCTYPE html>
<html lang="{{ app()->getLocale() }}">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- CSRF Token -->
    <meta name="csrf-token" content="{{ csrf_token() }}">
    <title>{{ config('app.name', 'Laravel') }}</title>
    <!-- Styles -->
    <link href="{{ asset('css/app.css') }}" rel="stylesheet">    
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
</head>
<body style="background: #FFF; ">
<!-- conte-mid -->
<div class="container" id="id_main_conte">
    <nav class="navbar navbar-default">
        <a class="navbar-brand" href="{{ url('/tasks') }}">
            タスク一覧
        </a>
        <a class="navbar-brand" href="{{ url('/tasks/create') }}">
            新規作成
        </a>
    </nav>
    <p>[ base2 ]</p>
    <div id="app">
        @yield('content')
    </div>
</div>

<!-- Scripts -->
<script src="{{ asset('js/app.js') }}?A1"></script>
</body>
</html>


・子, template
resources/views/tasks/test2.blade.php
=> Larabel の場合、blade にvue.js の変数( {{name}} みたいな)を書くと、
レンダー時、エラーとなりますが。 @を変数の前につけると。エラーでないようです。
@{{ name }} みたいな。

=>vue.js は、親テンプレで、読み込み
 vue インスタンス(new Vue )を、定義

=> v-for, v-on など、動作確認できました。

@extends('layouts.base2')

@section('title', 'タスク一覧')

@section('content')

    <div class="panel panel-default">
        <div class="panel-heading">
            一覧
        </div>
        <div class="panel-body">
        </div>
    </div>
    <hr />
    <div>
    <!-- vue -->
    <h1>vue test22:</h1>
    <div id="app_test2">
        こんにちは @{{ name }}.<br />
        <ul>
            <li v-for="(item, i) in list" :key="item">@{{ item }}
                <button @click="list.splice(i, 1)">remove</button>
            </li>
        </ul>        
        <!--
        <button @click="addItem">add</button>
        -->
        <button class="btn btn-primary" v-on:click="addItem">登録-2</button>
    </div>
    <!-- -->
    <script>
    var app = new Vue({
        el: '#app_test2',
        data: {
            name: 'World 355',
            message: 'msg, 123',
            counter: 0,
            list: ['Apple', 'Banana', 'Strawberry'],            
        },
        methods: {
            addItem: function() {
                this.list.push('Orange' + (++this.counter).toString())
            }
        },        
    });
    </script>    
@endsection

Github

=> resources 下のみですが。

https://github.com/kuc-arc-f/lara56_vue

raspberry PIで、機械学習インストールのエラー対策

index:

概要

raspberry PIで、久しぶりに機械学習ライブラリを、再構築したのですが。
numpy等のimportエラーが、なかなか回避できず。
対策方法を、メモしたいと思います。
raspbian の問題ではなく、pip3の問題かもしれません。

=> 失敗した日時は。2019/02/02 時点です。

環境

python 3.5.3

linux:
Linux raspberrypi 4.14.34-v7+ #1110 SMP Mon Apr 16 15:18:51 BST 2018 armv7l GNU/Linux

=> raspbianは、少し古めです。
2018-04-18-raspbian-stretch.zip
を、インストしています。

修正の作業

pip3 uninstall scipy
pip3 uninstall pandas
pip3 uninstall matplotlib
pip3 uninstall sklearn
pip3 uninstall numpy

=> 関係ライブラリを、消しておきます。
apt-get で追加されている部分も、削除したほうが。よいかもしれません
dpkg -l で、確認できます。


・追加
=> win作業PCと、ほぼ同じversion
 を追加しておきます。


pip3 install scipy==0.17.0
pip3 install pandas==0.22.0
pip3 install matplotlib==2.1.2
pip3 install scikit-learn==0.19.1

pip3 install numpy==1.13

=> pandas あたりで、numpy 1.16以降の、エラーが出力される
verが、追加されますが。
最後に、numpy 削除し、 numpy 1.13を追加

・上記で、なんとか
エラーが、減少しました。

pi@raspberrypi:~/work/ML/predict_3_price $ python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04)
[GCC 6.3.0 20170124] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> 

・追加分は、古めなので
 新機能を、使用する場合は。問題あるかもしれませんので
 追加対応が、必要な場合もありそうです。

機械学習 + Django WEBアプリの実装

index:

概要

機械学習の機能を、
web フレームワークDjangoで、web実装する内容となります。
機械学習は、前の不動産の家賃の予測機能です。

環境

python 3.5
Django 2.1.5

設定等

・アプリは、test1

ルーティング追加
・test1/urls.py

#
from django.urls import path
from test1 import views

app_name = 'test1'
urlpatterns = [
    path('', views.index, name='index'),
    #pred
    path('predict_input/', views.predict_input, name='predict_input'),
    path('predict/', views.predict, name='predict'),
    path('form_test/', views.form_test, name='form_test'),
]

    


・test1/views.py

from django.shortcuts import render, get_object_or_404, redirect
from django.views.generic.list import ListView

# Create your views here.
from django.http import HttpResponse
from django.template import loader
import numpy as np

#
def index(request):
    return HttpResponse('Hello World ,from test1')
#
def predict_input(request):
    from test1.include.pred_price import  PredPrice
    return render(request, 'test1/predict_input.html')
#
def predict(request):
    if request.method == 'POST':
        from test1.include.pred_price import  PredPrice
        siki_price=request.POST['siki_price']
        rei_price =request.POST['rei_price']
        menseki   =request.POST['menseki']
        nensu     =request.POST['nensu']
        toho      =request.POST['toho']
        #param
        params = {"siki_price" : siki_price
        , "rei_price" : rei_price
        , "menseki" : menseki
        , "nensu"   : nensu
        , "toho"    : toho
        }
        print(params )
        #
        pred =PredPrice()
        model =pred.load_model()
        df = pred.load_data( params )
        price = model.predict(df )
        price_int = np.array( price , np.int32)        
        print( price_int[0] )
#        return HttpResponse('predict-POST')
        return render(request,   'test1/predict_out.html',     # 使用するテンプレート
                  {'price': price_int[0] })         # テンプレートに渡すデータ
    else:
        return HttpResponse('predict')

画面

・予測、条件の入力。
=>不動産の、条件

f:id:knaka0209:20190131124415p:plain

・予測、結果の表示
=> 金額の予測が、出力出来ました。

f:id:knaka0209:20190131124452p:plain




Github

github.com

サンプルの、プロジェクト
=>以前の、django サンプルを参考にしています。


参考、 以前のflask版の WEB実装

knaka0209.hatenablog.com

Django +mysql DB WEBアプリの実装

index:

概要

web フレームワークDjangoで、mysql 接続設定等をテスト

環境

python 3.5
Django 2.1.5

作成方法

・プロジェクトの作成

django-admin startproject mysite

django-admin が、実行できない場合は、pip パスを追加すると、実行できました。

python C:\Users\user1234\AppData\Local\Programs\Python\Python35\Lib\site-packages\django\bin\django-admin.py startproject mysite


=> プロジェクト内に、複数のアプリを
 追加できそうです。

・サーバ起動方法
python manage.py runserver

=> localhost:8000 で、開きました

・アプリを、プロジェクトに追加

python manage.py startapp test1

test1 を、追加。

・DB mysql の、設定。
mysite/settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django',
        'USER': 'db_user',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',  # (デフォルトポートなら空でも可)
    }
}

DATABASES 部分を、
db name, user, pass ,host
等を記載します


・モデルの作成
test1/models.py

from django.db import models

# Create your models here.

#
class Book(models.Model):
    """書籍"""
    name = models.CharField('書籍名', max_length=255)
    publisher = models.CharField('出版社', max_length=255, blank=True)
    page = models.IntegerField('ページ数', blank=True, default=0)

    def __str__(self):
        return self.name


class Impression(models.Model):
    """感想"""
    book = models.ForeignKey(Book, verbose_name='書籍', related_name='impressions', on_delete=models.CASCADE)
    comment = models.TextField('コメント', blank=True)

    def __str__(self):
        return self.comment

・migrate
事前に、mysql DB, と上記の接続設定を
完了させておきます。


python manage.py makemigrations test1
python manage.py migrate

=> テーブルが、作成されます


・ルーティングの追加

test1/urls.py

#
from django.urls import path
from test1 import views

app_name = 'test1'
urlpatterns = [
    path('', views.index, name='index'),
    path('book/', views.book_list, name='book_list'),   # 一覧
    path('book/add/'              , views.book_edit, name='book_add'),  # 登録
    path('book/mod/<int:book_id>/', views.book_edit, name='book_mod'),  # 修正
    path('book/del/<int:book_id>/', views.book_del, name='book_del'),   # 削除
    #book_test
    path('book_test/', views.book_test, name='book_test'),
]

・次に、 
mysite/urls.py を、追加

from django.conf.urls import url, include
from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('polls/', include('polls.urls')), 
    path('test1/', include('test1.urls')), 
    path('admin/', admin.site.urls),
]


test1/views.py

from django.shortcuts import render, get_object_or_404, redirect
from django.views.generic.list import ListView

# Create your views here.
from django.http import HttpResponse
from django.template import loader
#
from test1.models import Book, Impression
from test1.forms import BookForm, ImpressionForm

#
def index(request):
    return HttpResponse('Hello World ,from test1')

#
def book_list(request):
    """書籍の一覧"""
#    return HttpResponse('書籍の一覧')
    books = Book.objects.all().order_by('id')
    return render(request,
                  'test1/book_list.html',     # 使用するテンプレート
                  {'books': books})         # テンプレートに渡すデータ
#

・表示の確認、

http://localhost:8000/test1/
を、開くと、追加した。ルーティングが
表示されます。

まとめ

次回は、機能を追加したいと思います

機械学習 + flask WEBアプリの実装

index:

概要

前回の、flask関連となりますが。機械学習
軽量web フレームワークのflaskで、
webアプリの実装を行いました。

=> 機械学習は、前回の家賃予測の機能を
実装し、学習済みの modelファイルから
予測を出力しています。
機械学習処理は、事前に完了させておく形です

=> 言語的には、全てpython 構成となります。

環境

python 3.5
flask

=> 今回は、DBは使用していません。

Github

github.com



サンプルの、プロジェクトです

機能

・予測条件入力
不動産の条件を、入力し。
実行します。


f:id:knaka0209:20190125184329p:plain

・結果、金額の出力

f:id:knaka0209:20190125184350p:plain

まとめ

web画面から、自作した機械学習ディープラーニング機能が
使用できるようになり。便利ですね!!
さらに、応用して行きたいと思います。

flask + mysql DBアプリの実装

index:

概要

python 軽量web フレームワークのflask
と、mysql DB連携を試してみました。

環境

python 3.5
flask

準備

mysql関係で、O/Rマッピング等の
ライブラリを追加

pip install sqlalchemy
pip install flask-sqlalchemy PyMySQL

ファイル構成

上記のチュートリアルと、ほぼ同じですが。
下記となります、dbモデルは、 models の下に配置した場合です。

#└─flaskr
    ├─models
    │  └─__pycache__
    ├─static
    └─templates

github

https://github.com/kuc-arc-f/flask_sample2

サンプルの、プロジェクトです
先に、mysqlのDB作成。必用なテーブル作成が
必用です。

設定

DB接続
・ config.py
musqlの、DB名、ユーザー、パスワード、ホストの設定
接続ユーザーは、事前に追加しておきます。

SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://db_user:password@localhost/flask_db?charset=utf8'
SECRET_KEY = 'secret key'

・__init__.py
config.py の読み込み等

# coding: utf-8

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config.from_object('flaskr.config')

db = SQLAlchemy(app)

import flaskr.views

・manage.py
起動する、ファイル。デバックモードの場合。( port=5000 )

from flaskr import app
app.run(host='127.0.0.1', port=5000, debug=True)

デモ、チュートリアルのアプリ

必用なテーブル作成等を行い、アプリを起動します。

f:id:knaka0209:20190125141329p:plain

=>必用な値を入力し、[share] ボタンを押すと、
DBに登録され、下段リスト表示できました。

予測問題、kaggle: PUBG Finish Placement Prediction

index:

概要

kaggleチャレンジで、 PUBG Finish Placement Prediction
予測問題

コンペ

https://www.kaggle.com/c/pubg-finish-placement-prediction


ケームの、勝率的な値の、予測らしいですね

環境

python 3.5
scikit-learn
numpy
matplotlib


テストは、kaggle kernel など使用。

学習データ

kaggle の上記ページから、
学習データ等を、コピーします。



目的変数:
winPlacePerc


説明変数:
 ゲームの戦闘に関するデータ、

matchTypeは、カテゴリ変数らしく。
ダミー変数で、数値化しました。

=> 学習データは、440万件程で、多めで
 メモリ的に厳しかったので、kernel で結果を出力しました。

前処理

・欠損値は、削除
・上記のダミー変数の、変換
 など

・ 今回は、重回帰分析で、機械学習の処理しました。

#
def conv_dammy_mat(df):
    head_mat = "matchType"
    for item in df.columns:
        df=  df.rename(columns={ item : head_mat +"_"+ item} )
    return df
#
def conv_xdata(df):
    df =df.drop("Id", axis=1)
    df =df.drop("groupId", axis=1)
    df =df.drop("matchId", axis=1)
    df =df.drop("matchType", axis=1)
    return df

# 学習データ
global_start_time = time.time()

train = pd.read_csv("train-tmp.csv") # Reading data
test  = pd.read_csv("test-tmp.csv") # Reading data
# 
train = train[: 10000]
test  = test[: 10000]
#train_sub = train[: 10000]
#train_sub.to_csv('train-tmp.csv', index=False)

train.dropna(inplace=True)
#print( train.isnull().sum() )
print( train.isnull().any() )
train.info()
#quit()

# conv, dummy val
train_mat = pd.get_dummies(train["matchType"]) 
#train= train[: 10000]
train_mat =conv_dammy_mat(train_mat )
print(train.shape )
print(train_mat.shape )

#
test_mat = pd.get_dummies(test["matchType"]) 
#train= train[: 10000]
test_mat =conv_dammy_mat(test_mat )
print(test.shape )
print(test_mat.shape )

#quit()
#print( len(train_mat.columns ))
#print( len(test_mat.columns ))
#quit()
#merge
train_mat["Id"] = train["Id"]
train_all= pd.merge( train , train_mat )
test_mat["Id"] = test["Id"]
test_all= pd.merge( test , test_mat )
#quit()
#
y_train =train_all['winPlacePerc']
y_data = y_train
#train_all.info()
x_train =train_all
x_train =conv_xdata(x_train )
x_train =x_train.drop("winPlacePerc", axis=1)

x_test = test_all
x_test = conv_xdata(test_all )
#
print(x_train.shape ,y_train.shape )
print(x_test.shape  )

結果の提出

スコアは、0.0891 ほど。
ランキング順位は表示されず。でした

f:id:knaka0209:20190122183317p:plain

参考コード

github.com