OmniAICreator/Qiita-1.07M huggingface dataset:
【倒立振子】ビュートバランサー2のファームウェアをUbuntuに移植する


倒立振子の教育用キット「ビュートバランサー2」のファームウェアをLinuxに移植する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/e6f63cad-3493-0e59-3986-b1acf5e0d826.png)


# 公式サイト

https://www.vstone.co.jp/products/beauto_balancer_2/

2014年の状況から、アップデートされていないが、
ビュートバランサー2そのものは購入でき、サンプルプログラムは普通に動く。

## ソースコードの変更がまともに出来ない

ところが、ソースコードを変更しだすと、いろいろな問題に出くわす。
特に、この数年の間で、LPCxpressoからMPUXpressoという新しいIDEに切り替わっているのが大きく、いくつかソースコードの変更をしないといけなかったので紹介する。

https://community.nxp.com/t5/LPCXpresso-IDE/Difference-between-MCUXpresso-LPCXpresso-and-their-free-or/m-p/752787#comment-980665

また、Ubuntu特有の詰まりポイントも。

# 実際行なった作業

## github

https://github.com/vstoneofficial/Balancer2

実を言うと、あまり引用されていない。
ファームウェアをいじることがほとんどない人の方が多いからかも。

## MCUXpressoのインストール(Windows, Ubuntu共通)

最新版のMCUXpresso v11.6.1をインストール。

![Screenshot from 2022-11-09 19-32-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/449e0e51-43d4-ff31-87f9-9734bbf09780.png)

LPCxpressoでビュートバランサー2が出た頃と比べると、相当画面も変わっているので注意が必要。

## 一部の共用体がextern宣言されていない＆多重インクルード発生？(Windows, Ubuntu共通)

いくつかソースがあるが
デフォルトのプロジェクトを使って説明する

githubのリポジトリをそのままクローンし、インポートしてビルドすると、
次のエラーが発生する。
(※長いので一部トリミング)

```
./src/main.o:/home/mcuxpresso/BeuatoBalancer2/Balancer2/MCUxpresso/Balancer2_firm_Default/lib/Balancer2.h:104: 
multiple definition of `memmap'; ./src/control.o:/mcuxpresso/BeuatoBalancer2/Balancer2/MCUxpresso/Balancer2_firm_Default/lib/Balancer2.h:104: first defined here
collect2: error: ld returned 1 exit status
```

そして、エラーの箇所を見ると、

Balancer2.hにて、

![Screenshot from 2022-11-09 19-35-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/8c1f5844-b752-c8fd-310e-de0a6ed10658.png)

memmapのところで、どうも多重インクルードによるエラーが発生しているようだ。
そこで、多重定義でないことを伝えるために、extern宣言を29行目に入れ、extern union ~という形にする。

![Screenshot from 2022-11-09 19-36-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/9e0e28a7-6f22-6a00-81cf-d287ca992817.png)

このようにすることで、グローバルな定義として共用体が定義されるので、多重インクルードの問題を防ぐことが出来る。

（ただ多重インクルードが発生している要因はいまいち不明。
　生成されるmakefileの関係などが影響していると考えられる）

## ヘッダファイル(Ubuntuのみ)

![Screenshot from 2022-11-09 19-49-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/bec18ac5-00b3-bc90-0d49-b891246a7e47.png)

Balancer2.hの6行目

これは修正されているが、元々のプログラムはWindowsでしか考慮されていないので

```
#include "lpc13xx.h"
```

となっていて、これでコンパイルが通らないので注意。

## プログラムライトの注意(Ubuntuのみ)

ちょっとハマった。

ビュートバランサー2のボタンを押しながらUSBを差し、
ボタンを離すと、CRP(Code Read Protection)がOFFになり、
ROM領域にプログラムを書き込むことが出来るようになる。

Windowsの場合、「Removable Device」としてその領域が見えるので、
そこに存在するfirmware.binを削除し、
ビルドによって生成された***.binファイルをドラッグ＆ドロップするだけで実行できる。

Ubuntu(に限らず他Linux、またはMac OS)の場合は、別の方法を利用する必要がある。

こちらを参考

http://park11.wakwak.com/~nkon/homepc/tg-lpc11u35/

ターミナルで次のように入力する

```
dd bs=1024 conv=nocreat,notrunc if=<ビルドで生成されたバイナリファイル> 
   of=/media/<ユーザ名>/CRP\ DISABLD/firmware.bin
```
ここで、ddコマンドはブロックコピーであり、CortexシリーズのCPUは1ブロック辺り0x1000バイト(4096バイト)をROMの1単位としている。

この設定はCortexマイコンのCRPのレジスタ設定によって変更できたはずだが、どうもビュートバランサー2の場合は、1ブロックごとでまとめて書き込みしなければ無効になる設定だと思われるので、Windowsと同じような動作で書き込みすることは出来ない。

ちなみに、このやり方は、確かRaspberry PiやArduinoで、SDカードを使って、ブートローダを書き込むときに、固定長でまとめて書き込むやり方と同じ。
基本のSQL文一覧

## はじめに
エンジニア一年目の者です。

SQL文がなかなか覚えられないため、基本的なものを一覧として作成しました。
今後、GROUP BY句やHAVING句についても追記していく予定です。


## 基本
| SQL文 | 説明 |
|:-:|:-:|
| USE データベース名  |  データベース接続 |
| SELECT カラム名1,カラム名2 FROM テーブル名;  | テーブルから指定のカラムを抜き出す |
| SELECT * FROM テーブル名;  | テーブルからすべてのカラムを選んで表示する  |
|  SELECT * FROM テーブル名 ORDER BY カラム名; | 該当カラム名をキーに昇順  |
| SELECT * FROM テーブル名 ORDER BY カラム名 DESC;  |  該当カラム名をキーに降順 |
| SELECT * FROM テーブル名 ORDER BY カラム名1 DESC , カラム名2;  | カラム名1をキーに降順、カラム1が同じ場合はカラム2の昇順  |
|  SELECT * FROM テーブル名 LIMIT 数; | 指定されたレコード数を上から取得 |

## WHERE句
※記述の順番：EHERE->ORDER->LIMIT
| SQL文 | 説明 |
|:-:|:-:|
| SELECT * FROM テーブル名 WHERE カラム名 比較演算子 数字や文字列 | 指定した条件に合ったレコードのみ取得  |
| WHERE カラム名 BETWEEN A AND B  | A以上B以下の間の数取得  |
| WHERE カラム名 IN (‘値1’, ‘値2’, …)  | ()内集合に当てはまるレコードのみ取得（ORよりスマート）  |
| WHERE カラム名 LIKE ‘文字列%’  | 前方一致  |
| WHERE カラム名 LIKE ‘%文字列’  | 後方一致  |
| WHERE カラム名 LIKE ‘%文字列%’  | 部分一致  |

## 結合
| SQL文 | 説明 |
|:-:|:-:|
| SELECT * FROM テーブル名1 INNER JOIN テーブル名2 ON テーブル名1. 共通カラム名 = テーブル名2. 共通カラム名 ;  | 内部結合。共通カラムがNULLのレコードは結合されない  |
| SELECT * FROM テーブル名1 LEFT OUTER JOIN テーブル名2 ON テーブル名1. 共通カラム名 = テーブル名2. 共通カラム名 ;  | 左外部結合。共通カラムがないレコードは、テーブル２のカラムがNULLとして表示される  |
| SELECT * FROM テーブル名1 LEFT OUTER JOIN テーブル名2 ON テーブル名1. 共通カラム名 = テーブル名2. 共通カラム名 ;  | 右外部結合。共通カラムがないレコードは、テーブル２のカラムがNULLとして表示される  |
ctypesで構造体配列を持つ構造体を扱う

PythonでCライブラリを扱うのにctypesはよく使います。
が、このライブラリで構造体配列を持つ構造体を扱う方法が実はあまりサンプルがなかったので、備忘録を兼ねて記事にします。

# Cライブラリ

```C:sample.h
struct x{
    int x;
    int res_calc;
};

struct x_list{
    struct x xs[100];
};

int calc_x(struct x_list *x_list);
```

```C:sample.c
#include <stdio.h>
#include "sample.h"

int calc_x(struct x_list *x_list){
    int i = 0;
    for(i=0; i<100; i++){
        (x_list)->xs[i].res_calc = (x_list)->xs[i].x + 10;
    }
    return 0;
};
```
struct x_listはstruct x * 100の配列を持つ構造体です。
inc calc_xはx_listのポインタを受け取り、struct x.xに+10をしてその結果をstruct x.res_calcに格納します。

## 一応ビルド

この記事を試してみたい方向けにサンプルソースのビルドも書いておきます。

```shell
gcc -fPIC -shared -o sample.so sample.c
```

# Pythonの呼び出し側

まず素直にctypesのリファレンスにあるような書き方をしてみます。

```Python:do_sample.py
import ctypes

class x(ctypes.Structure):
    _fields_ = [('x', ctypes.c_int),
                  ('res_calc', ctypes.c_int)]

class x_list(ctypes.Structure):
    _fields_ = [('xs', x * 100)]

handle = ctypes.cdll.LoadLibrary('sample.so')
handle.calc_x.argtypes = (ctypes.POINTER(x_list),)
handle.calc_x.restypes = ctypes.c_int

_list = [x(i, 0) for i in range(100)]
_x_list = x_list(*_list)
rt = handle.calc_x(ctypes.byref(_x_list))
for i in range(100):
    print('{}'.format(_x_list.xs[i].res_calc))
```
struct x_list.xsは、struct x[100]なので、x * 100とします。
class xを100個納めたリストを作成し、x_listの生成時にアンパックして与えます。

そうすればx_list.xsにはxが100個与えられるので、うまくいくように思えます。

が、実際には以下のエラーになります。

```shell
Traceback (most recent call last):

  File "/Users/****/do_sample.py", line 15, in <module>
    _x_list = x_list(*_list)

TypeError: incompatible types, x instance instead of x_Array_100 instance
```

型があってない、そこはx_Array_100を入れろというエラーです。

じゃあどうするかというと、x_Array_100を明示的に定義してやるとうまくいきます。

```Python
import ctypes

class x(ctypes.Structure):
    _fields_ = [('x', ctypes.c_int),
                  ('res_calc', ctypes.c_int)]

class x_list(ctypes.Structure):
    x_Array_100 = x * 100
    _fields_ = [('xs', x_Array_100)]

handle = ctypes.cdll.LoadLibrary('sample.so')
handle.calc_x.argtypes = (ctypes.POINTER(x_list),)
handle.calc_x.restypes = ctypes.c_int

_list = [x(i, 0) for i in range(100)]
_x_list = x_list(x_list.x_Array_100(*_list))
rt = handle.calc_x(ctypes.byref(_x_list))
for i in range(100):
    print('{}'.format(_x_list.xs[i].res_calc))
```

結果は省略しますが、これだと動きます。

x_Array_100は、class x_listの中でなくてもいいですが、ここに入れた方が収まりがいい気がするので、私はこうしてます。

pythonの公式ライブラリのリファレンス見ても、構造体の入れ子や配列の作り方は書いてあるのですが、構造体配列を持つ構造体のclass定義の書き方とか、そのclassのインスタンスの生成の書き方は書かれてないんですよね。

ざっとググってみても、構造体配列の定義の仕方を書いてある記事はあっても、それを実際にインスタンス生成したり、関数に引数として与えたりの記事は見当たりませんでした。

実践では全くないケースでもない（というか私はぶち当たった）と思うので、この記事が参考になれば幸いです。
CSSプロパティ animetionのオプションのまとめ

## CSSアニメーションって何
`animation`プロパティと`@keyframes`を組み合わせて`transion`では難しい連続したアニメーションを実装できる。
### keyframesの効果的な使用例
例
~~~css
@keyframes fadeIn {
  0% {
    opacity: 0;
    transform: translateY(50px);
  }
  50% {
    opacity: 1;
    transform: translateY(50px);
  }
  100% {
    opacity: 1;
    transform: translateY(0px);
  }
}
~~~
上記のように連続したアニメーションが可能です。
~~~css
@keyframes fadeIn{
  from{
    opacity: 0;
    transform: translateY(50px);
  }
  to{
    opacity: 1;
    transform: translateY(0px); 
  }
}
~~~
0~100%の場合はfrom~toと指定しても同じ動きになります。ただ、上記でも述べた通り、トリガーが設定されている場合ならば`trantion`のほうが少ない行で書けます。

trantionで指定した場合、
~~~css
a {
  opacity: 0;
  transform: scale(1);
  transition: all 0.5s;
}
a:hover {
  opacity: 1;
  transform: scale(1.25);
}
~~~
### animationの仕様と使用方法
~~~css
animation: fadeIn 3s ease 0.2s infinite reverse;
~~~
左から順に定義名、変化する時間、進行具合、遅らせる時間、ループの有無、逆再生の有無です。
- 定義名・・・keyframesで定義した名前を書きます。
- 変化する時間・・・何秒かけて変化させるか書きます。これと0~100%の値でアニメーション時間を制御します。
- 進行具合・・・easeとかease-inとか書くやつ。特になし。
- 遅らせる時間・・・記述のおとり。複数の子要素を少しずつ遅らせてアニメーションさせるときによく見ます。一括指定の時に書くことは少ない印象。
- ループの有無・・・記述のおとり。初期値は1回。値を指定すれば回数指定でき、無限の場合は`infinite`。
- 逆再生の有無・・・初期値は`normal`。逆の場合は`reverse`。逆にしたければ、最初からそのアニメーションにすればよいし、こちらも指定することはあまりないですね。

単発のアニメーションでかつ、トリガー（`:hover`、`:active`など）がある場合はtransionプロパティで、それ以外は`animation` を使用する判断でよいかと。

[CSSアニメーションで動きを指定しよう](https://coco-factory.jp/ugokuweb/css02/)

[【CSS】animationと@keyframesの指定方法を完全解説](https://zero-plus.io/media/css-animation-keyframes/)

[【transition】と【animation】アニメーション方法の違いについて解説！](https://www.qam-web.com/?p=19169)
【Xcode】低速通信をテストする

# はじめに
通信状況が悪い場合にだけ発生する厄介なバグが稀に発生しますよね
低速通信を自分の環境で再現したいと思った時に、「あれ、どうやってやるんだ？」と思ったので方法を記録しておきます。

# やりかた
[ここ](https://developer.apple.com/download/all/)て「 Additional Tools for Xcode」と検索します。
自分が使用しているXcodeのバージョンを探してインストールします。
![スクリーンショット 2022-11-01 18.51.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/80480929-3292-7f23-9256-65b4e893d303.png)

私はXcode14を使用しているので「Additional Tools for Xcode 14.dmg」でインストールします。
![スクリーンショット 2022-11-01 18.51.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/5cc50a59-3f2b-9b3a-5127-dbb78df4063c.png)

インストールしたものを開くと以下のようになっています。
「Hardware」を開きます
![スクリーンショット 2022-11-01 18.54.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/05a5ac3f-021c-7557-7e2d-a88eb64c1ca2.png)

「Network Link Conditioner.prefPane」をダブルタップして開きます。
![スクリーンショット 2022-11-01 18.55.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/06ad1af5-e7fc-be96-f998-f6c220b7ab67.png)

Macにインストールされます。
![スクリーンショット 2022-11-01 18.56.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/dcfe6f08-0143-6de5-5c18-f25ca4e0d584.png)

好きな「Profile」を選択して「ON」にすれば低速通信の実現完了です！
![スクリーンショット 2022-11-01 19.01.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/846a84c1-cf3b-dad0-c7fe-4a21f3f2dc1a.png)

# おわり
意外と簡単にできました！！
gitやnpmのproxy設定

# 初めに
社内環境で何かと問題となるため、以下のproxy設定について備忘録を残します。
## gitのproxy設定
git bashを開き、以下のconfig設定を行えばよい。以降はプロキシを通した状態でもgitに接続することができる。

```sh:git-set-proxy.sh
$ git config --global http.proxy http://<username>:<userpsw>@<proxy>:<port>
```

## npmのproxy設定
npm -g config setコマンドを使い、npmの設定をグローバルに変更する
- proxy, https-proxyの設定を行う
  - https-proxyの設定はhttp://~で行うことに注意
- それでもエラーになる場合、registryの設定も行う
  - CAや証明書などの設定を行う場合、httpsにする必要がある可能性あり

```sh:npm-set-proxy.sh
$ npm -g config set proxy "http://<server>:<port>/"
$ npm -g config set https-proxy "http://<server>:<port>/"
$ npm -g config set registry "http://registry.npmjs.org/"
```
paiza.ioでelixir その54

# 概要
paiza.ioでelixirやってみた。
String使ってみた。

# サンプルコード

```
String.at("elixir", 1)
|> IO.puts
String.bag_distance("abcd", "abc")
|> IO.puts
String.capitalize("ﬁn")
|> IO.puts
String.chunk(<<?a, ?b, ?c, 0>>, :valid)
|> IO.puts
String.codepoints("\u003c")
|> IO.puts
String.contains?("elixir of life", "of")
|> IO.puts
String.downcase("ABCD")
|> IO.puts
String.duplicate("abc", 2)
|> IO.puts
String.ends_with?("language", "age")
|> IO.puts
String.equivalent?("abc", "abc")
|> IO.puts
String.first("elixir")
|> IO.puts
String.graphemes("\u003e")
|> IO.puts
String.jaro_distance("Dwayne", "Duane")
|> IO.puts
String.last("elixir")
|> IO.puts
String.length("elixir")
|> IO.puts
String.match?("foo", ~r/foo/)
|> IO.puts
string1 = "fox hops over the dog"
string2 = "fox jumps over the lazy cat"
String.myers_difference(string1, string2)
|> IO.inspect
String.next_codepoint("olá")
|> IO.inspect
String.next_grapheme("olá")
|> IO.inspect
String.next_grapheme_size("olá")
|> IO.inspect
String.normalize("fi", :nfkc)
|> IO.puts
String.pad_leading("abc", 5)
|> IO.puts
String.pad_trailing("abc", 5)
|> IO.puts
String.printable?("abc")
|> IO.puts
String.replace("a,b,c", ",", "-")
|> IO.puts
String.replace_leading("hello world", "hello ", "hi ")
|> IO.puts
String.replace_prefix("world", "hello ", "")
|> IO.puts
String.replace_suffix("hello", " world", "")
|> IO.puts
String.replace_trailing("hello world", " world", "")
|> IO.puts
String.reverse("abcd")
|> IO.puts
String.slice("elixir", 1..3)
|> IO.puts
String.slice("elixir", 1, 3)
|> IO.puts
String.split("foo bar")
|> IO.inspect
String.split("a,b,c", ",")
|> IO.inspect
String.split_at("sweetelixir", 5)
|> IO.inspect
String.splitter("1,2 3,4 5,6 7,8,...,99999", [" ", ","]) 
|> Enum.take(4)
|> IO.inspect
String.starts_with?("elixir", "eli")
|> IO.puts
String.to_atom("my_atom")
|> IO.puts
String.to_charlist("æß")
|> IO.puts
_ = :my_atom
String.to_existing_atom("my_atom")
|> IO.puts
String.to_float("2.2017764e+0")
|> IO.puts
String.to_integer("123")
|> IO.puts
String.to_integer("3FF", 16)
|> IO.puts
String.trim("\n abc\n  ")
|> IO.puts
String.trim("a  abc  a", "a")
|> IO.puts
String.trim_leading("\n  abc   ")
|> IO.puts
String.trim_leading("__ abc _", "_")
|> IO.puts
String.trim_trailing("   abc\n  ")
|> IO.puts
String.trim_trailing("_ abc __", "_")
|> IO.puts
String.upcase("abcd")
|> IO.puts
String.valid?("a")
|> IO.puts





```

# 実行結果

```
l
0.75
Fin
abc
<
true
abcd
abcabc
true
true
e
>
0.8222222222222223
r
6
true
[
  eq: "fox ",
  del: "ho",
  ins: "jum",
  eq: "ps over the ",
  del: "dog",
  ins: "lazy cat"
]
{"o", "lá"}
{"o", "lá"}
{1, "lá"}
fi
  abc
abc  
true
a-b-c
hi world
world
hello
hello
dcba
lix
lix
["foo", "bar"]
["a", "b", "c"]
{"sweet", "elixir"}
["1", "2", "3", "4"]
true
my_atom
æß
my_atom
2.2017764
123
1023
abc
  abc  
abc   
 abc _
   abc
_ abc 
ABCD
true


```

# 成果物


https://paiza.io/projects/9T4V-7yjixjrX1gFTG2ovg


以上。
【Flutter】CustomPaintを用いて破線を描く

前に記事ではFlutterの[カスタマイズ描画](https://qiita.com/ling350181/items/9a42411b38d1ea26d538)の使い方を詳しく書きましたが、それ詳細の運用はまだ書いてなく、今回の記事では、CustomPaintのPathを使って破線を描きます。

本記事のサンプルソースは[Github](https://github.com/ling350181/dash_line)にご参考ください。

# 破線
破線を描く考え方というのは、空白部分を飛ばして、実線部分を書くことです。
まずは直線１本からスタートします。
```dart
   @override
   void paint(Canvas canvas, Size size) {
    canvas.translate(size.width / 2, size.height / 2);
    Paint paint = Paint()..style = PaintingStyle.stroke
      ..color=Colors.green..strokeWidth = 2;

    Path path = Path();
    path.moveTo(-100, 0);
    path.lineTo(100, 0);

    canvas.drawPath(path, paint);
  }
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491433/49f3abb0-8632-4372-dfbb-39e0dda19f66.png" width=250>

その直線のpathを使って、破線のPathを作りましょう。
```dart
  final double step;
  final double span;
  double get partLength => step + span;
  Path dashPath(Path source){
    final PathMetrics pms = source.computeMetrics();
    final Path dest = Path();
    for (var pm in pms) {
      // 破線組合せセットの数
      final int count = pm.length ~/ partLength;
      for (int i = 0; i < count; i++) {
        // 実線部分
        dest.addPath(pm.extractPath(partLength * i, partLength * i + step), Offset.zero);
      }
      // 余った部分
      final double tail = pm.length % partLength;
      dest.addPath(pm.extractPath(pm.length-tail, pm.length), Offset.zero);
    }
    return dest;
  }
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491433/b6074d5c-57c3-b252-4d11-8e5b684b80a6.png" width=250>

同じ考え方で四角や円形にも破線で描けます。
```dart
   @override
   void paint(Canvas canvas, Size size) {
    canvas.translate(size.width / 2, size.height / 2);
    Paint paint = Paint()..style = PaintingStyle.stroke
      ..color=Colors.green..strokeWidth = 2;

    Path path = Path();
    path.addRRect(RRect.fromRectAndRadius(
      Rect.fromCircle(center: Offset.zero, radius: 100),
      const Radius.circular(20),
    ));
    path = dashPath(path);

    canvas.drawPath(path, paint);
  }
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491433/b7423e56-e7be-1239-4db0-f68110573ad9.png" width=250>
共通テスト用プログラム表記の例まとめ

[11月9日に発表されたもの](https://www.dnc.ac.jp/albums/abm.php?f=abm00041797.pdf&n=6-1+%E6%A6%82%E8%A6%81%E3%80%8C%E6%83%85%E5%A0%B1%E3%80%8D.pdf)を参考に書いてます。ほぼほぼ自分用。

# コメント
* `#`以降から改行までがコメント
    * なんだかんだ11月9日が初出な気がする。違ってたら申し訳ない。Pythonみ

# 数字と文字列
* 数字は10進数
* 文字列は`"`で囲む
    * 9日以前は`「`と`」`で囲んだものも文字列という扱いだったのでこちらはどうやらなくなったらしい

# 変数と代入

* 使えるものは数字、アルファベット大文字小文字と`_`
* 先頭に数字は使えない
    * 相変わらず宣言する際には名前だけで良いっぽい
    * `;`などもいらない（Pythonみを感じる）
    * 代入演算子も`＝`のまま（それはそう）
```dncl
kosu 
#サンプルの例。おそらく個数だと思うがkosuuではなくkosu

moji = "I'll be back." 
#これもサンプルに載っていたまま。親指を立てながら溶鉱炉に沈んでいく様子は涙なしには見られなかった

a = 100,b = 200
#複数同時に宣言と代入が可能

nyuuryoku = 【外部からの入力】
#C++で言うところのcin的な
```

# 演算子

## 算術演算子
* `+`、`-`、`*`、`/`で四則演算、`**`でべき乗
    * 文字連結は`+`で可能
* 整数の除算では`÷`を使い余りは`%`
    * なんのこっちゃ？と思ったが要するに`÷`で割ると小数点は求められないということらしい

## 比較演算子
* `==`、`!=`、`>`、`<`、`>=`、`<=`
    * これといった特筆事項なし

## 論理演算子
* `and`、`or`、`not`
    * Pythonみを感じる

# 配列
* 配列は名前の先頭が大文字から始まる
* 二次元配列は`配列名[2,4]`で宣言
* 添え字は0始まり
* `配列名[添え字]`で参照可能
    * 二次元配列の参照は`配列名[添え字,添え字]`
```
Hairetu = [1,2,3,4,5,6,7,8,9,10]
#特に説明があるわけではないが[]で配列になる模様
```

# if文
* `|`と`└`が`{`と`}`に相当する
* `└`が`}`、文の終わりを示す

* if文
```
もし 条件 ならば:
|　　処理
└　　処理
```
* elseのあるif文
```
もし 条件 ならば:
|　　処理
そうでなければ:
└　　処理
```
* else-if
```
もし 条件 ならば:
|　　処理
そうでなくもし 条件 ならば:
|　　処理
そうでなければ:
└　　処理
```
素直にifで書かせてほしい
```
もし age >= 18 ならば
└ 表示する("成年です")

もし age >= 18 ならば
| 表示する("成年です")
そうでなければ:
└ 表示する("未成年です")

もし age >= 20 ならば
| 表示する("お酒も飲めるし成人です")
そうでなくもし age >= 18 ならば
| 表示する("成人だけどお酒は20歳になってから")
そうでなければ:
└ 表示する("未成年です")
```

# for文
```
条件 繰り返す：
|　処理
└  処理
```

```
i を 0 から 9 まで 1 ずつ増やしながら繰り返す:
└ goukei = goukei + Date[i]

n < 10 の間繰り返す:
| goukei = goukei + Date[n]
└ n = n + 1
```

# 関数

## 関数定義
特に説明はない。問題を見る感じ、受験生自らが関数定義をする問題は出ないからだと思われる

## 関数呼び出し
* 関数名(引数)

また表示する関数（いわゆるprint関数）については

```
表示する("hensuの中身は",hensu,"です")
```
といった感じでカンマ区切りで連結可能（でも＋で連結できるんだから＋で文字連結すればいいじゃんと思わなくもない）

# 補足

とはいえ

**しかしながら，問題文の記述を簡潔にするなどの理由で，この説明文書の記述内容に従わない形式
で出題することもあります。**

と書いてあるので基本的には問題文をちゃんと読んだ方が良い

以下はおまけというか感想というか

* [2021年時点の資料](https://www.dnc.ac.jp/albums/abm.php?f=abm00040701.pdf&n=%E4%BB%A4%E5%92%8C%EF%BC%93%E5%B9%B4%E5%BA%A6%E8%A9%A6%E9%A8%93%E5%85%B1%E9%80%9A%E3%83%86%E3%82%B9%E3%83%88%E6%89%8B%E9%A0%86%E8%A8%98%E8%BF%B0%E6%A8%99%E6%BA%96%E8%A8%80%E8%AA%9E%28DNCL%29%E3%81%AE%E8%AA%AC%E6%98%8E.pdf)では文字列同士の比較演算についても細かく記述があったが今回ごっそりなくなった
ひょっとしたらなくしたのではなく単に新たに言及していないだけなのかもしれないが細かく決めるほどややこしくなるだけなので妥当な気もする
もし問題として出たとしても問題文に説明がありそうなので気にしなくてよさそう
* 同じく論理演算周りの演算子の優先順位の記述もごっそりなくなった
これもまあ仕方ない気もする
    * だが今回の資料を見る感じ基本的には`hidari <= migi and owari==0`と書いたら`(hidari <= migi) and (owari==0)`みたいな感じの優先順位と考えてよさそう
    * ただこの感覚とかノリも結局は他のプログラミング言語をやっているからそうね、となるのであってガチでDNCLから勉強を始める人（がいるとすれば）がただただ苦労するだけになるのでは？不毛だなと思った
SPSS Modeler ノードリファレンス 5-19 KNN(最近傍)

# 5-19 KNNノード[モデル作成タブ]
<img width="200" alt="107_89CHAID.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1299b226-15d9-f3de-eb30-63423fd75309.png">


## 1.ノードの目的
判別予測と数値予測の両方が行えます。類似ケースを特定することが可能です。

## 2.解説動画（60秒）

<iframe width="560" height="315" src="https://www.youtube.com/embed/GcdOA_mIcp8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 3.クイックスタート

[class]を判別するモデルを作ります。
＊サンプルデータ（CSV）は[5.参考情報]からダウンロードできます。
![スクリーンショット 2022-11-09 18.03.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6178dbca-cd6c-8e42-9bc5-c674832d6f75.png)

次のようにストリームを作成します。
![スクリーンショット 2022-11-09 18.05.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/bc42bb33-acaf-c0d1-e0fb-95aa1c91835f.png)

[データ型]ノードを設定します。[データ型]タブで以下のように設定します。[値の読み込み]ボタンをおしてから[class]の[ロール]を[対象]、それ以外を[入力]にします。[ID]は[レコードID]です。
![スクリーンショット 2022-11-09 18.04.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/dabb0fcd-0119-3d20-76e5-2900ec3ce4d9.png)


[KNN]を実行してナゲットが生成されたら[テーブル]を接続します。
![スクリーンショット 2022-11-09 18.06.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b03f442f-0e71-4c00-5991-8bd7761324c3.png)

[テーブル]を実行します。判別予測と確信度が追加され、その後続で各レコードの近傍と距離が記述されます。
![スクリーンショット 2022-11-09 18.07.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4f280f3b-955c-da54-4025-d58ce868dea3.png)

モデルナゲット（ダイヤのアイコン）をダブルクリックで編集します。ビューアから最近傍と距離を得られます。
![スクリーンショット 2022-11-09 18.09.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1bdd4b0a-9c2f-be47-c68c-3f8edbc91ea2.png)

## 4.Tips

#### わたしの推しノード – 似た者探しの名人「KNNノード」（最近傍法）

https://www.ibm.com/blogs/solutions/jp-ja/spssmodeler-push-node-17/

## 5.参考情報

#### 利用データ

右クリックでリンク先を保存してください。

https://raw.githubusercontent.com/yoichiro0903n/blue/main/KNNdata.csv

#### SPSS Modeler Portfolio Series - kNN

https://www.youtube.com/watch?v=9mZoFRoS1U8

#### ノードのヘルプ

https://www.ibm.com/docs/ja/spss-modeler/18.3.0?topic=models-knn-node

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/items/4bf813e6cba84b2a1008

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee
ニッチなRustのNicheについて

まずはこのコードを見てもらいたい。

```rust
use std::num::NonZeroU8;
use std::mem::size_of;

fn print_size<T>(){
    println!("{}", std::any::type_name::<T>());
    println!("no:  {}",size_of::<T>());
    println!("opt: {}",size_of::<Option<T>>());
    println!("opt2:{}",size_of::<Option<Option<T>>>());
}

fn main() {
    print_size::<u8>();
    print_size::<NonZeroU8>();
    print_size::<String>();
}
```

この結果はどうなるだろうか?
Optionでデータが増えるのだからsizeが増えるように見えるが…。

正解は以下の様である。

```
u8
no:  1
opt: 2
opt2:2
core::num::nonzero::NonZeroU8
no:  1
opt: 1
opt2:2
alloc::string::String
no:  24
opt: 24
opt2:32
```

Optionが増えているのにsizeが変わっていないことがある！
これはRustのniche optimizationが働いているからである。

# niche

nicheとはもともと「隙間」という意味がある。
Rustはその「隙間」を検知してその間に情報を埋めることができる。

例えば`NonZeroU8`という型がある。
その名の通り、「ゼロにならないu8」な型である。
ゼロにならないのは(unsafeを使わない限り)保証されているので、この型には`0`という隙間がある。
つまりNoneという情報をその`0`に埋めてしまえばいいということだ。
メモリ上の表現として

- 0ならNoneとして扱う。
- それ以外ならSome(NonZeroU8)として扱う。

ということができるのである。

Stringの場合は内部にポインタを持っていて、これがnullポインタでないことが保証されている(unsafeで変なことしない限り)。

そういうことで
- ポインタがnullならNoneとして扱う。
- それ以外ならStringとして扱う。

というようなことをしてくれる。

またu8のときにoptとopt2でサイズが増えないのは、Optionの情報を1byteの領域でSome(Some)かSome(None)、Noneかのフラグを保存できるからである。

# ZST、Empty Type
さて`std::convert::Infallible`という型でも上のprint_sizeを走らせてみると以下ようになる。

```
no:  0
opt: 0
opt2:1
```
なんとサイズは0になる。
バグに見えるかもしれないが、そうではない。
Rustは型の中身を見てその型の取りうる値が1通りしかない場合、実行時にはその情報がいらないとみて、コンパイル時に消してくれるのだ。これをZST(Zero-Sized-Type)と呼ぶ。
ZSTとして有名なものは[unit`()`](https://doc.rust-lang.org/std/primitive.unit.html)だ。これは他の言語でいうvoidで、返り値がない型を表している。またZSTは自分で定義できる。`struct Hoge;`だけでこのHogeはZSTとして扱われる。
ZSTはGenericsに入れてやることで、実行時には情報が残らない0コスト抽象化でよく使われるので覚えておくと高速化に役に立つかもしれない。

もとの結果に戻るとここのopt(つまり`Option<Infalliable>`)でもサイズは0である。`Option`は`Some`と`None`の二通りであるから少なくともZSTでないと見えないか？
ここでInfalliableの型定義を見てみるとこうである。
```rust
pub enum Infallible {}
```
variantがないenumは作られない、なので実質never typeとして扱われる。このような型はEmpty Typeと呼ばれる。
`Option<Infalliable>`では`Some(Infalliable)`になることはないとして、`None`しかないからZSTとして扱われるようになるのである。

ちなみにこの`Infalliable`は将来的には[never type`!`](https://doc.rust-lang.org/std/primitive.never.html)のaliasになってdeprecatedになっていく予定だが`!`の安定化はまだみたいである。

またこの`Option<Infalliable>`は[`Try`(?で返す記法)](https://doc.rust-lang.org/std/ops/trait.Try.html#impl-Try-for-Option%3CT%3E)と関連があるので興味がある人は[try-trait-v2](https://github.com/rust-lang/rust/issues/84277)とか見てみると面白いかもしれない。

# 現状と展望

以上のようにRustは型から効率の良いメモリの配置にしてくれる。

ただ現状理論上Nicheとして最適化してくれるところでも効かない場合がある。
また`MayBeUninit`などとの相性が悪いため[仕様としてNicheが効かなくなっている](https://doc.rust-lang.org/std/mem/union.MaybeUninit.html#layout-1)ところもある。
しっかりとNicheになってくれることが保証されているのは[ここ](https://doc.rust-lang.org/std/option/index.html#representation)のように書かれている場所のみである。


それから今、[Nicheのしっかりと保証しようというrfc](https://github.com/rust-lang/rfcs/pull/3334)が上がっている。

またNicheなものに対して[transmute](https://doc.rust-lang.org/std/mem/fn.transmute.html)しても動くはずであるが、これを[安全に動かすためのtrait定義を作るというrfc](https://github.com/rust-lang/project-safe-transmute)もある。

そういった安全な最適化の進展が楽しみである。
std::mapを使ったManager管理

# はじめに
自分の自作ゲームでは、プレイヤー、敵、ステージなどの情報をマネージャーで管理しています。
C++11のstd::mapの使い方を含めた、自分なりの実装方法を紹介します。
マネージャーは一つしかいらないのでシングルトンで管理しています。
# Manager.h
```EnemyManager.h
#include <map> //std::map
#include <memory> //std::unique_ptr
#include <string> //std::string
class EnemyManager
{
private:
    using EnemyMap = std::map<std::string, std::unique_ptr<Enemy>>;
public:
    static EnemyManager& Instance()
    {
        static EnemyManager instance;
        return instance;
    }
    //エネミー登録
    void Register(std::unique_ptr<Enemy> enemy, std::string name);
    //エネミー取得
    Enemy* GetEnemy(std::string name)const { return enemies.at(name).get(); }
    //範囲For文で高速取得用
    const EnemyMap& GetEnemys()const { return fieldEnemies; }
    //更新処理
    void Update(float elapsedTime);
private:
    EnemyMap enemies;
};
```
上から解説します。

using EnemyMap は必要ないですが、変数名が長くなったのでまとめました。
std::mapには"IDの名前, 動的に追加するオブジェクト"という使い方をしています。

static EnemyManager& Instance() はシングルトン用

void Register では引数からマップに登録していきます。

Enemy* GetEnemy ではIDを指定してオブジェクトの取得ができます。
誤って変更されないように関数の後ろにconstをつけています。

const EnemyMap& GetEnemysではstd::mapに登録された、連想配列を取得しています。

EnemyMap enemiesはmapに登録する変数です。

# Manager.cpp
```EnemyManager.cpp
void EnemyManager::Register(std::unique_ptr<Enemy> enemy, std::string name)
{
    battleEnemies.emplace(name, std::move(enemy));
}
void EnemyManager::Update(float elapsedTime)
{
    for (const auto& enemy : enemies)
    {
        enemy.second->Update(elapsedTime);
    }
}
```
上から解説します。
Registerは登録です。
第一引数にID、
第二引数にstd::moveを使用してオブジェクトからunique_ptrの所有権を
マネージャーに渡して管理しています。

Updateで更新しています。
autoFor文を使ってmapに登録したオブジェクトを順番に更新しています。
mapを使ったfor文の中でこれが一番高速になります。
For文の中身でsecondを使うとそのオブジェクトのポインタがとれるようになっています。
つまり、これを使うとオブジェクトの関数を実行できます。
ちなみに、fistにはID名が入っています。

# IDの作成
登録するときに使用するIDを作成します。
```ID.h
namespace EnemyID
{
    static constexpr auto& Slime = "Slime";
};
```
static constexprについてはこちらの記事で説明をしています。

https://qiita.com/lightnig-programer/items/d9f78bd701206986875e
# Register&Draw
基本的なマネージャーは完成です。
次は実際に登録と描画をしていきましょう
例として3体登録します。
``` GameRegister.cpp
		EnemyManager& enemyManager = EnemyManager::Instance();
		for (int i = 0; i < 3; ++i)
		{
			std::unique_ptr<Slime> slime = std::make_unique<Slime>();
			char text[256]{};
			char index[8]{};
			sprintf_s(index, "%d", i);
			strcpy_s(text, EnemyID::Slime);
			strncat_s(text, index, sizeof(index));
			enemyManager.Register(std::move(slime), text, i);
		}
			for (const auto& enemy : EnemyManager::Instance().GetEnemys())
			{
            //描画形式によって変わるため割愛
			}
```
unique_ptrを使ってnewをします。(スマートポインタが破棄されると自動的にdeleteされます)
IDの設定はあくまで一例です。
ID名の後に番号をつけて分けています。
enemyManager.Registerでもstd::moveで所有権を移します。

# まとめ
mapとは別にunordered_mapがありますが、どちらでも大丈夫です。
違いについては別の記事にまとめられているのでお好きなほうをお使いください。
ちなみに、    
```
EnemyMap::iterator it = fieldEnemies.find(name);
```
でイテレーターを取得できます。
【図解】プロセス・スレッドについてまとめ

エンジニアとして仕事をしていると、「プロセス」「スレッド」という言葉に必ず出会うと思います。
この記事では「プロセス」と「スレッド」の関係性についてまとめました。

# プロセスとは
プロセスとは実行中のプログラムのことです。
例えばMicrosoftのWordやエクセルはそれぞれ1つのプロセスです。

# スレッドとは
スレッドはCPUからみたプログラムの実行単位です。
スレッドはプロセス内に含まれます。プロセスにはいくつもの処理が記述されていますが(画面描画をする、通信するなど)、これらの処理単位がスレッドです。


# 図解
以下がプロセスとスレッドの関係のイメージ図です。ポイントとなる部分に番号を振っているので番号順に説明していきます。
![プロセスとスレッド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345720/920d5f47-2c62-413b-5ea1-ea391ad052d6.png)


## ①OSが各プロセスにメモリ領域を割り当てる
プロセスはOSによって管理されています。
プロセスが立ち上がった時（例えばMicrosoftのWordが立ち上がった時）、OSがそのプロセスに対してメモリ領域を割り当てます。
各プロセスに割り当てられたメモリ領域は他のプロセスと重複することはありません。そのプロセス専用の作業場を用意してもらうイメージです。
メモリ領域には物理アドレスと仮想アドレスがあります。
物理アドレスは物理的なメモリに物理的に最初から振られているアドレスです。
対して仮想メモリはプロセスが割り当てられた際にそのプロセスが物理アドレスを認識するために割り当てられるアドレスです。
仮想アドレスは物理アドレスと対になっていて、プロセス側は物理アドレスの番号がわからなくても仮想アドレスさえ知っていれば物理アドレスにアクセスできるようになっています。
※ちなみに図中の物理アドレス、仮想アドレスの番号は適当です。本当は0x00000000~0x0000FFFFのような番号になります。

## ②マルチスレッド
スレッドを複数に分けて持つプロセスのことをマルチスレッドと言います。
図中だとプロセス1とプロセス2はマルチスレッドです。

## ③シングルスレッド
スレッドが1つだけのスレッドのことをシングルスレッドと言います。
図中だとプロセス3がシングルスレッドです。

## ④マルチコア・シングルコア
コアとはCPU内部にある演算回路であり、処理を行う中核部分です。コアでスレッドを処理しているとイメージしていただければいいと思います。
~~CPUでは1つのコアにつき、1つのスレッドしか処理できません。~~ →[こちらの記事](https://qiita.com/Amby/items/7b715f108e51466d5d62)で修正しました。
コアを複数持つCPUをマルチコア、1つしか持たないCPUをシングルコアと言います。
つまり、マルチコアは複数のスレッドを同時に処理でき、シングルコアは1つのスレッドしか処理できない、ということになります。

## ⑤スレッドとコアの関係
マルチコアは複数のスレッドを同時に、つまり並列で処理することができます。マルチコアであればマルチスレッドを処理できるため、PCの処理速度が高速になります。
逆に、シングルコアでマルチスレッドを処理しようとすると、スレッドの切り替え時間の分処理が遅くなることがあります。
マルチコアのCPUを搭載したPC（もしくはサーバー）であればマルチスレッドのプロセスを効率的に処理できるので、処理速度が高速になるということです。


# 参考
[プロセスとスレッドの違いとは？超わかりやすく解説！【図解とプログラム付き】](https://webpia.jp/thread_process/)
[【図解】CPUのコアとスレッドとプロセスの違い,コンテキストスイッチ,マルチスレッディングについて](https://milestone-of-se.nesuke.com/sv-basic/architecture/cpu/#:~:text=%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%A8%E3%81%AF%E3%80%81%E5%AE%9F%E8%A1%8C%E4%B8%AD,%E3%81%99%E3%82%8B%E5%8D%98%E4%BD%8D%E3%81%AE%E3%81%93%E3%81%A8%E3%81%A7%E3%81%99%E3%80%82)
wp_nav_menu()が出力する<li>タグのクラスをシンプルにし、かつカスタムクラスも維持する

wp_nav_menu()が出力するメニューの&lt;li&gt;にはやたらとクラスが設定されていて、検索するとこれに対応するための記事が幾つも発見できます。

対応法としては、nav_menu_css_classフィルターを使うのですが、この中に「カスタムクラス」なるものを退避して再設定するという記事があり、なぜかフィルターに渡された配列の先頭要素のみを退避しているものがありました。

要点だけ抜き出すと↓な感じ。
```php
add_filter('nav_menu_css_class', function ($classes, $menu_item, $args, $depth) {
    $save = (!empty($classes[0])) ? $classes[0] : null;

    $classes = [];

    if ($save) {
        $classes[] = $save;
    }

    return $classes;
}, 10, 4);
```

なんで[0]だけ？
と思ってvar_dumpしてみたら、[0]が空でないのは、たしかにカスタムクラス使用時のみのようです。
```php
// カスタムクラス設定なし
array(8) {
  [1]=>
  string(9) "menu-item"
  [2]=>
  string(24) "menu-item-type-post_type"

// カスタムクラス設定あり
array(9) {
  [0]=>
  string(12) "custom_class"
  [1]=>
  string(9) "menu-item"
  [2]=>
  string(24) "menu-item-type-post_type"
```      

しかし、カスタムクラスに空白を含む値を入力してみると、空白で区切られた分だけ配列要素が増え、[0]だけではダメだということが分かってしまいます。
```php
// あらら
array(11) {
  [0]=>
  string(13) "custom_class1"
  [1]=>
  string(13) "custom_class2"
  [2]=>
  string(13) "custom_class3"
  [3]=>
  string(9) "menu-item"
  [4]=>
  string(24) "menu-item-type-post_type"
```

たぶん参考にした記事の投稿時点では[0]だけで良かったのでしょうが、そもそもカスタムクラス機能が使われてなくて問題になってないのか、僕の検索技術ではたどり着けないのか、対処方法が...。
とにかく、カスタムクラスなんて僕は使いませんが、見てしまった以上は対応も見つけておかないと、ということで調べると、wp_setup_nav_menu_itemフィルターで受け取れる$menu_itemのclassesはカスタムクラスのみの状態で、nav_menu_css_classまでの間に加工されてしまう、と。

なので、少々強引ですが、wp_setup_nav_menu_itemで$menu_itemに退避して、nav_menu_css_classで戻してやれば良いのでは、という結論。

```php
add_filter('wp_setup_nav_menu_item', function ($menu_item) {
    // カスタムクラスを退避
    if (!empty($menu_item->classes) && $menu_item->classes[0]) {
        $menu_item->custom_classes = $menu_item->classes;
    }
    return $menu_item;
}

add_filter('nav_menu_css_class', function ($classes, $menu_item, $args, $depth) {
    // IDくらいは残しておきたい
    $classes = ['menu-item-' . $menu_item->ID];

    // カレントか知りたいこともある
    if ($menu_item->current) {
        $classes[] = 'current-menu-item';
    }

    // 退避したカスタムクラスを再設定
    if (isset($menu_item->custom_classes)) {
        $classes = array_merge($classes, $menu_item->custom_classes);
    }

    return $classes;
}, 10, 4);
```

...気にしなければよかった。
C# の Main関数で Http POST リクエストを同期実行する例

- awaitしない
- 非同期用のメソッド + .Result を利用するところがポイントのようだ

```c#
using System.Text;
using System.Text.Json;


namespace MyApplication
{
    public class Ex
    {

        private static readonly HttpClient HttpClient;

        static void Main(string[] args)
        {

            Console.WriteLine("START");
            ItemRequest();
            Console.WriteLine("END");

        }

        static async void ItemRequest()
        {

            HttpClient client = new HttpClient();
            string url = "https://httpbin.org/post";

            List<string> Items = new List<string>();

            Items.Add("1-2-3");
            Items.Add("4-5-6");
            string parameters = JsonSerializer.Serialize(Items);

            var request_content = new StringContent(parameters, Encoding.UTF8, "application/json");

            HttpResponseMessage response = client.PostAsync(url, request_content).Result;

            var request = new System.Net.Http.HttpRequestMessage(System.Net.Http.HttpMethod.Post, url);

            var body = response.Content.ReadAsStringAsync().Result;

            Console.WriteLine(body);

        }

    }

}
```

# 参考

https://kuttsun.blogspot.com/2017/11/c.html


https://qiita.com/superriver/items/91781bca04a76aec7dc0


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
iOS 秋の新色 2023年版 (iOS17 beta)


## はじめに
iOSでプリセットされている色を調査していたところ、```iOS14以降```でも新色が追加されていることに気が付いたのでまとめてみました。


## iOS 17 beta
新色なし

## iOS 16
新色なし

## iOS 15
### UIColor  (UIKit)
#### Tint color

| Name | Light mode | Dark mode |
|:---|:---|:---|
|tintColor| <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/059f22fc-759b-422f-e0dc-ce7b3ddfcb5d.png" width=120><br>(0, 122, 255)<br>#007AFF | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/f482a153-8963-dc88-9c5b-e2f3a166469a.png" width=120><br>(10, 132, 255)<br>#0A84FF |





#### Adaptable colors

| Name | Light mode | Dark mode |
|:---|:---|:---|
|systemCyan| <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/bea29402-b7cd-6506-371d-c058b1f71d02.png" width=120><br>(50, 173, 230)<br>#32ADE6 | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/5fb03138-ba56-1471-96d7-c24c2acd57e0.png" width=120><br>(100, 210, 255)<br>#64D2FF  |
|systemMint| <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/01e63deb-4a38-bf4a-bbd1-4afab2427ca0.png" width=120><br>(0, 199, 190)<br>#00C7BE | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/95560f95-ecc6-6601-e75e-bdb5b2427bcf.png" width=120><br>(99, 230, 226)<br>#63E6E2 |




### Color  (SwiftUI)

#### standard colors

| Name | Light Mode | Dark Mode | 考察 |
|:---|:---|:---|:---|
| brown | 調査中  | 調査中 | UIColor.systemBrown と同じ？ |
| cyan |  調査中  | 調査中 | UIColor.systemCyan と同じ？ |
| indigo |  調査中  | 調査中 | UIColor.systemIndigo と同じ？ |
| mint |  調査中  | 調査中 | UIColor.systemMint と同じ？ |
| teal |  調査中  | 調査中 | UIColor.systemTeal と同じ？ |



## iOS 14
新色なし

## iOS 13
SwiftUIやDark modeが追加されて多くの変更があった。


## おわりに
毎年更新を続けていこうと思いますので、忘れていたらコメントで催促お願いします！

## 参考
[Color | Apple Developer](https://developer.apple.com/documentation/swiftui/color)
[UIColor | Apple Developer](https://developer.apple.com/documentation/uikit/uicolor/)
スタブについて

テスターとしての業務の中でよく使用していた「スタブ」という仕組みを自分用に整理します。

# スタブとは？

アプリケーションでのAPIのテストで利用するために用いるツール。
主に、スタブの呼び出し元となるテスト対象アプリの動作確認を行うために使用します。
テスト対象のアプリからの呼び出しに対して、あらかじめ設定している必要最低限のレスポンス情報を返す仕組み。

### こんな感じで使いました
自分が携わった案件の場合、スプレッドシートでHTTPレスポンスの欄を書き換えて、
エラーコードなどや処理フローの流れの確認で使用しました。
エラーの中身で処理フローの分岐が変わったりする場合、非常に有用でした！

### どんな時に使われるの？誰が作るの？

先輩社員から話を聞きました。

曰く、
- サーバーとアプリが別々のチームである時によく使う。
- サーバーがまだ出来上がってないが、アプリ側が開発を進めたい！となったときに使ったりする。
- サーバー側の方作ることが多い。が、場合によってはアプリ側が作ることもある。
- APIの動作、固定で決まっている部分を確認するには良い。
とのことでした。

最終的なテストでは本番環境での動作確認が必要ですが、
それをどうしても行いにくい時に使えますね！
どうやってつくるのか、方法も調べていきたいと思います。
激安なDBの仕組み作りにチャレンジ 1回目

# はじめに

AWS(Amazon Web Services)やGCP(Google Cloud Platform)、AzureなどでもなかなかDBのコストは高いため(AWSのサーバーレスのRDSは安いかもしれません)、利用頻度の低いケースやレスポンスが遅くても大丈夫な場合を前提としたなるべくコストの安いDBの仕組みを作ってみようという記事になります。

まず1回目は、SQLのクエリを受け付ける箇所について作成していこうと思います。また、Google Cloud Platfromで構築していきます。使用するサービスは、もちろんCloud SQLは今回は使用できないのでコストの安そうなサービスを使用していきます。

# 仕組み

どのようにして低コストの仕組みを作るのか考えてみましたが、作りやすさ(コード量の少なさなど)を重視して次のようなサービスを利用していきます。

- Cloud Functions
- Cloud Storage
- Pub/Sub

処理の流れは次の通りです。

1. SQLクエリの受付: Pub/Sub
1. Pub/Subに格納されたSQLを実行: Cloud Function 
    - SQLiteにDBの処理を任せます
    - DBで更新された内容はCloud Storageに保存 

# 構築する

まずはPub/Subの準備からはじめます。Google CloudのWebコンソールからPub/Subを選択して新しく「トピック」を作成します。

次にGoogle Cloud StorageでSQLiteのDBのファイルを保存するバケットを作成します。リージョンなどは単一リージョンなどでも大丈夫です(コスト優先で)。

最後にCloud Functionsを作成します。ここが今回のメインです。Cloud Functionsは第2世代が使えるようになっているため、第2世代を今回は選びました。実際にはCloud Runが動いているようです。ここで大事な設定が一つあります。それはPub/Subからメッセージを受け取るためのトリガーの設定です。

作成画面に「EVENTARCのトリガーを追加」というボタンがあるのでそちらを押します。そこでイベントプロバイダーをCloud Pub/Sub、トピックを先ほど作成したPub/Subのトピックを設定します。ここでサービスアカウントを任意なものを設定しておきます。

「次へ」を押すとランタイムの設定やソースコードの入力ができる画面になります。今回ランタイムはなんとなくRuby 3.0を選択しました。app.rbやGemfileは次のようになります。


```ruby:Gemfile
source "https://rubygems.org"
gem "functions_framework", "~> 0.11"
gem "google-cloud-storage"
gem "sqlite3"
```

Gemfile.lockもこの内容が反映されていたいものだとうまく起動しないため、ローカルの環境で```bundle install```して作成されたファイルをここに張り付けてください。

```ruby:app.rb
require "functions_framework"
require "base64"
require "google/cloud/storage"
require "sqlite3"
require "json"

FunctionsFramework.cloud_event "hello_pubsub" do |event|
  message = Base64.decode64 event.data["message"]["data"] rescue "SELECT 1"

  input = JSON.parse(message)
  query_id = input['id']
  query = input['query']

  storage = Google::Cloud::Storage.new
  bucket_name = "{作成したバケット名}"
  bucket = storage.bucket(bucket_name, skip_lookup: true)

  file_name = 'hello.db'
  file = bucket.file(file_name)
  file.download(file_name) if file.exists?

  db = SQLite3::Database.new(file_name)

  if query.downcase.index('select') == 0
    rows = []
    db.execute(query) do |row|
      rows.push(row)
    end
    rows_json = JSON.generate(rows)
    logger.info("output: #{rows_json}")
    bucket.create_file(StringIO.new(rows_json), "output/#{query_id}.txt")
  else
    db.execute(query)
  end

  db.close

  file = bucket.create_file(file_name, file_name)

  logger.info("input: #{message}")
end
```

これでCloud Functionの作成はおしまいです。しかし、このままだとPub/Subからの呼び出しに失敗してしまうためEventarcトリガーに設定しているサービスアカウントのロールを追加します。
「IAMと管理」の画面を開いて、「IAM」のEventracに設定しているサービスアカウントの編集ボタン(プリンシパルを編集します)を押して「Cloud Run起動元」を追加します。

# SQLを実行する

今回は手動でメッセージを送信します。Pub/Subのトピックを開いて今回作成したトピックを選び、メッセージのタブを選びます。「メッセージのパブリッシュ」というボタンがあるので、それを押して次の内容のメッセージを入力して、「公開」をボタンを押します。

Jsonの形式で入力するようにしています。queryにSQLを記述します。

```json
{"id":"test_001", "query": "CREATE TABLE users (id int, name varchar(30));"}
```

```json
{"id":"test_002", "query": "INSERT INTO users VALUES(1, 'test');"}
```

```json
{"id":"test_003", "query": "SELECT * FROM users;"}
```

SELECTの場合、今回はCloud Storageに結果を保存するようにしています。この結果の返し方は、いろいろと方法がありそうですね。


# おわりに

次回は、クエリを発行する側を作成していこうと思います。実際には、同時書き込みなどの制御などまだまだ課題は多いですが、改良していければと思っています。
BigQueryでSelect結果をloopしてInsertするSQL

# 背景
あるテーブルの SELECTの結果をloopしてinsertしていきたい場合。
[Procedual Language](https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language#for-in)を使います。

[For...in](https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language#for-in)

# 実装

```sql
FOR record IN (SELECT column_name from dataset.table)
DO
 INSERT INTO dataset.target_table (target_column_name) VALUES(record.column_name);
END FOR;
```
【2022 令和最新版】開発環境の紹介【for macos】

最近Qiitaへのoutputをしてなかったのでリハビリです。

## 記事概要
ただ単に自分の開発環境をGUI・CLIに関わらず紹介する記事です。
あくまでリハビリなので箇条書きで一気に紹介していきます。

### 前提情報
OS: mac
職種: ソフトウェアエンジニア（webアプリケーション）
    ※フロントエンドもバックエンドもやります
## 紹介
### ブラウザ
#### [sidekick](https://www.meetsidekick.com/download/)
- 便利でパフォーマンスも良いchromeって感じ
- chromeベースなので、拡張機能とか各種サイトへの対応とかはモーマンタイ
- SaaSの統合ブラウザみたいな感じ
- SidebarにいろんなサイトをAppとしておいておける
    - これが一番便利
    - Window間でAppが共有されているので、モニタ間の行き来が楽。モニタを複数使っている人にはかなりおすすめ
    - App内での複数アカウントも対応している
- 自動のタブSuspendとかもついているのでパフォーマンスも◎
- ブラウザ内でsplit viewが使えるのもよい
- workspace機能があるので、一つのアカウントで私用と会社用とかで分けて使える

[ダウンロードはぜひこちらから](https://join.meetsidekick.com/9vkve)
（紹介ポイントを稼ごうとするとんでもない輩）
（紹介リンクなんか踏みたくないよって思ったら[こちら](https://www.meetsidekick.com/download/)からどうぞ）

紹介記事
https://zenn.dev/jumebys/articles/e55a2d281846d7

### IDE
#### [Goland](https://www.jetbrains.com/go/)

- 仕事はGoがメインなのでこれを使っている
- 元々vscodeを使ってましたが、大きな差はないので正直どっちでも良いかなって印象
    - サジェストが優秀だったりして細かくカスタマイズせずともつかいやすいので多分今後もJetbrain製品を使う気はする
- なんとなく使っている

### terminal
#### [warp](https://www.warp.dev/)
- 21世紀のターミナル、を売りにしてますが確かに使いやすい
- Rust製なのでパフォーマンスも◎
- 大体iTermでできることはできるはず
    - 背景の透過ができないので、これだけは本当に不便
- IDEと同じような感じで、範囲選択とかしながらコマンドを編集できる
    - これが一番便利
    - iTermに戻れなくなった理由でもある
- Command　+ Pで開くコマンドパレットもかなり便利
    - ターミナルの分割やリネームから、開きたいターミナルの捜索まで全部キーボードだけでできるので、快適
- コマンドのサジェストもwarpの機能としておこなってくれるので、zshとかのカスタマイズがいらない
    - その代わり、powerlevel10kとかも使えないので、取捨選択
- hotkeyがmac標準の英字入力以外反応しない…
    - 後述のraycastと組み合わせて使っている
- iTermから戻れなくなった

紹介記事
https://dev.classmethod.jp/articles/warp-terminal/

### lancher
#### [raycast](https://www.raycast.com/)
- Extensionが便利
    - Deeplの翻訳・Github・Timestampの変換など、便利な機能がThridPartyのExtensionとして公開されている
    - 勿論、自分で開発もできるので拡張がかんたん
- hotkeyが便利
    -　アプリケーションや、Extentionにたいしてhotkeyが割り振りできるので、キーボードでの操作が捗る
-　pc間での同期機能がほしい
- Alfredとの機能差分はよくわかってない
- これがないと生きていけない

紹介記事
https://zenn.dev/yum3/articles/i_raycast_or_alfred

### DB viewer
#### [arctype sql client](https://arctype.com/)
- 開発終了した(泣)
    - 厳密に言うと、arctypeというDB自体がClickHouseというDBと併合されたので、その余波を受けSQLClientが開発終了に…
- Command + Kでコマンドパレット的なやつが使える
    - tableの検索、新規SQLのタブを開く、などなんでもできる
    - これが本当に便利
- UIが見やすい
- SQLのformatが簡単
- TableのViewのSort、Filterやデータの挿入・更新が直感的で簡単
- 誰か代替で使えそうなものがあればおしえてください…

紹介記事
https://zenn.dev/praha/articles/bd2adb4f42ec8f?redirected=1

### other
#### [httpie](https://httpie.io/)
- apiとかをGUIで叩けるツール
    - ぶっちゃけpostman
- postmanに比べるとUIや機能がシンプル
    - 必要最低限の機能はあるって感じ
- なんとなくつかっている

#### [hyper switch](https://bahoom.com/hyperswitch)
- ウインドウの切り替えアプリ
- mac標準だとアプリケーション単位での切り替えしか出来ないが、これはwindowsみたいにウインドウ単位で切り替えできる
    - ブラウザとかIDEだと複数ウインドウ使うので、これがないと生きていけない

#### [clippy](https://clipy-app.com/)
- clipboard拡張アプリ
    - 履歴が最大300件くらいまで保存できたり、よく使う単語をsnipetとして登録できる
- これがないと生きていけない

#### [Rectangle](https://rectangleapp.com/)
- ウインドウのリサイズや配置の変更ができる
- windowsには標準である機能だが、これがあるとだいぶ捗る

#### [fuwari](https://apps.apple.com/jp/app/fuwari/id1187652334?mt=12)
- スクショ機能を拡張してくれるアプリ
- 標準のスクショもそこそこ優秀ではある
  - が、画面の一部選択→スクショ→クリップボードへコピーの流れが一瞬でできるので、エビデンスとかの確保に最適

#### [run cat](https://apps.apple.com/jp/app/runcat/id1429033973?l=en&mt=12)
- かわいい

## 備考
記事タイトルはAmazonでよく見るやつを~~パクって~~参考にしました
JSTQB認定テスト技術者資格Advanced Level＜テストアナリスト＞の勉強方法

## はじめに
私はQAエンジニアをしており、SES契約で顧客の開発チームに入りQA活動を行っています。
ちなみにAdvanced Level＜テストアナリスト＞については今の仕事をやり始めてから取得しました。

## 勉強方法
JSTQB認定テスト技術者資格Advanced Level＜テストアナリスト＞を無事取得できたわけですが、そんなに有名な資格ではない（と思ってます。ごめんなさい:bow:）のため、勉強方法についてもあまり情報がないのかなと思います。

実際、私が勉強に使用したのも下記の2つです。

【参考資料】
ISTQB®テスト技術者資格制度　Advanced Level シラバス日本語版テストアナリスト Version 3.1.1.J03 
https://www.jstqb.jp/dl/jstqb.jpdlJSTQB-SyllabusALTA_V311.J03.pdf

テスティング中級コース(アナリシス編)　※ISTQB/JSTQB TA試験対応
http://squaring.jp/

勉強方法としては、上記のシラバスを読みつつ、スクエアリングの模擬試験を解きまくってわからない単語が出てきたら調べるの繰り返しです。

ちなみにシラバスは何時間ぐらい読んだのかはわかりませんし、最後まで読んだ記憶はないですｗ
スクエアリングについては

学習時間：
38時間42分

網羅率：	
91.1%

到達度：	
90.1%

合格可能性：	
82.1%

ぐらい勉強しました。

あとは、本業の経験がプラスになったと思います。
実際の状況に置き換えて考えることで理解しやすくなるもんです。


## 最後に
あまり参考になってないかもしれませんが（書いてて本当に参考情報が少ないなと:bow:）、今後JSTQB認定テスト技術者資格Advanced Level＜テストアナリスト＞を受験する方の助けになれば幸いです。
「大学入試問題文?集（第2巻）小中学生でも解けそう」を作ってみました。ランキングです。

受験生のみなさまのご健闘をお祈りいたします
現在,例3つです。またか状態です。

# 作成の目的

ネットで、問題集「ジュウモン」「チェクリピ」の紹介をみました。
そこで、私の問題文?集を **「ショウチュウモン（小中問）」** と、読んでもらうと幸いです。
ローレベルの人に、おすすめしたい問題文です。
ハイレベルの人は、必要ありません。


# 最新の1位は、これも自転車君。第4問(2)だけ
(1)は、無理だと思います。
(1)を無視して(2)だけなら、小中学生に何とかなりそうです。

https://mathexamtest.web.fc2.com/2022/202210000/2022100000200mj.html#top-0208

https://qiita.com/mrrclb48z/items/297442a71820732d3ea3

# 2位は、組合せ問題(ラテン方陣)です。

https://qiita.com/mrrclb48z/items/a97086d25b3d0bee7125

# 3位は、2022年度大学入学共通テストの数字の13です。
√は、小学生に無理でした。
√は、中学生なら何とかなりそう。

https://qiita.com/mrrclb48z/items/7c16cb5141a495bc5307


# 感想
他にもあると思います。勉強不足で申し訳ありません。
おすすめがあれば、教えて下さい。
「大学入試問題文?集（第1巻）受験生を惑わす」を作ってみました。

受験生のみなさまのご健闘をお祈りいたします。
現在,3例です。
受験生が試験場で、そんたく(?漢字:他人の気持をおしはかること)が必要な問題文の例です。


# 作成の目的

ネットで、問題集「ジュウモン」「チェクリピ」の紹介をみました。
そこで、私の問題文?集を **「マドモン（惑問）」** と、読んでもらうと幸いです。
ローレベルの人に、おすすめしたい問題文です。
ハイレベルの人は、気になりません。

https://www.google.com/search?client=ms-android-huawei&sxsrf=ALiCzsbflSOaNINvq29vrznZNMHG4MWxlw:1667683209447&q=%E3%82%BB%E3%83%AC%E3%82%AF%E3%83%88%E3%81%A8%E3%83%81%E3%83%A7%E3%82%A4%E3%82%B9%E3%81%AE%E9%81%95%E3%81%84&sa=X&ved=2ahUKEwjm3a-K_Jf7AhWQCbcAHQfIA3kQ1QJ6BAgXEAE

# 気になる問題文の単位。自転車君

勝手なランキング1位。2022年数学共通テストの自転車君の問題です。
＞歩行者が自宅を出発してからx分経過した時点を時刻xと表す．
「時刻x」　**使い慣れない言葉**　だと思います。
**単位のない時刻は、ピンときませんでした。**　分、毎分は、あります。
数学入試問題で、単位は、radianとdegreeの角度変換しか思いつきません。
m、毎分、単位なし?とかでてくるとややこしくなります。
座標系の長さに、単位はありませんから。1単位、1unitは、ありました。
オリジナル

https://mathexamtest.web.fc2.com/2022/202210000/2022100000200mj.html#top-0208

(参考)

https://qiita.com/mrrclb48z/items/47c091f5e368eabb3909#%E5%8F%82%E8%80%83

https://www.google.com/search?q=%22%E6%99%82%E5%88%BBx%22&rlz=1C1CHBD_jaJP908JP908&oq=%22%E6%99%82%E5%88%BBx%22&aqs=chrome..69i57j0i546l5.4752j0j7&sourceid=chrome&ie=UTF-8

# 気になる積分問題文の表現
オリジナル
？２回不定積分した解答も.....＜

https://mathmathmass.exblog.jp/32440244/


B日程(4)の積分です。
「B日程とA日程の問題文の表現の違い」
　B日程:次の関数の不定積分を求めなさい．
　A日程:次の不定積分を求めなさい．

https://mathexamtest.web.fc2.com/2022/202211325/2022113250200mj.html

https://mathexamtest.web.fc2.com/2022/202211325/2022113250100mj.html

(公式サイト)

https://www.unii.ac.jp/admissions/past-results/

B日程 問題文 pdf

https://www.unii.ac.jp/wp-content/uploads/2022/07/6e65831863dbf272b7a65cd8df1a440d-1.pdf#page=2

y=がない方が良かったですか？
「(3)　次の関数の極値を求めなさい．」
「(4)　次の関数の不定積分を求めなさい．」
(3)の行をコピー貼り付けして修正したように見えます。　(3)→(4)、極値→不定積分
(3)と(4)があるから、そんたくが発生しますか？

(参考例)過去問題文の積分より
次の定積分を求めよ．＜
I,Jがありました。2問のため。

https://kamelink.com/exam/index.php?%C0%D1%CA%AC%B7%D7%BB%BB%20-%20%CB%CC%A4%AB%A4%E9%C6%EE%A4%D8%202021%20%B9%F1%B8%F8%CE%A9%C2%E7-


##### 関数yと関数f(x)の表現の違いについて、調べてみました。
 
関数 y = ＜　サイト内検索＜大学入試数学問題集成

https://cse.google.com/cse?cx=a8908fbc24340ebc5&q=%E9%96%A2%E6%95%B0%20y%20%3D%20&oq=%E9%96%A2%E6%95%B0%20y%20%3D%20&gs_l=partner-web.3..0i512.2048.2048.0.2605.1.1.0.0.0.0.74.74.1.1.0.csems%2Cnrl%3D10...0....1.34.partner-web..0.1.74.wmfgW8YHjfQ

函数とも書かれる＜
現代の初等教育の場においてはしばしば関数をブラックボックスのたとえで説明することがある＜

https://ja.wikipedia.org/wiki/%E9%96%A2%E6%95%B0_(%E6%95%B0%E5%AD%A6)

y=だと函(ハコ)という感じがしませんね。
（追加）y=グラフの感覚?を忘れていました。
積分定数のあるグラフでした？おやすみなさい。




# 数式に、大小の記号と数字が複雑に混じっている。

3√(x+2)(x^2+1)**(1/3)

https://mathexamtest.web.fc2.com/2022/202210141/2022101410200mj.html

文字の大きさに違いがあると、勘違いしやすいです。
3,2,2,1,3,1y,x,√

# 以下も参考にして下さい。
私なりの数学共通テストの5対策＜

https://qiita.com/mrrclb48z/items/7c16cb5141a495bc5307#%E7%A7%81%E3%81%AA%E3%82%8A%E3%81%AE%E6%95%B0%E5%AD%A6%E5%85%B1%E9%80%9A%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE5%E5%AF%BE%E7%AD%96

# 感想
他にもあると思います。勉強不足で申し訳ありません。
エリック・エヴァンスのドメイン駆動設計 2部 4章を読んでまとめてみた

# はじめに
こちらへ記載してあることは一個人の考え方・理解であり、間違っている箇所もあることを前提に見ていただけると幸いです。
アウトプットのつもりで、自分なりにまとめていこうと思います。

# ２部 モデル駆動設計の構成要素
2部でやることを章ごとにざっくりまとめる。

[モデル駆動設計]
*4章*
- ドメインを隔離するのに利用する
レイヤー化 アーキテクチャ
- 排他的な選択
利口なUI

*5章*
- モデルを表現するのに利用する
サービス
エンティティ
値オブジェクト

*6章*
- カプセル化するのに使用
値オブジェクト→ファクトリ
エンティティ→ファクトリ
エンティティ→集約
集約→ファクトリ
- 整合性を保ち、ルートとして機能する
エンティティ→集約
- アクセスするのに使用
エンティティ→リポジトリ
エンティティ→集約
集約→リポジトリ

それぞれの言葉の意味は章ごとに追々。。

# 4章　ドメインを隔離する
ドメインオブジェクトは<INS>システムの他の機能</INS>から切り離して考える。
    →ソフトウェアの技術にしか関係しない概念など。

## レイヤー化アーキテクチャ
レイヤー化（階層化）することで設計が理解しやすくなる。
- それぞれのレイヤーはそれぞれの責務へ集中する
- レイヤーは同じレイヤーの同じ要素か、下層にあるレイヤーの要素にしか依存しない

### ユーザーインターフェース層（プレゼンテーション層）
ユーザーに情報を表示して、ユーザーからインプットを受けつける。
### アプリケーション層
ドメインオブジェクトが問題解決できるように調整する。
ビジネスルールや知識を含まない薄いレイヤー。
### ドメイン層（モデル層）
ビジネスの概念・ビジネスの状況に関する情報やビジネスルールを表す。
**この層がビジネスソフトウェアの核心である。**
### インフラストラクチャ層
上位のレイヤーを支える技術的機能を持つ。
ドメインのための永続化、アプリケーションのためのメッセージ送信、ユーザーインターフェースのための描画など。

## レイヤー同士を関係付ける
レイヤー同士は<INS>疎結合</INS>にするべきで、上位のレイヤーからは下位のレイヤーを直接操作したり使用したりできる。→基本的な考え方。

※疎結合とは・・・システムの構成要素間の結びつきや互いの依存関係、関連性などが弱く、各々の独立性が高い状態。
<br>
インフラ層の技術的な機能は**サービス**として提供されることが多い。
**サービス**を使うことで、上位レイヤーは「**どうやって？**」を気にしなくてよくなる。
例えば...
- メッセージをいつ送信するかは知っているが、「どうやって」アプリケーション層からメッセージを送るのか？
- 「どうやって」ドメインの状態をデータベースに保存する？
などを気にしなくてよいので<INS>本来の仕事だけに集中ができる。</INS>
<br>
ただ全ての技術的な機能をサービスとして作るのは大変...。

そういった場合に、**アーキテクチャフレームワーク**が使われる。

<<使用する上での注意事項>>
- 制約が多いとドメインが設計しにくく、開発速度が落ちてしまう。
↓その為
フレームワークの最も価値のある機能だけを適用していくことで、実装とフレームワークを疎結合にしていく。
↓よって
設計上の意思決定をより柔軟にできるようになる。

## 利口なUI（アンチパターン）
「利口なUI」と「モデル駆動設計」は対抗するアプローチ
※利口なUIとは・・・画面に入れた情報がそのまま登録させるイメージ。

メリット
- 単純なアプリケーションで、スケジュールが短く期待値が低い
- それほど有能じゃない開発者だけでもできる

デメリット
- アプリケーションの統合が難しく、データベースを経由させるしかない
- ふるまいの再利用もビジネスの抽象化もできない
→同じような処理も複製して作ることに。
- サービスのふるまいを豊かにすることができない
- サービスの成長に限界がある
- オブジェクト指向プログラミングのメリットを活かせない

**モデル駆動設計はこれらデメリットにアプローチできる。**
利口なUIからモデル駆動設計の変更は、最初から作り直すことに。

# まとめ
- **レイヤー化アーキテクチャはドメイン層が重要**
ドメイン層を他のレイヤー層と分けて作るのが**必須条件**。
モデルとモデルに関係する設計が全て現れる場所である。

- モデル駆動設計は、スキルも必要で大変だが大掛かりなプロジェクトに効果が高い。
「みんなの考えた最強のデータアーキテクチャ」めちゃくちゃ楽しかったまとめ

## 「みんなの考えた最強のアーキテクチャ」に参加したのでまとめと備忘録

まず感想。
サイコーに面白かった。

https://datatech-jp.connpass.com/event/258157/

LT発表者各々がツールや組織形態、フローなど多面的な目線から、データ基盤を運用するのに最強な状態ってなんなの？
っていう話を永遠とする勉強会。

発表者それぞれ所属している環境が違うことから、発表の内容が違ってとても良きでした。

まとめ
-----------------------------------------
１．源泉システムに合わせたデータ基盤が最良
２．データチームに人があまりいないなら Fivetran&dbt&SnowFlake が最善かも（それぞれ理由がある）
３．データエンジニア変な人多い。笑


やっぱりどんな状況でも共通している悩みはたくさんあるんだな...
「しゃあないNULL」は名言だと思いました。
また開催してくれるようなので楽しみ！今度はオフラインでも参加してみよ～