OmniAICreator/Qiita-1.07M huggingface dataset:
[AWS SUMMIT2024 セッションレポート] AWS コンテナサービスから考える安全なアプリケーションデリバリー

# はじめに
受講セッションの個人的な所感と、メモです。
メモの内容は、誤字脱字などあるやもしれませんが、ご了承ください。

# 所感
コンテナ環境は開発環境・プロダクション環境問わず今や必須と言えるものとなってますが、どうしても運用、管理が問題になってきます。
セッションの内容としては、もしかしたら基本的な事項かもしれませんが、基本こそ大事。
構成もそうですが、これらを形作る「考え方」こそ、最も重要だなぁと感じました。

具体的には、障害を0にすることはできない前提で、それらをどう限りなく小さくするか、発生した際にはどのように気付き、対応できる体制を築くべきか・・・など。

それらのヒントを、たくさん頂けた気がします。

# 受講メモ
## 安全なアプリケーションのデリバリーとは
- リスク
	- バグの混入や予期せぬエラー、障害など意図しない状況の発生
- 障害の可能性を0にはできない
- 影響を小さくすることはできる

### 最小限にするために
- デリバリーによる新機能の公開を、少数のユーザーから段階的に行う

### 新機能を段階的に公開する手法
- 線形デプロイ / canaryデプロイ
	- トラフィックの一部を新機能に向ける
- 機能フラグ
	- 特定の属性のアクセスを新機能に向ける

### 線形デプロイ / canaryデプロイ
LBでトラフィックをコントロール
 - 線形
 	- トラフィックを切り替える比率を線形に増やしていく
 - canary
 	- 少数トラフィックで確認後、残りのトラフィックを一気に切り替える


### 機能フラグ
- アプリケーションコードに、外部フラグのon/offで動作切り替えをこなうようにしておく
- 機能フラグの管理 AppConfig
- 機能フラグの定期取得のためのコンテナエージェントがECSにある


# 関連
- [AWS SUMMIT2024 参加レポート](https://qiita.com/yukiMiyoshi_fcafe/items/220bf886aa94ea552d3e)
Flutterの状態管理


■状態管理について

状態管理は非同期処理で重要
- IOの読み込み中、読み込み完了、成功/失敗
- プルリフでユーザーが引っ張ったことを検知->リフレッシュ->反映
- 無限スクロール->一番下に来たことを検知->読み込み中->表示
- サジェスト（入力値をリアルタイムで取得、候補を非同期で取得->表示）
- 楽観的UI（DBに登録する前にユーザーへ偽データで表示）

■Flutterの状態管理

StatelessWidget:
固定文言や画面要素が固定の静的画面で用いる。

```dart
class STLClassName extends StatelessWidget {
  // keyはwidgetが再構築されるときに同一性をチェックするのに利用
  const STLClassName({super.key});

  // 画面を構築・描画する処理
  // コンストラクタ実行後に一度だけ呼ばれる
  @override
  Widget build(BuildContext context) {
    // この中にUIを定義
    return const Scaffold();
  }
}
```

StatefullWidget:
画面のコンポーネントに変化がある動的画面で用いる。

```dart
class STFClassName extends StatefulWidget {
  const STFClassName({super.key});

  // 呼ばれるたびに新しいStateオブジェクトが生成され、ウィジェットのライフサイクルの中で状態を保持
  // ここではオブジェクトの生成のみ
  @override
  State<STFClassName> createState() => _STFClassNameState();
}

// 実際の状態管理はこちらに定義する
class _STFClassNameState extends State<STFClassName> {
  // 画面を構築・描画する処理
  // オブジェクト生成時、setState()後に実行される
  @override
  Widget build(BuildContext context) {
    return const Scaffold();
  }
}
```

＜初回画面構築時＞
コンストラクタ->createState() -> initState()->didChangeDependencies()->build()

- initStateはオブジェクト生成時に一度だけ呼ばれる(省略可)
- didChangeDependenciesはinitState直後や依存するオブジェクトが変更されたときに呼ばれる(省略可)


＜親ウィジェット更新時＞
コンストラクタ->didUpdateWidget()->build()

- didUpdateWidgetは親ウィジェットが新しい設定で再ビルドされ、自身にその状態が引き継がれた時に呼ばれる(省略可)
- 古いStateと新しいStateを比較したい時に利用

＜状態更新時＞
setState() -> build()
- 画面を更新したい時、setStateを呼び出す。(setStateの定義は省略可)

＜ウィジェット消滅時＞
dispose()
- ウィジェットが破棄される時に一度だけ呼ばれる。リソースの解放などを行う

https://qiita.com/softimo88/items/7df75fd3bf3a80079f2e
こちらからライフサイクルの図を引用

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136142/0e133f6d-3877-31ba-95cc-da9efe87e179.png)

■状態管理を実現するためのアーキテクチャ
状態管理は煩雑なため、大規模開発では以下のアーキテクチャを利用する

- Bloc: Streamを活用したリアクティブな状態管理
- Redux: ActionCreator（ビジネスロジック） -> Action（状態への操作） -> Reducer（状態更新=Store更新）と役割が一方通行で処理を追いやすい
- Provider: 直感的な状態管理
- Riverpod: Providerの強化版
しくじりをネタ化（オープン化）できればそれだけで組織的な改善活動

しくじりをネタにすることによる組織的な改善活動ができると考えます。


## 失敗はそのままにしていれば失敗のまま
失敗はそのままにしていれば失敗のまま。
エジソンも「私は失敗したことがない。ただ、１万通りのうまくいかない方法を発見しただけだ」と言っており、失敗の先に成功があります。

## 失敗を共有する
ただ、一人で１万通りの失敗をすることはメンタル的にも辛いです。
失敗を多くの人が共有することで、失敗に対しての認知の総数を増やすことができ、その分失敗を減らし、成功に近づくことができます。

## 失敗を共有することで改善活動につながる
失敗を多くの人に伝えることができれば、その分失敗をする人が減っていきます。
失敗を多くの人に伝えることができればそれだけで改善活動につながるのです。

## 失敗を共有するためにはネタにすることが一番の近道
失敗を共有するためにはネタにすることが一番の近道です。失敗をわかりやすくまとめ、オチを付け、ネタにすることで、多くの人が失敗を知ることができます。


## 失敗をネタ化して改善するまでのフェーズ

|フェーズ|内容|組織への効果
|-|-|-
しくじり　|失敗|無
報告|認知|無
ネタ|オープン|共有
殿堂|改善|ナレッジ化
（1冊ですべて身につく）ローディング画面を作成する

お疲れ様です。

今日は、昨日から勉強していたローディング画面を作成終えましたので、まとめです。

![1402.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/0d42d43c-d34b-5946-06f2-c7ac57521300.png)

![151.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/7239d090-5a0b-e677-9e44-88987911b87d.png)

１枚目が画像を読み込んでいる間に表示されるローディング画面で、2枚目が読み込まれた画像です。

![152.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/506c2a22-f689-03e0-1dac-14304d925b0c.png)

![153.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/9634a9b4-be5d-dddc-166e-8195cbf1f2ad.png)
cssとhtmlのコードです。
transition で1枚目の画像を1秒かけて変化するようにしています。試しにここを5sとすると、読み込み後の画像が表示されてからも残り続け、5秒かけてくるくる回る画像が消えていきました。
![155.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/2fcc1bd1-63c1-3a45-0b88-2f424d3eb579.png)

![156.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/ceb74c95-6cbf-694b-8c0e-0330511c4477.png)
コメントアウト通り、classList.add で画像を読み込んだあとに、loadedクラスを追加するようにし、loadedクラスには #loading にある background-color を透明にするように opacity: 0; を書き、visibility というプロパティで、ウェブページ上にある #loading の画像を見えない（hidden）ようにしました。

これでローディングから、読み込まれた画像が表示されるようになりました。
今回はcssで fr という単位が出たり visibility というプロパティが出たりで、まだまだ調べることはたくさんありそうです。1つずつちゃんと調べて理解していきます。
CESSは京都で開催された独占的なIVS 2024カンファレンスでハイレベルな講演者パネルの主役を務めました。共同創設者のジョセフ・リーが、日本最大のスタートアップイベントでCESSとDePINのパワーを紹介しました

![cess1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784576/b50281bb-53a9-54f6-86d5-f7e8409f6492.jpeg)

高性能ブロックチェーンベースの分散型ストレージおよびコンテンツ配信ネットワーク インフラストラクチャである CESS は、日本を代表するスタートアップ カンファレンスである IVS 2024 で、業界トップのパネルのメインを務めました。CESS の共同創設者である Joseph Li が出席したパネルには、コンピューティング能力やデータ ネットワークなどについて議論するために数名の専門家が招かれました。

今年で 17 回目となる IVS カンファレンスのテーマは「境界を越える」です。日本の豊かな伝統と最新のグローバル イノベーションを結集し、ビジネスの洞察や最先端のテクノロジーから、急速に進化する世界における Web2、Web3、AI の役割まで、あらゆることを網羅する真に包括的なイベントです。15,000 人以上、3,000 人の創設者、1,500 人の投資家、3,500 社のスタートアップが参加したこのカンファレンスは、より良い世界を構築するために思想的リーダーと影響力の大きいアイデアを結集するプラットフォームとして認められています。

カンファレンスのトピックには、世界的な資金調達、戦争のない技術開発、国境を越えた電子商取引、貧困との闘い、プライベートデータ活用における AI インフラストラクチャなどが含まれます。

CESS の共同創設者であるジョセフ・リー氏は、CESS によってユーザー、クリエイター、ビルダーがデータを共有し、幅広いユースケース向けの dApp を開発および展開できるようになった経緯について語りました。「分散型 Web3 革命は加速しており、遅くてコストがかかる集中型の Web2 の代替手段に着実に取って代わっています」とリー氏は述べました。「今こそ、技術のビジョナリーとビルダーがイノベーションとコラボレーションを促進し、業界を前進させるパートナーシップを構築する時です。CESS は、分散型でユーザーが所有および管理する Web3 およびブロックチェーンの分野でまさにそれを実現するためにゼロから構築されました。」

![cess2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784576/b4be8744-8bc1-427b-ac89-6d8e5cadcb59.jpeg)

日本、特に京都は、IT イノベーション、金融、グローバル産業の中心地として定着しています。CESS は、分散型ストレージ分野で認知された名前として注目を集めました。CESS が IEEE から標準番号 P3233 (ブロックチェーンベースの分散型ストレージ プロトコル仕様) の承認を得るための努力は、Web3 のイノベーションと成長を可能にするために不可欠な標準化と正規化を獲得する原動力となりました。これは、CESS が最近発表したブロックチェーン協会への加盟と連動しています。ブロックチェーン協会は、ブロックチェーンと暗号資産の分野で透明性の向上と建設的な公共政策を積極的に提唱する業界リーダーの著名なネットワークです。CESS の取り組みと IEEE との長年にわたる関係、そして今やブロックチェーン協会への加盟は、イノベーションを促進し、ブロックチェーン技術の集中的かつ責任ある開発を擁護するというプロジェクトの献身を強調する大きなステップです。

これらの分野における CESS の取り組みの一環として、CESS はゴールド スポンサーとして参加し、より堅牢で統合された、協力的な Web3 エコシステムを世界に推進しました。

ジョセフ リー氏は、インセンティブを使用してネットワーク ノードのグローバル展開を推進するように設計された DePIN (分散型物理インフラストラクチャ ネットワーク) についても説明しました。

「DePIN により、さまざまなプレーヤーがリソースを共有し、安全で、セキュリティが確保され、透明性があり、スケーラブルな方法で価値を構築できるようになります」とリー氏は述べました。「Web3 空間でのデジタル資産のシームレスな取引、転送、使用に基づいて構築されたデータ価値ネットワークを活用する DePIN と、それを実現するために必要なセキュリティ、速度、コスト削減、オープン性、スケーラビリティを提供する基盤となる CESS ネットワークは、今後数年間で最も影響力の大きいテクノロジーの 1 つになるでしょう。」

このイベントで、リー氏と CESS は、Web3 アプリケーションに最適な分散型ストレージおよびコンテンツ配信ネットワークとしての CESS の威力を実証しました。 CESS を使用すると、ユーザーとクリエイターは、高速で安全、かつコスト効率に優れたオンチェーン データ共有、および高頻度の動的データに最適化されたデータ ストレージと取得を利用できます。CESS の革新的な分散型オブジェクト ストレージ サービスである DeOSS (この種のサービスとしては初) は、CESS が構築したもう 1 つのイノベーションであるデータ重複および回復の証明メカニズム (PoDR²) を使用した高いデータ可用性と、ホット データ、ウォーム データ、コールド データの階層化処理を保証されたタイムリーさで提供する複数のデータ バックアップにより、これを可能にします。

これらのイノベーションと機能により、CESS は Web3、分散型データ ストレージ、コンテンツ配信分野の最前線に躍り出続けています。 CESS は、革新的な DePIN モデルを使用してデータ主権とユーザーのプライバシーを確保しながら、データ資産の価値分配と流通を再形成することで、Web3 アプリケーション向けの分散型ストレージとコンテンツ配信の大量導入を推進し、創造的なインセンティブと Web3 導入への揺るぎない焦点を使用してノードのグローバル ネットワークを作成する先駆者として、今後も力強く前進していくことが期待されます。
UnityのCustomEditorにてmaterial作成直後にsetTextureするとうまく反映されないことがある

設定するも灰色のおそらくデフォルトカラーになってしまう。
原因はプロパティに対象変数の設定がないことだった。
UnityのshaderはPropertiesに設定がなくとも、uniformの変数があればそこへマテリアル経由で値を入れることができるが、マテリアル作成直後だとうまくいかなくなるらしい。
なお、プロパティが無いとgetTextureなどの関数も常時失敗するので、怪しければ基本的にプロパティに追加しておいたほうがいいのかも。
React + Vite の開発環境構築時のエラー "npm error code ENOTEMPTY" を解決した方法

ReactとViteを利用する開発環境を構築する際につまづいたのでメモ．

## 環境

- macOS Sonoma 14.5
- npm 10.8.2

## 問題

`sudo npm create vite@latest` コマンドを実行した際に以下のエラーが発生し，プロジェクトの作成に失敗しました．ホームディレクトリの`.npm`ディレクトリの中身に問題がありそうです．
```
npm error code ENOTEMPTY
npm error syscall rename
npm error path /Users/hoge/.npm/_npx/1415fee72ff6294b/node_modules/create-vite
npm error dest /Users/hoge/.npm/_npx/1415fee72ff6294b/node_modules/.create-vite-2BqRj1v7
npm error errno -66
npm error ENOTEMPTY: directory not empty, rename '/Users/hoge/.npm/_npx/1415fee72ff6294b/node_modules/create-vite' -> '/Users/hoge/.npm/_npx/1415fee72ff6294b/node_modules/.create-vite-2BqRj1v7'
npm error A complete log of this run can be found in: /Users/hoge/.npm/_logs/2024-07-15T09_09_04_380Z-debug-0.log
```

## 解決した方法

`directory not empty`とされていたため，エラー文中のパスのうち`->`の後ろのディレクトリの中身をすべて削除しました．

```sh
rm -rf ~/.npm/_npx/1415fee72ff6294b/node_modules/.create-vite-2BqRj1v7/*
```

すると，無事`sudo npm create vite@latest`コマンドが通りました．

尚，中身だけ消したはずの`.create-vite-2BqRj1v7`ディレクトリ自体も消えていたため，ディレクトリをまるごと消す

```sh
rm -rf ~/.npm/_npx/1415fee72ff6294b/node_modules/.create-vite-2BqRj1v7
```

でも良いと思われます．

## 蛇足：問題の原因について

問題の原因について詳しいことはわかりませんでした．

下記の一文からディレクトリ`.create-vite-2BqRj1v7`に何らかの理由でデータがすでに格納されてしまっていたことに糸口があるのかなと思いました．
`.create-vite-XXXXXX`というディレクトリとその中身がどのタイミングで生成されるのかがわかることで，この問題の根幹が見えてきそうな気がします．
```
npm error ENOTEMPTY: directory not empty, rename '/Users/hoge/.npm/_npx/1415fee72ff6294b/node_modules/create-vite' -> '/Users/hoge/.npm/_npx/1415fee72ff6294b/node_modules/.create-vite-2BqRj1v7'
```

また，同様のエラーが記載されている以下のような記事をみつけました．

https://ginpen.com/2020/10/02/close-vscode-when-npm-isntall-failed/

上記の記事ではVSCodeを開いた状態でnpmコマンドを実行するのがよくないかもしれないと記載されています．

私の場合はVSCodeをフォークして開発されたCursorというエディタを利用しています．問題発生時はこのエディタを開いた状態で操作していたと思いますが，すでに問題を解決した後でしたのでこのエディタを閉じても解決したかどうかは確認できていません．
ExpressサーバーでPrismaを使用してAPIを作ってみる


## はじめに
 Prismaを導入すれば、ソースコードに直接SQLを書くことなく、DBの操作が可能になります。
DBはDocke上のローカル開発用MySQLを使用します。
 
<br>

**1.Prisma CLIのインストール**:
Prisma CLIをプロジェクトにインストールします。

```
npm install @prisma/client
npm install prisma --save-dev
```

**2.Prismaの初期設定**:
Prismaを初期化します。
```
npx prisma init
```

これにより、`prisma`ディレクトリと`prisma/schema.prisma`ファイルが作成されます。

**3.schema.prismaの設定**
`prisma/schema.prisma`ファイルを開き、データベースの設定を行います。MySQL用のデータベース接続設定は以下のようになります。

※model Post部分を作りたいテーブルのかたちにする

```
datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

model User {　　　//ユーザーの例
  id    Int    @id @default(autoincrement())
  name  String
  posts Post[]
}

```

また、プロジェクトのルートディレクトリに`.env`ファイルを作成し、データベースの接続情報を記述します。

```
DATABASE_URL="mysql://user:password@localhost:3306/datebasename"
```

**4.Prisma Clientの生成**
`prisma generate`コマンドを実行してPrisma Clientを生成します。

```
npx prisma generate
```

**5.データベースのマイグレーション**
スキーマをデータベースに適用するために、マイグレーションを実行します。

```
npx prisma migrate dev --name init
```
**6.Express.jsにPrismaを統合**
Express.jsアプリケーションにPrisma Clientを統合します。

```tsx
import express from 'express';
import { PrismaClient } from '@prisma/client';

const app = express();
const prisma = new PrismaClient();

app.use(express.json());

app.get('/transactions', async (req, res) => {
  const transactions = await prisma.transaction.findMany();
  res.json(transactions);
});

const PORT = process.env.PORT;
app.listen(PORT, () =>
  console.log(`Server is running on http://localhost:${PORT}`)
);
```
なでしこ で Welcome to AtCoder を解いてみた

[Qiita Engineer Festa 2024（キータ・エンジニア・フェスタ 2024） - Qiita](https://qiita.com/official-campaigns/engineer-festa/2024)
において、約1ヶ月で38記事という大量の記事の投稿を要求されることがわかった。
そこで、あまりコストをかけずに記事数を稼ぐ方法を考えた結果、「Welcome to AtCoder を様々な言語で解く」ことを思いついた。
単に解くだけでなく、使用する言語仕様の解説を入れれば、記事として一応成立するだろう。

# Welcome to AtCoder

[PracticeA - Welcome to AtCoder](https://atcoder.jp/contests/abs/tasks/practice_1)

Welcome to AtCoder では、以下の形式で整数 $a$, $b$, $c$ および文字列 $s$ が入力として与えられる。

```text
a
b c
s
```

この入力をもとに、与えられた整数の和 $sum = a + b + c$ および文字列 $s$ を、以下の形式で出力することが求められる。

```text
sum s
```

# 今回用いたなでしこの機能

## 変数

[📖 なでしこ3 マニュアル - 文法/変数](https://nadesi.com/v3/doc/index.php?%E6%96%87%E6%B3%95%2F%E5%A4%89%E6%95%B0&show)
[📖 なでしこ3 マニュアル - 文法/代入文](https://nadesi.com/v3/doc/index.php?%E6%96%87%E6%B3%95%2F%E4%BB%A3%E5%85%A5%E6%96%87&show)

```
(変数名)は(値)。
```

と書くことで、変数に値を代入できる。
変数名には、漢字などを用いることができる。

## それ

[📖 なでしこ3 マニュアル - 文法/それ](https://nadesi.com/v3/doc/index.php?%E6%96%87%E6%B3%95%2F%E3%81%9D%E3%82%8C&show)

直前の命令の実行結果が変数 `それ` に代入される。

## 文字列

[📖 なでしこ3 マニュアル - 文法/文字列](https://nadesi.com/v3/doc/index.php?%E6%96%87%E6%B3%95%2F%E6%96%87%E5%AD%97%E5%88%97&show)

`「」` で囲むことで、文字列を表現できる。
このような文字列中で `{(変数名)}` と書くと、その変数の値を文字列に埋め込むことができる。

## 標準出力

[📖 なでしこ3 マニュアル - plugin_system/表示](https://nadesi.com/v3/doc/index.php?plugin_system%2F%E8%A1%A8%E7%A4%BA&show)

```
(値)を表示。
```

により、「値」を標準出力に出力し、さらに改行を出力できる。

## 標準入力

[📖 なでしこ3 マニュアル - plugin_node/尋](https://nadesi.com/v3/doc/index.php?plugin_node%2F%E5%B0%8B&show)
[📖 なでしこ3 マニュアル - plugin_system/空](https://nadesi.com/v3/doc/index.php?plugin_system%2F%E7%A9%BA&show)

```
(値)を尋ねる。
```

により、「値」を**標準出力に出力するとともに**、標準入力から1行読み込んで文字列として得ることができる。
得られる文字列は改行文字を含まない。

今回は、空文字列を表すシステム定数 `空` を用いることで、余計な出力をせずに入力を読み込んでいる。

## 文字列の数値への変換

[📖 なでしこ3 マニュアル - plugin_system/整数変換](https://nadesi.com/v3/doc/index.php?plugin_system%2F%E6%95%B4%E6%95%B0%E5%A4%89%E6%8F%9B&show)

```
(値)を整数変換。
```

により、「値」をそれが表す整数に変換できる。

## 変数への値の加算

[📖 なでしこ3 マニュアル - 文法/増減文](https://nadesi.com/v3/doc/index.php?%E6%96%87%E6%B3%95%2F%E5%A2%97%E6%B8%9B%E6%96%87&show)

```
(変数)を(値)だけ増やす。
```

により、「変数」に「値」を加算し、その変数の値を加算結果に更新できる。

## 文字列の分割

[📖 なでしこ3 マニュアル - plugin_system/区切](https://nadesi.com/v3/doc/index.php?plugin_system%2F%E5%8C%BA%E5%88%87&show)
[📖 なでしこ3 マニュアル - 文法/反復](https://nadesi.com/v3/doc/index.php?%E6%96%87%E6%B3%95%2F%E5%8F%8D%E5%BE%A9&show)

```
(対象)を(区切り)で区切る。
```

で、文字列「対象」を「区切り」で区切った結果の文字列の配列を得ることができる。

配列の要素は、`反復` ～ `ここまで` を用いて走査できる。
走査中の要素は、変数 `対象` に格納される。

# 提出コード

```
空を尋ねて整数変換。
合計はそれ。

空を尋ねる。
それを「 」で区切って反復
　対象を整数変換。
　合計をそれだけ増やす。
ここまで。

空を尋ねる。
「{合計} {それ}」を表示。
```

[提出 #55643939 - AtCoder Beginners Selection](https://atcoder.jp/contests/abs/submissions/55643939)
iPad で Visual Studio Code を使う方法

## iPadでVisual Studio Codeを使いたい

普段 iPadをよく利用していますが、何かプログラムを開発したりメンテナンスするときにiPadアプリで一般的なPCと同じ環境を求めようとしても使いやすいアプリがなく、やっぱり使いにくいなぁ・・・という感想を持っていました。ところが、下記の方法ならどうやらiPadでもVS Codeが使えるようで、これなら普段のPCの環境と同じようにコードを書くことができるので、ちょっと出先でコード編集したいなと思っても対応できそうです。

そんなニッチな悩みをお持ちの方のために、iPad で VS Code を使うための4つの方法を比較し、「iPad で Visual Studio Code (VS Code) を使いたいけど、どれを選べばいいの？」とならないように、それぞれの特徴やメリット・デメリット、料金などをわかりやすく解説します。

## iPad で VS Code を使う方法

iPad で VS Code を使う場合は、下記の2つの方法があります。

1. **Web 版 VS Code (vscode.dev)**
2. **クラウド IDE**

それぞれ詳しく見ていきましょう。

### 1. Web 版 VS Code (vscode.dev)

Microsoft が公式に提供している Web ブラウザ上で動作する VS Code です。iPad の Safari などから簡単にアクセスできます。

**メリット**

* **無料:** 手軽に無料で利用できる
* **簡単:** 環境構築不要ですぐに使い始められる
* **どこでも使える:** インターネット環境があればどこでもコード編集が可能

**デメリット**

* **機能制限:** デスクトップ版 VS Code の一部機能が使えない
* **オフライン不可:** インターネット接続が必要

**使い方**

1. iPad のブラウザで `https://vscode.dev/` にアクセスする
2. Microsoft アカウントまたは GitHub アカウントでサインインする (任意)
3. コードの編集を開始する

**こんな人におすすめ**

* 手軽に VS Code を試してみたい
* ちょっとしたコード編集をしたい
* 複雑な開発環境は必要ない

### 2. クラウド IDE

クラウド上で提供される開発環境です。ブラウザからアクセスでき、VS Code のようなインターフェースで開発できます。

**メリット**

* **環境構築不要:** 環境構築の手間がなく、すぐに開発を始められる
* **どこでもアクセス:** インターネット環境があればどこからでもアクセスできる

**デメリット**

* **コスト:** サービスによっては月額料金がかかる
* **カスタマイズ性:** 環境のカスタマイズ性で制限される場合がある

**使い方**

1. クラウド IDE サービス (GitHub Codespaces, AWS Cloud9 など) にサインアップする
2. 新しいワークスペースを作成する
3. ブラウザからワークスペースにアクセスし、開発を開始する

**こんな人におすすめ**

* 環境構築の手間をかけずに開発したい
* どこからでも開発環境にアクセスしたい

### まとめ

iPadでも VS Code を気軽に使えるようですので、用途に合わせて何を使うか選ぶとよさそうです。

* 手軽に試したいなら **Web 版 VS Code**
* 環境構築不要でどこからでもアクセスしたいなら **クラウド IDE**

ぜひこの記事を参考に、自分にぴったりの方法を見つけてくださいねっ！
dockerを使用したRuby on Rails７の環境構築について

## dockerとは何か
1台のサーバー上に、コンテナという複数のアプリケーション実行環境（開発環境）を構築でき、開発環境の共有や移転を簡単に行うことができるツールです。OSやハードウェアを問わずに実行できるため、Windows＋Linuxのように、複数OSでアプリケーションの動作を確認したり共有したりする際にも適しています。
dockerを使用することで、動作の一貫性を保証することができ、環境構築における手間を大きく削減することが可能です。
## 使用したきっかけ
Railsチュートリアルに取り組むにあたって、codespaceというgithubを使用した開発環境で進めていましたが、より実践に近い、自分の力で開発環境を構築してみようと思ったからです。

## 環境構築方法
早速環境構築を行なっていきます。dockerはインストール済みであることが前提で進めるため、まだの方は以下からインストールを行なってください。
                             
https://docs.docker.com/get-docker/?_gl=1*1w46cmq*_gcl_au*MTEzMTgyMjAyNy4xNzIxMDQ2Mjc5*_ga*NjY5OTQzMjM4LjE3MTk2NTk2ODM.*_ga_XJWPQMJYHQ*MTcyMTA0NjI3OS40LjEuMTcyMTA0NzEyNC40OS4wLjA.

## 1. ディレクトリ、ファイルの作成


ターミナル上で以下のコマンドを実行
```:ターミナル
mkdir myapp   /*作業用ディレクトリ名は任意*/
cd myapp
touch docker-compose.yml Dockerfile Gemfile Gemfile.lock
```
作成されたファイル
-
-
   docker-compose.yml
-  Dockerfile
-  Gemfile
-  Gemfile.lock


## 2. 環境構築用のコードを記述
先ほど作成したファイルにコードを記述する。

```docker-compose.yml
version: '3.9'
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: password
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 4000 -b '0.0.0.0'"
    stdin_open: true
    tty: true
    volumes:
      - .:/myapp
    ports:
      - "4000:4000"
    depends_on:
      - db
```

```:Dockerfile
FROM ruby:3.2.2
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp
```
バージョンを指定し、必要なファイルのインストール、コンテナに作業ディレクトリのコピーなどを行なっている。

```:Gemfile
source 'https://rubygems.org'
gem 'rails', '~>7.0.3'
```

```Gemfile.lock
/*こちらはGemfileの内容が入るため、空欄でOK*/
```

ターミナルで以下を実行
Ruby on Railsで開発するために必要なファイルが作成される。
```:ターミナル
docker-compose run web rails new . --force --database=postgresql
```


作成したdockerファイルの内容をもとにイメージ、コンテナが生成される。
```:ターミナル
docker compose build
```
config/database.ymlファイルにコードを追加
```config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres　　/*追加*/
  password: password /*追加、docker.compose.ymlに設定したパスワード（POSTGRES_PASSWORD）*/
  pool: ５　/*追加*/
```
```:ターミナル
docker compose up -d
```
サーバーが立ち上がり、docker.compose.ymlで指定したURL localhost:4000にアクセスすることができます。現在はデータベースを作成していないため、アクセスしようとするとエラーになります。
データベースを追加するために下記を実行してください。
```:ターミナル
docker-compose run web rails db:create
```

```:ターミナル
docker-compose run web rails db:migrate
```
再度localhost:4000のURLにアクセスすると、無事初期画面を表示できました！
[![Image from Gyazo](https://i.gyazo.com/8e44f3dee0c2ec70cd921ba0cdbf7abd.png)](https://gyazo.com/8e44f3dee0c2ec70cd921ba0cdbf7abd)

## 感想
環境構築をするだけなのに、ものすごく時間がかかりました・・・
これから学習する方の参考になれば幸いです。

## 参考
[Docker + Rails7.1 の環境構築で詰まったポイント](https://zenn.dev/yoiyoicho/articles/90e1ea64772ea8)
[dockerクイックスタートガイド](https://docs.docker.jp/compose/rails.html)
[【Ruby on Rails7環境構築】Dockerでrails newする](https://reisuta.com/rails-new/)
[【Rails】Dockerで環境構築をする方法](https://qiita.com/mattan5271/items/d2bd360d769fe298f368)
VBAでInteger型を使うのはやめよう

# はじめに
VBA、使ってますか？
私は嫌々ながらも使うことがあります。

今回の記事はそんなVBAについてのお話です。

# なぜIntegerがだめなのか
結論から言うと、変換効率と範囲制限によるものです。

詳しく説明していきます。

Integer型は2Byte(16bit)の領域に格納され、Long型は4Byte(32bit)の領域に格納されます。
32bitのCPUでは処理単位が当然32ビットのため、16bitのInteger型は32ビットに変換してから処理されます。

この変換により、32bitのLong型の方が速くなります。

それに加え、Excel 2007以降では扱うデータ量が増えており、Integer型の32,767という最大値では不十分です。
そのため、Integer型は避けた方がいいでしょう。

# 比較してみる
今回比較に使用したプログラムは以下の通りです。

```vb
Sub benchmark()
    Dim d1 As Double
    d1 = Timer

    Const MAX_RANGE As Integer = 32760
    Const MIN_RANGE As Integer = -32760
    Dim i As Integer
    Dim addition As Integer
    Dim subtraction As Integer
    Dim multiplication As Integer
    Dim division As Integer
    Dim cnt As Integer

    For cnt = 0 To 99 Step 1
        For i = MIN_RANGE - 1 To MAX_RANGE - 1 Step 1
            addition = i + 1
            subtraction = i - 1
            multiplication = i * 1
            division = i / 1
        Next i
    Next cnt

    Debug.Print "Int：" & (Timer - d1) & "秒"

    Dim d2 As Double
    d2 = Timer

    Const MAX_RANGE_LONG As Long = 32760
    Const MIN_RANGE_LONG As Long = -32760
    Dim i_long As Long
    Dim addition_long As Long
    Dim subtraction_long As Long
    Dim multiplication_long As Long
    Dim division_long As Long
    Dim cnt_long As Long

    For cnt_long = 0 To 99 Step 1
        For i_long = MIN_RANGE_LONG - 1 To MAX_RANGE_LONG - 1 Step 1
            addition_long = i_long + 1
            subtraction_long = i_long - 1
            multiplication_long = i_long * 1
            division_long = i_long / 1
        Next i_long
    Next cnt_long

    Debug.Print "Long：" & (Timer - d2) & "秒"
    
End Sub
```

何回か実行してみましたが、3割くらいLongの方が高速でした。


# さいごに
やはり、処理効率や範囲の面でLong型を使った方がいいかと思います。
プログラムのパフォーマンスを最大化するためにも、可能な限りLong型を使用することをお勧めします。

この記事が誰かのお役に立てれば幸いです。

それでは。
ポケモンカードゲームのメタゲーム環境をスプレッドシートで表にする

# 前フリ

とある先輩の名言で「エクセルは入力ツールとして最強」というものがあって、
エンジニアがちょっと入力するツールとしては本当に群を抜いて最強だと私も同感しています。

そんな経緯がありまして、
わりとエクセルやスプレッドシートで趣味ツールを作っております。

# ポケモンカードついて

ポケモンカードは60枚のカードの組み合わせ（デッキ）を作って、相手と対戦する２人用のカードゲームです。
上記のデッキは結構多種多様であり、特にエクストラと呼ばれるレギュレーションでは１００にも近い種類のデッキタイプが存在します（肌感覚）
そんななかでデッキの相性を把握するのは困難を極めます。

そこで、対戦結果を集めて統計を取れば環境の中で真に強い（相性とデッキ分布的を加味した勝率が高い）のが見えてくるんじゃないかと思って
スプレッドシートで対戦結果を集めて、表にしてみました。

---

# 作った表

![Screenshot 2024-07-15 at 21-52-26 エクストラ練習 - Google スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812996/467dca79-8fae-9d87-bd05-00c0b79ec9e4.png)

デッキのX勝-Y敗 というデータを、各デッキごとに持たせて、
その個別データと、トータルの勝率を表で表示しています。

**先攻後攻で有利さが変わるため、そのへんも書いています**

## (1) 入力シート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812996/fdec9706-728a-ebf0-058c-03a1cc96f9f4.png)

こんなシートに入力しています。
* B列に先攻側のデッキ
* C列に後攻側のデッキ
* D列に、Bの勝ち数
* E列に、Cの勝ち数
をそれぞれ記録します。

A列は、メモとして日付を書いています。
冒頭で述べてた入力しやすいをつきつめた結果です。

※　以前はWebフォームとか作ってたのですが、
　　自分一人しか入力しないツールだったので、
  　スプレッドシートで作り直した経緯が有ります。

## (2) 表の各セルの計算式

![Screenshot 2024-07-15 at 21-52-26 エクストラ練習 - Google スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812996/2153e74e-e49f-c3cc-2882-e42d4e095a28.png)

セルで直接計算したかったので、ゴリッと入力してしまいました。
ここが結構カオスってるのですが、１度作れば...（喉元を過ぎました）

### A2セル
 
    =SORT(UNIQUE('シート1'!B:B))

### D1セル

    =TRANSPOSE(SORT(UNIQUE('シート1'!C:C)))

デッキ名のユニークなリストを名前でソートして表示しています。

### D2セル

    =SUMIFS('シート1'!$D:$D=SUMIFS('シート1'!$D:$D,'シート1'!$B:$B,"="&$A2) &"-"& SUMIFS('シート1'!$E:$E,'シート1'!$B:$B,"="&$A2),'シート1'!$B:$B,"="&$A2,'シート1'!$C:$C,"="&D$1) &"-"& SUMIFS('シート1'!$E:$E,'シート1'!$B:$B,"="&$A2,'シート1'!$C:$C,"="&D$1)

A2セルと、D1セルに書いてあるデッキ名の組み合わせを、対戦履歴の入力シートから引っ張ってきて、
そこの勝ち総数と負け総数を表示しています。

### B2セル

    =SUMIFS('シート1'!$D:$D,'シート1'!$B:$B,"="&$A2) &"-"& SUMIFS('シート1'!$E:$E,'シート1'!$B:$B,"="&$A2)

D2セルとおんなじ感じで、
A2セルに書いてあるデッキ名を、対戦履歴の入力シートから引っ張ってきて、
そこの勝ち総数と負け総数を表示しています。

### C2セル

    = SUMIFS('シート1'!$D:$D,'シート1'!$B:$B,"="&$A2) / (SUMIFS('シート1'!$D:$D,'シート1'!$B:$B,"="&$A2) + SUMIFS('シート1'!$E:$E,'シート1'!$B:$B,"="&$A2))

勝ち数と負け数が取れるのを応用して、勝率を計算しています。

---

# ツールの結果

このツールの分析結果を使って、ポケカCLエクストラに使うデッキを選択したところ、
初年度は 7x位 (上位10%）
翌年度は 4x位 (上位6%）
と、結構上位の成績を収めることができました！

せっかくエンジニアをなりわいにしているので、
趣味分野でも活かしてゲームを有利に進めたいです。
LinuxでRealtek RTL8761B Bluetoothアダプタを使えるようにする

Realtek RTL8761BをUbuntu 24.04(kernel 6.8)で使えるようにする記事です

# 既存の方法
https://qiita.com/aryta/items/86b3b1287629611efce1

こちらの記事で紹介されている方法は
[20200909_LINUX_BT_DRIVER_KERNEL_5.7_COEX_v0202.zip](https://dlcdnets.asus.com/pub/ASUS/wireless/USB-BT500/20200909_LINUX_BT_DRIVER_KERNEL_5.7_COEX_v0202.zip)
からカーネルモジュール(rtk_btusb.ko)をビルドして利用しています
動作には問題ありませんがメンテナンスされていないコードを使い続けること、カーネルのアップデートごとにビルドを必要とすることが個人的に問題点です(dkmsで自動化すればいいんですけど)

# 結論
ファームウェアを入れ替えて動作確認したところ

* ファームウェアはrtl8761buではなく **rtl8761b** を使う
* ファームウェアのバージョンは最新版ではなく **0x0CA9_8A6B** を使う

これで私のところでは問題なく動いています

## ファームウェアのダウンロード
```
sudo wget -O /lib/firmware/rtl_bt/rtl8761bu_fw.bin "https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/rtl_bt/rtl8761b_fw.bin?id=0e85e606733fccd3dd0a8883545a30b64af59755"
sudo wget -O /lib/firmware/rtl_bt/rtl8761bu_config.bin "https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/rtl_bt/rtl8761b_config.bin?id=7118987b2f7aff733573121607bc9640a4880296"
```
再起動やbtrtlモジュールのリロードで
```
Bluetooth: hci0: RTL: loading rtl_bt/rtl8761bu_fw.bin
Bluetooth: hci0: RTL: loading rtl_bt/rtl8761bu_config.bin
Bluetooth: hci0: RTL: cfg_sz 25, total sz 29949
Bluetooth: hci0: RTL: fw version 0x0ca98a6b
```
dmesg がこうなっていればOK

DebianやUbuntu 20.04 ではパッケージのファイルを上書きすることになるので
```/etc/dpkg/dpkg.cfg.d/rtl8761b
path-exclude=/lib/firmware/rtl_bt/rtl8761bu_fw.bin
path-exclude=/lib/firmware/rtl_bt/rtl8761bu_config.bin
```
アップデートで変更されないようにすると良いと思います
Windows11、WSL(ubuntu)環境に複数のpythonをインストールする

## やること

- wslに複数のpythonバージョンをインストール
- venvでバージョンを指定して環境構築

## pythonのダウンロード

[公式サイト](https://www.python.org/downloads/source/)からソースコードをダウンロードする。
(Download XZ compressed source tarballをダウンロード)

ダウンロードしたファイルをWSL上の適当なディレクトリにコピーする。
```
cp /mnt/c/Users/hogehoge/Downloads/Python-3.12.4.tar.xz /home/hogehoge/tmp
cp /mnt/c/Users/hogehoge/Downloads/Python-3.11.9.tar.xz /home/hogehoge/tmp
```

## pythonのインストール

tarファイルを解凍する。
```
tar xJf Python-3.12.4.tar.xz
tar xJf Python-3.11.9.tar.xz
```

pythonをインストール
```
cd Python-3.12.4
./configure
make
sudo make install
```

別バージョンを同様の手順でインストール。
インストール時のコマンドは`sudo make altinstall`にする。
altinstallをした場合、python3.xコマンドのみ使えるようになる。

```
python3 --version
Python 3.12.4

python3.11 --version
Python 3.11.9
```

参考：
https://www.python.jp/install/ubuntu/index.html


## venvで環境構築

```
python3.12 -m venv myenv
```

```
Error: Command '['/home/hoge/sample/myenv/bin/python3.12', '-m', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1.
```
このエラーになる場合は、下記のコマンドを実行してみる。
```
python3.12 -m ensurepip --upgrade
```
メンバ関数よりもフリー関数を使おう

<!-- 非メンバ関数の方が良い？？ -->
<!-- タイトルは、併記にするかな…。 -->



# メンバ関数を使った場合

以下のコードを考える。

```cpp
class Foo
{
public :
	double Calc(){
		Init() ;
		// ※1
		CaldParam_1() ;
		CaldParam_2() ;
		return param_2 ; // ※2
	}
private:
	void Init() { … }
	void CaldParam_1() { … }
	void CaldParam_2() { … }
private:
	double base_value ;
	double param_1 ;
	double param_2 ;
} ;
```

このコードにおいて、戻り値の値は誤っているが、
`※1` の時点での `param_2` の値は正しかったとする。


この時、`Init` の実装は正しく、`CaldParam_1`,`CaldParam_2` のどちらか(又は両方)が誤っていると考えられる。

# フリー関数を使った場合

先程のコードを、フリー関数を用いて以下へ書き換えが出来たとする。

```cpp
namespace {

pair<double,double> Init() { … }
pair<double,double> CaldParam_1( const double base_value, const double param_1, const double param_2 ) { … }
double CaldParam_2( const double base_value, const double param_2 ) { … }

} // namespace

class Foo
{
public :
	double Calc(){
		std::tie( base_value, param_2 ) = Init() ;
		// ※1
		std::tie( param_1, param_2 ) = CaldParam_1( base_value, param_1, param_2 ) ;
		param_1 = CaldParam_2( base_value, param_2 ) ;
		return param_2 ; // ※2
	}
private:
	double base_value ;
	double param_1 ;
	double param_2 ;
} ;
```


先程と同様に、戻り値の値は誤っているが、
`※1` の時点での `param_2` の値は正しかった場合、
フリー関数版であれば、`CaldParam_1` の方が間違っていると分かる。


# まとめ

フリー関数を使うことで、出入力が明確になります。

不具合を探るエンジニアは、犯人を探す探偵のようなものです。
例えば、出入り口が1つだけなら犯人が絞りやすいですが、
事が起こったのが公園のど真ん中であれば、犯人を絞るのも一苦労です。

変数を無為に `public` とすべきで無いのと同様に、
無為にメンバ関数を使わ無いようにするのが良いでしょう。
SQLクエリをview側に表示してみる

## はじめに
各ページで発行されたSQLクエリはログを見れば分かります。
ただ、そのログをview側で確認してみたいといったとき、やり方を知らなかったので今回やってみました。

## SQLクエリをview側に表示する
やり方は考えれば色々あると思いますが、今回は`ActiveSupport`を使用してログを表示してみたいと思います。

### `application_controller.rb`にインスタンス変数を定義

```rb:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :setup_query_logs

  private

  def setup_query_logs
    @query_logs = []
    ActiveSupport::Notifications.subscribe "sql.active_record" do |name, started, finished, unique_id, data|
      @query_logs << data[:sql]
    end
  end
end
```
`ActiveSupport::Notifications.subscribe`を使用して、`sql.active_record`というイベントに対してサブスクライブ（購読）します。
ActiveRecordがSQLクエリを実行するたびに、ブロック内の処理が実行されます。
発行されたクエリを@query_logsに格納します。

ActiveSupport::Notifications.subscribeの詳しい説明はこちらから確認できます。

https://railsguides.jp/active_support_instrumentation.html

### `application.html.erb`を修正
SQLクエリをview側に表示させるため、コードを修正します。
```erb:app/views/layouts/application.html.erb
<body>
  <%= yield %>

  <h2>Query Logs</h2>
  <ul>
    <% if @query_logs %>
      <% @query_logs.each do |query| %>
        <li><%= query %></li>
      <% end %>
    <% end %>
  </ul>
</body>
```

### 表示の確認
ページを開くとクエリが表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/8a7cd4c2-205b-5310-33aa-65a997644813.png)

N+1が発生しているので、includesするとこんな感じに表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/79fbb3a5-72a0-1f93-d448-86ae1aa9df09.png)

## 終わりに
view側にSQLクエリを表示するのはセキュリティ的にあまりよくないのだと思いますが、検証等で使用するのであればコンソールを見に行かず、viewで確認できるのでデバック等で使えるのではないかと思います。
Macでmysql実行時に発生する"The server quit without updating PID file"について

## エラー内容
mysql開始時に以下のエラーが発生した（ファイル名は一部変更）
```
sudo mysql.server start
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/xxx.local.pid).
```

## 考えられる原因
- シェルをfishからcshへ変更したこと？（最近変更した）


## 調べたらよく出る方法を試す（失敗）

### touchでPIDファイルを確認・作成
```
sudo touch /usr/local/var/mysql/xxx.local.pid
sudo mysql.server start
Starting MySQL
. ERROR! The server quit without updating PID file
```

### touchでPID確認後に権限付与
```
sudo touch /usr/local/var/mysql/xxx.local.pid
sudo chown -R _mysql:_mysql /usr/local/var/mysql/xxx.local.pid
sudo mysql.server start
Starting MySQL
. ERROR! The server quit without updating PID file
```

## 成功結果
`sudo`をつけずに実行してみると成功した

```
mysql.server stop
Shutting down MySQL
. SUCCESS!
```

原因は不明だが、pidファイルの場所（`/usr/local/var/mysql/`）を見ていると以下の挙動が確認さえ得た
- `sudo`あり：実行時にpidファイルが削除された
- `sudo`なし：実行時にpidファイルが削除されなかった

以上がエラーの原因ではありそうだが、なぜそうなるのかは不明
LinuxでDotnet SDKを実行した

# はじめに
Linuxの中古ノートPCに、C#のモジュールを動かしました

## やったこと
①sample1のプロジェクトを作ります。
```
$ dotnet new console -o sample1
```

②VSCでコードを少しいじる

③C#のプログラムを実行
VSCでプロジェクトを保管しているディレクトリに移動して、以下のコマンドを実行

```
dotnet run
```

これでプログラム実行完了です

# 最後に
Linuxで快適な開発ができそうです
モダンなフロントエンドフレームワークの選び方

# はじめに
ウェブ開発の世界は日々進化を続けており、新しいフロントエンドフレームワークが次々と登場しています。この記事では、最新のフロントエンドフレームワークを選ぶ際のポイントについて詳しく解説します！

# 対象読者
- フロントエンド開発に興味がある方
- 新しいフロントエンドフレームワークを選ぼうとしている開発者

# 目次
1. フロントエンドフレームワークとは
2. フレームワーク選定の基準
3. 主要なフロントエンドフレームワークの比較
4. フレームワーク選定時に考慮すべきポイント
5. まとめ

# 1. フロントエンドフレームワークとは
## モダンなウェブアプリケーション開発の基盤
フロントエンドフレームワークは、ウェブアプリケーションのユーザーインターフェースを効率的に構築するためのツールセットです。これにより、開発プロセスが迅速かつ効率的に進みます。

### 主要なフロントエンドフレームワーク
- **React**: Facebookによって開発され、広く使用されている。
- **Vue.js**: 軽量で使いやすく、コンポーネントベースのアプローチを採用。
- **Angular**: Google製で、大規模なアプリケーション開発に強みを持つ。

:::note info
詳細な比較や公式ドキュメントのリンクは、各フレームワークの公式サイトをご覧ください。
:::

# 2. フレームワーク選定の基準
## プロジェクトの規模と要件にマッチするか
フレームワークを選ぶ際、まず考慮すべきはプロジェクトの規模と要件です。特定のフレームワークがその要件に適しているかを確認しましょう。

### 選定基準の具体例
- **学習コスト**: 新しいフレームワークを学習するための時間とリソース。
- **パフォーマンス**: アプリケーションのスピードと効率性。
- **エコシステム**: コミュニティのサイズと利用可能なプラグインやライブラリの豊富さ。

# 3. 主要なフロントエンドフレームワークの比較
## React
### 特徴
- コンポーネントベースのアーキテクチャ
- 仮想DOMによる高速な描画
- 強力なエコシステムと広範なコミュニティ

### メリット
- 拡張性が高く、カスタムフックなどの最新機能が利用可能。
- 他のライブラリやフレームワークと統合しやすい。

### デメリット
- 状態管理の複雑さ（Reduxなどの状態管理ライブラリが必要になることが多い）。
- 高度な設定が必要な場合がある。

## Vue.js
### 特徴
- 直感的でシンプルなAPI
- 軽量でパフォーマンスが高い
- 双方向データバインディング

### メリット
- 学習コストが低く、小規模から中規模のプロジェクトに最適。
- 細かいカスタマイズが可能。

### デメリット
- 大規模プロジェクトでの使用が一般的ではない。
- エコシステムが他のフレームワークに比べて小規模。

## Angular
### 特徴
- 全機能が備わったフレームワーク
- TypeScriptを使用
- 依存性注入と成熟したエコシステム

### メリット
- 大規模アプリケーションに最適。
- クリーンで再利用可能なコードを書くのに役立つ。

### デメリット
- 学習コストが高く、複雑。
- 初期設定が多い。

# 4. フレームワーク選定時に考慮すべきポイント
## 開発チームのスキルと経験
開発チームのスキルセットと経験を考慮することも重要です。チームが既に熟知しているフレームワークを選ぶことで、生産性が向上します。

### 他のシステムとの互換性
新しいフレームワークが既存システムやサービスとどう統合できるかを理解することが重要です。

### メンテナンスとサポート
選定したフレームワークが長期的にサポートされるか、コミュニティや公式からのサポートがどれだけ期待できるかを確認しましょう。

# まとめ
フロントエンドフレームワークの選定は、プロジェクトの成功に大きな影響を与えます。プロジェクトの要件や開発チームのスキル、他のシステムとの互換性、そしてフレームワークのエコシステムとサポート体制を考慮し、自分たちのプロジェクトに最適なフレームワークを選ぶことが大切です！
gitコマンド集備忘録

# gitのコマンド備忘録

gitのコマンドを忘れてもいいように記事に残します



# ブランチ確認
git branch

# ブランチを作って作ったブランチに移動
git checkout -b ブランチ名

# 全てのファイルをステージングへあげる
git add .

# ステージングのファイルをメッセージ付きでコミット
git commit -m 'message'

# プッシュ
git push

# ローカルブランチ削除
git branch -d ブランチ名

# リモートブランチ削除
git push origin :ブランチ名


# ステージング、コミット、プッシュまでまとめたシェル
```shell:git-add-commit-push.sh
#!/bin/zsh

# git add .
git add .

# コミットメッセージの入力を求める
read -p "Enter commit message: " commit_message

# git commit -m ''
git commit -m "$commit_message"

# git push
git push

```
ロジカルライティングを理解すると世界が変わる【マジ】

# はじめに
私の職場で以下の本を読むように周知があったため読んでみました。

https://www.amazon.co.jp/%E8%AB%96%E7%90%86%E3%81%8C%E4%BC%9D%E3%82%8F%E3%82%8B-%E4%B8%96%E7%95%8C%E6%A8%99%E6%BA%96%E3%81%AE%E3%80%8C%E6%9B%B8%E3%81%8F%E6%8A%80%E8%A1%93%E3%80%8D-%E3%83%96%E3%83%AB%E3%83%BC%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9-%E5%80%89%E5%B3%B6-%E4%BF%9D%E7%BE%8E/dp/4062577933

この本では**パラグラフ・ライティング**に基づいた論理的な文章の書き方について、練習問題も交えながら解説しています。

パラグラフ・ライティングについて大学などで学ぶことはありませんが、この本を読んでみて、その重要性に気づかされました。例えばビジネスにおける報告や提案、チーム間でのコミュニケーションなど**文章を論理的に書けるか否かで生産性がかなり違う**と思いました。

本当にこの本を読んでよかったと思っているので、以下では学んだことを書いていきます。

# パラグラフ・ライティングとは
ChatGPTに聞いてみました。
>パラグラフ・ライティング（Paragraph Writing）とは、効果的なパラグラフ（段落）を構成するためのスキルや技術のことを指します。パラグラフは、文章の基本的な単位であり、1つの主要なアイデアやテーマを扱います。パラグラフ・ライティングにはいくつかの重要な要素があります。
>
>トピックセンテンス（Topic Sentence）: パラグラフの最初の文で、そのパラグラフが何について述べるのかを明確にします。この文はパラグラフ全体の中心となるアイデアを提示します。
>
>（略）
>
>パラグラフ・ライティングの目的は、読者に明確で整ったアイデアを伝えることです。各パラグラフは独立したアイデアを持ちながらも、全体の文章の一部として一貫性を保ち、論理的に構成されるべきです。

なるほど、おおよそ合っています。
パラグラフ・ライティングは、いくつかのルールに沿って文書を書くことによって相手に伝わりやすくするものです。

例えばルールとは以下のようなものです。
- **パラグラフ**と呼ばれる1つの文章の塊の中に、言いたいことを1つだけ書く
- 1つのパラグラフにトピックが2,3個ある場合は考えがまとまっていない証拠なのでパラグラフを分ける
- 逆に1つのパラグラフの文章が少なければそこから相手が納得するような根拠（データや例など）をつけてパラグラフを膨らませます
- ChatGPTも言っていましたが、パラグラフの最初の文書はそのパラグラフの結論を書きます。つまり複数のパラグラフがあったとき、**読み手はパラグラフの最初の文章だけを読んでいけば執筆者の主張が分かるのです。** よって、気になったパラグラフだけを詳細に読んでいけばよく、**頭からお尻まで全ての文章を読むことを読み手に強制しない**のです。プレゼンと違って、文章は相手がすべてを読んでくれるとは限りませんからね。

ちなみに、この本自体もパラグラフ・ライティングに従って書かれています。**だからなのか、恐ろしいほど早く読み終わります。** **もし全てのビジネス文書がこうなったら、生産性が恐ろしく上がるのは想像に難くないですよね。**

# 学んだこと1 文章を論理的に書けるようになった
これはそのままですが、この本に書いてあるコツを実践することで相手に伝わりやすい文章が書けるようになりました。

また、この本にも出てきた話題ですが、例えばビジネス文書を部下が書いて上司がレビューするとき、部下がロジカルな文章を書いてきた方がその文章に対する上司の指摘が増えます。なぜかというと、より上司に部下が伝えたいことがクリアに伝わるからです。**でもそれってロジカルライティングを実践したほうが、より本質的な議論ができるということですよね。** ロジカルライティングは仕事の品質も上げてくれるのです。

# 学んだこと2 論理的に物事を考える癖がついた
この本を読んでから、まず自分が伝えたいことは何なのか？それはなぜか？どうすれば伝わるか？をまずよく考える癖がつきました。


# 学んだこと3 文章を読むのが劇的に早くなった
実はここが一番この記事で言いたいことです。一度論理的な文章とは何なのかを知ったことで、**自分でも驚くくらい文章を読むのが早くなりました。** 恐らく、文章中の主張や根拠を見つけるのが早くなったのだと思います。

私がこの記事で言いたいのは、**この本に書かれている通りに全ての文章を書けということではありません。** 相手に伝わる文章とはなんたるかを理解することが大事だと言っているのです。

# おわりに
皆さんも是非読んでみてください！
AZ-204合格から1年経過したので認定資格を更新してみた

# はじめに

2023/07/22 AZ-204 試験に合格し約1年。認定資格を更新する時期が来ました。
ここでは、来年以降も更新評価をし続けていく自分の為に加え、初めて更新評価を実施される方に向けてやったことを残しておこうと思います。

なお、ここに記す情報は2024/07時点のものです。

# 合格から1年経った筆者のAzure理解レベル

AZ-204取ったは良いものの、もう全く触っていない状況。
Entra IDってなんだっけ......？ ああ、AzureADの新名称か。となるような、そんなレベル感です。

# 更新評価に向けてやったこと

- ひたすら 練習評価 を解き続けました
  - こちらページから飛べます→[Microsoft Certified: Azure Developer Associate - Certifications | Microsoft Learn](https://learn.microsoft.com/ja-jp/credentials/certifications/azure-developer/?practice-assessment-type=certification)
  - <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/ba988b27-65ef-c548-df33-2b702b364172.jpeg" alt="AZ-204練習評価.jpg" width="600" />
  - 7〜8割くらい解けるようになっておけば良いのかなあと思います
- 練習評価をやってて、気になったところだけ公式ドキュメントを詳しく読みました
  - 練習評価では、問題に関連するドキュメントのリンクを貼ってくれるのでやりやすかったです

# 更新評価を受験するに当たって

[Microsoft 認定資格更新評価 – 受験者契約](https://learn.microsoft.com/ja-jp/credentials/certifications/microsoft-certification-renewal-agreement) はよく確認しておきましょう。以下のような行為は禁止されています。

- 評価の質問内容や回答を記録したり公開したりすること
- 人工知能または関連製品もしくはサービスを何らかの方法で利用して更新評価に役立てること

AIに聞くのはダメだけど、[Microsoft 認定資格の更新 | Microsoft Learn](https://learn.microsoft.com/ja-jp/credentials/certifications/renew-your-microsoft-certification)を見る限りWeb検索はして良いっぽい。（もちろんルール変更の可能性はありますが）
>評価は最近の技術的更新と業界の更新に焦点を当てているため、元の試験よりも短く、教材の持ち込みが可能です。

# 感想

- 本試験よりだいぶ難易度やさしめでした
- 45分の評価時間が足りなくなることはよっぽどないと思います
- Web検索が使えるっぽいので、一年前に合格した実力があれば基本的に心配いらないと思います
  - 自分みたいにAzureのことをすっかり忘れてるような方は、基本的なサービス概要とかを思い出しておくことはしたほうが良さそう

# 参照

https://qiita.com/YOS0602/items/ac8cde0ae02594d933b9

https://qiita.com/e99h2121/items/d935c40074a54f28affe
Misskeyをワンライナーでアプデしたいし変更点を確認したい

Misskeyを頻繁にdev最新に追従したかったのでシェルスクリプトを書いた

このスクリプトでバージョンを更新すると以下のようなバージョン表記になる
![スクリーンショット 2024-07-15 22.00.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122390/0f933648-d4be-5ebc-9e79-da520cee0a6a.png)

チェンジログの報告は以下のようなレイアウトになる
![スクリーンショット 2024-07-15 22.01.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122390/252080d9-ab69-cf51-ec0b-66dd7c507963.png)


fishなのは好みなのだけど、bashならコードを少し書き換える必要がある

言うまでもないがdevelop最新はstableじゃないのでビルドできないとかビルドしても起動しないとかが平気で起こるのでちゃんと直せる人しか使ってはいけない

```shell
#!/usr/bin/env fish


alias getchangelog 'git log  --pretty=format:"[%ad] %h %an : %s" --date=relative'
alias checkchangelog 'getchangelog HEAD...origin/develop | cat'
function postfromsystem
    read text

    curl 'http://127.0.0.1/api/notes/create' \
    -X 'POST' \
    -H 'Content-Type: application/json' \
    --data-binary '{"text":"'"$text"'","channelId":null,"poll":null,"cw":null,"localOnly":true,"visibility":"public","reactionAcceptance":"nonSensitiveOnly","i":"***********"}'
end


# system update
apt update -y
apt upgrade -yqq

# pull latest misskey
cd misskey
git fetch  --tags


# チェンジログをこねこねする
checkchangelog | postfromsystem

git reset origin/develop --hard
git submodule update --init

# バージョン表記の差し替え
set date (date '+%m.%d')
set hash (git rev-parse --short HEAD)
jq --arg date $date --arg hash $hash '.version += "-devbuild-\($date).\($hash)"' package.json > package.tmp.json
mv package.tmp.json package.json
npx prettier package.json -w

# install, build, migreate, and restart
pnpm i
pnpm build
pnpm migrate
systemctl restart redis-server
systemctl restart misskey
```

- pullするというかhard resetする対象は origin/develop origin は misskey-dev/misskey である
- dev版だとテキスト（翻訳ファイル）の変更があったときに再ビルドされないので package.json のバージョンを書き換える必要がある
  - このときprettierをかけ直さないと差分がガタガタしてぐぬぬってなる
- たまにサブモジュールが増えたりするので initして updateしてある
- テーブルのマイグレーションがあってもいいようにbuildのあとにmigrateする
- 変更点を投稿したいので、postfromsystemという関数を定義している
  - getchangelogはgit log をいい感じにフォーマットするやつ
  - checkchangelogはHEADからorigin/developの間をgetchangelogするやつ
  - checkchangelog | postfromsystem で標準入出力を使って投稿している


この記事は加筆修正リクエスト、コメント歓迎です。
あるディレクトリから、ｐｄｆファイルのみの Filenameをエクセルのvalueにいれる

　　'以下VBA

Sub ListPDFFilenames()
    Dim folderPath As String
    Dim fileName As String
    Dim cell As Range
    Dim ws As Worksheet
    Dim lastRow As Long
    
    ' シートを設定
    Set ws = ThisWorkbook.Sheets(1)
    
    ' フォルダパスを指定
    folderPath = "C:\Your\Directory\Path\Here\" ' 適切なフォルダパスに置き換えてください
    
    ' フォルダパスの最後にバックスラッシュを追加
    If Right(folderPath, 1) <> "\" Then folderPath = folderPath & "\"
    
    ' 初期設定
    fileName = Dir(folderPath & "*.pdf")
    lastRow = 1
    
    ' PDFファイルを探して一覧表示
    Do While fileName <> ""
        ' PDFファイルの名前をA列に記入
        ws.Cells(lastRow, 1).Value = fileName
        lastRow = lastRow + 1
        fileName = Dir
    Loop
End Sub
RSpec入門：基本構文と使い方を紹介

# はじめに

こんにちは！
社会人一年目の石川です。
記事をご覧いただきありがとうございます。

現在、私はRSpecを勉強中で、学んだことを共有したいと思いこの記事を書きました。この記事では、RSpecの基本的な書き方を紹介し、具体的な例を通して理解を深めていきます。
初心者でも理解しやすいように書いたのでRSpecを勉強したい際はぜひ参考にしてください。

## 目次
1. [RSpecとは？](#rspecとは)
1. [基本的なRSpecの書き方](#基本的なrspecの書き方)
・[describe、context、itの使い方](#describecontextitの使い方)
・[最初のテストケースの例](#最初のテストケースの例)
3. [よく使われるマッチャ（Matchers）](#よく使われるマッチャmatchers)
・[eq、be、include、matchなどの基本的なマッチャ](#eqbeincludematchなどの基本的なマッチャ)
・[複数のマッチャを使用した例](#複数のマッチャを使用した例)
4. [最後に](#最後に)

## RSpecとは？
RSpecはRubyのテストフレームワークで、テストを通じてコードの品質を向上させるために使用されます。
自然言語に近いDSL（Domain-Specific Language）を使用しており、テストコードが読みやすくなるという特徴があります。

:::note info
#### メリット
・コードのバグを早期に発見できる。
・リファクタリングの際に安心して変更ができる。
・テストを通じてコードの設計が明確になる。
:::


## 基本的なRSpecの書き方
RSpecのテストは、`describe`、`context`、`it`の3つの基本構文を使って書かれます。これらを使うことで、テストの構造を分かりやすく整理できます。

### describe、context、itの使い方

`describe`: テスト対象のクラスやメソッドを説明する。
`context`: 特定の状況や条件を説明する。
`it`: テストケース自体を定義する。



### 最初のテストケースの例

RSpecを使ってRubyのクラスやメソッドをテストする方法を紹介します。以下は、電卓クラスの足し算メソッドをテストする例です。


```
describe '電卓' do
  context '数を足す場合' do
    it '2つの数の合計を返す' do
      expect(Calculator.add(1, 2)).to eq(3)
    end
  end
end
```

`describe '電卓' do ... end`
テスト対象のクラスや機能（この場合は電卓クラス）をグループ化するブロックです。

`context '数を足す場合' do ... end`
特定の状況や条件（この場合は数を足す場合）をグループ化するブロックです。

`it '2つの数の合計を返す' do ... end`
具体的なテストケースを定義するブロックです。このブロック内では、電卓クラスの足し算メソッドが1と2を足すと3を返すことを確認しています。


## よく使われるマッチャ（Matchers）
:::note info
#### マッチャ（Matchers）
RSpecにおいて、テスト対象の結果が期待される結果と一致するかどうかを確認するためのツール。
:::

### eq、be、include、matchなどの基本的なマッチャ

RSpecには多くのマッチャが用意されており、さまざまな条件をテストすることができます。以下に、よく使われるマッチャを紹介します。

`eq`: 等しいかどうかをテスト
```
expect(1 + 1).to eq(2)
```
`be`: 真偽値をテスト
```
expect(true).to be(true)
```
`include`: 配列や文字列に特定の要素が含まれているかをテスト
```
expect([1, 2, 3]).to include(2)
```
`match`: 正規表現に一致するかをテスト
```
expect("hello").to match(/ell/)
```
### 複数のマッチャを使用した例

```
describe '複数のマッチャを使用した例' do
  it '複数の条件をテストする' do
    array = [1, 2, 3, 4]
    expect(array).to include(1)
    expect(array).to start_with(1)
    expect(array).to end_with(4)
    expect(array.size).to eq(4)
  end
end
```

`expect(array).to include(1)`
配列に1が含まれていることを確認します。

`expect(array).to start_with(1)`
配列の最初の要素が1であることを確認します。

`expect(array).to end_with(4)`
配列の最後の要素が4であることを確認します。

`expect(array.size).to eq(4)`
配列のサイズ（要素の数）が4であることを確認します。



このように、複数の条件を一つのテストケースでまとめてテストすることで、コードの品質を高めることができます。

## 最後に

最後まで読んでいただきありがとうございました。
この記事を読んでRSpecの理解が少しでも深まれば幸いです。

私はこれから実際にテストコードを書いていくので、実践でさらに理解を深められるように頑張っていきます！
PostgreSQL でハッシュ値を生成する

標準でインストールしたPostgreSQLでは、md5, sha256, sha384, sha512のハッシュアルゴリズムのSQL関数が提供されています。なぜか、sha1がありません。

|関数|説明|戻り値|
|----|----|------|
|md5(バイナリ文字列)|バイナリ文字列のMD5ハッシュ計算し、16進数で結果を返します。 |テキスト型|
|sha256(バイナリ文字列)|SHA256 ハッシュ値を返します。|バイナリ文字列|
|sha384(バイナリ文字列)|SHA384 ハッシュ値を返します。|バイナリ文字列|
|sha512(バイナリ文字列)|SHA512 ハッシュ値を返します。|バイナリ文字列|

MD5のハッシュ値を返します
```
postgres=# select md5('Hello World');
               md5                
----------------------------------
 b10a8db164e0754105b7a99be72e3fe5
(1 row)
```

SHA256のハッシュ値を返します
```
postgres=# select sha256('Hello World');
                               sha256                               
--------------------------------------------------------------------
 \xa591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e
(1 row)

postgres=# select encode(sha256('Hello World'), 'hex');
                              encode                              
------------------------------------------------------------------
 a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e
(1 row)
```

SHA384, SHA512のハッシュ値を返します
```
postgres=# select encode(sha384('Hello World'), 'hex');
                                              encode                                              
--------------------------------------------------------------------------------------------------
 99514329186b2f6ae4a1329e7ee6c610a729636335174ac6b740f9028396fcc803d0e93863a7c3d90f86beee782f4f3f
(1 row)

postgres=# select encode(sha512('Hello World'), 'hex');
                                                              encode                                                              
----------------------------------------------------------------------------------------------------------------------------------
 2c74fd17edafd80e8447b0d46741ee243b7eb74dd2149a0ab1b9246fb30382f27e853d8585719e0e67cbda0daa8f51671064615d645ae27acb15bfb1447f459b
(1 row)

```

## pgcryptoモジュール
pgcryptoモジュール には、汎用ハッシュ関数が提供されていて、md5、sha1、sha224、sha256、sha384、およびsha512のハッシュを生成できます。

### pgcryptoモジュールのインストール
pgcrypto モジュールを以下のコマンドでインストールします

```
postgres=# CREATE EXTENSION PGCRYPTO;
CREATE EXTENSION
```

### 汎用ハッシュ関数

|関数|説明|戻り値|
|----|----|------|
|digest(data text, type text)|バイナリ文字列のMD5ハッシュ計算し、16進数で結果を返します。 |バイナリ文字列型|

type で指定できるアルゴリズムは、md5、sha1、sha224、sha256、sha384、およびsha512 です。

digest関数を使用して、SHA1のハッシュ値を生成します。
```
postgres=# select encode(digest('Hello World', 'sha1'), 'hex');
                  encode                  
------------------------------------------
 0a4d55a8d778e5022fab701977c5d840bbc486d0
(1 row)
```

digest関数を使用して、SHA256のハッシュ値を生成します。
```
postgres=# select encode(digest('Hello World', 'sha256'), 'hex');
                              encode                              
------------------------------------------------------------------
 a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e
(1 row)
```

## 参照情報
* [バイナリ文字列関数と演算子](https://www.postgresql.jp/docs/14/functions-binarystring.html)
* [pgcrypto モジュール](https://www.postgresql.jp/docs/14/pgcrypto.html)
* [PostgreSQLでpgcryptoを使ったデータ暗号化](https://qiita.com/niharu/items/f812ca3ba924ed94eefd)
npの[-1]が便利

### numpyのndarrayで、マイナスの添字でアクセスすると末尾側からアクセスできます。

末尾にアクセスするときによく-１でアクセスしています。

```python
import numpy as np
x = np.array([1, 2, 3, 4, 5])
print(x[-1])
```
(出力)

    5


### -1以外にもアクセスできます。

```python
print(x[-2])
```
(出力)

    4

### 配列の一つ前の要素からの変化量（＝速度）を求めたいとき

スライス表記と合わせて一瞬で配列すべての速度を求められます。

```python
diff = x[1:] - x[:-1]
# ↑ x[1:len(x)] - x[0:len(x)-1] と一緒
print(diff)
```

(出力)

    [1 1 1 1]

### ２連で使えば

加速度もでますよね

```python
diff = x[1:] - x[:-1]
acc = diff[1:] - diff[:-1]
print(acc)
```

(出力)

    [0 0 0]



らくちんにアクセスできて地味に便利です
【セッションレポート】「AlloyDB 徹底解剖 -高可用性、性能を生み出すアーキテクチャと運用負担を軽減するためのポイントを学ぶ-」に参加しました

# はじめに
本記事はDB Tech Showcase 2024 の1日目(7/12)において Google Cloud の江川さんが講演された「AlloyDB 徹底解剖 -高可用性、性能を生み出すアーキテクチャと運用負担を軽減するためのポイントを学ぶ-」のレポートです。

# 公式セッション紹介
> AlloyDB for PostgreSQL は、PostgreSQL と互換性を持つフルマネージド型のデータベースサービスで、極めて要求が厳しいデータベース ワークロードをモダナイズできます。本セッションでは、AlloyDB の概要とアーキテクチャ、運用の Autopilot 機能や利用するにあたって押さえておくべきポイントをご確認いただければと思います。

# 発表資料
- 未公開(公開するという話をされてました)

# 概要／おすすめポイント
前日のGoogle Cloudの佐藤さんのセッション([【セッションレポート】「細かすぎて伝わらない！Spanner のユニークで実用的な機能や特徴」に参加しました](https://qiita.com/asahide/items/1b3bb4b907871aa51394))とは別の角度で、Google Cloud におけるデータベース全般の説明からAlloyDBに、そしてAlloyDBのアーキテクチャ含めてお話をされていました。
なので、セッション資料(もしくはアーカイブ)が公開されたらその資料を確認することでGoogle Cloudのデータベース群におけるAlloyDBの立ち位置から、AlloyDBの特徴含めて確認することができると思います。

# セッション内容の紹介

AlloyDBのアーキテクチャ、優位性について時間を割いて説明されていました。
特にストレージレイヤについて、次のblogよりも細かく話されてたので、資料公開されたら改めて確認しておきたいと思います。

- [AlloyDB for PostgreSQL の仕組み: データベース対応のインテリジェントなストレージ](https://cloud.google.com/blog/ja/products/databases/alloydb-for-postgresql-intelligent-scalable-storage)

そのほか、[ニアゼロダウンタイムのメンテナンス](https://cloud.google.com/blog/products/databases/understanding-alloydb-business-continuity-capabilities?hl=en) や [適応型自動バキューム](https://cloud.google.com/blog/ja/products/databases/alloydb-for-postgresql-under-the-hood-adaptive-autovacuum?hl=ja) 、そしてAlloyDBの一番の特徴である [HTAP(カラム型エンジン)](https://cloud.google.com/blog/ja/products/databases/alloydb-for-postgresql-columnar-engine?hl=ja) について、説明されていました。

耐障害性や業務継続性、そして分析ワークロード対応と多機能ですね～。

# まとめ

このセッションでは~~もちろん~~話は出なかったのですが、AlloyDBはAWSのAmazon Auroraとよく比較されます。
性能などはいったん横に置いておくとして、DBaaSの機能としてはAuroraはMySQL互換がある、Aurora ServerlessやGlobal Databaseが利用できる、フルマネージドのBlue/Greenデプロイができる、といったところに対し、AlloyDBはHTAP(カラム型エンジン)が利用できることとニアゼロダウンタイムのスケーリングが行えること(AuroraのBlue/Greenで代替可能？)、後はAlloyDB Omniとしてオンプレミス環境などにもデプロイが可能となる、あたりになるでしょうか。
現時点では機能的にはAuroraの方がいろいろと実装されていますね。

一方AlloyDBはBigQueryからのフェデレーテッドクエリのサポートやVertex AIとの統合など、だんだんとGoogle Cloudの他の機能とも統合されるようになってきており、今後はより中核的なサービスとなっていくと思われます。

これも今回は話に出ませんでしたが、Oracle Cloudとの接続が始まる話もあり、Google Cloudでもデータベースを採用するにあたって様々な選択肢が出てきて、今まで以上に頭を悩ませることにもなりそうですね。
【Tips】Windows サインインで、Entra ID Userからローカルユーザに切り替える方法

# 1.はじめに

本記事は、Entra JoinedしているWindows サインインで、Entra ID Userからローカルユーザに切り替える方法に関して、ご紹介します。
初めて、Entra IDを利用した方向けのTipsです。

# 2.アカウントとは

Windowsサインインに利用できるアカウントは、以下４パターンがあります。
基本的には、個人用途は、ローカルアカウント、Microsoftアカウントとなり、企業用途は、職場または学校アカウント、ドメインアカウントになります。

* ローカルアカウント
* Microsoft アカウント
* 職場または学校アカウント
* ドメインアカウント

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/f58162d7-2ac1-2482-f044-9db030779be7.png)
<br>

# 3.Tips: Entra ID Userからローカルユーザに切り替える方法

Entra 参加済みのWindows PCは、以下キャプチャのように、サインイン先が***職場または学校アカウント***になっています。
そのため、ローカルアカウントを入力しても、Windowsにサインインすることができません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/2303579b-1a6b-1864-6df9-f27074a0f41d.png)
<br>

そんなときは、ユーザ名のところに、```.\```を入力します。
するとサインイン先が、PC名に代わり、ローカルアカウントでサインインできるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256868/b764402e-8156-78ce-f61d-f35f8f8e49a5.png)

# 4.おわりに

昔、Windows PCをEntra Joinedしたときに、Windowsのサインインをローカルアカウントに戻す方法が分からなくなってしまい、焦ったことを思い出して記事にしました。何かのお役に立てば幸いです。