OmniAICreator/Qiita-1.07M huggingface dataset:
IntelliJとgometalinterで逐一Lintを実行する

IntelliJ IDEAを`gometalinter`と連携させる方法を探したところ External Toolを使ずとも `File Watchers` が `gometalinter`に対応しているようなので手順を書き残しておきます。

GoLandでも同様。

# 利用バージョン

- IntelliJ IDEA: 2018.1.5 (Ultimate Edition)
- Plugin
 - GoVersion: 181.5087.39.204
 - File Watchers: 181.4668.7

# 設定方法

※ Goプラグインはインストール済み

### 1. Preferences > Plugins > Browse repositories を開き 「File Watchers」 をインストールする

### 2. Preferences > Tools > File Watchers を開き、プラスボタンをクリックし、NewWatherとして `gometalinter` を作成する。チェックを入れて OK で保存する
 - gometalinterは必要に応じて `go get -u github.com/alecthomas/gometalinter` する

<img width="647" alt="Preferences.png" src="https://qiita-image-store.s3.amazonaws.com/0/26393/6b4c7a2e-8630-4dad-e248-ac4ea0d9e808.png">

### 3. `gometalinter --install --update`で各種lintやフォーマッタ等をまとめてインストールする

    ```bash
    $ gometalinter --install --update
    
    Installing:
      deadcode
      dupl
      errcheck
      gas
      goconst
      gocyclo
      goimports
      golint
      gosimple
      gotype
      gotypex
      ineffassign
      interfacer
      lll
      maligned
      megacheck
      misspell
      nakedret
      safesql
      staticcheck
      structcheck
      unconvert
      unparam
      unused
      varcheck
      vet
    ```

* https://github.com/joefitzgerald/go-plus/issues/398

### 4. File Watchersのスコープ(デフォルトはProject Files)に変更があれば `gometalinter` が `golint`等を走らせます。

### 5. チェックする項目が多すぎるので、`gometalinter` のArguments:を変更して実行するlinter, formatterを絞る
私は以下のようにしています。
Argments: ` --exclude="\bexported \w+ (\S*['.]*)([a-zA-Z'.*]*) should have comment or be unexported\b" --disable-all --enable=golint --enable=vet $FileDir$`

- コメントのメッセージを無効にしています。
  - 参考:[How to disable \[exported method should have comment or be unexported](https://github.com/golang/lint/issues/186)

<img width="829" alt="Edit_Watcher.png" src="https://qiita-image-store.s3.amazonaws.com/0/26393/38ece60a-04e4-56e4-b6bb-0c1b16d293bc.png">


# 公式記事は正義
- [Gogland EAP 16: File Watcher, Tons of New Inspections, Smarter Navigate to Test, and More](https://blog.jetbrains.com/go/2017/10/18/gogland-eap-16-file-watcher-tons-of-new-inspections-smarter-navigate-to-test-and-more/)
依存性の注入(Dependency Injection)という言葉が難し過ぎる

# <font color="#009F8C">**まえがき**</font>
**DI(Dependency Injection)**という一種のデザインパターンがある。
日本語では**依存性の注入**というかなり意味のわからない訳になっている。

このパワーワードを理解することを目標に頑張って記事を書きます。

# <font color="#009F8C">**依存性の注入という言葉が混乱を生む一番の原因**</font>

依存性の注入(DI)
これを私が理解できる言葉に置き換えるとしたらこうなる。

**<font color="red">プログラムに具体的な処理を書くのを辞めましたパターン</font>**

**依存性の注入**じゃなくて**具体性の削除**の方が正しいと思う。

あえて名前を付けるならこうなる
**Concreteness Deletion(具体性の削除)**

こんな風にかっこつけて要約して名前つけたりする

すると

なにこれ、意味わかんない難民が沢山生まれる。

うん、かっこつけなくていい

**<font color="red">プログラムに具体的な処理を書くのを辞めましたパターン</font>**

これでよくない？だめ？

# <font color="#009F8C">**DIのメリット**</font>
具体的な事を書かないので書くことが減ります。

# <font color="#009F8C">**DIのデメリット**</font>
具体的な事を書かないのでコードだけ見ても何が起きてるか意味がわからなくなります。

# <font color="#009F8C">**依存性ってつまりなんだという話**</font>

元ゲームプログラマーなのでゲーム系のネタで考えてみる。
例えばゾンビ(敵)を作ろうとなったとき

```java
class Zombie extends Enemy{

	private String name = "ゾンビ";
	private int maxHp = 999;
	private int hp = 999;

}
```

インスタンス変数に具体的な値を書いているので
パッと見で敵の名前セットしてるなー、最大HPセットしてるなーってわかると思う

大雑把に言えば、こういう具体的な部分を**<font color="red">依存性</font>**と呼んでいる
(依存性じゃなくて、具体性と呼んでくれればまだよかったものを。。。)

# <font color="#009F8C">**依存性の注入というより具体性の注入**</font>

敵の名前とか最大HPとかのデータをテキストファイルに書いておいて
プログラムでその内容を読み込んで使えばいいじゃんという流れになる

名前やHPを変えたいときはプログラムじゃなくて
テキストファイル(つまりは設定ファイル)の内容を変えるだけでいい

プログラムは変える必要がない
つまり再コンパイルがいらないのである
これは素晴らしいね

でかいプロジェクトだとコンパイルで１時間とかあるからね
プログラムちょっと変えて１時間コンパイルは耐えがたい

というわけでデータはプログラム内に書かない
テキストファイルやらデータベースやらに保存して
そのデータをプログラムで読み込んで使うのが主流となった。

これがDIの根幹というか
データを外に出して(ファイルとかに保存して)、そのデータを改めてプログラムに注入
**依存性の注入**というか**具体性の注入**って事じゃなかろうか

# <font color="#009F8C">**DIについて個人的な感想**</font>

最近のDIは書くこと減らそうとしすぎて
わけわからんレベルに達している気がします。
特にアノテーション禁術はカオスすぎる。

DIはプログラムを整理しようとして頑張っていたら
整理しすぎてしまって、正直やりすぎたわぁ
ってなったパターンなんだと個人的には思っています。

# <font color="#009F8C">**正直DIって呼ぶにふさわしいと思うもの**</font>

最近だといろんなパッケージを組み合わせて１つのアプリケーションを作るというのが当たり前になってきました

つまり最近のシステムは何かしらのパッケージがないと動かない
つまりシステムは何かしらのパッケージに依存している。

パッケージというのは腐る程存在していて
一体どれを使えばいいんだーっていうのがわからなくなってきたので
最近は細かい事は勝手にいい感じにやってくれるパッケージ管理ツールというのがある。
言語別にみるとだいたいこんな感じ。

Java → maven or gradle
PHP → composer
node.js → npm
Ruby → gems
Python → pip

これらのツールはシステムで使うパッケージ(プログラム)を
勝手にダウンロードして使えるように組み込んでくれる

これこそ依存性(依存するパッケージ)の注入やんって思うわけでした。
Gravでリンクカードを作る

リンクカードプラグインが無いっぽい感じがしたので作りました。
とはいえ[Shortcode Core](https://github.com/getgrav/grav-plugin-shortcode-core)プラグインを利用してカスタムショートコードを作っただけですが。

```LinkcardShortcode.php
<?php
namespace Grav\Plugin\Shortcodes;

use Thunder\Shortcode\Shortcode\ShortcodeInterface;
use Thunder\Shortcode\Shortcode\ProcessedShortcode;

class LinkcardShortcode extends Shortcode {
    public function init() {
        $this->shortcode->getHandlers()->add('site', function(ProcessedShortcode $sc) {
            $url = $sc->getParameter('url');
            $purl = parse_url($url);
            $img = $sc->getParameter('img');
            $content = $sc->getContent();
            $html = null;

            if($url){
                $data = $this->get_ogp($url,$img,$content);
                $img = $data['img'];
                $title = $data['title'];
                $desc = $data['desc'];

                $html = '<blockquote class="link panel panel-default"><a onclick="ga(\'send\',\'event\',\'BlogCard\',\'click\',location.href);" rel="noopener" target="_blank" href="'.$url.'">';
                $html .= '<img class="thumb pull-right" src="'.$img.'" alt="'.$title.'" /><span class="lead text-primary">'.$title.'</span>';
                $html .= '<p>'.$desc.'</p><footer><img class="favicon" src="//www.google.com/s2/favicons?domain_url='.urlencode($url).'" /> '.$purl['host'].'</footer><div class="clearfix"></div></a></blockquote>';
            }
            return $html;
        });
    }

    private function get_ogp($url,$img = null,$title = null){
        $context = stream_context_create(array(
        'http' => array('ignore_errors' => true)
        ));
        $html = file_get_contents($url, false, $context);
        $description = null;
        $thumb = null;

        if($html){
            preg_match('/<title>(.*)<\/title>/',$html,$mt);
            if($mt && $mt[1]){$title = $mt[1];}

            preg_match('/<meta property="og:image" content="http([^\n]*)"/',$html,$mi);
            if($mi && $mi[1]){$thumb = 'http'.$mi[1];}

            preg_match('/<meta name="description" content="([^\n]*)"/',$html,$md);
            if($md && $md[1]){$description = $md[1];}
            else{
                preg_match('/<meta property="og:description" content="([^\n]*)"/',$html,$md);
                if($md && $md[1]){$description = $md[1];}
            }
        }

        if($img){$thumb = $img;}
        elseif(!$thumb){$thumb = '/empty.gif';}
        $data = array(
            'title' => $title,
            'img' => $thumb,
            'desc' => mb_substr($description,0,200)
        );
        return $data;
    }
}
```

`[site url="" img=""]Title[/site]` みたいな感じで使えます。

OpenGraph.php（というかDOMDocument）がnamespace回りの何かにひっかかって使えなかったため、正規表現ゴリゴリになってしまいました。
empty.gif（画像が無かった時の代替）は各自ご用意ください。

file_get_contentで403等が返ってきた時の回避方法は此方を参考にさせていただきました。
https://blog.manabusakai.com/2013/02/file-get-contents-status-code/

OGPだけではなくTwitter card情報から取ってくるとか、細かいカスタマイズは各自でお願いします。

Gravのキャッシュシステムをよく解っていないので、先方に負荷がかかるようならまた修正します。

Gistにも置いておきました。
https://gist.github.com/yukari-n/2920b9ead12ba6082a4d69f7a1f5b171

※この記事は2018-05-19 09:00公開のブログ記事を移転してきたものです。
python　自分用メモr4 jsonファイルで英単語辞書

##実行環境

* MacBook Air (11-inch, Mid 2012)
* JupyterLab (from Anaconda)
* Python 3.6.4


##まえがき
jsonファイルをつかって辞書を作成した。
jsonとは？ A. Javascript Object Notationの略。テキストデータ。
Qiitaは画像しかアップロードできないんすねぇ。

##教材
https://www.udemy.com/the-python-mega-course/learn/v4/content

##英単語辞書
英単語のjsonファイル
https://github.com/pipinstallbadapple330/file

```py
import json
from difflib import get_close_matches

data = json.load(open("data.json"))

def interact_with_json():
    try:
        key = input("Enter Word: ").lower()
    except:
        pass
    if key in data:
        return [key] + data[key]
    elif key.capitalize() in data:
        return [key.capitalize()] +  data[key.capitalize()]
    elif key.upper() in data:
        return [key.upper()] + data[key.upper()]
    else:
        return close_match(key, data)
    
def close_match(key, data):
    match=get_close_matches(key, data.keys(), n=10)
    if not match:
        return "Not in Dictonary, please spell check"
    if input(f"Do you mean {match[0]}?: y or n")[:1].lower()== "y":
        return [match[0]] + data[match[0]]
    else:
        print("Similar word list")
        for i in range(len(match)):
            print(f"{i+1}. ",match[i])
        while True:
            try:
                rq = int(input("Type number you want, or Type any other number to stop"))
                if 1 <= rq <= 10:
                    return [match[rq-1]] + data[match[rq-1]]
                else:
                    return "Not in Dictonary, please spell check"
            except:
                print("Number please")
                continue


if __name__ == "__main__":
    print("Welcome to English dictonary")
    output = interact_with_json()
    if type(output) == list:
        print(output[0])
        n = 1
        for m in output[1:]:
            print(f"{n}.",m)
            n += 1
    else:
        print(output)
```
1. 先頭のみ大文字(America)。全部大文字(NATO)。小文字(rain)などの英単語を含むjsonファイルを使用。
2. `difflib`ライブラリーの`get_close_method`で誤差率60％以内の単語を提案するような仕様。

##jsonファイルの作成

```py
any_dictionary = {"C": "\u3042", "A": {"i": 1, "j": 2}, "B": [{"X": 1, "Y": 10}, {"X": 2, "Y": 20}]} #1
convert_to_string = str(any_dictionary)#2
d ='"'.join((s.split("'")))    #3

with open("test.json", "w") as file:
    file.write(d)
```
1. jsonファイルに保存するのにデータタイプ`dict`ならなんでも保存できそう。
2. データ型を文字列に変更。`f"{dict_name}"`だろうと`.format`でもなんでもいい。
3. どうやらdict内部のkeyの文字列に`'`(シングルコーテーション)を使うとjsonファイルとして扱われない。`"`(ダブルクオーテーション)を使う必要がある。辞書型を文字列になおすとデフォルトで`'`が使われているため修正する必要がある。`replace("'", '"')`だとうまく動かなかった。
4. `with open("file_name") as file:`は同じディレクトリのファイルを開く。txt, csv, jsonなどのファイルを読み込んだり、編集したりできる。存在しない`file_name`を渡すと新規作成される。`open()`でファイルをひらくと`close()`する必要がある。基本的に`with open() as ...`の形で開くほうが吉。
5. `open()`にはいくつかモードがある。w, r, a, +をつけたりつけなかったりできる。詳しくは割愛。help嫁。juypiterlabならメソッドか関数の()の中で`shift + tab`すると英語の勉強ができる。`help(メソッド名or関数名)`でもヘルプを開ける。具体的には`help(open)`。

##おまけ：ポケモン図鑑
jsonファイルの引用元:
https://github.com/kotofurumiya/pokemon_data

```py
import json
poke = json.load(open("pokemon_data.json"))#list
name = input("名前をカタカナで入力")
for i in poke:
    if i["name"] == name:
        print(i)
```
そのうちGUIの練習に使う。


##あとがき
蚊のかゆいのと、ブーンって音なくしてくれたら共存できる。
C# DynamicJsonの使い方 (1)JSON→クラス (2)JSON→連想配列

.INI ファイルを駆逐したい。

# DynamicJson の入手方法。
Visual Studio 2017 を使うのが早い。

1. [ツール(T)] - [NuGet パッケージ マネージャー(N)] - [ソリューションの NuGet パッケージマネージャー管理(N)...] - [参照] をクリックする。
2. テキストボックスに「dynamicjson」と打鍵して [Enter]キーを押す。

あとは何とかしろ。

# 使い方。

ソースは GitHub に上げてあるが……。
https://github.com/muzudho/CsharpDynamicJsonBestPractice/tree/master/CsharpDynamicJsonBestPractice


```
using Codeplex.Data; // DynamicJson はこれ。
using CsharpDynamicJsonBestPractice.Model; // 自分で好きに作れだぜ。
using System.Diagnostics; // Trace とかこれ。
using System.IO; // ファイル読み込みはこれ。
```

とりあえず　こんな感じで ファイルの冒頭で using しろだぜ。
そして。

```
var json = DynamicJson.Parse(File.ReadAllText("./CsDynamicJsonUsage-config.json"));
```

テキストファイルを読み込んで Parse すればいい。
あと　もう１発。

```
// 連想配列以外の形は取れるはず。
ConfigModel config = json.Deserialize<ConfigModel>();
```

連想配列以外の部分は クラスに押し込んでくれる。

ただし、

```
### ok
public string name { get; set; }

### ignored
public string name;
```

JSON のキー名と プロパティ名を合わせろだぜ。プロパティーは get set のアクセッサーにしろだぜ。

詳しくはソースを見ろだぜ。

# 連想配列の読み取り方。

```
// 連想配列の形になっている dishMap は、Deserialize では取れない。DynamicJson型から直接取る。
foreach (string key in json.dishMap.GetDynamicMemberNames())
{
    Trace.WriteLine($"ENTRY {key} is {json.dishMap[key]}.");
}
```

Parse して取ったオブジェクトを ドット(.)アクセスしたり、インデクサー（[]）アクセスしたりして
連想配列になっているところは ```.GetDynamicMemberNames()``` でキーを取り出せだぜ。

あとはソースを見て考えろだぜ。


.INI ファイルより便利だろ。
.INI ファイルを駆逐したい。
楽しい情報領域演習に(みんなの大好きなwindows 10で)備える

この記事を読んでいただきありがとうございます。
至らない点もあるとはございますが楽しい(死に顔)情報領域演習をお家でも楽しむための準備をする記事になります。
適宜'''yes'''を打ったりしながら進めていってください。

# まずはMicrosoft storeでubuntuをインストールします。

ごめんなさい。いろんなところをみながらwindows subsystem for Linuxでubuntuを導入してください

*次に下記のコマンドをubuntuアプリ上で実行してください。*

```
sudo apt update
sudo apt upgrade
```

これで後でいろいろやるための準備が整いました。

# 日本語化をする

優秀な皆さんは英語が得意だとは思いますが、念のため日本語化しておきます。

*下記のコマンドをubuntuアプリ上で実行してください。*

```
sudo apt -y install language-pack-ja
sudo update-local LANG=ja_JP.UTF8
```

# タイムゾーンを日本のものに設定する

*次に下記のコマンドをubuntuアプリ上で実行してください。*

```
sudo dpkg-reconfigure tzdata
```

紫色？が背景のものが表示されるはずなので日本を選ぶために

asia

Tokyo

の順番で選択をしていってください

# manコマンドで出てくるマニュアルを日本語で表示されるようにする

わからないからマニュアルを見ているのに英語で...

*下記のコマンドをubuntuアプリ上で実行してください。*

```
sudo apt -y install manpages-ja manpages-ja-dev
```

# 情報領域演習第二でお友達になるアセンブリを実行する環境を整える

*下記のコマンドをubuntuアプリ上で実行してください。*

```
sudo apt-get install spim
```

# 最後にC言語をコンパイルしたりするための準備をする

*下記のコマンドをubuntuアプリ上で実行してください。*

```
sudo apt install build-essential
```

# あとがき

最後まで読んでいただきありがとうございます。
何かマズイ点やその他もろもろがあればコメントしてくれると嬉しいです。

この記事は新しいwindows 10の端末で課題をやるための環境構築をするときに不便が無いようにするために書きました~~（自分用のメモというスタンスをとって逃げ道を作っていくスタイル）~~
arXivの検索が廃止予定の検索と言われたので新検索に変更した


(どなたかの記事からぱく^H^H^H^Hを参考にして)アンテナに登録していた機械学習関連のarXivの検索URLが、

> Deprecated Search
>
> We have reimplemented arXiv's search feature. This page is still available for those who need to access the classic system, but we encourage you to update to the new feature if possible. A description of the new system is available on the arXiv blog.

とのことになっていることにさっき気付いたので更新しました。再実装された検索はとても[改善さ](https://blogs.cornell.edu/arxiv/2018/04/17/new-release-arxiv-search-v0-1/)れていますね! (TeXで検索できたり!)

## Bengio先生 の arXiv

http://arxiv.org/find/cs/1/au:+Bengio_Y/0/1/0/all/0/1

→ https://arxiv.org/search/advanced?advanced=&terms-0-term=Yoshua+Bengio&terms-0-field=author&order=-announced_date_first

## Paragraph VectorのQuoc LeさんarXiv

http://arxiv.org/find/cs/1/au:+Le_Q/0/1/0/all/0/1

→ https://arxiv.org/search/advanced?advanced=&terms-0-term=Quoc+Le&terms-0-field=author&order=-announced_date_first

## word2vecで有名なMikolovさんのarXiv

http://arxiv.org/find/cs/1/au:+Mikolov_T/0/1/0/all/0/1

→ https://arxiv.org/search/?searchtype=author&query=Mikolov%2C+T


## facebook の Weston さん arXiv

http://arxiv.org/find/cs/1/au:+Weston_J/0/1/0/all/0/1

→ https://arxiv.org/search/?searchtype=author&query=Weston%2C+J

## facebook の Bordes さん arXiv

http://arxiv.org/find/cs/1/au:+Bordes_A/0/1/0/all/0/1

→ https://arxiv.org/search/?searchtype=author&query=Bordes%2C+A

## Hinton 先生の arXiv

https://arxiv.org/search/?searchtype=author&query=Hinton%2C+G+E
Dockerを使ってLet's Encrypt で Nginx にSSLを簡単に設定

元記事
https://finnian.io/blog/ssl-with-docker-swarm-lets-encrypt-and-nginx/

NginxのSSLを設定するのに、いちいちconfigファイルを変更するのがややこしいので、Dockerを使って簡単に証明書を取得する

```
location ^~ /.well-known/acme-challenge/ {
```

いちいちこういうふうにletsencryptのための設定を加味する必要はないし、apt-getでソフトを取得する必要はない（Dockerさえあれば）

## 手順
1. Dockerをインストール
2. Docker runで証明書を取得
3. nginxに証明書の場所を追記
4. 完了

超簡単です。

## 手順2
この下記コマンドを実行し、証明書を取得する

```
docker run -d \
 --name nginx-auto-ssl \
 --restart on-failure \
 -p 80:80 \
 -p 443:443 \
 -e ALLOWED_DOMAINS=example.com \
 -e SITES=‘example.com=111.11.11.111:443’ \
 valian/docker-nginx-auto-ssl
```
111.11.11.111 には、vpsの実ipアドレスを記載してください。

## 手順3
手順2で作成した証明書と、鍵が

`/etc/letsencrypt/live/example.com/`

ここに入っているはずですので、確認してください。
あれば、nginxに証明書と鍵の場所を追記し、sslの他の設定をして完了です。

```
ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
```

## このやり方のなにが良いか

このやり方で一番良かったことは、Docker + nginx でWebサーバーを動かしていた場合です。
nginx on dockerの環境の場合、letsencryptを使ってsslを取得するのに、地獄の苦しみがあります。
それがなくなったことは、非常に嬉しいです。

ひたすら元記事に感謝です。
どこでもいいからGitHubのorganizationに入りたいなら`invite-contributors.yml`を見るといい（のかな？）

https://github.com/apps/invite-contributors/

`./.github/invite-contributors.yml`のファイルが存在するリポジトリにプルリクエストしてマージされれば、`invite`のメールが来るってことかな？

[stylelint](https://github.com/stylelint/stylelint)にプルリクしたらあっさりorganizationに入れたので、なんで！？って思って調べた。


（久しぶりにこんなに短い記事書いた。）
Rails 位置情報の取得、テーブルから近い順に羅列

#ソースコード

```javascript:
<% if current_member && !@member == current_member %>
    var button = document.getElementById("practice-oneclick");
    // 現在地を取得する関数
    button.onclick = function () {
        //相互フォローなら
        <% if mutually_follow?(@member.id) %>

        // Geolocationが使用可能かチェック
        var dfd = $.Deferred();
        if (!window.navigator.geolocation) dfd.reject();

        // 現在地の取得
        window.navigator.geolocation.getCurrentPosition(
            // Success
            function (position) {
              alert('現在地から近いコートが複数個、候補として出ますので該当のテニスコートを確認の上、決定ボタンをクリックしてください')
                dfd.resolve(position);
                console.log(position.coords.latitude);
                console.log("おけ");
                var params = getParameter();
                params['latitude'] = position.coords.latitude;
                params['longitude'] = position.coords.longitude;
                var url = location.pathname.split('/');
                params['id'] = url[2];
                window.location.href = setParameter(params);
            },
            // Error
            function (error) {
                alert('ご使用中のブラウザは現在地検索に対応されておりません。')
                console.log("だめ");
                dfd.reject();
            },
            // Options
            {
                enableHighAccuracy: true, //位置情報の精度を高く
                timeout: 10000, //10秒でタイムアウト
                maximumAge: 600000 //10分間有効
            }
        );
        return dfd.promise();
        <% else %>
          var error = document.getElementById('error');
          error.innerHTML = "この機能を利用するには相互フォローしている必要があります。";
          error.className = "error active";
          $('#practice-oneclick').addClass('disable');
          setTimeout(function(){
              error.innerHTML = "";
              error.className = "error";
              console.log(button);
          }, 3000);
        <% end %>
    };
<% end %>
```

#参考
http://webdesign-dackel.com/2015/01/18/google-maps-api/

https://qiita.com/Ingward/items/6ad7702dd313484f2b1c

https://developer.mozilla.org/ja/docs/Web/API/Geolocation/Using_geolocation


SSL環境でないと動作しない
特定の文字列を含むファイルを検索【find・grep・xargs】

### ファイル名に特定の文字列を含むファイルを検索する

```
$ find . -type f -name "*[検索したい文字列]*"
```
<hr>

### ファイル内に特定の文字列を含むファイルを検索する

```
$ grep [検索したい文字列] -rl .
```
<hr>
### ファイル名とファイル内に特定の文字列を含むファイルを検索する

```
$ find . -name "*[検索したい文字列]*" | xargs grep [検索したい文字列]
```
AWS CLIで複数の認証情報を切り替える際にプロファイルを指定するのが大変そうなので現在いるGitのリポジトリから自動指定する


AWS CLIで複数の認証情報を切り替える際にプロファイルを指定するのが大変そうなので現在いるGitのリポジトリから自動指定できると良いなと思いました。

# 複数のプロファイルを用意
まず複数の認証情報を設定ファイルに記述します。

[aws-cliにて、複数の認証情報を使い分けたい場合の設定方法](https://qiita.com/bakira/items/3a4876cbb39f9a7ec3b8)


```conf:~/.aws/config
[profile repo1]
output = json
region = {リージョン}

[profile repo2]
output = json
region = {リージョン}
```

```conf:~/.aws/credentials
[repo1]
aws_access_key_id = {アクセスキー}
aws_secret_access_key = {シークレットキー}

[repo2]
aws_access_key_id = {アクセスキー}
aws_secret_access_key = {シークレットキー}
```

`aws`コマンドで`--profile`指定が自動で出るように調整します。

```bash:~/.bashrc
$ alias aws='aws --profile=$(basename $(git rev-parse --show-toplevel 2>/dev/null || echo "default"))'
```

| サブコマンド | 説明 |
|-----|-----|
| `git rev-parse --show-toplevel` | 現在位置のGitのリポジトリ名を取得 |
| 2>/dev/null &#124;&#124; echo "default" | Gitじゃなければ`default`プロファイルを使う |


実行例

```bash
$ cd ~/git/repo1
$ aws s3 ls
2018-01-01 repo1_dir1
2017-01-01 repo1_dir2
2016-01-01 repo1_dir3
.....


$ cd ~/git/repo2
$ aws s3 ls
2018-01-01 repo2_dir1
2017-01-01 repo2_dir2
2016-01-01 repo2_dir3
.....
```

これで認証情報の切り替えが捗りそうでした！

# 経緯
AWS CLIを使う機会があったんですが、「プロジェクトごととかで認証情報を切り替えるの大変だよね」という話があって、カレントディレクトリで切り替え出来ないかなと思いました。
「herokuコマンドやWP-CLIコマンドが現在位置の設定ファイルをデフォルトで読み込むので便利だなぁ」ということで、そこに似せてみました。
「現在ディレクトリのリポジトリ名 = プロファイル名」として、リポジトリ名ごとにプロファイルを作成して対応させます。
Python PillowでPNGからGIFを作る

- 同ディレクトリ内にあるPNGからGIFを生成する
- Python 3.6.5

# ディレクトリ構成


```
gif-test
  ├── main.py
  ├── requirements.txt
  ├── 001.png
  ├── 002.png
  └── 003.png
```

# ファイルの内容

- requirements.txt

    ```txt:requirements.txt
    Pillow==5.2.0
    ```

- main.py

    ```python:main.py
    from PIL import Image
    import glob
    
    files = sorted(glob.glob('./*.png'))
    images = list(map(lambda file: Image.open(file), files))

    images[0].save('out.gif', save_all=True, append_images=images[1:], duration=400, loop=0)
    ```
- *.png
  - 適当なファイルを

# 参考
- [Docs » Handbook » Appendices » Image file formats](https://pillow.readthedocs.io/en/5.2.x/handbook/image-file-formats.html#gif)
- [[Python]ディレクトリ内にある複数のファイルをソートして読み込む](https://qiita.com/3000manJPY/items/6100452792e16d0ae921)
たまーに使うgitコマンドまとめ

自分が個人的にたまーに使うけどすごく大事なgitコマンドを備忘録＆チートシートとしてメモしておきます。


# たまーに使うコマンド

## コミットの取り消し

直前のコミットの取り消し。```--soft``` でワークディレクトリの内容をそのままにする。```--hard``` にするとコミット内容も消す。

```bash
$ git reset --soft HEAD^
```


## あるコミットの差分を見る

```^``` で1つ前のハッシュとの比較というコマンドになる。```svn diff -c revnum``` は便利だった。

```bash
$ git diff 確認したいコミットのSHA^..確認したいコミットのSHA
```

## タグAとタグBの差分を見る

```bash
$ git diff --diff-filter=AMCRD tagA tagB

# ファイル名のみならこちら
$ git diff --name-only --diff-filter=AMCRD tagA tagB

# stat形式ならこちら
$ git diff --stat --diff-filter=AMCRD tagA tagB
```


## git merge のときに commit しない

```bash
$ git merge -no-commit branch_name
```


## リモートリポジトリのブランチを削除した後にローカルで表示される追跡ブランチを削除する

`git branch -d -r ブランチ名` で消せる

```bash
$ git branch -a
* master
...
  remotes/takke/release/v2.4.0-alpha1-prepare
  remotes/takke/update_appveyor_document
  remotes/takke/x64

$ git branch -d -r takke/update_appveyor_document
Deleted remote-tracking branch takke/update_appveyor_document (was 9fe8fd7c).

$ git branch -a
* master
...
  remotes/takke/release/v2.4.0-alpha1-prepare
  remotes/takke/x64
```



# 参考

- [\[Git\]コミットの取り消し、打ち消し、上書き - Qiita](https://qiita.com/shuntaro_tamura/items/06281261d893acf049ed)
- [忘れやすい人のための git diff チートシート - Qiita](https://qiita.com/shibukk/items/8c9362a5bd399b9c56be)
- [git merge のときに commit しない | Drowsy Dog's Diary](http://ka-zoo.net/2013/08/git-merge-without-commit/)
- [gitでtag(new)とtag(old)の差分を出力する - Qiita](https://qiita.com/reflet/items/8d3c42ccf489386e670a)
- [リモートリポジトリのブランチを削除した後にローカルで表示される追跡ブランチを削除する \- Qiita](https://qiita.com/color_box/items/b8f554995f01b1d7ead5)
HerokuのPostgreSQLにログインしてSQLを直接実行する。

HerokuでPostgreSQLに接続して直接SQLを実行したい。
`heroku pg:psql` コマンドを打ってログインできなかったので備忘録として残します。

環境は CentOS7.5です。

```sh
$ heroku pg:psql
--> Connecting to postgresql-nipple-114514
 ▸    The local psql command could not be located. For help installing psql, see
 ▸    https://devcenter.heroku.com/articles/heroku-postgresql#local-setup
```

ローカルの環境に psql コマンドが入っていないといけないみたいです。

## PostgreSQLのバージョンを確認する

```sh
$ heroku pg:info
=== DATABASE_URL
Plan:                  Hobby-dev
Status:                Available
Connections:           0/20
PG Version:            10.4
Created:               2018-07-12 10:55 UTC
Data Size:             8.2 MB
Tables:                6
Rows:                  5/10000 (In compliance)
Fork/Follow:           Unsupported
Rollback:              Unsupported
Continuous Protection: Off
Add-on:                postgresql-nipple-114514
```

バージョンを揃える必要があるので、herokuに入っているPostgreSQLのバージョンを確認します。10.4が入ってるみたいですね。

## PostgreSQL10.4 インストール

https://www.postgresql.jp PostgreSQL公式サイトを参考にインストールする。

```sh
$ sudo yum -y install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm
$ sudo yum -y install postgresql10
$ psql -V
psql (PostgreSQL) 10.4
```

PostgreSQL10.4がインストールできました。
psqlコマンドも使えるのでokですね。

```
$ heroku pg:psql
--> Connecting to postgresql-nipple-114514
psql (10.4)
SSL 接続 (プロトコル: TLSv1.2、暗号化方式: ECDHE-RSA-AES256-GCM-SHA384、ビット長: 256、圧縮: オフ)
"help" でヘルプを表示します。

app-name::DATABASE=>
```

接続できました！

## テーブル一覧

```
> \d
```

PostgreSQLって2文字でテーブル一覧表示できるんですね...
すごい...

```
> SELECT * FROM hogehoge;
```

SQLも実行できました。
【CentOS7】VCSA6.7デプロイしようとするとインストール画面が見切れる

#環境
**使用サーバー**
HP EliteBook 2560p

**使用vSphere**
ESXi6.5.0 ビルド番号：8294253

**使用vCenter**
vCenter Server Appliance6.7

#問題
CentOS7のOSが入ったVMを用いて、VCSA6.7のisoファイルをマウントしインストールしようとしたが、下記画像のようにインストール画面が見切れて画面右下に表示されるばずの「次へ」をクリックすることができない。

![alt](http://drive.google.com/uc?export=view&id=1GwuqxC2Nhs4s9I-xXuu57G285KM9-_2i)

#解決策
### xrandarコマンドで解像度を変更する
xrandarとだけ打ち込むと、現在の解像度や指定可能な解像度が表示される。

```ruby:
[root@localhost]# xrandr
Screen 0: minimum 1 x 1, current 1360 x 768, maximum 8192 x 8192
[省略]
800x600   60.00+ 60.32
1360x768  68.82*
1280x800  59.81
1152x864  75.00
1280x768  59.87
1024x768  60.00
640x480   59.94
[省略]
```

ここでは、縦のサイズを現在より拡大したいので、縦が一番長い”1152x64"を選択した。
オプション--outputで出力先を指定した。

```ruby:
[root@localhost]# xrandr --output Virtual1 --mode 1152x864
```

その結果、インストール画面が見切れることはなくなった。
同様の現象が起こっている方はやってみてください。
MSX キーボードイベント

```kbevt.c
/*
z80dk kbevt.c キーボードイベント
zcc +msx -lndos -create-app kbevt.c

WebMSXにa.casをドロップ
bload"cas:",r
*/

#include <stdio.h>

int snsmat(int line)
{
#asm
	ld	a, l
	call	$0141		; SNSMAT
	ld	l, a
	ld	h, 0
#endasm
}

char *mat[][] = {
	{ "7", "6", "5", "4", "3", "2", "1", "0" },
	{ "+", "[", "@", "\\", "^", "-", "9", "8" },
	{ "B", "A", "_", "/", ">", "<", "]", "*" },
	{ "J", "I", "H", "G", "F", "E", "D", "C" },
	{ "R", "Q", "P", "O", "N", "M", "L", "K" },
	{ "Z", "Y", "X", "W", "V", "U", "T", "S" },
	{ "F3", "F2", "F1", "KANA", "CPAS", "GRAPH", "CTRL", "SHIFT" },
	{ "RETURN", "SELECT", "BS", "STOP", "TAB", "ESC", "F5", "F4" },
	{ "RIGHT", "DOWN", "UP", "LEFT", "DEL", "INS", "CLS", "SPACE" },
	{ "4", "3", "2", "1", "0", "/", "+", "*" },
	{ ".", ",", "-", "9", "8", "7", "6", "5" }
};

void main()
{
	int bits[2][11];
	int iold = 0;
	int inew = 1;

	for (int i = 0; i <= 10; i++) {
		bits[iold][i] = snsmat(i);
	}

	for (;;) {
		for (int i = 0; i <= 10; i++) {
			bits[inew][i] = snsmat(i);
		}
		for (int i = 0; i <= 10; i++) {
			int bold = bits[iold][i];
			int bnew = bits[inew][i];
			int diff = bold ^ bnew;
			if (diff) {
				int bit = 0x80;
				for (int j = 0; j < 8; j++) {
					if (diff & bit) {
						printf("%s %s\n", mat[i][j],
							(bnew & bit) ? "Up" : "Down");
					}
					bit >>= 1;
				}
			}
		}
		iold = inew;
		inew = 1 - iold;
	}
}
```

[ROMカートリッジ版](http://webmsx.org/?rom=http://www.maroon.dti.ne.jp/lance/file/kbevt.rom)
[初学者]background: url();を使って画像が表示されない問題を解決した

# 目的 
- 個人開発をしている時、デザインを適用させようと思ったら画像の読み込みエラーが出たの対応した内容のメモ


# 条件
- ruby 2.4.1
- Rails 5.1.6

## 現象

![Image from Gyazo](https://i.gyazo.com/66ad95fd71b821f50cecb343301bc6e6.png)

##### エラー内容：<font color='red'>「img-01.jpgが見つからない」</font>と言われています。

```css:vendor/assets/stylesheets/main.css
background-image: url('/assets/images/img-01.jpg') 
```
 
## 期待値
画像を表示させたい！！！！！
 

# 手順(解決方法)
##### <font color='red'>public/assets/images配下に画像を設置(これだけ！)</font>

## public/assets/images配下に画像を設置

```bash:public/assets/imagesのディレクトリを作成する
mkdir public/assets/images # ディレクトリを作成
```

```text:img-01.jpgをpublic/assets/images配下に設置
public/assets/assets/images/img-01.jpg # 画像の設置
```

![Image from Gyazo](https://i.gyazo.com/7b320963d484ab96fbaea47b6b886a52.png)

## 解決した
画像の読み込みエラーがなくなった
![Image from Gyazo](https://i.gyazo.com/8d1a980bf19b7c69b381a8b6d1ade4bc.png)

## 所感
他の方の情報を見ると、上記のような設定をしなくても、development環境では問題なく画像を読み込めてるっぽいです。

## 追記

>2 アセットパイプラインの使用方法
以前のRailsでは、すべてのアセットはpublicディレクトリの下のimages、javascripts、stylesheetsなどのサブフォルダに置かれました。アセットパイプライン導入後は、app/assetsディレクトリがアセットの置き場所として推奨されています。このディレクトリに置かれたファイルはSprocketsミドルウェアによってサポートされます。

>アセットは引き続きpublicディレクトリ以下に置くことも可能です。config.serve_static_filesがtrueに設定されていると、publicディレクトリ以下に置かれているあらゆるアセットはアプリケーションまたはWebサーバーによって静的なファイルとして取り扱われます。プリプロセスが必要なファイルはapp/assetsディレクトリの下に置く必要があります。

>productionモードでは、Railsはプリコンパイルされたファイルをpublic/assetsに置きます。プリコンパイルされたファイルは、Webサーバーによって静的なアセットとして扱われます。app/assetsに置かれたファイルがそのままの形でproduction環境で使用されることは決してありません。

## 参考

[Ruby on Rails ガイド / アセットパイプライン](https://railsguides.jp/asset_pipeline.html)
[Railsでbackground: url();を使って画像が表示されない問題を解決する](http://blog.otsukasatoshi.com/entry/2017/08/04/231540#%E8%B5%B7%E3%81%93%E3%81%A3%E3%81%9F%E5%95%8F%E9%A1%8C
)
StreamでGroup By処理を行いたい(group-by-count, group-by-sum, group-by-max)

たとえば、ユーザとそのユーザが支払った金額が以下のような形で与えられるとします。

```java
public class Payment {
    
    public static void main(String[] args) {
        var payments = List.of(
            new Payment("A", 10),
            new Payment("B", 20),
            new Payment("B", 30),
            new Payment("C", 40),
            new Payment("C", 50),
            new Payment("C", 60)
        );
    }

    private String name;
    private int value;
    
    public Payment(String name, int value) {
        this.name = name;
        this.value = value;
    }
    public String getName() { return name; }
    public int getValue() { return value; }
}
```

では各々のユーザについて、支払いの個数を支払いの回数や支払った金額の合計、あるいは金額の最大値を求めたい。SQLであれば`GROUP BY`とウィンドウ関数の組み合わせで簡単に求めることができそうですが、JavaのStreamではどのように書くべきでしょうか?

```sql
select name, count(*) from payment group by name;
select name, sum(value) from payment group by name;
select name, max(value) from payment group by name;
```

全体的な方針としては`Collectors.groupingBy`を利用します。まず支払いの回数、つまり`group-by-count`。

```java
var counts = payments.stream().collect(Collectors.groupingBy(Payment::getName, Collectors.counting()));
counts.entrySet().stream().map(e -> e.getKey() + "=" + e.getValue()).forEach(System.out::println);
// A=1
// B=2
// C=3
```

`Collectors.counting`というその名もずばりなメソッドが用意されているので、これを使うのがよさそう。次に支払った金額の合計。要は`group-by-sum`ですが、これも`Collectors.summingInt`というわかりやすい名前のメソッドがあるので、これを利用するだけです。

```java
var sums = payments.stream().collect(Collectors.groupingBy(Payment::getName, Collectors.summingInt(Payment::getValue)));
sums.entrySet().stream().map(e -> e.getKey() + "=" + e.getValue()).forEach(System.out::println);
// A=10
// B=50
// C=150
```

最後に「支払った金額の最大値」=`group-by-max`ですが、個人的にはもっとも議論の余地があるように感じます。基本的な方針としては`Collectors.maxBy`を利用するのが手っ取り早そうです。

```java
var maxs = payments.stream().collect(Collectors.groupingBy(Payment::getName, Collectors.maxBy(Comparator.comparingInt(Payment::getValue))));
maxs.entrySet().stream().map(e -> e.getKey() + "=" + e.getValue().get().getValue()).forEach(System.out::println);
// A=10
// B=30
// C=60
```

このとき変数`maxs`の型は`Map<String, Optional<Payment>>`です。`Optional`は「nullかもしれない」ことを注意喚起するマーカのようなものですが、ここではビジネスロジック上、`maxs`のvalueがnullになることはありえません。要はここでの`Optional`はあまり意味がないので、取っ払いたい。言い換えれば`maxs`の型を`Map<String, Payment>`にしたいわけですが、このような場合は次のようにするのが手っ取り早そうです。

```java
var maxs = payments.stream().collect(Collectors.groupingBy(Payment::getName, Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparing(Payment::getValue)), Optional::get)));
maxs.entrySet().stream().map(e -> e.getKey() + "=" + e.getValue().getValue()).forEach(System.out::println);
// A=10
// B=30
// C=60
```

ただここまでくると、黒魔術感がただよいはじめるので、ほどほどにしたい(´・ω・｀)
Rubyのハッシュとシンボル

# はじめに

RailsやRubyなどで、Webアプリケーション作成をしていて、Rubyのハッシュとシンボルの理解が曖昧だったので、勉強した記録をまとめました。

# まずRubyのハッシュと、配列との違い

- ハッシュは「複数のデータをまとめて格納できるオブジェクト」という点において配列と同じ
- 異なる点
    - インデックスとして整数値以外でも使える
    - （一般的な）ハッシュでは要素の`並び順`が保証されない（が、Rubyのハッシュは[追加された順序が保持される](https://docs.ruby-lang.org/ja/latest/class/Hash.html)）
- ハッシュは`キー`とそれに対する`値`のペアでデータを管理することができる
- Rubyの場合、ハッシュの`キー`は、何らかのオブジェクト（文字列やシンボルなど）
- 他言語では連想配列とも呼ばれる

## ハッシュ

ハッシュとは、キーと値を組み合わせて保持するデータ構造です。

```rb

user = { "first_name" => "john", "last_name" => "lenon" }

puts user

=> {"first_name"=>"john", "last_name"=>"lenon"}
```

## 配列

配列とは、複数のデータをまとめて格納できるオブジェクトで、その意味においてはハッシュと同じです。
ただし、配列は任意のキーではなく、0から始まる数値（index）で要素の位置を指定します。

```rb

number = ["one", "two", "three"]

puts number

=>
one
two
three

puts number[0]
=>
one

puts number[1]
=>
two

puts number[2]
=>
three

```

# シンボルを用いたハッシュ

## シンボルとは？

シンボルとは主に文字列にコロン（`:`）を前に置いて定義したものです（ただし！文字列を`"_"`で囲む必要はありません）。たとえば、ハッシュのキーとしてシンボルを使う際は、コロンの後に置く場合もシンボルとなるケースがあります。ただ、通常は前に置きます。

### シンボルはオブジェクト

文字列とほぼ同じですが、メソッドや、ハッシュの値のキーなどの名前を識別するためのラベルなので、微妙に違います。

```rb

str = "string"

puts str.class

=> String



sym = :symbol

puts sym.class

=> Symbol
```

classメソッドは、そのオブジェクトがどのクラスに属しているかを返します。

## ハッシュはシンボルにも使える

上の例文で、下記のように書きましたが

```rb

user = { "first_name" => "john", "last_name" => "lenon" }

puts user

=> {"first_name"=>"john", "last_name"=>"lenon"}
```

キーがシンボルの場合、以下のようにハッシュリテラルを短く書く記法があります。

```rb

user = { first_name: "john", last_name: "lenon" }

puts user

=> {:first_name=>"john", :last_name=>"lenon"}
```

## ハッシュにシンボルを使うメリット

**メモリ消費が少なく、パフォーマンスが高い**というメリットがあるそうです。

- https://blog.isao.co.jp/organize-array-and-hash-and-symbol-of-ruby/
- https://www.sejuku.net/blog/13094

以上です。

# 参考

- https://railstutorial.jp/chapters/rails_flavored_ruby?version=5.1#sec-hashes_and_symbols
- https://qiita.com/iron-breaker/items/32710004f0bb2e2babb6
- https://blog.isao.co.jp/organize-array-and-hash-and-symbol-of-ruby/
- https://www.sejuku.net/blog/13094
なぜKaggleで予測結果をブレンディングすると良い結果がでるのか。弱学習器の強さについて。

# ブレンディング（Blending）とは
ブレンディングとは、通常０～１の範囲の値を持つN個の重みを、N個のモデルの予測結果に掛け合わせて最終的な予測結果を得る方法です。最も単純な形式は、N個のモデルの平均です。

ただ、単に複数のモデルをブレンディングすると、良いモデルができるわけではありません、というお話です。

# ブレンディングの例（配管工のおじさんを例に）
配管工事の例から始めましょう。
あなたは配管工を必要としています。そして以下の配管工を見つけました。

* 星5点満点中4.5点の評価
* 100ドルを請求

今、私はあなたに2人の配管工を紹介します、

* 彼らはともに星4つ × 2名
* 一人あたり75ドルを請求（合計150ドル）
* 私のオファーのセールスポイント
    * 彼ら2人は一度に1人だけが訪れることです。
    * 2人目の配管工は、1人目の配管工が正しく対応できなかったものを修正する。

あなたは自分で見つけた配管工を採用しますか？私のオファーを受けますか？
おそらく失笑しながら、自分で探した熟練配管工（星4.5）を採用するでしょう。この配管工であればおそらく良い仕事をしてくれるのに、なぜ2倍の時間をかけ、1.5倍の支払をする必要があるのか。

同じ前提で次のシチュエーションです。
今度は、私はあなたに4人の配管工を提供します。

* 彼らは星3つの評価 × 4名
* 一人あたり23ドルを請求(合計92ドル) 
* 彼らはあなたの家に一緒に来て、チームとして働く

あなたは8ドレ節約できるので、この提案について少し考えるでしょう。
でも最終的には、あなたは一人の熟練配管工と一緒に行くことを決めました。
なぜなら、

1. 100ドル支払っているのだから、彼は相当優秀である。
2. 他の4人の配管工は優秀とは言えません。もし優秀なら、より多くを請求してくるはずだ。

おそらく両方の意見は正しいかもしれませんが、それでも**あなたの選択が最良であることを保証するものではありません**。

ほとんどの社会では、1人の専門家が、まあまあの専門家3人の連携よりも優れているという暗黙のルールがあります。しかし、本当にその考えが正しいのか。
以下の例で見ていきましょう。

下記に示すのは、1と0で均等に分かれる10桁の数字の予測の簡単な例です。
つまりバイナリの予測結果です。

```
1111100000  正解文字列（Ground truth）

1110100000  強学習器 (90%)
```

良い専門家であるあなたからすると、私たちはとても良いモデルを持っているようにみえます。このモデルは0を予測するのに完璧で、1を予測するのにまあまあ良いです。


次に、今3つの弱学習モデルを持っているとします、どれも予測精度70％より優れません。

```
1111100000  正解文字列（Ground truth）

1011110100  弱学習器 (70%) ：1をよく予測できる

1101000010  弱学習器　(70%) ：0をよく予測できる

0110101001  弱学習器  (60%) ：何もうまく予測できない

1111100000  弱学習器の投票平均 (100%)
```

どれもとても良いモデルとは言えないですが、ここでは予測した結果の投票平均を取っていきましょう。
すなわちブレンディングです。
驚くことに、100％の正解率の予測結果を得ることができました。

直感的には、2つの良いモデルをブレンドすると良いモデルが得られ、その結果が個々のモデルよりも優れると思います。良いモデルと悪いモデルをブレンディングすることにより、良い結果が得られることは、明らかではありません。3つの悪いモデルをブレンディングすることで、本当に良いモデルが得られるかどうかは、明らかではありませんが、**そのようになる場合があります。**

この現象はしばしば「**弱学習器の強さ**」と呼ばれます。これは、3つの弱学習器を結合すると、素晴らしいモデルになることを意味するものではありません。補完的な専門知識が必要とされます。

もし、95%が重複する平凡な知識を持った3つのモデルがいた場合、「3つのモデルを結合した結果」と「個々のモデル」を比較しても、それぞれわずか5%しかユニークな知識を保持しないことを意味します。
一方で、知識の70%が重複しかない、3つの多様性溢れるモデルがいた場合、それぞれ独自の専門知識30%がもたらす「良いモデル」として、融合される可能性があります。

# アンサンブル学習に組み込むためには、どれくらい良いモデルが必要か

一般的な回答としては、**ランダムな結果を返す予測よりも優れたモデルであれば、アンサンブルへの組込みは有益**です。しかしながら、それはランダムな予測よりも良い予測をする各モデルがあれば、イコール有益であることを意味するわけではありません。

# うまくブレンディングするためには、なぜ「多様性」が必要か。

すでに98.5%の予測精度を持つモデルを持つときに、96%の予測モデルを含める価値はありますか？
答えとしては、

**あるかもしれないし、ないかもしれない。**

もしこれらの予測方法がとても類似していない限りにおいては、検討の余地があります。
指標として以下を提供します。

次の場合、ブレンディングによるメリットはありません。

* モデルのピアソンの相関係数が0.99を超えている
* かつ、コルモゴロフ–スミルノフ検定の結果が0.01を下回

逆に、以下の場合はブレンディングによるメリットがあります。

* 逆にピアソンが0.95以下
* かつ、スミルノフ検定が0.05よりも大きい。

上記検定をするためのスクリプトも提供されていますので、
必要な方は調べてみてください。

アンサンブルのモデルに組み込むときに、モデルが良いか悪いかはあまり重要ではありません。
それは他のモデルに対して、どれくらい多様性があるかに関係しています。



※この記事はKaggleをやっている中で、KaggleのExpertでもある[Tilii](https://www.kaggle.com/tilii7)さんがDiscussionに投稿していた内容が
とても有益でしたので、一部改変したものになります。

原文：The Good, the Bad and the Blended
https://www.kaggle.com/c/jigsaw-toxic-comment-classification-challenge/discussion/51058#290767
[Oracle]特定のセッションを一気に切断（プロセスもKILL）する

バッチプログラムの開発中などで、（不具合とかで）バッチが終了しないまま放置されたり、
重いバッチをどんどこ実行しまくってセッションが溢れかえったりするのはあるあるですよね。

そんな時に、指定した条件に当てはまるセッションを一気に（正確には２手間で）一掃する方法です。
まずは以下のSQLを実行します。

```sql
SELECT DISTINCT
  'ALTER SYSTEM KILL SESSION ''' || SID || ', ' || SERIAL# || ''' IMMEDIATE;' AS COMMAND
FROM
  V$SESSION
WHERE
  TYPE <> 'BACKGROUND'
  AND LOGON_TIME <= '2018/7/1' -- ログインした日付で絞り込む
  --AND USERNAME = ''          -- ログインユーザで絞り込む
  --AND MACHINE = ''           -- ログインしているクライアント端末で絞り込む
  --AND STATUS = 'INACTIVE'    -- セッションの状態で絞り込む
  --AND PROGRAM = 'A5M2.exe'   -- 接続しているアプリケーションで絞り込む
;
```

コメントにある様に、条件を指定して絞り込みを行います。
例えば、特定のマシンから実行されているセッションのみも可能です。
（例の場合は2018/7/1以前にログインしたセッション全て）

バックグラウンドはKILLしてはいけません。

実行結果は以下の様になります。

| COMMAND |
|:--|
| ALTER SYSTEM KILL SESSION '123, 456' IMMEDIATE; |

今度はこの`COMMAND`列の内容で実行するだけです。
セッションを大量にKILLするパターンはだいたい開発環境なので`IMMEDIATE`を指定しています。
これを指定しないと、何らかのエラーがあった場合にセッションは切れているけど、
サーバプロセスが死んでいない状態になることがあります。
（というより死なない事の方が多い気がします）
本番環境では指定しない方が無難です。
<font color="red">
※特定のセッションを切れるからといって、向かいのあの子をちょっと驚かせてやろうなどと悪戯に使ってはいけません！
セッションと一緒に縁も切れてしまいます。
</font>
BigQueryのUDFの落とし穴

## はじめに

自分はBigQueryのSQLを書いてる時はあまりパフォーマンスを気にしていない。
というのも大抵が一瞬で結果を返してくれるし、頑張って工夫しても結果的に返ってくる速度に大差がないからである。(厳密にはあるのかもしれないが誤差の範囲でしか無い)
SQLを書く際に気にしているのはいつも `参照するデータ量(=課金額)` である。

ただ、ついこ先日ユーザ定義関数(UDF)を利用したSQLで明確なパフォーマンス差が出てしまったのでメモ。

## 問題のSQL

```SQL
CREATE TEMPORARY FUNCTION  parseCode(x STRING)
RETURNS INT64
LANGUAGE js AS """
  var result = 0
  // 適当な処理
  return result;
""";
CREATE TEMPORARY FUNCTION codeLists() AS (
  ['code-111333', 'code-222444', 'code-333555']
);

WITH codes AS (
  SELECT
    parseCode(hoge) AS code
  FROM
    UNNEST (codeLists()) AS hoge
)

SELECT
  *
FROM
  `dataset.tableB` 
WHERE
  code IN (SELECT * FROM codes)
```
※ わかりやすいように実際のSQLを短くしている


やってることは至極単純で、ある一定の法則で生成されている `code` を適当なパース処理を加えてINT64型に直した後、検索したいテーブルに対して `WHERE句` に `SELECT IN` で指定しているだけ。
この際、tableBのデータ量はたかだか120万件程度だったにも関わらず3分待っても結果は返ってこなかった。

## 解決方法

#### 1. そもそもUDF使わない

UDFを書いている理由が特に無いならわざわざ挟む必要はない。
今回で言うならはじめから `codeLists` をINT64型の配列データにしておいてそれを直接渡してやればいいだけだった。
こうするだけでものの10秒で結果を返してくれるようになった。

#### 2. INNER JOINを使う

`SELECT IN` がパフォーマンス的に問題あるのは普通のRDBSに対してSQLを書いてる人なら聞いたことはあるはず。
ついつい楽な書き方なので `SELECT IN` を書いてしまいがちだが、普通に `INNER JOIN` を使えばUDFを挟んでいてもパフォーマンスの劣化は起きない。

```SQL
SELECT
  *
FROM
  `dataset.tableB`
INNER JOIN codes USING (code)
```

## 感想


BigQueryを利用し始めて結構経ったが明確にここまでパフォーマンス差が出たのは初めてだったので驚いてしまった。
とはいえ、BigQueryに慣れてしまいパフォーマンスに対する意識が薄れてしまったというのが今回の最大の問題なのかもしれない。
WSL上でWindows用のVimをクロスビルド

# 概要
俺用Vimのビルド環境をWSL上に移行したのでメモ

## 主なfeature
`+terminal` `+directx` `+lua/dyn` `+python/dyn` `+python3/dyn`

## 環境
`WSL + Ubuntu-18.04`

## ビルドスクリプト

```shell:build
#!/bin/bash

sudo apt install -y build-essential mingw-w64

git clone --depth 1 https://github.com/LuaJit/LuaJit LuaJit
git clone --depth 1 --single-branch -b 2.7 https://github.com/python/cpython python27
git clone --depth 1 --single-branch -b 3.7 https://github.com/python/cpython python37
cp python27/PC/pyconfig.h python27/Include
cp python37/PC/pyconfig.h python37/Include

git clone https://github.com/vim/vim
pushd vim

make -C src -f Make_ming.mak \
    CROSS_COMPILE=x86_64-w64-mingw32- WINDRES=x86_64-w64-mingw32-windres \
    GUI=no \
    LUA=../../LuaJit/src DYNAMIC_LUA=yes LUA_VER=51 \
    PYTHON=yes PYTHONINC=-I../../python27/Include PYTHON_VER=27 \
    PYTHON3=yes PYTHON3INC=-I../../python37/Include PYTHON3_VER=37 \
    STATIC_STDCPLUS=yes \
    -j 4

make -C src -f Make_ming.mak \
    CROSS_COMPILE=x86_64-w64-mingw32- WINDRES=x86_64-w64-mingw32-windres \
    GUI=yes \
    LUA=../../LuaJit/src DYNAMIC_LUA=yes LUA_VER=51 \
    PYTHON=yes PYTHONINC=-I../../python27/Include PYTHON_VER=27 \
    PYTHON3=yes PYTHON3INC=-I../../python37/Include PYTHON3_VER=37 \
    STATIC_STDCPLUS=yes \
    -j 4

popd
```

- src/vim.exe
- src/gvim.exe
- src/vimrun.exe
- runtime/

を適当な場所に設置する。
[Oracle]何もないところから数値や日付の連番を範囲指定してレコードとして取得する

SQLで連番になってるレコードが欲しい時ありませんか？

例えばSEQや日付がランダムに格納されているテーブルがあって、
INNER JOINをすると歯抜けになってしまう様な場合に
ガイドとして空レコードをくっつけたいなど。

Oracleならテーブル等を事前に用意しなくても内部ビューでいけます。

## 数値の場合

### SQL

```sql
WITH
  PARAMS AS(
    SELECT
      3 AS START_NUM,
      7 AS END_NUM
    FROM
      DUAL
  )
SELECT
  START_NUM + (ROWNUM - 1) AS SEQ
FROM
  DUAL,
  PARAMS
CONNECT BY
  LEVEL <= END_NUM - START_NUM + 1
;
```

### 実行結果

| SEQ  |
|:----:|
| 3    |
| 4    |
| 5    |
| 6    |
| 7    |

`START_NUM`に開始値、`END_NUM`に終了値を設定すると、
その範囲の連番をレコード（行に分けて）取得できます。

## 日付の場合

### SQL

```sql
WITH
  PARAMS AS(
    SELECT
      '20180625' AS SYMD,
      '20180701' AS EYMD
    FROM
      DUAL
  )
SELECT
  TO_DATE(SYMD, 'yyyymmdd') + (ROWNUM - 1) AS DAYS
FROM
  DUAL,
  PARAMS
CONNECT BY
  LEVEL <= TO_DATE(EYMD, 'yyyymmdd') - TO_DATE(SYMD, 'yyyymmdd') + 1
;
```

### 実行結果

|    DAYS   |
|:---------:|
| 2018/6/25 |
| 2018/6/26 |
| 2018/6/27 |
| 2018/6/28 |
| 2018/6/29 |
| 2018/6/30 |
| 2018/7/1  |

`SYMD`に開始日付、`EYMD`に終了日付を設定すると、
その範囲の連日をレコード（行に分けて）取得できます。

## 使い道（例）

カレンダー画面を作成するに当たって、土日の他に祝日と休業日をマークしたい。
祝日と休業日はイベントマスタに事前に登録しておく。
開始日付に月初、終了日付に月末を指定、イベントマスタをLEFT JOINして上記SQLを実行する。

ユーザプログラムはただ帰ってきたレコードをそのまま表示するだけでカレンダーを実装できます。ラクチン♪
応用として「今月の営業日数は何日？」もカウント取るだけでできちゃいます。ラクチン♪
IDOLcoin のDiscord Bot作成方法について

▼背景
IDOL coinのDiscord botとおなじBotを作成しようと思っています。
Discord Link:https://discord.gg/by3M5S

▼Bot実現したいこと(IDOLcoin のDiscord Botでできること）

　ERC20 ウォレット作成
　指定した相手にERC20トークンを送る　
　発言をしたコミュニティメンバー全員に指定した額を等分
　残高、depositアドレスを表示する
　depositアドレスを表示する
　指定したアドレスに指定した額を送金する
　指定したアドレスに残高から手数料を引いた額全てを送金する

▼知りたいこと
　このようなBotの作成手順
　このようなBotのサンプルコード

どうぞよろしくお願いいたします。
【git 初心者】git+atom連携方法まとめ

いつも使っているエディタAtomでバージョン管理をもっと楽にしたい&git勉強しなきゃと思ったのがきっかけです．
メモ代わりですが，ここに残しておきます．


#0,ローカル環境について

```
$git version
git version 2.15.2 (Apple Git-101.1)

$atom -version
Atom    : 1.28.1
Electron: 2.0.4
Chrome  : 61.0.3163.100
Node    : 8.9.3
```

#1，githubに保存しておくための手順
1, 始めに，github上で新しいレポジトリを作成する．
2, git clone “URL”でローカルのディレクトリに，gitのレポジトリを作成する．そしてcdで移動する．(git push -u origin masterのコマンドが必要かもしれない)
3, atom上でファイルを編集して保存する．
4, atom上で，ctrl+shift+”(“でgitのポップアップを出現させることができる．次に変更したファイル(色が変わっている)の中で，githubにアップロードするファイルをStageにあげる．
5, pushボタンで，githubに上げられる．(fetchボタンでmasterの変更点をローカルのレポジトリに反映できる．) 

コマンド上でローカルからgithub上にアップロードするときのメモ

```
#先ほど作成したGitHubリポジトリのURLをコピー&ペーストして、リモートブランチとして設定
git remote add origin https://github.com/your-name/project-name.git

# ローカルのファイルをアップロード
git push -u origin master
```

#2, 便利なコマンド

```
git reset —-hard ‘commit ID’
```

で，もし，ローカルのファイルを全部消してしまったとしても，pushした際のcommit IDを指定することで，当時のリポジトリ状態に戻すことができる．

アドバイス，コメント等あれば，よろしくお願いします．

参考
-https://qiita.com/devzip810/items/28ac253ea295ad6c2b73
JSのdatetimepickerで日付の範囲指定ができなくてハマったポイント

##ハマったこと
`bootstrap3-datetimepicker-rails`　を使うことで、railsでは簡単に日付カレンダーを作成することができる。

```test.html.ruby
f.text_field :date, label: true, class: "form-control datetimepicker"
```
すると、`id = test_date`(id = モデル名_カラム名)というように、formに独自のidが出来上がる。
ならこのidを指定してjs側で`datetimepicker`を操作すればいいのではないか？と思い以下の様に書いた。

```test.js
$(function() {
  $("#text_date").datetimepicker({
    minDate: new Date() //今日の日付から選択可
  })
});
```
しかし、`css`は操作できたものの、`datetimepicker`だけが操作できない。

```app/assets/javascripts/application.js
// = require moment
// = require bootstrap-datetimepicker
```

ここではしっかりと`bootstrap3-datetimepicker-rails` が読み込まれている。

##解決策
**formで新しくidを指定し、jsでそのidを操作する**

```test.html.ruby
f.text_field :date, label: true, class: "form-control", id: "test_datetimepicker"
```

```test.js
$(function() {
  $("#test_datetimepicker").datetimepicker({
    minDate: new Date() //今日の日付から選択可
  })
});
```

datetimepickerクラスを削除し、新たにidを指定。それをjsで操作したら無事解決しました。

##原因はなんだったのか。
`datetimepicker`クラスを指定して`datetimepicker`メソッドでいじってる場所があり、多分そっちの方が読み込まれてしまっているのでは?
と推測してるので、意見いただけると幸いです。。

```app/assets/javascripts/datetimepicker.js.coffee
  $('.datetimepicker').datetimepicker({
  ..........
```
wifiの研究

#Wi-Fi規格の種類

- IEEE 802.11a
5GHz帯を使用し、最大リンク速度54Mbps
- IEEE 802.11b
2.4GHz帯を使用し、最大リンク速度11Mbps
- IEEE 802.11c
IEEE 802.1d規格の改訂版
- IEEE 802.11d
データリンク層での、コンテンツサービスの品質を向上するための規格
- IEEE 802.11g
2.4GHz帯を使用し、最大リンク速度54Mbps
- IEEE 802.11n
IEEE 802.11aおよびIEEE 802.11gを高速化した規格。2.4GHz帯および5GHz帯を使用し、最大リンク速度600Mbps
- IEEE 802.11ac
IEEE 802.11nを高速化した規格。5GHz帯を使用し、最大リンク速度6.9Gbps
- IEEE 802.11ad
60GHz帯を使用し、最大リンク速度6.8Gbps

#無線LANのモード

無線LANでは子機同士の無線通信において、大きく2つのモードが存在します。
アドホックモードとインフラストラクチャモードです。アドホックモードはアクセスポイント(以降AP)と呼ばれる親機（基地局）は存在せず、子機（端末）同士が直接通信するモードです。最近では携帯用ゲーム機同士での通信にも使用されています。

##アドホックモード
アドホックモード利用の場合は通信対象となる子機（端末）のWirelessの設定を“アドホックモード”に設定して利用します。
一方、一般的な無線LANの利用モードはインフラストラクチャモードであり、この場合、子機（端末）間の通信は親機（AP）を介して行われます。

##インフラストラクチャモード
インフラストラクチャモードの接続は家庭内LAN、企業向けLANともに利用されています。
これら2つの接続モードのほかに親機（AP）同士で有線LANを無線接続するWDSモードが存在します。このモードは下記のように有線の敷設が困難な隣接ビル間接続や金属などの電波を通さない障害物があるときに迂回して通信する場合などで利用されます。

##WDSモード
なお、WDSモードは標準化されておらず、メーカー各社では各機種独自の中継方法が実装されています。そのため、異機種間でのWDS接続はできないケースが多く、注意が必要です。

#無線LANのセキュリティ

|用語	|説明	|セキュリティ強度|
|:--|:--|:--:|
|WEP|Wired Equivalent Privacy	RC4と呼ばれる暗号化アルゴリズムを元にした共有鍵暗号方式で、IEEE 802.11で採用された。秘密鍵には40bitまたは128bitのデータを使用する。|	△|
|WPA|Wi-Fi Protected Access	Wi-Fi Allianceが2002年に制定したセキュリティシステムで、暗号化と認証の組み合わせ。暗号化プロトコルにはTKIPを使用。エンタープライズ(EAPを利用したID,パスワード認証を使用)、パーソナル（PSK ”Pre Shared Key, 事前共有鍵”による暗号化方式を使用)の2種類がある。|	○|
|WPA2|Wi-Fi Protected Access2	Wi-Fi Allianceが2004年に制定したセキュリティシステム。AES暗号に対応し、WPAより堅牢なセキュリティ方式。WPAと同様にエンタープライズ及びパーソナルの2種類がある。|	◎|
|IEEE802.11i|	IEEEが規定する無線LANにおけるセキュリティに関する規格。WPAは標準化が遅れた802.11iに先行してWi-Fi Allianceが策定した基準であり、その後標準化された802.11iの必須機能をサポートしたWPA2が策定された。|	◎|
|TKIP|Temporal Key Integrity Protocol	パケット毎に暗号鍵を自動生成する暗号化プロトコル	|○|
|AES|Advanced Encryption Standard	米商務省標準技術局(NIST)によって2001年に米国政府の標準暗号化技術として認定された方式。2011年現在、最も強固なセキュリティ性を持った暗号化方式である。	|◎|

以上。
Ansible playbook | register での変数定義はタスクのスキップ時にもおこなわれる

# 疑問 : タスクが skip される時、 register での変数定義はされるのか？

例:

```yaml
tasks:
  - debug:
      msg: debug
    register: debugged_register
    when: false
```

# 答え : される

変数は未定義にならない。
スキップ理由などが記録される模様。

```json
{
  "changed": false,
  "skip_reason": "Conditional result was False",
  "skipped": true
}
```



# Playbookの例

```register.yml
- hosts: localhost
  tasks:
    - name: add register with execute debug module
      debug:
        msg: add debug module result into debugged_register variable
      register: debugged_register

    - name: show register variable values set by execute debug module
      debug:
        msg: "{{ debugged_register }}"

    - name: skip execute task but register got variable
      debug:
        msg: add register of debug module result!
      register: not_executed_module_register
      when: false

    - name: show not_executed_module_register variable
      debug:
        msg: "{{ not_executed_module_register }}"

    - assert:
        that:
          - not_executed_module_register is defined
          - not_executed_module_register is not changed
          - not_executed_module_register is skipped
 
``` 


# 実行例

```

TASK [add register with execute debug module] ****************************************************************************************************
ok: [localhost] => {
    "msg": "add debug module result into debugged_register variable"
}

TASK [show register variable values set by execute debug module] *********************************************************************************
ok: [localhost] => {
    "msg": {
        "changed": false, 
        "failed": false, 
        "msg": "add debug module result into debugged_register variable"
    }
}

TASK [skip execute task but register got variable] ***********************************************************************************************
skipping: [localhost]

TASK [show not_executed_module_register variable] ************************************************************************************************
ok: [localhost] => {
    "msg": {
        "changed": false, 
        "skip_reason": "Conditional result was False", 
        "skipped": true
    }
}

TASK [assert] ************************************************************************************************************************************
ok: [localhost] => {
    "changed": false, 
    "msg": "All assertions passed"
}

PLAY RECAP ***************************************************************************************************************************************
localhost                  : ok=5    changed=0    unreachable=0    failed=0   

```

# 環境

- ansible 2.6.0








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->