OmniAICreator/Qiita-1.07M huggingface dataset:
いまの物体検出には何が足りないか

深層学習のうちでも一般物体検出は、一番成功をおさめた技術だろう。
深層学習・機械学習のそれぞれのプラットフォームには、必ずと言っていいほど、一般物体検出の実装が含まれている。

にもかかわらず、私は物体検出に不満を持っている。
学習データがまだまだ十分ではなくて検出性能が不十分であるということではない。

原理的な部分にいくつもの不満を感じている。

## 現状の一般物体検出に対する不満
### ほとんどの一般物体検出が矩形枠を表示する検出であって、pixel単位で物体の領域を表示するインスタンスセグメンテーションではないこと。
- このため、物体検出が背景の影響を受けてしまうこと。
- 検出枠の精度をあげようとすると、インスタンスセグメンテーションができるほとの内部での解釈を必要とする。どの部分までは対象物なのかどこからが別のものなのかを判定しなければならない。にもかかわらず、検出枠というヒントしか与えていない。

### 学習・推論の際に画素値をベースとしたものであって、物体の奥行きに対する理解を、ほとんどの実装は持ち合わせていない。
- 人の場合には、物体の奥行きの大小関係を理解して、奥行きの近い側を一つのまとまりとして理解している。
- 大半の深層学習では、物体の奥行き情報を物体の検出に利用することができていない。
- 物体の奥行きに対する理解ができていれば、人の着衣のテクスチャーがどのように変化しても、人の検出を適切に行うことができるだろう。

### 大半の物体検出では、物体の形状と物体への照明条件とを分離していない。
- 照明条件が変わると、検出に影響が出る。
- 人が物体を理解するとき、物体の表面がどういう向きであるのか（法線ベクトルの向き）を意識している。だから、たいがいの着衣で、服の形状がどんなであるのかを推定できる。
    - 着衣の形状、着衣の物体色、撮影時の照明環境　それらの結果生じている各場所での色を元に、それらを分離してたいがいの場合理解できる。
- だから、着衣の色やテクスチャーが変化しても、理解できる。


### 生き物の画像認識は、動画が基本、動きに対する認識が本質的であるはずだ。
- 一般物体検出のほとんどは、静止画に対する検出処理だ。
- しかし、生き物の画像認識は、動きが本質的なはずだ。
- 外界が動くだけでなく、自分の自体の動きによっても見え方は変わってくる。
- そのため、見えている内容には常に動きがある。Optical Flow がある。Optical flow の動きの塊をみると、どこからどこまでが一つの塊であるかを意識させる。自分自身の動きに対して、それぞれのOptical flow の大きさがどれくらいであるのかによっても、対象物の距離を感じさせる。
- 現状の物体検出には、静止画ベースだ。そのために、このような情報が利用できていない。

### 物体検出の推論によるレイテンシが無視できないことが多い。
- レイテンシが少ない物体検出のほとんどは、計算資源をこれでもかというほどに潤沢な状況にして、推論を行うことでレイテンシを減らしている。
- しかし、物体検出を利用したい組み込みの分野では、計算資源が限られている。そのような状況でも少ないレイテンシでの推論がほしい。
- レイテンシは、場合によって命取りになる。
- 歩行者検出をする場合に、レイテンシ＊（人の移動速度＋車両の移動速度）の分だけ、位置が違ってきてしまう。
- そのため、安全にすれ違うことができるのか、ぶつかってしまうのかを余裕をもって判断するのが大変になってしまう。

### たいがいの推論は、推論の入力データが得られた時刻の「過去」の状態を推論するものである。
- 深層学習の入力画像は、画像という１フレームのまとまりに仕上げられた時点で既に「過去」の状態になっている。
- しかし、行動する主体としての判断に利用したいのは、今の状況である。
- この問題の深刻さを理解してもらうには、ドアの開閉の状況を、webカメラのデータをhttpで転送してモニタに表示させて見よう。直に自分の目でもドアを見えるようにしておき、モニタの表示とを見てみよう。
- 実際のドアが閉まってから、モニタのドアが閉まるまでの時間差を確かめてみよう。
- モニタに見える動画を元に判断を下すと、実際の状況とは違っていることに気づくはずだ。
- たいがいの深層学習の推論は、推論の入力データが得られた時刻の「過去」の状態を推論するものだから、レイテンシを減らそうとするには、潤沢な計算資源を使うしかなくなってしまう。

### 運用時に学習させることができない。
- 大半の実装において、運用には推論しかできない。運用時に見つけたポジティブサンプルを使って検出のためのモデルを更新することができない。
- そのため、学習済みモデルが、運用先の環境に適応させていくのが簡単ではない。

---
追記
## ほんのちょっとの違いで未検出になってしまいやすい。
- そこの3次元の物体という意味でオブジェクトがあるのは、わかりやすいはずなのに、簡単に未検出になってしまう。
- 該当のカテゴリと判定できなくても、類似のカテゴリで検出するなどのことはしてほしいと思う。
- 一般物体検出は、検出の頑強性に欠けるのである。
- 対象のカテゴリの見え方は、対象物の形状・テクスチャ・見ている方位・ライティングなどによって変化する。
- そのため、人検出の頑強性を上げるには、どれだけポジティブサンプルを網羅なく収集するかにかかっている。
- システム設計をするうえで、その機能が失敗する確率が高いことは、利用方法をとんでもなく難しくしてしまう。
- SSDやYOLO シリーズの一連の検出アルゴリズムは、そういった欠点をもっている。
- 検出の学習アルゴリズム自体はロバストになっていない。
そうい本質的な部分に課題を持っている。
大量の実空間の画像データ自体の中にある秩序を引き出せていない。

## 物体検出が、物体のbboxの外の画像に対する影響を受けすぎる。
深層学習ベースの物体検出では、検出されたbboxの外側の情報をも利用して、物体検出をしている。
次のような、見かけることのない状況での検出性能はどうだろうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/37778922-2495-406f-be77-99fbfcc7ad7d.png)

https://x.com/tensoic/status/1775207722243232134



### 関連記事
[「いまの物体認識には何が足りないのか」への追記](https://qiita.com/nonbiri15/items/ec33245b75403949f60f)
ruby メソッドを初めて学んだ

##標準出力する
print　
puts　後に改行を追加する
p　デバック用

##rubyで表示されるもの
・Ruby では全ての値がオブジェクトになっている
・メソッド オブジェクトの後ろにつけられる便利な命令
・オブジェクトの種類をクラスと言う。クラスごとに使えるメソッドが限られてくる。
・インスタンス　実際の値　例"hello world", 1.1

##クラスごとにメソッドがある

p Rational(2, 5) + Rational(3, 4)# Rational(2,5)は、分数の2/5を表す
p 2/5r + 3/4r # Rationalの省略版
p 52.6.ceil #.ceilで小数を切り上げ


##破壊的なメソッド
元の値を変更するメソッドが存在する
扱い方には注意したい。
upcase!等がある。

理解できるように頑張りたい。
【Spark AR】javascriptで時刻を表示⏰

エミリと申します😊

今日は、spark Ar hubを使ってインスタやFacebookで使えるフィルターを作る際に、Javascriptを使ってフィルター上に時刻を表示する方法を紹介します！

記事が少なく、さらに日本語の情報は少ないので書いてみました！

完成イメージ↓
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569820/590e53cc-d75f-d93e-5470-af599f046ea3.png", width=300px /img>

※この記事は、ある程度spark ARを使ったことがある方向けです。
初めての方はこちらから↓
[クリスマスの激盛れフィルターを作ろう！](https://qiita.com/emiri3128/items/28bb6e9c0e550ec1ad50)
spark ARの基本的な使い方から書いてあります！

#目次
**1.spark AR側の準備 / scriptを用意する
2.scripting / scripting APIについて
3.実際に時間を表示する**
4.おまけ　フォントに変更。

##1.spark AR側の準備

時刻を表示するためのオブジェクトを追加します。
時刻なので、textを使います。今回は2Dのものにしました

**Add object > 2D Text**


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569820/a30f20da-1b36-82af-75f0-1f2e9578d4cd.png", width=500px /img>
わかりやすくするために、time と名前を変更しておきます。（後で使うので、自分がわかるものにしておいてください。）

**名前変更**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569820/304299f1-96af-edd0-a6c8-687b6850cb06.png)

続いて、**scriptをお用意します。**
今回は、Java Scriptでやります。Type Scriptでもできます！操作は同じで、コードの書き方が違うだけです。

**Add Asset > Script > Jave Script**

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569820/8906fa1b-65dd-6cca-1eaa-2ffe0f42d748.png", width=500px /img>

クリックすると、javascriptの新しいファイルができるので、リネームしてわかりやすくしておきましょう。
今回は以下のようにtime.jsとしておきました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569820/f311c27c-0a09-aa4a-e4c2-364c614eee64.png", width=300px /img>
time.jsのファイルをダブルクリックすると、何かしらのアプリケーションが開いてコードを編集できます！
これで準備完了です💪💪



##2 scripting / scripting APIについて

ここで少しSpark AR hubにおけるscriptingとscripting API について話します。ただ真似して時間を表示できればよい！と言う方は次のステップに飛んでください！

**公式サイトのlearn > scripting / scripting API**のところにいろいろ乗っているので興味がある方はこちらもみてみてください！
[公式サイトへとぶ](https://sparkar.facebook.com/ar-studio/learn/scripting/scripting-basics#creating-a-script)

###・モジュール
Java Script上でspark AR hubで使っているものをもろもろ使うためにmoduleをロードする必要があります。その際にrequireを使うので注意しましょう！

使えるモジュールは全て**scripting API**のところに書いてあります！
今回は、DiagnosticsとSceneと言うモジュールが必要になります。（後にフォントのモジュールも使います。）
`
//必要なモジュールを使えるようにする。
  const Diagnostics = require('Diagnostics');
  const Scene = require('Scene');
`

###・プロパティとメソッド

それぞれのモジュールに対して使えるメソッドが決まっています。（メソッドがないものもあります。）

今回は、**Diagnosticsのlogメソッド**と**Sceneのrootプロパティ**を使います。
Diagnosticsのlogメソッドは、spark ARのコンソールに表示するときに使います
`Diagnostics.log("hello");`
このコードで、spark ARのコンソールにhelloと表示できます。

Sceneのrootプロパティは、セットしたオブジェクトを使うときに使います。（後のコードを参照。）

scriptingの基本的な使い方は、moduleをロードして、メソッドやプロパティ、クラスをつかって行けばなんでもできます！
結局公式ドキュメントに全てが詰まっています😊

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569820/a6f79a7d-a190-837c-e6ef-88bcb272d225.png", width=500px /img>

##3 実際に時間を表示する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569820/8739adf8-6ebc-900b-149d-42354f528fec.png)



コメントアウトで説明を書いたのでここでは割愛します！
わからないところは一つ前のステップで説明しているので参考になるかと思います！

***
以上になります！

時間を表示するだけだとだいぶシンプルですが、周りに何かつけたり、アレンジし放題です！😊
何か不明点、補足した方が良いところがあったら教えてください！
【CSS】「CSSチョットデキル」に、CSSだけで虹色に光るアニメーションをつけてみた

# 概要

- **ネタです**
- CSSのanimation, keyframesのみで文字を虹色に光らせる

# とりあえずコード
<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="css,result" data-user="shiba_gsgs" data-slug-hash="ExZRgzd" data-preview="true" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS チョットデキル">
  <span>See the Pen <a href="https://codepen.io/shiba_gsgs/pen/ExZRgzd">
  CSS チョットデキル</a> by Shiba (<a href="https://codepen.io/shiba_gsgs">@shiba_gsgs</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

重要なのは``animation``と``@keyframes``です。

## animation

```css
animation: rainbow 3s infinite;
```
使う``@keyframes``の名前、アニメーション開始～終了までの秒数を指定しています。
``infinite``をつけると無限にアニメーションを繰り返すようになります。

## ＠keyframes
```css
@keyframes rainbow{
    0%{color:#ff0053;}
    12%{color:#ff5353;}
    24%{color:#ffcf53;}
    36%{color:#e8ff53;}
    48%{color:#53ff5d;}
    60%{color:#53ffbc;}
    72%{color:#5393ff;}
    84%{color:#ca53ff;}
    100%{color:#ff53bd;}
}
```
開始時には`` #ff0053 `` 、ほかの色を経由して終了時には `` #ff53bd `` になります。

# 参考記事

- https://developer.mozilla.org/ja/docs/Web/CSS/animation
- https://developer.mozilla.org/ja/docs/Web/CSS/@keyframes
- https://qiita.com/7968/items/1d999354e00db53bcbd8
AWS lambdaでMysqlを使ってみた

#AWSlambdaでMysqlを使ってみた
用途としてWebAPIでデータベースの情報を閲覧したい
過去経験したことのメモ
## 目次

* lambda関数作成
* 環境変数
* モジュール
* コード
* ネットワーク

以上の５つのを説明していきたいと思います。
ちなみに`cloud９`で扱っていきます。
## lambda関数作成
cloud９を作成して右の縦のタブに`入`みたいなマークがあります。
それを、クリックして`入+` で nodejs のテンプレート`api-gateway-hello-world`を作成していきます。

## 環境変数
lambda では環境変数を設定できるらしいんです。
試しに変数を追記します。
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549680/55df8c39-2291-4d7d-56ff-ac076186034f.png)
追記したら lambda でみてみましょう。

```js

exports.handler = function(event, context, callback) {
    console.log(event);
    const response = {
        statusCode: 200,
        headers: {
            "x-custom-header": "My Header Value",
        },
        body: JSON.stringify({message: `Hello ${process.env.name}`}),
    };
    callback(null, response);
};
```

実行結果

```js
ローカル
"body": "{\"message\":\"Hello undefined\"}"

リモート
"body": "{\"message\":\"Hello test\"}"
```

ここでいうローカルとは、**cloud９に環境下** のことです。
リモートは、**lambdaの環境下** だと思います。

process.env は、OSの環境変数を指しているので動作環境が違えば、変数は、異なってきます。


## モジュール
様々な処理を行う時、外部のライブラリーを使用することは、当たり前のように行われます。

Pythonなら　pip
node なら　npm でインストールします。
今回は、node で進めていきます。

```cmd
npm init
npm i mysql
```
上記のコマンドを実行すれば任意にディレクトリにnode-moduleをインストールできます。
ここでインストールしたものは、デプロイ時にlambdaの環境下にいきます。

## コード
ここでは、lambdaのコードを作ります。
`※データベースは、あらかじめ作成していてください`

```js
let mysql = require('mysql');

exports.handler = async(event, context, callback) => {
    let connection;

    connection = mysql.createConnection({
        host: process.env.databaseEndpoint,
        user: process.env.user,
        password: process.env.password,
        database: process.env.database
    });
    try {
        const data = await new Promise((resolve, reject) => {

            connection.connect((err) => {
                if (err) {
                    console.log('error connecting: ' + err.stack);
                    return;
                }
                console.log('success');
            });
            connection.query('select * from sample', function(err, rows) {
                if (err) { throw err; }

                resolve(rows);
            });
        });
        const response = {
            statusCode: 200,
            headers: {
                "x-custom-header": "My Header Value",
            },
            body: JSON.stringify(data),
        };
        connection.end();
        callback(null, response)
    }
    catch (err) {
        callback(null, {
            statusCode: 400,
            body: err.message
        })
    }

};
```
上記のコードをデプロイするとWEBAPIとしてデータベースを見ることができます。

![スクリーンショット 2021-04-16 0.22.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549680/7cba6928-3e11-5b61-aec9-437503fa76ec.png)

## ネットワーク
はい、嘘つきました。
実は、説明した通りだとラムダにネットワークの設定がされていないはずなので、データベースに接続できないです。
以下の手順を踏んでください

1. 関数にVPC（データベースと同一）を設定する
1. ラムダ関数に付与されているロールに`AWSLambdaVPCAccessExecutionRole`を付与
1. ラムダにセキュリティグループの設定を行なってください
1. mysqlとのインバウンドルールを追加します（かってに追加される気がする）

## あとがき
自分の経験を元に書いているので、もしかしたら何か抜けている可能性があります。
nodejsには、サーバレスのフレームワークがあったのでlambdaを作成するのであれば、それを利用する方が、簡単かもしれないです。
【自分用メモ】Unsafeコードってなに？

#Unsafeコードとは？
C<sup>#</sup>において(特別に)ポインターを使ったコード．
#なぜ"Unsafe"なのか？
ポインターは有用であるがバグの原因になりやすいため
#どうゆう利点があるの？
・C言語などの既存のプログラミング言語との相互運用性
(・プログラムの実行効率向上のため←最終手段)
#参考
[unsafe - C# によるプログラミング入門 - 未確認飛行 C](https://ufcpp.net/study/csharp/sp_unsafe.html#abst,"unsafe")
Windows10にHyper-Vで仮想環境を構築



## [Windows 10 上に Hyper-V をインストールする](https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v)

```Powershell:Powershell(管理者権限)
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
```
実行結果が下記のように出力されたら端末を再起動
![cmd1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573960/82a2eace-f161-0844-c743-3d0ae7a02900.png)

## Hyper-V による仮想マシンの作成

### [クイックスタート作成方法](https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/quick-start/quick-create-virtual-machine)
Hyper-V　クイック作成を起動させる
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573960/8829fa28-581b-9cfc-cf63-52e8d2514c4b.png)

起動すると以下の画面が表示されるため、インストールするOSを選択する。
今回は、「Ubuntu18.04.3LTS」を選択する。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573960/3a465ff1-0217-88ec-02ce-bce055021596.png)


次の画面でダウンロードが開始するため、完了するまで待つ。
デフォルトのままダウンロードすると、「C:\Users\Public\Documents\Hyper-V\Virtual hard disks」にダウンロードがされる。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573960/0253c94d-cc4b-4903-bdf6-8a2486e2ccce.png)

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573960/9c36d4fd-b38b-e9ca-bcf7-e3dbe89b0fe1.png)

作成が完了したので、接続確認を行います。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573960/0bd795d8-81ee-8c9d-00e5-db2821fce74f.png)

起動をクリック

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573960/cd7a1161-00d0-0086-6060-4d72a62c5da5.png)

問題なく立ち上がりました。
ターミナルでのディレクトリの移動を少しでも楽に

ローカル環境で色々と作業をする際、いちいち

```
cd [ディレクトリ名]
cd [パス]
```

と移動していましたが、とにかく面倒。
なのでcdからpushdに変更

```
pushd [ディレクトリ名]
pushd [パス]
```

pushdを利用することでカレントディレクトリを記憶した上で移動するため、
popdを利用することで直前のディレクトリに移動することができます。

```
popd
```

またMacのターミナルの場合はターミナルウィンドウにフォルダをドラック＆ドロップするとパスが表示されます。
これも便利ですね。
M1 Macのpython環境構築について


#はじめに
最近M1チップのMacの環境構築でよくエラーが出たりする問題をよく見かけます。
この記事では、M1チップのMac上で、pythonのよく使うライブラリであるmatplotlibのインストール方法について備忘録として残します。

テスト済み環境は以下です。
MacOS Big Sur 11.2.3
M1 MacBook Pro 13
python 3.8
pip 20.0.2

##環境構築
pythonのライブラリ(ここでmatplotlib)をインストールする一般的な方法は

```
pip install matplotlib
```

あるいは

```
python3 -m pip install matplotlib
```

僕は最近この方法ではうまく行かなくて。。。
どうやらmatplotlibをインストールするときに、Pillowというライブラリも一緒にインストールされるので、そこでエラーを吐いちゃったみたいです。
僕のところで解決できた方法を以下に示す。

```
$ brew install libjpeg
$ git clone https://github.com/python-pillow/Pillow.git
$ cd Pillow
$ pip3 install . --no-binary :all: --no-use-pep517
```
Pillowをインストールするために、先に必要なlibjepgというライブラリをbrewでインストールします。
Pillowもlibjepgも描画用のライブラリらしいです。
それから、

```
$ git clone https://github.com/matplotlib/matplotlib.git
$ cd matplotlib
$ pip3 install . --no-binary :all:
```

でやってみてください。
ダメだった場合は、pip3をpython3 -m pipにかえてからやってみてください。

今回は以上です。
シーサーフ(CSRF)に関して

##シーサーフ(CSRF)に関して学んだこと
まえがき
Laravel初心者が学ぶ課程で気になったことの学習メモとしてアウトプットしています。

`@csrf`
CSRF(Cross-site Request-Forgery)、Webアプリケーションの脆弱性の一つもしくはそれを利用した攻撃。

*追記2021/5/11*
`@csrf`はCSRF対策として用意されているBladeディレクティブ


**注意が必要なwebサイトの特徴**
　- Cookieを用いたセッション管理
　- Basic認証
　- SSLクライアント認証

ユーザがログイン状態（Cookieに情報が保持されている）ならば攻撃される可能性がある。。。
こ、こわい

LaravelのcsrfはRailsでいうStrong Parameter的な役割
viewファイルに記述することで簡単に情報を保護することができる。

セキュリティトークン（ワンタイムトークン）の発行。
生成したワンタムトークンをhiddenパラメータでwebブラウザに返す

```
<form method="POST" action="/profile">
    @csrf
    ...
</form>
```
POSTリクエストの処理の際にCSRF対策をしなければいけない。
`form`とセットで記述する。
*laravelでは`@csrf`がついていないフォームの送信は例外が発生して受付されない仕様になっている。*


参考[URL](https://www.ipa.go.jp/security/vuln/websecurity-HTML-1_6.html)
ロジカルコミュニケーション等メモ

#ミーティングにて
顧客や取引先、関連部署などの会議、ミーティングでのメモ
##心得
企業のシステム開発では関係者とのコミュニケーションが発生する。
新に役に立つシステムを作るには
効率よく顧客の要望を救い上げる事、開発者に伝える事が大切。
### MECE
「モレなく、ダブりなく」という意味。 
思考時に必要な要素を網羅しながら、それらが重複しないようにする。
ロジカルシンキング（論理的思考）で必要な基本概念
### アサーション
相手と自分の気持ちを大切にし、相手を傷つけずに適切に自己主張する。
「人は誰でも自分の意思や要求を表明する権利がある」との立場に基づく。
自分ばかりが主張して相手の意見を聞かなかったり、相手に気後れして自分のことを後回しにするのではなく、対等な立場で議論する

##資料構成・プレゼンテーション

###PREP法
　①結論（Point）
　②理由（Reason）
　③具体例（Example）
　④まとめ（Point）
###SDS法
　①要約（Summary）
　②詳細な説明（Details）
　③まとめ（Summary）

###起承転結

###3段構成
　論文の一般的な構成
　①序論
　②本論
　③結論

###空・雨・傘フレームワーク
マッキンゼーをはじめとするコンサルティングファームが用いる代表的なフレームワークです。
1.	空―「空は曇っている」（事実認識）
2.	雨―「ひと雨きそうだ」（解釈）
3.	傘―「傘を持っていこう」（判断）
①空を見て、曇っているのか晴れているのか。　※事実
②-a 雨雲が出そうだ。　※解釈
②-b いや、風の向きが反対だからこの後は晴れそうだ。※解釈
③-a だから傘を持っていこう　※判断
③-b 傘は荷物になるし手ぶらで行こう　※判断

### 5W1H

　Who（だれが）
　When（いつ）、
　Where（どこで）、
　What（なにを）、
　Why（なぜ）、
　How（どのように）

以下の追加ケースあり
・5W2H　　How much（いくら）
・5W3H　　How many（どのくらい）
・6W　　Whom（誰に）

### 文章の３つの型

　目的でわける
　・結論優先
　　結論、根拠や理由、背景
　　何かをアピールしたい時、報告や連絡をする時
　・列挙
　  伝えたいことがいろいろあるなら
　・物語
　　感情や思いに共感してほしい時

### KPT

　プロジェクト完了の振り返り等に
【K】Keep　（良かったこと・今後も続けること）
【P】Problem（課題・問題点）
【T】Try（次にやること）

##その他補足

　要約（読解力）の型は以下の3種類に分けられる。

　１．同等：具体的or抽象的。つまり、例えば、何故ならば
　２．対比：それに対して、
　３．因果：原因→結果、結果→原因
　※ドラゴン桜より

★履歴
2021/4/15 作成
2021/10/4 起承転結と3段構成を追記
2022/5/3 5W1H以降を追記
VSCodeでscrollPageDownする時 カーソルも付いてきてほしい

#TL;DR;
VSCodeで縦長のテキストやソースコードを閲覧する時
素早く次のページへ、次のページへと移動できるようにしたい。

そんな時に役に立つのが、「キーボード ショートカット」で設定できる
scrollPageDown, scrollPageUpですよね。

私は今まで、以下の設定で過ごしていました。
`scrollPageDown： ctrl+Down`
`scrollPageUp： ctrl+Up`

しかし次第にストレスが溜まるってくるんですよね・・
何にって・・・カーソルが付いてこないことです。
いやマウスクリックすれば済む話なんですけど、キーボードで完結させたいじゃないですか。

そこで調べてみると方法が見つかりました。
Qiitaにはどうやら記事無いようでしたので記しておきます。

#概要
VSCodeでscrollPageDownする時、カーソルも付いてこれるように設定する

#方法
`keybindings.json`へ以下を貼り付けるだけです。
私の場合、`scrollPageDown`、`scrollPageUp`への設定時と同様に
`ctrl+Down`、`ctrl+Up`を割り当てています。
（お好みに合わせて設定してみてください。）

これでまた一つ快適にVSCode生活が過ごせそうです。

```
  {
    "key": "ctrl+up",
    "command": "editorScroll",
    "args": {
      "to": "up",
      "by": "page",
      "revealCursor": true
    },
    "when": "editorTextFocus"
  },
  {
    "key": "ctrl+down",
    "command": "editorScroll",
    "args": {
      "to": "down",
      "by": "page",
      "revealCursor": true
    },
    "when": "editorTextFocus"
  }
```

どなたかのお役に立てましたら幸いです。

#参考
https://marketplace.visualstudio.com/items?itemName=bmalehorn.scroll-viewport
Codecovがやらかしたので至急対処を

# TL;DR
もしCodecovをCI(GitHub Actions等)で使っているなら、**設定している全トークンを無効化・再生成すること**。よくわからないなら、念のためやること。

# 概要
4月1日、ユーザーにCodecovから「Bash Uploaderのチェックサムが合わない」と連絡があり、調査の結果、1月31日以降**Bash Uploaderのスクリプトが定期的に改ざんされていた**ことが判明。このスクリプトは**[CodecovのGitHub Actions](https://github.com/codecov/codecov-action)**、[CircleCI Orb](https://github.com/codecov/codecov-circleci-orb)、Codecov Bitrise Stepでも使用されている。結果、CI上で攻撃者がコードを実行できる状態であった。

CI上では、多くの場合、環境変数としてトークンなどが渡されるため、こうしたトークンは、漏洩した可能性がある。

なお、被害にあった可能性のあるユーザーにはメールが届いている。(当たり前だが、届かないからと言って安全であるわけではない。)

# 対策
CodecovのCI等から参照可能な環境変数に、トークンが含まれる場合は、それを無効化すること。GitHubでは、リポジトリの"Settings"タブの"Secrets"に掲載されているものすべて。

なお、念のため、これらのトークンが不正使用されていないかもチェックすること。

# 詳細
- [英語の公式声明](https://about.codecov.io/security-update/)
ナイブベイズ 




## はじめに
テキスト分類によく使われるアルゴリズムである、ナイーブベイズを簡単にまとめてみました。ナイーブベイズ は文章の分類やスパムメール判定など、自然言語の分類でよく利用されます。
## 概要
ナイーブベイズは確率に基づいて予測を行うアルゴリズムの一つです。データがあるラベルである確率を計算し、確率が最大になるラベルに分類する方法です。
今回は、ナイーブベイズを用いて、架空のニュース記事タイトルを「映画」と「宇宙」という2つのカテゴリに分類してみましょう。


- 学習データ

|学習データ |カテゴリ|
|---|---|
|あの名作映画が蘇る|映画|
|ド派手アクション映画が封切り|映画|
|蘇った名作に世界が感動|映画|
|砂嵐が火星を襲う|宇宙|
|火星探索ついに再会|宇宙|
|VRでみる火星の砂嵐に感動|宇宙|

- 検証データ

|検証データ|カテゴリ|
|---|---|
|復活した名作アクションに感動|？|


学習データをもとに、未知データのカテゴリが映画である確率と宇宙である確率を計算する方法を考えていきます。

まず、検証データの「感動」という単語に着目してみます。「感動」という単語が出現する確率を素ぞれのカテゴリで見ると以下の表のようになります。

|カテゴリ|「感動」という単語が出現する条件付き確立|
|---|---|
|映画|2/3|
|宇宙|1/3|

表の条件付き確立を見ると、「感動」という単語が現れる確率は、宇宙よりも映画の方が高いことがわかります。
ナイーブベイズでは、文章中の出現確率だけでなく、単語ごとの条件付き確立も用いて、文章内の単語の情報を使い求める確率の精度を上げています。

## アルゴリズム
### 前処理
前処理では、文章をBag of Wardsに変換し、特徴量からなるベクトルとラベルの組みにします。まず、与えられた学習データの文章について名詞のみを抜き出します。学習データから名詞のみを抜き出した結果を下の表に示します。

|学習データ |カテゴリ|
|---|---|
|"名作","映画"|映画|
|"派手","アクション","映画"|映画|
|"名作","世界","感動"|映画|
|"砂嵐","火星"|宇宙|
|"火星","探索","再会"|宇宙|
|"VR","火星","砂嵐","感動"|宇宙|

次に、学習データとカテゴリをデータとして扱いやすいように、学習データは、全体の単語集合から学習データに単語が含まれている時に1とし、学習データに含まれていない時に0とします。また、カテゴリは映画を1、宇宙を0とします。
上記を以下の表に示します。

|学習データ|名作|映画|派手|アクション|世界|感動|砂嵐|火星|探査|再会|VR|カテゴリ|
|---|---|---|---|---|---|---|---|---|---|---|---|---|
|あの名作が蘇る|1|1|0|0|0|0|0|0|0|0|0|1|
|ド派手アクション映画が封切り|0|1|1|1|0|0|0|0|0|0|0|1|
|蘇った名作に世界が感動|1|0|0|0|1|1|0|0|0|0|0|1|
|砂嵐が火星を襲う|0|0|0|0|0|0|1|1|0|0|0|0|
|火星探査ついに再会|0|0|0|0|0|0|0|1|1|1|0|0|
|VRで見る火星の砂嵐に感動|0|0|0|0|0|1|0|1|1|0|1|0|

同様に、検証データの文章の方もBag of Wardsで表現していきます。ここで、検証データには「復活」という単語が含まれています。本来であれば、学習データのBag of Wardsにも復活を含ませ、ラベルを0とするのですが、今回は簡単のため無視します。

|検証データ|名作|映画|派手|アクション|世界|感動|砂嵐|火星|探査|再会|VR|カテゴリ|
|---|---|---|---|---|---|---|---|---|---|---|---|---|
|復活した名作アクションに感動|1|0|0|1|0|1|0|0|0|0|0|？|

## 確率の計算
ここからが本番です。ナイーブベイズでは、学習データを用いて、それぞれのラベルごとに単語が現れる確立を学習していきます。分類時にはラベルごとに確立を求め、確率が高い方を分類結果とします。(これは、ラベルの数が増えても変わりません。)
ナイーブベイズ では、それぞれのラベルが出現する確率と、各ラベルでのそれぞれの単語が出現する条件付き確立を求めます。

※本来であればスムージングと言って、確立が0となるものを0.01を割り振ると言った処理を行いますが、この説明は簡単のため省かせていただきます。

この二つの確立を掛け合わせ比較することで分類を行います。また、ナイーブベイズは、それぞれの単語が独立であるという単純な仮定をおきます。

## Pythonで実行
これまでの処理を、実際にコードで見てみましょう。
今回は、scikit-learnを使用します。

```py
from sklearn.naive_bayes import MultinomailNB
X_train = [[1,1,0,0,0,0,0,0,0,0,0],
           [0,1,1,1,0,0,0,0,0,0,0],
           [1,0,0,0,1,1,0,0,0,0,0],
           [0,0,0,0,0,0,1,1,0,0,0],
           [0,0,0,0,0,0,0,1,1,1,0],
           [0,0,0,0,0,1,0,1,1,0,1]]

y_train = [1,1,1,0,0,0]

model = MultinomialNB()

#モデルの学習
model.fit(X_train, y_train)

#モデルの評価
model.predict([[1,0,0,1,0,1,0,0,0,0,0]])
```

実行結果を以下に示します。

```
array([1])
```
上記の実行結果のように、「映画」と判定されています。

## 最後に
今回は、コードの説明というよりは、ナイーブベイズを簡単に理解することを目的としました。
サンプルコードからわかるように、とても簡単なので、皆さん是非試してみてください。
AWS Cognitoのパスワード忘れ時のフローと設定について

## AWS Cognito とは
こちらのマネージドサービスを使うと非常に便利に以下のような機能をノーコードで実装することができます
- ユーザ認証
- ログイン画面(ログイン認証そのものを含む)
- セッション管理
- パスワード忘れの対応(検証コード送付及びパスワード再設定)※この記事はこれについて解説

## パスワード忘れ時の対応
AWS CognitoはHostedUIを使って提供されてるログイン画面を使うことができます。
ログイン画面でパスワードが分からない場合に「Forgot your password?」をクリックすると、
自動で検証コードが入ったメールがユーザに送られて、
パスワードを再設定することが可能です。
以下、パスワード忘れのフローを使えるようにする設定等について解説します。
なお、こちらの記事は現時点(2021/04/15)のものになります。

## ユーザ登録で必要な設定
### ユーザを登録する時に「Eメールを検証済みにしますか？」にチェックを入れる
Cognito>ユーザーとグループ>ユーザの作成
※こちらはEmailアドレスをユーザーIDに設定した場合の登録方法です。

![スクリーンショット 2021-04-15 22.28.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336049/52ea681e-186a-6f71-f201-447ddf2cf14a.png)

### メールアドレスが検証済みになる
Cognito>ユーザーとグループ>登録したユーザ　以下のように登録内容に「email_verified true」となっていること
**「email_verified true」という状態になっていなければ、ログイン画面で「Forgot your password?」を押して、
パスワード忘れのフローを行っても、実際には検証コードが送られてこないので、必ず検証済みにする必要があります。**
※後日AWSCLIから「email_verified true」に変更することも可能

![スクリーンショット 2021-04-15 22.30.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336049/db2c272b-45f0-8262-520b-561f6a4f51b9.png)

## パスワード忘れ(Forgot your password?)時に送付されるメッセージの登録箇所
Cognito>メッセージのカスタマイズ>「E メール検証メッセージをカスタマイズしますか?」
※改行は反映されないので改行を入れるなら```<br/>```を入れよう
![スクリーンショット 2021-04-15 22.37.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336049/9c2bcc36-9fbf-fdca-ebd1-5fa7fcf04f0b.png)

## パスワード忘れのときのフロー(UIは初期設定のまま)
※この一連の画面は英語のみで日本語に変更することはできない
ログイン画面>「Forgot your password?」をクリック
![スクリーンショット 2021-04-15 22.39.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336049/799f2a0f-c980-a2da-9c47-c093b9bd7008.png)

Emailの入力欄に登録しているメールアドレスを入力
![スクリーンショット 2021-04-15 22.39.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336049/7d6caf66-22e6-4d67-511b-5ec976d2c1c3.png)

検証コードと新しいパスワードを登録する
![スクリーンショット 2021-04-15 22.39.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336049/9b9f36a5-9c9f-13ae-d740-698ce07358e2.png)

## AWS Cognitoのメールに関する制限
AWS Cognitoで使えるリソース(ユーザの登録、ユーザのデータ参照等)はすべて制限値があります。
以下メールとパスワード忘れ時に関するデフォルトの設定です。
※ものによっては上限を上げる希望を出せる

- AWS アカウントごとに 1 日に送信される E メールメッセージの最大数は50件
- パスワードを忘れた場合のコードの有効期限 1 時間
- パスワード忘れ等は1秒あたり30リクエストまで
    - UserAccountRecovery(パスワード忘れ、パスワード変更等)
    - Service Quotas>AWS のサービス>Amazon Cognito User Pools>「UserAccountRecovery」で検索
        - こちらで実際の利用状況をモニタリングできる


## 参照
[Use Cognito Forgot password cannot receive any code with Email](https://stackoverflow.com/questions/60810326/use-cognito-forgot-password-cannot-receive-any-code-with-email)
[のクォータAmazon Cognito(Quotas in Amazon Cognito)](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/limits.html)
※機械翻訳なので日本語のタイトルが非常に味のあるものになっている
createアクションが動かない！【Ruby on rails】

#はじめに
Ruby on Rails チュートリアル（以下：レイチュー）をなんとか２周し終え、意気揚々とオリジナルサイトを作り始めましたが、序盤も序盤createアクションを押しても、ページに何も変化がないという状況になりました。

qiitaに投稿したことがなかったので投稿の仕方を確認する意味合いも込めて解決までの道のりを記していく。

環境
Rails6.0.3, macOS Catalina 10.15.7

#何が起きた？

ユーザー登録機能を実装しようとform_withで雛形を作りいざ登録ボタンを押しても画面に何も変化が起きませんでした。

``` new.html.erb
<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_with model: @user, url: sign_in_path, do |f| %>
      <%= f.label :name %>
      <%= f.text_field :name %>

      <%= f.label :email %>
      <%= f.email_field :email %>

      <%= f.label :password %>
      <%= f.password_field :password %>

      <%= f.label :password_confirmation, "Confirmation" %>
      <%= f.password_field :password_confirmation %>

      <%= f.submit "Create my account", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>
```

コントローラルートなどを確認したが問題はなさそう。(いつものやつ）

``` users.controller.rb
class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      # 保存の成功をここで扱う。
      redirect_to @user
    else
      render 'new'
    end
  end
  
  def show
    @user = User.find(params[:id])
  end
  
  private
  def user_params
    params.require(:user).permit(:name, :email, :password, :password_confimation)
  end
end
```
何があかんのや。。。

#解決
そもそも登録ボタンを押した時にエラーすら出ず、ページにも変化がない為form_withに何か問題があるのではと仮定。
レイチューの登録の章を見ると 「local: true 」がform_withの中に入っていることを確認。
これを入れるとうまく反応するようになりました。

#学び　local: trueはなぜ入れるのか
結論から言うとform_withではデフォルトでAjax通信をしているので非同期通信になるとのこと。
この状態だと必要な箇所だけが更新されて、そうでないところはそのままの状態になってしまう。
ここにlocal: trueと引数を渡す事によって、通常のHTTPリクエストになり、ページ全体が返ってきてページがリロードされるのでうまく動いたと言うことです。

#最後に
レイチューをやっているだけでは躓かなかった箇所で躓いたのでやはり自分で作ってみると言うのは大事だと身をもって実感した。
qiitaの投稿は書いていく内に自分の考えを整理でき、何が分かっていないのかを浮き彫りにすることができるので、自分の勉強のためにも非常に良い。
人の役に立つような発信ができるよう精進していく。

#参考
>@kakudaisuke https://qiita.com/kakudaisuke/items/e032c7705db00e8081dc?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items

記事の書き方なども含めて参考にさせていただきました。
引用する時本人の許可いるのかしら？
qiitaの使い方も勉強します。。。
Haskellを使いながら計算論　【2】自作自然数型とInteger型を対応させる

# 前置き
この記事シリーズの目的は、
>数学やプログラムを知ったかぶる著者が、『習うより慣れろ』の精神で、Haskellを使って計算論を学び、アウトプットしているうちに、いつの間にか計算論を理解しHaskell使いになっていることを目指す

ことで、
Haskellの実行環境構築や基本的な文法について詳細に解説すること、ではありません。

著者はHaskellや計算論のお勉強中なので、誤りなど、なんかよくないことを書いちゃっていたらご指摘いただけると幸いです。

[シリーズ記事一覧](#これまでの記事)はページの一番下に記載してあります。

# 今回の目的
次の２つのインスタンスを対応づける関数を実装すること。

* 前回作成した「自然数を表す」ためのMyNatural型インスタンス
* HaskellのInteger型インスタンス

# 自作したMyNatural型のおさらい

前回は、自然数を表すことを目的として、以下のシンプルな型をMyNaturalという型名で実装しました。
等号関係や順序関係もまだ実装していません（笑

現在のところ、自然数における

* 0の存在
* 「次の値」の存在

のみを表現しています。

```haskell
data MyNatural = Zero | Successor MyNatural deriving Show
```

このMyNatural型ではデータコンストラクタZeroとSuccessorを用いて、

* 0はZero
* 1はSuccessor Zero
* 2はSuccessor (Successor Zero)
* 3は $\cdots$

というように自然数を表そうとしています。

ですが、例えば100を表そうとすると、Successorを100回書かなければいけないので大変です。
そこで、Integer型とMyNatural型を対応づける関数を作成してみようと思います。
（数字って偉大ですね。）

# Integer型からMyNatural型への変換関数　
```haskell
integerToMyNatural :: Integer -> MyNatural 
integerToMyNatural 0 = Zero
integerToMyNatural x = Successor (integerToMyNatural (pred x))
```
predは引数に-1して返すHaskellで用意されている関数です。(succの反対)
xに負の値を許容してしまうと、自然数型を自作する意味がなくなってしまいます。
というか、負の値を与えるとこの関数は発散する。。。

バリデーションは今後検討・実装していくことにして、
一旦、０以上の値を受け取ると仮定して進めます。

# MyNatural型からInteger型への変換関数　

```haskell
myNaturalToInteger :: MyNatural -> Integer 
myNaturalToInteger Zero = 0
myNaturalToInteger (Successor x) = succ (myNaturalToInteger x)
```

こちらは引数のMyNatural型がZeroに収束していくように、関数を再帰的に呼んでいるので、発散することはない、はず。

# 1+2=3 をMyNatural型で計算しInteger型に変換
さて、前回実装したMyNatural型での加算関数myAddと上記２つの変換関数を使用して、
$1+2=3$
を表現してみようと思います。

以下のmain関数では、まずInteger型の1と2をMyNatural型に変換してmyAdd(MyNatural型での加算)の計算をします。
そのあとprint関数で計算結果を

* 変換したInteger型
* そのままのMyNatural型

でそれぞれ出力します。

```haskell
main :: IO ()
main = do
  print $ myNaturalToInteger 
    (myAdd (integerToMyNatural 1) (integerToMyNatural 2) )
  print $ myAdd (integerToMyNatural 1) (integerToMyNatural 2)

data MyNatural = Zero | Successor MyNatural deriving Show

myAdd :: MyNatural -> MyNatural -> MyNatural
myAdd Zero y = y
myAdd (Successor x) y = Successor (myAdd x y) 

myNaturalToInteger :: MyNatural -> Integer 
myNaturalToInteger Zero = 0
myNaturalToInteger (Successor x) = succ (myNaturalToInteger x)

integerToMyNatural ::Integer -> MyNatural 
integerToMyNatural 0 = Zero
integerToMyNatural x = Successor (integerToMyNatural (pred x))
```

実行すると、print関数で計算結果が

```haskell
3
Successor (Successor (Successor Zero))
```

と出力されていて満足です(笑

今回は以上です。
最後までご覧いただきありがとうございました。
<(_ _)> 

# これまでの記事
[Haskellを使いながら計算論　【1】自作自然数型を定義し、加算関数をHaskellで帰納的に定義する](https://qiita.com/kamishi_or/items/df702fa28879b6082fc7)
WordPress開発環境をwp-envで簡単に作る

npmの `@wordpress/env` を使うとメチャクチャ簡単にDockerでWP環境が作れました。
基本的に公式ドキュメント通りに設定するだけです。

https://ja.wordpress.org/team/handbook/block-editor/reference-guides/packages/packages-env/

## @wordpress/env をインストール

```bash
# グローバルに入れるか
npm -g i @wordpress/env

# ローカルプロジェクトに入れる
npm i @wordpress/env --save-dev
```

## WP環境の立ち上げ

```bash
wp-env start
```

おしまい

なんですが個人的に必要な設定など

## 入れておくと便利な設定 

`.wp-env.json` に設定を書きます

```json
{
  // ローカルのテーマを同期
  "themes": [ "./wordpress/wp-content/themes/my_themes" ],
  "mappings": {
    // テーマ以外に同期させたいフォルダ、ファイルの設定
    // アップロードしたファイルも同期させる
    "wp-content/uploads": "./wordpress/wp-content/uploads",
    // DBのDumpデータをインポートしたいので同期
    "import.sql": "./import.sql"
  },
  // 使いたいプラグインを入れる
  "plugins": [
    "https://downloads.wordpress.org/plugin/advanced-custom-fields.5.9.5.zip",
    "https://downloads.wordpress.org/plugin/no-category-base-wpml.zip",
    "https://downloads.wordpress.org/plugin/wp-pagenavi.2.93.4.zip",
    "https://downloads.wordpress.org/plugin/contact-form-7.5.4.zip",
    "https://downloads.wordpress.org/plugin/flamingo.2.2.1.zip",
    "https://downloads.wordpress.org/plugin/favicon-rotator.zip",
    "https://downloads.wordpress.org/plugin/all-in-one-seo-pack.4.1.0.1.zip",
    "https://downloads.wordpress.org/plugin/custom-post-type-ui.1.9.0.zip",
    "https://downloads.wordpress.org/plugin/taxonomy-terms-order.1.5.7.5.zip",
    "https://downloads.wordpress.org/plugin/custom-post-type-permalinks.3.4.4.zip",
    "https://downloads.wordpress.org/plugin/really-simple-csv-importer.zip",
    "https://downloads.wordpress.org/plugin/rs-csv-importer-media-addon.1.1.0.zip",
    "https://downloads.wordpress.org/plugin/tinymce-advanced.5.6.0.zip"
  ]
}
```

### DBのインポート

```bash
npx wp-env run cli wp db import import.sql
```


---

※こちらの記事は自ブログからの転載です

https://akinov.hatenablog.com/entry/2021/04/15/222212
【Flutter】Pods-Runner-frameworks.sh: Permission denied エラーでiOSビルドできない

#Pods-Runner-frameworks.sh: Permission denied とは
他の開発者から受け取ったFlutterプロジェクトをiOSビルドすると出るエラーです。
Gitなどで共有している場合は問題ないのですが、ファイルを直接やりとりすると環境依存ファイルが残ってしまい、エラーになります。

![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535406/b7a006fb-290d-4bba-c8c1-bfa7395a86f4.png)

#対処方法
ターミナルを開き、次のコマンドを実行します。

```
chmod a+x "/Users/[user]/Documents/projects/flutter/[project]/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh"
```

``chmod a+x "対象ファイル"``で、すべてのユーザーに実行権限を与えることができます。
対象ファイルには、エラーのラインで囲った部分を指定します。

これで、ビルドができるようになりました。

#参考
https://stackoverflow.com/questions/19687033/pods-resources-sh-permission-denied-in-ios-project
（メモ）Jupyter Notebookしゅごい、しゅごすぎて思わず統計解析した

# はじめに

最近、今更ながらJupyter Notebookを知り、あまりの便利さに思わず睡眠時間が削られ寝不足です。
何がすごいかというと。

* インストールが簡単。試すだけなら[Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)がある
* マークダウンでささっとドキュメントが書ける
* そのドキュメントの中にpythonやらrubyやらのコードが埋め込め、ブラウザ上でそのまま実行できる
* 実行結果がそのままブラウザに反映される
* HTMLとかjavascriptでちょこっと書いたコードをプレビュー可能
* [matplotlib.pyplot](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.html)なんかを使うとグラフが埋め込める
* プラグインを使ってそのままpdfやHTMLやプレゼン資料にコンバートできる(!!!!!!便利すぎて涙でる!!!!!!!!!!)
* [emacsから編集も可](http://millejoh.github.io/emacs-ipython-notebook/) ←←←←←←←←←←

ほかにも色々あるかもしれませんが、メモとしてはすごく便利で、
慣れないライブラリをちょこっと試してみるときとか、
ちょっとした量のデータをあれこれ試行錯誤しながら加工するときとか、
あれこれ試行錯誤した過程も含めて記録できるのが画期的だと思います。

# なにやるの、そら解析でしょ!!

pythonといえば数値解析のライブラリが充実しまくってることで有名ですが、
私も学生時代に習ったことを思い出しながら簡単な解析をしてみました。

元データとして総務省がだしてる[こちら](https://www.nstac.go.jp/SSDSE/)の都道府県庁所在市別・家計消費データを使いました。
中身は家計調査の⼆⼈以上の世帯の、都道府県庁所在市別、品⽬別（⾷料の全品⽬）、
１世帯当たり年間⽀出⾦額（2017年〜2019年の平均値）です。

# データの読み込みと簡単なグラフ

csvでダウンロードしてきたデータを読み込みます。
(フォントファミリを指定してるのは文字化け対応です。)

```
import pandas as Pd
import matplotlib.pyplot as PyPlot
import numpy as Np

PyPlot.rcParams["font.family"] = "TakaoPMincho" 

d = Pd.read_csv('./SSDSE-2020C.csv', encoding="shift-jis",header=1)
```

続いて、各都道府県別のスパゲッティの年間支出金額をプロットしてみます。
データの中身は都道府県＆市ごとに各品目のデータが入っているので、
都道府県ごとにスパゲティの金額だけ合計すると....

```
sum_spgty = Pd.DataFrame(d.groupby(["都道府県"])["スパゲッティ"].sum())

fig = PyPlot.figure(dpi=120, figsize=(16,9))
sum_spgty.unstack().plot.bar()
```

こんな感じにプロットできます。

![graph-result-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111803/cf2ec1ba-a728-1656-b898-a9fd6149bb77.png)

エクセルで列を選ぶより簡単！！

# 散布図をプロットする

今度はスパゲティの消費金額と餅の消費金額の相関関係を調べるため、散布図を書いてみます。

```
sum_tgt = Pd.DataFrame(d.groupby(["都道府県"])["もち"].sum())  #餅の分を追加で集計

fig = PyPlot.figure(dpi=120, figsize=(16,9)) #画面の大きさ調整
PyPlot.scatter(sum_spgty,sum_tgt)                             #X軸スパゲティ、Y軸もち
```
![graph-result-02-spgty-mochi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111803/00101516-6d84-3d28-fd97-b9de5320d10a.png)

相関係数は求めてませんが、右上あがりの散布図なので、
どうやらスパゲティを消費する人は餅も消費する、という相関関係がありそうです。

# 相関係数をまとめて求めてグラフにする

次に相関係数を求める、というのが教科書の定番ですが、
思い切って他の品目も全組み合わせ求めて一気にプロットしてみます。

```
import seaborn as Sb

df_corr = d.corr() # dは最初に読み込んだCSVのデータフレーム

fig = PyPlot.figure(dpi=120, figsize=(16,9)) #画面の大きさ調整

Sb.heatmap(df_corr)
```

こんだけで

![graph-result-03-heatmap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111803/8834d84d-b583-b3a1-ec97-813ee105bc8f.png)

このグラフ！！！
この手軽さ！！！！
エクセルにはできないでしょ！！！！！

色の白っぽい所が相関が高いところで、黒っぽい所が逆に低いところです。
このヒートマップからざっくりわかるのは、

* 味噌とか合いびき肉は軒並み他の品目と相関が低い→そもそも合いびき肉も味噌も消費金額が低いので相関が低い
* 野菜の消費とほかのほとんどの品目はなんとなく相関がありそう

などです。

ちなみに、相関の傾向が近いものをソートして並べてくれるクラスタマップというのもあって

```

fig = PyPlot.figure(dpi=120, figsize=(16,9))

Sb.clustermap(df_corr)

```

![graph-result-04-cluster.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111803/c29282e6-713a-0776-dbad-d71ca571a85d.png)

といった感じです。

# おわりに

まだ使い始めたばかりですが、ええからやってみなはれ精神を後押しする、
プロトタイピングとか教育用には最高のツールだなって思いました。
あーーー、またまた睡眠時間削られちゃうよーーーーー
[Chart.js]セッションストレージを用いて、ボタンクリックでグラフ種類を切り替える方法

# はじめに
Chart.jsを用いてグラフを作成する機会がありましたので、備忘録がてら記載します。
初投稿になるため、見苦しい部分が多々あると思います。
何卒よろしくお願いします。
※4/19追記　コメントにてご指摘がございましたので、一部編集いたしました。
コメント頂いた方、ありがとうございます。
# 使用するライブラリ
- [Chart.js](https://www.chartjs.org/)

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [ボタンの設置](#ボタンの設置)
1. [ボタンクリックによるイベント実行](#ボタンクリックによるイベント実行)
1. [セッションストレージを使う理由](#セッションストレージを使う理由)
1. [実際に完成したもの](#実際に完成したもの)
1. [参考文献](#参考文献)

<!-- 各チャプター -->
<a id="#c1"></a>
# ボタンの設置
html上に切り替えに使用するボタンを配置
この際、idにグラフ種類をつけておく
※line=折れ線グラフ、bar=棒グラフ、pie=円グラフ

```
<button id="line" onclick=tpchange(this.id) >折れ線</button>
<button id="bar" onclick=tpchange(this.id) >棒</button>
<button id="pie" onclick=tpchange(this.id) >円</button>
```
<a id="#c2"></a>
# ボタンクリックによるイベント実行

まず、グラフ種類の初期値を最初に決めておかないと上手く表示されません

```
var Change_G_type = sessionStorage.getItem('gtype') ?? 'line';
```
<br>
そして、onClickで実行
クリックしたボタンのidをセッション変数に格納して取得。

```
function tpchange(clicked_id) {
  window.sessionStorage.setItem('gtype',clicked_id);
    var Change_G_type = window.sessionStorage.getItem('gtype');
```


<a id="#c3"></a>
# セッションストレージを使う理由
実際、そのままid取ってきて変更すれば良くね？と思うかもしれませんがこれだと動的に数値とかを変えてグラフを更新する際、
毎回グラフの種類がリセットされてしまいます。
グラフを更新しないよ！って人はそのままidから取ってきても大丈夫です。

<a id="#c4"></a>
# 実際に完成したもの
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="NoNameNewNoise" data-slug-hash="eYgKzgm" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="eYgKzgm">
  <span>See the Pen <a href="https://codepen.io/NoNameNewNoise/pen/eYgKzgm">
  eYgKzgm</a> by NNNN (<a href="https://codepen.io/NoNameNewNoise">@NoNameNewNoise</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
<br>
後、グラフ種類を切り替える際にキャンバスを一旦リセットしないと前のグラフが残ってチラチラ映ります。
なので種類を切り替える度にキャンバスを綺麗にしておきましょう

```
    try {
        myChart.destroy();//キャンバスをリセット
    }
    catch {
      //万が一イベント実行時にグラフが存在しなかった場合
    }
```
<br>
質問等ございましたら気軽にどうぞ



# 参考文献
- [Chart.js · Chart.js 日本語ドキュメント](https://misc.0o0o.org/chartjs-doc-ja/)
【Node】Ubuntu にインストールしている Node をダウンロードグレードする

# やりたいこと
Node.js のバージョン管理が可能になる npm パッケージ n を利用して Node.js のバージョンをダウンロードグレードします。


# 環境
* OS：Ubuntu 16.04.7 LTS x86/64bit
* Node.js：v10.24.1


# 手順
Node.js のバージョンを v10.24.1 から v8.17.0 へダウングレードする手順になります。

## n のインストール
```
~$ sudo npm install -g n
/usr/bin/n -> /usr/lib/node_modules/n/bin/n
+ n@7.1.0
added 1 package from 2 contributors in 10.515s
```

## ダウングレード可能なバージョン情報の確認
```
~$ n ls-remote --all
15.14.0
15.13.0
（中略）
8.17.0
8.16.2
（中略）
0.8.7
0.8.6
```

# v8.17.0 へダウングレード
```
~$ n 8.17.0
  installing : node-v8.17.0
       mkdir : /usr/local/n/versions/node/8.17.0
mkdir: cannot create directory ‘/usr/local/n’: Permission denied

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

~$ sudo n 8.17.0
  installing : node-v8.17.0
       mkdir : /usr/local/n/versions/node/8.17.0
       fetch : https://nodejs.org/dist/v8.17.0/node-v8.17.0-linux-x64.tar.xz
   installed : v8.17.0 (with npm 6.13.4)

Note: the node command changed location and the old location may be remembered in your current shell.
         old : /usr/bin/node
         new : /usr/local/bin/node
To reset the command location hash either start a new shell, or execute PATH="$PATH"

~$ node -v
v10.24.1

~$  PATH="$PATH"
~$ node -v
v8.17.0
```


# 参考文献
https://zenn.dev/ymasaoka/articles/using-n-for-downgrade-nodejs
【BigQuery】スケジュールされたクエリで使用される認証情報をサービス アカウントに変更する操作は、現在 Cloud Console ではサポートされていません。

# 結論
タイトル通り。(2021-04-15時点)
![Screen Shot 2021-04-15 at 21.32.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130427/9a075222-d380-7da5-3dcb-9896524c9356.png)

https://cloud.google.com/bigquery/docs/scheduling-queries?hl=ja#updating_the_credentials_of_a_scheduled_query

# 聞いて欲しい
スケジュールされたクエリの更新画面がこれ
![Screen Shot 2021-04-15 at 21.37.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130427/8270c568-7760-775a-9171-e94899e95104.png)
ちゃんとサービスアカウントもリストから選択できて更新ボタン押下時にエラーも無し。

# タイトルの注意事項にハマる時の流れ
1. 「このスケジュールされたクエリ、認証情報はちゃんとサービスアカウントにしてあったっけか？」
2. 「詳細画面見ても誰の認証情報使ってるか記載が無いな。更新画面を見てみよう」
3. 「あれ、「サービスアカウントがありません」って表示されてる。と言うことはサービスアカウントに出来てないのか。更新してみよう」
4. 「あれ、更新ボタン問題なく押せたけど更新画面に再度遷移しても「サービスアカウントがありません」の表示のままで変わってない...。」

ここからサービスアカウントの権限設定見直す等、小一時間の戦い。
ググっても同様現象で困ってる人、おらず、公式ドキュメントを見直してタイトルの注意事項発見。
と同時に、サービスアカウントでスケジュールされたクエリが実行できてるかどうかはクエリ履歴を見れば分かることに気付き、悲しみをQiitaに残すことを決意。

# スケジュールされたクエリ使う諸兄方
滅多に踏むことはないとは思いつつ、気をつけて欲しい。
「操作できる、と言うことは機能として提供されている」とユーザーには受け取られるはずだから、「機能提供出来てないものはそもそもユーザーに操作させない」ようにUIは作らないとな、と開発者として気持ちを新たにさせてくれたGoogleには感謝
DockerでNext.js with-typescript-eslint-jest

##環境

```terminal
ProductName:	Mac OS X
ProductVersion:	10.15.7
BuildVersion:	19H524
Docker version 20.10.5, build 55c4c88
docker-compose version 1.28.5, build c4eb3a1f
```
##Docker準備

```Dockerfile
FROM node:14.16.1-alpine3.13
WORKDIR /usr/src/app
```

```docker-compose.yml
version: '3'
services:
  node:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./:/usr/src/app
    command: sh -c "cd app && npm run dev"
    ports:
      - '3000:3000'
```

##create-next-appコマンドをインストール
```terminal
$ docker-compose run --rm node npm install create-next-app
```

##create-next-appコマンドを実行
templateを```with-typescript-eslint-jest```
プロジェクト名を```app```

```terminal
$ docker-compose run --rm node npx create-next-app --example with-typescript-eslint-jest app
```

##docker-compose up
```terminal
$ docker-compose up
```
http://localhost:3000 にアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112494/51f8a130-3939-95a2-f617-9b5e6ec48111.png)
超初心者がAtomic Designをより理解する為のアドバイス

今までネットでさまざまな記事を読んでAtomic Designについて何となく分かった人は多いと思います。そして原子や分子といった概念を理解すること自体もそんなに難しい事ではないと思います。ですので細かい知識はここでは割愛させていただきます。以下の記事を参考にしてください。
>[「アトミックデザイン」ってなんだろう](https://note.com/mhtcode/n/n49419507c9d1)
>[理解しておきたいコンポーネント指向](https://qiita.com/nabepon/items/723dc53ad584b3457ea7)

ただ、初心者にとってはその知識がいつどのように役立つかがいまいち掴めない事や、私みたいにデザインをすっ飛ばしていきなりコードを書き始めてしまう人は、コンポーネントなどの概念も掴めないまま何度も同じ作業（コード）を繰り返してしまったりします。

##初心者が陥りがちな問題点##
ここでは初心者の超代表格として私を例にして全てお話をさせていただきますが、最初の頃はコンポーネントとういう概念を理解できていない為に同じパーツをどのページにも何度も繰り返して作成しようとします。これは初心者あるあるですね。そこで「コンポーネント化」や「Atomic Designとは」などと検索し分かった気になります。
しかし、いざエディタ上に戻ってみるとどこをどうコンポーネント化して良いか分からなくなります。そして泣きます。

##原因##
これらの原因として以下の事が考えられます。

- きちんとデザインを作っていない為、全てが見切り発車でアプリの全体像が見えていない。
- コンポーネント化できそうなパーツをあらかじめ把握できていない。
- いきなりエディタ上での作業は、他にも考えなければならない余計な要素（関数やオブジェクト、引数など）が多すぎてデザインに集中できず自力でコンポーネント化できない。

##解決策##
これらを解決する為に、デザインツールを使ってまずは全体のデザインをしっかりと作成することにしました。デザインツールはAdobeXdやFigma、その他何でも良いと思います。 
今回私はなんとなくFigmaを使用しました。理由はありません。

プログラミング初学者がデザインツールを使用するメリットとして上記した問題点を解決することができます。

- まず見切り発車だったデザインを、便利なツールを使って綺麗に最後まで仕上げ全体像を把握する事ができます。これだけでもとても大きな違いです。
- いくつもページを作っているうちに、同じような部品を繰り返し書きたくない事に気づきます。一番分かりやすのはWebアプリのヘッダーの部分です。どのページにもだいたい使う事になるでしょう。そこでコンポーネント化を体験します。同じような事をボタンだったり他のことでも出来ないかと考えながらデザインを作っていきます。

- 最も大きなメリットとしては、デザインツール上で行う事でエラーなどの実際のアプリの挙動といった他の要素を気にしなくていいことです。とりあえず目に見える範囲でコンポーネント化出来そうな部分はやっちゃえって感じで良いと思います。

Figmaを使用していると、グループ化という機能があります。グループ化とはアトミックデザインを意識した考え方で、どこまでの範囲をひとまとまりにすると便利になるかを考えた上でグループ化します。正解はありません。最初はパーツを揃えて、必要な時が来たらグループ化します。どこら辺でグループ化すれば良いかは使っているうちにだんだん分かってきます。必要であればコンポーネント化もしてください。
注意しなければならないのは、グループ化＝コンポーネント化ではありません。（似た部分はありますが説明はここでは割愛。）

##苦労した事##
私のようにデザインツールの使い方も全く分からないところからのスタートの人は、まずその使い方を調べて新しい事を覚える為の時間を別で作らないといけない事は事実です。更には、きちんとしたデザイン設計は意外と時間がかかってしまう為、とても遠回りしているように感じ心配になる事がありました。しかし一旦最後まで上記してきた事を意識しながらデザインを完成させると、アトミックデザインとコンポーネントについての理解がとても上がったように感じる事ができました。

##まとめ##
プログラミングをしていると関数などのデザイン以外もコンポーネント化できますが、デザインと違って目に見えるものではない為、最初は概念を掴みにくい部分だと思います。ですので、初心者こそデザインツールを使ってしっかりとAtomic Designを意識しながら、

- 使いまわせる部分はコンポーネント化する事
- 目に見える部分から最初に学ぶ事

が、その後の関数コンポーネントなどを理解しやすくしてくれると思います。

今回はReactなどのSPAを普段学習している人間からの観点となります。他の言語のことは分かりませんので何か当てはまらない事があったらすみません。
記事に間違いがあれば、是非ご指摘とアドバイスも宜しくお願い致します。
この記事が、少しでも同じ苦労を抱えている初学者のお役に立てれば嬉しいです。
Flaskアプリの作成

# 概要

私がFlaskでアプリを作成したときに参考にした記事たちです。
これを全部見れば簡単なアプリ程度であればFlaskを使って作ることができるのでぜひ見てみてください。

#参考記事

1.ecsでのデプロイのコマンド
https://qiita.com/Rubyist_SOTA/items/1ead200bf602569804ea

2.ecsのでデプロイのイメージ
https://dev.classmethod.jp/articles/docker-ecs/

3.自動デプロイイメージ
https://www.fullmarks.co.jp/wp-content/uploads/2019/04/b7d6dba15cabcf325e6ba44063ea3b29-20190423142743.pdf

4.webpackのhotreloadされない問題
→どうやらcontentpathとoutputpathが同じでないといけない模様
https://to2ka.hatenadiary.jp/entry/2017/12/22/003200


5.flaskのjsが更新されない問題
https://qiita.com/pytry3g/items/89b72ec07d3f8188fe47

6.よくわからないけどciが簡単に構築できそうなの
https://tech.smartcamp.co.jp/entry/docker-compose-with-ecs

7.dbありのdocker ecs
https://hacknote.jp/archives/57856/

8.flaskの変数の表示
https://nansystem.com/flask-render_template/
複数のOffice365メールを取り扱う方法

Office365 にて用意されているメール。
便利ですよね。

でも…複数のアカウントを同時併用し必須で使うすることになったら…
混乱の始まりです。
しかもインストールしないで使えって？

実は…今のところ、Office365 では同時に1種類のブラウザから１アカウントしか…
サインインし見ることができないようなのです。
なんてこったい。

サインイン　→　サインアウト　→　サインイン　→　サインアウト
を一日何回も何回も繰り返してませんか？

これを…改善する方法がございました。

無理やりな気もしますが、
別の種類のブラウザを例えば、EdgeとFifeFoxとか…
このブラウザをと進めるわけではないのですが、
別々に…サインインすると、２アカウント同時に使えちゃいます。

マイクロソフトさんが対応してくれるのが一番いいのですが、
それまではこの方法で回避することができますよ。
WSLでChromedriverを使えるようにする

# chromedriverのDL

[公式サイト](https://sites.google.com/a/chromium.org/chromedriver/)から必要なバージョンをDLします。
DL後、zipを解凍したらWindowsTerminalでWSLの `/bin/` に移動

```bash
# CドライブのDownloadsにchromedriverがある
sudo mv chromedriver /bin/cromedriver
# 実行権限の付与
sudo chown 755 /bin/chromedriver
```

`chromedriver` のバージョンを確認

```bash
$ chromedriver -v
ChromeDriver 86.0.4240.22 (398b0743353ff36fb1b82468f63a3a93b4e2e89e-refs/branch-heads/4240@{#378})
```

# 参考

https://qiita.com/sasasoni/items/a690be4a6ada5ceb7d04

https://qiita.com/kozy10/items/49fb49da1b12a410362a

---

※こちらの記事は自ブログからの転載です

https://akinov.hatenablog.com/entry/2020/11/29/143301
原神の３DモデルをBlenderで開いてみた

# 原神の３DモデルをBlenderで開いてみた

## 今回使うもの

* 公式配布の3Dモデル
* blender(blender-2.92.0-windows64)
* blender mmd tools

※インストールの手順は省略します。

### ①3Dモデルを入手

下記の公式サイトから3Dモデルを入手します。
今回は、ストーリーでもまだ謎の多いパイモンを使います。
https://genshin.mihoyo.com/ja/news/detail/5885
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035894/cc3a4bd0-bbc7-3528-bf8d-d01870275341.png)

### ②blender mmd toolsをblenderに適用
①で取得したファイルは拡張子が.pmxとなっており、blenderの初期状態ではインポートができません。
そのため、.pmxを編集可能な3DCG動画作成ソフトウェア「MMD」を使用します。
今回、blender用に提供されている。blender_mmd_toolsを下記から入手し、blenderに適用します。

[blender_mmd_toolsはここから](https://github.com/powroupi/blender_mmd_tools)

ダウンロードしたZIPファイルを解凍すると、いろいろなファイルが入っていますが
mmd_toolsというフォルダをフォルダごとblenderのaddonsにコピーします。
（それ以外のフォルダは無視してよいです。）

C:\Program Files\Blender Foundation\Blender 2.92\2.92\scripts\addons
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035894/2059268e-ef20-e6c8-fe39-c8977fe469df.png)


### ③blenderでファイルを開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035894/55938074-7bb2-ff21-6c2d-0ac8bd2740cb.png)

インポートで①でダウンロードした.pmxファイルを開くとパイモン（？）が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035894/3bea619c-d107-533a-0d31-7628af6fb8fc.png)

しかし、キャラクターの色が反映されません。。。
理由を調べてみると、どうやら色を設定するファイル（テクスチャ）の名称が中国語に設定されており。
ダウンロードしたファイル名と差異があることがわかった。

↓ダウンロードしたファイル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035894/be164693-285e-863f-4aad-3cc53afad07a.png)

↓色の設定情報
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035894/85d525af-0236-94e4-2811-619982caa3ac.png)

「脸.jsp」の「脸」は中国語で「顔」の意味。

### ④3Dモデルを入手（再）

一つずつファイル名を日本語に変更しても良いが、中国の公式サイトから3Dモデルを再度ダウンロードすることにした。
http://ys.biligame.com/gczj/
※とてもわかりにくいが、画面を下にずーーとスクロールしていくと下記のモデルダウンロードが現れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035894/1fec4ba6-fc9b-1d00-7965-4afe6132fb79.png)

ダウンロードしたファイルは拡張子.rarの圧縮ファイルですが、<font color="Red">7zip</font>で問題なく解凍できました。

### ⑤blenderでファイルを開く（再）

お。。。おしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035894/118aea37-261a-7b3e-fb9a-9a835a117db3.png)

一部のテクスチャが反映されていませんが、何とかファイルは開けました。
あとは紐づけを修正すれば大丈夫そうです。

### ⑥テクスチャを設定

変更する方法。

パイモンを選択した状態で、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035894/eb93f821-030d-34fc-0170-ccedc5c3eeda.png)

右下のテクスチャ設定をいろいろと変更します。

* 眼白：Texture⇒設定外す　ToonTexture⇒头发.jpgを設定
* 眼晴：Texture⇒头发.jpgを設定　ToonTexture⇒toon.pngを設定
* 脸：Texture⇒設定外す　ToonTexture⇒脸.jpgを設定
* 皮肤：Texture⇒設定外す　ToonTexture⇒脸.jpgを設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035894/8f1f7d55-f173-389d-ca3d-92cd31b9b429.png)

これでパイモンの3DモデルをBlenderで開けました。
中国語が混ざっているので少し戸惑いますが、修正する箇所さえわかってしまえば他のキャラクターも開けそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035894/58489d5a-1223-7023-19bc-18489df42fb7.png)
WSL2に立てたサーバーに同ネットワークにある別端末からアクセスする

WSL上で開発をしていて立てたサーバーに別端末からアクセスする方法です。  
Macでは何もせずにアクセスできたのですが、WSLの場合、Windows側にポートフォワーディングを設定する必要があります。

### WSLのIPを調べる

`ifconfig` で確認  
`172.21.171.162` の部分

```bash
$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.21.171.162  netmask 255.255.240.0  broadcast 172.21.175.255
        inet6 fe80::215:5dff:fe53:6719  prefixlen 64  scopeid 0x20<link>
        ether 00:15:5d:53:67:19  txqueuelen 1000  (イーサネット)
        RX packets 25699  bytes 10913242 (10.9 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4954  bytes 2993879 (2.9 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (ローカルループバック)
        RX packets 109531  bytes 128195327 (128.1 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 109531  bytes 128195327 (128.1 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
```

### PowerShellでポートフォワーディングを設定

※管理者として実行してください

`netsh interface portproxy add v4tov4 listenport=3000 connectaddress=[先程調べたIP]`

設定されているポートフォワーディングは

`netsh interface portproxy show v4tov4` で確認可能

```bash
PS C:\WINDOWS\system32> netsh interface portproxy add v4tov4 listenport=3000 connectaddress=172.21.171.162

PS C:\WINDOWS\system32> netsh interface portproxy show v4tov4

ipv4 をリッスンする:         ipv4 に接続する:

Address         Port        Address         Port
--------------- ----------  --------------- ----------
*               3000        172.21.171.162  3000
```

---

※こちらの記事は自ブログからの転載です

https://akinov.hatenablog.com/entry/2021/02/19/105857
JetsonXavierのDocker上でYOLOを走らせる


備忘録

https://ngc.nvidia.com/catalog/containers/nvidia:l4t-pytorch
ここのimageを使用する

pip3 install -U pipをする？

yoloのrequirement.txtをそのままpip installすると、torchとpytorchのバージョンが変わってしまうため、txtから削除

txtから、pyyaml, opencvのバージョンも削除

--runtime nvidiaを忘れると、torchが動かない

xtermを入れる

https://qiita.com/ntrlmt/items/c001f0f98da426715cbd

docker-compose