OmniAICreator/Qiita-1.07M huggingface dataset:
プロンプトエンジニアをめざすな～プロンプトエンジニアリングは死んだ～

タイトルは私の主張ではないです。
“Don’t Start a Career as an AI Prompt Engineer"「プロンプトエンジニアをめざすな」からの引用です。
https://spectrum.ieee.org/prompt-engineering-is-dead

"AI Prompt Engineering Is Dead"というなかなかなタイトルの記事です。

※2025年版もあります

https://qiita.com/hokutoh/items/c34861437e6872f75a4e

---

## 3行で
- プロンプトエンジニアリング(LLMに最適な指示（プロンプト）を与え、望む出力を得るためのテクニック)はchatGPT登場あたりにめっちゃもてはやされたよね。
- 多くの人が「上手にプロンプトを書く方法」を試行錯誤しているが、生成AIの進歩により、このスキルが必須ではなくなる可能性が高いよ
- 最適化されたプロンプトを見てみると、もはや人間語じゃないよ

## 「Prompt Engineering Is Dead」のいわんとするところ
- **モデルの高度化**: LLM自体がますます進化し、精度・汎用性が向上。多少曖昧なプロンプトでも適切に理解・応答できるようになってきており、複雑なプロンプト設計が不要になる。
- **UI/ツールの整備**: 開発者や企業がユーザーフレンドリーなUIやツールを提供し始めており、最適なプロンプトを自動補完・自動生成するなど、専門的なノウハウが不要になる仕組みが作られつつある。
- **エコシステムの変化**: LLMのAPI化や、特定用途に特化したカスタムモデルの普及により、「細かいプロンプトチューニング」よりも「適切なAPIやツールを選ぶ」ことが重視されるようになる。

## Prompt Engineering が衰退していく理由
1. **学習パラダイムの変化**  
   - これまでのLLMはプロンプトに大きく依存していたが、モデルそのものが賢くなることで、細かいヒントなしでも良い回答を返すようになる。  
2. **ユーザーフレンドリーな機能の充実**  
   - 自動提案・補完、テンプレートライブラリなど、アプリケーションレイヤーでのサポートが増え、専門的なプロンプトの知識を必要としなくなる。  
3. **応用範囲の広がり**  
   - 汎用性のある大規模言語モデルだけでなく、業務やドメインに特化したモデルが増え、専門知識や構造化データとの連携が重視されるように。プロンプトの工夫よりもシステム設計のほうが重要になる。

記事内では、「アルゴリズムが導き出した最適なプロンプトは非常に奇妙で、人間には到底思いつかないものだった」と紹介されています。
これは、人間が頑張ってプロンプトを設計するより、AIの気持ちはAIが一番よくわかるよね的ことであると(超訳)
その結果、「人が時間をかけて“巧妙なプロンプト”を考える必要性」が薄れ、プロンプトエンジニアリングというスキルの相対的価値が低下してしまうという見解です。

## 今後求められるスキルや視点
- **LLMを活用したアプリケーション設計**: 単にプロンプトを作るだけでなく、エンドユーザーが自然にAIを使えるサービスをどう設計するかが焦点に。
- **データ戦略・モデル選定**: どのモデルを使うべきか、どんなデータを投入すべきか、といった意思決定が重要に。
- **結果の評価・品質管理**: AIが生成する回答をどのように評価し、誤回答や偏見を防ぐかといったガバナンス面の技術・ノウハウが鍵。

## まとめ(by ChatGPT)
「Prompt Engineering Is Dead」というフレーズはやや刺激的ですが、実際には「（これまで注目されてきた）複雑なプロンプト設計のテクニックが今後は相対的に価値を失う」という論点です。大規模言語モデルは進化を続け、よりシンプルなプロンプトでも高品質な応答を返せるようになってきています。さらに周辺ツールやUIが整備されることで、プロンプト自体を細かくいじるよりも、**アプリケーション設計・データ戦略・システム全体の品質管理**といった領域の重要度が高まっていると言えます。

## 個人的見解
プロンプトエンジニアリングをどこまでの範囲をそう呼ぶかという話もありますが、
この記事で言っている「プロンプトエンジニアリング」は「同じ情報を術や技を使ってAIに上手く伝えて回答の精度をあげる方法」を指していると思います。
記事の通り「生成AIへの入力のわかりやすさ」をあげるための「術」や「式」みたいなものはAI側で補完されることによりどんどん不要になっていくと思います。

つまり情報量として「命令・文脈・入力・出力形式」(see:[プロンプトの要素](https://www.promptingguide.ai/jp/introduction/elements))がそろっていれば、口語の文章でダラダラ書こうが、マークダウンできれいに書こうが、なんとか式の形で書こうが回答の精度は近似していくと考えます。


しかしながら生成AIと対話するための「アプローチの仕方」は指示者側の意図を100%伝えるという意味で今後も必要かと思います。
例えば以下記事のような「生成AIとの会話のアプローチ」です。

https://qiita.com/hokutoh/items/4a5447833721fe8390d9

本"AI Prompt Engineering Is Dead"の記事内でもプロンプトエンジニアリングという言葉は「何らかの形で残るだろう」としています。
Godotにドット絵をインポートするとぼやける時の対処法

備忘録です。

【環境】
Windows
Godot4(日本語化対応)

## 対処法
![スクリーンショット 2025-01-25 224544.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3995018/bcb75009-f7ec-eade-5b65-148bdf67cb77.png)

1.上部メニューから[プロジェクト]>[プロジェクト設定]
2.[一般]>[レンダリング]>[テクスチャ]
3.[デフォルトのテクスチャフィルタ]を[Nearest]に変更
最後に閉じる。

Godot4ではインポートタブの設定は何もいじらなくて大丈夫っぽい
krb5-configのapt installで設定画面が表示されなかった場合の再表示方法

Ubuntu 24.10でsamba clientをWindows Domain (Active Directory) に参加させる際にkrb5-configのapt installでKerberos設定画面が表示されるはずなのですが、表示されなかったので手動で再表示させました。

sudo dpkg-reconfigure krb5-config
このコマンドを実行すると、Kerberos の設定画面が再度表示されます。以下の内容を入力してください：

Default Kerberos version 5 realm:

ドメイン名を大文字で入力 (例: EXAMPLE.COM)
Kerberos servers for your realm:

ドメインコントローラーのFQDNを入力 (例: dc.example.com)
Administrative server for your Kerberos realm:

管理サーバーのFQDNを入力 (通常はドメインコントローラーと同じ)
設定を保存して終了します。

/etc/krb5.conf を手動で書き換えてもOK。
```
[libdefaults]
    default_realms = EXAMPLE.COM
[realms]
        EXAMPLE.COM = {
                kdc = dc.example.com
                admin_server = dc.example.com
        }
```

設定を確認するには kinit で認証を試せばよい。何も表示されなければ成功。
```
$ kinit Administrator
Password for Administrator@EXAMPLE.COM:
$
```
「いまさら聞けないSCSSとSASSの違い」初心者向け完全ガイド ✨

# いまさら聞けないSCSSとSASSの違い 🧐✨

こんにちは！今回は、CSSを効率的に書くための拡張言語「Sass」の中でも、「SCSS」と「SASS」の違いについて解説します。「どっちを使えばいいの？」「何が違うの？」と疑問に思っている方に向けて、図や絵文字を交えながら分かりやすく説明していきます！📚

---

## **Sassとは？🖌️**

**Sass**（Syntactically Awesome Stylesheets）は、CSSをより効率的に記述できるようにするためのスタイルシート言語です。  
そして、Sassには2つの記法があります：

- **SCSS記法（.scss）**
- **SASS記法（.sass）**

つまり、「SCSS」と「SASS」はどちらもSassの一部であり、記述方法が異なるだけです。

公式ドキュメントはこちら👇  
[Sass公式サイト](https://sass-lang.com/documentation/)  

---

## **SCSSとSASSの違いを徹底比較！🔍**

以下の表で、SCSSとSASSの主な違いを確認してみましょう。

| **特徴**     | **SCSS**（.scss）                         | **SASS**（.sass）                         |
|--------------|------------------------------------------|------------------------------------------|
| **構文**     | CSSに似た構文。セミコロン `;` や波括弧 `{}` を使用。 | インデントベースで簡潔な記述。セミコロンや波括弧は不要。 |
| **可読性**   | CSSとほぼ同じなので初心者にもわかりやすい。 | 簡潔だがインデントミスに注意が必要。       |
| **拡張子**   | `.scss`                                  | `.sass`                                  |
| **互換性**   | CSSと完全互換。既存のCSSをそのまま利用可能。   | CSSとは異なる構文なので移行には書き換えが必要。 |
| **普及度**   | 現在はこちらが主流。                    | 限定的な利用。                          |

---

### **実際のコード例で比較 🖋️**

#### **SCSS記法（CSSライク構文）**
CSSとほぼ同じ構文で記述します。

```scss
$primary-color: #3498db;

button {
  padding: 10px 20px;
  background-color: $primary-color;

  &:hover {
    background-color: lighten($primary-color, 10%);
  }
}
```

#### **SASS記法（インデントベース構文）**
インデントベースで簡潔に記述します。

```sass
$primary-color: #3498db

button
  padding: 10px 20px
  background-color: $primary-color

  &:hover
    background-color: lighten($primary-color, 10%)
```

---

## **SCSSとSASS**

**どちらを選ぶべき？🤔**

### **SCSSがおすすめな場合**
- CSSに慣れている初心者。
- チーム開発や既存プロジェクトとの互換性を重視する場合。
- 学習コストを抑えたい場合。

### **SASSがおすすめな場合**
- コードを極力簡潔に書きたい場合。
- インデントベースの記法（Pythonなど）が好きな場合。

---

## **まとめ 📝**

- SCSSとSASSはどちらもSassの一部であり、機能的な違いはありません。
- SCSSはCSSに似た構文で初心者にも扱いやすく、現在では主流となっています。
- SASSはインデントベースで簡潔なコードを書けますが、慣れが必要です。

これから学び始めるなら、まずは**SCSS**から始めることをおすすめします！😊  
質問やフィードバックがあれば、お気軽にコメントしてくださいね！ 🎉
Tips: Chromiumの`--use-file-for-fake-audio-capture`オプションは指定するファイルがwavじゃないと正しく動かない

## TL;DR
タイトルの通りです。

## この記事は何
PlaywrightでE2Eテストを書く中で、マイク入力を伴う処理のテストケースを書く場面がありました。
実装をする中ではまりポイントがあったのでTipsとしてまとめます。

## 起こったこと
PlaywrightなどでE2Eテストを書く際、ブラウザとしてChromiumを用いることで音声ファイルを用いたマイク入力の検証が可能です。（逆にChrome以外でマイク入力をモックするのは難しそうです）

実際の音声ファイルを入力として扱う方法は以下の記事などでも紹介されています。

https://qiita.com/t-oguchi/items/9c22322a57d81b9957a2

この機能を使ってマイク入力のテストを行おうとしたのですが、意図した挙動になりませんでした。
実際の挙動としては以下のような状況でした。

- テスト自体は問題なく動作する
- 音声の入力自体はされている（入力された音声のBlobのサイズを確認）
- 入力された音声データを書き出すと、無音

つまり状況としてはマイク自体は問題なく動作しているものの、音声ファイルが正しく認識されていませんでした。
パスの間違いなども疑ったのですが、パスは正しく指定されており、問題がわからない状況が続きました。

## 原因

実装は

https://qiita.com/t-oguchi/items/9c22322a57d81b9957a2#%E9%9F%B3%E5%A3%B0%E5%85%A5%E5%8A%9B

の通り、`--use-file-for-fake-audio-capture`というオプションを用いて行なっていました。

`--use-file-for-fake-audio-capture`のオプションについて調べてみたところ

https://peter.sh/experiments/chromium-command-line-switches/#use-file-for-fake-audio-capture

に以下のようにこのオプションについて説明されていました。

> Flag that stored MyFiles folder inside the user data directory. $HOME/Downloads is used as MyFiles folder for ease access to local files for debugging when running on Linux. By setting this flag, <cryptohome>/MyFiles is used even on Linux. 

[List of Chromium Command Line Switches « Peter Beverloo](https://peter.sh/experiments/chromium-command-line-switches/#use-file-for-fake-audio-capture) より引用

説明を日本語に翻訳すると以下の通りです。

> .wav ファイルをマイクとして再生します。 WebRTC 呼び出しの場合、ビットはマイクからのものであるかのように扱われることに注意してください。つまり、音声処理を無効にする必要があります (音声ファイルが歪んで再生されないようにするため)。入力ファイルは必要に応じて Chrome のオーディオ バスに合わせて変換されるため、ほとんどの正常な .wav ファイルが機能するはずです。 <path> を渡してファイルをループ再生するか、<path>%noloop を渡してファイルを最後まで再生した後に停止できます。 kDisableAudioInput または kUseFakeDeviceForMediaStream とも使用する必要があります。 

当時音声入力ファイルにはmp3ファイルを指定していました。
このmp3ファイルをwavファイルに変更したところ、意図した通りの挙動で動くようになりました。

## まとめ

`--use-file-for-fake-audio-capture`に指定するファイル形式は`wav`にしましょう。
ABC390をPythonで（A～E）

AtCoder Beginner Contest 390の解答等の速報的まとめ

https://atcoder.jp/contests/abc390



# A問題
https://atcoder.jp/contests/abc390/tasks/abc390_a

実際に入れ替えた配列を作って比較する
```python:A
a = list(map(int, input().split()))

for i in range(4):
    b = [i for i in range(1, 6)]
    b[i], b[i + 1] = b[i + 1], b[i]
    if a == b:
        exit(print("Yes"))

print("No")
```

# B問題
https://atcoder.jp/contests/abc390/tasks/abc390_b

比が同じかを順番に調べる
割ると誤差が怖いので掛け算で比較する
```python:B
n = int(input())
a = list(map(int, input().split()))

ans = "Yes"
if n >= 3:
    for i in range(1, n - 1):
        if a[i] ** 2 != a[i - 1] * a[i + 1]:
            ans = "No"

print(ans)
```

# C問題
https://atcoder.jp/contests/abc390/tasks/abc390_c

長方形になる範囲を調べて、その範囲内に白く塗られたマスがあるか調べる
```python:C
h, w = map(int, input().split())
s = [input()for _ in range(h)]

ax, ay, bx, by = 1000, 1000, 0, 0
for i in range(h):
    for j in range(w):
        if s[i][j] == "#":
            ax = min(ax, i)
            bx = max(bx, i)
            ay = min(ay, j)
            by = max(by, j)

ans = "Yes"
for i in range(ax, bx + 1):
    for j in range(ay, by + 1):
        if s[i][j] == ".":
            ans = "No"

print(ans)
```

# D問題
https://atcoder.jp/contests/abc390/tasks/abc390_d

組み合わせを全通り導出して数える
すべての袋に入れるパターンを考えると間に合わないので、無駄な場所に入れないように制限をかける
```python:D
n = int(input())
a = list(map(int, input().split()))

ans = set()

def dfs(lst, last, count):
    global ans
    if count == n:
        b = 0
        for l_i in lst:
            b ^= l_i
        ans.add(b)
    else:
        for i in range(min(last + 1, n)):
            new_lst = lst.copy()
            new_lst[i] += a[count]
            if i == last:
                dfs(new_lst, last + 1, count + 1)
            else:
                dfs(new_lst, last, count + 1)


dfs([0] * n, 0, 0)
print(len(ans))
```

# E問題
https://atcoder.jp/contests/abc390/tasks/abc390_e

各ビタミンでdpをしてカロリーごとの摂取量を求めておく
そのあと摂取量を基準に二分探索でカロリーを超えていないか確かめる
```python:E
from bisect import bisect_left

def calc(lst):
    dp = [0] * (x + 1)
    for a, c in lst:
        for i in range(x, c - 1, -1):
            dp[i] = max(dp[i], dp[i - c] + a)
    return dp

n, x = map(int, input().split())

vitamin = [list(), list(), list()]
for _ in range(n):
    v_i, a_i, c_i = map(int, input().split())
    vitamin[v_i - 1].append([a_i, c_i])

vitamin1 = calc(vitamin[0])
vitamin2 = calc(vitamin[1])
vitamin3 = calc(vitamin[2])

def calc2(target):
    v_1 = bisect_left(vitamin1, target)
    v_2 = bisect_left(vitamin2, target)
    v_3 = bisect_left(vitamin3, target)
    return v_1 + v_2 + v_3

ok, ng = 0, 10 ** 9 + 10
while abs(ok - ng) > 1:
    mid = (ok + ng) // 2
    if calc2(mid) <= x:
        ok = mid
    else:
        ng = mid

print(ok)
```
LilyGoを買ってみた（T-Display S3 pro）

#はじめに
- これまで、M5Stackで色々とあそんでみたけど、今日初めてLilyGoの[T-Display S3 pro](https://lilygo.cc/products/t-display-s3-pro-us)をアキバのパーツショップで見かけて衝動買いしてしまった。
- M5Stickよりも画面が大きいね。電源は左下のスライド式のスイッチを外側にスライドしてオンにする。最近は長押しタイプの主電源が多いけど、スライド式は分かり易くていいね。オンにしたら3秒くらいで画面がついた。
- ちなみに、画面はiphoneっぽいけど、実際に動くのは、「settings」と「counter」だけ。「photos」は、画像ファイルの入ったsdカードを入れたら動きそうな雰囲気。右下の「カメラ」アイコンも反応したけど、カメラは付いてないから何も出来ない。残りのアイコンはタッチしても「□□ cannnot used」と表示されるだけ。
- まぁ、実際にデフォで入っているアプリなんて使わないからどうでも良いけど、このデバイスで出来ることや、タッチの感度や反応速度を確認する意味では良いのかもね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/7575902a-f58d-03af-3d58-a0342ebba6f9.png)
- 裏蓋はスライドさせて簡単に開けられる。中身を見ると、あまりスペースはないね。バッテリーはもっと大型のモノに交換できそう気もする。左下のV1.1ってあるのは、[液晶の輝度調整の方法](https://github.com/Xinyuan-LilyGO/T-Display-S3-Pro?tab=readme-ov-file#news)の違いみたい。
![GridArt_20250125_152050823.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/761d5d5d-9a78-4407-bc87-13c70aa1f564.jpeg)
- 音声モジュール付きのバージョンだと、「FUET2520」と書かれたパーツが追加されていた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/364c4254-576f-a0be-bc68-bd6e62ca25e2.png)
- こいつに関する情報は[このGitHubページ](https://github.com/Xinyuan-LilyGO/T-Display-S3-Pro)が公式っぽいね。[lilyGoのHP](https://lilygo.cc/products/t-display-s3-pro-us)にリンクが貼ってあったからね。


# 次にヤる事
- M5Stackと同じような感じで作業できるのかな？深く考えずに衝動買いしたので、どうやってプログラムを書いてデバイスに書き込めるのかも分からない。
- 調べてみたら、M5stackと同様にarduinoIDEで書き込めるらしい。そういえば、いままでmacosでしかarduinoIDEを使ってなかったから、[windows版](https://www.arduino.cc/en/software?_gl=1*101dqgb*_up*MQ..*_ga*MTg0Nzg4MTIxNC4xNzM3Nzk5NzAz*_ga_NEXN8H46L5*MTczNzc5OTcwMC4xLjAuMTczNzc5OTcwMC4wLjAuNjYxODc1NTcy)をダウンロードしてインストールした。直近版は、ver2.3.4だったよ。インストールするとき、10回近く「はい」を押させられてウンザリ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/55f4f162-cdeb-4d25-40b5-ca37c93d7844.png)
- [GitHubページ](https://github.com/Xinyuan-LilyGO/T-Display-S3-Pro)の中にArduinoIDEにこのデバイスを登録する方法が解説されている...けど、「platformioを使うことをオススメするぜ！」とか言われちゃうとなぁ。今回は、arduinoIDEを使うのは止めとく？いやいやいや...今回は新たなデバイスに挑戦するだけにしておこう。同時に新たなIDEにも挑戦すると、おそらく頭がこんがらがる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/a7d54af3-92f2-f566-303a-2c850ef28a74.png)
- 指示通り、esp32はバージョン2.0.14をインストールして、デバイスとしては「ESP32S3 Dev Module」を選択している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/fe58136d-743a-09ff-ed05-89755fad922a.png)
- うむ、アホみたいに初歩的なSerial.printlnが動いているのが確認できたよ！ヘッダーは何も要らないよ。M5Stackからこっちに乗り換えてもいいかもね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/6c132ade-8557-7cd1-c9f6-c9bdaccfc7b0.png)
- 躓いたのは、Toolsの設定で、「USB CDC On Bool」を「Enabled」にするのを忘れてた点だけ。でもまぁ、[GitHubページ](https://github.com/Xinyuan-LilyGO/T-Display-S3-Pro)にも、ちゃんと説明が書いてあるから、見落とさなければ大丈夫だよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/95c84752-fca8-e0ff-7e49-c3864acec833.png)

# おわりに
- いま、国内で買えるのは、カメラなし版のみっぽいね。アリエクでもカメラありは在庫無しっぽい。カメラあり版が出たら、追加で買おうかな。
#0025（2024/01/25）AWS SAAに合格しました。

# AWS SAAに合格しました。
- 12月頭から勉強し始めて2ヶ月弱でAWS SAAに合格しました
- 点数は735点（合格ライン:720点、点数範囲:10~1000点）
- 即ち、ギリギリでした
- 解いた所感としては、王道なサービス（EC2,S3,RDS,IAMなど）の問題が9割近くだったと思います
- 問題を解きながら、問題文からサービスの構成をイメージする力は足りていないなと思っていました
- この一週間は詰め込んだ知識も多かったので、これからはAWSサービスを使った構築をしていって実際に手を動かしていきたいです
- また、新しいことを勉強していきたいです
SharePointリストのフォーム機能について

## 動画でも解説しました

<iframe width="560" height="400" src="https://www.youtube.com/embed/IhcK8-iXKUQ" 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>

## リストからフォームの作成
リスト上部のメニューにある「フォーム」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/5867dcef-9a63-7d08-46b9-0a1bb7345eaf.png)

すでにフォームが作成されている場合は、そのフォームが表示されていますが、まだ作成していない場合は、「新しいフォーム」とありますので、それを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/d7a07ce0-3aee-6bb7-4e51-f22fe7b98f88.png)

すると、リストの列名を質問(フィールド)としたフォームが作成されます。
## フォームのカスタマイズ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/b706ae37-d84a-86e6-495a-b01916dc7345.png)

右側の「カスタマイズ」タブで、
・「フィールドの表示/非表示」・・・フィールドの表示・非表示の設定
・「テーマ」・・・フォームのデザインを変更
・「設定」・・・開始日・終了日・フォーム送信時のメッセージを設定できる

フィールドを新しく追加することも出来て、追加するとリストにも新しい列が追加されます。
フィールドをテキストから選択肢に変更すると、リストでも選択肢列に変更されます。
これはフォーム機能の利点でもありますが、
リストをすでにアプリのデータソースとして使用している場合、
フォームのカスタマイズをすることで、アプリを修正する必要が生じる可能性にも留意しなければなりません。

## フォームの制限
SharePointリストのフォーム機能で作成するフォームは、Microsoft Formsとは別物です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/a07c22b2-dbf2-629e-0b9e-cedf22e6239e.png)
右側のフォームの送信で、作成したフォームのURLを取得できます。
このURLを対象者に知らせることで、ブラウザで開き回答を収集することが可能です。
ただ、 ~~リストにアクセス権限が無い・~~ Officeアカウントがない人は回答することが出来ません。

:::note warn

↑アクセス権限が無くても同じ組織内であれば回答が可能とのご指摘をいただきました。検証の上、訂正いたしました。申し訳ありません。

:::

組織外の人から回答を集めるためには、Microsoft Formsを利用するのが良いと思います。
ただ、SharePointリストに直接回答を保存することが出来ないため、PowerAutomateを使用する必要があります。
高度なSCSSスタイリングとアクセシビリティ対策のコーディング講座

# 📝 SCSSを使った高度なスタイリングとアクセシビリティ配慮のコーディングガイド

こんにちは！👋

今回は、**SCSSを用いた高度なスタイリング**と、**アクセシビリティに配慮したコーディング**について、初心者の方にもわかりやすく解説します。一歩進んだウェブ開発を目指すあなたへ、絵文字を交えながら楽しくお伝えします！🚀

---

## 🎯 目次

1. [SCSSとは？](#scssとは)
2. [ネストで見やすいコードを書く](#ネストで見やすいコードを書く)
3. [変数で一元管理](#変数で一元管理)
4. [ミックスインでコードを再利用](#ミックスインでコードを再利用)
5. [アクセシビリティとは？](#アクセシビリティとは)
6. [セマンティックなHTMLの使用](#セマンティックなhtmlの使用)
7. [ARIA属性の活用](#aria属性の活用)
8. [コントラスト比の確保](#コントラスト比の確保)
9. [まとめ](#まとめ)

---

## SCSSとは？

まず、**SCSS**について簡単にご紹介します。💡

**SCSS**（Sassy CSS）は、CSSを拡張したメタ言語で、コードの再利用や保守性の向上に役立ちます。通常のCSSと互換性があり、使いこなすことでスタイリングがもっと楽しく、効率的になります！🎉

---

## ネストで見やすいコードを書く

### 🌳 コードの構造化

SCSSでは、セレクタをネストすることで、コードをより構造的に書くことができます。

```scss
/* SCSSの例 */
.navbar {
  background-color: #333;

  .nav-item {
    color: #fff;

    &:hover {
      color: #ddd;
    }
  }
}
```

**CSSにコンパイルされると：**

```css
.navbar {
  background-color: #333;
}

.navbar .nav-item {
  color: #fff;
}

.navbar .nav-item:hover {
  color: #ddd;
}
```

👀 これにより、関連するスタイルをまとめて書けるので、コードが見やすくなります。

---

## 変数で一元管理

### 🎨 カラーパレットの作成

SCSSでは、変数を使って値を一元管理できます。たとえば、カラーコードを変数にしておけば、テーマの変更も簡単です。

```scss
/* 変数の定義 */
$primary-color: #3498db;
$secondary-color: #2ecc71;

/* 変数を使用 */
.button {
  background-color: $primary-color;
  &:hover {
    background-color: $secondary-color;
  }
}
```

✏️ これにより、カラー変更時に複数箇所のコードを修正する必要がなくなります。

---

## ミックスインでコードを再利用

### 🛠️ 繰り返しのスタイルをまとめる

ミックスインを使うと、複数のセレクタで共通するスタイルをまとめて定義できます。

```scss
/* ミックスインの定義 */
@mixin flex-center {
  display: flex;
  justify-content: center;
  align-items: center;
}

/* ミックスインの使用 */
.header {
  @include flex-center;
}

.footer {
  @include flex-center;
}
```

🔄 これで、コードの再利用ができてDRY（Don't Repeat Yourself）なコーディングが可能です。

---

## アクセシビリティとは？

### 🌐 すべてのユーザーに優しいWebを

**アクセシビリティ**とは、障害の有無や年齢、使用環境に関わらず、すべてのユーザーがウェブサイトを利用できるようにすることです。

💡 アクセシビリティに配慮することで、多くのユーザーにとって使いやすいサイトになります。

---

## セマンティックなHTMLの使用

### 🏷️ 正しいタグを使おう

セマンティックなHTMLタグを使うことで、コンテンツの構造が明確になり、支援技術（スクリーンリーダーなど）にも正しく情報が伝わります。

```html
<!-- 良い例 -->
<nav>
  <ul>
    <li><a href="#home">ホーム</a></li>
    <li><a href="#about">私たちについて</a></li>
  </ul>
</nav>

<!-- 悪い例 -->
<div>
  <span><a href="#home">ホーム</a></span>
  <span><a href="#about">私たちについて</a></span>
</div>
```

🏡 正しいタグを使うことで、検索エンジンの評価も向上します。

---

## ARIA属性の活用

### 🎙️ 追加情報を提供

**ARIA属性**を使うと、視覚的に認識できない情報を支援技術に伝えることができます。

```html
<button aria-label="メニューを開く">
  <img src="menu-icon.png" alt="">
</button>
```

🔈 画像にalt属性がない場合でも、aria-labelでボタンの機能を伝えられます。

---

## コントラスト比の確保

### 🌈 見やすい配色に

テキストと背景のコントラスト比を高くすることで、視認性が向上し、多くのユーザーがコンテンツを読みやすくなります。

```css
/* コントラストが低い（悪い例） */
.text-low-contrast {
  color: #ccc;
  background-color: #eee;
}

/* コントラストが高い（良い例） */
.text-high-contrast {
  color: #000;
  background-color: #fff;
}
```

👓 コントラスト比は、WCAG（Web Content Accessibility Guidelines）で基準が定められています。

---

## まとめ

🎉 お疲れさまでした！

今回は、**SCSSを使った高度なスタイリング**と、**アクセシビリティに配慮したコーディング**について学びました。

- **SCSSの活用**でコードを効率化
  - ネスト
  - 変数
  - ミックスイン

- **アクセシビリティの向上**
  - セマンティックなHTML
  - ARIA属性
  - コントラスト比

これらを実践することで、誰にとっても使いやすく、美しいウェブサイトを作ることができます。あなたのウェブ開発がさらにレベルアップすることを願っています！🚀

---

😊 最後まで読んでいただき、ありがとうございました！
github.comでSSH設定をする流れ(Windows11)

# 前提環境
githubアカウント作成済み
Git bashを利用

# 手順
まず、公開鍵と秘密鍵を生成する必要があります。

git bashで以下のコマンドを使用します。
```
$ ssh-keygen.exe -t ed25519 -C "github.comに登録しているメールアドレス" -f <ファイル名>
```

以下のような文字が表示されます。
```
Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```

上記はパスワードを入力してください。パスワード不要の場合はそのままEnter。
セキュリティ的にパスワードは設定した方が良いと思います。

```
Your identification has been saved in <ファイル名>
Your public key has been saved in <ファイル名>.pub
```

といった感じで現在のカレントディレクトリに以下の2ファイルができます。
1つ目が公開鍵、2つ目が秘密鍵です。

<ファイル名>.pub
<ファイル名>

github.comの自分のアカウントにアクセスします。
右上のアイコンからSettingsを選択します。

SSH and GPG Keysを選択します
SSH KeysのNew SSH keyボタンを押します。

Titleには分かりやすい名前を付けます。(My Desktop Keyとか...)

Key typeは"Authentication Key"

Keyの欄に<ファイル名>.pubの内容をそのまま貼り付けます。
間違えて改行とか入れたりしないように気を付ける。
Add SSH keyボタンを押すと公開鍵が登録されます。

秘密鍵は以下のディレクトリに置くことが多いです。
C:\\Users\\<ユーザ名>\\.ssh

C:\Users\\<ユーザ名>\\.ssh\\configをテキストエディタで開いて以下の内容を記述します。

```text:config
Host github.com
  User git
  HostName github.com
  IdentityFile <秘密鍵のファイルのパス>
  IdentitiesOnly yes
```

これによりgit bashでgithubを使えます。
第27回JAWS-UG クラウド女子会レポート

- 概要

2025/01/25に開催された[クラウド女子会](https://jawsug-cloudgirl.connpass.com/event/338908/)のおまとめ記事です。

- 反響

ここ数回の中では、人数が集まってた印象です。
また、エスコート制度を活用してくれて参加してくれてる方も居てうれしいです。

    - エスコート制度とは？
    クラウド女子会にある制度で、参加女性1名につき、1名の男性も一緒に申し込みできる
    というお得な制度です！

- Togetterまとめ

皆様気軽につぶやいてくれましたので[Togetter](https://togetter.com/li/2501665)にてまとめてみました。

- 公開資料

emiさんの[登壇資料](https://speakerdeck.com/emiki/reinvent-2024-update-reverberated-around-me)

いたくらさんの[登壇資料](https://dev.classmethod.jp/articles/202501-cloudgirl-lt-declarative-policy/)

一通り探してみましたが公開はこの2名のみのようです。
自分のも入れてほしい！
などありましたらコメントや[X](https://x.com/yuri_snowwhite)のDMやメンションにてご連絡いただけるとうれしいです！

- 終わりに

JAWS-UG クラウド女子会では、皆様にこれをクラウド女子会でやってほしい！
こういうのをやってほしい！といったテーマを随時募集しています。

Connpassにてメッセージをいただくか、一旦Connpassグループの運営メンバーへDMをいただけると助かります！
RRT*をWebで試せるビジュアライザー作った

↓これ

https://aoiacai.github.io/RRTStarWebSimulation/

![scs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3912959/8c95635c-a82f-cb49-6e09-0b16ce999f6d.png)



**授業の教材などで自由に利用していただいて構いません**
(リポジトリを共有してもらえると嬉しいです)

# RRT*ってなに？
ロボット工学などで用いられる、経路探索アルゴリズムの一種です。
グラフを構築してから経路を探すDijkstra系と違い、動的にノードが増えていきます。
最短経路は直接求まらず、漸近していきます。
その代わりとりあえず走れる経路が高速に見つかります。

(細かい説明は今度書きます それか誰か書いて！！)

Informed RRT*,BIT*など高速化テクを施した派生がいくつかあります(おもろい)

# なんで作ったの？
- 自分が最初に学ぶ時見本が少なく、ちょっと躓いたから
- Web上にRRT*を説明している日本語のサイトが少なかったから
- Robot系の強い人に覚えてもらえそうだから
- 可視化が面白そうなアルゴリズムだから

# リポジトリ

https://github.com/aoiacai/RRTStarWebSimulation
Windows 11 の PowerShell で Chocolatey をインストールした際のメモ

Windows でパッケージ管理が行える「[Chocolatey]()」のインストール時の手順メモです。

基本的に、以下の公式の手順を進めただけですが、その流れを記事にしたものです。

●Chocolatey Software | Installing Chocolatey
 https://chocolatey.org/install

途中の画面キャプチャなどを残しつつのメモです。

## PowerShell で Chocolatey をインストール

### 管理者権限で PowerShell を起動する

PowerShell で Chocolatey をインストールします。
その際、以下のような状態になる「管理者権限での PowerShell の起動」が必要です。

![2025-01-25_22-10-55.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/0729ada9-6567-6510-030b-3979055ff859.jpeg)

やり方は複数ありますが、3つのやり方をメモしておきます。

#### 1）検索結果からの起動
1つは、以下の検索を経由するものです。

自分の場合、検索キーワードで shell と入れて以下の状態にしました。
以下の「３」の部分をクリックすることで、管理者権限で PowerShell を起動できます。

![2025-01-25_21-27-55.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/45114abb-8d88-db79-c88c-786f25c6bb1c.jpeg)

#### 2）右クリックからの起動
2つ目は、右クリックメニューからの起動です。

検索のメニューやスタートメニューに PowerShell が項目として出てきている場合は、そこで右クリックメニューを開いて「管理者として実行」を選ぶことで、管理者権限で PowerShell を起動できます。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/fd007524-46bf-b257-27af-82b95069a282.jpeg">

#### 3）ショートカットキーで表示させたメニューからの起動
ショートカットキーを使うやり方もあるようです。

「Windowsキー ＋ x」を押すと以下のメニューが開くので、「ターミナル(管理者)(A)」を選ぶか「a」キーを押します。

<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/0c210d4a-9f04-836c-71ee-2e8738a690c3.png">

そうすると、ターミナルで管理者権限の PowerShell を開くことができました。

↓情報源
●Chocolateyを使った環境構築の時のメモ - Qiita
 https://qiita.com/konta220/items/95b40b4647a737cb51aa

### ポリシーの変更とインストール
次にポリシーの変更とインストールです。

#### ポリシーの変更
今回の PowerShell を開いている間だけ、Chocolatey のインストール用にポリシーを変更します。

デフォルトだと以下のように `Get-ExecutionPolicy` を実行した場合に「Restricted」と表示されるかと思います。

そこで、 `Set-ExecutionPolicy Bypass -Scope Process` を実行して、今回の PowerShell を開いている間だけポリシーを変更します。

![2025-01-25_21-31-52.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/017c4ba5-3d36-f797-e902-82db488a76d0.jpeg)

上記のように、変更の確認をされるので「Y」を入力して決定し、ポリシーを変更します。

#### Chocolatey のインストール
上記を行った後の状態で、Chocolatey のインストールのためのコマンドを実行します。

具体的には、公式ページにも書かれている以下の内容です。

```powershell
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
```

インストールが完了したら `choco -v` を実行して、バージョン番号が表示されるのを確認します。

![2025-01-25_21-33-56.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/472716c1-de77-4f1f-bb0b-4dd05e3bbb0d.jpeg)

:::note warn
【Chocolatey のインストール失敗後に、再度インストールを行おうとして失敗する場合の対処法】

上記のポリシー変更などを適切に設定してないまま、Chocolatey のインストールを実行すると、再度 Chocolatey をインストールしようとして「既にインストール済み」などという表示がでて、インストールがうまく行えない場合があります。

その状況の場合、 `C:\ProgramData\` に中が空の chocolateyフォルダができていると思います。その chocolateyフォルダを削除してやれば OK です。

↓情報源
●ROS for WindowsでChocolateyがインストールできない問題 - Qiita
https://qiita.com/TamoMrt/items/41c48f81012c3546b178
:::

## 【追記】余談
今回の記事の内容は、以下の FVM のインストールを行う準備としてやっていたもので

●FVM で Windows上での Flutter の開発構築のメモ（＋ Androidアプリの開発環境も） - Qiita
 https://qiita.com/youtoy/items/edca3e29ac3e39108579
OCI Cloud Free Tier をもぎ取れ その15

# 概要
OCI Cloud Free Tierを取得してみた。
elixirのlivebookをsystemdでセキュアに立ち上げたいをcopilotに聞いてみた。

# 質問
## elixirのlivebookをsystemdでセキュアに立ち上げたい

# 回答
`Livebook` を `systemd` で安全に実行するための手順を以下に示しますね。

### 前提条件
1. Livebookが配置されているディレクトリと同じ場所に`livebook`ユーザーを作成する。
2. 以下のコードを使って、Livebookバイナリをダウンロードしてインストール。
    ```shell
    curl -fsSL https://github.com/livebook-dev/livebook/releases/latest/download/livebook.bat -o /usr/local/bin/livebook
    chmod +x /usr/local/bin/livebook
    ```
3. `systemd`ユニットファイルの作成。

### 手順
1. **ユーザー作成**  
    ```shell
    sudo useradd -r -s /bin/false livebook
    ```

2. **`systemd`ユニットファイル作成**  
    新しいユニットファイル`/etc/systemd/system/livebook.service`を作成。
    ```shell
    sudo nano /etc/systemd/system/livebook.service
    ```
    以下の内容を入力。
    ```ini
    [Unit]
    Description=Livebook server
    After=network.target

    [Service]
    User=livebook
    ExecStart=/usr/local/bin/livebook server --bind 0.0.0.0 --port 8080
    Restart=always
    Environment="LIVEBOOK_PASSWORD=your-secure-password"
    # Restricting file system access: 
    ProtectSystem=full
    ProtectHome=true
    PrivateTmp=true
    NoNewPrivileges=true

    [Install]
    WantedBy=multi-user.target
    ```
3. **サービスの有効化と起動**
    これで`systemd`にサービスを設定します。
    ```shell
    sudo systemctl enable livebook.service
    sudo systemctl start livebook.service
    ```

4. **ステータス確認**
    ```shell
    sudo systemctl status livebook.service
    ```

**セキュア設定**
`ProtectSystem=full`や`PrivateTmp=true`などのオプションはシステムの一部を分離し、Livebookのプロセスがファイルシステムに影響を与えるのを防ぎます。

これで`Livebook`をセキュアに実行できるようになります。質問や追加のヘルプがあれば教えてくださいね！
ハッシュ(hash)法

## ハッシュ法とは
**ハッシュ(hash)法**とは、大量のデータを高速に検索・格納するための手法です。
データはハッシュテーブルという表に格納されます。流れとしては
1. キーをハッシュ関数にかけてハッシュ値を取得
1. そのハッシュ値を配列のインデックスとしてデータを格納
1. 検索時は同じキーをハッシュ関数にかけて対応するデータにアクセス

これらを順番に学籍番号を例にして説明します。ほとんどの大学では生徒のデータを学籍番号をキー(一意の番号)として管理していると思います。
下の表のような生徒のデータを管理したいと考えています。

|`学籍番号`    |氏名                  |学部|
|----------|--------------------------|----|
|52244245  |田中太郎         |経済学部|
|52322344|渡辺花子|商学部|
|53322233|鈴木一郎|工学部|

まずキーの学籍番号が52244245をハッシュ関数にかけることで、ハッシュ値を得ます。( hash(52244245)=3 )
そのハッシュ値(3)を配列のインデックスとして氏名、学部などのデータを格納します。検索時も同様に学籍番号をハッシュ関数にかけることでハッシュ値をインデックスとして配列にアクセスすることでデータを見ることができます。

ハッシュ関数の最も単純な例として恒等写像があります。(hash(k) = k)
学籍番号が52244245の場合、配列のインデックスが52244245の場所にデータを格納します。ただ、この場合さまざまな問題が発生します。

### ①メモリ効率の問題
学籍番号は通常、年度や学部、学科ごとに規則性があり、連番になっていません。キャンパスで学籍番号"1"の生徒を見たことがありますか？ないですよね。つまり、あなたの学籍番号が52244245であったとしても、52244245名の生徒は存在しないということになります。0~52244245のうち使われていない数字はかなりあるのです。ですので、学籍番号を直接配列のインデックスにすれば、配列の多くの部分が未使用になり、メモリの無駄使いになってしまいます。

### ②安全性とプライバシーの問題

学籍番号を直接インデックスにすると、データ構造が予測されやすくなり、不正アクセスのリスクが高まる可能性があります。
例えば、攻撃者が学籍番号の規則を知っている場合、無作為に試すことで他人のデータを取得できるかもしれません。

### ③データ管理の柔軟性

大学の運営方針が変わり、学籍番号の形式が変更される可能性があります。
例えば、桁数が増えたり、年度ごとにフォーマットが変わることがあります。
直接インデックス化していると、新しいフォーマットに対応するために大規模な変更が必要になります。


これらの理由から、キー値を圧縮して格納する必要があることがわかります。
それを実現するハッシュ関数の例を二つ挙げます
①キーが整数xの場合
```math
hash(x) = x\ mod\ m
```
この場合、mはハッシュテーブルのサイズとなります。
②キーが文字列の場合
```math
hash(s) =  \sum_{i=0}^n c^i ord(s[i])\ mod\ m
```
s: 文字列（例："abc"）
k: 文字列の長さ
c: 適切な係数（通常、素数が選ばれる）
ord(): 文字のASCIIコードを取得する関数
m: ハッシュテーブルのサイズ


これらのハッシュ関数を用いた場合、異なるキーに同じハッシュ値が割り当てられる**衝突**が起こる可能性があります。
衝突が起こった際の解決策は主にチェイン法と開番地法があります。

## チェイン法

チェイン法は同じハッシュ値を持つ複数の要素を線形リストを用いて接続する方法です。ハッシュテーブルの各インデックスはデータを保持するのではなく、線形リストの先頭ポインタを格納しています。新しいデータが衝突した場合はそのインデックスのリストの先頭に新しいノードを格納します。検索時はそのリストを順に走査して目的のキーを見つけます。

## 開番地法（Open Addressing）

開番地法（Open Addressing）とは、ハッシュテーブルにデータを直接格納し、衝突が発生した場合は、別の空き場所を探しデータを格納する方法です。
この手法では、追加のデータ構造（リンクリストなど）を使用せずに、ハッシュテーブルの中でデータの再配置を行うのが特徴です。
別の空き場所を見つける手法として線形走査（Linear Probing)があります。線形走査とは衝突が発生した場合に、次のインデックス(+1)を順に調べ、空きスロットを探す手法です。

ただし、線形走査の問題点としてクラスタリング問題があります。クラスタリングとは連続した空きスロットを埋めてしまうことで、次に挿入する場合に多くのスロットを調べる必要が出てきてしまう。その結果、検索、挿入効率が下がることになります。

このクラスタリングを避ける方法として、インデックスを(h + i^2)にして走査する二次走査法（Quadratic Probing）、別のハッシュ関数を用いて(h + i*g(x))とする二重ハッシュ法（Double Hashing）があります。これらを用いることで、データの分布をより均一にすることができます。
GStreamerでWebRTCを簡単に試してみる

## 動作確認はMacで試しています

# コードはこちらにあります👇
https://github.com/hexaforce/gstreamer-example

下記をインストール
```shell
brew install glib
brew install gstreamer
brew install libnice-gstreamer
brew install libsoup@2
```

### 受信のみ
* webrtc-recvonly-h264
![webrtc-recvonly-h264.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117164/642fd577-871d-3e6a-83ba-16f04de08468.png)
```shell
$ ./webrtc-recvonly-h264
WebRTC page link: http://127.0.0.1:57778/
```

### 送信のみ
* webrtc-unidirectional-h264
![webrtc-unidirectional-h264.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117164/948eaf9d-b844-6c0c-8f77-01c0b766f21b.png)
送受信
```shell
$ ./webrtc-unidirectional-h264
WebRTC page link: http://127.0.0.1:57778/
```

### 送受信
* webrtc-sendrecv
![webrtc-sendrecv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117164/9e656509-85bd-1237-2a9b-23a257b6c0c2.png)

上記のコードではWebとシグナリングサーバが1つになっていますが、  
このケースではWebとシグナリングサーバを立ち上げる必要があります  
```shell
$ make server
```

http://localhost/ を開くと現在のPeerIDが表示されます。  
これは、一時的な電話番号のようなものです。  
そのIDに対して実行します。  

```shell
$ ./webrtc-sendrecv --peer-id=9999
```

ブラウザを2つ立ち上げて、送受信できます

* 送受信Java版  
```shell
docker exec -it gst-java-sendrecv-1 java -jar app --peer-id=1111
```
React100本ノックやってみた【02】

## はじめに
この記事は以下の記事を参考に作成しました。

https://qiita.com/Sicut_study/items/82059f9cbb5b2996e5b3

## **問題**

カウンターを作成する


## **達成条件**

1. 表示領域: 数字を表示するエリアが存在する。
2. インクリメントボタン: このボタンをクリックすると、表示されている数字が 1 増える。
3. デクリメントボタン: このボタンをクリックすると、表示されている数字が 1 減る。
4. 初期表示: アプリを起動した際の数字は 0 である。
5. ステート管理: React の useState や useReducer を使って、カウントの数字を管理する。

## **実際に解いてみた**

### **利用技術**

- React
- TypeScript
- shudcn/ui
- TailwindCSS
- Next.js

## 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993206/165241d9-67f3-2d58-4eb5-b40614113bd5.png)

## ディレクトリ構成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993206/d4cdb63e-dd0f-e981-681e-f391f84f3e34.png)


## コード



page.tsx

```tsx
"use client";

import Counter from "@/components/Counter";

export default function Home() {
  return (
    <div>
      <Counter />
    </div>
  );
}

```

Counterのindex.tsx

```jsx
"use client";

import { useState } from "react";
import { Button } from "../ui/button";
import {
  Card,
  CardContent,
  CardDescription,
  CardHeader,
  CardTitle,
} from "../ui/card";

function Counter() {
  const [count, setCount] = useState(0);
  console.log(count);

  //
  const countup = () => {
    setCount(count + 1);
  };

  const countdown = () => {
    setCount(count - 1);
  };

  return (
    <div id="container">
      <div className="flex flex-col items-center py-60 bg-blue-100">
        <Card>
          <CardHeader className="gap-5">
            <CardTitle className="text-gray-500">React Counter</CardTitle>
            <CardDescription className="flex justify-center text-blue-600 text-5xl font-bold">
              {count}
            </CardDescription>
          </CardHeader>
          <CardContent>
            <div className="flex gap-8 justify-center ">
              <Button className="rounded-3xl bg-blue-600" onClick={countup}>
                +
              </Button>
              <Button
                className="rounded-3xl  bg-white text-blue-600 border-2 border-blue-600"
                onClick={countdown}
              >
                -
              </Button>
            </div>
          </CardContent>
        </Card>
      </div>
    </div>
  );
}

export default Counter;

```

## 感想

useStateを今回使用して作成した。またshadcn/uiを使ったので楽にUIを作れた。
JuliaとCUDAのシンプルな使い方

Julia言語でCUDAを使う方法を忘備録として残しておきます。

- Julia 1.11

で試しています。単純な計算なので、CUDAのバージョンはよほど古くない限り大丈夫でしょう。[CUDA.jlのドキュメント](https://cuda.juliagpu.org/stable/tutorials/introduction/)を見ると色々書き方が書いてあります。

ある二次元格子上の座標点$(x,y)$において、$N \times N$行列が定義されているとします。そして、

```math
C(x,y) = A(x,y) B(x,y) 
```
が計算したいとします。座標点ごとに計算は独立ですので、GPUでまとめて計算できるはずです。

# コード例

```julia
using CUDA

function cudakernel_mul!(C,A,B,N)
    b = Int64(CUDA.threadIdx().x)
    r = Int64(CUDA.blockIdx().x)
    kernel_mul!(C,A,B,N,b,r)
end

function kernel_mul!(C,A,B,N,b,r)
    for j=1:N
        for i=1:N
            C[i,j,b,r] = 0
            for k=1:N
                C[i,j,b,r] += A[i,k,b,r]*B[k,j,b,r]
            end
        end
    end
end

function testcudamul!(C,A,B,N,blocksize,rsize) 
    CUDA.@sync begin
        CUDA.@cuda threads = blocksize blocks = rsize cudakernel_mul!(C,A,B,N)
    end
end

function testmul!(C,A,B,N,blocksize,rsize) 
    for r=1:rsize
        for b=1:blocksize
            kernel_mul!(C,A,B,N,b,r)
        end
    end
end

function main()
    rsize = 64
    blocksize = 256
    N = 3
    A = rand(N,N,blocksize,rsize)
    B = rand(N,N,blocksize,rsize)
    C = zeros(N,N,blocksize,rsize)

    Agpu = CuArray(A)
    Bgpu = CuArray(B)
    Cgpu = CuArray(C)

    testmul!(C,A,B,N,blocksize,rsize) 
    display(C[:,:,4,5])

    testcudamul!(Cgpu,Agpu,Bgpu,N,blocksize,rsize) 
    display(Cgpu[:,:,4,5])

end

main()
```

です。
これだけです。つまり、各ループの中で独立に計算できるものは、GPUで簡単に並列で計算できます。
入力フォームで不便だと感じること

# 入力フォームで不便だと感じること
入力フォームにて、その入力で指定するフォーマットに対する、注記や、入力の例としてプレースホルダーが設定されている場合があります。
![img-20210906-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3914255/518bce5b-d8e3-2b96-1fc7-dacbeb0fd922.png)
多くはプレースホルダで入力例を記載している場合が多いかと思いますが、
この場合、入力しているときにいつも思うのですが、
「あれ？この電話番号の入力はハイフン**あり**だっけハイフン**なし**だっけ？」となります。

-------
入力欄のプレースホルダをよく見ればいいという話なんですが、よく見てないと入力を消すか、バリデーションに引っかかるかを確認する必要があります。

それはちょっと使いづらいし、一回で入力を終えたい(**個人的に**)ので、入力中に入力例もしくは、入力に対する注記がtooltipやポップアップで入力中に見えるか、そもそも入力欄の下などに注記や入力例が入ったものが「入力しやすいかどうか」という観点では、良い入力フォームだと思います。
029 AI屋さんの　LLMにトークン全文入力　Flask＋Cloud RUN＋Gemini




029 AI屋さんの　LLMにトークン全文入力　Flask＋Cloud RUN＋Gemini

前回、
Google Cloud　の　Cloud Run で　Streamlit　をデプロイするのに
Docker Hub のイメージを使うと
ブラウザのボタン　ポチポチで完成しました。

今回は、Flask　で同じ事をします。

---


作成済みのイメージを　指定してあげるだけで超簡単です。
また、新規プログラムや更新プログラムをデプロイするには、
Streamlitの場合は、同じイメージを使い回しまして、

　bono0/st
 
pages ディレクトリでアプリの追加・更新に対応できましたが、
Flaskの場合は、毎回イメージを作成する必要があります。
面倒だけど　まあ、当たり前の作業ですけどね。

Flaskは、webアプリ、webAPI　など利用する場合に用います。
よって、HTML、CSS　なども必要になります。
面倒だけど　まあ、当たり前の作業ですけどね。


下記の　イメージをそのままデプロイすれば、
デプロイ作業の容易さは確認できます。

　bono0/flask

アプリの内容は、雛形の空っぽwebAPIです。



![スクリーンショット 2025-01-25 18.21.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/a54f23fc-5380-6f87-a86c-357543a0abbe.png)




Flask　は、アプリもAPIも　両方作れて、軽量なので
Flaskで　フロントの負荷を抜くのに利用できます。

Flaskを使うだけなら
Cloud Run以外の　他のサーバーレスでも利用可能です。

　１、Cloud Run　:　OS単位、Dockerベース
　２、App Engine　:　アプリ単位（最新版：Dockerベース）
　３、Cloud Functions　:　関数単位（最新版：Cloud Run同等）



どれも、歴史と実績と経緯があるので　お好み次第ですが、
時間があれば、全部使うのが良いかと思います。
どれもが、他の相手の領域をカバーし合っているので、
どれを選んでも一通りは作れます。
むしろ、Flask のデプロイは、お箱です。
streamlitをデプロイする方が、よっぽで大変です。



![スクリーンショット 2025-01-25 19.38.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/9868fc5b-39bf-9636-2129-9a5b140edab5.png)

Docker Hub　の
　bono0/flask　は、
空っぽの雛形です。


---


目次

https://qiita.com/bono0/items/dc1d000c98af7e07c9a7




今回も無事に

　webAPI　の　Flask をデプロイできました。
　029 AI屋さんの　LLMにトークン全文入力　Flask＋Cloud RUN＋Gemini

完成です。おめでとうございます。




ー続くー
「HTMLで作成したテーブルに、ソート機能を持たせたいんだけど・・・」

と、Java勉強中の方から聞かれたら、なんて回答しようか？

「えーっと、いろんな方法があるけど、
　手っ取り早いのはDataTablesじゃない？」

と言って、サンプルを渡すことを目的にしたページです。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="XJryqOB" data-pen-title="20250125_DataTables Samples" data-user="zerozeromark" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/zerozeromark/pen/XJryqOB">
  20250125_DataTables Samples</a> by zero mark (<a href="https://codepen.io/zerozeromark">@zerozeromark</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>

(fin)
Windows搭載フォントの太さを調べてみた

## ウェイト表記は互換性がないので実測してみた
Windows 11にはMSゴシック、メイリオ、游ゴシック、BIZゴシックと4種類のゴシック体が計9ウェイト分搭載されており、さらにUDデジタル教科書体も2ウェイト搭載されている。
これらゴシック系のフォントはMSゴシックを除いてそれぞれ太さ（ウェイト）が表示されてはいるが、それぞれの太さは絶対的な基準をもとにして付けられたものではない。
これらのフォントを太さ順に並べたらどうなるか、実測により比較した。
なお、 MS Office に付属するHGゴシックM、HGゴシックE、HG創英角ゴシックUB、HG丸ゴシックM-PROも合わせて計測した。

## 測定方法
測定には Affinity Photo を使用した。
1. 100px × 100px、72dpi で新規ドキュメントを作成
2. 100pt で「一(いち)」「ー(長音)」文字を入力（100px 相当）
3. 游ゴシックは両端が太くなっており、その影響を排除するため、両端に矩形を被せて型抜き（除外）した後、高さの値を読み取り
UDデジタル教科書体のみ横画が傾いているため、-2.6度前後で0.1度単位の回転をした後、上記操作をし、最小値を記録

## 結果
一(いち)の細い順に並べている。
| フォント名 | 一(いち) | ー(長音) |
|:-:|:-:|:-:|
| 游ゴシックL | 3.4 | 3.6 |
| 游ゴシックR | 4.9 | 5.6 |
| HGゴシックM | 5.9 | 6.3 |
| 游ゴシックM | 6.4 | 7.2 |
| メイリオ | 6.9 | 7.2 |
| HG丸ゴシックM-PRO | 7.0 | 7.8 |
| UDデジタル教科書体 | 7.4 | 7.6 |
| BIZ UDゴシック | 8.1 | 7.7 |
| MSゴシック | 8.6 | 8.6 |
| 游ゴシックB | 11.3 | 12.0 |
| BIZ UDゴシック(太字) | 11.4 | 11.0 |
| HGゴシックE | 11.7 | 11.7 |
| UDデジタル教科書体(太字) | 12.9 | 12.3 |
| メイリオ(太字) | 13.0 | 13.0 |
| HG創英角ゴシックUB | 14.1 | 13.3 |

（参考）
明朝体は「一(いち)」のウロコを除いた部分の太さのみ計測できるが、MS明朝と游明朝Dは2.3、游明朝Lと游明朝Rは2.5、BIZ UD明朝は5.5である。
ServiceNow SN Utils - sys_idをリストに表示する（革命）

# もっと早く知りたかった大賞2025

SN Utils（の説明は省きますね）で個人的神機能を発見したので思わずメモがてら記事にします。
タイトルの通りですが、sys_idを爆速でリスト表示できます。

ServiceNowはじめたてのころ（Utils知らない頃）は以下の記事
[ServiceNow - リストにsys_idを表示する（ @htshozawa さん ）](https://qiita.com/htshozawa/items/6ddb61484f75cd22e8f6)
を参考にやらせてもらってました。
「sys_ui_list」テーブルで設定する方法ですね。

なにかと業務で調査、データ整備などでリストビューにsysidを表示したかったことも多々あり、
毎回、上記の記事を開いてポチポチしてた思い出がありけり。
（上記の記事にはかなりお世話になりました。ありがとうございました。）

# やり方
※当然ですが、SN Utilsを拡張機能としてインストール、オンにしている前提です。
sys_idをリスト表示したいテーブルのリストビューを開き、
クイック追加ボタン（"Quick Add" Button）を
**キーボードのShiftキーを押しながらクリックする**
です！！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3989988/ea7f122c-af92-751f-fd24-8aeb3bcdf093.png)



すると、自動でこういう画面になり（この画面で操作の必要はありません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3989988/8d935186-d80b-79d5-6957-ea2b40a9fbe3.png)



sys_idをリストに表示できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3989988/591dc9b3-f472-e435-9e6a-af1c293bf692.png)

当然、そのまま右クリックメニューのExport（Excel／CSV）でデータを吐き出しても見た目のまんまsys_idをつけてくれます。


# 補足
## 補足1
そりゃそうといえばそうですが、元々参考にさせていただいていた記事で設定していた、
「sys_ui_list」テーブルに設定が反映されています。

Utilsの上記機能を使った後の状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3989988/e301c945-0a67-26b2-44a4-41d9e2f31860.png)


## 補足2
（すでにクイック追加ボタン使っていて）クイック追加ボタンの表示がない場合、歯車マークの後の画面の、以下画像の「このへんのなんもないところ」をダブルクリックすると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3989988/2a6ca7ec-fd2a-a7ff-7aee-51914db7995b.png)


sys_idが登場してくれます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3989988/19010572-e939-8498-d917-43eb1bf84401.png)
登場したリンクをクリックして、OKを押せば追加完了。


（ちなみに上記キャプチャに見えてますがこの、「このへんのなんもないところ」のダブルクリックでdotwalkの項目も追加できるようになります（右下のAdd dotwalk fieldのところ） ※記事の本題とずれるのでここでつぶやくだけの記載ですが、これもかなり有用Tipsですね）


## 補足3
クイック追加ボタン＋Shiftキー　のときに自動で追加させるカラムは、
Utilsの「Settings」タブの以下で設定できます。
この設定に加え、sys_idが先頭に来るというのが「クイック追加ボタン＋Shiftキー」の通常の動きという感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3989988/27dc896e-11dc-7607-7f85-a6ce2637b430.png)



# おまけ
「もっと早く言ってよSN Utilsさん…」と思ってたんですが、たぶん最初から言ってましたｗ
（クイック追加ボタンをマウスオーバーした時の説明）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3989988/b32e3870-3519-2763-7e1e-04b2498a1a3b.png)
しっかり「add sys_id to beginning of list」


とはいえ、これでリストへのsys_id表示が必要になった時の作業効率爆上がり間違いなしですね！

# 参考文献
・[One click/Quick add personalised columns to both left AND right of list](https://github.com/arnoudkooi/ServiceNow-Utils/discussions/364)



以上
Githubアカウント作成方法

# Githubアカウント作成方法

初めまして
はなまるエンジニアです。

今回はGithubのアカウント作成を行っていきます。
これからGithubのアカウントを新規作成する方の参考になれば幸いです。

[1. Githubとは](#1githubとは)
[2. Githubアカウント作成方法](#2githubアカウント作成方法)
[3. 最後に](#3最後に)

## 1,Githubとは
Git(プログラムのコードが書かれているファイルのバージョンを管理するためのツール)を利⽤して世界中のどこからでもアクセスできるようにしたWEBサイトのこと。
Gitがあれば簡単にバックアップを管理することができる。
ちなみに、2022年の11月時点で9,400万人の開発者が使用しているとのことです。

## 2,Githubアカウント作成方法
さて、さっそくアカウントを新規作成していこうと思います。

#### 手順１：以下「GitHub」の公式サイトへアクセスし、「Sign up」を押下します
https://github.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984784/c4b2d27e-488b-fd72-113c-6b4e2ad6e287.png)



#### 手順２：赤枠内にこれから作成するアカウントの情報を入力します
※パスワードやユーザ名は次回以降ログインする際に必要となる情報ですのでメモしておきましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984784/d4e596d9-d11d-707a-1164-15a882e6b652.png)

#### 手順３：メール認証を行う

先ほど登録したメールアドレス宛に８桁の認証コードが届きます。
その内容をgithub認証画面に入力いただくとメール認証は完了です。

以下アカウントページが表示されましたらアカウント登録の完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984784/4cbd31ca-374f-08d7-a454-bb3f85231f12.png)

## 3,最後に
githubのアカウント登録は大変かと思いましたが手順が少なく案外簡単でしたね。
英語のページで分かりづらい部分もありましたが、翻訳機能を使用すると日本語版で表示することも可能です。今回はgoogle翻訳を使用させていただきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984784/d0df5f8d-c510-343f-4df2-143a233f10b5.png)

以上、githubのアカウント作成について解説してみました。
これからアカウント作成を行う方の参考になれば幸いです。
お疲れさまでした。
【電脳少女プログラミング2088 ─壊レタ君を再構築─】「郊外のスラム街」をやってみた。

paizaの新作プログラミングゲーム【電脳少女プログラミング2088 ─壊レタ君を再構築─】[郊外のスラム街（paizaランク：D相当）](https://ppg.paiza.jp/denno2088/areas/13)をやってみました。
- - -
###### 問題
https://ppg.paiza.jp/denno2088/challenges/denno2088_c_d_03
- - -
###### 方針
1. 整数$n$を受け取ります
1. $\lfloor \frac n2\rfloor+100$を出力します
- - -
###### C
```c
#include <stdio.h>

int main() {
	int n;
	scanf("%d", &n);
	printf("%d\n", n / 2 + 100);
	return 0;
}
```
- - -
###### C++
```cpp
#include <iostream>
using namespace std;

int main() {
	int n;
	cin >> n;
	cout << n / 2 + 100 << endl;
	return 0;
}
```
- - -
###### C#
```cs
using System;

class Program
{
	public static voidn Main()
	{
		int n = int.Parse(Console.ReadLine());
		Console.WriteLine(n / 2 + 100);
	}
}
```
- - -
###### Go
```go
package main
import "fmt"

func main() {
	var n int
	fmt.Scan(&n)
	fmt.Println(n / 2 + 100)
}
```
- - -
###### Java
```java
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.next();
		sc.close();
		System.out.println(n / 2 + 100);
	}
}
```
- - -
###### JavaScript
```js
n = Number(require("fs").readFileSync("/dev/stdin", "utf8"));
console.log(Math.floor(n / 2) + 100);
```
- - -
###### Kotlin
```kotlin
import java.util.*

fun main() {
	val sc = Scanner(System.`in`)
	val n = sc.next()
	sc.close()
	println(n / 2 + 100)
}
```
- - -
###### PHP
```php
<?php
	$n = intval(fgets(STDIN))
	echo intval($n / 2) + 100, PHP_EOL;
?>
```
- - -
###### Perl
```pl
$n = int(<STDIN>);
print int($n / 2) + 100, $/;
```
- - -
###### Python3
```py
n = int(input())
print(n // 2 + 100)
```
- - -
###### Ruby
```rb
n = gets.to_i
p n / 2 + 100
```
- - -
###### Scala
```scala
import scala.io.StdIn._

object Main extends App{
	val n = readInt()
	println(n / 2 + 100)
}
```
- - -
###### Swift
```swift
let n = Int(readLine()!)!
print(n / 2 + 100)
```
モダンCSS機能デモ学習_2025年1月

モダンCSS機能についてv0でデモを作成しましたのでこちらに記録します。


学習用にv0でデモをつくりました。今回は、モダンなCSS機能のデモ学習の記録として、以下8つの機能について調査・テストを行った内容をまとめます。

---

## ① has()セレクター

`has()`セレクターは、親要素が子要素を特定の条件で持っているかどうかを判定できる新しい疑似クラスです。従来のCSSセレクターとは逆方向の関係(子要素→親要素)でスタイルを当てられるため、CSS設計の幅が広がります。


![has()セレクター.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740465/b202ffdc-87ef-3ce2-79bb-afc85b55b21b.gif)



---

## ② Container Query

Container Queryは、要素の親コンテナのサイズや状態に応じてスタイリングを切り替えられる機能です。メディアクエリでは画面全体の幅や高さに依存しますが、Container Queryを使うとコンテナ単位で柔軟にレイアウトを制御できるようになります。



![Container_Query.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740465/c04c00c1-bf30-80c3-3044-8727ac5fee38.gif)


---

## ③ スクロール連動アニメーション

スクロールに合わせて要素のアニメーションが動的に変化する機能です。JavaScriptを併用する方法が一般的ですが、最近では`scroll-timeline`などのCSS機能によって、なるべくコードを少なくシンプルに実装できる可能性が注目されています。

![スクロール連動アニメーション.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740465/32cee9e0-41f6-e041-5aff-dc05aaacc7d3.gif)

---

## ④ CSS Trigonometry

CSS Trigonometryは、CSS内で三角関数（`sin()`, `cos()`, `tan()`など）を利用して、要素の座標計算や変形を行える機能です。複雑なアニメーションやレイアウトを、より宣言的に記述できることが期待されています。


![CSS_Trigonometry.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740465/f73b1903-ef48-4129-5ff3-a1d0f990df98.gif)


---

## ⑤ offset-path:path()

要素をアニメーションさせる際に、その軌道（パス）を設定できるプロパティです。`offset-path`に`path()`を指定することで、任意のSVGパス上を要素が動くアニメーションをCSSのみで実現できます。


![offset-path.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740465/6a451702-4ebe-7a10-4bdd-e2c45de3b580.gif)


---

## ⑥ mask-composite

`mask-composite`は、マスクレイヤー同士の合成方法を指定できるプロパティです。複数のマスクを組み合わせることで、より高度な視覚効果を実現できます。


![mask-composite.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740465/594a21e9-24e4-0959-6dce-bfdecb389b2a.gif)



---

## ⑦ CSSポップオーバー

新しいポップオーバーAPI（`popover`属性）は、HTMLとCSSを活用して簡易的なモーダルやツールチップを作成できる仕組みです。JavaScriptのコード量を大幅に減らし、アクセシビリティ向上も期待できます。

![CSSポップオーバー.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740465/55441a73-b7ed-7fdd-c63b-18cd3cd8e309.gif)



---

## ⑧ スクロールバーのスタイリング

`scrollbar-color`や`scrollbar-width`、そしてWebKit系のベンダープレフィックス（`::-webkit-scrollbar`）を使って、ブラウザのスクロールバーをカスタマイズできます。デザインに合わせた微調整やブランディングに役立ちます。

![スクロール連動アニメーション.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740465/532db5d3-7d75-828d-341b-47958cb87421.gif)


---


CSSをコーディングすることは普段の仕事ではありませんが、今回学んだモダンCSSの機能は、UIを考えるときのアイデアソースとしてとても参考になりました。特にCSSポップオーバーのような簡易的なツールチップの実装方法や、Container Queryでの柔軟なデザイン切り替えは、UI設計を考えるうえで「こんなこともできるんだ」と新しい視点をもらえました。
デザインやUXを検討する立場として、こうした技術の可能性を理解しておくことは必須だと思いました。これからも少しずつ新しい技術に触れながら、日々の仕事に活かしていきたいです。
Mac OS 15.1にphpenvでphpをインストールしようとしてハマった件

phpenvを使ってMacにPHPをインストールするのは毎回ハマってます。

これまではネットの情報を集めて何とかインストールできたんですが、今回はMac OS 15.1と新しめなOSのせいか、Arm64アーキテクチャのせいか分かりませんが、ネットの情報だけではなかなか解決できず、とりあえず、以下のようにしてPHP 8.1.30のインストールができました。

# grepをbrewでインストール

```
$ brew install grep
```

そうすると、ggrepというコマンドが ``/opt/homebrew/bin/`` にインストールされるので、これをgrepと置き換えるために、とりあえず、$HOME/bin にリンクを貼ってパスを通します

```
$ ln -s `which ggrep` $HOME/bin/grep
$ export PATH=$HOME/bin:$PATH
```

これをやっておかないと、以下のようなエラーが出ます

```
grep: invalid option -- P
usage: grep [-abcdDEFGHhIiJLlMmnOopqRSsUVvwXxZz] [-A num] [-B num] [-C[num]]
	[-e pattern] [-f file] [--binary-files=value] [--color=when]
	[--context[=num]] [--directories=action] [--label] [--line-buffered]
	[--null] [pattern] [file ...]
```


# 必要なライブラリのインストール

必要なライブラリはよく分からないのですが、ネットの情報でとりあえず以下のライブラリ群をbrewでインストール

```
$ brew install libyaml autoconf bzip2 icu4c@74 krb5  libedit libiconv libjpeg libpng libxml2 libzip oniguruma openssl pkg-config tidy-html5 libxslt pcre2
```

icu4c@74とバージョン指定しているのは、このバージョンより新しいものを指定しすると、以下のようにC++でのコンパイル時に大量のエラーが出るから。

```
-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
      |                                   ~~~~~^
/opt/homebrew/Cellar/icu4c@76/76.1_1/include/unicode/unistr.h:2299:40: error: no template named 'enable_if_t' in namespace 'std'
 2299 |   template<typename S, typename = std::enable_if_t<ConvertibleToU16StringView<S>>>
      |                                   ~~~~~^
/opt/homebrew/Cellar/icu4c@76/76.1_1/include/unicode/unistr.h:3273:40: error: no template named 'enable_if_t' in namespace 'std'
 3273 |   template<typename S, typename = std::enable_if_t<ConvertibleToU16StringView<S>>>
      |                                   ~~~~~^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
2 warnings and 20 errors generated.
make: *** [ext/intl/calendar/calendar_methods.lo] Error 1
-----------------------------------------
```




# ビルドの実行

必要な環境変数をセットして実行します。ちょっと長いですが、以下のようになりました。

```
 PKG_CONFIG_PATH=/opt/homebrew/opt/icu4c@74/lib/pkgconfig CXXFLAGS="-std=c++14" CPP_FLAGS=$(pkg-config --cflags libjpeg) LD_FLAGS=$(pkg-config --libs libjpeg) PHP_BUILD_CONFIGURE_OPTS="--with-tidy=$(brew --prefix tidy-html5) --with-jpeg=$(brew --prefix jpeg) --with-zlib-dir=$(brew --prefix zlib) --with-bz2=$(brew --prefix bzip2) --with-curl=$(brew --prefix curl) --with-iconv=$(brew --prefix libiconv) --with-libedit=$(brew --prefix libedit) " phpenv install 8.1.30
```



これでビルドが成功しました。


ちなみに、8.2系のコンパイルは、以下のエラーが出てしまい、うまく行かないようです。

```
configure: error: *** A compiler with support for C++17 language features is required.
```

うまく行った人いたら教えてください。