OmniAICreator/Qiita-1.07M huggingface dataset:
phpとlaravelバージョンアップデート（2024版）

# 事前準備
| OS/ミドルウェア | 現バージョン　| 新バージョン |
| --------------- | --------------- | ------------ |
| PHP | 7.x系 | 8.x系 |
| Laravel |  5.x系 | 11.x系 |
# 更新作業
### 1. Exception更新
Laravel 7からExceptionはThrowableに更新するので、更新してください。
- app/Exceptions/Handler.php更新
```
-use Exception;
+use Throwable;

-    public function report(Exception $e)
+    public function report(Throwable $e)

-    public function render($request, Exception $exception)
+    public function render($request, Throwable $exception)
```
- 他のファイルにてExceptionが利用される場合、更新
### 2. モーダルで```protected $dates```更新
```
- protected $dates = ['created_at', 'updated_at'];
+ protected $casts = [
+     'created_at' => 'datetime',
+     'updated_at' => 'datetime',
+ ];
それとも
+ protected function casts(): array
+ {
+     return [
+     'created_at' => 'datetime',
+     'updated_at' => 'datetime',
+     ];
+ }
```
### 3. proxy更新
fideloper/proxyがストップされたので、laravelのproxyを利用してください。
```
source/app/Http/Middleware/TrustProxies.php

-use Fideloper\Proxy\TrustProxies as Middleware;
+use \Illuminate\Http\Middleware\TrustProxies as Middleware;

-    protected $headers = Request::HEADER_X_FORWARDED_ALL;
+    protected $headers =
+        Request::HEADER_X_FORWARDED_FOR |
+        Request::HEADER_X_FORWARDED_HOST |
+        Request::HEADER_X_FORWARDED_PORT |
+        Request::HEADER_X_FORWARDED_PROTO |
+        Request::HEADER_X_FORWARDED_AWS_ELB;
```
### 4. composer更新
- 旧のcomposer.jsonとcomposer.lockを削除して、laravel11のcomposer.jsonを作成する
- 旧のcomposer.jsonの必要なパッケージを新composer.jsonに以下のコマンドで追加する
```
composer require パッケージ名
composer require --dev パッケージ名
```
修正完了してからインストール
```
composer install
```
### 5. 古いヘルパー対応
array_excel、str_pluralなどヘルパー関数が削除され他ので、
- 案１：利用している旧関数を該当関数に直接的に修正してください
関数が多いなので、ここに確認してください。
https://github.com/laravel/helpers/blob/master/src/helpers.php
```
// 前
array_except($array, ['key']);
str_plural('car');

// 後
Arr::except($array, ['key']);
Str::plural('car');
```
- 案２：laravel/helpersパッケージをインストールする。旧のヘルパー関数が利用される
```
composer require laravel/helpers
```
### 6. redirect()
```
Route::resource('user', 'UserController');

- return redirect(route('user.edit', ['id' => $user['id']]));
+ return redirect(route('user.edit', ['user' => $user['id']]));
```
### 7. validationData()
```
- protected function validationData()
+ public function validationData()
```
### その他
アップグレードガイドを参考ながら、修正しえてください。
https://laravel.com/docs/6.x/upgrade
# ビュー
### 1. コンポーネント更新
```
// 前
@component('components.alert')
    Alert Body
@endcomponent

// 後
<x-alert>
    Alert Body
</x-alert>
```
### 2. ビューのlaravelcollective/htmlを更新
全てビューファイルでの以下のような「Form::」のコードが利用できないです。
```
{!! Form::text('name', 'default value', ['class' => 'form-control']) !!}
```
以下の案に修正してください。案２がおすすめです
案１：htmlソースに変わる
```
<input type="text" name="name" value="default value" class="form-control">
```
案２：spatie/laravel-htmlを利用して、「Form::」のソースを修正
```
{!! html()->text('name')->value('default value')->class('form-control') !!}
```
# ビュー更新ツール
ビューの修正はかなり大変になるので、ビュー交換ツール作成して、別の表記で登録させていただきます。

### 以上です。
[自分用メモ]DockerFileでAnsible入りコンテナを構築

### Dockerイメージの作成手順

1. rootユーザに移行する

2. Dockerfileを格納するディレクトリを作成

   ```
   mkdir /home/vboxuser/dockerFiles/ansibleDockerFile
   ```

3. 作成したディレクトリに移動

   ```
   cd /home/vboxuser/dockerFiles/ansibleDockerFile
   ```

4. Makefileを作成

   ```
   vim Makefile
   ```

   以下の内容を記述

   ```
   # Rocky Linux 9のベースイメージを取得
   pull-image:
           docker pull rockylinux:9
   
   # Ansibleコンテナのイメージをビルド
   build-ansible-container-image: pull-image
           docker build -t ansible-container-image .
   ```

5. Dockerfileを作成

   ```
   vim Dockerfile
   ```

   以下の内容を記述

   ```
    FROM rockylinux:9
    
    # EPEL リポジトリを追加
    RUN dnf install -y epel-release
    
    # dnfリポジトリをクリーンアップ
    RUN dnf clean all
    
    # dnfリポジトリをアップデート
    RUN dnf update -y
    
    # 必要パッケージをインストール
    RUN dnf install -y iproute iputils
    
    # Ansibleをインストール
    RUN dnf install -y ansible
   ```

   <span style=color:red>最新のAnsible（Ansible Core 2.18）をインストールするには、pipxコマンドを使用する必要があるかも。公式ドキュメント：https://releases.ansible.com/</span>

6. Makefileを実行

   ```
   make build-ansible-container-image
   ```

7. 作成したイメージの確認

   ```
   docker images
   ```

   以下のように、作成したDockerイメージが表示される

   ```
   [root@vbox ansibleDockerFile]# docker images
   REPOSITORY       TAG       IMAGE ID       CREATED          SIZE
   ansible_rocky9   latest    d97694f8ebc0   30 minutes ago   902MB
   rockylinux       9         9cc24f05f309   14 months ago    176MB
   ```

### Dockerコンテナのステータス確認

1. コンテナを起動する

   Rocky Linux 9 の Docker イメージは、デフォルトで /bin/bash を実行するようにはなっていないため、コンテナ起動時に何も実行するコマンドを指定しないと、すぐに終了する。

   そのため、以下のコマンドでコンテナを起動する
   ```
   docker run -d --name ＜任意のコンテナ名＞ ansible-container-image sleep infinity
   ```
   sleep infinity は、コンテナ内で無限にスリープし続けるコマンドである。これによりコンテナが起動し続け、docker ps で確認できるようになる。
   以下はコマンド例
   ```
   docker run -d --name ansible-container ansible-container-image sleep infinity
   ```

2. コンテナの起動状況を確認

   以下コマンドを実行

   ```
   docker ps
   ```

   結果、以下のようにansible-containerが表示されれば、「ansible-container」という名前のコンテナの構築に成功している

   ```
   CONTAINER ID   IMAGE                     COMMAND            CREATED         STATUS         PORTS     NAMES
   44876981f384   ansible-container-image   "sleep infinity"   7 seconds ago   Up 7 seconds             ansible-container
   ```

3. コンテナにログインする

   ```
   docker exec -it ansible-container bash
   ```

4. Ansibleがインストールされているか確認

   ```
   ansible --version
   ```

   以下のようにAnsibleバージョンが表示されればOK

   ```
   ansible [core 2.14.17]
     config file = /etc/ansible/ansible.cfg
     configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
     ansible python module location = /usr/lib/python3.9/site-packages/ansible
     ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
     executable location = /usr/bin/ansible
     python version = 3.9.21 (main, Dec  5 2024, 00:00:00) [GCC 11.5.0 20240719 (Red Hat 11.5.0-2)] (/usr/bin/python3)
     jinja version = 3.1.2
     libyaml = True
   ```
Figmaでアニメーションを実装する方法




<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457930/6e6211d9-3a9d-c901-a8c0-48be175ad39f.gif" width="600">

この実装方法です．

## レイヤ構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457930/16e458ad-23cc-3e6d-f756-6fec7112cbe9.png)

## 図（コンポーネントセット）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457930/0f8bd63a-0d3f-74e9-b304-9a9d15a6d282.png)

[補足]
コンポーネントセット内の接続を行う際は，frameとframeを繋ぐこと




## 手順
1. 図形の作成（1個）
2. 上記をframe化しそのframeを4つコピー
3. 図形だけ（今回はEllipse7だけ）を各々回転させる
4. 全frameを選択して，コンポーネントセットの適用（ここ注意）
全Frameを選択した状態で，右上の「コンポーネントセットを作成」を押す

![コンポーネントセット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457930/eeae4781-64fc-a5d8-6f91-163fdb23d1be.png)

5. 画面右上にある「プロトタイプ」ボタンを押してから，コンポーネントセット内のframe同士を接続する．設定内容は下記．プロパティ1の所には，接続先のframeを記入．ここで，注意が必要で，図形からの接続にならないよう，まず，frameを左画面のレイヤーの一覧で選択してから，次のframeに接続する．この接続は，最終的に，1週するように気をつける．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457930/1cc375fc-4769-8e77-b869-690f2f94534c.png)


そして，アセットを押し，作成したコンポーネントセット名を検索．
コンポーネントセット＝インスタンス（動きの設定がされている）
これを，レイヤーに貼るだけで，指定した動きをしてくれる．

![asset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457930/f84bf127-97b1-61d3-18ae-ed1d92b1a604.png)
KUROKO Connectの監視機能を試してみた

KUROKO Connectは遠隔地のリモート保守や構築作業をより安全にできるリモート接続サービスです。実は、KUROKO Connectはリモート接続機能以外にも提供している機能があります。
#### それが監視機能です。
以下の図のような現地に設置したKUROKO Gearから、TCPポート監視、PINGによる応答監視が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/431d8f2b-bae7-be53-ae89-d6fb66933a2a.png)

早速設定を試してみたいと思います。

# 1. ログイン

まずは、KUROKO Connectのコンソール画面からログインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/b1efc951-a989-077f-14a0-d705e007dfe2.png)

# 2. Apps一覧の選択

メニューの　管理＞Apps＞Apps一覧をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/a2199f3c-170b-6529-66fc-0027006e684f.png)

# 3. 監視設定一覧を選択

監視設定したい　KUROKO Gearの「Actions」をクリックして、「監視設定一覧」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/e2f1b196-9088-8682-18e1-58771997ce2b.png)

# 4. 監視設定情報の登録

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/03cf4577-1962-1b49-02fc-1d9a02280b33.png)

# 5. IPアドレスの設定
現地のIPアドレスでの設定を行います。
今回は FW管理画面： TCP 192.168.250.254 443と、Windows サーバー： ICMP 192.168.250.112を登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/bb8474c5-ac46-54b3-d6f6-277bde58e275.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/01eb7b75-c645-dfb4-46a6-9690970c272a.png)


登録後、すぐに監視が始まります。
クラウド画面から監視設定ができ、現地の監視がすぐに始まるので非常に便利ですね。

# 6. 監視異常の確認

それでは、監視異常を発生させます。
Windowsサーバーを停止します。
PING応答がなく、KUROKO Connectのダッシュボード上に下記の様にエラーメッセージが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/30216b17-b7d9-8ccb-ed8a-9ef4aa319824.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/e04533c4-270c-3393-1688-8c65adca458e.png)

# 7. 監視の一時停止
監視を一時停止したい場合は、「監視を無効にする」をクリックすると監視を停止できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/d385c946-f2a4-4582-48ac-9905a8eb9fda.png)

管理異常を検知し、KUROKO Connectのダッシュボードで確認できました。
KUROKO Connectでは、監視エラーや復帰をメールで受け取ることもできますので、リモート接続先の簡易監視機能としても活用してみてください。
🌎 Terraform で AWS Internet Gateway を作成するシンプルな手順

# 📌 概要

Terraform を使って AWS の Internet Gateway (IGW) を作成する方法 を解説します🚀

Internet Gateway を使うと、VPC 内のリソース（EC2 など）がインターネットと通信できるようになります ✨  

# 📌 事前に準備するもの

##### main.tf

main.tf の作成がまだの方は以下の記事を参考にファイルを作成してください。

https://qiita.com/nobumory/items/624275ac0b08660a2637

##### VPC

VPCを作成していない場合は以下を参考に作成します

https://qiita.com/nobumory/items/72ab7a109b24b5a08287

# 📌 ディレクトリ構成

以下のようなディレクトリ構造でファイルを配置してください。

```
terraform-project/
│── main.tf                # ルートディレクトリのメイン設定
│── modules/
│   ├── vpc/
│   │   ├── main.tf        # VPCを定義
│   ├── internet_gateway/
│   │   ├── main.tf        # インターネットゲートウェイを定義
```

# 📌 コード

### main.tf

Terraform のプロバイダー設定とモジュールの読み込み を行います。

```hcl
# AWS プロバイダーの設定
# 利用するリージョンを "ap-northeast-1"（東京）に指定
provider "aws" {
  region = "ap-northeast-1"
}

# VPC モジュールの読み込み
# "./vpc" ディレクトリにある VPC モジュールを利用
module "vpc" {
  source = "./vpc"
}

# インターネットゲートウェイのモジュールを読み込み
# VPC モジュールで作成された VPC の ID を渡して関連付ける
module "internet_gateway" {
  source = "./internet_gateway"
  vpc_id = module.vpc.vpc_id
}
```

### vpc/main.tf

VPC（Virtual Private Cloud）を作成し、VPC の ID を出力します。

```hcl
# AWSプロバイダーの設定
provider "aws" {
  region = "ap-northeast-1"
}

# VPCの作成
resource "aws_vpc" "main" {
  cidr_block = "192.168.250.0/24"
  tags = {
    Name = "sandbox-terraform"
  }
}

output "vpc_id" {
  value = aws_vpc.main.id
}
```

### internet_gateway/main.tf

Internet Gateway（IGW） を作成し、指定した VPC にアタッチします。

```hcl
# VPC の ID を受け取る変数を定義
# この Internet Gateway を関連付ける VPC の ID を指定する
variable "vpc_id" {
  description = "Internet Gateway を関連付ける VPC の ID"
  type        = string
}

# Internet Gateway を作成
# 指定された VPC にアタッチされる
resource "aws_internet_gateway" "main" {
  vpc_id = var.vpc_id

  tags = {
    # Internet Gateway に "sandbox-terraform" という名前タグを付与
    Name = "sandbox-terraform"
  }
}

# 作成した Internet Gateway の ID を出力
# 他のリソースで参照できるようにするため
output "internet_gateway_id" {
  value = aws_internet_gateway.main.id
}
```

[参考リポジトリ]

https://gitlab.com/Morykun/sandbox-terraform

# 📌 実行

準備ができたらコマンド実行しましょう！

1. `terraform init`
2. `terraform plan`
3. `terraform apply`

Terraform関連のコマンドについては以下の記事を参考にしてください ☺️

https://qiita.com/nobumory/items/9f3c84f016fbf37363ed
Power Apps と Power Automate を連携させる！アプリでボタンを押してフローを作動させる方法！～フロー応答編～

# 概要

Power Apps のアプリのボタンを押すことで Power Automate のフローを呼び出し実行させることができます。
そして実行結果をPower Apps側へ応答させることも可能です。
Power Apps のみでは実行できない処理や、アプリを動かしている裏で膨大なデータの処理を行わせたい時に役立ちます！

今回はフローの実行が完了したことをアプリへ応答するやり方をご説明します！
アプリからPower Automateへ値を渡し、フローを実行させる方法については以下の記事にて説明しておりますので、最初から作成される場合は以下の記事を先にお読みください。

https://qiita.com/Sanwa_Paint/items/84ca1e81f90cea837905


## 作成手順
+ Power Automate 側にて結果を返す処理の設定
+ Power Apps 側にて結果を受け取る処理の設定
+ ~~(応答内容に条件を追加する場合)~~
+ 動作確認


### 1\. Power Automate 側にて結果を返す処理の設定
上記の記事内ですでに作成が完了しているフローの最後に
**「応答」** アクションを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/fc0fca20-236e-9143-e931-f0f9db82b5a9.png)

応答で返す値を設定します。
左側につけるタイトルはPower Apps上で使用するので分かりやすい名前にしておきましょう。
`今回は結果表示なのでResultMesとつけています`
右側には出力させてい値をいれてください。
`フローが作動したことを想定して「フローが正常に完了しました」`
としています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/9a26c3e5-38ea-5479-7335-7cc33fc201e5.png)
##### ここまで完了したらPower Appsのフローは一旦保存してください。
### ２\.次は Power Apps側での受け取りについて説明します。

Power Apps ボタンプロパティのOnselectを以下のように設定します。
```ruby:Power Apps ボタンの OnSelect
    Set(フロー結果, フロー名.Run())
```
`Set関数`を使うことによりフローの応答結果を`フロー結果`という変数に格納します。

次に適当なテキストラベルを置きます。
テキストプロパティを以下のように設定します。
```ruby:Power Apps ラベルテキスト
    フロー結果.ResultMessage
```

### 3\. 動作確認
1\. PowerApssでアプリを実行しボタンをクリック
2\. フローが正常に実行された場合、画面上のラベルに応答メッセージが表示されることを確認。
【Teamsへの投稿】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/23f3066f-5364-4c64-7573-6001d66944a6.png)
【アプリ側での応答の表示】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/ae49529f-e0b3-d55a-417f-bdde21086796.png)


これで、PowerApps上でフローの実行結果をリアルタイムに表示できるようになります！
同時に２つのアプリを構築していかないといけないので大変かもしれませんが
慣れてくると一度になんこも引数を渡せたり、条件のフィルターに使えたりと使いこなせれば大活躍間違いなしのテックになると思います!!!!
たくさんのPower Automateのテクニックと使い合わせて、アプリ開発をさらによりよい者にしていきましょう！！！

御覧いただきありがとうございました！！￥
メール技術を理解するために用語まとめてみた

# はじめに

エンジニアのみなさま、日々の学習お疲れ様です。
また本記事まで足を運んでいただき本当に感謝です。

現在Androidメールアプリの案件に参画してます。

『聞いたことはあるけどどんな意味だっけ？』が多いので、用語集作ってみました。
理解が足りないものはこの投稿をみながら、理解を深めていければと思います。


---


# SMTP (エスエムティーピー)  
### Simple Mail Transfer Protocol  
メール送信に使用される通信プロトコル。
送信者のメールサーバーと受信者のメールサーバーとの間でメールを転送する。

# POP (ポップ)  
### Post Office Protocol  
メールの受信に使用されるプロトコル。
サーバーに保存されたメールをクライアントにダウンロードし、サーバーから削除する。

# IMAP (アイマップ)  
### Internet Message Access Protocol  
メールの受信に使用されるプロトコル。
サーバー上にメールを保持し、クライアントはそのコピーを操作する。

# メールヘッダ
メールの送信者、受信者、件名、送信日時など、メールに関するメタ情報を含む部分。

# SMTP AUTH (エスエムティーピー オース)  
### SMTP Authentication  
SMTP通信において、送信者の認証を行うための仕組み。

# OP25B
### Outbound Port 25 Blocking  
スパムメール防止のため、インターネットサービスプロバイダー（ISP）がポート25経由のメール送信を制限する。

# 文字コード
メールで使用される文字の符号化方式。例: UTF-8, ISO-8859-1 など。

# MIME (マイム)  
### Multipurpose Internet Mail Extensions  
メールに添付ファイルや非ASCII文字を含めるための規格。

# HTMLメール 
HTML形式で作成されたメール。
リッチなレイアウトやスタイルを使用できる。

# SPF (エスピーエフ)  
### Sender Policy Framework  
ドメインの所有者が、送信元IPアドレスを指定して、不正な送信者からのメールを防ぐための仕組み。

# DKIM (ディーキム)  
### DomainKeys Identified Mail  
送信メールにデジタル署名を追加し、送信者のドメインが正当であることを確認する技術。

# DMARC (ディーマーク)  
### Domain-based Message Authentication, Reporting & Conformance  
SPFとDKIMの検証結果を基に、メールが不正でないかを確認するポリシーを設定する仕組み。

# STARTTLS (スタート・ティーエルエス)  
メール通信を暗号化するために、既存の非暗号化通信にTLSを導入する方法。

# PoP over SSL/TLS (ポップ オーバー エスエスエル／ティーエルエス)  
### Post Office Protocol over SSL/TLS  
POP3プロトコルにSSL/TLS暗号化を追加して、通信の安全性を高める方法。

# IMAP Over SSL/TLS (アイマップ オーバー エスエスエル／ティーエルエス)  
### Internet Message Access Protocol over SSL/TLS  
IMAPプロトコルにSSL/TLS暗号化を追加して、通信の安全性を高める方法。

# SMTP over TLS/SSL(エスエムティーピー オーバー ティーエルエス／エスエスエル)  
### Simple Mail Transfer Protocol over TLS/SSL  
SMTPプロトコルにTLS/SSL暗号化を追加して、送信メールの通信の安全性を高める方法。

# S/MIME (エスマイム)  
### Secure/Multipurpose Internet Mail Extensions  
メールの暗号化とデジタル署名を行うための標準規格。

# PGP (ピージーピー)  
### Pretty Good Privacy  
メールの暗号化とデジタル署名を提供する技術。

# オプトイン 
ユーザーが自発的に何かを受け取ることを許可すること。
例えば、メールマーケティングでの購読の同意。

# オプトアウト  
ユーザーが受け取ることを停止することを選択すること。
メールマーケティングでの購読解除の手続き。


# さいごに

この記事に出てくる用語をピックアップしました。
この記事に書かれてる本が分かりやすいと評判のため、早速購入して読んでみたいと思います^ ^

https://dev.classmethod.jp/articles/book-review-email-technology-textbook/

今回の投稿内容薄いので、『なぜ用語集の技術や仕組みが使われているのか？』も、理解が出来た段階で順次更新をかけていければと思います。

# おまけ

弊社のご紹介もさせてください！

### 「日本で一番エンジニアが成長できる会社を創る」

https://prum.jp/

### エンジニアリングの募集

https://www.wantedly.com/projects/1808638

### PM・Webディレクションの募集

https://www.wantedly.com/projects/1355235

### セールス・事業開発の募集

https://www.wantedly.com/projects/1792065

### コーポレート系の募集

https://www.wantedly.com/projects/1752874

### コンサルティングの募集

https://www.wantedly.com/projects/1794481

弊社メンバーは日々学習した内容をアウトプットしております！
少しでもご興味を持たれた方は求人を見てみてください！
ご応募もお待ちしております！

### 最後までご覧いただき、ありがとうございました！
Google ColabでSpeechToTextしたい！

インストールして
```
!pip install --upgrade google-cloud-speech
```
からの
``` speechToText.py
from google.cloud import speech_v1p1beta1 as speech
import time

# サービスアカウントファイルを使用して認証する
client = speech.SpeechClient.from_service_account_json('credentials.json')

# 音声ファイルが格納されている実際の GCS バケット URI に置き換えてください
gcs_uri = "gs://test/test.mp3"

audio = speech.RecognitionAudio(uri=gcs_uri)
config = speech.RecognitionConfig(
    encoding=speech.RecognitionConfig.AudioEncoding.MP3,  # ファイルタイプに合わせて更新済み
    language_code="ja-JP",  # 言語を日本語に設定
    sample_rate_hertz=16000  # ファイルのサンプルレートと一致していることを確認
)

# 大きなファイルに対して非同期認識を使用する
operation = client.long_running_recognize(config=config, audio=audio)
print("Waiting for operation to complete...")
while not operation.done():
    # metadata が取得できる場合は進捗を表示（存在しなければ「処理中」と表示）
    metadata = operation.metadata
    if metadata is not None and hasattr(metadata, "progress_percent"):
        print("進捗: {}%".format(metadata.progress_percent))
    else:
        print("処理中...")
    time.sleep(10)
print("認識処理完了！")
response = operation.result()

# 転写結果を表示
for result in response.results:
    print("Transcript: {}".format(result.alternatives[0].transcript))
```

できた。
あらかじめ音声ファイルは「Cloud Storage」に入れておいてね
あと認証ファイルも必要っぽい（サンプルは使ってなかった・・）

https://github.com/korniichuk/google-speech
Kotlinという言語の将来について気になった


# はじめに
AndroidエンジニアとしてKotlinを主軸にして開発していますが、Multiplatformの出現によりAndroid開発も無理にKotlinでやる必要もないのかなっと思い、気になったので軽くではありますが、Kotlinについて調べてみました。
これからエンジニアを目指そうとしている人や既にエンジニアだけど、他の言語に挑戦しようといてる人の中でKotlinについて興味がある人の参考になればいいなと思います。



# 参考記事

個人的に気にしながら見たらいいんじゃないかというポイントは
・できることの多さ
・値段
・案件の多さ
・開発の際のわかりやすさ

https://tech.hipro-job.jp/column/25282



https://career.levtech.jp/guide/knowhow/article/821/




# Geminiに聞いてみた
Q. Android開発におすすめの言語は？

A. 下記の記事では５つの記事を紹介しているが、最新の Android 開発の主な選択肢として 2つの言語が際立っています。

---

**・Kotlin**
>Google が Android 開発に推奨する言語で、GoogleはKotlinに対しての優れたサポートを提供しており、公式ドキュメントなどで使用される言語です。

モダンで簡潔
>Kotlin は、Java よりも簡潔、表現力豊かで、安全になるように設計されています。これにより定型コードが削減され、null ポインター例外などの一般的なエラーの防止に役立ちます。

Java との相互運用性
>Kotlin は Java と 100% 相互運用可能です。これは、既存の Java プロジェクトで Kotlin を使用でき、Kotlin プロジェクトで Java ライブラリを使用できることを意味します。これにより、Kotlin への段階的な移行が容易になります。

Jetpack のサポート
> Kotlin は、Android アプリを構築するための推奨方法である最新の Jetpack ライブラリの主要言語です。

など...


---

**・Java**
レガシーコード
>Java は、長い間 Android で主流の言語でした。 Java で書かれた既存の Android コードが膨大にあります。

大規模なコミュニティ
> Java には大規模なコミュニティと豊富なリソースがあります

段階的な衰退
>Java は依然として重要ではありますが、新しい Android プロジェクトでは段階的に Kotlin に置き換えられています。

など...


https://radixweb.com/blog/programming-languages-for-android-app-development


---

Q. マルチプラットフォームでおすすめの言語は？

A. マルチプラットフォーム開発は、クロスプラットフォーム開発とも呼ばれ、単一のコードベースから複数のオペレーティング システム (Android、iOS、Windows、macOS、Web など) で実行できるアプリケーションを構築することを意味します。
マルチプラットフォーム開発で人気の言語の検索結果と現在の業界トレンドに基づいて、マルチプラットフォーム開発に最適な言語とフレームワークを以下に示します。

---

**Kotlin** **(Kotlin Multiplatform)**
概要
>Android アプリと iOS アプリの間で共通のコード (ビジネスロジック、ネットワーキング、データ処理) を共有できると同時に、プラットフォーム固有の UI コードをネイティブ言語 (Androidの場合は Kotlin/Java、iOSの場合は Swift/Objective-C) で作成できます。

長所
>ネイティブ コードにコンパイルされるため、優れたパフォーマンスが得られます。
既存のプロジェクトに段階的に統合できます。
強力なAndroidサポートを受けているのでAndroid 開発で Kotlin の利点をすべて活用できます。

短所
>UI はネイティブです: プラットフォームごとに個別の UI を構築する必要があります。
比較的新しいく、まだ進化しているため、成熟していません。
----
**Dart** **(Flutter)**
概要
>Flutter は単一のコードベースを使用して、Android、iOS、Web、デスクトップ用のアプリを構築します。独自のレンダリング エンジンを使用するため、ネイティブ UI コンポーネントに依存しません。

長所
>単一のコードベースから複数のプラットフォーム用のアプリを構築できます。
Flutter のホット リロード機能を使用すると、変更を即座に確認できるため、開発がスピードアップします。
美しい UIを持つ Flutter は、視覚的に魅力的でカスタマイズ可能な UI で知られています。
Flutter アプリは、ネイティブ アプリほど高速ではありませんが、優れたパフォーマンスを発揮します。




短所
>真のネイティブではない。 Flutter はネイティブ UI コンポーネントを使用しないため、見た目や操作感が若干異なる場合があります。
アプリのサイズが大きくなる。 Flutter アプリはネイティブ アプリよりも大きくなる可能性があります。

---

**JavaScript** **(React Native)**
概要
>JavaScript を使用してモバイル アプリを構築するフレームワークです。

長所
>コードの再利用: Android と iOS の間でコードを共有できます。
JavaScript と React を知っていれば、React Native を簡単に学ぶことができます。

短所
>ネイティブ アプリと比較してパフォーマンスの問題が発生する場合があります。
一部の機能については、ネイティブ コード (Java/Kotlin/Swift/Objective-C) を作成する必要がある場合があります。
デバッグは、ネイティブ アプリよりも難しい場合があります。
---

**C#** **(Xamarin)**

概要
>Microsoft によって開発された言語で、Xamarin は C# を使用してクロスプラットフォーム アプリを構築するためのフレームワークです。

長所
>アプリはネイティブに近いパフォーマンスを実現できます。
プラットフォーム間で大量のコードを共有できます。
しばらく前から存在しており、成熟したエコシステムを備えています。
Microsoft によってサポートされています。

短所
>他のオプションよりも急峻な学習曲線を持つ可能性があります。


---
Gemini的には一番最初にKotlinを紹介していて、Google的にも推奨している言語はKotlinのようですね。
特定のサーバからWindows11端末でファイルをコピーするとコピー元のタイムスタンプが保持されない

# はじめに
Windows10のサポート期限が迫ってきていることで、Windows11に切り替えている方が多いと思いますが、私もその一人でつい最近お仕事で使用している端末を入れ替えました。
その後、端末で作業を行っていく中でファイルのコピーでタイムスタンプの挙動が変わっていることに気づきたので調べてみました。

# 現象
Windows11の端末にて特定のサーバからサーバ、ローカル環境にファイルをコピーしたら、本来はコピー元のタイムスタンプがコピー先でも維持されるが、コピーを実施した時刻に上書きされた

# 調査結果
Windows11向けWindows UpdateにてKB503912がインストールされたことにより、
以下のようにエクスプローラーの挙動が変更されました。
それにより、特定のサーバからコピーしたファイルのタイムスタンプが保持されなくなりました。

:::note info
この更新プログラム以降、エクスプローラーは Web のマーク (MoTW) タグを、信頼されていない場所から取得したファイルとフォルダーに追加します。 MapUrlToZone がファイルを "インターネット" として分類すると、そのファイルもこのタグを取得します。 この変更により、"LastWriteTime" タイム スタンプが更新されます。 これは、ファイル コピー操作に依存する一部のシナリオに影響する可能性があります。
:::

# 回避方法
以下の手順からローカルイントラネットに対象機器のIPアドレス、またはFQDNを登録します。

1．[Windwos] メニューから [設定] をクリックします。
2. 左ペインから [ネットワークとインターネット] － [ネットワークの詳細設定] をクリックします。
3. 関連設定の [インターネット オプション] をクリックします。
   ※表示されていない場合は、[設定の検索] に "インターネット オプション" を入力して検索します。
4. 「インターネットのプロパティ」画面が表示されます。[セキュリティ] タブー [ローカル イントラネット] － [サイト] をクリックします。
5. 「ローカル イントラネット」画面が表示されます。[詳細設定] をクリックします。
6. [このWebサイトをゾーンに追加する] に対象機器のIPアドレス、もしくはFQDNを入力し、[追加] をクリックします。
7. [閉じる] をクリックして画面を閉じます。
8. 再度ファイルをコピーして動作を確認してください。
   ※IPアドレスでうまく動作しない場合は、FQDNで試してください。
【Rails】find_byメソッドの使い方

## `find_by` メソッドとは

`find_by` メソッドとは、検索でヒットしたレコードの初めの 1 件のみを返却するメソッド。

## 基本的な使い方

`find_by` メソッドは以下のように使用する。

```ruby
モデル名.find_by(条件)
```

以下のように記述すると、books テーブルから `title` が `sample` である最初のレコードを 1 件返却する。

```ruby
Book.find_by(title: "sample")
```

## 複数条件

複数条件指定することができる。  
以下の場合には users テーブルから `email` が `sample@example.com` で `admin` が `true` の最初のレコードが 1 件返却される。

```ruby
User.find_by(email: "test@example.com", admin: true)
```

## 該当なしの場合

指定した条件に該当するレコードがない場合には `nil` が返ります。

```ruby
Blog.find_by(title: "Absence")

# => nil
```

`nil` ではなく例外を発生させたい場合には `find_by!` を使用します。

```ruby
Blog.find_by!(title: "Absence")

# tiveRecord::RecordNotFound: Couldn't find Blog
```
🌍 Terraform で AWS サブネットを作成するシンプルな手順

# 📌 概要
Terraform を使って AWS のサブネットを作成する方法 を解説します💡

VPC のネットワークを分割し、特定の範囲でインスタンスを起動できるようにするため、サブネットの作成は AWS の基本的な設定の一つです🧞‍♂️

今回は以下のVPCを パブリックとプライベートの2つのサブネットに分割していきます 💔

| 種類 | 特徴 |
|---|---|
| public | インターネットと通信できるサブネット（例: Webサーバー・プロキシーサーバーを配置） |
| private | インターネットからアクセスできない内部用のサブネット（例: DB サーバーを配置） |

# 📌 事前に準備するもの

##### main.tf

main.tf の作成がまだの方は以下の記事を参考にファイルを作成してください。

https://qiita.com/nobumory/items/624275ac0b08660a2637

##### VPC

VPCを未作成の場合は以下の記事を参考に作成します。

https://qiita.com/nobumory/items/72ab7a109b24b5a08287

# 📌 ディレクトリ構成

```
terraform-project/
│── main.tf                # ルートディレクトリのメイン設定
│── modules/
│   ├── vpc/
│   │   ├── main.tf        # VPCを定義
│   ├── subnet/
│   │   ├── main.tf        # サブネットを定義
```

# 📌 コード

### main.tf

このファイルでは、Terraform のプロバイダー設定とモジュールの読み込み を行います。

VPC や サブネット をモジュール化 することで、コードの再利用性を高め管理しやすくしています。

```hcl
# AWS プロバイダーの設定
provider "aws" {
  region = "ap-northeast-1" # 東京リージョン
}

# VPC モジュールの読み込み
module "vpc" {
  source = "./vpc"
}

# サブネットモジュールの読み込み
module "subnet" {
  source = "./subnet"
  vpc_id = module.vpc.vpc_id
}
```

### vpc/main.tf

VPC（Virtual Private Cloud）を作成し、VPC の ID を出力します。

```hcl
# VPC（Virtual Private Cloud）の作成
resource "aws_vpc" "main" {
  cidr_block = "192.168.250.0/24" # VPC 内で使用する IP アドレスの範囲

  tags = {
    # VPC に "sandbox-terraform" という名前タグを付与
    Name = "sandbox-terraform"
  }
}

# 作成した VPC の ID を出力
output "vpc_id" {
  value = aws_vpc.main.id
}
```

### subnet/main.tf

VPC 内に パブリックサブネット と プライベートサブネット を作成します。

```hcl
# VPC の ID を受け取る変数を定義
variable "vpc_id" {
  description = "Internet Gateway を関連付ける VPC の ID"
  type        = string
}

# プライベートサブネットの作成
# CIDR ブロック: 192.168.250.0/25（最初の半分の IP 範囲）
# アベイラビリティゾーン: ap-northeast-1a（東京リージョンの特定のゾーン）
resource "aws_subnet" "private" {
  vpc_id                  = var.vpc_id
  cidr_block              = "192.168.250.0/25"
  availability_zone       = "ap-northeast-1a"

  tags = {
    # プライベートサブネットの識別用タグ
    Name = "private"
  }
}

# パブリックサブネットの作成
# CIDR ブロック: 192.168.250.128/25（残りの半分の IP 範囲）
# アベイラビリティゾーン: ap-northeast-1a（東京リージョンの特定のゾーン）
resource "aws_subnet" "public" {
  vpc_id                  = var.vpc_id
  cidr_block              = "192.168.250.128/25"
  availability_zone       = "ap-northeast-1a"

  tags = {
    # パブリックサブネットの識別用タグ
    Name = "public"
  }
}

# 作成したパブリックサブネットの ID を出力

output "subnet_public_id" {
  value = aws_subnet.public.id
}

# 作成したプライベートサブネットの ID を出力
output "subnet_private_id" {
  value = aws_subnet.private.id
}
```

[参考リポジトリ]

https://gitlab.com/Morykun/sandbox-terraform

# 📌 実行

準備ができたらコマンド実行しましょう！

1. `terraform init`
2. `terraform plan`
3. `terraform apply`

Terraform関連のコマンドについては以下の記事を参考にしてください ☺️

https://qiita.com/nobumory/items/9f3c84f016fbf37363ed
【PostgreSQL】バッチファイルでフォルダ内のSQLを一括実行する

# はじめに
PostgreSQLのSQLを一括実行するバッチファイルについて書き残しておこうと思います。
環境変数でパスを通しているのにバッチ実行するとpsqlコマンドを認識してくれなかったり、エンコード関係でエラーが出たりしたので、その解決策も含めたバッチになっています。
人によってはその部分は不要かも。

# 環境
・Windows10
・PostgreSQL 16.2

# 起こった問題
接続情報と実行したいSQLが置いてあるファイルのパスを指定したごく普通のバッチファイルを作成したところ、以下のような2つのエラーに遭遇しました。

## psqlコマンドが認識されない
環境変数の設定でパスを通せばコマンドは認識されるはずなのですが、何故かバッチのときだけ認識されませんでした。
```:エラー
'psql' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません' ``
```
これに関しては最後まで原因は分かりませんでしたので、`cd`でインストールパスまで移動することでゴリ押し解決しました。

## エンコーディング関係のエラー
SQLのエンコーディングとクライアント側のエンコーディングが合ってないために発生するエラーです。
自分の場合、クライアントが`SJIS`でSQLが`UTF-8`だった為に発生しました。
```:エラー
invalid byte sequence for encoding "SJIS": 0x80 0xe5
```
`set PGCLIENTENCODING=UTF8`で一時的にエンコーディングを変更することで対応しました。
自分のデータベースのエンコード値が分からない場合はpsqlにログインして以下のコマンドを打つと確認できます。
```:client_encodingの値確認
postgres=# SHOW client_encoding;
```

# 解決策を盛り込んだ最終的なバッチ
以上のエラーを回避する策を盛り込んだバッチがコチラ！！
クリックするかコマンドプロンプト上にﾎﾟｲと投げ込んで実行しましょう。
文字化けする場合はバッチの文字コードをANSIに変更するといいです。

```bat:バッチファイルの例
@echo off

REM ==================== 初期設定 ====================

REM PostgreSQL.exeのインストールパス
set PGPATH=C:\Program Files\PostgreSQL\16\bin
 
REM 接続情報
set HOST=localhost
set PORT=5432
set USER_ID=SUDARE
set DB_NAME=postgres
set PGPASSWORD=SUDARE

REM 実行したいSQLがあるファイルのパス
set SQLPATH=C:\SQL_OKIBA\

REM エンコードを一時変更
set PGCLIENTENCODING=UTF8


REM ==================== 実行開始 ====================
cd %PGPATH%
echo %PGPATH%に移動

echo %SQLPATH%の.sqlを実行

echo PGCLIENTENCODING=%PGCLIENTENCODING%に一時的に変更

for %%i in ("%SQLPATH%*.sql") do (
	echo %%i を実行
	psql -h %HOST% -p %PORT% -U %USER_ID% -d %DB_NAME% -f %%i
)

echo 処理終了
cmd /k
```
ちなみに、エラーがあっても最後まで突き進みます。


# 参考資料
https://www.insight-ltd.co.jp/tech_blog/postgresql/pg-knowledge/787/

https://www.insight-ltd.co.jp/tech_blog/postgresql/pg-parameter/772/

https://gist.github.com/szmslab

https://postgresweb.com/post-6273
GitHub Copilot:エージェントとRoo-Code - 開発現場での所感

## はじめに

最近、AI支援による開発効率化が注目を集めています。本記事では、GitHub Copilot:エージェントとRoo-Code（旧Roo Cline）という2つの強力なAIコーディングアシスタントについて、実際の開発現場での使用経験をもとに比較・検証していきます。

> あくまで個人の所感です

## 実験ツイート

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">GitHubCopilotのエージェント使ってみる⑪<br>⚠GitHubCopilotのエージェントの数少ない注意点⚠<br>・「Done」押すとそれまでの履歴消えるので注意<br>・「Done」押す前にコミットとかREADMEの更新とかしましょう！<br>＊今後のアップデートで改善するかもです <a href="https://t.co/vypQhrgtxA">https://t.co/vypQhrgtxA</a> <a href="https://t.co/ReVRRCY52k">pic.twitter.com/ReVRRCY52k</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1888420021258645963?ref_src=twsrc%5Etfw">February 9, 2025</a></blockquote> 

## 両者の概要

### GitHub Copilot:エージェント
2025年2月にリリースされたGitHub Copilotの新機能です。VS Code向けのエージェントモードを導入し、コードの自己修正能力やターミナルコマンドの提案・実行など、より自律的な開発支援を実現しています。

### Roo-Code
カスタマイズ可能な自律型コーディングエージェントとして知られ、自然言語でのコミュニケーション、ファイル操作、ターミナルコマンドの実行、ブラウザ操作など、幅広い機能を提供しています。

## 実践での比較検証

### コード差分処理の精度
- **GitHub Copilot:エージェント**
  - 400行程度の大規模な差分でも高い精度で処理可能
  - 処理時間は比較的長いため、並行作業との組み合わせが効果的
  - 筋トレや家事、別の開発タスクなどと並行して実行するのがおすすめ

- **Roo-Code**
  - 200行を超える差分処理では失敗するケースが増加 


### 自動化レベルと制御性
- **GitHub Copilot:エージェント**
  - 承認プロセスは手動が基本
  - より慎重な変更管理が可能
  - 意図しない変更を防ぎやすい

- **Roo-Code**
  - 完全自動化（フルオート）が可能
  - ファイルの作成・削除、コマンド実行など幅広い操作を自動化
  - より高い自由度を持つ

### 履歴管理
- **GitHub Copilot:エージェント**
  - 履歴機能が限定的
  - タスク完了（Done）時にチャット履歴が消失

- **Roo-Code**
  - チャット履歴の管理が可能

### UI変更への対応

- **GitHub Copilot:エージェント**
  - リファクタリングや機能追加時にUIやフォントの変更を積極的に提案
  - システムプロンプトによる制御の可能性あり
  - 意図しないUI変更に注意が必要
- **Roo-Code**
  - 既存のUIなどを維持しつつ構成の修正などが可能

### 並列実行性

- **GitHub Copilot:エージェント**
  - 並列実行には別ウィンドウの開設が必要
  - やや煩雑な運用が必要

- **Roo-Code**
  - より柔軟な並列処理が可能

## まとめ

両ツールともに優れた特徴を持ちながら、異なる強みを発揮します。GitHub Copilot:エージェントは大規模な差分処理と慎重な変更管理に優れ、Roo-Codeは高度な自動化と柔軟な操作性が特徴です。開発プロジェクトの規模や要件に応じて、適切なツールを選択することが重要です。

また、これらのツールは急速に進化を続けており、今後さらなる機能改善や新機能の追加が期待されます。開発者は両ツールの特性を理解し、プロジェクトの要件に応じて使い分けることで、より効率的な開発を実現できるでしょう。

## GitHub Copilot:エージェントで作成したリポジトリ

https://github.com/Sunwood-ai-labs/GemiMo

<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
LAN内のスマホ等からWSL2のポートへアクセスする

https://zenn.dev/splusl_at/articles/wsl2-connect-outside

と

https://www.fmworld.net/cs/azbyclub/qanavi/jsp/qacontents.jsp?PID=0111-2966

の組み合わせで実現

```
// 追加
netsh interface portproxy add v4tov4 listenaddress=192.168.1.18 listenport=8081 connectaddress=172.29.160.170 connectport=8081

// 削除
netsh interface portproxy delete v4tov4 listenaddress=192.168.1.18 listenport=8081
```
Gitの必要性を死ぬほどわかりやすく説明する。

## なぜGitが必要なのか？

想像してみてください。あなたが小説家で、長編小説を執筆しているとします。

*   **原稿用紙で執筆：** 以前は原稿用紙に手書きで書いていたとします。もし間違えて書き直したり、気に入らない部分を修正したら、消しゴムで消したり、ひどい場合は書き直しですよね。
*   **Wordで執筆：** 次にWordで書くことにしました。修正は楽になったけど、大きな変更を加えて、やっぱり元に戻したいと思っても、なかなか戻せません。誤ってファイルを上書き保存してしまったり、変更を重ねるうちに、どのバージョンが最新なのかわからなくなってしまいます。
*   **複数人で執筆：** さらに、複数の人で小説を書くことになったらどうでしょう？誰かが修正したものを、また別の人が修正して…どんどん混乱してしまいます。

このように、文章やプログラム（コード）のような「変更を重ねていくもの」を管理するのは、意外と大変なんです。

**そこでGitの出番です！**

Gitは、これらの問題を解決するための、**変更履歴を管理する魔法のツール**なんです。

Gitを使うと、以下のようなことができるようになります。

1.  **過去の状態を記録できる：** 「この前のバージョンに戻したい！」と思ったら、簡単に戻れます。まるでタイムマシンのよう！
2.  **変更履歴を追跡できる：** 誰がいつ、どこを、どのように変更したのかが、一目でわかります。
3.  **複数人で同時作業ができる：** それぞれが違う部分を編集して、最後にまとめて一つのファイルにできます。
4.  **変更を比較できる：** 変更前と変更後を比較して、どこが変わったのかを簡単に確認できます。
5.  **もしもの時も安心：** 誤ってファイルを削除してしまっても、Gitに記録されていれば、すぐに復元できます。

## Gitがない世界を想像してみよう

Gitがない世界では、

*   ファイルを編集するたびに、コピーを作って保存する必要がある
*   ファイル名がどんどん「hoge_v1_final_final.txt」「hoge_v1_final_really_final.txt」みたいに複雑になる
*   複数人で作業するときに、メールでファイルを送り合ったりして、どれが最新かわからなくなる
*   間違ってファイルを上書き保存してしまって、泣く泣くやり直し

…考えただけでも恐ろしいですよね！

## Gitが主に使われる場面

Gitは、主に以下のような場面で使われます。

*   **ソフトウェア開発：** プログラムのコードを管理するために、ほぼ必須と言って良いほど使われています。
*   **ドキュメント作成：** 複数の人で文章を作成する際にも、Gitは便利です。
*   **Webサイト制作：** Webサイトのソースコードを管理するためにも使われています。
*   **その他：** テキストファイルであれば、ほぼどんなものでもGitで管理できます。

## Gitを使うことのメリット

*   **効率化：** 変更履歴の管理が楽になり、作業効率が大幅に向上します。
*   **安心感：** 過去の状態に戻せたり、ファイルを復元できるので、安心して作業できます。
*   **共同作業が楽：** 複数人での同時作業がスムーズになります。
*   **スキルアップ：** Gitはエンジニアにとって必須のスキルであり、習得しておくと将来役に立ちます。

## まとめ

Gitは、変更を重ねていくものを管理するための、非常に強力なツールです。特に、プログラマーやライターなど、頻繁にファイルの編集を行う人にとっては、必須のツールと言えるでしょう。
【Python】ラッパー関数を使って処理結果をおしゃれにprint()する


### こういうやつ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299794/cafdf9dc-7aec-6715-e8ca-dedf7f20d2b8.png)

###

result.pyとして保存する。

``` Python
from typing import Callable

from display import AnsiStyle


def print_result(name: str) -> Callable:
    """指定した関数の実行状態を表示するデコレーター。

    実行中のステータスと、関数の戻り値に応じた成功/失敗メッセージを表示する。

    Args:
        name (str): 関数の説明や識別用の名前。

    Returns:
        Callable: ラップされた関数を返すデコレーター。

    """
    def _print_result(func: Callable) -> Callable:
        """
        指定した関数の実行前後にステータスを表示する。

        Args:
            func (Callable): デコレートする関数。

        Returns:
            Callable: ラップされた関数。
        """
        def wrapper(*args: any, **kwargs: any) -> None:
            """関数の実行状態を表示し、結果に応じたメッセージを出力する。"""
            print(f"[    ] {name}", end="\r")

            result = func(*args, **kwargs)
            colorize_result = AnsiStyle.format("OK" if result else "NG", "GREEN" if result else "RED")

            print(f"[ {colorize_result} ] {name}")

        return wrapper
    return _print_result

```


### つかいかた

``` Python
import time

import result


@result.print_result(name="成功する関数")
def a() -> bool:
    time.sleep(3)
    return True


@result.print_result(name="失敗する関数")
def b() -> bool:
    time.sleep(3)
    return False


a()
b()


```


### 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299794/6673ca0e-64c9-5bd8-6047-5e0b7d5b219d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299794/855c0ce4-62d5-c966-42a2-8b0318424bf0.png)
C#でIoTプログラミング on ESP32 #5 - ボタンスイッチ1

今回のサンプルはタクトスイッチを使います。スイッチを押すとLEDが点灯するようにします。

## ハードウェア
・Freenove ESP32-S3-WROOM Board or Espressif ESP32-S3-DevKitC
・ブレッドボード
・タクトスイッチ
・ジャンパーワイヤ

## 配線
・配線は次の図のようにします。電源は3.3Vと5Vを間違えないようにしてください。間違えて5Vにつなぐとボードが壊れてしまう可能性があります。
![button.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/112883b5-0b9c-c9e4-2ca5-391b6463deec.png)

## 導入するパッケージ
・nanoFramework.System.Device.Gpio

## プログラミング
・新規プロジェクトを作成します。プロジェクト名は「ESP32S3_Button」としました。

・コードを入力する前にパッケージは導入してください。

・コードは次のようになります。
```C#:Program.cs
using System;
using System.Device.Gpio;
using System.Threading;

namespace ESP32S3_Button
{
    public class Program
    {
        public static void Main()
        {
            GpioController controller=new GpioController();

            GpioPin ledPin=controller.OpenPin(2,PinMode.Output);

            //何もつながっていないときはPin入力が0VになるようにするためPullDownします。
            GpioPin buttonPin = controller.OpenPin(35, PinMode.InputPullDown);

            while (true)
            {
                //スイッチの状態を確認
                //Console.WriteLine(buttonPin.Read().ToString());

                
                if (buttonPin.Read() == PinValue.High)
                {
                    ledPin.Write(PinValue.High);
                }
                else
                {
                    ledPin.Write(PinValue.Low);
                }

                Thread.Sleep(50);
            }
        }
    }
}
```

・コードを実行してみるとボタンを押した時にオンボードLEDが点灯することを確認できます。

次回は同じ回路を使って別の方法でボタンの状態を検出するプログラムを紹介したいと思います。
#0039（2024/02/09）memo「良いコード/悪いコードで学ぶ設計入門」第3章~クラス設計~

# 「良いコード/悪いコードで学ぶ設計入門」第3章~クラス設計~ を読んで...
## アクティブリコール
- 意味がある塊ごとのクラス・メソッドを分ける
- 原則：”低結合・高凝集”
    - 保守しやすいコード
- 値の初期化で変数が上書きされないようにfinalをつける（コンストラクタ）
- intではなく、Money型を作成
- 実態にそぐわないメソッドは作らない→金額計算に金額同士の掛け算が必要ない

## パッシブリコール
- クラスは「インスタンス変数」「メソッド」で構成される
- クラスはクラス単体で動作するように設計をする
- 悪魔
    - 生焼けオブジェクト→ガード節を使ってコンストラクタ時にバリデーションでエラーを投げる
    - 変数の受け渡し間違い→引数に適切な型を設定、型にはバリデーション付き
    - 副作用→初期化を呼ぶたびに、以前に初期化したインスタンスへ影響が起こる→finalで保護
- デザインパターン
    - 完全コンストラクタ：インスタンス変数が置き換えられないようにする
    - 値オブジェクト：intではなく、Money型を利用する


# 振り返り：2章の内容
- 意味があるまとまりでメソッド化
- 変数を使い回さずに、意味がある変数名をつける
Androidスマートフォンでオフライン辞書を利用する

スマートフォンを買い替えたので、改めてオフライン辞書を設定したので手順をメモ。 
### 辞書データを用意する
* 辞書データをダウンロード  
オフライン辞書のデータは下記のURLに保存してあるのであらかじめダウンロードしておく。  
https://github.com/ina-g/dictionary
データはダウンロードフォルダに保存しておく。
### Termuxのインストール
* F-Droidをインストール  
PlayストアのTermuxは古いらしいのでF-Droidからインストールする。  
下記URLからF-Droidをインストールする。  
[https://f-droid.org/]  
* termuxを検索しダウンロード＆インストール  
F-Droidを開きTermuxを検索してインストールする。

### Termuxの設定
* まずはシステムのアップグレードをする
```
pkg update && pkg upgrade
```
* Androidのストレージにアクセスできるようにする
```
termux-setup-storage
```
こうするとhomeディレクトリの下にstorageディレクトリがが作成されて、Androidのダウンロードフォルダ等にアクセスできるようになる。  
* ./dict/data/を作成し辞書データを移動する。
```
mkdir ./dict/
mkdir ./dict/data/
mv ~/storage/donloads/*.txt ~dict/data/
```
* .bashrcファイルを作成しスクリプトを記述する。  
```
nano .bashrc
```
```
# search from some dictionries
function dict() {
    grep ^$1 \./dict/data/*.txt -A 0 -wi |
    sed 's/\/dict\/data\///g' |
    grep $1 -A 1 -wi --color
}
```
* bashrcを読み込む。  
```
source ~/bachrc
```
* これでdictに続けて調べたい単語を入力すると辞書が引けるようになる。  
```
dict japanese

Japanese	『日本の』;『日本人』(『語』)『の』 / 〈C〉『日本人』;《集合的に》日本人 / 〈U〉《冠詞をつけないで》『日本語』
Japanese beetle	マメコガネ(植物の害虫)
Japanese lantern	=Chinese lantern
Japanese quince	ボケ
Japanize,Japanise	…‘を'日本化する,日本ふうにする
Japanese</k>n. ; adj.--n.  (pl. same)1 a a native or national of Japan. b a person of Japanese descent.2 the language of Japan.--adj. of or relating to Japan, its people, or its language.Phrases and idioms:Japanese cedar = CRYPTOMERIA.  Japanese print a colour print from woodblocks.  Japanese quince = JAPONICA.
jape</k>n. ; v.--n. a practical joke.--v.intr. play a joke.Derivatives:japery n.Etymology: ME: orig. uncert.
```
とjapaneseの意味が返される。  

### 参考にしたページ
いつでもLinuxコマンドが使える！Androidで動くLinux端末「Termux」【Root化不要】  
https://linuxfan.info/termux  
個人的Termuxのセットアップメモ  
https://zenn.dev/ryuu/scraps/6b2584294674b7
Log4j2 でカスタムログレベルを使う

# 1行まとめ

Log4j 2 でカスタムログレベルを導入する場合は、 `category = Level.CATEGORY` の `Plugin` を作るのがオススメです。

# 背景

Log4j2 には `FATAL`, `ERROR`, `WARN`, `INFO`, `DEBUG`, `TRACE` というレベルが用意されています。
これら以外のカスタムログレベルを使う方法も Log4j2 に用意されており、公式ドキュメントで解説されています。
https://logging.apache.org/log4j/2.x/manual/customloglevels.html

公式ドキュメントの方法でカスタムログレベルを扱うことができるようになるのですが、ちょっと冗長というか、カスタムログレベルの定義を 2 箇所 (Java と log4j2.xml) に記載している点に違和感があります。一方だけで済むのでは? と感じてしまいます。
実際、Java 側の記載だけで済む方法があるのですが、なぜか公式ドキュメントに記載がないため、ここにメモを残します。

# 解決方法

Java コードでカスタムログレベルを定義します。ポイントは 3 点です。
- カスタムログレベルを static フィールドに定義したクラスを作ること
- Log4j 2 の Plugin (`org.apache.logging.log4j.core.config.plugins.Plugin`) にすること
- Plugin の `category` を `Level.CATEGORY` にすること

```
@Plugin(name = "MyCustomLevel", category = Level.CATEGORY)
public class CustomLevel {
    public static final Level INFO2 = Level.forName("INFO2", 375);
    public static final Level INFO3 = Level.forName("INFO3", 350);
    public static final Level INFO4 = Level.forName("INFO4", 325);
}
```

`log4j2.xml` を記載します。
ポイントは `CustomLevels` の記載を不要にできることです。(公式ドキュメントの記載から `CustomLevels` をコメントアウトしています)

```
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
	<Appenders>
		<Console name="CONSOLE">
			<PatternLayout pattern="%d [%t] %p %c - %m%n"/>
		</Console>
	</Appenders>
	<!-- 記載不要
	<CustomLevels>
		<CustomLevel name="INFO2" intLevel="375"/>
		<CustomLevel name="INFO3" intLevel="350"/>
		<CustomLevel name="INFO4" intLevel="325"/>
	</CustomLevels>
	-->
	<Loggers>
		<Logger name="com.example" level="DEBUG"/>
		<Root level="INFO2">
			<AppenderRef ref="CONSOLE" level="WARN"/>
		</Root>
	</Loggers>
</Configuration>
```

ビルドツールに Gradle を使っている場合は、 `dependencies` に `annotationProcessor` を加えます。

```
dependencies {
  annotationProcessor('org.apache.logging.log4j:log4j-core:2.24.3')
}
```

(詳しくは https://logging.apache.org/log4j/2.x/manual/plugins.html を参照。Maven 向けの設定も記載されています)

以上により、
- カスタムログレベルの定義は Java だけで済みます。(log4j2.xml での定義が不要になります)
- log4j2.xml でカスタムログレベルを使用できます。

# 仕組みの解説

機会や要望があれば、後で書きます。
[自分用メモ]Dockerコンテナの構築

### 前提

#### コンテナを構築するホストの環境

- Dockerがインストールされていること
- Dockerサービスが起動していること

#### 構築するコンテナのOS

Rocky Linux 9

### 構築手順

1. rootユーザに移行する

2. Rocky Linux 9 の Docker イメージをプル (ダウンロード) する

   ```
   docker pull rockylinux:9
   ```

3. Rocky Linux 9 コンテナを作成し、起動する

   Rocky Linux 9 の Docker イメージは、デフォルトで /bin/bash を実行するようにはなっていないため、コンテナ起動時に何も実行するコマンドを指定しないと、すぐに終了する。

   そのため、以下のコマンドでコンテナを起動する

   ```
   docker run -d --name rocky9 rockylinux:9 sleep infinity
   ```

   sleep infinity は、コンテナ内で無限にスリープし続けるコマンドである。これによりコンテナが起動し続け、docker ps で確認できるようになる

4. コンテナの起動状況を確認

   以下コマンドを実行

   ```
   docker ps
   ```

   結果、以下のようにroclylinux:9が表示されれば、コンテナの構築に成功している

   ```
   CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS         PORTS     NAMES
   35b313c72c34   rockylinux:9   "sleep infinity"   7 minutes ago   Up 7 minutes             rocky9
   ```

5. コンテナに入る

   ```
   docker exec -it rocky9 bash
   ```

6. OSを確認

   ```
   cat /etc/os-release
   ```

   以下のようにRocky Linux 9の情報が表示されれば、成功

   ```
   NAME="Rocky Linux"
   VERSION="9.3 (Blue Onyx)"
   ID="rocky"
   ID_LIKE="rhel centos fedora"
   VERSION_ID="9.3"
   PLATFORM_ID="platform:el9"
   PRETTY_NAME="Rocky Linux 9.3 (Blue Onyx)"
   ANSI_COLOR="0;32"
   LOGO="fedora-logo-icon"
   CPE_NAME="cpe:/o:rocky:rocky:9::baseos"
   HOME_URL="https://rockylinux.org/"
   BUG_REPORT_URL="https://bugs.rockylinux.org/"
   SUPPORT_END="2032-05-31"
   ROCKY_SUPPORT_PRODUCT="Rocky-Linux-9"
   ROCKY_SUPPORT_PRODUCT_VERSION="9.3"
   REDHAT_SUPPORT_PRODUCT="Rocky Linux"
   REDHAT_SUPPORT_PRODUCT_VERSION="9.3"
   ```

#### Dockerの停止・起動手順

##### 停止手順

1. 停止コマンドを実行

   ```
   docker stop rocky9
   ```

2. コンテナの状況を確認

   ```
   docker ps
   ```

   結果、以下のように`rocky9`のコンテナが表示されなければ、停止に成功している

   ```
   CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
   

##### 起動コマンド

1. 起動コマンドを実行

   ```
   docker start rocky9
   ```

2. コンテナの状況を確認

   ```
   docker ps
   ```

   結果、以下のように`rocky9`のコンテナが表示されれば、起動に成功している

   ```
   CONTAINER ID   IMAGE          COMMAND            CREATED          STATUS         PORTS     NAMES
   35b313c72c34   rockylinux:9   "sleep infinity"   19 minutes ago   Up 2 seconds             rocky9
Laravelのユーザー管理と認証 - 初心者向けカリキュラム

## 1. Laravelの基礎
Laravelとは何か？（MVCフレームワークの概要）
Laravelのインストールとセットアップ（Laravel 11を想定）
Artisanコマンドの使い方
.env設定と環境変数の理解

https://qiita.com/teramoh/items/359fabb2732ac8193905

データベースの作成が必要ならこちら

https://qiita.com/teramoh/items/b82e1b0225da53bd5451


## 2. ユーザー管理の基本
ユーザーモデル (User.php) の確認
マイグレーションを使ったデータベーステーブルの作成
users テーブルの構造
php artisan migrate の実行
Eloquent ORMを使ったユーザーの操作
ユーザーの追加 (User::create())
ユーザーの取得 (User::find())
ユーザーの更新と削除 (User::update(), User::delete())


https://qiita.com/teramoh/items/9d3a484e60bed816e5ac


## 3. 認証の導入
Laravelの標準認証システムの理解
php artisan make:auth（Laravel 11ではJetstreamまたはBreezeを利用）
Laravel Breeze の導入
composer require laravel/breeze --dev
php artisan breeze:install
npm install && npm run dev
php artisan migrate
ユーザー登録、ログイン、ログアウトの確認

https://qiita.com/teramoh/items/abb960d308bfd86b19ba


## 4. 認可の仕組み
Auth::user() の使い方
ログインユーザーの情報取得 (auth()->user())
認可ミドルウェア (auth と guest)
Route::middleware('auth')->group(...)
ポリシー (php artisan make:policy)
ユーザー権限の制御




## 5. ロールと権限管理（Spatie Laravel Permissions）
composer require spatie/laravel-permission
HasRoles トレイトの追加
php artisan migrate を実行
ユーザーにロールを割り当てる
User::assignRole('admin')
@can ディレクティブを使ったビュー制御
@can('edit articles')




## 6. パスワードリセットとメール認証
メール送信の設定（MAIL_ の環境設定）
Laravelの標準パスワードリセット機能
メールによるユーザー認証の実装 (mustVerifyEmail)




## 7. API認証（Sanctum）
composer require laravel/sanctum
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate
ユーザーにトークンを発行する ($user->createToken('API Token')->plainTextToken)
APIルートの保護 (auth:sanctum)




## 8. まとめと応用
役割ベースのアクセス制御（RBAC）
JWT認証との比較
Vue.jsやReact.jsと組み合わせたフロントエンド認証
Laravel FortifyやPassportを利用した高度な認証
この流れで進めれば、初心者でもLaravelのユーザー管理と認証についてしっかり理解できるはず！カリキュラムの内容をもっと細かくしたい場合や、具体的なコードサンプルが必要なら教えて！
@lazarv/react-serverでSyntaxError: [vite] Named export 'createRequire' not found. The requested module 'module' is a CommonJS moduleエラーが出る

# はじめに

@lazarv/react-serverを使っていて沼ったのでまとめておきます

# 問題

Convexを使ってAPIを作成したところ以下のエラーが出ました

```
19:24:13 [react-server] [vite] Named export 'createRequire' not found. The requested module 'module' is a CommonJS module, which may not support all module.exports as named exports.
19:24:13 [react-server] CommonJS modules can always be imported via the default export, for example using:
19:24:13 [react-server] 
19:24:13 [react-server] import pkg from 'module';
19:24:13 [react-server] const {createRequire} = pkg;
19:24:13 [react-server] 
19:24:13 [react-server]   [stack]: SyntaxError: [vite] Named export 'createRequire' not found. The requested module 'module' is a CommonJS module, which may not support all module.exports as named exports.
19:24:13 [react-server] CommonJS modules can always be imported via the default export, for example using:
19:24:13 [react-server] 
19:24:13 [react-server] import pkg from 'module';
19:24:13 [react-server] const {createRequire} = pkg;
19:24:13 [react-server] 
19:24:13 [react-server]     at analyzeImportedModDifference (file:///home/jinwatanabe/workspace/tmp/koreda/node_modules/@lazarv/react-server/node_modules/vite/dist/node/module-runner.js:521:11)
19:24:13 [react-server]     at RSCModuleRunner.processImport (file:///home/jinwatanabe/workspace/tmp/koreda/node_modules/@lazarv/react-server/node_modules/vite/dist/node/module-runner.js:1129:56)
19:24:13 [react-server]     at RSCModuleRunner.cachedRequest (file:///home/jinwatanabe/workspace/tmp/koreda/node_modules/@lazarv/react-server/node_modules/vite/dist/node/module-runner.js:1165:21)
19:24:13 [react-server]   [message]: [vite] Named export 'createRequire' not found. The requested module 'module' is a CommonJS module, which may not support all module.exports as named exports.
19:24:13 [react-server] CommonJS modules can always be imported via the default export, for example using:
19:24:13 [react-server] 
19:24:13 [react-server] import pkg from 'module';
19:24:13 [react-server] const {createRequire} = pkg;
19:24:13 [react-server] 
```

```ts:src/app/api/articles/GET.popular.server.ts
import { ConvexClient } from "convex/browser";
import { api } from "../../../convex/_generated/api";

const convexUrl = import.meta.env.VITE_CONVEX_URL;
if (!convexUrl) {
  throw new Error("VITE_CONVEX_URL is not defined");
}

const client = new ConvexClient(convexUrl);

export default async function GetPopular(request: Request) {
  const url = new URL(request.url);
  const limit = url.searchParams.get("limit")
    ? Number(url.searchParams.get("limit"))
    : 20;
  const articles = await client.query(api.articles.getPopular, {
    limit,
  });
  return new Response(JSON.stringify(articles));
}
```

# 解決方法

質問してみたところいまPRをリリースしようとしているとのことでした

https://github.com/lazarv/react-server/discussions/118

バージョンを古いものをいれると今は解決できます。

```
$ npm i @lazarv/react-server@v0.0.0-experimental-44033c0-20250123-2c156f57
```

# おわりに

ものすごく時間を使いましたが解決できてよかったです。
プリザンターのカレンダーで「今日」を強調表示してみる

## はじめに
プリザンターの旧UIテーマ群にはカレンダー表示の際に今日の日付の部分に青枠が表示されてわかりやすくなっていました。
しかし、新UIではその青枠が表示されなくなっています。今回は、新UIで今日の日付に青枠を表示させる方法を紹介します。

## 構造を見てみよう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555395/aa828687-2001-96eb-3f11-c44e93cf5644.png)
開発者ツールで生身を見てみるとこのようになっています。全体構造はテーブルで、今日のセルにはtodayというクラスがセットされています。

該当のセルに当たっているCSSを確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555395/3bf2fb22-9c54-fea4-705e-e4d3c6ea3f26.png)
青枠をセットするCSSはあるのですが、新UIに適用されているスタイルで上書きされてしまって無効化されてしまっています。

## 対処法は？
対処法は簡単です。新UIのスタイルのCSSより上位に来るようなCSSを用意してあげればOKです。
簡単にやるならImportantの追加ですね。
```css
.CalendarBody .today {
    border: solid 2px #00f !important;
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555395/392946e1-c56e-105b-5570-25e1d3e974bf.png)
想定通りに表示されました。

ただ、Importantの追加はCSSの推奨から外れてしまう方法なので、別の方法を考えてみます。枠関連の修飾となると鉄板はbox-shadowです。box-shadowならこのような感じになります。
```css
.CalendarBody .today {
    box-shadow: inset 2px 2px 0 #00f, inset -2px -2px 0 #00f;
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555395/ecc21162-ed95-d52e-552e-b078b6b53ad8.png)
こちらも想定通りに表示されました。
先ほどのborderを使った旧来の方法と較べると、box-shadowは枠の内側に修飾されるためスタイルへ与える影響が小さいというのもメリットになります。CSSは拡張スタイルとしてセットすれば全てのページに適用されます。

## まとめ
今回は新UIのカレンダー表示で「今日」の枠を表示させる方法を紹介しました。`.CalendarBody .today`にスタイルを当てるといういうところがミソになります。今回紹介した方法以外にも背景色を当てたりといろいろな方法で「今日」の強調表示ができますので、皆さんお好みの方法を探してみてください。
初心者によるメモ（アルゴ式「逆から読む」）

## 問題
アルゴ式　ロジック実装初級

https://algo-method.com/tasks/7968b5c6e82fab73/editorial

## 考察
問題文の通りに実装する。逆順でindexが0の部分まで出力したい場合は
```py
range(N - 1,-1,-1)
```
と実装する。
## ACコード
```py
s=input()
n=len(s)
t=""
for i in range(n-1,-1,-1):
    t += s[i]

print(t)
```