OmniAICreator/Qiita-1.07M huggingface dataset:
ロジスティック回帰(Logistic Regression)

## はじめに

これは筆者の勉強まとめページですので、指摘しまくってい頂けると幸いです

## ロジスティック回帰

線形回帰を二値分類に使用する方法で、とある閾値を超えたものを1クラス、その他のクラスを0クラスとして分類していく手法で、今回は0.5を閾値として、損失関数が以下のように設定される。

$$ y = w・x + b $$

$$ sigmoid(x) = \frac{1}{1 + \exp(-x)} $$

$$ loss = \frac{1}{n}\sum^{n}_{k = 1}{(t・log(sigmoid(y) + (1 - t)・log(1 - sigmoid(y))} $$

これを用いて2クラス分類をしていきます

```python

import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
from sklearn import datasets

sess = tf.Session()

# [setosa, versicolor] と [virginica] の分類を行う

iris = datasets.load_iris()
x_vals = iris.data
target = iris.target

y1 = [0 for i in target if i != 2]
y2 = [1 for i in target if i == 2]

y_vals = np.array(y1+y2)

learning_rate = 0.05
batch_size = 25

x_data = tf.placeholder(shape = [None, 4], dtype = tf.float32)
y_target = tf.placeholder(shape = [None, 1], dtype = tf.float32)

A = tf.Variable(tf.random_normal(shape = [4, 1]))
b = tf.Variable(tf.random_normal(shape = [1, 1]))

model_output = tf.add(tf.matmul(x_data, A), b)

loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits = model_output, labels = y_target))

init = tf.global_variables_initializer()
sess.run(init)

optimizer = tf.train.GradientDescentOptimizer(learning_rate)
train = optimizer.minimize(loss)

prediction = tf.round(tf.sigmoid(model_output))
prediction_correct = tf.cast(tf.equal(prediction, y_target), tf.float32)
accuracy = tf.reduce_mean(prediction_correct)

loss_vec = []
accuracy_vec = []

for i in range(1000):
    
    rand_index = np.random.choice(len(x_vals), size = batch_size)
    rand_x = x_vals[rand_index]
    rand_y = np.transpose([y_vals[rand_index]])
    
    sess.run(train, feed_dict = {x_data: rand_x, y_target: rand_y})
    
    tmp_accuracy, temp_loss = sess.run([accuracy, loss], feed_dict = {x_data: rand_x, y_target: rand_y})
    
    loss_vec.append(temp_loss)
    accuracy_vec.append(tmp_accuracy)
    
    if (i + 1) % 25 == 0:
        
        print("Step #" + str(i + 1) + " A = " + str(sess.run(A)) + " b = " + str(sess.run(b)))
        print("Loss = " + str(temp_loss))
        print("Acc = " + str(tmp_accuracy))

plt.plot(loss_vec, "k-")
plt.title("L2 Loss per Generation")
plt.xlabel("Generation")
plt.ylabel("L2 Loss")
plt.show()

plt.plot(accuracy_vec, "k-")
plt.title("L2 accuracy per Generation")
plt.xlabel("Generation")
plt.ylabel("L2 accuracy")
plt.show()

```

![Unknown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257254/f85663c8-a1cb-74ed-bcfa-ebac0ca36e45.png)
![Unknown-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257254/0ce166cd-aeab-07d5-2d19-adde9eb7a46c.png)

こんな感じで学習が進んでいれば成功
うまく分類できている模様(テストデータで検証してないけど...)
ロジスティック回帰で他クラスにする手法とかないかな(ボソッ)
textareaの入力後の値を取得したい

```html:
<textarea class="form-control" rows="5" id="hoge">huga</textarea>     
```
```js:
var hoge = $('#hoge').text(); //huga
```
textareaの「入力後の」値を取得したい。
text()ではデフォルト値(huga)を取得してしまった。

```js:
var hoge = $('#hoge').val(); //入力後の値
```
val()だと、入力後の値を取得できた。
WooCommerce Subscriptions の定期購入時の支払いのフック

#WooCommerce Subscriptions の決済方法

定期購入時の決済時の処理に関しては、一回目と二回目とで異なるので、それはそれぞれフックや上書きする関数などで対応をします。

##WooCommerce Subscriptions の1回目の定期購入時決済
一般的に通常決済と定期購入決済の処理をクラスで拡張クラスを使うことが多いです。
その形のほうがわかりやすいと思います。
##通常の決済と同じ
`process_payment()`を拡張クラスを使うので上書きするような方法もあります。
その場合は、通常と同じようにしたい場合は、親クラスの関数を使う処理を提示するなどしたら良いです。

```php5:例
return parent::process_payment($order_id);
```
そして、定期購入かどうかを判別しないといけませんので、よく以下のような関数を作って定期購入を含む注文かどうかを判別します。

```php5:例：is_subscription
/**
 * Is $order_id a subscription?
 * @param  int  $order_id
 * @return boolean
 */
protected function is_subscription( $order_id ) {
	return ( function_exists( 'wcs_order_contains_subscription' ) && ( wcs_order_contains_subscription( $order_id ) || wcs_is_subscription( $order_id ) || wcs_order_contains_renewal( $order_id ) ) );
}
```
##WooCommerce Subscriptions の2回目以降の定期購入時のフック

2つ有りますが、基本的に決済方法によって異なる処理が多いので、決済手段に特化した処理の方を利用することが多いと思います。
ただ、すべての定期購入に関して何か特別な処理をしたい時は、2つ目のフックを利用するのが良いです。

###定期購入の決済手段に特化した際に利用するフック
Action: `woocommerce_scheduled_subscription_payment_{$gateway_id}`
パラメーターは2つあります。
$renewal_total : 「数値`(float)`」で定期購入金額なります。
$renewal_order : `WC_Order`のオブジェクトになります。

###定期購入の際に利用できるフック
Action: `woocommerce_scheduled_subscription_payment`
パラメーターは一つです。
$subscription->get_id() : 定期購入として保存された注文の Order ID です。
Accessにおいてインデックスが効かない原因

# 概要
Accessでハマったことメモ。
Access(というかデータベース全般)を触ったことあるよって人はちょっと見てみて。
# 環境

* Windows7 
* Office 2016

* テーブルとしては__単価(3種類)__、__ユーザ名__、__取引データ__があるとします。
![Untitled-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272867/357b1520-999a-a931-ed1c-e6c33e158c47.png)
# やりたいこと

今回の目標は、__一年間分の取引データを元に、月別の金額合計__を算出することです。
これを実現するために、以下のようなSQLを用います。

```sql:sql1

SELECT
    Format(日時, "yyyy年mm月") as 月,
    Sum(金額1) as 金額1合計,
    Sum(金額2) as 金額2合計,
    Sum(金額3) as 金額3合計,
FROM
    (
        SELECT
            取引データテーブル.日時 AS 日時,
　　　　　　　金額1テーブル.金額 as 金額1,
　　　　　　　金額2テーブル.金額 as 金額2,
　　　　　　　金額3テーブル.金額 as 金額3
        FROM
            (
                (
                    (
                        ユーザテーブル
                        RIGHT JOIN
                            取引データテーブル
                        ON  ユーザテーブル.ユーザコード = 取引データテーブル.ユーザコード
                    )
                    LEFT JOIN
                        金額1テーブル
                    ON  ユーザテーブル.金額1コード =  金額1テーブル.金額1コード
                )
                LEFT JOIN
                    金額2テーブル
                ON  ユーザテーブル.金額2コード =  金額2テーブル.金額2コード
            )
            LEFT JOIN
                金額3テーブル
            ON  ユーザテーブル.金額3コード =  金額3テーブル.金額3コード
        WHERE
            日時 >= #年開始日# AND 日時 < #年終了日#
    )
GROUP BY
    Format(日時, "yyyy年mm月")
ORDER BY
    Format(日時, "yyyy年mm月")

```

はい。Accessの場合は3つ以上のテーブルを一度に結合できませんが、入れ子構造にすればむりやり結合できます。
これで取引データを月ごとにグループ化し、各金額の合計を取得できます。

# 問題はここから
それではこの合計を特定のユーザのみに絞って出力したいとします。これも簡単で上記のSQLに一部追加するだけです。

```sql:sql2(抜粋)
        WHERE
            日時 >= #年開始日# AND 日時 < #年終了日#
         AND  取引データテーブル.ユーザコード = "対象のユーザコード"
```

確かに結果には問題ありません。が、__処理時間がかなり延びてしまいました。__

|SQL文|実行時間|
|---|---|
|sql1|約2.0s|
|sql2|約13.0s|
本来ならWhere句で対象を絞っているので早くなるはずなのですが・・・。

原因を追究する必要がありそうです。

# 何が原因なのさ
遅くなる原因はおそらくインデックスが効いていない為と考えられますが、実際どうなのでしょうか。確認してみましょう。
多くのDBMSでは実行計画が確認できますが、Accessも簡易ですが用意されています。

レジストリエディタを開き、`HKLM\SOFTWARE\Wow6432Node\Microsoft\Office\16.0\Access Connectivity Engine\engines\Debug`[^1]の`JETSHOWPLAN`という名前のデータへ`ON`とセットしてください。
再起動後にAccessで任意のSQL文を実行すると、showplan.outというファイルが作成されるようになります[^2]。

ではこのshowplan.outの中身を覗いてみましょう。するとテーブル情報、インデックス、結合順序なんかが確認できますね。その内`X-Prod join`という記述が見られます。おそらくこれはクロス結合でしょうか。インデックスが効いていないことが確認できました。

しかし疑問は残ります。インデックスが効いていないのであれば、(最初に実行した)月別の合計金額を求める際にも時間がかかるはずです。しかし、こちらの実行計画を確認するとインデックスが正しく使われていることが確認できます。


## インデックスの操り方は
AccessではHINT句のようなものは存在しなので、実行計画をチューニングすることもできません。~~詰みました。~~

解決策としては、__不要なインデックスを削除することでした__。
実は用意したテーブルには結合の際には用いられていないインデックスが多数存在していました[^3]。
Accessがどうやって実行計画を決めているのかはわかりませんが、余計なインデックスが存在することでクロス結合の方がましと判断してしまったのでしょう。

|SQL文|実行時間|
|---|---|
|sql1|約2.0s|
|sql2|約0.6s|

やったぜ。
# おわりに
今回はインデックスを調整することで解決できましたが、Accessでは解決できない場合もありそうですね。~~Access以外も触りたい。~~



[^1]: ただしこのパスはOfficeのバージョンやビット数で異なりますので注意してください。
[^2]: このファイルはカレントディレクトリに生成されるようになります。そのため通常はマイドキュメントへ生成されますが、カレントディレクトリを移動させるとそのパスへ生成されるようになります。
[^3]: インデックスが多すぎてもたいした問題はないと考えていました。
【Unity】入室可能なルームが存在するかチェックする方法【モノビットエンジン入門】

#はじめに
どうもnisokaです。
前回に引き続き、オンライン開発の初心者がオンラインゲームを作る過程をお届けします。
対象読者さんはオンライン開発を始めたばかりの方ですので、かなり初心者向けです。

[以前の記事【モノビットエンジンでかんたんサーバ接続】](https://qiita.com/nisoka/items/a7dfe4fad2e0b201ecaa)にて、ルーム作成&入室のかんたんな流れとその方法について書きました。
今回はその内容を少しだけ発展させ、**入室可能かどうかチェックする処理**を作ります。

環境は以下の通りです
win10 64bit, Unity2018.3.3f1, Monobit Unity Networking2.0 v2.6

#やること
1. 入室可能なルームが存在するかチェックする
2. 存在していたらランダム入室する
3. 存在していなかったら新しく部屋を作る

#実装方法
ルーム入室前のロビー入室が完了したタイミングでチェックを行いたいので、
下記のコールバックに処理を書きます。

```C#:ロビーに入室したときに呼ばれるコールバック
public void OnJoinedLobby()
{
	// この中に処理を書く
}
```

###チェックする処理
まず、IsEnableEnterRoom()で入室可能な部屋があるか調べます。
存在していたらMonobitNetwork.JoinRandomRoom()でランダム入室、存在していなかったらCreateRoom()でルームを作成しています。
System.Guid.NewGuid().ToString("N").Substring(0, 10).ToUpper()は10文字以内のランダムな文字列を作成しています。
MAX_ROOM_PLAYERS_COUNTはルームの最大入室人数です。

```C#:チェックする処理
if (IsEnableEnterRoom())
{
    // 存在したのでランダム入室する
    MonobitNetwork.JoinRandomRoom();
}
else
{
    // 存在しなかったので部屋を新しく作る
    string randomRoomName = System.Guid.NewGuid().ToString("N").Substring(0, 10).ToUpper();
    CreateRoom(randomRoomName, MAX_ROOM_PLAYERS_COUNT);
}
```

###入室可能な部屋があるか調べる
MonobitNetwork.GetRoomData()で存在するすべてのルームを取得し、クローズされていたらスルーします。
roomData.playerCount < roomData.maxPlayersは人数を比較し、入れる余地があったらTrueを返します。

```C#:入室可能な部屋があるか調べる関数
private bool EnableEnterRoom()
{
    foreach (RoomData roomData in MonobitNetwork.GetRoomData())
    {
        // クローズされている部屋だったら
        if(roomData.open == false)
        {
            // 次を見る
            continue;
        }

        if (roomData.playerCount < roomData.maxPlayers)
        {
            return true;
        }
    }

    return false;
}
```
###ルームを作成する
MonobitNetwork.CreateRoom()でルーム作成要求をしています。
第２引数のRoomSettingsはルームカスタムパラメータと言って、公開/非公開や、オープン/クローズ、最大人数などを設定できます。

```C#:ルームを作成する関数
private bool CreateRoom(string roomName, int maxPlayer)
{
    if (string.IsNullOrEmpty(roomName))
        return false;

    if (maxPlayer <= 0)
        return false;

    // ルームカスタムパラメータ設定
    RoomSettings roomSetings = new RoomSettings()
    {
        isVisible = true,
        isOpen = true,
        maxPlayers = (uint)maxPlayer,
        roomParameters = null,
        lobbyParameters = new string[] { }
    };

    return MonobitNetwork.CreateRoom(roomName, roomSetings, null);
}
```

#最後に
MUNを使ったルームマッチング機能の全容を書いた記事がまだないので、今後近いうちにお届けしたいと思います。
下記リンクにMUNのもっと詳しい使い方などが載っていますので、気になった方は是非そちらもご覧ください。

#参考リンク
- [Monobit Unity Networking2.0 - MUN公式リンク](http://www.monobitengine.com/doc/mun/)
- [ルーム作成について - MUN公式リンク](http://www.monobitengine.com/doc/mun/contents/FeatureClient/CreateRoom.htm)
Azure DevOpsで環境変数ファイルを扱う

初投稿です。よろしくお願いします。

# 接続文字列とかをGitに上げたくない!

ハードコーディングするのは嫌だからファイルに書きたい！だけどGitで管理するわけにもいかないもの、割とありますよね。

- トークン
- シークレット
- 接続文字列
- 証明書

などなど…

だけどCI/CD組みたい！できればタダで！

## Azure Pipelinesという選択肢

そもそもAzure Pipelinesとは何ぞやって人は -> [ここ](https://dev.azure.com) 見てください。

結構タダで使えます。

## 環境変数ファイルをCI/CDで利用する

環境変数ファイルという表現が正しいのかわからないですがここでは

- Node.jsの.env
- .NET Core WebApiのappsettings.json

とかのことを言います。
間違ってたら教えてください。

でどうやるのかというとAzure DevOpsに用意されているものを使います。

### 安全なとこに置く

![for qiita-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172491/3cf9f4c1-b7f2-a118-c901-ad9a2b94ca23.png)

Azure DevOps内のPipelinesメニュー内にあるLibraryに用意されてます。

名前的にめっちゃ安全そう

![2019-07-08-azure-devops-secure-files-002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172491/d848b8de-1296-6c96-8428-e36690b2f0ea.png)

「+ Secure file」を押すとそれっぽいウィンドウが出るので上げたいやつを選択するとアップロードされます。

![2019-07-08-azure-devops-secure-files-003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172491/82d27863-35a4-41dd-18e0-1d531257d63f.png)

こんな感じ。

### CIで使う

CI時にファイルを使うのも簡単でazure-pipelines.ymlに4行書くだけ。

```azure-pipelines.yml
- task: DownloadSecureFile@1
  inputs:
    secureFile: '(ファイル名)'
  displayName: "Download secure file"
```

これ書くだけでSecure fileからDLして来てくれます。
ビルド前に4行足すだけっすね。楽。


有効活用して皆さんも安全に快適なCI/CDライフを～～～


おわり。
Pixi.jsでつくるスワイプスタイルのクイズアプリ[その１]



Webブラウザ上でインタラクティブなコンテンツを出す仕組みとして近年HTML５がよくつかわれています。
WebGLで描画できるフレームワークを探していたところ、Pixi.Jsというものをみつけました。

今回、技術検証も含めてPixi.Jsで簡易的な○×をゲームを作ってみます。

まずは導入

```sh
npm install pixi.js
```

もちろんコンテンツネットワークからももってくることができます。

```html
<script src = " https://cdnjs.cloudflare.com/ajax/libs/pixi.js/4.5.1/pixi.min.js"> </script >
```

とくに、CDNなら問題ないのですが、
Bundleをダウンロードしてインポートしたとき、どのjsを呼びだせばいいんじゃ？
と悩む人も多いと思います。

\node_modules\pixi.js\dist\
というディレクトリの中に
pixi.jsとpixi.min.jsがありました。
最小限のコンテンツがpixi.min.jsでフルに使いたいならpixi.jsで良いかと
どちらにどの機能があるのか一覧を載せているDocumentが見当たりませんでした。

とりあえず、落ちていたコードを拾い集めてタイトル画面とボタンだけ作ってみました。
あとで整形出術が必要です。

ゲームシーンの作り方については、こちらを参考
[シーンの作成](https://qiita.com/ta2roo/items/95c0965653544fd67079 "GameSceneの作成")
#scenesmanager-class

```html

<body>
  <div id="pixiview"></div>
<script src="../pixi/pixi.min.js"></script>
<script>
 const app = new PIXI.Application({
    width: 800, height: 600, backgroundColor: 0x1099bb, resolution: window.devicePixelRatio || 1,});
  document.body.appendChild(app.view);
  const container = new PIXI.Container();
  app.stage.addChild(container);
  // Create a new texture
  const texture = PIXI.Texture.from('img/logo2.png');
    const logo2 = new PIXI.Sprite(texture);
    container.addChild(logo2);
  // Move container to the center
  container.x = app.screen.width / 4;
  container.y = app.screen.height / 12;

  //以下ボタン サンプルからそのまま　なんでテクスチャアトラスで読み込まんの？
  //ついでに長いのであとでボタンクラスとか作る。
  var textureButton = PIXI.Texture.fromImage('img/start_button1.png');
  var textureButtonDown = PIXI.Texture.fromImage('img/start_button2.png');
  var textureButtonOver = PIXI.Texture.fromImage('img/start_button3.png');

      var button = new PIXI.Sprite(textureButton);
      button.buttonMode = true;

      button.x = app.screen.width / 3;
      button.y = app.screen.height / 1.4;

      // make the button interactive...
      button.interactive = true;
      button.buttonMode = true;

      button
   
        .on('pointerdown', onButtonDown)
        .on('pointerup', onButtonUp)
        .on('pointerupoutside', onButtonUp)
        .on('pointerover', onButtonOver)
        .on('pointerout', onButtonOut);


      app.stage.addChild(button);


      function onButtonDown() {
        this.isdown = true;
        this.texture = textureButtonDown;
        this.alpha = 1;
      }

      function onButtonUp() {
        this.isdown = false;
        if (this.isOver) {
          this.texture = textureButtonOver;
        }
        else {
          this.texture = textureButton;
        }
      }

      function onButtonOver() {
        this.isOver = true;
        if (this.isdown) {
          return;
        }
        this.texture = textureButtonOver;
      }

      function onButtonOut() {
        this.isOver = false;
        if (this.isdown) {
          return;
        }
        this.texture = textureButton;
      }

</script>

</body>
```


*はまりどころ
ローカルに置いてある画像はなぜかChromeでは表示されません。
Firefoxで表示することもできますが、不安定なようです。
Chrome　ServerというChromeアプリを使うことで、
⇒Pixiの仕様上ローカルの画像はセキュリティ的ななにかにより、表示できません。




[その２につづく](https://qiita.com/ta2roo/items/9e12edd660d2d119ab41 "その２")
ES6{}でブロックスコープを作ったら中身が グローバル変数になった話

#はじめに
弊社はES６で記載したコードをbabelでES５にトランスパイルしてます。
いつか問題が起きそうだなって思ってたら本当に起きたので備忘録として残しておきます。

#前提
今回問題が起きたページでは複数のjsファイルが読み込まれていて、トータルするとかなりのjsコードが書かれています。

#やりたかったこと
モーダルを表示後、「ばつボタン」もしくは「モーダル外」をクリックするとモーダルが閉じる。

#問題が起きたコード

````common.js
{
	const
		 target = document.getElementById('commonPopup')
		,targetCloseTrigger = document.getElementsByClassName('_close')[0]
	;	
	
	const popupAni = {
		popupDisplay : ()=> {
			target.classList.remove('_no_show');
			target.classList.add('_is_show');
		},

		popupClose : ()=> {
			target.style.transition = ".7s";
			target.classList.remove('_is_show');
			target.classList.add('_no_show');
		}
	}

	window.addEventListener('load', ()=> {
		setTimeout(popupAni.popupDisplay(),5000);
	});
	targetCloseTrigger.addEventListener('click',()=> {
		popupAni.popupClose();
	});
}
````

上記はモーダルの表示と閉じる時に使われる関数です。
エラー内容をコピるの忘れてました。すみません。
ざっくりと**targetの中のtransitionはundefinedだよ**って感じです。


#起きた問題
結論、モーダルの`target`変数が、後読みされる別の`target`変数に上書きされていました。

**ES６をトランスパイルした際、`{}`はグローバルスコープとして認識されない**

ES5には`const`や`let`という概念は存在せず、トランスパイルで`var`に変換され、
`{}`で括られた変数たちはグローバル変数になりました。


#解決策
**`{}`ではなく即時関数で括る**

````common.js
(function(){
	const
		 target = document.getElementById('commonPopup')
		,targetCloseTrigger = document.getElementsByClassName('_close')[0]
	;	
	
	const popupAni = {
		popupDisplay : ()=> {
			target.classList.remove('_no_show');
			target.classList.add('_is_show');
		},

		popupClose : ()=> {
			target.style.transition = ".7s";
			target.classList.remove('_is_show');
			target.classList.add('_no_show');
		}
	}

	window.addEventListener('load', ()=> {
		setTimeout(popupAni.popupDisplay(),5000);
	});
	targetCloseTrigger.addEventListener('click',()=> {
		popupAni.popupClose();
	});
})();
````

いったんはこれで解決しました。
そもそも変数名が単調すぎるって問題もありますが。。。

#参考サイト
https://teratail.com/questions/68576
ブラウザの開発者コンソールで「プログラミングの関数」を気軽に学んでみよう

GitHubにワークシートをアップしました。

https://github.com/LazyLabo/cs-excercise/blob/master/function.md

このワークシートの検証として、我が家の中3の娘に実際にやってもらいました（micro:bit等のブロックプログラミング経験者ですが、JavaScriptを含むテキスト入力でのプログラミングは未経験者です）

https://youtu.be/ujweIiFze_s

ちょっと明日から旅行で詳しくは掛けないのですが、このワークシートに盛り込む内容の選別はかなり苦労したんですが、以下のようなまとめ方をしてみました。

## 基本として絶対に必要な、関数に関する内容

- 関数という言葉と、それが数式や数値のみを扱うものではないという認識。なぜなら、関数という「数学用語」からくる誤解（例：数学で習った関数みたいに数字ばかりを扱うものに違いない）を解消するため
- 引数という言葉と、それが関数でどのような役割をするか
- オブジェクトという概念と、それがいくつかの関数をまとめる機能を果たしていること、およびそれらの関数が密接な関係にあること（high cohesive)
- 関数には名前が付いている、そして名前はその関数が行う仕事を表す（例：add）、だが同時に arbitrary でプログラマーが適当に選んだ名前を付けることが出来る
- 引数をとらない関数もある（数学的な関数の定義に外れるものもある）
- 関数は戻り値があるが、無い場合もある
- 関数の呼び出し方

## 重要だが厳選した結果、省略した内容

- 引数には型がある（型やデータを扱う内容のワークシートに defer する
- 引数は構造体をとることも出来る（型の内容の一部）
- 引数のデフォルト値（特定の言語への依存が大きいと感じる）
- 副作用という概念
- ref や out の種類の引数（副作用の一部）
- 実装が１つの式でない場合に｛｝で括るやりかた（1行ずつ入力するスタイルに向かないし、制御文等の内容に defer する
- グローバル関数と静的関数（スコープの扱いに関するワークシートに defer する
- オブジェクト指向言語での関数の機能、例えばvirtualや、public/protected/privateの扱い（広すぎる。そもそもJavaScriptでデモすべき内容でない
 
## 従来の関数の初歩的教材にあまりみられないが盛り込むべきだと判断し、実際に盛り込んだ内容

- 関数の名前が、関数そのものと本質的には分離しているという認識（ラムダ式を代入することで、従来の ```function``` 予約語を使った定義より、その分離がより直感的に理解できる
- アロー関数を用いた関数の定義
- カレー化（関数型プログラミングがもたらす恩恵を享受する選択をより容易に出来るように準備する）文法的には、なんの先入観もない未経験者だからこそすんなりと受け入れられる書き方（動画で私の娘が難なく理解出来ている様子が観察されました）
- 関数を入れ子にした状態と、クロージャの効果。実際は未経験者がワークシートに従って ```a => b => c => a+b+c``` を入力して、そこに３つの関数が存在することを認識することはない。よってクロージャの認識も生まれない。ここは時間的にも学習の発展の見地からも「触れない」ことにした
- カレー化された関数に部分適応をする。これも直感的に関数の引数は途中まで渡した（固定した）状態でも存在できるし、引数の値を変えていくらでも specialized された（そして別の名前を付けられた）関数を派生できるという直感が生まれる

# まとめ

このような内容の教材はどうでしょう？ 特に、無名関数の概念、もっと広い味方としては「関数の名前」と「関数そのもの」が分離しているという事実をより自然に受け止められるプログラマーは、非同期処理やTaskで表されるパラレル処理などに苦手意識を持ちにくくなるのではないか、と思うのです。
非同期処理の光と闇

# はじめに
今回の記事はNode.jsを使っている際に、非同期処理という便利な機能な弊害となったため、ここに解決策を書き記す。同じく悩む人に伝わってくれ。

# 非同期処理とは
まずはコードを見てもらおう。ローカルディレクトリのファイル情報を取得するための処理と同時に別の処理を行うと仮定したコードである。

```js:sample.js
const fs = require('fs')

function hogehoge(){
    //ファイルを読み取る処理
    fs.readFile("<ファイルのパス>",
    function(error,data){//＝処理Aと置く
        if(error)return -1;
        //終わったときに表示する
        console.log("ファイルの読み込みを完了しました！");
        console.log("データの中身は:" + data);
    }
}

function fugafuga(){//=処理Bとする
    console.log("fuga~");
}

function hogehoge();//ファイルの中身を出す。
function fugafuga();//fuga~と表示
```

この場合に表示されることが以下のときがある。

```
fuga~
ファイルの読み込みを完了しました！
データの中身は:うんたらかんたら
```

なんと、__処理の順番が変わっている__。
処理A⇒処理Bとなるはずが、処理B⇒処理Aとなっているじゃないか。
これはファイル読み込みに時間がかかることを見越して、「ファイルを読み込む処理をすると同時にほかの処理も行う」という非同期処理がされているからだ。
「__うわぁ！なんて便利な機能なんだろう！！！__」
そう思うことだろう。
しかし、この機能には実は危険性があるのだ...

# 非同期処理の危険性
```js:sample2.js
const fs = require('fs')

let filestr = "";

function hogehoge(){
    //ファイルを読み取る処理
    fs.readFile("<ファイルのパス>",
    function(error,data){
        if(error)return -1;
        filestr = "" + data;//fileの中身をfilestrに移す
        console.log("ファイルの読み込みを完了しました！");
    }
}

function fugafuga(){
    console.log("データの中身は：" + filestr);//filestrの中身を表示
}

function hogehoge();//ファイルを読み込んで
function fugafuga();//中身を表示
```

こうなった場合どうだろう？勘の鋭い方ならもうお気づきかもしれないが以下の通りになる可能性がある。

```
データ中身は:
ファイルの読み込みを完了しました！
```

「ちょい！ちょい！ちょい！ちょーい！！！」と思うだろう。そう、非同期処理の欠点として、同期処理でなければならない処理も非同期処理になってしまうということである。世に出されている便利な機能が非同期処理になっているというケースが少なくない。ではどう対応すればいいのだろうか。

# くらえ！同期処理化アタック！！！
ならば、簡単だ。__同期処理に戻してやればいい。__
そこでPromiseという機能をつかおう。説明は省くがわかりやすいリンクを乗せておくので、ぜひ参考にしてくれ。
[Promiseについて0から勉強してみた](https://qiita.com/toshihirock/items/e49b66f8685a8510bd76)

出来上がったコードが以下の通りだ。

```js:sample3.js
const fs = require('fs')

let filestr = "";

function hogehoge(){
    return new Promise(function(resolve,error){
        //ファイルを読み取る処理
        fs.readFile("<ファイルのパス>",
        function(error,data){
            if(error)return -1;

            filestr = "" + data;//fileの中身をfilestrに移す
            console.log("ファイルの読み込みを完了しました！");
            resolve(data)//処理が終わったらresolveでdataを返す。
        });
    }
}

function fugafuga(let str){
    console.log("データの中身は：" + filestr);//filestrの中身を表示
}

function hogehoge()//ファイルを読み込んで
.then(function(value){//ファイルが読み込み終わったら
    fugafuga(value);//中身を表示
}
```

こうすることで、非同期処理を同期処理にしてやることができる。やはり、同期処理が必要とされる場面が多くみられると思うので、Promiseは覚えておいて損はないだろう。

# 最後に
自分も理解したばかりでまだわからないことも多いので、ぜひ指摘をお願いしたいです。
間違えに気づいた方、改良点に気づいた方はぜひアドバイスをお願いします。
自動で競馬投票～入金編～

## 背景

お馬さんに夢を託すプログラムをつくりたい。それも自動で。

## やりかた

自動的に投票してほしいが、そんなAPIはない。
なので、GASにやらせることにした。

今回は楽天競馬を採用。
楽天銀行の口座からスムーズに入金が可能です。

## 完成品
[ソースコード](https://github.com/satougashi/DepositRakutenHorserace/blob/master/code.gs)

GASで動作するJavaScriptです。

## 使い方
1. google driveなどから、Google Apps Scriptを新規作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193460/a3ff8ffe-7403-e343-2a41-fc39c2dbf02b.png)

1. [ソースコード](https://raw.githubusercontent.com/satougashi/DepositRakutenHorserace/master/code.gs)を貼り付けて保存（ファイル名は任意）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193460/06d3245f-877c-318e-fba4-e83c386dbc99.png)

1. 環境変数に各情報をセットする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193460/519f3969-9bcb-147c-b0c5-a7b534b5cc9d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193460/d4ff2550-9971-0cf6-ede0-2bb9d8c587f1.png)

1. 定期実行設定をする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193460/5727013f-7b7e-f975-fa71-2ce8145002ca.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193460/6216b0e2-81e7-a2fe-c81b-b54d4aee92c1.png)


## まとめ

今回は、入金までやりました。
次回は~~ランダムで~~馬券を買う処理を実装してみたいと思います。
OpenCV動画入力と確認でよく使うやつ

# OpenCV動画入力
基本的には[こちら](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_gui/py_video_display/py_video_display.html)から

## 動画の取得
```
# Webカメラから
cap = cv2.VideoCapture(0)
# 動画ファイルから
cap = cv2.VideoCapture('movie.mov')

# ステータス確認(True/False)
cap.read()
```

## ついでに動画プロパティも取得
```
# 幅
cap.get(cv2.CAP_PROP_FRAME_WIDTH)
# 高さ
cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
# 総フレーム数
cap.get(cv2.CAP_PROP_FRAME_COUNT)
# fps
cap.get(cv2.CAP_PROP_FPS)
```
nginx + Laravel でホーム以外のページの404エラー解決

<h1>はじめに</h1>前回はnginx + MySQL + Laravelの環境構築をしてトップページの表示まで行いました。さて、もりもり開発始めるぞー！と思った
が矢先、、
ログイン認証してみようと思ったら404エラー。なんでや、、と頭を抱えました。ルーティングに何もおかしいところはないし、どうしたものか、と思ったのですが原因はlaravel側ではなくnginxの設定だったようです。記事書いた時にnginxわかんないなぁ〜って放置したのはダメだったようです。わからないとこはちゃんと潰しておこう。。。。

<h1>修正前の元のファイル</h1>
さて、元のnginxのファイルであるdefault.confを見てみます。

```default.conf
server {
  listen 80;
    index index.php index.html;
    root /var/www/beer/public/;

  location / {
    root /var/www//beer/public;
    index  index.html index.php;
    }

  location ~ \.php$ {

    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
  }
 }
```
結論から言ってしまうとこれダメダメすぎますね。数日前の自分が恥ずかしい。
<h1>記述の意味の理解と修正</h1>

まず、このファイルをディレクティブごとに読み解いていきます。


```
listen 80;
    index index.php index.html;
    root /var/www/beer/public/;
```

ここではサーバーのIPアドレスとポート番号を宣言し、そのあとに公開するディレクトリを宣言しています。
IPアドレスとポート番号は、`listen IPアドレス:ポート番号`のように書きます。
しかし今回はIPアドレスが記載されていませんよね。この書き方は、`listen *:ポート番号`と同じ意味を表しており、IPアドレスにはデフォルト値が用いられることになります。

`root /var/www/beer/public/;`は公開するディレクトリの宣言、
`index index.php index.html;`はリクエストuriが/で終わっている時にインデックスとして返されるファイルを表しています。index.phpが存在すればindex.phpを返し、存在しなければindex.htmlを返します。どちらも存在しない場合のリダイレクト先を設定したい場合は、`index index.php index.html /ファイルがどちらもない場合のリダイレクト先;`のようにします。

locationディレクティブ

```
location / {
    root /var/www/beer/public;
    index  index.html index.php;
    }
```
さて、問題はここにありました。まずはこのlocationディレクティブについてです。
locationディレクティブではuriのパスごとの設定を記述することができます。つまりこれは、「ホスト名/ にアクセスしたら、/var/www/beer/public と言うファイルパスを返す」と言う意味になります。
rootは先ほど宣言しているものと同じ公開ディレクトリのため、宣言する必要がないので消します。また、ここでindexを指定してしまうとこの二つのファイルしか開かないという設定になってしまうので修正します。そこで、

```
location / {
    try_files $uri $uri/ /index.php?$query_string;
    }
```
とします。これは、「ホスト名/ にアクセスしたら、まずリクエストURIで処理、次にindex.phpで処理を試みる」という意味です。こうすることで全てのURIに対応できます。

locationディレクティブその２

```
location ~ \.php$ {

    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
  }
```
`try_files $uri =404;`なんて記述のせいでindexの指定ファイルがなかったら404返されてたんですね。アホらしいです。大反省です。消します。

残りの行ですが、これはphpの処理を行うのに必要な記述だそうです。ここの解説はまた今度(まだよくわからない)

最終的にdefault.confはこんな感じになります。

```default.conf
server {
  listen 80;
    root /var/www//beer/public;
    index  index.html index.php;

     location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

  location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
  }
 }
```

<h1>最後に</h1>
nginxは奥が深い。
ディレクティブの修飾子とか優先順位とかについても今度書きたいな。
<h1>参考文献</h1>

nginx実践入門
https://www.amazon.co.jp/nginx%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-WEB-DB-PRESS-plus/dp/4774178667
CygwinでDドライブに移動する

実行環境はwindows10で機種はLet's noteです。
#Cygwin64 terminalでDドライブに移動する
下記のように打つ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440828/0a88c198-2c9f-a6aa-3535-6bd7d89ca9c0.png)
移動できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440828/d6f6c9dc-22ed-093c-81e0-99b48400c7c1.png)


###[メモ]コマンドプロンプトの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440828/2e1d4db8-e23c-a8f3-22aa-ee90837a0ec6.png)
【RDS for Oracle】Performance Insights（パフォーマンスインサイト）メモ

# メモ
- チューニングの手前までができる。チューニング自体はしないRDSで提供しているすべてのエンジン（Oracleなど）でつかえる。

- `データベースロード`：アクティブなセッション数（CPU使用率、アイドルの2つのステータス）。1秒おきにアクティブなセッションの詳細な情報をサンプリング
- `カウンターメトリクス`：OSよりのメトリクス（CPU使用率）
- `Top N ディメンション`：その時間帯のパフォーマンスに影響していたTop NのSQL。データ保持基幹デフォルト7日（2年間の長期保持も）

- パフォーマンス問題の有無は`データベースロード`がインスタンスの最大vCPUを超えているかどうかが基準

- 分析

 - どんな待機イベントが多かったのか。

    - 高負荷SQL
    - 接続元ホスト（システム全体の中で問題の比率の多いアプリケーションは？）
    - 接続ユーザ

- クエリのパフォーマンス管理
    SQLヒント
    SQL Plan Stability
    SQL Plan管理
        →OracleだとSPM（SQL Plan Manager）

- 重要なとこ
>負荷グラフでの重要な視覚的手がかりは「最大CPU」ラインです。このラインはホスト上のvCPUの数を表します。vCPUよりも多くのアクティブセッションがCPU待機している場合、CPUの許容量を超えてインスタンスが実行されていることを意味します。負荷全体が「最大CPU」のラインを超えると、ボトルネックが発生する可能性があります。ボトルネックはCPUの飽和が原因かもしれませんし、データベース内でセッションが待機するその他の多くの理由によって引き起こされているかもしれません。

<img width="1647" alt="performance.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/911f56b3-5003-c754-d300-786873d956d1.png">



# 参考
[Amazon RDSパフォーマンスインサイトの使用](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_PerfInsights.html)
[Performance Insights を使用した Amazon RDS データベースの負荷分析](https://aws.amazon.com/jp/blogs/news/analyzing-amazon-rds-database-workload-with-performance-insights/)
Bootstrap4でreadonlyフォームの背景色を変更したかった話

# 背景
テキストボックスを編集しようとしてフォームをクリックしたら
モーダルが出てきてそこから選ぶ方式とし、手動編集を許可しないようにしたかった。
しかし、Bootstrap4でフォームにreadonly属性を付けると自動的に背景色が灰色になってしまう。
灰色になっていると見た目的に編集不可に見えてしまうため、UX的によくない。
なんとかして灰色の背景をやめて普通のテキストボックスと同じ見た目にしたい。

# ぐぐった
「bootstrap text readonly 灰色」
css書いて上書きしろって…？うそでしょ…？

# 結論
inputフォームにbg-whiteクラス付けたらできた。
AzurePipelineでは環境変数を小文字で定義できない

# 概要
Azure Pipelineを使っている時になぜか環境変数が取れなかったことがあって悩んだのでメモ

タイトルの通りだが、正確には定義できないわけではなく、勝手に内部で**大文字に変換される**

例えば、

```yaml
trigger:
- none

variables:
  ci: "true"

pool:
  vmImage: 'Ubuntu-16.04'

steps:
- task: Maven@3
  inputs:
    ~~省略~~
```

こんなyamlを定義して、コード側で

```java
private static boolean ci = "true".equals(System.getenv("ci"));
```

とかやっても取れない

こうやるのが正しい

```yaml
trigger:
- none

variables:
  # must UPPER-CASE!!
  CI: "true" 

pool:
  vmImage: 'Ubuntu-16.04'

steps:
- task: Maven@3
  inputs:
    ~~省略~~
```

```java
// must UPPER-CASE!!
private static boolean ci = "true".equals(System.getenv("CI"));
```


# 対策
設定も何も無いので環境変数は大文字で書かないといけない

# おわりに
いや、ドキュメントに書けや!!

というか勝手に変換するならもう小文字環境変数には警告ログでいいだろ!!

......というのもそうだが、何よりコンソールの出力が全体的にunix風なので、Windows likeな大文字小文字を区別しない仕様が唐突に出てくると人は完全に騙される

こういう「人を騙す仕様」は反面教師としたい
コマンド daemontools => systemd

daemontools を systemd に移行した際に叩くコマンドが変わるので、どう変わるか書きます。
CentOS6系からCentOS7系に移行する際などの誰かの助けになれば嬉しいです。

## ログをみる
daemontools

```
tail -f /service/hoge/log/main/current | tai64nlocal
```

systemd

```
sudo journalctl -u hoge -f
```

## シグナルを送る
daemontools

```
sudo svc -h /service/hoge
sudo svc -t /service/hoge
```

systemd

以下の SIGHUP などは HUP や数字でもOK

```
sudo systemctl kill -s SIGHUP hoge
sudo systemctl kill -s SIGTERM hoge
```

## サービスの起動・再起動
daemontools

```
sudo svc -u /service/hoge
sudo svc -d /service/hoge
```

systemd

```
sudo systemctl start hoge
sudo systemctl stop hoge
```

## サービスの設定を変える

systemd

```
sudo vi /etc/systemd/system/hoge.service
(編集）
sudo systemctl daemon-reload
```
【備忘録】OpenCV 2 をHomebrewでインストールする

#OpenCVの2がほしい
まず、パッケージを探す。

```
$ brew search opencv
==> Formulae
opencv                           opencv@2                           opencv@3
```
見つけたので、opencv@2の詳細を確認しておく。

```
$ brew info opencv@2
opencv@2: stable 2.4.13.7 (bottled) [keg-only]
Open source computer vision library
https://opencv.org/
Not installed
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/opencv@2.rb
==> Dependencies
Build: cmake ✘, pkg-config ✔
Required: eigen ✘, ffmpeg ✘, jpeg ✘, libpng ✘, libtiff ✘, numpy ✘, openexr ✘, python@2 ✘
==> Caveats
opencv@2 is keg-only, which means it was not symlinked into /usr/local,
because this is an alternate version of another formula.

==> Analytics
install: 1,473 (30 days), 5,485 (90 days), 19,637 (365 days)
install_on_request: 1,078 (30 days), 3,943 (90 days), 15,409 (365 days)
build_error: 0 (30 days)
```
（ペチン！）よし、じゃあぶちこんでやるぜ！

```
$ brew install opencv@2
```

できた。

##追補

opencv_traincascade使いたいのですが、どうすればよいのでしょうか。。。
[Laravel][Homestead] Seederを使ってテストデータを作成してみる

## Seederとは

テストデータをデータベースに設定するための機能。シーダーは`database/seeds`に保存する。
デフォルトでDatabaseSeederクラスが定義されている。このクラスからcallメソッドで他のシーダーを呼び出すことで、シーディングの順番をコントロールできる。

## テーブル名について

Seederを使うに当たって、テーブル名を複数形で定義した方が都合が良い。
例えば、テーブル名hoges、レコードhogeのようなイメージ。

## シーダーを生成してみる

シーダーを作成するには以下のコマンドを実行します。作成されたシーダーは`database/seeds`に格納されます。

```
$ php artisan make:seeder HogesTableSeeder
```

シーダーを利用するためにはDatabaseSeederに呼び出したいシーダーを追加します。

```php:database/seeds/DatabaseSeeder.php
<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $this->call(HogesTableSeeder::class);
    }
}
```

## シーダーを編集してみる

```php:database/seeds/HogesTableSeeder.php
<?php

use Illuminate\Database\Seeder;

class HogesTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // ここにレコードを追加処理を記述する
        $now = \Carbon\Carbon::now();
        for ($i = 1; $i <= 50; $i++) {
          $hoge = [
            "name" => "name" . $i,
            "mail" => "user" . $i . "@localhost",
            "created_at" => $now,
            "updated_at" => $now,
          ];
          DB::table("hoges")->insert($hoge);
        }
    }
}
```

## シーダーを実行してみる

```
// DataBaseSeederを実行する
$ php artisan db:seed
// 特定のファイルを個別に実行する
$ php artisan db:seed --class=HogesTableSeeder
```

```sql
testapp_db=# select * from hoges;
 id |  name  |       mail       | comment | type |     created_at      |     updated_at
----+--------+------------------+---------+------+---------------------+---------------------
  1 | name1  | user1@localhost  |         | C    | 2019-07-11 01:41:02 | 2019-07-11 01:41:02
  2 | name2  | user2@localhost  |         | C    | 2019-07-11 01:41:02 | 2019-07-11 01:41:02
  3 | name3  | user3@localhost  |         | C    | 2019-07-11 01:41:02 | 2019-07-11 01:41:02
  4 | name4  | user4@localhost  |         | C    | 2019-07-11 01:41:02 | 2019-07-11 01:41:02
  5 | name5  | user5@localhost  |         | C    | 2019-07-11 01:41:02 | 2019-07-11 01:41:02
  6 | name6  | user6@localhost  |         | C    | 2019-07-11 01:41:02 | 2019-07-11 01:41:02
  7 | name7  | user7@localhost  |         | C    | 2019-07-11 01:41:02 | 2019-07-11 01:41:02
  8 | name8  | user8@localhost  |         | C    | 2019-07-11 01:41:02 | 2019-07-11 01:41:02
  9 | name9  | user9@localhost  |         | C    | 2019-07-11 01:41:02 | 2019-07-11 01:41:02
(以下略)
```

データベースを完全に再作成したい場合は、以下のコマンドが便利。

```
$ php artisan migrate:refresh --seed
```


## 参考

[Laravel Document](https://readouble.com/laravel/5.2/ja/seeding.html)
備忘録）Please import make_blobs directly from scikit-learn

```python:.py
# エラーメッセージ
DeprecationWarning: Function make_blobs is deprecated; Please import make_blobs directly from scikit-learn
```
####実行したコード

```python:.py
from sklearn.model_selection import train_test_split
X, y = mglearn.datasets.make_forge()

X_train, X_test, y_train, y_test = train_test_split(X, y, ramdom_state=0)
```

####エラーメッセージの内容
mglearnのmake_forge()内でmake_blobs()を呼びだしている。
make_blobs()はmglearn、sklearn両方に存在しているが、mglearnで実装されているものは
deprecated(非推奨)のためエラーメッセージがでるが、無視でいい。

[参考](https://teratail.com/questions/158927)
GoofysでAWSのS3をマウントする。

#はじめに
私はS3をマウントすることになりました。ググると主にStorageGateway、goofys、s3fsの３つのうちのどれかを使用するようです。試行錯誤の末、goofysを使用することにしました。
ちなみに私の場合最初、StorageGatewayを使おうとしましたが、ファイルゲートウェイ設定の際VMwareEsxiをインストールする必要があり、なぜか詰まりました。VMwareの環境構築の苦労についてはまた別の機会で、、
環境はLinuxです。

##go,fuseのインストール
goofysの使用にあたってgo,fuseが必要になるため、先にインストールします。

```
sudo apt-get update
sudo apt-get install golang
```
##PATHを通す
```
export GOPATH =$HOME/go
```
この時色々ググって試した結果、いつのまにかGOPATHとGOROOTが同じパスになってエラーになったため注意。

```
echo $GOPATH
echo $GOROOT
echo $PATH
go env GOPATH //これでもできる。
```
上記のようにパスを確認しながら進めるとよかったです。

##goofysのインストール

```
go get github.com/kahing/goofys
go install github.com/kahing/goofys
```
１行目を実行しても反応がなく、２行目を先に試したりすると、”permissiondenied”や”許可がありません”というエラーが出た。rootユーザーで試したり、awsconfigureの設定をし直したり、PATHの確認したり試行錯誤した。さらによく調べると、この部分の処理には時間がかかることがあると分かりました。unrecognized import path 、、、、という文章が出ますが待機しました。そこで、しばらく待ってみると正常に実行されました。２行目の実行に関しては私の場合、２，３秒で終わりました。

###(goofysのインストールver2)

```
wget https://github.com/kahing/goofys/releases/download/v0.0.5/goofys -P /usr/local/bin/
```
上記の方法も試してみたりしました。ですが、これは必要なかったと思います。

##マウントの確認
```
$aws s3 mb s3://shangben-goofys  //S3バケット作成
$mkdir ~/mount-goofys　　//ローカルディレクトリ作成
```
上のようにS3バケットとマウント先のローカルディレクトリを作ります。

ちょっとファイルを作ってみます。

```
$touch ~/mount-goofys/test
```
S3やボリュームを確認してみます。

```
$aws s3 ls s3://マウントしたバケット名
$ps auxf|grep goofys //プロセス確認
$df -h //ボリュームの確認
```

おわり
kshで並行処理

プログレス表示だったものを改造して並行処理にしてみた。

元ネタ(記憶で書いているので雰囲気のみ)

```progress.ksh
#!/usr/bin/ksh
./heavy_process &
PID=$!
while ! ps -ef | grep -w ${PID} ; do
    echo ".\c"
    sleep 5
done
echo
```

改造あとの並行処理版。

```parallel.ksh
#!/usr/bin/ksh93
typeset -A PID
cat some.list | while read S ; do
  ./some_process ${S} &
  PID[${S}]=$!
done
while [[ ${#PID[*]} -ne 0 ]] ; do
  for S in ${!PID[*]} ; do
    if ! ps -e | grep -w ${PID[${S}]} >/dev/null 2>&1 ; then
        unset PID[${S}]
    fi
  done
  sleep 5
  echo ".\c"
done
echo
```
some_processは引数に対してなにかやる感じ。
これであとは見た目を整えればOK。
ksh93を使っているのはハッシュが使えるからってだけで使用してます。
perlとかで作るならforkするのが素直でおすすめ。
Java 制御構文

### 学習ログ

文を実行させる順番のことを制御構造といい、主に「**順次**」「**分岐**」「**繰り返し**」がある。

####制御構文の構成要素
[条件式]分岐条件や繰り返しを続ける条件を示した式
[ブロック]分岐や繰り返しで実行する一連の文の集まり

```java:
・分岐構文
if(条件式) {
  ブロック
} else {
　ブロック
}

・繰り返しの構文
while(条件式){
  ブロック
}  
```

####分岐構文のバリエーション
・３種類のif構文

```java:
▪︎if-else構文(基本形)
//例
if(age >= 20) {
  canDrink = true;  //条件がtrueの場合ここのブロックの処理が動く。
} else {
  canDrink = false; //条件がfalseの場合ここのブロックの処理が動く。
}

▪︎ifのみ構文
//例
if( age >= 20) {
  canDrink = true;
}

▪︎if-else if-else構文
//例
if( height >= 170) {
  size = 'L'; 
} else if(height >= 155){
  size = 'M';
} else if(height >= 140){
  size = 'S';
} else {
  size = '?';
}
```
####switch 構文
switch文に書き換えることができる条件
①全ての条件式が「変数==値」や「変数==変数」のように左辺や右辺が一致するか比較する式しか使用できない(<,>,!=,などは使用できない）
②比較する値が整数(byte型、short型、int型のいずれか)、文字列(String型)または文字(char型)であり、少数や真偽値ではない。

```java:
//例
switch(fortune){
  case 1:
    System.out.println("大吉");
    break;
  case 2:
    System.out.println("中吉");
    break;
  case 3:
    System.out.println("吉");
    break;
  default:  // caseのどれにも当てはまらなかった場合の処理(いらないなら省略可)
    System.out.println("凶");
}
```
・switch文は当てはまるcaseにジャンプするだけなのでbreakを記述しないと特定のcaseまで飛んだ後そこからまた順次プログラムを読み込んでしまう。
※break文とは: 処理を中断し終了させるメソッド。
####繰り返し構文のバリエーション
・2種類のwhile文

```java:
▪︎while構文(基本形)
//例
while(temp > 25) {
  temp--;
  System.out.println("温度を1度下げました");
}

▪︎do-while構文
//例
do{
  temp--;
  System.out.println("温度を1度下げました");
} while(temp > 25);
```
・for文による繰り返し

```java:
for (ウンタ変数の初期化処理; 繰り返し条件; カウンタ変数の増減処理) {
  繰り返す処理
}
//例
for( int i = 0; i < 10; i++) {
  System.out.println(i);
}
//変数iを初期化して0を代入している。iが10より大きくなるまでブロック内の処理を行う。
//処理を行うたびにi++(変数iに1を足す)という処理を行う。
```
####制御構造のネスト
「分岐の中に分岐」や「繰り返しの中に分岐」など、このような多重構造を「**入れ子**」や「**ネスト**」という。

```java:
▪︎分岐処理の中の分岐処理
//例
if(height > 170){
  if(eye > 1.0){
    System.out.println("合格");
  }
}

▪︎繰り返しの中の分岐処理
//例
do{
  if(i % # == 0){
    System.out.println(i);
  }
  i++
} while(i < 100);
```
・break文(繰り返し自体を中断)

```java:
for(int i = 1; i < 10; i++) {
  if(i == 3){
    break;
  }
  System.out.println(i);
}
```
・continue文(今回の文だけを中断し、次の周へ)

```java:
for(int i = 1; i < 10; i++) {
  if(i == 3){
    continue;
  }
  System.out.println(i);
}
```
レコード件数の多い順でソートしてテーブル一覧を取得するSQL

MySQLを使用したアプリケーションで運用していると
「あー、データ量増えてきたなー」
「テーブルのレコード数が多いテーブルってどのテーブルで何件あるんだろう？」
って時があります。

そういう時にinformation_schemaからテーブルのレコード数が多い順にソートして取得するSQLです。

```
select table_name, table_rows from information_schema.TABLES order by table_rows desc;
```

limitで絞ればレコード数上位１０テーブルとかも取得できます。
Rubyの整数から下１桁や２桁取る方法

#コード

```rb

x = 123456789
puts x % 10
puts x % 100
puts x % 1000
puts x % 10000
```
出力結果↓

```
9
89
789
6789
```
あまりで下１桁、や２桁を取ってます。
ただ、ピンポイントでほしい桁だけを取ることが出来ません。

ピンポイントでほしい桁だけを取るときは

```rb

x = 123456789
puts x.to_s.split("")[-1]
puts x.to_s.split("")[-2]
puts x.to_s.split("")[-3]
puts x.to_s.split("")[-4]
```
出力結果↓

```
9
8
7
6
```

#訂正しました
もっと簡単に取れる方法を教えて頂いたので、訂正します。
ttakuru88さんありがとうございました。

```rb
x = 123456789
p x.digits
```
出力結果↓

```
[9, 8, 7, 6, 5, 4, 3, 2, 1]
```
俺でもわかるALTER構文で発生するロックレベルドキュメントリスト


俺です。トレジャーハンター[ロック](https://wikiwiki.jp/ffdic/%E3%82%AD%E3%83%A3%E3%83%A9%E3%82%AF%E3%82%BF%E3%83%BC/%E3%80%90%E3%83%AD%E3%83%83%E3%82%AF%E3%83%BB%E3%82%B3%E3%83%BC%E3%83%AB%E3%80%91)です。

どのレベルのロックが必要になるのか
# MySQL 5.6 

[OnlineDDLの条件マトリクス](https://dev.mysql.com/doc/refman/5.6/ja/innodb-create-index-overview.html)

# PostgreSQL

## v9.6

- [ALTER構文](https://www.postgresql.jp/document/9.6/html/sql-altertable.html)
- [lockについて](https://www.postgresql.jp/document/9.6/html/explicit-locking.html)

## v10

- [ALTER構文](https://www.postgresql.jp/document/9.6/html/sql-altertable.html)
- [lockについて](https://www.postgresql.jp/document/10/html/explicit-locking.html)

エンジョイ
Ubuntu Desktopオレオレ初期設定メモ

# Ubuntu童貞卒業秘話

ずっとサブとして利用してたwindows7搭載糞雑魚ラップトップのHDDが女性の悲鳴みたいな音を常時出し始めたので分解してSSDに換装しました。
最初はWindows10を購入しようかなぁと思いましたが、よく考えたら**youtube見れればOK**なので[Ubuntu Desktop](https://ubuntu.com/)を入れてみました。
[VPS](https://www.conoha.jp/referral/?token=v7ciXWRqjROQdHrdFUM8aAP64ggvkZjkgmdMuoR.MLG9j_7Htj8-QCS)ではずっとCLI版のUbuntuしか触っていなかったので、GUIは新鮮でした！とりあえずシンプルでChromeが動くし、`Wine`入れれば`.exe`ファイルも起動するので楽しいです。

## 有名所のソフトは簡単にインストール出来たりする

各社共に`.deb`形式のパッケージを配布してくれています。

- Steam
- Discord
- Chrome
    - Authy
    - LastPass
- Dropnox
- .exe形式のファイル(Wine)
    - インストール or レジストリ登録が必要なソフトウェアは動かなかったりインストール中にフリーズしたりします。


## スペック

- FMV-S8390(近代化改修済み)
    - CPU
        - Intel(R) Core(TM)2 Duo CPU P8700 @2.53GHz
    - RAM
        - 8GB DDR3-1333 SODIMM
    - SSD
        - SSD 240GB

## インストールで躓いたとこ

DVDにイメージ焼いてインストールしようとしたのですが、何故かディスクを認識してくれない**おま環**が発生したので、[rufus](https://rufus.ie/)を使ってUSBブートを行いました。

### 結論

SSD入れれば動作は必要十分。CPUが足を引っ張ってる感は否めないけど...

# とりあえずアップデートだけ

```bash
sudo apt update
sudo apt upgrade -y
```

# runlevelの確認＆変更

Linuxにはランレベルという概念があり、これによりメンテとかセーフモード起動が出来ます。
例えばログインパスワード忘れた時とかにシングルユーザモードに入っていじったりします。
普通にDesktop用途で使う場合、`runlevel == 5`で利用しているはずです。


| モード番号 | 役割 |
|:----------------:|:----------------:|
| 0 | システムの停止 |
| 1 | シングルユーザーモード |
| 2 | 未使用 |
| 3 | マルチユーザーモード（CLI） |
| 4 | 未使用 |
| 5 | マルチユーザーモード（GUI） |
| 6 | 再起動 |


```bash
runlevel
> N 5 # 初期設定でGUIモード

init 3
> 5 3 # グラフィカルモード(5)からマルチユーザモード(3)へと一時的に変更
```

永続的な変更をするには、以下のコマンドで修正

```bash
# デフォルトのrunlevelをマルチユーザモード(3)へと永続的に変更
sudo systemctl set-default multi-user.target

# デフォルトのrunlevelをグラフィカルモード(5)へと永続的に変更
sudo systemctl set-default graphical.target
```

# アップデートの選択(ノーマル/LTS)

- LTS(長期間のサポートが約束されているバージョン。`18.04`に関しては10年間のサポートが約束されているらしい)
- normal(1年ほどの短期間のサポートだが、最新版の機能が使える)

以下のどちらか。

```bash:/etc/update-manager/release-upgrades 
Prompt=normal
Prompt=lts
```

# ディレクトリの英語化

ディレクトリ名に日本語があると面倒なのでそこだけ英語化。

```bash
echo $LANG
# ja_JP.UTF-8
LANG=C xdg-user-dirs-gtk-update
# 終わったらもとに戻しておこう
LANG='ja_JP.UTF-8'
```
# 各種パッケージのビルド＆インストール

## ごった煮開発ツール群のインストール

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

## gitのインストール

```
sudo add-apt-repository ppa:git-core/ppa
sudo apt update
sudo apt install git
```

## openvpnのインストール

```bash
sudo apt install network-manager-openvpn-gnome
```

`設定-ネットワーク-VPN`を開き、`openvpn`の項目が追加されていることを確認すること。

## tmuxのインストール

tmuxはCLI画面を分割して縦とか横に並べたり、セッションにアタッチ、デタッチすることで別々の環境からログインしても同じ画面で作業を続けられるようにしたりして**分身の術**を使えるようになるソフトです。

最新版のビルドは[こちら](https://qiita.com/kiwi-bird/items/c8c8e9ef698ff6127534)から

## wineのインストール

[別の記事](https://qiita.com/kiwi-bird/items/972abad5e296b1237611)を参照して下さい。

## vim8.x(python+ruby+luaプラグインver)のインストール

具体的な手順については[過去の記事](https://qiita.com/kiwi-bird/items/c3f9e0fa207407ead850)を参照して下さい。

# 順次ブラッシュアップ予定

WORK IN PROGRESS...
SynchRoidでの正規表現あれこれ

SynchRoidでの正規表現に詰まったため、覚書程度になるが記しておく。



#Case1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/a2b2274b-5ca6-bb18-73c2-fdf168454bc0.png)

このように出力されている文章から

文頭の1929394　だけ取り出したい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/3c7976ea-8122-daa6-70e5-da5d0c6deb1f.png)

このように記述。

すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/bd27c462-475c-711f-c8e5-bf80a3427b92.png)

きちんと出力できた。

\*　で *をエスケープ
(\d{7})で、任意の 10 進数の数字 ( "0"、"1" ... "9" など)　を7回繰り返しているものに一致するように指定。
.*　で、以降は何の文字列でもよいことを指定している。



#Case2


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/2501282c-820c-1918-0211-6d23c2b59352.png)

このように出力されている文章から

てすと　だけ取り出したい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/a0b384fc-35ca-fdce-cba4-f5d98ec1e8ad.png)

$1で出力範囲を()内だけに指定

数量を表すものは、10個　20箱　30人　5000円
など、数字＋空白ではないもの、で構成されている。

そのため、

\s　　＝＞　任意の空白文字
\d*　 ＝＞  数字(*にすることで桁数は何桁でもよい)
\s　　＝＞　任意の空白文字
\S　　＝＞　任意の非空白文字 ( " "、タブ、リターンなどを除外した "." と同じ)。

(※\Sは\Dでも良い)

というパターンを記述する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/31fdb3ce-c626-b0ef-2fc2-e3e95d506a17.png)

きちんと出力できた。

#Case3

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/eb0256e5-7a67-5c4e-161b-5af8ccb0f457.png)

この中から
＠１１人x２０袋　だけ出力したい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/6e5e7bb4-7668-4bd2-1165-aa6ddf45afb9.png)

このように記述

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/ffbb7346-cba9-0e7c-d2d2-2314766ab507.png)

きちんと出力できた。

ちなみに、
１番との組み合わせをすることも可能であり、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/70cdee0f-4812-f56c-0266-efeaf783cfb3.png)

こう記述することで対応可能


その際、１番のような　1929394　を出力したい場合は

エクスプレッションに　＄１　を

今回のように＠１１人x２０袋　を出力したいときは

エクスプレッションに　＄２　を　いれてやることで出力が出来る。


また、エクスプレッション内を

「＄1 + ＄2」とすることで

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/3e53117f-bbc7-8f79-47b7-603eb4577fe7.png)


＄１の結果と＄２の結果を足して　出力することが出来る。

#備考

正規表現の「＊」とワイルドカードとしての「＊」は別物である。

参考記事
(https://qiita.com/whisky-shusuky/items/d719c92c566c133f51b1)
SiloファイルをPythonから作りたいだけのはずだったのに...

# 概要

この記事はPythonの計算結果をsiloファイルとして出力し、それをVisItで可視化しようと奮闘したときに生まれた副産物です。

# インストール

## pyvisfile

```
pip install pyvisfile
```

で`pyvisfile`をインストールします。これがsiloファイルを作成するために必要なモジュールです。

## その他もろもろをインストール、と思いきや...

pyvisfileを動作させるにはboost-pythonとPyUbrasというモジュールも必要らしいことがわかりました。

```
brew install boost-python
```

の後に

```
pip install pyublas
```

とすると`boost/python.hppがありません`とエラー。そんなはずはない、と思いネットサーフィンをしていると...同じくpyublasのインストールができないとの報告を発見。

[NumPy・SciPyを用いた数値計算の高速化 : 落ち穂拾い](https://qiita.com/jabberwocky0139/items/19c9bf93d0243cd869b5)のBoost/Pythonの章にて、「boostやPyUblasのビルドがPython3ではできなかった」と書かれています。

そのほかにも、[こんなStackOverFlowの記事](https://stackoverflow.com/questions/20398455/error-while-installing-boost-and-pyublas-on-mac-os-x)を発見。

# 結言

PyUblasやBoostの開発がPython3で行われてないっぽい？なんともモヤっとした終わり方ですが、Pythonからsiloファイルを書き出して、それをVisItで描画するという方法はあまり推奨できないのかなぁという感じでした。それでもmatPlotlibやMayaviがありますから、まぁ困らないんですけどね。
minishift起動時エラー（Mac OSX)

##はじめに

みなさん、minishiftご存知ですか？
ローカル環境でRedhat Openshiftが試せるツールです。すげえ！

こいつでOpenshiftの勉強しようと思ったのですが、起動時に以下のエラー:frowning2:


```terminal
-- Starting Minishift VM .... FAIL E0708 14:36:40.597045   21608 start.go:494] 
Error starting the VM: Error creating new host: json: cannot unmarshal bool into Go struct field Driver.Virtio9p of type 
[]string. Retrying.
Error starting the VM: Error creating new host: json: cannot unmarshal bool into Go struct field Driver.Virtio9p of type []string
```


一応公式手順に従って進めてきたはずなのだが。。。

##解決方法

どうやら、インストールしたxhyveのバージョンが0.4.0だと起こる問題らしい。
k8sのissueに書いてありました。
以下コマンドを実行し、xhybeの違うバージョンをインストールします。

```terminal
brew unlink docker-machine-driver-xhyve
brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/7310c563d662ddbe094f46f9600cad30ad3551a6/Formula/docker-machine-driver-xhyve.rb
```
すでに導入したxhybeをunlinkし、再度installしています↑
[xhyve: json: cannot unmarshal bool into Go struct field Driver.Virtio9p of type []string #4291](https://github.com/kubernetes/minikube/issues/4291)

違うバージョンのxhybeの導入が終わったので、minishiftの起動にチャレンジします。

・・・。

```terminal
Checking for setuid bit ... FAIL
   See the 'Setting Up the Virtualization Environment' topic (https://docs.okd.io/latest/minishift/getting-started/setting-up-virtualization-environment.html) for more information
```
###**xhybeを入れ直したので、再度uidをセットしないとですね！**###
以下のコマンドを実行してください。

```terminal
$ sudo chown root:wheel $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve
$ sudo chmod u+s $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve
```

再々度、minishift start

```
OpenShift server started.

The server is accessible via web console at:
    https://192.168.64.2:8443/console
```

うまくいきました！
上記URLにアクセスすると、(ID/Passwordはdeveloper/developer)無事Openshiftの画面が！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297265/13371677-b236-2caf-b9b2-571ba812040a.png)

##まとめ

xhybeをバージョン指定せずにインストールすると、v0.4.0になってしまう場合がある。
その場合はunlink ⇒ バージョン指定でインストール ⇒ uidをセット ⇒ minishift起動！


```terminal
$ brew unlink docker-machine-driver-xhyve
$ brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/7310c563d662ddbe094f46f9600cad30ad3551a6/Formula/docker-machine-driver-xhyve.rb
$ sudo chown root:wheel $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve
$ sudo chmod u+s $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve
$ minishift start
```
##参考文献

[macOSでMinishiftを起動してサンプルアプリケーションをデプロイ](https://qiita.com/sotoiwa/items/0158436a0e2090ab73f3)

これ読むと、docker-machineと今回インストールしたdocker-machine-driver-xhyveが競合するらしく、シンボリックを上書きしたほうが良いかもらしい。
Swift：文字列を複数の区切り文字で分割する

`CharacterSet`をうまく使うといい感じにできる．
例えばカンマとピリオドを含んだ文をそれらで分割する場合は以下のようにする．

```swift
let str = "a,b,cde,fgh.ijk.lmn"
let list = str.components(separatedBy: CharacterSet(charactersIn: ",."))
Swift.print(list)

// -> ["a", "b", "cde", "fgh", "ijk", "lmn"]
```