OmniAICreator/Qiita-1.07M huggingface dataset:
デジタル庁のデザインシステムサイトでコンポーネントが公開

# 背景
6時間ほど前に、デザインシステムのβ版を公開したと公式X(旧Twitter)でお知らせされていました。

https://x.com/digital_jpn/status/1796071035160101186

以前にもデザインが簡素かつ非常に優れていると話題にもなっていましたね。
Qiitaでも話題になっていました。
https://qiita.com/mu_tomoya/items/f78f1fad3a8b57ac7dc3
情報のキャッチをたまたま早くにできたため、早速見てみることに。
なお、本記事では、公開されたという情報の発信を中心としています。

# デザインシステムサイトのコンポーネントがGitHubで公開される
デザインページの中で、コンポーネントというページがあります。各コンポーネントのページに、対応するGitHubのリンクが用意されています。
以下、リポジトリのリンクです。

https://github.com/digital-go-jp/design-system-example-components

# 早速動かしてみる
主な使用技術は、Tailwind CSSとStorybookであり、各自リポジトリをクローンして確認できるようです。
簡単に言うと、Tailwind CSSはReactやNext.jsなどで主流なCSSフレームワークのひとつであり、Storybookはコンポーネント単位のモックをブラウザ上で確認できるUIカタログツールです。
以下、それぞれの公式サイトのリンクになります。

https://tailwindcss.com/

https://storybook.js.org/

以下のコマンドで、GitHubからリポジトリをクローンして、Storybookを動かしましょう。
特に環境構築が必要なわけでもなく、Dockerでイメージの構築も必要ないため、1分もかからず動かせます。

```
$ git clone https://github.com/digital-go-jp/design-system-example-components
$ cd design-system-example-components
$ npm install
$ npm run storybook
```

出力については、各自でご確認ください。
すでに結構な数のコンポーネントがすでに公開されており、今後も追加で実装されていくようです。
Biome.jsを使っていたりと、意外なところもありました。あまり知らない技術について知る・触れる機会にもなりますし、実際に見てみるとやはり勉強になります。
私も初心者だからこそ、こういった情報に対して即行動が重要であると感じました。
特にこういった簡素かつ明瞭なコンポーネントを教科書として理解できるというのは非常に大きいですね。

# おわりに
今回は自分のことではありませんが、情報の鮮度を優先して本記事を公開いたしました。
細かなところまでは確認できていないのですが、Tailiwind CSS, Storybookを使っている私にとってはかなりありがたい情報です。
最短で直線的に CCSP を取得する (2024/05版 受験記)


## 目的とゴール
- 一般的なクラウドセキュリティの考え方を知る
- クラウドセキュリティに長年関わっているが我流の知識なので、頭の中の整理として
- 投下できる時間がないので、最短で勘所（＝自分の知らない箇所、自分の考えと違う部分）を抑えて合格を目指す

## スキルセット
- CISSP取得済(10年前くらい)
- クラウドセキュリティに関わって約５年

## 結果
- ４営業日で合格できました(・ω・)ノ

## 手順

1. まずこれで概要を知る。CBKドメインをチェック 0円
    [CCSP EXAM READY: CCSP合格者が、合格の秘訣についてディスカッションします](https://www.brighttalk.com/webcast/14253/591733)
1. 模試を買って腕試し 4400円
    [(ISC)2 CCSP Certified Cloud Security Professional Official Practice Tests (3rd Edtion)](
    https://www.amazon.co.jp/Certified-Security-Professional-Official-Practice-ebook/dp/B0BG6CXXHQ       )
    購入後はここからオンライン模試が可能（本の内容 - 特定箇所の単語を入れて登録）
    [Sybex Test Prep & Certification Products](https://books.wiley.com/series/sybex-test-prep-and-certification/)

1. 模試で80％得点できるまで頑張る
    Step1 - 125問 81/125  64% → 次の本で間違った分野を復習
    Step2 - 125問 102/125 82% → OK

1. 本を買ってわからない箇所があればチェック。8800円
    [CCSP CBK公式ガイドブック](https://www.amazon.co.jp/CCSP-CBK%E5%85%AC%E5%BC%8F%E3%82%AC%E3%82%A4%E3%83%89%E3%83%96%E3%83%83%E3%82%AF-%E3%83%AC%E3%82%B9%E3%83%AA%E3%83%BC%E3%83%BB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%95-ebook/dp/B0BB6C65GL)
    ※これはオプション。参考書として持っておいてもいいかも程度
    
1. 受験日を決定
    [ISC2 Japan](https://japan.isc2.org/examination_ccsp.html) > 試験申し込み:ピアソンVUE
    運よく２日後の枠が空いてました

1. 受験 $599 (約90,000円)
    150 問を 240 分でやっつける
    30 問ごとに小休憩して集中力をキープ
    模試の問題と比べて、考え方を問うものが多かった印象
    何を聞いているかわからない問題は、サンプルだと思ってあきらめる

1. 合格後、資格を申請
    合格後に送られてくるメールから申請
    CISSP 保持者は推薦人を入れなくても大丈夫でした


## 所感

- クラウドセキュリティを３年くらいやっていれば、各領域の基本知識は備わっているかと
- 経験的に弱い部分がわかっていれば、少し勉強しておくと良さそう
（コンプラやリスク管理関連、アプリ開発とか。業種やロールによっては疎遠なので）

## 注意
:::note warn
試験内容やトレーニングコンテンツが変わっているかもしれないので、ここで最新の公式情報をチェックしましょう
https://japan.isc2.org/examination_ccsp.html
https://www.isc2.org/certifications/ccsp/ccsp-self-study-resources
自作PC失敗した話

## 初めての自作PC
初ゲーミングPCを作成しましたが
起動せず3か月くらいただの箱にしてしまったので
誰かの踏み台になれば幸いです。

## 現象
自作PCで以下の構成で組んだところマザーボードのステータスチェッカーが白く光りさらに黄色いLEDも光り、起動せず。
CPU、グラフィックボードのファンは回る状態。

## パーツ
・グラフィックボード
玄人志向 GG-RTX4060-E8GB/SF
・RAM
Crucial CT2K16G48C40U5 (DDR5 PC5-384..
・マザーボード
ASUS TUF GAMING H770-PRO WIFI
・CPU
Intel Core i7 13700F
・PSU
Thermaltake PS-SPD-0600NPCWJP-W (600W)
・ROM
Crucial(クルーシャル) P3plus 1TB 3D NAND CT1000P3PSSSD8JP

## 解決策
ドスパラ修理サービスに連絡し郵送で修理をお願いしました。
原因は電源回りの配線ミスとCPUの温度が高温であったことでした。
配線を直してもらいCPUクーラを別途購入し返送してもらいました。

費用は以下
セーフティサービスに加入していたので割と安く修理できました。

```
商　品　名 数量 単価 金額
1 SSS 引取修理_通常ﾌﾟﾗﾝ 1 ¥3,300 ¥3,300
2 SSR 技術料金(Aﾌﾟﾗﾝ) 1 ¥11,000 ¥11,000
3 #DEEPCOOL AK620(1150-2066 AM2-4 FM1-2+) 1 ¥7,702 ¥7,702
4 SSR 梱包箱代 1 ¥2,200 ¥2,200
5 SS特典 送料無料ｻｰﾋﾞｽ 1 -¥3,300 -¥3,300
6 SS特典 技術ｻﾎﾟｰﾄｻｰﾋﾞｽ値引き 1 -¥11,000 -¥11,000
------------------------------------------------- --------- ---------
小計 ¥9,902
(内税) ¥900
(39ポイント還元) 税込合計 ¥9,902
```

## その他試したこと
・全てのパーツの再組立て
・マザーボードのCMOSクリア
・CPUとRAMの交換(ドスパラ)
・マザボとグラボの動作検証(ドスパラ)



## 反省
今回の原因とは別ですが、初心者の自作PCでCPUをFつきにしてしまったので、映像が出ないのはCPUの問題かグラボの問題か切り分けがしにくいなと思いました。
ドスパラさんご迷惑おかけしました。
microで Error: listen EADDRINUSE: address already in use localhostが発生


## 対応内容

`micro`から`express`に変更した

### 削除

```
  "micro": "^10.0.1",
  "micro-cors": "^0.1.1",
```

### 導入

```
 "cors": "^2.8.5",
 "express":` "^4.19.2",
```

## 発生したエラー

microのissueに上がっていた↓と同じ

修正MRはできているが近いうちにリリースされる様子がない👀


https://github.com/vercel/micro/issues/480


```
micro: Accepting connections on port 3010
micro: Error: listen EADDRINUSE: address already in use localhost
    at __node_internal_captureLargerStackTrace (node:internal/errors:490:5)
    at __node_internal_uvExceptionWithHostPort (node:internal/errors:589:12)
    at Server.setupListenHandle [as _listen2] (node:net:1724:21)
    at listenInCluster (node:net:1789:12)
    at Server.listen (node:net:1888:5)
    at startEndpoint (/Users/xxx/sdm-queue/node_modules/micro/dist/src/bin/micro.js:123:12)
    at start (/Users/xxx/sdm-queue/node_modules/micro/dist/src/bin/micro.js:145:13)
micro: Gracefully shutting down. Please wait...
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
```

## 考えたこと

### 懸念点

- 提示された解決策では個人のリポジトリをcloneしている
- microが2年くらいアップデートがないのでなかなか修正版リリースされなさそう
  - OPENになっているMRも直近１年放置されている
      - https://github.com/vercel/micro/pulls
  - 不具合修正のMRも2年間そのまま


### memo

ついでにapollo-server-microが@apollo/serverへ統合され非推奨になっていたので @apollo/serverに変更した


https://www.apollographql.com/docs/apollo-server/migration/#removed-integrations
IAM Identity Centerを使って簡単にAWSアカウントにサインイン出来るようになりました。


# はじめに
みなさん、こんにちは。GENEROSITYの西村です。
弊社では、半年ほど前に、`AWS Organizations`を導入しまして、`IAM Identity Center`を使ってシングルサインオンをすることが可能となりました。 
弊社では、何十を超えるAWSアカウントを運用管理しているため、毎日のようにお世話になっています。
今回は、アクセスポータルから、AWSアカウントを選択せずに、特定のAWSアカウントのマネジメントコンソールにサインインが出来る、便利なショートカットを作成する機能が追加されて地味に嬉しかったので、そちらのやり方をご紹介します。

:::note
IAM Identity Centerとは
AWS環境へのシングルサインオンアクセスを簡単に行えるサービスです。複数のAWSアカウントやクラウドアプリケーションに対するユーザーのアクセス管理を一元化できます。
AWS Single Sign-on(SSO)の後継サービスで、AWS Organizationsを導入している場合IAM Identity Centerを利用することができます。
:::

# ショートカットの作り方とサインインのしかた
まずはいつも通りアクセスポータルからサインインします。(サインインのURLもドメインを設定することが出来ます。[アクセスポータルURL AWSのカスタマイズ](https://docs.aws.amazon.com/ja_jp/singlesignon/latest/userguide/howtochangeURL.html))

サインイン後の画面がこちら
![スクリーンショット 2024-05-30 21.39.06のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730384/4807a8dd-e51d-c1fc-9608-466eafb5428e.png)

こちらの`Create shortcut`を押下します。

すると、AWSアカウントを指定し、オプショナルで、どのIAM Roleでアクセスするか、リダイレクトしてどのサービスを最初に出すかを設定できます。
すると下にURLが発行されますので、後はこのURLをコピーして、ブックマークするなり、Wikiに追加するなり、Slackの関連ページに追加するなりしてください。
![スクリーンショット 2024-05-30 21.49.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730384/f2891019-2cd0-b5b0-bf92-3eaf6e446ba7.png)

発行されたURLを押下すると、すぐにマネジメントコンソールにサインインすることが出来ます！

非常に便利ですので、みなさんぜひご活用していただければと思います。
# おわりに
AWSのコンソールはちょっと見ないと、すぐにUIが変わって困惑をすることが多いですが、反対に、便利な機能・かゆいところに手が届く機能が追加されることも多いので、新しいUIが来たらとりあえず試してみるのがいいですね。
コンテナを連携する

## 概要

SpringBoot（APPコンテナ）とPostgreSQL（DBコンテナ）を連携する。

APPとDBのコンテナを連携する場合、APPコンテナ起動時にDBコンテナへと接続を依頼する必要がある。
つまり、APPコンテナ起動時にDBコンテナが起動している必要がある。

このことから、以下の手順でコンテナを起動する必要がある。

1. DBコンテナを起動する
1. DBコンテナの状態が`healthy`となる
1. APPコンテナを起動する
1. APPコンテナからDBコンテナへと接続を依頼する

## CLIからコンテナの連携を実現する

ここでは、Docker Composeを使用せずにCLIからコンテナを立ち上げて、連携を行う。
Docker Composeを使用する手順は後述する。

まずは、コンテナ間の通信を可能にするためのネットワークを作成する。

```bash
# ネットワークを作成する
$ docker network create sample_network
```

続いて、それぞれのコンテナを作成する。
コンテナの作成は、DB→APPの順で行う必要があるため、まずはDBコンテナを起動する。

```bash
$ docker run \
  -dp 127.0.0.1:5432:5432 \
  --network=sample_network --network-alias=postgres \
  -e POSTGRES_PASSWORD=secret \
  arm64v8/postgres:16.1-alpine
```

 APPコンテナを起動する前に、DBコンテナへの連携を行うための設定をする必要がある。
`application.properties`で設定する。
`Spring DataSource`の仕組みからデータベースへの接続を確立する。

```properties
# 指定方法（jdbc:postgresql://{コンテナ名}:{ポート番号}/{DB名}
spring.datasource.url= jdbc:postgresql://db_container:5432/template
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.username=postgres
spring.datasource.password=secret
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.show-sql=false
```

`build.gradle`に依存関係を設定する。

```gradle
dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	runtimeOnly 'org.postgresql:postgresql'
}
```

これらの設定から、アプリケーションの起動時にDBコンテナへ接続される。
APPコンテナを起動する。

``` bash
$ docker run \
  --network=sample_network \
  app-hello-spring-boot
```

## Docker Composeからコンテナを連携する

`docker-compose.yml`でも、コンテナの連携が可能。
Docker Composeを使用する場合には、ネットワークを設定する必要はない。

今回意識するべきことは、コンテナの起動順を制御することになる。
`depends_on`のオプションでは、サービスの依存関係を設定することができる。

以下の例では、`app`は`db`に依存している。
この場合、`db`, `app`の順でコンテナが起動する。

```yaml
version: "3.9"
services:
  app:
    build: .
    depends_on:
      - db
  db:
    image: arm64v8/postgres:16.1-alpine
```

しかし、`depends_on`は、起動順のみしか制御することはできない。
例えば、`db`コンテナ起動後、準備が整っていない状態で`app`コンテナが起動してしまい、データベースの接続依頼をしてしまう可能性もある。

そのため、DBコンテナのサービスが実行されていることを確認してから、APPコンテナを起動するのが最良となる。

```yaml
services:
  app:
    build: .
    depends_on:
      db:
        condition: service_healthy
  db:
    image: arm64v8/postgres:16.1-alpine
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready --username=postgres']
      interval: 10s # ヘルスチェックの間隔
      timeout: 5s # タイムアウトの長さ
      retries: 5 # リトライ回数
```

`healthcheck`オプションでは、`test`に記載のコマンドをコンテナ内で実行し、コンテナの正常性を確認している。
APPコンテナは、コンテナの状態が正常であることを確認してから起動する。


## 参考文献

- [Composeファイル `depens_on`](https://docs.docker.jp/compose/compose-file/compose-file-v3.html#depends-on)
- [Composeファイル `healthcheck`](https://docs.docker.jp/compose/compose-file/compose-file-v3.html#healthcheck)
Azure Data Factory のパイプラインを PowerShell で実行する場合には ` Manual trigger`（手動トリガー）として実行される


## 概要

Azure Data Factory のパイプラインを PowerShell で実行した際に、どのようなトリガーとなるかを調査したところ、` Manual trigger`（手動トリガー）となりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/12c61036-36ff-f42a-6418-c0f136a40839.png)

調査するきっかけとしては、 Azure Data Factory のメタデータ駆動のコピーアクティビティを利用する際に、トリガー名を制御テーブルに保持する必要があることを知ったことです。`TriggerName`列に適切なトリガー名が入ってないと想定通りにデータのインジェストが実施できません。PowerShell からメタデータ駆動のコピーアクティビティを実行する必要があったため、検証を実施しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f4703f1a-aa6c-5acb-581b-e63c65e6b1e1.png)

引用元：[データのコピー ツールでメタデータ駆動型の方法を使用して大規模なデータ コピー パイプラインを作成する - Azure Data Factory | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/data-factory/copy-data-tool-metadata-driven#main-control-table)

## 検証方法

### 1. メタデータ駆動アクティビティのパイプライン構築

下記の記事を参考にメタデータ駆動のコピーアクティビティのパイプラインを作成します。

- [Oracle Database から Databricks へ Azure Data Factory のメタデータ駆動のコピーアクティビティによる多数のテーブルのデータ移行手順 #oracle - Qiita](https://qiita.com/manabian/items/e5c015ad54db3daf6aaa)

### 2. PowerShell から実行

下記の記事を参考に PowerShell から Azure Data Factory のパイプラインを実行します。

- [Azure Data Factory のパイプラインを PowerShell の Azure CLI から実行する方法の検証結果 #Azure - Qiita](https://qiita.com/manabian/items/eb465ed6b211dc23b7e7)

### 3. Azure Data Factory のモニタータブにて手動トリガーとなっていることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/12c61036-36ff-f42a-6418-c0f136a40839.png)
「"use server" ってあるけど、デフォルトで"use server"なんだよね？」←ちがう (半年前の俺へ)

## はじめに
この記事は「"use server" ってあるけど、デフォルトで"use server"なんだよね？」ってちょっと（かなり）勘違いしていた半年前の自分に対して「ちがうよ」って言う記事です。
サーバーアクションについての詳しい説明はありません。

## 知っていたこと
- componentには「sever component」と「client component」がある
- App router ではとくになにもしないと「server component」になる
- Hooksをつかうときや、イベントハンドラ(clickイベントなど)を登録したい場合は「client component」にする必要がある。
- 「client component」にするには「"use client"」ディレクティブをつけてあげる

## 勘違いしていたこと
以上の流れにより、**"use server"ディレクティブをつけると「server component」になる**とおもっていた。
つまりタイトルにある「デフォルトで"use server"なんだよね」は、「デフォルトでserver componentになるんだよね」のつもりで言っていた。これ自体はあっているが、"use server"の認識が間違っている。

## 半年前の俺にいいたいこと
- "use server"は「server componentにしたいときに書く」ものではないんだよ
- "use server"は「エクスポートする関数がサーバーアクションである（サーバーサイドの関数である）とマークしたい時に、ファイル先頭に書く」んだよ[^KEY]
- つまり、**component**に対して、ではなくて、**関数**に対してマークしているんだよ
- ちなみに"use server"をつけない場合、クライアント側で関数を呼び出したらクライアント側で実行されるから、「デフォルトで"use server"なんだよね」はやっぱり違うよ


[^KEY]: 非同期関数の本体の冒頭に書くやり方もあります。（https://ja.react.dev/reference/rsc/use-server）
cronで環境変数を利用するときの対処法

# はじめに
cronで実行する際はではユーザー環境変数が反映されません。

cronではノンインタラクティブノンログインシェルでの実行になるため、```~/.bashrc```や```/etc/profile.d/*.sh```が読み込まれないことが原因です。

この問題を解決するために、cronの```-l```オプションを用いてログインシェルで実行するというやり方がありますが、ユーザー環境変数がそのまま反映されるため影響範囲が大きいです。

そのため必要な環境変数だけを設定し、cronで環境変数を利用するプログラムを使用する場合はひと工夫必要となり、今回はそのことを記事に書こうと思います。

もし誤っている内容などがあれば、コメントで訂正していただけると大変助かります。

# 全体の流れ
とは言っても簡単で、以下の手順で設定することで可能です。

1. 環境変数を設定するコマンドが記載されたシェルスクリプトを記載
2. cronで環境変数を使用する定期実行したいコマンドを書く前に```source```コマンドでシェルスクリプトを読み込む

## (1) シェルスクリプトの記載
cronを実行するユーザーがアクセス可能な任意の場所に環境変数を設定するシェルスクリプト配置します。

またその際に、ファイルの実行権限を意識する。

```
# ファイルの所有者・グループ所属を変更
sudo chown <実行ユーザー> /path/to/shell_file.sh

# ファイルの所有者の場合
sudo chmod 700 /path/to/shell_file.sh
```

## (2) cronの設定
以下のように設定することで、cronで定期実行したいコマンド上で環境変数を利用できます。

```
crontab -e

* * * * *  <実行ユーザー> source /path/to/shell_file.sh && <設定した環境変数を利用する定期実行したいコマンド>

```

# 参考資料
- [参考にしたQita記事](https://qiita.com/showchan33/items/cedb8814b5ccce3b25b4)
ユークリッドの互除法

## ユークリッドの互除法とは

２つの数の割り算を繰り返すことで最大公約数を求める方法。

### フローチャート

`a`, `b`の最大公約数を求める。(`a`は`b`より大きい数であることを前提とする)
`r`は余りの数。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733055/0d940d6c-602c-80ad-ca4e-d508889dbd31.png)
確率密度と確率

## 確率密度
・確率密度関数が描く面積が確率になる。
・確率密度関数が描く全面積は1になる。


前回、下記の分布を表す確率密度関数のXが0から1の間だと1を返して、それ以外は０を返していました。

![スクリーンショット 2024-05-27 20.59.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/65e22ebd-b88f-5377-8887-db7c8e71d839.png)
では、この"1"は何を表しているのか考えてみましょう。
離散型の場合は、x=1のとき、y軸が確率になってました。
連続型の場合は、**面積**が確率になります。

ex) ランダムに選んだ成人男性一人の身長
下記だと、20%の確率だとわかるのです。
![確率密度.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/055a9e57-0716-7201-b0f2-78a58121f8ee.png)

前回描画した、確率分布でy軸はそれほど重要でなく、面積が確率になっていることを覚えてください。

## 累積分布関数(CDF: Cumulative Distribution Function)
・確率密度関数を負の無限大からある値(x)まで確率を積み上げた値を返す関数

![累積分布関数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/d441337b-a4a8-beb0-d17c-db6a922e4325.png)

つまり、累積分布関数を見れば、その値(x軸)までの確率がわかります。

**Pythonで実践**
正規分布の確率密度関数と累積密度関数を描画する
・PDF: stats.norm.pdf(x)
・CDF: stats.norm.cdf(x)

```
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

# x軸を生成
x = np.linspace(-3, 3, 100)
# y軸を生成(正規分布の確率密度関数)
y = stats.norm.pdf(x)
# 描画
plt.plot(x, y)
```
![スクリーンショット 2024-05-30 20.57.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/8a277a79-9f59-8514-8f8d-006d598a3c70.png)

```
# y軸を生成(正規分布の累積密度関数)
cdf_y = stats.norm.cdf(x)
# 描画
plt.plot(x, cdf_y)
```
![スクリーンショット 2024-05-30 21.00.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/11b664e8-8bf4-644b-be14-ad6b95312c46.png)

では、下記のように右側の面積を求めたい場合はどう考えれば良いでしょうか。

![累積分布関数_右側.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/fd9c0160-ebdf-7403-bb78-2754f8925065.png)

確率密度関数のグラフを見ると、
確率は(全面積を足し合わせると)で"1"であるので、1-累積分布関数(CDF)であることがわかります。

そして、右側の面積を求めるメソッドが用意されているので紹介します。

右側の面積(1-累積分布関数(CDF))を求める
・ SF: stats.norm.sf(x)  sf:Survival Function 

```
# y軸を生成(1-CDF)
sf = stats.norm.sf(x)
# 描画
plt.plot(x, sf)
```
![スクリーンショット 2024-05-30 21.15.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/7481d7fc-1bba-d979-dc59-862c53efeb1a.png)

次回は正規分布について、詳しくみていきましょう。
class-transformerって結局何？

# class-transformerとは
JavaScriptには、「プレーンオブジェクト」「クラスオブジェクト」の2種類があります。

```javascript
// プレーンオブジェクト
{
    "id": 1,
    "firstName": "Johny",
    "lastName": "Cage",
    "age": 27
}

// クラスオブジェクト
export class User {
  id: number;
  firstName: string;
  lastName: string;
  age: number;

  getName() {
    return this.firstName + ' ' + this.lastName;
  }
}
```

あるプレーンオブジェクトからあるクラスオブジェクトに変換したい時、めんどくさいやり方しかできず、実用上不都合が起きやすいです。

そのため、簡単に変換を行なってくれるライブラリがclass-transformerです。
`プレーンオブジェクト↔︎クラスオブジェクト`の変換が可能。

# インストール方法

```bash
// yarnの場合
yarn install class-transformer

// npmの場合
npm install class-transformer
```

# 使用例
## シンプルバージョン

```typescript
import { plainToClass, classToPlain, Expose } from 'class-transformer';

class User {
  @Expose()
  firstName: string;

  @Expose()
  lastName: string;

  @Expose()
  age: number;
}

// プレーンなオブジェクトをクラスインスタンスに変換
const plainUser = {
  firstName: 'John',
  lastName: 'Doe',
  age: 25,
};
const user = plainToClass(User, plainUser);

// クラスインスタンスをプレーンなオブジェクトに変換
classToPlain(user);
```

## ネスト構造バージョン

```typescript
import { Type } from 'class-transformer';
import { IsString, IsInt, ValidateNested } from 'class-validator';
import { plainToClass, classToPlain } from 'class-transformer';

class Address {
  @IsString()
  street: string;

  @IsString()
  city: string;

  @IsString()
  country: string;
}

class User {
  @IsString()
  firstName: string;

  @IsString()
  lastName: string;

  @IsInt()
  age: number;

  @ValidateNested()
  @Type(() => Address)
  address: Address;
}

const plainUser = {
  firstName: 'John',
  lastName: 'Doe',
  age: 25,
  address: {
    street: '123 Main St',
    city: 'New York',
    country: 'USA'
  }
};

// プレーンなオブジェクトをクラスインスタンスに変換
const user = plainToClass(User, plainUser);

// クラスインスタンスをプレーンなオブジェクトに変換
const plain = classToPlain(user);
```

# 参考
[class-transformer](https://github.com/typestack/class-transformer)
[class-transformerでpureなjsオブジェクトとクラスとの変換が便利だった](https://qiita.com/NaotoFushimi/items/ff42888d4ebb1b6a667f)
[Class Transformerの概要について備忘録を書いた](https://qiita.com/enomoto11/items/aa9c9faa508b3aed6540)
ほぼ未経験からスマホアプリエンジニアを目指す　～プロローグ～

## はじめに

スマホアプリエンジニアの業種に就き、半年が経とうとしています。
しかし、ほぼ未経験で基礎力など中々身につかず・・・。
なにかモチベになるものがないかな～と思いQiitaを用いて、勉強したことのメモ代わりとしてQiitaを使っていきたいと思います！
すごい簡単なことからですが同じ思いをしている方がきっと居るかと思いますので、一緒に頑張れたなと思います！
更新頻度は週一回ぐらいのペースで更新できたらなぁ～と思います！
よろしくお願いします！

## 最終目標
まだ漠然としておりますが・・・
### 「iOS/Androidのアプリを自力で実用性のあるものを作る」
## 今日の議題
### 目次
◆ 開発言語は何から学べばいいのか
◆ こんな話を先輩が言っていた
◆ 次回の目標
◆ 最後に

## 開発言語は何から学べばいいのか
　・スマホアプリには２つのOSがありそれぞれ作成する際の言語は以下の通りとなる。
　　・iOS：Swift / objective-C
　　・Android：Kotlin / Java
　・業務中、言語がコロコロ変わってわからなくなるので、どれから入ればいいのか、
 　　何から学べばいいのか困った。
## こんな話を先輩が言っていた
　・何から学べばいいのか、先輩に相談する機会があった。
 　　その時先輩はこんな話をしていただけた。
  　「言語は違えど、変数とか型とかのルールは変わらないからどれか１つ自分が持てる武器があれば知らない言語でもなんとかなるよ！」
  　　そんなお言葉をいただけた。
  
## 次回の目標
・最初は全ての言語を覚えないといけないと思っていましたが、どれか１つだけ基礎を身に着けようという目標にすることで気持ち的に楽になりました。もちろん、各言語によって特徴や書き方などは変わりますが、今のご時世、ChatGPTなどの助っ人がいるので、調べながら聞きながら基礎力を身に着けたいと思います！

## 最後に
　最後まで読んでいただきありがとうございました！
　ほぼ未経験というのは学生の時(2年前)に卒業制作としてSwiftUIでアプリを作成しておりました。
 しかし、実際の業務ではSwiftUIは使っておらず、知らない用語が飛び交って混乱しているので、今後の自分の為と同じようなぐらいのスキルの方と一緒に学びながら覚えれたな！と思います。

 次回もお楽しみに(^^♪
【Lambda】Parameter Storeの値を取得する処理を共通化する

## まとめ

処理をmjsファイルに記述してレイヤー登録する

---

例として、supabaseを使用するためのパラメータを登録・取得してみます
lambdaからsupabaseをいじいじする記事は[こちら](https://qiita.com/akitika/items/3ef5aeb279ac5e9fc97d)

## 1. ファイルの用意

```bash
touch getParameters.mjs
```

## 2. 処理をmjsファイルに記述

以下のように記述してみます

```js:getParameters.mjs
import { SSMClient, GetParameterCommand } from "@aws-sdk/client-ssm";

const client = new SSMClient({ region: "ap-northeast-1" });

export async function getParameter(name) {
  const params = {
    Name: name,
    WithDecryption: true,
  };
  const command = new GetParameterCommand(params);
  const response = await client.send(command);
  return response.Parameter.Value;
}

```

## 3. zip化してレイヤーに登録

```bash
zip -r hogehoge.zip getParameters.mjs
```

レイヤー登録のわかりやすい手順は[こちら](https://xp-cloud.jp/blog/2019/01/12/4630/)

## 4. 実行ロールに権限を渡す

### ssm:GetParameterが付与されていればOKです

新しく**getHogeHogeParams**というポリシーを作成して、lambdaに紐づいているロールに**許可ポリシー**として登録してみましょう

```json
// getHogeHogeParams.jsonの中身
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:DescribeParameters"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameter"
            ],
            "Resource": [
                "arn:aws:ssm:ap-northeast-1:000000000000:parameter/SUPABASE_KEY",
                "arn:aws:ssm:ap-northeast-1:000000000000:parameter/SUPABASE_URL"
            ]
        }
    ]
}
```

## 5. レイヤーを使用する

:::note alert

**/opt/作成したファイル名.mjs**をfromすること

:::

```js
import { createClient } from '@supabase/supabase-js';
import { getParameter } from '/opt/getParams.mjs';


export const handler = async (event) => {
  const supaUrl = await getParameter('SUPABASE_URL');
  const supaKey = await getParameter('SUPABASE_KEY');

        
  const supabase = createClient(supaUrl, supaKey);

  ...
```
モノイダル圏とプロ函手と表現と

## 圏で定義された群
モノイド$(\mathbb{1},\cdot,id_*)$であって，全ての射が同型射であるとき群という．
$\mathbb{G}:=(\mathbb{1},\cdot,id_\*)$と表す．
任意の射$g\in\mathbb{G}$に対して逆射$g^{-1}\in\mathbb{G}$が存在して，$g\cdot g^{-1}=g^{-1}\cdot g=e$が成り立つ．
### 群はモノイダル圏となる
テンソル積$\otimes:\mathbb{G}\times\mathbb{G}\to\mathbb{G}$を
```math
*\otimes*=*
```
と定義する．
すると$\otimes$は結合法則を満たし，$*$を単位対象としてモノイダル圏となる．

## ベクトル空間の圏
体$K$上のベクトル空間を対象とし，その間の線形写像を射とする圏を体$K$上のベクトル空間の圏とし$\mathbb{Vect}_K$と表す．
特にこだわらない限り$\mathbb{Vect}_K$を$\mathbb{Vect}$と記す．

### ベクトル空間の圏はモノイダル圏となる．
テンソル積$\otimes:\mathbb{Vect}_K\times\mathbb{Vect}_K\to\mathbb{Vect}_K$を通常のベクトル空間のテンソル積を用いて，
任意のベクトル空間$V,W\in\mathbb{Vect}_K$に対して
```math
V\otimes W
```
を対応させる函手とする．
単位対象を$K\in\mathbb{Vect}_K$とする．
すると確かにモノイダル圏となる．
## 表現の圏
値域が$\mathbb{Vect}_K$となるプロ函手の圏$\mathbb{Prof}\_{\mathbb{Vect}_K}(\mathbb{G},\mathbb{Vect}_K)$を考える．
このとき$\mathbb{Prof}\_{\mathbb{Vect}_K}(\mathbb{G},\mathbb{Vect}_K)$の対象$P:\mathbb{G^{op}}\times\mathbb{Vect}_K\to\mathbb{Vect}_K$で，
```math
P_{(V)}^{(*)}=V
```
となるものは群の表現を与える．
実際$V\in\mathbb{Vect}_K$とし，$id\_*\in\text{Hom}(\mathbb{G},\mathbb{G})$に対して，
```math
P_{(V)}^{id_*}=id_{P_{(V)}^{(*)}}=id_V
```
となる，つまり$\mathbb{v}\in V$に対して，
```math
P_{(V)}^{id_*}(\mathbb{v})=\mathbb{v}
```
また，$g,h\in\text{Hom}(\mathbb{G},\mathbb{G})$に対して，
```math
P_{(V)}^{(g\cdot h)}=P_{(V)}^{(h)}\cdot P_{(V)}^{(g)}
```
また，$\mathbb{Vect}_K$の射$f:V\to W$は自然変換を定める．
```math
P_{(f)}^\mathbb{G}:P_{(V)}^\mathbb{G}\to P_{(W)}^\mathbb{G}
```
デスク回りの機器を紹介するだけ

### デスク

https://gtracing.co.jp/collections/gaming-desk/products/gtracing-gaming-desk-t02-black?variant=41570770714819

### 椅子
パイプが少しグラつくので買い替えの検討を加速

https://gtracing.co.jp/products/pro-series-gt002?variant=40339185500355

### キーボード
私用

https://gaming.logicool.co.jp/ja-jp/products/gaming-keyboards/g512-mechanical-gaming-keyboard.920-009375.html

社用

https://www.logicool.co.jp/ja-jp/products/keyboards/k275-unifying-wireless.920-003062.html

### マウス

https://gaming.logicool.co.jp/ja-jp/products/gaming-mice/g304-lightspeed-wireless-gaming-mouse.910-005287.html


### モニター
これ2枚

https://www.benq.com/ja-jp/monitor/gaming/ex240n/buy.html

### PC
カスタム
OS：Win11home→Win11Pro
RAM：32GB→64GB

https://www.dospara.co.jp/TC30/MC14665-SN4601.html
Javaで「関係演算子と等価演算子」の動作を確認してみた

# 概要

Javaで「関係演算子と等価演算子」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/ope/index11.html

# 実装

以下のファイルを作成しました。
```JSample11_1.java
class JSample11_1{
  public static void main(String[] args){
    int a = 7;
    int b = 4;

    System.out.println("a = " + a);
    System.out.println("b = " + b);

    System.out.println("a < b  : " + (a < b));
    System.out.println("a <= b : " + (a <= b));
    System.out.println("a > b  : " + (a > b));
    System.out.println("a >= b : " + (a >= b));
    System.out.println("a == b : " + (a == b));
    System.out.println("a != b : " + (a != b));
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample11_1.java 
$ java JSample11_1 
a = 7
b = 4
a < b  : false
a <= b : false
a > b  : true
a >= b : true
a == b : false
a != b : true
```

# まとめ

何かの役に立てばと。
TypeScript勉強してみた⑥

# はじめに
初めまして！
エンジニアになって数年、今まで本を読むだけでしたが、もっとプライベートで楽しみながら成長したい！自分が学んだ足跡を残していきたい！と思い記事を書きました！
最終的には自在に開発できるようになりたいと思っています。:triumph:
いろいろな記事を参考にさせてもらっています。:bow_tone2:

**「いいね」か「ブックマーク」**
を頂けると僕のモチベーションアップになります！:thumbsup:
少しでも気に入っていただけたらよろしくお願いいたします！:thumbsup:


# 今回の目的
TypeScriptがわからなくてやばたにえんなので、ハンドブックで学んでみました。
（前回）

https://qiita.com/mr_noppo/items/a4e56a6225c28f5674f2

# 主に参考にさせていただいた記事

https://www.typescriptlang.org/docs/handbook/intro.html


### in絞り込み
in絞り込みでオブジェクト内のプロパティの絞り込みができます。
下記の場合はオブジェクトのプロパティにswimが入っているもので絞り込みを行います。
```ts
type Fish = { swim: () => void };
type Bird = { fly: () => void };
type Human = { swim?: () => void; fly?: () => void };
 
function move(animal: Fish | Bird | Human) {
  if ("swim" in animal) {
...
```

### instanceOfの型ガード
instanceOfで型ガード可能。
```ts
function logValue(x: Date | string) {
  if (x instanceof Date) {
```

### 初期化で宣言された型
TypeScriptは宣言された時に右側の式や値から型を推測します。
再宣言時も初期化された型に限定されるため、初期化された型以外で再宣言するとTypeScriptが警告します。
```ts
// x: string | number
let x = Math.random() < 0.5 ? 10 : "hello world!"; 
// x: string | number
// OK
x = 1;
// NG
x = ture;
```

### 型によるfilter絞り込み

```ts
type Fish = { swim: () => void };
type Bird = { fly: () => void };
type Human = { swim?: () => void; fly?: () => void };

function isFish(pet: Fish | Bird): pet is Fish {
  return (pet as Fish).swim !== undefined;
}

const zoo: (Fish | Bird)[] = [
    {swim: () => console.log('swim')}, 
    {swim: () => console.log('swim')}, 
    {fly: () => console.log('fly')}
];
const underWater: Fish[] = zoo.filter(isFish);

// swimだけに絞り込まれるため2
console.log(underWater.length);
```

### 存在すべきではない型（never)
全ての想定されるかたが処理された後に推定される型です。
```ts
type Shape = Circle | Square;
 
function getArea(shape: Shape) {
  switch (shape.kind) {
    case "circle":
      return Math.PI * shape.radius ** 2;
    case "square":
      return shape.sideLength ** 2;
    default:
      // 定義した型が全て対応できていれば警告されません 
      const _exhaustiveCheck: never = shape;
      return _exhaustiveCheck;
  }
}
```

# 次回の予定
関数の詳細から
【Swift】FileManager をもっと簡単に使いたい


ファイルの操作をしたい初心者の試行。

まずは、ファイルの操作。

https://developer.apple.com/documentation/foundation/filemanager

このクラスからですよね。

すごくファイル操作しづらい感じがしますが。

# 🤔 何がしたいのか

すぐに忘れるので整理してカタログ化しておきたい。

今となっては、

スマホデバイスローカルのファイルの操作を行うことは、わりと少ない。

なので余計に忘れる。

必要最小限のシンプルな操作だけでいい。

|  機能  |  ディレクトリ  |  ファイル |
| ---   | :---:         |:---:     |
|  作成  |  some(target: URL) ???           | ?|
|  削除  |  ?           | ? |
|  移動  |  ?           | ? |
|  コピー  |  ?         | ? |

この表を埋めていけばいいかな、シンプルな function のサンプルで。

ポリシーとしては、「すべて URL でハンドルする」。



# 🤔 まとめ

整理するとそんなにややこしくもなかった。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【Swift】FileManager を簡単に使いたい<br>👉 <a href="https://t.co/OSjsaovat9">https://t.co/OSjsaovat9</a><a href="https://twitter.com/hashtag/Swift?src=hash&amp;ref_src=twsrc%5Etfw">#Swift</a> <a href="https://twitter.com/hashtag/SwiftUI?src=hash&amp;ref_src=twsrc%5Etfw">#SwiftUI</a> <a href="https://t.co/yhn1wdUYYm">pic.twitter.com/yhn1wdUYYm</a></p>&mdash; chanzmao (@maochanz) <a href="https://twitter.com/maochanz/status/1798986848410476685?ref_src=twsrc%5Etfw">June 7, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
CSVのデータをDjangoのORMでさくっと扱う方法

試したらできたので、メモとして記事にしました。

## やること

下記のCSV（person.csv）のデータをDjangoのORMで使ってみましょう。

```csv:person.csv
name,age,city
Alice,30,New York
Bob,25,Los Angeles
Charlie,35,Chicago
```

## 実装

今回はプロジェクトを作らず、1ファイルで実行できるようにします。
以下のファイル（main.py）を作ります。

```python:main.py
import csv
import pathlib

import django
from django.conf import settings
from django.db import connection, models

db_file = "db.sqlite3"
settings.configure(
    DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": db_file}},
    INSTALLED_APPS=["__main__"],
)
django.setup()


class Person(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()
    city = models.CharField(max_length=100)


if not pathlib.Path(db_file).exists():
    with connection.schema_editor() as schema_editor:
        schema_editor.create_model(Person)
    with open("person.csv") as fp:
        for row in csv.DictReader(fp):
            Person.objects.create(**row)

for person in Person.objects.filter(age__gte=30):
    print("{0.name} {0.age} {0.city}".format(person))
```

## 実行

下記のように実行します。

```
python main.py
```

**実行結果**

```
Alice 30 New York
Charlie 35 Chicago
```

## 簡単な説明

### 設定

Djangoの設定はこれだけです。ほぼDB（SQLite）の指定だけです。

```python
# インポートは省略
db_file = "db.sqlite3"
settings.configure(
    DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": db_file}},
    INSTALLED_APPS=["__main__"],
)
django.setup()
```

### モデル定義

CSVの内容に合わせてモデルを作ります。

```python
class Person(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()
    city = models.CharField(max_length=100)
```

### DBの作成

DBのファイルがなければ、テーブルを初期化してCSVデータを取り込みます。

```python
if not pathlib.Path(db_file).exists():
    with connection.schema_editor() as schema_editor:
        schema_editor.create_model(Person)
    with open("person.csv") as fp:
        for row in csv.DictReader(fp):
            Person.objects.create(**row)
```

### ORMの処理

ここでは、サンプルとして`age >= 30`のデータを抽出して表示します。

```python
for person in Person.objects.filter(age__gte=30):
    print("{0.name} {0.age} {0.city}".format(person))
```

## まとめ

DjangoのDB操作だけする場合の最低限の処理を紹介しました。
実用性は、ないかもしれません。

以上
clickイベントチェックボックスのcheckedについて

jQuery:2.1.4

# 目次
　[やりたいこと](#やりたいこと)
　[実装](#実装)
　[まとめ](#まとめ)

## やりたいこと
チェックボックスがクリックされたときに、チェックされている状態であれば、チェックを外さず、
チェックされていない状態であればチェックをつけたい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3096978/c81150ec-2695-0346-0164-965bf018e2cb.png)

```html:sample1.html
<input type="checkbox" id="TEST">
```

## 実装
```JavaScript:sample2.js
$('#TEST').on('click', function() {
  if ($('#TEST').prop("checked")==true) {
    //チェックされていない状態からチェックされたときの処理
    
  } else {
    // チェックされている状態であればチェック状態に戻す
    $("#TEST").prop("checked", true); 
  }
});
```

## まとめ
if文で判定してチェックされている状態であれば元に戻すという方法が一番先に思いつきました。ほかの実装方法がないか探してみたいと思います。
RHEL9における環境変数の読み込み順序とスコープ

# はじめに
仕事でRHEL9を扱うことになり、環境変数周りの知識不足を痛感したためこの記事を書いています。
タイトルではRHEL9と銘打っていますが、他のディストリビューションでも基本的に同じだと思います。
もし誤っている内容などがあれば、コメントで訂正していただけると大変助かります。

# 環境変数の話に入る前に
Bashではログインシェルやインタラクティブシェルのようなシェルのタイプで読み込まれるファイルが変わります。

今からする話はシェルのタイプを理解している前提で説明します。

もし分からない場合は。[こちらの記事](https://qiita.com/ikkyu193/items/5c9a87b22fdf7697422e)の説明が大変分かりやすかったので、読んでいただければと思います。

# 環境変数に関わるファイルを読み込む順序
## インタラクティブログインシェル・ノンインタラクティブログインシェルの場合
以下のような順序で環境変数の設定ファイルが読み込まれます。
<table>
  <tr>
    <th>読込順</th>
    <th>ファイル1</th>
    <th>ファイル2</th>
    <th>ファイル3</th>
    <th>概要</th>
  </tr>
  <tr>
    <td style="text-align: center;">1</td>
    <td style="text-align: left;">/etc/profile</td>
    <td style="text-align: left;">/etc/profile.d/*.sh</td>
    <td style="text-align: left;">/etc/bashrc</td>
    <td style="text-align: left;">「/etc/profile」の中で「/etc/profile.d」配下のシェルスクリプトが先に呼ばれ、その後「/etc/bashrc」が呼び出されます。</td>
  </tr>
  <tr>
    <td style="text-align: center;">2</td>
    <td style="text-align: left;">~/.bash_profile</td>
    <td style="text-align: left;">~/.bashrc</td>
    <td style="text-align: left;">/etc/bashrc</td>
    <td style="text-align: left;">「~/.bash_profile」の中で「~/.bashrc」が呼び出され、「~/.bashrc」の中で「/etc/bashrc」が呼び出されます。</td>
  </tr>
  <tr>
    <td style="text-align: center;">(3)</td>
    <td colspan="3" style="text-align: left;">~/.bash_login</td>
    <td style="text-align: left;">「~/.bash_profile」が存在しない場合呼び出される。
  </tr>
  <tr>
    <td style="text-align: center;">(4)</td>
    <td colspan="3" style="text-align: left;">~/.profile</td>
    <td style="text-align: left;">「~/.bash_profile」と「~/.bash_login」が存在しない場合呼び出される。
  </tr>
</table>

## インタラクティブノンログインシェルの場合
以下のような順序で環境変数の設定ファイルが読み込まれます。
<table>
  <tr>
    <th>読込順</th>
    <th>ファイル1</th>
    <th>ファイル2</th>
    <th>ファイル3</th>
    <th>概要</th>
  </tr>
  <tr>
    <td style="text-align: center;">1</td>
    <td style="text-align: left;">~/.bashrc</td>
    <td style="text-align: left;">/etc/bashrc</td>
    <td style="text-align: left;">/etc/profile.d/*.sh</td>
    <td style="text-align: left;">「~/.bashrc」の中で「/etc/bashrc」が呼び出され、「/etc/bashrc」の中でログインシェルでは出ないときに「/etc/profile.d」配下のシェルが呼び出されます。</td>
  </tr>  
</table>

## ノンインタラクティブノンログインシェルの場合
ファイルを読み込むのではなく、環境変数```$BASH_ENV```を読み込みます。

# 環境変数の設定方法
- ユーザー全体の場合: ```/etc/profile.d/```配下に環境変数を設定するコマンド(export)を記載したシェルスクリプトを配置して設定します。
- ユーザー毎に設定したい場合: ```~/.bashrc```に環境変数を設定するコマンド(export)を記載して設定します。

# /etc/environmentについて
今までbashが環境変数に関するファイルを読み込む順序について説明してきましたが、実はシステム全体のPATHに影響を及ぼすファイルが存在します。

それがこの項のタイトルに載っている```/etc/environment```です。

RHEL9では```/etc/environment```には何も書かれていませんが、Ubuntuでは以下のように書かれています。

```
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
```

それではRHEL9においてはどのようにシステム全体に適用するPATHを設定しているかというと、```/etc/profile```内に環境変数PATHに追加するスクリプトが書かれています。

気になる方は是非読んでみて下さい。

# 参考資料
- [フォーマットも内容も参考にさせていただいたQita記事](https://qiita.com/yasushi-jp/items/34522beae408faf269aa) 
- [公式ドキュメントの該当部分](https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html)
- [シェルのタイプに関して詳細に書いているStackExchangeの記事](https://unix.stackexchange.com/questions/38175/difference-between-login-shell-and-non-login-shell)
【Lambda】Supabaseに接続する

## まとめ

zip化したnodejsをレイヤーとして使う

## 1. Node.jsランタイムを使用する

当初はpythonを使用するつもりだったのですが、pythonでsupabaseライブラリを使うのが結構面倒だったので、nodeを使用しました

## 2. レイヤーとして使用するnodejsを用意 -> デプロイ

```bash
# nodejsディレクトリを作成
mkdir nodejs
cd nodejs

# supabaseライブラリをインストール
npm init
npm install supabase

# zip化
cd ../
zip -r hogehoge.zip nodejs
```

:::note alert

注意1: 作成するディレクトリ名は必ず**nodejs**という名前にすること

注意2: ファイルではなく**nodejsディレクトリ自体をzip化する**こと

:::

zipファイル自体の名前はなんでもOKです
作成したzipをlambdaのレイヤーとしてデプロイしましょう

レイヤー登録のわかりやすい手順は[こちら](https://xp-cloud.jp/blog/2019/01/12/4630/)

## 3. レイヤーを使用する

実際に使う場合は、以下のようになります

```js
import { createClient } from '@supabase/supabase-js';
import { getParameter } from '/opt/getParams.mjs';


export const handler = async (event) => {
  const supaUrl = await getParameter('SUPABASE_URL');
  const supaKey = await getParameter('SUPABASE_KEY');

        
  const supabase = createClient(supaUrl, supaKey);

  ......
```
lottieのDOM移動

appendChild()するだけでは動かなかった。
ChatGPTに聞いて試行錯誤したのでメモ。
公式のドキュメントがあれば教えてください🙇

load()とplay()を呼ぶのがポイントみたい。


``` html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Lottie Player Test</title>
  <script src="https://unpkg.com/dotlottie-player"></script>
  <style>
    .container, .target {
      border: 1px solid #ccc;
      padding: 20px;
      margin: 20px;
      min-height: 350px;
    }
  </style>
</head>
<body>
  <div id="container" class="container">
    <dotlottie-player
      id="lottiePlayer"
      src="https://assets2.lottiefiles.com/packages/lf20_x62chJ.json"
      background="transparent"
      speed="1"
      style="width: 300px; height: 300px;"
      loop
      autoplay>
    </dotlottie-player>
  </div>

  <div id="target" class="target"></div>

  <button onclick="movePlayer()">Move Player</button>

  <script>
    document.addEventListener("DOMContentLoaded", function() {
      const player = document.getElementById('lottiePlayer');

      player.addEventListener('ready', function() {
        console.log('Lottie player is ready');
      });

      player.addEventListener('error', function(event) {
        console.error('Lottie player error:', event);
      });
    });

    function movePlayer() {
      const player = document.getElementById('lottiePlayer');
      const target = document.getElementById('target');

      if (player && target) {
        const parent = player.parentNode;
        target.appendChild(player);

        // プレイヤーを再度再生
        player.load(player.src); // srcを再設定してロード
        player.play(); // 再生
      } else {
        console.error('player or target element is not found');
      }
    }
  </script>
</body>
</html>
```
Pixelのダウングレード方法

Androidのメジャーバージョンごとにアプリのテストをする際、テスト用に持っていたPixelが自動システムアップデートで勝手にアップデートしていて困った過去がありました。

アップデートしてしまったPixelをダウングレードするには、[Android Flash Tool](https://flash.android.com/welcome)を使用するとAndroidの他のバージョンを書き込むことができます。[公式サイト](https://source.android.com/docs/setup/contribute/flash?hl=ja)やAndroid Flash Toolページ内にある程度手順が載っていますが、自分の備忘録としてダウングレードを行う際の手順を纏めておきます。

## 手順

**事前にPixelの開発者向けオプションを有効にした上で、開発者向けオプションメニューの「USBデバッグ」と「OEMロック解除」を有効にしてください。**

1. [Android Flash Tool](https://flash.android.com/welcome)にアクセスし、「Get Started」を押します。<br /><br />

2. （Windowsで実行している場合）USBドライバをインストールしているか確認するポップアップが表示されるので、インストールしている場合は「Already installed」を押します。<br /><br />

3. Android Flash ToolとPixelが通信できるよう許可を求めるポップアップが表示されるため、「Allow ADB access」を押します。<br /><br />

4. 以下の画面が表示されたら、「+ Add new device」を押します。
    <img width="400px" alt="デバイス選択" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3360873/6f315e4a-9fc8-97fd-907f-6576c4c7d770.png"><br /><br />
    
5. PCと接続中のデバイスのリストが表示されるので、ダウングレードしたいPixelを選んで「接続」を押すと、以下のように選択した端末の情報が表示されます。
    <img width="400px" alt="端末情報" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3360873/6bc97e4f-9e33-3346-0c57-e458f565c0dd.png"><br /><br />

6. インストールしたいビルドを選択します。[イメージファクトリー](https://developers.google.com/android/images?hl=ja)から、インストールしたい機種のOSイメージを探して、インストールしたいビルド番号をコピーし、Android Flash Toolの検索欄に入力します。<br /><br />

7. インストールしたいビルド番号をAndroid Flash Toolに入力して、オプション等を設定した後に「Install build」を押します。
     <img width="400px" alt="インストール" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3360873/d128b5d0-c379-9a7b-3da1-fa5304a419a1.png"><br /><br />

この後確認画面が出てきますので「Confirm」を押すと、端末の初期化とOSの再インストールが行われます。途中で再接続を求めるポップアップが表示された場合は、画面に従って端末を再接続してください。

インストールが完了すると画面の表示が変わりますので、これで操作は終了です。

[（Pixel6でAndroid13以降からAndroid12にダウングレードする際は、セキュリティの関係で通常のビルドにダウングレードすることができないので注意してください）](https://developer.android.com/about/versions/12/dev-support-images?hl=ja)
【個人開発】android studio(kotlin)でGeminiAPIをつかってメモ帳アプリをつくって見ました。



## はじめ
2024年4月からkotlinを触り始めて、MVVM？なにそれ？的な感じからnavigationやら、viewModelやらをやって今に至る感じです。
公式のトレーニングをつかって勉強しました。

https://developer.android.com/courses/kotlin-android-fundamentals/overview?hl=ja

因みに、個人の方が一つ一つのトレーニングをわかりやすく解説してくれているnoteがあるので、是非参考までに！

https://note.com/haine_rion23

## メモ帳アプリ
![スクリーンショット 2024-05-29 12.36.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3756850/eebc3bc6-804d-8b24-fd64-11069e45efd1.png)

### github

https://github.com/REOysd/ToDoApp2

### 概要
主にやりたいことや、書いておきたいものをまとめておくためのアプリです。
他にもテンプレート作成機能やリストを更新順にソートできる機能や削除、更新機能があるメモ帳アプリです。

### 目的
kotlinを初めてまだ二カ月ということもあり、まだまだやれる事がない中、今自分ができることの中で作れるアプリを作りたいということでこのアプリが考案されました。

### 使用技術
* kotlin(android)
* jetpack compose
* Room
* Navigation Architecture Component
* viewModel


## 機能
* ##### 新規作成、削除、更新
基本的なroomでのinsert,delete,updateは勉強しましたのでこちらにも実装してみました。

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3756850/31bc70a5-4d9b-52ee-d909-7a8d9010f7e5.gif)

* ##### リストのソート
こちらはroomのDAOで全セレクトQueryをもう一つ実装して、ORDERで時間順に取得しました。
時間については、毎秒ごとに時間を取得するのに苦戦しましたが、viewModelの方でdelayを１秒かけながら時間を取得することによって、何とか解決しました。

↓　下記の記事で失敗したやり方と解決した方法を載せてます。

https://qiita.com/goretzka_/items/89579205636b216d1bf0


![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3756850/13bc80f6-40fa-9af0-53ff-91dd1059311e.gif)

上記の通り保存ボタンを押した時刻順に上から並び替えました。

* ##### テンプレート作成、更新、削除
新規作成時にテンプレートを使うことによって、書きたいことがより明確になったり、メモ帳自体の見やすさが良くなることになり、利便性が上がると思ったので実装してみました。

しかし、ButtonなどのonClick()を実装しなければいけないものにはconbineClickable()でonLongClick()やonDoubleClick()なんかを実装できないなど、こちらでもテンプレート作成時になかなか苦戦しました。

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3756850/508ac747-76c4-b28f-0203-16e75c12d638.gif)

個人的にボタンばかりでごちゃごちゃしているのは嫌いなので、
タップではテンプレートの選択、長押しは既存のテンプレートの編集にしてみました。

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3756850/f3fa5508-44ba-cf32-bc5b-86a1ebc6afba.gif)

* ##### GeminiAPI
GeminiAPIをつかってテンプレート作成、編集画面とメモ帳の新規作成、編集画面にGeminiに質問できる形にしました。
主な活用法としては、テンプレートをGeminiに作ってもらったり、自分で作ったメモを加筆修正させたりする事ができます。

手こずった点としては、GeminiからのレスポンスをListに追加して、 StateFlowによる呼び出しに苦戦したので、後々まとめ記事なんかを作りたいと思います。

![Animation (0).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3756850/a74f2ee3-9d19-3d66-3d01-22acf728bd98.gif)

## 終わり
公式のトレーニングコースをデータベースまで終わらせて、アウトプット用に作り始めたのがきっかけだったのですが、気が付けばいろんな機能を盛り込みたくて時間がかかってしまいました。
アプリを作る前は一つの機能を追加するのに時間はあまりとらないだろう。と過信していましたが実際にやってみると機能によっては大幅に変えなくてはならないところもあり、改めて計画書の必要性を実感しました。

今後はこのアプリにchatGPTのAPIを活用してもっと利便性を強化したものを作ってみたいです。
３ヶ月で統計検定準１級の受かり方。

## 概要
統計検定準１級に３ヶ月で合格した私の勉強法を記載していく。
また、前提として２級程度の知識は有している者とする。

この記事は以下のことを具体的に記載する。　

**・合格までの学習時間
・適していた勉強、不適であった勉強
・使用していた教材の評価**


この記事の目安は2分です。

#### プロフィール
明治大学3年　工学系　（統計学に関する講義はほぼ無い。）

統計学を始めたのは1月下旬
期待値・分散　などもよくわからない状態で勉学を始める。
**・3月上旬　統計検定２級　合格　83点
・5月下旬　統計検定準１級　合格　63点**

## 合格までの学習時間
studyplus　で学習時間を管理していたので、学習時間は正確に把握している。

###### 2級を合格するまでの学習時間

一般的には　**50-60　時間**
私の場合は　**100　時間程度**　

統計学に関して全く事前に知識もないということもあり一般的な学習時間よりも長くかかったと考えられる。
また、統計検定準１級を合格することを検討し始めていたので、詳細に理解しようとしたことも時間がかかった要因であると推察される。

###### 準１級を合格するまでの学習時間

一般的には　**300　時間**
私の場合は　**100　時間程度**

２級の学習の際に正規分布の性質やt分布の性質や仕組みをしっかりと理解していたため、新しい単元になっても理解が容易であった。



## 適していた勉強、不適であった勉強

#### 適していた勉強
**・数学力をつける。**
微積分・線形代数・解析学といったことを理解していくことで容易に理解ができるようになる。
 
**・多変量解析をしっかり対策する。**
多変量解析は仕組みが難しい分テストに出てくる内容はいたって簡単。
確実に点数を取れるように下で紹介している教材を使い多変量解析がなんたるかを勉強しよう。

**・ある程度知識がついてきたら過去問をぐるぐるする。**
ある程度の基準は問題を読んだときにどの単元の問題かを即時に理解できるようになること。
また、問題に出てくる数式の意味を理解できるようになること。
この程度の理解ができるようになったらどんどん過去問を周回するようにしよう。目安は３周。
１回目は答えを見ながらでも理解を進めていき、
２回目で自分でも少しずつ解けるようにして、
３回目で完全に自分で導出できるようにしよう。


#### 不適であった勉強
・統計学実践ワークブックの使用をメインとする学習
・基礎知識のない状態での過去問
・１つの単元に特化する


ざっくりとまとめると上記のようになる。
また、次に私が実際に使っていたおすすめの教材について評価する。

## 使用していた教材の評価
⭐️を使って５段階評価する


1 統計検定準１級公式過去問集　⭐️⭐️⭐️⭐️⭐️
<img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737168/e8581865-7512-8b2f-5573-e6d4d868e272.png
">
基礎知識をつけた後はこの公式問題集をひたすらゴリゴリ解き進めていく。
その過程で分からないことがあったら片っ端から調べていく。


2 統計学実践ワークブック　⭐️⭐️

<img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737168/5c01cb79-50d4-5354-9ada-1b16131810f3.png
">
よくおすすめテキスト！必須！！と呼ばれることが多いがそんなことない。
このテキストを使って１人で学習を進めることができるのは事前に知識がある人だけだと思う。
これわかります！→もう合格できる人　みたいなもんです。
基本的に一般化された式しか書いていないので、最初っから理解するのは難しいです。


3 例題でよくわかる　はじめての多変量解析　⭐️⭐️⭐️⭐️
<img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737168/8f90b21b-ae98-1ea5-89f8-7186a93eef55.png
">
多変量解析って何？　
主成分分析と因子分析の違いがわからない！
因子付加量ってなに？って人はとてもおすすめ。
私は多変量解析なんて何もわからなかったが、このテキストを読んで準１級で多変量解析の単元は落とさないぐらいには解けるようになった。演習を除けば１０時間ちょっとで１周できるので、とりあえず読んでみるのもおすすめ。

4 道具としてのベイズ統計!　⭐️⭐️⭐️
 <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737168/d435de23-142d-9752-ed52-d587b4eedae1.png
">
準１級はベイズ統計に関してそこまで難しいことは出てこないので、この本を完璧にする必要はない。
しかし、ベイズ統計は近年注目を浴びているので知らないなんてことはあってはならない。
もちろんこの本だけでベイズに関しては余裕で準１級解けるようになります。




## まとめ
統計検定準１級はかなり難しい資格です。
統計検定２級とは比にならない。その分取得した時の爽快感は半端ない。
インターネット上にある一般的な学習時間はあまり参考にはならない。自分のペースで頑張ってほしい。
JavaScript で static メソッドと同名のインスタンスメソッドを定義する

## TL;DR
JSでクラスを書く際、処理が共通しているので全部のインスタンスに持たせる必要のないメソッドを静的メソッドとして書きたいときがあります。
同じ処理をインスタンスからも実行したい、というとき、同じ名前でインスタンスメソッドを宣言することができます。

## コード例
### クラス宣言
```js:textSeparator.js
class TextSeparator {
  static DELIMITER = /(?<=[.!?。！？])\r?\n?/;

  constructor(text='') {
    this.text = text;
  }

  // static メソッド
  static split(text) {
    return text.split(TextSeparator.DELIMITER);
  }

  // インスタンスメソッドを同名で宣言し、処理にインスタンスプロパティを使用する
  split() {
    return TextSeparator.split(this.text);
  }
}
```
:::note warn
正規表現は適当です。真似しないでください。
:::

---
### static メソッドを関数的に呼び出す
```js:script.js
// textSeparator.js を読み込んでおいてください

const text = `　桜の樹の下には屍体が埋まつてゐる！\n　これは信じていいことなんだよ。何故つて、桜の花があんなにも見事に咲くなんて信じられないことぢやないか。俺はあの美しさが信じられないので、この二三日不安だつた。しかしいま、やつとわかるときが来た。桜の樹の下には屍体が埋まつてゐる。これは信じていいことだ。`;

const result = SentenceSeparator.split(text);

result.forEach( s => console.log(s) );
```

**実行結果**
```
　桜の樹の下には屍体が埋まつてゐる！
　これは信じていいことなんだよ。
何故つて、桜の花があんなにも見事に咲くなんて信じられないことぢやないか。
俺はあの美しさが信じられないので、この二三日不安だつた。
しかしいま、やつとわかるときが来た。
桜の樹の下には屍体が埋まつてゐる。
これは信じていいことだ。
```

---
### 対象をプロパティとして保存しながら、インスタンスメソッドとして呼び出す
```js:script.js
// textSeparator.js を読み込んでおいてください

const text = `　桜の樹の下には屍体が埋まつてゐる！\n　これは信じていいことなんだよ。何故つて、桜の花があんなにも見事に咲くなんて信じられないことぢやないか。俺はあの美しさが信じられないので、この二三日不安だつた。しかしいま、やつとわかるときが来た。桜の樹の下には屍体が埋まつてゐる。これは信じていいことだ。`;

const ss = new SentenceSeparator(text);
const result = ss.split();

result.forEach( s => console.log(s) );
```
**実行結果**
```
　桜の樹の下には屍体が埋まつてゐる！
　これは信じていいことなんだよ。
何故つて、桜の花があんなにも見事に咲くなんて信じられないことぢやないか。
俺はあの美しさが信じられないので、この二三日不安だつた。
しかしいま、やつとわかるときが来た。
桜の樹の下には屍体が埋まつてゐる。
これは信じていいことだ。
```

## おわりに
果たしてこのような書き方が推奨されるかどうかわかりませんが、動作はするという記録です。
Laravel バリデーション

# required_with_all
`:`の後のカラム全てが入力されている場合にキーのカラムが必須になります。

つまり、以下のコードで考えると「cityとstateの両方が入力されている場合、addressは必須である」という意味になります。cityまたはstateのどちらかが入力されていない場合、addressは必須でなくなります。

```php
$rules = [
    'address' => 'required_with_all:city,state',
    'city' => 'nullable|string',
    'state' => 'nullable|string',
];
```

他にも
- required_if
- required_with
- required_without
など
便利なバリデーションがあるようです。
LevelSequenceActorからAssetDataを探す

UE5をさわっている際に、『えっ！』と思う事があったので、メモも兼ねて記事にします。

過去に投稿した記事『[オブジェクト名からPackageNameを取得する](https://qiita.com/_akoto_/items/a5a28cb52f7d342b7a16)』の内容で、AssetDataの取り方について触れていますが、UE5でアクセスの方法が変わっているものもあり、補足の記事となります。


# 調査環境
UnrealEngine 5.3.2


# AssetDataとは
コンテンツブラウザのアセットの事を指し、レベルにスポーンされてなく、アクター化されていないアセットです。
その為、『GetAssetRegistry』から取得してきます。
詳細は、[前の記事](https://qiita.com/_akoto_/items/0b1d399e15e841b624b1#assetdata%E3%81%A8%E3%81%AF)で紹介です。


# やりたかったこと
『LevelSequenceActor』からコンテンツブラウザの『LevelSequence』を探す事です。
[こちら](https://qiita.com/_akoto_/items/0b1d399e15e841b624b1#assetdata%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)の記事で、『GetAssetsbyClass』でAssetDataを探しています。
そして以下のように記載していました。

:::note warn
GetAssetsbyClassでの、引数のClassNameがName型ではなく、<font color="Red">**TopLevelAssetPath型**</font>になっている為、注意してください。
プロジェクトの内のアセットを探すのが目的なら、**TopLevelAssetPathのPackageName**は、『**/Script/Engine**』 を入れておけば大丈夫です。
:::


# 本題
ここから本題です。
話としては簡単で、『**/Script/Engine**』ではレベルシーケンスは取れなかったという話になります。
では、どうしたのかというと『**/Script/LevelSequence**』に変える必要があります。

![スクリーンショット 2024-05-30 184752.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/70e44b37-96a6-46a3-706e-d671ce3d60bd.png)

# 最後に
レベルシーケンスが取れないなら、他にも『**/Script/Engine**』で取れないものがありそうな気がしますが…。
見つけ次第、また記事を投稿したいと思います。
LLM × Security  まとめサイトを作成しました！

# LLM × Security まとめサイト、始めました！

みなさん、こんにちは！

LLMとセキュリティに興味がある人、新しいまとめサイトを立ち上げました！

LLMとセキュリティの最新情報がサクッと手に入る場所を目指しています！

# サイトはこちら
https://tasuku-sasaki-lab.github.io/Tasuku-Sasaki.github.io/LLM-Security/

## まとめサイトで何ができる？

### 論文一覧
LLM×セキュリティの最新論文がいつでもチェックできます！

### 初心者向けガイド
「LLM×Securityって何？」って人のための簡単ガイドもあります！

### 解説スライド盛りだくさん
専門家が作った解説スライドで、深い内容もわかりやすく学べるようにしました！（これからします）

## LLM × セキュリティの注目ポイントは？

### ハルネーション
モデルが変に振る舞っちゃう現象をどう防ぐ？

### プロンプトインジェクション
攻撃者がプロンプトをいじってモデルを操る技術、どう対処する？

### Jailbreak
モデルがルールを破って自由に動く「Jailbreak」、その対策って？

新しいまとめサイトで、LLMとセキュリティのこと、もっと知りたい人はぜひ訪問してください！　　

また、LLM ✖️ Securityの領域を一緒に盛り上げて頂ける方を探しています。　お気軽に[X(旧twitter)](https://x.com/7eHnpgIYyHE4iyG)でDMださい！