OmniAICreator/Qiita-1.07M huggingface dataset:
【AWS re:Invent 2023】現地の様子をお届け

# はじめに
2023年11月29日（現地時間）は re:Invent 2023の3日目です。
ちょっと疲れがたまってきたのか、ホテルを出るのがキーノートにギリギリ間に合う時間くらいになってしまいました。
re:Invent も後半戦に差し掛かりましたが、最後まで楽しみたいと思います。

本記事は re:Invent2023 会期中に記事化するものでもないけど、見かけた面白いネタまとめ集です。
会場の熱量や雰囲気が少しでも伝われば幸いです。

## SWAG
最初のRegistrationの時にもらえる SWAG はこちらです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822205/23646abd-fd2e-ba9e-196b-24f84cb70f4e.png)


## S3バケット君（正式名称不明）
会いたかった噂のS3バケット君。
見つけた瞬間に駆け寄ると、人懐っこく振ってくれました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822205/e09a3699-9fb9-6310-8c87-4999b30ba8fb.png)


写真を撮ってると、スタッフの方が笑顔でツーショットの写真を撮ってくれました。

## ライトで照らし出された AWS マーク
キーノート会場の床にはAWSのマークがライトで描かれていました。
オシャレだなーと思って写真を撮りましたが、他の方も気になったのか撮影していました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333262/9ac2f137-357b-df4b-8a2f-7661e905b49d.png)

## ライトで照らし出された AWS re:Invent マーク
AWS re:Invent マークもありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333262/10c175c3-5b42-3431-96e2-05b2ff5748ca.png)

## キーノート中の演出で火花
キーノート中に火花が散りました。
ちょっと何を言ってるかわからないとは思いますが、証拠はこちらです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333262/41671a6e-a090-11e5-ea43-2f1497f3fee6.png)

## Expoに人がたくさん
AWSパートナー出展のEXPO（展示会）の開場30分前の時点ですごい人だかりでした:runner::runner_tone1::runner_tone2::runner_tone3::runner_tone4:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333262/9a2cc6bb-1681-e897-3de5-899e835a69f5.png)

Expoが開場した瞬間に「WHOOOO!!!」と歓声が上がってました

## AWS Outposts Rack の展示
一度はお目にかかりたかった一家に一台欲しい AWS Outposts Rack です。
元々インフラエンジニアということもあり、心の中で「WHOOOO!!!」と叫びながら10分くらい眺めてたと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333262/60c0554a-30ee-efc7-7554-c9a76899e6aa.png)


その場にいた担当エンジニアに「Cool!」とだけ伝えると、とても親切に熱く語ってくれました。
まったく英語は聞き取れなかったですが、とても素晴らしい製品であることが伝わってきました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333262/a38557fd-2498-23aa-d64a-e22b1bbe87a6.png)

「なんだこれは？」と思った方は一度公式概要ページをご覧ください。

https://aws.amazon.com/jp/outposts/rack/

## Expoのノベルティ
時間を作ってExpoでは出展企業で製品の説明を受けた上で、たくさんのノベルティをもらいました:smiley:

以下はAWSのノベルティですが、左から 

- AWSロゴが入ったルービックキューブ
- マネジメントコンソール風の救急箱
- AWSのマークが入った栓抜き

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822205/b595bb24-737e-f313-1b55-1362862bcf18.png)


## 食事系
会場ごとに食事スペースが設けられており、ここでご飯を食べることが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822205/b99c4b99-a5d4-fe91-d34a-c8a1d1a2a079.png)

私がいった時のお昼ご飯のメニューこんな感じでした。
（食事の写真は撮り忘れました:dizzy_face:）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822205/f7eec706-917b-ea6d-28f3-1ef4be932b88.png)


また会場内ではこんな感じの箱のお弁当が無料で配られていました！:smiley:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333262/98db0996-432e-ea75-c808-92d04f532e38.png)

中身はこんな感じです。丸ごと1個のリンゴと黒い箱にはサンドイッチが2つ入ってました。
戸惑いながらリンゴを丸かじりして食べてました:grinning:
他にもサラダのお弁当もあったようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333262/394ddf92-f4c8-be4e-6458-09b6e72cd47b.png)

# 最後に
セッションだけの発信だけでは現地の雰囲気が伝わらないと思い、現地の様子をお届けしてみました。
残り1日ですが、また何かあれば随時更新していきたいと思います！
【Flutter x Supabase】データを追加するやり方＋おまけつき


![スクリーンショット 2023-11-30 16.45.48（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/e2196175-0b3a-d23a-12f6-5413eb58f0e5.png)



:::note info
この記事は、<b>株式会社ゆめみの23卒 Advent Calendar 2023</b>のアドベントカレンダーになります！！
色々な種類の記事が投稿されるので、お楽しみに🤗
:::

https://qiita.com/advent-calendar/2023/yumemi-23-graduation

こんにちは。いせりゅーです。今回は、Flutter x Supabaseでデータを追加するやり方に加えて、必要そうな記載を書いてみました。(あくまでも一例です)

:::note warn
Supabaseを学習し始めてからまもないため、間違えた実装を記載するかも知れません。その場合はコメントなどで教えていただけると幸いです🙇
:::




１、記載の漏れがないかを確認する
２、データを追加する
３、投稿画面を閉じる

こんな感じで進めていきます〜〜！！


# 記載の漏れがないかを確認する

こちらについては、さまざまな確認方法があると思いますが、今回は食べ物の名前と感想が記載できているかどうかの確認をしています。
お好みの方法で、警告文を出してください。

```dart
final foodTextController = TextEditingController();
final commentTextController = TextEditingController();

void post() {
  if (foodTextController.text.isNotEmpty && commentTextController.text.isNotEmpty) {
    // データの追加の処理を記載する
  } else {
  print('食べ物の名前or感想が入力されていません！');
}
```

# データを追加する

実際にデータを追加してみます。

```dart

final supabase = Supabase.instance.client;

Future<void> post() async {
final user = supabase.auth.currentUser?.id;
final updates = {
  'user_id': user,
  'food_name': foodTextController.text,
  'comment': commentTextController.text,
  'created_at': DateTime.now().toIso8601String(),
  'heart': 0,
};

try {
  await supabase.from('posts').insert(updates);
} on PostgrestException catch (error) {
  print('error');
}

```



# 投稿画面を閉じる

こちらは今の画面から戻るだけで良さそうですね。

```dart
Navigator.pop(context);
```

# ソースコード

```dart
final supabase = Supabase.instance.client;
final foodTextController = TextEditingController();
final commentTextController = TextEditingController();

Future<void> post() async {
  if (foodTextController.text.isNotEmpty && commentTextController.text.isNotEmpty) {
  final user = supabase.auth.currentUser?.id;
  final updates = {
    'user_id': user,
    'food_name': foodTextController.text,
    'comment': commentTextController.text,
    'created_at': DateTime.now().toIso8601String(),
    'heart': 0,
  };
  try {
    await supabase.from('posts').insert(updates);
    Navigator.pop(context);
  } on PostgrestException catch (error) {
    print('error');
  } else {
  print('食べ物の名前or感想が入力されていません！');
}

```

# 最後に

自分もまだまだ学習中ですが、Supabaseのいいところが毎日見つかってきてとてもいいですね。個人的にはこれからの発展に期待したいですね😁


# ちょっとした宣伝

株式会社ゆめみの23卒のメンバーでアドベントカレンダーを作成しています。
新卒のフレッシュな記事がたくさん投稿予定なので、少しでも興味があれば購読いただけると幸いです！！


https://qiita.com/advent-calendar/2023/yumemi-23-graduation



<img width="1240" height="112" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/6d8a7098-9aef-a19a-54fe-83a2d493e033.png" alt="YUMEMI New Grad Advent Calendar 2023">
プログラミング超初心者が『世界一流のエンジニアの思考法』を読んでみて

## 本記事の要約
『[世界一流のエンジニアの思考法](https://www.amazon.co.jp/%E4%B8%96%E7%95%8C%E4%B8%80%E6%B5%81%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E6%80%9D%E8%80%83%E6%B3%95-%E7%89%9B%E5%B0%BE-%E5%89%9B/dp/4163917683 "世界一流のエンジニアの思考法")』の個人的ポイントをまとめたもの。
<img width="50%" height = "50%" src="https://m.media-amazon.com/images/I/81RO+wECc0L._AC_UF1000,1000_QL80_.jpg">
自分にとっての備忘録を兼ねている。


## はじめに
本書は現在Microsoftで勤務する著者による現地での経験に基づいて、世界基準のエンジニアに求められる点を詳述している。

また、Amazonでのランキングも上位に位置しており、読者のバックグラウンドを問わず、各方面から高い評価を得ている。

今回はそんな本書について、プログラミングを始めて間もない自分が印象に残った点を列挙する。

## 仮説思考の重要性
著者はプログラミングでエラーに遭遇した際、一度手を止めてログを観察し、トラブルの原因を突き止めるための「仮説」を考えることを勧める。

自分は真っ先に思い当たる可能性を片っ端から検証していくタイプだが、どうやらこれが本質的理解の妨げになっているらしい。

また著者は、手当たり次第に可能性を試すことは、逆に将来の時間のロスを増やすことにも繋がりかねないと指摘する。

本書が勧める正しいエラーに対するアプローチは以下の通りだ。

**1. まず事実（データ）を一つ見つける**
**2. いくつかの仮説を立てる**
**3. その仮説を証明するための行動をとる**



## タスクを捨てる勇気
自分は何かとプロジェクトに取り掛かると、「最後までやらなきゃ…」と思うタイプだ。

**しかし本書は、例えば5個のタスクがあったとしても、実行するのは最重要な1個のみに絞ることを勧める。**

最重要な2割のタスクに80%の価値が含まれており、それさえ終えれば残りの8割のタスクはやらず、さっさと次に移る。

そして80%の価値を生む2割の新しいタスクに取り組む。

>『いわゆる「2-8の法則」でも、20%の仕事が80%の価値を生むのだから、20%をしっかりやればよくて、100%全部やろうとすると工数もかさむし、時間が足りない。』

## 「Fail Fast」の原則
日本には「ググれカス」という言葉があるように、何かわからないことがあればまず自分で調べることを推奨する空気がある。

しかしインターナショナルチームでは早く失敗（Fail Fast）し、フィードバックをすぐに得ることが効率的だとみなされる。

「こんなことで聞いてもいいのかな？」という疑問こそ、エキスパートに尋ねれば、かなりショートカットできると筆者は説く。

>『相談される側もわずかな手助けでプロジェクト全体がスムーズに進むので、結果的に自分の仕事も楽になるのだ。』

## 生産性を上げるための休息
本書は仕事の効率を上げるための方法論として、**仕事の完了度合いを問わず、時間きっかりに切り上げることを勧める。**

著者は仕事が未完了だと休まずに働くタイプだったが、『[Time Off](https://www.amazon.co.jp/TIME-OFF-%E5%83%8D%E3%81%8D%E6%96%B9%E3%81%AB%E2%80%9C%E7%94%9F%E7%94%A3%E6%80%A7%E2%80%9D%E3%81%A8%E2%80%9C%E5%89%B5%E9%80%A0%E6%80%A7%E2%80%9D%E3%82%92%E5%8F%96%E3%82%8A%E6%88%BB%E3%81%99%E6%88%A6%E7%95%A5%E7%9A%84%E4%BC%91%E6%81%AF%E8%A1%93-%E3%82%B8%E3%83%A7%E3%83%B3%E3%83%BB%E3%83%95%E3%82%A3%E3%83%83%E3%83%81/dp/4295408115 "Time Off")』という本をきっかけに思考が変化したという。

この本の要点について、本文では次のように述べられている。

 > * 水泳をするときに、息継ぎせずに泳ぐことはできない
 > * 発想のブレークスルーは、その仕事をしていないときに発生する
 > * 一日に一つのことに集中できるのは4時間。4時間過ぎて疲れたら、単に休むのではなく、違うことをするのが良い。


## 「Be Lazy」が推奨される文化
インターナショナルチームでは、「いかに作業量を減らしてインパクトのあるタスクに集中できるか」が仕事の焦点だ。

そのため**たくさん仕事をするのでなく、楽に効率よく良い成果を出す**ことがメンバーのモチベーションだという。

また、休暇を尊重する空気も特筆すべきものがあり、たとえ仕事の途中で休暇を取ろうが誰も批判しない。

日本でみられる「仕事を終わらせてから…」といったプレッシャーは存在しないと筆者は語る。

インターナショナルチームには前提として、「仕事は楽しむもの」というカルチャーがある。

> * できる人たちにのびのびとパフォーマンスを発揮してほしかったら、何よりもチームメンバーが「仕事を楽しめる」環境をつくることだ。

## まとめ
本書はエンジニアの思考法やカルチャーについて、日本のチームとインターナショナルチームの比較を通じてその違いをまとめている。

初学者の自分にとっては、特にエラーとの向き合い方、理解に対する姿勢、タスクの優先順位に関する項が参考になった。

何か今後の学習やキャリアで迷ったことがあれば、いつでも戻って読み返したい。
M5Stackでつよつよ系負荷を駆動するUNIT

M5Stackの製品ラインナップは、本当に幅広く、至れり尽くせりですよね。「こんなのほしいな」と自分で作ってても、しばらくすると公式から発売される、というのも、「M5Stackあるある」の一つではあります。

そんな中で、個人的に、ちょっと手薄かなー、と思う、というか、自分がほしいストライクな製品がないゾーンが「つよつよ系の負荷を駆動するUNIT」です。

モータ、ソレノイドといった、ちょっと高めの電圧（12Vとか24Vとか）、多めの電流（1Aオーダー）の負荷を駆動する場面はそれなりにあります。M5Stack製品に、そういう負荷を駆動するためのUNITもいろいろあるのですが、特に最近のは中にマイコンが入って「凝った駆動・制御ができる」ものが多いような印象です。例えばステッピングモータを駆動するにも、GRBLコマンドで移動量を指定して線形補間の台形駆動、みたいな凝った制御ができたり、DCモータもコマンドで回転数を制御したりPWM周波数を変えられたり、というものはあります。

個人的には、GPIO端子で直接制御ぐらいの低レイヤの制御をしたい場面がちょくちょくあって、そういう用途には、ちょっと使いにくいな、と感じることがよくありました。例えば「ステッピングモータを、パルスを送るごとの1step進む」みたいな制御です。

「ないならつくればいいじゃん」というわけで、自分で使いたいものをつくっていったら、それなりに「つよつよ系負荷を駆動するUnit」シリーズがたまってきたので、まとめてご紹介します。

## HbrigeS UNIT

DCモータや双極ソレノイドなど、正転逆転の駆動をするUNIT。制御信号は、よくあるHブリッジのA入力とB入力で、正転・逆転のPWM制御をGPIOのPWMで制御できます。

https://www.switch-science.com/products/8519

## AudioAmp UNIT

矩形波（PWM）やDAC出力でスピーカを鳴らすUNIT。制御信号は波形信号とEnable。wavデータの振幅をタイマ割り込みでDACで出力して音を鳴らす、のもできます。イヤホンなどをつなぎやすい3.5mmジャック版と、ねじ端子版があります。Grove端子の割当は[SeeedのGrove-スピーカ](https://www.switch-science.com/products/1351)と上位互換（イネーブル信号あり、切替可能）にしてあります。

https://www.switch-science.com/products/8840

https://www.switch-science.com/products/8839

## Solenoid UNIT

ソレノイドなどの誘導性負荷の制御。制御信号は負荷のON/OFFのみで、PWM駆動もできる。負荷電源は外部から供給、またはGroveの+5V（ジャンパ切り替え）。最大２個の負荷を制御できる（ジャンパ切り替え）。ねじ端子版と、[タカハの5Vソレノイド](https://www.takaha.co.jp/co/ss/)が直接つなげるようにUSBコネクタ版も。

https://www.switch-science.com/products/8518

https://www.switch-science.com/products/8517

## StepperDriver UNIT

ステッピングモータを、パルス１発ごとに1step進める制御ができる。制御信号は回転方向とステップパルス。

https://www.switch-science.com/products/9169

## SolenoidRetaiiner UNIT

ソレノイドを「最初フル通電し、その後PWMで弱く保持状態を維持する」という制御を自動で行うUNIT。マイコンつきソレノイド制御UNITでもあるので、ファームウエアを変更すれば他の用途にも。

https://www.switch-science.com/products/9147

## TypeC2Grove

LEDテープやサーボモータなど、それなりに電流がたくさん必要とする負荷に、別途USB TypeC端子から+5V電源を供給するUNIT。2022年夏のM5Stackインターン中に企画・設計をして製品化されました。

https://www.switch-science.com/products/8453

## HY4pServo

特にSG90などの安価なサーボモータは、始動電流が大きいものがあって、M5Stack側の電源が耐えられずにリセットがかかることがよくあります。大きめの電解コンデンサを電源ラインになぎ、M5Stack側はGrove端子、サーボ側は3pコネクタで直接接続できます。

https://www.switch-science.com/products/6922

## VH3.96ケース

「つよつよ系負荷を駆動するUNIT」は、すべてM5Stack製品の各種UNITと同じ形状で、純正と同じケースにぴったりはめることができます。純正UNITと同一形状のこちらのケースに入れれば、見かけは公式製品っぽくなります。

https://www.switch-science.com/products/9165

「帯に短し、たすきに長し」な気がする「つよつよ系負荷を駆動するUNIT」のM5Stack製品のニッチを埋めるものを、まとめて紹介しました。

・・・そのうち公式から製品が出る気がする・・・
KubernetesとEKSの学習記録 Part 2

# 概要
仕事でKubernetes(AWSのEKS)を利用する機会が出てきたため学習します。

学習ステップとしては以下のようにしてみようと思っています。
1. Kubernetesの基本用語の理解
2. Kubernetes公式チュートリアルやってみる
3. EKSの基本用語理解
4. EKSでサービスを作ってみる

今回はステップ2 「Kubernetes公式チュートリアルやってみる」

この記事はそのメモやまとめです。
すでに設定済みの項目がいくつかある。
試行錯誤しながらやったので、手順として不要かもしれない。**あくまでメモ用。**

## 公式チュートリアル

https://kubernetes.io/docs/tutorials/

こちらのページのBasicsを実施してみました。
環境は
- WSL2
- almalinux8
- dockerはDocker Desktopを利用
- Kubernetesはminikubeを利用

Deeplで翻訳をかけながら英語のページで実施しました。
(その理由は下記に記載)

本当にチュートリアルどおりにやったので、記録することはあまりありませんが、
つまづいた部分を記録します。

## つまずき1 日本語チュートリアルがアップデートされていない
初めてページにアクセスした時は日本語に翻訳されているページが有りましたので、そちらで実施しようとした。
```
このページに記載されている情報は古い可能性があります

このページの更新日は英語版よりも古いため、記載されている情報が古い可能性があります。最新の情報をご覧になりたい方は英語版のページをご覧ください: Learn Kubernetes Basics
```
こんなメッセージがでていたが、ふーん……程度に思っていた……。

日本語でチュートリアルを実施すると、途中で「対話型のチュートリアルを始める」で進めてもなにも表示されませんでした。
英語版に切り替えたところ、
```
Content unavailable
The interactive tutorial for creating a cluster is not available. For more information, see the shutdown announcement.
↓ deepl
コンテンツを利用できません
クラスタを作成するための対話型チュートリアルは利用できません。詳細はシャットダウンのお知らせをご覧ください。
```
詳細を見るとどうやらオライリーが提供しているKatacodaがサービス終了していたようで、このチュートリアルは利用できなくなっていました。
大人しく英語でチュートリアルを進めることにしました。

## つまづき2 docker desktopのKubernetesが起動しない
Kubernetesが起動中から全く動かなかったので、
docker desktopアンイストール → docker desktop再インストール
してMinikubaを動かすことにした。
これが一番時間かかった……。

## つまづき3 Podにcurlできない
チュートリアルの途中で
```
curl http://"$(minikube ip):$NODE_PORT"
```
を実行してpodの情報を得る部分があったのですが、うまくアクセスすることができませんでした。
原因はサービスを起動していなかっただけのようでしたので、
```
minikube service kubernetes-bootcamp
```
を別ウィンドウで実行した後、以下を実行。
```
at 16:22:35 ⬢ [Docker] ❯ curl http://127.0.0.1:37199
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-65df967b7f-pg5k6 | v=2

~ via 🐍 v3.10.8 
at 16:23:13 ⬢ [Docker] ❯ 
```
表示された！！！
EC-CUBEアドバイザーのご紹介

こんにちは、イーシーキューブの村上です。
この記事は、「[EC-CUBE Advent Calendar 2022](https://qiita.com/advent-calendar/2023/ec-cube)」1日目の投稿になります。
昨年は、1日目の投稿として、EC-CUBEが気になる方向けに、「[EC-CUBEの紹介とEC-CUBEの始め方](https://qiita.com/h_murakami/items/423ec38505328ee4f1f9)」についてまとめました。
EC-CUBEでは、カート選定・ベンダー選定のタイミングで具体的な相談ができる、[EC-CUBEアドバイザー相談](https://www.ec-cube.net/advisor/)という窓口も設置していますので、今年はもう少し踏み込んで、どんなご相談が多いかご紹介してみたいと思います。

# EC-CUBEアドバイザー相談って？
EC-CUBEは無料で自由にご利用いただける、ECのオープンソースです。
フロント画面・管理画面それぞれに、ネットショップに必要な基本機能を備えており、かつ、柔軟なカスタマイズが可能です。
ASPやパッケージ型のカートとは異なり、カートの利用にあたって、カート提供元への初期・月額のお支払いは発生しません。
代わりに、サイト構築や追加開発、運用保守などで、長くお付き合いできる制作会社を見つけていただくことが重要となります。
スモールスタートや大規模開発まで、それぞれの方にマッチするパートナーを見つけられるよう、アドバイザーが30分ほどのWeb会議にてお話をお伺いし、EC-CUBEというカートの説明や、制作会社の紹介を行っています。

# アドバイザーへのご相談の傾向
EC-CUBEアドバイザー相談の取り組みはコロナ禍をきっかけにスタートし、2020年からこれまでに1,000件以上、ご相談をお受けしてきました。多岐にわたる幅広いご相談がありますが、とりわけ以下3点のご相談が目立っています。
（1）新規構築・リニューアルにおけるカート選定
（2）EC-CUBEの2系・3系から4系（最新版）への移行
（3）個別の要件がEC-CUBEで可能かどうかのご相談
それぞれ、どんなお話をいただいているかご紹介していきます。

# （1）新規構築・リニューアル
まだやわらかい段階から、以下のようなご相談をいただいています。

・従来の売り方ではできなかった販路開拓のためにECを検討したい
・既存のEC事業とは別に、新規事業として新しくECを企画中である
・事業拡大や、システム見直しのためリニューアルを考えている
・現在のカートで追加オプションやプラン変更を検討中だが、利用料が高くなるため、EC-CUBEに移行した場合の見積もりと比較したい

具体的なご提案やお見積もりは、制作会社がヒアリングの上、ご提示となりますが、その手前で、アドバイザーからも、目安となる費用や期間は参考情報としてお伝えしています。

# （2）2系・3系から4系への移行
EC-CUBEでは2006年リリースの2系から、3系・4系と進化を続けています。
2系ではガラケー・パソコンとソースコードも別々の構造となってしましたが、3系からはレスポンシブでソースコードを全面的に見直し、Symfonyベースのフレームワークを採用するなど大きな変化を遂げました。
4系ではさらにコアも触りやすくなり、パフォーマンスも改善。現在、EC-CUBEの新規ダウンロードはほぼ4系となっています。
2系・3系からデータ移行も可能ですが、構造やシステム要件等が異なるため、移行には費用がかかります。
どのようなタイミングで、どういった進め方をするのがよいかというご相談から、アドバイザーでお話をお伺いしています。

# （3）EC-CUBEで可能かどうか
EC-CUBEは、カートなど「コア」の部分を含めて、柔軟にカスタマイズできることから、ECの枠に収まらない幅広い用途でお使いいただいています。
一方で、公開されている事例はごく一部のため、「こんなことをやりたいが、実際にやったことがある制作会社はいますか」というご相談をいただきます。
「BtoBで掛け売りを実装したい」「アマゾンのようなモールを作りたい」「教室ごとの備品をレンタルしたい」「名入れやデザインを指定したノベルティを販売したい」「基幹と連携したい」「社販サイトを作りたい」「eラーニングの受講をさせたい」などなど。
全国160社以上の制作会社がEC-CUBEのパートナーとしてご登録いただいているため、非公開事例ながらも、カスタマイズの内容についてはお伺いしており、「商材」「カスタマイズ内容」などはお伝えしています。
ご相談内容に近しい実績のある制作会社も、ご紹介が可能です。

# 最後に
EC-CUBEアドバイザー相談では、専用ページからご連絡をいただければ、内容を確認して適宜、ご案内しています。
カート選定・ベンダー選定でお悩みの方は、まずはご相談ください。
[アドバイザー相談 専用ページ](https://www.ec-cube.net/advisor/)

明日は[@makoto_i](https://qiita.com/makoto_i)さんです！
よろしくおねがいします！
TIL: pandas のデータ型について

TIL:
・pandas で dtype が object のカラムには str 型と int 型が同居していることがある。
・自動で型推定される時のルールが把握できない。csv 上で同じカラムに同じ文字列「10」が入っている場合でも、 DataFrame に読み込んだら '10' (str) になるレコードと 10 (int) になるレコードがある。

→ マージのキーにしたいなど型まで一致してないといけない場合は dtype を与えるのが安全。
React Nativeで定期購読型のアプリ内課金実装の勘所


この記事はReact Native未経験からプロジェクト参加半年で~~不毛な~~様々なテストによって得られた知見を並べていこうかなと思って書いています。
**実装方法については書いてません。** テスト時に出た不具合にどう立ち向かったかという覚書です。

環境は以下の通り

* MacBook Pro 16-inch, 2019 (Ventura 13.6(22G120))
* Xcode: 15.0.1
* openjdk: 11.0.18
* Node.js: 18.15.0
* expo: 48.0.21
* react-native: 0.71.14
* react-native-iap: 12.10.5
  * 最新版ではPBL6になったらしいけど、この時点ではPBL5です
  * iOS はStoreKitを使っていて、StoreKit2は使っていません

## React Nativeにおけるアプリ内課金の実装

使用するアプリ内課金ライブラリです。
[react-native-iap](https://github.com/dooboolab-community/react-native-iap)

基本的な実装は IapExample にある通りに行えばいいと思います。

## テスト内容

#### 1. 通常の購入フロー

特に癖のないオンライン状態で一通り購入処理を流れどおりに行います。
ここで既に意図しない動きをしている場合はおそらく実装が間違っています。
正常完了することだけを目標に修正しておきます。

#### 2. 無料トライアル期間中に解約する

無料期間中の解約は期間終了とともにレシートが消えます。(正確には取得できるものがなくなる)
レシートが取れること前提で購入検証処理を組んでいるとことごとく詰みます。
検証時にネットワークエラー以外でレシートが取れなかった場合は未購入状態に戻すなどのフローが必要です。

#### 3. 本購入期間突入後、更新前に解約する

無料期間が終わり、初めて課金されてからの解約した場合の動きは以下の通り。

* 期間終了後は `getAvailablePurchases()` ではレシートが取れないかも知れない
* `getPurchaseHistory()` は期限切れのレシートも取れるので一応確認できるけど、iOS ってレシートが雪だるま式に増えてない？(すごく重い)

という感じなので、こちらもネットワークエラー以外で新しいレシートが取れないor取れたけど期限切れになっている場合は未購入状態に戻すというフローで良さそう。

#### 4. 購入処理中にネットを切断する

世の中絶対なんて言葉はないので、購入ボタンを押したあとにネットに繋がらない状態が発生することを想定したテストです。
各OSネイティブの購入ボタンを押してからの時間経過具合で動きが変化するので結構厄介です。

1. そもそも購入前にオフライン
2. 購入ボタンを押した直後にオフライン
3. OSネイティブの購入が完了するタイミングでオフライン

１つ目は、OSネイティブの購入ボタンを押す前にオフラインにした場合ですね。そもそもストアに購入の意思が送信できないのでネットワークエラーで片付きます。

2つ目は、OSごとに動作が違うような気がします。
iOS はネイティブの購入完了が出てからオフラインにし、レシートの検証などが終わらない状態を作った場合、未購入状態に戻るようです。(買い直しても二重購入にはならなかった)

Androidは購入する意思を示した時点で「購入済み」扱いになるみたいですが、処理中アイテムがキャッシュされてるという状態なんですかね？状態が全く見えない...

* 購入ボタンを押した直後にネット切断→OSの購入画面下に「ネットに接続してください」が出続ける。
* そこでネットに接続すると「購入済みです」の表示が出る。
* しかし、`getAvailablePurchases()`するも有効なレシートが取れない。(そもそも購入が完了してない)
* 仕方なく、もう一度購入を実行すると既にこのsku idは購入済みと出る。(多分ここまで来るとレシートが発行される？)
* その後、Play ストアの定期購読に期限までにアプリを開いて購入プランの確認をするようにというメッセージが表示される。(購入が承認されていない場合に発生する猶予期間という扱い)

~~多分、Play Billing Libraryのレスポンスコード的には1回目の購入ボタンから「購入済みです」が出た時は `ITEM_NOT_OWNED` で、2回目の購入ボタンから「sku idは購入済み」と出た時は `ITEM_ALREADY_OWNED`かなと勝手に予想立ててますが、ちょっと対処方法で悩んでいます。~~

後で調べて見たんですが、両方ともResponseCodeは7だったので、`ITEM_ALREADY_OWNED`みたいです。
しかし、2回目押さないとレシート取れなかったんですよね...まだ分からないことが残ってる。

`ITEM_ALREADY_OWNED`が来る場合はレシートを取得して購入状態を復元すれば使えそうですが、その際、注意が必要なのは、`acknowledged`の状態です。

Play ストアに購入プランの確認メッセージが出ている場合、`acknowledged`が**false**です。
期限までにPlay Billing Libraryの `acknowledgePurchase()` つまり react-native-iapの `finishTransaction()`を呼び出さないと自動更新されずに解約されます。

割りと「購入プランの確認」とかで検索すると、クレジットカードの期限が切れてて～みたいな記事しか出てこないので、気づけませんでした。
`finishTransaction()`は普段、購入時に取れたレシートに対して行う処理かと思われますが、こういう購入を途中でオフラインにしてしまうみたいなテストすると不具合として出てきたりするんですよね。

3つ目は、次回レシート検証タイミングで取得して検証すればいいかなぐらいですかね。

## まとめ

まだ完全解決には至っていませんが、Androidで購入時にオフラインにした時の諸々の不具合に関して、薄っすらと状態が見えてきた気がします。
USB接続で実機検証してても機内モードとかした途端にMetroの接続切れてしまうのでAndroid StudioとかXcodeとかでログ出しながら見ないとダメですね...(そっちでも見られるか分かってない)
仕方ないのでこのあたりも踏まえて、確認に努めていこうと思います。
QT ファイルパスに特殊な文字がある場合

## 問題
コロン (:) などの特殊文字は、ファイル・パスの中で特別な意味を持ち、解析エラーの原因となることがあります。 

## 方法
このような場合は、ファイル・パスを `QFileInfo` に渡して解析する前に、正しくエンコードするようにします。 たとえば、C++ を使用している場合は、`QString` の `toUtf8` または `toLocal8Bit` メソッドを使用してファイル パスのエンコードを変換し、正しく解析されるようにすることができます。

## サンプルコード

```c++
QString filePath = "path/to/file:with:colon.txt";
QFileInfo fileInfo(filePath.toUtf8());
```
Windows内のネットワークを整理：①WSL2編

年末まで＠1か月！来年気持ちよく迎えられるようにお掃除はじめちゃいましょう！

今年もやっとしつつ放置していた **Windows内のネットワークがどうなっているのか？** を整理しようと思います。

## なぜWindows内部のネットワークを知る必要があるか？

昨今ではDockerやWSL2( **WSL1** はもう古いので無視！)など、仮想的に存在するものがあり、通信が出来ない時に原因が見えにくい。Google先生やGPT先生に聞いても、通信できない要因は１つではないため、原因を究明出来る力をつけるべきなのである。

こうする事で **あれ？Docker起動したから？WSLから外部へ通信できぬ！** とかそんな謎めいた状況に陥っても自己解決が可能なのだ！

では、私のWindowsの設定環境を例にしながら今日はWSL(Ubuntu)から外部に通信する経路を追ってみようと思います。

## 私のWindowsはこうなってます

まず結論からいうと、こんな構成になっています。

![wsl-WSL内部NW.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9872/68f06757-3514-f07c-cce4-bfb41e962fce.png)

こういうの見て拒否反応起こす人もいるかもしれませんが、大丈夫。コワくない！
私もサーバサイドエンジニア。インフラとかちょっとしか知らないしね！

それに、この図をみたら、Ubuntu～物理NIC[ WiFi ]までの経路が見えるんじゃないでしょうか。

では実際にIPアドレスや設定を確認する方法を紹介していきましょう。

まずは、Hyper-Vから確認しましょう

### Hyper-VのWSLの仮想スイッチを確認しよう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9872/13082c44-8838-73d7-39b4-3c2d419510c2.png)

Hyper-Vの上記のところから、仮想スイッチの設定が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9872/10423781-e7f7-bb6e-14e6-b0ca4ebb67e8.png)

WSLの仮想スイッチが上記の画像のようになっている事が確認できます。

ここでは`内部ネットワーク`となっています。だから最初に説明したような繋がりになるんですね！

では **外部ネットワークならどうなるか？** わかりますか？

答えは、**仮想スイッチから物理NIC [WiFi]**に線が引かれます。（バインドと呼びます）
※正しくは外部ネットワークの下にあるプルダウンで選んだNICに線が引かれる。
※ **「管理オペレーティングシステムにこのネットワークアダプターの共有を許可する」** のチェックを外すと、仮想スイッチと仮想NIC [vEthernet(WSL)]の線が切れます。

では線の繋がりがわかった所で、次はWindows OS側の設定を確認しましょう！

### WindowsOS側のネットワークを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9872/b208d335-2a01-82d3-1431-9b27db0b26ab.png)

`ipconfig`コマンドで確認が可能です。構成図にあったIPアドレスの情報が出てきましたね！

ちなみにサブネットマスクの範囲が`172.18.96.1/20`となっているのがわかりますが、これは`172.18.96.0/20`と同じですね。構成図と違って見えますがそういうもんです。


最後にWSL2のネットワークを見てみましょう！

### WSL2(Ubuntu)のネットワークを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9872/c6333a9d-67d2-cde3-f76b-c30ea9b80acd.png)

右下にアーニャちゃんがこんにちわ！背景画像が設定できるUbuntuは素敵ですね！
画像の通り、
- IPアドレスは`172.18.110.165`ですね！
- eth0のサブネットマスクは172.18.110.165/20 なので172.18.96.0/20と同じですね！

また、通信経路を確認した結果
google.comへの通信経路は`172.18.96.1(WindowsOS側の仮想NIC）`を経由して`172.19.16.1(物理NIC[WiFi])`と流れている事がわかりました。

線引くとこんな経路ですね！
![wsl-WSL内部NW（wsl-_外部).drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9872/f1209660-df36-965f-8ebf-987653e9cd66.png)


## 最後に

駆け足でしたが、WSLの通信がどう流れているか少しは理解できたでしょうか？
続編も近々書く予定でいますので、こうご期待！

次回は、
「え？WSL2ってUbuntuとかCentOSとかに同じIPアドレス振られるの？」
「ホストOSからWSL2への通信はどうなってるの？」そんな所を見ていければなと思います！
Cloud Functionsを使ってAPIをデプロイする

## はじめに
PythonスクリプトをCloud Functions上にAPIとしてデプロイする手順を紹介します。

``簡易な処理だけどインフラを整えるのが面倒くさい！``
という場合に素早く手軽にデプロイできるのが魅力です。

## Cloud Functionsについて
Cloud Functions は Google Cloud によって提供される **FaaS (Function as a Service)** です。サーバやコンテナといったインフラを意識することなく、手軽にクラウド上でのコード実行することができます。独自のサービスを HTTP API 経由で公開することはもちろん、特定のイベントをトリガーとして起動したり、クローラとして定期実行したりすることも可能です。

[公式ドキュメント](https://cloud.google.com/functions#section-5)でもいくつかユースケースが紹介されているので、興味のある方はご確認ください。

## 利用料金について
Cloud Functions を含む Google Cloud では従量課金制が採用されています。
月毎の無料枠は以下の通りです。
- vCPU : 180,000 vCPU 秒
- メモリ : 360,000 GiB 秒
- リクエスト : 200 万リクエスト

無料枠を使い切ったのち、関数の構成と利用状況に応じた課金となります。
Cloud Functions の料金形態は[公式ドキュメント](https://cloud.google.com/functions/pricing?hl=ja)に詳しく記載されているので、確認することをオススメします。

また、ユースケースを記入すると月毎の利用料金を計算・表示してくれる[料金計算ツール](https://cloud.google.com/products/calculator?hl=ja)も用意されています。
来月の請求が怖い！という方は積極的に利用しましょう。

## Cloud Functionsの利用手順
### 1.Cloud Functions のページを開く
ナビゲーションメニューから **[Cloud Functions]** ボタンを選択
<img width="500" alt="console" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630040/378d641b-66b4-2bfb-129f-7c522d7a4750.png">



### 2.関数を作成する
**[ファンクションを作成]** を選択
<img width="400" alt="create-function" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630040/ce727893-9b29-a388-c34b-44678366e8fb.png">


API の有効化を要求されたら **[有効にする]** をクリック
<img width="400" alt="enable-api-1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630040/f1340d32-8676-ee95-eb50-78fb314fe9ac.png">


### 3.関数の構成を設定する
**[関数名]**, **[リージョン]** を任意のものに設定。
認証については **[未認証の呼び出しを許可]** を選択。
<img width="400" alt="propaty" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630040/cdb35c81-ab3c-425e-b120-93b265316a3b.png">

同様に API の有効化を許可
<img width="400" alt="enable-api-2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630040/87f6aa42-50e1-89c1-5061-b51a6b1a543d.png">



:::note info
※今回は本質部分でないため割愛するものの、認証を必要とすることで特定のアプリケーションやプロジェクトからの呼び出しに限定することも可能
:::

### 4.関数のコードを記述
本記事では Python 3.12.0 を選択。
コードを記述し終えたらデプロイをクリック。
<img width="500" alt="edit-function" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630040/7b12003f-6a5c-f8b8-bc06-996344e480f1.png">


### 5.関数をテストする
**[トリガー]** タブから **[トリガーURL]** のリンクにアクセス
<img width="400" alt="test-function" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630040/fdb41123-88f6-9593-0770-71e734f76f27.png">


実行結果
<img width="400" alt="result" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630040/4814f472-ba14-9f75-afe5-77e2068bbc4e.png">

無事関数を実行させることができました。

## まとめ
チュートリアルを読みながら30分程度で Cloud Functions 上に API をデプロイすることができました。
開発初心者にもおすすめできるほどお手軽なのにも関わらず、他のサービスとの連携性も高いと感じました。月毎に 200 万リクエストまで無料なので、小規模のプロジェクトであればコスパ良く利用できそうです。


## 参考文献

https://cloud.google.com/functions/docs/tutorials/http?hl=ja

https://cloud.google.com/functions/pricing?hl=ja

https://cloud.google.com/products/calculator?hl=ja
vtk エラーメッセージ対応

## 問題

### 起動できない
内容
なし

対応方法
```c++
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
```


### vtkOpenGLTextMapper
内容
```
vtkOpenGLTextMapper (00000215058638F0): Could not locate vtkTextRenderer object.
```
対応方法
```c++
VTK_MODULE_INIT(vtkRenderingFreeType);
```
スタンバイを辞めようと思っています。

スタンバイを辞めることにした。
カッコイイ退職エントリーを書きたい。
<br>
でも、時期は決めてない。
なぜなら、やり遂げたいことが全くと言っていいほど実現していないからだ。
<br>
<br>
100人中97人が知らないであろうスタンバイをより多くの人に知ってもらいたい。スクラムプロダクトオーナーとしての力をつけていきたい。社内のド真ん中にバーを作りたい。全社合宿に行きたい。どうせなら海が良い。そうだ、これを機に「退職予告エントリー」という新たなカテゴリを作ろう。職場のオフィスビルにコンビニが欲しい。マーケティング組織を築きたい。魅力的な仲間を増やしたいし、関わった人をハッピーにしていきたい。21世紀を代表する会社を創りたい。日常に「！」を届けたい。LINEヤフーやビジョナルと新しい可能性を、次々と、生み出したい
<br>そして、「まぁそーいうもんだよねぇ」と”当たり前”に受け入れられてしまっているストレスの多い求人探し体験に、新しい価値をもたらしたい。
<br>
物心ついてからは
「今しかできないこと」「誰もやってないこと」
を基準に選択してきた。単純にその方が楽しそうだからだ。
結果、うまくいってきたし、根拠は無いけど、なんとなくこれからもうまくいく気がする。
<br>
*
<br>
2021年7月に某広告代理店からスタンバイに入ったのも、日本中見渡してもこんなユニークな環境は今ココにしか無いだろうな、と思ったから。
JVとはいえ、設立2年目のスタートアップだったし、それでいて既に大手人材企業からマーケットを知り尽くしている優秀な方々が在籍してたし、ZHD（当時）もビジョナルも親会社という、ヒトモノカネが贅沢に揃った環境の中、求人というレガシーな業界で解決できそうでできていない闇を「求人検索エンジン」という形で解決しようとしていた。
<br>
入社から2年が経ち、正直、何か変わったのか、変わってないのか、よくわかっていない。
確実に言えるのは、いつの間にか月間ユーザー数が1000万人以上を超え、社内の顔ぶれが大きく変わったこと。

「まぁ失敗してもネタになるし、上手くいったら、それはそれで嬉しいかなー」。
変わっていないのは、このゲーム感覚。

>運命がカードを混ぜ、我々が勝負する。

よく知らないけど、アルトゥル・ショーペンハウエルって人が言ってたらしい。
※この物語はフィクションです。
VTKでBoundingBox計算しない設定

## 方法SetUseBounds
`vtkActor`の`SetUseBounds(false)`を使う方法で、ActorのBoundingBoxを計算しないことができます。

## サンプルコード

```c++
vtkSmartPointer<vtkLineSource> lineSource = vtkSmartPointer<vtkLineSource>::New();
lineSource->SetPoint1(0, 0, 0);
lineSource->SetPoint2(1, 1, 1);


vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(lineSource->GetOutputPort());

vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
actor->SetVisibility(true);
actor->SetUseBounds(false); // BoundingBox計算しない

vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);

vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);

vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);

renderWindow->Render();
renderWindowInteractor->Start();
```
Git – 現在ブランチの状態をリモートの状態に強制リセットする .gitconfigのエイリアス設定

# 例

コマンドで言うと

```
git fetch
git reset --hard origin/<現在チェックアウトしているブランチ>
```

っていうことをやりたい

# .gitconfig

.gitconfigでエイリアス設定する

```
[alias]
  current = !git symbolic-ref --short HEAD
  reset-current = !git fetch && git reset --hard origin/$(git current)
```

# 実行

```
git reset-current
```

# チャットメンバー募集


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

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


# Twitter

https://twitter.com/YumaInaura
AndroidStudioからのGit操作でJava to Kotlinの差分を見やすくする

:::note info
これは [ZOZO Advent Calendar 2023](https://qiita.com/advent-calendar/2023/zozo) シリーズ4の2日目の記事です。
:::

## 何がどうなるのか？
JavaのKotlin変換はAndroidStudioで [Code] -> [Convert Java File to Kotlin File] で自動でできますが、fileのrenameとコードの書き換えが同時に行われるので差分がわかりにくいと思います。

![スクリーンショット 2023-11-30 9.41.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149859/77cfcfe1-747e-cb9e-39af-cee0db46f5b5.png)

![スクリーンショット 2023-11-30 9.42.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149859/4ab71fbc-13f2-074c-862b-b0ab1bf93cff.png)

こんな感じですね。これがAndroidStudio上のgitでcommitすると、renameと自動変換を２つのcommitに分けてくれて、２つ目のcommitの差分が以下のよう見やすくなります
![スクリーンショット 2023-11-30 9.49.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149859/4edbda30-ee3c-4f90-f53e-c2da85ff6479.png)
基本的に自動変換のみでkotlin化の作業は終わらず、この後の手動修正のことも考えると、この差分が見れると確認すべき箇所が絞りやすくなり、レビューが捗ると思います。

## 確認環境
Android Studio Flamingo | 2022.2.1 Patch 2
Android Studio Giraffe | 2022.3.1 Patch 4



## やりかた

### Git連携
Git連携についてはgitで管理されているProjectをひらけば使えるようになっていると思います（あまり何か設定をした記憶がない)
メニューがVCSじゃなくてGitになっていれば多分大丈夫です。

![スクリーンショット 2023-11-30 10.04.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149859/4b35a1d3-ecd4-a758-6a4b-3e3f916737dc.png)

もしVCSの状態の場合は参考になりそうな記事がありましたので[本ページ末尾](#参考関連記事)に載せさせていただきました。


### 操作方法
対象となるJavaファイルを開いた状態で[Convert Java File to Kotlin File]を実行します。（ここまではいつも通りです）
![スクリーンショット 2023-11-30 15.43.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149859/cd582c7d-964c-fbc3-b341-89bb465a48e2.png)

AndroidStudioの左側のメニューにあるCommitタブを選択します
![スクリーンショット 2023-11-30 15.47.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149859/724f40c8-b589-0f78-0cd9-1d98e78ffd46.png)

差分を全て選択し、コミットコメントを入力してcommitボタンをクリック
![スクリーンショット 2023-11-30 15.50.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149859/77be1c96-8e97-fbd3-e9e1-3dd065b06f81.png)
（今回は検証のためwarrning出ていますが無視してcommitしました）

ボトムメニューにあるgitを選ぶと２つのcommitがされているのが確認できます
![スクリーンショット 2023-11-30 15.52.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149859/0d49c382-13d5-b8b1-9f41-283e54cb27aa.png)

２つ目のコミット（FirstFragmentをKotlin化）の差分をgithubで見ると、冒頭で掲載したような以下のような形で差分が確認できます
![スクリーンショット 2023-11-30 9.49.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149859/4edbda30-ee3c-4f90-f53e-c2da85ff6479.png)

## 参考・関連記事
 ・ [(Qiita)Android Studio 使うなら Git と連係しておきましょうという話](https://qiita.com/hkusu/items/45fc32a46efcb7d9a44a)
 ・ [【開発Tips】AndroidStudioでのGit管理](https://inomacreate.com/androidstudio-git/)
【Android／Java】アプリ間データ共有（Android11）

## やりたいこと
アプリ間でデータの共有を行いたい
片方のアプリがプロセスKillされている状態でもデータの参照を行えるようにしたい

非推奨だが、SharedUserIDを使って実現できたので、その備忘録

## Step1．SharedUserIDとは
アプリＡ、アプリＢを同一UserIdで実行することで、アプリＡからアプリＢの情報を参照することが可能な機能
UserIDは、"adb shell"でコマンドラインに入った後、"ps -A"コマンドでプロセス一覧を参照
以下の例では、UserIDが"u0_a56"のアプリが2個存在しているのが確認できる
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468893/b7bd4b69-44a5-bb3c-6824-06eaa27fae2c.png)

UserIDが同一の場合、アプリＡのSharedPrefrenceの内容を、アプリＢからも参照することが可能となる


## Step2．実装方法
２アプリのパッケージ名を以下とした場合の説明
|アプリ名|パッケージ名|概要|
|---|---|---|
|アプリＡ|jp.co.hoge|SharedPrefrenceに書き込み|
|アプリＢ|jp.co.fuga|アプリＡのSharedPrefrenceを読み込む|

#### AndroidManifest.xml（アプリＡ）
~~~xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:sharedUserId="jp.co.hoge"
    android:sharedUserMaxSdkVersion="31">

    <application
     :（略）
~~~~

#### AndroidManifest.xml（アプリＢ）
~~~xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:sharedUserId="jp.co.hoge"
    android:sharedUserMaxSdkVersion="31">

    <application
     :（略）
~~~~

#### MainActivity.java（アプリＡ）
~~~java
protected void onCreate(Bundle savedInstanceState) {
    SharedPreferences sharedPref = getSharedPreferences("shared_test_read", Context.MODE_PRIVATE );
    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putString("test_test", "abcdefg11111");
    editor.apply();
　　　：
~~~~

#### MainActivity.java（アプリＢ）
~~~java
protected void onCreate(Bundle savedInstanceState) {
    try {
        Context c = createPackageContext("jp.co.hoge", CONTEXT_INCLUDE_CODE);
        SharedPreferences share = c.getSharedPreferences("shared_test_read", Context.MODE_PRIVATE);
        String readText = share.getString("test_test", "none");
    } catch (PackageManager.NameNotFoundException e) {
    }
~~~~

### 解説
1. AndroidManifest.xml（アプリＡ）：sharedUserIdに公開するパッケージ名を記載
1. AndroidManifest.xml（アプリＢ）：sharedUserIdに参照するアプリのパッケージ名を記載
1. MainActivity.java（アプリＡ）：一般的なSharedPrefrenceの書き込み
1. MainActivity.java（アプリＢ）：createPackageContext()でアプリＡのコンテキストを取得。以降は、コンテキストでアプリＡのSharedPrefrenceにアクセスして読み込む。参照するアプリが見つからない場合は、NameNotFoundExceptionが発生する


### 最後に
実装量も少なく、また参照先アプリのプロセスがAliveである必要もないことから便利だが、API29から非推奨となっている

ContentProviderを使うのが一般的だと思うが、簡単にできる仕組みとしてのメモ書きです
　
　
参考) https://developer.android.com/guide/topics/manifest/manifest-element?hl=ja
【PostgreSQL】プロセス構成について

## 初めに
PostgreSQLのプロセスを知ることで、中で何が起きているのかを理解することができるようになります。例えばクエリ処理だけでなく、バッファの管理、ストレージへの書き込み制御、統計情報の収集などについてです。早速理解を深めていきましょう。

## この記事で得られること
この記事を読み終えることで以下のメリットがあります。
- PostgreSQLのプロセス構成の理解が深まる
- PostgreSQLが好きになる。

## プロセス構成
PostgreSQLのプロセスは以下のように構成されている
![プロセス構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572072/4a66de84-78e4-25a9-f958-5daa00fb519c.png)

それぞれのプロセスの詳細は以下の通り
| プロセス名 | 説明 |
|:-:|:-:|
| マスタサーバプロセス | 最初に起動される親プロセス |
| ライタプロセス | 共有バッファのデータをデータファイルに書き出す |
| WALライタプロセス | WALをディスクに書き出すプロセス。WALバッファに書き込まれたWALをWALファイルに書き出す |
| チェックポインタプロセス | チェックポイントを設定に従い、自動的に実行するプロセス |
| 自動VACUUMランチャ | 設定に従って自動バキュームワーカを起動する |
| 自動VACUUMワーカ | 設定に従って自動バキューム処理を行うプロセス |
| 統計情報コレクタプロセス | データベースの活動状況に関する稼働統計情報を一定感覚で収集するプロセス |
| バックエンドプロセス | クライアントから接続要求を受けたときに生成されるプロセス |
| パラレルワーカプロセス | パラレルクエリが実行される際に、バックエンドプロセスから起動されるプロセス |
| ロガー | PostgreSQLのログをファイルへ書き出す |
| WALセンダ | レプリケーション時にWALをスレーブサーバに転送する |
| WALレシーバ | レプリケーション時にWALをマスタプロセスから受信する |
| バックグラウンドワーカ | ロジカルレプリケーション用のワーカ。 |

## プロセスの動き方
それぞれのプロセスについて把握したところで、次にプロセスがどのような動き方をするのか理解を深めていきましょう。

### PostgreSQLサーバーの起動時
1. postgres(マスタサーバ)が起動、以下のサブプロセスをフォーク
    a. WALライタ
    b. ライタ
    c. チェックポインタ
    d. 統計情報コレクタ
    e. 自動バキュームランチャ

### クライアント接続からSQLの実行
1. psqlやアプリからPostgreSQLサーバーに接続を要求すると、postgres(マスタサーバ)は新しいバックエンドプロセスをフォークする
2. トランザクションが開始後の変更はWALバッファに記録され、設定に応じてWALライタによってディスク状のWALファイルに書き込みをする
3. コミットされるとバックエンドプロセスにて変更をデータファイルに書き込む。

### autovacuum
1. PostgreSQLサーバが起動すると、postgres(マスタサーバ)は自動バキュームランチャプロセスを起動する
2. 自動バキュームランチャはデータベース内ののテーブルの状態を監視、バキューム処理の必要性を判断する
3. dead tuple(不要領域)の数が閾値に達すると、自動バキュームランチャはそのテーブルに対してバキューム処理をトリガーする。

## まとめ
PostgreSQLの中では様々なプロセスが必要に応じて動いています。
これらを理解することで障害やパフォーマンス向上のためにPostgreSQLの中で何が起きているのかを的確に理解して活かすことができる考えています。
是非ともより一層PostgreSQLについて理解を深めていきましょう！
AgileJapan2023に参加しました

お久しぶりです！FRです。

前回の記事から2年程経ってしまいました。現在もアジャイル案件に入りのびのびと開発を行いつつ、社内に向けてアジャイルの普及活動を行っています。
また、OJTとして新人教育も行っています！（私もこの間まで新人だったのに・・・）

さて、今回は人生初のAgile Japanに参加したのでその感想を書いていきます。

![AgileJapan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1250958/fc789169-4831-4d06-3b68-f9e557ec4699.png)
https://2023.agilejapan.jp/



## Agile Japan2023テーマ

今回のAgile Japanのテーマは「Rebuild」でした。実際にアジャイル開発を体験し、アジャイルの良さを知る人が増えてきた中で、今度は組織全体や日本ビジネスにどうやってアジャイル要素を取り入れるか。といった内容が登壇にも多くあった印象でした。



## 体験したからこそ良さがわかる

「都庁アジャイルプレイブック」を紹介してくれた杉井さん＆下家さんの講演です。コロナ禍をきっかけに都民のニーズに応えられるサービス提供を行わないといけない状況になり、迅速かつ柔軟にプロダクトを開発するアジャイル手法を取り入れたとのことでした。講演資料の中に記された「体験したからこそ良さがわかる」という一言にとても共感しました。アジャイルについて何も知らなかった私も実際にアジャイル開発に参加し、やり方を模索しながらも楽しく学ぶことができ自分の成長に繋げることが出来ました。その経験はプラスのことばかりだったなと再認識しました。

都庁アジャイルプレイブックは[こちら](https://shintosei.metro.tokyo.lg.jp/post_cp2_230517/)からダウンロードできます！



## 傾聴から相手との距離を縮めていく

kawagoiさんの登壇内で傾聴のワークを行いました。短時間で初対面の人の悩みを聞くという不思議な空間でしたが、実際にすごい話しやすくワーク後も相手の方と話し込んでしまうほど相手との距離が縮まりました！QAタイムに挙がったついアドバイスをしてしまいたくなる時はどうすればいいかという質問に対し、他の人にその気持ちを傾聴してもらうとアンサーされており、面白い回答だなと思いながらもとても納得しました！



## 交流

休憩時間やネットワーキングタイムにスポンサーブースも見に行きました～！

参加者が思うスクラムの価値基準アンケートを取っていたり、アジャイルを進めていくうえでヒントになりそうな冊子を配布していました。私が見た時は透明性・勇気・尊敬の票が多く、どれも大切だよなぁと納得していました。（ちなみに私は勇気に入れました！）

また、ネイルシートやお守りなど普段のイベントでは見かけないような個性的なグッズも配っていました！
![image-20231128094712084.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1250958/ffa942db-717a-7b09-a3ef-f30ddfedb425.png)






## 全体を振り返った感想

普段は社内コミュニティのみでアジャイルに触れていたこともあり、想像よりもAgileJapanの参加者がとても多いというのが最初に抱いた感想です。こんなにアジャイルに興味を持っている人が多いんだと感動＆圧倒されました！！

また、組織・ビジネスとしてのアジャイル化をテーマにしている登壇が多く、私が普段持たない視点から学べることが多かったです。

このイベントで得た刺激を活かしてアジャイルコミュニティをもっと活発化させていきたいです！！（いつか登壇もしてみたいな）
Ubuntuでディスク関連

- 2 TB以下のディスクをマウントするとき：
  `fdisk`を用いる。  
  [このサイト](https://zenn.dev/tochiman/articles/a3c4ace8e20874)がわかりやすい。

- 2 TB以上のディスクをマウントするとき：
  `gdisk`を用いる。  
  [このサイト](https://www.nemotos.net/?p=3132)がわかりやすい。  
  ただし、`mkfs.ext4`でext4にするときには作成したパーティションを指定するほうがよいだろう。
  ```
  sudo mkfs.ext4 /dev/sde1
  ```
  みたいに。
  自動マウントの方法は`fdisk`の方の[サイト](https://zenn.dev/tochiman/articles/a3c4ace8e20874)に載っている。

- マウントしてあるディスクのフォーマットを確認するとき
  ```
  df -hT
  ```
- マウントしていないディスクのフォーマットを確認するとき
  ```
  lsblk -f
  ```
Ruby – How to check instance variable defined? -> e.g defined?(@a)  ( Rubyでインスタンス変数が定義済みのことをチェックする )

# Code

Defined

```rb
@a = nil

defined?(@a) # "instance-variable"

!!defined?(@a) # true
```

Undefined 

```rb
defined?(@b) # nill

!!defined?(@b) # false
```


# チャットメンバー募集


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

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


# Twitter

https://twitter.com/YumaInaura
【AWS re:Invent 2023】ネットワーキングができる場所3選+α


# はじめに

2023年11月29日（現地時間）、re:Invent 2023の3日目となりました！

KeyNoteで発表される新サービスのセッションが次々と公開され、毎日スケジュールの調整と情報収集に奔走しています:joy:

今回は、AWS re:Inventに現地で参加する大きな目的の1つ、ネットワーキングに焦点を当て、名刺交換が可能な場所をいくつか紹介します！

普段お目にかかることのできない多くの企業が参加しているので、ぜひこの機会に積極的なネットワーキングをお試しください。

re:Inventに参加される皆様の参考になれば幸いです。

# KeyNote会場

KeyNote会場でネットワーキングができる可能性がある場所は２箇所です。

### 同時通訳機貸出の列
多くの日本語同時通訳機を借りる方々は日本から来たと考えられますので、列に並んでいる間に後ろを振り返って目が合ったら「はじめまして！」と声をかけてみましょう:sunglasses: 

もし相手が反応しなかったら、それは周りが騒がしいためかもしれません。気にせず、次のチャンスでネットワーキングを行いましょう！

### 自席の前後左右
隣の席の人は特に話しかけやすいと思います。席に着くタイミングでさりげなく話しかけてみると、Keynoteが始まるまで会話を楽しむことができ、自然とネットワーキングできます。

# meal会場

一度訪れた方はご存知だと思いますが、食事会場は非常に広いです！以下の写真はMGMグランドの食事会場ですが、メイン会場であるVenetianの食事会場はさらに広いです。

![IMG_0088.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/7ff889f7-d8ac-93c4-1a8c-1d4f5609de46.jpeg)

テーブルは大きめで、ほとんどが相席となります。1人で食事をしている方も多く、話しかけやすいですからネットワーキングには絶好の場だと言えます。

複数人で座るテーブルに加われば、ランチを楽しみながら気軽に会話ができ、新たな出会いがあるかもしれません。是非ともお試しください！

# 認定者ラウンジ

作業中の方に話しかけるのは難しいですし、仕事をしている可能性も高いので避けましょう。しかし、ラウンジ内にいるその他の方々は、AWSの知識を持ち、re:Inventに参加している意識の高い方々です。ネットワーキングの絶好のチャンスと言えます！

re:Inventでネットワーキングする際は、セッションについて話し合うことで、会話が弾むことが多いと私は感じています。

re:Inventでのネットワーキング時の話題は、セッションについてお話することで場をつなげる事が非常にいいなと思っています。

# （ジャパンツアー参加の場合）Japan Night会場

今回、私たちは近畿日本ツーリスト社が主催するジャパンツアーに参加し、Japan Night（日本企業が集まるネットワーキングの食事会）でネットワーキングを行うことができました。

![IMG_0142.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/149331d5-2b7f-7a08-fd44-b2a295c97bcc.jpeg)
![IMG_0140.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/8013f847-6dc2-3475-aef2-19c52bc9029c.jpeg)

日ごろはなかなかお会いすることが難しい業界の方々や、SNSでフォローしていた方々、同年代の方など、様々な方々と交流ができました。参加者は600名を超えていたそうです。このような場を提供していただけることに深く感謝しています。

私自身もかなり積極的に参加者の方々に挨拶をしましたが、情報交換やre:Inventの感想を共有できたことは、とても有意義かつ刺激的な時間となりました。さらに、AWSの学習に対するモチベーションも高まりました！

近畿日本ツーリスト社の公式TwitterでもJapan Nightの様子が投稿されていますので、是非チェックしてみてください！


https://x.com/kntawsreinvent/status/1729933949680676928?s=20


# さいごに

re:Inventではネットワーキングの機会が多数用意されていますが、ある程度の積極性は必要だなと痛感しました。

とはいえ、自分から話かけづらいですし私自身もかなり躊躇してしまう場面もあります:disappointed_relieved:
ただ、海外に来ているという事を口実にして、いい意味で少し羽目を外して積極的にコミュニケーションをとってみることをおすすめします！:airplane:


# :sparkles:弊社では一緒に働く仲間を募集中です:sparkles:
現在、様々な職種を募集しております。
カジュアル面談も可能ですので、ご連絡お待ちしております！

募集内容等詳細は、是非採用サイトをご確認ください。
https://engineer.po-holdings.co.jp/
AWS SecurityHubについて

[AWS 公式ドキュメント](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/what-is-securityhub.html)

## 概要

AWS Security Hubは、AWS上でのセキュリティとコンプライアンスの中央集権的な管理、監視、および洞察を提供するサービスです。主な機能としては以下のようなものがあります。

1. **セキュリティ状態の集約**:
   - AWSアカウント内のセキュリティアラートやエンティティの状態を集約し、一元的なダッシュボードで可視化します。
   - AWS GuardDuty、Inspector、Macie、CloudTrailなどのサービスからのセキュリティ情報を集めます。

2. **自動的なセキュリティチェック**:
   - AWSのベストプラクティスに基づいた自動チェックを行い、セキュリティベストプラクティスに準拠しているかを評価します。
   - セキュリティの脅威や不正行為を検出し、通知や警告を提供します。

3. **統合された洞察と分析**:
   - セキュリティイベントや脆弱性情報、コンプライアンスステータスなどの情報を統合して分析し、洞察を提供します。
   - カスタムのアクションを設定して、セキュリティイベントに対する対応や自動化を行います。

4. **コンプライアンスの維持**:
   - コンプライアンスステータスを評価し、PCI DSS、HIPAAなどのコンプライアンス規格に準拠しているかを確認します。
   - リソースのセキュリティステータスに基づいて、コンプライアンスへの準拠度を評価します。

AWS Security Hubは、AWS環境でのセキュリティとコンプライアンスの管理を容易にし、セキュリティの検出、対応、改善のための貴重なツールとして利用されています。

## AWS Security HubとAWS Audit Managerの違い

AWS Security Hubは、AWSアカウントとリソースのセキュリティ状況を一元的に監視するサービスです。
Security Hubは、AWSの他のセキュリティサービスやパートナー製品からセキュリティ情報を収集し、AWSが提供するベストプラクティスや業界標準に基づいて評価します。
Security Hubは、セキュリティの優先順位を決めるためにスコアやグラフを表示し、セキュリティの問題に対してアクションを実行するために自動化ルールやワークフローを提供します。

AWS Audit Managerは、AWSアカウントとリソースのコンプライアンス状況を継続的に監査するサービスです。
Audit Managerは、AWSが提供するフレームワークやパートナー製品からコンプライアンス要件を選択し、それに対応するエビデンスを自動的に収集します。
Audit Managerは、エビデンスの整理や分析を支援し、監査レポートや証跡ファイルを作成します。

Security HubとAudit Managerの違いは、以下のようにまとめられます。

- Security Hubはセキュリティに焦点を当てており、Audit Managerはコンプライアンスに焦点を当てています。
- Security Hubはセキュリティ情報を収集して評価し、Audit Managerはコンプライアンス要件に対応するエビデンスを収集して整理します。
- Security Hubはセキュリティの問題に対してアクションを実行することができますが、Audit Managerは監査レポートや証跡ファイルを作成することができます。
gas Query関数で疑似外部結合「INNER JOINやLEFT JOIN」を実現できる？（備忘録)

# Query関数で疑似外部結合を実現できる？
結果から言うとQuery関数には残念ながら、INNER JOINやLEFT JOINのような結合に関するオプション項目がありません。

ではどうすれば、Query関数で疑似外部結合実装できるでしょうか
実現させる方法として、VLOOKUPとARRAYFORMULA関数を組み合わせることです。

```
➀
=query({D2:E5,iferror(arrayformula(vlookup(F2:F5,A2:B4,2,false)))})
➁
=query({D2:E5,iferror(arrayformula(vlookup(F2:F5,A2:B4,{2,3},false)))}
➂
=query({D2:E5,iferror(arrayformula(vlookup(F2:F5,QUERY(A2:B4),{2,3},false)))})
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/bb105453-543f-b4e8-a210-0f6c22e19b6b.png)

# その他いろいろ参考
https://officeforest.org/wp/2019/04/26/query%E9%96%A2%E6%95%B0%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E9%9B%86%E8%A8%88%E3%81%97%E3%82%88%E3%81%86-%E5%85%B6%E3%81%AE%E5%BC%90/
【SQL Server】INSERTした行のAUTO_INCREMENTを取得するベストプラクティス

## 概要
1行のINSERTなら`SELECT SCOPE_IDENTITY()`で取得すればいいのでしょうけど、
複数行のINSERTを考慮した際、手法がいくつかあるのでベンチ測ってどれがベストか調査してみました。

## パターン1 ～愚直に繰り返す～

```sql
INSERT INTO [User] ([Name], [Email], [AccountId]) VALUES (@Name, @Email, @AccountId);
SELECT SCOPE_IDENTITY()
```
↑これを複数回実行する

## パターン2 ～1つのSQLに纏めただけ～

```sql
INSERT INTO [User] ([Name], [Email], [AccountId]) VALUES (@0_Name, @0_Email, @0_AccountId);
SELECT SCOPE_IDENTITY();
INSERT INTO [User] ([Name], [Email], [AccountId]) VALUES (@1_Name, @1_Email, @1_AccountId);
SELECT SCOPE_IDENTITY();
INSERT INTO [User] ([Name], [Email], [AccountId]) VALUES (@2_Name, @2_Email, @2_AccountId);
SELECT SCOPE_IDENTITY();
INSERT INTO [User] ([Name], [Email], [AccountId]) VALUES (@3_Name, @3_Email, @3_AccountId);
SELECT SCOPE_IDENTITY();
INSERT INTO [User] ([Name], [Email], [AccountId]) VALUES (@4_Name, @4_Email, @4_AccountId);
SELECT SCOPE_IDENTITY()
```

## パターン3 ～OUTPUT句を使う～

```sql
INSERT INTO [User] ([Name], [Email], [AccountId])
OUTPUT inserted.[Id] VALUES
  (@0_Name, @0_Email, @0_AccountId),
  (@1_Name, @1_Email, @1_AccountId),
  (@2_Name, @2_Email, @2_AccountId),
  (@3_Name, @3_Email, @3_AccountId),
  (@4_Name, @4_Email, @4_AccountId)
```

## 結果

| Method   | Mean       | Error    | StdDev   | Gen0   | Allocated |
|--------- |-----------:|---------:|---------:|-------:|----------:|
| パターン1 | 1,049.8 us | 19.93 us | 32.18 us | 5.8594 |  12.28 KB |
| パターン2 |   811.9 us |  8.43 us |  7.89 us | 4.8828 |  11.17 KB |
| パターン3 |   259.4 us |  5.13 us |  5.71 us | 4.3945 |   9.82 KB |

**OUTPUT句を使うパターンが圧倒的に優れている**ことが分かりました。
おそらく単一行の場合もこの手法がベストかと思います。

ただし、これはSQL Serverの機能であるためMySQLなどでは使うことができません。
~~似たような機能を探してはみたものの見つけられませんでした。
MySQLの場合同時に挿入した時は連番が保証されているらしいので`SELECT LAST_INSERT_ID()`を１回行えば逆算できるらしい(自信無い)。~~

### MySQL/MariaDB/SQLiteの場合
`INSERT INTO User (Name) VALUES (@0_Name), (@1_Name) RETURNING Id`が同等の機能です。
pythonを昨日から学び始めた。

昨日から、pythonを侍テラコヤと言うサイトで学んでいる。
毎日、学習に1時間、コードの写経に1時間、計2時間勉強するようにしている。
コードを写経すると、だいぶ覚えられるので良い。
この調子で学んでいけたら、と思っている。
wslでelixir その112

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

# 練習問題
Livebookでd3のpackを、Mapから作れ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8364abb9-499f-d971-59f1-f813d2f6b586.png)

# サンプルコード

```
defmodule KinoD3.Pack do
  use Kino.JS

  def new(html) do
    Kino.JS.new(__MODULE__, html)
  end

  asset "main.js" do
    """
    import "https://d3js.org/d3.v5.min.js";
    export function init(ctx, json) {
      const chartid = document.createElement("div");
    	chartid.id = "out";
    	ctx.root.appendChild(chartid);
    	var obj = JSON.parse(json); 
      var root = d3.hierarchy(obj);
      root.sum(function(d) { 
        return d.value; 
      });
      var pack = d3.pack().size([500, 500]).padding(1);
      pack(root);
      var node = d3.select('#out')
        .append("svg").attr("width", 600).attr("height", 600)
        .selectAll(".node").data(root.descendants()).enter()
        .append("g").attr("transform", function(d) { 
          return "translate(" + d.x + "," + (d.y) + ")"; 
        });
      var color = ["orange", "Khaki", "Ivory"];
      node.append("circle").attr("r", function(d) { 
        return d.r; 
      }).attr("stroke", "black").attr("fill", function(d) { 
        return color[d.depth]; 
      });
      node.append("text").style("text-anchor", function(d) { 
        return d.children ? "end" : "middle"; 
      }).attr("font-size", "150%").text(function(d) { 
        return d.children ? "" : d.data.name; 
      });
    }
    """
  end
end

%{
  "children" => [
    %{"name" => "B", "value" => 25},
    %{
      "children" => [
        %{"name" => "D", "value" => 10},
        %{"name" => "E", "value" => 15},
        %{"name" => "F", "value" => 10}
      ],
      "name" => "C"
    },
    %{"name" => "G", "value" => 15},
    %{
      "children" => [
        %{"name" => "I", "value" => 20},
        %{"name" => "J", "value" => 10}
      ],
      "name" => "H"
    },
    %{"name" => "K", "value" => 10}
  ],
  "name" => "A"
}
|> Jason.encode!()
|> KinoD3.Pack.new()

```

以上。
Blazor wasmがiOSで動かない時の解決方法

## TL;DR
*index.html* ファイル内の `<script src="_framework/blazor.webassembly.js"></script>` の前に `<script>var Module;</script>` を入れることで解決

## この問題について
### 問題発生条件
- OS: iOS
- ブラウザ: Safari, Chrome, Opera (検証したブラウザ全部)

![エラー画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2769460/07447608-10d4-c987-643a-9b0d4a4a32f5.png)
↑のようなエラーが発生し、画面が読み込まれない
(このスクリーンショットではロードがされているが、実際はロードが98%ぐらいのところで止まっているため、サイドバーや文字は表示されない)

### 解決方法
`プロジェクト名/wwwroot/index.html` を以下のように編集する
```diff_html
<!DOCTYPE html>
<html lang="ja">

<head>
    ...省略...
</head>

<body>
    <div id="app">
        ...省略...
    </div>

    <div id="blazor-error-ui">
        ...省略...
    </div>

	<script src="css/bootstrap/bootstrap.min.js"></script>

+	<script>var Module;</script>
    <script src="_framework/blazor.webassembly.js"></script>
    <script>navigator.serviceWorker.register('service-worker.js');</script>
</body>

</html>
```
---
### 参考
- https://stackoverflow.com/questions/59033066/why-blazor-wasm-project-did-not-load-on-ios-on-a-ipad-and-iphone