OmniAICreator/Qiita-1.07M huggingface dataset:
Google Chrome 78 で「https」と「www」を表示する方法

# 結論

### Google Suspicious Site Reporter をインストールする

https://chrome.google.com/webstore/detail/suspicious-site-reporter/jknemblkbdhdcpllfgbfekkdciegfboi

Google公式が提供しているものなので、怖がらなくていいですよ。
これをインストールした瞬間から、何も設定いらず「https」と「www」が表示されます。

## 以下、どうでもいいぼやき

Chromeの以前のバージョンでは、
`Omnibox UI Hide Steady-State URL Scheme and Trivial Subdomains` を `Disabled(無効)` にすれば、
「https」と「www」を表示することができました。
具体的には、以下のURLにアクセスし、当該の設定を変更すればよかったんですね。

```
chrome://flags/#omnibox-ui-hide-steady-state-url-scheme-and-subdomains
```

ですが、2019年11月現在の最新バージョンであるChrome 78には、上の項目がありません。
それで、ネットで解決策を調べたところ、上の方法を見つけた次第。

https://www.reddit.com/r/chrome/comments/cz0hcv/chrome_78_dev_hide_www_again/

以上。
スニペットアプリDashの引き継ぎ方法まとめ

みなさんこんにちはSimanecoです。

新しいMacに新調したのですが、スニペットアプリDashの引き継ぎ方法が調べてもあんまり出てこなかったので、こちらにまとめて置きたいと思います。

1. まずはいつも通りこちらからダウンロードをして、アプリケーションフォルダに入れます。
https://kapeli.com/dash

2. 次に前のMacにあるDashのpreferencesから General > Set Up Syncing... を選択


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531055/d42051b3-743e-84eb-590e-dbe7dd9b45ab.png)

以下のように全てのチェックボックスをチェック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531055/535bb639-c187-2101-d269-3591d0deec93.png)
3. この中のSet Sync Folder...からDropbox or iCloudで管理しているファルダを「Dash」と名前をつけて作成、選択して、Set Sync Folder を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531055/990546a4-0fc9-e26a-51cc-99c86d8b4f65.png)
4. 同様に新しいMacでもSet Sync Folderで同じフォルダを選択。


これで前の情報が全て引き継がれることになります！

それでは良いMacライフを
組み合わせ アルゴリズム nCk C#

```
using System;
using System.Collections.Generic;

public class Combination
{
	public static void Main(string[] args)
	{
		new Combination();
	}

	private Combination()
	{
		string[] data = new string[] { "A", "B", "C", "D", "E", "F" };
		int k = 3;
		List<string[]> combList = GetCombination(data, k);
		WriteComb(combList);
	}

	private List<string[]> GetCombination(string[] data, int k)
	{
		int dataIndex = 0;
		string[] combs = new string[k];
		int combsIndex = 0;
		List<string[]> combList = new List<string[]>();
		Comb(data, dataIndex, combs, combsIndex, combList);
		return combList;
	}

	private void Comb(string[] data, int dataIndex, string[] combs, int combsIndex, List<string[]> combList)
	{
		if (combsIndex == combs.Length) {
			string[] copy = new string[combs.Length];
			Array.Copy(combs, copy, combs.Length);
			combList.Add(copy);
			return;
		}

		int endDataIndex = data.Length - combs.Length + combsIndex;
		for (int i = dataIndex; i <= endDataIndex; i++) {
			combs[combsIndex] = data[i];
			Comb(data, i + 1, combs, combsIndex + 1, combList);
		}
	}

	private void WriteComb(List<string[]> combList)
	{
		int n = 1;
		foreach (string[] combs in combList) {
			Console.WriteLine(string.Format("{0}: {1}", n, string.Join(",", combs)));
			n++;
		}
	}
}


```
pythonでフラクタル図形を作成part1(シェルピンスキーのギャスケット）

#1.フラクタル図形とは
フラクタル図形とは,どんなに拡大しても元々の図形と同じであるもの.
フラクタル図形の代表的なものであるシェルピンスキーのギャスケットを以下に示す.
![fractal1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529151/cccd4ac5-d7a2-0492-c6dd-3f0cc30b4945.gif)

#2.シェルピンスキーのギャスケットの作成

```Python:fractal.py
import matplotlib.pyplot as plt
import matplotlib.patches as pat
import math

#triangle = [(x1,y1),(x2,y2),(x3,y3)]

#入力triangle内にある三角形の座標を出力する
def return_triangle(triangle):
    x1 = (triangle[0][0] + triangle[1][0])/2
    y1 = (triangle[0][1] + triangle[1][1])/2
    x2 = (triangle[1][0] + triangle[2][0])/2
    y2 = (triangle[1][1] + triangle[2][1])/2
    x3 = (triangle[2][0] + triangle[0][0])/2
    y3 = (triangle[2][1] + triangle[0][1])/2
    new_triangle = [(x1,y1),(x2,y2),(x3,y3)]
    return new_triangle

#2点間の距離を出力する
def distance(p1,p2):
    return math.sqrt((p1[0]-p2[0])**2 + (p1[1]-p2[1])**2)

#点pとtriangleの内の点で点pに最も近い２点から構成される三角形を出力
def select_neighbor_points(p, triangle):
    distance1 = distance(p, triangle[0])
    distance2 = distance(p, triangle[1])
    distance3 = distance(p, triangle[2])
    if distance1 > distance2:
        if distance1 > distance3:
            return [p, triangle[1], triangle[2]]
        else:
            return [p, triangle[0], triangle[1]]
    else:
        if distance2 > distance3:
            return(p, triangle[0],triangle[2])
        else:
            return(p, triangle[0],triangle[1])
            
#fractal図形を生成する。iteration数が大きいほど複雑になる
def produce_fractal1(triangle, iteration):
    if iteration == 0: return 0
    p1 = triangle[0]
    p2 = triangle[1]
    p3 = triangle[2]
    new_triangle = return_triangle(triangle)
    p = pat.Polygon(xy = new_triangle,fc = "white", ec = "black")
    ax.add_patch(p)
    produce_fractal1(select_neighbor_points(p1,new_triangle), iteration-1)
    produce_fractal1(select_neighbor_points(p2,new_triangle), iteration-1)
    produce_fractal1(select_neighbor_points(p3,new_triangle), iteration-1)

triangle = [(0.2, 0.2), (0.8, 0.2), (0.5, 0.8)]　#初期三角形の座標
fig = plt.figure(figsize=(5, 5))
ax = fig.add_subplot(1,1,1)
p = pat.Polygon(xy = triangle,fc = "white", ec = "black")
ax.add_patch(p)
produce_fractal1(triangle,6)
fig.savefig("./fractal.png") #画像の保存
```

再帰処理で簡単に実装できる.実行はjupyterで行った.

```Python:fractal.py
produce_fractal1(triangle,iteration)
```

iterationの数を大きくするとより深い層まで三角形がつくられる.

#3.まとめ
再帰処理をうまく実装することでシェルピンスキーのギャスケットを作ることができた.再帰処理の中身を変えることで他のフラクタル図形を作成できる.
Rubyのクラスとインスタンス

一番大事な、クラスとインスタンスについて、イメージで掴む部分は割愛(笑)

```rb
 # クラス定義 先頭文字は、ローマ字大文字で
class Aaa
  ###
end
```

```rb
 # インスタンス生成 new
bbb = Aaa.new
 # メソッドnewは定義せずとも全てのクラスに実装されている
```

```rb
 # インスタンスメソッド
 # class定義の中に通常通りメソッド定義する
 # インスタンス毎の個別の情報を使った処理に使用する
 # インスタンスに.をつけて呼び出す
class Aaa
 def bbb
  ###
 end
end

ccc = Aaa.new
ccc.bbb
```

```rb
 # インスタンス変数
 # インスタンスメソッド中に、@をつけて定義する
class Aaa
 def bbb
  @ddd = 1
 end
end
```

```rb
 # クラスメソッド
 # class定義の中に、メソッド名の前にself.をつけてメソッド定義する。
 # クラスで共通の情報を使った処理に使用する
 # インスタンス定義時に呼んでいるnewがクラスメソッドにあたる
 # クラス名に.をつけて呼び出す
class Aaa
 def self.eee
  ###
 end
end

ccc = Aaa.eee
```

```rb
 # クラスインスタンス変数
 # クラスの中で且つメソッドの外で定義。変数名に@をつける
class Aaa
 @ddd = "クラスインスタンス変数"

 def bbb
  ###
 end
end
```

```rb
 # クラス変数
 # クラスの中で、変数名に@@をつけて定義
 # クラスを通して、値が共通となる情報に使用
class Aaa
 @@ddd = "クラス変数"
end
```
メソッドの比較

|クラスメソッド|インスタンスメソッド|
|---|---|
|メソッド名の前にselfをつける|selfをつけない|
|インスタンス共通処理|インスタンス個別処理|
|クラスから呼出|インスタンスから呼出|

変数スコープ

|範囲|クラス変数|インスタンス変数|クラスインスタンス変数|
|---|---|---|---|
|クラスメソッド内|○|×|○|
|インスタンスメソッド内|○|○|×|
|定義したクラス内|○|×|○|
|継承したクラス内|○|○|×|

```rb
 # インスタンス生成時に無条件で実行されるメソッド initializeメソッド
 # 何か処理を行いたい場合に定義すればいいが、newと同様に何もしないメソッドとして既に定義されているらしい。自分で定義した場合は既にある定義を上書きするようなことになるのかな？？？
class Aaa
 def initialize
  ###
 end
end
```

```rb
 # クラスの継承
 # クラスメソッド、インスタンスメソッドを継承する
 # 変数も継承するっぽいが、深い話になるっぽいので今は深掘りしないでおこう。
class Aaa < Bbb
 ###
end
```
Firebase App Distributionのパーミッションエラー

fastlaneで [`firebase_app_distribution`](https://firebase.google.com/docs/app-distribution/ios/distribute-fastlane) しようとしたら以下のエラーが。

```shell
---------------------------------------
--- Step: firebase_app_distribution ---
---------------------------------------
▸ i  getting app details...
▸ i  uploading distribution...
▸ Error: failed to upload distribution. HTTP Error: 403, The caller does not have permission
```

ログイン中のFirebaseユーザーに編集権限が付与されていないことが原因でした。

`ユーザーと権限` で編集権限を付与すると、無事配布できるようになりました。

以上
クラッピー　スペースハック

この記事は[クラッピーチャレンジアドベントカレンダー2019](https://adventar.org/calendars/4222?fbclid=IwAR1R5JARl-7czdiHFMoUmZYtWMbXm8eN3CwOjKe0BfUuxknZYhSFDaBdhRY) 3日目の記事になります。

クラッピーチャレンジャーは、クラッピー内部の空間（スペース）をいかに有効に活用するかを日々考えています。
クラッピー内部は割と空間が多いですが、動かすための機構（グリップやバネ等）が入ると意外と空きスペースがありません。
特にスペースを奪っているのがバネです。
![2019-11-13_141137.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/a74b6560-21ed-8645-930f-0ad5f1b04952.png)

バネは筐体のほぼ中央を前後に横切っているため、残りスペースを減らす大きな要因となっています。

そこで、クラッピーの唇を止めているネジAを長いものに交換、腕を支えているパーツの下部にネジBを追加し、AB間に引っ掛けるようにバネの位置を変更します。

![2019-11-13_141955.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/ef8023aa-ae57-2864-ba8e-fc8d44bfe5fc.png)

こうすることで、操作感をほぼ損ねることなく、バネの位置を上にずらすことができます。
バネが強すぎる場合は少し短く切るとよいでしょう。

![2019-11-13_142132.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/47819f8b-cd74-c9d0-f078-99e744d2dbf6.png)

では良いクラッピーチャレンジを！
selenium-webdriverで自動的にWebサイトにアクセスしたとき、アクセスログはどうなるのか

#目的
実はこっそりと社内業務の一部を自動化していたのですが、ふとサーバログ覗いたら自動化しているのがバレるんじゃないかと思い、検証してみました。

#検証環境
* Webサーバとして<a href="https://paiza.cloud/ja/">PaizaCloud</a>を利用
* 自動的にアクセスする方法としてSelenium-webdriverとheadless-chromeを利用
* 自動化するプログラムとしてPythonを利用

#やったこと
##SeleniumとHeadless Chromeの導入
こちらに関しては、たくさん記事がありますので割愛します。

##Webサーバを立てる
<a href="https://paiza.cloud/ja/">PaizaCloud</a>にアクセスし、ログインします。
Googleアカウント等でログインでき、一部プランは無料で利用できます。今回はこの無料プランを使っています。

サーバ作成画面で、適当なサーバ名とインストールするアプリケーションを選択します。
今回はApacheをインストールしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/af0fdc28-7c1c-3a1e-facc-1af1c1f7c3bb.png)

サーバ作成後、左側のブラウザボタンをクリックすると内部ブラウザが立ち上がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/4419e3e4-ffba-8bef-cebb-dffee1204f51.png)

もちろん、URLをコピペして別のブラウザを利用してもOKです。
とりあえず、これでサーバが立ち上がっていることは確認できました。

##サーバログの場所を確認する
Apacheのサーバログは、デフォルトで/var/log/apache2/access.logにあります。
左側のコンソールボタンをクリックして、コンソールを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/e3c3309d-cb18-a919-3104-ba8143d4453a.png)

下記コマンドを叩いてアクセスログを確認してみます。

```shell
sudo tail /var/log/apache2/access.log
```
今回は、まだアクセスログはありませんでした。

##Pythonでコードを書く
```python:main.py
#モジュールのインポート
from selenium import webdriver

#Chromeの起動
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=options)

#Webサーバにリクエストを投げる
driver.get('https://bowtin-testserver.paiza-user.cloud/')
```

上記プログラムを実行すると、自動的にGoogle Chromeが立ち上がってWebページにアクセスしてくれるはずです。

##アクセスログを確認する
再度、サーバ側のアクセスログを確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/e37d974b-01d8-085b-9144-4aa8d73195d0.png)

Chromeと書いてあり、この時点では手動なのか自動なのかはわかりません。

##Chromeの画面が起動しないようにコードを変えて実行してみる
コードを一部追加し、バックグラウンドでChromeが起動するようにします。
これで、画面にChromeが表示されないので自動化されている感がでます。

```python:main.py
#モジュールのインポート
from selenium import webdriver

#Chromeの起動
options = webdriver.ChromeOptions()
options.add_argument('--headless') #追加
options.add_argument('--disable-gpu') #追加
driver = webdriver.Chrome(options=options)

#Webサーバにリクエストを投げる
driver.get('https://bowtin-testserver.paiza-user.cloud/')
```
コードを改変した後、再度実行します。

##再度サーバログを確認する
今度は、ブラウザの種別がHeadless Chromeになっているのが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/51c1840f-c164-5dd9-170d-c4c43e4e572a.png)

#結論
* 知っている人がちゃんと見ればわかる
IT初心者がよくわからなかったXML

新人の頃はXMLだかHTMLだかといったアルファベットの羅列の区別がつきませんでした。
今も自信ありません。

いろんなサイトをつまみ食いしてまとめたメモを改めて整理したいと思います。
（個人メモだったので参考にしたURLが一部残っていません...）

# XMLとは
**「拡張可能なマークアップ言語」**

ちなみに「マークアップ言語」について

> マークアップ言語とは、タグと呼ばれる特殊な文字列を使用して、文章の構造やタイトル、文字の修飾情報などを埋め込んでいく言語です。
参考：[XMLとは？IT初心者にもわかりやすい基礎知識とHTMLとの違い](https://hnavi.co.jp/knowledge/blog/xml/)

```html:sample.html
<html>
  <body>
    <h1>Hello,World!</h1>
  </body>
</html>
```

↑ HTMLもマークアップ言語
XMLの場合、`<name>John</name>`という具合にタグをカスタムできるので、囲んだ文字列をデータとしてわかりやすく管理ができるよ、ということだそうです。


# XMLの特徴
### ■ データの意味が分かりやすい
前述の通り、データの意味に合わせて要素名（例：`<name>`）を自由に定義し、データを明確に目立たせることが可能
→ 商品名や品目名、取引先名など任意の種類のデータをわかりやすく設定できる

### ■ 拡張性が高い
テキストベースで成立し、データ交換や格納が手軽にできる

```xml:sample.xml
<productId>1111</productId>
<productName>ティッシュ</productName>
<price>200</price>
<salesStartDate>20190401</salesStartDate>
```

### ■ あらゆるコンピュータシステムへの適応可能
記述方式が世界基準で統一されており、
汎用性が高く、共有しやすくなっている


# HTMLとXMLの違い
大きく違うのは**用途**

### HTML
"Hyper Text Markup Language"
Webページを記述するための表示用言語
Webページに装飾を施す役割
→ **人間に情報をわかりやすく表示するための言語**

### XML
"eXtensible Markup Language"
データ記述用言語
文書中のデータをわかりやすくしたり、データを交換したり
→ **マシンに情報をわかりやすく効率よく伝えるための言語**


☆ 両者の連携により、効率的なシステム運用ができる
e.g. XMLでデータを格納・管理し、HTMLに変換・表示

# おわりに
ふんわりまとめ
もうちょっと実務的なところもわかるようになりたいです
AndroidのWebViewでキーボードが入力欄にかぶってしまうとき

（日本語資料が少なくて、探すのにけっこう苦労したのでメモ）
AndroidでWebViewをそのまま使うと、入力欄を押してソフトキーボードが出現させたときに、キーボードが画面にかぶってしまうことがある。

そんなときは、対象WebViewを含むFragment or Activityの`onCreate()`に以下のコードを入れれば良い。

```fragment.kt
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        activity?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
    }
```

これで、キーボードが出現したときにもFragment or Activityの大きさが再計算されて、キーボードが被らなくなる。

出典
[Window Soft Input Mode ConstraintLayout](https://stackoverflow.com/a/45436829)
TeX 執筆時にファイル分割をする方法

# 0. 本記事概要

私は専攻柄、よくTeXを用います。
きっとこの記事を読んでくれた方に「TeXって何？」という方はいないと思うので、TeXそのものの説明はしません。

大量の文章を執筆する際、１つのファイルに書くのはあまり好ましくないと思っています。(どこに何書いたか分からないし…)

そこで、例えばセクションごとにファイルを作成して、最後に合体させることができればかなり良いと思っています。
私自身も最近この方法を知りました。私の備忘録という意味も込めてこの記事を書きます。

#1. 方法

ファイル構造は、以下のようになっているとします。
<img width="350" alt="スクリーンショット 2019-11-13 11.46.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367076/9c2a6c31-f0aa-7c12-337d-d7d4ad25465b.png">


「01_report」の中に、分割している「chapter_」ファイルと、最後に統合して出力するreport.tex があります。


統合しているreport.texには、以下のように記述します。

```tex:report.tex
\documentclass[dvipdfmx,uplatex]{jsarticle}
\def\vector#1{\mbox{\boldmath $#1$}}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage[hiresbb]{graphicx}
\usepackage{ascmac}
\usepackage{siunitx}
\usepackage{float}
\usepackage{tikz}
\usepackage{circuitikz}
\usepackage{url}
\makeatletter
 \renewcommand{\theequation}{%
   \thesubsection.\arabic{equation}}
  \@addtoreset{equation}{subsection}
\makeatother
\title{title}
\author{name}
\date{date}
\begin{document}
\maketitle

\include{chapter01/191105}








\end{document}
```
使いたいパッケージと、`\include`を用います。.texの拡張子を書く必要はありません。

# 注意
分割しているchapter内のtexファイルに `usepackage`を記述するとおかしくなりました。分割されたファイルには記述せず、ただひたすら文を打っていきます。
Goで空のスライスを作る時

## Goにおける空スライスの作り方
Goでは空のスライスを作る方法が二種類あります。
型Typeについて
1. スライスリテラル記法による作成 `[]Type{}`
2. Goのビルトイン関数による作成 `make([]Type, 0)`

正直どっちも対してやってることは変わらないだろうと思い習慣的に使っていた`make`による作成をあらゆる場面で使っていました。というのも、`make`はキャパシティ指定ができるので後から`append`することを想定した場合にキャパシティ確保分の時間をセーブできるだろうと思っていました。しかしある時にベンチマークを眺めていると`runtime.mallocgc`がやたらと時間を食っていたため掘っていくと`make`の行にたどり着いたため、「もしや」と思い空のスライスリテラルに書き換えてみたらパフォーマンスが改善しました。

## ベンチマーク
こうなってくると実際にどの程度実行時に影響があるのかが気になります。そこで次のようなベンチマークを書いてみました。

```go
func BenchmarkSliceAllocation(b *testing.B) {
	var p []byte

	b.Run("empty slice literal syntax", func(b *testing.B) {
		for i := 0; i < b.N; i++ {
			p = []byte{}
		}
	})

	func([]byte) {}(p)

	b.Run("make zero-length slice", func(b *testing.B) {
		for i := 0; i < b.N; i++ {
			p = make([]byte, 0)
		}
	})

	func([]byte) {}(p)
}
```

```
empty_slice_literal_syntax-4         	161896716	         0.765 ns/op
make_zero-length_slice-4             	23673788	         5.10 ns/op
```

実行してみてびっくり、なんと空のスライスリテラルは`make`の6倍以上早かったのです。

最適化に関してはド素人なのでこれ以上は掘ってないのですがそもそもキャパシティ付きで`make`する目的が間違ってたんだろうなという気持ちになりつつあります。
もし詳しい方がいたらご指摘いただけましたら幸いです。
Rubyの復習

```
 # 画面表示 puts
puts "aaa"
 # aaa
```
```
 # 文字連結 +
puts "aaa" + "bbb"
 # aaabbb
```
```
 # 文字数 length
puts "aaa".length
 # 3
```
```
 # 数値⇨文字列 to_s
puts "aaa" + 3.to_s + "bbb"
 # aaa3bbb
```
```
 # ローカル変数定義は、ローマ字小文字始まりで。
abc = 3
aB_c = 1
abc += aB_c
puts abc + aB_c
 # 5
```
```
 # 定数定義は、ローマ字大文字始まりで。
PI = 3.14
```
エスケープ文字
\n 改行
\t タブ
バックスラッシュは、option + ¥ で入力

```
 # 文字列中に変数入力 #{}
abc = "777"
puts "seven#{abc}"
 # seven777
```
```
 # 入力受付 gets
puts "今日は" + gets
11/13
 # 今日は11/13
```
```
 # 「末尾」の改行削除 chomp
a = gets
aiueo
puts a + "aaa"
aiueo
aaa
puts a.chomp + "aaa"
aiueoaaa
```
```
 # ハッシュ宣言 aaa = {}
 # ハッシュ生成 aaa = {a:"A",b:"B",C:"c"}
 # ハッシュ要素取得 aaa[:b]
 # ハッシュ要素追加・更新 aaa[:d] = "C" aaa[:a] = "AA"
 # ハッシュ要素削除 aaa.delete(:b)
```
if文の分岐後ifは、elsif

```
 # 文字列を数値に .to_i
```
```
 # メソッド定義
def aaa
 puts "aaa"
end

aaa
 # aaa
```
```
# 繰り返し while
while TRUE do
 puts "a=1"
 exit
end
```
```
 # 配列宣言 bbb = []
 # 配列生成 bbb = ["A","BB","c"]
 # 配列要素取得 bbb[0]
 # 配列要素追加・更新 bbb << "C" bbb[1] = "bb"
 # 配列要素数 bbb.length
 # 配列要素削除 bbb.delete_at(0)
```
メソッドを使うときは、変数のスコープに注意
ローカル変数への参照はメソッドに持ち込めない。
ローカル変数のコピーはメソッドに引数で渡せる。

メソッドの渡し値は、メソッドで最後に実行された式の値。
もしくは、return で宣言した値。
return記述後の処理は行われない。

```
 # 配列の中身を繰り返しで順繰り取得
bbb.each do |ccc|
 puts ccc
end
```
SQL create databases ~ メモ

#データベース作成

```sql
CREATE DATABASE データベース名　default character set utf8;
```
default character set utf8　は 「utf8という文字コードでデータを保存する」


###データベース操作
```sql
//データベースの一覧確認
show databases;

//データベースの削除するとき
DROP DATABASE データベース名;
```

##テーブルの作成
「use データベース名;」でデータベースに移動する

```sql
CREATE TABLE テーブル名　(
    id INT,
    name VARCHAR(255)
);
```
()内で必要なカラムを記述する

##コマンドプロンプトに直接入力せずファイル(.sql)に保存し実行する方法

ファイルに

```sql

CREATE DATABASE データベース名　default character set utf8;//データベースを作成する文

use データベース名;//データベースに切り替え

CREATE TABLE テーブル名　(
    id INT,
    name VARCHAR(255)
);//テーブルの作成
```
####ファイルを実行
mysql> source ～ファイルパス/保存したファイル名.sql
を実行すればできる
注意　ファイルパスの「￥」マークのままではできないので「/」に書き換える必要があります
cloud9でLaravelの環境構築

PHP7.1インストール

```
sudo yum -y install php71 php71-cli php71-common php71-devel php71-mbstring php71-mysqlnd php71-pdo php71-xml php71-gd php71-intl php71-mcrypt php71-opache php71-pecl-apcu php71-pecl-imagick php71-pecl-memcached php71-pecl-redis php71-pecl-xdebug
```
PHP7.1適用（ほかのPHPバージョン入っている場合）

```
sudo alternatives --set php /usr/bin/php-7.1
```
Laravelインストール

```
composer global require "laravel/installer"
```
新しいアプリ作成

```
composer create-project laravel/laravel 【アプリ名】
```
シェルスクリプトでファイル/ディレクトリの有無を確認する

# はじめに
なんとなく文書上では理解していたつもりだったが、実際のif文でファイル/ディレクトリの有無を判別するオプションを使わせた時、どのような結果を返すかエビデンスを取ってみた結果です。

# 検証

## 用意したスクリプト(sh)
```sh:
# 確認対象となるディレクトリとファイル
target1="/var/log"
target2="/var/log/messages"
target3="/ThatIsNotExisted"

# 確認処理
function is_Exist () {
  local target=$1
  if [ -? ${target} ];then
    echo "${target} is Existed !!"
  else
    echo "${target} is not Existed ... "
  fi
}

# 処理
is_Exist ${target1}
is_Exist ${target2}
is_Exist ${target3}
```

## if -e (ファイルもしくはディレクトリがあればtrue、なければfalse)
```console:
/var/log is existed !!
/var/log/message is existed !!
/ThatIsNotExisted is not existed ...
```

## if -d (ディレクトリであればtrue、それ以外はfalse)
```console:
/var/log is existed !!
/var/log/message is not existed ...
/ThatIsNotExisted is not existed ...
```

### if -f (ファイルであればtrue、それ以外はfalse)
```console:
/var/log is not existed ...
/var/log/message is existed !!
/ThatIsNotExisted is not existed ...
```
vscodeでThe git repository at XXXX has too many active changes, only a subset of Git features will be enabled.が出たとき

# VSCodeでGit関連のエラー

## 環境

Windows10
Git 2.22.0

**他人が作ったRails × NuxtのリポジトリをCloneして`yarn install`した後だった**

## エラー文

`The git repository at XXXX has too many active changes, only a subset of Git features will be enabled.`

Google翻訳に投げると

`XXXXのgitリポジトリにはアクティブな変更が多すぎます。Git機能のサブセットのみが有効になります。`


## 原因

yarn installの後にこのエラーが出る。。。

.gitignoreを見てみるとnode_modulesが指定されていない

つまり,node_modulesの中身を全部監視しようとしてこのエラーが出た。

## 解決
[https://github.com/vuetifyjs/nuxt/blob/master/template/.gitignore](https://github.com/vuetifyjs/nuxt/blob/master/template/.gitignore) から.gitignoreコピペして反映

エラーが消えました。

フロントあまり触ったことない人があげたリポジトリっぽい(?)
さては,一回もビルドせずにサンプルコピペだけでフロントのコード上げたな?
2011年製のMacbookProのバッテリーを交換した話

# 目的

- 2011年製のMacbookProのバッテリーを交換する方法を記載する。

# 実行環境

1. PCの詳細
    1. OS: macOS High Sierra 10.13.6
    1. 機種: MacBook Pro (15-inch, Early 2011)
    1. CPU: Intel(R) Core(TM) i7-2675QM CPU @ 2.20GHz

# 実施概要

1. サードパーティ製のバッテリーを購入
1. バッテリーの交換
1. 起動の確認

# 実施詳細

1. サードパーティ製のバッテリーを購入
    1. アマゾンを使用して自分のMacbookProにあったバッテリーを探した。
    1. アマゾンで取り扱っているMacbookのバッテリーはほぼ中国製で不安もあったが、品質の興味もあり購入した。
    1. バッテリーを取り外す際に特殊ネジを外さないといけないのでドライバーが付属している交換バッテリーの購入をおすすめする。
1. バッテリーの交換
    1. 本来裏面になる部分を上にして見えるネジを全て外す。(青丸のネジは長いネジになっている)  
    ![A4BF9C65-DA5C-4420-A64D-6D230CFFC332.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/59581a18-30d9-5d62-d8b1-da7a53107e1e.png)

    1. 裏蓋を外す。  
    ![676BA05A-857F-4C05-8CBB-CA45EE8A5FEE.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/855f3904-04e8-a2d3-55d4-b1cfba414170.jpeg)

    1. バッテリーを固定している二つのネジを外す。新品バッテリーをつけた後で再度使用するのでネジは無くさないようにする。(バッテリーを固定しているネジはベンツのエンブレムのようなネジである。付属の専用ドライバーを使用した。)  
    ![14164120-7275-4978-9FE6-F04D38BB89DB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/8b1e18f3-0a36-3065-7ef1-0889e60bc60a.png)

    1. バッテリーの左上にあるテープをめくって隠しネジを外す。  
    ![884001FF-2022-4BA1-A96A-280210F0936E.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/d779f16c-6347-8bf6-24eb-7f4970ff7405.png)  

    1. バッテリーを固定しているネジ３個が全て外れていることを確認する。
    
    1. 基盤にくっついているバッテリーケーブルを外す。ケーブルの取り外しは慎重に行う。コネクタロックなどはないがデリケートな部品なので、様子を見ながら実施すると良い。必要なら作業を行うPCの分解を解説しているブログなどを確認した方が良い。  
    ![29889648-1F4C-4DD3-81A9-01691665E528.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/aeff8aaf-d673-f5c4-4dfd-8c4c674642ca.png)

    1. バッテリーを固定しているネジ３個、バッテリーケーブルが外れたことを確認する。  
    ![80B32685-3AE2-4C7A-8AA9-CC724C57F928.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/25ef8e94-1b87-373a-7afb-dbac49fd304d.png)

    1. バッテリー取り外しの際に使用するセロハンをつまみ、周辺構成パーツとの干渉を確認しながらバッテリーを取り外す。(外したバッテリーはすぐに廃棄せずに取っておいた方が良い。)  
    ![D63770C9-90A4-4771-BD3D-76D38B80C187.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/e6cc3cb7-6585-49a8-66ac-a47ae030b690.png)  
![E41A31CD-CD95-4831-938C-8B010B4A080E.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/8eb200a5-295f-c0fc-3ee3-8a070153d50e.jpeg)

    1. 新品バッテリーを周辺構成パーツとの干渉を確認しながら取り付ける。  
    ![B57CD8A9-162F-40A9-98E6-09FA5A807E15.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/e152c57a-6af0-732e-fd2d-a1cfbb145fb5.jpeg)

    1. バッテリーケーブルを接続する。
    1. 先ほど取り外したバッテリーを固定していたネジを取り付ける。
    1. バッテリーを固定しているネジ３個、バッテリーケーブルくっついていることを確認する。  
    ![517ABFCF-2DC8-4CFA-B30D-8A59D3019290.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/1b7d5cd5-1131-16c5-d3ae-bf53aac251a3.jpeg)

    1. 裏蓋を閉じ、ネジで固定する。
    1. 手持ちの充電ケーブルを使用しPC本体に充電を行う。(30分ほど放置した方が良い、交換後充電しながら電源を入れようとしても入らなかった。めっちゃ焦った。) 
1. 起動の確認
    1. 電源を入れ正常に起動をしていることを確認する。
Dockerって？プレステに例えて完全理解！

Dockerについて調べても調べても「・・・・で？何？」となってた私が
Qiitaにこうやって綴るくらい感動した例え話です．（笑）
＊ちなみにプレステはやったことも触ったこともないですが，そんな私でも分かったので安心してください！

# 結論
プレステ本体->docker
ゲームカセット->image
ゲームカセットを挿しゲームができる状態のプレステ本体->コンテナ
ゲームカセットが並んでる場所->docker hub

# 例）プレステ(プレステ本体)でマリカー(ゲームカセット)をする <-> docker(docker)でMYSQL(image)を使う
よしマリカーをしよう！となった時，当たり前ですがプレステ本体だけではマリカー出来ないですよね．
同様にマリカーのゲームカセットだけでも動かないですよね．
あくまでプレステ本体は，ゲームカセットが動く環境を持っている機械です．
Dockerも同じでMYSQLというイメージが動くための環境でしかないです．
プレステとdockerは目に見える実態物かそうでないかの大きな違いはありますが，役目としては同じです．

マリカーのカセットをプレステ本体にセットしてようやくゲームができます．
これがdockerの世界では，コンテナといいます．
DockerにMYSQLをセットすることでMYSQLがつかえるようになります．
その状態をコンテナと言います．

MYSQLの他にもPHPを使いたい！とかなれば，docker hubに探しにいきましょう！
他のゲームカセットがほしい！と思った時，おもちゃ屋さんに行ってゲームカセットが羅列している場所に行きますよね．
この”ゲームカセットが羅列している場所”，つまり”imageが集まっている場所”がdocker hubです．

# おまけ1_データの保存
プレステでゲームしたことがある方はよくわかると思うのですが，
プレステ本体にもゲームカセットにも保存機能ってないんですよね(初期のものだけかな？)．
でもステージ０からステージ４まで進んだのにプレステの電源を切って次の日起動したら，保存されてなくてステージ０からのスタート！とか嫌ですよね笑
だからステージ４まで進んでます，という情報を，”USBみたいなメモリ”をプレステに差し込んで，そのメモリに保存してあげるんです．
Dockerも同じで，起動している間は情報の記憶を持ってますが，起動を切るとデータが保存されません．
なのでデータを保存してくれるものを外付けしてあげる必要があるんです．

じゃあ，プレステだったら”USBみたいなメモリ”だけど，dockerで対応するものは？となりますが，
ここに関しては使うimageによって違うので例えられないです・・・笑


# おまけ２_docker-composeとは違う？
違います！
正確には使い方が違う，ですかね．
かるーく説明すると，
dockerの場合，使いたいimageを一個ずつセットしないといけないですが，
docker-composeは，docker-compose.ymlというファイルに使いたいimageの情報をバーっと複数記述してあげるだけで一気にセットすることが可能です．

本記事の本題である例え話でいくと，仕組みはdockerと同じと思っていいと思います！（私はそう思ってる笑）




# さいごに
そんな感じで
Dockerって難しい！正体が摘めない！と毛嫌いしてた私ですが，
この話をきいてdockerってそんなに難しくないかも！って思えたので，
同じように今思ってくれてたら嬉しいですね！

他にもっといい例えがあるよ！って方とか意義あり！って方とか
なんでもコメントください^ ^

では・・・・！
VisualStudioでGradleを使ってNativeなAPKを作ってみる

# はじめに
昨日「[VisualStudioでAntを使ってNativeなAPKを作ってみる](https://qiita.com/furui/items/57df2533d1faa2a38b6f)」という記事を上げました。
散々Gradleでうまく出来ないと言っておりましたが、あの後すぐにうまく出来ました。
どうやったらGraldeでできるのか、そもそも何故うまくいかなかったのかをまとめていこうと思います。

# 開発環境
- OS : Windows 10
- Visual Studio 2017 Professional

# プロジェクトの準備
※1以外はAntと同じ手順です。

### 1. Gradleプロジェクトの作成
「**AndroidGradle**」という名前でプロジェクトを作っていきます。
![00.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75533/f222375a-ddd6-841c-0fbd-666c1cec144f.gif)

### 2. Sharedライブラリ用のプロジェクトの作成
「**Shared**」という名前でプロジェクトを作っていきます。
![01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75533/61767c83-e421-e507-5166-ceb1f897deb6.gif)

### 3. SharedライブラリをGradleプロジェクトに紐付ける
![02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75533/c1a104cb-c427-cfe3-f15b-85c0a7344207.gif)

これでプロジェクトの準備完了。

# JNIで繫いで動作確認
※Antと同じ手順です。

``` AndroidGradle.java
public class AndroidGradle extends Activity
{
    static {
        System.loadLibrary("Shared");
    }
    native void NativeTest(int value);
    
    /** アクティビティが最初に作成されるときに呼び出されます。 */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        /* TextView を作成して、そのテキストを "Hello world" に設定します */
        TextView  tv = new TextView(this);
        tv.setText("Hello World!");
        setContentView(tv);

        // 追記
        NativeTest(234);
    }
}
```

``` Shared.cpp
extern "C" {
    // 追記
    JNIEXPORT void JNICALL Java_com_AndroidGradle_AndroidGradle_NativeTest(JNIEnv* env, jobject, jint value)
    {
        LOGI("test [%d]", value);
    }
}
```

# 動作確認
上記を追記したらAndroid端末とPCを繋ぎ、実行してみます。
![03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75533/778e4a39-8f26-d149-bece-d11261d7e446.gif)

無事Gradleのプロジェクトでもブレイクポイントで止まってくれました。

# 何故うまくいっていなかったのか

### 原因1. Gradle設定変更時は「リビルド」ではなく「ビルド」で確認が必要。
例えばGradleプラグインやGradleバージョンの変更を行った際にリビルドを行うと失敗します。
リビルド時の **gradlew.bat clean** が必ず失敗するようです。
その場合はリビルドではなくビルドを行ってやれば大丈夫です。
この事実に気づくのにかなり時間がかかり何度もGradleプロジェクトを作り直していたため調査・実験にかなり時間が掛かっていました。

### 原因2. Gradleプロジェクトの build.gradle.template にNDKの設定を書いていた。
Sharedのプロジェクトを作らないで AndroidGradleプロジェクト上の **build.gradle.template** 内にNDKの設定を行っていました。
それでもAPKの生成は出来たのですが実行時にDebug構成を用いても「Cannot find or open the symbol file.」と出力ウィンドウに出てしまい、ブレイクポイントが働きません。
シンボル情報をsoファイルに含めることが出来ませんでした。
含める方法を色々調べたのですが分からなかったので断念しました。

# まとめ
これで理想的な形でWindowsとAndroidのアプリ開発がVisualStudioに集約できました。
iOSアプリの開発もVisualStudioで行えるという話を聞いた。
今度はそちらもチャレンジしていこうと思います。
Pythonで書いたE2E自動テストのコードも静的にチェック＆フォーマットしましょう【VSCode】


## 背景

プロダクトのコードを書く方は開発中にエディタ側で保存時のフォーマット＆静的チェックをされているのが普通かと思います。

一方、テスターやテストエンジニアの方々がGUI操作する自動テストにチャレンジするぞ！となったときにこのへん抜けがちなので、紹介がてら記事に起こしてみました。

## この記事を参考にするとできること

自動テストのコードを書いている際、保存するたびに

- 空白行やスペースの有無、長すぎる行の改行など、一定のルールに沿った形に自動で整形（＝フォーマット）してくれる
- 冗長な書き方の指摘や、使われていないモジュール・変数の指摘をしてくれる

状態を実現できます。

結果、複数人で自動テストのコーディングをしている場合には、それぞれの書く自動テストコードの見た目がある程度統一され＆無駄な行が減り、読み書きがしやすくなります。

今回はPythonのコーディング規約である[PEP8](https://pep8-ja.readthedocs.io/ja/latest/)を（基本的には）守った形になるように設定していきます。

## 環境

- Windows10Pro
- VSCode 1.40
- Python 3.7.2

## 手順

### 1. 必要なものをインストール

以下コマンドを実行して、flake8とautopep8をインストールしてください。

``` cmd
> pip install flake8
> pip install autopep8
```

### 2. VSCodeの設定

settings.jsonに記載されている既存の設定に、以下を追記。もしくは、項目がすでにあれば上書き。

``` json
{
    "editor.formatOnSave": true,
    "python.linting.pylintEnabled": false,
    "python.linting.enabled": true,
    "python.linting.flake8Enabled": true,
    "python.linting.flake8Args": [
        "--ignore=E501"
    ],
    "python.formatting.autopep8Args": [
        "--max-line-length=200",
    ]
}
```

- `editor.formatOnSave` : ファイル保存時に自動でフォーマットするかどうか
- `python.linting.pylintEnabled`: pylintを使うかどうか
- `python.linting.enabled`: lintするかどうか
- `python.linting.flake8Args`: flake8に渡すパラメータ。今回の`--ignore=E501`は、E501の「行が長すぎる」という指摘を回避
- `python.formatting.autopep8Args` : autopep8に渡すパラメータ。今回の`--max-line-length=200`は改行の制限を200文字設定

ここまでできれば、あとはVSCodeでコードを保存した際に自動でフォーマット＆問題点を指摘してくれるようになります。

### 3. 指摘を見る

画面下の「問題」というタブのところに、指摘内容が表示されます。

![flake8-and-autopep8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46492/8e477f08-c1b9-3aae-a1ee-df1d5f2545a4.png)

もし出てこない場合は、左下の×や△のマークのところをクリックしてみてください。

![flake8-and-autopep8_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46492/e6f20140-8f42-0d25-6381-4131649828c4.png)


## システムテストの自動テストコードで困るパターン

プロダクトの開発チームと同じルールで自動テストコードを書くことができれば、自動テストのメンテナンスができる人が増えるので都合が良いです。

しかし、プロダクトのコーディング規約に則って自動テストのコードを書こうとすると困る場面も出てきます。

例えば、１行の文字数の制限。開発時はあまりに横長だと適切な改行を入れることが求められます。今回使用しているautopep8では、デフォルトで79文字におさまるように自動で改行するようになっています。

が、Seleniumで自動テストを書いていて、やむなく長ったらしいxpathを指定しなければいけない・・・なんて場合には、変に改行されるよりも横に伸ばしておいたほうが見やすい、ということも。

そのため、今回は行の文字数の制限を200に変えてあります。ここはお好みで調整してください。


## 参考

- [VSCodeのPython開発環境でpylintの代わりにflake8を導入し自動整形を設定する - Qiita](https://qiita.com/psychoroid/items/2c2acc06c900d2c0c8cb#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E4%BF%9D%E5%AD%98%E6%99%82%E3%81%ABlinting%E3%82%92%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B%E8%A8%AD%E5%AE%9A%E3%81%AB%E3%81%99%E3%82%8B)
- [VS Code コーディング規約を快適に守る - Qiita](https://qiita.com/firedfly/items/00c34018581c6cec9b84)
BigQueryで配列をヒストグラム用のデータに加工するUDFなど

## なに？
簡単な処理はBigQueryでさくとやってしまおう、ただしSQL UDFでJSより速いらしい？
可読性が落ちるのは仕方がない。

## ヒストグラム
集計したい配列`ARRAY<FLOAT64>`とヒストグラムのビンの個数`INT64`を受け取って配列を区分けしその区分と個数を返す

```SQL
CREATE TEMP FUNCTION HISTOGRAM(list ARRAY<FLOAT64>, bins INT64) 
RETURNS ARRAY<STRUCT<lower FLOAT64, upper FLOAT64, N INT64>> AS ((
WITH min_max_width AS (
  SELECT AS STRUCT
    MIN(i) AS min_i,
    MAX(i) AS max_i,
    (MAX(i) - MIN(i)) / bins AS w
  FROM UNNEST(list) AS i
),
division AS (
  SELECT AS STRUCT
    min_i + b * w AS l,
    -- 最後だけ誤差が出るので場合わけ
    IF(b = bins-1, max_i, min_i + (b+1) * w) AS r,
    b = bins-1 AS flg_last
  FROM UNNEST(GENERATE_ARRAY(0, bins-1)) AS b, min_max_width
)
SELECT ARRAY_AGG(STRUCT(
  l AS lower,
  r AS upper,
  -- 最後だけ両側を含む
  IF(flg_last,
    (SELECT COUNT(*) FROM UNNEST(list) AS i WHERE l <= i AND i <= r),
    (SELECT COUNT(*) FROM UNNEST(list) AS i WHERE l <= i AND i < r)
  ) AS N
))
FROM division
));

-- Box-Mullerで正規乱数を生成
WITH n_rand AS (
  SELECT ARRAY_AGG(SQRT(-2 * LN(RAND())) * COS(2 * ACOS(-1) * RAND()))
  FROM UNNEST(GENERATE_ARRAY(1, 10000))
)
SELECT *, 
  N / SUM(N) OVER () / (upper - lower) AS normed_hight
FROM UNNEST(HISTOGRAM((SELECT * FROM n_rand), 10))
```
### 実行結果

| 行 | lower        | upper        | N    | normed_hight |
|----|--------------|--------------|------|--------------|
| 1  | -3.846461812 | -3.088727823 | 8    | 0.001055779  |
| 2  | -3.088727823 | -2.330993833 | 111  | 0.01464894   |
| 3  | -2.330993833 | -1.573259844 | 463  | 0.061103238  |
| 4  | -1.573259844 | -0.815525854 | 1498 | 0.197694708  |
| 5  | -0.815525854 | -0.057791865 | 2609 | 0.344316084  |
| 6  | -0.057791865 | 0.699942125  | 2896 | 0.382192173  |
| 7  | 0.699942125  | 1.457676114  | 1722 | 0.227256534  |
| 8  | 1.457676114  | 2.215410104  | 554  | 0.073112729  |
| 9  | 2.215410104  | 2.973144094  | 122  | 0.016100637  |
| 10 | 2.973144094  | 3.730878083  | 17   | 0.002243531  |


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287793/9265e186-6d41-9ba7-f077-a081eb7e9de1.png)



サンプル数に対してビンが少ない気もしますが、だいたい標準正規分布っぽいので成功です。

## nDCG

ランキングを改善するタスクを行なった時に使った並び順のスコアを評価する永続UDFです。
そういえばいつの間にか、TEMPを消してFUNCTION名に保存先を指定することで永続化することができるようになってました。

```SQL
CREATE FUNCTION `project.data_set.NDCG`(rels ARRAY<INT64>) 
RETURNS FLOAT64 AS ((
WITH discount AS (
  SELECT
    IF(i = 0, rel,  rel / LOG(i+1  ,2)) AS r,
    IF(i = 0, rel_rev,  rel_rev / LOG(i+1  ,2)) AS n
  FROM UNNEST(rels) AS rel WITH OFFSET AS i
  LEFT JOIN UNNEST((SELECT ARRAY_AGG (rel ORDER BY rel DESC) FROM UNNEST(rels) AS rel)) AS rel_rev WITH OFFSET AS i
  USING (i)
)
SELECT SAFE_DIVIDE(SUM(r), SUM(n))
FROM discount
));
```

順序が進むほど(ランキングが下がるほど？)$\frac{1}{\log_2i+1}$でディスカウントして足し合わせて正規化するだけです。

### 呼び出し

```SQL
SELECT data_set.NDCG([3,3,3,3,3,0,0,0,0,5])
-- SELECT `project.data_set.NDCG`(...)
```
同プロジェクトならproject名を省略できるのはテーブルと同じ。

| 行 | f0_                |
|----|--------------------|
| 1  | 0.8804360184094202 |

ちなみに...
@$k$以下の要素に対して評価したい場合は引数`k INT64`を追加して、discout時に`WHERE i < k`をしてやればいい


## 余談
ヒストグラムの実装はゴリ押しになってしまった。

いまいちSQLのインデントわからん。あんまりJOINをインデントするのはなんか好きじゃない気持ち。
あと改行もいまいちわからない。
【アパレル×IoT】スマートハンガー【商品管理・トレース】

なんとなく閃いたアイデアを3分で説明する企画！
誰かビジネス化してください笑

# スマートハンガー
スマートハンガーは、ハンガー自体にバッテリー、センサー、通信機が搭載されており、お客さんが商品を取ってから、**店内をどのように移動したかをトレースできるハンガー**である。

### ベーシック機能

| 機能名            | 機能概要                        | 実装方法                  |
|:------------------|:-------------------------------|:--------------------------|
| 商品登録          | ハンガー1本1本に商品情報を登録する | ハンガーにバーコードリーダーを付ける。商品のバーコードをピッとして登録 |
| 商品動線記録      | 顧客がハンガーを手に取った時点から、店内の移動軌跡を記録する | 店内に設置したアクセスポイントからビーコン送受信。移動していないときは通信せず省電力 |
| 商品動線可視化 | 記録された商品の動線をディスプレイで可視化する | BIツール(適当) |

## 店舗導入メリット
顧客の関心が高い商品がどれか、商品をどこに配置するとよく売れるのか、というデータが手に入る。特にUNIQROやGUなどの大型店舗にとっては、売れ行き商品の即感知、商品配置戦略のための貴重なデータとなりうる。

## 特徴1. 顧客負担なし。長期利用可能
従来の顧客動線分析は、顧客が持っているもの(例えばスマートフォン)にアプリを入れてもらうなどの必要があった。顧客からすると、自分が常に監視されている気分になるため、なかなか導入されづらく、データが集まらなかった。一方、商品一つ一つのタグに位置情報を管理するための機能を持たせるとすると、コストが高くついてしまう。そこで、スマートハンガーである。スマートハンガーは普通のハンガーと見た目は大きく変わらないため、顧客が監視されている気分にはなりづらい。また、ハンガーは商品購入後店舗に戻ってくるものなので、多少コストが高くても、長期に使い回すことで償却できる。

## 特徴2. 店員負担は最小限
スマートハンガーの実装次第なところもあるが、従来のハンガーは木製で厚みが5センチほどあるものも普通なので、バッテリーや通信機などを入れる部分は大きく取れる。そのため、大容量のバッテリー搭載、省電力・高機能を実装しやすく、バッテリーの充電や、商品の登録作業などの店員負担はできるだけ最小限に抑えることができる。また、セルフレジへの応用など、人件費削減への機能実装も期待できる。

### 拡張機能
| 機能名            | 機能概要                        | 実装方法                  |
|:------------------|:-------------------------------|:--------------------------|
| 盗難防止          | スマートハンガーが一定時間店外に出た場合、アラームを鳴らす | スマートハンガーにアラームをつける |
| 充電ラック          | スマートハンガーを掛けておくだけで充電できるラック | 非接触充電装置？ |
| セルフレジ          | 顧客が商品購入時、スマートハンガーを掛けるだけで価格を計算する | レジとスマートハンガー通信？ |
| LEDディスプレイ      | スマートハンガーにカラーLEDを付けて、点灯させる。商品サイズや価格帯をLED色別で表示したり、セール商品を目立たせる | スマートハンバーに登録された情報からLEDを点灯させる |

### ビジネスプラン
月額定額制で、スマートハンガー、充電ラックと可視化装置をレンタルしてもらう。スマートハンガー故障時は無料交換。
レンタル価格は例えば、スマートハンガー100本なら月額10万円、1,000本なら月額50万円など。

#### あとがき
3分じゃ説明しきれなかったかもしれません。あと世の中に既出のアイデアだったらすみません。。
あとQiitaで書くことかはわかりません。。。せめて技術的にこう実装できる、ってところは深堀りしたいですね。コメントお待ちしてます。
ハンガーにLEDライト付けて、Sサイズは赤、Mサイズは青、、、とか、セール商品のハンガーだけ赤LEDで目立つ、とかは普通にありだと思いました。

アンチコメントは心が痛むのでやめてくださいTT
なんか面白いアイデアが浮かんだ人はコメントをお願いしますmm
読んでくださりありがとうございました。
JavaScript の arrow function に return が必要なケース

### 概要

arrow function を使って return が必要なケースと必要でないケースがあったのを忘れていたので書いておきます。

### サンプル

- `(arg => )` の場合は return はいらない。 

```js
const keys = ['a', 'b']
const text = 'aaaaa'

const result = keys.filter(key => text.includes(key));

console.log(result);
> [ 'a' ]
```

- `(arg => {})` の場合は return が必要。

```js
const keys = ['a', 'b']
const text = 'aaaaa'

const result2 = keys.filter(key => {
  text.includes(key);
});

console.log(result2);
> []

const result3 = keys.filter(key => {
  return text.includes(key);
});

console.log(result3);
> [ 'a' ]
```

### まとめ

`curly brackets(braces)` を使う際は `return` が必要。


### 参考

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions#Function_body

```js
簡潔文体 (concise body) においては、単一の式だけが記述できるので、その式が明示的に return される値となります。
しかし、ブロック文体においては、自動的に return はされないので、明示的に return 文を使用する必要があります。
```
MDトラジェクトリ拡張子を変換、タンパク質でアラインするスクリプトの作成 (VMD)

# 概要
シミュレーション中の原子の軌跡を保存するトラジェクトリファイルの種類が多く混乱したのでメモする。さらに、トラジェクトリ の拡張子を変換しつつ人にとって見やすいようにタンパク質でアライン（中心に固定して動かなくする）する方法をvmdで実行できるスクリプトを作成する。GUIでも同様のことはできる。

GUIでの方法はこちら↓
[VMDでトラジェクトリ変換](https://oosakik.hatenablog.com/entry/2019/11/11/VMD%E3%81%A7%E3%83%88%E3%83%A9%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%83%AA_%E3%81%AE%E5%A4%89%E6%8F%9B)

# 環境
macOS Mojave 10.14.6
vmd 1.9.3

# トラジェクトリの種類
トラジェクトリ の種類はシミュレーションソフトによって違うらしい。基本的に互換性がないので、解析するソフトに合わせて適宜変換してあげる必要がある。他にも多くのトラジェクトリ の種類があるが今回は割愛する。

|シミュレーションソフト|拡張子|含まれる情報|
|---|---|---|
|GROMACS|xtc|時間、座標|
|GROMACS|trr|時間、座標、速度
|Amber|mdcrd|時間、座標、その他（速度、力、、、）
|CHARMM, NAMD|dcd|時間、座標、その他（速度、力、、、）|

# スクリプトの作成
vmdのスクリプトの基本はこちら↓
[VMDのスクリプトの書き方](https://oosakik.hatenablog.com/entry/2019/11/08/VMD%E3%81%AE%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9)

今回は`test.pdb`、`test.xtc`ファイルを読み込み、水素以外のタンパク質でアラインし、拡張子を`.xtc`（GROMACS）から`.dcd`（CHARMM, NAMD）へ変換する。

```tcl
mol load pdb test.pdb xtc test.xtc

set num_frame [molinfo top get numframes]
set ref [atomselect top "protein and noh" frame 0]

for {set i 1} {$i < $num_frame} {incr i} {
    set all [atomselect top all frame $i]
    set prt [atomselect top "protein and noh" frame $i]
    $all move [measure fit $prt $ref]
}   

animate write dcd test.dcd beg 2
exit
```

手順は以下の通り。
1. 構造、トラジェクトリファイルを読み込む
2. トラジェクトリファイルのフレーム数を取り出す
3. 一番最初のフレームのタンパク質情報を取り出す（このタンパク質に合わせて各フレームをアラインする）
4. 各フレームの全原子をタンパク質でアラインする
5. ２番目のフレームから最後までのフレームを拡張子`.dcd`として保存

animateコマンドの詳細
[https://www.ks.uiuc.edu/Research/vmd/current/ug/node121.html](https://www.ks.uiuc.edu/Research/vmd/current/ug/node121.html)

# 参考記事
[GROMACSトラジェクトリ からAMBERトラジェクトリ への変換](http://blog.livedoor.jp/ag_plusplus/archives/67924399.html)  
[VMD User's Guide](https://www.ks.uiuc.edu/Research/vmd/current/ug/)
構造化ログとは？

## 概要
json形式(場合によっては他の形式も)を利用して構造化されたログのこと。
普通のテキストログが人間に取って読みやすいのに対して、構造化ログは機械にとって読みやすい。

例えばこれが

```
<6>Feb 28 12:00:00 192.168.0.1 fluentd[11111]: [error] Syslog test
```
こうなる

```
    jsonPayload: {
        "pri": "6",
        "host": "192.168.0.1",
        "ident": "fluentd",
        "pid": "11111",
        "message": "[error] Syslog test"
    }
```

全体としてはこんな感じ。

```

 {
         insertId:  "1m9mtk4g3mwilhp"
         jsonPayload: {
          code:  "structured-log-code"
          message:  "This is a log from the log file at test-structured-log.log"
         }
         labels: {
          compute.googleapis.com/resource_name:  "add-structured-log-resource"
         }
         logName:  "projects/my-sample-project-12345/logs/structured-log"
         receiveTimestamp:  "2018-03-21T01:53:41.118200931Z"
         resource: {
          labels: {
           instance_id:  "5351724540900470204"
           project_id:  "my-sample-project-12345"
           zone:  "us-central1-c"
          }
          type:  "gce_instance"
         }
         timestamp:  "2018-03-21T01:53:39.071920609Z"
        }

```

## 普通のログに比べて構造化ログが優秀なとこ
- jsonなのでテキストフォーマットよりも付加的な情報を意味のある形で追加しやすい
- 様々なツールと容易に連携できる
    - 事前に想定していなかったユースケースのときなど特に強力
- 検索性能が高い

## 構造化ログのデメリット
- 容量が少し多くなる

## 関連してよく使用されるサービス・ツール
- fluentd
- rsyslog
- stackdriver logging

## 参考
https://cloud.google.com/logging/docs/structured-logging?hl=ja
https://pod.hatenablog.com/entry/2017/05/20/232522
https://qiita.com/yuya_takeyama/items/825ceb6a2f4ab251745c#fnref1
https://www.wantedly.com/companies/quipper/post_articles/161707
git flowを初心者なりにまとめてみた

# 読み手の対象者

つい最近gitやgithubを知った方やgit flow?名前は聞いたことあるという方を対象者としています。ですので、git flowをバリバリ使っているなどは物足りないと思います。

## git flowとは?

git flowとはgitのブランチを活用した開発手法であり、**ブランチ戦略**とも言われています。
ちなみに似たような名前でgithub flowという言葉もありgit flowと内容は似ていますが、同じではないので注意してください。

## git flowの5つのブランチ
ここからはgit flowの基本となる**5つのブランチ**とそれぞれの役割について説明していきます。
### masterブランチ
gitでの開発経験がある方なら分かると思いますが、最も有名なブランチです。
役割は、**本番と同期するブランチ**で基本はいじらないというブランチで、マスターブランチに管理者しか触れないようにプロテクトがかかっていることもあるくらい安易に触れない恐れ多いブランチです。

### developブランチ
新規開発されたものがマージされるブランチです。ここで開発してコミットする訳ではないので注意してください。

### featureブランチ
実際に開発を行いコミットをする場所がfeatureブランチです。新人プログラマーや若手プログラマーのコミットは基本ここだけとなります。
developブランチからブランチを切り、featureブランチからdevelopブランチへマージする開発手法をとります。

※ブランチを切るとはブランチを作成するという意味です。

### releaseブランチ
developブランチがある程度追加されたら切るブランチで、本番環境に追加したくない機能などを調整するためのブランチです。

### hotfixesブランチ
本番環境などで生じた重大なバグを修正するブランチです。本番環境で運用していない場合あまり使うことがないブランチです。

## git flowを使った開発スタイル
developブランチを切る→feature/testブランチ作成
上記のようにして開発を行っていくfeature/testブランチができます。

(※/を入れると階層構造になります。)

feature/testブランチで開発を終えると、developブランチにマージします。

featureブランチは開発が進むにつれてどんどん増えていき管理し辛くなるのでマージし終えたfeatureブランチは削除します。この時大事なのがdevelopブランチにしっかりマージできているか開発者どうしで確認することです。

基本はこの繰り返しを行っていきます。

記事を書いてて思ったのですが、開発でもgitでもやはり開発者同士のコミュケーションが大事だなと感じました。
sshでログイン時に文字を表示する

# sshでログイン時に文字を表示する

下記の画面のようなのを表示する設定
（こういうの設定すると、どの端末につないでるか勘違いが少なくなる）

![etc__motd2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170209/276fd868-86f2-5c02-6259-2f5a57478e47.jpeg)

## 設定

UNIX系OSではもともと、ログイン時に`/etc/motd`ファイルに書かれている内容を表示する機能がある。

`/etc/motd`はただのテキストファイルなので、それを編集すればOK

アスキーアートを作るのは下記のサイトで右上の文字を入力すれば
下側に表示されるので、それをコピペする

[Text to ASCII Art Generator \(TAAG\)](http://patorjk.com/software/taag/#p=display&f=ANSI%20Shadow&t=DEV)
条件を指定してNgrep

#Ngrepで条件を指定してパケットキャプチャ
環境：AplineLinux3.2　パケットをキャプチャするためのいくつかのツールがあるが、Ngrepを使用する場合のオプションと実際の使用について、まとめてみる。
>Ngrepを使ってパケットキャプチャする際に-

>>* <font color="RoyalBlue">条件を指定して特定のSIPパケットを取り出し、Pcapファイルを生成する</font>
>>* <font color="RoyalBlue">タイムスタンプの入ったファイルを生成する</font>

#####**<font color="RoyalBlue">インターフェースを指定する/指定しない</font>**

###### どんなインターフェースが使用されているかを確認する

```bash:checking.interface
localhost:~# ifconfig
eth0      Link encap:Ethernet  HWaddr (MAC-address of NIC)
          inet6 addr: (ipV6 address)  Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:65615797 errors:0 dropped:75 overruns:0 frame:0
          TX packets:591221623 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:133077837117 (123.9 GiB)  TX bytes:130476534174 (121.5 GiB)
```

###### インターフェースを指定する

```bash:specified.interface
NIC=eth0
ngrep -qtWbyline -d ${NIC:-any} "($pattern)"  
-- オプション指定 -d ： is use specified device instead of the pcap default
変数NICで任意のインターフェースを指定できる
ngrep -qtWbyline -d eth0 "($pattern)"  と同義
```

###### インターフェースを指定しない

```bash:not.specified.interface
NIC=any
ngrep -qtWbyline -d ${NIC:-any} "($pattern)"  
ngrep -qtWbyline -d any "($pattern)"  と同義
```
#####**<font color="RoyalBlue">出力をPcapファイルに出力する</font>**

###### きほんの -O オプション

```bash:-Oをつけて実行
ngrep -qtWbyline -d ${NIC:-any} -O ${OUTPUT:-/var/tmp/}.pcap
```
###### hostnameとタイムスタンプをつけて、保存する
```bash:動的にファイル名を生成する
ngrep -qtWbyline -d ${NIC:-any} -O /var/tmp/$(hostname)_$(date + %s).pcap "${PATTERN:-}"
```
###### SIPに限定する
```bash:sip.limited
ngrep -qtWbyline -d ${NIC:-any} -O /var/tmp/$(hostname)_$(date +%s).pcap "${PATTERN:-}" port 5060
```
cloud9からHerokuにデプロイ

#はじめに
cloud9で作ったサービスをHerokuにデプロイするながれを書いていきます。
#実践
cloud9で環境構築、App作成後以下のものを設定します。（初回のみ実行します）

```
$ git config --global user.name "Your Name"
$ git config --global user.email your.email@example.com
```
このgit configで設定する名前やメールアドレスは、今後リポジトリ上で一般に公開されますのでご注意ください。

今回作ったモノのディレクトリに移動しgit initを実行します。

```
$ git init
```
次にgit add -Aを実行し、プロジェクトのファイルをリポジトリに追加します。

```
$ git add -A
```
ステージングエリアで控えている変更を本格的にリポジトリに反映 (コミット) するには、commitコマンドを使います。

```
$ git commit -m "Initialize repository"
```
新しいターミナルを開いて以下を実行します。

```
$ cd ~/.ssh
```
ssh-keygenはユーザー名、パスワードを聞かれますがすべてEnterキーを押せばデフォルトになります。

```
$ ssh-keygen
```
下記のコードで作成した公開鍵を確認することができます。

```
$ cat ~/.ssh/id_rsa.pub
```
cloud9にHerokuをインストールします。

```
$ source <(curl -sL https://cdn.learnenough.com/heroku_install)
```
Herokuのコマンドラインインターフェイス (CLI) がインストールされていることが確認できたら、いよいよherokuコマンドでログインしてSSHキーを追加します。

```
$ heroku login --interactive
$ heroku keys:add
```
最後にheroku createコマンドを実行して、Herokuサーバーにサンプルアプリケーションの実行場所を作成します。

```
$ heroku create　【アプリ名】
$ git push heroku master
```
以下のようなURLが発行されれば完了です。
https://xxxxx-xxxxx-xxxxx.herokuapp.com/
dockerでkaminariを実装する方法。

# rails kaminariの実装方法

kaminariの実装方法は他に多くでまわっているので今回備忘録として記述していきます。

kaminariとはページネーション機能のことでよくブログにみる表示件数を何件表示するか決める機能です。

 

1.Gemfileにkaminariを追加する

プロジェクト配下にあるGemfileにkaminariを追加しましょう。

```Gemfile
gem 'kaminari'
```

 

追記したら以下のコマンドを実行

```
docker-compose build
```

```
docker-compose up　-d
```

 

これでインストール完了。

 

次に以下のコマンドを実行。

```
docker-compose exec web rails g　kaminari:config
```

```
docker-compose exec web rails g kaminari:views
```

 

それから表示件数設定を変更する場合は以下の通り

```config/initializers/kaminari_config.rb

config.default_per_page = 10 # 1ページに表示する項目数のデフォルト値を10に変更

  # config.default_per_page = 25

  # config.max_per_page = nil

  # config.window = 4

  # config.outer_window = 0

  # config.left = 0

  # config.right = 0

  # config.page_method_name = :page

  # config.param_name = :page

```

ちなみにここでコメントアウトの設定を外すの忘れない。

 

##config/locales/ja.ymlを作成

作成したら以下のように記述

```config/locales/ja.yml

ja:

  views:

    pagination:

      first: "先頭"

      last: "末尾"

      previous: "前"

      next: "次"

      truncate: "..."

```

 

##viewを修正

controllerを修正する

```

def index

@users = User.order(:name).page params[:page]

end

```

 

viewのindexを修正

```
<%= paginate @users %>　#ページネーションを表示したいところに記述する
```

 

##ここでアプリケーションを再起動

```
docker-compose stop
```

```
docker-compose up　-d
```

これでviewを確認して反映されるはず。
無料のチャットボットツールをテストしてみた Microsoft Power Virtual Agents 

#Power Virtual Agents とは・・・？

Power Virtual Agents というチャットボットがノーコードで作成できるようになっているのを見かけた。まだプレビュー段階のようでモジュールによっては多言語化ができでいないものもあったが、かなり面白い。ボットの作成や保存でエラーになることがしばしば。でも何度も諦めずに再実行しているとそのうち動くようになったりまだまだ不安定。応答もかなり遅い。
Power Automate (旧名称 Flow) につなげることもできるようだ（Actionsという選択でリンクができる）。
ボット自体はMicrosoftのデモサイトでチャットボットを立ち上げることもできるし、自身のホームページ内に埋め込むこともできる。
基本は尋ねられること（入力されるインプット）に対して回答を用意しておけば良い。
**簡単にいうと、世間で話題になったイーオのごみ分別案内
https://www.city.yokohama.lg.jp/kurashi/sumai-kurashi/gomi-recycle/gakushu/chatbot.html
程度のボットであれば安価にできるようになってきた、もしくはMicrosoftがノーコーディングでできる環境として追いついてきたと感じた。**今後はO365の一部として提供されるのだろうがいくらになるのだろう。今なら無料だが。

サインアップ先：https://powervirtualagents.microsoft.com
**Try preview** をクリック。

Botの管理：https://powerva.microsoft.com/

私が作成してみたチャットボット
（デフォルトで作成されるボットを一部改修しただけなので、英語が登場したりいろいろ起きるかも）：
https://powerva.microsoft.com/canvas?cci_bot_id=07a9675e-42ff-45db-bd6b-c6fc17a3eab1&cci_tenant_id=9c9e5e5f-2563-4959-9cfd-54536047f126

おはよう　とか　　こんにちは　　とか適当に挨拶をかけてもらえば応答するようにしてみた。最後のカスタマーサーベイ機能はまだ多言語化ができていない様子で英語しか表示できない。。。

ボットの仕様はTopicsの組み合わせで成り立っていて一つのトピックから別のトピックの世呼び出しができる。初期段階では　Trigger phrases に登録されているなんらかの単語入力があった場合にその該当するトピックの処理が走る仕様。一連のトピックの処理が終われば再度単語入力を監視するモードに入る。　
ユーザートピックは削除も編集もできるが、システムトピックは削除はできない（編集はできる）。ボットを作成するとユーザートピックもシステムトピックもデフォルトで多数作成されるが、適当に削除、新規作成か中身を書き換えれば良さそう。無料で使えたのでまずは触ってみてはと思う。

画面例

この新規作成画面でなぜかエラーが多発し苦戦した。。。
![截屏2019-11-1308.40.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/1d51289f-097e-2dd7-2286-2b476a92cc8d.png)
作成されると次のような画面に
![截屏2019-11-1308.50.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/9ae31b68-508a-fb7c-8499-7ba536f618dd.png)
この手のエラーが出ても諦めずにトライ。。。
![截屏2019-11-1309.17.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/35b70c5d-13ea-5de8-ddef-40e91307ae5a.png)
![截屏2019-11-1311.14.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/86495e99-a486-85b1-0bf2-6a07d01e26ab.png)
"Go to authoring" でワークフローの定義
![截屏2019-11-1311.15.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/48eec698-82b1-bb30-ca7f-565e97cf498a.png)
登録されている単語が入力された場合にワークフローをスタートさせるイメージ
![截屏2019-11-1311.16.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/66da6a65-b7b6-a969-85ba-6f44ed27b35d.png)



参考資料：
https://qiita.com/rnakamuramartiny/items/16ce58a7af19f1e60693#_reference-a6ad601d83c22ed6779e
sklearnのGridSearchCVに指定可能な評価指標

# この記事について
* 単なるメモです。
* GridSearchCVのscoringオプションに指定可能な評価指標を確認する方法です。

```python
grid = GridSearchCV(
    model,
    param_grid,
    cv=5,
    scoring="neg_log_loss", #←　★これ★
    verbose=3,
    n_jobs=4
)
````

# 利用可能な評価指標一覧の表示
* これで表示できます。

```python
import sklearn
from sklearn import *
from pprint import pprint
pprint(sorted(sklearn.metrics.SCORERS.keys()))
````

# 手元の環境だと
```python
['accuracy',
 'adjusted_mutual_info_score',
 'adjusted_rand_score',
 'average_precision',
 'balanced_accuracy',
 'brier_score_loss',
 'completeness_score',
 'explained_variance',
 'f1',
 'f1_macro',
 'f1_micro',
 'f1_samples',
 'f1_weighted',
 'fowlkes_mallows_score',
 'homogeneity_score',
 'jaccard',
 'jaccard_macro',
 'jaccard_micro',
 'jaccard_samples',
 'jaccard_weighted',
 'max_error',
 'mutual_info_score',
 'neg_log_loss',
 'neg_mean_absolute_error',
 'neg_mean_squared_error',
 'neg_mean_squared_log_error',
 'neg_median_absolute_error',
 'normalized_mutual_info_score',
 'precision',
 'precision_macro',
 'precision_micro',
 'precision_samples',
 'precision_weighted',
 'r2',
 'recall',
 'recall_macro',
 'recall_micro',
 'recall_samples',
 'recall_weighted',
 'roc_auc',
 'v_measure_score']
````