OmniAICreator/Qiita-1.07M huggingface dataset:
ラズパイにnode.jsのインストール＆GitHubのクローン

1.ラズパイ3以降のビルド済node.jsダウンロード時に選択するアーキテクチャ

1-1.ターミナルで以下を実行
uname -m

1-2.出力：
・aarch64 → ARM64を選択
・armv7l  → ARMv7を選択

2.Linux用の Node.js🄬v22.13.1(LTS) と npm を fnm を使ってダウンロードする
https://nodejs.org/ja/download/

2-1.ターミナルで以下を実行
# fnmをダウンロードしてインストールする：
curl -o- https://fnm.vercel.app/install | bash

# Node.jsをダウンロードしてインストールする：
fnm install 22

2-2.「bash:fnm:コマンドが見つかりません」と出た時
source ~/.bashrc #fnmが認識されるようになる

2-3.確認
node -v
npm -v
fnm --version

3.GitHub CLIのインストール
sudo apt install gh

3-1.確認
gh --version

4.GitHubへログイン

4-1.ターミナルで以下を実行
gh auth login

4-2.ターミナルで以下を入力
・What account do you want to log into?　→　GitHub.com
・what is your preferred protocol for Git operations? → HTTPS
・Authenticate Git with your GitHub credentials? → Yes
・How would you like to authenticate GitHub CLI? → Login with a web browser

エンターを押すとGitHubのログインページが立ち上がるのでログインする

4-3.ターミナルに表示されたワンタイムコードを入力する
First copy your one-time code:　ここに表示された英数字

5.GitHubソースコードのクローン
git clone Githubのアドレスを入力
SQLServerで２番目の区切り文字の出現位置を検索し切り出す

# 挨拶
初めまして、日本システム開発株式会社の鈴木です。
技術者として更なる向上を目指すためQiitaアウトプットをする取り組みを行っています。
技術者としては経験が浅く発信内容はとにかく試したものの覚書になります。
今回はSQLServerにてSELECT文内で特定の区切り文字を含むカラムについて、2番目の区切り文字から固定数の区間を切り出す方法について記載します。

# やりたいこと
以下のように、特定の区切り文字（'-')を複数もち区切り内の桁数が4桁固定である値を含むカラムが存在するとします。
```:columnA
0123-4567-8901
1234-1098-4321-1234
ABCD-EFGH-IJKL
...
```
このような列の中から3番目の区切りを抽出し以下のようなカラムとして射影します。
```
8901
4321
IJKL
...
```

# 対応
最終的には以下のようなSELECT文を発行し対応しました。
~~~sql:SelectSecondBlock.sql
SELECT SUBSTRING(columnA,CHARINDEX('-',columnA,CHARINDEX('-',columnA)+1)+1,4);
~~~
以下の2関数を利用して２番目の区切り文字の出現位置から4文字を切り出しています。
---文字の切り抜き
SUBSTRING(切り出し元カラム,開始位置、切り出し文字数）
---区切り文字の出現位置取得
CHARINDEX(検索文字,検索先カラム,検索開始位置）
※検索開始位置は省略した場合0（先頭から）

まず`CHARINDEX('-',columnA)+1`で１つ目の区切り文字の１文字あとを検索します。
検索した位置から４文字を取得することで２番目の区間を切り出すことができます。
~~~sql:SelectFirstBlock.sql
SELECT SUBSTRING(columnA,CHARINDEX('-',columnA)+1,4);
~~~
```sql:result
4567
1098
EFGH
...
```
しかし今回は２つ目の区切り文字から文字の切り出しを行いたいため、CHARINDEX()の検索開始位置を１つ目の区切り文字の１文字あとに指定する必要があります。つまり
`CHARINDEX('-',columnA,CHARINDEX('-',columnA)+1)+1)`
のように開始位置に１つ目の区切り文字の１文字あとを設定した上でもう一度区切り文字の開始位置を検索することで２つ目の区切り文字の位置を検索することができます。

# おわりに
本稿では特定の文字で区切られたカラムに対し3つめの区域を切り出すSQLについてまとめました。ただし、N番目の区域を切り出すためにはN-2回の繰り返し処理が必要になるため、処理の負荷が高くなることが懸念されるだけでなく、可読性も悪いです。単純に値として欲しいだけならSQLによる取得後に分割処理を別に設けた方がよいでしょう。今回は３つ目の区域の値を利用して抽出カラムを指定する必要がありこのような形になりました。

# 備考
本稿はSQLServerにて特定文字のN番目の出現位置を取得するSQLを作成しましたが、MySQLでは指定文字列が指定回数出現するまでの文字列を切り出すSUBSTRING_INDEX()関数があるそうです。MySQL環境ではそちらを使った方が無難でしょう。
群馬イベントアプリ「Gunma Navi」データモデル設計の全貌を公開✨

# 開発日記10日目：データモデル設計完了！Gunma Naviの心臓部を作り上げました！💡

群馬県民がもっと地元イベントを楽しめるように！イベント発見アプリ「**Gunma Navi**」を個人開発している🐮です！

---

🎮 **今日達成した"ゲームで言うと"**

「ついにダンジョンのマップを完成させ、攻略の道筋が見えた状態」🗺️✨

---

🌟 **今日のハイライト**

✅ アプリで扱うデータを洗い出し！

✅ データモデルの設計完了！

✅ データの属性と関連性を明確化！

---

🛠 **今日の作業内容**

1. **アプリで扱うデータのリストアップ**

   Gunma Naviで提供する機能を考慮し、以下の主要なデータを洗い出しました：

   - **イベント情報**

     - イベント名、開催日時、場所、詳細情報など

   - **ユーザー情報**

     - ユーザー名、メールアドレス、お気に入りのイベントなど

   - **コメント・レビュー**

     - ユーザーのコメント、評価、投稿日時

   - **カテゴリー情報**

     - 温泉、グルメ、フェスティバルなどのイベントカテゴリ

   - **場所情報**

     - 住所、緯度経度、アクセス方法

2. **データモデルの設計**

   各データの関係性を視覚的に把握するために、ER図を作成しました。主要なエンティティとその関連は以下のとおりです：

   - **ユーザー**は**複数のコメント**を投稿でき、**複数のお気に入りイベント**を持つことができる。

   - **イベント**は**1つのカテゴリー**に属し、**複数のコメント**を持つ。

   - **カテゴリー**は**複数のイベント**を持つ。

   - **場所**は**複数のイベント**に関連付けられる。

3. **各データの属性と関連性の定義**

   - **イベント**

     - 属性：

       - イベントID（主キー）

       - イベント名

       - 開催日時

       - 詳細情報

       - カテゴリーID（外部キー）

       - 場所ID（外部キー）

     - 関連：

       - **カテゴリー**（多対1）

       - **場所**（多対1）

       - **コメント**（1対多）

   - **ユーザー**

     - 属性：

       - ユーザーID（主キー）

       - ユーザー名

       - メールアドレス

     - 関連：

       - **コメント**（1対多）

       - **お気に入りイベント**（多対多）

   - **コメント**

     - 属性：

       - コメントID（主キー）

       - ユーザーID（外部キー）

       - イベントID（外部キー）

       - コメント内容

       - 評価（5段階）

       - 投稿日時

     - 関連：

       - **ユーザー**（多対1）

       - **イベント**（多対1）

   - **カテゴリー**

     - 属性：

       - カテゴリーID（主キー）

       - カテゴリー名

     - 関連：

       - **イベント**（1対多）

   - **場所**

     - 属性：

       - 場所ID（主キー）

       - 住所

       - 緯度経度

       - アクセス方法

     - 関連：

       - **イベント**（1対多）

---

🔍 **データモデル設計のポイント**

1. **ユーザーとイベントの多対多関係**

   - お気に入り機能を実装するため、ユーザーとイベント間に多対多の関係を設定しました。

   - 中間テーブルとして「お気に入り」テーブルを作成予定。

2. **コメント機能の設計**

   - ユーザーがイベントに対してコメントや評価を残せるようにし、他のユーザーが参考にできるようにします。

3. **カテゴリーによるイベント分類**

   - ユーザーが興味のあるイベントを見つけやすいよう、カテゴリーで分類。

   - 群馬ならではのカテゴリーも追加予定！（例：温泉、だるま市）

---

🗾 **群馬愛ある開発のこだわり**

「**草津温泉**や**伊香保温泉**など、温泉地ごとの特集ページも作りたい！  
地元ならではの**隠れた名所**や**季節限定イベント**も網羅して、群馬の魅力を最大限に伝えます♨️」

---

💬 **読者のみなさんに質問！**

「あなたが群馬で一番好きなイベントや場所はどこですか？ぜひコメントで教えてください！  
皆さんのおすすめをアプリに反映できるように頑張ります！😊」

---

💡 **今日の気づきと学び**

**成功した点**

- **データの整理がスムーズに進んだ**

  - 今までの要件定義やUI/UXデザインのおかげで、必要なデータが明確だった。
  
- **関係性の整理で機能の全体像が見えた**

  - データ間の関連を整理することで、今後の実装すべき機能がイメージしやすくなった。

**改善が必要な点**

- **データモデルの複雑さ**

  - 機能を増やしすぎるとデータモデルが複雑になりそうなので、MVPに集中する必要がある。

- **今後のスケーラビリティ**

  - 将来的な機能追加を見据えて、柔軟性のある設計を心掛けたい。

---

🚀 **次回予告：データベース設計とシステムアーキテクチャ構築（後半）**

- 設計したデータモデルを元に、実際のデータベースのテーブル設計を行います。

- 各テーブルのカラムやデータ型を詳細に決定！

- 効率的なデータベース構築に向けて、引き続き頑張ります！🔥

---

✨ **今日のひとこと**

データモデルを設計して、アプリの骨格が見えてきました！  
自分の頭の中で考えていた構想が形になる瞬間は、本当にワクワクしますね。  
群馬の魅力を詰め込んだアプリを一日でも早く皆さんに届けたいという思いが、ますます強くなりました！💪

---

最後までお読みいただきありがとうございます！

皆さんの応援やフィードバックが本当に励みになります。  
コメントやいいね、お待ちしています！😊

明日も引き続き頑張りますので、よろしくお願いします！では、また明日〜！👋
パーフェクトRuby on Rails 7章 メモ・雑感 

# 7 Railsアプリケーションのテスト

## 雑感

この章は`minitest`を使用したRailsのテスト手法について内容でした。`minitest`は実際の業務では触れなさそうなので、`factory_bot`や`OmniAuth`のモック化など`rspec`と共通化できる内容のみにメモはとどめています。

## 7.3 テストデータを作成する

### factory_botの導入

1. gemを追加して`bundle install`

テストファイルだけでなくコンソールでも実行したい場合は`group :development, :test do`内にgemを追加する

```diff_ruby
group :development, :test do
+  gem 'factory_bot_rails' # テストデータ作成用のライブラリ
end
```

1. `test/test_helper.rb`の`fixtures :all`の設定を削除

### factory_botの作成

#### テストデータ用ファイルの作成コマンド

```
% bin/rails g factory:model user
```

#### テストデータファイルの書き方

```test/factories/users.rb
FactoryBot.define do
  # 第一引数 :user が呼び出す時の名称
  # aliases: [:owner]で別名を設定
  factory :user, aliases: [:owner] do
    provider { "github" } # attribute名 { "設定する値" }で値を設定
    sequence(:uid) { |i| "uid_#{i}" } # sequenceメソッドで連番を生成
    sequence(:name) { |i| "name_#{i}" }
    sequence(:image_url) { |i| "http://example.com/image_#{i}.jpg" }
  end
end
```

#### テストデータへ関連を定義

```test/factories/events.rb
FactoryBot.define do
  factory :event do
    owner # 作成時にUserが合わせて作成され、owner_idとして設定される
    sequence(:name) { |i| "イベント名#{i}" }
    sequence(:place) { |i| "イベント開催場所#{i}" }
    sequence(:content) { |i| "イベント本文#{i}" }
    start_at { rand(1..30).days.from_now }
    end_at { start_at + rand(1..30).hours }
  end
end
```

#### テストデータ作成コマンド

railsコンソールを起動して実行

```
> FactoryBot.create(:event)
```

<details><summary>乱数を同じにしてテストを実行したい場合</summary>

問題を再現させるために乱数を一定にしたい場合は、`--seed`オプションを使用する

```
% bin/rail test test/models/event_test.rb --seed 33540
```

</details>

## 7.4 システムテスト

### OmniAuthをモック化したログインヘルパーの作成

```test/sign_in_helper.rb
module SignInHelper
  def sign_in_as(user)
    OmniAuth.config.test_mode = true # テストモードを有効にする
    # OmniAuthをモック化し、GitHub認証を実行すると引数で設定したレスポンスを返却するようになる
    OmniAuth.config.add_mock(
      user.provider,
      uid: user.uid,
      info: { nickname: user.name,
              image: user.image_url })
    case
    # システムテスト用の動作
    when respond_to?(:visit)
      visit root_url
      click_on "GitHubでログイン"
    # コントローラテスト用の動作
    when respond_to?(:get)
      get "/auth/github/callback"
    else
      raise NotImplementedError.new
    end
    @current_user = user
  end

  def current_user
    @current_user
  end
end
```

作成後、`rails_helper`もしくは`spec_helper`に下記設定を追加する

- 下記はrspecの場合の例
- Rails特有の機能（ログイン、データベース操作等）に関連するヘルパーなので下記の場合は`rails_helper`へ追加
- 純粋なRSpec全般の設定やRailsに依存しないヘルパーの場合は`spec_helper`へ追加

```spec/rails_helper.rb
require 'support/sign_in_helper'

RSpec.configure do |config|
  # 各テストタイプでのみ使用する場合
  config.include SignInHelper, type: :system
  config.include SignInHelper, type: :request
  config.include SignInHelper, type: :controller
  
  # または全てのタイプで使用する場合
  config.include SignInHelper
end
```

::: note info
各rspecごとにアプリの中で実際に実行される箇所が異なる

- コントローラスペック
  - コントローラのみ
- リクエストスペック
  - コントローラ
  - ビュー
  - rack middleware
- システムスペック
  - ルーティング
  - コントローラ
  - ビュー
  - rack middleware
  - JavaScriptの実行
:::
JavaでHTTP通信できるか簡易的にテスト

# はじめに
とりあえずさらっと、Javaで通信できるのかテストしてみたかったときに作成しました。成功した場合、GETリクエストの取得内容を出力します。


# ソース
```Test.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class Test {

    public static void main(String[] args) throws IOException {

        String urlString = "https://www.google.com"; // アクセスしたいURLを指定
        URL url = new URL(urlString);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();

        try {
            connection.setRequestMethod("GET"); // GETリクエストを指定

            int responseCode = connection.getResponseCode(); // 通信
            System.out.println("Response Code : " + responseCode);

            if (responseCode == HttpURLConnection.HTTP_OK) { // 正常にレスポンスが返ってきた場合
                try (BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
                    String inputLine;
                    StringBuilder response = new StringBuilder();
                    while ((inputLine = in.readLine()) != null) {
                        response.append(inputLine);
                    }
                    System.out.println(response.toString());
                }
            } else {
                System.out.println("GET request not worked");
            }
        } finally {
            connection.disconnect(); // コネクションをクローズ
        }
    }
}
```

# 実行手順
以下を参考に、Java JDKを事前にインストールしておきましょう。
https://codeforfun.jp/how-to-install-java-jdk-on-windows-and-mac/

①Test.javaを作成する。ソースのクラス名とファイル名は一致させる必要があります。
②コマンドプロンプトを開き、Javaファイルが保存されているディレクトリに移動します。
➂javacコマンドを実行してコンパイルが成功すると、Test.classファイルが生成されます。
④javaコマンドを実行してプログラムを実行します。
```
cd Javaファイルが保存されているディレクトリ
javac Test.java
java Test
```
🚀 MacにAWS CLIをインストール

# 🤔 AWS CLIってなに？

AWS CLI（AWS Command Line Interface）はAWSのサービスをコマンドラインから操作するための便利なツールです。

# 🍺 Homebrewをインストール

ターミナルを開き以下のコマンドを実行します

```bash
brew --version
```

インストールされていない場合はこちらを参照しインストールします。

https://qiita.com/nobumory/items/dad4a7fe0c9cc408f531


# 🔑 AWSアカウントのアクセスキーとシークレットキーを準備

AWS CLIを使うには、アクセスキーとシークレットキーが必要です。

これらはAWSリソースにアクセスするための認証情報です。まだ準備していない方は、以下の手順を行いましょう。

１）AWSコンソールにログイン

２）IAMでユーザーを作成または選択

３）アクセスキーを生成して保存✨

※ 詳細は公式ドキュメント📚をご参照ください。

# 🛠️ インストール

HomebrewでAWS CLIをインストールします。

```bash
brew install awscli
```

以下のコマンドでAWS CLIのバージョンを確認し、インストールされていることを確認します。

```bash
aws --version
```

以下のようにバージョンが出力されたら成功です🎉

```bash
aws-cli/2.23.2 Python/3.12.8 Darwin/24.1.0 source/arm64
```

# ⚙️ 初期設定


##### 🔧 設定コマンドを実行

```
aws configure
```

以下の項目について順番に設定していきます。

| 設定項目              | 内容                                                                 |
|------------------------|----------------------------------------------------------------------|
| AWS Access Key ID      | アクセスキーIDを入力                                                |
| AWS Secret Access Key  | シークレットキーを入力                                              |
| Default region name    | 利用するリージョンを入力（例: ap-northeast-1）                      |
| Default output format  | JSON, table, textのいずれかを選択（通常はJSON）                     |

##### 🔍 設定確認

以下を実行して設定を確認できます。

```bash
cat ~/.aws/config
```

# ✅ 動作検証

AWS CLIが正しく設定されているか確認するため、以下のコマンドを実行します。

```bash
aws s3 ls
```

正常に設定されていれば、S3バケットの一覧が表示されます。
Raspberry Pi 4でDHCP/DNSサーバーを構築

# きっかけ
　以前構築したラズパイのネットワークブートシステムに追加で、ブートサーバーをDHCP/DNSサーバー化しようと思った。ブートサーバーが、配下のネットワークブートするクライアントに対して新たにサブネットを形成し、DHCP/DNSサーバーとして機能すれば計算クラスタとしてさらに運用しやすくなるのではないかと考えた。

# 構成
ルーター側とクライアント側をそれぞれ有線で接続し、ルータ側のデバイス名をeth0, クライアント側をeth1とする。

![DHCP_DNS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513034/e22346a3-2805-cd1e-ec9d-c35521b9e705.png)

また、eth1側はUSB-Ethernet変換アダプタを使用した。

https://www.amazon.co.jp/dp/B0CQX6ZN8S?ref=ppx_yo2ov_dt_b_fed_asin_title&th=1

nmcliコマンドでEthernetのデバイス名を確認できる
```
$ nmcli
```

# 構築手順

- eth1側のip固定化
  - コマンドで設定する場合
  ```
  $ sudo ip addr add 192.168.1.1/24 dev eth1
  $ sudo ip link  set eth1 up
  ```
  - 設定ファイルに記述する場合(投稿者の環境)
  ```/etc/NetworkManager/system-connections/Wired connection 2.nmconnection
    [connection]
    id=Wired connection 2
    uuid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    type=ethernet
    autoconnect-priority=-999
    interface-name=eth1

    [ethernet]

    [ipv4] #ipv4の項目に固定したいアドレスを入力
    method=manual
    addresses=192.168.1.1/24
    gateway=192.168.1.1
    dns=8.8.8.8;
    
    
    [ipv6]
    addr-gen-mode=stable-privacy
    method=disabled
    
    [proxy]
    
  ```
  その後、以下コマンドを入力することでeth1側のip固定化が反映される
  ```
  $ sudo systemctl restart NetworkManager
  または
  $ sudo reboot
  ```
<br>

- ポートフォワーディングの設定
```
$ sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
$ sudo iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
```
設定を保存する
```
$ sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
```
```sudo vi /etc/rc.local
iptables-restore < /etc/iptables.ipv4.nat #追記
```

<br>

- dnsmasqの設定と有効化
  - (インストールしていない場合は)dnsmasqをインストールする
  ```
  sudo apt install dnsmasq
  ```
    <br>
    
  - dnsmasq.confに設定を追記する
  ```sudo vi /etc/dnsmasq.conf
  enable-tftp
  tftp-root=/tftpboot
  pxe-service=0,"Raspberry Pi Boot"

  expand-hosts
  domain-needed
  bogus-priv
  no-resolv
  server=8.8.8.8 #primary
  server=x.x.x.x #second
  local=/magisystem.local/
  domain=magisystem.local
  listen-address=x.x.x.x
    
  interface=eth1          # eth1側をdhcpリースに指定
  no-dhcp-interface=eth0　# eth0側はdhcpリースに指定しない
  dhcp-range=192.168.1.2,192.168.1.100,255.255.255.0,12h #リース範囲を指定
  dhcp-option=option:dns-server,192.168.1.1
  dhcp-option=option:router,192.168.1.1
  dhcp-host=xx:xx:xx:xx:xx:xx,192.168.1.2,client1,24h #macアドレス,IPアドレス,ドメインネーム,リース時間
  dhcp-host=xx:xx:xx:xx:xx:xx,192.168.1.3,client2,24h
  dhcp-host=xx:xx:xx:xx:xx:xx,192.168.1.4,client3,24h
  ```
  - dnsmasqを起動、有効化する
  ```
  sudo systemctl start dnsmasq.service 
  sudo systemctl enable dnsmasq.service
  ```



# 参考にしたサイト
https://geek.tacoskingdom.com/blog/66#part-h2-2

https://zenn.dev/hiroe_orz17/scraps/b576c6c651761b
フローのデバック

[Flowに関するまとめページに戻る](https://qiita.com/Keiji_otsubo/items/55ebc9c634a3216f3990)

--------------

+ [「フローをデバッグ」の画面で表示されない項目があり困っています。](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KgrcM)

:::note
フィールドがページ レイアウト上にない場合、フィールドはデバッグ ウィンドウに表示されません。問題が発生した時点では、動的ページ レイアウト/フィールドを使用していました。オブジェクトの両方のページ レイアウトにフィールドを追加すると、フィールドがデバッグに表示されるようになりました。 


https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Sr964SAB
:::

+ [レコードが更新された場合のようにフローをデバッグするときに使用できないフィールド](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000PZp8D)


# 未分類

+ [注文商品レコードが作成されたことをトリガーに起動するレコードトリガーフローのデバックでレコードを選択できない](https://qiita.com/Keiji_otsubo/items/ba38b24cd99bcbd67b66)
+ [The "SendWspARG" element in your flow has validation errors](https://qiita.com/Keiji_otsubo/items/1456eacef88cc63a4e34)

+ [製品版に「管理者が他のユーザーとしてフローをデバッグできるようにする」チェックボックスがありません](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UqEOl)

:::note
Did  you resolve this? I'm having the same issue. It's there in the sandbox and working but in Production it's not an option. Thanks

I don't know if your flow is an screen flow or any other kind. However, I was facing the same issue and I found out that in prod environment it's not possible according to this article (specifically when it mentions "Debugging a flow as another user is available only for screen flows and autolaunched flows in nonproduction orgs."):

[Link](https://help.salesforce.com/s/articleView?id=release-notes.rn_forcecom_flow_fbuilder_debug_other_user.htm&type=5&release=228)

So I had to "debug" my screen flow in prod environment (to reproduce the same issue that I was facing in sandbox environments) using a non-admin test user and changing the layout and adding the necessary elements to invoke it.

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A98wASAR
:::
【電脳少女プログラミング2088 ─壊レタ君を再構築─】「一番通りの繁華街」を解いてみた（Ruby）

キャンペーン実施中ということで、問題を解いてみました。
問題：一番通りの繁華街 - スキルチェックB相当

https://ppg.paiza.jp/denno2088/areas/7 

paizaは問題名が面白くて好きです。
早速解いていきます。

# 問題概要
N×Nの広さの地域があり、ギャングのアジトは'.', 何もない場合は'#'で表される。
アジト同士を線で繋いだ時、正方形になればそこはギャングの縄張りとなる。
Nおよび地域マップが入力されるので、縄張りの数を出力する。

# 参考例
以下の入力の場合、3つの正方形ができるので3が回答となります。
※小さい縄張りを内包していても一つの縄張りとして換算されます。
```
5
.#.#.
#####
.#.#.
##.##
.###.
```
①
<font color="Red">.</font> # <font color="Red">.</font> # .
\#####
<font color="Red">.</font> # <font color="Red">.</font> # .
\## . ##
. ### .

②
. # <font color="Red">.</font> # <font color="Red">.</font>
\#####
. # <font color="Red">.</font> # <font color="Red">.</font>
\## . ##
. ### .

③
<font color="Red">.</font> # . # <font color="Red">.</font>
\#####
. # . # .
\## . ##
<font color="Red">.</font> ### <font color="Red">.</font>

# 方針
1. 一辺の長さ2 ~ Nの各正方形について、条件を満たすか確認すれば良さそう
1. 5 ≦ N ≦ 50 という制約なので、全探索しても十分間に合いそう

# 回答
```ruby
N = gets.to_i
hideouts = []
N.times do
  hideouts << gets.chomp.split('')
end

# 正方形四つの点を返す。範囲外の場合はfalseを返す。
def square_points(grid, h, w, length, n)
  ul = [h, w]
  ur = [h, w + length - 1]
  dl = [h + length - 1 , w]
  dr = [h + length - 1, w + length - 1]

  # 範囲判定
  if (w + length - 1) > (n - 1) || (h + length - 1) > (n - 1)
    return false
  else
    return [ul, ur, dl, dr]
  end
end

square_count = 0 # 回答を保持
for i in 2..N do # 辺の長さそれぞれでループ
  for j in 0...N do # 縦それぞれ
    for k in 0...N do # 横それぞれ
      points = square_points(hideouts, j, k, i, N)
      next if points == false
      ok = true
      # 4点について、一つでもアジト以外であればflagをfalseに変更
      points.each do |p|
        ok = false if hideouts[p[0]][p[1]] == '#'
      end
      square_count += 1 if ok == true
    end
  end
end

puts square_count
```

## 回答ざっくり解説
1. とりうる辺の長さ（2 ~ N）全てについてforループを回す（i）
1. 縦列それぞれ（j）・横列それぞれ（k）でループを回し、一点ずつ確認していく
1. square_pointsという、与えられた点・辺の長さから正方形を構成する4点を返すメソッドを定義し、各辺の長さ・点について実行 ※範囲外であればfalseを返す
1. 受け取った4点全てアジト（.）であれば縄張り = 何もない場所(#)がある場合は領域ではないのでフラグをfalseに変更
1. もしflagがtrueのままであれば縄張りの数（square_count）をインクリメントする

みたいな感じです。
範囲外の場合における不要な判定（辺の長さ = Nの場合でも、全ての点について確認しているなど）はありますが、N が50以下なので特に問題になりませんでした。綺麗ではないですが笑
こういうgridの問題はループに入る前、square_pointsのような関数を作成してしまうと分かりやすいかなと感じています。


効率面は微妙かもしれませんが、条件的に上記で問題ありませんでした。
フィードバックでは、
> ガガ……ピー……効率……並行処理……ガ……
ともらったので、並行処理についても改善してみたいと思っています。また、再度見直して単純なリファクタリングもするかもです。（やったら追記したいですね。）

お読みいただきありがとうございました！
別問題にもトライしていきますmm
初学者が技術書を読んではいけない理由3選

ITの世界に踏み込むと、まず「技術書を読んだ方がいい」というアドバイスを受けることがあります。しかし、私は初学者の段階では読まない方がいいと考えています。

今回は「なぜ初学者は技術書を読んではいけないのか」を3つの理由から解説します。

また技術書を読むべきタイミングがあるのか、効率的に読むにはどうすればいいのかについて紹介します。

## なぜ技術書を読んではいけないのか？

### その1: 前提知識がない
技術書というものは、ある程度の前提知識を持っている読者を想定して書かれています。例え「入門」とタイトルに書かれていても、それは「ある程度の学習履歴と実務経験を持つ人」にとって入門なのです。

何の知的な基礎もない初学者が技術書を手に取ると、いきなり専門用語や難解な概念に面食らって、内容を理解する前に挫折するのがオチです。

### その2: インプットの費用対効果が低い
初学者は実務経験を積んでいないので、現場での具体的なイメージをもたずに技術書を読むことになります。

技術書には特定領域の膨大な情報が詰まっていますが、実務経験の有無でこれらの定着率が大きく変わります。

実務経験のない初学者は読み進めても頭でわかった気になっただけで、実際にはそこまで知識が定着していません。インプットに時間をかけた割には仕事の成果につながりにくく、学習効率が悪いというのが実情ではないでしょうか。

### その3: 「何かを成し遂げた」と勘違いする
技術書を一冊読み終えると勉強した気分になりやすいです。しかし、前述の通り、実際にはほとんど何も身についていません。

「技術書を読みきった」という行為に満足してしまい、得られた知識をアウトプットもしないので、1週間もすれば読んだ内容なんてキレイさっぱり忘れています。

本人は読み終えたことで悦に浸っており、もう一度読み直すこともしないので、失った知識を再び取り戻す瞬間は永遠にやってきません。

## 読んだ方がいい人とは？

### 実務経験が2年以上ある人
技術書は、ある程度の知識を持った人がさらに深掘りする際に効果的です。

実務経験が2年ほどあるエンジニアなら、基礎的な用語や実務の流れが身につき始めているので、「自分の現場でどう使えるか」をイメージしながら読み進められます。

実際にどう使いこなすか？を想像しやすいほど、技術書で得られるインプットが即戦力として活かしやすいのです。

## どう言うふうに読めばいい？

### 最初は通しで読む
実務経験があり、技術書が読めるレベルに達したら、まずは通読して全体像をつかみましょう。読んでいて「？」となっても無視して構わないので、「どのような構造で何が書かれているのか」をざっくり把握します。

### 2回目は気になる箇所だけ読む
2回目は、自分が特に必要としている章や、気になる箇所を中心に再読します。この時、1回目に読んでいて「？」となった箇所を精読するのもオススメです。

実装でつまずいたときや、興味のある機能の解説を重点的に確認し、実務やスキルアップに役立てるための土壌を整えましょう。

### 3回目以降は辞書として使う
3回目以降は辞書のように使うのが効果的です。開発中などに疑問が出てきたら、その部分だけを再度読み返し、答えを探る形で活用します。そうすることで技術書の情報を実務へダイレクトに結びつけることができます。

技術書は読み方やタイミングを間違えると効率が悪くなったり、学習を挫折する原因になることがあります。初学者は無理に技術書を読み始めるのではなく、実務経験をしっかり積むことをオススメします。

実務を通して前提知識や業務フローが身についた段階で、技術書を通して足りない知識の補強をしましょう。正しいタイミングで使えば、技術書はスキルアップの大きな味方になってくれます。

ここまで読んでいただきありがとうございます。

Xではエンジニアに有益な発信をしていますので、ぜひフォローよろしくお願いします！！

https://x.com/satan_engineer?s=21
MDXEditorで#がh1にならない

# はじめに

エディタの実装でMDXEditorを利用していたところ遭遇した問題を載せます

# 問題

MDXEditorを実装してエディタに

```
# Hello
```

と書いたのですが、#は消えるのですがなぜかHelloがh1文字になりません

# 解決方法

TailwindCSSが最新版が4系になったことでクラスが変わったようでスタイルが当たらなくなっていました。

3系をインストールし直したら無事スタイルが当たりました

```
$ npm install -D tailwindcss@3.4.13 autoprefixer postcss
$ npx tailwindcss init -p
```

# おわりに

別の問題でコードブロックが使えないというのもあったので切り分けがむずかしかったｄ
npx tailwindcss initでnpm error could not determine executable to runエラーが出る

# はじめに

TailwindCSSをReactに導入する際にエラーが出たので記事にします

# 問題

今までどおりインストールコマンドを叩いたらエラーが出てしまいました

```
$ npm install -D tailwindcss autoprefixer postcss
$ npx tailwindcss init -p
npm error could not determine executable to run
npm error A complete log of this run can be found in: /home/jinwatanabe/.npm/_logs/2025-01-26T01_25_28_159Z-debug-0.log
```

# 解決方法

TailwindCSSのバージョンが4系になってインストール方法が大幅に変わりました

https://tailwindcss.com/docs/installation/using-vite

いままでよりも簡単になっています

もし今まで通りにセットアップするなら

```
$ npm install -D tailwindcss@3.4.13 autoprefixer postcss
$ npx tailwindcss init -p
```

3系を指定すれば大丈夫です！

# おわりに

これまでのハンズオンが動かなくなってしまうのだけが辛いところです。
Kotlin 頭をゼロ埋めにする

頭をゼロ埋めにする方法です。
`padStart`というものがあります。


```.kt
val padWithZero = "125".padStart(5, '0')
println("'$padWithZero'") // '00125'

```
`padStart`の引数
- `length`
希望する文字列の長さ
- `padChar`文字列の長さが指定された長さより短い場合に、文字列を埋め込む文字。デフォルトで はスペースが使用されます

こちらで頭をゼロ埋めにすることができます。この方法を使えば０以外も頭埋めすることが可能です。

# リファレンス

https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.text/pad-start.html
OCI Cloud Free Tier をもぎ取れ その18

# 概要
OCI Cloud Free Tierを取得してみた。
Livebookを起動して、外部から使ってみた。

# 手順

```
$ . "$HOME/.asdf/asdf.sh"

$ /home/ubuntu/.asdf/installs/elixir/1.18.2-otp-27/.mix/escripts/livebook server  --ip 0.0.0.0
[Livebook] Application running at http://localhost:8080/?token=keqhuplq5atdaquyqnzhqyyo54nb*

```
ブラウザで開く。
http://****:8080


![スクリーンショット 2025-01-26 093337.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/32fa926a-ab8d-bb59-45e2-dbf695c95caa.png)

Livebook v0.14.6

![スクリーンショット 2025-01-26 093230.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a4f5b2e5-16aa-5695-d8a2-ea523f165c50.png)


以上。
🚀 Homebrewのインストール

# Homebrewってなに？

Homebrew（ホームブリュー）は、Mac専用のパッケージマネージャーです🍺

簡単に言うとアプリやツールをめっちゃ簡単にインストールできる便利ツール🎉

https://brew.sh/ja/

# 🛠️ インストール手順

###### 👩🏻‍💻 コマンドの実行

上記のページに公開されている以下のインストールコマンドをコピーしてターミナルに貼り付けます

```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

###### 🔍 コマンドの解説

`/bin/bash -c`

Bashを指定してシェルを実行。 `-c` は、「指定した文字列をコマンドとして実行する」というオプション。

`curl -fsSL`

curl は、指定されたURLからデータをダウンロードするコマンド。
オプションの意味はこちら。
	•	-f（fail）：HTTPエラー（例: 404 Not Found）のときにエラーを出します。
	•	-s（silent）：進捗バーやエラーメッセージを表示しません。
	•	-S（show error）：エラーが発生した場合、その内容を表示します。
	•	-L（location）：リダイレクトがあった場合に追従します。
    
`https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh`

HomebrewのインストールスクリプトのURL。

`$() `

ダウンロードしたスクリプトを実行する

##### 🔑 パスワードを入力

以下のメッセージが出力されたら、パスワードを入力してEnterを押してください

```
==> Checking for `sudo` access (which may request your password)...
Password:
```

##### ⏎ エンターを押す

以下のメッセージが出てきたエンターを押す

`Press RETURN/ENTER to continue or any other key to abort:`

##### 🎉 インストールの完了

以下のようなログが出力されたら成功です

```
==> Installation successful!

.....

==> Next steps:
- Run these commands in your terminal to add Homebrew to your PATH:
    echo >> /Users/username/.zprofile
    echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/username/.zprofile
    eval "$(/opt/homebrew/bin/brew shellenv)"
- Run brew help to get started
- Further documentation:
    https://docs.brew.sh
```

# 🛠️ PATHの設定

ログの最後で案内されていたPATHの設定を行います。

##### 📝 空行を追加

```
echo >> /Users/username/.zprofile
```

`~/.zprofile` がなければ作成してファイルの存在を保証し、末尾に空行を追加することでHomebrewの設定内容をその他の設定と切り離し、整理された状態を保つことが目的です。

##### 🔧 環境変数の設定をファイルに追加

```
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/username/.zprofile
```

`eval "$(/opt/homebrew/bin/brew shellenv)"` という設定を `~/.zprofile` ファイルに追記します。

Homebrewを使用する際に必要なパス（PATH）や環境変数が毎回自動的に適用されるようになります。

##### 🚀 設定を即時反映

```
eval "$(/opt/homebrew/bin/brew shellenv)"
```

先ほど設定した内容が現在のターミナルセッションに即時反映されます、すぐに使用できる状態になります。

# ✅ インストールの確認
インストールが完了したら、以下のコマンドで正しくインストールされたか確認できます🎉

```bash
brew --version
```

`Homebrew 4.4.17` のようにバージョン番号が表示されれば、インストール成功です✨
OCI Cloud Free Tier をもぎ取れ その17

# 概要
OCI Cloud Free Tierを取得してみた。
iptablesでポート開放してみた。

# 手順

```
$ sudo iptables -I INPUT 5 -p tcp --dport 8080 -j ACCEPT

```

# 設定の永続化

```


$ sudo netfilter-persistent save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables save
```

以上。
Error: P1001: Can't reach database server at

## はじめに
Prisma と Supabase を組み合わせた Next.js プロジェクトを Docker 環境で構築している中で、データベース接続に失敗する問題に直面しました。
本記事では、その問題の詳細と解消方法についてまとめます。同じ課題に直面している方の参考になれば幸いです。

## 環境
- フレームワーク: Next.js 13
- ORM: Prisma
- データベース: Supabase PostgreSQL
- コンテナ: Docker
- エラー発生時の Prisma コマンド:
```terminal
npx prisma migrate dev --name init
```
```.env
DATABASE_URL="postgresql://postgres:[YOUR-PASSWORD]@db.xxx.supabase.co:5432/postgrest"
```
## 問題
以下のエラーが発生し、Prisma が Supabase のデータベースに接続できませんでした。
```terminal
Error: P1001: Can't reach database server at `db.xxx.supabase.co:5432`
Please make sure your database server is running at `db.xxx.supabase.co:5432`.
```

また、ping コマンドを使った接続確認では以下のように IPv6 アドレスのみが解決され、接続に失敗する状況でした。

```terminal
root@react:/usr/src/app/src# nslookup db.xxx.supabase.co
Server:         127.0.0.11
Address:        127.0.0.11#53

Non-authoritative answer:
Name:   db.xxx.supabase.co
Address: 2406:da14:271:9903:fec7:75fa:9c8:82ef
```

## やったこと
以下の記事を参考にして、さまざまな方法で問題解決を試みました。

- Supabaseのプロジェクトを再起動 ([ref](https://qiita.com/ko-hi-san/items/3b7b9db83e9b57424024))
- PostgresDBコンテナの削除 ([ref](https://zenn.dev/gigi434/scraps/294ce1f6f7e0e1))
- DBのパスワードで文字列のみを使用([ref](https://dev.to/digitaldrreamer/prisma-supabase-error-p1001-4aj8))



## 解消方法
最終的に、Supabase の接続設定を以下のように変更することで問題が解決しました。

Supabase の「Session Pooler」を使用し、IPv4 接続を強制するようにしました。
```bash
DATABASE_URL="postgresql://postgres.xxx:[YOUR-PASSWORD]@aws-0-ap-northeast-1.pooler.supabase.com:5432/postgres"
```

この設定を .env ファイルに記載し、以下の Prisma コマンドを実行して接続テストを行ったところ、正常に動作しました。
```bash
npx prisma migrate dev --name init
```
結果として、データベースへのマイグレーションが成功しました。


## 今回の原因
この問題は、Docker環境ではデフォルトでIPv4を使用しているが、
Supabaseの接続先アドレスをIPv6のもので設定していたことが原因でした。
参考記事
- [Use IPv6 networking](https://docs.docker.com/engine/daemon/ipv6/?utm_source=chatgpt.com)
- [今一番楽なDockerのIPv6対応方法](https://qiita.com/yas-nyan/items/5f78fbb6cb18eaf68a64)

なので、Dockerで`.env`の内容は変えずに、
IPv6通信を有効化する方法でも解消できるかもしれません。

---

本記事が同様の問題に直面している方々の助けになれば幸いです。コメントやフィードバックがあれば、ぜひお寄せください！
【思考法・考え方】仮説思考 BCG流 問題発見・解決の発想法

【思考法・考え方】仮説思考 BCG流 問題発見・解決の発想法
<iframe width="560" height="315" src="https://www.youtube.com/embed/CaCCl1Emjyo?si=WHZ0rT7mP0OGUhYR" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
TokyoRubyKaigiに行ってきた話

# はじめに

東京Ruby会議12というイベントに参加してきました。
このような大規模なイベントに参加するのは初ということで、どうなるか不安でしたが楽しむことができました。

# 印象に残った発表

### Scaling Ruby @ GitHub

GitHub社の John Hawthorn さんによる、GitHubのプロダクト運用についての発表でした。

- コードごとに専門の担当者を決め、バグが発生した時はスタックトレースからエラー発生箇所を特定し、担当者に割り振るという手法が説明されていた。自分の会社はリポジトリ単位でしか割り振っていないため、規模が大きくなるとモデル単位での役割分担も必要なんだろうなとか思ったりした
- GitHubってrailsだったんだ！という今更な驚き
- gemの紹介もされていましたが、自社で作っているとのこと！これはリソースや技術力のある強みだなと感じました

### Ruby製テキストエディタでの生活

会場ではテキストエディタの実演もされていました。開発者として参考になるマインドでした。

https://github.com/shugo/tokyorubykaigi12

- 日常で使うものが自分のものだと、ちょっと日々が楽しくなる
- そんなにすごいものを作る必要はない。オリジナリティもいらない。すでに市場にあるものを一部変えたり、不要な機能をオミットするだけでも十分
- やっぱり市場で広く使われているものは偉大

### Writing PDFs in Ruby DSL

PDFの構造からrubyの書き方まで、順を追って丁寧に解説されていました。
難しそうな内容でしたが、スッと頭に入ってきました。

https://speakerdeck.com/coorde/writing-pdfs-in-ruby-dsl

- PDFがさまざまな文字コードでできているという、仕組みを知れた
- rubyで動的にPDFの内容を変更されてて、お見事でした！

### 混沌とした例外処理とエラー監視に秩序をもたらす

自社でも運用を開始しているSentryを使ったエラー監視についての解説がありました。
チーム内での意識共有ができてないと、根本的な課題解決は難しい。

https://speakerdeck.com/morihirok/hun-dun-tositali-wai-chu-li-toerajian-shi-nizhi-xu-womotarasu

- エラーハンドリングについて改めて考えさせられました。拾うクラスと拾わないクラスを分けることはやっぱり大事
- 自社でもたまにあるエラーが発生しても処理を続けて欲しいという要望、本当にダメな時はいっそ早めにクラッシュさせた方がいいというお話をうんうんと言いながら聞いてた
- rubocopで例外を丸ごとキャッチする書き方をNGにする過激なルールが印象に残った。でもこれくらいしないと変わらないとも思いました
- 機械的にできそうなところをうまくライブラリやプログラムなどで制御すると言う発想は大事にしたい

### Regional.rb and the Tokyo Metropolis

- 都内周辺にこれだけコミュニティがあったのかと思いました
- 立ち上げの時の話とかが印象的でした。結果よりもやりたいからやっていると言う姿勢なんだなと思いました
- どこか入ってみたいなと改めて思いました

# Todo?

- エラーハンドリングをきちんとやる（キャッチするクラスとキャッチしないクラスを分ける）
- rubocopのカスタムルールの作り方を勉強する
- 普段使ってるツールや手動でやってることを自動化することにチャレンジしてみる

# 感想

なんだかんだでオフラインで参加したのはよかった。集中して話を聞けた。
難しい内容も多かったけど、ためになる話もあり、刺激になりました。
来年もまた参加してみたいです！
[Blender]UIのテーマを変更するコツ

# 概要
BlenderのUIテーマを自由に編集したくなった時のTipsをまとめます

![スクリーンショット 2025-01-26 093021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/c8f3e12f-bebb-7937-7ac0-8daaf403632a.png)

# 本文
## テーマ変更の基礎知識
Editor→Preferences→Themesタブから変更できます。
中央上部にあるテーマ一覧からプリセットのテーマや登録したオリジナルテーマを切り替えられます。
いろいろ個別にいじってもResetボタンを押せばデフォルト設定にいつでも戻せるので自由にいじっても大丈夫！
自分で変更した設定は＋ボタンで保存できます（同名で再度保存したら上書き保存）

![スクリーンショット 2025-01-26 093434.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/0e5c690c-35b7-2e5e-4f36-f436f31598b1.png)



## 項目が多すぎるけど、どこを変更すればいいの？
最初はここらへんをいじればいい感じになります

```
UserInterface
        Toolbar Item
            Text
            Inner
            Outline
            Roundness
            ✅Shaded

        Styles
            Editor Outline
            Panel Roundness
Properties
        ThemeSpace
            Window Background
            Header
            Navigation Bar Background
        Panel Colors
            Header
            Background
            Sub Background
```

味を占めたら他の箇所もどんどん試してみてください！:raised_hands_tone2:
【MySQL】 SQLSTATE[HY000]: General error: 1813 Tablespace for table 'xxx`.`hogetable`' exists.

# 背景
- XAMPPで立ち上げたMySQL環境で、一度データベースをリセットした後、マイグレーションファイルでテーブルを作成しようとするとタイトルのエラーが発生する。
- phpMyAdmin上で確認しても、`hogetable`は存在していない。

# 原因
- テーブルスペースファイルの残骸が残っている。
    - XAMPP環境の場合、`C:\xammp\mysql\data\xxx`に`hogetable.ibd`があった。
        - 削除後に再度試すと正常に実行できた。

## 余談
https://e-words.jp/w/%E8%A1%A8%E9%A0%98%E5%9F%9F.html

> 表領域（table space）とは、データベース管理システム(DBMS)がデータを保管するために記憶装置(ストレージ)上に確保した領域のこと。
- テーブルスペースという概念を意識していなかったので、「テーブルは存在しないのになぜエラーになるんだ…」と解決に時間がかかってしまった。
ソートされている結果が欲しいだけの理由で std::set を使うなという話

# はじめに

趣味で AtCoder のコンテストに参加するようになって、中途半端な勉強した結果、逆に実装が雑になってしまっている部分もあります。

特に最近、「 **昇順ソートされている数列** が作りたいなぁ。とりあえず std::set に突っ込んでおこう」程度の発想でコンテナを選んだら、TLEが出てしまって原因の切り分けに苦しむことが複数回ありました。

コンテナ内部のデータ構造を考えれば差はあるだろうけど、言ぅてそんな極端な差はないのでは？ という気持ちでいたので、ここらで **std::set は重い** という話を体感してみようと、テストプログラムを書いて処理時間を計測してみた記録です。

### 環境

我が家の PC の WSL2
バックグラウンドでもいろいろ動いているので、それほど厳密には測定してません。

## 測定結果①： 構築

ランダムで生成した 64bit整数 $2 \times 10^5$ 個をテキストファイルから読み込んで、昇順ソートされている状態にするまでの処理時間(単位:マイクロ秒)
vector は push_back() でメモリを拡張しています。

|case| priority_queue | vector + sort | set |
|:--:|-----:|-----:|------:|
|1   | 118540 | 143572 | 215521 |
|2   | 121401 | 145315 | 218956 |
|3   | 123471 | 150026 | 215841 |
|4   | 119003 | 151527 | 211504 |
|5   | 118323 | 146019 | 208502 |

## 測定結果②： 複製(コピーコンストラクタ)

|case| priority_queue | vector | set |
|:--:|-----:|-----:|------:|
|1   | 446 | 403 | 34641 |
|2   | 662 | 413 | 33037 |
|3   | 625 | 498 | 33978 |
|4   | 456 | 452 | 32136 |
|5   | 456 | 393 | 33350 |

# 結論

**重いわ。**
せっかくだから std::set が得意なはずのノード削除とか、二分探索の処理時間も測ろうと思ってましたが、打ち切りました。
今後はソートされていてほしい程度の意図で std::set は使わないことにします:relieved:
【PM初心者用】ベテランもたまに忘れる会議主催者の意識すること①

# 会議主催者が意識すること
あなたがPMや会議で発表する立場の時に、出席者のことは意識していますか。
あなたはもちろん、これから話す内容を着地点や結論まで理解して話し始めますが、出席者は以下のことをわかっていないケースが多々あります。

- 何が話されるのか
- 最終的に何を話したいのか

![100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956954/3ca0ccce-4043-e577-7369-a29ec2bea687.png)


会議主催者の理解している内容と会議出席者の理解している内容。
この2つの認識の違いが会議の最終的な理解度に大きな違いをもたらします。


## 人は自分が理解していることを他人も簡単に理解できると勘違いする
この見出しで書いている内容がすべてです。
私は上記の観念から完全に脱却することはできないと考えています。
そのため、上記の勘違いを常に自分がしていると会議開催前に戒めることが必要という考えです。

## 会議主催者の意識度に差があることを理解する
あなたは会議主催者の時に当事者意識を当然のように持っているでしょう。
しかし、参加者の時はどうですか？　気を抜いていませんか？　雑に聞いていませんか？
その参加者の時の意識をあなたの主催する会議に参加する人たちも持っています。

![101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956954/8ec18db6-08c6-ea3b-32ec-99d166a4e9a2.png)


# 上記を踏まえて会議主催者が行うこと
やることは簡単ですが、できていない人は意外と多いです。
それは以下の2点です。
- 会議内容を出席者に対して「じぶんごと化」することで真剣に聞いてもらう
- 会議冒頭で、「じぶんごと化」するための意識を持ってもらうための発言をする

これは学生の時に先生が授業中に使う言葉がわかりやすいです。
すなわち
``` 
これから話す内容はテストに出る。
```
です。
これを言われたら、みんな真剣にその後の授業を聞くのではないでしょうか。
それを会議の冒頭に言えばよいだけです。
それだけ？　と思うかもしれませんが私が知る限りできていない人は意外と多いです。

会議冒頭に以下の言葉を言うか、会議の最後に言うかで、皆さんの意識は変わる気がしませんか？
``` 
本会議は、Aチームにこれから話すことに関する調査を依頼し、
Bチームにはスケジュールを作成してもらうための認識合わせの場として調整しました。
各チームにはご負担をかけますが、この会議で話すこと（話したこと）について
各チーム内での業務的・スケジュール的な可否を考え、
懸念点があれば今のうちに意見をいただきたいと思います。
```


## 使用例
![102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956954/892efbf9-4583-3cbf-4d27-e7e7ca2657c7.png)

# まとめ
皆さんは社内の会議で人に参加を呼び掛けて、各担当者への依頼を最後の方に話したことはないですか？
私はよくやられます。そのたびに、
「最初に依頼事項を話してくれれば、そのつもりで説明を聞けたのに」
と思ってしまいます。
もちろん会議の形態や出席者によって進め方は変わってきますが、私はできる限り各担当者（各担当チーム）には会議冒頭にやってほしいことを伝えてから、会議を進めることにしています。
![103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956954/e420f95b-4de9-186e-eed4-4e90c5917fc0.png)


このやり方は私の考えによるものなので、人によって会議の理解度を深める方法は違うと思います。
『こんな考え方の出席者が皆さんの会議に参加しているかもしれない。』
そのぐらいの気持ちで読んでいただき、皆さんの会議進行を考える際の一助になれば幸いです。
個人的な備忘録：APIについて3時間語れなかったので、記事としてアウトプットして振り返ってみた

## はじめに

API（Application Programming Interface）とは、「**アプリケーション同士がやり取りするための共通ルール**」のことです。

:::note warn
***たとえば、人間がコミュニケーションを取るときに言葉やルールが必要なように、アプリケーションもAPIを通じて情報をやり取りします。***
:::

なお、本記事の内容は個人的な備忘録としてまとめたものです。***その点をご了承いただければ幸いです。少しでも参考になれば嬉しいです。***

## 書こうと思ったきっかけ
私自身、APIについてそれなりに勉強してきたという自負があります。***しかし、その知識を言語化し、わかりやすく他人に伝えることの難しさを改めて実感しました。***

:::note info
**頭の中では理解しているつもりでも、それを言葉として整理して伝える練習が必要だと感じました。そのため、自分の考えをまとめる場としてこの記事を書くことにしました。**
:::

APIは非常に広範囲にわたる分野ですが、本記事ではその中から基本的な内容に絞ってまとめています。***少しでも皆さまのお役に立てれば幸いです。***

## そもそも、APIとは？
APIは、アプリケーション同士が「**どうやって情報をやり取りするか**」を決めたルールや仕組みのことです。

![Screenshot 2025-01-26 at 9.06.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/fac54e47-1dee-d807-11d3-ba0d9e0e176a.png)
引用画像：https://www.ebis.ne.jp/column/api/

人間同士がコミュニケーションを取るために言語やルールが必要なように、アプリケーション同士もAPIという「**共通言語**」を使ってデータをやり取りします。

## APIの具体例
**天気予報アプリ**

- 天気予報のデータを提供するサーバ（例: 気象庁API）に「**現在の東京の天気を教えて！**」とリクエストを送り、そのデータを取得して表示します。

**Google Maps**

- 外部アプリ（例: レストラン検索アプリ）がGoogle MapsのAPIを利用して地図を表示したり、場所の情報を取得したりします。


## APIの種類

  - **Web API**
    - インターネットを介してアプリケーション同士がやり取りするAPI。
    - **例**: REST API、GraphQL、SOAP
  - **OS API**
    - OSが提供する機能を利用するためのAPI。
    - **例**: ファイル操作やデバイスアクセス（Windows API、POSIXなど）
  - **ライブラリ/フレームワークのAPI**
    - 開発用のツールやライブラリに含まれる関数やクラスなどを指します。
    - **例**: NumPyやPandas（Pythonのライブラリ）

## 過去にやってきた技術検証のご紹介
これまで、APIに関するさまざまな技術検証を行ってきました。***ここでは、その一部を抜粋してご紹介します。興味のある方は、ぜひ参考にしてみてください。***

### YouTube APIから動画データをDynamoDBに保存する方法

AWS Lambdaを使用して、YouTube APIから動画データを取得し、そのデータをDynamoDBに保存する仕組みを構築しました。

さらに、AWSのEventBridgeを利用して、動画データを定期的に自動取得する設定も行っています。

**詳しい内容はこちらの記事をご覧ください：**

https://qiita.com/free-honda/items/5af2cea6c674fba14597

https://qiita.com/free-honda/items/d67f8b00b734eb719cc8

### API Gatewayを使ってLambda関数からS3の静的ページにリダイレクトする方法
Lambda関数を利用して、S3バケットにホストされた静的ウェブページにリダイレクトする方法を解説しています。

シンプルで効果的なリダイレクト構成を実現したい方におすすめです。

**詳しい内容はこちらの記事をご覧ください：**

https://qiita.com/free-honda/items/d5c8502cc019b94aa061

### PythonとLINE Notifyで環境構築からトークン取得まで、LINE通知機能を簡単に実装する方法

Pythonを使ってLINE Notifyを活用し、LINEへの通知機能を簡単に実装しました。***環境構築からトークンの取得方法まで、初心者にもわかりやすく解説しています。***

**詳しい内容はこちらの記事をご覧ください：**

https://qiita.com/free-honda/items/8c5c3ec4cdb6ad6a5107

### Docker × ECR × Lambda × API Gatewayを組み合わせたサーバーレスアーキテクチャを構築する方法

ECRにプッシュしたDockerイメージを元にLambda関数を実行し、API Gatewayを介してHTTPリクエストに応じてLambda関数を呼び出す構成を構築しました。***サーバーレスアーキテクチャを活用したシンプルでスケーラブルな実装例です。***

**詳しい内容はこちらの記事をご覧ください：**

https://qiita.com/free-honda/items/8014807dafcab622c961

## まとめ
ここまで読んでいただき、ありがとうございました。

:::note info
**この記事を書くことで、私自身も基礎的な内容を改めて体系的にまとめ直し、より深い理解を得ることができました。**
:::

この内容が、皆さまの技術的な参考やヒントとなれば幸いです。***引き続き、学びやアウトプットを続けていきたいと思います。***
Stream APIとは？

今回から複数回に分けてJavaの便利機能「Stream API」について紹介していきます。

まずStream APIとはなんぞや？から説明し、様々な中間操作や終端操作を紹介していく予定です。

### Stream APIとは？
Java SE8から導入されたフレームワークで、コレクションや配列をより効率的に使いやすくするために拡張されたもの。
これによって、コードを簡潔に書き可読性を向上させたり、柔軟な操作を可能にしたりする。

Stream APIでは、コレクションの各要素を処理していく「Stream=流れ」をイメージして、コレクションをStreamという別の概念で扱う。


#### 従来のコレクション操作とStream APIの比較
一例として、Stream APIを使ったコードと従来のコレクション操作を比べてみる。

##### ★従来のコレクション操作の例
```java:Sample.java
import java.util.Arrays;
import java.util.List;

public class Sample {
	public static void main(String[] args) {
		
		List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9);
		for(int i = 0; i < list.size(); i++) {
			num = num * 2;
			System.out.println(num);
		}
		
	}
}
```

##### ★Stream APIを使った例
```java:Sample.java
import java.util.Arrays;
import java.util.List;

public class Sample {
	public static void main(String[] args) {
		
		List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9);
		numbers.stream().map(num -> num*2).forEach(System.out::println);
		
	}
}
```

上記の2つのコードでは、リスト内の1～9までの数字を2倍にして出力するというシンプルな操作を行っている。
**従来のコレクション操作の例**では、for文を用いてリスト内の各要素に対して2倍の処理を施している。
**Stream APIの例**では、2倍から出力までの操作を1文で完結させている。
出力結果は両方とも同じである。

シンプルな操作なので、明らかにStreamAPIが簡潔に書けているとまでは言えないが、複雑なコレクション操作の場合はStream APIの便利さがより際立つ。


### Stream APIの利用場面
・コレクションや配列の全要素に対して同じ変換や加工を加えたい場合			
    例）リスト内の全要素に対して、2倍の処理を施したいとき、全要素を大文字に変換したい場合など

・コレクションや配列の全要素に対して、合計や平均など統計を取りたい場合			
    例）オブジェクト型の要素をもつリスト内の全要素に対して、金額を取り出し合計や平均を求めたい場合など
    
・コレクションや配列の要素に対して、条件によってグループ化をしたり条件にあったデータのみ抽出したりしたい場合
    例）オブジェクト型の要素をもつリスト内の全要素に対して、同じ部門に属するメンバの情報を取得したい場  合など	

:::note info
上記のように、Stream APIの利用場面は、コレクションや配列の要素に対して加工を加えた結果を取得したい場合に用いることができる。
:::

:::note warn
**注意点**
Stream APIは、for文やwhile文の繰り返し構文を置き換えるための構文ではない。
for文やwhile文では、breakやcontinueを使える。また、Stream APIのラムダ式からはローカル変数の変更はできない。(実質的final)
:::


次回以降は、中間操作と終端操作について紹介していこうと思います！
Vimの使い方入門

# Vimの使い方入門

Vimは高機能なテキストエディタで、プログラミングやテキスト編集に宜しいツールです。ただし、初心者にとってはさらに学ぶのが難しいと感じることもあります。ここでは、基本的なVimの使い方を解説します。

## 基本のモード
Vimには主に以下の3つのモードがあります。

### ノーマルモード
初期状態のモードで、テキストの移動や編集コマンドを入力します。

### 挿入モード
テキストを入力するモードです。`i`キーで挿入モードに移行できます。

### コマンドラインモード
ファイルの保存や終了、設定変更のコマンドを入力します。ノーマルモードで`:`を押すと移行します。

---

## 基本操作

### Vimの起動と終了
- **起動**:
  ターミナルで `vim ファイル名` と入力するとファイルを開けます。新規ファイルの場合でも同様です。

- **保存して終了**:
  `:wq` を入力します。  
  - `:w` → ファイル保存
  - `:q` → Vim終了

- **保存せずに終了**:
  `:q!` を入力します。

### 挿入モードへの移行
- **挿入モード開始**:  
  - `i`: カーソルの前から入力開始  
  - `a`: カーソルの後ろから入力開始  
  - `o`: カーソル下に新規行を作成して入力開始

- **ノーマルモードに戻る**:
  `Esc`キーを押します。

### テキストの移動
- ノーマルモードでは以下のキーで移動できます。
  - `h`: 左に移動  
  - `j`: 下に移動  
  - `k`: 上に移動  
  - `l`: 右に移動

- ページ単位で移動:  
  - `Ctrl + d`: 半ページ下に移動  
  - `Ctrl + u`: 半ページ上に移動

- 行の先頭・末尾:  
  - `0`: 行の先頭  
  - `$`: 行の末尾

### テキスト編集
- **削除**:  
  - `x`: カーソル上の文字を削除  
  - `dd`: 現在の行を削除  
  - `d$`: カーソル位置から行末まで削除

- **コピーと貼り付け**:  
  - `yy`: 現在の行をコピー  
  - `p`: カーソルの後ろに貼り付け

- **元に戻す/やり直す**:  
  - `u`: 直前の操作を元に戻す  
  - `Ctrl + r`: 元に戻した操作をやり直す

### 検索
- `/検索したい文字列`: 下方向に検索
- `?検索したい文字列`: 上方向に検索
  - `n`: 次を検索
  - `N`: 前を検索

### ファイル操作
- `:w`: 保存
- `:e ファイル名`: 別のファイルを開く
- `:set nu`: 行番号を表示
- `:set nonu`: 行番号を非表示

---

## 練習のすすめ
- Vimには組み込みのチュートリアルがあります。ターミナルで `vimtutor` を実行すると基本操作を練習できます。

- **初めのコツ**  
  ショートカットやコマンドを全て覚えようとせず、日常的に少しずつ使ってみて慣れていきましょう。

---

Vimを使い始めると初めは難しく感じるかもしれませんが、基本操作に慣れると非常に便利なツールになります。ぜひ、自分の活用シーンを見つけて使ってみてください。
Expressでプロジェクトディレクトリを構築する方法

# Expressでプロジェクトディレクトリを構築する方法

ExpressはNode.jsでWebアプリやAPIを構築するためのフレームワークです。本記事では、Expressのプロジェクトディレクトリ構築の基本的な流れを解説します。

---

## 経済環境の準備

Expressを使用する前に、次の準備を行います。

### 1. Node.jsとnpmのインストール
最新版の[Node.js](https://nodejs.org/) をインストールします。

インストール完了後、次のコマンドでバージョンを確認します。

```bash
node -v
npm -v
```

---

## Expressのプロジェクト構築

### 1. express-generatorのインストール

Expressのテンプレートを構築するために、`express-generator`をグローバルインストールします。

```bash
npm install -g express-generator
```

### 2. プロジェクトを新規作成

#### プロジェクト名を指定する場合

下記のコマンドで新しいプロジェクトディレクトリを構築します。

```bash
express my-express-app
```

#### 現在のディレクトリに展開する場合

現在のディレクトリにプロジェクトを構築したい場合、以下のように実行します。

```bash
express .
```

### 3. 依存パッケージのインストール

プロジェクトディレクトリに移動し、次のコマンドを実行します。

```bash
npm install
```

### 4. サーバーの起動

次のコマンドを実行して、Expressサーバーを起動します。

```bash
npm start
```

ブラウザで`http://localhost:3000`にアクセスすると、初期ページが表示されます。

---

## Expressのプロジェクト構造

`express-generator`を使用した場合のデフォルト構造は次の通りです。

```
my-express-app/
├── app.js              # アプリケーションのエントリポイント
├── package.json        # 依存関係とスクリプト
├── bin/
│   └── www             # サーバー起動スクリプト
├── public/             # 非動ファイル (CSS, JavaScript, 画像)
├── routes/             # ルート定義
│   ├── index.js
│   └── users.js
├── views/              # テンプレートファイル (Pug, EJSなど)
│   ├── error.pug
│   ├── index.pug
│   └── layout.pug
```

---

## カスタマイズ

- **ルーティングの追加**: `routes`ディレクトリに新規ファイルを作成して追加。
- **テンプレートエンジンの変更**: 必要に応じてPug以外のテンプレートエンジン (EJS, Handlebars) をインストール。
- **非動ファイルの配置**: `public/`ディレクトリに画像やCSSファイルを配置。
- **ミドルウェアの追加**: 必要なミドルウェアを`app.js`に追加。

---
ソフトウェア開発チーム向け課題管理ツールのLinearと汎用的なワークスペースツールなNotionの比較は難しい

　最初に、私はソフトウェア開発チーム向け課題管理ツールのLinear・汎用的なワークスペースツールなNotionと表現しましたが。ここは人によってそれぞれ異なるでしょう。

　そして、この記事のバイアスですが、Linearは無料版の機能を深く理解しているが、Notionなどの他のツールは限定的な知識である。この記事を書いた動機ですが、AIがNotionをLinearの代替として勧めることが多かったため、両ツールの違いを調査した。

 　例え話でいうと、寿司に特化した回転寿司とうどんやアイスクリームなど、寿司以外のメニューが豊富な回転寿司の評価を比較するのは難しいということです。

  　もし、あなたが、課題管理以外の機能まで求めるなら、Linearは選択肢に入れるべきではない。
  Notion、Jira、Asanaなどの多機能ツールから選定するべきです。

　Linearの代用ですが、複雑なサブ課題を必要としないならJiraもいいと思います。
あと、GithubのPreview版は、Sub-Isuueが作れて便利になりました。

　私は、LinearとGithub-Preview版、どちらをメインにするか悩んでいます。

## まとめ
Linearはソフトウェア開発チーム向け課題管理であり、ドキュメント共有や知識管理には向かない。

また、課題管理としてLinearという名前を耳にすることが増えると思いますが、ソフトウェア開発以外の用途にはむいてない。
Difyを触る上で押えておきたいLLM

### o1

https://openai.com/index/learning-to-reason-with-llms/

「o1」は2024年9月にリリースされた、現時点での最新モデルです。「o1」シリーズは「Chain of Thought」機能により、既存のgpt4では弱かった推論の精度が高まったとのことです。

chatGPTの無料版を使うとバックでは「GPT-4o」と「GPT-4o mini」のモデルが動きます。ただし、「GPT-4o」の利用は限定的です。

月額＄20を払ってPlusにすると「o1」「o1-mini」が使えるようになります。それ程バリバリ使わないので、月額＄20は痛いなというような場合は、Difyで「o1」「o1-mini」モデルが使えるようになっているため、トークン単位で課金して利用することができます。トークン単位で課金すれば月＄20以上かかってしまう場合は、chapGPTplusを利用することで、月＄20で使い放題にできます。

### Gemini 2.0 Flash Exp

https://deepmind.google/technologies/gemini/flash/

2024年12月11日にリリースされた現時点での最新モデルです。OpenAIのo1と同じようにこちらも推論が強化されてます。昨今は推論モデルの競争が激化しているもようです。

### command-r

https://cohere.com/blog/command-series-0824

最新モデルは2024年3月13日にリリースされています。OpenAIに比べると最新モデルのリリース頻度はそれほど高くはありません。rerankで有名なcohereですがLLMにも力を入れています。cohereだけにRAGに強いLLMをアピールしているようです。この辺は他社との差別化を図っているのでしょう。

### claude-3.5-sonnet

https://www.anthropic.com/news/claude-3-5-sonnet

Claude3の次バージョンとして、最新モデルが2024年6月21日にリリースされています。こちらもOpenAIと比べると最新モデルのリリース頻度はそれほど高くはありません。ベンチマークではgpt、geminiと比較してもまったく遜色がないようです。こちらのモデルはAWSのBedrockからでも利用できます。AmazonのTitanと上手い具合に共存して進んでいくものと想定されます。
OCI Cloud Free Tier をもぎ取れ その16

# 概要
OCI Cloud Free Tierを取得してみた。
ポート開放してみた。

# 手順

コンピュート->インスタンス->仮想クラウドネットワーク(VCN)->セキュリティリストのイングレスルールを開きます。

セキュリティ・リストのIngress Ruleに、TCP 80ポートを許可します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/6eb6db68-3f9d-c713-9924-0df082082558.png)


以上。
Databricksワークスペースにファイルをドラッグ&ドロップでインポートできるようになりました！

これも地味に嬉しい機能。これまでは[**インポート**](https://docs.databricks.com/ja/notebooks/notebook-export-import.html#import-a-notebook)ダイアログを表示して取り込む必要がありました。

[**ドラッグ&ドロップによるワークスペースファイルのインポート**](https://docs.databricks.com/en/release-notes/product/2025/january.html#import-workspace-files-with-drag-and-drop)

> ファイルやフォルダーをドラッグアンドドロップして、ワークスペースにインポートできるようになりました。ドラッグアンドドロップは、メインのファイルブラウザページと、ノートブック、クエリ、ファイルエディタで利用可能なワークスペースファイルブラウザサイドパネルで機能します。ファイルのインポートについては、[ファイルのインポート](https://docs.databricks.com/ja/files/workspace-basics.html#import-a-file)を参照してください。

早速試してみます。

![notebook_import.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8209741c-772f-6884-5739-7f3e3a97d8e0.gif)

お手軽。上にあるようにノートブックを開いた状態からアクセスできるサイドパネルでも動きますし、[dbcファイル](https://docs.databricks.com/ja/notebooks/notebook-export-import.html#export-all-notebooks-in-a-folder)もインポートできました。

![dbc_import.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7f7a104c-0058-990d-c36f-d1a82ec0d0ec.gif)

ご活用ください

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
イチローもすなる瞑想というものを IT エンジニアもしてみむとしてする、頭を「からっぽ」にするレッスン

[Amazon.co.jp: 頭を「からっぽ」にするレッスン 10分間瞑想でマインドフルに生きる 電子書籍: アンディ・プディコム, 満園 真木: Kindleストア](https://www.amazon.co.jp/dp/B08HC9JPH3)

![](https://m.media-amazon.com/images/I/71PcLdCgfwS._SY466_.jpg)

頭を「からっぽ」にするレッスン - 10分間瞑想でマインドフルに生きる という本。

[どんな時でも結果が出せる！　イチロー式 集中力 | PHPオンライン｜PHP研究所](https://shuchi.php.co.jp/article/90)
> 「なにも考えずにボーッと金魚を眺めていると、気持ちが落ち着くんです。とくに、イライラしているときはリラックスできる」

とのこと。またこの 頭を「からっぽ」にするレッスン はビル・ゲイツが

>日々、ストレスを解消し心を集中させるしばしの時間が誰にとっても必要なこの時代に、はじめての1歩としてうってつけの1冊だ

などと言って薦めている。というわけで、日々のストレスに対処する一つの方法として瞑想ってどういうことすればよいのというのをざっくり知りたくて読みました。その読書感想文です。


## 知見

- 筆者は仏僧やピエロを経験。「仏僧からピエロへの転身は意表を突くものに思われるかもしれませんが、一瞬一瞬の肉体の動きに意識を向けることが大切だということです」
- 何も考えず人にどう思われるかを気にせず何らかの結果にこだわらずただやる。
- 一切のこだわりも予断も捨てて自然な意識を保つ。
- 量より質、まずは 10 分やってみろとのこと。
- 「私達は始終何かをすることに忙しくて、ただじっと心を休めることの意味を省みることさえありません。私たちは 何かをする ことにとりつかれていて、そこには 考える ことも含まれます」。確かに考えても仕方のないことを考えてしまい、考えても行動しようがないことまで気にするのは本来もったいない。

### エクササイズ

以下を 2 分単位でやってみる。

```:手順
- エクササイズ 1: 何もしない
- エクササイズ 2: 五感に集中する
- エクササイズ 3: 肉体の感覚に集中する
- エクササイズ 4: 心地よさ、不快感に集中する
- エクササイズ 5: 自分の感情に気づく
- エクササイズ 6: 頭からつま先までをスキャンする
```

- その詳細: 呼吸を利用してみる。静かなプールの水を思い浮かべる。
- 一方で、道に空いた穴をイメージする。穴とは、癖になっている良くない反応のこと。それを避けることを考える。
- 既に行ったエクササイズの要素を 10 分間おこなっていく

はじめる前に:
```:手順
- 背筋を伸ばして楽に座る
- 邪魔が入らないようにする
- 10 分間タイマーをセットする
```

導入時に:
```:手順
- 5 回深呼吸
- 接地面の感覚に集中
- 体をスキャンする
- 今の気分を感じる
```

より深く:
```:手順
- 呼吸
- リズム
- 感覚を確かめながら、時間の限りサイクルを繰り返す
```

瞑想を終えたら:
```:手順
- 一切の集中をやめる
- 感覚に意識を戻す
- そっと目を開ける
```

以上を意識すると良いようです。この一連を繰り返せるようにすることがまず目標になりそうですね...以下は Tips。

- 背筋がまっすぐ伸びるのがベストだが無理にそうする必要はない。
- 骨盤の位置が背中の位置を決めるので、位置注意。
- 寄りかからないように、上方向をイメージする。
- 足は組まず、足の裏が完全に床につく。
- 両手を重ねて膝の上。
- 頭は首の上になるべくまっすぐ。
- はじめは目を閉じる。

「不快感が表に出てくるのを目撃することは、ほとんどそれが去っていくのを目撃していることに等しい」らしい。そして絶えず体験を記録すると良いとのこと。


## 心はひとつの場所にしかいられない

「心はひとつの場所にしかいられない」、これはそう言われるとそうだなと感じました。常にシングルコア。それはそう。

- 食べながらマインドフルネスを意識する。
- 運動しながらマインドフルネスを意識する。

走りながら、眠りながらでも良いらしいです。

## まとめ

以下は瞑想の要素。

- 視点
- コミュニケーション
- 感謝
- 親切心
- 思いやり
- バランス
- 受容
- 平静さ
- 繰り返し

上のような要素を意識しながらの瞑想が本来のようです。読んでみて、結局は自己暗示みたいなところもありそうですが、続けていると心穏やかになるだろうという感覚はわかります。なにしろイチローが行っているなら何かしらいい効果はあるのだろうと感じつつ、概要を理解することで日々の IT 稼業にもなにがしか良い影響があると良いなと思いました。

以上です～
ExcelからCSV保存する時のトラップ

Excelを使ってCSVファイルを保存するとき、保存形式によってファイルの先頭に余計な文字列が付くことがある。この現象について、原因と対応策を整理した。

## 現象：CSVファイルに謎の文字が付与される

Excelで「名前を付けて保存」を使ってCSV形式で保存したファイルを他のシステムへインポートしようとしたとき、先頭に「・ｿ」という文字が表示されることがある。
（↓Accessのインポート画面）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1349988/4e3999b7-8580-ba8b-4b4b-bc2a1b4823d9.png)

### 再現手順
1. Excelで「名前を付けて保存」を選ぶ。
2. ファイルの種類を「CSV **UTF-8**（コンマ区切り）」に設定して保存。
3. 作成したCSVファイルをAccessで開くと、先頭に「・ｿ」が表示される。

一方で、「CSV（コンマ区切り）」を選んで保存した場合、この問題は起きなかった。
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1349988/fc823c06-4e8a-ad85-068c-4aa98e501860.png)

## 原因：BOM（Byte Order Mark）

この問題は、BOM（Byte Order Mark）というマーカーに起因する。

### BOMとは
BOMとは、ファイルの文字コードを示すために、ファイルの先頭に付加されるデータのこと。UTF-8形式では、BOMが付与される場合がある。

### 問題になる理由
BOM付きファイルを扱うと、一部のソフトウェアではBOMが不要な文字として処理される。具体的には、Accessにインポートすると、データの先頭に余計な文字が入ってしまう。逆に、BOM付きでないとエラーになるシステムも存在するとのこと。

## 対応策

BOMが原因で問題が起きる場合、以下の方法で対処できる。

### 保存時の選択肢
1. **「CSV（コンマ区切り）」を選ぶ**
   - この形式ではBOMが付かない。
2. **「CSV UTF-8（コンマ区切り）」を避ける**
   - この形式だとBOMが付く。

### ファイル確認方法
保存したCSVファイルをメモ帳やテキストエディタで開き、「BOM付き」と表示されるかどうかで確認できる。
![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1349988/23f3ff3d-49fb-76d9-8143-e7f3cf756902.png)

## 結論
ExcelでCSVを保存するときは、保存形式を意識して選ぶ必要がある。BOMが原因で問題が出るなら、「CSV（コンマ区切り）」を使えば回避できる。