OmniAICreator/Qiita-1.07M huggingface dataset:
Javaを使ってブラウザに「HelloWorld」を表示させる

■Javaを使ってブラウザに「HelloWorld」を表示させる
・Tomcatのインストールと設定
→インストールして、「startup.bat」を実行して、ブラウザのURL欄に http://localhost:8080をしても接続拒否をされた
→なんやかんやで環境変数の設定を変更
　参考URL)https://eng-entrance.com/java-servlet-tomcat-install
→再度、「startup.bat」を実行して、ブラウザのURL欄に http://localhost:8080にアクセスして成功
　猫の画像が表示された
　※プロンプトのようなTomcatの黒画面が出てくるので閉じてはいけない
→その後、eclipsで「ファイル(F)-「その他(O)」-「動的Webプロジェクト」-適当にプロジェクト名を入れる
　-「Web-INF」と同じディレクトリーに「index.jsp」を入れとく※上の階層でF5-「ビューの表示(V)」-「その他」
　-「サーバー」-「開く」を選択-右クリックで新規(w)-「サーバー」-該当のサーバーを選択-使用したいプロジェクトを追加する
　-「完了」-ポートとかを変更させる-開始-http://localhost:<ポート番号>/プロジェクト名/
　※1つのサーバしか「始動済み,同期済み」しかできない
【C++】C++で作成したDLLをC++で呼ぶ(動的)

**もくじ**
→https://tera1707.com/entry/2022/02/06/144447

# やりたいこと
C++で作ったDLLを、C++から、動的に呼び出したい。

# 動的にDLLを呼ぶ
やり方は、下記の２つある。
このうち、動的に呼び出すのを今回やる。
(静的に呼ぶ方は[こちら](https://qiita.com/tera1707/items/56849d0eac773e24c4f8)を参照。)

| 呼出方法|やり方概要|DLL読込タイミング|必要ファイル|
|:--|---|---|---|
|静的|DllImportして、必要な関数をextern宣言し、使用する。※１|プログラム開始時|dllファイル(実行時)／libファイル(ビルド時)|
|動的|LoadModuleでDllを読込み、LoadLibraryで関数を読込む。※２|任意|dllファイル(lib不要)|

※１
関数のプロトタイプ宣言とLIBファイルの指定（コンパイラオプションでの指定または#pragma）のみで通常の関数の様に使える。
※２
LIBファイル・ヘッダーファイルのないDLLに使用できる。 

# DLL側(C++)
[以前の記事](https://qiita.com/tera1707/items/81042abaa62dc97e26ae)で書いたものと同じのを使う。

# 呼びだす側(C++)
静的にDLLを呼ぶときに行ったような、.libの参照設定や、DllImportは不要。
代わりに、以下のようなことを行う。

### コード上で、DLLの読み込み
下記のようなことを行う。
- LoadLibrary()を使用して、DLLファイルを読み込む。
- GetProcAddress()を使用して、DLL内の関数(アドレス)を取得。
- 関数コール実施。

``` ConsoleApplication2.cpp
#include "pch.h"
#include <windows.h>

typedef void(*FUNC1)();
typedef void(*FUNC2)(const wchar_t* str1, const wchar_t* str2);
typedef void(*FUNC3)(int count);

int main()
{
	// DLL呼び出し
	HMODULE hModule = LoadLibrary(L"DllTest.dll");

	if (NULL == hModule) return 1;

	// 関数読み込み
	FUNC1 func1 = (FUNC1)GetProcAddress(hModule, "Test_MyApi");
	FUNC2 func2 = (FUNC2)GetProcAddress(hModule, "Test_MyApi2");
	FUNC3 func3 = (FUNC3)GetProcAddress(hModule, "Test_MyApi3");

	// 関数コール実行
	func1();
	func2(L"あいうえお", L"かきくけこ");
	func3(4);

	return 0;
}

```

# 参考
呼び出し規約の種類(cdeclとか、stdcallとか)
https://konuma.org/blog/2006/01/02/post_1fd3/

extern "C" とは？
https://konuma.org/blog/2006/01/04/post_144e/

DLLを静的リンクで呼び出す
http://yamatyuu.net/computer/program/sdk/base/static_dll/index.html

# コード
https://github.com/tera1707/WPF-/tree/master/020_CppDllProject
Zabbix 4.2 リリースノート翻訳

Zabbix 4.2.0がリリースされました。

<img width="479" alt="2019-04-02_22h11_04.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/a1e8acd8-f88a-6701-b967-c4b15774544b.png">
https://twitter.com/zabbix_jp/status/1113020178135101440

それでは[リリースノート](https://www.zabbix.com/rn/rn4.2.0)を見ていきましょう。

#新機能と改良点
##前処理
・アイテムの前処理にテストオプションを実装しました
・アイテムの前処理のテストセッションでテスト値を保存する機能を実装しました
・値の前処理でJavaScliptが利用できるようになりました。
・Prometheusエージェントのための前処理を追加しました。
・依存アイテムでlldルールのサポートを追加しました
・lldルールに前処理を実装しました。
・lldマクロでカスタムjsonパスのサポートを実装しました

##アイテム
・ZabbixProxyでのアイテムの前処理サポートを追加しました
・「net.dns」「net.dns.record」アイテムでIPv6をサポートしました。
・vmware.eventlogアイテムに "skip"パラメータを追加しました
・vfs.dir.size []およびvfs.dir.count []に新しいオプションパラメータ<regex_excl_dir>を追加しました。
・Web監視でヘッダのマッチング監視を実装しました。

##WEB　UI

###マップ
・マップでアニメーションGIFサポートを追加しました
・マップ上の[ラベル]、[URL名]、[URL]で複数のマクロのサポートを追加しました

###通知
・WEB UIからメディアタイプをテストする機能が追加されました
・オンデマンドでHTML形式で電子メールメッセージを送信する機能を追加しました

###表示
・イベント詳細ページにトリガー名のコンテキストメニューを追加しました。
・トリガー一覧ページでホストとホストグループによるフィルター機能を追加しました。
・ホスト名および表示名としてネットワークディスカバリによる文字列を使用する機能が追加されました
・ダッシュボードウィジェットで非破壊的なサイズ変更と並べ替えを追加しました。

###ホスト
・ホストおよびテンプレートレベルのタグ機能を追加しました。
・自動登録のための正規表現ベースのマッチングを導入するための変更を追加しました

###グラフ
・シングルドットデータセットを実装しました
・svgグラフウィジェットに日時表示を実装しました

##ZabbixSender
・zabbix_senderでzabbix_agentd.confを利用して複数のサーバへの送信をサポートしました。
・zabbix_senderの出力に送信先ZabbixServerまたはZabbixProxyのホスト名/IPアドレスを表示するようになりました。

##ZabbixServer
・外部のZabbixServer/Proxyから内部メトリクス監視をサポートしました。

##DB
・timescaledbのサポートを追加しました

##API
・map.create（）およびmap.update（）メソッドにおける "elementid"のサポートをやめました
・httptest.create（）とhttptest.update（）メソッドの "headers"と "variables"の文字列フォーマットのサポートをやめました

#Zabbixのサポートサイクル
|リリース名|リリース日|フルサポート終了|リミテッドサポートの終了|
|:--|:--|:--|:--|
|Zabbix 4.2|2019年4月2日|2019年9月30日|2019年10月31日|
|Zabbix 4.0 LTS|2018年10月1日|2021年10月31日|2023年10月31日|
|Zabbix 3.0 LTS|2016年2月16日|2019年2月28日|2021年2月28日|
|Zabbix 2.2 LTS|2013年11月12日|2017年8月31日|2019年8月31日|

今回リリースされたZabbix 4.2はLTSのつかないポイントリリースとなります。
JavaScliptによる前処理など革新的な機能が多いですが、サポート期限が短くなっていますので、次期リリースが出た際には早急なアップグレードが必要となります。
本番環境への導入は、今後のアップデートの可否も含めてご検討ください。

以下のページで紹介しているスクリプトはZabbix 4.2でも問題なく動作します。
2分でZabbix Serverの構築が可能ですので
Zabbix 4.2の新規のを試してみたい方はぜひご利用ください。
[Zabbix 4.0 対応 Amazon Linux / Amazon Linux 2 でのZabbix Server自動構築](https://qiita.com/qryuu/items/c3fb49b33068d6cbabf1)
【C++】C++で作成したDLLをC++で呼ぶ(静的)

**もくじ**
→https://qiita.com/tera1707/items/4fda73d86eded283ec4f

# やりたいこと
C++で作ったDLLを、C++から、静的に呼び出したい。

# 静的にDLLを呼ぶ
やり方は、下記の２つある。
このうち、静的に呼び出すのを今回やる。
(動的に呼ぶ方は[こちら](https://qiita.com/tera1707/items/727e7ad4dc9f3205c137)を参照。)

| 呼出方法|やり方概要|DLL読込タイミング|必要ファイル|
|:--|---|---|---|
|静的|DllImportして、必要な関数をextern宣言し、使用する。※１|プログラム開始時|dllファイル(実行時)／libファイル(ビルド時)|
|動的|LoadModuleでDllを読込み、LoadLibraryで関数を読込む。※２|任意|dllファイル(lib不要)|

※１
関数のプロトタイプ宣言とLIBファイルの指定（コンパイラオプションでの指定または#pragma）のみで通常の関数の様に使える。
※２
LIBファイル・ヘッダーファイルのないDLLに使用できる。 

# DLL側(C++)
[以前の記事](https://qiita.com/tera1707/items/81042abaa62dc97e26ae)で書いたものと同じのを使う。

# 呼びだす側(C++)

### .libファイルの参照設定
まず、Dllと対になる.libファイルを参照するように設定追加する。

- pjのプロパティ > リンカー > 入力 の、追加の依存ファイルに、必要な.lib(ここではDllTest.lib)を追加![image.png](https://qiita-image-store.s3.amazonaws.com/0/352601/09160454-deb1-4b55-3348-5026e4d72166.png)

- pjのプロパティ > リンカー > 全般 の、追加のライブラリディレクトリに、その.libのあるフォルダを追加![image.png](https://qiita-image-store.s3.amazonaws.com/0/352601/81adb1ab-ff85-4c52-1864-f24f43588cbf.png)

※libの設定は、コード中に#pragmaでも実施できる様子。(今回は試さず)
　下記を参照。

　http://yamatyuu.net/computer/program/sdk/base/static_dll/index.html

### DllImportの実施

DllImportを行う。
今回は、Dll側の.hをインクルードすればDllImportできるようにしているので、そのようにする。


DLLを使う側では「VC_DLL_EXPORTS」は「extern "C" __declspec(dllimport)
」となる。(VC_DLL_EXPORTSが#defineされないため)

``` DllTest.h
#ifdef VC_DLL_EXPORTS
#undef VC_DLL_EXPORTS
#define VC_DLL_EXPORTS extern "C" __declspec(dllexport)
#else
#define VC_DLL_EXPORTS extern "C" __declspec(dllimport)
#endif

// エクスポート関数のプロトタイプ宣言
VC_DLL_EXPORTS void __cdecl Test_MyApi();
VC_DLL_EXPORTS void __cdecl Test_MyApi2(const wchar_t* lpText, const wchar_t* lpCaption);
VC_DLL_EXPORTS void __cdecl Test_MyApi3(int count);
```


※.hファイルは、Dll側の.hファイルを使う。(逆にいうと、.hファイルがないと、このやり方はできない？→「動的」に使うやり方でやる？)

### Dllの関数を呼ぶ

.cppファイルは、普通の関数のように呼ぶだけ。

``` ConsoleApplication1.cpp
#include "pch.h"
#include <iostream>
#include <windows.h>
#include <string.h>

#include "DllTest.h" 

int main()
{
	Test_MyApi();
	Test_MyApi2(L"あああ", L"いいい");
	Test_MyApi3(2);
}

```

# 参考
呼び出し規約の種類(cdeclとか、stdcallとか)
https://konuma.org/blog/2006/01/02/post_1fd3/

extern "C" とは？
https://konuma.org/blog/2006/01/04/post_144e/

DLLを静的リンクで呼び出す
http://yamatyuu.net/computer/program/sdk/base/static_dll/index.html

# コード
https://github.com/tera1707/WPF-/tree/master/020_CppDllProject
ABC - 078- A&B&C

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

#A問題

 - characterとして比較すれば大小がわかる

```java
	private void solveA() {
		char x = next().charAt(0);
		char y = next().charAt(0);

		out.println(x < y ? "<" : x > y ? ">" : "=");
	}
```

#B問題

 - 出力例1を参考にする

```java
	private void solveB() {
		int numX = nextInt();
		int numY = nextInt();
		int numZ = nextInt();

		int res = (numX - numZ) / (numY + numZ);

		out.println(res);
	}
```

#C問題

【一回のテストにかかる時間:x】
　$X = 1900*M + 100*(N-M)$

【確率:p】
　$p=1 / 2^m$

【期待値:y】
 $y=X + (1-p)(A=かかる時間)$

 -  $(1-p)(A=かかる時間)$は、$(1-p)$の確率で追加のテストケースを通すのにかかる時間のこと
 -  $X$は初回にかかる時間

 $(A=かかる時間)$ は、{$X$}ではなく、{$y$}　

 そのため【期待値:y】は、 $y=X + (1-p)y$ となる。

 これを解くと、 $y=X/p$　となる。
 上記より、$y=(1900*M + 100*(numN-numM)) * 2^m$　が導ける。

```java
	private void solveC() {
		int numN = nextInt();
		int numM = nextInt();

		long ans = 1900 * numM + 100 * (numN - numM);
		long res = (long) (ans * Math.pow(2, numM));
		out.println(res);
	}
```
機械学習(python3)メモ書き

pythonはそこらに情報が散乱しすぎてるし、加齢で記憶力が低下してるから自分用によく使う関数とかをまとめました。
初心者〜初級者向け。python3用。
ここに書いてることのコピペでいい感じになるように記載していく予定。
未完成です。

#python導入
気が向いたら記載。anacondaをダウンロードして指示されるままに入れる。
https://www.python.jp/install/anaconda/index.html

【ライブラリのインストール方法】
ターミナルから以下入力。
python -m pip install (ライブラリ名)
または
python3 -m pip install (ライブラリ名)

#導入するべきライブラリ
###共通
【基本的にマスト】
import numpy as np #数値
import pandas as np #データ解析
from matplotlib import pyplot #お絵かき用

【必要に応じて入れる】
import math #三角関数とかlogとか床関数とか
・・・・・・(思いつき次第追記)

###機械学習やる時は大体入れる
from sklearn.model_selection import GridSearchCV #グリッドサーチ
from sklearn.preprocessing import StandardScaler #スケーリング
これ以外は下記参照。

###pandas⇄numpy
【pandas→numpy】
data_numpy = np.array(data_pandas)

【numpy→pandas】
data_pandas = pa.DataFrame(data_numpy)

###データ切り
【numpy】
data_cut = data[XX:XX]

【pandas】
data_cut = data.loc(XX:XX,XX:XX) #XXは行・列の名前
data_cut = data.iloc(XX:XX,XX:XX) #XXは行・列の番号

###データ合体
【numpy】
data_con = np.vstack((data1, data2)) #縦方向に結合する場合
data_con = np.hstack((data1, data2)) #横方向に結合する場合
括弧が二重なのに注意(インプットは一つのタプルである必要があるため)

【numpy】
後日記載

###描画

###スケーリング
PLS,PCA,SVM,SVR等の場合は必要
RFの場合は不要

scaler = StandardScaler()
scaler.fit(XXX) #XXX:オートスケールの基準となる(標準偏差、平均をとる)データ
scaled_data = scaler.transform(YYY) #YYYはオートスケールさせるデータ。XXXと一緒でもOK

###分類分け(SVM)
from sklearn.svm import SVC　#SVM(サポートベクターマシーン)による分類
model = SVC() #Support Vector Classificationの略 (多分)
model.fit(Train_data)
model.predict(Test_data)


公式ホームページ(パラメータやメソッドはこちら参照)
https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html

###分類分け(OCSVM)
from sklearn.svm import OneClassSVM　
model = OneClassSVM() 
model.fit(Train_data)
model.predict(Test_data)
→境界内のデータは1、境界外のデータは-1になる

公式ホームページ(パラメータやメソッドはこちら参照)
https://scikit-learn.org/stable/modules/generated/sklearn.svm.OneClassSVM.html

###分類分け(kNN)
###回帰分析(PLS)
###回帰分析(SVR)
###回帰分析(ANN)
###回帰分析(RF)
###精度検証
【誰得】バッチファイルでポケモンフラッシュを再現してみた

# ポケモンフラッシュとは

[Wikipediaより](https://ja.wikipedia.org/wiki/%E3%83%9D%E3%82%B1%E3%83%A2%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%82%AF)

>ポケモンショックとは、1997年12月16日にテレビ東京および系列局 (TXN) で放送されたテレビアニメ『ポケットモンスター』（ポケモン）の視聴者が光過敏性発作などを起こした事件である。事件の影響でポケモンの放送が4カ月の間休止された。

>なお、「ポケモンショック」の名称は俗称であり、他にも「ポリゴンショック」「ポケモンパニック」「ポケモン（ポリゴン）事件」「ポケモン（ポリゴン）騒動」「ポケモン（ポリゴン）フラッシュ」などとも呼ばれる。 

私も当時ポケモン見てましたが、この回はたまたま見てませんでした。

# バッチで再現

colorコマンドを使うとコマンドプロンプトの文字色と背景色を変更できる。

引数が16進数なので、ランダムな数値を作って割当てて無限ループさせる。

```:pokemonFlash.bat
@echo off
title %~n0%~x0
setlocal

:loop

call :HEXRANNUM
set /a Foreground=Hex

call :HEXRANNUM
set /a Background=Hex

color %Foreground%%Background%

goto :loop
::------------------------------------------------
::ランダム16進数作成
::------------------------------------------------
:HEXRANNUM

	set /a Hex=%RANDOM%*16/32768
	if %Hex% equ 10 set Hex=A
	if %Hex% equ 11 set Hex=B
	if %Hex% equ 12 set Hex=C
	if %Hex% equ 13 set Hex=D
	if %Hex% equ 14 set Hex=E
	if %Hex% equ 15 set Hex=F

exit /b
::------------------------------------------------
```

# 実行結果

![pokemonFlash.gif](https://qiita-image-store.s3.amazonaws.com/0/96507/930476ce-b622-fdae-a360-70ca494b2afb.gif)

気分悪くなるのであんま見ない方がいいです。
deviseを使ってサクッとログイン認証。

railsのログイン機能が備わっている、gem「devise」を使ってサクッとログイン認証を設定します。


```ruby:Gemfile
gem 'devise'
```

```:terminal
$ rails g devise:install
$ rails generate devise User
$ rails db:migrate
```

http://localhost:3000/users/sign_up
PHPStanをLaravelに導入してみた

# はじめに
[こちら](https://speakerdeck.com/hirak/php-static-analysis)を拝見して静的解析やってみたいという思いが止められなくなりました。
実際にLaravelプロジェクトにPHPStanを導入してみましたので、そのことについて書いてみます。

大まかな環境は以下の通りです。

- Laravel:5.5系
- php:7.2系

# 参考にさせて頂いたサイト
- https://speakerdeck.com/hirak/php-static-analysis
- https://qiita.com/ngmy/items/1a8ef21c76d74c1d4dfe
- https://qiita.com/qiita_masaharu/items/24bf34579119628eefe2

# 導入
### 1.Larastanで入れてみる
[Larastan](https://github.com/nunomaduro/larastan)なる、LaravelのためのPHPStanのwrapperがあるらしい！
導入はcomposerで一発！

```
$ composer require --dev nunomaduro/larastan
```

でも、、、**Laravel5.5には入れられませんでした(´・ω・｀）**


> Requires:
　PHP 7.1.3+
　Laravel 5.6+


### 2.普通にcomposerで入れてみる
```
$ composer require --dev phpstan/phpstan
```

**依存関係がconflictして入らなかった(´・ω・｀）**

### 3.PHAR archiveで入れてみる
[公式](https://github.com/phpstan/phpstan#user-content-installation)によると他packageと依存関係がconflictした場合は、PHAR archiveを使うこと推奨みたいです。
[release notes](https://github.com/phpstan/phpstan/releases)よりphpstan.pharを入手して、プロジェクト内の適当な場所にぶっ込んであげましょう。

# 試しに解析してみる
とりあえず、プロジェクト内のapp配下をレベル0（最緩）で解析してみる。

```
$ vendor/bin/phpstan analyse -l 0 app
```

pharで入れた場合は以下

```
$ php phpstan.phar analyse -l 0 app
```
案の定、たくさんエラーが出る。。。

# エラー解消
エラー解消にもいくつか手段がありそうです。

### 1.自分で設定を書く
`phpstan.neon` という設定ファイルを自分で作成し、エラー解消してやりましょう。
[こちら](https://qiita.com/ngmy/items/1a8ef21c76d74c1d4dfe)の記事が詳しいです。

その他、独自でhelperを実装していたのでそちらもphpstan.neonのautoload_filesに追加する必要がありました。

```yaml:phpstan.neon
parameters:
  autoload_files:
    - ./app/myhelper.php
```

一応、 `phpstan.neon` を使用する際のコマンドは以下の通り。

```
$ vendor/bin/phpstan analyse -c phpstan.neon -l 0 app
```

または

```
$ php phpstan.phar analyse -c phpstan.neon -l 0 app
```

### 2.pluginを使う
[phpstan-laravel](https://github.com/Weebly/phpstan-laravel)というpluginがあり、こちらを使用するとエラーをある程度解消してくれるようです。
ただし、**Laravel5.5 or 5.6のみ対応**であり、更新される気配もなさそうなので今から利用するのはイマイチな気もします。。。

# 導入してみての感想
- 導入して解析可能にするだけならかなり簡単にできる。
- 解析の結果いくつかバグやphpdocがおかしい箇所もいくつか発見できた。
- 静的解析を活用するにはphpdocや型宣言（タイプヒンティング）を普段からしっかり書くことが必要。
- 逆に、PHPStanを導入することでphpdocや型宣言（タイプヒンティング）をしっかり書く意識が高まるという効果もあった。

次回はCIに静的解析を組み込んでみようと思います！
できるだけ元の配列インスタンスを保った操作を行う

Reactを使っていると、オブジェクトを変えずに済むときは、そのまま使いまわしたくなります。ということで、「できるだけ使い回す配列操作（`map`、`filter`、`sort`）」をやってみました。

## Reactと不変性（immutability）

Reactでは、`props`や`state`に入れるオブジェクトの破壊的変更は禁じ手となっていて、各種のメモ化でもインスタンスの一致で比較するなど、不変性を前提とした操作が各所に現れます。Facebook自身が、Immutable.jsという不変データ構造を提供しています。

ただ、「ライブラリを入れるには大げさすぎる」けど「配列に`map`、`filter`、`sort`といった操作をかける際に、何も変化しないのにインスタンスが別物になるのは鬱陶しい」みたいな場面があるかと思います。今回は、「元の配列から変化しないなら同じ配列インスタンスをそのまま返す」関数を作ってみます。

### お断り

なお、一般的な配列、そして不変性を前提としますので、以下のような状況は想定しません。

* `Array`以外のオブジェクトについて
* `Array.prototype`がプロトタイプ汚染されている場合
* `Object.defineProperty`で通常と違う（`writable`、`configurable`、`enumerable`のどれかを`false`にした、あるいはゲッターやセッターのある）プロパティを生やした場合
* コールバック関数や、そこから要素に対して行う操作が配列自身や要素を変更してしまう場合

## `filter`

いちばん簡単なのは`filter`で、普通に`filter`をかけて、`length`を比較して同じかどうかで判別すれば終わりです。なお、もとが疎な配列だった場合、抜けている要素は`filter`が勝手に飛ばしてしまいますので、`length`の比較で一致せず、違う配列が必ず出来上がります。

```js
function filterOrOriginal(arr, func, thisArg) {
  const filtered = arr.filter(func, thisArg);
  return filtered.length === arr.length ? arr : filtered;
}
```

## `map`

`map`の場合も、実装を簡単にすることを考えると、「普通に`map`を行って、要素が等しいか比較する」という方法があります。なお、要素の比較には`===`ではなく、`Object.is`が適切です（`===`は数値型に一部イレギュラーがあります）。

```js
function mapOrOriginal(arr, func, thisArg) {
  const mapped = arr.map(func, thisArg);
  const changed = arr.every((val, index) => Object.is(val, mapped[index]));
  return changed ? mapped : arr;
}
```

## `sort`

いちばんややこしいのが`sort`です。`sort`の場合、

* `sort`メソッド自体が破壊的なのでコピーが必要
* 安定ソートが保証されていないので、「結果を比較する」では同じ配列でいい場合を見逃すことがある

というような事情があるので、ソートが必要かを自力で判定する必要があります。なお、`.sort`で比較する条件も[けっこう複雑です](https://qiita.com/jkr_2255/items/548544593664872591d7)。

```js

// sort()に関数を指定しなかった場合の比較関数
const defaultCompare = ( x, y ) => {

  if( x === undefined && y === undefined )
    return 0;

  if( x === undefined )
    return 1;

  if( y === undefined )
    return -1;

  const xString = ''.concat(x);
  const yString = ''.concat(y);

  if( xString < yString )
    return -1;

  if( xString > yString )
    return 1;

  return 0;
};

const hasOwn = Object.prototype.hasOwnProperty;

function sortOrOriginal(arr, compare = defaultCompare) {
  // 1個以下の場合は、ソートしても変化しようがない
  if(arr.length <= 1) return arr;
  // ソートしなくて大丈夫かをチェック
  let needSort = false;
  for(let i = arr.length - 1; i > 0 && !needSort; --i) {
    const aUndef = arr[i-1] === undefined, bUndef = arr[i] === undefined;
    // 値抜けやundefinedは、比較関数にかかわらず場所が固定
    if(aUndef || bUndef) {
      const aEmpty = aUndef && !hasOwn.call(arr, i - 1);
      const bEmpty = bUndef && !hasOwn.call(arr, i);
      // まずは抜けているものを判定
      if(aEmpty) {
        needSort = !bEmpty;
        continue;
      }
      if(bEmpty) continue;
      // 値があるけどundefined
      if(aUndef) {
        needSort = !bUndef;
      }
      continue;
    }
    if(compare(arr[i-1], arr[i]) > 0) needSort = true;
  }
  if(!needSort) return arr;
  return arr.concat().sort(compare);
}

```
【CakePHP3.7】マイグレーションでテーブルをDropする時はsave()を忘れずに！

テーブルをdropするために、マイグレーションを作る。

```
public function change()
{
    $table = $this->table('tableNames');
        ->drop();
}
```

一見それっぽいけど、マイグレーションを実行してもテーブルはdropされない。

じゃあこれなら？

```
public function change()
{
    $this->dropTable('tableNames’);
}
```

これだとテーブルはdropされるけどdeprecatedが発生しちゃう。

```
Deprecated Error: dropTable() is deprecated since 0.10.0. Use $this->table($tableName)->drop()->save() instead. in [/var/www/html/pos/vendor/robmorgan/phinx/src/Phinx/Migration/AbstractMigration.php, line 322]

```

指示された様に書き換えたら、うまく行きました◎

```
public function change()
{
    $table = $this->table('tableNames');
        ->drop()->save();
}
```
Java出身の人間がPHPを学んでみたら

普通にPHPのこと書いても面白くないので、
Java出身（半年くらいJavaはお仕事しました）
の人間がPHPのことを学んだらどうなるか。というのを書いてみます。



###1.前提
Javaの経歴　詳細設計～単体テストまで　　大体半年くらい
Java7~8をちょこっと。
PHPの経歴　　Paizaとかprogateで遊んでたくらい。

今回Javaのお仕事からPHP7のお仕事に移ったので、違いとか
カルチャーショックを受けた部分を書いていきたいと思います。


###2.型宣言なくね？
まずこれが一番驚いた。

Javaでは
変数に型を定義しないとまぁまず怒られる。
Eclipseさんのエラー出力やコンパイルエラーでまず怒られる。

ちなみに下記みたいな感じ


``` Java:helloworld.java

public class{
  public static void main(String[] args){
  int i = 0;
  String text = "javava";
  System.out.println(i);
  System.out.println(text);
}

 ```

これをPHPで

``` PHP:helloworld.php

<?php
 $i=0;
 $text="php!php!";
 echo($i);
 echo($text);
>
 ```

これで多分コンソールやらどこかに出るはず。

圧倒的なコード量の差。
本当にびっくらこいた。



####3.ラムダ式みたいなのがある

未だにちょっとよくわからなくなるのがこいつ

```
this->なんかの関数->なんかの関数やら値やら
```
最初何を意味しているか全くわかりませんでした。

Javaのthis.と思えば良いでしょう。


###4.HTMLに紛れて何やってるかわからん
もっというとJavaScriptに紛れて何やってるかわからなくなる。

**な…　何を言っているのか　わからねーと思うが　
おれも　何を書いているのか　わからなかった… 
頭がどうにかなりそうだった…　ソースが汚いだとか
インデントがぐちゃぐちゃだとかスパゲティとか
そんなチャチなもんじゃあ　断じてねえ
もっと恐ろしいものの片鱗を　味わったぜ…**

という状態。
なにか良い例はないかな～と
こちらのかたのページのサンプルをお借りします。
http://saku.hateblo.jp/entry/2014/02/02/113006

こちらの例はわかりやすく書いてくださってますが
もしこれが3倍、4倍の量とHTMLに混じっていたらもう大変。

読み慣れていないというのもありますが、頭がどうにかなりそうでした。

###5.連想配列
勉強中。未だによくわかりませぬ。
なんでもかんでも配列に格納できるってどういうこと。
ブラックホールか何か？

追記:コメントより、
Javaでいうmap＜string,object＞と思えばよいのでは？とのコメントをいただきました。その通りでした！ありがとうございますm(__)m



###6.戻り値の型って決まってないの？
```
<?php
public function foo($var)
{
    if ( [条件式1] ) {
        return "result";
    }
    if ( [条件式2] ) {
        return array();
    }
}
```
こんなことができるらしい。
Php7ではタイプヒンティングというので型を強制できるらしいです。
phpってすげー。


###7.終わりに
Java出身者はそのほかいろいろなものがカルチャーショックを受けてます。
どうか優しく接してあげてください。
React NativeでiOSシミュレータを起動すると「Simulator not installed」で怒られる

# 概要
どうやらXcode10.2に上げると発生するバグのようです。（とっくにインストールしとるっちゅーねん）
自分はExpoで発生したけど、素のReact Nativeでも発生するみたい。
参考：https://github.com/facebook/react-native/issues/23878

# 対策
```
$ open -a Simulator
```
でシミュレータを個別に立ち上げてから起動する。

立ち上げる度に毎回やんなきゃいけないからめんどくさい。
早くよくなりますように:pray:
Ruby初心者：putsについて

Rubyの基礎であるputsを用いて文字列や数字を入出力する方法を簡単に解説します．
#puts
putsとは，ターミナルに文字列や数字を出力させる「命令」のことで，出力すると最後に改行が入ります．
Rubyにおいて，putsは頻繁に使われるメソッドなので使い方をよく押さえる必要があります．

#文字列を表示させる
テキストエディタで以下を入力し保存します．

```ruby
puts "Hello World!"
```
ターミナルで出力を実行すると以下の結果が得られると思います．

**Hello World!**


今回，出力した「Hello World!」は，「文字列」と呼ばれるものです．

プログラミングでは，文字のことを文字列，数字のことを整数や小数などと明確に区別しています．
文字列 "1" と整数 1 は一見同じように見えますが，全く別物の扱いとなるので違いを理解しておくことが大切です．

例えば 1+1 の答えは 2 ですが，"1 + 1"は文字列なので出力結果も別物になります．


もう一つ大切なことは"（ダブルクオーテーション）で文字列を囲むことです．
ダブルクウォーテーションで文字列を囲むことで，囲まれたものが「文字列」と識別されます．試しに，

```ruby
puts Hello World!
```
と入力して，ターミナルで実行してみていただけると分かります．
そう，出力されないんですよ．

ここでは"（ダブルクウォーテーション）を使用しましたが，'（シングルクウォーテーション）で同様に文字列を囲って出力しても，実行結果は同じです．
基本的にはダブルクウォーテーションを使用することが多いですが，2種類あることを押さえておいて下さい．

#数字を表示させる
数字を表示させるには，puts のあとに""を入力する必要はないので，そのまま数字を入力するだけです．

``` rb
puts 2
```
ターミナルには
**2**
と出力されます．
また，計算式を書けば計算結果を出力してくれます．

``` rb
puts 2 + 3
puts 8 - 1
puts 3 * 3
puts 9 / 3
puts 10 % 3
```
実行結果は
**5
    7
    9
    3
    1**

このように計算結果を表示することができます．
見慣れない記号もあるかと思いますが，これらは演算子と呼ばれる記号です．

|演算子|内容|
|---|---|
|+|足し算（加算）|
|-|引き算（減算）|
|*|掛け算（乗算）|
|/|割り算（除算）|
|%|余り|

色々な数字を組み合わせて入出力してみると理解が深まりますので，ぜひ手を動かしてみて下さい．

#まとめ
・今回はputsを用いて文字列や数字の入出力を行いました．
・文字列は"(ダブルクウォーテーション)で囲むこと，
・"(ダブルクウォーテーション)は文字列もしくは，数字として出力したいかによって使い分けること．
操車場アルゴリズムで四則計算の数式をパース

以前に簡単な四則計算を再帰下降構文解析でしてみた[^rec]ものの、もっと単純で面白い感じのアルゴリズムがあった気がしていた。調べたら**「操車場アルゴリズム」**（shunting-yard algorithm）と思い出したので、これをRubyで実装してみる。

[^rec]: 色々な再帰の練習としてやったうちの1つ。 → 『[再帰的なアルゴリズムの実例集](18a206d56a3425e7717b)』

## 概要
詳しい説明や図解は[Wikipedia](https://ja.wikipedia.org/wiki/操車場アルゴリズム)参照。

中置記法で書かれたよく見る数式を、**後置記法（逆ポーランド記法）に変換**できる。記号列を入力から出力へ送る際にスタックを用いて並べ替える様子を、列車を並べ替える様子で説明したため、操車場アルゴリズムと呼ばれる。

## コード
以前と同様に「1桁の整数・加算・乗算・括弧のみの数式を解釈して計算結果を返す」パーサを作ってみる。各文字がそのままトークンになるので、字句解析を省いて簡略化する[^lexer]。

エラー処理は不完全なので、前提に合わない数式（例えば2桁の数字）を入力してもエラーにならず変な結果を返すことがある。

```ruby:expr_parser.rb
class ExprParser
	class InvalidToken < RuntimeError; end
	class ParenthesisMismatch < RuntimeError; end

	# 優先順位が自身以上の演算子の一覧
	# （左結合的なら自分自身を含める）
	OP_PRECEDENCE = {"+"=>%w[+ *], "*"=>%w[*]}
	private_constant :OP_PRECEDENCE

	# パーサの動作を設定する
	# * nop: 計算を実行せず逆ポーランド記法のまま出力する
	def initialize(options = {nop: false})
		@options = {}
		options.each { |k,v| @options[k.to_sym] = v }
	end

	# 数式をパースする
	# 戻り値は出力の配列（計算済みなら結果のみ格納）
	def parse(str)
		@output = []   # 出力キュー
		@stack = []    # 一時的な置き場：演算子と左括弧を積む

		# 文字列からトークンを切り出して、種類ごとに処理する
		# （今回は常に1文字＝1トークン）
		str.each_char do |c|
			case c
			# 数値はそのまま @output へ移動する
			when /\A\d\z/
				@output.push(c.to_i)
			# 演算子の場合は、自身以上の優先順位の演算子を
			# @stack から予め掃き出し、自身を @stack に積む
			when *OP_PRECEDENCE.keys
				while OP_PRECEDENCE[c].include?(@stack.last)
					@output.push(@stack.pop); operate
				end
				@stack.push(c)
			# 左括弧は @stack に積んでおく
			when "("
				@stack.push(c)
			# 右括弧が来たら、 @stack から左括弧を抜くまで演算子を掃き出す
			when ")"
				while @stack.last != "("
					raise ParenthesisMismatch if @stack.empty?
					@output.push(@stack.pop); operate
				end
				@stack.pop # 左括弧は出力せず捨てる
			else
				raise InvalidToken
			end
		end

		# 入力が終わったら、 @stack の全演算子を掃き出す
		until @stack.empty?
			raise ParenthesisMismatch if @stack.last == "("
			@output.push(@stack.pop); operate
		end

		return @output
	end

	# @stack から @output に移動した際に、計算を実行するための補助メソッド
	# オプション nop が真なら実行しない
	private def operate
		return if @options[:nop]

		case (op = @output.pop)
		when *OP_PRECEDENCE.keys
			num2 = @output.pop
			num1 = @output.pop
			@output.push(num1.send(op, num2))
		else
			raise InvalidToken
		end
	end
end

if $0 == __FILE__
	str = "1+2*(3*(4+5)+6)*(7+8)+9"
	p ExprParser.new.parse(str) #=> [1000]
	p ExprParser.new(nop: true).parse(str)
	#=> [1, 2, 3, 4, 5, "+", "*", 6, "+", "*", 7, 8, "+", "*", "+", 9, "+"]
end
```

[^lexer]: 単純な字句解析であれば、正規表現で文字列を区切っていけばいい。

---

後置記法の結果をGhostscriptでも計算してみる。一度に入力せず適宜 `pstack` を挟めば、その時点でのスタックの内容を見られる。

```shell-session
$ gs -sDEVICE=nullpage
GS> 1 2 3 4 5 add mul 6 add mul 7 8 add mul add 9 add ==
1000
GS> quit
```

参考：[PostScript実習マニュアル](http://tutorial.jp/graph/) 第1章 PostScriptの基礎

## メモ
演算子の優先順位を数字でなく直接リストとして与えたので、四則計算程度ならともかく数が増えたら管理が困難になる。（一方で累乗のような右結合性の演算子には対応しやすいはず）

後から調べてみたところ、トークン全般の優先順位の付け方を工夫してもっと統一的に処理できることがわかった。数字に関しても入力から出力へ直接移動させるのではなく、一旦スタックに積むことで他の記号と同じ扱いができる。
https://qiita.com/phenan/items/df157fef2fea590e3fa9
[ASP.Net Core] 統合テスト(Integration Test)でメモリ内データベース(InMemoryDatabase)を使うときの注意点

# TL;DR

* InMemoryDatabaseはサービスプロバイダを共有しない
* したがってテスト間でデータが共有されない
* `InMemoryDatabaseRoot`を使って解決する


# 前提

統合テスト起動時、データベースへ初期データを登録しています。

```c#:CustomWebApplicationFactory.cs
public class CustomWebApplicationFactory : WebApplicationFactory<Startup>
{
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder.ConfigureServices(services =>
        {
            services.AddDbContext<MyDBContext>(options =>
            {
                // InMemoryDatabaseを使う
                options.UseInMemoryDatabase("MyTest");
            });
        });

        builder.Configure(app =>
        {
            // DBContextはrootにはなく別スコープにあるので、
            // スコープを作らないと取得できない。
            using (var sp = app.ApplicationServices.CreateScope())
            {
                var context = sp.ServiceProvider.GetRequiredService<MyDBContext>();

                // ここでデータベースへ初期データを登録

                context.SaveChanges();
            }
        });
     }
}
```

`WebApplicationFactory`は、`Microsoft.AspNetCore.Mvc.Testing`パッケージに用意されているクラスです。`TestServer`の作成等をやってくれます。


# 問題

コントローラにインジェクションされるDBコンテキストを見ても、登録したデータが入っていません。

# 解決策

Issueが上がっていました。
https://github.com/aspnet/EntityFrameworkCore/issues/9613#issuecomment-430722420

先ほどの`CustomWebApplicationFactory`クラスを変更します。

```c#:CustomWebApplicationFactory.cs
public class CustomWebApplicationFactory : WebApplicationFactory<Startup>
{
    public static readonly InMemoryDatabaseRoot InMemoryDatabaseRoot
    = new InMemoryDatabaseRoot();

    // （省略）
            services.AddDbContext<MyDBContext>(options =>
            {
                options.UseInMemoryDatabase("MyTest", InMemoryDatabaseRoot);
            });
    // （省略）

}
```

`UserInMemoryDatabase`メソッドに、`InMemoryDatabaseRoot`オブジェクトを渡してあげればよいそうです。
phpのデバッグの基本

#なんかphpが上手く動かない…
「完璧なプログラムコードをはじめから書ける人間はいない。
人は皆、バグと闘いながら生きている」
…と昔の偉い人が言ったかどうかはわかりませんが、
とにかくプログラムにバグは付き物です。

どうしても生まれ続けるバグ…
涙を流しながら白旗を振るのはクールではないので
デバッグという作業をして立ち向かいます。

そんなデバッグをphpではどうやって行うのか
というのを簡単にまとめていきます。

##タイポを疑う
`match`を`mtach`と書いてたり、`length`を`lenght`と書いてたり
タイピングミスは常に君の命を狙っている。

他にも
`build_check_flag`とあるべきところが`room_check_flag`と間違ってたりもする
これは何処かからコピーして持ってきたものを、正しい物に書き換えなかった為に生じる。

##シンタックスエラーを疑う
`if(isset($var))`は`if()`と`isset()`の組み合わせだ。
これを
`if(isset($var)`と書くとシンタックスエラーが生じてしまう。
`()`の入れ子が上記のように2つならまだ可愛いが、これが5個とかなると目がチラついて死ぬ。

エディターの設定によっては`()`にハイライトをつけてくれるものがあるので、導入を検討しても良いかもしれない。


##変数をチェックする。
変数は中身が変わる、故に変数である。
変数を全て把握している猛者はこの世には存在しない。
変数を把握してないから、変数が悪さをすることがある。

把握できないなら、見えるようにしてしまえば良いのだ。
`echo $var`をバグが起こりそうな行の前に記述して実行してみると
意外とこの`$var`の中身が思わぬものだったりする。

ただ配列や真偽値は中身を簡単には出力できなくて
配列は`var_dump($array_var)`
真偽値は`var_export($boolean_var)`
と書かなくてはいけない。

そして`var_dump($array_var)`して出力した配列変数は凄く見にくい文字列で表示される。
多分、見ただけで軽く死ねる。
なので

```php
echo '<pre>';
var_dump($array_var);
echo '</pre>';
```

と記述すると見やすい形で出力される。

##流れを読む。
「バグは何処かで起こっている」
この状態は不味い。バグを修正しなくてはいけないのに何処にバグが居るのかわからない！

そういう時はプログラムの流れを読むとよい。
ここはああなって…
これがこうなって…
それはそうなるのか…
となればバグが見つかる…かもしれない。

もし流れが理解できなくても 
`die();`と`exit();`を使えば力技で理解できる。

```php
die('1');
if($flag){
   die('2');
}else(
   die('3');
}
die('4');
```

と記述すると何処を通ってるかが把握できる
1が表示されるなら`if`の前までは流れてるし
2なら`if`の`$flag`が`true`だし
3なら逆に`false`だし
4であれば`if`の最後に到着してることになる。

そしてバグを見つけることが出来れば

…ようやくリングに立ったということだ。


#編集後記
入社二日目
社内の独自のフレームワークに新しい実装をすることを任されて
あまりにも無能感が出まくったので調べました。
他人のソースコードを読むのと、それに追記するのマジで辛すぎ…
デバッグさえ出来れば、強くなれそう。
Dockerfileで`apt-get upgrade`をつかってはいけない。注：古い日本語版だと誤訳されています。

今まで[Best practices for writing dockerfiles](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/)を読んだつもりで全然読んでませんでしたすみません。

[自分のブログ](https://blog.aimof.net/docker-apt-get-upgrade)からの転載です。

# Best Practice

* `RUN apt-get upgrade`を使わない。
* 必須パッケージが古いことがわかっている場合は、ベースイメージのメンテナーに連絡した上で、`RUN apt-get update && apt-get install -f hoge`を利用する。
* 日本語翻訳では、"Avoid `RUN apt-get upgrade`"が"`Run apt-get update`"を利用しない"と誤訳されている。

## 経緯

[Dockerfile用のLinterを作っている友達](https://github.com/zabio3/godolint)がいて、その中に`Do not use apt-get upgrade or dist-upgrade.`というのがあり疑問に思って、調べてみたらこの情報を見つけました。

`Best practices for writing dockerfiles`読んだつもりで全然読めてませんでした。すみません。

## 理由

* 「必須」パッケージを"unprivileged container"(訳が難しいが親イメージに対する「最下流の」コンテナ、的な意味)でアップデートするべきではないから。
    * ちゃんとベースイメージでアップデートするように求められています。

## まとめ

* `RUN sudo apt-get upgrade`を使う状況を作らない。
* Bestpractices for writing dockerfilesをちゃんと読もう。
* PR投げようかと思ったら、新しいのでは修正済みでした。Google検索だと1.9の情報が出てくるので注意。
小テクニック:sliceを分割する

## Sample Code

```go
func SplitSlice(list interface{}, size int) ([]interface{}, error) {
	if size <= 0 {
		return nil, fmt.Errorf("size need positive number")
	}

	// sliceかどうかのチェック
	if reflect.TypeOf(list).Kind() != reflect.Slice {
		return nil, fmt.Errorf("list must be slice")
	}

	var result = []interface{}{}

	var v = reflect.ValueOf(list)
	for i := 0; i < v.Len(); i += size {
		if i+size <= v.Len() {
			result = append(result, v.Slice(i, i+size).Interface())
		} else {
			result = append(result, v.Slice(i, v.Len()).Interface())
		}
	}

	return result, nil
}
```

[go-playground](https://play.golang.org/p/o0PXT1vtpUo)

## 解説のようなもの
任意の型のSliceを指定したサイズごとに分割する、と考えると

```golang

func SplitSlice(src []interface{}) [][]interface{}
```

のように`interface{}`型のSliceを受け取って`interface{}`型の2次元Sliceを返すようなインタフェイスを考えてしまいがちですが、
実際にはこのような関数はコンパイルが通りません.
なぜなら`[]string`型は`interface{}`型ではあっても`[]interface{}`型ではないからです.

なので, 関数の定義時点では`interface{}`として受け取り

```go
	// sliceかどうかのチェック
	if reflect.TypeOf(list).Kind() != reflect.Slice {
		return nil, fmt.Errorf("src must be slice")
	}
```

とreflectパッケージの機能を使い, 引数がsliceであることを確認後

```go
	var v = reflect.ValueOf(list)
	for i := 0; i < v.Len(); i += size {
		if i+size <= v.Len() {
			result = append(result, v.Slice(i, i+size).Interface())
		} else {
			result = append(result, v.Slice(i, v.Len()).Interface())
		}
	}
```

reflect.Value型に変換後, 用意された`Len`メソッドと`Slice`メソッドを使って分割していくことになります.

なお, この関数から返される値の方は`interface{}`なので, 使う場合は
一度元の型にキャストし直してください.
[Ruby]配列の足し算・引き算・掛け算・和集合・積集合

# Rubyの配列同士の演算
- Rubyは配列同士で足したり引いたりできてとても便利。

## 環境
- Ruby 2.6.0

## 足し算
```ruby
a = [1, 2, 3]
b = [3, 4, 5]
p a + b # => [1, 2, 3, 3, 4, 5]
```

- 右の配列の要素を左の配列の要素の後ろにそのまま追加する
- `a += b` みたいに破壊的な使い方もできる

## 引き算
```ruby
a = [1, 2, 3]
b = [3, 4, 5]
p a - b # => [1, 2]
```

- 左の配列の要素から共通する要素を除外する
- 右の配列が左の配列に無い要素を持っていても無視される
- `a -= b` みたいに破壊的な使い方もできる

## 掛け算
```ruby
a = [1, 2, 3]
p a * 2 # => [1, 2, 3, 1, 2, 3]
```

- 同じ要素を繰り返した新しい配列を作る
- ちなみに割り算はできない

## 和集合
```ruby
a = [1, 2, 3]
b = [3, 4, 5]
p a | b # => [1, 2, 3, 4, 5]

c = [6, 6, 6, 7]
p b | c # => [3, 4, 5, 6, 7]
```

- 左右の配列を結合して重複を除外する（ `(a + b).uniq` と同じ）
- 元の配列に重複する要素があっても除外される
- 変な使い方をすると `[1, 2, 2, 3] | []` は `[1, 2, 2, 3].uniq` と同じ

## 積集合
```ruby
a = [1, 2, 3]
b = [3, 4, 5]
p a & b # => [3]

c = [5, 5, 6]
p b & c # => [5]
```

- 左右の配列の共通する要素のみ取り出して重複を除外する
- 元の配列に重複する要素があっても除外される

意外と便利なので、色んなところで使ってみるとコードを節約できるかも。
Rails チュートリアル 第6章　windows10環境下での備忘録。$ rails test:modelsが出来ない問題。

# 第6章で躓いたところの備忘録

###6.2.1 「有効性を検証する」にて不具合
　Migrations are pending. To resolve this issue, run:

        bin/rails db:migrate RAILS_ENV=test
と表示されてしまう

###解決？
sample_app\db\test.sqlite3を手動で削除したあと
`bundle exec rake db:migrate RAILS_ENV=development`
とコマンドすることで無事
`rails test:models`
をパスすることが出来た。

###原因？
どうもネット上をエラーメッセージを元に検索してみるとwin10環境下で起きているようだ。
原因は私には特定できなかったがおそらく核心を突いた答えではないかと思われる文言を残したい。
下記を引用　https://teratail.com/questions/178462
より

---
2019/03/09 16:13
なんとなく、裏でrailsを起動したままな気がします
C:/Users/snish/environment/sample_app/db/test.sqlite3 を削除することで
rails db:migrate RAILS_ENV=test ができると思いますよ

---

###追記　6.29でも同様の事象が発生。解決策も当該ファイル削除後　
'rails db:migrate RAILS_ENV=test'
'rails test'
でテストをパスできた。

###追記２　6.3.4ユーザーの作成と認証
undefined method `password_digest='
このメッセージが出てsqllite3が動いてないような挙動を見せるが、こちらも上記ファイルを削除することでデーターベースにアクセスすることが出来るようになる。面倒だが…
色んな言語でカウンター

# 色んな言語でカウンター

色んな言語でカウンターを作ります。

### Python

#### 関数版

関数の外のスコープを参照するためにnonlocal宣言します。

```python
def counter(): 
    x = 0 
    def _count(): 
        nonlocal x 
        x += 1 
        return x 
    return _count 
count = counter()                                              
count()                                                        
1
count()                                                        
2
```
#### クラス版

```python
class Counter(): 
    def __init__(self): 
        self.x = 0 
    def counter(self): 
        self.x += 1 
        return self.x 

count = Counter() 
1
count = Counter() 
2
count = Counter() 
3
```

### JavaScript

#### ES5

即時関数を使います。count()を実行する度に、即時関数内の`_counter()`が実行されて、xの値が加算されます。

```javascript
const count = (function(){
    let x = 0;
    function _counter(){
        return ++x;
    }
    return _counter})()
count()
1
count()
2
```
### ES6

ジェネレータを使います。

```javascript
function* counter() {
    let count = 0;
    while(true) {
      yield ++count;
    }
}

const count = counter();
count.next().value;
1
count.next().value;
2
count.next().value;
3
```

#### node.js

イベントを使います。

```
const EventEmitter = require('events');
class Emitter extends EventEmitter{};
const emitter = new Emitter()
let counter = 0
emitter.on('count', ()=>{console.log(++counter)})
function countEvent(){emitter.emit('count')}

countEvent()
1
countEvent()
2
countEvent()
3
```


### Common Lisp

funcallを使います。

```common-lisp
(defun counter()
    (let((x 0))
　　　　　　　　　　　　(lambda()(incf x))))

(defvar *count* (counter))
* (funcall *count*)
1
* (funcall *count*)
2
* (funcall *count*)
3
```

### Scheme

レキシカルスコープでラップしています。

```scheme
(define counter
   (let ((x 0))
     (lambda ()
         (set! x (+ x 1))
         x)))
(counter)
1
(counter)
2
(counter)
3
```

### Clojure

状態管理は atom 等で切り離すのが Clojure 流のようです。

```clojure
(def counter (atom 0))

(defn next-value []
  (swap! counter inc))
user=> (next-value)
1
user=> (next-value)
2
user=> (next-value)
3
```

#### Ruby

```ruby
class Counter
   def initialize
     @x = 0
   end
   def counter
     @x += 1
   end
end

count = Counter.new
count.counter()
1
count.counter()
2
count.counter()
3
```

### Java

```java

```

### C

```c

```

### C++

```c++

```

### C Sharp

```csharp

```

### Haskell

```haskell

```

### Ocaml

```ocaml

```

### Scala

```scala

```

### Go

```golang

```

### Perl

```perl

```

思いつく言語でカウンターを書いてみました。
ABC - 087- A&B&C

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

#A問題

```java
	private void solveA() {
		Scanner scanner = null;
		int numX = 0;
		int numA = 0;
		int numB = 0;

		try {
			scanner = new Scanner(System.in);
			numX = scanner.nextInt();
			numA = scanner.nextInt();
			numB = scanner.nextInt();

			System.out.println((numX - numA) % numB);

			System.out.println("");

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#B問題

 - ただ単にforでカウントした。Bだと時間を気にしていないのでこれでもTLEにはならない。。。

```java
	private void solveB() {
		Scanner scanner = null;
		int numA = 0;
		int numB = 0;
		int numC = 0;
		int numX = 0;

		try {
			scanner = new Scanner(System.in);
			numA = scanner.nextInt();
			numB = scanner.nextInt();
			numC = scanner.nextInt();
			numX = scanner.nextInt();

			int res = 0;
			for (int i = 0; i <= numA; i++) {
				for (int j = 0; j <= numB; j++) {
					for (int k = 0; k <= numC; k++) {
						if (i * 500 + j * 100 + k * 50 == numX) {
							res++;
						}
					}
				}
			}

			System.out.println(res);

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#C問題

 - 右を選択した場合と下を選択した場合のどちらが飴を多くとれるか、再帰で調べる

```java
	private void solveC() {
		Scanner scanner = null;
		int numN = 0;

		try {
			scanner = new Scanner(System.in);
			numN = scanner.nextInt();

			int[][] wk = new int[2][numN];

			for (int i = 0; i < wk.length; i++) {
				for (int j = 0; j < numN; j++) {
					wk[i][j] = scanner.nextInt();
				}
			}

			System.out.println(getAme(wk, 0, 0));

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}

	private int getAme(int[][] wk, int x, int y) {
		int res = 0;

		if (x >= 2 || y >= wk[0].length) {
			return 0;
		}

		int val1 = getAme(wk, x + 1, y) + wk[x][y];
		int val2 = getAme(wk, x, y + 1) + wk[x][y];

		res = Math.max(val1, val2);
		return res;
	}
```
Oracle 12c デバッグ実行時のORA-24247エラーの解決方法

作りたてのスキーマで、SQL Developerでデバッグ実行すると、以下のようなエラーが出る。

```
データベースhoge_dbに接続中です。
PL/SQLの実行中: ALTER SESSION SET PLSQL_DEBUG=TRUE
PL/SQLの実行中: CALL DBMS_DEBUG_JDWP.CONNECT_TCP( '192.168.111.27', '60901' )
ORA-24247: アクセス制御リスト(ACL)によりネットワーク・アクセスが拒否されました
ORA-06512: "SYS.DBMS_DEBUG_JDWP", 行68
ORA-06512: 行1
プロセスが終了しました。
データベースhoge_dbから切断中です。
```

これは、12cからアクセス制御リストにないIPからのデバックセッションの確立を拒否するような設定が入ったからだ。

開発スキーマとかで、特にセキュリティを気にする必要がなければsysで以下のプロシージャを実行して、指定IPからのデバックセッションの確立を許可できる。

```sql
BEGIN
 DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE
 (
    host => '192.168.10.*',                -- ホスト名、ドメイン（'*.XXX.com'）、サブネット（'192.168.*.*'）、特定のIPアドレス（'192.168.10.021'）で指定可能。
    lower_port => null,
    upper_port => null,
    ace => xs$ace_type(privilege_list => xs$name_list('jdwp'),
    principal_name => 'HOGESCHEMA',        -- スキーマ名
    principal_type => xs_acl.ptype_db)
 );
END;
```

hostのところを`'*.*.*.*'`にすれば、どこからつないでもデバッグできるようにできます。
個人情報をマスクするドメインオブジェクト

とくに面白みはないんだけど「DBに登録されている個人情報をサービス退会時にマスクする」という要件があったときに DDD でどんなドメインオブジェクトを定義すればいいのか考えたのでメモ。
ちなみに「マスクする」というのは名前とか住所を「****」みたいな文字列に変更してしまうということです。

```ruby
# 個人情報クラス
# どの項目をどうマスクすれば良いか知ってる
class PrivateInfo
  # マスクする対象のユーザを受け取る
  def initialize(user)
    @user = user
  end
  # マスクする
  def mask
    @user.first_name = '****'
    @user.last_name = '****'
    @user.address = 都道府県だけ残してマスクする
    @user.email = 先頭3文字残してマスクする
    @user.company.name = 関連モデルの項目もマスクする
  end
end

# 例えば Rails のユーザモデル
class User < ApplicationRecord
  # 個人情報モデルを返す
  def private_info
    PrivateInfo.new(self)
  end
end
```

こんな感じで「個人情報」を表現するクラスを `PrivateInfo` として定義して、このオブジェクトを `User` から取得できるようにしておく。
退会時にデータをマスクしたいときは `PrivateInfo.mask` を呼び出す。

```ruby
# ユーザに直接関係ないアカウント管理のドメインロジックを持ってるオブジェクト
class UserAccount
  def initialize(user)
    @user = user
  end
  # 退会するときの処理
  def withdrawal
    @user.private_info.mask
    @user.delete
    # その他必要な退会処理
  end
end

# 退会コントローラのアクション
def withdraw
  user_account = UserAccount.new(current_user)
  user_account.withdrawal
  redirect_to :thankyou
end
```
ABC - 086- A&B&C

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

#A問題

```java
	private void solveA() {
		Scanner scanner = null;
		int numA = 0;
		int numB = 0;

		try {
			scanner = new Scanner(System.in);
			numA = scanner.nextInt();
			numB = scanner.nextInt();

			if (numA * numB % 2 == 0) {
				System.out.println("Even");
			} else {
				System.out.println("Odd");
			}

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#B問題

**解法1**

 - 文字列として取得
 - 繋げてsqrt
 - intにキャストして整数にする
 - 二乗して元の数値になればOK


**解法2**

 - 数値は最大でも`100100`なので、$0^2$ - $1000^2$　まで総当たりで調べる手もあるかな

```java
	private void solveB() {
		Scanner scanner = null;
		String numA = "";
		String numB = "";

		try {
			scanner = new Scanner(System.in);
			numA = scanner.next();
			numB = scanner.next();

			double wkNum = Double.parseDouble(numA + numB);
			int wk = (int) Math.sqrt(wkNum);
			if (Math.pow(wk, 2) == wkNum) {
				System.out.println("Yes");
			} else {
				System.out.println("No");
			}

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#C問題

 - 時刻0秒時に$(0,0)$からスタート
 - $T_i$秒後に$(X_i,Y_i)$点にいる場合
    - $T_i$秒が偶数なら、$(X_i+Y_i)$は偶数である
        - なぜなら、1秒間で動けるのは以下の4パターンのみ
            - $(X_i+1,Y_i)$ - $(X_i,Y_i+1)$
            - $(X_i-1,Y_i)$ - $(X_i,Y_i-1)$
        - そのため、$T_i$秒が偶数なら、$(X_i+Y_i)$の偶奇は一致する
    - $経過時間T \geqq (Xの移動量+Yの移動量)$は常に成り立つ

```java
private void solveC() {
		Scanner scanner = null;
		int numN = 0;

		try {
			scanner = new Scanner(System.in);
			numN = scanner.nextInt();
			int[] t = new int[numN];
			int[] x = new int[numN];
			int[] y = new int[numN];

			for (int i = 0; i < t.length; i++) {
				t[i] = scanner.nextInt();
				x[i] = scanner.nextInt();
				y[i] = scanner.nextInt();
			}

			int cT = 0;
			int cX = 0;
			int cY = 0;
			for (int i = 0; i < numN; i++) {

				boolean wkB = (t[i] % 2 == 0);
				boolean wkB2 = ((x[i] + y[i]) % 2 == 0);

				if (wkB != wkB2) {
					System.out.println("No");
					return;
				}

				if (t[i] - cT < Math.abs(Math.abs(cX + cY) - Math.abs(x[i] + y[i]))) {
					System.out.println("No");
					return;
				}
				cT = t[i];
				cX = x[i];
				cY = y[i];
			}

			System.out.println("Yes");

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}

```
ibatis3でわっしょｓｙそそそおｓ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315106/01dd5282-fc99-870c-8e18-1d3a5760a825.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/315106/4b0f9449-fd64-e4ea-622a-9298f2a90e31.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315106/721e9770-c055-dd18-1ea7-163864b991c1.png)


こんな感じでやりましょう
暗号理論1

日記にでもしないとつらいので、この場を借りて少しずつ勉強していこうと思い立った次第です。
# 暗号とは
秘密にしておきたい情報を不特定多数に対しては秘密にし、
ある特定の人々に対してのみ秘密を共有できるようにする方法のこと。
# 暗号技術に求められるものとは
- 機密性　　　…　電子情報を秘密のままに出来る
- 認証可能性　…　承認された存在であることを示せる
- 保全性　　　…　情報に変更や改竄がないか確かめられる
- 計算可能性　…　暗号化文書の送信者が誰であるかを受信者に証明できる

# 数理暗号技術を学習し始める上で必要になる知識
整数論と代数学の基礎

#次へ
- [暗号理論2-1(初等整数論)](https://qiita.com/latticelsy/items/67cdc90aff9500db456e)
インクリメンタルサーチ

インクリメンタルサーチを行う際は情報を配列から人ずつ取り出して表示させていくこととなる。
jbuilder

     
    json.array! @users do |user|
      json.id user.id
      json.name user.name
    end

controllerだと

     def index
       @users = User.where('name LIKE(?)', "%#{params[:keyword]}%").where.not(id: 
       current_user.id).limit(20)
       respond_to do |format|
         format.html
         format.json
       end
     end

jsファイルだと

      .done(function(users){
      $('#user-search-result').empty();
      if (users.length !== 0) {
      users.forEach(function(user){
      appendbuildHTML(user);
        });

forEachを使って、配列のJSONから情報をとりさしているのがみそ。
Djangoではじめてherokuにデプロイしました

# はじめに
題名の通りです。
以下のDjango Girlsを参考にさせて頂きながら、ようやくherokuにデプロイすることができました！
[Django Girls Herokuへのデプロイ](https://tutorial-extensions.djangogirls.org/en/heroku/)

# 環境
Windows10
python 3.6.8

```sh:pip_freezeの結果
dj-database-url==0.5.0
Django==2.1.7
gunicorn==19.9.0
psycopg2==2.7.7
pytz==2018.9
whitenoise==4.1.2
```
ローカルにpostgresqlを立てましたが、psycopg2のためにpython、postgresqlは32bit版に統一しました。
また、postgresqlは11系ではなく10系を使っています。
これもpsycopg2が提供されていないためです。
同様の事情で、python も3.7系から、3.6系に下げています。

# ハマったこと

以下の2つの内容でドはまりし、herokuにdeployできたころには初めてから3時間ほど経っていました…。

## Procfileの書き方がわからない

heroku向けの設定ファイルのようですが、チュートリアルの内容とアプリケーション名等を変更していたため、ドはまりしました。

結果から言うと、settings.pyのWSGI_APPLICATIONの内容を参考にしたところ、うまく動かすことができました。

```python:settings.py
:
WSGI_APPLICATION = 'hogehoge.wsgi.application'
:
```

```python:Procfile
web: gunicorn hogehoge.wsgi --log-file -
```

settings.py の WSGI_APPLICATION の.wsgi.applicationの前の文字列を、Procfile の .wsgi の前に入れることで何とか動きました。
詳細はわかりません、ごめんなさい！

## WhiteNoiseでエラーが出てしまう

チュートリアルの通り、ノリノリでやっていたところ、デプロイしても表示されず…。
heroku logs --tail でログを見てみたところ、以下の内容が。

```python:heroku_log
2019-04-02T11:34:48.430006+00:00 app[web.1]: File "/app/hogehoge/wsgi.py", line 18, in <module>
2019-04-02T11:34:48.430008+00:00 app[web.1]: from whitenoise.django import DjangoWhiteNoise
2019-04-02T11:34:48.430009+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/whitenoise/django.py", line 2, in <module>
2019-04-02T11:34:48.430011+00:00 app[web.1]: '\n\n'
2019-04-02T11:34:48.430013+00:00 app[web.1]: ImportError:
2019-04-02T11:34:48.430014+00:00 app[web.1]:
2019-04-02T11:34:48.430016+00:00 app[web.1]: Your WhiteNoise configuration is incompatible with WhiteNoise v4.0
2019-04-02T11:34:48.430018+00:00 app[web.1]: This can be fixed by following the upgrade instructions at:
2019-04-02T11:34:48.430020+00:00 app[web.1]: http://whitenoise.evans.io/en/stable/changelog.html#v4-0
2019-04-02T11:34:48.430021+00:00 app[web.1]:
2019-04-02T11:34:48.430023+00:00 app[web.1]:
2019-04-02T11:34:48.430024+00:00 app[web.1]: [2019-04-02 20:34:48 +0900] [11] [INFO] Worker exiting (pid: 11)
2019-04-02T11:34:48.556573+00:00 app[web.1]: [2019-04-02 20:34:48 +0900] [10] [ERROR] Exception in worker process
```

ログ中に記載されているURLを見てみたところ、英語が出てきてそっ閉じ…したいところを我慢して、進むと、解決法が書いてありました。

URLを開いて、以下の [documentation](http://whitenoise.evans.io/en/stable/django.html#django-middleware) リンクをクリックします。
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/369361/8416c11c-d428-cc3c-e493-d2394e913dd9.png)

あとは記載の通りに settings.py を編集するだけです。

```python:settings.py
MIDDLEWARE = [
  'django.middleware.security.SecurityMiddleware',
  'whitenoise.middleware.WhiteNoiseMiddleware', # ここを追加
  :
]
```

django.middleware.securiy.SecurityMiddlewareの後で、ほかのミドルウェアの前に記述する必要があるそうなのでご注意ください。
settings.pyを編集したら、チュートリアルで記載した以下の内容を削除します。

```python:hogehoge/wsgi.py
:
from whitenoise.django import DjangoWhiteNoise # この行を削除します。
application = DjangoWhiteNoise(application)    # この行も削除します。
```

以上です！
dockerにGUIアプリ＋日本語入力可能な環境構築する際に詰まったポイント

# はじめに

docker上にGUIアプリを乗せたいなーという状況があると思います。しかし、dockerにGUIを乗っけている例が少なく、まとまった情報が集められません。情報を集めて、実装してみたけど、なんだかうまくいかないといったケースがそれなりにあると思います。実際に私もdockerにGUIアプリを乗っける際に、いくつかのポイントで詰まりました。当記事では、なんだかうまくいかないの原因のヒントになるかもしれない、私の体験した詰まりポイントを紹介していきます。みなさまのdocker GUI環境構築の助けになれば幸いです。

実際に私が作ったvscode（visual studio code）の入ったイメージをbuildするdockerfileをアップしています。
興味がある方はどうぞ。( https://github.com/yn-git/vscode-in-docker )

# 1. GUIを表示させる際の詰まりポイント

## OpenGLを使用するGUIアプリへの対応

### DockerはOpenGLをサポートしていない
通常、dockerではOpenGLのアプリを描写できません。しかし、GUIアプリには、OpenGLを使用するものがあります。もし、そのようなGUIアプリを描写しようとすると、下記のようなエラーがでると思います。そんなエラーなんて出力されないんだけど・・・という方は、アプリのエラー出力がされていないかもしれません。オプションを指定することで、エラーを出力してくれるアプリもあります。

```sample_error.txt
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
```
### サードパーティの力を借りることで描写が可能になる
３つの作業を行うことで、dockerでも、OpenGLを使用するGUIアプリも描写可能です。
#### 1. nvidia-docker2をインストールする
インストール方法は[こちら]( https://github.com/NVIDIA/nvidia-docker )に詳しく書かれています。
#### 2. build時にopenGLをサポートしたイメージをベースにする
nvidia-docker2そのものはOpenGLをサポートしていません。そのため、OpenGLをサポートした専用のイメージが提供されています。この専用イメージをベースイメージとして利用することで、OpenGLが利用できるイメージが作成できます。
専用のイメージの詳細は[こちら](https://hub.docker.com/r/nvidia/opengl)で確認できます。
#### 3. run時にオプションとして、--runtime=nvidiaを指定する
nvidia-docker2のサポートをコンテナが利用できるように、オプションを指定する必要があります。

```sample.txt
docker run --runtime=nvidia ~
```

## Docker for Windows ＋ VcXsrv(windows環境)ではうまくいかなかった

当初、私はDocker for Windows ＋　VcXsrv（Windowsで動くフリーのXサーバ）で環境を構築していました。ただ、fcitxをインストールした後にvscodeを表示させようとすると、VcXsrvフリーズしてしまいました。私の力では、この問題を解決できず、Linuxに逃げました。もし、Windowsでなんとか実装しようと頑張っている方は、Linuxに逃げたら、楽になるかもしれませんよ。
# 2. 日本語に対応させる

## GUIの日本語表示には日本語フォントが必要

公式のイメージをベースにしてbuildすることは多いと思います。しかし、すでに日本語フォントがインストールされている公式イメージはほとんどないと思います。その状態で、LANG=ja_JP.UTF-8にしただけでは、GUIの日本語は正常に表示されません。文字化けして、豆腐（□）が表示されます。お好みの日本語フォントをインストールすることで、文字化けを解消できます。

## mozcはrootだと動かない

mozcとは、Googleが提供するIME（日本語入力システム）です。mozcは、どうやらrootでは動かないそうです。もし、他のIMEを使っていて、半角/全角を押し反応があるのに、日本語入力できないときは、rootが問題かもしれません。dockerの思想を無視して、コンテナ内でもrootで作業していた私は、この問題で一番つまずきました・・・（ごめんなさい、もうしません；；）
Google Colaboratoryでcv2.imshowを擬似的に利用する方法

[画像処理100本ノックを「Google Colaboratory」で楽々学習]("https://qiita.com/karaage0703/items/e0b57b63dbebed908b2f")を利用して、[画像処理100本ノック]("https://github.com/yoyoyo-yo/Gasyori100knock/tree/master/Tutorial")をやってみようということでColabを起動してTutorialの通りに打ち込んでみました。

```
import cv2
img  = cv2.imread("imori.jpg")
cv2.imshow("imori", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
普通ならこれで画像が出るところですが、エラーが発生します。

```
---------------------------------------------------------------------------
DisabledFunctionError                     Traceback (most recent call last)
<ipython-input-14-d690a3c68444> in <module>()
----> 1 cv2.imshow("imori", img)

/usr/local/lib/python3.6/dist-packages/google/colab/_import_hooks/_cv2.py in wrapped(*args, **kwargs)
     50   def wrapped(*args, **kwargs):
     51     if not os.environ.get(env_var, False):
---> 52       raise DisabledFunctionError(message, name or func.__name__)
     53     return func(*args, **kwargs)
     54 

DisabledFunctionError: cv2.imshow() is disabled in Colab, because it causes Jupyter sessions
to crash; see https://github.com/jupyter/notebook/issues/3935.
As a substitution, consider using
  from google.colab.patches import cv2_imshow

```


エラーメッセージを読んでみると`cv2.imshow()`はjupyterセッションをクラッシュしてしまうそう。
ありがたいことにColab側がサポートパッチを提供してくれているので、これを使って解決させてみます。

```
#サポートパッチのインポート
from google.colab.patches import cv2_imshow

#画像のインポート
!curl -o logo.png https://colab.research.google.com/img/colab_favicon_256px.png
import cv2
img = cv2.imread('logo.png', cv2.IMREAD_UNCHANGED)
cv2_imshow(img)
```
僕の場合は`imori.jpg`を`cv2.imread()`で読み込んで、これで無事にイモリが表示されました。

<img width="686" alt="スクリーンショット 2019-04-02 20.49.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/292578/e38b675f-1322-bc26-4abb-5f8d2d782b0b.png">


ただこれはColabのパッチを使ってるのでもちろんJupyter Notebookではうまく動きません。
Jupyter Notebookは表示まではされるんですが，そもそも`cv2.waitKey(0)`がうまく作動しなくてKernelごと死んじゃいます。


=============================================

2020/09/20 追記

Jupyterでは自前でimshow関数を用意してくれているようですので、[こちら](https://teratail.com/questions/183659)を参照されると良いかもしれません。
Gmailでメールを検索するコマンド

自分で使うためのメモ

| コマンド | 内容 |
| --- | --- |
| label:<br/>l: | labelを検索<br/>l: でもいいらしい |
| is:read | 既読 |
| is:unread | 未読 |
| is:sent | 送信済み |
| from: | 送信者 |
| to: | 受信者 |
| in:inbox | 受信トレイ＝アーカイブされていない |
| has:nouserlabels | ラベルがついていない |