OmniAICreator/Qiita-1.07M huggingface dataset:
使用できない状態となった楽天ポイントを使用できる状態に修正した話

事の経緯は、嫁のキャリアメールを普通のメールアドレスに切り替えようとしたことが始まりです。

最初にキャリアメール(仮に**AAA@com**とします)のアドレスに紐づけて楽天アカウントを作成していました。そして、このキャリアメールのアカウントをやめて例えばgmail(仮に**BBB@com**)のようなメールアドレスで楽天アカウントを作成しようとしました。

### 結論からすると楽天会員情報ページでメールアドレスをAAA@comからBBB@comに変更すれば良かったのです。
![タイトルなし.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495919/282672d0-5af8-31ba-fc23-59c9eac546fc.jpeg)


そうしないで、**BBB@com**として楽天アカウントを新規作成してしまい悲劇は起こりました。
嫁は、楽天カードを作成し入会ポイントをもらったのですが、**BBB@com**には入会ポイントは入らず**AAA@com**に入会ポイントが付与されたのです。

それなら**AAA@com**アカウントで入会ポイントを使えばいいのではないかと思われますが、
ここに落とし穴がありました。**AAA@com**と**BBB@com**に紐づけしている電話番号が同じだったのです。そのことが原因で**AAA@com**のポイントが使用できない状態になりました。

ですので、これでは楽天カードを作成時に発生した楽天ポイントとさらに初回買い物後に付与されるポイントも使うことができないのではないかという懸念となりましたが、
結論から言うと根性で発生した楽天ポイントを使用できるように直しました。


### 解決したその方法を書きます。

一つの楽天アカウントは**AAA@com**、もう一つの楽天アカウント**BBB@com**があったわけです。

なので、**AAA@com**のメールアドレスを**BBB@com**に変更すればよいのですが、**AAA@com**のアカウントページですでに**BBB@com**のアドレスが存在しているために変更できません。

なので、まず**CCC@com**のメールアドレスを作成して**BBB@com**のアカウントページのメールアドレスを**CCC@com**に変更しました。

この状態で**AAA@com**のアカウントページで**BBB@com**のメールアドレスに変更することができました。(「すでに**BBB@com**が存在します」とエラーが出る気がしたが通った)

### 変更した**BBB@com**(元**AAA@com**)のアカウントページで楽天ポイントが紐づいているので無事楽天ポイントが使用できるようになりました。
(なんか他にもあった気がするが大筋はこんな感じで直しました)
2024 年 5 月 1 日以降ITMS-91055: Invalid API reason declaration PrivacyInfo.xcprivacy

2024年5月1日以降アプリを提出する際にPrivacyInfo.xcprivacyが必須になります。うちのアプリでの設定のスクショです。これで通りました。使用APIに対応した理由を選ばないと通りません。
![スクリーンショット 2024-03-18 6.41.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117011/7d11343f-93fe-440c-cb86-c7e853977650.png)
EC2ディスクの追加について

EC2にアタッチされているEBSボリュームの容量を追加する機会があったので、EC2のディスク容量の追加についてまとめてみました。EC2はAmazonLinux2023を使用しています。

# パーティションとは
Linuxにディスク容量を追加するときに必要な知識がパーティションになります。
一台の物理的なディスクを複数の領域に分割して、それぞれの領域を独立した論理的なディスクとして扱えるようにすることをパーティショニングといいます。また分割された領域のことをパーティションといいます。

# デバイスファイルとは
Linuxでハードウェアを指定するには、それぞれに対応したファイル名を使います。これをデバイスファイルと呼びハードディスクやSSD、DVDドライブといったデバイスの入出力を扱うための特殊なファイルです。/devディレクトリの下に置かれます。

パーティションを確認するコマンド
**lsblk**:ストレージデバイスとそのパーティションを一覧表示します
```:lsblk
xvda      202:0    0   8G  0 disk
├─xvda1   202:1    0   8G  0 part /
├─xvda127 259:0    0   1M  0 part
└─xvda128 259:1    0  10M  0 part /boot/efi
```

**sudo fdisk -l**: ディスクパーティションの情報を表示します。
```:sudo fdisk -l
Disk /dev/xvda: 8 GiB, 8589934592 bytes, 16777216 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 6574721F-6880-4AA9-AA72-D0AAAB5E4110

Device       Start      End  Sectors Size Type
/dev/xvda1   24576 16777182 16752607   8G Linux filesystem
/dev/xvda127 22528    24575     2048   1M BIOS boot
/dev/xvda128  2048    22527    20480  10M EFI System
```

**df -h**:ファイルシステムのディスク使用状況を表示します
```:df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        4.0M     0  4.0M   0% /dev
tmpfs           475M     0  475M   0% /dev/shm
tmpfs           190M  2.9M  188M   2% /run
/dev/xvda1      8.0G  2.9G  5.1G  36% /
tmpfs           475M     0  475M   0% /tmp
/dev/xvda128     10M  1.3M  8.7M  13% /boot/efi
```

## ディスク追加して使用できるようになるまでの手順
システムにディスク装置を接続して、利用できるようにするには、以下の３ステップが必要です。
１パーティションに分割
２パーティションごとにファイルシステムを作成
３ルートファイルシステムにマウントする

### パーティションには２つの規格がある
古くからあるMBR
新しいGPTの２つがある。

GPT方式の場合は１つのディスクに最大128個のパーティションを作成することができます。MBRのときにあったプライマリ、拡張、論理パーティションなどの区別はありません。
今回の記事は新しい方式のGPTパーティションを扱います。

GPT方式の場合はブートローダーが起動デバイスのESP（EFI System Partition）に格納されています。ESPは/boot/efiにマウントされます。


パーティションの作成、設定変更、削除には以下のコマンドを使用します。どれを使用しても同様の操作が可能です。
parted
gdisk
fdisk
*partedとgdiskはMBRとGPTの両方に使用できます。
*fdiskはMBR専用ですが、GPT対応化が始まっています。
今回は主にpartedをしようしていきます。

**parted [オプション][デバイス[操作コマンド[操作オプション]]]**

| オプション| 説明 | 
| :-- | :-: |
| -l | パーティション一覧を表示| 
<br>

| 操作コマンド| 説明 | 
| :-- | :-: |
| print | パーティション一覧を表示| 
| mkpart | パーティションを作成| 
| rm | パーティションを削除| 
| quit| partedコマンドを終了| 
| help| 操作コマンドのヘルプを表示| 

## EC2のボリュームを拡張する手順
EBSのボリュームサイズを拡張→パーティションを拡張→ファイルシステムを拡張

１まずはコンソールからEBSボリュームのサイズを拡張します。
２ボリュームにパーティションがあるかどうかを確認します。（lsblk コマンド）
３ある場合は、パーティションサイズとボリュームサイズを比較してパーティションがボリュームサイズよりちいたい場合はパーティションを拡張します。
４パーティションを拡張するにはgrowpart コマンドを使用します。
５パーティションが拡張されたことを確認します。（lsblk コマンド）
６ファイルシステムを拡張します。拡張する必要があるファイルシステムの名前、サイズ、タイプ、およびマウントポイントを取得します。（df -hT）
７ファイルシステムがXFSの場合はxfs_growfsコマンドを使用します。
８ファイルシステムが拡張されたことを確認します。（df -hT）
バーチャルホストを使ってみた

# バーチャルホストとは
1つのサーバー内で複数のウェブサイトを公開できる技術のことです。サイトごとにサーバーを契約しなくてよいのでコスト効率が高いのが特徴です。

バーチャルホストには大きく分けて以下の２種類があります。
## ・名前ベースのバーチャルホスト
ApacheはHTTPリクエストのHostヘッダーを使用して、どのウェブサイトのコンテンツを提供するかを判断します。複数のドメイン名が同一のIPアドレスに関連づけられます。設定が簡単でコスト効率が良いため名前ベースのバーチャルホストが一般的です。
## ・IPベースのバーチャルホスト
ウェブサイトごとに異なるIPアドレスが割り当てます。Apacheはリクエストが到達したIPアドレスに基づいて、どのウェブサイトを提供するかを判断します。

## Apacheのディレクトリツリー


```bash:Apache
/etc/httpd/
├── conf
│   ├── httpd.conf
│   └── magic
├── conf.d
│   ├── README
│   ├── autoindex.conf
│   ├── userdir.conf
│   └── welcome.conf
├── conf.modules.d
│   ├── 00-base.conf
│   ├── 00-dav.conf
│   ├── 00-lua.conf
│   ├── 00-mpm.conf
│   ├── 00-optional.conf
│   ├── 00-proxy.conf
│   ├── 00-systemd.conf
│   ├── 01-cgi.conf
│   ├── 10-h2.conf
│   ├── 10-proxy_h2.conf
│   └── README
├── logs -> ../../var/log/httpd
├── modules -> ../../usr/lib64/httpd/modules
├── run -> /run/httpd
└── state -> ../../var/lib/httpd
```

主要なディレクトリを説明します。（Red Hat系Linuxディストリビューションにおける主要なディレクトリです）

### /etc/httpd/conf
Apacheの主要な設定ファイルが含まれています。httpd.confがApacheのグローバル設定ファイルです。

### /etc/httpd/conf.d
メインの設定ファイルである httpd.conf とは別に、追加の設定ファイル（.confファイル）を置く場所として機能します。.confファイルは起動時に自動で読み込まれます。
今回行うバーチャルホストの設定ファイルはこのディレクトリに作成します。メインの設定ファイルであるhttpd.confに直接バーチャルホストの設定を記述することも可能ですが、管理が煩雑になりやすいので設定ファイルを分けるほうがおすすめです。

# バーチャルホスト設定の手順

## １Apacheをインストールする。
AWSのEC2をたててそこにApacheをインストールします。EC２をたてるまでは解説しませんのでサーバーについては各自準備していただけると幸いです。
Apacheがインストールされているか確認するコマンド
```
sudo systemctl status httpd
```

管理者権限で実行する必要があります。
・Apacheのインストール
```
sudo yum install httpd
```
・Apacheを起動する
```
sudo systemctl start httpd
```

サーバーを再起動したときなど自動でApacheが起動するように設定します。
・Apacheの自動起動設定
```
sudo systemctl enable httpd
```
## 2バーチャルホストの設定をする
２バーチャルホスト設定ファイルを編集する

Apacheの設定ファイル初期の設定ファイルなど
RedHat/CentOSの場合: **/etc/httpd/conf/httpd.conf**
デフォルトの設定は上記のファイルに設定されているようです。バーチャルホストの設定をする方法として上記ファイルを編集する方法と

以下ディレクトリに新しい設定ファイルを作成する方法があります。
**/etc/httpd/conf.d/**

今回は
**/etc/httpd/conf/httpd.conf**の設定ファイルを編集する方法でバーチャルホストの設定をやってみたいと思います。

Apache 2.2 以前ではNameVirtualHostディレクティブの使用が必須でしたが、Apache 2.4以降では不要になりました。


DocumentRootはウェブサイトのファイルが格納されるディレクトリを指し、ServerNameはドメイン名を指定します。

```
<VirtualHost *:80>
  ServerName any
  DocumentRoot /var/www/html
</VirtualHost>
<VirtualHost *:80>
  ServerName test
  DocumentRoot /var/www/html/
</VirtualHost>
<VirtualHost *:80>
  ServerName b.test
  DocumentRoot /var/www/html/
</VirtualHost>

```

設定が終わったら以下のコマンドで設定ファイルに間違いがないかチェックします。
```
apachectl configtest
```
## ３表示するコンテンツを配置する

３Apacheの再起動を行います
４DNS設定の更新



初期設定ではドキュメントルートが/var/www/htmlになっています。このディレクトリに適当なHTMLを配置しましょう。

```HTML:index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>test1</title>
</head>
<body>
    <h1>test1</h1>
</body>
</html>
```


設定が完了したらApacheを再起動します。
sudo systemctl restart httpd

## hostsファイルを編集する
今回はテストのためhostsファイルにドメイン名を登録してアクセスしてみます。
hostsファイルを設定したホストからしか、バーチャルホストで設定したサイトにアクセスすることはできません。
windowsの場合
C:\Windows\System32\drivers\etc\c
2024/3/18主にITとかセキュリティの記事

エンドポイントセキュリティの重要性と現代企業の対策：全面的なガイド(3/15)
https://cybersecurity-jp.com/contents/librussc/311/

実在組織をかたるフィッシング詐欺に注意！(2024年3月)(3/16)
https://www.city.abiko.chiba.jp/kurashi/shohiseikatsu/kawaraban/r5_kawaraban/fishing.html

【経営者層：調査レポート】サイバーセキュリティ対策へ年間約1000万円投資している企業の中で約7割が事業成長率 前年比100％以上を達成
〜 アクトがサイバーセキュリティ対策と事業成長の相互関係について調査を実施〜(3/16)
https://prtimes.jp/main/html/rd/p/000000108.000076503.html

ペネトレーションテストとは何か、なぜ必要なのか(3/14)
https://cybersecurity-jp.com/contents/librussc/302/

2024年のサイバーセキュリティトレンド予測、ここでも生成AIがキーワードに　Gartner(3/16)
https://atmarkit.itmedia.co.jp/ait/articles/2403/16/news031.html

サイバーセキュリティの最前線：現代の脅威と効果的な対策の解説(3/14)
https://cybersecurity-jp.com/contents/librussc/295/

脆弱性診断の基礎: 初心者ガイド(3/14)
https://cybersecurity-jp.com/contents/librussc/292/

東京電力をかたるフィッシング確認、注意を(3/16)
https://news.mynavi.jp/techplus/article/20240316-2907740/

日産自動車オセアニア部門への不正アクセス、10万人の個人情報流出(3/16)
https://news.mynavi.jp/techplus/article/20240316-2906964/

マルウェア対策の最新技術(3/14)
https://cybersecurity-jp.com/contents/librussc/299/

FinTech Camp パスワード課題の解決に向けて（後編）
https://xtech.nikkei.com/atcl/nft/event/00078/

生成AI利用時のリスクを補償？「専用保険」が国内に誕生…注意すべき3つのリスクと対象となる損害を聞いた(3/16)
https://nordot.app/1141563734185640268

富士通、情報漏洩の恐れ(3/16)
https://www.nikkei.com/article/DGKKZO79300150V10C24A3TB0000/

マクドナルド、全世界でシステムダウン - 原因は業者による設定変更と発表(3/16)
https://news.mynavi.jp/techplus/article/20240316-2907735/

「えっ、サイバー攻撃?」マクドナルドのシステム障害、海外でもトラブル発生 SNSで憶測広まり大混乱(3/15)
https://news.biglobe.ne.jp/entertainment/0315/spn_240315_9335960592.html

マック復旧、通常営業に　大規模障害「深くおわび」(3/16)
https://www.sankei.com/article/20240316-HMEUO7W4YRPOZGEPN47VOFNT6A/

マクドナルド、ほぼ全店で営業再開　システム障害の原因はプロバイダーの設定変更(3/16)
https://news.ntv.co.jp/category/economy/4a4aca7408dd477fb7d23470ca3a7d14

データセンターの物理的セキュリティ対策(3/15)
https://cybersecurity-jp.com/contents/librussc/306/

埼玉県警のサイバー犯罪防止動画　「ゆっくり解説」で再生増…「セキュリティーアワード」優秀賞に(3/16)
https://www.yomiuri.co.jp/local/saitama/news/20240315-OYTNT50259/

サイバー保険、国家関与は「戦争免責」
損保4社、対象厳格に(3/16)
https://www.nikkei.com/article/DGKKZO79306140W4A310C2MM8000/

［社説］あまりにお粗末なNTT西日本(3/16)
https://www.nikkei.com/article/DGXZQODK15ADJ0V10C24A3000000/

クラウドセキュリティ診断とは(3/14)
https://cybersecurity-jp.com/contents/anet-security/column/120/

北朝鮮、ハッキング増えたが金にならず…暗号資産窃取金額が半分に(3/16)
https://japanese.joins.com/JArticle/316279?sectcode=510&servcode=500%20title=

「仮想通貨のETFを今後承認する前に対策が必要」米議員がSEC委員長に書簡送付(3/16)
https://coinpost.jp/?p=516957

AIが詐欺師に!? チャットサービス悪用の新手口 被害も(3/16)
https://www3.nhk.or.jp/news/html/20240316/k10014392991000.html

ソフトウェア開発の安全性を高めるための包括的アプローチ(3/15)
https://cybersecurity-jp.com/contents/librussc/314/

業務に直結する「プログラミング言語」おすすめ5選をわかりやすく解説！(3/15)
https://www.persol-group.co.jp/service/business/article/11980/

セキュリティエンジニアとは？仕事内容や年収、必要なスキルも紹介(3/16)
https://www.sejuku.net/blog/241196

【日本】LINEヤフー、デジタル時代の民主主義の在り方で外部有識者提言書公表(3/16)
https://sustainablejapan.jp/2024/03/16/line-yahoo-democracy-in-digitalized-world/100384

米NYタイムズ、OpenAIの主張に反論　著作権訴訟で(3/16)
https://www.nikkei.com/article/DGXZQOGN14DWP0U4A310C2000000/

風化する北朝鮮制裁　国連決議6年超なし、貿易は再拡大(3/16)
https://www.nikkei.com/article/DGXZQOUA064FQ0W4A200C2000000/
Seer: Language Instructed Video Prediction with Latent Diffusion Models

この記事では，「Seerの紹介」と「Seerによる動画予測」について執筆します．

# 参考文献

この記事は以下の情報を参考にして執筆しました．

https://seervideodiffusion.github.io/

# Seerとは？

以下の論文で発表された「言語指示による動画予測モデル」です．

https://arxiv.org/abs/2303.14897

Seerは，ロボットに未来を予測する能力を持たせるために，事前に学習された"text-to-image (T2I) stable diffusion"を時間軸に沿って膨らませた（サンプル効率と計算効率の良い）モデルです．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149146/2a2c41d8-5bb5-a249-ef6b-b69b06083d38.png)

図：手法（出典：[Seer](https://seervideodiffusion.github.io/)）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149146/9ff5976b-50a1-e840-1de4-0c99f5d215ff.png)

図：結果（出典：[Seer](https://seervideodiffusion.github.io/)）

# Seerを用いた動画予測

以下のコードを用いて実際に動画予測を行ってみました．Google Colab（GPU: T4）で実行しました．

https://github.com/seervideodiffusion/SeerVideoLDM

## ライブラリのインストール

```
!pip install einops accelerate diffusers[torch]==0.11.1 rotary-embedding-torch==0.1.5 xformers
!pip install hydra-core --upgrade
```

## 学習済みモデルのダウンロードと移動

学習済みモデルは，以下の2つです．

- pytorch_model.bin
- pytorch_model_1.bin

### 学習済みモデルのダウンロード

```
!wget https://huggingface.co/xianfang/SeerVideo/resolve/main/sthv2bridge_seer/learned_sdunet-steps-80000/pytorch_model.bin
!wget https://huggingface.co/xianfang/SeerVideo/resolve/main/sthv2bridge_seer/learned_sdunet-steps-80000/pytorch_model_1.bin
```

### 学習済みモデルの移動

```
!mkdir -p ./outputs/sthv2_seer/learned_sdunet-steps-80000
!mv pytorch_model.bin ./outputs/sthv2_seer/learned_sdunet-steps-80000
!mv pytorch_model_1.bin ./outputs/sthv2_seer/learned_sdunet-steps-80000
```

## "./configs/inference_base.yaml"の編集

```diff
- saved_global_step: 200000 # saved global steps of checkpoint folder
+ saved_global_step: 80000 # saved global steps of checkpoint folder
```

## 推論

```
!python inference_img.py --config="./configs/inference_base.yaml" --image_path="./src/figs/book.jpg" --input_text_prompts="close book"
```

## 推論結果

### 入力

- 画像

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149146/9a1d9715-1df6-ae1f-6232-752367546bc1.png)

- プロンプト

```python
# 本を閉じる
input_text_prompts = "close book"
```

### 出力

- Video Clip（GIF動画）

![book_3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149146/35bf18c9-d730-0ac7-f341-643c28e38476.gif)

- 連続画像

![book_grid_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149146/ad9f8aa4-0236-7286-e247-394c685e8d71.png)


# まとめ

この記事では，「Seerの紹介」と「Seerによる動画予測」について執筆しました．
Rails/devise_アカウント情報編集ボタンが反応しない場合解決方法

# はじめに
初歩的な記述ミスが原因で起こったエラーですが、
原因を見つけためにかなり時間がかかったのでまとめます:joy:

# 環境
・Ruby　3.1.2
・RubyGems　3.3.7
・Bootstrap　4.6.2
・class Public::UsersController < ApplicationController作成済み
・Deviseを使用してユーザー認証機能を実装

# 1.発生した問題
マイページ内にある「編集する」ボタンを押して会員情報編集画面に遷移したあと、
会員情報を編集し、「編集内容を保存」を押すと、更新されない（__ボタンが反応しない__）ことがある。![スクリーンショット 2024-03-18 010002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724261/22736ad3-01f6-2af3-32b5-e92d3b9a1f11.png)
![スクリーンショット 2024-03-17 212140.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724261/8aef77df-f6c4-e3ce-0811-a0ca42797bb1.png)


# 2.疑った原因
・編集フォームで入力されたデータの送信先のパスの記述が間違っている
・ルーティングの記述が間違っている
上記については特に問題はありませんでした。

# 3.原因と解決方法
デベロッパーツールを使って編集ページをくまなく見たところ、
以下のようにform_withメソッドの直下にあるはずのtrタグがない。
つまり、
__tableタグ内にform_withメソッド書いたことが原因で起こるエラーと判明しました！__

### ＜誤った記述の場合＞
![スクリーンショット 2024-03-17 212305.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724261/0ef136c8-be56-4aa3-6e05-16bf6c86b9eb.png)
![スクリーンショット 2024-03-17 212058.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724261/dd301b5e-b364-ad77-70c1-8a66c65a6bb4.png)

↑
HTMLの使用上、formタグは直接tableタグ、trタグ、tdタグなどの中に入れ込むことができない為、
誤ってtableタグの直下に書いてしまうと、今回のようなエラーが起こってしまいます💦

### ＜修正した場合の記述＞
__以下のようにtableタグの外にform_withメソッドを書くことで本来tableタグの中に含まれるtrタグが表示され、エラーが解消されました。__
![スクリーンショット 2024-03-17 212436.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724261/b4081171-2200-945f-73ec-a9709ef8958d.png)
![スクリーンショット 2024-03-17 211728.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724261/b3c14abf-69b4-55fe-cc40-67f5f15c349e.png)


# 4.終わりに
エラーが起こるとルーティングの設定ミスや、パスの記述ミスばかり目がいってしまい
tableタグの内側にform_withメソッドを書いているというミスになかなか気づくことが出来なかったことを反省しつつ、デベロッパーツールを使用して表示内容ごとにコードを確認してエラーを見つけることの大切さにも気づきました。
まだまだ未熟ですが、めげずに続けていこうと思います:grin::thumbsup:
os再インストールでgit bashからgit hubへssh接続できなくなった場合の対象方法

# git cloneできなくなった

OS再インストール後、いつも通りgit cloneを行おうとしたら、以下のメッセージが表示されてクローン出来なかった。
``Please make sure you have the correct access rights and the repository exists.``

## 対処法
コマンドラインにおいて

``ssh-keygen -t ed25519``
↓
``Created directory '/Users/ユーザー名/.ssh'.``
公開鍵と秘密鍵を生成するディレクトリを選択する。（特に指定がなければ、Enterで大丈夫）
↓
``Enter passphrase (empty for no passphrase):``
接続時に使用するパスワードを入力（任意）
↓
``Enter same passphrase again:``
入力したパスワードの再入力
↓
鍵の作成完了。

## Githubへ生成した鍵の登録
コマンドラインにおいて

``cat ~/.ssh/ed25519_pub``
↓
``ssh-ed25519 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(ランダムな文字列) ユーザー名＠PC名``
をコピーする。
↓
githubのダッシュボードへアクセス（<a href="https://github.co.jp/">GithubへのURL</a>）。
↓
画面右上（自分のアイコン）をクリックし、``「setting」`` → ``「SSH and GPG keys」``をクリックする。
↓
``「SSH keys」``→``「New SSH key」``をクリックし、以下を入力する。
- ``Title``　→　登録する鍵が、どのような鍵なのかが分かりやすい名前を入力する。
- ``Key type`` →　Authentication Key
- ``Key``　→　先ほどコピーした公開鍵を張り付ける。

以上でgithubへ生成した鍵の登録が完了。

## 古いfingerprintsを削除する。
``ssh-keygen -R github.com``
をコマンドラインで入力する。


## git clone（pull）を実行。

``Are you sure you want to continue connecting (yes/no)?　→　yes``

成功。

## .gitconfigが消えていて、VScodeでGitコミットが失敗する場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631159/1431b9e2-54f7-4271-d987-4146fdc3ad47.png)
- ikkikさんが作成された記事を確認してください。
https://zenn.dev/ikkik/articles/475924c5c97718

## まとめ
- 新たに鍵を生成
- 生成した鍵の登録
- 古いfingerprintsの削除
- 行いたかったアクションを実行。

備忘録です。
【Swift5】SystemSoundを繰り返し連続で再生する

システムサウンド（効果音）を連続で鳴らす方法について紹介する。
同じ方法でバイブレーションを再生することもできる。

```swift
var counter = 3
```
```swift
func soundCallback(sID: SystemSoundID) {
        counter -= 1
        if counter > 0 {
            Thread.sleep(forTimeInterval: 0.5)
            AudioServicesPlaySystemSound(sID)
        } else {
            AudioServicesRemoveSystemSoundCompletion(sID)
        }
    }
    
func alarmStart() {
    let soundID:SystemSoundID = 1036
    AudioServicesAddSystemSoundCompletion(soundID, nil, nil, { (soundID, _) in
        // Convert to function pointer
        ContentView().soundCallback(sID: soundID)
    }, nil)
    AudioServicesPlaySystemSound(soundID)
}
```

alarmStart関数を呼び出せば、3回システムサウンドが再生される。

AudioServicesAddSystemSoundCompletionを使うと、第４引数で指定したコールバック関数がシステムサウンドの再生が終了したときに呼び出されるため、これを利用することで繰り返しサウンドを再生することができる。

下から２行目のAudioServicesPlaySystemSound(soundID)は、1回目の再生であり、これ以降はsoundCallback関数が呼び出される。counterが０になったところで、AudioServicesRemoveSystemSoundCompletionでコールバックを解除する。

ちなみに、音の種類はSystemSoundIDで指定することができる。以下の記事を参考にすると良い。

https://zenn.dev/p_x9/articles/b615b8d17e7a70


# 参考
https://developer.apple.com/documentation/audiotoolbox/1405244-audioservicesaddsystemsoundcompl

https://developer.apple.com/documentation/audiotoolbox/audioservicessystemsoundcompletionproc

https://psychlab.jugem.jp/?eid=428

https://shu223.hatenablog.com/entry/20110215/1299431099
AIが学術雑誌の💩品質な査読を明らかにしてしまっている件について

## まずは以下のツイートを見てください。

https://twitter.com/Saboo_Shubham_/status/1768714521340752093?t=IelVRlx8F5voc4X372uP9w&s=19

Elsevierに投稿された論文ですがIntroductionを見てみると、文頭に
>**”Certainly,Here is a Possible introduction for your topic”**
（もちろんです。こちらがあなたのトピックのための可能な導入部です）

とありますね。**絶対ChatGPTに**
**”以下の内容の論文に対して考えられるIntroductionを書いて”**
とか言ってそのままコピペしてますよねww

## まだまだ終わりません。
次は以下のTweetをご覧ください。

https://twitter.com/hardmaru/status/1769270672646357171?t=X-PiyrsVU7t_H_Ly1MW7Ag&s=19

こちらもElsevierですがDiscussionの部分を見てみると
>**I'm very sorry, but I don't have access to real-time information or patient-specific data, as I am an AI language model.**
(申し訳ありませんが、私はAI言語モデルなのでリアルタイムの情報や患者固有のデータにアクセスすることはできません。)

とありますねw こっちは**最早自分がAIだとゲロってしまっています。**

この記事の執筆時点では両方の論文とも修正はされていません。ご自分で確かめに行ってみてはいかがでしょうかw

## さて極め付けは以下の記事をご覧ください

[有名科学誌の査読済み論文に画像生成AIで作られた「巨大な性器を持つ謎ラットの意味不明なイラスト」が挿入され話題に](https://gigazine.net/news/20240216-scientist-paper-using-ai-image/)

現在では撤回されていてPDFをダウンロードするとRetractedの文字がありますが、問題なく閲覧できます。
### ちなみにAltmetricスコア（注目度スコア）が6000を超えていますw
![funnyfigure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3743979/fec040e3-599c-4de0-42e8-2ec7d6cb31bf.png)

Frontiersに投稿された論文です。
これらの画像はMidjourneyで作られています。


## 記事執筆時点でのそれぞれの影響力

- 最初のツイート→IF 6.2(Surfaces and Interfaces)
- 二番目のツイート→CiteScore 1(Radiology Case Reports )
- 最後の記事 →　IF 5.5(Cell and Developmental Biology)
でした。


最初と最後はなかなか影響力があると言えるのではないでしょうか。


### えーっと、、、査読とは
Rails_リクエストがDELETEの代わりにGETで送信される場合の対処法！

# はじめに
2023年12月からプログラミング学習を始めました :smiley:
アウトプットのために今まで起こったエラーや学習したことをまとめようと思います。
初心者のため、解釈などに誤った点があるかもしれません💦
その際はお気軽に教えて頂けますと大変助かりますm(__)m!!

# 環境
・Ruby　3.1.2
・RubyGems　3.3.7

# 1.発生した問題
Deviseを使ってWebアプリにログアウト機能を実装したが、
ログアウトボタンを押すと、[DELETE]メソッドで送信したいリクエストが[GET]メソッドとして送信されてしまい以下のようなエラーが表示される。

![スクリーンショット 2024-03-17 230022.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724261/82b7e1c6-50e2-efa8-eb30-c0ba1a2a6b87.png)

# 2.疑った原因

①ルーティングの設定に間違いがある。
[■参照した記事](https://qiita.com/rhythmic0531/items/27c87dd7465d44416813)

確認したところ、問題はありませんでした。↓
![スクリーンショット 2024-03-17 231640.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724261/6131f939-d31c-5908-8017-22d8343a6dcb.png)

　
②コーディングに間違いがある。

こちらも問題なし↓
```php:show/html/erb
<%= link_to 'ログアウト', destroy_admin_session_path, method: :delete %>
```

③サーバーに問題がある

④javascriptタグが記述されていない
　[■参照した記事](https://qiita.com/yuskamiya/items/ee5280dfcbca9d7216ae)

 など...間違いを探すも見つかりませんでした。


 # 3.解決方法
__「webpackをアップデートすることでエラーが解消されました！」__

＜アップデート方法＞
　以下のコマンドを使用することでバージョンアップができます。
 ```
 $ npm update webpack
 ```
 
 ＜↑経緯＞
 Bootstrapが反映されないことなどからjavascriptが怪しく感じ、
 メンターにjavascriptが原因につながるものは他にないか質問したところ、
 __「webpack」が原因なのでは？__
 と教えてもらい今回の解決方法に至りました！
 教えて頂いたメンターさんに感謝です:joy:!!

 # 4.解消理由の推察
 __「アップデートすることでwebpack（パッケージ）とGemのバージョンの違いによるエラーが解消でき、ログアウトできるようになった。」__

 ※↑間違っているかもしれないので、正しい理由がわかる方は教えて頂けますと幸いですm(__)m!!

 # 5.webpack（パッケージ）について
 
webpack（パッケージ）についての理解はかなりボリュームがあるため、
こちらの記事を参考にしてみてください:grinning:

 ■　[【Webpack】Webpackについてまとめてみた](https://qiita.com/yokoto/items/351910ee094e730f17d0)

 ■[　やっぱりwebpackがわからない（エピソード1）](https://zenn.dev/antez/articles/58307946cf4f3e)
AWS SAAに合格しました

# はじめに
AWS SAAに(予定よりも遥かに遅れて)合格したため、振り返りと備忘録を兼ねてやったことをまとめておきます。

# 投稿者の情報
- 情報系大学出身、(ギリ)2年目
- 所持資格：IPA FE/AP/SC/DB
- AWSの業務経験：約1年程度
- AWS SAA受験回数：2回目
※業務が暇になった時期に大した勉強もせずノリで受けて落ちました


# 受験の感想と結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748131/5036e83e-55d8-b5e8-88b3-99b40f646bd4.png)
受験結果ですが、合格点720点に対して823点での合格でした。
AWSの資格は65問の出題に対し50問が採点対象、15問が難易度調整用(？)となっており、100～1000点の範囲で得点が付きます。
問題ごとの配点は明らかではないですが、大体8割程度の得点率でした。

受験後の温度感としては、6割は確実、7割はやや不安といった感じだったので思ったよりも点数が取れていた印象です。


# やったこと
受験にあたり行った学習内容は以下の通りです
- 動画コンテンツによる学習(50h程度？)
→あまり効果がありませんでした
投稿者には合いませんでしたが、基本的にはやった方がいいと思います。
- 模擬問題を解く(20h程度)
→今回、一番よかったのはこれです
AWS公式の20問+Udemyから300問程度を解き、わからない設定やサービスについて都度調べる形で学習をしていました
- 業務(？h)
→実際にAWS上での設定等を弄る機会はあまりなかったため、知識への寄与率はそこまでかなといった感じ。
AWSというか、マイクロサービスに対するイメージを持つのには役立ったかと思います。


# 利用した教材と所感

### 【SAA-C03】AWS認定ソリューションアーキテクト アソシエイト 試験入門完全攻略コース

https://www.udemy.com/course/aws-certified-solutions-architect-associate-jp/?couponCode=KEEPLEARNING

1回目の受験の際に解説部分の動画を一通り見ました。
投稿者は動画や講義のような形式が大変苦手で、正直これはあまり役立った印象がありませんでした。
Udemyでの評価も高いですし、当然人によると思いますが、個人的にはいらなかったかなと思います。


### 【SAA-C03版】これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座

https://www.udemy.com/course/aws-associate/?couponCode=KEEPLEARNING

2回目の受験の際に解説部分の動画を一通り見ました。
投稿者は(ry

こちらの教材に関しては最終セクションに模擬試験が含まれているんですが、この模擬試験に関しては非常に役立ちました。
基本的に模擬試験を受ける→間違えた/わからなかったサービスについて調べるの流れで知識を補完していました。

とはいえ、他教材で模擬問題に特化しているものがあるため、こちらも不要だったかなと思います。

### 【SAA-C03版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）

https://www.udemy.com/course/aws-knan/?couponCode=KEEPLEARNING

6回分(390問)の模擬問題集です。
一つ上の教材と同じ作者によるもののため、そちらの模擬試験と同一か非常に似た問題がある程度含まれます。
今回使った教材としてはこれが一番役立ちました。
問題を解く→間違えた箇所の公式ドキュメント等を読む、のサイクルを繰り返していました。

…が、体系的に学ぶ感じではなくあまりオススメできる勉強方法ではないため一般には知識の習得後に問題の感覚に慣れる+総復習的な形で使うのがいいと思います。

### AWS認定資格試験テキスト＆問題集　AWS認定ソリューションアーキテクト - プロフェッショナル

https://www.sbcr.jp/product/4815617929/

1段上の資格のテキストになりますが、楽天のお買い物マラソンで楽天Kobo枠を埋めるために買いました。
基本的に試験範囲としてはAWS SAP⊃AWS SAAであるため、SAA受験において知りたい内容は網羅されていると思います。
公式ドキュメントで理解しづらい部分を調べる場合等に使っていました。

### 業務でのAWS

業務で利用したサービスは以下の通りです。
アーキテクチャ的な側面でそこまで役立った知識はないかな…？

設定から触ったことがある
- AWS IoT
- AWS Kinesis
- AWS Lambda
- AWS QuickSight

開発で使ったことがある
- AWS S3
- AWS DynamoDB
- AWS EC2
- AWS ECS
- ...

# 受験費用
- 1回目受験(半額) 8,250円
- 2回目受験 16,500円 
- Udemy 3講座 3,900円
- 本 1冊 3,300円

計 31,950円

# 今後受験する人へ
- Udemyの動画教材の質はいいです。使えるなら使うべき(合うかは別)
- 基本的にはAWS上で色々触ってみた方が理解が早いと思います
- 問題文の読解に慣れた方が楽なので、模擬問題はある程度やるといいと思います

# 今後の予定

とりあえず4/15までの再受験無料クーポンが残ってるので、4月前半にDVAを受験予定です。
その後は4/21のITストラテジスト試験…

財務諸表の勉強がてら日商簿記3級とかやってて全然対策が進んでないですが…
論文テーマどうしようかなぁ医薬品で書くの厳しくない…？
[Django]トークン認証にdjangorestframework-simplejwtを利用する

## はじめに
自分用の個人開発のメモ/備忘録として記録していきます。

## 環境
django5.0
↓ dockerでの開発環境作成はこちら

https://qiita.com/mkthrkw/private/588226d30690c707d2b8

↓ 認証ユーザーモデルはこちらをそのままそのまま利用

https://qiita.com/mkthrkw/private/b2ea8fb8f33a68faab87


## やりたいこと
簡単に有効期限を設定したトークン認証を実装したい
リフレッシュトークンも使えるようにしたい

### django-rest-knoxと比較したい
django-rest-knoxについてはこちら

https://qiita.com/mkthrkw/private/6b8b60f05315ccfda99d


## 導入

### インストール
pipでインストール
```
pip install djangorestframework-simplejwt
```

### settings.pyの設定変更
・INSTALLED_APPSに追加
・DEFAULT_AUTHENTICATION_CLASSESを変更
・ACCESS_TOKEN_LIFETIME：トークンの有効期限を２時間に設定
・REFRESH_TOKEN_LIFETIME：リフレッシュトークンの有効期限を７日間に設定
・ROTATE_REFRESH_TOKENS：リフレッシュ トークン送信時に新しいリフレッシュトークンを取得できる
・UPDATE_LAST_LOGIN：ログイン時に auth_user テーブルの last_login フィールドが更新される

``` python: settings.py
INSTALLED_APPS = [
    'rest_framework_simplejwt',
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
}

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(hours=2),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=7),
    'ROTATE_REFRESH_TOKENS': True,
    'UPDATE_LAST_LOGIN': True,
}
```

### urls.pyを作成
・既存のViewを利用
``` python: urls.py
from django.urls import path
from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
)

urlpatterns = [
    path(r'token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path(r'token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]
```


## アクセスしてみる
・prefixは「auth」
・認証カラムをemailにしている

### トークン取得
・ヘッダーに「Content-Type: application/json」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680973/2d8a9fad-ef74-aa80-dcc1-4081954b5266.png)

### リフレッシュトークンを使ってトークン取得
・ヘッダーに「Content-Type: application/json」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680973/0b61f749-8c87-6bdb-448d-0229532954de.png)

### 何かのページへアクセス
・ヘッダーに「Authorization：Bearer {{jwt_access_token}}」
・認証して簡単なメッセージを返すURLへアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680973/1d4e5761-3191-5c7a-3282-3acb9fce5395.png)

有効ではないトークンだと４０１となる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680973/28865ae1-0d2c-3a2e-9277-a6b66f329147.png)


## おわりに
・JWTをすごく簡単に導入出来た
・細かな設定がデフォルトでいくつもあり便利


## 参考

https://github.com/jazzband/djangorestframework-simplejwt/tree/master?tab=readme-ov-file

https://django-rest-framework-simplejwt.readthedocs.io/en/latest/
AWS Lambda + Pythonで簡易LINEBOT作ってみた

## 作った経緯
LINEBOTを作ったら便利なのではという機会があったので、とりあえず簡易版を作ることにした。

最初はAzureBotService + C#でやっていたがテストBotのデプロイがうまくいかなかったため、AWSLambda + Pythonに変更

## 前提
LINE DevelopersでWebhookを利用できるBotを作成している。

## やったこと 
### AWS Lambdaで関数を作成する
1. AWSコンソールに飛び、Lambdaを検索する
1. 「関数を作成」をクリックする
1. 適切な関数名を設定
1. ランタイムでPythonを選択
1. 「関数の作成」をクリックする
1. 画面が戻った後、求めているBOTのコードを記述する

#### これで関数の作成は完了！

コードの複雑度によっては、ライブラリのインストールが必要ですが今回は標準のみなので省きます。
### API Gatewayの追加
1. トリガーを追加する
1. API Gatewayを選択する
1. Create a new APIを選択する
1. HTTP APIを選択する
1. SequrityはOpenを選択する
1. 「追加」をクリックする

#### これでトリガーの作成は完了！

### LINE BotにWebhook URLを追加する
1. 先ほど作成したAPI GatewayのエンドポイントURLをコピーする
1. LINE Developersから作成してあるBotのMessasing APIの項目に飛ぶ
1. Webhook URLがあるのでコピーしてあるエンドポイントURLをペーストする
1. Velifyを押して検証する
1. 「Success」と表示されたら完了

#### これでURLの追加が完了

## LINEに追加する
1. QRコードを読み取ってLINEに追加する
1. メッセージを送って求めた回答が返ってきたら終了

### LINEBOTの完成！

## 最後に
自分の体験のただのアウトプットなのでかなり雑ですし、抜けてるところもあるかもしれません。
まだまだ初学者のためお許しを。
皆さんも自分好みのLINEBOTを作ってみてください!
初めてのAWS認定試験はDVAを選びました（学習方法備忘録）

## はじめに
エンジニア歴4年目です。
AWSに興味はありつつも、業務で扱うことはなかったのできちんと勉強したことはありませんでした。
このたびAWSの現場に入り、デプロイ担当となったため「勉強しないとまずいかも…」と思い、Codeシリーズが登場するDVAから始めました。
（本当はCLF→SAAのステップを踏みたかったですが、そんな時間もなく…）

今年はAWSアソシエイト3冠するぞと意気込んだものの、来月からAWSの現場ではなくなるのでしばらくはお預けかもしれません。
今回学んだ効率的な方法を次に活かすために備忘録として書きます。

## 結果
755点でした（720点以上で合格）
初めてのAWS認定試験でしたが、一発で合格できました。

## 学習期間
2023/12/26〜2024/3/16の約3ヶ月、約100hです。
転職活動したり個人開発もしたり、集中しないと無理だと思って本腰を入れたのは2月からでした。
集中して学習する時間が取れるなら1ヶ月くらいで合格するのは可能と思いました。
（びびって試験予約が遅くなってしまったのですが、2月下旬に受けていても問題なさそうでした）

## 学習方法
### ①CloudTech
AWSの学習方法といえばUdemyの問題集を解くというイメージでしたが、改めて調べてみるとCloudTechがいいと多く見かけたので、キャンペーン期間中に永久ライセンスを購入しました。
DVAの問題は計264問。1問あたり3〜5周はしました。
Ping-tのような感じかなと思いましたが、前回の正答は記録されず、間違った問題のみを繰り返し解くというようなことはできませんでした（Excelで正答を管理していました）。
問題の内容や解説はよかったです。
動画を見たり、ハンズオンもいくつか行いました。
（イメージのしにくかったLambdaやCloudFormationなど触れば覚えるかなと思いましたが、たった1回では次の日には忘れてしまいました…）

### ②ポケットスタディ AWS認定デベロッパーアソシエイト [DVA-C02対応]
①は問題集なので、それとは別に事前知識を身につけるため・暗記するための読み物が必要と感じました。
DVAで対策本はこれくらいしかないので迷わず購入しました。
結局1周しかできませんでした。
問題集はピンポイントな内容の一問一答形式が多く、実際の試験の問題とは異なりました。
特にこの本は買わなくても問題なかったと思います。

### ③公式の問題集・動画（無料）
もちろん試験ガイドは最初に読みました。
サンプル問題、模擬試験があり、模擬試験は3周して正答率65〜70％でした。

公式の動画は、はじめCLFの動画を見て合わず、あまり期待していませんでした（全部見切れず途中でやめた）
DVAのデジタルトレーニングの動画は試験一週間前に見たのですが、要点がよくまとまっており、パワーポイントだけでもとても分かりやすかったです。
最初に要点を掴むのと、最後の確認として2回見るのがおすすめと思いました。

## 効率的な方法
### ①自分用のノートを作成する
よく出る箇所をまとめた本が売っているならよいのですが、ないので問題集を解く中で、よく出るもの、暗記すべきもの、間違えたものをメモりました（Qiitaの下書きに書いていました）。
CloudTechの解説はコピペできなくて手打ちする必要があり、その過程でも覚えることができました。
通勤中に読み返して知識を定着させていました。

### ②とにかく集中する
10問ずつではなくある程度まとめて解くのがよいです。
休日に60問とかまとめて解いて、要点をメモしていました。
個人開発をしているとそれに時間を使って、DVAの問題を解く時間が取れないということが多々あったので、DVA以外はやらないと決めました。
初見の問題を通勤中に10問ずつ解くのは、あまり効果的ではありませんでした。ノートを見て暗記したり、ある程度覚えてから3周目くらいを解くならよかったです。

### ③同じ問題を繰り返し解く
CloudTechでは同じ問題を繰り返し解くのをおすすめしていました。
10問解いたらその後すぐにまた同じ10問を解くという形です。
回答を覚えてしまうので意味ないと思いましたし、初見の問題がボロボロだったので不安でした。
実際同じ問題も出るし、慣れることが重要なので良い方法だと実感しました。

## 試験当日
朝が弱い私はいつも15時を選びます。
午前中2時間ほど動画を見たり、問題集を解いたり、会場に向かう電車の中でノートを見返していました。

いつも小さい画面で問題を見ていたのですが、試験会場のデスクトップが大きく、設問を読むのに目を動かさなければならないのが大変でした。
設問は問題集よりも若干長く感じました。
全く知らない問題が最初2問くらい出たので焦りましたが（後でSAAも解いてみたらSAAに近い内容でした。得点対象外の問題かもしれませんが）、その後は見たことあるような内容でした。
全く見たことないのが1割、見たことある問題が2割、問題集の類似問題がその他という感じですかね。
2つ選ぶ問題は思ったより少なくて助かりました。
あとは、あまり問題集には出てこず対策してこなかったコンテナ系、ストレージ系（S3以外）が意外に出た印象でした。

試験会場はどこも同じような感じですが、騒音が気になりました（隣の機械音、自分のクリック音、誰かのキーボード？電卓？の音、外の車の音）
ヘッドホンをしていましたが、途中頭痛がひどくなり外しました（薬飲まないとダメかと思いきや、ヘッドホンが原因でした。耳栓もらえばよかったです）

40分くらい時間が余り、フラグをつけていた問題を見返しました。
20分くらい時間を残して試験終了しました。
他の試験はいつもその場で結果が出るのですがAWSは出ず、3時間後にメールで来ました。
1回落ちても再試験無料キャンペーンを利用しましたが、受けるだけでもかなりのエネルギーを使うので一発合格できてよかったです。

## 総評
結局最初の目的であったCodeシリーズを扱う上で知っておくべきことを知りたいというのは、現場においてほとんど発生せず、試験においてもLambdaとかCloudFormationとかDynamoDBとかが多かったです。
とはいえ、DVAの問題は実際の開発現場で起こるような事象、開発手法、対処方法が問われるので、そのような経験を疑似体験できるような楽しさがありました。
リーダーたちが話すAWSについての話が少し分かるようになりました。
現在AWSの現場ではなくても勉強になる部分はあると思うし、次AWSの現場に入りたいという気持ちがあるなら足掛かりとして勉強するのは良いと思いました。
設計や運用も気になるのでSAA、SOAもいつか挑戦してみたいです。
Macbookショートカットキー一覧

# はじめに
本記事は備忘録です。普段windowsを使用していますが、macbookを使用する際にショートカットキーが若干異なるのでチートシートのような扱いで記述しています。キーボードの兼ね合いでcommandキーとcontrolキーを入れ替えています。

# 汎用的なショートカットキー
以下にショートカットキー一覧を示す。
| ショートカットキー | 説明 |
|:-:|:-:|
|ctl + C   |クリップボードにコピー   |
|ctl + X  |クリップボードに切り取り、コピー   |
|ctl + V   |クリップボードにコピーした内容を貼り付け   |
|ctl + Z   |直前の捜査の取り消し   |
|ctl + A   |項目を全て選択   |
|ctl + F   |書類内の文字列検索   |
|ctl + O   |ファイルを開くウィンドウを出力  |
|ctl + S   |上書き保存   |
|ctl + T   |新しいタブを開く   |
|ctl + スペースバー   |スポットライト検索フィールドの表示・非表示の切り替え   |
|ctl + command + F|全画面表示|

# Finderとシステムに関するショートカット
| ショートカットキー | 説明 |
|:-:|:-:|
| ctl + D  |選択ファイルの複製   |
| ctl + E  |選択したディスク・ボリュームの取り出し   |
| ctl + I  |選択ファイルの詳細情報の確認   |
| ctl + C → ctl + option + V   |選択ファイルの移動   |
|shift + ctl + deleteキー|ゴミ箱を空にする|
|ctl + deleteキー|選択ファイルをゴミ箱に移動|
|ctl + K|挿入ポイントから行または段落の末尾までの範囲にあるテキストを削除|
|fn + ↑|1ページ上にスクロール|
|fn + ↓|1ページ下にスクロール|
|fn + →|書類の先頭までスクロール|
|fn + ←|書類の最後尾までスクロール|
|ctl + ↑|挿入ポイントを書類の先頭にする|
|ctl + ↓|挿入ポイントを種類の末尾に移動|
|ctl + →|挿入ポイントを現在の行の先頭に移動|
|ctl + ←|挿入ポイントを現在の行の末尾に移動|
|option + ←|挿入ポイントを前の単語の先頭に移動|
|option + →|挿入本とを次の単語に移動|
|shift + ctl + ↑|挿入ポイントから書類の先頭までの範囲のテキストを選択|
|shift + ctl + ↓|挿入ポイントから書類の最後尾までの範囲のテキストを選択|
|shift + ctl + →|挿入ポイントから現在の行の末尾までの範囲のテキストを選択|
|shift + ctl + ←|挿入ポイントから現在の行の先頭までの範囲のテキストを選択|
|shift  + ↑|選択した行の1つ上の行まで選択範囲を拡大|
|shift  + ↓|選択した行の1つ下の行まで選択範囲を拡大|
|shift + →|選択した文字の1つ右の文字まで選択範囲を拡大|
|shift + ←|選択した文字の1つ左の文字まで選択範囲を拡大|
|command + A|行の先頭に移動|
|command + E|行の末尾に移動|



# 参考サイト
[Mac のキーボードショートカット
](https://support.apple.com/ja-jp/HT201236)
CKEditor4で作成したテキストエリアに入力した値を、Vue3でリアルタイムレンダリングする

```
<!DOCTYPE html>

<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/vue@3.2/dist/vue.global.js"></script>
<script src="https://cdn.ckeditor.com/4.7.3/standard/ckeditor.js"></script>
</head>

<body>
    <div id="app">

                <textarea name="editor1" id="editor"></textarea>
                <br>
                <!-- <div>{{ textareaInput }}</div> これだとHTMLタグもそのまま出力されてしまう（<h1>これは見出しです</h1>みたいに）-->
                <div v-html="textareaInput"></div>
    </div>
    <script>

    const app = Vue.createApp({
      data() {
        return {
          textareaInput: '' // CKEditorの入力値を保持するデータプロパティ
        }
      },
      mounted() {
        // CKEditorの初期化
        CKEDITOR.replace('editor', {
          // CKEditorの設定を追加
          // ここに必要な設定を追加
          // 例: toolbar, language, width, heightなど
        }).on('change', () => {
          // textareaの値が変更された時に、Vue.jsのデータを更新
          this.textareaInput = CKEDITOR.instances.editor.getData();
        });
      }
    });

    app.mount('#app');
                </script>

</body>
</html>
```
OCamlでdologを使ってログ出力をする

OCamlでかなり軽量なログ出力のための `dolog` というライブラリを使ってみた。インストールはopamで簡単に入る。versionは現時点での最新は `6.0.0` だった。

```console
opam install dolog
```

## 使い方

使い方は簡単。次のように `Log.debug` みたいな関数を呼ぶとログが出力される。出力先はデフォルトでは標準出力だが、選ぶこともできる。

```ocaml
module Log = Dolog.Log

let () =
  let n = 123 in
  Log.set_log_level Log.DEBUG;
  Log.debug "デバッグなんだぜ: %d" n
```
↓こんな感じでログが出る
```ocaml
2024-03-12 08:23:18.970 DEBUG: デバッグなんだぜ: 123
```

## できるっぽいこと
* 標準出力やファイルへ出力するログを出す
* 時刻が勝手についてくれる
* フォーマット文字列が使える
* 端末で見るためのカラー表示

## できないっぽいこと
* 行番号やファイル名の自動出力
* 複数チャンネルへの同時ログ出力

## 宣伝

[Bitflyer](https://bitflyer.com/) の取引をocamlでするライブラリを作りました。OCamlから暗号通貨の売買や情報の取得ができます。`dolog` を使っています。

https://twitter.com/yoshihiro503/status/1766633155078025216
貢献と名誉によって巡る経済

# はじめに
誰もがオープンソースムーブメントを利用してソフトパワーを獲得し、競争力を高めることができる現代。実際何をすることで何を得られるのか考えていきましょう。キーワードは **貢献** と **名誉** です。

# オープンソースムーブメントにおける貢献とは
オープンソースムーブメントにおける貢献とは、ソフトウェアやプロジェクトに対して何らかの形で寄与することを指します。これには以下のような活動が含まれます。

1. コードの貢献
ソースコードの修正や新しい機能の追加などプロジェクトにコードを提供することができます。これによってソフトウェアの品質向上や機能の拡張が可能となります。

2. バグの報告と修正
ソフトウェアのバグや問題を報告することで貢献することができます。また、報告されたバグを修正するためにパッチを提供することもあります。

3. ドキュメンテーションの改善
ソフトウェアのドキュメンテーションを改善することで貢献することができます。わかりやすいドキュメントは他の開発者やユーザーがソフトウェアを理解しやすくし、効果的に利用できるようにします。

4. テストと品質管理
ソフトウェアのテストや品質管理、ドキュメントのレビューに貢献することができます。これによって、バグの早期発見や品質の向上が図られます。

5. コミュニティのサポート
コミュニティやフォーラム、メーリングリストで質問に答えたり、他のユーザーにサポートを提供することで貢献することができます。これによって、コミュニティ全体の活性化や成長が促進されます。

これらの貢献は、オープンソースソフトウェアの開発と維持に不可欠です。多くの場合、貢献者は自発的に行動し、他のユーザーや開発者と協力してプロジェクトを改善し、成長させます。

# オープンソースムーブメントにおける報酬とは
オープンソースソフトウェア開発やオープンソースムーブメントに貢献することは、多くの場合、直接的な金銭報酬を得るというよりも、他の形の報酬が期待されます。以下に、オープンソースムーブメントにおける報酬として期待できるものをいくつか挙げてみます。

1. 社会的名声と評価
オープンソースプロジェクトへの貢献は、技術コミュニティや業界内での評価を得るための有力な手段です。優れたコードや貢献は他の開発者からの尊敬や称賛を受けることが期待されます。

2. スキルの向上
オープンソースプロジェクトへの貢献は、自分のスキルを向上させるための絶好の機会です。他の優れた開発者と協力して仕事をすることで新しいテクニックやベストプラクティスを学ぶことができます。

3. キャリアの発展
オープンソースプロジェクトへの貢献は、将来の雇用やキャリアの機会を向上させることができます。多くの企業はオープンソースの貢献を積極的に評価しオープンソースコミュニティでの活動を見て、候補者の能力や熱意を評価します。

4. ネットワークとコラボレーション
オープンソースプロジェクトへの貢献は、多くの場合、新しい人と出会い、広範なネットワークを構築する良い機会です。他の開発者やプロジェクトのメンバーとの協力は将来のプロジェクトや仕事の機会を生み出すことがあります。

これらの報酬は、オープンソースムーブメントに参加する個人や組織にとって非常に価値があります。そして、多くの場合、これらの報酬が金銭的な報酬よりも持続的かつ満足感を与えることがあります。

# さいごに
例えば、オープンソースソフトウェアのコードやドキュメントに寄与することで開発者や協力者として成果物に名前が載ったとします。あなたが就職、転職しようとするとき、企業の採用者はどう評価するでしょうか。
貢献に対する **報酬は物理的には「名前が載った」だけ** です。しかし、これによって得られた **名誉は貢献分の直接的な金銭を受領するよりも遥かに大きな利益を永続的にもたらしてくれる** のです。

私はLinuCの認定機関LPI-Japanの公開しているLinuxサーバー構築標準教科書のバージョンアップに貢献することで開発協力者として名前を載せてもらいました。このことは新しい現場参画の選考でも威力を発揮しています。金銭的報酬は使えばなくなりますが、この名誉は一生モノです。

https://lpi.or.jp/news/press/page/20240201_01/

誰でもオープンソースムーブメントにおける貢献の競争に参加することで輝かしい名誉を得ることができるのです。
そう、約半世紀ずっーーーーーと引きこもりで地球から一歩も出ていない石ころでも。
Circular view pathのエラー解決

Controllerクラスの単体テストをJUnitで行った際に、jakarta.servlet.ServletException: Circular view path というエラーを解決した方法の備忘録です。

Circular view pathのエラーの原因はこれだけではないと思いますが、自分でエラー原因を調べていたときに、なかなか検索にヒットしなかったため、投稿することにしました。

（私は初学者なので記事に間違いがあるかもしれません。指摘やアドバイス、コメント等があれば遠慮なくお願いいたします。）



# 環境
Spring Tool Suite 4.21.1
JUnit 5

# 実行したControllerTestクラス

ControllerTestクラスのコードのうち、問題のエラーが発生した箇所を抜粋します。


```SampleControlleTest.java

	// サービスクラスから"success"の結果が返ってきたとき、complete.htmlを返すかどうかをテストする
	@Test
	void test() throws Exception {
		when(sampleService.process("id","pw")).thenReturn("success");
		mockMvc.perform(post("/complete").param("ID","id").param("PW", "pw"))
			.andExpect(view().name("complete")); // エラーが発生
	}

```

# 今回発生したエラー
上記のテストコードを実行すると、jakarta.servlet.ServletException: Circular view path というエラーが発生しました。
```エラー
jakarta.servlet.ServletException: Circular view path [complete]: would dispatch back to the current handler URL [/complete] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)
```

エラーの内容を簡単に和訳すると、

「URLである"/complete"に再びディスパッチされます。ViewResolver の設定を確認してください。 (ヒント: 未指定のビューの結果である可能性があります。)」

とのこと。

# エラーの原因・解決方法
エラーの原因は、**post先のURLとviewのhtmlファイル名が同じ名前(complete)だったこと**です。

つまり解決するには、**post先のURLとviewのhtmlファイル名を異なる名前にする**必要があります。

例えば、view先を"complete"から"complete.html"に変更すると、エラーは起きなくなります。
※このとき、Controllerクラスのソースコードも変更に対応するのを忘れずに。
```SampleControllerTest.java
@Test
	void test() throws Exception {
		when(sampleService.process("id","pw")).thenReturn("success");
        mockMvc.perform(post("/complete").param("ID","id").param("PW", "pw"))
			.andExpect(view().name("complete.html")); // エラーは発生しない
   }
```
react-google-maps/apiでonDragEndやonZoomChangedを使用するとマップの動きが変になる問題の解決法

# 問題
React上で`@react-google-maps/api`を使用して地図を表示させています。

その際マップの中心地、ズームの状態を`jotai`へ保存するために、それぞれ`onDragEnd`、`onZoomChanged`を使用していました。
そうすると、状態は確かに保存できているのですが、タッチデバイスでマップを操作した際すごく違和感のある挙動になってしまいました😢

それをうまいこと解決できたので、書いておこうと思います。

:::note warn
今回の解決方法は、保存するタイミングがコンポーネントのアンマウント時に限られています。
それ以外のタイミングで保存したい時は役に立たないかもしれません🙇🏻‍♂️
:::


# 解決方法
`react-use`の`useUnmount`を使用してマップの中心地、ズームの状態を保存します。
`react-use`は便利なhooksを提供してくれるパッケージです。

`react-use`をプロジェクトに追加します。
```zsh
npm i react-use
```

`useUnMount`をimportします。
```tsx
import useUnmount from "react-use/lib/useUnmount";
```

アンマウント時に発火する関数を作成し、`useUnMount`に組み込みます。

```tsx
const mapRef = useRef<google.maps.Map | null>(null);

const handleMapLoad = (map: google.maps.Map) => {
    mapRef.current = map;
};

const handleBeforeUnload = useCallback(() => {
    // refがnullの時は処理を飛ばす
    if (!mapRef.current) return;

    // refからzoom、centerの値を取得
    const newZoom = mapRef.current.getZoom();
    const newCenter = mapRef.current.getCenter()?.toJSON();

    // それぞれ
    if (newZoom) {
        // zoomを保存するコード
    }
    
    if (newCenter) {
        // centerの値を保存するコード
    }
}, []);

useUnmount(() => {
    handleBeforeUnload();
});

// ~~~~~~~~~~~~~~~~~~~ 省略 ~~~~~~~~~~~~~~~~~~~~~

<GoogleMap
    // ~~~~~ 省略 ~~~~~
    onLoad={handleMapLoad}
>

```

# おわりに
お読みいただきありがとうございました！

# 参考サイト等
https://github.com/streamich/react-use/blob/master/docs/useUnmount.md
Atcoder Beginners Selectionに初参加

## Atcoderに初挑戦
**2024/03/16　Atcoder Beginners Selectionに初めて参加しました。**
[ABC 345](https://atcoder.jp/contests/abc345)
今回がAtcoderのコンテスト初参加です。
今まではqiitaの記事から、Atcoderのことについて、解くべき問題や使用方法などについて調べ、少し学習をした状態で参加をしました。

## 結果
まずは結果から述べると、ボコボコにやられてきました。。。
自分の目標としては、AとB問題を正解することでしたが、A~Gの問題の中でめちゃくちゃ時間をかけてA問題をなんとか解き、B問題で詰まってしまっていたところで制限時間が終了。
### 正解することができたA問題
https://atcoder.jp/contests/abc345/tasks/abc345_a

正解したときのソースコードだけ記載しました。問題の詳細は上記のリンクを参照していただけると幸いです。
```c++
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main(){
  string s;
  cin >> s;
  int length = s.size();
  if(s.at(0) == '<' && s.at(length - 1) == '>' && count(s.begin()+1,s.end()-1,'=') == length -2)
    cout << "Yes" << "\n";
  else
    cout << "No" << "\n";
  return 0;
}
```

初めて参加だった上に、解くべき問題もまだ全てをやっていなかったこと。C++も習得している最中だったことが原因であると考えています。

## 今後の抱負
今回は初参加だったこともあり、
+ どのような問題なのか？
+ どのような感じでスタートするのか？
他にも様々な疑問がありましたが、今回参加したことで色々学ぶことができたと思います。

自分の考えとしては、大抵のことにおいて、人間が最初に取り組んだ場合、上手くやり遂げることができるのはあまりないのではないかと考えています。なので失敗を恐れずに行動しないよりかは、結果がダメでも行動することの方が得られるものが多いのではないでしょうか。

今後としては、**A,B問題を制限時間内にクリア**を目標にコンテストへ参加していきたいと考えています。


### 補足情報
コンテストの使用言語：C++（前まではPythonで取り組んでいた）
コンテストの制限時間：100分
コンテストの感想：めちゃくちゃ難しかったけど、やっぱりコーディングをするのは楽しい！！！
ORDER BYのフィールドをCASE文で指定時でエラーが。

SQLで質問があります。

sample01というテーブルに以下のデータが登録されています。

 field01 | field02 | field03 | field04 | field05 | field06 | field07 | field08 | field09 
 10001   | test    | 000     | 11      | 222     | 3       | 4444    | 55555   | 1234567 
　・
　・
　・

 変数の値でORDER BYに指定するフィールドを制御しようとしていますが下記のエラーが出力されました。
「nvarchar の値 '0000000001100222000030444455555' の変換が int 型の列でオーバーフローしました。」

 実行したSQLは以下の通りです。

 declare @hensuu tinyint
set @hensuu = 3

select sub1.* 
from (
　　select 
　　　　field01 as sortfield01
　　　　, field02 as sortfield02
　　　　, cast(right('000000' + field03, 6) + 
　　　　　right('00000' + field04, 5) + 
　　　　　right('00000' + field05, 5) +
　　　　　right('00000' + field06, 5) +
　　　　　right('00000' + field07, 5) +
　　　　　right('00000' + field08, 5) as nvarchar(31)) as sortfield03
　　　　, field09 as sortfield04 
　　from sample01
) as sub1 
order by 
　　case when @hensuu = 1 then sub1.sortfield01 
　　　　 when @hensuu = 2 then sub1.sortfield02
　　　　 when @hensuu = 3 then sub1.sortfield03
　　　　 when @hensuu = 4 then sub1.sortfield04
　　end

何故、nvarchar型なのにint型に変換しようとしているのかわかりません。
どのようにすればエラーにならず、ORDER BYが実行できますでしょうか。
どうか、ご教授いただけませんでしょうか。
よろしくお願いします。
【Ruby】スキージャンプの飛型点計算プログラム

スキージャンプの飛型点を計算するプログラムです。

5人の審判が出した飛型点の1番高い点と1番低い点を除いた3人の飛型点の合計値になります。

```ruby
num = 5
data = gets.chomp
array1 = data.split(' ')
sum = 0
array2 = []
count1 = array1.size()
for i in 0...count1 do
    data2 = array1[i].to_i
    array2.push(data2)
end
count2 = array2.size()
max_value = array2.max
min_value = array2.min
totai_value = array2.sum
sum = totai_value - max_value - min_value
sum = sum.to_f

puts sum

```

実行結果は下記の画像です
![test1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710584/b2c01cf2-62ec-b121-8e43-c7a993974d94.jpeg)
if文の基本の書き方

```js
if(条件){
    console.log(条件が真の時に出力);
}
```

最初の条件が偽だったときにelseの方を出力
```js
if(条件){
   console.log(条件が真の時に出力);
} else {
    console.log(条件が偽の時に出力);
}
```
qiitaへの向き合い方

## qiitaへの向き合い方

qiita含めてエンジニア（個人）がなぜテックブログを投稿した方が良いと思うと、以下のような項目が思いつきました。

❌自己顕示欲「自分はこんな高尚なことを学んでいる」
❌承認欲求「多くの人に認められたい、注目されたい」
❌競争心「1番優秀なブロガーであることを示したい」
🔺転職活動「私はこういうことを学んでいる人間です」
⭕️理解度向上「学んだことを忘れたくない」
⭕️解像度向上「構造的に書くことで解像度が上がる」
⭕️表現力向上「第三者に伝える表現力を養う」

日々洪水のように流れる技術情報や、その土台となる知識を自分のものにするためには、やはり自分の文章で再構築してみるのが1番効果的のように思います。自分が持っている素材の知識でもう一度再構築できれば1番効果的。高校の時に習った物理の時も運動方程式という原理を押さえておけば、さまざまな問いに答えられるようになったように、社会人になっても「運動方程式（＝土台）」を押さえておけばその後楽になります。

ただ、残念ながら機械学習界隈だと理論の種を理解すること自体が骨の折れる行為で、ブログで紹介するまでのハードルが高いのが実情です。ブログに紹介するということはある一定以上の理解度がないと「書けることがない」「誤った情報を共有する」ことになりかねないからです。

そういった背景から、「あえてブログに書くのは面倒っちい😇
」となるわけです。


## 書くハードルを下げたい！！！

ということで、冒頭の⭕️❌図が現れました。
目的を明確にすることで、余計なハードルが減ります。

❌自己顕示欲「自分はこんな高尚なことを学んでいる」
❌承認欲求「多くの人に認められたい、注目されたい」
❌競争心「1番優秀なブロガーであることを示したい」
🔺転職活動「私はこういうことを学んでいる人間です」
⭕️理解度向上「学んだことを忘れたくない」
⭕️解像度向上「構造的に書くことで解像度が上がる」
⭕️表現力向上「第三者に伝える表現力を養う」

「1000件以上のいいねを獲得したい」とか「難しいことを勉強していることを他人にアピールしたい」みたいな第三者からの見え方に依存した書き方をしていると、書くこと自体が尻込みしてしまうのです。

いっそのこと、「誰にもみられなくても良い」ような気持ちで自分のメモ帳としてあえてqiitaを使わせていただいている。読者は自分1人で大丈夫。という心持ちでかけば、一気にハードルが低くなりました。

やはり書くこと自体に価値があるからです。

ある論文を読んだ際に、
- その技術の位置付け、ジャンル
- ビジネス的なメリットデメリット
- 目的、方法、結果、今後の展望
- 自社もしくは自分の活動に活かせそうか
みたいな並列的な視点で見逃しなく考察ができるわけです。
あとは、「誰にもみられなくても良い」けれども「誰かにその技術に聞かれたときは最低限答えられるようになっているべき。流石にブログも書いたので」みたいな自分へのプレッシャーも生まれるのは良い効果。


## 書くハードルを下げる手段４つ

### 1. 100文字記事で良い

全てのブログで4000文字以上網羅している必要があるかというと、そうではないと思いました。別に「こんな論文を読みました」「こういう技術に活かせると思います」というゆるい1考察だけのtwitter的なスクラップ記事があっても良いように思います。

「読むだけ」<<「自分の言葉でブログに紹介する」

という図式が成り立つはずで、何も書かないよりは自分の言葉で書いておいた方が良いはずです。


### 2. テンプレートを使う

論文の場合、「背景/目的」「方法」「結果」「結論」「自分の所感」という項目をあらかじめNotionのテンプレートなどに登録しておき、要約ツールを使ったりして埋めておき、図表あとは自分のコメントを書くだけの状態にしておけば、ハードルはかなり下がります。

技術書籍の場合。これは最近自分で考えたのですが、オライリーなどの書籍の場合、全部読む必要はないです。自分が理解必要だと思った項目を書籍の目次から何個か引っ張ってきて、該当箇所だけ読む。自分にとって学びが大きい箇所だったならば、

「（書籍名）で得た知見」「（書籍名）で使えそうな知識」
などのタイトルで、「読む前に知りたかったこと」「書いてあったこと」「感想」の３項目ぐらいの記事を書くのが良いように思いました。


### 3. 毎週1記事を書くなど小さな目標を立てる

具体的で達成可能な目標を設定することで、モチベーションが少し上がります。qiitaではなくnoteですが、「毎週投稿」の連続達成数などが表示されるので、こういった可視化を日頃から見ておくのは手かもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/73defad0-bf88-979f-ddd4-9823e2dac7e2.png)


### 4. リライトに時間をかけない

今までの経験上、誤字脱字や構成の練り直しはこだわり出すとキリがなく時間を消費するのであんまり好きではない作業でした。ここにこだわるというのは、かけた時間の割に完成度がそこまで高くならなかった経験があるので、一回書きたいがまま書き切り、細かいことは気にしないことも大切かなと思いました。それよりも継続的に続けることが1番大切かなと。


## 番外編

エンジニア個人としてブログを書く場合は縛りも何もなく自由に書くのが良いと思いますが、企業として書く場合や書籍を出すようなケースでは、もちろん体系的かつ構成も段違いに練った上でブログを書く必要があると思います。将来的にそういった活動も視野に入れる場合は、そういった方の記事を日頃からたくさん読んで勉強する必要がありそうですね。

（企業ブログ編）
⭕️事業紹介「私たちはこんな技術を持っています」
⭕️採用促進「私たちと一緒に働きませんか？」

（エンジニア兼作家編）
⭕️販売促進「こういう感じの本を書いているので良かったら買ってください」

以上！
初心者でも簡単！AndroidのTermuxでSSH接続する方法

こんにちは！今回は、AndroidのTermuxアプリを使ってSSH接続する方法を初心者向けに詳しく解説していきます。Termuxを使えば、Androidスマホやタブレットからリモートのサーバーに接続できるようになります。

---

こちらの記事もおすすめ

https://hamaruki.com/how-to-use-apollonstreamapi-to-stream-android-screen-capture-in-real-time/

https://hamaruki.com/create-a-gemini-app-with-android-studio-and-check-its-operation-on-the-actual-device/

## Androidにアプリのインストール

### Termuxアプリのインストール

まずは、Android端末にTermuxアプリをインストールしましょう。GooglePlayストアから入手できるバージョンは古いので、以下のリンクから最新版をダウンロードしてください。

https://github.com/termux/termux-app/releases/tag/v0.118.0


### キーボードアプリのインストール

次に、Termuxでコマンドをスムーズに入力できるようにするためのキーボードアプリをインストールします。ここでは「CodeBoard」という名前のアプリを使用します。

### Termuxの初期セットアップ

Androidでインストールしたばかりの新しいTermuxを初めて起動したら、以下のコマンドを順番に入力して初期セットアップを行います。

```bash

$ termux-setup-storage
$ pkg update  
$ pkg upgrade
```

セットアップ中はCodeBoardなどのキーボードアプリを使ってコマンドを入力します。もしデフォルトのAndroidキーボードが表示された場合は、スペースキーを長押ししてキーボードを切り替えてください。

## TermuxにOpenSSHサーバーをインストール

### OpenSSHサーバーのインストールとIP確認

次に、TermuxにOpenSSHサーバーをインストールして、AndroidのIPアドレスを確認します。以下のコマンドを入力してください。

```bash

$ pkg install openssh
$ sshd
$ pkg install iproute2
$ ip -4 a
```

`ip -4 a`と打つと、`inet 192.168.1.x/24` のような表示が出てきます。このうち、`192.168.1.x`の部分がAndroidのIPアドレスです。

### ユーザー名とパスワードの設定  

続いて、Termuxのユーザー名とパスワードを設定します。まず、以下のコマンドでユーザー名を確認します。

```bash

$ id
# uid=10XXX(u0_aXXX) gid=10XXX(u0_aXXX) groups=10XXX(u0_aXXX),3003(inet),9997(everybody),20XXX(u0_aXXX_cache),50XXX(all_aXXX)
```

`uid=xxxxx(u0_axxxxx)` のような表示が出てきたら、`u0_axxxxx`の部分がユーザー名です。覚えておきましょう。

次に、以下のコマンドでパスワードを設定します。適当な文字列を入力してください。 

```bash

$ passwd  
```

## PCからTermuxにSSHログイン

### SSHでログイン

いよいよPCからAndroidのTermuxにSSHでログインします。ターミナルを開いて、以下のようにコマンドを入力してください。

```bash

$ ssh -p 8022 u0_axxxxx@192.168.1.1
```

`u0_axxxxx`の部分は先ほど確認したユーザー名、`192.168.1.1`の部分はAndroidのIPアドレスに置き換えてください。パスワードを聞かれたら、Termuxで設定したパスワードを入力します。

### 公開鍵認証でログイン

セキュリティを高めるため、パスワードの代わりに公開鍵認証でログインすることもできます。以下の手順で設定してください。

```bash

# PCで
$ cd ~/.ssh  
$ ssh-keygen
$ scp -P 8022 id_ed25519.pub u0_axxxxx@192.168.1.1:~/.ssh/

# Termuxで  
$ cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys  
```

また、PCの`~/.ssh/config`ファイルに以下のような設定を追加しておくと、次回以降のログインがさらに簡単になります。

```bash

Host termux  
  User u0_axxxxx
  HostName 192.168.1.1
  Port 8022  
  IdentityFile ~/.ssh/id_ed25519
```

## まとめ

以上で、AndroidのTermuxアプリを使ってSSH接続する方法の解説は終わりです。初心者の方でも、この記事を参考にしながら設定を進めていけば、きっとうまくいくはずです。

Termuxは奥が深いアプリなので、SSHに慣れてきたらぜひ他の機能も探究してみてください。スマホやタブレットから、まるでPCを操作しているかのようにサーバー管理ができるようになりますよ。
PDF結合プログラムのマニュアル(初投稿)

# この記事について
この記事は自分のgithubに上げたプログラムのReadMeをそのまま上げたものです．初投稿なので試験的に書いています．Pythonを学び初めのときに作ったものなのでコードはめちゃくちゃ汚いです．(オブジェクト指向すら使っていないw)
github:https://github.com/jean0enuma/pdfGUI
# pdfGUI
pdfの結合，分割ができるpythonGUI(Tkinter)
# 動作条件
Windows10
Mac OS

Ubuntu(だぶん) ※動作未確認
# 実行方法
python3で動作しています．必要なライブラリはPyPDF2だけです．
```
pip install PyPDF2
```
もしくは
```
pip install -r requirements.txt
```
実行方法は該当ディレクトリに移動し
```
python pdf_gui.py
```
これでGUIが起動する．
<div align="center">
<img width="1412" alt="gui" src="https://user-images.githubusercontent.com/118164921/216750822-6e194a07-8b29-44f6-be16-ea942ea0c823.png" title="Windows">
Windowsでの画面
</div>
<br>
<div align="center">
<img width="1412" alt="gui" src="https://user-images.githubusercontent.com/118164921/216751084-27285c0c-5bb2-47ce-813f-7a1ec31b72f9.png" title="Mac">
Macでの画面
</div>
<br>

また実行ファイルを生成する場合は，

```
python generate_exe.py
```

と入力するとdistというディレクトリに実行ファイルが生成される．
# できること
* pdfの結合 
* pdfの分割 

どちらの機能もページ範囲の指定により，その範囲のみの結合，分割が可能.


## pdfの結合
* 右のボタンで「追加」と押しTreeviewにpdfファイルを追加
* ファイルを選択し結合をクリック
* 好きな場所に保存
  
   ページ範囲を指定していると，範囲ページのみが結合対象となる．
## pdf分割
* ページ範囲を指定していない場合  
  1. ファイルを追加
  2. ファイルを選択し下のボタンのpdf分割をクリック
  3. 好きな場所に保存
   ファイルは1ページごとに分割されます．
* ページ範囲を指定している場合  
  1.  ページ範囲のボタンをクリックし最小，最大ページを設定
  2.  Treeviewに表示されていることを確認した後，分割したいpdfをクリック
  3.  好きな場所に保存
   
   ページ範囲が指定されているファイルは，範囲内と範囲外の2ファイルが分割されます．

また，Treeviewにある選択ファイルをダブルクリックすると，そのPDFファイルを開くことができます．
# 注意点
* 重いファイルを開くとTreeviewに表示されるまで時間がかかるときがある．
* 分割する際，ページ範囲をしていしていないとすべてのページが分割されるので，ページ数が多いとたくさんのファイルが生成されます．例えば，100ページあると100枚のpdfが作成されます．
* 動作としてMacとWindows10は確認しているが，Ubuntu等Linuxは動作確認をしていない．
* だいぶ前にpython初心者が書いたコードなので，とっても汚い．自分でも何書いているのかわからない(笑)．でもとりあえず動く．
* 変なテンションで書いたため， エラーメッセージが変．あまり気にしないでください．(たぶん修正します)
* デザインがダサい．Tkinterなので仕方ない部分はあるのか?
* tkinterのバージョンによってはエラーになるかも? 色の設定でエラーになりましたが修正済みです．
# 参考
CubePDF Pageはレイアウトなどを参考にしました．リンクを載せておきます．

https://www.cube-soft.jp/cubepdfpage/