OmniAICreator/Qiita-1.07M huggingface dataset:
diff -rでディレクトリ同士を比較しつつ特定ファイル名の結果だけ表示

# はじめに
ディレクトリ同士を`diff`コマンドで再帰的に比較するときは、
`diff -r <dir1> <dir2>`みたいにしますよね。
その中で特定ファイル名の結果を除外したい場合は
`diff -r -x <filename> <dir1> <dir2>`みたいにすればOK。
参考： https://linuxjm.osdn.jp/html/gnumaniak/man1/diff.1.html

しかし！除外はできるくせに「特定ファイル名の結果**だけ**を表示」ってのは
`diff`コマンドの機能としては存在しないようです。

`-q`オプション付きであれば、`diff -qr <dir1> <dir2> | grep <filename>`でOKだけど、
ファイルの中身までちゃんと見たいときはそうは行かない。

やりたくなる度に調べては「やっぱないよなー。。。」ってガッカリしてたんですが、
無いならシェルスクリプト組んでやれ！と思って作りました。


# コード
実行権限を付けて保存して、こんな風に実行してみてください〜。
`./tdiff.sh <dir1> <dir2> <target filename>`

```bash:tdiff.sh
#!/usr/bin/env bash

# diffコマンド名(普通のdiffでもOK)
# diffCommand=diff
diffCommand=colordiff

# 第一引数がハイフンで始まったらそのままdiffのオプションに渡す
if [ "${1:0:1}" = "-" ]; then
  option="$1"
  shift
else
  option="-uN"
fi

if [ $# -lt 3 ]; then
  echo "Usage: $0 [<diff option>] <dir1> <dir2> <target filename>"
  exit 1
fi

# $1 $2はディレクトリ名、$3はdiffを取りたいファイル名
output=$(diff -qr $1 $2)
while read -r line; do
  string=$(echo "$line" | awk '{print $1}');
  if [ $(echo $string | grep -e 'Only') ]; then
    # 片方にしかファイルがない場合
    fileName=$(echo "$line" | awk '{print $4}');
    if [ $fileName != "$3" ]; then
      continue
    fi
    path=$(echo "$line" | awk '{print $3}' | sed -e "s/\:/\//");
    fromFile=${path/$1/$2/}/$fileName;
    toFile=${path/$2/$1/}/$fileName;
  else
    # 両方にファイルがある場合
    fromFile=$(echo "$line" | awk '{print $2}');
    toFile=$(echo "$line" | awk '{print $4}');
    fileName=$(basename "$toFile")
    if [ $fileName != "$3" ]; then
      continue
    fi
  fi

  $diffCommand $option $fromFile $toFile
done <<< "$output"
```

## 補足
僕は色付きが好きなのでcolordiffを指定してますが、
インストールされてなければエラーになるはずなので注意してください。

`alias tdiff=~/hoge/fuga/tdiff.sh`みたいにエイリアス貼ると便利です。
スクリプト名`tdiff`は「targetable diff」って意味です。

# 謝辞
全部自力で書くのは時間かかりそうなので
似たようなことやってる人探したところ、
[ディレクトリ間の差分ファイル一覧取得をbash scriptで実現させる](https://qiita.com/ichiki1023/items/35c2ada5a81833a03646)
がとても参考になりました！
かなり流用させてもらいまして感謝感謝 :bow:  

# おわりに
実はシェル芸も大好きなので、もっと腕磨いてQiitaにもどんどん書きたいなーと思った所存です。
ではまた〜。
heroku の複数アカウント管理(備忘録)


#プラグインのインストール

複数のherokuアカウントを持っていて、リポジトリごとにheroku loginを打つのがめんどくさいので
以下のプラグインを入れました。

```shell
$ heroku plugins:install heroku-accounts
```

#複数アカウントの登録
privateという名前の仮想アカウント名前に、自分の使っているherokuアカウントのメールアドレスとパスワードを入力します。

```shell
$ heroku accounts:add private

Enter your Heroku credentials:
Email: privateで使用したいherokuアカウントのメアド
Password: privateで使用したいherokuアカウントのパスワード
```

登録できたか確認してみましょう。

```shell
$ heroku accounts

private
```

もう一つ、workアカウントを登録し、確認してみます。

```shell
$ heroku accounts:add work

$ heroku accounts

private
work
```

2つアカウントが登録されました。
このままだと、どっちのアカウントを使用するか設定していないので、下記で設定。

```shell
# privateを指定してみます
$ heroku accounts:set work
```

確認してみると、workが設定されていることになっています。

```shell
$ heroku accounts

* work
  private
```

#複数アカウントの削除
意図していない名前で登録したとかで、仮想アカウントを削除したい時は下記で消すことができます。

```shell
$ heroku accounts:remove work


$ heroku accounts

private
```

#おまけ
下記でデフォルトのherokuアカウントを設定できるようです。

```
$ heroku accounts:default ACCOUNT_NAME
```

#参考リンク
https://qiita.com/penta515/items/b95b1687b46cba4d8009
https://stackoverflow.com/questions/19280911/how-to-remove-previous-account-in-heroku?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
Open3Dの使い方：自分で点群を生成

pythonで点群処理できる[Open3D](http://www.open3d.org)の探検．[Open3Dの使い方：読み込みと表示，点と法線の取得](https://qiita.com/tttamaki/items/2be476cc15fa39601243)の続き．

点群のコンストラクタは`py3d.PointCloud()`．コピーコンストラクタしかないようなので，空で生成しておいて後から.points追加．するとhas_points()も自動的に更新される．

# コード

```python:open3d
import sys
sys.path.append("../..") # Open3D/build/lib/ へのパス
import numpy as np
import py3d

# 球状の点群を生成
## 面倒なので立方体中にランダムな点を作ってL2ノルムで正規化．よい子は真似しない
sphere = np.random.rand(10000, 3) - np.array([0.5, 0.5, 0.5])
sphere /= np.linalg.norm(sphere, axis=1, keepdims=True)


pcd = py3d.PointCloud() # コンストラクタ
print("has points?", pcd.has_points()) # ここではFalse
pcd.points = py3d.Vector3dVector(sphere)
print("has points?", pcd.has_points()) # ここでTrueになってる
py3d.draw_geometries([pcd], "sphere points", 640, 480)

print("has color?", pcd.has_colors()) # ここではFalse
pcd.colors = py3d.Vector3dVector(np.random.rand(10000, 3))
print("has color?", pcd.has_colors()) # ここでTrueになってる
py3d.draw_geometries([pcd], "sphere points with random colors", 640, 480)

print("has normals?", pcd.has_normals()) # ここではFalse
py3d.estimate_normals(pcd, search_param = py3d.KDTreeSearchParamHybrid(radius=0.1, max_nn=30))
print("has normals?", pcd.has_normals()) # ここでTrueになってる
py3d.draw_geometries([pcd], "sphere points with normals", 640, 480)
```

# 結果

```text:結果
has points? False
has points? True
has color? False
has color? True
has normals? False
has normals? True
```

点を生成
![スクリーンショット 2018-03-21 21.43.36.png](https://qiita-image-store.s3.amazonaws.com/0/44835/ef6764c7-40fd-6f57-a239-00967822c987.png)

ランダムに色をつけた
![スクリーンショット 2018-03-21 21.43.44.png](https://qiita-image-store.s3.amazonaws.com/0/44835/62aab5ad-fe4c-11a0-d848-7fac9e4ac38d.png)

法線を計算するとシェーディングされる
![スクリーンショット 2018-03-21 21.43.52.png](https://qiita-image-store.s3.amazonaws.com/0/44835/3c0c91b7-00e0-e304-4e23-e7afbf320ddf.png)
誰も得しない個人的な遊び

#前書き
完全に個人的に遊んだ記録。
読者を想定しないが、暇つぶしなり、同じ遊びをしてみた人との情報共有なり。

また、この記事を読むにあたっては、ある程度までの言語知識(C/C++,Java)と、数学の知識が必要になるかもしれない。
プログラミングの知識については、私が[苦しんで覚えるC言語](http://9cguide.appspot.com/)の、第一部の内容がある程度わかっているくらいの知識量で書いている記事なので、同等程度の理解があればたぶん大丈夫。
注/上記は当時(2018/3 くらいの話である)
数学的な知識で、特に説明が必要と感じれば説明をするが、どうしてもわからないことは自前で見てきてほしい。

記事中のソースコードは基本的にはMicrosoft の Visual Studio 2017 で実行・確認しているハズであるが、
読みやすさのために書き方を変えたりすると、実行していない（→動作しない可能性のある）ものもあるかもしれない。

+ 追記 date:2018/06/26

とっても素敵なスピードで記事が肥大化していきそうな感じがしていたので、
このページをインデックス的に扱うことに。
たぶん使い方間違えてるけど許してちょ。

#疑似乱数
「コンピュータってどうやって乱数列だしてんの？」ってふと思って調べた。

コンピュータが吐き出す乱数列は本質的には完全なアトランダムな数列ではなく、疑似乱数と呼ばれるもので、**導出可能**。
コンピュータの演算によって求められる、ある程度の法則性を持つ数列を使っているとのこと。そういえばC言語で標準関数として装備されてる```rand()とかsrand()```で出てくる数は乱数としてはごにょごにょ...っていう記事を見た覚えが。

なんだかおもしろそう...~~じゅるり~~、というわけでさっそくお手軽に[ウィキペディアの疑似乱数の項](https://ja.wikipedia.org/wiki/%E6%93%AC%E4%BC%BC%E4%B9%B1%E6%95%B0)を見に行くのであった。

---
##平方採中法

date 18/03/21
ウィキペディアの疑似乱数のページの一番上で紹介されてた。
「一番上だし簡単じゃね？」って手を付けて半日潰したわけですが。
(っていうか「もっとも古い手法」ってちゃんと書いてあった。1946年だと。)

[記事本文へ移動](https://qiita.com/UFOnian/items/71372f608ade0f95dfa1)



#参考資料
各資料毎に個人的な感想~~（つか感傷）~~をだーだー書いたが、見にくすぎて「なんじゃこりゃ」ってなったんで折りたたんだ。
読みたい人は▶をたたくと長文が開く。（やましいことは書いてない... 書いてないったら！）

## C/C++関連

<details><summary>[**苦しんで覚えるＣ言語**](http://9cguide.appspot.com/)</summary>
私がC言語について全く知らない状態から、「プログラマになるゾ」と思いついたときに、
とりあえずC言語、いっとかない？感覚でC言語を学習しようとwebサイトをあさって見つけたサイト。
「書籍化もしている」とのことから信頼して読み漁り、対話なしではちょっとついていけないポインタの話くらいまでここで学習した。
「苦しんで」という割に、全然知らない人でもきちんと読めば、とりあえず理解できるように説明されている印象を受ける素敵なサイト。（主に苦しんだの筆者じゃないかしらん）
「苦C」だの「9cguide」だの表記にブレがあって申し訳ない。
アドレスバーに「9」と入れると即ここが候補に挙がる程度にはアクセスしてる。というか、困ったら見てる。
</details>

<details><summary>[**C言語関数辞典**](http://www.c-tipsref.com/)</summary>
C言語やってて「解説書に乗ってる関数全部覚えた」とかじゃなければ一度はアクセスするんじゃなかろうかっていうネーミングのサイト。
関数の引数・戻り値・機能のざっくりした説明に、サンプルコードも載ってて、関数以外にもマクロで定義されてるような定数の説明とか、専門用語で「聞いただけじゃわからないよ」って感じの単語の説明も載ってる、丁寧なサイト。
概要説明のある関数一覧のページで、欲しい機能に関連する単語（ファイル操作の関数なら「ファイル」とか）でページ内検索すれば概要に引っかかって探せちゃったりするので便利。ある種のチートシートとして利用している。
</details>

<details><summary>[**一週間で学べるシリーズ**](http://sevendays-study.com/index.html)</summary>
シフトシステム株式会社さんが作ったプログラミング言語の解説ページ群
C++のページの、特にクラスに関する話にてお世話になった。
私はクラスについてはまださっぱり知らない初心者であるし(18年3月現在)、きちんと人（先生）との対話の中で勉強したいので、参考程度にチラリと見ただけだが。
</details>


## Java関連

<details><summary>[**Java API ドキュメント**](https://docs.oracle.com/javase/jp/8/docs/api/)
</summary>
読むでしょ。読まない？
私の中では、Cでいうところの「C言語関数辞典」にあたるものと考えるが、
こちらはおおざっぱに探すことは必ずしもできるとは限らない。
クラスの名前をわかりやすくつけることを、前提としている節があるので、
ある程度の英単語（『プログラミング語』？）がわかれば探しやすい。
「ググって適当なサイトで見つけたクラスの、（厳密な）仕様を見たい」というなら、
これ以上のものは多分ないだろう。
（厳密に見たいならアメリカ語で読んだほうがいいであろうが、上記リンクはjpである）
</details>

<details><summary>**侍エンジニア塾ブログ（Java）**</summary>
マンツーマンでプログラミングを教えてくれるとかいう塾
の、ブログ。
てきとうに「これもっと便利にできんかな」っていうのをプログラミング語ちっくな書き方でぐぐると、だいたい上のほうでヒットする~~（相当頑張ってSEO対策したんだろうなー）~~
ヘッダーとか広告の配置の仕方とかから、詐欺サイトみたいな印象を受けるし、若干動作も怪しい感じがする。内容は嘘じゃなさそうだけど。（あくまで私見）
でかでかとしたヘッダーを間違ってクリックすると、**ほんとに、**詐欺サイトみたいな**見た目の**(重要)塾の案内サイトにつながる。
それでも読みに行くという人は[ここ](https://www.sejuku.net/blog/curriculums-java)(Javaの記事一覧（？）に飛ぶ)。
網羅率は高そうに見える。講師たちそれぞれに専門分野の記事を書かせたのだろうか。（想像）
内容の善し悪しはともかく、あんまり近寄りたくない。少なくとも自分からここへ行って何か習おうって気持ちにはなりそうにない。
なんかしらぐぐってヒットしたらとりま一通り読んでみて、知らないクラスや仕様は上記 oracle のサイトに見に行っている。
</details>
プログラミング歴9ヶ月東大生が思う「初心者挫折あるある」〜プログラミングは〇〇だ！〜

# 一度は挫折したプログラミング
現在自分はプログラミングを本格的に初めてから9ヵ月。
インターンや、Railsチュートリアルなどを使って勉強しています。（チュートリアルについての記事は[こちら](https://qiita.com/Kouch/items/9cf723a396dda6268d51))
自分は、去年の9月ごろ一度挫折しました。今考えるとそれは自分の**やり方が悪かった**のです。現在は楽しくコードを書いています。

プログラミング学習を初めてまだ一年も経っていない僕だからこそ、どこで挫折したかもしっかり覚えています。これから始めたい人、一度挫折して諦めてしまった人に、この記事が参考になれば嬉しいです。

# プログラミングは料理だ！！音楽だ！！
まず始めに僕が実感したこと。そして多くの初心者が勘違いしていること。（僕もその一人でした）
プログラミングは数学や理科みたいな**「勉強」ではない**ということです。
むしろ僕は**料理や音楽の方がイメージとしてプログラミングに近い**と思っています。
この記事では、皆さんにイメージしやすいように例え話を多用して話を進めていきます。



# 初心者挫折あるある
## 「とりあえず本を一冊終わらせよう」の精神で挫折
僕が初めてRuby on Railsの勉強を始めるとき、何をしたか。
本屋さんに行って、分厚い本を買ってきました。2700円＋税です。
結果、50ページを三日かけて読んだところで挫折しました。

これ、例えるならば、料理を始めたいと思った人が「レシピ本とりあえず一周読破するか！」と言っているようなものです。
もちろん、本で勉強するのもとても役に立ちます。でも最初の最初の初心者にはオススメしません。
初めての段階で分厚い本を完璧に学ぼうとしても、モチベーションが保てないからです。


## 目的物がないから挫折
皆さんは料理や音楽を習いたてのとき、まず何をしますか？ひたすら包丁の練習をやりますか？ひたすらドの音をだす練習をしますか？
そんなことないですよね？「目玉焼きを作ってみよう」「猫踏んじゃったを演奏したい」。こんな風に、何か自分の目的物があるから頑張れるし、できた時に達成感を得られるわけです。その練習の過程で、技術は身についていきます。
プログラミングも同じです。実際に何かを作りながら手を動かして、その都度必要なものを学んでいきましょう。


## 「時間があるときにやればいいや」で挫折
「土日にまとめてやろう」。このやり方、絶対プログラミングではオススメしません。
「ピアノは毎日やらないと腕が落ちる」って聞きますよね？
プログラミングでも同じ。自分がどこの機能をどこまでやったか、この変数はなんの役割があるのか。などなど、一週間経つと本当に忘れてしまいます！（本当に！）
毎日コツコツ１０分でも、コードに触れましょう。


## 開発環境構築の段階で挫折
何かを動かすには「環境」が必要です。例えばRailsでは、実際にローカルで動かすまでに色々設定したりダウンロードしたりしなくてはなりません。ここで多くの人が嫌気がさします。
音楽でいうならチューニングのようなものです。この部分は初心者にはとっても辛いし、何より楽しくないです。

# じゃあどうすればいいのさ！？
## 学習用サイトをしっかり活用する。
僕に「プログラミングが楽しい」と思わせてくれたのは[Progate](https://prog-8.com)というサービスです。
このサービスはブラウザ上で、実際にサイトを作りながら学習できます。また、環境も向こうで作ってくれているので、いきなりコードが書けるわけですね（もちろん環境構築やサーバーのことは別で勉強が必要です）。レベルアップ機能などもあり、モチベーションが保てるので毎日コツコツできました。詳しくは公式ページを。

他にも[ドットインストール](https://dotinstall.com/)など、プログラミング学習のためのサイトはたくさんあります。


## できる人に教えを乞う。
エラーなど技術的な質問だけではなく、勉強法なども教えてくれると思います。
身の回りの友達や、インターンや勉強会などに積極的に参加して、強い人の意見をどんどん聞きましょう。
一人できる人が周りにいるだけで「今この勉強は優先順位が高いものか」「次にやるなら何がいい？」など、あなたの勉強の計画についての質問もできます。


# 最後に
初心者が挫折しやすいと言われるプログラミング。この記事が、挫折を乗り越えるきっかけの一つになれば、とても嬉しい限りです。
【PHP】新卒入社して１年、コードレビューで指摘された３つのこと

新卒入社して2年目になるわたしですが、
基本的なことからPHPのことなど、たくさんコードレビューで勉強してきました。
今回はその一部をまとめてみました。

# 1. インデントをそろえる
## インデントとは？
ソースコードの見た目を整えてくれるもの。
ifやforなど波カッコ{}で囲まれるブロック内の各行をtabキーやスペースで字下げすること。

``` php:インデントなし
if ($dessert == 'papico') {
for ($i = 0; $i <= 3; $i++) {
echo 'デザートはパピコです'
}
} else {
echo 'デザートはパピコではありません'
}
```
``` php:インデントあり
if ($dessert == 'papico') {
	for ($i = 0; $i <= 3; $i++) {
		echo 'デザートはパピコです'
	}
} else {
	echo 'デザートはパピコではありません'
}
```
インデントしてあったほうが、見やすいのがわかります。

## 入社してから知った技
### 逆tabインデント
tabキーでインデントした行を元の位置に戻したい！
そんなとき、いつもdeleteキーで戻していました。
しかしshift + tabキーで戻せるのです！
### 複数行一括字下げ
インデントしたい行が複数ある！
そんなとき、いつも一行ずつインデントしていました。
しかし、複数行を範囲選択しtabキーをおすと・・・
一括でインデントすることができるのです（逆tabインデントもしかり）

# 2. phpdocをかく
phpdocとは、クラスや関数などの定義前に記述するブロックコメントのこと
phpdocを書いておくと、
 - 後にソースを見返した時理解する時間が短縮される
 - ドキュメントを自動生成できるようになる
というメリットがあります！

``` php
/**
 * @return string
 */
public function sample()
{
    $dessert = 'papico';

    return $dessert;
}
```

詳しい書き方についてはこちらがおすすめです:bow:
[phpDocumentorの書き方 - Qiita](https://qiita.com/itosho/items/0f809e067a9e4a41515e)

# 3. 演算子をつかいこなす
演算子にはさまざまありますが、わたしが指摘されたのは
条件演算子(三項演算子) と Null合体演算子 です。
## 条件演算子(三項演算子)とは？
条件により返す値を切り替えることができる演算のこと。

たとえば、answerが10より小さいときはそのままanswerを、
10以上のときは10と返すプログラムをif文、条件演算子でかくとき、
それぞれ以下のようになります。

``` php:if文
if ($answer < 10) {
	$result = $answer;
} else {
	$result = 10;
}
``` 

``` php:条件演算子
// [条件] ? [TRUEの場合の返り値] : [FALSEの場合の返り値] ;
$result = ($answer < 10) ? $answer : 10;
``` 
if文よりも条件演算子のほうがシンプルにかけます。
わたしはずっと条件演算子はif文の省略形だ、と思っていたのですが違うようです。
つかいわけについてはこの記事でお勉強させていただきました:bow:
[三項演算子は悪か？ - Qiita](https://qiita.com/stkdev/items/cbb83cbd9921b9f755a4)

## Null合体演算子とは？
PHP7から追加された新機能で、「〜がなかったら」という処理を簡単にかくことができます。
たとえば、dessertがなかったら買いにいく、あったらdessertと返す処理を
さきほどの条件演算子、Null合体演算子でかくときそれぞれ以下のようになります。

``` php:条件演算子
$result = isset($dessert) ? $dessert : '買いにいく';
```

``` php:Null合体演算子
// [未定義か判定したい変数] ?? [デフォルト値]
$result = $dessert ?? '買いにいく';
```
条件演算子よりもシンプルに書けることがわかります。
わたしは定義されていない変数によるエラーを防ぐため、`??`を乱用してしまいがちなのですが、
処理コストがかかるためつかいすぎには注意が必要です。

# 最後に
まだまだ指摘いただいたことはたくさんあるので、
また時間を見つけてまとめていきたいと思います。

アドバイス、ご指摘をいただきたく、はてなブログではなく
はじめてQiitaへ投稿してみました:pray:
LSTMの予測精度に対するサンプルデータ絶対値の影響

# やりたいこと

- 人工知能で株価などを予測させたい
- そのための、下準備

# 人工知能で時系列データを予測する手法

言語認識や時系列データの分析・予測には、下記の手法を使うらしい。
- RNN (Recurrent Neural Network)
- LSTM (Long Short-Term Memory)
- GPU (Gated Recurrent Unit)

詳しくはこちら:
[詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~](http://amzn.to/2GOuSyn)
<a href="https://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-TensorFlow%E3%83%BBKeras%E3%81%AB%E3%82%88%E3%82%8B%E6%99%82%E7%B3%BB%E5%88%97%E3%83%87%E3%83%BC%E3%82%BF%E5%87%A6%E7%90%86-%E5%B7%A3%E7%B1%A0-%E6%82%A0%E8%BC%94/dp/4839962510/ref=as_li_ss_il?_encoding=UTF8&psc=1&refRID=6S9GQ7F8QHXVA8WJ1VDT&linkCode=li2&tag=midriver-22&linkId=aa446173ad80c3c7c62a6019e86cb300" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4839962510&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=midriver-22" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=midriver-22&l=li2&o=9&a=4839962510" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

# LSTMによるSINカーブの予測
**元データ:** 振幅1のSinカーブに標準偏差0.05のノイズが乗っている
![image.png](https://qiita-image-store.s3.amazonaws.com/0/80231/6c4f176b-ed5a-51f4-ea4a-2f737d89ee4b.png)

**ディープラーニングのモデル:**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/80231/80c28cd2-5e26-6a57-b46a-66a2b7cbbf15.png)

**学習結果**
10 Epochs程度でlossがなくなっており、非常によく学習できていると分かる。
10 Epochで、loss: 0.0298, val_loss: 0.0199
![image.png](https://qiita-image-store.s3.amazonaws.com/0/80231/64670c5b-ffa2-456c-6de1-7147641d5f78.png)


**学習済エンジンによるSinカーブの予測**
点線: 元データ、黒実線: 予測データ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/80231/6368fdcb-dc44-67e2-162d-56961c7d09fa.png)


#### 参考:
ソースコードはこちらを使ってます
[yusugomori/deeplearning-tensorflow-keras](https://github.com/yusugomori/deeplearning-tensorflow-keras/blob/master/5/keras/01_sin_lstm_keras.py)

# LSTMで株価を予測するときの問題点

上の文献通りに進めれば、株価を予測できるかも! と、思ったけれども、
そのままの価格データを使っても、うまく予測できない場合があるらしい。

[LSTMで仮想通貨の価格予測をする](https://qiita.com/licht110/items/f89c699cbdff05ec90de)

> 機械学習においてデータの前処理は予測の精度を左右します。
今回、そのままの価格データを使ってもうまくいかなった（値のスケールが大きかったせい？）ので、ひとまずmin-maxスケーリングをしてみます。

# 絶対値が変わったときの影響検証

**検証データ:** 元データに2を足してみる (平均2のデータ)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/80231/f2663395-c8b4-ad52-b4d1-4937e6faff81.png)

**ディープラーニングのモデル**
先ほどと同じもので

**検証結果**
lossがなくなるまで、40Epochほどかかっており、明らかに学習が遅くなりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/80231/e24e545d-02e9-0a8d-3f48-7280247ed179.png)

**Sinカーブの予測**
こちらも誤差が大きくなっていることが、目視でわかります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/80231/2cb5642c-17dd-c58f-804d-78623977f8db.png)

**追加: 平均4のSinカーブに対する予測**
ちなみに、平均4のSinカーブに対してはトレンド予測が全くできなくなってます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/80231/9fc1dc93-4cfa-c199-28e2-7b56296e67df.png)


# 所見

単純なLSTMを使って時系列のトレンドを予測する場合、データの前処理で精度が全然変わってしまうという問題がありそうです。どうも、平均ゼロ付近の周期的なデータはよく予測できるけど、平均値が0から大きく離れるとLSTMではうまくトレンドを予測できないようです。
株価予測を実装するまでには、ちょっと時間がかかりそうです。
Pythonのインストール（64ビットWindows版）

# 概要

ここでは，Microsoft Windows（64ビット）にPythonの最新版をインストールする方法について説明する。

![python.org.png](https://qiita-image-store.s3.amazonaws.com/0/208216/87723210-20f0-e721-f3e1-ae5478a5dc2f.png)

# Pythonをダウンロードする

次に示すpython.orgのダウンロードページにて，Windows版Pythonの最新64ビット版をダウンロードする。

[https://www.python.org/downloads/windows/](https://www.python.org/downloads/windows/)

web-based，executable installer，embeddable zip fileのどれを選択しても良いが，以下の説明はexecutable installerによる画面遷移である。なお，x86は32ビット版，x86-64は64ビット版である。

![python-download-x86-64_2.png](https://qiita-image-store.s3.amazonaws.com/0/208216/df4f800a-ac08-bf23-bce9-ec9aa13a77d7.png)

# Pythonをインストールする

ダウンロードしたファイルを実行するとPythonのインストーラが起動する。「Add Python 3.6 to PATH」にチェックを入れた上で，「Install Now」をクリックしてインストールを開始する。

![install#01_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/208216/c7871060-e204-7274-a5e8-1acf02ca6210.jpeg)

しばらく「Setup Progress」の画面でインストールが進行し，「Setup was successful」と表示されたら成功である。「Close」ボタンをクリックしてインストーラの画面を閉じる。

![install#03.PNG](https://qiita-image-store.s3.amazonaws.com/0/208216/066a42a8-45d0-b513-83df-32c7b68f44de.png)

# 動作確認

正しくPythonがインストールされていることを以下の手順に沿って確認する。

## コマンドプロンプトの起動

コマンドプロンプトを起動する。Windowsの検索窓（ここに入力して検索）から「cmd」と検索すると良い。

![cmd.png](https://qiita-image-store.s3.amazonaws.com/0/208216/2b65f651-9f96-21c6-d925-9d840787038c.png)

## Pythonの起動

コマンドプロンプトで「python」と入力してPythonを起動する。インストールされたPythonのバージョン番号など情報が表示されているはずである。「**>>>**」の記号は，Pythonの命令を受け付けるプロンプトを表している。

## プログラムの実行

簡単なPythonプログラムを実行してみよう。次の命令文をPythonのプロンプトに入力して**[Enter]**キーを押してみよう。

```python:
print("Hello, Python world!")
```

![run.png](https://qiita-image-store.s3.amazonaws.com/0/208216/82a030aa-2c18-ae1f-1782-4a7d4e436902.png)

すぐ次の行に以下のように表示されたら成功である。めでたし，めでたし！

Hello, Python world!

![run#02.png](https://qiita-image-store.s3.amazonaws.com/0/208216/99ec3a04-7b54-46db-b1b2-ffa55711ea97.png)

Pythonを終了するときは「exit()」と入力する。なお，exit()はプログラムを終了するPythonの命令である。

![run#04.png](https://qiita-image-store.s3.amazonaws.com/0/208216/56f6e624-53f8-3317-a3a5-bacf91936991.png)

コマンドプロンプトで「exit」と入力して，コマンドプロンプトを終了する。

![run#05.png](https://qiita-image-store.s3.amazonaws.com/0/208216/1a95e54f-de30-2529-0255-7ad5539fc580.png)

以上
WebstormでExpressプロジェクトを開いたらindexing...の無限ループに陥った

# 環境

- OSX High Sierra
- node 9.8.0
- npm 5.7.1
- Express 4.16.0

# 再現手順

以下手順でExpressのsampleapp作成。

```bash
npm i -g express
npm i -g express-generator
express sampleapp
```
sampleappをWebstormで開いて作業しているとindexing...(Webstormのコード解析)が無限ループを始めた。
あれこれ試しているうちにapp.jsを開いている時に再現することを突き止める。
最終的に、

```js:app.js
// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});
```

↑の部分のソースを削除するとループしなくなった。

無限ループの原因は依然不明。
気持ち悪いが、取り急ぎの対処として。
nginxをUbuntu16.04へインストール手順とよく使うコマンド

インストール

```
curl -O http://nginx.org/keys/nginx_signing.key
apt-key add nginx_signing.key
sudo sh -c "echo deb http://nginx.org/packages/ubuntu/ xenial nginx >> /etc/apt/sources.list"
sudo sh -c "echo deb-src http://nginx.org/packages/ubuntu/ xenial nginx >> /etc/apt/sources.list"
apt-get update
apt-get install nginx
```


コマンド

```
nginx			開始
nginx -s stop	停止
nginx -s quit	リクエスト処理完了後停止
nginx -s reopen	ログファイル再オープン
nginx -s reload	設定再読み込み

nginx -t			設定ファイルのテスト
nginx -t -c filepathファイルを指定
```

設定ファイル
/etc/nginx/nginx.confg
Android KotlinでRealmを使う

# 環境
- Android Studio 3.0.1
- kotlin_version = '1.2.21'
- Realm 5.0.0

# 資料
Realm公式
[Realm: Create reactive mobile apps in a fraction of the time](https://realm.io/docs/java/latest/)

# Realmの導入
## プロジェクトのbuild.gradleにrealmを追加

```gradle:build.gradle
buildscript {
    ext.kotlin_version = '1.2.21'
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "io.realm:realm-gradle-plugin:5.0.0" //追加
    }
}
```

## appのbuild.gradleにrealmを追加

ここはrealmを最後の行に書かないとエラーになるはず

```gradle:app/build.gradle
apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

apply plugin: 'realm-android' //追加
```

# Realm初期設定

## Realm.init
これはアプリ起動中に1回行うだけでいいので、カスタムアプリケーションクラスでやるのがオススメ

```kotlin:MyApplication.kt
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Realm.init(this);
    }
```

AndroidManifestにカスタムアプリケーションを登録するのを忘れずに

```xml:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="ikemura.com.kotlinrealmmigration"
    >

    <application
+       android:name=".MyApplication" 
        android:allowBackup="true"
```

# Realm使用

## インスタンス化

いよいよ画面でrealmを使えるようになった

```kotlin
    lateinit var realm: Realm

    private fun initRealm() {
        val realmConfiguration = RealmConfiguration.Builder()
                .deleteRealmIfMigrationNeeded()
                .schemaVersion(0)
                .build()
        realm = Realm.getInstance(realmConfiguration)
    }

```

## Insert

Transaction化しないとIllegalStateExceptionが発生する

```kotlin
        realm.executeTransaction {
            realm.insert(Book(1,"first"))
        }
```

## Read

titleが「first」と一致する値を`book`に取得する

```kotlin
        var book = realm.where(Book::class.java)
                .equalTo("title","first")
                .findAll()
        Log.d(TAG,book.toString())
```

`equalTo`:カラム名, 値 の比較を行える
`findAll`:クエリ条件を満たすすべてのオブジェクトを同期検索する

## Delete
削除もTransaction化しないとIllegalStateExceptionが発生する

```kotlin
        //削除対象を取得
        var book = realm.where(Book::class.java)
                .equalTo("title","first")
                .findAll()
        //削除
        realm.executeTransaction {
            book.deleteAllFromRealm()
        }
```
IBM Cloud Private (ICP) 付属のDockerをCentOSにインストールする

# 経緯

ICP(IBM Cloud Private)のバージョン2.1.0.2がリリースされました。ICPはRHELまたはUbuntuがホストOSの前提ですが、検証目的でCentOSを使いたい場合もあると思います。その際にICP付属のDockerのインストールで少し問題があったのでメモします。

検証環境
- IBM Cloud Private 2.1.0.2 (Kubernetes 1.9.1)

# 事象

## インストールが失敗する

インストールを実行するとエラーになります。

```
# ./icp-docker-17.09_x86_64.bin --install
Extracting docker.tar.gz
Installing docker dependent package
docker started failed. Check /var/log/icp_docker.log for more detail. 
```

## 依存性の欠如が出力される

仮にうまく行っても以下の警告が出力される場合があります。

```
エラー: 依存性の欠如:
	policycoreutils-python は container-selinux-2:2.9-4.el7.noarch に必要とされています
```

注）ICP 2.1.0.3ではpolicycoreutils-pythonが依存関係としてインストールされるようになったようで、このエラーは出なくなりました（2018/6/6追記)

# 対策

まずインストールですが、icp-docker-17.09_x86_64.binの先頭を見ると、Distributionのチェックを指定していますが、ここでCentOSを識別できないことが原因です。

```icp-docker-17.09_x86_64.bin
#!/bin/bash

DISTRO='unknown'

Get_Dist_Name() {
  if grep -Eqi "Ubuntu" /etc/issue || grep -Eq "Ubuntu" /etc/*-release; then
    DISTRO='Ubuntu'
  elif grep -Eqi "Red Hat Enterprise Linux Server" /etc/issue || grep -Eq "Red Hat Enterprise Linux Server" /etc/*-release; then
    DISTRO='RHEL'
  fi
```

依存性の方は依存パッケージの事前インストールが必要です。

# 対応

/etc/issueまたは/etc/redhat-releaseに文字列を追加します。/etc/redhat-releaseは影響が怖いので/etc/issueに追加します（Kernel〜の次）。

```text:/etc/issue
S
Kernel \r on an \m
Red Hat Enterprise Linux Server

```

また、依存パッケージをインストールします。

```
yum -y install policycoreutils-python
```

これで、インストーラが正しく動作します。
webWorker 3pattern gen

```js
let fn={}
fn.worker=(src)=>{
 //inner.js or text or element
 let is={},f=(d=>URL.createObjectURL(new Blob( [d], {type:"text\/javascript"} )));
 is.element=function(o){return !!(o && o.nodeType === 1)};
 is.url=(d=>!/\n|;/.test(d));
 return new Worker( is.element(src)?f(src.textContent):is.url(src)?src:f(src) );
}
```

```js
//fn.q=(d=>document.querySelector(d))
 //var myWorker =fn.worker("onmessage = function(e) {...};")
 //var myWorker =fn.worker('xyz.js')
 var myWorker =fn.worker(fn.q('#w'))

```

```html
<script type="text/plain" id="w">
 onmessage = function(e) {
  console.log('Message received from main script');
  var workerResult = 'Result: ' + (e.data[0] * e.data[1]);
  console.log('Posting message back to main script');
  postMessage(workerResult);
}
</script>
```
【WPF覚書】双方向データバインディング

# はじめに
[前回の記事](https://qiita.com/TAK_EMI/items/ba85ce1e0b65f57364ad)で以下のように締めくくりましたけど、自動的に反映されるようにするには、もう少し修正が必要でした。
> MainViewModel.BindTextを動的に変更すると、それに合わせてLabelのContentプロパティにも自動的に反映される。

# XAML
まずはユーザからの入力値をViewModelへ反映したいので、TextBoxを追加します。
さらにXAML(UI)の値がバインドしたViewModelへ反映されるようにバインドのパラメータを追加します。

```xml:MainView.xaml
<Grid>
	<Grid.RowDefinitions>
		<RowDefinition/>
		<RowDefinition/>
	</Grid.RowDefinitions>
	<TextBox x:Name="textBox" Margin="0,0,0,0" TextWrapping="Wrap" Text="{Binding BindText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" AcceptsTab="True" AcceptsReturn="True"/>
	<Label Content="{Binding BindText, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Margin="0,0,0,0" Grid.Row="1"/>
</Grid>
```

# ViewModel
ViewModelの方も値の変更をXAMLに伝えてあげる必要があります。

```csharp:MainViewModel.cs
using System.ComponentModel;

	:

class MainViewModel : INotifyPropertyChanged
{
	private string _bindText = "てきとうな初期値";
	public String BindText
	{
		get
		{
			return this._bindText;
		}
		set
		{
			this._bindText = value;
			this.OnPropertyChanged(nameof(BindText));

			return;
		}
	}

	public event PropertyChangedEventHandler PropertyChanged = null;
	protected void OnPropertyChanged(string info)
	{
		this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
	}
}

```

# 完成
これで、TextBoxの変更がすぐさまLabelに反映するはずです。
今回ViewModelで追加した部分はBaseViewModelみたいなクラスとして分離しておけば、ViewModelが複数になっても対応するのが簡単になると思います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56012/c51b17d0-9132-2044-1fe3-964a63cb044f.png)
JavaScriptでfloat32のバイナリファイルを読み込む

# はじめに

JavaScriptでローカルにある単精度浮動小数点数型データ(float32)のバイナリデータを読みこむサンプル。

# バイナリデータの作成

まず、C/C++で言うところのfloat型をバイナリで保存する。

```test.cpp
#include <cstdio>
#include <cstdlib>
int
main(void){
  const int N=10;
  float a[N];
  for(int i=0;i<N;i++){
    a[i] = 1.1*(i+1);
    printf("%f\n",a[i]);
  }
  FILE *fp = fopen("test.dat","w");
  fwrite((char*)a,sizeof(float),N,fp);
}
```

コンパイル、実行すると、`test.dat`が生成されるので中身を見てみる。

```shell-session
$ g++ test.cpp
$ ./a.out
$ od -tfF test.dat 
0000000     1.100000e+00    2.200000e+00    3.300000e+00    4.400000e+00
0000020     5.500000e+00    6.600000e+00    7.700000e+00    8.800000e+00
0000040     9.900000e+00    1.100000e+01                                
0000050
```

1.1から11までの数字がバイナリで保存されている。

# JavaScriptでの読み込み

こんなHTMLを書く。

```test.html
<!DOCTYPE html>
<html>
<head>
  <title>Float32 Sample</title>
</head>
<body>
<input type="file" id="file" accept=".dat">
<ul id="data"></ul>
<script>
  function onFileSelect(e) {
    var f = e.target.files;
    var reader = new FileReader();
    reader.onload = function(filename){
      a = new Float32Array(reader.result);
      list = $('data');
      var s = "";
      a.forEach(function(v){
        s = s + "<li>" + v.toFixed(6);
      })
      list.innerHTML=s;
    }
    reader.readAsArrayBuffer(f[0]);
  }
  $('file').addEventListener('change', onFileSelect, false);

  function $(id){
    return document.getElementById(id);
  }
</script>
</body>
</html>
```

処理はこんな感じ。

* ファイルを読み込むinputタグの`change`イベントに対して、`FileReader`オブジェクト`reader`の`readAsArrayBuffer`でロードする。
* `readAsArrayBuffer`は非同期なので、予め`reader.onload`にロードが完了した時の処理を書いておく。
* 読み込まれたデータは`reader.result`に貼っているので、それを`Float32Array`を使って`float32`の型付き配列として読みこむ。
* `Float32Array`の`forEach`はコールバック関数を取る。コールバック関数の引数に配列の中身が順番に入ってくるので、ここではそれをリストに追加している。

# 実行結果

先程の`test.html`を開くとこんな画面になる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/91033315-7194-6901-7c43-0884a879644e.png)

参照ボタンを押して、先程作成した`test.dat`を開くと、中身が表示される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/1a0d0275-e889-1a74-4508-2cd1e4854e66.png)

ちゃんと読めているようですね。

# ハマりポイント

いつくかハマったところなど。

* ローカルファイルは`window.onload`などでは読み込めず、ユーザが明示的に指定する必要がある(セキュリティのため)。
* `Float32Array(reader.result)`で読み込んだ配列にたいして、`for(var v in a)`みたいなfor文を書くと、`v`が`String`型になってしまい、かつ整数に丸められたものになってしまう。`for(var i=0;i<a.length;i++)`みたいにして`a[i]`でアクセスするのはOK。[^1]

[^1]: 素直に配列で回すのとコールバック関数使うのとどちらが良いのかは知りません。
Firebase Hosting から Functions への rewrite とパーマリンク [BitScheduler開発日誌]

人生同様、モチベーションも山あり谷あり。
BitScheduler開発日誌、1年ぶりの6回目です。

今回は Firebase Hosting から rewrite 設定を使って CloudFunctions を呼び出す際のパーマリンクの受け渡し方法です。
Hosting では firebase.json に rewrite を設定でき、接続先に functions を指定できます。

### rewrite による functions 接続の設定例
``` json
"hosting": {
    "public": "public",
    "rewrites": [
      {
        "source": "/home/**", "function": "home"
      },
      {
        "source": "/detail/**", "function": "detail"
      }
    ]
}
```

上記では Hosting への "/home" リクエストが functions の "/home" 関数呼び出しとなります。
その際、"**" を指定しているため、"/home" 配下のサブディレクトリの指定が home 関数にも渡ります。

リクエストが "/home/hoge" だった場合、リクエストパス（req.path）にはそのまま "/home/hoge" が割り当てられるため、home 関数に対するパーマリンクである "hoge" を取得する場合は下記コードになります。

### パーマリンクの取得例
``` javascript
exports.home = functions.https.onRequest((req, res) => {
    let dir1 = req.path.split('/')[1];  // dir1 = 'home'
    let dir2 = req.path.split('/')[2];  // dir2 = 'hoge'
}
```

## 参考情報

[Firebase Hosting デプロイ設定](https://firebase.google.com/docs/hosting/full-config#section-glob)

## BitSchedulerとは
開発中の出欠投稿サービスです。Googleカレンダーと連携することで簡単に管理、運用できることを目指しています。
ぜひ「いいね」して応援してください！

[BitSchedulerランディングページ](https://bitscheduler-fb66d.firebaseapp.com/)
phina.js でフレームレート(fps)やメモリ使用量を表示する

この記事では [phina.js](http://phinajs.com/) に組み込まれている [stats.js](https://github.com/mrdoob/stats.js/) の機能を使って、開発中のゲームのフレームレート(fps)やメモリ使用量を確認する方法について書きます。

なおこの記事を書くにあたって参照した [phina.js](http://phinajs.com/) のバージョンは 0.2.3 です。
ただし基本的な仕組みは今後もそんなに変わらないと思います。

## 基本的な使い方

すでに [[phina.js] サンプルから覚えるphina.js](https://qiita.com/simiraaaa/items/ba83ce70cb091e8bdfab#appenablestats) や [[phina.js-Tips-44] ゲームのfpsを変えてみる](https://qiita.com/alkn203/items/ffd7c59498cdc932f323) 等でも紹介されていますので、[phina.js](http://phinajs.com/) を使っている方であればすでに知っているかもしれませんが一応書いておきます。

使い方は本当に簡単で GameApp のメソッド enableStats() をコールするだけです。

```JavaScript
phina.main(function() {
  var app = GameApp();

  app.enableStats();  // コレだけ!!!
  
  app.run();
});
```

[Runstant](http://runstant.com/projects?tag=phina.js) でもみなさん表示されていますね。

グラフをクリックすると、フレームレート(fps) → 1フレームあたりの時間(ms) → メモリ使用量(Mbyte)、と切り替わります。

## 仕組み解説

enableStats() は、GameApp クラスのずっと上のスーパークラスの BaseApp (GameApp ← CanvasApp ← DomApp ← BaseApp) で定義されています。[^1]

メソッドをコールすると、global にすでに Stats が定義されている(≒[stats.js](https://github.com/mrdoob/stats.js/) が読み込まれている)ならその Stats を、なければインターネットから [stats.js](https://github.com/mrdoob/stats.js/) を自動的に読み込んで表示します。

事前に [stats.js](https://github.com/mrdoob/stats.js/) をダウンロードして html から script タグ等で読み込むことでインターネットに接続していない環境でも動作させることが出来ます。

[phina.js](http://phinajs.com/) から自動で読み込む場合は [stats.js](https://github.com/mrdoob/stats.js/) の r14 が読み込まれます。
自前で読み込む場合には好きなバージョンのものを使うことが出来ますが互換性に注意が必要です。
2018/3/21 時点の [stats.js](https://github.com/mrdoob/stats.js/) の最新は r17 です。
r14 と比べると表示位置がデフォルトで左上になる等いろいろ変わっているようです。

## stats.js の表示内容をプログラムで変更する

enableStats() をコールしてグラフを表示すると app に stats というプロパティが生成されます。
この stats のメソッド setMode() をコールすることでグラフの表示内容を変更することが出来ます。

```JavaScript
// グラフの表示を表示内容を変更する
//   0: フレームレート, 1: 1フレームあたりの時間, 2: メモリ使用量
//   r15 以降は showPanel() でも OK
app.stats.setMode(1);
```

ただし stats プロパティが生成されるタイミングについて注意する必要があります。
事前に [stats.js](https://github.com/mrdoob/stats.js/) を読み込んでいれば enableStats() コール直後に生成されているのですが、[phina.js](http://phinajs.com/) から自動で読み込む場合は非同期となり少し時間が経ってから でないと stats プロパティが生成されません。

## ユーザ定義パネルの使い方

[stats.js](https://github.com/mrdoob/stats.js/) では r15 からユーザ定義パネルの機能が追加されています。

こんな感じで簡単に使うことが出来ます。

```JavaScript
  // stats.js を有効にする(注: r15 以降を事前に読み込んでおく)
  app.enableStats();

  // ユーザ定義パネル生成(name, fg, bg)
  app.myPanel = new Stats.Panel('Test', '#cc6', '#440');

  // ユーザ定義パネル追加
  app.stats.addPanel(app.myPanel);

  // 4つめのパネル(=上で追加したパネル)を表示
  app.stats.showPanel(3);
```

追加したパネルに対し update() メソッドをコールするとグラフが更新されます。

```JavaScript
// ユーザ定義パネルのグラフを更新
app.myPanel.update(newValue, maxValue);
```

簡単なサンプルは [Runstant](http://runstant.com/Hansel/projects/93e3c3fa) にあります。

[^1]: [ここ](https://github.com/phinajs/phina.js/blob/v0.2.3/src/app/baseapp.js#L133)です。
Python 機械学習プログラミング P.58 3.8.8式、3.3.10式について

少し詰まったので、一応メモ。

P.58の3.8.8式で突然、確率の総乗(Π)が出て来たので意味がわかりませんでしたが、どうやらこれはベルヌーイ分布より来ているみたいですね。

f(k;p) = (p^k)*((1-p)^1-k)

とはいうものの、ふつうに考えて、
φ(z)が確率、yが2値（φ(z)>=0.5 y＝1、φ(z)<0.5 y=0）なので、単純に確率の積とも解釈できますね。（この時の分布をベルヌーイ分布という）

コインの話で言えば、表が3回連続で出る確率は、(1/3)\*(1/3)\*(1/3) = 1/27と言うのと同じ話ですね。

参考URL
http://tkengo.github.io/blog/2016/08/22/maximum-likelyhood-estimation-by-machine-learning/


(追記)
3.3.10式
http://gihyo.jp/dev/serial/01/machine-learning/0018?page=2
Rails初心者によるRails関連コマンドまとめ

今入っているもののバージョンを調べる為のコマンド、環境を作るコマンド。
悪戦苦闘していろいろ学んだことをメモとして残します。

#rbenv （Ruby バージョン管理ツール）
類似のバージョン管理ツール rvm とは共存しないほうが良いらしい。
よく使うコマンド

```shell-session
$ rbenv -v # ←rbenvのバージョン確認
rbenv 1.1.1 
$ rbenv install --list
  1.8.5-p52
  1.8.5-p113
  1.8.5-p114
　　　・・・　　　　# ←インストールできるリストの表示
$ rbenv install 2.*.* #←いれたいバージョンを入力
＄ rbenv rehash #rbenvの読み直し
＄ rbenv global 2.*.* #←使用したいバージョンを選択
$ ruby -v # 確認
$ rbenv versions # こっちで確認だともっと詳しい
  system
  2.0.0-p481
* 2.3.6 (set by /Users/＊＊＊＊/.rbenv/version)
  2.4.1
```
参考：[rbenvとは？（rbenvを利用したRubyのインストール）](https://qiita.com/yunzeroin/items/33a51c805e60ed5eca0e)

#Ruby基本設定
```ruby -v```
→ ruby 2.X.X が出るならRuby OK。
　（ 出ないなら  http://rubyinstaller.org/downloads/ で Rubyインストール ）

```rails -v```
→ rails 2.X.X が出るならRails OK。
　（ 出ないなら 
 ▽Mac
　（エラーにあわせた対応）
 ▽windows
　　１、Development Kitを解凍し、Ruby以下、devkitフォルダに解凍
　　２、 ＄ruby dk.rb init　
　　３、 ＄ruby dk.rb install
　　４、 ＄gem install rails --no--ri --no-rdoc
　　５、 ＄rails -v　 ＃←反応あれば成功 ）
 参考：[Ruby on RailsをWindowsでインストールする方法【初心者向け】](　https://techacademy.jp/magazine/7058)

```gem -v
```→バージョンが出ればgem OK

```mysql.server start
```Starting MySQL SUCCESS! が出ればOK
 （出ないなら ＄brew install mysql

#Git
（予め cd で移動した上で）
```git clone git@bitbucket.org:XXXXXX/YYYYYY.git
```
これ以外の push ブランチなどは
Soucetree を使うと楽。

#その他 よく使うキー

ファイル・隠しフォルダを表示： [command] + [shift] + [.(ドット)]

#gitからソースを落として、railsで動かすためのコマンド
```shell-session
cd ~/src    
git clone git@bitbucket.org:****/***.git
cd ~/src/***
bundle install #←　うまくいかない時は下記※
rake db:create
rake db:migrate
rails s #うまくいくとブラウザにて http://localhost:8080/ で表示できるはずです。
```

#↑でうごかない時
・　bundle install でコケる
```$ brew doctor``` で問題が出ていないか確認。
rmagincのパスが通ってない問題の場合は下記で解決。
```$ brew link imagemagick```

・参考：
http://kazumalab.hatenablog.com/entry/2016/07/24/134937

#その他 参考にさせて頂いたページ
▽初期環境構築関連
[はじめてのRuby環境構築 (Windows編その1)](
https://qiita.com/machu/items/91038f4d4a3b9b5bd6f1)
[最速！MacでRuby on Rails環境構築](https://qiita.com/narikei/items/cd029911597cdc71c516)

▽便利コマンド
[ターミナルからFinderを開く](https://qiita.com/ShinichiOkayama/items/53ddd4cdeb82b3e37efb)
[viコマンド集](http://www.ritsumei.ac.jp/~tomori/vi.html)
[初心者は覚えておきたいRubygemsのコマンドまとめ](https://qiita.com/muran001/items/14f34b735e0a6b4af98c)

▽障害復旧関連
[ファイルのコピーができない時(Permission denied)の対処方法](https://qiita.com/g_yasu/items/930bc4fc1bda2551636d)
[gem installでpermission deniedされました](https://qiita.com/serachips/items/35b62839b57fbfa25566)
[gem install rmagickで失敗する。](https://qiita.com/KTakata/items/f4a632207af0a8078c06)

▽その他 知識
[Linuxの権限確認と変更（超初心者向け）](https://qiita.com/shisama/items/5f4c4fa768642aad9e06)
[【鍵なしは】ssh接続を認証鍵方式にしてみた【シャットアウト】]
(http://www.kyoji-kuzunoha.com/2012/06/ssh-server-key.html)

▽SSHエラー解決
[MacでSSH公開鍵・秘密鍵ファイルをコピーして使ったら警告がでた]
(http://blog.ruedap.com/2011/04/04/mac-ssh-key-copy-error)
メモ： Kubernetesのソースコードをmake quick-releaseでビルド後し、kubelet及びコンテナイメージを入れ替える手順について

## k8sビルド用サーバーでの作業
特定の修正を試したい場合、パッチを適用後に必要なバイナリを作成する。
作成したバイナリ、コンテナイメージをマスター及びKubeket Nodeへコピーする。今回はKubelet、APIとController Managerのコンテナイメージのみを入れ替えている。

```
# make quick-release
# scp ./_output/local/go/bin/kubelet k8s-master:/root
# scp ./_output/local/go/bin/kubelet k8s-node:/root
# scp kube-apiserver.tar kube-controller-manager.tar k8s-master:/root
```

## k8s-masterノードでの作業
コピーしたkubelet及びコンテナイメージを入れ替える。
kubeletサービスを再起動、"docker stop image_id"及び"docker start image_id"でコンテナを再起動する。

```
# cp /usr/bin/kubelet /usr/bin/kubelet.org
# cp /root/kubelet /usr/bin/kubelet
# docker import kube-apiserver.tar gcr.io/google_containers/kube-apiserver-amd64:v1.9.4
# docker import kube-controller-manager.tar gcr.io/google_containers/kube-controller-manager-amd64:v1.9.4
```

##k8s-nodeノードでの作業
コピーしたkubeletを入れ替える。
kubeletサービスを再起動する。

```
# cp /usr/bin/kubelet /usr/bin/kubelet.org
# cp /root/kubelet /usr/bin/kubelet
```
Windows10にvagrantを入れてssh接続する

# 目的
Reactの勉強、ブロックチェーンの実験環境を準備しようと思い、手軽に仮想環境を構築できる（らしい）、Vagrantを利用してみようと思います。

# 流れ
以下の流れで進めていきます。
- VirtualBoxのインストール
- Vagrantのインストール
- 仮想マシン作成
- ssh接続

# VirtualBoxのインストール
VirtualBoxのインストーラーはこちらの[リンク](https://www.virtualbox.org/)からダウンロードできます。
![VirtualBox.PNG](https://qiita-image-store.s3.amazonaws.com/0/139070/3d831885-dbb4-8207-f04f-fc7075107b5b.png)

ホストOSがWindowsなので、「VirtualBox 5.2.8 platform packages」は『Windows hosts』を選択します。
![VirtualBox_2.PNG](https://qiita-image-store.s3.amazonaws.com/0/139070/284b492f-f221-cdf5-cc78-3a3b1012236b.png)


ダウンロード完了後、インストーラーを起動します。ご自身の利用要件に合わせてインストールしてください。

# Vagrantのインストール
VirtualBoxのインストーラーはこちらの[リンク](https://www.vagrantup.com/)からダウンロードできます。

![Vagrant_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/139070/267a1929-dc71-d520-31e4-1ed92a11bafd.png)
真ん中のDOWNLOAD 2.0.3をクリックします。

![Vagrant_2.PNG](https://qiita-image-store.s3.amazonaws.com/0/139070/86425a1e-28e8-9628-ab0e-58db691f27b4.png)

ホストOSはWindows10なのでWindowsの64-bitを選択します。
ダウンロード完了後、インストーラーを起動します。ご自身の利用要件に合わせてインストールしてください。

# 仮想マシン作成
## 要件
今回は、仮想マシンを以下の要件で作成します。
- 仮想マシンOS：ubuntu（ubuntuのバージョンはLTS対応となっているXenial Xerus）
- ディスクサイズ：デフォルト（今後変更する場合は記載します）
- メモリ：デフォルト（今後変更する場合は記載します）
- vCPU：：デフォルト（今後変更する場合は記載します）
- 構成ファイルの作成場所：D:\Users\yuki\ubuntu

## 仮想マシンの作成
cd /d D:\Users\yuki\ubuntuでD:\Users\yuki\ubuntuへ移動し、以下のコマンドを実行します。

ubuntu/xenial64の初期化（vagrantfileの作成）
`> vagrant init ubuntu/xenial64`

プロバイダーを指定して、仮想マシンの起動する
`> vagrant up --provider virtualbox`

これだけです。仮想マシンは起動しました。
他のコマンドをたたいてみます。
仮想マシンの状態を見る場合には、`vagrant status`を実行します。

```
D:\Users\yuki\ubuntu>vagrant status
Current machine states:

default                   running (virtualbox)

The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.
```
起動後なので、runningと表示されました。

次にsshの設定情報を確認します。

```
D:\Users\yuki\ubuntu>vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile D:/Users/yuki/ubuntu/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
```

接続時に指定する`User`名や`Port`番号が分かります。また、ssh接続の際に秘密鍵が必要となります。秘密鍵の保管場所は`IdentityFile`に記載されています。


# ssh接続
sshクライアントはインストールする必要があります。今回は普段使っているTeraTermで接続します。

ホストには127.0.0.1、TCPポートには2222を指定します。
![teraterm_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/139070/7287af82-9c70-fd34-ba36-9e4bb7e33f7c.png)

ユーザ名とパスフレーズは、デフォルトでは「vagrant」です。
![teraterm_2.PNG](https://qiita-image-store.s3.amazonaws.com/0/139070/9ae6fe8a-98ba-d828-a6dd-b3277e4d78dd.png)

接続できました。
![teraterm_3.PNG](https://qiita-image-store.s3.amazonaws.com/0/139070/8f79961a-f3ca-146d-13c1-a4391dd7b5b6.png)

以上。
Vue.jsでChart.js使ったらはまった（グラフが出ない）：解決済み

# 概要
突貫コーディングをしていたところChart.jsのグラフが描画されないことがありました。
僕がVue.jsの仕様をちゃんと把握していないことが原因で反省文代わりに書きます。
同じことではまる人の参考になればと思います。
詳しいことは追々学習します、投げっぱなし投稿スミマセンスミマセン!!

# 乱暴な結論

- おとなしく[vue-chartjs](https://github.com/apertureless/vue-chartjs/ "vue-shcatjs")使え
- DOMの更新タイミングを考えろ

# 詳細
諸事情によりVue.js使っているのにvue-xxxx系のモジュールを使っていませんでした。
下記「グラフが出なかった時のコード」でブラウザのDeveloper Toolsを見ると「Canvasが見つからねーよ（意訳）」とかで怒られた…と思う（うろ覚え
正しくエレメントが取得できることとDOMの描画タイミングがポイントっぽい。

## 構成
- Vue.js：2.x系
- Chart.js：2.7.1

## グラフが出なかった時のコード
### HTML
```html:index.vue
<template lang="pug">
  div#app
    canvas#myChart
</template>
```

### JavaScript

__※読み込みはmain.jsで行っている前提です。__

```index.vue
<script>
var ctx = document.getElementById("myChart").getContext('2d');
var myChart = new Chart(ctx, {
    type: 'bar',
    data: {
        labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
        datasets: [{
            label: '# of Votes',
            data: [12, 19, 3, 5, 2, 3],
            backgroundColor: [
                'rgba(255, 99, 132, 0.2)',
                'rgba(54, 162, 235, 0.2)',
                'rgba(255, 206, 86, 0.2)',
                'rgba(75, 192, 192, 0.2)',
                'rgba(153, 102, 255, 0.2)',
                'rgba(255, 159, 64, 0.2)'
            ],
            borderColor: [
                'rgba(255,99,132,1)',
                'rgba(54, 162, 235, 1)',
                'rgba(255, 206, 86, 1)',
                'rgba(75, 192, 192, 1)',
                'rgba(153, 102, 255, 1)',
                'rgba(255, 159, 64, 1)'
            ],
            borderWidth: 1
        }]
    },
    options: {
        scales: {
            yAxes: [{
                ticks: {
                    beginAtZero:true
                }
            }]
        }
    }
});
</script>
```

## グラフが出るコード
### HTML
変更なし

### JavaScript

```javascript:index.vue
export default {
  mounted () {
    this.$nextTick(() => {
      const ctx = this.$el.querySelector('#canvas').getContext('2d')
      this.chart = new Chart(ctx, {
        type: 'bar',
        data: {
          //いい感じに
        },
        oprions: {
          //いい感じに
        }
      })
    })
  }
}
```
## 参考ページ
* [Github Chart.js Issue#3715](https://github.com/chartjs/Chart.js/issues/3715)
* [vm.$mount](https://jp.vuejs.org/v2/api/index.html#vm-mount)
* [vm.netxtTick](https://jp.vuejs.org/v2/api/index.html#Vue-nextTick)
* [Chart.js](http://www.chartjs.org/docs/latest/)
データセクションの書き方【GLPK】

[<--目次へ](https://qiita.com/ki073/items/508b3c20eb03078703dd)

既存のGLPKプログラムを使う時には、自分でデータセクションを書く必要がありますが、知っておけば便利な書き方を紹介します。詳しいことはGLPKに同梱されているgmpl.pdfに書かれていますのでそちらも見てください。

data文より後の書き方です。data文より前の、モデル定義部分では違った書き方をしますので注意してください。

データが文字列の場合は、クオーテーションマーク"で囲んでください(日本語の場合は必ず囲う必要があります)
ただし、英数字の場合は囲む必要が無いようです。

## Set

#### 一次元集合を読み込む場合

```GLPK:data01.mod
set Set1;
display Set1; # 表示
data;
set Set1 := 1 2 3;
```

一次元の集合を読み込みます。データは途中に改行があっても構いませんし、カンマで区切っても構いません。セミコロン;までが意味のあるデータです。

#### 多次元集合を読み込む場合

3次元の場合を例にします。

```GLPK:data02.mod
set Set2 dimen 3;
display Set2; # 表示
data;
set Set2 :=
1 2 3
1 2 4
1 3 5
1 3 6;
```

dimen 3 のように必ず次元を宣言します。(dimenがない場合は1次元)
その場合は3つ単位に順番に読み込みます。

set Set2 :=
(1, 2, *) 3 4
(1, 3, *) 5 6;
のように\*を後ろのデータで置き換えることができますので効率的な書き方ができます。

\*が2つで
set Set2 := (1, *, *) 2 3, 2 4, 3 5, 3 6;
のような書き方もできます。


## Parameter

単純なパラメータの場合です。

```GLPK:data11.mod
param param1;
param param2 symbolic;
display param1;
display param2;
data;
param param1:=5;
param param2:="abc";
```

値が文字列の場合はsymbolicに指定しておくことが必要です。

添字を持った配列の例です。添字(Set3)はSetで予め設定しておくか

```GLPK:data12.mod
set Set3;
param param3{Set3};
display param3; # 表示
data;
set Set3 := "A" "B" "C";
param param3 :=
"A" 1
"B" 2
"C" 3;
```

param3が同じ数値が多い時にはdefaultを使うと楽に書けます。

```GLPK:data12a.mod
set Set3;
param param3{Set3};
display param3; # 表示
data;
set Set3 := "A" "B" "C";
param param3 default 1 :=
"B" 2
;
```
表示では`param3[B] = 2`しか出ませんが、`param3[A]=1, param3[C]=1`として機能します。

(2022.1.17 追記)

```GLPK:data12b.mod
省略
data;
set Set3 := "A" "B" "C";
param param3 default 1 :=
["B"] 2
;
```

のように[]で囲っても構いません。
また英文字で始まり日本語を含まないときは
set Set3 := A B C;
クオーテーションマークで囲む必要もありません。

次の書き方では、添字(Set3)はparamの中で同時に読み込めます。

```GLPK:data13.mod
set Set3;
param param3{Set3};
display param3; # 表示
data;
param : Set3 : param3 :=
"A" 1
"B" 2
"C" 3;
```

表のような形式で、同時に2つのパラメータを読み込むことができます。

```GLPK:data14.mod
set Set3;
param param3{Set3};
param param4{Set3};
display param3; # 表示
display param4;
data;
param : Set3 : param3 param4 :=
"A" 1  1.1
"B" 2  2.2
"C" 3  3.3;
```

##コメント
\#より行末まで
/* から */ の間はコメントになります。
メモや書いたデータを一時的にはずすのに使えます。
Pythonで短縮URLを生成する【bitlyAPI】

初投稿となります。はてなブログから引っ越してきました。

今回は、Pythonを使って短縮URLを生成してみました。bitlyにはモジュールがありますが使えなくなっていたので？自分で作ってみました。大量のURLを捌く時に結構便利ですよ～。

##**用意するもの＆使った環境**
・Python 3.6.2 pip3
・requests（pip3 install requestsでインストール）
・[bitly](https://bitly.com/)でアカウントを作ってアクセストークンを取得しておく

##**こーど**

```python
import requests

def get_shortenURL(longUrl):
    url = 'https://api-ssl.bitly.com/v3/shorten'
    access_token = 'アクセストークン'
    query = {
            'access_token': access_token,
            'longurl':longUrl
            }
    r = requests.get(url,params=query).json()['data']['url']
    return r
```

**実行結果**

```python
print(get_shortenURL('https://qiita.com'))

http://bit.ly/2IHRlxO
```
`get_shortenURL（）`の引数に短縮させたいURLを入れるだけです〜簡単です〜


##**参考文献**

[bitly公式API説明書](https://dev.bitly.com/links.html#v3_shorten)

[bitly APIの使い方](https://qiita.com/maruyam-a/items/96c8ad733c770a44117e)

[Qiitaに投稿する記事の書き方に望むこと](https://qiita.com/riocampos/items/43b8c47e14d63dc6f6a4)
(初投稿なので参考にさせて頂きました！)
[Java] ResolverStyle.LENIENTを利用して日時をいい感じに扱う

## 概要
Java8より利用可能な、 `java.time.format.ResolverStyle` を使って、
扱いづらい日時を、いい感じに利用できます。
`25:16` ってどうやって扱えばよいのかわからないといった方に便利です。

## java.time.format.ResolverStyleとは？
Java8より、`java.time.format.DateTimeFormatter`を利用して
Stringから日時オブジェクトへ変換します。
変換する際のスタイルが、`Enum`として`ResolverStyle`に定義してあります。  `DateTimeFormatter`へ渡すことで、スタイルを切り替えることができます。  

### スタイル (3種類)
(STRICTとSMARTに関しては、実証できていないのでさらっと記載してます)

#### STRICT
> 日付と時間を厳密に解決するスタイル

#### SMART
> 日付と時間をスマートな(賢い)方法で解決するスタイル。

#### LENIENT
> 日付と時間を厳密でない方法で解決するスタイル。

- 厳密でない解決 = 良い感じに解釈してくれる
- 例
  - `2018-01-32` → `2018-02-01`
  - `2018-01-01 25:00` → `2018-01-02 01:00`
  - `2018-01-01 00:67` → `2018-01-01 01:17`

## 実装
LocalDateTimeクラスへの変換を記載しています。

### 実装クラス
`DateTimeFormatter#withResolverStyle()` にてスタイルを指定する
[参考実装](https://github.com/midorigreen/resolver-style/blob/master/src/main/java/SampleResolver.java#L12)
(一部抜粋)

```java
public class SampleResolver {
    private DateTimeFormatter formatter;

    public SampleResolver(String format, ResolverStyle style) {
        this.formatter = DateTimeFormatter
                .ofPattern(format)
                // ここが重要
                .withResolverStyle(style);
    }

    public LocalDateTime formatLocal(String s) {
        return LocalDateTime.parse(s, formatter);
    }
}
```

### テスト
下記のテストが全て通ります。
[参考テストコード](https://github.com/midorigreen/resolver-style/blob/master/src/test/java/SampleResolverTest.java#L25)
(一部抜粋)

```java
// Fixture("入力値", "期待値")
@DataPoints
public static Fixture[] fixtures = {
        // 一般
        new Fixture("2018-01-01 10:00", "2018-01-01 10:00"),
        // 月が13
        new Fixture("2018-13-01 00:00", "2019-01-01 00:00"),
        // 日が32
        new Fixture("2018-01-32 00:00", "2018-02-01 00:00"),
        // うるう年
        new Fixture("2020-02-29 00:00", "2020-02-29 00:00"),
        // うるう年 + 1日
        new Fixture("2020-02-30 00:00", "2020-03-01 00:00"),
        // 時刻が24
        new Fixture("2018-01-01 24:00", "2018-01-02 00:00"),
        // 時刻が48
        new Fixture("2018-01-01 48:00", "2018-01-03 00:00"),
        // 分が70
        new Fixture("2018-01-01 00:70", "2018-01-01 01:10"),
};

@Theory
public void formatLocal_LENIENT(Fixture f) throws Exception {
    SampleResolver r = new SampleResolver(FORMAT, ResolverStyle.LENIENT);

    LocalDateTime actual = r.formatLocal(f.input);
    assertThat(f.toString(), actual.format(actualFormatter), is(f.expected));
}

```

## 所感
利用した感覚としては、大方期待通りの動作をしてくれています。
「日付またぎ等の仕様で25時xx分を扱わないといけない」となった場合に、
利用してみるのはいかがでしょうか。

## 参考
- [ResolverStyle (Java Platform SE 8 )](https://docs.oracle.com/javase/jp/8/docs/api/java/time/format/ResolverStyle.html)
- [DateTimeFormatter (Java Platform SE 8 )](https://docs.oracle.com/javase/jp/8/docs/api/java/time/format/DateTimeFormatter.html)
- [JUnit | JUnit4のDataPointsによるテストとFixtureと流れるようなインターフェース](http://tbpgr.hatenablog.com/entry/20121003/1349285882)
WebstormでNode.jsの補完を有効にする

ExpressプロジェクトをWebstormで開いたら`require`に黄色下線が引かれてしまう問題に直面した。
ググるとどうもNode.js(サーバーサイドJavascript)の補完を有効にする必要があるらしい。

# 対処

1. Preferenceを開く
2. Languages&Frameworksを開く
3. Node.js and NPMを開く
4. CodingAssistanceをEnableにする

![スクリーンショット 2018-03-21 23.04.26.png](https://qiita-image-store.s3.amazonaws.com/0/176237/af44ce97-227d-9bcb-7d7e-b98ecbfcdb28.png)

↑のEnableをクリック

これで解決した。