OmniAICreator/Qiita-1.07M huggingface dataset:
GoogleChromeの拡張機能を作ってみよう

こんにちは、WEBエンジニアの堀井です。

今回は、GoogleChromeを利用している方は、一度は使ったことがあるであろう<b>Chrome拡張機能</b>の作成方法について書いていきたいと思います。

## Chrome拡張機能とは

[Chromeウェブストア](https://chromewebstore.google.com/category/extensions)からインストールすることのできる、ブラウザ上で動作する拡張機能のことです。

主にGoogleChromeやEdgeで利用することができます。

有名なものだと、選択した文章を翻訳することができる「Google翻訳」や、ブラウザ上にある色のカラーコードを取得できる「ColorZilla」などがあります。

## 作り方

公式のドキュメントがありますので、こちらを参考にしました。

https://developer.chrome.com/docs/extensions?hl=ja

今回は、拡張機能をクリックすると運勢がわかる<b>おみくじ拡張機能</b>を作成します。

必要なファイルは以下になります。

* manifest.json
* omikuji.html
* omikuji.js
* omikuji.ong

それぞれ説明していきます。

### manifest.json

こちらは拡張機能を作成する場合に、必ず必要なファイルになります。

```manifest.json
{
    "manifest_version": 3,
    "name": "Omikuji Extension",
    "description": "Omikuji Extension",
    "version": "1.0",
    "action": {
        "default_popup": "omikuji.html",
        "default_icon": "omikuji.png"
    }
}
```

| 項目 | 説明 |
|-|-|
| manifest_version|マニフェストのバージョン。今は3が最新。|
| name|拡張機能の名称。|
| description|拡張機能の説明。|
| version|拡張機能のバージョン。|
| action|ツールバーに表示される拡張機能のアイコンの外観と動作を定義。|
| default_popup|拡張機能クリック時に表示されるポップアップ。|
| default_icon|拡張機能のアイコン。48x48。|

### omikuji.html

こちらはポップアップで表示されるファイルです。

```omikuji.html
<html lang="ja">
  <body>
    <span id="result"></span>
    <script src="omikuji.js" charset="UTF-8"></script>
  </body>
</html>
```

### omikuji.js

こちらはランダムで運勢を表示するスクリプトです。

```omikuji.js
const omikujilist = ['大吉', '中吉', '中吉', '小吉', '小吉', '吉', '吉', '吉', '凶', '大凶'];
window.addEventListener("load", function () {
    let num = Math.floor(Math.random() * 10);
    document.getElementById('result').innerText = omikujilist[num];
});
```

### omikuji.png

こちらは拡張機能の画像です。

![omikuji.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/f8a819d1-9b7f-9d3d-a5e5-6e4127c4875b.png)

これで全ての準備が整いました。

## 拡張機能をChromeに読み込む

今まで作成したファイルを全て「omikujiext」フォルダに入れ、Chromeに読み込ませます。
手順は以下になります。

1. 新規タブに「chrome://extensions」と入力して [拡張機能] ページに移動
1. デベロッパーモードを「ON」にする
1. [パッケージ化されていない拡張機能を読み込む]ボタンをクリック
1. 「omikujiext」を選択

すると[すべての拡張機能]に追加されます。

![スクリーンショット 2024-05-30 23.15.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/024e6780-14bc-eac3-a2b3-a053c8bb8cc5.png)

そして右上にある拡張機能メニュー（パズルマーク）をクリックすると一覧が表示されるので、[Omikuji Extension]をピン留めします。

![スクリーンショット 2024-05-30 23.22.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/9298bc48-4364-d5e0-748e-931d5c07fe4c.png)

最後にピン留めされた拡張機能をクリックしてみると、ランダムでおみくじの結果が表示されます。

![スクリーンショット 2024-05-30 23.23.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/bf896a4c-160b-0ea8-deab-481b36cb1a66.png)

## まとめ

今回はChrome拡張機能を使って簡単なおみくじを作成してみました。
HTMLとJavascriptの知識があれば案外簡単に出来ましたね。

今回作成したものは拡張機能開発の手法としてはほんの一部で、他にも様々な手法で様々なことができます。
ご興味を持たれた方がいましたら、最初に紹介した公式のドキュメントを参考にしてみてはいかがでしょうか？

それでは、堀井でした。
簡単！Excelでファイル出力

こんにちは。エンジニアの篠原です。
業務でExcelを使用する機会ってまだまだ多いのではないでしょうか。
先日、業務中にExcelの内容をCSVファイルで出力したい場面があり
簡単にマクロを組んでみましたので紹介します！

## 目次
- 概要
- 実際に組んでみる
    - Step 1：ボタンを配置
    - Step 2：参照設定の追加
    - Step 3：マクロを登録
    - Step 4：ファイル出力 
- まとめ

## 概要
Excelの内容をCSVファイルで出力するマクロを作成する。
今回は簡単にシート名、行列を指定して出力する。

## 実際に組んでみる
### Step 1：ボタンを配置

まずは、ファイル出力用のボタンをExcel内に配置します。
開発タブ ＞ 挿入 ＞ フォームコントロール ＞ ボタンを選択し、
任意のセルに配置します。
その際に、マクロの登録ダイアログが表示されるので
新規作成ボタンを押下します。

![2024-05-30_14h08_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/3222a4c4-3594-b33a-9827-e9490a3f3e9f.png)

<br/>

### Step 2：参照設定の追加
今回この機能を作成するにあたり、
VBAでADOを使用する為、追加していきます。
ツール＞参照設定で
『Microsoft ActiveX Data Objects 2.8 Library』にチェックを入れて
OKを押下します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/d89284e3-c16c-4b5d-ec8f-22a88e192a0f.png)

これで<INS>準備OK</INS>です！

<br/>

### Step 3：マクロを登録
実際にコードを書いていきます。

```vb
Sub file_output()

Dim ws As Worksheet

'シート名設定
Set ws = ThisWorkbook.Worksheets("シート名")

Dim csvFile As String
'出力パス＆ファイル名設定(同ファイルと同じ場所に出力)
csvFile = ThisWorkbook.Path & "\hoge.csv"

'ADODB.Streamオブジェクトを生成
Dim adoSt As Object
Set adoSt = CreateObject("ADODB.Stream")

Dim strLine As String
Dim i As Long, j As Long
i = 1

With adoSt
    '文字コード設定
    .Charset = "UTF-8"
    '改行コード設定(LF)
    .LineSeparator = 10
    .Open
    .WriteText buf, 0
    
    '出力範囲(行,列)
    outputData = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    Do While i <= outputData
        strLine = ""
        strLine = strLine & ws.Cells(i, 1).Value
        .WriteText strLine, adWriteLine

        i = i + 1
    Loop
    
    .SaveToFile csvFile, adSaveCreateOverWrite
    .Close

End With

'完了メッセージ
MsgBox "出力完了！"
End Sub
```
<br/>



### Step 4：ファイル出力
出力ボタンを押下すると、同階層にCSVファイルが出力されます。

Excel
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/7393e8ea-eb29-bcf4-3114-5d37c194aa7a.png)
<br/>

出力されたCSV
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/15c44e25-d1ad-87a7-48dd-7e1dc145f5a2.png)

<br/>

## まとめ

今回紹介したのは簡単な行列指定しての出力でしたが
カスタマイズすれば汎用的に使用できます。
Excelを業務で使われている方にはオススメです！

以上、篠原でした。
Linuxを基本からまとめてみた【入門】

## Linuxカーネル

- Linuxという単語は、OSのコアの『カーネル』を指す

## GUIとCUI

- PCの操作方法には、GUIとCUIの２種類がある
- GUI(Graphical User Interface)
- CUI(Character User Interface)

## Bashとは？

- Bashは、PCをCUIで操作するためのシェルの一種
- LinuxなどのOSで使える
※シェルとしては、Zshやfishもある

## シェルとは？

- カーネル自体にはユーザがインスタラクティブに操作する機能がなく、インスタラクティブに操作する機能を提供するのがシェル

## 標準入力・標準出力・標準エラー出力

|            | 概要　　　　  |  例　　　　    |
|:----------:|:-----------:|:------------:|
| 標準入力     | プログラムが使うデータのデフォルトの読み込み元 | キーボード |
| 標準出力     | プログラムの実行結果のデフォルトの出力先 | デフォルト |
| 標準エラー出力 | エラーメッセージのデフォルトの出力先 | デフォルト |




## 参考サイト
[Linux再入門―カーネル、シェル、ファイルといった基本概念を理解してトラブルシューティング力を高めよう](https://www.udemy.com/course/linux-reintroduction/learn/lecture/37500696?start=0#overview)
【超初心者向け】Github基礎のpush/pullについて解説

GitHubを使いこなして、プログラミングスキルをレベルアップしたいと思いませんか？実はGithubの基本的な操作は意外とシンプルで、初心者でも簡単に習得できます。

私は現役エンジニアとして、これまではGithubを何度も使用してきた経験があります。この記事ではGithub初心者でも挫折せずに使いこなせるよう、基本的な操作ついて丁寧に解説します。

## Gitとは？
Gitは、**バージョン管理システム**と呼ばれるソフトウェアです。バージョン管理システムとは、ファイルの変更履歴を管理するためのツールです。Gitを使うことで、以下のようなことができます。

- ファイルの変更履歴をすべて追跡する
- 過去のバージョンにいつでも戻す
- 複数のバージョンを同時に管理する
- チームでファイルを共有して共同編集する

## GitHubとは？
[GitHub](https://github.com/)はバージョン管理システム（Git）を利用した、**世界最大級のコードホスティングサービス**です。オープンソースプロジェクトの宝庫として有名ですが、プライベートリポジトリも作成できるため、個人や企業の開発プロジェクトにも広く利用されています。

[>> Githubの主な機能はこちらを確認](https://taishi-official.com/2020/03/27/96/#toc2)

## Githubで使われる用語を解説
以下によく使われる代表的な用語をまとめていきます。

### リポジトリ
リポジトリは、**ファイルやディレクトリの状態を記録する場所**です。リポジトリには次の2種類があります。

- **リモートリポジトリ**：GitHubのサーバにあり、メンバーみんなで使うリポジトリ
- **ローカルリポジトリ**：自分のパソコンで、自分が管理するリポジトリ

作業を自分のPCで行い、その作業の履歴はローカルリポジトリで管理します。そのローカルリポジトリの作業をリモートリポジトリにアップロードすることで他の人と共有できます。同様にリモートリポジトリから、他の人がアップロードした内容を自分のローカルリポジトリにダウンロードできます。

### ブランチ
ブランチとは、**履歴の流れを分岐して記録するもの**です。ブランチを作ると変更履歴を分岐して記録したり、合流させてそれぞれの変更内容を統合したりできます。

チームで1つの製品を開発する際、さまざまな機能を同時進行で開発したりします。そんなとき同じブランチで作業すると、管理では煩雑になってしまいます。そこで機能や対処している問題単位でブランチを作成し、各ブランチで作業することで本流であるmasterブランチなどに影響を与えず開発を進めることができます。

## Githubの基本的な使い方
### ローカルの変更をリモートリポジトリにアップロードする
ソースコードをGitHubにあげるまでの流れをご紹介します。

1. $ git init
1. $ gitadd [ファイル名]
1. $ git commit–m“コメント”
1. $ git remoteadd origin[リモートリポジトリのURL]
1. $ git push origin[ブランチ名]

それぞれのコマンドについてみていきます。

#### $ git init
まずこのコマンドで自分のPCローカル上に新規リポジトリを作成します。

#### $ git add [ファイル名]
[ファイル]を新規作成したという、変更履歴を残す準備をするコマンドです。[ファイル名]の部分は任意のファイル名を入力してください。

#### $ git commit -m “コメント”
上記のgit addで準備した内容を、変更履歴として保存します。[コメント]の部分で、何を変更したかわかりやすいメッセージを残します。

[>> 「Please tell me who you are」というエラーが表示された場合](https://taishi-official.com/2020/03/27/96/#toc10)

####  $ git remote add origin [リモートリポジトリのURL]
ローカルリポジトリとリモートリポジトリを紐付けるためのコマンドです。[リモートリポジトリのURL]は、Github上で確認できるためこれをコピペしてください。

#### $ git push origin [ブランチ名]

最後にこのコマンドで、ローカルの変更をリモートリポジトリに反映させます。[ブランチ名]でアップロードさせたいブランチ名を入力してください。特にブランチを作成していない場合は、デフォルトでmainというブランチが作成されているため、ブランチ名にmainと入力してください。

以上で、ローカルリポジトリの内容をリモートリポジトリにアップロードさせることが完了しました。ちなみに、2回目以降はリポジトリの新規作成とローカルとリモートリポジトリの紐付けは不要となります。2回目以降のPushはについては、下記をご覧ください。

[>> 2回目以降のPushまでのコマンド](https://taishi-official.com/2020/03/27/96/#toc12)

### リモートリポジトリの内容をローカルに持ってくる
リモートリポジトリの内容をローカルに持ってくる方法は、以下の2つがあります。

1. $ git clone [URL]
1. $ git pull

#### $ git clone [URL]
リモートリポジトリをローカルリポジトリに複製します。[URL]は複製したいリモートリポジトリのURLをコピペする。

#### $ git pull
リモートリポジトリからローカルにあるリモートリポジトリのコピーを最新情報をダウンロードして、それをローカルブランチに反映させます。この作業は「git fetch」と「git merge」という2つの操作をしているのですが、「git pull」コマンドを使うことでこれをまとめて行えます。

## まとめ
今回はGithubのについてと、Githubの基本的な使い方を解説しました。Githubは知識を深めることで、もっと便利に使えるようになります。今回ご紹介した内容は基礎中の基礎なことのみなので、この記事を足掛かりにさらに学習していただければと思います。

### おまけ

https://qiita.com/taishi_will_be/items/70a8ce8938944286b487

https://taishi-official.com/learning-programming/

<strong>＼Follow me／</strong>

- X（旧Twitter）：https://x.com/taishi_it_blog
- Instagram：https://www.instagram.com/taishi_will_be/
- YouTube：https://www.youtube.com/@Engineer_ILLBE
- TikTok：https://www.tiktok.com/@taishi_will_be
- note：https://note.com/taishi_wii_be/

<br>

最後にいいねお願いします:thumbsup:
React + Go Fiberでアプリを作成してみた【Blog】

## 1.プロジェクトを作成する(Go Fiber Project)

(1) フォルダを作成する

```
mkdir client
mkdir server
cd server/
go mod init github.com/neerajbg/blog
```

(2) serverにserver.goを作成する

```server/server.go


```
```
go get github.com/gofiber/fiber/v2
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
```

(3) serverにdatabase/database.goを作成する

(4) serverにmodel/blog.goを作成する

(5) serverにcontroller/blog.goを作成する

(6) serverにrouter/router.goを作成する


```
go get github.com/joho/godotenv
```
(7)serverに.envを作成する

## 2. フロントエンド部分を作成する

(1)プロジェクトを作成する

```
npx create-react-app client
cd client
npm install react-bootstrap bootstrap
npm install axios
npm install react-router-dom
```

(2)src/App.jsを編集する

```src/App.js


```
(3)public/index.htmlを編集する

```public/index.html
//省略
<title>React App</title>
<link
  rel="stylesheet"
  href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css"
  integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN"
  crossorigin="anonymous"
/>
```
(4)src/App.cssを編集する


(5)clientに.envを作成する


(6)src/index.jsを編集する

(7)srcにpageフォルダとHome.jsを作成する



## 参考サイト
[Full Stack Web Development with Go | React and Go Fiber | Go Fiber Project | Grow Your Skill](https://www.youtube.com/watch?v=6VjgWCuA9hI&t=7s)
[Full Stack Web Development with Go | React and Go Fiber - Part 2 | Grow Your Skill](https://www.youtube.com/watch?v=PPsTNQpT3e0)
[React and Go Fiber | Full Stack Golang Project | Part 3 | Grow Your Skill](https://www.youtube.com/watch?v=2fonkDhlPIs)
[React and Go Fiber | Full Stack Golang Project | Part 4 | Grow Your Skill](https://www.youtube.com/watch?v=G9tNDcX2E3A)
[React and Go Fiber | Full Stack Golang Project | Part 5 | Grow Your Skill](https://www.youtube.com/watch?v=5x_YPLGv7vs)
[React and Go Fiber | Full Stack Golang Project | Part 6 | Grow Your Skill](https://www.youtube.com/watch?v=Md8ZKt6yN-w)
[React and Go Fiber | Full Stack Golang Project | Part 10 | Grow Your Skill]
(https://www.youtube.com/watch?v=dRtFGUlv8W0)
[React and Go Fiber | Full Stack Golang Project | Part 11 | Grow Your Skill](https://www.youtube.com/watch?v=CFh_9O2DEfc)
【SAP】内部書式と外部書式

# はじめに
SAP S/4HANA Cloud（以降、S4HC）のデータを扱う際に、内部書式と外部書式に関する内容で苦労した点がございましたので、事象と対処法について当記事に記します。

# 内部書式と外部書式について
外部書式とは、実際に画面上や帳票などに出力される書式で、ユーザーが目にする情報となります。
一方、内部書式は、SAPがシステム内部で保持している書式であるため、ユーザーが目にすることはありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1855659/ee1b2a44-3d6e-2050-f433-d59e05bdd8dd.png)


## 躓いた内容
#### 事象
S4HCの購買依頼画面から、評価額（金額の項目）に11桁の金額を入力して保存ボタンを押下すると、データが登録されます。

しかし、APIを使用してデータの登録を行う際に、評価額に11桁（※1）のデータをセットして登録すると、桁数オーバーのエラーが発生しました。
※1…ビューブラウザで定義されている最大桁数

・エラーの内容

:::note alert
Overflow converting from '10000000000.00'
:::


#### 原因
原因としては、通貨に"JPY"を設定せずに登録処理をかけていたため、最大桁数が9桁になっていたことから、桁数オーバーのエラーが発生していました。

画面上にはある金額情報として 「10,000,000,000」 と表示されているものが外部書式に該当します。一方、システム内部のデータベース上では、金額の数値が「100000000.00」、通貨は「JPY（日本円）」となっています。

つまり、SAP内部では<font color="Tomato">金額情報のもととなる数値</font>と<font color="DodgerBlue">通貨</font>をセットで管理しています。
画面上に金額情報を表示する際は、この<font color="DodgerBlue">通貨</font>をもとに<font color="Tomato">金額情報のもととなる数値</font>を外部書式に変換しています。
通貨が「JPY」であれば、金額のもととなる数値を100倍して表示する流れになります。（日本円では小数点以下が存在しないため）


#### 解決策
登録する際に、通貨に「JPY」をセットすると、11桁で登録が可能になります。
※購買依頼画面では、デフォルトで通貨に「JRY」が設定されているため、最初から11桁で登録ができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1855659/4c0e07b4-51bd-a3a1-5df0-5ebead9fb754.png)


# おわりに
今回は、S4HCで使用している画面とデータを用いて記事にしましたが、SAPを使用する上では、外部書式と内部書式は意識するべき内容になります。
金額の他にも、日付やコード値などの項目も該当するため、結構身近な存在です。開発を行う方は、是非、頭の片隅に入れて実装いただければと思います。
Delta-LoRAを解説：低ランク行列の増分更新を活用した高性能 LoRA

※ このページは「DELTA-LORA: FINE-TUNING HIGH-RANK PARAMETERS WITH THE DELTA OF LOW-RANK MATRICES」の要約になります。

## このページでわかること
- Delta-LoRAは、低ランク行列の積の差を用いて事前学習された重みを更新することで、モデルの性能を向上させる新しい微調整手法
- この方法は、追加のメモリオーバーヘッドなしで、より優れた表現学習が可能
- 実験結果は、さまざまなモデルとデータセットで一貫した性能向上を示した

## 対象読者
- 特に大規模言語モデル（LLM）の微調整に関心があり、効率的なパラメータ更新手法を探求している人
- 大規模なNLPタスクに取り組んでおり、モデルの性能を向上させつつメモリコストを抑えたいと考えている人

## 従来手法の問題点
1. **大規模言語モデルの微調整の難しさ**：大規模言語モデル（LLM）の全パラメータを微調整するには、多くのGPUメモリと計算リソースが必要であり、多くの企業や研究機関にとって実現が難しいという問題がある

2. **既存の低ランク適応方法の制約**：LoRAやその他の低ランク適応方法（例：AdaLoRA）は、一部のパラメータのみを更新するため、学習される表現が不十分であり、フルファインチューニングに比べて性能が劣るという制約がある

3. **メモリオーバーヘッドの増加**：フルファインチューニングでは、AdamWのようなオプティマイザが複数のパラメータコピーを保持するため、メモリのオーバーヘッドが大きくなり、リソースが限られた環境では対応が難しいという問題がある

## Delta-LoRA
### Delta-LoRA とは？
Delta-LoRAは、LLMの微調整を効率化するための新しい手法です。従来のLoRA（Low-Rank Adaptation）と異なり、
1. 事前学習された重み行列（$W$）と2つの低ランク適応行列（$A$および$B$）を同時に更新し、増分更新$\(A^{(t+1)}B^{(t+1)} - A^{(t)}B^{(t)}\)$を利用して事前学習された重み（$W$）を精緻化する
2. 従来のLoRAモジュールに統合されていたドロップアウト層はDelta-LoRAでは除外されている

この手法により、パラメータ効率を高めながらモデルの性能を向上させます。

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 17
}
</style>
footer  Delta-LoRA の概要図\n(出典：DELTA-LORA: FINE-TUNING HIGH-RANK PARAMETERS WITH THE DELTA OF LOW-RANK MATRICES)
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758571/51d428bb-5d35-15e6-197f-56d780e10a7c.png>
@enduml
```

### Delta-LoRA のメリット
1. **メモリ効率の向上**：Delta-LoRAは、事前学習された重みWを直接更新せずに、その差分（デルタ）を利用するため、追加のメモリオーバーヘッドを発生させない
2. **性能の向上**：より多くのパラメータを学習に含めることで、モデルの表現力が向上し、様々なタスクにおいて優れた性能を発揮する
3. **勾配計算の簡略化**：Wの勾配を計算して保存する必要がないため、メモリと計算資源の節約が可能

### Delta-LoRA の手順
1. **初期化**：低ランク行列AをKaiming初期化し、Bをゼロ行列で初期化する。Wは事前学習された重みで初期化される
2. **ミニバッチのサンプリングと勾配計算**：各ミニバッチごとに、Delta-LoRAモジュール内のAとBの勾配を計算する
3. **低ランク行列の更新**：AdamWオプティマイザを用いて、正規化された勾配を用いてAとBを更新する
4. **事前学習された重みの更新**：指定されたステップ数（K）を経過した後、AとBの積の差分（△AB）を用いてWを更新します。この更新は、学習率とアップデート比率（λ）に基づいて行われる

### Delta-LoRA の性能
Delta-LoRAは、RoBERTa、GPT-2、BARTといった異なるモデルおよびGLUEベンチマークやE2E NLGチャレンジなどの様々なデータセットで評価され、既存の低ランク適応方法（LoRA、AdaLoRAなど）と比較して一貫して優れた性能を示しています。具体的には、以下のような結果が得られています：
- **E2E NLGチャレンジ**：BLEUスコア、NIST、METEOR、ROUGE-L、CIDErの全ての指標で最良の結果を達成
- **WebNLGチャレンジ2017**：BLEUスコア、METEOR、TERの全ての指標で最良の結果を達成
- **GLUEベンチマーク**：全8タスクで既存の方法よりも優れた性能を示す

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 17
}
</style>
footer  NLG Challenge dataset のスコア\n(出典：DELTA-LORA: FINE-TUNING HIGH-RANK PARAMETERS WITH THE DELTA OF LOW-RANK MATRICES)
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758571/fa1080e4-27ef-9315-85d9-fbcccaf21b0c.png>
@enduml
```

## まとめ
以上が Delta-LoRA の要約でした。増分更新という LoRA の中でもちょっと特殊なことをしていますね。$W$ も更新が入るので、結果として他の LoRA 手法よりも性能が改善するということだと理解しています。
問題点でもあげていますが、LoRA は Full-Parameter Fine-Tuning よりも更新するパラメータが少ない分性能が低い傾向にあるので、更新できるポイントが増えるとその分性能も上がるということだと思います。その分、過学習しそうですが。

このあたりは実際に使ってみないとわからないですね。あとは、LoRA に比べて $W$ 更新分の時間的なオーバーヘッドも気になりますね。

おわり。
Ubuntu22.04でネットワーク接続のアイコンがなくなった時の対策

# Ubuntu22.04　でネットワーク接続ができなくなる
以下の画像のようにネットワーク設定のアイコンが消滅してしまった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534057/eeac30f5-f4a6-6d66-c180-90b9a4dad507.png)

# 対策方法
色々調べてみると、以下のような記事を見つけた。

https://wakimiunten.hatenablog.com/entry/2022/09/11/231833

下記コマンドでON/OFFを操作できるようだが、試してみても駄目だった。


```
$ sudo nmcli networking off
$ sudo nmcli networking on
```

# 原因
Ubuntu22.04では

:::note info
/etc/netplan/01-network-manager-all.yaml　（他にもファイルがある？）
:::
/etc/netplan/以下のyamlファイルがnetworkservice起動時に読み込まれる。

自分は仮想環境同士のping接続確認の際に

/etc/netolan/99_****.yamlというファイルを作成していた。

すべて読み込まれることをどこかの記事で見たため、作成したファイルが怪しいと思い

削除してみると、アイコンが復活した。

# 結果

01-neteork-manager-all.yamlより後に作成したyamlが読み込まれていたため、

サービス起動時の設定が異なるものとなっていたと考える。

# まとめ
昔のバージョンのように、簡単にネットワーク設定ができなくなっている。

（簡単に設定はできるが、競合してしまう）

表面的な操作だけを覚えるのではなく、

ある操作がどのようにOS側の設定に影響を与えているかを把握しながら、

操作していくことが必要だと実感した。
Machine LearningとArtificial Intelligence

# はじめに
mochiです。いま勉強している資格の1項目にMachine Learning(ML)とArtificial Intelligence(AI)についての分野があったのを思い出し、少し面白かったので記事にしてみました。

現代のテクノロジーの進化に伴い、MLやAIは急速に発展し、多くの分野で利用されています。この記事では、MLとAIの基本的な概念等について少し記述できればと思います。

# 機械学習（ML）とは？
機械学習(ML)は、人間が行う学習と同様の機能を機械によって行い、データを使用してパターンを認識し、予測や意思決定を自動化することが出来る技術を指します。MLはAIの機能の一部分であり、中核的存在となっています。
反復的タスクを効率化でき、様々な業界で使用されています。

◆ニューラルネットワーク
基本となっているのはニューラルネットワークとディープラーニングです。
ニューラルネットワークとは、もともとは人間や動物の脳内で情報や記憶処理を行っている大量の微小な神経細胞が相互に網状に繋がった構造を指しています。
これをコンピュータ上で再現し、ML等の知的操作に応用したものです。

◆ディープラーニング
機械学習の一種であり、多層ニューラルネットワークを用いている為、より複雑な問題や高度なパターンの学習を可能にするものとなっています。
また、大量のデータを必要としているため膨大なデータ学習を行えるものにもなっています。

### ◆具体的な利用例
### 1,カスタマーサポート
予めデータを学習したチャットボットやバーチャルアシスタントは、自然言語処理を使用して、顧客からの問い合わせに自動で応答します。これにより人件費削減と共に24時間体制サポートが可能となります。

### 2,データ分析と予測
大量のデータを分析して将来のトレンドや需要を予測するのに役立ちます。
ECサイトやYoutubeの閲覧履歴、Spotifyの再生履歴を学習し、その顧客に合ったおすすめなどをすることができます。

### 3,スマートホームデバイス
AppleやAmazonが出しているスマートホームデバイスは、居住者の行動パターンを学習して、電気の消し忘れなどによる余剰なエネルギーを削減することもできます。

# 人工知能（AI）とは？
AIは、人間の知能を模倣する技術の総称です。機械学習はAIの一部ですが、AIには以下のような広範な分野が含まれます。

◆自然言語処理(NLP)
言語の理解と生成を行います。チャットボットや翻訳機能が典型例です。

◆画像認識
画像や映像から情報を抽出します。顔認識や自動運転が含まれます。医療用画像診断などに用いられます。

◆生成AI
ML技術を用いて、新しいテキストや画像、音声、動画などのコンテンツを自動生成します。Google Workspaceがこれを使用しています。

# AIで今後さらに注目されるのは？
AIとMLは今後もますます進化し、私たちの生活や産業に大きな影響を与えていくと思います。特に注目される分野として、自動運転やパーソナライズされた医療、都市型にセンサーやAIを駆使したスマートシティなどが挙げられます。

私は現場で医療機関のサーバ保守をしています。その為、ディープラーニングによってパーソナライズされた医療には非常に興味があります。人生100年時代と言われている今、疾患を早期発見して平均寿命を上げてくれる可能性がAIにあると私は思います。

↓以下記事には、実際にAIを使用した医療技術を項目ごとに取り上げています。もしご興味があれば一度見てみてください👍

https://romptn.com/article/20644

# まとめ
AIは現代には欠かせないものとなっており、インフラエンジニアが勉強することの多い
クラウドサービスもAIを使ったソリューションを多くリリースしています。今ホットだからこそ、このあたりの知識はインフラエンジニアとして抑えておくべきなのかなと思います。

人間はAIに仕事を奪われるなどとよく言いますが、そうではなくAIサービスを使いこなして医療・交通・情報等もっと各々の仕事の生産性を上げて、より良い社会にするための一手段と解釈すべきだと思います。実際にAIを使いこなすために、私ももっと勉強します🔥
ログイン画面の場合(SSO認証)

# sWebMachineGun.exe実践編

最近は、WebAPIを中心にSSOとして、OpenIDとか、OAuthとかで認証してくれ。という案件も多くなっている。

今回は、そういうSSOの場合についてのポイントを記載する

毎回SSOのトークンを個別に取得して、それをリクエストテンプレートに張り付けて・・・という方法もあるけど、sWebMachineGun.exeには、カスタム認証としてSSOの情報を登録してトークンを自動取得する機能がある

## sWebMachineGun.exeの設定

### カスタム認証の設定

「Request」タブの「CustAuth」ボタンを押下すると、カスタム認証を設定するダイアログが表示される。

![075.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/9e425827-c287-ca0f-77c2-555c455f4600.png)

いろいろな認証方法を同梱しているプラグインに実装しているけど、存在しない場合はスクリプトでもなんとかできるでしょう。

<hr>

![076.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/9690f2a8-aeda-1d11-75a7-874200ebeb53.png)

例えば、こんな感じで、OAuth2の認証情報をセットする。
情報の登録は、「Set」ボタンで、リストに登録してから「Setting」ボタンで、sWebMachineGun.exeに登録。という手順です。

<hr>

![077.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/9bdc8ac1-8233-59f2-839f-f4d76500b465.png)

この画面では、OAuth2認証として「userA」と「userB」の2つを用意した。

<hr>

![078.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/5bb05215-fabd-6f65-2417-126897e42989.png)

最後にどのリクエストテンプレートに対して、そのカスタム認証を適用させるかということになるので、
それは「Request」タブのカスタム認証のセレクトボックスで選択する。
複数のリクエストテンプレート全部にセットさせたい場合は「SetAllRequest」をチェックする
選択したカスタム認証を非選択状態にしたい場合は、セレクトボックスにフォーカスを当てた状態で「DEL」キー押下で未選択状態になる

<hr>

こんな感じで、userAの場合。userBの場合と、WebAPIの認可状態の診断が気軽にできると思う。

# sWebMachineGun.exe Index

[sWebMachineGun.exe のメインメニューに戻る](https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3)
複数の非同期関数で実行されるset更新関数でハマった件


# はじめに

フロントエンドを React で書いていて非同期関数内で実行される更新関数(set 関数)でハマったのでメモしておきます。

## 実際に起こったこと

以下のように外部 API からオブジェクトのデータを別々に取得して、それぞれのデータでオブジェクトを更新する処理を書いたとします[^1]。
API を叩いた結果を用いたそれぞれの更新関数 setHuman の引数は**関数ではなく、現在の値を利用した値で更新しています。**

```javascript
import React, { useState } from "react";

const sleep = async (sec) => new Promise((resolve) => setTimeout(resolve, sec));
const mockGetNameApi = async () => {
  await sleep(100);
  return "hoge";
};
const mockGetAgeApi = async () => {
  await sleep(500);
  return 28;
};

function App() {
  const [human, setHuman] = useState({ name: "fuga", age: 0 });
  const handleClick = async () => {
    mockGetNameApi().then((v) => {
      setHuman({ ...human, name: v });
    });
    mockGetAgeApi().then((v) => {
      setHuman({ ...human, age: v });
    });
  };
  return (
    <div>
      <h1>
        Name: {human.name}, Age: {human.age}
      </h1>
      <button onClick={handleClick}>Call API</button>
    </div>
  );
}

export default App;
```

期待する挙動は、ボタン押下して二つの更新関数を実行する handleClick が実行されると Name: hoge, Age: 28 と表示されることですが、実際には Name: fuga, Age: 28 と表示されてしまいます。
しかも何やら Name:fuga, Age:0 と表示された後に Name: hoge, Age: 28 と表示されているようです。

## 対策

まずは解決策の結論から述べます。
setHuman の引数を前回の値を利用する関数として定義することで解決できます。

```javascript
import React, { useState } from "react";
...

  const handleClick = async () => {
    mockGetNameApi().then((v) => {
      setHuman((prev) => ({ ...prev, name: v });
    });
    mockGetAgeApi().then((v) => {
      setHuman((prev) => ({ ...prev, age: v });
    });
  };

```

## なぜか

調べてみると、[こちらの記事](https://qiita.com/KokiSakano/items/c16a8daf03acdbd6c911)がとても参考になりました。

こちらの記事にもあるように、コンポーネント内の状態をスナップショットとして保有しているみたいで、それが非同期関数であってもその非同期関数を実行した時点でのスナップショットを利用するようです。

つまり handleClick を呼び出した時点で human は{ name: "fuga", age: 0 } となっており、mockGetAgeApi, mockGetNameApi 実行後の then で利用するそれぞれの human は setHuman の実行に関わらずどちらも{name:"fuga",age:0}となっているようです。

最終的に mockGetAgeApi 側の setHuman が反映されて Name: fuga, Age: 28 と表示されてしまうと解釈しました。

```javascript
const handleClick = async () => {
  mockGetNameApi().then((v) => {
    // human は { name: "fuga", age: 0 }
    setHuman({ ...human, name: v });
  });
  mockGetAgeApi().then((v) => {
    // 上のsetHumanが実行済みでもhumanはhandleClick実行時の{ name: "fuga", age: 0 } のまま
    setHuman({ ...human, age: v });
  });
};
```

また、非同期関数内に関わらず関数内で複数回 set 更新関数を呼び出すと今回のようになるみたいです。

## 終わりに

今までなんとなく使っていた useState について少し理解が深まった気がします。
今後は set 更新関数の引数に迷うことなく利用できそうです。

また、今度実際に React のソースコードを読んでみて自分自身で理解を深めていきたいなと思います。[^2]

[^1]: そもそも設計が悪いでしょ！というご意見は今回の趣旨ではないのでご容赦ください。本記事の元になった実際の例は、フロントエンド側は一緒のオブジェクトとして扱いたいが、バックエンド側では別々の API かつ、一方の API 実行に著しく時間がかかり、どちらの実行も待っていたら UX が悪いというケースでした。
[^2]: 実はすでにやってみたが、わけがわからなくて挫折中なのは内緒です。
DataikuがEUのAI法準備プログラムを開始

EU AI法は、世界で最も包括的かつ厳格なAI規制の一つになることを目指しています。品質、リスク管理、監視、人間による監督、および透明性の高い基準を持ち、EU AI法は、欧州連合内で展開されるAIシステムが倫理的基準および社会的価値観に合致することを保証します。違反した場合、[最大で3500万ユーロまたは企業の世界売上の7％](https://data.consilium.europa.eu/doc/document/PE-24-2024-INIT/en/pdf)のいずれかの高い方の罰金を科される可能性があります。

Dataikuは、この重要性を認識し、[EU AI法準備プログラム](https://www.dataiku.com/press-releases/eu-ai-act-readiness-program)を開始しました。これは、グローバル企業が新しいEU AI法の複雑さを乗り越え、責任あるAIの革新を推進し、AIの効果的な管理できるように設計された包括的なソリューションです。

## DataikuがAIガバナンスにもたらす価値
EU AI法準備プログラムは、コンプライアンス準備に対する全体的なアプローチを提供します。Dataikuの固有のガバナンス機能によって支えられたこのプログラムには、リスクレベルに応じてAIのユースケースを選別し、EU AI法の厳格な要件に沿った段階的なワークフローを提供する包括的なソリューションが含まれています。

### AIコンプライアンス準備の加速
規制ポリシーを手作業で処理することは、時間とリソースを大量に消費し、コンプライアンスの遅延や複雑さを引き起こします。DataikuのEU AI法ソリューションは、規制の要求を包括的に把握し、コンプライアンスを支援するために必要なコントロールを効率的に実装することで、EU AI法に対する準備を強化します。

### 責任の促進と監査準備の確保 
部門間、ユースケース、リスクプロファイルにわたるAIプロジェクトの利害関係者の承認を管理することは複雑ですが、必要不可欠です。Dataikuはリスクおよび配信マネージャーに、重要な利害関係者からの署名を収集するための承認ワークフローをカスタマイズする機能を提供し、責任を促進し、監査の準備を確保します。

### 生成AIのガバナンス 
EU AI法は生成AIを特徴とするAIシステムの効果的なガバナンスを求めています。DataikuのLLM Meshは、コスト管理、コンプライアンス、技術的依存関係に関連する懸念に対処しながら、エンタープライズグレードの生成AIアプリケーションを効率的に構築できるようにします。コンプライアンス活動にとって重要なDataikuのLLM Meshは、バイアス、有害性、PII侵害などの問題を検出し、軽減するのに役立ち、ガバナンス目標との整合性を確保します。Dataiku Governを使用することで、組織は開発段階、ビジネスフォーカス、リスク要因など、生成AIポートフォリオの全体像を把握できます。

### 戦略的課題への対応
EU AI法の要件がどのように満たされるかについての具体的なガイダンスを待つ間にも、変革管理、責任の配分、主要活動に関する新たな戦略的課題がますます重要になります。

- 現在および将来のAIプロジェクトがEU AI法の要件を完全に満たすためにはどうすればよいか？ 
- さまざまなAIシステムに関連するリスクを効果的に管理・軽減するための具体的な対策を迅速に展開できるか？ 
- 意思決定プロセスを集中化し、AI関連のすべての行動や決定の透明で監査可能な記録を維持するにはどうすればよいか？


Dataikuのプログラムは、AIシステムに関連するリスクの管理・軽減、意思決定プロセスの集中化、AI関連の行動や決定の透明で監査可能な記録の維持など、EU AI法の遵守を確保するために重要なこれらおよびその他の課題に対応します。

Dataikuのプログラムの重要な特徴の一つは、コンプライアンス施行の過程を通じて組織を支援するために提供される個別の専門的なガイダンスです。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196881/d737a46b-2135-0c60-c98c-a8f945a3d2bb.png)

### 進化するAI規制に適応
AI規制はますます厳格になり、地域やセクターごとの変化に対応する柔軟性が求められています。Dataikuを利用することで、組織はプロジェクト計画をカスタマイズし、明確な手順を持つワークフローブループリントを活用して、AIプロジェクトを効率的かつコンプライアンスに則って構築、テスト、展開することができます。

Dataikuのガバナンステンプレートは非常にカスタマイズ可能で、進化する規制や各組織の独自のニーズに適応できます。この柔軟性は、AI技術の進化に伴い継続的に進化する規制環境において不可欠です。特に、Dataikuは組織のコンプライアンス作業を支援するための独自の規制準備フレームワークを提供しています。

### Dataikuの中央ガバナンス機能の活用
DataikuのユニバーサルAIプラットフォームは、組織内のすべてのデータ作業の中心として機能します。この中央集約型アプローチにより、AIイニシアチブを安全にスケーリングしつつ、厳格なガバナンスと責任あるAI基準を維持することができます。すべてのAI運用を統合することで、組織はAI導入のすべての側面が規制および倫理基準を満たしていることを確保できます。

## もっと知りたいですか？AIガバナンスシリーズ：EU AI法とその先へ

EU AI法は、世界中の将来のAI規制の先例となることが期待されています。他の地域もEUの規制フレームワークから学び、同様の法律が世界中に出現する可能性があります。

Dataikuは、EU AI法および将来のAI規制をナビゲートする組織をさらに支援するために、AIガバナンスウェビナーシリーズを開催しています。このシリーズは、データリーダーが詳細な知識を得て、洞察を共有し、コンプライアンスおよびイノベーションのためのAI戦略を準備するための絶好の機会を提供します。

## AIガバナンス・シリーズに申し込む
この機会をお見逃しなく！AIガバナンス・シリーズの第1回目、EUのAI法に関するウェビナーにご登録ください！イベント申し込みページは[こちら](https://events.dataiku.com/unpacking-the-eu-ai-act)

原文：[Dataiku Launches EU AI Act Readiness Program](https://blog.dataiku.com/eu-ai-act-readiness)
開始年月、終了年月のように複数の月にまたがるレコードを月別に集計したい





+ [レポートのグルーピングについて](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007eoo28)

:::note
このオブジェクトの子オブジェクトとして４月で１レコード、５月で１レコードのように複数レコードを作成すれば簡単にレポートが作成できると思います。

今の状態では難しいと思います。

弊社でも月をまたがるために、子オブジェクトに月別の情報を別途もたせています。

主従関係にしているので、各月に金額を入力すれば親レコードに合計はコードを書かずに実現できるのですが、各月のレコードを１つずつ追加していくのが面倒なので、Apexトリガーで2024年４月から2024年6月と開始月と終了月を指定したら、自動で3レコードを追加するようにしています。

また、開始月や終了月を変えた場合も自動でレコードを追加、削除するようにしています。

カスタムコンポーネントを使って修正もできるだけ画面遷移をしないようにしていますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/13a0efbb-4056-0d5a-6b9c-25580a45d668.png)
::: 


+ [契約オブジェクトに紐づく月毎の売上予測と納品実績について](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007akPTm)

:::note
複数月にまたがる売上管理ってありますよね。弊社もまさに同じ管理をしています。

標準の商談を使わずにカスタムオブジェクトで受注情報を管理しています。
また、このオブジェクトの子のオブジェクト(主従関係)として売上予定のオブジェクトを作成しています。

以下の例ですと、商品の出荷(=売上）予定期間が2024/07/01から2025/02/28なので、Apexトリガーで2024/7~2025/3(弊社は20締めのため3月度まで作成してます)の子レコードを作成しています。

この子レコードに実際の出荷予定金額を入力して管理してます。
入力の手間を少しでも簡単にするために、子レコードはカスタムコンポーネントを使って編集できるようにしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/196e6016-61a1-533e-c48a-c3dc4b1c8952.png)

このように子レコードで管理しているので、月別の売上予定がかなり正確に集計できますね。（入力が正しいという前提で...）

傾向を見るとために前年度のレコードも表示させています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/215894c7-490f-55df-455d-1b9f8b5f0fb5.png)
:::
React×TypeScriptでのHTMLレンダリングとサニタイズ：dangerouslySetInnerHTML & html-react-parser

## はじめに
こんにちは！[@nyakako13](https://qiita.com/nyakako13 "Qiita ページ") です。

少し前からReact,TypeScriptの学習をしています。

作成中のReactアプリでユーザーが入力したHTMLをレンダリングする部分があったので、ReactアプリでのHTMLレンダリングとサニタイズについて調べてみました。

:::note info
サニタイズとは文字やコードを安全な形に変換する処理のことを指します。 具体的には、ユーザーからの入力や外部からのデータに含まれる有害な文字やコードを、実行や表示されない形に変換することです。 この処理により、Webサイトやアプリケーションが不正な操作をされるリスクを大幅に減少させることができます。
:::

dangerouslySetInnerHTMLについては、こちらの記事も参考にさせていただきました。

https://qiita.com/hiromoon/items/f3ed77abd338139ba97b


## 方法①`dangerouslySetInnerHTML`を使う

### `dangerouslySetInnerHTML`とは？

`dangerouslySetInnerHTML`は、ReactがHTML文字列を直接DOMに挿入するための方法です。しかし、このメソッドは名前の通り危険で、適切なサニタイズを行わないとXSS攻撃の対象となる可能性があります。

https://ja.react.dev/reference/react-dom/components/common#common-props

### サニタイズ用ライブラリのインストール

まず、`dompurify`をインストールします。HTMLをサニタイズするためのライブラリです。

```bash:bash
npm install dompurify
```

### 使用例

`dangerouslySetInnerHTML`を使ってHTMLを挿入する前に、`DOMPurify`を使ってサニタイズします。

```typescript
import DOMPurify from "dompurify";

interface SanitizedComponentProps {
	html: string;
}

const DangerouslySanitizedComponent = ({ html }: SanitizedComponentProps) => {
	const sanitizedHtml = DOMPurify.sanitize(html);

	return <div dangerouslySetInnerHTML={{ __html: sanitizedHtml }}></div>;
};

export default DangerouslySanitizedComponent;
```

## 方法②`html-react-parser`の使う

### `html-react-parser`とは？

`html-react-parser`は、HTML文字列をReact要素に変換するライブラリです。これにより、HTMLを安全にレンダリングするための柔軟な方法が提供されます。

:::note info
`react-html-parser`という似た名前のライブラリもあります。
`html-react-parser`は定期的に更新されており、最新のReactバージョンとの互換性が保たれています。一方、`react-html-parser`は更新頻度が低く、最新のReactバージョンと互換性が必ずしも保証されていない場合があります。基本的に`html-react-parser`を使う方が良さそうです。
:::


気になる方はスター数や最終更新日を確認してみてください。

https://github.com/remarkablemark/html-react-parser

https://github.com/peternewnham/react-html-parser


### インストール

まず、`html-react-parser`と`dompurify`をインストールします。

```bash:bash
npm install html-react-parser dompurify
```

### 使用例

`DOMPurify`でサニタイズしたHTMLを`parse`するだけ。簡単、スッキリ！

```typescript
import DOMPurify from "dompurify";
import parse from "html-react-parser";
import { FC } from "react";

interface Props {
  html: string;
}

const ParserSanitizedComponent: FC<Props> = ({ html }) => {
  const sanitizedHtml = DOMPurify.sanitize(html);
  
  return parse(sanitizedHtml);
  
// 比較用
// return <div dangerouslySetInnerHTML={{ __html: sanitizedHtml }}></div>;
};

export default ParserSanitizedComponent;
```



## 感想
dangerouslySetInnerHTMLは属性なので、何らかのタグと使う必要があり、不要なタグが一つ増えてしまいます。


使用ライブラリが増えてしまうというデメリットはありますが、それが問題なければ`html-react-parser`を使う方が良いかなと個人的には感じました。

**dangerously** というドキドキワードをコード内に含めなくて良いのも精神安定的に良い気がしますw


## おわりに
よかったら[X(@nyakako13)](https://twitter.com/nyakako13 "Xプロフィール")もフォローしてもらえると嬉しいです。

[Qiita100投稿](https://qiita.com/nyakako13/items/03ad61cfb82a1582b5d1)まで残り84！

未経験や浅経験、厳しいと言われている年代でエンジニアへの転職活動されている方、負けずにがんばりましょう！！


## 参考
https://qiita.com/hiromoon/items/f3ed77abd338139ba97b

https://ja.react.dev/reference/react-dom/components/common#common-props

https://github.com/remarkablemark/html-react-parser

https://github.com/peternewnham/react-html-parser
SPI液晶 ILI9341をTouchGFXで使おう7～専用基板を作ったよ～

__SPI液晶 ILI9341をTouchGFXで使おう6～新規プロジェクトからExampleを使おう～__ の続きです。

https://qiita.com/usashirou/items/97bd4f2a5d4c049ad270

__TouchGFX__ を __SPI液晶__ で使えるようにした専用基板を製作しました。
![STM32-Touchgfx-2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a3868457-4b60-83f7-66a3-2e332723a753.jpeg)
# 専用基板の必要性
__TouchGFX__ は __STマイクロ__ の特定の開発ボードでしか使用できず、安価なSPI液晶では使用できませんでした。
特に __X-NUCLEO-GFX01M2__ という __2.2インチ__ の __液晶ディスプレイ__ が存在しますが __65ドル__ と高額で __SPI液晶__ のように安価ではありませんでした。
今までジャンパワイヤーで接続していましたが、専用基板を製作したことで容易に使用できるようになりました。
# 対応液晶
対応するSPI液晶は3.5インチに限らず、__秋月電子__ で販売されている __2.8インチSPI液晶__ などにも対応しました。
# 対応ボード
今回、対応したメインボードは __STM32Nucleo__ に限らず __WeActStudio STM32F4x1 MiniF4__ にも対応しています。
https://github.com/WeActStudio/WeActStudio.MiniSTM32F4x1
# 外付けFlash
__TouchGFX__ は画像を扱うためどうしても容量が大きくなります。
このため、外付けの __SPI Flash__ が使用できるように外付けのSPI　Flashにも対応させました。
# 拡張機能
せっかくなので、__スイッチ__ と __LED__ も追加しました。
# 回路図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/0af44dee-bd74-e94b-012a-281b21a830d6.png)
Yamada UIでカラーモードを簡単に切り替える

# はじめに
気になっていたYamada UIを触っていて、**カラーモードの切り替えが簡単にできるらしい**ので使ってみました。
今回の使用言語はReact×TypeScriptです。
# 使用例

**まずはカラーモードを正常に動作させるために、vite.config.tsにプラグインを追加**します。
※今回はViteプロジェクトを使用しています。

https://yamada-ui.com/ja/getting-started/frameworks/vite#%E3%82%AB%E3%83%A9%E3%83%BC%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B

（Next.jsはこちら）

https://yamada-ui.com/ja/getting-started/frameworks/nextjs

```ts:vite.config.ts
import { defineConfig, Plugin } from "vite";
import react from "@vitejs/plugin-react";
import env from "vite-plugin-env-compatible";
import { defaultConfig, getColorModeScript } from "@yamada-ui/react";

//プラグイン追加
function injectScript(): Plugin {
  return {
    name: "vite-plugin-inject-scripts",
    transformIndexHtml(html, ctx) {
      const content = getColorModeScript({
        initialColorMode: defaultConfig.initialColorMode,
      });

      return html.replace("<body>", `<body><script>${content}</script>`);
    },
  };
}

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    react(),
    env({ prefix: "VITE", mountedPath: "process.env" }),
    injectScript(),
  ],
});

```
次に下記を参考にしてコンポーネントを呼び出します。**こんなに簡単にできるとは！**

https://yamada-ui.com/ja/styled-system/color-mode#%E3%82%AB%E3%83%A9%E3%83%BC%E3%83%A2%E3%83%BC%E3%83%89%E3%82%92%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B

```tsx:tsx
 const { colorMode, toggleColorMode } = useColorMode();

  return (
    <>
          <Button onClick={toggleColorMode} mb={2}>
            {colorMode === "light" ? "ダーク" : "ライト"}モードに切り替える
          </Button>
    </>
  );
```

**ライトモード使用時（例）**
画面左上のボタンを押すとモードが切り替わります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675500/8abdc8ed-0e92-f60d-66dc-4e410141cb45.png)

**ダークモード使用時（例）**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675500/01c32fc1-ab6d-5ca8-235c-a8fe919ee30c.png)


# おわりに
他のUIコンポーネントライブラリではここまで簡単に実装できないのではないでしょうか。
公式ドキュメントも丁寧で見やすいのでぜひ覗いてみてください！
# 参考

https://yamada-ui.com/ja/styled-system/color-mode#%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97
Web開発入門 ~Web基礎知識~

※本記事はチームの勉強会で使用した資料です。

---

## はじめに

今回は、Web開発入門の第一回としてWebとは何か、Webの周辺知識に言及したいと思います。

---

## Webとは

Web開発について学ぶ上で、大前提としてWebとはどのようなものなのかを理解しておきましょう。

Webとはネットワーク上の様々な情報を公開・閲覧することを可能にする仕組みのことです。

Web上で公開される文書はハイパーテキストという仕組みで、別の文書と相互に参照できるという特徴があります。

---

### World Wide Web

多くの人が利用しているWebとして、World Wide Webというものがあります。
World Wide Webとは、世界中に張り巡らされたWebのことです。
インターネットが発達した近年では、非常に身近なものになっています。
後述しますが、インターネット = World Wide Webという認識の方も多いのではないでしょうか。

プライベートなネットワーク領域に構築されたWebなどもあるかもしれませんが、
一般的にWebといえばWorld Wide Webのことを指す場面が多いはずです。

www.xxxxx.com のようなURLを見たことがあると思いますが、このwwwはWorld Wide Webを表しています。

---

## インターネットとWeb

先ほども言及しましたが、Webに似た概念としてインターネットがあります。両者の違いは何でしょうか？

### インターネット

世界中のコンピューター同士を接続して構築された地球規模の情報通信網のことです。
つまりネットワークそのものを指す言葉です。

### Web

先述したとおり、ネットワーク上で情報を公開・閲覧する仕組みのことです。

つまり、インターネットという通信技術の上にWebの仕組みが実現されているという関係性にあります。
インターネットを「道」、Webはその道を利用して「もの（情報）」を運ぶ仕組みと置き換えるとわかりやすいかもしれません。

---
## Webの用途

### Webサイト

Webサーバー上のコンテンツを閲覧する。

### Webアプリ

Webページをインタフェースとして、メールを送受信したり、ショッピングをしたりする。

---

## HTMLとWebブラウザ

### HTML
Web上の文書はHTMLという言語で記述されています。
HTMLはHyper Text Markup Languageの略称です。
ハイパーテキストについては前述したとおりですが、Markup Languageとはどのようなものでしょうか？

タグを使って意味づけを行う言語ということです。
例えば以下の場合「Web開発入門」にtitleというタグがつけられており、文書のタイトルであるということを表しています。
```html
<title>Web開発入門</title>
```

ただし、HTMLは人間が読むにはあまり適していません。
そこでWebブラウザが登場します。

---

### Webブラウザ

WebブラウザはHTMLを解釈して人間が読みやすいように表示してくれます。
WebブラウザにはEdge、Chrome、Firefox、Safariなどの種類があり、各ブラウザのデフォルトのデザイン設定などで若干見た目に差異があるかもしれませんが、HTMLであればどのブラウザでも同じように表示することができます。

なぜどのブラウザでも同じように表示できるのでしょうか？

---

## 標準化
標準化とは規格を定めることです。

一言にHTMLといっても互いに互換性のない複数の規格があると、WebブラウザごとにHTMLAは表示できるけどHTMLBは表示できないといった事態になってしまいますが、HTMLがどのようなものなのかはある特定の機関によって定められており、HTMLを記述する人もHTMLを表示するブラウザもこれに従っています。
このためWebブラウザであればどのブラウザでもHTMLであれば表示することができるのです。

---

### 標準化団体

Web関連の技術の標準化を行う団体として有名なのがW3C（World Wide Web Consortium）があります。
HTMLも以前はW3Cによって標準化が行われていました。（HTML5）
2024年現在はWHATWG（Web Hypertext Application Technology Working Group）という団体がHTMLの標準化を行っています。（HTML Living Standard）

---

## おわりに

第一回ということでWebとWebの周辺知識についてご説明しましたが、いかがだったでしょうか？
第二回はWebに関連するネットワーク技術について、解説しますのでご期待ください。
ID検証のまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


+ [ID検証の確認コード通知がされない](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007eorag)


メールにより確認コードを受信できない場合の回避策も記述されているので参考にしてみてください。

確認コードを受信できない

https://help.salesforce.com/s/articleView?id=000383218&type=1

+ [ID検証(確認コード)とMFAの両立は可能か](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Bqyi7SAB)

実際にはやったことがないので、ラフなアイデアとかくらいに思ってください。

Apexで多要素認証を実装する
https://help.salesforce.com/articleView?id=sf.security_2fa_apex_config.htm&type=5

モバイルデバイス追跡でデバイスアクセスを管理する
https://help.salesforce.com/articleView?id=sf.security_device_management_revoke.htm&type=5


のどちらもApexでコードが書けるようです。ということは両方の機能を満たすようことができれば
実現できるかもしれないです。ただし、そのようなサンプルは見たことないですが...
robloxでassistant その93

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
飛べ。

# 手順
- ReplicatedFirstに、localscriptを追加。
- スクリプトを書く。

```
local camera = game:GetService("Workspace").CurrentCamera
local character = game:GetService("Players").LocalPlayer.Character or game:GetService("Players").LocalPlayer.CharacterAdded:Wait()
local hrp = character:WaitForChild("HumanoidRootPart")
local humanoid = character:FindFirstChildOfClass("Humanoid")
local bodyGyro = Instance.new("BodyGyro")
bodyGyro.MaxTorque = Vector3.new(1, 1, 1) * 10^6
bodyGyro.P = 10^6
local bodyVel = Instance.new("BodyVelocity")
bodyVel.MaxForce = Vector3.new(1, 1, 1) * 10^6
bodyVel.P = 10^4
local movement = {
	forward = 0, 
	backward = 0, 
	right = 0, 
	left = 0
}
bodyGyro.Parent = hrp
bodyVel.Parent = hrp
bodyGyro.CFrame = hrp.CFrame
bodyVel.Velocity = Vector3.new()

local function movementBind(actionName, inputState, inputObject)
	if inputState == Enum.UserInputState.Begin then
		movement[actionName] = 1
	elseif inputState == Enum.UserInputState.End then
		movement[actionName] = 0
	end
	local isMoving = movement.right + movement.left + movement.forward + movement.backward > 0
	return Enum.ContextActionResult.Pass
end
local function onUpdate(dt)
	local cf = camera.CFrame
	local direction = cf.RightVector * (movement.right - movement.left) + cf.LookVector * (movement.forward - movement.backward)
	if direction:Dot(direction) > 0 then
		direction = direction.Unit
	end
	bodyGyro.CFrame = cf
	bodyVel.Velocity = direction * humanoid.WalkSpeed * 3
end
game:GetService("ContextActionService"):BindAction("forward", movementBind, false, Enum.PlayerActions.CharacterForward)
game:GetService("ContextActionService"):BindAction("backward", movementBind, false, Enum.PlayerActions.CharacterBackward)
game:GetService("RunService").RenderStepped:Connect(onUpdate)




```


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e48b8e44-2590-7b1c-a18a-bc0cd082116e.png)



以上。
クラウドの基礎知識

# オンプレミスとクラウドの比較
### **オンプレミス**
システムの稼働やインフラの構築に必要となるサーバーやネットワーク機器、ソフトウェアなどを自社で管理し、運用する方式。

**メリット**
* ITインフラを自社で構築・運用するため、システムに合わせて自由にカスタマイズする事が出来る。
* 社内専用のITインフラを構築し、ユーザーも自社の社員のみなのでセキュリティ性が高い。

### **クラウドコンピューティング** 
インターネットを通じて、仮想化したサーバーリソースをオンデマンド(ユーザーからのリクエストに応える方式)にかつ柔軟に提供するサービス。

**メリット**
* システムの構成機器を自社で調達する必要がないため、低コストかつ短期間にITシステム環境を構築できる。
* システムの構築後であっても、プロジェクトの展開に応じてサーバーやストレージの規模を拡張したり、新しい機能を追加したりすることが可能。

:::note warn
ここで言うクラウドコンピューティングはパブリッククラウドを指すものとする。
:::

## 総括(オンプレミスとクラウドについて)
### **オンプレミス**
システムの全てを自社で管理・運用するため、カスタマイズ性やセキュリティ性が高いが、導入期間が長く、導入コストも高い(特に初期コスト)
自社独自のシステムに連携させたい場合や、機密性の高い情報を取り扱う場合に適している。

### **クラウドコンピューティング**
低コストかつ短期間で環境構築が可能であり、システム構築後の拡張性は高いが、ITインフラの管理をベンダーに依存する関係上、カスタマイズ性やセキュリティ性は低くなる。
コストを抑えて運用したい場合やプロジェクトの展開に合わせてリソースを拡張・縮小させたい場合に適している。

# クラウドコンピューティングの種類
### **IaaS(Infrastructure as a Service)**
情報システムの構築に必要な仮想サーバーや、ネットワークなどのインフラ環境を提供するサービス。
#### **主なサービス**
* AWS(Amazon Web Services)
* GCP(Google Cloud Platform)
* OCI(Oracle Cloud Infrastoracture)

### **PaaS(Platform as a Service)**
アプリケーションを開発するためのプラットフォーム(システムやソフトウェアを動作させるための基盤)を提供するサービス。
#### **主なサービス**
* Heroku
* Privotal Application Service
* CloudFoundry

### **SaaS(Software as a Service)**
目的に応じたアプリケーションやソフトウェアを提供するサービス。
#### **主なサービス**
* Force.com
* Googleドキュメント
* Zoom
スワップの発生状況を確認する方法

## free
```shell
free -h
```
```
               total        used        free      shared  buff/cache   available
Mem:           7.5Gi       2.1Gi       599Mi       159Mi       5.3Gi       5.4Gi
Swap:          8.0Gi        10Mi       8.0Gi
```

## top
```bash
top -bn1 | grep Swap
```
```
MiB Swap:   8192.0 total,   8181.2 free,     10.7 used.   5324.7 avail Mem
```

## /proc/swaps
```bash
cat /proc/swaps
```
```
Filename				Type		Size		Used		Priority
/dev/sda6               partition	8388604		10748		-2
```
```bash
swapon -s
```
```
Filename				Type		Size		Used		Priority
/dev/sda6               partition	8388604		10748		-2
```
`cat /proc/swaps` と `swapon -s` または `swapon --summary` は同じ内容が出力される。

## /proc/meminfo
```bash
cat /proc/meminfo | grep Swap
```
```
SwapCached:         1168 kB
SwapTotal:       8388604 kB
SwapFree:        8378112 kB
```

## sar
```bash
sar -W
```
```
Linux 5.14.0-362.24.1.el9_3.x86_64 (hostname) 	2024年05月31日 	_x86_64_	(4 CPU)

00時00分00秒  pswpin/s pswpout/s
00時05分00秒      0.16      0.00
00時10分00秒      0.00      0.00
00時15分00秒      0.09      0.07
00時20分00秒      0.00      0.04
00時25分00秒      0.00      0.00
00時30分00秒      0.00      0.02
```

## スワップのプロセスの一覧を表示 (/proc/[0-9]*/status)
```shell
find /proc \
 -readable \
 -path "/proc/[0-9]*/status" \
 -maxdepth 2 \
 -exec awk -v FS=":" \
  '{process[$1]=$2;sub(/^[ \t]+/,"",process[$1]);} END {if(process["VmSwap"] && process["VmSwap"] != "0 kB") printf "%10s %-30s %20s\n",process["Pid"],process["Name"],process["VmSwap"]}' '{}' \; \
  | awk '{print $(NF-1),$0}' \
  | sort -hr \
  | cut -d " " -f2-
```
```
   3035731 /usr/sbin/httpd                              252 kB
   2897954 /usr/sbin/httpd                              252 kB
   3035948 /usr/sbin/httpd                              248 kB
   3035736 /usr/sbin/httpd                              248 kB
   3035735 /usr/sbin/httpd                              248 kB
   3035734 /usr/sbin/httpd                              248 kB
   2903067 auditd                                        40 kB
   2903923 master                                         4 kB
       865 crond                                          4 kB
```

## swappiness
```bash
sysctl vm.swappiness
```
```
vm.swappiness = 60
```
ローディング画面→画像表示の実装

# やりたいこと
+ ランダムな画像URLを返すAPIから，取得した画像を表示するWEBアプリケーション．
+ ボタンを押すと画像が切り替わる（再度API）
+ 画像の切り替わりには時間がかかる
    + APIからのフェッチ処理， URLへのアクセス，画像の描画などが原因
    ➡️ 画像の切り替わり中にはローディングのアニメーション（ローダー）を表示したい:bangbang:
    
# 実装方法
大きく２つ考えられる．

1\. 画像が表示される瞬間に表示コンテンツを切り替え（ローダー↔️猫画像）
+ Loadingバーの様な，時間経過が目に見えるコンテンツをローダーとして使用したい場合など．

2\. 画像の背景で常にローダーを動かす
+ シンプルなローダーの場合，こちらの方が楽に実装できて良いかも．．．

正直，２の方法のほうが楽だと思います．１の方法は似たようなケースが見つからず大変だった（今回は1の形で実装したかったので，がんばって実装しました）

# 使用技術
+ フロントエンド
    + html
    + css (css module)
    + React
    + Next.js
+ バックエンド
    + The Cat API
        + ランダムな猫の画像データをjson形式で返すウェブAPI
        + 画像はURLで渡されるため，img src="https://〇〇" 　の形式に．
        + APIからjsonの取得に加え，imgタグに読み込んだ"https://〇〇"　 へのアクセス時間もタイムラグが生じる
        
https://thecatapi.com/

# 結論
以下は，この機能の実装にあたっての重要部分です．(コード全体は以下のURLから)
https://github.com/shimiharu1012/random-cat



```javascript:

    // 画像の描写が完了したら呼び出される
    // loadingを更新する　
    //その後，再レンダリング
    const handleLoad=()=>{
        setLoading(false)
 
    }


    //　　　　！！！！！重要！！！！！
    // loadingはreactのstate
    // loadingの真偽で分岐し，要素を隠す場合はstyle.hiddenを代入
    // もう一方には空文字列を代入
    const isVisibleLoader=loading ?  "" : styles.hidden 
    const isVisibleImage=loading ? styles.hidden : ""


    return(
        <div className={styles.container}>
            <button onClick={handleClick} className={styles.toNext}>他のニャンコも見る</button>
            <div className={styles.imageContainer}>
                <div className={`${styles.loader} ${isVisibleLoader}`}></div>
                // 画像が完全に描画されたらイベントonLoadの関数handleLoadが実行される
                <img onLoad={handleLoad} className={`${styles.image} ${isVisibleImage}`} src={ImageUrl}></img>
            </div>
        </div>
    )

```
```css:index.module.css
.hidden{
    display: none;
}
```


以下が参考になりました

https://stackoverflow.com/questions/51498816/how-to-conditionally-apply-styles-in-a-react-component-with-css-modules



:arrow_down:実際の動作はこんな感じ

![画面収録-2024-05-31-0.54.41.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782784/b2c2ad28-d482-5b57-12ba-218bb0f25f89.gif)



:arrow_down:コード全体
https://github.com/shimiharu1012/random-cat




# 感想
珍しいパターンを実装してみることは大事かも．いい勉強になる．
ただ，実務などでは，その実装は本当に必要か？という点を考慮する必要があるだろう．
今回の場合なら，ローダーを画像の後ろで常に待機させておけば十分だし，それでもアニメーションに違和感があるなら，ローダーの種類を変えてみたりして違和感を少なくするという解決策もある．



# 参考
https://typescriptbook.jp/tutorials/nextjs
UnrealEngineのHit処理

# 内容
設定が分かるまで時間がかかったので備忘録として書く。
特別難しい内容ではなく、ただの設定。
Box Collisionコンポーネントのような追加したCollisionを使用してHit処理を書きたい人向け
# 環境
UE5.3.2
# 方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366802/679e2bb0-d4d0-9b40-7606-209f2ee57355.png)
- Collision Enabled
Query Only(Physicsのほうは物理シミュレーションに使用するものなので今回は必要ない)
- オブジェクト応答
Player相手ならPawn
自作BPへのHit処理（弾丸どうしの衝突時の処理とか）を書きたい場合はプロジェクト設定からオブジェクトチャンネルとプリセットを新規作成しておく

この設定でBox CollisionがHitイベントを発行できるようになる。
# 今回の原因
CollisionのようなHit検知オブジェクトのデフォルトは
- Unity
Block(だったはず。。。）
- Unreal Engine
Overlap

になっている。

元々Unityを使用していたためCollision = 壁みたいな印象があり、CollisionでPawnをブロックするのに設定が必要だという思考にならなかった。
ただStaticMesh側で設定したコリジョンは最初からCollisionEnabledになっているのでHitがとれる。
WindowsでPostgreSQLの環境変数を設定する方法

### 手順

①Windowsのスタートメニューから「システム環境変数の編集」を選択

②「環境変数」ボタンを押下し環境変数ウィンドウを開く
③「Path」を選択し「編集」ボタンを押下、「環境変数名の編集」ウィンドウを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533750/db2c24e9-6a55-876a-9492-a3812f76e2dc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533750/3d09a5ee-e3b1-2e60-a191-5ec40c8c1cc7.png)

④「新規」ボタンを押下し、PostgreSQLのbinフォルダが保存されているパスを設定
⑤「OK」ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533750/9745454c-d1f6-3d42-8123-3b1ff0a47429.png)

⑥ PCを再起動
⑦コマンドプロンプトを開き「psql --version」コマンドでパスが通っているか確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533750/442594f9-dd9b-17fa-3563-0bc53a6bba93.png)

この手順で、コマンドプロンプトやPowerShellからpsqlコマンドが使用できるようになりました。
【Raspberry Pi】Raspberry Pi OSの日本語用キーボード設定

# 経緯
Raspberry Pi OS(Raspberry Pi 5)の初期設定では日本語入力に対応していなく、設定方法も初心者には分かりにくかったため手順をまとめてみました。

<span style="color: red; "> ※2024/05/31時点での情報を参考にしています。</span>

## 環境
* デバイス：Raspberry Pi 5
* OS : Raspberry Pi OS(64bit)

## 手順


#### 1. raspi-configを起動し、デフォルトのウィンドウマネージャーを`X11`に切り替える  
:::note info
Raspberry Pi 5はデフォルトで`Wayland`というウィンドウマネージャーが採用されていますが、こちらを使用した場合、日本語変換機能を提供する`fcitx-mozc`で一部ソフトウェアが動作しないとのことなので、`X11`に切り替えを行います。
:::

* raspi-configを起動します。
```
$ sudo raspi-config
```
* 以下の順序で`FINISH`まで選択するとデフォルトのウィンドウマネージャーが`X11`に切り替わり、再起動が実行されます。
 `6 Advanced Options`
 `A6 Wayland`
 `W1 X11`
 `FINISH`  
 
* 再起動後、次のコマンドの実行結果が`X11`になっていれば変更できています。
```
$ echo $XDG_SESSION_TYPE
X11
```

#### 2.fcitx-mozcをインストール
* インストール実行
```
$ sudo apt update && sudo apt install fcitx-mozc -y
```
* インストール後、再起動をすると画面右上にキーボードのアイコンが表示され半角/全角キーが使用可能になります。

# 参考
https://www.indoorcorgielec.com/resources/raspberry-pi/raspberry-pi-input-japanese/#fcitx-icon
ssh -T githubは通るのにgit cloneできない

タイトル通り、突然githubへのアクセスが`Permission denied`になってしまいました。

# 解決策
`C:\Program Files\Git\etc\ssh\ssh_config`を編集する。

# 要因
どうやら、`ssh`コマンドでの設定は`%USERPROFILE%/.ssh/config`を参照していたのに対し、`git`コマンドでは上記の設定を見ていたようです。

突然変わってしまった要因はわかりませんが、前後の操作を鑑みるにVisualStudioのアップデートが要因だと思います。
HTMLとCSSの基本（初心者用）

（初心者向け）自身の備忘としてアウトプットしています。
# HTMLの基本構造
HTMLの基本構造は以下のような構成になっています。
```
<!DOCTYPE html>
<html>
    <head>
    </head>
    <body>
    </body>
</html>
```
# head要素の中に必ず記載する項目
head要素には以下のようにWEBページの設定を記載します。
WEBページには表示されません。

```
<head>
    <meta charset="utf-8">
    <title>ページのタイトル名</title>
    <link rel="stylesheet" href="CSSのファイル名">
</head>
```

# body要素の中に記載する項目の一例

### リストを作成する場合
リスト作成は以下のようなコードを入力してください。
```
<ul>
    <li>リスト</li>
    <li>リスト</li>
    <li>リスト</li>
</ul>
```
# メインの構造
main要素は、「copy-container」、「contents」、「contact-form」の3つの要素で構成されています。

# 改行される要素と改行されない要素
改行される要素がブロック要素：div、h1、p
改行されない要素がインライン要素：span、a

# お問い合わせフォームのレイアウト
input要素は１行のテキスト入力を受け取るための要素。input要素は終了タグが不要。
textarea要素は複数行のテキスト入力を受け取るための要素。

input要素にはtype属性を指定することができ、type属性にsubmitを指定すると、送信ボタンになります。
なお、value属性に任意の値を指定することで、ボタンに表示されるテキストを変更することができます。

```
<form>
    <p>名前</P>
    <imput>
    <P>内容</p>
    <textera></textera>
    <input type="submit"　value="保存">
</form>
```




# よく使用するCSSの抜粋（備忘のために記載）
### 要素を左から順に横並びにする場合
```
float: left;
```
### 要素を右から順に横並びにする場合
```
float: right;
```

### 要素に余白を入れる場合
以下のように余白が挿入されます。
padding-top、padding-bottom、padding-left、padding-rightのように記載することで、一部分の方向にのみ余白を入れることも可能です。
```
padding: 20px;
padding:20px 10px 30px 40px;(上右下左の順番）
padding:20px 10px;（上下、左右の順番）
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984055/0991490d-3501-1ff3-5334-124b961cf677.png)

### 入れ子のセレクタ設定
一部のリストのみCSSを変更したいときは、以下のように要素を指定することで可能です。
```
.header-list li{
    color:#FFF;
}
```
### 文中の文字を書式変更したい場合
文中の一部のみCSSの変更をしたい場合は、以下のようにspan要素を利用します。
```
<h1>
    ようこそ<span>日本</sapn>へ
</h1>

ーーー以下はCSSーーー
.span{
color:#FFF
}
```

### 要素に枠線をつける場合
borderプロパティを用います。枠線の太さ、種類、色を順番に指定して使用します。
```
.logo{
    border:5px solid red;
}
```