OmniAICreator/Qiita-1.07M huggingface dataset:
「が」を「か゛」のように、ひらがなの濁点・半濁点を分離したい

# 概要

「が」を「か゛」のように、ひらがなの濁点・半濁点を分離する処理が必要になったことは、ありますか？（私はありました:thumbsup:

今回は、作成した`JavaScriptの関数`を紹介します。

# 作成した関数

まずは、結果から説明します。

下記が完成した`JavaScriptの関数`です。
ひらがなの対応表を作成するのもよかったのですが、コードが肥大化してしまうため、`normalize()`や`encodeURI()`を用いて処理を組みました。

内容としては、ひらがな1文字を引数を渡して、濁点・半濁点の文字だったら分離し文字列を返す処理になっています。

### 関数

```javascript
let dakutenSeparation = (kana) => {
  const normalizeKana = kana.normalize('NFD');
  const encodeStr = encodeURI(normalizeKana);

  if (encodeStr.match(/%E3%82%99$/g)) {
    return normalizeKana[0] + "゛"; 
  } else if (encodeStr.match(/%E3%82%9A$/g)) {
    return normalizeKana[0] + "゜"; 
  } else {
    return kana;
  }
}
```

### 実際の動作

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/998dee26-5e74-4bfb-15a2-e24b95a54709.gif)

# コード解説


### ひらがなの正規化

```javascript
const normalizeKana = kana.normalize('NFD');
```

`normalize()`を使用し、ひらがなの`Unicode正規化形式`を取得しています。
この後の処理へ渡すための準備となります。

### エンコード

```javascript
const encodeStr = encodeURI(normalizeKana);
```

`encodeURI()`を使用しひらがなをエンコードしています。
実際にエンコードすると以下のような文字列に代わります。

```:エンコード結果
'が' →　'%E3%81%8B%E3%82%99'
```

### エンコードされた末尾の文字列の判定

```javascript
encodeStr.match(/%E3%82%99$/g);
encodeStr.match(/%E3%82%9A$/g);
```

IF文の判定処理で、謎の文字列で判定しています。
この文字列は、エンコード結果を確認すると濁点と半濁点なことが分かるので、末尾の文字列で判定を行っています。

```:エンコード結果
'か' →　'%E3%81%8B'
'が' →　'%E3%81%8B%E3%82%99'

'く' →　'%E3%81%8F'
'ぐ' →　'%E3%81%8F%E3%82%99'

'は' →　'%E3%81%AF'
'ぱ' →　'%E3%81%AF%E3%82%9A'

'ひ' →　'%E3%81%B2'
'ぴ' →　'%E3%81%B2%E3%82%9A'
```

### 結果を返す

```javascript
return normalizeKana[0] + "゜"; 
```

`normalizeKana[0]`を取得すると、濁点が取れたひらがなが取得できます。
`normalizeKana[1]`を取得しても、想定した形の濁点・半濁点が入っていないため、判定した内容で直接濁点半濁点の文字を指定して、結合しています。


# まとめ

分離した濁点・半濁点を結合する処理は、PDFの解析などするときはよくありますが、分離したいことは多くはないと思われます。
そのため、少しでも困った人の参考になればと思い紹介しました。

ここまで読んでいただきありがとうございました。

# おまけ

ひらがなだけではなくカタカナも対応してます！
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/2c8719ec-7bb4-396c-5f85-71c49b0b377c.gif)
#0020 if __name__ == '__main__' とは

### はじめに
- エンジニア始めた当初、`if __name__ == '__main__' `とはなんぞと思っていた。
- なんとなく、スクリプト実行に実行されるんだな〜という理解だったので、改めて調べてみた。

### `__name__`とは
- `__name__`とは属性であり、モジュール名にあたる。

```
>>> import numpy as np
>>> np.__name__
'numpy'
>>> numnpy.__name__

>>> import time
>>> time.__name__
'time'
```

- つまり、`if __name__ == '__main__'`の条件分岐は`__name__`属性が`__main__`であるということ。
- それはいつなのか？...


### `if __name__ == '__main__' `はスクリプト実行時の条件

- 結論を言えば、`__name__`属性が`__main__`である条件はファイルがスクリプト実行された場合です。
- モジュール実行時は当てはまりません。
- 例を見てみます。

#### スクリプト実行のトライアル
- `test_module.py`を準備し、スクリプトを実行します。
``` 
[test_module.py]
def func():
    print(f"__name__ is : {__name__}")

if __name__ == '__main__':
    print("Start : if __name__ == '__main__'")
    func()
```

```
❯❯❯ python test_module.py
Start : if __name__ == '__main__'
__name__ is : __main__
```
- `if __name__ == '__main__'`の中で`func()`が実行されました。
- `__name__`は`__main__`です。

#### モジュール実行のトライアル
- 次に、`test_module.py`をモジュールとして実行するスクリプト（`execyte_test.py`）を準備します。
- `execyte_test.py`をスクリプト実行します。

```
[execyte_test.py]
import test_module

print("~~~ In execute_test.py. ~~~")
print(f"__name__ is : {__name__}")
print()
print('~~~ Call test_module.func() ~~~')
test_module.func()
```
```
❯❯❯ python execute_test.py
~~~ In execute_test.py. ~~~
__name__ is : __main__

~~~ Call test_module.func() ~~~
__name__ is : test_module
```

- `test_module.func()`の実行結果から、`__name__`は`test_module`であり、`if __name__ == '__main__' `の条件分岐に入らないことになります。

### まとめ
- `if __name__ == '__main__' `は**このpythonファイルがスクリプト実行された場合**というif文
- `__name__`属性
    - スクリプト実行　-> `__main__`
    - モジュール実行 -> `<モジュール名>`
wslでelixir その53

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題、やってみた。

# 練習問題
Phoenixで、zundoko表示せよ。

# 写真
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c037076b-d13c-b847-8cd3-bca9b09780d2.png)


# サンプルコード
- hello2/lib/hello2_web/templates/page/index.html.heexを修正。

```
<section class="phx-hero">
  <h1><%= gettext "Welcome to %{name}!", name: "Phoenix" %></h1>
  <h3><%= Zundoko.start %></h3>
  <p>Peace of mind from prototype to production</p>
</section>

```

```
defmodule Zundoko do
	def start() do
		Stream.repeatedly(fn ->
			["ズン", "ドコ"]
			|> Enum.random
		end)
		|> run
	end
	def run(input) do
		match = ["ドコ", "ズン", "ズン", "ズン", "ドコ"]
		eol = "キ・ヨ・シ！"
		input
		|> Stream.transform([], fn item, acc ->
				if List.last(acc) == eol do
					{:halt, nil}
				else
					if Enum.count(acc) < Enum.count(match) do
						{[item], acc ++ [item]}
					else
						if acc == match do
							{[eol], acc ++ [eol]}
						else
							{[item], [item]}
						end
					end
				end
			end)
		|> Enum.to_list
		|> Enum.reduce("", fn v, s ->
			s = s <> v <> " "
		end)
	end
end

```

以上。
UISwitchでチェックボックスを作る

# 概要
UISwitchでチェックボックスを作ります。
こちらのAPIはiOS 14以降になるので注意してください。

# スクリーンショット
UISwitchでチェックボックスを作るとご覧のような見た目になります。
タイトルもつけることができます。

![チェックボックス型スイッチ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62305/fe7e75bb-2df0-bc67-f358-a18d5dea4e3d.png)


# コード

```swift
let checkBox = UISwitch() 
checkBox.preferredStyle = .checkbox
checkBox.title = "Check!"
```

`preferredStyle`に = `.checkbox`を、そして表示したいタイトルを`title`に入れます。
このコードをiOSでビルドしてください。無事`"setTitle: on UISwitch is only supported when running Catalyst apps in the Mac Idiom."`のエラーが出て止まります。

# Mac Catalystで動かす
実はこのUISwitchのチェックボックススタイルはMac Catalystでしか動きません。iOSのpreferredStyleに.checkboxを設定してもスタイルがチェックボックスになることはありません。
そしてUISwitchのtitleという部分はチェックボックスのためのプロパティなのでMac Catalyst以外で与えるとエラーになります。

## Mac Catalyst設定
Version 14.3.1で`UIUserInterfaceIdiom.mac`として動かす設定方法はこちらです。
- Supported DestinationsでMac Catalystを追加
- Deployment InfoのMAc Catalyst Interfaceを`Optimize for Mac`に変更

## コード

元々Mac CatalystはUISwitchのstyleが`.checkbox`となっているため、以下のコードでiOSとMac Catalystでビルドエラーしないコードにすることができます。

```swift
if UIDevice.current.userInterfaceIdiom == .mac {
    checkBox.title = "Check!"
}
```

逆に、iOSとMacでインターフェースを合わせて開発したい場合は明示的にスタイルを`.sliding`にすれば、Macでもスライド型のスイッチを使うことができます。

```swift
checkBox.preferredStyle = .sliding
```

![macでスライド型スイッチ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62305/4b9ecd61-5139-05cd-3f97-9d6a2ce50f12.png)
ChatGPT / Vertex AIを活用したオート(Auto)コードアプリ開発について解説する動画シリーズを公開しました

![AutoCodeAppDevelopmentYouTubeJA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780317/fe0bd828-7004-9c7d-eb23-b8d65ac4045d.png)

gm! エルソウルラボのkishi.solです。

ChatGPT / Vertex AI を活用したオート(Auto)コードアプリ開発について解説する動画シリーズを公開しました。

本解説動画シリーズは全 7 本から構成されており、1 本目は全般的な説明、2 本目以降は各 AI 開発モードについて利用する方法を解説しています。

既に下記 3 本の動画が公開されており、今後も順次公開予定となっております。

- 【YouTube】Skeet Framework で ChatGPT / VertexAI を使った Auto コーディング - $ skeet ai ① 基本的な使い方 1/7: https://www.youtube.com/watch?v=_aAN1nZ8dwg
- 【YouTube】Skeet Framework で ChatGPT / VertexAI を使った Auto コーディング - GraphQL CRUD/スキーマ 自動生成 ② $ prisma モード 2/7: https://www.youtube.com/watch?v=n-ipl8ZFazM
- 【YouTube】Skeet Framework で ChatGPT / VertexAI を使った Auto コーディング - TypeScript/Typedoc 関数自動生成 ③ $ method モード 3/7: https://www.youtube.com/watch?v=_aAN1nZ8dwg

動画でご覧いただけるように、Skeet を活用したオート(Auto)コードでは、AI との対話によってコードを自動生成しながらアプリを開発していくことが可能なため、開発者の生産性を大幅に向上させることができます。

## Google Cloud、Firebase 上でサーバーレスアプリを爆速開発できるオープンソースの Skeet フレームワーク

![SkeetAIAutoCoding.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780317/ed239c41-275b-a7a8-c89d-10061747a72f.jpeg)



Skeet は GCP (Google Cloud) と Firebase 上にフルスタックアプリを構築できるオープンソースの TypeScript 製サーバーレスフレームワークです。

Skeet を使えば、API サーバーから Web・iOS・Android アプリまですべてを TypeScript で爆速開発することができます。GraphQL や Firestore など、開発者体験の評判が良い技術を積極的に採用しています。ChatGPT や Vertex AI などの AI を活用したアプリケーション開発や Solana などのブロックチェーンを活用した Web3 dApp 開発も簡単に行うことができる現代的なアプリケーションフレームワークとなっています。

下記リンクからデモをお試しいただけます。PaLM2・Vertex AI、そして Open AI 社の ChatGPT (GPT-3.5, GPT-4)も同時にお試しいただくことができますので、どちらがどのような特徴を持っているか比較検討していただくことができます。

Skeet デモ: https://skeeter.dev/ja/

また、こちらのデモのアプリは Skeet CLI を使えば 5 分でご自身の PC 環境やクラウド環境で動かすことが可能です。

まずはどのようなことができるかデモでイメージしていただき、その後は Skeet CLI を使ってすぐにアプリ開発をスタートできます。

Skeet CLI (GitHub): https://github.com/elsoul/skeet-cli

Skeet は世界中すべてのアプリケーション開発現場の開発・メンテナンスコストを削減、開発者体験を向上させるためにオープンソースとして開発されています。

詳しくは公式ドキュメントを御覧ください。

Skeet ドキュメント: https://skeet.dev/ja/
wslでelixir その52

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
Phoenixで、エンドポイントが知りたい。

# $ mix phx.routes

```
$ mix phx.routes
warning: the :gettext compiler is no longer required in your mix.exs.

Please find the following line in your mix.exs and remove the :gettext entry:

    compilers: [..., :gettext, ...] ++ Mix.compilers(),


  (gettext 0.23.1) lib/mix/tasks/compile.gettext.ex:5: Mix.Tasks.Compile.Gettext.run/1
  (mix 1.13.4) lib/mix/task.ex:397: anonymous fn/3 in Mix.Task.run_task/3
  (mix 1.13.4) lib/mix/tasks/compile.all.ex:92: Mix.Tasks.Compile.All.run_compiler/2
  (mix 1.13.4) lib/mix/tasks/compile.all.ex:72: Mix.Tasks.Compile.All.compile/4
  (mix 1.13.4) lib/mix/tasks/compile.all.ex:59: Mix.Tasks.Compile.All.with_logger_app/2
  (mix 1.13.4) lib/mix/tasks/compile.all.ex:36: Mix.Tasks.Compile.All.run/1

          page_path  GET  /                                      Hello2Web.PageController :index
live_dashboard_path  GET  /dashboard                             Phoenix.LiveDashboard.PageLive :home
live_dashboard_path  GET  /dashboard/:page                       Phoenix.LiveDashboard.PageLive :page
live_dashboard_path  GET  /dashboard/:node/:page                 Phoenix.LiveDashboard.PageLive :page
                     *    /dev/mailbox                           Plug.Swoosh.MailboxPreview []
          websocket  WS   /live/websocket                        Phoenix.LiveView.Socket
           longpoll  GET  /live/longpoll                         Phoenix.LiveView.Socket
           longpoll  POST  /live/longpoll                         Phoenix.LiveView.Socket


```

以上。
wslでelixir その51

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題、やってみた。

# 練習問題
Phoenixで、九九表示せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/b8f35593-071c-bfc7-cbd3-8343f3db82c2.png)


# サンプルコード

- hello2/lib/hello2_web/templates/page/index.html.heexを修正。

```
<section class="phx-hero">
  <h1><%= gettext "Welcome to %{name}!", name: "Phoenix" %></h1>
	<table>
		<%= for i <- 1..9 do %>
			<tr>
				<td><%= Integer.to_string(i * 1) %></td>
				<td><%= Integer.to_string(i * 2) %></td>
				<td><%= Integer.to_string(i * 3) %></td>
				<td><%= Integer.to_string(i * 4) %></td>
				<td><%= Integer.to_string(i * 5) %></td>
				<td><%= Integer.to_string(i * 6) %></td>
				<td><%= Integer.to_string(i * 7) %></td>
				<td><%= Integer.to_string(i * 8) %></td>
				<td><%= Integer.to_string(i * 9) %></td>
			</tr>
		<% end %>
	</table>
  <p>Peace of mind from prototype to production</p>
</section>
```

以上。
AIチャレンジ１（天気予報）

　今回は、PythonとKerasを使ってAIを作成してみたいと思う。

　内容は以下の通り。
１，東京の天気（雨が降っているかどうか）を予測するAI

２，データのソースは以下のところから１年分をダウンロード
https://www.data.jma.go.jp/gmd/risk/obsdl/index.php

３，天気について、７つの説明変数を用いて二値分類モデルとKerasで学習

４，これらのソース・データを以下のフォルダにまとめております。
https://github.com/horiivalue/horiivalue.git

※細かいインポートは省略させていただく。

# データ

```Python
dataset_tenki = pd.read_csv("data4.csv")
dataset_tenki.head()

# 列の抜き出し
dataset = dataset_tenki[['平均気温(℃)', '最高気温(℃)','最低気温(℃)', '平均風速(m/s)','最大風速(m/s)', '平均現地気圧(hPa)', '平均雲量(10分比)', '天気概況(昼：06時～18時)']]

# 列名をリネームする
dataset = dataset.rename(columns={'平均気温(℃)': 'kion1', '最高気温(℃)': 'kion2','最低気温(℃)': 'kion3','平均風速(m/s)': 'wind1','最大風速(m/s)': 'wind2', \
    '平均現地気圧(hPa)': 'kiatsu', '平均雲量(10分比)': 'cloud', '天気概況(昼：06時～18時)': 'tenki1'})

dataset.head()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533364/cce15efe-0b93-f128-6ca9-eaea2ea5252a.png)

# データ加工

```Python
# 文字列に「雨」が入っている文字列を1に置き換え
for i in range(366):
    s = dataset.iloc[i,7].find('雨')
    if s == -1:
        dataset.iloc[i,7] = 0
    else:
        dataset.iloc[i,7] = 1

# 数値にばらつきがあるので
from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler()
dataset_std = sc.fit_transform(dataset)

is_tenki1 = (dataset['tenki1']==0).astype(np.int64)
dataset['is_tenki1'] = is_tenki1

# 目的関数と説明変数の設定
Y = np.array(dataset['is_tenki1'])
X = np.array(dataset[['kion1','kion2','kion3','wind1','wind2','kiatsu','cloud']])
print("Y=", Y.shape, ", X=", X.shape)

# 7:3にデータを学習用とテスト用に分割
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)
X_train, X_valid, Y_train, Y_valid = train_test_split(X_train, Y_train, test_size=0.3, random_state=0)

```

# 学習と学習効果

```Python
# モデルの初期化
model = keras.Sequential()

# 入力層
model.add(Dense(8, activation='relu', input_shape=(7,)))
# 隠れ層
model.add(Dense(8, activation='relu'))
# 出力層
model.add(Dense(1, activation='sigmoid'))

# モデルの構築
model.compile(optimizer = "rmsprop", loss='binary_crossentropy', metrics=['accuracy'])

%%time
# 学習の実施
log = model.fit(X_train, Y_train, epochs=5000, batch_size=24, verbose=True,
                callbacks=[keras.callbacks.EarlyStopping(monitor='val_loss',
                                                         min_delta=0, patience=100,
                                                         verbose=1)],
         validation_data=(X_valid, Y_valid))

# predictで予測を行う
Y_pred = model.predict(X_test)

# 二値分類は予測結果の確率が0.5以下なら0,
# それより大きければ1となる計算で求める
Y_pred_cls = (Y_pred > 0.5).astype("int32")

Y_pred_ = Y_pred_cls.reshape(-1)
from sklearn.metrics import classification_report

print(classification_report(Y_test, Y_pred_))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533364/37fa8075-acfb-3fb8-e94c-cef32b0d1d98.png)

と、そこそこいい成果が出せたと思います。
Open-interpreter、試してみろ。飛ぶぞ！

# Open-interpreterとは
ターミナル上でLLMにプロンプトを差し出すと、命令通りにコードを書いて実行してくれるプログラム。

# 前提条件
* Anacondaがインストールされている
* ターミナルの使い方を知っている

# インストール
```
$ conda create -n interpreter python=3.11
$ conda activate interpreter
$ pip install open-interpreter
$ env:FORCE_CMAKE=1; $env:CMAKE_ARGS='-DLLAMA_CUBLAS=on'
$ pip install llama-cpp-python --force-reinstall --upgrade --no-cache-dir -vv
```

# 起動
```
$ interpreter -y
```
「-y」は、コード実行の承認をスキップするオプション。つけると、勝手にコードを書いて勝手に実行するからちょっとこわい。

# 選択肢
```
[?] Parameter count (smaller is faster, larger is more capable): 7B
[?] Quality (lower is faster, higher is more capable): Low | Size: 3.01 GB, RAM usage: 5.51 GB
[?] Use GPU? (Large models might crash on GPU, but will run more quickly) (Y/n): y
```
基本は、GPUメモリの許容量で決めればいいと思う。Code-Llamaを使う場合のメモリ使用量の目安を表に示す。RTX 3070で7B中くらいは乗るかなといったところ（13B低は落ちた）。

| パラメータ数 | 回答の質 | 専用GPUメモリ |
| ---- | ---- | ---- |
| 7B | 低 | 6GB |
| 7B | 中| 7GB |
| 7B | 高 | 10GB |
| 13B | 低 | 8GB |
| 13B | 中| 11GB |
| 13B | 高 | 16GB |
| 34B | 低 | 16GB |
| 34B | 中 | 23GB |
| 34B | 高 | 38GB |

ちなみに34Bのモデルだと20GBのHD空容量が必要。

# 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23570/20d5d811-d364-c8ea-2dae-9ccf87eb6fe5.png)
PyTorch実行でTorch not compiled with CUDA enabledエラーを解消する

# はじめに
M1Macを使用していて、PyTorchを実行すると、diffusersモジュールの実行時に表題のエラーが発生しました。
解消方法をまとめました

# エラー発生の経緯
環境
+ M1Macbook
+ Python3.9
+ venv

上記の環境で仮想環境内でPyTorchとdiffusersモジュールをインストールしてPythonアプリを実行しました。

するとdiffusersの関数実行時にエラーが発生
Torch not compiled with CUDA enabled

ちなみに実行したコードはこちら
```python
import torch
from diffusers import DiffusionPipeline, DPMSolverMultistepScheduler
from diffusers.utils import export_to_video

pipe = DiffusionPipeline.from_pretrained(
    "runwayml/stable-diffusion-v1-5",
    torch_dtype=torch.float16,
    )

pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)

pipe.enable_model_cpu_offload()

# ビデオを作成
prompt = "A bustling city street in Tokyo during cherry blossom season"
video_frames = pipe(prompt, num_inference_steps=25).frames
video_path = export_to_video(video_frames)
```

# 解消法
エラーを調べているとM1Mac環境だとAnacondaの環境を使って上手くいったという記事を見て
Anacondaをインストール
https://www.anaconda.com/download-success

仮想環境を作成して有効化します
```
conda create --name sampleapp python=3.9
conda activate sampleapp
```

pip install diffusersを実行すると
Rustが必要というメッセージが出たのでRustをインストールします
```
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```

Rustがインストールされていることを確認します
```
rustc -V
```

M1Mac用のRustのtargetをインストールします
```
rustup target add x86_64-apple-darwin
```

diffusersをインストールします
```
pip install diffusers
```
インストールが成功しました

そしてPythonアプリの実行も成功しました
めでたしめでたし


ちなみにdffusersについて

https://github.com/huggingface/diffusers



diffusersはPython3.11は対応していないようなので3.8や3.9を使うのがいいです


PyTorchは環境要因があるのでGoogle Colaboratoryを使うと楽です
ランタイムをCPUからGPUに変えるのをお忘れなく
MFAを有効化したAWSのIAMユーザーで、スイッチロール先のCodeCommitにGRCを用いてCloneする

JumpアカウントにIAMユーザーでログインして、スイッチロール先のCodeCommitにアクセスする方法です。
JumpアカウントのIAMユーザーにはMFAを有効化しています。
このような状況だとGRC(git-remote-codecommit)を用いると簡単にCodeCommitからcloneできます。


# 前提
1. Gitはインストール済み
1. Pythonはインストール済み
1. AWS CLIはインストール済み
1. MFAを有効化したIAMユーザーとスイッチロール先のIAMロールは作成済み
1. CodeCommitリポジトリは作成済み(ここでは「sample」リポジトリにしています)

# GRCのインストール
pipを利用してGRCをインストールします。
```
pip install git-remote-codecommit
```

詳細は以下のURLを参照してください。
https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-git-remote-codecommit.html

# AWS CLIのプロファイル設定
プロファイル(configファイルとcredentialsファイル)を直接修正します。

```text:config
[default]
region = ap-northeast-1
output = json

[profile codecommit-profile]
role_arn = arn:aws:iam::YYYYYYYYYYYY:role/codecommit-role
source_profile = default
mfa_serial = arn:aws:iam::XXXXXXXXXXXX:mfa/ninja-yuki
```
:::note
- role_arnは、スイッチロール先のIAMロールのARNです。
- mfa_serialは、マネジメントコンソールでIAMユーザーの「セキュリティ認証情報」から確認できます。
:::

```text:credentials
[default]
aws_access_key_id = AAAAAAAAAAAAAAAAAAAA
aws_secret_access_key = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
```
:::note
- aws_access_key_idとaws_secret_access_keyは、自身の値に変更してください。
:::

プロファイルの場所は以下のURLを参考にしてみてください。
https://docs.aws.amazon.com/sdkref/latest/guide/file-location.html

# GRCコマンドの確認
マネジメントコンソールでCodeCommitを開き、「URLのクローン」から「HTTPSのクローン(GRC)」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519657/6000dd4c-e274-77c6-7866-e5bed6027c4d.png)

すると、「codecommit::ap-northeast-1://sample」が表示されます。
スイッチロールをしなければあとは「git clone codecommit::ap-northeast-1://sample」で、cloneできます。

# GRCでcloneの実行
スイッチロールを伴う場合、profileを指定する必要があります。
```
git clone codecommit::ap-northeast-1://codecommit-profile@sample
```

# VSCodeのGUIでGitの操作をする
VSCodeのターミナルでgitコマンドを実行すると、MFAが求められます。
ターミナルでMFAを通すと、VSCodeのGUIを利用できます。
GUIで操作したら長時間固まって動かないことがあります。
そんなときはターミナル「git fetch」などを実行して、再認証すると動きます。
ただ、VSCodeを一度終了しないといけないです。

もしかしたら他にいい方法があるかもしれません。
SwiftUIのレイアウトでPDFを作成する


結論から、iOS16で追加された[ImageRenderer](https://developer.apple.com/documentation/swiftui/imagerenderer)はViewをPDFに出力できるのだが[Table](https://developer.apple.com/documentation/SwiftUI/Table)や[List](https://developer.apple.com/documentation/SwiftUI/List)を扱うことができない。
仕方なくViewを[UIHostingController](https://developer.apple.com/documentation/swiftui/uihostingcontroller)でUIViewControllerに変換してから[UIGraphicsPDFRenderer](https://developer.apple.com/documentation/uikit/uigraphicspdfrenderer)を用いてPDFにすることで一旦解決とした。
他にも問題があり、TableはMacやiPadでしか使えないので、Gridを用いて対応とした。
これでようやくSwiftUIのレイアウトでPDFを作成できる。
あと、A4サイズ(210x297)で出力する際は、595.2x841.8で指定すれば良い。


## 結果画像
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35973/480b1f2a-9626-bf41-0e49-8c059892851b.png" width=300>

## サンプルコード

https://gist.github.com/otmb/0fd50f1d8d9d61d8c0c7ed2c19f7a68a
wslでelixir その50

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題、やってみた。

# 練習問題
Phoenixで、table表示せよ。

# 参考にしたページ

https://qiita.com/piacerex/items/b7787580fce5f148242f


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2ac9098a-fdad-b4a3-b044-8ea641079e12.png)

# サンプルコード

- hello2/lib/hello2_web/templates/page/index.html.heexを修正。

```
<section class="phx-hero">
  <h1><%= gettext "Welcome to %{name}!", name: "Phoenix" %></h1>
	<% datas = [%{"name" => "enぺだーし", "age" => 54, "team" => "有限会社デライトシステムズ", "position" => "代表取締役、性能探求者" }, %{"name" => "ざっきー", "age" => 50, "team" => "公立大学法人 北九州市立大学", "position" => "准教授、カーネルハッカー" },   %{"name" => "たくと", "age" => 40, "team" => "カラビナテクノロジー株式会社", "position" => "リードエンジニア" }, %{"name" => "piacere", "age" => 48, "team" => "株式会社DigiDockConsulting", "position" => "常務取締役CTO、技術顧問、重力プログラマ" }]%>
	<table>
		<%= for n <- datas do %>
			<tr>
				<td><%= n["name"] %></td>
				<td><%= n["age"] %></td>
				<td><%= n["team"] %></td>
				<td><%= n["position"] %></td>
			</tr>
		<% end %>
	</table>
  <p>Peace of mind from prototype to production</p>
</section>
```

以上。
FNNプライムオンラインで使っているccドメインプラグインを調査する

# ccドメイン調査

https://www.fnn.jp/

のHTMLを興味本位で見てみたところ、
//api.popin.cc/searchbox/fnn.js
というのが気になった。わざわざ

```
parentNode.insertBefore()
```
動的に埋め込んでいる。なぜだ？

## ccドメインとは？
wikiによると

https://ja.wikipedia.org/wiki/.cc

.ccは、国別コードトップレベルドメイン (ccTLD) の1つで、オーストラリア領ココス諸島に割り当てられている。 

らしい。
ふむふむ。

## js解析？

当然難読化されてる。js見てると
demo.popin.cc
と
popin.baidu.com
なんかが気になった。何してるんだ？

fixUrl.replace(/imageaws.popin.cc/, "images-cn.popin.cc")

どうもbaidu検索してきたユーザのaws画像をimages-cn？ってのに切り替えてる？よくわからん。金盾対策か？

## 結論
よくわからん。。
アプリ内課金に使うStoreKit configuration fileのLocal/Syncedのあれこれ

# はじめに
StoreKit configuration fileとはアプリ内課金をローカルでテストするときに必要なファイルである。
StoreKit configuration fileにはLocalとSyncedの2種類がある。この記事はその違いなどを記録する。

# 環境
macOS Ventura 13.4
Xcode 14.3.1

# 2つのStoreKit configuration file
StoreKit configuration fileには2種類ある。

## Local
App Store Connectに登録されている情報と関係なく情報を編集できる。

## Synced
App Store Connectに登録してある情報で出来ている。App Store Connectの方を変更したら手動でStoreKit configuration fileを更新させることが出来る。

:::note warn
SyncedのStoreKit configuration fileを編集することはできない。
:::

Xcode 14 及びそれ以降で利用可能。


# StoreKit configuration file作成時にできること
LocalかSyncedか選べる。Syncedにする場合はアプリ名なども指定する。

# LocalとSynced間の変更
SyncedからLocalに変更できる。
`Editor > Convert to Local StoreKit Configuration`

LocalからSyncedに変更できない。Syncedを作りたいなら新しく作成する。

# App Store Connectの最新状態を落としてくる
Syncedの場合はXcodeに「syncedボタン」があるので、それを押すとApp Store Connectの最新情報が落ちてくる。
手元のStoreKit Configuration fileの情報をApp Store Connectへ送るのではない。送る機能はなさそうである。そもそも、Syncedの場合は編集が出来ないので、App Store Connectへ送る機能はなくてもよい。

# Local StoreKit Configuration fileの情報はApp Store Connectへ送れるか
送れない

# SyncedからLocalへコピー
個別の情報はSyncedからLocalへコピペできる。通常のcontrol-click or 右クリック。

# StoreKit configuration fileとターゲットをつなげるチェックボックス
Xcodeの右のエリアに表示される、ファイルとターゲットをつなげる設定は、OFFでよい

# なぜこれを書いたのか
App Store Connect → 手元、が出来るという情報はあるが、
手元 → App Store Connectが出来るかどうかを書いている記事が見つからなかったので。
Selenium(Chrome) を使ったスクレイピングロジックをコンテナ環境で運用できないたったひとつの理由

実装時にはWindowsに普通にPythonとVSCodeをインストールして開発を行っていたある日のこと。
私: ヨシ！完成。お客さん先のリポジトリにプルリクかけるぞー！
客: 動作確認ヨシ！　ありがとうございます！！
客: 運用環境でしばらく動かしてるとエラーが起きます:innocent:


そこらへんに転がっているChrome起動時のオプション引数は試したけどだめ！！
何をやってもだめ！！
そんな貴方におくる最果ての記事です。



## 環境による差異
- 私と相手方は動作確認時にWindowsで確認していた。
- 運用は Docker + Ubuntu の環境で動かしていた。
    - RAMもSWAPも十分にあり実行中も空きがある
    - 当初はDockerで動かしていなかったけれど運用コストがかさむため、いつのまにかDockerで動かしていた。


## 現象
- 最初のうちは正常に動作している。
- だんだん動作が重くなっていく。
- 実行時間がだいぶ経過するとランダムにエラーが発生する。
- エラーは様々
    - ウェブページの読み込みが終わらずにエラー
    - 取得対象要素がレンダリングされる前に取得しようとした
    - クラッシュする
    - Chromeと通信できなくてurllibからエラーが飛んでくる

## 原因
- Chromeが共有メモリを使用している。
- コンテナ環境における共有メモリのデフォルトサイズが64MBであり不足していた。
- 共有メモリを使用しないようにオプションを指定しても結局は使用されている...

## 解決方法 (最終手段)
そこらじゅうに書かれているChromeのオプション(引数)を追加するなどを試してもダメな場合の最終手段です。

### OSの共有メモリ増やす
PCに自前でDocker入れている場合はこの手段が取れますが、
クラウド環境(Azure)のコンテナ環境は共有メモリサイズの変更は行えません...

### Seleniumのタイムアウト時間を延ばす
重くなったChromeはfind_elementsに30秒以上かかることもあります。
(だから、タイムアウトがデフォルト値だと要素が見つからないと言われたりするんですね)

### Requests + BeautifulSoup にリプレースする
スクレイピングロジックに限ってですが、意外とSeleniumからRequests + BeautifulSoupへのリプレースがしやすいです。
私の実績値ですが、なれた人が行えば500行ぐらいのロジックであれば半日ぐらいでリプレースできてしまいます。

## 結論
お客さん先の開発支援業務だったりすると、なかなか運用環境に関する情報が得られなかったりするので、なるようになるしかないというのが正直なところです。

実際、VPSなどの単純なVMで動かしてたところ、運用コストを抑えるためにDockerに移行したいとなる可能性もあります。

スクレイピングってバッチ処理みたいなものなので、動かしていない間もVMだとお金がもったいないのでコンテナで運用したい気持ちは分かるんですよね^^;

これを見た皆さんがスクレイピングプロジェクトのPMになってSeleniumを使おうとしたときに、この投稿を思い出してくれれば幸いです。
PL/SQL②　PL/SQLブロックに変数

### 処理の流れ

PL/SQLブロックを作成しその中で、変数を定義する

### ソースコード(実行結果含む)

```
set echo on
@hensu
DECLARE
    var NUMBER;
BEGIN
    var := 100;
    DBMS_OUTPUT.PUT_LINE(var);
END;
/
100
```

### 解説

**set echo on**
ファイルの中身をSQL*Plusに表示する

**DECLARE～BEGIN**
宣言部。プログラムで使用するオブジェクトを定義

**BEGIN～END**
実行部。プログラムの具体的な実行内容を記述

### 変数の定義

①宣言部で変数名とデータ型を定義
②実行部で代入演算子を利用して値を格納、計算式などで変数として使用
PL/SQL①　文字列の出力

### 処理の流れ

「Hello,PL/SQL」を出力する。

### ソースコード

```
set serveroutput on
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello,PL/SQL');
END;
/
```

### 解説

**SERVEROUTPUT**    
SQL*Plusの環境変数。文字列を出力させるためにはこれをONにする必要がある

**DBMS_OUTPUT.PUT_LINE**
SQL*Plusの画面に文字列を表示させるためによく使用される

**/**
SQL*PlusでPL/SQLを実行する時は、ソースコードの最後を改行し「/」を記述する
実際の開発で重要な型を整理

#### Enum型
:::note info
名前のついた定数セットを定義できる。JavaScriptにはない機能で、TypeScriptが拡張した機能の1つ。列挙した値以外を代入できない型を定義できる。
:::

下記の例では、上下左右の方向など、ある値のみを受け付けたいときに利用できる。
```typescript
const Direction = {
    'Up' : 0,
    'Down' : 1,
    'Left' : 2,
    'Right' : 3
}
```

#### ジェネリック型
:::note info
クラスや関数において、その中で使う型を抽象化して、外部から具体的な型を指定できる機能。外側から指定される型が異なっても動作するような汎用的なクラスや関数を実装するときに便利。
:::



#### Union型とIntersection型
:::note info
少し複雑な型を表現したいときに、指定した複数の型の和集合を意味するUnion型と、積集合を意味するIntersection型
:::
```typescript
// 変数や引数の宣言時にUnion型を指定して、numberもしくはstringを受け付けることができる
function printId(id: number | string) {
    console.log(id)
}

// numberでも正常に動作
printId(11)

// stringでも正常に動作
printId('22')
```

```typescript
// IdentityとContactの両方の型のプロパティがマージされた型を扱う
type Employee = Identity & Contact

// 正常に動作
const employee: Employee = {
    id: '111',
    name: 'Takuya',
    email: 'test@example.com'
    phone: '0123456789'
}

// エラー：　片方の情報のみの変数定義はできない.idが必要。
const employeeContact: Employee = {
    name: 'Takuya',
    email: 'test@example.com'
    phone: '0123456789'
}
```


#### リテラル型
:::note info
｜でデータを区切るリテラル型を用いると、決まった文字列や数値しか入らない型という制御が可能
:::

```typescript
let postStatus: 'draft' | 'published' | 'deleted'

postStatus = 'draft' // OK
postStatus = 'drafts' // 型宣言にない文字列が割り当てられるため、コンパイル時エラー
```

#### never型
:::note info
決して発生しない値の種類を表す。常に例外を発生させる関数などで決して値が返されることのない戻り値の型をneverとして定義できる。
:::
TypeScriptによるGas(入門編)

## はじめに
標題通り、TypeScriptでGasをコーディングします。今回は、claspを利用し、デプロイする所までを実施していきます！！

## Hands-on
```shell:最終成果物のディレクトリ構成
~/develop/XXX/clasp_sample$ tree -I node_modules 
.
├── appsscript.json
├── .clasp.json
├── package.json
├── src
│   └── main.ts
└── yarn.lock
```


### 準備
まずはclaspのコマンドをローカルにインストールします。
```shell:claspのインストール
　yarn global add clasp
```

```
~/develop/HITOTSU/clasp_sample$ clasp login
Warning: You seem to already be logged in *globally*. You have a ~/.clasprc.json
Logging in globally…
🔑 Authorize clasp by visiting this url:
https://accounts.google.com/o/oauth2/v2/auth?access_type=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Authorization successful.

Default credentials saved to: /Users/XXXX/.clasprc.json.
```
→Googleのログイン画面が表示されるので、ログインします。

### プロジェクト作成
```shell:プロジェクト用のディレクトリ作成
mkdir clasp_sample
```

```shell:claspでプロジェクト作成する
 clasp create --title clasp_typescript_project

? Create which script? (Use arrow keys)
❯ standalone 
  docs 
  sheets 
  slides 
  forms 
  webapp 
  api 
```
→選択制です。用途に応じて選択ください。今回は、`standalone`で実施します。

```shell:yarn init
yarn init -y
```


```shell:必要なライブラリインストール
yarn add typescript @types/node @types/google-apps-script
```

```shell:srcディレクトリを作成する
mkdir src
```

```ts:src/main.ts
function test(){
    const word = "Hello World"
    Logger.log(word);
}
```
→`src`配下に`main.ts`を作成します。


### デプロイ
```
~/develop/HITOTSU/clasp_sample$ clasp push
└─ /Users/kouji/develop/XXXX/clasp_sample/appsscript.json
└─ /Users/kouji/develop/XXXXXX/clasp_sample/src/main.ts
Pushed 2 files.
```
→このようにデプロイされます。

下記にデプロイされているので、確認すればきっとあるはず。

https://script.google.com/home

![スクリーンショット 2023-09-09 1.19.13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/c51e88d8-5257-8099-68b4-66861c14fcf5.jpeg)

![スクリーンショット 2023-09-09 1.19.59.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/3a5a01e9-abb3-68bc-cb61-8d3b1c116b47.jpeg)
こんな風にデプロイできてればOKです！！
【iOS16で簡単になった】SwiftUI.Textで固定行数分の高さを確保する方法

# はじめに
以下のようなグリッドレイアウトでテキストの仕様が以下のように決められているとき、どのように実装すれば良いでしょうか？

- テキストはどのようなものが来るかわからない（長いかもしれないし短いかもしれない）
- テキストは2行分の高さを確保し、左上寄せで表示する
- 2行でおさまらない長さのときは末尾に`...`を表示する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81715/e425be13-e0ec-79ad-1a9c-e5b640fa0605.png)

# サンプルコード
実装全体はこんな感じです。
この中で、Textビューの実装に着目します。

```swift
struct ContentView: View {
    var body: some View {
        VStack {
            HStack {
                item(text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit")
                item(text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit")
            }
            HStack {
                item(text: "Lorem ipsum")
                item(text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit")
            }
            HStack {
                item(text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt")
                item(text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit")
            }
        }
        .padding(16)
    }

    func item(text: String) -> some View {
        VStack {
            RoundedRectangle(cornerRadius: 4)
                .frame(maxWidth: .infinity)
                .frame(height: 100)
                .foregroundColor(.gray)
                .overlay {
                    Text("画像")
                        .foregroundStyle(Color.white)
                        .font(.system(size: 14))
                }

            Text(text)
                .font(.system(size: 12))
                .lineLimit(2)
                .frame(maxWidth: .infinity, alignment: .topLeading)
        }
    }
}
```

# iOS15の実装
テキストの行数制限を指定するAPIとして`lineLimit(_:)`が用意されています。

https://developer.apple.com/documentation/swiftui/view/linelimit(_:)-513mb

```swift
Text(text)
    .font(.system(size: 12))
    .lineLimit(2)
    .frame(maxWidth: .infinity, alignment: .topLeading)
```

`lineLimit(_:)`を使うことで長いテキストを2行におさめることはできるのですが、テキストが1行分しかない場合は1行分の高さしか確保してくれません。
このため、以下のようにレイアウトが崩れてしまいます。

![Cursor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81715/b4558125-95e1-2a0e-8d2a-572934f04abc.png)

この場合、`minHeight`を指定してあげることで仕様通りのレイアウトを実装することができます。
しかし、フォントサイズやlineSpacing等の値によって2行分のテキストのフレームサイズは変わるため、デザインとぴったり合わせるのに結構苦労します。

```swift
Text(text)
    .font(.system(size: 12))
    .lineLimit(2)
    .frame(maxWidth: .infinity, minHeight: 28.66, alignment: .topLeading)
```

# iOS16の実装
iOS16から`lineLimit(_:reservesSpace:)`が使えるようになりました。

https://developer.apple.com/documentation/swiftui/view/linelimit(_:reservesspace:)

`reservesSpace`を`true`にすることで、指定した行数分の高さを確保してくれます。これは便利ですね。

```swift
Text(text)
    .font(.system(size: 12))
    .lineLimit(2, reservesSpace: true)
    .frame(maxWidth: .infinity, alignment: .topLeading)
```
SQL Serverで過去に実行したSQLを調べたい

# 1. はじめに
* SQL Server で実行したSQLを調査するため必要な権限を付与したい
* 過去実行したSQLを取得したい

# 2. 権限の付与
* 下記コマンドで管理者からユーザーに権限を付与する
```sql
GRANT VIEW SERVER STATE TO <ユーザー名> WITH GRANT OPTION;
```

# 3. 過去に実行したSQL取得
* 下記以外にも色々な情報を取得できるので、詳細は参考文献を確認してください
```sql
SELECT st.text FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st;
```

# 4. 参考文献

https://qiita.com/fuk101/items/00eb7963ed44988b5cf1
Windowsのキーボードが突然英語キーボードになってしまう

日本語版のWindowsではあまり記載されていないので気づかないのだが、だいたいWindowsキー＋SPACEキーを押してしまっていると思われる。これが実は言語を切り替えるショートカットキーとなっており、英語モードになってしまうと、”を入力しようとすると＠になったりという事象で気がつく。覚えておくと、右下のIME切り替えをしなくても、ショートカットキーを再度押すだけで済みます。
Unity × PLATEAU


# Unity で都市を再現

PLATEAU データが無料（商用可）ということなので使ってみた。
この記事はその備忘録

# Unity で PLATEAU を使えるようにする

[公式ページ](https://project-plateau.github.io/PLATEAU-SDK-for-Unity/manual/Installation.html)の通りにやればOK。
特に難しいことはない。

# ファイルを読み込んで、可視化。

[公式ページ](https://project-plateau.github.io/PLATEAU-SDK-for-Unity/manual/ImportCityModels.html)の通りにすればOK。
特に難しいことはない。
めっちゃ時間かかる。なぜ。。。

# 読み込み中。。。
【Ruby】%記法について


## 文字列

### `%`, `%Q`

`%`および`%Q`は式展開できる文字列を表現します。  
ダブルクォーテーションで文字列を囲んだ`"文字列"`と同等になります。  

```ruby
%(a b c)
# => "a b c"

a, b, c = 1, 2, 3
%(#{a} #{b} #{c})
# => "1 2 3"
%Q(#{a} #{b} #{c})
# => "1 2 3" 
```

### `%q`

`%q`は`%`や`%Q`と同様に文字列を表現しますが、式展開ができない点で異なります。  
シンブルクォーテーションで文字列を囲んだ`'文字列'`と同等になります。  

```ruby
%q(a b c)
# => 'a b c'

a, b, c = 1, 2, 3
%q(#{a} #{b} #{c})
# => "\#{a} \#{b} \#{c}"
```

## 配列

### `%W`

`%W`はスペースで区切った文字列を含む配列を表します。  

```ruby
a, b, c = 1, 2, 3
%W(#{a} #{b} #{c})
# => ["1", "2", "3"]
```

### `%w`

`%w`は`%W`と同様に配列を表しますが、式展開ができない点で異なります。  

```ruby
a, b, c = 1, 2, 3
%w(a b c)
# => ['a', 'b', 'c']
```

### `%I`

`%I`はシンボルの配列を表現します。  

```ruby
a, b, c = 1, 2, 3
%I(#{a} #{b} #{c})
#=> [:"1", :"2", :"3"]
```

### `%i`

`%i`は`%I`と同様にシンボルの配列を表しますが、式展開ができない点で異なります。

```ruby
a, b, c = 1, 2, 3
%i(a b c)
# => [:a, :b, :c]
```

## シンボル

### `%s`

`%s`はシンボルを表します。

```ruby
%s(a b c)
# => :"a b c"
```

## コマンド

### `%x`

`%x`はコマンドを実行できます。
バッククォーテーションで囲んだ`` `some command` ``と同等です。

```ruby
%x(date)
# => "Thu Oct 20 18:25:04 JST 2022\n"
```

## 正規表現

### `%r`

`%r`は正規表現を表します。

```ruby
%r(^http://)
# => /^http:\/\//
```
Nuttx intel mac buildメモ

# はじめに
BSD Linux系のStandardを採用しているRTOSを探しているところ、OSSプロジェクトがありApache Nuttxに辿り着きました。
下記が公式ドキュメントとなります。
https://nuttx.apache.org/docs/latest/index.html

VxWorksのRTOSのようなものでLinuxと似ているカーネル、システムコールの構成を持ちます。
（実際にPOSIXに準拠しているのは確認できてないので確認必要ですが。。）
組み込み系の実装も触りたかったので早速Bule Pillを購入、、届く間にマイコンに書き込む準備をします。
ほとんど公式ドキュメント通りですがmacの開発、ビルド環境について説明が足りない？ような印象があったのでほぼ自分用で作成してます。画面貼り付けはなく、コマンド一覧になります。


# ビルド前の準備
1. macで必要な依存性を解決します。下記のbrewからインストール。
1. brew install libusb
1. brew install ncurses
1. brew install lsusb
1. brew install minicom
1. brew install automake
1. brew install bison
1. brew install flex
1. brew install gperf
1. brew install libtool
1. brew install pkg-config
1. nuttxのビルドに必要なライブラリインストール（https://repo.or.cz/libjaylink.git)
1. git clone https://gitlab.zapb.de/libjaylink/libjaylink.git
1. cd libjaylink
1.  ./autogen.sh
1.  ./configure
1.  make
1.  make install
1.  あとは、、ARM系のコンパイラーをインストール
1.  https://developer.arm.com/downloads/-/gnu-rm ここからバイナリファイルをダウンロードし、パスを通しました。
    1.  brewでもできますが、nuttxのビルド時にmath.hのエラーが発生し、どうしても解決ができないのでバイナリからインストール、解決してます。
1.  flashing　toolのインストールを行います。openocdを使います。
1.  git clone http://repo.or.cz/r/openocd.git
1. cd openocd
1. ./bootstrap
1. ./configure --enable-internal-jimtcl --enable-maintaner-mode --disable-werror --disable-shared --enable-stlink --enable-jlink --enable-rlink --enable-vsllink --enable-ti-icdi --enable-remote-bitbang
1. make
1. sudo make insatall 
1. openocd --version
1. nuttx　toolをインストールします。
1. git clone https://bitbucket.org/nuttx/tools.git
1. cd tools/kconfig-frontends
1. patch < ../kconfig-macos.diff -p 1
1. ./configure --enable-mconf --disable-shared --enable-static --disable-gconf --disable-qconf --disable-nconf
1. make
1. sudo make install
1. nuttxを公式レポジトリからダウンロード。
1. git clone https://github.com/apache/nuttx.git nuttx
1. git clone https://github.com/apache/nuttx-apps apps


# ビルド手順
1. 　cd nuttx
1. 　./tools/configure.sh -l stm32f4discovery:nsh (ターゲットのボードを選択します。)
1. 　cd..
1. 　make


# ビルド後
1. ls -l nuttx.bin 
1. ビルドが無事終わったらこのファイルが作成されていることを確認できます。


# 補足
configure.sh から対象ボードを確認する際には
```
./configure.sh -L 
```
から確認できます。公式ドキュメントにもサポートしているボードの情報があるので確認してからでも問題ないかと。。

上記の手順は必要最低限のタスクを確認してました。そのため設定編集などはほぼ実施してません。
アプリ実装時に使う機能をEnableにしたりなど必要になります。

# 最後に
まだマイコンは届いてなく待ち状態になりました。
組込み系の実装は初めてなので実装の仕方についてtaskモデルかthreadモデルか判断ができません。。
今回の実装から求めれいるものとしてhard-real time環境で、スケジューリング機能、interrupt、優先順位など確認したいと思うのでtaskモデルがいいかなーぐらいです。
今回は以上ですが初心者なのでツッコミなど大歓迎です。コミュニティなどあれば参加させていただきたいぐらいです。
これから実装することで進捗があればまた記事を作成しようと思います。
ようつべ体験記9

[前回](https://qiita.com/matsukatsu/items/9293c465074712e7b3a2)

僕のチャンネルには、そこそこ見ていただけている動画とそうでない動画があり、その違いはなんでしょうねと、いうことを考えていました。

結局のところ、こういう事なんだろうなとは思いますが、
> 視聴者が好む内容に注力しましょう。視聴者が見たいものを作っていれば、おすすめにも表示されるようになります。

どんな視聴者がいるか、その人たちが好みそうなものは何かを、掘り下げてみます。

#### 視聴者
まずは、どんな視聴者に見ていただいているのか。
チャンネル全体としてはこんなもんです。
![視聴者.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/cc1f632e-2839-436e-1058-798cec903e58.png)
チャンネル登録してくださった方が *35%* も再生してくれています。
コンテンツを見てチャンネル登録して下さった数名の方、もしくは「収益化できたら飲み代おごるから」という言葉を信じてくれた友人達。
いずれにせよありがたい事です。

> 日本: 35%
男性: 72%
25-34歳: 49%
英語字幕: 18%

動画によっては日本以外からの再生が多い場合もありますが、それは狙ってそうなった訳ではないです。
基本的には `日本人男性、25-34歳` をイメージして作成すれば良いのかなと思います。
ただ、利用されている字幕は英語が一番多かったり、地域として日本が多いとはいえ過半数にも満たない数ではあるので、それ以外の方もそこそこ見てくれているという意識は持っておこうと思います。
特に、女性も見てくれてますよとか、日本在住ではない方も見てくれてますよって事を忘れると、飲み屋で友人とクダをまいている時の僕になってしまいかねないです。

#### 好む内容

旅行に関する動画を公開しているチャンネルなので、旅行先の人気ランキングでも見ればいいんだろと思って調べてみました。

- 1位がハワイのものがあれば、韓国のものもある
- 10位までしか掲載がなく、ランクインしている国で行ったことがあるのが1つ2つしかない

という問題があり困っていました。
なかなか良い情報に行き当たらず、唸りながらググっていると、ちょうど良い資料を見つけました。

[マーケティングに役立つ ツーリズムビジネス必携データブック 数字が語る旅行業 2023](https://www.jata-net.or.jp/wp/wp-content/uploads/administrator/2023_sujryoko.pdf)

探していたものはこれです。
いくつか参考になるデータを見つけましたが、特にこの表が味わい深いです。
![スクリーンショット 2023-09-08 23.33.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/8fcfd0f8-dddf-ee84-b62f-fe4a4f4a1ae8.png)

とにかくヨーロッパが人気です（そして中東はヨーロッパの10分の1にも満たないです）。
これは、自分のチャンネルにおける動画の視聴回数の傾向とも一致しそうです。

もう僕はヨーロッパの動画をひたすら作り続けるしかないのでしょうか...
数字がそれを示唆してるからといって、こう考えるとなんとなく嫌な気持ちになりました。

[次回](https://qiita.com/matsukatsu/items/d80f8274b4ac1d0e4fd7)
Google Apps Script(GAS) で作った Slack Slash Command の3秒レスポンス問題に対抗する

## TL;DR
Google Forms を Pub/Sub っぽくつかおう。

# 3秒レスポンス問題について

お手軽に Slack の Slash Command を作る場合、以下の記事で紹介されているような GAS の doPost を使用する方法は便利です。

https://qiita.com/zama_8722/items/5893d968f120dad90f11

しかし、Slash Command では、レスポンスを 3 秒以内に返却しなければいけない制約が存在し、  
3 秒を超えると `operation_timeout` としてエラーのレスポンスが表示されてしまいます。

:::note
> This confirmation must be received by Slack within 3000 milliseconds of the original request being sent, otherwise an `operation_timeout` error will be displayed to the user.

https://api.slack.com/interactivity/slash-commands#responding_basic_receipt
:::

Google Apps Script は実行に時間がかかりやすく、特に Google Docs や Google Sheets といった Google Apps を操作する場合、簡単に 3 秒を超えてしまいます。

これを回避するためには、以下の記事でも触れられているように時間のかかる処理は非同期的に処理し、Slash Command はリクエストを受け取ってすぐ（3 秒以内）にレスポンスを返すしくみを作る必要があります。

https://qiita.com/seratch/items/2158cb0abed5b8e12809

Google Cloud を使用できる場合は Cloud Functions や Pub/Sub を使うことで非同期的な処理を実現できますが、お手軽ではなくなってしまうため今回は Google Apps の範囲内で回避するための対抗策を紹介します。

## 対抗策

Google Forms を用い、擬似的な Pub/Sub メッセージングのようなものとします。  
具体的な構造としては以下の図の通りです。

![GAS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66988/d7d66604-395b-54b0-33d0-b35b368b5463.png)

これによって、Slash Command を処理するスクリプト（図の左側のスクリプト）は Form を送るだけとなります。
Slash Command で行いたかった本来の時間のかかる処理はフォーム送信時のイベントトリガで実行されるスクリプト（図の右側）で行われることで、非同期的な処理の実行が実現されます。

### 注意点

Slash Command ではあくまで Form を送信するのみなので、そのレスポンスは `request received` のような簡素なものになってしまいます。  
本来送りたかったレスポンスは別個に Slack API や Incomming Webhooks などを用いて、後続の onFormSubmit スクリプト側でケアしてあげる必要があります。
Single Domain Generalization for Object Detection (物体検出のための単一ドメイン汎化)

# Single Domain Generalization for Object Detection
今回は物体検出のためのSingle Domain Generalizationについてサーベイしてみました．Single Domain Generalizationとは単一のドメインのみを学習し，未知のドメインに対しての検出性能を高めるもので，画像分類タスクにおいてはよく行われているものです．しかしながら物体検出タスクについてはまだ研究が進んでおらず，2，3本しか発表されているものがありませんでした．
これから研究の余地がありそうですね！
<iframe src="https://www.slideshare.net/slideshow/embed_code/key/F9AyxxSFkgJsGr?hostedIn=slideshare&page=upload" width="476" height="400" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>

### 参考文献
- [Single-Domain Generalized Object Detection in Urban Scene via Cyclic-Disentangled Self-Distillation](https://openaccess.thecvf.com/content/CVPR2022/html/Wu_Single-Domain_Generalized_Object_Detection_in_Urban_Scene_via_Cyclic-Disentangled_Self-Distillation_CVPR_2022_paper.html)
- [CLIP the Gap: A Single Domain Generalization Approach for Object Detection](https://openaccess.thecvf.com/content/CVPR2023/html/Vidit_CLIP_the_Gap_A_Single_Domain_Generalization_Approach_for_Object_CVPR_2023_paper.html)
- [Learning Transferable Visual Models from Natural Language Supervision](https://arxiv.org/abs/2103.00020)
YubiKeyのリセット/PINの削除

yubikeyマネージャーダウンロード

https://www.yubico.com/support/download/yubikey-manager/

インストール

Applications押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/aae10732-4344-29e2-18ed-21ca1bb81b0e.png)


FIDO2押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/edb0567a-fbee-fb9c-e371-1dd142f124ad.png)

Reset FIDO押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/88313d34-4a30-f350-1043-558505900d0a.png)

Yubikeyを抜き差しする
SAAを取得した自分がAWS JumpStart 2023 に参加した感想

# 自己紹介
新卒1年目のエンジニアです。
[AWS JumpStart 2023 for NewGrads 設計編](https://pages.awscloud.com/aws-jumpstart-new-grads-ty.html)に参加しました。
この記事では、座学のみでSAAを取った自分がイベントに参加して感じたこと書きます。
イベント内容は、スケジュールだけ載せておきます。

# ざっくりとしたイベント内容
イベントは2日間のみっちりスケジュールでした。
day 1ではハンズオンによるインプット。
day 2ではアーキテクチャ検討によるアウトプット。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2844843/014c8904-920a-3fd3-ad10-80dbb0801ba7.png)

# 座学のみでSAAを取得しても、サービスを構築することはできない。
めちゃくちゃ当たり前のことなんですけど、座学（問題集や動画視聴）しかやってことなったので、用意していただいた資料が無ければサービスを立ち上げることはできませんでした。

座学だけではわからなかったことを軽くまとめるとこんな感じですね。
* サービスを立ち上げ方や各種設定方法。	
    * VPC作成時にNATゲートウェイで時間がかかること
    * 各サービスに適したセキュリティグループ設定方法
    * ECSのタスク定義全般
    * などなど
* リソースの削除方法	
    * サービスの状態によっては削除できない
    * リソースが他で使われていて削除できない
    * などなど

一方で、SAAで学んだことが生きたと思う場面もいくつかありました。こんな感じです。

* 主要サービスの概要
* システムの概要や規模感から使うサービスの推測
* 類似したサービスの選定
* 可用性や耐久性、信頼性のある設計方法

（day 2のアーキテクチャ検討で最低限サービスが提供できるアーキテクチャ図を作成できたと思います。）

# 最後に
イベントを通して、AWSに対するモチベーションが爆上がりしたので、資格だけでなくハンズオンや実際に何かを作ってみたいと思います。

あと、AWS社員の方はどなたも素敵な方でした。
【AlmaLinux】 SSHログイン時の "Activate the web console with: ~" を削除する

CentOS系のLinuxディストリビューション「AlmaLinux」では、Webベースの管理コンソールサービス「cockpit.socket」が標準インストールされているため、SSHログイン時に以下のメッセージが出力される場合がある。

```
Activate the web console with: systemctl enable --now cockpit.socket
```

この表示は鬱陶しいので削除する方法を以下に記載する。

## cockpit.socket 削除方法

```shell
sudo systemctl stop cockpit
sudo dnf remove -y cockpit
sudo rpm -e cockpit-storaged
sudo rpm -e cockpit-system
sudo rpm -e cockpit-podman
sudo rpm -e cockpit-packagekit
sudo rpm -e cockpit-bridge
sudo rpm -e cockpit-ws
sudo rm -Rf /run/cockpit
sudo rm -Rf /etc/cockpit
sudo rm -Rf /usr/share/cockpit
```

## 参考

https://qiita.com/CloudRemix/items/8b318c19e001d5a9b40d


以上！
初投稿

前に、以下の質問をされた際に、回答することができなかったので、  
自分なりの言葉でまとめる。  
1. `@Controller`と`@RestController`の違いはなんですか？  
1. DIのメリットはなんですか？  

## 1. `@Controller` と `@RestControler` の違い  
`@Controller`とは、「Thymeleafによって生成されたhtmlを返却する。」  
`@RestController`とは、「JSON、XMLを返却する。」  
```java
@Controller
@ResponseBody
public class hogeController {

}
```  
上記のようにすれば`@RestController`としたときと同じように、JSONを返すことができる。  
## 2. DIのメリット  
ある`Contoroller`のメソッドAの中で、ServiceのメソッドBを呼び出すために、
リクエストが来るたびにインスタンスの生成を行なっていては非常にメモリ効率が悪くなってしまう。
そのため、Springで管理している`DIコンテナ`から`Bean`として登録されているインスタンスを利用することによって、メモリ効率を上げれる。（DIコンテナではSingletonオブジェクトになるため、1つのインスタンスを再利用する。）
```java
@RestController
public class Hoge {
    @GetMapping("/hogehoge")
    public FugaFuga hogeHoge () {
        // リクエストのたびに毎回、newしなければならない...
        Fuga fuga = new Fuga();
        FugaFuga fugaFuga = fuga.getFugaFuga();
        return fugaFuga;
    }
}
```  
```java
@RestController
public class Hoge {
    @Autowired
    private Fuga fuga;

    @GetMapping("/hogehoge")
    public FugaFuga hogeHoge () {
        // DIコンテナにBeanとして登録されているため、1つのインスタンス再利用する
        // そのため、newをしなくてよくなった!
        FugaFuga fugaFuga = fuga.getFugaFuga();
        return fugaFuga;
    }
```  
こんな単純なことではないと思いますが、基礎中の基礎が理解できていなかったので反省...  
業務では当たり前のように使用していたが、いざ言葉にするとなると、自分の知識の浅さにショックだった。  
`@Autowired`も非推奨な使い方を普段からしているので、その点もどこかで投稿する。
GET methodとPOST methodについての今日知ったことまとめ

# GET method、POST methodとは

GET（GETメソッド）とは、HTTP通信でWebブラウザ等のクライアントからWebサーバへと送られる、HTTPリクエストの一種です。 基本的に、Webサーバから情報を取り出す（GET）するために使用されます。 HTTPリクエストは、リクエスト行、ヘッダ、メッセージ ボディの3つの部分で構成されます。

POST（POSTメソッド）とは、HTTP通信でWebブラウザ等のクライアントからWebサーバへと送られる、HTTPリクエストの一種です。 基本的に、Webサーバに情報を送り出す（POST）するために使用されます。

なるほど、わからん

という感じの理解のまま来ておりましたが、
本日一服しておると神（先輩）からお告げが。

データベースの値を操作するのが、POSTで
データベースの値を取ってくるのが、GETやで

完全に理解した。

ということです。

細かいところは違うのかもしれないけど、これがわかれば色々スッキリしましたわ。

# APIのPOSTとGET
APIでも両方のメソッドを使用していたのですが、違いがよく分かってなかったですが、
POSTメソッドは、データを入れるやつなので、
リクエストパラメータが多いのだ

データを追加する時に入力フォームに入力したい内容とかが、パラメータになり、
レスポンスは、完了！とか

GETメソッドは、データをとってくるやつなので、
リクエストパラメータは少ないのだ

リクエストパラメータには、userIDとか、
レスポンスは、ユーザデータまとまったやつがjsonとかで帰ってくるわけだ


# まとめ
ってことで、POST,GET？何それ美味しいの？
から、なるほど完全に理解した。

となったわけです。

本日もご清聴ありがとうございました

おわり
Container Imageやhelm chartをローカルにtarで展開するコマンド

## Container Imageをローカルにtarで展開するコマンド

```sh
CONTAINER_IMAGE=nginx
docker pull $CONTAINER_IMAGE
mkdir -p $CONTAINER_IMAGE
docker save -o $CONTAINER_IMAGE.tar $CONTAINER_IMAGE:latest
tar xzf ./$CONTAINER_IMAGE.tar -C $CONTAINER_IMAGE

for layer in $(jq -r '.[].Layers[]' $CONTAINER_IMAGE/manifest.json); do
  dir_name="$CONTAINER_IMAGE"_layers/$(dirname "$layer")
  mkdir -p "$dir_name"
  tar -xf "$CONTAINER_IMAGE/$layer" -C "$dir_name" &
done
wait
npx prettier -w . */*/json --parser json
```

## Helm chartをローカルにtarで展開するコマンド

```sh
helm pull oci://public.ecr.aws/karpenter/karpenter --version v0-e0dcbb5a7ed5afb9d48f8b5030e089e485e2b617
tar xzf karpenter-v0-e0dcbb5a7ed5afb9d48f8b5030e089e485e2b617.tgz
```
Qiita記事の作成方法　個人的忘備録

# 目次
[1. はじめに](#はじめに)
[2. 記事の作成方法](#記事の作成方法)
[3. MarkDown記法のいろいろ](#MarkDown記法のいろいろ)
[4. 参考サイト](#参考サイト)





# はじめに

本記事はQiitaでの記事の作成方法、マークダウン記法、その他気をつけるべき点についての個人的忘備録である。

個人的な忘備録であるので、私自身が記事を書く上で必要だと思うことのみ記載する。
よって、この記事にたどり着いた全員が「役に立つな～」と思う内容かどうかは分からないが、参考にできる部分は是非参考にしてほしい。


# 記事の作成方法
### 投稿までの流れ
まずは画面右上の投稿するボタンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554634/965db3ee-bc81-802d-b9d6-61f38c04a176.png)

画面をクリックすると
* 記事を新規作成
* 質問を新規作成
* 下書き一覧作成
* 記事をGitHubで管理

が表示されるので、いずれかを選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554634/ccfaee0a-262c-3811-42c6-6d5ab240cc69.png)

選択後は **MarkDown記法** で記事を書いていく。

# MarkDown記法のいろいろ
### 見出し
```html:記載例
# h1
## h2
### h3
```

### 強調文（太字・斜体）
```html:記載例
「__」 or 「**」で文字を囲むと、**太字**になる。
```
「__」 or 「**」で文字を囲むと、**太字** になる。

### 打ち消し線
```html:記載例
「~~」で文字を囲むと、~~打ち消し~~になる。
```
「~~」で文字を囲むと、~~打ち消し~~になる。

### 強調して補足説明
```html:記載例
:::note info
緑色で補足説明。
情報を追加する場合に利用。
:::

:::note warn
黄色で補足説明。
警告を行う場合に利用。
:::

:::note alert
赤色で補足説明。
より強い警告の場合に利用。
:::
```
:::note info
緑色で補足説明。
情報を追加する場合に利用。
:::

:::note warn
黄色で補足説明。
警告を行う場合に利用。
:::

:::note alert
赤色で補足説明。
より強い警告の場合に利用。
:::

### リスト
#### 順序なしリスト
```html:記載例
以下のいずれかの記法を用いる。タブで階層下げられる（白丸）。
* あいうえお
+ かきくけこ
    - さしすせそ
```
* あいうえお
+ かきくけこ
    - さしすせそ

#### 番号付きリスト
```html:記載例
エスケープする場合は\（バックスラッシュ）を利用。
1. あいえうお
2\. かきくけこ 
```
1. あいえうお
2\. かきくけこ 

### 水平線
```html:記載例
以下のいずれかの記法を用いる。
* * *
***
*****
- - - 
------------------
```

### リンク
```html:記載例
タイトルはリンク上にマウスを置くと表示される。
[リンクテキスト](URL) 　　　　　　//タイトルなしリンク
[リンクテキスト](URL "タイトル")  //タイトルありリンク
```
[Qiitaホーム](https://qiita.com/) 　　　　　　
[Qiitaホーム](https://qiita.com/ "Qiitaホーム")  

### コード挿入
```html:記載例
「```」でコード内容を囲む。
「```言語:見出し名」とすることで、「記載例」のように表示可能。
```

### 画像の埋め込み
```html:記載例
![テキスト](画像URL)　　　　　　　　//タイトルなし画像
![テキスト](画像URL "画像タイトル") //タイトルあり画像
```

# 参考サイト
[良い記事を書くためのガイドライン](https://help.qiita.com/ja/articles/qiita-article-guideline)
[Qiita記事作成方法 初心者の忘備録](https://qiita.com/U-MA/items/996ae933ae94c5711883)
[【Qiita】今日からできる！見やすい記事の書き方](https://qiita.com/aiandrox/items/f2f93a68a22bd460d3f4)
[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
3次元分布に対して周辺密度関数を図示するプログラムを書きました

# 結論：以下の図が描けます．
![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570966/d6142c04-58ba-2082-2e1b-86da9b0a821e.gif)
(アニメーションはわかりやすさのために別の処理を行ったものです．)
![scatter3mpdf_sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570966/15b54f63-6f81-9afd-4c65-827b4477f7bb.png)
3次元の分布データに対し，周辺化した3つの2次元分布，3つの1次元分布の密度関数を図示しました．

## 内容
MATLABには`scatterhist`という便利な関数があります．
[scatterhist 周辺ヒストグラムをもつ散布図](https://jp.mathworks.com/help/stats/scatterhist.html)

2次元の分布データを渡すと，散布図を描いてくれる上にそれぞれの変数に対して周辺化したヒストグラムも併記してくれます．オプションをつけると密度推定した密度関数としても描画してくれます．

研究テーマの中で，3次元空間に対してこれができるとうれしいな，と思い立ちましたが，ちょっと調べた感じだと出来合いの関数は無さそうです．

ので，作りました．MATLABのFileExchangeで公開済みです．
[scatter3mpdf](https://jp.mathworks.com/matlabcentral/fileexchange/135016-scatter3mpdf)

名前のmpdfはMarginalized Probaibility Distribution Function(周辺化確率密度関数)の頭文字です．

## やったこと
- 入力を3つの次元それぞれのデータベクトル`x, y, z`として，`scatter3`で散布図を描く．この時各軸の範囲を保存しておく．
- デフォルトの設定で見て奥の方の平面に，1つの次元を周辺化した2次元の度数分布を求める．度数分布を求めるのは`hist3`，色付き平面を描画するのは`pcolor`と`surf`の組み合わせ．
- 1つの変数に周辺化した(1つの変数のみ取り出せばよい！)確率密度関数を`ksdensity`(カーネル密度推定)で求めた．ヒストグラムを書きたかったけれども描画が面倒なので断念．

## オプション
- ecdf(経験的累積度数関数)を描画できるようにしました．オプションで設定可能です．
- 1次元の密度関数を図示する幅を設定できます．少し狭くするとこんな見た目になります．

![scatter3mpdf_sample_cdf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570966/d621b7dd-9ac7-2352-533e-eb0ca8aa475c.png)

## 公開場所
MATLAB FileExchangeで公開中です．(大事なことなので繰り返し)

[scatter3mpdf](https://jp.mathworks.com/matlabcentral/fileexchange/135016-scatter3mpdf)