OmniAICreator/Qiita-1.07M huggingface dataset:
[AWS Q&A 365][Pinpoint]Daily Five Common Questions #15

# 1. What is Amazon Pinpoint? 
Answer: Amazon Pinpoint is a marketing automation service that helps businesses to engage their customers across multiple messaging channels like email, SMS, voice, and push notifications. 

# 2. What are the features of Amazon Pinpoint? 
Answer: Amazon Pinpoint allows businesses to define audience segments, engage their audience with messaging campaigns, create user journeys, provide consistent messaging with templates, deliver personalized content, and analyze user behavior. 

# 3. How can I get started with Amazon Pinpoint? 
Answer: To get started with Amazon Pinpoint, you need to create a project, import data and create a segment, create a campaign, and view campaign analytics. The Amazon Pinpoint User Guide provides step-by-step instructions on how to do this. 

# 4. What are the different channels supported by Amazon Pinpoint? 
Answer: Amazon Pinpoint supports multiple messaging channels like email, SMS, voice, and push notifications. It also provides support for in-app messages and custom channels. 

# 5. How can I monitor and analyze the performance of my campaigns in Amazon Pinpoint? 
Answer: Amazon Pinpoint provides detailed analytics and metrics to monitor the performance of your campaigns. You can view metrics related to message delivery, endpoints, import jobs, one-time passwords, and events. You can also create CloudWatch alarms and export dashboards to analyze your data.
標準入力で入ってきたテキストをGoogle Chatに飛ばすってPython script書いたよ、って記事

## やってること
標準入力で入ってきたテキストを  
Google Chatに飛ばすってだけ。

## 用途
時間がかかるコマンドが終わったときに  
手元に通知が来るのが欲しかったんで、  
そんな感じでの用途を考えてます。

なので、
```bash
$ ls | python3 stdin2chat.py
```
って感じで、出力された内容をそのまま渡せば、  
あらかじめ設定したチャットに  
メッセージとして飛んできます。

既存のテキストファイルでも
```bash
$ cat exsample.txt | python3 stdin2chat.py
```
って感じで飛ばすことができます。

## 用意するもの
Google chatのWebhook

## 設定
webhookの値をご自身の環境のものに書き換えれば  
使えるんじゃないかと

## コード
```python
'''
	input
		STDIN
	output
		Google Chat

	sample
		$ ls | python3 stdin2chat.py
'''
import sys
import textwrap
import requests
import json

# google chat Webhook
Webhook  = 'https://chat.googleapis.com/v1/spaces/xxxxxxxxxxxx/messages?key=xxxxxxxxxxxxxxxxxxxxxxxxxxx'

ChatText = textwrap.dedent('''
	```
	{StdinText}
	```
''').format(
	StdinText = sys.stdin.read().strip(), 
	).strip()

# Send Webhook
response = requests.post(
    Webhook,
    json={"text": ChatText}
)
```
## これから
とりあえず動いてる状態での公開。  
手元ではオプションで送信先をSlackや  
別のサービスとかに飛ばせるようにしてるのがあるので、  
きれいに書き直す時間ができたらそちらも公開しようかと。
REST APIについて自分なりにまとめてみた

## はじめに
本記事は私自身が`REST API`について学んだことに関する備忘録であることをご理解ください。
様々な資料や記事を読んで、自分の言葉でアウトプットしたものになります。

## APIとは
まずは、「APIが何者なのか？」というところから。

「**A**pplication **P**rogramming **I**nterface」の頭文字をとったものを**API**と呼びます。

- Application = アプリケーション、ソフトウェア
- Interface = インターフェース、接点

**ざっくりいうと、ソフトウェアやプログラム同士を繋ぐものがAPIです。**

例えば、TwitterやInstagramなどのSNSのAPIを利用することで、他のアプリケーションにそれぞれのSNSの情報を提供することが可能です。

アプリケーションにAPIという外部とやりとりする窓口を作り、他のアプリとコミュニケーションやができる状態にすることを、「APIを公開する」などと言ったりします。

このAPIを公開することで、第三者がその情報を活用して新たな機能を開発する。

そうすることによって機能を拡張させ、①APIを公開する側②APIを利用する側の両者にとってwin-winの状態を作り出すこと（便利になることやサービスが発展していくこと）がAPIの目的となります。

## RESTとは
次に「RESTは何者なのか？」について。

「**RE**presentational **S**tate **T**ransfer」の頭文字をとったものを**REST**と呼びます。

- REpresentational = 具象化された
- State = 状態
- Transfer = 転送

ざっくりいうと、具体的に状態を定義した情報のやり取りが`REST`であり、**分散システムにおいて複数のソフトウェアを連携させるのに適した設計原則**を意味します。

この`REST`には設計原則があり、その原則に従っていてRESTらしいことを「**RESTfulなシステム**」と呼んだりします。


### アドレス可読性
提供する情報がURIを通して表現できることをRESTは原則としています。

URIさえあればリソースを一意に示すことができる性質であり、URIのこの性質がなければ後に記載する接続性と統一インターフェースは実現できないものです。

### 接続性
接続性とは、リソースが別のリソースとの関連を表すリンクを持っていることを意味します。

リンクを辿ることのできないWebサービスはとても使いづらいものとなります。

### 統一インターフェース
データの作成、取得、更新、削除といった操作を全てHTTPメソッドを利用することをRESTは原則としています。
情報をやりとりする方法を統一しておくことで設計をシンプルにできます。

それぞれのHTTPメソッドは以下を使用します。
- 作成 = POST
- 取得 = GET
- 更新 = PUT
- 削除 = DELETE

| 処理 | HTTP method | URIの一例 |
|:-:|:-:|:-:|
|  リソースの作成 |  POST |  /movies |
|  リソースの一覧取得 |  GET |  /movies |
|  リソースの単体取得 |  GET |  /movies/{id} |
|  リソースの更新 |  PUT |  /movies/{id} |
|  リソースの削除 |  DELETE | /movies/{id}  |

### ステートレス性
HTTPリクエストがすべて分離・独立していることをRESTは原則としています。

ステートレスとは「状態がない」という意味ですが、ステートレスなやり取りにおいて、サーバー側ではクライアントのセッション情報を保持しません。

クライアント側からすると、都度情報を送る必要がありますが、サーバー側からすると、そのリクエスト以外監視する必要がないためとてもシンプルになります。

## REST APIとは
「では`REST API`とは何者なのか?」

>REST APIとは、Webシステムを外部から利用するためのプログラムの呼び出し規約（API）の種類の一つで、「REST」（レスト）と呼ばれる設計原則に従って策定されたもの。RESTそのものは適用範囲の広い抽象的なモデルだが、一般的にはRESTの考え方をWeb APIに適用したものをREST APIと呼んでいる。

>REST APIでは、URL/URIですべてのリソースを一意に識別し、クライアントがHTTP（あるいはHTTPS）で要求（リクエスト）を送信すると、応答（レスポンス）がXMLやHTML、JSON、CSV、プレーンテキストなどで返される。

>URLパラメータ指定により引数を渡す仕組みなどはあるものの、セッション管理や状態管理などは行わず（ステートレス）、同じURLに対する呼び出しには常に同じ結果が返されることが期待される。
>また、データの取得はHTTPのGETメソッド、書き込みならばPOSTメソッドといったように、リソースの操作の種類は極力HTTPメソッドによって指定する。結果の通知（特にエラー通知）も極力HTTPステータスコードで行うという原則が含まれることもある。

>ただし、これらの技術的な要件は厳密に共有されているわけではなく、「SOAPやRPCなどを必要としない、軽量でフラットなWebインターフェース」くらいの意味で用いられることが多い。

[IT用語辞典 e-Words](https://e-words.jp/w/REST_API.html)

要するに`REST API`とは、RESTの4原則を基に構築されたAPIのことです。
RESTは
その名前の通りですね。

## 最後に
`REST API`について簡単にまとめてみましたが、実際に自分が作るアプリケーションでもこういった設計思想を意識しながら開発を進めていきたいなと思いました。


## 参考
https://amzn.asia/d/cqJbtyR
【Git】git commitしたら"Waiting for your editor to close the file...vscode –wait: vscode: command not found"と怒られた時の対処法


# 問題
```
$ git commit
hint: Waiting for your editor to close the file... vscode --wait: vscode: command not found
error: There was a problem with the editor 'vscode --wait'.
Please supply the message using either -m or -F option.

```

エディターがファイルを閉じるのを待っていると記載がある。
恐らくファイルと閉じずにVSCodeを終了し、commitとしようとしたことが原因。

# 解決策

```
$ git config --global core.editor 'code --wait'
```

VSCodeの再設定が必要ということで上記のコマンドを入力。

# おわりに

はじめて記事を書きました。
参考にさせていただいた記事と同じような内容ですが、
実際に書くことで書きかたや内容についてより調べて理解しようとできたことがよかったです。
Qiita記事の書き方について参考になった記事がいくつかありましたので下記記載します。
今後も投稿して砕けた内容も書けるようになれたらいいなと思ってます。

# エラーについて参考にさせていただいた記事

https://qiita.com/webprofado/items/d2e6bc280d8a8ec8747a

https://yama-weblog.com/

# Qiita記事作成について参考にさせていただ記事

https://qiita.com/U-MA/items/996ae933ae94c5711883

https://qiita.com/YutaManaka/items/611069745ff0f68af879

https://help.qiita.com/ja/articles/qiita-article-guideline
WSL2のコマンドの出力をクリップボードに

# 結論
Windowsの`clip.exe`を使う
```
$ lsb_release -a |clip.exe
```

上記のコマンドを実行した結果
```
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.2 LTS
Release:        22.04
Codename:       jammy
```

Windowsで`Win+v`を押したときに出るクリップボード履歴はこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197227/66db1da8-05bf-ef62-d2b3-4e2369f65ff4.png)
Pulpのソルバーとして最新のCBCをインストールして使う方法（Windows環境）

## 1. 概要
Windows11 Anaconda環境にPulpをcondaでインストールして、デフォルトのソルバーで混合整数問題を解いていると、あるシンプルな制約を追加すると、いくら待ってもsolve()が返って来なくなった。モデルが悪いのかなと、さんざん試行錯誤したが解決できず、ソルバーを最新のCBC (2023/3/26現在で、2.10.8) に変更することにした。変更したソルバーで実行すると、最初のモデルでも問題なく計算結果を得ることができた。
参考：以下のDOWNLOADの章
[COIN-OR FoundationサイトのCBC] (https://github.com/coin-or/Cbc)

## 2. 環境
* Windows 11 Pro 22H2
* CPU: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
* Anaconda3
* Python 3.9.15
* Pulp 2.7.0 


## 3. 実際にやった手順
手順は、以外と簡単で、
1. インストール
    * [CBCの最新リリース] (https://github.com/coin-or/Cbc/releases) から、自分の環境にあったファイル、Winodwsの場合はCbc-releases.2.10.8-i686-w64-mingw32.zipをダウンロードして解凍する。

    * 解凍してできたフォルダ(Cbc-releases.2.10.8-i686-w64-mingw32)を、好きな場所に移動する。私の場合は、以下に移動した。
    C:\Users\ユーザ名\anaconda3\envs\仮想環境名\lib\site-packages\pulp\solverdir\

2. Pulpでソルバーを指定して実行
インストールしたcbc.exeのパスを指定して、ソルバーを生成し、ソルバーを指定してsolve()を呼び出す。
    ```
    solverPath=r'C:\Users\ユーザ名\anaconda3\envs\仮想環境名\lib\site-packages\pulp\solverdir\Cbc-releases.2.10.8-i686-w64-mingw32\bin\cbc.exe'
    solver = pulp.COIN_CMD(path=solverPath)
    model.solve(solver)
    ```
【iOS】TestFlightにアップロードしようとして、ストアアイコンでエラーになった

普段はandroidエンジニアをしているのですが、iOSの方も勉強を始めて、TestFlightにアップロードしようとしたらエラーになったので自分のメモとして、記事にしておきます。


# 今回のエラー
```
Invalid App Store Icon.
 The App Store Icon in the asset catalog in 'app_name’ can't be transparent nor contain an alpha channel. 
```

※見やすくなるように適当なところで改行入れてます。

こちら用意していた、ストアアイコンにアルファチャンネルというのが設定されてました。
画像にアルファチャンネルが設定されているか確認することができます。
Finderで画像に右クリックで情報を見るをクリックすると詳細情報の中にアルファチャンネル:の項目があるので確認できます。


# アルファチャンネルOFFにする方法
アイコンを開いて左上のファイル　→ 書き出すをクリックします。

![スクリーンショット 2023-03-26 13.25.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/7b90c538-7ee0-7553-846b-1a1f6ebf7297.png)
ここのアルファのチェックを外して書き出します。
そうするとアルファチャンネルOFFの画像が書き出せます！
【iOS】TestFlightにアップロードしようとしてでたエラーの解決

普段はandroidエンジニアをしているのですが、iOSの方も勉強を始めて、TestFlightにアップロードしようとしたらエラーになったので自分のメモとして、記事にしておきます。

# 今回のエラー
```
Asset validation failed
Missing required icon file.
 The bundle does not contain an app icon for iPhone / iPod Touch of exactly '120x120' pixels,
 in .png format for iOS versions >= 10.0. To support older versions of iOS,
 the icon may be required in the bundle outside of an asset catalog.
 Make sure the Info.plist file includes appropriate entries referencing the file. 
See https://developer.apple.com/documentation/bundleresources/information_property_list/user_interface 
```
※見やすくなるように適当なところで改行入れてます。

こちらのエラーの`'120x120'`のところが`'152x152'`　`'1024 by 1024'`もありました。
自分は知らなかったのですが、TestFlightにアップロードする場合はアプリアイコンの設定が必須見たいです。

アプリアイコンを設定したところ解決しました。

開発してると、アプリアイコンなど自分で用意することがないので、忘れちゃいますね。
【Xcode】OptimizationLevelError: not building -Onone のエラーでPreviewが表示されない

今回はSwiftUIのプロジェクトを開いたら、タイトルの`OptimizationLevelError: not building -Onone`
エラーでPreviewが表示が表示されなかったので、こちらで自分が解決した方法を残しておこうと思います。

`Xcode　Version 14.2`

こちら簡単なことでした、ビルド対象がReleaseだったからです。

なのでビルド対象を開発環境にしたら再度表示することができました。

以上です
【Flutter】hiveとfreezedを組み合わせて使う

# 背景
* `hive`の後発である`isar`を使ってエンティティクラス（`@collection`クラス）を`freezed`でimmuatbleにできないか調べていたところ、`hive`だったら似たようなことができそうなことがわかった。（`isar`ではまだできなさそう。）
* `isar`でもエンティティクラスとimmutableなクラスを分けて変換を挟めばできなくはないが、変換処理をエンティティごとに定義するのは面倒。

# まとめ
後述の参考記事を参考に以下のようにしました。（正直あんまりよくわかってません。:sob:）

* `User`は複数の`Item`を持っている。
* `HiveObject`を継承することで、`key`プロパティや`save`、`delete`メソッドを使えるようにしている。

```dart:user.dart
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:hive/hive.dart';

import 'item.dart';

part 'user.freezed.dart';
part 'user.g.dart';

@freezed
abstract class User extends HiveObject with _$User {
  User._();

  @HiveType(typeId: 0)
  factory User({
    @HiveField(0) required String name,
    @HiveField(1) required int age,
    @HiveField(2) required List<Item> items,
  }) = _User;
}
```
```dart:item.dart
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:hive/hive.dart';

part 'item.freezed.dart';
part 'item.g.dart';

@freezed
abstract class Item extends HiveObject with _$Item {
  Item._();

  @HiveType(typeId: 1)
  factory Item({
    @HiveField(0) required String name,
    @HiveField(1) required String color,
  }) = _Item;
}
```

それぞれで`TypeAdapter`が生成されるので、それらの登録も忘れずに。。。

```dart:main.dart
void main() async {
  Hive.registerAdapter(UserAdapter());
  Hive.registerAdapter(ItemAdapter());

  var box = await Hive.openBox<User>('userBox');

  box.add(User(
      name: 'Tanaka', age: 34, items: [Item(name: 'name', color: 'color')]));
  box.add(User(name: 'Yamada', age: 17, items: []));

  print(box.values.first.key);

  runApp(const MyApp());
}
```


## 参考記事
https://stackoverflow.com/questions/60383178/combine-freezed-hive
GPTと音声で会話するサンプルプログラム

# TL;DR

音声でGPTと会話するアプリを、node.jsで作ってみました。
音声データはSocket.ioでサーバーと通信し、テキストとの変換にはGoogleのAPIを使っています。
```
┌───────┐              ┌─────────┐       ┌──────────────┐
│       │localhost:3000│ Client  │       │Google        │
│Browser├──────────────┤         │   ┌───┤Text to Speech│
│       │   html,js,css│React App│   │   │Speech to Text│
└────┬──┘              └─────────┘   │   └──────────────┘
     │                               │
     │                 ┌─────────┐   │   ┌──────────────┐
     │   localhost:3001│ Server  │   │   │OpenAI        │
     └─────────────────┤         ├───┴───┤              │
             Audio Data│ Express │       │gpt-3.5       │
                       └─────────┘       └──────────────┘
```
最終的なコードは以下にあります。実行方法はREADMEを参照してください。

https://github.com/tyoko010/talk-with-gpt

# 各技術要素の説明

各技術要素について、簡単に説明していきます。

## Socket.ioを利用したリアルタイム通信

サーバーとクライアント間でリアルタイム通信を実現するために、Socket.ioを使用しています。Socket.ioは、WebSocketをベースにしていますが、WebSocketが利用できない環境ではロングポーリングなどの別の通信方式を利用できます。

サーバー側の`httpServer.listen()`までの処理で、HTTPサーバーを立ち上げています。
クライアントとの通信が確立できた後の処理は、`io.on("connection",...)`のハンドラ内で行います。

```javascript:サーバー側
const PORT = process.env.PORT || 3001;
const httpServer = createServer();
const io = new Server(httpServer, {
  cors: {
    origin: "*", // Allow all origins
    methods: ["GET", "POST"],
  },
});

httpServer.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

io.on("connection", (socket) => {
  console.log("Client connected.");
  // ...
});
```

クライアント側では`io()`でサーバーとの接続を行います。
データ送信は`.emit()`を使い、データ受信時の処理は`.on()`に記載します。

Reactの再レンダリングで`io`が再初期化されたりしないように、`useRef`を使って状態を保持しています。


```javascript:クライアント側
import { io } from "socket.io-client";
const SERVER_URL = "http://localhost:3001";
const socketRef = useRef();
socketRef.current = io(SERVER_URL);
```

## 音声の録音とストリーミング送信

`navigator.mediaDevices.getUserMedia`を使用して、ユーザーのマイクからデータを取得します。
音声データの転送には`MediaRecorder`を使い、定期的に（ストリーミングで）サーバーへ送信するため、`start()`の引数にタイムスライスを渡しています。これによって、この場合では100ms時間ごとに、音声データをサーバーへ転送します。

```javascript
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
audioRef.current = new MediaRecorder(stream);
audioRef.current.ondataavailable = (e) => {
  if (e.data.size > 0) {
    socketRef.current.emit("clientAudio", e.data);
  }
};
audioRef.current.start(100);
```

## サーバーから受け取った音声の再生

クライアントは、サーバーから送られてくる音声データ（GPTによって生成されたテキストを音声合成したもの）を受信し、再生します。AudioContextを使用して音声データをデコードし、`audioContext.destination`に対して出力することで音声を再生します。

```javascript
socketRef.current.on('serverAudio', async (data) => {
  const audioContext = new AudioContext();
  const audioBuffer = await audioContext.decodeAudioData(data);
  const bufferSource = audioContext.createBufferSource();
  bufferSource.buffer = audioBuffer;
  bufferSource.connect(audioContext.destination);
  bufferSource.start();
});
```

## サーバーでのAPI呼び出し

GoogleのAPIを使って音声とテキストの変換をする部分や、OpenAIのAPIで回答を得る部分については、呼び出している以上の内容がないため、説明は省略します。

以上。
CKA 落ちて反省したことの備忘録

どうも dev.aoki です。アドカレ以外でほぼ書いてない人になってしまったな。
昨日 (2023/3/25) に CKA の認定試験を受け、見事に落ちてしまったので、その反省について書いていきます。

# CKA とは？

[公式](https://training.linuxfoundation.org/certified-kubernetes-administrator-cka-jp/#overview)

Kubernetes の管理者としての技能を認定する The Linux Foundation の試験です。
細かい話は公式や、他の方の受験記の方が詳しいと思うのでここでは割愛します。

試験で特徴的なのは、問題に回答するタイプの試験ではなく、実際にコンソールを触って実技能力を問う試験であることです。2022 年の 6 月から、試験プラットフォームが代わり、現在は PSI セキュアブラウザというアプリケーションをインストールし、リモートデスクトップ環境 (CKA の場合は Ubuntu) で操作を行う形式になっています。
https://training.linuxfoundation.org/ja/blog/update-on-certification-exam-proctoring-migration/

# 反省点まとめ

## 1. Killer.sh やっとけ

落ちた他の方の記事でもいくつか見かけましたが、やはりこれ重要です。この情報を落ちるまで見落としていた時点で敗北でした。

killer.sh は Kubernetes 系認定試験をサポートしている、試験シミュレータです。私もまだ利用していないので情報を見ただけの知識ですが、CKA は受験した時点で 2 回分の模擬試験 (本番より難易度がやや上らしい) が受けられるので、使わない手はないと思います。どうも試験予約のページにリンクがあったらしい……。
https://killer.sh/faq

内容もそうなんですが、私の場合はとにかく、実際の試験と同じ環境を事前にテストできる、というのが大きいと思いました。この後に記載する環境上のトラブルは、おそらくこれを一度体験しておけば、すべて対処できていたと思うので……。

## 2. 受験するマシンは事前に使い慣れておく

試験はプライベートで使っている Windows マシンで受けました。最初は仕事で使っている MacBook Pro で受けようと思ったのですが、推奨のディスプレイ解像度 (フル HD 以上) を満たしていなかったため、自宅のデスクトップマシンにしようとしました。

ちなみにこの PC ですが、最近は私用はスマートフォンで事足りることが多く、あまり頻繁には使っていませんでした。そして当日になり、試験環境のセットアップをしようとしてみたら、 Web カメラに不調が……。慌ててサブの Windows ノート PC (フル HD 画質) に切り替えることになりました。こいつが無かったら画面のちっさい Mac でやっていたのだろうか……。

## 3. PSI セキュアブラウザのインストールにハマる

全くもって阿呆な話なんですが、試験で使う PSI セキュアブラウザのインストールでかなり手間取りました。最終的にはインストールできたのですが、バタバタしたせいで落ち着いて試験に臨めなかったところがあります。

原因は McAfee のファイアウォールです。先述の Windows ノート PC は、初期設定で McAfee 試用版がプリインストールされており、どうもこれがインストールを阻んでいたようです。PSI セキュアブラウザのインストーラはダウンロードできたものの、インストーラをダブルクリックしても反応なし。かなり慌てました。公式ドキュメントでの試験環境についての説明にも、ファイアウォールは切れ、と記載がありました。

他にも OneDrive やら DropBox やらが試験環境基準クリアを阻害して、起動プロセス整理などで本当に焦りました。バカみたいな話ですが、当日に準備するとこういうことにハマります。

## 4. 画面表示に気をつけろ

無事受験環境が整備でき、試験官とのやり取りをしながらデスク周辺を見せたりしました。こちらは事前情報で色々知っていたので、片付けたりなんなりでスムーズに進みました (自宅の片づけが必要なのはなかなか面倒でしたが)。

そしていざ試験開始となりまして、PSI セキュアブラウザ越しに画面を見ると……何かおかしい。文字がデカすぎるし、ブラウザは見切れているし、エトセトラエトセトラ。文字サイズ調整をしたりして多少見やすくしたりはしたのですが、快適な環境とまではできず。特に厳しかったのが、Ubuntu 内の FireFox でドキュメントを読む際、ページ内検索をうまく使えなかったことです。Ctrl + F を押しても検索ウィンドウが表示されず。どうやら表示不備で画面外に見切れてしまっていたようでした。やむなく勘で文字を入力し、ある程度使ったりはしましたが……まぁ作業効率は悪かったですよね。

原因はまだ詳細特定できていませんが、疑っているのは Windows 側の画面表示設定で、拡大・縮小が 125% になっていたことです。これが試験環境側の表示にもなんらか影響していたのでは……このあたりはシミュレータ環境で試してみてから結論を出そうと思います。

そして、いずれにせよフル HD でも画面表示は狭い。大きいモニタは別途用意しておいた方が間違いなく有利だと思いました。僕も買っておこう……。

## 5. ターミナルの接続ノードを見失わない

ここまではすべて事前シミュレータで検証できる内容ですが、この項目だけは単純に受験時の注意点です。

CKA の試験では、複数の構築済クラスタをコンテキストスイッチしながら作業をします。この点は多くの受験体験記にもあり、また試験の設問にもコンテキスト変更コマンドが記載される程度にはフォローされています。が、アクセスしているノードを見落としていました。

ターミナルを使って試験を受けていて、作業の性質上 ssh でクラスタのメンバーノードにアクセスすることも多々あります。このため、次の設問に行ったときに必ずマスターノードに居るわけではないということが発生します。そこをうっかりしてしまいました。結果、設問の詳細を書くことはできませんが、誤って設問の対象ではないノードに対して操作を行ってしまい、kubelet のバージョンがおかしい……だとか、あるはずの Config ファイルが無い……みたいなことがあり、時間を大幅にロスしてしましました。作業前にちゃんと自分のいるノードは確認することをオススメします。

# おわりに

かなり険しい状況で受験した結果ですが、合格基準ラインが 66% のところ、スコア 64% と、自分としてはかなり善戦していました。逆に言えば、環境問題でのタイムロスが無ければ受かってたかもしれないな、と思って悔しい限り。
CKA は 1 つの受験クーポンで 1 度の再受験が可能なので、次は事前の環境準備を抜かりなく行ってから挑もうと思います。

CKA の学習自体は Kubernetes のコンセプトをかなり全域に渡って理解できるものだったので、触ってる方にはオススメの試験です。あと手を動かすので単純に楽しい。よかったら皆さんもご検討ください。それでは！
AtCoder、始めてみました。

# Atcorderを始めてみた
自分は都内でwebエンジニアとして会社員をしている。
が、最近家で個人的に特に作りたいものがない。

モチベーションをあげるべくいろんな記事をあさっていたところ、一つの記事（Qiita）を見つけた。
[【AtCoder】中卒の主婦が青コーダーになったおはなし【競技プログラミング】](https://qiita.com/mayocorn/items/4edff486428240864808)

「競技プログラミング」と言う名を聞いたことはあるものの、これまでは自分と無関係の世界の話。
ゴリゴリの文系人生だった自分だが、「アルゴリズムをゴリゴリに解けたらかっこいいのでは？」と思ってしまった。

きっかけはそれだけ。

この記事は、競技プログラミングを始める時の自分を記録するための記事。

# 目標
6月までに茶色に到達

# 設定
### 開始時期
2023/03/01〜

### 言語
Python3

C++が解説のデフォルト言語みたいだが、言語自体をこれまでしたことがない。
C++の次点で解説が多く、スクリプト言語なので習得に時間がかからないと思ったのでPythonを選んだ。
もしかしたら業務でも使えるかもしれないし。

## 学習始め
とりあえず文法を覚えないといけないので、Progateのpyhon編を一周した。
今はABSを始めたところ。
[AtCoder Beginners Selection](https://atcoder.jp/contests/abs)

通勤時間で「プログラマの数学 第2版」を読書中。

# 最後に
自分は割と飽き性なので、学習記録も含めて記事にしておけば、モチベーション続くのでは？と思いこれから記録していこうと思う。
とりあえず直近の目標は茶色（上位35%）を目指す。
ELANの辞書の保存場所を確認する（備忘録）

# ELANの辞書
ELANのinterlinearization modeで用いる辞書 (lexicon) は.xml形式で保存されているが、GUIからではそのパスが確認できない。

# 場所を確認する方法
最も簡単な方法は、新しい辞書を作成し、その際のダイアログを確認することだ。![スクリーンショット 2023-03-26 12.58.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573180/bb5dcc77-1996-ed23-b644-c8c6f468d23c.png)
このようなダイアログが出るので、このパスにアクセスすればいい。
この方法だと確認するたびにゴミができてしまうので、一回行ってメモをとっておきたい。
[Linux]Linuxの概要

# Linuxとは
linuxとはOSの一種で、コンピューターを動かす基本ソフトウェアのことです。OSとは、ハードウェアとソフトウェアを仲介する役割を担っており、コンピューターに当たり前に備わっている機能や動作を実現することができます。
linuxは枯れた技術のため、一度習得すれば何年でも使える技術になります。

### メリット
- オープンソースなため、無料で自由に使える
- 自動化のための仕組みがある
- 世界中で使われている

### デメリット
- 商用アプリケーションがあまりない
- 日本語対応していない

# linuxディストリビューション

linux OSには中核となるカーネルが存在し、コンピュータの制御を行うソフトウェアになります。linuxとカーネルはほぼ同義の意味として解釈されています。しかし、カーネル単体ではあまり機能的でないため、カーネルに様々なソフトウェアを組み込むことによって、より機能的にしたものが、linuxディストリビューションと呼ばれます。

# シェルコマンド
シェルはlinuxのCLIを実現するのに使われ、ユーザーとlinuxカーネルの仲介役を行うインターフェースを提供しています。
シェルコマンドを入力する際は、ターミナルを開いて作業を行います。シェルは、コマンドを解釈するソフトウェアであり、ターミナルは、結果を入出力するために画面上に表示するソフトウェアとなります。

シェル画面は以下のようになっています。
```
[hogehoge@localhost ~ ] $ 
```
hohoge => ユーザー名
localhost => ホスト名
$ => プロンプト

ユーザー名は、そのコンピューターにログインしているユーザーを指しています。また、ホスト名は、実際に操作しているコンピューターを識別するために、人がわかりやすいように命名した名前が出力されています.最後にプロンプトは、コマンドの入力待ちを示しています。

### コマンドが出力される流れ

1. プロンプトにコマンドの入力
2. シェルが入力された名前のコマンドを探す
3. linuxカーネルが見つかったコマンドを実行
4. シェルが実行結果を画面上に出力する

# よく使う基本コマンド一覧

### カーソル移動

|コマンド|内容|
|:--:|:--:|
|Ctrl + f|一文字分前へ移動|
|Ctrl + b|一文字分後ろへ移動|
|Ctrl + a|行の先頭に移動|
|Ctrl + e|行の最後に移動|
|esc + f|一単語分前へ移動|
|esc + b|一単語分後ろへ移動|

### 文字列編集
|コマンド|内容|
|:--:|:--:|
|Ctrl + h|カーソルの左を一文字削除|
|Ctrl + d|カーソル部分を一文字削除|
|Ctrl + w|カーソル位置の単語を削除(カーソルの後ろ側)|
|Ctrl + u|カーソルから行頭まで削除|
|Ctrl + k|カーソルから行末まで削除|
|Ctrl + y|最後に削除した内容を挿入|

### 補完機能、履歴の確認
|コマンド|内容|
|:--:|:--:|
|Tab|コマンドやパスの補完|
|Ctrl + p, ↑キー|一つ前の履歴|
|Ctrl + n, ↓キー|一つ後の履歴|
|Ctrl + r|履歴の検索(Ctrl + gで終了)|

### その他
|コマンド|内容|
|:--:|:--:|
|Ctrl + c|コマンドの終了|
|Ctrl + l|画面の消去|
|Ctrl + s|入力のロック(Ctrl + qで解除)|

# 参考

https://www.udemy.com/course/unscared_linux/
【lsof】ローカルのWebサーバーで起動したアプリが残っている時の対処法


# Introduction

以前に npm start で起動したアプリが残っていたので、プロセスの終了がてら共有します。
余談ですが、所謂ゾンビ化したプロセスには`ps aux|grep <process_name>`をよく使いますね。
Web サーバーでは本記事の手順になります。

**本記事が少しでも読者様の学びに繋がれば幸いです！**
**「いいね」をしていただけると今後の励みになるので、是非お願いします！**

## 前提

Terminal 上で現在起動中のプロセスが残っていれば、`Ctrl + C`で終了してください。
何らかの原因で`Ctrl + C`後もプロセスが残り続けた場合は、以下の方法をお試しください。

## 環境

Ubuntu22.04

## lsof コマンド

`lsof`コマンドで起動中のプロセスを確認することができます。

### 起動中のプロセスのポート番号が判明している場合

```console: 指定したポート番号のプロセスを表示
$ lsof -i :ポート番号
COMMAND    PID     USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
code    108547 hogehoge  114u  IPv4 1002172      0t0  TCP localhost:3000 (LISTEN)
```

### 起動中のプロセスのポート番号が判明していない場合

```console: 起動中のプロセスを表示
$ lsof -iTCP -sTCP:LISTEN
COMMAND      PID     USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
code      108547 hogehoge  114u  IPv4 1002172      0t0  TCP localhost:3000 (LISTEN)
code      108547 hogehoge  116u  IPv4 1002173      0t0  TCP localhost:3001 (LISTEN)
```

## kill コマンド

終了したいサービスのプロセス ID（PID）を確認し、`kill`コマンドを実行します。
誤った ID を入力して重要なプロセスを終了しないよう、PID はコピペすることを推奨します。

```console: プロセスを強制終了
$ kill -9 PID
```

## 最後に

閲覧頂きありがとうございました。
備忘録の側面もありますが、本記事がお役に立てば幸いです！

## 参考 URL

[lsof の使い方](https://hogem.hatenablog.com/entry/20070223/1172221315 'lsof')
初期化パラメータ・ファイルの使用順序を確認する（Oracle Database 19c）

# 初期化パラメーター・ファイル
　Oracle Database には４００以上の初期化パラメーター（隠しパラメーターを除く）が定義されています。これらは初期化パラメーター・ファイルに記述され、インスタンス起動時に利用されます。ALTER SYSTEM 文で動的に変更されたパラメーターは SPFILE に永続化されることもあります。
　初期化パラメーター・ファイルの保存場所には以下の３種類が考えられます。

## テキスト形式（PFILE）
　PFILE は {ORACLE_HOME}/dbs/init{ORACLE_SID}.ora ファイルとして作成されます。
テキストエディタで修正するか、CREATE PFILE 文で SPFILE ファイルから生成します。
INCLUDE 句を使って SPFILE の場所を示すこともできます。

```SHELL:
$ cat initO19A.ora
*.control_files=('+DATA','+MGMT')
*.db_name='O19A'
*.db_unique_name='O19S'
*.sga_target=10G
```

## バイナリ形式（サーバー・パラメータ・ファイル=SPFILE）
　SPFILE はバイナリファイルの形式で {ORACLE_HOME}/dbs/spfile{ORACLE_SID}.ora ファイルとして作成します。CREATE SPFILE 文で PFILE から作成します。


## Oracle Grid Infrastructure の属性（SPFILE）
　データベースが Oracle Grid Infrastructure 配下にある場合、SPFILE の場所は Oracle Grid Infrastructure のデータベース属性として定義されます。CREATE SPFILE 文で ASM 領域等の任意の場所にファイルを作成できます。下記は SPFILE を ASM ディスクグループ +DATA に保存したことを示しています。Oracle Database 起動時は ASM に保存された初期化パラメーター・ファイルを使用します。

```SHELL:
$ srvctl config database -db o19s
Database unique name: o19s
Database name: o19a
Oracle home: /u01/app/oracle/product/19.0.0/dbhome_1
Oracle user: oracle
Spfile: +DATA/O19S/PARAMETERFILE/spfile.477.1132410857　←　ここ
Password file:
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools:
Disk Groups: DATA,MGMT
Mount point paths:
Services: o19s
Type: RAC
Start concurrency:
Stop concurrency:
OSDBA group: dba
OSOPER group: oper
Database instances: o19s1,o19s2
Configured nodes: rel87-1,rel87-2
CSS critical: no
CPU count: 0
Memory target: 0
Maximum memory: 0
Default network number for database services:
Database is administrator managed
```

# 使用される順序
{ORACLE_HOME}/dbs ディレクトリに PFILE と SPFILE を配置し、かつ Oracle Grid Infrastructure の属性として ASM ディスクグループにも置いた状態でインスタンスを起動します。

```SHELL:
$ cd $ORACLE_HOME/dbs
$ ls -l inito19s1.ora spfileo19s1.ora
-rw-r--r-- 1 oracle oinstall  756 Mar 26 10:59 inito19s1.ora
-rw-r----- 1 oracle asmadmin 2560 Mar 26 10:59 spfileo19s1.ora
$ srvctl config database -db o19s | grep Spfile 
Spfile: +DATA/O19S/PARAMETERFILE/spfile.477.1132410857
$ srvctl start database -db o19s
$ sqlplus / as sysdba
SQL> SHOW PARAMETER SPFILE;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      +DATA/O19S/PARAMETERFILE/spfil
                                                 e.477.1132410857
```

Oracle Grid Infrastructure に保存されたファイルが使われていることがわかります。上記のように 1: Grid Infrastructure管理の SPFILE, 2: SPFILE, 3: PFILE の順で優先順位が高いことがわかります。

# あとがき
検証としては上記の通りになったのですが、Grid Infrastructure と PFILE のみの環境で PFILE が使われてしまった事例がありました。あまりないと思いますが PFILE を使った環境では確認が必要かもしれません。

Author: Noriyoshi Shinoda / Date: March 26, 2023
5月30日WebSphere・Db2・MQ アニバーサリー・フォーラムについて

Db2、WAS、MQのアニバーサリー・イヤーとして、2023年は各製品に関するイベントを多く開催しており、5月30日には箱崎で統合イベントが開催される。
統合イベントの[HP](https://www.ibm.com/events/reg/flow/ibm/v414fpmb/landing/page/landing?utm_medium=Exinfluencer&utm_source=Exinfluencer&utm_content=WHEWW&utm_term=20A0X&utm_id=Sales-Invitation-0530)と[チラシ](https://ibm.ent.box.com/s/dge7d30hgt3hp3hdhnz1g82muhzagphc)はこちらから確認できる。

-----------------
**タイトル：WebSphere・Db2・MQ アニバーサリー・フォーラム ～企業を支えるIT基盤としての軌跡とハイブリッド・クラウドへの道筋～**
**開催日：2023年5月30日（火)　14:00-17:30**
**会場：日本アイ・ビー・エム本社事業所（東京都中央区日本橋箱崎町19-21）**
**参加費：無料（事前登録制）**
**対象：WebSphere、Db2、MQをご利用いただいている皆様**
**主催：日本アイ・ビー・エム**

-----------------
アジェンダ（内容は2023年3月27日現時点のものです。今後変更される可能性があります）
|時間  |内容 |
|---|---|
|14:00-14:15  |オープニング  |
|14:15-14:35  |【お客様講演】WAS Libertyと共に歩んだメガ損保の基幹システム刷新  |
|14:35-14:55  |【お客様講演】-Db2  |
|14:55-15:35  |【製品戦略セッション】-MQが切り拓いたメッセージの新時代 |
|15:35-15:55  |休憩  |
|15:55-16:35  |【製品戦略セッション】-WebSphere25周年で考える：エンタープライズWebアプリケーションの最新技術と発展  |
|16:35-17:15  |【製品戦略セッション】-なぜDb2 for LUWは30年使われ続けるのか  |
|17:15-16:30  |表彰・クロージング  |


統合フォーラムでは、お客様講演や、グローバル講演がある。
そのほか、会場内の展示エリアでは、IBMの最新テクノロジーをご体感いただくことのできるデモブースと、技術者と自由に議論/会話いただくことのできるAsk the Expertブースをオープン予定である。

イベントの一つで現在開催されている[Qiita記事投稿キャンペーン](https://qiita.com/camp07/items/308ffc85926b3247ca68)の表彰も統合イベントにて行われる。
ぜひご参加ください。
【Rails】findとfind_byとwhereの違い

### find 
```
>> User.find(1)
  User Load (2.4ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
=>                                                
#<User:0x0000000109a26750                         
 id: 1,                                           
 name: "tarou"
```
+ 引数に指定できるのは数値のみ。
+ idを対象にして検索する場合に用いる
+ 該当するデータがなかった場合は、エラーが発生する。

### find_by
```
>> User.find_by(name: 'tarou')
  User Load (2.3ms)  SELECT `users`.* FROM `users` WHERE `users`.`name` = 'ryoya' LIMIT 1
=>                                                                         
#<User:0x000000010c95e8b0                                                  
 id: 1,                                                                    
 name: "tarou"    
```
+ 引数にはidや他のカラムも指定できる。
+ 引数はキーとバリューで指定する必要がある。
+ 該当するデータのうち、最初に見つかったデータを返す。
+ 該当するデータがなかった場合は`nil`を返す。

### where
```
>> User.where(name: 'tarou')
  User Load (3.5ms)  SELECT `users`.* FROM `users` WHERE `users`.`name` = 'tarou'

[#<User:0x000000010a962f48                                                      
  id: 1,                                                                        
  name: "tarou"
 #<User:0x000000010a962e80
  id: 2,
  name: "tarou"
 #<User:0x000000010a962d76
  id: 3,
  name: "tarou"
```
+ 引数にはidや他のカラムも指定できる。
+ 引数はキーとバリューで指定する必要がある。
+ 該当するデータを全て返す。
+ 該当するデータがなかった場合は、空の配列を返す。

### 参考

https://qiita.com/tsuchinoko_run/items/f3926caaec461cfa1ca3
fsharpでmakeTimeSlot関数を実装してみた

# makeTimeSlot関数とは何か？

仕事で必要だった関数。
たとえばstartTime:9, endTime: 10, step:30という引数を与えると
[900, 930, 1000]が返ってくるようにする。

startTime:9, endTime: 12, step:15だった場合は
[900, 915, 930, 945, 1000, 1015, 1030, 1045, 1100, 1115, 1130, 1145, 1200]

そして10時が終了のときは900と930で良かったりするので、最後の引数でisLtを取って、trueのときは末尾を落とす処理にする。

どういうときに使うのかというと、カレンダーの左にあるようなtimeSlotを実装するときに必要だった。
わざわざdatetimeに変換して15分ずつ足すとかすると処理が重くなるのでもっと軽い処理にしたかった。
営業時間系の処理をするときによく使うのでtypescriptで実装したものを、練習でFsharpで実装してみた。

```Fsharp:makeTimeSlot.fs
module makeTimeSlot

(*
  drop関数。
  先頭からn個の要素を削除する。
  drop 2 [1;2;3;4;5] -> [3;4;5]
 *)
let rec drop n list =
    match n, list with
    | _, [] -> [] // 空リストの場合は空リストを返す
    | 0, _ -> list // nが0の場合はリストをそのまま返す
    | n, _ :: tail -> drop (n - 1) tail // nが0でない場合は先頭の要素を削除(tail)して再帰

// dropLast関数。
// 末尾からn個の要素を削除する。
// dropLast 2 [1;2;3;4;5] -> [1;2;3]
// rev2回使ってるから効率が悪いと思うな……。for文で-1していくとかの方が速いだろうな。きっと。
let dropLast n list = list |> List.rev |> drop n |> List.rev

// 次の時間を求める関数
(* 900,step30 -> 930 930,step30 -> 1000 *)
let nextTime time step =
    let minutes = time % 100 // 900 -> 0
    let nextMinutes = minutes + step // 0 + 30 -> 30
    let nextHour = time / 100 + nextMinutes / 60 // 900 / 100 + 30 / 60 -> 9 + 0 -> 9
    let validMinutes = nextMinutes % 60 // 30 % 60 -> 30
    nextHour * 100 + validMinutes // 9 * 100 + 30 -> 930


(* startTime 900 endTime1000 step 30 -> [900, 930] *)
let makeTimeSlot startTime endTime step isLt =
    let rec loop timeSlot start =
        match start >= endTime with
        | true ->
            if (isLt) then // isLtがtrueの場合は末尾の要素を削除する。つまり900 -> 1000で実行したとき1000で処理終わるんだけど最後を取り除いておくと。
                dropLast 1 timeSlot
            else
                timeSlot // isLtがfalseの場合は末尾の要素を削除しない。
        | false ->
            let next = nextTime start step // 900 -> 930

            match next >= endTime with // 930 >= 1000 -> false 1000 >= 1000 -> true
            | true -> List.append timeSlot [ endTime ] // 1000を追加して終了
            | false -> loop (List.append timeSlot [ next ]) next // 930を追加して次のループへ

    loop [ startTime ] startTime
```

dropとかdropLast関数とか、すでに実装されてたりせんのかしら。
fsharpの便利な関数集とかありそうだな……。
simulink UART出力 その2


　[前回](https://qiita.com/jamjam/items/6ce11aecb8bb4edc3def)、matlabのsimulinkの環境で、シリアル（UART）で信号を出力する実験をしました。今回は、その出力を、Arduinoのシリアルで受けます。

![simulink-UARTa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/61471af5-22c6-e92c-352e-3cd3a78d7ffa.png)


### 動作環境

- Windows10 Pro 22H2
- matlab R2023a
- Arduino IDE2.0.4

　USB-UART変換ボートは、[前回](https://qiita.com/jamjam/items/6ce11aecb8bb4edc3def)の記事を参照してください。
　ボード間の接続です。
| USB-UART変換ボード |Arduino Zero |
|:-----------:|:------------:|
| TxD      | 13->Rx        | 
| RxD     | 14<-Tx    | 
| GND     | GND      | 

![IMGP1644.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/29e37476-02ea-c9bf-a138-a8f883246857.png)


### simulinkの設定
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3430373633352f34373062653665322d643433342d623139342d353165652d3539623934386136633062322e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/1971f687-72cf-b723-8326-0c0b6bcd808e.png)

　プロパティです。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3430373633352f61336432376330352d363862392d643263642d623037302d3136346533326633643163622e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/f0222bb4-8c47-7363-d916-b566a448ac1f.png)

　定数のプロパティです。32ビットのデータで、”AB”を送ります。（uint16でいいのかな？）
![s101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/8830c687-388d-0214-23ad-dea32106563d.png)

![s102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/5f4b5a9b-2865-6873-82fb-0f7c5e4a983d.png)


### シリアルでデータを受けるArduino側
　スケッチです。Serialはシリアルモニタで、Serial1はUARTポートです。


```cpp
void setup() {
  // initialize both serial ports:
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop() {
  // read from port 1, send to port 0:
  if (Serial1.available()) {
    int inByte = Serial1.read();
    Serial.write(inByte);
  }
}
```

　シリアルモニタを起動しておきます。simurinkを実行します。
　受信しました。

![2023-03-26 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/2274bc49-3232-2f61-7e8b-e776f221b567.png)
10000人に教えてきた新入社員研修講師がChatGptに、何を予習しておくべきか聞いてみた

東京にいるけどFukuokaexのYOSUKEです。

もうすぐ春ですね。今年もこの時期がやってきました。
絶賛 様々な企業の新入社員研修の準備を進めています。

エンジニア界隈に就職された方々に向けて、研修が始まって苦労される方も多く、
何かできないかな？

と思い、今話題のChatGptに何を予習しておくべきか聞いてみました。

## Javaの新入社員研修でつまづく前に事前学習として何を予習しておくべきかアドバイスをお願いします。


Javaの新入社員研修でスムーズに学習を進めるために、以下の事前学習をお勧めします。

Javaの基本概念:
Javaの歴史と特徴
Javaプログラムの構造（クラス、メソッド、インスタンス）
Javaのデータ型（プリミティブ型、参照型）
制御構造（if文、for文、while文、switch文）
配列とArrayList
例外処理（try-catchブロック、例外クラス）
オブジェクト指向プログラミング (OOP) の基本:

クラスとオブジェクト
インスタンス化とコンストラクタ
カプセル化（アクセス修飾子、getter/setter）
継承とポリモーフィズム
インターフェースと抽象クラス

Javaの標準ライブラリ:
java.util（コレクションフレームワーク、日付・時刻処理など）
java.io（ファイル入出力、ストリーム操作）
java.nio（ファイルシステム、バッファ、チャネル）
java.lang（文字列操作、ラッパークラス、Mathクラス）
java.net（ネットワーク通信、ソケットプログラミング）
開発環境とツール:

JDKのインストールと環境設定
IDE（例: IntelliJ IDEA, Eclipse）の使い方
ビルドツール（例: Maven, Gradle）の基本
バージョン管理システム（例: Git）の基本操作
基本的なデザインパターン:

シングルトン
ファクトリーメソッド
ストラテジー
オブザーバ
デコレータ

事前学習を行うことで、新入社員研修でのJavaの学習がスムーズに進み、理解が深まるでしょう。また、研修中に新たな知識や技術が紹介されたときにも、基本概念を理解していることで迅速に取り入れることができます。

---

という感じで、盛りだくさん帰ってきました。

ただ、こんなに沢山あってもねぇ。と思ったので、最低限これだけ理解しておいて欲しいことを１つだけあえて選ぶとしたらどこかな？と考えてみました。

考えた結果ですが、最低限（Javaは）以下を理解して欲しい。

### Javaプログラムの構造（クラス、メソッド、インスタンス）

もっと言えば、以下２つの構造ですね。これだけでも判別できるようになっていてほしい。

* クラス
* メソッド

なぜなら、今まで見てきた新卒の方で研修の後半まで何やってるかわからない >< となってた方の大半がここでつまづいてるので、どんな説明も何のこと言ってるのか理解できないままに終わってました。

という事で、プログラムのコードが出てきた時に文章を塊として見れるようにしましょう。

あとは、わからない箇所が出てきたら、すぐに聞く。何言ってるか理解できてない場合はすぐに聞く、研修講師はわからない人の味方なのでどんどん聞いてあげてください。

聞くは一瞬の恥、聞かぬは一生の恥

という諺がある通り、一瞬の出来事なんて誰も覚えてないです。聞いたって1時間後には皆の記憶からは消し飛んでるので周りの目を気にせず。どんどん聞いちゃいましょう。

ついでに、C言語の研修を受ける人向けにも聞いてみました。

## C言語の新入社員研修でつまづく前に事前学習として何を予習しておくべきかアドバイスをお願いします。

C言語の新入社員研修でスムーズに学習を進めるために、以下の事前学習をお勧めします。

C言語の基本概念:

C言語の歴史と特徴
プログラムの構造（ヘッダファイル、ソースファイル、関数）
データ型（整数型、浮動小数点型、文字型）
制御構造（if文、for文、while文、switch文）
配列と文字列
ポインタとメモリ管理:

ポインタの基本（宣言、アドレス演算子、間接参照演算子）
ポインタと配列
動的メモリ割り当て（malloc、calloc、realloc、free）
関数と引数の渡し方:

関数の定義と呼び出し
引数の渡し方（値渡し、ポインタ渡し、参照渡し）
関数ポインタ
構造体と共用体:

構造体の定義とアクセス
共用体の定義とアクセス
typedefによる型の定義
ファイル入出力とストリーム:

ファイル操作関数（fopen、fclose、fread、fwrite）
テキストファイルとバイナリファイルの扱い
ファイルポインタとバッファリング
開発環境とツール:

コンパイラ（例: GCC）のインストールと基本的な使い方
デバッガ（例: GDB）の基本操作
バージョン管理システム（例: Git）の基本操作
事前学習を行うことで、新入社員研修でのC言語の学習がスムーズに進み、理解が深まるでしょう。また、研修中に新たな知識や技術が紹介されたときにも、基本概念を理解していることで迅速に取り入れることができます。

---

新卒の方の何かヒントになれば幸いです。
HerokuからFlyへのデータベース転送でエラーが起こったときの対処法

Herokuの無償プラン廃止に伴い、Flyへのアプリケーション移行をしていたところ、データベースの転送でエラーが発生しました。

対処法をまとめます。

## 移行手順

Herokuからの移行について、Flyから公式のドキュメントが用意されているので、これを参考に移行しました。
https://fly.io/docs/rails/getting-started/migrate-from-heroku/


## 発生したエラー

[Transfer the Database](https://fly.io/docs/rails/getting-started/migrate-from-heroku/#transfer-the-database) の `pg_dump` を実行したところで以下のようなエラーが出ました。

```
# pg_dump -Fc --no-acl --no-owner -d $HEROKU_DATABASE_URL | pg_restore --verbose --clean --no-acl --no-owner -d $DATABASE_URL

pg_dump: error: server version: 14.7 (Ubuntu 14.7-1.pgdg20.04+1); pg_dump version: 13.9 (Debian 13.9-0+deb11u1)
pg_dump: error: aborting because of server version mismatch
pg_restore: error: input file is too short (read 0, expected 5)
```

## エラーの原因

「AppサーバーにインストールされているPostgreSQL Clientのバージョン」と「Herokuで動いているPostgreSQL Serverのバージョン」が一致していないためです。

FlyのAppサーバーにインストールされているPostgreSQL Clientのバージョンは `13.9` です。

```
$ fly ssh console
# pg_dump --version
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
pg_dump (PostgreSQL) 13.9 (Debian 13.9-0+deb11u1)
```

Herokuで動いているPostgreSQL Serverのバージョンは `14.7` です。

```sh
$ heroku pg:info
Plan:                  Mini
Status:                Available
Connections:           0/20
PG Version:            14.7
Created:               2019-02-19 13:56 UTC
Data Size:             14.9 MB/1.00 GB (In compliance)
Tables:                5
Rows:                  5776/10000 (In compliance)
Fork/Follow:           Unsupported
Rollback:              Unsupported
Continuous Protection: Off
Add-on:                postgresql-parallel-80887
```

エラーとは直接関係ありませんが、Flyで動いているPostgreSQL Serverのバージョンは `15.2` でした。ややこしい。。。

```sh
$ fly pg connect --app (FlyのApp名)-db
# SELECT version();
                                                           version

--------------------------------------------------------------------------------
---------------------------------------------
 PostgreSQL 15.2 (Debian 15.2-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by g
cc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
(1 row)
```

## 対処法

本来は上記のバージョンを全て揃えるのが理想ですが、今回はバージョンの差分自体には目を瞑り、エラーを回避しつつデータベース転送することにしました。

まず、HerokuのDBをbackupします。

```
$ heroku pg:backups:capture --app (HerokuのApp名)
$ heroku pg:backups:download --app (HerokuのApp名)
```

ダウンロードした `latest.dump` をAppサーバーに転送します。

```
$ flyctl sftp shell
# put latest.dump
```

転送が完了したら、Appサーバーのコンソールに入り、restoreします。

```
$ fly ssh console
# pg_restore --verbose --clean --no-acl --no-owner -d $DATABASE_URL latest.dump
```

これで、データベースの転送が完了しています。
ABC-295 A「Probably English」解説

# 前置き
皆さん、こんにちは！
今回はABC-295のA問題「Probably English」について解説していきたいと思います！
（https://atcoder.jp/contests/abc295/tasks/abc295_a)


# 目次
- 問題概要
- 制約
- 入力形式
- 解説


# 問題概要
英小文字の$N$個の文字列$W_1, W_2, \cdots W_N$が与えられる。
これらのうち一つ以上が``and``, ``not``,``that``.``the``,``you``のいずれかと一致するならば``Yes``を出力。
そうでない場合は``No``を出力。


# 制約
$1 \leq N \leq 100$
文字列$W_i (i=1 \cdots N)$の長さは$1以上50以下$

# 入力形式
```text:input.txt
N 
W_1 W_2 …… W_N
```

# 解説
問題文を言い換えると下記のようになります。
>$W_1,W_2,…W_N$のうち、どれか一個でも[and,not,that,the,you]に含まれている場合は$Yes$と出力する。


つまり、
①[and,not,that,the,you]というリストを作成
②$W_1,W_2 \cdots W_N$を一個ずつ調べていって、$W_i(i=1 \cdots N)$が①で作成したリストに含まれていればYesを出力。
③それ以外の場合にはNoを出力。
という流れで解けばよいことがわかります。

その過程を実装したのが下記コードです。
$W_i$がリストに含まれているかの判定にはin関数を用いています。
[in関数](https://docs.python.org/ja/3/library/stdtypes.html#index-19)

```Python:295-A.py
N = int(input())
li = list(map(str,input().split()))
st = ['and','not','that','the','you']

for i in li:
    if i in st:
        print('Yes')
        break
        
else:
    print('No')
```
[AtCoderで提出したコード](https://atcoder.jp/contests/abc295/submissions/40022039)
GASからInstagram Graph APIを利用してGoogle Driveの画像をアップロードする

# この記事の読者
* Google Workspaceを使用してInstagramに投稿したい方
* Instagramをビジネスアカウントを利用して自動運用を行いたい方
* この記事を楽しく読める人

# きっかけ
自分の運営している団体でInstagramのアカウントを全員にログインさせるのはセキュリティ的にも怖かったので、Google Form経由でアップロードさせる方法に変更

# 前提条件
* 投稿する写真をGoogle Driveに保存しており、また、公開アクセスになっていること
* Instagramをビジネスアカウントで運用していること

# 結論
公式リファレスンス通りに```UrlfetchApp.fetch()```でPOSTを実行

# 詳細
1. 以下のリンク先の通りにInstagram Graph APIのユーザーIDとトークンを取得する。なお、バージョンは最新のもので良い<br>https://to-inc.co.jp/socialbook/?p=2189

2. 写真のリンクを準備する。ドライブのリンクは```https://drive.google.com/uc?id="ファイルのID"```の形にする。詳しくは以下のリンクを参照。<br>https://qiita.com/rot-z/items/299ac40361690c51ce1d

3. 以下のコードを記述。公式リファレンス通りに２回のPOSTを実行する。<br>https://developers.facebook.com/docs/instagram-api/guides/content-publishing
~~~js:main.gs
function postOnInstagram(POST_LINK, POST_CAPTION) {
  //Configure ID and TOKEN. It is set on properties.
  const INSTAGRAM_ID = PropertiesService.getScriptProperties().getProperty("INSTAGRAM_ID");
  const INSTAGRAM_TOKEN = PropertiesService.getScriptProperties().getProperty("INSTAGRAM_TOKEN");

  //First Post
  let image_url = POST_LINK;
  let caption = POST_CAPTION;
  let payload1 = {
    'access_token': INSTAGRAM_TOKEN,
    'image_url': image_url,
    'caption': caption,
  };
  let options1 = {
    'method': 'post',
    'payload': payload1
  };
  const response1 = UrlFetchApp.fetch("https://graph.facebook.com/v16.0/" + INSTAGRAM_ID + "/media", options1);

  //Secound Post
  let id = JSON.parse(response1).id;
  let payload2 = {
    'access_token': INSTAGRAM_TOKEN,
    'creation_id': id,
  };
  let options2 = {
    'method': 'post',
    'payload': payload2
  };
  const response2 = UrlFetchApp.fetch("https://graph.facebook.com/v16.0/" + INSTAGRAM_ID + "/media_publish", options2);
};

let post_caption = ""; //投稿の本文を記入
let post_link = ""; //投稿する写真のリンクを
postOnInstagram(post_link,post_caption)
~~~

# 利点

Google Workspaceを利用しているユーザーにはとても利便性が高い。

# 改善すべきポイント

* Google Driveのファイルのアクセス権を一時的に公開にする必要がある
* 複数の写真とビデオの投稿に対応していない。（今後対応させる予定）

# その他
* 後ほどライブラリを公開予定
* GitHubにソースコードを公開予定

# 筆者の戯言
これでだいぶ無駄業務が減ったのでよし。
【初心者向け】ulタグの余白

## 事象
下記コードでホームページを作成したところ、`.footer-nav-list`と`.copyright`の要素が一行に並ばない
![スクリーンショット 2023-03-26 104808.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3105023/6a47e8ca-5a2a-4a7d-c57f-bc9206c87924.png)

#### HTML
```
    <footer>
        <div class="footer-wrapper">
            <div class="footer-nav-list-box">
                <ul class="footer-nav-list">
                    <li class="footer-nav-item">
                        <a href="/About.html">About</a>
                    </li>
                    <li class="footer-nav-item">
                        <a href="#">Works</a>
                    </li>
                    <li class="footer-nav-item">
                        <a href="#">Blog</a>
                    </li>
                    <li class="footer-nav-item">
                        <a href="#">Contact</a>
                    </li>
                </ul>    
            </div>
            <div class="copyright">
                <small>&copy;yowatana All rights reserved</small>
            </div>
        </div>
    </footer>
```

#### CSS
```
footer {
    margin-top: 70px;
}


.footer-wrapper {
    display: flex;
    justify-content: space-between;
    margin: 0 150px 40px 150px;
}

.footer-nav-list {
    display: flex;
    justify-content: flex-start;
}

.footer-nav-item + .footer-nav-item {
    margin-left: 50px;
}
```


## 調査
Google Chromeの検証機能で該当箇所を見たところ、`margin-top: 16px`および`padding-left: 40px`が指定されていることが分かった。
（ホームページ作ってみたくて、自動車免許はご愛敬です笑）
![スクリーンショット 2023-03-25 233336.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3105023/41b66a9e-a723-98b8-85fc-93d3531c3161.png)

## 解決方法
ulタグに対して下記指定を追加した。
```
ul {
    margin-top: 0;
    padding-left: 0;
}
```
![スクリーンショット 2023-03-26 105405.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3105023/fca1270c-3603-b0b9-0c56-7e17f1a9ccd8.png)


## 振り返り
タグの初期設定でCSSの指定されていることを知らず、`display: flex`の指定方法が悪いのかなど長時間ハマった。
検証機能で調査するという手段を知ることができたのはよかった。
同じことでハマっている方いれば！！
Googleデジタルマーケティング＆Eコマース：ステークホルダーと働く

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/41012708-dfb2-da45-b1a3-5a683fab51bc.png" width="800">

# ニーズを理解する

ステークホルダーは、自分の組織や部署の役員、マネージャー、同僚である場合があります。ステークホルダーが組織外の顧客である場合もあります。例えば、組織内のステークホルダーは、あなたのプロジェクトの運営予算の資金源となる役員である可能性があります。また、プロジェクトの費用を負担する顧客ステークホルダーと仕事をする場合、通常、彼らは自分たちで仕事を実行できないため、あなたの結果を綿密に確認することになります。

ステークホルダーが重要なのは、彼らがプロジェクトに資金を提供してくれるからです。また、プロジェクトを成功させるための影響力を持つこともあります。

マーケティング・コーディネーターは、キャンペーンの進捗状況、進行中の指標、プロジェクトの途中または終了時に得られた洞察について、ステークホルダーに情報を提供します。ステークホルダーとどのように接すればよいかわからない場合は、上司や、必要であればステークホルダーに直接質問し、フォローアップしましょう。

# ステークホルダーの関心度

まず、プロジェクトに対するステークホルダーの関心を理解することから始めましょう。キャンペーンの目標は、彼らの全体的な売上目標とどのような関係があるのでしょうか。

- 一定の売上見込みがあるのか？
- 新製品を導入しているのか？
- 予想されるROASはありますか？
- 過去のデータとの比較は行っていますか？
- 予算の制約を監視していますか？
- カスタマージャーニーのどのような側面に興味があるのでしょうか？

# ステークホルダーに情報を提供するタイミング

また、ステークホルダーに情報を提供するタイミングも知っておきましょう。

- 誰が情報交換を始めるのでしょうか？
- 彼らは、あなたが定期的にレポートを送ることを好むのでしょうか、それとも必要に応じて情報を要求することを好むのでしょうか？
- どの程度の頻度でレポートを送るべきでしょうか？
- どのような結果が優先されるのか？
- エスカレーションや緊急連絡のトリガーとなるものは何か？

# ステークホルダーとのコミュニケーション方法

コミュニケーションの方法を知る ステークホルダーが好む方法、またはステークホルダーのグループと仕事をする場合は、ミーティング、電子メール、チャット、電話など、大多数のステークホルダーにとって最適な方法を用いてコミュニケーションをとることが最善です。プロジェクトの初期段階や開始前に、好みのコミュニケーション方法を確立しておくとよいでしょう。

# データの提示方法

最後に、データをどのように提示するのが最適かを理解する。あなたが共有する測定基準から有益な情報が得られない場合、ステークホルダーはあなたの洞察から利益を得ることはできません。テキストとビジュアルを組み合わせてデータを要約することで、測定基準を容易に理解することができます。ここでは、データを表とグラフで同時に表示する例を紹介します。ダッシュボードもデータをうまく要約しています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/eba1e241-76ae-ad4b-a998-65068ef73846.png" width="700">

# ステークホルダーマップ

これはすべてのプロジェクトに必要なことではないかもしれませんが、ステークホルダーマップを作成して、ステークホルダーとの関わり方を記録しておくと便利だと思う人もいます。このようにステークホルダーの名前をマップ上に配置することで、各ステークホルダーと維持すべき交流の種類と量を明確にすることができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/44fd9d86-3c67-4ab3-4fd3-c4a87e28f338.png" width="700">

- 影響力とは、ステークホルダーが特定の行動を取るように人々を説得できる度合いと定義することができます。例えば、マーケティングキャンペーンにもっと予算が必要な場合、影響力の高いステークホルダーが介入して、キャンペーンの資金調達の優先順位を上げることができるかもしれません。

- 関心度とは、あなたのプロジェクトがステークホルダーの目標にどの程度影響を与えるか、または与えることができるかを意味します。つまり、ステークホルダーの既得権益を測る指標と考えることができます。


高い関心と高い影響力を持つ最も投資的なステークホルダーは、右上の四角の中にいるはずです。

:::note info
あなたの時間、リソース、エネルギー、モチベーションが、毎日職場で使う組織通貨であるならば、ビジネスに最も影響や価値のあることに使うようにしたいものです。ステークホルダーマップは、ステークホルダーと効果的に協働するためのものであり、そのプロセスに時間やエネルギーを費やす必要はありません。
:::
Next.js getServerSidePropsとgetStaticProps Docker環境のAPIにアクセスできない

## 起こったエラー
DockerでNext.jsとLaravelの環境を構築

`getServerSideProps`や`getStaticProps`のメソッドの中でLaravelで作成したapiにアクセスしてデータを取得しようとしたところコネクションエラーが発生した。

```js
export const getServerSideProps = async () => {
    const res = await fetch('http://localhost:8080/api/users')
    const data = await res.json()

    return { props: { data } }
}
```

このように記述をして全然データ取得が出来ませんでした。

試しに`useEffect`の中で同じエンドポイントの`http://localhost:8080/api/users`にデータを取得しに行ったところ問題なく取得できました。
`useEffect`の中では出来てなぜ出来ないのか分からず、`getServerSideProps`の書き方がおかしいのではないかと思い軽く合計で5〜6時間は葛藤しました。

解決策は`getServerSideProps`や`getStaticProps`の中でデータを取得する場合は`localhost:8080`ではなくて、`nginx:80`にすることでした。

```js
export const getServerSideProps = async () => {
    const res = await fetch('http://nginx:80/api/users')
    const data = await res.json()

    return { props: { data } }
}
```
このようにしたら取得できました。
dockerの構成はこんな感じです。
``` docker-compose.yml
nginx:
  container_name: nginx
 ports:
  - 8080:80
```

一応解決はできたけど、自分の中でこの現象を完全に理解しきれていないのでもう少し勉強します。
Dockerもちゃんと勉強したい....

## 参考
[https://zenn.dev/shimotaroo/scraps/a782c20d602070](https://zenn.dev/shimotaroo/scraps/a782c20d602070)
aws業務未経験者がawsアソシエイトを制覇した記録

この度12月末に合格したSAAに続き、DVAとSOAも合格したため勉強記録をまとめました。

SAAの受験記録はこちら
>https://qiita.com/cuti17/items/f0ccc0efe794fdf59029

## 前提・勉強時期
勉強開始前の段階で基本情報・AWS CLF/SAA・LPIC 1 を取得しています。
実務経験としては開発・システム運用合わせて2年強です。
AWSの実務は未経験です。
DVAもSOAも勉強時間は40日ほどです。(平日1時間休日3時間程)

### DVA
・ポケットスタディ AWS認定 デベロッパーアソシエイト (アソシエイト試験ポケットスタディ)
やや分厚いですが試験範囲の網羅性が高かったように感じます。

・Teckstock
SAAまではudemyの模擬試験を使用していましたが、65問解き切らないと答え合わせを出来ないことに不便感を感じて切り替えました。
問題の難易度も本番に近いように感じました。#1から最後まで1周→間違えた問題のみを解きなおす流れで問題を解きました。受験段階では正答率は90%程、本試験モードの正答率は80%程でした。

・試験
TeckStockと類似問題は4割ほどだった体感ですが、選択肢を吟味すれば答えを絞れるものが多かったように感じます。

### SOA
ポケットスタディ AWS認定 SysOps アドミニストレーター アソシエイト
これまでSAA,DVAを学習してきたこともあり、あまり目新しいこともなかったため購入しなくてもよかったと感じます。

・Teckstock
こちらもDVAの時と異なり問題が多いため#50から最後まで1周→間違えた問題のみを解きなおす流れで問題を解きました。受験段階では正答率は90%程、本試験モードの正答率は80%程でした。
受験時の正答率は90%程ですが、本試験モードの正答率は70%程でした。

・ラボ対策
大まかな記載ですが、以下サービスについて触れました。
・CloudWatchとSNSの連携
・VPCと複数サブネットの作成
・KMS→RDS→snapshotの作成
・S3作成→バージョニング

・試験
DVAと比べて類似問題は少なかったように感じましたが、本試験モードの正答率も70%ほどで見切り発車したので単純に理解度が低かっただけかもしれません。

ラボ試験はVPCとS3に関するものでした。S3はラボ対策で触れた内容より深いものが出ました。ストレージクラスの差異について理解も重要でした。


## アソシエイトを制覇して/今後について
すべて合格して難易度はSOA>SAA>>>DVAの順で難しいと感じました。
SOAだけ他より未知の事項について問われることが多かったです。
試験対策としてはudemyよりTeckstock派になりました。

SOAの対策や実試験でハンズオンでいろいろなサービスについて触れましたが、やはり実際に手でサービスに触れることは楽しいと感じました。
しばらくは試験対策だけでなく、実サービスに触れることをしたいと思いました。AWS試験としては夏ごろにDOPもしくはSCSを取得できるように取り組もうと思いました。
何をするにしてもセキュリティはついてくるものなのでSCSが本命かなあといった感じです。
PHPerKaigi 2023でレギュラーセッション登壇してきました！

## はじめに

>PHPerKaigi（ペチパーカイギ）は、PHPer、つまり、現在PHPを使用している方、過去にPHPを使用していた方、これからPHPを使いたいと思っている方、そしてPHPが大好きな方たちが、技術的なノウハウとPHP愛を共有するためのイベントです。

2023年3月23日（木）〜 3月25日（土）開催でした。

https://phperkaigi.jp/2023/

## 登壇セッション

https://fortee.jp/phperkaigi-2023/proposal/b9414c59-cb8f-4654-84c7-ade44744295e

https://speakerdeck.com/yamamotohiroya/an-quan-nihurosesuwoting-zhi-surutamenisikunaruzhi-yu-woxue-hou

今回初めてプロポーザル採択での登壇となりました。
講演聞いてくれた方ありがとうございました！

## PHPerチャレンジ

PHPerチャレンジについてはこちら

https://qiita.com/yamamoto_hiroya/items/dfba4c5861594c5fd6d8

## 気になった講演

### 名付けできない画面を作ってはならない - 名前を付けるとは何か

ほんとにそう。
あと名も無き家事の文脈が好きでした。

### 不幸を呼び寄せる命名の数々　 ～君はそもそも何をされてる方なの？～

これ1番印象に残ってる。
「君はそもそも何をされてる方なの？」
このフレーズ好き。
今後設計/開発していく時に絶対言う。

### 実例から学ぶ変化に強いテーブル設計 - 責務の分解とRDBMSの上手い使い方

安定のそーだいさんでした。

### その他

今回弊社NEはスポンサー&僕含めて4名の登壇がありました。
ご興味ありましたらご覧ください！

https://fortee.jp/phperkaigi-2023/proposal/db787adc-c855-4114-99b6-8c6958d47b42

https://fortee.jp/phperkaigi-2023/proposal/46c96d4a-194d-4bde-a4d8-f9c82c3b0302

https://fortee.jp/phperkaigi-2023/proposal/538a222e-0e86-4cd3-ac3d-fdcd7a280f35

## ベストフィードバッカー賞

去年殿堂入りして今年も殿堂入り扱いでしたｗ
とはいえ相変わらずフィードバックは大事の姿勢は変わらず、見たセッションにはほとんどフィードバックを書いています。
みんなもフィードバック書こう！

![スクリーンショット 2023-03-25 20.35.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67471/e3deaa44-9577-5095-8e8f-a41117d3f508.png)

![スクリーンショット 2023-03-25 20.35.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67471/d2276e0b-c624-f09a-fb64-46019f250449.png)


https://speakerdeck.com/yamamotohiroya/kanhuarensuhahuidobatukugada-shi

## まとめ

今回も非常に楽しめましたし登壇実績が解除できました！
小桜エツコさんに名前を呼ばれるという、なんともレアな体験もして大満足でした。
運営の皆様・スピーカーの皆様・参加者の皆様、本当にありがとうございました！
またらいねーん！