OmniAICreator/Qiita-1.07M huggingface dataset:
labwcでCaps LockキーをCtrlキー化する方法

11月に入って新規にRaspberry Pi 5のセットアップしていたら、なんかwayfireの設定ファイルが見つからない、何故だ！？　と、調べていたら、[このような記事](https://www.raspberrypi.com/news/a-new-release-of-raspberry-pi-os/)がありました。要するに wayfire がいまいちなのでお払い箱にして labwc に切り替えましたとのこと。

wayfire になったときに、X11での Caps Lock キーの Ctrl キー化が使えなくなって、wayfire.ini の設定でやることになったわけなんですけど、今度の labwc ではどうやるんだい？　ってことで調べました。

labwc でのデフォルトのキー配列は GB になってしまうようです(/etc/xdg/labwc/environment 参照)。なので、たいていの日本人は、`raspi-confug` などでキーボード設定をすることになるのですが、キーボード設定を完了すると、 `~/.config/labwc/environment` ファイルができて、ここにキーボード設定の内容が反映されているはずです。もし無い場合は `~/.config/labwc/environment` ファイルを自分で作りましょう。

この `~/.config/labwc/environment` ファイルに以下の設定を加えることで、Caps Lock キーを Ctrl キー化できます。

```
XKB_DEFAULT_OPTIONS=ctrl:nocaps
```
Caps Lock キーと Ctrl キーを入れ替える場合には次のようにします。

```
XKB_DEFAULT_OPTIONS=ctrl:swapcaps
```

設定を反映するには再ログインするか、以下のコマンドを実行します。

```sh
labwc --reconfig
```
ムーアの法則とは？

ムーアの法則とは、コンピュータに含まれる論理回路の数が飛躍的に増加するという経験則です。ムーアの法則はスマートフォン、パソコンといった身近な製品から、生成AI、ドローン、人工衛星といった最新の科学研究まで幅広い分野に影響しています。この記事では文系の新入社員向けにムーアの法則を紹介します。


![101_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/1f2d2898-2aab-25f1-b16f-7289f3bfaec1.png)

## ムーアの法則とは

ムーアの法則は 1965 年に米国インテル社のゴードン・ムーア氏が提唱した考え方です。彼は「コンピュータのチップ（半導体）の部品数は約2年ごとに2倍になる」と予想しました。

:::note
より正確に言うと、1965年時点は「毎年2倍で成長する」と予想し、1975年に「2年毎に2倍になる」と修正した。
:::

インテル社をはじめ、数多くの会社がムーアの法則を目標にした結果、コンピュータの性能が指数関数的に進化し、私たちの生活が便利になりました。

例えば、20 年前の携帯電話は通話や簡単なメールしかできませんでした。現在のスマートフォンは写真を美しく加工したり、動画を編集したり、AIと会話ができるようになりました。

## ムーアの法則の具体例

ここからはムーアの法則によってコンピュータの性能がどの程度向上したのか、具体的な数字を使って説明します。

### プロセッサのトランジスタ数
1971年に登場したインテルの最初のマイクロプロセッサ「4004」はトランジスタ数が約2,300個でした。2023年のインテルの「Xeon W-3400 プロセッサ」はトランジスタ数が 440 億個に増えました。また数が増えただけでなく、一つ一つの部品の動作速度（クロック速度）も速くなりました。これにより計算速度が飛躍的に向上し、複雑な処理が可能になりました。

![104_プロセッサのトランジスタ数の推移.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/a85fcec7-3984-4f4f-f5aa-cd1e281b4a99.png)

### メモリの容量
ムーアの法則はメモリの容量の増加にも影響しています。1990年代にはパソコンの標準的なRAM容量は4MB～8MB程度でした。2020年代には一般的なノートパソコンで16GB（16,000MB）以上のRAMが搭載されています。これにより動画編集や3Dゲームなど、大量のデータを扱う作業が可能になりました。

![124_メモリチップの容量の推移.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/5dcaf50f-9a06-304e-4d1d-d0fbb21e5aef.png)

### GPU（Graphics Processing Unit、グラフィックス処理装置）のトランジスタ数
1990年代のGPUには数百万個程度のトランジスタが搭載されていました。2020年代の高性能GPUには数百億個のトランジスタが搭載されています。これによりレイトレーシングや流体計算などのよりリアルな3Dレンダリングが可能になり、また科学シミュレーションや人工知能（AI）モデルの学習など、大量のデータを扱う計算が可能になりました。

![114_GPUのトランジスタ数の推移.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/f01da810-f886-0e1c-b424-7776153eefd4.png)

### デジタルカメラの画素数
デジタルカメラもムーアの法則の影響を受けています。2000年代初頭のデジタルカメラは、画素数が100万～300万画素程度でした。現在のスマートフォンには、1億画素を超えるカメラセンサーが搭載されるモデルもあります。トランジスタ数の増加により、高性能な画像処理チップが小型化され、より高解像度の写真や動画が撮影可能になりました。

![154_デジタルカメラの画素数の推移.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/a52c8ccc-1a5e-6326-4c6c-e83b0cf2ca04.png)

### スーパーコンピュータの計算能力
スーパーコンピュータの計算能力（FLOPS: 1秒間に実行できる浮動小数点演算回数）は、ムーアの法則に従って指数的に進化しています。1990年代のスーパーコンピュータは、数十ギガFLOPS程度の性能でした。2020年代の「富岳」などのスーパーコンピュータは、**1エクサFLOPS（= 10¹⁸ FLOPS）**を超える計算能力を持っています。これにより、気象予測や薬の開発、宇宙シミュレーションなどの分野で革新が起きています。

![134_スーパーコンピュータの計算能力の推移.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/8090a93b-8d08-ffd6-a293-9c2ef43ebf7b.png)

## ムーアの法則の限界について
ムーアの法則によればコンピュータの性能は約 7 年で 10 倍になります。過去 50 年間にわたって法則を達成し続けた結果、次のような物理的な限界が指摘されています。
- トランジスタのサイズを無限に小型化することはできない。（原子サイズの限界）
- 微細化に伴う発熱問題や製造装置のコストの増加

実際に2010年代以降は「性能が2倍になるペース」が遅くなってきています。それでも、科学者やエンジニアたちは新しい技術（チップレット技術や3D積層チップ等）を生み出し、この法則に近づけようと頑張っています。

## さいごに
2024年のノーベル物理学賞は「機械学習」の基礎に関わった2人、ノーベル化学賞は「AI予測」を使ってたんぱく質の構造予測に成功した研究者ら3人が選ばれました。この記事では IT 分野のノーベル賞受賞をお祝いして、コンピュータの性能向上の源泉であるムーアの法則について紹介しました。

## 参考文献
https://en.wikipedia.org/wiki/Transistor_count

https://en.wikipedia.org/wiki/List_of_image_resolutions_used_in_digital_cameras

https://top500.org/lists/top500/

https://www.nikkei.com/article/DGXMZO84877180W5A320C1000000/

https://pc.watch.impress.co.jp/docs/column/ubiq/1488545.html
ブロックチェーン社会実装のための基礎知識概論〜既存システムの仕組みと制約(データと所有権)〜

# 第１章　既存システムの仕組みと制約

本章ではまず最初に、従来のサーバ型システムやデータベースがどのように構成されているのかを解説し、それらが抱える制約を明らかにします。単一障害点や冗長性、データの所有権問題など、ブロックチェーン技術が克服しようとする課題を理解することから始めます。


## 1-1.データと所有権

「データの所有権」というテーマは、現代社会においてデジタル情報の価値と利用が急速に拡大する中で、非常に重要な議論です。このテーマには、法的な観点、技術的な観点、倫理的な観点が絡み合っており、データの取り扱いにおける新たな枠組みを考えるための基盤となります。

### データの無形性と所有権の問題

物理的な財産における所有権は、長い歴史の中で法的に確立されてきました。土地や建物、車といった物理的なものは、所有者がその物に対して排他的な支配権を持つと認識されています。しかし、デジタルデータは無形であり、複製や共有が簡単にできるという特性を持っています。このため、物理的な財産と同じ枠組みでデータを所有することができるかという疑問が生じます。

たとえば、デジタルファイルは一瞬で無数にコピーでき、他者に渡しても元のデータは残ります。このため、ある人がデータを所有していると言っても、他者がそのデータを同時に持つことが可能であり、物理的な所有物と同じ感覚で「排他性」を伴った所有権を主張するのは難しいです。物理的なものに適用される「所有権」の概念は、データのような無形財産にはうまく適合しないのです。

### データのライセンスと利用権

データの所有権が存在しないという考え方の延長線上で、私たちは「利用権」や「ライセンス」に目を向ける必要があります。例えば、音楽や映画、ソフトウェアは消費者に「所有」されるのではなく、利用する権利が与えられています。つまり、ユーザーはそのデータを使用するための権利を取得し、その使用方法や範囲は契約やライセンスに基づいて規定されています。

これにより、データの所有権が曖昧であったとしても、利用権の枠組みを通じてその価値や使用に対するコントロールが可能になります。著作権や特許権も、このような利用権の一形態であり、特定のデータの使用方法や再配布を制限するための法的な枠組みです。

### 個人データとプライバシー

一方で、個人データに対して「所有権」を認めるべきだという議論もあります。個人データは、その人のプライバシーやアイデンティティに直結しているため、これを他者が無制限に利用できる状況は倫理的にも問題があるとされています。しかし、個人データも物理的な所有物のように扱うことは難しいです。個人が自身のデータに対して排他的な支配権を持つことができるかどうかは、技術的にも法的にも曖昧な部分があります。

実際に、多くのインターネットサービスでは、ユーザーが提供した個人データを企業が収集し、分析、販売しています。このような場合、企業がそのデータを「所有」しているわけではありませんが、その利用に対して広範な権利を持っていることが多いです。GDPR（一般データ保護規則）などの法制度は、個人が自身のデータに対して一定のコントロールを持つための規制を設けていますが、依然としてその権利が「所有権」なのか、それとも「利用権」なのかという点は明確ではありません。

### データの所有権が存在しない未来

ブロックチェーン技術の台頭は、この議論に新たな視点をもたらしています。ブロックチェーンは、分散型のデータベースとして、所有権の概念を超えてデータの管理を行うことができる技術です。データは単一の所有者に帰属するのではなく、分散型のネットワーク全体で管理され、その信頼性や真正性が保証されます。これにより、データが特定の個人や企業に「所有」される必要がなくなり、その価値は全体のネットワークに依存するものとなります。

さらに、ブロックチェーンを活用したスマートコントラクトは、データの所有権ではなく、データの「利用」や「共有」に焦点を当てた契約の自動化を可能にします。このような技術は、データの所有権を議論するのではなく、どのように安全に、透明性を持ってデータを共有し利用するかに焦点を当てる新しい枠組みを提供します。

### 結論

「データの所有権」というテーマは、現代のデジタル社会における根本的な課題を浮き彫りにします。データは無形であり、物理的な所有物と同じように扱うことは難しいです。そのため、データに対する所有権の概念は成立しにくいのです。しかし、利用権やプライバシー保護の観点から、データに対する適切な管理や利用の枠組みを設ける必要があります。ブロックチェーン技術やスマートコントラクトといった新しい技術は、所有権の概念を超えて、データの共有と利用に焦点を当てた新しい未来を築く可能性を秘めています。


---
### バックナンバー

#### はじめに
https://qiita.com/kicnft/items/6036c9455a12e99ab5da

#### 第１章　既存システムの仕組みと制約

https://qiita.com/kicnft/items/6badc48ca775d9d2e8c3
私が既存ソースコードやSQLを読むときに実践している思考整理術

こんにちは
社会人でエンジニア4年目のクラゲちゃんです。

私はよく仕事で上司からこれやっておいて、と渡されたソースコードやサンプルのSQLを読んで、修正やDBからデータを検索することなんかをやる機会があります。

既に仕上がっているシステムの運用的な業務で、
まだ仕様を完全に理解していないけどこういうことを任されることも多いので、
結構複雑なものを読むことも多いんですよね。

頭だけで考えると全くわからん、といった初学者(プロの方や中級者)の方もいるんじゃないかと思い、私がすでに存在するものを解読するときに用いる実際の手法を教えたいと思います。

## 概要

*  日本語化する
(if = もし～ とか SELECT * from tb1 inner join tb2 on tb1.id = tb2.tb1_idはテーブル1とテーブル2をこのidでつなげて～とか)

* メモ帳に書き起こす (私のお気に入りはサクラエディタ)

* 書き起こした後でこれ本当にあってんの？って感じで開発環境とかで実行しちゃう
(UPDATEとかDB書き込みは絶対やらないで)

## 実践編

* 日本語化する
先人の知恵が詰まった、ソースコードとかSQLは、
日本語に分解しましょう
```java
if (変数1 = 1) {
    println("a");
} else {
    println("b");
}
```
これなら、「もし「変数1」が1だったら「a」の文字列が出力されて、「変数1」が1じゃなかったら「b」が出力されるよ～」といった感じ

SQLでよく見る感じを書き起こすと
```sql
SELECT
tb1.*,
CASE
   WHEN tb2.id IS NOT NULL THEN "1"
   WHEN tb3.id IS NOT NULL THEN "2"
   ELSE "0"
END
FROM tb1
left outer join tb2 on tb1.id = tb2.tb1_id
left outer join tb3 on tb1.id = tb3.tb1_id
WHERE
tb1.id => 1 AND tb1.id <= 100 AND delete_flg = 0
GROUP BY tb1.user
ORDER BY tb1.id asc
;
```
これを
* カラムはtb1を全部SELECTしてんなあ～
* tb1とtb2とtb3を外部でtb1のidで紐づけて、tb1のidが1から100の人で削除フラグが立っていない人を出してるな～
* tb1のuserをグループ化してまとめてるなあ～
* ソートはtb1.idの昇順か～
といった感じで、整理します。

複雑なSQLになればなるほど、`サブクエリ→FROM→WHERE`みたいな順番で整理してくのオススメ

* メモ帳に書き起こす

1の頭で考えたものを1と並行してメモ帳に殴り書きします。
テキストエディタはなに使ってもいいんですが、僕は万年サクラエディタの人です。

* 開発環境とかで実行する

整理した後、自分なりに改造や修正ができたら期待する結果になるかバーンっと実行しちゃいましょう。
会社の実務で使うときは必ず他の人に確認してから
(ローカル環境で自己判断で勝手にやる場合は責任取れませんｗ)

ものによってはSELECTだろうと何だろうと、メモリ不足とかで落ちる場合が無きにしもあらずなので、難しいものはパフォーマンスチェックもしましょうね。

## 終わりに

僕はあんまり「新規開発」として触れる機会は少なめのエンジニアなんですが、
運用面でキャリア浅い人とか「いや、これわかんねえよ」っていうのも冷静になってみてみると
意外と単純なことやってるケースが多いですよね。

つなげてるだけなんだよね～実は

ってことで読み物に困ったら実践してみたらいかがでしょうか。

以上～
ElixirでPAY.JPのライブラリ作成シリーズ③ ランタイム設計


https://qiita.com/Yoosuke/private/2b5abd87393f1cc0307a

前回、PAY.JPのライブラリを作成する上で、せっかくElixirで作成するのでLet it crushの思想を受け継いで作ろうと、Let it crushについて説明しました。

今回は、ElixirはなぜそのLet it crushの哲学で作りやすいのかという事についてErlangのランタイム設計について説明していきたいと思います。

## ランタイムとは
ランタイムとは、ソフトウェアやシステムが実行される「動作中の時間」を指します。このため、ランタイム設計とは、プログラムが動作中にどのように振る舞うかを設計するプロセスです

主な役割に、以下があります。
1. メモリ管理
2. プロセス/スレッド管理
3. エラーハンドリング
4. 入出力操作の管理

言語ごとのランタイム設計の違いを見るとわかりやすいかも知れません。

### Java（JVM）の場合
```java
String text = "Hello";  // メモリ確保はJVMが管理
```
* ガベージコレクション
* スレッド管理
* メモリ空間の確保・解放

### Ruby（Ruby VM）の場合
```ruby
array = []  # オブジェクトの生成・管理はRuby VMが行う
```
* オブジェクト管理
* メソッド呼び出しの制御
* メモリ管理

### Erlang（BEAM）の場合
```elixir
spawn(fn -> 
  # プロセス生成と管理はBEAMが担当
end)
```
* 軽量プロセスの管理
* プロセス間通信
* 障害検知と回復

とこのようにランタイム設計が違う事で言語による制約や実装の難易度が大きく変わります。

さて、ランタイム設計による違いとLet it crushの観点から説明すると簡単に言えば、

## 設計思想の違い

設計思想の違いに他なりません。
```
従来の言語：エラーを防ぐことに重点
Elixir/BEAM：エラーを前提とした設計
```
その為、学習コストも他の言語に比べて難易度が下がります。
```
従来の言語：並行処理の深い理解が必要
Elixir：基本的なパターンを学ぶだけで堅牢なシステムが構築可能
```

従来の言語では、以下の観点や実装をする必要があるのに対し、
* エラー処理の実装
* リソースの解放
* デッドロックの防止
* 状態の整合性維持


Elixirでは、以下だけで多くが解決できてしまいます。
* プロセスの定義
* スーパーバイザーの設定

という事で、いよいよ次はLet it crushの哲学で開発を進めていきたいと思います。
【LINE】更新前デフォルト絵文字のダウンロード方法

## ラインのデフォルト絵文字

ラインのデフォルト絵文字が更新されましたね！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571614/2ef1b543-3e83-67ad-6eac-bcd39c9ebb33.png)

新しい絵文字もかわいい👍👍

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

でも前まで使ってたデフォルト絵文字が表示されなくなってしまいました…。
↓こういうの
![1000005643.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571614/f9cbe68d-12c0-c1d7-1055-d8c35abfc158.png)

もともとのデフォルト絵文字を出すためのtipsを紹介します！

### スマホ版
手順：ラインの設定＞ヘルプセンター＞ラインのデフォルト絵文字のリニューアルについて＞スマートフォン版LINEからダウンロードしてください
![1000005644.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571614/bdefceba-0f82-8326-53f9-fbc2d722353c.png)
![1000005645.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571614/1c603755-1fb9-6801-c8fa-92b645839731.png)
![1000005646.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571614/193d9045-1faf-58eb-b5c6-8de2c6e10e7e.png)

下記のURLからもダウンロードできます。

https://liff.line.me/1359301715-JKd7Y7j1/#editorspick/10204

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

### PC版

手順：下記のニュースをクリック＞これまでのデフォルト絵文字からダウンロード

https://linesticker-ja.blog.jp/archives/26057693.html


これまでのデフォルト絵文字に「LINEスタンプショップ内ダウンロードページへ」と記載とされています！
![1000005647.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571614/0b796548-37b6-bc0c-308f-5a211115bff5.png)

下記、URLからもダウンロード可！

https://liff.line.me/1359301715-JKd7Y7j1/#editorspick/10204

---------------------------------------
みなさんもよきLINEライフをおすごしください！
Laravelプロジェクトのセットアップ：Railsとの比較

### はじめに
プログラミング初心者の方がLaravelとRailsを比較しながら学ぶことで、それぞれのフレームワークの特徴を理解しやすくなると思います。この記事では、Laravelプロジェクトのセットアップ手順を中心に説明しつつ、Railsのセットアップ手順との違いにも簡単に触れていきます。

## Laravelプロジェクトのセットアップ
### 1. Laravelの概要
LaravelはPHPで構築されたモダンなWebフレームワークで、MVCアーキテクチャに基づいています。Railsと同様に、Laravelも多くの機能を備えたオールインワンのフレームワークで、Webアプリケーションを迅速に開発するためのツールを提供します。

公式ドキュメント: [Laravel公式ドキュメント](https://laravel.com/docs/11.x)

### 2. Laravelのセットアップ手順
macOSでのセットアップ手順で説明します。
また、以下をインストールした前提で進めます。
- Homebrewインストール済み
- Homebrew経由でNode.js、npm、PHPをインストール済み

#### 2.1 Laravelプロジェクトの作成
Composerをインストール
以下のコマンドを実行してComposerをインストールします（インストール済みの場合はスキップしてください）。

```php:bash
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
```

Composerを使用してLaravelプロジェクトを作成します。

```php:bash
composer global require laravel/installer
composer create-project --prefer-dist laravel/laravel example-app
cd example-app
```

以下各コマンドの詳細になります。

`composer global`: Composerでパッケージをグローバルにインストールします。グローバルインストールされたパッケージは、PC上のどのフォルダからでも、コマンドが実行できる場所に保管されます。

`require laravel/installer`: Laravel Installerというパッケージをインストールします。このツールを使用することで、Laravelプロジェクトを作成できるようになります。

`composer create-project`: 指定したテンプレートから新しいプロジェクトを作成します。

`--prefer-dist`: 配布パッケージ（アーカイブ）からインストールを行うオプションで、必要なデータを効率的に取得します。

`laravel/laravel`: Laravel公式が提供するスタートプロジェクトテンプレート（リポジトリ）を指定しています。

`example-app`: 新しく作成するプロジェクトの名前（ディレクトリ名）です。この例ではexample-appというディレクトリにLaravelプロジェクトが作成されます。

プロジェクト作成後にサーバーを起動します。

```php:bash
php artisan serve
```

起動後、`http://localhost:8000`にアクセスすると、Laravelのウェルカムページが表示されます。


### 3. LaravelとRailsの比較：セットアップ手順



| 比較項目           | Laravel                              | Rails                                |
|---------------------|--------------------------------------|--------------------------------------|
| 言語               | PHP                                  | Ruby                                 |
| 初期セットアップ    | `composer create-project`            | `rails new`                          |
| 必要なツール        | Composer, PHP                       | Ruby, Bundler                        |
| サーバー起動方法    | `php artisan serve`                 | `bin/rails server`                   |
| 設定ファイルの記述  | `.env`ファイルに環境変数を設定       | `config/credentials.yml.enc`などで設定      |

### 4. 注意点

LaravelもRailsも、多機能なフレームワークであるがゆえに公式ドキュメントをしっかり読むことが重要です。特にLaravelでは、ComposerのバージョンやPHPのバージョンに依存する部分があるため、環境構築の際に互換性を確認してください。

### まとめ

LaravelとRailsはどちらも優れたWebフレームワークです。セットアップの違いを理解することで、より深くフレームワークの特性を知ることができます。この記事があなたの学習の助けになれば幸いです。公式ドキュメントも積極的に活用して学びを深めていきましょう。

Laravel:[公式ドキュメント](https://laravel.com/docs)
Rails: [公式ガイド](https://guides.rubyonrails.org/)

## 参考記事

https://kinsta.com/jp/knowledgebase/install-laravel/#macoslaravel
VisualStudioで画面の表示倍率を変更したまま作業するとデザインが崩れる なにもわからない

## はじめに
Visual Studioでは画面の表示倍率（DPIスケーリング）を150%や200%に設定して作業すると、実行時に100%表示でレイアウトが崩れることがありました。

![100%表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568190/85702878-1418-30a1-9145-01eec59f2938.png)


## 原因
### 1.DPI依存のサイズ計算
デザイナーが表示倍率を考慮してボタンやグリッドなどのコントロールの座標やサイズを計算するので、100%表示で意図しないレイアウトになることがあるようです。

### 2.固定レイアウトの設定
コントロールにAnchorやDockの設定が不十分だと拡大縮小に対応できず、デザインが崩れることがあります。

### 3.フォントサイズの変化
表示倍率によってフォントサイズが変化し、ラベルやボタン内のテキストが意図せずあふれることがあるようです。

## 対策
開発時は表示倍率を100%以外にしないのが、楽です。以下のような警告が出ていたら軽くみずに100%に戻しましょう。後悔します。

![150%表示時警告.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568190/fcf88a58-a73f-b85a-4e44-ed31bb794c29.png)
AR.jsを改めて使ってみた

AR.jsとは、WebARを作るための無料で使用できるJSライブラリです。

３年ほど前に、モバイルブラウザ上で動作するARコンテンツの作成をするにあたって業務で使用していましたが、
有料ライブラリの8th wallに比べ、マーカーの認識力、オブジェクトのトラッキング能力が数段階落ちる印象でした。

数年経った今、AR.jsどれほど変化したか（メンテナンス自体行われているのか？）を確かめてみたいと思います

GitHub - https://github.com/AR-js-org/AR.js

AR.jsは元々の開発者が失踪したようで、今は有志によってメンテナンスが行われているようです。
メジャーリリースが2023年4月で、コミットが３週間前なので、あまり活発に更新はされていないかもしれません...

<br>
サンプルを参考にARマーカーを自作し、3Dモデルを表示するように作成しました。

https://github.com/gigadeli/webAR

<br>

実際にiPhoneで動かした様子が以下です
![RPReplay_Final1733057974_1-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625586/53f78560-a67b-35ac-50f9-dad313747f84.gif)

ARマーカーに指定する画像は自由ですが、認識とトラッキングを行う為に黒いフレームをどうしてもつけなければなりません。
画像のみで認識するNFT Image Trackingなるものもありましたが、ローカルサーバーではリソースの読み込みが上手く出来なかったので、今回は断念しました。

## 終わりに

数年経ってAr.jsの技術的アップデートが行われていることを期待していましたが、あまり変わらなかったです...
オープンソースのライブラリに文句を言うのもどうかとは思いますが、商用でWebARコンテンツを作成するなら、素直に8th wallなどの有償パッケージを利用しましょう
WEBデザイン　jQueryでスライドショーを作ろうの途中

1. ポジティブな気づき

・AIメンターよりChatGPTに聞くと違う答えが返ってきた。
例えば、html記述では、以下の通りとなる。
特にを削除し<style></style>の記述をChatGPTが答えを返してきた。
その通りにやったら、ちょっとは良くなった。

<title>スライドショー</title> <style> html, body { margin: 0; padding: 0; } * { box-sizing: border-box; } .slider { width: 50%; margin: 100px auto; } .slick-slide img { width: 100%; } .slick-prev:before, .slick-next:before { color: black; } .slick-slide { transition: all ease-in-out .3s; opacity: .2; } .slick-active { opacity: .5; } .slick-current { opacity: 1; } </style>





<script src="https://code.jquery.com/jquery-2.2.0.min.js"></script> <script src="slick.min.js"></script> <script> $(function() { $('.slider').slick(); }); </script>
css記述では以下の通りとなる。
特にmax-widthやmax-heightは初めての記述となる。

.slick1 {
width: 800px;
height: 600px;
margin: 50px auto;
}

img {
max-width: 100%;
max-height: 100%;
object-fit: cover;
border-radius: 10px;
}

2. 難しかったこと・悩んだこと
・下記の現象が現在進行形であること
・スライドショーができない。
・画像の上に画像が重なっていること

3. その他、考えたこと
・ChatGPTと併用して聞くことができると比較できる
「Electric Sheep 2024」に参加してきました！

## ハッカソン概要

「Electric Sheep 2024」は、全国から集まった学生が参加するSFプロトタイピングハッカソンです。今年のテーマは未来を感じさせる4つの部門が設定されていました：
1. **モビリティ×アドベンチャー**  
2. **Playful ～音を使ったミライの遊び～**  
3. **ミライのスポーツアイテム**  
4. **ミライのグルメ**  

私たちのチーム「Diverse Drivers」は、「モビリティ×アドベンチャー」のテーマで未来のプロトタイプ開発に挑戦しました。

## チーム活動とプロジェクト内容

### **1. チームでの取り組み**
私たちのチームは、全国各地から集まった10人の多様なメンバーで構成され、オンラインでの事前ミーティングからハッカソン初日までアイデアを温めてきました。しかし、初日のアイデアプレゼンでフィードバックを受け、大胆にもゼロからアイデアを再構築することを決断。散歩に出かけ、リフレッシュした後に生まれた新しいコンセプトが「ANIMALink」です。

### **2. 「ANIMALink」について**

- **コンセプト**: 動物との共生をテーマにした未来型モビリティ体験。動物の生理情報や感情を基にユーザーが最適な旅のパートナーを選択し、新しい冒険を体験できます。

<img width=20%><img width=60% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726505/92844a8a-ad56-96c7-246e-8392ad44ad1c.png">

<img width=20%><img width=60% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726505/baf9c509-0c78-e243-e272-46052a1a672a.png">

- **特徴**:
  - **動物とのリアルタイム接続**: 専用デバイスで動物の状態を読み取り、感情を共有
  - **LEDエフェクト**: 視覚的に接続を楽しめる演出を搭載
  - **GUI**: 簡単に動物を切り替え可能な操作性

### **3. 使用技術**
- **ソフトウェア**:
  - 言語: TypeScript
  - フロントエンド: React
  - UIフレームワーク: MUI
- **ハードウェア**:
  - M5Atom、KY-037音声センサー
  - LEDテープ（5m）、3Dプリンターで作成した部品

## ハッカソン当日

#### **Day 1**: アイデア再構築
初日のプレゼン後、既存アイデアを見直し、新たに「ANIMALink」のコンセプトをゼロから構築しました。

#### **Day 2**: プロトタイピング
デバイスの設計からソフトウェアの実装まで一気に作業を進めました。全員で手分けしてモジュールを完成させ、デモを作成。

#### **Day 3**: 発表と懇親会
完成したプロトタイプを審査員に発表しました。その後の懇親会では、他のチームや社会人参加者と交流し、新たな視点を得る貴重な時間となりました。

## 振り返りと今後
### **得られた学び**
- フィードバックを受けて柔軟に方向性を変える力
- 多様なバックグラウンドを持つチームメンバーとの協働
- 限られた時間でアイデアを形にするスピード感

### **今後の展望**
今回得た知見を活かし、さらに挑戦を続けたいと思います。他のテーマにも挑戦することで、広い視野を持ちながら新しい未来を形にするスキルを磨いていきたいです。

## 写真ギャラリー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726505/995dded5-b9d5-5140-ad01-52ef3ea3f32b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726505/25bd61bd-500a-200e-645f-588618e33809.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726505/860854ce-734c-0800-626f-63cadc30d335.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726505/e4b8600d-2a16-9e8c-72e1-a3bf2d091e88.png)

### イベント公式サイト
イベントの詳細はこちらをご覧ください: [Electric Sheep 2024公式サイト](https://www.nagoyatv.com/hackathon-electricsheep/)

未来を描くプロトタイピングの楽しさを存分に味わえた3日間でした！次回もぜひ参加したいと思います。
loading="lazy"で読み込み速度を向上させる

# はじめに
学んだことを忘れないように備忘録として残しています

## loading="lazyとは 
**loading="lazy"** は、HTMLで画像やiframe要素に設定できる属性で、**遅延読み込み**を指定するためのものです。

**遅延読み込み**とは、ページ全体を一度に読み込むのではなく、ユーザーがで必要とするタイミングで画像やiframeなどを読み込む方法で、これによって初回ロード時の読み込み量が減り、ページ表示が速くなります。


## メリットとデメリット
### メリット
- ページの読み込み速度が向上 
遅延読み込みすることで、初回ロード時の読み込み量が減り、ページ表示が速くなります。特に画像が多いページで効果的です。

- SEOへの影響
Googleの検索エンジンはloading=lazyを推奨しており、SEOに悪影響を与えません

### デメリット
- 画像の遅延読み込みをすることに伴って、ページに含まれる要素がずれることもあり、これによって検索エンジンから低評価を受ける

- ファーストビューには適さない
画面を開いた際に最初に見える画像はは早急に読み込むべきなので、遅延読み込みはしないほうが良いです。

## コーディング例
【imgでの使用例】

```html
<img src="" alt="サンプル" width="100" height="100" class="sample" loading="lazy">
```

```html

【iframeでの使用例】
<iframe 
    src="https://www.google.com/maps/embed?pb=!1m18!..." 
    width="600" 
    height="450" 
    loading="lazy">
</iframe>
```


## 使用すべき箇所
- 画像が多いページ
ページ下部やスクロールしないと見えない画像。

- iframe
GoogleMapsやYouTube動画の埋め込み。

- ブログ記事内の画像
記事が長い場合、下部の画像に設定すると効果的。

## まとめ

loading="lazy" は、画像やiframeの遅延読み込みを実現する便利な属性で、ページの表示速度向上に役立ちます。
ただし、すべてのリソースに適用すればよいわけではなく、ファーストビューの重要な画像には適用せず、ページ下部やスクロールしないと見えない箇所に活用するのがポイントです。
Okta Expression LanguageでSSOユーザー名を動的に変更する方法

## はじめに
この記事は[DENSO Advent Calendar 2024](https://qiita.com/advent-calendar/2024/denso)の7日目の記事です。

今回は、Oktaを利用したSSOを管理しているエンジニアや管理者向けの記事です。
Okta から SSO 時に使用するユーザー名を動的に変更したい場合に、それを実現する Okta の機能である Okta Expression Language について紹介します。

## やりたかったこと

状況を下図に記します。Okta に登録しているユーザー名で使用している `domainA` が SSO 先のアプリでは使用できず、別の `domainB` を使用することになった場合を想定しています。

```mermaid
flowchart LR
    subgraph Okta
        A[ユーザー名
        hoge@domainA]
        B[ドメイン部分をdomainBに
        書き換えてSSO]
    end

    subgraph SSO先アプリ
        C[ユーザー名
        hoge@domainB]
    end

    A --> B
    B --> C
```

私が遭遇した場面ではそうではないのですが、社名変更や M&A があった場合などに Okta 側とアプリ側とで使用可能なドメインがズレていることは稀にあるようです。

この際に Okta アプリケーションの設定で、SSO 時に使用するユーザー名を動的に変更することで、SSO 先のアプリ側の制約に合わせて柔軟に SSO 設定を構築できると考えました。

## 設定箇所について

Okta Admin Console 上で、ツリーメニューの Applications > Applications を選択し、設定したい対象のアプリケーションを選択します。その後、アプリケーションの設定詳細画面にて、`Sign On` タブを選択し、`Settings` のカード右上にある `Edit` をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134812/1af297dd-25ae-2261-6885-50e8cf606390.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134812/fb070bce-e8cf-305a-1403-ebd83a98223d.png)

この `Settings` の下部にある `Application username format` が該当箇所です。プルダウンメニューで候補を選択できます。この中から `Custom` を選択すると、SSO 時のユーザー名の設定変更ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134812/857356e7-9d96-87ad-0ae2-4885634efcf5.png)

`Custom` の選択後、`Expression Language Reference` というリンクとともに、`Enter an expression` というプレースホルダーの入ったフォームが出現します。ここに Okta Expression Language で SSO 時に使用するユーザー名を記述すれば良いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134812/062a59da-ac52-79ab-23a5-6cac7947b654.png)

## Okta Expression Language について

上述した Okta Expression Language について簡単に紹介します。

これは、Okta 内でのみ解釈可能な記法で、便利な関数を多く含みます。この関数を使って、今回のやりたかったことのケースの様に SSO 先のユーザー名を動的に変更したり、その他 SSO 時に使用する属性値のうち空だった場合にどの様な値を渡すかの定義をできたりします。

https://developer.okta.com/docs/reference/okta-expression-language/

## 今回のケースでの使用方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134812/dc714497-8494-5844-d98d-7903ebc77e1d.png)

今回は `String.replace` を使いました。使い方や挙動は以下の通りです。

| Function | Input parameter signature | Return type | example | Output |
|---|---|---|---|---|
| String.replace | (String input, String match, String replacement) | String | String.replace("This is a test", "is", "at") | That at a test |

## まとめ

今回は動的にユーザー名を変更したい要望から調査を始め、Okta Expression Language を知り理解を深めることが出来ました。他にも Okta Expression Language を適用して解決できそうな課題があれば試してみたいと思います。
【基本情報】 独学マラソン アーキテクチャ基本 Day 25

:::note worn
この記事は自分用の備忘録です。
:::

## アーキテクチャってなんぞ？

システ構造・構成のこと。

## たとえば？
売店の場合
- ショーウィンドウ
- 厨房
- 食材倉庫

WEBアプリの場合
- 見た目を作る場所（フロントエンド）
- 頭脳の部分（バックエンド）
- データを保存する場所（データベース）

3層アーキテクチャというらしい

## 図で表すと？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736578/7cdaee61-f01c-cb83-4f2e-faaf4ed44c0f.png)

https://pikawaka.com/rails/mvc

MVCもアーキテクチャだった

# 感想
考えるな。感じろ系らしい。アーキテクチャは感じるもの。


# 参考

https://wa3.i-3-i.info/word16015.html
THE S SYSTEM, by John M. Chambers

ACM Software System Award  Calendar 2024
https://qiita.com/advent-calendar/2024/acm
Day 2 1998年受賞　THE S SYSTEM

投稿予定の方は、購読ボタンを押してください。よろしくお願いします。
記事をお読みになられたら、Calendarにあってもいいかなって記事には、いいね💚　をお願いします。

# The S System

S-Plus: An Introduction
https://www.stat.rice.edu/~helpdesk/tutorial/Stut01.html

A Brief History of S
https://web.archive.org/web/20150723044213/http://www2.research.att.com/areas/stat/doc/94.11.ps

macOSでPSファイルを開こうとするとPDFに変換してくれた。

この記事を書くまでは、Sは使ったことがないと思い込んでいた。
Rは、GNU版のSという位置付けかもってなってる。

SAS、SPSSとの関係は調べれていない。SASは、Sを含んでいるらしく、SPSSは含んでいないらしいかもって。

Sを搭載していたGCOSというOSは、NECが引き継いでACOSというOSになったことはWikiには書いてないかもってなっている。

Chemical reaction network decompositions and realizations of S-systems
Honeylou F. Farinas, Eduardo R. Mendoza, Angelyn R. Lao
https://arxiv.org/abs/2003.01503

Structural Properties of an S-system Model of Mycobacterium Tuberculosis Gene Regulation
Honeylou F. Farinas, Eduardo R. Mendoza, Angelyn R. Lao
https://arxiv.org/abs/2001.07702

Species subsets and embedded networks of S-systems
Honeylou F. Farinas, Eduardo R. Mendoza, Angelyn R. Lao
https://arxiv.org/abs/1909.02949

# R
dockerで機械学習(71) with R (1)「入門 機械学習」Drew Conway, John Myles White 著
https://qiita.com/kaizen_nagoya/items/e3722c04ae35e82ecca2

dockerで機械学習(52) with R (2)「データサイエンスのための統計学入門 ―予測、分類、統計モデリング、統計的機械学習とRプログラミング」Peter Bruce、Andrew Bruce　著
https://qiita.com/kaizen_nagoya/items/479e3283a2d030726254

dockerで機械学習(73) with R (3)「RとKerasによるディープラーニング」François Chollet、J. J. Allaire　著
https://qiita.com/kaizen_nagoya/items/57b0d84b3ce4f754485d

dockerで機械学習(74) with R (4)Introduction to Machine Learning with R By Scott Burger
https://qiita.com/kaizen_nagoya/items/be23896636af7a7b014d

dockerで機械学習(75) with R(5)「R Deep Learning Cookbook」 By Philippe Remy
https://qiita.com/kaizen_nagoya/items/4d6d4b5d9739bcffbf02

dockerで機械学習(76) with R (6)「Mastering Machine Learning with R 」By Cory Lesmeister
https://qiita.com/kaizen_nagoya/items/c3d51cdd3b811dac4d26

「「Rによる機械学習」の勉強履歴（1）」後追い: dockerで機械学習(77) with R (7)
https://qiita.com/kaizen_nagoya/items/68170a86b1b3dd5e596b

Machine-Learning-with-R-Cookbook-Second-Edition-master:dockerで機械学習(78) with R (8)
https://qiita.com/kaizen_nagoya/items/cbbed4d49ebb9c479816

「R Deep Learning Cookbook」 By Philippe Remy dockerで機械学習(79)AI(66)
https://qiita.com/kaizen_nagoya/items/4d6d4b5d9739bcffbf02
ソフトウェアアーキテクチャの基礎　第１章

システムデザインの勉強をしてみようと思い立ち、「ソフトウェアアーキテクチャの基礎」を読んでみたので、覚書です。複数回に分けて投稿します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846292/bfaa0255-c651-aad7-c8b1-1e17d9bc0df1.png)
>サイト(https://www.oreilly.co.jp/books/9784873119823/)

# 1章 イントロダクション
<dl>
<dt>ソフトウェアアーキテクチャの4つの側面</dt>
<ul>
<li>システムの構造</li>
<li>アーキテクチャ特性（イリティ（-ility)）：システムの成功基準を定める(可用性、信頼性など）</li>
<li>アーキテクチャ決定</li>
<li>設計指針：ルールではなく<strong>ガイドライン</strong></li>
</ul>
<br>
<dt>アーキテクチャ決定と設計指針の違い</dt>
<dd>
「アーキテクチャの決定」はシステムをどのように構築すべきかの<strong>ルール</strong>を定める。一方、「設計指針」は設計指針として、望ましいアプローチをに関するガイドを提供する、<strong>ガイドライン</strong>である。
</dd>
<br>
<dt>ソフトウェアアーキテクトへの8つの期待</dt>
<ul>
<li>アーキテクチャ決定を下す</li>
<li>アーキテクチャを継続的に分析する</li>
アーキテクチャの存続力や健全性を評価。
<li>最新のトレンドを把握し続ける</li>
「24章 キャリアパスを開く」に最新の情報を把握し続けるテクニックやリソースを紹介
<li>決定の遵守を徹底する</li>
「6章 アーキテクチャ特性の計測と統制」で自動化された適応度関数やツールで順守されているか測る方法を説明
<li>多様なものに触れ、経験している</li>
<li>事業ドメインと知識を持っている</li>
<li>対人スキルを持っている</li>
アーキテクチャの実装を通じて開発チームをリードする
<li>政治を理解し舵取りする</li>
「23章 交渉とリーダシップのスキル」参照
</ul>
<br>
<dt>ソフトウェアアーキテクチャの第一法則</dt>
<dd>
ソフトウェアアーキテクチャはトレードオフが全てだ
</dd>
</dl>
2024年を振り返って：HERE Technologiesの取り組みと成果

HERE Technologiesでは、今年もアドベントカレンダーを開催します!!
2024年は「地図」はもちろん、**ローケーションデータ活用**、そして**IoT**に焦点を当てた新しい視点での取り組みを募集いたします。  

その前に、HERE自身にとっての2024年の大きなニュースを振り返りご報告します。  

過去のAdvent Calendarもぜひご覧ください：  
- [HERE Advent Calendar 2023](https://qiita.com/advent-calendar/2023/here)  
- [HERE Advent Calendar 2022](https://qiita.com/advent-calendar/2022/here)

---

## ローケーションデータ活用、ロケーションサービス、IoTへの新しい視点

2024年、HERE Technologiesは**ローケーションデータ**や**IoT技術**を活用し、お客様やパートナー企業とともに革新的な取り組みを進めました。以下はその具体例です：

### **物流DXを支えるロケーションデータ活用**  
![物流DX](https://www.here.com/sites/g/files/odxslz256/files/styles/press_release_large_retina/public/2024-05/fleet_tucks_in_japan.webp?itok=oSuyciDT)  
HEREの「高品質な地図データ」「大量アクセス対応力」「柔軟性」がハコベルさまの物流DXプラットフォームに採用され、物流効率と顧客満足度の向上に活用されてます。  
リアルタイムでの位置情報処理を活用し、日本の持続可能な物流を支援しています。  
[HERE Japan 2024年5月16日 リリース](https://www.here.com/jp/jp/about/press-releases/ja/Hacobell-selects-HERE-to-enhance-its-offerings)

### **二輪車向けナビゲーションでのロケーションサービス強化**  
![二輪車向けナビゲーション](https://prcdn.freetls.fastly.net/release_image/121823/6/121823-6-eccbdc290c7496ee232b8e3712485dbd-3900x2385.jpg?format=jpeg&auto=webp&fit=bounds&width=720&height=480)  
カワサキモータースさまの「RIDEOLOGY THE APP MOTORCYCLE」にHERE SDK Navigate Editionが導入されました。  
二輪車専用のナビゲーションや音声ガイドを提供し、ライダー体験が向上します。  
[HERE Japan 2024年11月6日 リリース](https://www.here.com/jp/about/press-releases/ja/Kawasaki-Motors-boosts-rider-experience-with-HERE-in-mobile-app-upgrade)

### **リアルタイム位置情報を活用した業務管理の効率化**  
![業務管理効率化](https://prcdn.freetls.fastly.net/release_image/126524/6/126524-6-64ed896fe724077b8c2b34971dd88677-1266x539.png?format=jpeg&auto=webp&fit=bounds&width=720&height=480)  
オーガニック・モビリティーさまとの協業で、リアルタイム位置情報を「NewLands」機能に統合。IoTデバイスからのデータ活用により、モビリティと業務管理の効率化を実現できるようになります。  
[オーガニック・モビリティー株式会社 2024年10月8日 リリース](https://prtimes.jp/main/html/rd/p/000000006.000126524.html)

---

## HERE Partner Day Tokyo 2024

2024年6月5日、東京・大手町にて「HERE Partner Day Tokyo 2024」を開催しました。本イベントには43社80名が参加し、HEREとパートナー企業が成功事例や最新技術を共有しました。  

また、2024年2月に正式版を公開した地図アプリ「HERE We Go」や、リアルタイム位置管理ソリューション「HERE Asset Tracking」などの新サービスも紹介。特に「Omamori Tracker PoC Plan」は、屋内外測位に着目した新しいトラッキングソリューションとして注目を集めました。  
[HERE Partner Day Tokyo 2024 イベントリポート](https://www.here.com/jp/here-partner-day-tokyo-2024)

---

2024年を通じて、HERE Technologiesは革新を続け、お客様やパートナーとともに多くの新しい価値を創出しました。（12月にもまだまだニュースがございます！）
2025年にはさらに多くの挑戦を行い、より広範な価値提供を目指します。引き続きご期待ください！
Devcontainerで始めるAmplify環境構築

# はじめに
最近、Amplify Gen2を利用する機会が増えてきました。本記事では、Next.jsにおけるAmplify Gen2の初期環境構築を、Devcontainerを活用して行う方法を備忘録も兼ねて纏めます。

# 使用するDevcontainer
今回はDevcontainerのみを用いて環境構築します。
`Dockerfile`や`dockercompose.yaml`は利用しません。
```.devcontainer/devcontainer.json
{
  "name": "amplify-project",
  "image": "mcr.microsoft.com/vscode/devcontainers/typescript-node:18",
  "remoteUser": "node",
  "mounts": [
    {
      "source": "${localWorkspaceFolder}/../.aws",
      "target": "/home/node/.aws",
      "type": "bind"
    },
    {
      "source": "${localWorkspaceFolderBasename}-node_module",
      "target": "${containerWorkspaceFolder}/node_modules",
      "type": "volume"
    }
  ],
  "features": {
    "ghcr.io/devcontainers/features/aws-cli:1": {},
    "ghcr.io/devcontainers/features/git:1": {}
  },
  "customizations": {
    "vscode": {
      "extensions": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode"]
    }
  },
  "appPort": ["3000:3000"],
  "postCreateCommand": "sudo chown node node_modules",
  "forwardPorts": [3000],
  "initializeCommand": "mkdir -p ${localWorkspaceFolder}/../.aws"
}
```
## マウント設定
Devcontainerでコンテナのマウント設定を行います。
- `.aws`については、プロジェクトでawsクリデンシャルの情報を以下の場所に配置したかったため、プロジェクトのルートディレクトリと同じ階層にバインドマウントしています
- `node_modules`のボリュームマウントはディスクI/Oパフォーマンスの向上のために行います（[参考](https://code.visualstudio.com/remote/advancedcontainers/improve-performance)）

```json
"mounts": [
  {
    "source": "${localWorkspaceFolder}/../.aws",
    "target": "/home/node/.aws",
    "type": "bind"
  },
  {
    "source": "${localWorkspaceFolderBasename}-node_module",
    "target": "${containerWorkspaceFolder}/node_modules",
    "type": "volume"
  }
]
```
# Amplify環境構築
Amplifyの初期環境構築は、公式の用意しているテンプレートをそのまま利用するのがおそらく一番手っ取り早いです。
ダウンロードしたテンプレートのプロジェクトに先ほどのdevcontainer.jsonを貼り付けます。

https://docs.amplify.aws/nextjs/start/quickstart/nextjs-app-router-client-components/#1-create-the-repository
## ディレクトリ構成
awsの設定ディレクトリも含めた今回のディレクトリ構成は以下のようになってます。
```
.
├── .aws
└── amplify-project
    ├── .devcontainer
    │   └── devcontainer.json
    ├── amplify
    ├── app
    ├── node_modules
    │ ...
    └── tsconfig.json
```
# 環境設定と起動手順
## AWS プロファイルの設定
以下のコマンドでアクセスキーもしくはssoログインの設定を行います
```zsh
# アクセスキー
aws configure --profile example-name
# ssoログイン
aws configure sso
```
以下の設定をdevcontainerに加えることで利用するprofileの初期値を設定できます
```json
"containerEnv": {
    "AWS_DEFAULT_PROFILE": "example-name"
}
```

## バックエンド（Amplify Sandbox）の起動
Amplifyのサンドボックスは以下のコマンドで立ち上げます（[参考](https://docs.amplify.aws/react/reference/cli-commands/)）
profileを利用する場合は`--profile`を利用します
```zsh
npx ampx sandbox  --profile example-name
```

## フロントエンド（Next.js）の起動
sandboxが立ち上がると`amplify_outputs.json`が生成され、Next.jsを立ち上げることができます。
```
npm run dev
```
http://localhost:3000 を開いて以下のような画面が見えたら初期環境の構築は成功です！
![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1974522/47e52f32-4c5c-e7fd-164e-56c7c07de5d5.png)

# まとめ
DevContainerとAmplifyテンプレートを活用することで、わずか5分程度で開発環境を構築できます。VSCode拡張機能は、プロジェクトに合わせて適宜カスタマイズしてください。
Nucleo-F446REを使ってみよう

# はじめに
NucleoボードはSTM32マイコンがのっている評価ボードです。
Nucleo32、Nucleo64、Nucleo144の3つのサイズのバリエーションがあり、F446REなどはのっているSTM32マイコンの型番を示しています。
今回はNucleoボードの中でも人気のあるNucleo64のF446REを紹介します。
また、次回の記事ではNucleo32のF303K8の使い方を紹介します。

なお今回の記事は小規模な電子工作やロボットでの利用を想定したものです。

# 性能
STM32F446REマイコンの主な性能です。

| 項目 | 性能|
|---|---|
| 動作周波数 | 180MHz|
| 動作電圧 | 3.3V|
| フラッシュメモリ|512KB|
|SRAM|128KB|
|UART|6(USART4+UART2)|
|I2C|3|
|SPI|4|
|12bit ADC|3系統16チャンネル|
|GPIO|50（外部割り込み付き）|

Arduinoなどに比べて性能がいいことが分かると思います。
いろいろな用途で使えると思うので初心者の方にも是非おすすめしたいです。

# ピン配置
ピン配置は[こちら](https://os.mbed.com/platforms/ST-Nucleo-F446RE/)から見ることができます。
内側のピンソケットになっている部分はArduino Unoと互換性があり、Arduino用のシールドなどがさせるようになっています。

よく見ると同じピンが別のピンヘッダから出ていたりするので注意して使いましょう（そもそもピンの数が64より多い）。

# プログラムの書き込み
Nucleo64ボードは実は上下で機能が分かれています。
下はマイコンがのっていますが、上はSTM32マイコンに書き込むためのST-Linkとしての役割を持っています。
そのため、別途書き込み回路を用意することなくUSBからマイコンに書き込みができます。また、STM32をチップで利用するときにはこの上半分を折って書き込みツールとして使うことができます。

STM32マイコンのプログラムの開発環境はいくつかありますが、今回は私がメインで使っているPlatformIOでのやり方をご紹介します。
[この記事](https://qiita.com/shuji4649/items/deaafcbbcd064dc9000a)でちょうどNucleF446REに書き込む方法を紹介しているのでぜひこちらをご覧ください。

# USBではなく外部電源で動かしたい
電源については[こちら](https://www.st.com/en/evaluation-tools/nucleo-f446re.html#documentation)にのっているMB1136という資料のp.20の``6-3 Power supply and power selection``というところに載っています。
VINピンに7V~12V、5Vピンに5V、3.3Vピンに3.3Vのどれかを選べます。
外部電源で動かしながらPCとUSBでつなぐ際には先に外部電源で供給してからUSBケーブルを接続しないといけないようです。詳しくは上の資料に``power sequence procedure``として記載されているのでそちらをご覧ください。

# 最後に
あまりこういう記事を書くのに慣れていないので読みにくくなってしまったかもしれませんが、少しでも参考になれば幸いです。
ご質問・ご指摘等ございましたら是非コメントお願いします！
# 参考リンク
何か分からないことがあったらここにあるドキュメントをじっくり見てみるといいと思います

https://os.mbed.com/platforms/ST-Nucleo-F446RE/

https://www.st.com/en/evaluation-tools/nucleo-f446re.html
[TypeScript] inを使いこなしたい！

Javascriptを書いていると`in`と聞いて、`for in`構文が思いだすことが多いと思います。（自分がそうでした）

tsでinを書いているコードを何回か見つけて何となくこういう書き方があるんだなと思いつつ全然自分では書けなかったため、tsでのinの使い方を調べてみました。

## 1. オプショナルプロパティの存在チェック
変数の中身にオプショナルのものが含まれている場合、inで方指定をすることができます。

``` ts
interface User {
  name: string;
  age?: number;
}

const user: User = { name: "Alice" };
if ("age" in user) {
  console.log(user.age); // numberとして扱える
}
```

## 2. 型の絞り込み（Type Narrowing）
以下のように、片方の型が持っている要素に対して条件式を書くこともできます。
``` ts
type Animal = Bird | Dog;
interface Bird { fly: () => void; }
interface Dog { bark: () => void; }

function handleAnimal(animal: Animal) {
  if ("fly" in animal) {
    animal.fly(); // Birdとして扱える
  } else {
    animal.bark(); // Dogとして扱える
  }
}
```

## 3. 継承したプロパティの確認
クラスで継承したものにinを使うと元クラスの要素の存在確認ができます。
割と便利そう
``` ts
class BaseClass {
  baseMethod() {}
}

class DerivedClass extends BaseClass {
  derivedMethod() {}
}

const instance = new DerivedClass();
console.log("baseMethod" in instance); // true
```

## おわりに
`for in`の印象が強くてinは繰り返しの意味が強いと思っていましたが、inはどちらかというと条件文に近い役割をしているんですね。
よく考えたらwhileの中にもbooleanが入るので、同じような仕組みだとやっと理解しました
【Android】SVGからVectorに変換【Kotlin】

# AndroidStudioの機能で変換


resource Manager内のVector AssetでSVG画像を指定して変換できます。

![スクリーンショット 2024-12-01 22.00.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/eb28e757-cf3b-01a0-2c4c-3d67012ba432.png)

https://www.youtube.com/watch?v=-nYRhX2LsvQ


# コードで変換

```build.gradle.kts
dependencies {
　　　.
     .
     .

    implementation(libs.sdk.common)
}
```
```libs.versions.toml
[versions]
　　　.
     .
     .
sdkCommon = "31.7.2"

[libraries]
　　　.
     .
     .
sdk-common = { module = "com.android.tools:sdk-common", version.ref = "sdkCommon" }
```
```
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val path: Path = File("SVG").toPath()

            val byteArrayOutputStream = ByteArrayOutputStream()

            Svg2Vector.parseSvgToXml(
                path,
                byteArrayOutputStream
            )

            FileOutputStream("").use {
                byteArrayOutputStream.writeTo(it)
            }
        }
```


# 参考

https://stackoverflow.com/questions/42782574/svg-to-android-vector-drawable
C_TS452_2021 - SAP Certified Application Associate - SAP S/4HANA Sourcing and Procurement対策（22/100）

【22日目】
トピック3：調達プロセス（3/13）

≪問題22≫
仕入先から品目が倉庫に納入されましたが、在庫を払い出したあとに仕入先への支払が求められます。このために実装する調達プロセスはどれですか。
▢受託品
▢仕入先直送
▢在庫転送
▢標準

≪解答≫
█受託品
▢仕入先直送
▢在庫転送
▢標準

≪解説≫  
◆受託品（または委託品）とは、仕入先から提供され、自社の倉庫で保管されている品目を指します。  
◆これらの品目の所有権は仕入先に帰属しているため、仕入先に対する債務が発生するのは、受託品を倉庫から払い出した後となります。
昨日の時間を指定するときの注意点

## 初めに

疑問に思ったことや上手くいかなかったことのアウトプットをしています。
自分なりの理解でアウトプットしていきます。初学者なので誤りもあると思います。
その際はご指摘いただけると幸いです。

## モデルのscopeなどで昨日全体を指定する時

**失敗例**
```
 scope :exampled_at_yesterday, -> { where(exampled_at: 1.day.ago) }
 ```
このように1.day.agoだけの場合、昨日の中の限定された時間帯のみになってしまいます。


**成功例**
```
scope :exampled_at_yesterday, -> { where(exampled_at: 1.day.ago.all_day) }
```
 上記のように、all_dayをつけることで昨日の0時～23時59分までを指定できます。
ElixirでPAY.JPのライブラリ作成シリーズ② Let it crash

## Let it crash

皆さん、```Let it crash``` というシステム設計哲学をご存知ですか？
```Let it crash``` Erlang（Elixirの基盤となる言語）の創始者であるJoe Armstrongによって提唱された考え方です。

簡単に説明すると、
エラーの定義をまず簡単に２つに区別して考えます。

```
例外(Exception)：実行時システムが対処方法を知らない場合
エラー(Error)：プログラマーが対処方法を知らない場合
```

その上で、重要な区別として以下のような考え方をします。

```
プログラマーが対処方法を知っている例外は「エラーではない」
例：存在しないファイルを開く → 想定内なら例外処理を書く
```

これは、たとえば、以下のような場合にわざわざ、エラー処理を書くのは不要という考え方です。
```elixir
# 防御的なコード（避けるべき）
def asm(instruction) do
  case instruction do
    :load -> 1
    :store -> 2
    _ -> handle_unknown_instruction(instruction)  # これは必要ない
  end
end

# Let it crashアプローチ
def asm(instruction) do
  case instruction do
    :load -> 1
    :store -> 2
  end
end
```

プログラマーが「どうすべきか分からない」状況では、わざわざ防御的なコードを書かない
システムが自動的に提供するエラー処理の方が、多くの場合は適切

防御的すぎるコードは以下の観点で不要という考え方です。
* 可読性を下げる
* コアの機能を分かりにくくする
* エラーメッセージが標準のものより悪くなることもある

でもクラッシュしたら大変じゃない？と思うかもしれません。
そうです。クラッシュしたままにしたら大変です。なので、重要なのは

**回復可能な形でクラッシュさせる**

という設計です。ElixirやErlangはこの思想での設計を担保してるのは、
Erlangのランタイム設計によって支えられているからです。
ただ、考え方は他の言語でも応用可能です。

さて、次回はこのErlang/Elixirのランタイム設計の特徴について詳しく見ていきます。
入力にあわせて高さが自動で伸縮する textarea を、Blazor で作る

## お題

下図のような、入力したテキストにあわせて、高さが自動で伸縮される `textarea` を、Blazor で作ってみたいと思います。

![movie-001.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58450/22ad2822-bda4-1bf1-35dc-5f174974b8af.gif)

## 実装例

以下のように Razor コンポーネントを実装してみました。

```html
<div class="container">

    <div class="behind-textarea">@_text
        &nbsp;</div>

    <textarea @bind="_text" @bind:event="oninput"></textarea>

</div>

@code {
    private string _text = "";
}
```

`textarea` 要素に、`string` 型のフィールド変数 `_text` を双方向バインドし、バインドを発火するイベントに "oninput" を指定しています。つまり、`textarea` に対する何かしら入力が発生すると即時に、 フィールド変数 `_text` にその入力内容が反映されます。

そうしてリアルタイムに入力が反映されるフィールド変数 `_text` の内容を、`div` 要素内のコンテンツとして表示用に単方向バインドしています。

このように実装することで、**フィールド変数 `_text` を媒介に、`textarea` に対する入力内容が、兄弟要素の `div` 要素のテキストコンテンツとして、リアルタイムで反映される**ようになります。

そこでさらに、以下のように CSS スタイルを定義します。

```css
.container {
    display: inline-block;

    /* コンテナ要素の幅は何か適当な値に設定しておく */
    width: 200px;

    /* このコンテナ要素が position: absolute の座標の基準となるようにする */
    position: relative;
}

/*
コンテナ要素内の、textarea 要素と div 要素の両者が、
ピクセルレベルでまったく同じテキスト描画となるよう、
フォントや枠線、パディング、折り返しなどを、
両者に同じく適用する
*/
.behind-textarea, textarea {
    font-family: monospace;
    font-size: 13.3px;
    padding: 2px;
    border-width: 1px;
    border-style: solid;
    white-space: pre-wrap;
    word-break: break-word;
    margin: 0;
}

/* コンテナ要素内の div 要素は、見た目上は非表示にする */
.behind-textarea {
    visibility: hidden;
}

/* textarea 要素が、コンテナ要素内めいっぱいに貼り付くようにする */
textarea {
    position: absolute;
    inset: 0;
}
```

この CSS は何をしているかというと、まず、フィールド変数 `_text` の内容を表示する `div` 要素と `textarea` 要素とで、テキストの表示上のピクセルが完全に一致するように、フォントやパディング、枠線、折り返し表示を両要素に適用しています。

その上で、**`textarea` 要素を、この `div` 要素とまったく同じサイズ・同じ位置になるよう絶対座標配置したのです。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58450/e46700a1-dcc3-217f-775b-9f5fc6ee3d10.png)

この `div` 要素は、そのテキストコンテンツは `textarea` とまったく同じようにテキストを折り返し表示しつつ、高さ方向に自動で伸縮しますよね。`textarea` 要素を、この `div` 要素と同じサイズ・同じ位置で表示されるように、CSS の `position: absolute;` を使って重ね合うようにレイアウトすることで、入力にあわせて高さが自動で伸縮する `textarea` を実現しました。

こんな感じで、CSS だけはちょっと凝った感じになりましたけれども、それ以外の Razor コンポーネント上の実装は、フィールド変数へのバインドがあるだけのシンプルな実装で、高さ自動伸縮の複数行テキスト入力が実装できました。

## 出典

このような、テキストコンテンツとサイズを揃えて `textarea` 要素を重ね合わせ配置する技法は、当然のことながら (?) 私のオリジナルの発案ではなく、どこかで見聞きしたもので、それを今回、Blazor で実践してみた次第です。StackOverflow の質問と答えで見たような記憶があるのですが、正確な出所は確認していません。
質の悪い記事の裏返しで学ぶ「質の高いQiita記事」の書き方

Qiitaに記事を書く際、質の高い記事を目指すには、まず「質の悪い記事とは何か」を考えるのが効果的です。本記事では、よくある質の悪い記事の特徴を挙げ、それを裏返すことで質の高い記事を書くポイントを明らかにします。

# 1. 「結論がない」記事を避ける

質の悪い記事の典型例は、結論や主張が曖昧であり、読者が何を得られるのか不明なものです。
- 悪い例: 「〇〇の使い方を試してみました」というタイトルで、試しただけの結果を羅列。
- 裏返し: 最初に結論を明示する。例えば、「〇〇を使えばXX%効率化できました」という成果や意義を示すことは効果的です。

# 2. 「雑な構成」を避ける

構成が乱れていると、読者は途中で読むのを諦めます。
- 悪い例: 話があちこち飛び、前提知識や流れが不明瞭。
- 裏返し: 見出しを活用し、明確な流れを意識。以下のような流れを意識して構成します。
1.	問題提起
2.	解決策
3.	結果と学び
4.	次への応用案

# 3. 「具体性がない説明」を避ける

表面的な説明やコード例の不足は読者を混乱させます。
- 悪い例: 「このコードを実行すると便利です」と書くだけで、背景やコードの解説がない。
- 裏返し: 実際のコード例を示し、それが何を解決するのかを具体的に説明しましょう。また、エラーや注意点も補足すると親切です。

# 4. 「読者目線が欠けている」記事を避ける

自分本位な記事は共感を得られません。
- 悪い例: 自分の学習記録だけを書き、読者が得られる価値を考慮していない。
- 裏返し: 読者が何を求めているかを想像し、それに応える形で書きましょう。「読者の課題解決」を意識します。

# 6. 「読みにくい表現」を避ける

長文や専門用語ばかりの文章は読者の負担を増やします。
- 悪い例: 一文が長く、句読点が少ないために読みづらい。
- 裏返し: 短文で簡潔に。箇条書きやコードブロックを活用し、視覚的に分かりやすいレイアウトを心がけます。

# 7. 「フィードバックを無視する」記事を避ける

質の悪い記事は、コメントや指摘を放置しがちです。
- 悪い例: 「この部分が動作しません」といった指摘を無視する。
- 裏返し: コメントに丁寧に対応し、内容を修正・改善することで信頼を得られます。

# まとめ

質の高いQiita記事を目指すには、「質の悪い記事」を反面教師にして、結論を明確にし、構成を整え、読者目線で具体性のある内容を書くことが大切です。さらに、更新を怠らず、フィードバックにも積極的に応じることで、価値のある記事を提供できます。
Pythonで効率的に複数リストを操作する方法: zip() の使い方

### ZIP()とは

複数のイテラブルを並行に反復処理し、各イテラブルの要素からなるタプルを生成します。この関数を使うことで、ループの中で複数のリストを簡潔に扱えるようになります。

```
>>> for item in zip([1, 2, 3], ['sugar', 'spice', 'everything nice']):
    print(item)

(1, 'sugar')
(2, 'spice')
(3, 'everything nice')
```

### zip() の基本的な使い方
zip() 関数は、複数のリストをタプルのペアとして結合し、イテラブル（繰り返し可能なオブジェクト）を返します。

```
names = ['Alice', 'Bob', 'Charlie']
scores = [85, 90, 95]

# zip()でリストを結合
for name, score in zip(names, scores):
    print(f"{name}: {score}")
# 出力:
# Alice: 85
# Bob: 90
# Charlie: 95
```

- ポイント
リストの長さが異なる場合、短い方の長さに合わせてトリムされます。


###  zip() の戻り値と展開

zip() が返すのはイテレータで、リストやタプルのようにそのまま使用できます。リスト形式に変換するには list() を使います。


- zip() の結果をリスト化
```
names = ['Alice', 'Bob', 'Charlie']
scores = [85, 90, 95]

zipped = zip(names, scores)
zipped_list = list(zipped)

print(zipped_list)
# 出力: [('Alice', 85), ('Bob', 90), ('Charlie', 95)]
```
- 複数リストを辞書に変換

```
keys = ['name', 'age', 'city']
values = ['Alice', 25, 'New York']

zipped = zip(keys, values)
result = dict(zipped)
print(result)
# 出力: {'name': 'Alice', 'age': 25, 'city': 'New York'}
```

### 例: リストの位置ごとに計算

```
list1 = [1, 2, 3]
list2 = [4, 5, 6]

# 対応する要素を足す
summed = [x + y for x, y in zip(list1, list2)]
print(summed)
# 出力: [5, 7, 9]
```

### zip() の利点と注意点
- 利点
コードの簡潔化: 明示的なインデックス操作が不要。
柔軟性: 様々なデータ構造の操作に対応。
- 注意点
リストの長さが異なると、トリムされる点に注意。
zip() の戻り値はイテレータなので、再利用には再生成が必要。

https://docs.python.org/ja/3/library/functions.html#zip
リポジトリのprivate/publicをgithub CLIで効率的に切り替える

## githubが整理されてなさすぎる
自分は前職はまったくITとは無縁の職種からエンジニアに転職したため、一度G's ACADEMYというスクールに通ってからこの業界に飛び込んだのですが、独学時代も含めそれまでに作成したリポジトリがpublicで放置された状態になっていました。

今回整理する機会があり、まずはリポジトリをpublicからprivateにするところからだな、と思い効率的に切り替える方法を探していました。

## 方法は3つある
リポジトリの内容を切り替える方法はいくつかあります.
1. **GitHub GUIでリポジトリをPrivateに変更する**
1. **GitHub CLIを使用する**
1. **GitHub APIを使用する**

今回は最も効率的である**GitHub CLIを使用する**を採用します。


## GitHub CLIを使用する方法
### 1. GitHub CLIをインストールする（未インストールの場合）
コマンドライン（macOSならターミナル）を開いて```gh```コマンドが使用できない場合は以下コマンドでインストールします。

```
# macOS (Homebrew)
brew install gh

# Ubuntu/Debian
sudo apt install gh

# Windows (Scoop)
scoop install gh
```

### 2. インストールしたらGitHub CLIにログイン
以下コマンドでログインします。
```
gh auth login
```

ログイン時、色々質問されますが、ご自身の設定に合わせて選択していただければ問題ありません。
（自分はSSHキーを選択してブラウザログインしました）

#### 補足
SSHキーを選択した場合は以下手順でログインできます。

**1. SSHキーのアップロードについて**
GitHub CLIがあなたのローカルマシンにあるSSHキーをGitHubアカウントにアップロードしようとしています。id_rsa.pub はSSH公開鍵です。GitHubに登録することで、安全にリポジトリにアクセスできます。

質問： ```Title for your SSH key```
何を入力するか: このSSHキーを区別しやすい名前を入力してください。
```
My MacBook SSH Key for GitHub
```
これは、GitHubの「SSH and GPG keys」設定ページで、このキーを識別するためのラベルです。
好きな名前で問題ありません。

もしSSHキーがまだ作成されていない場合、以下のコマンドで新しいSSHキーを作成できます
```
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
```
作成された公開鍵（~/.ssh/id_rsa.pub）をGitHub CLIが自動的に利用します。

### 3. GitHub CLIでリポジトリをPrivateに一括変更
以下のコマンドで一括変更可能です。
XXXXXXの部分はご自身のユーザー名に変更してください
```
gh repo list XXXXXX --limit 1000 --json name,visibility | jq -r '.[] | select(.visibility=="PUBLIC") | .name' | while read repo; do
    echo "Processing $repo..."
    gh repo edit XXXXXX/$repo --visibility private --accept-visibility-change-consequences
    echo "$repo has been made private"
done
```


※jqコマンドが使用できない場合は以下のコマンドでインストールしてください（jqはJSONデータを操作するツールです）
```
# macOS
brew install jq

# Ubuntu/Debian
sudo apt install jq
```

実行後は以下のコマンドで変更状態を確認できます。
```
gh repo list XXXXXX --limit 1000 --json name,visibility
```

#### 補足
- **特定のリポジトリのみpublcにしたい場合**
```
gh repo edit YOUR_USERNAME/REPO_NAME --visibility public --accept-visibility-change-consequences
```

- **特定のリポジトリのみprivateにしたい場合**
```
gh repo edit YOUR_USERNAME/REPO_NAME --visibility private --accept-visibility-change-consequences
```

以上、ぜひリポジトリの整理の際の参考になれば幸いです！
Raycastを始めるなら"Clipboard History"がおすすめ

## はじめに
Raycastは入れてみたはいいけどどう使っていいのかわからないという声をよく聞きます。
![スクリーンショット 2024-12-01 20.39.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408705/e15a42fb-7707-c058-1747-16bfe45ea3fc.png)
そんな方に向けて今回はこれだけ使うだけでも便利だよと思う機能を紹介します！
それはClipboard Historyです！

## 概要
Clipboard Historyは、今までコピーしたデータを検索して再利用することができる機能です。
テキストだけではなくカラーや画像、リンクという種類ごとに細かなコピーオプションがあるのも魅力です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408705/851d39e7-5c07-4cd1-fb0e-940842e06d3c.png)
パスワードマネージャの機能でコピーしたデータは無視してくれるなどセキュリティ面での配慮もあります。

## 使い方
Raycastはインストールを完了していることとします。
1. Raycastでclipboardと入力し検索する
![Raycast 2024-12-01 at 21.12.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408705/0b0bd8c9-b8a6-1938-770e-81ce6b0a8cc0.png)
1. 必要な履歴を選択し`cmd + enter`する(`enter`だとactiveなアプリに貼り付け)

※`option + v`でショートカットを登録しておくのもおすすめです！
Raycastを開き`cmd + ,`で設定画面を開いて下記の図のように設定するとショートカットが使えます
![スクリーンショット 2024-12-01 21.14.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408705/3227a415-50aa-62e3-fc28-ef8d10ac9d5f.png)


## 推しポイント
1. 色をコピーすると16進数カラーコードで表示してくれるところ
`cmd + shift + c`で下記のように色々な形式で出力することもできます！
![Raycast 2024-12-01 at 21.04.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408705/f3fecb70-8666-7c35-f608-070a96918c42.png)
1. 画像からテキストをコピーできる(解像度などで精度は異なります)
![Raycast 2024-12-01 at 21.25.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408705/8f668e90-a98b-99ec-45a9-484291b651e1.png)
1. 検索で画像の文字列も検索できる(解像度などで精度は異なります)
![Raycast 2024-12-01 at 21.27.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408705/94f50d4e-a368-d13b-e64c-1df073673f9b.png)
1. linkを選択するとPreviewが表示されるところ
![Raycast 2024-12-01 at 21.29.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408705/b20732ce-4947-0153-f4df-0433086a85f3.png)
1. 細やかな設定ができるところ
優先でするアクション(`enter`で実行するアクション)を決めたり文字認識の精度を変更したり履歴の保持期間など細やかな設定ができるところも魅力的です
![スクリーンショット 2024-12-01 21.30.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408705/f972771d-024e-4127-dc8b-86c8081f0c47.png)

あとUniversal ClipboardをサポートしているのでiOSとかiPadでコピーしたものも取り込まれるところも便利ですね

## 参考資料
[Clipboard History](https://www.raycast.com/core-features/clipboard-history)

書いていてめちゃくちゃ便利なClipboard Historyだなと再認識しました！一番使う機能かもしれません。
使い方に迷っていたらまずはClipboard Historyから使ってみることをお勧めします！！
ブラウザでのJavaScript 実行の流れ

## はじめに
本記事ではWebブラウザによってHTML 解析時にJavaScript がどのような流れで実行されるのかをまとめます。

WebブラウザがHTMLを受け取ってから、リソースの読み込みが完了したことを表す`load`イベントが発生するまでの流れを見ていきます。


## HTML の解析
レンダリングエンジン[^1]のHTML パーサーが、受け取ったHTML を解析しながらDocument オブジェクトを作成していきます。

JavaScript エンジンからこのDocument オブジェクトに要素を追加・削除・更新する際には、`getElementById`などのDOM API を通じて行います。

## スクリプトの読み込み・実行
HTML パーサーは「`async`,`defer`,`type="module"`」の**ない**`<script>`要素をみつけるとドキュメント（DOM ツリー）に追加し、スクリプトを実行します。

このスクリプトで参照できるDocument オブジェクトは、すでに構築済みのものに限られます。
`<script>`要素よりもあとに記述されている要素に`getElementById`などでアクセスすることはできないわけです。

スクリプトがダウンロード、実行されている間、HTMLパーサーによる解析は停止し、DOMツリーの構築がブロックされる点には注意が必要です（レンダリングブロッキング）。

`document.write()`によってHTML ドキュメントに直接HTML文字列が追加される可能性があるため、解析を停止する必要があるわけです。
`defer`や`async`の使用時にはレンダリングブロッキングは起こりません。

### async属性
`async`をもつ`<script>`要素については、スクリプトのダウンロードが非同期的に行われ、実行されます。
非同期実行のため、`<script>`要素の後ろにあるdocumentオブジェクトにアクセスできる場合もあります。

## HTMLの解析の完了
HTML ドキュメントの解析が完了し、DOM ツリーの構築が完了すると[^2]、「`defer`,`type="module"`」をもつ`<script>`がHTML に記述された順番に実行されていきます。
これらのスクリプトはDOM ツリーの構築完了後に実行されているため、ドキュメントツリー全体にアクセスできます。

これらの`<script>`の同期処理が完了すると、ブラウザはDocument オブジェクトに対して`DOMContentLoaded`イベントを発生させます。
この時点では画像やCSS などリソースの読み込みが完了していません。

`async`をもつスクリプトはこの時点で実行が完了していない場合もあります。
## `load`イベントの発生
リソースの読み込みや`async`スクリプトの読み込み、実行がされたときにブラウザはWindow オブジェクトに対して`load`イベントを発生させます[^3]。



[^1]:Google Chrome ではBlink, Safari ではWebkit が使用される）
[^2]: このタイミングで`doccument.readyState`の値が`loading`から`inter active`へ変わります。
[^3]:`document.readyState`は`inter active`から`complete`へ変わります。