OmniAICreator/Qiita-1.07M huggingface dataset:
Tips: copilot.vimを使ってコミットメッセージも生成してもらう


## この記事は何
[copilot.vim](https://github.com/github/copilot.vim)は、vimで[GitHub Copilot](https://docs.github.com/ja/copilot/getting-started-with-github-copilot)を利用できるようにするためのプラグインです。
今回は、このcopilot.vimを用いてコミットメッセージも生成してもらえるようにする方法を紹介します。

過去書いた記事はこちらです。

https://qiita.com/getty104/items/f4c1ed9b376825b41779


## gitのcommitでvimが開く状態にする

まずはターミナルで`git config --global core.editor vim`を実行し、`git commit`コマンド実行時にVimが開かれるようにします。
なお、`git commit -m`など、ターミナル上でコミットメッセージを入力する方法ではcopilot.vimは利用できませんのでご注意ください。

## copilot.vimでコミットメッセージも自動で生成できるようにする
vimで`git commit`コマンドを実行すると、シンタックスは`gitcommit`になります。
このシンタックスに対して、copilot.vimでコミットメッセージを生成するように設定します。

`.vimrc`などに、以下の内容を記述します。

```vim:.vimrc
let g:copilot_filetypes = { 'gitcommit': v:true }
```

これで、`git commit`コマンドを実行すると、copilot.vimがコミットメッセージを生成してくれます。
[TypeScript]TypeとInterfaceはどっちを使うのがいいのか

## はじめに
型定義では主にTypeとInterfaceが使われますが、どっちを使うのがいいのか、２つの違いについて調べたので書いていきます。

## 参考
サバイバルTypeScriptを参考にしたので、よければこちらもご覧ください。
[サバイバルTypeScript](https://typescriptbook.jp/reference/object-oriented/interface/interface-vs-type-alias)

## ２つの違いについて
まずは２つの違いについて書いていきます。
### Type(型エイリアス)
・継承不可(ただし、&を使えば似たようなことができる)
・継承による上書きができる。
・同名の型定義はできない。
・MappedTypesが使えない。


### Interface
・継承可能
・継承による上書きができない。
・同名の型が定義できる。
・MappedTypesが使えない。

### 継承について
Interfaceは以下のように、型エイリアスを継承できる。
```
interface Animal {
  name: string;
}
type Creature = {
  dna: string;
};
interface Dog extends Animal, Creature {
  dogType: string;
}
```
しかし、Typeは継承ができないが、その代わりに&を使えば、似たようなものはできる。
```
type Animal = {
  name: string;
};
type Creature = {
  dna: string;
};
type Dog = Animal &
  Creature & {
    dogType: string;
  };
```

### 継承による上書きについて
 継承時のパラメータの上書きは、Interfaceはできますが、Typeはできないです。

Interfaceの継承
```
interface Animal {
  name: any;
  price: {
    yen: number;
  };
  legCount: number;
}
 
interface Dog extends Animal {
  name: string;
  price: {
    yen: number;
    dollar: number;
  };
}
 
// 最終的なDogの定義
// nameの型とpriceの中身が書き換えられ、dollerも追加されています。
interface Dog {
  name: string;
  price: {
    yen: number;
    dollar: number;
  };
  legCount: number;
}
```
Typeの継承
```
type Animal = {
  name: number;
  price: {
    yen: number;
    dollar: number;
  };
};
 
type Dog = Animal & {
  name: string;
  price: {
    yen: number;
    euro: number;
  };
};
 
// 最終的なDogの定義
type Dog = {
  name: never; // 同じ名前のパラメータを定義すると、never型になる。エラーにはならない。
  price: {
    yen: number;
    dollar: number;
    euro: number;
  };
};
```

### 同名の型定義について
Interfaceは定義できますが、Typeはできません。

Interfaceは定義できますが、指定した型が違うとエラーになってしまいます.
エラーの理由は、最初はsameNameSameTypeIsAllowedの型をnumberに指定したのに、次に再定義したときはstring型で定義しているためです。
```
interface SameNameInterfaceIsAllowed {
  myField: string;
  sameNameSameTypeIsAllowed: number;
  sameNameDifferentTypeIsNotAllowed: string;
}
 
interface SameNameInterfaceIsAllowed {
  newField: string;
  sameNameSameTypeIsAllowed: number;
}
 
interface SameNameInterfaceIsAllowed {
  sameNameDifferentTypeIsNotAllowed: number;
// エラー↓
Subsequent property declarations must have the same type.  Property 
'sameNameDifferentTypeIsNotAllowed' must be of type 'string', but here has type 'number'.
}
```
Typeは同名のものを定義した時点でエラーになります。
```
type SameNameTypeWillError = {
// エラー↓
Duplicate identifier 'SameNameTypeWillError'.
  message: string;
};
type SameNameTypeWillError = {
// エラー↓
Duplicate identifier 'SameNameTypeWillError'.
```

### MappedTypesについて
これについての説明は省きます。以下のページで詳しく説明されています。
https://typescriptbook.jp/reference/type-reuse/mapped-types

## 使い分けについて
これについては明確な正解はないそうです、、、
それぞれのメリット、デメリットを理解した上で
プロジェクトや所属するチームのルールに則るしかないようです。
個人的には、Typeのほうが安全かなと思っています。
理由としては、同名の定義ができないので、誤って同じ名前で宣言をしてしまってもエラーが出るので、バグに繋がることを防げるからです。



## 最後に
他にも記事を書いているので、良ければ見ていってください。

[基本設計について](https://qiita.com/hukuryo/items/97797a91d7e2ee0bcabc)
[Vue.jsとNode.jsでチャットアプリを作った](https://qiita.com/hukuryo/items/265c676d17fe21e75242)
[Next.js×TypeScriptでTODOアプリを作成する](https://qiita.com/hukuryo/items/ebeb26823f944f143b11)
【VB.NET 学習】メタ文字を文字列として扱う

# はじめに
業務でvb.netにより業務系アプリを開発しており、
躓いた個所を記録として残すため、ここに書きました。

# やりたかったこと
データ出力する文章中に[]が含まれていたら、[]の前に改行をいれる
（前提として、出力しようとしているデータは、文字列の先頭に[]がついた文章が結合されている）
以下のコードを記載し、文章として取得したデータ内の「[」の前に改行を入れるように正規表現を設定した。


```
Regex.Replace(Eval("文章").ToString, "(?!^)[", "<br />[")
```
実行したところ、以下の例外が発生！

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3378031/1544301e-0c25-cf17-7924-501a6ddbc602.png">

調べたところ、「[」はメタ文字というもので、「]」とセットで使用しなければいけないことがわかった。
そして、「[」を一つの文字として扱うためには、前に「¥」をつける必要があることがわかり、以下のように修正したところ、想定通りの動きになった！！
```
Regex.Replace(Eval("文章").ToString, "(?!^)[", "<br />[")
```
# おわりに
メタ文字は他にも存在しており、今回のように正規表現内に設定する時は、注意したいと思う
ESP32でナイトライダーで遊ぶ


ESP32でナイトライダーで遊ぶ


目的
GPIOのテスト

[AE-ESP32-WROOM-32-MINI]
通販コード　K-17081
発売日　2022/02/04

![o_cop618.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5ecd994a-dfad-e5cf-25ac-6d913da72edd.jpeg)

![o_cop619.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/8941f6e2-5771-6302-70ef-cc345cfc3ae7.jpeg)

![o_cop620.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b9319f1b-1946-d58f-1ab7-5c9022d1fb81.jpeg)


```c++



void setup() {

  pinMode(32, OUTPUT);
  pinMode(33, OUTPUT);
  pinMode(25, OUTPUT);
  pinMode(26, OUTPUT);
  pinMode(27, OUTPUT);
  pinMode(14, OUTPUT);
  
  pinMode(19, OUTPUT);
  pinMode(18, OUTPUT);
  pinMode( 5, OUTPUT);
  pinMode(17, OUTPUT);
  pinMode(16, OUTPUT);
  pinMode( 4, OUTPUT);

}

void loop() {
  
  digitalWrite(32, HIGH);delay(500);
  digitalWrite(32, LOW );delay(500);

  digitalWrite(33, HIGH);delay(500);
  digitalWrite(33, LOW );delay(500);

  digitalWrite(25, HIGH);delay(500);
  digitalWrite(25, LOW );delay(500);

  digitalWrite(26, HIGH);delay(500);
  digitalWrite(26, LOW );delay(500);

  digitalWrite(27, HIGH);delay(500);
  digitalWrite(27, LOW );delay(500);

  digitalWrite(14, HIGH);delay(500);
  digitalWrite(14, LOW );delay(500);


  digitalWrite(19, HIGH);delay(500);
  digitalWrite(19, LOW );delay(500);

  digitalWrite(18, HIGH);delay(500);
  digitalWrite(18, LOW );delay(500);

  digitalWrite( 5, HIGH);delay(500);
  digitalWrite( 5, LOW );delay(500);

  digitalWrite(17, HIGH);delay(500);
  digitalWrite(17, LOW );delay(500);

  digitalWrite(16, HIGH);delay(500);
  digitalWrite(16, LOW );delay(500);

  digitalWrite( 4, HIGH);delay(500);
  digitalWrite( 4, LOW );delay(500);

}




```
Windows FormsのDateTimePickerと同じような動作をするreact-datetime-picker-controlを作成

以下成果物

https://codesandbox.io/embed/hopeful-solomon-fwznst

・ArrowUp,Downで増減する。
・西暦部分で23とか打ったら2023年になる。
・ArrowRight, ArrowLeftで次のコントロールにフォーカス
・異常な数字が入ったときはonBlur時にもとの数値に補正
など

Windows FormにあったDateTimePickerと同じ動作にしてほしい、という要望に応えたものを作成。
外部ライブラリとして切り出そうかとも思うが、ロジックだけ提供する場合、デザインをどうするのか？
IDとかCSSが入ればよいのか。
あと時間選択は不要で日付だけでよい人もいるだろうし。
Max西暦min西暦とか細かく設定したい人もいるだろうし。
（いまはMySQL基準で1000-01-01から9999-01-01まで認めている）

意外とこういう単純なDateTimePickerってないのよね。
しいていえば標準の```<input type="date">```は似ている動作をするが、たとえば↑キー押しっぱなしで繰り上げができなかったりとか。いろいろ細かい部分が違う。

そんな感じでDateTimePickerを実装してみた。
Windows Formsとの細かい差異をonKeyDownとかonBlur時に処理していけば似たような動作にはできた。
【忙しい人のための】 Security Best Practices for Go Developers

あなたのGoで書かれたプロジェクトは[go.dev](https://go.dev/)が提唱するセキュリティベストプラクティスに従っていますか？
実は、GoのチームはGo開発者のためのセキュリティベストプラクティスを公開しています。

これ↓

https://go.dev/security/best-practices

一次情報を読むことをお勧めしますが、英語が苦手な人や、サクッと概要だけ見たい忙しい人も多いと思います。

そんなあなたのために、心優しい私が要約しましたので活用してください。

## ソースやバイナリに脆弱性スキャンをする

- [govulncheck](https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck)を使って脆弱性を検知する
  - [チュートリアル](https://go.dev/doc/tutorial/govulncheck-ide)
  - Govulncheck は CI/CD フローに組み込むこともできる
  - GoチームはGitHubマーケットプレイスに[govulncheckのためのGitHub Action](https://github.com/marketplace/actions/golang-govulncheck-action)を提供している
  - 他の CI/CD システムと統合できるように`-json`フラグを提供している
  - [Go extension for Visual Studio Code](https://go.dev/security/vuln/editor)を使うことでエディタから直接脆弱性スキャンができる
    - [チュートリアル](https://go.dev/doc/tutorial/govulncheck-ide)

## Goのバージョンと依存関係を最新に保つ

- Goのバージョンは最新に保つ
  - 新しいバージョンにすることで、新機能、セキュリティパッチ、そしてパフォーマンスの向上などの恩恵を得ることができる
  - 依存関係の新しいバージョンとの互換性も保証され、潜在的な統合に関する問題を回避できる
  - [Release History](https://go.dev/doc/devel/release)を確認してバージョン間でどのような変更があったかを評価するのが良い
  - マイナーバージョンの更新もした方が良い
- サードパーティーパッケージも最新状態に更新する
  - ただし、更新する前には精査とテストを
    - 新たなバグ、悪意のあるコード、非互換な変更などのリスクがある

## ファジングテストでエッジケースの脆弱性を発見する

- [Fuzzing](https://go.dev/security/fuzz/)を使う
  - ファジングテストはプログラマが見逃したり、そもそもテストが難しいようなエッジケースのテストをしてくれるため、脆弱性の検知の役にたつ

## race detectorを使って競合状態をチェックする

- 競合状態(race condition)は2つ以上の[goroutine](https://go.dev/tour/concurrency/1)が同時に同じリソースにアクセスして、そのリソースに対する書き込みがあった場合に起こる
  - ビルトインの[race detector](https://go.dev/doc/articles/race_detector)を使うことで潜在的な競合状態を検知することができる
    - (ただし、実行されないコード内の競合は検知できない)
  - ビルドやテストを実行するときに`--race`フラグを加えることで race detector を使うことができる
    - e.g. `go test -race`

## Vet を使用して怪しい構造を検査する

- Goの`vet`コマンドを使ってソースコードの静的解析をする
  - コンパイルは通るが、潜在的な問題を抱えているコードを検知することができる
    - e.g. 到達しないコード、未使用の変数、goroutine関連のよくある間違い
  - `go vet ./...`で実行できる

## golang-announce を購読してセキュリティリリースの通知を受け取る

- セキュリティ修正などは golang-announce@googlegroups.com のメーリングリストに事前に通知される
Windows環境のPowershell7で環境変数が反映されなくなった

# 結論:writing_hand:
Powershellが読み込んでいるprofileが更新されていなかった。
コンソール上で`$PROFILE`を実行し、profileの場所を確認した上で、その中の`$env:PATH`をダイレクト修正し、問題は解消した。

# 経緯:closed_book:
新PCにしてPowershell7を入れて使用していて、Docker環境を後追いで追加。
環境変数にはDockerのPathが正しく入力されており、コマンドプロンプト上でも正しくPathが拾えてる。
が、Powershell7上では再起動かけようが、コマンドプロンプトで設定しようが、Powershellから設定しようが、どうにもこうにも認識しない。
※一時的なPath設定では動いたが、結局ウィンドウを開きなおすとPathが消えている。

# やった対応:confounded:
- PC再起動
- 環境変数の位置入れ替え
- CLIからのパス設定
- Pathの再読み込み
    - <b>下記のコマンドを何も考えずコピペで入れると地獄が待っているかもなので、注意。</b>
    - `[System.Environment]::SetEnvironmentVariable('PATH' , $path , 'Machine')`
    - $path変数には既存の環境変数と追加したい環境変数が入力済み。
- 一時的なPath設定追加
    - `$ENV:Path="C:\Program Files\Docker\Docker\resources\bin"+$ENV:Path`
    - 実行したコンソールでは反応するようになるが、新規コンソールでは反映されない

# 効果があった対応:relaxed:
1. Powershell上で`$PROFILE`を実行
1. Pathにアクセス
1. $env:PATHに追加したいPathを最後尾に記入

# 考察:thinking:
Profile見て思ったのは本来Propfileに追加されるべき所が、反映されない状態になっていると思われる。
この問題に行き当たったのは`PowerShell 7.3.6`の出来事。
結局Profileに書かれているPathが最終的な環境変数として、上書きされていたが為に反応しなくなるのも当然。

# もうちょい良い対応:thinking:
今回備忘録としてQiitaに書いたが、3～4時間の出来事だし数日後にはこの苦悩もきっと忘れるだろう。
私はprofileのPathに追加したいPathをそのまま書いたが、本来あるべきはダイレクトに環境変数を見に行く仕組みにしておけば二度と困ることはないと考えている。
ps1ファイルだし多分できるはず。。。

# おまけ:gift:
苦悩のさなか良く使ったコマンド
- Winキー→env（環境変数を設定する直前のウィンドウが開く）
- Winキー→con（コントローラパネル開く）
- Winキー+Eキー（エクスプローラー開く）
共同開発　git　最初のトピックブランチの切り方

### :shamrock: 前提
:point_up:**deviceを実装します。**

・**mainブランチ**は常にリリース(デプロイ）できるような状態にある。
・**developブランチ**を統合ブランチとする
・**トピックブランチ**は全て**developブランチ**から派生させる。

_____
### :shamrock: 作業前のトピックブランチの切り方
:point_up:トピックブランチは基本的に機能、バグのようなタスクごとに切ります。

・統合ブランチ（develop）に移動
・統合ブランチである**developブランチ**から　トピックブランチ(**install-devise**)を作成する。

:::note warn
以下のように必ずトピックブランチを作成してから作業を行う

```
$ git checkout develop
$ git checkout -b install-devise
```
:::
:star:**作業を行う**
今回はdeviceを追加する
Gemfileに以下を追加
```Gemfile
gem 'devise'
```
### :shamrock: 作業後のトピックブランチの切り方
作業が終わったら以下を実行する
```
$ bundle install
$ rails g devise:install
$ rails g devise User
$ rails db:migrate
```
:star: **内容をコミットする**

・ファイルの追加/変更/削除の確認
・変更があったすべてのファイルをaddする
・ローカルリポジトリにコミットする
```
$ git status  
$ git add -A 
$ git commit -m "Add Devise" 
```
:star: **リモートリポジトリにプッシュする**
リモートのinstall-deviseブランチに変更内容を反映させる
```
$ git push origin install-devise(自分の作業ブランチ)
```
:star: Githubの **Insights>Network** からブランチやコミットを確認できる。


:star: **ここまででできたらプルリクエストを行います。**
以下にその基本的な流れを説明します。

１、あなたが変更を加えたいプロジェクトのレポジトリをフォーク（複製）します。

2,次に、そのフォークしたレポジトリに変更を加え、コミットします。

3,そして、変更を加えたブランチから元のレポジトリのブランチへのプルリクエストを作成します。

4、プルリクエストが作成されると、プロジェクトの所有者や共同作業者はその変更をレビューし、フィードバックを提供できます。

５、すべてが承認されると、プルリクエストはマージされ、あなたの変更は元のプロジェクトに統合されます。

詳しくは以下の資料を参考に
### 参考

https://phoeducation.work/entry/20210913/1631487480
Spring boot - MyBatisのDTO操作について

# java record type
jep 395から導入されているタイプですが、、java14から実装されてます。
現在21 バージョンが出ているので前から使えられるわけですが、DB操作と結合して使ってみたいとふと思いました。
それで今回のサンプルを作成して実現できました。
下記はrecordの仕様の説明などあります。

https://openjdk.org/jeps/395

# Step1
Javaとのことでよく使われるFrame Workから実装することにしました。
それでSpring boot- Mybatisを使います。
ここでMybatisのドキュメントなどから確認したところclass daoからの実装が多くて特定ができず。。。
調べたところ同じことを考えていた仲間があり、ソースリポジトリにPRなどされている状態でした。

https://github.com/mybatis/mybatis-3/issues/2840

下記のドキュメントからrecordの値設定について記載がありました。
ので、このページを参考にしてます。

https://mybatis.org/mybatis-3/sqlmap-xml.html#constructor


# 実装コードの説明
Mapper インタフェースに関しては既存通りになるので割愛します。
その他に特異事項の説明になります。

実装についてxmlで定義してます。
既存の文法と大きく差分はないですがselect, insert時を例にしました。

```xml
    <resultMap id="demoResultMap" type="com.example.mybatistutorial.bean.Sample">
        <constructor>
            <arg name="key"  javaType="String" column="skey"  />
            <arg name="memo" javaType="String" column="memo" />
        </constructor>
    </resultMap>

    <insert id="registSample" 
        keyProperty="key" 
        parameterType="com.example.mybatistutorial.bean.Sample"
        timeout="20">
        insert into sample (skey, memo)
        values (#{key},#{memo})
    </insert>

```
他の操作などもよく使われる下記の２つ。

## resultMap
select 結果を格納する定義になります。
record typeから各データを保持する際には`<constructor>`内部にパラメータに紐づく情報を記載します。


## parameterType
こちらは通常通りで大きな変更点はなさそうでした。



# ソース
下記のリポジトリにサンプルコードがあります。
よろしければ参考にお願いします。

https://github.com/dlstjq7685/springboot-mybatis-dto-sample/tree/main


# record typeについて（補足）
いつものclassの制定とは変わった書き方になります。
定義は下記になります。
getterとsetterに関しては特に持たなく、一回定義したインスタンスに関しては
内部変数の値変更などできない仕様となってます。
DDOの開発には最適なタイプかと思います。

```java
public record Sample(
    String key,
    String memo
) {
}
```
DXライブラリをNimで使う

# はじめに
[DXライブラリ](https://dxlib.xsrv.jp/)はC++用のライブラリです。
私はNim信者なので、DXライブラリをNimで使いたいと思うわけです。
でも、DXライブラリのNimバインディングはないのです。
じゃあ作っちゃおう...作りました。

# 使用方法
詳しくは https://github.com/777shuang/DxLib をご覧あれ。

`nimble install DxLib`
して
```Nim
import DxLib

# プログラムは WinMain から始まりません

if DxLib_Init() == -1: # ＤＸライブラリ初期化処理
  quit(-1) # エラーが起きたら直ちに終了

discard DrawPixel(320, 240, GetColor(255, 255, 255)) # 点を打つ

discard WaitKey() # キー入力待ち

discard DxLib_End() # ＤＸライブラリ使用の終了処理
```
と`test.nim`に書き
`nim c test`

[DXライブラリDLL版](https://github.com/777shuang/DxLib.dll/releases)(ちゃっかり私のプロジェクト)をダウンロードしてexeファイルと同じ階層に展開

# 問題点
- まだWindowsにしか対応してない
  そのうちLinuxに対応する予定。
- discardの嵐
- 必要なDLLファイルがとんでもなく多い
Windows11が入ってるノートPCにUbuntu20.04を入れる

## 構成
* ノートPC: Thinkpad X1 Carbon Gen 11
* 元々入ってるOS: Windows11
* 入れるOS: [Ubuntu 20.04 LTS](https://releases.ubuntu.com/focal/)

## 困ったこと
1. Ubuntuをインストールするときに, Windows 11とのデュアルブートを選択することができるのだが、「Bitlockerという機能でストレージがロックされてるからインストールできないよ」と言われた。
2. 何とかインストールに成功したがUbuntu側でWifiが機能していなかった（そもそも設定を開いたときにWifiの項目が表示されていなかった）。

## Bitlockerの解除
Windows OSではBitlockerというストレージに不正なアクセスができないようにするセキュリティ機能が入っているらしく、これがあるとUbuntuのインストールメディアからWindowsが管理しているストレージ領域を操作できないようになっています。これがデュアルブートができない原因だったっぽいです。
とりあえずBitlockerの解除方法を調べると幾つかやり方が出るのですが、（僕の環境では）解除できなかったり、そもそもコントロールパネルなどを開いたときに解除するためのボタンがなかったりしました。今回使用した環境でBitlockerの解除に成功したのは[このページ](https://www.pasoble.jp/tips/bitLocker-check.html)で紹介されているコマンドプロンプトから解除する方法でした。

### コマンドプロンプトでのBitlocker解除
1. Windows 11を立ち上げて管理者権限でコマンドプロンプトを実行する。
1. コマンドプロンプトで`manage-bde -status`を実行するとストレージがBitlockerによって解除されているかどうかを確認することができる。
1. Ubuntuをインストールしたいストレージ領域を確認してから
`manage-bde -off C:`のようにしてBitlockerの解除を実行する。（今回はC:ドライブのBitlockerを解除しました。ほかのドライブを解除したいときには`C:`のところを`D:`とかに変更してください。）
2. Bitlockerの解除には時間がかかるので、少し時間をおいてから再び`manage-bde -status`を実行してストレージのBitlockerの解除が完了するのを確認する。

### 参考文献
* [Bitlockerの解説](https://learn.microsoft.com/ja-jp/windows/security/operating-system-security/data-protection/bitlocker/)
* [Bitlockerの解除方法](https://www.pasoble.jp/tips/bitLocker-check.html)

## Ubuntuのインストール
Ubuntu 20.04のインストールはインストールメディアをUSBで作成して行った。インストールメディアの作成とUbuntuのインストールについては、すでに多くの記事が書かれているので、ここでは参考サイトを紹介して終わります。
注意点としてはセキュアブートをONにしていると、インストールメディアを起動できない場合があるので、事前にセキュアブートをOFFにしておきましょう。

### 参考文献
* [インストールメディアの作成とインストール](https://demura.net/education/lecture/20509.html)

## Ubuntu20.04でWifiを使えるようにする。
（僕の環境では）Ubuntuを起動したときにWindowsでは使用できていたWifiが使えず、そもそも設定を開いてもWifiの項目がなかった。この原因を探るために「ubuntu ネットワーク　使えない」みたいな感じで検索して調べるとネットワークドライバをインストールするように書いてある記事が多く見つかった。しかし、これは僕も勘違いしていたのですがネットワークドライバがインストールされていればwifiが使えるわけではなく、iwlwifiなるものが必要ということがわかりました（Intel製のワイヤレスデバイスを使用している場合）。というわけで、ここではiwlwifiのインストール方法を記述します。

### iwlwifi 
iwlwifiはIntel製のワイヤレスデバイスを使用している場合にLinux系のPCでwifiを使用するのに必要なパッケージです。まずは、ご自身のパソコンがIntel製のワイヤレスデバイスを使用しているかを調べましょう。僕はWindowsのデバイスマネージャーのネットワークアダプターの項からワイヤレスデバイスが「Intel Wifi 6E Ax211 160MHz」であることを確認しました。それで「Ax211」をubuntuから利用するためのものを探したところ「backport-iwlwifi-dkms_8324-0ubuntu3~20.04.5_all.deb」が必要であることが分かったので、それをネットワークに接続できるPCからダウンロードしてUSB経由で対象のノートPCに運んでインストールしました。以下に必要なファイルを示します。依存関係がありますので上から順番にインストールしてください。インストール方法は`sudo apt install <ファイル名>`です。

1. http://archive.ubuntu.com/ubuntu/pool/main/d/dctrl-tools/dctrl-tools_2.24-3_amd64.deb
2. http://ports.ubuntu.com/pool/main/d/dkms/dkms_2.8.1-5ubuntu2_all.deb
3. http://archive.ubuntu.com/ubuntu/pool/universe/b/backport-iwlwifi-dkms/backport-iwlwifi-dkms_8324-0ubuntu3~20.04.5_all.deb


### 参考文献
* [Ax211とUbuntuに関する記事（StackExchange）](https://askubuntu.com/questions/1398392/ubuntu-20-04-lts-driver-intel-wi-fi-6e-ax211-160mhz)


## まとめ
1. すでにWindowsがインストールされているストレージ領域にUbuntuを入れるにはBitlockerの解除が必要
1. WifiをUbuntuで使用するときには(Intel製のワイヤレスデバイスの場合)iwlwifiをインストールする必要がある。

この記事が最初の記事になります。図とかなくてわかりづらかったと思いますが、同じようなトラブルで悩まされている誰かの助けになれば幸いです。
エレキ素人が何か考える（その24）：ローパスフィルターの初歩

# ローパスフィルターを感じる
先日購入した[デジタルオシロスコープ(OpenScope MZ)](https://akizukidenshi.com/catalog/g/gM-12461/)を有効活用しようと、ローパスフィルターにトライ。

## ローパスフィルター
ローパスフィルターは、もじどおり、低周波数成分を通し、高周波成分を通さないものである。単純回路的には、抵抗とコンデンサとが下記のような配置となるもの。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/448153b9-52f4-13a3-5868-ffd0dc5362ca.png)

### 三角波
ここでは、周波数成分をソフトウェア的に変化させたかったため、マイコンを利用することにした。以前、Wio Terminalで正弦波（[MicroPythonを使ってみる（その４）＆エレキ素人が何か考える（その７）：DAコンバーター](https://qiita.com/infinite1oop/items/180248ddd0a9cbf094ba?utm_campaign=email&utm_content=link&utm_medium=email&utm_source=public_comment#comment-14c2f479b6604add7526)） を作ったとき、高周波成分を作るのが、性能的に厳しかったため、今回は三角波を使うことにした。

### MicroPythonソースコード
Wio TerminalのDAコンバーターの精度は10bit(0-4095)であるため、下記のような三角波を生成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/7fec17d2-4658-df6f-d948-aef106c47889.png)
この繰り返し時間を変化させることにより、周波数成分を制御する。

```python
import time
import math
from machine import DAC, Pin

def write_data(f):
  for i in range(num):
    dac.write(ary[i])
    time.sleep_us(int(1000000/(num*f)))

def write_data_without_sleep():
  for i in range(num):
    dac.write(ary[i])

num = 4
ary = list(range(num))
ary[0] = 2048
ary[1] = 4095
ary[2] = 2048
ary[3] = 0
dac = DAC(Pin(11))

f1 = 50
f2 = 100
f3 = 250
f4 = 500

while 1:
  for i in range(5):
    write_data(f1)
  for i in range(10):
    write_data(f2)
  for i in range(25):
    write_data(f3)
  for i in range(50):
    write_data(f4)
```
「f1 = 50」　は、三角波としての50Hzを意識したもの（もちろん、正弦波ではないので、50Hz以外の周波数成分は多数ある）。

### 結果
![LPF1-1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/23c121bf-0bcc-8b6e-cc40-07e636ff4e0e.png)
![LPF1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/0bca4d7c-01f2-8bc6-1edf-4d77aefa4e37.png)
青が入力波形、オレンジがローパスフィルター通過後の波形である。低周波数時、オレンジの振幅はそれなりにあるが、高周波数時には、その振幅は小さくなっており、ローパスフィルターの機能を確認することができた。

## ハイパスフィルター（失敗）
同じ要領でハイパスフィルターにトライ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/119cbcf7-0e76-186e-96be-b63b29f6c439.png)
だが、波形は下記のようになり、入力された低周波数波形（青）に対し、フィルター後の波形（オレンジ）でも、高周波の方が値が小さくなっている。
![HPF1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/0581ddda-3cff-7fea-f2de-43cb4a7ff384.png)
抵抗やコンデンサの値を変化させたが、ハイパスフィルターらしい波形を見ることはできずじまい。三角波が原因なのか、それとも、それ以外のところに問題があるのか、小生のレベルでは追いつかず（残念ながら）。

EOF
頭がビニールハウスでも分かれ！Figuraでアイテム・防具を表示させる方法

さて、この記事はfiguraでカスタムモデルにアイテムを持たせたり、防具を着せたりするための記事である。

さて、あなたがFiguraのモデルを作ったときに
vanilla_model.ALL.setVisible(false)
というScriptを書かなかっただろうか。これを書かなければあなたの元々のスキンとあなたの作ったfiguraモデルが重なり合った状態になってしまっていただろう。これはvannila_model.ALL、すなわち元々のスキンのすべてを完全に非表示にするコードである。そして、防具やアイテムなどはその"すべて"に含まれている。すなわち、プレイヤーだけを非表示にしてあげれば良いのである。これを
vanilla_model.PLAYER.setVisible(false)
というふうに書き換えてあげれば、あなたのモデルはアイテムを持ち、防具を着れるようになるはずだ。しかし、である。スティーブの形から大きく逸脱したものは防具やアイテムの位置がずれてしまっているだろう。防具に関しては諦めて非表示にし、（vanilla_model.ARMOR.setVisible(false)を追記することで可能である）
https://github.com/Moonlight-MC/Figura/wiki/Blockbench-Keywords
こちらの公式wikiを参照してアイテム、オウムなどの位置を表す特定の名前のフォルダー（右手に持ったアイテムであればRIGHT_HELD_ITEMなど）を腕の子オブジェクトとして追加してあげれば動作するはずだ。（未検証）
Ubuntuで「Ruby on Railsチュートリアル」の実行環境を作る

# はじめに
Ubuntuに「[Ruby on Railsチュートリアル](https://railstutorial.jp/ "Ruby on Railsチュートリアル")」の実行環境を整えます。
普通にクラウドで提供されてるものを使ってもいいのですがやはり使い慣れた環境で学習したいためこの記事を作成しました。

# 実行環境
OS：Ubuntu22.04.2 LTS
Ruby on Railsチュートリアル：第７版
Ruby：3.1.2(Ruby on Railsチュートリアルに合わせてます)
Rails：7.0.4(Ruby on Railsチュートリアルに合わせてます)
Bundler：2.3.14(Ruby on Railsチュートリアルに合わせてます)

# インストール
## 必要なツールをダウンロード
参考：[(Ubuntu)Ruby on rails 6.0 環境構築](https://qiita.com/Gushi_maru/items/f3b5cc43e135e678085f)
ほぼ上の記事通りです。
バージョンとインストールするものが若干異なるだけです。

```
sudo apt update -y
sudo apt upgrade -y
sudo apt install build-essential -y
sudo apt install -y libssl-dev libreadline-dev zlib1g-dev
```

## Ruby、Railsをインストール

### Ruby

:::note alert
最新版のRuby on Railsチュートリアルのバージョンに合わせてください
:::

```shell
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
exec $SHELL -l
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
#Ruby on Railsチュートリアルにバージョンを合わせます
rbenv install 3.1.2
rbenv global 3.1.2
```

### Railsをインストール
```shell
gem install rails -v "7.0.4"
#動作確認
rails -v
```
### bundlerをインストール
```shell
gem install bundler -v 2.3.14
```

### SQliteをインストール
```shell
sudo apt install libsqlite3-dev
```

### ~~Node.jsをインストール~~
2023.7.15 追記
「Ruby on Railsチュートリアル第7版」ではNode.jsをインストールしなくても使えるようです！！
第6版よりもよりかんたんに環境が構築できるようになってる...！
ご指摘してくださった安川要平(@yasulab )様ありがとうございました！
```shell
sudo apt install -y nodejs npm
sudo npm install n -g
sudo n stable
sudo apt purge -y nodejs npm
exec $SHELL -l
sudo npm install yarn -g
node -v
```

# 最後に
これで「Ruby on Railsチュートリアル」を実行する環境が整いました。
あとは頑張って完走するだけです！！

### 余談（完璧にいらない）
筆者はもともと一個前のバージョンの「Ruby on Railsチュートリアル第6版」をしていたが第12章あたりで挫折してしまいました。
これが中2のときだったので「今なら行けるやろ！！（現在高1）」とこれからまた頑張るつもりです（）
正直中2のときの印象はすごく難しかったのでなんとか打破できればなと...
幸いLinuxが好きでずっと使ってたお陰でコマンド操作は余裕だったのは唯一の救い...
AzureAppServiceでテストツールを使う際のドメイン検証方法

# AzureAppServiceでテストツールを使う際のドメイン検証方法

AzureAppService（Linux）を使用しているアプリに対して、
セキュリティ診断サービスなどのテストツールを使用しようと思いましたが、何やらドメイン検証とやらが必要だそうです。

## ドメイン検証方法

AzureAppServiceに限らず、テストツールを使用する場合、自分が保有しているサーバー以外にセキュリティテストや負荷テストを行うことはできません。
（他人が保有するサーバーの情報を入手したり、負荷テストにより高負荷をかけたりできてしまうため）
そのため、ドメイン検証が必要になります。
ドメイン検証には、DNSによる確認とファイルアップロードによる確認の2種類があります。
今回は外部のセキュリティ診断ツールを使用するため、ファイルアップロードを行うことにしました。

## ファイルアップロードによる確認
ファイルアップロードによる確認は、指定されたファイルをSCPやFTPで検証を行いたいWebサーバーのroot直下にアップロードすることにより、ドメインの所有権を確認します。
今回検証を行いたいAppServiceのLinuxサーバーの場合は、wwwroot直下（もしくはアプリ上でroot直下のアクセス先を指定している場合はそのフォルダ）にアップロードする必要があります。

## VScodeのデプロイを使用したファイルアップロード
SCPやFTPでファイルをアップロードするのが一般的ですが、面倒なので検証用のファイルを含めたアプリをそのままデプロイすることにしました。
VScodeでAzureAppServiceにデプロイを行うには、AzureTools等の拡張機能を使うのが簡単です。
デプロイを行うディレクトリの直下に検証用ファイルをコピーした状態でデプロイを行うことで、
対象のサーバーに検証用ファイルをセットすることができます。
tailwindのflexの使い方について

# はじめに
tailwindのflexの使い方についてまとめました。

# flexを指定しない場合
div要素が縦積みされます。

```index.html
<div class="">
  <div class="bg-cyan-300">Item1</div>
  <div class="bg-gray-500">Item2</div>
  <div class="bg-lime-400">Item3</div>
  <div class="bg-purple-300">Item4</div>
</div>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657075/b3c0046d-57cb-f7e2-4e59-c3e9d10422c6.png)

# flexを指定した場合
div要素が横並びになりました。

```index.html
<div class="flex">
  <div class="bg-cyan-300">Item1</div>
  <div class="bg-gray-500">Item2</div>
  <div class="bg-lime-400">Item3</div>
  <div class="bg-purple-300">Item4</div>
</div>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657075/c5e8cfed-b328-f02a-af0d-f8a648804a32.png)

# 子要素にflex-autoを指定した場合
Item1のみ、親要素の幅いっぱいに広がります。

```index.html
<div class="flex">
  <div class="bg-cyan-300 flex-auto">Item1</div>
  <div class="bg-gray-500">Item2</div>
  <div class="bg-lime-400">Item3</div>
  <div class="bg-purple-300">Item4</div>
</div>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657075/3e7d8b01-6700-c200-782b-45d5c2f4297a.png)

# 子要素にw-fullを指定した場合
Item3が、親要素の幅いっぱいに広がります。

```index.html
<div class="flex">
  <div class="bg-cyan-300 flex-auto">Item1</div>
  <div class="bg-gray-500">Item2</div>
  <div class="bg-lime-400　w-full">Item3</div>
  <div class="bg-purple-300">Item4</div>
</div>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657075/0f193bff-6055-1bd6-f696-79bdf6bc1e9a.png)



# 親要素にflex-wrapを指定した場合
Item3は幅いっぱいなので2行目にズレます。Item1は親要素いっぱいまで広がります。

```index.html
<div class="flex flex-wrap">
  <div class="bg-cyan-300 flex-auto">Item1</div>
  <div class="bg-gray-500">Item2</div>
  <div class="bg-lime-400 w-full">Item3</div>
  <div class="bg-purple-300">Item4</div>
</div>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657075/fc252105-0cac-215f-9a85-75aa49efe368.png)
/bin/sh: webpack: command not found

Swagger UIを使おうとしたら以下のエラーがでた

```sh
$ git clone git@github.com:swagger-api/swagger-ui.git
$ cd swagger-ui
$ yarn dev
```

```sh
/bin/sh: webpack: command not found
error Command failed with exit code 127.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
```

# 解決

これで解決

```
$ yarn global add webpack
$ yarn global add webpack-cli
$ yarn dev # 1回目でエラーが出る場合があるのでもう1回打つ
```

http://localhost:3200/ でSwagger UIが閲覧できる
Auth0でサインアップ時にユーザーネームを登録する

## 新規登録する時にユーザーネームを保存できるようにする設定

1. 左メニューのAuthentication下にあるDatabaseへ進む
2. 自分の使っているデータベースを選ぶ
3. Settingsを選択
4. Requires Usernameをオンにする  

![スクリーンショット 2023-07-15 7.12.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42885/9c7f1ea9-5fb4-0356-1ec6-2302289e7415.png)
[RecoMemo]メモ書きを管理するアプリ作成

渋谷でモバイルアプリエンジニアやってます。
たまに個人アプリを作りたくなるので、本アプリをリリースしました。
メモ書きを日付感覚でできるアプリです。

Appsotoreにて公開中です。
https://apps.apple.com/us/app/recomemo-write-memo-record/id1668992797?ign-itscg=30200&ign-itsct=apps_box_link
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803173/98d11043-d420-8918-4326-d7c484a3e807.png" width=30%>


## 内容
毎日の記録を手書きできるアプリです。
sheetは5枚までで、書き込み保存ができる簡単なものになっています。
30日間分の記録を管理することができます。

## 制作期間:
2日

## 言語&ライブラリ
swiftUI
Realm
PencilKit

## インフラ
今の所api等はなし

以上です、ご視聴ありがとうございました。お仕事のお話とかもお待ちしてます(副業等)
シンボリック作成

# 概要
　あるパス上にフォルダの実体が無いのに
　まるでそこに実体があるように見せる事が出来る。

#用途
　・Cドライブ上のサイズの大きいサイズのフォルダをDドライブに移して、
　　今まで通りアプリを利用したい
　・Cドライブ上のフォルダをGoogleドライブに移動させて共有する事で
　　別の端末から同じアプリを起動した時も同じ内容を見せたい
　⇒移動するだけだとアプリが参照エラー等を起こすが
　　シンボリックリンクを作成すれば、そのようなエラーが起きない。

# 手順
※前提
　「がんすけ2」というアプリの参照ファイルが含まれるフォルダ
　C:\Users\xxx\AppData\Roaming\Gansuke2
　をGoogleドライブに移動させて、今まで通り起動したい場合
1. 上記Gansuke2フォルダを切り取って、移動先パスへ移動させる。
　※移動なので、元の場所に「Gansuke2」は残らないようにする。
　　　C:\Users\xxx\AppData\Roaming\Gansuke2
　　　C:\Users\xxx\Google ドライブ\
　　　　↓
　　　C:\Users\xxx\AppData\Roaming\
　　　C:\Users\xxx\Google ドライブ\Gansuke2
2. コマンドプロンプトを管理者権限で起動
3. `cd C:\Users\xxx\AppData\Roaming`でリンク元へ移動する
　※この手順はSkipしても可能。
　　手順4での(リンク元パス)の入力を簡単にする為に実行してるだけ。
4. `mklink (リンク元のパス) (リンク先のパス)`の書式で実行
　例　`mklink /d Gansuke2 "C:\Users\xxx\Google ドライブ\Gansuke2"
Gansuke2`
　⇒C:\Users\xxx\AppData\Roaming
　　に「Gansuke2」という名前のフォルダに矢印が付いたアイコンの
　　シンボリックリンクが作成される。これ以降、アプリによる
　　C:\Users\xxx\AppData\Roaming\Gansuke2
　　へのアクセスは
　　C:\Users\xxx\Google ドライブ\Gansuke2
　　にアクセスする動作となる。

# 注意点
　・パスにスペースが含まれる
　　(パス内に含まれるフォルダ名がスペースを含んでいたりするような)
　　場合は、前述の様にパス全体を""で括る必要がある。
　　そうしないとシンボリックリンク作成のコマンド実行時に
　「コマンドの構文が誤っています。」と出てしまう。
Trying out Terraform to create AWS (A short blog) Part 1

Before trying out terraform I made sure I had the following on my machine
・AWS cli
　・do `aws configure` and set the ACCESS KEY AND SECRET KEY
・Install Terraform using the official documentation.

create main.tf file with the code below.

```
provider "aws" {
    region = "ap-northeast-1"
}

resource "aws_vpc" "myvpc" {
    cidr_block = "10.0.0.0/16"
}
```

now run the below command in the same directory as the main.tf

```
terraform apply
```

result

it should give you a meaningful logs that contains the ID of the resource ( on this case the id of the vpc we created )

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512866/d7ec4f9b-03e8-49e1-0f48-78b654235235.png)

check the resource on AWS console

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512866/d18c2cfb-7cda-1058-c4f9-e89656cdd9db.png)

after this I recommend deleting the resource we created.

we need to run

```
terraform destroy
```

type 'yes' on the confirmation.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512866/83241ec8-470f-1367-ea8b-fdfc66b73f8a.png)

and now your vpc list should only contain the default one.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512866/8ae92f46-ecdd-2028-d4d3-97aafc07f1d6.png)
APIが返すデータの順序が毎回一定ではないという問題についてです。

同僚からのフィードバックで、次の問題が報告されました：APIのレスポンスデータは、ソートするたびに順序が一定しないようです。しかし、このAPIのSQLクエリには実際にソートフィールドが指定されています。コードの調査により、問題の原因が特定されました。原因は次のとおりです：

> MySQLでは、ソートフィールドにNULL値が含まれる場合、ソート結果の順序が不確定な場合があります。つまり、順序が乱れる可能性があります。
これは、SQLの標準では、NULL値は未知の値と見なされ、大小比較ができないためです。そのため、MySQLはソートのプロセス中にNULL値と他の非NULL値の大小関係を確定できず、正確なソートができなくなります。
この問題を解決するために、MySQLはASCおよびDESCの2つのソートモードを提供しています。デフォルトでは、ソートフィールドにNULL値が含まれる場合、MySQLはNULL値を最小値と見なし、それをすべての非NULL値の前に配置します。DESCでソートする場合、NULL値は最大値と見なされ、すべての非NULL値の後に配置されます。カスタムルールでソートする場合は、NULL値を他の値に置換するためにIFNULLまたはCOALESCE関数を使用し、それからソート操作を行うことができます。

したがって、2つの解決策があります：

1. IFNULLまたはCOALESCE関数を使用してNULL値を他の値に置換し、それからソート操作を行うことができます。
2. 複数のソートフィールドを指定することもできます。
Redisのクラスターモードで、mgetコマンドを使用してキーの一括値を取得する際の問題の解決策について説明します

Redisのクラスターモードにおいて、mgetコマンドを使用して複数のキーに対応する値のセットを一括で取得する必要がありましたが、値の取得時に次のエラーが発生しました："ERR CROSSSLOT Keys in request don't hash to the same slot"。これを日本語に翻訳すると、「リクエスト内のこれらのキーは同じスロットにハッシュされていません」という意味です。つまり、Redisのクラスターモードでは、ハッシュ分割が行われるため、データを挿入するたびにRedisは自動的に各データが属するスロットを計算します。また、各スロットが異なるノードに存在する可能性もあるため、mgetを使用する際には、このバッチのキーが異なるノードに存在する場合に値を取得できなくなります。

Redisがデータのスロット位置を計算するアルゴリズムに基づいて考えると（[原文はこちら](https://juejin.cn/post/7045122646958161950)）、次のようなコードが使われます。

```java
unsigned int HASH_SLOT(char *key, int keylen) {
    int s, e; /* start-end indexes of { and } */

    /* Search the first occurrence of '{'. */
    for (s = 0; s < keylen; s++)
        if (key[s] == '{') break;

    /* No '{' ? Hash the whole key. This is the base case. */
    if (s == keylen) return crc16(key,keylen) & 16383;

    /* '{' found? Check if we have the corresponding '}'. */
    for (e = s+1; e < keylen; e++)
        if (key[e] == '}') break;

    /* No '}' or nothing between {} ? Hash the whole key. */
    if (e == keylen || e == s+1) return crc16(key,keylen) & 16383;

    /* If we are here there is both a { and a } on its right. Hash
     * what is in the middle between { and }. */
    return crc16(key+s+1,e-s-1) & 16383;
}
```

簡単に言うと、もしキーに{}の文字が含まれている場合、{}に含まれる文字だけがハッシュ計算に使用されます（"{abc}.123"の場合、abcだけがハッシュ計算に使用されます）。また、最初の{}の組に含まれる内容だけがハッシュ計算に使用されるため、Redisクラスター内の特定のグループのデータを同じノードに格納する場合は、同じキーのプレフィックスを指定するだけで問題が解決します。例えば、"{abc}.123"、"{abc}.456"、"{abc}.789"はすべて同じノードに保存されるため、これによってmgetを使用して値を一括取得する際の問題が解決されます。
初めてXlibを使ったときに参考になったページまとめ

# はじめに
C言語でXlibを使ってグラフィックアプリを作る際に参考にしたページをまとめた。(2023/7)


# 一覧
- #### Xウィンドウ概論

https://www.ikueikan.ac.jp/biblion/1995/JJ/JJ.html

基礎的な内容を分かりやすく説明してある。サンプルコードもついている。

- #### The Xlib Manual

https://tronche.com/gui/x/xlib/

どこかのおっさんが作ってくれたマニュアル。全部読むのは無理だと思うので、引数や関数の使い方を調べる事典として使うとよい。

- #### Xlib - C Language X Interface

https://xjman.dsl.gr.jp/X11R6/X11/

上のマニュアルの日本語訳。結構何言ってるか分からない部分もあるので原文を読んだ方が分かりやすいかも。

- #### Linux Japan 連載記事

https://ayapin-film.sakura.ne.jp/LJ/lj.html

第3回にアニメーションを描画する方法が掲載されている。

- #### Xlib-demo

https://github.com/QMonkey/Xlib-demo/tree/master/src

サンプルプログラム。



# あとがき
某トヨタ帝国大学ではこの令和の時代にXlibを使ってアプリケーションを作成する授業がある(もちろん基礎的なことは重要なので批判したいわけではない)。古いライブラリなので日本語の分かりやすいページなどが少なかったため、参考になったものをまとめた。他にも参考になるページがあればコメントに記載してほしい。
DockerでのLaravel環境構築時のCould not deleteエラー解決法

# はじめに

こんにちは。今回はDockerを使用してLaravelの開発環境を構築する際に遭遇したエラーとその解決策についてお話します。
`create-project`を実行した後に発生する`[RuntimeException] Could not delete ディレクトリ`というものです。
このエラーが発生して、Laravelのインストールが正常に完了せずドツボにはまっていました。

# 結論

`composer config --global process-timeout (任意の秒数)`を実行してタイムアウト時間を延ばす。

# 記事の対象者

Laravelのインストール中に`could not delete`エラーに直面して困っている方。

# コンテナの中身

phpコンテナとnginxコンテナのみのシンプルな構成です。

# エラー解消の詳細

まず、`Could not delete`エラーについて調べてみましたが、メモリーやネットワーク、権限の問題の可能性があるようです。
しかしながらこれらには問題がなさそうでしばらく立ち往生です。

と、ここで以下の記事を見つけました。

[composer で Could not delete エラーで先に進めなくなった場合の対処法](https://qiita.com/waterada/items/b47daf501e5fe1a70743)

この記事では`composer install`の場合でしたが、私の場合でも適用できるかもしれないと思い試してみました。

とりあえず、`composer clear-cache`を実行。

次に`composer config --global process-timeout 600`を実行してタイムアウト時間を延ばしました。

すると、あっけなくインストール完了しました。

# まとめ

`create-project`の際に同様のエラーが出た場合は、以下の手順を試してみてください。

1. `composer clear-cache`を実行してキャッシュをクリアする

2. `composer config --global process-timeout (長めの時間)`を実行してタイムアウト時間を延ばす

3. 再度`create-project`を実行する

何か誤りがある場合はご指摘いただければ嬉しいです。
Qiita × Fast DOCTOR Health Tech Hackathon: ChatGPTを活用した医療コミュニケーションツールの開発

# はじめに
　こんにちは、皆さん。今回は、私が参加した[「Qiita × Fast DOCTOR Health Tech Hackathon」](https://corp.qiita.com/releases/2023/04/qiita-fastdoctor-health-tech-hackathon/)で制作したプロダクトについて詳しくシェアしたいと思います。

# 課題認識
　私たちが取り組んだのは、医療現場のコミュニケーション課題です。現在の医療現場では、患者の状態を把握するために、異職種間でのコミュニケーションが不可欠です。しかし、患者や家族との会話など、共有されていない情報の中に、患者の状態変化など有用な情報が隠れている可能性があります。この問題を解決するためには、適切なツールが必要です。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356936/7540f32b-e4a0-a55a-c49c-f959816abaaf.png)
# プロジェクトの概要
　私たちは、この課題を解決するために、ChatGPTを用いた新たなウェブサービスを開発しました。このサービスにより、医療従事者間、そして患者との円滑なコミュニケーションが可能になります。具体的には、患者や家族から得られるデータ（感情面、食事、排便、今日起こった特別なことなど）をChatGPTに入力し、それを情報として共有することで、様々な業種の医療従事者が患者の状態を把握することができます。
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356936/6badfacb-bab5-6822-02df-137cef9dbad7.png)

# 開発工程
1. 患者情報の入力画面の開発
　まず、患者や家族が情報を簡単に入力できるWebアプリケーション画面を開発しました。この画面では、患者の感情状態、食事状況、排便状況、その日に起こった特別な出来事などを記録できます。
![スクリーンショット 2023-07-02 13.44.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356936/fd747346-0802-d014-2d28-8e27fa0b126f.png)

2. 情報の保存と整理
　入力された情報は、データベース(DB)に保存されます。その後、関連文書を取得するためのLIamaIndexに送られ、関連する情報を抽出します。この抽出された情報は再びDBに保存され、TXT形式で保存されます。
![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356936/626bdb9b-a62d-86f1-db5a-392ebc7700c0.png)

3. 情報の取得と表示
　患者の情報を聴くWebアプリケーション画面でプロンプト入力を行い、LIamaIndexとOpenAI(ChatGPT)を経由して情報を取得します。取得した情報は回答出力としてWebアプリケーション画面に表示されます。
![スクリーンショット 2023-07-02 13.45.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356936/ce0f1d6c-a36f-48bf-6780-6d90687e6c3b.png)

# 期待する社会的インパクト
　このアプリの導入により、患者の状態の把握や医療従事者間のコミュニケーションが円滑になり、医療現場における社会的影響を可能にします。具体的な社会影響としては、業務の効率化、潜在的情報の抽出、早期の状態変化に気づくことが挙げられます。

# ハッカソンでの振り返り
　このハッカソンでは、チームで一つの課題に取り組む経験を通じて、多くの学びがありました。特に、異なるバックグラウンドを持つメンバーと協力してプロダクトを作り上げる過程では、新たな視点やアイデアを得ることができました。また、限られた時間の中で効率的に作業を進めるためのプロジェクト管理の重要性も再認識しました。

　今後もハッカソンに参加し、新たな技術や知識を学びながら、社会的な問題解決に　取り組んでいきたいと思います。そして、その経験を皆さんと共有することで、より良い技術コミュニティの形成に貢献できればと思います。

# おわりに
　以上が私のハッカソンでの成果物とその経験についてのシェアです。この記事が皆さんの何かの参考になれば幸いです。
コールバック関数ってなんなのーー

# はじめに
Reactを学習中にコールバック関数なるものがでてきた。「なんだっけ？」状態なので、ちょっと書いていこうかと思います。

コールバック関数を以前勉強していたのですが、触らず１年以上立っているような気がするので、復習がてら調べていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3086650/75ed4320-f559-2c3e-6736-ce0597bbe5cd.png)

# コールバック関数とは
>コールバック関数とは、コンピュータプログラム中で、ある関数を呼び出す際に引数などとして引き渡される別の関数のこと。呼び出し側の用意した関数を、呼び出し先のコードが「呼び出し返す」（callback）ように実行される。

https://e-words.jp/w/%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E9%96%A2%E6%95%B0.html

僕「つまりどういうこと・・・？高階関数も似たような感じじゃなかったけ？」

図で理解してみようと思う。

**通常の関数の場合**
![無題のプレゼンテーション (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3086650/f049d9e0-37a8-4a73-7953-ee741d6b5691.png)

**コールバック関数の場合**
![無題のプレゼンテーション (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3086650/5ac848f2-695f-8c68-25e3-aa52f03c39c0.png)


つまり
**「引数として渡された関数が関数の中で動作する」**
ということ。


そしてどうやら高階関数というのは、コールバック関数を受け取る関数ということ。

僕「気づかないうちに使ってたな・・・」

![無題のプレゼンテーション (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3086650/6234ecd2-d6c8-3f96-5e4f-50d72aaa5793.png)

# ちなみに・・・
ちなみに本を見てる途中で出てきた以下の処理でコールバック関数がでてきたので、その復習でした。
```react
//Helloはクリックするとアラートを出すわんわんおおぉ！テキスト返す
const Hello = () => {
    //<div onClick={onClick}>をクリックするとアラートの処理が動く
    const onClick = () => {
        //アラートを出す
        alert("わんわんおおぉ！わんわんおおぉ！")
    } 

    return (
        //divのonClickにクリック時のコールバック関数を返す
        <div onClick={onClick}>
            "わんわんおおぉ！"
        </div>
    )
}
export default Hello;


```


# 参考にしたサイト
https://wa3.i-3-i.info/word12295.html
https://tcd-theme.com/2022/04/javascript-callback-function.html
ROS2でメッセージを自作する

# はじめに

パブリッシュ・サブスクライブはROS・ROS2の基本である。ROS2ではメッセージを自作することができる。CMakeで作成するが、Pythonから呼び出せる。今回は0.5秒ごとに整数を1ずつ増加させて、トピック上でやり取りする。

# メッセージのパッケージを作成する

```bash
~/ros2_ws/src$ ros2 pkg create my_interfaces --build-type ament_cmake
```

`msg`ディレクトリを作成し、メッセージを定義する。[ここに使用できる型が列挙してある](https://docs.ros.org/en/iron/Concepts/Basic/About-Interfaces.html)

```txt: my_interfaces/msg/Num.msg
int64 num
```

以下を追記する。

```CMakeList: my_interfaces/CMakeList.txt
find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
  "msg/Num.msg"
)
```

```xml: my_interfaces/package.xml
<buildtool_depend>rosidl_default_generators</buildtool_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
```

ビルドする。

```bash
~/ros2_ws$ colcon build --packages-select my_interfaces
~/ros2_ws$ . install/local_setup.bash
```

# 呼び出すパッケージを作成する

```bash
~/ros2_ws/src$ ros2 pkg create mypkg --build-type ament_python
```

以下のようにノードを作成する。

```python: mypkg/talker.py
import rclpy
from rclpy.node import Node
from my_interfaces.msg import Num


class TalkerNode(Node):

    def __init__(self):
        super().__init__('talker')
        self.pub_ = self.create_publisher(Num, 'countup', 10)
        self.create_timer(0.5, self.cb)
        self.i_ = 0

    def cb(self):
        msg = Num()
        msg.num = self.i_
        self.pub_.publish(msg)
        self.get_logger().info('Publishing: %d' % msg.num)
        self.i_ += 1


def main(args=None):
    rclpy.init(args=args)
    talker_node = TalkerNode()
    rclpy.spin(talker_node)
    talker_node.destroy_node() # ノードを終了
    rclpy.shutdown() # ROS2 クライアント ライブラリを終了


if __name__ == '__main__':
    main()
```

```python: mypkg/listener.py
import rclpy
from rclpy.node import Node
from my_interfaces.msg import Num


class ListenerNode(Node):

    def __init__(self):
        super().__init__('listener')
        self.create_subscription(Num, 'countup', self.cb, 10)

    def cb(self, msg):
        self.get_logger().info('I heard: %d' % msg.num)


def main(args=None):
    rclpy.init(args=args)
    listener_node = ListenerNode()
    rclpy.spin(listener_node)
    lisetner_node.destroy_node() # ノードを終了
    rclpy.shutdown() # ROS2 クライアント ライブラリを終了


if __name__ == '__main__':
    main()
```

以下を追記する。

```xml: mypkg/package.xml 
<exec_depend>rclpy</exec_depend>
<exec_depend>my_interfaces</exec_depend>
```

``` python: mypkg/setup.py
entry_points={
    'console_scripts': [
        'talker = mypkg.talker:main',
        'listener = mypkg.listener:main',
}
```

ビルドする

```bash
~/ros2_ws$ colcon build --packages-select mypkg
~/ros2_ws$ . install/local_setup.bash
```

# 実行する

```bash
$ ros2 run mypkg talker
```

```bash
$ ros2 run mypkg listener
```


# 参考

https://qiita.com/NeK/items/26751b8ed12976ff977d

https://docs.ros.org/en/iron/Tutorials/Beginner-Client-Libraries/Custom-ROS2-Interfaces.html
レガシーなInternet ExplorerからCheerpX for Flashへの乗り換えによるアクセシビリティの向上

![My-project-1-3-1024x512.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486144/f0b57935-d727-99c0-8a86-681d452f37cb.jpeg)

インターネットの黎明期、Adobe Flashはウェブアプリケーションやコンテンツの扱いに革命をもたらしたパイオニアでした。しかし、技術の進歩に伴い、FlashとNPAPIプラグイン技術の両方が時代遅れとなり、セキュリティリスクに対して脆弱になっています。

このブログでは、レガシーなInternet ExplorerでFlashを使いながら組織全体の生産性と成果を最大化させようとする状況から、[CheerpX　for　Flash](https://new.leaningtech.com/cheerpx-for-flash/)への移行の重要性について説明します。

# Flashの終焉
Adobe Flashは、かつてインタラクティブなウェブコンテンツの代表的なテクノロジーとして賞賛されてきましたが、過去10年間で徐々に衰退してきました。HTML5が台頭し、その優れた機能とセキュリティー・モデルによって、Flashは数々の脆弱性と互換性の問題からお荷物となってしまいました。ここ数年で、[主要なウェブブラウザはFlashのサポートを打ち切り](https://new.leaningtech.com/flash-on-windows-post-2021/)（プラグイン全般のサポートも打ち切り）、事実上時代遅れとなりました。

同様に、かつて主流だったInternet Explorerも、Google Chrome、Mozilla Firefox、Microsoft Edgeなど、より先進的な代替ブラウザの前に足場を失っています。[Internet Explorerは、互換性の問題、セキュリティ上の欠陥、最新のウェブ標準をサポートしていないことなどから](https://new.leaningtech.com/the-demise-of-internet-explorer-and-what-it-means-for-your-java-applications-and-applets/)、時代遅れとなり、今や組織にとって非推奨の選択肢となっています。

# Flash用CheerpXの登場
2020年にリリースされるCheerpX for Flashは、レガシーなInternet ExplorerやFlashアプリケーションに依存する組織にソリューションを提供します。WebAssemblyのパイオニアであるLeaning Technologiesによって開発されたCheerpX for Flashは、Flashプラグインやレガシーブラウザを必要とすることなく、最新のWebブラウザでFlashアプリケーションを安全に実行できる最先端技術です。

# CheerpX for Flashの利点
1. セキュリティ強化： Flashアプリケーションは、セキュリティの脆弱性で有名です。CheerpX for Flashに移行することで、古いバージョンのInternet ExplorerやFlashを使用するリスクを排除することができます。CheerpXは、Flashアプリケーションが安全なサンドボックス環境でブラウザ内で実行されることを保証し、ユーザーとそのシステムを保護します。

2. モダンブラウザとの互換性： CheerpXを使えば、Google Chrome、Mozilla Firefox、Microsoft Edgeなどの最新ウェブブラウザでFlashアプリケーションにアクセスできます。Internet Explorerから移行し、これらのブラウザの機能を活用することで、企業は最新のウェブテクノロジー、パフォーマンスの向上、ユーザーエクスペリエンスの強化を利用することができます。

3. 導入の簡素化： レガシーなInternet ExplorerからCheerpX for Flashへの移行は、企業にとっての導入プロセスを合理化します。古いブラウザのバージョンを維持し、互換性の問題を管理する代わりに、企業はCheerpXの最新ブラウザとのシームレスな統合に頼ることができます。

4. 将来を見据えたソリューション：テクノロジーが進化し続ける中、企業は将来を見据えたソリューションを採用することが重要です。CheerpX for Flashを採用することで、企業はFlashアプリケーションの将来性を確保し、陳腐化のリスクを回避することができます。CheerpXは、ブラウザのサポートが低下してもFlashアプリケーションを実行し続け、企業は革新と成長に集中することができます。

# 結論
企業は、レガシーなInternet ExplorerとAdobe Flashを使い続けて生産性と成果を最大化させる試みに別れを告げる時が来ました。時代遅れのテクノロジーを使用することに関連するリスクは、認識されているメリットよりもずっと大きいものです。CheerpX for Flashを採用することで、企業はFlashアプリケーションのセキュリティを確保し、最新のウェブブラウザとの互換性を獲得し、デプロイメントを簡素化し、システムの将来性を確保することができます。

CheerpX for Flashへの移行は、近代化、セキュリティの向上、ユーザーエクスペリエンスの向上への一歩です。CheerpXは、過去の長所と現在の機能を組み合わせたソリューションです。

https://leaningtech.com/legacy-modernisation-jp/

[引用元](https://new.leaningtech.com/switching-from-legacy-internet-explorer-to-cheerpx-for-flash/)
【PHP】特定のクラスであるかを型演算子で判定して条件分岐させる

変数に入っているインスタンスがどのクラスから作ったものかで、処理を分岐させたいことがあるかと思います。

その場合、型演算子 **instanceof** を使うと良いです。

instanceofは、対象のインスタンスがどのクラスかをbooleanで判定してくれる演算子です。
具体的な使い方としては、以下です。
対象のクラス名と比較して、同じクラスからできたインスタンスの場合、trueを返します。
```php
// $objectはインスタンスが入っている変数
// TargetClassはクラス名
$object instanceof TargetClass
```

では、具体的に本記事のタイトルでもある、条件分岐させる例を以下に示します。
例えば、アカウントがユーザー(User)と管理者(Admin)の2種類があるとします。
その2つのクラスから作ったインスタンスがあった場合、
どちらかによって処理を分岐させたい場合は以下のようにします。

```php
Class User
{
}

Class Admin
{
}

$account = new User();

if ($account instanceof User) {
    echo 'user';
} else {
    echo 'admin';
}
// => user


$account = new Admin();

if ($account instanceof User) {
    echo 'user';
} else {
    echo 'admin';
}
// => admin
```

横並びでいくつか種類が存在するアカウントなどは、モデルクラスを複数作る設計もあるかと思います。
その場合、どのモデルクラスのインスタンスかを判定して処理を切り替える場合は、
instanceofを使う方法が有効な手段の1つかと思います。


### 参考

https://www.php.net/manual/ja/language.operators.type.php?utm_source=pocket_saves
AWS Dev Day 2023 Tokyo 参加の個人メモ -ゼネラルセッション編-

ジャーニーマン( @beajourneyman )です。

4年強寝かしていたQiitaを再始動します。

再始動に際して少しだけ自己紹介を書きます（短めに）。IT業界に入ってCOBOLプログラマ、SE、PMなどを経て、コンテンツマーケティング(オウンドメディア)・PR(SNS運用)を経て、AWS上で稼働しているシステムのPM兼SEに復帰しました。マーケ・PR時代はコミュニティメンバーと執筆もしていました(Amazonn著者ページ)。昨年10月から担当になり、9ヶ月のAWS初心者です。(本稿でのPMはプロジェクトマネージャです)

https://www.amazon.co.jp/Journeyman/e/B07R3R7T4S/

「AWS Dev Day 2023 Tokyo」のいくつかのセッションをピックアップして個人メモを残します。ご参加されなかった方も2023/08/31(木)までオンデマンド配信中なので是非ご覧ください。

https://aws.amazon.com/jp/events/devday/japan/

# Day 1 ゼネラルセッション(基調講演)
## 『質とスピード』特別編 〜 現代のソフトウェア開発にキャッチアップしていくヒント〜 和田さん
テスト駆動開発の第一人者、和田さん(@t_wada)のセッションのメモと簡単な感想を書きます。

* スピード(開発速度)と品質はトレードオフではない。
* スピードと質とトレードオフなのは「教育」「成長」。ただ、その先に待っているのは「組織の死」。
* 「技術」が「文化や風土」に(良い)影響を与える。
* システムのタイプ(SoEやSoR、ドメインなども含むのかな)にパフォーマンスに相関はない。相関があったのは「テスト容易性」と「デプロイ容易性」が高いとパフォーマンスが良い。品質改善のサイクルが早いかどうかにつながる。
* 日本は判断を外部に委ねるコトが多い。結果としての「事例主義」で突破する。
* ソフトウェア開発の上流から下流まですべてに関わる。そのサイクルの経験数が王道。しかし、難しい。

自分は普段コードは書きません。PjMです。現場で常に頭の片隅において判断しないといけないと思いました。担当しているシステムには、ベストプラクティスの視座でみると改善すべき点があります。ひとつひとつ評価して、改善を進めたいと思いました。素晴らしいセッション、ありがとうございます。

スライドが公開されていますのでご紹介します。講演スライドの123頁中、実に54頁以降がQ&Aに対する詳細な回答と解説という驚異的なスライドです。

https://speakerdeck.com/twada/quality-and-speed-aws-dev-day-2023-tokyo-edition

# Day2 ゼネラルセッション(基調講演)
## 前半：Be Confident. To make your Engineering Life Better.- 開発者としての「居場所」を考える
グローバルのコミュニティマネージャ、クリスさん(AWS柄のワンピースで登場！)とアンバサダーでBTCの熊谷さんのセッションでした。

* エンジニアはしっかり寝て😴外に出よう！！
* コミュニティはあなたのメンターになる。
* JAWSUG(Japan AWS User Group) は世界一♪
* 上司の理解はやっぱり大事。
* 出る杭を増やそう！！

素晴らしいセッションでした。キャリアの波がある中で、AWSと出会い、JAWSUGと出会い、アンバサダーに就任されたストーリーには、感銘を受けました。また、クリスさんから「JAWSUGは世界最高！」をいただいたのも印象深かったです。セッション全編を通してエンジニア(デベロッパー)を応援する姿勢が貫けれていたと感じました。

## 後半：大規模言語モデル (LLM) の民主化: 便利な API の一歩先、その深淵の入り口を覗いてみよう
LayerXの松本さん、サイバーエージェントの石上さん、AWSのダグさんのセッションです。

テーマに沿ってサイバーエージェントさんで取り組まれた日本語LLM公開の紹介がありました。

サイバーエージェント、最大68億パラメータの日本語LLM（大規模言語モデル）を一般公開 ―オープンなデータで学習した商用利用可能なモデルを提供―

https://www.cyberagent.co.jp/news/detail/id=28817

登壇されたお3方から、現在の取り組みと現状のLLMのふりかえりがありました。後半は、AWS針原さんが加わり、LayerX松本さん、サイバーエージェント石上さん、AWSダグさんになりました。

* 機械が概念を持つようになったのがLLMの衝撃だった。
* ローカルLLMのOpenCALMもどうぞ。
* CodeWhispererは開発者の労力を減らす。

ダグさんが現地入りできなかったのでAWS久保さんが代打でパネルディスカッションに参加されていました。最近取り組まれたトライのブログです。

https://aws.amazon.com/jp/blogs/news/open-calm-and-openai-chatgpt-accuracy-on-jaqket-experiment-in-amazon-sagemaker/

キャリアからLLMと振り幅の大きい、ゼネラルセッションでした。

# カンファレンス情報
実際の会場の雰囲気やランチ、テットワーク周りも簡単にお伝えします。

## 会場について
今回は道玄坂上まで登りきった先にあるベルサール渋谷ガーデンでした。電車を降りてからだと15分くらいでしょうか。良い運動になりました。会場はメインの地下1Fと1Fでした。広さ的には、溜池山王駅直結の赤坂インターシティカンファレンスくらいでした。メイン会場に降りると Deep Racer の大きなオブジェが飾られていました。ゼネラルセッション会場、ブレイクアウトセッション会場いくつか、スポンサーブースと併設でフリーデスクスペース(一部電源あり)でした。コンパクトなAWS Summitと言うと分かりやすでしょうか。

## ランチについて
チケットに含まれるランチはありませんでした。会場内で弁当の販売をしていました。弁当の種類は数種類ありました。価格は500円でした。お〜いお茶のパック100円も同時に発売していました。無料のDevDayミネラルウォーターがあるのでそちらで良い方は、お茶を買う必要はないです。

## ネットワークについて
今回はWiFiはありませんでした。GameDay参加など一部のイベントのみで提供されていました。AWS Summit の時のように、WiFi提供ありの認定者ラウンジもありませんでした。

## パーティーについて
セッションが終わるとスポンサーブースエリアにケータリングが並びネットワーキングパーティがあります。せっかくなので参加して、登壇者や AWS SA の方と繋がったり、気になることを質問すると良いと思います。みなさん、AWSという共通言語で集まっているので、聞いているだけでも十分楽しめるのではないでしょうか。

簡単にゼネラルセッションをご紹介しました。少しは雰囲気が伝わったでしょうか。

今回は以上です。
共同開発　git 初期設定

### :cherry_blossom:はじめに
共同開発のためのgitの使い方を自分用に作成します！
リポジトリを作成しているところからです。

:apple:がついているものは代表者以外のメンバーが行う作業です。
ついていないものは代表者１人の作業です。
_____
### :shamrock:アプリケーションを作成
```
$ rails new アプリ名     # 新規アプリケーション作成
$ cd アプリ名     　　　　　　　　　　　　 # アプリケーションに移動
```
.gitignoreに管理から外すファイルを記述する
```.gitignore
/db/*.sqlite3
/db/*.sqlite3-jaurnal
```
:question: **gitignoreとは？**
コンピュータのプログラムを作るときに使うツール、Gitで、特定のファイルやフォルダを無視するように指示するためのファイルのことを指します。

プログラムを作るときには、試行錯誤の結果や秘密の情報、使ったツールが自動で作るファイルなど、Gitで管理したくないものがたくさんあります。これらを一つ一つGitから除外するのは大変です。

そこで.gitignoreファイルを作り、管理したくないファイル名やパターンを書き込んでおくと、Gitはそれらを自動的に無視します。これにより、必要なファイルだけをきちんと管理することができます。

### :shamrock: アプリケーションgitにプッシュする
```
$ git init                                # git 初期設定
$ git add -A                              # ステージングに登録
$ git commit -m "first commit"            # コミットする(ローカルリポジトリに登録)
$ git remote add origin リポジトリのURL(SSH)  # リモートリポジトリの登録
$ git branch -M main                      # ブランチ名をmainに変更する
$ git push -u origin main                 # プッシュする
```
:::note info
-u オプションをつけると origin mainが登録され、次回以降
$ git push コマンドのみで origin mainにpushされます。
:::
:apple:代表者がプッシュできたら、
 他のメンバーはGitHubからアプリケーションをクローンします。
 ```
$ git clone [リポジトリのURL(SSH)]
```
### :shamrock: ブランチの作成

:star:**ブランチの確認**
今いるブランチに＊がつく
```
ec2-user:~/environment/cakeshop (develop) $ git branch
* develop
  install-devise
  main
```
:star:**ブランチの作成**
今回はdevelopブランチを作成して **$ git branch**でdevelopブランチに移動していることを確認

```
$ git checkout -b develop
```
:::note
ブランチは機能・タスク・バグごとに切る

Gitでブランチを機能、タスク、バグごとに切る理由は、「作業の分離」と「安全なコード統合」を可能にするためです。

複数の開発者が同時に作業を進める際に役立ちます。各開発者が別々のブランチで作業することで、他人の作業に影響を与えることなく自分のタスクに集中できます。
:::
:star:**作成したブランチを空コミットする**
オプション--allow-emptyは空コミットするためのものです。
```
$ git commit --allow-empty -m "first commit"
```
:question:**空コミットとは？**
Gitにおいて、何の変更も伴わないコミットのことを指します。つまり、前のコミットと比べてファイルに変更が無い状態でコミットを行うことです。

:star:**作成したブランチをリモートリポジトリにプッシュ**
```
$ git push origin develop
```
:apple: **統合ブランチを反映させる**
代表者が統合ブランチをプッシュできたら、
他のメンバーは、その統合ブランチの情報を取ってきましょう。
```
$ cd アプリケーション
$ git checkout -b develop
$ git pull origin develop   
```
 ### :shamrock: 統合ブランチとトピックブランチ
**統合ブランチ**：
主要な開発の進捗を反映するブランチで、通常はmasterやmain、developなどと呼ばれます。このブランチには正常に機能するコードだけが含まれ、特にmasterやmainはリリース可能な状態を保つことが一般的です。

**トピックブランチ**：
特定の機能開発やバグ修正など、特定の「トピック」に関連する作業を行うためのブランチです。トピックブランチは統合ブランチから分岐し、作業が完了したら統合ブランチにマージされます。
各開発者はトピックブランチで自由に作業を行い、その結果を統合ブランチに反映させることで、安全かつ効率的に共同作業を進めることができます。