OmniAICreator/Qiita-1.07M huggingface dataset:
Unity : Compute Shaderで Failed to present D3D11 swapchain due to device reset/removed の解決法



UnityのCompute Shaderを使っていると，なぞに落ちたりすることが多々あります．


Compute Shader ([DirectCompute](https://ja.wikipedia.org/wiki/DirectCompute))では現在（2021年）Runtime Error的なものを吐き出してくれず，構文エラー以外の実行時エラーは，コメントアウトをするなどして，たどる必要があります．今回は以下のようなエラーに遭遇し，Unity Editorが落ちてしまいました．

##　エラー： Failed to present D3D11 swapchain

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/c866a4a5-7c14-b83b-95ee-bc8bae4b99c1.png)

```
Failed to present D3D11 swapchain due to device reset/removed. This error can happen if you draw or dispatch very expensive workloads the GPU, which can cause Windows to detect a GPU Timeout and reset the device.  If you believe this error is due to built in Unity functionality, please submit a bug This is an unrecoverable error and the editor will shut down.
```

## 解決法

CPU側でp2gMassBuffer, sortedP2gMassBufferを生成していたのですが，P2GMassという構造体で作成したCompute Bufferだったが↓，

```
GridSortCS.SetBuffer(this.rearrangeParticlesKernel.Index, "_P2GMassBuffer", p2gMassBuffer);
GridSortCS.SetBuffer(this.rearrangeParticlesKernel.Index, "_SortedP2GMassBuffer", sortedP2gMassBuffer);
```

GPU側では，MpmParticleという別の構造体でのCompute Bufferにいれてしまっていました↓．

```
StructuredBuffer<MpmParticle>	_P2GMassBuffer;
RWStructuredBuffer<MpmParticle>	_SortedP2GMassBuffer;
```

そこで以下のように，MpmParticleからP2GMassに変更したところ，エラーが起こらなくなりました．

```
StructuredBuffer<P2GMass>	_P2GMassBuffer;
RWStructuredBuffer<P2GMass>	_SortedP2GMassBuffer;
```

## 最後に

Compute Shaderは配列からindexがはみ出ていたり，今回のような別の構造体のCompute Bufferを使っていてもエラーを教えてくれないので，コメントアウトでどこがエラーの元かを2分探索方式で探していき，最後に絞りこめた行を見て目視であっているかチェックしたり，Compute BufferをC#側にもちかえって，デバッグするしかないので，時間をかけてじっくりデバッグしましょう！

- [Twitterアカウント](https://twitter.com/supertask_jp)
- [YouTubeアカウント](https://www.youtube.com/c/TasukuTAKAHASHI)
【Unity】ボタンをスクリプトから生成する

```C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;


public class ItemPanel : MonoBehaviour
{
    public GameObject btn;
    public GameObject parent;

    // ボタン生成
    public void InstantiateUIBtn(GameObject parent, string name, float pos_x, float pos_y)
    {
        GameObject ui_btn = Instantiate(this.btn, new Vector3(pos_x, pos_y, 0), Quaternion.identity);

        // パネルを親に指定
        ui_btn.transform.SetParent(this.parent.transform,false);
        ui_btn.name = name;

        // クリックイベントを付与
        ui_btn.GetComponent<Button>().onClick.AddListener(() => BtnOnClick(ui_btn));
    }

    // クリックイベント内容
    void BtnOnClick(GameObject btn) {
        Debug.Log("ボタンをクリックしました" + btn.name);
    }
}
```

解説動画
https://youtu.be/Y7Ot3OJWjs4
トラブルシュートメモ　MacからWindowsにリモートデスクトップ接続できない

## 事象
MacからMicrosoft Remote Desktopを使用してリモートデスクトップ接続しようとしたところ「error 0x4」が発生し接続ができない。

## 環境
- 接続元
 - Mac 11.4
 - MicrosoftRemoteDesktop 10.6.7
- 接続先
 - Windows Server 2016 (1607)

## 解決方法
接続先のレジストリに以下を追加する

- HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server
 - DWORDで「MaxOutstandingConnections」を追加し値は10進数で「10000」にする
PowerShellでAzure SQL DBのテーブルをJSON形式でファイルに出力

#はじめに
 Azure SQL Data BasenのテーブルをPowerShellを利用してJSON形式でファイルに書き込む例を記述します。
参考資料に示しますが、Azure SQLやSQL Serverは、JSON形式での出力をサポートしています。このため、今回の例のようにデーターを取り出してから、JSON形式にコンバートする必要はありません。

ファイルの出力形式は、下記の通りです。サンプルコードは、指定したテーブルのすべてのレコードを取り出すため、必要な部分だけ取り出す場合など「nDataGetQuery」を変更してください。

#ファイル出力イメージ
```
[
  {
    カラム名:値,
    カラム名:値
  },
  {
    次の行
  }
]
```

#サンプルコード
```powershell
[string]$TableName = "テーブル名"

[string]$stOutpufile = "c:\work\{0}.json" -f $TableName  #ファイルの出力先を変える場合ここを修正
[string]$nDataGetQuery = "SELECT * from {0}" -f $TableName

[string]$SQLConnect =  "Data Source=AzureSQLサーバー名;Initial Catalog=DATABASE名;User Id=ユーザーID;Password=パスワード"

<#Main#>
$connection = New-Object -TypeName System.Data.SqlClient.SqlConnection
$connection.ConnectionString = $SQLConnect

$connection.Open()
$command = $connection.CreateCommand()
$command.CommandText = $nDataGetQuery

$result = $command.ExecuteReader()
$table = new-object "System.Data.DataTable"
$table.Load($result)

$table | select $table.Columns.ColumnName | ConvertTo-Json | Out-File $stOutpufile -Encoding default

$connection.Close()
```

#参考資料 AzureSQLでのJSON形式の扱い方
[Azure SQL Database と Azure SQL Managed Instance の JSON 機能の概要](https://docs.microsoft.com/ja-jp/azure/azure-sql/database/json-features)

クエリの抜粋

```SQL
select CustomerName, PhoneNumber, FaxNumber
from Sales.Customers
FOR JSON PATH
```
半角スペースだけの文字列に合致する正規表現



```javascript
// 1.空白文字のみの入力（全角スペースは許容する）
// 文字列の先頭から末尾まで半角スペースを1回以上繰り返す（=半角スペースだけで構成された文字列）
hankaku = /^\s+?$/

// 訳
^  : 文字列の先頭
\s : 空白文字（半角スペース、タブ、改行文字、改ページ）
+? : 1回以上指定した文字（上記では\s）を繰り返す
$  : 文字列の末尾

// 2.半角スペースのみの入力
// 文字コードがUTF-8の場合、1.では全角スペースも合致してしまうので直接半角スペースを入力する
hankaku_UTF8 = /^ +?$/

```
Firebaseへのデプロイのために必要なIAMロール (備忘録)

GitHub ActionsからFirebaseにデプロイしようとして権限周りではまったのでメモ。

## そもそも前提条件

サービスアカウント秘密鍵のJSONファイルへのパスを`GOOGLE_APPLICATION_CREDENTIALS`に指定して`firebase-tools`を呼びます。環境変数から直接渡すことはできないので、一旦ファイルに出力してやる必要があります。

```yaml
jobs:
  deploy:
    steps:
      - run: echo "$FIREBASE_SERVICE_ACCOUNT" > /tmp/credentials.json
        env:
          FIREBASE_SERVICE_ACCOUNT: ${{ secrets.SERVICE_ACCOUNT }}
      - run: GOOGLE_APPLICATION_CREDENTIALS=/tmp/credentials.json npx firebase-tools deploy
```

## 各サービスごとに必要なIAMロール

### 共通

`Cloud RuntimeConfig Admin`を指定します。**このロールを指定しないとFirebase CLIが利用できません**。はまりポイント。

![Cloud RuntimeConfig Admin](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534541/ccbe8472-7455-8d82-73ef-e2b3f10ec920.png)

### Firebase Hosting

`Firebase Hosting Admin`を指定します。

![Firebase Hosting Admin](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534541/fccb9ca6-2b1c-6f33-5abb-97049c9ad110.png)

### Firestore

`Cloud Datastore Index Admin`と`Firebase Rules Admin`を指定します。名前通りですが前者がインデックスに、後者がセキュリティルールに対応します。**どこにもFirestoreの文字はない**ので注意。

![Cloud Datastore Index Admin](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534541/eb840a45-2457-4f23-9383-99c3d8984e1c.png)

![Firebase Rules Admin](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534541/f8ff3a16-e996-6e61-2b20-5aafa9afd7f0.png)

### Cloud Functions for Firebase

通常のCloud Functionsと同じく`Cloud Functions Admin`を指定します。

![Cloud Functions Admin](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534541/68f1a228-3831-e088-52c4-788ea915b4ef.png)

Cloud FunctionsのコンテナイメージがCloud Storageに保存されるので、`Storage Object Admin`も指定します。

![Storage Object Admin](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534541/8170cb59-54c2-fe11-d7f6-ce9be266b0a8.png)

Cloud FunctionsにデプロイするIAMユーザーは、Cloud Functionsを実行するIAMユーザーに「成り代わる」権限を持つ必要があります。実行時に使用されるIAMユーザーへのアクセスを、デプロイ時に使用するユーザーに、`Service Account User`ロールで許可します。

![Service Account User](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534541/f57d7c1b-652d-ca7c-4b13-895b2e37b96f.png)

Cloud PubSubを使用する（定期実行など）場合は、`Cloud Scheduler Admin`も指定します。

![Cloud PubSub](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534541/53d212e2-7fe7-4d3d-0bdd-6a9104598bf9.png)

## 参考資料

なお、前項で示したIAMロールの権限が最小かどうかは検証していません。若干過剰かもしれませんが許容範囲かなと思っています。

Firebaseで自動生成される権限周りはかなりガバガバなので、プロジェクト内にFirebaseを導入する場合は気を付けたほうが良いかもしれません。

https://firebase.google.com/docs/projects/iam/permission
投稿した時間を表時させる

#はじめに
投稿した時間が分かればなんとなくいいなと思いました。

![スクリーンショット 2021-07-16 18.44.58（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/56ac724e-5d6c-b400-4ab0-983dd4ec962b.png)

最終的にはこのような形になりました。

#はじめに試したとこ

いつものようにニックネームや写真をビューに表示すればいいかなと思いましたので以下のように記述しました。

```erb
<%= review.created_at %>前に投稿
```

`モデル.created_at`としました。

`created_at`は削除しなければデフォルトでカラムに存在します。

結果は・・・

![スクリーンショット 2021-07-16 18.50.00（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/916b3fd7-f80e-41bc-aa31-85ce22b53707.png)


できてるけど、求めているものとは違う・・・

調べたらこんなものがありました。

[time_ago_in_words](https://railsdoc.com/page/time_ago_in_words)

#結論

```erb
<%= time_ago_in_words(review.created_at) %>前に投稿
```
このように記述すれば成功しました。
初心者の初心者による初心者のためのTypeScript開発

#製作物
今回の作成物は、アルバイトシフト管理サービスです。
初心者の方にとって、ポートフォリオとして有利になるよう進めていく予定です。

以下記事をご覧いただければ、何故ポートフォリオとして有利なのかが書かれておりますのでご参照ください。
参考記事：https://note.com/makaibito/n/naa4852c86d44

#使用言語
TypeScriptを使用して、開発を進めていこうと思います。
※
フロントエンド：react
バックエンド：nestjs
※

選んだ理由は、下記の3つです。
・勢いのある言語
・フロントエンド、バックエンド対応可能
・型定義など厳密な分、基礎能力値が上がると思った



#アルバイトシフト管理アプリについて
まずは、必要な機能をまとめます。

<h3>アルバイトスタッフ側</h3>
<ul>
<li>ログイン</li>
<li>スマホ対応</li>
<li>スケジュール画面</li>
<li>シフト申請画面</li>
<li>就業履歴確認</li>
<li>欠勤申請</li>
</ul>

<h3>管理人側</h3>
<ul>
<li>管理者ログイン</li>
<li>従業員管理画面</li>
<li>新規従業員追加、削除</li>
<li>承認画面</li>
<li>従業員スケジュール画面</li>
<li>昇給／減給</li>
<li>早朝手当、深夜手当</li>
<li>欠勤処理</li>
<li>各種設定画面</li>
<li>月末締め処理</li>
<li>給与明細の発行</li>
</ul>

のような感じです。
詳しい設計書は、スプレッドシートでまとめておこうと思います。
※まだ未完成です…

アプリ設計書：
https://docs.google.com/spreadsheets/d/1SBLxr_DmltvjLyi4HyZUxGC0vE5ILmik9UG2xVEXhaE/edit#gid=0
DB設計書：
https://docs.google.com/spreadsheets/d/1JLTi-gO-mqelaNmn2h5tNilX-WvPlChg5EEwRZlv9r8/edit#gid=0

#最後に
みなさんシーシャは好きですか？
忙しない仕事の日々の中に、ちょっとした余白を生み出すのであればシーシャはお勧めのツールと言えます。
まずはどこでもいいので、足を踏み出してみてください。
非日常が味わえる空間があなたを待っています。

それではまた！
githubのコマンド(クローン〜プルリク)

###### チーム開発でgithubを使ったのでプルリクまでのコマンドをメモ


###元のリポジトリからクローンしてくる

```
$ git clone (リポジトリのURL）
```

###gitファイル初期化


```
$ git remote add (リポジトリ名）　（リポジトリのURL）
```


###gitアカウント認証
```
$ git config user.name （githubユーザ名）
$ git config user.email (githubに登録しているメールアドレス)
```
###ブランチ作成
```
$ git branch (ブランチ名)
```

###ブランチ一覧
```
$ git checkout
```

###ブランチ移動
```
$ git checkout (ブランチ名)
```

##リモートで加えた変更をローカルに反映させるとき
###ファイルのステージング
```
$ git add (変更を加えたファイル名)
```
あるいは

```
$ git add .
```

###変更内容の確認
```
$ git status
```
###コミットメッセージ（変更の説明）の追加
```
$ git commit -m "(コミットメッセージ)"
```
###ローカルへプッシュ
```
$ git push (リポジトリ名) (ブランチ名)
```

<br>

その後はプッシュしたリポジトリにブラウザでアクセスする。
```pull request```タブの上部に
```compare & pull request```ボタンが出現しているのでそこをクリックし、変更内容をチェックして問題なければマージする。
Ubuntu 20.04にWindowsからリモートできるようにする。

# 前置き

自宅へのVPN接続環境はできているので、
まずはどこから、どのPCから、いつ接続しても同じ環境を使えるようにしたい。

とりあえずWindowsから限定だけど、自宅に建てたUbuntuを開発環境として使っていこうと思う。

もともとはCentOSをいじろうと思っていたけどCentOSは８以降が出ない（語弊があるかもしれないが）ので、しばらUbuntuを使用しようと思う。
＝＞正直なところUbuntuのUIはあまり好きではないが、そこはLinuxなのでカスタマイズもできるようになっていければいいと思う。

~~昔はやたらとガジェット張り付けて盛り上がっていた時もあった・・・~~

# こっから

## 

Ubuntuはインストールされているものとします。
RDP接続できるようにUbuntuにxrdpというソフトウェアをインストールします。

```
sudo apt install xrdp
```

Ubuntuではサービスの操作はsystemctlコマンドを使うみたいですね。
xrdpがデフォルトで起動されるように下記のコマンドを投げておきます。

```
sudo systemctl enable xrdp
```

RDP接続用にPORTを開放します。

```
sudo ufw allow from any to any port 3389 proto tcp
```

ubuntu簡単ですね。。。。。
これで設定は完了です！！

と思っていたのですが・・・・・


## 画面が真っ暗！！

IPを確認しWindowsのRDPから接続をしてみようとしたところ、
画面が真っ暗でした！！

どうやら、ログインしていたUbuntuからはログアウトしないといけないようですね。
Windwosのように後からログインしたユーザが奪うような仕組みにはなっていないのかもしれません。

すでにUbuntuにログインしていたユーザをログアウトし、再度Windwosからログインしたら無事にRDP出来ました。

よかったよかった・・・。


## 所管

改めて思うとこんなことですら四苦八苦。
いや、いい思い出というか達成感がある。
素晴らしいです。

やったことは大したことないのは重々称していますし、
ただ先駆者の情報をなぞっただけではございますが、

まずはこの達成感に酔いしれたい。
ゆくゆくはもっといろいろできるスーパーマンになりたいです。

### 参考
https://minokamo.tokyo/2020/08/16/2687/

ありがとうございました。
購読者が増えてしまった times がダルい、リセットしたい、が静かにやりたい

こういう記事書くと Qiita ダメなんだっけ。それなら僕のもう 1 個の記事も一緒に BAN してくれれば……

## どういった課題を解決する記事か

- 皆さんはあらゆる Slack ワークスペースでそれぞれの times を持っていると思います
- 長く続けたり、有益なことを書きすぎてしまうと、参加者が増えすぎてしまい、自分の場所なのに自由なことを書くのを憚りたくなったりしませんか
- そんなこんなでリセット願望がムクムクと湧いてきた人向けの記事です

## vs. 普通に別のチャンネル作ればいいのでは

- 新しくできたチャンネルが通知されるチャンネルとかあって「静かに」やるの難しいですよね

## どうする

- おもむろに archive します
- ある程度時間が経ってから unarchive します
  - なお、手元で試したところ 48 時間では元のメンバーが自動で追加されてしまったので注意
- 誰もいない times を獲得できます

## 注意

- プライベートチャンネルでは参加メンバーがリストアされてしまいます
  - https://slack.com/help/articles/213185307

## はい

平和であることは、よかったですね。
Linuxコマンドの基礎

##　はじめに

プログラミングの学習をする際、Linuxコマンドは活用できているでしょうか？
かっこよくターミナルからファイル操作とかしたいですよね。

ということで、Linuxコマンドを学習していきましょう。

## コマンド一覧

### pwd
**使い方・動作**
現在自分がいるディレクトリを確認することが可能です。
### ls（エルエス）
**使い方・動作**
今いるディレクトリの配下にあるフォルダやファイルを確認できます。
`ls -a`とすることで隠しフォルダも確認できます。
### cd
**使い方・動作**
自身のいるディレクトリから移動できます。
`cd 配下フォルダ`で移動。`cd ..`で１つ上の階層に移動できます。

###mkdir / rmdir
**使い方・動作**
フォルダを作成・削除が可能です。また、`mkdir A B C'とすることで、
A, B, Cフォルダが一括で作成することができます。

###touch / rm
**使い方・動作**
ファイルを作成・削除が可能です。mkdir同様まとめて作成が可能です。

###cp / mv
**使い方・動作**
ファイルをコピーまたは移動することができます。
`cp (ファイル1)　(ファイル２)`で、１のデータを2にコピーできます。
`mv (ファイル) (フォルダ)`でファイルを指定したフォルダに移動できます。

###vi
**使い方・動作**
ファイルをターミナル上で開いて編集できます。
`vi （ファイル名)`で開いたあと、ファイルを編集。
`esc`キーを押下し、`:wq`で保存して終了します。
保存するときエラーがあった場合、`:wq!`で強制保存ができます。

##練習問題

次の手順をターミナルだけで実行しましょう。
①作業用フォルダを作成
②作成したフォルダの中で、さらに2つフォルダを作成
③作成したフォルダの片方に移動
④フォルダ配下に、適当なファイル名で2つファイルを作成
⑤1つ目のファイルに`Hello,World`と入力して保存する
⑥もう片方のファイルに⑤の内容をコピーする
⑦2つあるファイルの一つをもう片方に移動させる。

完成後イメージ

```
username
　　　　　　　　　　　　└──sample
    　　　　    └── FolderA
                    └── sample1.html
          └── FolderB
                    └── sample2.html
```


以上です。
rustでGoogleCloudStorageの署名付きURLを作成する

## はじめに

rustではGCPのクライアントライブラリがないので署名付きURLの生成は独自に実装する必要があります。

ドキュメントを見ると自前で実装するのは大変そうなのでcrateを使用します。

https://cloud.google.com/storage/docs/access-control/signing-urls-manually?hl=ja

[cloud-storage](https://crates.io/crates/cloud-storage)はGCS操作を一通り網羅しているのでさくっと使うにはこれで十分かと思われます。
しかし署名付きURLの生成するためにはメタデータをGCSから取得する必要があり、少し扱いづらいので断念しました。
https://github.com/ThouCheese/cloud-storage-rs/blob/cee9786d7aae821e0615d2420e94434f4dce41eb/src/resources/object.rs#L749

今回は軽量な[tame-gcs](https://crates.io/crates/tame-gcs)を使用します

``` toml
tame-gcs = { version = "0.10.0", features = ["signing"] }
url = "2.2"
```

## やりかた

GCPで必要な権限を付与したサービスアカウントを用意しておきます。

``` rust
fn signed_url() -> Result<url::Url, tame_gcs::Error> {
    let sa = ServiceAccount::load_json_file("./service-account.json")?;
    let options = SignedUrlOptional::default();
    let bucket = BucketName::try_from("some-bucket")?;
    let object = ObjectName::try_from("some-object")?;
    let url_signer = UrlSigner::with_ring();
    let signed_url = url_signer.generate(&sa, &(&bucket, &object), options)?;
    Ok(signed_url)
}
```

exampleにありますが`SignedUrlOptional`でメソッドや有効期限なども設定できます。

https://github.com/EmbarkStudios/gsutil/blob/main/src/signurl.rs


`ServiceAccount`ではなく`KeyProvider`トレイトを利用すると、秘密鍵とメールアドレスだけで生成することもできます。

``` rust
/// Provides the details needed for signing a URL
pub trait KeyProvider {
    /// The actual key used to sign the URL
    fn key(&self) -> Key<'_>;
    /// The identifier for the key author, in GCP this is the email
    /// address of the service account
    fn authorizer(&self) -> &str;
}
```
> https://github.com/EmbarkStudios/tame-gcs/blob/cbbcf29d40533edfc8c930a22249a332cfb0aaf9/src/signing.rs#L69
Kotlinでコルーチンのエラー回避

ネットで探してもわかりやすいのが見つからなかったのでざっくりまとめ

## 出会ったエラー
コルーチンを使おうとしたらエラー
`suspend function 'mySuspendFunction' should be called only from a coroutine or another suspend function`
訳：susupend付きの関数はコルーチン、もしくはほかのsuspend付きの関数から呼ぶべし

コルーチンの中でUIを更新したらエラー
`Only the original thread that created a view hierarchy can touch its views.`
訳：Viewをいじるのは大元のスレッドでやってくんね？

## こんな感じで回避

```Kotlin
private fun functionCaller(){
    // コルーチンの開始はこれ
    GlobalScope.launch {
        mySuspendFunction()
    }
}

private suspend fun mySuspendFunction() = withContext(Dispatchers.IO) {
    /*
    コルーチンを使いたくなる長い処理
    */
    // UIの更新はUIスレッドで行う必要がある。
    runOnUiThread {
        myUiText.text = valueMadeInThisFunction
    }
}
```
直近受信した送信元メールアドレスを一覧化する

# はじめに
こんにちは。今年はまだ美味しいスイカも美味しい桃も食べられていません...。食べて、「あ、スイカだわ。」と思うレベルはいいんです、美味しいのをいただきたい、筆者です :bow:

さて、今回はほっとくと無法地帯になってしまうGmailで、フィルタを整理したいと思い、一旦送信元メールアドレスの一覧を作成しようと思います。

# 直近受信した送信元メールアドレスを一覧化する
受信ボックスのメールを対象にスプレッドシートに書き込みを行います。

また、今回一覧化する目的は、後続に`フィルタ適用をしたい`ため、その振り分けができるように、`件名`も一緒に取得しています。

```js
const main = () => {
  const data = []
  data.push(['No.', 'mailAddress', 'subject'])

  GmailApp.getInboxThreads().forEach(t => {
    t.getMessages().forEach(m => {
      data.push([
        '=row()-1',
        m.getFrom().match(/([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*)/)[0],
        m.getSubject()
        ])
    })
  })

  SpreadsheetApp.getActiveSheet().getRange(1, 1, data.length, 3).setValues(data)
}
```

# 補足
`getFrom()`で送信元メールアドレスが取得できそうですが、実はそうではないんです :sob:

`getFrom()`で取得できるのは以下のような文字列で、この文字列からメールアドレス部分を抜き出す必要があります。
そのため上記スクリプトでは、正規表現でメールアドレス部分を抜き出しています。

# 実行結果
こんな感じになりました！
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/9eb73971-aebc-0876-08c0-d0cccf0a2bed.png)


```
Google <no-reply@accounts.google.com>
```

# おわりに
意外とサクッとできました。
次はフィルタを設定するのですが、手動でやるのは管理が大変なので、GASでやっていこうと思います :muscle: 
GmailAppでは用意されてないので、APIを使用することになると思います :thinking: 

乞うご期待:pray:
【SkyWay】Peerをブラウザのみでマッチングさせる方法(JavaScriptSDK)

作成されたPeer同士を、クライアントサイドのみでマッチングさせる方法を紹介します。

紹介する内容は、偶数番目のPeerが奇数番目のPeerに発信する方法で、Peerが2つ作成されたタイミングでマッチングします。

#接続中のPeerIDを取得する
JavaScriptSDKには接続中のPeerIDを取得するメソッドが用意されています。
`listAllPeers()`を使用することで、SkyWayのサーバからREST APIでPeerID一覧を取得します。
[SkyWayのコンソール](https://console-webrtc-free.ecl.ntt.com/)のPeerID一覧に表示される内容と同じです。

```javascript:sample.js
peer.listAllPeers((peers) => {
  console.log(peers);
});
```

`Peers`に、作成されたPeerIDが配列で格納されます。
複数実行すると、新しいPeerIDを加えた配列が表示されます。

#偶数番目のPeerが奇数番目のPeerに発信する

`listAllPeers()`で取得したPeerIDの数が、奇数の場合と偶数の場合の処理を分けます。

```javascript:sample.js
peer.on("open", () => {
  peer.listAllPeers((peers) => {
    if (peers.length % 2 === 0) {
      // 偶数番目のユーザー
      const OpponentPeerId = peers[peers.length - 2]; // 自分のひとつ前に作成されたPeerID
      console.log(`相手のpeerIDは ${OpponentPeerId} です。`);
      // ここに発信処理
    } else {
      // 奇数番目のユーザー
      console.log(`誰かが ${peer.id} にかけるのを待っています。`);
      // ここに着信処理
    }
  });
});
```

#途中退席した場合の処理

しかし、どちらかのユーザーが途中退出した場合、以下のようなことが想定されます。

1. PeerAが作成される ["A"]
2. PeerBが作成され、PeerAとマッチングする ["A", "B"]
3. PeerBが退出する ["A"]
4. PeerCが作成される ["A", "C"]
5. PeerCがひとつ前のPeerAに発信する ["A", "C"]

この場合、Aが2回着信してしまいます。
これを回避するため、すでにマッチングしたPeerAとPeerBを取得されないようにする処理を追加します。

##シグナリングサーバとの接続を切断する

`listAllPeers()`は、シグナリングサーバに接続されているPeerIDを取得します。
すでにマッチングしたPeerのシグナリングサーバとの接続を切断することで、第三者から取得されることを防ぎます。
つまり、`listAllPeers()`には3つ以上のPeerIDが表示されません。

一度マッチングすれば相手のPeerのあらゆる情報を`mediaConnection`で取得できるため、シグナリングサーバとの通信は必要なくなります。

発信/着信処理の後に以下を追加します。

```javascript:sample.js
mediaConnection.on("stream", (stream) => {
  peer.disconnect();
});
```

`MediaStream`を受け取り次第、`disconnect()`でシグナリングサーバとの接続を切断しています。

##disconnect()にバッファを持たせる

しかし、上記のように`MediaStream`を受け取った瞬間に`disconnect()`を実行すると、必要な情報を取得する前に切断してしまい、映像の取得に不具合が起こります。
記事作成時点で、シグナリングが終了したことを検知する方法が無いので、streamイベントの一定時間後に`disconnect()`することで対応しています。


```javascript:sample.js
mediaConnection.on("stream", (stream) => {
  // ここで一定時間待つ
  peer.disconnect();
});
```

具体的な時間はユーザーの環境にもよるため、一概に何秒と決めることが出来ません。
また、`disconnect()`を待っている間にどちらかが退出した場合、上記のような意図しないマッチングが起きてしまいます。
良い方法があればコメントお願いします:bow:


#参考文献
[公式ドキュメント](https://webrtc.ecl.ntt.com/documents/javascript-sdk.html)
[SkyWay JavaScriptリファレンス](https://webrtc.ecl.ntt.com/api-reference/javascript.html)
WPF+Prismで二重起動防止する方法

## 背景
しばらくWPFを勉強していて、「やっぱりフレームワークを利用するのがいいんだろな」と思い至り、とりあえずPrismから触ってみることにした。
仕事で触ってるWPFアプリでは二重起動防止の仕組みが用意されていることは知っていたけど、そもそも二重起動防止の機能を実装した経験がないので、せっかくなのでWPF+Prismでの実装方法を確認してみようと思った。

## 環境
OS: Windows 10 Pro
IDE: Visual Studio 2019 Community Version 16.10.3
Target Framework: .NET 5.0
使用したFramework: Prism

## 手順
**1. App.xaml と App.xaml.cs を開く**
![2021-07-16_17h56_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488612/3ffef1e4-5625-5a73-ac34-09a1ee2ff287.png)

**2. App.xaml で Startupイベント と Exitイベント を定義**
![2021-07-16_17h59_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488612/866c3e3b-e4cf-48f2-cc2f-2b6c3ac696ac.png)

**3. App.xaml.cs で 処理内容を記述**
![2021-07-16_18h07_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488612/6a15e54c-09a8-6ae2-0551-bd9fd8e33990.png)

## 動作確認
▼1個目起動
![2021-07-16_18h12_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488612/8449f411-10a5-f0bf-f771-f1027d5966a1.png)

▼2個目起動時
![2021-07-16_18h13_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488612/3842b97f-7abd-9f7e-52d9-40d9d64873c6.png)

## 感想
とりあえず参考の通りに記述して書き方は分かったけど、これって別にWPFとかPrism関係なくて、C#の言語仕様で用意された機能だってことに気づいた。笑
今回の記述箇所（StartupとかExit）はPrism独特のものっぽいから、Prism以外で実装するときはそれぞれのエントリーポイントを確認する必要ありかな。

## 参考
* [Prism はじめました【step: 3 .NET Core WPF Prism MVVM 入門 2020】](https://elf-mission.net/programming/wpf/getting-started-2020/step03/)
* [C#のMutexとは？2つの種類と使用方法を理解しよう！](https://www.fenet.jp/dotnet/column/tool/3862/)
setTimeoutの中でthis.stateがundefinedになるときの対処法



```js
console.log(this.state);  // 正しく取得できる
setTimeout(function () {
  console.log(this.state);  // undefined
}, 1000);
```
# 【結論】thisを確定させる
setTimeout内では、関数の呼び出し元がグローバルオブジェクトになるので、thisを確定させる必要があります。

## .bind(this)を使う

```js
setTimeout(function () {
  console.log(this.state);  // 正しく取得できる
}.bind(this), 1000);
```

##  アロー関数を使う

```js

setTimeout(() => {
  console.log(this.state);  // 正しく取得できる
}, 1000);
```

参考文献
https://qiita.com/mejileben/items/69e5facdb60781927929
今日の数学： 正三角形の大きさを求めよ


# 問題

YouTubeで見かけた数学オリンピック対策の演習問題。
内点Pから各頂点までの距離がそれぞれ$a=5,b=7,c=8$であるとき、正三角形の大きさ$x$を求めよ。
![triangle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192430/e443da3d-3d0a-ff35-1953-8e731505a02d.png)

# 解答例

YouTubeでは技巧的な補助線を引いて求めていたが、そんな発想力はないので、
三角関数を使用して、力ずくで解いてみる。

```math
\begin{align}
\cos\phi&=\frac{b^2+x^2-a^2}{2bx}\\
\cos\psi&=\frac{b^2+x^2-c^2}{2bx}\\
\cos\left(\phi+\psi\right)&=\frac{1}{2}=\cos\phi\cos\psi-\sin\phi\sin\psi\\
\left(\cos\phi\cos\psi-\frac{1}{2}\right)^2&=\sin^2\phi\sin^2\psi
=\left(1-\cos^2\phi\right)\left(1-\cos^2\psi\right)\\
\frac{3}{4}&=(\cos\phi-\cos\psi)^2+\cos\phi\cos\psi\\
\end{align}
```

$\cos\\phi,\cos\psi$に$x,a,b,c$を代入して展開すると、$x^2$に関する二次方程式が得られる。
判別式を$D$とすると、以下のように$x$が求まる。

```math
\begin{align}
3b^2x^2&=(a^2-c^2)^2+(b^2+x^2-a^2)(b^2+x^2-c^2)\\
0&=x^4-(a^2+b^2+c^2)x^2+a^4+b^4+c^4-a^2b^2-b^2c^2-c^2a^2\\
x^2&=\frac{(a^2+b^2+c^2)\pm\sqrt{D}}{2}\\
D&=3(b+c-a)(a+c-b)(a+b-c)(a+b+c)\\
\end{align}
```

判別式$D$の因数分解には数式処理ライブラリを使用してみた。

```python
import sympy

x = sympy.Symbol('x')
a = sympy.Symbol('a')
b = sympy.Symbol('b')
c = sympy.Symbol('c')

k2 = -(a**2+b**2+c**2)
k0 = a**4+b**4+c**4-a**2*b**2-b**2*c**2-c**2*a**2
D = k2**2-4*k0
print(sympy.factor(D))
```

```
-3*(a - b - c)*(a - b + c)*(a + b - c)*(a + b + c)
```

今回の問題では、$a^2+b^2+c^2=138, D=120^2$となり、$x=\sqrt{129}$、または$x=3$となる。
$x=3$の場合、点Pは正三角形の外部に位置する。

![triangle_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192430/b8f66501-ea6e-dc6b-dbda-7ed6ab011f4b.png)
git stashランキング

git stash を調べたときに参考になった記事。

#第1位
https://qiita.com/keisuke0508/items/4ad7caf544b1ad631fd7
#第2位
https://qiita.com/madochan/items/b53336541eb135e6c7a4
#第3位
https://qiita.com/fumi238000/items/2b84fa330e99be2e33c6
#その他
https://qiita.com/tundes/items/92f78a50787815ef9f6d
https://qiita.com/fukajun/items/41288806e4733cb9c342

いつもわかりやすい記事ありがとうございます。
【Vue.js】methods内で時間のかかる処理をawaitすると変数のビューへの反映が思ったタイミングより遅いことがある

# 起きること

```vuejs:samplecomponent.vue
<template>
  <div>
    <!-- var1の値が変更されるたびリアクティブに表示も変更されるはず -->
    <p>{{ var1 }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      var1: "oldvalue",
      var2: "piyopiyo"
    };
  },

  methods: {
    hoge() {
      // 1. 変数`var1`を変更する => この時点で表示は変わってほしい
      this.var1 = "newvalue";
      // 2. 時間のかかる処理`heavyProcess()`を待ち、その結果を使って後続の処理を行う（たとえばここではif())
      if (await heavyProcess()) {
        // 3. 後続処理
        this.var2 = "piyo";
      }
    }
  }
</script>
```

## 想定するのは...

awaitより前で`var1`を変更しているので、 2 や 3 を待つことなくビューは変更され`newvalue`と表示されている気がする。

## 実際には...

`hoge()`が終わった時点で表示が変わる。

# なぜ？

> データ変更が検出されると、Vue はキューをオープンし、同じイベントループで起こる全てのデータ変更をバッファリングします。

https://jp.vuejs.org/v2/guide/reactivity.html#%E9%9D%9E%E5%90%8C%E6%9C%9F%E6%9B%B4%E6%96%B0%E3%82%AD%E3%83%A5%E3%83%BC

methods に定義した関数や `mounted()` など**一つのイベントループとみなされる処理**の中で複数の変数を変更するとき、それらの変更は個別にビューに反映されるのではなく、次の *"tick"* が来るときにまとめて反映が始まる。

つまり一つの処理内で`変数var1を変更`=>`何らかをawaitやthen()`=>`変数var2を変更`とすると、`var1`の変更がビューに反映されるのは`var2`の変更を待ってからになる。

# どうすればいい？

> データの変更後に Vue.js の DOM 更新の完了を待つには、データが変更された直後に Vue.nextTick(callback) を使用することができます。そのコールバックは DOM が更新された後に呼ばれます。

`Vue.nextTick()`を利用して強制的にDOM更新を挟むことができる。

```vuejs:samplecomponent.vue
<script>
export default {
  data() {
    return {
      var1: "oldvalue",
      var2: "piyopiyo"
    };
  },

  methods: {
    hoge() {
      // 1. 変数`var1`を変更する => この時点で表示も変わってほしい
      this.var1 = "newvalue";
      // α. DOM更新を起こす
      this.$nextTick(() => {
        // nextTick()のコールバックはDOM更新を待って実行が始まる

        // 2. 時間のかかる処理`heavyProcess()`を待ち、その結果を使って後続の処理を行う（たとえばここではif())
        if (await heavyProcess()) {
          // 3. 後続処理
          this.var2 = "piyo";
        }
      });
    }
  }
</script>
```

こうすれば、 2 や 3 はビューに 1 の結果が反映されてから実行される。

## おまけ

なお、`nextTick()`はPromiseを返すので、await や then() でより直感的に書くこともできる。

```js
await this.$nextTick();
// DOM更新後に行いたい処理
```

```js
this.$nextTick().then(() => {
  // DOM更新後に行いたい処理
});
```
Gitpod立ち上げ時に自動的にメールアドレスをプライベートなものに変更する

# 前書き

Gitpodを立ち上げたとき、git config user.emailとして、登録したOAuthアカウントのメールアドレス（GitHub、GitLabなどに登録したもの）が初期状態で設定されます。
私はこれがイヤです。かといって、git configをいちいち何度も手打ちするのもセンスがないので、下記（[方法2](#方法2)参照）の手法を使って、Gitに登録されてるメルアド変更のスクリプトを作成・実行しています。

## 方法1
git configコマンドをまとめたシェルスクリプトを作りました。

https://github.com/twtwtw-gj/rewrite-git-user-data-bash/

以下これの引用です。

```bash:index.sh
#!/bin/bash

echo "$GIT_AUTHOR_EMAIL"

git config user.name $GIT_AUTHOR_NAME
git config --global user.name $GIT_AUTHOR_NAME

git config user.email $GIT_AUTHOR_EMAIL
git config --global user.email $GIT_AUTHOR_EMAIL
```
`$GIT_AUTHOR_NAME`, `$GIT_AUTHOR_EMAIL`にそれぞれ名前・Eメールを設定して、これを走らせます。

## 方法2

複数行のシェルをいちいち読み取って走らせるのも面倒でしょうから、もっと簡単な方法を用意しました。

1. 環境変数設定

    これは各リポジトリについて1回だけ行えば十分です。ワークスペースを立ち上げ直した後に実行する必要はありません。

    ```bash
    eval $(gp env -e GIT_AUTHOR_NAME=(名前)
    eval $(gp env -e GIT_COMMITTER_EMAIL=(Emailアドレス))
    ```
    ちなみに私は、適当に書き飛ばす場合はdetarame@example.comを使っています。
2. スクリプト読み取り・自動実行

    ```bash
    curl -sL https://raw.githubusercontent.com/twtwtw-gj/rewrite-git-user-data-bash/main/index.sh | bash
    ```

    メルアド登録です。これはワークスペース立ち上げのたびにやってください。
    いちいちGitHubの該当ページを開くのも面倒ですので、curl でのスクリプト読み取りも合わせてワンライナーで行います。

    .gitpod.ymlのinit に書いておいてもいいかもしれません。

    ```yaml:.gitpod.yml
    tasks:
        init: curl -sL https://raw.githubusercontent.com/twtwtw-gj/rewrite-git-user-data-bash/main/index.sh | bash    
    ```

# 終わり

以上です。ありがとうございました。
日本パルスモーター パルスコントロールLSI 基礎学習セミナー 中級セミナーを受講したよ

日本パルスモーターのパルスコントロールLSI 基礎学習セミナー 中級セミナーを受講しました
https://www.pulsemotor.com/event/seminar/PCL-seminar.html
##セミナー概要
初級セミナーは１軸パルスコントロールLSI　PCL6115を
中級セミナーは２軸パルスコントロールLSI　PCL6125の使用方法を説明するものになります。
PCL61X5は以下の軸数を制御できます。
PCL6115：１軸
PCL6125：２軸
PCL6145；４軸
https://www.pulsemotor.com/download/#PCL6125-EB
はじめて触る方は初級セミナーをお勧めします。
##PCL6125搭載評価ボード
FT232HLとPCL6125がSPIで接続されたボードになります。
PCL6125を使う上で重要なのはPCからコントロールするアプリケーションソフトウェア群です。
LSI単体をビット操作でコントロールするだけでなくWindows等からGUIでコントロールできます。
そして、これらのLSIの特徴は補間動作にあります。
直線補間など滑らかに動作させるためには相応の制御が必要になりますがこの補間をLSIがしてくれます。
#使用ハードウェア
今回使用する評価キットは写真のようにしっかりとした梱包で届きました。
![DSC_0417 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/b310b65f-cf32-b255-4eac-545f70511067.jpeg)
ボードを組み立てた様子
![DSC_0436 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/e17d05d0-44c6-fe0f-56af-ee67c067afc3.jpeg)
背面の様子
さすがとしか言えない配線です。
![DSC_0427 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a7203f3b-038b-4c58-8741-b52cd9255bf1.jpeg)
#セミナーの様子
サブボードも使用し行いました。
![IMG_2899.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/1b341c8b-3598-5b30-578d-eec241c0eb72.jpeg)
![スクリーンショット 2021-07-09 130636 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a7eafac3-ea36-30a8-65a2-1bd98fd9f2e9.png)
##SpeedSimulator
ステッピングモーターの動作をシミュレーションするソフトウェアです。
目視では見えない実動作を可視化してくれます。
![コメント 2021-07-09 151844.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c800a25f-1ba0-4580-f819-9535f2a5f3d9.png)
#モーションパターンビルダー
PCL6125の動作をフロー図により構築できます
GUIのフローで制御できるのは便利ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f0bd7fe9-36d4-98b8-fc70-2c94a565b10c.png)
パルスコントロールLSI_基礎学習セミナー_中級_実習編_210601.pdfから引用
#アプリケーションソフト
![スクリーンショット 2021-07-16 152324.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/b33969d8-be5f-fac9-7d70-d2a2e6c3ec84.png)
今回メインで使用するソフトウェアになります。
直線補間や簡易制御などの動作からエンコーダーやリミットスイッチなどの動作までを把握、コントロール可能です。
通常なら、これらのアプリケーションは自分で作る必要があるだけにすべて準備しておいてもらえるのは本当に楽です
#総評
ステッピングモーターをArduino等で動かすことはあれどWindowsなどのPCから直接コントロールすることはあまりないのではないでしょうか？
マイコンを使用せずに、細かな補間動作を含みつつ制御をしたいという方にこれらのLSIがお勧めだと思います。
MMSgmentationをGoogle Collaboratoryで使ってみた


# はじめに

先日チャレンジしようとコンペティションでセグメンテーションの課題があって、Deeplab v3を使おうと思ったのですが、うまく動作させることができなかったです。

物体検知では、普段MMDetectionを使っているのですが、同様にMMSegmentationといういうものがあったので、使ったみようと思ったのですが日本語の解説記事が見当たらなかったので使いながら解説をしてみようかと思います。

# 概要

以下になります。

https://github.com/open-mmlab/mmsegmentation 


2021年の「Vision Transfer」や「Swin Transfer」も利用できるようですし、かなり更新されているようです。（2021/7/16現在）

まずは、以下のチュートリアルに従って、デモの実行をしてみたいと思います。

https://github.com/open-mmlab/mmsegmentation/tree/master/demo 

## チュートリアルの実行

とりあえずチュートリアルに従って、実行していきます。

```python
# Check nvcc version
!nvcc -V
# Check GCC version
!gcc --version
```

チュートリアルに記載のmmcvのバージョンでは動作せず、mmcv 1.3.7以上が必要と言われたので以下のように変更しています。

```python
# Install PyTorch

!pip install torch==1.8.0+cu111 torchvision==0.9.0+cu111 torchaudio==0.8.0 -f https://download.pytorch.org/whl/torch_stable.html

# Install MMCV
!pip install mmcv-full==1.3.7
```

mmsegmentationのダウンロード及びインストール
（継続して使うのであれば、googleドライブ上に移動してから実行してください。）

```python
!rm -rf mmsegmentation
!git clone https://github.com/open-mmlab/mmsegmentation.git 
%cd mmsegmentation
!pip install -e .
```

インストールチェック

```python
# Check Pytorch installation
import torch, torchvision
print(torch.__version__, torch.cuda.is_available())

# Check MMSegmentation installation
import mmseg
print(mmseg.__version__)
```

チェックポイントのダウンロード

```python
!mkdir checkpoints
!wget https://open-mmlab.s3.ap-northeast-2.amazonaws.com/mmsegmentation/models/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes/pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth -P checkpoints
```

```python
from mmseg.apis import inference_segmentor, init_segmentor, show_result_pyplot
from mmseg.core.evaluation import get_palette
```

デモファイルのセグメンテーション予測の実行

```python
%cd /content/mmsegmentation
device = "cuda" if torch.cuda.is_available() else "cpu"

# build the model from a config file and a checkpoint file
model = init_segmentor(config_file, checkpoint_file, device=device)

# test a single image
img = 'demo/demo.png'
result = inference_segmentor(model, img)

# show the results
show_result_pyplot(model, img, result, get_palette('cityscapes'))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004109/a5f006fd-5c3d-d7b1-c4ef-c4afd93bc2ea.png)

とりあえず、今回はチュートリアルデモの実行までとします。

次は、実際にデータを使った学習方法について、記載したいと思います。

次回の記事

https://qiita.com/ryosao/items/0ada096efddaac0ee803

https://qiita.com/ryosao/items/d753a7d2c01f4c3f520f
【React】react-routerを使用した画面遷移の方法

# サンプルコード
```.ts
import { useHistory } from 'react-router-dom';

const history = useHistory();

// 履歴を追加する
history.push('/foo');

// 履歴を書き換える
history.replace('/foo');

// 履歴を2つ進める
history.go(2);

// 履歴を1つ戻る
history.goBack();

// 履歴を1つ進める
history.goForward();
```
独学プログラマーのまとめ　その4

#初めに
よくわからない部分もあるが突き進むのも大事。


###5章　コンテナ
コンテナはデータ構造を保持する。

- 愚者はいつまでも悩み、賢者は尋ねる。
    -「いつまでも」というのがポイント。自分で考えて無理なら直ちに尋ねる。 

- メソッド
    -関数に似た概念で特定のデータ型に密接に関連付けられている関数。通常の関数と違うのは呼び出し方。 

```python
"Hello".upper()      #後ろにつけている
```
> 'HELLO'

- リスト
    - 好きな順番でオブジェクトを保存できるコンテナ。
    - list関数か[]でリストが作成できる。
    - 繰り返し処理で要素を1つずつ取り出せるオブジェクトは__イテラブル__(繰り返し可能)。
    - リストは__ミュータブル__(変更可能)。
    - append メソッドでリストの末尾に要素を追加できる。
    - pop　メソッドでリストの末尾から要素を取り除ける。

```python
colors=["blue","green","yellow"]
print(colors)

colors.append("black")
print(colors)

item=colors.pop()
print(item)

print(colors)
```
> ['blue', 'green', 'yellow']
['blue', 'green', 'yellow', 'black']
black
['blue', 'green', 'yellow']


- タプル
    - 好きな順番でオブジェクトを保存しておけるコンテナ。
    - タプルは__イミュータブル__(変更不可能)。
        - 変更不可能の利点は変わってほしくないデータを扱うのに便利ということ。
- 辞書
    - 2つのオブジェクトを関連付けて保持するコンテナ。
    - __キー__を使い__バリュー__を保持する。
    - dict もしくは　{}　で書ける。
 

コンテナの中にコンテナも可能。
    
 

# まとめ
辞書を勉強する。
未経験からCCNA取得までの道のり　ver12

RSTPについて！

RSTPはIEEE802.1wで定義されているSTP(IEEE802.1d)の改良版で、収束にかかる時間を短縮するための技術が追加されている！

【ポートの状態と役割】
RSTPのポートの状態は Discarding,Learning,Forwardingの3種類で、STPに比べてDiscardingが新たに定義されました。（逆にSTPのDisabledとBlockingとListeningはDiscardingに統合されて無くなりました。）

また、RSTPのポートの役割では、STPのブロッキングポートに、「代替ポート」または「バックアップポート」という役割を与えて、ルートポート(Root Port) , 指定ポート(Designated Port) , 代替ポート(Alternate Port) , バックアップポート(Backup Port) という4つの役割にわけている

【シェアードリンクとポイントツーポイントリンク】
RSTPは、スイッチ間の接続を「シェアードリンク」と「ポイントツーポイントリンク」の2つに分類しています。

🚩シェアードリンクに分類されるのは、スイッチ間にハブが入っている接続です。また、スイッチのポートが半二重に設定されている場合もシェアードリンクに分類されます。
シェアードリンクの場合はSTPタイマーを使った収束を行います。

🚩ポイントツーポイントリンクに分類されるのは、スイッチのポートが全二重に設定され、スイッチが1対1で接続されている場合です。
ポイントツーポイントリンクの場合はSTPタイマーに依存しない高速収束を行います。
___
【STP】（Spanning Tree Protocol）
STPとは、冗長構成のスイッチドネットワークでレイヤ2のループを防ぐために考え出された機能です。
STPでは、ブロッキングポートと呼ばれる（非指定ポートとも呼ばれる）ポートを選出します。ブロッキングポートは、データフレームを転送しないことによりループを防ぎます。

【STPの便利な法則】
「ルートブリッジのポートは全てDP」　「RPの対向ポートは必ずDP」
※リピータハブを利用する場合や、ケーブルの両端を自身のスイッチに接続するような特殊な場合を除く

【STPの基本用語】
ブリッジID（BID）：ブリッジプライオリティ(デフォルト32768)＋MACアドレス
ポートID：ポートプライオリティ(デフォルト128)＋ポート番号
ポートパスコスト：ポートが動作している速度によって決められる値（速度が速いほどコストが低い）
ルートパスコスト：ルートブリッジまでのポートパスコストの総和（ルートブリッジからのBPDU受信時にルートパスコストに加算される）
BPDU：スパニングツリープロトコルを実装しているスイッチ間で情報を交換するために利用するフレーム（ルートブリッジのIDやルートブリッジ等が含まれている）
セグメント：LANセグメント（コリジョンドメイン）

【スパニングツリーの情報の確認】
スパニングツリーの情報は以下のコマンドで表示できます。
＃show spanning-tree [vlan {VLAN番号}]
VLAN・・・指定したVLANで構築しているスパニングツリーの情報を表示

【ブリッジプライオリティ】
ブリッジプライオリティはスイッチの優先度を表す値です。
ルートブリッジの選出やポートの役割を選出する際に用いられ、プライオリティ値の小さいスイッチが優先されます。
___

このSTPとかDTP周辺がめちゃくちゃ難しい！！！
【Playfab】CloudScript内でサーバー内にデータが存在するか確認する方法

　チート対策等でPlayfabのCloudScript内でサーバー内のデータを取得することがあるだろうが、その時にKeyがなければエラーになる。そういうときのエラーハンドリング
a.Data == nullやa.Message == "Error"等では無理だったので連想配列の鍵チェックでやる


``` a.js
handlers.Test = function(args, context){
    //Get user data
    var dataRequest = {
        "PlayFabId": currentPlayerId,
        "Keys": "ErrorTest"
    }

    var serverData = server.GetUserReadOnlyData(dataRequest);

    if("ErrorTest" in serverData.Data){
        //鍵が存在するときの処理
    }else{
        log.info("Error");
        //鍵が存在しないときの処理
        //UpdateUserData等で作成もできるので、
        //データがないからと言ってこの時点で作成するのは効率が悪そう
    }
    return;
}
```



ドキュメントではtry catchでやっているので好きなほうで

```b.js
"use strict";

handlers.GenerateError = () => {
    try {
        server.GetPlayerStatistics({
            PlayFabId : "non-existing-player-id"
        });
    } catch (ex) {
        let error = ex.apiErrorInfo.apiError.error; // In this case - "InvalidParams"
        let errorCode = ex.apiErrorInfo.apiError.errorCode; // In this case : 1000
    }
}

```


https://docs.microsoft.com/en-us/rest/api/playfab/server/player-data-management/get-user-data?view=playfab-rest#userdatarecord
ベクトル演算 (python,numpy)

## 0. 前処理

$d=3$として

```python
import numpy as np
x=np.array([1,2,3])
y=np.array([4,5,6])
z=np.array([7,8,9])
s=np.array([x,y,z])
```
とします.

## 1. 内積(inner product)

```math 
x,y\in\mathbb{R}^d,<x,y>=x^{\rm T}y=\sum^{n}_{i=1}x_iy_i
```

```python
np.dot(x,y),x@y
>> (32,32)

```

## 2. 内積の逆(正式名称知りません)
```math 
x,y\in\mathbb{R}^d,xy^{\rm T}_{i,j}=x_iy_j,xy^{\rm T}\in\mathbb{R}^{d\times d}
```

```python
np.outer(x,y)
>>  array([[ 4,  5,  6],
           [ 8, 10, 12],
           [12, 15, 18]])
```

## 3. その他
```python
from numpy import linalg as LA
# 二次形式
x@s@x==228
>> True
# lp-ノルム
p=2
LA.norm(x,ord=p)==3.7416573867739413
>> True
# 無限のるむ
np.max(x)==3
>> True
# 行列式
LA.det(s)==0.0
>> True
# 逆行列
try:
     LA.inv(s)
except LA.LinAlgError:
     print('not singular matrix')
>> not singular matrix
# フロベニウスノルム
LA.norm(s,'fro')==16.881943016134134
>> True
# 行列のpノルム
p=1
LA.norm(s,ord=p)==18.0
>> True
# 行列の無限ノルム
np.max(s)==9
>> True
```
最高のWeb開発プログラミング言語は何ですか？

さまざまなプログラミング言語がさまざまなプログラミング技術をサポートしており、それぞれに複雑さがあります。 さらに、新しいプログラミング言語がどんどん出現しており、それはまばゆいばかりです。
以下は、Web開発に最適な厳選されたプログラミング言語の一部です。各言語を選択する理由を詳しく紹介します。
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/5672757b-2a0b-6777-d6cd-b2bbb875b00d.jpeg)

##1.JavaScript
JavaScriptがWeb開発者によって最も人気があり言語の1つであることは間違いありません。さらに、Webアプリケーション、フロントエンドとバックエンド、およびモバイルアプリケーション（React Native）を同時に構築できる唯一のプログラミング言語です。
クライアント側のJavaScriptは非常に安全で高速であり、クライアントブラウザですばやく実行できます。 さらに、JavaScriptは比較的簡単に習得できます。
**特徴：**
1）動的型付け
2）クライアント側の検証
3）機能的なスタイル
4）通訳言語
5）プロトタイプベース
6）オブジェクト指向プログラミングのサポート
7）ブラウザでのより詳細な制御
8）プラットフォームに依存しない
9）非同期処理
##2.Python
Pythonは、最高のWebプログラミング言語の1つでもあります。 ソフトウェアエンジニアの約44％がこのプログラミング言語を使用しており、JavaScriptに次ぐものです。
Pythonは高級で、初心者にやさしいプログラミング言語で、簡単な文法を持っています。そして各種のライブラリとツールをサポートしています。また、Pythonはオブジェクト指向やスクリプト言語として、強力なタイプで、デバッグ速度も非常に速いです。
**特徴：**
1）簡単で学びやすい
2）幅広いライブラリ
3）良好な可読性
4）Web開発での人気は高いです。
5）優れたフレーム
6）バックエンドの複雑なタスク
##3.PHP
PHPは、主にWebアプリケーション、単純な動的サイトのサーバー側、WordPress、Facebook、またはFlickrの開発に使用されるスクリプト言語です。PHP Web開発は.NET，Bzip 2またはApacheを含む複数の無料オープンソース拡張をサポートしています。また、マイクロソフトSQL、MySQL、Serverなどの異なるデータベースへのアクセスも提供しています。
**特徴：**
1）使いやすい
2）PHPソフトのアップグレードはとても楽です。
3）PHPはオープンソース言語です。
4）Web開発のコストは非常に低い。
5）PHPの資源は入手しやすいです。
6）PHPの言語サポートはweb開発時間を減らすことができます。
7）PHPを使うと開発時間が短縮できます。
##4.Java
大企業で人気のあるもう1つのオプションであるJavaプログラミング言語を忘れるはずがないでしょう。Javaは、エンタープライズレベルのWebアプリケーションを作成するために広く使用されています。 ご存知のように、このプログラミング言語は非常に安定しており、多くの大企業が使用しています。
最適なWebプログラミング言語を探しているなら、Javaを試してもいいです。また、JavaはAndroidアプリケーションの開発にも広く使われています。今はほとんどの企業がAndroidアプリを必要としています。Androidは数十億人のユーザーを持っています。
**特徴：**
1）豊富なオープンソースライブラリ
2）自動ごみ収集とメモリ割り当て
3）分散コンピューティングに最適
4）オブジェクト指向プログラミングパラダイムをサポートします
5）スタック割り当てシステムがあります
6）Java仮想マシン機能のおかげで最高のプラットフォーム独立性
7）安全性が高い
8）マルチスレッドをサポート
##5.Ruby
RubyはWeb開発に非常に適したプログラミング言語でもある。Python、PHPと同様に、Rubyも簡単に学べますので、初心者にもぴったりです。
Railsは、データベース、Webページ、およびWebサービスのデフォルト構造を提供するmodel-view-controllerフレームワークです。 データ送信用のXMLやJSON、ユーザーインターフェイス用のCSS、HTML、JavaScriptなどのWeb標準の使用を促進します。
**特徴：**
1）オープンソース、汎用、解釈型プログラミング言語。
2）純粋オブジェクト指向言語。
3）構文はシンプルで明確です。
4）PERLやPythonに似たサーバーサイドスクリプト言語。
5）PERLやC ++などに関連する構文があります。
6）Rubyで書かれた大きなプログラムは簡単に管理できます。
7）Rubyスクリプトに直接適用される強力な組み込み関数のセットがあります。

##結論
最適なWeb開発言語を選ぶには、多くの要因を考慮する必要があります。将来の発展方向が定まらないうちに、プログラミング言語を自由に選択することはできません。
様々な言語の機能と特性を詳しく調べて、なぜ特定の言語がWeb開発に適しているのかを知る必要があります。
また、実際の状況と需要を結びつける必要があります。

**参照リンク：**
[What Are The Best Programming Language For Web Development](https://www.javaassignmenthelp.com/blog/best-programming-language-for-web-development/)
ASP .NET Core モデルの値をクリアしたい

Createアクションの実行後、連続でCreateしたいため、Create後の画面遷移を`return RedirectToAction(nameof(Index));`でなく、`return View();`でからっぽのモデルをセットして、同じCreateに戻したい時がある。
その際に、ついでに、登録完了のメッセージを出したい。
しかし、単純に`return View(model);`で値をセットしても、ModelStateに状態を持っているため、画面側は更新されない。
`ModelState.Remove("列名")`でプロパティの値を、`ModelState.Clear()`でモデルのエラーがクリアされる。
それらを考慮して、以下のような感じで作った

```
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind("Feedback")] UsersFeedback usersFeedback)
        {
            if (ModelState.IsValid)
            {
                usersFeedback.CreatedAt = DateTime.Now;
                _context.Add(usersFeedback);
                await _context.SaveChangesAsync();
                ModelState.AddModelError("", $"ご意見・ご要望ありがとうございました。"); //メッセージをValidationErrorのところに表示
                ModelState.Remove("Feedback"); //消したい属性
                return View();
            }
            return View(usersFeedback);
        }
```


元ネタ：
ModelState.Clear() is required to display back your model object
https://patrickdesjardins.com/blog/modelstate-clear-is-required-to-display-back-your-model-object
まずは、これからやっていきたいことについて。

# だからまだタイトルなんてないんだ！

## Qiitaのコンプラに引っかからないよね・・・・？

パソコン大好き、でも焦って何もできていない35歳。
とりあえずは何かを書く習慣をつけてみる。
まずはこっからだと思っている。がんばれ俺。

## とりあえずなんでも箇条書きにしてみる

1. Markdownもほとんど初めて
1. いろいろはじめて
1. やりたいこといっぱい
    1. フロントエンド
        1. Vuejsしたい。（JS全般だけど）
    1. バックエンド
        1. いまいちパッとしないが、セキュアな接続とか考えたい。
    1. アーキテクチャの勉強（クリーンやらなんやら）
    1. 設計思想の勉強（TDD,DDDやら）
1. ハードウェアも大好き
    1. esxiで遊んでたい。
    1. NASももっと有効活用したい。（HDDばかり増える）
1. ネットワークも大好き
1. 機械学習については今のところあまり興味がない・・・


# Todo
1. とにかく自分がどこでも、いつでも同じ開発環境を利用できるようにしたい。
どこでも同じ環境でできるっていうのは素晴らしいことだ。
まずはこれを ~~覚書~~ 記事にしていきたいな。
Laravel の CRUD を丸暗記して、感じたこと。

基本的な Laravel の CRUD のコードをたくさん書いていて、知らず知らずのうちに丸暗記してしまいました...

今回は、CRUDのコードを丸暗記する「前」と「後」で、個人的に思ったことや感じたことを少しメモに残せたらなと思います。

# CRUD のコードを丸暗記して感じたこと

## 正解は、「１つ」じゃない。

何度も、CRUD のコードを書いているうちに、自分が打っている CRUD のコードの他にも、同じような意味を持つコードが複数あることに気づき始めます。特に、YouTube で CRUD 系の動画を拝見していると、投稿者の「好み」によって、CRUD のコードの書き方に特色がでてきます。

**:open_mouth: 「この動画の投稿者は、こういう書き方が好きなんだ！」**

とか

**:sob: 「自分の書いていたコードより、めっちゃシンプルなコードやん...」**

とか、**丸暗記していたおかげで、自分のコードと、相手のコードを比較することが安易になります。** もちろん、丸暗記しなくてもコードの比較はできますが、暗記しているおかげで、コードの理解が深まったり、正解は1つじゃないんだ、と思うようになりました。

## 理解できなかったコードが、理解できるようになる不思議

最初は理解できないコードでも、何度も同じコードを書いていると、後々理解できるようになることが多いです。とても不思議なことなのですが、コードを書いているうちに、**「あっ！これって、こういうこと！？」**というような感じで理解できちゃう場面があります。

もちろん、今 Laravel の本体内部のコードを見ても、いまだに理解はできませんが、CRUD や、小さなアプリを作成するような教材等は、最初はワケの分からないコードだと思っていても、複数回、繰り返しコードを書いていると、「あっ、こういうことか！」と理解できる場面がきっとあります。

個人的なお勧めは、教材を学ぶ際、**最初の１回目は「さらっと感じだけ掴んで」、２、３回目で「しっかり理解する」**。という感覚で勉強したほうが良いのではないかと思います。




## 簡単なアプリが作りやすくなる

当たり前っちゃ当たり前の話なのですが、CRUD はアプリの基本的な機能ですので、仕組みを理解し覚えていれば、簡単なアプリを作成しやすくなります。アプリを拡張する際も、基本は CRUD を応用する感じがほとんどだと思うので、初学者ほど、CRUD を早めに理解するべきなのかなと思います。

:thinking: **「でも、暗記しなくてもコピペでもええやん？」**

↑ もちろん、その通りです！

コピペでも、暗記でも、コードが一緒なら結果も一緒です。ですが、コピペだと、**コードの内容を理解しないまま貼り付けるケースが多々あります。**個人的には、これがとても問題だと思っています...

自分の話ですが、コピペで貼り付けたコードの場合、あまりコードの内容を覚えていないことが多く、再度、同じ処理のコードを書こうとした際に、「ど、どんなコード書けば良いんだっけ…」と、なってしまいます。

コピペも良いとは思いますが、**最初のうちは、自分で手を動かしてコードを書きながら覚えていく** のが、よりベターなのかなと思っています。

## 少しだけ、「自信」がついた感じがする

「丸暗記できる、ワイってすごいやん？」という根拠のない自信がつきます。:sweat_smile:
GitHubパーソナルトークンのベタ書きが嫌なのでキーチェーンで管理した

GitHubのトークン形式が変更され、パーソナルトークンやOAuthトークンのリセットが強く推奨されている。

https://github.blog/2021-04-05-behind-githubs-new-authentication-token-formats/

パーソナルトークン再発行のタイミングで、せっかくなのでトークンをキーチェーンで管理してみた。
元々、設定ファイル類は `dotfiles` リポジトリで管理していたが、GitHubのトークンをベタ書きするわけにもいかずどうしようかと考えていた。
そこで、キーチェーンでトークンを管理して設定ファイルから読み込むようにすれば、うっかりpushできる。


# キーチェーンへの登録

操作には `security` コマンドを使う。
ここではHomebrew用のパーソナルトークンのサービス名を `ghp.homebrew` にした。
コマンドの実行履歴にトークンを残さないよう `-w` オプションを引数なしで指定すると、パスワードの入力プロンプトが表示される。

```sh
$ security add-generic-password -a $USER -s ghp.homebrew -w
password data for new item:
retype password for new item:
```

登録された。
特に何も指定せずとも `security` コマンドからはアクセスできるようだった。
`-T ""` のように空文字を指定するとデフォルトのアクセス権を削除できるとのこと。

![keychainitem.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379/462bf859-9e36-ee2c-06cf-b0ababd691fb.png)

# キーチェーンから参照

取得する際 `-w` オプションを付けるとパスワードだけを取得できる。

```sh
$ security find-generic-password -a $USER -s ghp.homebrew -w
ghp_XXXXX...
```

あとは設定ファイル類で必要なところで上記のコマンドを書いておく。
これでpushできる。

```sh:config.fish
# homebrew
set -gx HOMEBREW_GITHUB_API_TOKEN (security find-generic-password -a $USER -s ghp.homebrew -w)
```
DataFrame 参照

##参照とは
Dataframeのデータは行と列を指定することで参照ができる。
参照の方法は幾つかあり、ここではlocやilocを扱う。
主に、locは名前による参照、ilocは番号による参照を扱う。


##名前による参照
DataFrame型のデータの名前（インデックスやカラム)を使って参照する場合は、DataFrame型の変数dfに対して下記のように指定する。

```
df.loc["インデックスのリスト", "カラムのリスト"]
```
```python
# DataFrameを作る
data = {"furuits": ["apple", "orange", "banana"],
              "year": [2001, 2002, 2003], 
               "time": [1, 4, 5]}
df = pd.DataFram
display(df)
```
![スクリーンショット 2021-07-16 17.02.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736279/085d5df6-dedf-eef7-056b-0b018dcd2394.png)

```python
df = df.loc[[1, 2], ["time", "year"]]
display(df)
```
![スクリーンショット 2021-07-16 17.05.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736279/2604ea09-a7f7-e8b2-4983-516e0cfaead8.png)

行(インデックス)の1と2の要素で、列（カラム)の"time"と"year"の要素を取得できた。

##番号による参照
インデックス、カラムの番号でDataFrame型のデータを参照する際はilocを使う。

```
df.iloc["行番号のリスト”,"列番号のリスト"]
```

```python
#先ほど作ったDataFrameに対して
df = df.iloc[[1, 2], [0, 2]]
display(df)
```

![スクリーンショット 2021-07-16 17.25.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736279/34cafa04-c8ba-7908-cc15-1d753ba7419a.png)
AngularでHello,world／メニュー

# TL;DR
このページは「AngularでHello, world」のメニューページです。

## メニュー
- 初級編
  - [環境準備](https://qiita.com/shuji-k/items/4c05655c37d08a10a041)
  - [Component](https://qiita.com/shuji-k/items/afeda7bb627f72cfdd59)
  - [テキスト補間](https://qiita.com/shuji-k/items/f27c774b6d5af41b040e)
  - [変数バインディング](https://qiita.com/shuji-k/items/23862e0959de1577ef11)
  - 入力
  - ルーター
  - Service
  - ngModule
  - 非同期処理
  - Web API
  - スタイル
- 中級編
  - Component ライフサイクル
  - Directive
  - 外部Moduleのスタイル変更
  - テストコード
  - Angular Material
- 上級編
  - スタイルのスコープ
  - Module
  - JIT/AOTコンパイル
- API編
  - (Angular の API を追加していく予定)


# はじめに
2000年代はじめ、私の学生時代に「JavaでHello, World」というサイトに大変お世話になりました。
Javaの各APIでHello, worldを出力するという小さなテーマで、Javaの使い方を解説されたサイトでした。
ただ、今はそのサイトは閉鎖され、もう見ることはできず残念です。

翻って最近、業務でAngularの入門となるサイトを聞かれることが、多々ありました。
基本的に公式HPのチュートリアルを紹介するのですが、実際の業務での使い方を伝えづらい点や、いまいち初心者向きではないなあと思うところがあり、ならば自分で書いてしまおうと思い至りました。

# 環境
各解説ページに特筆がない限り、以下環境を使います。

OS: Windows10
確認ブラウザ: Chrome
Node.js: 14.16.1
npm: 6.14.12 (Node.jsに同梱されているバージョン)
Angular: v11.2.14
Editor: [Visual Studio Code](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)

# 全体概要
記事は大きく、初級編、中級編、上級編の3段階と、APIの解説に分けます。
初級編では、Angularで初歩的なWebアプリを作る上で必要になることを説明しようと思います。
中級編では、もう一歩踏み込んだ内容を説明します。中級編まで理解してもらうと、AngularでWebアプリを作るのに困らなくなるのではと思います。
上級編では、アプリ制作にあたって把握している必要はないですが、Angularの理解を深める目的で説明しようと思います。
これを記述している段階では、まだ記事を書いていないので、項目の追加削除や移動があることを、ご了承ください。
Ansible用のCentOS8をインストールする

#概要
Ansibleは自動構築ツールとなり、複数台のOSを構築する上でメリットがあるツールとなります。
Ansibleには以下の特徴があります。
Q
・Agentless
・Linux、WindowsのOSに対応している。


また、本記事は以下が前提となります。
・Hyper-V上にCentOS8のインストール
・最小限のインストールを実施
・Ansibleをインストールする上で注意事項を記載
・操作はrootユーザを使用


#環境

|種別 |ソフトウェア|
|---- |-----------|
|ハイパーバイザ |Hyper-V(Windows 10 2004)|
|OS|CentOS8|

#事前準備

・CnetOS8 のisoダウンロード

#手順

## CentOS 8のインストール


・CentOS 8のインストールウィザード

~~~
1.言語は「日本語」を選択する。
2.日付と時刻を「東京」に変更する。
3.ソフトウェアの選択を「最小限のインストール」に変更する。
4.「インストール先」を選択して「完了」をクリックする。
5.「ネットワークとホスト名」は「優先的に接続する」をONにする。
6.rootのパスワードを設定する。

~~~

・すべてのパッケージをアップデート
CentOS 8.3に同梱されているPythonの場合、setuptoolsの不具合によりpip3を使用したAnsibleのインストールができないことがわかっています。なので、パッケージのアップデートが必要が必要です。以下のアップデートのコマンドを記載します。

~~~

・全てのパッケージのアップデートコマンド

dnf upgrade

・Pythonのアップデートコマンド

ip3 install --upgrade pip setuptools

~~~

・その他メモ

~~~
・コンソールでは日本語表示できない。
　→CentOS8にはbogl-btermがなさそう。
~~~


#Windowsを管理する時のメモ

1.PowerShellのバージョンアップ

Ansibleの要件としてPowerShell バージョン 3.0 および .NET Framework 4.0 以降が必要となり、Ansible Documentationにてバージョンアップスクリプトの「Upgrade-PowerShell.ps1」
が用意されています。

「Upgrade-PowerShell.ps1」で、PowerShell 5.1にバージョンアップできます。
※.Net Framwork 4.5.2以下の場合は4.5.2になるようです。

また、2021/08/01時点の情報ですが、Ansible Documentationのコマンドを実行した場合以下のメッセージがでます。

"2" 個の引数を指定して "DownloadFile" を呼び出し中に例外が発生しました: "要求は中止されました: SSL/TLS のセキュリティで保護されているチャネルを作成できませんでした"

コマンドを実行する前に以下のコマンドを実行しておくのが良いと思います。

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12


Windows Server 2016と2019はすでにPowerShell 5.1なので、
「Upgrade-PowerShell.ps1」を実行する必要はないと思います。
Windows Server 2016で実行しても以下の結果となります。

INFO - current and target PS version are the same, no action is required


参考としてWindows Server 2016と2019のPowerShellと.Net Frameworkのバージョンを
以下に示します。

■Windows Server 2019
PowerShell:5.1.17763.1007
.NET Framework:4.7.2


■Windows Server 2016
PowerShell:5.1.14393.693
.NET Framework:4.6.2
子オブジェクトを一括で削除する(Unity2019.4.13f)

# 目的
・子オブジェクトを一括で削除したいとき
・大量にインスタンス化したオブジェクト消したいとき

# 動作イメージ
![ex11.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043128/d25c9461-1884-be0a-093a-d44fefa9c00b.gif)

# スクリプト

```delete_all_children.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class delete_all_children : MonoBehaviour
{
    private void Start()
    {
        foreach (Transform n in this.gameObject.transform)
        {
            GameObject.Destroy(n.gameObject);
        }
    }
}
```

# 使用方法
消したい子オブジェクトの「親オブジェクト」にスクリプトをアタッチする。
（「動作イメージ」の場合は、「can_move_area」にアタッチする）