OmniAICreator/Qiita-1.07M huggingface dataset:
技術検証がうまくいかないときに心がけていること

## はじめに
この記事は [SAP Advent Calendar 2021](https://adventar.org/calendars/6252) の12月4日分の記事として執筆しています。

私が最初にQiitaの記事を書いたのが[2018年の11月](https://qiita.com/tami/items/05014dd40577cc92ccca)でした。そこから3年ちょっと、興味の向くまま、あるいは仕事として様々な技術検証をしてきました。技術検証は最初からうまくいくことは稀で、「うまくいかないこと」が多くあります。この記事では、技術検証がうまくいかないときに自分がどのように対処してきたか、振り返ってみることにします。

## 技術検証がうまくいかないときに心がけていること
1. 「何が起きているか？」にまず注目する
1. エラーは出て当たり前と考える
1. うまくいっているパターンを探す
1. 最小限でやってみる
1. 標準で同じことが起きていないか確認する
1. 技術を一段深く理解する
1. 派生問題にどう対処するか
1. 時間をおいてみる
1. コミュニティに問い合わせる
1. 「できない」とわかったことも収穫と考える

### 1. 「何が起きているか？」にまず注目する
問題が起きたとき、「どうしたら直せるか？」とあなたは考えるかもしれません。でもちょっと待って。解決したい気持ちを脇に置いておいて、冷静にまずは何が起きているか調べてみましょう。
私がよく使うトラブルシューティングのステップは、①何が起きているかを把握する、②なぜ起きているかを把握する、③どうやって直すかを考える、です。①のステップにいるときは、他のことを考える必要はありません。探偵になったつもりで起きている事象を追ってみましょう。経験上、何が起きているのか、なぜ起きているのかの順に導き出した対応は、事象の正確な理解に基づいているため、根本解決につながる場合が多いです。

### 2. エラーは出て当たり前と考える
検証は最初からうまくはいきません。エラーが出るのが普通です。エラーが出たら「よっしゃ」と前に乗り出して原因調査します。エラーメッセージで検索すれば、[Stack Overflow](https://stackoverflow.com/)やSAP Communityの[Answers](https://answers.sap.com/index.html)などで同じ問題が見つかるかもしれません。ソースに手を加えて、また別のエラーが出たとなれば一歩前進なので喜びます。

### 3. うまくいっているパターンを探す
検証していると、以下のようなケースがあります。

- あるデータではうまくいくのに、別のデータではうまくいかない
- サンプルソース（例えば、誰かのGitリポジトリ）ではうまくいっているのに、自分のソースではうまくいかない

うまくいっているパターンがあればしめたものです。うまくいっているパターンといっていないパターンでは何が違うのか、色々な角度から調べてみます。動くサンプルがあれば、動かしてみたり、デバッグしたりしてみます。

### 4. 最小限でやってみる
ソースコードが複雑になると、問題の原因を探すのが大変です。そんなときは、検証したいことに絞った最小限の部分を切り出して、そこを集中的に調べてみます。問い合わせすることになったときも、「最小限の動くもの」があるとサンプルとして提示できるので便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/03a0ca05-001f-0ae5-a2df-74f1c14a3c14.png)


### 5. 標準で同じことが起きていないか確認する
これはSAP特有ですが、標準のアプリやプログラムでも同じ問題が起きているか確認してみます。できればこれは早い段階でやったほうがよいでしょう。標準でも同じ問題が起きていれば、インシデント登録すれば直してもらえる可能性があります。あるいは、すでにノートが出ている場合もあるでしょう。
標準では起きていないとすると、自分の実装に問題があるということで、標準を「うまくいっているパターン」として使うことができます。

### 6. 技術を一段深く理解する
うまくいかないとき、その技術に対する自分の理解が足りていないかもしれません。裏を返せば、これは対象を一段深く理解するチャンスです。ドキュメントをしっかり読み込んだり、デバッグで変数の中身を確認したり、さらにはわかったことをアウトプットすることで自分を理解のレベルを上げることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/fdf944fd-2384-9033-824d-631d90b505ed.png)

### 7. 派生問題にどう対処するか
検証をしていると、もともとの問題のほかに別の問題も出てきて、なんとなくそちらを調べてしまうことがあります。私は個人的な検証のときはこれを許容していますが、ゴールに対する現在の位置は意識しておくようにします。派生問題が解決したら元のルートに戻れるように、以下のようなイメージを頭に置いています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/ffd7050e-7bed-4103-351a-9399753b7461.png)

### 8. 時間をおいてみる
問題を解決しようとするあまり視野が狭くなり、うまくいかないとわかっていても同じことを繰り返してしまうことがあります。そんなときは時間を置くことが有効です。一旦モニターから目を離して別のことをするのもよいですし、一晩おくと解決策が見つかることもよくあります。

### 9. コミュニティに問い合わせる
私が最後の手段として頼りにしているのがSAP Communityです。ここにはトピックごとのエキスパートが日々巡回しており、解決できる問題であれば誰かが回答してくれます。自分が奮闘している間に他のエキスパートの頭脳を借りられるというのは心強いものです。ここで回答がもらえなければ、今の限界だと諦めがつきます。

### 10. 「できない」とわかったことも収穫と考える
どれだけ調べても、問い合わせても解決しないこともあります。本当にできないのか、自分の技術の限界なのかはわかりませんが、現時点でできること、できないことが明確になったのは収穫であると考えます。なお、できなかったことをブログに書くとエキスパートの助言をもらえる場合もあります。
IntelliJ個人的初期設定

#はじめに
これは私がWinでIntelliJを導入するときに
何を設定したかの備忘録てきな記事です。

##日本語化
プラグインから"Japanese"と検索、日本語化パックをいれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309827/d66ba7a8-f127-f88a-19db-834cdb1972c8.png)
↑これ

##フォント設定
設定からエディタ->フォント->でHackGen35Nerd Consoleを選択。
サイズは14。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309827/8edd0e9e-65f8-c5be-13ef-829d47763d55.png)
こんな感じ

##エディタのメモリサイズ設定
ヘルプ->カスタムVMオプションの編集
-Xms1024m
-Xmx4096m
とりあえずXmsとXmxをこれくらいに設定
##マウスコントロールで拡大縮小
エディタ->一般
マウスコントロールにチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309827/46728d6f-8b80-20dc-69fa-9232095f922b.png)

##ターミナルショートカット
Ctrl + j　に設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309827/68912300-48e0-f2d1-a6c7-a39d03f3e9ce.png)

##Idea Vimの導入
プラグインからIdea Vimを入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309827/f6998652-8124-ae54-4703-27fd7268ecee.png)
ついでに%HOMEPATH%の下に_ideavimrcファイルを作り、
```imap <j><j> <Esc>```
を記述する。
Escのかわりにjを2回打つことで対応させることで、インサートモードからノーマルモードへの移行を楽にする。

##次の候補を選択する（画像はMac）
Ctrl + nで次の候補を選択するキーマップを設定。
デフォルトだと↓（カーソルキー）でしかできないため便利
設定項目は「下」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309827/5085dc5f-7105-c591-561d-3a7a60c7307f.png)

##ステートメント補完の設定
ステートメント補完（超便利補完）
をShift + Enterに切り替える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309827/714749ef-d094-bbbe-0010-67ef95811f9b.png)

##ファイルをワンクリックで開く
プロジェクト（画面左）の歯車マークからシングルクリックでファイルを開くにチェックを入れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309827/b92b0a23-da58-d28f-ebd4-e110e4374f2e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309827/13eba568-e127-a92e-4cdf-eec767ceedf5.png)

##一行に表示する文字数
次でハードラップを80列に変更
（リーダブルコードで推奨されている列数）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309827/90160acd-9fae-5615-46dc-936fb9cd96c2.png)

画面の幅に合わせて行を折り返しにする設定もする。
上2つのチェックと、使うファイルの拡張子の設定も忘れずに。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309827/f1ed166a-87c1-0533-8ba7-e02f3b9fb5be.png)

##コンテキスト編集の設定変更
コード生成のoption+enterを削除
新規のcontrol+enterも削除
-> コンテキストアクションの表示にcontrol+enterを追加する。
（クイックフィックス等に使う）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309827/c01a5adc-28a5-88e6-356f-0ae5469a6f84.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309827/d37f042b-a212-cac8-2274-befb0f47c0b5.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309827/5f65dd83-df4b-898c-baba-54d9fed63636.png)
Elastic Beanstalk Amazon Linux 2 Docker プラットフォームに移行した際に変更した箇所

Elastic Beanstalkで使用していたAmazon Linux AMI ベースの Docker プラットフォームがリタイヤ予定になっていたので、Amazon Linux 2 Docker プラットフォームへ移行しました。その移行作業で変更した箇所をメモ。

↓対象の環境はざっくりこんな感じ

- 起動するDockerコンテナは1つ
- ローカルCLIからeb deploy
- デプロイ時にEBがDockerfileを参照してカスタムイメージをビルド
- EC2インスタンス2台 ALBで冗長化
- WebフレームワークはRails 5系

## 変更点

### 1. Dockerrun.aws.jsonを追加

```json:Dockerrun.aws.json
{
  "AWSEBDockerrunVersion": "1",
  "Ports": [
    {
      "ContainerPort": "3000"
    }
  ]
}
```

移行前はソースバンドル（デプロイに使用するzipファイル）に含まれたDockerfileを自動で読み込んでビルドしてくれたのですが、Linux 2になってからはdocker run用のAWS独自フォーマットのファイルが必要になりました。
`AWSEBDockerrunVersion`はDocker Composeを使用しないので1、`ContainerPort`はDockerfileの`EXPOSE`と合わせています。

ちなみにdocker-compose.ymlが含まれていると、Dockerrun.aws.jsonを無視してdocker composeとして起動してしまうので注意が必要です。

### 2. .ebextensionsで設定していたnginx設定を.platform/nginxに移動
`.platform/nginx/nginx.conf` など

デプロイ時に拡張したい設定をまとめておける.ebextensionsにnginxの設定を記載していたのですが、移行後はうまくnginxの設定ファイルに展開できなくなりました。
そのため移行に伴い、EBで用意しているnginx設定を展開してくれるディレクトリを用意。.patform/nginx以下に上書きや追加したいファイルを配置するとデプロイ時に自動でインスタンスに展開してくれます。
例）.platform/nginx/nginx.conf →  /etc/nginx/nginx.conf

### 3. timezoneの設定方法をtimedatectlに変更

```bash
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
↓
timedatectl set-timezone Asia/Tokyo
```

Amazon Linux 2はCentOS7ベースと言われているのでタイムゾーン設定をtimedatectlで行うよう変更。
ちなみにAmazon Linux AMIの方はCentOS6ベースと言われています。

### 4. eb deploy時の不要なファイルを記載するファイルの名前を変更
`.gitattributes` → `.ebignore`

eb deploy時に作成されるソースバンドルに含めないファイルを記載するファイル名を変更。.gitignore的なやつですね


### 5. おまけ）EBデプロイ時のログファイル名が変更
`/var/log/eb-activity.log` → `/var/log/eb-engine.log`

## まとめ
移行自体はブルーグリーンデプロイで行っていますが、そちらはEBの`環境 URL`のスワップを使用したらほぼワンクリックで行うことができました。
今更ながらAmazon Linux 2への移行を行いましたが、こういった作業が初めてだったため良い勉強になりました。特に公式ドキュメントを読み込むことの大切さを学べた気がします。

## 参考

- [Elastic Beanstalk Linux アプリケーションを Amazon Linux 2 に移行する - AWS Elastic Beanstalk](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/using-features.migration-al.html)
- [Docker プラットフォームの使用 - AWS Elastic Beanstalk](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/docker.html)
- [Docker の設定 - AWS Elastic Beanstalk](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/single-container-docker-configuration.html)
- [Elastic Beanstalk Linux プラットフォームの拡張 - AWS Elastic Beanstalk](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/platforms-linux-extend.html)
- [Elastic Beanstalk で Amazon Linux AMI とAmazon Linux 2 の違い - Qiita](https://qiita.com/oppara/items/86b92231d6665baed1aa)
- [ElasticBeanstalkでAmazonLinux2 Ruby環境にデプロイする - bagelee（ベーグリー）](https://bagelee.com/programming/ruby-on-rails/eb-amazonlinux2-ruby/)
シンプルな動画 decoder/encoder in C++ のメモ

サーバーでの機械学習とかレイトレとかで, プレビューや中間の結果などを動画にしたい(連番画像を lossy 圧縮した感じでよい). サーバー上で作りたい. なるべくポータブルにやりたい.

ffmpeg とかめんどい(あと特殊なアーキテクチャのマシンで動かしているとかで ffmpeg とか動かない/コンパイルできないなど)

gif だとファイルサイズ大きいし...

mpeg などを考えます.

## mpeg1

### encode

jp_mpeg があります

https://www.jonolick.com/home/mpeg-video-writer

### decode

https://github.com/phoboslab/pl_mpeg

## AVI

https://github.com/rolinh/libgwavi

## h.264

https://github.com/lieff/minih264
https://www.cardinalpeak.com/blog/worlds-smallest-h-264-encoder

## TODO

* [ ] ogg 系とか webm 系を探してみる.
【Angular】ngx-translateの落とし穴

# はじめに
本記事はAngular Advent Calendar 2021の5日目の記事になります。
翻訳ライブラリのngx-translateについてハマった点について記載します。
クオリティは期待しないでください。

去年書こうと考えていましたが、その月は350時間越えで書けなかったため
今書きます。。。

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# ngx-translateとは
冒頭にも記載してある通り翻訳してくれるライブラリになります。
Angularとしては、もともとi18n機能はありますが、
ビルドして切り替えたり、辞書ファイルの設定が複雑なため
正直好きではないです。

ngx-translateは、jsonファイルで定義する形となるため
以下の点が優れています。

・保守性
・設定の安易さ
・jsonエディタとの連携

<a id="#Chapter2"></a>
# Angularとのバージョンについて
最新のバージョンまでサポートしていますが、
Angularのバージョンを13に上げる際は、ngx-translateのバージョンも14へ上げる必要があります。
詳細は参考文献のngx-translate-coreにて確認すること。

<a id="#Chapter3"></a>
# 設定について
```言語名:ja.json
{
    "qiita": {
        "title": "キータ",
        "title2": "キータ{{test}}"
    }
}
```

```言語名:test.html
<!-- 設定方法1-->
<span>{{'qiita.title' | translate}}</span>

<!-- 設定方法2-->
<span [translate]="'qiita.title'"></span>

<!-- プレースホルダに設定する場合 -->
<input type="text" placeholder="{{'qiita.title' | translate}}"/>

<!-- パラメータが存在する場合-->
<span 
 [translate]="'qiita.title2'"
 [translateParam]="{test: 'aaaa'}"></span>
```
<a id="#Chapter4"></a>
# 落とし穴
下記のようにtestパラメータに値を入れている場合は正常に表示されますが、
変数をバインドしている際にその変数がnullやundefinedの場合、
キータ{{test}}のようにそのまま出てしまうため注意が必要

```言語名:test.html
<!-- 落とし穴1-->
<span 
 [translate]="'qiita.title2'"
 [translateParam]="{test: 'aaaa'}"></span>
```

2つ目の落とし穴です。
2番目のspanタグの場合、改行が入るため1番目と差異が出てしまいます。
残念ながらTrimはしてくれません。
この影響でデザイン崩れが発生し過去の案件でダメージを受けました。。
解消方法は[translate]を利用するか、改行前に{{で始める必要があります。
正直可読性を考慮すると2番目で書きたいのが本音ではあります。
解消方法知っている人がいたら教えてください。

```言語名:test.html
<!-- 落とし穴2-->
<span>{{'qiita.title' | translate}}</span>
<span>
  {{'qiita.title' | translate}}
</span>
```

<a id="#reference"></a>
# 参考文献
- [ngx-translate-core](https://github.com/ngx-translate/core)
負荷テストツールgatling環境構築

【環境】

- PC:Mac
- OS:Mac OS Bigsur

【gatlingの導入から起動】

```
$ brew install wget
$ wget https://repo1.maven.org/maven2/io/gatling/highcharts/gatling-charts-highcharts-bundle/3.7.2/gatling-charts-highcharts-bundle-3.7.2-bundle.zip
$ unzip gatling-charts-highcharts-bundle-3.7.2-bundle.zip
$ cd gatling-charts-highcharts-bundle-3.7.2
$ bin/recorder.sh
```

画面が表示されたら成功

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313771/19319d8d-d70c-7362-b8be-704314cc1c90.png)



参考記事
---

- [負荷テストツールGatlingを触ってみた](https://yudoufu.hatenablog.jp/entry/2015/06/13/171030)
AtCoder超初心者によるABC230のまとめ A～C (Python)

# ABC230

https://atcoder.jp/contests/abc230

# A問題

https://atcoder.jp/contests/abc230/tasks/abc230_a

## 問題のイメージ

**型変換**を適切に行い、**文字列を連結**すれば解けます。

特定の文字列と標準入力の文字列を連結して出力します。

「コンテストの中止による欠番」をif文で判定し、標準入力の値を置き換える必要があります。

## コード化

```python
# 標準入力をint型で受け取る
n = int(input())

# 欠番以降は回数を1増やす
if n >= 42:
  n += 1

# 回数を3桁で揃えたときに足りない分だけ前に0を追加
# 左辺のnは文字列になる
n = "0" * (3 - len(str(n))) + str(n)

# 結合して出力
print("AGC" + n)
```

## バグポイント

- nを1増やすとき、nは `int(n)` でint型にしましょう。

- nの文字数を `len()` で数えるときは `str(n)` でstr型にしましょう。

- 連結の際はstr型に揃えて行いましょう。

- `print("AGC", n)` とすると、出力結果にスペースが入ってしまうので、`+` を用いて文字列を連結するようにしましょう。


# B問題

https://atcoder.jp/contests/abc230/tasks/abc230_b

## 問題のイメージ

標準入力の文字列Sが、決められた文字列Tを切り抜いた文字列になっているか判定します。

制約に「S の長さは 1 以上 10 以下である。」とあり、比較的短いことがポイントだと思います。

「文字列 T を oxx を 10^5 個結合した文字列として定めます。」
なんて書いてありますが、実際はTがそんなに長い必要はないということです。

つまり、**Tの短いバージョンを準備**してしまえばいいと考えました。

あとは `if S in T` のようにして、SがTに含まれるか判定します。

## コード化

```python
# 標準入力で文字列を受け取る
s = input()

# Tの短いバージョンを準備
t = "oxx" * 4

# SがTに含まれるか判定
if s in t:
    print("Yes")
else:
    print("No")
```

## 解説

- `"oxx" * 4` で文字列の反復を作れます。→ `oxxoxxoxxoxx`

- Sは最大10文字で、以下の3通りとも `oxxoxxoxxoxx` の一部になっていることが分かります。つまり、Tは12文字だけ準備すれば十分だということです。

    - `oxxoxxoxxo`
    - `xxoxxoxxox`
    - `xoxxoxxoxx`


# C問題

https://atcoder.jp/contests/abc230/tasks/abc230_c

## 問題のイメージ

一見、不等式が並んでいてどんな状況なのか理解するのが難しい問題です。

私も状況理解に苦戦しました。

しかし、出力例1を見ると少しずつ理解できると思います。

```text:出力例1
...#.
#.#..
.#...
#.#..
...#.
```

ポイントは3行2列めを中心に、**斜めに黒く塗りつぶされている**ことです。

(A, B) = (3, 2) というふうに、**黒の塗りつぶしが交差する場所**を指定していることが分かります。

左上から右下に塗りつぶすのが「(A+k,B+k) を黒く塗る」という操作で、右上から左下に塗りつぶすのが「(A+k,B−k) を黒く塗る」という操作にあたるわけです。

出力は**P行目からQ行目**、**R列目からS列目**までの範囲であることも注意が必要です。

N×Nのマス全体を再現した上で、指定された範囲を出力するというのは、実行時間的に現実的ではないと考えました。

そこで、**指定された範囲の各マスが黒く塗りつぶすべきマスかどうかを判定**するという仕組みで実装しました。

## コード化

```python
# N, A, Bをint型で受け取る
n, a, b = map(int, input().split())

# P, Q, R, Sをint型で受け取る
p, q, r, s = map(int, input().split())

# 出力に必要な大きさのマスを、白く塗った状態で準備する
sq = [["."] * (s - r + 1) for _ in range(q - p + 1)]

# 必要なマスを黒く塗りつぶしていく
for i in range(q - p + 1):
    for j in range(s - r + 1):

        # 中心から、傾き-1で移動した地点、または傾き1で移動した地点なら……
        if (((i + p - 1) - (a - 1)) == ((j + r - 1) - (b - 1))) or (((i + p - 1) - (a - 1)) == ((b - 1) - (j + r - 1))):
            # 黒く塗りつぶす
            sq[i][j] = "#"

    # i行目をlist形式から文字列に結合して表示
    print("".join(sq[i]))
```

## 解説

- `sq = [["."] * (s - r + 1) for _ in range(q - p + 1)]` は、リスト内包表記を用いています。`["."] * (s - r + 1)` で一般項を書き、`for _ in range(q - p + 1)` で繰り返すイメージです。

- 行方向と列方向の2つがあるのでfor文の入れ子を用いています。1行目のj文字を1文字ずつif文で確認し、2行目、3行目……とi行分繰り返すというイメージです。

## バグポイント

- 入力はすべて1から始まる整数で与えられます。つまり、例えば人間がイメージするA行目はコンピュータで言う**(A-1)行目**であることに注意しなければなりません。

- **j列目**（j文字目）を見ているのか、**i行目**を見ているのか、混同しないように注意しましょう。


# まとめ

アドバイスがあれば、ぜひコメントをお願いします。
次回のAtCoderも頑張りましょう。

# 参考

https://qiita.com/jamjamjam/items/e066b8c7bc85487c0785

https://note.nkmk.me/python-list-initialize/
【Unity】オブジェクトを複製したときにスペース「 (1)」などがつくのを変更する

# はじめに

unityでシーン上のオブジェクトをコピーすると末尾に` (1)`が付きますが、Fbx Exporterで書き出すとDCCツール側では`__1_`みたいに変換されてしまって面倒なことがあったので知り合いに聞くと複製時の末尾を変更できるみたいなのでやってみました。


# デフォルト

`Image`を複製すると`Image (1)`になる

![Unity_zy49ziBAK1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175167/56f21b04-7c3a-570c-220d-0b03db9168be.png)

# 変更する

メニューから
Edit>ProjectSettingsを開きEditorタブを選択

![Unity_xku9wIqOFo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175167/2faa63a1-3ac7-9669-5950-79fa50870ceb.png)


# 複製時のパターンを設定

### 今回は「_01」みたいにしたかったので`Prefab_1`を選択

![Unity_nHRomYyWPm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175167/7ff99c91-259a-8b4e-a201-6f60279ed5b6.png)

### 01にする

![Unity_TzQOJB3k8H.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175167/ccaa9c74-ed77-c24a-9913-2abe1bf9ca82.png)


# 複製してみる

Imageを複製したらImage_01になりました。

![Unity_aSRHLr0hJF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175167/b70c0354-890b-4d0c-fa85-02081a76ee49.png)

# おわりに

結構昔からゲームを作っていると名前にスペースが付くのにすごく違和感を感じていましたがこれで安心です。
正直気にしなくてもいいかもですが・・・
micro:bit V2 の MicroPython サポート状況(Advent Calendar 2021版)

Advent Calendar 2020では、[この記事](https://qiita.com/inachi/items/c86a07818e717b3d8836)と[この記事](https://qiita.com/inachi/items/a591707ab6bbcb1a467c)で、出たばかりのV2のMicroPythonサポート状況を beta-3 までお伝えしましたが、その後１年たってどうなっているかをレポートします。

# リリース状況

2021年7月1日にバージョン 2.0.0 (MicroPython 1.15ベース)がリリースされました。
標準の[Pythonエディタ](https://python.microbit.org/v/2)で利用できます。

![スクリーンショット 2021-12-04 11.27.35.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/3b437511-c623-8f7e-8f1d-abe86a51ca89.jpeg)

beta-3 からの変更は以下のとおりで、あまり変わってはいません。

* uerrno モジュールのサポート
* イースターエッグ this, love, antigravity モジュールのサポート
* 音声合成の音質改善(といっても大したものではない)
* BLE によるファームウェア転送
* CODAL バージョンのアップデート
* その他細かい修正

その後も更新は続いていて、[新しいPythonエディタのαリリース](https://python.microbit.org/v/alpha)では最新の 2021-10-25 版が使えます。

![スクリーンショット 2021-12-04 11.32.17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/97575113-5e01-6bb1-5880-c34d02560276.jpeg)

2.0.0正式リリース版からの変更は以下のとおりです。

* log モジュールのサポート
* microbit.run_every 関数追加
* Image.SCISSORS 追加
* accelerometer.get_strength() メソッド追加
* accelerometer.set_range() メソッド追加
* CODAL バージョンのアップデート
* その他細かい修正

※追加のモジュールや関数については、(余裕あれば)Advent Calendar 2021に書きます。

# ドキュメント

[公式ドキュメント](https://microbit-micropython.readthedocs.io)にアクセスすると [latest版](https://microbit-micropython.readthedocs.io/en/latest/) ではなく、V2に対応した [v2-docs版](https://microbit-micropython.readthedocs.io/en/v2-docs/) にリダイレクトされます。残念ながら [Tutorial](https://microbit-micropython.readthedocs.io/en/v2-docs/tutorials/introduction.html) はまだ V2 の追加機能に対応していません。

[v2-docs 版の日本語訳](https://microbit-micropython.readthedocs.io/ja/v2-docs/index.html)も既に用意しました。

# mu エディタ

2021年12月4日時点で、[muエディタ](https://codewith.mu/) の最新版は1.1.0-beta-6で、V2に対応しています。[ダウンロード画面](https://codewith.mu/en/download)でもこのV2に対応したものがダウンロード可能です。

[最新の日本語化poファイル](https://github.com/mu-editor/mu/pull/1385)をプルリクしてありますが、まだ取り込まれていません。正式版リリースまでには取り込まれるのではないかと思います。
Spring BootでJSONを整形してログ出力する

# はじめに
Spring Bootを用いたREST APIの動作確認でリクエスト・レスポンスのJSONを整形した状態でログ出力したくなった。
logback.xmlの設定でログ全体をJSONとして整形・出力する方法はすぐに見つかったが、パラメータのJSONのみ整形する方法になかなか辿り着けなかったためメモ。
# サンプルプロジェクト  
- [spring initializer](https://start.spring.io/#!type=maven-project&language=java&platformVersion=2.6.1&packaging=jar&jvmVersion=11&groupId=com.example&artifactId=demo&name=demo&description=Demo%20project%20for%20Spring%20Boot&packageName=com.example.demo&dependencies=web,lombok)で作成。  
- Spring Boot : 2.6.1  
- spring-boot-starter-web, lombok　を使用  

# 解決策  
ObjectMapperのインスタンス生成時に`SerializationFeature.INDENT_OUTPUT`を設定し、オブジェクトをJSONに変換する。

# 実装
動作確認したサンプルを以下に記載します。

### モデルクラス

```java:TestModel.java
package com.example.demo;

import lombok.Data;

@Data
public class TestModel {

    private int id;
    private String name;
    private int age;
}

```

### コントローラ
```java:Controller.java
package com.example.demo;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

import lombok.extern.slf4j.Slf4j;

@RestController
@RequestMapping("/test")
@Slf4j
public class Controller {

    @GetMapping("/prettyjson")
    @ResponseStatus(HttpStatus.OK)
    public String prettyjson() {

        TestModel model = new TestModel();
        model.setId(1);
        model.setName("Ken");
        model.setAge(20);

        // インスタンス生成時に SerializationFeature.INDENT_OUTPUT を設定することで整形される
        ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);

        String json = "";

        try {
            json = mapper.writeValueAsString(model);
            log.info(json);
        } catch (JsonProcessingException e) {
            log.error(e.getMessage());
        }
        return json;
    }
}
```

# 動作確認
curlでリクエストを投げてみる。

```sh
curl localhost:8080/test/prettyjson
```
### 出力結果（curl）

```sh
{
  "id" : 1,
  "name" : "Ken",
  "age" : 20
}
```

### 出力結果（ログ）
```log
2021-12-04 18:06:40.208  INFO 21036 --- [io-8080-exec-1] com.example.demo.Controller              : {
  "id" : 1,
  "name" : "Ken",
  "age" : 20
}
```
期待通りの結果が得られました！

# おわりに
REST APIの開発は今回が初めてだったんですが、JSONの整形出力ってpretty-printと言うんですね。。。
はじめて知りました(笑)
検索ワードで pretty print を使っていればもっと早く参考資料にたどり着けたはず。

# 参考資料
[ちょっとしたTips集 - JSONを PrettyPrint で出力する設定](https://zenn.dev/sugaryo/books/spring-boot-run-up/viewer/tips#%E2%96%A0json%E3%82%92-prettyprint-%E3%81%A7%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B%E8%A8%AD%E5%AE%9A)
[npsocket] 画像のような大規模データを容易にpython通信処理する

#はじめに．socket通信とは？
「TCP/IPのソケット通信」を簡単にする手法を紹介します．
そもそもsocket通信とは，主にプログラム部とTCP/IP部をつなぐ特別な出入り口のことを意味し，TCP/IPのトランスポート層を指す．まあ単純にいうと，同じネットワーク下にある複数のパソコンのデータの共有をする手法です．

ちなみに私は大学院時代にAIロボット系のことをやっていたのですが、その時使用していたロボットのメモリが少なすぎたか私の技量が足りなすぎたか（笑）で，tensorflowの環境をロボット付属のメモリに格納できませんでした．そこでロボットのPCと高性能PCをEthernetハブで通信接続することで，画像とロボット情報の処理を送受信できるようにすることを試みました．その時に使用したのがsocket通信であり，それを**python(numpy)**で容易にしたのが**npsocket**というモジュールです．gitに天才様が作ってくださったこれがなければ私は卒業できませんでした笑

とりあえず
[今回紹介：npsocketのURL]
https://github.com/ekbanasolutions/numpy-using-socket
[参考：socket通信の正しい使い方]
https://qiita.com/nadechin/items/28fc8970d93dbf16e81b

#インストール
1. git cloneする．

    ```python
    git clone https://github.com/ekbanasolutions/numpy-using-socket.git
    ```

1. クローンしたディレクトリに入る．

    ```
    cd numpy-using-socket-master
    ```

1. python実行してモジュールをインストール．

    ```
    python setup.py
    ```

1. インストール確認

    ```
    >>> import npsocket
    >>> from npsocket import SocketNumpyArray
    >>> exit() 
    ```

#使用方法
送信と受信でそれぞれ二種類のコードを用意します．
ちなみに以下のコードは「画像をファイルから読み送信⇒受信して表示」を繰り返します．

```python:receiver.py
# -*- coding:utf-8
#!/usr/bin/env python
from npsocket import SocketNumpyArray

#ソケット通信の準備とportの設定
sock_receiver = SocketNumpyArray()
sock_receiver.initalize_receiver(8888)
 
while True:
    #データ受信
    frame = sock_receiver.receive_array() 
    #画像表示
    cv2.imshow('frame', frame)
    cv2.waitKey(1)
```

```python:sender.py
# -*- coding:utf-8
#!/usr/bin/env python
from npsocket import SocketNumpyArray
import cv2

#ソケット通信の準備とip/portの設定
sock_sender = SocketNumpyArray()
sock_sender.initialize_sender('[receiver.pyを実行している機器のIPアドレス]', 8888)

while True:
    #画像の準備⇒numpy変換
    img = cv2.imread('[画像ファイル]')
    frame = cv2.resize(frame, (128, 128))

    #画像データ送信
    sock_sender.send_numpy_array(frame)
```

**注意**
- 送受信でポートの番号を必ずそろえる
- 送信側はIPアドレスを間違えないようにする
- データの送受信は複数回可能だが，必ず回数を合わせる．しないと片方がずっと待ち続けて動かなくなる．

**応用**
A.pyとB.pyがあるとして以下のフローをすることも可能です．
A -> B　: 画像データをBへ送信
B内     : 画像処理
B -> A  : 処理済み画像データをAへ送信
このようにしたい場合は，以下のように書きます（色々省略）

```python:A.py
#
# 省略（他のインポートなど）
#

sock_sender.initialize_sender('[B.pyの機器のIPアドレス]', 8888)
sock_receiver.initalize_receiver(7777)

#　
# 省略（処理，画像取得など）
#

# 送信
sock_sender.send_numpy_array(frame)

# 受信（待機）
frame = sock_receiver.receive_array() 
```

```python:B.py
#
# 省略（他のインポートなど）
#

sock_receiver.initalize_receiver(8888)
sock_sender.initialize_sender('[[A.pyの機器のIPアドレス]', 7777)

#　
# 省略（処理）
#

# 受信
frame = sock_receiver.receive_array() 

#
# 画像処理など
#

# 送信
sock_sender.send_numpy_array(frame)
```


以上です．
bootsnapの「wrong argument type false (expected Symbol) (TypeError)」エラーで「bundle exec」コマンドが使えない場合の対処法

## 背景

自分は普段、Github Actions で CI/CD 環境を作る事が多いのですが、つい先日、新たなコミットを push してビルドおよびテストを実行した結果、なぜか途中でコケるようになってしまいました。

具体的に言うと、「bundle exec」コマンドを使おうとするタイミングで

`to_binary': wrong argument type false (expected Symbol) (TypeError)`

エラーが発生するようになってしまった感じです。

```
▶︎ Run bundle exec rails db:create
  bundle exec rails db:create
  bundle exec rails db:migrate
  shell: sh -e {0}
/__w/myapp/vendor/bundle/ruby/3.0.0/gems/bootsnap-1.9.1/lib/bootsnap/compile_cache/iseq.rb:13:in `to_binary': wrong argument type false (expected Symbol) (TypeError)
	from /__w/myapp/myapp/vendor/bundle/ruby/3.0.0/gems/bootsnap-1.9.1/lib/bootsnap/compile_cache/iseq.rb:13:in `input_to_storage'
	from /__w/myapp/myapp/vendor/bundle/ruby/3.0.0/gems/bootsnap-1.9.1/lib/bootsnap/compile_cache/iseq.rb:30:in `fetch'
```


ごくわずかな修正（とあるページの文言を少し変更しただけ）でどう考えても Github Actions のワークフローに影響を与え得るようなものではなかったのと、そもそもローカル環境では問題無く動いているように見えたため、解消にだいぶ手こずりました。

今回はその際のメモという事で残しておきます。

## 環境

- Ruby 3.0.3
- Rails 6.1.4.1
- bootsnap 1.9.1
- Github Actions

## 原因

先に結論から言ってしまうと、どうやらRubyのバージョンが影響していたみたいです。

https://www.ruby-lang.org/en/news/2021/11/24/ruby-3-0-3-released/

https://github.com/Shopify/bootsnap/pull/380

https://github.com/Shopify/bootsnap/issues/378

少し前に Ruby 3.0.3 がリリースされたようなのですが、ちょうどそのタイミングで bootsnap のリポジトリにて不具合に関する報告が挙げられています。

なので、自分が何か直接マズい変更を加えたというよりは、外部ライブラリによる影響だったというわけですね。


該当のissue内で

`「Updating to 1.9.3 helped us with this issue. Thanks!」`

とあるように、この問題については

```
$ bundle update bootsnap
```

などのコマンドで bootsnap のバージョンを上げると解決できるようなので、素直に従ったところ無事解決しました。


なお、冒頭で「ローカル環境では問題無く動いているのに Github Actions のワークフロー内ではなぜかコケる」といった旨の発言をしていましたが、これはローカル環境では

```:.ruby-version
ruby-3.0.1
```

と Ruby をパッチバージョンまで明確に固定しているのに対し、Github Actions のワークフロー内では

```yml:./.github/workflows/ci.yml
jobs:
  test:
    container:
      image: ruby:3.0
```

といった具合にマイナーバージョンまでの指定に留めてやや曖昧にしていたのが理由と思われます。

ローカル環境では 3.0.1 で動いている一方、 Github Actions  のワークフロー内では問題の 3.0.3 で動いてしまっており厳密には実行環境が揃っていないという感じですね。

この辺を自分は甘く考えていたため、今後はより実行環境の統一を心がけていこうという教訓になりました。

## まとめ

- Ruby 3.0.3 以降は bootsnap のバージョンを上げる必要がある
- 実行環境は極力統一を心がける
【Github】ライブラリの選び方

##その1：Star数を見るべし
Githubの右上のStarが**1000以上(1k)**だとメジャー。
なるべくStarが多いほうが安心して使える。

![スクリーンショット 2021-12-04 18.51.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1990648/44c817af-dab3-4582-d887-84667635ed62.png)


##その2：コミットの履歴を見るべし
最近コミットされているかを確認。
少なくとも1年以内にコミットされているとよくメンテされているライブラリ。

![スクリーンショット 2021-12-04 18.55.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1990648/db04ab15-b87c-2696-1892-b3e0268bd49c.png)
毎日誰かのプルリクを脳死でマージするアドベントカレンダーにReduxToolkit導入して今後の状態管理のしやすさを飛躍的に向上させた話

# 毎日誰かのプルリクを脳死でマージするアドベントカレンダー

- カレンダーはこちら

https://qiita.com/advent-calendar/2021/full-scratch-awesome-app-nextjs

- リポジトリはこちら

https://github.com/TeXmeijin/anyway-merge-app


こんなリレー形式での試みに参加するのは初めてです。

担当は12月5日の5日目。12月が31日あって5日なので、16%ぐらい…

人間で言うと、80年生きるとして12~13歳…

親(contributor)として12~13歳の子供(リポジトリ)になにをしてあげられるのか。


かの有名な孔子の言葉(論語・為政)にこんな言葉がある。

```
子曰く、
吾十有五にして学に志す、(十五歳のとき学問に志を立てた)
三十にして立つ、(その基礎ができて自立できるようになった)
四十にして惑わず、(心に迷うことがなくなった)
五十にして天命を知る、(天が自分に与えた使命が自覚できた)
六十にして耳順う、(人の言うことがなんでもすなおに理解できるようになった)
七十にして心の欲する所に従えども、矩を踰えず(自分のしたいと思うことをそのままやっても、
人の道を踏みはずすことがなくなった)
```

まだ学問さえ志してないこの子(リポジトリ)に親(contributor)ができることは、
今後、人生の中で苦難に陥った時もその苦難を平然と乗り越えれる体を作ってあげたい。

そんな気持ちを込めて、Next.jsリポジトリにReduxToolkitを組み込みました。

- こちらプルリクエスト

https://github.com/TeXmeijin/anyway-merge-app/pull/12


このアドベントカレンダーが終了し、成長した我が子がReduxToolkitを使用しているかわかりませんが、
親の愛情として組み込んでおきます。

明日は@yokinistさん、我々の子供をよろしくお願いします。

# 最後に
会ったことも、話したことない人ともこうやって一緒にチーム開発できるなんて、非常に有意義な時間でした。
こんな楽しい試みがもっとたくさんできたら、エンジニア人生がより幸せな時間を過ごせるなぁと思っています。
@mejileben さんありがとう。
おしゃれな試みでした。

ゆうじろうはプログラミングスクールやってるから、是非遊びにきてね。
https://proaca.tech
TailscaleネットワークではDocker Overlay Networkの暗号化が使えない

# Overlay networkの暗号化

Dockerにはoverlay networkと呼ばれる機能が実装されており、複数のDockerホスト上にあるコンテナを同一のネットワークに参加させることができます。Overlay network上の通信はデフォルトでは暗号化されていないのですが、ネットワークの作成時に`--opt encrypted`を付けることで暗号化を有効にすることができます。

https://docs.docker.com/network/overlay/#encrypt-traffic-on-an-overlay-network

```shell
docker network create --opt encrypted --driver overlay --attachable example-overlay-network
```

# Overlay networkに使われるプロトコル

Overlay network上のデータががホスト間でやりとりされる際に使われるIP protocolは暗号化の有無によって異なっており、暗号化が無効のときはUDP、有効のときはESP (IP protocol 50)が使われます。

https://docs.docker.com/engine/swarm/swarm-tutorial/#open-protocols-and-ports-between-the-hosts

残念ながらTailscaleが対応しているIP protocolはICMPv4, ICMPv6, TCP, UDP, SCTPのみで、ESPには対応していません。そのため、暗号化されたoverlay network上の通信は全てdropされてしまいます。

https://github.com/tailscale/tailscale/blob/v1.18.1/wgengine/filter/filter.go#L333-L445

# 解決策

見つかっていません。Overlay networkの暗号化を諦めるか、TailscaleをforkしてESP対応を追加するしかないのではないでしょうか。

そもそもTailscaleノード間の通信はWireguardで暗号化されているので、overlay networkの暗号化は多くのケースで不要ではないかと思われます。

# 謝辞

Tailscaleでサポートされているプロトコルについては、こちらの記事を参考にさせていただきました。

https://qiita.com/tinoue@github/items/ebcdf5423d87df0ad7cc
Nexus 6PにLineageOSをインストールする

# はじめに

使わなくなったGoogle Nexus 6Pがあるので、LineageOSをインストールして有効利用する。

# まずは情報収集

最初にチェックするのはみんな大好きxda-developersなのだ。
Huawei Nexus 6P
https://forum.xda-developers.com/c/huawei-nexus-6p.4744/

どのカスタムROMをインストールするか小一時間ほど悩む。
List of custom Android distributions
https://en.wikipedia.org/wiki/List_of_custom_Android_distributions

xda-developersのフォーラムでそれなりに盛り上がっているLineageOSをインストールすることにする。
LineageOS
https://github.com/LineageOS

# 作業の前に

**端末が壊れたり起動しなくなったり爆発したりしても、筆者は一切関知しない。**

Googleの端末は工場出荷時のイメージが公開されているので、うっかりブリックしても頑張れば復旧できるかも。
Factory Images for Nexus and Pixel Devices
https://developers.google.com/android/images

# 前準備

LineageOSをインストールする前に端末のBootLoaderをUnlockして、TWRP Recoveryをインストールする。

xda-developersに手順が綺麗にまとまっている。
[GUIDE] Unlock/Root/Flash for Nexus 6P
https://forum.xda-developers.com/t/guide-unlock-root-flash-for-nexus-6p.3206928/page-324

## PCにSDK Platform-Toolsをインストール

SDK Platform-Tools リリースノート
https://developer.android.com/studio/releases/platform-tools

OSがWindowsの場合、USBドライバも必要

Google USB ドライバを入手する
https://developer.android.com/studio/run/win-usb.html

尚、Android Studioを使用している場合、上記のツールは、[System Setting]→[Android SDK]→[SDK Tools]からインストールできる。

## 端末をUSBデバックモードにする

端末で以下の操作を行う。

1. [設定]→[システム]→[端末情報]を選択し、[ビルド番号]の項目を7回タップする。
1. [端末情報]の[開発者向けオプション]を選択し機能をONにする。
1. [開発者向けオプション]の[USBデバッグ]を有効にする。
1. [開発者向けオプション]の[OEMロック解除]を有効にする。 

## 端末のBoot LoaderをUnlockする

adbの動作確認

```bash
% adb version
Android Debug Bridge version 1.0.41
Version 31.0.3-7562133
Installed as /Users/hichon/Library/Android/sdk/platform-tools/adb
```

PCと端末をUSBケーブルで接続する。

端末が認識されていることを確認する。

```bash
% adb devices
* daemon not running; starting now at tcp:5037
* daemon started successfully
List of devices attached
ENU7N15AXXXXXXXX	unauthorized
```
→端末のシリアルNOが表示されれば成功

Boot Loaderを起動する。
端末の電源をOFFにし、電源ボタンと音量下ボタンを同時に押して電源をONにする。
または、以下のコマンドを実行する。

```bash
% adb reboot bootloader
```
→Boot Loaderが起動すれば成功

端末をUnlockする。

```bash
% fastboot flashing unlock
(bootloader) Please select 'YES' on screen if you want to continue...
→ここで端末の画面で'YES'を選択する
(bootloader) Unlocking bootloader...
(bootloader) Unlocked!
OKAY [  3.761s]
```

→端末の画面に「Device is UNLOCKED.」と表示されていれば成功

端末にTWRP Recorvryをインストールする。

```bash
% fastboot flash recovery twrp.img
Sending 'recovery' (18412 KB)                      OKAY [  0.639s]
Writing 'recovery'                                 OKAY [  0.275s]
Finished. Total time: 0.962s
```

TWRP Recorvryを起動する。

```bash
% fastboot boot twrp.img
Sending 'boot.img' (18412 KB)                      OKAY [  0.550s]
Booting                                            OKAY [  0.803s]
Finished. Total time: 1.369s
```

というわけで、ここまで来て疲れたので一旦休憩です。
(すいません)
【Git】cherry-pickで特定のコミットだけ取り込む

##cherry-pickコマンド
ブランチAとブランチBがあり、ブランチAの特定のコミットをブランチBに取り込みたいときに使う。

```ruby
#一つのコミットを取り込むとき
git cherry-pick [取り込むコミットID]

#複数のコミットを取り込むとき
git cherry-pick [コミットID(A)]..[コミットID(B)]
```


##おまけ
Github Desktopでもcherry-pickができるようになったらしい！

https://github.blog/jp/2021-04-09-github-desktop-now-supports-cherry-picking/
[備忘録]M1Max買ったのでセットアップについてまとめる

# M1Maxを買っちゃった

愛用していたMacBookAir2018が、3画面出力すると重すぎて耐えられないということでM1MaxのMacBookProを購入しました。
毎回、新しいPCを買ったときは引き継ぎせずに新しくセットアップしていく、というマイルールがあるので今回の設定についてを備忘録としてまとめてみることにしました

# まずはhomebrewを入れます

homebrewの公式ページからコピペしてくればいける

# caskでインストールするものを入れる

chrome, slack, karabiner-element, VSCodeを入れます。

あとはRicty diminishedも入れておきましょう。

# そのほか最初に必要なアプリ

mos, Rectangle, alfredなんかは別途でインストールしてきましょう

# zshのカスタマイズ

迷ったんですが、今回はzpreztoを入れてみることにしました。

https://qiita.com/devzooiiooz/items/a5f8fc33dee214f60f4e

この記事見ました。
Next.jsでClean ArchitectureとDDD

本記事は、[Uzabase Advent Calendar 2021](https://qiita.com/advent-calendar/2021/uzabase) 5日目の記事です。

# はじめに
2021年11月24日に 「[【Next.js Update!】v12リリースを踏まえ、Next.jsの採用を考える](https://forkwell.connpass.com/event/228457/)」に登壇しました。

この記事は登壇した内容を振り返って補足していきます。
登壇した内容と被る部分はスキップさせていただきますので気になる方は[Youtubeのアーカイブ](https://www.youtube.com/watch?v=KaS3bgz_CA4)を是非ご覧になってください。

# Next.jsを採用した理由
今回 __Next.jsを採用した理由__ は大きく3つです。

```
- Reactベース
- 素早く始められる
- API Routes
```
特に __API Routes__ を採用したけど、やめた理由について補足します。

## API Routesをやめた理由

当初API Routesを __BFFとして使う__ ことを想定してアーキテクチャーを考えました。
個人開発でもNext.jsを採用することが多いですが、その際にBFFとしてAPI Routes採用することが多かったので少し自信はありましたが、いくつか罠がありました。

個人開発では考慮してなかった部分が２つあります。

- アプリケーションの規模
- フロントエンドもBFFもClean Architecture、DDDを採用

### 問題点

上記の２つの問題点は問題意識を共有します。
BFFとしてAPI Routesを使うということは、結局 __同じパッケージに２つのアプリケーション（フロント・BFF）のソースが入っている__ ことになります。
アプリケーションの規模が大きく、拡張し続けることが見えているのにその２つを同じパッケージで管理することは良いのかと思いました。

また、ソース管理だけならまだしも同じパッケージにあることで起こり得る問題は __ドメインが混ざる__ ことでした。
Clean Architecture・DDDの構成でやはり大事なことは __ドメインと中心において、いかにドメインを守るか__ だと思います。フロントエンドとBFFはすごく近いし、扱う概念は似ていますが、消して __ドメインが一緒__ とは言えません。
また、近い関係とはいえ別のアプリケーションとも言える２つのドメインやソースコードが混ざることは避けるべきだと考えます。

もちろんTypeScriptなので意識すれば問題ないかもしれないし、multi-packagingなど、何か解決策はあるかもしれませんが、それらはアプリにとって __無駄な複雑性__ になると思い、素直に分けることにしました。

# Clean ArchitectureとDDDを採用した理由

フロントエンドでこのようなアーキテクチャーを採用した理由は動画でも触れていますが、反面懸念点もありました。
Clean Architectureはレイヤードの構成で、依存性の逆転など実現のためにはいくつか守るべきポイントがあります。
その際に `こんな構成をしてしまうとパフォーマンス落ちるのでは？` とも思ってました。

しかし、パフォーマンス的な懸念をあったにも関わらず採用した理由もあります。__品質__ です。

## 品質を担保する

アプリケーションを開発して、規模が大きくなるに伴って __ロジックが複雑__や、 __テストが書きにくい__ とか __書き方が違っててどこに何を書けば良いか分からない__ などのことに遭遇したことはないでしょうか？
もちろん全くないかも知れませんが、その時のメンバーや状況によって技術的な負債が溜まることはあると思います。

これらの技術的な負債が溜まって開発のスピードが下がることを __品質が低い__ と言えます。言い換えると __保守性が高くない__ とも言えます。
フロントエンドでも上記の改題間はもちろんあると思っていて、アプリケーションが大きくなるに伴い品質の低下による開発スピードの低下は加速します。

このような __品質を担保__し、保守性高く開発をするための一つとして __Clean ArchitectureとDDDを採用__ しました。

### パフォーマンスはどうする？

もちろん普通の構成よりClean Architecture・DDDのだとパフォーマンスは落ちるかも知れませんが、それが　 __ユーザーの体験を損なう__ レベルではないです。また、Next.jsではパフォーマンス改善の様々な工夫もできるので描画スピードの改善などは違う方法でも測れるとも考えています。

それに個人的には __パフォーマンスと品質はトレードオフではない__ と思っています。
これは凄く難しいことですが、両方を目指すべきで、どっちかのために片方を捨てないといけないわけではないです。

# 最後に

偉そうに色々書いてますが、実際やってみて __これは本当に正解なのか？__ の疑問はありました。
__フロントエンドでClean Architecture・DDDを採用することは必ず正解ではない__ と思います。
フロントエンドでこの構成はそこまで多くないし、そもそもアーキテクチャーに正解なんてないですよね。

私たちは今回やってみて良いところも伸び代も感じたので__必ずこれにする__よりかは__チームの状況に合わせて決める__ことが大事だと思います。

ただ、フロントエンドを立ち上げる際にClean ArchitectureとDDDも選択肢に入れていただければ幸いです。

### 参考リンク
[Youtubeのアーカイブ - Next.jsでClean ArchitectureとDDD](https://www.youtube.com/watch?v=KaS3bgz_CA4)
[登壇スライド - Next.jsでClean ArchitectureとDDD](https://speakerdeck.com/dordieux/next-dot-jsdeclean-architecturetoddd)
【Rails】TimeWithZoneクラスとは

##TimeWithZoneクラス
- Rails独自のクラスで、Timeクラスと完全な互換性がある。ただし、実装としてはTimeクラスを継承して作られているわけではない。（親クラスはObject）
- Timeクラスよりもタイムゾーンを柔軟に扱うことができる。
- TimeWithZoneクラスのインスタンスはnewではなく、以下のような方法で取得するのが望ましい。

```ruby
Time.zone = 'Eastern Time (US & Canada)'        # => 'Eastern Time (US & Canada)'
Time.zone.local(2007, 2, 10, 15, 30, 45)        # => Sat, 10 Feb 2007 15:30:45.000000000 EST -05:00
Time.zone.parse('2007-02-10 15:30:45')          # => Sat, 10 Feb 2007 15:30:45.000000000 EST -05:00
Time.zone.at(1171139445)                        # => Sat, 10 Feb 2007 15:30:45.000000000 EST -05:00
Time.zone.now                                   # => Sun, 18 May 2008 13:07:55.754107581 EDT -04:00
Time.utc(2007, 2, 10, 20, 30, 45).in_time_zone  # => Sat, 10 Feb 2007 15:30:45.000000000 EST -05:00
```


###Time.nowとTime.currentの違い
- ```Time.now```はTimeクラスで、```Time.current```はTimeWithZoneクラス

```ruby
Time.now
#=> 2021-12-04 18:00:14.633429 +0900
Time.now.class
#=> Time
Time.current
#=> Sat, 04 Dec 2021 18:00:26.016045000 JST +09:00
Time.current.class
#=> ActiveSupport::TimeWithZone
```

###クラスを変換する

```ruby
#TimeWithZoneクラスのオブジェクトに変換
t = Time.now
#=> 2021-12-04 18:12:54.8637452 +0900
t.in_time_zone
#=> Sat, 04 Dec 2021 18:12:54.863745200 JST +09:00

#Timeクラスのオブジェクトに変換
t = Time.current
#=> Sat, 04 Dec 2021 18:18:05.964407500 JST +09:00
t.to_time
#=> 2021-12-04 18:18:05.9644075 +0900
```

##注意
**DateTimeクラスは非推奨なクラス**となったためTimeクラスを使うほうがよい。

https://docs.ruby-lang.org/ja/latest/class/DateTime.html

##参考

https://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html

https://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c
CSS学習サイト３選

この記事は[iCARE Dev Advent Calendar 2021カレンダー2](http://qiita.com/advent-calendar/2021/icaredev)の4日目です。

私は現在、フロントエンドエンジニアとして[株式会社iCARE](https://www.icare.jpn.com/)で働かせていただいております。
フロントエンドエンジニアですが、CSSがとても苦手です。
CSSと仲良くなって得意分野と言えるように、学習を続けていきたい所存です。
今回はCSS学習サイト３選というお題です。
私がCSS学習する上で利用しているサイトを３つご紹介したいと思います。

## [FLEXBOX FROGGY](https://flexboxfroggy.com/#ja)
１つ目はFLEXBOX FROGGYです。ご存知の方は多いと思います。
flexboxを学習できるサイトです。
CSSコードを書いて、カエルのキャラクターを蓮の葉の上に乗せるゲームです。
レベル1〜24まであり、レベルが上がるにつれどんどん難しくなっていきます。
レベル24をクリアできたらflexboxマスターになれる気がします。
![flex_box_floggy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342363/efe5df06-cc75-fb17-cc84-16820969e88b.png)


## [Free Code Camp](https://www.freecodecamp.org/)
２つ目はFree Code Campです。
CSSだけではなくプログラミングについて無料で学ぶことができるサイトです。
CSSについては、基礎から応用まで学ぶことができます。
一度の学習ではなかなか身につかないので継続し利用していきたいです。
海外のサービスのため日本語には対応していませんが、英語学習もできて一挙両得感があります。
![free_code_camp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342363/add10372-a795-0e18-ed2b-bb904aba4df8.png)


## [Markup](http://ysd-lab.jp/markup/learn.html)
最後にご紹介するのは、Markupというサイトです。
レイアウトに特化した無料のCSS学習サイトです。
STEP1〜STEP4まであり、順番に学習もできますし、自分が学習したいSTEPだけを勉強することもできます。
Webサイトのスタイリングをしていく感覚で学習できます。
![markup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342363/97b9ee40-1d65-3793-42bb-f86eab0cd92d.png)


## まとめ
今回はCSSの学習サイトを３つご紹介させていただきました。
普段CSSフレームワークを使って開発していると、ついついCSSの書き方が分からなくなってしまいがちなので、これからもこれらのサイト活用して学習を続けていきたいと思います！
英数字をドット文字に変換したい

# 英数字をドット文字に変換したい
  半角英数字をドット文字に変換したいので変換ツールを作成して埋め込んでみた。


<p class="codepen" data-height="850" data-default-tab="result" data-slug-hash="WNZQEEW" data-user="kobe2018" style="height: 850px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/kobe2018/pen/WNZQEEW">
  ドット文字にする変換する</a> by F.M (<a href="https://codepen.io/kobe2018">@kobe2018</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
Oracle Cloud Infrastructure Foundations 2021 Associate試験に準備期間0日で合格

# はじめに
[Oracle Cloud Infrastructure Foundations 2021 Associate試験](https://education.oracle.com/ja/%E8%A3%BD%E5%93%81%E3%82%AB%E3%82%BF%E3%83%AD%E3%82%B0-ouexam-pexam_1z0-1085-21/pexam_1Z0-1085-21)の日本語版の提供開始及び無料受験が可能という一報を目にし、学習から受験まで1日間で完了させた記録として投稿します。

# 個人的バックグラウンド
-  Oracle Cloud
    - 存在は知っていたが、ほぼはじめまして状態。
- GCP
    - 2年ほど実務で使用
        - アプリケーション開発者ロールしかやっていないので、触ったことのない機能の方が多い
        - 来月[Cloud Digital Leader](https://cloud.google.com/certification/cloud-digital-leader)の受験予定あり
- Azure
    - 半年ほど実務で使用
        - アプリケーション開発者ロールしかやっていないので以下同文
        - [AZ-900](https://docs.microsoft.com/ja-jp/learn/certifications/exams/az-900)の受験を考えている(時期未定)
- AWS
    - 実務経験なし
    - 趣味や社内研修で多少触ったことがある程度

# 学習方法
[Oracle University](https://education.oracle.com/home)の[Understand OCI Foundations: 日本語](https://learn.oracle.com/ols/learning-path/understand-oci-foundations/35644/80239)を受講。

- 講義は全部で8時間ほどあるが、2倍速視聴、クラウドの共通概念のところはほぼ飛ばし、あとはOCIのキーワードベースで、他のサービスとの対応やOCI特有の機能を重点的に頭に入れるだけ、正味3時間前後で完了
- システムメンテナンスで数時間受験できなかったので、その間[OCI活用資料集(サービス別資料)](https://oracle-japan.github.io/ocidocs/services/)に少々目を通す
- 練習問題で24問中22問正解だったので、余裕で合格水準と判断


# 試験
上記コースのメニューからそのまま受験申し込みしてその場でスタート。本試験に関しては、遠隔監視なしで、身分証明書等も必要なく自宅の環境で受験できた。
制限時間90分だが、選択問題が55問あるだけなので、10分少々で終わる。

# 結果&所感
合格ライン68%に対し84%で合格。
所詮、知識ゼロから3時間の詰め込みで合格できる程度の試験だが、OCIの基礎知識は浅く広く頭に入ったと思うので、今後利用する機会があればベースとして役には立つと思う。
また、他のクラウドサービスの学習の際に、対比する対象として知識を整理するのにも役立つはず。

## 今後
3月末までは無償受験キャンペーンが続くようなので、他のOCI認定試験を受験する可能性はあり。ただ、OCIを使う予定もないのでモチベーションはあまり湧かない。
TTYについて


## 環境
focal (Ubuntu 20.04)

## 内容

Linuxにログインしているユーザーの一覧を表示するには、**wコマンド**（もしくは**whoコマンド**）を使う。このとき表示される情報に、**TTY**がある。TTYとはteletypewriter（テレタイプライター）の略で、昔はTTYとよばれるハードを使って、通信をおこなっていた時代があったらしい。今でも、Linuxでは仮想的にTTYを使ってホストと端末の間で通信をおこなっているということになる。

端末からターミナルを使ってSSHで接続すると、ホスト側で**/dev/pts**に**0**というファイルが自動生成される。

数値だけだと、なにかのパラメータ値のような印象で、なぜ、このようなファイル名なの？という印象ではあるが、デバイスファイルと呼ばれるファイルです。ls -l /dev/ptsを実行すると、ttyというグループに属し、ファイルタイプがCになっています。

ホストに接続する端末が増えるたびに、デバイスファイルの数字が連番で増えていきます。例えば、デバイスファイル0が１つある状態で、新たに別の端末からSSHで接続すると、その端末のデバイスファイルは1で自動生成されます。デバイスファイルとは、SSHで接続したときの仮想的な端末インターフェースのことです。物理的なインターフェースNICではありますが。

デバイスファイルを指定して自分の端末から、別の端末にメッセージを送ることができる。自分の端末のデバイスファイルが0だとして、デバイスファイルが1の端末にメッセージを送ってみよう。

```cmd
echo "おーい！" > /dev/pts/1
```

すると、デバイスファイルが1の端末のコンソールに"おーい！"がリアルタイムで表示されます。実験してみると面白いです。
【3日目】Python初心者ライブラリを使う

#ライブラリの基本を覚える
Pythonのライブラリを調べると私の中では便利ツールをまとめたものという意味だと解釈しました。
それを使用してPythonならではの機能や実装ができるのでは？と思っています。

まず、インストールされているライブラリを一覧でみるコマンドです。
ターミナルの方が見やすいかもしれませんね。

```python
pip list
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2343271/ffc9c629-17c8-af91-09bb-f328802ea148.png)

#実際に使ってみる

ライブラリの中から、関数を呼び出して使ってみます。
書籍にあった地図を表示する関数を使ってみます。今回は座標指定なしで表示してみます。

```Python:folium
pip install folium
import folium
folium.Map()
```

うまく表示できるとこのように見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2343271/da877082-c796-d5a5-8f8d-e2aa8a7c0f44.png)

次によく使うであろう日付出力の関数を使ってみます。
工夫すれば、曜日とか現在日付からのn日前とか出せそうですね。

```Python:datetime
import datetime
datetime.datetime.now()
datetime.date(2021,12,1)
datetime.date(2021,12,1).day
```

ブック上だとこのように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2343271/fb851760-0ed1-b3c1-841c-f9b61a37b2e9.png)


今回は書籍から１例、使いそうなものから１例取り上げてみました。
実際にいろいろと試してみたり、ライブラリを探したりするのも楽しそうですね。
ネット上に使い方の事例がたくさん落ちているので、困った時は調べてみます。

ご一読ありがとうございました。
Gradleの概要

##この記事は
初めてAndroidアプリを作成しようとした時、AndroidStudioにデフォルトであったbuild.gradle。
最初は、なんのことか分からなくても大丈夫とアドバイスを受けたので、無視していました。
今は掘り下げが出来るようになったので、やっていきます。

##Gradleとは
Gradleは、大体のソフトウェアのビルドを自動化するツールです。
ちなみに、OSSです。

###特徴
- 差分更新を行うので、無駄な作業が少なくなります。
- JVM上で動作するので、どのプラットフォームにも対応可能
- Mavenを参考にしているので、Javaプロジェクトを簡単にビルド可能
- いくつかのIDEにもサポートしている

###5つの基本原則
- 汎用的 
プラグインを用いて最適化するので、基本的にどのプロジェクトにも組み込めるようになっている。

- タスクのDAGをモデル化する
順番に処理するよ！という意味です。

- 大まかにビルド手順が決まってる
構築 → タスク実行の順序決め ‐> 実行

- 拡張性に富む
カスタムタスクタイプでビルドにさせるバリエーションを増やすことが出来ます。

- ビルドスクリプトは、APIに対して操作する
???

##まとめ
Gradleは、ビルド自動化のOSSであること。
拡張性を持たせるために、あえて完全体にしてないこと。

##参考
https://docs.gradle.org/current/userguide/what_is_gradle.html
【Python3】Base64を用いた符号化の復習

Base64によるテキストデータと画像ファイルの符号化の復習です。

#１．基本
最も単純なもの。コード内で定義された文字列の符号化／復号の確認。

```python:b64_1.py
import base64

plaintext = 'base64'

b64_text = base64.b64encode(plaintext.encode())
print(b64_text)

plaintext = base64.b64decode(b64_text).decode() 
print(plaintext)
```
<ul>
<li>b64encode()の引数はbytes型であるため、encode()による変換が必要。</li>
<li>b64decode()の返り値はbytes型であるため、decode()によってstr型に変換。</li>
</ul>

b64_1.pyの実行結果は以下の通り。

```
b'YmFzZTY0'
base64
```

#２．テキストファイルの読み込み
テキストファイルに書かれた文字列の符号化と、テキストファイルに書かれた符号化文字列の復号の確認。

```python:b64_2.py
import base64

filename_r = "plaintext.txt"
filename_w = "b64.txt"

with open(filename_r, "rb") as f:
    b64_text = base64.b64encode(f.read())

with open(filename_w, "wb") as f:
    f.write(b64_text)

with open(filename_w, "rb") as f:
    print(base64.b64decode(f.read()).decode())
```
<ul>
<li>plaintext.txtには、符号化したい文字列を記載。</li>
<li>符号化文字列はb64.txtに書き込まれ、最後にそれを読み込み、復号。</li>
</ul>

#３．画像ファイルの読み込み
画像ファイルの符号化／復号の確認。

```python:b64_3.py
import base64
import io
import cv2
import numpy as np
from PIL import Image

filename_r = "plainttext.jpg"
filename_w = "b64.txt"
filename_w2 = "result.jpg"

with open(filename_r, "rb") as f:
    b64_text = base64.b64encode(f.read())

with open(filename_w, "wb") as f:
    f.write(b64_text)

with open(filename_w, "rb") as f:
    result = base64.b64decode(f.read())

jpg = np.frombuffer(result, dtype = np.uint8)
img = cv2.imdecode(jpg, cv2.IMREAD_COLOR)
cv2.imwrite(filename_w2, img)
```
<ul>
<li>plaintext.jpgは符号化したい画像ファイル。</li>
<li>符号化文字列の書き込み先はb64.txt。</li>
<li>b64.txtに書き込まれた文字列の復号結果をもとに、result.jpgを作成</li>
</ul>
【Python】ModuleNotFoundError ～ PythonとRubyが混在するWindowsの罠 ～

## この記事について

Windowsで色んな言語で開発しているとこんなことがある（かも）

## 環境
- Windows10
- Ruby 2.7
- Python 3.8.2

## 本題
pip installしたのにModuleNotFoundErrorが治らない。何故だろう？
・・・
<pre>
C:\develop>python -m pip install --upgrade pip
C:\DevelopmentTools\Ruby27-x64\msys64\mingw64\bin\python.exe: No module named pip
</pre>
Ruby・・・？？
ということで環境変数を修正。RubyのPathがPythonより上になっていたので順序を変えたら解決。

## 最後に
Windowsを使ってる方は、Pathの順序に注意（キホン）
JJUG CCC 2021 Fallに参加しました

# はじめに
本記事はMDC Advent Calendar 2021の4日目の記事です。
少し前になりますが、11/21(日)に開催されたJJUG CCC 2021 Fallについて参加しましたのでそれについて感想を書いていきたいと思います。

# このイベントは何？
JJUGというコミュニティの半年に一度のカンファレンスです。JJUGとは日本Javaユーザーグループのことです。JavaのユーザーグループはJUGとして世界中にコミュニティがあります。JUGの中の日本最大のコミュニティがJJUGです。

https://www.java-users.jp/

ちなみに日本でもう一つ公認のJUGとして、関ジャバ（関西Javaエンジニアの会）があります。

https://kanjava.connpass.com/

さらにちなみに、ですが、JUGではないもののJava関連のコミュニティとして大きく活動が活発なものとして、日本Springユーザー会（JSUG）があります。ちょうど先日SpringFestというJSUG年度最大のイベントが開催されており、盛り上がってましたね。

https://www.springframework.jp/

https://springfest2021.springframework.jp/

さて、JJUG CCCに話を戻すと、CCCとはクロスコミュニティカンファレンスの略になっており、元々はJavaユーザーに対して、様々な別のコミュニティを跨いで発表をしたりコミュニケーションすることで知見を広める、深めるものでした。ので今回のカンファレンスのセッションとしても海外エンジニアの方をお招きしたりしているのはそういった背景なのかなと思います。
JJUG CCCは半年に一度開催されています。前回はJJUG CCC 2021 Springということで5/23（日）に開催されました。

https://ccc2021spring.java-users.jp/

今回のサイトは以下になります。

https://ccc2021fall.java-users.jp/

# 今回のイベントについて

コロナ禍ということもあり、前回に続き今回も完全オンライン開催となりました。４Track並行開催で1日朝から晩までということでかなり大規模なものとなりました。
タイムスケジュール、発表資料（公開されているものだけ）、発表動画（公開されているものだけ）をまとめて下さっている方がいました。大変ありがたいですね。。

https://sun0range.com/event-report/jjug-ccc-2021-fall/

# 感想

自身はJJUG CCCにはオフライン開催時期から10回以上参加しています。初回はいつだったかは忘れました。。。
どうしてもオフラインでの熱意溢れるセッションを聞くことと、それに反応して多くの聴講者が一緒に盛り上がる、発表の後にスピーカーに周りに人だかりが出来て、あーでもないこーでもないという、、とか色々ありました。自身も発表したときには、興味深かったですとか、名刺交換して今度お話ししましょうとかやりやすかった面はあります。

オンラインも良いところもあり、遠方の方が参加しやすい、仕事しながら聴講できる、録画・後日公開しやすい、TwitterなどのSNSで盛り上がりやすい、直接対面で質問やフィードバックはしにくいけどチャットなどであれば気軽にできる、などです。

コロナ禍でオンラインでしか開催できなかったところから、環境が整って、コロナが落ち着いた中でイベント開催の在り方としてどうなるか考える時期に来ていますね。うまくハイブリッド開催していいところどりしていく形になるかとは思います。

# 面白かったセッション

## Applied Domain-Driven Design Blueprints for Jakarta EE
JavaOneやOracle Code Oneなどでもよく登壇されている Reza Rahman 氏による発表でした
https://fortee.jp/jjug-ccc-2021-fall/proposal/1272d212-d5b6-44ad-b275-a39323456a4b

内容としては、Jakarta EE標準で　DDDに乗っ取ったアプリケーションをどう作るかというのをEclipse Project、つまりOSSとして公開しているCargo Trackerというプロジェクトの紹介がメインでした。あまりこの存在はよく知らなかったので、コードを見ながら今度触ってみたいと思います。

https://eclipse-ee4j.github.io/cargotracker/

## Head toward Java 17 and Java 18

長くJJUGでは発表されているKUBOTA Yujiさんによる最新のJava 17や次回りリース控えている　Java 18に関するセッションです。Javaを扱っていくエンジニアとしてどういう進化の方向性なのかは抑えておきたいところですね。Java 17はまだまだ未開拓なところがあるので参考にしつつ、いじっていきたいと思います。

https://fortee.jp/jjug-ccc-2021-fall/proposal/2d5130cc-7814-4ce0-a347-760b18b9f9d9


## 巨大なトランザクションを分解せよ！イベント駆動入門 in Spring Framework

DDD関連で書籍やYoutubeなどでも活躍されている成瀬さんによるセッションです。イベント駆動ということで成瀬さんからは初めて聞く話ということで楽しみにしていました。動画もかなり凝って作られており、かつ課題定義からそこへの打ち手というストーリーが丁寧につくられていたので幅広いエンジニアにわかりやすい内容になっていました。そっちの目線になってしまいますが、どううまく相手に伝わるように表現するかという観点でも非常に参考になりました。

https://fortee.jp/jjug-ccc-2021-fall/proposal/c899e216-8db3-49f1-aaf7-3cb7bf8c1f7c


# まとめ

とりとめなくなってしまいましたが、JJUG CCC とは何か、そして今回おすすめの３つのセッションについて紹介しました。今からでも動画、資料は公開されているものもありますので、興味ありましたら参照してみてください！多くの学びはあるかと思います。
STM32L010とシリアルのまとめ(リンク集)(STM32L010F4P6)(USART)(USRT)(LPUSRT)(Mbed)


目的
デバッグまたは、センサーの値を出力したい
その時は、シリアルが簡単

x お好きな物を召し上がれ

caa45040のおすすめは、ソフトウエアシリアルで一番軽い(ライト)から


参考


https://os.mbed.com/users/okini3939/notebook/Serial_jp/




1. Mbed標準のシリアル(重い)

STM32L010のシリアルでHello Worldと出力


https://qiita.com/caa45040/items/3e5d7bab624051d69357


2.簡素化されているらしいシリアル(軽い)

STM32L010のシリアルでHello Worldと出力 (RawSerial)


https://qiita.com/caa45040/items/85981586453dc412f738


3.ソフトウェアシリアル送信　一番使用容量がすくない?

STM32L010のソフトウェアシリアルでHello Worldと出力 9600bps TX PA2 STM32


https://qiita.com/caa45040/items/aa19dba04945f95c2674


4.ソフトウェアシリアル受信(人気がない割に力作)

STM32L010のソフトウェアシリアルで文字を受信する STM32 RX 9600bps


https://qiita.com/caa45040/items/91bc4665095d65eb971b


5.HALでのシリアル

STM32L010で「hello...」とシリアルに出力(Mbed)HAL


https://qiita.com/caa45040/items/e9d8ebfd409e6a234e79


6.LPUSRTでのシリアル

STM32L010で「hello...」とシリアルに出力(Mbed)HAL(PA_4)


https://qiita.com/caa45040/items/af41dd0bea5ca53ac8f8


7.USART-I2C (おまけ)


STM32G031とVSCode+STM32CubeでI2Cスレーブの受信文字をシリアル出力(受信)(STM32G031J6M6)



https://qiita.com/caa45040/items/5032e6905c9425f41495





資料


STM32L010F4P6に中華ST-LINKでプログラムを書き込む。

https://qiita.com/caa45040/items/393ca9fa3c84088ecc9a


STM32L010F4P6のボードの作り方(STM32L010)


https://qiita.com/caa45040/items/96f3e073f9cce2804193


STM32L010のMbedでの新規Lチカコンパイル (STM32L010F4P6)


https://qiita.com/caa45040/items/a5a0532b30c79ed57c84


STM32L010F4P6のUSARTシリアル書き込み(UART)


https://qiita.com/caa45040/items/a2e6ceee37f21f84fe27


参考

HALライブラリによるSTM32マイコンのUART機能使用方法


https://qiita.com/Kosuke_Matsui/items/5e95c8e77f39f78e834e