OmniAICreator/Qiita-1.07M huggingface dataset:
systemd-bootをビルドする

#
# これはなに？

・ systemdに含まれるブートローダーを切り出したものです。

   https://wiki.archlinux.jp/index.php/Systemd-boot によると、


systemd-boot (旧名 gummiboot。ドイツ語で「ゴムボート」)は、 設定された EFI イメージを実行するシンプルな UEFI ブートマネージャーです。
デフォルトのエントリは設定されたパターン (glob) または矢印キーで操作する画面上のメニューによって選択されます。
systemd に含まれており、Arch システムにデフォルトでインストールされます。

systemd-boot は EFI 実行可能ファイル (EFISTUB、UEFI シェル、GRUB、Windows ブートマネージャ) のみを起動できることに注意してください。

# そもそも、ブートローダーって、何？
- OSを読み込んで起動させるLoader のことです。
- Linux では、殆どの場合、 grub という名前のローダーが使われています
- 昔の人に説明する場合は、それが LiLoだったり、 MBM 0.39 だったり、します。（もっと分からない）
- ブートセレクターになる場合もあります。（今どきは起動時OS切り替えは殆どしない（需要は無い））

# Ubuntu24.04LTS 上でビルド＆テスト実行(QEMU)できます。

# 追加したものはなに？

- 簡易的に使用できるバッチファイルとして：

makefile:
-   clean build copyfs run requirement
 を追加しました。

また、ビルドエラー回避のため、build/src/sd-boot/consile.c の一部をコメントアウトしてあります



# 使い方

make requirement  により、（必要であれば）Ubuntuのパッケージを取得してください

make build        により、ビルドされます。

make run          により、qemu が起動し、UEFI Bootが実行されます。

- 今のところ、ブートローダーのメニューリストは、未設定です。

QEMUから起動したところで、力尽きています。

# これは、何に使うのですが？
- デフォルトで使用されている grub よりも systemd-boot のほうがシンプルで速いので、（通好みには）好まれる場合があります。（知らんけど）

- １台のPCに複数のOSを入れて、起動時に切り替える用途に使用できます。（それだと grubと変わらないけれど、まあ systemd-bootを魔改造して MBM 0.39 みたいにする、といった用途はありなのか？？？）

- UEFI Boot の練習用として。（たとえば、 UEFI_Basic64 ・・・）

# 蛇足
- QEMU を終了させるには、
```
[CTRL] ＋ [ALT] ＋ [2]
```
 を押して、その後、
```
 > quit
```
 を投入してください

# 公開リポジトリ

https://github.com/iruka-git/systemd-boot

#
後からprivateメソッドにすることができる

### private の後にキーの形でメソッドを渡す
```rb
irb(main):001* class User
irb(main):002*   def foo
irb(main):003*     'foo'
irb(main):004*   end
irb(main):005*   def bar
irb(main):006*     'bar'
irb(main):007*   end
irb(main):008*   private :foo, :bar
irb(main):009*
irb(main):010*   def baz
irb(main):011*     'baz'
irb(main):012*   end
irb(main):013> end
=> :baz
irb(main):014> user = User.new
=> #<User:0x0000000108c15328>
irb(main):015> user.foo
(irb):15:in `<main>': private method `foo called for #<User:0x0000000108c15328> (NoMethodError)

user.foo
    ^^^^
	from 
 ....
irb(main):016> user.bar
(irb):16:in `<main>': private method `bar' called for #<User:0x0000000108c15328> (NoMethodError)

user.bar
    ^^^^
Did you mean?  baz
	from 
 ...
irb(main):017> user.baz
=> "baz"
```
【無料】M575でも高速スクロールをする方法！

## はじめに

:::note
Windowsユーザーが対象です。
また、この記事で紹介する方法は、トラックボールマウスに限らず有効です。
:::

トラックボールマウスって便利ですよね。

しかし、我らがM575は高速スクロールに対応していません！！！（なぜ）

しかし、そんなM575でも、「実質高速スクロール」をする方法を見つけたので、ぜひ試してみてください。おそらくM575が10倍ぐらい快適になります。


ちなみに、今回使用するX-Mouse Button Control というソフトが、Windowsにしか対応しておらず、Macユーザーはできませんが、Macでも別のソフトで同じようなことができるそうなので、記事のリンクを貼らせていただきます。
[【Hammerspoon】トラックボールで画面スクロールを可能にする](https://qiita.com/j4nzeri/items/cda86dbaabd9058468dc)


## 使用するソフト

X-Mouse Button Controlというソフトを使用します。

https://www.highrez.co.uk/downloads/xmousebuttoncontrol.htm

このX-Mouse Button ControlではLogicool Options+のほぼ全てのカスタマイズにおいて同じようなことができます。

しかしM575の場合２つのカスタマイズボタンとミドルボタンがうまく認識されないため、Logicool Options+との併用がおすすめです。

## ダウンロード方法

１.　[X-Mouseボタンコントロール](https://www.highrez.co.uk/downloads/XMouseButtonControl.htm)このサイトから “Latest version” を選択してダウンロードします。基本的に全てそのまま進んでいって大丈夫です。

２.　[XMBC 言語パックとユーザーガイド](https://www.highrez.co.uk/downloads/xmbc_languages.htm)このサイトから “Japanese(日本語)” を選択して、ダウンロードし、画面の指示に従います。

## 高速スクロール設定

今回は右ボタンを押しながらトラックボールを動かすことで高速スクロールができるようにします。

１.　右ボタンのメニューから、オートスクロールを選択します。

![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_3935097_2fb7ca7c-d5db-628a-63b9-639fe827bf9b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935097/dd8f1d86-7c4f-4fd1-8e3f-31c5d916e549.png)


２.　オートスクロールの設定を以下のようにします。

（縦のスクロール方向を逆転させるなど、お好みでカスタマイズもどうぞ）

![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935097/e1f59dd6-7a8d-5465-1d1d-bd61938864de.png)


３.　OKを選択し、適用をクリックして下さい。

**注意：適用をクリックしないと設定が保存されません！**

## マウスポインター設定

１.　左下の共通設定をクリックします。

![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_3935097_91a38061-4539-a180-0b5f-ca953cae1519.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935097/27275d8f-f0fb-4cb5-8d13-8427a91f4fbf.png)



２.　ポインタを選択し、下のdからhをすべてオフにし、OKを押して適用

![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_3935097_3c60400d-1e68-7c1c-4729-8ea03bf76215.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935097/1804040a-0d8e-4a2e-a4d4-e6486b3ff58b.png)



## オートスクロールがうまくいかないときは
筆者は、マウスポインターの設定の、「オートスクロールのときマウス・ポインタのデザインを変更する」をオンにした後、再度オフにすると解決しました。


## 最後に

以上、高速スクロール非対応のマウスに高速スクロールを対応させる方法について紹介しました。

このX-Mouse Button Control は、高速スクロール以外にもいろいろなカスタマイズをすることができて、生産性がUPします。ぜひ、ほかにもいろいろ機能をいじってみてください。

:::note
役に立ったと思った方は、いいね是非よろしくお願いします！
:::
privateから先に定義してみる

```rb
irb(main):001* class User
irb(main):002*   private
irb(main):003*
irb(main):004*   def foo
irb(main):005*   end
irb(main):006*
irb(main):007*   public
irb(main):008*
irb(main):009*   def bar
irb(main):010*   end
irb(main):011> end
=> :bar
irb(main):012> User.bar
(irb):12:in `<main>': undefined method `bar for User:Class (NoMethodError)

User.bar
    ^^^^
	from 
...
irb(main):013> user = User.new
=> #<User:0x000000010519bcd8>
irb(main):014> user.bar
=> nil
irb(main):015> user.foo
(irb):15:in `<main>': private method `foo' called for #<User:0x000000010519bcd8> (NoMethodError)

user.foo
```
```rb
irb(main):001* class User
irb(main):002*
irb(main):003*   def self.foo
irb(main):004*     "foo"
irb(main):005*   end
irb(main):006*   private_class_method :foo
irb(main):007*   public
irb(main):008*   def self.hey
irb(main):009*     "hey"
irb(main):010*   end
irb(main):011*
irb(main):012*   def self.foo_h
irb(main):013*     "#{self.foo}"
irb(main):014*   end
irb(main):015> end
=> :foo_h
irb(main):016> User.foo
(irb):16:in `<main>': private method `foo' called for User:Class (NoMethodError)

User.foo
    ^^^^
Did you mean?  foo_h
...
irb(main):017> User.foo_h
=> "foo"
irb(main):018> User.hey
=> "hey"
```
* `self.foo`を入れ込んでも呼び出すことができる。
LaravelでHTML形式のカバレッジを取得する

LaravelでHTML形式のカバレッジを取得する方法です。
Laravelのプロジェクトがあって、phpunitでユニットテストを書いている前提です。

# 環境
Laravel 9
Xdebug v3.3.2

# 準備
Xdebugをインストールします。
```
sudo pecl install xdebug
```
次にphp.iniを変更します。
```
# /etc/php.ini
zend_extension=xdebug.so
xdebug.mode=coverage
```

# 取得、確認
Laravelプロジェクト直下で以下を実行します。
メモリ使用量はプロジェクトの大きさに応じて変えます。
また、この場合はtests/Unitのユニットテストを対象にしています。
```
php -d memory_limit=1G vendor/bin/phpunit --coverage-html=coverage tests/Unit
```

実行すると、coverageディレクトリが現れます。
ダウンロードして index.html を開くと、カバレッジを見られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641121/21b7f1c3-d847-5499-ef71-3797d4be3594.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641121/7f1ecfe4-694d-9487-b06a-9fe436012ce6.png)

ControllersやModelsをクリックすると、各種ファイル毎の網羅率を見られます。

Laravel9はサポート終わっていて古いですが、10や11も同様に動くと思います。
kindで作成したKubernetesクラスタにユーザーを追加する

# はじめに

Kubernetesクラスタにユーザーを追加する手順は、Linuxで言うところのuseradd hogeのように簡単ではない。
そこで、kindで作成したKubernetesクラスタにユーザーを追加しながら、その手順についてまとめる。

# 

|Component|Version|
|---|---|
| PC | M1 MacBook Pro |
| OS | macOS 15.1.1 |
| Docker Desktop | 4.36.0 |
| kind | v0.25.0 |
| Kubernetes | v1.31.2 |
| openssl | 3.4.0 |

# 手順

Kubernetesクラスタにユーザーを追加する手順は以下。

1. 秘密鍵を作成する
2. Certificate Signing Request (CSR)を作成する
3. Certificate Signing Request (CSR)を認証する
4. 証明書を取得する
5. 追加するユーザーにClusterRoleをbindする
6. kubectlの設定
7. 動作確認

# kindでKubernetesクラスタを作成する

まずは動作確認に必要なKubernetesクラスタをkindで作成する。

設定ファイル
```yaml:kind-sandbox.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: sandbox
nodes:
- role: control-plane
- role: worker
```

Kubernetesクラスタを作成
```bash
kind create cluster --config kind-sandbox.yaml
```

# 秘密鍵を作成する

ユーザーが使用する秘密鍵を生成する。

```bash
openssl genrsa -out user.key 2048
```

# Certificate Signing Request (CSR)を作成する

秘密鍵を元にCertificate Signing Request (CSR)を作成する。

```bash
openssl req -new -key user.key -subj "/CN=user" -out user.csr
```

# Certificate Signing Request (CSR)を認証する

CSRを認証するためにmanifestを作成して、kubectl certificate approveで認証する。

```bash
cat <<EOF > user.yaml
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: user
spec:
  request: $(cat user.csr | base64 -w 0 | tr -d '\n')
  signerName: "kubernetes.io/kube-apiserver-client"
  usages:
  - digital signature
  - key encipherment
  - client auth
EOF
kubectl apply -f user.yaml
kubectl certificate approve user
```

# 証明書を取得する

認証に成功したら、下記のコマンドで証明書を取得する。

```bash
kubectl get csr user -o jsonpath='{.status.certificate}' | base64 -d > user.crt
```

# 追加するユーザーにClusterRoleをbindする

追加するユーザーuserにcluster-adminというClusterRoleをbindする。
```bash
kubectl create clusterrolebinding user-cluster-admin --clusterrole=cluster-admin --user=user --dry-run=client -o yaml > crb.yaml
kubectl apply -f crb.yaml
```

# kubectlの設定

kubectlに追加したユーザーで操作するためのcontextを追加する。
clusterはkindが作成したkind-sandboxを流用する。

```bash
kubectl config set-credentials user --client-certificate=user.crt --client-key=user.key --embed-certs=t
rue
kubectl config set-context kind-sandbox-user --cluster=kind-sandbox --user=user
kubectl config use-context kind-sandbox-user
```

# 動作確認

kubectlを実行して成功すれば、ユーザー追加が完了。

```bash
kubectl get all -A
```

# 最後に

kindで作成したKubernetesクラスタにuserというユーザーを追加する手順をまとめた。
この手順を実施することでCSRについての理解が深まった。

# 参考情報

- https://qiita.com/knqyf263/items/aefb0ff139cfb6519e27
- https://kubernetes.io/docs/reference/kubectl/generated/kubectl_create/kubectl_create_clusterrolebinding/
- https://kubernetes.io/docs/reference/kubectl/generated/kubectl_certificate/kubectl_certificate_approve/
クラスメソッドをprivateにする

# privateメソッドになるのはインスタンスメソッドだけ
```rb
irb(main):001* class User
irb(main):002*   private
irb(main):003*   def self.hello
irb(main):004*     "hello"
irb(main):005*   end
irb(main):006> end
=> :hello
irb(main):007> User.hello
=> "hello"
```
# `class << self`をつけるとクラスメソッドなる
```rb
irb(main):001* class User
irb(main):002*   class << self
irb(main):003*     private
irb(main):004*
irb(main):005*     def hello
irb(main):006*       'hello'
irb(main):007*     end
irb(main):008*   end
irb(main):009> end
=> :hello
irb(main):010> User.hello
(irb):10:in `<main>': private method `hello' called for User:Class (NoMethodError)
```
### self.helloではundefinedになる
```rb
irb(main):001* class User
irb(main):002*   class << self
irb(main):003*     def self.hello
irb(main):004*       'Hello'
irb(main):005*     end
irb(main):006*   end
irb(main):007> end
=> :hello
irb(main):008> User.hello
(irb):8:in `<main>': undefined method `hello' for User:Class (NoMethodError)
```

```rb
irb(main):001* class User
irb(main):002*   class << self
irb(main):003*     def hello
irb(main):004*       'Hello'
irb(main):005*     end
irb(main):006*   end
irb(main):007> end
=> :hello
irb(main):008> user = User.new
=> #<User:0x0000000101459ff0>
irb(main):009> user.hello
(irb):9:in `<main>': undefined method `hello' for #<User:0x0000000101459ff0> (NoMethodError)

user.hello
    ^^^^^^
...
irb(main):010> User.hello
=> "Hello"
```
* `class << self`がクラスメソッドのselfを付け足してくれているのか

# private_class_method を使うとprivateのクラスメソッドになる。
```rb
irb(main):008* class User
irb(main):009*   def self.hello
irb(main):010*     "hello"
irb(main):011*   end
irb(main):012*   private_class_method :hello
irb(main):013*   def self.k
irb(main):014*     "#{User.hello}はこんにちは"
irb(main):015*   end
irb(main):016> end
=> :k
irb(main):017> User.k
(irb):14:in `k': private method `hello' called for User:Class (NoMethodError)
```
* publicのメソッドを経由させてもhelloは呼び出されない

https://gihyo.jp/book/2017/978-4-7741-9397-7
SELECT 1 ←これなに？？

# はじめに
未経験でエンジニアになった方は、おそらく最初の技術研修で軽くSQLも触るのではないでしょうか。
自分も漏れなくそのうちの一人でした。
研修でCRUD操作を一通り習得し、
「これでSQLは完璧だ！」と、いざ現場に出てみると、
こんなSQL文が目に飛び込んできました。
```
SELECT
    A.id,
    A.name,
    CASE 
        WHEN EXISTS (
            SELECT 1 
            FROM B 
            WHERE B.id = A.id
        ) THEN '1'
        ELSE '0'
    END AS match_flag
FROM 
    A;
```
#### """SELECT 1"""　ってなんだ！？！？

# なんとなく使っていた"SELECT"
ここで自分が躓いたのは、
「SELECT文って、テーブルのカラム名を指定して取ってくるやつでしょ！」
というざっくりとした理解をしていたためでした。
このざっくりとした理解から少し深堀りしていくと、SELECT 1の存在意義が段々分かってきます。

SELECT文の基本と言えば、以下のような使い方です。
```
SELECT
    A.id,
    A.name
FROM 
    A;

#結果の例
+---------+-------+
| id     | name   | 
+---------+--------
| 1      | Bob    | 
+---------+-------+
```
この処理をもう少し細かく理解してみましょう。
実はこのとき、内部的には以下の処理が行われています（あまり厳密ではないですが）。

>①FROM句で指定されたテーブルA全体がスキャンされる
②スキャンされたデータのうち、SELECT文で指定されたもののみを出力する


# SELECT 1 の出力結果は？
「じゃあ、SELECT 1」の結果ってどうなるの？という疑問が出てくるかと思います。
結果は、**常に1が返ってきます。**
具体的には以下の処理が行われるためです。

>①FROM句で指定されたテーブルA全体がスキャンされる
②スキャンされたデータのうち、SELECT文で指定されたもの（＝1）のみを出力する
**→出力値は常に1**

「毎回1が出力されるなら意味ないじゃん！！」と思いますよね。
僕も思いました。

ですが、SELECT文を実行することに自体に意味があることケースがあるのです。
その代表例がEXISTS句です。

# EXISTS句でSELECT 1を使う理由
### ハマりがちなポイント
EXISTS句とは、SELECT文の実行結果について、
「1行でも結果があればTRUEを、0行ならFALSEを返却する」関数です。

ここで、冒頭のSQLのEXISTS句の部分を見てみましょう。
```
 EXISTS (
            SELECT 1 
            FROM B 
            WHERE B.id = A.id
        ) 
```
これを最初みたとき、僕は思いました。
「"1" の行数が1行か0行かの判定って、処理として成立しなくない？？？」
と。

ここが"SELECT 1"を理解するときに陥りがち（だと思われる）ポイントです。

### "出力結果"と"実行結果"の違い
以下の単純な事実を理解した瞬間、僕の中のEXISTS句の謎は解けました。
**「SELECT文の出力結果（最終的な処理結果）と実行結果（内部的な処理結果）は別物である」**

僕は"出力結果"と"実行結果”を混同して考えていたので"SELECT 1 "が理解できなかったのでした。

＜誤った考え＞
「"1"（SELECT文の出力結果）の行数が1行か0行かの判定って、処理として成立しなくない？？？」
＜正しい考え＞
EXISTS句が評価するのは**出力結果ではなく実行結果**なので、出力結果である"1"に対して評価をするわけではない。

このことを、先ほどのSELECT文の処理の流れで説明すると、以下のようになります。


>①FROM句で指定されたテーブルA全体がスキャンされる（**実行結果**）
②**実行結果**に対して、EXISTS句の評価が行われる
②スキャンされたデータのうち、SELECT文で指定されたもののみを出力する（**出力結果**）

※ SELECT 1 の場合、常に**出力結果は**1になる。


# 別にSELECT 1を使わなくてもいい
以下のように、出力結果を1にせず、テーブルBの全てのカラムを出力対象としても、結果としては問題ありません。
```
 EXISTS (
            SELECT * 
            FROM B 
            WHERE B.id = A.id
        ) 
```
では、なぜSELECT 1 を使うのでしょうか？
個人的には以下の理由があると認識しています。

・意図を明確にするため
→このクエリの実行結果だけが大事で、出力結果は関係ないよ～ということが分かりやすくなる
・処理効率を少しでも高めるため
→クエリの実行結果に多数のカラムがある場合、全てのカラムを出力すると少し処理効率が落ちてしまう

余談ですが、別にSELECT 0でもSELECT 10000でも動作に影響はないです。
ただ慣習的に SELECT 1 を使う人が多いので、その方が意図も伝わりやすいだろう、ということのようです。

# おわりに
玄人エンジニアの諸兄姉からすると、「こんな当たり前のことも分からないのか」と言われてしまいそうな内容になってしまいました。
すみません、こんな当たり前のことも分からなかったんです...(;o;)。

ITエンジニアという仕事は、
「見えない部分（＝プログラムの内部処理的なところ）を想像して、見えている部分（＝出力結果）と切り離して考える」
という思考がときどき求められる気がするのですが、これがどうも新鮮に感じられます。
自分が文系出身だからなんでしょうか？

こういう違和感のようなものは慣れてしまうと感じなくなってしまうので、
初心者がどういうところで躓くのか、
どんな思考が抜けているのか、
だんだん分からなくなってしまうような気がしています。

こういう初心者のうちの小さな違和感については、きちんと書き留めて見返せるようにしておきたいです。
ローカルのmacにRedisをインストール


### Homebrewにてインストール
```
brew install redis
```

### サーバ起動
macにログインした場合や再起動した場合に、バックグラウンドで自動的に起動させる
```
brew services start redis
```
ログで 「==> Successfully started `redis` (label: homebrew.mxcl.redis)」と出たら成功

# 使い方

### クライアント起動
```
redis-cli
```

### キー値をセット
```
127.0.0.1:6379> set MyKey MyValue
OK
```
### 値を取得
```
127.0.0.1:6379> get MyKey
"MyValue"
```

### キーと値を削除
```
127.0.0.1:6379> del MyKey
(integer) 1

127.0.0.1:6379> get MyKey
(nil)
```

### 終了
```
127.0.0.1:6379> quit
```
isoファイルとはなんぞや

## isoファイルとの出会い
その出会いは突然訪れました。
「xxxxx.iso」という名の見たこともない拡張子との出会い。
これは偶然か運命か。
出会ったあの日からこの子のことが気になっています。
気になる子ができたらその子のことを知りたくなるのは当たり前のことです。
と、いうわけでisoファイルについて調べて見ました。

## isoファイルとはなんぞや
isoファイルとは、CDやDVDなどのディスクの内容をまるごと一つのファイルにまとめたイメージファイルのことだそうです。
isoファイルには、ディスクのデータ構造や内容がそのままコピーされています。そのため、元のディスクと同じデータや構造を再現できます。
「.iso」という拡張子のため「イソファイル」「イソイメージ」という名で呼ばれているようです。

## どんな用途で使うの？
- バックアップ
ディスクの内容（データ、ファイル構造、ブート情報など）を丸ごと保存できるため、バックアップやデータ保護に非常に便利です。

<br>

- OSのインストール
WindowsやLinuxのインストールメディアとして利用することが一般的です。

<br>

- ソフトウェア配布
商用やオープンソースソフトウェアの大規模な配布に使用されます。

<br>

- ゲームや映像コンテンツの保存
ゲームやDVDのデータをISO形式で保存しておくことで、ディスクを使わずにアクセス可能です。

私が出会ったのもバックアップを作成する時にisoファイルを作成してDVDに書き込むという作業の時でした。
isoファイルでバックアップを作成するのにどんな利点があるのでしょうか？

## isoイメージを使ったバックアップの利点

### 完全なコピー

ディスクのデータだけでなく、ファイル構造やシステム情報（ブートセクタなど）も保存されます。
特に、OSインストールディスクや特殊なディスクフォーマットの場合に有用です。

### 物理ディスクの置き換え
ディスクをISOとして保存すれば、物理的なディスクを使用せずに内容を利用できます。
ディスクドライブがないデバイス（例：薄型ノートPC）でも利用可能です。

### コンパクトな保存
ディスクをISOファイルとして保存することで、物理スペースを節約できます。
複数のディスクを一つのストレージデバイスにまとめることも可能です。

### バックアップの耐久性
物理的なディスクは経年劣化や傷で読み取れなくなることがありますが、ISOファイルはデジタルデータとして保存されるため、長期間保存が可能です。

## まとめ
今回isoファイルについて調べて中身がどんな構造になっているのか、どんな用途があるのか知ることができました。
isoファイルのことが知れたので今後はもう少し仲良くできる気がします。
朝会活性化のすすめ

# この記事について
この記事では**朝会の活性化**に向けて、私たちのチームが取り組んでいることをご紹介します。

----
# こんな朝会やっていませんか？
みなさんは朝会していますか？
多くの方が進捗報告や連絡をする定例ミーティングを実施しているかと思います。
その朝会でこんなことはありませんか？

- 主催者だけが一方的に話している
- 参加者からは必要事項のみ話す

そんなお通夜のような朝会を活性化すべく、私たちのチームでやっている取り組みをご紹介します！

----
# 目的
ミーティングで場を和ますための「アイスブレイク」は聞いたことがあるでしょうか。
アイスブレイクの朝会版ともいうべき内容で、以下のことを目指しています。

- 参加者が全員1回は話す
- 話しやすい雰囲気を作る

100%効果がでる！という確証はありませんが、状況によってはとても良い効果を生むと思います。
騙されたと思って一度やってみてください。

----
# 全体の流れ
全体の流れは以下の通りです。
1. 今日の司会、発言順の確認
1. 一人ずつ30秒程度のトピックを発言
1. 朝会の本題へ

細かく紹介していきます。

----
# 今日の司会、発言順の確認
事前に日替わりのルーレットを作成しました。
全員の発言の機会を増やすよう、司会を持ち回りで行います。
ルーレットで司会（No.1の人）と発言順を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974516/4b88fa69-5227-9a5e-4ee8-93760c56af29.png)

※名前は仮名です。そんなことは読者のみなさまはまるっとお見通しだ！

----
# 今日のひとこと
発言順に自分の喋りたいことをしゃべります。
- 内容は何でもOK
- 1人30秒以内を目安
    - X(旧twitter)の1ポスト分くらいの長さ
- 他のメンバーからコメント（盛り上がりすぎない程度に…）

----
# 今日のひとこと（例）
実際の発言内容をご紹介します。
Aさん：体重を測ったら5kg痩せていたのでこの調子で頑張りたいです
Bさん：明日からブラックフライデーですが、あまり期待していません
Cさん：椅子が壊れたから買ったのですが、ブラックフライデーだったと聞いて待つべきだったかと思っています

----
# 感想
1カ月ほど運用してみた感想です。
私のチームは全員フルリモートなので日常的なコミュニケーションがSlackやMeetでの業務的なやり取りのみでした。
毎朝5分程度、相互に自己開示を行うことで、話しやすさが生まれていると感じます。

- メンバーの人となりを知れる
- 質問などで声掛けがしやすくなる
M3 macbook Air に VMWareFusionPro（個人利用無料）でArm版Windows11 を入れて、[英数][かな]で日本語On/Off制御可能にした


## 1. 用意するもの
- M3 MacBook Air (メモリ8GB)
- VMware Fusion Pro（個人利用は無料になった）

## 2. やったこと
1. VMware Fusion Proをインストール
2. VMware Fusion Proを起動して、ARM版Windows 11をインストール
3. Windows 11の設定で地域設定を「日本」に変更
　 スタートメニュー＞設定＞時刻と言語＞優先する言語＝日本語のみ、とする
4. Windows 11の設定でキーボードを「106/109」に変更（初期設定は「102」）
   - [日本語]の右側の三点リーダーから[言語のオプション]
   - キーボードのオプション　＞　レイアウトを変更　＞　日本語キーボード（106/109）に変更
   - これで「[英数]」「[かな]」キーが正常に動作するようになる
5. 日本語IMEの切り替えを「[英数]」「[かな]」でできるように設定
   - タスクバー端の「あ/A」切り替えアイコンを右クリック　＞　設定
   - キーとタッチのカスタマイズ
   - [好みの機能を割り当て]　＞　On
   - 無変換キー　＞　IME-オフ
   - 変換キー　＞　IME-オン
## 3. 注意点
- Windows側のアプリは32ビット版を使うこと
- 64ビットブラウザもよく動くが、GitHub.comで固まるなど問題が発生することも
- 母艦MacBookはメモリ8GBでも動作するが、16GBあった方が快適

## 4. 感想
- Windows MacOS どちらも好きだが、ハードウェアとしての魅力は完全にMacbook
- Bootcampの時代から、最高のWindows機はMacBookだと考えている
- M1以降のファンレスMacBookはPCの完成形だと思え、Windows機が欲しくなくなった
GitHub Container Registry で Helm Chart をホストする方法

最近、Kubernetes環境でアプリケーションを管理する機会が増えてきて、Helm chartの管理について考えることが多くなってきました。

今回は、GitHub Container Registry (GHCR) を使ってHelm chartをホストする方法を紹介します。GHCRは無料でプライベートレジストリも作れるので、個人や小規模チームのプロジェクトにぴったりです。

## 前提条件

まずは以下のツールが必要です：

- [Helm](https://helm.sh/docs/intro/install/)
- GitHubアカウント（Classic Personal Access Token が必要です）
  - `write:packages` スコープを持つトークンを作成してください
  - 注意：Fine-grained permissions は現時点でGHCRではサポートされていません

## 今回使用するチャートについて

今回は超シンプルな例として、`hello-world` という名前空間を作成するだけのチャートを使います。

構成はこんな感じ：
```
charts/hello-world/
├── Chart.yaml
├── templates/
│   └── namespace.yaml
```

```yaml
# Chart.yaml
apiVersion: v2
name: hello-world
description: A simple Helm chart that creates hello-world namespace
type: application
version: 0.1.0
appVersion: "1.0.0"
```

```yaml
# templates/namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: hello-world
```

## GHCRにチャートを公開する手順

### 1. GitHub Container Registryにログイン

まずはGitHub CLIでログインします：

```bash
helm registry login ghcr.io -u あなたのGitHubユーザー名
```

パスワードを求められたら、先ほど作成したPATを入力してください。

### 2. チャートをパッケージング

```bash
helm package charts/hello-world
```

実行すると、`hello-world-0.1.0.tgz` というファイルが作成されます。

### 3. GHCRにプッシュ

```bash
helm push hello-world-0.1.0.tgz oci://ghcr.io/あなたのGitHubユーザー名
```

これで完了です！簡単！

## 作成したチャートを使ってみる

GHCRからチャートをインストールするには：

```bash
helm install hello-world oci://ghcr.io/あなたのGitHubユーザー名/hello-world --version 0.1.0
```

## お掃除

テスト後は以下のコマンドでクリーンアップできます：

```bash
# Helmリリースをアンインストール
helm uninstall hello-world

# 作成された名前空間を削除
kubectl delete namespace hello-world

# ローカルのパッケージファイルを削除
rm hello-world-0.1.0.tgz
```

## まとめ

今回は、GitHub Container RegistryにHelm chartを公開する方法を紹介しました。
GHCRの利点をまとめると：

- 無料でプライベートレジストリが作れる
- GitHubと統合されているので管理が楽
- OCI標準に対応

みなさんもぜひ試してみてください！
ローカルのmacにRabbitMQをインストール


# Homebrewにてインストール
```
brew install rabbitmq
```

# 使い方

### サーバ起動
macにログインした場合や再起動した場合に、バックグラウンドで自動的に起動させる
```
brew services start rabbitmq
```
ログで 「==> Successfully started `rabbitmq` (label: homebrew.mxcl.rabbitmq)」と出たら成功

### アクセス
http://localhost:15672/

デフォルト設定
ポート:15672
ID:guest
パスワード:guest

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3474369/6785eaa4-71b3-78ea-02a6-926d76fe81ec.png)

ログインできた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3474369/eb878ade-cd5b-816b-0894-7982726a6f1d.png)
BigQuery の schema ファイルからカラムすべてが含まれる select 文をつくるワンライナー


要するに、bq show -schema の結果から、select 文を作りたいということ。
bq show -schema の結果が foo-table.json とする。

zsh で以下を実行

```zsh
 target=foo-table.json; \
jq -r '.[].name' $target \
| xargs \
| gawk '{
    table = ENVIRON["target"]
    sub(/\.[^.]+$/, "", table)
    gsub(/ /, ", \n  ")
    print "SELECT \n  " $0 " \nFROM\n  " table "\n;"
}'
```

実行結果イメージ

```zsh
SELECT
  col_a,
  col_b,
  col_c
FROM
  foo-table
;
```
PHPで注意すべきbool値の扱い方 var_dumpとerror_logの違い

## 記事の経緯
とあるデータベース処理の追跡を行っている際に、値を確認するためにerror_log()でbool値を扱ったところ、思いがけない形での出力が行われたため備忘録として。

## 実行環境

PHP 7.3.33

## var_dump()とerror_log()の違い

デバッグ処理においてログを追跡するために、この二つをなんとなく使用していました。
「var_dump()はブラウザに出すとき、error_log()はブラウザに出せないとき用の関数」
という程度の認識だったのですが、**bool値を扱うときは注意が必要**でした。

``` php
$bool_true = true;
$bool_false = false;

// var_dumpでの出力
var_dump($bool_true);   // 出力: (bool) true
var_dump($bool_false);  // 出力: (bool) false

// error_logでの出力
error_log($bool_true);  // 出力: 1
error_log($bool_false); // 出力: ""
```

- **var_dump()はmixed型を第一引数にとります**。
変数の型とその値を詳細に表示します。

- **error_log()はstring型を第一引数にとります**。
PHPはbool値を文字列化するときのルールとして、true = 1、false = ""を返します。

そのため、本来はbool値を入れることが不適切でした。

``` php
$bool_false = false;
error_log("bool_false:" . $bool_false);

// ログファイルでの出力
[Thu Nov 21 ~~] [php7:notice] [pid xxxx] [client xxx.xxx.xx.x] bool_false:, referer: http://xxx.xxx
```

まるで出力されていないようにも見えるので、原因の特定に手こずってしまいます。

## 解決策

**var_export()** を使おう

``` php
error_log(var_export($bool_true, true));  // 出力: true
error_log(var_export($bool_false, true)); // 出力: false
```

- **var_export()はmixed型を第一引数にとります**。
渡された変数に関する構造化された情報を返します。

error_log()はそのままだと読み取りにくいことが多いので、var_export()やprint_r()などと併用していくことを心掛けていきましょう。
【AWS Innovate】【2024/9/26】Kubernetesベースの開発プラットフォームの実現まとめ

## 概要
2024/9/26に開催されたAWS Innovateのうち、受講させて頂いた 林 政利 様による「Kubernetesベースの開発プラットフォームの実現 ~理想の開発者体験を提供するための考え方とプラクティス~」を受講したので簡単に内容についてまとめた。

公式サイト(下記リンク)から30分程度の講演視聴が可能。
https://resources.awscloud.com/aws-modern-applications-innovate-jp/2024-aws-innovate-mmb-t5-3-jp

## 発表内容
####  ゴール
・Kubenetisを利用したプラットフォーム構築のベストプラクティスを知る
・Kubenetisで開発者体験を改善する手法を学ぶ

#### 目次
1.Kubenetisプラットフォーム構築でよくある課題とその対策
    ・1-1 よくある課題
    ・1-2 対策
    
2.担当領域の明確化とその必要性
    ・2-1 担当領域の明確化
    ・2-2 明確化しなかった場合のプラットフォームチームの負担
    ・2-3 明確化しなかった場合の開発チームの負担
    
3.プラットフォームの実現方法
    ・3-1 仕様を明確にする
    ・3-2 開発とプラットフォーム両方を考慮した仕様を作る
    ・3-3 リソース管理は任せる

### 1 : Kubenetisプラットフォーム構築でよくある課題とその対策
#### 1-1 よくある課題
DevOpsとクラウドサービスの台頭によってCI/CDの導入やOSSが発展し、開発におけるアジリティー(構築の俊敏性)は近年で大きく向上した。しかしその反面、開発チームがそのメリットを享受するためには膨大な数のサービスやツールについて習熟しなければならなくなってしまった。

#### 1-2 対策 
肥大化した開発チームの負担を減らすためにも、習熟コストを払うことなく利用できるような"隠蔽されたプラットフォーム"が今強く求められている。以降はこの隠蔽されたプラットフォームの実現方法について記述していく。

### 2 : 担当領域の明確化とその必要性
#### 2-1 担当領域の明確化
隠蔽されたプラットフォームを実現するためにはまず、開発チームとプラットフォームチームの担当領域(責任範囲)を明確に分ける必要がある。

#### 2-2 明確化しなかった場合のプラットフォームチームの負担
AWSにおけるマネージドサービスを活用したアプリケーションの運用環境はそれ自体がプラットフォームであり、統制の管理は基本的にプラットフォームチームが行う。運用環境は近年では複雑化してきており、AWSのようなクラウドサービス以外にもオンプレミス、VMから複数種類を環境の土台とした設計がなされる場合も多く存在する。プラットフォームチームはこのような複雑化した土台の上に複数のコンポーネントを構築していくため、作業には非常に多くの労力と神経を使う。

またコンポーネントの改築の際には作業のタイミングや影響領域といった面で開発チームとの折り合いを付ける必要があり、更に多くの労力を割く必要が生じてしまう。

#### 2-3 明確化しなかった場合の開発チームの負担
Kubenetisを使用することでこの問題は容易に解決することが出来る。しかし今度は開発チームが主体となってコンテナ管理やアラート、スキーマといったような様々なコンポーネントを管理しなければならなくなり、これが前述した開発チームの学習コスト・管理コストの負担増大につながってしまっている。

よくある例としてコンポーネントの管理を進める中で複数チーム間の設計思想が大きく異なり、最終的に出来上がったKubenetisの環境がバラバラになってしまう事例も多く存在する。これはコストの増加のみならず、新規に参加した開発者の学習コスト増大にも繋がってしまう。またプラットフォームチームとの責任範囲が曖昧になってしまい、トラブルが発生した際の解決遅延に繋がる事も少なくない。

### 3 : プラットフォームの実現方法
#### 3-1 仕様を明確にする
担当領域を明確に分けるにはまずプラットフォームの仕様を明確にする必要がある。仕様を明確にするとは開発チームが"そのプラットフォームで何が出来て何が出来ないのか"を明確にするということである。

　仕様書を作成する際のコツとして開発者が開発に関する事だけ認知すればいいようにすることが大切である。これはOSSツールであるKubelaを利用することで実現可能である。

　またAmazon CodeCatalystやOSSのBackStageを利用することでテンプレートを作成し、開発者のデプロイに関する負担を下げることも効果的である。

#### 3-2 開発とプラットフォーム両方を考慮した仕様を作る
KubenetisはシングルテナントのシステムなのでKubenetisのアップグレードや機能追加の際には設計を考慮していなければすべてのチームに影響が及んでしまう。

ここで言う考慮されていない設計とはプラットフォームとチームが密結合してしまっている状態を指す。密結合はプラットフォームの設計の際に、その仕様を明確することで回避できる。具体的にはメンテナンスやその影響を開発チームとプラットフォームチームが双方に理解しやすい形で明記する必要がある。つまり双方におけるルール作りを進めるという事になる。

プラットフォームの仕様書によってメンテナンス時期や影響を把握することで開発者側はダウンタイムを意識することなく開発を進められる。プラットフォームチームは開発チームが仕様に準拠している前提でメンテナンスを行うことが出来るため、余分なメンテナンスのコストを割く必要がなくなる。
　これらの点から双方にとっても仕様書の作成は大きなメリットを生み出す事が分かる。

 #### 3-3 リソース管理は任せる
さらに担当領域の明確化を行うためにはKubenetis上のリソース管理を自動化してしまうのが有効となるKubenetis上ではすべてのワークロードがリソースを共有する。よってどこにどれだけのリソースを割くのかを人力で計算するのはかなりの負担となる。

またノード管理の自動化によってオンデマンドなリソースの起動以外にも、テナント毎のコスト管理を実現することが出来る。チームごとのリソース使用料やコスト把握が可能になるため、このような別の側面からの明確化も行えるようになる。

## 最後に
講演を受講する事でKubenetisを用いた開発プラットフォームの実現に関するベストプラクティスについて改めて考える事が出来た。デプロイやテストの行いやすさが注目されがちな分野だが、その実現にあたり開発チームのみならずプラットフォームチーム側を含んだ双方にとってメリットのあるような設計を第一優先として行う必要がある点は、見落とされがちな点のように感じた。

 今後開発環境の構築を行う機会がある際は改めてこの視点に立ち返ってみたい。
自己回帰過程 (AR)

# 1.自己回帰モデル
自己回帰モデル（じこかいきモデル、英: autoregressive model）は時点 t におけるモデル出力が時点 t 以前のモデル出力に依存する確率過程である。ARモデルとも呼ばれる。具体的には、現在の値を、過去の値の線形結合として表現します。

ARモデルの一般形は次の通りです：
```math

y_t = c + \phi_1 y_{t-1} + \phi_2 y_{t-2} + \dots + \phi_p y_{t-p} + \epsilon_t



```

- \( y_t \): 時刻 \( t \) の観測値  
- \( c \): 定数（オプション）  
- \( \phi_1, \phi_2, \dots, \phi_p \): モデルの係数  
- \( \epsilon_t \): ホワイトノイズ（誤差項）  
- \( p \): 過去の値を参照する遅延（ラグ）の数（ARモデルの次数）  

# 2.仕事で使える具体例
* 例 1: 売上データの予測
例えば、過去12か月の月次売上データがあるとします。このデータを基に来月の売上を予測したい場合、ARモデルを適用できます。
売上は季節性の影響を受けることが多いため、ARモデルの次数 p を適切に選ぶことで、過去の売上のパターンから次の売上を予測できます。

* 例 2: 気温データの分析
ある地域の気温データを日次で収集している場合、その日の気温は前日の気温に依存していることがよくあります。この関係性を捉えるのにARモデルが有効です。

*例 3: 株価予測
株式市場で株価の変動を予測する場合、過去の株価データを基に短期的な予測を立てることができます。ARモデルは、特に短期予測で有用です。

# 3. ARモデルの注意点
* 過剰適合に注意: 
p を大きくしすぎると、過剰適合（オーバーフィッティング）につながる可能性があります。
* 定常性の確認: 
定常性を満たしていないデータにARモデルを適用すると、精度が低下します。
Snowflake×dbt×dagsterをサクッと試す 

![スクリーンショット 2024-10-24 19.37.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/6d610614-209c-4ff8-8437-5da8d477cfa4.png)

## はじめに

データパイプラインの構築において、`Snowflake`、`dbt`、`Dagster`を組み合わせることで、効率的なワークフローを実現できます。本記事では、`jaffle_shop`というサンプルプロジェクトを使用して、`dbt`のセットアップから`Dagster`を使ったオーケストレーションのプロセスまでを簡単に解説します。`dbt`環境は既にDocker上に立ち上げられている前提です。

## ステップ1：jaffle_shopプロジェクトをクローン

まず、サンプルプロジェクト`jaffle_shop`をクローンします。
[jaffle_shopのリポジトリ](https://github.com/dbt-labs/jaffle-shop-classic)

```bash
git clone https://github.com/dbt-labs/jaffle_shop.git
cd jaffle_shop
```

このプロジェクトには、`dbt`を使用した基本的なデータモデルが含まれています。本来のプロジェクトでは実際にSQLなどを記述してデータ変換を定義しますが、今回はすでに記述済みのもので実行します。

## ステップ2：Snowflakeへの接続

プロジェクトをクローンしたら、次に接続設定を確認します。ルートの.dbt配下のprofile.ymlに接続情報を入れるとdbt側が情報を認識してくれます。
```
jaffle_shop:
  outputs:
    dev:
      account: 'アカウント情報'
      database: '使用するデータベース'
      password: 'パスワード'
      role: '使用するロール'
      schema: '使用するスキーマ'
      threads: 1  # 同時実行するスレッド数
      type: snowflake
      user: 'Snowflakeユーザー'
      warehouse: '使用するウェアハウス'
  target: dev
```
![スクリーンショット 2024-10-24 19.25.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/52dbbbf1-0b76-d371-e6c4-68a7ac2e3c33.png)

`dbt`環境が正しく設定されているかを確認するために、次のコマンドを実行します。

```bash
dbt debug
```

`dbt debug`により、`Snowflake`との接続が正しく確立されているかが確認できます。すべてのテストがパスすれば、`dbt`プロジェクトは正常に動作していることが確認できます。

## ステップ3：Dagsterプロジェクトの作成

次に、`jaffle_shop`プロジェクト内で`Dagster`プロジェクトを設定し、データパイプラインのオーケストレーションを行います。

まず、`dbt`のプロジェクトディレクトリに移動し、`Dagster`プロジェクトを作成します。

```bash
cd jaffle_shop
dagster-dbt project scaffold --project-name dbt_dagster
```

このコマンドにより、`Dagster`の構成と`dbt`の設定が組み合わされ、`dbt`モデルを実行するためのDagsterプロジェクトが作成されます。
![スクリーンショット 2024-10-24 19.28.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/01c384af-a234-f420-c2d0-ac0a404bae68.png)

## ステップ4：Dagsterでの実行

次に、`Dagster`を開発モードで起動し、Webインターフェースを通じてパイプラインを管理・実行します。
作成したDagsterプロジェクトディレクトリdbt_dagsterに移動します。
```
cd dbt_dagster
```

まず、`DAGSTER_DBT_PARSE_PROJECT_ON_LOAD`という環境変数を設定します。これにより、`Dagster`が`dbt`プロジェクトをロード時に解析します。

```bash
export DAGSTER_DBT_PARSE_PROJECT_ON_LOAD=1
```

次に、`Dagster`を開発モードで起動します。

```bash
dagster dev
```

ブラウザで`localhost:3000`にアクセスすると、`Dagster`のUIが開きます。UI上で`Materialize all`ボタンをクリックすることで、すべての`dbt`モデルをビルドしてマテリアライズします。これによりseedに入っているcsvがsnowflakeへロードされ、modelsで記述された実行順序に基づいてデータの変換及びテーブル作成が行われます。
![スクリーンショット 2024-10-24 18.53.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/c7e0582d-53af-53c6-2d19-c25f5dafc69e.png)
マテリアライズが全て成功すると✅がつきます。
Snowflake側でも、テーブルが作られていることが確認できます。
![スクリーンショット 2024-10-24 19.19.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/6286da00-d18b-2ebe-38e0-a063529adeae.png)

## まとめ

この手順により、`Snowflake`、`dbt`、`Dagster`を組み合わせて、データパイプラインのオーケストレーションを素早く試すことができました。`jaffle_shop`プロジェクトを利用することで、シンプルかつ実用的なデータモデルの操作を行い、`Dagster`のパイプライン管理を通じて一連の処理を自動化できました。
Javaで「CANON_EQフラグ(パターンと対象の文字がUnicode正規等価であればマッチする)」の動作を確認してみた

# 概要

Javaで「CANON_EQフラグ(パターンと対象の文字がUnicode正規等価であればマッチする)」の動作を確認しました。
以下のページを参考にしました。

https://www.javadrive.jp/start/regex/index24.html

# 実装

以下のファイルを作成しました。

```JSample24_1.java
import java.util.regex.*;

class JSample24_1{
  public static void main(String[] args){
    String target = "て\u3099は";

    String regex = "では";
    Pattern p1 = Pattern.compile(regex);

    Matcher m1 = p1.matcher(target);
    System.out.println(target + ":" + m1.find());

    System.out.println("---- ----");

    Pattern p2 = Pattern.compile(regex, Pattern.CANON_EQ);

    Matcher m2 = p2.matcher(target);
    System.out.println(target + ":" + m2.find());
  }
}
```

以下のコマンドを実行しました。

```
$ javac JSample24_1.java 
$ java JSample24_1 
では:false
---- ----
では:true
```

# まとめ

何かの役に立てばと。
C#でPDFをMarkdown文書に変換する

PDF文書をMarkdown形式に変換することは、特に固定レイアウトのPDFファイルからコンテンツを抽出し、より簡単に編集・処理できるテキスト形式に変換する必要がある場合、非常に実用的なニーズです。この記事では、サードパーティの.NETライブラリを使用して、**C＃でPDF文書をMarkdown（MD）文書に変換する**方法を紹介します。

## .NET PDFライブラリ
必要なサードパーティライブラリは[**Spire.PDF for .NET**](https://www.e-iceblue.com/Introduce/pdf-for-net-introduce.html)です。
以下のリンクから製品パッケージをダウンロードし、リファレンスを手動で追加するか、NuGet経由で直接インストールすることができます。

https://www.e-iceblue.cn/Downloads/Spire-PDF-NET.html


## PDFをMarkdown文書に変換する手順
1. **`PdfDocument`** クラスのオブジェクトを作成します。
1. **`LoadFromFile()`** メソッドでPDF文書を読み込みます；
1. **`SaveToFile(string filename, FileFormat.Markdown)`** メソッドを通して、読み込まれたPDF文書をマークダウン文書に変換します。


## PDFをMarkdownに変換するC#コード
```csharp
using Spire.Pdf;

namespace PDFToMarkdown
{
    class Program
    {
        static void Main(string[] args)
        {
            // PDF文書を読み込む
            PdfDocument pdf = new PdfDocument();
            pdf.LoadFromFile("蝶.pdf");

            // PDFドキュメントをMarkdownドキュメントに変換する
            pdf.SaveToFile("PDFtoMarkdown.md", FileFormat.Markdown);
            pdf.Close();
        }
    }
}
```

**結果**
![PDFtoMD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/78fb7e9b-1f58-562a-30cc-ff96f0de57ab.png)

* * *
-- Spire.PDF for .NETライブラリは、.NETアプリケーションにおける様々なPDF文書処理機能をサポートしています。他の例も参照できる：

https://www.e-iceblue.com/Tutorials/Spire.PDF/Spire.PDF-Program-Guide/Spire.PDF-Program-Guide-Content.html

-- 評価版の警告については、クリックしてトライアル・ライセンスをリクエストし、警告を削除してください：

https://www.e-iceblue.com/Download/download-pdf-for-net-now.html
(QA) 5250端末がディスコネクトされて、再接続した際に出るメッセージ画面を出ないようにしたい

## QA. 5250端末をRPAやWeb化ツールで裏側で使用しています。ディスコネクトから復帰した際出てくる下記の画面を出ないようにしたいです。

### 出てくる画面はこちら
IBM i OSのデフォルト設定ですと、ディスコネクトされた5250画面を再接続すると（再度サイン・オンすると）、「対話式ジョブの回復の試み」という画面が表示されます。

![thumbnail_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/39889165-e490-5078-53b7-740bc07056d3.png)

この画面を表示したくない、ということですね。

## 設定変更

**下記二つのシステム値を変更します**

* **QINACTITV 5 (分)**
* **QINACTMSGQ \*DSCJOB**

にすると、
サイン・オンして任意の画面で放置して５分後にディスコネクトされてサインオン画面に戻ります。
その後同じユーザーIDでサインオンすると、「対話式ジョブの回復の試み」画面は表示されずに、下記のQSYSOPRメッセージ画面がでて、エンターキー押すとディスコネクト前の元の画面に戻りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/1fc74f05-3b08-09cd-68bf-82605bd1ada0.png)
EC-CUBEでデータベースの値をページに呼び出す

# 前提
データベースのテーブル
`dtb_hoge`

Entityファイル
`app/Plugin/Hoge/Entity/Hoge.php`

# Repository作成
```:app/Plugin/Hoge/Repository/HogeRepository.php
<?php

namespace Plugin\Hoge\Repository;

use Eccube\Entity\Hoge; #Hogeテーブルと接続
use Symfony\Bridge\Doctrine\RegistryInterface; #Entityを利用する
use Eccube\Repository\AbstractRepository; #Repositoryを拡張
/**
 * HogeRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class HogeRepository extends AbstractRepository
{
    /**
     * HogeRepository constructor.
     *
     * @param RegistryInterface $registry
     */
    public function __construct(RegistryInterface $registry)
    {
        parent::__construct($registry, Hoge::class); #Entity/Hoge呼出
    }
    /**
     * 全検索
     *
     * @return Hoges|array
     */
    public function customFindAll() #関数名(任意)
    {
        $qb = $this->createQueryBuilder('h'); #任意だがhogeの頭文字
        $hoges = $qb
            ->getQuery() #作成したクエリを取得
            ->getResult(); #実行
        return $hoges;
    }
}
```

# Controller作成

```:app/Plugin/Hoge/Controller/HogeController.php
<?php

namespace Plugin\Hoge\Controller;

use Eccube\Controller\AbstractController;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\Routing\Annotation\Route;
use Plugin\Hoge\Repository\HogeRepository; #Repositoryを取得する為の宣言

class TestController extends AbstractController
{
    /**
     * @var HogeRepository
     */
    protected $hogeRepository;
    /**
     *
     *
     * HogeController constructor.
     *
     *  @param HogeRepository $hogetRepository
     *
     */
    public function __construct(HogeRepository $hogeRepository)
    {
      $this->hogeRepository = $hogeRepository;
    }
    /**
     *
     * @Route("/test", name="test") #URLを指定
     * @Template("test.twig") #ページ遷移先を指定
     *
     */
    public function index()
    {
        $hoges = $this->hogeRepository->customFindAll();
        return ['hoges'=>$hoges];
    }
}
```

# Twig作成

```:app/Plugin/Hoge/Resource/test.twig
{% for hoges in hoges %}
<p>{{ hoge }}</p>
{% endfor %}
```

# 参考記事
https://enginiya.com/entry/2021/11/07/004543
アルゴリズムの計算量：Time ComplexityとSpace Complexityの基礎

## はじめに
アルゴリズムの効率を評価する際、主に2つの観点があります：
- Time Complexity（時間計算量）：実行時間の効率
- Space Complexity（空間計算量）：メモリ使用量の効率

## Time Complexity（時間計算量）
時間計算量は、入力サイズに対してアルゴリズムが必要とする処理時間の増加率を表します。実務では、O(n) 以下の時間計算量を持つアルゴリズムが望ましいとされています。

### 主なTime Complexityの種類
- O(1)：定数時間
  - 入力サイズに関係なく、常に同じ時間で処理が完了
  - 例：配列の先頭要素へのアクセス
```python
def get_first_element(arr):
    if arr:
        return arr[0]  # O(1)
    return None
```

- O(log n)：対数時間
  - 入力サイズが2倍になると、処理時間が1段階増加
  - 例：二分探索
```python
def binary_search(arr, target):
    left, right = 0, len(arr) - 1
    while left <= right:  # O(log n)
        mid = (left + right) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1
```

- O(n)：線形時間
  - 入力サイズに比例して処理時間が増加
  - 例：配列の線形探索
```python
def linear_search(arr, target):
    for i in range(len(arr)):  # O(n)
        if arr[i] == target:
            return i
    return -1
```

- O(n log n)
  - 比較的効率的な並び替えアルゴリズムの計算量
  - 例：クイックソート
```python
def quicksort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quicksort(left) + middle + quicksort(right)  # O(n log n)
```

- O(n²)：二次時間
  - 入力サイズの2乗に比例して処理時間が増加
  - 例：バブルソート
```python
def bubble_sort(arr):
    n = len(arr)
    for i in range(n):  # O(n²)
        for j in range(0, n - i - 1):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
    return arr
```

## Space Complexity（空間計算量）
空間計算量は、アルゴリズムの実行に必要なメモリ量の増加率を表します。メモリ効率を重視する場合、O(1)の空間計算量（定数空間）を目指すことが理想的です。

### 主な特徴
1. 入力データのサイズ
   - 入力データ自体が必要とするメモリ

2. 補助スペース
   - アルゴリズムが追加で必要とするメモリ
   - 一時変数、再帰呼び出しのスタックなど

### 一般的なSpace Complexityの例
- O(1)：定数空間
  - 入力サイズに関係なく、固定量のメモリのみ使用
  - 例：インプレースでの配列要素の交換
```python
def swap_first_last(arr):
    if len(arr) <= 1:
        return
    arr[0], arr[-1] = arr[-1], arr[0]  # O(1) space
```

- O(n)：線形空間
  - 入力サイズに比例してメモリ使用量が増加
  - 例：配列のコピー作成
```python
def double_array(arr):
    result = []  # O(n) space
    for num in arr:
        result.append(num * 2)
    return result
```

## 実践的な指針
1. Time Complexityについて
   - O(n) 以下を目指すべき
   - O(n log n) までは許容範囲
   - O(n²) 以上は可能な限り避ける
   - 小さな入力サイズでは、定数倍の違いが重要になることもある

2. Space Complexityについて
   - O(1) が理想的
   - メモリに余裕がある場合は、時間計算量との兼ね合いで O(n) も許容
   - 再帰アルゴリズムではスタック領域の使用に注意

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21204/6cba3102-752a-9ccf-29ef-f74a951f8463.png)

このグラフから分かるように、O(1)、O(log n)、O(n) は効率的な計算量で、入力サイズが大きくなっても比較的緩やかな増加を示します。一方、O(n²) は入力サイズの増加に対して急激に処理時間/空間が増加するため、大きな入力サイズに対しては非効率となります。  

## まとめ
- Time Complexityは処理時間の効率を評価
- Space Complexityはメモリ使用量の効率を評価
- 実用的なコードでは Time Complexity O(n) 以下、Space Complexity O(1) を目指す
- アルゴリズムの選択時は、両方の計算量を考慮することが重要
- 実際の応用では、しばしばTime ComplexityとSpace Complexityのトレードオフを検討する必要がある
投稿 138 rails generateコマンド 2024/11/15

本日の勉強時間　0H

Railsでプロジェクトを効率的に構築するためのコード生成ツール。

このコマンドを使うと、コントローラやモデル、マイグレーションファイル、ビュー、ルートなど、よく使われるファイルやコードを自動的に作成できる。
SAP Developer拡張を実プロジェクトで利用する際の新旧オブジェクトの調査方法

# はじめに
<!-- 
S/4HANA public edition 2208版およびprivate/on-premise 2022版から、新しい開発方式「Developer拡張」が利用可能になりました。この方式は、SAPの「クリーンコア戦略」を維持しつつ、S/4上で直接アドオン開発を可能にするものです。特にグリーンフィールド導入時のアドオン開発に有力な選択肢となるでしょう。

しかし、-->「Developer拡張」は従来のABAP開発とは大きく異なり、採用には高いハードルがあります。例えば、従来の標準テーブルやBAPI、汎用モジュールが使えず、新たに公開されたAPIを利用する必要があります。

本記事では、従来のSAP標準テーブルやBAPI、汎用モジュールから対応する公開APIを探す方法に焦点を当て、「Developer拡張」を使った開発のハードルを下げることを目指します。

# 前提環境
S/4HANA2022以降のオンプレミスもしくはPCE環境にアクセスできることを前提にしています。(社内にある検証環境などを想定)

# 新旧オブジェクトの調査方法
結論から書くと、テーブル「ARS_W_API_SCCSSR」に新旧オブジェクトの対応が格納されているため、このテーブルの項目「Subobject Name」に対して、従来のアドオン開発で利用してきた標準テーブル、BAPI、汎用モジュールなどを指定して検索することにより、それに対応する新オブジェクトがわかるようになります。
以下にいくつか例を示します。

+ SAP標準テーブルVBAK(販売伝票ヘッダ)に対応する公開APIは何か？
    DDLSのI_SALESDOCUMENTと検索できましたので、VBAKに対応するCDSViewがI_SALESDOCUMENTであることがわかります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941011/843d6d24-dd62-35d3-be5f-be445fc6fc66.png)
    <br>
+ 受注登録のBAPI「BAPI_SALESORDER_CREATEFROMDAT2」に対応する公開APIは何か？
    BDEFのI_SALESORDERTPと検索できましたので、BAPI_SALESORDER_CREATEFROMDAT2に対応するbusiness objectがI_SALESORDERTPであることがわかります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941011/225cd0ba-1f6b-acc1-578c-338fa6339ac3.png)  
    <br>
+ 番号範囲の取得汎用モジュール「NUMBER_GET_NEXT」に対応する公開APIは何か？
    CLASのCL_NUMBERRANGE_RUNTIMEと検索できましたので、NUMBER_GET_NEXTに対応するクラスがCL_NUMBERRANGE_RUNTIMEであることがわかります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941011/d5a99dfc-5021-deca-c05d-01f76075fcd0.png)

# テーブル「ARS_W_API_SCCSSR」の発見の経緯と注意事項
## 発見の経緯
ADT上でのABAPコーディング時において、旧オブジェクトを使用した際のエラーメッセージには代替オブジェクトの提案が記載されています。
これがどのようなやり方で実装されているかをデバッグなどをして調査した結果、「ARS_W_API_SCCSSR」を発見しました。

## 注意事項
上記のとおり、本記事の内容は SAP社が公開している情報ではありません。
将来的にこのテーブルが維持発展していくかどうかなどは不明です。
新旧オブジェクトの保証をしているのかどうかについても不明です。
これらの点に留意した上での利用をお願いします。

# 終わりに
筆者個人は実務として長年ABAP開発に関わってきましたが、Developer拡張はまさしく令和のABAPと呼ぶにふさわしい進化を遂げた開発手法であると同時に、これまでABAP開発をされてきた方にとっては、とっつきにくい部分が多々あると思います。
そういった中でも、このような記事を書くことにより、Developer拡張をする際の「現場の知恵」のような実務としてのお役立ち情報を提供することで、皆様のプロジェクトでDeveloper拡張が広まっていく一助となればと思います。
「webサイトにアニメーションは不要」を、ユーザーに合わせて叶える

2024年10月29日、HIKKYは公式Webサイトをリニューアルいたしました！🎉

https://twitter.com/HIKKY_Official/status/1851103366920999066

遊び心満載のWebサイトをぜひご覧ください🥳
https://hikky.co.jp/

いかがでしたか！？🤩
楽しそう！ワクワクする！そうでしょうそうでしょう！💋
しかし、こういったご意見も生まれうるとおもいます。
![a.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940983/e77c61f5-2a9d-9a07-d181-a8e0d978c1f4.gif)
# アニメーションうるさくね？
「アニメーションは人を選ぶよね〜」で終わらせない！💪
ユーザーによって、日頃より「アニメーションは軽めで見たい or 見たくない」といった動機から、**視差効果を減らす**といった設定を行っている場合があります🛠️

## MacOSの場合
![グループ 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940983/b0cb1852-9467-2e81-1a6b-2beaafebb4bf.png)

## iOSの場合
![グループ 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940983/652a2209-41ae-bf28-efa1-8d8b58b1453e.png)

## windowsの場合
![グループ 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940983/126e9c28-8134-a0a9-f6d5-966d42c20fd2.png)


その設定を行なっているユーザーにまでわざわざアニメーションをお楽しみいただく事はありません🙅‍♀️

## 「視差効果を減らす」の検出方法
### CSSの場合
```css
@media not (prefers-reduced-motion: reduce) {
/* この条件の中に書かれたスタイルは、
 *「視差効果」を減らすが有効になっていない場合のみ適用されます。
 */
 .hoge{
   animation: fuga 10s infinite;
 }
}
```
### JavaScriptの場合
```js
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
/* この条件の中に書かれたコードは、
  「視差効果」を減らすが有効になっていない場合のみ実行されます。
 */
}
```

今回リニューアルしたWebサイトでも、この条件分岐を導入してみました！🏃‍♂️
「視差効果を減らす」を有効にしてwebサイトを訪問してみると〜〜〜〜↓👀
![b.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940983/c026d048-1a03-3b15-ed6a-91bf46696144.gif)

オープニング演出もキービジュアルの演出もなく、サッと情報を見られるようになりました😍
設定によって姿を変えられる事は、実態を持たないデータのうれしいところです💋
投稿 137 Railsルーティング 2024/11/14

本日の勉強時間　0H

ブラウザとコントローラーをつなぐ役目　送られてきたURLに対し、「どのコントローラーのどのアクション」で処理するかを決める対応表のこと

（アクションとはコントローラー内のメソッドのこと）

ページが表示されるには　ルーティング→コントローラー→ビュー　の流れ
【備忘用】AWSアカウント内で発行したIAMユーザがMFAを有効化しているか確認するシェル

# 目次
[1.はじめに](#1-はじめに)
[2.前提条件](#2-前提条件)
[3.シェル](#3-シェル)
[4.まとめ](#4-まとめ)

# 1. はじめに
どうも皆さん こんにちは こんばんは おはようございます。
セキュリティ強化したいけどまずはその第一歩から...ということでうちで管理しているIAMユーザってみんなちゃんとMFA登録して有効化してるのかな？と確認したいそこのあなた！！！

これからポリシーでMFA強制させたいけど既存のIAMユーザがどれだけMFAを有効化しているかわからない....そこの彼も！！！

これさえ使えば簡単に調べることができます！

もし今回書く内容でこんなことしなくてもすぐわかる方法が他にあれば僕が知りたいので、私知っているよ！！！って方がいたらぜひ教えてください。
教えていただけたらしっぽブンブンです。よろしくお願いします！！！！
それじゃあ本題に入りますね

# 2. 前提条件
今回はCloudshellで実行するので特に前提条件はありません。
CLIを打てるサーバからやりたい場合は権限等の確認を忘れずに...

# 3. シェル
```shell:shell
#!/bin/bash

# IAMユーザーの一覧を取得
users=$(aws iam list-users --query "Users[*].UserName" --output text)

echo "ユーザー名 | MFA有効"
echo "--------------------"

# 各ユーザーのMFA設定を確認
for user in $users; do
    mfa=$(aws iam list-mfa-devices --user-name $user --query "MFADevices" --output text)
    if [ -z "$mfa" ]; then
        echo "$user | 無効"
    else
        echo "$user | 有効"
    fi
done
```

上記を保存してアップロード後に実行権限を付けて作動させてください。

```例:コマンド
chmod +x check-mfa.sh
```

結果をファイルに保存したい場合は、スクリプトの最後でリダイレクトを使用して出力をファイルに書き込みます。
以下が例です。

```例:コマンド
./check-mfa.sh > mfa-status.txt
```

# 4. まとめ
シェルの中身の詳しい解説は行っていませんが、ユーザの名前の横のステータス部分が無効か有効かで判別できます。
IAMユーザの一覧を取得してからその一覧に対して処理を行うので、全部網羅できると思います。
特定のユーザのみ確認したいor複数の特定のユーザのみ確認したい場合については別記事で紹介しようと思います。

それではhave a nice day
【Unity】Unity6でUnityちゃんがピンクになってしまったときの対処法

:::note warn
AssetStoreのUnity-Chan! Model (1.2.2)だとこうなってしまいますが、公式サイトからダウンロードしたユニティちゃんモデル（1.4.0）を使用すると普通に表示されるようになります。

コメント参照
:::



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741258/8b68d220-4497-1fae-367c-4669afbbac9d.png)

これを解消する

# 環境
Unity6
3D(Built-In Render Pipeline)

# 1.ToonShaderのインストール
https://docs.unity3d.com/ja/Packages/com.unity.toonshader@0.8/manual/installation.html

# 2.ShaderをToonにする
マテリアルを選択しInspectorのShaderからToonを選択してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741258/a87423d1-45e2-816b-1282-04d5060ebbb8.png)
### すべて変更したもの↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741258/024176e1-daa6-dab6-3e22-62173b97b2d9.png)

# 3.パラメーターをいじる
マテリアルを選択しInspectorのBase Shading Featherを1、Receive ShadowsをOffにする
![234234324234.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741258/e60e50e3-2e35-35c6-2f51-bbc4742f5042.png)
設定し終わった↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741258/32c192c8-1e86-1562-f7ba-39e083d2b64f.png)

### 少し白いのはライトのせいなのでいい感じに設定すると
RotationYを180にした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741258/66a8f49c-3679-22df-5974-b5eb2aa84028.png)
Node.jsの実行速度が2.3倍になるという"module.enableCompileCache()"について調べてみた

Node.js 22に`module.enableCompileCache()`というAPIが導入されたらしく、これを利用したTypeScriptコンパイラーでは2.3倍、ESLintでは1.3倍の速度改善がなされたと聞いて気になって調べてみました。

## module.enableCompileCache()とは？

Node.jsのモジュール（JavaScriptファイル）をコンパイルした結果をディスク上にキャッシュし、2回目以降の実行を高速化する機能です。

```javascript
import { enableCompileCache } from 'node:module';

// キャッシュを有効化
enableCompileCache();

// この後に読み込まれるモジュールは全てキャッシュの対象に
import './other.js';
```

https://nodejs.org/api/module.html#moduleenablecompilecachecachedir

## 仕組み：V8のコード・キャッシング

Node.jsがJavaScriptファイルを実行する際の流れは通常、

```
ソースコード → パース → バイトコードにコンパイル → 実行
```

のようになるのですが、キャッシュを使った場合、

```
1回目:
ソースコード → パース → バイトコードにコンパイル → 実行

2回目以降:
バイトコードのキャッシュを読み込む → 実行
```

となり、パースとコンパイルの処理を省略できるため高速化されるわけです。

これを裏で支えているのがV8のコード・キャッシングです:

https://v8.dev/blog/code-caching-for-devs

## 実際の効果

Node.jsのプルリクエストには実際の効果について報告されていました。

https://github.com/nodejs/node/pull/54501

TypeScriptコンパイラーに導入したときの効果:

- キャッシュなし: Time: 120.5 ms ±   1.7 ms
- キャッシュあり: Time:  51.8 ms ±   1.0 ms

→ 2.33倍の高速化


ESLintに導入したときの効果:

- キャッシュなし: Time: 129.9 ms ±   7.8 ms
- キャッシュあり: Time: 105.5 ms ±   1.8 ms

→ 1.23倍の高速化


## 具体的な使い方


```javascript
// エントリーポイント（例：bin/cli.js）で1回だけ呼び出し
import { enableCompileCache } from 'node:module';

// 環境変数でキャッシュが無効化されていない場合のみ有効化
if (process.env.NODE_DISABLE_COMPILE_CACHE !== '1') {
  enableCompileCache();
}

// 以降の全てのモジュールがキャッシュ対象に
import { main } from '../src/index.js';
main();
```

## キャッシュの場所

デフォルトでは`os.tmpdir()/node-compile-cache`に保存されます。変更したい場合は：

1. 環境変数で指定：

```bash
export NODE_COMPILE_CACHE=/path/to/cache
```

2. API呼び出し時に指定：

```javascript
enableCompileCache('/path/to/cache');
```

## キャッシュの無効化

```bash
export NODE_DISABLE_COMPILE_CACHE=1
```

## 効果が高いケース・低いケース

### 効果が高い：

- CLIツール（TypeScript, ESLint等）
  - 毎回`node`コマンドで起動するため、2回目以降が高速化
- 同じコードを何度も実行する場合
- 大きなライブラリを使用する場合

### 効果が低い：

- Webサーバーのように常駐するプロセス
  - 1回起動したら動き続けるため、キャッシュの恩恵が少ない
- コードが頻繁に変更される場合
- 実行時に動的に生成されるコード

## 注意点

1. Node.jsのバージョン間でキャッシュは共有されません
2. テストカバレッジを取る際は、精度が低下する可能性があるため無効化を推奨
3. ワーカースレッドで使用する場合は、各ワーカーで個別に有効化するか環境変数を設定する必要があります

## Dockerでの利用

バイトコードキャッシュをコンテナビルド時に作っておけば、Webサーバーにも応用できるかもしれません。

単純なDockerでの再利用は以下の理由で難しいですが：

- キャッシュはNode.jsのバージョンに紐付く
- デフォルトでは一時ディレクトリに保存
- キャッシュ内のパスが絶対パス

以下のような工夫で、もしかしたら事前にキャッシュを用意できるかもしれません:

```dockerfile
# キャッシュを事前生成するステージ
FROM node:22 AS builder
COPY . .
RUN NODE_COMPILE_CACHE=/app/cache node your-script.js

# 実行用ステージ
FROM node:22
COPY --from=builder /app/cache /app/cache
ENV NODE_COMPILE_CACHE=/app/cache
```

ここは全くの未検証ですが、もしこれが可能なら、Kubernetesのようにコンテナーを自動スケールアウトするような環境や、たまにしかアクセスのないアプリをscale-to-zeroしつつ、瞬時に起動するといったことに繋がりそうで夢があります。

## まとめ

`module.enableCompileCache()`は、特にCLIツールなど、Node.jsを頻繁に起動するアプリケーションで大きな効果を発揮します。エントリーポイントで1行追加するだけで有効になる手軽さと、最大2.3倍という高速化効果は、検討する価値が十分にあると言えるでしょう。
【仲間募集】一緒にゲーム制作をしてくれる方を探しています！

【仲間募集】一緒にゲーム制作をしてくれる方を探しています！
こんにちは！
現在、ゲーム制作に挑戦したいと考えているゲーム開発初心者です。

「どのようなゲームを作るか」も含めて、一緒にアイデアを出し合い、楽しみながらゲームを作成していける仲間を募集しています！

やりたいこと
目標
ゲーム制作の一連の流れを学ぶ
完成したゲームを公開する（小規模でもOK）
チームでの開発を体験する
制作予定のゲームについて
以下のようなシンプルなゲームを考えていますが、詳細は一緒に決めたいと思っています！

ジャンル：アクションゲーム、ホラーゲーム、シミュレーションゲームなど（相談可能）
プラットフォーム：PCゲーム（可能であればモバイルゲームも挑戦）
使用ツール：Unreal Engine（Unityや他のツールの提案も歓迎）
初心者なので、無理のないスコープで進めていけたらと思っています。

募集内容
こんな方に来てほしい！
初心者～中級者大歓迎！
ゲーム制作に興味がある方
学びながら一緒に作業したい方
チームで協力することが好きな方
必要なスキル（未経験でもOK）
プログラミング（C++ やブループリント）
3Dモデリングやデザイン
サウンドや音楽制作
その他、ゲーム開発に必要なことを一緒に学びたい方
現在の状況
ゲーム制作に使用するツールとして Unreal Engine をインストール済みです。
学びながら進めるつもりなので、スキルがなくても問題ありません！
UE勉強日記2024/11/21

Unreal最新の5.5からFabｎお資材はドラッグアンドドロップで導入できるようになった。
すごく使いやすい
![スクリーンショット 2024-11-21 135039.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574567/2aaa9137-8d8d-c735-c3be-a5e262818710.png)
CSRF token is invalid

# 起きたこと
EC-CUBEプラグイン作成中に
`"CSRF token is invalid"`
とのエラーが出て、解消するまで格闘した

# 基本環境
MacOS Build In Server
php 8.1.29
ECCUBE4.2.3

# Form作成中
`"CSRF token is invalid"`
エラーが起きた

以下、ネットで拾った情報で試す

```:.twig
{{ form_row(form._token) }}
```
解消せず
```:Type.php
/**
 * {@inheritdoc}
 */
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setRequired('product');
    $resolver->setDefaults([
        'csrf_protection' => false, // この行を追加
        'id_add_product_id' => true,
        'constraints' => [
            // FIXME new Assert\Callback(array($this, 'validate')),
        ],
    ]);
}
```
解消せず
# 原因はCache
https://kintoneapp.zendesk.com/hc/ja/articles/900000968886--CSRF%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AB%E5%95%8F%E9%A1%8C%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99-%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%92%E5%86%8D%E8%AA%AD%E8%BE%BC%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84-%E3%81%A8%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E5%87%BA%E3%81%BE%E3%81%99

`フォーム作成時に標題のエラーが出る場合、キャッシュが溜まってしまっている可能性がございます。`

kintoneのヘルプページ情報なんだけど？

`root/var/cache/prod`

を削除すると解消！