OmniAICreator/Qiita-1.07M huggingface dataset:
NESエミュレータを作る-キャラクターROM見てみる編

[PONOS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ponos) 22日目です。
昨日は[@MilayYadokari](https://qiita.com/MilayYadokari)さんの[Unityでお手軽にスクロール実装！Simple Scroll-Snapの紹介！](https://qiita.com/MilayYadokari/items/d19441e94122dd504556)でした。

[NESエミュレータを作る-CPUちょっと理解編](https://qiita.com/ackyla/items/c48b05ee4e67596f6130)の続きです。
今回はキャラクターROMの中身を見ていきます。

※市販されているゲームを使う場合は私的利用の範囲でやりましょう。
# この記事の目標
キャラクターROMに入っているスプライトを見て楽しもう！
![Screen Shot 2022-12-21 at 15.28.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356727/75f0fa6c-6228-0f15-1be0-57ce1dbfbddd.png)
# キャラクターROMの仕様
キャラクターROMにはゲームの背景やキャラクターに使われる画像、スプライトの情報が入っています。
スプライトのサイズは基本的に8*8（8*16の場合もあるらしい）です。
16Byteでスプライト一つ、1ドットが2bitで表現されます。
これが256個分あり背景用とキャラクター用合わせて512個のスプライトで画面が描画されます。
例えばHello, World!のHにあたるスプライトは前回切り出したキャラクターROMの73番目に入っています。
```ruby
character_rom[0x0480] # 0xe7
character_rom[0x0481] # 0xe7
character_rom[0x0482] # 0xe7
character_rom[0x0483] # 0xff
character_rom[0x0484] # 0xff
character_rom[0x0485] # 0xe7
character_rom[0x0486] # 0xe7
character_rom[0x0487] # 0xe7
character_rom[0x0488] # 0xc6
character_rom[0x0489] # 0xc6
character_rom[0x048a] # 0xc6
character_rom[0x048b] # 0xfe
character_rom[0x048c] # 0xc6
character_rom[0x048d] # 0xc6
character_rom[0x048e] # 0xc6
character_rom[0x048f] # 0x00
```
前半8Byte上位ビット後半8Byteを下位ビットとするとスプライトの完成です！
![無題のスプレッドシート - Google スプレッドシート copy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356727/10b6ce9d-8ee9-8f7c-90d0-40d293bed4b9.png)
このように一つのドットは0〜3の数字で表され、それぞれにパレットの色が割り当てられます。
0は背景色になるので一つのスプライトは最大3色まで使えることになります。
すでにROMダンパーを持っているならいろんなゲームのスプライトを読み出して見てみましょう！
# 余談
初代ドラクエといえば容量問題でカタカナを全部入れていないため「ア」がなく、世界の名前「アレフガルド」がゲーム内で出てこないのは有名な話です。
ファミコンでは文字もスプライトが使われるのでキャラクターROMを見てみると本当にカタカナの「ア」がないのが確認できます。
![Screen Shot 2022-12-21 at 16.59.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356727/1f7aec8b-15be-43b9-f866-91cf70d41e56.png)
さらにファミコンには同じ画面に表示できるスプライトは512種類のみという制約があるため、
別パターンのスプライトを用意しておいてシーンに応じてバンク切り替えというしくみで使うスプライトを切り替えていました。
初期の作品はバンク切り替えを使わずに512種類の1パターンしかスプライトが用意されていないことが多いのですが、初代ドラクエには2パターン目のスプライトが用意されています。
![Screen Shot 2022-12-21 at 17.16.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356727/3dba9f2f-c141-6607-1c7e-358d8c215f49.png)
なにやら文字が重なったようになっています。
ここで1パターン目と同じような部分に使われている色を背景色同じにしてみましょう。
![Screen Shot 2022-12-21 at 17.28.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356727/5fca79c0-026f-24fc-fe78-345b017e203e.png)
別の文字が浮かび上がってきました。
タイトル画面などではこっちのパターンに切り替えて使っているのでしょう。
ちなみに残りの部分には変身した竜王のスプライトがみっちり詰まっています。
やりくりがすごい。

# おわりに
NESエミュレータを作るというタイトルで初めましたが終わりませんでした。
今後も進捗があれば続きを書いていくと思います。たぶん。

明日は[@bluenova1221](https://qiita.com/bluenova1221)さんです。
【spring security + POST】あれ？なんで403エラー?

# 最初に
こんにちは、１年目の新米エンジニアのミツクマです🐻
今日は、業務の中で詰まった内容と解決方法を書いていこうと思います。
それでは、よろしくお願い致します。

# あれ？なんでエラー？
ブラウザからPOSTで送信しようといたところ
エラーが出ていました。見てみると

``` message=Request method 'GET' not supported ```

403 forbidden....?(宇宙猫の顔)
認証が必要な実装した覚えはないし、なんでGET...?となっていました。


# 先に結論
なんらかの手段でトークンを取得して、http headerにトークンを設定してあげないといけない。

# 解決のためにあれこれ調べる
単純にエラー文で調べてみても
403エラー　原因で調べても
* パーミッションのミス
* 送信するディレクトリのミス
* インデックスページの確認
...など自身の悩みの原因とは違う結果が出てきました。

色々調べ方を変えて、spring securityのページに行きつきました。

> SpringSecurityは厳重なCSRF対策を行っており、有効化されている場合にPOSTやPUTと言ったリクエストメソッドに対してトークンを要求するため。設定しないで、送信すると問答無用で403を返します。

##### CSRFとは
クロスサイトリクエストフォージェリの略称で
Webアプリケーションに存在する脆弱性、もしくはその脆弱性を利用した攻撃方法のことです。

こ、こ、これだ！！！
ということで、formをこの様に変更しました。

```form.html
<form method="POST" class="hoge">
  <input
    type="hidden"
    th:name="${_csrf.parameterName}"
    th:value="${_csrf.token}"
  />
以下省略
```

formにトークンを設定することで無事動いてくれました。

# これ以外にも方法はある
業務で使用するファイルのため採用しませんでしたが、WebSecurtyConfigureに特定のページだけcsrfチェックを除外する方法などもあります。
その場合は、WebSecurityConfigurerAdapterを継承しているファイルで
```
http.csrf().ingnoringAntMatchers(...antPatterns)
```
このように設定することで、特定のページのcsrfチェックを除外することができます。
# まとめ
この経験を通して覚えたことは
* CORSを考える
* spring securityを実装している場合は、formにトークンを付与する
* 何が原因なのかを切り取る力と調べる力が不足していること

上二つは技術的に知らない事を知れてよかったです。
最後の項目は、これから数々のコードを読んだり実装していく中で
成長させるべき力だと思うので、研鑽を積んでいきたいと思います。

# 最後に
僕と同じような原因で、詰まってしまっている人の力になれたらと思います。
最後まで、読んでいただきありがとうございます
プログラマがPower Automate for Desktopを使う(6)フロー作りの小技と雑学

※この記事は [プログラマがPower Automate for Desktopを使う](https://qiita.com/jzephyr/items/3ba3b02bfdb3d6a32442) シリーズの一つです。

:::note  warn
フローの保守については [(5)フローを安全に保つには](https://qiita.com/jzephyr/private/3d5cd18c1045aee9054e) に移しました
:::

# フロー作りの小技と雑学
フロー作成作業の効率を上げる手段と**Power Automate for Desktop**に関する予備知識を書きます。雑多な内容です。

## 小技
### STOPメッセージ
**メッセージを表示**アクションを使うと、メッセージダイアログを出せます。私は「タイトルがSTOP、中身が空、メッセージボックスを常に手前に表示する」という単純なメッセージを使いました。
STOPメッセージをフローに挿入すると、**フローデザイナー**で実行中のフローをそこで止め、**フローデザイナー**にて停止することができます。この動きは、その場面でUI要素をピックしたり**レコーダー**での記録を開始する目的で利用できます。
なお、ブレークポイントで停止する手段が元々用意されていますが、停止時に**フローデザイナー**をフォワードにしないと止まったかどうかが分からないため、不安になります。

### WORKサブフロー
私は、名前がWORKで、平時は中身が空のサブフローを使いました。
フローを編集する際に、次の作業手順で利用します。

1. 作成中のサブフローの、ステップ追加箇所に前述のSTOPメッセージを入れておき、そこまで実行し、フローを停止する。
1. WORKサブフローで、手作業または**レコーダー**にてステップを作る。
1. WORKサブフローの先頭から「ここから実行」を使って、動作確認する。
1. WORKサブフローの中身を切り取り＆貼り付けで、作成中フローのSTOPメッセージの個所に移動する。
1. 移動先で動作確認する。
1. フローを保存する。

### デバッグ用出力の手段
デバッグ用の出力のために次の手段を使ってみました。
* **メッセージを表示**アクションでメッセージボックスを出す。
* **Webページのスクリーンショットを取得します**でブラウザ画面をクリップボードに貼り、ペイントを起動して貼り付ける。
* **Webページの上の詳細を取得します**アクションで例えば「Webページテキスト」をクリップボードに貼り、メモ帳を起動して貼り付ける。

**メッセージを表示**アクションのメッセージボックスが、使い勝手が良かったです。1ステップで出力できます。メッセージボックスのサイズは内容で決まりるので、長いテキストでも大丈夫です。

### デザイナーから起動するフローの入力変数の設定
入力変数があるフローをコンソールから起動した場合は、フローを呼び出す際に引数値を指定できます。しかしデザイナーから起動した場合は、入力変数の値を指定する手段がなく、フロー作成時に指定した規定値のままで走ってしまいます。
規定値のままでは困る場合は、次の方法で対処できます。
1. 入力変数の規定値として空文字列(シングルクォート2つ)を指定しておく。
1. フローの冒頭で、入力変数の値が空文字列だった場合は、入力ダイアログを表示してユーザに入力させる。

## 雑学
### ちょっと一息
* 回帰する例題
Windows10の場合は**Power Automate for Desktop**を[重要なことに時間をかけてその他のことは自動化しましょう。](https://powerautomate.microsoft.com/ja-jp/)からダウンロードします。
提供される例題にある「Web ページを開く」というフローを動かすと[重要なことに時間をかけてその他のことは自動化しましょう。](https://powerautomate.microsoft.com/ja-jp/)が出てきます。

* 手はじめに
「hello,world!\n」と唱えるにはどうすれば良いでしょうか。
出力変数を作り、**変数設定**アクションで値として「『hello,world!』と改行」を入力して下さい。

### 名前の通用範囲
* フローの容器
**Power Automate for Desktop**（無償版）の場合、フローを置く場所は「ローカルコンピューター」だけです。
複数のフローをグループ化する手段はありません。代替法として、グループ化したい複数のフローの名前を「グループ名_識別名」の形にすると、見分けやすくなります。
* 変数の通用範囲
変数名の通用範囲はフロー全域です。
変数値の寿命はフロー全体です。設定前にも参照可能で、値は空（くう）です。サブフローで設定した値はサブフローを抜けても生き延びます。
* UI要素の通用範囲
**UI要素ペイン**にある「階層構造」「括りの名前」「**UI要素**の名前」はフロー全域から見えます。ただし**UI要素**を参照できるのは、対象が表示されている場面です。
* サブフロー名の通用範囲
サブフロー名の通用範囲はフロー内の全域です。他のフローからは呼べません。
* フロー名の通用範囲
フロー名は全フローから見えます。1つのフローの名前を変更すると、呼び出し元にも波及します。

### **Power Automate for Desktop**では出来ないこと
#### フローまたはサブフローの名前に依らない呼び出し
例えば
~~~
フローAがフローBを呼び、フローBがフローC1またはフローC2を呼ぶ必要がある。
ただし、フローAがフローBを呼ぶ際に、フローBの引数でフローC1またはフローC2を指定したい。
~~~
という場合に、フローまたはサブフローを名前に依らず呼べると便利です。しかし
* **Desktopフローを実行**アクションで指定できるのはフロー名
* **サブフローの実行アクション**で指定できるはフロー内のサブフロー名

であり、変数を指定でません。ですから、名前に依らない呼び出しは、残念ながら出来ません。

#### **Power Automate for Desktop**の自動操作
例えば

* 1つのフローの全サブフローについて、内容をテキストファイルに保存する

目的で、フローで**Power Automate for Desktop**の自動操作ができれば便利ですが
* **UI要素ピッカー**で**Power Automate for Desktop**のコンソール画面を選べない
* **UI要素ピッカー**で**Power Automate for Desktop**のデザイナー画面を選べない

ため、**Power Automate for Desktop**操作の自動化は、残念ながら出来ません。

 [シリーズの記事一覧へ](https://qiita.com/jzephyr/items/3ba3b02bfdb3d6a32442#シリーズの記事一覧)
プログラマがPower Automate for Desktopを使う(5)フローを安全に保つには

※この記事は [プログラマがPower Automate for Desktopを使う](https://qiita.com/jzephyr/items/3ba3b02bfdb3d6a32442) シリーズの一つです。

:::note alert
「2024年11月19日の朝に「Power Automaate Desktopのフローがすべて消えている」という出来事を経験しましたので、モジュール化について考え直し、この記事を書き換えました。
:::
# フローを安全に保つには
## モジュール化すべきか
フローを高水準なプログラミング言語と捉える場合、フローやサブフローを適宜分割するのは自然ですが、**Power Automate Desktop**にはバックアップや版管理の機能がないため、注意が必要です。
分割には、次のトレードオフがあります。
* フロー数またはサブフロー数が増えるとバックアップが大変
* 同じ処理が2箇所に書いてあると維持しにくい

前者のデメリットが大きいので、フロー数とサブフロー数は極力減らし、独立性の高い共通処理のみをサブフロー化する方針が妥当だと考えます。

例を挙げます。
> 業務でユーザAとユーザBが同一サイトにアクセスし、ほぼ同型の処理をして帳票Xと帳票Yをダウンロードする

ものとします。このケースで、フロー数とサブフロー数を減らす場合は、次の様にフローを作ります。
* フローCを設け、ユーザAもユーザBも、そのフローを使う。 
* 帳票Xの処理と帳票Yの処理は、帳票毎にサブフローを設けるのではなく、Mainの中に直接に書いてしまう。（せめて読みやすさのために、各帳票のステップ群を**リージョン**で囲んでおく）
* ユーザAとユーザBで処理が異なる箇所については、**If**-**Else If**-**Else**構造を使う。（プログラム構造としては悪いスイッチングだが**Power Automate**では止むを得ない）
* 帳票間で共通な「ダウンロード処理」ついては、サブフロー「DoDownload」を設ける。 （ダウンロード処理はWindowsかブラウザの更新で変わる可能性があので、さすがにこれは括りだしておく）

## フロー保守の方法
### Power Automate Desktopが使う場所
**Power Automate for Desktop**（無償版）の場合、フローは個人用OneDriveの中にあります。
私の観察では**Power Automate**は次のフォルダを使っているようです。
* C:\Users\ユーザ名\OneDrive\アプリ\Power Automate Desktop For Windows（OneDriveはローカル側でのパスで表記）
* C:\Users\ユーザ名\AppData\Local\Microsoft\Power Automate Desktop（C:ドライブ内のWindowsユーザ毎の場所です）

両者は（Windowsユーザから見ると）勝手に変化しています。従って整合がとれた状態を**Power Automate**外で作ることはできません。エクスプローラでフォルダーのコピーを作っても、物理的なバックアップにはならないと考えます。

### サブフロー単位のバックアップ
サブフローの中身を文字列として取り出し、テキストファイルに保存することが可能です。サブフロー毎にコピー＆貼り付けを行うので煩雑ですが、フロー数とサブロー数が少なければ可能な範囲です。
新しくフローを作成し、保存済のテキストをサブフローに貼り付けることによってフローが再現できる点は、体験済みです。

### 版管理
**Power Automate**には版管理の機能がないので、代替手段を考えます。代替手段のアイデアは2つあります。
* フローのコピーを作りフロー名を「フロー名_YYYYMMDD」に変更し、2世代程度古くなったら削除する。
* 前述したサブフロー単位のテキストファイルを、適当なツールで世代管理する。（例えば、VisualStudioでフロー単位にソリューションを作り、サブフローのテキストをgetで管理する）

 [シリーズの記事一覧へ](https://qiita.com/jzephyr/items/3ba3b02bfdb3d6a32442#シリーズの記事一覧)
プログラマがPower Automate for Desktopを使う(2)エラーの事例

※この記事は [プログラマがPower Automate for Desktopを使う](https://qiita.com/jzephyr/items/3ba3b02bfdb3d6a32442) シリーズの一つです。
# エラーの事例
Web操作を行うフローのエラー事例を紹介します。
解決方法と対策についてはシリーズの別記事で述べます。

## **フロー デザイナー**では動くのに**コンソール**からだと動かない
次の現象がありました。
> **フロー デザイナー**では動くのに**コンソール**からだと動かない

私のシナリオでは2つのフローを使います。
* BeforLogin　サイトにログインするまでの処理を行うフロー
* AfterLogin　サイトにログインした後の処理を行うフロー

BeforLoginはAfterLoginを呼び出します。

* **フロー デザイナー**でAfterLoginを動かす場合は正常に動きます。
* **コンソール**からBeforLoginを動かすと呼び出されたAfterLoginがエラーになります。

2つの起動方法で異なるのは、そのサイトのログインが継続しているか否かです。
エラーの原因は、操作対象が「ログインのつどURLが決まるサイト」であるのに、私のフローが「URL全体をURLパタン(造語)として使っていた」ためでした。
「URLのうちログインで変動しない部分をURLパタンに採用する」ようにフローを修正して解決しました。
参照際：[(3)実行時にURLが決まり同一タイトルの複数タブが出るサイトの扱い方](https://qiita.com/jzephyr/private/48057f4f8a7acc39fd7c)

## 昨日動いたフローが今日は動かない
次の現象がありました。
> 昨日動いたフローが今日は動かない

フローは変わっていないから、問題は環境にあると推定できます。
私の場合、次の2つの原因でこの現象が起きました。
* ブラウザの拡張機能の増減で、ブラウザから見た拡張機能番号が変わった
* パスワード管理対象アカウントが増えた際に、パスワード管理ソフトの拡張機能のポップアップ画面の内容が変わった

これらの際には、フローの該当部分を作り直して解決しました。
参照先：[(5)環境の変化に強いフローを作るには](https://qiita.com/jzephyr/private/3d5cd18c1045aee9054e)

## Windows Update後に動かなくなった
※これは解決できなかった事例です。
今回のフロー作成中に
> WindowsUpdateをしたらフローが動かなくなった

ということを2回経験しました。
1回目は数日後のWindowsUpdateで「自然に治った」のですが、2回目は試行錯誤の結果「運よく治った」という結果です。

2回目の経過を述べます。

1. Windows11Pro(22H2)で、2022年12月24日のWindows Updateで「KB5021255,KB5020880,KB5021954」が入った後、フローが失敗するようになった。
1. エラー箇所は「Chromeでブラウザ起動」アクションで、画面が出るもののアクションがタイムアウトする。「試みにInternet Explorerで起動をすると画面が出る」ので、Power Automate for Desktopと拡張機能の通信の失敗だと推定した。
1. Chromeの更新を行ったが治らなかった。
1. Power Automate for Desktopの拡張機能のバージョンを変えたが治らなかった。
1. 残る要因はWindowsなので、Windowsのバージョンを下げる決心をした。
1. 「KB5021255,KB5020880」のアンインストールしたが治らなかった。
1. 「KB5021954」はアンインストールできないため「ステムの復元」を行ったが治らなかった。
1. Windows Updateを行い、再度「KB5020880」が入った結果、治った。

この過程で感じたことを書いておきます。
* **Power Automate for Desktop**本体を入れ直すのは、フローのデータがリセットされたり、残っても互換性がなかったりということが心配で、恐くて出来ない。
* ともあれ、システムの復元ポイントは作っておけ。

:::note
「Windows Update後に動かなくなった」件について、ある方とTwitterで情報交換しました。その方も同じ目に遭っておられ、これは自分の問題ではなくWindowsの問題だろうという推測ができたので、心強かったです。
:::
 [シリーズの記事一覧へ](https://qiita.com/jzephyr/items/3ba3b02bfdb3d6a32442#シリーズの記事一覧)
ktorのSessionsでsessions not registeredエラーがでる

# はじめに

以下の書籍をやっていたところエラーが発生しました

https://www.amazon.co.jp/Kotlin%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3-%E6%8E%8C%E7%94%B0%E6%B4%A5%E8%80%B6%E4%B9%83/dp/479806467X/ref=sr_1_14?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3N5QOKDWFIPI9&keywords=kotlin&qid=1671686600&sprefix=kotli%2Caps%2C187&sr=8-14

またこの記事は以下の記事の続きになっております

https://qiita.com/Sicut_study/items/7071674f9f26ab9aa91b

# 問題

以下のコードを実行させたところ`sessions not registered`というエラーが発生しました

```kotlin:Application.kt
        get("/board") {
            val session = call.sessions.get<MySession>() ?: MySession(null, null)
```

デバックを兼ねて以下のコードにしたところ正常にサイトが表示されました

```kotlin:Application.kt
        get("/board") {
            val session = MySession(null, null)
```

このことから`call.sessions.get`でエラーが発生していることがわかります

# 解決方法

[公式ドキュメント](https://ktor.io/docs/sessions.html#cookie)をみて解決することができました

公式ドキュメントには`install(Sessions)`を以下のようにしています

```
install(Sessions) {
    cookie<UserSession>("user_session")
}
```

ここで`cookie`を作成しています。
おそらく`call.sessions.get`で`Cookie`からセッションを取得しているのではないかと思いました。いまはCookieを作る設定はどこにもしていないのでインストール時にする必要がありそうです

そこで以下のコードに修正したところエラーが消えてサンプルアプリが起動できました

```kotlin:Application.kt
fun Application.module(testing: Boolean = false) {
    install(Sessions) {
        cookie<MySession>("my_session")
    }
```

# おわりに

ここでの問題以外はだいたいスムーズに書籍を行うことができました
個人的にはわかりやすくて今後も参考にしそうな書籍だと思うので初心者の方におすすめです

# 参考

https://ktor.io/docs/sessions.html#cookie
配属直後は真田班長ポジションを狙え！

この記事は「[WHIの7つの「Value」に沿ったエピソードを語ってください！ by Works Human Intelligence Advent Calendar 2022](https://qiita.com/advent-calendar/2022/works-hi-2)」の12/22記事になります。

## ７つのバリュー
Works Human Intelligence さんでは、「知恵とテクノロジーで「COMPANY」を進化させ、お客様に最も信頼されるHRテック業界のリーディングカンパニーになる」というビジョンと共に7つのバリューを掲げています。
- Work fun! 「遊び心で仕事を楽しむ」
- Ownership「当事者意識を持ってやり切る」
- Respect「一緒に働く仲間とお客様を尊重する」
- Know our Customers「お客様の価値を創造する」
- Solve「本質を追求し問題を解決する」
- Honor the Challenge「失敗を恐れず挑戦する」
- Integrity「品格を持って誠実に取り組む」

この業界で生きていく上で、「遊び心」と言うのはとても大事だと思っています。
もちろん仕事なので楽しい事ばかりではないですが、好奇心を持って、遊び心をもって取り組むという側面が無いと、長続きしません。少なくとも私は。

その際に大事になってくるのが「失敗を恐れない」というところです。
この記事では、主に新卒や中途、配置転換問わずに新しい配属先に着任した際の行動指針の一つになればと思い書いています。

## 真田班長ポジション
さて、真田班長とは誰なのか。この方です

https://ja.wikipedia.org/wiki/%E7%9C%9F%E7%94%B0%E5%BF%97%E9%83%8E

宇宙戦艦ヤマトに登場している人物で、Wikipediaの説明にもこんな一節があります

> 新兵器やアイテムをほとんど何の伏線もなく登場させることが多々ある。これに関連し、「こんなこともあろうかと」というセリフが代名詞として各種媒体で多用されている

良いですね。最高にかっこいいです。さらっと解決策を提示する。エンジニアとして憧れます。いや、個人的には主人公よりも美味しい役回りなんじゃないか？

もちろん、真田さんが遊び心満載というわけではないですが、ピンチの時に助けてくれる人というのは非常に印象に残ります。
配属したての頃というのは、自分自身も何が役に立てるのかがわからないことが多いですが、周りから見てもその人がどういう事ができるのかがわかりません。
しかし、その時間は余りにももったいなく、それでいて今後を左右する時間でもあります。
そこで、意図的に真田班長ポジションを狙っていきます

>実際に本編中でこのセリフを発したことは『宇宙戦艦ヤマト 完結編』までのシリーズ作品では1回もなく、『ヤマト2』第10話で「たぶんこんなこともあろうと思って〜」という似たセリフを発したのみである

そんな事はいいんです！

## 小さいピンチを探す
大規模な障害や、炎上している案件を颯爽と解決することができればいいですが、配属直後にそれを期待されることは少なく、それに当たるようであれば逃げましょう。

目指すべきは、個人の小さなピンチです。
何故ならば、ここで目指すのは、「配属部署への貢献」ではなく「同僚からの信頼」です。

「あ、この人すごいいいアイディア出してくれた、助かった」と認識しえもらうことで、その恩恵はいつかきっと返ってくるものです。
たとえ返ってこなかったとしても、それほど労力がかからなければ、自分自身で満足することができます。

小さなピンチを探すためには、よく同僚を観察しましょう。
ここで言う同僚は、必ずしも同じチームのメンバーとは限りません。
同じ部署かもしれませんし、同じ会社の人という形でもいいと思います。

きっかけはどうであれ、人の役に立ちたいという思いから人を見ているということは、相手から見ても悪いものではないです。
これから一緒に働いていく仲間に対し興味・新しい関心を持つつ共に、それらは尊重へとつながっていくものだと考えています

## Tipsに目を配る
小さなピンチを救うものは、往々にして小さなTipsであったり、ツールであったり、アイディアだったりします。
何かあった時に、それが出てくるかどうかというのは難しいところですが、日頃から見聞を広めておき、Qiitaなどで情報を収集しておくことが大事です。

この際、完全にそこで書かれている内容を身につける必要はありません。
「こういう問題があった時の解決策の一つがあったな」と覚えておけば探せるものです。
そういう意味では検索力になるのかもしれません。

技術はただ技術としてあるだけでは意味がなく、自分で生かしてこそです。
「これって何に使えるんだろう？」という興味関心をまず持ち、自分の頭の中の索引に記録をしておきましょう。
自分自身を救ってくれることのほうが圧倒的に多いかもしれません。

## 遊び心を持つ
ここまで書くと、ただの業務改善じゃない？って思われるかもしれませんが、個人的には以下の点で通常の業務改善と異なります
- 実施することに関して先に宣言しない
- 自分の中でうまく行きそうだと思うまで声をかけない
- 声をかけるときは、素知らぬ顔で

人によっては、予め宣言をしたほうがやる気が出るという人もいると思いますが、我々真田部は違います。

脈絡もなく新しいツールや解決策を提示するのです

それによって、相手から見ると「コヤツ、デキル！？」の評価を得ることができます。
やった本人は颯爽とその場を去るのです。


今思った。
考え方が昭和なのかもしれないと。。。
ktorのSessionsでio.ktor.application.MissingApplicationFeatureException: Application feature Sessions is not installeというエラーが出る

# はじめに

以下の書籍をやっていたところつまづいたので解決方法をまとめます

https://www.amazon.co.jp/Kotlin%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3-%E6%8E%8C%E7%94%B0%E6%B4%A5%E8%80%B6%E4%B9%83/dp/479806467X/ref=sr_1_14?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3N5QOKDWFIPI9&keywords=kotlin&qid=1671686600&sprefix=kotli%2Caps%2C187&sr=8-14

Ktorを使う上での常識ですが、使ったことのなかった私にとって解決するのもひとくろうでし

# 問題

書籍通りの以下のコードでエラーが発生した

```kotlin:Application.kt
        get("/board") {
            val session = call.sessions.get<MySession>() ?: MySession(null, null)
```

```
io.ktor.application.MissingApplicationFeatureException: Application feature Sessions is not installed
```

# 解決方法

https://qiita.com/doyaaaaaken/items/872b71d8f3dba41aae9e

この記事をみてKtorの使い方について理解した

>Ktorでは認証、ルーティング、ヘッダー付与、Cookie、テンプレートエンジン等の機能は全て、Featureと呼ばれるプラグインになっており、Application.installメソッドでそれらを利用可能にする。

追加の機能はinstallメソッドを利用してプラグインの有効化しないといけないらしいです。たしかに`mustache`はinstallしてました(書籍にはこの部分がないです)

ということで以下のようにApplicationモジュール実行時にinstallしました

```kotlin:Application.kt
fun Application.module(testing: Boolean = false) {
    install(Sessions)
```

ちなみにここまででエラーは消えるのですが書籍のプログラムでは別のエラーが発生しますので以下の記事を参考にしてください

https://qiita.com/Sicut_study/items/46b001b6c1816a11f5a0

# おわりに

書籍通りにやっても動かないのではと思って、サンプルコードを見に行きましたが最後のChapter7-5だけサンプルコードがないという感じでなかなか辛かったです

# 参考

- https://github.com/ktorio/ktor/issues/1368
- https://qiita.com/doyaaaaaken/items/872b71d8f3dba41aae9e
高専祭で作った展示物の話

この投稿はUDHI-LAB++; Advent Calender 2022 9日目の記事です

# 高専祭！
やっと学外からも人が参加できるようになりました
私はちょうど今年四年生で四年生は分野展を毎年担当しています
ということで情報の分野展をすることになったわけですが、ちょうど担任の先生から面白いものの話を聞いていてそれは文字のアウトラインをベジェ曲線でとり透視投影を用いてwebのcanvas上に表示し回転させるものでした
そこで私は文字を入力して自動的に生成し、これを送れる立体掲示板的なものを作ろうと考えました
実際にアウトラインをsvgでとって…とやっていたのですが文字を送るぐらいなら絵を描いておくれたら面白いのではないか！！と思いここで方針転換しました
合わせてちょうどfirebaseに興味があり、特にfirebase Authがどのぐらい使いやすいのかなと気になっていたのでfirebaseを用いてホスティングする形に決めました

ユーザー側はこんな感じで
![kosenfes_Trim.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608139/d64c420b-012f-65bd-5e0a-c8950f119e4f.gif)
サーバー側はこんな感じになりました
![kosenfes-server.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608139/888577f5-ef4e-03bb-5120-38e894db8110.gif)

# やったこと
いざ開発を始めていきます
## 認証系
まずはfirebase Authが気になっていたのでそれについて調べていきました
Authを使ってみたいと言っても絵を送れるというのがメインでしかも学祭の展示物ということであまりアカウントを作って…などとすると手間が大きく面白く無くなってしまうと感じたため匿名認証というものを使いました
狙いとしては最初は匿名認証で自分の送った絵だけをみれる機能を作り、これを永続化するためにgoogleなどのアカウントに移行してもらうという考えです(まだギャラリー機能も移行機能はありません…)
そうして名前を入力するだけで自動的に登録され、すぐに絵が描き始められるようにしました
## 絵を描く機能
後で表示するときはVector形式のデータが欲しいのでcanvasのデータをsvgとして出力できるようなものも合わせて実装していきました
いきなりfirestoreに登録してしまうと結局送らなかった時に勿体無いのでプレビュー画面までlocalStorageで運んでいます
ここでfirebase Authの認証が遅いことで少し問題が発生しました
{user_name}さんの描いた絵を送ろうというメッセージを上に表示していたためこのuser_name取得のための時間がかかり絵を描いている途中で出てきたりして線が大きくずれてしまいました(これ普通の開発だとどうやって解決しているんですかね…)
そこで急遽ローディング画面を追加し、firebase Authの認証が終わるまで絵を描き始められないようにしました
## プレビュー画面
ここでは四角い箱の中に描いた絵が現れ自由に回転させることが出来ます
この時の回転に使った角度を用いてサーバー側で表示するときに回転させています
このsvgのデータと角度のデータをfirestoreに保存しています
## サーバー画面
サーバー側の画面はウィンドウのサイズから表示できる数を計算してその数だけfirestoreから取得して表示しています
新しい絵が送られたらonSnapShotで更新される仕組みです
一個一個の絵を四角で囲んだものを一つのオブジェクトとして内包して複数個展開しています

# 完成
そうして学祭の展示になんとか間に合わせることに成功しました！！
(実は今までもプロ研としての展示があったのですが間に合わずライブプログラミングしてました…)
まだまだ改良したい点はたくさんあって現在改良中ですが、二日間で計100個ほどの絵を送って頂き画面いっぱいに描いた絵が並んでいる光景はとても嬉しいものでした
現在は、サーバー用画面を開放して誰でも見れるようにしています
ここまでお読み頂きありがとうございました
そしてこの場をお借りして、絵を描いていただいた方々本当にありがとうございました！！！
機会があれば来年も展示したいと考えているのでその時はぜひよろしくお願いします
何故かmysql-community-releaseのファイルを取ってこれないとき

## 今回のケース
- 3,4ヶ月前までは同じ設定ファイルで動いていた。
- 設定ファイルの管理にansibleを使っていて、その中でyumを実行してmysql-community-releaseのファイルをダウンロードしてくる設定になっている。
- jenkinsでプロビジョニングを実行したところ、上記の箇所でfailedしており、HTTP Error 403:Forbiddenが帰ってきて、ダウンロードに失敗している。


## 解決方法
手元で持ってこれるかorどのようなステータスコードかcurlで叩いてみてみる。
```zsh
$ curl --head https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
HTTP/2 302
content-type: text/html; charset=UTF-8
x-frame-options: SAMEORIGIN
strict-transport-security: max-age=15768000
expires: Thu, 19 Nov 1981 08:52:00 GMT
cache-control: no-store, no-cache, must-revalidate
pragma: no-cache
location: https://repo.mysql.com//mysql57-community-release-el7-11.noarch.rpm
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
content-length: 0
date: Tue, 13 Dec 2022 09:12:06 GMT
set-cookie: MySQL_S=buob9pnhtqke0ltp6a4glq05bm90k08k; path=/; domain=mysql.com; HttpOnly
akamai-grn: 0.6758c317.1670922726.6ce2192b
```
> HTTP/2 302

あれ、403じゃないのか？？？
もしかしたら、ansible側のyumインストールについて302のステータスコードが実装されていなくて、表示上403に成っているのかも...

> location: https://repo.mysql.com//mysql57-community-release-el7-11.noarch.rpm

多分こっちのURLにすれば直りそうじゃね..?
ということで、指定していたURLをlocationに書かれていたとおりに直して、めでたしめでたし。
pandasのplotでグラフを横に並べる


pandasのplotで棒グラフと円グラフを横に並べて表示してみたいと思います

データ

||A|
|-|-|
|0|test|
|1|train|
|2|test|
|3|train|
|4|train|

コードはこちら
いくつかの記事ではaxesの要素数が2だったりするが、1行の場合は[0,1]の様な書き方はエラーとなった
```python
fig, axes = plt.subplots(1,2,figsize=(12, 6)) # 1行2列
df["A"].value_counts().plot(ax=axes[0],kind='bar')
df["A"].value_counts().plot(ax=axes[1],kind='pie',autopct="%.f%%",startangle=90,counterclock=False,ylabel="")
plt.show()
```

![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401318/05a2bf75-3308-9715-7737-a726c3628642.png)
初めてOSSにコントリビュートした2022年を振り返る

# 概要
今年初めてOSSにコントリビュートをしました。
OSSコントリビュートする前まで、コントリビュートは難しいものという印象がありました。しかし、実際にしてみると思っていたほど難しいものではなく、非常に多くのものを得られたと感じています。
そこで、OSSにコントリビュートする経緯やコントリビュートして良かったことについて振り返りたいと思います。

# 経緯
[Digdag](https://github.com/treasure-data/digdag)というOSSのワークフローエンジンに対してコントリビュートを4つしました。バックエンドはJava、フロントエンドはReactで書かれています。
コントリビュートの内訳としては、バックエンドとフロントエンドの修正がそれぞれ2つずつです。
![](https://storage.googleapis.com/zenn-user-upload/4b997a8abbcb-20221218.png)

Digdagは、私が所属している会社でも利用しているOSSです。
コントリビュートのきっかけはこの中で使われているライブラリが古く、アップデート後に利用できる機能が使えないことでした。なので、記念すべき1つ目のコントリビュートはこのアップデートでした。
https://github.com/treasure-data/digdag/pull/1722
メジャーアップデートだったため、破壊的な修正が含まれており、ビルドの設定ファイルに含まれているバージョン定義を書き換えるだけではだめで、ライブラリ利用箇所にも手を加えなければいけませんでした。
PR作成後に、テストを追加してほしいということと、コードの書き方について指摘があったものの、無事にマージされました。

2つ目も業務がきっかけで修正したものになります。
https://github.com/treasure-data/digdag/pull/1753
外部からあるデータを取得する処理において、対象のデータがあるにも関わらずnullを返してしまう部分があったため、リトライを入れました。このPRは1回目にテストを入れ忘れていたことにでレビューが入ったので、ちゃんとテストも追加した上でPRを作成し、特に指摘がなくマージされました

3つ目と4つ目はフロントエンドの機能追加です。
https://github.com/treasure-data/digdag/pull/1719
https://github.com/treasure-data/digdag/pull/1760
ここまでで述べた2つのバックエンドの修正以外に何かコントリビュートできるものはないかなと考えていました。
そこで私は以下の観点でコントリビュートするものを探しました。

- ゼロベースではなくissueから探す
- OSSのニッチな修正/機能追加をする

## ゼロベースではなくissueから探す
業務きっかけのコントリビュートは、偶然発見した問題を改善するというものです。しかし、コントリビュートを目的にゼロから能動的に問題点や機能追加を探すのは大変です。そこで、先人たちがすでにissueとしてあげている中から探すことにしました。こうすることで効率的にコントリビュートのチャンスを見つけることができます。

## OSSのニッチな修正/機能追加をする
Digdagはワークフローエンジンであるため、コアの実装はバックエンド部分です。フロントエンドも重要ではあるものの、バックエンドの修正と比べると優先度は低く、また比較的簡単なものがあるのではないかと考えました。実際、フロントエンドの機能追加はissueは古いものがあったり、バックエンドの修正に比べて比較的簡単なものが多かったです。
なので、issueの中からニッチなものを選択しこのフロントエンドの修正2つをコントリビュートしました。

# 良かったこと
コントリビュートの経緯と問題の探し方を紹介しました。実際にコントリビュートして良かったことを述べます。

## スキルアップにつながる
最初のコントリビュートではいくつかのコードの書き方やテストについてレビューを頂きました。僕自身あまりJavaの実務経験はなく、コードやテストの書き方については調べながらPRを作成しました。
その過程で未経験の技術についての知識を得て、また有識者にそれをレビューしてもらえることはとても学びにつながったと思います。
また、コードリーディングも必然とする必要があるため、ライブラリへの知識が深まり業務への還元につながったと思います。

## コーディングのエビデンスになる
これが最も良かったことだと思っています。Github等でのコミット履歴は他者からも見やすく評価されやすいと感じています。SNS経由でいくつかのメッセージをいただくことがあるのですが、その中にOSSへのコントリビュートについてを触れてくださる方もいらっしゃいました。
OSSへのコントリビュートは思った以上にコーディング活動のエビデンスになると感じました。

# まとめ
OSSにコントリビュートする経緯やコントリビュートして良かったことについて振り返りました。やってみると、始める前に思っていたほどの敷居の高さはまったくなく、かなり多くのものを得られたと思います。
みなさんも小さな修正でよいので気軽にOSSへのコントリビュート挑戦してみてはいかがでしょうか。
MoAR を作ってみたまとめ

VPS (Visual Positioning System) を使って AR コンテンツを作ってみてどうだったか？のお話。

# Geospatial API

[ビルスケールで AR 表現をする VPS 選定 1](https://qiita.com/Saqoosha/items/b9fef6517831ac136a26)
[ビルスケールで AR 表現をする VPS 選定 2](https://qiita.com/Saqoosha/items/6272ab6f11407b4cc9d6)

ARCore の Geospatial API は使うのはすごく簡単で精度もそこそこよいのでピッタンコを求められない VPS コンテンツであればとりあえず Geospatial API でやっとけば？という感じ。

ARKit の Location Anchors も Gespatial API と比べるとちょっと劣るかな？ぐらいなのでアプリサイズを気にする場合は Location Anchors でやってしまうのもアリ。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2595/0e214555-8ad8-45eb-06ca-a1cdd988635e.png)
Geospatial API を組み込むと 3MB 以上デカくなる。MoAR はモデルデータとかを全部アプリ起動後に読むようにしてたので余裕があってなんとかなったけど割とカツカツ…

最終的に[イメージマーカーを使って精度をあげる](https://qiita.com/Saqoosha/items/3cd77ccb2559cd575854)ということをやったので、その手法が使えるならば一番最初にテストしていた Immersal でも同じレベルの体験は作れたかもしれない。Immersal のよいところは GPS を必要としないので初回起動時の位置情報取得アラートが出ないとこで、カメラ使用許可さえしてくれれば VPS できる。

# App Clip と SceneKit

[アプリをダウンロードせずに起動する App Clip](https://qiita.com/Saqoosha/items/5d2cd0aa08cb1b1d8eb1)

App Store からアプリダウンロードしなくても QR コードからさくっとアプリが起動できてしまう体験はすごくいいんだけど、ファイルサイズ制限がきつくてそのために SceneKit を使わないと 3D コンテンツを作れないというのが辛い。作れないことはないけど手間がかかるしそれはすなわち製作コスト（時間）にはねかえるんで、同じコストだと Unity とかで作るのに比べてしょぼいコンテンツになってしまう。（Unity で作りたい…

MoAR は Museum of AR なのでいろんなアーティストに参加してほしい感じがあるけれど、技術的な参入障壁がそこそこあるのでちょっと手のこんだコンテンツ作ろうとするとなかなか大変なところがアレ。

# 今後？

MoAR の仕組みができたらタイムズスクエアとかでもやりたいねーなんつって話してたら本家 Google 様がやってしまうという😂<br/><br/>

<iframe height="382" src="https://www.youtube.com/embed/iFaKhtlBU7A?rel=0" title="Gorillaz presents… Skinny Ape (Immersive Live Performance in Times Square)" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe><br/><br/>

Gorillas までいくとアプリのダウンロードが多少めんどくさかろうが見たい人は見るんで App Clip のお手軽さは別にいらんのだけど、そのへんの街なかの QR コードからなにかしら VPS (AR) コンテンツを提供する方法としてはまだ有効か？ SceneKit の作りづらさも逆にライバルが少ない要因になりうるかも？ 8th Wall の VPS がそれなりに使えるようになればそっちのがよくなる可能性？

などなどいろいろ考えるポイントはありますがまだまだ進化しておもしろくなりそうな分野ではあるので適宜周辺技術をウォッチングしながらその場その場で適切な手段でおもしろコンテンツを作っていきたい所存であります。
Geospatial APIのチュートリアルを触ってみる

# まずはじめに
チュートリアルを触っただけの記事になっていますのでご了承ください。

# Geospatial APIとは
2022年5月にGoogleのARCoreのSDKに[Geospatial API](https://developers.googleblog.com/2022/05/Make-the-world-your-canvas-ARCore-Geospatial-API.html)が追加されました。
調べると他にもいくつか良記事が出てきますので軽く説明すると、Googleストリートビューが利用できる場所なら即座にARコンテンツが表示される場所を正確に認識してくれる機能をもつもの。

# UnityからビルドしてAndroidで試したもの
揺れが激しく若干酔いますのでご注意ください。

https://youtube.com/shorts/sVTWFw_e6jg?featrure=share

# 触ったみた印象として
### 良い点
* ズレもほぼなく精度が高い。
* 他の方もアップしてますが、道案内アプリとかは作れそう。

### 気になる点
* スマホを前にかざしながら歩くと危ない。
* まだまだ日常として使ってる人は少ないので屋外でやるのは恥ずかしい。
* 撮影していると勘違いされそう。

### 今後、試してみたいもの
* 以前、GPSを使用した音声アプリを制作したので音声とARを組み合わせたリッチな体験を作成することが可能だと思う。
* nrealなどのスマートグラス系と連携して精度良ければ色々作れそう。

# 最後に
今年もみなさまお疲れ様でした。
2022年はメタバースという言葉がかなり流行ってた気がしますが、来年もどのような技術が出てくるのか楽しみです。
置いてかれないようにというプレッシャーがあるなか、来年も良きエンジニアライフが送れるように頑張ろうと思います。

最後まで読んでいただきまして、ありがとうございます！
では！！
Gitの使い方大全

自分用の備忘録的なsomething. 違うところがあったら教えてください・・・
### インストール
- Macの場合(新規Macなら標準実装済)
```bash:Macでインストールする方法
% brew install git
% brew --prefix git
 → (Gitをインストールした場所のパス検索)
% echo 'export PATH="出力されたパス/bin:$PATH"' >> ~/.zshrc
% source ~/.zshrc
 → (変更を反映)
```
- Windowsの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3078416/23eab223-0c52-64b1-7ed9-188f98fe0aa3.png)
 → Gitのインストーラーをダウンロード
Gitのインストーラーを起動しインストール

### Gitの初期設定
```bash:Gitの初期設定
$ git --version
git version 2.39.0.windows.2
$ git config --global user.email "自分のメールアドレス"
$ git config --global user.name "ニックネーム"
```

### Gitで管理したいリポジトリの登録
```
#【注意】必ず管理したいリポジトリ直下に行くこと
$ git init
```
リポジトリの中に[.git]ファイルが追加されていたら大丈夫。

### Git状況を確認
```
$ git status
'''
On branch 【現在いるbranch】
Untracked files: (追跡されないファイル)
赤文字ファイル

Changes to be committed:(コミット予約されているファイル)
緑文字ファイル

Changes not staged for commit:(コミット予約されていないファイル)
赤文字ファイル
'''
```

### ステージングに追加する
```bash:単一ファイル
$ git add ファイル名
```
```bash:レポジトリ内全ファイル
$ git add .
```
### コミットする
```bash:単一ファイル
$ git commit -m "コメント"
```

### Git履歴を確認する
```bash:Git履歴
$ git log
commit ハッシュ値
Author: ユーザー名 <メールアドレス>
Date: コミット日時
    コミットコメント
```

### Gitで管理しないファイルを登録する
.gitignore というテキストファイルを作成する
(.ideaはPyCharmが作成した隠しファイル)
```bash:.gitignore
/.idea/
```
.gitignoreもコミットすればOK

### Gitでbranchを作成する
```bash:branchの作成
$ git branch <ブランチ名>

$ git branch
  issue1
* master
```
引数を指定しなければブランチの一覧を表示。*が付いているのが現在のブランチ

### Gitで新しいbranchを作成とチェックアウトをまとめて行う
```bash:branchの作成とチェックアウト
$ git checkout -b <ブランチ名>
```

### Gitでbranchの切り替え
```bash:branch気り替え
$ git checkout <ブランチ名>
```

### マージのやり方
```bash:マージ
$ git merge <ブランチ名>
```
現在いるブランチに対して<ブランチ名>をマージ
現在 <= <ブランチ名>

### データをもとに戻す
```bash:reset
$ git log
# もとに戻したいハッシュ値を取得する
$ git reset --hard <ハッシュ値>
# これはresetはログには残らない
```

### コミットを打ち消す
```bash:revert
$ git log
# 打ち消したいコミットのハッシュ値を取得する
$ git revert <ハッシュ値>
# Vim形式 → iで編集Esc→:wqで上書き保存
# ログには残る
```

### クローンする
```bash:clone
$ git clone https://www.github.com/ユーザ名/レポジトリ名.git
```

### pullする
```bash:pull
$ git pull
```
【データ基盤構築/BigQuery】IGNORE NULLSについて（NULLが邪魔な時に無視できる機能）

# 今回の課題
`FIRST_VALUE`などのナビゲーション関数を使用する時や、
`array_agg`で配列を生成する際に、NULLを除いて処理を実行したい。

そういった時に、`IGNORE NULLS`というオプションが役に立つ。

## 使用クエリの例
今回は、`array_agg`の例でメモをする。
```SQL
select
    enquete_id
    , array_to_string(array_agg(case when questions_sort_code = 0 then answer end ignore nulls order by rows_sort_code), '|') as answer
from
    `テーブル名`
group by
    enquete_id

```
## クエリの解説
### 1)answerカラムのデータを配列で結合して一つのレコードに格納
```SQL
array_agg(case when questions_sort_code = 0 then answer end ignore nulls order by rows_sort_code)
```
`enquete_id`毎に、`question_sort_code`が0のデータの**NULLを除外**して、
`answer`を`rows_sort_code`の昇順で、配列にして１つのレコードに格納する。


### 2)１つのレコードに配列で格納されているものを一つの文字列にする
```SQL
array_to_string(array_agg(case when questions_sort_code = 0 then answer end ignore nulls order by rows_sort_code), '|')
```
1)で配列にして格納したデータを、`|`を間に入れて、文字列で結合してレコードに格納する。


※参考：[ナビゲーション関数](https://cloud.google.com/bigquery/docs/reference/standard-sql/navigation_functions?hl=ja)（IGNORE NULLSについて記載）

以上です。
UnityでCHaserServerを作り直したお話

この投稿はUDHI-LAB++; Advent Calender 2022 8日目の記事です


# CHaserServerとは
その名の通りCHaserのサーバーです
CHaserはu-16プロコン競技部門で採用されている1v1のゲームです
※ここではCHaserについての説明はこれ以上触れません
# 経緯
私はu-16釧路地区で運営のお手伝いをしているのですが、連戦をしたくてもできなかったり、ランダムマップが最低限のルールにも則っていなかったりその部分をもうちょっと良くしたいなと考えました
最初は元々のCHaserServerがあるのでこれを改良する形で考えていたのですが、言語がUDHI-LABメンバー未経験のC++であることや最終更新が古いことからC++のバージョンも古くなってしまう等の問題から別の言語、ツールでの開発を検討し、メンバーが開発経験がありグラフィカルな実装だとそれ以外では追加の学習コストがかかり早く作ることができないと考えUnityで実装することにしました
# いざ作る
そこでUDHI-LABメンバーの[polyacetal](https://qiita.com/polyacetal),[noko1024](https://qiita.com/noko1024)の2人と開発を開始しました
私はView部分や試合進行などの2人が作ったクラスを合わせていく部分を担当しました
noko1024の要望によりアニメーション機能が欲しいということでそこも担当になりました(言い出しっぺの法則でアニメーションシステム自体はnoko1024に作らせました)

そうして作ってみるとアニメーションなしの部分に関しては今までの経験もあってか苦も無く作っていくことが出来ました
ところが、アニメーションをやっていくとオブジェクトのサイズを変更したのにidle状態に戻るとサイズが画像サイズに勝手に戻って大きくなってしまったりアニメーションを適応するにはブロック毎にオブジェクトを変える方が手っ取り早くなり、キャラクターを独立して動けるように変更したりと色々と課題にぶつかりました

そんなこんなでview自体の動作は上手くいき、あとはルールに則ったランダムマップの生成やデバッグ作業だけの状態まで進めることが出来ました
![CHaserServer.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608139/78e4f02f-6da0-53c9-4d76-0d57d730be81.gif)

# 最後に
まだデバッグ、ランダムマップ生成が終わっていなかったりログ出し機能、再戦機能、リプレイ機能、フォルダからランダムにマップを選ぶ機能など付けたい機能も残っていますが、一先ずマップを展開して動作する段階までは進めることが出来たので興味のある方は是非見ていってください
ここまでお付き合いありがとうございました
最低でもあと1日分はadvent calenderで投稿する予定ですのでよろしくお願いします
newで作成したオブジェクト配列の要素数を取得する方法

# 最初に
本記事の内容は、実際の開発で使わないでください。使ったとしても自己責任でお願いします。
実験用のコードであり、各コンパイラで仕様が保証されていない可能性があります。
※Visual C++とGCCでは動作しました。

# 配列の要素数を取得するための条件
クラスにデストラクタが実装されていることが条件です。
delete[]で配列の削除を行う際に、クラスのデストラクタを呼び出すのに要素数が必要になるからです。
逆に言えばデストラクタが無ければ、メモリ解放だけでいいので要素数が付与されません。

# 実装してみたコード
さっそくですが、コードの紹介です。

```cpp:配列の要素数を取得するコード
#include <iostream>

class A
{
public:
	virtual ~A() {} // デストラクタがあることが条件です。virtualでなくとも構いません。
};

int main()
{
	// デストラクタのあるオブジェクトの配列作成
	A* a = new A[10];

	// 32Bit(x86)の場合は、配列の先頭アドレスの4バイト手前に要素数が入っています。
	std::cout << *((uint32_t*)a - 1) << std::endl;

	// 64Bit(x64)の場合は、配列の先頭アドレスの8バイト手前に要素数が入っています。
	//std::cout << *((uint64_t*)a - 1) << std::endl;

	delete[] a;

	return 0;
}
```
```:出力
10
```

配列の先頭アドレスの4もしくは8バイト手前に要素数が入っていることが分かります。
これでdelete[]を行った時に全てのデストラクタを呼ぶ仕組みが実現できるわけですね。
#KTECテックカンファレンス

12月16日（金）に社内で行われたテックカンファレンスに今回運営スタッフとして参加させていただきました。  
運営スタッフとしてかかわった記録やイベント当日の感想などを書きたいと思います。  
私の自己紹介  
３年前に未経験からIT業界に転職。インフラエンジニアに興味があり独学で資格を取得。（LPICレベル１、CCNA、AWS SAA）
開発経験なし。現在は、事務業務＋AWS運用のお仕事をメインに担当しております。
テック系じゃない私でもすごく楽しめたイベントでしたし、この経験が少しでも役にたったり参考になればいいなと思い共有させていただきます。  

## 運営スタッフにチャレンジしたきっかけ
直属の上司から「運営スタッフとして手伝ってほしい」と言われたことがきっかけでした。  
正直、不安の方が大きかったですが「裏方スタッフってなんか楽しそう、いい機会だしチャレンジしてみよう！」と思い引き受けました。

## 役割
私の役割は登壇者の募集、管理と前日までのサポートがメインでした。  

- LT登壇者募集    
イベント1ヶ月前に19名の登壇者募集を開始しました。  
募集期間が10日間と比較的短かったため週2日程度、リマインド投稿を行い社内で周知されるよう工夫しました。
公開すると、すぐに10名の立候補者が集まりました。
リマインド投稿するたび１人、また1人と立候補者が増えていくのが嬉しかったですしテックカンファレンスへの熱い思いを感じました。  
19名の募集で16名までは順調に集まりましたが残り3名というところで立候補者がです、内部で声掛けを行ったりと苦戦しましたが  
最終的には19名の枠に22名の応募があり一部お断りするという結果になってしまいました。  
本当は立候補者全員に登壇してもらいたかったですが時間の都合上、それができず、、運営の難しさを感じました。

- 登壇者の管理   
募集人数に達したら、グループチャットを作りイベント当日までにタイトルと資料の作成をお願いしました。  
（タイトルは、当日投影スライドを作成する関係でイベント2日前までに決定と締切を設けました。）  
進捗表を作成し、タイトルが決定した方は、タイトル名を赤にしてもらうなど一目見て進捗がわかるよう工夫しました。  
タイトル名がすぐに決定する人もいれば、準備が追い付かず締切に間に合わない人もいて心配もありましたが  
イベント前日にはすべての登壇者がタイトル確定し、投影スライドの準備も間に合ったので良かったと安心しました。  

- 登壇者向けガイド作成   
登壇者の方が当日困らないよう事前準備～発表までの流れを記載した登壇者向けガイドを作成しました。  
作成期間は約1週間程度、ある程度内容が固まったところで一度全体共有を行い、最終確定版は前日に展開しました。  

＜記載した内容＞
- 発表前準備  
　発表資料は当日までに準備していただく  
　スライドのフォーマット形式記載  
　無線LANを記載した紙の張り出し場所  

- 接続テスト、発表前の待機場所  
　レイアウト図を用いて記載  
　接続テスト完了時には、接続テストチェック表に「〇」を記載していただくようにお願い  

- タイムテーブル  
　発表順番を記載したタイムテーブルを記載  

## イベント当日
イベント当日は、参加者の受付～案内を担当。  
その後は、参加者として登壇者の発表を聞いたり、ワークショップに参加しました。  
発表慣れしている登壇者は、発表開始そうそうみんなの知ってる話題で興味・関心を惹きつけ、そこから自身が伝えたい事や意見を話していました。  
なので5分があっという間で「もっと話を聞いていたのにもう終わり！？。。」と感じやすかったです。  
また、短い発表での投影スライドは写真や動画をたくさん使用した方イメージが湧きやすく、聞いている側に伝わりやすいんだなとも感じました。  
午後のワークショップでは、「お題」ごとにディスカッションするメンバーが変わり色んな人と意見交換しながら交流できたのが楽しかったです。  
最初は意見やアイディアが全然出てこなかったですが、人が発信した情報をもとに出てくる思いがあったり、共感で場が盛り上がったりなどワークショップを通じて対面で人と接することの大切さを実感できました。  

## まとめ
社内イベントの運営スタッフはいい経験になりました。  
私の役割はサポートがメインだったので当日は参加者としてイベントの進行を見守っていましたが
会がスムーズに進行していく様子を見ながら、「頑張って良かったな」としみじみ感じておりました。  
また、ワークショップを通じて普段接点がない方との交流がとても楽しかったです。  
色んな考え方に触れる事で新たな発見や気づきがあり視野が広がった気がします。  
テレワークが普及して、社内で人と接することがかなり減りましたが
直接人とコミュニケーションをとることは改めて大事だなと思いました。  
次回もまた社内でこういうイベントがあれば積極的に参加していきたいと思います。  
社内関係者の皆様、貴重な体験をさせていただきありがとうございました！  
この記事を読んで、社内イベントに興味をもって経験される方が増えてくれると嬉しいです。
皆さんも是非チャレンジしてみて下さいね。
ggplotを用いた幾何平均とその信頼区間のプロット

# はじめに
これは、Rに関するSlackのチーム「r-wakalang」で自分で回答した質問を記事にしたものです。
Slackが90日でアクセス不能になるため忘れそうなので、記事にしていきます。

「r-wakalang」については下記記事をご参照ください
https://qiita.com/uri/items/5583e91bb5301ed5a4ba

# 問題
status,scoreの2列で成り立つデータセットにおいて、横軸にA,B,C,Dを並べ縦軸にpointを蜂群図としてプロットし、おなじ図の中にscoreの幾何平均とその95%CIを入れ込みたい。

# 解法
```R
## 必要な関数定義
gmean <- function(Arr) { ##幾何平均を返す
  return(exp(mean(log(Arr))))
}　

gmean_cl_normal<- function(Arr) { ##幾何平均と信頼区間を返す
  return(data.frame(
    y = gmean(Arr),
    ymin = gmean(Arr) - 1.96 * exp(sd(log(Arr))),
    ymax = gmean(Arr) + 1.96 * exp(sd(log(Arr)))
  ))
}
## データ準備
df <-tibble(
  status=c(rep("A",25),rep("B",25),rep("C",25),rep("D",25)),
  score = c(sample(seq(1,5),50,replace = TRUE),sample(seq(6,10),50,replace = TRUE))
)
## プロット
df %>%
  ggplot2::ggplot(aes(x = status, y = score)) +
  ggbeeswarm::geom_beeswarm()+
  ggplot2::stat_summary(fun = gmean, geom = "point", color = "red") +
  ggplot2::stat_summary(fun.data = gmean_cl_normal, geom = "errorbar", color = "red")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3078267/0929d363-63f0-4aff-1418-24d540c5914d.png)

## ポイント
stat_summaryで自作関数を適応することで 解決ができる。
プロットを指定するgeomによって、適応する関数の形が変わる。値が1つしか要求されないされない場合は、```fun=(function)```でいいが、3つ(ymin, y, and ymax)要求される場合は```fun```か```fun.min, fun, fun.max```のどちらかを用いる。違いは下に引用する

> **fun.data** 
> A function that is given the complete data and should return a data frame with variables ymin, y, and ymax.
> **fun.min, fun, fun.max**
> Alternatively, supply three individual functions that are each passed a vector of values and should return a single number.
golangでimportできない問題解決

## どんなことが起きていたか
config.goでutilsをimportしようとしたが、階層を指定しても読み込まれなかった。
二枚目の画像の5行目がimportできなかった。

https://gyazo.com/19b5d02877ffffcd25d90660859b4aa3

https://gyazo.com/7156e0d9759ebcda173fcb854a9ee923

## 解決方法
①Go Modulesの初期化
go mod init [モジュール名]でGo Modulesの初期化をする。
作業ディレクトリ作成直後に初期化した。

```
go mod init [作業ファイル名]
go mod init go-example
```

以下のように、go.modファイルが作成される。
```
module go-example

go 1.16
```

これでimportできるようになった。

## 参考文献

https://nishinatoshiharu.com/go-modules-overview/#Go_Modules
PL-900: Microsoft Power Platform 基礎に合格した話

本エントリーはAdvent Calendar 2022「[NKC-UG Advent Calendar 2022](https://qiita.com/advent-calendar/2022/nkc-ug)」の6日目のエントリーです！

# はじめに

こんにちは。[ノル](https://twitter.com/noll6451)です

今回は「NKC-UG」主催のアドベントカレンダー「[NKC-UG Advent Calendar 2022](https://qiita.com/advent-calendar/2022/nkc-ug)」の6日目にエントリーしました
## きっかけ
Microsoftの資格を一通りとったので、備忘録代わりです。(いま調べたらMS900受験できるようになっているので、近いうちに取りに行く)
自分の合格したMicrosoftの資格一覧は[こちら](https://www.linkedin.com/in/rei-suzuki-22b443211/)で見れます。
~~NKC-UGの代表だから仕方なくではない~~

#この記事の対象者

- Microsoftの認定試験を受験予定の人
- Power Platformを勉強したい初心者の方
- 学生向け

## この資格の説明
[公式](https://learn.microsoft.com/ja-jp/certifications/power-platform-fundamentals/)では
>Microsoft Power Platform を使用したソリューションの構築に関する知識を証明する。
Power Automate を使用した基本的なビジネス プロセスの自動化と、シンプルな Power Apps エクスペリエンスの作成に精通していることを示す。
Power BI を使用したデータ分析の実行と、Power Virtual Agents を使用した実用的なチャットボットの作成に精通していることを強調する。

となっております。

Power Platformに関してですが、色んなサービスがあり、それぞれをどう使うかを問う試験です。
ちなみに
この試験も、社会人、学生関係なく**無料**のバウチャーがもらえる方法があります。


## 試験予約編
社会人も学生も無料になる方法があります(社会人の方はこちらの方法ですが、学生の方は2通りあります)
まずは、下から有無言わさず予約してください。この時のメールアドレスはしっかりと保管してください(個人のメールアドレスが推奨です。)

https://www.microsoft.com/ja-jp/events/top/training-days/powerplatform?activetab=a1%3aprimaryr4

前から録画してある動画を流すウェビナーなので、ぶっちゃけどんな状況でも受けれます。ただしっかりと出席だけはしてください。(バウチャーがもらえないので)

## 勉強方法
この試験ですが、前の記事と同様、ほとんど情報少ないです。
上記のウェビナーですが、合格したいなら、真剣に聞くことをお勧めします！(ほんとに！ここでしか言わない情報が多すぎる)

https://learn.microsoft.com/ja-jp/certifications/exams/pl-900


まずは**ヒント**というところをしっかりとみてください(重要です)
実際の試験の操作も体験できます。
その次に下にスクロールすると、勉強できるようにラーニングパスがあるので
それに沿って勉強すれば十分です。(もちろん無料です)

公式の問題集

https://learn.microsoft.com/ja-jp/certifications/resources/pl-900-sample-questions?azure-portal=true

youtubeで実際に手を動かすことも必要です(使ってないとわからない問題もあるため)

https://www.youtube.com/results?search_query=powerplatform


# 試験を受けるときの注意点

- 日本語がおかしい場合がある(英語に直す、察する)
- 採点されない問題が出てくる
- 出題範囲にない問題が出てくる(たぶん採点されてない？)
- 人によって問題数が違う
- 意外と時間がないので、サクサク進める(後から回答し直せる)
- 分からなくてもとりあえず何かしら選ぶ(1000点中合格スコア700だけど、7割ではないらしい)


Microsoft試験基礎シリーズの4記事めです。
ぜひこれを機にとってみてはいかがですか？？(実は、基礎資格は有効期限はないです)
ちなみ学生ですが、実は単位認定される可能性があります。

https://learn.microsoft.com/ja-jp/certifications/college-credit


皆さんの合格をお祈りしてます。

Microsoft試験基礎シリーズ
1記事め

https://qiita.com/Rei1729/items/89d693c73e0156764beb

2記事め

https://qiita.com/Rei1729/items/d889385246886ec9dfa9

3記事め

https://qiita.com/Rei1729/items/f635ec940beaef6a6e6a
AIに愛車の画像を出力してもらいたい

# はじめまして。

こんにちは。

この度初めてこちらのサイトに記事を投稿させていただくのですが、あまり自分の技術には自信がないので試しに話題のツールを使って任意の画像を生成した過程をご紹介してみようと思います。

今回は、自然言語による記述からあらゆる画像を作成できるAIの「DALL・E2」を使って、私の愛車であるCBR650Rの画像を生成してみようと思います。

こちらのリンク先で見れるバイクが私の愛車である2019年式のCBR650Rです。かっこいいですね。(https://www.bikebros.co.jp/catalog/1/999_77/#spec_top)


# DALLE2を使ってみた

DALLE2は、前述の通り自然言語による記述からあらゆる画像を作成できるAIです。
試しに適当な画像を生成してみました。
以下の画像はDALLE2のメインページです。中央に表示されているテキストボックスに任意のテキストを入力しGenerateをクリックすると、生成が開始します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3077660/29a13db2-9a6c-90d4-8315-5a715bbf2d34.jpeg" width=80%>

(入力テキスト:Dog eating apple)
出力画像↓
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3077660/d0dc890b-b895-e961-a26b-63fd8c32b998.png" width=50%>
おぉー。確かにリンゴを食べてるっぽい犬の画像が生成されました。すごい。

では次に、私の愛車の車種名である「CBR650R」と入力してみましょう。

(入力テキスト:CBR650R)
出力画像↓
![しびしび１.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3077660/5c8ac1e9-cc40-8806-e57f-2c30428ec2dd.jpeg)
![しびしび２.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3077660/babb5249-7128-d505-c4ce-301f179e64d8.jpeg)
うーん。確かにバイクの画像であることは間違いなさそうなのですが、これは650Rとは異なる排気量で販売されているCBR250RRやCBR400Rに似ているような気がします。
(参考:https://www.bikebros.co.jp/catalog/1/5_16#spec_top
https://www.bikebros.co.jp/catalog/1/5_25/#spec_top)
やはりブラウザでの検索数や出回っている画像の数などに依存してしまうのでしょうか。

より正確な出力を求め、今度は入力テキストに情報を追加してみました。

(入力テキスト：cbr650r using an inline 4-cylinder)
出力画像↓
![しびしび４kitou.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3077660/88084701-22e3-41f4-c3fb-19c9b67048c0.jpeg)
__バイクがおかしなことになった･･･__

その後も「short silencer」とか特徴的なパーツの情報をプロンプトに組み込んでみたのですがなかなかうまくいかず…。あまり学習できていない画像や入力された回数が少ないであろう二輪車関連の用語が含まれるプロンプトなどはまだ綺麗に出力とはいかないのかもしれません。

# おわりに
今回は目的の画像を上手く出力させることはできませんでしたが、この先DALLE2の学習量が増え、ユーザーのプロンプト記述も上手くなっていけばもっと繊細な画像も出力してくれるようになりそうですね。
ただ現時点でのDALLE2でも十分精度は高いと思うので、少し遊んでみる分にはとても面白いツールだと思います。まだ触ったことが無い方は是非！
ssh接続と同時に自動でtmux/screenのセッションにアタッチ

いろいろと何時間も調べたら
```bash:自動でセッションにアタッチ
% ssh <host> -t tmux attach
or
% ssh <host> -t tmux attach -t <session name>
```
と`-t`オプションを付けるだけだという事が分かった。。。
通常の`-t`なしだとtmux/screenの様な（仮想）端末使用のコマンドは実行に失敗してsshの接続を終了してしまう。

いつも接続するリモートマシンにはこのコマンド自体のaliasを作っておくと良いだろう。
```bash:Alias例（bash）
alias ssh_HOSTA_S0='ssh my_hostA -t tmux attach -t 0'
```
又、以下の様にtmuxのセッションが既にあればそれにアッタッチ、なければ新たに作る、の様なシェルスクリプトを作っておいてそれを実行するようにすると良いかもしれない。

https://qiita.com/aereal/items/1e1d3053c33f528363d9

https://www.mk-mode.com/blog/2013/06/06/linux-mint-tmux-auto-attach/

そしてこれ書いた後いろいろ探してたらここに答え載ってた。。。

https://qiita.com/gari8641/items/894a255b52a34e36dd9f

そしてtmux/screenについていろいろ調べたらbyobuと言うコマンドがある事を知る。もしbyobuが使えたら生のtmuxよりそれを使う方が断然便利。上記のスクリプトのセッションが既にあるかないかの判断もbyobuがやってくれる。
```bash:byobuを使って自動的にセッションにアタッチ
% ssh <host> -t byobu
```
Select2オプション設定

select2のオプション設定をメモします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072069/279ed0cb-5bd4-4b6b-59c3-87181dc9849a.png)

width：横幅
placeholder:プレースホルダー
allowClear：一括削除のボタンを付けるか否か
language：言語の設定
tags：検索で入力した値がoption要素になくても反映される
【Rails】ポリモーフィックを使用した抽象モデルの作成

ポリモーフィック関連付けを使用し、抽象モデルを作成したのでそのアウトプットとなります。

## 前提条件

今回車を例に説明します。
これまでのサービスでは「SUV」の状態を管理する`SuvClass`が存在しました。
しかし、新しい概念「スーパーカー」`SuperCarClass`を導入することになりました。
そこで、抽象クラス`CarClass`を作成し、`SuvClass`、`SuperCarClass`に従属させようと考えています。

※ そもそも設計に問題があるかもしれませんが、サンプルなのでお許しを。。

## ポリモーフィック関連付けを使用した経緯
これから新たに増える可能性のある車の概念に対して、車を特定するユニークな`id`が必要でした。

## 関連付け
関連付けは以下のようになります。

### モデル

```ruby:sample.rb
class Car < ApplicationRecord
  belongs_to :carable, polymorphic: true
end

class Suv < ApplicationRecord
  has_one :cars, as: :carable
end

class SupreCar < ApplicationRecord
  has_one :cars, as: :carable
end
```

### マイグレーション

```text:マイグレーションファイル
class CreateCars < ActiveRecord::Migration[5.2]
  def change
    create_table :cars do |t|
      t.references :carable, polymorphic: true
      t.timestamps
    end
  end
end
```

このように関連付けすることで、`Car`モデルのインスタンスから、親(Suv, SuperCar)のデータを取得できるようになります。

```ruby:sample.rb
@car.carable
```

## 抽象クラス(Car)をどう活用していくのか？

親クラス(`Suv`, `SuperCar`)が作成されるタイミングで、`Car`が作成されるようにします。

```ruby:SuperCarsController.rb
class SuperCarsController < ApplicationController
  def create
    super_car = SuperCar.new(super_car_params)
    super_car.build_cars # <= これで Car が作成される。
    super_car.save
  end
end
```

`Car`が作成されたことによって、以下のように`Car`の`id`を指定することで、親のデータを取得できます。

```ruby:sample.rb
@car = Car.find(params[:id])
@car.carable
```

このように実装することで、新たな車の概念(`CompactCar`)などが登場しても、同様に`Car`クラスに従属させるように関連付けすれば、ユニークな`id`を取得できます。

## まとめ

今回ポリモーフィック関連付けを初めて使用しましたが、便利だなという印象です。
しかし、外部キー制約(参照整合性制約)が使えなくなるなど問題点もあるので、そこは認識して導入を検討する必要がありそうです。

## 参考資料
[Railsガイド](https://railsguides.jp/association_basics.html#%E3%83%9D%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91)
[SQLアンチパターンを読んで （ポリモーフィック関連について）](https://shiro-secret-base.com/?p=918)
LINEミニアプリについて

# LINEミニアプリとは
### LINEアプリの中にサービスを提供できる
- 企業やお店のサービスを簡単に提供できるようになります。
### 業界に特化した便利な機能
- 飲食や美容サロン・小売店・医療機関など、
### LINE公式アカウントとの連携
- 公式アカウントと連携していれば友達が増やせます。
### 面倒なログインが不要
- LINEの中で使えるのでアプリのダウンロードやログイン作業が不要です。
### すぐにサービスの利用が可能
- QRコードやWebページからのリンクで利用しやすい。
### 全てLINE内で完結
- 注文対応や整理券発券、会員証発行などLINEのなかで作成できます。
### すぐれた通知機能
- 専用の通知機能で順番の呼び出しや予約リマインドを無料送信。(値下げ・ショッミング特典・新商品広告・割引クーポン・プロモーションなどの情報を含む告知はNG)
## 主な機能
- モバイルオーダー(店内)
- テイクアウト
- デジタル会員証
- 来店予約受付
- 順番待ち受付
- 呼び出し通知
- ポイントカード
- スタンプカード
- キャッシュレス決済

と簡単にご紹介させて頂きました。詳しくは[公式ページ](https://www.linebiz.com/jp/service/line-mini-app/)よりご確認下さい。
MB-920 Microsoft Dynamics 365 の基礎 (ERP)に合格した話

本エントリーはAdvent Calendar 2022「[NKC-UG Advent Calendar 2022](https://qiita.com/advent-calendar/2022/nkc-ug)」の5日目のエントリーです！

# はじめに

こんにちは。[ノル](https://twitter.com/noll6451)です

今回は「NKC-UG」主催のアドベントカレンダー「[NKC-UG Advent Calendar 2022](https://qiita.com/advent-calendar/2022/nkc-ug)」の5日目にエントリーしました
## きっかけ
Microsoftの資格を一通りとったので、備忘録代わりです。(いま調べたらMS900受験できるようになっているので、近いうちに取りに行く)
この試験もめちゃくちゃ情報少ない
自分の合格したMicrosoftの資格一覧は[こちら](https://www.linkedin.com/in/rei-suzuki-22b443211/)で見れます。
~~NKC-UGの代表だから仕方なくではない~~

#この記事の対象者

- Microsoftの認定試験を受験予定の人
- ERPを勉強したい初心者の方
- 学生向け

## この資格の説明
[公式](https://learn.microsoft.com/ja-jp/certifications/d365-fundamentals-finance-and-operations-apps-erp/)では
>プラットフォームの基本を理解していることを証明する
Dynamics 365 のアプリケーションについて幅広く理解していることを示す
Dynamics 365 を数々のアプリケーションと統合する方法について理解していることを強調し、ビジネスの財務と運営について深く理解していることを示す
より深いレベルの専門分野に進む前に、基本的なソリューションの機能についての理解を深める

となっております。

[前の記事](https://qiita.com/Rei1729/items/d889385246886ec9dfa9)でも取り上げたDynamic 365ですが、
実はMicrosoftのERPでもあるDynamic 365というツールをどういうサービスがあり、どう扱うかを問う試験です。
ちなみに
この試験も、社会人、学生関係なく**無料**のバウチャーがもらえる方法があります。


## 試験予約編
社会人も学生も無料になる方法があります(社会人の方はこちらの方法ですが、学生の方は2通りあります)
まずは、下から有無言わさず予約してください。この時のメールアドレスはしっかりと保管してください(個人のメールアドレスが推奨です。)

https://www.microsoft.com/ja-jp/events/top/training-days/dynamics365?activetab=a1:primaryr4

前から録画してある動画を流すウェビナーなので、ぶっちゃけどんな状況でも受けれます。ただしっかりと出席だけはしてください。(バウチャーがもらえないので)

## 勉強方法
この試験ですが、前の記事と同様、ほとんど情報少ないです。
上記のウェビナーですが、合格したいなら、真剣に聞くことをお勧めします！(ほんとに！ここでしか言わない情報が多すぎる)


https://learn.microsoft.com/ja-jp/certifications/exams/mb-920

まずは**ヒント**というところをしっかりとみてください(重要です)
実際の試験の操作も体験できます。
その次に下にスクロールすると、勉強できるようにラーニングパスがあるので
それに沿って勉強すれば十分です。(もちろん無料です)

公式の問題集

https://learn.microsoft.com/ja-jp/certifications/resources/mb-920-sample-questions?azure-portal=true

もし実際にDynamic365が触れるのであれば、触ったほうがいいです。
そういった環境にない方は、
youtubeで雰囲気をつかんでください

https://www.youtube.com/results?search_query=dynamics+365


財務の問題がよく出るので、その知識あるとよいです。
(簿記関係とか仕訳が出るので)

# 試験を受けるときの注意点

- 日本語がおかしい場合がある(英語に直す、察する)
- 採点されない問題が出てくる
- 出題範囲にない問題が出てくる(たぶん採点されてない？)
- 人によって問題数が違う
- 意外と時間がないので、サクサク進める(後から回答し直せる)
- 分からなくてもとりあえず何かしら選ぶ(1000点中合格スコア700だけど、7割ではないらしい)


Microsoft試験基礎シリーズの3記事めです。
ぜひこれを機にとってみてはいかがですか？？(実は、基礎資格は有効期限はないです)
ちなみ学生ですが、実は単位認定される可能性があります。

https://learn.microsoft.com/ja-jp/certifications/college-credit


皆さんの合格をお祈りしてます。

Microsoft試験基礎シリーズ
1記事め

https://qiita.com/Rei1729/items/89d693c73e0156764beb

2記事め

https://qiita.com/Rei1729/items/d889385246886ec9dfa9
Salesforceでフローを作成しよう～商談に紐づくTodo作成の場合Todo件名が商談名と一致する～

Saelsforceでフローを作成します

今回のフローは
商談に紐づくTodo作成の場合Todo件名が商談名と一致するようにTodo件名を更新する方法です


![フロー01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/31e375db-ff47-b0c5-ea0b-eecd3098797e.png)



開始条件です

![todo作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f57a8a37-240e-286d-05cb-f197ae839f46.png)





レコード取得です

![取得.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/78f9e7ce-29fc-2be7-38f0-2838e06afbcd.png)


レコード更新です
![更新.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/1cd2be9a-eead-05a7-d09f-eea2be7278bb.png)
Goでの日付比較チートシート

# 概要

Goで日時を司る型はtime.Timeでナノ秒まで適用される。
このtime.Timeには比較演算子の`==`, `<`, `>`が使えず[After](https://pkg.go.dev/time#Time.After), [Before](https://pkg.go.dev/time#Time.Before), [Equal](https://pkg.go.dev/time#Time.Equal)メソッドを使って比較する必要がある。

# チートシート

|  時間の関係  |  記述  | 返値 |
| ---- | ---- | ---- |
|  a > b  |  a.After(b)  | true |
|  a > b  |  a.Equal(b)  | false |
|  a > b  |  a.Before(b)  | false |
|  a = b  |  a.After(b)  | false |
|  a = b  |  a.Equal(b)  | true |
|  a = b  |  a.Before(b)  | false |
|  a < b  |  a.After(b)  | false |
|  a < b  |  a.Equal(b)  | false |
|  a < b  |  a.Before(b)  | true |

# ポイント
time.TimeのAfter、Beforeはイコールを含まない評価をするようになっています。
そのため **a <= b** が **true** を返す、つまりイコールを含むような評価をしたい場合は以下の2パターンで記述する。
1. `a.Before(b) || a.Equal(b)`
1. `!a.After(b)` 

個人的には2パターン目が短くてif文に含める時にはよく見ると思います。