OmniAICreator/Qiita-1.07M huggingface dataset:
Gatsby + Github-pages 最速公開メモ

Gatsby Starter等も何も設定しない、Pathもいじらない、限りなくプレーンに近い状況で最速公開するためのメモ。

## 1. Githubでリポジトリを作る
なんか```<username>.github.io```というリポジトリを作ると良い、みたいなTipsもあるらしいがよくわかんないので、とりあえず好きなリポジトリ名で作ると良いと思います
## 2. gatsby newで作ったものをその中にぶちこむ
## 3. gh-pagesを追加
```terminal
npm install gh-pages --save-dev
```
## 4. package.jsonを編集する
```package.json
  "scripts": {
    ...,
    "deploy": "gatsby build && gh-pages -d public"
```
## 5. deployする
```yarn deploy```

## 6. Github側のリポジトリの設定をする
自分の場合これが済んでなくていつまで経っても404だった
```Pages -> Github Pages -> Source -> Deploy from a branch -> gh-pages```
![Screenshot 2023-06-17 at 18.31.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580849/6fc774b0-85a4-99af-036d-f359f273c762.png)

## 7. もっかいdeployする
```yarn deploy```
※やらんでもいけるかも

## 8. 公開確認する
```<user-name>.github.io/<repository-name>```を見ると公開されてるはずです。

```hrism```が作った```me```というリポジトリのURLは```https://hrism.github.io/me/```になるという具合です。

おしまい。
生成AI使ってサカバンバスピスを鮮魚コーナーに並べてみた

# サカバンバスピスとは？

2023年6月現在、日本のSNSで大流行している絶滅動物です。
大昔に水の中に住んでいた手のひらサイズの魚的な生き物のようです。

https://ja.wikipedia.org/wiki/%E3%82%B5%E3%82%AB%E3%83%90%E3%83%B3%E3%83%90%E3%82%B9%E3%83%94%E3%82%B9

フィンランドのヘルシンキ自然史博物館に展示されている模型を古生物学研究者の方が撮影したツイートがきっかけで、生き物紹介系のネットメディアを介して話題が広がっていました。

https://togetter.com/li/2165080


# 鮮魚コーナーに並べる方法

今流行りの生成AIを活用しました。
具体的には、AWSのSageMaker Studioを使って画像生成モデルStable Diffusionをファインチューニングすることにより、鮮魚コーナーに並ぶサカバンバスピスの画像生成を試みました。


### 簡易手順

詳細は以下の記事をご参照ください。

https://qiita.com/minorun365/items/fdf5e7fb7ae96157e226

- AWSマネジメントコンソールにログインし、SageMaker Studioを起動する
- SakeMaker JumpStartから「Generation fun image of your dog」ノートブックをインポートする
- サーバー上に `training_images` フォルダーを作成してサカバンバスピスの適当な画像5枚をアップロードする
- ノートブックを以下のとおり編集して実行する
    - 学習させる画像の `instance_prompt` の値を "A photo of finnish Sacabambaspis" に変更
    - 生成する画像の `all_prompts` の値を "A photo of finnish Sacabambaspis in fresh fish corner in a supermarket" に変更


### 工夫したポイント
サカバンバスピス自体は以前から知られており、今回流行しているビジュアルとは別の画像がすでに学習されている可能性があるため「finnish Sacabamcaspis（フィンランドのサカバンバスピス）」というプロンプトにカスタムしてファインチューニングしました。



# 生成された画像

あ、そこに並ぶ感じ？ｗ
![スクリーン ショット 2023-06-17 に 19.06.52 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/f8aa66e4-042e-d537-8ade-bfbcb7b16d21.png)

こんな尖ってたっけ…？
![スクリーンショット 2023-06-17 18.34.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/7fa8a738-15f1-44b2-c18b-79bbfc177529.png)

お、フォルムは近いけど場所がなんか違う…ｗ
![スクリーンショット 2023-06-17 18.35.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/415448eb-6f4c-9de5-5e9d-580241ebfd92.png)

なんかスーパーマーケットまで北欧風になってしまったような？
【エラー】MySQLに接続できない

# エラー内容

```zsh
$ mysql -u root
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```

# 原因

別のデータベースに切り替える際に毎回再起動しないと行けないらしい

# 解決方法

MySQLの再起動

```bash
$ sudo mysql.server restart
```

## もし再起動ができない場合

「プロセスのIDが記録されているPIDファイルがない」というエラーが起きた。

```zsh
$ sudo mysql.server restart
 ERROR! MySQL server PID file could not be found!
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/sample.local.pid)
```

この場合以下の2つどちらかが原因になるよう

1. pidファイルが存在していない
2. pidファイルに適切な権限が設定されていない

### 1. の場合

Macの場合、ホスト名が明示的に設定されていない場合にネットワークが変わるとホスト名も変わってしまうらしい。

解決方法としては下記に記載
```zsh
// ホスト名を確認(ないよっていわれるはず)
$ sudo scutil --get HostName

// ホスト名の設定
$ sudo scutil --set HostName sample

// sample.local.pidファイルを作成
$ touch /usr/local/var/mysql/sample.local.pid
```

### 2. の場合

/user/local/var/mysql以下のファイルの所有者をすべて_mysqlにする

```zsh
sudo chown -R _mysql:_mysql /usr/local/var/mysql/
```
※自分のパスは`/opt/homebrew/var/mysql`でした。

## その他の対応が必要な場合も

https://www.gaji.jp/blog/2022/08/03/10687/

https://qiita.com/carotene4035/items/e00076fe3990b9178cc0

https://qiita.com/fujitora/items/d341c52706d1954cae28
realsenseを使う

realsenseをrosで動かすために色々インストールしたメモ

# 一連の流れ
1. [librealsenseのインストール](#librealsenseのインストール)
2. [ros rappersのインストール](#ros-rappersのインストール)

# librealsenseのインストール
:::note info
普通のPCとRaspberryPiやJetsonNanoのような**armプロセッサ**のPCではインストール方法が異なるので注意
:::
普通のPCにインストールする方法でラズパイなどにインストールすると，エラーが出て動かなかったり，びみょーに動くけど使えなかったりするので注意！

## 普通のPCにインストールする
1. サーバの公開鍵を登録
    ```
    $ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE || sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE
    ```
2. リポジトリにIntelサーバを登録
    ```
    $ sudo add-apt-repository "deb https://librealsense.intel.com/Debian/apt-repo $(lsb_release -cs) main" -u
    ```
3. 各種インストール
    ```
    $ sudo apt update
    $ sudo apt upgrade
    $ sudo apt install librealsense2-dkms
    $ sudo apt install librealsense2-utils
    $ sudo apt install librealsense2-dev
    $ sudo apt install librealsense2-dbg
    ```

4. 動作確認
    以下のコマンドを入力して，realsenseSDKのアプリが起動＆ステレオカメラとRBGカメラの両方が映ることを確認．
    場合によっては，アプリのバージョンアップを進めるポップアップが出るので，そのときはそれに従って更新する（更新にトラブったときはこちら）
    ```
    $ realsense-viewer
    ```
5. 動作確認その２
    realsenseのバージョンとかが表示されればOK（表示されなくても，ivがうまく動いていればOKらしい）
    ```
    $ modinfo uvcvideo | grep "version:"
    ```
## RaspberryPiなどにインストールする
コードをダウンロードしてビルドする．めちゃくちゃ時間がかかる．
```
$ git clone https://github.com/IntelRealSense/librealsense.git
$ cd librealsense/
$ sudo apt install -y git libssl-dev libusb-1.0-0-dev pkg-config libgtk-3-dev
$ sudo apt install -y libglfw3-dev libgl1-mesa-dev libglu1-mesa-dev
$ sudo apt install -y cmake
$ ./scripts/setup_udev_rules.sh
$ ./scripts/patch-realsense-ubuntu-lts.sh
$ mkdir build && cd build
$ cmake ../
$ sudo make clean && make && sudo make install
```

:::note info
`./scripts/patch-realsense-ubuntu-lts.sh` を実行中に`fatal:you need to specify a tag name` というエラーが発生場合，
`cmake ../` 部分を　`cmake ../ -DFORCE_RSUSB_BACKEND=true -DCMAKE_BUILD_TYPE=release -DBUILD_EXAMPLES=true -DBUILD_GRAPHICAL_EXAMPLES=true` に変更すればOK
:::

最後に起動できるか確認
```
$ realsense-viewer
```

# ros rappersのインストール
これは普通のPCもラズパイなども同じやり方
```
$ cd ~/catkin_ws/src
$ sudo apt install ros-melodic-ddynamic-reconfigure
$ git clone https://github.com/IntelRealSense/realsense-ros.git
$ cd realsense-ros/
$ git checkout `git tag | sort -V | grep -P "^2.\d+\.\d+" | tail -1`
$ cd ../../
$ catkin init
$ catkin clean
$ catkin config --cmake-args -DCATKIN_ENABLE_TESTING=False -DCMAKE_BUILD_TYPE=Release
$ catkin buildsource
$ source devel/setup.bash
```
最後に動くか確認
```
$ roslaunch realsense2_camera rs_camera.launch
```
DockerでPostgreSQLの日本語設定

# はじめに
PostgreSQLでの日本語設定で生じたエラーについて紹介します。
本記事の対象者はRDBS初心者・エンジニア初心者・Docker初心者です。

# 前提
リレーショナルデータベースシステム（RDBMS）は、データを構造化された形で保存し、効率的なアクセスと操作を可能にします。しかし、異なる言語のデータを扱う場合、特に重要な2つの要素があります。**エンコーディング**と**ロケール**です。

### エンコーディング
 データベースのエンコーディングは、文字データがどのようにバイトに変換されるかを決定します。日本語を含む多くの言語をサポートするためには、エンコーディングは通常UTF-8に設定されます。UTF-8は、ASCII文字だけでなく、多くの特殊文字や記号、そして多くの言語の文字を含むことができます。

### ロケール
ロケールは、特定の地域や言語に関連する動作を制御します。これには、文字列のソート順や日付/時間のフォーマットなどが含まれます。例えば、"ja_JP.utf8" ロケールは、日本のソート順や日付/時間のフォーマットを適用します。

要約すると、
**エンコーディング**：文字をバイト（またはビット）の列に変換する方法を定義します。エンコーディングには様々な種類があります。
**ロケール**：特定の地域や言語に関連するソフトウェアの動作を制御します。ロケールの設定により、同じソフトウェアでも異なる地域や言語のユーザーに適した動作を提供することができます。

# PostgreSQLの日本語設定時に生じたエラー

Apacheウェブサーバーがプリインストールされている公式のPHP Dockerイメージをwebサーバーとして、公式のPostgreSQL DockerイメージをDBサーバーとして環境を立ち上げようとしました。


```yml:docker-compose.yml
version: '3'
services:
  web:
    image: php:7.4-apache
    volumes:
      - .:/var/www/html
    ports:
      - 8080:80
  db:
    image: postgres:13
    environment:
      - POSTGRES_DB=${POSTGRES_DB}
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_INITDB_ARGS=--locale=ja_JP.utf8
    volumes:
      - postgres_data:/var/lib/postgresql/data/
      - ./db-init:/docker-entrypoint-initdb.d
```
docker-compose up したところ、下記のエラーが発生しました。
```
The files belonging to this database system will be owned by user "postgres".
security_php-db-1          | This user must also own the server process.
security_php-db-1          | 
security_php-db-1          | initdb: error: invalid locale name "ja_JP.utf8"
security_php-db-1 exited with code 1
```
初期化プロセス（initdb）が "ja_JP.utf8" というロケール名を認識できないというエラーです。
# 原因
PostgreSQLの公式Dockerイメージはデフォルトで "ja_JP.utf8" ロケールをサポートしていないことが原因でした。

```
- POSTGRES_INITDB_ARGS=--locale=ja_JP.utf8
```
この行が正常に動作するためにはDockerイメージが "ja_JP.utf8" ロケールをサポートしていることが必要です。

# 解決方法
カスタムのDockerfileを作成して "ja_JP.utf8" ロケールを追加します。
```Dockerfile:Dockerfile
FROM postgres:13
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
    && localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LANG ja_JP.utf8
```

```yml: docker-compose.yml
db:
  build:
    context: .
    dockerfile: Dockerfile
  environment:
    - POSTGRES_DB=${POSTGRES_DB}
    - POSTGRES_USER=${POSTGRES_USER}
    - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
  volumes:
    - postgres_data:/var/lib/postgresql/data/
    - ./db-init:/docker-entrypoint-initdb.d

```
# まとめ
Dockerを使用してPostgreSQLのコンテナを立ち上げる際に、日本語のロケール "ja_JP.utf8" を設定する方法とその重要性について説明しました。エンコーディングとロケールはRDBSにおいて重要事項なのでとても勉強になりました。

# 参考

https://qiita.com/fujii_masao/items/2a715fb5a3f718d22ab4
Device mapper (dm-linear)の使い方

## 実験内容
Device mapperを用いて複数の物理ブロックデバイスを１つの論理ブロックデバイスとして見せる。
まず1つ目のブロックデバイスだけを使ってdm-linear論理デバイスを作成して、あとから2つ目のブロックデバイスを追加した場合の挙動(結合前に入っていたファイルは残っているのか)を確認する。

## 手順
1. ループバックデバイスの作成
    ```
    # 1つ目のブロックデバイス作成
    $ dd if=/dev/zero of=disk1 bs=512 count=1000
    $ sudo losetup -f disk1

    # 2つ目のブロックデバイス作成
    $ dd if=/dev/zero of=disk2 bs=512 count=1000
    $ sudo losetup -f disk2

    # ループバックデバイスが存在していることを確認
    $ losetup -l
    NAME        SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                                        DIO LOG-SEC
    /dev/loop9          0      0         0  0 /home/askee/temp/disk1                            0     512
    /dev/loop10         0      0         0  0 /home/askee/temp/disk2                            0     512
    ```
    ループバックデバイスの番号は後ほど使用する。

1. 1つ目のブロックデバイスでdm-linearデバイスを作成する
    ```
    $ echo "0 `sudo blockdev --getsz /dev/loop9` linear /dev/loop9 0" | sudo dmsetup create testdm
    ```

1. dm-linearが生成されていることを確認
    ```
    $ sudo dmsetup info
    Name:              testdm
    State:             ACTIVE
    Read Ahead:        256
    Tables present:    LIVE
    Open count:        0
    Event number:      0
    Major, minor:      253, 0
    Number of targets: 1
    ```

1. testdmをext4でフォーマット
    ```
    $ sudo mkfs.ext4 /dev/mapper/testdm
    ```

1. マウントしてファイルを置く
    ```
    $ sudo mount /dev/mapper/testdm /mnt
    $ sudo touch /mnt/testfile
    $ sudo umount /mnt
    ```

1. dm-linearにブロックデバイス2を追加
    以下のスクリプトを作成してtest.shとして保存。echo... の部分ではdmsetupに与えるテーブルを作成している。
    ```
    #!/bin/sh
    size1=`blockdev --getsz $1`
    size2=`blockdev --getsz $2`
    echo "0 $size1 linear $1 0\\n$size1 $size2 linear $2 0" | sudo dmsetup reload testdm
    ```

1. 新しいテーブルを反映させるためには、一度デバイスをsuspendさせる必要がある。
    ```
    $ sudo dmsetup suspend testdm
    ```

1. スクリプトを実行
    ```
    $ chmod 755 ./test.sh
    $ sudo ./test.sh /dev/loop9 /dev/loop10
    ```

1. デバイスをresume
    ```
    $ sudo dmsetup resume testdm
    ```

1. testdmのext4ファイルシステムのサイズを更新する。現時点ブロックデバイス1の分しかフォーマットされていないのでブロックデバイスサイズの拡大に伴いリサイズが必要。
    ```
    $ sudo resize2fs /dev/mapper/testdm
    ```
    - もし```Please run 'e2fsck -f /dev/mapper/testdm' first.```の警告が出力されたら先にe2fsckコマンドを実行して、resize2fsを再実行。
        ```
        $ sudo e2fsck -f /dev/mapper/testdm
        e2fsck 1.45.5 (07-Jan-2020)
        Pass 1: Checking inodes, blocks, and sizes
        Pass 2: Checking directory structure
        Pass 3: Checking directory connectivity
        Pass 4: Checking reference counts
        Pass 5: Checking group summary information
        /dev/mapper/testdm: 12/64 files (0.0% non-contiguous), 12/125 blocks
        ```

1. マウントして、結合前に作成しておいたファイル(testfile)が残っていることを確認。
    ```
    $ sudo mount /dev/mapper/testdm /mnt
    $ ls -al /mnt
    ```
1. ディスク容量が増えていることを確認
    ```
    $ df -ah | grep testdm
    /dev/mapper/testdm  976K   24K  884K   3% /mnt
    ```
放置していた中華ノートにChromeOS Flexをインストールしてみる

## きっかけ
ある日から、起動してもログイン画面が表示されず真っ黒のままで沈黙するようになり、修復やOS再インストールなどを行なってもログイン画面が真っ暗なままで放置されていた、中華PCが手元にあった。
そのまま数週間ほど放置していたが、最近「ChromeOS Flex」というChromeOS?がフリーで使えるらしいので、試しにこの置き物と化していたノートPCにインストールし、再利用できるようにしてみる。

https://ascii.jp/elem/000/004/141/4141199/


## USBインストーラの準備
公式からOSをインストールするしてUSBから起動できるようにする必要があり、そのインストールUSBを作るインストーラが[chrome拡張](https://chrome.google.com/webstore/detail/chromebook-recovery-utili/pocpnlppkickgojjlmhdmidojbmbodfm)として公開されている。元々クロームOS用の拡張を流用しているように見える。
![スクリーンショット 2023-06-17 11.05.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473989/dbb4e4d9-b872-cc0a-661b-0877fbfb9ba2.png)

今回は手元にあったマイクロSDをtype-Cの変換コネクタ経由で入れた。書き込み30~40分くらいで完了。最低８GB必要で使用したマイクロSDの容量が8GBで不安だったが、容量不足ですと言われずに作成できてホッとした。

## USBインストーラからインストール
書き込んだSDカードをインストールする中華PCに繋ぎ、BIOS起動するとインストーラ画面が自動で開く。あとは指示に従って進め、wifiのパスなどを入れてネットにつなぎ、セットアップを行ったら起動した。特に詰まるところがなかったので書くことがない

## はじめに調べたこと
* ディスプレイ拡張が普通にできた。デュアルディスプレイで、セカンドディスプレイを縦向きに置いている場合でも設定からディスプレイの角度と画面端の位置を、macとほぼ同じ操作で変更できる
* 日本語/英語切り替えは`ctrl+space`でできた
* タッチパッドのスクロールの向きは設定>デバイスから逆スクロールを有効にするをチェックで変更できる
* タスクバーの自動で隠す・位置変更はタスクバーを右クリックから変更可能
* タブ切り替えは三本指でタップしながら左右にスワイプ
* タブを三本指でタップすると閉じる

## 終わりに
触り始めたばかりだけど、全然触り心地に違和感がない。2in1のノートなので画面を直接タップもできるが、それも普通に動いていてケチをつけることがない。もちろん本格的な開発やアプリは使えないが、ブラウジング専用のセカンドPCとしてなら十分すぎる印象がある
RubyでAtCoder ABC240(A, B, C, D)を解いてみた

# はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC240のA, B, C, Dを解きました。備忘録として解き方をまとめていきたいと思います。

# A - Edge Checker
https://atcoder.jp/contests/abc240/tasks/abc240_a
```ruby:a-240.rb
a, b = gets.split.map(&:to_i)
puts (a == 1 && b == 10) || b == a + 1 ? "Yes" : "No"
```

# B - Count Distinct Integers
https://atcoder.jp/contests/abc240/tasks/abc240_b
```ruby:b-240.rb
gets.to_i
puts gets.split.uniq.size
```

# C - Jumping Takahashi
https://atcoder.jp/contests/abc240/tasks/abc240_c
```ruby:c-240.rb
n, x = gets.split.map(&:to_i)
dp = Array.new(n + 1){ Array.new(x + 1, false) }
dp[0][0] = true

n.times do |i|
  a, b = gets.split.map(&:to_i)
  (x + 1).times do |j|
    if dp[i][j]
      dp[i + 1][j + a] = true if j + a <= x
      dp[i + 1][j + b] = true if j + b <= x
    end
  end
end
puts dp[n][x] ? "Yes" : "No"
```
## 解説
dp[i][j] := i回ジャンプした後に座標j(j <= x)に移動できるかとしたdpを使って解くことができます。

# D - Strange Balls
https://atcoder.jp/contests/abc240/tasks/abc240_d
```ruby:d-240.rb
gets.to_i
a = gets.split.map(&:to_i)

ball_counter = [[1, 0]]
count = 0
a.each do
  count += 1
  if _1 == ball_counter[-1][0]
    ball_counter[-1][1] += 1
    if _1 == ball_counter[-1][1]
      count -= _1
      ball_counter.pop
    end
  else
    ball_counter << [_1, 1]
  end
  puts count
end
```
## 解説
（他の方の提出結果を参考にしました）

`ball_counter`配列を用意して要素を`[x, y] := [今いるところのボールに書かれた数字, 同じ数字が連続した回数]`のようにしておきます。後は、随時値を更新していき、同じ数字が連続した回数とボールに書かれた数字が一致している時は`count`からその個数分引くことで答えを求めることができます。

https://qiita.com/shoya15/items/50fd17e37d7c64f2b166
[PHP] メモリの解放条件

# メモリとは
メモリとは、コンピュータにおいてプログラムやデータを記憶する装置のことである。
よく机に例えられて説明されることが多いが、そのメモリに`不要なデータが解放されずに残り続けることによって、メモリオーバーのエラーになる`ことがある。

その不要なメモリを解放するためについて、簡単に以下にまとめる。

この記事の参考資料↓

https://qiita.com/genie-oh/items/7cb3250a2923d0d3121c

# メモリが解放される条件(変数)
定義した変数のデータは、解放されない限りメモリに残り続ける。

`
◎解放される条件は以下の通り↓
`

- 「実際のデータの参照が一つ無効になる」時、zvalの参照カウント(zvalのrefcount)を-1した結果、0であればデータはメモリから消滅する。
- Garbage Collection Cycleの結果、参照カウントが0であれば、データはメモリから消滅する。

※詳しくは先ほどのリンクを参照！

:::note warn
まあ、定義した変数が全て使い終わったら…、というイメージで捉えておく。
:::

### 1) 変数の有効範囲の消滅
変数の使用できる範囲から逃れる時、その有効範囲自体の消滅と同時に、変数は解放され、実際のデータの参照も無効になる。
```php
function sampleFunc() {
    $local = 'a'; //$localは、function{}の範囲内で有効です。
}
sampleFunc(); // 関数の遂行が合わったあと、a関数内の$localは自動的に解除されます。
```

### 2) 明示的な変数シンボルの解除(unset)
phpでは、変数を明示的に開放できるunset()という関数がある。
```php
unset(＄local) : void
```
### 3) 変数シンボルの参照再設定
変数シンボルの参照が再定義されると、以前の参照は無効になる。
```php
$a = array(0);
$a = array(1); //この時、$aの変数の参照がarray(1)に上書きされ、array(0)に対する参照は無効になる。
```
# メモリが解放されない条件
- 「実際のデータの参照が一つ無効になる」時、参照カウント(refcount)が「1以上」であれば、データは消滅せずに残り続ける。

### 1) 同じスコープで、同じデータを参照する変数がある場合
同じ関数内などの同じスコープで、同じデータを参照する変数が複数存在する場合、一つの変数が解放されても、データは消滅しない。
```php
$a = array(0);
$b = $a;

unset($a); 
var_dump($b); //$aの変数を解除しても、$bがarray(0)の参照を持っているため、消滅しない。 
```
### 2) 違うスコープで、同じデータを参照する変数がある場合
関数の引数として渡された場合などは、上位スコープでまだデータを参照しているため、現在のスコープから変数が解除されても、データは消えない。

```php
function sampleFunc(object $obj) {
    unset($obj); 
    //現在のスコープの$objに対する参照は解放される。
    //しかし、上位スコープにいる$aの変数の参照がまだ有効なため、データは消滅しない。
}

$a = array(0); //　このarray(0)は残っている。
sampleFunc($a);
```
### 3) compound typeの変数の内部で、同じデータを参照する変数がある場合
array, objectなどのcompound typeは、内部にデータは参照を持つことができる。
その内部でデータを参照していると、データは消滅しません。
```php
function x(object $obj) {
    $data = array(0); 

    $obj->data = $data;
    //$dataは、x関数の遂行後に解除されますが、stdClassのインスタンスのメンバーとして、array(0)データを参照することになり、データは消滅しません。
}
$a = new \stdClass;
x($a);
```

# 最後に
メモリの概念を理解することで、効率よくデータを扱えそうなので、勉強していきたい。
また、メモリリーク、ガベージコレクションについての記事もまとめる。
eclipse maven ライブラリDL場所変更方法メモ

## 設定ファイルを作成
Mavenの公式サイト

https://maven.apache.org/settings.html#simple-values

1. メモ帳を開き、Quick Overviewに記載されているソースをコピペ

1. localRepositoryタグに好きなフォルダを指定
例：\<localRepository>C:\pleiades\maven-localRepository\</localRepository>
※デフォルト：${user.home}/.m2/repository（C:\Users\（ログインユーザー）\\.m2）

1. 適当な場所に保存

1. eclipseを開く、ウィンドウ → 設定 → Maven → ユーザー設定
グローバル設定にさっき保存したファイルを指定
※Quick Overviewに書いてあるとおり、グローバルとユーザーがあったらマージされてユーザー設定が優先される。

1. 再度プロジェクトの maven install を実行
※maven install がなかったらマーケットプレイスからm2eをダウンロード
※デフォルトフォルダにダウンロードしたファイルはそのまま残ってる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2713217/2996a182-f1bc-1c2e-f538-5b19f5ace917.png)
【自作アプリ】実装機能➂

今回はログイン部分の機能について解説していこうと思います。

私のアプリケーション作成で使用しているものはSHA256になります。
SHA256とは何かという事ですが「ハッシュ化」という意味で256はハッシュ化する際のbit数になります。
実際に使用しているものが以下のものになります。
#### ハッシュ化
```java
//CipherUtils.java
public static String encrypt(String target) {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            md.update(target.getBytes());
            return Base64.encodeBase64URLSafeString(md.digest());
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }

```

encript(String 引数)で暗号化する対象を取得しハッシュ化します。
例)ユーザー新規登録の際にDBに保存する時に使用
ログイン時、DBのデータと照合する際に使用

そもそもSHA256だけではなくAES256なども存在します。何が違うかというと大きく、暗号化したものを復号化できるかどうかです。暗号化したものは復号化不可能なSHA256に対しAES256は復号化可能です。

#### メリット
・復号化できない
・DBのデータ漏れた際にも複合化できないハッシュ値なのでデータ漏洩の心配が少ない

復号化ができないがどうやって整合性を取るのか
⇨ログインした際に入力したパスワードなどを同じロジックでハッシュ化し、DBのデータと照らし合わせる。

実際の現場でもAESを使用しているところやSHAを使用しているところ、両方を使用しているところがあるようです。組み合わせて使用するのが正解なのかもしれません。

#### 【振り返り】
暗号化(ハッシュ化)、復号化を勉強して思ったことは２進数、８進数、１６進数をしっかり理解しているか不安になったことです。今回記事にする上でもう一度bitなどについて調べてみました。

振り返ることによって新たな気づきが得られてよかったです。
（論文補足）Explaining and Harnessing Adversarial Examples 補足

# はじめに

この記事は「Explaining and Harnessing Adversarial Examples」という論文を読み進める中で論文に書かれていない計算過程や疑問などをまとめたものです。読みにくい部分や間違いなどあるかもしれません。ご容赦ください。

# 第5章補足

## 摂動の計算

第5章ではロジスティック回帰による3, 7の画像の分類を考えている。損失関数は以下の通り。
```math
\mathbb{E}_{x, y\sim p_{data}}\zeta(-y(w^{\top}x+b)). 
```
ここで、$y\in \{-1,1\}, \zeta(z)=\log(1+e^z)$である。
```math
y\in\{-1,1\} \\
\zeta(z)=\log(1+e^z)
```
である。$y=-1$が7の画像に対応する。
損失関数が期待値表現になっているのはバッチ処理を意識しているからと思われる。
この式から、摂動
```math
\eta=\epsilon\text{sign}(\nabla_xJ(\theta, x, y))
```
を計算する。
$\zeta'(z)=1-\zeta(z)$を用いると、
```math
\begin{align}
\eta
&=\epsilon\text{sign}(\frac{\partial J}{\partial x})\\
&=\epsilon\text{sign}(\frac{\partial}{\partial x}\zeta(-y(w^{\top}x+b)))\\
&=\epsilon\text{sign}(1-\zeta(-y(w^{\top}x+b))\frac{\partial}{\partial x}(-y(w^{\top}x+b))\\
&=\epsilon\text{sign}(1-\zeta(-y(w^{\top}x+b))(-yw))\\
&=\epsilon(-y)\text{sign}(w)\quad(\because 1-\zeta(z)>0,\quad\text{sign}(y)=y)
\end{align}
```
となる。
これはFigure 2の画像(d)において、画像(c)の7の画像に画像(b)が、画像(c)の3の画像に画像(b)の反転が薄く重なっていることの簡単な説明になる。

## 敵対的サンプル攻撃に対抗するロジスティック回帰モデルの損失関数の計算

敵対的サンプル$\tilde{x}$に対して
```math
\mathbb{E}_{x, y\sim p_{data}}\zeta(-y(w^{\top}\tilde{x}+b)). 
```
を計算する。
```math
\begin{align}
&\quad\mathbb{E}_{x, y\sim p_{data}}\zeta(-y(w^{\top}\tilde{x}+b))\\
&=\mathbb{E}_{x, y\sim p_{data}}\zeta(-y(w^{\top}x+b+w^{\top}\eta))\\
&=\mathbb{E}_{x, y\sim p_{data}}\zeta(-y(w^{\top}x+b+w^{\top}(-\epsilon y)\text{sign}(w)))\\
&=\mathbb{E}_{x, y\sim p_{data}}\zeta(-y(w^{\top}x+b-\epsilon y||w||_1))\\
&=\mathbb{E}_{x, y\sim p_{data}}\zeta(\epsilon||w||_1-y(w^{\top}x+b))\\

\end{align}
```
論文によるとここの計算結果は
```math
\mathbb{E}_{x, y\sim p_{data}}\zeta(y(\epsilon||w||_1-w^{\top}x-b))
```
となるらしく、論文の記述と結果が異なってしまった。
悪名高き「Command PhaseScriptExecution failed with a nonzero exit code」に対する最終手段

「Command PhaseScriptExecution failed with a nonzero exit code」

このエラーに遭遇したら

「Command + Shift + K」「DerivedData」「Mac再起動」の他に

Xcode の Project > Build settings を開き、Excluded Architectures を検索し、
Debug、Release のそれぞれに Any iOS Simulator SDK を追加し、
値には arm64 を指定。

その後、Podfile に下記を追加。
```
post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
    end
  end
end
```
等を記事通りに試されると思います。
それでも、このエラーを解決できない場合の最終手段を以下に記述します。

# 【最終手段】

エラーが発生したプロジェクトのコードとstoryboardのコードを
NotionやEvernote等のメモ帳にコピペしておく。

(storyboardのコードは
　2本指で同時にクリック　→ Open As → Source Code で見れます。)

↓

メモ帳にコピペしたコードを新しく作成したプロジェクトの方に貼り付ける。

そして、古いプロジェクトの方の名前は「プロジェクト名Old」にする。

↓

ビルドして上手くいくかテストする。

# 【結論】
自分はこのやり方でビルドに成功しました！

エラーと１日単位で戦っても解決できない場合、
最終手段としてこのやり方を採用するといいと思います！
ROSのインストールと簡単な使い方

# ROSのインストール
以下の順番で`$`を除いた各行をターミナルに打ち込んでいくとrosのインストールが出来る．詳しくは[rosWiki](http://wiki.ros.org/melodic/Installation/Ubuntu#Ubuntu_install_of_ROS_Melodic)を参照．

:::note info
一番下の行は「ros melodic」をインストールするという意味
rosの別バージョンをインストールする場合は，「ros-バージョン名-」に変更すればいい
:::

```cpp:terminal
$ sudo apt update && sudo apt upgrade

$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

$ sudo apt install curl

$ curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -

$ sudo apt update && sudo apt upgrade

$ sudo apt install ros-melodic-desktop-full
```

# 環境設定
```cpp:terminal
$ echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
$ source ~/.bashrc

$ sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential

$ sudo apt install python-rosdep

$ sudo rosdep init
$ rosdep update
```

# ワークスペースの作成
catkin buildでビルドする場合，それ用のパッケージを追加でインストールする
```cpp:terminal
$ sudo apt install python-catkin-tools 
```
あとは，ワークスペースを作成し，そのパスを通すだけ

:::note info
ワークスペース名「catkin_ws」は自分の好きな名前に変えていい
:::
```cpp:terminal
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws
$ catkin init
$ catkin build

$ echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
```

# パッケージの作成
作ったワークスペースで自作のパッケージを作る方法
```cpp:terminal
$ cd ~/catkin_ws/src/
$ catkin_create_pkg YOUR_PACKAGE_NAME DEPEND_PACKAGE_NAME
$ catkin build
```
パッケージ名（YOUR_PACKAGE_NAME）とそれが依存するパッケージ（DEPEND_PACKAGE_NAME）については，後からでも変えられる．
Azure Pipelines のステータスを異なるテナントの Teams に連携してみた

Azure DevOps のテナントと Teams のテナントが違う場合、どうやったら連携できるのか分からなかったのでやってみました。

## Azure AD にテナント専用ユーザーを作成し Azure DevOps に追加

例えば、Azure DevOps のテナントが mnrspoc 、Teams のテナントが mnrsdev だったとして、mnrspoc 側にテナント専用ユーザーを下記のように作成します。そして、作成したユーザーを Azure DevOps に追加します。

![azure-pipelines-teams-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/2f540274-b834-259f-d8e5-3df1e6929463.png)

## Azure DevOps の Policy 設定

Teams の Azure Pipelines ボットや Azure DevOps アプリが OAuth を使うので、Azure DevOps の Organization の Policies で OAuth を有効にします。

![azure-pipelines-teams-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/be48b1e1-e5e8-bb0e-e902-c48fd34502ee.png)

## Teams のアプリで各種設定を行なって動作確認

https://learn.microsoft.com/ja-jp/azure/devops/pipelines/integrations/microsoft-teams?view=azure-devops

https://www.azuredevopslabs.com/labs/vstsextend/teams/#:~:text=Integrating%20Microsoft%20Teams%20with%20Azure%20DevOps%20Services%201,add%20the%20connector%20for%20your%20team.%20...%20%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0

ドキュメントに従って Teams 上でボットやコネクターを設定したら、下記のように Azure Pipelines のステータスが連携されました。

![azure-pipelines-teams-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/75c7bc3b-ad94-ea5a-bd73-66b1598cca70.png)
Spring boot 入門


研修でspring bootについて学んでいるので書き残します。

今回やることは環境構築をして、簡単な画面遷移のみ行います。

### spring boot とは

spring framework というフレームワークを使う際に必要な設定を簡易化したもの

[参考]https://qiita.com/mzmz__02/items/bfe0b5707f1afbb5ac9a#spring-framework%E3%81%A8%E3%81%AF

### 環境

https://mergedoc.osdn.jp/

こちらのサイトに飛んでいただき、Eclipse 2023をダウンロードします。
ダウンロードした後に解凍し、フォルダ内のeclipse.exeをクリックすると起動します。

[参考]https://itsakura.com/eclipse-all-in-one-install#s1

初期設定ではサジェストが出ないので

ウインドウ →　設定 → Java　→　エディタ　→　コンテンツアシスト　→　Javaの自動有効化トリガーに

.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_

こちらのセットしてください（デフォルトでは[.]のみです）

### Springbootアプリの作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1243082/d3a1b607-a1ba-0ad7-ec4b-f1f18b0bf859.png)

おそらくこんな感じの画面が出てくると思います。

アプリを作成するためには右上の

ファイル →　新規　→　spring スタータープロジェクトの作成
をクリックしてください

「名前」の欄に　Sample と入力し

![2023-06-17 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1243082/8b9e57fe-44f1-94af-5bf2-4332e0a5969b.png)

依存関係はこの4つを選んでください（Thymeleaf以外はデフォルトで選択されているはずです）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1243082/f3391365-47ff-1cb4-638b-b62d01bf73c2.png)

ここでいう依存関係とはアプリ内で使用する機能みたいなものです。詳しくは調べてください。

### MVC

実装に行く前にMVCをかる～～～～～～く説明します

M（モデル）処理
V (ビュー)　画面
C (コントローラ)　MとVを操る

めちゃめちゃ省略した例で説明します。

例えば localhost:8080にアクセスしたとします。

アクセスが来たからこの処理(Model)をやって、結果をこの画面(View)に送ろう！

この一連の流れをやるのがController

という感じです。


### 実装(Controller)

先ほど作成したSampleから
src/main/java　→　com.example.demo　をクリックします。
右クリックし、新規　→　クラスを選択

クラス名をSampleControllerとします

SampleControllerを編集します。

``` SampleController.java
package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class SampleController {
	
	@RequestMapping("/")
	public String hello() {
		return "hello";
	}

}
```
最後のreturn文で "hello"を返しています。これは hello.htmlにアクセスすることを意味します

#### アノテーション

@Controller という記述が最初にあります
これはアノテーションと言って　宣言文　です
つまり「このクラスはコントローラだよ！！！」って言ってるんですね
これをすることで何が嬉しいかっていうのは省略しますが、これが無いと不便になります

[参考] https://qiita.com/tta0206/items/5ac0b13c622481e7d80c

@Controller このクラスはコントローラだっていう宣言

@RequestMapping("/")　localhost:8080にアクセスした時にhelloメソッドを実行

例: @RequestMapping("/hello") localhost:8080/hello にアクセスしたときにメソッド実行

### 実装(View)

次にview(画面)を作成します。

先ほどのreturn文で helloを指定したのでhello.htmlを作成します

html系は
src/main/resourceを使用します
templatesを右クリック
新規　→　htmlファイル　を選択
名前はhello.htmlにします

```hello.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>hello</h1>
</body>
</html>
```

controllerとviewができたのでアプリケーションを起動してみます

src/main/java/com.exmaple.demo直下にあるSampleApplication.javaを選択
右クリック　→　実行　→　springbootアプリケーション

ブラウザから
localhost:8080/
にアクセスしましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1243082/4f55bf34-d516-d1ff-d796-16b28920016e.png)

この画面が出ていたら成功です

### 最後に

今回は初歩の初歩について書きました
Modelについて扱っていなかったり、DIについて説明できていません！次の記事で少しずつ説明していきます


何か間違いがあれば教えていただけると幸いです
ありがとうございました！
macOSへのgrib2ctl・g2ctlのインストール（Apple silicon）

# はじめに
**[grib2ctl](https://origin.cpc.ncep.noaa.gov/products/wesley/grib2ctl.html)** 、**[g2ctl](https://origin.cpc.ncep.noaa.gov/products/wesley/g2ctl.html)** はそれぞれ GRIB 、 GRIB2 ファイルから **[GrADS](http://cola.gmu.edu/grads/)** のコントロールファイルを作成するプログラムで、アメリカ海洋大気庁（NOAA）を構成するアメリカ国立気象局（NWS）の国立環境予測センター（National Centers for Environmental Prediction：NCEP）が配布している。

# 実行環境

:::note info
OS：`macOS Ventura 13.4`
:::

# 準備

:::note info
必要な実行ファイル：`wgrib`、`wgrib2`、`grads`
:::

これらのインストール、セットアップについては、以下の記事に詳述。

https://qiita.com/nokos/items/511af147766ff25aef5e

https://qiita.com/nokos/items/4007c8c7ff4a269da028

# grib2ctl のインストール

## NOAA から grib2ctl をダウンロード

```zsh
User@Computer ~ % wget ftp://ftp.cpc.ncep.noaa.gov/wd51we/wgrib.scripts/grib2ctl.pl
```

## `grib2ctl.pl` の 45〜51 行目を書き換え
`$wgrib=` と `$pdef_dir=` に、 `which wgrib` 、 `which grads` で返ってきたパスをそれぞれ設定する（ `$pdef_dir` の変更はオプショナル）。

```perl:~/grib2ctl.pl（45〜51 行目：変更前）
# ***** if wgrib is not on path, add it here
# $wgrib='/u/wx51we/home/bin/wgrib';
$wgrib='wgrib';

# **** directory of interpolation files
$pdef_dir='/usr/local/lib/grads';
#$pdef_dir=$ENV{"HOME"}/grads;変更後
```

```perl:~/grib2ctl.pl（45〜51 行目：変更後）
# ***** if wgrib is not on path, add it here
# $wgrib='/u/wx51we/home/bin/wgrib';
$wgrib='/opt/local/bin/wgrib';

# **** directory of interpolation files
$pdef_dir='/opt/local/bin/grads';
#$pdef_dir=$ENV{"HOME"}/grads;
```

## 実行可能にする

```zsh
User@Computer ~ % chmod 755 grib2ctl.pl
```

## パスが通っているディレクトリへ移動

```zsh
User@Computer ~ % sudo mv grib2ctl.pl /opt/local/bin/grib2ctl
```

# g2ctl のインストール

## NOAA から g2ctl をダウンロード

```zsh
User@Computer ~ % wget ftp://ftp.cpc.ncep.noaa.gov/wd51we/g2ctl/g2ctl
```

## `g2ctl.pl` の 40〜42 行目を書き換え
`$wgrib2=` に `which wgrib2` で返ってきたパスを設定する。

```perl:~/g2ctl.pl（40〜42 行目：変更前）
# ***** if wgrib2 is not on path, add it here
$wgrib2='wgrib2';
# $wgrib2='/export/cpc-lw-webisuzak/wd51we/grib2/wgrib2/wgrib2';
```

```perl:~/g2ctl.pl（40〜42 行目：変更後）
# ***** if wgrib2 is not on path, add it here
$wgrib2='/opt/local/bin/wgrib2';
# $wgrib2='/export/cpc-lw-webisuzak/wd51we/grib2/wgrib2/wgrib2';
```

## 実行可能にする

```zsh
User@Computer ~ % chmod 755 g2ctl
```

## パスが通っているディレクトリへ移動

```zsh
User@Computer ~ % mv g2ctl /opt/local/bin
```
Reachability Analyzerを使ってみた

ネットワーク疎通が出来ない場合によく使います。
結構便利です。

【使い方】
　・パスを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/7e558337-3b72-1b10-d2b8-b7ff1eda2b1a.png)
　・パス名は適当でOK
　・送信元・送信先を指定（今回はInstancesを選択）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/7ed7ecf8-c269-48e9-1258-f8ff8508a733.png)
　・今回は送信先にSSHが出来ない原因調査なので送信先ポートに22を入力
　・プロトコルはSSHなのでTCPを指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/25cf13bf-cac9-8e3a-b37c-eaaaf8f396bb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/0bd75cf3-4011-064f-77b2-1340502cce9c.png)
「パスの作成と分析」を押下すると分析開始
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/1cafa518-f6f4-e3f1-217b-d3e63b822b66.png)

【分析結果】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/d24363c7-f010-ec8c-fc0a-44dfb37bddc6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/bfe12661-a70c-0058-bf1f-d0cfbd0398d3.png)
送信先SGインバウンドルールに原因がありました。
Linux化したMacbookでファンを操作する

## 背景

- 化石MacbookにUbuntuを入れた
- Ubuntuをインストールする前からファンが正常に回らなく熱くなり爆発寸前だった
- 熱くならないようにファンを回して、古いMacを使いたい

## 環境

- MacBook Pro (Retina, 13-inch, Early 2013)
    - Model Identifier: MacBookPro10,2
- OS
    - Ubuntu 22.04.2 LTS

## 手順

各リポジトリのReadmeをメインに参考手順を参照する。

ファンをコントロールする: [mbpfan](https://github.com/linux-on-mac/mbpfan)
- 参考手順
    - https://ineed.coffee/post/a-beginners-tutorial-for-mbpfan-under-ubuntu
    - ただしGitHubのreadmeと参考手順のリンク先では、手順が一貫していないように見えたので、下記の「実施内容」を実施した。

CPU温度やファン回転数を確認する: [lm-sensors](https://github.com/lm-sensors/lm-sensors)

- 参考手順
    - https://tarufu.info/lm-sensors/
- lm-sensorsで確認できる情報をもとにファンの動作を微調整すると作業を進めやすい

### 実施内容

```bash
lsmod | grep -e applesmc -e coretemp

sudo apt-get install mbpfan

#不要だったかもしれない
sudo systemctl enable mbpfan.service
sudo systemctl daemon-reload
sudo systemctl start mbpfan.service

sudo systemctl status mbpfan
# =>Active: active (running) since Sat 2023-06-17 14:13:12 JST; 56min ago
# =>起動されていてActiveになっていることを確認

cat /sys/devices/platform/applesmc.768/fan*_min
# =>最大値を/etc/mbpfan.confのmin_fan1_speedに設定

cat /sys/devices/platform/applesmc.768/fan*_max
# =>最大値を/etc/mbpfan.confのmax_fan1_speedに設定

cat /sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_max
# =>最大値を1000で割り/etc/mbpfan.confのmax_tempに設定

sudo vi /etc/mbpfan.conf
# =>上記のcatした値を参考に各値を設定
# =>CPU？の温度がlow_temp→higt_temp→max_tempの流れで各設定値に達するごとにファンの回転数が上がる（調べきれていないので正確ではないかも）
# =>CPU？の温度がmax_tempを超えるとファンの回転数が最大になる

#設定を反映
sudo systemctl restart mbpfan

sesnors
# =>温度やファン回転数を見て設定を微調整
```


すぐに熱くなって爆発寸前なので、ファンが壊れても良い前提の私の設定

```
cat /etc/mbpfan.conf
[general]
# see https://ineed.coffee/3838/a-beginners-tutorial-for-mbpfan-under-ubuntu for the values
# 
# mbpfan will load the max / min speed of from the files produced by the applesmc driver. If these files are not found it will set all fans to the default of min_speed = 2000 and max_speed = 6200
# by setting the values for the speeds in this config it will override whatever it finds in:
# /sys/devices/platform/applesmc.768/fan*_min
# /sys/devices/platform/applesmc.768/fan*_max
# or the defaults.
#
# multiple fans can be configured by using the config key of min_fan*_speed and max_fan*_speed
# the number used will correlate to the file number of the fan in the applesmc driver that are used to control the fan speed.
#
min_fan1_speed = 3000	# put the *lowest* value of "cat /sys/devices/platform/applesmc.768/fan*_min" => 2000だったけどすぐ熱くなるので高めにした
max_fan1_speed = 8208  # put the *highest* value of "cat /sys/devices/platform/applesmc.768/fan*_max"
low_temp = 50			# try ranges 55-63, default is 63
high_temp = 60 			# try ranges 58-66, default is 66
max_temp = 70 			# take highest number returned by "cat /sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_max", divide by 1000 => 85だったけど早めにMAXで回ってほしいから低めにした
polling_interval = 1	# default is 1 seconds
```
eachの練習

植物の名前と値段が入った配列がある。
```ruby
plants_price = [["朝顔", [200, 250, 320]], ["向日葵", [300, 320, 480]], ["蘭", [7000, 9500]]]
```
```ruby
#出力
朝顔の合計金額は７７0円です
向日葵の合計金額は１１00円です
蘭の合計金額は１６５00円です
```
この配列を用いて、植物の名前とそれぞれの合計額が出力される
コードを作ろう。

こうなる。
```ruby
plants_price = [["朝顔", [200, 250,320]], ["向日葵", [300,320,480]], ["蘭", [7000, 9500]]]
plants_price.each do |plant|
  sum = 0
  plant[1].each do |price|
    sum += price
  end
  puts "#{plant[0]}の合計金額は#{sum}円です"
end
```

plants_priceから"朝顔", [200, 250, ３20]という値を取り出し、変数plantに代入する。

その後、自己代入しながらsumを出す。
EC2 Instance Connect Endpointを作成してEC2インスタンスにSSH接続してみた

【特徴】
　・EC2インスタンス側にパブリックIP不要
　・使い勝手はセッションマネージャーと似ている

【事前作業】
　・EC2 Instance Connect Endpoint（以降EICエンドポイント）に付けるセキュリティグループ（以降SG）を作成
|通信方向  |プロトコル  |ポート  |送信先  |
|---|---|---|---|
|インバウンド  |-  |-  |-  |
|アウトバウンド  |SSH  |22  |接続先EC2インスタンスのSG  |

※接続先EC2インスタンスのSG側には上記SGをソースとしたTCP/22のインバウンドルールが必要

【EICエンドポイント作成手順】
　・サービスカテゴリは「EC2 Instance Connect Endpoint」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/fc090891-03c6-9ce1-16a1-dace946006eb.png)
　・エンドポイントを作成するVPC、サブネット（サブネットは1つのみ選択可能）及び事前作業で作成したSGを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/68326492-fd4c-6c07-4f3f-41a646bec659.png)
　・「エンドポイントを作成」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/22c10da8-31d1-6bcc-739d-99add8a57081.png)

　・ステータスが「保留中」→「使用可能」となるまで数分待つ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/7fabda9b-81b0-a0d6-fcae-6b07016831ea.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/2ba6223a-f78f-b395-bbc1-066e62b285b1.png)

【接続確認】
　・EC2インスタンスの画面から接続するインスタンスにチェックを入れ、「接続」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/fd6da9bb-e3e0-150d-43f2-4a22c91def9e.png)
　・EC2 Instance Connectを選択
　・接続タイプはエンドポイントを使用して接続
　・ユーザー名（今回はec2-userを選択）
　・最大トンネル期間は特別指定がなければデフォルトの3600秒で
　・作成したEICエンドポイントを指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/68fde567-81a5-f805-45e5-5e8f7c5cf0ea.png)
「接続」を押下すると接続される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/24d9376c-5ba1-ad94-e299-130f1ceacb19.png)
SQLインジェクションと対策についてまとめてみた

# はじめに

SQLインジェクションというワードには馴染みがありましたが具体的な内容と対策についてはよくわかっていないので簡単にまとめてみました。間違い等あればご指摘いただけるとありがたいです！


# SQLインジェクションとは
SQLインジェクションとは悪意のあるユーザが例えば入力フォームなどにSQL文を入力することでDBを不正に操作する攻撃手法です。

### どういう操作で起きるのか
例えばユーザ名とパスワードを入力してログインするようなログイン機能があったとします。
また、そのログイン処理は、DBに該当するユーザIDとパスワードのユーザがいればログインできるという仕様だと仮定します。具体的には以下のようなSQL文で表現できます。

```java
String sql = "SELECT * FROM users WHERE username ='userName' AND password ='pasword' ";
```
このSQLが実行される時に、もし、ユーザIDにtanaka、パスワードにaaa’ or ‘1’=’1と入力した場合は以下のようになります。

```java
String sql = "SELECT * FROM users WHERE username ='tanaka' AND password ='aaa’ or ‘1’=’1’ ";
```
この時には1=1は必ず満たされるので、パスワードがわからなくても特定のユーザIDでログインすることができてしまいます。ログインできてしまうと、その後の個人情報の流出や改ざんなどもできてしまいます。



# SQLインジェクションの具体的な対策
次に具体的な対策についてまとめます。

### バリデーションを設ける
SQLインジェクションでは、'を入力することによってSQL文を入力することができてしまうので、半角英数字しか入力できないなどのバリデーション機能を設けることでSQLインジェクションを防ぐことができます。
```java
//半角英数字のみ入力を許可するバリデーション
@Pattern(regexp = "^[a-zA-Z0-9]+$");
```



### プレースホルダを使用する
#### プレースホルダーとは
恥ずかしながらプレースホルダーというワードを初めて聞いたので調べてみました。
プレースホルダーとは変数を?や：で置き換えて、不正な値（特殊文字など）が入力された際にSQLが実行されないようにする仕組みだそうです。具体的には以下のような処理になります。
```java
String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
//DBと接続する
//パラメータ付きSQL文をデータベースに送るための準備（PreparedStatementオブジェクトを生成）。
PreparedStatement statement = connection.prepareStatement(sql);
//作成したSQLに対して、usernameとpasswordをセットする
statement.setString(1, username);
statement.setString(2, password);
//SQLを実行する
ResultSet resultSet = statement.executeQuery();
```
プレースホルダーを使用すると、処理が以下の3段階で実行されます。
①SQL文をDBに送信して構文解析を行う。
②？に指定された値（userNameやpasswordなど）を挿入する。この時に値のチェックを行う。
③SQLを実行する。
このように3段階でsqlが実行されるので、もし仮に不正なSQLがフォームに入力されたとしても②で弾かれるのでSQLインジェクションが起きることはありません。



# 参考
『プロになるためのWeb技術入門』 ――なぜ，あなたはWebシステムを開発できないのか
https://blog.senseshare.jp/placeholder.html
https://kanda-it-school-kensyu.com/java-jdbc-contents/jj_ch03/jj_0302/
https://qiita.com/sudo00/items/eaa87db36007ee8b0bd5
https://www.javadrive.jp/servlet/database/index10.html
<bitnami>bncert sslを削除したい

awsのlightsailでbitnami/bncert-toolでssl証明書を発行していたのですが、一旦消したい時の忘備録


# これでok
```bash
sudo /opt/bitnami/letsencrypt/lego --path /opt/bitnami/letsencrypt --tls --email=EMAIL --domains=DOMAIN revoke
```

# 参考
https://docs.bitnami.com/general/how-to/understand-bncert/#manually-revoking-an-existing-certificate



# Tips
httpsリダイレクト消したい時
リライトルール検索
sudo grep -rni 'RewriteRule' /opt/bitnami/apache2/conf/

これを消せばok
```bash
# BEGIN: Enable HTTP to HTTPS redirection
# ...
# END: Enable HTTP to HTTPS redirection
```

再起動
```bash
sudo /opt/bitnami/ctlscript.sh restart apache
```
【初心者向け】要素にイベントを追加する Wix by Velo

## はじめに
Wixは、セクションやストリップ、テキスト、画像、ボタンなどの様々な要素で構成されていますが、今回はVeloを使って、その要素にイベントを設定していきたいと思います。

具体的には、折りたたまれたテキスト要素をボンタンを押すことで表示させる機能を作ります。
![oritatami.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365910/abe0ee2d-1f1a-b4db-c441-98828e40a1db.gif)

:::note info
この記事は、Wixは一通り使えるけどVeloを使ったイベントの設定したことがない方を対象としています。
そのためWixエディタの使い方については触れませんのでご了承ください。
:::

## 1. 準備

**適当なサイトを用意**して、エディタ上部のメニューから**開発モードを有効**にしてください。

![2023-04-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365910/28d3995e-6e78-ae91-7ef0-4b22d50de9e0.png)

## 2. 要素を追加する
![本文を追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365910/97e2d67e-b934-096c-d936-42fffa626e19.png)

homeページにテキスト2つとボタン**要素を追加**します。
* ページが読み込まれ際に表示しておくテキスト要素（ID: #text1）
* ボタンが押されてから表示されるテキスト要素（ID: #text2）
* トリガーとなるボタン要素（ID: #readMore）

:::note info
IDは必要に応じて変更してください。
:::

## 3. 要素のデフォルト値を設定する

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365910/f4808b39-e3e2-aad9-c954-40af7b6f33a7.png)

1. エディタで折りたたんでおきたいテキストを選択（#text2）
2. デフォルト値 Collapse にチェック

**デフォルト値をCollapseに**することで、ページが読み込まれた時には折りたたまれた状態になります。
要素が見えない状態になっていることは、エディタ上で網掛けで表現されます。

![折りたたみ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365910/8b102039-9c41-be0e-6e0f-0fb2d434a19e.png)

### Hidden と Collapse の違い

テキスト要素のデフォルト値には Collapse のほかに Hidden があります。
Collapse（折りたたみ）は、テキストがあったスペースも埋めてくれますが、Hidden（非表示）は、テキストが非表示となった後のスペースはそのままとなります。
今回は text1とボタンの間に空白を入れたくはないので Collapse を使います。

## 4. コードを入れる
$w.onReadyの中にボタンをクリックすると折りたたまれたテキストが展開するコードを入れます。

```diff_javascript:home
$w.onReady(function () {
+    // #readMoreボタンをクリックしたら
+    $w('#readMore').onClick(()=> {
+        // テキスト要素#text2を展開する
+        $w('#text2').expand();
+    });
});
```
プレビューで、ボタンを押して隠れていたテキストが展開されれば完成です。

いかがでしょうか。かなり簡単にイベントが付与できたかと思います。
（そうでもない？）

今回はここまでですが、再度ボタンを押すとテキストがまた折りたたまれたり、ボタンのラベルも状態により変化させたりなど、アイディア次第で動きのあるサイトを作ることができます。

## 各要素で出来ること
ボタンには onClick()イベントが使えて、テキストには　Collapse() expand()プロパティが使えることはわかったけど、他は何が使えるの？と思いますよね。

必要なことはAPIリファレンスで確認できます。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365910/a50fa08c-0265-6c1a-f1a9-d737d485b826.png)

エディタで要素を選択すると右下のプロパティ＆イベントパネルにその要素のAPIリファレンスへのリンクが表示されるので便利です。

↓テキスト要素はこちら

https://www.wix.com/velo/reference/$w/text

↓ボタン要素はこちら

https://www.wix.com/velo/reference/$w/button

APIリファレンスでは、Veloで使用できるさまざまなAPIとその使用方法が記載されています。
APIの使用例やコードスニペットも載っているので、エディタにコピー＆ペーストすることもできます。

![2023-06-16 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365910/7603e7cb-5871-ba17-14d3-90801bd7a8fe.png)


## 最後に
この記事は Wix Learn の動画の内容を抜粋して書かせていただきました。

https://ja.wix.com/learn/courses/coding/start-coding-with-velo-ja#respond-to-element-based-events-ja
「labelImg」のインストールで、pyrcc5のコマンドが入力できず、先に進めない件について

# 問題
```Anaconda```を用いた仮想環境で、
```LabelImg```を公式リポジトリの説明に則ってインストールしようとしたところ、```pyrcc5```のパスが通っておらず、先に進めない。

具体的には以下のようなエラーが発生する。
```bash
$ pyrcc5 -o libs/resources.py resources.qrc

'pyrcc5' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```
# 原因
```conda install```を用いてインストールすると、正しくインストールされないことに起因する。
ターミナル上では正しくインストールされたように見えても、実際は正しくインストールされていないようだ。

# 解決方法
```conda```によるインストールではなく、```pip```を用いたインストールに切り替える。
具体的には、以下のようなコマンドを入力する。
```bash
$ pip install PyQt5
```
これで、再度```$ pyrcc5 -o libs/resources.py resources.qrc```を入力すると、エラーが発生しなくなる。
「 PHP に tests ディレクトリっていらなくない？」と思ってみた

こんにちは。やまゆです。

https://twitter.com/akai_inu/status/1669866150765953024

ということで疑問に思ってみました。

## Why?

ソースコードディレクトリとテストディレクトリを分けるのが PHP の一般的な習慣です。

```
/
  -> src/
    -> Domain/
      -> User/
        -> UserEntity.php
  -> tests/
    -> Unit/
      -> Domain/
        -> User/
          -> UserEntityTest.php
```

ユニットテストはクラス単位で行うことが多いため、このような構成になることがあるでしょう。

そうすると、同じディレクトリ構成が現れることになります。何が DRY か？状態です。

例えば golang は超シンプルです。

```
/
  -> user.go
  -> user_test.go
```

これで `go test` すると、自動的にテストファイルを判別してくれます。

```
/
  -> src/
    -> Domain/
      -> User/
        -> UserEntity.php
        -> UserEntityTest.php
```

つまり、これで良くない？という話です。

(もちろん、クラスをまたいだもう少し大きな IntegrationTest などは別途 `integrations` 等を用意する必要があると思います)

### メリット

1. ディレクトリに対して DRY を適用できる
    - DRY はみんな大好きだと思います。同じことは繰り返したくないです。
1. 実装とテストがそばにあるため行き来しやすい
    - 実装する時はテストファイルと同時に開いて編集することが多いですよね
1. テストがちゃんと書かれているかどうかがわかる
    - テスト書き忘れ、レビュー漏れがあると厄介です

### デメリット

1. ランタイム実装にテスト用のコードが潜り込む危険がある
    - 同じ場所にあるので、テストユーザーを作成するメソッドを間違えて本番環境向けの実装で使ってしまうかもしれません
1. 対応していないライブラリがあるかもしれない
    - PHP の現在のエコシステム的に、ディレクトリを分離する前提のライブラリがあってもおかしくありません
1. 同じディレクトリのファイル数が倍増する
    - 設計次第ですが、同じドメイン領域に存在するファイルが倍になります。閲覧性に問題が出るかもしれません

---

ということで、ちゃんと phpunit/psalm/phpstan/php-cs-fixer あたりの著名なライブラリがこの構成でも動くか検証してみました。

https://t.co/OPmwFYizG1

## 結論: いけそう

もちろん上記で出した以外のデメリットがあると思います。

しかし、なんかこっちの方が良いかもしれないな、というのが今日の感触でした。
AWSS3のバケットブルートフォースを理解・対策する

## S3の管理ちゃんとしてますか
S3は今ではいろんな場面で頻繁に使われているストレージサービスです。
AWSから提供されているセキュリティ機能は強固なので、普通に・デフォルトで使っている分にはかなり安全なサービスだと思います。
とはいえ、ヒューマンエラーによって誤った設定にしてしまうことにより、脆弱性を作り出してしまう可能性もあります。

この記事はS3のリスクを簡単に解説するとともに、攻撃や倫理的ハッキング（報奨金ハント）に使用できるツールを紹介します。こうした手段や攻撃者の考えを理解することで、セキュリティへの意識を啓発することを目的としています。

## S3へのハッキング対策
### バケット名は全世界に公開されることを肝に銘じる
S3を少し使ったことがある人ならご存じと思いますが、S3のバケット名はグローバル（正確にはちょっとだけ違います）でユニークです。全てのS3バケットはこのパターンのURLを持ちます。
`https://<BucketName>.s3.amazonaws.com`
ですから、ランダムに文字を組み合わせてHTTPリクエストを送信してレスポンスコードを確認することで、バケットが存在するかどうかは簡単に確認できます。
ですので、まず1つ目の注意点として、バケットの命名から機密情報が推測されるような命名は避けるべきです。
同様に、公開されているバケットの中に非公開ファイルを置くような場合も注意が必要です。そのファイルが重要なもので、ファイル名に重要さを推測できるワードを含めた場合、攻撃者に「ここがねらい目！」と教えているようなものです。

### 公開範囲設定は絶対にミスしない
存在するバケット名を明らかにされたところで、バケットの公開範囲等の設定が正しく行われ、ファイルが適切に保護されていれば問題はありません。しかし、先述のとおり、ヒューマンエラーによってもし機密性の高いファイルが全世界に公開される状態になってしまったらどうでしょう？攻撃者はこの一瞬を狙っています。
また、こうしたミスはさらなる危機を招き入れる可能性もあります。ミスがあるバケットを見つけた攻撃者は、それを保持している組織について「セキュリティ意識が甘い＝侵入しやすい組織」と認識して、その団体に対する他の攻撃方法を探し始めるかもしれません。
一瞬が命取りなので、バケットやファイルの公開設定を変更するときはツールやダブルチェックを行うなど、ヒューマンエラーが混入しないように慎重に設定する必要があります。

## ツール
ここからは、こうした攻撃のために存在するツールをいくつか紹介します。攻撃者の方法を知ることで、セキュリティ対策意識が啓発されることを願っています。
使用の際はくれぐれも悪いことはせず、倫理的ハッキング目的で使用してください。

### lazys3
https://github.com/nahamsec/lazys3

とてもシンプルなRuby製スクリプトです。
リポジトリに含まれているプレフィックス・ポストフィックス用の辞書を使ってAWSS3バケット名のブルートフォースをします。

### S3Scanner
https://github.com/sa7mon/S3Scanner

この分野では最も有名なライブラリです。lazys3と同様のバケット列挙を行う機能に加え、バケットの権限や内部ファイルをダンプする機能も持ちます。

### bucketkicker
https://github.com/craighays/bucketkicker

S3Scannerと同等の機能を持ちます。

## さいごに・リファレンス
**S3バケットの適切な管理！大事！**

AWS以外のほかのストレージサービスへの同様の攻撃手法や、ほかにも興味深い類似ツール、実際にこうしたツールを使って2021年にペネトレーションテストを行った結果などが記載されています。ぜひ参考に。

https://dev.to/0xbanana/bucket-hunting-for-bounties-glory-and-fun-5g6f

https://www.securing.pl/en/what-can-you-find-in-57k-aws-s3-buckets-2021-update/
【Rails】simple_form使ってみた

## はじめに
学習中に、simple_formを使用してフォームを作成したので、記録として残します。

## simple_formとは
Railsには、標準のform_withを使ってフォームを作成することができますが、simple_formを使うことによって、簡単に、よりシンプルにフォームを作成することができます。

## 導入
```ruby:Gemfile
gem 'simple_form'
```
```
$ bundle install
```
次に、以下のコマンドでインストール（初期化）します。
```
$ rails g simple_form:install
=>    create  config/initializers/simple_form.rb
      exist   config/locales
      create  config/locales/simple_form.en.yml
      create  lib/templates/erb/scaffold/_form.html.erb
```

## 使い方
以下のように記述することで、ラベルと入力用のフォームを同時に作成してくれます。
これが、simple_formの便利なとこですね。
```ruby:app/views/users/new.html.slim
= simple_form_for @user do |f|
  = f.input :last_name
  = f.input :first_name
  = f.input :email
  = f.input :password
  = f.input :password_confirmation
  = f.submit
```
css適用してないので、汚いフォームですが以下のようにフォームが作成されます。
![スクリーンショット 2023-06-17 14.13.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600084/618a7f99-386e-8b5e-b61a-a6473be6802f.png)

この、「f.input」が何をしているかは、以下の記事
[simple_form の f.input が呼ばれた時何が起こっているかコードリーディングして調べてみた](
https://qiita.com/gotchane/items/93577732f4984712d4c7)

## ラベルの日本語化（I18n）
設定ファイルで以下の記述を行うことにより、日本語化の設定を行う。
```
# config/application.rb
config.i18n.default_local = :ja
```
そして、ja.ymlファイルに以下のように記述していく。
`simple_form.ja.yml`ファイルは、`rails g simple_form:install`した際に作成される。
```ruby:config/locales/simple_form.ja.yml
ja:
  simple_form:
    labels:
      user:
        last_name: '姓'
        first_name: '名'
        email: 'メールアドレス'
        password: 'パスワード'
        password_confirmation: 'パスワード確認'
```
## オプション
simple_formには様々なオプションがあります。
```ruby:app/views/users/new.html.slim
= simple_form_for @user do |f|
  = f.input :last_name, label: '名字'
  = f.input :first_name, label: '名前'
  = f.input :email, hint: '@example.comを使用'
  = f.input :password, placeholder: '誕生日は避ける'
  = f.input :password_confirmation, placeholder: 'パスワード確認
  = f.submit
```
・ラベル
・ヒント
・プレースホルダー
のオプションをつけると以下の表示になります。
![スクリーンショット 2023-06-17 14.20.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600084/2a38b793-54f5-ad0d-bbfe-548569049a52.png)
他の様々なオプションは、[公式リファレンス](https://github.com/heartcombo/simple_form)で確認できます。
## 最後に
公式リファレンスから色々試してみると面白そうですよね！
ぜひ試してみてください!
GPG keyが原因でGithubにコミット・プッシュできないとき


## はじめに
Eclipseを使用している際にいきなりGithubのリモートリポジトリにコミット・プッシュができなくなってしまったので、解決方法を備忘録としてまとめておきます。

## 起きていること
今までは普通にGithubのリモートリポジトリにコミット・プッシュできていましたが、なぜかいきなりできなくなり、以下のエラーが出る。

「Unable to find a GPG key for singning with key ID'自分のEメールアドレス'」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2869221/bb355a95-5b10-d34a-d3d1-27bb3fcc89a9.png)

他のEclipseのプログラムやVS vodeのプログラムはコミット・プッシュできたので、
このプログラムのみがコミット・プッシュできないと思われる。


## 原因・解決方法

下の画像のコミット・メッセージの右上の鍵のマークを押してしまったからのようでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2869221/37f4f022-0ba8-7df8-d00f-f50de5fac35a.png)

個人の開発でGithubにコミット・プッシュするだけなので、鍵のマークをもう一度クリックし、署名は外しておきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2869221/0254c0c0-254c-2e99-02ff-e797e5b08c7d.png)

コミット・プッシュしようとするとログイン画面が出てきます。
ここが紛らわしいのですが、パスワードはGithubのパスワードではなく、tokenを入力する必要があります。

入力し、ログインすれば、Githubのリモートリポジトリにコミット・プッシュが完了しました。


## 最後に
GPG keyという単語は初めてでしたが、調べると公開鍵のことでした。
今まで公開鍵を作成せず、コミット・プッシュしていたので、なぜ急にこのようなエラーが出たのか全く分かりませんでした。
慣れないGithubですが、無事に元のリポジトリにコミット・プッシュがまたできるようになって良かったです。
【Mac】リマインダーの一覧をターミナルから取得する方法

## AppleScriptで取得する

次のコマンドを実行することでリマインダーの一覧を取得できます。

```terminal
osascript -e 'tell application "Reminders" to get name of every reminder' | tr ',' '\n'
```

```terminal
$ osascript -e 'tell application "Reminders" to get name of every reminder' | tr ',' '\n'
タスク1
タスク2
タスク3
タスク4
```

未完了のタスクのみ取得する場合には次のコマンドを実行します。

```terminal
osascript -e 'tell application "Reminders" to get name of every reminder whose completed is false' | tr ',' '\n'
```

```terminal
$ osascript -e 'tell application "Reminders" to get name of every reminder whose completed is false' | tr ',' '\n'
未完了タスク1
未完了タスク2
未完了タスク3
```

## reminders-cliで取得する

reminders-cliをインストールします。

```terminal
brew install keith/formulae/reminders-cli
```

次のコマンドを実行して特定のリストのリマインダー一覧を取得します。

```terminal
$ reminders show リスト名
0 タスク1
1 タスク2
2 タスク3
```