OmniAICreator/Qiita-1.07M huggingface dataset:
【MySQL】レコード中の改行を取り除く

# はじめに

DBのレコード中に改行が含まれていると、コンソール上で見た時に以下のようにずれて表示されてしまい、とても見づらくなります。

このようにコンソールで見る場合は「見づらい」だけで済みますが、改行が含まれるレコードをCSVとしてエクスポートした場合はCSVのフォーマットが崩れてしまうため、エクスポートした後に改行を取り除く処理を入れることになって手間がかかります。

```shell-session
mysql> SELECT id, name, note FROM nkojima.user;
+----+----------+----------------------------+
| id | name     | note                       |
+----+----------+----------------------------+
|  1 | nkojima  | Hello,world!               |
|  2 | nkojima2 | Hello,world!
 Hello,world! |
+----+----------+----------------------------+
2 rows in set (0.01 sec)
```

# 使用した環境

* OS
 * CentOS-7.7
* DB
 * MySQL-8.0.19

# 改行を取り除く方法

以下のように`REPLACE`関数を用いると、改行コードを除去した結果が簡単に得られます。
以下の例では改行コードを空文字と置き換えて単純に除去しただけですが、例えば`|`など他の文字に置き換えることも可能です。

また、「あるカラムの先頭もしくは末尾に改行コードがある」というケースであれば、代わりに`TRIM`関数を使うことも出来ると思いますが、汎用性が高い`REPLACE`関数を覚えておけば良いと思います。

```shell-session
mysql> SELECT id, name, REPLACE(note, '\n', '') FROM nkojima.user;
+----+----------+---------------------------+
| id | name     | REPLACE(note, '\n', '')   |
+----+----------+---------------------------+
|  1 | nkojima  | Hello,world!              |
|  2 | nkojima2 | Hello,world! Hello,world! |
+----+----------+---------------------------+
2 rows in set (0.00 sec)
```

# 参考URL

* [MySQL 5.6 - 12.5 文字列関数](https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_replace)
【初心者向けpython】最初はじゃんけんのプログラムを書こう

# じゃんけんしたいね
どうもこんにちは、突然ですがじゃんけんってとても奥深いと思いませんか？思いますよね？？？？ね？？？？？
# 日々じゃんけんに精進したい
私は一人ぼっちでドＭなのでそんな私にぴったりなコードをpythonで書きました。なるべく初心者にわかりやすいように簡単なコードにしています。条件分岐や変数を理解していればきっとこのコードを理解できます。

```python:zyanken.py
import random
#人間側の手を入力
whatyourhand = input("what your hand?")

#1:グー 2:チョキ 3:パー
if whatyourhand == "グー":
    userhand = 1

elif whatyourhand =="チョキ":
    userhand = 2

elif whatyourhand == "パー":
    userhand = 3

#userhand = 4 はグーチョキパー以外が入力されたとき
else:
    userhand = 4

cpuhand = random.randint(1,3)


if cpuhand == 1:
    returnhand = "グー"
elif cpuhand == 2:
    returnhand = "チョキ"
elif cpuhand == 3:
    returnhand = "パー"

status = (userhand - cpuhand + 2) % 3


#0:負け　1:勝ち　2:あいこ 基準は出した人
if status == 0:
    message = "あなたは負け犬です。惨めですね。"
elif status == 1:
    message = "機械相手に勝って何が楽しいんですか"
elif status == 2:
    message = "あいこ"


#userhandが4のときエラー文を出力してそれ以外のときに返答文を返す
if userhand == 4:
    finalreturn = "グー、チョキ、パーをカタカナで入力してね♡"
else:
    finalreturn = "私は"+returnhand+"をだしました"+ message

print(finalreturn)
```
# 簡単な解説
このコードはCPU側の手を
>random.randint(1,3)　　　

で生成しています。random.randint(1,3)というのは１から３の整数のうち（つまり1,2,3）無作為に１つの整数を選んで返す関数です。これによってCPU側がランダムな手を出すようにしていています（逆に言うと対人戦のような心理戦はできませんね）random関数をつかうにはrandomモジュールをインポートする実用があるため最初の行で
>import random

と宣言しています。よくわからないうちは
"randomを使うにはimport randomを最初に書く"
と覚えておいてください。

次は
>status = (userhand - cpuhand + 2) % 3

の部分です。ここは勝敗判定を行っています。ここは数学的思考が試されるのでぜひ考えてみてください。（ヒント：mod3の値で場合分け）
もし理解が難しいのであれば代わりにこのコードを埋め込んでみても同じ動作をします

```python3
if userhand == cpuhand:
    status = 2
elif userhand == 1 and cpuhand == 2:
    status = 1
else userhand == 1 and cpuhand == 3:
    status = 0
elif userhand == 2 and cpuhand == 1:
    status = 0
elif userhand == 2 and cpuhand == 3:
    status = 1
elif userhand == 3 and cpuhand == 1:
    status = 1
elif userhand == 3 and cpuhand == 2:
    status = 0
```
これがたったの一行で収まるというのは不思議ですね。考え方次第でいくらでも楽ができるのはコードを書く上でぜひ意識しておいてほしいです。もちろんこのコード以外にも様々な方法でじゃんけんのプログラミングを作成することができます。ぜひ一から自分自身で開発してみてください。きっと新たな発見や喜びが見いだせますよ
ruby 2.7.0 CSV の liberal_parsing オプションについて調査してみた

# 概要

Ruby標準ライブラリのCSVの挙動についてのまとめ。
[ruby 2.4.0 CSV の liberal_parsing オプションについて調査してみた](https://qiita.com/kasei-san/items/42df2f7364e95a66da33) のruby2.7.0バージョン。

# csvの仕様

rubyの標準ライブラリのCSVパーサーでは[RFC4180](https://www.ietf.org/rfc/rfc4180.txt)準拠のパースが行われる。
こちらの仕様では、コンマの直後と次のコンマの直前に`"`をおくことで、コンマを含んだ文字列を一つのフィールドとして扱うことができる。

```ruby
CSV.parse('a,"b,c",d')
=> [["a", "b,c", "d"]]
```

ダブルクオートを含む文字列を表すためには、もう一つのダブルクオートでエスケープする必要がある。

```ruby
CSV.parse('a,"b""c",d')
=> [["a", "b\"c", "d"]]
```


しかし、RFC4180はなかなか厳密な仕様で例えば `a,b"c,d` のような文字列は不正なcsvになり、例外が発生する。

```ruby
CSV.parse('a,b"c,d')      # CSV::MalformedCSVError (Illegal quoting in line 1.)
```

一方で上記のようなフォーマットは頻繁に出てきうるため、これを厳密にエラーにしていると取り扱いが難しい場合がある。そのために実用的なパースを行うための`liberal_parsing`というオプションがruby2.4.0から導入されている。
上記の記事ではruby2.4を使ってliberal_parsingの挙動について調査を行っているが、ruby2.7で確認したところ挙動が変わっていたところも多くあったのでここでまとめておく。全般的にruby2.7の方が挙動が直感的になっている。

# liberal_parsing のruby2.7での挙動

## ダブルクォートに囲まれたフィールドの場合

### 正しくエスケープされたダブルクォートの場合

```ruby
CSV.parse('a,"bb""b",c', liberal_parsing: true)
=> [["a", "bb\"b", "c"]]
```

### 文中にエスケープされていないダブルクォートがある場合

```ruby
CSV.parse('a,"bb"b",c', liberal_parsing: true)
=> [["a", "\"bb\"b\"", "c"]]
```

ruby2.4では例外は発生していた。

## ダブルクォートに囲まれていないフィールドの場合

### 途中にダブルクォートがある場合

```ruby
SV.parse('a,bb"b,c', liberal_parsing: true)
=> [["a", "bb\"b", "c"]]
```

### 途中にエスケープされたダブルクォートがある場合

```ruby
CSV.parse('a,bb""b,c', liberal_parsing: true)
=> [["a", "bb\"\"b", "c"]]
```

### 先頭にのみダブルクォートがある場合

```ruby
CSV.parse('a,"bbb,c', liberal_parsing: true)
# CSV::MalformedCSVError (Unclosed quoted field in line 1.)
```

ruby2.4と同様に例外。

### 先頭と途中にダブルクォートがあって、ダブルクォートの合計が偶数の場合

```ruby
CSV.parse('a,"bb"b,c', liberal_parsing: true)
=> [["a", "\"bb\"b", "c"]]
```

### 先頭と途中にダブルクォートがあって、ダブルクォートの合計が奇数の場合

```ruby
CSV.parse('a,"b"b"b,c', liberal_parsing: true)
=> [["a", "\"b\"b\"b", "c"]]
```

ruby2.4では例外が発生していたが、ruby2.7ではパースできるようになった。

### 末尾と途中にダブルクォートがある場合

```ruby
CSV.parse('a,bb"b",c', liberal_parsing: true)
=> [["a", "bb\"b\"", "c"]]
```

ruby2.4と同様にパースできる。
ActiveAdmin 画面遷移時にfilterのパラメーターをセットする

# 親要素から子要素に遷移する際, 親要素のidで絞りたい
これだけと何をいってるかわからないので

```
例)
Company : Shop = 1 : N のRelationの時,

Companyの画面から, Shopの一覧画面へ遷移する時,
そのままではデータが大きすぎるので,
最初からShopを外部キーのCompany_Idで絞っておきたい

```


```
  # カスタム アクション
  # 一度変数に入れないと, エスケープされずエラーとなる
  query = "q[company_id_equals]"
  action_item :my_button1, only: :show do
    link_to "店舗の一覧に遷移する", active_admin_shops_path({query => company.id})
  end
```

これだけで遷移と同時にfilterがかかります.
調べても載っておらず, 尚且つ需要があると思うので書きました.
Excel VBAでマウスでポチポチと選択できる表を作る

#概要
クリックやドラッグで選択してるっぽく見える表をマクロで作る。
見えるだけで内部で何かデータを保持するわけではない。

![select.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369392/e241a668-e153-291c-13d5-547fa73045c4.jpeg)

#コード
```vb:Sheet1
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Const ROW_START As Long = 3         '表のデータが始まる行
    Const COL_START As Long = 2         '     "      始まる列
    Const COL_END As Long = 4           '     "      終わる列
    Const COLOR_OFF As Long = &HFFFFFF  '非選択状態のセルの色
    Const COLOR_ON As Long = 14083324   '選択状態のセルの色
    Const COL_SELECT As Long = 2        '選択状態かどうかの値を入れる列
    Const COL_TARGET As Long = 3        '最終行を取得するための列
    
    '表の外なら何もせずに終了
    If Target.Row + Target.Rows.Count - 1 < ROW_START Then Exit Sub
    If Target.Column + Target.Columns.Count - 1 < COL_START Then Exit Sub
    If COL_END < Target.Column Then Exit Sub
    
    With Sheet1
        '表の最終行より下なら終了
        Dim lr As Long
        lr = .Cells(.Rows.Count, COL_TARGET).End(xlUp).Row
        If Target.Row > lr Then Exit Sub
        
        '反転させる行を特定
        Dim sr As Long
        Dim er As Long
        sr = WorksheetFunction.Max(Target.Row, ROW_START)
        er = WorksheetFunction.Min(Target.Row + Target.Rows.Count - 1, lr)
            
        '反転
        If .Cells(sr, COL_TARGET).Interior.Color <> COLOR_OFF Then
            .Range(.Cells(sr, COL_START), .Cells(er, COL_END)).Interior.Color = COLOR_OFF
            .Range(.Cells(sr, COL_SELECT), .Cells(er, COL_SELECT)).Value = ""
        Else
            .Range(.Cells(sr, COL_START), .Cells(er, COL_END)).Interior.Color = COLOR_ON
            .Range(.Cells(sr, COL_SELECT), .Cells(er, COL_SELECT)).Value = "v"
        End If
    End With
End Sub
```

#その他
名簿とかからGUIな感じで選択してもらう時にちょうどいい。
添付写真の「選択」列は、フォントを"Magneto"にして「v」をチェックマークっぽく見えるように一工夫。
WordPressのアイキャッチでlazysizesを使用する

# はじめに
[PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/?hl=JA)でwebサイトのスピードチェック・改善点探しをする人も多いと思います。

その中の改善できる項目で「オフスクリーン画像の遅延読み込み」というのがありまして、WordPressのプラグインを使う方が多いと思います。
が、「[lazysizes](https://github.com/aFarkas/lazysizes)」という画像遅延読み込みのjsのライブラリを使う方もいると思いますので、アイキャッチで画像遅延読み込みを適用する方法を書いておきます。


## lazysizesの使い方
1. jsのライブラリを読み込む
2. 画像のclassに`lazyload`をつける
3. 画像のパスは`data-src="sample.png"`にする

# 方法
## アイキャッチ画像を取得するときに、lazyloadクラスをつける

```php
$thumbnailAttr = [
    'class' => 'lazyload',
    'alt' => 'サンプルです',
];
$thumbnailTag = get_the_post_thumbnail($post_id, [160, 84], $thumbnailAttr);

echo $thumbnailTag;

```

[get_the_post_thumbnail](https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/get_the_post_thumbnail)


## hookを利用して、出力されるsrcをsrc-dataに置き換える
```php
add_filter( 'post_thumbnail_html', 'my_post_image_html', 10, 3 );

function my_post_image_html( $html, $post_id, $post_image_id ) {

    //遅延読み込み対象の画像のみ
    if(strpos($html, 'lazyload') === false) {
        return $html;
    }

    //srcをdata-srcに置換する
    $html = str_replace('src="', 'data-src="', $html);
    return $html;
}

```

[post_thumbnail_html](https://developer.wordpress.org/reference/hooks/post_thumbnail_html/)
【ARKit】.scnファイル用のアセットフォルダを作成

#はじめに
以下の記事を参考にARKit上に3Dモデルを表示するテストをしていたのですが、表題の件で詰まったので備忘録として。

- [【ARKit入門】Xcodeに3Dファイルを入れてみる](https://qiita.com/yyokii/items/667998a28d46b93fb1e3)

#実行環境
- Xcode 11.2.1
- Projectは、Single View App として作成

#.scnファイル用のアセットフォルダって何？
> .scnファイルを入れるためのアセットフォルダ作成します。

とあり、これはどうやって作るのかがわからなくていろいろ調べたところ「SceneKit Catalog」のことで、[Appleの公式ドキュメント](https://developer.apple.com/documentation/scenekit/scnscenesource)に書いてありました。

> For best results, place scene files that ship in your app bundle in a folder with the .scnassets extension, and place image files referenced as textures from those scenes in an Asset Catalog. 

> （訳）最良の結果を得るには、アプリバンドルに含まれるシーンファイルを.scnassets拡張子を持つフォルダーに配置し、それらのシーンからテクスチャとして参照される画像ファイルをアセットカタログに配置します。

#.scnassetsの作り方
- File＞New＞File... を選択する。
![cap01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106624/df66401e-5e68-1157-971e-ff74b3eec701.png)

- Resouce の中にある SceneKit Catalog を選択して Next を押す。
![cap02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106624/754fefcd-144e-263d-b5c2-ece9a9b81c6d.png)

- 名前をつけて保存（ここでは art.scnassets としました）する。
![cap03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106624/800cbc89-6a85-8679-eba1-3b24e36a8e1a.png)

- できたフォルダ（art.scnassets）を選択した状態で、下のように表示されていればOK。
![cap04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106624/89a6bd6d-f3d3-90c8-af38-fdc9279b3630.png)

# ちなみに
新規Projectを作るときに、Gameを選択して Game Techinology：SceneKitを選択した場合は、最初から art.scnassets が作成されて飛行機のモデルのシーン（ship.scn）とそのテクスチャ（texture.png）が入っています。
![cap05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106624/7d04704b-d714-cd5e-0c76-49cac1628ac5.png)
![cap06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106624/3eaaffea-7b3b-fe1a-bf43-da58585d6baf.png)
![cap07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106624/918a2189-9c64-0092-2696-ea16943cf792.png)

# まとめ
ARKit、ほぼ初めてなので、いろいろわからないこと多いです。ちょっとずつ試してみる予定です。

以下の記事も参考になりました。ありがとうございます。

- [【ARKit】拡張現実テンプレートを再現する](https://qiita.com/chino_tweet/items/7f7b305ddfdc551134b7)
RaspberryPiで取得するセンサデータのノイズ低減

## Wi-Fiモジュールはセンサデータにノイズを発生させる
    
* RaspberryPiでWi-FiをONにした状態でGPIO経由でセンサデータを取得する際，周期的な（約60秒間隔）ノイズが乗る
* Wi-FiをOFFにすることでこのノイズはおおよそカットできる 
 * ```sudo iwconfig wlan0 txpower off```
 
### ただし．．．
* Wi-Fiが使えないのでsshは有線LANで行う必要がある
* もしくは，Wi-Fiの出力を抑えることによってノイズを低減させる（多少ましになる程度）
 

**このページではRaspberryPiでWi-Fiの出力レベルを設定する方法を紹介する** 
 
 
まずは対象のラズパイにsshして以下を実行 

```
sudo iwconfig wlan0
```

すると以下のような情報が表示される 

```
wlan0     IEEE 802.11  ESSID:"hogehoge"
          Mode:Managed  Frequency:5.18 GHz  Access Point: 3G:3G:CG:EG:9G:9G
          Bit Rate=24 Mb/s  Tx-Power=31 dBm
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:on
          Link Quality=57/70  Signal level=-53 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0
```
 
3行目のTx-Power=31 dBmが出力を表している． 
この31(最大値)という数値を以下のように実行するとかぎりなく弱い出力（0 dBm）にできる．

```
sudo iwconfig wlan0 txpower 0
```
 
txpowerの次の数値を変更することで任意の強さに設定可能 

デフォルトはauto

```
sudo iwconfig wlan0 txpower auto
```
【GCP】 データストアをちょっぴり勉強しよう

## 仕組み

- Kinds
  - Entities
     - Properties

:mortar_board: **Full Indexing**
- Built-in: 各プロパティー、各エンティティ
- Composite: 複数のプロパティで構成される複合インデクス
注意：自動的に複数のプロパティ値を持つエンティティを書き込むと、インデックス爆発が発生するので手動的にインデックスを設定

### 特徴

- Keysで検索すると早い
- 実行時間の依存はデータセットのサイズではなくりリターンデータのサイズ（データセットは10行数と10億行数でも5行数結果ならば実行時間は同じ）
- 事実上あらゆるサイズにスケーリングと効率が高い

:bulb: 【干し草の山の針】こんなアプリケーションタイプにこれを考える (needle in a haystack)


### 欠点
- Updateが遅い
- JOINできない

## Cases
### データ対象
- Document database
  - Hierarchical（XML, HTML）
- NoSQL
  - Key-value 構造

### データ対象外
- OLTP (Online Transaction Processing)：トランザクション処理用（RDBMSを考え）
- OLAP (Online Analytical Processing)：データ分析処理用（BigQueryを考え）
- Non-HierarchicalとUn-Structuredデータ（BigTableを考え）
- immutable blobs（Cloud Storageを考え）
- カラムキーは書き込み、書き直しのが多い

## 比較
### vs. 伝統的なRDBMS

|項目| RDBMS|DataStore|
|:-----------------|:-----------------|:------------------|
|トランザクション|自動的|同じ|
|インデックスを使うクエリ|有り|全て|
|実行時間の依存|データセットのサイズと結果データのサイズ|結果データのサイズのみ| 
|データ構造|リレーションデータ|階層型データ（XML、HTML）|
|オブジェクトのカテゴリ|種類（Kinds）の異なるエンティティ（HTML tags）|テーブル|
|オブジェクト単体|行（Rows）|エンティティ（Entities）|
|オブジェクトの個々のデータ|列（Cols）|プロパティー（Properties）|
|単体|各Row、同じプロパティー|各Entity、異なれるプロパティー|
|個々|各Col、同じタイプ|同じプロパティー名で異なれるタイプ|
|クエリ|JOINが多い、サーブクエリにフィルターあり、複数の不等式フィルターができ|JOINがない、サーブクエリにフィルターなし、－つ 不等式フィルターのみ|

## 関連記事
[All about indexes of datastore](https://cloud.google.com/datastore/docs/concepts/indexes?hl=ja)
[Using App Engine APIs with Datastore](https://cloud.google.com/appengine/docs/standard/java/datastore/)

ま～　また続きますね！！！
SSHが切れても実行中のプロセスを生かし続ける（nohup コマンド）

### SSHして外部からラズパイ内部でたたいたコマンドは実行中にSSHが切断されると終了する
SSHしているラズパイで，時間のかかるプロセスをSSHもと（PCのTeraTermのコンソールとか）から実行中にSSHが切れてしまうと，ラズパイがローカルだけで実行できるプログラムであっても実行していたプロセスが終了してしまう．
  * 例：ラズパイのローカルのみで完結する，1時間回し続けるプログラムをSSHで実行していたが，ネットワークが不安定だったため，実行中にSSHが途絶えた．途絶えた時点でラズパイの中のプロセスも終了した

### でも実験のデータは確実にとりたいのでネットワークが切れてもラズパイ内部ではプログラムを実行し続けてほしい
sshが何らかの理由で途絶えたとしてもラズパイ側で動いているプロセスを生きてほしい．

そんな時は **`nohup`** コマンドを使う.
  * 記号なしリストnohupコマンドは実行したいコマンドの前につけることでその実行によって動くプロセスはSSHもとのアクションを受け付けなくなる（SSHが切れても終了しなくなる）
  * 当然Ctrl＋Cなどでの強制終了も効かなくなるため，`kill`コマンドでプロセスを直接殺す必要がある
  * 標準出力もキャンセルされてしまうため，実行中のプログラムの動作状況は確認しづらい
    * 例えば，`nohup ls`と実行しても何も表示されない
    * 実行中はそのコンソールには何も出力されないのでコマンドは末尾に`&`を付けてバックグラウンドで実行することを強くお勧めする
    * 標準出力はnohup.outというファイルの中に書き込まれている
    * プログラムの実行中は`tail nohup.out`などを実行して出力状況を確認することができる

例：```$ nohup python3 hogehoge.py &```

プログラムを停止させるときは`ps -x`コマンドでプロセスを確認

```
$ ps -x

  PID TTY      STAT   TIME COMMAND
  508 ?        Ss     0:00 /lib/systemd/systemd --user
  511 ?        S      0:00 (sd-pam)
  516 ?        Ssl    0:16 /usr/bin/lxsession -s LXDE-pi -e LXDE
  525 ?        Ss     0:00 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation
  566 ?        Ss     0:04 /usr/bin/ssh-agent x-session-manager
  573 ?        Ssl    0:00 /usr/lib/gvfs/gvfsd
  578 ?        Sl     0:00 /usr/lib/gvfs/gvfsd-fuse /run/user/1000/gvfs -f -o big_writes
  588 ?        S      0:01 openbox --config-file /home/pi/.config/openbox/lxde-pi-rc.xml
  591 ?        Sl     0:00 lxpolkit
  599 ?        Sl    62:18 lxpanel --profile LXDE-pi
  601 ?        Sl     0:03 pcmanfm --desktop --profile LXDE-pi
  629 ?        Ss     0:00 /usr/bin/ssh-agent -s
  658 ?        S      0:07 /usr/bin/vncserverui service 15
  672 ?        S      0:01 /usr/bin/vncserverui -statusicon 7
  675 ?        Ssl    0:00 /usr/lib/menu-cache/menu-cached /run/user/1000/menu-cached-:0
  683 ?        Z      0:00 [sh] <defunct>
  691 ?        Ssl    0:00 /usr/lib/gvfs/gvfs-udisks2-volume-monitor
  701 ?        Ssl    0:00 /usr/lib/gvfs/gvfs-mtp-volume-monitor
  705 ?        Ssl    0:00 /usr/lib/gvfs/gvfs-gphoto2-volume-monitor
  709 ?        Ssl    0:00 /usr/lib/gvfs/gvfs-goa-volume-monitor
  713 ?        Ssl    0:00 /usr/lib/gvfs/gvfs-afc-volume-monitor
  751 ?        Sl     0:00 /usr/lib/gvfs/gvfsd-trash --spawner :1.4 /org/gtk/gvfs/exec_spaw/0
 1300 ?        S      0:14 sshd: pi@pts/0
 1303 pts/0    Ss     0:00 -bash
 1834 ?        S      0:00 sshd: pi@pts/2
 1837 pts/2    Ss     0:00 -bash
 1952 pts/0    R+     0:30 python3 hogehoge.py  //該当のプロセス
 1953 pts/2    R+     0:00 ps -x
17807 ?        Sl     0:24 lxterminal
17808 ?        S      0:00 gnome-pty-helper
17809 pts/1    Ss+    0:00 bash
24536 ?        S      0:02 sshd: pi@notty
24538 ?        Ss     0:00 /usr/lib/openssh/sftp-server
```

該当のプロセスのプロセスID（PID）を指定してプロセスを削除する

```
kill 1952
```
[やってみた]Jetson nano インストール編

# OSイメージ(JetCard)のダウンロード
[NVIDIA JetCard GitHubリポジトリ](https://github.com/NVIDIA-AI-IOT/jetcard)へアクセス

「README.md」内にある「Option 1 - Download JetCard Directly」の「jetcard v0p0p0.img」のリンクをクリック

GoogleDriveが表示されるので「ダウンロード」をクリック

# MicroSDへの書き込み

balenaEtcherを起動し、ダウンロードしたイメージファイルをMicroSDへ書き込む

# 起動

Jetson Nanoにキーボード、マウス、HDMIケーブルを接続。
MicroSDスロットにOSを書き込んだMicroSDカードを差し込む。
MicroUSBケーブルを接続し電源投入。
※電圧が不足しているとブートシークエンス途中で電源が落ちる(グリーンLEDが消灯する)

デフォルトパスワード「jetson」でログイン

# ネットワーク接続 

Jetson NanoにWiFiドングルを挿す。
Terminalを起動。
以下のコマンドを実行

```
$ sudo nmcli device wifi list
[sudo] password for jetson:
```

使用するWiFiに接続

```
$ sudo nmcli device wifi connect <ssid_name> password <password>
```

接続完了後、IPアドレスを確認

```
$ ifconfig
```

# 接続確認

## ssh接続

作業PCからTeraTerm等でssh接続

## JupyterNotebook接続
ブラウザより以下のアドレスに接続
http://xxx.xxx.xxx.xxx:8888/

デフォルトパスワード「jetson」でログイン

# VNCの導入

## インストールと起動

```
$ sudo apt update
$ sudo apt install tigervnc-standalone-server tigervnc-scraping-server
$ vncpasswd
Password:
Verify:
Would you like to enter a view-only password (y/n)? n

$ x0vncserver -display :0 -passwordfile ~/.vnc/passwd &
```
## 接続
Chromeの拡張機能「[VNC Viewer for Google Chrome](https://chrome.google.com/webstore/detail/vnc%C2%AE-viewer-for-google-ch/iabmpiboiopbgfabjmgeedhcmjenhbla/related?hl=en)」を使用

※アプリ版VNC Viewerでも接続可能だが、改造後が低い？

## サービス化
サービス用ファイルの作成

```
$ sudo vi /etc/systemd/system/x0vncserver.service

[Unit]
Description=Remote desktop service (VNC)
After=syslog.target
After=network.target remote-fs.target nss-lookup.target
After=x11-common.service

[Service]
Type=forking
User=jetson
Group=jetson
WorkingDirectory=/home/jetson
ExecStart=/bin/sh -c 'sleep 10 && /usr/bin/x0vncserver -display :0  -rfbport 5900 -passwordfile /home/jetson/.vnc/passwd &'

[Install]
WantedBy=multi-user.target
```

手動起動で確認

```
$ sudo systemctl start x0vncserver.service
$ sudo systemctl status x0vncserver.service
```

自動起動設定

```
$ sudo systemctl enable x0vncserver.service 
```
【質問】C#について

初心者過ぎる私ですが、教えていただきたいことがございます。
超初歩的な質問なのですが、コードを描いたのですがエラーの解決が出来ません。
どうかご教示頂けませんでしょうか？
よろしくお願い致します。
//rows => 行、cells => 列
                    dgv.Rows[rowNo].Cells[1].Value = reader[0];
                    dgv.Rows[rowNo].Cells[2].Value = reader[1];
                    dgv.Rows[rowNo].Cells[3].Value = reader[2];
                    dgv.Rows[rowNo].Cells[5].Value = reader[3];
                    dgv.Rows[rowNo].Cells[6].Value = reader[4];
                    dgv.Rows[rowNo].Cells[7].Value = reader[5];

                    DateTime dt1 = dgv.Rows[0].Cells[3].Value.();
                    DateTime dt2 = DateTime.Now;
                    TimeSpan ts2 = dt1 - dt2;
                    dgv.Rows[rowNo].Cells[4].Value = ts2;

DateTime dt1 = dgv.Rows[0].Cells[3].Value.();の部分ですが、
上記に記載のdgvの3列めの値を使いたいのですが上手く思いつきません。
お願い致します。
共通のフィールド名がある構造体同士でのコピー

共通のフィールド名があるが、同じでは無い構造体から構造体への、フィールド値のコピーサンプル

```go
/**
reflectを使用して、同じ名前、同じ型のフィールドに値をコピーするサンプル
*/
package main

import (
	"fmt"
	"reflect"
)

// 型のエイリアスを使っている場合でも通る
type UID int64

type Test1 struct {
	Id          UID
	Name        string
	Age         int
	Affiliation string
}
type Test2 struct {
	Id      UID
	Name    string
	Age     int
	Company string
}

func main() {

	st1 := Test1{128, "Bob", 1234, "製造"}

	v1 := reflect.ValueOf(st1)
	t1 := v1.Type()

	st2 := Test2{}
	v2 := reflect.ValueOf(&st2)

	for i := 0; i < t1.NumField(); i++ {
		// フィールド名
		name := t1.Field(i).Name
		// 値
		field := v1.Field(i)
		value := field.Interface()

		v := v2.Elem().FieldByName(name)
		if v.IsValid() {
			fmt.Printf("name=%s, type=%s, value=%#v\n", name, v.Type(), value)
			// コピー元と先の型が違うと、ここで落ちる
			v.Set(field)
		} else {
			// コピー先に同じ名前のフィールドが無かったので取得出来なかった場合
			fmt.Printf("no field[name=%s] found.\n", name)
		}
	}
	fmt.Printf("st2=%+v\n", st2)
}
```
＃あとで書く【Unity×VR】個人的ベストプラクティス & ワークアラウンド集【2019年度版】

`今月中に新しいプロジェクトを動かすので，そのときに逐次更新`

# ◥◤ 環境構築＠ハードウェア

- 開発用PCおよびVR機器等は，2セット用意すると良い．故障時のスペアとして，また，検証実験を平行して行う際に良い．そして何よりも，在宅作業用と学校作業用をそれぞれ用意することで，持ち運びの労力が大幅に省けるというメリットがある．

- 大量のデータを扱う上に，技術情報を調べながらの開発だと，ブラウザが開くタブが100を超えることも多々あるため，メモリを盛っておく．休止モードはメモリの中身をストレージに書き込むため，ストレージの空き容量も十分確保しておく．バックアップ用のストレージも忘れずに．

- 周辺機器もきちんと揃えておこう．まず外付けのPCクーラーは必須である．VR用PCだからと油断しているとOSごと焦げる．また，PCの画面は最低でも2枚ほしい．大量のログやエラーをさばくうえで，画面の狭さは致命傷となり得る．キーボードとマウスは無線のものが良い．設置位置が自由であれば，長時間の作業でも，肩・背中・目などへの疲労を軽減できる．

- 機器が上手く動かない場合，ソフトウェアの設定ミス等だけでなく，ハードウェアの初期不良，経年劣化も疑うと良い．コネクターを純正品から別の既製品に変えたら正常に動作した，ということもあった．コネクターを買い足す場合には，端子の両端の規格を確認しておこう．普段見ないような組み合わせになっていることもある．

関連記事：
突撃！在宅の開発環境 2020年春 - Mobile Factory Tech Blog
https://tech.mobilefactory.jp/entry/2020/03/05/100000

# ◥◤ 環境構築＠ソフトウェア

## VR機器との連携

- 今回の構成は，UnityでVR環境を構築し，SteamVRを経由してOpenXR規格で，VR機器と連携，とした．実装開始時点で，容易にマルチデバイス対応可能な方法はこれくらいしかなかったが，現時点ではそうでもない．構成は適宜検討されよ．

## エディタのカスタマイズ

- Unityエディタは画面構成をカスタマイズできる．著者はディスプレイが1枚なら図 19上のように，ディスプレイが2枚なら図 19下のようにしている．ポイントはヒエラルキーウィンドウとインスペクターウィンドウを隣接させていること，そしてコンソールウィンドウができるだけよく見えるようにしているところである．特に，コンソールウィンドウは様々なログやエラーが表示される，「ヒントウィンドウ」でもある．常にその全体が視界に入るようにしておけば，問題解決のスピードも上がる．スペースに余裕があるのなら，図 19下のように，セカンドディスプレイいっぱいに表示すると良い．

## そのほか

- GPU周りは意外によく不調になる．とりあえず公式のツールを使うなどして，ドライバー等のアップデートをしておく．なお，Unityエディタのアップデートは．少し慎重になった方が良い．まれに仕様への破壊的変更が行われるため，作業中のプロジェクトをフォルダごと複製したものを，新しいバージョンで開いて，一通りの作業が問題なくできるか検証すべきかもしれない．特に，Previewの機能は注意されたし．筆者の環境ではGPUを用いたベイクが2019.3から機能不全になっている．

# ◥◤ レベルデザイン

## レベルデザインとは

## Prefab
- NestedとVariant
- どうネストする？

ギズモの表示
ピボット

## エディタ拡張の利用
- ProGrids
- 自作拡張，ショートカット

## 小話
- トイレで寿命が縮んだ話

## 命名規則とヒエラルキーウィンドウによる検索絞り込み

cf.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253921/fcb70f1d-5486-ca41-c7c7-64cb4a1b05cb.png)
AA
aa
AA
...the order depending on modified time, its name length, and its character order in unity.

# ◥◤ ライティングそしてベイク

## 各種ベイクの設定方法と注意点

設定
static
影投影，クリッピング
アリアライト，えみっしぶ

# ◥◤ スクリプティング

## ライフサイクル
## 物理挙動・衝突/接触判定
- ライフサイクルを踏まえる
- レイヤーを分ける

## SteamVR Plugin周りの扱い

## 小話
- Staticの怪

## VRにもテストを
- Prefabで元に戻せる．あるいはシーンを分けて

# ◥◤ VR体験実施時の配慮など
フロントエンド周りの便利ツール

今回は何個かフロントエンド開発で使う便利ツールを紹介したいと思います。

## 1.chromeの拡張機能「Responsive Viewer」
まず最初に紹介するのはchromeの拡張機能のResponsive Viewerです。
こちらの拡張機能では任意のURLを叩けば各デバイスを一覧で一斉に表示してくれます。
なので、レスポンシブの開発の時に非常に役に立つと思います。(レスポンシブでなくても役立つ)

<img width="1437" alt="スクリーンショット_2020-02-19_14_18_06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163415/575a2e13-8792-bd85-7c84-fa301f443f93.png">

使い方も簡単なのでおすすめです。

参考: https://chrome.google.com/webstore/detail/responsive-viewer/inmopeiepgfljkpkidclfgbgbmfcennb/related

## 2.chromeの拡張機能「PerfectPixel」
次に紹介するのはコーダーやフロントエンドの人には結構必須かもしれないです。
こちらもchromeの拡張機能のPerfectPixelです。
こちらはjpgかpngかを選択するとブラウザ上に指定した画像が出て
実際に作成している製作物に合わせることができます。

<img width="1435" alt="スクリーンショット_2020-02-19_14_34_37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163415/2409e5cb-70d3-1ef0-49c0-2b89def5c065.png">

上記の画像は適当なスクショを撮ってやっていますが、実際はデザイナーや自分で作ったjpgかpngのカンプなどを使ってください。

画像の透過率ももちろん変えられるし、ドラッグして画像の位置を移動、操作パネルから画像の位置を移動もできるので是非使ってみてください。

参考: https://chrome.google.com/webstore/detail/perfectpixel-by-welldonec/dkaagdgjmgdmbnecmcefdhjekcoceebi/related?hl=ja

## 3.vscodeの拡張機能「Live Server」
参考: https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer

3つ目はvscodeの拡張機能のLive Serverを紹介したいと思います。
こちらは環境構築をしなくても編集中、作成中のプロジェクトを確認できる優れものです！
nginx周りの設定とか結構時間取られたりするので軽いプロジェクトならこれでやってしまいます。

使い方も簡単でvscodeでLive Serverをインストールしてください。

<img width="592" alt="スクリーンショット 2020-02-19 14.43.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163415/cb690b85-57c8-be90-092f-441a74ff1de0.png">
こんな感じで検索すれば出てくるはずなので、出てきたらinstallのボタンを押してください。
そうするとエディターの右下に
<img width="416" alt="スクリーンショット 2020-02-19 14.44.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163415/86d4a17c-7a38-0d07-4aa1-5846acdb2e4f.png">
Go Liveというとこが出てくるのでそれを押すと勝手にブラウザを開いて該当のファイルを確認できます。


## まとめ
他にも便利ツールはたくさんあると思うのでみなさんよかったら教えてください。
TensorFlowとEdge TPUによる犬の訓練

GoogleのTensorFlowLite（およびEdgeTPU）を使用すると、イヌを自律的に訓練して、座ったり、横になったり、固定したり、呼び出したりするなど、さまざまな行動に応答させることができます。 これにより、すべての犬が低コストで訓練され、犬の生活が豊かになり、経済的にストレスの多い救助ステーションと低い採用率にプラスの影響がもたらされると考えています。 Google EdgeTPUを使用すると、犬がデバイスとやり取りするときの動作を理解し、学習できます。

##### TensorFlowで動物を理解する
同様に、犬の訓練は、犬が放つ信号と行動をよく理解することに焦点を当てています。

TPUが知覚問題の解決にどのように役立つかを理解するには、犬のハンドラーが犬の行動を理解する上で重要だと考える情報を理解する必要があります。以下は、犬の訓練中に犬の飼い主が尋ねる質問です。

![alt](https://pic.pimg.tw/bakenico/1582085266-4090925355_n.jpg)

犬はおやつを食べていますか？
犬は「座る」アクションを実行していますか？
犬はすでに「横になっている」コマンドを知っていますか？
犬は以前に訓練されたことがありますか？
環境の犬は一般的にどこに滞在することを選択しますか？
犬は私からどのくらい離れていますか？
犬は私を追いかけていますか？

これらの質問に答えるために、機械学習、より具体的にはディープラーニングの使用を選択しました。 ディープラーニングは、これらの人間の知覚に関連する問題を解決するのに優れており、時間の経過とともに関連する行動パターンを探します。 したがって、ディープラーニングはコンピュータービジョンや自然言語処理の分野でも広く使用されています。

次に、すべてのシグナルを収集し、興味のあるものを見つけます。 私たちの動物行動チームは、犬の訓練に対する準備を理解するために収集したいすべての体のポーズと音をリストしました。

強力なコンピュータービジョンニューラルネットワークをトレーニングするために、TensorFlowを深層学習プラットフォームとして使用することにしました。 同じタスクで、GoogleのクラウドTPUを使用してネットワークをトレーニングする方が、複数のGPUを使用するよりも速くて安価です。 次に、デスクトップデバイスを使用してGPUでトレーニング済みモデルをローカルで実行し、犬のリアルタイムの動作を判断してトレーニングできます。 私たちのモデルは、犬のボディーランゲージと音を分析することにより、犬の現在の状態を理解し、相互作用します。

犬の行動をリアルタイムで理解して対応するために、ニューラルネットワークをサポートするのに必要な計算能力を備えた適切なモバイルプラットフォームを探しています。 いくつかのモバイルプラットフォームを評価した後、TensorFlowのモバイル製品TensorFlow Liteを実行できるGoogleのEdgeTPUを選択しました。 モバイルコンピュータビジョンモデルはGoogle EdgeTPUでも利用可能であり、以前のシステムよりも4倍高速に動作することがわかりました。

記事の全文を参照してください： https://blog.tensorflow.org/2020/01/autonomous-dog-training-with-companion.html

![微信图片_20200217114340.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/fdd7ddd8-a30c-3eb1-7117-a188ce8200df.jpeg)

Google Edge TPU 海外代理店：https://store.gravitylink.com/global
Gravitylinkで任意の製品を購入すると、50以上のMLモデルを取得し、学習ツールを無料で移行できます
【Git】git branch -a - ローカル＆リモートブランチ一覧を表示する

【Git】git branch -a - ローカル＆リモートブランチ一覧を表示する

###git branch -a
ローカル＆リモートブランチ一覧を表示する

~~~:git
$ git branch -a
~~~

作業ブランチの履歴ずらっと出てきます
（まだブランチを切ったことがない人は少しだけ）

例：
*BRANCH_A,BRANCH_B,・・・,BRANCH_Z

BRANCH_Aにいる時

コマンド 

~~~:git[command]
git branch -a
~~~ 
*ブランチの一覧がみれるコマンド

ログ

~~~:git[log]
  develop
* feature/BRANCH_A
  feature/BRANCH_B
  .
  .
  .
  feature/BRANCH_X
~~~
* 今いるブランチを表します。場合によっては色分けされている場合があります。
　↓　を押していくと進みます。

~~~:git[command]
git branch -a
~~~ 
これを押すと git[log] が表示されるので復帰の方法は、

~~~:git[log]
  develop
* feature/BRANCH_A
  feature/BRANCH_B
  .
  .
  .
  feature/BRANCH_X
:｜←カーソルがここにきてる状態
~~~ 
上記のカーソルがここにきてる状態で、キーボード「q」を押すとコマンドラインに戻ります。
戻れないって焦る前にここまで読んでね

## 関連記事
[【Git】一覧](http://qiita.com/sunstripe/items/0b611f6e8a480024dd33) - Gitコマンドまとめ
[【Git】git branch](http://qiita.com/sunstripe/items/30f46a7bf451c1a85c2b) - ブランチの一覧表示
[【Git】git branch [ブランチ名]](http://qiita.com/sunstripe/items/4e8c32634806edd0672d) - ブランチを作る
[【Git】git branch -a](http://qiita.com/sunstripe/items/9ee8ec44005243805811) - ローカル＆リモートブランチ一覧を表示する
【Git】git branch -d [ブランチ名] - ブランチを削除
【Git】git branch -r - リモートブランチ一覧を表示する

---


## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
[Ruby on Rails]テーブル名変更時にすべてのテストがエラーになる件について

##概要
主に下記記事を参考にテーブル名を変更した際、すべてのテストがエラーになってしまったので、対処法をメモ・共有しておきます。

【Ruby on Rails】テーブル名を変更するときにやること一覧＆ステップ
https://qiita.com/mtoyopet/items/a8558c9b7010dde6ecf8
(引用者注:
概要:マイグレーションファイルを作成し、rename_table :旧テーブル名, :新テーブル名
→モデル・コントローラのファイル名・クラス名、ビューのフォルダ名、アソシエーション・ルーティングの記載を旧名→新名へ修正)

##結論
fixtures/"旧テーブル名".ymlの名前を"新テーブル名".ymlへ変更。
テストでは、すべてのfixturesが読み込まれる(?)ため、すべてのテストがエラーになってしまっていたようです。

##補足
上記記事に加えて、testフォルダの中のcotroller_testとmodelに関するテスト(モデル名_test)のファイル名とクラス名も変更し、テストをパスするようになりました。
Laravelのリソースコントローラを使ってCRUDアクション作成

laravelのリソースコントローラについてのメモです。

公式リファレンス
https://readouble.com/laravel/5.8/ja/controllers.html?header=%25E3%2583%25AA%25E3%2582%25BD%25E3%2583%25BC%25E3%2582%25B9%25E3%2582%25B3%25E3%2583%25B3%25E3%2583%2588%25E3%2583%25AD%25E3%2583%25BC%25E3%2583%25A9

###リソースコントローラ
リソースコントローラを使うとアプリの基本的な操作であるCRUD(作成、一覧表示、編集、削除）などのアクションやそのルーティングが自動的にされます。

例えばusersのリソースコントローラだと下のようなアクションが自動で作られます。

|HTTPメソッド|URI|アクション|ルート名|
|:----|:----|:----|:----|
|GET|/users|index|users.index|
|GET|/users/create|create|users.create|
|POST|/users|store|users.store|
|GET|/users/{user}|show|users.show|
|GET|/users/{user}/edit|edit|users.edit|
|PUT/PATCH|/users/{user}|update|users.update|
|DELETE|/users/{user}|destroy|users.destroy|

###作成
コントローラをつくるartisanコマンドに`--resource`をつけます。

```shell

php artisan make:controller UsersController --resource
```
すると自動的にコントローラ内にこれらのアクションが用意されます。

```php:UsersController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UsersController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}
```

###ルーティング


```php:web.php

Route::resource('users', 'UsersController');
```

これだけですべてのアクションの紐づけができます。

また使うアクションを限定することもできます。作成、一覧表示のみを行う場合↓

```php:web.php
//作成、一覧表示のみを行う場合
Route::resource('users', 'UsersController', ['only' => ['index', 'create', 'store', 'show']]);
```
追跡機能付き姿勢推定「AlphaPose」を試してみた

# AlphaPose

上海交通大学の研究チームが公開している人物追跡機能も持つ高精度姿勢推定ライブラリです。

> [AlphaPose](http://www.mvig.org/research/alphapose.html) is an accurate multi-person pose estimator, which is the **first open-source system that achieves 70+ mAP (75 mAP) on COCO dataset and 80+ mAP (82.1 mAP) on MPII dataset.** 
To match poses that correspond to the same person across frames, we also provide an efficient online pose tracker called Pose Flow. It is the **first open-source online pose tracker that achieves both 60+ mAP (66.5 mAP) and 50+ MOTA (58.3 MOTA) on PoseTrack Challenge dataset.**

Github: https://github.com/MVIG-SJTU/AlphaPose
Release: https://www.mvig.org/research/alphapose.html

# サンプル動画

[![AlphaPose解析デモ](http://img.youtube.com/vi/-jywtLXED04/0.jpg)](https://youtu.be/-jywtLXED04)

左上が「[AlphaPose](https://github.com/MVIG-SJTU/AlphaPose)」（Simple Baseline）、右下が「[Openpose](https://github.com/CMU-Perceptual-Computing-Lab/openpose)」。
出力されたJSONデータリスト内のINDEXに基づき、緑と青の点を打っています。
（点を打つのは、拙作改造ライブラリ 「[mannequinchallenge-vmd](https://github.com/miu200521358/mannequinchallenge-vmd)」の `work_1.04` ブランチで行っています）
`AlphaPose` の四角い枠は `tracker` モードの時に自動的に挿入されます。枠の左上にINDEX番号が振られています。

【動画引用元】
バスター！
楽曲：dezzy(一億円P)様　（https://www.nicovideo.jp/watch/sm24753406）
踊り：やっこ様×まりやん様　（https://www.nicovideo.jp/watch/sm27620009）

# 導入方法

1. `AlphaPose` のgithubリポジトリを `clone` する
2. ライブラリをダウンロードして、既定の場所に配置する
3. `setup.py` を実行する
4.  動画、画像、画像ファイルを複数含むフォルダ、等を指定して、`scripts/demo_inference.py` を実行する

[AlphaPoseSample.ipynb](https://colab.research.google.com/github/miu200521358/motion_trace_colab/blob/master/AlphaPoseSample.ipynb)

というわけで、これらを用意した `CoLab用ファイル` がこちらになりますｗ
（Openposeモードの出力にIndex情報を追加するため、自分のリポジトリにforkしたものになります）
具体的なコードは上記をご覧ください。

# 所感

個人的に色々試しててハマったり、気づいたりしたところ

- 動画を対象として、`--detector`オプション（検出種別）を `yolo` にした場合、`detbatch` を `1` にしないと、`Process` の `get` で固まる
    - 組み合わせ的な問題のような気もするのですが、`yolo`で 2以上にした場合、動画の最終フレームにたどり着く前にループを抜けようとして、`get` で `return` が戻ってこないで固まりました。
    - `tracker`の場合、`CoLab` 上であれば、 `4` までは動きました。 `8`だと固まりました。性能の問題かしら…
- `--detector`オプションを `tracker` にすると、人物追跡が出来る
    - この機能が欲しかった！！！
    - `Openpose` はINDEX順番の担保がされていないので、普通に上から順番に見ていくと、ワープしまくる
    - `AlphaPose` だと基本的には同じ人物は同じINDEX（値そのものは変わるようなので、昇順ソートした順番）が維持される模様。
    - ただ、人物が交差するところの精度は五分五分くらい？な感じなので、その辺はフォローが必要かもしれない
- `--format` を `open` にすると、`Openpose`（COCO）と同じ形式のjsonが生成される
    - 自分のプロジェクトで元々 `Openpose` を使用しているので、このオプションは非常に助かる。
    - ただし、人物INDEXの情報は捨てられてしまっていたので、forkして改造して利用。
- `Fast Pose` だと3000Fくらいで固まってしまう。パラメーター調整でいけないか要検討。
- しゃがんだり後ろを向いたりするときの推定は、`Openpose` の方が安定している
    - 今のところ、`Simple Baseline` と `Fast Pose` までしか試してないので、他のモデルも試してみる予定。
    - データが取れなかったところだけ `Openpose` もアリかもしれないが、そもそもしゃがんでるデータは [2D→3D推定](https://github.com/miu200521358/3d-pose-baseline-vmd) でもおかしくなりがちなので、今は諦めるのも手かもしれない。
- `AlphaPose` は非商用であれば利用可能。スポーツ分野の制限はなさそう。
    - 地味に有り難いですね。


Openposeより速くて性能がいいので、今度のMMD自動トレースではこれを使ってみようと思います。
[やってみた]AWS EC2にCloudMapperを構築

## 環境

AWS EC2 Amazon Linux 2 AMI

## 構築手順

### アクセスキーの取得

[IAM]-[ユーザ]-[ユーザ名]-[認証情報]より、アクセスキーを作成し、アクセスキーとシークレットアクセスキーを控える

### CloudMapperの取得と配置

```
$ sudo yum install git -y
$ git clone https://github.com/duo-labs/cloudmapper.git

$ sudo yum install autoconf automake libtool python34-devel jq -y
$ sudo yum install python3.x86_64 python3-tkinter.x86_64  python3-devel.x86_64 python3-pip.noarch -y
```

### nginxのインストール

```
$ sudo amazon-linux-extras install nginx1.12 -y
$ sudo systemctl enable nginx
$ sudo systemctl start nginx
```

### Pythonモジュールのインストール

```
$ sudo pip3 install pyyaml
$ sudo pip3 install parliament
$ sudo pip3 install pyjq
$ sudo pip3 install netaddr
$ sudo pip3 install policyuniverse
$ sudo pip3 install jinja2
```

### AWS CLIの環境設定

```
$ aws configure
AWS Access Key ID [None]: アクセスキー
AWS Secret Access Key [None]: シークレットアクセスキー
Default region name [None]: リージョン名(英語)
Default output format [None]: json
```
※[リージョン、アベイラビリティーゾーン、および ローカルゾーン](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html)

### CloudMapperの初期設定

```
$ cd cloudmapper
$ AWS_ID=$(aws sts get-caller-identity \
    --query "Account" \
    --output text) \
    && echo ${AWS_ID}

$ python3 cloudmapper.py configure add-account --config-file config.json --name dev.io --id ${AWS_ID} --default DEFAULT
$ python3 cloudmapper.py configure add-account --config-file config.json --name demodemo --id ${AWS_ID}

```



## 利用方法

### 構成情報の取得

```
$ python3 cloudmapper.py collect --config config.json --account demodemo
$ python3 cloudmapper.py prepare --config config.json --account demodemo
```



## アクセス

```
http://ec2-xxx.xxx.xxx.xxx.ap-northeast-1.compute.amazonaws.com/
```
美形会議をgoogle-homeに演じてもらった

#作成の動機
google-homeをpythonでしゃべらせることができるが、ただ単語を1つしゃべっても面白くないので、会話っぽくしゃべらせてみたかった

#美形会議って？
[ここ](http://bohyou.vis.ne.jp/)の[NEOGEO会議室]を参照

#ソース
```python:talk.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import time
import datetime
import pychromecast
from gtts import gTTS
from mutagen.mp3 import MP3

#IPアドレスでgoogle-homeを指定
googleHome = pychromecast.Chromecast('192.168.0.xx')

if not googleHome.is_idle:
    googleHome.quit_app()
    time.sleep(5)

f = open('./script.txt', 'r') #会話を書いたテキストを用意
line = f.readline()

while line:
  #1行づつしゃべらせる
  print(line.strip())

  savefile = "voice-%s.mp3" % datetime.datetime.now().strftime('%Y%m%d-%H%M%S')
  savepath = "/tts/%s" % savefile

  try:
    #google speech to textで音声データへ変換して保存
    tts = gTTS(text=line.strip(), lang='ja')
    tts.save(savepath)
  except:
    continue
  finally:
    line = f.readline()

  #mp3ファイルの情報を取得
  audio = MP3(savepath)

  #上記のsavepathがwebからアクセス可能な場所として公開
  mp3url = "https://(domainname)/tts/%s" % savefile;

  #google homeにmp3をしゃべらせる
  googleHome.wait()
  googleHome.media_controller.play_media(mp3url, 'audio/mp3')
  googleHome.media_controller.block_until_active()

  #しゃべている間に次の会話が始まると途中でストップするので、
  #会話データの秒数だけ待つ
  time.sleep(audio.info.length)

f.close()
```

#script.txtのサンプル
```
やぁ！餓狼伝説の美形キャラ、～
わざわざ説明せんでもええやろうけど～
サムライスピリッツの美形キャラ、橘～
```

#コマンド
```bash
docker run -v /script:/data -v /tts/:/tts toru2220/google-home-python python talk.py
```

[実際の操作](https://www.youtube.com/watch?v=IdYyfJmsdds&feature=youtu.be)
RK3326について

HardkernelからODROID-GO AdvanceというRockchip RK3326を搭載したデバイスがリリースされました。UARTとディスプレイとバッテリが付いていて小型で、ベアメタルな開発をするのが楽しそうなデバイスなっています。

というわけでRK3326について調査してみました。

# RK3266のブロック図
RK3326の概要はブロック図を見てください。

<img width="459" alt="rk3326block.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42120/f085052d-a718-c454-0e3b-e3cda79455cc.png">

# RK3266のドキュメントなど
RK3326はデータシートとTRMが公開されています。

* http://www.rockchip.fr/RK3326%20datasheet%20V1.4.pdf
* https://github.com/Poco-Ye/rk-datasheet/tree/master/3326

rockchipのgithubにEVKとLinux SDKのドキュメントがあります。

* https://github.com/rockchip-linux/docs/
* https://github.com/rockchip-linux/docs/tree/master/Soc_public/RK3326

ODROID-GO Advance のフォーラム

* https://forum.odroid.com/viewforum.php?f=186


# サンプルコード

ODROID-GO Advance用のu-bootとLinuxカーネルのソースコード。各機能のソースコードはコンフィグとDeviceTreeからたどってください。

* https://github.com/hardkernel/u-boot/tree/odroidgoA-v2017.09
    * https://github.com/hardkernel/u-boot/blob/odroidgoA-v2017.09/configs/odroidgo2_defconfig
* https://github.com/hardkernel/linux/tree/odroidgoA-4.4.y
    * https://github.com/hardkernel/linux/blob/odroidgoA-4.4.y/arch/arm64/configs/odroidgo2_defconfig
    * https://github.com/hardkernel/linux/blob/odroidgoA-4.4.y/arch/arm64/boot/dts/rockchip/rk3326-odroidgo2-linux.dts

公式のgithub rockchip-linux にあるu-bootとLinuxカーネルのソースコード

* https://github.com/rockchip-linux/u-boot
    * https://github.com/rockchip-linux/u-boot/blob/next-dev/configs/rk3326_defconfig
* https://github.com/rockchip-linux/kernel
    * https://github.com/rockchip-linux/kernel/blob/develop-4.4/arch/arm64/configs/rk3326_linux_defconfig
    * https://github.com/rockchip-linux/kernel/blob/develop-4.4/arch/arm64/boot/dts/rockchip/rk3326.dtsi


# PX30との差異
ベースとなったPX30との差異を調査してみました。

機能の差異

* secure timer x2 を削除
* LCD Controller 1 を削除
* 12bits CCIR/Camera I/Fを削除
* 8 bits DVP I/Fを追加
* USB Host 2.0を削除
* UART x6 から UART x4
* Ethernet(100)を削除
* I2C x4 から x3

パッケージは同じ

* RK3326
    * TFBGA418L (body: 14mm x 14mm; ball size: 0.3mm; ball pitch: 0.65mm)
* PX30 
    * TFBGA418L (body: 14mm x 14mm; ball size: 0.3mm; ball pitch: 0.65mm) 

なんだか中身は同じみたいです。


# RK3326搭載デバイス
* ODROID-GO Advance 55USD
* tablet
    * BENEVE7133 amazon.jpで6999円
    * Dragon Touch Y80 amazon.jpで8999円
   
以上
Windows Server 2016 Essential で 80 番ポートを開放する方法

# 概要

Windows Server 2016 Essential を利用して Web サーバーを構築したところ 80 番ポートが Windows のシステムプロセスによって利用されていてポートの競合が発生してしまいました。本記事では 80 番ポートの開放方法について記載します。

# ポートの利用状況の確認

netstat コマンドで 80 番ポートの利用状況を確認します。

```
netstat -oan | findstr ":80 PID"
  プロトコル  ローカル アドレス      外部アドレス           状態            PID
  TCP         0.0.0.0:80             0.0.0.0:0              LISTENING       4
  TCP         [::]:80                [::]:0                 LISTENING       4
```

どうやら PID が 4 のプロセスによって 80 番ポートが利用されているようです。
タスクマネージャーで PID が 4 のプロセスを確認すると Windows のシステムプロセスであることが分かります。

```
名前	PID	状態	ユーザー名	CPU	メモリ (アクティブなプライベート ワーキング セット)
System	4	実行中	SYSTEM	00 	20 K
```

# 80 番ポートを利用するシステムプロセス (サービス)

Windows のシステムプロセスのうち 80 番ポートを利用するものは以下のサービスであることが分かりました。

|名前|サービス名|
|:---|:---|
|SQL Server Reporting Services|ReportServer|
|Web Deployment Agent Service|MsDepSvc|
|BranchCache|PeerDistSvc|
|Sync Share Service|SyncShareSvc|
|World Wide Web Publishing Service|W3SVC|
|Internet Information Server|WAS, IISADMIN|

# サービスの停止

Windows Server 2016 Essential ではデフォルトで BranchCache サービスが起動していましたので、管理者権限のコマンドプロンプトから以下のコマンドでサービスの停止を行います。

```
sc stop PeerDistSvc
```

必要に応じてサービスの開始方法も変更しておきます。
デフォルトは自動開始のためサーバーの再起動後はサービスが自動開始します。
サービスを自動開始させないために以下のコマンドで手動開始に変更しておきます。

```
sc config PeerDistSvc start= demand
```

これで 80 番ポートが開放され、Web サーバーを構築することができるようになりました。
80 番ポートの競合が発生した際は該当のサービスが起動していないかを確認してみてください。
[読書] エンジニアのためのマネジメントキャリアパス ―テックリードからCTOまでマネジメントスキル向上ガイド


「あ、じゃあ今日から、エンジニアリングマネージャーになってよ」「えっ!?」という話はちょくちょくある。しかし、その時に体系だった参考書がなく、あくまで先輩たちの経験則に基づいたふわっとしたマネジメント理論、いや理論というよりかは体験談程度のものしかそこには存在せず、しばし呆然とすることがあるかもしれない。
本書はエンジニアリングマネージャーとして第一歩を踏み出す方には必携の書である。インターン生を受けて入れるメンターとしての立場から技術部長として複数のユニットからなるチームを取りまとめる視点まで様々な組織のフェーズでの方法論が書かれており、実際に自分がその立場になかったとしても、いろいろな立場の人の視点をエミューレートするのに大変役に立つ。ぼんやりとした不安に押しつぶされてしまうより、さっさと本書を手にとったほうがよほど心身の健康に役立つだろう。

★★★★★ 5/5

<a href="https://www.amazon.co.jp/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88%E3%82%AD%E3%83%A3%E3%83%AA%E3%82%A2%E3%83%91%E3%82%B9-%E2%80%95%E3%83%86%E3%83%83%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%89%E3%81%8B%E3%82%89CTO%E3%81%BE%E3%81%A7%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88%E3%82%B9%E3%82%AD%E3%83%AB%E5%90%91%E4%B8%8A%E3%82%AC%E3%82%A4%E3%83%89-Camille-Fournier/dp/4873118484/ref=as_li_ss_il?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%BC&qid=1582087635&sr=8-5&linkCode=li2&tag=mabotsblog-22&linkId=997462e7f7f2fb93727232d6f7e2add9&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4873118484&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=mabotsblog-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=mabotsblog-22&language=ja_JP&l=li2&o=9&a=4873118484" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

https://amzn.to/2HA9u19
PHPでプレースホルダを使ったフォーム作成

#PHPでフォーム作成

[以前の記事](https://qiita.com/rui-watanabe/items/6cbc61fbc3da4fdd22f1)で、DVWAでは変数をSQL文にそのままいれたことから、**SQLインジェクションが可能なコード**となってしまっていました。

そこで今回は、そんなSQLインジェクションに対処するための方法として、**プレースホルダについて**紹介したいと思います。

#プレースホルダとは？
プレースホルダはその名の通り、**SQL文に対して後から値をセットするための場所を確保する機能**となっています。

プレースホルダは、疑問符プレースホルダの?、名前付きプレースホルダの:値、で表現されまます。

また、後から入れる値のバインド値のことを、プリペアドステートメント（予約文)と言います。

このプレースホルダを使うことによって、入力値から直接SQLインジェクションが行われることを、回避できるというわけです。



#HTML/PHP/MySQLでフォーム作成

ここでは、実際にフォームを作成し、プレースホルダを使うコードについて記載していきたいと思います。

コードは下記の記事を参考にしています。
https://noumenon-th.net/programming/2016/01/18/mysql-2/

#前提条件
- PHP 5.46
- MySQL 14.14

##  MySQLでDB、テーブル、カラムの設定

まずは、MySQLでDBとテーブルとカラムをセットしていきます。

ここではDBをtest1、テーブルをname_list、カラムをid・nameでセットします。

```
# mysql -u root -p
 
mysql> CREATE DATABASE test1;
mysql> USE test1;
mysql> CREATE TABLE name (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,name TEXT NOT NULL) DEFAULT CHARACTER SET=utf8;
```

##フォームのHTMLファイルを作成

まず基本となる簡単な、フォームをHTMLで記載していきます。

```index.html
<!DOCTYPE html>
<html>
  <head>
    <title>データを入力する</title>
    <meta charset="utf-8">
    </head>
<body>
  <h1>フォーム画面</h1> 
      <form action="form.php" method="post">
          名前を入力：<input type="text" name="name">
          <input type="submit" value="登録する">
      </form>
</body>
</html>
```


##フォーム情報を登録するPHPファイル作成

次に、フォーム情報をMySQLに登録するPHPファイルを作成していきます。

SQL文はプレースホルダを使って表示していきます。

```form.php
<?php
 
header("Content-type: text/html; charset=utf-8");
 
//データベース接続
$server = "IPアドレス";  
$userName = "MySQLのユーザー名"; 
$password = "MySQLのパスワード"; 
$dbName = "test1";
 
$mysqli = new mysqli($server, $userName, $password, $dbName);
 
if ($mysqli->connect_error){
	echo $mysqli->connect_error;
	exit();
}else{
	$mysqli->set_charset("utf-8");
}
 
if(empty($_POST)) {
	echo "<a href='index.php'>index.php</a>←登録はこのページから";
}else{
	//名前入力判定
	if (!isset($_POST['name'])  || $_POST['name'] === "" ){
		echo "名前が入力されていません。";
	}else{
		//プリペアドステートメントの設定(SQL文を最初に用意して、その後はクエリ内のパラメーターの値だけを変更する)
		$stmt = $mysqli->prepare("INSERT INTO name_list (name) VALUES (?)");
		
		if($stmt){
			//プレースホルダに値を設定する、bind_paramsの第一引数は文字列が入るので's'
			$stmt->bind_param('s', $name);
			$name = $_POST['name'];
			
			//登録する名前をhtml表記、クオテーションを取った状態で表示
			if($stmt->execute()){
				echo htmlspecialchars($name, ENT_QUOTES, 'UTF-8')."さんを登録しました";
			}else{
				echo $stmt->errno . $stmt->error;
			}
		
			$stmt->close();
		}else{
			echo $mysqli->errno . $mysqli->error;
		}
	}
}
 
// データベース切断
$mysqli->close();
 
?>
```

実際にはこんな感じに動作します。

![demo](https://gyazo.com/11c186a1d67cb011bd90fb981ba2bcd8/raw)



これで、プレースホルダを利用したPHPのフォーム作成は完了です。
WindowsTerminalやPowerShellからWSL2を実行した際に~/.bashrcが読み込まれない



# WindowsTerminalで実行した際、一部のPATHが通ってない

WindowsTerminalでWSL2 ubuntuを実行しシェルを立ち上げた際にbundle等のコマンドが使えず一部のPATHが通ってないことに気づきました。
また確認してみるとPowerShellから`wsl -d ubuntu`などを入力して立ち上げた際も同様に通ってません。
しかし、VSCodeのRemoteWSLのターミナルではPATHが問題なく通ってます。


## bashで通るようになる
PATHが通ってないシェル上で`bash`を入力するとパスが通ります。
起動時に実行されてるシェルもBashで`bash`入力で起動するシェルも当然Bashですが、この２つは何が違うのでしょうか。
どうやらWindowsから起動したWSL2のShellは~/.bashrcに書き込んだ環境変数を読み込んでいないようです。

## ~/.bashrcと~/.profileの違いとログイン・シェルの起動
環境変数の書き込み先として使用されますが
`~/.profile`はログイン・シェル
`~/.bashrc`はインタラクティブ・シェル
にそれぞれ対応するそうです。

つまり、WSL起動時にはログイン・シェルが起動していて`~/.profile`が読まれるが`~/.bashrc`は読まれず、
`bash`入力後はインタラクティブ・シェルが起動するので`~/.bashrc`が読み込まれるようになるということです。

以前WSLで設定したときはログインシェルが起動せずインタラクティブ・シェルが最初に起動するから`~/.bashrc`に環境変数を追加するべきとなっていたはずなのですが、
その後の(最近かも？)アップデートで、いつの間にか**ログイン・シェルが最初に起動するようになった**ようです。

また、`~/.bashrc`にはプロンプトのカラー設定が書いてあるので、インタラクティブ・シェルではプロンプトでユーザー名とディレクティブが見やすく色分けされるのに対して、ログインシェルでは色分けされず若干見づらくなります。

# 対応策
ログイン・シェルの中でさらに`bash`を実行すればいいのですが、起動と分けて別に毎回入力するのはちょっと嫌なので、できればターミナルからシェルを起動した際にPATHが通っていてほしいですね。
`~/.profile`の方にもPATHをを書き込めば一応PATHに関しては解決しますが、普通に使う分にはインタラクティブ・シェルの方が便利なのでこちらを立ち上げる方法を考えます。


### WSLからのシェル起動時に`bash`コマンドを指定する
windowsのシェルから起動するwslコマンドで

```
wsl -d ubuntu bash
```

と入力すればデフォルトのログイン・シェルが起動したあとにBashのインタラクティブ・シェルが立ち上がるので一発で`~/.bashrc`が読み込まれます。（`ubuntu`のところは各自のディストリビューションに読み替えてください。）
実質的にはwslコマンドでWSLを起動した後にbashを叩いてるのとなんら変わらないですが、ワンライナーで書けるので、これをターミナルの設定に入れていけばいいです。


# WindowsTerminalの設定
WindowsTerminalでWSL ubuntuのインタラクティブシェルを一発で起動する方法を説明します。
ついでに起動時のディレクトリを~(ホーム)に変更し、WindowsTeminalのデフォルトをPowerShellからWSL2に変更します。
WindowsTerminal起動後のウィンドウ上のタブの右の　 + v　のvマークからSettingを選択し
`profiles.json`ファイルを編集します。
`"profiles":`の中に`name:"Ubuntu"`と書かれた項目があるはずなのでその部分を

```json:profile.json
        {
            "guid": "{ ここはそのまま残す }",
            "hidden": false,
            "name": "Ubuntu",
            "commandline" : "wsl -d Ubuntu bash",
            "startingDirectory": "//wsl$/Ubuntu/home/[account_name]" 
        },
```
で書き換えます。`"guid"`の行はそのまま残し、`[accout_name]`の部分は自分のアカウント名に置き換えてください。
`"commandline"`の部分に上で試したコマンドを使用してます。
`"startingDirectory"`を書き換えればホーム以外でも自由な場所を設定できます。

さらに

```json:profile.json
"defaultProfile": "{さっき残したubuntuのguidに書き換える}",
```
の部分を先程残したguidに書き換えます。これで完成です。
見ればだいたい意味は分かると思いますが詳細は[Windows Terminal User Documentation](https://github.com/microsoft/terminal/blob/master/doc/user-docs/index.md)を参照してください。


## 追記
上記でguidは既存のものを流用する形で書いてますが
PowerShell上で

```
　[guid]::NewGuid()
```
で新しいguidを取得できるそうです。[^1]
[^1]: 「関係ないMarkdownの話」コードブロックで**"\[ \]\:"**が表示できない。そのまま書くとコードブロック中でもエスケープされず、注釈やリンクとして認識されるのか何も表示されなくなる。かといって\でエスケープすると、今度は`\[\]\:`となる。行頭に全角スペースで回避できたけどバグかな？
参考：https://news.mynavi.jp/article/win10tips-399/