OmniAICreator/Qiita-1.07M huggingface dataset:
AWSの基本用語

# はじめに
スマートフォン向けのアプリエンジニアをやっていると、サーバ側の仕様検討に付き合わされ
当然のようにAWSの知識がある前提で話をされることがある。

ふんわりとは知っているんですよ、ふんわりとは。
実際にAWSにアクセスして一部設定をしたこともあるが、なにぶんエンジニア人生の0.1%くらいの時間なのでもはや風化しており忘れているし、古すぎる知識なのでアップデートが必要なのですよと。

というわけで、AWSのとりあえず知っておけ！という超基本用語に関する記事を書きます。


# AWSとは
Amazon Web Services (AWS) は、世界最大のクラウドプロバイダーの一つです。クラウドコンピューティングとは、インターネットを通じてコンピューティングリソースを提供するサービスモデルです。
![スクリーンショット 2024-12-27 13.58.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/0aeb696e-84db-d850-3545-aafcd459f56b.png)

# EC2 (Elastic Compute Cloud)
[AWS公式HP：Amazon EC2](https://aws.amazon.com/jp/ec2/ "AWS公式HP：Amazon EC2")
EC2は、クラウド上で動作する仮想サーバーです。
物理的なサーバーを購入せずに、必要な時に必要な分だけコンピューティングリソースを利用できます。

・インスタンス
　EC2で起動した個々の仮想サーバーを「インスタンス」と呼びます。
　インスタンスは数分で作成でき、使わない時は停止や削除が可能です。

・EC2の主な特徴
→柔軟性
　　スペック変更: アプリケーションの負荷に応じて、CPUやメモリなどのスペックを簡単に変更できます。
　　ストレージ拡張: データ量が増えた場合、ディスク容量を簡単に拡張できます。
　　コスト効率
　　従量課金: 使用した時間分のみ料金が発生します。
　　停止時の節約: 使用しない時はインスタンスを停止することで、コストを抑えられます。
→インスタンスタイプ
　　EC2には様々なインスタンスタイプがあり、用途に応じて選択可能

# S3 (Simple Strage Service)
[AWS公式HP：Amazon S3](https://aws.amazon.com/jp/s3/ "AWS公式HP")
Amazon S3 (Simple Storage Service) は、高い耐久性と可用性を持つオブジェクトストレージサービスです。
データのバックアップやアーカイブに適しています。

# VPC (Virtual Private Cloud)
[AWS公式HP：Amazon Virtual Private Cloud](https://aws.amazon.com/jp/vpc/ "AWS公式HP")
Amazon VPC (Virtual Private Cloud) は、AWSクラウド内にユーザー専用の仮想ネットワーク環境を作成できるサービスです。VPCを使用することで、ユーザーは自身のプライベートな空間でAWSリソースを安全に実行できます。

例えば、複数のEC2を使用して、セキュリティを高め、自分のEC2からしかアクセスされないストレージを持ちたい、といった場合に使用する。

VPCを使用することで、ユーザーはクラウド上でセキュアなネットワーク環境を構築し、柔軟にリソースを配置・管理することができます。これにより、セキュリティを確保しつつ、効率的なクラウドインフラストラクチャの運用が可能になります。

# RDS データベース(Relational Database Service)
[AWS公式HP：Amazon Relational Database Service](https://aws.amazon.com/jp/rds/ "AWS公式HP")
Amazon RDS  は、フルマネージド型のリレーショナルデータベースサービスです。
MySQL、PostgreSQL、Oracle などの主要なデータベースエンジンをサポートしています。

# Redis
Redis（レディス）は、メモリ上で動作するオープンソースのインメモリデータベースです。
(これはAWS専用の機能とかではない)

# Amazon Elastic Cache
[AWS公式HP：Amazon Elastic Cache](https://aws.amazon.com/jp/elasticache/redis/ "AWS公式HP")
インメモリ型のデータベース、データの保存、処理をメモリ上で行うということ

# ELB（Elastic Load Balancing　ロードバランサー)
[AWS公式HP：Amazon Elastic Load Balancing](https://aws.amazon.com/jp/elasticloadbalancing/ "AWS公式HP")
ELBは、AWSが提供するロードバランシングサービス
トラフィックの自動分散、ヘルスチェック、自動スケーリング、セキュリティ強化が可能。

# AWS IAM (Identity and Access Management)
[AWS公式HP：Amazon IAM](https://aws.amazon.com/jp/iam/ "AWS公式HP")
IAMは、AWSリソースへのアクセス管理を行うサービスです1。ユーザー、グループ、ロールを通じて細かな権限制御が可能です。

# CloudWatch　モニタリングと管理
[AWS公式HP：Amazon CloudWatch](https://aws.amazon.com/jp/cloudwatch/ "AWS公式HP")
Amazon CloudWatch は、AWSリソースとアプリケーションのモニタリングサービスです1。パフォーマンスの監視、ログの分析、アラートの設定などが可能です。


以上
Wisper環境構築手順 Python3.10　（Proxy対策あり）

    Wisper環境構築手順 Python3.10ver　
    •	Python3.10をインストール
    •	仮想環境構築
    •	ライブラリインストール　通常
    •	ライブラリインストール（社内環境設定 接続準備〜インストール）




### Python3.10をインストール

公式サイト：[Python Release Python 3.10.8 | Python.org](https://www.python.org/downloads/release/python-3108/)

### インストールチェック
```shell
py --list-paths
```
👆ここで　3.10　と出てくれればok

### 仮想環境構築
``` shell
py -3 --version
C:
cd ../../
```

``` shell
py -3.10 -m venv wisp
wisp\scripts\activate
cd wisp\Scripts
```



###  ライブラリインストール
１. pip を最新状態へ
``` shell
#pip を最新状態へ
python -m pip install --upgrade pip  
``` 
２. 使用するライブラリ
``` shell
#使用するライブラリ
pip install torch torchvision torchaudio --index-url 
pip install -U openai-whisper  
pip install git+https://github.com/openai/whisper.git

```



## 社内環境設定 Proxy対策

１社内環境設定
``` shell
set HTTP_PROXY=http://<USERID>:<PASSWORD>@＜会社アドレス＞.com:8080/
set HTTPS_PROXY=http://<USERID>:<PASSWORD>@＜会社アドレス＞.com:8080/
```
２セットアップ確認
``` shell
echo %HTTP_PROXY%
echo %HTTPS_PROXY%
```
👆社内環境設定の時に入力した文字列がでてくればok！

３ライブラリインストール
``` shell
python -m pip install --upgrade pip  --proxy=http://USERID:PASSWORD@:8080

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 --proxy=http://<USERID>:<PASSWORD>@＜会社アドレス＞.com:8080

pip install -U openai-whisper  --proxy=http://<USERID>:<PASSWORD>@＜会社アドレス＞.com:8080

pip install git+https://github.com/openai/whisper.git --proxy=http://<USERID>:<PASSWORD>@＜会社アドレス＞.com:8080
```



## 引用


本家のOpenAI　Whisper

https://openai.com/index/whisper/

インストール手順

https://github.com/openai/whisper#:~:text=Repository%20files%20navigation-,README,-MIT%20license

-----
自作RailsアプリをAWS上に開発する　〜ローカルのDocker上で起動したアプリにアクセスできるか検証〜

# 1. 概要
Railsアプリの開発をローカル環境上で一通り終えたので、Dockerに慣れるためにローカル環境上にDockerコンテナを立てて、コンテナ上で稼働しているRailsアプリにローカル上からアクセスしてみる。

# 2. 用意するファイル
### Dockerfile

```Docker:Dockerfile
#ベースイメージとしてrubyを指定
FROM ruby:3.3.3

#作業ディレクトリの指定
WORKDIR /app

#アプリケーションコードがローカルのalcoholの配下にあるため、コンテナのapp配下にコピー
#alcoholはアプリ名
COPY alcohol /app

#コンテナ内にコピーしたGemfileを用いてbundel install
RUN bundle config --local set path 'vendor/bundle' \
  && bundle install
```

### docker-compose.yml

```:docker-compose.yml
version: '3'
services:
  db:
    image: postgres
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
    ports:
      - "5432:5432"
  web:
    build: .
    command: bundle exec rails s -p 8000 -b '0.0.0.0'
    volumes:
      - ./alcohol:/app
    ports:
      - "8000:8000"
    environment:
      RAILS_ENV: development
      DATABASE_URL: postgres://postgres:password@db:5432/Alcohol_development
    depends_on:
      - db
```

### database.yml
hostの値にはdocker-compose.yml上で定義したデータベース用コンテナのサービス名と同一のものを設定する。
```:database.yml
default: &default
  adapter: postgresql
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000
  encoding: utf8
  username: Alcohol
  password:
  host: db

development:
  <<: *default
  # database: db/development.sqlite3 変更
  database: Alcohol_development

test:
  <<: *default
  # database: db/test.sqlite3 変更
  database: Alcohol_test

production:
  <<: *default
  # database: db/production.sqlite3 変更
  database: Alcohol_production
  username: Alcohol # 追加
  password: <%= ENV['ALCOHOL_DATABASE_PASSWORD'] %> # 追加
```

### Gemfile
割愛。「gem "rails"」はRailsを利用するために必須だが、そのほかはアプリで使用するものを記述しておく。

# 3. ディレクトリ構成
```
environment
├─ Dockerfile                    
├─ docker-compose.yml 
├─ alcohol
　　├─ ・・・・                     　#Railsアプリが定義されている

```

# 4. 実行順序
### ①Dockerイメージのビルド
```bash:bash
docker-compose build
```

### ②Dockerイメージがビルドされたことを確認
```bash:bash
docker images 
```

### ③データベースを作成
```bash:bash
docker-compose run web rails db:create   
```

### ④データベースのマイグレーション
```bash:bash
docker-compose run web rails db:migrate 
```

### ⑤コンテナの起動
```bash:bash
docker-compose up 
```

### ⑥Railsアプリにアクセスする
`https://http://localhost:8000`へアクセスし、アプリが表示されることを確認する。

# 5. 結果
ローカル環境上のDockerコンテナ上で起動したRailsアプリにアクセスすることができた。
【備忘録】Flatpakを使ってWayland環境に入れたVSCodeでpodmanからdevcontainerを使う

何故そんなことをした? という感じですが、何故かこうなりました。

# 環境

- ディストリビューション: Arch Linux
- デスクトップ環境: KDE Plasma 6
- Flatpak: 1.15.91
- VSCode: 1.96.1
- podman: 5.3.1
# (省略) podmanのインストールと設定

ホスト側にもpodmanのインストールが必要。
既に出来ていたので省略。[ArchWiki](https://wiki.archlinux.jp/index.php/Podman)を見てインストールしたはず。

```sh
podman ps
```

や

```sh
ls /run/user/1000/podman/podman.sock
```

が動作することを念の為確認。

# FlatpakでのVSCode用 `podman-remote` のインストール

```sh
flatpak install com.visualstudio.code.tool.podman 
```

これで、VSCodeのbashに `/app/tools/podman/bin/podman-remote` が生えてくる。

# FlatsealでのVSCodeの設定

**Flatpak使うなら `com.github.tchx84.Flatseal` は絶対入れよう! コマンドラインで設定するより格段に楽になる**

標準から変化させている箇所としては以下。

XWaylandを使いたくなかったので以下の設定。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88256/fb1e0763-de07-2be7-a2b4-cdc418fbf99c.png)

Podmanのソケットを見るために以下の設定(重要)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88256/646b87c4-b5e4-5ab0-77a8-af13f7fb8d17.png)


# VSCodeの設定

VSCode上から以下の設定をいじる。

```json
    "dev.containers.dockerPath": "/app/tools/podman/bin/podman-remote",  // Dockerのかわりにpodman-remoteを使うようにする
    "dev.containers.mountWaylandSocket": false,  // 理由はよく分からないが、falseにしないとソケットがない的なエラーが出た
```

# (おまけ) 日本語入力を行えるようにする

```sh
flatpak run com.visualstudio.code --enable-wayland-ime
```

のように、 `--enable-wayland-ime` オプションをつけると日本語入力が出来た。
`$HOME/.config/code-flags.conf` にこの設定を書けば永続化できるらしい。

# `devcontainer.json` の設定

この設定が必要なのはかなり微妙。 `devcontainer.json` をいちいち書き換えないと動かなかった。

以下を追加する。

```json
	"runArgs": [
		"--userns=keep-id:uid=1000,gid=1000"
	],
	"containerUser": "vscode",
	"updateRemoteUserUID": true,
 ```

# 他にもうちょいいい環境ないの?

- そもそもFlatpakでVSCode使うのしんどいのでは、という話はある
- podmanよりdockerの方がdevcontainerにはいい気がしてきた
    - 以下の2つの設定さえすればFlatpak + Dockerでも使えるような気がする
    - Flatsealから、見れるファイルに `/var/run/docker.sock` を付け加える
    - VSCodeの設定で `"dev.containers.dockerPath": "/run/host/usr/bin/docker"`

とはいえ、個人的には、今回の環境は従来のものより先進的で、将来のあるべき形だと信じているので、このまま続けたい。
RxJS をNetflixに例えて理解する。

## Netflixの世界で考えるRxJSの基礎
まずはNetflixの世界観でRxJSの主要な登場人物を紹介します。

### 1. Observable = Netflixサービス
Observableは、動画（データ）を提供するNetflixそのものです。
**特徴:**
- ユーザー（視聴者）が「サブスクライブ」しない限り、動画は配信されません。
- 動画は一つずつ順番に配信されます（リアルタイム感）。
Netflixが動画を「これは面白いからどうぞ！」と提供する仕組みが、Observableにあたります。

### 2. Observer = 視聴者
Observerは、配信された動画を楽しむ視聴者そのものです。
**特徴:**
- 動画を受け取って視聴（next）。
- エラーが発生すれば文句を言う（error）。
- 「今日はもう見終わった！」と満足する（complete）。

### 3. Subscriber = Netflix愛好会メンバー
Subscriberは、Netflixサービスと視聴者をつなぐ架け橋。
**特徴:**
- 「サブスクライブ」することで、動画配信がスタート。
- 「退会」すれば、もう配信されません（unsubscribe）。

## サンプルコード
以下の例で、Netflixのサービスと視聴者の関係をイメージしてください。
```
import { Observable } from 'rxjs';

// Observable（Netflixサービスの作成）
const netflixService = new Observable<string>(subscriber => {
  subscriber.next('🎬 映画: アクション大作'); // 新着動画
  subscriber.next('📺 ドラマ: ネットフリックスオリジナル');
  subscriber.complete(); // 動画配信終了
});

// Observer（視聴者の定義）
const viewer = {
  next: (video: string) => console.log(`視聴中: ${video}`), // 動画を再生
  error: (err: any) => console.error(`エラー: ${err}`),    // 配信エラー
  complete: () => console.log('視聴が完了しました！')       // 視聴完了
};

// Subscriber（Netflix愛好会メンバー）
const subscription = netflixService.subscribe(viewer);

// 視聴を解除する場合
// subscription.unsubscribe();
```

### 出力
```
視聴中: 🎬 映画: アクション大作
視聴中: 📺 ドラマ: ネットフリックスオリジナル
視聴が完了しました！
```

## 退会（unsubscribe）で解約する
もちろん、退会も可能です。以下のコードで、いつでもNetflix愛好会から抜けることができます。
```
subscription.unsubscribe();
console.log('退会しました。もう動画は配信されません！');
```
AI：回答エンジンの基本のキ

# はじめに
エンジニアであれば誰でもGoogleをはじめとした検索エンジンを使っているだろう。
では、回答エンジンは使っているだろうか？
少なくとも私は最近知りましたw

使い始めたばかりですが、プライベートでも仕事でも役立つ「回答エンジン」の基本中の基本について記事にまとめていきます。

# 回答エンジンって何よ？
回答エンジンは、人工知能技術を活用してユーザーの質問に対して適切な回答を生成するシステムです。

回答エンジンは、従来の検索エンジンの概念を一歩進めたものです。
単にウェブリンクを提示するのではなく、ユーザーの質問に対して直接的で具体的な回答を提供します。

例を挙げていきます。

例えば、Googleで検索するとこんな感じになります。
調べたいことを入力し、関係のありそうなサイトをクリックして、記事などを読んで人間が取捨選択します。
![スクリーンショット 2024-12-27 13.01.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/8e853ee9-8279-29bb-cb1d-c230e6f6a6dd.png)

回答エンジンを使った場合はどうなるかというと、以下のように
サマって良い感じにまとめてくれます。
（最近のお気に入りはPerplexity AIなので、こいつを使ったScreenShot）
![スクリーンショット 2024-12-27 13.03.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/41e6536a-5be6-c0f5-31ef-ce39de2d84df.png)

勿論、本当に有用な情報か人間が判断する工程は必要ですが、
AIがまとめてくれるので非常に検索効率は上がります。

# 無料で使える回答エンジンは？
大体有料なのでは？と思っていましたが、まあまあ無料でも使えるようです。

1. ChatGPT (OpenAI)
    * 無料版ではGPT-3.5モデルを使用
    * 会員登録不要で利用可能
    * 日本語対応 

2. Microsoft Copilot (旧Bing AI)
    * 無料でGPT-4を一定回数利用可能
    * 会員登録不要
    * 最新のウェブ情報を反映 

3. Perplexity AI
    * 検索エンジンのように使える
    * 会員登録不要で利用可能 

4. YouChat (You.com)
    * 検索ポータルに組み込まれている
    * 会員登録不要で利用可能
    * 日本語対応（ただし生成能力に課題あり） 

5. Gemini (旧Bard、Google)
    * Googleの最新情報に基づいて回答
    * 会員登録が必要

# 最近のお気に入り
冒頭で記載した通り、"Perplexity AI"をよく使っています。
理由は以下２点。
①引用元を記載してくれること
②他の関係ありそうな質問も参考までに挙げてくれる

↑２つ目が地味に役立っていて、結構曖昧に質問することも多いので
抜けていた観点に気がつくことができたり、新しい"これも知りたいかも!"という欲求を生んでくれる。

これらはログイン時に表示されるチュートリアル的な以下にまとまっているので参考までにペタリ。
![スクリーンショット 2024-12-27 12.59.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/594ded41-5595-87ba-4384-5841c439acde.png)

あと、無料版と有料版の違いは以下
![スクリーンショット 2024-12-27 12.59.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/41bbe652-c179-565f-b80b-74143dd4e723.png)

# 最後に
今後はAIを使用した開発の機会が増えていくと思う。

じゃあ、今まで自分で調べたり痛い目にあった経験が無駄かというと、AIで生成 or 回答してくれた結果は結局は人間が精査する必要があるため、この時に生きてくるはず。
何番煎じだよっていう思うが、結局はAIを何のために使ってどう使うかが重要で、開発にどう活かすことができるか？にかかってくると思う。

この辺りは開発現場で実際に使っていき、AIとの向き合い方について考えていきたい。

以上
AzureでのRAG構成

## RAGとは
**RAG**（Retrieval-Augmented Generation）は、自然言語処理（NLP）の分野で注目されている技術の一つです。RAGは、情報検索（Retrieval）と生成（Generation）を組み合わせたアプローチで、ユーザーのクエリに対してより正確かつ詳細な回答を提供することを目的としています。

## AzureでのRAG構成
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752858/0ba0c082-d297-a2b9-94d6-0ad3deddd48c.png)

### 情報抽出 & インデックス作成

#### OCR処理
Azure Document Intelligenceを使用して、PDFやOfficeファイルなどからテキストを抽出します。
一般的なドキュメント分析には、**prebuilt-layout**モデルを推奨します。理由としては、テーブル情報の取得、文書構造の識別、Markdownへの変換、図の検出などが可能になるためです。

|モデル|テキスト抽出|段落|段落役割|選択マーク|テーブル|キーと値ペア|
|-|-|-|-|-|-|-|
|prebuilt-read|〇|〇|||||
|prebuilt-layout|〇|〇|〇|〇|〇||
|prebuilt-document*|〇|〇|〇|〇|〇|〇|

参照：[ドキュメント処理モデル](https://learn.microsoft.com/ja-jp/azure/ai-services/document-intelligence/model-overview?view=doc-intel-4.0.0)

※最新のプレビューバージョンでは、prebuilt-documentが廃止され、prebuilt-layoutに統合されました。



#### チャンク化
抽出されたテキストを意味のある単位に分割し、後続のベクトル化処理に備えます。

チャンキング方法について、[RAGでの5つのチャンキング戦略](https://medium.com/@anuragmishra_27746/five-levels-of-chunking-strategies-in-rag-notes-from-gregs-video-7b735895694d)を参照してください。

- **固定サイズ分割**：テキストを一定の文字数で分割します。内容や構造は考慮しません
- **再帰的分割**：一連の区切り文字を使用して、テキストを階層的に分割します。初期の分割が望ましいサイズのブロックを生成しない場合、異なる区切り文字を使用して再帰的に分割します
- **ドキュメントベースの分割**：ドキュメントの固有の構造に基づいて分割します。Markdown、Pythonコード、表、画像など、異なる形式のドキュメントに対応した分割方法があります
- **セマンティック分割**：テキストの意味を考慮して分割します。意味的に関連するブロックを一緒に保持します
- **エージェント分割**：大規模言語モデル (LLM) を使用して、コンテキストに基づいてブロックの内容とサイズを決定します。初期のブロックを生成し、その後、LLMベースのエージェントがブロックの調整を行います

#### ベクトル化
Azure OpenAIのEmbeddingモデルを利用して、テキストデータをベクトル化します。
**text-embedding-3-large**は、多言語対応や複雑なタスクで最高の精度を誇るため、精度向上を最優先する場合に最適なモデルです。
コストについて、text-embedding-3-smallはtext-embedding-ada-002の約0.2倍で、text-embedding-3-largeはtext-embedding-ada-002の約1.3倍です。
|モデル|MIRACL*|MTEB*|次元数|
|-|-|-|-|
|text-embedding-ada-002|31.4|61.0|1536|
|text-embedding-3-small|44.0|62.3|1536|
|text-embedding-3-large|54.9|64.6|3072|

参照：[Azure OpenAI Service モデル](https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/models?tabs=python-secure%2Cglobal-standard%2Cstandard-chat-completions#embeddings-models)  

※**MIRACL**：多言語情報検索のための大規模なデータセットです。18の異なる言語にわたる検索タスクを評価するために設計されており、各言語のWikipediaコーパスを使用しています。検索精度や効率性を評価するために使用され、特に多言語環境での情報検索の性能を測定します。
※**MTEB**：テキスト埋め込みモデルの性能を多様なタスクで評価するための大規模なベンチマークです。56のデータセットと8つのタスクにわたり、112の異なる言語でのパフォーマンスを測定します。テキスト埋め込みモデルの品質を評価し、最適なモデルを見つけるためのリーダーボードを提供します。

### 情報検索

#### 検索方法
Azure AI Searchの**ハイブリッドセマンティック検索**を活用することで、クエリとドキュメントの意味的な関連性を評価し、ベクトル検索とキーワード検索の結果を統合します。これにより、ユーザーの意図により近い、関連性の高い検索結果を提供でき、検索精度が向上します。

- 検索方法の比較について、[Azure AI Search: ハイブリッド検索と再ランキングによるベクトル検索の性能向上](https://techcommunity.microsoft.com/blog/azure-ai-services-blog/azure-ai-search-outperforming-vector-search-with-hybrid-retrieval-and-reranking/3929167)を参照してください

- 検索スコアリングワークフローは、[Reciprocal Rank Fusion (RRF) を使用したハイブリッド検索での関連性スコアリング](https://learn.microsoft.com/ja-jp/azure/search/hybrid-search-ranking)を参照してください

#### プロンプト
Azure OpenAI Serviceを利用して、検索クエリの生成と回答の作成を行います。
- 質問から検索クエリを生成する
- 検索結果を基に質問に回答する

プロンプトエンジニアリングのCO-STARフレームワークについて、[CO-STARフレームワーク](https://qiita.com/Simon_Zhang/items/28f4e1c7799fa7fa2635)を参考してください。
テンポとバリュー

元々カードゲームの言葉みたいですが、今年聞いた話や自分の状況にも通ずるところがあったので、メモ。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">「テンポ」というのは、今この瞬間の強さ、利益、勝利のこと。将来よりも、今この瞬間の生存を最優先する概念。</p>&mdash; 深津 貴之 / THE GUILD (@fladdict) <a href="https://twitter.com/fladdict/status/1669504274894823424?ref_src=twsrc%5Etfw">June 16, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">「バリュー」というのは、中長期での強さ、利益、勝利のこと。今を犠牲にしても、最終的に最大得点を目指すような概念。</p>&mdash; 深津 貴之 / THE GUILD (@fladdict) <a href="https://twitter.com/fladdict/status/1669504610707599360?ref_src=twsrc%5Etfw">June 16, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">このバランスは盤面で変化するが…競合よりもギリギリ高いテンポを最小予算で出して、残りのコストをバリューに振るのが基本。<br>短期的にはテンポに全振りしてるやつが強く見えるが、長期では負けない程度にテンポ出しつつ残りはバリューに振るのが強い。テンポで大勝ちする必要はない。</p>&mdash; 深津 貴之 / THE GUILD (@fladdict) <a href="https://twitter.com/fladdict/status/1669506701102551040?ref_src=twsrc%5Etfw">June 16, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>




↓元々のカードゲームの言葉の説明はこちら

https://cogicorgi.com/tempo-value/
NWChemの使い方: 分子軌道のプロット

# nwchemで分子軌道をプロットする方法
* N2分子のHOMOをプロットする
```
start n2
geometry
  n  0 0   0.53879155
  n  0 0  -0.53879155
end
basis;
n library cc-pvdz;
end
scf
vectors  output n2.movecs
end
dplot
  TITLE HOMO
  vectors n2.movecs
   LimitXYZ
 -3.0  3.0  10
 -3.0  3.0  10
 -3.0  3.0  10
  spin total
  orbitals view; 1; 7
  output homo.grd
end
task scf
task dplot
```
* 軌道は`homo.grd`に保存される。`grd`形式はVESTAで描画できる
* X番目の軌道をプロットする場合(この場合はHOMO, X=7)は`orbitals view; 1; X`とする
* よりスムース(細かいグリッド)な軌道を描く場合は`LimitXYZ`の`10`を大きな値にする
【不合格体験記】SAAを受けに行った話

## はじめに
先月、SAAを受験して見事に落ちました。
AWSは普段の業務で触っているし、ふんわり教材を読んで、問題集もちょっと解いたらいけるだろうと高を括っていた私の点数は680点ほど。

惜しいのか惜しくないのかもよくわからない、絶妙な結果に何とも言えない気持ちになってから一ヵ月、
ついに先日SAAを取得してまいりました、、、、。

そんな1か月間、

**私の何がいけないの？？？**

と、メンヘラみたいなメンタルで不合格体験記という名のメモを作成したので、ご覧ください。


## 不合格体験記
　**使ったもの**
    AWSサービスに関するいい感じの教本
    本屋で見つけた演習用問題冊子
    
　**やってみたこと**
    演習問題を何周もする
    解いてわからなかったサービスについて教本で調べる


　**結果**
演習問題も何となく解けるようになったし、何とかなるでしょ！
そう思っていました。

**現実はそんなに甘くなかった。**

いざ試験が始まると、一問目から知らない単語がゴロゴロ、、、、
なにかいてあるんだ？これ。
そんなことを思いながら2択くらいに絞り、そこから勘で1つを選ぶというとんでも戦法に。
もちろん不合格でした。

## 私の何がいけなかったのか
勉強時間もそれなりに取ったし問題集は問題なかったのに、、、なぜ本番は解けなかったのか。

私が原因と感じた理由は、ズバリこの2つでした。

　 **1つ目：情報が古かった**
このテスト、定期的に問題の傾向や正誤まで変わります。
問題集1冊解けるようになっても、その本が刷られたときから時間がたっていると、たくさん出てきた内容が全く登場しない、、、なんてことがありえます。(体験談)
教本を辞書的用途で使用していたのですが、調べても出てこないものがたくさんあって結局知らないまま進む、、、という事態になりになりがちでした。

　 **2つめ：同じ問題を何度も解くことで対策しようとした**
SAAは出題範囲が広い(というか常に増え続けている)ので、100－200問の限定的な出題だけを単純に解けるようにしても、歯が立ちませんでした。テスト勉強だけが得意な民は苦手かも、、、、
サービスそのものがどんな仕組みで、何のために動いているのかをしっかり覚える必要がありました。

## 合格体験記
そんな反省をもとに、私が変えたことは次の2つです。

　 **1つ目：勉強場所をネット上に限定する**
常に最新の情報に入れ替えが行われている媒体に勉強場所を限定。
これで1つ目の原因を対策しました。

　**2つ目：実際のコンソールを触る**
知らないサービスについては実際にコンソールを触って確認し、設問に対するイメージを持てるようにすることで2つ目の原因を打開しました。

このような方法に切り替え60時間ほど勉強したところ、点数は60点ほど上がり、無事SAAを取得することができました。うれしい。

## さいごに
あくまでも一個人の不合格体験記として、同じ思いをした方やこれから受験をする方の糧になればうれしいです。
資格はいいぞ！！！！裏切らない！！！！
OMC233B(1352)

https://onlinemathcontest.com/contests/OMC233/tasks/8288

まず、$72°$ずつ向きを変えるので、$5$回で元の向きに戻ります。
$x$軸の正方向を向いている状態で$1$進むと、$(x,y)=(1,0)$だけ変化します。 $…①$
同様に、
$72°,288°$向きを変えた状態で$1$進むと、それぞれ$(x,y)=(\frac{-1+\sqrt{5}}{4},±\frac{\sqrt{10+2\sqrt{5}}}{4})$変化します。　$…②$
$144°,216°$向きを変えた状態で$1$進むと、それぞれ$(x,y)=(\frac{-1-\sqrt{5}}{4},±\frac{\sqrt{10-2\sqrt{5}}}{4})$変化します。　$…③$

$②$と$③$は$y$軸の正方向と負方向にそれぞれ$1$回ずつ動くと$y=0$になり、これ以外では$y=0$になりません。
なので、$②,③$はそれぞれ$y$軸の正方向と負方向に各$1$回動いた状態を考えることにします。
$y$軸の正方向と負方向に各$1$回動いた場合の変化は、
$②$より、$(x,y)=(\frac{-1+\sqrt{5}}{2},0)$ $…②'$
$③$より、$(x,y)=(\frac{-1-\sqrt{5}}{2},0)$ $…③'$
になります。

$①,②'$だけ、$①,③'$だけ、または$②',③'$だけで$x=0$に戻ることができないので、(証明略)
$①,②',③'$が$1$回ずつ(つまり$0°,72°,144°,216°,288°$方向に各$1$回)動いた場合だけ原点に戻ることができます。

次に、$G=0,5,10,15,20$回の場合に、原点に戻れる可能性があるので、それぞれの組み合わせを考えていきます。

・$G=0,T=25$の場合、
$T_1T_2T_3…T_{25}$しかないので、$S$は$1$通りです。

・$G=5,T=20$の場合、
$T_1T_2T_3…T_{20}$の間に$G$を$5$個置きます。
　$T_1,T_6,T_{11},T_{16}$の前と$T_{20}$の後ろの計$5$箇所に$G$を$1$個置きます。
　$T_2,T_7,T_{12},T_{17}$の前の$4$箇所に$G$を$1$個置きます。
　$T_3,T_8,T_{13},T_{18}$の前の$4$箇所に$G$を$1$個置きます。
　$T_4,T_9,T_{14},T_{19}$の前の$4$箇所に$G$を$1$個置きます。
　$T_5,T_{10},T_{15},T_{20}$の前の$4$箇所に$G$を$1$個置きます。
よって$S$は、${}_5C_1×(_4C_1)^4=5×4^4=1280$通りです。

https://qiita.com/msykkb/items/4d4d930ff0812a39151b

・$G=10,T=15$の場合、
$T_1T_2T_3…T_{15}$の間に$G$を$10$個置きます。
　$T_1,T_6,T_{11}$の前と$T_{15}$の後ろの計$4$箇所に$G$を$2$個置きます。
　$T_2,T_7,T_{12}$の前の$3$箇所に$G$を$2$個置きます。
　$T_3,T_8,T_{13}$の前の$3$箇所に$G$を$2$個置きます。
　$T_4,T_9,T_{14}$の前の$3$箇所に$G$を$2$個置きます。
　$T_5,T_{10},T_{15}$の前の$3$箇所に$G$を$2$個置きます。
よって$S$は、${}_5C_2×(_4C_2)^4=10×6^4=12960$通りです。

・$G=15,T=10$の場合、
$T_1T_2T_3…T_{10}$の間に$G$を$15$個置きます。
　$T_1,T_6$の前と$T_{10}$の後ろの計$3$箇所に$G$を$3$個置きます。
　$T_2,T_7$の前の$2$箇所に$G$を$3$個置きます。
　$T_3,T_8$の前の$2$箇所に$G$を$3$個置きます。
　$T_4,T_9$の前の$2$箇所に$G$を$3$個置きます。
　$T_5,T_{10}$の前の$2$箇所に$G$を$3$個置きます。
よって$S$は、${}_5C_3×(_4C_3)^4=10×4^4=2560$通りです。

・$G=20,T=5$の場合、
$T_1T_2T_3T_4T_5$の間に$G$を$20$個置きます。
　$T_1$の前と$T_5$の後ろの$2$箇所に$G$を$4$個置きます。
　$T_2$の前に$G$を$4$個置きます。
　$T_3$の前に$G$を$4$個置きます。
　$T_4$の前に$G$を$4$個置きます。
　$T_5$の前に$G$を$4$個置きます。
よって$S$は、${}_5C_4×(_4C_4)^4=5×1^4=5$通りです。

したがって、解は$1+1280+12960+2560+5=16806$通りになります。
c#で、なでしこ その22

# 概要
c#で、なでしこ、やってみた。
c#な、なでしこ、見つけたので、msbuildでコンパイルしてみた。
練習問題やってみた。

# 練習問題
AtCoderを解け。
N個の整数値を受け取り、一度の操作ですべての数を2で割る。割り切れなくなるまで割っていった時、何回割ることが出来るか？


# サンプルコード

```

「>」と入力。
それを指示に代入。
要素数1は指示の整数変換
「>」と入力。
それを指示に代入。
物は指示を「 」で区切る
答は100
要素数１は要素数１から１を引く
枠を0から要素数1まで繰り返す
　皿は物[枠]を整数変換
　操作数は0
　OKの間
　　もし、皿が２より小さいならば
　　　抜ける
　　違えば
　　　皿は皿を2で割る
　　　操作数は操作数に１を足す
　　皿を２で割った余り
　　もし、それが１に等しいならば
　　　抜ける
　もし、操作数が答より小さいならば
　　答は操作数
答を表示する


```

# 実行結果

```
>cnako2 at3.nako
>
3
>
8 12 40
2
```

以上。
【postgreSQL】テーブルのカラム情報を取得

```sql:標準的な記述
SELECT 
	column_name, 
    data_type, 
    character_maximum_length, 
    numeric_precision, 
    numeric_scale
FROM information_schema.columns
WHERE table_name = 'MY_TABLE';
```


```sql:文字列長と精度を見やすく整形
SELECT 
    column_name, 
    CASE 
        WHEN data_type = 'character varying' THEN data_type || '(' || character_maximum_length || ')'
        WHEN data_type = 'numeric' THEN data_type || '(' || numeric_precision || ',' || numeric_scale || ')'
        ELSE data_type
    END AS formatted_data_type
FROM 
    information_schema.columns
WHERE 
    table_name = 'MY_TABLE'
ORDER BY 
    column_name ASC;

```
Material3を読んでみた②【Accessibility】Writing and text


はい！前回に引き続き[Material Design](https://m3.material.io)のAccessibilityの続きです！
あまりに長文になってきたので前半で切っていたのですが、今回は後半のテキストに関する部分を読んでいきます。

※画像はすべてMaterial Designのものを引用

## Writing and text
### 【ベストプラクティス】アクセシビリティテキスト
- アクセシビリティテキストはスクリーンリーダーで使用されるテキスト

#### 隣接するテキスト
- 画像内や周辺のテキストは画像に関する重要な情報を提示する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3811577/6c325619-e6dd-7f00-f170-762adda9b831.png)


#### キャプション
- 画像の下に表示されるテキスト
- 画像に関する文脈情報を説明するもの




#### 画像に埋め込まれたテキスト
- スクリーンリーダーは画像に埋め込まれたテキストを読めない
- 画像にテキストとして重要な情報を埋め込む場合はaltテキストに重要な情報を含む



#### 代替テキスト（altテキスト）
- 視覚的なUIをテキストベースのUIに変換するのに役立つ
- 画像を見ることができないユーザーのために画像を説明するコード内の短いラベル（最大125文字）
- 画像のみを対象とするため「～の画像などは不要」
- 画像の読み込み失敗時にも表示されるため、目の見えるユーザーにも有効


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3811577/ac41d0d5-6f3a-311f-bcf8-5a2f0747102d.png)


### 【ベストプラクティス】テキストカラー
#### 必須要素と必須でない要素
- 重要な情報は大きな文字で3:1、小さな文字で4.5:1のカラーコンテキスト比にすること




### 【テキストの切り捨て】
#### 背景
- テキストサイズの拡大、テキスト間のスペーシング拡大、翻訳による文字数増加でコンテンツが消失しないようにテキストの切り捨てを考慮したデザインを行うべき
    - 例：テキストの折り返し、コンポーネントの高さや幅の増加、楕円やホバーリングによる切り捨て

#### 必須条件
- ユーザーがタイプ設定を変更したときにコンテンツの理解しやすさ、機能性が損なわれないように

#### テキストの折り返し
- 折り返されたテキストはテキストコンテナの高さを増加させる
- 必要に応じて折り返しが必要




#### 文字の幅と高さ
- コンポーネントによってはテキストに合わせて高さや幅を調整

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3811577/b8b06d02-0a87-1efe-8aa4-0775bcd77431.png)

#### ホバーまたはリンクによる省略
- 切り捨てられたテキストがリンクなどで利用可能な場合は省略記号で置き換えられる



### 【テキストのリサイズ】
#### 背景
- 視力が弱い人や大きなテキストを好む人向けにUIのテキストサイズを拡張できる必要がある
    - 多くの場合OSやアプリ内の設定で調整
    - UIは最低200%の文字拡大をサポートする必要がある
- テキストが変更されてもほとんどのコンポーネントは同じ動作をする
- テキストの行と高さは比例して拡大され、スケール値が乗算される
    - パディング、コンポーネント内の要素間の間隔はデフォルトの1倍で一定


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3811577/5f7631dd-7d79-a639-88ae-bc279b41b12b.png)


- OSによってリサイズが制御されない場合は1.5倍や2倍といった乗数を提供してユーザーが拡大できるようにする
    - 少数を含む値になることもあるが現実的な手法
    - 乗数でフォントサイズを計算する場合はデフォルトのサイズにスケール値をかける


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3811577/9446d783-dfb9-bf1a-1dbc-463b9735f887.png)


- プログレスバーやチェックボックスなどテキストを含まないコンポーネントはテキストサイズの変更の影響を受けない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3811577/3c0ff33a-3a82-69ea-d965-ea131711c1d9.png)


#### メソッド
- コンテナサイズの拡大、リフロー、スクロールの有効化などで一般的なリサイズの問題を回避できる
    - リフロー：コンポーネントが過度に長くなる場合はレイアウトのリフローを検討
        - コンポーネントを横並びに固定せず、互いを重ねるなど
    - スクロール：水平より垂直方向が望ましい
        - スクロールの方向は一方向に固定
    - タッチ、ホールドのツールチップを利用して拡大ラベルを提供
        - アプリバーやナビゲーションバー、ナビゲーションレール、タブ（画面上部に固定されスクロールしても画面外に移動しないもの）、といった文字数制限が厳格なスペースのテキストでは、ツールチップを追加して拡大コンテンツを表示


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3811577/75f0fa14-86f5-e6e5-2caa-177c1906b5da.png)
WOFF 勉強会レポート

# 勉強会レポート

はじめまして!!ノベルワークス入社2年目のそうまです!!

今回はサイボウズさん主催のアライアンス製品勉強会に参加して、LINEWORKSのWOFFについて学んできたのでレポートとして残そうと思います!!

# はじめに WOFF とは ？

LINEWORKSが提供しているWeb アプリのプラットフォームで、LINEWOKRS上で動作するミニアプリを開発する事が出来る。

## Botとの違い

同じく連携アプリを開発出来る機能としてBotが存在するが、Botは1問1答でのやり取りで情報を入力するのに対して、WOFFは入力フォームで纏めて必要な情報を入力出来る点が大きな差別点でありメリットとして挙げられる。

https://developers.worksmobile.com/jp/docs/woff-guide

# kintoneとの連携

## メリット

### ツールの壁をクリア

:::note info
ツールの壁
新しいツールが受け入れられず、慣れ親しんだやり方からの変化への抵抗
:::
    

ビジネスコミュニケーションツールは、社会人が日常的に最も利用するアプリの一つであり、出先でも頻繁に使用される。このツールをkintoneと連携し、入力フォームとして活用して業務データを蓄積する仕組みを構築すれば、kintoneを出先でも手軽に運用できるためツールの壁をクリアする事が出来る。

### コストの壁をクリア

:::note info
コストの壁
全従業員にkintoneライセンスを付与するにはコストが掛かりすぎる
:::

全従業員がkintoneのライセンスを所持していなくても、Lineworksアカウントがあれば連携可能であるので、kintone導入のコストを抑えること出来る。

## 利用事例

### 関西クリアセンター株式会社

ITツールに対して苦手意識を持つ従業員が多かったが、LINEWOKRSをコミュニケーションツールとして導入してみたところ社内に浸透し、LINEWORKSなら使えるとなったため、さまざまな業務処理をLINEWORKS上で行えるようにしたいとなった。

産業廃棄物の収集運搬をする上で配車業務が必要であるが、その配車のフローが複雑であるため、WOFF経由でkintoneに配車依頼をしてスケジュールを作成、配車業務が完了すると「LINEWOKRS」に通知されるような仕組みを導入し、業務の効率化に成功している。

引用 : https://line-works.com/cases/kansai-cc/

# 感想

コミュニケーションツール全般でKintoneとの連携は需要がありそうで、その中でもミニアプリを開発出来るプラットフォーム(WOFF)を持つLINEWORKSは特に効率化を図るツールとして有用であると感じました。
マウスカーソルが小さいよ i3 

まず ~に
```.Xresources```
が有るか調べる。
無いなら作るし、有れば一番最終行に以下を追加する。
```.Xresources
Xcursor.size: 64
```

---
<h4>以下　余談</h4>
私はコレ、DebianをInstallしてやったので、
Archなら何かインストールが必要かも。

i3などタイル型だと小さいノートPCでの利用が
多分に予想されるのに、カーソルの何と小さいことか。
~/.config/i3/configで設定出来たら良いのにね。
不親切ね。
それにしても欧米人は細かい文字を読むのに慣れてるんだろうな。
漢字は潰れて仕舞うからなー
【哲学のすゝめ】面談対策とは何か？己との対話

#### 本記事の読者ターゲット層

・未経験者
・駆け出しエンジニア
・これからエンジニアを目指そうと思っている方

### SESって不思議
私は1年半前に保育士からエンジニアに転職しました。
30歳からの転職は勇気のいるものでしたが、踏み出して良かったと思えます。

エンジニアにもいろいろな働き方があって、SESなる言葉があります。多分明確な定義は存在せず、SES企業に所属するエンジニアは「準委任契約で各現場の各案件に参画し、自分のできることを果たす人たち」くらいのイメージで転職しましたが、まあ1年半経っても大体そんなイメージです。

このSES業界が特殊だなと感じています。
ITって専門職だと思うんですよ、専門用語ばっかりで、各分野の資格があって、求められるスキルにもかなり段階があって。
にも関わらず、無資格未経験から参入できてしまうんですよね。
こんな業界ってかなり少ないのでは？と思います。

これは僕のように一念発起して転職した人にもチャンスがあるというメリットでもあり、
反面、
現場に参画してからわからないことだらけでダウンしてしまいかねないデメリットもあるのでは無いかと思っています。

これからIT転職を考える方はこのデメリットを抑えるためにも、研修が充実した会社を焦点に当てるのはいいのかなと思いますね。


## 案件面談

前置きが長くなりましたが
とにかく今はITの人材不足！
かなりいろいろな案件が世の中にはあって、未経験エンジニアにも何かしらのお仕事があって、日々のごはんを食べることができます。お仕事とってきてくれる営業さんありがとうごちそうさま😋

そして、経験の浅いエンジニアさんと話しているとよく話題になるのが掲題、『案件面談』についてです

各案件に参画する前に、その案件にとってそのエンジニアがマッチしているか面談があり、マッチしていると認められればオファーの声がかかります。
いや、就職面接か？？？
僕はそう思いました。
転職するわけでもないのに、何回も就職面接せなあかんのか？
僕はそう思いました。

まあいうて僕も何度か案件面談を潜り抜けてきました。
声を大にして言いたい。
案件面談こわくないよ！と。


## 面談対策とは何か？
案件面談こわいよー！やだよー！という人々の声に応えて面談対策というのが企業の研修にあったりします。僕はやったことないですが。これ何するんですかね？
皆さんの経験したおもしろかった面談対策エピソード募集。


なので、ここまで読んでくれた方々に我流の面談対策を伝授したいと思います。

## 面談対策はマインドの切り替え
面談を怖がる人々の共通点は、立場の勘違いです。

案件面談は、ビジネスです。
面談担当者は鬼ではありません。
面談担当者側も、力を貸してくれるエンジニアを探しています。

そして力を貸すエンジニアがあなたがたです。

もちろん、面談担当者は「あなたうちで本当にやっていけるの？？？」という疑いの眼を向けてきます。

ですが、だからと言って面談担当者が上下関係で上ということもないのではないかと私は思っています。

我々は力を貸す側として、『対等』だというマインドを持ちましょう。

## 己を知る
面談対策なのかわかりませんが、自身のスキルや特性を自身で把握しておくことは大切です。
前置きでも述べましたが、案件は幅広くあり、未経験でも参画できるものは多いですが、ゆえに
面談で自身のことをしっかり伝えられないと、力はあるのにオファーが来ないこともあれば、自身には備わっていないスキルを求められて厳しい思いをすることもあると聞きます。

面談は己を知ってもらう場です。
対等に。
面談担当者にオファーしていただくというのは不変の仕組みではありますが、自身からミスマッチしている案件に参画しないためのアピールの場なのです。
対等に。

結果（オファーの有無）は、マッチするかしないか、それだけでしかないのです。

オファーが来なかったとしてもそれを過度に悲観することはありません。
ミスマッチだっただけです。
あなたが否定されたわけではない。
案件側もあなたを迎え入れる器が無かったんですね。

スキル不足を嘆いても、スキルは積み重ねの賜物で一朝一夕に獲得できるものではありません。
目の前の面談対策においてスキルに焦点を合わせるのはあまり適切でないと考えます。
（長期的に考えるなら当然スキルアップは大切ですが）

目の前の面談において大切なのは、落ち着いて相手の話を聞き、自分の言葉で答える（応える）ことです。
相手が望んでいることがコミュニケーション能力なのに、黙々と作業に集中できることをアピールしてもミスマッチです。
相手が望んでいることが独立した課題解決能力なのに、協調性の高さをアピールしてもミスマッチです。
集中力も協調性も魅力的な力ですが、適切にアピールできないと宝の持ち腐れです。

相手（案件）に応じたアピールを心掛けることが肝要なのかなと感じています。
かといって背伸びし過ぎたアピールをしすぎると、それもミスマッチで自分がツラくなるでしょう。
多少の背伸びは成長のために必要でしょうが、それが自分の頑張れる範囲の背伸びを越えてしまうと倒れてしまうと思います。

そのため、『己を知る』必要があるんですね。
ミスマッチした案件に参画しないため、自分を守るため、自分を知りましょう。


自己というのは自分で客観的に見ることができないという点で、自己こそが一番の他人です。
他人のほうが社会の中での”私”（社会から認識される私の像）を理解しているのです。
先ほどから何度も述べている『己を知る』は、普通に生きているだけでは無理難題なのです。
それに取り組むきっかけをくれるのが「案件面談」であり、手法が「面談対策」なのです。
エンジニアは哲学者なのです。
さあ、哲学をしよう！


## あとがき
早くスキルだけで「君が欲しい！」って言われるエンジニアになりたいものです。
人間性で戦うしかない未経験エンジニアこそ人間性を否定されたみたいで落ち込んでしまうのも致し方ないのかもしれませんね。
僕はオファーされなかったらこう思うようにしてます。
「あいつ見る目ないな！」
AzureのVMを定期的に再起動する方法

こんにちは、堀井です。

今回はAzureのVMを定期的に再起動する方法を書いていこうと思います。

:::note warn
本記事はAzure上にVMを作成済みであることを前提に進めていきます。
:::

# 全体の流れ
1. Automation アカウントの作成
1. ロールの割り当て
1. Runbook の作成
1. Runbook のスケジュール設定


# Automation アカウントの作成
まずはAutomation アカウントを作成します。
こちらは再起動処理を定期実行するのに使用します。

1. Azureポータルから「Automation」を検索して「作成」を押す
1. 画像の通りに進めていき、作成する

![a-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/4e5fa641-6aeb-762e-624a-1151e59fb65a.png)

![a-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/9b4b83c3-a125-c61b-fc4e-f498cb71f0b5.png)

![a-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/c02cd6ff-0da2-8763-ab5a-f797b5c97a1e.png)


# Azure ロールの割り当て
次にロールの割り当てを行います。

1. 先ほど作成したAutomationアカウントのページを開き、左メニューの「アカウント設定→ID」を選択して「Azure ロールの割り当て」を選択
![r-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/7b328026-9769-0282-a944-64c81753d70c.png)
1. 「ロール割り当ての追加（プレビュー）」を選択
![r-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/6a8bfd06-be70-4e6a-6ad2-b5e6d6d2a6f9.png)
1. 必要項目を画像の通り入力や選択をして「保存」
サブスクリプションにはVMを作成したサブスクリプションを選択
![r-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/3e5b39c8-5226-5e83-99ef-1ec2d5ae7d1c.png)


# Runbook の作成
次にRunbookの作成を行います。
ここで実際の再起動処理を記述します。

1. 先ほど作成したAutomationアカウントのページを開き、左メニューの「プロセスオートメーション→Runbook」を選択して「Runbook の作成」を選択
![rb-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/4ba77fd5-48e3-efd2-71e8-b0ce7e864cc1.png)
1. 画像の通り必要項目を入力や選択をして「確認及び作成」→「作成」
名前には適当な名前を入力
![rb-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/256f17cb-543a-52e4-5c30-182fd9977ff3.png)
1. 先ほど作成したRunbookのページを開き、「編集→ポータルで編集」を選択
![rb-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/a634bea8-4f06-6971-f492-0fad8fc75f36.png)
1. 以下コードを記述して保存して公開
```
workflow RestartVM
{
    InlineScript
    {
        Connect-AzAccount -Identity
        Restart-AzVM -ResourceGroupName "VMが属しているリソースグループ名" -Name "VM名"
    }
}
```


# Runbook のスケジュール設定
次にスケジュール設定を行います。

1. 先ほど作成したRunbookのページを開き、「左メニューの「リソース→スケジュール」を選択して「スケジュールの追加」を選択
![s-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/70d6969a-5712-1b01-1288-b920eb880fe6.png)
1. 「スケジュール」を選択
![s-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/d97d25de-50d3-7b64-b51c-cca38d1b8115.png)
1. スケジュールの追加を選択
![s-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/b1d80851-1e3b-cf52-adbb-0bf1e0069575.png)
1. 必要事項を適当に入力して「作成」を選択
![s-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/67b83d78-513e-6a50-c719-49c25ca9fd96.png)


これで後は設定したスケジュール通りに再起動が実行されるはずです。

# 最後に
今回はAzureのVMを定期的に再起動する方法を書いていきました。
定期的に起動する方法は簡単に見つかったのですが、再起動する方法が見つからなかったので、今回残してこうと思いました。
この記事が誰かの役に立てば幸いです。

以上、堀井でした。
GitをWindowsPCやMacbookにインストールする方法

Gitをインストールする： Gitがインストールされていない場合、次の手順でインストールできます。

Gitをhttps://git-scm.com/download/winからダウンロードしてインストールしてください。
インストール中に、「PATH」設定（Gitをコマンドラインで使えるようにするオプション）を有効にすることを確認してください。これにより、ターミナルからgitコマンドを直接実行できるようになります。
インストール後の確認： Gitをインストールした後、もう一度ターミナルを開き、以下のコマンドでGitのバージョンを確認してください：

bash
Copy code
git --version
これでGitのバージョンが表示されれば、Gitが正常にインストールされ、VSCodeで使えるようになっています。
qemu-system-aarch64でインターネット接続

自分用

aarch64版のqemuはx86_64版のような
userモードネットワークが使用出来ない。
```
-netdev tap,ifname=tap0,script=no,downscript=no,id=my_net_id -device driver=virtio-net,netdev=my_net_id
```
でネットワークデバイスを追加して実行する

qemu起動
```
sudo /home/tyano/workspace/oss/build_qemu/qemu-system-aarch64 -M virt -cpu cortex-a710 -m 2048 -kernel output/images/Image -device virtio-gpu,id="display1" -display sdl,gl=on -append "root=/dev/vda console=ttyS0" -drive if=pflash,format=raw,file=efi.img,readonly=on -drive if=pflash,format=raw,file=varstore.img -drive file=./output/images/rootfs.ext2,if=virtio,format=raw -netdev tap,ifname=tap0,script=no,downscript=no,id=my_net_id -device driver=virtio-net,netdev=my_net_id -device qemu-xhci -serial stdio -device usb-mouse -device usb-kbd -device usb-tablet -monitor telnet::33333,server,nowait
```

tap0はqemu起動時に作成される。

ホスト側設定
```
sudo ip link add name br0 type bridge
sudo ip link set dev enp1s0 master br0
sudo ip link set dev tap0 master br0
sudo ip link set dev br0 up 
sudo ip link set dev enp1s0 up
sudo ip link set dev tap0 up
sudo ip a del 192.168.2.131/24 dev enp1s0
sudo ip a add 192.168.2.131/24 dev br0
```


## qemu再起動時(ホスト設定を先にやった場合)
qemu側はip設定、ホスト側はtap0の再設定が必要

qemu側
```
ip a add 192.168.2.200/24 dev eth0
ip r add default dev eth0
```

ホスト側
```
sudo ip link set dev tap0 up
sudo ip link set dev tap0 master br0
```

qemu内でipは自動設定される

# Wifiしかなくてブリッジ接続出来ない場合

tapを作って
```
sudo ip tuntap add dev tap0 mode tap
sudo ip link set tap0 up
```

qemuの起動オプションに以下を追加
`-netdev tap,id=net0,ifname=tap0,script=no,downscript=no -device virtio-net-pci,netdev=net0`

ホスト側NAT転送
```
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -o wlp3s0 -j MASQUERADE
sudo iptables -A FORWARD -i wlp3s0 -o tap0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i tap0 -o wlp3s0 -j ACCEPT
sudo ip addr add 192.168.100.1/24 dev tap0
```

ゲスト
```
ip addr add 192.168.100.2/24 dev eth0
ip link set eth0 up
ip route add default via 192.168.100.1
```
準同型暗号ライブラリphantom-fheとSEALを比較してみた

### 0. はじめに
本記事では2つの準同型暗号ライブラリ
- phantom-fhe
- SEAL

これらのベンチマークを自作・実行してライブラリの比較をしていきたいと思います。使用するスキームは**CKKS**です。

### 1. 環境
今回実験する環境は以下の通りです。

なお、ライブラリは2024年10月時点のものを使用しています。
|OS|Ubuntu 22.04.4 LTS|
|:--:|:--:|
|CPU|Intel(R) Core(TM) i5-9500 CPU @ 3.00GHz|
|GPU|NVIDIA GeForce RTX 3090 Ti|
|RAM|32GB|
|コンパイラ|g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 <br> nvcc(Cuda compilation tools, release 12.4, V12.4.131)|

CKKSを使用するにあたって設定したパラメータは以下の通りです。

|poly_modulus_degree|8192 ($2^{13}$)|
|:--:|:--:|
|scale|$2^{40}$|
|coeff_modulus|{60, 40, 60}|

### 2. 実行時間の比較
では本題の比較として、実行時間を見てみましょう。

|operation|SEAL [μs]|phantom-fhe [μs]|
|:--:|:--:|:--:|
|encryption<br>w/secret key|1051.7|241.3|
|encryption<br>w/public key|2596|221.5|
|decryption|107.1|5.1|
|addition|25.8|3.2|
|multiplication|211.0|7.1|
|relinearization|1304.8|39.4|
|rescale|364.1|21.6|
|rotation|1335.7|48.9|

SEALも十分早いですがGPUを使って計算しているというのもあり、phantom-fheの方が圧倒的に早いという結果になりました。

### 3. 計算精度の比較
実行時間ではphantom-fheの方が優れていました。では、計算精度はどうでしょうか？確認してみましょう。

CKKSの入力値は複素数となっているので、どのようにして精度を求めるかを考える必要があります。実部や虚部それぞれで比較してもいいですが、今回は**絶対値の相対誤差**を用いて比較しました。

|operation|SEAL|phantom-fhe|
|:--:|:--:|:--:|
|encode|$10^{-13}$|$10^{-6}$|
|encryption|$10^{-11}$|$10^{-4}$|
|addition|$10^{-13}$|$10^{-5}$|
|multiplication|$10^{-10}$|$10^{-4}$|
|relinearization|$10^{-10}$|$10^{-4}$|
|rescale|$10^{-9}$|$10^{-4}$|

これを見るとSEALに比べてphantom-fheは精度がかなり低くなってしまうようです。

精度から見て単精度の浮動小数点数を使っているのかと思いましたが、そういうわけではなさそうでした。encodeの時点で精度が低いので、原因はおそらくencodeでしょう。

CKKSのencodeでは**高速フーリエ変換(FFT**)を用います。FFTで用いる値(1のn乗根)は複素数のため、2進数で計算するコンピュータではどうしても精度は低下してしまいます。
phantom-fheではFFT、SEALではFFTの代わりに**数論変換(NTT**)を使っているようなのでその点の違いも考えられそうです。

### 4. まとめ
今回は準同型暗号ライブラリのSEALとphantom-fheのベンチマークを作成し、比較してみました。

その結果、実行時間の点ではphantom-fhe、計算精度の点ではSEALの方が優れていることが分かりました。

phantom-fheの計算精度が低い原因については今後も調べていくので何か分かったら報告します。
情報処理技術者試験の４区分(FE,AP,SC,NW)に1年半くらいで合格した話（Part1_基本情報技術者試験編）

## 記事を書いた理由

* なんかアウトプットしたいな！
* 試験ひと段落したし、記事書いてみるか！
* まぁまだAP合格発表してないけど、受かってるっしょで書き始めました！（＾q＾）
* この記事が書き終わっているころには、多分合格発表終わってる。そんな気がする。


## プロフィール
* 国家公務員一般職(大卒区分、文系)
* 入社して12年目(H25採用)
* 7年くらいは事務仕事
* R2年くらいからフォレンジックの領域に従事し、現在5年目
* プログラミング歴８年くらい？
    (業務上、VBA触って、その後はちょこちょこpython触ってました。プライベートではCTFとかでちょこちょこ触る程度ですが。。。結局ちょこちょこ触るくらいしかできません( ﾟДﾟ))
* セキュリティの勉強のために、TryHackMeやっていました（過去形。現在は子育てに全振りしているのでお休み中(/・ω・)/）
* CTFの勉強のために、最近はpwn.collegeをやっています（CTFも前述の理由によ(ry...）


    


## きっかけ
* 周りの人に触発されてが一番大きな理由です
* 情報処理系資格を受験し続けている努力家の友人がいたり、留学するためIELTSに挑戦し続けている後輩がいたり、終業後、大卒認定資格を取るためにリモートで授業受けている30代後半の先輩がいたりとか、とにかく周りに何かに挑戦している人が多かった！
* その人たちのおかげで挑戦意欲が湧いたので、その人たちにこの場を借りてお礼を申し上げますm(_　_)m
* あと、スキルアップもかねて受けました！


## 受験時期について
#### 受験の順番
2023.07　基本情報技術者試験(FE)
2023.10　情報処理安全確保支援士(SC)
2024.04　ネットワークスペシャリスト(NW)
2024.10　応用情報技術者試験(AP)

#### なぜこの順番なのか？

興味のある分野から受けたらこうなった、ただそれだけです笑
でも、この順番は自分自身の中では重要かもしれないですね。

以下、勉強方法等についてお話しします。
この記事を読んでいる誰かのお役に立てれば幸いです。


## 基本情報技術者試験


### 勉強期間
2023年6月1日から7月6日（36日間）


### 勉強に使用した教材、勉強方法等
従前は午前と午後だったのが、科目Aと科目Bという分類となっています。
***
* 科目A
    科目Aは知識問題ですね。
    科目Aの対策は、皆さん御用達の[`過去問道場`](https://www.fe-siken.com/fekakomon.php)を利用させていただきました。
    **基本は通勤時間やお昼休みの時間、ちょっとした隙間時間に過去問道場を開いては、問題を解くということを意識して<INS>習慣づけ</INS>しました。**
(個人的には今後の試験を受けるための基盤をここで築くことができたのかなと思います。)
***
* 科目B
科目B対策は、こちらのテキストを利用しました。(多分私が買ったのは第3版ですが最新版載せときます)

    [`情報処理教科書 出るとこだけ！基本情報技術者［科目B］第4版`](https://www.amazon.co.jp/%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%95%99%E7%A7%91%E6%9B%B8-%E5%87%BA%E3%82%8B%E3%81%A8%E3%81%93%E3%81%A0%E3%81%91%EF%BC%81%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85%EF%BC%BB%E7%A7%91%E7%9B%AEB%EF%BC%BD%E7%AC%AC4%E7%89%88-%E6%A9%8B%E6%9C%AC-%E7%A5%90%E5%8F%B2-ebook/dp/B0CGJ8M9N9/358-1600558-4584564?pd_rd_w=vGeAb&content-id=amzn1.sym.d686209d-8edb-4501-90de-4e255f5b32cf&pf_rd_p=d686209d-8edb-4501-90de-4e255f5b32cf&pf_rd_r=CYMYY8V6T03SZQJPDCA8&pd_rd_wg=MVxWx&pd_rd_r=3942547c-5f37-49bd-bb06-e13ba32f20b2&pd_rd_i=B0CGJ8M9N9&psc=1)

    科目Bのプログラミング問題は、愚直にトレースをする必要があるのですが、やり方が参考になりました。
    プログラミングができる人は不要かなと思います。
    公開されているサンプル問題も参考にして、解けるようならそこまで気負わなくていいと思います。
    セキュリティ問題については、多少セキュリティの素養を持ち合わせていたので、何とか対処できたように思います。（ほぼノー勉です。）



## 結果
科目A　755点
科目B　810点

で合格でした。
CBT形式の試験ですので、試験終了後に合否が画面に出ます。
途中でシャットアウト！されるCISSP試験と比べると最後まで見守ってくれるので優しく感じますね。

合格日は2023年7月6日でした。



## 次の試験に向けての余談
一発合格したら、情報処理安全確保支援士受けようかなとふわっと考えており実行に移すのですが、ここから10月の試験までは,
* テキストムズイし多いわ　なんでやねん
* 午後問なんじゃこりゃ
* やっべー　時間ねー　そして全然寝てないからつれーわー
* うーん、どうしよorz

とか考えていました。

**しかも！**
妻が妊娠していたので、勉強時間はかなり限られていました。
というか、大多数の世の奥様が言うでしょう…

**＿人人人人人人人人人人人人人人人人＿**
**＞　そんなときに資格試験受けるな　＜**
**￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣**

$\tiny{…本当にすみません}\$

**そして、妻よ。ありがとう。**
**温かく𠮟咤激励してくれた妻には感謝しかありません。(^q^)**

***

前述しましたが、勉強を習慣づけすることは大事だなと思いました。
最後にまとめて書くかもしれませんが、今回挑戦して学びがあった部分の一つです。
若い頃から優秀な方は、おそらく若い頃に何かを習慣づけするための工夫をしているのだろうと思いました。
習慣づけするとやらない日が少なくなって、結果的に無駄な時間を過ごすことが少なくなるのだろうと思います（小並感）。

というわけで~~衝撃の~~[Part2_情報処理安全確保支援士_勉強編](https://qiita.com/nelly7k/items/13cacf062834ab373694)へ続く。
【HTML CSS】CSSとたたかう　空文字編


帳票系を触っていると、空欄の対応に苦戦することがあるので、メモ。
マスタッシュ構文はPHP想定だが、他の言語も雰囲気は同じ。


## デフォルト

```html
{{ $value = "変動する値" }}

<div style="padding: 8px;">
    <div>ヘッダ要素</div>
    <div>{{ $value }}</div>
    <div>フッダ要素</div>
</div>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/ece42932-8108-3817-6a8a-c2d827b35d5f.png)

このようなレイアウトの場合、変動する値が空欄だと、高さが0になり潰れてしまう。
潰れる＝レイアウトが崩れる＝:scream:  

```html
{{ $value = "" }}

<div style="padding: 8px;">
    <div>ヘッダ要素</div>
    <div>{{ $value }}</div>
    <div>フッダ要素</div>
</div>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/081104ff-a208-c089-e7c0-7437e49d6225.png)



## 対策(1) CSS の height を使用する

BOXの高さを固定してしまう作戦。
[line-height](https://developer.mozilla.org/ja/docs/Web/CSS/line-height) では、文字が無いときに高さが0となってしまうので注意。

```html
{{ $value = "" }}

<div style="padding: 8px;">
    <div>ヘッダ要素</div>
    <div style="height: 1rem;">
        {{ $value }}
    </div>
    <div>フッダ要素</div>
</div>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/2f8fe082-bb98-a60c-556a-757cf8876692.png)

`rem` など相対単位を使用すると、良い感じに一文字分にできる。
複数行の場合は `min-height` でも良いかもしれない。


## 対策(2) if で全角スペースを挿入する

HTML 的にはレビュー指摘が来るような内容だが、一番簡単に実現できる。
文字が無くなるから高さが0になるので、見えない文字を追加する。
`&emsp;` など、エスケープ文字を使うのも良い。

PHP なら [mb_strlen()](https://www.php.net/manual/ja/function.mb-strlen.php)、 JS なら [String: length](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/length) を使うと良い。

```
{{ $value = ""; }}

<div style="padding: 8px;">
    <div>ヘッダ要素</div>
    <div>{{ mb_str($value) ? $value : "　" }}</div>
    <div>フッダ要素</div>
</div>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/46ab28fb-cbbb-f07e-4796-9cf5efc5157d.png)

文字サイズの変動にも耐えうるので、意外と賢いやり方な気がする。
Nginx : アクセス制限

# はじめに
Nginxはwebサーバですので、当然アクセス可能なIPアドレスを制限することができます。クラウドを使っている人たちはAGWなどを使っているかもしれませんが、アプリケーション単位でも制限できますので紹介します。

# 実装方法
実装方法は簡単で、default.confに以下の設定を追加すればよいです。
default.conf
```
location / {
    allow xxx.xxx.xxx.xxx;
    deny  all;
}
```

大量の設定が必要な場合は以下のようにすればよいです。
default.conf
```
location / {
    include allow-list;
}
```

allow-list
```
allow xxx.xxx.xxx.xxx;
allow xxx.xxx.xxx.xxx;
allow xxx.xxx.xxx.xxx;
allow xxx.xxx.xxx.xxx;
allow xxx.xxx.xxx.xxx;
allow xxx.xxx.xxx.xxx;

deny all;
```

# 参考文献
[Nginx : 公式ドキュメント](https://nginx.org/en/docs/http/ngx_http_access_module.html)
Ubuntu22.04のPythonをアップデートしたい&poetryをインストールしたい

## Ubuntuのpython古くない？
Ubuntu 22.04LTSのpythonが古いので、アップデートしたいなと思って調べてみたのですが、きれいにまとまっている記事が無かったので、まとめてみました。
また、poetryをライブラリ管理に利用しているので、併せてそのインストール手順もまとめました。

## pythonアップデート手順
以下の流れで実行してみて下さい
```:現在のversion確認
python3 --version
```
```:ホームディレクトリに移動
cd ~
```
```:ビルド環境構築
sudo apt update; sudo apt install build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev curl \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
```
```:ソースを取得
wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz
```
```:ソースから解凍
tar -xzvf Python-3.12.0.tgz 
```
```:ディレクトリを移動
cd Python-3.12.0/
```
```:ビルドを実行1
./configure
```
```:ビルドを実行2
make
```
```:ビルドを実行3
sudo make install
```
```:versionアップの確認
python3 --version
# 3.12.0になっていること
# ならない場合は再起動（sudo reboot）。
もしくは下の手順を行う
```
```:再起動手順
sudo reboot now
```
```:再起動を行わない手順1
whereis python3.12
# /usr/bin/python3.12 or /usr/local/bin/python3.12
```
```:再起動を行わない手順2
sudo update-alternatives --install /usr/bin/python python /usr/local/bin/python3.12 1
```
```:再起動を行わない手順3
sudo update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.12 1
```

最後に
```:pythonのバージョン確認
python3 --version
# Python 3.12.0と表示されること
```

## Poetryのインストール
こちらは参考です
インストール方法は公式ページに詳しく乗っています
https://python-poetry.org/docs/#installing-with-the-official-installer


参考手順は以下です。
python3.12を指定してインストールしています
```:Poetryのインストール方法
curl -sSL https://install.python-poetry.org | python3.12 -
```
```
echo 'export PATH="/home/opeman/.local/bin:$PATH"' >> ~/.bashrc
```
```
source ~/.bashrc
```
最後に以下を実施して、versionが表示されればインストール完了です
```
poetry --version
```
物理数学教科書ガイドp255(2024年3月版)「連立微分方程式をsympyのソースコードと結果を教えて下さい。」をAI先生に聞きました。

・タイトル名変更予定です。
・私は内容を理解できていません。
・本ガイドの目次作成予定。
　しばらく?上記の 物理数学教科書ガイド のタグでお願いします。

# 数学—物理を学び楽しむために—暫定版(2024年3月) 様
  
**PDF=p255**(=241+14) (スクショ貼り付けの省略。以下別々に実行しています。)
(本行省略)スクショ貼り付け。実行。
**上記の連立微分方程式をsympyのソースコードと結果を教えて下さい。**
**上記の式をmathjaxのコードで教えて下さい。**

???mathjaxh表示の４通りうちの align環境を使う方法で。
```math
\begin{align}
\dot{x}(t) &= -\gamma x(t) + \beta y(t) \\
\dot{y}(t) &= -\gamma y(t) + \beta x(t)
\end{align}
```

以下のページへの直接のリンクはしていません。
＞ファイルのダウンロード　通常版（12 ポイント） (pdf 8.4 MB)
＞https://www.gakushuin.ac.jp/~881791/mathbook/

# sympy実行サイト

https://live.sympy.org/

・sympyの開発環境は、ページ後半です。
# ChatGPT先生へ

# Gemini先生へ
>(回答抜粋)

```python
from sympy import symbols, Function, dsolve, Eq

# 変数と関数を定義
t, beta, gamma = symbols('t beta gamma', real=True)
x = Function('x')(t)
y = Function('y')(t)

# 微分方程式を定義
eq1 = Eq(x.diff(t), -gamma * x + beta * y)
eq2 = Eq(y.diff(t), -gamma * y + beta * x)

# 連立微分方程式を解く
sol = dsolve([eq1, eq2], [x, y])

# 解を表示
print(sol)
```
```python
これは、
x(t) = C1*exp(t*(-γ - β)) + C2*exp(t*(-γ + β))
y(t) = -C1*exp(t*(-γ - β)) + C2*exp(t*(-γ + β))
という解を表しています。ここで、C1とC2は積分定数です。
```
>初期条件の追加...

つづく。

# copilot先生へ
未

# wolframalpha先生へ
勉強中


# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342) 　開発環境

# いつもと違うおすすめです。
#### sympyのDoc
・連立方程式を探しています。申し訳ありません。

https://docs.sympy.org/latest/modules/solvers/solvers.html

#### wikipedia
　??? Simultaneous differential equation

https://en.wikipedia.org/wiki/System_of_differential_equations

#### Qiita
＞この記事は最終更新日から5年以上が経過しています。

https://qiita.com/mrrclb48z/items/316a40b4350be3fc9841

https://qiita.com/mrrclb48z/items/3f4f7f1ae14bfd33f9b7
4回の転職経験から学んだキャリア形成について

## はじめに

私はシステム運用保守メインで11年目です。
これまでに4回の転職を経験してきました。その中で学んだキャリア形成における重要なポイントや、転職の際に注意すべきことを本記事にまとめました。

これから転職を考えている方やキャリアに悩んでいる方の参考になれば幸いです。

# キャリアで大切な事

## 一貫性を持たせる大切さ

私は正社員雇用型の技術派遣として、すべてシステム保守の現場で経験を積み上げてきました。その結果、直受けのSIer企業にエージェント経由で入社し、現在はフルリモートで5年目にて働いています。

技術派遣時代に会社の指示に従って派遣先で仕事内容を頻繁に変えていたら、今のキャリアは築けなかったでしょう。一貫性を持って同じ分野で実績を積み上げることが大切だと実感しています。


## 転職活動で問われる一貫性
転職の面接の際に大学の頃からなぜその選択をしたのか、今までの会社の転職理由と退職理由を聞く企業さんが多転職面接では、「大学時代の選択理由」や「転職・退職理由」を問われることが多くありました。その際、一貫性のあるキャリアは非常に強いアピールポイントとなります。

私はシステム運用保守で11年のキャリアを積んでおり、この分野での専門性を評価されることが多くありました。これからもインフラエンジニアとしてキャリアを極め、異業種への転職は考えていません。

## 転職は慎重に行う
私の経験では、転職回数が増えると書類選考の通過率が下がることを実感しました。

1社目では7年間勤務しており、当時は年齢が若かったこともあって、エージェント経由で提出した書類の通過率は約9割にも達していました。比較的スムーズに転職活動を進めることができたのを覚えています。

しかし、5年前に経験者として4社目の転職活動を行った際には、状況が大きく変わりました。10社応募しても書類通過率は1割程度、つまり1社通過するかどうかという厳しい結果に直面しました。

**転職は家を買うぐらい慎重が一番です**

## キャリアの専門性を深める
40代になると、エンジニアにも専門性が求められるようになります。私自身、現在はメンバー層でシステム運用保守を担当していますが、マネジメントやスペシャリストといった役割にはまだ該当していません。

それでも、41歳になった今でも複数の企業からスカウトをいただき、エージェントからも「転職支援をしたい」と連絡をいただく機会があります。
これは、システム運用保守として長年積み上げてきた現場経験のおかげだと感じています。

## 学びを形に残す重要性
私がこれまでのキャリアで意識してきたのは、学んだことを形に残すことです。その一環として、AWS資格を複数取得してきました。
また、現在もメンバー層のポジションながら、41歳の私にスカウトが届き続けている理由は、これらの資格や長いシステム保守の一貫性のあるキャリアの結果だと考えています。
「40代になるとエージェントは相手にしない」という記事を目にすることがありますが、キャリアに一貫性があり、学びを形に残している限り、そんなことはありません。

## 転職を急ぐリスクと慎重な選択の重要性
人事部の方やエージェントからしつこく勧められる企業に転職するのは、非常にリスクが高いと感じています。実際、私も以前そのような形で転職し、会社の社風が合わずに短期離職という結果になりました。

**エージェントや人事が積極的にアプローチしてくる場合でも、それだけを理由に急いで転職するのは注意が必要です。お互いにとって不幸な結果になる可能性が高いため、冷静に判断することが大切だと思います。**

**自分自身の現在のスキルや過去の失敗を振り返り、他人任せにせず転職などの大事な選択は自分の目で調べて考えて判断することは大変大切です。**

転職を検討する際には、過去を振り返り、自分が長く働いてきた環境に似た社風や文化を持つ会社を選ぶのが良いかもしれません。そのような選択をすることで、職場への適応や長期的なキャリア形成がスムーズになると考えます。

## 転職癖がついていないかを見直す
希望しない仕事内容や転職癖がついてしまうと、職場で苦手な人がいるたびに転職を繰り返すことになりかねません
キャリアを積み上げていくためには、自分なりの軸を持つことが重要です。
軸があることで、一時的な問題に左右されず、長期的な視点でキャリアを形成することができます。

もし職場で苦手な人や解決が難しい問題に直面した場合は、まず会社と相談し、問題解決の道を模索することが大切です。それでも状況が改善しない場合、転職は最終手段として考えた方が良いと私は思います。

これまで多くの現場で働いてきましたが、今では顔を覚えているものの、名前を忘れてしまった方も多くいます。
職場での人間関係というのは、その程度の距離感であることが多いと感じます。
現場ごとに異なる環境や人間関係の中で、自分自身のキャリアを積み上げることが最優先だと思います。

## 現職を続ける場合でも大切な「関係づくり」
40代になると、特にマネジメント経験や専門性が薄い私の場合、転職市場でのスカウトや機会が減少しがちです。それでも、現職を続けながらもエージェントやヘッドハンターとの良好な関係を築くことを大切にしたいと考えています。

志望度が高くない会社であっても、丁寧なやり取りを心がけることで、将来のチャンスや新たなネットワークに繋がる可能性があると思います。たとえ転職活動をすぐに始める予定がなくても、キャリアの相談相手を増やしておくことは、万が一の際に大きな安心感をもたらします。

最終的には、縁がある会社にこそ長く働けるものです。しかし、どんなに長く働くつもりでも、何らかの理由で退職することになる可能性は誰にでもあります。

だからこそ、日々誠実に目の前の仕事に向き合い、全力で取り組むことで、自分にふさわしい出来事や新たなチャンスを自然と引き寄せていけるのだと思います。

# まとめ
私のキャリアで心がけている点をまとめました。良かったら参考程度にご覧いただければ幸いです。
【BigQuery】IN 句内がサブクエリの場合は実行計画が変わったので備忘録

タイトルのとおり。
環境は Google Cloud の BigQuery。
以下の food テーブルがある（カラム名も food で少しややこしい）。

```sql
SELECT food
FROM `PROJECT_ID.DATASET_ID.food`

-- food
-- ぶどう
-- バナナ
-- りんご
```

実行計画を確認するためのコマンド:
`bq show --format=prettyjson --job PROJECT_ID:JOB_ID | jq '.statistics.query.queryPlan'`

### (a) エラーにならない
理由（推測含む）: 実行計画を見ると、(a1) と (a2) が同時に実行され、AND 条件の短絡評価により、(a2) ではぶどうのレコードは評価されないためエラーにならない。

```sql
SELECT food
FROM `PROJECT_ID.DATASET_ID.food`
WHERE
  food IN ('りんご') -- (a1)
  AND CASE -- (a2)
    WHEN food = 'ぶどう' THEN ERROR('エラー')
    ELSE TRUE
  END;
```

### (b) エラーになる
理由（推測含む）: 実行計画を見ると、(b2) は単独で food テーブルに対して実行され、ぶどうのレコードが評価されるためエラーになる。

```sql
SELECT food
FROM `PROJECT_ID.DATASET_ID.food`
WHERE
  food IN (SELECT 'りんご') -- (b1)
  AND CASE --(b2)
    WHEN food = 'ぶどう' THEN ERROR('エラー')
    ELSE TRUE
  END;
```

### (c) エラーになる
理由（推測含む）: OR 条件なので (c2) でぶどうのレコードが評価されてエラーになる。

```sql
SELECT food
FROM `PROJECT_ID.DATASET_ID.food`
WHERE
  food IN ('りんご') -- (c1)
  OR CASE -- (c2)
    WHEN food = 'ぶどう' THEN ERROR('エラー')
    ELSE TRUE
  END;
```