OmniAICreator/Qiita-1.07M huggingface dataset:
Bluetooth Classic プロファイルを一覧にしてみた

仕事で Bluetooth に関わる機会が多くなってきたので、自身の備忘録も兼ねてBluetoothプロファイルをまとめました。

Bluetoothに関する情報は下記の Bluetooth SIG のドキュメントを読めば確実なのですが、英語で書かれた膨大な量のドキュメントがあるので読み解くのはとても面倒です。

https://www.bluetooth.com/specifications/specs/

Bluetooth 関連は二次情報が少なく筆者もいろいろ困ったので、今回の記事を作成しました。

Bluetooth LE のプロファイルもいつかまとめようと思ってます。

# そもそもプロファイルって何？
詳しくはムセンコネクト様の下記コラムをご確認ください。私みたいなサルでもわかりました。

https://www.musen-connect.co.jp/blog/course/trial-production/profile-basic/

個人的にはネットワークプロトコルにおけるアプリケーション層のプロトコルのようなイメージでだいたいOKだと思ってます。

# Bluetooth Classicプロファイル一覧
ここからBluetooth Classicのプロファイルについて解説していきます。
各プロファイルについて簡単な解説と使用例を挙げます。

## A2DP（Advanced Audio Distribution Profile）
### 解説
高品質なオーディオストリーミングを実現するプロファイル。
### 使用例
Bluetoothヘッドフォン、スピーカー。
## AVRCP（Audio/Video Remote Control Profile）
### 解説
オーディオ/ビデオ機器のリモート制御を提供するプロファイル。
### 使用例
メディアプレイヤー、カーオーディオシステムのリモコン。
## HFP（Hands-Free Profile）
### 解説
車載システムと携帯電話の間のハンズフリー通話をサポートするプロファイル。
### 使用例
車載ハンズフリーシステム、Bluetoothヘッドセット。
## HSP（Headset Profile）
### 解説
オーディオヘッドセットと携帯電話の間の基本的な音声通信を提供するプロファイル。
### 使用例
Bluetoothヘッドセット。
## PBAP（Phone Book Access Profile）
### 解説
電話帳情報の共有をサポートするプロファイル。
### 使用例
車載システムでの電話帳表示。
## SPP（Serial Port Profile）
### 解説
仮想シリアルポート通信を提供するプロファイル。
### 使用例
Bluetoothモジュールを使用したデータ転送、GPSデバイス。
## FTP（File Transfer Profile）
### 解説
ファイルの転送をサポートするプロファイル。
### 使用例
携帯電話間のファイル共有。
## OPP（Object Push Profile）
### 解説
オブジェクト（名刺、カレンダーエントリ、画像など）のプッシュ送信をサポートするプロファイル。
### 使用例
名刺の交換、写真の送信。
## BPP（Basic Printing Profile）
### 解説
プリンターとの基本的な印刷機能を提供するプロファイル。
### 使用例
Bluetoothプリンターでの文書印刷。
## MAP（Message Access Profile）
### 解説
SMS/MMSメッセージのアクセスと操作を提供するプロファイル。
### 使用例
車載システムでのメッセージの読み取りと送信。
## HID（Human Interface Device Profile）
### 解説
キーボード、マウス、ゲームコントローラーなどの人間インターフェースデバイスとの通信を提供するプロファイル。
### 使用例
Bluetoothキーボード、マウス。
## PAN（Personal Area Networking Profile）
### 解説
デバイス間でIPベースのネットワーキングをサポートするプロファイル。
### 使用例
ネットワーク接続の共有、インターネットアクセス。
## DUN（Dial-Up Networking Profile）
### 解説
モデムを通じてインターネット接続を提供するプロファイル。
### 使用例
携帯電話をモデムとして使用する。
## SAP（SIM Access Profile）
### 解説
リモートデバイスがSIMカードの情報にアクセスすることをサポートするプロファイル。
### 使用例
車載システムが携帯電話のSIMカードにアクセスする。

# まとめ
Bluetooth Classicプロファイルについてまとめました。
各Bluetooth Classicプロファイルは特定の用途やデバイスに最適化されており、幅広いアプリケーションに対応していることがわかるかと思います。

既存のプロファイルを知ることで、Bluetooth技術を活用した様々なデバイス間通信やサービス提供に役立てましょう！

他にもいくつかプロファイルがあるのは認識していますが、今回はここまでにしてそのうち更新したいです。

本記事が皆様のお役に立ちましたら幸いです。ばばい。
Docker版　Proxy　Server　の構築

# 実現したいこと

プライべーとゾーンを持った環境から、外部サイトを参照したいニーズに答え、プロキシサーバをdokcerを使って実現する。

# squidとは?

プロキシサーバーを実装するためのソフトウェア。

# 事前準備

- docker engin

### 向いているひと

OSを汚したくないきれい好きな人向け。

### Docker構成
ディレクトリ
```
project
├── compose.yml
├── cash_dir/
└── squid.conf
```
### 構成ファイル

```yml:compose.yml
services:
  app:
    #image: sameersbn/squid:3.5.27-2
    image: easypi/squid-arm
    restart: always
    volumes:
      - ./squid.conf:/etc/squid/squid.conf
      - ./cash_dir:/var/spool/squid
    ports:
      - "3128:3128"
    networks:
      vpn_net:
networks:
  vpn_net:
    driver: bridge
    driver_opts:
      com.docker.network.enable_ipv6: "false"
    ipam:
      driver: default
      config:
      - subnet: 172.16.238.0/24
```

```conf:squid.conf
acl localnet src 10.0.0.0/8     # RFC1918 possible internal network
acl localnet src 172.16.0.0/12  # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7       # RFC 4193 local private network range
acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localnet
http_access allow localhost
http_access allow all
http_port 3128
coredump_dir /var/spool/squid
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern (Release|Packages(.gz)*)$      0       20%     2880
refresh_pattern .               0       20%     4320
```

# 実行方法

`compose.yml`のディレクトリがある場所まで移動する。
その後、以下のコマンドで起動

```sh
docker-compose up -d
```

```exec:docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED       STATUS       PORTS                                                 NAMES
89fb41ef03dd   easypi/squid-arm   "/usr/sbin/squid -NY…"   4 weeks ago   Up 9 hours   0.0.0.0:3128->3128/tcp, :::3128->3128/tcp, 3130/udp   squid-app-1
```
Ubuntu LinuxのLXCコンテナゲストを22.04(jammy)→24.04(noble)にアップグレートしてみた件

# 概要
- LXCコンテナ上で動かしているUbuntu 22.04LTS (jammy) を 24.04LTS (noble) にアップグレードします。
- 実際のアップグレードパスの提供は8/15日以降らしいのですが、デバッグオプション(-d)を使って、一足先にやっつけます。
- ホストOSは、最初から Ubuntu 24.04LTSであることを仮定します。

# 方法
- 説明のため、Ubuntu 22.04LTS コンテナの名称は jammy としておきます。

- （１） まず、configファイルを編集します。

``` text:/var/lib/lxc/jammy/config
・・・
# Container specific configuration
lxc.apparmor.profile = generated
lxc.apparmor.allow_nesting = 1
lxc.rootfs.path = dir:/var/lib/lxc/jammy/rootfs
lxc.uts.name = jammy
・・・
```
 「# Container specific configuration」のところに、
lxc.apparmor.profile = generated と
lxc.apparmor.allow_nesting = 1 
を追記しておいてください。

- （２） jammyのLXCコンテナを起動します。
```
# lxc-start -d -n jammy
```
- （３） ssh もしくは lxc-attach -n jammy でLXCゲストに接続します。 
- （４） # apt update ; apt dist-upgrade したのち、
```
# do-release-upgrade -d
```
で、Ubuntu を一気に22.04 → 24.04 にアップグレードします。

- （５） 成功。

自分の環境では、うまくいきました。

# ダメパターン
- 以前は、何度やってもコンテナが落ちてしまったり、アップグレードに失敗してました。
- 途中で失敗するパターンとして、i386のmultilibが含まれていてアップグレード先がないので落ちる場合がありました。（あらかじめi386はお掃除しておきましょう。あとで入れられます）

- また、do-release-upgrade で一気に22.04 → 24.04 することが出来ず、
- /etc/update-manager/release-upgradesファイルを編集し、 一度 LTS から prompt=normal に戻して、22.04 → 23.10 → 24.04 を試みるもうまくいかず・・・
- コンテナが落ちる原因は、configに2行足すことで解決しました。

- Linuxのディレクトリ構成が usr merge していない場合は libcのdpkg-divertで失敗する可能性があります。（ https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/2072532 ）


- コンテナホストのLinuxは、元の/etc/の内容等をバックアップしておいたのち、新規に Ubuntu 24.04 LTSを導入して設定したほうが楽かもしれません。
 （というか物理マシンの22.04 → 24.04 はまだ成功していないので・・・）
.

7/24追記
- 物理マシンの22.04LTS → 24.04LTSへの do-release-upgrade -d は成功しました。
.

ホストOSとコンテナゲストOSのVersionを合わせる必要性について：
- コンテナゲスト側で ip6tables を使用する場合は、ホスト24.04LTSとゲスト22.04LTSの組み合わせでは動作しません。
- 理由は、ご想像の通りで、カーネルが24.04のものなのに、ip6tablesのコマンドやカーネルモジュール(ライブラリ)が（ゲストの）22.04になって非互換になるためです。たまたまiptablesのほうは動作します。
- 

# そもそも LXC って、何？

- え？そっから？？？？

ここを見る
https://qiita.com/propella/items/18165c933bd485c2c0ae

- Dockerとの違いを聞かれているけれど、DockerとLXCは（用途が）全然違うわ。
- :
- Dockerは、Linuxのアプリ（サーバーソフト。nginxとかredmineとかmysql）をLinux のホストOSからいちいち分離した環境で動かすインフラ
- （なんでサーバーソフトをそれぞれ分離OS環境上で動かすのかというと・・・セキュリティ向上のためらしいけど、よくわからん）
- LXC は、Dockerよりもずっと前から存在したもので、仮想化技術(バーチャルマシン)を使用せずに、ホストLinux上でゲストLinuxを動かすツール。
- Linuxのユーザーランド（/(ルート) ファイルシステムと思ってよい）だけを分離するものとして、chroot というものが太古のLinux(unix)からあったんだけど、それに加えてプロセス名前空間を分離したりネットワーク環境を分離したりして、まるで軽量VMのように、ホストLinux上でゲストLinuxが丸ごと動いているように見える・・・（Dockerと一緒じゃん）

- 自分的には、/var/lib/lxc/＜ゲストLinux名称＞/rootfs/ 以下にゲストのファイルシステムが全部見れたり、それ以外にmount出来たりするのが便利。

- 逆にDockerの union fs が馴染めなかったりする。・・・人によるんかな
【Rails】個人的によく使うコマンドまとめ

Rails初学者の学習内容の備忘録です。
間違いや補足等あればご指摘いただけると幸いです。

今回は個人的によく使う基本的なコマンドをまとめます。

# コマンド一覧

**ディレクトリに新しいRailsアプリケーションを作成する**
```
rails new アプリケーション名
```
**モデルの生成**
```
rails g(generate) model モデル名 カラム名：データ型
```
**モデルの削除**
```
rails d(destroy) model モデル名 カラム名：データ型
```
**コントローラ生成**
```
rails g(generate) controller コントローラ名　アクション名
```
**コントローラ削除**
```
rails d(destroy) controller コントローラ名　アクション名
```
**サーバー起動**
```
rails s(server)
```
**コンソール起動**
```
rails console
```
**ルートを確認する**
```
rails routes
```
**カラムを追加する**
```
rails g(generate) migration Addカラム名TOテーブル名 カラム名:データ型　
```
**カラムを削除する**
```
rails g(generate) migration Removeカラム名FROMテーブル名 カラム名:データ型　
```
**データベースに変更を加える**
```
rails db:migrate
```
**データベースを変更前の状態に戻す**
```
rails db:rollback
```

今後よく使うコマンドが増えてきたら、随時更新予定。
laravelでthe stream or file /var/www/html/storage/logs/laravel.logエラーが出たときの対処

# docker環境でローカルホストを開いたときに`the stream or file /var/www/html/storage/logs/laravel.log`（以下略）というエラーが表示された

# エラーの意味
大まかな意味としてはlaravel上でログファイルへの書き込みが失敗していますよ〜という意味らしい。

# 考えられる原因

・**パーミッションの問題**：ログファイルのパーミッションが正しく設定されていない。Webサーバーのユーザー（例えば、ApacheやNginxなど）が書き込み権限を持つ必要がある

・**ログファイルが存在しない**：そもそもログファイルが存在していない場合。

上記の2点が原因として考えられると思いますが今回はエラーメッセージに`permission denied`と表示されていたのでパーミッションの問題かと考えられます。ログファイルも(storage/logs)にしっかりと存在していました。

# 対処法

### １．ターミナル（プロジェクト直下）で`sudo chmod o+w ./storage/ -R`を入力

### ２．続けて`sudo chown www-data:www-data -R ./storage`を入力

# 結果
ローカルホストが無事表示されました！他の方の記事で同じようなものがあるのですがそちらでは解決しなかったため執筆しました！今回のコードの簡単な解説を下に記載しておきますのでコードの意味など興味あればご覧ください


# 簡単に解説
## `sudo chmod o+w ./storage/ -R`を分解説明

**sudo** :ご存知の通りLinuxなどで特権(root権限)を持ったユーザーとしてコマンドを実行する。superuser doの略

**chmod** :ファイルやディレクトリの権限を変更するコマンド。change modeの略

**o+w** : 「o」は「others」（他のユーザー）のことで、「+w」は書き込み権限を付与するオプション。つまり、このコマンドは「./storage/」ディレクトリ以下のすべてのファイルとディレクトリに対して、他のユーザーに書き込み権限を付与する操作を行います。（「./」は現在のディレクトリから見た相対パスでlogsはstorage配下にあるためこの記載です）

**-R** : 「-R」は、再帰的（recursive）という意味です。

**www-data** : ここで指定している「www-data」は、所有者とグループを表します。具体的には、所有者を「www-data」ユーザー、グループを「www-data」グループに変更することを意味します。
ITエンジニアに英語は必要か?

# はじめに
ITエンジニアは英語で専門書を読んだり、英語でオンラインマニュアルを読むため、秘かに英語学習を始めました。ITエンジニアに英語が必要か、個人的な見解を記事にします

## 私の英語力
昔、英検2級とTOEIC550をとりましたが、今の英語力はCEFR A2レベルです。(英語テストサイトで計測しました)

## 私の見解
ITエンジニアである以上、英語力を身に着け、せめてCEFR B2レベル(英検準一級)に到達したいですね。

# 最後に
ITエンジニアだからこそ英語を勉強しましょう
【備忘録】動的に追加されたinputタグをReact Hook FormのuseFieldArrayで管理する

# はじめに
動的に追加された`input`タグへの入力内容を **RHF** で管理する方法について記した備忘録です。

# 元の実装例
1.ボタンがクリックされた回数を`state`で保持
2.`register`の引数に`state`の値を渡すことで、**RHF側のキー** が被らないようにする

```tsx
export function InputProductLink() {
  const [clickCount, setClickCount] = useState(0);

  return (
    <div className="space-y-2">
      <p className="font-bold text-xl">作品関連リンク</p>
      {Array.from({ length: clickCount }, (_, index) => (
        <InputField
          type="url"
          placeholder="入力されたURLのドメインによってアイコンが決定されます。"
          registerName={`productlink${index}`}
          key={index}
        />
      ))}

      <div className="flex space-x-2">
        <LinkAddButton setClickCount={setClickCount} />
        <SaveDBButton />
      </div>
    </div>
  );
}
```
・このようなキーになります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348923/38968db3-69b5-2d94-085c-78412c47425d.png)

## 元の実装例でキーを配列にする方法
`register`の引数を下記のように指定することで、配列の要素とすることが出来ます。

```tsx
registerName={`productlink.${index}`}
```
# useFieldArrayを使った実装例
1.`useFormContext`から`control`を取り出して、useFieldArrayに渡す。
2.`useFieldArray`の引数 **name** に`useForm`の **defaultValueのキー** と **registerの引数** を渡す。
3.ループには`fields`を使う。
4.要素の追加には`useFieldArray`から`append`を取り出して使う。
5.要素の削除には`useFieldArray`から`remove`を取り出して使う。

・親コンポーネント側の実装
```tsx
export function InputProductLink() {
  const { control } = useFormContext();
  const { fields, append, remove } = useFieldArray({
    name: "productLinks",
    control,
  });

  return (
    <div className="space-y-2">
      <p className="font-bold text-xl">作品関連リンク</p>
      {fields.map((field, index) => (
        <InputField
          key={field.id}
          type="url"
          placeholder="入力されたURLのドメインによってアイコンが決定されます。"
          registerName={`productLinks.${index}`}
        />
      ))}

      <div className="flex space-x-2">
        <LinkAddButton append={append} />
        <SaveDBButton />
      </div>
    </div>
  );
}
```

・子コンポーネント側の実装
```tsx
export function LinkAddButton({ append }: linkAddButtonProps) {
  return (
    <button
      onClick={() => append("")}
      className="flex items-center px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 transition duration-300"
      type="button"
    >
      <span className="text-xl mr-2">+</span>
      <span>追加する</span>
    </button>
  );
}
```

# さいごに
学習させていただいた記事のリンクです。

https://zenn.dev/ryosuke51/articles/e66649377a9d69
QNAPでのシェル活用: QTSかどうかの判別方法とBusyBoxのエイリアス

## QNAPのOSであるQTS

Linuxとしてみた場合、Linux Kernel + BusyBox + Bash + いろいろ

なのでホームディレクトリーを他のLinux/Unix系OSと共有した場合は`.profile`, `.bash_profile`などでの工夫が必要。

## ディストロ判別方法

```sh:/etc/os-release
NAME="QTS"
VERSION="5.1.7 (20240520)"
ID=qts
PRETTY_NAME="QTS 5.1.7 (20240520)"
VERSION_ID="5.1.7"
```

https://qiita.com/Hayao0819/items/a8c079b43097402b74e9

https://qiita.com/bezeklik/items/5edb638becd8858abb80

上記を参考に次の様な感じで判別できる。

```sh
if [[ -f /etc/os-release ]]; then
    source /etc/os-release
    if [ $ID = "qts" ]; then
      echo "QNAP/QTS"
    fi
fi
```

## BusyBox対応

上記に書いた通りBusyBoxなのだが、[BusyBox](https://ja.wikipedia.org/wiki/BusyBox)に内包されているコマンドへのリンクが貼られておらず、実行できないコマンドがある。例えば代表的なものだと`less`など。

```sh
$ which tail
/usr/bin/tail
$ ls -l /usr/bin/tail 
lrwxrwxrwx    1 admin    administ        12 Jul 15 04:03 /usr/bin/tail -> /bin/busybox*
$ ls -l /usr/bin/less
ls: /usr/bin/less: No such file or directory
```

シンボリックリンク等をroot権限でシステム上に行っても良いが、今後のバージョンアップでどうなるかわからないのでエイリアスで対応する。BusyBox内に組み込まれたコマンドは`busybox function`で実行可能。

```sh:~/.profile
if [[ -f /etc/os-release ]]; then
    source /etc/os-release
    if [ $ID = "qts" ]; then
      alias less='busybox less'
      alias fold='busybox fold'
      # 他にも色々必要なやつを
    fi
fi
```
Unityで2Dプロジェクトを3Dプロジェクトに変更するメモ

# この記事について
プロジェクトを2Dから3Dに変更する方法を、毎回調べているような気がするので今回記事にしてメモ代わりとして残したいと思います。**※3Dから2Dに変更する事も可能です。**


:::note warn
また、この記事で利用しているUnityのバージョンは**2023.2.20f1**なのでバージョン違いにご注意下さい。
:::

# 設定の場所まで移動する

`Edit`→`Project Settings`→`Editor`→`Default Behaviour`という順に移動します。
画像の順番で移動して下さい。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/2d46507f-9e66-0c86-e28f-ba16734040e2.png)

※開いたタブの下側にあります
![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/05381716-7952-c95b-3b6f-af2b67530c61.png)

※②の場所で2D、3Dを変更出来ます
![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/d55c1d2e-e0b5-373f-37bc-8fc9a7447726.png)

後は、Sceneを作成して確認すると3Dシーンになってます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/1640b1ce-d639-14f2-1f78-f498becfb394.png)

# 2Dから3Dプロジェクトに変更すると重力がおかしい
`Edit`→`Project Settings`→`Physics`という順に移動します。
移動の手順を先ほど紹介したので一部省略します。
`Physics`の項目で、Z軸の方向が **-9.81** になっているので、Y軸の値をZ軸に移すと治ります！
![図5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/e7014d96-ed05-9e72-cd02-574e35248df5.png)
bit演算云々について

[yukicoder No.3 ビットすごろく](https://yukicoder.me/problems/no/3)の解説を書いていた。それがビットに関する問題だったので、記念してこの記事を書く。
bit問題とは、基本的には**bit全探索のために使うbit**と、**bitの考え方を使うbit**の二種類があると思っている。この記事では、主に後者をまとめることにする。
ABC-Cはbit全探索のbitしか**基本的には**でないが、D以降になると後者のものも増える。
よって、ビットに関する知識はD以降の正答率を少し押し上げるはずだと思っている。
# 前提知識：ビット表記
そもそもの話だが、ビット表記は2進法になる。たとえば
・6は110になる
・19は10011になる
・32は100000になる
こんな感じ。
右から見てi桁目は$2^{i-1}$の位を表す。
この表記を知らないと話ができないので、先に説明した。

# ビット演算子
一般的に出てくるビット演算子は3つ。&と|と$\oplus$だ。
もちろん、記号だけだとわからないと思うので、どのようなものかを説明する。

## 論理積
&は、論理積(AND)というものを求める記号である。
| x | y | xANDy |
|:-:|:-:|:-:|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |

こんな感じで、xとyともに1になっているもののみ1にするという記号だ。
例
・1&3=1
・3&6=2
・4&9=0
## 論理和
|は、論理和(OR)というものを求める記号である。
| x | y | xORy | 
|:-:|:-:|:-:|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |

こんな感じで、xとyどちらかが1になっているものを1にするという記号だ。
例
・1|3=3
・3|6=2
・4|9=13

## 排他的論理和
$\oplus$は、排他的論理和(XOR)というものを求める記号である。
| x | y | xXORy |
|:-:|:-:|:-:|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |

こんな感じで、xとyどちらかのみ1になっているものを1にするという記号だ。
例
・1$\oplus$3=2
・3$\oplus$6=5
・4$\oplus$9=13

基本的に、bitをうんたらかんたらするタイプの問題は、上記のものを理解していれば何を言ってるかがわかるものが多い。

# その他、覚えておきたいビットに関する関数
上記のものほどではないが、よく使う関数について説明する。
## builtin_popcount
これはbit列に直したときに、1の出てくる数という意味である。
例
・5=101=2
・25=11001=3
・125=1111101=6
なお、一般的に問題文に出るときはpopcountと呼ばれる。

これだけである。ほかにあるのかもしれないが、基本的にこれだけ覚えておけば大半は対処できる。
# C++におけるビット系の扱い方
まず、注意してほしいのが**排他的論理和を求める記号が^であること**だ。これさえ覚えておけば、基本的に問題はない。
## ビット列を作るとき
使用例：bitset<60> $e$(50)
<>の中の数字は、作るbit列の長さについて(中の数字は常に定数でないとならない)。
ダメな例：bitset<$k$> $e$(50)

()の中には、基本的に数字を入れることで中の数字をビット列に直す。という使い方が大半。

## ビット演算子について
ビット演算子は**変数にも使える**。これを覚えておこう。
論理積→&
論理和→&
排他的論理積→^
こういう対応をしている
## builtin_popcountの使い方
ビット列eに対してe.count()で求まる。

# ビット問題への考え方
> **D - Popcount and XOR**
実行時間制限: 2 sec / メモリ制限: 1024 MB
配点 : 400 点
**問題文**
非負整数 $a,b,C$ が与えられます。 次の 5 つの条件をすべて満たす非負整数の組 $(X,Y)$ が存在するか判定し、存在するならひとつ出力してください。
・$0≤X<2^{60}$
・$0≤Y<2^{60}$
・$popcount(X)=a$
・$popcount(Y)=b$
・$X⊕Y=C$
ただし、⊕ はビットごとの排他的論理和を表します。
条件を満たす $(X,Y)$ が複数存在する場合、どれを出力しても構いません。
**制約**
$N$ は $0$ 以上 $2^{60}$  未満の整数
$M$ は $0$ 以上 $2^{60}$  未満の整数
[ABC347-D](https://atcoder.jp/contests/abc347/tasks/abc347_d)より

> **D - Masked Popcount**
実行時間制限: 2 sec / メモリ制限: 1024 MB
配点 : 400 点
**問題文**
整数 $N,M$ が与えられるので、 
$\sum_{k=0}^N$  $popcount(k$&$M)$ を $998244353$ で割った余りを求めてください。
ただし、 & はビット単位 AND 演算を表します。
**制約**
$N$ は $0$ 以上 $2^{60}$  未満の整数
$M$ は $0$ 以上 $2^{60}$  未満の整数
[ABC356-D](https://atcoder.jp/contests/abc356/tasks/abc356_d)より

このような一般にbitと絡める問題はとある事実を知るだけで見通しがかなり良くなる。それが**各bitは独立している**という事実である。
ビット列の$2^3$桁目が変わっても$2^5$桁目は変わらない。その事実だ。
この考えの有効性を理解するのなら下の問題の方がいいだろう。
$M$の$2^i$桁目について考えるときに、$M$の$2^{i+1}$桁目が影響することはない。よって、各桁の解をいい感じに求めてしまえば、あとはそれを足すだけ。この考えを知っただけで、問題への感じ方がだいぶ変わっただろう。

# まとめ
結果から言うと、言いたかったのは最後の独立性のみである。この考えを持っていれば、さらにビット演算の使い方を理解すれば、かなりビット演算問題も解きやすくなるのではなかろうか。
Astroを試すのにStackBlitzが便利だった

[Astro](https://astro.build/)を使ってみようとしたが環境構築が面倒になってしまった。

StackBlitzというサービスを使うとブラウザから一瞬でAstroが動くらしいので試した。

https://stackblitz.com/

トップの先頭にAstro Basisがあるので選択した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842239/e4889168-cafa-ec52-4994-1df4da4f8f5a.png)

本当に一瞬で動いた。環境構築しなくて済みそうだ。
SANS Sift Workstation構築につまづいたこと (Oracle VM 7.0)

# SANS Sift Workstation構築につまづいたこと(Oracle VM 7.0)
Siftとは...デジタルフォレンジック演習向けワークステーション。
SANSが無料公開していてUbuntuベースで動いているワークステーションである。
そのSiftの環境構築?について初心者がつまづいたところと解決についての備忘録。
## ①起動時に画面が映らない
Vboxに仮想アプライアンスのインポートをし、いざ起動！！しようとしたが、ロック画面でVboxのウィンドウサイズをいじると画面が映らなくなってしまった。
### 解決方法
VMマネージャーから該当のマシンの**設定**から**ディスプレイ**の中の**拡張機能 3Dアクセラレーションを有効化**に**チェック**を入れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674199/d7af0808-0b75-64c6-1c66-c228cf2fd2c8.png)
【Query Builder：Expression】Use icons in a Web report 

# Introduction #
I would like to talk about showing icon on a web report with Sharperlight expression.
Depending on the number, different color icons are displayed.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/09644503-bffc-2579-7793-402d4a033328.png)

# Base Query #
Let's create a web report with Sharperlight publisher, and design a query like this.
This should be a simple dataset so I used "Custom Defined Dataset" option to prepare a dataset.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c627c627-d419-56f6-2848-514f132a4746.png)
The dataset is like this.
```
"Product::String","Stock Left::Number"
"Timber Screw 8G x 25",55
"Timber Screw 8G x 28",120
"Timber Screw 8G x 30",80
"Timber Screw 8G x 35",10
"Timber Screw 8G x 40",32
"Timber Screw 8G x 45",500
"Timber Screw 8G x 60",75
```
With preview
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/4593bf70-b71f-e4ea-6cee-316bb8d53d0c.png)
On a browser
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/63fe7cbb-bb4c-169c-84cf-d398d971e006.png)

# Expression #
### Template ###
We add a Sharperlight expression, and use a built in template.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/de2d427b-24e8-81b5-6710-849bfe36a389.png)
1. Type **icon** into ```Find``` field to find the expression template
2. Double-click to transfer the template found to the editor

### Editing ###
Let's start modifing the template.
We do when Stocks Left is 100 or greater than 100, showing Grenn icon, when it is between 30 or greater then 30 and less than 100, showing Yellow icon, otherwise showing Red icon.
Don't forget to set **Icon** for ```Data Type``` property.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/dabff9c6-0c3d-1f83-cb62-b0bfe413b23b.png)
We don't need the column header for this so clear the value from the Description.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/7eea4818-c848-94e4-76fb-7acb573ec548.png)

# Preview #
We can now preview it with **Preview** button.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/f60f1bf2-b570-84c6-fda3-d8c1a18a83b3.png)

# Publishing the report #
Save the query and save the web report.
Start Sharperlight service.
View the web report in your browser.
We shoud see the web report like this.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/ad0c041d-ed3b-be6b-0f79-1d6c3f5b2703.png)

# Conclusion #
There are many Sharperlight expressions and we can create more attractive web reports with them.
chrome,chromedriver

```bash
# Install Chrome
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list
RUN apt-get update && apt-get install -y google-chrome-stable
# Install ChromeDriver
RUN wget -O chrome.json https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json && \
    LINUX_STABLE_URL=$(grep -oP '"url":".*?(?=")' chrome.json | grep 'linux64' | head -n 1 | cut -d'"' -f4) && \
    wget -O chrome.zip $LINUX_STABLE_URL && \
    unzip chrome.zip && \
    rm chrome.zip chrome.json

```
Gitエラー（organization has enabled or enforced SAML SSO）の対処法

# エラー内容
ある日突然リモートリポジトリへの操作（プッシュやプル、クローン）をすると以下のエラーが発生するようになった。

## エラー
> Git: remote: The '・・・' organization has enabled or enforced SAML SSO.

# 対処法
ネットで調べただけだから原因まではわからないが、以下を実施すればひとまずエラーは発生しなくなった。

1. ネットワーク接続の表示を起動させる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612369/08747395-0885-e575-8999-d2aa63a57afd.png)
2. Wi-Fiを右クリックしプロパティを開く
![１３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612369/33293c58-453d-eb65-c9e5-77131233113b.png)
3. インターネットプロトコルバージョン6（TCP/IPv6）のチェックを外す
![１２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612369/f569678d-3d4d-9d29-a824-8ef59f27aece.png)
mruby on YABMのリリースタグ

久しぶりにoctokitを使い[rubyスクリプトでリリース](https://qiita.com/yamori813/items/cc83e4e47d304d7c8e38)を切ってみました。

https://github.com/yamori813/armbm-mruby/releases/tag/3.3.0_1

以下のようなロジックで処理する事にしました。

リリースタグはサブモジュールのmrubyのDoxyfileからPROJECT_NUMBERを拾い出し、それにYABMでのリリース番号を付ける。

このやり方はFreeBSDのportsと同じです。

YABMでのリリース番号はgithubのlatest_releaseで拾ってきたものが同じmrubyのバージョンの場合はインクリメントし、バージョンが変わっている場合には_1とする。

YABMの各アーキテクチャでリリースは別々に行う。

mruby on YABMはVMのプリビルドファイルがあれば、hostのmrbcでスクリプトをmrbにして、適宜処理すればflashに焼けるイメージになり、実行できます。
Android/Pixel 8aでwifi(NEC/Aterm)に繋がらない

## 前提
端末：Pixel 8a(Android)
wifi：NEC/Aterm WG1200hs4
パソコンやiPhone、kindleなどは普通に繋がる。

## 結論
WPA3を有効にしていたからでした。
暗号化モードをWPA2-PSKのみにすれば解決。（デフォルトではWPA2/WPA3）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487385/92810450-d084-13be-f5f9-32192697913e.png)
chatGPT で kintone スペース管理コマンド作成

chatGPT で kintone スペース管理コマンド作成してみました。

# 概要

kintone スペース管理コマンドを chatGPT で作成して、github に公開してみました。
簡単なコードからオプション機能を追加していくと、コードが長くなり生成を続けるか聞かれるようになるのが、面倒くさい。

kintone で開発中の新機能の下記を有効にする必要があります。
- 「スペースの情報を取得できるJavaScript API」を有効にする
- 「テンプレートを指定せずにスペースを作成できるREST API」を有効にする
ただゲストスペースについては、スペーステンプレート無しでは、スペース作成できませんでした。

あとスペース一覧、スペーステンプレート一覧の REST API が無いので、コマンドだけでスペース管理するのは、まだ無理です。

- chatGPT での作成手順
    - node のコードを作成
    - README のドキュメントも作成
        - マークダウン形式で作成依頼すると途中まではマークダウン形式だが、コード部分の最後で、マークダウン形式から外れる
        - テキストファイルで要求すると、マークダウン形式のテキストファイルをダウンロードできた
    - github に公開
        - https://github.com/rex0220/kintone_manage_space

※npm パッケージ公開しました。

https://www.npmjs.com/package/@rex0220/kintone-manage-space

# kintone_manage_space

Node.jsスクリプトを使用して、kintoneのスペースの作成、更新、表示、および削除を自動化します。コマンドラインから簡単にkintoneスペースを管理できます。

## 機能

- kintoneスペースの作成
- 既存のkintoneスペースの更新
- kintoneスペースに関する情報の表示
- kintoneスペースの削除
- 通常のスペースとゲストスペースの両方をサポート

## 前提条件

- Node.jsおよびnpmがインストールされていること
- kintoneアカウント

## インストール

1. リポジトリをクローンします：

    ```bash
    git clone https://github.com/rex0220/kintone_manage_space.git
    cd kintone_manage_space
    ```

2. 依存関係をインストールします：

    ```bash
    npm install
    ```

## 環境変数

### .envファイルを使用する場合

プロジェクトディレクトリに `.env` ファイルを作成し、kintoneの資格情報を追加します：

```plaintext
KINTONE_DOMAIN=your_domain
KINTONE_USERNAME=your_username
KINTONE_PASSWORD=your_password
```

### 環境変数を直接設定する場合

#### Windows (PowerShell)

```powershell
$env:KINTONE_DOMAIN="your_domain"
$env:KINTONE_USERNAME="your_username"
$env:KINTONE_PASSWORD="your_password"
```

#### Mac (ターミナル)

```bash
export KINTONE_DOMAIN="your_domain"
export KINTONE_USERNAME="your_username"
export KINTONE_PASSWORD="your_password"
```

## 使用方法

### オプション

| オプション | エイリアス | 型 | 説明 |
|------------|------------|----|------|
| --domain | -d | string | kintoneのドメイン |
| --username | -u | string | kintoneのユーザー名 |
| --password | -p | string | kintoneのパスワード |
| --envfile | -e | string | .envファイルのパス |
| --spaceId | -i | string | 既存のスペースID（更新、表示、削除に必要） |
| --spaceName | -s | string | スペースの名前（作成に必要） |
| --fixedMember | -f | boolean | スペースのメンバー固定（デフォルト: null） |
| --createAppPermission | -c | string | アプリ作成権限（EVERYONEまたはADMIN） |
| --guest | -g | boolean | ゲストスペースの指定（デフォルト: false） |
| --templateId | -t | string | スペースのテンプレートIDの指定 |
| --action | -a | string | 操作の種類（create, update, show, delete） |

### 例

#### .envファイルを使用する場合

##### スペースの作成

```bash
node manage_space.js -e .env -a create -s "新しいスペース" -f true -c EVERYONE
```

##### スペース情報の表示

```bash
node manage_space.js -e .env -a show -i 123
```

##### スペースの更新

```bash
node manage_space.js -e .env -a update -i 123 -s "更新されたスペース名" -c ADMIN
```

##### スペースの削除

```bash
node manage_space.js -e .env -a delete -i 123
```

#### 環境変数を直接設定する場合

##### スペースの作成

```bash
node manage_space.js -a create -s "新しいスペース" -f true -c EVERYONE
```

##### スペース情報の表示

```bash
node manage_space.js -a show -i 123
```

##### スペースの更新

```bash
node manage_space.js -a update -i 123 -s "更新されたスペース名" -c ADMIN
```

##### スペースの削除

```bash
node manage_space.js -a delete -i 123
```
SingleChildScrollViewとColumn、Flexウィジェットの初歩的なミス

# 挨拶

お久しぶりです、ぺんまるです。
最近Flutterでのアプリ開発を始めました。
riverpodやらfirebaseといったIT界隈に新規で参入してきたぺんぎんにはなかなか難しいものです。
また、夏も本格的にはじまり、やる気が削がれますね…
でも、アウトプットを小さいものでも形に残していき、今後は増やしていきたいと考えています。

# 謎にエラー処理で時間がかかった(初級者あるある？)
今回なぜ記事を書いたのかというと、謎にエラー処理で時間がかかったものを備忘録として残したいとおもって書きました。

そのエラーというものが
```RenderFlex children have non-zero flex but incoming height constraints are unbounded```

になります。

# このエラーはなんだ？

具体的にどのようなコードを書けば、このようなエラーがでるのかというと

```dart: エラーが出たコード
// プロパティなどは省く
return SingleChildScrollView(
      child: Column(
        children: [
          Expanded(
            child: ColoredBox(
              color: Colors.green,
            ),
          )
        ],
      ),
    );
```

こう書くと先ほどのエラーがでます。
ある程度というか、初心者の方でも「まぁこうなるわな」ってわかる人もいると思いますが、これはSingleChildScrollViewが高さを無限に保つため、Expandedがレンダリング範囲を決められない点にあるそうです。
初心者の方、ぼくもそうなんですけど冷静にエラーを見ればどこがダメなのかがログに出力されたりしているのでわかるんですよね。

# 解決方法
1つ目はSizedBoxやContainerなどでラップし、固定サイズにする
    →しかしこれは、レスポンシブな対応ができないことや本来したいことを実現できない可能性があります。
    
2つ目はLayoutBuilderやConstrainedBoxで親widgetの高さと同一にする
    →これはLayoutBuilderがウィジェット描画前に端末サイズを取得し、その端末サイズの高さをConstrainedBoxの最小値に入れて、レンダリングをするということですね  
    
ただこれは、あくまでも端末サイズの中で行われるので、他のウィジェットが画面の割合を圧迫しているのであれば、高さが0になり表示されなくなります。
例えば、下記のコードを書くとします。

```dart
 return LayoutBuilder(
      builder: (context, constraints) {
        return SingleChildScrollView(
          child: ConstrainedBox(
            constraints: BoxConstraints(
              minHeight: constraints.maxHeight,
            ),
            child: IntrinsicHeight(
              child: Column(
                children: [
                  Expanded(
                    child: Container(
                      color: Colors.red,
                    ),
                  ),
                  Container(
                    height: 500,
                    color: Colors.blueAccent,
                  ),
                ],
              ),
            ),
          ),
        );
      },
    );

```
エミュレータの端末サイズは
`Size(411.4, 867.4)`
です。
例えば上記コードであれば、青色のContainerのheightが500だと
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556254/a0783ff7-70b4-31df-9c8c-de5fbd635982.png" width="50%">

のように表示され、867.4-500=367.4が割り当てられています。
しかし、青色のContainerheightが800、つまり端末サイズを超える場合は
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556254/034ca039-2e2f-cce6-ac92-dff5bdaefcaf.png" width="50%">
上の画像のように青色のContainerがすべての領域を奪ってしまいます。
SingleChildScrollView+Rowウィジェットの組み合わせだとテキストのフレキシブルなレイアウトなど活用ができますが、Columnだと使うことがなさそうですね。
今回エラーがでたのもRowの中のColumnでラップされたTextウィジェットに対してExpandedを使ったためでした。
実際にはRow側にExpandedを使用することで対処できるので、記述位置に気をつけたいですね。


# まとめ
SingleChildScrollView+Columnの組み合わせでフレキシブルなウィジェットを使う対処方法があるが、それはレイアウトの設計上使うことがなさそう？もし、使っていたとしたら記述ミスの可能性

- Stack+imageでimageをExpandedをラップし、背景画像に使うとしてもContainerを使えば同じことができる
- Rowの中で使うことはあるが、Columnだと端末サイズを超えるとExpandedが占める領域はなくなるため意味がない  
もし初めに書いたエラーが出た場合は、Expandedなどの記述位置が違う(本来はRowの中に書くべき)可能性あり。



まだ、アプリ開発をはじめてから3ヶ月なので、これからアプリの学習を頑張っていきたいと思います！！

# 参考にさせていただいた記事さま
- https://zenn.dev/r0227n/articles/difference_between_part_and_import
- https://zenn.dev/zudah228/articles/5143dcf370526d
練習用のReact環境構築してみる

・node.jsがインストールされているか確認
```
node -v
```
・下記だとnode_module、package.jsonなどしか作成されない
```
npm install react react-dom
```
・下記だとsrcディレクトリなども作成される
```
npx create-react-app react_app
```
・Viteで作成
```
npm create vite@latest react_app -- --template react
```
・ViteでTypeScriptファイルを使って作成
```
npm create vite@latest react_app -- --template react-ts
```
yukicoder No.22 括弧の対応　解説

[問題文](https://yukicoder.me/problems/no/22)

# 解説
こういう問題はたいてい**stack**を用いる。
今回使う配列
・Pa(vector)
  $Pa_i$=$i$と対応しているものの番号。
  
今回の問題の場合分けは、$s_i$によって決まる。
$s_i$='('のとき→stackにiをpushする。
$s_i$=')'のとき→
$j$=stackの先頭の要素
・$Pa_i$=$j$
・$Pa_j$=$i$
・stackの先頭をpopする。

これを繰り返していき、最後はk番目の要素を求めれば終了。
「与えられる文字列は、すべての文字で**括弧の対応があると保証される**とする。」と、問題文の最後に明記されてあるので、わざわざREの対策の場合分けの心配をする必要はない。

# C++23での解答例

```C++
#include <bits/stdc++.h>
using namespace std;

int main(){
  int n,k;string s;cin>>n>>k>>s;
  stack<int> sta;vector<int> Pa(n);
  for(int i=0;i<n;i++){
    if(s[i]=='(')sta.push(i);
    else{
      int j=sta.top();sta.pop();
      Pa[i]=j;
      Pa[j]=i;
    }
  }
  cout<<Pa[k-1]+1<<endl;
}
```
Next.js14 App Router 動的ルートがNot Foundで詰まった話

# はじめに
Next.js14のApp Routerで動的ルートを構築していた際に詰まった箇所があったので、
備忘として残す。

# 発生事象
動的ルートのフォルダ構成とリンククリック時の遷移先URLが一致しているにもかかわらず、
404 NotFoundしか表示されない。

###### フォルダ構成
![スクリーンショット 2024-07-23 145248.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551799/5138a740-d240-66dc-b52a-d0fb0bf33011.png)

###### 遷移先URL
![スクリーンショット 2024-07-23 145607.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551799/ca1af371-e60b-bd44-d9bc-212dce9f6e9f.png)


# 試したこと
・キャッシュクリア
・動的ルートを/app/bbs-posts/[id]/page.tsxで設定しており、idの型をnumberからstringに変換
・page.tsxの拡張子を.jsxに変更

# 結果
上記3つ目の拡張子を変更した際にモジュールインポートの再読み込みが行われ？解決した。
※解決後、拡張子は元の.tsxに戻してます。

# まとめ
また同事象が発生した場合は、以下手順で確認する。

１．リンククリック時の遷移先URLが意図したパスになっているか？
２．１のURLにのっとったフォルダ構成となっているか？
３．表示したいページ（２のフォルダ内にあるpage.tsx）を再作成する。
Gitのエラー（Recv failure:Connection was reset）の対処法

# エラー内容
ある日突然リモートリポジトリへの操作（プッシュやプル、クローン）をすると以下のエラーが発生するようになった。

## エラー
> リモート リポジトリへのプッシュ中にエラーが発生しました: Git failed with a fatal error.
> Git failed with a fatal error.
> unable to access 'https://dev.azure.com/・・・/': Recv failure: Connection was reset

# 対処法
ネットで調べただけだから原因まではわからないが、以下を実施すればひとまずエラーは発生しなくなった。

1. ネットワーク接続の表示を起動させる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612369/08747395-0885-e575-8999-d2aa63a57afd.png)
2. Wi-Fiを右クリックしプロパティを開く
![１３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612369/33293c58-453d-eb65-c9e5-77131233113b.png)
3. インターネットプロトコルバージョン6（TCP/IPv6）のチェックを外す
![１２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612369/f569678d-3d4d-9d29-a824-8ef59f27aece.png)

# 参考
以下、英語の記事だが参考にしたサイトを載せておく
- [https://stackoverflow.com/questions/75748384/git-error-fatal-unable-to-access-https-dev-azure-com-recv-failure](https://stackoverflow.com/questions/75748384/git-error-fatal-unable-to-access-https-dev-azure-com-recv-failure)
- [https://stackoverflow.com/questions/67230241/fatal-unable-to-access-https-dev-azure-com-xxx-openssl-ssl-connect-connec/69712045#69712045](https://stackoverflow.com/questions/67230241/fatal-unable-to-access-https-dev-azure-com-xxx-openssl-ssl-connect-connec/69712045#69712045)
Macでちょっと考えて好きなRubyを使う方法

https://qiita.com/hana-da/items/b7afec4393440d74c17a

そうなんですよ。一番新しいのが一番いいやつなので、それを使っておくのがいいのですよ。。。

でもね、古風なのもよかったりするじゃないですか? 2.7.8 とか。

それ、できるよ。そう [rbenv](https://github.com/rbenv/rbenv) ならね。

# そもそも rbenv とは

[rbenv](https://github.com/rbenv/rbenv) とは様々なversionのRubyを共存(同時にインストール)させつつ、簡単にいい感じに切り替えて使えるようにするツールです。
そして [ruby-build](https://github.com/rbenv/ruby-build) とはrbenv環境用に様々なversionのRubyを簡単にインストールする仕組みです。

なので流れとしては

1. rbenv 自体を整える
2. ruby-build を整える
3. ご希望のRubyのversionを選ぶ
4. ご希望のversionのRubyをbuild(インストール)する
5. ご希望のversionのRubyを選択する

です。

[Macで何も考えずに最新の一番いいRubyを使う方法](https://qiita.com/hana-da/items/b7afec4393440d74c17a) ではこの一連の流れを説明しました。

# Ruby 2.7.8 をインストールする

一番いいやつじゃない。。。それは分っている。脆弱性の対応も行なわれていなくてバグ対応などのメンテナンス、サポートもとっくの昔に切れていて使うのは非常に危険なバージョン。。。でも好き。2.7.8。。。

という人が沢山いるみたいなので 2.7.8 を使えるようにしてみましょう。

rbenv/ruby-build は整っているので 3,4,5 をやればOKです。

## やってくよ

今あなたが使っているrubyは一番いい 3.3.4 のはずです。

```
ruby -v
```

とすると

> ruby 3.3.4 (2024-07-09 revision be1089c8ec) [x86_64-darwin22]

などと表示されますね。

まず 2.7.8 がインストール可能かを調べます。

```
rbenv install --list
```

> 3.1.6
> 3.2.4
> 3.3.4
> jruby-9.4.8.0
> mruby-3.3.0
> picoruby-3.0.0
> truffleruby-24.0.1
> truffleruby+graalvm-24.0.1
>
> Only latest stable releases for each Ruby implementation are shown.
> Use `rbenv install --list-all' to show all local versions.


**Only latest stable releases for each Ruby implementation are shown.** という事なので、当然表示されませんが

```
rbenv install --list-all
```

すれば出てくるはずです。

build しましょう。

```
rbenv install 2.7.8
```

10分から20分ほど待って、buildが終ったら

```
rbenv global 2.7.8
```

すると

```
ruby -v
```

> ruby 2.7.8p225 (2023-03-30 revision 1f4d455848) [x86_64-darwin21]

はい OK
簡単ですね。

## 一番いいやつに戻す

```
rbenv global 3.3.4
```

して

```
ruby -v
```

> ruby 3.3.4 (2024-07-09 revision be1089c8ec) [x86_64-darwin22]

切り替え簡単

# インストール済みのRubyがわからなくなったら?

```
rbenv versions
```

してみましょう。

> system
  2.3.3
  2.3.6
  2.3.8
  2.4.1
  2.5.8
  2.6.3
  2.6.4
  2.6.5
  2.6.6
  2.7.1
  2.7.2
\* 2.7.8 (set by /Users/hana-da/.rbenv/version)
  3.0.0-preview1
  3.0.0-preview2
  3.1.1
  3.3.2
  3.3.3
  3.3.4
  3.4.0-preview1
  3.4-dev
  
こんな感じで build(インストール)済みの version がわかります。
これはつまり `rbenv install` しなくても、`rbenv global` で切り替えるだけで使える一覧という事になります。
Unityで新規プロジェクトを作ろう！2024年7月版

# はじめに
本記事の想定読者様は……

* Unityにおける基本的なサービスが使用できる環境にあるお方
* プロジェクトを作るときの一つの基準が知りたいというお方
* 個人的にUnityを利用されるお方

となっております。

# 1.エディターバージョンの選び方
Unityの新機能とか使わない、よくわからないという方はLTSの中から選ぶのがおすすめです。
>LTS(Long Term Support)とは、リリース後2年間Unityさんがエディターの面倒を見てくれるというものです。

また、エディターバージョンには3つの要素が関わります。

 2023.2.20f1を例としたとき
##### 1.メジャーバージョン：年号が書かれているところ = 2023
##### 2.マイナーバージョン：次の数字 = 2
##### 3.パッチバージョン：それ以降 = 20f1
 となります。

そして、私のおすすめするエディターバージョンの選び方は
以下の通りです。

### ・メジャー&マイナーは最新のものを選びます
最新のLTSを選ぶなら自動的にそうなるはずです。

### ・パッチバージョンに含まれるアルファベットは"f"を選びます
ちなみに、"a" = アルファ版, "b" = ベータ版です。(作りかけみたいなもの)

### ・パッチバージョンはできる限り古いものを選びます※1
パッチバージョンのアルファベット前の数字は修正されるたびに繰り上がります。

これを勘案して現状(2024年7月)で一番良いものを考えてみると
### 2022.3.0f1
となります。

……しかし、運のようなものですのでどのパッチバージョンが自身のプロジェクトに最適(※2)かはわかりません。

※1 パッチバージョンを下げるのは基本的にエディター側のバグやエラーで困ったときにバージョンをあげる余裕を作るための措置です。
※2 開発中のバージョン変更は避け、完成させるためのプロジェクト選びの時にプロジェクトの要素を振り返りながら各バージョンを調べてあげましょう!

# 2.コアの選び方
基本的にRPと名の付くものから選びます。
RPはレンダラーパイプライン(今回は意味を気にしなくてよい)と読みます。

こちらは目的別に選ぶのがおすすめとなっております。

名前と所感、使用目的は以下の通りです。
### ・URP(ユニバーサルRP)
これを使えば基本的に問題はない。
>技術の向上がプロジェクトの目的にあるなら、はじめはURPがおすすめです。
URPは軽量かつビルトインRPと互角といえる描画を行うことができ、
Unity最新機能のほどんどを使用することができます。

### ・HDRP(ハイディフィニションRP)
高画質を求めるとき。
>HDRPではURPで使うことのできない機能にも手を出せるのでURPに慣れた人の技術向上、高品質な描画が欲しい人が使うとよいと思います。
### ・ビルトインRP
UIのレガシーみたいなもので機能追加は行われないため、将来的には使われなくなる可能性。
>ゲームジャムのような催しの時にURPがわからないといった方たちが多数を占めるときに使うのがよいのではないかと思います。

# 最後に
お読みいただきありがとうございました。

プロジェクトは悩まずにサッと作りたいものだと思います。
私もその一人ですので、同じように考えておられる方の一助となれますと幸いに存じます。
SQLはAIにお任せするととっても楽だった件

GitHub Copilot Chat でよい体験ができたので小さく投稿してみる。

## 要約
DDL を Copilot に参照させて SQL を書くようにお願いすると精度の高いものを書いてくれる。

## 環境
- vscode
- [copilotChat拡張](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-chat)を準備
※設定方法などはリンク先を参照
- 実験repo
  - https://github.com/bushiyama/sqltest

## example

イメージ画像
![スクリーンショット 2024-07-23 14.18.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325245/3bddc2b4-809a-eea6-8c8e-0f9359c6d495.png)

### DDLファイルを開く
例題レベルだと何も参照しなくても書いてくれますが、精度が上がるのでアクティブにしておくのがベター。

### copilot chat で会話を開始する
以下、会話をそのまま貼り付けます。

GitHub Copilot:
こんにちは bushiyama さん。何かお役に立てることはありますか?

bushiyama:
piyo.hoge_idが0の場合、piyo.fuga_idからfugaレコードを特定してfuga.hoge_idをSETするupdate文を書いて。

GitHub Copilot:
```
UPDATE piyo
JOIN fuga ON piyo.fuga_id = fuga.id
SET piyo.hoge_id = fuga.hoge_id
WHERE piyo.hoge_id = 0;
```

bushiyama:
これをdry runしてテストしたい。

GitHub Copilot:
SQLのdry runは、実際にはSQL自体に組み込まれた機能ではありません。ただし、テスト環境での実行やトランザクションを使用して実行後にロールバックすることで、実質的なdry runを実現できます。以下は、トランザクションを使用して更新をテストし、その後ロールバックする方法の一例です。

テスト環境の準備: 実際のデータベースに影響を与えずにテストを行うために、テスト用のデータベース環境を準備します。

トランザクションの開始: 更新を行う前にトランザクションを開始します。これにより、後で変更をロールバックできます。

更新クエリの実行: 提案された更新クエリを実行します。

結果の確認: 必要に応じて、更新が期待通りに行われたかどうかを確認します。

ロールバック: 実際には変更を保存せずに、トランザクションをロールバックします。

以下は、このプロセスを実装するためのSQLコマンドの例です。

```sql
-- トランザクションの開始
START TRANSACTION;

-- 更新クエリの実行 (例)
UPDATE piyo
JOIN fuga ON piyo.fuga_id = fuga.id
SET piyo.hoge_id = fuga.hoge_id
WHERE piyo.hoge_id = 0;

-- 結果の確認のためのSELECT文 (例)
SELECT * FROM piyo WHERE hoge_id = 0;

-- ロールバック
ROLLBACK;
```

注意: この方法は、更新がデータベースに永続的な影響を与えないようにするためのものです。実際のデータベースではなく、テスト環境で実行してください。また、実行する前に、テスト環境が最新の状態にあることを確認してください。

## まとめ
ふだん、素の SQL で update 文など書かず自信がなかったので、 copilot さんにお願いしたら欲しいものがスッと返ってきて最高だったっていうお話。
PowerShellによるフォルダサイズ確認

# 🗂️💻 PowerShellで簡単！フォルダサイズを一括計算するスクリプト

こんにちは！今回は、PowerShellを使って指定したフォルダ内のサブフォルダサイズを簡単に計算するスクリプトをご紹介します。このスクリプトを使えば、大量のフォルダのサイズを瞬時に把握できます。さあ、一緒に見ていきましょう！

## 🌟 スクリプトの特徴

- サブフォルダのサイズを自動計算
- 結果を見やすい表形式で表示
- 隠しファイルも含めて計算
- エラーを無視して処理を継続

## 📝 スクリプト本体

```powershell
$path = "C:\User\user"

Get-ChildItem -Path $path -Directory | ForEach-Object {
    $size = (Get-ChildItem $_.FullName -Recurse -Force -ErrorAction SilentlyContinue | 
             Where-Object { !$_.PSIsContainer } |
             Measure-Object -Property Length -Sum).Sum / 1MB
    [PSCustomObject]@{
        "Folder" = $_.Name
        "Size (MB)" = [math]::Round($size, 2)
    }
} | Format-Table -AutoSize
```

## 🔍 スクリプトの解説

1. **パスの設定**: 
   ```powershell
   $path = "C:\User\user"
   ```
   計算したいフォルダのパスを指定します。必要に応じて変更してください。

2. **サブフォルダの取得**:
   ```powershell
   Get-ChildItem -Path $path -Directory
   ```
   指定したパス内のサブフォルダを全て取得します。

3. **各フォルダのサイズ計算**:
   ```powershell
   ForEach-Object { ... }
   ```
   各サブフォルダに対して以下の処理を実行します。

4. **ファイルサイズの合計**:
   ```powershell
   $size = (Get-ChildItem $_.FullName -Recurse -Force -ErrorAction SilentlyContinue | 
            Where-Object { !$_.PSIsContainer } |
            Measure-Object -Property Length -Sum).Sum / 1MB
   ```
   - `-Recurse`: サブフォルダも含めて全てのファイルを取得
   - `-Force`: 隠しファイルも含める
   - `-ErrorAction SilentlyContinue`: エラーを無視して続行
   - `Where-Object { !$_.PSIsContainer }`: ファイルのみを対象とする
   - サイズの合計をMB単位に変換（GB単位にしたい場合は"1GB"とする）

5. **結果のフォーマット**:
   ```powershell
   [PSCustomObject]@{
       "Folder" = $_.Name
       "Size (MB)" = [math]::Round($size, 2)
   }
   ```
   フォルダ名とサイズ（小数点2桁まで）を格納したオブジェクトを作成

6. **表形式で表示**:
   ```powershell
   Format-Table -AutoSize
   ```
   結果を見やすい表形式で出力します。

## 💡 使い方

1. スクリプトをテキストエディタにコピーし、`.ps1`拡張子で保存します（例：`GetFolderSizes.ps1`）。
2. `$path`変数を、計算したいフォルダのパスに変更します。
3. PowerShellを開き、スクリプトのあるディレクトリに移動します。
4. 以下のコマンドでスクリプトを実行します：
   ```
   .\GetFolderSizes.ps1
   ```

## 🚀 活用例

- 大量のプロジェクトフォルダのサイズを一括チェック
- バックアップ前にフォルダサイズを確認
- ディスククリーンアップの際の対象フォルダ選定

## ⚠️ 注意点

- PowerShellの実行ポリシーが適切に設定されていることを確認してください。
- 大量のファイルやサブフォルダがある場合、処理に時間がかかる場合があります。

## 🎉 おわりに

このスクリプトを使えば、フォルダサイズの管理が格段に楽になります。ぜひ試してみてください！カスタマイズや改善点があれば、コメントで教えてくださいね。Happy PowerShelling! 🚀💻
Rubyで配列の変更を防ぐ：インスタンスの共有とコピーについて

今回はRubyでの配列のインスタンス共有とコピーについて、実際の問題とその解決方法を紹介します。この記事では、特に`dup`メソッドを使って元の配列が変更されるのを防ぐ方法に焦点を当てます。

## 問題の背景
Rubyでは、変数にはオブジェクトの実体ではなく、そのオブジェクトへの参照が格納されます。したがって、ある変数を別の変数に代入すると、両方の変数が同じオブジェクトを参照することになります。これにより、どちらかの変数を通じてオブジェクトが変更されると、他方の変数でもその変更が反映されることになります。

例えば、以下のコードを見てください。

```ruby:example.rb
original_array = ["apple", "grape"]
save_array = []
p save_array = original_array
original_array[0] = "banana"
p original_array
p save_array
```
このコードを実行すると、`save_array`に`original_array`を保存したと思いましたが、実際には`original_array`の変更が`save_array`にも反映されてしまいます。
これは、save_arrayがoriginal_arrayと同じインスタンスを参照しているためです。

```terminal:terminal
["apple", "grape"]
["banana", "grape"]
["banana", "grape"]
```
## 解決方法：`dup`メソッドを使用してコピーを作成する
この問題を解決するには、元の配列のコピーを作成してから変更を行います。Rubyの`dup`メソッドを使ってこれを実現します。

修正後のコード
```ruby:example.rb
original_array = ["apple", "grape"]
save_array = []
p save_array = original_array.dup
original_array[0] = "banana"
p original_array
p save_array
```
このコードでは、`dup`メソッドを使用して`original_array`のコピーを作成し、そのコピーに対して変更を行っています。これにより、`save_array`は変更されずに済みます。

```terminal:terminal
["apple", "grape"]
["apple", "grape"]
["banana", "grape"]
```
## まとめ
Rubyでは、変数が同じオブジェクトを参照していると、意図せずオブジェクトが変更されることがあります。この問題を防ぐためには、`dup`メソッドを使用してオブジェクトのコピーを作成し、元のオブジェクトが変更されないようにすることが重要です。
Quick Start: Create a Data Cloud Segmentを実際に行ってみた


+ [Create a Data Stream in Data Cloud](https://qiita.com/Keiji_otsubo/items/959d0587a65cf592748f)

https://trailhead.salesforce.com/content/learn/projects/quick-start-create-a-data-cloud-segment/create-and-activate-a-segment-in-data-cloud

# Create and Activate a Segment in Data Cloud

順番がある

In order to do that you first need to complete the Create a Data Stream in Data Cloud, and Quick Start: Create an Identity Resolution Ruleset, and Quick Start: Enhance Data with Insights projects. These projects established the data and processes needed for the segments you’re going to create. You use the same Developer Edition org from those projects to complete this one. These Developer Editions are only available for a limited 14-day period—be sure to complete this project before your org expires.

何もしないで、検証ボタンをクリック

:::note alert
We can’t find a segment named ‘No Zip Code’. Make sure you named the segment exactly as it’s written in this unit.

「郵便番号なし」という名前のセグメントが見つかりません。この単元で説明されているとおりにセグメントに名前を付けていることを確認してください。
:::

**用語集**

+ **Segment**:データをフィルタリングして、顧客を理解し、ターゲットを絞り、分析するための便利なセグメントを作成します。
+ **Segment on**:セグメンテーション内で、セグメント オンはセグメントの構築に使用されるターゲット オブジェクトを定義します。
+ **Publish**:公開は、フィルター条件に基づいてセグメントを検索および構築するプロセスです。選択したスケジュールに従って、または必要に応じてセグメントを公開できます。
**Activation**:アクティベーションは、オーディエンス セグメントをアクティベーション ターゲットに移動するプロセスです。
+ **Direct attributes**:セグメント ターゲットと 1 対 1 の関係を持つ属性。つまり、セグメント化された各エンティティには、プロファイル属性のデータ ポイントが 1 つだけあります。したがって、顧客データの場合、郵便番号または名のエントリは 1 つだけになります。
+ **Related attributes**:複数のデータ ポイントを持つことができる属性。


:::note alert
We can't find any filters associated with related attributes from the 'No Zip Code' segment.

「郵便番号なし」セグメントの関連属性に関連付けられたフィルターが見つかりません。
:::

この部分を保存してなかったみたい。設定した記憶はあるけど...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/416d72f1-5228-3b6d-1c40-ef2cb314d505.png)


:::note
We can’t find the expected 'Is US Based' attribute configuration in the 'No Zip Code' segment. Edit the segment filter, and specify 'Is Equal To' 'true' for the 'Is US Based' attribute.

「郵便番号なし」セグメントに、予期された「米国ベース」属性構成が見つかりません。セグメント フィルターを編集し、「Is US Based」属性に「Is Equal To」「true」を指定します。
:::

ここを間違っていましたね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/71d64a03-f951-aa6b-7c4d-ee9e2e0c59d9.png)

# Whoops, looks like there was a problem. Please try again.

+ [【未解決】Datacloud Segment Activation Trailhead Module - Error Message - Step not yet complete in Data Cloud](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000J5h06)
yukicoder No.16 累乗の加算　解説

[問題文](https://yukicoder.me/problems/no/16)

# 前提知識
繰り返し二乗法

# 解説
まず、$(x^a)modb$を$O(log a)$で求める方法として、繰り返し二乗法というものがある。
どういうものかというと、
①まず事前に$x^1$,$x^2$,$x^4$,$x^8$...を求める。
②$a$&$1=1$なら解に$x^1$をかける、$a$&$2=2$なら解に$x^2$をかける...
というのを繰り返すことで、$x^a$を求める、というのが本髄。
この問題の制約は$N\leqq 100$かつ$A\leqq 10^9$なので、$O(NlogA)$は十分に間に合う。

そして、その繰り返し二乗法をどうやってコードに移すか。それは下記のコードを使えば計算可能である。

```C++
using ll=long long;
ll mod_pow(ll x,ll n,ll mo){
  //(x^n)%moを求める
  ll res=1;
  while(n>0){
    if(n&1)res=res*x%mo;
    x=x*x%mo;
    n>>=1;
  }
  return res;
}
```

また、atcoder/allを使えば
・modint::set_mod($1000003$)をする。
・$x$をmodint型に変更する。
これで$x.pow(A)$をすれば$x^amod1000003$が求まる。

これらを利用して$\sum_{i=1}^n x.pow(A)$をし、計算の都度$mod1000003$をとれば、解が求まる。

# 自作のmod_pow関数を使ったコード

```C++
#include <bits/stdc++.h>
using namespace std;
using ll=long long;

ll mod_pow(ll x,ll n,ll mo){
  ll res=1;
  while(n>0){
    if(n&1)res=res*x%mo;
    x=x*x%mo;
    n>>=1;
  }
  return res;
}

int main(){
  ll x,n,ans=0;cin>>x>>n;
  vector<int> a(n);
  for(int i=0;i<n;i++)cin>>a[i];
  for(int i=0;i<n;i++){
    ans+=mod_pow(x,a[i],1000003);
    ans%=1000003;
  }
  cout<<ans<<endl;
}
```
# ACLのmodintを使ったコード
```C++
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
using ll=long long;
using mint=modint;

int main(){
  mint::set_mod(1000003);
  ll n,x;cin>>x>>n;
  mint g=x,ans=0;
  vector<int> a(n);
  for(int i=0;i<n;i++)cin>>a[i];
  for(int i=0;i<n;i++){
    ans+=g.pow(a[i]);
  }
  cout<<ans.val()<<endl;
}
```
Reactアプリを自動デプロイすると画面が白い

## はじめに
前回作ったアプリを、CI/CDでデプロイ&自動テストすることに取り組んでいます。
ローカルからFirebaseにデプロイするのは問題なくできましたが、アプリをgit pushするだけで本番に自動デプロイ(cd)したところ、画面が真っ白に。解決した方法を書きます

https://qiita.com/Shun_P/items/419791aa4fe150ca29d0


## 事象

```
$ make deploy
```
でローカルからmakeコマンドでデプロイすると問題なくデプロイできていました。
ところが、GithubActionsでReactをビルドして、Firebaseにデプロイすると画面が真っ白になってしまい、うまくデプロイできません。

Github Actionsに表示されたエラー

```
index-BQD-aLaS.js:40 Uncaught Error: Missing Supabase environment variables
    at index-BQD-aLaS.js:40:156882
```
→Supabaseに関連する環境変数が欠けている

## 解決策

ローカルからデプロイするのと異なりGithub Actionsでデプロイする際にはGitHub Secretsにキーを保存しておかなければならない（知らなかった。）

ワークフローファイルで ${{ secrets.SECRET_NAME }} として参照する。

```.yamlの例

name: Deploy to Production

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    
    - name: Use Node.js
      uses: actions/setup-node@v2
      with:
        node-version: '20'
        
    - name: Install dependencies
      run: npm ci
      
    - name: Build
      env:
        SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
        SUPABASE_ANON_KEY: ${{ secrets.SUPABASE_ANON_KEY }}
      run: npm run build
      
    - name: Deploy
      # デプロイのステップ
```



## おわりに
記事にするとなんてこと無い話なのですが、初めてGithub Actionsを使ったということもあり、原因を見つけるまでに時間がかかり1時間以上かかってしまいました。初めてなにかのツールを使う時はよくドキュメントを読んだ方がいいですね。急がば回れ。
Git入門：高度なテクニックと特定のユースケース

Gitは、基本的なバージョン管理機能だけでなく、開発プロジェクトを効率的に進めるための高度なテクニックも提供しています。この記事では、さらに高度なGitのテクニックと特定のユースケースについて記述します。

### 目次

1. Gitのリバートとリセット
2. Gitのサブツリー
3. Gitのシリアルワークフロー

### 1. Gitのリバートとリセット

Gitのリバートとリセットは、コミット履歴を管理するための強力なツールです。

### リバート

リバートは、指定したコミットを打ち消す新しいコミットを作成します。これにより、履歴を保持しながら変更を元に戻すことができます。

```bash
git revert <コミットID>
```

### リセット

リセットは、指定したコミットまで履歴を戻し、その後のコミットを削除します。慎重に使用する必要があります。

```bash
git reset --hard <コミットID>
```

ソフトリセットを行うと、履歴を戻しつつ変更はステージングされます。

```bash
git reset --soft <コミットID>
```

### 2. Gitのサブツリー

Gitのサブツリーは、サブモジュールの代替として使用され、外部リポジトリをプロジェクトに統合する方法です。

### サブツリーの追加

サブツリーを追加するには、以下のコマンドを使用します。

```bash
git subtree add --prefix=<ディレクトリ> <リポジトリURL> <ブランチ> --squash
```

例：

```bash
git subtree add --prefix=vendor/package https://github.com/user/repo.git main --squash
```

### サブツリーの更新

サブツリーを更新するには、以下のコマンドを使用します。

```bash
git subtree pull --prefix=<ディレクトリ> <リポジトリURL> <ブランチ> --squash
```

例：

```bash
git subtree pull --prefix=vendor/package https://github.com/user/repo.git main --squash
```

### 3. Gitのシリアルワークフロー

シリアルワークフローは、各開発者が順番に変更をマージすることで、コンフリクトを最小限に抑える方法です。

### 基本的なシリアルワークフロー

1. **ブランチの作成**: 各開発者は独自のブランチを作成します。

```bash
git checkout -b feature-branch
```

1. **変更のコミット**: 各開発者は変更をコミットします。

```bash
git commit -m "Add new feature"
```

1. **リモートリポジトリへのプッシュ**: 各開発者は変更をリモートリポジトリにプッシュします。

```bash
git push origin feature-branch
```

1. **メインブランチへのマージ**: 各開発者は順番にメインブランチにマージします。

```bash
git checkout main
git pull origin main
git merge feature-branch
git push origin main
```

### まとめ

この記事では、Gitのリバートとリセット、サブツリーの使用方法、シリアルワークフローについて記述しました。これらの高度なテクニックを活用することで、開発プロジェクトを効率的に管理し、チーム全体の生産性を向上させることができます。