OmniAICreator/Qiita-1.07M huggingface dataset:
情報源符号化

# 情報源符号化

　情報は、通信路や記憶媒体を通じて受信者に伝達される。その際、情報を正しく伝達するための通信路符号化や、情報が膨大である場合、できるだけ短く（小さく）する情報源符号化が行われる。

# ハフマン符号化

　情報源符号化の代表的な方法の一つ。
　情報を表す際は、最も少ないビット数で一意に符号することが重要となる。例えば、a,b,c,dの4文字を符号化する場合、1文字当たり2ビットあれば、それぞれを一意に識別できる。しかし、各文字の出現確率が異なる場合、1文字当たりの平均ビット数を2ビットより少ないビット数で表現が可能となる。

　ハフマン符号化は出現度の高い文字は短いビット列で、出現度の低い文字は長いビット列で符号化、これにより1情報源記号（文字）当たりの平均ビッド長を最小とする圧縮方法である。


# ランレングス符号化

　データ列の冗長度に着目し、同じデータ値が連続する部分を探し、その反復回数とデータ値の組に置き換えることで、データ長を短くする圧縮方法である。

　例えば、Aが連続して5つ出現する場合、「AAAAA」 → 「4A」とすることで、データ長を短くする。
　「データの長さから1減らした数 + 該当文字」という方式となる。

　ランレングス符号化は、文字データ列だけでなく、2値画像の圧縮にも利用される。この場合、同じ色（値）が連続した個数だけを記録するという方法で行われる。

 　例えば、「白を0」、「黒を1」と仮定した場合、「00000000111000」は「8,3,3」に置き換えて表現される。

# デジタル符号化

　アナログデータをデジタル符号に変換するパルス符号変調（PCM）と呼ばれる手法がある。
　方法は以下の手順で行われる。

・標本化
　サンプリングとも呼ばれる。アナログ信号を一定時間間隔で切り出す。
　1秒間に、サンプリングする回数をサンプリング周波数と呼ぶ。

・量子化
　サンプリングしたアナログ値をデジタル値に変換する。
　このとき、1回のサンプリングで生成されるビット数を量子ビット数と呼ぶ。例えば、量子化ビット数が8ビットであれば、0～255の数値へ変換される。

・符号化
　量子化で得られたデジタル値を2進符号形式に変換、符号化ビット列を得る。
　例えば、デジタル値が180なら、10110100へ
　165なら10100101に符号化される。
Brainfuck interpreter in C and Go

bf.c
brainfuckのインタープリタです。
cc bf.c -o bfとしてコンパイルしてください。
bf \<file\>とすると、ファイルからbrainfuckで書かれたプログラムを読み込み、実行します。


```bf.c
#include    <stdio.h>
#include    <stdlib.h>
void main(int argc,char *argv[]) {
    FILE *fp;
    char prog[65536]={0},array[30000]={0},*ptr=array;
    int  loopstack[1000],lsp=0,idx,len;

    fp=fopen(argv[1],"rt");
    for(len=0; (prog[len]=fgetc(fp))!=EOF;len++);
    fclose(fp);

    for(idx=0;idx<len;)
        switch (prog[idx++]) {
            case '>': ptr++; continue;
            case '<': ptr--; continue;
            case '+': (*ptr)++; continue;
            case '-': (*ptr)--; continue;
            case '.': putchar(*ptr); continue;
            case ',': *ptr=getchar(); continue;
            case '[':
                if (*ptr) loopstack[lsp++]=idx-1;
                else for(int nest=1;idx<len;) {
                        int c=prog[idx++];
                        if (c=='[') nest++;
                        else if (c==']' && --nest==0) break;
                        }
                continue;
            case ']': idx=loopstack[--lsp]; continue;
            default: continue;
            }
}

```

#### Go

こちらは、goによるbrainfuckインタプリタです。
cで書いたものをGoogle AI studioでgoに変換し、手直しをしました。

hot to execute: `go run bf.go sample.bf`

```bf.go
package main

import (
	"fmt"
	"io/ioutil"
	"os"
)

func main() {
	if len(os.Args) != 2 {
		fmt.Println("Usage: go run bf.go <filename>")
		return
	}

	filename := os.Args[1]
	program, err := ioutil.ReadFile(filename)
	if err != nil {
		fmt.Println("Error reading file:", err)
		return
	}

	array := make([]byte, 30000)
	ptr := 0
	loopStack := make([]int, 1000)
	lsp := 0

    ip := 0

	for ip < len(program) {
        c:=program[ip]
        ip++
		switch c {
		case '>':
			ptr++
		case '<':
			ptr--
		case '+':
			array[ptr]++
		case '-':
			array[ptr]--
		case '.':
			fmt.Print(string(array[ptr]))
		case ',':
			var input byte
			fmt.Scanf("%c", &input)
			array[ptr] = input
		case '[':
			if array[ptr] != 0 {
				loopStack[lsp] = ip-1
				lsp++
			} else {
                nest := 1
                for ip < len(program) {
                    c:=program[ip]
                    ip++
					if c == '[' {
						nest++
					} else if c == ']' {
						nest--
						if nest == 0 {
							break
						}
					}
				}
			}
		case ']':
			lsp--
			ip = loopStack[lsp]
		}

		// Bounds check for the pointer. Exit with an error if out of bounds.
		if ptr < 0 || ptr >= len(array) {
			fmt.Println("Pointer out of bounds")
			return
		}
	}
}
```
Git error: you need to resolve your current index first

# 何してたかって？
自分が作業してたブランチの作業をテスト用のブランチに諸事情でマージじゃなくてCherry-pickで持ってこようとしたんですよ。
そしたら元にしたブランチが少し古くて
`CONFLICT (content): Merge conflict in ファイル名`
`error: could not apply コミット名`
と出てしまいまして。

Mergeするにもその同僚が休暇中だったので、だったらいったん自分のコミットRevertして、同僚のコミット取り込んでからまた編集しようと思ったんですよ。
なのでいったん自分が作業してたブランチに戻ろうとしたんですね。そしたら
`error: you need to resolve your current index first`
`競合ファイル名: needs merge`
ふーむ

### まずはgit cherry-pick --abort
`error: no cherry-pick or revert in progress`
`fatal: cherry-pick failed`
ほーう

### ググるとgit merge --abortが魔法の呪文らしい
さっそく実行
`fatal: There is no merge to abort (MERGE_HEAD missing).`
おーん
### たどり着いたのが
`git reset --merge`
どうやら
`needs merge`
`error: you need to resolve your current index first`
が一緒に出てるときはmergeをgit resetするのがよろしいようで
以下参照
https://stackoverflow.com/questions/6006737/git-merge-errors
Xcodeを使ったプロジェクトの作成と管理方法を学ぶ。

```
Xcodeを使ったプロジェクトの作成と管理方法を学ぶ。

上記について

作業のタスクを分けてください
```

## 作業のタスクを分けると次のようになります：

### プロジェクトの作成
- [ ] Xcodeをインストールする
- [ ] Xcodeを起動してプロジェクトを新規作成する
- [ ] プロジェクトのテンプレートを選択する
- [ ] プロジェクトの保存先を指定する
- [ ] プロジェクトの名前やバンドルIDを設定する
- [ ] プロジェクトのファイル構造を理解する
- [ ] ソースコードやリソースファイルを追加する
- [ ] ビルド設定を調整する
- [ ] プロジェクトのビルド、実行、デバッグの方法を学ぶ

### 管理方法
- [ ] プロジェクトをGitHubや他のバージョン管理システムに接続する
- [ ] Xcodeの設定を開く
- [ ] アカウントの追加
- [ ] バージョン管理システムの選択
- [ ] 認証情報の入力
- [ ] リポジトリの作成または接続
- [ ] プロジェクトの設定

### プロジェクトの作成

#### Xcodeをインストールする：

- Mac App StoreからXcodeをダウンロードしてインストールします。
`ダウンロードにはインターネット接続が必要です。`

#### Xcodeを起動してプロジェクトを新規作成する：

- インストール後、LaunchpadやFinderからXcodeを起動します。
- Xcodeが起動したら、「新規プロジェクトを作成」を選択します。

#### プロジェクトのテンプレートを選択する：

- テンプレート画面で、適切なプラットフォーム（iOS、macOS、tvOS、watchOS）とプロジェクトの種類（App、Framework、Gameなど）を選択します。

#### プロジェクトの保存先を指定する：

- プロジェクトの保存先を選択し、「次へ」をクリックします。
`通常、デフォルトの保存先を使用しますが、必要に応じて変更することができます。`

#### プロジェクトの名前やバンドルIDを設定する：

- プロジェクト名、組織名、バンドルIDなどの詳細を入力します。
`これらの情報は、アプリの識別やビルド時に使用されます。`

#### プロジェクトのファイル構造を理解する：

- Xcodeの左側にあるナビゲーターエリアで、プロジェクトのファイル構造を確認します。
`主なフォルダには、ソースコード、リソース、設定ファイルなどが含まれます。`

#### ソースコードやリソースファイルを追加する：

- 「新しいファイルを追加」を選択します。
`プロジェクト内に新しいファイルを追加するには、ナビゲーターエリアでプロジェクトの対象フォルダを右クリック`

#### ビルド設定を調整する：

- 「ビルド設定」タブを開いて設定を調整します。
`プロジェクトのビルド設定は、プロジェクト設定で行います。プロジェクトナビゲーターでプロジェクトファイルを選択`

#### プロジェクトのビルド、実行、デバッグの方法を学ぶ：

- プロジェクトをビルドする
`プロジェクトをビルドするには、「ビルド」ボタンをクリックします。`
- プロジェクトを実行する
`実行するには、「実行」ボタンをクリックします。`
- プロジェクトをデバッグする
`デバッグするには、デバッグツールを使用してブレークポイントを設定し、ステップ実行や変数の監視を行います。`

### 管理方法

#### プロジェクトをGitHubや他のバージョン管理システムに接続する：

プロジェクトをGitHubや他のバージョン管理システムに接続する際の細かい設定については以下の手順に従います：

#### Xcodeの設定を開く：

- Xcodeを起動し、メニューバーから「Xcode」を選択し、「設定」をクリックします。

#### アカウントの追加：

- 設定画面が開いたら、「アカウント」タブを選択し、「＋」ボタンをクリックして新しいアカウントを追加します。

#### バージョン管理システムの選択：

- アカウントの追加画面で、バージョン管理システムとしてGitHubやGitLabなどを選択します。

#### 認証情報の入力：

- バージョン管理システムの選択後、必要に応じてGitHubのユーザー名やパスワード、アクセストークンなどの認証情報を入力します。

#### リポジトリの作成または接続：

- 認証情報が入力されると、リポジトリの一覧が表示されます。既存のリポジトリを選択して接続するか、新しいリポジトリを作成します。

#### プロジェクトの設定：

- リポジトリが選択または作成されると、Xcodeは自動的にプロジェクトをバージョン管理システムに接続します。必要に応じて、プロジェクトの設定を変更します（例：ローカルのブランチとリモートのブランチのマッピングなど）。

これらの手順に従うことで、Xcodeを使用してプロジェクトをGitHubや他のバージョン管理システムに接続することができます。
コンポーネントチームとフィーチャーチーム

# 前書き
2023年9月にLeSSの講演で有名なバス氏のイベントに参加してきた際、
コンポーネントチームとフィーチャーチームの違いについて説明されるイベントであったので、
その内容をここに残す。
LeSSイベントでバス氏からの内容とチームトポロジーの内容が深く関連付けられた。

# 前提知識
## ストリームアイランドチーム
チームトポロジーで扱われる、主なチーム形状のことであり、
ちょうど１つのドメインサービスを担当するチームである。
サービスの規模が小さい場合には、運用コンポーネントの方の責務も担う。

# LeSSの背景
多くのチームにとっては、チーム間の結合度合いは疎結合であるべき
という既存の常識を真っ向から否定した発想がこのLeSSである。

①経営サイドからのトップダウンと、業務に詳しい現場からのボトムアップ
その両方をチェックして組織の方向性(経営方針)を全員揃えるとなると、
どうしてもゆっくりになってしまう。

②かといって、素早さを追求し過ぎるとその方向性が揃わない。
人が多かったり、組織構造が深い階層だと、なおのこと方向性を揃えるのは困難になる。

LeSSでは、デリバリーの早さよりも正しい方向に進むことによりイノベーションを活性化することを重要視している思想である。
そのため、①に該当するので、当然デリバリー速度は②に比べたら落ちる。

:::note info
丁度チームトポロジーで言う、インタラクションの中の
【コラボレーション連携】を組織全体で行うイメージである。
:::


# コンポーネントチームとフィーチャーチームの概要
<img width="500" alt="component-vs-feature-teams.png (1.1 MB)" src="https://img.esa.io/uploads/production/attachments/5827/2024/02/03/135213/c1ca5b1d-c692-48b1-bf5d-c10ae4a1fea6.png">

２つの概要図は上の図の通りである。
多くの不確実性の高いプロジェクトでうまく行かない理由は、ここにまず集約されると思っている。
というのも、大規模エンタープライズ系でいきなりチームがいくつかに分断されているのだ。
実際に皆さんもあると思うが、分断されたチームの境界が時には組織の壁であったりする。
すると、お客さんの資料待ちが発生したりし、その間にも納期までの制限時間は
刻一刻と迫っていて、なんてことが起きてしまう。
そもそも顧客組織とコラボレーションするのにもかかわらず、
自社と相手組織っていう風に最初から分断したチーム境界の定義の仕方がおかしい。

だってよく考えてみてほしい。
プロセス面において、自社で考えているビジネスフローと相手組織で扱っている
ビジネスフロー、この一連の連携からコラボ案件で実現したいさらに上位目的があるわけだから。
だからドメインサービスの境界の位置だって、下図のようになりうるはず。
すると、どんな現象が起きるかっていうと、
自社の組織内の他の人との連絡のやり取りよりも、コラボ先の組織の人との連絡の頻度の方が密になっているということ。

# ドメインごとのコンテキスト境界の大切さ
## 分散モノリス化されたチーム構造
他の組織とコラボして、さらに上位の目的を達成指定という時に、
不確実性の高いビジネスにおいては、そもそも最初からサービスのコンテキスト境界が
明らかになっている箇所の方が少ないように感じる。
この境界の定義の仕方が、最初から他の選択肢と比較されずに、
ありきたりな自社フロントエンドチーム、自社バックエンドチーム、
自社ビジネスサイドチーム、相手先フロントエンドチーム、相手バックエンドチーム、
みたいな職能別な切り方をされていると、
「そちらにあるこんな情報をこっちにください」と連絡
    →相手側も大忙しであったりして、その間待ちが発生。時にはこちらから何度も催促するなんて現象が起きる。

しかも連絡に気づいていなかったとかいうケースもあれば、
情報を所有している部門に「受託先にこんな情報を返さないといけないから、
情報へのアクセス権限を付与してください」
→またここで、価値を生んでいないどころか、足かせになっている承認プロセスが走るなど、

適切にコンテキスト境界が定義されていない縦わり分断と、
情報の所有権の割当が、なんとなくで組織が運用されていることによって、
全体的なパフォーマンスが非常に悪いという現象を自分はあるDX案件で体験した。
これは同じ組織内での分断ならまだかわいい方で、組織の壁という分断となると、
さらにビックスケールな分断になってしまうので、遅延時間は組織内の分断よりも
めちゃくちゃ長くついてしまっていた。


# 状況に応じたチーム形状の変化
境界付けられたドメインのコンテキスト境界もあるシーンに応じた戦略を
満たすためのサービスコンテキストでしかなく、
その置かれた外部環境などの前提が変われば、当然最適なチーム構造も変わる。
このVUCAの時代においては、置かれた前提条件なんて目まぐるしく変わるので、
当然さっきまでの前提条件において適切なコンテキスト境界の位置が、
新しく更新された前提条件においても適切な切り分け境界の位置とは断言できない。

なので、置かれた外部環境などの前提条件が変われば、
チーム内においてもっともバリューを生み出しているコアドメインの部分も
当然変わってしまうということを表している。

組織構造は、一か所にフィーチャーチームのように集結したり、
各ドメインごとの分散されたマイクロサービス型のチーム体制を取るなど、
ころころその形状を変えられるのが望ましいのは、チームトポロジーを読んでいても感じたことである。

# 職能横断な越境活動
ストリームアイランドチームでは、職能横断な動きが求められる。
たとえば、専門分野はバックエンドの人がフロントやセキュリティなども浅く広くやること。
ただ、１人がマルチにやるには限界があるので、
スクラムチームに様々な観点を持った人材が集まるようにチーム全体で、
ストリームアイランドチームの能力を発揮できるようにチーム設計を行う。

ただし、せっかく考えた境界付けられたコンテキスト、チームの境界も
前提条件となる置かれた想定シーンが変わってしまうと、それに適した境界の位置は変わってしまう。
事前に代表的な想定シーンでの組織構造は考えた上で、
突然の災害など予想だにしなかった想定シーンにおいては、
無理に職能別に分断された体制のままにするのではなく、
一度フィーチャーチームのように組織全体が１つの泥団子状にあえてなることで、
その状況に応じて自分たちで連携のとりやすい境界を見出していくのがベターと考えられる。

その際に、浅くでもいいから他の専門分野のことを知っておくことで、より最適な連携が実現できる。
Cómo actualizar `Android Studio`



* Cómo actualizar `Android Studio`.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281137/27154d4f-9740-7213-2b2b-525bb5bab7ae.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281137/412e1101-3c51-4971-c133-7d1dfa671d82.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281137/fadeea43-cc13-d759-05ec-9dec61e3280b.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281137/07a329f5-c728-99e8-87a2-5df75af2e443.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281137/659156f0-e820-bf54-31eb-3a04d97f238e.png)
[AWS]「支払い方法が無効です」「サーバーに問題が発生したため、リクエストは処理できませんでした」

検索してもなかなか見つからず時間をやたら費やしてしまったので備忘録。

## 問題点

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3277259/6a149343-b74e-2f57-7e4a-29749c800e8d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3277259/88200a79-3d6f-3456-fd39-d1e9bc678c86.png)

AWSの初回登録していたところ、支払い方法のところでうまくいかず、上記のような画面が表示されました。
ちなみに何も支払いするつもりはなく、無料枠で利用するために登録だけしたい状況です。


# 解決方法
### 確認観点1 住所を英語で入力しているか

お支払い設定のところで自分の住所を入力すると思いますが、そちらを日本語ではなく英語で入力する必要があります。

### 確認観点2 利用しているカード会社が拒否していないか

> Amazon は、クレジットカードに関連付けられている CVV2 セキュリティコードを受け入れるように設定されていません。ご利用の銀行は、この要件を一時的に解除できる可能性があります。
承認は低額 ($1.00) についてのものであり、ご利用の銀行はこれを拒否する可能性があります。
複数の AWS のサービスにサインアップした場合、$1.00 の承認が各サービスについて行われる可能性があります。ご利用の銀行は、自行のセキュリティポリシーに応じて、最初の承認を行い、それ以降の承認を拒否する場合があります。
一部の銀行は、インターネット取引に制限を設けています。ご利用のクレジットカード会社がそのような制限を設けているかどうかを確認することをお勧めいたします。

利用しているカード会社が拒否している状態。
結論、私は楽天カードを利用しているので、以下のAIチャットで解除してもらったら利用できるようになりました。
ちなみに、同時期に登録した知人も楽天カードを利用していましたが、このエラーには直面しなかったとのことでした・・

https://www.rakuten-card.co.jp/support/chat-support/
SSHポートフォワーディングをゼロから設定してみました！

仕事でSSHポートフォワーディングの技術を使っているので、理解を深めるために設定を実施してみました。

まずはゲストOSイメージファイルの用意ですね。

UbuntuのサイトからUbuntu Desktop 22.04.3をダウロードしました。Ubuntu ServerにはOpensshはデフォルトで利用可能ですが、SSHサーバを０から構築してみたいのでUbuntu Desktopを利用することにしました。

下記のサーバを三台展開しました。

SSH Client（192.168.0.103）
SSH Server（192.168.0.104）
Web Server（192.168.0.107）

目的：Client ー SSH Server ー Web Serverの間のSSHポートフォワーディングを構成したいです。


SSH Server側必要な設定：
1.パッケージopenssh-serverをインストール
```
$ sudo apt install openssh-server
```
2.公開鍵認証を利用できるように、鍵ペアを作成
```
ssh-keygen
```
![Screenshot 2024-02-09 at 22.33.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2991207/b931c7d7-2ed5-f375-a4c2-1fa11b85092d.png)

3.公開鍵を認証鍵として登録します。
```
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
```

SSH client側の必要な設定：
1.パッケージopenssh-clientをインストール
```
$sudo apt install openssh-client
```
2.サーバ側で生成した秘密鍵をクライアント側に登録します
```
$scp user@192.168.0.104:/home/ubuntu/.ssh/id_rsa ~/.ssh/
```
![Screenshot 2024-02-09 at 23.19.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2991207/3056d751-25e2-86e7-290f-e1a8cfaa8a96.png)
秘密鍵はid-rsaはクライアント側に登録されたことがわかります。

Web Serverの構築は基本的にこちらの記事を参照しました。
https://www.fabrica-com.co.jp/techblog/technology/7181/
簡単なページを作りました。
![Screenshot 2024-02-10 at 0.48.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2991207/70af0706-f355-505d-2449-cbe77f809aa5.png)


他に
1. パッケージopenssh-serverをインストール
```
$ sudo apt install openssh-server
```
2.ホストFWを有効かして必要な通信しか許可しないようにルールを追加
　参照：https://qiita.com/htshozawa/items/e24729a4ab332cb40313
  ホストFWのGUI版：https://japan.zdnet.com/article/35211182/

注意Webサーバを外部に公開していないはずですが、なぜか外部との接続が見えました。（そして立ち上げてから１時間しか経っていないのに、、、怖い。セキュリティ対策は大事です！）
不要なポートを閉じて、FWで最低限の通信しか許可しないように設定することをお勧めします。

![Screenshot 2024-02-10 at 0.20.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2991207/cd05ef49-724b-99c6-f309-e51e88440e20.png)

この「185.125.190.28」は怪しいです。
![Screenshot 2024-02-10 at 0.20.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2991207/49ffdeaf-8a35-770b-a86c-f32712ce144e.png)


SSH Client（192.168.0.103）からSSHポートフォワーディングでWeb Server（192.168.0.107:80）に繋げました。

```
ssh -L 50080:192.168.0.107:80 user@192.168.0.104
```

クライアントのブラウザから「localhost:50080」で叩くとWebページが表示されました！

![Screenshot 2024-02-10 at 0.52.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2991207/f32e8ebc-0fb9-88b5-cf3b-22f2d304a491.png)

次はWeb ServerとSSH Serverの間にリバースSSH接続も設定してみたいです。

今回はとりあえずここまで！

初めてな投稿で読んでいただき、ありがとうございました。
Djangoで開発サーバーが起動できない問題

かなり詰まった上に簡単に解消できた問題だった...

## トラブル内容

settings.pyを開発用、本番用に分けるため

アプリディレクトリ
┗settings.py

から

アプリディレクトリ
┗settings.py(本番用設定ファイル)
┗settings_common.py(本番/開発共通設定ファイル)
┗settings_dev.py(開発用設定ファイル)

これで起動すると以下エラーが発生

~~~Python
Performing system checks...

System check identified no issues (0 silenced).
Exception in thread django-main-thread:
Traceback (most recent call last):

# 省略

django.db.utils.OperationalError
~~~

django.db.utils.OperationalErrorはDBサーバーとの接続時に発生するエラーであることは確認済み

## 解決方法

本アプリはPostgreSQLを利用しているので、まずはログの確認

~~~SQL
2024-02-10 00:33:42.274 JST [33984] FATAL:  ユーザー"postgres "のパスワード認証に失敗しました
2024-02-10 00:33:42.274 JST [33984] 詳細:  ロール"postgres "は存在しません。
	接続はファイルC:/Program Files/PostgreSQL/16/data/pg_hba.confの行117に一致しました: "host    all             all             ::1/128                 scram-sha-256"
~~~

認証に失敗しているというログが出ていた。

利用しているのがPyCharmであり、runserverコマンドを実行構成に登録していた。
上記settingsファイルを編集した際に環境変数も変更していた。

結果的に

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680269/9ef9d0c6-1206-c2a5-98cb-23b1e38d4fa6.png)

DB_USERの値postgresの後ろに不要な空白があったことが原因

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680269/a4c8b295-aa20-cca5-e303-f13348741441.png)

無事起動が出来た

## 学んだこと
エラーの内容から早々にDB周りのエラーであることは確認できていたが、変更したsettingsファイルをひたすら確認していたのが問題だった。
DB周りのエラーであればまずはDBのログを確認するべきだった
Raspberry Pi に eduroam を接続したい

# はじめに
Raspberry Pi にWPA2のWi-Fiを接続する方法を調べると，`wpa_supplicant.conf`を手動で変更するという少々複雑な手法が多く紹介されている[^1][^2][^3][^4]．一方で，大学など，WPA2のWi-Fiしか使えずに他のネットワークに繋ぎながら作業できない場合は，複雑な操作に多くの時間を費やすことになる．そこで，Raspberry Pi に [NetworkManager](https://wiki.archlinux.org/title/NetworkManager) を導入することで[^5]，eduroam を接続した例をここに残す．

## 環境
- Raspberry Pi 2B
- Raspberry Pi OS (64-bit)

# 問題
対象のWi-Fiがグレーになっていて選択できない．

# 解決法
NetworkManager を導入した後，eduroam の設定を行う．

## NetworkManager の導入[^5]
```terminal
$ sudo apt install NetworkManager network-manager-gnome
$ sudo systemctl disable --now dhcpcd
$ sudo systemctl enable --now NetworkManager
```

## eduroam の設定
通常通り対象のWi-Fiが選択できるようになっているので，IDとパスワードを入力する．

[^1]: [RaspberryPiでWPA-PSKのWiFiに接続する方法](https://qiita.com/teao26/items/970a721b5351e4c9918c)
[^2]: [Raspberry Pi2 modelBをeduroamに接続する](https://qiita.com/ryupy/items/235a607fbd3e4da7c4cb)
[^3]: [RasPiから直接、大学のwifiに接続した話](https://kuclubdtk.hateblo.jp/entry/2018/11/30/172126)
[^4]: [Raspbian ( Raspberry Pi 3 ) をゼロからセットアップする](https://klee-arc.hatenablog.com/entry/2016/11/30/012333)
[^5]: [How do I connect to WiFi when it is grayed out?](https://raspberrypi.stackexchange.com/questions/60492/how-do-i-connect-to-wifi-when-it-is-grayed-out)
【JavaScript】Web Storageが使用可能か判定する方法

以下のように判定用の関数を作成します。

```javascript
function storageAvailable(type) {
  let storage
  try {
    storage = window[type]
    const x = "__storage_test__"
    storage.setItem(x, x)
    storage.removeItem(x)
    return true
  } catch (err) {
    return (
      err instanceof DOMException &&
      (err.name === "QuotaExceededError" ||
        err.name === "NS_ERROR_DOM_QUOTA_REACHED") &&
      storage &&
      storage.length !== 0
    )
  }
}
```

`localStorage`が使用可能か判定するには以下のようにします。

```javascript
if (storageAvailable("localStorage")) {
  console.log("localStorageが使用可能です。")
} else {
  console.log("localStorageが使用できません。")
}
```

`sessionStorage`が使用可能か判定するには以下のようにします。

```javascript
if (storageAvailable("sessionStorage")) {
  console.log("sessionStorageが使用可能です。")
} else {
  console.log("sessionStorageが使用できません。")
}
```
レジストリエディタでCaps LockキーをESCに割り当てる

## 経緯
Vimの操作性を向上させるため、Caps LockキーをESCキーに割り当てました。

## 環境
- Windows 10
- Windows 11

## 手順
### 1. レジストリエディタの起動
- Windows + R キーを押して、「ファイル名を指定して実行」のダイアログを開きます。
- regedit と入力し、OK をクリックしてレジストリエディタを起動します。
※注: 管理者権限が必要です。


### 2. Keyboard Layoutの設定

- サイドバーもしくはアドレスバーから以下のパスへ移動する
- 右クリック → 新規 → バイナリ値を選択。'Scancode Map'という名前で保存する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199917/39e496a6-bf5b-92d8-0e4b-0963faa0aff5.png)


### 3. Scancode Mapの設定
- Sancode Map をダブルクリックして編集ウィンドウを開く
- 下記の値を入力する

```
00 00 00 00 00 00 00 00
02 00 00 00 01 00 3A 00
00 00 00 00
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199917/62b6c3d2-734f-06e4-5ff8-4c9c2884201b.png)




### 3. 再起動
- Windowsを再起動し、Caps LockキーがESCキーとして機能するかを確認する


## 参考
https://www.saluteweb.net/~oss_keyswap.html

https://kekaku.addisteria.com/wp/20180531022629

https://qiita.com/kiwi-bird/items/5197688d703e7b8baefb

2020/02/02 追記:
@tenmyo様からご紹介頂きました。ありがとうございます。

**公式ドキュメント**

https://learn.microsoft.com/ja-jp/windows-hardware/drivers/hid/keyboard-and-mouse-class-drivers#scan-code-mapper-for-keyboards

https://yanor.net/wiki/?Windows%2FTIPS%2F%E3%83%AC%E3%82%B8%E3%82%B9%E3%83%88%E3%83%AA%E3%82%92%E4%BF%AE%E6%AD%A3%E3%81%97%E3%81%A6CAPSLOCK%E3%81%AE%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6%E5%A4%89%E6%9B%B4

## 感想
レジストリエディタをいじりながら、何かに似た感覚があると思っていたら、
それがプロアクションリプレイで改造コードを入力していた時と似ていることに気づきました。
今更ですが、あれもバイナリをいじっていたんだな～と思いました。
お名前.com SESの検証済みIDで吐き出されたCNAMEレコードを追加する

## 概要

お名前.comのDNSレコードにSESの検証済みID登録時に吐き出されたCNAMEレコードを追加する方法を簡単にまとめる。

## 方法

1. SESで吐き出されたDNSレコードの名前と値を確認する。

    ![詳細ページ___Amazon_Simple_Email_Service___ap-northeast-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/14124fb8-2841-a7da-14d6-7a549a25d542.png)

1. お名前.comにログインし、「ドメイン一覧」を開き、ドメイン名をクリックする。

    ![ドメインNavi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/96af1e1a-8b04-cdb0-e541-8b8404c58698.png)

1. ネームサーバー情報の「DNS設定」をクリックする。

    ![お名前_com_Navi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b58d518d-d6aa-ee3c-47c8-00fe7820dc6c.png)

1. 「次へ」をクリックする。

    ![ドメインNavi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/93f81961-6917-1fd8-936c-633120e583c6.png)

1. 「DNSレコード設定を利用する」の「設定する」をクリックする。

    ![ドメインNavi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b7629e6c-5df1-5c96-2401-54f356c73f06.png)

1. 「入力」で「ツール」を選択する。

    ![ドメインNavi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/410286c2-ab7e-4876-d603-0aa9f932421d.png)

1. 「ホスト名」にSESで払い出された情報の「名前」を入力し、「TYPE」を「CNAME」に設定し、「VALUE」にSESで払い出された情報の「値」を入力する。おそらくSESでは3レコード分払い出されているはずなので、3レコードすべて設定する。

    ![ドメインNavi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b0d3251a-5a64-e80e-1719-6b49c83667ad.png)

    ![ドメインNavi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/48ca4e9d-edad-495e-89b9-48c39a989ff7.png)

1. 設定できたら、画面下部の「確認画面に進む」をクリックする。
1. 内容を確認し「設定する」をクリックする。
1. 設定後、レコード追加画面までまた遷移し、「登録済み」の一覧に今登録したドメインが追加されていれば作業は完了である。

    ![ドメインNavi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/8359e1f4-8e49-f96a-8198-0f03e6a59771.png)

1. DNS設定の伝播には少々時間がかかる場合があるので定期的に下記コマンドを実行するなどして待ってみよう。（下記を実行し、先程追加した3レコードの情報が変えれば設定は成功だ。）

    ```shell
    dig SESの検証済みID登録後に払い出された「名前」に記載されたドメイン CNAME
    ```

    ![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3330363431372f31343132346662382d323834312d613764612d313464362d3761353439613235643534322e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/8d61fc2f-9c91-c99d-73b5-e6a7e4340194.png)

    ![Makefile_—_dokupro-app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/389f1d2c-9f4b-0197-dbce-370b63421196.png)



## 関連記事

https://qiita.com/miriwo/items/01d8b0d5627f8fccd38b![uploading...0]()


## 参考文献

https://qiita.com/miriwo/items/8c4f472497ce3182ae0d
[k8s] fluxを使ったHelmReleaseのインストールで詰まったときに見るポイント(備忘録)

## はじめに

Helm Releaseのインストールがなんか上手く行ってない…けどどこで何を確認したらいいか分からない！ってなったので「このコマンドでログを見よう！」ってのをメモっておきます。

fluxを使っていること前提で書いています。

## 試すコマンド

- `flux logs`  
fluxにマニフェストが正しく認識されているか確認します。
- `flux logs -n ...`
flux上の問題によりエラーが生じていないか確認します。
- `kubectl get helmreleases`
HelmReleaseが正常にインストールできているか確認します。
- `kubectl describe helmrelease ... -n ...`
上のコマンドで正常にインストールできていなかった場合はその原因を確認します。
- `kubectl get pods -n ...`
Podが正常に作られているか確認します。
- `kubectl describe pod -n ...` & `kubectl logs ... -n ...`
Podのログを確認します。
docker/docker composeでrailsアプリをdocker化する

## はじめに
dockerとdocker composeでrailsアプリをDocker化する方法について記載します。
dockerとdocker composeについては勉強している程で記載しています。

## Dockerおすすめ本
下記勉強に使用した本ですが、初学者でも分かりやすかったので共有します。

Docker&仮想サーバー完全入門　Webクリエイター＆エンジニアの作業がはかどる開発環境構築ガイド
![スクリーンショット 2024-02-09 20.32.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1003708/5123ba74-3c16-9c89-1dae-d090868961fb.png)

https://amzn.asia/d/b6qGAbr

## 構築環境
```
Ruby 3.2.2
Rails 7.0.6
postgres 12
```

## ①必要ファイルの作成を行う
以下の4つのファイルの作成が必要です。
- Dockerfile

https://docs.docker.jp/engine/reference/builder.html

```
FROM ruby:3.2.2
RUN apt-get update -qq && apt-get install -y \
    build-essential \
    libpq-dev \
    nodejs
WORKDIR /myapp
COPY Gemfile Gemfile.lock /myapp/
RUN bundle install
ADD . /myapp
```

- compose.yaml

https://docs.docker.jp/reference/compose-file/toc.html

```
services:
  db:
    image: postgres:12
    volumes: 
      - .:/myapp
    environment:
      POSTGRES_USER: "postgres"
      POSTGRES_PASSWORD: "postgres5050"
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
```

- Gemfile
- Gemfile.lock


## ②コンテナのイメージ作成
コンテナを作成するためにはイメージが必要となります。
docker compose buildでイメージを作成します。
```
docker compose build
```

## ③database.yamlの変更
```
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: postgres5050
  pool: 5

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test
```

## ④コンテナの作成と起動
```
docker compose up -d
```

## ⑤DBの作成とマイグレーション
```
docker-compose run web rake db:create db:migrate
```

## ⑥localhost:3000でアクセスする
localhost:3000(設定したポート番号)でアクセスすると、WEBアプリケーションが起動します。

## さいごに
Dockerは使ったことがありませんでした。実際に使ってみると通常の環境構築よりもかなり時短になると感じました。
他にも色んな環境のDocker構築をして徐々に慣れていきたいと思います。

## 参考文献

https://docs.docker.jp/compose/rails.html
現場で使える Ruby on Rails 5速習実践ガイドを読んだ

## はじめに
今回はRailsのインプット用の教材として[現場で使える Ruby on Rails 5速習実践ガイド](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227/ref=sr_1_6?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=7NL117JN69F3&keywords=Rails&qid=1642106965&sprefix=rails%2Caps%2C252&sr=8-6)
を読んだので、その感想について記事にします。

## 良かった点
Railsの機能について実際にアプリを作ってみながら解説するという流れで
解説していてわかりやすかったです。
テストの解説でなぜテストが必要なのかの解説が入っているように
機能そのものの解説にとどめていなかって点も良かったと思います。
またチーム開発についてのチャプターもあり単なるRailsのみの解説の参考書
ではなくエンジニアとして必要な知識も身につけられる参考書でもあると思います。

## 学んだ点
### Chapter3
* テンプレートエンジンにはERB以外にHamlやSlimがある。
* 同名のビューを使うことが多い法則があるため、コントローラーを作る際は引数にHTTPメソッドがGETのアクションを入れると効率的。

### Chapter4
* データの登録や更新の際は```save!```を使った方が予期せぬ失敗を防げる。
* 複数の管理系のコントローラーがある場合は管理系コントローラーの基底クラスを作りそれを各コントローラーが継承するように使うのが一般的。

### Chapter5
* テストコードがあればバージョンアップ後にこれまで通り動かない箇所をスムーズに修正できる。
* 面倒でもテストを書いておけば中長期的には開発時間の短縮につながる。

### Chapter6
* ```routes.rb```を見やすい形に保つにはインターフェイス（URL）の構造かコントローラの構造に則した状態にすべき。
* 実際のフォーム画面の入力フォームの数とStrong Parametersの属性の数が合わずに一部DBに反映されないということが起きうるため注意が必要。

### Chapter7
* 確認画面を実装する場合はユーザーが登録されたと勘違いするケースもあるため本当に必要か検討してからにすべき。

### Chapter8
* Turbolinks利用時には```<script>```高速化のメリットが打ち消されてしまうためbody要素の中に記述せずhead内のみにすべき。

### Chapter9
* database.ymlはバージョン管理の対象とせずパスワードやユーザー名を記述していない別ファイルを作成してバージョン管理を行う。

### Chapter10
* アプリケーションは開発が進むにつれてコードが複雑化するので以下の3つの手段が有効。
  * 適切な場所にコードを書く。
  * 上手に共通化する。
  * 新しい構造を追加して役割分担する。

## 難しかった点
少し前に出版されているため対応しているのがRails5の内容となっているため
ハンズオンで進めようとしている人には予期せぬエラーが発生しうるため
おすすめはできないかと思います。ハンズオンで実際に手を動かしながら
学びたい人はこちらの書籍をざっと読んだ後にRailsチュートリアル等の
最新のRails7に対応した教材を使うといいと思います。
あとはビューはerbではなくslimを使っておりerbしか見たことなかった
自分としてそこはわかりずらい点ではありました。
code .を使うとcommand not foundになる

VScodeで設定をすれば、codeコマンドが使えるようになるはずなのにできなかったので共有します。

環境
Macbook Air M1

# 原因
VScodeが「アプリケーション」の階層にないのが原因。
「ダウンロード」や「デスクトップ」にVScodeがあると使えません。
デスクトップやダウンロードにあるVScodeを消して、アプリケーションからVScodeを開きます。そこからcodeコマンドをインストールすると使えるようになります
HTMLの基本的なコード

# 概要
このページではHTMLの学習用に基本的なコードを記載しています。

# 基本的なコード
### コードの先頭に「これはHTMLです」というのを宣言します。
```:HTML
<!DOCTYPE html>
```

### コメントアウト
```:HTML
<!--この中にコメントを記載する-->
```

### コード全体をhtmlタグで囲む
```:HTML
<html>
ここにコードを書いていく
<html>
```

### pで段落を作成する
```:HTML
<p>この間に文章を作成していく</p>
```

### h1~h6で見出しを作成する(h1が一番大きい見出し)
```:HTML
<h1>一番目に大きい見出し</h1>
<h2>一番目に大きい見出し</h2>
<h3>三番目に大きい見出し</h3>
<h4>四番目に大きい見出し</h4>
<h5>五番目に大きい見出し</h5>
<h6>六番目に大きい見出し</h6>
```

### imgタグで画像を表示させる
```:HTML
<img src="ファイルの存在するパス名" alt="代替テキスト" />
```

### aタグでリンクを表示させる
```:HTML
<a herf="リンク先のURL">テキストまたは画像を入力する</a>
```

### ul・ol・liを使用して箇条書きを作成する
ulは「・」での表示
```:HTML
<ul>
<li>項目1</li>
<li>項目1</li>
<li>項目1</li>
<li>項目1</li>
</ul>
```
```:出力
・項目1
・項目2
・項目3
・項目4
```

olは番号での表示
```:HTML
<ol>
<li>項目1</li>
<li>項目1</li>
<li>項目1</li>
<li>項目1</li>
</ol>
```
```:出力
1.項目1
2.項目2
3.項目3
4.項目4
```

### brタグで改行
```:HTML
<p>こんにちは<br>こんばんは<p>
```
```:出力
こんにちは
こんばんは
```
この使い方では改行されない
```:HTML
<p>こんにちは
こんばんは<p>
```
```:出力
こんにちはこんばんは
```
PlatformIOでArduino言語を使ってNucleoボードを動かす

# はじめに
STM32マイコンのプログラムはSTM32CubeIDEなどを使って書くことができますが、ただのLチカをしたいだけなのにコードが200行とかになってしまいます。STM32マイコンもあのArduinoのように書きたいですよね。この記事ではVScodeのPlatformIOを使ってArduinoフレームワークでNucleoのLチカをしてみたいと思います。
今回はNucleoボードを使いましたが、チップから実装したものなどでも同じようにできると思います。
# 環境　
Windows 11 (VScodeが使えれば大丈夫だと思います)
STM32 Nucleo Board STM32F446RE (他のものでも使えると思います)
# PlatformIOの準備
PlatformIOがすでに入っている人は飛ばしていただいて結構です。

PlatformIOは、マイコンの開発のためのVScodeの拡張機能です。これさえあればどんなマイコンの開発にも困らないとういうほど強力なツールです。

導入方法は簡単で、VScodeの拡張機能の検索窓に「PlatformIO」と入力して一番上に出てきたものをインストールするだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124670/10927eb4-f66d-f043-1afc-74c0dba33759.png)

# プロジェクトの作成
PlatformIOをインストールすると、左側にPlatformIOのアイコンが表示されるようになると思います。
そのアイコンをクリックして、`QUICK ACCESS > PIO Home > Open` をクリックするとPlatformIOのホーム画面が開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124670/9d039cfa-a024-00f3-9648-a3d3a3de7cb9.png)

中央の「New Project」というボタンをクリックすると、次のようなプロジェクト作成の画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124670/cc5cf5ea-0c3f-674c-0095-8c140c43ccd5.png)


「Name」にプロジェクト名を入力し、「Board」は自分が使うNucleoボード、「Framework」は「Arduino」を選択してください。

「Location」のはてなマークにカーソルを重ねるとデフォルトの保存場所がわかります。もし変えたければチェックを外して保存場所を指定してください。

:::note warn
保存場所は**パスに日本語が含まれないようにしてください**。日本語が含まれているとあとでエラーが出ます。ドキュメントやデスクトップなどに保存するときは要注意です。
:::

「Finish」を押すとプロジェクトが作成されます。これには数分かかることもあるのでしばらく待ちましょう。
準備が終わると次のようなファイル構成のフォルダが生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124670/5a86fb2b-6f0b-77fa-28c1-aeda24e8851f.png)

# プログラムの作成・書き込み
プログラムは`src > main.cpp`に書いていきます。
開いてみるとarduinoのようなテンプレートがすでに書いてありますね。
arduino言語の書き方は検索すればたくさん出てくるのでここでは省略します。

ここでは、Nucleoのボードにすでに実装されているスイッチとLEDを使ってみます。
次のコードはスイッチが押されたときにLEDが光るというものです。

~~~ cpp:main.cpp
#include <Arduino.h>

void setup() {
  // put your setup code here, to run once:
  pinMode(PA5_ALT0,OUTPUT);
  pinMode(PC13_ALT0,INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  if(!digitalRead(PC13_ALT0)){
    digitalWrite(PA5_ALT0,HIGH);
  }
  else{
    digitalWrite(PA5_ALT0,LOW);
  }
}
~~~

:::note info
Nucleo STM32F446REではボード上のLEDはPA5、スイッチはPC13に割り当てられているのでそれらを使っています。PA5_ALT0はLED_BUILTINでも代用できます。
:::

大体Arduinoと同じように書けます。

コードが書けたらNucleoに書き込みましょう。
パソコンとNucleoをUSBでつないで、左下の「→」ボタンを押してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124670/97de6820-b72b-4855-a958-66cc7fef6bd2.png)

:::note info
チェックがビルド、右矢印が書き込みです。Arduino IDEと同じですね。
:::

このようにターミナルに「SUCCESS」と表示されれば書き込み完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124670/1cca4b12-d82f-69a3-b8f7-5d07e08a649a.png)

ボード上の青いスイッチを押すとLEDが光り、離すと消えるようになれば成功です。

# まとめ
ArduinoフレームワークをつかってVScodeからSTM32のプログラムを書く方法を解説しました。
STM32CubeIDEのHALなどよりも断然使いやすく、簡単だと思うのでおススメです。
何か疑問点や間違いがございましたら是非コメントをお願いします。
直接インターネットに接続できない環境でUiPathパッケージをインストールするには

# はじめに
UiPathでの開発で処理に使用するWebサイトのログイン情報を
「Windows資格情報マネージャー」を管理することにしたのですが、
UiPathのパッケージインストールは初めてで、かつ使用している環境は
直接インターネットに接続できる環境ではありません。

直接インターネットに接続できない場合での
UiPathパッケージのインストール方法を調べてみました。
また、UiPathドキュメントに記載の公式の方法を見つけるまでに時間がかかってしまい、
手探りでパッケージのインストールを実施した方法(成功)も併せて記載しておきます。

# UiPathドキュメント記載の公式手順
1．インターネットにアクセスできるコンピューターで、NuGet Package Explorer をダウンロードしてインストールします。

2．NuGet Package Explorer を開いて、[Open a package from an online feed] を選択します。

3．[Package source] フィールドに、パッケージのダウンロード元フィードの URL を入力します。UiPath のオフィシャル パッケージ フィードは、<br><br>https://pkgs.dev.azure.com/uipath/Public.Feeds/_packaging/UiPath-Official/nuget/v3/index.json <br><br>です。

4．フィードでパッケージを検索しダウンロードします。

5．nupkg ファイルを、Studio がインストールされているコンピューター上の、Studio でパッケージ ソースとして定義されたフォルダーに転送します。パッケージを既定のローカル フィードに追加するには、<br>ファイルを %ProgramFiles%\UiPath\Studio\Packages (マシン単位のインストールの場合) か、<br>%localappdata%\Programs\UiPath\Studio\Packages (ユーザー単位のインストールの場合)<br> にコピーします。

参照先：https://docs.uipath.com/ja/studio/standalone/2023.10/user-guide/managing-activities-packages#managing-packages-in-offline-environments

# 自己解決した非公式手順 
例) Windows資格情報マネージャーを使用するための「UiPath.Credentials.Activities」パッケージを例にして記載します。

1. 「UiPath.Credentials.Activities」パッケージのダウンロードを検索、ダウンロードします。<br><br>https://myget.org/feed/workflow/package/nuget/UiPath.Credentials.Activities <br><br>
1. nupkg ファイルを、Studio がインストールされているコンピューター上の、Studio でパッケージ ソースとして定義されたフォルダーに転送します。パッケージを既定のローカル フィードに追加するには、<br>ファイルを %ProgramFiles%\UiPath\Studio\Packages (マシン単位のインストールの場合) か、<br>%localappdata%\Programs\UiPath\Studio\Packages (ユーザー単位のインストールの場合)<br>にコピーします。<br>
1. UiPath上のツールバーから[パッケージ管理] をクリックします。
1. 「パッケージを管理」画面から [すべてのパッケージ]－[パッケージ名]－[インストール] を行い、[保存] をクリックします。
![UiPathパッケージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/770141/ccda5d8b-2e7f-48a4-bf67-771f25ba8420.png)

※注意事項として、UiPathパッケージをダウンロード・インストールした際は、「パッケージを管理」画面の右下に記載のある「依存関係:」のパッケージもインストールする必要があります。
　
# おまけ
- プロキシサーバー経由で実施する場合の手順は、以下を参照してください。
https://docs.uipath.com/ja/studio/standalone/2023.10/user-guide/managing-activities-packages#connecting-to-feeds-through-a-proxy-server
- Windows資格情報マネージャーを使用する方法は、以下を参照しました。
https://moglutton.com/uipath_login_management/#toc3

# さいごに
現在、開発している環境ではMicrosoft Storeも使用できない環境なので、
公式手順での「NuGet Package Explorer」をダウンロードできない状況なので、
なんだかんだと今回手探りで実施したインストール手順を実施することになりそうです。
また良い手順が見つかれば本記事に追記したいと思います。
【Swift】2つの要素の差分を取得する

# はじめに
文章の差分検索ツールを作ろうかなって思い、
ちょっと調べたところ、`difference`という機能があることを知ったので記事にしておきます。

# 実装
```swift
import Foundation

let text1 = "2つの文章の差分を検索します"
let text2 = "２つのブンショウの差分を検索します。"

print(text1.difference(from: text2))

// CollectionDifference<Character>(insertions: [Swift.CollectionDifference<Swift.Character>.Change.insert(offset: 0, element: "2", associatedWith: nil), Swift.CollectionDifference<Swift.Character>.Change.insert(offset: 3, element: "文", associatedWith: nil), Swift.CollectionDifference<Swift.Character>.Change.insert(offset: 4, element: "章", associatedWith: nil)], removals: [Swift.CollectionDifference<Swift.Character>.Change.remove(offset: 0, element: "２", associatedWith: nil), Swift.CollectionDifference<Swift.Character>.Change.remove(offset: 3, element: "ブ", associatedWith: nil), Swift.CollectionDifference<Swift.Character>.Change.remove(offset: 4, element: "ン", associatedWith: nil), Swift.CollectionDifference<Swift.Character>.Change.remove(offset: 5, element: "シ", associatedWith: nil), Swift.CollectionDifference<Swift.Character>.Change.remove(offset: 6, element: "ョ", associatedWith: nil), Swift.CollectionDifference<Swift.Character>.Change.remove(offset: 7, element: "ウ", associatedWith: nil), Swift.CollectionDifference<Swift.Character>.Change.remove(offset: 17, element: "。", associatedWith: nil)])
```

# おわり
出力結果は`insert`と`remove`でちゃんと分かれています。
これを関数でコネコネしてAttributedStringに変換して、
`insert`には緑の背景色、`remove`には赤の背景色を付与すれば、Gitのようなdiffがすぐ出来そうですね

割と簡単そうなので差分確認アプリ作ろうか迷います。
プライベートレポジトリのCrateを使う

# プライベートなgithubのレポジトリにあまり公開したくないcrateを登録して利用する。

Cargo.tomlでdependenciesにプライベートなレポジトリを **git=""** で指定して利用することで人には見られたくないけど管理が大変なCrateの管理を他に投げられて便利だね、というお話です。


## Crate（ライブラリ）をつくる
```sh
cargo new --lib my_crate
cd my_crate
```
このようにしてプロジェクトを作成、続いて **src/lib.rs**を編集します。


```rs
pub fn say() -> String {
    "Hello, world!".to_string()
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn it_works() {
        let result = say();
        assert_eq!(result, "Hello, world!");
    }
}
```

**say()** というファンクションを作りました。呼ぶと **Hello, world!** がStringで返ります。
ついでにテストコードも修正しました。

## テスト実行

```sh
cargo test
```
このようにテストを実行します。

```sh
running 1 test
test tests::it_works ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

   Doc-tests my_crate

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
```

**it_works ... ok** といっているのでOKです。
何かfailedみたいなニュアンスのことを言われたらエラーが直るまで踏ん張ります。

## githubでプライベートなレポジトリを作りCrateを登録する

![ss](https://gist.github.com/assets/12671694/ba7233df-c562-4d2c-86cd-f1c110c4541f)

プライベートなので違うアカウントからは見えません。
完璧です。

## テストプログラムを作る

ではこのプライベートレポジトリのCrateが本当に使えるのかテストします。

```sh
cargo new my_crate_test
cd my_crate_test
```

Cargo.tomlのdependenciesでgitのアドレスを指定してcrateの利用を宣言するには次のように記述します。
```toml
[dependencies]
my_crate = { git = "https://github.com/<account_name>/my_crate.git" }
```

そして、**src/main.rs**です。
```rs
fn main() {
    let msg = my_crate::say();
    println!("{}", msg);
}
```

ではいざ実行

```sh
cargo run
```

ここでgithubへのログインを促されると思いますのでログインします（もしかしたらすでにログインしたことになっていて尋ねられないこともあるかもしれないですが）

![スクリーンショット 2024-02-09 214514](https://gist.github.com/assets/12671694/c1c419b1-3743-4944-8fbf-204d60a6da69)

ログインが出来るとこのように表示されてビルドが開始されます。
そして・・・

```sh
    Finished dev [unoptimized + debuginfo] target(s) in 0.03s
     Running `target\debug\my_crate_test.exe`
Hello, world!
```

## まとめ

無事にプライベートなレポジトリからcrateを取り込んでコンパイルすることが出来ました。
簡単な機能であればmodとかで参照しても良いのですが「複雑ないつものアイツ」みたいなのを多用するようになってくるとcrateの管理が大変、どれが最新だっけ？みたいな悩みなんかも尽きない、そんな苦労をしない為にも積極的にgitを利用して行きたいところです。
【Python3】JSON形式ファイルの読み書き方法

# JSON形式ファイルの読み取り

##### ●今回使用するサンプルファイル
```python:di.json
{
    "name": "Google Inc",
    "url": "https://www.google.com",
    "staffs": [
        {"name": "田中", "age": 40},
        {"name": "佐藤", "age": 60}
    ]
}
```


##### ●json.loadを使ってファイルを読み取る
```di_read.py
import json

with open(r'C:\Users\User\Desktop\python3_practice\di_read.json', encoding="utf-8") as f:
    di = json.load(f)
    
print(di['name'])
print(di['url'])
print(di['staffs'])


# ＜出力結果＞
# Google Inc
# https://www.google.com
# [{'name': '田中', 'age': 40}, {'name': '佐藤', 'age': 60}]
```
:::note info
★処理概要
１．jsonモジュールをインポートする。
２．open関数を使って対象ファイルを開く。
　　※第二引数に対象ファイルの文字コードを指定しないと、文字化けが発生する。
３．json.loadメソッドを使用し、２で開いたファイルの読み込みを行い、変数に代入する。
４．３の戻り値は辞書型となるため、キーを指定して値にアクセスする。
:::

# JSON形式ファイルへの書き出し
##### ●読み込んだファイルを別のjsonファイルに書き出す
```di_write.py
import json

# jsonファイルの読み取り（上のサンプルと同じ）
with open(r'C:\Users\User\Desktop\python3_practice\di_read.json', encoding="utf-8") as f:
    di = json.load(f)

# 読み取ったファイルをtemp.jsonへ書き込み
with open(r'C:\Users\User\Desktop\python3_practice\tmp.json', 'wt') as f:
    json.dump(di, f, indent=2, ensure_ascii=False)

# temp.jsonの読み込み
with open(r'C:\Users\User\Desktop\python3_practice\tmp.json') as f:
    print(f.read())
```
##### ●書き出したファイルの内容
```python:tmp.json
{
  "name": "Google Inc",
  "url": "https://www.google.com",
  "staffs": [
    {
      "name": "田中",
      "age": 40
    },
    {
      "name": "佐藤",
      "age": 60
    }
  ]
}
```
:::note info
★処理概要
１．jsonモジュールをインポートする。
２．open関数を使って書き込み"元"のファイルを読み取る。
　　※第二引数に対象ファイルの文字コードを指定しないと、文字化けが発生する。
３．open関数を使って書き込み"先"のファイルを開く。
４．json.dumpメソッドを使用し、書き込みを行う。
　　※json.dump(読み取ったファイル, 書き込み先ファイル, 書き込み時のインデント数, 非ASCII文字のエスケープ)
  　　インデント数や非ASCII文字のエスケープ等のキーワード引数は任意。
:::

# まとめ
・jsonモジュールを使用することで、簡単に読み書き操作ができる。
・キーワード引数を指定することで、文字化けを防いだり、見やすい形式で出力できる。
E資格の例題を作ってみた！問題傾向を知りたい人向け

E資格の過去問は一般的には公開されておらず、誰かに過去問を見せることも禁止されています。JDLA公式で少し過去問が公開されていますが、それしか問題傾向を掴む方法がないのです。
そこで今回はE資格の例題を解かせてくれるJDLA認定プログラムと、実際に簡単な例題を作ってみたので公開させてください。

## E資格の例題を作っているJDLA認定プログラム

![E資格の例題を作っているJDLA認定プログラム](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3686535/2c61cd7c-9f61-783c-e6c7-f3cdec9da14c.jpeg)

E資格で必須となるJDLA認定プログラムの中にはオリジナルの例題を作って解かせてくれる講座もあります。
しかし私が見つけられたのは「[E資格ディープラーニング短期集中講座](https://ai-kenkyujo.com/ai-e-shikaku/)」だけだったので、もし例題を解いてみたいと思っている人はこちらのJDLA認定プログラムを受けてみてください。
動画で学べるEラーニングや、対面講座にも対応しているので、さくっと学びたい人もしっかり学びたい人も参加できます。

## E資格の例題３つ

そこでE資格の例題を軽く作ってみました。
これらの問題は、E資格でカバーされる可能性のある範囲から着想を得ていますが、実際の試験内容とは異なる可能性があるので注意してください。

### 例題1：応用数学(確率統計)
あなたはあるウェブサイトのユーザー行動分析を行っています。ある期間におけるウェブページへの訪問者数は平均が500人、標準偏差が50人の正規分布に従います。次の期間において、訪問者数が550人以上になる確率を求めなさい。

解答:
この問題では、標準正規分布表を使用して、Zスコアを計算し、そのZスコアに対応する確率を求めます。Zスコアについては次の式で計算できます。

>Z=σ/X−μ

Xは求めたい値（550）、μは平均（500）、σは標準偏差（50）です。

### 例題2：機械学習(分類問題)
ある企業が新しい製品を市場に投入する際、製品が成功するかどうかを予測するモデルを開発しています。特徴量として、「マーケティング費用」、「開発期間」、「競合製品数」を使用し、目的変数は「成功（1）」または「失敗（0）」です。ロジスティック回帰モデルを使用した場合、この問題をどのように定式化するか述べなさい。

解答:
この問題では、ロジスティック回帰モデルの基本的な定式化を理解しているかを問います。ロジスティック関数を使用して、与えられた特徴量から製品の成功確率を推定する式を設定します。

### 例題3:深層学習(畳み込みニューラルネットワーク)
あなたは、犬と猫を識別する畳み込みニューラルネットワーク（CNN）を訓練しています。入力画像のサイズは128x128ピクセルで、最初の畳み込み層では32個のフィルターを使用し、フィルターのサイズは3x3、ストライドは1です。この層の出力サイズを計算しなさい。

解答:
この問題では、畳み込み層の出力サイズの計算方法を理解しているかを問います。出力サイズは、入力サイズ、フィルターのサイズ、ストライド、パディングによって決定されます。この場合、パディングが使用されていないと仮定すると、出力サイズは次のように計算できます。

>出力サイズ=(ストライド/入力サイズ−フィルターサイズ)+1

上記の例題は主にディープラーニングで使う数学の問題ばかりですが、まずはこの辺の問題が解けないとE資格の勉強に進むのも難しいでしょう。

## E資格の例題についてまとめ
今回はE資格の例題を作ってみましたが、無事に解けましたでしょうか。
簡単な問題なので、もし難しい例題が思いついた方はコメントしてください。
運用保守のレベルについてまとめてみた

## はじめに
運用保守はスキルが求められないとSNSでよく見かけます。
運用保守は案件によって求められるレベルが違うため、ロースキルと決めつけずに仕事内容は必ず確認した方が良いです。

運用保守メインで9年経験を積みました。
過去経験積んだ運用・保守の経験を記載します。

**AWS運用保守**
障害対応、お問い合わせ対応、定型作業、サーバー構築、シェルスクリプト作成

**クラウド運用保守**　
定型作業&電話対応8割 お問い合わせ対応はナレッジがなく調査する
**AWSシステム保守**　
VBAでの作業自動化、Bash pythonのスクリプト作成、サーバ構築
**JP1 システム保守**
アラート対応、JP1 AJSのジョブ作成、シェルスクリプト作成スキル


## 運用保守のレベル

**レベル1**
定型作業、フォローされながら案件を回せる、ナレッジを見ながらお問い合わせ対応ができる

**レベル2**
非定型作業、障害対応ができる、一人称で動ける、ナレッジがなくてもお問い合わせ対応ができる


**レベル3**
運用改善ができる、スクリプトで自動化できる、お客さんと折衝しながら工数削減ができる
案件をリードできる

※レベル4があるとしたら運用設計が入ります。運用設計はすでに社内で運用フローの標準化が進んでいてなかなか経験が積めないため、今回は記事に記載していません。


## レベルを上げる方法
**レベル1からレベル2にスキルを上げるには自己学習と現場で経験を積むことが必要です。**
何年経験積めばできるようになるという明確な期間はありません。


具体的にはlpicレベル1～2をハンズオン込みで学習したらサーバーの知識がつきます。
障害対応をベテランエンジニアと一緒に対応して障害対応記録を作成にチャレンジして繰り返し経験を積むことです。また、非定型作業や調査しながらお問い合わせ対応にも挑戦することでスキルが積みあがっていきます。

**運用保守で役に立つ知識**の記事を以前作成しました。参考にしてください
https://qiita.com/gama1234/items/44d9ab15f85c7f6881b4
【日記・Python】Python学習開始！明日は退職日...

こんばんは～今日は日記とPythonの学習で得た知識を備忘録として載せます！

## 日記
　いよいよ明日は退職日！ということで、今日はいろいろやることがありました。
特にお世話になっていた先輩にプレゼントを渡したかったので、定番ですがロクシタンのハンドクリームを買いました。期間限定のアールグレイの香りを買ってみたので、喜んでもらえるといいなぁ:relieved:職場の皆さんにもお菓子をお渡しする予定です。
退職理由も特殊な環境だったことが理由だったので、普通に仲いいです笑
なんだか辞めるのも申し訳なさがありましたし、大学1年生のころから目指していた職業ということもあり1年弱しか働けませんでしたが思い入れもありました。
社会人1年目の私を可愛がってくれた先輩もたくさんいたので、退職してしまってもまたどこかで会えたらいいなと思います。(まあ私が患者として行けば会えるかもしれませんが...笑)

　明日が終わればもうエンジニアを目指して一直線ですが、前職では医療関係で職場はデジタル化がカルテぐらいしか進んでいなかったので、これがこうだったら便利になるのにな～と思うことが多々ありました。転職を考えるずっと前から自分がエンジニアだったら解決できるのに...と思っていながら働いていたので、結果的には本当にエンジニアを目指すことになりましたが、転職後はプログラミングで世の中を便利にしたい、そうしたら今までお世話になっていた人にも様々なシーンで恩返しできたりするのかな？と思いを馳せています。


それはさておき、いつもはrailsですが今日は実装中で中途半端なのもあり、
新しく勉強し始めたpythonの超基礎的な知識を備忘録として載せます。
最近新しい言語を少しずつ勉強しているのですが、言語ごと定義の仕方や出力などは異なりますが根本的な考え方はあまり変わらないのかな？というイメージです。
むしろその微妙な違いを言語ごと覚えるのが難しい、、、

## Python 基本編

#### 出力方法
`print()`という形で基本的には出力します。

#### データ型
　Pythonのデータ型は様々ですが、基本的に使うのは文字列型と数値型です。出力の際に他の言語同様データ型が異なるとエラーが出るため、データ型を統一する必要があります。
 文字列型→数値型は`int()`、数値型→文字列型は`str()`と記述します。（integer,stringの略なので覚えやすいですね。）

#### if文
```python:script.py
score = 100
if score == 100: 
    print('congratulations!!')
else:
    print('Let's try harder!')
```
score=100と定義されているので、条件文にあてはまりコンソールには　congratulations!!　と出力されます。ちなみに、出力する際に2行以上になる場合インデントを合わせないと複数行の時はif文が終了したとみなされ出力されません。
else以降はifの後ろの条件文が成立しない(false)のとき、else:以降を出力します。

比較演算子は`==`(両辺が等しいと成り立つ)か`!=`（両辺が等しくないとき成り立つ）で表されます。


今日はここまで！お疲れ様でした！
WEBサイトのデータ取得

# WEBサイトのデータ取得
### はじめに
スクレイピングで遊んでいた時に便利だなと思ったことをメモとして書き残しときます。

#### find_next_sibling()
find_next_sibling() メソッドは、指定した要素の直後にある兄弟要素（同じ親要素を持つ要素）を取得します。

``` py
from bs4 import BeautifulSoup

html = """
<div class="container">
    <p>First paragraph</p>
    <p>Second paragraph</p>
    <p>Third paragraph</p>
</div>
"""

soup = BeautifulSoup(html, 'html.parser')

# 最初の <p> 要素を取得
first_paragraph = soup.find('p')

# 最初の <p> 要素の次にある兄弟 <p> 要素を取得
second_paragraph = first_paragraph.find_next_sibling('p')

print(first_paragraph.text)  # 出力: First paragraph
print(second_paragraph.text) # 出力: Second paragraph
```

最初の\<p>要素を取得し、その次にある兄弟要素である2番目の\<p>要素を取得しています。この場合、最初の\<p>要素の次にある兄弟要素は "Second paragraph" です。

これで特定の要素の次の要素が取得できます。 可変的なものでidやclassから取得できない時に便利なので覚えておくといいことあるかも。

--------------------
記事を読んでくださった方は、是非弊社開発課のXもフォローしてね
毎日エンジニアに向けた情報発信を行っています
https://twitter.com/tech_cin
【初心者】ReactとuserStateについて深掘り

## Reactとは、
Reactとは、JavaScriptのUIライブラリ。


### JavaScriptとは、
>HTMLやCSSと共にWebページを動的にすることができる言語。

https://jp.ext.hp.com/techdevice/technologysc/creator_002/


### UIとは、
>「User Interface（ユーザーインターフェイス）」の略称。webサービスにおいてはwebページのデザインやフォントなどもUIに含まれる。

>対称的に、CUIがある。Character User Interface（キャラクター ユーザー インターフェイス）と呼ばれる。コンピューターが生まれた当時は、現代で主流となっているグラフィカルなデザインを持った直感的に操作できるようなUIはまだ生まれておらず、画面に表示されるのは文字列のみ。いわゆるコマンドラインのようなもの。

https://zenn.dev/hinoshin/articles/77f06d10940efe


### ライブラリとは、
>「便利なプログラムの部品をいっぱい集めて、ひとまとめにしたファイルのこと」

https://wa3.i-3-i.info/word1473.html


### ライブラリとフレームワークの違いとは、
ライブラリは、フレームワークと比較して伝えられるみたい。
>「ライブラリの目的は、求められた機能を実現するために、コードを再利用して開発効率を上げたり、プログラムを軽くしたりすることです。
その一方で、フレームワークの目的は、アプリケーションの設計構造（骨組み）を再利用することを目的にしています。」とのこと。

もう少し具体的に書いていた。

>「例えるなら、クルマを開発・製造する際に、「どこにタイヤを取り付けて、どこにエンジンを取り付けるのか」というような、大きな枠組みを決めるのがフレームワークであり、その部分的な機能を実現するのに用いられる過去の事例がライブラリです。」

だそうです。ちょっとイメージついてきた。

https://ssaits.jp/promapedia/technology/library-framework.html


## userStateとは
useState()は、関数コンポーネントでstateを管理（stateの保持と更新）するためのReactフックであり、最も利用されるフックです。


### コンポーネントとは、
>ReactではJavaScriptの中でHTMLを書くことができ、ボタンやヘッダー、フッターなど、画面の部品単位でパーツを作れます。これをコンポーネントと言います。

https://qiita.com/Hashimoto-Noriaki/items/95d9fe027d169ce74218


### stateとは、
>stateとはコンポーネントが内部で保持する「状態」のことで、画面上に表示されるデータ等、アプリケーションが保持している状態を指しています。

https://qiita.com/seira/items/f063e262b1d57d7e78b4


### State と Props の違いとは、
対称的にpropsと比較されることが多いようです。

>React コンポーネントがデータを受け取ったり、ハンドリングしたり、表示したりするための主要な方法として、State と Props があります。
この二つの概念の違いを知ることは、React を効率的に利用するために役立ちます。
State: そのコンポーネントが持っている状態
Props: 親コンポーネントから渡されたプロパティ

https://qiita.com/kyrieleison/items/78b3295ff3f37969ab50


#### ハンドリングとは、
>Reactでの「ハンドリング」という言葉は、一般的にイベントハンドリング（イベント処理）を指します。イベントハンドリングは、ユーザーアクション（クリック、タッチ、キー入力など）やシステムイベント（ページのロード、アニメーションの終了など）に対する応答の仕方を定義するプロセスです。

※チャットGPTより


#### 親コンポーネントと子コンポーネントの違いは、
>1つのコンポーネントの中に、別のコンポーネントを導入することで画面を作っていきます。
導入される側を親コンポーネント、導入する側を子コンポーネントと言います。
コンポーネントはjsのファイルとして作成し、親コンポーネントのjsファイルの中に
子コンポーネントのjsファイルをimportしていきます。

https://qiita.com/Hashimoto-Noriaki/items/95d9fe027d169ce74218


### フックとは、

>フックとは、関数コンポーネントに state やライフサイクルといった React の機能を “接続する (hook into)” ための関数です。フックは React をクラスなしに使うための機能ですので、クラス内では機能しません。

https://ja.legacy.reactjs.org/docs/hooks-overview.html#:~:text=%E3%83%95%E3%83%83%E3%82%AF%E3%81%A8%E3%81%AF%E3%80%81%E9%96%A2%E6%95%B0%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88,%E5%86%85%E3%81%A7%E3%81%AF%E6%A9%9F%E8%83%BD%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82
コールバック関数／高階関数についてまとめてみた

コールバック関数とは、ある関数の引数として渡された関数のことを指します。このように２つの関数「受け取る側の関数」と「渡す関数」が出てきますので整理する。

* **「受け取る側の関数」について**
> 受け取る側の関数は、引数に関数をもらい処理の中で利用する。受け取る側では全体の処理は定義されており、特定のタイミングで行う具体的な処理を引数でもらう。受け取る側の関数を高階関数とも呼ぶ。
> 
* **「渡す関数」について**
> 渡す関数は具体的な処理内容を持っており、適切なタイミングで実行されるのを待つ。
> 


* **コールバック関数/高階関数の記述方法**



　　　![image](https://firebasestorage.googleapis.com/v0/b/ciita-c6ea6.appspot.com/o/user%2Fimages%2FSs2l4MullWfWhXOn?alt=media&token=249ff970-f4d1-44e1-be8f-118bae88802b)
	 
	 

　　　![image](https://firebasestorage.googleapis.com/v0/b/ciita-c6ea6.appspot.com/o/user%2Fimages%2FTfR9jKocZzNKBTgi?alt=media&token=b39abbdc-65c4-492c-a43f-ebedf658eead)
	 
	 
	 
※コールバック関数を渡す際は丸カッコをつけるのはNG!
> 丸カッコをつけると関数の実行結果が渡されてしまうので注意。
> 受け取る側の関数(関数名()); // これはNG

* まとめ
> コールバック関数を利用することで、コードの再利用性が向上し、制御の流れが明確になるのでとても便利だと思った。次は非同期処理について理解を深めていきたいと思う。
音声認識に興味があったのでWhisper触ってみた

## これはなに
- 業務上の議事録を書くのって面倒で忘れがち、でも後で思い出せず困ることがあった
- 楽に思い出す方法が欲しくて音声認識AIに興味を持ち、勉強会で教わった知識を実際にやってみた
- 自身の備忘でかなり初心者向けの内容

## Whisper とは
- OpenAIが開発した汎用の音声認識モデル
- 様々な言語について音声認識が出来る
- 比較的簡単に実行ができる

## Colab とは
- Googleアカウントがあれば無料でGPU使えたりする
- ブラウザ上でPython実行出来るのでここでWhisper使ってみる

## 実際にやってみる

### Colabへ音声ファイルをアップロード

- content配下に"test_1.mp3"をアップロード
- 破損確認で音声ファイルを再生してみる
```py
from IPython.display import Audio
Audio('test_1.mp3', autoplay=True)
```
- githubから直接Whisperをインストール
```py
!pip install git+https://github.com/openai/whisper.git
```
- 関連ライブラリをインストール
```py
import whisper
```
- 実行（[公式Github](https://github.com/openai/whisper/blob/main/README.md#python-usage)に全部書いてある）
```py
# モデル選択
model = whisper.load_model('tiny')
# transcribe (https://github.com/openai/whisper/blob/main/whisper/transcribe.py)
result = model.transcribe('test_1.mp3', verbose=True)
# 表示
print(result['text'])
```
:::note
結果
Detected language: Japanese
[00:00.000 --> 00:04.060] これを持ちまして、公園を終了させていただきます。
[00:04.060 --> 00:07.340] どなた様もお忘れ物のございませんよ。
[00:07.340 --> 00:11.060] 今一度手回り品を確かめください。
[00:11.060 --> 00:13.600] 本日はご来上いただきまして、
[00:13.600 --> 00:16.900] まことにありがとございました。
これを持ちまして、公園を終了させていただきます。どなた様もお忘れ物のございませんよ。今一度手回り品を確かめください。本日はご来上いただきまして、まことにありがとございました。
:::
**たどたどしい、、、**
**もう少し頑張って欲しいのでモデル性能向上＋GPUで実験**

## GPU+largeで実行してみる
- ランタイムのタイプを選択（T4.GPU）
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602872/2cb826a6-2932-29a0-2143-bab724dc2f95.png)
- 実行
```py
model = whisper.load_model('large')
result = model.transcribe('test_1.mp3', verbose=True)
print(result['text'])
```
:::note
結果
Detected language: Japanese
[00:00.000 --> 00:03.440] これをもちまして公演を終了させていただきます。
[00:04.280 --> 00:06.860] どなた様もお忘れ物のございませんよう、
[00:07.460 --> 00:09.880] 今一度お手回り品をお確かめください。
[00:11.260 --> 00:14.900] 本日はご来場いただきまして誠にありがとうございました。
これをもちまして公演を終了させていただきます。どなた様もお忘れ物のございませんよう、今一度お手回り品をお確かめください。本日はご来場いただきまして誠にありがとうございました。
:::
**完璧！**

## 所感
- モデル性能を上げたりGPUを使えば精度はかなり上がりそうだが実行時間が長くなるのでトレードオフ
- システム用語が飛び交う議事録とかでやってみたい
- 長時間の会議を文字起こしした際、個人の判断ができるか、要約ができるかも実用性に関連しそうだなと感じた
[2024/02]Discordに特定のTwitterアカウントのツイートを無料で自動転載するシステムを作った

## 経緯
Twitter社がAPIを有料化した影響で多くのTweet自動取得システムが無償提供を打ち切る事態となっており、私が開発していたComebackTwitterEmbedの利用者の方々から「どうにかできないか」と要望が上がっていたため

## 動作イメージ(ComebackTwitterEmbedのレガシーモードを併用)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1556879/7d3937d1-e491-cd89-306e-48c09efb2b4d.png)

## 推奨事項
ComebackTwitterEmbedにメッセージの管理権限を付与し、レガシーモードを有効化することでモバイルアプリからでも複数枚の画像が見られたり、動画をdiscord上で見られたりと快適に展開を行うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1556879/e4b39785-11de-c862-2490-516821a5a17c.png)

## 制限事項
Twitter社のAPIのレート制限の都合上利用枠という形で人数制限を設けています。
※1枠/1Twitterアカウント
無料提供枠:最大150枠(2024/02/09時点では75枠まで)
支援者優先枠:最大100枠

## 利用方法
1:以下の記事よりComebackTwitterEmbedを導入してください
https://qiita.com/_yussy_/items/de478748d0f3f2956780
2:discord内より、[/自動展開 自動展開追加]コマンドより登録を行ってください

## 実装方法
TwitterアカウントのプロフィールをRSSで取得できるAPIサーバーをローカルに構築し、最終展開時間より投稿時間が遅いツイートをまとめてwebhookで送信します