OmniAICreator/Qiita-1.07M huggingface dataset:
【コラム】私が考える、技術イベントの歩き方

いつも記事を読んでいただきありがとうございます！
モブエンジニア（[@mob-engineer](https://qiita.com/mob_engineer))です！

今回のテーマとして私が技術イベントへ参加した経験を言語化する目的で、**技術イベントの歩き方**といったタイトルで記事を執筆したいと思います。

# 目次
1. 読んでもらいたい読者層
1. 説明すること・説明しないこと
1. 09月・10月・11月の技術イベント参加実績
1. 私が考える技術イベントの歩き方
1. オンラインイベントのメリデメ
1. オフラインイベントのメリデメ
1. **オフラインイベントの注意事項**
1. まとめ

## 読んでもらいたい読者層
次のような方に読んでもらいたいと思っています。

1. 技術イベントへ参加したことがない方・参加しようと思っている方
1. 技術イベントの楽しみ方を模索している方
1. 技術イベント参加時の注意事項を知りたい方

## 説明すること・説明しないこと

### 説明すること
1. オンラインイベントのメリデメ・楽しみ方
1. オフラインイベントのメリデメ・楽しみ方
1. オフラインイベントの注意事項

### 説明しないこと
1. イベント運営の大まかな流れと実施事項
1. イベント運営時の注意事項
1. 具体的なイベント紹介

## 09月・10月・11月の技術イベント参加実績
09月・10月・11月の技術イベント参加実績として次のような感じです。

**2024年09月参加実績（２件）**

![スクリーンショット 2024-11-11 212102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/b7b8223e-b2cf-7576-1ddd-21e051180147.png)


**2024年10月参加実績（7件）**

![スクリーンショット 2024-11-11 212206.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/6b09395b-1af8-2fa9-1b72-8b39ee3036b8.png)


**2024年11月参加予定（12件）**

![スクリーンショット 2024-11-11 212317.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/cd4ad499-d919-f4cf-a48f-b2e39272b282.png)


イベント参加数を数えたことがないので、数え上げてみると意外と参加しているんだなぁといった印象を持ちました。

**私が考える技術イベントの楽しみ方**

技術者の中ではそこそころ技術イベントに参加している（？）立場から、技術イベントの楽しみ方をポイントで整理してみたいと思います。

- 今まで触れてこなかった技術を理解するチャンス
    - 技術イベント形式だからこそ、業務外の技術をキャッチアップできるチャンスだと考えています
- 今まで関わらなかった方とのネットワーキングを構築できる
    - 社内の閉じた関係では触れ合わない、他業種の方とのコミュニケーションを図ることができる
    - **※注意事項で説明しますがすべてのコミュニケーションを肯定しているわけではありません**
- 技術アウトプットへの良い刺激になる
    - 技術イベントへ参加することで「自分もアウトプットしてみたい」といった思いを持てるようになると思います

それ以外にも、**転職活動に向けた企業選び**や**コミュニティづくり**などもあると思います。

## オンラインイベントのメリデメ・楽しみ方

### メリット
1. 場所を選ばず参加できるため、気軽に参加できる
1. 動画などで後で振り返りしやすい
1. 知らない情報が出てきてもググりながら参加できる

### デメリット
1. オフラインイベントより交流機会は少ない
1. 画面越しで聞いているだけなので、没入感を感じにくい
1. オンラインイベントの手軽さゆえに、優先度が低くなる

### 楽しみ方
1. 業務外の知識キャッチアップのツールとして活用してみる
1. もし、質問する場があれば質問してみる

## オフラインイベントのメリデメ

### メリット
1. 参加者とのより親密なコミュニケーションをとりやすい
1. リアル会場でプレゼンを聞けるため、没入感が高い
1. 登壇者に対して気になることを聞きやすい

### デメリット
1. 会場へ向かう必要があるため、参加ハードルが高い
1. 後で振り返りする場がないため、情報の揮発性が高い ※イベントによっては録画している場合もあります
1. **イベント目的外で参加している方**がいる

## オフラインイベントの注意事項

:::note alert
技術イベントに関する暗部（マルチ勧誘など）のお話となります。
:::

技術イベント運営側でも取り締まりを行っていますが、どうしても**事業家集団**などのマルチ勧誘の構成員がイベントに入り込んでいる場合があります。

実際、私も技術イベントへ参加している中で複数回、事業家集団と思しき関係者から声掛けされたことがあります。

そのうえで、私なりに考える防止策をいくつか紹介したいと思います。

### 事業家集団・マルチへの対策
1. **運営母体が明らかなイベントへ参加する**
1. **LINEなどの密室性が高いSNSでの交流を求められたら避ける**
1. **妙にかっこいい肩書（経営者など）が出てきたら注意する**
1. **交流会イベントへの参加は控える（事業家集団の関係者が紛れ込んでいる率が高い印象があります）**
1. **交流した方+事業家集団で検索してみる**

もちろん、上記以外の対策もあるため、参考となる情報をいくつか共有したいと思います。

https://yourbengo.jp/shohisha/3/

https://yourbengo.jp/shohisha/5/

もちろん、大多数の技術イベントは正しく運営＋マルチ商法を行う輩を排除する仕組みを構築していますが、イベントの特性上100％防止することは難しいと考えています。

そのため、参加者自身が**対策**を理解したうえで、参加することが大切だと考えています。
ぜひ、**技術イベントを通じた楽しさ**を十二分に体感してもらいたいと思います。

最後まで本記事を読んでいただきありがとうございます。
本記事を通じて、**技術イベントへ参加し、楽しくキャッチアップしていく方**が1人でも増えれば幸いです！
【Makefile】*** missing separator.  Stop.の解決方法

# はじめに
`makefile`でデプロイのコマンドを実行しようとした際に発生したエラーについて解説します。

:::note warn
***この記事は<font color="Red">個人的なアウトプット</font>を目的として作成したものです。そのため、誤った情報や不足している内容が含まれている可能性があります。もし間違いや気になる点がございましたら、ぜひご指摘いただけますと幸いです***。
:::

# 原因
以下のようなコマンドを`Makefile`に記述してデプロイを実行しようとした際に、エラーが発生しました。

```make
deploy:
  npm run build
  firebase deploy
```
このエラーの原因は、インデントに***スペース***を使用していたことでした。Makefileでは、各コマンドのインデントに***スペースではなくタブ***を使用する必要があります。

## スペースとタブの違い

https://webrandum.net/coding-space-vs-tab/

こちらの記事を参考にしました。

+ ***スペース***
どのテキストエディタで見ても半角スペース分の幅で表示されます。通常、スペースは偶数個ずつ追加してインデントを整えます。

+ ***タブ***
タブは1つでインデントを示し、テキストエディタで幅を設定できるため、環境によって表示幅が変わることがあります。

# 終わりに
普段、タブとスペースの違いを意識していませんでしたが、Makefileのルールに触れる良い機会になりました。

# 参考
『コーディングで「スペース」と「タブ」のどちらを使えばいいのか？』

https://webrandum.net/coding-space-vs-tab/
[history]コマンド履歴の中でワードを検索する方法

# 結論
＜構文＞
```
$ history | grep '検索したいワード'   
```

＜例＞
```
$ history | grep 'git'                
```

＜例の実行結果＞
```
  995  git banch
  996  git branch
  997  git checkout origin/master
  998  git pull
  999  git branch
```

# 解説

* historyコマンド
  * historyコマンドは、最後に入力した 16 個のコマンドをリストする
  
＜構文＞
```
$ history
```

＜実行結果＞
```
  998  chmod 600 xxx.csv
  999  ssh xxx_stg_ap1
 1000  cd ~
 1001  cd ..
 1002  vm
 1003  vagrant up
 1004  vagrant provision
 1005  vagrant ssh
 1006  vagrant reload
 1007  git origin/master
 1008  git branch
 1009  git checkout origin/feature/xxx
 1010  vagrant reload
 1011  vagrant halt
 1012  vagrant up
 1013  vagrant reload
```

* | (パイプ)
  * コマンドを実行した結果として出力された値を、別のコマンドの入力として受け取ることができる

＜構文＞
```
$ コマンド1 | コマンド2
```

* grepコマンド
  * テキストファイルの内容を検索し、指定した正規表現にマッチする行があれば表示する

＜構文＞
```
$ grep [オプション] [文字列パターン] [検索対象ファイル]
```

＜例＞
以下のようなテキストファイルを用意

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810312/827b00f6-ee5c-b529-450e-4f71109de8ec.png)

```
$ grep test /Users/uchikoshik/Documents/test.txt
```

＜例の実行結果＞
```
test1
test2
test3
```

# 参考にした書籍
* [1週間でLPICの基礎が学べる本](https://www.amazon.co.jp/1%E9%80%B1%E9%96%93%E3%81%A7LPIC%E3%81%AE%E5%9F%BA%E7%A4%8E%E3%81%8C%E5%AD%A6%E3%81%B9%E3%82%8B%E6%9C%AC-%E7%AC%AC3%E7%89%88-1%E9%80%B1%E9%96%93%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B3%B6-%E8%83%BD%E5%92%8C/dp/429500636X)

# 参考URL
* [以前に入力されたコマンドをリストする (history コマンド)](https://www.ibm.com/docs/ja/aix/7.2?topic=commands-listing-previously-entered-history-command)
* [「Linux」で複数のコマンドをまとめて実行するには](https://japan.zdnet.com/article/35206675/)
* [grep コマンド](https://www.ibm.com/docs/ja/aix/7.1?topic=g-grep-command)
* [【Linux】今日から使えるgrepコマンド](https://tech-blog.rakus.co.jp/entry/20220912/grep#%E5%9F%BA%E6%9C%AC%E6%A7%8B%E6%96%87)
マルチスレッド

# はじめに

マルチスレッドを書いてみました。`threading.Thread(target=self._run_timer).start()` の部分が大切です。


```py: timer_counter
import threading
import time

class TimerCounter:
    def __init__(self):
        self.seconds_count = 0
        self.running = True
        threading.Thread(target=self._run_timer).start()

    def _run_timer(self):
        # 1 秒ごとにカウントを増やすのじゃ
        while self.running:
            time.sleep(1)
            self.seconds_count += 1

    def get_seconds(self):
        # 現在の経過秒数を返すのじゃ
        return self.seconds_count

    def __del__(self):
        # タイマーを停止するのじゃ
        self.running = False
```

```py: main.py
from timer_counter import TimerCounter

# インスタンスを作成して使う部分
timer_counter = TimerCounter()

try:
    while True:
        input("エンターを押すと経過時間を表示するのじゃ（終了するにはCtrl+Cを押すのじゃ）...")
        print(f"経過時間: {timer_counter.get_seconds()}秒")
except KeyboardInterrupt:
    print("プログラムを終了するのじゃ")
    del timer_counter  # インスタンス削除でタイマーを停止
```

この二つを同じフォルダにおいて、`main.py` を実行すれば動きます。
Attiny1616などに書き込みできなくなった時の対処法

Arduinoの書込み時に以下のエラーが出た場合の対処法です。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/ee026117-7b35-c6ad-b14a-93602bf4dd98.png)

```
ブートローダの書き込み中にエラーが発生しました。
avrdude: jtagmkII_getsync(): sign-on command: status -1
avrdude: jtagmkII_initialize(): Cannot locate "flash" and "boot" memories in description
avrdude: jtagmkII_program_enable(): bad response to enter progmode command: RSP_NO_TARGET_POWER
avrdude: jtagmkII_program_enable(): bad response to enter progmode command: RSP_NO_TARGET_POWER
avrdude: jtagmkII_read_byte(): bad response to read memory command: RSP_NO_TARGET_POWER
avr_read(): error reading address 0x0000
    read operation not supported for memory "signature"
avrdude: error reading signature data for part "ATtiny1616", rc=-2
avrdude: error reading signature data, rc=-2
avrdude: jtagmkII_program_disable(): bad response to leave progmode command: RSP_NO_TARGET_POWER
```
# UPDI High-Voltage
ロックがかかっており書き込むことができません。
色々な方が書かれていますが、__UPDI__ に __12V__ を __印加__ することで __ロック解除__ できます。
https://onlinedocs.microchip.com/oxy/GUID-8109B192-2AF1-4902-BA7D-C3C6DA7BDC69-en-US-3/GUID-26A0D98B-232C-4628-8E4B-59DDD2376102.html
### Adafruit High Voltage UPDI Friend - USB Serial UPDI Programmer
こちらのプログラマーでも解除可能です。

https://www.adafruit.com/product/5893

今回は、12Vの電源を用意して解除します。
__昇圧コンバーター基板__ と __ArduinoUno__ に __jtag2updi__ を書込んで使用します。
![Attiny1616HighVoltage.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/dbd8ca99-37bc-8e77-46f5-15caa1923202.jpeg)
### jtag2updi

https://github.com/ElTangas/jtag2updi

# 12V印加
起動後にUPDIピンに一度12Vを印加することで書き込み可能となります。
ただし、書込み装置への過電圧の危険性があるため、書込み装置とのジャンパワイヤーを外すことをお勧めします。

以上で書き込みができました。
本作業は危険性を伴うので注意して作業するようにしてください。
ｽﾀｯｸﾁｬﾝonSTM32 STMﾁｬﾝ

STM32マイコンとTouchGFX GUIチャレンジにおいてTouchGFXを使いｽﾀｯｸﾁｬﾝを製作しました。
ｽﾀｯｸﾁｬﾝはM5Stackをベースにしていましたが、TouchGFXの制約上、STM32を使用します。
![7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/d1321f74-c383-a570-0676-bb603ef41dc4.jpeg)
# 構成
STM32においてM5Stackのようなデバイスを構成する必要があります。
このため、液晶、スイッチ、Grove端子を追加します。
M5Stackと異なり、Wi-Fiなど通信がないため、LED、センサーなどを追加しました。
さらに、赤外線を追加することで、テレビの横に置いてマルチリモコンになるようにしました。
![3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a9fe20a4-4955-470b-516f-bcbda6d3ee59.jpeg)
## LED
3個のLEDにより画面以外の表現をしました。
## スイッチ
画面切替にスイッチを使用します。
## センサー
温湿度センサーにより環境情報を表示します。
![Top.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c0b29765-a30f-dc64-a089-dc154eafc149.jpeg)
## 赤外線
赤外線機能により環境情報以外にマルチリモコンとしても使用可能です。
## Groveコネクター
Groveコネクタにより拡張を可能としました。
## サーボ端子
STMチャンの特徴である首振り機能ためにサーボ端子を2個搭載しました。
## リモコン
赤外線リモコン用にTouchGFXにてGUIを製作しました。
![5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/e4e6c468-3194-b5a7-f1ba-9f7706d1e739.jpeg)
<img src="https://protopedia.net/pic/2215394b-5aa2-4465-803c-41d3a1267978.png">
# ProtoPedia
https://protopedia.net/prototype/5402
コンテナに入るとき、コンテナ名を指定しないで入る方法

## 初めに

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

## 各サービス名を書くだけでもコンテナに入れます

起動中のコンテナに入るコマンドとしてこういうコマンドがあります。
```
docker exec -it [コンテナID] /bin/bash
```

なんだか長くて面倒くさいですよね。

そういう時に便利なコマンドとして、
```
docker compose exec <サービス名> bash
```
こういったコマンドがあります。サービス名を使えば、関連するコンテナに入れます。

例えばwebサービスに接続する場合は
```
docker compose exec web bash
```
上記のように書きます。
cscの作法 その531

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
RichTextBox に右クリックメニューを実装せよ。


# 参考にしたページ

https://qiita.com/uni928/items/b124e21e66a4f0d6a1c7


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e0068da1-b5eb-384f-452c-ec4277a70427.png)



# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;
using System.IO;
using System.Reflection;

class form1: Form {
	RichTextBox rtxt;
	ContextMenuStrip cms = new ContextMenuStrip();
	form1() {
		Text = "RichTextBox";
		ClientSize = new Size(400, 400);
		rtxt = new RichTextBox();
		rtxt.Multiline = true;
		rtxt.WordWrap = false;
		rtxt.AcceptsTab = true;
		rtxt.ScrollBars = RichTextBoxScrollBars.Both;
		rtxt.Dock = DockStyle.Fill;
		this.Controls.Add(rtxt);
		cms.Opening += new CancelEventHandler(cms_Opening);
		rtxt.ContextMenuStrip = cms;
	}
	void cms_Opening(object sender, CancelEventArgs e) {
		ContextMenuStrip menuOnPanel = (ContextMenuStrip) sender;
		Point mp = MousePosition;
		menuOnPanel.SourceControl.PointToClient(mp);
		cms.Items.Clear();
		cms.Items.Add("コピー");
		cms.Items[0].Click += PanelMenuItems0_Click;
		cms.Items.Add("貼り付け");
		cms.Items[1].Click += PanelMenuItems1_Click;
		e.Cancel = false;
	}
	private void PanelMenuItems0_Click(object sender, EventArgs e) {
		if (0 < rtxt.SelectionLength)
		{
			Clipboard.SetText(rtxt.Text.Substring(rtxt.SelectionStart, rtxt.SelectionLength));
		}
		rtxt.Focus();
	}
	private void PanelMenuItems1_Click(object sender, EventArgs e) {
		int selectoin = rtxt.SelectionStart;
		string insertString = Clipboard.GetText();
		rtxt.Text = rtxt.Text.Substring(0, selectoin) + insertString + rtxt.Text.Substring(rtxt.SelectionStart + rtxt.SelectionLength);
		rtxt.SelectionStart = selectoin + insertString.Length;
		rtxt.SelectionLength = 0;
		rtxt.Focus();
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}





```

以上
[C#]virtualとoverrideの使い方をざっくり説明

# 結論

ざっくり、virtualは仮想、overrideは上書きという意味。

* 基本クラスのメソッドを再定義するためにoverrideが使われる
  * 基本クラスのメソッドにvirtualを指定、派生クラスのメソッドにoverrideを指定
  * virtualの付いていないメソッドはoverrideすることができない
* virtualはstatic、abstractと一緒には使用できない



# 参考にした書籍
* [[改訂版]ゴールからはじめるC# ~「作りたいもの」でプログラミングのきほんがわかる](https://www.amazon.co.jp/%E6%94%B9%E8%A8%82%E7%89%88-%E3%82%B4%E3%83%BC%E3%83%AB%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%82%8BC-%E3%80%8C%E4%BD%9C%E3%82%8A%E3%81%9F%E3%81%84%E3%82%82%E3%81%AE%E3%80%8D%E3%81%A7%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%8B-%E8%8F%85%E5%8E%9F-%E6%9C%8B%E5%AD%90/dp/4297109018)

# 参考URL
* [virtual キーワード - C# reference](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/virtual)
* [override 修飾子 - C# reference](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/override)
【Rails】deviseのエラーメッセージを日本語化する方法

deviseを使用したアプリケーションで、ログインや新規登録のエラーメッセージを日本語化することで、ユーザーにとってより使いやすいインターフェースを提供できます。今回は、deviseのエラーメッセージを日本語に変更する設定方法について解説します。

### 1. devise-i18nを導入する

devise-i18nというGemを使用することで、deviseのエラーメッセージを簡単に多言語化できます。このGemには日本語を含む多くの言語ファイルが含まれており、すぐに設定に使用できます。

Gemをインストールする

```rb:gem
gem 'devise-i18n'
```
を追加します。

```terminal
bundle install
```

### 2. Railsの日本語化設定を行う

次に、Rails全体の言語設定を日本語に変更します。config/application.rbファイルを開き、以下の行を追加または編集します。

```config/application.rb
module YourApp
  class Application < Rails::Application
    # 以下の行を追加
    config.i18n.default_locale = :ja
  end
end
```

これにより、Rails全体のデフォルト言語が日本語に設定され、deviseを含むシステム全体のメッセージが日本語で表示されるようになります。

### 3. 日本語化ファイルを確認する

devise-i18nのGemをインストールした後、deviseの日本語の翻訳ファイルが自動的に適用されますが、必要に応じてカスタマイズできます。翻訳ファイルは以下のパスにインストールされます。
	•	config/locales/devise.ja.yml

このファイルを編集すると、エラーメッセージやその他のメッセージの日本語表記をカスタマイズできます。

### 4. config/locales/ja.ymlでRails全体の日本語化を設定する（オプション）

もし、まだRails全体の日本語設定をしていない場合、ja.ymlファイルを追加して日本語化設定を行います。config/locales/ja.ymlファイルを作成し、以下のように記述します。

```yaml
ja:
  hello: "こんにちは"
  activerecord:
    errors:
      messages:
        record_invalid: "入力にエラーがあります"
  devise:
    sessions:
      user:
        signed_in: "ログインしました。"
        signed_out: "ログアウトしました。"
    registrations:
      user:
        signed_up: "アカウント登録が完了しました。"
        updated: "アカウント情報を更新しました。"
```
このファイルでdeviseの特定のメッセージや、Rails全体のメッセージを自由にカスタマイズできます。

まとめ

Gemfileにdevise-i18nを追加してbundle installでインストール
config/application.rbでconfig.i18n.default_locale = :jaを設定
必要に応じてconfig/locales/devise.ja.ymlの日本語化ファイルをカスタマイズ
config/locales/ja.ymlを作成し、Rails全体のメッセージを日本語化（オプション）
【React】React + Vite のアプリを GitHub Pages にデプロイする

__React + Vite__ で作ったアプリを __GitHub Pages__ にデプロイする方法をまとめます。
既にアプリの実装が終わってGitHubのPublicリポジトリにプッシュしている前提で進めますので、最初のセットアップなどは`npm create vite@latest`のコマンドで行ってください。
デプロイにあたっては下記の記事を参考にさせていただきました。
- [Deploying REACT+VITE website in Github Pages | DevelopersIO](https://dev.classmethod.jp/articles/deploying-reactvite-website-in-github-pages/)

## `gh-pages`のインストール
ReactアプリをGitHub Pagesにデプロイするためのパッケージがあるので下記のコマンドでインストールします。
```
npm install gh-pages --save-dev
```

## 設定を追加
下記の行を追加します。
```diff_json:package.json
{
+ "homepage": "https://<GitHubのユーザー名>.github.io/<アプリをプッシュしたリポジトリ名>/",
  "name": "todo-list",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "lint": "eslint .",
    "preview": "vite preview",
+   "predeploy": "npm run build",
+   "deploy": "gh-pages -d dist"
  },
  "dependencies": {
    中略
}
```

```diff_javascript:vite.config.js
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";

// https://vite.dev/config/
export default defineConfig({
+ base: '/<アプリをプッシュしたリポジトリ名>/',
  plugins: [react()]
});
```

## デプロイする
下記のコマンドでデプロイしましょう。画像のように「Published」と表示されればOKです。
```
npm run deploy
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2207701/7bf43490-b974-91ac-01c8-bccbd0c5c557.png)

## アプリにアクセスする
リポジトリにアクセスして Settings → Pages と進み、画像のようになっていることを確認したら、Visit siteでアプリにアクセスしましょう。
実際に反映されるまでラグがあるのかわかりませんが、先程のデプロイコマンド直後だとまだアプリが表示されない場合があるため、少し時間をおいてアクセスすると表示されるかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2207701/e3935088-0e14-afb0-1dc1-ab1ad174fb60.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2207701/9380c48e-b00c-a2bc-3228-aefa52ef97fc.png)
掛け算の定義を考える！！！


## きっかけ

実数の乗算の定義を見たことがないので気になった。

## 前提

自然数は0を含むものとする。
あと、面倒くさいので群の公理が成立しているのかは証明しない。

## N×N

ある$a \in \mathbb{N}, \ b \in \mathbb{N}$に対して

```math
a \times b = \underbrace{a + a + \cdots + a}_{b \text{個}}
```

## Z×Z

ある$a \in \mathbb{Z}, \ b \in \mathbb{Z}$に対して

$b \geq 0$ の場合

```math
a \times b = \underbrace{a + a + \cdots + a}_{b \text{個}}
```

$b < 0$ の場合

```math
a \times b = \underbrace{-a + -a + \cdots + -a}_{-b \text{個}}
```

:::note warn
$-a, -b$という表記は加法群の逆元を表している。
ややこしいが$-1$を掛けている訳ではない。
:::

## Q×Q

「有理数自体が有理数の掛け算で表現されている」ため、**循環定義**が生じる可能性がある。

したがって、まずは有理数を「有理数の掛け算の概念を含まない形」で次のように定義する。

```math
\mathbb{Q} = \left\{ \frac{a}{b} \, \middle| \, \forall a \in \mathbb{Z}, \, \forall b \in \mathbb{N} \setminus \{0\} \text{ のもとで、0 に } b \text{ 回足すと } a \text{ になる数} \right\}
```

この時、有理数の掛け算は以下のように定義できる。

ある$a, \ c \in \mathbb{Z}, \ b, \ d \in \mathbb{N} \setminus \lbrace 0 \rbrace$に対して

```math
\frac{a}{b} \times \frac{c}{d} = \frac{a \times c}{b \times d}
```

こっちのほうが分かりやすいかもしれない。

```math
\left\{ 0 \text{ に } b \text{ 回足すと } a \text{ になる数} \right\} \times \left\{ 0 \text{ に } d \text{ 回足すと } c \text{ になる数} \right\} = \left\{ 0 \text{ に } (b \times d) \text{ 回足すと } (a \times c) \text{ になる数} \right\}
```

## R×R

実数を有理数のコーシー列の極限で表せば拡張できるはず。
面倒くさいので書かない（言い訳）。
【Flutter】代表的なWidget

# はじめに
業務でFlutterに触れる機会が増えてきたので、自分の備忘録も兼ねて画面作成の基本となるWidgetについて簡単にここでまとめておきたいと思います。

# 動作環境
* Windows
* Flutter SDK 3.24.5
* Android Studio Ladybug | 2024.2.1 Patch 2

# Widgetについて
WidgetとはFlutterにおけるUIを構成する要素のことを指します。
Widgetは大きく二種類に分けることができて、一つはボタンやテキストなどの**画面のパーツ**となるもので、もう一つはパーツを横並べにしたり、中央ぞろえにしたりと**レイアウトに関わるもの**です。
この記事ではまずは見た目でわかりやすい画面のパーツとなるWidgetをいくつか紹介します。

## Scaffold
Scaffoldは画面の土台となるWidgetで、画面上部のAppBarなどの画面の基本的な構成要素を簡単に実装することができます。
Scaffoldの代表的なプロパティとして以下のものがあり、それぞれのプロパティを指定することで、表示内容や見た目などを自由に変えることができます。
* appBar：画面上部に表示されるアプリバー
* body：画面のメイン部分
* floatingActionButton：画面の右下に表示されるボタン
* bottomNavigationBar：画面下部に表示されるナビゲーションバー

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767634/9e28f0b7-b2b6-e1a8-55b9-e5f735c4f9ae.png">

## ボタン系

### TextButton
TextButtonはテキストを表示し、それを押下したときになにかイベントを発生させるときに使用するWidgetです。
デフォルトだと枠線は無く、押下されたときとそうでないときでテキストの色が変わるようになっています。ボタン系のWidgetの中では最もシンプルなものです。
![TextButton.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767634/32a3d7e9-6483-02f2-1d67-949543d7b4b8.png)

### ElevatedButton
ElevatedButtonはGoogleが推奨するマテリアルデザインに準拠した見た目のボタンを配置するためのWidgetです。
角の丸みや影の付き方などの調整が簡単にでき、モダンな見た目のレイアウトを作りやすいです。
![ElevatedButton.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767634/b457f8b7-30a0-5a56-59c1-0e8bc57d10ae.png)

### OutlinedButton
OutlinedButtonはTextButtonに枠線が付いているWidgetです。
表示内容にはテキストやアイコンを使用することができます。
![OutlinedButton.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767634/9ccbee57-65e9-b5bd-7455-c3bed9c33b4a.png)

## テキスト系

### Text
Textはテキストを表示するために使用するWidgetです。
フォントサイズや色、フォントスタイルなどの設定プロパティが用意されています。
![Text.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767634/5179db68-790b-7c83-1a32-8ba0300721e3.png)


### TextField
TextFieldはユーザーにテキスト入力をさせるためのフィールドを配置するためのWidgetです。
未入力の際にうっすらと表示されるヒントテキストの表示などの設定プロパティが用意されています。
![TextField.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767634/96627d43-a674-dd8e-99fb-9468b02e3524.png)


## 画像系

### Image
Imageは画像表示するために使用するWidgetです。
画像はネットワーク上にあるものやローカルにあるものを参照することができます。
また、画像サイズの調整も簡単に行うことができます。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767634/370da44e-326f-ed6d-de32-1a2f31c57cd9.png">



# まとめ
今回はFlutterの基本となる代表的なWidgetをいくつか紹介しました。
ここで紹介したもの以外にもまだまだたくさんのWidgetがあるので、調べてみると便利なものが見つかると思います。

# 参考
https://www.flutter-study.dev/widgets/about-widget

https://docs.flutter.dev/ui/widgets
Kotlin Multiplatformの環境構築

最近Kotlin Multiplatformを使い始めたので、環境構築の方法を備忘録としてまとめました。


▼ 公式ドキュメント

https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-setup.html#install-the-necessary-tools

## 環境
Apple M1 Max
macOS Sonoma 14.6.1

## 1. Android Studio をインストール
まずはAndroid Studioをインストールします。

https://developer.android.com/studio

## 2. Kotlin Multiplatform Mobile pluginをインストール
Android Studioのインストールが完了したら、Android Studio のメニューから 

`Settings > Plugins > Marketplace`

と進み、Kotlin Multiplatform Mobile plugin を検索してインストールします。

## 3. Xcodeをインストール
App storeからインストールします。

https://apps.apple.com/jp/app/xcode/id497799835?mt=12

## 4. KDoctorをインストール
KDoctorは、Kotlin Multiplatformの開発環境に必要なツールがインストールされているか、また正しく設定されているかを診断するツールです。

https://github.com/Kotlin/kdoctor?tab=readme-ov-file


Homebrew経由でインストールします。

```
% brew install kdoctor
```

インストールが完了したらコンソールでKDoctorを呼び出して、Kotlin Multiplatformが使用できる状態かを確認します。

```
% kdoctor
```

KDoctorが診断を終了すると、レポートが生成されます。
問題が見つからなければ、Kotlin Multiplatformの開発環境が整っています🎉
```
Conclusion:
    Your system is ready for Kotlin Multiplatform Mobile Development!
```
## 5. 必要に応じてKDoctorのエラー箇所を解決する
### [×] Java
JAVA_HOME環境変数が正しく設定されていないことが原因の可能性が高いです。
Android Studioに含まれるJDKを指すように設定する必要があるため、`~/.zshrc`に以下の設定を追加します。
```
export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jbr/Contents/Home
```


### [×] CocoaPods

**System ruby is currently used**というエラーの場合、別途Rubyのインストールが必要です。
Homebrewでrbenvを入れて、Rubyをインストールします。

https://github.com/rbenv/rbenv

```
% brew install rbenv
% rbenv init

% rbenv install 3.3.5
% rbenv global 3.3.5

% which ruby
/Users/ユーザー名/.rbenv/shims/ruby
% ruby -v
ruby 3.3.5 (2024-06-12 revision f1c7b6f435) [arm64-darwin23]
```

**CocoaPods requires your terminal to be using UTF-8 encoding**というエラーの場合、
`.zshrc`にUTF-8の設定を追加します。

```
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
```


## 参考
https://note.com/chickenjr/n/na59eb7196536
Pythonでライブラリをインポートしようとしたら、「インポート "ライブラリ名" をソースから解決できませんでした」というエラーメッセージが出た

## Pythonでpandasをインポートして使おうとしていた
インタープリタがいつの間にか変わってたのが原因だった
Ctrl + Shift + Pで、コマンドパレットを開き、Python: Select Interpreterから、正しいインタープリタを選択する。

おすすめ！って書いてあるから上のものにしていたが、下のものが正しいやつ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3893491/4b0c5dc1-b369-9f5e-e49f-4d11f69c4748.png)
Linux シェル変数と環境変数

分かりそうで分からないシェル変数と環境変数を整理しました。

### 概要
　シェル変数：実行中のシェル内で有効な変数。子プロセスでは利用不可
　環境変数：実行中のシェル内と子プロセス（シェルから実行されたコマンド）で有効な変数。

### 変数設定時の書式
　・=の前後にスペースは利用不可
　・変数名は英字、数字、アンダーバーを利用できる　
　・先頭の文字に数字は利用不可
　・大文字と小文字は区別される
　・値にスペースが入る場合は以下の引用符で囲む
   '（シングルクオーテーション）
 　"（ダブルクォーテーション）
   `（バッククォーテーション）

### 引用符

#### シングルクォーテーション
 全て文字列になる。

#### ダブルクォーテーション
文字列内に変数がある場合、変数の内容が展開される。
展開させたくない場合は先頭に/を利用する 

`eeee

#### バッククォーテーション
バッククォーテーション内にコマンドがあれば、そのコマンドが実行される。
展開させたくない場合は先頭に/を利用する 

### シェル変数を設定する
書式
 `` 変数名=値 ``

例
```
var='Hello World'
```

### echo シェル変数を確認する
書式：
``echo $変数名　``

例
```
#echo $var
Hello World
```

### unset シェル変数を解除する
書式
``unset 変数名``

例
```
unset var
```

### 環境変数を設定する
書式
``export 変数名``

例
```
#export linux='Hello linux'
#echo $linux
Hello linux
```
### env 変数を確認する。実行対象のコマンドに一時的な環境変数を設定して実行する
例：引数無しで実行すると全ての環境変数が表示されます
```
#env
～全て環境変数が表示される～
```

### printenv 環境変数の一覧を表示
例：引数無しで実行すると全ての環境変数が表示されます
```
#printenv
～全て環境変数が表示される～
```
例：引数有り。
```
#export linux='Hello linux'
#printenv $linux
Hello linux
```
### set シェル変数と環境変数の一覧を表示する

例：
```
#set
～全て環境変数が表示される～
```

### よく利用する環境変数
linux上で定義されている環境変数です

|変数名|説明|
| ---- | ---- |
EDIOR|既定のエディタのパス
HISTFAILE|コマンド履歴を格納するファイル
HISTFILESIZE|HISTFILEに保存する履歴数
HISTSIZE|コマンド履歴の最大値
HOME|カレントユーザのホームディレクトリ
HOSTNAME|ホスト名
LANG|ロケール
LOGNAME|ログインシェルのユーザ名
PATH|コマンドやプログラムを検索するディレクトリリスト
PS1|プロンプトの表示文字列
PS2|複数行にわたる入力時のプロンプト
PWD|カレントディレクトリ
TEAM|端末の種類
USER|現在のユーザー
ProxmoxVEで仮想基盤を構築してみた話

# 背景

前回、サークルの部室にISPとピアリングしてもらい、ネットワークを構築したというお話をしました。その後、所有しているIPアドレスを活用し、Docker専用のサーバを構築し、部室運営に必要なサービスをDockerのコンテナにして運営してきましたが、「Webサーバを使わせてもらいたい」、「Linux仮想サーバを使わせて欲しい」等の要望があり、要請がある度にアプリケーションをコンテナ化してもらいDocker上にデプロイしましたが、外部の人が直接仮想基盤をいじらせたくないことや、デプロイが煩わしいこともあり仮想基盤の内部にLXCを作り、外部からのSSHによりLXC内部に直接アクセスしてもらえるように、ProxmoxVEへの移行を決定しました。
ただ、ProxmoxVEへ移行するだけじゃ今回の要件を全部満たすことはできないので、ProxmoxVEを導入した後、どのように構成したかを簡単にまとめてみようと思います。

## 要件定義
1. リバースプロキシによるHTTPルーティングができること
1. ProxmoxVE内部のコンテナに外部から直接SSHができること
1. NATによるプライベートIP割り当てでグローバルIPの節約

# 構成図

![proxmoxve.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640781/8b46bd67-296f-53f2-66d9-8a6f4268c5ae.png)

## SSHPiper

SSHPiperはユーザ名でSSHのコネクションをルーティングしてくれるもので、同じIPでも、
`user200@AAA.BBB.CCC.DDD -> root@10.0.0.2`
`user201@AAA.BBB.CCC.DDD -> root@10.0.0.3`
のようにルーティングしてくれます。
したがって、コンテナごとにグローバルIPアドレスの割り当てや、ポートフォワーディング(マスカレード)をせずに外部から一つのIP、一つのポートだけでも十分アクセスができるようになります。

## Nginx Proxy Manager

HTTPも同様に、ホストごとのルーティングを行うべく、GUIで手軽にルーティングの制御ができるNginx Proxy Managerを導入しました。
Nginx Proxy ManagerはProxmoxVE内部のNATと接続しているため、ユーザにユーザ所有のホストにコンテナのグローバルIPを登録してもらい、Nginx Proxy Managerでホスト名に対応させプライベートIPの10.0.0.2~254を登録することで、一つのIPで複数のWebサービスを運用することができます。

# 移行後の感想
- 仮想基盤をDockerのみ運用していたため、ユーザが直接SSHにアクセスできず、いちいちdocker-compose.ymlやDockerfileを受け取り、デプロイしていましたが、その手間が省けました。
- また、ProxmoxVEからデフォルトでQoSを提供してくれるため、コンテナのネットワークスピードの制限も可能で、不意にコンテナ内部でネットワーク障害を起こす恐れを防ぎました。
- VPNを構成し、貸出用のコンテナを除きすべての操作はVPN経由でできるようにしたため、外部からProxmoxVEの管理者パネルやSSHの攻撃の可能性を完全に封じました。
- DockerをそのままProxmoxVEに移行させたため、多少構成が雑になってしまいました。
- 貸出用コンテナの内部からユーザが任意にDockerをインストールし、CI/CDパイプラインの構成もできるため、管理の融通が効くようになりました。

# 参考記事
[コンテナ内部から/dev/pppが使えない問題](https://forum.proxmox.com/threads/vpn-client-proxmox-docker-no-dev-ppp-interface.115903/)

[ユーザー名ベースで接続先を切り替えるSSHリバースプロキシ「SSH Piper」を使ってみた](https://www.infiniteloop.co.jp/tech-blog/2016/05/user-namebase-ssh-reverse-proxy/)
UMLで始める"草の根"業務分析

## 刷新できないレガシーシステム
経済産業省の[DXレポート](https://www.meti.go.jp/shingikai/mono_info_service/digital_transformation/20180907_report.html)で話題になった「**2025年の崖**」も目前に迫っています。
しかしながらレガシーシステムの刷新は多くの企業が達成できておらず、特に難しい問題として同レポートでは以下のように書いています。
> 既存システムの問題を解消しようとすると、ビジネス・プロセスそのものの刷新が必要となり、これに対する現場サイドの抵抗が大きいため、いかにこれを実行するかが課題となっているとの指摘もなされている。

往々にしてこのように現場サイドの反発が取り沙汰されますが、個人的な経験では、この問題はミスコミュニケーションによるものが多いと感じています。

## ユーザー企業 vs ベンダー企業
本来、ビジネスプロセスを語る際は**特定のITシステムに依存しないこと**が大原則ですが、ユーザー側の担当者の多くは自社のITシステムでしかその業務を知らないので、それを排除して業務プロセスを語ることは、そのような習慣がなければ困難です。

さらにベンダー側も、業界や顧客の具体的な業務プロセスまで把握しておらず、ベストプラクティスと言いながら、結局自社製品を前提とした業務プロセスしか語れないということも多いのです。

結果的に共通の言語となりうるプロセスやユースケースではなく、お互いが理解できない自社システム固有の言葉をぶつけ合ってしまいます。

## "草の根"業務分析のススメ

そこで、まずは日頃から業務プロセスを共通言語を用いて一般化する習慣をつけ、業務そのものに対する汎用的な知識を深めつつ、いつでも最適な業務プロセスについて生産的で円滑な議論できたらよいと思いませんか？

ここで役に立ちそうなのが**UML**です。

# UMLとは？
Unified Modeling Language(UML)はソフトウェア開発・システム設計、または今回のようなビジネスプロセスモデルなどを視覚的に図式化できる標準化されたモデリング言語です。
視認性も高く、標準化されたルールに基づいて業務プロセスやユースケースを表現できるので円滑で明確なコミュニケーションが期待できます。
UMLについてはこの記事がわかりやすかったのでリンクしておきます。

https://qiita.com/yamayui/items/532deb10e10f3a9ffc49

そして、**PlantUML**はこのUMLダイアグラムをテキストベースで作成できる言語です。テキストデータなので管理が容易です。
コーディングはちょっとなーって思う方は[Microsoft Copilot](https://copilot.microsoft.com/)と一緒に始めましょう！
（AIは会社のガイドラインに従って使ってください）

まずVisual Studio CodeやPlantUMLのインストールが必要ですが、この記事がわかりやすいと思います。

https://qiita.com/couzie/items/9dedb834c5aff09ea7b2

# PlantUMLとCopilotで簡単に業務プロセスを視覚化
準備ができたら、アクティビティ図を使って早速業務プロセスを視覚化してみます。
[Copilot](https://copilot.microsoft.com/)に自然言語でコーディングを依頼してみます。ここでは図書館管理システムを例に挙げてみます。
```
図書館管理システムの業務プロセスを描いています。
PlantUMLのアクティビティ図を用いて、以下を記述してください。
・利用者は図書を検索します。その後、図書の詳細を確認します。
・図書が予約可能であれば予約をして、図書館は予約確認メールを送信します。
・予約できない場合は予約待ちリストに登録して、図書館は予約可能になったら通知を送信します。
```
こんな感じのコードが返ってきます（結果は異なる可能性があります）
```
@startuml
|利用者|
start
:図書を検索する;
:図書の詳細を確認する;

|図書館|
if (図書は予約可能か?) then (はい)
    :予約をする;
    :予約確認メールを送信する;
else (いいえ)
    :予約待ちリストに登録する;
    :予約可能になったら通知を送信する;
endif

stop
@enduml
```
これをVisual Studio Codeにコピペして、alt + Dでプレビューを出すとこのように視覚化されたモデルが出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931939/ba255299-c7f9-0662-802b-c60b423f7fe0.png)


予約図書を取りに行くプロセスも追加したくなったので、Copilotに修正を依頼してみました。
```
最後に利用者が予約図書を取りに行くプロセスを追加できますか？
```
と伝えると、このように修正してくれました。
```
@startuml
|利用者|
start
:図書を検索する;
:図書の詳細を確認する;

|図書館|
if (図書は予約可能か?) then (はい)
    :予約をする;
    :予約確認メールを送信する;
else (いいえ)
    :予約待ちリストに登録する;
    :予約可能になったら通知を送信する;
endif

|利用者|
:予約図書を取りに行く;

stop
@enduml
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931939/60b51ad2-fd20-c0ea-9ed8-4f976c07791d.png)


## まとめ
こんな感じで、PlantUMLを用いてテキストベースで、さらにCopilotのようなAIを組み合わせれば自然言語で標準化されたプロセスモデルを作図できます。

従来、レガシーシステムを刷新するためにはもはやトップダウンによってパッケージソリューションをOOTBで導入して、無理やり業務を合わせこむしかありませんでしたが、
このようなテクノロジーで、どの会社も理路整然とした業務プロセスを持ち、賢く柔軟にパッケージソリューションを適用できるようになるのではないかと期待しています。

## 参考記事
[実践！UML！](https://qiita.com/yamayui/items/532deb10e10f3a9ffc49)
[Visual Studio Code で UML を描こう！](https://qiita.com/couzie/items/9dedb834c5aff09ea7b2)
【React × TypeScript 】名刺アプリを作成してみました

# はじめに
現在、JISOUというコミュニティでReactの学習をしています。今回は学習の一環で制作した名刺アプリについてご紹介します。

# 制作したもの
今回制作したのは、名刺作成アプリです。名刺の作成と、作成した名刺の検索ができるシンプルな機能を持っています。

***検索機能***
![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/18ab91e0-fe5d-309f-451f-0fdf0c040518.gif)

***新規作成***
![2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/9e2c812e-2180-6c44-589b-e3fab6bdb3da.gif)


# 大変だったところ
+ ***supabaseを使ったDBの作成***
今回、特に苦労したのがSupabaseを用いたテーブルの作成でした。ユーザーにスキルを紐付けるため、技術選択に中間テーブルを作成してリレーションを組んでいます。しかし、中間テーブルの概念を理解するのに時間がかかりました。

最初は、次のように「tableAが中間テーブルにネストされている」イメージを持っていました。
```
tableA→中間テーブル→tableB
```
tableAの中に中間テーブルがネストされているイメージでした。
```
tableA←中間テーブル→tableB
```
実際は下のように、それぞれのテーブルが平等な関係でリレーションされていました（厳密には異なりますが、このイメージが近いです）。

また、外部キー制約の理解にも苦戦しました。外部キーをテーブルAと中間テーブルBの双方に設定してしまったため、正しくリレーションが組めませんでした。この経験を通して、外部キーと中間テーブルの役割について理解を深められました。

# 成長を感じたこと
+ ***テストの実装***
数ヶ月前まで、テストについてまったく知識がありませんでした。課題を通じてテストを実装し、1ヶ月ほど勉強を続けてきました。今回の課題では、テストで詰まることはほとんどなく、学習の成果を感じられました。

+ ***Reactの理解***
理解すべきことはまだたくさんありますが、3ヶ月前にはJavaScriptですら自信がなかった私が、Reactでアプリを制作できるようになりました。実装のイメージが湧くようになり、手が止まることも少なくなったことで、自身の成長を実感しています。



# 気がついたこと
***<font color="red">継続すること</font>***
継続は力なり、ということを改めて実感しました。今回作ったアプリは、決して複雑ではありませんが、毎日コツコツ続けることで確実に成長できることがわかりました。

完璧に理解できなくても、ある程度で次に進む方が学習効率は高いと感じます。止まらずに勉強を続けていれば、後でわかるようになることもたくさんあります。

# 終わりに
これからも地道に学習を続け、さらにスキルを磨いていきたいと思います。
【AWS】ローカルから踏み台サーバーを経由してpsqlコマンドを実行する

# はじめに
DB関連のエラー調査のため、psqlのメタコマンドを実行する必要があった。
使用PCはWindowsです。

# 問題
psqlコマンドでDBへ接続したいが、踏み台サーバーを経由する必要があるが、方法が不明だったため調査。

# 解決方法
sshでポートフォワーディングによる接続を行う必要がある。
私の参加していた案件ではpemファイルを利用していたので、pemファイルも指定する。
```bash
ssh -o StrictHostKeyChecking=no -f -N -L {ローカルで待ち受けるポート}:{RDSのエンドポイント}:5432 ec2-user@{踏み台サーバーのIP} -i {秘密鍵のパス} 2>&1
```
※ローカルで待ち受けるポートは他と重複しない任意のポート番号

接続できているか確認する。
```bash
netstat -na
```
 
 結果
 状態がLISTENINGになっていることを確認。
 ```bash
 ...
 TCP    127.0.0.1:{指定したローカルのポート}         0.0.0.0:0              LISTENING
 ...
```

psqlコマンドで接続する。
```bash
$ psql -h localhost -p {指定したローカルのポート} -U {DBユーザー} -d {データベース名}
ーザー [DBユーザー] のパスワード:
psql (16.2、サーバー 15.4)
SSL接続(プロトコル: TLSv1.3、暗号化方式: TLS_AES_256_GCM_SHA384、圧縮: オフ)
"help"でヘルプを表示します。

[データベース名]=>

```

無事接続できた。

# おわりに
普段あまりやらない事を突然（しかも緊急で）やらないといけなくなるとテンパりますね。
とにかく落ち着いて調べていけば大丈夫、と自分へ。
Matlab（R2024b）をUbuntuにインストールするときのエラー（The exit code was: 262）の対応

## 結論

インストールスクリプトが日本語を含むパスの上にあると動かないので、適宜ファイル群を移動されたし

## 再現

https://jp.mathworks.com/help/install/ug/install-products-with-internet-connection.html

Matlab公式ドキュメントに沿ってインストーラをダウンロードする。

zipファイルは`/home/<username>/ダウンロード/matlab_R2024b_Linux.zip`に配置されました。

```
unzip matlab_R2024b_Linux.zip -d ./matlab_R2024b_Linux
cd ./matlab_R2024b_Linux

xhost +SI:localuser:root
sudo -H ./install 
xhost -SI:localuser:root
```
`sudo -H ./install`の部分でエラーが発生します。
```
tamacake39@DESKTOP-987456:~/ダウンロード/matlab_R2024b_Linux$ sudo ./install 
terminate called after throwing an instance of 'std::runtime_error'
  what():  Failed to launch web window with error: Unable to launch the MATLABWindow application. The exit code was: 262
中止
```

## 解決

Unable to launch the MATLABWindow application. The exit code was: 262

https://jp.mathworks.com/matlabcentral/answers/2159345-unable-to-launch-the-matlabwindow-application-the-exit-code-was-262

パスにマルチバイト文字が含まれると262エラーを吐くようです

ubuntuにおける`~/ダウンロード/`って本当に日本語のパスになってるんですね。

windowsの`~/ダウンロード/`みたいのはLocalizedFileNamesで指定されているので、実際の名前は`~/Downloads/`で見た目だけファイル名が変わってたりするんですが。どっちもカスです。

ので、つまりはinstallスクリプトが`/home/<username>/ダウンロード/install`に配置されたことによるエラーなので、matlabインストーラ群を`/home/<username>/`あたりにでも移動させてあげます。

```
mv ./matlab_R2024b_Linux ../
cd ../

xhost +SI:localuser:root
sudo -H ./install 
xhost -SI:localuser:root
```
でひとまずの解決。
【Error】一瞬詰んだかと思った。マイグレーションファイルのタイムスタンプ



データベースがクラッシュしたため、再度新規データベース作成。
デプロイしたらエラーとなりました。
502が表示されたので、詰んだかと思いましたが、無事解決したので今後の為にも記事にしておきたいと思います。

## 環境
- Windows, WSL
- Docker
- Ruby 3.2.3
- Rails 7.1.3



## エラー内容
```
bin/rails aborted!
StandardError: An error has occurred, this and all later migrations canceled: (StandardError)
PG::UndefinedTable: ERROR:  relation "prefectures" does not exist
/opt/render/project/src/db/migrate/20240830014857_create_posts.rb:3:in change'
Caused by:
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "prefectures" does not exist (ActiveRecord::StatementInvalid)
```

このエラーメッセージは、`db/migrate/20240830014857_create_posts.rb` マイグレーションで、`prefectures` テーブルが存在しないためにエラーが発生していることを示しています。

### 考えられる原因

- `posts` テーブルを作成するマイグレーションが、`prefectures` テーブルに依存しているにもかかわらず、`prefectures` テーブルがまだ作成されていない状態で実行されている可能性がある。
- しかし、既に `schema.rb` やマイグレーションを確認した際には `prefectures` テーブルが存在していることが確認済み。
- なので、**マイグレーションの順序の問題である可能性が高い**



## 解決方法

1： **マイグレーションの順序を確認する**
```
20240830014857_create_posts
20240830025850_create_prefectures
20240830030833_create_lines
20240830044413_create_stations
```

2： **マイグレーションのリネーム**

`20240830014857_create_posts.rb` のタイムスタンプを、`20240830025850_create_prefectures.rb` より後になるように変更していきます

```bash
mv db/migrate/20240830014857_create_posts.rb db/migrate/20240830025900_create_posts.rb
```

これで、`prefectures` テーブルが `posts` よりも先に作成！


3： **データベースの状態をリセット**

すでにエラーが発生しているため、データベースをリセットしてからマイグレーションを再実行する必要があります。
👇下記コマンドでデータベースをリセットし、マイグレーションをやり直します

```bash
docker compose exec web rails db:drop db:create db:migrate
```

これにより、`prefectures` テーブルが先に作成され、その後 `posts` テーブルが問題なく作成されました。
エラーも無事解決！！？:relaxed:

```
※この後stationの方でもエラーが出たため最終的にこのようになりました
mv db/migrate/20240830025900_create_posts.rb db/migrate/20240830044500_create_posts.rb
```

# さいごにまとめ
なぜか今まで大丈夫だったのにこのタイミングでマイグレーションファイルに関するエラーが出るとは思ってもいませんでした。
このまま何も起こらないことを祈るばかり。
今回の記事が何か参考になれば幸いです。
Docker環境下でplaywrightを動かそうとするとHost system is missing dependencies to run browsers. と出る

# 環境
M3 mac book pro

# やりたかったこと
discord.pyで作成したスクレイピングを実行するbotをデプロイしやすくするためにdockerで動かしたかった

# 作成したDockerfile
```dockerfile
# ベースイメージとしてPython 3.9を使用
FROM python:3.9-slim

# 作業ディレクトリを設定
WORKDIR /app

# 必要なファイルをコンテナにコピー
COPY requirements.txt ./

# 依存関係をインストール
RUN pip install --no-cache-dir -r requirements.txt

# Playwrightをインストール
RUN playwright install
```

# エラー内容
```bash
Host system is missing dependencies to run browsers. 
Missing libraries:                                   
     libglib-2.0.so.0                                 
     libgobject-2.0.so.0    
     libnss3.so             
     libnssutil3.so         
     libsmime3.so           
     libnspr4.so            
     libdbus-1.so.3         
     libatk-1.0.so.0        
     libatk-bridge-2.0.so.0 
     libcups.so.2           
     libgio-2.0.so.0        
     libexpat.so.1          
     libdrm.so.2            
     libxcb.so.1            
     libxkbcommon.so.0      
     libX11.so.6            
     libXcomposite.so.1     
     libXdamage.so.1        
     libXext.so.6           
     libXfixes.so.3         
     libXrandr.so.2         
     libgbm.so.1            
     libpango-1.0.so.0      
     libcairo.so.2          
     libasound.so.2         
     libatspi.so.0 
```
なんか足りてないって言ってる

# 解決策
```diff_docker
# ベースイメージとしてPython 3.9を使用
FROM python:3.9-slim

# 作業ディレクトリを設定
WORKDIR /app

# 必要なファイルをコンテナにコピー
COPY requirements.txt ./

# 依存関係をインストール
RUN pip install --no-cache-dir -r requirements.txt

# Playwrightをインストール
+ RUN playwright install
+ RUN playwright install-deps
```

これ追加するだけでよかった
両方インストールしないとダメみたい

# おまけ
Apple SiliconのMac使ってるならx86の命令セットが実行できないのが原因かも

↓参考
https://qiita.com/hisatoo/items/3b874ef7fed3c37dc47a
The AI Scientist - AIによる研究の自動化

## はじめに
Sakana AIは、オックスフォード大学とブリティッシュコロンビア大学の研究者たちと共同で、科学研究の全工程を自動化する「The AI Scientist」を開発しました。このシステムは、研究のアイデア出しから論文執筆まで、通常は研究者が行う一連の作業を自動で行います。

https://sakana.ai/ai-scientist/


## 仕組み
The AI Scientistは次の流れで研究を進めます：

1. 新しい研究アイデアを考え、Semantic Scholarで新規性を確認
2. 実験用のプログラムを作成し、実行
3. 実験結果をまとめ、図表を作成
4. 論文を執筆
5. 人間に近い精度で自動査読を実施

## 成果
- 機械学習分野で新しい研究成果を生み出しています
  - 画像生成の効率を改善する「DualScale Diffusion」
  - 文章生成の性能を向上させる「StyleFusion」
- 1つの論文を約15ドルという低コストで作成できます
- 過去の研究結果を活用して、次の研究をより良いものにできます

## 現在の課題
主な課題は以下の3点です：

1. **画像関連の制限**
   - 画像を理解する能力が不足
   - 論文の見た目の調整が難しい

2. **実装の正確性**
   - アイデアを正確にプログラムに反映できないことがある
   - 既存研究との比較が適切でない場合がある

3. **評価の精度**
   - 基本的な数値比較でも誤りが発生することがある

## 今後の可能性
The AI Scientistは以下のような可能性を持っています：

- 研究のスピードと効率の向上
- 研究コストの大幅な削減
- 新しい発見の促進

ただし、以下の点には注意が必要です：
- AIが書いた論文の増加による査読への影響
- システムの適切な使用方法の確立
- 研究の質の維持

## まとめ
The AI Scientistは、人工知能による研究の自動化という新しい可能性を示すシステムです。現時点での課題はありますが、科学技術の発展を加速させる可能性を秘めています。まだ改善の余地はありますが、私たちの未来の研究活動に大きな変革をもたらすかもしれません。
投稿 134 三項演算子 2024/11/11

本日の勉強時間　3H

三項演算子は、条件分岐を1行で書くための短い構文です。if文を使うほど複雑ではないけれど、条件によって異なる値や処理を使いたいときに便利です。

基本の構文
三項演算子の基本構文は次のとおりです。

```
条件式 ? 真のときの値 : 偽のときの値
```
投稿 133 ハッシュ 2024/11/10

本日の勉強時間　3H


Rubyのハッシュを使った文字の置き換えは、キーと値の関係を利用して簡単に実現できます。ここでは、置き換えたい文字（キー）と、それを置き換える文字（値）をハッシュで管理する方法をわかりやすく説明します。

基本の考え方
Rubyのハッシュは、キー => 値のペアでデータを保存するデータ型です。キーを使って、そのキーに対応する値に素早くアクセスすることができます。

例えば、以下のように「文字」を置き換える場合を考えます：

「A」を「4」に
「E」を「3」に
「G」を「6」に
この置き換えを、ハッシュを使って表現してみましょう。

```
コードをコピーする
replace_map = {
  "A" => "4",
  "E" => "3",
  "G" => "6"
}
```

このreplace_mapハッシュでは、キー「A」には値「4」、キー「E」には値「3」が対応しています。
Spresenseのコア間アドレス通信のポインタ型を間違えた話

SONYのマイコンであるSpresenseではMultiCoreライブラリ（MPライブラリ）を使うことでマルチコアプログラミングができます．

ただし，直接データの値をやりとりできるのは```uint_32t```のスカラー値のみなので，例えば配列変数を送りたいケースではアドレスを送受信する必要があります．

このアドレス送受信を私が実装する上で，ポインタの記述で悩んだ点があったので記事にしておきます．
間違いや不適切な点があればお知らせください．

### ドキュメントの内容
[Spresense Arduino IDEのマニュアル](https://developer.sony.com/spresense/development-guides/arduino_developer_guide_ja.html#_mp_communication)を読むと，アドレス送受信の項を読むと関数の定義は以下のようになっています．
- 送信関数：```int Send(int8_t msgid, void *msgaddr, int subid)```
- 受信関数：```int Recv(int8_t *msgid, void *msgaddr, int subid)```

```Send```関数の第二引数と```Recv```関数の第二引数がそのまま対応しているようにも見えますが，ここが以下のように書き間違えたポイントでした．

## 間違った書き方
```cpp
#include <MP.h>

#ifndef SUBCORE // maincore
double a[2] = {1.5, 2.0};
void setup() {
  MP.begin(1);
  MP.RecvTimeout(MP_RECV_BLOCKING);
  delay(300);
  MP.Send(0, &a, 1);
}

void loop() { }
#endif

#if (SUBCORE == 1)
double* b;

void setup() {
  MP.begin();
  MP.RecvTimeout(MP_RECV_BLOCKING);
  uint8_t msgid_ = 255;
  MP.Recv(&msgid_, b);
}

void loop() { 
  MPLog("%lf, %lf\n", b[0], b[1]);
  delay(1000);
  }
#endif
```
メインコアで宣言した```double a[2]```のアドレスをサブコア1に送り，```double* b```に格納して表示したいプログラムです．

サブコア1，メインコアを選択してそれぞれ書き込みます
コンパイルは問題なく通りますが，シリアルモニタの出力を見ると正しく値を受け取れていないことがわかります．
```
[Sub1] 0.000000, 0.000000
```

## 正しい書き方
```cpp
#include <MP.h>

#ifndef SUBCORE // maincore
double a[2] = {1.5, 2.0};
void setup() {
  MP.begin(1);
  MP.RecvTimeout(MP_RECV_BLOCKING);
  delay(300);
  MP.Send(0, &a, 1);
}

void loop() { }
#endif

#if (SUBCORE == 1)
double* b;

void setup() {
  MP.begin();
  MP.RecvTimeout(MP_RECV_BLOCKING);
  uint8_t msgid_ = 255;
  //MP.Recv(&msgid_, b);
  MP.Recv(&msgid_, &b);     // bそのものではなくポインタを渡すように修正
}

void loop() { 
  MPLog("%lf, %lf\n", b[0], b[1]);
  delay(1000);
  }
#endif
```
シリアルモニタの出力結果は以下の通りです．
```
[Sub1] 1.500000, 2.000000
```
正しく値を受け取れていることが分かります．

## 何がおかしいのか
最初間違えたコードでは，```Recv```関数の第二引数として```double *```型を与えているので，ポインタではあるためコンパイルは問題なく通ります．

しかし，通信がアドレスを送受信していることを考えると，```Recv```関数の引数には**アドレスを格納する変数のポインタ**を与える必要があります．

```Recv```関数の第二引数は，アドレスをどこに格納すればいいかを聞いているのです．
したがって先のプログラムでは，アドレスを格納する変数である```double* b```の場所を```&b```として教えてやる必要があります．

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803253/9cb251e8-a1ab-1d9a-6aae-2f5d8d997232.png)

```Send```では変数のアドレス（ポインタ）を渡せばいいのに対して，```Recv```ではポインタのアドレス（ポインタのポインタ）を渡すという点で，注意が必要です．

## 応用
特定のコアの特定のメッセージIDからのみアドレスを受け取る関数を作りたいときは以下のように書くことができます．
メインコア側の送信プログラムは同じなので省略しています．
```cpp
#if (SUBCORE == 1)
double* b;

void receiveWithID(uint8_t msgid_, double** pointer_){
  uint8_t msgid_receive_;
  double* addr_;
  while(1){
    MP.Recv(&msgid_receive_, &addr_);
    if (msgid_receive_==msgid_){
      *pointer_ = addr_;
      break;
    }
  }
}

void setup() {
  MP.begin();
  MP.RecvTimeout(MP_RECV_BLOCKING);
  const uint8_t REQUIRED_MSG_ID = 0;
  receiveWithID(REQUIRED_MSG_ID, &b);
}

void loop() { 
  MPLog("%lf, %lf\n", b[0], b[1]);
  delay(1000);
  }
#endif
```

## 終わりに
最初から公式のサンプルコードであるMessegeHelloを参考にすべきでした…

ここから発展して```std::vector```をコア間でやりとりしようとして失敗したときの話はこちら
【Unity】Unity6のPost-Processがシンプルすぎ！

Unity2022だと、Post-Processを使うのにパッケージをインストールしたり、Android/iOSのHDPを使う設定変更などが必要だったのですが、Unity6は以下だけになったようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850966/d5880914-4158-c4b1-3fbc-ee70779791c7.png)


以上です。

あとは、2022の時と同様、MaterialのEmissionを変えてあげればOKなようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850966/cd42a75e-31d8-adec-91dd-8ad24c221905.png)

ピッカピカヘアバンドの出来上がり！
Write SOSL Queries トレイルヘッド


https://trailhead.salesforce.com/content/learn/modules/apex_database/apex_database_sosl

+ [What is a Lead record and how do I create one?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PmRVOSA3)

+ [Invalid constructor syntax, name=value pairs can only be used for SObjects: Account](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8flhSAB)

:::note
Do you have a class named Account? If yes, I would suggest you to rename it to something else. Naming a class with any of the already existing class names(or objects) is a bad practice and will always lead to confusion and errors.
:::

+ [Invalid constructor syntax, name=value pairs can only be used for SObjects: Contact](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000musD)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f61e4733-410a-7aa8-90dc-9c7f65a39162.png)

:::note
Do you have a class named Contact? If yes, I would suggest you to rename it to something else. Naming a class with any of the already existing class names(or objects) is a bad practice and will always lead to confusion and errors.
:::
投稿 132 privateメソッド 2024/11/09

本日の勉強時間　3H

privateメソッドは、Rubyのクラスの中で定義されるメソッドの一種で、クラスの外からは直接呼び出せないメソッドです。

---
基本のイメージ
---
たとえば、クラスを会社にたとえると、privateメソッドは「社内だけで使う機密書類」みたいなものです。他のクラスや外部から直接見ることができないようにすることで、クラスの内部でだけ安全に処理を進めることができます。


---
privateメソッドの目的
---
クラスの外からアクセスされないようにする：クラスの内部でだけ使うメソッドにしておくことで、誤って外から変更されないように守ります。
クラス内部の動作を隠す：クラスが何をしているかを隠すことができ、使う側にとってシンプルなAPI（使いやすいインターフェイス）だけを公開できます。

---
privateメソッドの使い方
---
以下の例で、privateメソッドを定義する方法を見てみましょう：

```
class User
  def initialize(name)
    @name = name
  end

  def greeting
    "Hello, #{name_with_prefix}"
  end

  private

  def name_with_prefix
    "Mr./Ms. #{@name}"
  end
end

user = User.new("Alice")
puts user.greeting      #=> "Hello, Mr./Ms. Alice"
puts user.name_with_prefix  #=> エラーが出る
```

---
この例の説明
---
name_with_prefixメソッド：privateメソッドです。greetingの中でだけ使われており、外から直接呼び出せません。
greetingメソッド：publicメソッドなので、外部から呼び出せます。
もしname_with_prefixを直接使おうとすると、エラーが出てしまいます。これはprivateメソッドだからであり、あくまでUserクラスの内部で使うためのメソッドだとわかります。

---
なぜprivateメソッドを使うか？
---
クラスの設計をシンプルにし、不要なメソッドを隠すことで、エラーを防ぎ、クラスの使い方をわかりやすくします。
Salesforceで外字を使う

**使っているクラウドなどの小ネタ Advent Calendar 2024 4日目**



+ [Salesforceに外字を入力したい](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000metT)

以下では面白い実験をしています。

[WEBページでパソコンに登録していない外字を表示する](https://qiita.com/mori_toshi/items/66ec6c1f4d147bbd3cf2)

もちろん、外字を作成したパソコンからではなく、外字フォント登録していない別パソコンにsample.htmlとgaiji.woffファイルだけコピーして表示しました。（本当はどこかのWEBサーバに配置して確認すればいいんだけど、面倒だった。。。）

とあるので、Salesforce側に設定できれば表示できるかもしれません。ただ静的リソースに登録してもCSSを上書きして静的リソースを参照しないといけないので、標準画面では厳しいかもしれませんね。

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

windows以外、たとえばモバイルでは機能しないかもしれないです。

外字データを登録されている場合、EdgeやIEであれば正常表示できますが、Chromeの場合は文字化けをして表示されます。Chromeで文字化けせずに表示する為には外字ファイルをサーバーにアップロードしてPHPQUERYのCSSファイルを一部書き換える必要があるみたいですね。

[外字の表示方法について](https://cs.mono-x.com/hc/ja/articles/4870947113753-%E5%A4%96%E5%AD%97%E3%81%AE%E8%A1%A8%E7%A4%BA%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)

IEもWindowsもMicrosoftがつくってるやつですからねぇ

Microsoftの製品ではないChromeには難しいんじゃないかな
ってのが私の感想

[chromeブラウザを用いて外字フォントを正常に表示したい](https://support.google.com/chrome/thread/71350633/chrome%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6%E5%A4%96%E5%AD%97%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%82%92%E6%AD%A3%E5%B8%B8%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%9F%E3%81%84?hl=ja)

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

以下のような投稿もある

+ [外字 (EUDC)](https://x.com/ms_yuhara/status/1396695177524244484)

あまり知られていないかもしれないけど、Microsoft Edge はピュア Chromium (Google Chrome も) で使用できない Windows 外字 (EUDC) も表示できるように手を入れている。よくも悪くも互換性を大切にする (縛られている) マイクロソフト。
投稿 131 Gitの主なコマンド一覧 init・add・commit・push・pull・status・diff・log 2024/11/08

本日の勉強時間　3H

以下は、Gitの基本的なコマンドの説明です。Gitはバージョン管理ツールで、プロジェクトの変更履歴を管理したり、複数人での共同作業をスムーズに進めたりするために使われます。

1  git init
目的：新しいGitリポジトリを作成する。
使い方：
```
git init
```

これにより、現在のディレクトリがGitで管理されるようになり、.gitフォルダが作成されます。プロジェクトをGitで管理したい場合に最初に行います。


2  git add
目的：変更をステージングエリア（次のコミットに含める準備エリア）に追加する。

使い方：
```
git add filename.txt
```

これにより、filename.txtの変更が次のコミットに含まれるように準備されます。

全てのファイルを追加するには：
```
git add .
```



3   git commit
目的：ステージングエリアにある変更をリポジトリに保存する（スナップショットを作成）。
使い方：
```
git commit -m "説明をここに書く"
```


これにより、追加した変更が記録され、「何をしたか」を説明として残せます。


4  git push
目的：ローカルリポジトリの変更をリモートリポジトリに送信する（アップロード）。
使い方：
```
git push origin main
```


originはリモートリポジトリの名前、mainはブランチ名です。これにより、ローカルの変更がGitHubなどのリモートリポジトリに反映されます。


5  git pull
目的：リモートリポジトリの最新の変更をローカルリポジトリに取り込む。
使い方：
```
git pull origin main
```

これにより、リモートリポジトリの最新の内容がダウンロードされ、ローカルリポジトリに反映されます。


6  git status
目的：現在のリポジトリの状態を確認する。
使い方：
```
git status
```
これにより、現在のリポジトリの「どのファイルが変更されているか」「ステージングエリアにあるファイルはどれか」などの情報が表示されます。


7  git diff
目的：ファイルの変更内容の差分を表示する。

```
git diff
```
これにより、作業ディレクトリ内の変更内容とコミット済みの内容の違いが表示されます。

ステージングエリアと最新のコミットとの違いを確認するには：
```
git diff --staged
```



8. git log
目的：コミット履歴を表示する。
使い方：
```
git log
```
これにより、コミットの一覧と各コミットのメッセージ、作成日時、作者などが表示されます。
Git の remoteリポジトリを削除したときに error: could not delete references: cannot lock ref 'refs/remotes/origin/branch_name` となる場合の対処法

## 発生していた内容

Git リポジトリを変更するため origin を一度削除しようとした時に、以下のエラーが発生しました。

```sh
$ git remote remove origin
error: could not delete references: cannot lock ref 'refs/remotes/origin/feature/ticket-123': Unable to create '/path/to/project/.git/refs/remotes/origin/feature/ticket-123.lock': File exists.
```

## 原因

大文字と小文字の判別が Git とファイルシステムで差異があることが原因です。

例えば、下記2つのブランチが存在している場合：
- `feature/ticket-123`
- `feature/TICKET-123`

ファイルシステムでは、大文字小文字の違いを区別せずに同じファイルが存在しているとみなしています。

## 対応策

- `.git/packed-refs` を編集して、重複している ref を削除することで対応できます。

編集前:
```
a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0 refs/remotes/origin/feature/ticket-123
b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1 refs/remotes/origin/feature/TICKET-123
c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2 refs/remotes/origin/feature/ticket-456
```

編集後:
```
a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0 refs/remotes/origin/feature/ticket-123
c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2 refs/remotes/origin/feature/ticket-456
```

Gitのブランチルールを徹底する、Gitのブランチをこまめに整理する、などで防げる内容かと思います。
【個人メモ】Ruby on Rails チュートリアル 第10章

Ruby on Railsチュートリアルで学んだ内容を個人的なメモとして簡単にまとめたものです

# 個人メモ
- new_record?メソッド
DBに存在する既存のユーザーかそうでないかを論理値で区別できる
- 受け入れテスト（Acceptance Tests）
ある機能の実装が完了して受け入れ可能な状態になったかどうかを決定するテスト
- before_action
何らかの処理が実行される直前に特定のメソッドを実行する
- フレンドリーフォワーディング
ログイン前のユーザーがアクセスしようとしていたページにログイン後リダイレクトする仕組み
session[:forwarding_url]にGETリクエストが送られたURLを保存
- サンプルユーザー
  - Faker gem
    架空のユーザー名を作成するGem
  - seeds.rb
  サンプルのユーザーを記述
  rails db:seedで実行
- ページネーション
will_paginateで実現
- render @users
Railsは自動でユーザーのコレクションを列挙し、それぞれのユーザーに対して_user.html.erbパーシャルで出力を行う
- ロール
承認（authorization）においてユーザーの削除のような特権をもつセットをロール（role）と呼ぶ
- toggle!メソッド
trueとfalseを反転させる
- ユーザー削除のテスト
assert_defference、assert_no_defferenceメソッドでユーザーの数の変化をテスト