OmniAICreator/Qiita-1.07M huggingface dataset:
OpenCV(cv2)のインストール方法

## はじめる前にOpenCVとは?
OpenCV（Open Source Computer Vision Library）は、コンピュータビジョンや画像処理のためのオープンソースのライブラリです。主にC++で書かれていますが、Pythonなど他の言語でも使用することができます。

OpenCVは、画像や動画から情報を抽出し、処理するための豊富な機能を提供します。これには、画像の読み込み、表示、保存から始まり、画像処理、特徴検出、物体追跡、機械学習モデルの統合などが含まれます。

一般的な利用例としては、顔検出、物体検出、画像のフィルタリングや変換、画像の特徴抽出、カメラキャリブレーション、動画の処理などがあります。

## OpenCVを使うにはPythonのインストールが必要
〇前提条件
　Pythonの開発環境があること

まだPythonの開発環境がない方は以下の記事で、簡単に導入できます↓

https://qiita.com/umashikate/items/a612378f8eeb50d8dcfe

OpenCVをインストールする前に、Pythonのバージョンを確認しましょう。OpenCVがインストールできないときはPythonのバージョンが古い可能性があるので最新付近のバージョンにしてみてください。

```
python --version
```

## OpenCVのインストール
ここまでできたら、OpenCVのインストールに移ります。pythonではpipを使用してインストールしていきます。

インストールには2通りあり、基本モジュールのみのインストールと、拡張モジュールも同時にインストールする方法があります。

#### 基本モジュールのみのインストール
```
pip install opencv-python
```

#### 基本モジュール＋拡張モジュールのインストール
```
pip install opencv-contrib-python
```

インストールが完了したら、バージョン確認をして正しくOpenCVがインストールされたことを忘れずに確認しましょう。

OpenCVのバージョンを確認するためには、Pythonのコード内で次のようにして確認できます。

```python
import cv2
print(cv2.__version__)
```

このコードを実行すると、現在インストールされているOpenCVのバージョンが表示されます。表示されたらインストールは正しく行われています。

※上手くいかない場合はOSごとのインストール手順を再確認してみてください。

下記コードを実行してpipのバージョンをアップグレードしたのちに再トライするのも一つの解決方法です。
```
pip install --upgrade pip
```


以下は、OpenCVを使用して画像を読み込んで表示する簡単なサンプルコードです。

```python
import cv2

# 画像を読み込む
image = cv2.imread('image.jpg')

# ウィンドウに画像を表示する
cv2.imshow('Image', image)

# キー入力を待つ（任意のキーが押されるまで）
cv2.waitKey(0)

# すべてのウィンドウを閉じる
cv2.destroyAllWindows()
```

このコードでは、`image.jpg`という名前の画像ファイルを読み込み、ウィンドウに表示します。`cv2.imshow()`でウィンドウに画像が表示され、`cv2.waitKey(0)`で任意のキーが押されるまでプログラムが待機します。キーが押されると、すべてのウィンドウが閉じられます。
Lightsailを作ってみる④～【備忘録】SSH接続用アクセスキーの作成

# はじめに
以前からLightsailで諸々構築したりしてたのですが、今回どうしてもSSH接続がしたいということと、Lightsail構築時からあるデフォルトのアクセスキーは使用させたくないという思いがあり、デフォルトのアクセスキーのほかに接続用のアクセスキーを作成・接続してみたという備忘録になります。

**【以前Lightsailで色々やってた記事】**

https://qiita.com/Shun_konno/items/cc274c02ccb6931cb070

https://qiita.com/Shun_konno/items/f51ae599b68e0d2d36ea

https://qiita.com/Shun_konno/items/b6461594de1cdd7caa87

# 参考
https://docs.aws.amazon.com/ja_jp/lightsail/latest/userguide/amazon-lightsail-remove-ssh-key-on-instance.html

基本的に上記URL内記載の通りとなりますが、自分なりの注意事項や設定手順を忘れてしまわないように記載しています。

# 必要なツール
**Teraterm**
・接続確認用に使用します。LightsailはブラウザSSHが使えるので、設定の際は好きな方を使えばよいと思います。
**WinSCP**
・「.pem」ファイルを「.ppk」に変換するため同時にインストール可能な「PuttyGen」と生成したキーをダウンロードするのに使います。

# おおまかな流れ
・参考文献の「ステップ 1: プロセスについて学ぶ」を参照
```
1.キーペアを作成
・「ssh-keygen」を使って、公開キーとプライベートキーのペアを作成します。
2.インスタンスへの公開キーの追加
・SSHでインスタンスに接続して、キーペアの公開キーをインスタンスに追加します。
3.作成したキーペアでの接続テスト
・プライベートキーを使用して、接続することができるかのテストを行います。
4.追加した公開キーを削除
・今回追加したキーをインスタンスから削除します。
```

# 1.キーペアを作成

**1-1.TeratermもしくはLightsailのブラウザSSHでターミナルを開く**
こちらのキーペア作成についてはデフォルトのアクセスキーを使用して接続する。
デフォルトのSSHキーをダウンロードするのが面倒なら、ブラウザSSHから実施する方が楽かもしれない。

**1-2.接続したターミナルからコマンドを実行し、新しいキーペアを作成する。**
```
sudo ssh-keygen -t rsa
※元の記事では「sudo」はないが、実施には付与して実行した。
```

**1-3.作成するキーペアの保存先を指定する**
実施時はLinuxだったので、以下のように指定した。キーペア名に関しては今回作成したとわかるような名称を推奨
```
macOS、Linux、または Unix の場合: /home/<UserName>/.ssh/<KeyPairName>
```

**1-4.キーのパスフレーズを入力し、Enterキーを押下する。**

**1-5.確認が出てくるので、もう一度入力してEnterキーを押下する。**

**1-6.指定されたディレクトリにプライベートキーと公開キーが保存される。**

**1-7.公開キーを(.PUB)開いてテキストをコピーする。**

# 2.インスタンスへの公開キーの追加
公開キーの内容については、「~/.ssh/authorized_keys」に保存されているので、そこに対して今回作成した公開キーを追加する。

**2-1.LightsailのブラウザSSHかTeratermで接続する**

**2-2.vimで以下のファイルを開く**
```
sudo vim ~/.ssh/authorized_keys
```
:::note alert
「authorized_keys」ファイルにはLightsailのブラウザSSHで使用するデフォルトキーが記載されています。
こちらは削除するとブラウザからのSSHが接続できなくなりますので、注意です。
:::

**2-3.Vimエディタを挿入モードにして、今回作成した公開キーを追加します。**
ファイルの最後に改行を入力します。
デフォルトのキーと今回追加した公開キーの2つが並ぶ状態になると思います。

**2-4.ESCキーを入力して、「:wq!」を入力して、Enterキーを押下して、編集内容を保存して終了します。**

# 3.追加したキーを使用しての接続確認
今回追加したキーを使用して、「WinSCP」、「Teraterm」で接続確認を行います。
LightsailのブラウザSSHでは確認できないので、注意。

**3-1.WinSCPでデフォルトキーを使用してインスタンスへ接続し、今回作成した「pem」ファイルをダウンロードする。**

**3-2.WinSCPインストール時に同時に入れた「PuttyGen」を使用して、「ppk」ファイルに変換する。**

**3-3.WinSCPで変換した「ppk」ファイルを使用して、接続設定を行い、アクセスできるかを確認する。**

**3-4.Teratermで今回追加したキーを用いてアクセスできるかを確認する。**

# 4.追加したキーの削除
今回追加したキーが不要ならば以下の手順を実施して、削除します。

**4-1.デフォルトキーでLightsailのブラウザSSHもしくはTeratermで接続します。**
今回追加したキーでのアクセスではないので注意

**4-2.以下コマンドを実行し、vimで「authorized_keys 」ファイルを開く。**
```
sudo vim ~/.ssh/authorized_keys
```

**4-3.vimを挿入モードにして、今回追加したキーを削除する。**

**4-4.ESCキーを入力して、「:wq!」を入力して、Enterキーを押下して、編集内容を保存して終了します。**

**4-5.今回追加したキーを使用してアクセスの確認を行い、アクセス拒否されることを確認します。**



# AWSの相談・お困りごとありましたら、、、

AWSの活用方法や、お困りごとの相談、随時、お仕事の受付しております。

https://www.cs-cloud-aid.com/
【Linux】exit or cmd+D


# はじめに
今までログアウトするのに「exit」を打っていたが「cmd+D」でも抜けれるらしい。

# exit
exitはログアウトするコマンド。
suコマンドで別ユーザーに切り替えた後にログアウトする時に使う。

# cmd+Dでもログアウトできる
exitコマンドは「cmd+D」でも同じことができる。
今まで都度都度exitを打ってきたけど「cmd+D」のほうが楽。
【Linux】historyコマンドが便利すぎた


# はじめに
いままで使ったことなかった「history」コマンドについて調べた

# historyとは
現在のユーザーが実行した過去のコマンドの履歴を表示するコマンド。

```
history
~
498 cd hoge
499 npm i
500 npm run dev
```

# !番号コマンド
!の後にhistoryリストの左側の番号を入力して実行すると、その番号のコマンドを実行することができる。
例えば
```
499 npm i
```
を実行したい時は
```
!499
```
と打つとnpm iが実行される。
AWS認定 AWS Certified Solutions Architect - Professional 試験 (SAP-C02) に合格した話

## はじめに
最近、暑かったり、寒かったり、風が強かったり、雪が降ったりと、なかなか天気は安定せず、穏やかな春の訪れが待ち遠しいですね。

どーも、のぶこふです。

さて今回は、タイトルの通り、私（のぶこふ）が、SAP-C02に合格しましたよ。という内容です。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おー、AWS Solutions Architect Professional 合格してた!!<br>今までで一番勉強してなかったけど、とれてしまった（笑）<br>スコアは、毎回ギリギリだけどーーwww<a href="https://twitter.com/hashtag/AWS?src=hash&amp;ref_src=twsrc%5Etfw">#AWS</a> <a href="https://twitter.com/hashtag/SAP?src=hash&amp;ref_src=twsrc%5Etfw">#SAP</a> <a href="https://t.co/RFOP5QQEvn">pic.twitter.com/RFOP5QQEvn</a></p>&mdash; のぶこふ (@nobkovskii) <a href="https://twitter.com/nobkovskii/status/1770194655587774754?ref_src=twsrc%5Etfw">March 19, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
※たくさんの「いいね♡」ありがとうございます

## 本題に入る前に・・・
やればやるほど「なるほど、AWS・・・何もわからん！！」状態でしたが、無事に合格でした。
まぁ、まいどの如く、合格ラインギリギリの合格なので偉そうには出来ないですが。

さて、これで、弊社もSAP取得者が3名となりました。業務でなかなかAWSにさわれない方もいますが、着実に取得者は増えつつあります。

## 勉強方法、時間
Xの方でもつぶやきましたが、過去イチ勉強してないかもしれないです・・・

- CloudLicense
  - #65以降を1周
  - 計：130問程度
    - 通勤電車でポチポチしてましたが、通勤の頻度が減ったためそこまで周回できず。
- 「AWS認定 ソリューションアーキテクト プロフェッショナル」
  - https://www.amazon.co.jp/dp/4815617929
  - ※改訂版の前のものを使ってました
      - ざっと1周目を通して、巻末問題をパラパラと解いた程度
      - CloudLicenseで、不明なサービスや仕様が出てきたら、当書籍を辞書代わりに使用してました
- 【Youtube】AWS Black Belt Online セミナー
    - https://www.youtube.com/watch?v=jMJFFo1Oybo&list=PL-4pWB0kPX1V7M1v6Qhedf9G8c3ml6ji-
    - 倍速にして、ラジオ感覚で聞いてました
    - 公式から出ているものなので、安心して聞けました
- 【Youtube】【1週間で対策】AWSソリューションアーキテクトプロフェッショナル 合格のための勉強方法を解説【AWS SAP】
    - https://www.youtube.com/watch?v=asidPzf4ymY&list=PLCRz5JqTKzflFRQ-TsAJ3-ICPETqUoMJY
    - サーバーワークスさんのSAP模擬試験の解説動画
    - 試験に対する考え方が勉強になりました
    - こちらも、基本倍速でラジオ感覚で聞いてました

勉強方法は、問題を解く→不明点をまとめる→再度解く・・・のような流れで、進めていきました。
自宅では、子どもの寝かしつけと一緒に寝てしまったりとで、勉強する時間はあまり取れませんでしたが、途中、「[科学的根拠に基づく最高の勉強法](https://www.amazon.co.jp/dp/B0CTMFNJX8)」を読み、勉強のスタイルというか、記憶の仕方は少し変えました。

本腰を据えてからの期間としては2ヶ月くらいですが、それまでは「AWS Certified Security - Specialty」をだらだらと勉強してたりしてました。
「本腰を据えて」と言っても、上記の通り正直そこまで勉強してない（汗）

## 試験の難易度
「めちゃくちゃ難しかった」というわけではなかったと思います。（← どの口が言っとるんじゃ）
雰囲気はSAAと同じような感じがしました。
ただ、問題文や回答の選択肢が比較的長文であったり、そもそも問題数が多く（75問）、1周を終えて、160分くらい（残り20分）。
全問を見直しする体力も気力もなく、マークをつけたものだけ見直して終えました。

突飛な問題は特になく、SAAやSecurityあたりの知識があると、比較的解きやすい印象です。

## おわりに
ということで今回は、SAP-C02に無事合格することが出来ました。という内容でした。
Pearson VUEの再受験無料キャンペーン期間でしたので、気軽に受験できたのは良かったかなと思います。
受験前日もしっかりと睡眠を取っていたので、試験中はどうにか集中を保つことが出来ました。

今回は以上です。
ありがとうございました。
Salesforce TrailblazerDX 2024の情報を整理



https://www.salesforce.com/plus/

+ [【2024年3月22日開催】TrailblazerDX Global Gathering 2024]()
+ [Salesforce TrailblazerDX 2024: 必見セッションのリスト](https://www.salesforceben.com/trailblazerdx-2024-sessions/)
+ [TrailblazerDX: Salesforce 開発者と管理者のためのカンファレンス](https://www.salesforceben.com/salesforce-trailblazerdx/)
+ [写真で見る Salesforce TrailblazerDX 2024](https://www.salesforceben.com/salesforce-trailblazerdx-2024-in-pictures/)
【Linux】sudo suって？


# はじめに
sudo suコマンドが頻出する機会があったので曖昧に理解していたsudo suを調べた。

# そもそも「sudo」とは
スーパーユーザ（root）としてコマンドを実行できるコマンド。
通常sudoをつけない場合は現在のユーザー権限となるが、sudoをつけることでroot権限でコマンドが実行できる。

# 「su」とは
sudoに続く「su」は、ユーザー切り替えのコマンド。
つまり「sudo su hoge」とするとhogeユーザーに切り替わる。
デフォルトはrootユーザーなので、
```
sudo su
```
はrootユーザーに切り替わる。

# 「sudo su -」とは
suコマンドの後に「-（ハイフン）」をつけると切り替えたユーザのホームディレクトリに移動する。
つまり
```
sudo su -
```
は、rootユーザーに切り替えたあとにrootユーザーのホームディレクトリに移動する。
外出時のアラートはスマホで確認！New Relicのモバイルアプリを使ってみた！

# 概要
New Relicのモバイルアプリ使っていますか？出先でシステムの状況が気になった際も手元のスマホでシステムの状態を把握できるのでとても便利です！
AndroidとiOSに対応しているのでまだ使ったことが無い方はぜひ試してみてください。

:::note warn
前に投稿したNew Relicモバイルアプリの概要に関する投稿はこちら
https://qiita.com/T_OMORI/items/97d1aec4dede064fd4f9
:::

今回は最近のアップデート情報を元にして、***New Relicの画面をウィジェットとしてスマホの画面に貼り付け***てみたいと思います！

:::note info
このアップデートの詳細はこちら
[New Relic アップデート(2023年11月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202311 "New Relic アップデート(2023年11月)")
[New Relic アップデート一覧
](https://newrelic.com/jp/blog/nerdlog/new-relic-update  "New Relic アップデート一覧")
:::

# 手順

## 1. スマホにNew Relicモバイルアプリをインストール
New Relicのモバイルアプリのインストールや基本的な機能については、以前の投稿や公式ガイドを参照ください。

https://qiita.com/T_OMORI/items/97d1aec4dede064fd4f9

https://docs.newrelic.com/jp/docs/mobile-apps/mobile-apps-intro/

## 2. アプリの長押しメニューからウィジェット追加

ホーム画面でNew Relicモバイルアプリを長押しして、[Widgets]をタップします。

<img width="360" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/e865b51e-2ea8-d95d-a057-aafa2c35cac3.png">

Widgetの候補が出てくるので、[Issues Widget]をドラッグアンドドロップしてホーム画面に貼り付けます。

<img width="360" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/db787592-a6e4-d6a7-00a9-8292ae20e798.png">

アラートに関するWidgetを配置することができました！

<img width="360" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/906e648c-2e00-836e-eacb-001c72b069d1.png">

同じ方法でシステムのサービスレベルを確認することができる[Service Level Widget]も隣に配置してみました！

<img width="360" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/5ff6167b-44c1-9fef-0f0c-32913fbfc2aa.png">

New Relicモバイルアプリの長押しで出てくるメニューから簡単にウィジェットを追加できました！

## 3. アプリの中のチャートをウィジェット追加
New Relicモバイルアプリで開いているチャートの右上の三点リーダーから[Create widget]を選択することで、そのチャートをウィジェットとして画面に追加できます。

<img width="360" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/ccc78ba1-8561-31ae-2b6e-7fc355bcd747.png">

[Add to home screen]を選択します。

<img width="360" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/df6273db-c30d-ee12-5302-c138dee30e3e.png">

今回は、APM画面で表示されているレスポンスとダッシュボードで作成していたファネルをウィジェットとして追加してみました！

<img width="360" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/d059d60e-d415-5371-3e8e-8e242df58186.png">

# まとめ
新しく追加されたNew Relicモバイルアプリのウィジェット機能を試してみました！
様々なウィジェットを配置できるので、いろいろ試していただいて、システムの見たい情報を手軽に確認できるホーム画面を作成いただけれると幸いです。


:::note info
このアップデートの詳細はこちら
[New Relic アップデート(2023年11月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202311 "New Relic アップデート(2023年11月)")
[New Relic アップデート一覧
](https://newrelic.com/jp/blog/nerdlog/new-relic-update  "New Relic アップデート一覧")
:::

:::note info
[New Relic株式会社のQiita OrganizationOrganization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::
OmniStudio インストールエラー



# There were custom validation error(s) encountered while saving the affected record(s). The first validation error encountered was "The object type you specified OmniUiCard is invalid.".

+ [Package OmniStudio Install Failed](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZAWf2)

:::note
This error basically comes when there is no  appropriate license for the OmniStudio package.

Check if standard objects with the name "OmniXXX" (including OmniProcess & OmniUiCards) exist in the respective org? If not, that means that the licenses have not been properly provisioned.

OmniStudio licenses need to be activated prior to running the package installation. Activating the licenses will create the OmniStudio standard objects. The OmniStudio license names start with "OmniStudio".

https://help.salesforce.com/s/articleView?id=000393036&type=1


このエラーは基本的に、OmniStudio パッケージに適切なライセンスがない場合に発生します。

「OmniXXX」という名前の標準オブジェクト (OmniProcess および OmniUiCards を含む) がそれぞれの組織に存在するかどうかを確認しますか?そうでない場合は、ライセンスが適切にプロビジョニングされていないことを意味します。

パッケージのインストールを実行する前に、OmniStudio ライセンスをアクティブ化する必要があります。ライセンスをアクティブ化すると、OmniStudio 標準オブジェクトが作成されます。 OmniStudio ライセンス名は「OmniStudio」で始まります。
:::
Dictionary<TKey, TValue>のキーにするならGetHashCodeとIEquatable<T>を実装しよう

# 初めに
あるコードでDictionary<TKey, TValue>を使っていました。
そのコードでパフォーマンスが要求されるようになったので調べてそもそもDictionaryから値を取り出すのもそれなりに重い様子...ということで少しでもパフォーマンスを上げるためにはどうしたらいいかと調べたのでそのメモです。

# 結論
タイトル通りですが、キーに使うstructには
- GetHashCodeをオーバーライド実装する
- IEquatable<T>を実装する

と改善されました。

# もともとの実装と計測
もともとの実装は以下のようなstructをキーとして利用していました。
(名前は適当に変更してあります)

```csharp
public struct IntPair
{
  public int a;
  public int b;
}

// これをキーに使う例
public Dictionary<IntPair, string> _dict = new ();
```

Unity上で動かしていたので、この実装でシンプルに`_dict.Add`と`_dict.TryGetValue`を1000回ずつ回してプロファイラを見てみました。
※Deep Profileなので実際にはもう少し処理時間は短いはずです。

![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2399365/9d6d387b-f031-8794-f99c-8f31ca335673.png)

赤枠で囲った部分がDictionaryのAddとTryGetValueの部分です。
これを見るに、キーの比較にかなり時間がかかってそうですね。

# 改善する
[Dictionaryのリファレンス](https://learn.microsoft.com/ja-jp/dotnet/api/system.collections.generic.dictionary-2?view=net-8.0)を見るに、ざっくりとですが
- GetHashCodeをオーバーライドする
- 等価比較を実装する

とよさそうです。ちなみに、等価比較はいくつか方法がありそうですが今回は型の中で完結したいので`IEquatable<T>`を選択しています。

これを反映すると、
```csharp
public struct IntPair : IEquatable<IntPair>
{
    public int a;
    public int b;

    public bool Equals(IntPair another)
    {
        return this.a == another.a && this.b == another.b;
    }

    public override int GetHashCode()
    {
        return (this.a << 16) ^ this.b;
    }
}
```
こんな感じになりました。

さて、結果はというと...

![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2399365/6bc89a41-7918-5ee1-c059-5bf8833765ce.png)

GC Alloc も処理速度もめちゃくちゃ改善してます！
呼び出しもかなりシンプルになっており、効果は絶大でした。
ただし、裏を返せばGetHashCodeやEqualsの実装は気を付けないとパフォーマンスに大きな影響が出そうですね。
GetHashCodeとか、なるべくかぶらないように、かつ高速な演算が必要なので少し複雑な型だと難しそう...(そんな型をキーにするかといわれるとしない気がしますが)

# まとめ
`GetHashCode`と`IEquatable<T>`を実装すると、`Dictionary`のキーにしたときにパフォーマンスが改善する！

## 注意点
今回、`Equals`と`GetHashCode`を実装しましたが`GetHashCode`の影響が大きそうです。
呼び出し回数を見た感じ、`GetHashCode`を実装したことでハッシュの衝突回数が減っているのか`Equals`が呼び出される回数が極端に低いです。
とは言え、Equalsも呼び出しがシンプルになっているので効果はありそうなのと、Dictionaryの構造上ハッシュ計算で等価比較の回数を減らすのが重要であるのでこの2つをやっておけば良さそうという結論でよいのかなと思っています。
SIerのトンチキスクラムの中で行われるスクラム的な営みと悩みについて (8)

# スクラムチームの課題

初期：グループ会社の単位でチームが組まれていたため、サイロ化の危険が高かった　おそらく管理の都合でそうなっていた
中期：それぞれのチームは均一ではなく結成したときからの特有の現象がある
晩期：仕事の枯渇
終：解散

それぞれの段階について話していこうと思います。
ここがトンチキだとは思っていませんが、たまに「なぜに？　解せぬ」と思うことは何回かありました。

# 初期
初期メンバー、２0~25人のうち、スクラム経験者は５人というスタートを切ります。
スクラムマスターの３人と、メンバーでひとり、コーチがひとり。

そのイベントがなんのために行われるのかを知らず、どう振る舞えばいいかもわからず、ゴールもブレる。

割と絶望的な立ち上げです。

なので、最初に行ったのはインセプションデッキのウォークスルーと、スプリントの中で行われることの説明でした。

ここまでは普通だと思います。

そして脱落者が出ます。

最初の１週間に参加できなかった者、向かない人。

スクラムに適正があるかどうかわからない中、２０ないし２５人のうち離脱者が２名で済んだのは幸いだったかもしれません。

また、分割し統治せよというSIer側のドクトリンを打破するため、必要な交渉はメンバーが直接誰とでも行えるようにし、サイロ化の兆候は見つけ次第対策を打ちました。

「相手のことを思いやれるならば、誰と話してもよいのです。」

ほっておくと、コミュニケーションのパスが「メンバー→スクラムマスター（おそらくチームリーダー化する）→SIerの謎プロパー→他のチームのスクラムマスター（TLもどき）→メンバーまたはPO」
と言った形で交渉することとなり、ディレイが生じます。

せっかく同じフロアで仕事してるんだし、タイムラグはゼロでいこうか。
合意形成については・・他のチームと決めたことはチーム内に朝会などで話して追認することにしました。

異なるチームのメンバー間のダイレクトなやりとりがとてつもよい効果を生んだと思います。

# 中期
## ありがちなイベントの形骸化

レトロって何のためにやるのかを科学するのはとっても大事。
レトロのためのレトロから、隠された課題へとシフトできればとっても幸せだけど、なかなかそうもいかないから、トライの繰り返し。

１時間で終わらせる努力。

## 残業と欠勤
残業を認めるとどうなると思う？　休む人が出てくるんですよ。

たとえば契約の１６０時間に足りないとかそういう事情は勝手に埋めてくれていいんだけど、毎日キッチリ１ｈ残業して、月の契約時間（下限）をオーバーしそうだから休むって・・・・(ﾟДﾟ)ﾊｧ?

あのさあ・・１日だけ休む風邪とか風邪じゃねえし、おっさんの風邪はすぐなおらねーんだよ。

そうなるのがわかってたから残業は一切認めないって言ってたのにねー・・謎勢力の謎圧力がここだけは譲らぬ感じでしたので妥協した結果がこれだよ！

１日６時間、その他イベントなどで２時間、合計８時間働いてさっさと帰るってリズム作ればいいのに。
出勤すると損するメソッドでも組まれてるんですかね。

さて、この問題に対してのアプローチは各チームもろもろトライしていたようです。

### チームA
「休むときは俺に電話で連絡しろ」と凄むヤ◯ザの親方みたいな・・・何か外部に居て、その人と直談判しづらい状況があるようでした。
一種のパワハ◯ではなか？と思うんですが・・そのチームでは残業も減り出勤日数が正常に戻りました。

### チームY

私のチームではこの問題についてきちんと認識を共有し話し合った気がします。
なるべく帰れ、契約時間の問題があるときは相談しようと。

その結果、あんまり欠勤とかなかった気がします。
私のところは謎の縛りがユルく、スクラムマスターの私がさっさと帰れ派だったので。
むしろ誰か残ってたらその理由を聞きに行ってたような気がします。

### チームC
ちうごくからいらしてた来た方々のチーム。

私は中国**人**に対しては偏見はあんまりないです。
環境や文化は違えど人は悪くないと思います。

お酒をのむときはうっさいこともあるけど、日本に送り込まれた人たちは礼儀正しく勤勉で団結力があり、非常に良好な状態を維持しているように見えました。

就労ビザがとれないとか、空港で入国拒否されたとか、春節の時期に１スプリントまとめていなくなるとか、固有の現象はあった気がしますが、相対的に見て言語の壁が少しあるだけで優秀で働き者さんたちの集合でした。

あんまり休む人もおらず、話をきいたところ日本では遊びにもいかないみたいなので、ほんとに仕事しにきてるだけでしたので、休む人たちはあんまりいなかったみたいです。

# 晩期
作るものがなくなれば仕事は枯渇する。
最大出力に特化したチーム構成だからそうなるんだけど、特に語ることなし。

私がプロジェクトを去るのを決意したのはこの頃でした。
万事順調、私のすることはなくなった。

スクラムマスター３５番目の仕事、「自分が必要なくなったら自分をクビにする」が発動です。

# 終期
嘘を聞かされてないのであれば、お客様が満足して大団円だったそうです。
Db2 for i Services Directory : SYSTOOLS.RELATED_OBJECTS 表関数

最近ようやく問い合わせが増えてきたIBM i サービスですが、本日はそのデータベース版(Db2 for iを操作する）のDb2 for i の一つを紹介します。

■表関数：SYSTOOLS.RELATED_OBJECTS
■カテゴリ：ユーティリティサービス
■サポート：IBM i 7.2以降

## SYSTOOLS.RELATED_OBJECTS 表関数で何ができる？
一言で言えばDSPDBRコマンドと同様な物理ファイル(テーブル）－論理ファイル（ビュー）の依存関係を表示してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/8cf6a2c9-1de7-a58c-9e8a-ad4f3c01adb4.png)


### DSPDBRコマンドの例
**DSPDBR DEMOLIB/TOKMASP**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/0f4561be-271f-a71c-d185-e8b9ef6f3b93.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/964ecc16-592d-9923-8735-f2248dded106.png)

上記のようにTOKMASPテーブル（PF）を基にしているビュー(LF）が表示されています。
**実はTOKMASL1～5はCRTLFコマンドで作成、TOKMASLXはCREATE VIEWコマンドで作成していますが、DSPDBRコマンドだとその区別はつきません。

### SYSTOOLS.RELATED_OBJECTS表関数の例
DSPDBRコマンドと同じPFをこの関数で表示して見ます。

**select * from table (systools.related_objects(
library_name => 'DEMOLIB',
file_name => 'TOKMASP'));**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/54ae1284-7109-b45f-a1ee-7a40d36cfc39.png)
**SQL_OBJECT_TYPEカラムを見ると、
LF(CRTLFコマンドで作成）は KEYED LOGICAL FILE
ビュー（CREATE VIEWで作成）は VIEW**
と表示されその出自が識別できます。

また、下記のようにLAST_ALTERD カラムには最終変更日が出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/ed5a2f66-0d17-ee34-a6ea-bd5a0c847b5e.png)
この変更日付は、SQLインターフェースからの変更だけでなく、CHGLFコマンドでの変更も対象になります。


■参考: [Db2 for iサービス, ユーティリティー、RELATED_OBJECTS 表関数](
https://www.ibm.com/docs/ja/i/7.5?topic=services-related-objects-table-function)
技育祭2024の感想


# 技育祭2024春
## 1. はじめに
2024/3/16~17の2日間にわたって開催された技育祭について、感想と今後の進路に向けて投稿しようと思います。

技育祭を知らない人、技育祭がどんなものなのか雰囲気が掴めるような内容になればなと思っています。

自己紹介です。

https://Twitter.com/live_in_2107

Xでは、「学生室の住人」として、日々学生室と呼ばれる研究室メンバーのための部屋に入り浸っています。2027卒として院卒での就職を考えています。サッカー観戦が好きです⚽️

## 2. 技育祭とは
>技育祭とは
  技育祭は「技術者を育てる」ことを目的とした
  エンジニアを目指す学生のための
  日本最大のオンラインカンファレンスです

*技育祭ホームページ [^1]*  

### 技育祭のポイント
1. 圧倒的なインプット
  およそ30の講演を2日間に渡り実施。短期間で多くの学び、気付きを提供
2. 超豪華なゲスト陣
  IT業界を代表する経営者、CTO、エンジニアが集結。ゲストに直接質問も可能
3. 仲間ができる
  全国から4,000人のエンジニア学生が集結！学生さん同士の交流コンテンツもご用意


## 3. イベント
  印象的なセッションを2つ挙げさせていただきます。

### 1. 技術担当役員と育成責任者が考える”ポテンシャルの育て方”
株式会社DeNA技術統括部・統括部長の小林篤さんと技術統括部エンジニアリング室新卒研修グループリーダーの平子裕喜さんのセッションでした。よく就活では、ポテンシャル採用という言葉を聞くので、企業の考えるポテンシャルとはなんなのかお話をいただきました。
- 2,3年でエンジニアの働き方は変わる
  生成AIの登場により、エンジニアの仕事は無くなるのでは？という質問が今回の技育祭では多い話題だったと思います。実際、企業から見ても2,3年後の予測は困難であると知りました。このコロナの影響でリモートワークが普及したように、働き方は常に変化するということを頭に入れることが重要であると思いました。
- 質よりも圧倒的量
  アウトプットする際に質にこだわることは、誰しもが考えることだと思います。しかし、考えすぎてしまい、なかなか踏み切れなくなってしまうことも多いと思います。そこで、量をこなすことを考えることが、行動のハードルを下げる方法の一つだということです。

https://twitter.com/live_in_2107/status/1768907326222938227

- ワクワクは魔法の言葉
  ワクワクは、自分を動かす魔法の言葉です。努力という言葉は必ずしも楽しい印象を持てないと思います。しかし、ワクワクには努力とは違い自然と手を止めることなく、成長できます。少しでもワクワクすることに関して、足踏みするのではなく、それは努力以上に成長できる機会なのではないかなと思いました。

https://twitter.com/live_in_2107/status/1768906083257753707


### 2. 最新版！新卒がIT企業選びをするための完全攻略法2024
株式会社ゆめみ代表取締役の片岡俊行さんのセッションでした。
ここでは、エンジニアにとって企業は選べる時代ということで、いかに自分を企業にアピールするかについて色々とお話ししてくださいました。話に夢中になりツイートできてませんでしたw
- 陥りがちな罠
  面接等で企業に自分をアピール際に、やり方を間違えてしまいかえって逆効果になってしまう事例を紹介してくださいました。
  「アピール病」
    エンジニアの方は、アピールが苦手な方が多い傾向にあるそうです。そこで事実を解釈をわけることで、客観的な発言と適切なアピールにつながります。ワンメッセージでいうことも重要です。喋りすぎようとすると緊張するので、気を付ける
  「迎合病」
    ついつい会社に合わせてしまうことです。企業からの視点では、そういった迎合しすぎてしまう人材は、そこまで必要としていないそうです。
  「自分自分病」
    面接官が知りたいことを面接で伝えることが重要です。余計なことは面接時間を伸ばしてしまい、自分のほかのアピール時間が減ってしまいます。

- 面接官視点を持つ
  「ビジョン・バリュー重視」
    プロダクト企業や社会解決企業では、同じ目標に向って汗をかけるかどうか、使命感を持てるのかを見られています。
  「バリュー(価値観)重視」
    協調性、誰とやるのかを重視するので、面接官が同じ価値観を共有できると感じられるかを見られています
  「スキル重視」
    支援事業を行う会社は、スキルがあるのかどうか、学習姿勢があるのかを見られています。

## 4. 今後どうしていきたいか
まず、2年後の就活に対して、自分に足りないものを見つけようと思いました。
今回のイベントで、学生に対する企業目線を見ることができました。
そのためにも、継続的に挑戦し続けていくことが大事だと思いました。2年後に面接官に欲しいと求められるアウトプットを作り出すことができればと思いました。
また、今回のイベント終了直後は、モチベーション高くなると思いますが、継続的にその状態を維持することは難しいです。一時の行動力ではなく、継続できるような環境に入ることや整備すること、そしてアウトプットすることが重要だと思いました。

## 学生サポーターの件について

https://twitter.com/live_in_2107/status/1766482375259873544

今回、技育祭を参加するだけではなく、一緒に盛り上げる学生サポーターに参加しました。Twitterでは、「#技育祭」をつけ、開催日前日から様々な場面で技育祭の紹介を行ってきました。自分も学内での紹介を行いました。当日は、積極的にセッションについての感想を呟いていました。技育祭に参加者と感想の共有をすることや、つながりを守ることができたことは非常に面白かったです。技育祭後でもこの繋がりは、一時のモチベーションで終わってしまうことを防止するツールの一つかなと思いました。もし、今後学生サポーターをやりた方がいましたら、ぜひ参考になればなと思います。

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

### 参考文献
[^1]: [技育祭2024春ホームページ](https://talent.supporterz.jp/geeksai/2023spring/)
『電験３種』良く分からなくなる箇所

# ＜理論＞
あまりにもポイントが多すぎるので割愛。
というか全て大事。


# ＜電力＞
## パーセントインピーダンス
最は分かりやすく変圧器を例にする。
定格容量Sn／定格電圧Enが規定されているということは定格電流Inを定義できる（定格電流＝定格容量／定格電圧）
⇒　なら、定格インピーダンスを定義できるのでは？
⇒　定格インピーダンス「Zn＝In／En」

ただ、実際の配線インピーダンスzは決まった数値がある。実際のインピーダンスと定格インピーダンスの比を**パーセントインピーダンス**とする（%Z=z/Zn）

## 短絡電流とパーセントインピーダンス
短絡電流ISは電路のインピーダンスzだけになったときの電流と言える。
代表として定格時の数値を使うので、「Is=En/z」となる。

zをパーセントインピーダンスに変換すると、
「Is=En/{%Z/Zn}」→「Is=En/{%Z×En/In}」→「Is=In／%Z」→→→「%Z=In／Is」

覚えることは
①定格電流のように定格インピーダンスを定義する。
②パーセントインピーダンスとは実際のインピーダンスと定格インピーダンスの比。

# ＜機械＞
## 短絡比、同期インピーダンス
短絡比を一回忘れて、同期インピーダンスを発電機のインピーダンス（変圧器のパーセントインピーダンス）と捉えることで整理できる。

ポイントは
①同期発電機のインピーダンスが低い　⇒　電圧降下が少なくなり、発電機として安定した電圧を供給できる。
②同期機発電機のインピーダンスは基本的に巻線のL成分。
　同期機インピーダンスが高い　⇒　巻き線が多い（**銅線が増えるので、銅が多くなる＝銅機械**）

あとはこれを
・鉄機械は銅機械の逆の特性を持つ
・短絡比はパーセント化した同期インピーダンスの逆数
ということで読み変えていく。

※短絡比でなく同期インピーダンスが本質なのに注意。
※電気回路の特性として理解することが重要。短絡比ベースだと丸暗記のような理解の仕方になる。

# ＜法規＞
電力が大きく関係しているので、電力の内容を中心に理解すると論説、計算問題の意味が分かり覚える効率は上がる。

## 地絡に関するイメージを掴む
大地に電流が流れることをしっかり理解すれば、地絡電流系の問題は理解できる。

## 法令の暗記は過去問を繰り返し、パターン認識する
覚えるのは大変。しかも、法令にはなぜそうなるかの理由がない（法令にそう書いてあるから、以上の答えはない）
どの人にもあるパターン認識能力を活用する他ない。

同じ問題は少ない時間で反復し、焼き付けるイメージがいい。
【JavaScript】Hoistingとは

# Hotistingとは
JavaScriptにおける"hoisting"（ホイスティング）は、変数の宣言や関数の定義が、そのスコープ内の先頭に移動される挙動を指します。つまり、コードが実行される前に変数や関数がメモリに割り当てられ、それらが使用可能になるということです。

具体的には、JavaScriptエンジンがコードを実行する前に、変数の宣言部分がそのスコープの先頭に移動され、初期化はそのままの位置に残ります。関数の場合も同様で、関数の宣言部分がスコープの先頭に移動されます。

たとえば、次のコードを考えてみましょう。

```javascript
console.log(x); // undefined
var x = 5;
console.log(x); // 5

foo(); // "hello"
function foo() {
  console.log("hello");
}
```

このコードでは、変数`x`と関数`foo`が使用される前に宣言されていますが、実際には宣言された位置と異なる箇所で使用されています。JavaScriptのhoistingにより、実際には以下のように解釈されます。

```javascript
var x; // 変数の宣言部分が先頭に移動
function foo() { // 関数の定義が先頭に移動
  console.log("hello");
}

console.log(x); // undefined
x = 5;
console.log(x); // 5

foo(); // "hello"
```

 # まとめ
このように、変数や関数の宣言がそのスコープの先頭に移動することで、意図しないエラーを回避することができますが、コードの可読性や予測性が低下する可能性があるため、hoistingの影響を十分に理解しておくことが重要です。
【JavaScript】プリミティブ型とは

# プリミティブ型とは
JavaScriptのプリミティブ型は、データの基本的なタイプを表します。以下は、プリミティブ型の主な種類です：

1. **文字列 (String)**:
   - テキストデータを表現します。ダブルクォーテーション (`"`) またはシングルクォーテーション (`'`) で囲まれます。

2. **数値 (Number)**:
   - 数値データを表現します。整数や浮動小数点数などの数値を扱います。

3. **真偽値 (Boolean)**:
   - 真(true)または偽(false)の値を表現します。条件式や制御構造などで使用されます。

4. **undefined**:
   - 変数が宣言されているが、値が代入されていないことを表現します。

5. **null**:
   - 値が存在しないことを表現します。変数が存在するが、何も参照していないことを示します。

6. **Symbol**:
   - ES6で導入された、一意の識別子を表現します。主にオブジェクトのプロパティキーとして使用されます。

これらのプリミティブ型は、JavaScriptでの基本的なデータ操作や条件処理などで広く使用されます。それぞれの型は特定の役割を果たし、異なる文脈で使用されます。
【JavaScript】スコープの種類

# スコープの種類
JavaScriptにおけるスコープは、大きく分けて次の3つのタイプがあります。

1. ブロックスコープ（Block Scope）:
   ブロックスコープは、一般的に `{}` で囲まれた範囲を指します。JavaScriptでは、`let` や `const` キーワードで宣言された変数はブロックスコープを持ちますが、`var` キーワードで宣言された変数はブロックスコープを持ちません。
   
   ```javascript
   {
     // ブロックスコープ
     let blockVar = "I am a block scoped variable";
     const blockConst = "I am a block scoped constant";
     var globalVar = "I am a global variable";
   }
   
   console.log(blockVar); // エラー: ブロックスコープ外からはアクセス不可
   console.log(blockConst); // エラー: ブロックスコープ外からはアクセス不可
   console.log(globalVar); // アクセス可能
   ```

2. 関数スコープ（Function Scope）:
   関数スコープは、関数内で宣言された変数がその関数内でのみアクセス可能であることを意味します。JavaScriptでは、`var` キーワードで宣言された変数は関数スコープを持ちます。
   
   ```javascript
   function functionScopeExample() {
     // 関数スコープ
     var functionVar = "I am a function scoped variable";
     console.log(functionVar); // 関数内でアクセス可能
   }
   
   console.log(functionVar); // エラー: 関数スコープ外からはアクセス不可
   ```

3. グローバルスコープ（Global Scope）:
   グローバルスコープは、どこからでもアクセス可能な最も外側のスコープです。スクリプトのどこからでもアクセス可能な変数や関数がグローバルスコープに定義されます。
   
   ```javascript
   var globalVar = "I am a global variable";
   
   function globalFunction() {
     console.log("I am a global function");
   }
   
   console.log(globalVar); // グローバル変数にアクセス可能
   globalFunction(); // グローバル関数にアクセス可能
   ```

これらのスコープを理解することで、変数や関数のアクセス性を適切に管理することができます。
デプロイ後にCloudFrontのキャッシュ削除をLambda関数で自動化する

## はじめに

S3＋CloudFrontでホスティングされているプロジェクトでCodePipelineでS3へのデプロイ後にCloudFrontのキャッシュを自動で削除するLambda関数を作成しました。

備忘録として残します。あくまでも簡易的な実装例の1つとして参照してください。

## 概要

HTML/CSS/JavaScriptで構成されている静的サイト。
S3でホスティングしCloudFrontから配信している。
CI/CDがCodePipelineで自動化されている。
CloudFrontのキャッシュの削除を手動でマネジメントコンソールから行っていた。

## 実装
### 1. キャッシュ削除を行うLambda関数を実装
今回、Lambda関数はPythonで実装する。

```bash
import boto3
import time
import os

# Lambdaのエントリーポイント
# HP本番環境のCloudFrontディストリビューションに対してキャッシュ削除を行う
def lambda_handler(event, context):
    client = boto3.client('cloudfront')
    pipeline = boto3.client('codepipeline')
    try:
        # HP本番環境のディストリビューションIDを指定してキャッシュ削除を実行
        invalidation = client.create_invalidation(DistributionId='【ここにCloudFrontのディストリビューションIDを記載】',
            InvalidationBatch={
                'Paths': {
                    'Quantity': 1,
                    'Items': ['/*']
            },
            # CallerReferenceは一意になるように設定する必要があるため、現在時刻を設定
            'CallerReference': str(time.time())
        })

         # CodePipeline ジョブIDを取得
        job_id = event['CodePipeline.job']['id']

        # CodePipeline に成功レスポンスを送信
        pipeline.put_job_success_result(jobId=job_id)

    except Exception as e:
        # CodePipelineのジョブIDを指定して失敗を通知
        pipeline.put_job_failure_result(
            jobId=job_id,
            failureDetails={
                "type": "JobFailed",
                "message": str(e),
            },
        )
```

要点を説明すると、
- CodePipelineから呼び出されることを前提にキャッシュを全削除する。
- キャッシュ削除をする際にCallerReferenceが一意である必要があるので現在時刻を設定
- CodePipelineのジョブIDを取得してキャッシュ削除が完了したことをCodePipelineへ通知する

### 2. Lambda関数用のIAMポリシーを編集

Lambda関数に関連付けしているIAMロールにアタッチされているIAMポリシーに必要な権限を追加する。
CodePipelineへ実行結果を通知するために
- “codepipeline:PutJobFailureResult"
- "codepipeline:PutJobSuccessResult"

Lambda関数がCloudFrontのキャッシュを削除するために
- "cloudfront:CreateInvalidation”
の権限を許可する。

### 3. CodePipelineを編集
S3へのデプロイが完了した後に新しくステージを追加し、アクションプロバイダーをAWS Lambdaに設定する。
2．で実装したLambda関数を呼び出す。
### 4. 動作確認

デプロイを実行し、CloudFrontの対象のディストリビューションのキャッシュ削除の履歴を確認し、実行されていることを確認する。
【Cloudfront】 SPAをホストする場合、「/」以外のアクセスでリダイレクトさせる

## エラーの内容

Cloudfrontとs3を使用してVue製のSPAフロントエンドをホスティングしている時に、「https://example.com/login」のような、root直下以外のurlパスを指定したり、リロードするとCloudfrontのAccessDenyのエラーが表示されてしまった。

## 原因

Cloudfrontのエラーページの設定をしていなかったため。

「/login」のようにroot直下の「/」以外に直接アクセスされたり、リロードされるとCloudfrontはオリジンの対応するhtmlを探しに行ってしまう。

当然、「login.html」のようなページは用意しないのでファイルが存在せず、エラーとなる。

## 解決策

CloudFrontのカスタムエラーレスポンスで、403のときに/index.html（今回は「/」）へ転送するよう設定する。

今回、フロントエンドのインフラをTypeScript版aws cdkで構築しているため、以下のように記述しデプロイした。

```typescript
        // CloudFrontディストリビューションを作成する
		const distribution = new aws_cloudfront.Distribution(this, "Distribution", {
			domainNames: ["example.com"],
			certificate,
			comment: "example.com",
			defaultRootObject: "index.html",
			defaultBehavior: {
				allowedMethods: aws_cloudfront.AllowedMethods.ALLOW_GET_HEAD_OPTIONS,
				cachedMethods: aws_cloudfront.CachedMethods.CACHE_GET_HEAD_OPTIONS,
				cachePolicy: aws_cloudfront.CachePolicy.CACHING_OPTIMIZED,
				viewerProtocolPolicy:
					aws_cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
				origin: new aws_cloudfront_origins.S3Origin(websiteBucket, {
					originAccessIdentity,
				}),
			},
			// 403エラーの時に「/」に飛ばす(SPAのため、リロードや直アクセスに対策するため)
			errorResponses: [
				{
					httpStatus: 403,
					responseHttpStatus: 200,
					responsePagePath: "/",
				},
			],
			priceClass: aws_cloudfront.PriceClass.PRICE_CLASS_100,
		});
```

## 結果

Access Deniedのエラーが表示されることはなくなり、リロードされたり、URLで直接アクセスされても表示できるように修正できました。

## 参考文献

[https://dev.classmethod.jp/articles/s3-cloudfront-spa-angular-403-access-denied/](https://dev.classmethod.jp/articles/s3-cloudfront-spa-angular-403-access-denied/)
【JavaScript】スコープとは

# スコープとは
JavaScriptにおけるスコープ（scope）とは、変数や関数が参照可能な範囲を指します。スコープは、変数や関数が定義された場所によって決まります。JavaScriptでは、主に次の2つのスコープがあります。

1. グローバルスコープ（Global Scope）: グローバルスコープは、どこからでもアクセスできる最も外側のスコープです。スクリプト内のどこからでもアクセス可能な変数や関数がグローバルスコープに定義されます。ただし、モジュール内や関数内で `var` や `function` を使わずに変数や関数を定義すると、それらはグローバルスコープではなくモジュールスコープやローカルスコープになります。

```javascript
// グローバルスコープ
var globalVar = "I am a global variable";

function globalFunction() {
  console.log("I am a global function");
}
```

2\. ローカルスコープ（Local Scope）: ローカルスコープは、関数内で定義された変数や関数が含まれます。ローカルスコープ内で定義された変数や関数は、その関数内でのみアクセス可能です。

```javascript
function localScopeExample() {
  // ローカルスコープ
  var localVar = "I am a local variable";

  function localFunction() {
    console.log("I am a local function");
  }

  console.log(localVar); // ローカル変数にアクセス可能
  localFunction(); // ローカル関数にアクセス可能
}

localScopeExample();
// console.log(localVar); // エラー: localVar は localScopeExample の外側からはアクセス不可
// localFunction(); // エラー: localFunction は localScopeExample の外側からはアクセス不可
```

スコープのルールは、変数の参照や関数の呼び出し時に適用されます。JavaScriptはスコープチェーンを持ち、変数や関数が参照される際に、その参照先がどのスコープに存在するかを順番に探索します。
プロトタイプとは

# プロトタイプとは
プロトタイプ（Prototype）は、JavaScriptにおいてオブジェクト指向プログラミングの特徴の1つです。通常のクラスベースのオブジェクト指向プログラミング言語とは異なり、JavaScriptではプロトタイプベースのオブジェクト指向が採用されています。

プロトタイプは、オブジェクトが持つメソッドやプロパティの元となるオブジェクトのことを指します。すべてのオブジェクトは、プロトタイプを持っており、プロトタイプからメソッドやプロパティを継承します。

例えば、次のようにオブジェクトを定義することができます。

```javascript
// Personオブジェクトの定義
var Person = {
  // プロパティ
  name: "John",
  age: 30,
  // メソッド
  greet: function() {
    return "Hello, my name is " + this.name + " and I'm " + this.age + " years old.";
  }
};
```

この`Person`オブジェクトは、`name`や`age`などのプロパティと、`greet`などのメソッドを持っています。これらのプロパティやメソッドは、`Person`オブジェクトのプロトタイプに属しています。

新しいオブジェクトを作成する際には、この`Person`オブジェクトを元にして、継承したプロパティやメソッドを持つことができます。

```javascript
// 新しいオブジェクトの作成
var person1 = Object.create(Person);
person1.name = "Alice";
person1.age = 25;

console.log(person1.greet()); // "Hello, my name is Alice and I'm 25 years old."
```

このように、JavaScriptのプロトタイプは、オブジェクト指向プログラミングにおける継承のメカニズムを提供します。
【非同期処理】について学習したのでまとめてみた

# はじめに
非同期処理について曖昧だったので、アウトプットも兼ねて説明していきます。

# 同期処理と非同期処理
同期処理は、コードが上から順に実行される方法です。例えば、処理1、処理2の順番で処理が記述されている場合、処理1が完了してから処理2が実行されます。

一方、非同期処理では、処理が終わるのを待たずに次の処理が行われます。つまり、処理1を実行中に処理2も同時に実行されます。

非同期処理の利点は、処理が待機されずにすぐに次の処理が行われるため、全体の処理が速くなることです。

# 非同期処理の実行
非同期処理を実行するために、JavaScriptでよく使われるのがsetTimeout関数です。これは一定時間後に特定の処理を実行するためのタイマー機能です。

以下にsetTimeout関数の例を示します。
```react
setTimeout(() => {
  console.log('こんにちは');
}, 1000);

setTimeout(() => {
  console.log('こんばんは');
}, 1000);
```
このコードでは、1秒後に同時に「こんにちは」と「こんばんは」が表示されます。

また、Promiseを使えば、処理の完了を待ってから次の処理を行うことができます。Promiseは必ず結果を返してくれる仕組みです。

以下はPromiseを使った例です。
```react
new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log('こんにちは');
    resolve();
  }, 1000);
}).then(() => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('こんばんは');
      resolve();
    }, 1000);
  });
});
```
このコードでは、「こんにちは」が表示された後に「こんばんは」が表示されます。

# async/await
Promiseを使うときには、then()を使って処理を記述しますが、処理が複雑になるとコードが複雑になります。そこで、async/awaitが役立ちます。これはPromiseをより簡潔に書くための方法です。

以下はasync/awaitを使った例です。

```react
async function asyncFunction() {
  await greeting('こんにちは', 1000);
  await greeting('こんばんは', 1000);
}

function greeting(word, milliseconds) {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log(word);
      resolve();
    }, milliseconds);
  });
}

asyncFunction();
```

このようにすることで、非同期処理を同期処理っぽく書くことができます。

# 参考
https://zenn.dev/nameless_sn/articles/javascript_async_tutorial
Remote-SSHで接続中にいきなり初期化が無限ループしだした


今回VSCodeで使用していた拡張機能は「Remote-SSH」です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726019/56c35cf6-663a-5741-6096-9b737fdd4b0d.png)

## 事象
AWS EC2にリモート接続している最中、いきなり初期化が無限ループしだしました。
```
Setting up SSH Host XXX: (details) Initializing VS Code Server
```
とりあえず接続を切って再接続を試すも解消せず・・・

## 応急処置
インスタンスを停止して、再度開始させました。

さすがの再起動様様（AWS上厳密に言うと再起動はしていないけど）と思いつつ作業を再開したらまた現れたので
対処法としてもう少し調べてみました。

## Remote-SSHの設定をいじってみた
なぜ初期化がループするかと言うと、接続先でゾンビプロセスが悪さをしているとかしていないとか。
だとすると、応急処置としてはプロセスをkillでいいのかもしれません（今回は試していません）

そもそもゾンビを発生させないため（と認識している）の対応として、
Remote-SSHの以下の設定を有効にしました。
#### lockfiles In Tmp
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726019/1cd1592b-6e10-abf5-418b-bd530cf70d92.png)

~~一応これを有効にしてから同事象は発生していません。~~
~~たまたまかもしれないので、もう少しきちんと理解したいところです・・・。~~

## 同一ユーザーの使用が原因だった
ということに落ち着きました。ユーザーはきちんと分けましょう・・・。
ちなみに今度こそ同事象は発生していません。
今回は関係無さそう、という判断でlockfiles In TmpもFalseに戻しました。

## さいごに
~~また発生したらもう少しきちんと調べて更新したいと思います。~~
ユーザーはやっぱりきちんと分けた方がいい（当たり前でした）
型の共変 と 反変 をGenericsなしで説明する

Genericsなしで 共変 と 反変 を説明している動画を見つけて、おもしろかったので投下します。

https://www.youtube.com/watch?v=6moaoAJui_4

---

# サンプルコード

```kotlin
interface VendingMachine {
	fun purchase(money: Coin): Snack
}

sealed interface Pruduct 

sealed interface Snack: Pruduct {
	data object Candy: Snack
	data object Cookie: Snack
}

sealed interface Money

sealed interface Coin: Money {
	data object Quarter: Coin
	data object Dime: Coin
}
```

### 用語

VendingMachineは、 CoinとSnackというパラメータを持っている と言える。

VendingMachineはコンテナ というメンタルモデルで表現できる。

# 型の共変

### 外に出ていくパラメータとコンテナの関係

外に出ていくパラメータ

- コンテナのプロパティ
- 関数の戻り値

そのinterface によって “生成される” パラメータ とも言える。

コンテナを具体化する時に生成されるパラメータの型を具体化することは 型安全である

```kotlin
class CandyBarVendingMachine: VendingMachine {
    override fun purchase(coin: Coin): Snack.Candy = randomCandy(coin)
}
```

なぜなら、Snack であっても Candyを安全にインスタンス化して返せるから

```kotlin
class CandyBarVendingMachine: VendingMachine {
    override fun purchase(coin: Coin): Snack = randomCandy(coin)
}
```

コンテナが具体的になるにつれて、外に出ていくパラメータも具体的にできる性質のことを**Covariance（共変）** という。

# 型の反変

### 内側で消費、操作 されるパラメータとコンテナの関係

内側で消費、操作されるパラメータ

- 関数の引数

その interface によって “操作”,”消費” される パラメータとも言える

コンテナを具体化する時に、“操作”,”消費” される パラメータの型をより一般的にすることは 型安全である

```kotlin
class CandyBarVendingMachine: VendingMachine {
    override fun purchase(money: Money): Snack.Candy = randomCandy()
}
```

なぜなら、MoneyにはCoinも含まれるため、操作数側からするとCoinとしても使えるから。

```kotlin
class CandyBarVendingMachine: VendingMachine {
    override fun purchase(money: Money): Snack.Candy  {
	    when (money) {
		    is Coin -> randomCandy(coin)
		    ..
	    }
    }
}
```

ただし、KotlnではこれはCompilerに拒否される。Kotlinでは関数のオーバーロードが許可されているのでそちらと見分けがつかないため。

```kotlin
'purchase' overrides nothing
```

ので、型パラメータ T を使わない場合は以下の方法を取る必要はある

```kotlin
// override とoverload を分離
class CandyBarVendingMachine: VendingMachine {
    fun purchase(money: Money): Snack.Candy = TODO()
    override fun purchase(coin: Coin): Snack =  randomCandy(coin as Money)
}
// or
// 変数にする
interface VendingMachine {
	val purchase: (Coin) -> Snack
}
class CandyBarVendingMachine: VendingMachine {
	override val purchase: (Money) -> Snack = { randomCandy(it) }
}
```

`CandyBarVendingMachine` は `VendingMachine` のサブタイプで、MoneyはCoinのスーパータイプ 。つまり、コンテナが具体的になる際に、 “操作”,”消費” される パラメータ は 一般的になることができる。これを **Contravariance( 反変）**という。

# ジェネリクス を使うと

```kotlin
interface VendingMachine<in T, out R> {
	fun purchase(money: T): R
}
```

in が Contravariance を意味していて、Tは より一般的な型になれる。

out が Covarianceを意味していて、Rは より具体的な方になれる。

```kotlin
VendingMachine<Coin, Snack>
↑↓
VendingMachine<Money, Candy>
```
Phoenix LiveViewでのSocket管理と状態更新


## はじめに
ElixirでのWebアプリケーション開発において出会う様々な用語や概念を深堀します。今回は、Phoenixフレームワークを使用した際のLiveViewのディレクトリ構造やコードの書き方に焦点を当てて解説していきます。

前回の記事から読むとPhoenixフレームワークの概要が理解しやすいと思います。
[PhoenixフレームワークにおけるLiveViewとWebソケット通信~LiveViewとJavaScript間での双方向のイベント通信~](https://qiita.com/mito_mito/items/3cb51e768a54750b7e75)

## LiveViewのディレクトリ構造

プロジェクト名が`pj_apple`の場合、LiveViewのソースコードは`lib/pj_apple_web/live`ディレクトリに配置されます。
ロジックを記述する.exファイルと、HTMLを記述する.html.heexファイルが主に使用されます。ただし、`render/1`関数内に直接HTMLを記述することも可能であり、その場合`.html.heex`ファイルは不要になります。

```Elixir
# user_login_live.ex
defmodule PjAppleWeb.UserLoginLive do
  use PjAppleWeb, :live_view

  def render(assigns) do
    ~H"""
    <div class="mx-auto max-w-sm">
      <!-- 新規登録の処理 -->
    </div>
    """
  end
end

```

## Socketによる状態の管理と更新

LiveViewでは、socket変数を用いて、WebSocket接続情報とLiveViewの状態を管理します。状態の更新は`assign/3`関数で行い、状態の確認は`render/1`関数や`socket.assigns`を通じて行います。

```Elixir
assign(socket_or_assigns, key, value)
```
最初の引数は、LiveView　の`socket`または`assigns`関数コンポーネントからのマップのいずれかです。第二引数、第三引数はkeyとvalueの組み合わせです。

```Elixir
assign(socket, :name, "Elixir")
```
共通設定の例は以下の通りです。

```Elixir

  def assign_common_settings(socket) do
    socket
    |> assign(:set_setup, false)
    |> assign(:memo_active, false)
    |> assign(:iframe_src, nil)
  end
```

[参考hexdocs:Phoenix.LiveView.Phoenix.Component.assign/3](https://hexdocs.pm/phoenix_live_view/Phoenix.Component.html#assign/3)

[参考hexdocs:Phoenix.LiveView.render/1](https://hexdocs.pm/phoenix_live_view/Phoenix.LiveView.html#c:render/1)

## Socketの値をもう少し詳しくみる

`assign/3`を使って追加した値は、`socket`構造体の`assigns`マップの中に格納されます。以下はあくまでイメージです。


```bash
%socket{
    assigns: %{
        login: true
        user_id: 1
        user_name: "検証さん"
        login_date: ~N[2023-06-15 00:00:00]
    }
}
```

ビュー側で`socket`に`assign`したデータを使用する場合、`socket.assigns`は`@`を使って参照できます。HTMLタグの属性の中で使用する際は{}で囲む必要があります。

```Elixir
    <p :if={@login}><%= @user_name %></p>

```



[参考hexdocs:Phoenix.LiveView.Socket](https://hexdocs.pm/phoenix_live_view/Phoenix.LiveView.Socket.html)

## まとめ
今回は、Phoenix LiveViewを用いたリアルタイムWebアプリケーション開発の基本的な概念に焦点を当て、特にLiveViewのディレクトリ構造と、LiveViewの核となる機能であるsocketの管理と状態更新の仕組みについて解説しました。

## 最後に
誤りなどありましたらご指摘お願いします！
また、thewaggleではElixirでの開発にジョインしてくださる仲間を募集しています！
ご興味ある方、お気軽にご連絡ください。
Tauri でウィンドウ状態を保存・再現する

# はじめに

ウィンドウ系のアプリケーションの起動・再起動サイクルでストレスレスにする一つの要素として、ウィンドウの状態の再現性がある。
これは例えば、Qt/PySide (Qt for Python) の場合などは、自前で保存、再現のプログラムを書かなくてはならない。
もちろん、UI の状態保存・再現は別途行う必要はあるが、ウィンドウ状態の再現性はフレームワークでサポートしてほしいと常々思う。
では、Tauri ではどうやるのか？どう操作しているのか？が気になったのでそれを調べたまとめ。

## 前提: 環境

* Windows 11
* Rust v1.72.0
* Tauri v1.4


# 実装

デフォルトでは以下の用に、ウィンドウ位置もウィンドウサイズも保存してくれない。
これだと、好みの作業環境をウィンドウサイズを変更して作成していたりする場合などにも結構ストレスに感じてしまう。

![cap2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/21322ec9-38d3-e78d-fb2a-efdd91b9424c.gif)


## プラグインの導入

ウィンドウ状態の保存を Tarui フレームワークとして取り込むためにはプラグインを導入する必要がある。
これが、[window-state](https://github.com/tauri-apps/plugins-workspace/tree/v1/plugins/window-state) というもの。

https://github.com/tauri-apps/plugins-workspace/tree/v1/plugins/window-state

```toml:Cargo.toml
[dependencies]
tauri-plugin-window-state = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" }
```

:::note info
[Tauri でグローバルシングルトンを実装する](https://qiita.com/takavfx/items/d0335f47c80ff58e9c5b) でも書いたが、公式プラグインの導入方法の一つ（例外もある）として、この [plugins-workspace]() レポジトリからインストールすることを薦めていたりする。そのため、上記もそれに習ったインストール方法を活用している。（Cargo にそんな機能があったのをこの Tarui の検証で初めて知った…:innocent: ）
:::

## プラグインの有効化

プラグインの有効化にはウィンドウセットアップ時にプラグインを有効化する。

```diff_rust:src_tauri/src/main.rs
fn main() {
    tauri::Builder::default()
+       .plugin(tauri_plugin_window_state::Builder::default().build())
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}
```

# ウィンドウ保存のしくみ

## Window 保存範囲

ウィンドウ保存の範囲は v1 の時点で以下のように構造体で定義されている。
これから読み解くと、ウィンドウの

- 横幅
- 縦幅
- ポジション(x,y)
- 最大化表示かどうか
- 表示状態かどうか
- ウィンドウ装飾が有効化どうか
- フルスクリーンかどうか
 
を保存するようになっている様子。

```rust
struct WindowState {
    width: f64,
    height: f64,
    x: i32,
    y: i32,
    maximized: bool,
    visible: bool,
    decorated: bool,
    fullscreen: bool,
}
```

https://github.com/tauri-apps/plugins-workspace/blob/v1/plugins/window-state/src/lib.rs#L57-L66

## 保存形式とファイル位置

ウィンドウ保存は、ライブラリのソースから、**Json 形式で保存されている**事がわかる。
これは、ウィンドウ状態の構造体の derive マクロで `serde::Deserialize` 及び `serde::Serialize` を使用していることからも分かる。

```rust
use serde::{Deserialize, Serialize};

#[derive(Debug, Deserialize, Serialize, PartialEq)]
struct WindowState {
    ...
}
```

この構造体で宣言済みのアトリビュートをどこに保存しているかだが、どうやらこれは Tarui のコンフィグ保存の仕組みを利用している様子。

保存場所は OS ごとに違うが、Windows の場合は、`~/AppData/Roaming/<アプリのidentifier>` に `.window-state` というファイル名で保存されているようだ。

これは、以下のソースコードとドキュメントからわかる。

https://github.com/tauri-apps/plugins-workspace/blob/v1/plugins/window-state/src/lib.rs#L91-L92

https://tauri.app/v1/api/js/path/#appconfigdir

どうやら、最悪リセットする場合はこのファイルを削除すればよさそうだ。

# まとめ

ユーザーからもこういうウィンドウ操作の状態保存・再現に関する要望は頻繁に出てくる内容だし、かつ、自分が1ユーザーの時にもこのレベルの対応がされてないと結構ストレスに感じることが多い（毎度 DnD して最適な位置に持って行って、スケールして作業環境を構築するということを毎回強いられるものもある…）。

これで、ウィンドウ状態の保存・再現ができるようになったので、この対応をやるだけでもだいぶウィンドウ操作を前提にしたアプリケーションらしくなったのではと思う。
2024/3/25主にITとかセキュリティの記事

観察して効率良く学ぶ「ネットワークセキュリティ」(3/22)
https://qiita.com/makotohanada/items/4bce4c5061e4b59f8148

ワールドコイン、ユーザーによる個人データ保存を導入(3/23)
https://coinpost.jp/?p=518510

捜査能力向上に人材育成　茨城県警、2団体と協定　サイバー犯罪根絶目指す(3/23)
https://news.yahoo.co.jp/articles/f1d5cae689f1e3a42d6421d48e6e519ba4a678fc?source=rss

米SEC、仮想通貨セクター監督の資金増額求める　2025年会計年度で(3/23)
https://coinpost.jp/?p=518635

米SEC、グレースケールのイーサリアム先物ETF申請を再度延期(3/23)
https://coinpost.jp/?p=518558

AI事業者ガイドライン第1.0版（案） チェックリスト(3/22)
https://blogs.itmedia.co.jp/business20/2024/03/ai10.html?ref=rss

Streamlit in Snowflakeを使用する6つのセキュリティ的メリット(3/22)
https://zenn.dev/masayay/articles/286258c26e4f7e

米運輸省、個人情報の取り扱いで大手航空会社を調査へ、広告や顧客データを活用した事業の情報提供を求める(3/22)
https://www.travelvoice.jp/20240322-155345

鹿児島県警個人情報漏えい「あってはならない。指導徹底する」　国家公安委員長、調査・捜査は「事実に即し厳正対応」(3/23)
https://373news.com/_news/storyid/192213/

機密指定の要件は「法案成立後に政府内で決める」　経済安保情報保護法案が衆院内閣委員会で審議入り(3/23)
https://www.tokyo-np.co.jp/article/316739?rct=politics
[Ubuntu][Apache]サイトにsslを設定する方法

## 要　旨
OSはUbuntu22.04LTS、WebサーバーはApacheの組み合わせでサイトにsslを設定する方法について記述します。
## 実行環境等
ドメイン取得:ムームードメイン
KAGOYAのVPS契約
VPS:KAGOYA VPS KVM 大容量 CPU:2コア メモリ:2GB ストレージ:200GB
    OS:Ubuntu22.04LTS
    料金:32円/日、880円/月（2024.3.24時点）
使用PC:DELL G16 7630(ノートPC　cpu:i7 13650HX メモリ:16GB ストレージ;500GB)
## 実施要領
最初にドメインを取得する。（ムームードメイン）
KAGOYAにVPS契約実施
ムームードメインでDNSの設定を実施する
KAGOYA VPSでドメインのDNS設定を実施する
（ドメインの登録と、契約したサーバーの正引きにドメイン登録の２つを実施）

サーバーにログイン。
以下rootで実施した。
アップデート
```linux
apt update
```
アップグレード
```linux
apt upgrde
```
apache2のインストール
```linux
apt -y install apache2
```
snapのアップデート
```linux
snap install core
```
```linux
snap refresh core
```
既にインストるされているcertbot-autoの解除
```linux
apt install dnf
```
```linux
dnf remove certbot
```
certbotのインストール
```linux
snap install --classic certbot
```
certbotコマンドの準備
```linux
ln -s /snap/bin/certbot /usr/bin/certbot
```
certbotをapache2に自動設定する。
```linux
certbot --apache
```
これで指示に従って入力していく。
- メールアドレスの入力
- 利用規約に同意する　Y(es)
- メールアドレスにお知らせを受信するか聞かれる　Y(es) またはN(o)
- ドメインを入力する
Successfullyが表示されれば成功

ブラウザでhttps://[ドメイン名]にアクセスして、/var/www/html/index.htmlが表示されれば完成（最初はApacheの初期画面が表示される）
なおUbuntu22.04LTSではsslの3か月更新が自動更新されれるので、更新については特に処置しなくてよい。

以上でsslの設定終了です。お疲れさまでした。
## 結　言
今回は、OSはUbuntu22.04LTS、WebサーバーはApacheの組み合わせでサイトにsslを設定する方法について記述しました。
最後までご覧くださり、ありがとうございました。
UnrealEngineで画面サイズを取ってきたいぞ！！！！(EventConstructでは画面サイズが取れない話)

初めまして、普段同人ゲームを作っている**にーあい**です。

UnrealEngineでパッケージ化するときの***キリリッ***って音、ちょっとびくってなりませんか？僕はなります。

# 画面サイズを取得したい！！！！！！
ちょっと凝ったUIを作ろうと思ったらおそらくどこかで画面サイズを取得したくなる日がやってくると思います。

たとえば、任意のAnchor配置でwidgetの位置とかを取ってきたい場合にはもう画面サイズが必須なんじゃないのってそんな感じです。

なお、画面サイズとはEditorでのviewportやパッケージ化したあとのWindowのサイズを指すこととします。

さらに、本記事はド初心者が見つけた解決策をとりあえずまとめたものです。用語とかもあんまりよくわかっていないので、もし間違い等見つけられましたらご教授いただけますと幸いです。

## 基本的な画面サイズの取得のしかた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754903/d7ed6b30-37ec-fbdf-1d2f-4b608cf6476a.png)

Qiitaってスクショをそのままペーストできて便利ですね。

<br/>

画面サイズを取ってくるときは、このいずれかのノードを使うことになると思います。

<br/>

Get Viewport Sizeからは画面の縦横サイズがピクセル数で取れます。これをScreen to Viewportでviewport座標系?に変換できます。

<br/>

下のGet Viewport Widget Geometryは名前の通り、Viewportにあるwidgetのgeometryを取ってきます。Geometryって幾何学ですからね、サイズ以外にも位置とかこれらに準ずる情報を持っていそうです。
これからGet Local SizeかGet Absolute Sizeすればviewport座標系が取得できます。

<br/>

(二つあるってことはそれぞれにメリットデメリットあるはずなんですが、正直どっちがいいのかはよくわかってません。また問題が生じたときに検証します……)

<br/>

**しかし！！！！！！**

ある条件下だと画面サイズを取得することができないんです！！！！

# EventConstructでは画面サイズが取れない！(と思った方がよさそう)
ここまでの内容だと、ググるかBluePrintEditorで右クリックしてノードを調べてたらそのうちたどり着けます。僕もノード眺めてたらなんか見つけました。

**しかし(二回目)！！！！！！**

widgetの初期位置を保存しておきたい場合など、最初に画面サイズを取得したい場合にはこれらをEventConstructに繋いで使いたくなりますが、**無理です！！！！！**

<br/>

これが本題です。

少なくとも、先ほど紹介した方法は二つともEventConstructにつないだ状態では画面サイズ0か-nan(ind)を返します。
Editorから選択ビューポートで実行すると普通に取得できるのですが、スタンドアロンやパッケージ化した後だとちゃんとした値を返してくれません。(と思った方がよさそう)というのはそういうことです。

# 解決方法
一応、1フレーム目で画面サイズを取る方法があります。

**EventTickに繋ぐ**

これです。
様々検証したところ、PreEventConstructやEventConstructをはじめとして、UnityでのAwakeやStartメソッドに相当するタイミングではどの場合でも画面サイズが取れないのですが、それ以降になるとどういうわけだか取ってこれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754903/a01973bc-7c56-c509-f901-f297b05ab964.png)


この例では毎Tick画面サイズの変化を調べています。

PreTickResolutionは名前の通り、前Tickでの解像度というかサイズを保存しているVector2D型の変数です。
これの初期値を(0,0)にしておくことで、1フレーム目(や画面サイズが変化したタイミング)セット:PreTickResolutionから実行ピンを伸ばせば起動時に実行したかったこともできるというおしゃれ仕様。

<br/>

もちろん、次のようにすれば本当に1フレーム目だけ実行することも可能。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754903/bd8513b4-a6fa-92d0-5a1b-5f1219dc48ef.png)


ただしIsFirstTimeはデフォルト値をFalseにしておきましょう。

# さいごに
結局、EventConstructでは画面サイズを取ってこれないからEventTickを使おうという話でした。もしEventConstructで取ってこれるのであれば毎Tick無駄な判定をかますという悲しいことをしなくてすむのに……

## X/Twitterも見てね！！！！！
→[X/Twitter(@2iStudio048)](https://twitter.com/2iStudio048)
【SPLK-1001】Splunk Core Certified Userを日本語で受験した

# 投稿の経緯
【SPLK-1001】Splunk Core Certified Userを日本語で受験して合格しました。
日本語で受験すると決めてから、どのような問題が出題されるか調べてみたのですが全く情報がなかったので、これから日本語で受験を考えている方に私の体験が役に立てばと思い投稿しました。

# 前提
①SPLK-1001を日本語で受験予定の方に向けた記事です
②2024年3月現在、私が学習～合格までに得た情報です

# 日本語で受験して大丈夫？
**結論から言うと、日本語で受験してもほぼ問題ありません。**
私が気にしていたのは下記の2点です。

　①機械で直訳していて読みにくい、または理解できない箇所があるのではないか
　②問題文や選択肢にでてくるサーチ文まで翻訳されてたり、崩れたりしてないか

 ①に関しては若干違和感を感じるところもありましたが、ニュアンスが全く読み取れないというものは無かったかなと記憶してます。
 Splunkの用語が変な日本語に翻訳されてるということもありませんでした。
 一番頭を悩ませたところでいうと、"論理演算子"のことを"理論値"と翻訳している問題があり、最初は？？だったのですが、後述する問題集に全く同じ問題が出てきてたことに気づき、なんとか解けたものもありました。
 
 ②に関しては全く問題ありませんでした。（あったら返金してほしいレベルですが）

 # 勉強方法・期間
 ※出題範囲や受験方法は英語と同じなので省略します。

###### 勉強期間
 勉強期間は3日です。
※Splunk初心者ではありません。（後述の「【参考】私の事前知識」を参照）

 Splunk未経験でもDBやSQLについては分かるという方は1ヵ月、DBやSQLに触れたことがなくデータ分析ってなんぞやって方も2～3カ月見ておけば合格できる難易度かと思います。
最悪、後述の問題集丸暗記すれば合格できます。（理解が深まるかは置いといて。。）
 
 ###### 勉強方法
自分のPCにフリーライセンスのsplunkを構築しました。
Udemyで下記の問題集を購入しました。
　**【SPLK-1001】Splunk Core Certified User 試験対策問題集(日本語/Japanese)**

 基本的には上記問題集を解き、分からないところをネットで調べたり、splunkをいじったりして理解を深めました。
実際の試験では60問中50問前後は問題集と同じ問題が出ました。
問題集は2千円弱しますが、英語のサンプル問題はネットにゴロゴロ転がってるのに対し、日本語の問題は全く落ちてませんし、受験料が2万円弱するので不合格で再受験することを考えたら買っちゃっていいのかなと個人的には思います。
**あと、ネットに落ちてる英語のサンプル問題は普通に解答が間違えてることがあるので気を付けてください！**
 
 ###### 【参考】私の事前知識
 私のSplunkの経験としては、開発で1年弱程度SPLを組んでおり、開発後も維持保守で必要な時だけSplunkWebからSPLを発行してます。（もう数ヶ月触ってないかも。。）
 本認定試験で出題されるコマンドは一通り触れたことがありますが、オプションの理解までは曖昧でした。
 SplunkWebも触れてはいますが、サイドバー、レポート、グラフ、権限等の細かな仕様は全く知らないレベルでした。

 # 受験した感想
 Splunk経験あり、テストセンターでの受験経験ありということで特に苦に感じることはありませんでした。
 試験の位置づけも一番下なので、これから一般ユーザとしてSplunkを触れていく人に向けた導入といった感じでした。
 ですが、普通にSplunkを触っているだけでは意識しない仕様などを知る機会になったので受験してよかったです。
 2024年内にはSPLK-1002も受験してみたいと思います。
bundle install実行時に"An error occurred while installing pg (1.5.6), and Bundler cannot continue. "って出る時

## 概要
```
$ rails new アプリ名　--database=postgresql
```
や
```
$ bundle install
```
などを実行した際にタイトルのエラー文に遭遇しました。

エラー文からわかる通り、「Railsのposgresql用のgemをインストールしている最中にエラーが発生しました」ということだとは思うのですが、ネット記事などで似たようなケースがあまりなく、類似の記事でも原因が自分のケースと全然違うようだったのであまり参考にならなそうですが自分のケースを備忘録的に書いてみました。

 ## やったこと

```
$ brew services list
```
で
mysql none
postgresql@14 started 
と表示されていたので、動いている状態でした。

##### 最初から確認してみた

pg_config --version などのコマンドを実行して、PostgreSQLがインストールされているかを確認します。
```
$ pg_config --version
=> PostgreSQL 14.11(Homebrew)
```
でhomebrew経由で入れたpostgreSQLがしっかり入っていました。

```
$ which psql
=> /opt/homebrew/bin/psql
```

これはpsqlなどのDB操作をするときのコマンドの実行パスが表示されるようで
```
$ pg_config --bindir
=>/opt/homebrew/Cellar/postgresql@14/14.11_1/bin
```


こちらはPostgreSQLのbinディレクトリのパスを表示するようです。分かれてるっぽい？

調べるとgemでpgを入れるときに指定しなければいけないのはbinディレクトリのパスの方で
```
$ bundle config build.pg --with-pg-config=<pg_configのパス>
```

のようにすると上手くいきました！


## まとめ
正直なぜこのような必要があったのかがいまいちわかっておらず、ただの備忘録的な感じになってしまいました。
またネットに似たような記事があまりなく、自分自身特に変わったことをした覚えはないのですが、
結果的にgemに意図的にpostgresqlのパスを指定しないといけない状況だったみたいです。