OmniAICreator/Qiita-1.07M huggingface dataset:
Java Servlet 4.0のweb.xmlのスキーマ定義

Java Servlet 4.0のスキーマ定義が覚えられないのでメモ。
公式の定義がどこに載っているのかわからなかった。

```xml:web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"                  
         version="4.0">
</web-app>
```

### ついでにスキーマ定義の意味もわかっていなかったので調べてみた

### `xmlns="http://xmlns.jcp.org/xml/ns/javaee"`

「名前空間の名前」を定義する。
これでweb.xmlで使っているタグ要素<web-app>とか<servlet>がどの名前空間に属しているかが定義される。

### `xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"`

(一つ宣言を飛ばして)
ここで先に定義した名前空間`http://xmlns.jcp.org/xml/ns/javaee`のスキーマ定義ファイル(.xsd)の参照先を指定している。

これは、「`<web-app>` とか `<servlet>` などのエレメントは、名前空間`http://xmlns.jcp.org/xml/ns/javaee`に属していて、その定義内容は`http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd`の定義ファイルを参照してね。」って意味と理解しました。 
ちなみにweb-app_4_0.xsdが、Java Servlet 4.0を指していると思われる。

### `xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"`

`schemaLocation` が属している名前空間を宣言している。
`schemaLocation`　は、名前空間　の　定義ファイルの場所を参照するために使っている。

### まとめ

web.xmlでは2つの名前空間を定義しており、それぞれの用途は以下の通りという解釈。

1. エレメント（タグ）の名前空間は、`http://xmlns.jcp.org/xml/ns/javaee`に属している。
1. 名前空間の定義ファイルは、 `http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd`。
1. 名前空間と定義ファイルの紐付ける為に`schemaLocation` の名前空間も宣言している　

# 参考

[web.xmlのバージョン別DTD・XSDの宣言方法](https://kokuzawa.github.io/blog/2015/04/07/web-dot-xmlfalsebaziyonbie-dtdxsdfalsexuan-yan-fang-fa/)
[XMLにおける名前空間](https://www.mlab.im.dendai.ac.jp/~yamada/web/xml/namespace.html)
条件式の統合(Consolidate Conditional Expression)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/257568/fdaf5b9d-a029-52fa-35b6-44022684defa.png)


1つずつリファクタリング技法まとめ
個人的に簡単かつ取り入れ易いと思うものから

## 目的
すぐ引き出せるようにする

## 基本作業サイクル
- システムを動かして仕様を精査
- テストメソッドを作成
- テストの失敗を確認
- テストの成功を確認
- 小さい変更、随時テスト実行(パターン追加失敗確認->成功確認)
- 最後テスト実行
- 最後動作確認

## 条件式の統合(Consolidate Conditional Expression)とは
同じ返り値を返す**複数の条件式**を、メソッドとして抽出して**ワンライナー**にすること
条件式をORやANDでまとめること
 
## ポイント
- 返り値が同じ

## 例
- OR系
  - 条件式が順に並んでいる

```
def calorie
  return 0 if @food == 'donut'
  return 0 if @food == 'castella'
  return 0 if @food == 'ice'
end
```
　　　↓

```
def calorie
  return 0 if @food == 'donut' || @food == 'castella' || @food == 'ice'
end

　↓
# そうすると条件文の分解ないしメソッドの抽出もできる
def calorie
  return 0 if date?
end

def date?
  @food == 'donut' || @food == 'castella' || @food == 'ice'
end
```

- AND系
  - 条件式がネストしている

```
def calorie
  if @user == 'date'
    if @food == 'donut'
      0
    end
  end
end
```
　　　↓

```
def calorie
  return 0 if @user == 'date' && @food == 'donut'
end
```    

## 書籍情報
Jay Fields (著), Shane Harvie (著), Martin Fowler (著), Kent Beck (著),
長尾 高弘(訳), リファクタリング:Rubyエディション
https://amzn.to/2VlyWML

## 雑感
やってる事は同じなんだけど説明の観点が違う(もしくは包含している)というのがたくさんある
Accessの破損したmdbファイルを修復する

## 先生！mdbファイルさんが息してません :innocent:

> リンク サーバー "xxx" の OLE DB プロバイダー "Microsoft.ACE.OLEDB.12.0" のデータ ソース オブジェクトを初期化できません。
> リンク サーバー "xxx" の OLE DB プロバイダー "Microsoft.ACE.OLEDB.12.0" から、メッセージ "データベースの形式 'xxx' を認識できません。" が返されました。 (Microsoft SQL Server、エラー: 7303)

oh...
なんでmdbすぐ死んでしまうん？

## 心肺蘇生じゃ :heartpulse:

```powershell:PowerShell
$dao = new-object -comobject DAO.DBEngine.120
$dao.CompactDatabase("broken.mdb","relieved.mdb")
```

[DBEngine.CompactDatabase メソッド (DAO)](https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/dbengine-compactdatabase-method-dao)

## 教訓

- Accessのデータベースファイルの突然死はよくあること。
- 今回は無事修復できたからよかったものの...定期的にバックアップを取ろう。
- ~~深夜の妙なテンションで記事を書いてはいけない。~~
go言語 静的ページの作成

# Goの勉強録
go言語を身に付けたいと思って頑張って色々するものの、環境構築とHello Worldをhtmlで表示して「やったー」と思ったまま放置していました。
他に色々忙しいのと、PHPでWebソフト作っていてgoでやる必要性とかを色々考えててモチベが上がらずってのも結構原因でした。
そこで勉強録をつけていけば自分の技術の軌跡がわかるしモチベ向上になるんじゃね？と思って勉強録をつけようと思います。

## 余談
PHPで開発していた時にMySQLが起動しなくなって初期化からインストールをする際に
`/usr/local/Cellar/`のなかで，`sudo rm -rf *`をしてしまったので，brewから導入した環境が全て飛びました。／(^o^)＼ナンテコッタイ

そのおかげで、goの環境構築を一からしました。
ちなみにgoの環境構築は[Go言語の環境構築 Hello Worldまで](https://qiita.com/lkeix_/items/161d448bea2547ae2d8b)に記録してます。

## 本題
余談はここまでにしておいて，実際にgoで静的ページを生成します。
静的ページとは、誰が閲覧しても内容が変わらないページって事ですね。つまり文書だけしかないページや画像しかないページを思い浮かべて貰えると分かりやすいです。

今回はgoのなかでが他のhtmlファイルを読み込んでそれをローカルホストに表示するってことをやります。

`GOPATH`は`~/go/`に通している前提で話を進めます。

以下のコマンドで今回のワークスペースを作成

```bash:bash
mkdir ~/go/StaticPage/ ~/go/StaticPage/HTML && cd ~/go/StaticPage/
touch main.go ./HTML/index.html
```

まず、表示用のhtmlを作成

```html:index.html
<!DOCTYPE html>
<html>
　　<body>
   　　<h1>It Works!</h1>
　　</body>
</html>

```

次に、htmlを呼び出すプログラムを書きます。

```go:main.go
package main

import (
	"fmt"
	"log"
	"net/http"
	"os"
	"reflect"
)

func main() {
	// このファイルのパスを取得
	dir, _ := os.Getwd()

	// データ型を取得
	fmt.Println(reflect.TypeOf(dir))

	// 第一引数 (/staticpage/) ハンドラの生成
	// 第二引数 (/staticpage/) のリンクの中にhtmlファイルを探す設定
	// 第三引数 // .htmlを配置したディレクトリ (dir+"/HTML/") を読み込む
	http.Handle("/staticpage/", http.StripPrefix("/staticpage/", http.FileServer(http.Dir(dir+"/HTML/"))))

	// ListenAndServe でたちあげれなかった場合のlog
	// nilでhttp.Handleで設定したハンドラーを呼び込み
	log.Fatal(http.ListenAndServe(":8080", nil))
}
```

ずっとエラーで

```
./main.go:18:85: cannot use string(dir) (type string) as type http.FileSystem in argument to http.FileServer:
        string does not implement http.FileSystem (missing Open method)
```

って言われていてデータ型のエラーだと思って`reflect`をimportした`TypeOf`で引数のデータ型が知れることがわかった。
今後デバッグの際に使うかも
結局、http.Dir()が第三引数の呼び出す関数の引数に書き忘れていただけだった／(^o^)＼ヨクアル！

ここまできたらあとは実行するだけ

```
bash:bash
go run main.go
```

ブラウザで`http://localhost:8080/staticpage/`を検索すると`It Works!`と表示される。`http.Handle`と`httpHandler`の違いがイマイチなので今度ぶち当たったらそれも記事としてあげます。

## 参考
https://liginc.co.jp/333868
http://y0m0r.hateblo.jp/entry/20140413/1397397593
はじめてのC++【5日目】

#はじめに
用事があり日付が変わってから書いています。
あまり進めないかも。
##04-10 ポインタできないポインタ
ポインタは参照先があって初めて参照先にアクセスすることができる。
例外処理の内容をいちいち書いていたら非効率なので、ヌルポインタが使われる。
このヌルポインタを返すようにしておけば、ヌルポインタかどうかの判定でポインタの使用・未使用が判別です
<img width="861" alt="スクリーンショット 2019-03-02 2.30.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/298612/e76f714b-c0e0-057f-3859-14e4b8eecdfc.png">
<img width="142" alt="スクリーンショット 2019-03-02 2.41.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/298612/22e48a2c-71ae-263a-0506-f5df76a2daa0.png">

プログラム中に「0」とだけ書かれてもint型の数値と区別がつかない。ですから、「0」の代わりにNULLとかけるようになっている。

```cpp 
//同じ意味
return 0;
return NULL;
```
NULLの正体はマクロというものになっていて、0で置き換わるようになっている。
このマクロは、iostream,cstdef,cstdioなど様々なヘッダファイルに定義されている。

NULLかNULLでないかで処理を変えることができる。
例）
・アドレスを返す関数で、関数が失敗したときにNULLを返すようにする。
・NULLを渡すと何らかの特別な処理をする関数を作る
・NULLを渡すとそのパラメータを無視する
つまり、ヌルポインタは普段とは異なる特殊な処理を行う場合の目印として使うことができる。
#終わりに
ついにポインタが終わりました！
「５章クラスの前に」この名前からしていよいよクラスに入れそうです。
明日も夜遅くから始めることになりそう。
Googleタグマネージャーを環境ごとに切り替える

# 動機、背景
業務で運用しているWebアプリケーションではGoogleタグマネージャーを使いトラッキングタグを管理しています。
これまでトラッキングタグは依頼を受けて開発チームが実装していたこともあり、現在もアプリケーション中にハードコーディングされているものがあります。
今回、運用の効率化とビジネス側の要求にスピーディに対応するために、トラッキングタグをGoogleタグマネージャーに移行しようと考えましたが、以下の課題がありました。

- 本番公開前にタグの確認および回帰テストをしていないものがあり、本番環境でバグが発覚した。
- テストのためにサブドメインをトリガーに設定したものが乱立し、どのタグがテストできているのか分からない。
- 複雑さが心理的ハードルとなり、移行がなかなか進まない。

そこで、Googleタグマネージャーの「環境」という機能を使い、テスト環境で全てのタグがテストできるようにしました。

# Googleタグマネージャーとは

Webビーコン型の計測ツールなど、HTMLにコード片を埋め込むことで機能するサービスがありますが、それらのコード片を管理することができるGoogleのサービスです。

**タグに関する概念**

項目 | 内容
:--- | :---
タグ | HTMLに埋め込みたいコード片。
トリガー | タグを表示する条件やタイミングの設定。
変数 | 特定のHTMLの要素やURL等の変数。タグやトリガーに利用できる。

**公開に関する概念**

項目 | 内容
:--- | :---
ワークスペース | 作業スペース。作業中の変更を保持しておくことができる。
バージョン | ワークスペースの変更履歴。タグを公開する時にはバージョンを作成して公開する。
環境 | バージョンを公開する環境。


# Googleタグマネージャーの環境を設定

<img width="1022" alt="スクリーンショット 2019-03-02 1.36.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/127338/46af3e18-229f-de33-253e-3b0e9cfc9e25.png">

- [管理]->[環境]を開いて環境の設定画面を開きます。
- [新規]ボタンをクリックして環境を作成します。
- 環境の名前をつけて[環境を作成]をクリックします。
- 作成した環境の[操作]->[コードを取得]をクリックし、表示されたコード片をHTMLに貼ります。

**環境の名前**

環境の名前は任意に作成できますが、今回は以下のように設定しました。

項目 | 内容
:--- | :----
Dev | 開発環境
QA | テスト環境
Live（公開中）* | 本番環境

*Live（公開中）環境はデフォルトで設定されている環境です。

# バージョンを指定の環境に公開

以下のスクリーンショットのように、[バージョン]画面から各環境に向けてタグを公開することができるようになります。
<img width="704" alt="スクリーンショット 2019-03-02 1.55.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/127338/77c442ac-16c3-7ba0-b478-49d8ba106c40.png">

<img width="658" alt="スクリーンショット 2019-03-02 1.59.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/127338/9de9d23f-c485-4d8a-b8e8-1e55f1f658cf.png">

- [バージョン]の右にあるアイコンをクリックし[次に公開]をクリック。
- [環境]を選択し[今すぐ公開]をクリック。

以上で各環境にタグを公開することができます。
Googleタグマネージャーの環境を使うと、複数の環境があるアプリケーションにも対応でき、本番公開前にテストができるので安心できます。
タグのプレビュー、公開方法が今までと変わるため、実際に運用している人たちにも共有が必要なので、その点は注意してください。

**参照**

https://www.axis-corp.com/other/4512.html
https://goodpatch.com/blog/gtm-pageviews/
Raspberry Pi Zero W setup memo

Raspberry Pi Zero W を USB ケーブル一本だけ PC と繋いで使う方法メモ。

dwc2 overlay で OTG で使えるようになった USB ポートのシリアルは `g_serial` で、`/dev/ttyGS0` として見えるようになる。これに getty を割り付ければログインできるようになる。

- `dtoverlay=dwc2` を /boot/config.txt に
- `modules-load=dwc2,g_serial` を /boot/cmdline.txt に
- `systemctl enable getty@ttyGS0.service` を chroot して実行

余談：

- `enable_uart=1` は SoC の mini UART を有効化するものなので、設定不要。
- `g_serial` は USB gadget driver と呼ばれるものの一つで、[ドキュメント](https://www.kernel.org/doc/Documentation/usb/gadget_serial.txt)がある。
- systemd には `serial-getty@.service` と `getty@.service` があるが、今回の用途であれば `getty@` でよい。[この二つの違い](https://unix.stackexchange.com/questions/479911/what-is-the-difference-between-serial-gettyttyama0-service-and-gettyttyama0-se)は、baud rate の設定だけれども、結局 g_serial では設定する意味がない。

- https://learn.adafruit.com/turning-your-raspberry-pi-zero-into-a-usb-gadget/serial-gadget
- https://www.raspberrypi.org/documentation/configuration/uart.md
(量子)アニーリングで○×ゲームの完全解析

[こちらの記事](https://qiita.com/YuriCat/items/40c3a8eb2b60946ccb6d)でアニーリングでゲーム木を解けることがわかったので、実際に量子アニーリングマシンで○×ゲーム（三目並べ、Tic-Tac-Toe）を解くことを目標に、まず[Blueqat](https://github.com/Blueqat/Blueqat)のシミュレータでやってみます。

今回は○×ゲームのルールそれ自体を量子コンピュータが扱う想定ではなく、予めゲーム木を作成した状態から解くことを目標にします。

○×ゲームのルールに踏み込んで手を考えるやり方は[ガチプロのブログ記事](https://blog.blueqat.com/post/2780)をご覧ください。

# ○×ゲームのゲーム木

まず○×ゲームにおいて初期局面から到達可能な局面とその遷移関係を列挙します。
○×ゲームは他の多くのゲームより単純ですが、分岐はそれなりに多いので、合流と対称形の縮約によって局面数を減らしておきます。

|処理|局面数|二分木変換後のノード数|
|---|---|---|
|（なし）|549946|510335|
|合流|5478|12605|
|合流+対称形|765|1607|

※二分木変換の際に子ノードが1つの局面は子局面に統合される

合流と対称形を考慮すると、先手の初手は中央、隅、端の3手に絞られます。

# 2x2の○×ゲームを解いてみる

まず小さい問題を解いてみます。
2x2の○×ゲームは明らかに先手の勝ちで、対称形を考慮すると4局面しかありません。

q0とq1を先手勝ちの末端局面、q2を後手の手番局面、q3を初期局面とします。

```
import numpy as np
from blueqat.opt import Opt

print(Opt().add("(q2-(q0+q1)/2-1/4)^2 + (q3-(q0+q2)/2+1/4)^2").add(np.diag([-1,-1,0,0])).run(shots=100))
```

結果、4局面すべてで先手勝ちという結果が得られました。

動作が確認できたので3x3の問題に戻ります。以下ではソルバーに投げる目的関数の式は自動生成しています。

# 全体を一気に解いてみる

1607変数くらいならと思って手元のマシンでやってみましたが、ソルバーの初期化に時間がかかり過ぎるので諦めました。

4手進めて100変数程度にしたところ、たまに解けることもあるのですが失敗が多かったです。
ですので全体を一気に解くのは、工夫しないと精度的にも難しそうでした。

# 妥協して、少しずつ解いて全体の結果を得る

本来なら全体を一気に解きたいところですが、仕方がないので小さな問題ごとに解いてみました。

ゲーム木における値が未確定なノードを末端側から順に抽出し、子ノードと合わせて一定ノード数程度の小さな部分グラフ（連結である必要はない）を抜き出してそれを解きます。

解かれたノードはand/orノードから末端ノードに変化し、どのノードからも遷移が無くなった（全ての親の値が定まった）ノードは消去します。

残ったノードがなくなるまでこれを繰り返すことで、最終的には全ての局面の勝敗がわかります。

今回は部分グラフのノード数が10以上になったところで、抽出を終了しアニーリングに入る設定としました。

**結果**

引き分けを先手勝ちとした場合と負けとした場合の違いは末端ノードの初期値だけで、手順に差はありません。ともにアニーリングを338回繰り返すことで解けました。

|条件|解析結果|先手勝ち局面数|
|---|---|---|
|引き分け先手勝ち|**先手勝ち**|563/765|
|引き分け後手勝ち|**後手勝ち**|412/765|

条件によって勝敗が異なるので、○×ゲームの結果は**引き分け**という結果になりました。
また下記の判定により全ノードで正しい値が得られていることが確認できたため、○×ゲームの解を示すことができたと言えます。

# 解けたかどうかの判定

今回アニーリングによって最小化した目的関数は、全ての項の最小値を達成した場合に全体が最小になることがあらかじめわかっており、目的の解以外で最小値を達成することができません。

そのため目的関数の値を見て解けたかどうかを判定することができます。

# 解けたかどうかの古典計算での判定

全てのandノード、orノードにて結果が矛盾していないかを確かめることで答えの正しさをチェックしています。

NP完全のパズルと異なり、ゲームの計算量は一般にPSPACE困難に属するので、解（局面の勝敗、最善応手列）を与えられても正解かどうかを判定する簡単な（ゲーム木の展開が不要な）方法は一般にはないだろうと予想されています。

# おわりに

アニーリングにする意味があったのか考えてはいけません。
もっと長所が活かせるといいですね。
opencv-pythonで簡単に次々と画像を表示する方法

# はじめに
あるディレクトリ内の画像をボタン1つで次々に表示できるコードが欲しくなった.
画像処理プログラムで、正しく動いているか確認したかったためだ.
# 環境
|OS|python3|opencv-python|
|:-:|:-:|:-:|
|OS X 10.14.3|3.6.5| 4.0.0.21|
# 実装
```python:
for i in no_list: #no_listは画像No.のリスト
    path = 'img_no{}.png'.format(i)
    #画像があるかの確認 存在しない場合は飛ばす
    if os.path.exists(path): 
        img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
        cv2.imshow('img',resized_img)
        cv2.waitKey()
        cv2.destroyAllWindows()
```
これは一例で、以下の条件の場合のコードになる.

* 画像はカレントディレクトリにある
* 画像の名前はimg_no##.png (##は整数)

`if os.path.exists(path):`のおかげで、数字の連続が途中で切れてても平気.

`for i in no_list:`の条件を変えればファイル名に合わせることができる.最悪、dictにファイル名を全部格納すれば何とかなる.

# 補足: 画像を表示する時のサイズと位置の調節もしたかったので以下のコードを追加した.

```python:
    #画像の表示サイズを変更 imshow()の前に記述
    h,w,n = img.shape[0], img.shape[1], 2
    resized_img = cv2.resize(img,(int(w/n), int(h/n)))
    #画像を表示する位置を変更 imshow()の後に記述
    cv2.moveWindow('img', 100, 200)
```
VRChatで自分の声とゲーム音の両方をキャプチャする

Bandicamで追加オーディオデバイスを選択しVive本体の音とマイクの音を拾う。動画を撮っておけば画像は後から切り抜ける。

初心者なので最適解はわかりませんが他に良い方法あったら教えてください～

<img width="341" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/136286/0a7f1175-c93f-7899-3fec-1213bb43716b.png">


## HMDのイヤホンからではなくディスプレイから音が鳴ってしまう場合

Windows10右下の再生デバイスの選択でViveを選び、それで直らない場合はVive Homeを起動して、そこからVR Chatに入る。

その後、一度キャプチャした動画を確認するために再生デバイスを切り替えてしまうと、Viveの音が取れなくなってしまうこともあるのでなるべく切り替えはしない方がいいかも。
(量子)アニーリングでゲーム木(and/or木)探索

D-Waveなどの量子アニーリングマシンでゲーム木を解くことができるのか、アニーリングのシミュレータで確かめてみます。

# and演算とor演算

ゲーム木の2値バージョンであるand/or木を解くために、and演算とor演算の結果を解とする目的関数を構成します。

具体的には以下の式です。

|演算|QUBO目的関数|
|---|-------|
|q0 = q1 <b>and</b> q2|(q0 - (q1 + q2)/2 + 1/4)^2|
|q0 = q1 <b>or</b> q2 |(q0 - (q1 + q2)/2 - 1/4)^2|


詳しく見てみると、

|q0 |q1 |q2 |q0-(q1+q2)/2+1/4|q0-(q1+q2)/2-1/4|
|---|---|---|----|----|
| 0 | 0 | 0 |**1/4**|**-1/4**|
| 0 | 0 | 1 |**-1/4**|-3/4|
| 0 | 1 | 0 |**-1/4**|-3/4|
| 0 | 1 | 1 |-3/4|-5/4|
| 1 | 0 | 0 | 5/4| 3/4|
| 1 | 0 | 1 | 3/4|**1/4**|
| 1 | 1 | 0 | 3/4|**1/4**|
| 1 | 1 | 1 |**1/4**|**-1/4**|

確かに**and**と**or**それぞれが成り立っているときに、二乗した値が最小値を取っていることがわかります。

# 二分and/or木を解く

実際にシミュレータを使って解いてみます。
今回はオープンソースの量子計算ライブラリである[Blueqat](https://github.com/Blueqat/Blueqat)を使っています。

以下のand/or木を解きます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/135284/16cec40f-f7f6-6b02-7e40-e11775f0475f.png" width=70%>

<font color="blue">青ノード **0**</font> を**orノード**（自分の手番）、<font color="red">赤ノード **1**,**2**</font> を**andノード**（相手の手番）、<font color="gold">黄ノード **3**,**4**,**5**,**6**</font> を末端ノードとします。

### シミュレータで解いてみる

```
from blueqat.opt import Opt

qstr = '(q0-(q1+q2)/2-1/4)^2 + (q1-(q3+q4)/2+1/4)^2 + (q2-(q5+q6)/2+1/4)^2'
tree = Opt().add(qstr)

print('q0 q1 q2 q3 q4 q5 q6')
for _ in range(10):
    print(tree.run())
```

**結果**

ノード0~ノード6までの値がリスト形式で得られます。

```
$ python3 search.py
q0 q1 q2 q3 q4 q5 q6
[1, 0, 1, 0, 0, 1, 1]
[0, 0, 0, 1, 0, 0, 1]
[1, 1, 0, 1, 1, 0, 0]
[0, 0, 0, 0, 1, 1, 0]
[1, 1, 0, 1, 1, 0, 1]
[0, 0, 0, 1, 0, 0, 1]
[1, 1, 0, 1, 1, 0, 0]
[0, 0, 0, 0, 1, 0, 1]
[0, 0, 0, 1, 0, 0, 0]
[1, 0, 1, 0, 1, 1, 1]

```

確かに q0 = q1|q2 、q1 = q3&q4 、q2 = q5&q6 を満たす組み合わせが返ってきました。

### 末端ノードに値を入れた状態で解いてみる

実際にゲーム等を解くように、末端ノードに以下のように値を入れて解いてみます。
1が先手の勝ち、0が負けとします。

|ノード|値|
|---|---|
|3|1|
|4|1|
|5|0|
|6|1|

ソルバーの設定の部分だけ変更します。
1を与えるノードには-1、0を与えるノードには+1の重みを設定します。
最小化問題なので、q3^2...の項に欲しい値の逆の符号を掛けることでそちらに引っ張ることができます。

```
import numpy as np
tree = Opt().add(qstr).add(np.diag([0,0,0,-1,-1,1,-1]))
```
**結果**

```
$ python3 search.py 
q0 q1 q2 q3 q4 q5 q6
[1, 1, 0, 1, 1, 0, 1]
[1, 1, 0, 1, 1, 0, 1]
[1, 1, 0, 1, 1, 0, 1]
[1, 1, 0, 1, 1, 0, 1]
[1, 1, 0, 1, 1, 0, 1]
[1, 1, 0, 1, 1, 0, 1]
[1, 1, 0, 1, 1, 0, 1]
[1, 1, 0, 1, 1, 0, 1]
[1, 1, 0, 1, 1, 0, 1]
[1, 1, 0, 1, 1, 0, 1]
```

このゲームの値が1（先手の勝ち）であるという結果が返ってきたので成功です。

# 応用

### 分岐数の多いand/or木を解く

3つ以上の分岐があるノードを分割して二分木に変換すれば、変数は増えますが同様に解くことができます。

### 勝敗分の3値のゲーム木を解く

and/or木は2値しか対応していませんが、取りうる値の種類が有限な場合は、最高と最低の値の中間を勝ちと負けのどちらに含めるかを全パターン試すことで解けます。

例えば勝敗分の3値があるゲーム木に対しては、「引き分けを勝ちとした結果」と「引き分けを負けとした結果」の両方の値を得て、勝敗判定結果が変われば引き分けとすることで解決できます。

# おわりに

アニーリングでゲーム木を解くことが一応できたので、次回はもっと大規模な問題にチャレンジします。

[(量子)アニーリングで○×ゲームの完全解析](https://qiita.com/YuriCat/items/a97e87ba9f0d65bd4c03)
VCIのデバッグをマシにするスクリプト

# デバッグしずらい問題
VirtualCastのVCIはスクリプトを書き換えると自動的にリロードしてくれます。
しかし前回のグローバル変数や関数の状態はリセットしてくれません。そのためスクリプト上には存在しない謎の存在のせいで悩まされることがあります。
それとアイテムがどこか遠くに飛んでいってしまい、試すのにわざわざ手元に持ってくるのが面倒すぎます。

# いろいろリセットするスクリプト
グローバルの状態とサブアイテムの位置・角度・加速度をリセットしてくれるスクリプトです。

このスクリプトをluaファイルの一番上に貼り付けておくと、ファイルを保存してリロードされるたびにアイテムの状態が初期状態に戻るのでデバッグしやすくなります。

一番上の
`SubItemNamesToReset = {}, -- ここにサブアイテムの名前を全てセットする`
の部分にアイテムごとのサブアイテムの名前を書いておかないとリセットされません。
忘れずに書いてください。

```lua:Resetter
--[[
    スクリプトが実行されるたびに初期状態にリセットしてデバッグしやすくしてくれるVCIスクリプト
    リセットしてくれるのはサブアイテムの位置・角度・加速度とグローバル変数の状態
     使う際はサブアイテムの名前を一番上のSubItemNamesToResetにセットしてください
     例) SubItemNamesToReset = { "SubItem1", "SubItem2", "SubItem3" },
]]
local Resetter = {
    SubItemNamesToReset = { }, -- ここにサブアイテムの名前を全てセットする
    ResetEnv = function(self)
        if _RESETTER_ENV_DEFAULE_KEYS_LIST == nil then
            -- 初回実行時にデフォルトのグローバル変数を記録しておく
            _RESETTER_ENV_DEFAULE_KEYS_LIST = {}
            for key, value in pairs(_ENV) do
                _RESETTER_ENV_DEFAULE_KEYS_LIST[key] = true
            end
        else
            -- 2回目以降は初回に存在しなかったグローバル変数を全て削除する
            for key, value in pairs(_ENV) do
                if _RESETTER_ENV_DEFAULE_KEYS_LIST[key] == nil then
                    _ENV[key] = nil
                end
            end
        end
    end,
    ResetSubItem = function(self, subItemName)
        local subItem = vci.assets.GetSubItem(subItemName)
        if (_RESETTER_SUB_ITEM_TRANSFORMS == nil) then
            _RESETTER_SUB_ITEM_TRANSFORMS = {}
        end
        if _RESETTER_SUB_ITEM_TRANSFORMS[subItemName] == nil then
            -- 初回実行時にサブアイテムの位置と角度を記録しておく
            _RESETTER_SUB_ITEM_TRANSFORMS[subItemName] = {
                Position = subItem.GetPosition(),
                Rotation = subItem.GetRotation()
            }
        else
            -- 2回目以降はサブアイテムの加速度と位置と角度をリセットする
            subItem.SetVelocity(Vector3.zero)
            subItem.SetAngularVelocity(Vector3.zero)
            subItem.SetPosition(_RESETTER_SUB_ITEM_TRANSFORMS[subItemName].Position)
            subItem.SetRotation(_RESETTER_SUB_ITEM_TRANSFORMS[subItemName].Rotation)
        end
    end,
    Reset = function(self)
        for index, subItemName in pairs(self.SubItemNamesToReset) do
            self:ResetSubItem(subItemName)
        end
        self:ResetEnv()
    end
}
Resetter:Reset()
```
「カイゼン・ジャーニー1周年イベント」参加レポート

[「カイゼン・ジャーニー発刊１周年記念イベント「私たちのジャーニー」」](https://devlove.doorkeeper.jp/events/87126)
に参加してきました。

先日のデブサミには行けなかったので、
新井さん、市谷さんの話を直接聞くことができて良かったです。

## カイゼン・ジャーニー新井さんのジャーニー
[カイゼン・ジャーニーから見つかった新たなfunと前進への旅路
−ソフトウェア開発の「今ココ」に適応するために− (SlideShare) ]
(https://speakerdeck.com/araitakeshi/kaizenziyanikarajian-tukatutaxin-tanafuntoqian-jin-hefalselu-lu)

**「成功の定義：Giver（与える人）
　他人にプラスの影響をもたらす個人的なもの」**

**「引っ込み思案の魂の内なる声を含む、
　人々のありのままの姿を引き出したいのであれば、
　職場に安全であたたかい空間をつくる必要がある」**


## カイゼン・ジャーニー市谷さんのジャーニー
[我々に越境できない境界は無い (SlideShare)](https://www.slideshare.net/papanda/ss-131853685?from_action=save)
[『カイゼン・ジャーニ―』著者が語るコミュニティのつくり方 (ログミーTech)](https://logmi.jp/tech/articles/320804)

**「組織があるから、チームができるのではない。
　共通する信念があるから、チームはできる。」**

**「人と人との関わりの基準を、取引（だけ）から、共創の世界へ」**


## これからのジャーニーLT
後半はLT大会でした。

「勝手に一人で始めたローカルかんばんから始まったチーム開発」

稼働率100％男が、稼働率100％をやめるジャーニー

[『カイゼン・ジャーニー係』のジャーニー]
(https://www.slideshare.net/yasufumimoritake/ss-133847993)

[読者から主人公になる方法 Season1 最終回 ]
(https://www.slideshare.net/HirokiHachisuka/season1-133843218)
Ajaxを使った非同期通信において、processData: falseを書いていたためにパラメータが飛ばなかったのでメモ

# 詰まったところ
以下のように、processData: falseを書いていたためにdataの{category: hoge}を送ることができませんでした。processData: falseについて調べたことをメモします。

```javascript
      $.ajax({
        url: '/urls/research/',
        type: 'GET',
        data: {category: hoge},
        dataType: 'json',
        // processData: false  ← falseにしていたためにcategoryパラメータが送れなかった
        contentType: false
      })
```

# 環境
Ruby:　2.3.1
Rails:　5.0.1

# processDataについて

>dataに指定したオブジェクトをクエリ文字列に変換するかどうかを設定します。初期値はtrueで、自動的に "application/x-www-form-urlencoded" 形式に変換します。DOMDocumentそのものなど、他の形式でデータを送るために自動変換を行いたくない場合はfalseを指定します。（引用：[日本語リファレンス](http://semooh.jp/jquery/api/ajax/jQuery.ajax/options/） ))

### 結論から言うと、
HTTP通信でGETの際には、processDataの指定はせず初期値のtrueを利用し、POSTの際にはprocessData: falseを指定します。

### 詳細
dataに指定したオブジェクト(一番上の例でいうとcategory: hoge)をクエリ文字に変換するかどうかということです。（クエリとは、検索をおこなう際の検索条件のことで、クエリ文字列とは、検索条件に必要な文字列のことです。URLの末尾にWebサーバに送信するデータを特定の形式で表記したやつですね。）

###実際に type: 'GET'に固定してprocessDataの値を変えてみる。

+ processDataの指定はせず初期値のtrueを利用した場合
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332147/7698a9b6-a38d-f7db-5163-f356e50b8b36.png)

search/?の後のcategory変数に格納されたhogeが返還されていることがわかります。


+ processData: falseと指定した場合
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332147/1026af67-a26d-dcbe-f3ab-3f91050b4ac6.png)

HTTPメソッドがGETであるにも関わらず、dataに指定したオブジェクトをクエリ文字列に変換しないためsearchの後に何もないことがわかります。


ご指摘があればコメント欄にてご指摘いただければ幸いです。
【初心者】Unityで2D横スクロールの地面地形作成（タイルパレット）

Unityを触り始めて3日目。
今日は横スクロール用の地形タイル作成を覚えました。

# 地面の地形作成
![1.gif](https://qiita-image-store.s3.amazonaws.com/0/370076/1cb68505-0660-c9c6-91e2-98a1448c764c.gif)
練習用のUnity2Dゲームです。
マリオライクなゲームを作るにあたり、
上画像のような地面の地形データをタイルパレットで作成しました。

# 地面の作り方？
ネットで見たところ地面の作り方は
①スプライト作成
②スプライトにボックスコライダーを設定
③プレハブ化するなどして、手作業で敷き詰める？
って感じに見えたので、これは面倒だなーと思いました。

# タイルマップとは
地面などの画像データを用意してパレットに置いといて、
後はパレットの画像を選択してからゲーム画面に簡単に放り込めるスタイル。
シムシティで建物を置くようにゲーム画面に画像を配置できます。
当たり判定なども簡単に設定できました。

# 実際に作ってみた
<img width="310" alt="SnapCrab_NoName_2019-3-1_23-54-50_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/370076/7144f0c8-bae2-93aa-2dc0-2c5bdfa6c83b.png">
まずは上画像のようにタイルパレットを表示させる。

<img width="183" alt="SnapCrab_NoName_2019-3-1_23-57-31_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/370076/0450085a-352a-bd18-d621-c46eccc68a22.png">
新しいパレットを作る

<img width="252" alt="SnapCrab_NoName_2019-3-1_23-57-48_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/370076/d33c3f1e-c2f7-70f1-7e33-a7f4ab18f05a.png">
名前は分かりやすく付ける。何でも良い！
これでパレットが出来上がるので、好きな画像をドラッグアンドドロップするとタイルに登録できます。

<img width="209" alt="SnapCrab_NoName_2019-3-2_0-2-20_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/370076/f1b16759-93ad-c49d-4e7d-fac127557e03.png">
試しに何個か登録しました。

<img width="419" alt="SnapCrab_NoName_2019-3-2_0-3-36_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/370076/b4959cdf-c0e3-f44f-a4e2-9309e72a1441.png">
お次はパレットの素材を実際に乗せるタイルマップを作成

<img width="692" alt="SnapCrab_NoName_2019-3-2_0-5-21_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/370076/e52dd832-d52b-604e-c1f7-9b3bdaa68f45.png">
画面にこんな感じに枠線が引かれました。
このブロックにタイルパレットの素材をワンクリックで乗せることが可能になりました。

![2.gif](https://qiita-image-store.s3.amazonaws.com/0/370076/13b52df4-0c22-89e4-219e-4096fd363177.gif)
実際にパレットをタイルに乗せる様子。
これで地形データが簡単に載せられました。

# 注意事項
- このままでは地形に当たり判定が無いので、2Dタイルマップコライダーを設定すること。
逆に当たり判定が必要ないものはそのままで良い。（背景の草とか雲とか）
- タイルマップに画像を乗せるときに枠線一杯に表示させたいときは、元画像のインスペクターの「1ユニットのピクセル数」を元画像の横（もしくは縦）のピクセル数と同じにしよう。
巨大なプルリクエストをレビューするときにファイルごとにレビュー済みマークをつけるChrome拡張を作った

2019年7月7日追記
似たような機能がGitHubに実装されました。
https://dev.classmethod.jp/tool/github-mark-files-as-viewed/

巨大なプルリクエストのレビューをするときに、以下のような悩みがありました。

* 上から順番に見てくと効率が悪い
  * 依存する側のコードとされる側のコードが1つのプルリクエストに入ってる場合は、依存される側から見たい、とか
* 見るべき順番で見ていくとどれがレビュー済みで、どれがまだ見てないのかがわからなくなる

一旦ファイル名を全部書き出してエディタでTODOを管理したりしていたのですが、めんどくさいのでChrome拡張を作りました。

# gh-big-review

* [chromeウェブストア](https://chrome.google.com/webstore/detail/gh-big-review/kehopiiepaijcngedhlfkaoigjgcglhn?hl=ja)
* [GitHub](https://github.com/inabajunmr/gh-big-review)

## 挙動
こんな感じです。

![kusodeka.gif](https://qiita-image-store.s3.amazonaws.com/0/220908/82910ff3-cd9b-96b9-9947-1a84f0cf60f6.gif)


1. アイコンを押すと一旦差分が全部折りたたまれる
2. ファイルをクリックすると色がつく(レビュー済み)

## TODO
永続化してないので一旦離れてしまうと色が消えるのでその辺をなんとかしたい気もしています。
あとはGitHubのUIじゃなくてファイルツリーをファイルツリーっぽく表示して、ファイル押すと差分が展開するようにしたいです。
MySQL8.0 にしたら Sequel Pro が使えなくなっちゃった

# はじめに
Docker で DB コンテナを MySQL のイメージを使って作った。
（この認識で合っているのか？）
その時、バージョンの指定をしていないので最新が入った（のか？）

```console:mysql
# mysql --version
mysql  Ver 8.0.15 for Linux on x86_64 (MySQL Community Server - GPL)
```
まあ、なんにせよ、バージョンは 8.0 なわけである。

[作った時に書いた記事](https://qiita.com/yasudanaoya/items/5e3a69c36cf9781500cf)

研修で sequel pro と言う MySQL の GUI ツールの存在を知ったので、
せっかくなら自習でも使ってみようと言うことでインストールをした。

# やったことと起こったと

## 1. インストール
※ これは失敗例です。
早く答えが知りたいせっかちさんは [こちら](#4-解決黒頭巾) へ

```console:brew
$ brew cask install sequel-pro
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/321282/d1014ca7-65ca-8ac1-b96c-53656ae464eb.png)
パンケーキだ

## 2. 接続
サーバの立ち上げについては割愛

情報を入力して、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/321282/e582c750-3d74-ab33-1f6b-2548896f248c.png)

`接続が成功しました` を確認
⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️

![image.png](https://qiita-image-store.s3.amazonaws.com/0/321282/3130031b-645e-2190-e66b-05a66ca47013.png)

__は？？？成功したんじゃねえのかよ__

と、このように、キレてはいけません。

冷静に
⬇️
## 3. ググった
ら、すぐ出てきた
[解決方法](https://qiita.com/KeisukeToyota/items/1c128729127feed7597f)
[公式のissue](https://github.com/sequelpro/sequelpro/issues/2699#issuecomment-432431710)

なんと パンケーキは MySQL8.0 に対応していないらしい。
パンケーキの夜版？？？をインストールする必要があるらしい。

## 4. 解決黒頭巾
リンク先の方法に習って、 sequel pro の再インストールをした
夜バージョンに交換
同じ名前のアプリを２つ持てないから削除する必要があるのであーる

```console:brew
$ brew cask uninstall sequel-pro
$ brew cask install homebrew/cask-versions/sequel-pro-nightly
```
できた。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/321282/4e04d20e-9293-fb4e-0ffd-ffe99993f8e7.png)
> パンケーキ(はがねタイプ)

接続がめん
![image.png](https://qiita-image-store.s3.amazonaws.com/0/321282/b49aa201-264a-d960-1a52-eb4fafd40871.png)
できた
![image.png](https://qiita-image-store.s3.amazonaws.com/0/321282/81e0611b-8423-e2e5-5f84-991d3eed8b12.png)

...かっこいい...とてもクールだ、さすが夜バージョン



# まとめ

> 『メタルコート』を持たせた『 Sequel Pro 』 を夜に通信交換したら進化する  

って感じ
...通じない人はポケットモンスター金/銀 をやってください
[![image.png](https://qiita-image-store.s3.amazonaws.com/0/321282/7d41213a-dd48-3953-12cc-69ad2d16d7b2.png)](https://www.amazon.co.jp/%E4%BB%BB%E5%A4%A9%E5%A0%82-NINTENDO-GAME-BOY-COLOR/dp/B00002T11B)
プランクトレーニングしようぜPWA

## はじめに
こんな記事をみかけたのでトレーニングをはじめてみました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">体重落としたい、お腹周りスッキリさせたいって方に全力でおすすめするのが5分筋トレ！！<br>これ本当にめちゃくちゃしんどくて未だに私も全身プルプル震えながらやってます😂<br>でも、1日1回5分で終わるから続けやすいしちゃんと続ければ効果も目に見えて実感出来るのでぜひ1度やってみてほしいです…！！ <a href="https://t.co/32jSGcEkDq">pic.twitter.com/32jSGcEkDq</a></p>&mdash; 翠 (@sui_5a) <a href="https://twitter.com/sui_5a/status/1094874588201119744?ref_src=twsrc%5Etfw">2019年2月11日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

最初はスマホのストップウォッチで5分を図っていた。
→ 使いにくい。次なにやるか覚えられない（←体幹より先に鍛えるとこあるん:flag_jm:）
→ じゃあ作ろうじゃないか。
→ 使いやすいのはネイティブアプリかなぁ。
→ あ、PWAやってみたい。

## 技術ワード
- Vue.js
- localforage
- PWA
- bootstrap
- github.io


## 解説
PWAは、参考URLを参照。
要望あれば書きます。

## できたもの
![pwa-plank-watch.png](https://qiita-image-store.s3.amazonaws.com/0/308842/d9644eea-f10d-6ae9-2d7c-1aeaa95facff.png)

- [pwa-plank-watch](https://z589app.github.io/pwa-plank-watch/#/)


## 参考URL
- [nagasawaaaa/vue-simple-stopwatch: Vue.js を使ったシンプルなストップウォッチ](https://github.com/nagasawaaaa/vue-simple-stopwatch)
これが原型です。ありがとうございます。

- [Vue.jsで始めるPWA - Qiita](https://qiita.com/gyarasu/items/2f18edc4ae251180d89e)
- [はじめに — Vue.js](https://jp.vuejs.org/v2/guide/)

## おわりに
- Qiita初投稿。
- 普段はPythonでWeb系はじめてなのでわからないこといっぱい。
  - 変なとこあったら指摘お願いします。
- PWAおもしろい。
- ディスプレイ消えるのどうにかしたい。
  - [今からでも間に合う！　JavaScriptのWake Lock APIの使い方 - Qiita](https://qiita.com/uhyo/items/f72edd71e4601768ff25)
- かっこいいデザインにしたい。
- もてたい。
- :flag_jm: ←ジャマイカ
WPFでアプリ開発して得られた知見と感想

###はじめに
サラリーマンなプログラマです（自己紹介）。
2018年に仕事でWPF新規アプリ開発をやったので知見をまとめておきます。

 - パッケージ開発
 - 全体で50KStepくらいのWPFアプリをチームで新規開発
 - 自分はリードエンジニアとしてOSSの選定から設計や実装までがっつりやらせてもらえました（幸せ

###MVVM関係

####そもそもMVVMで作るべきか
大抵の場合は作るべきです。作ってよかった。
作らなくていいのは今後絶対に保守しないことが分かっている場合と、規模がかなり小さい場合。ですが、未来のことは分からないので「あり得ない」なんてことはあり得ないような気がする。

MVVMに限らずなんとかパターンというのはほとんどの場合設計に冗長性を持たせて将来の変更要求に柔軟に対応するってことなんだと思いますが、将来の変更要求自体がない場合とか柔軟に対応せずに全パターン力技でテストできるくらい規模の小さいアプリならパターンを適用するために冗長性を実装する初期投資のデメリットの方が大きいかもしれません。

####ViewModelはなるべく薄くする
- ViewModelに書く処理を可能な限り減らすこと
- ほとんどの場合ViewModelに書く処理はModelかViewに書くことができる
- なんとなく以下のことに気をつけたら上手くいった
  - ViewModelでModelのメソッドの戻り値を受け取らない
  - ViewModelでModelのメソッド呼び出しの例外をキャッチしない
  - ViewModelでModelの非同期メソッドを待機しない

反省点として、可能な限り状態の保持や処理をModel側に追い出した結果、今度はModel側がアプリのステート（これは画面遷移をまたいでも維持しておきたい画面の状態とかも含む）と、アプリのステートとは無関係なビジネスロジックとで混沌としてしまったこと。

と言ってもPresentation側が混沌とする100倍はマシなので合格点は取れたと思ってます。

Model側も何層かに分けて、たとえばユースケース層とエンティティ層みたいな感じで分けて、アプリのステートの保持と加工、永続的な情報の保持と加工、ってデータの寿命ごとに責務を分割できればもっと見通しが良くなったかもしれない。

####ReactiveXXXを活用する
VMの役割はModelのプロパティを（必要があれば変換して）Viewに公開すること。
そのためにはModelのプロパティの更新通知を受け取って自分のプロパティを同期する仕組みが必要ですが、真面目にイベント構文だけで作るとかなりしんどい（特にコレクションの同期）。
ReactivePropertyとかReactiveUIを使うとプロパティの同期をかなり簡潔に記述できます。自分はReactiveProperty使ったんですけどめっちゃ良かったです。

微妙に足りない部分はReactivePropertyのソースコード見ながらユーティリティ作って拡張していった。

###バックグラウンドで処理しようとすると最初になんか固まる
```csharp
ThreadPool.SetMinThreads(300, 300);
```

こんな感じでスレッドの最大数を設定してやればよい、というのを見つけたので試してみたらめっちゃキビキビ動くようになたのでこれ必須。

###マシンにメモリたくさん積んでるのにOutOfMemory例外が出る
でかいオブジェクトを頻繁に作成と破棄する場合はメモリの断片化が起きてる可能性が高い。
LOHのコンパクションを有効にしてみると有効な場合あり。

```csharp

GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
```

また、純粋にメモリ使用量が多すぎる場合として、32bitアプリの場合、そもそもプロセスが2GBくらいしかメモリを使えない（そのうち1GBくらいをモジュールの読み込みとかで使うので実質1GBくらいしか使えない）という制約があって、そこに引っ掛かってる可能性あり。
ビルド後のexeファイルのバイナリを書き換えて4GBまで使えるようにする方法がある（LAAオプション）。

```
editbin.exe /largeaddressaware "【exeファイルのパス】"
```

ただ、これでも使えるのは4GBまでなので、根本的にはメモリ使用量を減らすか、AnyCPUとか64bitアプリとしてビルドする方がいい。

自分の場合は（政治的な理由で）どっちの修正方法もできなかった。いつか直す。

**2019-11-18 追記**
他に共有メモリに情報を退避させるという方法もありますね。共有メモリはプロセスのメモリ上限にひっかからないらしいです。 
ただ、解放漏れがあるとマシン再起動まで続くメモリリークが発生すると思われるので、古い資産や環境をサポートしたいといった事情がない限り、新しく作るアプリは素直に64bitのみサポートとするのが楽だと思います。

###Rx便利
ReactiveExtensions（あとReactiveProperty）、業務で使ったのはこれが初めてだったのですが予想以上に便利です。サンプルコードとかだとあんまり便利さが伝わらないかもですが、今までC#標準のイベントでがりがりやってたところをさっくり実装できるのでめちゃくちゃスッキリします。
vegeta（負荷試験ツール）

# 概要
vegeta という負荷試験のツールが存在する。
バイナリをダウンロードしてくるだけで利用でき、とても便利なツール。
https://github.com/tsenart/vegeta

# 手順
インストール方法については、README に記載されているので、
こちらではツールを叩く部分を見てみる。

## サーバを立てる

``` server.go ```

```
package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, World")
}

func main() {
    http.HandleFunc("/", handler) // ハンドラを登録してウェブページを表示させる
    http.ListenAndServe(":8080", nil)
}
```

こちらを起動する

```
% go run server
```

別ターミナルでcurl を発行すると次のような感じ

```
% curl localhost:8080
Hello, World%
```

## query ファイルを準備
```
% cat query.txt
GET http://localhost:8080
```

## vegeta で負荷をかけてみる
```
% vegeta attack -targets=query.txt -rate=10 -duration=5s | tee result.bin
```

## 結果を確認
```
% vegeta report result.bin
Requests      [total, rate]            50, 10.20
Duration      [total, attack, wait]    4.904822344s, 4.904353s, 469.344µs
Latencies     [mean, 50, 95, 99, max]  465.922µs, 409.143µs, 619.695µs, 1.810705ms, 1.810705ms
Bytes In      [total, mean]            600, 12.00
Bytes Out     [total, mean]            0, 0.00
Success       [ratio]                  100.00%
Status Codes  [code:count]             200:50
Error Set:
```

手軽に負荷試験ができて、とても良い感じですね^^

## ついでにpython のサーバではこんな感じになった
```
# サーバを起動しておく
% python -m http.server 8080
Serving HTTP on 0.0.0.0 port 8080 ...

# vegeta を実行の上結果を取得
% vegeta attack -targets=query.txt -rate=10 -duration=5s | tee result.bin

% vegeta report result.bin
Requests      [total, rate]            50, 10.19
Duration      [total, attack, wait]    4.906335987s, 4.904734s, 1.601987ms
Latencies     [mean, 50, 95, 99, max]  1.691173ms, 1.580345ms, 1.904286ms, 5.657317ms, 5.657317ms
Bytes In      [total, mean]            35500, 710.00
Bytes Out     [total, mean]            0, 0.00
Success       [ratio]                  100.00%
Status Codes  [code:count]             200:50
Error Set:
```

go の方がレイテンシが随分早いですね^^
オブジェクトとメソッドとクラスと。

# オブジェクトとメソッドとクラスと。

- [目次]
	- [オブジェクト指向とは]
	- [オブジェクト・メソッド・クラス]
	- [オブジェクト]
		- [メソッド]
	- [クラス]
		- [組み込みクラス]
		- [継承]

## オブジェクト指向とは
オブジェクト指向とは<br>
**『行うべき処理とその対象をひとかたまりで捉える事』**<br>
ここは概念的な部分ですので解釈が難しいと思います。<br>

## オブジェクト・メソッド・クラス
<img width="919" alt="スクリーンショット 2019-03-21 23.37.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/325126/eaf98bec-2264-757d-7563-58021a800edb.png">

## オブジェクト
オブジェクトは<br>
**行うべき処理（メソッド）とその対象（データ）をひとかたまりで表したもの**<br>
です。
### メソッド
メソッドとは**処理の塊**のこと。<br>
複雑なロジックを簡単に呼び出せるようにしたもので色々な処理を使い回しできます。<br>

メソッドの実行を開始することを**『呼び出す』**と言います。<br>

## クラス
クラスとは**オブジェクトの設計図**。<br>

クラスには色々な種類のものがあります。<br>
ex)数値クラス(Numeric)、文字クラス(string)<br>

**クラス毎に利用できるメソッドが決まっています。**<br>

オブジェクトのクラスを調べるには`classメソッド`を使用します。<br>
classメソッド：`オブジェクト.class`

example

```rb
irb(main):001:0> 0.class
=> Integer
irb(main):002:0> "こんにちは".class
=> String
irb(main):003:0> [1,2,3].class
=> Array
```

### 組み込みクラス
Rubyで最初から処理が決定されているクラス。

### 継承
あるクラスの定義を、そのまま他のクラスの処理に引用すること。<br>

引用元のクラスを**『スーパークラス』**。<br>

引用した先のクラスを**『サブクラス』**と言います。

<img width="1259" alt="スクリーンショット 2019-03-21 23.51.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/325126/d647148a-8e50-4ac7-391b-8b8e83ec48f9.png">
2次元配列の初期化、Ruby、JavaScript

#2次元配列とは
2次元配列に入る前に・・・
1次元配列とは、普通の配列のことで、 **1 方向（横）** のみの配列です。（ex. array = [1, 2, 3, 4]）

2次元配列とは、**2 方向（縦横）**の配列です。
理系出身の方や数学が得意な方は、行列を想像していただければわかりやすいです。
文系出身で数学が苦手な方は、エクセルをイメージしてください。

###example
下の array は ３ × ４ の2次元配列です。
array = 
["A", "B", "C", "D"]
["E", "F", "G", "H"]
["I", "J", "K", "L"]

array[0][0] → "A"
array[3][2] → "J"

#Rubyの2次元配列

```ruby:file.rb
# ３ × ４ の2次元配列
a = 3.times.map{Array.new(4){ '' }}

#　H × W の2次元配列 (HとWに数字を代入すると使えます。)
a = H.times.map{ Array.new(W){ '' } }

#　NG例 : a = H.times.map{ Array.new(W, '') }
#    →　全ての要素が同じ文字列オブジェクトになってしまうので，
#       1つの要素を書き換えると他の要素も一緒に書き換わってしまいます。
```

#JavaScriptの2次元配列

```javascript:main.js
// ３ × ４ の2次元配列
var a = (new Array(3)).fill("").map(() => (new Array(4)).fill(""));

// H × W の2次元配列 (HとWに数字を代入すると使えます。)
var a = (new Array(H)).fill("").map(() => (new Array(W)).fill(""));

//　NG例 : var a = (new Array(3)).fill((new Array(4)).fill(0));
//    →　全ての要素が同じ文字列オブジェクトになってしまうので，
//       1つの要素を書き換えると他の要素も一緒に書き換わってしまいます。
```

#まとめ
RubyとJavaScript以外でも新たに学ぶことがあれば、どんどん追加していきます。

##追記
butchi_y様、scivola様のご指摘により、ブロックを使って初期化しないと同じ文字列オブジェクトができていしまうことが分かりました。
自分が分かったつもりのことでもブログを使ってまとめることで、分かっていない詳細についても教えていただけて勉強になりました。

##参考
[リンク]https://qiita.com/r_fukuma/items/989b178a92bebb305386
[リンク]http://www9.plala.or.jp/sgwr-t/c/sec09.html
[リンク]https://qiita.com/butchi_y/items/db3078dced4592872a9c

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
RX570 16GB版のTensorflow-BenchMarks(Tensorflow-ROCm)結果

自分でAMD GPUベンチマークの測定結果を貼ってまとめたものからRX570 16GB仕様の結果のみを抜粋したものです
https://qiita.com/_JG1WWK/items/1db6504c77894c0f08aa#rx470-16gb-4

#RX570 16GB版について
http://www.gdm.or.jp/pressrelease/2019/0123/291516
>>暗号通貨「Grin」のマイニングに最適なRadeon RX 570

らしいです

VRAM多め仕様なので深層学習にも転用できる可能性を今回模索したいと思います。

#ベンチマーク
```AMD_GPUでTensorFlow benchmarksを行い深層学習性能のおおよその性能を検証する(仮）```
・InceptionV3
・ResNet-50
・ResNet-152
・Alexnet
・VGG16
各種モデルの学習ベンチマークになっています

環境構築と実行コマンドは上記の記事通りに行っています、FP16は使っていません


#結果![Screenshot from 2019-03-22 00-10-47.png](https://qiita-image-store.s3.amazonaws.com/0/232732/480754f3-b462-5955-d83e-1c14937c615b.png)


RadeonⅦの3-4割ぐらい・・？の性能でしょうかもうちょっとかんばってほしい感じはあります

#備考
これは上記の記事中にも書かれていましたが大事なことなので書いておきます

##RX570 16GB版を稼働させるときのメモ
ベンチマーク実行時にgfx803_32.cd.pdb.txtが無いぞとうるさいので勝手にgfx803_36.cd.pdb.txtをリネームしたものを複製して無理やり動かしました。以下のパスに該当テキストがあります。

```
/opt/rocm/miopen/share/miopen/db$ ls
gfx803_32.cd.pdb.txt  gfx900_56.cd.pdb.txt  gfx906_60.cd.pdb.txt
gfx803_36.cd.pdb.txt  gfx900_64.cd.pdb.txt  gfx906_64.cd.pdb.txt
gfx803_64.cd.pdb.txt  gfx906_56.cd.pdb.txt
```
Python のスライスの抜き出し末尾指定（None）

こんにちは。
Python のリストのスライスで、第二引数が抜き出し末尾指定 (exclusive) ですが、何も指定しないとリスト自身の末尾（逆順の場合は先頭）を指定したことになります。代わりに `None` を指定しても同じことになります。

```python
>>> [i for i in range(3)[::]]
>>> [i for i in range(3)[:None:]]
[0, 1, 2]
>>> [i for i in range(3)[::-1]]
>>> [i for i in range(3)[:None:-1]]
[2, 1, 0]
```

例えば、下記で `-1` を使うとエラーとなるので、代わりに `None` を使う方法があります[^1]。

```python
>>> [range(3)[:i:-1][-1] for i in [1, 0, None]]
[2, 1, 0]
>>> [range(3)[:i:-1][-1] for i in [1, 0, -1]]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <listcomp>
IndexError: range object index out of range
```

[^1]: `None` による代用は不自然にも見えるので、`-1` の使用を許して欲しい気がします。
reverse Proxy Mod_security

CRSを使用してMod-Securityをインストールしましたが、OWASPルールがクライアントをブロックしました。
クライアントリクエストのメタデータ文字が問題になって（modsecurityではインジェクションとして解釈され）、ドロップされます。 助けてください ！！！

***Log**
[Fri March 3 11:7:22 2018] [error] [client 10.4.118.123] ModSecurity: 
Warning. Pattern match "([\\\\~\\\\!\\\\@\\\\#\\\\$\\\\%\\\\^\\\\&\\\\*\\\\[\\\\]\\\\|\\\\:\\\\;\\"\\\\'\\\\\\xc2\\xb4\\\\\\xe2\\x80\\x99\\\\\\xe2\\x80\\x98\\\\`\\\\<\\\\>].*?){4,}" at ARGS:rid. 
[file "/etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_41_sql_injection_attacks.conf"] [line "170"] [id "981173"] [rev "2"] 
[msg "Restricted SQL Character Anomaly Detection Alert - Total # of special characters exceeded"] 
[data "Matched Data: - found within ARGS:rid: 496ef4f5-9da1-4331-9bb7-f5ed4dff0d6e"] [ver "OWASP_CRS/2.2.6"] [maturity "8"] [accuracy "7"] 
[hostname "zrrdo.com"] [uri "/dtp/frontoffice/api/v5/covea/gmf/c688e6f9-d07a-544b-8924-861da42e2d08/document/doc-a675095e-8e98-466c-85a5-8a77040f65f8/index.json"] 
[unique_id "XEiFgsCoczMAAAQVcxMAAAFK"]_
RailsアプリケーションでElasticsearchのマッピングを更新する方法

ここでは`curl`ではなくrubyのgemである`elasticsearch-rails`を利用した場合の更新方法をメモ代わりに記載します。

マッピングの追加は単純に以下を行えばできると思います。

```ruby
__elasticsearch__.create_index!
```

ただしマッピングを変更する場合、例えば既存のindexに項目を追加する際に上記コマンドを打つと400エラーになることがあります。

解決方法は二つ

## 解決方法1（おすすめしない）
単純にindexを削除して、作り直せばOKです。

ただ、Elasticsearchを使用している場合、大量にデータをindexingしている場合が多く、時間がかかってしまう場合があり、おすすめできません。
ユーザ影響も出るのでシステム停止も必要になります。

ローカルや開発環境ではこの方法でも良いかもしれません。

## 解決方法2
マッピングを更新します。

Elasticsearchにはマッピングを更新するクエリがあるので、それを利用します。

```ruby
__elasticsearch__.client.indices.put_mapping(
  index: index_name,
  type: document_type,
  body: mapping)
```

index_name, document_typeはそれぞれ使用しているもの、mappingについて少し書きます。
一般的にmappingはmodel内に以下のように記述しているケースが多いと思います。

```ruby
settings index: { number_of_shards: 5, number_of_replicas: 1 } do
  mappings do
    indexes :test_field1, type: 'keyword'
    indexes :test_field2, type: 'keyword'
  end
end
```

こいつを渡せば良いですが、私は以下のように渡しています。

```
__elasticsearch__.client.indices.put_mapping(
  index: index_name,
  type: document_type,
  body: self.mappings.to_hash)
```

## 所感
解決方法１も私はローカルではよく使いますが、本番環境で行う際は解決方法2を利用しています。
理由は上記にも書いた通り、データをindexingし直すのが非常に時間がかかるためです。
データが少ない場合は解決方法1でも良いと思います。（またはユーザ影響のないElastcisearchの場合とか）
Nuxtプロジェクトでローカルネットワークからもアクセス出来るようにする方法

今回はNuxtプロジェクトでローカルネットワークからもアクセス出来るようにする方法を解説します。スマホやタブレットでプロジェクトを開くときに必要ですよね。

## Nuxtプロジェクトでローカルネットワークからもアクセス出来るようにする方法
(僕は`create-nuxt-app`でNuxtプロジェクトを始めたので、それに依存があったらすみません。)

```bash
$ npm i cross-env
```
そのあと、package.jsonのscriptのdevのところを、`cross-env NODE_ENV=development HOST=0.0.0.0 PORT=3000 nuxt`
に変更して下さい。
あとは

```bash
$ npm run dev
```
でOKです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Javaの基礎文法

# 今日学習したこと

プログラム実行の流れ
⑴ソースコードを書く。
⑵ソースコードをコンパイラーというソフトウェアでバイトコード(数字の羅列)にコンパイルする。
⑶バイトコードをインタプリタ（JVM）というソフトウェアでマシン語に変換してコンピュータのCPUに送る。



- Javaファイルの拡張子は.javaになる。

```ruby:クラス名.java
public class クラス名 {
  public static void メソッド名 (String[] args) {
    #処理を書く;
  } 
}
```

この文法をそのまま暗記しております 笑
クラスの中をクラスブロック、メソッドの中をメソッドブロックと呼びます。


- System.out.println(　);

引数に取った値を出力させる。



### 変数の定義

変数の定義は

```ruby:java
データ型 変数名;

#例えば
int price; #最初に変数を宣言しておく。
price = 100; #次に変数にデータを代入する。
```


また変数の宣言と代入を同時に行うこともできる。
(この方法を変数を初期化と呼ぶらしい)


```ruby:java
データ型 変数名 = 値;

#例えば
int price = 100;
```

変数は上書きできる。
だが円周率だったり、税率だったりは変わらないため、上書きされると面倒なことになる。
そのためfinalを付け加え定数にし、代入する。
定数は原則半角大文字で宣言する。

```ruby:java
final int PRICE = 100; #final付きで宣言すると値を書き換えることができない。
```

データ型の種類

|分類|型名|格納するデータ|
|---|----|----------|
|整数|long|大きな整数(消費メモリ 8バイト)|
||int|普通の整数(消費メモリ 4バイト)|
||short|小さな整数(消費メモリ 2バイト)|
||byte|さらに小さな整数(消費メモリ 1バイト)|
|少数|double|普通の少数|
||float|少し曖昧でもいい少数|
|真偽値|boolean|trueかfalse|
|文字|char|1つの文字('で文字を囲む)|
|文字列|String|文字の並び("で文字を囲む)|


- オペランド・演算子


```ruby:java
age = 20 + 5; #演算子である=や+以外のageや20、５(変数や値のこと)がオペランドと呼ばれる。
#全ての式はこの２つの要素だけで構成されています。
```

オペランドの中でも、変数に代入される値、ソースコード内に記述した数字、文字、文字列の値のことをリテラルと呼ぶ。
リテラルはそれぞれデータ型を持っている。


- 代入演算子

```ruby:java
a = 10; # =>10, 右辺を左辺に代入する
a += 10; # =>a = a + 10, 左辺と右辺を加算して左辺に代入, 文字を加算の対象とした場合左辺と右辺が連結される
a -= 10; # =>a = a - 10, 左辺と右辺を減算して左辺に代入
a *= 10; # =>a = a * 10, 左辺と右辺を乘算して左辺に代入
a /= 10; # =>a = a / 10, 左辺と右辺を除算して左辺に代入
a %= 10; # =>a = a % 10, 左辺と右辺を除算してその余りを左辺に代入
```

- インクリメント・デクリメント演算子

```ruby:java
a++(または++a); # =>a + 1,　aに対して1だけ加算される。
a--(または--a); # =>a - 1, aに対して1だけ減算される。
```

ただし、インクリメント・デクリメント演算子を他の演算子と一緒に使ってしまうと微妙な違いが生じるので、なるべく単体で使用する。

- 型の変換

①代入時の自動型変換
byte < short < int < long < float < double
　　　   　小　←　　　　→　大 
小さい型の値を大きな型に代入する場合代入される値が代入先の変数の型に自動的に変換されてから代入が行われる。
プログラミング初めの始め  〜 ツール準備と出力 〜

『さて，プログラミングをやってみよう！』と思ったら，ツールを準備しましょう．
今回は，プログラミング初心者でも理解しやすいRubyを実行するために必要なものを3つ挙げてみたいと思います．

Rubyでプログラムを実行する流れとしては
**「テキストエディタ」にコードを書いて，「ターミナル」で実行する．** これがプログラムの流れです．

用意するもの
　・PC：Macがオススメ
　・ターミナル（Windowsの場合は「コマンドプロンプト」と置き換えて考えて下さい）
　・テキストエディタ

#テキストエディタとは
テキストエディタとは，文字通り **”Text = 文字” を  "Editor = 編集する" もの** で，文字だけのファイルを作成・編集するソフトウエアのことです．

MicrosoftのWordやMacのPagesも同様に文字を編集することができますが，これらは大きさやフォント，レイアウトなど見かけを設定することができ，**テキストエディタは文字のみ編集できものです．**

見かけの編集はできないので，単調なのですが，プログラミングを行う上ではこれが大切になります．

ヒトによって見かけをあれこれ編集されると，統一性もないし逆に分かりにくくなるから．

テキストエディタには様々な種類があります．
MacOSに内蔵されている"Submit textile"もありますが，**個人的には"Atom"がオススメです！**

[Atomダウンロードはこちら](https://atom.io/)

#ターミナルとは
ターミナル (Terminal) は、アップルのmacOSに標準で付属しているUNIX端末エミュレータ。
直接入力したUNIXコマンドを実行する他、UNIXコマンドの実行を自動化するTermファイルを作成、実行することも可能である。
[wiki](https://ja.wikipedia.org/wiki/%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB_(macOS))


わかりにくいので解釈すると…
・MacOSを購入した際にあらかじめインストールされているアプリのｈとつ．
・すべての操作を「文字」で表現できる．
・キーボードを使って文字の命令を打ち込むことで，マウスを操作しなくてもコンピューターの設定や操作ができるようになるもの．

つまり，**キーボードで入力した文字でコンピュータを設定したり操作することができるアプリ．**
この設定や操作といった命令のことを“コマンド”と言います．

通常は利用する必要はあまりありませんが，Macでプログラミングを行う場合には使用します．


#ターミナルの起動
1. Macのデスクトップ画面の上部にある「移動」をクリック
2. 「アプリケーション」を選択
3. 「ユーティリティー」を選択
4. 「ターミナル」をクリック．これで準備完了です！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/364118/580c5472-cea6-cbc2-a5d2-a547d44d7b09.png)
立ち上げるとこのようになります．

#テキストエディタにコードを書く
プログラマーあるあるで，**「まずは "Hello World!"」** というものがあります．
まずは言われるがままにやってみて下さい．

1. テキストエディタに以下のコードを書きます

```ruby 
puts "Hello World!"
```

2.  保存します（**「command + s」で保存します．これをやらないと編集したものが反映されません．**）

3.  保存先をデスクトップにして，ファイルの名前を**「ruby.rb」** にします．（拡張子を「〜.rb」とします．これがrubyを扱っていますよ！という証です．）

#ターミナルで実行する
1.テキストエディタを保存した場所に移動する．

```md
cd desktop
```
上記のように入力し，enterキーを押すと…
![image.png](https://qiita-image-store.s3.amazonaws.com/0/364118/cda8bab6-9b2a-bd63-db42-d4568e942b70.png)
のようにdesktopに移動しました．



2.ファイル名を入力する

```md

ruby ruby.rb
```
上記のように入力して，enterキーを押します．

3.「Hello World!」が出力されていることを確認する．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/364118/02614c96-1051-a059-ba9b-99871cc682ae.png)

#まとめ
・プログラミングを始めるにあたって，準備するものは「PC（Mac）」「ターミナル」「テキストエディタ」の３つ
・「テキストエディタ」にコードを書いて，「ターミナル」で実行するとコードが出力される
・今回はRubyで「Hello Wolrd!」を出力してみた
pythonでNumer0n(ヌメロン)を作る　part3

#＜はじめに＞
[pythonでNumer0n(ヌメロン)を作る part2](https://qiita.com/kneecat/items/d134704ab0df9f1b5193)の続きです。

#今回作成したもの
今回は➀**1度予想した数字は以後予想しない。**➁**eatとbiteを足して3の時、以後それらの数字のみ使う。**の２つの機能を付け加えました。

#コード全体
```python
import random
available_number = [0,1,2,3,4,5,6,7,8,9]

while True:
    my_number = input("0～9の数字を使って3桁の数字を作ってください（重複なし）")
    if my_number.isdigit() and len(set(my_number)) == 3:
        break
used_number = []
times = 0
enemy_number = None
while enemy_number != my_number:
    times+=1
    while True:
        selected_number = random.sample(available_number,3)
        enemy_number = "".join(map(str,selected_number))
        if used_number.count(enemy_number) != 0:
            continue
        break
    eat = sum(my_number == enemy_number for my_number, enemy_number in zip(my_number, enemy_number))
    bite = sum(enemy_number in my_number for enemy_number in enemy_number) - eat
    if eat == 0 and bite == 0:
        available_number.remove(selected_number[0])
        available_number.remove(selected_number[1])
        available_number.remove(selected_number[2])
    if eat + bite == 3:
        available_number = selected_number
    used_number.append(enemy_number)
    print("コンピューターが予想した番号:", enemy_number)
    print(f"{times}回目: {eat}EAT {bite}BITE")
    print("----------------------------------------")
    
print("数字を当てました！！！褒めてください！！！")
print(f"{times}回目で当てられました。")
```
#補足
その１ **1度使った数字の格納**
・used_number(8行目)に1度予想した数字を格納します。
enemy_numberがused_numberと重複していないかをcountを使って調べています。(16行目)

その２ **eat + bite = 3の時の対応**
・この条件を満たすのは3eat 0bite,1eat 2bite,0eat 3biteのときです。(1eat 2bite,2eat 1biteなどは今回のゲームでは成り立ちません)また、3eat 0biteは正解の時なので、**1eat 2bite**,**0eat 3bite**が出たときに以後それらの3つの数字を使うようにします。その１で述べたように、今回は同じ数字を予想することはないので、この条件が成り立てば少なくともあと5回の予想で数字を当てられるということになります。条件を満たすとき、available_number = selected_number(26行目)でavailable_numberを更新します。
#考察
![image.png](https://qiita-image-store.s3.amazonaws.com/0/380079/60b5174c-6f2b-a398-5556-6ca4d42b616e.png)
前回と同じように200回試行しました～
#おわりに
だいぶ強くなったようです。うれしいです"(-""-)"
正直ここからさらに強くさせるのは一気に難易度が上がりそうな気がします。ぐぬぬぬぬ
コメントお待ちしております。
最後まで読んでいただきありがとうございました。
え！！　9行で素数を！？

出来らあっ！

```Kotlin
val primeSequence = sequence {
    val primes = mutableListOf<Int>()
    (2..Int.MAX_VALUE).forEach { int ->
        if (primes.all { int % it != 0 }) {
            primes += int
            yield(int)
        }
    }
}
```

## 使ってみる

### 先頭の10要素を標準出力する

```Kotlin
fun main() {
    primeSequence
        .take(10)
        .forEach(::println)
}
```

<details>
<summary>結果の標準出力</summary>
```
2
3
5
7
11
13
17
19
23
29
```
</details>

## 第10000要素を標準出力する

```Kotlin
fun main() {
    primeSequence
        .elementAt(10000 - 1)
        .let(::println)
}
```

結果の標準出力

```
104729
```

これくらいなら一瞬。
もう1桁増やすと少し待たされる。

## 解説

知らない人がいそうなのは次の2つくらいか。

- [`..`](https://qiita.com/sdkei/items/2abb39a65ab5a803be1f)
- [`sequence` と `yield`](https://qiita.com/sdkei/items/cc3d7846b09c87603718#sequence-関数)

ロジックは解説するほどではないだろう。

## 改善の余地

- `primeSequence` を使うたびに素数のリストを最初から計算し直してしまうのが無駄
- 並列処理で高速化できそう