OmniAICreator/Qiita-1.07M huggingface dataset:
ICCV2023の量子化論文 (2)

# 概要

この記事では、[ICCV2023](https://iccv2023.thecvf.com/)の量子化論文を紹介します。[^1]
[その1](https://qiita.com/kyad/items/a5c72cf8083808970c0f)

[^1]: 画像や数式は論文から引用しています。


# Randomized Quantization: A Generic Augmentation for Data Agnostic Self-supervised Learning

https://openaccess.thecvf.com/content/ICCV2023/papers/Wu_Randomized_Quantization_A_Generic_Augmentation_for_Data_Agnostic_Self-supervised_Learning_ICCV_2023_paper.pdf

- 概要：Contrastive learning向けでドメインに依らず使えるData augmentation方法
- 研究機関：Microsoft
- 新規性：ランダム量子化する。Fig. 1, 2


# Overcoming Forgetting Catastrophe in Quantization-Aware Training

https://openaccess.thecvf.com/content/ICCV2023/papers/Chen_Overcoming_Forgetting_Catastrophe_in_Quantization-Aware_Training_ICCV_2023_paper.pdf

- 概要：QATの改善
- 新規性：QATで連続で学習する時に現れる壊滅的忘却を防ぐ方法を理論から考えた。
- キモ：(1)壊滅的忘却の原因は量子化の探索空間のシフトから生じると分析。(2)シフトqを最小化するために、探索空間を前と近くするようにする(ProxQ)。(3)前のデータと次のデータのバランスを取って量子化するようにした((BaLL)Loss)


# ResQ: Residual Quantization for Video Perception

https://openaccess.thecvf.com/content/ICCV2023/papers/Abati_ResQ_Residual_Quantization_for_Video_Perception_ICCV_2023_paper.pdf

- 概要：動画処理の高速化
- 研究機関：Qualcomm
- 新規性：2フレーム間の差分が量子化しやすいことに気づき(Fig. 1)、量子化方法を提案した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/de189f9f-bde9-70c1-f663-6ca4d757728b.png)
- キモ：Fig. 4で推論する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/21527586-b342-d02a-ceb3-8b99f0560b14.png)


# Causal-DFQ: Causality Guided Data-free Network Quantization

https://openaccess.thecvf.com/content/ICCV2023/papers/Shang_Causal-DFQ_Causality_Guided_Data-Free_Network_Quantization_ICCV_2023_paper.pdf

- 概要：データ無し量子化。
- 研究機関：Cisco
- 新規性：データ生成と量子化による劣化をモデル化するために因果的推論を使った。
オブジェクト指向の初心者的解釈

# はじめに
こんにちは！プログラミングについて学び始めた初心者です。
本記事では、オブジェクト指向の基本的な概念を自分なりに例え話で説明します。
※明らかな間違いがある場合はご指摘いただけると幸いです

# 1. オブジェクト指向とは

### オブジェクト指向的でないこと
・ワンオペ営業の飲食店
・手書きでレポートを書くこと

### オブジェクト指向的なこと
・シェフ、ウェイターなど各スタッフがいる飲食店
・ワードプロセッサでレポートを書くこと

# 2. カプセル化とは

### カプセル化されていない場合
・車がなぜ動くのか知らないと運転できない

### カプセル化されている場合
・ハンドルやアクセル、ブレーキ等の使い方を知っていれば運転できる

# 3. 継承とは

### 継承されていない場合
店長: 「新しく入ったバイトの子、何も分からないみたいだから教えてあげてね」
→教育コストが掛かる

### 継承されている場合
店長: 「新しく入ったバイトの子、基本はこなせるようにマニュアル渡しておいたから、作業振ってあげてね」
→助かる

# 4. ポリモーフィズムとは

### ポリモーフィズムのない場合
先生: 「今日は調理実習をします。みなさん好きなように料理を作ってください」
→よく分からない料理ができる

### ポリモーフィズムのある場合
先生: 「今日の調理実習では、カレーを作りましょう。ビーフにするかシーフードにするか、具材はみなさんで決めてください」
→おいしいカレーができる

# 5. 単一責任の原則とは

### 単一責任の原則がない場合
秘書: 「部長、本日は10時から総務部でミーティングがあり、11時には経理部で内部監査があります。13時からは当部に来客の予定があります。15時からは営業のAさんが…」

### 単一責任の原則がある場合
秘書: 「部長、本日は13時に来客の予定があります。」
【Docker】ubuntu22.04に対してDockerとdocker composeをインストールする

## TL;DR
以下のスクリプトをターミナルに貼り付けて実行すればインストールされてbashから抜ける 再度bashに入ればコマンドがsudoなしで利用できるようになってる

```bash
sudo apt-get -y update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt -y update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo usermod -aG docker $USER

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

exit
```

## 解説
まず、以下の部分ではDockerを利用するために必要なパッケージをインストールしている。

```bash
sudo apt-get -y update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt -y update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
```

現在ログインしているUSERをDockerのグループに参加させている。 これをすることでdockerコマンドを扱う際にsudoが必要なくなる

```bash
sudo usermod -aG docker $USER
```
Docker compose をダウンロードしている。docker composeコマンドも同様にデフォルトではsudoが必要なのでchmod +xすることでsudoが必要なくなる

```bash
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose
```
一度bashから抜ける このコマンドの後、再度入ることでsudoコマンドがそれぞれ必要なくなる

```bash
exit
```
これから（未来）のITサービスマネージャを考える

こんにちは！
私はこれまでの3年間、システムの運用・保守に携わり、
BCP設計やServiceNow導入による運用改善活動に取り組んできました。

今回は新米ITサービスマネージャの私が思い描く、
**未来のITサービスマネージャ像✨**について書いてみたいと思います。


私は社会人2年目のときに、開発担当から運用担当に異動になりましたが
配属前のITサービスマネージャのイメージは、
定型作業が多く、毎日同じことを正確に繰り返す仕事といった若干ネガティブなものでした。

### ITサービスマネージャの役割

運用保守業務の範囲は幅広く、システムの安定稼働の実現はもちろんのこと、
顧客からの問合せ対応やシステム監視等多岐にわたります。

また、顧客のニーズや課題を把握し、
改善提案を行うこともITサービスマネージャの重要な役割です。


しかし、実際の現場では目の前の定常業務に忙殺され、
なかなか改善提案に目を向けられないことが課題だと感じています・・・φ(. .)


### ツール導入による運用改善活動

私が従事する案件では、**ツール導入による運用業務の改善活動**を行っています。

例えば、インシデント管理ツールにServiceNowを導入し、
インシデントの入力を自動化することで、単調作業の稼動を削減しました。

(現在は、エラー発生時の自動エスカレーションを目指して奮闘しています。)


また、AIを使った業務効率化にも挑戦しており、
ChatGPTを使って、顧客向け資料の誤字チェックやアンケートの集計を行っています。

このようなツール導入により、定型業務の自動化やAIに置き換えることで、
お客様向けの改善提案活動に稼動を向けられるよう取り組んでいます。

実務を通じて、
サービス開始後の運用・保守フェーズのほうがお客様への影響が大きいことや、
運用で課題を見出し、改善をまわすことで最終的にはシステムの安定稼動に繋がること…
などなど

私が配属前に想像していたITサービスマネージャの印象から良い意味でギャップがありました。

いまはITサービスマネージャの役割の重要性にやりがいと興味が湧いています。


### こんな人材になりたい！（未来のITサービスマネージャ像）

DX化により複雑になったシステムには、高度な運用が求められています。
また、人手不足や顧客ニーズの変化等、運用保守を取り巻く環境は常に変化しています。

私が思い描く未来のITサービスマネージャ像は、
常に成果を出し続けていくために、このような変化をキャッチして、
時代の変化に合わせて柔軟にスキルや知識を磨いていけるような人材です。
そのためには、現状に満足せず、チャレンジ精神を持って、運用改善活動や課題解決の推進を行うことが重要だと思います。


### おわりに

未来のITサービスマネージャについて、理想像を書いてみました。

目指す姿に近づけるよう、変化を恐れず、
これからも様々なことにチャレンジしていきたいと思います☺
25:アドカレ完走感想

アドカレ最終日〜〜〜！！！
よく走り切った俺！

# 何の記事？
これは、[ぐらだけアドカレ2023](https://qiita.com/advent-calendar/2023/c9h11o2)の最終日の記事です。

アドカレを完走した感想を書きます。

# 誰向け？ どんな役にたつ？
- Qiitaアドカレを完走することで得られるものが気になる人

# あらすじ
Qiitaアドカレをはじめた下記にあるとおり、書いてみっか！おっしゃー！……になります。

https://qiita.com/c9h11o2/items/c036844735fad9f4b137

# やったこと・できたこと
- 24/25日分、その日中に投稿
- 19/25日分、予約投稿
- 感想・ギャグ・成果物付記事・作成途中の整理記事と、様々なジャンルの記事を書く
- 自分の中に蓄積されていた知識から記事を書く
- 対象範囲が狭く、内容も浅目の記事を書く

# むずかしかったこと
- 予約投稿をしておくこと
- 予約投稿できずに当日投稿になると焦る
- 加えて、文章の推敲が足りなくなる
- タグの付け方

# 感想
なんとか走りきりました……。
ただ、自分の中にある技術で、誰かに共有できるものは何だろう？と考えることや、それをわかる形で書こうとすること、形にして公開すること。それが何よりも自分の力になったと感じています。

あと、予約投稿しておけるのがとても便利でした。
ただ、後半は書き溜めておいた下書き貯金がなくなり、1日1日マラソンで書いていったのですが、それが返って、１記事単位のハードルを下げて公開することにつながったので良かったかなと思っています。
綺麗な記事が書けないと記事を寝かせておくよりも、どんどん公開していく方が力になると考えているので。

自分はプログラマでもなければ正式に〇〇エンジニアという肩書がある人間ではありません。
でも、心はエンジニアとして日々業務改善や趣味タスクの効率化にいそしんでいます。
そのことが、このQiitaアドカレを完走したことで自分でも認識できたことは大きいです。

来年も年末の集大成としてこうして書くつもりでネタを温めておこうとおもいました。またやりたいです。

技術記事を書くことで改めて調べたり新たに得た知識もあったので、今後も何か少しでも共有できるものがあればこうして記事にしてみたいと思います。
【Spring Data JPA】Database操作③

↓の続き

https://qiita.com/NaN-jp/items/c1b7139c2f6f2a6c53d9

決まったキーワードを組み合わせることで目的を満たすクエリが自動で生成されます
まず初めに目的を設定します
上記はレコードの取得のために`findBy`というキーワードを使用しました
その他以下のキーワードがあります
|キーワード|メソッドサンプル|説明|
|:---:|:---:|:---:|
|`findBy`|`findByName(String name)`|条件に一致するレコードの取得|
|`existsBy`|`existsByName(String name)`|条件に一致するレコードが存在するか(T/F)|
|`countBy`|`countByName(String name)`|条件に一致するレコード数|
|`deleteBy`|`deleteByName(String name)`|条件に一致するレコードの削除|

次に条件を設定します
上記では、`findByName`とすることで「`name`と一致する」という条件を設定しています
等価条件以外は、以下のキーワードを用いて設定できます
複数フィールドを条件とする場合は、メソッドで指定したフィールド順序とパラメーターの順序を同じにします
|キーワード|メソッドサンプル|クエリ|
|:---:|:---:|:---:|
|Not|findByNameNot(String name)|... where name <> ?1|
|And|findByNameAndAge(String name, int age)|... where name = ?1 and age = ?2|
|Or|findByNameOrAge(String name, int age)|... where name = ?1 or age = ?2|
|LessThan|findByAgeLessThan(int age)|... where age < ?1|
|LessThanEqual|findByAgeLessThanEqual(int age)|... where age <= ?1|
|GreaterThan|findByAgeGreaterThan(int age)|... where age > ?1|
|GreaterThanEqual|findByAgeGreaterThanEqual(int age)|... where age <= ?1|
|Between|findByAgeBetween(int min, int max)|... where age between ?1 and ?2|
|IsNull|findByNameIsNull()|... where name is null|
|IsNotNull|findByNameIsNotNull()|... where name is not null|
|In|findByNameIn(String... name)|... where name in ?1|
|NotIn|findByNameNotIn(String... name)|... where name not in ?1|
|Like|findByNameLike(String name)|... where name like ?1|
|NotLike|findByNameNotLike(String name)|... wehre name not like ?1|
|StartingWith|findByNameStartingWith(String name)|... where name like ?1%|
|EndingWith|findByNameEndingWith(String name)|... where name like %?1|
|Containing|findByNameContaining(String name)|... where name like %?1%|
|True|findByActiveTrue()|... where active = true|
|False|findByActiveFalse()|... where active = false|
|IgnoreCase|findByIdIgnoreCase(String id)|... where UPPER(id) = UPPER(?1)|

最後に取得する結果に対して手を加えます
以下のキーワードを使用することで、並び替えや取得レコード数を指定することができます
|キーワード|メソッドサンプル|説明|
|:---:|:---:|:---:|
|OrderBy|findByNameOrderByAgeDesc(String name)|レコード順序の指定|
|Top, First|findTop3ByName(String name)|指定した数だけ上位のレコードを取得（Top、Firstは同義）|
|Distinct|findDistinctByName(String name)|同一結果のレコードの集約|
Pieace Of Ego

個人開発中のアプリケーションについて紹介していきます。

---
|  | 記事内容 |
|:-:|:-------------|
| 1 | [アプリ概要](#1-アプリ概要) |
| 2 | [開発環境](#2-開発環境) |
| 3 | [機能](#3-機能) |
| 4 | [スクリーンショットとデモ](#4-スクリーンショットとデモ) |
| 5 | [ソースコード](#5-ソースコード) |

# 1. アプリ概要
- **タイトル**: Pieace Of Ego
    <br>
- **内容**: 世界に一つの**カード**を作成し、**オンライン**上で最高に**クール**な**バトル体験**を提供する。
    <br>
- **目的**: **サーバーサイド**の知識を深め、特に**トランザクション処理**の理解を進めるためのプロジェクト。また、**IOS**業界の拡大を見越して、**Swift**の技術を習得することも目指しました。
# 2. 開発環境
- GitHub
- Xcode
- Swift
- Firebase 
    - firestore
    - RealtimeDB
    - Authentication
    - Cloud Messaging
# 3. 機能
主な(ここに個数を記述)の機能を紹介します。
1. **ログインシステム**
    - Googleでのログインのみ対応している。
    - フレンドシステムを構築するために設けた。
    (以下にデモあり)
    <br>
1. **フレンドシステム**
    - 同じルーム内に存在するプレイヤーとフレンドになることが可能。
    - フレンドになることで相手にゲームに招待を送ることが可能。
    - 相手が未ログインor通知機能offの場合はフレンドになれない。
    <br>
1. **通知**
    - アプリがNotRunningの際にPush通知が届く。
    - 通知をタップすることでアプリが開く。
    - ルームへの直接の招待は不可(実装予定)。
    (以下にデモあり)
    <br>
1. **ルーム作成**
    - 16文字以下のルームIdを設定可能。
    - ゲストはルームIdを入力することで参加可能。
    - ゲーム進行のすべてを管轄する。
    <br>
1. **プレイヤの排除**
    - Ban: 一生そのルームに入ることが不可能になる。
    - Kick: 一時的にルームから追い出される。
    - ホストのみ実行可能。
    <br>
1. **ゲームボードの設定**
    - 初期ステータス(HP, MP, G, etc...), 初期カード配布枚数, デフォルトカードの使用可否を設定可能。
    - ホストのみ設定可能。
    <br>
1. **ゲームボードの編集**
    - プレイヤの保有カード, デッキ, 墓地, プレイヤのステイタス, 設定可能な情報はすべて編集可能。
    - ルーム内のプレイヤーであれば全員編集権限がある。
    <br>
1. **カード作成**
    - 属性, パラメータ(ATK, DEF), 特殊効果を設定可能。
    - 特殊効果は言葉で表現可能な範囲内の現象であれば設定可能。
    - カードの編集、削除、属性ごとのソート機能も実装。
    <br>
1. **チャット機能**
    - 30文字以内の文章を送信可能。
    - 送信者の名前も表示される。
    <br>
1. **広告**
    - AdMobを使用。
    - Apple Storeからの配信一時停止に伴い、利用を停止中。

# 4. スクリーンショットとデモ
準備中...
# 5. ソースコード
**GitHub**: ~~Pieace Of Ego~~ (改修作業中のため非公開とさせていただきます)
Kubernetes上でLaravelを立ち上げてみる。

# はじめに

naritomoと申します。

本職はインフラエンジニアを行っています。

最近色々活用し始めているK8Sについて、Laravelを立ち上げてみました。

いろいろアドバイスいただけると嬉しいです。

## 立ち上げ概要

Laravel9以上のサイトをK8Sで立ち上げる手順になります。

必要なソースは以下にまとめてあります。

https://github.com/naritomo08/laravel_K8S

## 参考URL

[M1 MacBook上へのローカルk8s環境（minikube、kind）セットアップ手順](https://qiita.com/kyontra/items/b1696df6ea072fa48c34)
[gcloudコマンドでGKEを立ち上げてみた。](https://qiita.com/naritomo08/items/d1a3122264b248915360)

## 事前準備

参考URLを参照し、M1 Macにて、ローカル環境またはGKE環境ができていること。

＊kindについては後に示す手順で立ち上げること。

## 環境構築手順

### 本リポジトリをクローンする。

```bash
$ git clone https://github.com/naritomo08/laravel_K8S.git laravelk8s
laravel9の場合
$ git clone https://github.com/naritomo08/laravelapp3.git backend
laravel10の場合
$ git clone https://github.com/naritomo08/laravelapp4.git backend
つぶやきサイトの場合
$ git clone https://github.com/naritomo08/laravel9tubu.git backend
```

後にファイル編集などをして、git通知が煩わしいときは
作成したフォルダで以下のコマンドを入れる。

```bash
 rm -rf .git
```

### (ローカルでkindを使用する場合)kindの立ち上げ

```bash
cd laravelk8s
kind create cluster --config kind.yaml --name kindcluster
```

停止する場合
```bash
cd laravelk8s
kind delete cluster --name kindcluster
```

### phpレジストリ作成のシェルスクリプトを実行する。

```bash
$ chmod u+x build_env.sh && ./build_env.sh
```

### docker hubへイメージプッシュする。

docker hubアカウントを作成する。

以下のコマンドを入力する。
```bash
docker login
docker tag laravel:0.1 <docker hubユーザー名>/laravel:0.1
docker push <docker hubユーザー名>/laravel:0.1
```
*パブリックレジストリに入るため扱いに注意すること。

### K8S稼働シェルスクリプトを実行する。

```bash
$ vi laravel-php.yml
以下の部分を書き換える
image: <docker hubユーザー名>/laravel:0.1
$ vi k8s_run.sh
→動かすK8S環境に応じ稼働させるサービスファイルを指定すること。
$ chmod u+x k8s_run.sh && ./k8s_run.sh
kubectl get all
→　エラーが発生していないこと。
```

### コンテナコマンド実施

```bash
kubectl get po -o wide
laravel-cache/laravel-dbのIPを控える。
kubectl get all
→laravel-phpのポッド名を確認する。(複数作った場合は全てに対して実施する。)
kubectl exec -it <ポッド名> sh

vi .env

以下の場所を前の手順で控えたIPに書き換える

DB_HOST=<laravel-dbのIPアドレス>
REDIS_HOST=<laravel-cacheのIPアドレス>

.env反映

php artisan cache:clear
php artisan config:cache

DBへのマイグレート

php artisan migrate
php artisan config:cache

exit
```

### 各種サイト確認する。

*つぶやきサイトでは画像アップが実施できません。

## サイトURL

### laravelサイト（kind)

```bash
http://127.0.0.1:10081
```

### laravelサイト（minikube)

```bash
kubectl get laravel-np
→PORT(S)の右側のポート番号を確認する。
http://127.0.0.1:<ポート番号>
```

### laravelサイト（GKE)

```bash
kubectl get laravel-lb
→External-IPの値を確認する。(数分待つ。)
http:/<External-IP>
＊SSL化していないので、利用に注意！
```

## K8S稼働サイトを削除する方法

以下のコマンドを実行する。

```bash
$ kubectl delete -f ./manifest
```

# おわりに

この記事がK8S/GKE/Laravelを扱う方の助けになればと思います。
見直さなければならない部分も多数あるため修正していきます。
Google Playストアでアプリ開発者の氏名、住所が公開されることになります

## 今後、Google Playストアでアプリ開発者の氏名、住所が公開されることになります
　デベロッパーアカウントで収益化を有効にしている場合、アプリページ上で開発者の氏名、住所が公開されることになります。
~~現時点では新規にデベロッパーアカウントを作成した場合のみに適用されています。~~
現時点で本人確認が完了すると提出した書類に基づく正式な氏名と住所が公開されます。
収益を有効にしている場合は氏名と住所の両方が表示され、有効化していない場合は氏名のみ表示されます。
 

## 無料アプリだけを公開している開発者の氏名、住所は公開されない？
　~~収益化を有効にしていないデベロッパーアカウントについては現在、どのようになるか検証を行っていないため未知数です。しかし、デベロッパープロフィールの住所の項目には「収益を行うことを選択した場合は正式な住所の全体が公開されます。」と説明があるので収益を行っていなければ公開されない可能性があります。~~
 現時点で確認を行ったところ、収益化していない場合でも氏名は公開されます。

## 公開されていることをどのように確認したのか？
　~~新規にデベロッパーアカウントを作成し、既存デベロッパーアカウントから広告のみのアプリを移行し公開することで確認を行いました。新規デベロッパーアカウントは収益化を行うように設定されています。~~
 自分自身のアカウントとそのほかの個人開発者さんのストアでの表示で確認を行いました。

## どのように表示されるの？
　下画像は実際にどのように表示されるかPC上のブラウザからPlayストアのアプリページを表示した場合の様子です。Android端末から閲覧した場合もレイアウトが縦方向になるだけで基本的には変わりはありません。
![PlayStore.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660841/20190e95-4435-ce85-f766-cd69b696a247.png)


「デベロッパーについて」という項目が新規に追加され、そこに提出した書類の氏名・住所が掲載されます。
運転免許証およびそのほかの証明書に記載されている正式な氏名、住所が入ります。


## いつから表示されるの？
　~~現在、新規にデベロッパーアカウントを作成し、アプリを公開した場合はすでにこの仕様が適用されています。~~
 現在の最新の状況では本人確認が完了するとストア上に氏名、住所が公開されます。

「Google Play の信頼性と透明性を向上させるための新たなポリシー アップデート」
https://android-developers-jp.googleblog.com/2023/07/boosting-trust-and-transparency-in-google-play.html

~~によると「新規 Google Play Console デベロッパー アカウントの作成要件は、2023 年 8 月 31 日より始まります。」とあり、比較的、最近に作成されたデベロッパーアカウントについてのみ適用されているようです。
また、「その後、同様のプロセスを既存のデベロッパーにも展開する予定です。 」と記載があり、今後、おそらくは本人確認完了のタイミングでこの表示仕様に切り替わっていくものと推測されます。~~
現在の最新の状況では上述の通り、本人確認が完了するとストア上で氏名、住所が公開されます。


 ## デベロッパーコンソール上での情報編集はどうなる？
 これまで住所などは自由に編集することができましたが、新しい仕様では提出した確認書類の情報が編集不可能な形で表示されます。
 情報を更新したい場合は、再度、確認書類をアップロードする必要があります。
 ![PlayConsole.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660841/195b0fa6-f25b-e365-0b23-0c31dc1628bc.png)

## 本人確認書類はどのような感じで行われる？
　専用の送信フォームから2種類の書類をスキャナーなどでスキャンしてアップロードします。
一つ目は運転免許証など顔写真入りの証明書になります。
二つ目は政府発行の証明書または公共料金の支払い明細などになります。
どちらも同じ氏名・住所である必要があります。

　アップロードするとデベロッパーコンソール上で「確認中」という状態になります。
また、有料アプリ、アプリ内課金を有効にしていた場合は、デベロッパーアカウントと関連付けられている「お支払いプロファイル」も「確認中」の状態になります。
確認が完了すると、氏名、住所等は固定され編集することはできなくなります。
変更が必要な場合はリクエストフォームから再度、本人確認を申請することになります。

## 本当に公開されるの？
　~~少なくとも現在、新規に作成したデベロッパーアカウントにおいては公開されています。
今後、Googleがこの仕様を撤回しない限りは既存アカウントにもこの仕様が適用されていくと予想されます。~~
現時点ですべての個人開発者に適用されています。
サイトにIP制限をかけつつAPIだけはかけたくない時(apache +AWS環境) 

# 例えばこんな時
開発サーバーにアクセス制限はかけないといけません
でもお客様に開発中のアプリを見せる関係でAPIだけはアクセス制限をかけたくない時

# 構成
apache
AWS
LARAVEL


## アクセス制限について
AWS側でもapacheを使ってもIP制限自体は可能だが、
今回のように特定フォルダ直下のみだけ外したい場合はAWSのセキュリティグループを使った設定では実現できません

## やり方
```
    <Directory /var/www/pj/src/public>
    Options All -Indexes
    AllowOverride All
    Require ip (許可したいIP)
    </Directory>
    <Location "/api">
        AllowOverride All
        Require all granted
    </Location>>
```
confファイルに上記を追記
調べたところこれでできるはずが、どうしてかapiが通りません。
かなり悩んだ末結果こちらを追記で通りました。
```
<Location "/index.php">
    Require all granted
</Location>
```
index.phpへのアクセスだけは許可しておかないとapiまで見に行ってくれないわけですね。
よく考えればそうですね・・・。
index.phpのアクセスを制限したままapiだけ通すようにできるやり方はあるんでしょうか。
まだまだこのあたりの勉強が必要です。
Bitcoin system tradeに入門するぞい（バルサラの破産確率編）

# はじめに

世界に平穏なクリスマスが訪れますように。初めまして自分はGreen_helmetと言います。現在S級botterを目指して絶賛BTC bot開発中です。開発の様子はXtwitterのGreen_helmetの連ツイ「[System trade入門するぞい](https://twitter.com/bethlehem4099/status/1678733646633779201)」に投稿中ですので興味があったらご覧ください。さて、今回は前記、連ツイの中からバルサラの破産確率について取り上げ、加筆訂正のうえ投稿します。

## バルサラの破産確率とは

バルサラの破産確率とは勝率p、平均損益比PF、一回のトレードでリスクに晒す資金の割合eを与えた時に長期間で破産する確率qを計算する方法です。自分の破産確率を計算したいBotter、トレーダーの役に立つと思います。
さて、バルサラの破産確率については検索すると色々な表が出てきますがpython計算プログラムは掲載されていませんでした。それで自分でプログラムを作ることにしました。
参考文献は下に示します。

## 計算式

文献から計算式は以下のようになります。

```math
    x = p* {x^{(1+k)}}  + (1 - p)   
    (0<x<1)
```
```math
f(x) = p* x^{(1+k)} - x + ( 1 - p )
```
とする。
```math
f(x)=0 (0＜x＜1)
```
f(x)=0のxに関する解をyとする。f(x)を描いて見ると単調な関数でかつ微分可能なのでニュートン法が使えそうです。解をニュートン法で求めます。ただし、一次微分f’(x)は、
```math
f’(x) = p * (1+k) * x^k   -  1
```
破産確率qは以下で計算できます。
```math
q = y ^ {(n/b)}= y^{(1/e)}
```
## Python関数

と言うわけでPythonプログラムは以下のようになります。

```Python:barsala.py
from scipy import optimize

def barsala_bankruptcy_probability(_p, _k, _e):
    """
    cc0
    入力：
        p:勝率、定数（0=<p<=1）
        k:平均損益比（PF、ペイオフレシオ)=sum_benfit/sum_loss.定数(0=<k)
        b:1回のリスク賭け金
        n:総資金
        e:一回のトレードでリスクに晒す資金の割合、定数(0<e<=1)
        e=b/n
    出力：
        x:内部変数（0<x<1）
        y:特性方程式f(x)の根（0<=y＜=1）
        q:破産確率（0=<q<=1）
    """
    def f(x):
        return _p * x**(_k + 1) - x + (1 - _p)
    _y = optimize.newton(f, 0.4, fprime=lambda x: _p * (_k + 1) * (x**_k) - 1, tol=1e-14, maxiter=99999)
    _q = _y ** (1 / _e)
    return _q    
```
もちろん
＞pip install scipy 
で事前にライブラリscipyをPythonのシステムにインポートしておく必要があります。

## 結果のサンプル
代表的なe=5％、e=10％で表を作ってみました。

### 表　e=5％、e=10％、勝率p％、PF(Profit/Loss ratio)に対する破産確率q％
![スクリーンショット 2023-12-24 19.46.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342182/d367999e-9de0-c688-2e9d-d2955ebefe81.png)

### 感想1
資金のe=10％を一回に賭ける時、勝率p=60%で平均損益比PF=1.5でも破産確率0.1％はかなり高いのでは？トレードを1000回したら1回は破産するのかね、知らんけど。システムトレードだとすぐに1000回に行きそうだけどなあ。

### 感想2
勝率90％、PF>2で数年間調子よく稼いでいたbotter、トレーダーが、資産数千万円から1日で突然破産するのはどう説明すれば良いのでしょうか。少し疑問です。

## 参考文献

http://memo.eightban.com/excel/balsara
Linuxの起動まで：システム起動からユーザーが使用できる状態になるまで

# Linuxの起動まで：システム起動からユーザーが使用できる状態になるまで

## はじめに
Linuxシステムを起動する過程は複雑で、多くのコンポーネントが組み合わさっています。この記事では、コンピュータの電源が入ってからLinux OSが起動し、最終的にユーザーがシステムを使用できる状態になるまでのプロセスを簡潔に解説します。理解を深めることで、障害対応やシステムの最適化、セキュリティ強化などに役立ててください。

## システム起動のフロー
1. **ファームウェアの起動 (BIOS/UEFI)**
    - コンピュータの電源が入ると、マザーボード上のファームウェア（BIOSまたはUEFI）が起動します。
    - POST（Power-On Self-Test）を実行してハードウェアをチェックし、起動順序に従ってブートデバイスを探します。

2. **ブートローダーの実行**
    - ファームウェアは指定されたブートデバイス（通常はハードディスク）のブートセクタを読み込み、そこに存在するブートローダー（例: GRUB）をメモリにロードして実行します。
    - ブートローダーはカーネルイメージの位置を特定し、必要なパラメータと共にメモリにロードします。

3. **Linuxカーネルの起動**
    - ブートローダーから制御を受けたLinuxカーネルは、自身の初期化を開始し、ハードウェアデバイスの検出とドライバのロード、ファイルシステムのマウントなどを行います。
    - 初期RAMディスク（initrdまたはinitramfs）が使用される場合、必要なモジュールとスクリプトを含んだ一時的なファイルシステムが最初にロードされ、システムの起動をサポートします。

4. **initプロセス（システムの初期化）**
    - カーネルは起動が完了すると、PID 1 のプロセス（initプロセス、最近ではsystemdやUpstartなど）を起動します。
    - initプロセスはシステムの他のすべてのプロセスの親となり、各種サービスやデーモンの起動、ログインプロンプトの設定など、システムを使用可能な状態にするための残りのステップを管理します。

5. **ログインプロンプトの表示**
    - システムが完全に起動し、initプロセスが設定を完了すると、ユーザーはログインプロンプトを通じてシステムにアクセスできるようになります。
    - デスクトップ環境がインストールされている場合は、グラフィカルログインマネージャーが表示されることもあります。

## 各コンポーネントの詳細
はい、その通りです。コンピュータの起動フローは、複数の異なるコンポーネントが連携して動作します。ここでは、その各段階における役割を詳細に説明します：

1. **ファームウェア（BIOS/UEFI）**: 
   - **役割**: コンピュータの電源が投入された直後に動作を開始する組み込みソフトウェアです。
   - **主な機能**: ハードウェアの初期化、自己診断（POST: Power-On Self-Test）、起動デバイスの選択などを行います。
   - **続行**: 設定に基づいて、指定されたデバイス（通常はハードディスクやSSD）のブートセクタにアクセスし、ブートローダーを探して実行します。

2. **ブートローダー（GRUB, Windows Boot Managerなど）**:
   - **役割**: ファームウェアから制御を引き継ぎ、OSのカーネルをメモリにロードするプログラムです。
   - **主な機能**: ハードウェアのさらなる初期化、カーネルのロード、マルチブート環境でのOS選択、カーネルへのパラメータ渡し等を行います。
   - **続行**: カーネルをメモリにロードし、実行を開始します。

3. **OSカーネル（Linux Kernel, Windows NT Kernelなど）**:
   - **役割**: システムの中核となるソフトウェアで、ハードウェアの管理とプロセス間の仲介を担います。
   - **主な機能**: デバイスドライバのロード、プロセススケジューリング、メモリ管理、システムコールの提供など。
   - **続行**: 初期化プロセス（Linuxでは`init`、システムDなど）を起動し、最終的にユーザーインターフェース（コマンドラインまたはグラフィカル）を提供します。

各コンポーネントは、システムの起動という共通の目的に向けて、順番にそれぞれの役割を果たし、次のステージへと制御を移譲します。これにより、コンピュータはオフの状態からフル機能のオペレーティングシステムを実行する状態へと移行します。

## まとめ
Linuxシステムの起動プロセスは、ファームウェアの初期化から始まり、ブートローダー、カーネル、initプロセスを経て、最終的にユーザーがシステムを使用できる状態になります。この一連のプロセスを理解することは、システムのトラブルシューティングやカスタマイズ、セキュリティ強化において重要です。何か異常が発生した場合は、この起動フローのどの段階で問題が起きているのかを特定することから始めます。

**注意**: この記事の内容は一般的なガイドラインを提供するものであり、特定のシステムや環境によっては異なる挙動を示すことがあります。常にシステムのドキュメントやマニュアルを参照し、適切な手順を確認してください。
WindowsでWSLを使わずRedashを動かす

備忘録として…
LinuxやMacであればMakefileを実行すると簡単に環境をできますが、WindowsかつWSLを利用しないの場合少々クセがあります。
どうやって手元で構築したか作業ログとして残しておきます。

## 環境

- Windows 11 Pro
- Docker for Windowsはログインまで完了済
- Gitもインストール済
- pythonもインストール済

## 手元にRedashをダウンロードする

```sh
git clone git@github.com:getredash/redash.git # どちらか好きな方で
```

```sh
git clone https://github.com/getredash/redash.git
```

## .envの用意

まず環境変数を用意しましょう。.envファイルを作成し、鍵を作成するためにpythonで以下のコードを実行します。

```py
import secrets; print(secrets.token_hex())
`ランダムな文字列が出力されたらOK`
```

この出力を先ほど作成した`.env`に``貼り付けます。

```sh:.env
REDASH_COOKIE_SECRET=さっき出力された文字列
```

## nodeのセットアップ

node16は執筆時点でEOLですが、package.sjonを見るとまだnode17以降は対応していないため、node16を好きな方法でインストールしてください。
その後、yarnを実行できるようにするため、Powershellを管理者で開き、`Set-ExecutionPolicy RemoteSigned`を実行します。実行後確認をされますので、`Y`を入力してください。

これでnodeの実行が終わったので、` npm install -g yarn`を実行し、yarnを実行できるようにします。

## フロントエンドのセットアップ

`yarn install`をする前に、preinstallを実行します。
ただPowerShellのファイルパスなどの仕様の違いによる差分を埋めるため、`./package.json`のscriptsをその前に少々書き換えます。
他のコマンドも将来的には書き換えが必要ですが、最低限

```diff_javascript
- "clean": "rm -rf ./client/dist",
- "build": "yarn clean && yarn build:viz && NODE_ENV=production webpack",
- "preinstall": "cd viz-lib && yarn link --link-folder ../.yarn",
- "postinstall": "(cd viz-lib && yarn --frozen-lockfile && yarn build:babel) && yarn link --link-folder ./.yarn @redash/viz"
+ "clean": "del client\\dist",
+ "build": "yarn clean && yarn build:viz && set NODE_ENV=production&&webpack",
+ "preinstall": "cd viz-lib && yarn link --link-folder ..\\.yarn",
+ "postinstall": "(cd viz-lib && yarn --frozen-lockfile && yarn build:babel) && yarn link --link-folder .\\.yarn @redash/viz"
```

その後、下記コマンドでライブラリをインストールして、ビルドを行います。
```sh
yarn run preinstall
yarn install
yarn run postinstall
yarn run build
```

## コンテナの起動

これで準備は一通り完了したので、コンテナを起動しましょう。
```
docker compose build
docker compose up -d
```

コンテナを起動後、localhost:5001にアクセスするとredashにアクセスできると思います。


## やってみて
まず大きな大前提として、WSLなどを使えばもっと楽にできると思います。
今回は使わないならどう立ち上げるの？という興味でやったので、ストレスなどはなかったですが、簡単な方向に倒せるならそちらへ寄せてしまった方がよいでしょう。
万が一、RedashをWSLを使わずに環境を作ることになってしまった方がいましたら、何かしら参考になれば幸いです。
【TIPS】リストの値から発生頻度を算出する

この記事は、[Elixir Advent Calendar 2023 シリーズ14](https://qiita.com/advent-calendar/2023/elixir) の18日目です

---

【本コラムは、5分で読め、3分で試せます】

[piacere](https://twitter.com/piacere_ex) です、ご覧いただいてありがとございます :bow:

Elixirはデータ分析が得意な言語ですが、その中でも「発生頻度の計算」は利用シーンが多い一方、古いElixirには該当関数が無かった歴史を紹介しつつ、使い方を解説します

# `Enum.frequencies`、`Enum.frequencies_by`

リストから発生頻度を算出する関数である、`Enum.frequencies` と `Enum.frequencies_by` は、Elixir 1.9までは存在しておらず、自前で作る必要がありました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/e2ae9f67-0a82-bebf-2830-becbf64b6cbe.png)

Elixir 1.10からは標準搭載されています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/d76661fd-8850-7656-3891-956356007904.png)

# リストにある値の発生頻度

都道府県の先頭文字の発生頻度を求めます

```elixir
iex> pref = ["北海道", "青森", "岩手", "宮城", "秋田", "山形", "福島",
 "茨城", "栃木", "群馬", "埼玉", "千葉", "東京", "神奈川",
 "新潟", "富山", "石川", "福井", "山梨", "長野", "岐阜", "静岡",
 "愛知", "三重", "滋賀", "京都", "大阪", "兵庫", "奈良",
 "和歌山", "鳥取", "島根", "岡山", "広島", "山口", "徳島",
 "香川", "愛媛", "高知", "福岡", "佐賀", "長崎", "熊本", "大分",
 "宮崎", "鹿児島", "沖縄"]
iex> pref |> Enum.map(& String.first(&1)) |> Enum.frequencies
%{
  "滋" => 1,
  "北" => 1,
  "徳" => 1,
  …
  "鹿" => 1,
  "佐" => 1,
  "千" => 1
}
```

1件を除外します

```elixir
iex> pref |> Enum.map(& String.first(&1)) |> Enum.frequencies |> Enum.reject(& elem(&1, 1) == 1)
[{"山", 3}, {"大", 2}, {"福", 3}, {"愛", 2}, {"宮", 2}, {"長", 2}]
```

# 一部の値を含む発生頻度

先頭文字に限らず、「福」を持つ都道府県の発生頻度を求めるには、`Enum.frequencies_by` に抽出用関数を指定すればOKです

```elixir
iex> pref |> Enum.frequencies_by(& String.contains?(&1, "福"))
```

「福」を持つ都道府県は、3つあるようです

```elixir:結果
%{false: 44, true: 3}
```

「山」を持つ都道府県は、6つもあるようです

```elixir
iex> pref |> Enum.frequencies_by(& String.contains?(&1, "山"))
%{false: 41, true: 6}
```

「山」で始まる都道府県は、正規表現を使っても求められ、6つもあるようです

```elixir
iex> pref |> Enum.frequencies_by(& Regex.match?(~r/^山/, &1))
%{false: 41, true: 6}
```

「島」で終わる都道府県も正規表現で求められ、4つあるようです

```elixir
iex> pref |> Enum.frequencies_by(& Regex.match?(~r/島$/, &1))
%{false: 45, true: 2}
```

# 値を確認したい場合

`Enum.frequencies_by` と同じ条件を、`Enum.group_by` に渡すと、`Enum.frequencies` のように発生頻度の元となった値を拾うこともでき、`true` のみを抽出すればマッチした値のみを拾えます

```elixir
iex> pref |> Enum.group_by(& String.contains?(&1, "福"))
%{
  false: ["北海道", "青森", "岩手", "宮城", "秋田", "山形",
   "茨城", "栃木", "群馬", "埼玉", "千葉", "東京", "神奈川",
   "新潟", "富山", "石川", "山梨", "長野", "岐阜", "静岡",
   "愛知", "三重", "滋賀", "京都", "大阪", "兵庫", "奈良",
   "和歌山", "鳥取", "島根", "岡山", "広島", "山口", "徳島",
   "香川", "愛媛", "高知", "佐賀", "長崎", "熊本", "大分",
   "宮崎", "鹿児島", "沖縄"],
  true: ["福島", "福井", "福岡"]
}
iex> pref |> Enum.group_by(& String.contains?(&1, "福")) |> Map.get(true)
["福島", "福井", "福岡"]
```
読むとためになるマーケティング本

マーケティングの良書を探すのにえらい苦労したので、同じ苦しみを味わっている人（あるいはこれから味わうかもしれない人）のために入門書をまとめておく。

## 入門書
「改訂4版 グロービスMBAマーケティング」
「この1冊ですべてわかる 新版 マーケティングの基本」

どちらもマーケティングの全体像を俯瞰できる入門書。
マーケティングの用語は一通り解説されているので、この2冊のどちらかを読めばマーケティング分野の人の話す内容が少しわかるようになると思う。
でも、どちらも教科書的なので正直読んでて面白くない。

## 入門書（古典）
「コトラー&ケラーのマーケティング・マネジメント 基本編 第3版」
「ポジショニング戦略[新版]」
「ブランド・リーダーシップ 「見えない企業資産」の構築」
「ザ・マーケティング 「顧客の時代」の成功戦略」
「ONE to ONEマーケティング 顧客リレーションシップ戦略」
「「個」客革命」
「ワンダーマンの「売る広告」: 顧客の心をつかむマーケティング」

マーケティングという分野を築き上げてきた人たちの本。
古い本なので敬遠する人が多いかもしれないが、今のマーケティング理論の基礎になっているので読んでおいて損はない。
少なくとも日本人が書いたよくわからんマーケティング本を読むよりは有意義だろう。

## 読み物
「マーケティングをつくった人々」

入門書というより読み物。マーケティング分野を築き上げてきた人たちへのインタビューをまとめた本。この本に名前が上がっている人たちの著作を読むだけでだいぶ勉強になる。
たぶん年明けくらいに一番言ったこと

# 例外処理書かないならバイつけようぜバイ
今年の頭か去年の頭か時期は忘れたもののrailsのコードでデータの検索時にfindを書いているパターンをよく見ました。

# なんか違うんだっけ？
基本的な話ですが、findとfind_byではいろいろと違うことがあります。
検索の条件に渡せるものがfindだとIDだけなのに対してfind_byになると他のカラムで行けたり、取得結果としてfindだと複数取得できるけどfind_byだったらマッチした最初の1件だったり・・・

そして一番の違いがマッチするデータがなかった時の挙動です。
find_byではnilが返ってくるのに対してfindだと例外（ActiveRecord::RecordNotFound）を発生させて処理が中断します。

# 例外処理書くならfindでもいいんだけどね
データがなかった場合は・・・するみたいな処理の時はfindで例外処理書いてあげればデータ取得→有無判定→処理の流れで有無判定をなくせるのですっきりするものの指摘したときはそういう処理だったわけでもなかったのでfind_byでええやん、になりましたとさ

# 今はもう言うことなくなってよかった
最近はもういう機会もなくなったものの、懐かしいおもひでとして覚えておきたい
URDF用の慣性テンソル計算機

![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) ほどよい計算機が欲しい

## やること
URDFに入力するイナーシャを簡易計算します。
そのままURDFにコピペできる出力できる形式に出力します。

## 作業環境
* python 

## 参考

ズバリnpakaさんのコードを自分用にちょっと改造したものになります。↓

https://note.com/npaka/n/n37dbe4eae232

計算式はEMANさんのサイトを参考にさせていただきました。↓

https://eman-physics.net/dynamics/mom_tensor.html

ありがとうございます。

## 今回の計算機の特徴

- 直方体の形状のみ計算します。
- 重量の単位をグラム、ミリでも入力できます。
- 偏心がある場合も入力できます。
- URDFにコピペできる一行で計算できます。

パラメーターを入れたモデルをシミュレーターにかける場合、部品の回転軸がどこにあるかは気にせず、部品自体のイナーシャを求めればよいようです。

## github

https://github.com/Ninagawa123/Meridian_Dev/blob/main/inertia_culc/box_inertia_culc.py

# コード案

```phtonn:inertia_calc.py
# Boxの計算
def calculate_box_inertia_with_offset(m, w, d, h, dx, dy, dz):
    # 基本的な慣性モーメント
    Iw = (m / 12.0) * (d**2 + h**2)
    Id = (m / 12.0) * (w**2 + h**2)
    Ih = (m / 12.0) * (w**2 + d**2)

    # 平行軸定理による修正
    Iw += m * (dy**2 + dz**2)
    Id += m * (dx**2 + dz**2)
    Ih += m * (dx**2 + dy**2)

    # 慣性積の計算
    ixy = -m * dx * dy
    ixz = -m * dx * dz
    iyz = -m * dy * dz

    # 非常に小さい値を0.0として扱う
    ixy = 0.0 if abs(ixy) < 1e-10 else ixy
    ixz = 0.0 if abs(ixz) < 1e-10 else ixz
    iyz = 0.0 if abs(iyz) < 1e-10 else iyz

    print(f'<inertia ixx="{Iw:.5f}" iyy="{Id:.5f}" izz="{Ih:.5f}" ixy="{ixy:.5f}" ixz="{ixz:.5f}" iyz="{iyz:.5f}" />')

# 数値入力を取得する関数
def get_float_input(prompt):
    while True:
        try:
            return float(input(prompt))
        except ValueError:
            print("無効な入力です. 数字を入力してください.")

# Inertia計算機
selection = "START"
while selection.upper() != "Q":
    print("====================")
    print("Boxの物体についてURDF用の慣性テンソルを計算します. :")
    print("[1] 入力単位 (kg, m) width(x-axis)*depth(y-axis)*height(z-axis)")
    print("[2] 入力単位 (g, mm) width(x-axis)*depth(y-axis)*height(z-axis)")
    print("[Q] 終了")

    selection = input(">>")

    if selection == "1":
        mass = get_float_input("mass>>")
        width = get_float_input("x-axis length (Okuyuki) >>")
        depth = get_float_input("y-axis length (YokoHaba)>>")
        height = get_float_input("z-axis length (Takasa) >>")
        dx = get_float_input("x-axis offset >>")
        dy = get_float_input("y-axis offset >>")
        dz = get_float_input("z-axis offset >>")
        calculate_box_inertia_with_offset(m=mass, w=width, d=depth, h=height, dx=dx, dy=dy, dz=dz)

    if selection == "2":
        mass = get_float_input("mass>>")*0.001
        width = get_float_input("x-axis length (Okuyuki) >>")*0.001
        depth = get_float_input("y-axis length (YokoHaba)>>")*0.001
        height = get_float_input("z-axis length (Takasa) >>")*0.001
        dx = get_float_input("x-axis offset >>")*0.001
        dy = get_float_input("y-axis offset >>")*0.001
        dz = get_float_input("z-axis offset >>")*0.001
        calculate_box_inertia_with_offset(m=mass, w=width, d=depth, h=height, dx=dx, dy=dy, dz=dz)
```

# つかいかた・実行結果
python で開いて数値を入力します。
偏心がない場合などはコードを削って使うと便利です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/848b8a22-f91a-c8bd-5995-a4e46579a74d.png" width = 600>
トランスポートネットワークのスライシングとは。。。？

[前回](https://qiita.com/Assie61400886/items/35f9cf7468337c4ca057)はトランスポートネットワークのものすごく基礎的なところを書いてみたのですが、今回はトランスポートネットワークのスライシングに関してです。

先の記事の標準化のところで説明したとおり、トランスポートに関連する標準はバラバラなこともあり、トランスポートのスライシングに関しては統一見解はまだない気がしています。
そしてL1~L3＋Overlayレイヤーいろんな技術でスライシングができるので、
どのレイヤーでネットワークを切るのが正解なのか、その答えはまだ私には不明。。。

従来は固定・モバイルを独立したネットワークで切りたい人は筐体ごとわけてネットワークを切って、各ネットワーク内はVLANとかL2,L3 VPNで切ってQoSつけるとかが多いのかなーと思います。
あとはファイバー貸す事業者さん(=Wholesale Operator)とかは光レイヤーでファイバチャネルをわけて各チャネルに顧客をアサインする形してたりするのかなと思います。

これがネットワークの進化によって、どう変わるのか。
統一見解はないものの、いくつかの標準の流れや主要技術はあるので書いてみます。

●標準化の流れ
①IETF: 
いろんな流れがあるのだけど、[このドキュメント](https://datatracker.ietf.org/doc/draft-boucadair-teas-ietf-slicing-overview/)あたりが流れをまとめてくれてわかりやすいかなと思いました。
スライシング関連の動きは以下が書いてます。
・MPLS NWのSlicing: TEAS(Traffic Engineering Architecture and Signaling)
　*L2,L3VPNに加えてSegment RoutingのFlex Algoとかもこちらで、IETFのスライシング周りだとメインになるかなと思います。
　*前からあったACTN(Abstraction and Control of TE Network)をベースに作られてる。
　*5Gのネットワークスライス識別子(S-NSSAI)ベースにIETF Domain ControllerがTransport Network Controllerとして動く想定。 
・VPN+
・OTN Slicing
・DetNet (時刻同期ベース)  

②Linux Foundation ONAP Network Slicing
 IETFのスライスはTransport Network Controllerが一つに対し、
 ONAPのSlicingはFronthaul, Midhaul, BackhaulでControllerを分けることまで考えられてます。
 これはFronthaulとかMidhaulはかなりORANと密接に関わっているので、RANのControllerの下に入ったほうがいいんじゃないのかという考えかなと思います。

③OIFのFlex-E
 光ネットワークでのスライシング技術です。
 Flex-EはPCSレイヤーとMACレイヤーの間に一つFlex-Shimレイヤーが入るという結構斬新な構成で、TDMフレームを追加して複数チャネルをBonding、Subrating、Channelizationしてくれます。[CIENAさんのページ](https://www.ciena.com/insights/articles/What-is-FlexEthernet-and-Why-is-it-so-Important.html)がわかりやすい。
端的にいうと、Interfaceに対して分割したネットワーク・帯域を最大限に使えるようにいろいろまとめてくれます。

④IOWN APN1.0はOTN Slicg?
 たぶん、OTN Slcingと呼んでいいであろう。

というわけで、まとめるとトランスポート関連のスライシングに関連する技術は以下あたりかなと思います。
IPレイヤ: L2L3VPN, SR Flex-algo, VPN+, DetNet 
光レイヤ：Flex-E, OTN Slicing, 
*ちなみにPONのスライシングはOLTでのチャネルアグリゲーションとかだったと思います。
これをどのドメイン(xHaulまとめて or Front・Midhaulとbackhaulわけて)でコントローラー作って上からNBI叩いてUnderlay NWに落としていくかという感じです。

以上　まとまりがないですがトランスポートネットワークスライスでした。
次がRANのスライシングと比較してどうなんだろう編です。
【ユーザーストーリーマッピング】は一人で作るものではない

## はじめに
最近、新規サービスを作るプロジェクトに途中で、Project Managerとして入った。デザインはある程度 固まっきていて、そろそろフィリピンのエンジニアを入れて開発を進めていきたいという段階だった。

## 困っていたこと
開発の優先順位を決めるために、User Storyを一人で作成していたが、なかなか今のデザインに上がっているすべてをUser Storyを作り切るのがむずかしい、かつ 量も多く、気の重い仕事になって、進められていなかった。
そんなときに、家の本棚にあった「ユーザーストーリーマッピング」という本を見つけて、これだ！と思い、手に取ったが、これは正解だった。
購入当時にこの本を読んだときはよくわかっていなかったが、今読み返すと とても参考になる学びが記載されていた。

本: https://amzn.asia/d/8wO8jA2


## 本の中で刺さったこと
>User Story Mappingは一人で作るのではなく、他の人々と一緒に会話をしながら作るものだ。
>User Story Mappingの一番の価値は、User Story Mappingを一緒に作りながら、会話をして、みんなでプロダクトに対しての共通理解をつかむことである。

User Storyの作成はUser Story作成の役割を担う人が一人で作成しきらないといけない認識だったが、この本ではUser StoryやUser Story Mappingは、一人で作るのではなく、みんなと一緒に会話をしながら作る、いや作るべきと何度も主張していた。
一人で作成していたときは気が重い仕事だなと正直感じていたが
みんなで会話をしながら作ることで、XXの機能は具体的にユーザーにどういう価値を渡せるんだけ？や〇〇のときはどうか？などUser目線に話を進めたり、いろんな角度で議論ができ、スムーズにUser Storyを作成することができた。
また、その話し合いから産まれたUser Storyは自分一人で作成したものより、圧倒的に質が高く、かつ楽しい。今後も人を巻き込んでUser Storyを作っていきたい。

>ストーリー駆動プロセスを機能させるためには大量のドキュメントが必要だ。
>しかし、これらのドキュメントは、従来の仕様書のようなものばかりではない。

ここの教えは頭に入れ続けたいなと感じた。
つい、ドキュメントはなくても説明だけでいいのでは？と考えてしまうこともあるが、この本には大量のドキュメントが必要と伝えている。
会議においては当たり前だが、たたき台がない状態でみんなが話し始めると、結論に至るまで本当に時間がかかる。
つい、こういうUser Story Mappingの作成などになると、たたき台をない状態で打ち合わせに進めてしまいがちだと思う。
会話も当たり前だが、打ち合わせ中に行われるので、できるだけ生産性をあげるためにもたたき台を事前に用意して、そのたたき台をもとにみなで会話しながらUser Storyを作っていきたい。

>本当は、あなたの仕事は世界を変えることだ

今回、受託開発のPMを業務委託として受け取っているが、
やはり受託開発だとお客さんの要望をそのまま作ることが目的になりがち。その流れに逆らわずにいると、機能・画面を作ることが仕事の目的になってしまう。流れに逆らわないことは楽だが仕事は楽しくなくなってしまう。楽しく仕事をするためにも、自分の仕事は世界を変えることだと意識し続けたい。

>私がストーリーマップを作るときに好んで使うスローガンがある。
話して記録。

これは自然と実践はしていたが、やはり重要なんだと再確認。
user story mappingを作成すると、いろいろ会話が出てくる。そのときに、その場で書かないと確実に忘れてしまうし、みんなも思い出せなくなるのでその場で書いて、後で見返したときに思い出せるようにするのが大事。

>これを使っている誰かの人生のある一日について話をしましょう。

user story mappingをみんなで取り組むときに、はじめにみんなに伝える言葉として有効だなと感じた。
実際にこの言葉を使った後、みんなでUserは途中で〇〇のこともするんじゃない？という意見が出た。いままで画面単位や機能単位の話ばかりだったので、驚いた。
こういう切り出し方で始めると、みんなuser目線になりやすく、userにとっての価値を中心で議論することができるので役立つと感じた。

## 終わりに
この仕事がつらいなと思ったときは、やはり学びのチャンスなんだなと再確認(今回はUser Storyを一人で作成する仕事)。
自分がつらいと感じている仕事は、必ず誰か他の人もつらい(つまり課題)と感じていることが多い。
そこには必ず解決策を検討して、それを本に書いてくれている人がいる。
今後も、仕事がつらい、難しいと感じたら、いろんな本から学びを得るチャンスだと捉えて、挑戦をし続けたい。
Golangのフレームワーク

はじめまして、グッドパッチでサーバーサイドエンジニアをやってる荒木です。

この記事は [Goodpatch Advent Calendar 2023](https://qiita.com/advent-calendar/2023/goodpatch) の 24日目の記事になります。

## はじめに
現在golangで開発に使ってるフレームワークはginですが、そろそろ切り替えも検討したいので調べてみました。

## 対象になるフレームワーク
Webアプリ開発に利用できるもので、スターの多いものをピックアップしています。

### gin-gonic/gin (⭐️73.2k)
 
 私も業務で利用していますが、一番最初に候補に上がるかと思います。
 利用していてポイントとなる部分。
 - 高速：他のフレームワークはginよりベンチマークが高かったりしますが、実用性として十分な速度です。
 - ミドルウェアサポート：ミドルウェアを使うことで認証系とかはシンプルに作りやすいです。
 - JSONバリデーション：普通に利用できます、フィールドが空の場合などの扱いもgoと同様。
 - ドキュメントが多言語で用意されている。[こちら](https://gin-gonic.com/ja/docs/introduction/)

また、レンダリング系も組み込まれていますが、私はテンプレートエンジンを別で組み込んでいます。
欠点としてはORMは組み込まれていないことくらいで使いやすいかと思います。

[GitHub](https://github.com/gin-gonic/gin)

###  beego (⭐️30.5k)
beegoはREST API、Web アプリ、バックエンドの開発に適していて、PythonのDjangoとよく似ています。
- REST、MVC
- APIドキュメント生成：開発体制によって必要性は変わるけど便利
- ORM：切り替えは問題なし
- APIモード
- CLIツールが用意されてる：好みは分かれると思いますが、LiveReloadは便利です。

大規模な開発ならginよりこちらを選ぶかも？

[GitHub](https://github.com/beego/beego)


### echo (⭐️27.4k)
定番なマイクロサービスに適したフレームワークで他のフレームワークと組み合わせて利用するのもOK
- RESTFUL APIの最適解
- シンプルなエラーハンドリング
- ginよりベンチマークが良い
- 任意のテンプレートエンジンが使える：逆を言えば。
- Let’s Encryptによる自動TLS

ライブラリとしての更新頻度は低い点が懸念

[GitHub](https://github.com/labstack/echo)

### fiber (⭐️29.7k)
NodeのExpress.js に似たフレームワークです。
FastHTTPエンジン上に構築されているため、最速のGoフレームワークの1つです。
- メモリ使用量が少ない：正直Ginでも別に困ってないです。
- ミドルウェアとNextをサポート
- 静的ファイル
- 9つのテンプレートエンジンサポート
- WebSocketサポート
- トラフィック軽減用のレイトリミッター
- 解りやすいドキュメントが用意されてる

ミニマリズムとUnix哲学、シンプルでモジュール式。
新規ユーザーには利用しやすいので選択肢として十分ありかと思います。

[GitHub](https://github.com/gofiber/fiber)

### iris (⭐️24.6k)
高速でありながらシンプルで多機能なWebフレームワークです。
ベンチマーク的にはgin、echoより高い数値を出しています。
- ミドルウェアが豊富
- APIのバージョニング
- ngrokサポート
- 対応テンプレートの多さ
- 独自のWebDAVサーバー

ライブラリによるフレームワーク拡張でほんと機能が豊富で大抵のことができます。
個人的には、APIのバージョン管理の自動化は採用してみたいですね。

[GitHub](https://github.com/kataras/iris)

### go-zero (⭐️26.6k)
大量アクセスに対応したWeb、RPCフレームワークです。

- タイムアウト制御、同時実行制御、レート制限、適応型サーキットブレーカー、適応型負荷分散などの機能
- シンプルな API 記述構文とコード生成ツール
- リクストパラメタの自動検証
- データキャッシュの自動化
- コールトレーシング、メトリクス、モニタリング

Githubの序盤の説明はちょっとアレなんですが、確かに機能としてみると高負荷なサービスを構築してると必要になる機能がきっちり含まれています。
マイクロサービスやってると魅力的に感じる部分が多いですが、シンプルなサービス利用だったり初心者は戸惑う部分も多いかも。

[GitHub](https://github.com/zeromicro/go-zero)

### kratos (⭐️21.9k)

マイクロサービス向けのフレームワークです。
- 組み込みミドルウェアが必要十分
- Pluginでconsulなどへ接続
- 標準ログインターフェスでサードパーティログライブラリとFluent収集ログの統合
- Swagger APIは自動的に生成され、 Swaggerプラグインを追加することでSwaggerUIエンドポイントを起動可能
- ドキュメントとサンプルが用意されている

マイクロサービスの構築にあたっては魅力的なフレームワークかと思います。

[GitHub](https://github.com/go-kratos/kratos)

## まとめ
今回、いろいろ調べてみましたが規模や利用するサービスによって選びたいものが増えていました。
特にマイクロサービスのフレームワークは実際に構築しているタイミングではあまり無く自力で開発していた部分がフレームワーク化されていて便利になっています。

個人的にはもう少し「iris」を深掘りしてみようかと考えているので、それはまた別の記事で。
Amazon ElasticCache

# Amazon ElasticCache
AWSが提供する完全マネージド型のキャッシュサービス。完全マネージド型の Redis と MemCache と互換性のあるサービスで、最新のアプリケーション向けにコスト最適化されたパフォーマンスをリアルタイムで提供する。AWSがホストするサービスにのみ限定される。

:::note info
DBのクエリ結果をキャッシュして分析を高速化したり，アプリケーションのセッション管理などに使用
:::

Amazon ElastiCacheは「Memcached」と「Redis」という2つのキャッシュシステムを提供している。
* Memcached
分散メモリキャッシュシステムを構築することができるキャッシュサーバの一つ
* Redis
アプリケーション・キャッシュまたは迅速に対応するデータベースとして使用されるオープンソースかつインメモリーのNoSQLキー/バリュー・ストア

## メリット
* 応答時間が早い
* コストの最適化
* サーバレスキャッシュをすぐに作成
* マルチAZにより99.999%のSLA達成

## デメリット
* AWSがホストするサービスに限定


# 参考
https://aws.amazon.com/jp/elasticache/
https://cmc-japan.co.jp/blog/what-is-an-elasticache/
https://www.ibm.com/jp-ja/topics/redis
https://e-words.jp/w/memcached.html
jqコマンドの出力時の色をカスタマイズしてみる

ターミナル上で JSON を見やすくする際に `jq` コマンドを使っているのですが、ハイライトの色を調整できないか気になりました。

調べたところ、バージョン 1.7 （2023年9月リリース）から**環境変数 `JQ_COLORS` で色をカスタマイズできる**ことがわかりました。

というわけで実際に試してみました。（ `jq` 自体の設定方法より、色の指定方法を探すほうが苦労しました）

## 試したバージョン

- jq 1.7.1
- GNOME Terminal 3.28.2

## 例
暗い背景のターミナル用に、明るい色を選んでみました。

```shell-session
$ export JQ_COLORS="33:93:93:96:92:97:1;97:4;97"

$ jq <<< '{"key":[null,false,true,123,"abc"]}'
```

結果は以下のスクリーンショットの通りです。

![jq_colors.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/857667/46b21f02-13c6-8704-8a51-ab9e18408a4c.png)

## 設定方法
`JQ_COLORS` については[公式マニュアル](https://jqlang.github.io/jq/manual/#colors)を読めば十分ですが、色などの細かい一覧を探すにはターミナルに関する資料を見る必要があります。

環境変数 `JQ_COLORS` での設定は**コロン区切りで8つ**あり、順に JSON の各要素に対する設定となっています。先ほど例に挙げた設定は以下のようになっています。

| 要素 | 設定例 | 装飾 | 色 |
|:-:|:-:|:-:|:-:|
| null | `33` | - | 黄 |
| false | `93` | - | 黄(明) |
| true | `93` | - | 黄(明) |
| 数値 | `96` | - | 水(明) |
| 文字列 | `92` | - | 緑(明) |
| 配列 | `97` | - | 白(明) |
| オブジェクト | `1;97` | 太字 | 白(明) |
| キー | `4;97` | 下線 | 白(明) |

設定しているセミコロン区切りの数値は、ターミナルで文字を装飾する際にエスケープシーケンスで指定するものと同じです。例えばシェルのプロンプトに色が付いているなら、環境変数 `PS1` を見ると `\033[NN;NNm` という形で同様の指定が見つかります。

```
$ echo "'$PS1'"
'\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
        ^^^^^               ^^           ^^^^^            ^^
      bold;green            reset      bold;blue          reset
```

数値でどのような設定ができるかは、例えば https://en.wikipedia.org/wiki/ANSI_escape_code#SGR に一覧があります。

以下は自身がよく使いそうな設定のメモです。（ほぼ色の指定方法）

- 00番台：太字や下線などの装飾
- `30`〜`37` ：前景色（8色）
- `90`〜`97` ：前景色（8色、明るくしたもの）
- `38;5;n` ：前景色（上の16色 ＋ RGB 216色 ＋ グレー24色）
- `38;2;r;g;b` ：前景色（24bitカラー）
- `39` ：前景色（デフォルト）

## 参考

- [jq 公式ページ](https://jqlang.github.io/jq/)
- [jq 1.7 リリースノート](https://github.com/jqlang/jq/releases/tag/jq-1.7)
- [ANSI escape code - Wikipedia (英語版)](https://en.wikipedia.org/wiki/ANSI_escape_code)
【Unity】SceneViewからRaycastを飛ばして座標を取得したい。

この記事は金沢工業大学 Advent Calendar 2023の24日目です。
# 自己紹介
メリークリスマス！金沢工業大学メディア情報学科の学生です。CA Tech Accelに参加中でUnityモチベ高すぎな人。

# 本題
### SceneViewをクリックしたらそこの座標を知りたい！
意外に最新版での方法がネットに書いてなさそうだったので、サクッと書きます。備忘録です。
また、ネットに書いてあるものはEditor拡張なのに`MonoBehaviour`を使っていたり、、、個人的には少し違和感を感じたので、`Editor`を使っての実装です。

### コード
```C#:SceneViewPosition.cs
using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(SomethingAsset))]
public class SceneViewPositon : Editor 
{
    public void OnEnable()
    {
        SceneView.duringSceneGui -= OnScemeViewClick;
        SceneView.duringSceneGui += OnScemeViewClick;
    }
    public void OnSceneViewClick(SceneView sceneView)
    {
        // イベントを変数として保存
        var e = Event.current;

        // マウスの左クリックのときtrue
        if ((e.type == EventType.MouseDrag || e.type == EventType.MouseDown) && e.button == 0)
        {
            // 座標のズレが起きないようにマウスのポジションを取得
            var mousePosition = new Vector3(e.mousePosition.x, 
                Camera.current.pixelHeight - e.mousePosition.y,
                0);

            // レイキャストを飛ばす
            if (Physics.Raycast(Camera.current.ScreenPointToRay(mousePosition), out var hit))
            {
                Debug.Log(hit.point);
            }
        }
    }
}
```
```C#:SomethingAsset.cs
using UnityEngine;

[CreateAssetMenu]
public class SomethingAsset : ScriptableObject
{
    // なんか
}
```
### 説明
このコードは、`SomethingAsset`をクリックしたときに`SceneViewPositon`の`OnEnable`が呼ばれその中の処理が実行されます。この`OnEnable`の中がSceneViewをクリックしたときのイベントを登録するモノです。

昔の記事では`onSceneGUIDelegate`を使うパターンが紹介されていますが、これは非推奨になっており、代わりに`duringSceneGui`が提供されています。

`OnSceneViewClick`の中は一般的なEvent処理を行っています。コードのコメントを読めば何とかなると思います。

### 結論
結論としては、`SceneView.duringSceneGui`にイベントを登録すれば良いということなので、登録方法によっては色々なものに使いまわせるのではないでしょうか。

### 終わりに
これを使って少しツールを作成しているので、いずれパッケージとしてリリースできるといいですね。
2月中旬ぐらいまでにはします。（Accelがそのくらいに終わるため。）たぶん。たぶん。

良ければX(Twitter)フォローしてください。
レコードトリガーフローの高速項目更新を使おう

# はじめに

みなさん`高速項目更新`オプション使ってますでしょうか？
利用する上で`アクションと関連レコード`より制限はあるものの単純にパフォーマンスが良かったりするので
レコードトリガーフローを作る際にどっちを選ぶか？は判断できるようになっておくとよいです。
今回は`高速項目更新`と`アクションと関連レコード`の違いについて書きます。

![Flow-Builder (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/d513ffb1-4742-bee1-04df-8b65412cd029.png)

# `高速項目更新`と`アクションと関連レコード`の違い

|オプション|特徴|制限等|
|---|---|---|
|高速項目更新|`アクションと関連レコード`オプションより10倍高速（[保存前更新を実行するフローのレコードトリガー](https://help.salesforce.com/s/articleView?id=sf.flow_concepts_trigger_record.htm&type=5)）|**・トリガしたレコード以外のレコードへの作成、更新、削除はできない**<br />  **・フローを起動するレコード更新以外のアクションを実行することはできない<br />**・新規レコードのIDなどのレコード保存後に設定される項目にはアクセスできない|
|アクションと関連レコード||上記の制限はなく、他のレコードの作成・更新・削除、アクションの実行などが行える。|
>引用：https://youtu.be/CsM9qd9KbY8?si=O9MtQQESx9-BqMyX&t=2193

レコードトリガーフローでトリガしたレコードに対して、ステータスを変えるとかのものに関しては基本的に
`高速項目更新`の対象としてマッチしてそうです。

速度が速い理由は以下の通りです
>各レコードがデータベースに再度保存されないためです。この追加の保存手順を回避することで、実行に時間のかかる割り当てルール、自動レスポンスルール、ワークフロールール、および他のカスタマイズの再実行もスキップされます。
引用：https://help.salesforce.com/s/articleView?id=sf.flow_concepts_trigger_record.htm&type=5

# フローを見比べる

取引先のレコードが更新されたら、取引先評価の項目を更新するフローを`高速項目更新`と`アクションと関連レコード`で作成して比較します。

## フロー全体

今回は単純な更新のみのフローなのでどちらも全体像は変わりません。

![スクリーンショット 2023-12-24 21.04.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/50885257-b05b-3981-d267-a4f963500fad.png)

## 要素を追加のメニュー

|`アクションと関連レコード`|`高速項目更新`|
|---|---|
|![スクリーンショット 2023-12-24 20.56.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/c3da7ba7-718a-f057-f354-e2fe0fa774a8.png)![スクリーンショット 2023-12-24 20.56.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/e40c8007-6be2-957b-c444-b40df966499f.png)![スクリーンショット 2023-12-24 20.56.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/b95af4d4-e0a1-af1b-e963-1767f4546214.png)|![スクリーンショット 2023-12-24 20.46.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/e5350cfd-7557-0e81-4dc5-b5a50a42e032.png)![スクリーンショット 2023-12-24 20.46.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/37927256-a8bc-d6ed-c2f3-aaadfbffa64a.png)|

## レコード更新要素

|`アクションと関連レコード`|`高速項目更新`|
|---|---|
|![スクリーンショット 2023-12-24 20.57.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/d96ada85-467b-d828-baa8-7bedfdf458dc.png)|![スクリーンショット 2023-12-24 20.52.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/8e039238-4a26-7a73-a67a-0c8fbc2bbd29.png)|

## 実行時間

それぞれ5回同じレコードでデバッグ実行して終了時間を比較します。
`アクションと関連レコード`が一回0.6秒代を出しましたが
仮に全て0.2秒台だったとしても`高速項目更新`の方が早いと言えそうです。


||`アクションと関連レコード`|`高速項目更新`|
|---|---|---|
|デバッグ結果|0.64 秒<br />0.23 秒<br />0.21 秒<br />0.20 秒<br />0.19 秒|0.21 秒<br />0.15 秒<br />0.14 秒<br />0.15 秒<br />0.15 秒|
|平均|0.294秒|0.16秒|

# 最後に

いかがだったでしょうか？記事内のサンプルだと優位差が少しわかりにくいかもですが、
実行速度に関しては間違いなく早いといえるでしょう。
もちろん速度面もそうですが、私個人としては機能に制限があることで一つの目的のレコードトリガーフローがいくつもの目的を包括して保守しづらくなるということが起きにくくなるとも思ってます。
是非積極的に`高速項目更新`の利用を検討してみましょう！！
Pythonのスライスはコロン":"だけじゃない？slice()の活用法

## はじめに
Pythonのスライス機能は非常に便利で、コロン(":")での表記が一般的ですが、組み込み関数`slice()`は複雑な操作などや変数へ保存する場合に役立ちます。

`slice()`の使い道として、複数の配列に対して同じスライスをする適用する場合などが挙げられます。(コロン表記では、通常変数のスライス情報の保存はできないです。)

Pythonはコロン表記がお馴染みで、あまり`slice()`が知られていないと思い、本記事を書きました。

## コロン":"と`slice()`の比較
コロン":"と`slice()`の書き方と処理速度を簡単に比較します。

実装はGoogle Colabに挙げています。

https://colab.research.google.com/drive/19kLWN3TVdAR0h0x87Q9IL3nWE_4Ig95p?usp=sharing

### 書き方


#### コロン（":"）の使用
リストのスライスは通常、`start:stop:step`の形式で記述されます。`start`はスライスの開始位置、`stop`は終了位置、`step`はステップ（スキップする幅）を指定します。

#### `slice()`の使用
`slice()`オブジェクトは`slice(start, stop, step)`の形式で記述されます。`start`、`stop`、`step`はコロンで指定する各要素と同じ意味です。

#### 例1(要素番号1から6までを1ずつ抜き出す)
`lis = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]`と定義したときに、`lis`の要素番号`1`から`6`まで1ずつ抜き出す場合の書き方です。
```python
# 例1(要素番号1から6までを1ずつ抜き出す)
lis = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print('slice colon:', lis[1:7])

slice_object = slice(1, 7, 1)
print('slice object:', lis[slice_object])
print('slice object:', lis[slice(1, 7, 1)])  # もちろん直接slice()を書いてもOK
print('slice object:', lis[slice(1, 7)])  # 1ずつ抜き出す場合は最後の引数を省略OK
print('slice object:', lis[slice(1, 7, None)])  # 1ずつ抜き出す場合は最後の引数を`None`でもOK
```
```:出力
slice colon: [1, 2, 3, 4, 5, 6]
slice object: [1, 2, 3, 4, 5, 6]
slice object: [1, 2, 3, 4, 5, 6]
slice object: [1, 2, 3, 4, 5, 6]
slice object: [1, 2, 3, 4, 5, 6]
```

#### 例2(要素番号1から6までを2ずつ抜き出す)
`lis`の要素番号`1`から`6`まで2ずつ抜き出す場合の書き方も確認しておきます。
```python
# 例2(要素番号1から6までを2ずつ抜き出す)
lis = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print('slice colon:', lis[1:7:2])

slice_object = slice(1, 7, 2)
print('slice object:', lis[slice_object])
```
```:出力
slice colon: [1, 3, 5]
slice object: [1, 3, 5]
```
#### 例3(コロンの要素番号の省略のslice()での書き方)
```python
# 例3(要素を2ずつ抜き出す)
lis = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print('slice colon:', lis[::2])

slice_object = slice(None, None, 2)  # コロンの省略は`None`に対応
print('slice object:', lis[slice_object])
```
```:出力
slice colon: [0, 2, 4, 6, 8]
slice object: [0, 2, 4, 6, 8]
```

#### 例4(slice()のトリッキーな書き方))
```python
# 例4(要素番号0から2まで1ずつ抜き出す)
lis = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print('slice colon:', lis[:2:])

print('slice object:', lis[slice(None, 2, None)])  # コロンの省略は`None`に対応
print('slice object:', lis[slice(2)])  # 少しトリッキーな書き方
```

```:出力
slice colon: [0, 1]
slice object: [0, 1]
slice object: [0, 1]
```
### 処理速度の比較
処理速度の比較には、同じ処理を1000万回を5反復した平均を使って評価します。以下はGoogle Colabで`%%timeit`を用いて計測した結果になります。

※処理速度の比較は、あまり深く検討しているわけではないので参考までにお願いします。

```python:コロン":"の処理速度
%%timeit -n 10000000 -r 5
lis = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
slice_colon = lis[1:7:2]
# -> 221 ns ± 54.9 ns per loop (mean ± std. dev. of 5 runs, 10000000 loops each)
```
```python:slice()の処理速度
%%timeit -n 10000000 -r 5
lis = [0, 1, 2, 3, 4, 5]
slice_object = lis[slice(1, 7, 2)]
# -> 327 ns ± 124 ns per loop (mean ± std. dev. of 5 runs, 10000000 loops each)
```
コロンの方が処理速度自体は速い結果となりました。

## まとめ
Pythonのリストスライスには通常コロン（":"）で十分ですが、複数の配列にスライスを適用する場合やスライス情報を変数に保存したい場合には、`slice()`も便利です。ちなみに、処理速度はコロンの方が速い結果となったので、状況によって使い分けていきましょう。

## 参考資料
https://www.w3schools.com/python/ref_func_slice.asp

https://www.programiz.com/python-programming/methods/built-in/slice
【Spring Data JPA】Database操作②

# カスタムクエリ
↓の基本クエリにない場合は自分でカスタムすることもできる

https://qiita.com/NaN-jp/items/cc8a219baff2dd7bad07

名前が`john`のユーザーのレコードを取得
```java:Service.java
public List<User> getUser(String name){
    return userRepository.findByName(name);
}
```
※`getUser`メソッドのメソッド名は何でもいいです
***
名前が`willian`で年齢が20歳のユーザーを取得
```java:Service.java
public List<User> getUser(String name, int age){
    userRepository.findByNameAndAge(name, age);
}
```
※`getUser`メソッドのメソッド名は何でもいいです
***
ユーザーがアプリ内トラッキングを許可しているかどうかを取得
```java:Service.java
public boolean getTrackingAllow(int id){
    return userRepository.isTrackingAllowById(id);
}
```
※戻り値がboolean型の時は`is`から始まります