OmniAICreator/Qiita-1.07M huggingface dataset:
Blazor のコードビハインドでの依存性注入時、CS8618 警告対策の default! が C# 11 で不要に!

## 非 null 許容参照型のプロパティに `!` 付けて null 値突っ込むのはどうなんですか!?

以前にこんな記事を書きました。

https://qiita.com/jsakamoto/items/584f606ae0f8a79b12f9

つまり、Blazor における Razor コンポーネント実装において、依存オブジェクトを DI コンテナからプロパティ注入してもらう際、その実装を .razor ファイルで `@inject` ディレクティブで書くぶんには、まぁ、問題ないのですが (下記例)、

```razor:*.razor
@inject IFooService Foo
```

諸事情でコードビハインド (*.razor.cs) 側でその実装を書く場合、前述の記事のとおり、null 許容参照型のあれこれの関係で以下のように書いている、という話でした。

```csharp:*.razor.cs
...
[Inject]
public IFooService Foo { get; init; } = default!;
```

これの何が不満かというと、**非 null 許容参照型のプロパティに、「!」付けて無理矢理 null 値を突っ込んでいる**、そうやってコンパイラを黙らせているという点ですね。

機能的・実用的には、まぁ、どうやら大丈夫そうなんですけど、でもまったくもって美しくないです。それに、「!」付きで無理くり null 値突っ込むのは、DI コンテナからの依存オブジェクト注入先のプロパティだからかろうじて許容できるのであって (もしも依存性解決に失敗してこのプロパティにオブジェクトを設定できない場合は、そもそもこの Razor コンポーネントが有効化されないので)、ですが、この実装を見て、他のやってはいけない箇所で `... = default!;` みたいな実装をマネされるのもちょっと怖いです。

## それ、C# 11 でスッキリできるよ!

そんなモヤモヤした、Razor コンポーネントのコードビハインドにおけるプロパティ注入実装でしたが、なんと、2022年11月にリリースされた C# 11 で新たに追加された修飾子構文 `required` を使うことで、そんなモヤモヤから解放されます!

今後は下記のように **`required` 修飾子を付けて書けば OK です!**

```csharp:*.razor.cs
...
[Inject]
public required IFooService Foo { get; init; }
```

`required` 修飾子についてより詳しくは、[@ufcpp](https://github.com/ufcpp) さんの下記ページなどがわかりやすいかと思います。

https://ufcpp.net/study/csharp/oo_property.html?p=2#required

以上、Happy Coding!
3D都市モデル「PLATEAU」を活用したFlight Simulator 遊んでみた

3D都市モデル Project PLATEAU Advent Calendar 2022
2日目ということでPLATEAUで再現された東京の街並みをMicrosoft Flight Simulatorから鑑賞したいと思います。今回はFlight Simulator をBeta版が公開されて間もないXbox Cloud Gaming 環境で動かしてみたいと思います。

# 3D都市モデル「PLATEAU」とは？

PLATEAUとは、国土交通省が主導する、日本全国の3D都市モデルを整備・活用・オープンデータ化するプロジェクト（Project PLATEAU）のことです。都市活動のプラットフォームデータとして3D都市モデルを整備し、様々な領域でユースケースを開発しています。

引用:

https://www.mlit.go.jp/plateau/about/

# Microsoft Flight Simulator とは？
今回遊ぶ Microsoft Flight Simulator(FS2020) は、緻密に表現された地球上を飛行機で飛び回ることができるWindows PC用フライトシミュレーションゲームです。最近は「トップガンマーヴェリック」とのコラボ戦闘機が実装されるなど様々なコンテンツが追加されています。

https://www.flightsimulator.com/

# Xbox Cloud Gaming (Beta) とは？
Xbox Cloud Gaming(Beta) は、100種類以上のゲームタイトルをストリーミングでプレイできるクラウドゲーミングサービスになります。インターネット環境さえあれば、ゲームをインストールせずにゲーム機やPCで楽しめる他、スマートフォンやタブレットでも遊ぶことができ、現在はβ版として提供されています。

https://www.xbox.com/en-US/play

# 実際に遊んでみた

まずは上記の Xbox Cloud Gaming (Beta)のサイトでMicrosoft Flight Simulatorを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48135/1712a992-78e6-5066-cf0a-b0024adb12f5.png)

既にXbox Gaming Passを購入済みなのでブラウザからゲームを起動。初めは最近のゲームお約束の数百メガアップデートですが、Cloud 環境なので数秒でインストールまで終了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48135/121dc564-6a99-f9f8-af58-0e4effee8f04.png)

ワールドマップから「東京都庁舎」を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48135/517d227c-2cff-2f5f-79ef-9ee543e0d4d7.png)

フライト開始 !
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48135/bffb1dd8-056a-a4ad-f637-685aa7cf4e2b.png)

正面に東京の街並みが見えます。とてもリアルです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48135/2ae7c17f-bc51-491e-98a8-b8f19df14776.png)

自分で操縦しながら写真撮影(スクリーンショット)もしているため、いいアングルでの撮影が難しかったですがPLATEAUの3Dモデルが利用された美しい街並みを鑑賞することができました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48135/5f7c1f01-4414-cf96-772d-180274a2d7ed.png)

(おまけ) 
撮影で手を離した際に飛行機を墜落させてしまいましたが無事でした。
大体のゲームで墜落すると飛行機は爆発してしまうのですが、Flight Simulatorは安全な仕様になっているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48135/6546ecc9-7b38-2b4d-3958-4e8ad49686f1.png)

# まとめ
ということでPLATEAU × Microsoft Flight Simulator(2020) × Xbox Cloud Gaming (Beta)と様々な技術を使っで東京の街を鑑賞してみました。どれも最近出て来た技術なので個々の技術の利用方法はまだ確立されていないかもしれませんが、他の技術と掛け合わせることで互いに価値を高めていけそうな気がしました。
imreadでのカラーパレット問題

# 結論 カラーパレットのファイルはPILで読むということ

# Indexだけ格納された画像ファイルのshapeがなぜか変わってた問題

## 結論
imreadでマスク画像を加工するとインデックス数が7⇨13となぜか増えてた問題、
imreadが原因だった様子

imread() では、Index 画像も RGB 画像に変換された状態で読み込まれてしまいます。


## 対策1
PIL を使用すると、Index 画像を RGB に変換せずに読み込むことができます。


https://teratail.com/questions/146307

```
pil_img = Image.open(filePath)  # PIL で読み込む。
img = np.asarray(pil_img)
print(np.unravel_index(np.argmax(img), img.shape))
print(img[770][1030])
```

output
```
 5
```
shape
```
[[0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 ...
 [0 0 0 ... 0 0 0]
```
Swaggerの利用


[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)


+ [ファイルが大きすぎて、swagger にインポートできません。ファイルを簡単に編集して、仕様に含めたくないすべてのオブジェクトを削除する他のツールをお勧めできますか? ](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000FTkdC)

生成された OAS ドキュメントをフィルタリングする機能を提供するようになりました:  https://help.salesforce.com/s/articleView?id=release-notes.rn_api_rest.htm&type=5&language=en_US&release=240#rn_api_rest_openapi_spec_beta

>SwaggerとはRESTful APIのドキュメントや、サーバ、クライアントコード、エディタ、またそれらを扱うための仕様などを提供するフレームワークです。
公式サイトでは、The World's Most Popular Framework for APIsと謳っています。

[SwaggerでRESTful APIの管理を楽にする](https://qiita.com/disc99/items/37228f5d687ad2969aa2)
プロジェクト管理：品質とコストと納期

システム開発において、品質とコストと納期は、常に課題とされている。
今回は、品質とコストと納期の相関関係について考えてみます。

# 品質とコストと納期の相関関係
先ず、品質の高いシステムを作るためには、コストが沢山掛かると一般的に思われている。
それは、品質を高めるためには、綿密な設計や幅広いテストが必要だからだ。これには沢山の工数が必要であり、人数が沢山必要だし、スケジュール的にも長くする必要がある。
しかし、これは、間違った考え方です。
高品質のシステムという事は、バグが少なく、保守性も高い。バグが少ない分、TOTALでのテスト工数が減少する。
要するに、コストを幾ら投入しても、高品質のシステムは作る事はできない。高品質なシステムを作るのに、コストは、不要という事になる。

# 品質とコストは反比例
つまり、因果関係として品質が高いからコストが下がる。
これは、品質とコストは、品質が上がれば、コストが下がるので、反比例の関係にある事になる。
![スクリーンショット 2022-11-26 21.06.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/59653b76-6a30-44bf-8859-edea900f8940.png)

# 品質と納期の相関関係
品質と納期の関係は、どうだろう。
上記の話の流れからわかる通り、品質の高いシステムは、納期も短縮できる事になる。テスト工程が短縮されるからだ。品質と納期も、同じく反比例の関係にある事になる。品質の悪いシステムは、いつになってもリリース出来ない。品質が下がれば、納期はドンドン大きくなる。
![スクリーンショット 2022-11-26 21.06.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/42f561a0-6296-1328-4cbc-64a179371625.png)

# 品質が良いとコストと納期は少なくなる
つまりは、高品質のシステムさえ作れば、コストと納期についての問題は、クリアされる事になる。
１．品質とコストは、反比例の関係
　品質が上がれば、コストが下がる
２．品質と納期は、反比例の関係
　品質が上がれば、納期も短くなる
上記は、主軸を品質に置いて、考えた場合である。

# コストと品質、コストと納期の相関関係
逆に、コストを主軸に置いた場合は、どうだろうか？
コストを無理に削減しようとして、リソースを削ったままで、当初の納期設定でシステム開発を行うと、出来上がったシステムは、品質も悪く、納期さえ間に合わないかもしれない。
それは、リソースが足りない状況の反面、納期が迫ってくるために、目に見えない部分のバグを隠してリリースしようとするためだ。
では、納期を主軸に置いた場合は、どうだろうか？
同じく、過度な納期設定をした場合、納期に間に合わせるためには、品質を落として開発を行うしか無い。
結果、低品質なシステムが出来上がってしまう事になる。

# システムは品質ファースト
高品質なシステム開発は、適切なリソース配置と適切な納期設定を行う事により、実現される事になる。
プロジェクトに関わる人間が、この事を正しく理解する事が重要である。システムの成果物としては、品質重視のリソース配置、納期設定を行う事。これにより、高品質のシステムが、低コスト＆短工期で実現される事になる。
コストを下げようとすると結果コストは上がり、納期を早めようとすると結果納期は遅延する。
品質をあげようとするとコストは下がり、納期は短くなる。
react three fiber のチュートリアルからやってみた

```App.jsx
function Box(props) {
  // This reference will give us direct access to the mesh
  const mesh = useRef()
  // Set up state for the hovered and active state
  const [hovered, setHover] = useState(false)
  const [active, setActive] = useState(false)
  
  useFrame((state, delta) => (mesh.current.rotation.x += 0.01))
	// Subscribe this component to the render-loop, rotate the mesh every frame
	// エフェクトの実行やコントロールの更新など、レンダリングフレームごとにコードを実行

  return (
	//JSXで表現された通常のthree.jsの要素
    <mesh
      ref={mesh}
      scale={active ? 1.5 : 1}
      onClick={(event) => setActive(!active)}
      onPointerOver={(event) => setHover(true)}
      onPointerOut={(event) => setHover(false)}>
	//<mesh />==THREE.Mesh()
	//三角ポリゴンメッシュベースのオブジェクトを表現するクラス
      <boxGeometry args={[1, 1, 1]} />
	//BoxGeometry(width : Float, height : Float, depth : Float)
      <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />
	//メッシュスタンダードマテリアル Metallic-Roughnessワークフローを使用した、標準的な物理ベースマテリアル
    </mesh>
  )
}

export default function App() {
  return (
    <Canvas>
	//React Three Fiber Scene の定義
      <ambientLight intensity={0.5} />
	//すべてのオブジェクトに均等に光を当てる
      <pointLight position={[-10, -10, -10]} />
      <Box position={[-1.2, 0, 0]} />
      <OrbitControls />
	//カメラのコントロール
    </Canvas>
  )
}
```
PG16:Error for WITH options on partitioned tables

## はじめに

にゃーん。趣味でポスグレをやっている者だ。

この記事は[PostgreSQL 16 全部ぬこ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/pg16-all-nuko) 10日目の記事です。

今回はパーティション親テーブルの定義時にreloptionsを指定したときのエラーメッセージの改善について書いてみます。

## 概要

|項目|内容|
|:--|:--|
|タイトル|[Error for WITH options on partitioned tables](https://commitfest.postgresql.org/40/3898/)|
|Topic|Bug Fixes|
|ステータス|commited|
|Last modified|2022-11-09|
|概要|パーティション親テーブルに対して``WITH (reloption)``を指定したときのエラーメッセージの変更|

## 変更内容

パーティション親テーブルに対して``WITH (reloption)``を指定したときのエラーメッセージが変わります。

### PostgreSQL 15

```sql
=# CREATE TABLE parted_col_comment (a int, b text) PARTITION BY LIST (a)
=# WITH (fillfactor=100);
ERROR:  unrecognized parameter "fillfactor"
```

``filfactor``というオプション名は存在しているはずなのに、``unrecognized parameter``と怒られてしまいます。
このエラーは本来は

```sql
=# CREATE TABLE parted_col_comment (a int, b text) PARTITION BY LIST (a)
=# WITH (hoge=100);
ERROR:  unrecognized parameter "hoge"
```

のように存在しないパラメータ名を指定したときに表示されるべきですが、PostgreSQL 15では``fillfactor``のように存在するパラメータを指定しても表示されてしまいます。
挙動としては結局はエラーになるのですが、メッセージがイケてない、というバグ報告ですね。


### PostgreSQL 16

PostgreSQLではパーティション親テーブルに指定できないストレージパラメータを指定した場合には、それがわかるようなエラーメッセージに修正されました。

```sql
=# CREATE TABLE parted_col_comment (a int, b text) PARTITION BY LIST (a)
=# WITH (fillfactor=100);
ERROR:  cannot specify storage parameters for a partitioned table
HINT:  Specify storage parameters for its leaf partitions, instead.
```

変更されたメッセージを機械翻訳すると

* ERROR: パーティション分割されたテーブルのストレージ・パラメータを指定できません。
* HINT: その代わりに、リーフパーティションに対してストレージパラメータを指定する。

という内容のメッセージを出力するようです。はい、これなら意味も合ってますね。
なお、PostgreSQL 16でストレージパラメータに``hoge``を指定した場合にも、PostgreSQL 上記と同じメッセージになるようです。

```sql
=# CREATE TABLE parted_col_comment (a int, b text) PARTITION BY LIST (a)
=# WITH (hoge=100);
ERROR:  cannot specify storage parameters for a partitioned table
HINT:  Specify storage parameters for its leaf partitions, instead.
```

どうやら親テーブル作成時に``WITH (reloptions)``を指定すると一律このメッセージになるようですね。

## おわりに

この改修はエラーメッセージの修正ではありますが、こういう部分の改善もユーザの使い勝手という意味では大事なことですよね。

なお、PostgreSQL 15.1にはぎりぎり間に合わなかったようで、リリースノート上もこの事項は記載されていません。15.2以降に入るのかどうかも不明です。
Better Angular stack traces with async-tagging-stack

まだ年一度のAngular Advent Calendarの時期が来ました、今回はAngular v15のStack Trace 改善を紹介したいと思います。
私がJia Liと申します、Angularに7年ぐらいContributionして、今はAngularのCollaboratorとZone.jsのCode Ownerです。

今までAngularのユーザ調査で、一番ユーザが困るのはエラーメッセージとDebug体験です。前のバージョンでAngularが統一なエラーメッセージを提供して、いろいろ改善をしました。でも実際のRuntimeのエラーStack Traceがまだわかりにくい状態です。

例えば、このようなコードで
```
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
})
export class AppComponent {
  title = 'zone-patch';

  onClick() {
    fetch('https://jsonplaceholder.typicode.com/todos/1')
      .then((res) => res.json())
      .then((json) =>
        setTimeout(() => {
          this.title = json.title;
          console.trace();
        })
      );
  }
}
```

以前のバージョンで、出力されたTraceは下記の様な感じで、

```
    at app.component.ts:17:11
    at Generator.next (<anonymous>)
    at asyncGeneratorStep (asyncToGenerator.js:3:1)
    at _next (asyncToGenerator.js:25:1)
    at _ZoneDelegate.invoke (zone.js:372:26)
    at Object.onInvoke (core.mjs:26378:33)
    at _ZoneDelegate.invoke (zone.js:371:52)
    at Zone.run (zone.js:134:43)
    at zone.js:1275:36
    at _ZoneDelegate.invokeTask (zone.js:406:31)
    at resolvePromise (zone.js:1211:31)
    at zone.js:1118:17
    at zone.js:1134:33
```

Zone.jsのStackがメインで、アプリケーションのStackがなかなか探しにくいです。
さらにRxjsを利用したら、9割以上がZone.js/Rxjsになって、Debugすることが大変になりました。
（StackTraceでZone.jsの情報が入ってる理由などを[NgZone](https://angular.io/guide/zone#zones-and-execution-contexts)を
ご参照頂ければと思います）

そして、上記のような複数の非同期操作が親子関係がある場合、Traceで最後の非同期操作しか
追跡できない、上記の例といえば、エラーなどのTraceが`setTimeout`のコールバックで発生することしか
分からないので、この`setTimeout`が`fetch`のPromise then、そして、`fetch`がボタンの`event listener`
で発生することが追跡できないです。たくさんのユースケースで一連の非同期を追跡することが重要ですので、
簡単にLongStackTraceがほしいです。

Angular v15で、Chrome v106以降の新しいDevTools機能によって、これらの問題を大部改善できました。

1．“Just my code”
Chrome v106 でignore-listed-code 機能を強化して、詳細情報が[こちら](https://developer.chrome.com/blog/devtools-modern-web-debugging/#just-my-code)です。
簡単に纏めると、自動的にStackTraceに表示させたくないBundleを定義することができます。Angular v15で下記の様に

![ignore.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109004/1f0181bc-3bac-4a26-3ac7-1d287d5a6099.jpeg)

`zone`, `@angular/core`などのコードを自動的にIgnore listに入れて、Stackでユーザー自分のアプリコードしか表示しないこと
が実現できました。

2．Linked Stack Trace
Chrome v106 で新しい [async stack tagging API](https://developer.chrome.com/blog/devtools-modern-web-debugging/#linked-stack-traces)を提供して、一連の非同期のStackを繋ぐことができるようになりました。
Angular v15でZone.js側でasync stack tagging APIのItegrationを実施して、今下記の様に繋げるStackTraceを
表示することができました。

![newstack.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109004/09cb8d6d-0f84-236c-d122-be62c12ce505.jpeg)

これらの改善によって、ユーザがもっと簡単に自分のコードを集中してDebugすることができました。今これらの機能がChromeしかサポートしません。ぜひChrome v106+で試してください。

以上です。来年もよろしくお願いいたします。
光の波動性と粒子性のビデオをよく見てみる

#
**量子コンピュータの動作の根本はこれじゃないの？**

# その実験はなんだったんだろう？？

今の量子力学を覆う、謎の「コペンハーゲン解釈」、いやなぞといってはいけないよね！！主流なのかな？？でもね、ロジックは壊れまくってると思うんだよね。

ボーアさんいわく。

![Niels_Bohr.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2974126/b50e8450-7ed0-b692-2f2b-c9c6039b21ba.jpeg)

- 量子は波でもない、粒子でもないものだ！！
- 量子が何かを問うてはいけない！計算しろ！
- 物体は見るまで存在しない！！
- 観測すると波がなぜか縮むんだ！！いつどう起こるのか問うてはいけない！
- 過去に戻って観測を消したりもできる！！！
- いやひょっとしたら宇宙がたくさんあるんだ！！

なんかいろいろこじらせているｗ既にトンデモかＳＦかどうか誰にもわからない主張になってる。（全部がボーアさんが言った訳ではないが）

そこでさ、その前に基本の実験をよく見てみようず。

下記が、かの有名な光と波動性の観測の実際の実験、４０年前の実験なんだよ。

よく見よう。最初から最後まで通してみるべき。

https://www.youtube.com/watch?v=ImknFucHS_c

でさ、何をしてるかというと、以下の事だけしてる。

- 光を通して検出器を置くと、光が検知できるよ！！
- ダブルスリットを置くと干渉縞ができるよ！！（波動性）
- どんどん光を絞っていくよ！！検出器には１個１個が検出されるよ！！（粒子性）
- なのに、時間をおいてみると、「干渉縞ができてるよ！！」
- 波のはずだったのに粒子なの？どっち？？

てな話です。それで、ここで彼らはある意味、ビデオで明確に言っているんだよ。よく見てくださいね。

- 光は「波動性と粒子性を持っている」（「波動性 **と！！！** 粒子性」）」
- 光の粒子は「自分自身と干渉している」

ある意味はっきり言ってるね。粒子と波動である、そして自分自身と干渉する！！

はい、でね、そんなもの考えつくかよ！！人知を超えてるのかよ？？

ってな話だったわけなんだけどさ。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f323937343132362f65663365343835372d633866642d613036362d373262642d6533636433353330643933632e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2974126/1751f3ef-9063-befd-ef5d-2bf9bb6eac0d.png)

これだった。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f323937343132362f36623765346630652d306331652d386365332d623561612d3063393738613235633965662e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2974126/67f315f6-abbb-cb8f-6e01-4219f60d36ab.png)


この系でちゃんとその通りになった。

ここでは「波と粒子」が「粒子は自分自身が起こしてる波と干渉する！！」

つまりさ、もう説明から言って、彼らの実験と主張と何も矛盾してない。最初からずっとそうだった。言われてきたものがそういう系なのかが物理屋さんたちには **<font color="Red">「思いつかなかった」だけなんじゃないの？</font>** って。

**「波とその上で跳ねる粒子が、ダブルスリットを通ると干渉縞ができる」**

なんでやん。そのまんまじゃん。

# なぜそうでないと思った！！？？なぜ謎なものだと思った？？


- **量子は波でもない、粒子でもないものだ！！**
　**<font color="Red">もう波と粒子でしたよ。それでいいんですよ。</font>**

- **量子が何かを問うてはいけない！計算しろ！**
　**<font color="Red">いやだからさ。波と粒子でいいの。</font>**

- **物体は見るまで存在しない！！**
　**<font color="Red">いや粒子も波もありますよ・・・</font>**

- **観測すると波がなぜか縮むんだ！！いつどう起こるのか問うてはいけない！**
　**<font color="Red">いやもともと粒子の周りが波なんですよ・・・</font>**

- **過去に戻って観測を消したりもできる！！！**
　**<font color="Red">いやそんなタイムマシンいらんて・・・</font>**

- **いやひょっとしたら宇宙がたくさんあるんだ！！**
　**<font color="Red">なんでこんな単純な実験でSF話になっちゃうんだよ・・・</font>**

![Niels_Bohr.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2974126/b970a2ad-78ca-4e8e-a3f0-7453a47fd643.jpeg)


# どうですか？「コペンハーゲン解釈」、信じるのはやばいんじゃないのって。ちゃんと波と粒子で説明も実験もできるよ。

**Hydrodynamic-inspired Pilot Wave Quantum Theory**

https://qiita.com/imaginarytake/items/b93d01b03775ff54272d

量子コンピュータはさ。もう不可思議な「コペンハーゲン解釈」よりも、ごくごく当たり前なこれを前提として考えた方がいいんじゃないの？って話だな。
2022年12月何故かベストアンサーをつけてくれない質問

[2022年12月の質問の中から整理します](https://qiita.com/Keiji_otsubo/items/46bedc386d4da747c621)


# トレイルヘッド

+ [オブジェクトが無いよと教えているのに確認しない。何でだろうねぇ。](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000MgEjI)
+ [Challenge check is not correct](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000LJGMm)


古い質問ですが、そういえばベストアンサーのつけ方が納得できなので私の回答は削除

+ [Make sure the Approver Settings for your username has Courtney Brown set as the Manager.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000DyMcY)

:::note
Mike DeMaria
I had this same problem.  What I found was that I missed the step in Part 1 where I needed to set my manager to Courtney Brown on the user object.  After setting that (setup/Users/whoever you are logged in as), it passed.

https://developer.salesforce.com/forums/?id=9060G000000MUcTQAW


私もこれと同じ問題を抱えていました。私が発見したのは、パート 1 で、ユーザー オブジェクトでマネージャーを Courtney Brown に設定する必要があるステップを見逃していたことです。それを設定した後（setup/Users/ログインしているユーザー）、成功しました。
:::

先に正解を回答しているのに無視している。

+ [Cannot change omni-channel to available on Set Up Web Chats for Your Console Challenge](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Jfafn)

:::note
+ The Agent has not been assigned the Service Cloud or the Chat User licenses.

To resolve this, ensure both boxes 'Service Cloud User' and 'Chat User' are checked in the Agent's User record. After editing the user record to add these licenses, have the Agent log out and log in again for the new settings to reflect on their end

https://help.salesforce.com/s/articleView?id=000383003&type=1

これを解決するには、エージェントのユーザー レコードで「Service Cloud ユーザー」と「チャット ユーザー」の両方のボックスがオンになっていることを確認します。ユーザー レコードを編集してこれらのライセンスを追加した後、エージェントにログアウトして再度ログインして、新しい設定をエンドポイントに反映させます。
:::

私の回答は削除させてもらった。

+ [Agregar un campo personalizado al objeto de contacto](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JfbA7)

またもや、変です。

+ [My conditional formatting is not giving me option to choose the correct three bins that are required for the challenge.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000MiHu2)

:::note
[Gauge Charts](https://help.salesforce.com/s/articleView?id=sf.bi_chart_intro_gauge.htm&type=5)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3f1d390d-6162-c885-99d3-30d206e6b48d.png)
:::

 

# 意味が分からん

+ [Insufficient Privileges when trying to delete Demo Call Center Adaptor](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000MgaY3)

以下方が意味が分かる。

:::note
Since I was not able to delete the Demo Call Center Adaptor,  I left it alone. I changed the Internal Name in the XML file from OpenCTI to OpenCTI1  before importing the file. 
:::
PRレビューは10件以上指摘したら会話しよう

## はじめに

PRにコメントが大量に入っていると、GitHubは遅くなります。
稀に対象のPRページがひらけなくなります。私も、一度この状態になって困ったことがあります。

何より、コメントが大量に入っていると辛いです。

## なぜ10件以上で会話が必要なのか

修正量やコメントの内容にもよりますが、`成果物への否定が続くと精神的ダメージに繋がる`可能性があるからです。

### レビュー指摘ざっくり分類

1. ここままだと正常に動かない。致命的な問題がある。
1. ある条件において、正常に動かない。判定条件誤りなど、軽微な問題がある。
1. コーディング規約などのルールに合っていない。
1. 期待通りではあるが、今後、問題が起きる可能性がある。
1. 期待通りではあるが、可読性や保守性を考えると修正した方が良い。
1. 期待通りではあるが、「私ならこう表現するのに、勿体無い」と感じる細かい改善。

### 指摘数に応じて、どんな状態になるのか

#### 😁 1〜5件

- レビュアー
    - 細かい内容でも、本人のためになるしちゃんと伝えよう。
- レビューイ
    - 細部までチェックしてくれて、ありがとう。

#### 😃 6〜10件

- レビュアー
    - 細かい内容でも、本人のためになるしちゃんと伝えよう。
- レビューイ
    - 細部までチェックしてくれて、ありがとう。

#### 🙂 11〜20件

- レビュアー
    - 細かい内容でも、本人のためになるしちゃんと伝えよう。
    - 類似コメントも多くなってきて、表現を省略気味で書こう。
- レビューイ
    - 細部までチェックしてくれて、ありがとう。
    - 数多いな、とりあえずやろう。
    - PRページでコメントが閉じられて、取り込み漏れが発生してくる。

#### 😓 21〜40件

- レビュアー
    - 細かい内容でも、本人のためになるしちゃんと伝えよう。
    - 類似コメントも多くなってきて、表現を省略気味で書こう。
    - ちゃんと、確認してきたの？
- レビューイ
    - 細部までチェックしてくれて、ありがとう。
    - 数多いな、とりあえずやろう。
    - PRページでコメントが閉じられて、取り込み漏れが発生してくる。
    - ダメだった。コメント読んで対応するのに1日かかるな。


#### 😱 41〜80件

- レビュアー
    - 細かい内容でも、本人のためになるしちゃんと伝えよう。
    - 類似コメントも多くなってきて、表現を省略気味で書こう。
    - ちゃんと、確認してきたの？
    - いい加減にして！
- レビューイ
    - あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛...........


## どんな会話が必要なのか

- レビュアーから伝えること
    - どのような観点や思いで記載しているか
    - 気をつけてほしいポイント
    - 簡単に対応する方法などTipsがあれば
    - 「いつでも、悩んだら相談してね」
    - 「この対応をしてくれて、ありがとう」
- レビューイに確認すること
    - 成果物について簡単に説明をもらう
    - 作業タスクに不備、抜け漏れがなかったか

## さいごに

レビュー指摘が多いと、思考停止してしまう人もいます。
心理的安全性に関する部分ですし、気持ちよく仕事していくには、思いやりを持って双方対応していくことが必要かなと考えています。
Teams のリアクションについて知らなかったこと

2020 年からアドベントカレンダー期に毎日何かを投稿するという奇祭に参加する習わしがあり今年もゆるゆる参加してみようと思い書くもの。

[新明解emoji字典 - Qiita](https://qiita.com/e99h2121/items/4deb6727ec79b0ed6c0f)

のような Slack 使いだった筆者の感想を述べる記事です。Teams を使いだしたわたくし。
[メッセージにいいね!を付けるか、リアクションする - Microsoft サポート](https://support.microsoft.com/ja-jp/office/%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AB%E3%81%84%E3%81%84%E3%81%AD-%E3%82%92%E4%BB%98%E3%81%91%E3%82%8B%E3%81%8B-%E3%83%AA%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%99%E3%82%8B-a8e6060a-56d7-4173-8ed9-277f8640d8e9)
ができるようになって嬉しい限りである。

[ライブリアクションを使用して Teams 会議で自分を表現する - Microsoft サポート](https://support.microsoft.com/ja-jp/office/%E3%83%A9%E3%82%A4%E3%83%96%E3%83%AA%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6-teams-%E4%BC%9A%E8%AD%B0%E3%81%A7%E8%87%AA%E5%88%86%E3%82%92%E8%A1%A8%E7%8F%BE%E3%81%99%E3%82%8B-a8323a40-3d07-4129-934b-305370a36e21) が会議中にできるのは Slack よりイイネ。

あと、オレオ emoji なんてものがありなんでやと思いきやこんなニュースがあるようだった...

https://wpteq.org/office/post-83862/ 

さてこの [Microsoft 365 Teams のリアクション数増加がアナウンスされました！ - （）のブログ](https://mitomoha.hatenablog.com/entry/2022/09/11/013850)

> このいいね数をチェックするような運用がある場合は事前に方法を検討しておくのが良いかもしれません。プレビューユーザーに指定している場合は 9 月に先行リリースされるようなので今らかでも設定しておくとよさそうです。

無邪気に喜んでいるとああこういう運用変更の想定があるんだなあなどと感じました。今年私が知らなかったことでした :christmas_tree:
マウス・キーボード入力

「instantNeRFで遊ぶ Advent Calendar 2022」の6日目です。

今日はtestbedのマウスとキーボード入力を調べてみます。
testbed.cuの中に入力に関するコードが書かれていました。

:::note
業務外の個人的な検討活動です。
:::

### マウス入力
![5-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/ff8761fa-30b0-6dac-f9af-693500f1e837.png)

- 左ボタンドラッグ
シフトボタンを押していたらフォーカス位置を変更
押していなかったらカメラの向きを変更

##### フォーカスについて
CameraのAperture sizeがゼロだと効果が分かりにくいです。
少し増やすとデフォーカスのエフェクトがかかりました。

![5-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/75581855-0d71-4d88-1f18-daa68e8b3ac3.png)

マスクにフォーカスを合わせた時の画像
デフォーカスのエフェクトは自分で改造してもよさそうです。
![5-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/c9742f27-9dc4-9444-9b44-442fc529639e.png)

- 右ボタンのドラッグ
2つの機能が混ざっているようです。
###### ・sun_dirの変更
sun_dirが変更されるとのことですが、今回は効果を分かりませんでした。
m_sun_dirの参照先を検索するとtestbed_sdf.cuが出てきたのでSDFモード用なのかもしれません。

なお、testbed.cuを見ると照明の意味を思わせる変数がsunとlightの2つが見つかりました。

###### ・slice plane zの変更
上下方向に動かすとピント位置が変更されます。

- 真ん中ボタンドラッグ
カメラの位置を変更


### キーボード入力
![6-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/52e12635-8010-a692-0789-8a4c558d4263.png)

- [　/　] 
　カメラ位置と向きを入力画像の状態に変更　
　画像の番号を前 / 後に送る

- wasd or c or spaceのカメラ移動時 + shift
　 カメラ移動速度5倍
探索に必要なマインドセット（アンチ・知能無双主人公症候群）

あなたは、漫画や小説はお好きでしょうか。どんなジャンルが好きですか？

私はいろいろな分野が好きですが、とくに知能で勝負する主人公が好きです。

古いものだと、シャーロック・ホームズ。

「初歩的なことだよ、ワトソン君」

というセリフに心躍らせたモノです。

ミームにまでなったものだと、デスノートがあるでしょう。

「計画通り」というセリフと悪人の表情には、迫力がありました。

![理想の計画通り](http://e-village.main.jp/gazou/image_gazou/gazou_0092.jpg)

さて、AI の話を振り返ってみると、AI 研究では強力なアルゴリズムが次々と発明されています。

それに痺れすぎた人たちがいます。アルゴリズムの暗黒面といいますか、アルゴリズム原理主義、に陥ってしまった人たちをちらほら見かけます。

経験が少ない、アルゴリズム原理主義者が

「Accuracy が悪いなら、データを増やせばいいじゃない」

なんて、マリー・アントワネットみたいなことを言うわけです。

今回は、研究とビジネスのデータの違い、ということを、ポエム的に語ってみたいと思います。


# 研究のオープンデータセットは、オリンピック競技

とある AI 企業で、新技術のソリューションづくりのために、昔の論文を読み漁ったことがありました。たとえば検索エンジンでは、論文をデータセットにしていて、実験をしていました。

共通で利用される、データセットが少なかったのかな、と思います。

[機械学習の歴史](https://en.wikipedia.org/wiki/Timeline_of_machine_learning)をみると、巨大なオープンデータセット ImageNet が登場するのが、2009年なんですね。斯様な巨大データセットがいくつも作られ、共有されるようになりました。その結果、研究において、データを獲得するコストがさがり、アルゴリズムの研究に集中し、評価指標を競うゲームに変わっていったように見受けられます。

ルールが整備されて、その中で勝負し、世界の頂点を競う。オリンピック競技のようになった、と言えるのではないでしょうか。

代わりに、アルゴリズム研究の論文から消えた／少なくなったものがあります。データの統計的な要約です。

そういうものは、オープンデータセットを作った人がやっています。後からアルゴリズム研究の論文を書く人が要約をしたところで、人類の知に貢献するところは少ないのでしょう。

見えないところではデータ分析をしているのでしょうが、見かけ上はデータの統計的な要約をみることが少なくなったのではないでしょうか。


# ビジネスのデータセットは、政治と調整のゲーム

ビジネスでは、多くの場合、データセットをつくるところから始めます。有効なモデルをつくるには、データの質を担保する必要があります。

多くの場合、データを収集する人は機械学習の素人です。「データの質」と言われても分かりません。その結果、大きく２通りのことが起こります。

分析する人がチェックし、収集する人が再度収集という、往復が発生します。
もう一つは、分析する人が、質が低いデータから意味のあるデータを抽出します。

要は、

収集する人に「お前が集めたデータはクソ」と指摘して、何度も手を動かしてもらうか、
分析する人がデータの便所掃除をするか、

の２択なわけですね。

前者は指摘のやり方がかなり重要です。正論はときに協力者を敵に変えてしまいます。避けなければなりません。

それに、善意の協力者に何度も同じような作業をやってもらうのは忍びないし、データの便所掃除を頑張るのは分析する人が不幸なだけ。ほどよい落とし所を探ることになるのではないでしょうか。

この「ほどよい落とし所」というのは、データを収集する人が理屈と感情の両面で納得できる必要があります。分析する人がそこそこ仕事をした感が必要だし、収集する人がわからなくても仕方ないよねという言い訳も必要です。



# あなたが知能無双主人公になれない理由

未知のデータと、素人のデータ収集。この二つを同時にこなすのは、なかなか大変ではないでしょうか。

一般に、知識と経験が足りないモノ・コトに取り組むとき、誰もが失敗するモノです。そんなときは謙虚になるのが大人の態度ではないでしょうか。

でも、恥をかきたくないのも人情です。まぁ、カッコつけて「計画通り」をやろうとしても、デスノートにはなりません。Spy Family のアーニャになってしまうのが関の山でしょう。

![現実の計画通り](https://d2dcan0armyq93.cloudfront.net/photo/odai/600/e90992eddc20c8080bfe2716acaf3149_600.jpg)

一緒に仕事をする人が、素人だと「え？そこなの？」という失敗をすることもあるでしょう。どんなに優秀な人でも、いえ、優秀な人だからこそ、脱力してしまい、挫けかけるかもしれません。

![大変だよね](https://renote.net/files/blobs/proxy/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBeVZ1QWc9PSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--734ce1859cbfef3b97ea4f4c10eca2929173d04b/DFEC06FC-5FD4-4CE1-99E1-887AA6C3F675.jpeg)

仕方ないですよね、人間だもの。


# 成果を上げるマインドセット

こういう話になると、スキル云々の前に、心構えが大事になってくるのではないでしょうか。

データにも収集する人にも、自分の理想を押し付けない。そうしてしまうと、データ分析をするご自身を、怒りで目を曇らせたり、追い詰めてしまったりするかもしれません。

データにも収集する人にも、自分から歩み寄ろうとする気持ち。それが、自分の身を守るためにも、一緒に仕事をする人のためにも、成果を上げるためにも、いいんじゃないかなぁ、と思う次第です。

![こんな心構え](https://assets.st-note.com/production/uploads/images/68093436/picture_pc_897a9527e090335aedc3bb4fbd110fb8.png)

それっぽいオチがついたようで。お粗末さまでした。
【ハッカソン】開催情報を探す方法

# はじめに
この記事は[**ハッカソン Advent Calendar 2022**](https://qiita.com/advent-calendar/2022/hackathon)の2日目の記事です。
2日目は、**ハッカソンの探し方**について書きます。

# ハッカソンの探し方
私がいつも実践している探し方は**シンプル**です！

## `connpass`で探す
`connpass`の検索窓に`ハッカソン`と入力して検索しましょう！
私が知る限りでは、日本国内で開催されるハッカソン情報は**ほぼ**`connpass`で入手できます

> `connpass`とは、**IT勉強会支援プラットフォーム**です
> **ハッカソン**以外にも様々な**イベント**情報が入手できます！

https://connpass.com/

## `connpass`に載っていないハッカソン（2022/12/02時点）
`connpass`に載っていない**ハッカソン**もあります

https://www.spajam.jp/


# おわりに
本記事で紹介した探し方以外にも「**こんな探し方があるよ！**」って人は是非**コメント**で教えてください！
Railsでselectと自由記述を両立させるフォームをつくる

# 問題提起

　作成したアプリでは、日報を入力する際に作業のジャンルも併せて入力する。例えば「腹筋10回した！」というときはあらかじめ設定した「運動」というジャンル。「参考書20p進んだ」なら「勉強」など。

　ジャンルは予めユーザーが設定してそのあと選択肢にのってくるようにしていた。はじめは。

　でもそれって面倒くさい。


```
　「よし、日報書くぞ」
:ジャンル / 作業内容 / かかった時間
 > 勉強 / 参考書20p / 1H

「あ、そういえば個人開発もやったんだ」

:ジャンル / 作業内容 / かかった時間
 > 個人開発....
　「ジャンルつくってなかった。ジャンル画面に遷移して、
ジャンルを新規作成でつくって、また戻って」

```

　めんどうくさい。

# 自由記述/選択肢の共存

　要は通常は選択肢から選び、ないなら自由記述でつくることができればいいのだ。
選択肢を出すヘルパーはselect_tagが有名だ。しかし、自由記述をやるなら、datalistでつくろう。

　こんなかんじ。

```erb:app/views/reports/_form.html.erb
<!-- 略 -->
<div id="report_items">
    <%= f.fields_for :report_items do |item| %>
    <%= render "report_item_fields", f: item %>
  <% end %>
<!-- 略 -->          
</div>  

<!-- 略 -->

```

```erb:app/views/reports/_report_item_fields.erb
<!-- 略 -->
<%= f.text_field :genre_name ,{:class => 'form-control' ,:list => 'datalistOptions3', :id => 'exampleDataList3' , :value => get_genre_name(f.object.genre_id) } %>
    <datalist id="datalistOptions3">
    <% @select_genre.each do |genre| %>
    <option value= <%= genre.name %> >
<% end %>
<!-- 略 -->
```

 `text_field` のオプションとして`:list`を追加。直後にそれと紐づくidのdatalistを作成する。datalistの中身はコントローラーでとってきたインスタンスをループで回してやる。

```ruby:app/controllers/reports_controller.rb
#略
  def new
    @report = Report.new
    @report.report_items.build
    @select_genre = Genre.where(user_id: current_user)
  end

```

　
　自由に記述した場合は、日報追加時のcreateアクションの時にジャンルを新規追加してやればいい。

```ruby:app/controllers/reports_controller.rb
#略...
 def create
    para = report_genre_params[:report_items_attributes]
    report_lists = para.values
    report_lists.each do |report|
      genre_name = report[:genre_name]
      if genre_name.nil?
        report[:genre_id] = nil
        break
      end
      @genre_new = Genre.find_by(name:genre_name,user_id: current_user)
      if @genre_new.nil?
        @genre_new = Genre.new("name"=> genre_name, "user_id" => current_user.id)
        @genre_new.save
      end
      report[:genre_id] = @genre_new.id
    end
# 略
  private

  def report_genre_params
    params.require(:report).permit(:content, :reported_on, report_items_attributes: [:content, :genre_id, :genreset, :genre_name ,:work_hours, :content_for_share, :id])
  end
```

　そのようになった。

# まとめ

　めんどうくさい、という動作を減らしてつかいやすいものをつくる。そうするとうまくいく気がするなにごとも。
@minecraft/server-uiのレスポンスはPromiseだよという話

# 導入
　皆さんはMinecraftをご存じでしょうか。まぁあの神ゲーを知らない方はほとんどいらっしゃらないかと思います。私もずっとMinecraftBEで遊んでいます。

　さて、最近"[Gametest Framework](https://learn.microsoft.com/ja-jp/minecraft/creator/documents/gametestgettingstarted)"なるものと出会いました。なんでもビヘイビアパック等を追加したときにゲームが正常に動作するかどうかを確認するために追加された要素だそうです。
しかしそれは表向きで、実際は正常に動作するか以外の用途にも十分使えるような、便利なモジュールが用意されています。1.19.50現在、gametestはjavascriptでのみ記述でき、アイテム使用の検知からエンティティのコンポーネントの上書きまで、様々なことが可能です。

# formとは
　formはGametestFrameworkが提供するモジュールの一つ、[@minecraft/server-uiモジュール](https://learn.microsoft.com/ja-jp/minecraft/creator/scriptapi/minecraft/server-ui/minecraft-server-ui)が提供する、Minecraft内でプレイヤーの入力をGUIで受け付けることができる機能です。manifest.jsonのdependenciesを適切に設定した状態で、以下のスクリプトを、エントリーで指定したファイルに記述します。
``` javascript
import { ActionFormData } from "@minecraft/server-ui";
import { world } from "@minecraft/server";

const form = new ActionFormData()
                .title("hoge")
                .body("hogehoge")
                .button("hogehogehoge");

for(let player of world.getPlayers()) { 
    form.show(player); 
} 
```
この状態で、このビヘイビアパックの導入されたワールドに入ると、以下の画像のようなformが表示されます。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953801/bbe1e0a4-0c28-1ee5-4f53-4d8fa96cd6ea.png)
　このようなformを簡単に表示できる機能があるのは素晴らしかったのですが、私のようなプログラミング初心者には難しい落とし穴が多くあり、かなり苦しみました。
　この記事ではその落とし穴のうちの一つ、"form.show()の返り値はPromise"について書いていきます。

# Promiseとは
　formは、そのインスタンスのshow()メゾットを呼ぶことで、その引数に指定したプレイヤーに表示させることが可能です。そのメゾットの返り値はPromiseとなっています。では、そのPromiseとはなんでしょうか。[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise)によれば、
> プロミス (Promise) は、作成された時点では分からなくてもよい値へのプロキシーです。非同期のアクションの成功値または失敗理由にハンドラーを結びつけることができます。これにより、非同期メソッドは結果の値を返す代わりに、未来のある時点で値を提供するプロミスを返すことで、同期メソッドと同じように値を返すことができるようになります。

だそうです。意味が分からないですね。要は、formでプレイヤーの入力を待っている間もプログラムは一時停止せず続きが実行されるよという意味です。ここで躓きました。たとえば以下のようなコードがあったとしましょう。

```javascript
for(let player of world.getPlayers()){
    //ここでformの結果を変数に代入している。
    const result = form.show(player);
    log(result.selection);
```
　理想の挙動は「playerのform入力の結果が出力される」ことだと思いますが、これは正常に動作しません。なぜかわかりますか？
　その理由は、「resultに結果が代入される前にlog()が実行されるから」です。レスポンスの型がPromiseであるformは、高速化のため、プレイヤーがformに入力するのを待っている間も並行してどんどん次の処理を実行していってしまうのです。ではどうすれば理想の挙動をしてくれるのでしょうか。

# Promiseの並列処理制限
　Promiseの並列処理を止めることは、then()によって実現できます。


　formの返り値Promiseで.then()を呼び、その中にアロー関数でformが入力された後に実行したい処理を記述していきます。たとえば
```js
for(let player of world.getPlayers()){
    form.show(player).then((result) => {
        log(result.selection);
    });
}
```
というような具合です。アロー関数の第一引数にformの入力情報とかが代入されています。
注意すべきは、この方法の場合、実際には並列処理が行われている点です。then()を使うともう並列処理はなされないのかというとそうではなく、then()の外側に記述された処理は余裕でform入力を待たずして実行されていきます。
また、escキーを押した場合や、右上のバツ印を押されて、ボタンをどれも選ばずformを閉じた場合、selectionに0が代入されてしまうため、不具合の原因となります。canceledを評価することで、どれも選んでいない状態の場合、弾きましょう。


# 最後に
　この記事は、私が初めて自分で書いた記事ですので、読みにくかった点や分かりにくかった点などがあるかもしれません。もしそういった気になる部分があればどんどん教えていただきたいです。
　ほかにもプログラミング初心者には難しい、私自身が長時間悩まされた落とし穴はあります。今後もそういったポイントの解説記事を書いていき、一人でも多くの「gametestでプログラミング初体験！」みたいな人を救えたならと思います…。
Processingを用いたボイスチェンジャの作成

# 目的
　Processingを用いてボイスチェンジャを作成する。

![1lnxn-jmpbv.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1105419/7bce7373-5c59-3abb-b9ec-667260cc6a3d.gif)


# 経緯
　ボイスチェンジャを作りたいと思い至り、少し下調べをしたが、どうしてもオーディオファイルに保存してから処理をするという物が多い。しかし、実用性を考えるとマイク入力をリアルタイム処理で行いたい。
　そこでProcessingで実装することで実現する。

# 環境
* Windows10
* Processing: 4.0.1
* Minim: 2.2.2
* ControlP5: 2.2.6

# 特徴

https://github.com/T1210Taichi/Voice-Effects

　プログラム自体はgithubの方を参照して頂きたい。
ここでは、いくつか工夫した点を述べる。

## 入出力
　まずProcessingでマイク入力をそのまま出力するなら、MinimのLiveInputを使えば実装できる。
しかしこのLiveInput、とてつもなく音質が悪い。

https://github.com/ddf/Minim/issues/95

Issueでもそのことが指摘されているが、解決はしていないよう。
そこで、ここでも提案されているように、非推奨の方法ではあるが、AudioInputのモニタリング機能(in.enableMonitoring();)で出力する。
エフェクトをかける場合は、AudioEffectをimplementsしたクラスを作成し、エフェクトをかける。

## エフェクト
　エフェクタの実装自体はそれぞれ下記サイトの通りです。
（オリジナリティとしては、UIで簡単に使い分けれるぐらいです。）

* Echo
* Vibrate
　この二つの機能自体はこのサイトのままです。AudioEffectの実装の仕方など詳細に載っています。

http://www.pronowa.com/room/sound_content.html


* Distotion
* OverDraive
　歪系はこのサイトの参考にしました。

https://ism1000ch.hatenablog.com/entry/2014/06/10/145955

# 今後
　今後の予定としてはFFTなどを用いて、ピッチを操作するといったことを実装したいです。

# 参考
Minim

https://code.compartmental.net/minim/index.html

https://code.compartmental.net/minim/javadoc/ddf/minim/AudioSource.html#addEffect-ddf.minim.AudioEffect-

UI

https://sojamo.de/libraries/controlP5/reference/index.html

https://aa-deb.hatenablog.com/entry/2016/11/04/230332

https://qiita.com/NekoCan/items/640ac786bfec27d908ad

Effect

http://www.pronowa.com/room/sound_content.html

https://ism1000ch.hatenablog.com/entry/2014/06/10/145955
【re:Invent 2022】Creating AWS industrial IoT digital twins

# はじめに
アイレット エンタープライズクラウド事業部の黒野です。
本日はWorkshopに参加してきた参加レポートになります。
今回は敢えて、普段関わりのない分野を学ぶ良い機会だと思いIoT系のWorkshopに参加してきました。
![IMG_8944.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/c0bb0607-c69e-d265-9f65-47be7f9be5b7.jpeg)

## Workshop概要
主な内容としては、IoT Greengrassを使用しデータを取り込み、IoT SiteWiseでデータの収集、整理を行った後にIoT TwinMakerを使用して、デジタルツインを作成する内容となります。
最後にAmazon Managed Grafanaを使用して、収集したデータおよび、デジタルツインを可視化するというWorkshopとなっていました。
![IMG_8948.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/2a5efd38-ea7b-b095-f488-bf5b21387aa7.jpeg)

### セッションレベル
- 300 - Advanced
### トラック
- Partner Experience (PEX)
### スピーカー
- Doug Anson, Sr Solutions Architect, AWS
- Ansley Verzosa, Partner Solutions Architect, Amazon Web Services
#### サポーター
常に4名ほどのサポーターの方が巡回されており、困った場合には即座に質問できるスタイルとなっていましたので、大変助かりました。
### 参加者
- おおよそ30人くらいの感覚
- キャパはかなり余裕がありそうな感じだった。
![IMG_8945.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/e0f8b7ba-a2b9-9a88-5599-af478e32e6b9.jpeg)

### 概要
>In this workshop, learn how to connect your industrial assets to the AWS Cloud to ingest data using AWS IoT Greengrass. In addition, learn how to use AWS IoT SiteWise to collect, organize, and analyze data at scale from industrial equipment. Finally, learn how to create a digital twin using AWS IoT TwinMaker and visualize your data and digital twin using Amazon Managed Grafana. You must bring your laptop to participate. This workshop is intended for AWS Partners.
>
>このワークショップでは、産業用アセットを AWS クラウドに接続して、AWS IoT Greengrass を使用してデータを取り込む方法を学びます。 さらに、AWS IoT SiteWise を使用して産業機器から大規模にデータを収集、整理、分析する方法を学びます。 最後に、AWS IoT TwinMaker を使用してデジタル ツインを作成し、Amazon Managed Grafana を使用してデータとデジタル ツインを視覚化する方法を学びます。 参加するにはノートパソコンを持参する必要があります。 このワークショップは、AWS パートナーを対象としています。

## Workshop内容
初めにIoTの○○について解説がありました。
![IMG_8949.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/c14c9334-fb58-53ff-6eea-a05dbad08cef.jpeg)

### デジタルツインについて
自分もこれまで、デジタルツインという言葉の意味を知らなかったのですが、
簡単に言えば、「物理空間にある情報をIoTなどで集めて、あたかもバーチャルな世界に存在するかのようにしよう」というのが基本的な概念になるのかと思います。
【図解】デジタルツインとは？やさしく解説
https://www.softbank.jp/biz/blog/business/articles/202009/digital-twin/
![IMG_8953.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/843f2d17-b1dd-2958-b3c5-e6285475166d.jpeg)

### 作成するアーキテクチャ
AWSアカウントがWorkshop用に発行され、そこでの構築となります。
![IMG_8952.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/e55ec3aa-7c8d-47d3-7f41-167247c6ec6c.jpeg)

### 完成した物
最終的に以下のような形でAmazon Managed Grafanaを使用して、データの可視化を行う所まで完成しました。
Workshopは120分なのですが、普段使わないサービスが殆どだったこともあり、完成にはかなりギリギリな時間までかかりました。
![20221201_124631838_chrome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/0be95330-23b8-007f-e5e0-9300ce048a1c.png)

## まとめ＆感想
- 今回、敢えて普段関わりのない分野を選んでみましたが実際に手を動かすことで新しい発見が多く大変楽しく取り組むことができたので良かったと思っています。
- 基本的に全ての手順書は英語となるのですが、Chromeの日本語翻訳等を使えば基本的に困ることは無いです。
    - AWSコンソールも日本語に設定すればいつも通り使えます。
- サポーターの方だけでなく、周りにいる参加者の方も質問をすれば拙い英語でも気さくに答えてくださるので、もし参加する機会があれば個人的にはおすすめです！
cron 書き方 備忘録

## 記述方法
crontab -e
-e 編集
```
# 分　時　日　月　曜日　ユーザ　コマンド

#毎分実行
*/1 * * * * python3 /home/user/test.py
```

>RedHat系の Linuxでは、このファイルを直接編集することは推奨されていないため、定期的に実行したいコマンドについては「cron.monthly」、「cron.weekly」、「cron.daily」、「cron.hourly」配下のファイル、または、crontabコマンドを用いて、「/var/spool/cron/user」ファイルに設定を行ないます。
https://www.express.nec.co.jp/linux/distributions/knowledge/system/crond.html


## cronファイルの監視
tail -f /var/log/cron
-f ファイル名
研究室の計算機をsudo chown hoge:hoge -R /* で破壊したときの直し方

タイトルにあるように
```
sudo chown hoge:hoge -R /* 
```
でうっかり計算機を論理的に破壊してしまったときの振り返り記事です。
なんとなく直す方法だけ知りたい方、研究室の高級計算機をバックアップもしてないのに破壊してしまい早急にどうにかしたい方は[直し方](#直し方)まで飛んでください。

読み物として読んでいただける方は[いきさつ](#いきさつ)からどうぞ。
また、思い出しながら書いているため、実際の挙動と一部異なるかもしれません。
# いきさつ
時は今年の四月ごろ、修士の先輩が卒業したため研究室の最強計算機に空きがありました。つよつよGPU4枚刺しの最強計算機、それまで使用していたものからどのくらいプログラムが早く動くのか試してみようとなるのは自然なことです。（4枚刺し、私の好きな言葉です。）

該当の計算機にsshでログイン後、いつものように先輩のGitHubのページからDockerfile等が含まれた作業用環境のリポジトリをクローンしました。そして、dockerコンテナを立てる前に、自身の研究内容に最適化するためVSCodeからDockerfileを書き換え保存しようとするも保存できません。
```
EACCES: permission denied,~
```
はいはい、権限ね了解とすでに何度も行っている作業なのですぐに対処法がわかります。GitHubからクローンをすると所有者がrootになるため、所有者をログインしているユーザーに変更するか、所有者以外の権限を書き換える必要がありますがすでに織り込み済みです。

ただ、その作業環境は階層構造になっていたため、再帰的に書き換えるために
```
sudo chown hoge:hoge -R *
```
上記のコマンドを打とうとしました。

カタカタカタ
```
hoge@hoge:~$ sudo chown hoge:hoge -R /*
```
Enter👆

...........?
```
hoge@hoge:~$ sudo chown hoge:hoge -R /*
▯
```
........なぜか帰ってこない。
高々10ファイルもないのに...

あれ...

あっ...

と気づいた瞬間止めたけど手遅れでした。
みごとに所有者がhoge:hogeに書き換えられたファイルの数々。ルートディレクトリから見えるすべてのファイルが所有者hoge:hogeでちょっと笑えました。

まずったかもと思いつつ

```
hoge@hoge:~$ sudo chown root:root -R /*
```
でとりあえずどうにかしようとするもエラーが出る。
調べるとどうやらsudoの所有者はrootじゃないと実行できないらしい。
でもsudoの所有者を書き換えるのにsudoが必要で...

とにっちもさっちもいかなくなり、じわじわとやらかしたことのやばさを実感していきました。

そもそもsudo使えなかったら結構なコマンドが使用できない時じゃん...7月の学会に出した先輩のデータがストレージにあるのに...
とここらへんで焦りが最高潮に。

振り返れば人生で一番焦った出来事であり、おそらく走馬灯に出ると思います。

でも、結果的には先輩のデータもサルベージでき、計算機も復旧までこぎつけられました。（研究室の先生も巻き込んで一か月ほどとかしましたが...）以下ではざっくりとした直し方を紹介します。

# 直し方
ちなみにOSはUbuntu16.04TLSでした。（たしか）
まず、リカバリーモードで入り、rootを選択しましょう。このモードで入ることでsudoなしでコマンドが打てるようになります。[参考](https://tkzo.jp/blog/how-to-startup-ubuntu-with-recovery-mode/)
このモードのままストレージをマウントしてバックアップを取ることも可能だと思われますが、[ここ](https://zenn.dev/t13row/articles/3f69b760032114)を参考にsudo周りのファイルだけ所有者をrootに戻してバックアップがとれるように復旧しました。
あとはストレージを適当にマウントしてバックアップ後、OSを入れ直しました。
（リカバリーモードから直でマウントしてバックアップを取ったのか、通常起動でターミナルからコマンドを打ってバックアップを取ったのかは忘れました。）

ちなみに、メインのストレージが謎のU.2規格だったり、サーバーに近い計算機なのでIPMI上にOSが載っていたりしましたが、まあどうにかなりました。（前者は秋葉で売っていました。後者は配慮しなくても一般的な手順でOSを入れ直せました。）
# 終わりに
何かの参考に、またはやらかしのベースラインとして役に立てれば救われる思いです。
また、再帰的に変更するコマンドを打つ場合は細心の注意を払いましょう。この記事のように、失敗すると甚大なダメージを与える可能性があるので、よっぽど階層数/ファイル数が多くない限りはディレクトリ単位で変更を加えていき、再帰オプションは使用しないのが賢いかもしれません。（破壊的なコマンドはrmを実行する時みたいに本当に実行するか聞いてほしい...）

:::note warn
本記事は振り返りで書いたチラ裏のようなものです。参考にして生じた損害の責任は負いかねます。
:::
【CommonLisp】if-progn-prognを改良したかった

## 事の発端

ifで逐次処理するためだけにprognという魔法の5文字（elseのprognも含めて10文字）を入力したくない


## ソース

```common-lisp
(defmacro with-if (test (&rest then) (&rest else)) 
  `(if ,test
       (progn ,@then)
       (progn ,@else)))

;;; マクロ
(defun main ()
  (let ((hoge 114) (fuga 514))
    (with-if (< hoge fuga)
      ((format t "なんと！！~%")
       (format t "~a は ~a より小さい！！~%" hoge fuga))
      ((format t "驚きの結果！！~%")
       (format t "~a は ~a 以上！！~%" hoge fuga)))))

;;; cond
(defun main2 ()
  (let ((hoge 114) (fuga 514))
    (cond
      ((< hoge fuga)
        (format t "なんと！！~%")
        (format t "~a は ~a より小さい！！~%" hoge fuga))
      (t
        (format t "驚きの結果！！~%")
        (format t "~a は ~a 以上！！~%" hoge fuga)))))

;;; if-progn-progn
(defun main3 ()
  (let ((hoge 114) (fuga 514))
    (if (< hoge fuga)
      (progn
        (format t "なんと！！~%")
        (format t "~a は ~a より小さい！！~%" hoge fuga))
      (progn
        (format t "驚きの結果！！~%")
        (format t "~a は ~a 以上！！~%" hoge fuga)))))

;;; when & unless
(defun main4 ()
  (let* ((hoge 114) (fuga 514) (hoge<fuga (< hoge fuga)))
    (when hoge<fuga
      (format t "なんと！！~%")
      (format t "~a は ~a より小さい！！~%" hoge fuga))
    (unless hoge<fuga
      (format t "驚きの結果！！~%")
      (format t "~a は ~a 以上！！~%" hoge fuga))))

;;; 滅茶苦茶
(defun main5 ()
  (let ((hoge 114) (fuga 514))    
    (unless (when (< hoge fuga)
      :then
        (format t "なんと！！~%")
        (format t "~a は ~a より小さい！！~%" hoge fuga) t)
      :else
        (format t "驚きの結果！！~%")
        (format t "~a は ~a 以上！！~%" hoge fuga))))

;;; 本当はこういうことがしたかった
;;; 多分マクロは無理、関数だと無駄な処理が入るから嫌
; (defun main6 ()
;   (let ((hoge 114) (fuga 514))
;     (perfect-if (< hoge fuga)
;       :then
;         (format t "なんと！！~%")
;         (format t "~a は ~a より小さい！！~%" hoge fuga)
;       :else
;         (format t "驚きの結果！！~%")
;         (format t "~a は ~a 以上！！~%" hoge fuga))))
```

## 実行結果

```
なんと！！
114 は 514 より小さい！！
```

## 結論

こんなマクロ使うよりif-progn-prognのほうがいい
もしくはcond
Amazon Cognitoを用いて、ソーシャルサインインにチャレンジして一部制約で実現しなかった。。

# はじめに
本記事は、cognito ネイティブユーザー（ユーザープール経由で直接サインインしたユーザー）とフェデレーションユーザー（Facebook、Google、Amazon、Apple 経由のソーシャルサインインしたユーザー）をメールアドレスが同じなら同一のユーザーとして扱おうとしたが、Amazon Cognitoの一部制約でCognitoのユーザープール内で実現しなかったお話である。

## Amazon Cognitoとは
ウェブおよびモバイルアプリの認証、承認、およびユーザー管理機能を提供します。ユーザーは、ユーザー名（またはメールアドレス）とパスワードを使用して直接サインインするか、Facebook、Amazon、Google、Apple などのサードパーティーを通じてサインインできる。

## ユーザープールとは
ユーザープールは、Amazon Cognito のユーザーディレクトリです。ユーザープールを使用することで、ユーザーはウェブまたはモバイルアプリに Amazon Cognito 経由でサインインする、またはサードパーティー ID プロバイダー (IdP) 経由でフェデレートすることができます。ユーザーが直接またはサードパーティーを通じてサインインするかどうかにかかわらず、ユーザープールのすべてのメンバーには、SDK を通じてアクセスできるディレクトリプロファイルがあります。

※AWSのドキュメントの　[Amazon Cognitoとは](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/what-is-amazon-cognito.html)　から引用

# Amazon Cognitoの一部制約で実現しなかった理由

## 前提条件
Webアプリの機能要件として、Slackのような①直接サインインしたユーザー（メールアドレスとパスワード）と②Googleのサードパーティーを通してサインインしたユーザーのメールアドレスが同じなら同一のユーザーとして扱いたいとのこと

上記の機能要件を満たすため、Amazon Cognitoのユーザープール内で管理できるか検討した。

## Amazon Cognitoの一部制約とは
AWS Support CenterのSAによると、下記の①でcognito ネイティブユーザーを作成して、②のGoogleのサードパーティーを通してサインインした場合、Amazon CognitoのAdminLinkProviderForUser APIを使用すれば実現は可能だとのことでした。
しかし、当該APIは、既存のCognito ネイティブユーザーおよびフェデレーションユーザーに対して、まだサインインを行ったことのない外部 IdP のユーザーを紐づけることは可能なだけで、②、①の順番で同一ユーザーをユーザープール内で実現することは現時点では不可能でした。


Cognitoのユーザープールのアカウントの種類
①直接サインインしたユーザー（メールアドレスとパスワード）
②Googleのサードパーティーを通してサインインしたユーザー

### ドキュメント
[AdminLinkProviderForUser](https://docs.aws.amazon.com/ja_jp/cognito-user-identity-pools/latest/APIReference/API_AdminLinkProviderForUser.html)
[フェデレーションユーザーを既存のユーザープロファイルにリンクする](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-pools-identity-federation-consolidate-users.html)

# 最後に
本制約が、いつか改善されて欲しい。
p5.toioで忖度福笑い

お正月の接待プレイにいかがでしょうか。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">忖度福笑い <a href="https://t.co/PjrVtHT1AC">pic.twitter.com/PjrVtHT1AC</a></p>&mdash; 🐸 (@_coboco) <a href="https://twitter.com/_coboco/status/1598365283579998208?ref_src=twsrc%5Etfw">December 1, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 開発デバイス
- toioコアキューブ2個
本当は顔のパーツ6個分あると良かったんですが富豪じゃないのでとりあえず2個で。。。

プレイマット（下に敷いてる紙）が面白そうだったので買ってみました。
紙面上に特殊パターンが印刷されていて、座標を認識する仕組みだそうです。
これはコアキューブについてきた簡易プレイマットですが、無地のマットや印刷できるマットなどもあるみたいです。

# 開発環境
toioをJavaScriptで制御するライブラリとしてtoio.jsがtoio公式から提供されていますが、
環境構築せずにオンラインエディタなどでサクッと開発したい場合は、p5.toioが便利です。
[p5.toioのα版リリースについて](https://qiita.com/tetunori_lego/items/23642e50129d934876e5)

注意点として、上記の記事で紹介されているp5.js Web Editorでは現在p5.toioは使えません。

こんな経緯だそうです。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">つい最近の改変だと思うのですが、p5.js Web EditorでWebBluetoothが使えなくなっていました(p5.ble.js, p5.toioなどなど)。<br>接続時に出るエラーの内容はかなり明確なのでIssueをあげたけど、アーキテクチャ思想的に対応できないです、となるとキツいな。<a href="https://t.co/aqvLwQADg2">https://t.co/aqvLwQADg2</a></p>&mdash; Tetsunori NAKAYAMA | 中山 哲法 (@tetunori_lego) <a href="https://twitter.com/tetunori_lego/status/1415654203117084679?ref_src=twsrc%5Etfw">July 15, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


現在は、OpenProcessing上でp5.toioが利用できます。
以下はp5.toio公式からリンクされているサンプルです。
[p5.toio Basic Sample](https://openprocessing.org/sketch/1716380)

# 管理画面
シンプルにこんな感じです。
![FireShot Capture 040 - p5.toio Basic Sample - OpenProcessing - openprocessing.org.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152304/843a01dd-522c-f31f-19b0-6e63716861da.png)

# ソースコード
```js
// キューブのインスタンス格納用
const gCubes = [];
// 正解の位置
const correctPosition = {
    eye: {x: 210, y: 187, angle:-1.6},
    lip: {x: 172, y: 273, angle:-1.6}
};

// キューブとWebBluetooth接続
function connectDevice(partsName) {
	P5tCube.connectNewP5tCube().then(cube => {
		gCubes.push({device: cube, targetPosition: correctPosition[partsName]});
  });
};

// キューブを正解の位置へ移動
function moveDevice() {
	for(let i=0; i<gCubes.length; i++) {
		gCubes[i].device.moveTo({
			x: gCubes[i].targetPosition.x, 
			y: gCubes[i].targetPosition.y, 
			angle: gCubes[i].targetPosition.angle	// ここがなぜか効かない
		}, 50);
		
		// 移動後に角度を変えるため、1秒後に実行
		setTimeout(() => {
            gCubes[i].device.turnTo(gCubes[i].targetPosition.angle, 50);
		}, 1000);
	}
}
```

めちゃくちゃ簡単ですね！
moveTo()で指定した座標に飛んでってくれます！
ただ、なぜかangleの指定がうまくいかず、移動後に角度が変わってくれなかったです。
turnTo()を使うと角度は変えられました。
なので、無理やりsetTimeout()を使って移動→角度変更の二段構えで動かしてます。
移動完了のタイミングを取る方法もありそうな気がしますが、まだよくわかってません。

複数個のキューブを操作する処理は逐次実行しないと1個しか動かなかったので、
for文ではなくforeach()でやりたい場合はPromiseでラップしてあげるとかしないとダメだと思います。

最初プレイマットの仕様や座標移動の仕組みがよくわかっておらず、
現在位置から動かしたい方向と長さを指定するんだろうなーと変な思い込みをして
「アレだあの…三平方の定理…えっとまず直角三角形を作るために直角の点の位置を求めて…」とか
ものすごく無駄なことをやっていましたが。。。
公式ドキュメントをちゃんと読んでないせいですね。
p5.js Web Editorで動かないことにもしばらく気づかずドはまりしてしまいました。。。
どうしてもQiitaの記事がSEO強いのでそっち見ちゃうというか。。。（いいわけ）

「p5.js Web Editorでp5.toioはもう動かないよ！」とQiitaに書き残しておくだけでも意味があると思うので、
どなたかの参考になれば幸いです！
Numpyでnan以外のindexを検索する

# Numpyでnan以外のindexを取得したい

このような場合

```python:
import numpy as np
a = np.zeros(2, 2)
# a = [[0, 0], [0, 0]]
a[0, 0] = np.nan
# a = [[nan, 0], [0, 0]]
```

`a`のなかで`nan`以外のインデックスである`[0, 0]`が欲しい場合があります。

# 結論

```python:
np.argwhere(np.isnan(a))
# [0, 0]
```

非常にエレガントな手法ですね。
詳細は参考文献をどうぞ(英訳しただけ)

# 参考文献
https://stackoverflow.com/questions/37754948/how-to-get-the-indices-list-of-all-nan-value-in-numpy-array