OmniAICreator/Qiita-1.07M huggingface dataset:
計測データ（薬剤）

```{r}
#統計検定量から多次元尺度(torgerson method)へ

library(dplyr)

data=data.frame(処理=c(rep("M",12),rep("P",11)),sex=c(1,1,1,1,1,1,2,2,2,2,2,2,1,1,1,1,1,1,2,2,2,2,2),t1=c(317,186,377,229,276,272,219,260,284,365,298,274,232,367,253,230,190,290,337,283,325,266,338),t2=c(280,189,395,258,310,250,210,245,256,304,321,245,205,354,256,218,188,263,337,279,257,258,343),t3=c(275,190,368,282,306,250,236,264,241,294,341,262,244,358,247,245,212,291,383,277,288,253,307),t4=c(270,135,334,272,309,255,239,268,242,287,342,263,197,333,228,215,201,312,318,264,326,284,274),t5=c(274,197,338,264,300,228,242,317,243,311,357,235,218,338,237,230,169,299,361,269,293,245,262),t6=c(266,205,334,265,264,250,221,314,241,302,335,246,233,355,235,207,179,279,341,271,275,263,309))

k=ncol(data)-2;n=nrow(data)

Y=as.matrix(data[,!(colnames(data) %in% c("処理","sex"))])

tD=array(0,dim=c(k-1,k))

for(j in 1:(k-1)){
  
  
tD[j,j:(j+1)]=c(-1,1)  
  
}

D=t(tD)

diff=solve(t(D)%*%D)%*%t(D)

d_mat=array(0,dim=c(n,n))

mat=array(0,dim=c(n,n))

kai_mat=array(0,dim=c(n,n))

for(j in 1:n){
for(i in 1:n){  

if(i!=j){    
  
d_mat[i,j]=sum(((diff)%*%c(Y[i,]-Y[j,]) )^2)

mat[i,j]=sum(((diff)%*%c(Y[i,]-Y[j,]) ))

kai=0

for(l in 1:(k-1)){
  
  
kai=kai+(k*l)*(sum(Y[i,1:l]-Y[j,1:l])/l-(mean(Y[i,])-mean(Y[j,])))^2/(k-l)
  
  
}

kai_mat[i,j]=kai/2

}
  
}
}


cor_mat=array(0,dim=c(n,n))

for(j in 1:n){
for(i in 1:n){  

if(i!=j){
  
coef=(diff)%*%c(Y[i,]-Y[j,])

cor_mat[i,j]=cor(Y[i,]-Y[j,],D%*%coef)

print(paste0("columns:",i,",",j))

print((Y[i,]-Y[j,]-mean(Y[i,]-Y[j,]))/sd(Y[i,]-Y[j,]))

print((c(D%*%coef)-mean(c(D%*%coef)))/sd(c(D%*%coef)))



}
  
}
}  
  
  
```

```{r}

#torgerson method

library(dplyr)

mat=kai_mat

d=mat

ave_ncol_d=apply(d^2,1,mean)

ave_nrow_d=apply(d^2,2,mean)

B=array(0,dim=c(nrow(mat),ncol(mat)))

for(i in 1:nrow(B)){
for(j in 1:ncol(B)){  
  
B[i,j]=(-1/2)*((d[i,j]^2)-ave_ncol_d[i]-ave_nrow_d[j]+mean(d^2))  
  
}
}

eigen_values_B=eigen(B)$values

eigen_vectors_B=eigen(B)$vectors

eigen_values_B=eigen_values_B[1:2]

eigen_vectors_B=eigen_vectors_B[,1:2]

X=eigen_vectors_B%*%diag(sqrt(eigen_values_B),length(eigen_values_B))

plot(X[,1],X[,2],col=2,type="p",xlab="principal component 1",ylab="principal component 2", main="torgerson method")

```
Codingameコンテスト、Code a la Mode参戦記 (世界30位、日本5位)

2019/3に開かれたCodingameのコンテストに参加しました。
色々あって目標だった20位以内に入れなかったので、反省も込めて参戦記を書きます。
ちなみに今回のコンテストで**数万円を無駄にしてしまった**ので、課金額で言ったら1位なんじゃないかと思ってます。

# ゲーム概要

<img width="659" alt="Screen Shot 2019-03-27 at 20.49.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/69504/b1c359b9-f530-43a1-cfea-4ab4f797f5b6.png">

キッチンにある食材を調理して、料理を作って客に出すゲームです。
現在でもこのゲームで遊べるので、ルール詳細が気になる方は↓から見れます。
https://www.codingame.com/ide/puzzle/code-a-la-mode

このゲームの難しい所は、自分が作ったものではないAIと二人同時にプレイする所です。
当然相手と協力した方が良い点数を取れるのですが、メッセージを送るなど相手と直接コミュニケーションを取ることは出来ません。
なので空気を読んで相手と協力する必要があります。

# 立てた方針

このゲームでは、食材の準備や食材の提供に何個かの手順を踏む必要があります。
そこで現在達成したい小目標を設定し、それを達成するためにルールベースのAIを書きました。
どの小目標を選択するかは、

```
{小目標の達成価値} / {小目標の達成に必要なターン数}
```

を評価値として最も高いものを毎回選択する方針としました。

小目標の達成価値は、盤面の特定のパラメータ(例えばオーダーにあるタルトの数など)に重みをかけて算出します。
このパラメータは探索が難しいので、初期値は直感で設定して、遺伝的アルゴリズムを用いた自己対戦で探索することにしました。*後から思うとこれが失敗だった...*

## 小目標の設定

以下のような小目標を設定しました。

- 料理の素材を準備する
    - イチゴを刻む
    - クロワッサンを焼く
    - タルトを焼く
- オーブンに入っているものを取り出す 
- 料理1,2,3を作る
- 皿や素材を取りやすいように配る
    - 皿、イチゴ、ブルーベリー、アイス、生地

それぞれの動作はルールベースで書いています。
ルールベースの部分には細かい工夫を多数盛り込んでます。
例: 料理を作る部分は一番早い順を幅優先探索で求める、素材を机に置く際は中央のテーブルに置くようにする

小目標の評価値の算出式はそれぞれ別に設定しました。
例: イチゴを刻む評価値 = 定数値 + オーダーに含まれるイチゴの数 * 重み1 + すでにキッチンにあるイチゴの数 * 重み2

最初は重みを直感で設定して実装していました。
*今思うと重みを直感で実装していた時が一番順位が高かった...*
↓パラメータ探索に取り掛かる直前くらいの順位表
<img width="1562" alt="Screen Shot 2019-03-27 at 21.26.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/69504/92eccf98-9197-1208-aabb-f1c6683a5a06.png">


## パラメータ探索

人間が直感で設定したパラメータで5位(一瞬2位まで行ったらしい)になっていたし、パラメータ探索すればもっと上にいけるじゃん！と取り掛かり始めは思っていましたが...

ひとまずGithubで公開されているゲームシステムのコードを持ってきて、ローカルで自己対戦できるよう改造しました。
pythonで簡単に自己対戦&結果集計をするプログラムを書き、1000試合ほどした後に結果を集計してスコアに従って次の世代のパラメータを作成を繰り返しました。

しばらく回しましたが...
**全然自分が直感で設定したパラメータのAIを超えられない!!!**

1日くらい探索すると、完全ランダムのパラメータからスタートして自分が設定したパラメータと同じくらいの強さにはなりましたが、大して変わらないスコアになってしまいます。
しかも自分のAIを超えるスコアを取る個体が現れたのに、次の世代ではいなくなってたりします...
結局パラメータ探索は成果が出せず、後半4日間くらいを完全にドブに捨ててしまったためズルズルと順位を下げてしまいました...

## 遺伝的アルゴリズムによるパラメータ探索がダメだった理由

ちゃんと検証は出来ていませんが、以下のような理由があったと考えられます。

- 1世代の試合数が少なく、運のブレで弱いパラメータが生き残ったりしてしまっていた
    - 各AI1000試合こなすくらいの試合数は行ったのですが、まだ足りなかったのかもしれません。
    - 各試合の乱数のシード値を固定していなかったため、配置による不公平が起きてしまう可能性も排除できていませんでした
- 1世代の個体数が少なすぎた
    - 自己対戦を3人の総当たりでやっていたため、試合数が多くなりすぎないように1世代の個体数を10程度にしていたのですが、少なすぎたかもしれません。
    - しかし増やすと試合数が多すぎて終わらないので、悩ましいところです...
- パラメータの数が少なすぎた(20~30ほど)
    - この程度の数のパラメータだと、探索しても実現できる評価値の式の形はたかが知れています。より多様な動きをさせるために、より多くのパラメータを用いて評価を出すべきだったかも知れません。
- 直感による初期値が実は最適解だった
    - この可能性もあります。 

パラメータ探索させるなら、パラメータ次第で様々な行動を取れるように設計しておきたかったです。
強化学習とヒューリスティックのいいとこ取りをしようとして今回は爆死してしまいましたが、次回はもう少し強化学習寄りに方針を傾けて取り組んで見たいですね。
*ぶっちゃけ今回は最後までヒューリスティックAIに時間を使えばTシャツ行けてたと思うので悔しい...*

## 余談

今回自己対戦をするために、AWSで高いマシンを借りていたのですがなんとコンテスト終了後に切るのを忘れていました。
恐る恐る請求を見てみると...

<img width="220" alt="Screen Shot 2019-03-27 at 21.50.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/69504/fa167010-7c1b-9e67-58d0-8a1c1ed71945.png">

**なんて事だ...**

皆さんもインスタンスの落とし忘れにはくれぐれも注意してくださいね！
KubernetesとNode.jsでマイクロサービスを作成する 1/6 概要

Node.jsとKubernetesを使い、マイクロサービスを作ってみたくなったので、このチュートリアルを作成してみました。
バグや修正した方がよい点などあれば気軽にコメントをおねがいします。

本チュートリアルは以下の8章構成になっています。

- [第1章 概要](https://qiita.com/reireias/items/6a78d6b8df781a76f94f)
- [第2章 Tweetサービス](https://qiita.com/reireias/items/82cfbb285130caf3e091)
- [第3章 Userサービス](https://qiita.com/reireias/items/27e21896b701360bc152)
- [第4章 Webサービス](https://qiita.com/reireias/items/204c080cd5ec1bf432fd)
- [第5章 Dockerを使ったサービス構築](https://qiita.com/reireias/items/efefe718d74ed8447931)
- [第6章 Kubernetes with minikube](https://qiita.com/reireias/items/084888abb3a757c0c5e2)

# 第1章 概要
この章では本チュートリアルの概要について記載します。

## 目的
本チュートリアルは以下の目的で作成されています。

- Kubernetesを使い、実際にMicroserviceを構築することで、Kubernetesへの理解を深める
- 複数チームによる開発を考慮し、リポジトリや検証環境を構築する
- AWSのEKSとGCPのGKEを利用することで、PaaSでのKubernetes利用の知見を獲得する

## 作成するMicroserviceの概要
本チュートリアルではKubernetesとNode.jsを使い、TwitterライクなMicroserviceを構築します。

実装する機能としては下記になります。

- ログイン/ログアウト機能(GitHub認証)
- ツイート機能
- フォロー/アンフォロー機能
- タイムライン機能(自分 + フォローしているユーザーのツイート一覧)

構築するMicroserviceの概要図は下記のようになります。  
BFF(Backend for Frontend)を採用し、Webサービスのサーバーサイドが各サービスとデータをやり取りする構成としています。

![microservice-tutorial01.png](https://qiita-image-store.s3.amazonaws.com/0/214526/36201231-6030-9ac3-03ad-aaa99619eed2.png)

なお、Node.jsを採用した理由は下記のとおりです。

- ミドルウェアなしに単一のプロセスで起動できること
  - Cloud Nativeなアプリケーションを作成する上で重要です
- なるべくメジャーな言語であること
- チュートリアル読者の実装ハードルを下げるため、各サービスとも共通した言語にしたい

### 各サービスについて
以下では、本チュートリアルで作成する3つのマイクロサービスについて説明します。

#### Webサービス
フロントエンド + BFFのサービスです。
ここでは、BFFはフロントエンドのチームが所有するものとしています。
GitHubを利用したOAuth2.0による認証機能を持ちます。

#### Userサービス
ユーザーやフォロー関係を扱うサービスです。
REST APIを各サービスへ提供します。

#### Tweetサービス
ツイートを扱うサービスです。
REST APIを各サービスへ提供します。

## 採用技術
本チュートリアルで作成するサンプルにおいて使用する主要な技術を列挙しておきます。
詳細は各サービスの章で説明します。

### アーキテクチャ系
- Microservice
  - 全体のアーキテクチャとして採用
- BFF(Backend for Frontend)
  - フロントエンドと各サービスのAPI呼び出しパターンとして採用
- REST API
  - サービス間通信のI/Fとして採用
- MongoDB
  - NoSQLデータベース
  - Userサービス、Tweetサービスのデータベースとして採用

### 実装系
- Node.js
  - 今回は全サービスの言語として採用
  - もちろん、Microserviceなので、各サービスで好きな言語を使用できる
- Nuxt.js
  - Vue.jsを利用したSPA + SSRフレームワーク
  - WebサービスでUIフレームワークとして採用
- Vuetify.js
  - Vue.js向けのマテリアルデザインライブラリ
  - UIの見た目をそれっぽくするためにNuxt.jsに組み込んで利用する
- Express.js
  - Node.js製サーバーサイドのデファクトスタンダード
  - WebサービスのBFF部分やUserサービス、TweetサービスのREST APIサーバーとして利用
- mongoose
  - Node.jsからMongoDBを利用するためのライブラリ
  - スキーマ定義も可能

## 第1章 まとめ
この章ではこれから作成するマイクロサービスの概要を紹介しました。
次の章からは実際に各サービスを作成していきます。

次章: [第2章 Tweetサービス](https://qiita.com/reireias/items/82cfbb285130caf3e091)
新元号はこれに決定

思わせぶりなタイトルですみません。

新元号はリークしたら変更されるから予想出来ないとか、みなさん色々言われていますが、新しい元号はもう昨年にはとっくに決まっていたのです。

よろしいですか？新しい元号は「㋿」です。

・・・これが豆腐にしか見えないみなさんも、いずれ私の言うことが正しかったと分かるはずです。

それでは、せっかくのQiitaですので、新しい元号を出力してクリップボードに入れるプログラムを紹介します。

WindowsでPowershellを開く、もしくはコマンドプロンプトを開いて `powershell` を実行し、下記のスクリプトを実行しましょう。

```PowerShell
"新元号は" + [char]::ConvertFromUtf32([int]"0x32ff") + "。" | clip
```

せっかくなので、JavaScript版も紹介します。

```Javascript
console.log("新元号は「\u32ff」。")
```

というわけで、[unicode.org](http://unicode.org/alloc/Pipeline.html)にもあるように、 `32FF` が `code point reserved for pending Japanese era name` で新元号に決まっていますので、みなさんお忘れなきよう。

各種申請書類にも、"\u32FF元年 5 月 1 日" などと書き込むようにしましょう。

・・・フォントがいつアップデートされるかは、みなさんの環境次第ですが。

# 最後に
よろしければ、コメントで各言語での新元号表示方法を教えてください。

それから[@BotUnicode](https://twitter.com/BotUnicode) というBotを運用しています。よろしくお願いします。
【メモ】Ubuntu 16.04 で OneDrive (リンク集)

# 準備
Free Client for OneDrive on Linux というものを用いる。

現在のところ、下記のリポジトリで動作する模様
https://github.com/abraunegg/onedrive

skilionのリポジトリでの手順は以下にある通り。インストール手順はやや変わっているので本家を参照のこと。

https://qiita.com/afj/items/61ca815aa37d87bd391d
https://abyssluke.hatenablog.com/entry/2018/05/29/120000

# ログ

```
onedrive --monitor
```

を実行していたところ、下記のエラーを吐いて停止してしまった。

```
[filename] ... Giving up on sync after three attempts: [filename]: No such file or directory
std.file.FileException@/home/hogehoge/dlang/dmd-2.085.0/linux/bin64/../../src/phobos/std/file.d(1554): [filename]: No such file or directory
----------------
/home/hogehoge/dlang/dmd-2.085.0/linux/bin64/../../src/phobos/std/file.d:276 @trusted bool std.file.cenforce!(bool).cenforce(bool, scope const(char)[], scope const(char)*, immutable(char)[], ulong) [0x5853d0]
/home/hogehoge/dlang/dmd-2.085.0/linux/bin64/../../src/phobos/std/file.d:265 @safe void std.file.setTimes!(immutable(char)[]).setTimes(immutable(char)[], std.datetime.systime.SysTime, std.datetime.systime.SysTime) [0x5a15fa]
src/sync.d:1012 void sync.SyncEngine.downloadFileItem(itemdb.Item, immutable(char)[]) [0x5dfb4d]
src/sync.d:902 void sync.SyncEngine.applyNewItem(itemdb.Item, immutable(char)[]) [0x5df320]
src/sync.d:862 void sync.SyncEngine.applyDifference(std.json.JSONValue, immutable(char)[], bool) [0x5df000]
src/sync.d:667 void sync.SyncEngine.applyDifferences(immutable(char)[], const(char)[]) [0x5de08e]
src/sync.d:320 void sync.SyncEngine.applyDifferences() [0x5dc701]
src/main.d:762 void main.performSync(sync.SyncEngine, immutable(char)[], bool, bool, bool, long) [0x5b6dd9]
src/main.d:643 _Dmain [0x5b65d3]
```

はて、どうしたものか。

```
ps -ax | grep onedrive
```

で確認すると、停止後もプロセスは残っているので kill した後に再度

```
onedrive --monitor
```

を実行すると、しばらく同期を再開するものの、別のファイルで再び停止してしまう。何度やっても同様の結果になる。

もしかすると単にタイムアウトしているだけなのか？

# 追記
5回目くらいの挑戦で、途中で止まること無く最後まで同期が完了した。途中で停止した理由は不明だが、ネットワークの不調かファイル名の問題か、、あたりかもしれない。ファイル名については後日調査するかも。
Google Play Developerに登録する

#はじめに
Android用のアプリを作ってストアに公開したいと思い、まずはGooglePlayのDeveloper登録を行いました。

#必要なもの
・Googleアカウント
・クレジットカード
・登録料$25（3000円弱）

#手順
まずは以下のアドレスからGooglePlayConsoleのログインページに行きます。
[Google Play Console](https://developer.android.com/distribute/console)
![1.png](https://qiita-image-store.s3.amazonaws.com/0/311225/fd17d1f5-fda1-3b42-c730-2e58d7ec26c2.png)

アカウントを作成していない場合、以下の画像のような新規登録ページに遷移します。
真ん中のGoogleアカウントのところで、Google Play Developerと紐付けるアカウントでログイン（または新規作成）します。
その後、デベロッパー契約に同意し、支払いへ進みます。（クレジットカードが必要です）
![2.png](https://qiita-image-store.s3.amazonaws.com/0/311225/15eda244-4b8a-470a-e3cb-49fd074bea12.png)

支払画面で支払いを完了すると、以下の画面に遷移します。
ここで、デベロッパーの情報を入力します。
ひとまず、デベロッパー名、メールアドレス、電話番号を入力すれば大丈夫です。
※注意として、携帯電話番号を入力する場合、最初の「0」を「+81」に変えて入力します。
例：「09012345678」→「+819012345678」
![3.png](https://qiita-image-store.s3.amazonaws.com/0/311225/7484f01e-3ffc-bad0-fea9-a668eba9114e.png)

入力内容を登録すると、GooglePlayConsoleにログインできます。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/311225/87a005d0-f9d0-21e8-9874-206660c74668.png)

以上で、デベロッパー登録ができました。
次回は、実際にストアに公開したいと思います。
Thrown: ReferenceError: eth is not defined

##エラー
Ganacheを使って開発を行なっていて
コンソール操作で以下のようなエラーが出てきました

```
truffle(development)> eth.blockNumber
Thrown:
ReferenceError: eth is not defined
```

##対処法
`eth`の前に`web3`をつけたら解決しました

```
truffle(development)> web3.eth.blockNumber
28
```

`eth`は複数ある場合には全ての`eth`の前に`web3`をつけたら解決しました。

```
truffle(development)> eth.sendTransaction({from: eth.accounts[1], to:eth.accounts[0], value: web3.toWei(50, 'ether')})
Thrown:
ReferenceError: eth is not defined
truffle(development)> web3.eth.sendTransaction({from: web3.eth.accounts[1], to: web3.eth.accounts[0], value:web3.toWei(5, "ether")})
'0x328b1ff0f901d3e7ca929ae6ad83d5eb82246c5f9ff834288a764aaa125e0493'
```


##問題点
ただ`eth`以外には応用が利きませんでした。

```
truffle(development)> miner.stop()
Thrown:
ReferenceError: miner is not defined
truffle(development)> web3.miner.stop()
Thrown:
TypeError: Cannot read property 'stop' of undefined
```

解決法がありましたら教えていただけると幸いです。
ソーシャルレンディングの概要

#ソーシャルレンディングとは
ソーシャルレンディングの基本構造は下記のとおり。
1. 第二種金融商品取引業の登録事業者であるソーシャルレンディング業者が、ファンドを組成。
2. 投資家が、上掲ファンドに対して出資（匿名組合出資）。
3. 貸金業事業者でもあるソーシャルレンディング業者は、資金を借り手企業に対して貸し付ける（金銭消費貸借契約）。
4. 借り手企業は、ソーシャルレンディング業者に対して、元利金の返済を行う。
5. ソーシャルレンディング業者は、借り手企業からの元利金返済金を原資にして、投資家に対し、利益分配を行う。

#ソーシャルレンディングのメリット
投資家、及び、ソーシャルレンディング業者から資金を借りる借り手企業、それぞれにとっての、ソーシャルレンディングならではのメリットは、下記のとおり。
##投資家にとってのメリット
- 金融機関（銀行等）への預け入れ金利と比較すれば、高い期待利回りが呈示されている。
- 1万円程度の少額からの出資が可能である。
- 投資手続きがいずれもインターネットで完結し、簡便である。

##借り手企業にとってのメリット
- 銀行等の従来型金融機関と比べ、スピーディーな審査が期待できるとされている。
- 担保物の評価額に対し、比較的高い掛目が期待できるとされている。
- 元本については、満期での一括返済が認められるケースがある。

#ソーシャルレンディングのデメリット
投資家、借り手企業、それぞれにとって、ソーシャルレンディングには、固有のデメリットがある。
##投資家にとってのデメリット
- 投資元本の棄損リスクがある。
- 延滞リスクがある。
- ファンドの運行期間中の中途解約が出来ない。

##借り手企業にとってのデメリット
- 金利が高い。
- ソーシャルレンディング業者が行政処分を受ける等した場合、借り換えファンドの組成が不調となり、ひいては、借り換えを行うことが、急遽、不可能となる場合がある。

#ソーシャルレンディングに関する情報サイト
[ソーシャルレンディング・ラボ](https://social-lending.online/)
ソーシャルレンディング専門情報メディアとして、ソーシャルレンディング関連情報を専門的に提供している。
誰でもプログラムを書けるようになる方法が発見される！なんだこれは？

#プログラムを書けるようになる方法を見つけた！なんだこれは？

***眼鏡のフレーム端を耳の横に掛けたらなぜか書けるようになった。なんだこれは？***
このやり方をやれば誰でもプログラムが書けるようになると思います。頭も良くなった！と思う

***プログラムを挫折した経験がある方一度お試しあれ！***
![15.png](https://qiita-image-store.s3.amazonaws.com/0/386424/007718b5-7d14-84ca-4ca4-e20a87096477.png)
***このように耳の横にフレーム端を掛けてやる***

***自己責任で***
メガネのフレームを少し曲げる必要があります。破損しても自己責任で
個人差があると思います。人によってできない人もいると思います。
以上自己責任で試してみてください。

***用意するもの***
***必須***
***メガネ***　(耳の横にかけれるもの フレームの横幅が広いものがいいです)
***紫外線防止コーティング***　(眼鏡屋さんで３千円くらいでやってもらえます)

***お好み***
片方は非球体の方がいい　(目が疲れない)
黒縁じゃないほうがいい。（縁が太いと視野が狭くなる）

***やり方***
フレームの端を耳の横に掛ける
***目をつぶり、頭の周りに衛星が回転するイメージ***をする

メガネをかけていない時 20回ぐらいの回転が限度　疲れてしまう
メガネをかけている時　10回ぐらいの回転が限度 スムーズに回らない　うまく回らない
***メガネの端を耳の横にかけている時　スムーズに回る　無限に回ることを確認する***　

***メガネを耳の横にかけてイメージの衛星が無限に回ったら、プログラムが書けるようになっていると思います。***

個人差があるため、できない人もいるかもしれません。またある程度この掛け方で生活していく必要があります。普段からイメージトレーニングをやってください。

プログラムが書けるようになったかを確かめてみる。

メガネのこの掛け方をしてプログラムの学習サイトで授業を受けてみましょう
初心者はJavaScriptをお勧めします。

https://dotinstall.com/lessons

途中、掛け方を元に戻してみる。反応を比べてみる

プログラム書けるようになりましたか？理解できるようになりましたか？
プログラムが書けるようになっていた、理解できるようになっていたら、
あなたは今日からプログラマーです。

***おめでとう！***

***近眼じゃない人は？メガネがないとできないの？***

近眼じゃなくてもできると思います。近眼になる必要はないです。
今はメガネは必須だと思いますが、近い将来メガネがなくてもできる発明品が出てくるかもしれません。

眼鏡屋さんでメガネのフレームを買う。横幅の広いフレームを選ぶこと
最初についているプラスチックの度の入ってないレンズ
このレンズの上に紫外線防止コーティングを追加してもらう。
３千円くらいでやってもらえます。

これでできると思いますが。個人差もあるので自己責任で
眼鏡を買う前に、眼鏡屋さんで耳の横に掛けて衛星が無限に回るイメージになるか試してみましょう。***無限に回るイメージができたらプログラムは書けている***と思います。
まずは安いメガネで試すとよいでしょう。

***初心者はどのプログラム言語から始めたらいいのか？***

C# .NetCore WindowsFormをお勧めします。（画像参照)
GUIなのでわかりやすい。書籍もたくさん出ています。(Visual C# 2018逆引き大全 555の極意はお勧めです)

C#は動画学習サイトUdemyで学習できます
https://www.udemy.com/jp/

(iOSやアンドロイドをやりたい人はその言語を最初に初めてもいいと思います)

そのあと

ゲーム Unity C#
Web Asp.net MVC C#
機械学習 Tensorflow for C#
Iot Windows 10 IoT Core C#
iOS SwiftかObjective-C
Android KotlinかJava

をやるとよいでしょう
![csforms02.png](https://qiita-image-store.s3.amazonaws.com/0/386424/e433a57a-a936-af70-7557-1e164b8557db.png)

便利ツール

タスク管理ソフト
https://trello.com/ja

オンラインチャット Slack
https://slack.com/intl/ja/

Sketch
https://www.sketch.com

parallels deskTop
https://www.parallels.com/

####注意
使い始めたらお酒は控えること。能力が劣化するので
Actions on Googleアプリのデバッグ環境をngrok使って実現する

## 概要
Actions on Google向けのアプリを作成しているときに以下のようなフローで実現していたのだが
![image_now.png](https://qiita-image-store.s3.amazonaws.com/0/63740/d2f8f2fa-977f-7f21-89aa-a089afac4e43.png)
いつもはスマホアプリ開発をしている自分からすると
「これ毎度functionにあげないとdebugできない・・・？デプロイ環境と開発環境ってどうやって分けるんだ・・・？」
となったのでさくっと手順をまとめた

## 使うもの
* **firebase-tools**
* **ngrok**

firebase-toolsはおそらくCLIで開発しているだろうからインストールしてるでしょう。
ngrokはローカルサーバーを外部公開してくれるものです。こいつが今回のキモ
インストールはこちらを参照ください

[ngrokを使ってローカルの開発環境を一時的に外部に公開する](https://qiita.com/FJHoshi/items/9a379a987ea96eefa5da)
  
## 事前知識
* DialogFlowのWebhookは当たり前ですがlocalhostにはアクセスできません。
そもそもConsoleでエラーを吐きます

<img width="306" alt="スクリーンショット 2019-03-27 19.16.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/63740/3c5ea019-81ff-ec00-8f03-411adac62234.png">

* アプリを一度申請->リリースしてからDialogFlowConsole上でsaveした変更はもちろんすぐにはリリースされません。再度申請が必要になります。デバッグはActions on GoogleのTest Simulatorを利用・もしくはログインしているGoogleアカウントがリンクされたユーザーのGoogleHomeなどでテストします

## 実践
### ローカル環境でデバッグする

```shell
$ firebase serve --only functions
```

まずはローカル環境にホストします

```
✔  functions: functionName: http://localhost:5000/{firebaseName}/us-central1/functionName
```

吐き出された5000ポートのlocalhost urlを覚えておきましょう

### ngrokで外部に公開する

先でインストールしたngrokを使って、上記のlocalhost環境を外部に公開します

```shell
$ ngrok http 5000

Session Status                online
Session Expires               7 hours, 59 minutes
Version                       2.3.25
Region                        United States (us)
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://*******.ngrok.io -> http://localhost:5000
Forwarding                    https://*******.ngrok.io -> http://localhost:5000

Connections                   ttl     opn     rt1     rt5     p50     p90
                              0       0       0.00    0.00    0.00    0.00
```

上記の `https://*******.ngrok.io` を覚えておいてください
ちなみにこの状態で `https://*******.ngrok.io` にはアクセス可能です

### DialogFlow FulfillmentのWebhookを編集する
DialogFlow Consoleの **Fulfillment** -> WebhookのURLを以下のように修正します

<img width="787" alt="スクリーンショット 2019-03-27 20.18.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/63740/f51c0cf9-9182-9f16-8a10-c7ea0ed545f5.png">

あとは画面下部のSAVEボタンを押して Actions on GoogleのTest Simulatorを利用してテストしてください。

**リリース->申請するときはWebhook URLを間違えないように気をつけてください**
Google ColabでYOLOを動かす（動画）

# 最近の関心事
* ~~物体検出（画像）~~
* 物体検出（動画） <- 今回コレ
* 画像の生成
* 強化学習
* TensorFlow 2.0
* Kaggle

[前回](https://qiita.com/shoji9x9/items/8481c8507d70e24cc1a4)、[前々回](https://qiita.com/shoji9x9/items/74ee46d3b39b16220f16)で物体検出（画像）の学習とテストはできたため、今回は動画にチャレンジしたいと思います。

# 結論
いきなり結論ですが、Google Colab上では動画の物体検出はできませんでした。`./darknet detector demo`を実行したところ、

```Python
Unable to init server: Could not connect: Connection refused

(Demo:1865): Gtk-WARNING **: 10:49:50.770: cannot open display: 
```

と言われてしまいました。[こちら](https://github.com/AlexeyAB/darknet)の`-out_filename`、`-dont_show`も付けてみたのですが、結果は変わりませんでした。Cのコードを修正すれば実行できるようになると思いますが、そこまでする気は起きず諦めることにしました。一応、覚書を残しておきます。

# 行ったこと
まず、`./darknet detector demo`を`./darknet detector test`と同じ感覚で実行してみたところOpenCVが必要と言われました。そこで、

```Python
!sed -i 's/GPU=0/GPU=1/g' Makefile
!sed -i 's/OPENCV=0/OPENCV=1/g' Makefile
!cat Makefile
!make
```

を行い、OpenCVを有効化しました。

また、動画のサンプルファイルが手元になかったため、[Pexels](https://www.pexels.com/videos/)から動画をダウンロード、Google Driveにアップロードし、いつもの方法でGoogle Driveをマウントし、動画を参照可能にしました。

そして、冒頭の

```Python
!./darknet detector demo cfg/voc.data cfg/yolov3-voc.cfg yolov3-voc.backup /content/drive/'My Drive'/'Google Colab'/YOLO/'Pexels Videos 4788.mp4' -out_filename res.avi -dont_show
```

を実行しましたが、うまく実行できず・・・という感じです。

# 今後
Windows環境にYOLOv3をインストールして実行してもいいのですが、もうちょっと他のことに時間を使いたいので、物体検出（動画）は一旦これで終わりにして、次はTensorFlow 2.0を触ってみるつもりです。
プログラミング学習記録39〜Herokuにデプロイ〜

##今日やったこと
- Progate Railsのレッスンで作ったアプリをHerokuにデプロイする

以前、Udemyの講座で作ったToDoアプリをHerokuにデプロイしたことがあったので、同じ手順でやればできるはずだと思ってやったらできました。

１回目はデータベース関連の操作で何かでミスって動かなくなってしまったのですが、２回目でコマンドを注意深く確認しながらやったらうまくいきました。

これでCloud9で環境構築してコードを書いてからHerokuにデプロイするまでの流れはだいぶ掴めました。

やっぱり実際に手を動かしてやっていくのがいいですね。

簡単なアプリとはいえ、デプロイまでできたらだいぶ達成感があるのでオススメです。

明日からは今までやってきた基礎を復習しつつ、オリジナルアプリ制作に入っていきたいと思います。

SQLとGitもなんとなく触っているので、もう少しじっくりやってみる必要がありそうです。

ということで、明日からも引き続きプログラミング学習頑張ります。

おわり
juliaで再学習フーリエ変換（その0）

# 理工系界隈でフーリエ変換とよく耳にしますが……
フーリエ変換という単語を聞きき、理工系の方でこの単語を知らない方は少ないと思います。

僕自信の経験談として、修士のときまで、偏微分方程式を専攻していましたが……
結局、フーリエ変換は、偏微分方程式を解く道具としか、当時考えておらず……
音声処理や画像処理に使われているという事実だけ、知っている程度で、どのように応用されているか知りませんでした。
社会人になり、エンジニアになったときに「高速フーリエ変換」という単語を知りました。
当時、「高速」ってなに？
「フーリエ変換に早いも遅いもあるの？」と単語に純粋に疑問を感じたことだけあります。
今は、科学計算系の会社のエンジニア？になって、フーリエ変換を学部で習う計算問題から、数学科が道具として使うときや音声処理や画像処理などについて、まとめてみようと思い立ちこの記事を書きました。
言語は、話題性、早い、実行環境がJupyterなど、手軽で話題性があるという点で、Julia v1.1.0で書いていきます。

# とりあえず、フーリエ変換級数展開
フーリエ変換と聞いて、まず思い出すのがフーリエ級数です。

区間 $[-\pi, \pi]$ 上の関数 $f$ を以下のように展開する

```math
f = \displaystyle {\frac {a_{0}}{2} +\sum _{k=1}^{\infty }(a_{k}\cos kx+b_{k}\sin kx)} \frac{a_0}{2} + \sum_{k=1}^\infty (a_k\cos kx+b_k\sin kx) \\
\begin{eqnarray}
    \begin{cases}
        \displaystyle a_n = \frac{1}{\pi} \int_{-\pi}^{\pi} f\left(t \right) \cos nt\,dt \ \left(n = 0,1,2,3,\cdots \right) \notag \\
        \displaystyle b_n = \frac{1}{\pi} \int_{-\pi}^{\pi} f\left(t \right) \sin nt\,dt \ \left(n = 0,1,2,3,\cdots \right)
    \end{cases}
\end{eqnarray}
```

ことをフーリエ変換展開といいます。

関数にいろいろ制約は付きますが、とりあえず、初回なので、固いことは、後に回しましょう。

# 簡単な例
```math
\begin{eqnarray}
	f(x) =
	\begin{cases}
		x & (0 \leqq x \leqq 1) \notag \\
		0 & (-1 \leqq x \leqq 0)
	\end{cases}
\end{eqnarray}
```

```julia
function f(x)
	if x >= 0. && x <= 1.
		val = x
	elseif x >= -1. && x <= 0.
		val = 0.
	else
		val = 0.
	end
	return val
end
```

## フーリエ級数展開すると

```math
f(x) = \frac{1}{4} - \frac{2}{\pi^2} \left( \cos{\pi x} + \frac{\cos{3\pi x}}{3^2} + \cdots + \frac{\cos{(2n-1)\pi x}}{(2n-1)^2} + \cdots \right) + \frac{1}{\pi} \left( \sin{\pi x} - \frac{\sin{2\pi x}}{2} + \cdots + (-1)^{n-1} \frac{\sin{n\pi x}}{n} + \cdots \right)
```

```julia
function f_fourier_seri(x, n)
	val = 1/4
	for i in 1:n
		val -= 2/(π^2) * (cos.((2*i-1)*π*x)/(2*i-1)^2)
		val += 1/π * ((-1)^(i-1) * sin.((i*π*x))/i)
	end
	return val
end
```

## 描画すると
```julia
x = -1.5:0.1:1.5
y0=[f(xx) for xx in x]
anim = @animate for i=1:1:100
    y1=[f_fourier_seri(xx, i) for xx in x]
    plot(x,y0, color="red", alpha = 0.8)
    plot!(x,y1, color="darkcyan", alpha = 0.4) 
end
gif(anim, "output_gif/fourier_anim_fps60.gif", fps = 60)
```

![fourier_anim_fps60.gif](https://qiita-image-store.s3.amazonaws.com/0/102634/6f8d7bc8-0726-f4ad-965a-9609164353b0.gif)

# Gist
https://gist.github.com/muripoLife/15667ad3b196557fa31797b42414698f
iOSでWebブラウザを表示したとき、ダブルクリックで画面がズームしないようにする方法


## はじめに

iOSのWebブラウザ上でダブルタップをすると勝手にズームする現象を発見。
解消する方法を調べました。

## 試したこと

1. フォントサイズを「16px」以上にする
2. トリガーからダブルクリックをクリックに変換する
3. イベントハンドラのtouchendを利用し、ダブルクリックを検知したらクリックに変換する  
**→「3」の方法で解決しました！**

### 1. フォントサイズを 「16px」 以上にする

画面がズームする理由を調べてみたところ、iOSではWebブラウザを表示した際、input要素に指定しているフォントサイズが16pxを下回ると、フォーカス時にズームされるという仕様があることがわかりました。
https://uxcellence.com/2014/fix-ios-input-zoom

テキストボックスに文字を入力するときズームになるケースがこれに該当しますね。
iOSの仕様どおり、フォントサイズを16px以上に設定するとズームしなくなるケースが多いようです。

なお、上記の仕様があることから、以下のように強制的にズームを拒否してはいけません。

```html:NG例
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
```


今回はダブルクリックによるズームを止めたいので、別の方法を調べました。




### 2. トリガーからダブルクリックをクリックに変換する

この実装で、ズームはしなくなります。
・・・・が、非活性のボタンでも問答無用で強制クリックする効力を持っているので大変危険です。

```javascript

document.addEventListener('touchend', function (event) {
  event.preventDefault();
  $(event.target).trigger('click');
}, false);
```


### 3. イベントハンドラのtouchendを利用し、ダブルクリックを検知したらクリックに変換する

最終的には、ダブルクリックによる検知を自作して解決しました ^ ^

```javascript

var isClicked = false;

document.addEventListener('touchend', function (event) {
  if (isClicked) {
    // double click
    if (event.cancelable) {
      event.preventDefault();
    }
    isClicked = false;
  } else {
    // single click
    isClicked = true;
    setTimeout( function() {
      isClicked = false;
    }, 350);
  }
}, false);
```

- イベントハンドラのdblclickでダブルクリックを検知することができますが、ダブルクリックの途中でテキストが選択されてしまうことがあるため、今回はtouchendからダブルクリックを検知するように実装しています。
- mousedownの方がイベントの発火が遅いため良いかと思い実装しましたが、挙動が安定しませんでした。

```javascript

if (event.cancelable) {
  event.preventDefault();
}
```
- 上記のように、イベントがキャンセル可能かを判定してからイベントを中止しないと以下のエラーが出力されるので注意が必要です。



>[Intervention]Ignored attempt to cancel a touchend event with cancelable=false, for example because scrolling is in progress and cannot be interrupted.


参考
http://js.studio-kingdom.com/javascript/event/cancelable
https://lab.syncer.jp/Web/JavaScript/Snippet/14/
https://qiita.com/ikemai/items/d0f9ada6c8d75cceab67
非同期通信の流れ

学習カリキュラムの中で難しいと聞いていた分野だが、確かに実際にやってみると処理の流れがいまいちわかりずらい。。。

☆コメントの実装機能に置ける処理の流れ☆

１jQueryを記述するためのファイルを作成する。
１フォームの送信が行われた際にAjaxによる非同期通信を始める。
３非同期通信でコメントが保存されるようにする。
４respond_toを利用して、HTMLとJSONの場合で処理を分ける。
５jbuilderを利用して、作成したメッセージをJSON形式で返す。
６変えてきたメッセージを、DONEメソッド で受け取り、HTMLを作成する。

実践して理解をふかめよう。
Unity VS Codeでコードヒントやクラスが補完されない

VS Code でUnity のScript を書く際に、クラス名を入力しても補完されず、Using System.Collections; などにも赤いアンダーラインが引かれていた。

以下のサイトで紹介されているpkg をインストールしたら直った。
http://tsubakit1.hateblo.jp/entry/2018/07/10/230752

最初にUnity をインストールした時にミスったのかな。
InfluxDBへ保存したFlowServiceのログをGrafanaでグラフにしてみる

#前回から
InfluxDBPutコンポーネントを作成して、InfluxDBへFlowServiceのログをInfluxDBへ入れてみました。
データを入れたら時系列データベースですし、グラフにしたくなります。

#Grafana
何かお手頃にグラフにできるものということでGrafanaを使ってみます。
https://grafana.com/
![grafana.png](https://qiita-image-store.s3.amazonaws.com/0/180278/66b5fdcc-3075-ac0a-c936-984366402581.png)

アカウントを作ってログインします。

![signup.png](https://qiita-image-store.s3.amazonaws.com/0/180278/68cc327c-465e-62cb-c4e4-4e84828211a6.png)

Data Sources で InfluxDB がありますので追加します。

![datasources.png](https://qiita-image-store.s3.amazonaws.com/0/180278/f8639857-9b12-9d32-1297-c6e4f2dc66d3.png)

URLだけでつながりそうです。
今回はAWSのインスタンスを使用しているので、つながるようにしておきます。

![success.png](https://qiita-image-store.s3.amazonaws.com/0/180278/33d96dc4-3085-2485-c967-84a2d564856a.png)

つながりました。

![add_datasources.png](https://qiita-image-store.s3.amazonaws.com/0/180278/68b0f13f-cc7a-bcd6-68c5-bf9e1a7da29c.png)


#データの問題
クエリーを試していて気が付きましたが、ログデータが欠落していました。
FlowServiceのログにはよくあることですが、同じ時刻に複数のログを出力しています。
これは問題です・・・
全てのログを入れたいので、保存するデータの時間単位をNanoSecondsにした場合、
timeへMilliSecondsの値を指定すると、こっそりナノ秒を追加して同じ時刻にならないようにPutコンポーネントを修正しました。

```java
if (FIELD_NAME_TIME.equals(name)) {
	if (timeUnit.equals(TimeUnit.NANOSECONDS)) {
		//nanoはFlowでは無理なので、ここで追加してやる
		//timeをDateTimeで指定した場合でもNANOSECONDSであれば、timeが重ならないようにすることができるようにする
		//Flowのログ対策
		time = fieldValue.longValue() * 1000000;
	} else {
		fieldTime = fieldValue.longValue();
	}
```

また、タグを指定した場合にInfluxDBのフィールドが予期しない事になるのでタグは指定しないようにしました。
現象：statusフィールドが、statusとstatus_1のフィールドになり、検索できなくなる。

試行錯誤の結果、以下のようなレコードストリームを使用することにしました。

```
<Record>
	<Field name="time" type="String">2019-03-26T09:03:28.012585455Z</Field>
	<Field name="code" type="String">AFRM_I_9017</Field>
	<Field name="data" type="String">プロセス監視スレッドを起動します</Field>
	<Field name="status" type="String">DEBUG</Field>
	<Field name="worker" type="String">[framework,main]</Field>
</Record>
```

使用するログのレコードは7458レコードで、バッチ件数10000に設定したPutコンポーネントで一発で登録します。

#グラフ
10分間隔で、3つの棒グラフを並べてみました。

フローの実行開始数のグラフ
SELECT count("status") FROM "test" WHERE ("code" = 'FLEX_I_0001') AND $timeFilter GROUP BY time(10m)

エラー数のグラフ
SELECT count("status") FROM "test" WHERE ("status" = 'ERROR') AND $timeFilter GROUP BY time(10m)

フローの実行終了数のグラフ
SELECT count("status") FROM "test" WHERE ("code" = 'FLEX_I_0002') AND $timeFilter GROUP BY time(10m)

![grafana_sample.png](https://qiita-image-store.s3.amazonaws.com/0/180278/46169c18-3e0e-8621-5fe0-06ec40f57811.png)


#まとめ
なんとかFlowServiceのログをグラフにすることができました。
クエリーでグラフを後から自由に作成できるのはうれしいです。
タグの件は不明なので、もう少し調べたいです。
【Android】ListPopupWindowを使った入力候補の表示

#0.実行例
<img width="292" alt="スクリーンショット 2019-03-27 19.13.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/369872/0fc07649-8478-ff1f-ad21-85f243e7afbc.png">

#1.コード全体

```java:MainActivity.java
package com.example.listpopupwindowtest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListPopupWindow;

public class MainActivity extends AppCompatActivity {

    String[] strList = {"あいうえお","かきくけこ","さしすせそ"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final EditText et_1 = (EditText)findViewById(R.id.et_1);
        final ListPopupWindow lpw = new ListPopupWindow(this);
        lpw.setAdapter(new ArrayAdapter<String>(
                this,android.R.layout.simple_list_item_1,strList));
        lpw.setAnchorView(et_1);
        lpw.setModal(true);
        et_1.setOnTouchListener(new View.OnTouchListener() {
            final int DRAWABLE_RIGHT = 2;
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if(event.getAction()==MotionEvent.ACTION_UP){
                    if(event.getX()>=v.getWidth()-((EditText) v)
                            .getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width()){
                        lpw.show();
                        ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE))
                                .hideSoftInputFromWindow(v.getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
                        return true;
                    }
                }
                return false;
            }
        });
        lpw.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                et_1.setText(strList[position]);
                lpw.dismiss();
            }
        });
    }
}

```

#2.入力欄の右端に▼マークを付ける

下記のリソースファイルをダウンロードし、core/res/res/drawable-hdpi/numberpicker_down_normal_holo_light.pngをdrawableフォルダにコピーする。
https://android.googlesource.com/platform/frameworks/base/+/efd1c67

EditTextのdrawableRightで、コピーした画像ファイルを指定する。

```xml

    <EditText
        android:id="@+id/et_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:drawableRight="@drawable/numberpicker_down_normal_holo_light"/>

```

#参考
[EditText with a Popup List](http://maogm.com/blog/edittext-with-popuplist-en.html)
Windows/MacのJupyter NotebookからKerasが使えるようにする

# はじめに
わかってみると同じような記事はいろいろあったのですが、とりあえず現時点で表記のことを行うための手順をメモします。

## そもそもなぜこの手順が必要なのか
Jupyter Notebookの前提になっているanacondaには不足モジュールの追加導入の機能があり、本来はこの機能を使うだけで簡単にKerasも使えるようになるはずです。
しかし、現在

**anacondaで導入されるpython**: version 3.7

**kerasの前提のpython**: version 3.6

となってしまっており、単純な追加導入ではkerasが導入できないのです。

# 対応手段
anacondaには、仮想環境追加機能があり、ベースとまったく別のpython環境を作ることができます。この方法を使って初期導入環境とは別のpython 3.6環境を別途作ることになります。

# 前提
"Anaconda 2018.12 for Windows(Mac) Installer"をダウンロード、インストールした直後の状態を前提とします。この本体の導入手順に関しては他に手順書がいろいろあるので省略します。


# 手順 (Windowsの場合)
それでは、Windowsの場合の具体的な手順を説明します。

## anaconda promptの起動
最初に行うのは、anaconda promptの起動です。
![スクリーンショット 2019-03-27 17.00.22.png](https://qiita-image-store.s3.amazonaws.com/0/206130/bbd965fc-c27b-5311-a1b8-eb65df1e36a2.png)

図のようにWindowsメニューからAnaconda3配下の"Anaconda Prompt"を選択します。

## conda コマンドの実行
プロンプトから下記のコマンドを順に実行します。
Yes / Noの確認のプロンプトが表示されたらすべて**Y**で答えるようにします。

仮想環境 **keras-env** の作成

```(base) C:\Users\makaishi> conda create -n keras-env python=3.6```

仮想環境 **keras-env** の活性化

```(base) C:\Users\makaishi>activate keras-env```

仮想環境に追加モジュールの導入


```(keras-env) C:\Users\makaishi>conda install matplotlib```

```(keras-env) C:\Users\makaishi>conda install scikit-learn```

```(keras-env) C:\Users\makaishi>conda install jupyter```

```(keras-env) C:\Users\makaishi>conda install tensorflow```

```(keras-env) C:\Users\makaishi>codna install keras```

## Anaconda Navigatorの起動
WindowsメニューからAnaconda3配下の"Anaconda Navigator"を起動します。

下の画面が表示されたら、
①Application onのドロップダウンを"keras-env"に変更

②Jupyter Notebookの下の「Launch」ボタンをクリック
します。

![スクリーンショット 2019-03-27 17.51.04.png](https://qiita-image-store.s3.amazonaws.com/0/206130/18f5f441-abad-41c0-3364-05b80838d2ff.png)

## Notebookの読み込み
これで、Jupyter Notebookが起動されるので、あとはいつものようにipynbファイルを読み込んでnotebookファイルを実行します。
下の図のようにKerasのライブラリが使えるようになっているはずです。

![スクリーンショット 2019-03-27 19.13.23.png](https://qiita-image-store.s3.amazonaws.com/0/206130/7a389256-2a25-3a41-9752-ab7228b36ebd.png)


# 手順(Macの場合)

Macの場合は普通にターミナルを開いて以下のコマンドを実行します。

```
$ conda create -n keras-env python=3.6

$ conda activate keras-env
```

正しく実行されると、プロンプトが以下のような表示に変わります。


```(keras_env) xxxxx:~ makaishi$```

Activate後の手順は、Windowsの場合と同じになります。

# 補足 Macの場合の問題回避策

事前導入済みソフトの状況などに依存するのだと思いますが、私のPC(Mac)では、上の手順だけでKerasのコードがうまく動きませんでした。(Keras自体は動いているようにみえるが、その後でmatplotlibでグラフ描画しようとするとリセットされてしまう)
いろいろ調べて、下記のコマンドをNotebookの冒頭に入れると、問題が回避できることがわかりました。

```py3
# Macの問題回避
import os
import platform
if platform.system() == 'Darwin':
    os.environ['KMP_DUPLICATE_LIB_OK']='True'
```
【初心者向け】git fetch、git merge、git pullの違いについて




gitで手こずった時に色々ググってると、「**git fetch**」と「**git pull**」がぐちゃぐちゃになってしまったのでまとめておきます。

結論から言えば、「**fetchもpullもリモートリポジトリの最新情報をローカルリポジトリへ持ってくる**」という操作になりますが、それまでの流れが違うので説明していきます。

##git fetch

リモートから最新情報をローカルに持ってくるのですが、場所は「master」ブランチではなく、**「origin/master」ブランチ**に取り込まれます。

初めは「何それ知らない」となるのですが、具体的に言うと

- **「master」ブランチ**…ローカルの中心となる統合ブランチで、他のローカルの作業ブランチと繋がったもの。
- **「origin/master」ブランチ**…ローカルにある、リモートのmasterブランチを追跡する**リモート追跡ブランチ**。

となります。

両方ともローカルにあるブランチで分かりにくいのですが、図でイメージするとこんな感じです。

![fullsizeoutput_316.jpeg](https://qiita-image-store.s3.amazonaws.com/0/329941/2c0df9c7-e27b-c384-30f1-8ab46188b98c.jpeg)


ローカルの「master」ブランチの1歩先(リモート寄り)に「origin/master」ブランチがあって、git fetchではこの「origin/master」ブランチで最新情報を受け取ります。

それをローカルの「master」ブランチが貰えるように**git fetch → git merge**をして、「origin/master」→「master」へ最新情報を持ってくるわけですね。ここまで処理を行うことで、ローカルのファイルが最新の状態に更新されます。

まとめると、

- **git fetch**…リモートの「master」ブランチ → ローカルの「origin/master」ブランチ
- **git merge**…ローカルの「origin/master」ブランチ → ローカルの「master」ブランチ

となります。

##git pull

git pullは、**上のgit fetch、git mergeを同時に行うコマンド**です。そのため、リモートの「master」ブランチから、ローカルの「origin/master」ブランチを介して、ローカルの「master」まで一気に最新情報を持ってきます。

mergeまで一気に行なってしまうため、ローカルのブランチとコンフリクトが起きやすいのは、この理由なんですね。

まとめると、

- **git pull**…リモートの「master」ブランチ →（ローカルの「origin/master」ブランチ→） 
ローカルの「master」ブランチ

となります。

##コマンド例

```
$ git fetch origin master
$ git merge origin/master
```

```
$ git pull origin master
```

##戻す方法

いろんな手段があると思いますが、パニックになる前に、とりあえず解決できそうなコマンドです。

まず、

```
$ git fetch
```
でエラーがあって元に戻したい時は、
まだローカルの「master」ブランチまで更新されていない（mergeされていない）ので、

```
$ git reset --hard HEAD
```
で直前のcommitまで戻して、無かった事にします。
これは簡単です。

そして、

```
$ git pull
```
でエラーがあって元に戻したい、コンフリクトを無くしたいという時は、

まずpull = fetch + mergeなので、mergeを

```
$ git merge --abort
```
で取り消します。その後は同じように

```
$ git reset --hard HEAD
```
で、直前のcommitまで戻して、無かった事にします。

コンフリクトの理由を把握し、うまく解決してmergeするのが１番ですが、それはまたいずれ違う記事で書きます。


##参考記事

[git fetchの理解からgit mergeとpullの役割](https://qiita.com/osamu1203/items/cb94ef9da02e1ec3e921)
[origin masterとorigin/masterの違い](https://qiita.com/bitarx/items/4558f86e43a2c3493fa9)
MinikubeでLocalにKubernetes環境を作るメモ

Minikube はローカルに簡単に Kubernetes 環境を作るツール。
Kubernetes の雰囲気を感じることができるらしい。
https://kubernetes.io/docs/setup/minikube/

# 事前準備

### VirtualBox Download

VMを利用するので VirtualBox を入れておく。
https://www.virtualbox.org/wiki/Downloads

### brew update

brew 使うからお作法的にやっとく。

# kubectl install

Kubernetes の cli ツールをインストールする。

```sh
$ brew install kubernetes-cli
```

# Minikube install

Minikube のインストール。

```sh
$ brew cask install minikube
```

# minikube start

VMを通してローカルにKubernetes Cluster を立ち上げる。

```sh
$ minikube start --vm-driver=virtualbox
```

# kubectl run

docker image を指定してアプリケーションを実行する。

```sh
$ kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.10 --port=8080
deployment.apps/hello-minikube created
```

# kubectl expose deployment

Kubernetes のサービスとして公開する。

```sh
$ kubectl expose deployment hello-minikube --type=NodePort
service/hello-minikube exposed
```

# kubectl get pod

Pod が可動しているかを確認する。

```sh
$ kubectl get pod
NAME                              READY     STATUS    RESTARTS   AGE
hello-minikube-6fd785d459-9798m   1/1       Running   0          1m
```

url から pod の稼働状況を確認することもできる。

```sh
# fish 使ってるから `$` いらないね
curl (minikube service hello-minikube --url)

Hostname: hello-minikube-6fd785d459-9798m

Pod Information:
	-no pod information available-

Server values:
	server_version=nginx: 1.13.3 - lua: 10008

Request Information:
	client_address=172.17.0.1
	method=GET
	real path=/
	query=
	request_version=1.1
	request_scheme=http
	request_uri=http://192.168.99.100:8080/

Request Headers:
	accept=*/*
	host=192.168.99.100:32311
	user-agent=curl/7.54.0

Request Body:
	-no body in request-
```

# 後始末

### kubectl delete service

Kubernetes から service を削除。

```sh
$ kubectl delete services hello-minikube
service "hello-minikube" deleted
```

### kubectl delete deployment

deploy されたアプリケーションを削除。

```sh
$ kubectl delete deployment hello-minikube
deployment.extensions "hello-minikube" deleted
```

### minikube stop

Minikube そのものを停止する。

```sh
$ minikube stop
✋  Stopping "minikube" in virtualbox ...
🛑  "minikube" stopped.
```

# 最後に

本当に雰囲気だけが伝わった。

# おしまい
astah* tips

ここにはastahのあまり知られてなさそうなTipsを纏めていきます。

基本操作はastah本家サイトの
[astah* 機能ガイド](http://astah.change-vision.com/ja/manual.html)
を参照ください。以前に比べサイト全体がとても見やすくなっているので一読をオススメします。そんな機能あったの！？という発見があると思います。

ここでは、本家に載っていないバッドノウハウとかをピックアップしていきます。

# プロジェクトの排他制御を解除したい
APIからモデルを参照する際、astahでプロジェクトを開いているとProjectLockedExceptionで弾かれてしまい面倒です。参照のみで利用することが分かっているのであれば、一時的に排他制御をOFFにしてしまいましょう。

ユーザディレクトリ下のastahの設定ファイル(`${user}/.astah/professional/JudeP.properties`)を開き、以下の箇所を変更してastahを再起動してください。

```${user}/.astah/professional/JudeP.properties
file.lock_project_file=true --> false
```
※ 排他制御を行わなくなるため、複数箇所から書き込みがあると最悪ファイルが破損してしまいます。通常の作業の際は`ture`に戻しておくことをおすすめします。

#
Phalcon HelloWorld

# 概要
MacでPHPv7.2のインストール 〜 `curl localhost`で適当プロジェクトにアクセスするまで

# ver
* Phalcon v3.4.2
* PHP v7.2

# Install PHP
```sh
brew upgrade php
brew install php@7.2 # Phalconがphp7.2にしか対応してない？ 7.3だと、phalcon.soのloadに失敗するとでる `Symbol not found: __zval_ptr_dtor`
brew link --force php@7.2 # 必要なら
brew services start php # php-fpmが開始される
php -v # 7.2が表示されるはず
```

# Install composer
```sh
brew install composer
```

# Phalcon インストールする必要があるもの
* phalcon.so
 * phalcon用のPHP Extension。Phalcon本体はCで動いている
* phalcon-devtools
 * phalcon コマンドのために必要

# Install phalcon.so
```sh
brew tap tigerstrikemedia/homebrew-phalconphp
brew install php72-phalcon
ls /usr/local/Cellar/php72-phalcon/3.4.2/phalcon.so # 存在するはず
echo "extension=phalcon.so" > /usr/local/etc/php/7.3/conf.d/phalcon.ini
brew services restart php
```

# Install phalcon-devtools
今回はcomposer経由でインストールする

```sh
mkdir ~/phalcon
cd ~/phalcon
vim composer.json # 中身は下記
composer install
ls ~/phalcon/vendor/phalcon/devtools/phalcon.php # 存在確認
echo "alias phalcon=~/phalcon/vendor/phalcon/devtools/phalcon.php" >> ~/.zshrc # zshを使っているという前提で・・
source ~/.zshrc
phalcon # 疎通テスト
```

```json:composer.json
{
    "require": {
        "phalcon/devtools": "dev-master"
    }
}
```

# Phalconでプロジェクト作成
```sh
mkdir /tmp/test # 適当にディレクトリ作成
cd /tmp/test
phalcon project mypj
```

# nginxの設定
```sh
vim /usr/local/nginx/conf/nginx.conf # 中身は下記
nginx -s reload
```

```conf:nginx.conf
...略

    server {
        listen       10000;
        server_name  localhost;

        location ~ \.php$ {
            root   /tmp/test/mypj/public;

            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass localhost:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
    }
```
（...実際すごい適当）

# アクセステスト
```sh
curl localhost:10000/index.php
```
Corda関連のおすすめ記事一覧

Cordaに関するおすすめ記事を掲載していきます！
これからどんどん増やしていくのでお楽しみに！！

↓↓↓↓↓↓↓

#Cordaで信用状取引のアプリケーションを動かしてみた1
https://qiita.com/tomoyosi/items/33d23d8037a7c1e11efe

#SGX入門：HTTPからEnclaveまで
https://qiita.com/YuIku/items/abdfc5d4b269096d74ab

#Cordaの技術的優位性
https://qiita.com/yoshi-san/items/b8e029eba27238fdc2c9
intra-mart スクリプトメモ ラベルのリンクをスクリプトで設定する

intra-mart IM-BIS / IM-FormaDesiner のスクリプトメモ
ラベルのリンクをスクリプトで設定する。

#対象
・intra-mart Accel Platform
・IM-BIS
・IM-FormaDesiner

#やりかた
ラベルのプロパティにはアイテムIDが記載されていないので、
ソースを表示してアイテムIDを探す。

'product_72_label' で検索するか、一意のテキストを設定しておいて検索する。

あとは href に設定するだけ。

```Javascript:sample.js
// ラベルID
var item_id = 'xxxxx';
// URL
var url = 'https://qiita.com/';
// ラベルのリンクを設定
$( '#' + item_id ).find( 'a' ).text( 'リンクはこちら' );
$( '#' + item_id ).find( 'a' ).attr( 'href', url );
```
AngularのFlex-Layoutについて（Flexboxやレスポンシブ対応）

いつの間にかスター数が増えてきたangular/Flex-Layoutの仕様についてまとめてみようと思います。

Angularで画面を作成する際、レイアウトやレスポンシブ対応を実装するとき役に立ちます

- CSSのFlexboxをcssを書かなくて簡単に実装できる
- レスポンシブ対応で非表示やクラス付与など

インポート

```
# npm
npm i -s @angular/flex-layout @angular/cdk
# yarn
yarn add @angular/flex-layout @angular/cdk
```

各種コンポーネントで使えるようにするためにモジュールに`FlexLayoutModule`を登録する

```app.module.ts
import { FlexLayoutModule } from '@angular/flex-layout';
...

@NgModule({
    ...
    imports: [ FlexLayoutModule ],
    ...
});
```

### 使用方法(レイアウト：Flexbox)
```sample.html
<div fxLayout="row"> #fxlayout:boxの方向を決める
   <div fxFlex="10%"></div> #fxflex:上記で決めたboxの幅or高さを決める
   <div fxFlex="10%"></div>
   <div fxFlex="80%"></div>
</div>
```
##親要素
###`fxLayout=""`について
この設定値により子要素の配置方向を決める。

| 値       |   CSS   |    意味    |
|:-----------------|:------------------|:------------------|
| ''(default)    | flex-direction: row         |左から右に配置|
| row            | flex-direction: row         |左から右に配置|
| row-reverse    | flex-direction: row-reverse |右から左に配置|
| column         | flex-direction: column      |上から下に配置|
| column-reverse | flex-direction: column-reverse |下から上に配置|
	
### `fxLayoutAlign=""`について
| 値       |   CSS   |    意味    |
|:-----------------|:------------------|:------------------|
| ''(default)    | justify-content: flex-start|flex-directionで指定した方向の始めから配置|
|start or flex-start |justify-content: flex-start|flex-directionで指定した方向の始めから配置|
|center   | justify-content: center |中央に揃え|
|end or flex-end |justify-content: flex-end |flex-directionで指定した方向の終わりから配置|
|space-around | justify-content: space-around|全てのFlexboxアイテムの左右に等しく配置|
|space-between | justify-content: space-between |隣り合うFlexboxアイテムの間隔を等しく配置|
|space-evenly | justify-content: space-evenly|Flexboxアイテムの間隔を等しく配置|	

##子要素
###`fxFlex=""`について
```
<div fxFlex="<basis>"></div>
or
<div fxFlex="<grow> <shrink> <basis>"></div>
```

fxFlexにboxの詳細情報を記載。値が一つの場合、下記のcssのFlexboxのflex-basisを設定したのと同意

```
/* 幅を指定 */
flex-basis: 10px;
flex-basis: auto;

/* 固有のサイズ指定キーワード */
flex-basis: fill;
flex-basis: max-content;
flex-basis: min-content;
flex-basis: fit-content;

/* フレックスアイテムの内容物に基づいて自動設定する */
flex-basis: content;

/* グローバル値 */
flex-basis: inherit;
flex-basis: initial;
flex-basis: unset;
```

`<grow> <shrink> <basis>`を設定した場合、
cssのflex-grow、flex-shrink、flex-basisを設定したのと同意である。
この3つは一緒に使用し、通常、すべての値が設定されることを保証するために一括指定される。

- flex-grow、flex-shrinkはスペースが余っている場合に、指定にしたがって分配するために使用する。
- flex-growは flex コンテナ内の他の flex アイテムと比較して、どのくらい大きくするか定義する。
- flex-shrinkは flex コンテナ内の他の flex アイテムと比較して、どのくらい小さくするか定義する。
embulk-input-mongodb で ISODate で query したい

## やろうとして失敗したこと
mongodb から、ISODate の入ったカラムで絞って出力したく
以下のような yml を作成して実行したが、 query文が parse エラーを起こしてしまう。

```yml

in:
  type: mongodb
  uri: 接続情報
  collection: コレクション名
  query: '{ "createdAt": { $gte: ISODate("2019-03-24T00:00:00+09:00"), $lt: ISODate("2019-03-25T00:00:00+09:00") } }'

filters:
  - type: expand_json
    json_column_name: record
    expanded_columns:
      省略

out:
  type: stdout
```

## 解決策
ISODate ではなく $date を使う
小一時間ハマった。

```yml

in:
  type: mongodb
  uri: 接続情報
  collection: コレクション名
  query: '{ "createdAt": { $gte: {$date : "2019-03-24T00:00:00+09:00"}, $lt: {$date : "2019-03-25T00:00:00+09:00"} } }'

filters:
  - type: expand_json
    json_column_name: record
    expanded_columns:
      省略

out:
  type: stdout
```
PlayFab PubSub ってなによ？

PlayFab PubSubがプレビューリリースされました！
という話

### PubSubって？
Pub/Subとは，パブリッシュ・サブスクライブ（Publish-Subscribe)の略
技術的にはASP.NetSignalRを使っている(リアルタイム双方向通信するためのライブラリ)
リトライの仕組みも実装されています
また現状パブリックプレビューということもあり、「無料」で利用できますが
今後利用料は別途支払うことになるようで、それに関してはまた別途公表されるとのこと。

### 何ができるの
(1)特定のクライアントへのプッシュ機能
テキストメッセージ、ギルドへの招待、ギフト通知、または各ユーザ個人へのオファーを即座に任意のユーザーに送信します。

(2)ポーリングなしでのゲームステータス同期
ゲームの世界の変化、多人数参加型のゲームの移動、設定の更新、マッチメイキングのチケットの状態、Friendのプレゼンス情報を、サービスにかかる費用や待ち時間なしにクライアントにプッシュできます。

(3)PlyStreamの拡張
今までサーバサイド(PlayFab管理画面)から見えたPlayStremがクライアント側でも見ることができ、かつアクションを行うことができます

何がすごいってクロスプラットフォームのソリューションなので、コンソールでもモバイルでも使えるソリューションであるということ。
要件に合っていれば情報をクライアント側にメッセージをすぐにPushすることができる

### どうやって実装するの？
実装するためにGitHubからPubSub用SDKを取得しクライアントに実装する必要があります。
現状Unity(2018以降)での実装に関してはドキュメントがでていますが、おそらく今後増えていく予定

またPlayFub管理サイト側からポリシーを設定し、
「どういったイベント」を「誰」に送信するのかを設定することができます。
(公式ドキュメントからはログイン通知をフレンドに通知できる設定が載っていました)

※パブリックプレビュー中なのでSLAはないです


続報に期待
Firebase FirestoreのTimestamp型のdateへの変換

備忘録的に書く。

SwiftのFirestoreで使えるtimeStamp型をdateに変換する方法
How to convert Firebase Firestore Timestamp to Date (Swift)?

```swift
let timeStamp: Timestamp

let date: Date = timeStamp.dateValue()
```

以上。

# 参考
https://stackoverflow.com/questions/51116381/convert-firebase-firestore-timestamp-to-date-swift
Gradle: 依存ライブラリ入りのjarを作る

Gradleにはjarを生成する`jar`タスクが存在し、jarファイルを作ることができるが、依存ライブラリは含まれないのでそれ単体では実行できない。

```bash
java -jar ./build/libs/hello-gradle.jar
no main manifest attribute, in ./build/libs/hello-gradle.jar
```

アプリとしてデプロイや配布するときは、依存ライブラリ入りのjar(fat jar)を作りたい。

## Gradle Shadow Plugin

[Gradle Shadow Plugin]はGradleでfat jarを簡単に作れるようにしてくれるプラグインだ。

[Gradle Shadow Plugin]: https://imperceptiblethoughts.com/shadow/

使い方はこう。

まず、`build.gradle`に下記を書き足す:

```gradle:build.gradle
plugins {
    id 'com.github.johnrengelman.shadow' version '5.0.0'
    id 'java'
}
```

なお、`5.0.0`のバージョン部分は、[公式ドキュメント](https://imperceptiblethoughts.com/shadow/getting-started/)にて最新バージョンを確認してほしい。

次に、`shadowJar`タスクが追加されたことを確認しておく:

```bash
./gradlew tasks

> Task :tasks

------------------------------------------------------------
Tasks runnable from root project
------------------------------------------------------------

...

Shadow tasks
------------
knows - Do you know who knows?
shadowJar - Create a combined JAR of project and runtime dependencies
```

`shadowJar`タスクを実行するとfat jarが作られる:

```bash
./gradlew shadowJar

BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 execute
```

作られたjarを実行してみる:

```bash
java -jar ./build/libs/hello-gradle-all.jar
Hello world.
```

## 参考

* [Gradle Shadow Plugin](https://imperceptiblethoughts.com/shadow/) ── 公式ドキュメント
* [Gradle Shadow を使って fat JAR を作る手順 - Qiita](https://qiita.com/kmdsbng/items/ab093146a62afa34b739)
HomeBrew services 便利

brew services が便利だったのでメモ

ex.

```sh
brew services restart nginx # nginx起動し直し
brew services list # service一覧を表示
```

# brew service
https://github.com/Homebrew/homebrew-services

# Commands
* list  
serviceの一覧を表示
* start xxx  
xxx を開始、かつ、ログイン時に起動する設定をする
* stop xxx  
xxx を停止、かつ、ログイン時に起動する設定を消す
* restart xxx  
`stop; start`
SlackbotのUser Agent

アクセスログを見ていたら見慣れないUser Agentからのリクエストがありました。

`Slackbot-LinkExpanding 1.0 (+https://api.slack.com/robots)`

というものです。ん？と思って調べてみると

Slackにリンクを貼り付けた場合の自動展開されるときに飛んでくるリクエストでした。
なるほどねぇ。