OmniAICreator/Qiita-1.07M huggingface dataset:
Next.js (SSR) × Rails API の CSRF 対策

# 概要
Next(SSR)アプリケーションと、Rails APIを連携しています。

不正なリクエストを受け付けないために、`CSRF`対策が必要となったのですが、Rails 標準の仕組みが利用できなかったため、対応を検討する必要がありました。

# 1. CSRF 対策の概要

CSRF 対策には `Rails`で提供されている`ActionController::RequestForgeryProtection`モジュールを利用します。

https://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html

**[役割]**
- セッションで有効なトークンを発行する
- リクエストヘッダー`X-CSRF-Token`に格納されたトークンを自動で検証する
- トークンが一致しない場合は(不正なリクエスト)、`422`エラーとして処理する

```
Can't verify CSRF token authenticity.
Completed 422 Unprocessable Entity in 22ms (ActiveRecord: 0.0ms)
```

# 2. 全体の流れ
実装前に全体の流れを見ていきましょう。

1. [Rails] CSRF トークン発行
   - コントローラーで`form_authenticity_token` を使ってCSRFトークンを発行する
2. [Rails] レスポンスヘッダにトークンをセット
   - `X-CSRF-Token` などのヘッダ名でレスポンス
3. [Next] フォーム送信のリクエストヘッダー`X-CSRF-Token` に受け取ったトークンをセットしてリクエストを行う
4. [Rails] CSRFトークンを検証
   - 一致すれば処理を続行、一致しなければ`422`エラーを発生

# 3. 実装
全体像を理解したところで実装に移ります。

## Rails

まず `ApplicationController`に`ActionController::RequestForgeryProtection`をMIX-INして`CSRF`トークンを発行するメソッドを定義します。

```ruby
class ApplicationController < ActionController::Base
  include ActionController::RequestForgeryProtection
  
  protect_from_forgery with: :exception

  private
    def set_csrf_token
      response.set_header('X-CSRF-Token', form_authenticity_token)
    end
end
```

次にCSRF検証を行いたいコントローラーで`set_csrf_token`を呼び出します。

```ruby
class PostsController < ApplicationController
  before_action :set_csrf_token, only: [:new]

  def new
    # ...
  end
end
```

これにより、API コール時に、レスポンスヘッダーに `CSRF`トークンが含まれます。

## Next.js

1. トークンを取得する API(例: `GET /posts/new`) をコールします
2. レスポンスヘッダーに格納されたトークンを、`X-CSRF-Token`に付与しPOSTリクエスト
    ```typescript
    fetch('/posts', {
      method: 'POST',
      headers: {
        'X-CSRF-Token': token, // CSRFトークン
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        title: 'Title',
        content: 'Content...'
      })
    })
    ```

3. Rails で検証
`create`アクション実行時に、自動で `X-CSRF-Token` を検証されます。

    ```ruby
    class PostsController < ApplicationController
      # 省略

      def create
        # POSTリクエスト時に X-CSRF-Token が正しければ通常どおり処理される
        # 不正な場合は 422 Unprocessable Entity エラー
      end
    end
    ```

# まとめ

CSRF対策は完了です！
他にも良いやり方があれば是非コメントをいただきたいです🫡
Pythonで英語アルファベット、英単語をカタカナに変換

# 前書き
英語アルファベット、英単語をカタカナに変換するPythonライブラリをまとめていきます。

# alphabet2kana (英語アルファベット→カタカナ)
pipでライブラリalphabet2kanaをインストールします。

```python
pip install alphabet2kana
```

英語アルファベットをカタカナに変換する。

```python
from alphabet2kana import a2k

print(a2k("test")) 
# 結果: ティーイーエスティー 

print(a2k("Alphabetと日本語")) 
# 結果: エーエルピーエイチエービーイーティーと日本語
```

# alkana (英単語→カタカナ)
pipでライブラリalkanaをインストールします。

```python
python3 -m pip install -U alkana
```

英単語をカタカナに変換する。入力はアルファベットのみです。

```python
import alkana

print(alkana.get_kana("test")) 
# 結果: テスト 

print(alkana.get_kana("Alphabet")) 
# 結果: アルファベット 

print(alkana.get_kana("Alphabetと日本語")) 
# 結果: None
```
SonicPiをMIDIで制御する

# SonicPiをMIDIで制御してライブっぽく演奏したい

外部から指示することでSonicPiの音を鳴らすループを動かす（止める）を自由にやりたいなと思いまして、今回はMIDIを使って制御するやり方を試行錯誤してみました。

## 実例（動画)

<iframe width="1280" height="600" src="https://www.youtube.com/embed/c-maF8wYA0M" title="SonicPI Midi Controller" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

# 概要

キーボードを押したときの`note`(C3～F3)にそれぞれLiveLoopを対応づけておきます。
対応するキーを押すと 対応する音楽が鳴り始める、止める、を実現したいと思います。
MIDIキーボードのキーを押すことでリズムを奏でたり停止したり、少しだけですがライブ演奏の感覚を味わうことができます。

### 構成(Windows11)

- SonicPi
- Pocket MIDI
- loopMIDI

# やってみてわかったこと

### MIDIとの同期
`sync midi:～`:MIDIから通信と同期させることで、MIDI通信が来るまで次のステップには進まずに待ちが発生します。

```ruby
live_loop :midi01 do
  note, velocity = sync_bpm "/midi:loopmidi_port_0:1/note_on"
  # MIDI通信が来るまで次のステップには進まずに待つ。
end
```

### MIDI参照(GET)
`get midi:～`は、直近で受信したMIDIの情報を取り出すだけであり、待ちが発生しません。
そのため、loop の中で sleep がないと SonicPiの処理でエラーになります。
```ruby
live_loop :midi02 do
  program,_ = get "/midi:loopmidi_port_0:1/program_change"
  # MIDI通信を待たずにGETする
  # loop内でsleepを必要とする。
  sleep 0.5
end
```

### liveLoopを手動で開始する

`live_loop`は自動的に開始してしまうループであり、止めることができますが、再開させるには一工夫が必要です。自動で開始させず手動指示のタイミングにより`live_loop`を開始するためには、次のやり方がよいみたいです。

```ruby
# loop do-end の中に live_loopを作る
# loop は threadの中で起動させる
# loop の中では `sync`で待ちを作り、live_loopの開始を抑止する
in_thread do
    loop do
        sync :SYNC01  # <=== ★ cue SYNC01 が発生するまで待つ。
        live_loop :LOOP01 do
            # 何か音を鳴らす。
            sleep 4 # 適宜 休止
            stop if get[:ACTIVE01]  # 停止条件が成り立てばliveLoopを止める
        end
    end
end
```
上の作りとすることで、liveLoopをSTOPした後に、再度の`cue SYNC01`により同じliveLoopを開始することができます。

# SonicPiコード

[RUBYコードはこちら](https://github.com/amami-harhid/superColliderMovies/blob/main/sonicPiMidi/sonicPi.rb)
【TypeScript】type-challenges 中級編 2・Tuple To Object 解説

## お題
タプルの値からユニオン型を生成する`TupleToUnion<T>`を実装する。

## やりたいこと
```ts
type Tuple = ["a", 123, true];

type TupleToUnion<Tuple>; // => "a" | 123 | true
```

## 解答
```ts
type TupleToUnion<T extends any[]> = T[number];
```

## 解説
### 処理の流れ
- `T extends any[]`
`T`をタプルに制約。
- `T[number]`
タプルに`number`型を指定することで、タプルの要素をユニオン型で取得する。

### number型とは...
https://qiita.com/yuto99999/items/44161921ff23a149cba5#number%E3%81%A8%E3%81%AF

## 参考記事
### number型(タプルに対して使う)
- [Indexed Access Types | TypeScript Documentaion](https://www.typescriptlang.org/docs/handbook/2/indexed-access-types.html#handbook-content)
- [mosya<TC>](https://mosya.dev/blog/tc-tuple-to-union)

## 今回の問題
https://github.com/type-challenges/type-challenges/blob/main/questions/00010-medium-tuple-to-union/README.ja.md
【Ruby】ボッチ演算子ってなんだよ

## はじめに
ボッチ演算子って名前がおもしろいし好きなので書きます。

## ボッチ演算子とは
オブジェクトがnilの場合でもエラーを発生させずに処理を続行させることができるもの。

https://docs.ruby-lang.org/ja/latest/doc/news=2f2_3_0.html

(あんまり参考にならないがRubyリファレンス)

## ボッチ演算子の挙動
例えば、upcaseというメソッドを使用すると下のような挙動になる。

``` ruby
irb(main):006> gorira = "hage"
=> "hage"
irb(main):007> gorira.upcase
=> "HAGE"
```


じゃあ、このgoriraというオブジェクトの中身が空(Rubyの場合、nil)の場合はどうだろうか。

``` ruby
irb(main):014> gorira = nil
=> nil
irb(main):015> gorira.upcase
Traceback (most recent call last):
	3: from /Users/masahito/.rbenv/versions/2.7.2/bin/irb:23:in `<main>'
	2: from /Users/masahito/.rbenv/versions/2.7.2/bin/irb:23:in `load'
	1: from /Users/masahito/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/irb-1.14.1/exe/irb:9:in `<top (required)>'
(irb):15:in `<main>': undefined method `upcase' for nil:NilClass (NoMethodError)
Did you mean?  case
```
NoMethodErrorとなり処理が終わる。

じゃあこれらの挙動をボッチ演算子にして確認してみる。

``` ruby
irb(main):017> gorira = "hage"
=> "hage"
irb(main):018> gorira&.upcase
=> "HAGE"
```
まぁ、これはふつうにボッチ演算子を使用していないときと挙動は変わらない。

じゃあ中身が空の場合。

``` ruby
irb(main):019> gorira = nil
=> nil
irb(main):020> gorira&.upcase
=> nil
```
今度はエラーとならずにnilを返してくれた。

## 最後に
nilを許容しているカラムに対する処理などを書く時に使える。

がんばろう。
論理演算子にもう迷わない！優先順位を理解してスッキリ解読

## はじめに
開発をしていたら、論理演算子を使ったコードに出くわしたのですが、すぐに理解できず凹んだので、次回からサッと解読できるように備忘録を残しておこうと思います！

## 出会ったコード
以下のようなコードです。
```js
return !functionA() || !functionB() && functionC();
```
ここでfunctionA, functionB, functionCはそれぞれBooleanを返す関数だとします。

## 考え方
このコードはJavaScriptの演算子の優先順位に基づいて評価されます。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Operator_precedence

&& は || よりも優先順位が高いため、`!functionB() && functionC()`をグループ化できます。
つまり、このコードは以下のように書き換えることができます。

```js
return !functionA() || ( !functionB() && functionC() );
```

このように考えると一気に視覚的にわかりやすくなりました。

### 簡単に補足
#### 短絡評価
```
- || の場合、左側がtrueなら、その時点で結果が確定するため右側は評価されません
- &&　の場合、左側がfalseなら、その時点で結果が確定するため右側は評価されません
```

これを踏まえてコードをみていきます。
#### `!functionA()`がtrueになるなら
この時点でこのreturn全体はtrueを返すため、右側を見る必要はありません。

#### `!functionA()`がfalseになるなら
`!functionB() && functionC()`を見ていきます。
`!functionB()`がfalseなら、この時点でreturn全体はfalseを返すため、右側を見る必要はありません。

### 動作確認用コード
こちらで実際の動きを確認できます。
```js
function functionA() {
  return true;
}

function functionB() {
  return false;
}

function functionC() {
  return true;
}

console.log(!functionA() || !functionB() && functionC());
```

## まとめ
- 演算子の優先順位を正しく理解することが大切
- 難しく考えすぎず、わからなかったら優先順位の通りに()を補って読んでみると理解しやすくなる

これで次からはきっと大丈夫です！
英語の発音改善の基礎

## はじめに
ITエンジニアおよびアカデミアにとって，英語は切っても切り離せないものです．
英語ドキュメントを読む際には翻訳機を使えばなんとかなるものの，国際カンファレンスやグローバルチームでの開発プロジェクト等でのディスカッションでは話す・聞くの力が必要になってきます．
英会話力向上のための理想的な練習方法はネイティブとの英会話を継続的に行うことですが，いきなり英会話することへの抵抗感や，その他諸々の理由からそのような環境を用意できない方もいると思います．
本稿では英語で話す力に焦点を当て，基礎的な発音上達Tipsを紹介します．
発音を上達させることは，リスニング力の向上にも繋がると考えています．
自分が発音できない音は聞き取ることもできないでしょう．
ゴール地点は，いわゆるジャパニーズイングリッシュ的な発音から抜け出し，ネイティブの発音（アメリカ英語）に近づくことです．

#### 筆者の英語力・経験
- 英語での日常会話およびやや抽象的な会話が可能（相手がネイティブ，非ネイティブ問わず）
- 自分の発音を聞き取ってもらえないことはほぼない
- 4人以上のネイティブとの会話では置いていかれることがある（リスニング力の問題）
- ほぼ毎日英語で話す機会がある（外国人の友人との雑談等）
- 国際学会での発表経験あり
- TOEIC L&R 825点

## マインドセット
まず，英語への苦手意識を忘れましょう．
[こちらの記事](https://www.statista.com/statistics/266808/the-most-spoken-languages-worldwide/)によると，英語話者の人口は約15億人みたいです．
15億人にできて，あなただけができない理由を探すのは難しいでしょう．
英語はただの言語です．
加えて話す際に大切なのが，ビビらないこと，自信を持つことです．
このマインドセットを獲得するには成功体験（自分の英語が外国人に伝わった経験）が必要です．
そのためにまず，発音を鍛えましょう．

## 発声の仕組みの違い
日本語と英語では，そもそもの発声の仕組みが違います．
体感的に発声方法の違いを感じてる方は多いと思いますが，その仕組み的な違いを理解していますでしょうか．
「日本語　英語　発声　違い」等のキーワードで検索するとたくさんの記事や動画が出てきます．
ここでは，私が日々実践する中でより重要であると感じたものを紹介します．

#### 1. 英語は腹式呼吸，日本語は胸式呼吸
胸ではなく，腹の底から空気を出して声帯を震わせる．
[参考文献](https://ndlsearch.ndl.go.jp/books/R000000004-I023628127)

#### 2. 息を出し続ける（音を出し続ける）
喉の開閉で音節を区切らない．
[参考動画](https://youtu.be/cdQN0xTR5aY?si=pMtFcTXsNMGs2gfY)

#### 3. 子音は口先でやや適当に発音
リスニング力の低い我々が，自分が聞き取れる発音で話すとそれは当然ジャパニーズイングリッシュである．
[参考動画](https://youtube.com/shorts/W4ZKex1y0gI?si=vmrxP4n6tDDOrwpY)

#### 4. 英語に「ー」（伸ばし棒）はない
3月を意味する"March"は「マーチ」ではなく，「マァチ」．
[参考動画](https://youtu.be/82sNS3dFRNc?si=yvzI2iBMZBwg0ZPt)

#### 5. 英語に「っ」（促音）はない
犬を意味する"dog"は「ドッグ」ではなく，「ドォグ」．
[参考動画](https://youtu.be/tYJZJUmTdgA?si=a5-zozuAv9BMTKhV)

#### 6. 音節（シラブル）の数を意識
物体を意味する"object"は「オ・ブ・ジェ・ク・ト」の5音ではなく，「オブ・ジェクト」の2音です．

以上の発声・発音Tipsに加え，各アルファベットの正確な発音を身につけることが必要です．
そのためには，**フォニックス**です．
フォニックスとは，アルファベットと発音の関係性を学ぶ音声学習法です．
[この動画](https://youtu.be/eqzUPQ1EgpI?si=GqoD2djheEzrK47H)を見ながら毎日練習しましょう．
1週間も経てば，上達を実感できる人も少なくないでしょう．

根本的な発声，発音の違いを理解し，フォニックスで各アルファベットの発音を習得したら，次は文章として話す練習です．
ここで大切なのが，**聞いてから話すこと**です．
有名な発音練習方法としてシャドーイングがありますが，筆者はおすすめしません．
シャドーイングは英語の音声を聞きながら2，3語遅れて発音を繰り返す練習方法です．
つまり，音声に被せながら発音するというものですが，私は何よりまず聞くことが大事だと考えています．
しっかり聞いてから，その音を自分の口から再現する．
これを繰り返すうちに，単語や文字を繋げて滑らかに発音するための**リンキング**（**リエゾン**）や発音しない文字（**サイレントレター**）などが体に染みていきます．
とにかく，**聞いてから，自分の口で再現する**を繰り返しましょう．
教材は，映画やドラマ，ポッドキャストなどなんでも良いと思います．
私は洋楽を毎日お風呂で歌っています．
何よりも継続が大切です．
継続するために，自分の好きなコンテンツで楽しみながら練習しましょう．
SQLのAS句は省略できる

# はじめに
プログラマになり日々の仕事にあっぷあっぷですが
メモがてら書きます。

最近SQLを読むことが増えました！
便利なテーブルやカラムに名前を付けられるAS句について知ってはいましたが、
省略できること知ってました？私は知りませんでした！

メモがてら記事にしておきますー

# SQLのAS句
SQLのAS句は、テーブルやカラムに別名を付けるために使用される重要な機能です。
AS句を使用することで、クエリの可読性を向上させ、複雑なクエリを簡潔に記述することができます。便利だね

```基本文法.
SELECT name AS 商品名, price AS 価格, category AS カテゴリ
FROM item;
```

# AS句を省略して別名をつける
AS句を省略した書き方が可能です！
ASがなくとも別名つけてるんだなーって理解できるようになりました↓

```AS省略.
SELECT t.name, t.price
FROM item t
WHERE t.category = '書籍';
```

```AS省略.複数テーブル
SELECT DISTINCT t2.Company, t2.Address 
FROM sample01 t1 
INNER JOIN sample02 t2 ON t2.Company = t1.Company;
```

# おわりに
現在oracleのデータベースを利用しています。
今までMySQLの学習しかしてこなかったので、次はoracleに出てくる関数をまとめようかなーと思ってます。
あと、暗黙的内部結合とやらに振り回されたのでそれも書きます。
CSSアンカーポジショニングへの、包含ブロックの影響について

### 概要

CSSアンカーポジショニングの`position-area`による配置は、位置指定要素の包含ブロックにより影響を受ける。
（MDNは間違っているような？）

### コードとサンプル

```html
<main>
    <div class="anchor">2</div>
    <div class="positioned">aaaaaaaaaaaa</div>
</main>
```

```css
main {
    position: absolute;
    left: 100px;
}

.anchor {
    width: max-content;
    anchor-name: --child;
    margin-left: 100px;
}

.positioned {
    position: absolute;
    position-anchor: --child;
    position-area: bottom span-right;
}
```

<p class="codepen" data-height="300" data-default-tab="result" data-slug-hash="OPLjLLQ" data-pen-title="CSSアンカーポジショニングと包含ブロック" data-user="lhankor_mhy" 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/lhankor_mhy/pen/OPLjLLQ">
  CSSアンカーポジショニングと包含ブロック</a> by lhankor_mhy (<a href="https://codepen.io/lhankor_mhy">@lhankor_mhy</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

~~（なぜか埋め込みできない）~~ [^1]
[^1]:https://public.codepenassets.com/embed/index.js を https://cpwebassets.codepen.io/assets/embed/ei.js に変更したらできました。URL変更でQiitaのホワイトリストから外れた？

ご覧の通り、`position-area: bottom span-right;`と指定していますが、そのような配置になっていません。
本来は、こうあってほしいのです。

![2024-12-26_16h37_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65745/40f2111b-91d3-7473-d22b-b2a8412f35e5.png)

### 解説

`position-area`による配置エリアは、位置指定要素の包含ブロックによって制限されます。
図にすると、以下のような感じです。

![2024-12-26_17h11_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65745/29df5cce-19ef-6ddb-52fd-a2c3e029ed53.png)

このコードですと、`.positioned`が位置指定要素に当たります。絶対配置されているため、その包含ブロックは直近の配置された祖先要素である`main`です。
もうお分かりかと思いますが、このコードですと、`main`の幅が内在サイズ依存となっていたため、アンカー要素である`.anchor`のサイズに依存し、右端が同じ位置になっています。
そのため、前掲の図で言うと`right`のスペースがなくなっているのが、思うように配置できなかった理由です。

![2024-12-26_17h11_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65745/0e96f2cb-95dc-2fee-9d3d-d20735fa54e3.png)

ですので、位置指定要素を固定配置にするなど、包含ブロックを変更すると問題は解決します。
今後、Safariなどで対応が進めば使う機会が多くなると思いますので、注意が必要かと思います。アンカー位置指定要素は必ず固定配置にしておくのが無難かなと思うのですが、`transform`など固定配置の包含ブロックになってしまうプロパティには悩まされるかもしれません。

### MDNの記述が？？

なお、MDNの記述が間違っているように思えます。
（英語版も同様でした）

> 中央のタイルの寸法は、アンカー要素の包含ブロックによって定義され、中央のタイルとグリッドの外縁との間の距離は、位置指定要素の包含ブロックによって定義されます。
> [CSS アンカー位置指定の使用 - CSS: カスケーディングスタイルシート | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/CSS_anchor_positioning/Using#position-area_%E3%81%AE%E8%A8%AD%E5%AE%9A)

と書いてあるのですが、仕様書を読む限り『中央のタイルの寸法は、アンカー要素によって定義され』の間違いではないかなあ……？

> the start edge of the box’s pre-modification containing block, or the start edge of the default anchor box if that is more start-ward
> the start edge of the default anchor box
> the end edge of the default anchor box
> the end edge of the box’s pre-modification containing block, or the end edge of the default anchor box if that is more end-ward.
> [CSS Anchor Positioning](https://drafts.csswg.org/css-anchor-position-1/#resolving-spans)
Slidevでarbitrary values使えないと思ったら使えた

Slidevを使って資料を作っていました。

[こちらのガイド](https://ja.sli.dev/guide/faq.html#%E3%82%B0%E3%83%AA%E3%83%83%E3%83%89)の通りに

1. ググる
2. 見つける
3. コピペ

の３コンボを決めたところ動かない

## 原因

[ここ](https://github.com/slidevjs/slidev/issues/938)に書いてあった

```html
<div class="grid grid-cols-[200px,1fr,10%] gap-4">
<div>

最初のカラム (200px)

</div>
<div>

2番目のカラム (自動調整)

</div>
<div>

3番目のカラム (親のコンテナに対して10%)

</div>
</div>
```

これはSlidevが依存しているWindi CSSの書き方ではなく、正しくはこう。


```html
<div class="grid  gap-4">
<div>

最初のカラム (200px)

</div>
<div>

2番目のカラム (自動調整)

</div>
<div>

3番目のカラム (親のコンテナに対して10%)

</div>
</div>
```

## 今日のオチ

よく見ると日本語版の上の方にちゃんと翻訳が古いことが書いてあった。
> 翻訳はもう維持されていません、英語のドキュメントをご覧ください. 

中国語版以外は翻訳が止まっていて、そこらへんでコミュニティの勢いなくなったのだろうか

SlidevはWindi CSS使っているて書いてあったけど実際しようしていたのはUno CSS
それで書き換えないといけなかった。

https://unocss.dev/presets/wind#background-position-with-arbitrary-values



## Slidevの内部事情的な

そもそもVue自体中国系の貢献が大きい。
開発者のEvan You氏もゴリゴリの中国人だし、SlidevがVueで作られたのは同じくVueのコアメンバーでもあるAnthony Fu氏が作ったからだ。
さらに言えば二番目にコントリビュートしているKermanX氏も中国出身で中国語と英語以外はSlidev開発メンバーから見ればそれほど興味なさそう。

今回のSlidevがTailwindからWindi CSS、そしてUno CSSに変わったのもUno CSSの作者が同じAnthony Fu氏で、Windi CSSの嫌なところをなんとかしたUno CSSを使いたかったからでその影響を受けてドキュメントに差異が生まれた。

marpは開発止まっているし、reveal.jsは使いづらいしいい感じのプレゼンテーションツール欲しい
EC2(Linux)で自身のインスタンスIDを取得して、describe情報を取得する方法

## 概要
ログインしているEC2で自身のインスタンスIDを取得し、aws ec2 describコマンドで自身の情報だけ確認する手順です。
インスタンスIDはコンソールでも確認できますが、スクリプト等で自身の情報だけテキストに残したい場合などに使用が可能です。

## 手順
以下の3行を実行するだけです。
```bash
TOKEN="$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")"`
instanceid=$(curl -w '\n' -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/instance-id)
aws ec2 describe-instances --instance-ids ${instanceid} --no-cli-pager
```
解説
1. IMDSv2用のトークンを取得
1. IMDSv2でインスタンスIDを取得し、変数に格納
1. aws cliでインスタンスの情報を取得




参考：[EC2のインスタンスメタデータサービスについて設定方法をまとめてみた](https://dev.classmethod.jp/articles/ec2-metadata-config/)
デザインパターンの説明をネットワーク関連の用語を使って例える

デザインパターンを説明する際に、ネットワークやクラウド関連の用語を活用することで、エンジニアが直感的に理解しやすくなる場合があります。以下に、いくつかの具体例を挙げます。

### 1. **Proxy パターン**  
**説明**: Proxyサーバーと同様に、クライアントと実際の対象（RealSubject）との間で仲介役を果たすクラスを作るパターン。  

**現実とデザインパターンの対応**:  
- **現実のProxyサーバー**: ネットワーク上でクライアントの要求を代理して処理する。  
- **デザインパターンのProxyクラス**: クライアントが直接アクセスする代わりに、対象オブジェクトへの操作を代理で行う。

### 2. **Mediator パターン**  
**説明**: クライアントとサーバー間の通信モデルに似ており、Mediator（仲介役）がColleague（個々の参加者）間のやり取りを調整するパターン。

**モデルとデザインパターンの対応**:  
- **サーバー**: 複数のクライアント間の通信や調整を行う中心的な役割。  
- **Mediator**: クラス間の複雑なやり取りを集中管理して簡潔にする役割を果たす。

### 3. **Builder パターン**  
**説明**: IaaS（Infrastructure as a Service）モデルに似ており、ユーザーが必要な仕様を指定するだけで、詳細な構築手順を意識せずに対象物が構築されるパターン。  

**IaaS上の役割例**:  
- **Director**: ユーザー（たとえばクラウドサービスの利用者）。  
- **Builder**: IaaSプロバイダー（例: Azure）で、指定された仕様（CPU、メモリ、ストレージなど）に基づいてPCやインフラを構築する。

### 4. **AbstractFactory パターン**  
**説明**: PaaS（Platform as a Service）のモデルに似ており、特定のプラットフォーム全体を生成する仕組みを提供するパターン。  

**PaaS上の役割例**:  
- **AbstractFactory**: 異なるOSやデータベースなどを含むプラットフォームを提供するための抽象的な構造を定義。  
- **ConcreteFactory**: 実際にLinuxプラットフォームやWindowsプラットフォームなどの具象的な実装を生成。

---

このように、デザインパターンとネットワーク・クラウド関連の用語を結び付けると、現実のシステムやサービスを想像しやすくなり、エンジニアにとって理解がスムーズになるでしょう。
なお、SaaSに当てはまるデザインパターンは、利用ケースや視点によって異なり、一概に1つのパターンに当てはめるのが難しいため、ここでは具体的な言及を控えます。
【小ネタ】Athenaクエリを実行してもS3でデフォルトバケットが自動作成されなくなった件

## 困っていたこと

以前はAthenaクエリの出力先S3バケットを指定せずに実行した場合は、デフォルトのバケットが自動作成されてクエリ結果を保存をしていました。
しかし、先日確認したところS3バケットは作成されず下記のエラーが出ていたため調査してみました。

![スクリーンショット 2024-12-26 172616.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904291/02f16960-0f78-5f96-abb0-e74930d50ef9.png)

## 結論

2024年現在は、クエリ結果を保存する場所を指定する必要があります。

[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/athena/latest/ug/query-results-specify-location.html)から引用
>これまで Athena では、クエリ結果の場所の値を指定せずにクエリを実行し、クエリ結果の場所の設定がワークグループによって上書きされなかった場合は、Athena がデフォルトの場所を作成していました。デフォルトの場所は aws-athena-query-results-MyAcctID-MyRegion でした。MyAcctID はクエリを実行した IAM プリンシパルの Amazon Web Services アカウント ID で、MyRegion はクエリが実行されたリージョン (us-west-1 など) です。
>今後は、以前に Athena を使用したことがないアカウントがあるリージョンで Athena クエリを実行する前に、クエリ結果の場所を指定するか、クエリ結果の場所の設定を上書きするワークグループを使用しなければならなくなります。Athena はデフォルトのクエリ結果の場所を作成しなくなりましたが、以前に作成されたデフォルトの aws-athena-query-results-MyAcctID-MyRegion の場所は引き続き有効で、使用を継続できます。

## おわりに

仕様がいつ変わったのかが気になるところです。
2023年の半ばまではS3バケットが自動作成される仕様だったみたいなので最近なんでしょうか。。。
ブログを漁っていると2024年以前は「バケット指定不要」2024年以降は「バケット指定必要」な記事が多かった気がするのでそのあたりでしょうか。(公式ドキュメントがいつ更新されたのか知りたい)
短いですが今回はここまでです。

## 参考

[[小ネタ]Athenaのクエリ結果の保存場所について](https://dev.classmethod.jp/articles/athena-query-save/)
[クエリ結果の場所を指定する](https://docs.aws.amazon.com/ja_jp/athena/latest/ug/query-results-specify-location.html)
監視カメラ　はじめの一歩

１．ＯＳがbookwormだと。インターフェースの設定は不要。以下で確認。
但し、Bullseyeにダウングレードしたので、以下が必要
raspi-configで「Glamor」を有効にする
/boot/config.txtの最下行に「dtoverlay=imx708」を追加
/boot/config.txtで「dtoverlay=vc4-kms-v3d」のコメントアウトを外す
※レガシーカメラはDisableとする。
 
以下ＯＳの確認。
```
lsb_release -a
```
２．カメラ表示確認　以下は無制限キャプチャ。　CTL+Cで中断。
libcamera-hello -t 0
```
sudo apt update && sudo apt upgrade -y
libcamera-hello
libcamera-hello -t 0
```
コマンドは　最新ＯＳでは　rpicamコマンドになっているようですね。　
ダウングレードしたのでlibcameraコマンドですね。
主なコマンド
簡単なカメラコマンド　「libcamera-hello」
高解像度の静止画コマンド　「libcamera-jpeg」
高度な静止画コマンド　「libcamera-still」
高度な動画コマンド　「libcamera-vid」

参考サイト
https://hellobreak.net/raspberry-pi-bullseye-libcamera/

３．カメラが逆でした。　セッテイングし直し。接続はＯＫだ。
![IMG_0070.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433305/9bd0e285-1db8-80a4-afc2-cfb3a07102fe.jpeg)
typefaceが非推奨になっていたのでfontsourceを使おう

タイトル以上でも以下でもないメモです

## 経緯

google fontなどをお手軽にかつセルフホストする手段として
typefaceがありました
`npm install typeface-フォント名`
からの
`import typeface-フォント名`
と行うだけでフォントが使用できるようになる便利ツールです。

ただGoogle Fontで日本語が対応しているフォントにもかかわらず、適用されないときがあり
「あれ？ライブラリ側で日本語サポートしていないのかな？」
とtypefaceのドキュメントを確認したところ以下の文言がありました。

```
The Typefaces project is now deprecated.

@DecliningLotus created FontSource which provides the same functionality as Typefaces but with automated releases & richer support for importing specific weights, styles, or language subsets.

To start using Fontsource, replace in your package.json any instances of "typeface-m-plus-rounded-1c" with "fontsource-m-plus-rounded-1c".

Then change imports from "import 'typeface-m-plus-rounded-1c'" to "import 'fontsource-m-plus-rounded-1c/latin.css'".

Typeface packages will continue working indefinitely so no immediate changes are necessary.
```

## 結論
言われている通りfontsourceを代わりに使いましょう。

https://fontsource.org/
から目的のフォントを探して

`npm install @fontsource/フォント名`
からの
`import '@fontsource/m-plus-rounded-1c';`
【Excel】ファイルのパスワード設定と解除方法


今回はExcelのファイルのパスワード設定と解除方法を覚書していきたいと思います。

## 設定する方法

#### 1. 

パスワードを設定したいファイルの[ファイル]タブを押して、**名前を付けて保存**をクリックします。

保存したい場所を設定した後、**その他のオプション**をクリックします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/c5034d07-6a51-4fdc-4988-60870d0d38a5.png)


#### 2. 

**名前を付けて保存**のポップアップ画面が開かれるので、右下の**ツール**▼から**全般オプション**を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/b6a0e280-97c9-9fea-ffaa-819ceeb6363e.png)


#### 3. 

**全般オプション**でパスワードを設定します。

読み取りパスワードと、書き込みパスワードの設定をすることが出来ます。

片方だけ、もしくは両方かけることも可能です。

閲覧制限をかける場合は読み取りパスワード、編集制限をかける場合は書き込みパスワードという感じで使い分ける感じかと思います。

セキュリティ目的であれば読み取りパスワードのみで良さそうです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/8f95f8e8-cb31-cdbc-1ceb-d48341257b82.png)

## 解除する方法

設定した方法と同様に全般オプションを開くと、設定したパスワードが****となって表示されているので、

設定したパスワードをすべて削除→保存で解除することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/66b196c4-1565-20ed-13ec-462293f74ee2.png)


## おわりに

読んでいただきありがとうございました！

お役に立てれば幸いです。
DHCP/IP固定変更スクリプト

```

@echo off
echo DHCP/IP固定変更スクリプト

:: 変数設定
set IFNAME="ワイヤレスネットワーク接続"
set IPADDR="xxx.xxx.xxx.xxx"
set MASK="xxx.xxx.xxx.xxx"
set GW="xxx.xxx.xxx.xxx"
set DNS1="xxx.xxx.xxx.xxx"
set DNS2="xxx.xxx.xxx.xxx"
set LOGFILE="%~dp0network_config_log.txt"

:: 管理者権限チェック
whoami /priv | find "SeDebugPrivilege" > nul
if %errorlevel% neq 0 (
    powershell start-process "%~0" -verb runas
    exit
)

:: 現在の設定をログファイルに保存
echo [変更前の設定: %date% %time%] >> %LOGFILE%
ipconfig /all >> %LOGFILE%
echo. >> %LOGFILE%

:: モード選択
set /p MODE="IP設定を選択してください (1: 固定IP, 2: 動的IP): "

if "%MODE%"=="1" (
    echo 固定IPに設定中...
    netsh interface ipv4 set address name=%IFNAME% static %IPADDR% %MASK% %GW% 1
    netsh interface ipv4 set dnsservers name=%IFNAME% static %DNS1% primary validate=no
    netsh interface ipv4 add dnsservers name=%IFNAME% %DNS2% index=2 validate=no
    echo 固定IP設定が完了しました。
) else if "%MODE%"=="2" (
    echo 動的IPに設定中...
    netsh interface ipv4 set address name=%IFNAME% dhcp
    netsh interface ipv4 set dnsservers name=%IFNAME% dhcp
    echo 動的IP設定が完了しました。
) else (
    echo 無効な選択です。スクリプトを終了します。
    pause
    exit
)

:: 新しい設定をログファイルに保存
echo [変更後の設定: %date% %time%] >> %LOGFILE%
ipconfig /all >> %LOGFILE%
echo. >> %LOGFILE%

:: 表示
echo 設定変更後の情報:
ipconfig /all
pause

```
声優・本渡楓に学ぶ、ALTの使い方

## はじめに

最近X（Twitter）では、ALTについてよく隠しテキストとしてハック的な使い方がされています。使い方としては、ライブ終わりなどの写真を載せてその中に感想を書くという、140文字しか書けてないという制約をうまく回避するために使われているやり方です。百歩譲ってプライベートでXを利用している人はまだいいですが、タレントなどお仕事としてXを利用されている方はぜひそのような利用の仕方をさけてもらいたいです。

つい先日もとある声優の方がALTをそのような隠しテキストとして利用してしまい、物議を醸しました。その中で、「声優の本渡楓さんと諏訪部順一さんのALTの使い方が素晴らしい」という情報を発見しました。

・https://x.com/Hondo_dagaya_/status/1865718830791868914
これが、本渡楓さんのX（Twitter）です。
・https://x.com/MY_MURMUR/status/1858848649717182951
こちらが諏訪部順一さんのX（Twitter）です。

（※この記事では念の為、Xの埋め込み機能で該当のポストを表示しないようにURLのみ載せてもらっています。万が一にも事務所の方から転載であると指摘されないようにです。）

このお二方は、常に自分の投稿にALTをつけています。本当にすばらしいなと思います。今回は、とりあえず本渡楓さんにしぼって、紹介したいと思います。

## ALTが説明と気持ちを表している

・https://x.com/Hondo_dagaya_/status/1865718830791868914

例えばこのポスト、もし自分であれば、「自撮り」とか「〇〇の服を着てます」だけしか書かないかもしれません。でも、本渡さんは「どんな状態なのか」「何を着ているのか」をちゃんと説明しています。しかも、「ベルトを通し忘れている」という、無くても伝わる情報だけどあることによってユーモアが伝わってくる情報も加えています。

ファッションの情報も、アピールしたいものを重点的に書いています。

・https://x.com/Hondo_dagaya_/status/1865717303788417086

例えばこれなんかも、自分の着ているファッションの簡単な説明に加えてどんな状態なのか、そして感想も加えています。

・https://x.com/Hondo_dagaya_/status/1857795788031799406

こちらも自撮りですが、何の時に撮ってる自撮りなのか、そして髪型まで情報を加えています。

・https://x.com/Hondo_dagaya_/status/1854111655942336611

こちらは何かの作品のコラボドリンクを頼んだ時のポストのようですが、画像全部を細かに説明するわけでなく、自分が関わるキャラにだけ簡易的な説明をつけています。

これらの本渡さんのポストを読んで、ALTはただの画像の説明というわけでなく、その日その時その場所で伝える情報が変わるものだと、改めて感じることができました。自分は近視以外に目の障害はないので本渡さんの顔ははっきりと見えるのですが、もし見えない方でもこのALTの説明をスクリーンリーダーで聴けば、本渡さんがどういう人なのかとかがわかり、本渡さんのX（Twitter）を楽しめるのではないかと勝手ながら思いました。

## 画像を気持ちで表現しろ

「〇〇のツールを導入してアクセシビリティに対応しました」などの企業が最近増えてきました。アクセシビリティに関心を持つことは大変いいことだと思います。
ただ、そのように紹介されているサイトの商品画像を見ると、

![ぱくたそからダウンロードした、ネックレスの画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267174/e4973c11-d9a8-d253-2dba-6e4e9741278c.jpeg)

「ネックレス商品名」のように、全てのその商品の画像にaltがついていました。その商品の説明、本当にそれだけでいいんですか？そのネックレスの輝きとか、画像から伝わる情報を精一杯伝えようとしなくていいんですか？

とある飲食店のECサイトには、バーガーセットA（バーガー含め全て仮名）というものがあり、バーガーセットAの画像には「バーガーセットA」とだけしか全ての画像につけていませんでした。もっとどんんな商品かとか説明しなくて本当にいいんですか？

https://qiita.com/shamokit/items/368566bef4691fb3562f

先日こちらの記事を読んで、Apple StoreのALTが素晴らしいと読んでさすがだなと感心しました。文字だけでデザインのイメージが伝わってきました。iPhone 16 Proの商品画像は複数ありますが、それら一つ一つにちゃんと丁寧なALTがついていました。

あなたが例えば画像が全くない環境で文字しか読めないWebの世界にいたと仮定してください。「バーガーセットA」としか書いていない商品と、「北海道産のじゃがいもを使ったほくほくのポテトとオージービーフ100%の牛肉を使ったジューシーなハンバーガーのセット」、どちらの商品が買いたいですか？

その画像を撮った人の気持ちと同じ気持ちになって、ALTを書いてみてください。

## 声優さんへ

もしこの記事を読まれている声優の方がいらっしゃったら、ぜひ本渡さんみたくALTを利用してみてください。スクリーンリーダーはあなたの声では読んでくれませんが、もしかしたら読んだ方の頭の中ではあなたの声で再生されるかもしれません。

もしあなたの投稿した画像にALTをつけたら、より多くの人にあなたがどういう人なのかが伝わるかもしれません。ライブの感想とかでなく、今日の服装とかもいいです。どんなこと書けばいいか迷うなと思ったら、本渡さんのポストを参考にしてみることをおすすめします。

ちなみに、ALTをハックしてライブの感想とか長文ポストするぐらいだったら、絶対にブログに書いたほうがいいです。noteとか使ったほうが、たくさんの文章量書くことができて、X（Twitter）よりも絶対に書きやすいです。ALTに長文書く熱量があれば絶対にかけます！ブログに書けばあとからみんなが振り返りやすいです。あなたがやりたいことはALTでなく、画像に紐づく感想なのだから！はじめよう、ブログ！

## 終わりに

本渡楓さんのポストを通して、特にSNSでは個を表現するためにもただの説明だけに終わらせず、何を伝えたいのか、その気持ちが非常に大事だと思いました。最近アクセシビリティに関して受発信するようになり考えたのが、アクセシビリティは技術以上に誰に何を伝えたいかが大事って思いました。その、「誰に何を伝える」のあとに技術がついてくるものだと思いました。

声優って文字情報を音声情報に起こして表現するプロなので、本渡さんのそのALTを通して自分の写真を伝える表現力はとてもすばらしいと思いました。

## 参考
本渡楓さんX（Twiiter）
https://x.com/Hondo_dagaya_

諏訪部順一さんX（Twitter）
https://x.com/MY_MURMUR
世界中の天才エンジニアを集めてWEB制作会社にシステム開発部を作りました

## 代表の夢を叶えるために
代表の夢は、「人類知の拡張」と「宇宙開発」
膨大なデータと知識が生まれる現代において、単に知識を記録するだけではなく、それを拡張し、次元を超えた価値を創造することが求められています。技術と創造の力を駆使して、知識の新たな可能性を切り拓くべく、夢に共感した世界中のとんがったシステムエンジニアを集めてシステム開発部を発足させました。

## 多様性こそが最強の武器

「世界中の天才を集め、従来の枠組みを超えるシステムを創造する」というビジョンのもと、私たちは革新的な自社システム開発部を設立しました。この開発部は、実に10カ国以上から集結した、独創的な発想と卓越した才能を持つ天才たちによって構成されています。各メンバーが持つ多様な文化的背景と専門的な視点を最大限に活用することで、現代社会が直面する複雑な技術的課題に対して、革新的なソリューションを提供することを目指しています。MITの優秀な学生たち、ハードウェアの専門家、ソフトウェアアーキテクト、セキュリティの権威など、それぞれの分野で卓越した実績を持つトップエンジニアや研究者が、世界中から私たちのビジョンに共鳴して集まってきました。

### なぜこの人材か

1 . 異なる文化や価値観を持つメンバーが集まることで、従来のアプローチでは見逃されがちな斬新なアイデアが生まれます。各メンバーのユニークな経験と視点が、革新的なソリューションの創出を可能にしています。

2 . 世界各地で最前線に立つエンジニアたちが、それぞれの地域で培った最先端技術と知見を持ち寄ることで、従来の枠組みを超えた画期的なシステム設計が実現可能となります。この知識の融合が、私たちの競争力の源となっています。

3 . 世界中に戦略的に配置されたメンバーたちにより、24時間365日途切れることのない地球規模のリレー開発体制を確立しています。これにより、プロジェクトの進行が一瞬たりとも停滞することなく、常に最大の効率で前進し続けることが可能となっています。

## 寝る暇などない激務
「年齢と当たり前は壊せ！」という力強い言葉から、私たちの挑戦は始まった。この言葉には、既存の概念や制限に縛られることなく、革新的なソリューションを追求する私たちの決意が込められている。

徹底的な業務効率化の結果、一人あたり月15件という驚異的な案件処理能力を実現し、24時間365日、どんな緊急事態にも即座に対応できる体制を確立した。この数字の背後には、チーム全体の絶え間ない努力と革新的な工夫がある。

私たちの日常では、睡眠すら贅沢品となり、時には眠気の存在さえ忘れてしまうほど、頭の中はセキュリティの脆弱性分析で満ち溢れている。それは単なる仕事以上の、完全な没頭状態だ。常に大量の重要タスクを抱え、業界最高水準の品質と精度が求められ、わずかな失敗も許容されない環境で働いている。NFTの運用ミスに起因するセキュリティ侵害の徹底的な追跡調査や、極めて機密性の高い政府関連のセキュリティシステムの構築、複雑な技術的負債を抱えたLaravelプロジェクトの再構築など、事業開始からわずか数ヶ月という短期間で、数々の重要かつ挑戦的な案件を任されることとなった。

誰も前例のない問題に立ち向かうということは、必然的に自身の時間や体力、時には精神的な余裕までも犠牲にせざるを得ない状況を生む。しかし、このような極限状態こそが、技術的スキルや実践的な経験値を驚異的なスピードで向上させる最高の機会となる。私たちは、こうした困難な仕事に真正面から取り組み、それを乗り越えていく過程で、目に見える形で自己の成長を実感できる。さらに、世界中の優秀なエンジニアたちと切磋琢磨しながら、技術の最前線で戦えることこそが、この激務の中に見出せる最大の魅力なのだ。

## どんな開発部にしたいか？
子供のような好奇心と探究心を忘れることなく、世界中を旅しながら、様々な文化や視点に触れ、そこで出会う多様な課題を革新的な技術で解決できるような開発部を目指しています。私が小学生だった頃、エンジニアという職業に初めて興味を持ったのは、アクセンチュアから転身し先生の話を耳にしたときでした。その時に感じた感動と可能性を胸に、私たちの開発部もグローバルな影響力を持つ組織へと成長させ、次世代のエンジニアたちに夢と希望を与えられるような存在になりたいと考えています。

## 最後に
世界一の受託企業を作るために、必死に頑張ります！
長文読んでいただきありがとうございました
BigQuery のタイムトラベルで、しゅっとテーブルを戻すときによくつかうコマンドサンプル

公式ドキュメントはこれ

https://cloud.google.com/bigquery/docs/access-historical-data?hl=ja

# bqコマンドで相対指定

ミリ秒で、1日前を指定(-86400000)

```
bq cp --project_id foobar-project \
foobar-dataset.foobar-table@-86400000 foobar-dataset.foobar-table
```

ミリ秒で、1時間前を指定(-3600000)

```
bq cp --project_id foobar-project \
foobar-dataset.foobar-table@-3600000 foobar-dataset.foobar-table
```

# SQLで絶対指定

```
SELECT
  *
FROM
  foo_dataset.bar_table FOR SYSTEM_TIME AS OF TIMESTAMP("2025-01-01 09:00:00","Asia/Tokyo")
WHERE
  id = 1
;
```
CognitoのM2M認証におけるTokenキャッシュ方式検討

## なぜキャッシュを検討するのか？

2024年7月9日から、CognitoのM2M認証（Client Credentials）が有料になるとの発表があったためトークン発行のキャッシュを検討していたので記事に残しておきます。

これによりAPI利用するシステム単位での固定料金に加えて、トークン発行回数による従量課金モデルになりました。
この従量課金のトークン発行回数のところは、コスト影響が発生するためキャッシュを検討します。

https://aws.amazon.com/jp/about-aws/whats-new/2024/05/amazon-cognito-tiered-pricing-m2m-usage/

## 方式検討

有料化の発表前の5月に公式ドキュメントにAPI Gatewayによるキャッシュの方法が追加されているので、まずはこの方式以外でキャッシュができないか検討します。

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-caching-tokens.html

### 案1：AWS公式のAPI Gateway方式

公式ドキュメントを見る限りは、ざっくりですが以下の通り。

- API Gatewayをプロキシとして採用
- 追加実装はなく、AWSの構成を変更するのみで導入可能
- API Gatewayのキャッシュ機能を利用
    - キャッシュの保持期間は最大1時間
        - CognitoでのToken有効期限は最大24時間なので注意
    - キャッシュするサイズでコストが段階的に決まってくる（記事作成時点の料金）
        | キャッシュメモリサイズ (GB) | 時間あたりの料金(USD) | 月の料金(USD) |
        |:-:|:-:|:-:|
        | 0.5 | 0.028 | 20.832 |
        | 1.6 | 0.054 | 40.176 |
        | 6.1 | 0.245 | 182.28 |
    - API Gatewayのキャッシュサイズは、どれだけトークンをキャッシュするかで判断（私が検討していたシステムでは0.5GBあれば十分そうだった）
        - 1トークンリクエストあたりのキャッシュ対象サイズ
            | ヘッダー(byte) | ボディ(byte) | 合計(byte) |
            |:-:|:-:|:-:|
            | 779 | 779 | 1,558 |
        - API利用のシステム最大数（キャッシュサイズごとのトークンキャッシュ上限）
            | MAX0.5GB | MAX1.6GB | MAX6.1GB |
            |:-:|:-:|:-:|
            | 344,590 | 1,102,687 | 4,203,996 |
    - Token発行時にキャッシュが応答した場合、Token内の有効期限が正しくないという点は理解しておく必要がある
        ```
        HTTP/1.1 200 OK
        Content-Type: application/json
        {
            "access_token": "eyJra1example",
            "token_type": "Bearer",
            "expires_in": 3600  ← ここのこと
        }
        ```

### 案2：API Gateway＋Lambda＋DynamoDBの方式

- Cognitoのトークン発行をLambdaでプロキシ
- クライアントIDごとにTokenをDynamoDBに保持
- DynamoDBで発行時間を保持して有効期限内なら利用
- 不要になったデータはDynamoDBのTTL機能で自動削除
- キャッシュ利用時の有効期限管理はLambdaで実装
    - CognitoでのToken有効期限は最大24時間指定可能あるが2時間にしておく
    - 有効期限が1時間以下の場合は新規にToken発行を行う

## ざっくり比較

ざっくりと比較してみましたが、基本的に実装は大したレベルではないので新規導入なら案2の1択かと思います。

既存案件でも、1年間は無償期間は継続しているので基本的には案2で良いかと思いますが、対応できるリソースと期間次第では案1も選択肢になりうるのかなと個人的には思いました。

| 比較項目 | 案1 | 案2 |
|:-:|:-:|:-:|
| 月額コスト | 20ドルちょい | 1ドル未満 |
| 実装要否 | 不要 | 必要 |
| 柔軟性 | 無し | 有り<br>（実装でどうとでも） |
| メンテナンス | 特に無し | Lambdaランタイム更新<br>（2年に1回ぐらい） |
| 実現難易度 | 超容易 | 容易 |

※コストはキャッシュ機能実現にかかわる部分のみです
※コスト算出は私が検討していたシステムを基準にしてるので、あくまで参考レベルです。システム規模に応じて算出をしてください。

## 最後に

APIを利用するシステムが社内であれば「絶対にキャッシュして使ってね」という手もあるかもしれないけど、サービスとして提供する場合はそうもいかないですよね。
また、APIを利用するシステムのバグで、なぜか大量にトークン発行をされるというテロに近い行為ができてしますのを避けるためにCognitoのM2M認証を利用する場合はキャッシュの検討を必ずしましょう！

また機会があれば、案2における実装編も書こうと思います。


## 参考サイト

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-pools-define-resource-servers.html#cognito-user-pools-define-resource-servers-about-m2m

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/token-endpoint.html
AWS Lambdaにおける自社ライブラリ作成のヒント

# はじめに

こんにちは。[ピーディーシー株式会社](https://qiita.com/organizations/pdc-ds-dev)の宮原です。
この記事ではAWS Lambda作成時に使いまわせる自社ライブラリ作成のヒントをまとめたいと思います。

# 現状

弊社では100以上のLambdaを作成・運用しています。Lambdaの新規作成時には、最新のソースから必要な箇所や再利用可能な部分を抜き出して作業を開始しています。しかし、以下のような課題が見えてきました。

## 現在の課題

1. **統一された自社用ライブラリの不足**

   - 全てのLambdaで再利用可能なライブラリがなく、毎回手動で調整が必要。

2. **開発効率の低下**

   - 同じコードの重複記述が多く、可読性やメンテナンス性が低下。

3. **ナレッジの分散**

   - Lambda作成は1人で担当することが多く、個人の経験や知見がチーム全体に共有されにくい。

## 改善の方向性

これらの課題を解決するため、以下の取り組みを進めています。

- **自社用ライブラリの作成**
  - チューニングされたコードを共通化し、すべてのLambdaで利用可能に。
- **Lambda Layerの活用**
  - 自社ライブラリをLambda Layerとして各Lambdaに組み込み、開発・運用コストを削減。
- **知見の蓄積と共有**
  - 個々の成果物を取りまとめ、チーム全体で再利用可能な形に整理。

以上の改善方針に基づき、自社ライブラリを作成することで工数削減や品質向上を目指します。

# 具体的には

## 全Lambdaで流用可能な初期化処理

- **context情報の保存**
  - Lambda起動時に受け取るcontext情報(function\_nameやlog\_stream\_nameなど)をグローバル変数に保存
- **ロガーの初期化**
  - printでも構わないが会社固有のフォーマットを使用するなら関数化する
- **Lambda開始時間の保存**
  - Lambdaの制限時間が最長15分のため、起動時間を保存しておきたい

## ロガーの初期化

- **ログフォーマットの定義**
  - Lambdaのログを以下のようなフォーマットとして出力する
    - `[LogLevel] [FunctionName] Message.`
  - 構造化ログ(JSON形式)も検討し、クラウドログ解析ツールとの連携を容易にする

## Secret Managerから秘密情報取得

- **接続先などの情報を取得**
  - Lambdaの環境変数に使いたいSecret Managerの名前を書いて情報取得する
  - boto3等のライブラリを使用する

## RDS/Redshift/DynamoDBなどのコネクション初期化

- **Secret Managerから各種接続先の情報を取得**
  - 上記関数で情報を取得
- **コネクションを作成**
  - 作成したコネクションはグローバル変数に保存
  - リトライ処理を実装(環境変数などでリトライ間隔/回数設定)

## RDS/Redshift/DynamoDBなどのアクセス用関数

- **DBにアクセスする**
  - コネクション・SQLを引数とする
  - 件数が多くなった時ようにログ出力を制限する(費用削減のため)

## メール送信関数

- **メール送信する**
  - エラー検知などでメールを送信する
  - AWS SNS TOPICなどを使用すると手軽

## ユーティリティ関数の定義

- **よく使う関数の追加**
  - nullチェックや桁数チェックなど、プロジェクトでよく使うがデフォルトで定義されていない関数を追加

# 今後の展望

- ライブラリの自動テスト環境の整備
  - ライブラリをアップデートする際の品質担保
- ドキュメント化の強化
  - ライブラリの利用方法やベストプラクティスの共有
- オープンソース化の可能性
  - 汎用的な部分を抽出し、外部に提供することで他社事例から学ぶ機会を得る

AWS Lambdaのライブラリ作成は、効率化と品質向上を目指すうえで重要な一歩となる可能性があります。
この記事が皆様の参考になれば幸いです。
変則型ペアプロが楽しかった話

# はじめに
この記事でお話しする変則型ペアプログラミングは自分のPJでペアプログラミングと呼称していましたが本来のペアプログラミングとは異なる点に
ご注意ください。
プログラミング一年目の新人のお話ですので、生暖かい目でご覧ください。


# 経緯

- リバースエンジニアリングで作成したRAGのコードの知識が十分じゃない、フレームワークを用いて、将来性のあるシステムにしたい！というところからリファクタリングが開始

- 二人で開発を行うことになったもののフレームワークへの知識は
ゼロベースなため、最初の段階でのタスク分割が難しい

# 本来のペアプロと実際に行ったものの比較
| | 本来のペアプロ | 変則型ペアプロ |
|:-:|:-:|:-:|
|役割|ドライバとナビゲータ|ソロプロ×ソロプロ   |
|目的|生産性を向上させる|RAGの知識を増やしつつ開発|
|方法|1つの画面に二人でとり組む|各画面で取り組むのがベース|
|作業時間|タスクが終わるまで通話、画面共有|作業時間を決めてそこで一緒に問題対処

このペアプログラミングは、スポット的なペアプログラミングを
さらに自分たちがやりやすいようにした形のものです。
このペアプログラミングのやり方の要素は2点です。
- 1つのタスクに対し、それぞれが考えたロジックで実装をしていくこと
- 共同に作業をする時間を設定し、進捗報告と問題対処を行うこと

# メリット
- 本来のペアプロと同様に相互チェックができる
- コーディングはソロで,、一緒に作業をするタイミングで
問題対処に取り組むので窮屈な感じがない
- 同じ機能を異なるアプローチで作成しているためどちらかが上手くいかなかったときのリスクヘッジになる
- アプローチ方法の違いがおもしろい
- やっていることが分かるようにコメントを残そうとするのでロジックの整理ができる
- 認識の違いに早く気づくことができる

# デメリット

- それぞれ同時に問題が生じたときに、1つ1つ解決するため
作業の時間がまるまるエラー対処に使われることがある
- 出来上がったもの2つに対し、プロジェクトで使われる成果物は良いほうまたは組み合わせた1つになる
- 生産性(速度)の向上には効果が薄い
- 今回経験豊富なトレーナーがサポートに入ってくれたが、第三者に助けを求めた場合、二つのコードを見る必要があるためサポートする人などの負担が増加する

# 所感

- この変則型ペアプロは新しいものを学びながら作成するゼロベースの開発では理解を深めやすく良いものだと思う
- 一方で成果物を早くあげなくちゃいけない場合や、新人同士の場合は、
そもそものコードのエラーへの慣れが不足していることが多く、
サポートに入れる人がいない場合は難しいと感じる
- ある程度経験を積んだ人の場合だと、モチベーションの低下は防ぎたいけど
ペアプロ導入してみたい、コードレビューが長くなるから減らしたい
といった場合にはこのような形で部分的に導入してみるのもいいのかもしれない
- 教育や研修をする際に、この変則型ペアプロをさせてみてどんな成果が上がるか見てみたら楽しそう

# まとめ
今回の変則型ペアプロは
本来のペアプロの良さである、相互の確認で認識の相違の防止やコードのミスに対処を早急に対処できる点、キャッチアップのロスが少なくなる点はそのままに、
モチベーションの低下を防いだり、広い知識を得たり、上手くいかなかった場合に作り直しをせずに済むというメリットがある方法だったように感じます。
皆様も自分たちがやりやすいように手法をカスタマイズしてより良いプログラミングライフをお過ごしください。
python 文字列の扱い

**文字列の結合**
`+`演算子
```php
str1 = "Hello"
str2 = "World"
print(str1 + " " + str2)
```
```text:出力
Hello World
```
`join`メソッド
文字列のリストを一つの文字列に連結
`" "`にすると、スペースで連結
```php
words = ["Hello", "World", "!"]
result = " ".joins(words)
print(result)
```
```text:出力
Hello World !
```
`format`メソッド
format()の中の順番を{}で指定
```php
name = "John"
age = "20"
str1 = "{0} is {1} years old"
print(str1.format(name, age))
```
```text:出力
John is 20 years old
```

---
**文字列の置換**
`replace`メソッド
```php
fruits = "apple, banana, cherry"
print(fruits.replace("banana", "orange"))
```
```text:出力
apple, orange, cherry
```

---
**文字列の分割**
`split`メソッド
文字列を分割してリストで返す
```php
s = "a b c d e"
print(s.split(" "))
```
```text:出力
["a", "b", "c", "d", "e"]
```


---
**大文字と小文字**
大文字から小文字
```php
s = Hello
print(s.lower())
```
```text:出力
hello
```
小文字から大文字
```php
s = hello
print(s.upper())
```
```text:出力
HELLO
```

---
Ajaxにできること

### Ajaxとは何か
Ajaxとは「Asynchronous JavaScript + XML」の略です。
Asynchronousとは非同期という意味で、簡単に言うと、Ajaxは**ページの一部だけを更新することができる**のです。
SNSなどで、ページの更新をせずにそのままコメントやいいねができるのはAjaxの非同期通信が行われているからなんですね。

---
### 基本的なコード例
以下は、ボタンをクリックしてサーバにデータを送信し、結果を取得する簡単な例です。

![Ajax_qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971166/060aa066-b36f-df76-61c9-daa3b4bbbd80.png)

---
### コードのポイント解説
1. url リクエストを送信するURLです。ここでは /store を指定していますが、実際にはデータを保存するAPIのURLに置き換えます。
2. type リクエストのタイプを指定します。ここではデータを送信するために POST を使用しています。
3. data サーバに送信するデータを指定します。この例では、名前と年齢をキーにして送信しています。
4. success サーバからの応答が正常だった場合に実行される処理です。ここでは応答データを .result クラスのHTMLに挿入しています。
5. error 通信に失敗した場合のエラー処理を記述します。エラー内容をアラートで表示するようにしています。

---
### まとめ
いかがでしたか？ここでは簡単な内容のコードを例にしていますが、Ajaxには他にもいろいろなオプションが存在します。まずはシンプルな内容から試して、非同期通信に触れてみてください！
SPRESENSE usb抜き差しできるCASEの作成

# 記事の内容
spresenseのケースを設計,作成しました。
給電や書き込みのためにUSBケーブルを通せる構造とし
抜き差しも可能としました。

# 構造
筐体：3Dプリンター前提でモデリング
蓋：アクリル(meviyで制作可能)
締結：めねじはインサート

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/3c30e86b-30be-0a61-d154-050241cd4624.png width=620>

# 完成品 ver1
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/bb5dbc29-c322-da55-e8a0-e5b19befa38d.jpeg width=320>
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/69240d37-31cc-0fa4-57b1-33366ad8c90f.jpeg width=320>

# 完成品 ver2
USBケーブルの抜き差しの様子も。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/bdee889b-cfa0-503b-432a-28e4236c0d79.jpeg width=320><img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/98e43d5a-9650-eae3-4b2a-119061c20d2d.jpeg width=320><img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/61346b79-b797-c7b7-cdbd-161927582287.jpeg width=320>



以上
フォームに日付と時刻の形式を表示制御

![202412161625.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971184/0370fa5c-643c-474d-8aa4-db1d870d4cf4.png)
![202412161626.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971184/3a788692-7f8f-5d83-3126-5d0f43508cfa.png)
ついに韻を踏んでくれるAIが登場した

この記事は[株式会社SUPER STUDIO - Qiita Advent Calendar 2024](https://qiita.com/advent-calendar/2024/super-studio)の25日目の記事になります。

今年はなんと言ってもAIについてずっと考えていた年なわけですけど、新しいモデルが出るたびに、数学の問題を解かせたり、専門的な知識を問うたりと、その性能を多方面で皆さんがいろいろ検証してますよね。

僕は、「韻」で検索すると一番上に出てくることでお馴染みの韻ノートという韻検索エンジン（あえてリンクは貼りません。「韻」でググってください）を8年ほど前に開発して以降たくさんの方に使ってもらっているのですが、韻ノートにおいてはAIはまったく使わずに、if文やfor文を並べて同じ韻の単語を出すロジックをゴリゴリと書いているわけです。


そんなわけで、個人的には生成AIに「韻踏んで」って指示を出したらどれぐらいのクオリティで返してくれるかということにはここ数年ずっと興味があって、新しいモデルが出るたびに試してるんですが、GPT-4oまでは正直すごく微妙で、全然使いものになりませんでした。

そこで、じっくり考えてから回答をくれるというChatGPTのo1モデルなら、どないなもんかというのを試してみました。せっかくなので、「クリスマス」で韻を踏んでもらいましょう。

![スクリーンショット 2024-12-26 14.18.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14156/d8420fbc-0d67-cd32-8d7a-cd3f86d3a42a.png)

まずこれは微妙。最後の2文字だけ合わせるパターン。
文章としては一貫性があっていいけど、韻という観点ではレベルが低い。最後の2母音「a a」しか合ってないので、クリスマスなら5母音「u i u a u」をすべて合わせてほしい。

今までのモデルも、こういう感じで返してきてて、ここからどんだけ指導しても上手くなってくれなかった。o1 はじっくり時間をかけて考えてからのこのクオリティなので、フリースタイルの即興性を犠牲にしたということを考慮すると、悪化しているとさえ言える。

じゃあ教育したらどうか。韻とはどういうものかを教えてあげる。

![スクリーンショット 2024-12-26 14.20.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14156/3460cd10-8703-e5f2-889e-8e6976be69ae.png)

おー、合ってる。考え方は合ってる。母音を合わせることを言うよって伝えただけで、理解してくれた。

けどフリヌマスって何やねん。
ほんで、なぜ母音をそろえるのか？のコーナー要らんねん。一時期流行った新書のタイトルみたいな解説コーナー求めてないねん。そんなん説明してる暇あったら実在する単語で探してほしいので、

![スクリーンショット 2024-12-26 14.22.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14156/6568a165-532e-e3d3-d02a-4a3e09a0c2ea.png)

おお！すごい！
これは何がすごいかって、もちろん「振り向かず」って日本語として成立する言葉を出してきてくれたのもすごいけど、「振り向く」っていう動詞を活用して母音を合わせにいってるのがすごい。

韻ノートを含むだいたいの韻検索エンジンでは、この世に存在する名詞をとにかくたくさんデータベースに入れて、ひらがなに変換して、それをさらに母音に変換してそれにインデックス貼って、同じものを出すって仕組みで動くから、動詞を活用した形と踏むってのはなかなかレベルが高い。ほんまにChain-of-Thought感あるというか、人間と同じ思考回路で韻を考えてる感じがしてとても良い。この調子でいってほしいので、

![スクリーンショット 2024-12-26 14.27.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14156/ec068ffc-98f3-acdc-da37-4802ba4c9c31.png)

![スクリーンショット 2024-12-26 14.27.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14156/5fa93ac9-ed28-a668-ac0d-fefce336a017.png)

めちゃくちゃいい。例文まで出してくれた。

けどちょっとストックが尽きてきた感あるな、、、「振り向かず」と「釘打たず」は両方同じような構造やし、その次が「釘抜かず」で、もう「釘」っていう単語を使い回してもうてる。あと釘打ってへんならそら抜けへんよ。

なので、こっちから手助けしてみる。

![スクリーンショット 2024-12-26 14.48.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14156/4eb2c955-5a51-b548-0cac-c09a25b26bfb.png)


受け入れてくれた。素直でよろしい。
不満な点は2点で、
- 例文が微妙
- 「土は踏まないけど韻は踏んでるよ」という粋な発言はスルー

もっかい言うたろ。

![スクリーンショット 2024-12-26 14.49.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14156/df9fe563-16c9-d84c-6afc-4d444de471a3.png)

ありがとう。


![スクリーンショット 2024-12-26 14.49.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14156/554e5416-f5a2-f3d4-6754-51fc000f5840.png)

ありがとう。

メリークリスマス！
vanilla-extractでレスポンシブデザインを実装する

## はじめに
最近、vanilla-extractを用いて開発を始めたので、その際に学んだレスポンシブな実装方法を残します。
本記事は、メディアクエリを設定し、画面サイズに応じてスタイルを変更する方法について取り扱っています。

## 環境
```
Next.js: v14.2.3
@vanilla-extract/css: v1.16.0
```

## 実装
実装例として、画面の横幅によってフォントサイズとカラーが変化するコンポーネントを作成します。

### コンポーネント作成
まず、「サンプル」という文字列を表示するだけの最低限のコンポーネントを用意します。
このコンポーネントは、画面幅に応じてテキストの色とフォントサイズが変化します。
```tsx
// Responsive.tsx
import React from 'react';
import { styles } from './Responsive.css';

export function Responsive() {
  return <p className={styles.text}>サンプル</p>;
}
```
### `Responsive.css.ts`ファイルの作成
続いて、`Responsive.css.ts`ファイルの作成です（ファイル名は任意）。
下記実装のように、`@media`キーをスタイル定義内に記述することによって、メディアクエリを用いたレスポンシブデザインが可能になります。
```ts
// Responsive.css.ts
import { style } from '@vanilla-extract/css';

export const styles = {
  text: style({
    color: '#333',
    fontSize: 12,
    padding: 8,
    '@media': {
      // 画面幅が375px以上の場合
      'screen and (min-width: 374.98px)': {
        color: 'red',
        fontSize: 16,
      },
      // 画面幅が750px以上の場合
      'screen and (min-width: 749.98px)': {
        color: 'blue',
        fontSize: 20,
      },
    },
  }),
};

```
### 動作確認
上記内容を実装した後、実際に画面サイズを変更して、以下の動作を確認してみてください：
- 画面幅が375px以上になると、テキストの色が赤に、フォントサイズが16pxに変化する
- さらに画面幅が750px以上になると、テキストの色が青に、フォントサイズが20pxに変化する

# 参考文献
https://vanilla-extract.style/documentation/styling/#media-queries
よわよわエンジニア、UI・UX修行を始める ~「わからない」と「めんどくさい」はデザインの敵だ~

## はじめに
本記事では、UI・UXデザイン方面でつよつよになりたい筆者が、UI・UXデザインに取り組んでいくなかで身に染みて感じたことを書いています。

## どっちのフォームがいいですか

以下は何らかのサービスに新規登録する場合の入力フォームです。
パっと見で、どちらの入力フォームがより「わかりやすく」、「使いやすい」でしょうか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1062427/c53cdbbf-4cc0-980b-1873-c13fc44ea899.png)

**②のフォームに比べて、①のフォーム、「わからない」し「めんどくさい」のでは？**

**わからない**・**めんどくさい**UI/UXはユーザーの離脱を招く、いわばUI/UXデザインを志す我々にとっての**宿敵**です。
というわけで今回は、この宿敵「わからない」→**認知負荷** 、「めんどくさい」→**インタラクションコスト**のお話です。


## 認知負荷とは？
**認知負荷**とは、ユーザーが情報を処理したり理解したりする際にかかる「頭の中の負担」です。  
UIが複雑だったり情報が多すぎたりすると、ユーザーは何をすべきかわからなくなり、その状況にストレスを感じます。  
そしてストレスを感じたユーザーは、「わかんねえ、知らねえ、や～めた！」と離脱してしまうのです。

### ①の認知負荷がなぜ高いのか

①は、メチャメチャに入力項目が多くてわかりにくいフォームです。 
そしてエラーメッセージは「どの項目がエラーなのかわからない」内容になっています。
また、地味なところですが[登録]や[キャンセル]のボタンも重要度を度外視して全部同じボタンです。  
統一感はあるといえばありますが、ユーザーはどれを押すか **「よく読まないと」** わかりません。  
(ちなみに押し間違いのリスクも高いです。こちらは後述のインタラクションコストに関わってきます。)


### 認知負荷を減らす
②の例では、フォームはユーザー登録に必須の情報(メールアドレス・パスワード)に絞って情報量を減らしています。  
また、エラーメッセージは該当するフォームの色を変えつつ、すぐ近くに具体的なエラー内容を表示することで、ユーザーがエラーの内容と場所をすぐに把握できるようにしています。  
そして、ボタンも[登録]と[アカウントをお持ちの方はこちら]に絞ったうえで、より優先度の高いボタン(登録)を最も目立つデザインにしています。

## インタラクションコストとは？
**インタラクションコスト**とは、ユーザーがタスクを達成するために必要な「時間と労力」です。
クリック、スクロール、フォーム入力などの操作全体にかかる物理的な負担が多いと、ユーザーはタスクを達成するのに無駄な労力を割かされるためストレスを感じます。  
そしてストレスを感じたユーザーは「だる。めんどくさ。や～めた！」と離脱してしまうのです。


### ①のインタラクションコストがなぜ高いのか

大量のフォームがあることにより、まずユーザーは大量の情報入力を強いられます。  
そしてフォームの多さゆえにスクロールの手間も発生します。  
スクロールしながら頑張って入力して[登録]を押したユーザーですが、どこかに入力のエラーがあったようです。何故か新規登録画面に戻され、頑張ってスクロールしていくと「入力内容にエラーがある」というメッセージが一番下に表示されています。  
そしてユーザーは、どの項目に入力エラーがあったかを、今度は画面を上にスクロールしながら探していく羽目になるのです。
ただ登録したいだけなのに、**めんどくさいですよね。**

### インタラクションコストを減らすには

②の例では、ユーザー登録に必要な最低限の情報のみをユーザーに入力させるようにしています。  
「ユーザー登録には名前とか住所とか必要なのでは？」と思うかもしれませんが、それらはユーザーが実際に登録を行った後に確認メールを出して、そのリンクを押させた後にでもやってもらえばいいのです。  
結果的にユーザーの入力量は同じかもしれませんが、まず登録のハードルを下げることが大事かなと思います。登録すらしてくれなかったら、**そのユーザーはサービスの顧客になってくれません。**  
とはいえ、クリック量やページの遷移量があまりにも多いと、インタラクションコストが上がってしまうので、わかりやすさとのトレードオフにはなります。

## 認知負荷とインタラクションコストの違い
|  | 認知負荷 | インタラクションコスト |
|---|---|---|
| **焦点** | 頭の中で考える労力 | 実際の操作にかかる労力 |
| **例** | ラベルやボタンの意味を考える | クリックやスクロールの回数 |
| **解決策** | 情報を整理して直感的に理解しやすくする | ステップを減らして操作を簡単にする |

なお、**インタラクションコストが高いと、認知負荷も高くなりやすい**です。例えば、不要なクリックや入力が多いと「次に何をすればいいのか？」と迷い、認知負荷が増します。
逆に、認知負荷が高いUIは操作ミスが増え、結果的にインタラクションコストが高くなることがあります。(①のボタンの例ですね！)

## まとめ

認知負荷とインタラクションコスト。どちらも減らすことを意識することで、ユーザーが迷わず、気持ちよく利用できるサービスを提供できます。
「わからない」と「めんどくさい」を排除して、**「シンプルで直感的なデザイン」** を目指したいですね！
第6章 はりのたわみと不静定はり 基本事項1 p155「材料力学演習(20221021)」

 # オリジナル
[基本事項1(はりのたわみ) p155 (pdf)](http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=160)＜[「材料力学演習(20221021)一括(ver.3.3)」を勉強したい。#sympy](https://qiita.com/mrrclb48z/items/c3274daf5f7a99cfe027#%E4%BD%9C%E6%A5%AD%E4%B8%AD%E7%A7%81%E3%81%AE%E8%A7%A3%E7%AD%94sympy)
り
１. はりのたわみを支配する微分方程式
```math
\dfrac{d^{2}y}{dx^{2}}=-\dfrac{M}{EI_{z}}
```
２. (勉強中)

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342) 　開発環境

# いつもと違うおすすめです。
#### wikipedia

https://en.wikipedia.org/wiki/Euler%E2%80%93Bernoulli_beam_theory

https://ja.m.wikipedia.org/wiki/%E5%BC%BE%E6%80%A7%E6%9B%B2%E7%B7%9A%E6%96%B9%E7%A8%8B%E5%BC%8F#%E3%81%9F%E3%82%8F%E3%81%BF%E3%81%A8%E3%81%9F%E3%82%8F%E3%81%BF%E8%A7%92

#### Qiita

https://qiita.com/mrrclb48z/items/fd086c23db348ff1143c
Workato：カスタムアクションの追加方法（Jira DataCenter REST APIを例に）

# はじめに

Workatoでアプリケーションと連携する際、アプリケーションのコネクタ上に使いたいAPIエンドポイント（メソッド）に対応するアクションが提供されていない場合があります。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/796adc6b-242a-6188-9389-6d29a8022ed3.png">

このような場合は、カスタムアクションを利用することで、任意のAPIエンドポイントに対するリクエストに対応したアクションを実装することが出来ます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/f260a18b-46d0-3c8e-3af0-9ebb31c4c7d2.png" width="300">


# カスタムアクションを利用するメリット

カスタムアクションでは、任意のエンドポイント（メソッド）に対するAPIリクエスト（HTTPリクエスト）に必要なパラメータを設定し、そのパラメータをもとにAPIリクエストを行うことができます。

この機能はHTTPコネクタと同様ですが、**コネクション設定時に接続した際の認証情報が使用される（使用できる）** 点で大きな違いがあります。

このため、レシピ開発者（レシピビルダー）はアプリケーションの認証処理のことを考えることなく、簡単に任意のエンドポイントに対するAPIリクエストを行うことができます。

例えば、アプリケーションのAPIトークンをカスタムアクションのために個別に取得して設定する、あるいはOAuthクライアント設定をアプリケーション側で行いOAuth2認証を行う、アプリケーション独自の認証フローに対応した実装を行うなど、認証に係る対応をレシピ開発者（レシピビルダー）側で別途行う必要はありません。

# 手順

::: note

今回は、Jiraコネクタと、Jira Data Center REST APIの「Add worklog」エンドポイントを例に、手順の説明を進めていきます。

https://docs.atlassian.com/software/jira/docs/api/REST/7.3.3/#api/2/issue-addWorklog

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/d08b40e8-c168-c632-7e66-4c185fffeea5.png)

:::

## 1.コネクタを追加し、「Custom action」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/b69d31d4-3c08-e48b-a02b-357c8f249c36.png)

## 2.「setup manually」をクリックします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/53903fa3-5383-bb94-1f8d-ac05ce75afea.png" width="300">

## 3.ドキュメントを参考に、メソッドを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/4b02664b-16e2-0430-1166-8ae35d36c9f2.png)

## 4.ドキュメントを参考に、パスを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/73041975-532b-3470-ccbc-fbfe2a65cafb.png)

## 5.ドキュメントに記載のパラメータのサンプル（EXAMPLE等）を利用して、次の手順で入力スキーマを生成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/7d539a44-aa2b-0b7b-d176-1152d03de263.png)

## 6.入力スキーマが生成されたことを確認し、各フィールドへ値またはデータピルをセットします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/0421fc78-08a6-a79e-0da0-fe8b8f1c7088.png)

## 7.手順5と同様に、出力スキーマを生成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/1268f843-ccf8-2a6f-8311-4ad92aef86d8.png)

## 8.出力スキーマが生成されたことを確認します。

出力スキーマに追加されたフィールドは、後続のアクションで使用することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/ca492418-c2b8-560c-b8f1-47591afe1a75.png)



# 参考情報

https://docs.workato.com/ja/developing-connectors/custom-actions.html