OmniAICreator/Qiita-1.07M huggingface dataset:
docker-compose.yml を用いた docker コンテナの作成例

## 概要
 - 作成時の要点をまとめたのでメモ

 - サンプルのurl : https://github.com/3104yoshi/docker_sample/tree/main

- ./setup.sh でコンテナを起動できる

### サンプル概要
 - DB と連携する webアプリケーション
 - DB、アプリケーションサーバともに、 docker コンテナ内で作成している
 - DB には postgres と Adminer を, アプリケーション側では Flask を使用しており、以下が必要
     - postgres
     - Adminer
     - python
     - Flask
 - docker によって ↑ を管理できるため、ホストマシンにインストールする必要がない

### ディレクトリ構成
```
root
 ├ src
 |  :
 ├ docker-compose
 ├ Dockerfile
 ├ .env                      # db の接続情報を分離
 └ postgres
    └ init
       ├ 1_create_table.sql  # テーブルの作成
       └ 2_insert.sql        # テーブルデータの初期化
```

### docker-compose.yml
``` yml:docker-compose.yml
version: '3'
services:
  postgres:
    image: postgres:14.4-alpine
    ports:
      - "5432:5432"
    volumes:
      - ./postgres/init:/docker-entrypoint-initdb.d
    container_name: postgres
    environment:
      POSTGRES_USER: $POSTGRES_USER
      POSTGRES_PASSWORD: "$POSTGRES_PASSWORD"
      POSTGRES_DB: "$POSTGRES_DB"
      
  
  server:
    build: .
    ports:
      - '4000:80'
    environment:
      POSTGRES_USER: $POSTGRES_USER
      POSTGRES_PASSWORD: "$POSTGRES_PASSWORD"
      POSTGRES_DB: "$POSTGRES_DB"
      POSTGRES_HOST: "$POSTGRES_HOST"
      FLASK_SECRET_KEY: "$FLASK_SECRET_KEY"
  
  adminer:
    container_name: adminer
    hostname: adminer
    image: adminer:4.7.5
    ports:
      - 8080:8080
    depends_on:
      - postgres

 ```
 - services
    - 各コンテナの設定を定義している
    - このサンプルでは services 直下に db, アプリケーションサーバ, Adminer の3つのコンテナを定義している
 - image
    - Dockerイメージを指定する
 - build
    - Dockerfile のパスを指定する  

 `Docker Hub のようなリポジトリから Docker イメージを取得する場合はimageを、Dockerfile を指定する場合は build を使用する `

 - volumes
    - /docker-entrypoint-initdb.d にローカルのディレクトリをマウントしている
    - マウントしたディレクトリ直下にある sql ファイルが build 時に実行される 
    - 実行順は prefix の数字に従う
 - 環境変数
    - environment 下で用いている環境変数は .env ファイルで定義できる

#### .env
 - ここでは以下の環境変数を定義している
```
POSTGRES_USER
POSTGRES_PASSWORD
POSTGRES_DB
POSTGRES_HOST
FLASK_SECRET_KEY
```

### コンテナ起動
```
docker compose build
docker-compose up -d
```

### コンテナへの接続
 - ポートやユーザ名は自身が定義したものを使用する

#### dbへの接続
```
psql -h localhost -p 5432 -U postgres -d postgres
```
#### アプリケーションサーバへの接続

```
http://localhost:4000/
```

## docker-compose.yml を使用するメリット
- Dockerfile をビルドしても、一度に 1 つのコンテナしか起動できない
- docker-compose.yml をビルドすると、一度に複数のコンテナを起動できる
- コンテナの情報をまとめて管理できるため、多数のコンテナを使用するアプリケーションにおいて有用
データの取得と複製‐ドライブの dd イメージの作成


◆目的
　dd イメージは、ハードディスクまたはディスクのパーティションのビット単位のコピーであるディスク イメージ ファイルで、すべてのファイル/フォルダー、削除されたファイル、空き領域と未割り当て領域に残っているファイル、ファイル システム情報、等

この目的は、Windows OS で dd ツールを使用してシステム ドライブの dd イメージを作成する方法を理解できるようにすることです。

◆概要
dd コマンドを使用したシステム ドライブ/ディスクの物理的な取得について学びます。

疑わしいディスク/ドライブを物理的に取得するには、通常、物理的な取得プロセス中に生成されたイメージを収集するために、ハードディスクやペン ドライブなどの外部データ ストレージ メディアが必要です。

 ddコマンドを使用して、Windows 10 仮想マシンのプライマリ ディスク/内部ディスク ( PHYSICALDRIVE0 ) の物理取得を実行します。通常、画像を取得するには、画像を保存するための外部データ ストレージ デバイスが必要です。ただし、これはラボ環境であるため、イメージを保存するための外部ストレージ デバイスとして想定して、セカンダリ物理ディスク ( PHYSICALDRIVE1 、ラボのセットアップ中に作成) を使用しています。したがって、このディスクをこのラボでは外部ディスクとして扱います。

１．
ddフォルダーをコピーし、デスクトップに貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/0b2b0c1b-c39c-358e-fd9a-7b7fa4d3b99f.png)

２．
Microsoft Windows で使用可能なドライブに関する情報を取得するには、 Windows PowerShellでwmicコマンドを発行します。

管理者として PowerShell を起動するには、 Windowsアイコンを右クリックし、[Windows PowerShell (管理者)]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/8a851699-a0da-805f-d710-8a40f29d8335.png)

３．
Windows PowerShell が表示されます。コマンドwmic diskdrive list Brief /format:list を入力し、Enterを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/817c875b-6c5b-377e-6c1a-e47f0495db2b.png)

４．
cdコマンドを使用して、ディレクトリC:\Users\Admin\Desktop\ddに移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/08d07140-fa08-0240-c359-1912b7273fcd.png)


５・
次に、コマンド.\dd.exe if=\\.\PHYSICALDRIVE0 of=F:\Windows_Evidence_002.dd bs=512k --size --progress を入力し、Enterを押します。これにより、次のスクリーンショットに示すように、フォレンジック ディスク(このラボではF:\ )にドライブPHYSICALDRIVE0の物理イメージの作成が開始されます。

<h6><INS>注意</INS></h6>
フォレンジック ディスクのドライブ文字は、ラボ環境によって異なる場合があります。フォレンジック ディスクに関連付けられた文字を入力する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/0179531c-17b7-e03f-84ab-0a8a0c98863c.png)

６．
ツールがイメージを作成するまでには時間がかかります。イメージが正常に作成されると、次のスクリーンショットに示すように、入力レコード数と出力レコード数が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/2cb06a3c-6de4-cf89-d7f5-306e52ea1b8a.png)

７．
以下のスクリーンショットに示すように、フォレンジック ディスク(このラボではF:\ドライブ)に移動して、キャプチャされたdd イメージファイルを確認します.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/633aef8d-0d9e-2f14-5df4-fd1cde474b92.png)

８．
この画像は、調査員にとってリアルタイムでの検査の主な情報源になります。フォレンジック ワークステーションの種類と捜査官の要件に応じて、これらのイメージはフォレンジック ツールを通じて直接検査されるか、さらに他のフォレンジック ツール形式やブート可能なイメージに変換されます。

９・
このようにして、調査プロセス中にシステム ドライブのDD イメージを作成できます。

開いているウィンドウをすべて閉じます。
【C言語】初期化と代入の違いについて

# 【C言語】初期化と代入について

何が違うのか分からなかったので、忘れないようアウトプット。

変数は、作られたときに`不定値`(ゴミ値)が入ります。
```c:不定値（ゴミ値）
#include <stdio.h>

int main(void){

/* xに何も値を入れない */
 int x;

 printf("%d", x);
 return 0;
}

```
```c:実行結果
/* 不定値(ゴミ値)が出てくる */
0
```
`int x;`で生成したときに入っている不定値(ゴミ値)が出力される。
実行時にエラーが発生したりする原因になるみたいなので、気を付けたいです。




## 初期化子を使った初期化

`データ型　変数；`生成と共に入れる`値`のことを`初期化子`と呼びます。
`データ型　変数 = 値(初期化子)`
`データ型　変数 = 値(初期化子), 変数 = 値(初期化子)....`なども可能。

```c:初期化
#include <stdio.h>

int main(void){

/* 変数を作り、値も同時に入れる */
/*   20 と x-12は初期化子(値)   */
 int x = 20, y = x-12;    

 printf("xの整数は:%d\n",x);
 printf("yの整数は:%d\n",y);
 return 0;
}
```
```
xの整数は:20
yの整数は:8
```

## データ型と変数を宣言後、値を初期化（代入）
```c
#include <stdio.h>

int main(void){

/* データ型と変数宣言 */
 int x,y;

/* 値を代入して、初期化する */
 x = 20;
 y = x - 12;

 printf("xの整数は:%d\n",x);
 printf("yの整数は:%d\n",y);
 return 0;
}
```

```
xの整数は:20
yの整数は:8
```


値を代入するタイミングが違う！
【C言語】変数

# 【C言語】変数について

2日前からC言語の勉強始めました～～～～。
アウトプットしていこうと思います。


## 変数について

複雑な計算は変数を使う〇！
変数とは`使いたい値に名前を付けたもの`です。

## 宣言とは
変数を使うにはを`宣言`ということをします。
宣言方法は、

`データ型 変数;`という書き方をします。

例)  `int x;`
という感じです。

intとは整数を扱える型です。
なので、代入する値はすべて整数となります。

変数を使用するには、事前にデータ型と変数を宣言する必要があります！！



```c
#include <stdio.h>

int main(void){
    /* ここで宣言 intはデータ型、　x,yは変数 */
    int x,y;
    /* x,y変数に値を代入 */
    x = 12;
    y = 15 - x;
    /* \nは改行 */
    printf("xの整数は%d\n", x);
    printf("yの整数は%d\n", y);
    /* return 0はプログラムが正常に終了したお知らせするもの */
    return 0;
}
```

```
xの整数は12
yの整数は3
```
ActiveDirectoryでPC一覧をcsvで取得

# やり方

ActiveDirectory上でPowerShellを起動して下記コマンド。

```powershell:
Get-ADComputer -Filter * -Properties * | Export-Csv 出力先csvパス
```

# 取得できるcsvのカラム一覧

AccountExpirationDate
accountExpires
AccountLockoutTime
AccountNotDelegated
AllowReversiblePasswordEncryption
AuthenticationPolicy
AuthenticationPolicySilo
BadLogonCount
badPasswordTime
badPwdCount
CannotChangePassword
CanonicalName
Certificates
CN
codePage
CompoundIdentitySupported
countryCode
Created
createTimeStamp
Deleted
Description
DisplayName
DistinguishedName
DNSHostName
DoesNotRequirePreAuth
dSCorePropagationData
Enabled
frsComputerReferenceBL
HomedirRequired
HomePage
instanceType
IPv4Address
IPv6Address
isCriticalSystemObject
isDeleted
KerberosEncryptionType
LastBadPasswordAttempt
LastKnownParent
lastLogoff
lastLogon
LastLogonDate
lastLogonTimestamp
localPolicyFlags
Location
LockedOut
logonCount
ManagedBy
MemberOf
MNSLogonAccount
Modified
modifyTimeStamp
msDS-SupportedEncryptionTypes
msDS-User-Account-Control-Computed
Name
nTSecurityDescriptor
ObjectCategory
ObjectClass
ObjectGUID
objectSid
OperatingSystem
OperatingSystemHotfix
OperatingSystemServicePack
OperatingSystemVersion
PasswordExpired
PasswordLastSet
PasswordNeverExpires
PasswordNotRequired
PrimaryGroup
primaryGroupID
PrincipalsAllowedToDelegateToAccount
ProtectedFromAccidentalDeletion
pwdLastSet
rIDSetReferences
SamAccountName
sAMAccountType
sDRightsEffective
serverReferenceBL
ServiceAccount
servicePrincipalName
ServicePrincipalNames
SID
SIDHistory
TrustedForDelegation
TrustedToAuthForDelegation
UseDESKeyOnly
userAccountControl
userCertificate
UserPrincipalName
uSNChanged
uSNCreated
whenChanged
whenCreated

# 1行目はカラム名になっていない

csvの1行目は
```#TYPE Microsoft.ActiveDirectory.Management.ADComputer```
という文字列になっています。

2行目がカラム名になっています。

# 蛇足

LastLogonDate
OperatingSystemVersion
PasswordLastSet
IPv4Address
IPv6Address
あたりの情報が棚卸で役立ちます。

これらのActiveDirectoryが持っている情報の更新タイミングについて…

* クライアントPCの再起動＆サインインをすると更新されました。
* クライアントPC側の設定変更直後やサインアウト＆サインインだけでは更新されなかったです。

リアルタイムに情報が更新される訳ではないことに注意。
ArduBlock のカスタマイズ 上級編

「ArduBlock のカスタマイズ はじめて編」
https://qiita.com/nanbuwks/items/6bb036b5e915a5b24bd4
では、最低限の引き出しとブロックを作成し、


「ArduBlock のカスタマイズ 中級編」
https://qiita.com/nanbuwks/items/f2067f06a0012791ee3d
では、もう少し複雑なブロックを作成しました。

上級編では、更に設定をしていきます。

# パラメータのプルダウンメニュー

こんな感じにしたい。これは DigitalPin のブロックで、GPIOポート番号が選択できるようになっている。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/282b3e35-57aa-4422-5c2c-3803f64593f5.png)

これは、主に `src/main/resources/com/ardublock/block/ardublock.xml` 　で作業する。

## `src/main/resources/com/ardublock/block/ardublock.xml` 

### BlockDrawer の設定

まず、選択肢をすべてブロックで定義しておく。今回は選択肢は2つなので、2つを定義。
```
</BlockDrawer>
                        <BlockDrawer button-color="50 180 70" name="bd.plant" type="factory">
                                <BlockGenusMember>pinListPlant_beep</BlockGenusMember>
                                <BlockGenusMember>pinListPlant_pump1</BlockGenusMember>
                                <BlockGenusMember>pinListPlant_pump2</BlockGenusMember>
                                <BlockGenusMember>pinListPlant_valve</BlockGenusMember>
                         </BlockDrawer>

```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/2aa4be6c-764f-60ce-c120-8f14f64a8dba.png)

```
                <BlockGenus name="pinListPlant_pump1" kind="data" color="60 100 30" initlabel="bg.pinListCleaner_right_back" editable-label="no">
                        <BlockConnectors>
                                <BlockConnector connector-type="number" connector-kind="plug"/>
                        </BlockConnectors>
                </BlockGenus>
                <BlockGenus name="pinListPlant_pump2" kind="data" color="60 100 30" initlabel="bg.pinListCleaner_right_back" editable-label="no">
                        <BlockConnectors>
                                <BlockConnector connector-type="number" connector-kind="plug"/>
                        </BlockConnectors>
                </BlockGenus>



```

### BlockFamily でひとまとめ

```

```

このように定義されたものは、以下で BlockFamily として定義される。

```
        <BlockFamilies>
.
.
.

                <BlockFamily>
                        <FamilyMember>pinListPlant_pump1</FamilyMember>
                        <FamilyMember>pinListPlant_pump2</FamilyMember>
                </BlockFamily>


        </BlockFamilies>

```


このようにすると、選択肢が選択できるようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/d07acc91-42bb-18e7-c224-f38d1498e3de.png)



あとは BlockDrawer を必要なものを選んで整理。
smart japan ノートパソコン買ってみた その4


# 概要
smart japan ノートパソコン買ってみた

# 問題6
きれいなロック画面が見れない。

# 対応
- 右クリック、　「個人用設定」をクリックします。
- 画面左側の [ ロック画面 ] をクリックします。
- 画面右側の 「 背景 」 欄の [ ボックス ] をクリックし、ポップアップメニューの [ Windows スポットライト ] をクリックします。 

# 問題7
デスクトップの背景がスライドショーじゃない。

# 対応
- 右クリック、　「個人用設定」をクリックします。
- 画面左側の [ 背景 ] をクリックします。
- 画面右側の 「画像  」 欄の [ ボックス ] をクリックし、ポップアップメニューの [ スライドショー ] をクリックします。
- すきなフォルダーを指定します。

以上。
古いNASをLinux/Windowsでマウント

## 序
2023年8月末にUbuntu22.04LTSをアップデート・アップグレード処理したら、古いNASをマウントできなくなりました。ネットを探して、マウントできる様になりましたが、最新の情報(2023/8下ぐらい)はあまりありませんでした。
色々な事情でまだ置き換えられない古いNASを、Linux、Windowsでマウントする方法を自分の備忘録を兼ねてまとめておきます。

## 対象
・NAS : SMB 1.0/CIFS しかできない古いタイプ
・クライアントPC :  Linux系でmountコマンドやfstabでマウントする場合※
 　　　　　　　　　Windows11 or 10

※LinuxのGUI環境のファイルマネージャ経由でしかNASに接続しない場合は、そのファイルマネージャの機能により以下の設定をしなくても接続できる場合があります(Gnome FilesやDolphinなど)。尚、Macは特に何もしなくてもまだマウントできる様です(Ventura,Montereyで確認済み)。

## Linux系
セキュリティ強化により、デフォルトではsambaやkernelのバージョンによりSMB 1.0/CIFSのドライブをマウントできない様になってきてます。私のUbuntu環境では、以下の様でした。

### Ubuntu 20.04LTS
特に何もしなくても、マウントはできました。

### Ubuntu 22.04LTS kernel 5.19まで
/etc/samba/smb.conf [global] エリアに以下の行を追記し(coreかNT1どっちか)する必要がありました。

```conf:smb.conf
[global] 
　　　:
client min protocol = core
#client min protocol = NT1
     :
```

### Ubuntu 22.04LTS kernel 6.2
Ubuntu 22.04LTSではkernel6.2は2023/8下ごろからアップデートリストに入ってきました。kernelのセキュリティ強化？により、一旦切り捨てられた？のか見落とされたのか不明ですが、今までの設定のままではエラーが出てマウントできなくなりました。[Arch Linuxのバグレポート](https://bugs.archlinux.org/task/78558)で上がっていて(Arch Linuxではkernel6.3.5で解決しているようです)、回避作も示されてます。Ubuntuでも、この回避策を実施することで、マウントができる様になりました。それによると、マウント処理オプション(/etc/fstabの記述やmountコマンド)の vers=1.0 の記述の後に ndfs を加えます。

```conf:/etc/fstabでの例
　　　:
/nas共有フォルダ名 /マウント先フォルダ名 cifs vers=1.0,ndfs, …
　　　:
```
## Windows11 or 10
コントロールパネル -> プログラムと機能 -> Windowsの機能の有効化または無効化で、【SMB 1.0/CIFS ファイル共有サポート】にチェックを入れます。
クライアントのみとしての接続だけなら、【SMB 1.0 CIFS ファイル共有サポート】　の下にある、【SMB 1.0/CIFS クライアント】だけのチェックだけでもいいと思われます。
[こちらのページ](https://qiita.com/xus/items/3c30c0841c0736689d5b)の方が、上記の方法だけでなくpowershellを使った接続方法もあり、より詳しく掲載されています。

## 補足：SMB1.0について
[マイクロソフトのこのページ](https://learn.microsoft.com/ja-JP/windows-server/storage/file-server/troubleshoot/smbv1-not-installed-by-default-in-windows)でも案内されている様に、SMB1.0はセキュリティの上の問題を内在しているのでデフォルトでは使用できない様になってきています。なので、タイミングを見てNASを新しいものに入れ替えるべきだとは思いますが・・・。
spring-bootのバージョンアップ時にmysqlの接続でエラー発生

## エラー概要
spring-bootを３．０．２から3.1.3にバージョンアップしたが、
mysqlに接続部分でエラー発生

## 対応方法

runtimeOnly 'mysql:mysql-connector-java'
↓
runtimeOnly 'com.mysql:mysql-connector-j'
で解決
トライしたかったnftablesの基本（その１）

# nftablesにトライ（フィルタリング）
iptables、ebtablesの最低限を理解したので、それを機能的に包含するnftables（後継らしい）の超基本にトライしたときのメモ。お題は”Filter”（フィルタリング）。

## 参考サイト
検索すれば多数見つかる。
1. [nftables で基本的なフィルタリングを設定してみた](https://tech-lab.sios.jp/archives/16930)
1. [iptables後継のnftables基本操作](https://www2.filewo.net/wordpress/2019/10/03/2176/)
1. [nftables](https://wiki.archlinux.jp/index.php/Nftables)
1. [Linuxにおける新たなパケットフィルタリングツール「nftables」入門](https://knowledge.sakura.ad.jp/22636/)

最初は何が何だがよくわからずであったが、何度かトライして、ある程度は理解できたと思える。例が多い、細かい説明がある、、などより、的を絞った基本がベター。（それが本稿の意図でもある。）

## ネットワークトポロジー
検証環境は下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/688d0992-31b0-5d88-5838-6c7711e6bb62.png)
nftablesを動作させるRouterの両側に異なるネットワークが存在する。なお、VirtualBox上のVMで動作を確認した。

## 設定
nftコマンドを駆使する。詳細は上述の参考サイトにて。

### テーブル
まずは、”reject_filter”という名称のテーブルを作成する。
```shell
$ sudo nft create table inet reject_filter
```
”inet”は、ipv4/ipv6を指す。
### チェーン
次に、”reject_filter”テーブル内に、”forward_1”という名称のチェーンを作成。
```shell
$ sudo nft create chain inet reject_filter forward_1 {type filter hook forward priority 0 \;}
```
ここでは、typeとして”filter”（フィルター）、hookとして”forward”（転送）チェーンを作成する。ここまでで、作成されたものを表示すると、
```shell
$ sudo nft -a list ruleset
table inet reject_filter { # handle 1
        chain forward_1 { # handle 1
                type filter hook forward priority filter; policy accept;
        }
}
```
となる。チェーンの基本policyは”accept”（許可）となるようだ。また、handle番号（”1”）は状況により変化する。

### ルールの追加
特定の送信元からの特定のプロトコルを”reject”（拒否）する例である。
```shell
$ sudo nft add rule inet reject_filter forward_1 ip saddr 192.168.10.30 ip protocol icmp reject
$ sudo nft -a list ruleset
table inet reject_filter { # handle 1
        chain forward_1 { # handle 1
                type filter hook forward priority filter; policy accept;
                ip saddr 192.168.10.30 ip protocol icmp reject # handle 3
        }
}
```
”ip saddr 192.168.10.30”、”ip protocol icmp”とを同一行に記載することにより、AND条件となる。

### 評価順（複数行記載）
```shell
$ sudo nft create table inet reject_filter
$ sudo nft create chain inet reject_filter forward_1 {type filter hook forward priority 0 \;}
$ sudo nft add rule inet reject_filter forward_1 tcp dport 1234 reject
$ sudo nft add rule inet reject_filter forward_1 ip saddr 192.168.10.10 accept
$ sudo nft -a list ruleset
table inet reject_filter { # handle 1
        chain forward_1 { # handle 1
                type filter hook forward priority filter; policy accept;
                tcp dport 1234 reject # handle 3
                ip saddr 192.168.10.10 accept # handle 4
        }
}
```
”handle 3”にマッチした場合、”handle 4”は評価されない。

### ルールの削除
上記の状況で、”handle 3”を削除してみる。
```shell
$ sudo nft delete rule inet reject_filter forward_1 handle 3
$ sudo nft -a list ruleset
table inet reject_filter { # handle 1
        chain forward_1 { # handle 1
                type filter hook forward priority filter; policy accept;
                ip saddr 192.168.10.10 accept # handle 4
        }
}
```
”handle 3”が削除され、”handle 4”が残っている。

## おわりに
ネットワークパケットは省略。その２では、”NAT”にトライ（予定）。
Azure Cost Management の Query を使って「実際のコスト」を Azure CLI で取得してみた

私の周辺では、翌月になってはじめて先月のコストが増えている事に気づく、という事例がちらほらあります。私の対策方法は、今まで使ったことのない Azure リソースを作成した時などは特に、当日から数週間はコストの増加を毎日確認しています。今時はコストのアラートを設定できるので、設定値を超えると自動でメールを送ることも可能になりました。もう一つの対策として、毎朝「実際のコスト」がメールや Teams チャネルに送信され、日課として毎朝コストを見る習慣をつけておくのがよいのではないかと思います。そこで今回は、Azure Cost Management の Query を使って「実際のコスト」を Azure CLI で取得してみました。

## 当月のコストを取得する例

`timeframe` を `MonthToDate` で実行します。

```bash:bash
subscription_id=$(az account show --query id --output tsv)

az rest \
  --method post \
  --url "https://management.azure.com/subscriptions/$subscription_id/providers/Microsoft.CostManagement/query?api-version=2023-03-01" \
  --body '{
      "type": "Usage",
      "timeframe": "MonthToDate",
      "dataset": {
        "granularity": "None",
        "aggregation": {
          "totalCost": {
            "name": "PreTaxCost",
            "function": "Sum"
          }
        }
      }
    }' \
  --query "properties.rows[0]"

[
  227.01741212341477,
  "JPY"
]
```

## 当月のコスト

![azure-cost-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/faeca2e0-3881-0647-25b8-4d8eafbf8d54.png)

## 先月のコストを取得する例

`timeframe` を `TheLastMonth` で実行すると下記のエラーとなるため、`Custom` にして `timePeriod` を追加します。


`Bad Request({"error":{"code":"BadRequest","message":"Invalid query definition, timeframe TheLastMonth is currently not supported. (Request ID: 4efcbdea-9ffc-4255-b3c4-c2e6549af505)"}})`

```bash:bash
subscription_id=$(az account show --query id --output tsv)

az rest \
  --method post \
  --url "https://management.azure.com/subscriptions/$subscription_id/providers/Microsoft.CostManagement/query?api-version=2023-03-01" \
  --body '{
      "type": "Usage",
      "timeframe": "Custom",
      "dataset": {
        "granularity": "None",
        "aggregation": {
          "totalCost": {
            "name": "PreTaxCost",
            "function": "Sum"
          }
        }
      },
      "timePeriod": {
        "from": "2023-08-01",
        "to": "2023-08-31"
      }
    }' \
  --query "properties.rows[0]"

[
  7998.907108950386,
  "JPY"
]
```

## 先月のコスト

![azure-cost-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/47b95584-19cf-83b4-c9b8-01603432042f.png)

## 補足情報

月初だからなのか、下記のように頻繁にリターンコード `429` になりました。バッチ処理などで月初に実行される事を考えると、リトライ処理を組み込んだ方が安心みたいです。

`Too Many Requests({"error":{"code":"429","message":"Too many requests. Please retry."}})`

## 参考

https://learn.microsoft.com/ja-jp/rest/api/cost-management/query/usage
smart japan ノートパソコン買ってみた その3

# 概要
smart japan ノートパソコン買ってみた

# 問題5
起動時、パスワードを聞いてこない。

# 対応
- [スタート]ボタンを選択し、[設定]を選択します。
- [設定]画面が表示されるので、[アカウント]を選択します。
- [アカウント]画面が表示されるので、画面左側の[サインイン オプション]を選択します。
- [パスワード]欄にある[追加]ボタンを選択します。
- [パスワード作成]画面が表示されるので、[新しいパスワード]欄にパスワードに設定する半角英数の文字列を入力します。

以上。
VSCodeで編集するよりも、外部エディタで編集したい時の拡張機能 ＞＞＞ 秀丸エディタ

# 使う理由

VSCodeよりも秀丸エディタを使いたい時があります。
(日本語入力、マクロやグレップ機能 他)

そんな時この拡張機能を入れておいて、外部エディターで編集出来るようにしておけばその場ですぐにファイルが開けて便利です。



# サポートしているエディタ

Atom Editor
Emacs
IDEA 14 Community Edition
Sublime Text
PhpStorm
Vim
Visual Studio
WebStorm

※秀丸はサポートされてないので、直接設定をします。



# 拡張機能のインストール

Open in Editor - Visual Studio Marketplace

https://marketplace.visualstudio.com/items?itemName=generalov.open-in-editor-vscode



## 拡張機能の設定

VSCodeの setting.json を開きます。

```setting.json
  "alt-editor.binary": "C:\\tool\\hidemaru.exe",
  "alt-editor.args": "/j{line},{column} {filename}"

```

上の行が秀丸エディタへのパスです。（パスは各自の環境に合わせてください）
下の行がVSCodeの中身をエディタに渡す命令です。

※パスを入力する時は\キーでパスの区切り文字をエスケープする必要があります。
※秀丸側は何も設定する必要はありません。



## 外部エディターの開き方

右クリックメニューから
 `Open in External Editor`
を選択します。

もしくは↓ショートカットで開きます。

`Shift + Alt + e`

(このショートカットキーはデフォルト値です、各自自由に設定してください。)
gitでmainにpushできない状況を解決した（？）error: failed to push some refs to 

# 初めに
どうも、gitを触り始めて一週間程度の初心者です。いろいろと試しているのですが往々にして詰んでいます；；
今回はちょっと解決に長い時間がかかった詰みを共有します。何せqiitaへのfirst commitなので甘いところがあったりするかもしれません。ご容赦ください。

# 状況
gitでリモートリポジトリにpushしたい。branchはdefaultのmainと新たにつくったdevelopがあるが、mainにのみpushすることができない。pushしようとするとエラーが出る。

```
$ git push origin main
error: failed to push some refs to URL
```


# やったこと
## 1.よくわからないけどpullしてみた
エラーをググってみると以下の記事がヒットした。
[【git】error: failed to push some refs to "URL"のエラー対処法
](https://qiita.com/cccccccccc/items/118a5b3237c78d720582)

まずはこの記事の①git pull origin developをそのまま実行した。するとエラーみたいなのが返ってきた。
```
$ git pull origin main
hint: You have divergent branches and need to specify how to reconcile them.
hint: You can do so by running one of the following commands sometime before
hint: your next pull:
hint:
hint:   git config pull.rebase false  # merge (the default strategy)
hint:   git config pull.rebase true   # rebase
hint:   git config pull.ff only       # fast-forward only
hint:
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.
fatal: Need to specify how to reconcile divergent branches.
```
ちょっと何を言ってるのか、今の僕にはワカラナイなぁ、、、
この路線は一回撤退しました。

## 2.同じリモートリポジトリに強制pushしてみた
先ほどの記事に強制pushが最終手段としてある（おすすめはしない）とあったので、これを実行。しかし何も起きなかった、、、

## 3.リモートリポジトリを変更してみたうえで強制pushしてみた
強い人たちに相談したところ、リモートリポジトリを変更するのが良いとのこと。これを試しました。記事はこちらをご参考ください。[gitのremote urlを変更する(レポジトリ移行時)](https://qiita.com/minoringo/items/917e325892733e0d606e)

この上で強制push。うまくいったようです。
```
$ git push -f origin main
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:自分のurl
 + 1df1919...ee9f058 main -> main (forced update)
```
# 考えられる原因
リポジトリの名前を作業中にmasterからmainに変更したことが、考えられる唯一の私の罪です。皆さんも気を付けてね。
smart japan ノートパソコン買ってみた その2

# 概要
smart japan ノートパソコン買ってみた

# 問題3
デスクトップに、いらない「コンピューター」「ユーザーのファイル」「ネットワーク」「コントロールパネル」の4つのアイコンがある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/40c12e0f-605b-9502-ea4d-18833d6d9505.png)

# 対応
- 右クリック　「個人用設定」
- 「デスクトップアイコンの設定」を左クリック
- デスクトップから非表示したいアイコンを選択します。

# 問題4
いらないアプリがある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/216c7879-152a-2ab7-3f61-5f3566717e49.png)


# 対応
- スタート＞設定＞アプリ
- いらないアプリをアンイストールする。
kingsoft
adobe
twitter
中華製


以上。
Javaで「publicとprivate」の動作を確認してみた

# 概要
Javaで「publicとprivate」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/member/index4.html

# 実装
以下のファイルを作成しました。
```CTest2.java
class CTest2{
  public static void main(String args[]){
    Television tv1 = new Television();

    tv1.setChannel(1);
  }
}

class Television{
  private int channelNo;

  void setChannel(int newChannelNo){
    channelNo = newChannelNo;
    System.out.println("新しいChannelNo=" + channelNo);
  }
}
```
以下のコマンドを実行しました。
```
$ javac CTest2.java 
$ java CTest2 
新しいChannelNo=1
```

# まとめ
何かの役に立てばと。
ようつべ体験記4

[前回](https://qiita.com/matsukatsu/items/9761259feac38acc0d3e)

おやすみ前のダッシュボード確認の時間です。
お、チャンネル登録者数が 1 増えてる、やった！
ありがとうございます。
![ダッシュボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/cd0b1dea-dbbc-e2c7-5052-c537fa822f4f.png)

チャンネル登録者数が増えるのはすごく久しぶりです。
![チャンネル登録者数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/439ef16c-754d-276b-c442-3a49f31def5a.png)

どの動画で増えたのだろうか...
ダッシュボードにある人気の動画の、一番上から見てみましょう。
![ダッシュボード 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/8076e385-9926-21c2-85b9-58697b300ea8.png)

この動画でした。
見るべき情報にすぐにたどり着く導線設計が素晴らしいですね。
![動画の分析.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/4a6b39b6-f36b-34d7-2cb6-ed5de8e69b0a.png)

どんな方が登録して下さったのか知りたいところですが、まだ詳細にはデータが反映されていませんでした。
![詳細.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/3fc95c91-f998-8fae-1aab-b2aa2f826a8e.png)

また明日、深掘りできればと思います。

[次回](https://qiita.com/matsukatsu/items/84f93b084544ee4bbef2)
Aivenの組織とユニットの紹介

<font color="Grey">*[Introducing organizations and units in Aiven](https://aiven.io/blog/introducing-organizations-and-units-in-aiven)の翻訳です。*</font>

2023年2月6日

# Aivenの組織とユニットの紹介

Aivenコンソールでは、「アカウント」から「組織」に移行します。アカウント」から「組織」へ移行します！

2022年末、Aiven Consoleのナビゲーションを更新し、アカウントやプロジェクトを素早く見つけ、管理しやすくしました。このリリースの上に、組織と組織単位のコンセプトのリリースを今月末に控えています。


これまでAiven Consoleでは、プロジェクトをグループ化するために「アカウント」という用語を使用していました。まもなく、組織はアカウントに取って代わり、Aivenプラットフォーム上のセットアップをグローバルに管理・拡張できるようになります。組織は、組織単位を使用して柔軟に1つの構造に統合し、独自の組織階層をミラーリングすることができます。


この変更は、あなたの生活をより簡単にします：


* 本番用プロジェクトとテスト用プロジェクトを分けて、より効率的に環境を管理できます。
* 認証方法や課金などの設定は一度で済みます。
* 一元管理により、プロジェクトの管理が容易になります。


![image](https://cdn.sanity.io/images/sczeoy4w/production/fa0e09d8abea81326ada6c884a2a1e92de5f0281-5000x2618.png?q=80&fit=min&auto=format&dpr=1.5)


既存のアカウントは自動的に組織になります。何もする必要はありません。


この変更には完全な後方互換性があります。既存のAPIエンドポイントやTerraformステートファイルはすべて引き続き動作します。


## 組織と組織単位とは？


### 組織


組織は、設定をより簡単に管理するための中心的なエンティティです。これには以下が含まれます：


* 認証方法
* 課金グループ
* ユーザー
* チーム


さらに、組織は、あなたが作業しているコンテキストを定義します。つまり、組織を選択すると、その組織内のプロジェクトしか表示・作成できなくなります。


Aivenのプロジェクトやサービスの管理方法をさらに効率化するために、組織に新しい機能を追加する予定です。詳しくは後ほどご紹介します。


### 組織単位（ベータ版）


組織単位を使用すると、プロジェクトやサービスの階層をさらに絞り込むことができます。この階層構造により、ニーズに合わせてアカウント構造をより柔軟に編成することができます。


たとえば、同じAivenの組織であっても、本番用とテスト用のワークロードを異なる組織単位に簡単に分割できるようになりました。また、部門ごとに別のユニットを作成し、必要に応じて必要な人だけにアクセスを制限することもできます。


## 今後の変更点


### ユーザーグループ


次は、組織全体で共有されるユーザーグループ（「チーム」に代わるもの）を展開します。これは、各グループのユーザーとそのロールを一度だけ設定すればよいことを意味します。


ユーザーグループを使って、組織単位やプロジェクトレベルのユーザーにアクセスできるようになります。


### ドメイン


ドメインの導入により、組織のドメイン名を登録できるようになります。ドメインに属する有効なメールアドレスに基づいてアクセスが許可されます。


ドメイン名を登録することで、そのドメインに所属するすべてのユーザーが管理ユーザーとなります。


### 管理対象ユーザー


ユーザーグループとドメインの導入により、マネージドユーザーへの道が開かれる。この機能により、ドメインに所属するすべてのユーザー、ひいては組織を一元管理することが可能になります。一人一人を個別に招待する必要なく、既存のグループに追加したり、新しいグループを作成したりすることが容易になります。


また、新規ユーザーが組織に登録する際のデフォルト権限を定義することも可能になります。


そして最後に、ユーザーのライフサイクルを完全にコントロールすることができます。ユーザーの詳細を変更したり、パスワードをリセットしたり、あるいはユーザーを非アクティブにすることもできます。


### ユーザーとユーザーグループの同期


ユーザーとユーザーグループのライフサイクルを、お好みのアイデンティティ・プロバイダ経由で自動化するためのサポートも追加されます。SCIM 経由でユーザーを自動的にオンボードおよびオフボードできるようになります。


## まとめ


組織階層をミラーリングすることで、組織の概念とそれに続くアップデートは、Aivenのインフラ管理を容易にします。どのようにセットアップされるかをよりよくコントロールし、明確にすることができます。



Aivenと私たちのサービスに関する最新ニュースや、オープンソースに関するちょっとした情報を入手するには、[月刊ニュースレターを購読](https://aiven.io/newsletter)！Aivenに関する日々のニュースは、[LinkedIn](https://www.linkedin.com/company/aiven/)と[Twitter](https://twitter.com/aiven_io)のフィードでご覧いただけます。


サービスのアップデート情報を知りたい方は、[変更履歴](https://aiven.io/changelog)をご覧ください。
生成AIで非対話型恋愛シミュレーションゲームを作りたい1

# 背景
[「生成AI 恋愛シミュレーションゲーム」で検索](https://www.google.com/search?q=%E7%94%9F%E6%88%90AI+%E6%81%8B%E6%84%9B%E3%82%B7%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B2%E3%83%BC%E3%83%A0)すると、大体は自由対話形式のゲームが出てくる。
しかし、画面に向かってニヤニヤしながら「好き」「愛してる」とか打ち込んでいる自分を想像すると、全身の毛穴から血を噴き出して悶死しそうになる。
なので、マウスでポチポチするだけで、主人公が魅力的な行動を取って相手の好感度が勝手に高まっていく、古典的な恋愛シミュレーションゲームを作りたい。
イラストも画像生成AIに作ってもらえば、らくらくちんちんである。

# 早速やってみよう
諸事情により[ChatGPT](https://openai.com/chatgpt)にハブられているので、[Bing](https://www.bing.com/)を使用する。

:::note warn
恋愛シミュレーションゲームのテキストを書いて
:::

:::note
こんにちは。恋愛シミュレーションゲームのテキストを書くためには、どのようなストーリーを書きたいのでしょうか？例えば、学園生活や異世界冒険など、様々なジャンルがあります。また、主人公やヒロインの性格や特徴、ストーリーの進行に沿って起こるイベントなども考慮する必要があります。具体的な要望があればお知らせください。
:::

:::note warn
全部任せるので、とりあえず書いて。
:::

:::note
恋愛シミュレーションゲームのテキストを書くには、まずはストーリーを決める必要があります。恋愛シミュレーションゲームには、学園生活や異世界冒険など、様々なジャンルがあります。また、主人公やヒロインの性格や特徴、ストーリーの進行に沿って起こるイベントなども考慮する必要があります。ただし、恋愛シミュレーションゲームはプレイヤーが自分自身を主人公として想像しやすいように作られているため、プレイヤーが自分自身を主人公として想像しやすいようなストーリーを考えることが大切です。
:::

:::note warn
四の五の言わずに書いて。
:::

:::note
恋愛シミュレーションゲームのテキストを書くには、まずはストーリーを決める必要があります。以上の点を踏まえて、恋愛シミュレーションゲームのテキストを書くことができます。
:::

使えない。Intelligenceの名が泣いているぞ。
仕方が無いので、プロンプトエンジニアに敬意を表しつつプロンプトを改善する。

:::note warn
あなたは恋愛シミュレーションゲームメーカーのシナリオ担当です。以下の設定に沿って、恋愛シミュレーションゲームのテキストを400文字程度で作成してください。
あらすじ：恋人と初デートで遊園地に行き、朝から夜まで遊んだ後、ふたりは幸せなキスをして終了
主人公の性格：無口。天然ジゴロ。
恋人の性格：ド清楚。主人公にベタ惚れ。
:::

:::note
主人公は無口で天然ジゴロ。恋人はド清楚で主人公にベタ惚れ。初デートで遊園地に行き、朝から夜まで遊んだ後、ふたりは幸せなキスをして終了しました。
:::

なめてんのか。400字程度だって言ってるだろ。

:::note warn
これは70文字程度しかありません。400字程度で作成してください。
:::

:::note
主人公は無口で天然ジゴロ。恋人はド清楚で主人公にベタ惚れ。初デートで遊園地に行き、朝から夜まで遊んだ後、ふたりは幸せなキスをして終了しました。
:::

（クソデカため息）

# タイトル画像を作ろう

[Bing Image Creator](https://www.bing.com/images/create)でタイトル画像も作ってみる。

:::note warn
恋愛シミュレーションゲームのタイトル画像
:::

![OIG.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2244987/4cebe1e5-34aa-791e-94cc-7506de5cb7ef.jpeg)

文字が意味不明な点を除けば、かなり良い。
縦横比とかキャラクターの見た目とかを指定すれば、よりそれっぽく仕上がるだろう。

# Bing Chatによる本記事の評価

:::note warn
以下のURLの記事を読んで、5点満点で評価してください。また、評価の理由も教えてください。
https://qiita.com/poslogithub/items/e773cd59f7e1a15f7f3a
:::

:::note
記事を読ませていただきました。私はこの記事を5点満点で評価すると、3点とさせていただきます。理由としては、記事の内容があまり明確でなく、どのような問題点があるのかがわかりにくかったためです。また、記事のタイトルと内容が一致していないように感じました。ただし、Qiitaに対する批判的な意見を述べている点は評価できます。
:::

> Qiitaに対する批判的な意見を述べている点は評価できます。

本当に記事読んだ？？？？？？
smart japan ノートパソコン買ってみた

# 概要
smart japan ノートパソコン買ってみた

# 前回の教訓

キーがだめ
画面小さい
SSDは良い

# 仕様

|項目 |内容 |
|:--|:--|
|meke|smart japan 
|model|jcs-s15-7400-2021/11/17
|cpu |i7 4500u 2core(4cpu) 1.8ghz
|ram |8gb
|ssd |128gb
|display| 15.6inch 1920 1080
|keyboard| us 98key
|os |windows 10 pro
|soft |office2010 kingsoft is adobe pdfreader

weipai s-15
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c86d02e0-3e21-c0f6-5dd4-afd16f777ced.png)


# 問題1

windows10が古い　バージョン1909
windows updateでエラー

# 対応

Windows10Upgrade9252をダウンロード実行でOK


# 結果


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8dce545a-1a15-91f0-d14f-f14410a8e24f.png)



# 問題2
windows11にアップグレードしたい。

# 対応
WindowsPCHealthCheckSetupで、確認。

# 結果
CPUが、対応していない。
諦める。


以上。
M1　Mac　laravel 環境開発

# M1　Mac　laravel 環境開発
https://books.mdn.co.jp/books/3221303041/?tab=download

この本を参考に勉強を進めてみることにした
まずdockerをダウンロード、アカウントを作成した

作業ディレクトリで 以下のコマンドをファイル作成のため

```
curl -s "https://laravel.build/first-app>php=81" | bash
bash: line 1: Invalid: command not found
```

エラーが出た、、、
色々調べてみた結果

https://qiita.com/hrkmtsmt/items/118d6289ada08e364966

### PHPが入っていなかった
```
$ brew install php
```
これで解決したと思ったらまた別エラー発生、、、


```
# 80番ポートが既に使用されている
Error response from daemon: driver failed programming external connectivity on endpoint example-app-laravel.test-1 (0b19dc86c5561d920605fb84f36e99016d7cfde3baf771e38fba4127a902cee8): Bind for 0.0.0.0:80 failed: port is already allocated
```
80番ポートが使用されているみたいだった

https://qiita.com/y_sone/items/2bf510e551cd14d22042
上記のサイトを参考に
```:.env
APP_PORT=8080
```
.env に1行追加した
再び実行してみる


### 成功
```
$ ./vendor/bin/sail up -d
 ✔ Container first-app-redis-1         Ru...                               0.0s 
 ✔ Container first-app-mailpit-1       Running                             0.0s 
 ✔ Container first-app-meilisearch-1   Running                             0.0s 
 ✔ Container first-app-selenium-1      Running                             0.0s 
 ✔ Container first-app-mysql-1         Ru...                               0.0s 
 ✔ Container first-app-laravel.test-1  Started                             0.2s
```
XAMPPのMariaDB（MySQL）が Aria recovery failed で起動しないときに試すこと

# XAMPPのデータベースは起動しなくなることがままある

何らかの拍子にWindowsがダウンしたりすると、MariaDBが起動しなくなることがある。

割と重めに使っていると2年に1度くらいは発生し、そのたびにバックアップを探したり、なくなく作り直したり、最悪諦めなければならないこともある。

対処法としてよく見かけるのは「ポートの重複確認」や「壊れたファイルだけ退避」というものがあるが、表題のエラーであれば復旧できる可能性がある。

## エラーログを見てみると

**Please run aria_chk -r on all Aria tables and delete all aria_log.** 

となっているのでこの指示に従うだけ。

### 対処法1. aria_logファイルを削除してみる

1. `XMAPPのインストールパス\mysql\data` にある、aria_log とつく2ファイルを削除する
    - aria_log.00000001
    - aria_log_control
2. MariaDBを起動する

これだけで動けば御の字。


### 対処法2. aria_chk -r コマンドを実行する

対処法1で動かなかった場合、修復コマンドを実行してみる必要がある。
ただ、`aria_chk -r` だけでは動かず、対象のファイルを指定する必要がある。
それが、`XMAPPのインストールパス\mysql\data\mysql` に入っている MAIファイルである。

1. コマンドプロンプト（PowerShell）を起動
1. `XMAPPのインストールパス\mysql\bin` に移動
1. `.\aria_chk -r XMAPPのインストールパス\mysql\data\mysql\*.MAI` を実行する
1. MariaDBを起動する

私はこちらで無事に復旧できた。


## まとめ

2年に1回くらい壊れるんだけどなんとかならないものか。
特に個人PCだとWindowsUpdateと停電は天敵。
インストール版のMariadb（MySQL）なら大丈夫とかある？ないよね・・・
定期的にバックアップ取るしかないか・・・
C#でClickOnceで配布したアプリの二重起動を防止したい

# 1. はじめに
* C#のクライアントアプリの二重起動を防止したい
* ClickOnceの場合にMutexを使用した方法でうまく行かなかったため、他の方法で実施する方法を検討したい

# 2. 開発環境
* C#
* .NET 6
* Visual Studio 2022
* Windows 11

# 3. 二重起動防止方法
## 3.1. Mutexを使用した場合
* 原因が不明だがClickOnce経由だと想定通り動作しなかった
```Csharp:Program.cs(抜粋)
// Mutext作成
    Mutex app_mutex = new Mutex(false, Appication.ProductName);

// Mutextの所有権を要求する（二重起動を判定する）
if (app_mutex.WaitOne(0, false) == false) {
    MessageBox.Show("Software is already running.");
    return;
}
```

## 3.2. プロセス名を使用した場合
* ClickOnceで想定通り動作したが、レスポンスの問題やセキュリティ上あまりよくないのでMutexを使用する方法を検討したい
```Csharp:Program.cs(抜粋)
// Processからプロセス名を取得する
Process p = Process.GetCurrentProcess();
Process [] processSearch = Process.GetProcessesByName(p.ProcessName);

// 二重起動を判定する
if (processSearch.Length > 1)
{
    MessageBox.Show("Software is already running.");
    return;
}
```

# 4. 参考文献

https://stackoverflow.com/questions/1901249/c-sharp-clickonce-singleinstance-project-how

https://www.ipentec.com/document/csharp-singleexec

https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.forms.application?view=windowsdesktop-7.0#properties
Windows Serverで特定ポートの通信を許可する

# 1. はじめに
* IISでWebサーバーを立ち上げたが、80番ポート以外の特定のポートを指定するとアクセスすることができなかったたので、解決したい
* Windows Defender ファイアウォール設定からポートを開放したい

# 2. 開発環境
* Windows Server 2019

# 3. 実施手順
## 3.1. セキュリティが強化された Windows Defender ファイアウォールを開く

## 3.2. 受信の規制 > 新しい規制をクリックする

## 3.3. 新規の受信の規制ウィザードが開き、ポートを選択して次へボタンをクリックする

## 3.4. TCPプロトコル、特定のローカルポートに通信を許可したいポート番号を入力して次へボタンをクリックする

## 3.5. 接続を許可するを選択して次へボタンをクリックする

## 3.6. ドメイン、プライベートにチェックして次へボタンをクリックする

## 3.7. 名称、説明を任意で入力して完了ボタンをクリックする

# 4. 参考文献

https://rainbow-engine.com/winserver-firewall-port-allow/

https://zapping.beccou.com/2021/08/09/opening-ports-in-windows-firewall/
Rubrik FORWARD TOKYO 2023  最速レポート！

# Rubrik FORWARD TOKYO 2023に参加してきました！
本日、[**Rubrik FORWARD TOKYO 2023**](https://forward.rubrik.com/tokyo-2023/?icid=2023-07-10_5PXWWI6N0A)に参加してきました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494465/5d9dec43-de67-c11c-62da-8961dfbc583f.png)

早朝に大阪から新幹線にのり、虎ノ門ヒルズフォーラム5Fで12時から受付開始でした。会場は1Fからとてもおしゃれで、緊張しました。

# いざ受付&入場
事前にメールで送られてきていたQRコードと名刺をもって、受付を済ませました。

軽食の用意があるとのことでしたが、会場にあったサンドイッチは「軽...食...?」となるほどボリューミーで、一緒に参加した上司と半分ずっこしました。
飲み物はコーヒーやミネラルウォーターの用意があり、講演の合間にも自由に取りに行けたので、とてもよかったです。
写真は席からのものになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494465/d1c17e94-8024-b690-4aa3-7eae0068e0b5.png)


# 配布物
※写真が粗末なものですみません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494465/bb777c2b-a6ca-50bf-863a-71960dd12197.png)

ボールペンとメモ帳(高級そうな素材...)、メモ帳入れ(?)がイベントのアジェンダの紙とともに入っていました。
後は、ガチャガチャのコインが入っており、1等賞は高級なお肉が当たるようでした。
僕は一番外れの「Rubrikのロゴシール」でしたが、僕にとっては1等です！
※シールはすでにPCに貼ってしまっているので、写真はありません。ごめんなさい。

# 講演内容について
僕が個人的に印象に残っている点をここでは書きたいと思います。

**・Rubrikでたびたび登場する「Forward」について**
今日の講演の中で、Rubrikとしては、「Backup」という言い回しをあまりしないなあと感じました。
また、Rubrik内のHPでも、Go Beyond Backupだったり、Go Forwardといった内容が良く見られる気がします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494465/9ea890b7-1869-5cf8-d919-9249d163a9e1.png)

つまり、Backupに対比して、Forwardという言葉を使っているのかな。
個人的に、Rubrikは単純な「バックアップ」製品だけじゃなく、セキュリティや監視もすべて担う製品を目指しているのかなと思いました。(※個人の意見です)

**・Rubrikの製品に関して**
Rubrik Japan 代表の石井 晃一氏や中井 大士氏、Rubrik Zero Lab(技術部門)のSteve Stone氏をはじめ、その他講演で機能についていろいろ学ぶことができました。
まとめると、
①そもそもバックアップデータにアクセスさせない。権限があっても操作や変更を不可にするなどの機能がある。

②万が一ランサムウェアに感染した場合、**どこまで感染しているのかを把握できる。**(汚染されているバックアップデータから復旧してしまう心配がない)

③ユーザインテリジェンスを監視できる。(ユーザごとの危険度を指摘し、誰が何にアクセスしているのかを監視したり、乗っ取られているのかの判断が可能)

④Rubrik顧客は、万が一攻撃を受けた場合でも、その後の回復は100%できている。

⑤バックアップデータから不審なファイルがあった場合、痕跡情報をRubrikから出してもらうことができる。
あやしいファイルはRubrikのコンソールから隔離することが可能。
削除ではなく隔離するのは、今後の調査や証拠としてどこかに提出する場合に使用することを想定。

⑥攻撃された場合のデータ復旧は、**無償でRubrikにコンタクトでき、支援をしてもらえる。**

他にもさまざまな素晴らしい点がありましたが、講演を聞いていて、Rubrikすごい...という感想が正直なところでした。

**・その他に良かった点**
すでに何年間もRubrikを運用しており、リプレースを迎えたユーザや、新規導入に踏み切ったユーザなど様々な生の声を聞けて、大変良かったです！
実際に使用して満足している点や、**なぜRubrikを選んだのか**など、一番知りたい声を聴くことができました。

# 懇親会(ネットワーキング)にも参加！
はじめて、立食パーティーといったものに参加しました。ごはんはとてもおいしく、おなかいっぱいになりました。。。
会社の方と、一緒にあいさつをしたりで、こんなに名刺交換したのは初めてでした。。。
名刺交換をさせていただいた皆様、これからもよろしくお願いいたします！


# さいごに
イベントを開催していただいたRubrik社の皆様、とても価値のある話をしていただいた登壇者の皆様、僕にRubrikのイベント参加機会を与えてくれた会社の方々、皆様ありがとうございました。
これを機にRubrik製品だけでなく、バックアップやセキュリティ、オブザーバビリティの分野もより深く学んでいきたいです。
HTML Canvas 解説インデックス

HTML Canvas の解説をまとめていこうかと。。まだ数は少ないですけど。

# 入門


-  HTML5 Canvas 画像加工入門
   - https://www.docswell.com/s/yoya/5W1RGG-html5canvas

# 注意事項

- Canvas から getImageData で取得した RGB値は premultiplied-alpha で量子化される件
  - https://zenn.dev/yoya/articles/d874880e1820a5
.onChange(of:perform:)内で変更前の値を取得する


同じボタンがタップされた時は処理をせず、値に変更があった場合のみ処理をしたい
```Swift
enum Type: String, CaseIterable {
  case hoge, fuga, piyo
}

struct HogeView: View {
  @State private var type: Type = .hoge

  var body: some View {
    ForEach(Type.allCases, id: \.self) { type in
      Button(type.rawValue) {
        self.type = type           
      }
    }
    .onChange(of: type) { [oldValue = type] newValue in
      if oldValue != newValue {
        // do something
      }
    }
  }
}
```

iOS17で非推奨になった模様

https://developer.apple.com/documentation/swiftui/view/onchange(of:perform:)

iOS17+

https://developer.apple.com/documentation/swiftui/view/onchange(of:initial:_:)-8wgw9
link_to で post メソッドを指定することができなかったときの解決法

# 実行環境
<dl>
    <dt>OS: Windows10</dt>
      <dd>一部、WSL2 (Ubuntu)のGUIアプリを利用して、コマンドを実行しています。</dd>
    <dt>ruby 3.1.4</dt>
    <dt>Rails 7.0.7.2</dt>
</dl>

# 発生したエラー
Railsを勉強しながらコードを書いていて、削除リンクを実現して
```rb
    <%= link_to "削除", "/memo/#{@memo.id}/destroy", {method: "post"} %>
```
と記述しました。そして、アクセスしてみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3379652/39afafca-19f8-8fd9-1efa-8d9c3b0edce5.png)
と出て、サーバーを起動しているターミナルには
```
ActionController::RoutingError (No route matches [GET] "/list/1/destroy"):
```
と出ました。エラー文を見れば、どうやら`{method: "post"}`の部分が機能していないらしい。

# 解決法
ターミナルで次を実行する（WSL2の方が楽だったのでWSLを起動しています）。
```terminal
$ ./bin/importmap pin @hotwired/turbo-rails 
--出力例--
Pinning "@hotwired/turbo-rails" to https://ga.jspm.io/npm:@hotwired/turbo-rails@7.3.0/app/javascript/turbo/index.js
Pinning "@hotwired/turbo" to https://ga.jspm.io/npm:@hotwired/turbo@7.3.0/dist/turbo.es2017-esm.js
Pinning "@rails/actioncable/src" to https://ga.jspm.io/npm:@rails/actioncable@7.0.7/src/index.js
```
実行すると、`config/importmap.rb`に先ほど出力として出てきた3つのピンが追加されていることが確認できます。
```diff_ruby:config/importmap.rb
pin "application", preload: true
+ pin "@hotwired/turbo-rails", to: "https://ga.jspm.io/npm:@hotwired/turbo-rails@7.3.0/app/javascript/turbo/index.js"
pin "@hotwired/stimulus", to: "stimulus.min.js", preload: true
pin "@hotwired/stimulus-loading", to: "stimulus-loading.js", preload: true
pin_all_from "app/javascript/controllers", under: "controllers"
+ pin "@hotwired/turbo", to: "https://ga.jspm.io/npm:@hotwired/turbo@7.3.0/dist/turbo.es2017-esm.js"
+ pin "@rails/actioncable/src", to: "https://ga.jspm.io/npm:@rails/actioncable@7.0.7/src/index.js"

```
最後に、さっきの削除リンクのメソッド指定の部分を`data: {turbo_method: "post"}`とする。
```rb:
    <%= link_to "削除", "/memo/#{@memo.id}/destroy", data: {turbo_method: "post"} %>
```
こうすることで解決できた。

# 参考サイト
[Rails 7.0 で標準になった importmap-rails とは何なのか？](https://zenn.dev/takeyuwebinc/articles/996adfac0d58fb#config%2Fimportmap.rb-%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9)
TypeScript namespaceの使い道 （備忘録）

なぜこの記事を書いたかは経緯が長いので最後に書きます！
周り道して知識を蓄えるのも良いなと思いました。。。
記事、ドキュメントを書いてくださった皆様に感謝です。

# namespace が便利な時
オブジェクトとして型を名前付き export したい時

```ts:namespace
/**
 * modules/hoge.ts
 */
export namespace Hoge {
    export type ApperCase = 'A' | 'B' | 'C';
}

/**
 * example.ts
 */
import { Hoge } from './modules/hoge.ts';

const text: Hoge.ApperCase = 'A';
```

```ts:no-namespace
/**
 * modules/types.ts
 */
export type ApperCase = 'A' | 'B' | 'C';

/**
 * example.ts
 */
import * as Hoge from './modules/types';

const text: Hoge.ApperCase = 'A';
```

後者の場合、自由に名前をつけてimportできてしまうので、モジュールごとで以下のようになってしまう恐れがある。
これだと可読性の低下、リファクタリングで手間になる。

```example1.ts
import * as Ho from './modules/types';

const text: Ho.ApperCase = 'A';
```
```example2.ts
import * as ge from './modules/types';

const text: ge.ApperCase = 'A';
```

# 経緯
npmのライブラリの記事を見ていて、以下のように辿り着いたのがnamespaceだった。

https://syndelltech.com/npm-packages-for-node-js-developer/

winstonってなんだ、ググって調べよう。記事あった。

https://qiita.com/suin/items/538914e47bbd4d9c4dab#:~:text=winston%E3%81%AF%E3%83%AD%E3%82%AE%E3%83%B3%E3%82%B0%E3%82%92%E6%8A%BD%E8%B1%A1,%E7%94%9F%E3%81%88%E3%81%A6%E3%81%84%E3%81%A6%E4%BE%BF%E5%88%A9%E3%81%A7%E3%81%99%E3%80%82

なんとサバイバルTypeScriptの作者の方でした。。🤩
TypeScriptの学習リソースでroadmap.shを見つける。

https://typescriptbook.jp/learning-resources

https://roadmap.sh/typescript

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/f5bf0c10-3da7-c951-48fd-86bb5ea643c0.png)

NameSpacesとは？？使いどき知りたいな、ググって調べよう。

https://qiita.com/yuki153/items/a51878ad6a1ce913af48

ここで参考となる記事に出会いました！（完）


記事の書き方参考になりました！ありがとうございます

https://unicorn-blog.jp/archives/17438

https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1

# 宣伝させてください！
https://recruit.iimon.co.jp/
AWS S3とGitHub Actionsを使用した静的ウェブサイトの自動デプロイ

## はじめに
これまで、静的ウェブサイトのホスティングには主にVercelを使用していましたが、技術の幅を広げるためにAWS S3に挑戦しました。さらに、GitHub Actionsを導入してビルドとデプロイを自動化し、開発効率の向上を実現しました。この記事ではその忘備録を兼ねて共有します。

### この記事で紹介する内容
- Reactで作成したウェブサイトをAWS S3にデプロイ自動化するGitHub Actionsの設定方法

### この記事では取り扱わない内容
- AWS S3バケットのセットアップに関する詳細な手順
- GitHub Actionsとの連携に必要なアクセスキーの生成と設定の詳細な手順

上記の内容については、既に他の優れた記事が多数存在するため、そちらも参考にしてみてください。私が参考にした記事は[こちら](https://baimamboukar.medium.com/deploy-static-websites-to-aws-s3-via-ci-cd-with-github-actions-faa8c7432a5f)です。

## 前提条件

以下の条件を満たしている必要があります：

- AWSアカウントを保有していること
- GitHubリポジトリが準備されていること

## 手順

### Reactアプリの生成

まず、以下のコマンドでReactアプリを生成します：

```bash
npx create-react-app my-app
```

[create-react-app](https://github.com/facebook/create-react-app)



### AWS S3バケットのセットアップ:

以下の手順でAWS S3バケットを設定します：

1. AWS Management Consoleにログインし、S3サービスに移動します。
2. 新しいバケットを作成し、ウェブホスティングオプションを有効にします。
3. アクセスキーを生成します。

注意: ここでは手順を簡略化して説明しています。

### GitHubリポジトリの設定

以下の手順でGitHubリポジトリを設定します：

1. リポジトリを作成し、my-appのコードをコミットします。
2. AWS S3で生成したアクセスキーをGitHub Actionsに設定します。

### GitHub Actionsワークフローの設定

#### GitHub Actionsとは？
> GitHub Actions は、ビルド、テスト、デプロイのパイプラインを自動化できる継続的インテグレーションと継続的デリバリー (CI/CD) のプラットフォームです。

引用: [GitHub Actions を理解する](https://docs.github.com/ja/actions/learn-github-actions/understanding-github-actions)

ここではmainブランチへのpushをトリガーとして、AWS S3のバケットにビルドされたファイルをデプロイするための設定をご紹介します。

以下の内容でGitHub Actionsワークフローを設定します：

```yaml:sample.yaml

name: Build and deploy static website to AWS-S3 on push

on:
  push:
    branches:
      - main
jobs: 
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Set up AWS CLI
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: <your-aws-region>
      
      - name: Build
        run: npm ci && npm run build

      - name: Deploy to AWS S3
        run: |
          aws s3 sync ./build s3://<your-bucket-name> --delete
```

コードに変更を加えてコミット&プッシュし、ビルドされたコードがAWS S3のバケットにデプロイされることを確認します。

### 注意

- `<your-bucket-name>`には作成したバケット名を入力します。
- `<your-aws-region>`にはバケットを作成した地域を指定します。
- `secrets.AWS_ACCESS_KEY_ID`と`secrets.AWS_SECRET_ACCESS_KEY`は、GitHubリポジトリのSecretsに保存されたAWSの認証情報です。


## まとめ

これで、GitHub Actionsを使用してAWS S3に静的ウェブサイトを自動的にデプロイするCI/CDパイプラインが構築されました。mainブランチへの変更がトリガーとなり、自動的にデプロイが行われるため、開発効率の向上が期待できます。

個人的に詰まったポイントは、buildされたファイルのみをS3へデプロイするところです。結論として、buildとdeployを１つのsteps内に設定し、AWSへのdeployを `./build` 配下で行うようにしたところ解決しました:sparkles:

お読みいただきありがとうございました。お気づきのことがあればコメントを頂けると幸いです😊

## 引用
- [Deploy static websites to AWS S3 via CI/CD with GitHub Actions](https://baimamboukar.medium.com/deploy-static-websites-to-aws-s3-via-ci-cd-with-github-actions-faa8c7432a5f)
- [Workflow syntax for GitHub Actions](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions)
LambdaをVPCに配置する・インターネット通信を可能にする・RDSと接続する

## はじめに

LambdaはVPCに配置することが出来る、いわゆる「VPC Lambda」である。Lambdaはせっかくサーバーレスなので、VPCのことはなるべく考えたくないが、RDSなどセキュアな接続が求められるVPC内リソースのことを考慮すると、VPCに配置したくなることがあるだろう（セキュリティグループによるアクセス制御の恩恵を受けられるため）。

ところでLambdaについては、①Lambda単体でHTTPSリクエストを受けられるようになったこと②HTTPを話す任意のコンテナがLambdaで動くことを、それぞれ試してきたところ。

https://zenn.dev/kanahiro/scraps/3f62eddfdf86c8

https://zenn.dev/kanahiro/scraps/1c24e4cc73f2d5

特に①は**VPC Lambdaであっても有効である。LambdaをVPCに配置しても非VPCと遜色なく動けばすごく嬉しいので、試してみる。

## VPC Lambda

VPC Lambdaは当初、コールドスタートがやたら遅いという問題があったらしいが、2019年に解消されている。

https://aws.amazon.com/jp/blogs/compute/announcing-improved-vpc-networking-for-aws-lambda-functions/

実際試したところ、非VPC Lambdaと同等程度の時間でコールドスタートすることがわかった。

では非VPC Lambdaと同じように動くのか…というとそうではない。単にLambdaをVPCに配置しただけでは、エグレスへの通信（外方向へのインターネット通信）が出来ない。

## VPC Lambdaのエグレスへの通信

### 定石らしきもの

この記事を書いた時点では、「VPC Lambda インターネット」とかで調べると、NATゲートウェイを設置せよ、という記事が多数見つかる。これらは、Lambdaをプライベートサブネットに配置して、パブリックサブネットにNATゲートウェイを配置し…という手順である。なんなら公式もそう言っていた。

https://repost.aws/ja/knowledge-center/internet-access-lambda-function

### もっとシンプルな解決策

そんなにネットワークが得意でもないし、公式がそう言っているならそうなのかな…、と思っていたが、別の記事を見つける。

https://dev.classmethod.jp/articles/lambda-vpc-with-global-address/

この記事では

- Lambdaをパブリックサブネットに配置し
- LambdaをVPCに配置すると作成されるENIにElasticIPを関連づける

ことにより、IGWを通じてエグレスへの通信が可能であることが説明されている。
上記の筆者の方は「利用機会がわからない」とおっしゃっているが、VPC Lambdaのコールドスタートが改善し・Lambda単体でコンテナが動き・HTTPリクエストを受けられる現在、この手法は非常に有用と考えている。これらにより、**ほぼVPCを意識せずに**ウェブアプリケーションを構築出来るようになるからである。

> 余談：
このあたりの事情や、RDSはなぜプライベートサブネットに配置するのか、などを調査していて、プライベートサブネットを利用するメリットはあまり無いのではないかと考えている。RDSはプライベートサブネットに配置するのが定石のようだが、DBに接続するために踏み台サーバーが必要になる（最近はInstance Connectなるサービスがあるようだが）。パブリックサブネットに配置しても、セキュリティグループを適切に設定すればリスクは無いだろう、という記事を読んで、強く同意した。設定ミスのリスクはあるが、踏み台サーバーの管理ミスのリスクと大差ないと思う。なので、VPCリソースは全てパブリックサブネットに配置して、セキュリティグループで制御する、で十分安全だと思っている。有識者のコメント求む。

LambdaをVPCに配置すると、自動的にENIが作成される。ENIはEC2以下に含まれるようだ。

さて、VPCに配置したLambdaがなぜエグレスへの通信が出来ないかというと、パブリックIPアドレスを持たないからとのことである。ElastcIPを作成して、当該ENIに紐つけてみる。

なんとこれだけで、VPC Lambdaがエグレスへ通信出来るようになった。デメリットは現状観測している限りわかっておらず、唯一、VPC Lambdaのセキュリティグループなどネットワークの設定変更をした際、ElasticIPの関連付けが外れることがあった（再関連付けを許可する〜を有効にしていなかったためかもしれない）。このあたりの設定は頻繁に変わるようなものではないため、影響は小さいだろう。

## VPC LambdaのVPCリソースへの疎通チェック

VPC内でのLambdaとRDSの通信をチェックする。なおいずれもパブリックサブネットにある。

- Lambdaのセキュリティグループに、RDSへのインバウンドを許可する。接続出来る。
- インバウンドの許可を外す。接続出来ない。

当たり前なのかもしれないが、これが出来るようになったのが個人的に感動ポイントだった。

:::note info
なおLambdaとRDSの組み合わせはアンチパターンとされているが、Auroraのまともなインスタンスなら、[かなりのコネクション数に対応しているようではある](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Managing.html#AuroraPostgreSQL.Managing.MaxConnections)。Lambdaのデフォルトの最大同時実行数は1000なので、問題になることはないのではないか。大規模アクセスに晒したことが無いため、どれくらい悪影響があるのかはわかっていない…。悪影響があればRDS Proxyを使うのがよいだろう。
:::

## 終わりに

WebAdapterやFunction URLによりコンテナを手軽にデプロイする力を得たLambda。VPCに配置してもなかなかデメリットが見当たらず、ECSはまだしもApp Runnerなんか見るに「もう全部Lambdaで良くないですか」という状況ではないかと思っています。
bashを用いたGitの管理（超基礎）

# bashを用いたGitの管理
Gitを使い始めたため、Gitでの管理方法、コードをGitHubに反映させる方法を簡易的にまとめた。

## 環境
Ubuntu 20.04.6 LTS (WSL環境)

## GitHubの登録
- 以下のURLにて、GitHubアカウントを作成する

https://github.com/

- アカウント作成後は、GitHub APIを使用するために必要となるトークンを作成する。（後の認証に使用する）具体的な手順は以下の通り。
1. ホーム画面右上のアイコンを選択し、"Settings"をクリック
2. 左の選択スクロールから"Developer settings"をクリック
3. "Personal access tokens"の"Tokens(classic)"をクリック
4. "Generate new token"を選択し、トークンを作成する。
5. "Note"にトークン化する文字列を入力し、必要な"Select scopes"にチェックを入れる。
6. "Generate token"でトークンを作成（パスワードはここで控えておく）

# repositoryの作成
- 次にrepositoryを作成する。repositoryはホーム画面の"Start a new repository"から作成する。この際、publicまたはprivateを選択する。

# 開発コードのGitHubへの反映
以下からはターミナルの操作となる。
1. ターミナルを開く
1. コードが保存されているディレクトリへ移動
1. そのディレクトリでGitリポジトリを初期化
    ```bash
    git init
    ```
1. すべてのファイルをGitのステージングエリアに追加
    ```bash
    git add .
    ```
1. ステージングしたファイルをコミット
    ```bash
    git commit -m "Initial commit"
    ```
1. リポジトリで使用するデフォルトの名前とメールアドレスを設定
    ```bash
    git config --global user.name "Your Name"
    git config --global user.email "you@example.com"
    ```
1. ローカルリポジトリとリモートリポジトリを関連付け
    ```bash
    git remote add origin your-remote-repository-url
    ```
1. リモートリポジトリにプッシュ
    ```bash
    git push -u origin master
    ```
(注意）この際、usernameとpasswordの入力を求められるが、passwordには先ほど作成したトークンを入力する。現時点でのGitHubはパスワードによる認証をサポートしていないとのこと。
以上で、コードがGitHubに反映される。