knaka Tech-Blog

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

静的サイトジェネレーター Hexoお試し編

index:

概要

サイトジェネレーターの Hexoを使って、
ブログ等のサイト構築を試してみました。
github pageに配置を目標としています。

背景として、wordpressの編集や、読み込みが遅く、
対策で、高速表示できるサイト構築方法があれば良いなと
考えていたのですが、データベースやphp不要な点は良さそうですが。
hexoの場合は、node.js の操作が必要だったり。しますね

markdown書式に対応していて、
ページを生成してくれますので、便利そうです。

初期設定、準備とか

windowsで、作成してみました。node.js , npmが必要です。

C:\tmp\2017_tmp\node\hexo\blog4>node -v
v8.11.2

C:\tmp\2017_tmp\node\hexo\blog4>npm -v
5.6.0

node.js はパスを通しておくと、Hexo 実行できました。

install, 本家サイトに記載されているコマンド
実行しました。

npm install hexo-cli -g
hexo init blog
cd blog
npm install

hexo server を使うと、テストできますが、
ローカルのapacheとかに置いてもテスト可能でした。

ルートのパスの変更

server直下に、サイト配置する場合は変更不要。
apache等で、htdocs以下の下位フォルダにおく場合は、変更が必要
下記は。 /blog4 に構築しています。

/_config.yml を修正、 root の部分を / から
/blog4/ に変更しています。

 URL
## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/'
url: http://yoursite.com
root: /blog4/
permalink: :year/:month/:day/:title/
permalink_defaults:

1回目の、投稿を追加して
generate(生成)しています。

/public に生成されます。

hexo new "My New Post"

hexo generate

ローカルの apache サーバですが
ブラウザで、開きます。
例として、URLは下記です。
localhost/blog4/
 テーマは標準版ですが、表示できました。

f:id:knaka0209:20180616172057p:plain

テーマの変更

標準でも良いのですが、apollo
のテーマ設定してみました。

https://github.com/joyceim/hexo-theme-apollo

/_config.yml を修正

# Extensions
## Plugins: https://hexo.io/plugins/
## Themes: https://hexo.io/themes/
theme: apollo

generateして、ブラウザで確認。
ずいぶんシンプルになりました。

f:id:knaka0209:20180616173258p:plain

more タグ

上記の hexo new と同様に
ページを追加し
mdファイルを、書きます。
source\_posts\ の下に、タイトル名.md
みたいなファイルが生成されますので、編集

下記の more の部分を追加
( 全角文字を記入していますが、半角に変更下さい  )

---
title: 'new 2nd post, more test'
date: 2018-06-16 17:49:28
tags:
---

more のてすと
more のてすと

<!ーー more ーー>

more のてすと
more のてすと
more のてすと
more のてすと
more のてすと

見え方は、Read More
のリンクが表示されました。

f:id:knaka0209:20180616180017p:plain

リンク押すと、詳細ページが開き。
全文が表示されます

カテゴリの追加

カテゴリ追加し、投稿種類を増やてみます。
カテゴリを追加する、ページも追加しときます。

hexo new page categories

hexo new "news-1"
hexo new "news-2"

追加された、mdファイルに
category を追加、newsの名称にしています。

---
title: news-1
category : news
date: 2018-06-16 18:07:40
tags:
---


news カテゴリを開きます。
blog4/categories/news/

newsのリストが自動生成されました。

f:id:knaka0209:20180616182545p:plain

topメニューの、newsカテゴリの追加。
設定ファイルで可能かもしれませんが、
テーマを修正してみました。。
<li > のnews の行で、URLは絶対パスでベタ書きですが。
メニューから、カテゴリの各リストへ移動できます。

f:id:knaka0209:20180616182701p:plain

ファイル:
themes\apollo\layout\_partial\header.ejs

GitHub Pages で公開する。

rootを、hexo_2にしてますが。

gitHub で、リポジトリを作成し、
git push しました、setting はGitHub Pages
の設定をしておきます。

URL:
https://kuc-arc-f.github.io/hexo_2/

hexo が生成したコード
github.com

xcopy で、一括コピー。apache/htdocs

windows版ですが。
generate で、 publicフォルダが生成されますが、
apacheなどの rootに一括コピーするコマンド
generate 後に、コピーすると便利でした。

xcopy /Y /E public C:\xampp\htdocs\blog2\

f:id:knaka0209:20180714130218p:plain

wordpress で詳細ページ(single.php) の画像サイズをレスポンシブ対応に変更する。

概要:

標準テーマを使用せず、カスタム自作テーマ等を組み込む場合で
詳細画面(single.php) の、画像サイズのレスポンシブ化が
難航したのでメモです。
=> 内容的には、カンタンなCSS追加のみ。

環境とか

wordpress 4.9.6
テーマ:twentysixteen のカスタマイズ版(自作)
元の style.cssの内容は、ほぼ全て消してます。
 *) Theme Name とか、記載ルール等は残す
カスタムテーマの、HTML/CSS は事前に準備してます。

対策前:

singe.php で、the_content()
が出力するHTML は、下記でした。
サイズ=フルサイズで、 1024×768 の画像を添付した場合。

the_content() 内の処理は、
カスタマイズは、難しそうでしたので
CSS で 、対応検討しました。

<p>&nbsp;</p>
<p><img class="alignnone size-full wp-image-12" src="http://localhost/wp3/wp-content/uploads/2018/05/41_153422350_sara.jpg" alt=""
 width="1024" height="768"
 srcset="http://localhost/wp3/wp-content/uploads/2018/05/41_153422350_sara.jpg 1024w, http://localhost/wp3/wp-content/uploads/2018/05/41_153422350_sara-300x225.jpg 300w, http://localhost/wp3/wp-content/uploads/2018/05/41_153422350_sara-768x576.jpg 768w, http://localhost/wp3/wp-content/uploads/2018/05/41_153422350_sara-320x240.jpg 320w"
 sizes="(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px" />
</p>
<p>post-0605A11- body</p>
<p>&nbsp;</p>
</p>

srcset、sizes 属性とかありますね。
width, height が指定されているので、
CSSを追加しないと、レスポンシプは無理そうです。

修正前の画面:
このページは、bootstrap のグリッドシステムを適用してますが、
PC画面の右のサイドバー部品に、画像が重なっています。
ダメですね
スマホだとさらに、はみ出します。

f:id:knaka0209:20180607102921p:plain

修正後:

f:id:knaka0209:20180607103205p:plain


css を追加して、カンタンな対応しました。

img.alignnone{
 max-width: 100%;
 height : auto;
}

alignnone クラスが、出力されたので、
max-width とか、適用すると。いい感じでした

matplotlib plot()

index:

概要

データの可視化で、matplotlibの機能の説明になります

参考のページ / tutorial:

https://matplotlib.org/tutorials/introductory/sample_plots.html#sphx-glr-tutorials-introductory-sample-plots-py

必要なimport

#
import numpy as np
import numpy.random as random
import scipy as sp

import matplotlib.pyplot as plt
import matplotlib as mpl
import seaborn as sns

plot()

Line plot

#  plot
import numpy.random as random

# シード値の固定
random.seed(0)
x = np.random.randn(30)
y =  np.random.randn(30)
# plot
plt.plot(x, y, "o")

# title
plt.title("Title Name")
# Xの座標名
plt.xlabel("X")
# Yの座標名
plt.ylabel("Y")
# gridの表示
plt.grid(True)

f:id:knaka0209:20180518140920p:plain

plot + sin 波形

#
x = np.linspace(-10, 10,100)
plt.plot(x, np.sin(x)) 


f:id:knaka0209:20180518141259p:plain

散布図

scatter()

#
import numpy.random as random

# シード値の固定
random.seed(0)
# x軸のデータ
x = np.random.randn(30)
# y軸のデータ
y =  np.random.randn(30)
plt.scatter(x, y)

# title
plt.title("Title Name")
# Xの座標名
plt.xlabel("X")
# Yの座標名
plt.ylabel("Y")
# gridの表示
plt.grid(True)

f:id:knaka0209:20180518141637p:plain

hist()

ヒストグラム

# histogram
random.seed(0)
plt.hist(np.random.randn(10**5)*10 + 50, bins=60,range=(20,80))
plt.grid(True)

f:id:knaka0209:20180518143343p:plain

pie()

円グラフ

#
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
fracs = [15, 30, 45, 10]
size=(9,5) 
plt.figure(figsize=size,dpi=100)
plt.pie(fracs, labels=labels, autopct='%1.1f%%', shadow=True)
plt.subplots_adjust(left=0,right=0.7)
plt.axis('equal') 


f:id:knaka0209:20180518143605p:plain

IoTデータから scikit-learnで線形回帰。

概要

前回続き、機械学習の関連となります。
IoT温度データから
scikit-learnを使用して線形回帰モデルでグラフ描画までテストしてみました。
比較的カンタンなデモですが、ライブラリの読み込みも速めで、
使いやすく見えました。

今回は、データ分析、特徴の抽出等できれば良いかな程度の目的でしたが、
scikit-learnは、他の機能も多いようで、調査したいと思います。

環境

win7

python 3.5
scikit-learn
numpy
matplotlib

結果

件数的には、やや少なめですが
最近の、IoT温度値を程読ませて
matplotlib のグラフ表示
一次元配列を読ませています。

predict: 予測
temp : 温度/ IoT実測値

f:id:knaka0209:20180518174036p:plain

Log:


f:id:knaka0209:20180513172430p:plain

code

python3.5
IoT実測値を読ませて学習させています。

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

github.com

update 2018/05/18

sk_iot_2b.py
pandas の時系列データ(日付)を、グラフのx軸に表示
できるように修正しました。

注) sklearn / linear_model
はpandas/日付型(timeStamp)が処理できなかったので、
数値で学習/予測し、グラフは日付型を設定しています。

IoTデータ学習して chainerで時系列予測を出力する。

index:

概要

機械学習の関連となります。
ディープラーニングも対応できそうなchainer を使って、IoTデータの数値予測してみました。

前は、LSTMのKeras+ tensorFlow 版でしたが、
Ubuntu以外のLinux で、tensorFlow最新インストールが困難でしたので、
別のライブラリを探し、chainer 同等の機能が追加できるか検討してみました。

環境

win7
python 3.5
chainer 3.3.0
numpy
matplotlib

結果

件数的には、やや少なめですが
最近の、IoT温度値を程読ませて
matplotlib のグラフ表示
一次元配列を読ませています。

predict: 予測
temp : 温度/実測値

前半は、やや曲線の波形でしたが
後半は、ほぼ直線的でした。
まだ調整が必要かもしれません。


f:id:knaka0209:20180513170823p:plain

実行ログ:

f:id:knaka0209:20180513170845p:plain

code

Github
python3.5, cha_iot_rand.py

デモ用で、乱数を読ませていますが。
使用時は、IoT実測値を読ませて学習させています。

https://gist.github.com/kuc-arc-f/fd5d3981a9ce05087f74fdaa908841b2#file-cha_iot_rand-py

update

=== Update:2018/02/19===
csv から、温度データを読み込み処理を追加しました。 (pandas )
https://github.com/kuc-arc-f/cha_iot_pd


まとめ

その他の、使えそうな機械学習ライブラリ
があれば、調査していと思います。

確率

index:

必要なimport

import numpy as np
import numpy.random as random
import scipy as sp
import pandas as pd
from pandas import Series, DataFrame

import matplotlib.pyplot as plt
import matplotlib as mpl

データの準備

#
dice_data = np.array([1, 2, 3, 4, 5, 6])

抽出します

#
from numpy import random
random.seed(0)

# 抽出します
print( random.choice(dice_data, 1))

結果

[5]

この試行結果を根元事象(基本事象)といいます

統計的確率

抽出した、各値の出現する確率を求める。

# 試行、1000回行う。
calc_steps = 1000

# seedの固定
random.seed(0)

# 1〜6のデータの中から、抽出を実施
count_all_dice = random.choice(dice_data, calc_steps)
count_all_dice

#
# 計算結果を入れる
prob_data = np.array([])

#
prob_data = np.array([])
for i in range(1, 7):
    n= float(len(count_all_dice[count_all_dice==i]) ) / float(calc_steps )
    print(i, "ritu=",  n )
    prob_data = np.append(prob_data ,n)

print(prob_data)

結果

(1, 'ritu=', 0.171)
(2, 'ritu=', 0.157)
(3, 'ritu=', 0.157)
(4, 'ritu=', 0.183)
(5, 'ritu=', 0.161)
(6, 'ritu=', 0.171)
[0.171 0.157 0.157 0.183 0.161 0.171]

ほぼ1/6に近いのがわかります。これは

統計的確率

という。

確立変数

ある変数の値をとる確率が存在する変数のことです。例えば、
さいころを投げて出る目は{1, 2, 3, 4, 5, 6}のいずれかであり、
それぞれの目が出る確率はであることから、さいころを投げて出る目は確率変数であると言えます。

確率分布:

確率変数がとる値とその値をとる確率の対応の様子を「確率分布」と言います。
https://bellcurve.jp/statistics/course/6596.html

ベルヌーイ分布:

結果が2種類しかない試行をベルヌーイ試行といいます。
1回のベルヌーイ試行において各事象が生じる確率の分布

prob_be_data = np.array([])
coin_data = np.array([0, 0, 0, 0, 0, 1, 1, 1])
#
for i in np.unique(coin_data):
    n= (float(len(coin_data[coin_data==i]) ) / float(len(coin_data) ))
    print(i, " = ",                 n)
    prob_be_data = np.append(prob_be_data, n )

結果

(0, ' = ', 0.625)
(1, ' = ', 0.375)

二項分布:

独立なベルヌーイ試行をn回繰り返します。
パラメータは順に、試行回数(n)、確率(p)、サンプル数
を示しています。
https://ja.wikipedia.org/wiki/%E4%BA%8C%E9%A0%85%E5%88%86%E5%B8%83

# 二項分布
random.seed(0)
x = random.binomial(30, 0.5, 1000)
plt.hist(x)
plt.grid(True)
plt.show()


f:id:knaka0209:20180512181313p:plain

ポアソン分布:

稀な事象が起きる確率の時、使われます。
https://bellcurve.jp/statistics/course/6984.html

# ポアソン分布
x = random.poisson(7, 1000)
plt.hist(x)
plt.grid(True)

f:id:knaka0209:20180512181622p:plain

分散、標準偏差、要約統計量

index:

必要なimport

#
import numpy as np
import numpy.random as random
import scipy as sp
import pandas as pd
from pandas import Series, DataFrame

import matplotlib.pyplot as plt
import matplotlib as mpl

サンプルのデータ: 特定に抽出した人物のサンプル。データ。
=>アンケート値でなく、適当なランダム値

height :身長 150 -180 ,random
weight :体重 50 - 80 , random
coffee :週にcoffeeを飲む回数
tea : 週に お茶を飲む回数

分散

ばらつきを示す。
https://bellcurve.jp/statistics/course/5919.html

データを読み込みます。

#
person = pd.read_csv("dat_person.csv")
person.head()

結果: 

   cofee  heiht  tea  weight
0     13    169   19      58
1     11    158   14      59
2      6    160   10      70
3     15    150    1      77
4      3    150   17      62

分散の表示

#
person.coffee.var()

結果

26.819871794871798

標準偏差

ばらつきを示す。分散の平方根とる。
https://bellcurve.jp/statistics/course/5924.html

coffee の標準偏差

#
person.coffee.std()

結果

5.178790572602043

平均値

print( person.coffee.mean())

結果

10.275

中央値

print( person.coffee.median())

結果

11.0

最頻値

最も頻度が多い値

print( person.coffee.mode())

結果

0    12
dtype: int64

要約統計量

https://ja.wikipedia.org/wiki/%E8%A6%81%E7%B4%84%E7%B5%B1%E8%A8%88%E9%87%8F
標本の分布の特徴を代表的に(要約して)表す統計学上の値であり、
統計量の一種。記述統計量(英: descriptive statistics value)、
基本統計量、代表値(英: representative value)ともいう

正規分布の場合は、平均と、分散または標準偏差で分布を記述できる。
正規分布からのずれを知るためには、尖度や歪度などの高次モーメントから求められる統計量を用いる。
正規分布から著しく外れた場合には、
より頑健な中央値、四分位点、最大値・最小値や最頻値が用いられる。
「頑健」とは分布の非対称性や外れ値などの影響を受けにくいことを意味する統計用語である

#
person.coffee.describe()

結果:上から
データ数
平均値
標準偏差
最小値
第一四分位数
第二四分位数
第三四分位数
最大値

count    40.000000
mean     10.275000
std       5.178791
min       0.000000
25%       6.000000
50%      11.000000
75%      13.500000
max      19.000000
Name: coffee, dtype: float64

四分位範囲

=> 散らばりの程度を表す尺度の一つ。
「75パーセンタイル(第三四分位数)-25パーセンタイル(第一四分位数)」として求められる。

#
desc= person.coffee.describe()
(desc[6] -desc[4] )

結果

7.5