OmniAICreator/Qiita-1.07M huggingface dataset:
asyncioのawaitとcoroutine実行を理解する

awaitはcoroutineの処理が完了するまで待つ。
複数のcoroutineを並列に走らせるにはasyncio.gatherを使うのだが、複数のcoroutineを並べてawaitするとどうなるのか。


まずはgather。
```python main.py
import asyncio
import time

async def func(sleep):
    print(f"{int(time.time())} func start sleep:{sleep}")
    await asyncio.sleep(sleep)
    print(f"{int(time.time())} func end sleep:{sleep}")

async def main():
    print(f"{int(time.time())} main start")
    sleep_task1 = asyncio.create_task(func(sleep=1))
    sleep_task2 = asyncio.create_task(func(sleep=2))
    await asyncio.gather(sleep_task1, sleep_task2)
    print(f"{int(time.time())} main end")

asyncio.run(main())
```

```output.log
1663209464 main start
1663209464 func start sleep:1
1663209464 func start sleep:2
1663209465 func end sleep:1
1663209466 func end sleep:2
1663209466 main end
```

全てのcoroutineが並列に実行され、完了するまで（つまり`sleep_task2`が完了するまで）待っている.

ではawaitを並べてみる。mainを書き換える.

```python
async def main():
    print(f"{int(time.time())} main start")
    sleep_task1 = asyncio.create_task(func(sleep=1))
    sleep_task2 = asyncio.create_task(func(sleep=2))
    await sleep_task1
    await sleep_task2
    print(f"{int(time.time())} main end")
```

```output.log
1663209617 main start
1663209617 func start sleep:1
1663209617 func start sleep:2
1663209618 func end sleep:1
1663209619 func end sleep:2
1663209619 main end
```
なんとなく、sleep_task1の完了を待ってからsleep_task2を開始するのかなと思ってたが、gatherを使った場合と変わらない。並列に開始し、sleep_task2が完了するまで待っているようだ。

ではこうするとどうなるのか

```python
async def main():
    print(f"{int(time.time())} main start")
    sleep_task1 = asyncio.create_task(func(sleep=1))
    await sleep_task1 # create_taskの間に挟む.
    sleep_task2 = asyncio.create_task(func(sleep=2))
    await sleep_task2
    print(f"{int(time.time())} main end")
```

```output.log
1663209991 main start
1663209991 func start sleep:1
1663209992 func end sleep:1
1663209992 func start sleep:2
1663209994 func end sleep:2
1663209994 main end
```
この場合はsleep_task1の完了を待ってからsleep_task2を開始し、完了を待っている.
awaitは、**awaitを実行した段階でasyncio.create_taskによりスケジュールされているcoroutineのみを実行開始し、完了を待つようだ。**

では2つのcoroutineを`asyncio.create_task`でスケジュールするが、awaitを1つしかしない場合どうなるのか.

```python
async def main():
    print(f"{int(time.time())} main start")
    sleep_task1 = asyncio.create_task(func(sleep=1))
    sleep_task2 = asyncio.create_task(func(sleep=2))
    await sleep_task1
    # await sleep_task2 # sleep_task2はawaitしない.
    print(f"{int(time.time())} main end")
```

```output.log
1663210406 main start
1663210406 func start sleep:1
1663210406 func start sleep:2
1663210407 func end sleep:1
1663210407 main end
```

こちらはなんとなくsleep_task2は実行されないのではと思ってしまうが、`sleep_task1`と`sleep_task2`は並列に開始されている。だが、awaitしていないsleep_task2は完了しないままプロセスが終了している.

`await`を実行すると処理が走るので、awaitは「指定されたcoroutineを実行し、完了まで待つ」という認識を持ってしまうがそうではなく、awaitはあくまで「指定されたcoroutineの完了を待つ」。
**実行されるcoroutineはawaitするまでにスケジュールしたcoroutine**である。
そしてawaitしていないcoroutineは実行されても当然完了を待たない。


## まとめ
- awaitを実行した時、それまでにcreate_taskでスケジュールされたcoroutineが実行される。
- awaitはあくまで待つsynctaxである。開始する処理を指定するものではない。
MediatorLiveDataでNullPointerExceptionが出たときの対処法

### はじめに
以下のエラーが出た。

> at androidx.databinding.ViewDataBinding.updateRegistration(ViewDataBinding.java:653)

```java:ActivityMainBindingImpl.java
if (vModel != null) {
    // read vModel.isNetworkError
    vModelIsNetworkError = vModel.isNetworkError();
}
pdateLiveDataRegistration(0, vModelIsNetworkError); //この行で上記のエラー
```


>Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.lifecycle.LiveData.observeForever(androidx.lifecycle.Observer)' on a null object reference
~~~java:MediatorLiveData.java
void plug() {
    mLiveData.observeForever(this); //この行で上記のエラー
}
~~~

### 書いたコードの概要

viewModelをbindする形でレイアウトを作成。

~~~xml:activity_main.xml
<include
    layout="@layout/view_network_error"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:isNetworkError="@{viewModel.isNetworkError}"
/>
~~~

~~~Kotlin:MainViewModel.kt
val isNetworkError = MediatorLiveData<Boolean>().apply {
    addSource(loadingResult) {
        this.value = it == State.ERROR
    }
}

private val resultState = MutableLiveData<State>().apply {
    value = State.SUCCESS 
}
~~~

### 原因と修正

mLiveDataのobserveでぬるぽが出ているためaddSourceの対象であるLiveDataが原因であると推測。

結果として宣言順が問題の原因であったため、以下のようにaddしているLiveDataを先に宣言して修正。

~~~Kotlin:MainViewModel.kt
private val resultState = MutableLiveData<State>().apply {
    value = State.SUCCESS 
}

val isNetworkError = MediatorLiveData<Boolean>().apply {
    addSource(loadingResult) {
        this.value = it == State.ERROR
    }
}
~~~

そりゃそうなんですけどね。
宣言順、気をつけましょう🥺
Sales Enablement（旧My Trailhead）でモジュールをインポートする方法

SalesforceにはSales Enablementがあります
今回はSales Enabementでモジュールをインポートする方法をおすすめします


### 備考

※Sales Enablementは2022年8月現在英語のみの設定画面です。なので今回の解説も英語の文字が多いです。ご了承ください



### そもそもSales Enambementってなんだ？

Sales Enablement（旧My Trailhead）は自分でTrailheadのモジュールみたいなものが作成できてユーザに公開して楽しく簡単にTrailheadのような学習方法を提供できるツールです



![step000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/2bd20cbb-4129-2675-ce8a-9b6ad263ac1b.png)


### ステップ01 Trailmaker画面の「Modules」からModulesを探す
![step01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/efd9ffc9-d1ed-95bd-e3c9-c0b37002bfdf.png)

### ステップ02 　Moduleを「DownLoad」する
![step02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/df121d69-aaf7-8619-b987-e1835336b3b1.png)


### ステップ03
Trailmakerの「Content」から「Add Content」をクリックし「Exisiting Content」をクリックする
![step03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/52b9ab17-4022-30cf-1fa1-c5bcae56a82a.png)
![step04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/72df3aba-87bf-1a8b-2410-78e7a3f53ac9.png)


### ステップ04 　ステップ02でDownLoadしたModuleを「Import」する

![step05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/95919dea-1312-2c9d-bb21-1d6cca9100d8.png)


### ステップ05 My WorkSpaceにModuleがあるか確認します

![step07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f5b58a18-5794-2820-0c02-7a4ae37d1ca6.png)
DjangoでQuerySetをJSONResponseする

Djangonのモデルから引っ張ってきたQuerySetをそのままJSONで返そうとすると怒られてしまう。
```python
users = CustomUser.objects.filter(prefecture = 'yamagata')
data = { 
    ...
    'users' : users,
    ...
}
return JsonResponse(data)

```

```terminal
TypeError: Object of type QuerySet is not JSON serializable
```

## 解決

`.values()`で値を取り出して`list()`でリストに変換。

```python
users = list(CustomUser.objects.filter(prefecture = 'yamagata').values())
data = { 
    ...
    'users' : users,
    ...
}
return JsonResponse(data)

```

`serializers.serialize`などを使ってJSONに変換しても通るが、template側でJSON.parseしなければならず、こちらの方がシンプルだった。
【エラー】Gatsby.jsをNetlifyへデプロイした時の【npm ERR! code 1】の解決方法【修正】

Gatsby,jsにてコーポレートサイトをローカルで作成し、完成したのでNetlifyへデプロイしようとした所エラーに遭遇。
800行近いエラー分が吐き出されたので最初の部分のみ抜粋。
![スクリーンショット 2022-09-15 11.25.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1076062/a3e1eb90-8bd5-eb53-386f-39c08a280547.png)
とりあえずまったくわからないため、最初の部分```npm ERR! code 1```で調べてみることにした。

そうするとどうやらnpm(Node.jsのパッケージを管理するシステム)の依存関係が原因でどうやらエラーになってるっぽいので、
まず下記コマンドで依存関係をリストします。
```bash
npm outdated
```
そうすると色んなパッケージのリストが表示されます。
それを全て最新にアップデートしていくのですが、公式では1つ1つ```npm install {package}@latest```するように推奨されていますが、めんどくさいので依存を最新にしてくれる npm-check-updates を使います。
```
npm install -g npm-check-updates
```
その後下記コマンドで、package.jsonも最新のパッケージにアップグレードします。
```
ncu -u
```
最後にパッケージをインストールします。
```
npm install
```

僕の環境ではこれでデプロイできました！
めでたいめでたし！

<h2>参考にした記事<h2/>
【Gatsbyをv3にアップグレードしてgatsby-blog-starterもアップグレードした】

https://zenn.dev/tomm6073/articles/6b3775f9b55aaf

【npm ERR! の対処法】

https://qiita.com/wafuwafu13/items/2fe43414aa6e1899f494
チームのFormsフォームは最初からグループフォームで作ろう

意気揚々と個人フォームからグループフォームに変更したあとに当該Formsを利用していたクラウドフローがエラーを吐きだしたので、ログに残します。。

### 個人フォームとグループフォーム

これは先日開催された[Microsoft MVPの祭典 2022](https://www.avepoint.com/jp/events/webinar/microsoft-mvp-conference-2022)で中村太一さんが紹介してくださったもので、
Teamsチームで「Formsを用意して申込してもらうようにしよう」という場面があったときに個人フォームで作って権限の設定操作をしていませんか？グループフォームで作れば編集権限や回答の参照権限の設定からは解放されますよー、
という内容でした。

#### 個人フォーム

https://www.office.com/ からサインインしFormsを選んで遷移すると画面左上に「＋新しいフォーム」のボタンがあります。これをクリックするともれなく個人フォーム扱いとなります。


#### グループフォーム

画面の下のほうに「自分のグループ」があります。自分が参加しているグループ（Teamsチーム）ですね。この中からフォームを作りたいグループを選択すると、画面左上に「＋新しいグループフォーム」のボタンが表示されます。ここで作成したフォームがグループフォームになります。


### 個人フォームからグループフォームに移動する

自分の個人フォームから、グループに引越ししたいフォームの「…」（その他のオプション）をクリックするとメニューがでてきます。移動をクリックすると画面右に引越し先のグループが表示されるので"正しい"引越し先をクリックしましょう。というのも。。↓

### ただしグループフォームにした後個人フォームに戻すすべはない

とのことです（2022/9/15現在）。操作をミスして意図しないグループに移してしまうとグループ間のフォームの移動も個人フォームへの復旧もできなくなりますのでオペミス厳禁でお願いします。


### 個人フォームからグループフォームに移動できるのは、フォームの作成者本人だけ

誰かが作成した個人フォームに編集権限を付けてもらっても、付けてもらった人側からグループフォームに移すことはできません。「予期せぬエラーが発生しました」と表示されてしまいます。最初からTeamsチーム内でフォームを作成するか、作成者にグループフォームに移す作業をしてもらいましょう。

### クラウドフローは再設定しなおす

Formsコネクタのトリガーを利用していたクラウドフローではグループフォームに変更後にフローが起動すると「CDB TableNotFound. Inner Message: {"error":{"code":"NotFound","message":"Table '　内部で作成されているテーブルID？　' cannot be found","innerError":{"code":"TableNotFound","params":["　内部で作成されているテーブルID？　"]}}}」エラーで処理が失敗するようになりました。おそらく個人フォーム時代の内部パラメータを参照しにいってエラーになったのでしょう。。

クラウドフローの再設定方法ですが個人フォームではなくなったので、カスタム値でフォームのIDを入力する必要があります。

https://idea.tostring.jp/?p=5864

URLからID以降の文字列を取得してカスタム値に設定します。後続の「応答の詳細を取得する」アクションのフォームIDやさらに後続のアクション内でFormsの動的コンテンツはパラメータがバケバケになってしまっているので再設定しなおして保存しましょう。リランして差しつかえなければ失敗した実行履歴を動かしましょう。


### 添付ファイルはどこに格納されるのか

個人フォームの場合OneDrive(自分のファイル > Apps > Microsoft Forms > フォーム名)でした。グループフォームに変更した後、フォームの添付ファイルはどこに保存されるのでしょうか。

クラウドフローの失敗履歴をリランして確認しました。
SharePoint Onlineのメニューからグループフォームを持っているTeamsチームのSPOに移動します。初期設定のままであれば「最近のアクティビティ」というパーツが設定されているかと思います。ファイル自体をクリックするのではなくフォルダ名をクリックして辿っていくとどこに添付ファイルが格納されたのか確認ができます。

TeamsチームのSPO > ドキュメント（もしくはShared Document）> アプリ > Microsoft Forms > フォーム名のフォルダ

となります。

### おまけ

MVPの祭典、Teamsの裏のSPOの存在知っていた方がいいの？など自分がモヤモヤしていたことや知らなかったことについてとらえ方・考え方を提示してもらえる素晴らしいイベントでした。今年２回目でしたが３回目以降も開催されることを祈っております！
MVPの皆さんのブログやSNSのフォローするとともに、技術者コミュニティに参加しましょう！
controller作成がうまくできないとき

# 開発環境
ruby 3.1.2 Rails 6.1.7です。

# 概要
投稿アプリを作るときにusersコントローラーを作ろうとしたが作れなかった。

# その時のエラー
`const_get': uninitialized constant Users　

        Object.const_get(camel_cased_word)
              ^^^^^^^^^^ (NameError)

rails g controller users index show editを実行したときに出てきて解決できなかった。<br>

# 解決方法
様々な記事を見ていると、「devise_for :usersのせいでルーティングがおかしくなっている」という記事を見つけた。試しに、自分のroute.rbからdevise_for :usersをコメントアウトしたら解決した。



参照　https://qiita.com/blackpeach7/items/dd71417bf0b0ef937369
MacでChromeが起動しない時の対処法

# ある日突然、MacでGoogle Chromeが起動しなくなりました
バージョン等：MacBook Pro 14inch 2021, MacOS Monterey 12.5.1


アプリケーションのアイコンをクリックしても一瞬起動中表示になるのですが、直ぐに何事もなかったかのように表示が切り替わり、Chromeが起動しません。グーグル様に聞いてみると、再起動から再インストールまでのお決まりの方法が載っているだけで、**ググる前に既に100回ほど試している**方法だけでした。一つだけ、アップルのサービスの指示通りにいろいろと深いところまで触ったら直った、というような記事がありました。残念な事に、その方は技術者ではなく詳しいことは分からないので省略、という寸止めの記事となっておりました。ただ、遠隔操作で直せるようなものでかつ、ちょっと技術者じゃないと分かり難いという程度の問題であることが分かってヤル気が出ました。

### やった事：
1. ターミナルから起動してみた
`cd /Applications/Google Chrome.app/Contents/MacOS/`
`./Google Chrome`
起動しないが、ログが出力される

2. ログを確認してみた
エラーが発生していたので中身を見てみる。
`Failed to unlink *****Singleton***`
なんだと！？ファイルが消せないというエラーが複数個出力されている、、、、
シングルトン起動したいらしいが、何らかの原因で前回起動時のシングルトンファイルが消せなくなっており、二重起動という判定で起動出来ないことが判明！マジ！？**天下のGoogle様でもシングルトン起動制御はロックファイル**なんや！なんか他に良い手はないんかい！

3. **Singleton制御ファイルと思われるファイルを削除**
`sudo rm *Singleton*`

4. 起動確認
**OK!**

:::note warn
rmで必要なファイルも消えちゃう可能性があります。慎重にやるならば、Singleton制御ファイルらしきファイルを一つずつmvして起動確認する方が良いでしょう。
:::
Object.entires の値をswitch 分岐に合わせて型解決


`switch(key)` のkey に応じて、`value` の型を解決させたい

## Union

基本的には、複数の型を作ってUnionで定義してあげることになるかと思う。

```ts
// こんな感じ
type IncreaseAction = { type: "INCREASE"; payload: { value: number } }
type DecreaseAction = { type: "DECREASE"; payload: { value: number } }
type DebugAction = { type: "DEBUG"; payload: { fn: () => void } }

type Action = IncreaseAction | DecreaseAction | DebugAction;

const runner = (action: Action) => {
  switch(action.type) {
    case "INCREASE": {
      return console.log(action.payload.value + 1);
    }
    case "DECREASE": {
      return console.log(action.payload.value - 1);
    }
    case "DEBUG": {
      return action.payload.fn();
    }
  }
}
```

## `Object.entires`

ただ、１つのオブジェクトにkey,value がまとまってるときはObject.entries を使うことになる。ObjectEntiresを解決できる型を用意してあげればできる。

```ts
const attributes: Attributes = {
  k1: "Hello",
  k2: 100,
  k3: () => console.log(":D"),
};

type Attributes = {
  k1: string,
  k2: number,
  k3: () => void,
}

type AttributesPair = ObjectEntries<Attributes>;

const runner = (pair: AttributesPair) => {
  const [key, value] = pair;
  switch(key){
    case "k1": {
      // value の型が stringに解決する
      return console.log(value, " World!")
    }
    case "k2": {
      // value の型が numberに解決する    
      return console.log(value+11, "is 111.")
    }
    case "k3": {
      // value の型が `() => void` に解決する    
      return value();
    }
    default: {
      const _: never = key; // in order to detect ts check
      throw new Error(`invalid data. ${_}`)
    }
  }
}

// ====================
// main.ts
// ====================
Object.entries(attributes).map((_pair: any) => {
  const pair = _pair as AttributesPair;
  runner(pair);
});

// =============
// Helper
// =============
// REF: https://github.com/type-challenges/type-challenges/issues/14052
// type RemoveUndefined<T> = [T] extends [undefined] ? T : Exclude<T, undefined>
// type ObjectEntries<T> = {
//  [K in keyof T]-?: [K, RemoveUndefined<T[K]>]
// }[keyof T]
type ObjectEntries<T, U extends keyof T = keyof T> = U extends any ? [U, Exclude<T[U], undefined>] : never;

```

## REF

- `-?`: https://stackoverflow.com/questions/52417131/what-does-mean-in-typescript
- https://github.com/Microsoft/TypeScript/issues/2214#issuecomment-260825185
- https://stackoverflow.com/a/56597745/8842333
3点を通る円「ますいしいからの挑戦状(16)!!」をwolframAlphaとsympyでやってみた。

sympyで**7通り**になりました。
3点A(8,5),B(1,-2),C(9,2)を通る円....

オリジナル

https://ameblo.jp/mathisii/entry-12764374455.html


# wolframAlphaで
作図が見れます。

https://www.wolframalpha.com/input?i=%E5%86%86+%288%2C5%29%2C%281%2C-2%29%2C%289%2C2%29&lang=ja

# sympyで(ますいしい様の手順で)
(勉強中)
“三元連立一次方程式”
“二元連立一次方程式”
“一元一次方程式”

# sympyで(解4がいいですね。)
#### (解1)“円の方程式の一般形“
```python
from sympy import *
var('x y a b c')
A=Point(8, 5)
B=Point(1,-2)
C=Point(9, 2)
eq=x**2+y**2+a*x+b*y+c
ans=solve([eq.subs({x:A.x,y:A.y}),
           eq.subs({x:B.x,y:B.y}),
           eq.subs({x:C.x,y:C.y})
          ],[a,b,c])
print("#",       eq.subs({a:ans[a],b:ans[b],c:ans[c]}) )
print("#",Circle(eq.subs({a:ans[a],b:ans[b],c:ans[c]})))
# x**2 - 8*x + y**2 - 4*y - 5
# Circle(Point2D(4, 2), 5)
```


#### (解2)“円の中心は弦の垂直二等分線上にある”
```python
from sympy import *
var('x y a b c')
A=Point(8, 5)
B=Point(1,-2)
C=Point(9, 2)
O=               Line(A,B).perpendicular_line((A+B)/2) \
   .intersection(Line(B,C).perpendicular_line((B+C)/2))[0]
print("#",Circle(O,O.distance(A)))
print("#",Circle(O,O.distance(A)).equation().expand())
# Circle(Point2D(4, 2), 5)
# x**2 - 8*x + y**2 - 4*y - 5
```

#### (解3)“円束”  ??????（えんそく、英: pencil of circles）
```python
from sympy import *
x,y,k=symbols("x,y,k",real=True)
A=Point(8, 5)
B=Point(1,-2)
C=Point(9, 2)
P=Point(x,y)
eq1=(P-B).dot(P-C)
eq2=Line(B,C).equation()
eq2=eq2/eq2.coeff(x)
eq3=eq1+k*eq2
eq4=eq3.subs({k:solve(eq3,k)[0].subs({x:A.x,y:A.y})}).expand()
print("#",       eq4 )
print("#",Circle(eq4))
# x**2 - 8*x + y**2 - 4*y - 5
# Circle(Point2D(4, 2), 5)
```

#### (解4) “sympyのCircleで”
```python
from sympy import *
print("#",Circle(Point(8, 5),Point(1,-2),Point(9, 2)))
print("#",Circle(Point(8, 5),Point(1,-2),Point(9, 2)).equation().expand())
# Circle(Point2D(4, 2), 5)
# x**2 - 8*x + y**2 - 4*y - 5
```

全部確かめていませんが,
インストール不要で、以下のweb上で実行できます。

https://live.sympy.org/

(解4)は、実行できました。貼り付けて、evaluateです。




#### (解5) 後から値を代入が、最もsympyらしいと思います。“sympyのCircleで”
計算時間。私のパソコンだと、2分かかりますが、答えがでました。
```python
from sympy import *
Ax,Ay,Bx,By,Cx,Cy=symbols("Ax,Ay,Bx,By,Cx,Cy",real=True)
A=Point(Ax,Ay)
B=Point(Bx,By)
C=Point(Cx,Cy)
print("#",Circle(A,B,C))
print("#",Circle(A,B,C).equation().expand())
mySubs={
        Ax:8,Ay: 5,
        Bx:1,By:-2,
        Cx:9,Cy: 2,
}
print("#",Circle(A,B,C)                    .subs(mySubs))
print("#",Circle(A,B,C).equation().expand().subs(mySubs))
# Circle(Point2D(((Ax + Bx)*(Ax*By .... 250文字?以下省略
# Ax**3*By/(Ax*By - Ax*Cy -        .... 250文字?以下省略　　　　　
# Circle(Point2D(4, 2), 5)
# x**2 - 8*x + y**2 - 4*y - 5
```



# 他の解答方法
以下,値は異なりますが,(0,3)(-1,0)(-3,4)
他にもエクセルVBAソルバーあります。解は、小数点表示です。ルート(√)表示できません。


#### (解6)

https://qiita.com/mrrclb48z/items/52efe33c951381f71b1a


#### (解7)　
これも、後から値を代入。
Tuple

https://qiita.com/mrrclb48z/items/36eb751ac44698659612#sympy%E3%81%A7



# 入試問題 
今回、以下を書き換えました。

https://qiita.com/mrrclb48z/items/31475eb90a628810bbb1



# 参考
円束（えんそく、英: pencil of circles）

https://ja.wikipedia.org/wiki/%E5%86%86%E6%9D%9F_(%E5%B0%84%E5%BD%B1%E5%B9%BE%E4%BD%95%E5%AD%A6)

英語版が見当たりませんでした。

https://en.wikipedia.org/wiki/Apollonian_circles
iptables、firewalld、firewall-ctlコマンドについて

ファイアウォールは外部からの攻撃や不正なアクセスを防ぐためのセキュリティ機能。
ファイアウォールの主要機能のパケットフィルタリングでは、パケットの送信元アドレス、宛先アドレス、ポート番号をチェックし、ルールに従ってパケットの通過を許可、破棄。

●iptables
Linuxカーネルにはnetfilterというパケット処理機能が組み込まれている。
iptables（IPv6環境ではip6tables）は、netfilterを利用してパケットフィルタリングやNAT（ネットワークアドレス変換）の設定を行う機能およびコマンド。CentOS6までのデフォルトのファイアウォールの仕組み。

設定内容によって書式が異なるが、基本的なフィルタリングの書式：

iptables [-t テーブル] -[A|D] チェイン　ルール

テーブル...iptablesで作成するルール群（チェイン）の使用目的を決定するもの。デフォルトはfilter（パケットフィルタリング用）
A|D...ルールの追加|削除
チェイン...パケットの処理方法を定義したルール群。また、どのタイミングでルールを適用するかを表す


※iptablesの設定はシステム再起動を行うと消えてしまう。再起動後も同じ設定にしたい場合は、設定をファイルへ保存し、再起動後には復元する必要がある。


●firewalld
CentOS7からは、iptablesの代わりにfirewalldがデフォルトのファイアウォール機能として実装。firewalldもnetfilterを利用しますが、iptablesより簡単に設定できる。

firewalldサービスはデフォルトでは有効だが、以下のコマンドでステータス確認、有効化、起動。

・firewalldのステータス確認
systemctl status firewalld

・firewalldの自動起動の有効化
systemctl enable firewalld

・firewalldの起動
systemctl start firewalld

●ゾーン
firewalldには「ゾーン」という概念があります。パケットフィルタリングのルールをゾーンごとに定義しておき各NICに割り当てる、テンプレートのようなもの。
firewalldでは同じ性質のインタフェースに同じルール定義のゾーンを割り当てることができる。
デフォルトでは9種類のゾーンがあり、それぞれの用途を想定したルールが設定されている。ゾーンは作成して追加することも可能。

public...公共領域での利用（デフォルト）
work...業務での利用
home...家庭での利用
internal...ファイアウォールの内部ネットワーク側での利用
external...ファイアウォールの外部ネットワーク側での利用
dmz...ファイアウォールのDMZ（外部から内部ネットワークを守る緩衝地帯）での利用
block...受信パケットを拒否。外部への通信と戻りパケットだけを許可
drop...受信パケットを廃棄。外部への通信と戻りパケットだけを許可
trusted...全ての通信を許可

●firewall-cmdコマンド
firewall-cmdコマンドを使用してfirewalldを設定。

基本的なコマンド

・firewalldサービスのステータス確認
firewall-cmd --state

・ゾーンの設定を確認
firewall-cmd [--zone=ゾーン] --list-all

「--zone=ゾーン」を指定しない場合は、デフォルトのゾーン（初期値はpublic）

デフォルトのゾーンは「--get-default-zone」オプションで確認。
firewall-cmd --get-default-zone

・ゾーンにサービスを追加
firewall-cmd [--zone=ゾーン] --add-service=サービス

・ゾーンからサービスを削除
firewall-cmd [--zone=ゾーン] --remove-service=サービス


設定は即時反映されるが、firewalldサービスやシステムを再起動すると消える。
恒久的に設定したい場合は「--permanent」オプションを指定して設定した後に、「firewall-cmd --reload」で再読み込みさせる必要がある。
firewall-cmd --reload
tsm （Session ManagerでEC2インスタンスに同時接続して同時操作するツール）を作った

# 概要
掲題の通りです。
tsmというSession Managerで複数台のEC2インスタンスへ同時接続して同時操作するツールを作りました。
（Tmux Session Managerの略）

https://github.com/kotatsu360/tsm

MITライセンスです。

# デモ
![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62601/c2772d3b-0089-b01a-1197-b4ca59168589.gif)

# モチベーション
* Session Managerでの接続をもっと簡単にしたい（インスタンスIDを何度も調べたくない）
* 「SSHで複数台に同時接続」という体験をSession Managerでも再現したい

# 仕組み
* awscliで対象のインスタンスを絞り込む
* tmuxのウィンドウを複製しつつ、ssm start-sessionを繰り返す

# 使い方
迷ったら`tsm -h`もしくは`tsm --help`をご覧ください。以下、機能のご紹介です。

## リスト機能
`tsm -l`もしくは`tsm --list`で、存在するEC2のインスタンスIDとNameを取得します。

裏ではawscliを呼び出しており、`-p/--profile`や`-r/--region`の指定で、権限やリージョンを切り替えられます。

```bash
$ tsm -l
i-076a3c31dbf0af073	MyServer
i-0b55c94fbcedc0863	MyServer
i-0325abf52cb86ad50	MyServer2

$ tsm -l　 -p default -r ap-northeast-1
i-076a3c31dbf0af073	MyServer
i-0b55c94fbcedc0863	MyServer
i-0325abf52cb86ad50	MyServer2
```

## 同時接続機能
`tsm`の引数にNameもしくはインスタンスIDを渡すことでそれに接続します。

```bash
# Name=MyServerのインスタンスに接続します。Nameに一致するインスタンスが複数ある場合は、そのすべてに接続します。
$ tsm MyServer

# NameとインスタンスIDは混在できます
$ tsm MyServer i-0325abf52cb86ad50

# もちろん、複数のNameを指定することも可能です
$ tsm MyServer MyServer2 #...
```

冒頭のデモが、実際に接続した時の様子です。

## その他
`-o/--options`で指定した文字列は、そのまま`aws ssm start-session`にオプションとして渡されます。
tsmを使いつつ、追加で`--reason`などを指定することも可能です。

# もう少し良くしたいところ
* 存在しないName / インスタンスIDが指定された時の挙動
* インストール手順

# さいごに
必要なIAM権限など、READMEの方にも色々書きました。
興味を持ってくださった方は、ぜひリポジトリの方もご覧ください。

https://github.com/kotatsu360/tsm

star / issue / pr などリアクションをいただけると小躍りして喜びます。

# 謝辞
特に次の記事が参考になりました。ありがとうございます。

* [tmuxで複数サーバの同時オペレーション – NaviPlus Engineers' Blog](https://tech.naviplus.co.jp/2014/01/09/tmux%E3%81%A7%E8%A4%87%E6%95%B0%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E5%90%8C%E6%99%82%E3%82%AA%E3%83%9A%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3/)
* [【最終完全版】 bash/zsh 用オプション解析テンプレート (getopts→shift)](https://zenn.dev/takakiriy/articles/e65780261dd5e3)
laravel mysql 年齢範囲でデータを取得

参考
https://qiita.com/Ishiki_/items/3928edcc808b5fc02e1f

`birthday` フィールド(DATETIME型)から
39歳以上40歳以下のユーザーのみ取得したい


```hoge.php
<?php
$age = [
    'young' => 39,
    'old' => 40,
];

$birthday = [
    'before' => Carbon::now()->subYear($age['young'])->format('Y-m-d'),
    'after' => Carbon::now()->subYear($age['old'] + 1)->addDay()->format('Y-m-d')
];

$res = User::query()
    ->whereBetween('birthday',[$birthday['after'],$birthday['before']])
    ->limit(25)
    ->get();//全て取得

foreach ($res as $v) {
    //年齢
    $tmp = new Carbon($v->birthday);
    echo $tmp->age.' 歳<br>';
}
```

こんな感じ whereBetween を使ってみました。
Alibaba Cloudハンズオンイベントのご案内：Alibaba Cloudを触ってみよう！~2時間でわかるAlibaba Cloud入門編

Alibaba Cloudを触ってみよう！～2時間でわかるAlibaba Cloud入門編～と題し、ハンズオンイベントを弊社京橋オフィスにて、毎週木曜日に開催することが決定いたしました。
 
初心者向けにAlibaba Cloudに関する基礎知識や製品のハンズオンを２時間で学べる無償のイベントです。
参加特典もご用意しますので、これからAlibaba Cloudを始めたい方、エンジニアのみならず、ぜひお気軽にご参加ください！


# イベント概要
- 日時、開催場所
    - 毎週木曜日15時〜18時@弊社京橋オフィス 12番セミナールーム
- アクセス : https://www.edogrand.tokyo/access
- 参加人数：各回先着10名様
- ご参加条件：どなたでも参加可(コンテンツは技術的な内容になります。)
- コンテンツ
1.Alibaba Cloudの概要説明
2.仮想サーバやDB、ストレージなど基本製品のハンズオン
3.質疑応答
4.懇親会@京橋オフィス

# 事前準備のお願い
- Alibaba Cloudのアカウント作成
以下のリンクよりアカウントを作成してください。会社所属の方はアカウントタイプをビジネスタイプと選択してください。

https://account.alibabacloud.com/register/intl_register.htm

- 当日ご用意いただきたいもの
    - Wifiでインターネットアクセスが可能なラップトップPC
    ※弊社ゲストWifiでは2.4GHｚ帯は開放しておりません。事前にご利用のラップトップPCは5GHzが対応されているかご確認ください。 
    - スマホ、充電器等   

# ご参加頂いた方への特典
- クーポン付与
Alibaba Cloudの300ドル無償クーポン(1年有効)の提供！
- Qiitaなど技術ブログに投稿頂いた場合(※調整中)
1記事あたり10,000円分のギフトカードを提供！ (2000~3000文字、選定あり)


# 参加申し込み方法
イベントの参加は以下のURLよりお申込み下さい。

https://survey.alibabacloud.com/uone/sg/survey/5jnduCIuj
NanoPi R5Sにubuntu mate desktopを入れてみた結果→動作はするけど不安定

# はじめに
ラズパイならぬナノパイの記事です。
[NanoPiR5S](https://www.friendlyelec.com/index.php?route=product/product&product_id=287)は2022年の5月下旬に発売されたシングルボードコンピュータです。
R5SにはHDMIがついているため、デスクトップOSを入れればGUI操作も可能になります。

が、

この記事を書いている現在（2022/09/15）公式ページにはubuntu desktop 22 もすぐにリリースするよと書かれていますが、まだありません。
debianベースのデスクトップは提供されていますがやっぱり慣れたものがいい。

ということで色々試したのですが、

## 結論
### ubuntu mate desktop なら動作するが、画面がチラついたりマウスカーソルが消える。
※ubuntu/core のOSから apt インストール時にlightdmを指定すること（インストールの途中で聞かれます）
※gdm3を指定したら画面が立ち上がりませんでした
 

ということでした。
### いまは素直にdebianベースのイメージ使えってことですかね。

pretty soon とはどれくらいの範囲を指すのだろう。。。
【UI/UX】Figmaの代替アプリの筆頭！「Pixso」を使ってみた！！！

## はじめに
最近、Figmaが日本語に対応したり、大型リリースしたり、Figmaの勢いがすごいです。
そのため、Figmaが本格的にデザインツールとしての地位を確立する日も近そうです。

このようなFigmaの勢いにのっかて、「Sketchから、Figmaに乗り換えようとしてるよ」という
企業・団体は多いのではないのでしょうか？

また、勢いだけでは簡単に乗り換えられないという企業・団体もいるかもしれません。

そのためこの記事では、Figmaの代替アプリの１つである「[**Pixso**](https://pixso.net/jp/?utm_source=Qiita&utm_medium=influencer&utm_term=DEGU&utm_campaign=japan-blog-promotion&_channel_track_key=lwhxZEiS)」について紹介し、
主要なデザインツールと比べらていただけると嬉しいです。

## Pixso
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/18ac0bf8-d0aa-3b8a-d9dc-e543496e04c0.png)
### Pixsoとは？
Pixsoとは、複数人でコラボレーション出来るように
オンライン上でUIを作ることができる**コラボレーションUIデザインツール**です。

UIデザインを作るだけでなく、プロタイプを簡単に作れたり、デザイントークンを管理できたりと
Figmaで便利といわれているような機能は、備えているようです。

↓ 詳しくは公式ページをごらんください。


https://pixso.net/jp/?utm_source=Qiita&utm_medium=influencer&utm_term=DEGU&utm_campaign=japan-blog-promotion&_channel_track_key=lwhxZEiS

　
### Pixsoを触ってみた所感
Pixsoを触ってみた所感としては、**ほしい機能は十分備わっている**と感じました。

Auto LayoutやComponent、Design Tokenの管理、リアルタイムの共同編集、バージョン管理、プロトタイプ機能など、
UIを作成したり、Design Tokenの管理したり、プロトタイプを作成したりするには十分な機能が揃っていると思います。
（ちゃんと多言語に対応しているので、もちろん日本語で操作できます！）

ただ、Web版のみのため、少し動きが硬くなる瞬間があるように感じました。

ほかにも、一通りPixsoを触っていく中で、
他のデザインツールでは、あまりない特徴的な機能とかも色々あったので、
Pixsoの特徴の特徴についてまとめようと思います。

### Pixsoの特徴
#### ① Pageをフォルダごとに管理することができる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/2cb5af16-6be7-0675-2857-c4c0e4dbb030.gif" width="100%"/>
Pixsoでは、↑このようにPageをフォルダごとに管理することができます。
実際の開発環境に即したフォルダ管理をすることが可能です。

例えば、Atomic designのようにフォルダを分けることで、
デザインのコンポーネントとコード上のコンポーネントを一致させて管理することが可能です。

そのため、今までのデザインツールよりエンジニアとのコミュニケーションが楽になると思います。

　
#### ② チーム数・ファイル数・エディター数を無制限に作成できる

Pixsoでは、Freeプランで**チーム数**・**ファイル数**・**エディター数**に制限がありません。
そのため、個人で使うには、とても嬉しいです！

１チーム3ファイルでうまくやりくりしなくてもいいのです。

↓PixsoのFreeプランは以下の通りです！
![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/86e2ab70-a30f-3c5e-bde8-dd8f1307e7e4.png)

　
#### ③ エンタープライズ専用の独自ドメインを作成できる
PixsoはWeb版のみのため、**エンタープライズ専用ドメイン**を作成できるのが最大の特徴です！
また専用ドメインを作成できるだけでなく、エンタープライズだと、セキュリティ管理や編集者の管理ができたりと、会社として嬉しい機能が多いです。

そのため、新しいツールを導入するのにセキュリティのチェックが厳しく、Figmaが導入できない企業にはおすすめできそうです！

↓詳しいエンタープライズ向けのプランは以下の通りです！
![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/554b83a9-f0b0-08bc-cc31-bd5657bece07.png)

## まとめ
この記事では、Figmaの代替アプリの１つである「[**Pixso**](https://pixso.net/jp/?utm_source=Qiita&utm_medium=influencer&utm_term=DEGU&utm_campaign=japan-blog-promotion&_channel_track_key=lwhxZEiS)」について紹介しました。

Pixsoは、web版のみのようですが、web版ならではの専用ドメインが作成できるため、セキュリティに厳しい企業には向いているように感じました。
また、チーム数・ファイル数・エディター数を無制限に作成できるので個人でUIを作成したり、
ハッカソンなどのスポットで、チームをつくって開発するような場合にも向いていそうです！

ぜひこの記事を読んで、「**Pixso**」触ってみようかなと感じた方は、下記のリンクからサインアップして、使ってみてはいかがでしょうか？

https://pixso.net/app/?utm_source=Qiita&utm_medium=influencer&utm_term=DEGU&utm_campaign=japan-blog-promotion&_channel_track_key=Q2K22osN

---

最後まで読んでくださってありがとうございます！

普段はデザインやフロントエンドを中心にQiitaに記事を投稿しているので、ぜひQiitaのフォローとX(Twitter)のフォローをお願いします。

https://twitter.com/degudegu2510
ネットワーク上に保存されたマクロ付きExcelフォルダに表示される警告文に対する対応策


# 事象

　2022年の8月か9月くらいのWindows Updateによるセキュリティ強化の影響で、ネットワークからダウンロードしてきたマクロ付きのExcelファイルを開いた際に警告メッセージが表示されるようになりました。
　警告文は以下の通りです。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259240/286a9e34-c7be-f155-cc7d-1fd31cabf6de.png)


><font color="Red">**セキュリティリスク このファイルのソースが信頼できないため、Microsoftによりマクロの実行がブロックされました。**</font>

　この警告文が表示された場合、そのExcelファイルで**マクロを使用することができなくなります**。

　確認できた限り、Office2019とOffice365で再現しています。確認してないだけで他のバージョンでも表示されているのではないかと思われます。

　おそらく先日のEmotetによる被害などを鑑みたMicrosoftの対応策なのでしょう。
　この事象の問題点は、インターネット上のサイトや危険なメールからダウンロードしたExcelファイルのみならず、**グループウェアや、ファイルサーバーなどの共有フォルダからダウンロードしたExcelファイルでも無差別に表示されること**です。

　おそらくまだ多くの企業の経理担当の方が、マクロ付きのExcelファイルを使用しているであろうことから、この警告文の脅威たるや計り知れません。~~余計な事しやがって。~~

　今回、共有フォルダからダウンロードする場合とインターネット上のサイト(グループウェアやGithub含む)からダウンロードする場合の２通りに対して対処方法を記載します。

# 共有フォルダからダウンロードした場合

　共有フォルダからダウンロードする場合は、その共有フォルダ自身を信頼できる場所として保存します。

### 1. オプションを開く。

　適当なExcelファイル(新規ファイルで構いません)を開いたら、ファイル→オプションを押してオプション画面を開きます。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259240/df0fb553-461f-df4d-a37d-11bf3d50540d.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259240/013fd4b2-b952-7753-bdce-779e7acfbbd3.png)

### 2. トラストセンターを開く

　左のタブからトラストセンターを選択します。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259240/667fffe2-cd0e-29f0-7c3f-1682a5643d66.png)

　トラストセンターの設定を開きます。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259240/01db095e-801a-6742-69b3-a2ab66f6a72b.png)

### 3. 信頼できる場所に追加する

　信頼できる場所を選択します。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259240/2de30f5c-e8c6-e2bb-a5d4-412a22565a03.png)

　[自分のネットワーク上にある信頼できる場所を追加する]のチェックを入れてから[新しい場所の追加]を選択します。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259240/15e8beb7-250b-ec07-83c0-647783f9a7f3.png)

　対象の共有フォルダのトップをパスに指定して、この場所のサブフォルダーも信頼するにチェックを入れてOKを押します。

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259240/2e2f200c-f842-35cf-e380-de0520c67c99.png)

　あとは対象の共有フォルダの数だけこのパスを追加します。
　NASやファイルサーバーなどの社内の共有フォルダの場合はこの対応でOKです。

# インターネット上のサイトからのダウンロードした場合

　インターネット上のサイトからの場合、信頼できる場所に指定できないため、Excelファイル一個一個に対して、このファイルは大丈夫なファイルだとチェックを入れないといけません。

### 1. 対象のExcelファイルのプロパティを開いて許可するをチェック

　このファイルは他のコンピュータから取得したものです。このコンピューターを保護するため、このファイルへのアクセスはブロックされる可能性があります。の許可するにチェックを入れます。

　![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259240/37d8efce-a8fc-eb02-165e-960da6904424.png)

　作業的には以上です。

　<font color="Red">**※※※注意※※※**<font>

　このサイトを見ている人ならわかると思いますが、**発行元のわからないExcelファイルに対しては絶対にこのチェックを入れないでください**。このチェックは社内で作成されたファイルや発行者が信頼できる人の場合のみチェックを入れてください。
　むやみやたらにどのExcelファイルでもチェックを入れていたらMicrosoftのセキュリティ対策が何の意味もなくなります。
　

# さいごに
　社内外問わず問合せが多かったので備忘録がてら困っているシステム担当がどこかにいるのではないかと思い公開しました。
　今回の対応のうち、特に後者はセキュリティリスクを上げる対応になりますので、対象のファイルには気を付けてください。
AWS Certified Machine Learning - Specialty 合格体験記 【文系・IT未経験】

北海道をこよなく愛するピーターです。
AWS Certified Machine Learning - Specialtyを取得しましたので体験記です。

# 学習期間
またもやってしまいました。勉強したのに試験を受けず忘れてしまうやつです。
遠い昔に1度勉強をして、忘れた頃である今回にもう一度勉強し直しました。
2回目の勉強期間は1週間程度だと思われます。
しかし、今回の合格は、**辻先生による勉強会によって機械学習分野の定着が早かったことが合格につながった**と感じました。

# Who is 辻先生
辻先生は東京大学特任准教授の辻真吾先生のことです。Pythonの第一人者で数々のPython入門書を執筆している方です。
(最近の著書[『ゼロからはじめるデータサイエンス入門 R・Python一挙両得』](https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Data-Science%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9%E5%85%A5%E9%96%80-R%E3%83%BBPython%E4%B8%80%E6%8C%99%E4%B8%A1%E5%BE%97-KS%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8/dp/4065132320)
弊社は東京と福岡に拠点があります。辻先生は東京、私は福岡におりますので基本的にリモートですが、週1でデータサイエンス勉強会という題でご教授いただいております。

# データサイエンス勉強会
辻先生に聞きたいことなら何でも持ち寄る勉強会です。
勉強会の内容は前もって決まっていることもありますが、参加者がお題を持ち寄ることが多いです。この機械学習モデルについて教えてほしい、開発のこの部分のアルゴリズムをもっと改善できないか、などです。
データサイエンスに関係ない話になることもたまにあります。
冒頭にも書きましたが、**この勉強会で機械学習の分野の理解が進んでいたので、AWS試験の合格のハードルが下がった**のかなと思いました。

# 学習方法
学習するべき分野は大きく分けて2つあると感じました。
AWSと機械学習です。
## AWS
AWSとしての機械学習を理解する必要があるように感じました。というのも、機械学習に詳しかったとしても、それをAWSのクラウド上で実現する術を知らなければ合格は難しいからです。
よく出てくるサービスは、
- Amazon SageMaker
- Amazon Kinesis
- AWS Glue
- Amazon EMR

です。このあたりを抑えつつ、クラウドプラクティショナー程度のAWS知識があればよいと感じました。

## 機械学習
AWSでのサービス群を理解するだけではなく、そもそもの機械学習の知識が必要です。個人的にはこちらの知識のほうが重要であると感じました。
具体的には
- 学習方法(教師あり/なし など)
- 学習がうまくいかないときの対処法(過学習の対処法など)
- 混同行列
- 正しいアルゴリズムの選択(クラスタリングにはk-meansなど)

などです。勉強時間のうち7割くらいはこちらになるイメージです。

# おわりに
今月でアークエルにジョインして1年が経ちます。そろそろIT未経験のフダは外すべきかもしれません。
やればできる。
Kotlin Coroutineを使ったタイムアウト付きのリトライ処理の方法

# KotlinCoroutineを使ったタイムアウト付きのリトライ処理の方法

## APIリクエスト失敗時にタイムアウト付きでリトライする場合

```main.kt

class ApiService() {

    //通信処理用スコープ
    private val ioScope by lazy { CoroutineScope(Job() + Dispatchers.IO) }

    suspend fun request(): Boolean {
        return try {

            //通信するため、IOスコープに切り替える
            withContext(ioScope.coroutineContext) {
                //Timeoutを設定
                //Timeout時はTimeoutCancellationExceptionが吐かれる
                withTimeout(10 * 1000) {

                    //リクエスト結果
                    var result = false

                    while(!result) {
                        //ここでリクエスト
                        result = RequestApi()
                        //1秒後にリトライ
                        delay(1000)
                    }

                    return@withTimeout result

                }

            }

        } catch(ex: Exception) {
            when(ex) {
                is TimeoutCancellationException -> {
                    //タイムアウト時
                }
                else-> {
                    //その他エラー
                }
            }
            false
        }        
    }
    
}

```
pandasでpivot_tableしつつグループごとにdescribeで統計量を見たい

# はじめに
pandasの`describe()`はとっても便利だけど、`groupby`とか`pivot_table`とかで、任意のグループごとにdescribe()して統計量をパパっと見ることはできないものか？

# pandasの`describe`とは？
データ数、平均、標準偏差、四分位点をさっと調べてくれます
```py
import pandas as pd
import seaborn as sns
df=sns.load_dataset("iris")
df.describe()

#sepal_length	sepal_width	petal_length	petal_width
#count	150.000000	150.000000	150.000000	150.000000
#mean	5.843333	3.057333	3.758000	1.199333
#std	0.828066	0.435866	1.765298	0.762238
#min	4.300000	2.000000	1.000000	0.100000
#25%	5.100000	2.800000	1.600000	0.300000
#50%	5.800000	3.000000	4.350000	1.300000
#75%	6.400000	3.300000	5.100000	1.800000
#max	7.900000	4.400000	6.900000	2.500000

```

# 集計関数としても"describe"は使える
groupbyだと、`.count()`や`.sum()`のように使えます。
※横に長いので.Tで転置して表示
```py
df.groupby("species").describe().T
#	species	setosa	versicolor	virginica
#sepal_length	count	50.000000	50.000000	50.000000
#mean	5.006000	5.936000	6.588000
#std	0.352490	0.516171	0.635880
#min	4.300000	4.900000	4.900000
#25%	4.800000	5.600000	6.225000
#50%	5.000000	5.900000	6.500000
#75%	5.200000	6.300000	6.900000
#max	5.800000	7.000000	7.900000
#sepal_width	count	50.000000	50.000000	50.000000
#mean	3.428000	2.770000	2.974000
#std	0.379064	0.313798	0.322497
#（以下略）
```

pivot_tableでも同様に使えます
```py
df.pivot_table(index="species",aggfunc="describe").T

#	species	setosa	versicolor	virginica
#sepal_length	count	50.000000	50.000000	50.000000
#mean	5.006000	5.936000	6.588000
#std	0.352490	0.516171	0.635880
#min	4.300000	4.900000	4.900000
#（以下略）
```

# 別解
どうしてもこれだけじゃ満足できない人は別途関数をdefで定義するか、もしくはlambda関数でサクッといっちゃえばよし
```py
# %%
pv=df.pivot_table(
    index="index",
    values="values",
    aggfunc=[
        "mean",
        "std",
        "min",
        lambda x: np.percentile(x, 25),
        "median",
        lambda x: np.percentile(x, 75),
        "max",
        "count"
    ]
)
col=[["mean","std","min","25%","median","75%","max","count"],["values"]]
pv.columns=pd.MultiIndex.from_product(col)
pv
```

# おわりに
いままでふつうに別解してた…
ふと出来心でやってみたらできてしまって、うれしいやら悲しいやら…
RiderのLiveTemplate(スぺニット)を利用して効率よくUnityC#のコーディングをする-個人的まとめ-

## LiveTemplate(スぺニット)とは？
Riderを開き、設定→エディタ→LiveTemplateまで行きます。  
そこで利用する言語やUnityなどのサービスごとにオリジナルのテンプレートを設定できるようにします。  

### 例えば以下のような変数を宣言する場合
```
[SerializeField] private GameObject player;
```
###LiveTemplate(スぺニット)なしだと
1.`[]`を打ち込み
2.`[]`に`SerializeField`を打ち込み
3.`private`と打ち込み
4.型と変数名を打ち込み
5.終了

### LiveTemplate(スぺニット)ありだと
#### 事前準備
- `Shortcut`に`se`と登録(`Shortcut`で決めた文字を打つとそれに紐づけたテンプレートを打ち込めるようになっています。)
- `[SerializeField] private`というテンプレートを登録

#### 開始
1.`se`と打ち込み
2.型と変数名打ち込み
3.終了

たった二手間減るだけですが、体験してみると分かると思いますがめっちゃ早くなります。。。  
特に`SerializeField`をカッコ内に打ち込むときに方向キーでいちいち中に持ってくのが面倒でしたがこれで方向キーを触らなくて済みます。

### 参考元
- (https://www.jetbrains.com/help/rider/Using_Live_Templates.html)
- (https://qiita.com/r-ngtm/items/ba875d32c17c5aacf80c)
調査用ページ



+ [Salesforce Developers Japan Blog](https://developer.salesforce.com/jpblogs/)
+ [Answers Connect](https://trailhead.salesforce.com/ja/trailblazer-community/groups/0F94S000000GziQSAS?tab=discussion&sort=LAST_MODIFIED_DATE_DESC)
+ [サクセスナビ](https://successjp.salesforce.com/)

https://fukadadenki.quip.com/ahjNAq3SbOk6/SFUG-CUP-2022-10

https://fukadadenki.quip.com/DisWAT6LF7aL/SFUG-CUP-2022-10


# 事例

+ [社内のサーバーやPCからSalesforceに接続するシステムのトラブル時の対応](https://qiita.com/Keiji_otsubo/items/7687f56baf792019818b)
Kotlin Context Receiver - 複数のコンテキストレシーバ 

(自分用メモ)
### 環境
- Kotlin 1.6.20~

### コードサンプル

- [普通のレシーバとcontextの比較](https://pl.kotl.in/auBi2xhMr)
- [名前衝突の回避](https://pl.kotl.in/ZokPUP7vL)
【Unity】ビルドエラー(You have enabled the Vulkan graphics API, which is not supported by ARCore.)の対処方法

# エラー内容
```
Error building Player: BuildFailedException: You have enabled the Vulkan graphics API, which is not supported by ARCore.
```

# 対処
設定の`Graphics APIs`から`Vulkan`を削除する

## 手順
`File` > `Build Settings` > `Player Settings` > `Other Settings` > `Auto Graphics API`のチェックを外す
![スクリーンショット 2022-09-15 082855.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/e4beb5a6-9340-0755-7622-79bb8cbfdcb1.png)

チェックを外すと`Graphics APIs`の一覧が表示されるので、`Vulkan`をリストから削除する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/c3d0e403-e879-cb2a-4f6c-878dafd6c169.png)
Rails・Rubyで benchmark を使って簡単にパフォーマンス計測をしてみよう！

## はじめに
先輩や上司に、「どのロジックがパフォーマンス良いか調べてみて」と言われることはありませんか？
または、先輩や上司にコードを見せる前にどのロジックがパフォーマンス良いか調べたいことがありますよね。

`Rails パフォーマンス計測` で検索すると、`rack-mini-profiler`のGemが出てくると思います。
ただ、実務においてGemを導入するのはハードルが高いです。

そこでRubyに標準である`benchmark`を使ってみましょう。

## `benchmark`とは
https://docs.ruby-lang.org/ja/latest/library/benchmark.html

ベンチマークの計測ができます。そのままですね。

https://docs.ruby-lang.org/ja/latest/method/Benchmark/m/bm.html

こちらの`bm`メソッドを使用していきます。

サンプルコードは以下になります。

~~~ruby
require 'benchmark'

n = 50000
Benchmark.bm do |x|
x.report { for i in 1..n; a = "1"; end }
x.report { n.times do   ; a = "1"; end }
x.report { 1.upto(n) do ; a = "1"; end }
end

#=>
#
#     user     system      total        real
# 1.033333   0.016667   1.016667 (  0.492106)
# 1.483333   0.000000   1.483333 (  0.694605)
# 1.516667   0.000000   1.516667 (  0.711077)

~~~

計測された `user` `system`を見てあげればOKです。
以下はこちらの記事(https://zenn.dev/publiclocaldev/articles/63e0fb1eb098ce) の引用です。

>user
ユーザー CPU 時間
ユーザープログラムの実行に費やした CPU 時間。この場合、Ruby スクリプトを実行すべく Ruby 処理系が働いたぶんの CPU 時間のこと。

>system
システム CPU 時間
OS はファイルの読み書きなどの基本的な機能を「システムコール」という形で提供しているが、プログラムがそれを呼び出しその実行に費やした CPU 時間をこう呼ぶらしい。


## 実務のコードでパフォーマンス計測をする
「ユーザーがいいねしている記事を取得する」メソッドを実装しているとします。
Userモデルにロジックを２〜３種類書いてみて、どれがパフォーマンスが良いか計測するには、
下記のようにしてあげるとOKです。

~~~ruby:users_controller.rb
 class UsersController < ApplicationController
    require 'benchmark'

    ...

    def index
      time = Benchmark.bm do |x|
        x.report("method1") { User.method1 }
        x.report("method2") { User.method2 }
        x.report("method3") { User.method3 }
      end
      logger.debug time
    end

    ...
 end
~~~

これでログにパフォーマンス計測の結果が出力されます！
出力した結果を分析してパフォーマンスが良いメソッド及びロジックを採用すると良いでしょう！
【Unity】ビルドエラー（BuildFailedException: ARCore Required apps require a minimum SDK version of 24. Currently set to AndroidApiLevel??）の対処方法

# エラー内容
```
BuildFailedException: ARCore Required apps require a minimum SDK version of 24. Currently set to AndroidApiLevel22
```

# 対処
`Minimum API Level`の`API Level`を24以上にする

## 手順
`File` > `Build Settings` > `Player Settings` > `Other Settings` > `Minimum API Level`を変更する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/4dd837d4-a2d9-cb5b-057c-8f25d3927d8b.png)
VMware Cloud on AWS アップデートまとめ (VMware Explore 2022 編)

VMware Explore 2022 のアップデートについて調べることがあったので、お役立ち情報をまとめてみます。

# 1. そもそもVMware Exploreって？
VMware社の年次カンファレンスです。去年まではVMworldという名前でした。
今年USでは8/29-9/1に開催されました。日本でも同イベント(VMware Explore 2022 Japan)は11/15-16で開催されます。

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/5c44d468-5535-d6dc-e05f-ed17542bf22b.png)](https://www.vmware.com/explore.html)


# 2. VMware Explore 2022 アップデートまとめのまとめ
今年もたくさんのアップデートがあり、新インスタンスタイプ(i4i.metal)に加えてAmazon FSx for NetApp ONTAPとの連携、VMware Cloud on AWS 専用の新規ストレージサービス(VMware Cloud Flex Storage)などの発表がありました！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/7e38adfb-7f20-619c-43b7-9896e6e3d043.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/efbacc24-37a1-e628-8f83-23662c308c00.png)


### VMware Japan Blog
VMware Japan Blogに非常にコンパクトにまとまっているので、まずはこちらをご参照ください。
上図もこちらのブログからの抜粋です。
VMware Cloud Flex Compute」や「VMware Ransomware Recovery for VMware Cloud DR」についても紹介されています！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/18306a35-2666-ab0a-f12e-1609d0072839.png)

[VMware Cloud on AWS の最新アップデート（VMware Explore 2022 の発表内容）](https://blogs.vmware.com/vmware-japan/2022/09/vmc-explore-2022.html)

### VMware Hands-On Lab (VMware HoL)

なんとVMware HoLでもAmazon FSx for NetApp ONTAP連携の簡易シミュレーションを体験できます。（便利！）
ログインなど一切不要で、アクセスすればすぐにどなたでもお試しできます。
私も試してみましたが、10-15分ぐらいで完走できました。イメージ掴むのに最適かと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/d5ec24a8-7a83-64c1-f730-eded64b554bf.png)

[Amazon FSx for NetApp ONTAP integration with VMware Cloud on AWS のハンズオンラボ (VMware HoL)](https://vmc.techzone.vmware.com/?share=isim_demo2842&title=hands-on-lab-demo-vmware-cloud-on-aws-integration-with-amazon-fsx-for-netapp-ontap)

### AWS Blog

AWSからもFSx for NetApp ONTAP連携に関するブログが公開されています！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/f23264ef-3c5d-aea1-03a6-e2e0609040c0.png)


[Amazon FSx for NetApp ONTAP と VMware Cloud on AWS の統合](https://aws.amazon.com/jp/blogs/news/amazon-fsx-for-netapp-ontap-integration-with-vmware-cloud-on-aws/)

### VMware Docs

実はVMware Explore 2022開催以前からひっそりと公開されていたのですが、Amazon FSx for NetApp ONTAPを外部ストレージとして利用する方法についてはVMware Docsでも紹介されています！

[外部ストレージとしての Amazon FSx for NetApp ONTAP の構成 (VMware Docs)](https://docs.vmware.com/jp/VMware-Cloud-on-AWS/services/com.vmware.vmc-aws-operations/GUID-D55294A3-7C40-4AD8-80AA-B33A25769CCA.html)

### VMware Cloud Blog 

英語ですが、１つ１つのアップデートのより詳細を調べたい際にはこちらのブログもご参考ください。

[VMware Cloud on AWS: What’s New at VMware Explore 2022](https://blogs.vmware.com/cloud/2022/08/30/vmware-cloud-on-aws-whats-new-at-vmware-explore-2022/)


### ほかにもたくさん..!
上記で抜粋した以外にもVMware Explore 2022の前後でたくさんのアップデートがあり、例えばvSphere 8などは気になっている方も多いかと思います。

VMware Japanの公式サイトにも他製品やソリューションに関する情報もまとまっているので、ご興味ある方はぜひご参照ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/8e88bbd7-f9fe-9537-e7b1-16bfabe65182.png)

[VMware Explore 2022 の最新情報](https://www.vmware.com/jp/products/whats-new.html)


# 4. 関連記事

https://qiita.com/sanjushi003/items/9805631d3cc3c1f47e58
Python,Ruby,PHP,Java,JavaScript,Perlの四則演算の比較 | プログラミング言語比較


<a href="https://qiita.com/yuki_kimoto/items/f9c2454e7f9130ddb003">Qiita > プログラミング言語の比較</a>

プログラミング言語Python,Ruby,PHP,Java,JavaScript,Perlの四則演算の比較

# Python

https://qiita.com/hiroyuki_mrp/items/d7e4c2d75e947ab99caf

# Ruby

https://qiita.com/mat827/items/ee569f6549b83bb954e2

# PHP

https://qiita.com/koala_56/items/7ed631f62cf0f225f5a6

# Java

https://qiita.com/takahirocook/items/748990882f2de7a630a1

# JavaScript

https://qiita.com/_haya_/items/dbe80010a0a8ac9d70b1

# Perl

https://perlzemi.com/blog/20080910122105.html
robocopyによる世代管理バックアップ

# はじめに
当初、簡単にシャドウコピーによるバックアップをやろうと思っていました。
が、対象ドライブに巨大ファイルがあり断念。。。
robocopyコマンドで特定フォルダのみバックアップするようにすることに
とりあえず、ベースは作成したので後は運用しながらチューニングしていくつもり
※しばらくしたら、バックアップフォルダは古い日時のデータ消すようにしないとな...

# プログラム
定期実行はタスクスケジューラ等に登録すればいいかな...と

```txt:targetFolder.txt
C:\wakasama\Program
C:\wakasama\iso
```

```bat:backup.bat
powershell.exe -Command "exit (Get-Date).DayOfWeek"
if %errorlevel% == 4 (
  set FULLBACKUP=1
) else (
  set FULLBACKUP=0
)

REM バックアップ対象フォルダ読込
setlocal enabledelayedexpansion
for /f "usebackq tokens=*" %%A in (targetFolder.txt) do (
  REM バックアップ対象フォルダ出力
  REM echo %%A

  set MYFOLDER="%%~nA"
  
  REM バックアップフォルダ名出力
  REM echo !MYFOLDER!

  if %FULLBACKUP%== 1 (
    echo フルバックアップ実施！！
    REM 完全バックアップ
    REM robocopy %%A C:\wakasama\wakasama\work\backup\%DATE:/=%\!MYFOLDER! /MIR /UNILOG+:.\backup_%DATE:/=%.txt
    robocopy %%A C:\wakasama\wakasama\work\backup\%DATE:/=%\!MYFOLDER! /MIR /R:1 /W:1 /UNILOG+:.\backup_%DATE:/=%.txt
    REM アーカイブ属性リセット
    attrib -A %%A\* /S
  ) else (
    REM 差分バックアップ
    echo 差分バックアップ実施！！
    REM robocopy %%A C:\wakasama\wakasama\work\backup\%DATE:/=%\!MYFOLDER! /MIR /A /UNILOG+:.\backup_%DATE:/=%.txt
    robocopy %%A C:\wakasama\wakasama\work\backup\%DATE:/=%\!MYFOLDER! /256 /S /PURGE /A /R:1 /W:1 /UNILOG+:.\backup_%DATE:/=%.txt
  )
)
endlocal

PUSHD C:\wakasama\wakasama\work\backup
  REM 更新日時が新しい７つ(skip=7)以外のディレクトリ削除
  for /f "skip=7" %%A in ('dir /AD /O-D /B') do RD /S /Q %%A
POPD
```

# robocopyオプション詳細
## /XF ファイル：指定された名前/パス/ワイルドカードに一致するファイルを除外します。
/XF "~*.*" "~`$*.*" "Thumbs.db" "desktop.ini" "`$RECYCLE.BIN" ".suo"
　◆robocopyでドライブの内容を丸ごとコピーする方法
　　https://qiita.com/nezumin/items/488b66479e878d12b669

:::note warn
警告
　"$"の前には"`"(バッククオート)を付与する必要があるみたい！！
:::

## /256：256 文字を超える非常に長いパスのサポートをオフにします。
　◆ROBOCOPY でコピーしたファイルのファイル名が長すぎて削除できない
　　https://pig-log.com/robocopy-delete-longpath/
　◆robocopyとファイルパス長について
　　https://social.technet.microsoft.com/Forums/ja-JP/f0db5e3b-1e52-40a6-99e1-a281a5d115d2/robocopy123921250112449124521252312497124733826312395123881235612?forum=windowsserver2008ja

:::note warn
警告
　robocopyは256文字を超えるファイルをバックアップするため、差分バックアップを取ろうとすると毎回取得する結果になってしまうため、オプションを指定してバックアップ取得しないようにしている。
　※フォルダ自体は作成されてしまうため、どうしようか思案中...
:::

# 参考サイト
◆robocopyとバッチファイルで世代管理バックアップをする方法
　https://blog.ver001.com/robocopy-generation-backup/
◆robocopyで世代管理しながら差分、増分バックアップをする方法
　https://blog.ver001.com/robocopy-differential-backup/
◆Robocopyの基本動作とコマンドオプション解説
　https://n-archives.net/software/robosync/articles/robocopy-specs-and-command/
◆コマンドプロンプトから曜日を取得する (with PowerShell)
　https://zenn.dev/rabitarochan/articles/e2f06d19ceb017
◆バッチファイルでファイルパスからファイル名や拡張子を自由に取り出す方法
　https://orangeclover.hatenablog.com/entry/20101004/1286120668
◆RoboSync関連記事
　https://n-archives.net/software/robosync/articles/
脳が冴える15の習慣 記憶・集中・思考力を高める

https://www.amazon.co.jp/%E8%84%B3%E3%81%8C%E5%86%B4%E3%81%88%E3%82%8B15%E3%81%AE%E7%BF%92%E6%85%A3-%E8%A8%98%E6%86%B6%E3%83%BB%E9%9B%86%E4%B8%AD%E3%83%BB%E6%80%9D%E8%80%83%E5%8A%9B%E3%82%92%E9%AB%98%E3%82%81%E3%82%8B-%E7%94%9F%E6%B4%BB%E4%BA%BA%E6%96%B0%E6%9B%B8-%E7%AF%89%E5%B1%B1-%E7%AF%80/dp/4140882026

背景
読解力の本を探していたら目について気になったので手に取ってみました。
常に頭が冴えている状態を作れたら色々便利だなと思い、読みたくなった感じです。

本書の目的
頭が冴えている状態を作るために、必要な運動から脳のどの部分をどのように鍛えたらいいかといった様々な観点から基本編〜応用編が１５個の章で書かれています。

最初は「頭が冴える状態を作る」ために、運動とか食事のとり方とかを解説しているのかなと思いました。本を読みましょう、朝起きて音読しましょう、休憩しましょう、暴飲暴食を避けましょうとか。もちろんそういった部分も書かれているのですが、記憶や処理能力を司っている前頭葉を鍛えましょう。そのメリットは？なぜ必要か？といったそこもやるんだ！？という意外な部分まで説明してくれているので、とてもおもしろい本でした。

個人的なポイント
1.脳を動かすには二時間必要
朝起きたら、散歩、片付け、料理、ガーデニング、挨拶なんかをするのが脳が活性化されるので良いそうです。仕事の直前まで寝てたら頭働かないですもんねw

2.脳の集中力は二時間
1からの続きになりますが、脳が集中できるのはせいぜい二時間だそうです。この二時間の間に「試験を受けてる状態」を作ることでより効果的になります。時間を決めて仕事をすることで脳の回転数があがる。要するにウォーミングアップ→試験を受けてる状態→疲れるまで作業　という流れがいい流れになります。

3.前頭葉を鍛える
前頭葉は尿力された情報を処理する役割を持っています。蓄えられてる情報を組み合わせ、思考を組み立て、各所に命令を出す。いわば司令塔です。「選択」「判断」「系列化」ができるということです。言ってしまえば、判断力がつくということにつながるのです。

4.問題解決力がつく
系列化までができるようになれば、問題解決までのプロセスが建てられるようになります。ゴールを設定し、底に至るまでの手順を選択・判断する。臨機応変に判断する。これが前頭葉を使ったテクニックとなります。

5.大きい仕事をこなす
人間の脳には「マジック７」という傾向があり、同時に５±２の要素しか保持・系列化できないそうです。大きい仕事をやる場合、これくらいの量では収まらないプロセスが発生します。だからこそ前頭葉を鍛え、要素分解、まとめ、重要な部分の抽出、７つの要素を並べて置けるようにすることでどんな仕事もこなせるようになります。

6.クリエイティブな才能も脳の総合力
クリエイティブな才能に必要な要素は、意識的に情報を取る力、記憶を引き出す力、思考を整理する力、情報を組み立てる力が必要ですが、これらも脳を鍛えれば保管できます。

7.社会性にも関わってくる
人並み以上にできると思い込んでる人は、人とは同じことをやらない。指示されても余計なこともくっつけてくる。その状態は脳にもよくない。何をすべきかを脳で判断し的確に動けるのは大事。

一番刺さった部分
前頭葉を鍛える重要性が一番の発見でした。前頭葉の鍛え方も普段のプライベートでやっているようなことを日々続けていくこと、意識付けでかなり変わること。そして、大きい仕事に取り掛かるときは「マジック７」を意識するとかなり違うかもと思いました。

まとめ
脳との付き合い方を変えるだけでこんなにいいことあるんですね！ということです。

「忘れない読書術」を読んで実践したことでかなり効果があったと感じています。本書については、脳の鍛え方を実践し、大きい仕事の組み立て方、集中した時間の過ごし方などを実践しビジネスに活かしていきたいと思います。
ASP.NET Core WebアプリにJavaScriptを書き込んでも挙動不審、動かない

ASP.NET Core WebアプリケーションにJavaScriptを書き込んでも挙動不審、動かない…。

なぜだ、なぜなんだー？？？

で、ブラウザーに届いているソースを見たら、フレームワークが6つくらいJSを読み込んでいるんだから何かあるんだろうなぁ、と思えてきたので

ごそごそ探したら（何を検索で入れたら出たのか忘れてしまった）

@section scripts { }

でくくるのじゃ、

ということが書いてあった
https://qiita.com/misuzoo/items/2c479060320cdcd67dee
のでやってみた。ら。
動いた function も出てきた。
全部が動くわけでもないのが、書いたコードのバグ入り率を示してもいるが…。

コードは括りましょうって、@{} や @Code{} みたいなものか。

ただ、@Html.Raw() でずらずら書いて動いてしまっていた（のでそれでいいと思っていた）のを @section scripts { } に移してダブルクォーテーションにつけていた￥を外しただけだと、逆に動かなくなっている部分も出た。
.NETは奥深いなぁ。

JSのデバッグが、ブレークして状態を見ることもできない、エラーコードも出ない、のは変わらない模様。エラーが出ない・エラーにならないので、細切れにお試し関数作って動作を見ていくしか無い。Ｌチカやロジアナで観測してた半端に昔のマイコンだよ、なので辛い（もっと昔ならICE、もう少しあとならJTAGデバッガーが出回った）
パスワードのオートコンプリートを無効にする

パスワード新規登録時、あるいは変更時など自動保管を無効にしたい瞬間があります。
基本的に以下のようにautocompleteをオフにすることで足りると思います。

````sample-off.html
<input type="password" id="password" name="password" autocomplete="off">
````


すべては[これ](https://developer.mozilla.org/ja/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion#autocomplete_%E5%B1%9E%E6%80%A7%E3%81%A8%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E6%AC%84)を見ていただければ解決するのですが…
````sample-new-password.html
<input type="password" id="password" name="password" autocomplete="new-password">
````

offにするのではなく「new-password」を使おうっていう話です。
各属性の話は[こちら](https://developer.mozilla.org/ja/docs/Web/HTML/Attributes/autocomplete)を参照。
属性を知らないと適切に利用できないですね……。