OmniAICreator/Qiita-1.07M huggingface dataset:
【現場からの声】あなたのそのアイディアがWatsonをもっとよくする 💙

# 初めまして
先輩(@makaishi2 )からのアドバイスで、Qiitaに記事を投稿することになりました。
Qiitaには優れた記事が多く、私の出番など無いと感じていたので、「一体何を書けばいいの？」という状態でしたが、やっと**目的**が見つかりました!
私が普段、**お客様からいただいた質問の中からQiitaを見ている皆さんにも役に立ちそうな内容を記事にすればいい**、ということなんです。
ハイ、それでは早速、**【現場からの声】**シリーズの第一弾です。

# あなたのそのアイディアがWatsonをもっとよくするって？
- **どうゆうこと**
 
IBM Watsonを使っていると、「あの機能があれば...」「この機能は使いにくい」と思うことは1、2度はありますね。そんな時、皆さんはどうしてます？
実は、こんなサイトがあるんですが、知ってました？

- **こちらです**
:::note info
2023/2/27現在確認したところ、IBM Watson Ideas は、 [IBM Data and AI Ideas Portal for Customers](https://ibm-data-and-ai.ideas.ibm.com/) に統合されています。
:::
:::note info
私がお客様からいただいて入力したリクエストが、2023/2/13にサポートされました。
・[MS Teams Integration Support](https://ideas.ibm.com/search?query=ASSISTANT-I-284)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/d4cb7ff5-4012-c129-b0d2-c0180c2347cd.png)
オンラインマニュアルでの記述は[こちら](https://cloud.ibm.com/docs/watson-assistant?topic=watson-assistant-watson-assistant-release-notes#watson-assistant-feb132023)です。

:::
:::note warn
当記事の内容はすでに古くなっており、現状の表示内容や要望の追加手順は異なっております。
記事は当時の状況を保存するために、そのままとします。
:::
「IBM Watson Ideas」(現 IBM Data and AI Ideas Portal for Customers) ~~https://ibm-watson.ideas.aha.io/ideas/~~ から https://ibm-data-and-ai.ideas.ibm.com/ に変更になりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52151/26b5a4bd-20a9-890f-f1c6-d64af6dddb77.png)
ハイ！、そんなあなたの気持ちを受け止めてくれるサイトです。

# サイトの構成
英語ですが、ここで怯んではいけません。まずはザッと眺めてみましょう。

- フィルタ
 - Status
        - 英語ですが、直感的に理解できると思います。Plannedになると実装されるようです。
 - Category
        - Watson APIs別に表示したいときに使用します。
  
- タブ切替
 - Recent
        - 新しい投稿順で表示されます。 
 - Trending
        - 人気急上昇順ですかね..
 - Popular
        - 投票数(Vote)の多い順に表示されます。
- 投稿されたアイディア
    - 中央に、投稿されたアイディアが表示されます。
- [Add a new idea]
    - 左上にある[Add a new idea]をクリックすることであなたのアイディアを投稿することができます。 
<img width="1006" alt="WatsonIdea.png" src="https://qiita-image-store.s3.amazonaws.com/0/52151/acb740a2-35dd-3b3b-d02c-c8910e92b18a.png">

# 投票(Vote)
実現して欲しいアイディアに、投票(Vote)することができます。
:warning: 投票にはSign Upが必要です。
<img width="742" alt="vote.png" src="https://qiita-image-store.s3.amazonaws.com/0/52151/d10095d8-c29b-d520-45d6-5e497531323c.png">

# 採用事例


・We need to have Watson Speech To Text Service in German Language

意外や意外、ドイツ語がSpeech-to-Textでサポートされていなかった、という投稿。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/52151/3d781ab7-50cd-9e03-49e2-f7dab9c9bfbc.png)


**採用されると[Planned]というタグが追加されます。**嬉しいですね。
:flag_de: 現時点でドイツ語は既にサポート済みです。


# お客様からの反応

「いろいろな意見が可視化されて興味深いです」

# 誰かの疑問が多くの人の役に立ちますように...

【現場からの声】 シリーズ第一弾、いかがでしたでしょうか？

# 参考

https://qiita.com/kawada2017/items/f257043975a025fb4e0d
【JavaScript】スコープ【自己学習】

##スコープとは
スコープとは、変数を参照できる範囲を決める概念のこと。

##スコープの種類
- **グローバルスコープ** →　コード内のどこからでも参照できる
- **ローカルスコープ**　→　変数を定義した関数内でのみ参照できる

グローバルスコープを持つ変数を**グローバル変数**、ローカルスコープを持つ変数を**ローカル変数**と呼び、スコープが異なる変数は同名であっても別の変数として扱われる。

```scope-1.js
var scope = "global";    //グローバル変数の定義

function value() {
  var scope = "local";   //ローカル変数の定義
  console.log(scope);
}

value();  // > local
console.log(scope); // > global
```
value関数内の先頭でローカル変数scopeを定義したことで、関数内の変数scopeの値はglobalからlocalに上書きされている。そのため、value関数を呼び出すとコンソール上ではlocalと出力される。

一方、関数の外にある変数scopeを呼び出した場合、グローバル変数scopeの値はコードの一番で定義したままであるためglobalが出力される。

##変数の巻き上げ（ホイスティング）
ローカル変数は関数内のどこで定義しても、変数の宣言自体は関数内の先頭で行われたとみなされる。これを**変数の巻き上げ（ホイスティング）**という。

```scope-2.js
var scope = "global";

function value() {      //実際の関数内の処理
  console.log(scope);   //var scope;
  var scope = "local";  //console.log(scope);
                        //scope = "local"
}                        

value();  // > undefined
```
上記のコードで関数valueを呼び出した場合、ローカル変数scopeの定義が関数の一番最後で行われていることから、globalという値が出力されるようにもみえるが、実際はundefinedが出力される。

これは、ホイスティングにより実際の処理では関数の先頭でローカル変数scopeが宣言され、値の代入自体はconsole.log(scope)の後に行われていることで生じている。

```scope-3.js
var scope = "global";

function value() {
  var scope = "local";
  console.log(scope);
}

value();  // > local
```
ホイスティングにより思わぬ不具合を引き起こすことを防ぐために、上記のコードのように**ローカル変数は関数内の先頭で定義する**のが望ましい。
VirtualBoxの仮想ディスク(.vdi)のCapacityを半強制的に縮小する

# 経緯

今回新規でSSDを購入したため、HDDにある.vdiをSSDに移動することにしました。
しかし、SSDの容量は256GBに対し、vdiの容量Capacityの設定が500GBになっていたため、
大容量のファイル書き込みを行った際に問題が生じると考えてvdiを縮小する作業を行いました。

通常はvirtualboxのVBoxManager.exeを用いて以下の方法で縮小可能です。
>参照 : [VirtualBox の仮想ディスクのサイズを変更する](https://qiita.com/niwashun/items/f71b0b805a6f97b514ec)

しかし、VBoxManage clonehdを実施しても縮小可能な形式にはならず…
代替案として、下記を参照して強制的に縮小してみたのでその備忘録になります。
> 参照：[How to decrease virtual size/capacity of a Virtualbox vdi file
](https://serverfault.com/questions/779106/how-to-decrease-virtual-size-capacity-of-a-virtualbox-vdi-file) 

<font color="Red">**※注意：強制的にリサイズするため、データが欠損する可能性があります。
　　　　必ずvdiファイルをコピーをした後に実施してください。**</font>

# 環境

- HostOS : Windows10 Home
- VMHost : VirtualBox 5.2.26
- VM OS : Ubuntu 18.04
- 備考 : LVM未使用

# 実施手順

## 1. gpartedで既存パーティションの容量を削減

LiveCDでUbuntuを起動しgpartedを用いてパーティションを変更します。

```bash
$ gparted
```

GUIで操作できるため、パーティションを削減後のディスク容量以下になるように修正

![rapture_20190330174833.jpg](https://qiita-image-store.s3.amazonaws.com/0/327546/51b0d980-baa3-9f18-2ef3-4ebbdc59d1c9.jpeg)

## 2. 容量の小さなvdiを作成する

先に新規の仮想マシンを作成し、容量の小さなvdiファイルを新規に作成。

![rapture_20190330175143.jpg](https://qiita-image-store.s3.amazonaws.com/0/327546/3b180215-2367-f644-5422-c15a0cf8f923.jpeg)

その後、VBoxMaangerで複製する。clonehdの--existオプションでcapacityそのままに内容のみコピーが可能となる
(標準のvboxmanagerの位置：C:\Program Files\Oracle\VirtualBox)

```
C:\Program Files\Oracle\VirtualBox>VBoxManage.exe clonehd <既存のvdi> <上記で作成した新規vdi> --existing
```

完了した後に、list hddsによりcapacity確認

```
C:\Program Files\Oracle\VirtualBox>VBoxManage.exe list hdds
```

## 3. fsckで微修正

この状態で仮想マシンを起動してもエラーが表示されるため、LiveCDのfsckで調整

```bash
## 対象となるパーティションを確認
$ fdisk -l
## 強制的に修正
$ sudo e2fsck -fy /dev/sda1
```

以上で仮想マシンを立ち上げると動作する・・・はず

# おわりに

強制的にリサイズしているので、データ欠損がある可能性が高いです…
あまりいい方法ではないですね。まぁ最終手段ということでよろしくおねがいします。
WindowsユーザーがMacOSでRemoteDesktop越しにWindowsを扱うときのキーマップ

# 概要とか

Windows育ちで109キーボードに慣れてるけど、スタバでMacbookAirでｯﾀｰﾝとかしたいよね。的なアレでMacbookを持ち歩いてるんだけど、なんだかんだでWindows環境が必要だからRemoteDesktopでいろいろやらざるを得ない。

そんなときにWindowsとMacのキーバインドが微妙に違うのがすげぇストレスなのでキーマップを変更して109キーっぽくして快適に使おうといういわゆるアレ。

## 環境とか

macOS Mojave 10.14.3
Microsoft Remote Desktop Version 10.2.10(1582)

RemoteDesktopで接続したときになぜかUSキーボードとして認識されるアレは解決してません。
接続先のアカウントでWindows機から一度ログインしておけばOKなのでそれで迂回してます。

## 変更方針

- [Template:106キーボードの配列 \- Wikipedia](https://ja.wikipedia.org/wiki/Template:106%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%81%AE%E9%85%8D%E5%88%97)
- [MacBookProJISKeyboard\-1 \- キー配列 \- Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%BC%E9%85%8D%E5%88%97#/media/File:MacBookProJISKeyboard-1.jpg)

主に左下のキーについて、

1. 左下最下段(macではCAPS)は最もよく使うコピーペーストの使い勝手をWindowsのものに合わせるために
  - macosでは左Commandキーに
  - Remote Desktopでは左Ctrlキーに
2. 最下段左から2番め(macではOption)はWindows+E Windows+R でよく使うので
  - Remote Desktopでは左Commandキーに
3. 最下段左から3番目(macでは左Command)は
  - macosでは左Controlキーに
  - Remote DesktopではOptionキーに
4.  左Shiftの上のキーはCAPSキーに

という形にしよう。そうしよう。

## 環境構築

### Karabiner Elementsをダウンロード インストール

[Karabiner \- Software for macOS](https://pqrs.org/osx/karabiner/)

略！

### macos用の基本設定

<img width="996" alt="スクリーンショット 2019-03-30 17.44.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/199750/deee11cc-9029-0424-4df4-d9d3d5645339.png">

- 左ControlにCapsLockを割り当て
- 左CapsLockに左Commandを割り当て
- 左Commandに左Controlを割り当て

これでWindowsと同じように「左下のキー+cでコピー」「左下のキー+vで貼り付け」 が再現できた。

### Remote Desktopの設定

<img width="756" alt="スクリーンショット 2019-03-30 17.50.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/199750/d3b24724-b483-75a9-6802-3b6ecd6bf7e3.png">

- 「Use Mac Shortcuts for Cut, Copy, and Paste」のチェックを外しておく

### Remote Desktop用 Karabiner Elementsの設定

[JISキーボードのMacからRDPでWindowsに接続するとき109キーみたいにするやつ](https://gist.github.com/qyen/5a2b9d2d5347b378856a3f8b21e2a96e)

これを`~./config/karabiner/assets/complex_modifications/rdp-jp109.json`として保存。

Karabiner Elementsの`Complex Modifications`から`Add rule`を選んで

<img width="1112" alt="スクリーンショット 2019-03-30 17.57.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/199750/cb5cc1cb-c3e1-2d5c-13d2-4b8160bd9664.png">

この`Enable`でOK。
SQLの入門にいかがでしょうか　〜Udemy感想その４〜

# 概要
プログラミング初心者が一年くらい[udemy](https://www.udemy.com/)で勉強をしました
修了したコースの感想を書いてます

今回紹介するのはSQL初心者向けの教材です
基礎知識ゼロからでもいけます、講師も「Complete beginners to MySQL are welcome」と言ってるので初めてSQLを勉強する！って人にもおすすめです

# 使った講座
[The Ultimate MySQL Bootcamp: Go from SQL Beginner to Expert](https://www.udemy.com/the-ultimate-mysql-bootcamp-go-from-sql-beginner-to-expert/)

MySQLを使った基本的なSQLのコマンドから、最後は用意されているウェブアプリを使ってデータベースの変更がブラウザ上の情報に反映されるところまで勉強できます
実際にブラウザで表示できるようにしてくれてるのは、僕としては何にデータベースの情報が使われてるのか体験できてありがたかったです

# 受講した頃の自分
応用情報処理技術者試験の勉強をしていたので
SELECTなどの基本的なSQLのコマンドは知ってた

railsで間接的に触ったことはあった

ただSQLを書いて使用した経験はほぼゼロ

# 良かった点
 - **めちゃめちゃ丁寧** 

アバウトですみません笑

初心者向けと言っているだけあってとても丁寧です
インストールの仕方から始まり、各レクチャーの終わりには
**そのレクチャーで入力したコードが文字起こしされています**

またSQLとMySQLは何が違うの？みたいな素朴な疑問、概念、考え方なども教えてくれています
(↑最初の頃よくわかってなかった)

- **各セクションごとに確認テストがある**

各セクションが終わるごとに確認テストが用意されています

内容はスライドに示す結果と同じ結果になるSQLを書いてねって感じで
セクションの内容全部使えばできるようになっています

僕の場合独学だとインプットばっかりになって中々アウトプットしないことが多いので
セクションごとに勉強した内容が身になってるか確認できるのは良かったです

# 今一つだった点
- **テストが簡単だった**

初心者向け！、未経験でも大丈夫！！とうたっているのでしょうがないかもしれませんが
確認テストが少し簡単すぎるかなあと思いました

応用情報の問題で出てきたのはもう少し難しかったので
せめてそのくらいの難易度はあっても良かったかなと思います

# まとめ
SQLを触ったことがない、勉強したいけどどうやったらいいかわからないって人は
[The Ultimate MySQL Bootcamp: Go from SQL Beginner to Expert](https://www.udemy.com/the-ultimate-mysql-bootcamp-go-from-sql-beginner-to-expert/)
やってみてもいいと思います
ABC - 067- A&B&C

#AtCoder ABC 067 A&B&C
[AtCoder - 067](https://atcoder.jp/contests/abc067)

#A問題

 - A,B,A+B が 3の倍数かどうかを調べる
 - 3の倍数であれば3匹で分けることができる

```java
	private void solveA() {
		int numA = nextInt();
		int numB = nextInt();

		if (numA % 3 == 0 || numB % 3 == 0 || (numA + numB) % 3 == 0) {
			out.println("Possible");
		} else {
			out.println("Impossible");
		}

	}
```

#B問題

 - 与えられた棒のうち、長いほうからN個とってつなげるのが一番長くなる
 - 入力をソートして長いほうから入力値を合算

```java
	private void solveB() {
		int numN = nextInt();
		int numK = nextInt();

		int[] wk = IntStream.range(0, numN).map(i -> nextInt()).toArray();

		Arrays.sort(wk);

		int res = IntStream.range(0, numN).filter(i -> i >= numN - numK).reduce(0, (sum, i) -> {
			sum += wk[i];
			return sum;
		});

		out.println(res);
	}
```

#C問題

 - カードの山の上から順にX枚とって、残りをアライグマに渡す
    - すぬけが$\sum_{a_0}^{a_i}$
    - あらいぐまが$\sum_{a_{i+1}}^{a_N}$
    - $|\sum_{a_o}^{a_i}-\sum_{a_{i+1}}^{a_N}|$が一番小さい値を求める

山の上から順に取るのでソートなどという行為はしてはいけません。読解力が足りないと時間が溶けます。

```java
	private void solveC() {
		int numN = nextInt();
		int[] wk = new int[numN];
		long raccoon = 0;
		for (int i = 0; i < wk.length; i++) {
			wk[i] = nextInt();
			raccoon += wk[i];
		}
		/**
		 * 「山の上からとる」という記述を見逃していた、、、
		 * 山の上からなので、先頭から順に取っていかないといけない。
		 */
		//		Arrays.sort(wk);

		long res = Long.MAX_VALUE;
		long sunuke = 0;
		//最後の1個まで計算するとsunukeにすべての数字が偏ってしまうので1個だけraccoonに残す
		for (int i = 0; i < wk.length - 1; i++) {
			sunuke += wk[i];
			raccoon -= wk[i];
			res = Math.min(res, Math.abs(raccoon - sunuke));
		}
		out.println(res);

	}
```

#C問題：TLE実装
問題をよく読まなかったので上からではなくランダムに取得すると考えてしまった。
そのため、再帰を利用して実装した。
一応解答としてはあっているのだが、TLEとなってしまう。

```java
	private void solveC2() {
		int numN = nextInt();
		int[] wk = IntStream.range(0, numN).map(i -> nextInt()).toArray();

		Arrays.sort(wk);

		if (wk.length == 2) {
			out.println(Math.abs(wk[0] - wk[1]));
		} else {
			out.println(saikiC(wk, 0, 0, 0, 0, 0));
		}
	}

	private long saikiC(int[] wk, int currentI, long sunuke, long raccoon, int sunukeCnt, int raccoonCnt) {
		if (currentI > wk.length - 1) {
			if (sunukeCnt == 0 || raccoonCnt == 0) {
				return Integer.MAX_VALUE;
			} else {
				return Math.abs(sunuke - raccoon);
			}
		}

		//今回のはすぬけ
		long val1 = saikiC(wk, currentI + 1, sunuke + wk[currentI], raccoon, sunukeCnt + 1, raccoonCnt);

		//今回のはあらいぐま
		long val2 = saikiC(wk, currentI + 1, sunuke, raccoon + wk[currentI], sunukeCnt, raccoonCnt + 1);

		return Math.min(val1, val2);
	}
```
統計学1 - 統計学用語の理解 & 記述統計と推測統計

※こちらの記事は"Pythonで学ぶあたらしい統計学の教科書"に基づいて、統計学初学者が頭の整理とアウトプットを目的に掲載している記事です。本の内容のみならず、自分で調べた内容、自分のイメージにマッチした内容を追記している場合もあります。

※今回はまだまだPythonを使用しません。

## そもそも統計学とは
データの適切な取り扱い方を探る方法論を体系化した学問であると言えます。
統計学の中でもジャンルとして、2つに大きく分別されます。
- 記述統計 ･･･ 既知の手持ちデータの整理･要約する
- 推測統計 ･･･ 未知のデータを推測する

記述統計と推測統計の関係について、イメージ図がめちゃくちゃ分かりやすいのがあったので、下記画像見ればOK。
> ![image.png](https://qiita-image-store.s3.amazonaws.com/0/384111/18c51173-e397-7ebe-d754-7ebb61a6ac37.png)
出典:[統計学とは - 株式会社ALBERT](https://www.albert2005.co.jp/knowledge/statistics_analysis/statistics_basics/statistics)

## 統計学の基礎用語
- 標本 ･･･ 手持ちの既知データ
- 母集団 ･･･ 未知のデータを含んだ、すべてのデータ

標本という母集団のごく一部のデータを用いて、母集団という全体について議論するということが推測統計の目的ということがこの段階でわかれば問題なし。

## 抽象化された標本を得るプロセス
### 用語
- 確率変数 ･･･ ある確率分布に従って変化する値
- 実現値 ･･･ 確率変数における具体的な値
- サンプリング ･･･ 母集団から標本を得ること、サンプリング = 標本抽出
    - 単純ランダムサンプリング ･･･ 母集団から各要素がランダムでサンプリングする方法
- 確率分布 ･･･ 確率変数とそれに付与された確率との対応を表したもの
- 母集団分布 ･･･ 母集団が従う確率分布のこと

### 例 ｢小さな湖の中にいる魚を釣る｣
話を簡潔にするために、下記の3つの前提条件を設定します。
- 母集団は、５匹の魚ですべて同じ種である。
- 5匹それぞれの大きさが2, 3, 4, 5, 6cmである。(小数点第1位を四捨五入)
- 釣った魚はすぐに湖の中にリリースする。

この湖の中で魚を1匹釣り、3cmの魚を釣ったと仮定します。5匹の中から3cmの魚1匹を釣っているので、確率としては、1/5となります。
このときの確率を`P(2.5≦体長<3.4)=1/5`という表記をします。

この式の意味は、体長が3cmの魚を釣れる確率は1/5であるという意味です。
体長は四捨五入するので、3cmの魚の場合は2.5cm以上、3.4cm以下の魚になります。
Pは、Probability(確率)の頭文字を表します。

このときの3cmの魚は**実現値**です。
また、次の釣りで釣る魚の大きさはどの大きさか分かりませんが、変数xという大きさの魚になります。この変数xを**確率変数**といいます。

この確率は、3cmの魚のみならず、他の魚を釣る場合も同じ確率となるので、下記のような**確率分布**となります。
`P(1.5≦体長<2.4)=1/5`
`P(2.5≦体長<3.4)=1/5`
`P(3.5≦体長<4.4)=1/5`
`P(4.5≦体長<5.4)=1/5`
`P(5.5≦体長<6.4)=1/5`

あるデータが、ある確率分布と対応している時、｢**確率分布に従う**｣という表現をします。
上記の例では、｢釣れる魚の体長は、{1/5, 1/5, 1/5, 1/5, 1/5}の確率分布に従う｣という表現になります。

母集団分布を通して、標本を得るプロセスを見直してみます。
① 以下の母集団から、単純ランダムサンプリングにより標本を1つ得る
`1.5≦体長<2.4 : 1匹`
`2.5≦体長<3.4 : 1匹`
`3.5≦体長<4.4 : 1匹`
`4.5≦体長<5.4 : 1匹`
`5.5≦体長<6.4 : 1匹`

② 以下の確率分布に従う確率変数を1つ取得する
`P(1.5≦体長<2.4)=1/5`
`P(2.5≦体長<3.4)=1/5`
`P(3.5≦体長<4.4)=1/5`
`P(4.5≦体長<5.4)=1/5`
`P(5.5≦体長<6.4)=1/5`

①と②を同じプロセスだとみなします。
①と②を同じだと見なすプロセスは、単純ランダムサンプリングで得たデータを基に、未知の母集団を推測する、ということです。
つまり、既知データから未知のデータを推測するという統計学のプロセスがここに詰まっているという私の理解です。

これまでのプロセスをすべてまとめると下記のように表現できます。
***母集団分布に従う確率変数として、3cmの魚というデータが実現値として得られた***

## その他参考サイト
[確率変数とは - 統計WEB](https://bellcurve.jp/statistics/blog/14006.html)
[サンプリング方法の種類～データの取り方～ - Knowledge Makers](http://knowledge-makers.com/sampling/#i-3)

## コメント
今回用いた魚を釣るという例は、箱の中にある球を取り出すという事象で表現することも可能ですね。
私は球を取り出すモデルは、中学･高校でも確率の問題でよく題材にされるので、イメージは行いやすい印象でした。
Reactでinput type=fileのフォームを作っていい感じにスタイルする

input要素って、typeがfileになると途端にスタイルが面倒くさくなりますよね。
reactでそれっぽいコンポーネントを作ったので、残しておきます。

```react
import React, { useState } from 'react';
import styled from 'styled-components';

const Wrapper = styled.div`
  display: flex;
`;
const Label = styled.label`
  お好きにどうぞ
`;
const Input = styled.input`
  display: none;
`;
const FileName = styled.p`
  お好きにどうぞ
`;

const onChange = (event, cb, setFileName) => {
  cb(event);
  const targetName = event.target.files.item(0).name;
  setFileName(targetName);
};

const InputFile = props => {
  const [filename, setFileName] = useState('選択されていません');
  if (props.type !== 'file') return <p>typeの指定、間違ってるよ</p>;
  return (
    <Wrapper>
      <Label>
        ファイルを選択
        <Input
          {...props}
          onChange={e => onChange(e, props.onChange, setFileName)}
        />
      </Label>
      <FileName>{filename}</FileName>
    </Wrapper>
  );
};

export default InputFile;
```

使い方はこんな感じ

```react
<InputFile
  type='file'
  accept='image/*'
  onChange={e => なんか好きな処理}
/>
```
OpenXRとはなんぞや。


#OpenXRとは
OpenXRは、バーチャルリアリティおよび拡張現実プラットフォームおよびデバイスへのアクセスに関するオープンでロイヤリティフリーの規格です。クロノス・グループ コンソーシアムによって管理されているワーキンググループによって開発されています。

#リリース
OpenXRは2017年2月27日のGame Developers Conference 2017にてクロノス・グループによって発表されました。
規格の暫定版は2019年3月18日にリリースされ、開発者と実装者がそれに関するフィードバックを送ることができます。

#OpenXRの構想
![OoepXR_before_after.PNG](https://qiita-image-store.s3.amazonaws.com/0/274029/aa7118e1-efd9-e062-194a-e799b2c3140b.png)

2つの層があります。


##Application Interface層
今回リリースされたVersion 0.9でこのAPI層が提供されました。


##Device Plugin Interface層
各デバイスへの対応は、Version 1.0以降で、2019年後半ごろにリリースされる予定のようです。

#何が変わるの？！
Unityを例にとって説明します。
現状、UnityではBuildをする際に、下の図のようにプラットフォームを選択するようになっています。そして、PlatformごとにBuildをする必要があります。

<font color="OrangeRed">OpenXRが実装されると、PlatformごとにBuildをする必要がなくなり、Buildしたものはどのプラットフォームでも実行することができるようになります。（たぶん！）</font>

OpenXRがなんのために議論されているか、少しイメージがついたでしょうか。

![platform_2.png](https://qiita-image-store.s3.amazonaws.com/0/274029/e2dfd8fb-2c29-6879-ba74-4240c5ca7ac9.png)



#公式サイトで用意されているもの

1.Web XR 概要のスライド（英語版）
https://www.khronos.org/assets/uploads/apis/OpenXR-Update-GDC_v20190316c_Mar19.pdf

2.Manual
https://www.khronos.org/registry/OpenXR/specs/0.90/html/xrspec.html#introduction

3.サンプルコード
https://github.com/KhronosGroup/OpenXR-SDK


#おまけ（Tシャツ売ってるみたいです。）
公式ストア
https://www.khronos.org/store
![openxr-2019.jpg](https://qiita-image-store.s3.amazonaws.com/0/274029/203138d3-2881-f2cc-833d-1595cd867526.jpeg)
[Ansible] whenとregisterではまった話

# はじめに
`when`と`register`を使用した際、想像していた動作と違っていたのでメモ。

# やりたいこと

- タスクを実行後、結果を変数に格納
- `when`で条件分岐させ、複数の要素から、特定の要素にのみtaskを実行
- 結果を変数として取得

# HTTPステータスコードの取得
特定の文字列が含まれたURLに対してGETを行い、HTTPのステータスコードを取得したい。
以下のようなplaybookを作成。

```yaml:http-get-playbook.yml
---
- hosts: all
  connection: local
  vars:
    - url_list:
        - "http://www.yahoo.co.jp"
        - "http://www.google.com"
  tasks:
    - name: http-get
      uri:
        url: "{{ item }}"
      with_items: "{{ url_list }}"
      register: result
      when:
        - '"google" in "{{ item }}"'

    - name: debug
      debug: msg='{{ result.results.status }}'
```

`"http://www.google.com"`に対しての結果のみが`result`に入るものだと思っていた。
が、実際の結果は以下の通り。

```:result
PLAY [all] **************************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************************
ok: [127.0.0.1]

TASK [http-get] *********************************************************************************************************************************************
 [WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: "google" in "{{ item }}"

skipping: [127.0.0.1] => (item=http://www.yahoo.co.jp)
ok: [127.0.0.1] => (item=http://www.google.com)

TASK [debug] ************************************************************************************************************************************************
fatal: [127.0.0.1]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'status'\n\nThe error appears to have been in 'http-get-playbook.yml': line 17, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n    - name: debug\n      ^ here\n"}
        to retry, use: --limit xxx
PLAY RECAP **************************************************************************************************************************************************
127.0.0.1                  : ok=2    changed=0    unreachable=0    failed=1

```

`status`が存在しないという旨のエラーが発生した。

# エラーの原因
`when`で条件分岐させた後、`resister`を使用して結果を格納した場合、**"スキップした"**という結果も同時にネストされる。

つまり上記の`yaml`の場合、'result'は以下の要素がネストされた状態で存在している。

```
result = [
    '"http://www.yahoo.co.jp"をスキップ',
    '"http://www.google.com"を実行した結果'
]
```

# エラーの回避
結果はネストされているため、`"http://www.google.com"`の結果のみ出力したい場合は、`{{ result.results.1.status }}`のように指定すればよい。
ただし、汎用性はない。

```yaml:http-get-playbook.yml
---
- hosts: all
  connection: local
  vars:
    - url_list:
        - "http://www.yahoo.co.jp"
        - "http://www.google.com"
  tasks:
    - name: http-get
      uri:
        url: "{{ item }}"
      with_items: "{{ url_list }}"
      register: result
      when:
        - '"google" in "{{ item }}"'

    - name: debug
      debug: msg='{{ result.results.1.status }}'
```
Kotlinで要素の出現回数のカウント

gropingBy + eachCountで実現。

```kotlin
listOf(1, 2, 3, 1, 1, 2).groupingBy { it }.eachCount()
=> {1=3, 2=2, 3=1}
```

eachCountのリファレンスが詳しい。
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/each-count.html
Container Bound Scriptをclaspで管理

## Container Bound Scriptとは?

[公式ページ](https://developers.google.com/apps-script/guides/bound)

> Google Apps Script のプロジェクトでスプレットシートに紐付くプロジェクト。
> Container Bound Scriptと逆のGoogleドライブ上に単独で存在するStandalone Scriptがある。

###  :computer:環境構築
****

1. Google Drive上でスプレットシート新規作成し、「ツール」>「スクリプトエディッタ」を選択します
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/299271/9052e0de-053f-e665-2b41-ba7731c09d8c.png)

2. スクリプトエディッタ上で「ファイル」>「保存」でプロジェクト名を設定し保存します

3. 手元でclaspを使って環境を構築します

    ```sh
    $ yarn add @google/clasp cpx gas-webpack-plugin tslint @types/google-apps-script @types/node ts-loader ts-node webpack webpack-cli --dev
    ```

4. claspでログインしてない場合はログインを行います

    ```sh
    $ ./node_modules/.bin/clasp login
    ```
    ブラウザが立ち上がるので対象のアカウントでログインを行います
    claspの初期設定等はここでは省略

5. `.clasp.json` の `scriptId` に作成したスクリプトのIDを設定します

### :pencil: 実装
****

#### 簡単なサンプル

簡単にできる「スプレットシート開いたらメニューを追加する」をやってみたいと思います。

```ts
declare var global: any;

global.onOpen = (): void => {
  SpreadsheetApp
    .getUi()
    .createMenu('Test')
    .addItem('ホゲホゲする', 'showDialog')
    .addToUi();
}

global.showDialog = (): void => {
  Browser.msgBox('メニューからダイアログ表示');
}
```
デプロイしてリロードするとメニューが表示されています。
![image2.png](https://qiita-image-store.s3.amazonaws.com/0/299271/b91060a4-c469-252a-6e57-e25ffba43352.png)


メニューをクリックするとダイアログが表示されます。
![image3.png](https://qiita-image-store.s3.amazonaws.com/0/299271/95925236-90d9-476a-0543-67784845ef0d.png)


#### 編集された時のEventの値をダンプ

```ts
global.onEdit = (e: any): void => {
  const range: GoogleAppsScript.Spreadsheet.Range = e.range;
  const authMode: GoogleAppsScript.Script.AuthMode = e.authMode;
  const oldValue: any = e.oldValue;
  const source: GoogleAppsScript.Spreadsheet.Spreadsheet = e.source;
  const triggerUid: number = e.triggerUid;
  const user: GoogleAppsScript.Base.User = e.user;
  const value: any = e.value;

  Logger.log(`range: ${range.getValue()}`);
  Logger.log(`authMode: ${authMode}`);
  Logger.log(`oldValue: ${oldValue}`);
  Logger.log(`source: ${source.getName()}`);
  Logger.log(`triggerUid: ${triggerUid}`);
  Logger.log(`user: ${user.getEmail()}`);
  Logger.log(`value: ${value}`);
}
```
スプレットシートのセルを編集してみた結果が以下です  :eyes:
![image4.png](https://qiita-image-store.s3.amazonaws.com/0/299271/b232d487-4353-35a5-e3f1-4e1fb33bec95.png)
↑なぜか triggerUidは取得出来ず。。

ひとまずclaspでContainer Bound Scriptを管理できるようになったので、
テスト等も書けて良い感じになりました :sparkles: 

###  :bomb: バッドノウハウ
****

- html-webpack-pluginで以下のエラーが発生

```
Child html-webpack-plugin for "index.html":
     1 asset
    Entrypoint undefined = index.html
```
意味のない警告なので無視していいらしいです。。
https://github.com/jantimon/html-webpack-plugin/issues/895#issuecomment-379006202

### :link: 参考リンク
****

- [Google Apps ScriptとclaspでBacklogの情報をGoogleスプレッドシートに取得しよう](https://nulab-inc.com/ja/blog/backlog/how-to-use-google-apps-script-and-clasp/)
- [Google Apps Scriptにおける「プロジェクト」の関係](https://qiita.com/sebisawa/items/4faa6d859f480e306f46)
- [ローカルにファイルダウンロード](http://googleappsscript.hatenablog.com/entry/2017/09/06/120000)
テーブル定義でスネークケースをやめたい

#スネークケースとは
テーブル定義では、スネークケース(\_区切り)で定義することが多い。
例えば、ユーザー情報を格納するマスタの例で説明する。
テーブル名：mst\_user

| 論理名 | 物理名 |
|:-:|:-:|
|ユーザーID|user_id|
|ユーザー名|user_name|

#アプリケーション開発との関連
アプリケーション開発言語はスネークケースではないことが多い。
例えば、javaの場合、パスカルケースとキャメルケースだったりする。

#何が問題か
javaを例にあげると、mst_userに対応するクラス(DTO)はJavaの規約(パスカルケース、キャメルケース)に従うと以下のようになる。

```java
public class MstUser {
    private String userId;
    private String userName;

    // getter,setterは省略
}

```

テーブルはスネークケースなのにjavaの規約が異なるためマッピングが必要となる。
これに付随する問題がいくつか発生する。

1. 仕様書作成時の負担が大きい
例）API仕様書作成時に間違える。
大抵は項目が多いのでテーブル定義から項目をコピーしてスネークケースをキャメルケースに置き換えていくことになるが間違えやすい。
user_id => userid => 間違えた！
特に、設計だけして開発を外部に依頼する場合、「userIdでは?」とQ&Aがきたりして時間の無駄。

2. 開発時にマッピングミスすると面倒
SQLがスネークケースのため、javaのクラスへのマッピングを記載する必要がある。
ORマッパーで自動生成できれば、結合(join)するような仕様だと地道にマッピングを書くことになるのでミスする可能性がある。値の取得結果がnullになる=>マッピングミスだったということが起こる。

3. スネークケースとキャメルケースの相互変換が面倒
1,2とも関連するが、そもそもマッピングをする際にスネークケース=>キャメルケース、キャメルケース=>スネークケースの変換をするのがかなりの手間になる。
ツールを作れば多少はマシになるかもしれないが、やっぱり手間である。

#スネークケースをやめて開発言語の規約に合わせる
javaの規約に従ってみる。

テーブル名：MstUser

| 論理名 | 物理名 |
|:-:|:-:|
|ユーザーID|userId|
|ユーザー名|userName|

DTO

```java
public class MstUser {
    private String userId;
    private String userName;

    // getter,setterは省略
}

```

これでマッピングの手間がなくなるので、効率よく設計、開発ができそう。
デメリットはあるだろうか？

[目次](https://qiita.com/csharpisthebest/items/57f27a33085f01211166)
VL のノードブラウザの見方

## VLとは
ビジュアルプログラミング言語 VL とは
https://qiita.com/yhy_jp/items/cc0265c8a76c461c0ea3

# ノードブラウザ(NodeBrowser)
VL 上で左ダブルクリックをすると出てくるものです。
色々アイコン化されているので説明します。
<img width="391" alt="browser.png" src="https://qiita-image-store.s3.amazonaws.com/0/59912/ac2ecd0b-7b42-baa7-30c5-532b4a6cd52f.png">

## 1）フィルタ
<img width="60" alt="スクリーンショット 2019-03-30 15.53.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/59912/e0781511-8521-047e-c4be-4384e8b155f0.png">
クリックするとフィルタを切り替えれます。
マウスオーバーで説明が出ますが、下のような意味です。
上：基本的なノード
下：きちんと理解して使う必要があったり、低レイヤ（C#そのままに近い）なノード
左：Obsolete（古い無くなる予定、使わない方がいい）なノード
左：将来的に追加されるノード

## 2)ノードの詳細
<img width="148" alt="スクリーンショット 2019-03-30 15.54.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/59912/4dacff51-5b27-3b8e-53e6-3b3015318911.png">
入力と出力をノードを置く前に確認できます。

## 3)一覧
<img width="62" alt="スクリーンショット 2019-03-30 15.53.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/59912/a5c16265-8448-4ec9-5f14-db8ade6126fc.png">：カテゴリ(Category)
<img width="77" alt="スクリーンショット 2019-03-30 15.53.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/59912/8fcbb1d6-3210-2074-2453-2265b7b4b32b.png">：IOBox
<img width="68" alt="スクリーンショット 2019-03-30 15.53.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/59912/62d09da1-9408-cc6a-9049-5db700ab8bac.png">：Input
<img width="81" alt="スクリーンショット 2019-03-30 15.53.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/59912/fed42ac9-78bc-a50a-d3c9-21e213cfd11e.png">：Output
<img width="61" alt="スクリーンショット 2019-03-30 15.53.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/59912/091fefd6-156b-ba40-39ea-c983e76912e4.png">：パッド(Pad)
<img width="56" alt="スクリーンショット 2019-03-30 15.54.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/59912/7550287e-7eaf-fb09-0a56-c9300f6e5268.png">：オペレーションノード(Operation Node)
<img width="194" alt="スクリーンショット 2019-03-30 15.54.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/59912/96135c70-9023-ae4a-8323-03f5cfb01414.png">：プロセスノード(Process Node)
<img width="94" alt="スクリーンショット 2019-03-30 15.54.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/59912/8c1c7b12-4196-5640-3ad5-918a6c07cdf4.png">：型定義(Type Definition)
<img width="145" alt="スクリーンショット 2019-03-30 16.00.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/59912/98d8a0b4-907d-9e0a-3d9d-8a7b142ce99e.png">：Nuget

## 4)今の階層
<img width="243" alt="スクリーンショット 2019-03-30 15.54.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/59912/5386fd4d-c940-b6a7-d088-e7355bb47003.png">
今潜っている階層です。
「X」を押す、もしくはESCキーで上の階層を戻れます。
サイボウズ公認 kintone エバンジェリストの情報発信源を集めるメモ

# 更新情報

2019-11-14
kintoneエバンジェリストが本当の意味で正式に[^1]サイボウズ公認となりました。
それに対応して、[kintoneエバンジェリストの公式ホームページ](https://www.kintone-eva.com/)が公開されました。

* https://www.kintone-eva.com/

[^1]: 2019-11-6に開催された[kintone EvaCamp]にて、これまでは非公認だったことが明かされました。

# はじめに

サイボウズ公認 kintoneエバンジェリスト の方々のエバンジェリスト活動の情報発信源をリストアップするメモです。
思い立ってから下書きで寝かしてたのですが、この記事がきっかけ[^1]でとりあえず公開してみます。
[^1]: きっかけとなったこの記事の[ツイート](https://twitter.com/ayatokura/status/1111287434665320449)と[その記事](https://l-w-i.net/l/evangelist.txt)。

ここにまとめて行って、活動の参考にしたい。
リストは公開されている名前又はハンドル名、主な情報発信サイト。

まずは面識がある、kintoneエバンジェリストの方々から。

2019.03.30 現在　kintoneエバンジェリストは 19人。
[「kintoneエバンジェリスト支援プログラム」](https://speakerdeck.com/kintonepapers/kintone-evangelist-program)

#kintoneエバンジェリストのリスト
順不同。お会いした（お見かけした、あるいは勝手にツイッターフォローした）順です。

| 名前             |  情報発信サイト      | ノート               | 状況 |
|:----------------:|:------------------:|:------------------:|:------------------:|
| 金春さん（こんぱるさん） | https://blog.r3it.com/@r3_konparu | アールスリーインスティテュートの金春さん | 引き続き！ |
| 長井さん | https://twitter.com/akvabit | アクアビットの長井さん |  引き続き！  |
| 斎藤 栄さん       | https://twitter.com/saito_sakae | kintone Caféの生みの親、ラジカルブリッジの斎藤栄さん |  引き続き！  |
| 新妻 正夫さん（あるじさん） | https://twitter.com/Masao_Niizuma | コワーキングスペース [Hanare ひばりヶ丘](https://www.facebook.com/HanareHibari/)のあるじさん。色々やっていて何者でしょう？ |  引き続き！  |
| 松村稔さん  |https://twitter.com/kai0707|上海のソフト会社を経営|  2019ご卒業  |
| Hisaki Akazaさん |https://twitter.com/the_red315|株式会社ソニックガーデン所属。業務ハッカー|  2019ご卒業  |
| 星野さん |https://twitter.com/nohhoshi|株式会社ジョイゾー所属|  引き続き！  |
| 門屋 亮さん|https://twitter.com/ryokdy|クローバ株式会社代表取締役|  ご卒業  |
| 細谷崇さん |https://twitter.com/tkc49|フリーランスプログラマー|  引き続き！  |
| 久米さん |https://twitter.com/yumekajun|kintone Café 福岡やってる人|  引き続き！  |

# 参考リンク

* [kintone Evangelist の情報発信先まとめ](https://qiita.com/potara/items/a256c939313ab9efc975)
pandas DataFrameの複数条件によるデータ抽出のメモ


# 結論。Pandasではこちらを使いましょう。

- 論理演算は、`or`,`and`ではなく、`|`、`&`を使うべし。

|論理|DataFrameでの記号||
|--:|:---:|:--|
|or| ｜ |  |
|and|&||
|not|~||


# or、andなどを使った場合のエラー

```python:誤り
df3.loc[(df3["品目"] == "パッケージ") or (df3["品目"] == "ﾊﾟｯｹｰｼﾞ")]
```
>ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().  

# 使用例

## 行抽出
```python:論理演算子を使って複数条件によって抽出する。
# 品目列が　”パッケージ”か”ﾊﾟｯｹｰｼﾞ”のいづれかの行
df3.loc[(df3["品目"] == "パッケージ") | (df3["品目"] == "ﾊﾟｯｹｰｼﾞ")]

# 品目列が "Data_not_found"という文字列 ではない行
df3.loc[~(df_out["品目"] == "Data_not_found")]
```


## 行・列抽出

```python:行と列同時に抽出する

# 品目列が "袋"でも"箱"でも ない 行の "単価"列を抽出する。
df_out.loc[~((df_out["品目"] == "袋") | (df_out["品目"] == "箱"))]["単価"]
```

# 補足追記 => 括弧忘れがち注意！！！
各条件は括弧で囲わないとエラーになる。

>SyntaxError: invalid syntax


# 参考にさせていただきました。

詳細は下記に詳しく紹介されています。


>https://note.nkmk.me/python-pandas-multiple-conditions/  


  
  
  


>https://stackoverflow.com/questions/36921951/truth-value-of-a-series-is-ambiguous-use-a-empty-a-bool-a-item-a-any-o
Reactと他のライブラリとのインテグレーション


参考：[他のライブラリとのインテグレーション](https://ja.reactjs.org/docs/integrating-with-other-libraries.html)

公式サイトではjQueryプラグイン(Chosen)のラッパーのサンプルコードが掲載されていますが
実際に要素を追加したときの動きの違いを確認しました。

`componentDidUpdate`にあるChosenライブライのtriggerを呼び出さないと、
Reactがstateの変化を検知してrenderを実行してもChosenが生成するドロップダウンのリストには反映されません。

```App.js
import React, { Component } from "react";
import "./App.css";
import $ from "jquery";
import "chosen-js/chosen.css";
import "chosen-js/chosen.jquery.js";

class Chosen extends React.Component {
  componentDidMount() {
    this.$el = $(this.el);
    this.$el.chosen();

    this.handleChange = this.handleChange.bind(this);
    this.$el.on("change", this.handleChange);
  }

  componentDidUpdate(prevProps) {
    if (prevProps.children !== this.props.children) {
      this.$el.trigger("chosen:updated"); //ここをコメントアウトすると・・・
    }
  }

  componentWillUnmount() {
    this.$el.off("change", this.handleChange);
    this.$el.chosen("destroy");
  }

  handleChange(e) {
    this.props.onChange(e.target.value);
  }

  render() {
    return (
      <div>
        <select className="Chosen-select" ref={el => (this.el = el)}>
          {this.props.children}
        </select>
      </div>
    );
  }
}

class App extends Component {
  constructor(prpps) {
    super(prpps);

    this.state = {
      items: ["one", "two", "three"]
    };
  }

  handleAddList = () => {
    this.setState({ items: this.state.items.concat(["four"]) });
  };

  render() {
    return (
      <div className="App">
        <button onClick={this.handleAddList}>追加</button>

        {/* Reactの守備範囲外 */}
        <Chosen onChange={value => console.log(value)}>
          {this.state.items.map(item => (
            <option key={}>{item}</option>
          ))}
        </Chosen>
        
        {/* Reactの守備範囲 */}
        <select>
          {this.state.items.map(item => (
            <option key={item}>{item}</option>
          ))}
        </select>
      </div>
    );
  }
}

export default App;
```

`componentDidUpdate`をコメントアウトした場合、追加ボタンによって新たな要素が追加され
DOMには４つめの要素が生成されますが、Chosenが生成しているSelectには表示されません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/319315/fe0e8a68-019c-230b-0668-f384633e40d5.png)

もちろん、普通の<select>を利用しているリストには追加した要素が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/319315/94187ba7-d9a3-c10b-72ae-f646f6af2761.png)


基本的にはReactのComponentとして提供されているライブラリを利用する方がよいですが、
必要に迫られた場合には、やれないことはないということですね。
React.jsの環境構築

こんにちは[@yukifreeworld12](https://twitter.com/yukifreeworld12)です。

Reactの環境構築は10〜15分あれば出来るので思ったより簡単でした。
##node.jsのインストール
公式サイト　[node.js](https://nodejs.org/ja/)
注　Homebrewがインストールされている程で進めていきます。
`brew install node`
バージョンの切り替えツールのインストール
`npm install -g n`
バージョンのインストール
`n 8.12.0`
　　　↑
ここで`Error: sudo required`というエラーが出た場合
`sudo mkdir /usr/local/n`でディレクトリを作り再びTRY!
自分の場合正しいのか少し不安ですが`sudo n 8.12.0`で進めてしまいましたがそれでも出来ました。

ディレクトリにroot権限を与える
`sudo chown -R $(whoami) /usr/local/n`
インストールとバージョン確認
`n 8.12.0`
`node -v`

##JSのパッケージマネージャyarnのインストール
`brew install yarn --without-node`
ここで`Error: invalid option: --without-node`というエラーが出た場合
`brew install yarn --ignore-dependencies`としてTRY!
インストールの確認
`yarn --vesion`
バージョンが確認できればOKです。
##webpack4インストール
webpackとライブラリなどのインストール
`yarn add --dev webpack webpack-cli`

これでReact.jsの開発環境が整いました。

##最後に
今日も見てくれてホンマありがとな!!
記事がええなと思ったらフォローといいねホンマよろしくな!!
(ジョーブログ風に)
Raspberry Piで、hostapd 2.6 を野良ビルド



#hostapdを入手

```
$ git clone git://w1.fi/hostap.git
$ cd hostap
$ git checkout hostap_2_6 
```

#パッチを入手 (Dirの場所は適宜読み替えて)

```
$ cd ..
$ git clone https://github.com/pritambaral/hostapd-rtl871xdrv.git
```

#パッチを当てる (Dirの場所は適宜読み替えて)

```
$ cd hostap/hostapd
$ patch -Np1 ../../hostapd-rtl871xdrv/rtlxdrv.patch
$ echo CONFIG_DRIVER_RTW=y >> hostapd/.config
```

#ビルド準備 (これをあらかじめしていないと、ビルドエラーがでる)

```
$ sudo apt-get install libnl-dev libssl-dev
```

##ビルドエラーの例

```
../src/drivers/driver_nl80211.c:17:31: fatal error: netlink/genl/genl.h: No such file or directory
 #include <netlink/genl/genl.h>
                               ^
compilation terminated.
Makefile:1036: recipe for target '../src/drivers/driver_nl80211.o' failed
make: *** [../src/drivers/driver_nl80211.o] Error 1
```

```
../src/crypto/tls_openssl.c:19:25: fatal error: openssl/ssl.h: No such file or directory
 #include <openssl/ssl.h>
                         ^
compilation terminated.
Makefile:1036: recipe for target '../src/crypto/tls_openssl.o' failed
make: *** [../src/crypto/tls_openssl.o] Error 1
```

#終了後、バイナリをsbinへコピー

```
$ sudo cp hostapd /usr/sbin
$ sudo cp hostapd_cli /usr/sbin
```
Raspberry PI 3 Model B をNordic SoftDevice UART BLE ペリフェラル として動作させる


cf: https://qiita.com/uzuki_aoba/items/346e28b6e9170ce85a6c

## 前提
- nodeenv
- Ubuntu 16.04

## 色々入れる

https://github.com/noble/bleno#ubuntudebianraspbian

```
sudo apt install bluetooth bluez libbluetooth-dev libudev-dev
```

なんやかんやで完成
https://gist.github.com/katsusuke/a1a9ae11c62e7321e155df5f093bd1d1

```
npm install
sudo ~/.nodenv/shims/node main.js
```

Central 側は nRF Toolbox
https://itunes.apple.com/jp/app/nrf-toolbox/id820906058?mt=8
配列を繰り返し処理する際にindexが欲しい場合【each.with_index】

#はじめに
本項ではeach.with_indexについて解説

#概要
要素にインデックスを添えて繰り返すメソッド。
要素自体に順番を示すインデックスを属性として設定していないが、処理として要素の順番を示したい場合に使用する。


#使用方法
```ruby:参考例.rb
Objs.each.with_index(offset){|obj,index| 〜繰り返す処理〜 }

# Objs => 繰り返す対象の配列。
# offset => 開始するインデックス番号。
# obj => 繰り返し処理中の要素の変数名。
# index =>　繰り返し処理中のインデックスの変数名。
```
**備考**
- offsetを与えない場合、indexは0から始まります。


#使用例（offsetなし）
```ruby:使用例(offsetなし).rb
animals = ["cat","dog","mouse"]

animals.each.with_index {|animal,i|
  puts "#{i}番目は#{animal}です。"
}
```
出力結果は以下

```出力結果
0番目はcatです
1番目はdogです
2番目はmouseです
```
#使用例（offsetあり）
人間の感覚で0から始まると気持ちが悪いのでoffsetに１を与えると良いと思います。

```ruby:使用例(offsetあり).rb
animals = ["cat","dog","mouse"]

animals.each.with_index(1) {|animal,i|
  puts "#{i}番目は#{animal}です。"
}
```
出力結果は以下

```
1番目はcatです
2番目はdogです
3番目はmouseです
```

#参考記事
[class Enumerator (Ruby 2.6.0)](https://docs.ruby-lang.org/ja/latest/class/Enumerator.html#I_WITH_INDEX)

※修正(2018/3/31)
~~[each_with_index (Enumerable) - Rubyリファレンス](https://ref.xaio.jp/ruby/classes/enumerable/each_with_index)~~
上記のリンクはeach_with_indexのものでした。失礼しました。ご指摘ありがとうございます。
またご指摘いただいたscivolaさんの両メソッドの解説がわかりやすい為、引用させていただきます。

>(前略)each.with_index と each_with_index は見た目は似ていますが，別物なんですよね。
each_with_index は Enumerable モジュールのメソッドです。オフセットを与えることはできません。
一方，each.with_index のほうは，ブロック無しの each が Enumerator オブジェクトを返し，それの with_index メソッドを呼んでいます。
Enumerator はちょっと抽象的で分かりにくいものですが，それの理解が鍵ですね。




内容のみならず、レイアウトや書き方にアドバイスがある方はお気軽に（優しく）コメントを頂けると助かります。
任意の数の引数を取れる関数のデータ型を考えてたらモナドになった

func1とfunc2を同じ型にしたい。

```haskell
func1 :: r -> a
func2 :: r -> r -> a
```

リストで引数渡したら実行できるといいな。
引数が足りなかったらエラーにでもしようかな。

```haskell
data ManyArgsFunc r a = ????
run :: ManyArgsFunc r a -> [r] -> a
```

Haskellといえば再帰

```haskell
data ManyArgsFunc r a = Pure a | Func (r -> ManyArgsFunc r a)
```

func1とfunc2を変換できるか確認
あと実行関数が思い通りになるか

```haskell
toManyArgsFunc1 :: (r -> a) -> ManyArgsFunc r a
toManyArgsFunc1 func1 = Func $ \r -> Pure (func1 r)

toManyArgsFunc2 :: (r -> r -> a) -> ManyArgsFunc r a
toManyArgsFunc2 func2 = Func $ \r1 -> 
                        Func $ \r2 -> Pure (func2 r1 r2)

-- リストの引数が関数に順番に渡って、Pureまでくれば値を返す。
-- 途中で引数がなくなったらエラー
run :: ManyArgsFunc r a -> [r] -> a
run (Pure a) _ = a
run (Func f) (r:rs) = run (f r) rs
```

うまくいった。:relaxed:
ここで思った。
これ、[Freeモナド](https://www.stackage.org/package/free)に似てるのでモナドになるのでは。

```haskell
instance Functor (ManyArgsFunc r) where
  fmap f (Pure a) = Pure (f a)
  fmap f (Func g) = Func $ \r -> fmap f (g r)

instance Applicative (ManyArgsFunc r) where
  pure a = Pure a
  (Pure f) <*> x = fmap f x
  (Func g) <*> x = Func $ \r -> (g r) <*> x

instance Monad (ManyArgsFunc r) where
  return a = Pure a
  (Pure a) >>= f = f a
  (Func g) >>= f = Func $ \r -> (g r) >>= f
```

やったーモナドになったー

挙動としてはこんなかんじ

```haskell
func1 :: ManyArgsFunc Int String
func1 = Func $ \i -> Func $ \j -> Pure $ show (i + j)

trace :: (Show r , Show a) => ManyArgsFunc r a -> [r] -> String
trace (Pure a) _ = "Pure " ++ show a
trace (Func f) (r:rs) = "Func $ " ++ show r ++ " -> " ++ trace (f r) rs

action :: ManyArgsFunc Int (String,String)
action = do
  a <- func1
  b <- func1
  return (a,b)

>>> run action [1..]
("3","7")

>>> trace action [1..]
Func $ 1 -> Func $ 2 -> Func $ 3 -> Func $ 4 -> Pure ("3","7")
```

なにか役に立つ使い方が思いつけばまた記事にします。

もし、すでにこれと同じ構造のモナドのパッケージがあれば教えてください
ログインシェルにPowerShell Coreを使う

## 本題

PowerShellをもっと使っていこう、ということでMacのターミナルでもPowerShell Coreをログインシェルにした。するだけなら簡単で、`/etc/shells`にパスを足して、`chsh`で終わり。それ以前の、MacにPowerShellを入れるには、`homebrew`で一発なので省略。

```Shell
echo '/usr/local/bin/pwsh' | sudo tee -a /etc/shells
chsh -s /usr/local/bin/pwsh
```

## おまけ

この後、ターミナルで新しいタブなりウインドウを開くと最初からPowerShellになっている。なっているが、`$env:PATH`の中身が変だ。

```Shell
/usr/local/microsoft/powershell/6:/usr/bin:/bin
```

少なくとも、`/usr/local/bin`は入ってないとおかしい。zshやbashの時に自分で`.profile`に足したわけでもないので、どこかに初期値がないとおかしい。[あった](http://from2015-6-7.hateblo.jp/entry/20170228/1488287387)。

`path_helper`を自分の環境で実行してみるとこうなった。

```PowerShell
PS> /usr/libexec/path_helper
PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/share/dotnet:/opt/X11/bin:/usr/local/microsoft/powershell/6"; export PATH;
```

この順番のまま`$env:PATH`を上書きしてもいいけど、PowerShellのだけ前に来て欲しいので、ちょっとこねこねしたものを$Profileに足すことにする。

```
$env:PATH = ($env:PATH.Split(":")[0], (((/usr/libexec/path_helper) -split '"')[1] -replace $env:PATH.Split(":")[0])) -join ":"
```

こうしておくと、bashの時のPATHの一番前に`/usr/local/microsoft/powershell/6`が追加されて良い感じになる。

### 追記

2020/3/22に環境構築してみると、$env:PATHが特に手を加えるまでもなくこうなっててほしい、という状態になってたので、おそらくおまけの内容については、今の環境では必要ないと思われる。
重回帰分析のRSSとTSSとESS(と決定係数)

#1. 要約
 今回は重回帰分析の決定係数，TSS，RSS，ESSについて解説しました．余談ですが，友人に「機械学習タグで重回帰分析って(笑)」みたいなこと言われちゃいました．
#2. TSS，RSS，ESSってなに？
　重回帰分析のモデル式は$$y = X\beta +e$$であり，係数$\beta$の最小二乗推定量および従属変数の予測ベクトルはそれぞれ，$$\widehat{\beta}=(X^TX)^{-1}X^Ty$$$$\widehat{y}=X\widehat{\beta}=X(X^TX)^{-1}X^Ty$$で定義されます．ここで$H:=X(X^TX)^{-1}X^T$は射影行列であり，以下の性質を満たします．

1. $H^T = H\ (\mbox{対称性})$
2. $H^2=H\ (\mbox{冪等性})$

従属変数ベクトル$y$とその予測ベクトル$\widehat{y}$と平均ベクトル$$\bar{y}=\frac{1}{N}\sum_{i=1}^Ny_i1_n=Wy$$を用いて総変動(Total Sum of Squares, TSS)，残差変動(Residuals Sum of Squares, RSS)，回帰変動(Explained Sum of SquaresESS)を定義します．ここで$W$は$W \in R^{N\times N}$で各要素が$1/N$であるような行列を表しています．総変動は

```math
\begin{eqnarray}
TSS = \sum_{i=1}^N(y_i-\bar{y}_i)^2=||y-\bar{y}||^2
\end{eqnarray}
```
で定義される量で，標本平均からのずれを表しています．回帰変動は

```math
\begin{eqnarray}
ESS = \sum_{i=1}^N(\widehat{y}_i - \bar{y}_i)^2=||\widehat{y}-\bar{y}||^2
\end{eqnarray}
```

で定義される量で，予測値と標本平均のずれを表しています．最後に残差変動は

```math
\begin{eqnarray}
RSS = \sum_{i=1}^N(y_i-\widehat{y}_i)^2=||y-\widehat{y}||^2
\end{eqnarray}
```
で定義される量で，観測データと予測のずれを表しています．これらの量には$$TSS=ESS+RSS$$という関係があり，それを利用して決定係数も定義されます．
~証明~
TSSの式に$-\widehat{y}_i$を挟み込むと

```math
\begin{eqnarray}
\sum_{i=1}^N(y_i-\bar{y}_i)^2 &=& \sum_{i=1}^N(y_i-\widehat{y}_i+\widehat{y}_i-\bar{y}_i)^2\\
&=& \sum_{i=1}^N(y_i-\widehat{y}_i)^2+\sum_{i=1}^N(\widehat{y}_i-\bar{y}_i)^2+2\sum_{i=1}^N(y_i-\widehat{y}_i)(\widehat{y}_i-\bar{y}_i)\\
&=& RSS+ESS+2\sum_{i=1}^N(y_i-\widehat{y}_i)(\widehat{y}_i-\bar{y}_i)
\end{eqnarray}
```
となるが，第3項は

```math
\begin{eqnarray}
\sum_{i=1}^N(y_i-\widehat{y}_i)(\widehat{y}_i-\bar{y}_i) &=& \sum_{i=1}^N
e_i(\widehat{y}_i-\bar{y}_i)\\
&=& \sum_{i=1}^Ne_i\widehat{y}_i-\bar{y}\sum_{i=1}^Ne_i\\
&=& e^T\widehat{y} - \bar{y}*0\\
&=& e^TX\widehat{\beta}\\
&=& [\sum_{i=1}^Ne_ix_{i1},\cdots,\sum_{i=1}^Ne_ix_{ip}]\widehat{\beta}\\
&=& n[s_{ex_1},s_{ex_2},\cdots,s_{ex_p}]\widehat{\beta}\\
&=& n*0_p^T\widehat{\beta}=0
\end{eqnarray}
```
となることから，$$TSS=ESS+RSS$$と分割されることがわかった．なお途中で残差ベクトル$e$とデータ$x_{.j}(j=1,\cdots,p)$の共分散を要素とするベクトルが$s_{ex}=0_p$であることを利用した．
#3. 決定係数
　決定係数$R^2$は$$TSS = ESS + RSS$$と総変動が回帰変動と残差変動に直和分解されることを利用して，

```math
\begin{eqnarray}
R^2 = \frac{ESS}{TSS} = 1-\frac{RSS}{TSS}
\end{eqnarray}
```
で定義される量で，総変動のうち推定されたモデルでどの程度説明されているか(=一つ目の等式)を表しており，重回帰分析におけるモデル選択の一つの指標として利用されています．他に利用されるモデル選択の指標としてはAIC(Akaike Information Criterion)やBIC(Bayesian Information Criterion)などがあります．これらはモデルの対数尤度とパラメータ数によって定まる量です．勉強して次回以降の記事にまとめます．
# おまけ
　後ほど更新します．
# 参考文献
[Hastie, Tibshirani, Friedman(2009). _The elements of statistical learning_](https://www.springer.com/jp/book/9780387848570)
[稲垣「数理統計学」](https://www.amazon.co.jp/数理統計学-数学シリーズ-稲垣-宣生/dp/4785314117)
Django入門01（設定編）

以下を参考に進めながら引っかかったところを追記する

[Qiita:Django入門にはDjango Girls Tutorialがおすすめ](https://qiita.com/takechanman1228/items/d711e175b32f833c5e9c)
> Djangoのチュートリアルをいろいろ探してみた結果、「Django Girls Tutorial」がとても良心的に感じました。Web開発の経験がない人でも一人で進められるのではと思うほどの丁寧さでした。

[Django Girls Tutorial](https://djangogirlsjapan.gitbook.io/workshop_tutorialjp)


# 環境作成

Anacondaを使うのであれば
`Environments -> Create`
で環境作成して、必要なものをpipでインストールすれば良い。

以降ターミナル（というかコマンドプロンプト）を起動する際は、Djangoの環境の「▶」から
`open terminal`
をクリックすればターミナルが開く。

# DB設定

migrateでテーブル作成されるので、アプリ用のユーザーを作成し、アプリが使うスキーマに対して権限を与え、参照するだけのスキーマにはselect権限のみ付与する。

MySQL Workbenchを使う場合は
`Navigator（左サイドバー）-> Users and Privileges`
でユーザー作成画面を開き、
`add account`
でユーザー作成。
`Schema Privileges`
から権限設定。

# settings

Djangoのプロジェクトを作成後、MySQLを利用する為にsettings.pyを編集する。

まずデフォルトは以下のようにsqlite3を使う設定になっている。

```
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
```

これを以下のように修正する。

```
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '(接続するスキーマ名)',
        'USER': '(接続するユーザー名)',
        'PASSWORD': '(接続するユーザーのパスワード',
        'HOST': '(DBのホスト。IPアドレスかドメイン)',
        'PORT': '',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
        }
    }
}
```

# MySQL clientの設定

そのまま
`python manage.py migrate`
を実行すると

```
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
```
のエラーが出てしまう。

MySQL clientが必要なので
`pip install PyMySQL`
でPyMySQLをインストールする。
さらにmanage.pyに以下を追記することでMySQLdb moduleを有効化する。

```
import pymysql
pymysql.install_as_MySQLdb()
```
VuejsのGUIジェネレーターが欲しかったので作っている話



更新をした: [VuejsのGUIジェネレーターを改良した話](https://qiita.com/sterashima78/items/5670ecd3de57c3375304)

# はじめに

タイトルの通り作っているものがあるが、公開することで既にこれできるよみたいな情報も得られると思ったので公開しようと思った。

本当はもう少し作りこんでから公開したかった。
ただ、残業が多すぎてアプリケーションが作れないから転職しようとしていて、エージェントから公開しているGitHubとかQiitaのアカウントありますかと聞かれたからROM専から卒業しようと思った。

リポジトリ: [GitHub](https://github.com/sterashima78/vue-webpage-builder)

# とりあえず動くもの

https://sterashima78.github.io/vue-webpage-builder

# とりあえず動いている絵

![img.gif](https://qiita-image-store.s3.amazonaws.com/0/358387/53f2aa9d-4ce7-c064-0df2-7fd9a7c81e1b.gif)

# 作っている動機

基本的には [README](https://github.com/sterashima78/vue-webpage-builder/blob/master/README.md)に書いておいたが、書きなぐりました感が強いのでもう少し丁寧に書く。

## 似ていたもの

既存のもので十分な人もいると思うので、作る前に調べていた時に触ったものを書いておく。

- [Vuegg](https://github.com/vuegg/vuegg)
    - いいツールだったのだが、次に書く私のほしかったものには合わなかった 
- [Grapes](https://github.com/artf/grapesjs)
    - 初めはこれのプラグインを作ろうとしたのだが、無理やり感が出てきて断念した

## ほしかったもの

- 実用的なソースが出力される
    - プロトタイピングに使ったあとで、じゃあこれで行こうとなった時に全部書き直すよりも一部直せば済むほうが嬉しい
    - Vueggはコンポーネントの配置が絶対座標だった。絵を作るのには適していたのだけど、出力をそのまま使う気にはならなかった
- 任意のコンポーネントを利用できる
    - [Vuetify](https://vuetifyjs.com)や、[Element](https://element.eleme.io)などたくさんコンポーネントフレームワークがあるので、任意のものが使えてほしい
    - 自分が作ったコンポーネントも利用できるようになっていてほしい
    - Vueggは単一のコンポーネントフレームワークしか利用できなかった ([Issueにもなっている](https://github.com/vuegg/vuegg/issues/11))

# どうするか

任意のコンポーネントを利用するという点はアプリケーションを構築に利用しているVueインスタンスと、アプリケーション内で構築されるプロトタイプで利用するVueインスタンスが同一であると絶対に解決できないと考えた。

初めはインスタンスを複数作って [Shadow DOM](https://developer.mozilla.org/ja/docs/Web/Web_Components/Using_shadow_DOM)を使えば何とかなるとも考えたけど素直に[iframe](https://developer.mozilla.org/ja/docs/Web/HTML/Element/iframe)を使うことにした。

1. iframe要素内でscriptタグでvuejsを読み込み、アプリケーションからiframe内のVueインスタンスを参照する
2. メインのアプリケーション部分で[vnode](https://jp.vuejs.org/v2/guide/render-function.html#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E8%A9%B3%E8%A7%A3)に相当するツリーを構築する
3. iframe内のvueに渡して [renderメソッド](https://jp.vuejs.org/v2/guide/render-function.html) で描画

これができれば、iframe内で任意のスクリプトを読ませる機能を作ることで、『ほしかったもの』に書いた、任意のコンポーネントが利用できるの要件を満たせる。

# 面倒だったこと

## Vuex Store は複数のインスタンスで共有できない

アプリケーションで構築するvnodeデータを[Vuex](https://vuex.vuejs.org)で管理して、そのデータをiframe内のvueでも共有して renderでstateを参照できれば一番シンプルだと考えて、Vuexベースで作ってた。(入門したてのTypeScriptでstoreに型つけるにはどうすればいいんだとか調べてまぁまぁ時間かかった)。
いざ描画しようと思ったら、できないということを知って困った困った。

結局 [Rx](https://github.com/ReactiveX/rxjs) を併用して無理やりやっている感がある。

## Vueに登録されている全コンポーネントが知りたい

アプリケーションの性質的に利用できるコンポーネントがリストされていて、選択できないといけないが、それを取得するためのインターフェースが見つからなかった。

[devtools](https://github.com/vuejs/vue-devtools)とか見ていたら方法がありそうだったので調べたら、`Vue.options.components` に入っていた。

# おわりに

Vuejsでのプロトタイピングを簡単にできるアプリを作っているという話でした。
もしも、上に書いた『ほしかったもの』をカバーするサービスやアプリケーションがあれば教えていただけると嬉しいです。

以下が、今後やりたいこと。

- 追加したい機能
    - 任意のコンポーネントフレームワークを使えるようにする (いまはvuetifyのみだけど仕組み的には可能なのですぐやりたい)
    - 複数ページへの対応 (vue-routerで)
    - 作成途中の保存・読み込み
- 機能以外で対応したいこと
    - リファクタリング
    - CI・CDの導入
        - ある程度機能がそろったら
- 残業が減ってアプリケーションを作れるようになる