OmniAICreator/Qiita-1.07M huggingface dataset:
git add で "does not have a commit checked out" が出た時の対処法

gitについてはだいぶ理解したつもりだったが、初歩的なところに引っ掛かりましたので、備忘録として残しておく。

まず、git statusで中身を確認。


```
 
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	.DS_Store
	.vagrant/
	Vagrantfile
	portfolio/
```

**Untracked file を発見。**

 git add -i で選択し、個別で追加したらgit commit を実行。

これで完了。
静的ライブラリファイル（.lib）の簡易的な作成方法と使用方法

#はじめに

自分が.libファイルの作成方法と使用方法をググった時に
あまりわかりやすいサイトが出てこなかったので自分用のリファレンスという意味で作成しました。
なので、間違っているところやもっと簡単にする方法があるという場合は
ご指摘いただければ時間があるときに変更させてもらいます。

作成環境：VisualStudio 2017


##静的ライブラリの簡単な説明
.libファイルや.aファイルの事を静的ライブラリという
その名の通り、自分で**リンクや使用を宣言する必要があります**。

今回作成していくのは**.libファイル**の方です。







#まずは作成から

VisualStudioを起動して下さい
　　　　　　　↓
「新しいプロジェクト」→「VisualC++」→「WIndowsデスクトップウィザード」
→「アプリケーションの種類（T）：スタティックライブラリを選択」→「空のプロジェクトをチェック」
　　　　　　　↓
通常の関数をヘッダファイルとソースファイルで分けて作る時のように
ヘッダファイルとC++ファイルを一つずつ作成してください。
　　　　　　　↓
関数の宣言と定義をヘッダファイルとソースファイルに分けて作成してください。
　　　　　　　↓
関数を作成した後にビルドしてください。


以上で作成は終了しました。
次は.libファイルを使用するための準備作業です。








#作成した.libファイルの使用

**※注釈
今回はDebugビルド,Releaseビルドで作成された.libファイルは分けずに使用していきます
他のサイトに、Debugビルド,Releaseビルドで別々に作成された.libファイルはちゃんとDebug時とRelease時でリンク先を分けた方がよいと書いてあったのですが。
今回は片方のReleaseビルド時に作成された.libファイルを使用していきます。
そのため、完全に安全性を担保するものではないことを留意してください。**



使用したいプロジェクトのソリューションを開いて下さい
　　　　　　　↓
ソリューションエクスプローラー内の作成した**プロジェクト名と同名の部分を右クリック**
→「エクスプローラーでフォルダを開く」を選択してください
　　　　　　　↓
先ほど静的ライブラリを作成したプロジェクトのフォルダを開いてください
※この時、先ほど作成したフォルダのライブラリがわからない場合は、
上記と同様に静的ライブラリを作成したプロジェクトのソリューションから「エクスプローラーでフォルダを開く」を選択してください。
　　　　　　　↓
次に静的ライブラリを作成したプロジェクトのフォルダから作成したヘッダファイルと
プロジェクトのフォルダ内のDebugフォルダ・Releaseフォルダ内の.libファイルをコピーし
使用したいプロジェクトのソースファイルと同じディレクトリ(同じ場所)にペーストしてください。
![説明_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423473/b624a8f4-2298-9952-511a-1720ebdbfbd8.png)
![説明_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423473/121260b9-edb8-0986-f426-cc31dc8df2da.png)

**下記の状態になっていればいいです**
![説明_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423473/8eb4068e-1766-6490-85df-e11e3a0b31ed.png)
　　　　　　　↓
また、VisualStudioの画面に戻って
ソリューションエクスプローラー内の作成した**プロジェクト名と同名の部分を右クリック**
→「プロパティ」を選択してください
![説明_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423473/c16e6e4d-c14c-ed14-a122-be1241f41e21.png)
![説明_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423473/0dc1468f-3f10-0f3a-b921-3e12176180a0.png)
　　　　　　　↓
左上の構成の項目を「全ての構成」に変更
「構成プロパティ」→「リンカー」→「入力」→「追加の依存ファイル」→**「\/」みたいなマークをクリックし編集をクリック**
![説明_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423473/5b5b81ca-a027-3971-d01b-7264e5ac05c9.png)
　　　　　　　↓
今回自分は「TestLib.libファイル」というファイル名でファイルを作成したので
「TestLib.lib」と記述します。![説明_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423473/90670e30-14d6-95c0-ea24-25485296c8f3.png)

**※一番上の白い部分にファイル名と拡張子を直接打ち込んでください**


後は、先ほど移動させたヘッダファイルをインクルードしたら使用準備は完了です。
![説明_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423473/5b467833-e5a5-4f70-6399-601f1a0dd964.png)








#参考サイト

作成方法
https://docs.microsoft.com/ja-jp/cpp/build/walkthrough-creating-and-using-a-static-library-cpp?view=vs-2019

リンク方法
https://qiita.com/yagiri000/items/597456ba8ba8435f1e01
【Node.js】LINE BOT グループにプッシュ通知を送る

# はじめに
LINE APIを使ってグループにpush通知を送る個人的メモ

# モジュールインストール
axiosを使うと非常にシンプルにPOSTリクエストが送れるので採用

```bash
$ npm i axios
```

# コード

```js:index.js
const axios = require('axios')

const linePost = async (msg) => {
	console.log('linePost...')
	const token = 'API TOKENを入力してください'

	const req_url = 'https://api.line.me/v2/bot/message/push'
	try {
		const res = await axios.post(req_url, {
				//グループID
				"to": "グループのIDを設定してください",
				"messages": [
					{
						"type": "text",
						"text": msg
					}
				]
			},
			{
				headers: {
					Authorization: `Bearer ${token}`,
					'Content-Type': 'application/json; charset=UTF-8'
				},
			}
		)

		console.log(JSON.stringify(res))
	} catch (e) {
		console.log(e.response.data)
	}

}

(async () => {
	await linePost('テストメッセージ')
})()

```

# 実行方法
```bash
$ node index.js
```
TensorFlow2 忘備録: 自分でトレーニングループを作るときに重み正則化 weight regularizerを利用する．


TensorFlow2 でレイヤーを作るとき，下記の様に`kernel_regularizer`を指定すると正則化のためのペナルティ項の計算ができる． (L2 weight regularization は別名 weight decayとも呼ばれる）. 他の正則化の説明については今回は省略する．

```python
layers.Dense(512, activation='elu',
                 kernel_regularizer=regularizers.l2(0.001))
```

tf.kerasの `model.compile` ， `model.fit` を使う場合は，自動的にこれらの正則化項を含めて勾配を計算して学習が進む．

トレーニングループをkerasに頼らず自分で書くときは次の様にする．[公式チュートリアル](https://www.tensorflow.org/tutorials/keras/overfit_and_underfit#add_weight_regularization)を参考にした．

モデルに含まれる正則化項には`model.losses`でアクセスできるので，それらの和を求め，
他の損失との総和をとったものの勾配を計算すればよいようだ．

```python
  @tf.function
  def train_step(images, labels):
    with tf.GradientTape() as tape:
      predictions = model(images, training=True)
      loss = loss_fn(labels, predictions) #出力に関するloss
      reg_loss = tf.add_n(model.losses) # 正則化のLoss 
      total_loss = reg_loss + loss
    gradients = tape.gradient(total_loss, model.trainable_variables) # 勾配を計算
    optimizer.apply_gradients(zip(gradients, model.trainable_variables)) #勾配により学習

```
【ruby】今夜、ループ処理まとめてみました【times, break...】

[前回](https://qiita.com/beanbeenzou/items/4c8534b8dc42a10220a9)は、配列に因んだ繰り返し処理など紹介しました。
今回は、配列もしかり。範囲オブジェクト等にも使うようなループ処理に着目して、まとめてみます。


#早見表

###繰り返し処理

|メソッド / 文法|繰り返し回数
|:--|:--
|for ~ in ~文|オブジェクトの要素分
|while文|指定した条件がtrueの間
|until文|指定した条件がfalseの間
|timesメソッド|任意に指定
|loopメソッド|無限


###繰り返し処理に関するテクニック

|文法|機能
|:--|:--
|next|スキップ
|redo|やり直し
|break|中断


#繰り返し回数を変化させるメソッド / 文法たち

##for ~ in ~
要素(範囲)の分だけ、繰り返す

```ruby

for num in 1..5 do
  p num
end
```

```console:戻り値
1
2
3
4
5
=> 1..5
```


##while
条件がfalseになるまで、繰り返す

```ruby

num = 0

while num <= 12 do
  p num
  num += 3
end
```

```console:戻り値
0
3
6
9
12
=> nil
```

##until
条件がtrueになるまで、繰り返す

```ruby

num = 16

until num <= 12 do
  p num
  num -= 2
end
```

```console:戻り値
16
14
=> nil
```

##times
指定した回数だけ、繰り返す


###単純ループ

```ruby

num = 0

5.times do
  p num
end
```

```console:戻り値
0
0
0
0
0
=> 5
```

###値を変化させながらループ

```ruby

num = 0

5.times do |num|
  p num
  num += 1
end
```

```console:戻り値
0
1
2
3
4
=> 5
```

##loop
breakを使って止めない限り、無限に繰り返す

```ruby

num = 0

loop do
  p num
  num += 1
  if num >= 3
    break
  end
end
```

```console:戻り値
0
1
2
=> nil
```


#ループ処理中のテクニック


##next
スキップさせることができる

```ruby

num = 0..5

6.times do |num|
  next if num == 1
  p num
end
```

```console:戻り値
0
2
3
4
5
=> 6
```

##redo
やり直しすることができる

```ruby

num = 0..5

6.times do |num|
  num += 1
  p num
  redo if num == 1
end
```

```console:戻り値
1
2
2
3
4
5
6
=> 6
```

##break
中断することができる

```ruby
num = 0..5

6.times do |num|
  break if num == 3
  p num
end
```

```console:戻り値
0
1
2
=> nil
```
Windows10HomeにDockerを導入2020年8月版

#Windows10HomeにDockerを導入(2020年8月版)
Windows10HomeにDockerを導入しようと調べていたとき、情報が錯綜してて混乱したのでまとめ。
2020年8月現在

Windows10(64bit)でdockerを使うためには、`Docker desktop for windows`を導入する必要があります。
旧記事だと、ProとHomeの手順が異なると書かれていますが現在は一つのインストーラーに統一されています。
(32bit版はそもそも対象外なので、クリーンインストールし直して64bitに変更するなり諦めるなりしてください。)

##Windows10Homeの準備
先に書いたとおり、`Docker desktop for windows`のインストーラーにはPro版やHome版といった違いはありません。
なので、まずWindows10Homeをインストールできる状態にする必要があります。

###1) 64bitか？の確認
ここで32bit版だったら試合は終了です。諦めきれない場合は、クリーンインストールしなおして64bitに換えてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356086/bca177d5-6415-704b-1bbe-d2ae8cf3df2c.png)

ここで64ビット版であることが確認できればOKです。

###2) Windows 10 Insider Preview ビルドのインストール
通常のWindows10Homeで最新状態であっても、Dockerを入れるには古い状態です。

検索ボックスから`Windows10insider`と検索してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356086/313293b1-039c-3ca2-d548-dfba573efb54.png)

以下の画面が現れます。
(未だWindows Insider Programに参加をしていない場合は。ここで登録作業が入りますので、画面にしたがって登録してください)

「insiderの設定を選択してください」のところが
`○Devチヤンネル ○ベータチャンネル（推奨）○リリースプレビューチャンネル`
等の選択肢になっていると思いますので「ベータチャンネル(推奨)」の項目を選んでください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356086/7effbe6d-53e9-92dc-bc3f-43b0cb425f4a.png)

###3) Windows10Homeを（ベータチャンネルの）最新版にする
検索ボックスに`Windows Update`を入力し、現れた画面から最新版にUpdateする作業を行ってください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356086/2610954f-3523-28e1-d462-d304fab0517e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356086/36781dc5-5897-e702-99c4-8bedbbdbc07c.png)

「更新を確認」→「今すぐインストール」
を何度か繰り返します。
一回では最新にならない上に、一回あたりのダウンロードに相当時間がかかります。一晩放置の場合があるかもしれません。
再起動後に、すぐに次の更新が始まるわけではないので
「更新を確認」→「今すぐインストール」を
「システムは最新です」になるまで繰り返しましょう。

##Docker desktop for windowsをインストール
DockerHubから`Docker desktop for windows`のインストーラーをダウンロードします。
https://hub.docker.com/editions/community/docker-ce-desktop-windows
上記リンクから以下のページに行けますので`Get Stable`で安定版をダウンロードしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356086/9fe45558-0cf7-6129-1947-5bd4b63246be.png)

ダウンロードが終わったら、実行しましょう。インストール後、あるいは途中でシステム設定の変更や追加ファイルのインストールを促されることがありますが、インストーラーの指示に従えば大丈夫です。

インストールが完了すると、次回Windows起動時から`Docker Desktop`の起動状態が通知されるようになります。
稼働中は以下のようにタスクトレイに`Docker Desktop is running`状態のアイコンが表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356086/c17f3cad-8610-ca48-1e06-052e55f44f45.png)


###1) Docker実行
`PowerShell`から`docker`や`docker-compose`などを実行して動作確認をしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356086/d2099cab-8632-f163-457b-04a0757e90ab.png)


現場からは以上です
Carry Out Some of the Most Important Projects Easily with Russia VPS Hosting

![russia vps server.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367731/b604b29e-70bc-83a3-ddb4-9dbfc4c212f2.jpeg)

Russia VPS Hosting

There is no other server hosting option that works as efficiently and as advantageously as a virtual private server. Russia VPS hosting solutions availed from Onlive Server are the cheapest in the market. These servers work in the same way as dedicated servers offering dedicated or isolated environments to the site owners. The sites hosted on these servers get their very own allocated resources and hardware that they do not need to share with the other sites being hosted on the same server. Hence, it is always a good deal to go for a <a href="https://www.onliveserver.org/russia-vps-server-hosting/">Russia VPS Hosting</a> solution from a reputed service provider. The catch here is you will not have to spend the same amount of money as you would have to pay for using the resources and the space of a dedicated server. This is what has helped the VPS server hosting providers in garnering the attention of the budget conscious clients. With the availability of the virtual private servers, it has become easier and more convenient for the budget-conscious buyers to get the same resources of a dedicated server but within much lower price. Some of the most common questions associated with the use of VPS servers and their answers are as follows:

1.	What projects are virtual private servers best suited for?

VPS servers are best used by tech-savvy professionals and individual users. For the ones with small sites that need to be hosted with limited resources and hardware, it would be a wise idea to go for shared server hosting. However, the ones who are in need of maximum control on their hosting environment and huge amounts of computing power at the same time should always go for VPS server hosting. Virtual private servers are seconds to dedicated servers.

Resource-intensive sites, mission-critical web applications, databases, internet-based game servers and other varieties of complex assignments are best suited for VPS hosting solutions. A virtual private server offers more control in comparison to any other server hosting service. This is evident from the fact that the users get to install their preferred operating systems. They can even take advantage of super-user level access to the server and its resources.

2.	Do I need to be technically savvy in order to use a virtual private server?

Yes, technical knowledge is not mandatory but important for all those users who are thinking of going for virtual private servers. <a href="https://www.onliveserver.org/russia-vps-server-hosting/">Russia VPS</a> Hosting solutions are basically semi-managed. This means that with certain serious problems, the users will have to go through tutorials and knowledge base instead of getting assistance from the customer support team at Onlive Server.
【CakePHP】$this->request->query()はちゃんとURLデコードされている

## 検証した環境
・CakePHP2
・CakePHP3.8

## なぜこの記事を書いたか

タイトルの通りです。
GETパラメーターを渡し、コントローラーで`$this->request->query()`で受け取ること、良くあると思います。
その際、GETパラメーターにURLエンコードされた値を渡すことがあります。
そしてそのGETパラメーターを、コントローラーで`$this->request->query()`で取得すると、いつの間にかURLデコードされた値になっています。

```:例
// ユーザーIDをカンマ区切りで複数渡したい時
// 1234,5678,9012 をURLエンコードしてGETパラメーターで渡す。
https://sample.com/users/index?user_id=1234%2C5678%2C9012

// コントローラーでuser_idを取得
$user_id = $this->request->query('user_id');

// 取得したuser_idの中身は、「1234,5678,9012」になっている。
　（URLデコードされている）
```

そんなの常識なのかもしれませんが、「実際こうなって取得できるし、そういう仕様なんだろう」と思っていたら、
「ちゃんと公式ドキュメントかソースコードで確認したほうが良い。なんとなくこうだから〜で済ませてはダメ」
と指摘されたので、確認することにしました。

## 公式ドキュメントを確認

Cookbook
https://book.cakephp.org/3/ja/controllers/request-response.html#cake-request

ここの「クエリー文字列パラメーター」の項目では、特にURLエンコード・デコードについては書かれていません。

## ソースコードを確認

CakePHPのソースコードを見て、URLデコードしている処理があるか確認します。
ここではCakePHP3系のソースコードで説明します。

上記のドキュメントによると`Cake\Http\ServerRequest`でリクエストデータが定義されているとのこと。

```php:Cake\Http\ServerRequest
    public function __construct($config = [])
    {
        if (is_string($config)) {
            $config = ['url' => $config];
        }
        // 省略

        $this->_setConfig($config);
    }
```

まず、`__construct`でリクエストデータを受け取り、`_setConfig`関数に渡します。


```php:Cake\Http\ServerRequest
    protected function _setConfig($config)
    {
        // 省略

        $querystr = '';
        if (strpos($config['url'], '?') !== false) {
            list($config['url'], $querystr) = explode('?', $config['url']);
        }
        // ここでURLを「?」で区切ったものを配列にいれている
        // urlの「?」の右側、つまりGETパラメーターが変数$querystrに代入される

        // 省略

        $this->data = $this->_processFiles($config['post'], $config['files']);
        $this->query = $this->_processGet($config['query'], $querystr);
        // ここで$this->request->query()で使える値が入る
        $this->params = $config['params'];
        $this->session = $config['session'];
    }
```
`_setConfig`関数の中で、GETパラメーターを変数`$querystr`に入れ、`_processGet`関数に渡しています。
`_processGet`関数が返す値を`$this->query`に入れています。


```php:Cake\Http\ServerRequest
    protected function _processGet($query, $queryString = '')
    {
        $unsetUrl = '/' . str_replace(['.', ' '], '_', urldecode($this->url));
        unset($query[$unsetUrl], $query[$this->base . $unsetUrl]);
        if (strlen($queryString)) {
            parse_str($queryString, $queryArgs);
            // parse_str関数によりURLエンコードされた値がURLデコードされて変数に入れられる
            $query += $queryArgs;
        }

        return $query;
    }
```

第二引数で受け取ったGETパラメーターの入った変数`$queryString`を`parse_str`関数で処理し、変数`$queryArgs`に入れています。
`parse_str`関数により、変数`$queryArgs`にはURLデコードされた値が入ります。
そしてそれを返しているということになります。

**parse_str関数**
https://www.php.net/manual/ja/function.parse-str

```
注意:
全ての作成された変数 (第二引数が設定された場合は配列に設定される値) の値は、既に urldecode() されています。
```

ということで、冒頭でも話したように、GETパラメーターでURLエンコードされた値を渡し、CakePHPのコントローラーで`$this->request->query()`を使ってGETパラメーターを取得した場合、すでにURLデコードされた値を取得する処理になっているということが確認できました。

実際に取得した値を出力してみればわかることではありますが、「実際そうなるから」ではなく、「本当にそういう仕様なのか？公式ドキュメントにないけど本当に？」というのを、フレームワークのソースコードを確認することにより、根拠を持って知ることができました。
【メモ】C#におけるstaticクラスとsingletonクラス

# 対比

### singletonクラス
- インスタンスを引数としてメソッドに渡すことができる。
- インターフェースの実装、クラスの継承が可能。
- 初期化のタイミングを明示的に記述できる。

### staticクラス
- インスタンス化できない。
- インターフェースの実装、クラスの継承が不可。
- 静的コンストラクタでのみ初期化可能。

# 参考
Singleton Vs Static Classes
https://www.c-sharpcorner.com/UploadFile/akkiraju/singleton-vs-static-classes/
GoogleAppEngineクイックスタート④パフォーマンスチューニング編

# 概要

* スケーラブルなGAEを利用するにあたり、スケールしすぎて不要な費用がかかる事を避けたい
* AutomaticScalingを設定し、上限値を定める事により、費用の抑制をする
* 予算が少ないんです。。

# 詳細

* 大体の設定は以下の通り
* とりあえず以下の値でデプロイし、負荷を確認しながら微調整する

```app.yaml
:
:

### Performance Configuration
instance_class: F2
automatic_scaling:
  #CPU利用率の閾値（default：0.6）
  target_cpu_utilization: 0.7

  #新しいインスタンスを作成する同時処理リクエスト数の割合 [max_concurrent_requests * target_throughput_utilization] （default：0.6）
  target_throughput_utilization: 0.6

  #最大インスタンス数 (0 ~ 2147483647)
  max_instances: 20

  #最大インスタンス数 (0 ~ 2147483647) ※このインスタンス分費用がかかる
  min_instances: 1

  #Idle状態で待機してよいDynamicInstanceの最大数 (default:automatic)
  max_idle_instances: 1

  #Idle状態で予約しておくインスタンスの数 (default:1)
  min_idle_instances: 1

  #Pending Request Queueの中で既存インスタンスが空くのを待つ最小時間(default:automatic)
  min_pending_latency: automatic

  #Pending Request Queueの中で待てる最大時間(default:automatic)
  max_pending_latency: automatic

  # 1インスタンス同時処理リクエスト数 (default:8)
  max_concurrent_requests: 100

:
:

```

# 追記

* 現状トラブルなく良い感じで稼働中
【Typescript】配列の中から条件に一致する要素を探す

使うことが多いので、まとめる

##特定の値（一種類）に一致するものがあるかを知りたい
```typescript
array1 = [1, 2, 3];
const result = this.array1.includes(1);
//または
const result2 = this.array1.some((val) => val === 1);

```
一致する物があればtrue,なければfalse
配列の要素が複雑な形してなければincludesがシンプル。

##特定の値（複数種類）に一致するものがあるかを知りたい
```typescript
array1 = [1, 2, 3];
array2 = [3, 4, 5];
const result =
 this.array1.some((val) => this.array2.includes(val));
```
配列1から配列2のいずれかの値があるかを調べたいとき
一致する物があればtrue,なければfalse

8/31 追記
~~const result = this.array1.includes( 3 || 4 || 5 );
調べたい要素数が少なければincludesで||が楽そう~~
コメントご指摘。
調べてるときこういう書き方があってこの例だとtrueになるからこういう書き方できるのか〜と思ってましたが
||ではできないみたいです。教えていただきありがとうございます:hugging:

##配列の中から特定の値に一致する物があれば、その要素を取得したい
```typescript
array3 = [
    { a: 1, b: 2 },
    { a: 3, b: 4 },
    { a: 5, b: 6 },
  ];
const result3 = this.array3.find((val) => val.a === 1);
```
一致する物があれば、その要素の値を返り値にする（この例だと、{a:1,b:3})


booleanで知りたければincludesかsome、
値そのものが欲しければfind!
Gnu-COBOL インストール

※ OS: macOS Catalina 10.15.6

## 実行環境作成

#### brewで検索

```
brew search cobol
```

<details><summary>【実行画面】</summary>
![スクリーンショット 2020-08-28 20.43.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320855/23793407-b4eb-99a4-a19a-52abdf37334f.png)
</details>

---

#### install

```
brew install gnu-cobol
```

<details><summary>【実行画面】</summary>
![スクリーンショット 2020-08-28 20.47.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320855/07bd90d8-c0fc-e2f2-fb22-678a7856f10f.png)
</details>

---

#### バージョン確認

```
$ cobc -V
```

![スクリーンショット 2020-08-28 23.09.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320855/2100663e-ee21-8882-3bcf-34db86d7e78d.png)
次世代画像フォーマットに対応してランディングページのパフォーマンスを改善する


## パフォーマンスのスコアが低い...

![old_performance.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606419/f437be4d-a6ea-d331-da8f-cf3ac62e1c8a.png)

作成したランディングページを [Lighthouse](https://chrome.google.com/webstore/detail/lighthouse/blipmdconlkpinefehnmjammfjpmpbjk?hl=ja) で診断した結果、パフォーマンスのスコアが 63 というアウト寄りの結果になりました。ランディングページはけっこうな量の画像を使用しているため、どうしても仕方がない部分はありますが、もう少し改善が必要です。「Time to Interactive」が 7.6 秒なので、ユーザーがアクセスしてから操作できるまで、 7.6 秒かかっています。

ただ、これが次世代画像フォーマットに変更するだけでパフォーマンスのスコアが 93 まで向上したので、かなりコスパの良い対応だったなと思います。ちなみに、「Time to Interactive」は 3.7 秒まで縮んでいます。

![new2_performance.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606419/866099b9-7c1c-0702-c6a5-a2e8b25fa387.png)


## やったこと

画像が15枚使用しており、トータルは 1.5 MB でした。
ほとんどの人の通信環境では、1.5 MB くらいは気にならないダウンロード量ですが、私のように格安 SIM ユーザーにはちょい頑張らないといけない量になります。例えば、今の私の通信速度は月末の通信制限も重なり 150 kbps なので、画像のダウンロードだけで 10 秒ほどかかります。色々な通信環境の人がアクセスしてくるものなので、軽いに越したことはありません。

次世代フォーマットへの対応後は、画像のトータルは 339 kb (0.339 MB)です。けっこう小さくなりました。

### WebP に対応

> Serve images in next-gen formats

Lighthouse に次世代フォーマットに対応しろ、と書いてあるので実直にこれに対応しました。
これに対応するだけで、7.35 秒も節約できるとのこと(7.35秒というのは Lighthouse が診断対象のサイトにある画像を WebP に変換して節約できる時間を計算したものです)。

> Image formats like JPEG 2000, JPEG XR, and WebP often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. Learn more.

次世代フォーマットとは、JPEG 2000、JPEG XR、WebP です。JPG, PNG と比較すると圧縮効率が良いため、画像容量が少なく済み、結果的にサイトの表示速度が向上します。

> WebPは、米Googleが開発しているオープンな静止画像フォーマット。ファイルの拡張子は「.webp」。
> https://ja.wikipedia.org/wiki/WebP#:~:text=WebP%E3%81%AF%E3%80%81%E7%B1%B3Google%E3%81%8C,%E5%AD%90%E3%81%AF%E3%80%8C.webp%E3%80%8D%E3%80%82

WebPの説明は Wiki を引用しています。2010 年に開発されたフォーマットなので、次世代と言いつつ既に10年経っています。現時点（2020/08/28）で、WebP は IE, Safari, iOS Safari 以外は対応しています。Safari, iOS Safari も次のバージョンから対応予定なので、サポート終了が見えている IE を除くと、近いうちに主要ブラウザは全て対応されます。
https://caniuse.com/#feat=webp

JPEG 2000 は、Apple が開発、JPEG XR はMicrosoftが開発していますが、自分たちのブラウザ以外から全く対応されておらず、総スカンを食らっているので、対応する価値なし、と判断しました。ただ、iPhone ユーザーの多い日本では Safari や iOS Safari からのサイトへのアクセスはだいたい半数を占めます。現時点では、WebP が Safari, iOS Safari に対応されていないことを考慮すると JPEG 2000 への対応はありかもしれません。

> WebP images are smaller than their JPEG and PNG counterparts—usually on the magnitude of a 25–35% reduction in filesize. This decreases page sizes and improves performance.
https://web.dev/serve-images-webp/

だいたいの場合は、WebP にすることで　JPG や PNG と比較すると 25 - 35 % ほど画像容量を節約することができるようです。

#### WebP への変換ツール
これも Google 発のツール。使いやすい。
https://imagecompressor.com/

#### ソースコードの対応

対応前。

```html
<img src='sample.png' alt=''>
```

対応後。WebP 以外には対応しなかったですが、一応他のフォーマットも。WebP などの次世代フォーマットに対応していないブラウザは、PNG 形式で表示されます。

```html
<picture>
  <source srcset='sample.webp' type='image/webp'>
  <source srcset='sample.jxr' type='image/vnd.ms-photo'>
  <source srcset='sample.jp2' type='image/jp2'>
  <img src='sample.png' alt=''>
</picture>
```

### PNGからJPG

おまけですが、透過を利用しない画像は、JPG にしました。ロゴなどの色情報が少ない場合は PNG 向きですが、だいたいは JPG のほうが画像容量は少なく済みます。

## まとめ

私の作ったランディングページです。
パフォーマンススコア 93 を体感して下さい。

https://atsumaritai-landing.web.app/
IDパスワード付き共有フォルダを自動で開くバッチ

　実行するとID、パスワード付きの共有フォルダ(ネットワークフォルダ)を、エクスプローラーで開くバッチファイルです。
共有フォルダ名:\\\\drive\folder
ID:123
パスワード:pass
とします。

```:コマンドプロンプト/.bat
net use \\drive\folder /user:123 pass
start \\drive\folder
```
実行するとネットワークフォルダが開きます。

 まずは、net  useコマンドでネットワークフォルダに接続しています。

```:ネットワークフォルダに接続する
net use \\drive\folder /user:123 pass
```
　パス名　/user:の後にID,パスワードを半角スペースで区切って入力します。
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/gg651155(v=ws.11)
net useコマンド マイクロソフト公式

 ネットワークフォルダに接続したら、フォルダを開きます。

```:フォルダを開く
start \\drive\folder
```
 startコマンドは、別プロセスでコマンドを実行するときに使うことが多いですが、フォルダを開くこともできます。
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/cc770297(v=ws.11)
startコマンド マイクロソフト公式

　推奨はされないでしょうが、パス付きフォルダへの接続がダブルクリックだけになると、結構便利ですよ。
three.jsでアバタービデオチャットを作る

# この記事について
所属しているゼミで夏のオンライン合宿が実施されました。
4人1チーム、3日間の日程でthree.jsを使用したアバタービデオチャットサービスを作成したので、備忘録として使用した技術や参考になったサイトを簡単に残しておこうと思います。
# 使用したもの
* HTML+CSS
* JavaScript(three.js)
* [SkyWay](https://webrtc.ecl.ntt.com/)
* facemesh  

## SkyWayについて
>SkyWayは、ビデオ通話、音声通話をかんたんにアプリに実装できる、
マルチプラットフォームなSDKです。
（公式サイトより）

SkyWayのJavaScript SDKを使用することで、自前でサーバを用意しなくても気軽にビデオチャットサービスが利用できるようになります。
今回はwebカメラの映像そのものではなくアバターの動きとマイク音声をやりとりしたかったので、[こちら](https://webrtc.ecl.ntt.com/documents/javascript-sdk.html)のサンプルコードに手を加えて利用することにしました。

## facemeshについて
カメラ映像から顔検出を行うオープンソース機械学習モデルです。2020年3月にGoogleでリリースされました。
今回は.vrmモデルに顔（主に傾きと口の動き）を反映させるために使用しました。参考にしたサイトは[こちら](https://knowledge.sakura.ad.jp/24667/)です。
# 実装する
今回やりたかったことは、  

* SkyWayでの通話機能実装
* アバター映像を相手に送る
* 複数人で会議する
* vrmモデルを複数から選ぶ
* 映像と同時に音を届ける  
* チャット機能の追加

などです。

アバターチャットには、three.jsを用いてブラウザ上でvrmモデルを描画する方法を取りました。
「アバターに変換した映像を相手に送る」点は、`canvas`タグに描画したものを`captureStream()`で映像に変換することで解決しました。本当は出力せずに描画内容をそのままstreamに載せたかったのですが、3日間でそこまで調べきれず（メンバー4人ともJavaScriptに詳しくなく…）断念しました。

また、一番苦労した「映像と同時に音を届ける」点は、`getAudioTracks()`と`addTrack()`を使うことで解決しました。一度音のみを抽出しておいて、処理したアバター映像に音を再び載せるやり方です。

![スクリーンショット 2020-08-28 20.14.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/623782/cb9ca33e-9bd0-f020-7e37-bf5c33db99a4.png)

![スクリーンショット 2020-08-28 20.17.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/623782/92e45abb-cd08-f165-29dc-81bc37e2a09f.png)

外観はあまり凝ったものにはできなかったのですが、やりたいと思っていたものはほぼ達成できたのでとても嬉しかったです。
最終的なコードは[こちら](https://github.com/Rimo1129/anime_meeting_5)にあります。

#おわりに
はじめてのチーム開発&JSを本格的に触るはじめての機会でしたが、自分たちで満足のいくものを作れたと思います。終わった後の飲みは超盛り上がりました。
今回の開発を通じて「JavaScriptは思ったよりいろんなことができる」と気づいたので、これから積極的に触っていこうと思います。
読んでいただきありがとうございました。
#参考にしたもの
[SkyWayのJavaScriptSDK](https://webrtc.ecl.ntt.com/documents/javascript-sdk.html)
[SkyWayでデスクトップの映像とカメラの映像をクロマキー合成して配信する](https://qiita.com/TakedaHiromasa/items/b7cd511169e702b731f6)
[テレカンVTuberをやってみよう！ facemeshを使ったアバター表示](https://knowledge.sakura.ad.jp/24667/)
AWS Systems Manager でAnsible実行するとRunCommandのときだけasciiエラーで死ぬ

AWS Systems Manager で複雑な Ansible のプレイブックを実行可能に
https://aws.amazon.com/jp/about-aws/whats-new/2019/09/now-use-aws-systems-manager-to-execute-complex-ansible-playbooks/

しゅごい。個人の環境下に何も用意しなくてもAWSコンソールからポチるだけでAinsibleが実行できる。
超いけてる。

ローカルで完璧に作ったPlaybookを、AmazonLinux2のインスタンスに対して意気揚々と実行。

・・・なんだけど、以下のエラーでドハマリした。Pythonなんて知らん。


```json
{
  "changed": true,
  "cmd": "aws --region=xxx secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:xxx:999:secret:xxx",
  "delta": "0:00:00.000000",
  "end": "2020-01-01 01:00:00.000000", 
  "msg": "non-zero return code",
  "rc": 255, 
  "start": "2020-01-01 01:00:00.000000",
  "stderr": "\n'ascii' codec can't encode characters in position 998-999: ordinal not in range(128)",
  "stderr_lines": [
    "",
    "'ascii' codec can't encode characters in position 998-999: ordinal not in range(128)"
  ],
  "stdout": "",
  "stdout_lines": []
}
```

playbookは以下みたいな感じ（雰囲気）

```yml
- name: read secretmanager secret value
  shell: >
    aws --region=xxx secretsmanager get-secret-value --secret-id {{ secret_manager_arn }}
```

単に `aws secretsmanager get-secret-value` 叩いてるだけ。

このPlaybookをローカルで叩いたり、サーバー上で直接実行しても問題なくスンッって通る。
でもSMSの[AWS-ApplyAnsiblePlaybooks](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-state-manager-ansible.html)経由で実行したときだけ、 `'ascii' codec can't encode characters in position 998-999: ordinal not in range(128)` っていうエラーになる。


### やったこと１： PYTHONIOENCODING=utf8

`'ascii'` って書いてあるしUTF-8的な何かだとは思ったので　https://qiita.com/NPoi/items/b2e6d3568b1b011ed3e7 こちらとか参考にしつつ

`PYTHONIOENCODING=utf8 aws --region=xxx secretsmanager get-secret-value --secret-id {{ secret_manager_arn }}`

やってみたけど駄目。 `PYTHONIOENCODING=utf8` と `PYTHONIOENCODING=UTF-8` どっちもやったけど駄目。

### やったこと２： aws cliのパスを変える

よくよく見てったら`aws` のパスが `/bin/aws` で実行されてて、 `/usr/bin/aws` じゃなかったので、

`/usr/bin/aws --region=xxx secretsmanager get-secret-value --secret-id {{ secret_manager_arn }}`

とかやってみたけど駄目。Pythonわかんねぇ・・・。

## 正解

というわけで数時間ドハマリした結果、以下が正解

```yml
- name: read secretmanager secret value
  shell: >
    LANG=C.UTF-8 aws --region=xxx secretsmanager get-secret-value --secret-id {{ secret_manager_arn }}
```

これで通るようになった。

locale確認するとRun Command経由で実行したときは以下みたいな感じになってる。

```
LANG=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
```

POSIXになってるので、とりあえずLANGを `C.UTF-8` にしてあげることで解決できた。
3年後に覚えてる自信が無いのでメモ。
Nodeのバージョン管理をnodebrewからnに切り替える

Nodeのバージョン管理には「nodebrew」を使用していたのですが、なぜか調子がよくないのでこの際に気になっていた「n」に切り替えてみます。
私自身の備忘録になりますので、
作業手順や状況などは細かいのですがご了承ください。

# 環境
・OS: Mac OS X
・Version: 10.14.6
・bash

# まずは既存のnodebrewを削除
私の場合、「homebrew」でインストールした記憶があったので `brew` コマンドで削除します。

```
brew uninstall nodebrew
```

その後、しっかり消えているか確認します。

```
nodebrew -v
```

あれ？なぜかたくさん表示されました。。。
その中には `nodebrew バージョン番号` の文字がありました。

これは削除されていないということで探します。

```
which nodebrew
```

`which` で検索しました。
そうすると

```
/Users/admin/.nodebrew/current/bin/nodebrew
```

しっかりそれっぽいのがいらっしゃいました。

とりあえずごっそり消してみます。

```
rm -R /Users/admin/.nodebrew
```

もう一度消えたか確認してみると

```
nodebrew -v
/Users/admin/.nodebrew/current/bin/nodebrew: No such file or directory
```

とりあえずPATHを確認
私の場合、`~./bashrc`　に色々記載しているのでそこを確認

```
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

こんなのを発見したので削除。

```
nodebrew -v
nodebrew: command not found
```
よっしゃ。

# nをhomebrewでインストール
次に「n」をhomebrewでインストールします。

```
brew install n
```

インストール後、恒例のバージョン確認。

```
n -V
6.7.0
```

インストールは無事完了。

# nodeのインストール
次にnodeをインストールします。
最新版をインストールする際には`latest`、
LTS(Long Term Support)版をインストールする際には`lts`、
安定バージョンをインストールする際には`stable`、
というラベルを使用します。
今回は、最新版をインストールしてみます。

```
n latest

  installing : node-v14.9.0
  mkdir : /Users/admin/.n/n/versions/node/14.9.0

  Error: sudo required (or change ownership, or define N_PREFIX)
```

おや？N_PREFIXで設定したらいいのか？
調べてみたらnodeのインストール先を変更してあげれば
`sudo`も不要でいい模様
とりあえず環境変数を`bashrc`に設定してみる。

```~/.bashrc
export N_PREFIX=$HOME/.n
export PATH=$N_PREFIX/bin:$PATH
```

記載後に`source ~./bashrc`をしてあげる。

その後もう一度nodeのインストール

```
n latest

  installing : node-v14.9.0
       mkdir : /Users/admin/.n/n/versions/node/14.9.0
       fetch : https://nodejs.org/dist/v14.9.0/node-v14.9.0-darwin-x64.tar.xz
   installed : v14.9.0 (with npm 6.14.8)
```

今度はうまくいった模様。
安定のバージョン確認

```
node -v
v14.9.0

npm -v
6.14.8
```

無事完了！

# 色々な処理
せっかくなのでちょっとやってみる
## インストール済みのバージョンの一覧
```
n list
node/12.18.3
node/14.9.0
```
これでインストール済みのバージョンは表示される

## バージョン切り替え
```
    node/12.18.3
  ο node/14.9.0

Use up/down arrow keys to select a version, return key to install, d to delete, q to quit
```
これだけで切り替え可能。便利。

## バージョン削除
```
n rm バージョン番号
```
削除したいバージョンを指定して削除します。

```
n prune
```
現在使用中のバージョン以外の全てのバージョンを削除する。


### 参考にさせていただいた記事
[nodeのバージョンをnで管理する](https://qiita.com/bigplants/items/2d75bf552e0da4a7e822)
OC曲線(Operating Characteristic curve)、バスタブ曲線、ポアソン分布、ワイブル分布

応用情報技術者平成30年秋期 午前問75

横軸にロットの不良率，縦軸にロットの合格率をとり，抜取検査でのロットの品質とその合格率の関係を表したものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/6baf2b04-86f8-f8d6-f4d2-859cfa8d9a16.png)


１、OC曲線(Operating Characteristic curve)は、ロットの不良率とそのロットの合格率の関係を表したグラフです。ロットの不良率がnである場合にロットの合格率が一意に決まることを表しています。
製品の抜き取り検査では、ロットからn個のサンプルをとり、それに含まれる不良品個数が c個以上であればそのロットを不合格とするという判定を行います。

OC曲線は、nおよびcを固定とした場合のロットの合格率(p)を縦軸に、実際のロットの不良率(ｑ)を横軸に取り、pとqの関係を表した曲線です。
・本来合格となるべきロットが、抜き取り検査で不合格になってしまう確率を生産者危険、
・本来不合格となるべきロットが合格になってしまう確率を消費者危険
といいます。

・ロット：同じ条件のもとに製造する製品の、生産・出荷の最小単位。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/fe65510d-76a8-4d84-9dbd-65c7a755032a.png)


２、バスタブ曲線は、　bath-tub curve 
故障率曲線とも呼ばれ、機械や装置の時間経過に伴う故障率の変化を表示した曲線です。

バスタブ曲線（故障率曲線）とは、時間が経過することによって起こってくる機械や装置の故障の割合の変化をしめすグラフのうち、その形が浴槽の形に似ている曲線のことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/678feaf7-c97c-4644-64bd-b917c4fecf7e.png)

３、ポアソン分布は、
非常に大きな集団においてきわめて起こりにくい事象を対象としたときの分布です

統計学および確率論においてポアソン分布（英: Poisson distribution）とは、数学者シメオン・ドニ・ポアソンが1838年に確率論とともに発表した、所与の時間間隔で発生する離散的な事象を数える特定の確率変数 X を持つ離散確率分布のことである。ある離散的な事象に対して、ポアソン分布は所与の時間内での生起回数の確率を示し、指数分布は生起期間の確率を示す[1]。

ポアソン分布とは「一定時間内にランダムなイベントが何回発生するか」を表す分布です。

例えば「地震の発生回数」を「ランダムなイベント」とみなすと，「これから 100 年間のうちに地震が発生する回数」がポアソン分布で表現できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/fb9113b6-016c-7430-80c2-2595691087c1.png)


４、ワイブル分布は、
物体の体積と強度との関係を定量的に記述するための確率分布で、部品などの寿命特性を統計的に記述するために利用されます。

ワイブル分布（ワイブルぶんぷ、英: Weibull distribution）は、物体の強度を統計的に記述するためにW. ワイブル (Waloddi Weibull) によって提案された確率分布。 時間に対する劣化現象や寿命を統計的に記述するためにも利用される。



つまり、
・OC曲線：不良率/良率曲線
・ポアソン分布：発生確率分布
・バスタブ曲線：故障率曲線
・ワイブル分布：寿命特性/劣化現象統計分布
ですね。



参照：
https://www.ap-siken.com/kakomon/25_aki/q75.html

バスタブ曲線（故障率曲線）
https://anzeninfo.mhlw.go.jp/yougo/yougo59_1.html#:~:text=%E3%83%90%E3%82%B9%E3%82%BF%E3%83%96%E6%9B%B2%E7%B7%9A%EF%BC%88%E6%95%85%E9%9A%9C%E7%8E%87%E6%9B%B2%E7%B7%9A%EF%BC%89%E3%81%A8%E3%81%AF%E3%80%81%E6%99%82%E9%96%93%E3%81%8C,%E6%95%85%E9%9A%9C%E3%81%AF%E5%8F%96%E3%82%8A%E9%99%A4%E3%81%8B%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82


ポアソン分布
https://mathtrain.jp/poisson#:~:text=%E3%83%9D%E3%82%A2%E3%82%BD%E3%83%B3%E5%88%86%E5%B8%83%E3%81%A8%E3%81%AF%E3%80%8C%E4%B8%80%E5%AE%9A,%E3%81%AA%E3%81%A9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E8%A7%A3%E8%AA%AC%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

ポアソン分布
https://www.slideshare.net/teramonagi/ss-11296227

ポアソン分布
https://ja.wikipedia.org/wiki/%E3%83%9D%E3%82%A2%E3%82%BD%E3%83%B3%E5%88%86%E5%B8%83

ワイブル分布
https://ja.wikipedia.org/wiki/%E3%83%AF%E3%82%A4%E3%83%96%E3%83%AB%E5%88%86%E5%B8%83#:~:text=%E3%83%AF%E3%82%A4%E3%83%96%E3%83%AB%E5%88%86%E5%B8%83%EF%BC%88%E3%83%AF%E3%82%A4%E3%83%96%E3%83%AB%E3%81%B6%E3%82%93%E3%81%B7%E3%80%81%E8%8B%B1,%E3%81%AB%E3%82%82%E5%88%A9%E7%94%A8%E3%81%95%E3%82%8C%E3%82%8B%E3%80%82
[ev3×Java]   leJOS開発環境の構築(Eclipse on Mac OSX /bluetooth)

ev3をJavaで動かすための準備について書いていきます。

#目次
0 . leJOSとは
1 . 必要なもの
2 . 参考記事
3 . microSDの準備
4 . bluetooth接続
5 . SSH接続
6 . Eclipseの準備とプログラムの実行
最後に

#0.leJOSとは

レゴマインドストームのロボットにJavaのプログラミング環境を提供するシステムのことです。

今回は、**Mac OSX**で**bluetooth**を使ってev3を動かします。
また、Javaの統合開発環境である**Eclipse**を使ってプログラムをつくり、処理を実行します。

#1.必要なもの

◯ ev3(タンク)
◯ パソコン(Eclipse)
◯ bluetooth
◯ microSD
◯ [leJOS-API](http://www.lejos.org/ev3/docs/overview-summary.html)

---

#2.参考記事

こちらの記事を見て進めるのが一番いいと思います。

[【leJOS】mindstorm-EV3をJavaでプログラミングしよう【環境構築前編】](https://qiita.com/munro/items/2790f1ef5afed3a5d13c)
[【leJOS】mindstorm-EV3をJavaでプログラミングしよう【環境構築後編】](https://qiita.com/munro/items/0972e6f36676c61e3f57)

---

#3.microSDの準備



**1** . [sourceforge/lejos ev3](https://sourceforge.net/projects/ev3.lejos.p/files/)から最新のものをダウンロードします。

**2** . ダウンロードしたものを解凍→sd500.zipを解凍します。


**3** . [Ethcher](https://www.balena.io/etcher/)を使ってsd500.imgをsdカードに書き込みます。

**4** . lejosimage.zipを解凍→中にあるファイルを全てSDカードに書き込みます。
(ドラッグ&ドロップでファイルをSDカードのルートディレクトリ(最上位階層の空間)に移動します。)

※SDカードに書き込めないというエラーがあった場合
→[SDカードが読み出しのみ](https://discussionsjapan.apple.com/thread/10092364)


**5** . lejos用のJavaを[Oracle JRE](http://www.oracle.com/technetwork/java/embedded/downloads/javase/javaseemeddedev3-1982511.html)からダウンロードします。
※ファイル(ejdk-8-fcs-b132-linux-arm-sflt-03_mar_2014.tar.gz)は、使用不可


**6** . ダウンロードしたファイルをそのままSDカードのルートディレクトリ(最上位階層の空間)に移動します。

**7** . SDカードをev3に差込み、起動します。

---

#4.bluetooth接続をする

@ev3-brick

**1** . PANを選択
**2** . BT Clientを選択
**3** . 繋げたいパソコンを選択
**4** . IPアドレスが表示されたら接続成功

---


#5.SSH接続

◯一般的なプログラムの実行には必要ありません。必要になった時に適宜実行してください。

@ターミナル

**1** . ``root @192.~.~.~``と入力
※@の後ろはev3に表示されているIPアドレスを入力する

**2** . enterキーを押す
※パスワードを聞かれるが入力の必要はない

**3** . 確認
成功したら↓のようになる
root@EV3:~# 


##うまくいかない場合

**configファイルをviエディタで編集**します。



@ターミナル

**1** . ``cd /etc``と入力

**2** . configファイルがあるかどうか確かめる
``open ssh``と入力

※configファイルがない場合
[.ssh/configの作成](https://qiita.com/0084ken/items/2e4e9ae44ec5e01328f1)

**3** . configファイルにアクセス
``cd ssh``
``sudo vi ssh_config``
パソコンのパスワードを入力

**4** .viエディタで編集
 
iキーを押す(INSERT = 文字を入力するためのコマンド)
一番下に以下のコードを追記
``Host 10.0.1.1 192.~.~.~
          KexAlgorithms +diffie-hellman-group1-sha1
Ciphers aes128-cbc``

※192.~.~.~の部分はEV3のIPアドレス

escキーを押す
``:``キーを押す
``wq``と入力(保存して終了するためのコマンド)
enterキーを押す

**5** .接続を確認
``ssh root@192.~.~.~``
※パスワードを聞かれるが入力の必要はない
成功したら↓のようになる
root@EV3:~# 

[参考記事]
[Lego EV3 Tutorial with leJOS on macOS](https://evthree.wordpress.com/home/2-exploring-lejos/)
[viコマンドの使い方](http://www.gi.ce.t.kyoto-u.ac.jp/user/susaki/command/vi.html)





#6.Eclipseの準備とプログラムの実行

とてもわかりやすいので、こちらを参考にしてください。
[【leJOS】mindstorm-EV3をJavaでプログラミングしよう【環境構築後編】](https://qiita.com/munro/items/0972e6f36676c61e3f57)


◯サンプルコードの例

```.java
//必要なコードをimportする
import lejos.hardware.*;

//クラスをつくる
public class HelloWorld
{
    //staticメソッドをつくる
    public static void main(String[] args)
    {
        //Hello World!!とev3の画面に出力する
        System.out.println("Hello World!!");
        //どれかのボタンが押されるまで待機する
        Button.waitForAnyPress();
    }
}
```



#最後に

読んでいただきありがとうございました。
次回は単一モータの制御について書いていきたいと思います。
間違っている場所や改善点などがありましたらご指摘のほどよろしくお願いいたします。
UWA GOT (Online) ユーザー定義Variantsとコードブロック診断のサポート

UWA GOTは**UWAが提供しているローカルパーフォマンス最適化ツールです。**Overview分析モードは開発者が直観的にソースコード内の性能ボトルネックを特定することができます。しかし、普段の性能改善の業務で、よくソースコードを部分的に診断したり、コードのCustom Variablesに対してモニタリングしたり、重要なロジックイベントに対してフィードバックしたりする必要があります。
このため、本ツールでCustom Code BlockとCustom Variablesの機能を提供しました。**本機能は開発者が任意のソースコードブロック（C#またはLua）に対して診断や追跡することができるようになったほか、プロジェクトのキーVariablesと重要パラメータに対してモニタリングすることもできます。**これにより、開発者が柔軟にソースコードのボトルネックのポジショニング、問題のフィードバックすることができ、データの過去履歴を使用して比較したり、プロジェクトのそれぞれのバージョンリリース時の安全性を確保します。

以下はCustom Code BlockとCustom Variablesの具体例です。

###一、Custom Code Block
プロジェクトのコード内、開発チームがUWA API PushSampleと PopSampleを使用して任意のCode Blockに対して切り取ることができます。
プロジェクトが実機でのテスト完了後、すぐUWA GOT Onlineで当該Code Blockの具体的なCPUコストを下図のように確認できます。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/4603669f-a457-d28c-d004-b6d30f17e681.png)
テーブルの任意の関数をクリックすれば、当該関数のテストでの具体的CPUコストを確認できます。また、開発者は違うバージョンでの変化も確認できます。随時これらの重要関数の性能トレンドのモニタリングできます。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/61dbc42e-2e57-ac1d-8aaf-52593914dd3d.png)

####使い方：
UWAEngineに自定義の関数タグを追加します。UWAEngineはPushSampleとPopSampleに対し、その間のCode BlockのCPUコストを統計します。

```ruby:
UWAEngine.PushSample/PopSample 
public static void PushSample(string sampleName); 
public static void PopSample();
```
パラメータ

```ruby:
sampleName 自定義の関数タグ
```
例

```ruby:
UWAEngine.PushSample(“MyCode”); 
// My Beautiful Code 
UWAEngine.PopSample();
```

###二、Custom Variables
プロジェクトのコード内、会社者がUWA APIのLogValueとAddMarkerを通じて、指定のマーカーと対応の数値を追加することによって、UWA GOT Onlineで追跡とモニタリングができます。現在，本機能は以下の４種類のVariablesのタイプをサポートしております。Int、Float、BoolとVector、詳細は下図参照。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/c0eda184-7dac-5a3f-c7c1-4c2a7a583f32.png)

####使い方：
UWAEngine.LogValue

```ruby:
public static void LogValue(string valueName, float value)； 
public static void LogValue(string valueName, int value)； 
public static void LogValue(string valueName, bool value)； 
public static void LogValue(string valueName, Vector3 value)；
```
パラメータ

```ruby:
valueName自定義のVariablesのマーカー
value   Variablesの値
```
例

```ruby:
UWAEngine.LogValue(“A Bool”, true); 
UWAEngine.LogValue(“A Int”, Time.frameCount); 
UWAEngine.LogValue(“A Float”, Time.deltaTime);  
UWAEngine.LogValue(“A Float”, new Vector3(1,1,1));
```
また、指定の関数がコールされた回数をモニタリングするため、AddMarker機能も提供しています。本機能は特にC#とLua間の切り替え状況をモニタリングするにはお勧めです。

####AddMarker 使用例：

```ruby:
Public static AddMarker(string marker);
```


UWA GOTはそれぞれのMarkerがフレームごとのAdd回数を統計します。本インタフェースはLuaが コールしたC# インタフェースの回数を統計します。例えば、SLuaのCode Generatorを修正し，自動的に各Wrap関数に対応のワードを追加します。下図参照：
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/85b4c583-ed26-f941-ceed-00a0f7f88221.png)
テスト後、下図のようなコスト統計とフレームごとの統計情報を確認できます。 
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/b235400f-382e-e6e1-e4a2-e9c42205394c.png)

---
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、**パフォーマンス分析**と**最適化ソリューション**及び**コンサルティングサービス**を提供している会社でございます。

UWA公式サイト：https://jp.uwa4d.com
UWA公式ブログ：https://blog.jp.uwa4d.com
Enviro+ Air Qualityを使ってみる

![Screen Shot 2020-08-28 at 20.10.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50780/1c1826aa-83ec-4c55-6163-3eea0544e3bd.png)

（随時加筆します）まずはインストール方法まで

Pimoroniの[Enviro pHAT](https://shop.pimoroni.com/products/enviro-phat)が終売になってしまっていたので、[Enviro+ Air Quality](https://shop.pimoroni.com/products/enviro?variant=31155658457171)を試してみました。こちらはまだ`pimoroni-dashboard`には含まれていないため、独自にインストーラを取得する必要があります。

以下は、Raspberry Pi OSがセットアップされネットワークにつながった状態を想定しています。ターミナルを起動して、以下のようにコマンドを実行します。

```bash
sudo apt install git -y  # gitがインストールされていない場合
git clone https://github.com/pimoroni/enviroplus-python
cd enviroplus-python
sudo ./install.sh
```

途中で、サンプルコードをインストールするか聞かれます。`y`を押して（インストールして）ください。再起動が必要な場合はそのように促されますので、再起動を実行してください。

```
sudo reboot
```

サンプルコードから適当なものを拾って実行して動作確認をすることが出来ます。PMセンサーは外付けが必要なのでそれ以外で試しましょう。例えば、`combined.py`を実行すると、組み込みのLCDに様々な計測値が表示されます。

```
cd Pimoroni/enviroplus/examples/
./combined.py 
```
CIO、CFO、CTO、CLO

応用情報技術者平成30年秋期 午前問74

CIOが経営から求められる役割はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/ef5dbb01-0041-e1e6-79f1-8d555c0ba79f.png)


１、CIO(Chief Information Officer)は、
経営戦略に沿った情報戦略やIT投資計画に関する責任を持つ役職である最高情報責任者のことです。CEO(最高経営責任者)やCOO(最高執行責任者)を補佐し、企業の情報戦略の策定に当たるのが主な職務となります。

CIOは情報戦略の責任者なので求められる役割は「ビジネス価値を最大化させるITサービス活用の促進」になります。

２、CFO(Chief Financial Officer，最高財務責任者)に求められる役割
企業経営のための財務戦略の立案と遂行

３、CTO(Chief Technical Officer，最高技術責任者)に求められる役割
企業の研究開発方針の立案と実施

４、CLO(Chief Legal Officer，最高法務責任者)に求められる役割
企業の法令遵守の体制の構築と運用

真ん中の文字：
I：Information
F：Fianncial
T:Technical
L:Legal
とのことですね。


参照：
https://www.fe-siken.com/kakomon/25_haru/q74.html#:~:text=CIO(Chief%20Information%20Officer)%E3%81%AF,%E8%B2%AC%E4%BB%BB%E8%80%85%E3%81%AE%E3%81%93%E3%81%A8%E3%81%A7%E3%81%99%E3%80%82&text=CIO%E3%81%AF%E6%83%85%E5%A0%B1%E6%88%A6%E7%95%A5%E3%81%AE,%E3%81%AE%E4%BF%83%E9%80%B2%E3%80%8D%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82
[vue-chart.js]グラフを削除する、再描画する

色々な理由でグラフを削除したり再描画したいニーズの時に試行錯誤したのでメモ

## やりたい事
`renderChart()` で表を描画した

```javascript
// Chart.vue
<script>
import { Line, mixins } from 'vue-chartjs'

export default {
  name: 'chart',
  extends: Line,
  props: ['chartData', 'graphOptions'],
  mounted() {
    this.renderChart(this.chartData, this.graphOptions)
  }
}
</script>
```

この表のデータやオプションを変えたので、再描画したい。

## 解決策

###### 1 reactivePropを使う
大体表を描画しなおしたい時は、データが変わった時。
Chart.jsでは、propsで受け取ったデータがリアクティブデータに対応できるようにmixinを用意してくれている。
propsで実装している場合は、この記述を追加する

```javascript
// Chart.vue
<script>
import { Line, mixins } from 'vue-chartjs'
const { reactiveProp } = mixins // 追加

export default {
  name: 'chart',
  extends: Line,
  props: ['chartData', 'graphOptions'],
  mixins: [reqctiveProp]
  mounted() {
    this.renderChart(this.chartData, this.graphOptions)
  }
}
</script>
```

###### 2 表を再描画する
ソースコードを見ればわかるが、グラフ作成時に宣言した `renderChart()` で2回目以降は既存の表を削除して再生成してくれる。

```javascript
      renderChart (data, options) {
        if (this.$data._chart) this.$data._chart.destroy() // ここですでにグラフあるなら消している
        if (!this.$refs.canvas) throw new Error('Please remove the <template></template> tags from your chart component. See https://vue-chartjs.org/guide/#vue-single-file-components')
        this.$data._chart = new Chart(
          this.$refs.canvas.getContext('2d'), {
            type: chartType,
            data: data,
            options: options,
            plugins: this.$data._plugins
          }
        )
      }
```

そのため、もう一度呼んであげれば問題ない。
もう一度呼ぶメソッドみたいなのを定義してあげて呼ぶなど。

```javascript
  methods: {
    reRenderChart() {
      this.renderChart(this.chartData, this.graphOptions)
    }
  }
```

> https://github.com/apertureless/vue-chartjs/blob/9bb5b511ba1eae92b053df28ed9ab7c54f176b82/src/BaseCharts.js#L70

###### 3 表を破棄する
本来、2で表は再描画されるのだがなぜか上手くいかなかったりする。
mixinしているため、中のソースコードは直接呼び出せるためグラフの実態を削除している `this.$data._chart.destroy()` も呼び出せるので直接呼び出す。（あまりいい方法ではなさそう）

```javascript
  this.$data._chart.destroy() // グラフを消す
  this.renderChart(this.chartData, this.graphOptions) // もう一度作る
```

今回キャンバスサイズを動的に変更したかったが、うまく再生成されないのでこの手段を取った。
チャットボット＝"チャット"と"ロボット"を組み合わせた言葉

応用情報技術者平成30年秋期 午前問72

顧客との接点として注目される，チャットボットの説明はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/263c9ffb-241e-3a60-d2c8-fe0c13b404d7.png)


１、チャットボットとは、"チャット"と"ロボット"を組み合わせた言葉で、相手からのメッセージに対してテキストや音声でリアルタイムに応答するようにプログラムされたソフトウェアです。利用者の問いかけを認識して最適な答えを判断するために、内部には人工知能の技術が使われています。

機械学習やAIの進化に伴ってチャットボットも進化しており、人件費の削減を図るためにECサイトやカスタマーサポートに活用されることが増えてきています。


２、エスクロ―サービスの説明　Escrow
インターネットオークションなどで，売り手と買い手の取引を安全に行うために，第三者の仲介業者が決済や商品の受渡しを行うサービスである。

不動産取引の場合には、エスクローサービスを提供する第三者は、売り手からは権利証書等を、買い手からは代金を寄託され、物件の確認、決済、登記、引渡しなどの業務に当たる。

※Escrow　条件付捺印証書


３、キャパシティ管理の説明
需要を予測してネットワーク設備やシステムリソースなどを計画的に調達し，需要の変動に応じて迅速にサービスを提供する考え方である。

キャパシティ管理は、ITシステムやITサービスに求められるリソース需要を予測・監視・評価して、それを満たすシステムリソースを提供できるように計画・調達・配備する活動である。一般にシステム需要には変動があり、それに適切に対応することがキャパシティ管理の役割である。

・一般にITの世界でキャパシティといった場合、CPUリソースやディスク容量、回線容量などを指すが、ITILのキャパシティ管理ではこれをリソースキャパシティと呼び、その管理を「リソースキャパシティ管理」（RCM）と位置付ける。


４、拡張現実(AR:Augmented Reality)の説明
スマートフォンのカメラなどを通して，利用者の視界に有用な情報を重ね合わせ，現実世界での行動や認知を支援する技術である。


参照：

https://www.ap-siken.com/kakomon/30_aki/q72.html
キャパシティ管理
https://www.itmedia.co.jp/im/articles/0912/22/news110.html
FuelPHPでcurlを使う

pure PHPでもcurlは使えますが、せっかくFuelPHPを使っているのであればFuePHPにあるクラスを使ってみたいという感じです。

まずはpure PHPで。

```curl.php
$curl = curl_init();//curlセッションを初期化
curl_setopt($curl, CURLOPT_POST, TRUE);//メソッドがPOSTの場合必要。GETなどならいらない
curl_setopt($curl, CURLOPT_URL, $url);//URLを指定
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);//POSTするデータ
curl_setopt($curl, CURLOPT_USERPWD, "$username:$password");//認証に必要なID、パスワード
$execute = curl_exec($curl);//実行
curl_close($curl);//curlセッションを閉じる
```

最低限ですがだいたいこんな感じになると思います。これをFuelPHPのRequest_Curlクラスで書いてみます。

```request_curl.php
$curl = \Request::forge($url, 'curl')//URLを指定
->set_method('post')//メソッドを指定
->set_params($post)//POSTするデータ
->set_option(CURLOPT_USERPWD, $username. ':' .$password)//認証に必要なID、パスワード
->execute();//実行
```

だいぶ見やすくなった気が、しますかね？

ドキュメント
PHP→https://www.php.net/manual/ja/ref.curl.php
FuelPHP→http://fuelphp.jp/docs/1.7/classes/request/curl.html
【Laravel】ログイン機能を追加するときに編集したファイル

###編集したファイル一覧
1. welcome.blade.php
標準で準備されているファイル

2. header.blade.php
自分で作ってたファイル
ヘッダーにAuthファサードを使って認証済かチェックするため
3. web.php
welcomeページのルーティングを削除してたので
4. header.css
ヘッダーに追加したユーザ名やログアウトリンクを追加したので、その見た目を整えるため


###welcome.blade.phpの編集
Laravelと表示されるので、自分のアプリ名が表示されるようにしたり、不要なリンクを非表示にしたり。

```php5:welcome.blade.php
<div class="title m-b-md">
    アプリ名に編集
</div>
<div class="links">
<a href="{{ route('login') }}">ログイン</a>
<a href="{{ route('register') }}">登録</a>

// Laravelの下に表示されていたリンクをコメントアウト
<!-- <a href="https://laravel.com/docs">Docs</a>
<a href="https://laracasts.com">Laracasts</a>
<a href="https://laravel-news.com">News</a>
<a href="https://blog.laravel.com">Blog</a>
<a href="https://nova.laravel.com">Nova</a>
<a href="https://forge.laravel.com">Forge</a>
<a href="https://vapor.laravel.com">Vapor</a>
<a href="https://github.com/laravel/laravel">GitHub</a> -->
</div>
```

###header.blade.phpの編集
ログイン済ならそのままページを読み込む
ログインせずにアクセスしてきたらログイン前の画面にリダイレクト

```php5:header.blade.php
@if(isset(Auth::user()->name)) // ログイン済なら
// ログインしたユーザ名を表示するために
{{ Auth::user()->name }}
// ログアウトするために
<a href"{{ route('logout') }}">ログアウト</a>
@else
<script>window.location = "/";</script>
@endif
```

###web.phpのチェック

route('/')はwelcomeページにいくようにする

```php5:web.php
Route::get('/', function () {
    return view('welcome');
});
```

プロジェクトを作成したら最初に消していることが多いかと。
とりあえずwelcomeページにログインや登録ボタンが生成されるので、それをそのまま利用できるようにするためです。


###header.css

ヘッダーにユーザ名とログアウトリンクを追加したので、見た目を整える。

単純にfloat:rightにしました。


###初心者はWelcomeページを残すと楽にログイン機能を実装できる！
でも勉強にはならない。

いろんなファイルが自動で生成されるので、
どのファイルで
どんな処理をして
どんな結果が返されているのか

という関係性がわかりにくいのがフレームワークの難しいところ。
Python から Octave スクリプトを呼ぶ  oct2py のメモ

# 背景

* Python での数値計算コードが合っているかどうか, Octave でリファレンスを記述して確かめたい.
* Octave での結果を Python 側に持ってきて matplotlib とかでプロットしたい.
* numpy/scipy では提供されていない関数 or Octave のほうが処理が早い関数を呼びたい.

Python から Octave スクリプトを呼ぶ oct2py があります.

https://blink1073.github.io/oct2py/

## インストール

```
pip install oct2py
```

でいけます. Pure python なので Windows でもそのままインストールできます.


Octave 側の svd 関数など呼ぶサンプル

https://blink1073.github.io/oct2py/source/demo.html

ありがとうございます.

## OctaveMagic

Jupyter notebook で, inline で magic コマンド(?)として Octave とインタラクトできます.

https://nbviewer.jupyter.org/github/blink1073/oct2py/blob/master/example/octavemagic_extension.ipynb?create=1

## 計算結果の比較

python と Octave での数値計算の結果を比較したい場合,

https://docs.scipy.org/doc/numpy-1.17.0/reference/routines.testing.html

`numpy.testing` あたりを使うのがよいでしょうか.