OmniAICreator/Qiita-1.07M huggingface dataset:
PBSジョブスケジューラのtips

自分が使っている気象モデルSCALEを実行するものを例にします。
WRFやWRFDA、CReSS、fortranコンパイルなどほぼ同じです。
随時更新はしますが、きっとモデルを扱っている人ならきっと大丈夫です。

# 1. 基本操作
ジョブスケジューラーの基本操作は2つです。

```:terminal
$ qsub hogehoge.sh
$ qstat
```
1行目のqsubがジョブを投入するコマンドで、hogehoge.shの設定を読み込む。
2行目のqstatがジョブの状況を表示するコマンド。

# ２.qsubとhogehoge.shの書き方
ジョブを投入する際に、その設定を書き込むシェルの書き方の見本と、オプションを整理します。

```:hogehoge.sh
#!/bin/sh
#PBS -l nodes=1:ppn=16
#PBS -j oe

cd $PBS_O_WORKDIR
NPROCS=`wc -l <$PBS_NODEFILE`
mpirun -machinefile $PBS_NODEFILE -np $NPROCS ./scale-rm run.d01.conf

```
１行目：おまじない
２行目：ノードとコア数を指定している（例の場合１ノード１６コア）
３行目：ジョブの標準出力ファイルと標準エラー出力ファイルを結合する
４行目：ブランク
５行目：qsubを実行しているディレクトリ移動する。
６行目：PBS_NODEFILEの数をカウントしてNPROCSに格納する（例の場合１６）
７行目：実行ファイルの実行

というわけで、何も考えずに１ノード１６コアでジョブを実行したい場合は、コピペしてもらい、７行目だけ自分の実行したいものに書き換えれば良い（はず）
mpirun -np 16 wrf.exeなど。

以下にhogehoge.sh内で使えるオプションをまとめます。

| オプション|　　　　　　　　説明|    　デフォルト    |
|:-----------------:|:------------------|:------------------|
| #PBS -q queue_name|投入するqueueを指定する。| default queueで実行される。|
| #PBS -ｊ oe |投入するqueueを指定する。| default queueで実行される。|
| #PBS -l nodes=X:ppn=Y|ジョブを実行するノード数Xとコア数Yを指定する。|queueのデフォルト値|
| PBS -l ncpus=64　|nodes * ppn。これを指定しないと全コア専有してしまうらしい…のだけど今のところ大丈夫そう？||
| #PBS -l mem=8G   | 確保するメモリ量を指定する。 |             |

# 3.qstatの使い方
※作成中

# 4.参考HP
Altair PBS Professional 2021.1 User's Guide（長い
https://www.altairjp.co.jp/pdfs/pbsworks/PBSUserGuide2021.1.pdf

ジョブ管理システム PBSを用いた計算機の利用
https://biaswiki.nibb.ac.jp/menu/index.php/%E3%82%B8%E3%83%A7%E3%83%96%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0_PBS%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E8%A8%88%E7%AE%97%E6%A9%9F%E3%81%AE%E5%88%A9%E7%94%A8
dumpファイルの取得

# 背景
- RDSバージョンアップで慎重に行う必要のある作業が発生し、バックアップも慎重に行う必要があるとのことでdumpファイルの取得が必要になった。
- sqlをインストール済みの仮想環境にてdumpファイルの取得を行い、復元を試みる

# DBの現状
- テスト環境ということで適当にデータを入れたDBを作成した
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| KingList       |
| NameList       |
+----------------+
mysql> SELECT * from NameList;
+------+------+
| ID   | Name |
+------+------+
|    1 | 2    |
|    1 | 123  |
|    1 | 555  |
|    8 | 550  |
+------+------+
mysql> SELECT * from KingList;
+------+------+
| ID   | Name |
+------+------+
|  100 | 5212 |
+------+------+
# dumpの取得
$ mysqldump -h localhost.localdomain -u root -t -p test > dump.sql
※testはDB名、localhost.localdomainはRDSのホスト名、ルートはユーザー名
- 取得できたか確認
$ ll
- 中身に文字化けがないか確認
$ less dump.sql

# dumpを試す
- まず、テーブルの削除を行う
テーブル「NameList」「KingList」を削除し、同名で作りなおし中身を空にする
- 空のテーブルが用意されている確認
mysql> SELECT * from NameList;
Empty set (0.01 sec)

mysql> SELECT * from KingList;
Empty set (0.01 sec)

- ダンプファイルを実行する
$ mysql -u root -p test < dump.sql

- 復元できたか確認する
mysql> SELECT * from NameList;
+------+------+
| ID   | Name |
+------+------+
|    1 | 2    |
|    1 | 123  |
|    1 | 555  |
|    8 | 550  |
+------+------+
4 rows in set (0.00 sec)

mysql> SELECT * from KingList;
+------+------+
| ID   | Name |
+------+------+
|  100 | 5212 |
+------+------+
1 row in set (0.01 sec)

- テーブルのデータが復元できたことが確認できた
Raspberry Pi Pico W を Wi-Fi に接続してみる。

今回は Raspberry Pi Pico W を Wi-Fi に接続してみました。

Raspberry Pi Pico のセットアップなどがまだの場合は下記を参照してください。

https://qiita.com/IoriGunji/items/ebe6cefd3562639f7ca2

# 環境

今回の環境は下記のとおりです。

## 開発端末

- **OS**： Windows 11 Pro
- **CPU**： Intel Core i7-9750H
- **メモリ**： 64GB
- **GPU**： NVIDIA GeForce RTX 2070 Max-Q

## Python 環境

- **Python**： 3.11.0

## Raspberry Pi

- **Raspberry Pi**： Raspberry Pi Pico W
- **拡張ボード**： Pimoroni Pico Explorer Base（※任意）（[スイッチサイエンス](https://www.switch-science.com/products/7373)）

# Python コードの作成

Raspberry Pi Pico W を Wi-Fi ネットワークに接続するには、 Python でコードを書く必要があります。

## 動的 IP アドレスの場合

IP アドレスを Wi-Fi ルーター側で動的に割り当てる場合は、下記のコードで OK です。
`SSID` と `PW` に Wi-Fi ルーターのアクセスポイント名とそのパスワードを入力してください。

```wlan.py
import network
import time

SSID = ''
PW = ''

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PW)

while wlan.isconnected() == False:
    print('Connecting to Wi-Fi router')
    time.sleep(1)

wlan_status = wlan.ifconfig()
print('Connected!')
print(f'IP Address: {wlan_status[0]}')
print(f'Netmask: {wlan_status[1]}')
print(f'Default Gateway: {wlan_status[2]}')
print(f'Name Server: {wlan_status[3]}')
```

## 静的 IP アドレスの場合

IP アドレスを固定したい場合は、次のようにします。
`IP_ADDRESS` に固定したい IP アドレスを指定してください。

```wlan_static.py
import network
import time

SSID = ''
PW = ''
IP_ADDRESS = '192.168.0.81'

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PW)

while wlan.isconnected() == False:
    print('Connecting to Wi-Fi router')
    time.sleep(1)

wlan_status = wlan.ifconfig()
wlan.ifconfig((IP_ADDRESS, wlan_status[1], wlan_status[2], wlan_status[3]))

wlan_status = wlan.ifconfig()
print('Connected!')
print(f'IP Address: {wlan_status[0]}')
print(f'Netmask: {wlan_status[1]}')
print(f'Default Gateway: {wlan_status[2]}')
print(f'Name Server: {wlan_status[3]}')
```



# 参考文献

下記の書籍とサイトを参考にさせて頂きました。

- 福田 和宏 . 最新Pico W対応! ラズパイPico完全ガイド . 株式会社日経BP , 2023

https://micropython-docs-ja.readthedocs.io/ja/latest/library/network.html

<!-- EOF -->
Nuxt3 (Vue3) – template の class 指定を v-if を使わずに条件分岐させる (右辺が真なら左辺を適用)

# コード例

以下の例では

`<div class="aaa bbb"></div>` が生成される

```vue
<div
  :class="{
    aaa: true,
    bbb: true,
    ccc: false,
  }"
>
</div>
```



# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
FirebaseCLIの導入(mac os 13.5 ventura)

## FirebaseCLI導入
自動インストールスクリプトが用意されているので、curlコマンドを叩くだけで完了
https://firebase.google.com/docs/cli?authuser=0&hl=ja#mac-linux-auto-script
```
% curl -sL https://firebase.tools | bash
Password:
-- Checking for existing firebase-tools on PATH...
-- Checking your machine type...
-- Downloading binary from https://firebase.tools/bin/macos/latest
######################################################################## 100.0%#=#=#
-- Setting permissions on binary...
-- Checking your PATH variable...
-- firebase-tools@12.5.3 is now installed
-- All Done!

% firebase --version
12.5.3
```

### FirebaseCLI動作テスト

macのコンソールから「firebase login」を実行する
```
% firebase login
i  Firebase optionally collects CLI and Emulator Suite usage and error reporting information to help improve our products. Data is collected in accordance with Google's privacy policy (https://policies.google.com/privacy) and is not used to identify you.

? Allow Firebase to collect CLI and Emulator Suite usage and error reporting information? Yes
i  To change your data collection preference at any time, run `firebase logout` and log in again.

Visit this URL on this device to log in:
https://accounts.google.com/o/oauth2/auth?client_id=131312469-fgrhgmd47bqnekij5i8b5pr03ho849e6.apps.googleusercontent.com&scope=email%20openid%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloudplatformprojects.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Ffirebase%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform&response_type=code&state=556775622&redirect_uri=http%3A%2F%2Flocalhost%3A9005

Waiting for authentication...
^@
✔  Success! Logged in as xxxxxxx@gmail.com
```

利用するgoogleアカウントを選択する画面が、ブラウザで表示される
![貼り付けた画像_2023_09_11_13_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/b0dbc33c-00ff-fc73-151e-98b89357f1f6.png)

許可を選択
![貼り付けた画像_2023_09_11_13_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/7b62278f-ac8d-dd54-6b69-bd60aea63eda.png)

問題なければログイン完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/490d43f6-9d1c-2884-fc69-5c2927f64ff5.png)

プロジェクト一覧を表示してみる
まだプロジェクトを追加していない場合は、何も出ないはず
```
% firebase projects:list
✔ Preparing the list of your Firebase projects
┌──────────────────────┬──────────────┬────────────────┬──────────────────────┐
│ Project Display Name │ Project ID   │ Project Number │ Resource Location ID │
├──────────────────────┼──────────────┼────────────────┼──────────────────────┤
│ skeet                │ skeet-xxxxxx │ 4024xxxxxxxx   │ [Not specified]      │
└──────────────────────┴──────────────┴────────────────┴──────────────────────┘

1 project(s) total.
```
【高先さんの電子工作】第10回：Raspberry Pi Pico Wを無線LANに接続する

https://youtu.be/bBjDDL8ePEo

Wi-Fiに接続してプライベートIPを表示させています。

```python:main.py
import network
import ujson
from utime import sleep

config = {}
with open('config.json', 'r') as f:
    config = ujson.load(f)

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(config['ssid'], config['password'])

while True:
    print('Waiting for connection...')
    if wlan.isconnected():
        break
    sleep(1)
    
ip = wlan.ifconfig()[0]
print(f'Connected: {ip}')

```

```json:config.json
{"ssid": "Your SSID", "password": "password"}
```

Open-MeteoのWEB APIを呼び出しています。

```python:REPL
import urequests
url = 'https://api.open-meteo.com/v1/forecast?latitude=52.52&longitude=13.41&hourly=temperature_2m&forecast_days=1'
response = urequests.get(url)
response.status_code
response.json()
```
仮想環境にmysqlをインストール

# 背景
仮想環境に慣れていくために、mysqlのインストールと、少し動かしてみようと思う

# 仮想環境の構築
- 仮想環境は以前の記事で作成したものを使用する
https://qiita.com/fsd-ishihara/items/e7d7d7bd78391aa567df

# mysqlのインストール
- mariadb-libsがあるかどうかの確認
yum list | grep mariadb-libs*
- あったら削除を実行する
yum remove mariadb-libs
- リポジトリのインストール
rpm -ivh http://dev.mysql.com/get/mysql80-community-release-el7-9.noarch.rpm
※このコマンドは環境によって変わる
- mysqlのインストール
yum install mysql-community-server
- インストールできたか確認
mysqld --version

# 起動させてみる
- 起動コマンド
systemctl start mysqld
- 起動の確認コマンド、runningという文字が入っていれば、起動済み
systemctl status mysqld
- 停止コマンド、使い終わったら停止させること
systemctl stop mysqld

# ログインしてみる
- mysqlのパスワードを確認する⇒root@localhost:[パスワード]という風に表示される
cat /var/log/mysqld.log | grep root
- 上記のパスワードを使いログインする
mysql -u root -p
- こうするとパスワードが要求されるため、先ほど確認したパスワードを入力

# mysqlを動かすためにパスワードを変更
- パスワードを変更しないと、sqlを流す際にはじかれる
- パスワードを変更手順
```mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root: 初期パスワードを入力する

The existing password for the user account root has expired. Please set a new password.

New password: 新しいパスワードを入力する

Re-enter new password: 再度同じ新しいパスワードを入力する

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No: y

There are three levels of password validation policy:

LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 0
Using existing password for root.

Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y

New password: ポリシーに沿った新しいパスワードを入力

Re-enter new password: 再度新しいパスワードを入力する

Estimated strength of the password: 50
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
Success.

- Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!
大学入試数学解答の書き方の5パターンです。2023年夏の成果品

・**2023年夏の成果品**です。まとめてみました。

# 数学解答の書き方の5パターン(Ver0.1)
Sは、目的(主語?)の意味です。

①同値変形のパターン＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
　 S ⇐⇒ A 問題文を記入
　(S ⇐⇒ B)記入省略可  
　(A ⇐⇒ C)記入省略可
　 B ⇐⇒ C 解

②Sを解答の最終行に記入するパターン＝＝＝＝＝＝＝＝＝
　　　S ⇐⇒ A 問題文を非記入。公式または定義文
（解答用紙に,次の行から記入）ーーーーーーーー
　A ⇐⇒ B 
　B ⇐⇒ S 解はB

③Sを解答の1行目から記入するパターン＝＝＝＝＝＝＝＝
　　　S 
　　　A ⇐⇒ B 公式または定義文
（解答用紙に,次の行から記入）ーーーーーーーーー
　S ⇐⇒ A
　S ⇐⇒ B 解はB

④数学的帰納法＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
　勉強中

⑤背理法＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
　勉強中

# 「参考文献」を未読です。
・私は、**シロウトで申し訳ありません。**
　sympyを使ってみてです。
    ・**パターン②「Sを解答の最終行に記入するパターン」が、気になりました。**
　余計な事を書かずに、洗練された解答です。
　私みたいに、先に解答をみてから、問題文を読み始める人には、キツイと思いました。
　そうでしたか？状態です。

# 「参考文献」

https://www.toshin.com/books/archives/2022/07/post_236.html

https://toshin.wicurio.com/index.php?%E6%95%B0%E5%AD%A6%E3%81%AE%E7%9C%9F%E9%AB%84%EF%BC%8D%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86%E8%BF%BD%E7%A9%B6%E7%B7%A8%EF%BC%8D%E6%96%87%E7%90%86%E5%85%B1%E9%80%9A%20PART1%EF%BC%8FPART2

https://www.obunsha.co.jp/product/series/c078
もはや誰もわからないVueのRefの謎

## 経緯
とある出来事がきっかけでVue3を改めて学び直したんだ。Amazonにあった「Vue 3　フロントエンド開発の教科書」を購入して勉強していた。誤解が無いように伝えておくが、この本は比較的新しい内容で、使われている技術もバージョンが新しいため、ある程度Web技術を学んでいれば楽しく読むことができる。Vue3の学び直しには打ってつけだった。知っていることも多かったので基本的にスラスラと読み進めていたが、多くの人がとある内容で壁にぶち当たることになる。

## 立ちはだかる壁
さてその壁は以下の記述である。内容をそのままコピーするとまずいかもしれないので、同じことを起こせるプログラムを代わりに用意した。
環境の要因をなくすために、公式サイトでRefの説明で使われていた[Playground](https://play.vuejs.org/#eNo9jUEKgzAQRa8yZKMiaNcllvYe2dgwQqiZhDhxE3L3jrW4/DPvv1/UK8Zhz6juSm82uciwIef4MOR8DImhQMIFKiwpeGgEbQwZsoE2BhsyMUwH0d66475ksuwCgSOb0CNx20ExBCc77POase8NVUN6PBdlSwKjj+vMKAlAvzOzWJ52dfYzGXXpjPoBAKX856uopDGeFfnq8XKp+gWq4FAi)を使っていこう。
App.vueを以下の記述にする。
```vuejs
<script setup lang="ts">
import { ref } from 'vue'


let value = "1";

const valueRef = ref(1);

function changeValue() {

	value = "2";

	valueRef.value = 2;
}

setInterval(changeValue, 1000);
</script>

<template>
	<p>value: {{value}}</p>
	<p>valueRef: {{valueRef}}</p>
</template>
```
さてこれを実行するとどうなるだろうか。以下がプログラムの変更が反映されてから1秒後の映像だ。
![スクリーンショット 2023-09-12 13.20.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509941/d57654da-9210-cb3e-6bd6-bc8ebd824bf0.png)

…


おいおいおいおいおいおいおいおいおいおいおいおいおい違うだろぉ？？
valueは変更されない約束だろぉ？？？？？


そもそもなぜRefを使うかというと、変数に何らかの変更があった際に、それに合わせてDOMを更新させるために使うのだ。だからRefを使っていない変数がscript内でどれだけ変更されようがUIで変化が起こるということが起こってはいけない（はず）。

実際以下のように、Refを使わない記述だけを残すと、表示が変わることはない。

```vue.js
<script setup lang="ts">
import { ref } from 'vue'


let value = "1";


function changeValue() {

	value = "2";

}

setInterval(changeValue, 1000);
</script>

<template>
	<p>value: {{value}}</p>
</template>

```
![スクリーンショット 2023-09-12 14.25.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509941/fbe9af45-2ced-52da-d50b-057dece8760e.png)


## 結論
結論としては、以下のリンク先の質問で解決されていた。
・https://teratail.com/questions/mcgaqdq8jvcw5c

要するにver. 3.2.45以降では、上記の挙動で正しいようだ。Refの値が更新されると、同じテンプレートに含まれている変数が全て再レンダリングされることで、Refを用いてない変数の表示まで変わってしまうということだ。

初学者にこの壁は手厳しい…
Rancher Desktopにdaemon.jsonの設定を効かせる

Windows/wsl環境のRancher Desktopでdaemon.jsonの設定を効かせる方法をメモ的に残しておきます。
⇒max-concurrent-downloadsの設定を入れようとして試行錯誤した結果です。

# 結論
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2026870/96188e4e-8094-5c5a-b679-12299d2f8b4e.png)
`\\wsl.localhost\rancher-desktop\etc\docker\daemon.json`
に置いてRancher Desktopを再起動する。

# おまけ
本題ではないですが設定ファイルの中身も載せときます。
```daemon.json
{
  "max-concurrent-downloads": 1
}
```

# 参考

https://qiita.com/corydoraspanda/items/e1af70df13673f0184ec

https://medium.com/@sujaypillai/docker-daemon-configuration-file-f577000da655
[Laravel10]Blade Componentで平文を渡したい

# 環境
Laravel 10 (8~)

# TL;DR
`$slot->toHtml()`
の利用で受け渡した平文が取り出せるので

```oya.blade.php
<x-item>
    <x-slot name="label">いぬ</x-slot>
    <x-slot name="link">dog</x-slot>
</x-item>
```

```component/item.blade.php
<a href="{{ route($link->toHtml()) }}">$label</a>
```
という形の実装ができました

# が
class以外の属性の追加方法としてmergeメソッドを使った方法を公式が説明しており、href属性も渡せるので上方法は特に必要ないみたいです

[Blade Templates - Laravel 10.x - The PHP Framework For Web Artisans](https://laravel.com/docs/10.x/blade#non-class-attribute-merging)

和訳様
[Bladeテンプレート 10.x Laravel　#非クラス属性のマージ](https://readouble.com/laravel/10.x/ja/blade.html#non-class-attribute-merging)

上コンポーネントを置き換えるとこうなりますね
```
<a {{ $attributes->merge(['href' => $link]) }}>$label</a>
```

# 以下全て蛇足

死んでもmergeしたくない！って人には有用かもしれませんがmergeメソッド使ったほうがいいと思います
コードはすっきりするかもですが

もし属性以外で平文を使いたい場面があったらご活用ください

# 目的
共通のコンポーネントにそれぞれのページへの簡潔なルート名を埋め込みたいんです

```oya.blade.php
<x-item>
    <x-slot name="label">いぬ</x-slot>
    <x-slot name="link">dog</x-slot>
</x-item>

<x-item>
    <x-slot name="label">ねこ</x-slot>
    <x-slot name="link">cat</x-slot>
</x-item>
```

こんな感じで

```component/item.blade.php
<a href="{{ route($link) }}">{{ $label }}</a>
```

## 怒られる
![スクリーンショット 2023-09-12 13.49.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213915/d4727fa7-48d2-5648-61f2-43171fb3b92b.png)

**Illegal offset type in isset or empty**
(復唱)
route()へ渡すところで怒られが発生しているようです

## ddしてみる
```
{{ dd($link) }}
```
なんじゃこりゃ
![スクリーンショット 2023-09-12 13.52.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213915/cae1de3b-05e8-dec5-3b24-ebcc6d152a4d.png)

ただの文字列ではなく`ComponentSlot`で渡っていたようです

## その文字列が欲しい
```
$slot->contents
```
としたところ
![スクリーンショット 2023-09-12 13.59.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213915/41cec44b-a6ba-1f24-272c-176a79c69611.png)
**「エッチ！」**
とのこと、すみません


### ComponentSlotやらを調べてみる

公式にありました

[Illuminate\View\ComponentSlot | Laravel API](https://laravel.com/api/10.x/Illuminate/View/ComponentSlot.html)

`toHtml()`が使えそうですね
ちなみにマジックメソッドの`__toString()`は内部で`toHtml()`を呼んでるだけのようでした

# ということで
```
<a href="{{ route($link->toHtml()) }}">{{ $label }}</a>
```
でルート名の受け渡しで実装できました🐕🐈

# 余談
chatGPT先生に聞いたところ
```
<x-MyComponent>
    <a href="{{ route('link1') }}">リンク1</a>
</x-MyComponent>
```
**「aタグごと行け」**
とのこと
ChatGPT先生に他言語を習ったらすごく楽しく捗った話

# プログラミング言語習得が大変になってきた

若い頃からいろんなプログラミング言語を渡り歩いてきましたが、最近、新しい言語を学ぶのがきついです。「やりたいこと」をしっくりくる形で実現するまで、作法、エコシステム、トレンドなどなど言語の先に覚えることが多すぎません？

「となりの山のあの高さまでまた登る」が億劫になってしまいました。

でもこれは40代半ばという歳のせいではなく(私の頭脳自体の制約はありますが)、目指す高さがだんだん上がってきているのと、言語という山自体が大きくなっているからだと思います。

昔は言語の得意分野が決まっていたし、選択肢も限られていたように思います。今はできることが多いし選択肢も多い。

それでGo言語とPythonについては憧れながらも仕事には使えない、駆け出しエンジニア状態が長いこと続いてきました。

# ChatGPTを専属家庭教師にすると楽しい

しかし最近、Go言語については素晴らしい先生のおかげでいきなり楽しめる言語になりました！ ChatGPT先生のおかげです。

「こういうことやりたいんだけどサンプルください」「X言語で言うYをgolangで実現するには？」と次々聞くだけで、私だけの教材をどんどん作ってくれるのです。

それを写経したりちょっとアレンジしたり、サンプル同士を組み合わせ実際に動かします。やりたいことがいきなりできて手応えも得られるからテンションが下がりません。

そしておちゃめなAIはときどき間違えて、サンプルがそのまま動きません。正しい答えを探すことになるのですが、それもまた練習問題のようで楽しい。

その上で各種書籍や記事を読むと、めちゃくちゃすらすら頭に入ってくる！

個人的には革命的で、さんざんワナビーしてきたGo言語が3日ほどで「あ、仕事に活かせそうだわ」と感じたほどです。

# 登るのがつらいなら下山だけでもいいじゃない

この体験は言語学習が山登りではなく、「ヘリコプターで山頂に行って下山しながら景観を楽しむ」というレジャーになった感じでした。

というわけで、ある程度経験を積んだプログラマーが他の言語に挑戦するときは、月$20払って(GPT4がよいので)ChatGPT先生を頼ると、楽しいし捗るよ！という体験談でした。

※ もちろんこれが唯一で最善と言っているわけではありません。こういうコピペ学習よくないといった意見もあると思います。
TCP（トランスポート層）アプリケーションプロトコル（アプリケーション層）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/a73e565c-cd76-64e6-f5bf-ac2d540dd18e.png)
１：DNS（Domain Name System）は、
・ドメイン名をIPアドレスに変換する（正引きという）
・IPアドレスをドメイン名に変換する（逆引きと言う）
・ドメインを管理するネームサーバ（DNSサーバ）のIPアドレスを返答する・
・ドメインを管理するメールサーバのIPアドレスを返答する。
といった役割を担っています。インターネットに接続されているホストすべての情報を、１か所に集中して登録しておくことは事実上不可能です。そこで、DNSでは、ルートドメインを頂点とする階層構造を作り、情報を分散させて登録しています。

２：電子メール
　電子メールソフトは、POP3やIMAP4というプロトコルを使って、受信ようメールサーバは、各ユーザごとのメールボックスを持っています。POP3は、メールボックスから電子メールをPCにダウンロードするためのプロトコルです。受信したメールはPC内に保管されmす。一方で、IMAP４は、メールをメールサーバ内に保管しておきます。電子メールを送信する場合は、SMTPというプロトコルを使って送信用メールサーバにメールを送信します。
　内部の送信用メールサーバと外部メールサーバ間、外部メールサーバと他組織のメールサーバ間といったようなメールサーバ間のメール配送は常にSMTPを使います。

３：MIME
　本来、電子メールではテキストデータ（文字）しか送ることができません。プログラム、画像、音声、映像などのデータは、内容を文字だけで表すことはできませんからでテキストデータではありません。テキストデータではないものをバイナリデータと言います。

　バイナリデータを電子メールに添付して送ることができるようにするための拡張規格をMIMEと言います。BASE６４という方法によって、バイナリデータを見かけ上テキストデータに変換してから送ります。私たちが、添付ファイルでさまざまなファイルを送ることができるのは、MIMEを利用しているからです。
GASトリガーのオーナーアカウントの特定方法

# 背景
システムの改修・運用方法の変更により、過去に設定したトリガーが不要になりました。
削除したいのですが、トリガーを設定したアカウントでないと削除ができないのです...!
実装当時のドキュメントも残っておらず、トリガーを設定したアカウントが不明なため長らく削除できない状態でした。

![スクリーンショット 2023-09-12 13.05.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364469/303eaad6-3b0d-f536-9706-5ec296af38eb.png)

応急的な対応として、トリガーで設定されている関数をtrueを返すだけのものにして騙し騙し運用していましたが...


# トリガーのオーナーアカウントの特定方法

この問題を解決する一手を見つけたのです！

それがこちら

```
Session.getEffectiveUser().getEmail();
```

Googleの公式リファレンスによると...

> スクリプトの実行権限があるユーザーに関する情報を取得します。スクリプトがウェブアプリとして実行されている（デベロッパー）場合は、これによりデベロッパーのユーザー アカウントが返されます。スクリプトがインストール可能なトリガーで実行されている場合は、トリガーを作成したユーザーのアカウントが返されます。

https://developers.google.com/apps-script/reference/base/session?hl=ja#geteffectiveuser


## インストール可能なトリガーとは

起動時、編集時、変更時、フォーム送信時、時間主導型とかの手作業もしくはプログラムによってトリガー関数として設定しなければならないトリガーのことをいうみたいですね。

詳しくはここを読んでね

https://developers.google.com/apps-script/guides/triggers/installable?hl=ja


# 解決
上記の関数をLogger.logでログ出力しアカウントが判明しました！

なせ今まで見つけられなかったのか...

ともかく、特定したアカウントでログインし、無事トリガーを削除できました👏👏👏
Navigating the Data Universe: Unveiling SAP Datasphere

**SAP Datasphere: Revolutionizing Data Management**

sap datasphere is a comprehensive data management platform designed to help businesses harness the full potential of their data. It goes beyond conventional data management systems by providing a unified and holistic approach to data handling, analysis, and visualization. With Datasphere, organizations gain a competitive edge by unlocking hidden value from their data.
![SAP Datasphere.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123286/16e180ed-7a54-c382-3bae-5a9b5fc973b1.png)


**Key Features**

**Data Integration:** sap datasphere seamlessly integrates data from various sources, including internal databases, external data feeds, and cloud platforms. This integration ensures that businesses have a unified and accurate view of their data.
**Advanced Analytics:** Datasphere incorporates advanced analytics tools, enabling organizations to perform predictive and prescriptive analytics effortlessly. By leveraging machine learning and AI capabilities, businesses can make data-driven predictions and recommendations that drive success.

**The Competitive Advantage**

By embracing [SAP Datasphere](https://vizioconsulting.com/sap-datasphere/), organizations can leverage their data as a strategic asset. It enables them to make informed decisions, identify new opportunities, and enhance operational efficiency. In a rapidly evolving business landscape, where data drives success, SAP Datasphere empowers companies to stay ahead of the competition.
カップラーメンを待つ間に作るRails × Docker × PostgreSQL環境構築テンプレート

## カップラーメン作ってる間にコマンドを一つだけ実行します 🍜

https://github.com/k-suke39/docker_rails_postgresql


```ruby
git clone git@github.com:k-suke39/docker_rails_postgresql.git && cd docker_rails_postgresql && docker-compose build && docker-compose run web rails db:create && docker-compose up --build
```
```ruby
# http://localhost:8000/ でログイン
```

# 終わり！🍜
ApacheのMPMについて

## 環境
Apache2.4.41
Ubuntu20.4

## はじめに
MPMとはMulti Processing Moduleの略で、マルチプロセスを実現するための仕組みのことです。Webサーバーへの接続数が多くなってきた場合、シングルプロセスで処理をしていれば、効率が悪くなり、レスポンスの低下につながることになります。レスポンスを上げるためには、マルチプロセスで処理が行えるようチューニングを行う必要があります。Apache2.2系までは、シングルプロセスにしか対応していませんでしたが、Apache2.4系以降、マルチプロセスに対応できるようになっています。

MPMにはプロセス管理の仕方に、大きく３つの仕様が用意されています。
- prefork
- event
- worker

preforkがシングルプロセスで、eventとworkerがマルチプロセスです。Apache2.2系まではpreforkで動いていたが、Apache2.4系以降は、eventがデフォルト値に採用されるようになりました。

## 確認

自分の環境で、MPMに何が設定されているかを確認するコマンドです。自分の環境はApache2.4.41なので、デフォルトでeventになっています。
```
$ apachectl -V | grep MPM
Server MPM:     event
```

大抵の場合、MPMにはeventを採用しておいて問題ないと思いますが、状況に応じて、他のMPMに変更することができます。MPMはモジュールで提供されており、Apache2をインストールすると３つともインストールされています。mods-availableディレクトリに保存されています。
```
$ls -l /etc/apache2/mods-available | grep mpm_
mpm_event.conf
mpm_event.load
mpm_prefork.conf
mpm_prefork.load
mpm_worker.conf
mpm_worker.load

```

mods_enabledディレクトリを見ると、eventだけが有効になっています。
```
$ls -l /etc/apache2/mods-enabled | grep mpm_
mpm_event.conf
mpm_event.load
```

mpm_prefork.confの設定を見ると、待機プロセスの最小値と最大値が設定できるディレクティブが存在します。
```mpm_prefork.conf
MinSpareServers           5
MaxSpareServers          10
```

mpm_event.confの設定を見ると、待機プロセスではなく、待機スレッドの最小値と最大値を設定するディレクティブになっています。
```mpm_event.conf
MinSpareThreads          25
MaxSpareThreads          75  
```

シングルプロセスであれば、１つの接続に対して１つのプロセスが起動しますが、マルチプロセスの場合、１つのプロセスの中で複数のスレッドが動き、１つ接続に対し１つのスレッドが起動します。

接続数が増えてくると新しいスレッドが起動されるため、その分レスポンスが遅くなることになります。また、接続数が少なくなってくると、無駄に起動しているスレッド数が多くなるため、メモリが圧迫されることになります。スレッドの値と接続数はトレードオフの関係になっています。

## おまけ

PHPの環境でMPMの設定をする場合、PHPから提供されている、mod_phpといったモジュールが利用されます。こちらは、内部的にpreforkが使われています。eventに対応するには、php-fpmに変更することになります。
ECSでの"Missing credentials in config"エラーの解決


## 事象
AWS ECSのサービスを新しく作ってNode.js製のプロジェクトを動かしたら、以下のエラーになった。

```
[ERROR] Error [CredentialsError]: Missing credentials in config, if using AWS_CONFIG_FILE, set AWS_SDK_LOAD_CONFIG=1
```

## 設定確認
このプロジェクトではS3などのAWSサービスを利用しているのでAWSの認証情報を設定する箇所がある。
設定は以下

```js
const aws = require('aws-sdk')

if (process.env.LOCAL == 'true') {
  // ローカル開発環境なら~/.aws/credentialsを参照する
  aws.config.credentials = new aws.SharedIniFileCredentials()
} else {
  // ECSならECSのロールを参照する
  aws.config.credentials = new aws.ECSCredentials({
    httpOptions: { timeout: 5000 },
    maxRetries: 10,
    retryDelayOptions: { base: 200 },
  })
}
aws.config.region = "ap-northeast-1"
module.exports = aws

```

コメントにある通り、ローカル開発環境ではローカル環境の認証設定ファイルを参照し、ECSならECSのロールを見るようになっているはず。
なのでエラーの `if using AWS_CONFIG_FILE ・・・` には該当しない


## 解決

ダメなのはロール設定の方だった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284077/45a648cc-bc74-8ebf-98c5-043cd8b6f750.png)

↑ タスクロールの方にS3参照権限ポリシを持つロールを割り当てたら動いた


## メモ

タスクロールとタスク実行ロールの違いは

- タスクロール: ECSのコンテナ内からAWSの別のサービスにアクセスする時のロールを割り当てる
- タスク実行ロール: ECSコンテナを立ち上げるエージェントのロールを割り当てる。(上のようにコンテナの中身がすることには関与しない)例えばログをCloudWatchに保存するなどはこっちのロールになる。

以上。

## 参考
参考にさせていただきました

- [ECSのタスクロールとタスク実行ロールの違い](https://www.karakaram.com/difference-between-ecs-task-role-and-task-execution-role/)
dbt-coreに自作のサブコマンドを作成する方法

# 本記事が目指すこと
- dbt-coreのOSS活動を実施するにあたり、自作のサブコマンドを作成する方法について紹介する

# 注意
- 本記事は筆者が所属する会社と関係なく、個人の記事であることをご了承ください

# 背景
- 筆者は、ちゅらデータ株式会社に務める会社員であるが、就業時間中に職務としてのdbt-coreのOSS活動を始めた（OSS活動自体が初めての経験だった）
- 学びになったことを記事として残す
    - dbt1.6のリリースによって、幾つかの追加機能が開発された。
その中で、`dbt clone`というサブコマンドも追加されたのだが、そもそもサブコマンドを追加するにあたりどのようなドキュメント、フォルダやファイル、クラスに目を通して作成しなければならないのか気になったので調べてみた。(参考：`dbt clone`の[PR](https://github.com/dbt-labs/dbt-core/pull/7881/files))

# 本編
初めに読むべきドキュメントとしては、[core/dbt/cli/README.md](https://github.com/dbt-labs/dbt-core/blob/1.6.latest/core/dbt/cli/README.md) がある。
以下に簡単に内容を紹介する。

### core/dbt/cli/main.py
必要なすべてのデコレータおよび新しいコマンドの関数を次のように記述する。

```
@cli.command("my-new-command")
@requires.postflight
@requires.preflight
def my_new_command(ctx, **kwargs):
    ...
```
dbt-coreでは、[click](https://click.palletsprojects.com/en/8.0.x/)というPythonのパッケージを利用して、CLIを作成している。
そのため、一番上のデコレータ`@cli.command("my-new-command")`では、前段に定義した`dbt(デコレータ@click.groupで関数cliを修飾したもの)`のサブコマンドとして`my-new-command`を作成し、関数`my_new_command`を修飾しているのである。（なお、サブコマンドはケバブケースで、関数はスネークケースで統一されているようである）
また、`@requires.postflight`は、処理の都合上、requiresモジュールのデコレータの中では一番最初に記述される必要があるとのこと。
上記のサンプルはあくまで必要最低限のデコレータのみ記述しているが、[core/dbt/cli/main.py](https://github.com/dbt-labs/dbt-core/blob/1.6.latest/core/dbt/cli/main.py)を見れば分かるように、実際には他のいくつかのデコレータを重ねてサブコマンドを定義する。必要に応じて持たせるデコレータを選択すると良い。

### core/dbt/cli/types.py
新しいサブコマンドを、Commandクラスに追加する。
ここで、main.pyで定義した関数とサブコマンドをEnumとして以下のように記述する。
```
class Command(Enum):
    MY_NEW_COMMAND = "my-new-command"
```

### core/dbt/cli/flags.py
新しいコマンドを関数`command_args`内の辞書に次のように追加する。
types.pyで定義したEnumとmain.pyで定義したサブコマンドの関数を紐づける。
```
def command_args(command: CliCommand) -> ArgsList:
    ...
    CMD_DICT: Dict[CliCommand, ClickCommand] = {
        CliCommand.MY_NEW_COMMAND: cli.my_new_command,
```

ドキュメントに書かれている新しいサブコマンド追加時の基本項目は以上である。

後は、機能を記述する際には、`core/dbt/task`配下に、`my_new_command.py`のようなファイルを作成し、`MyNewCommandRunner`クラスや、`MyNewCommandTask`クラスを作成すれば良い。

また、`dbt/tests/util.py`の`run_dbt`関数を利用して、指定したコマンドを実行したときの結果を得ることができるため、テストを作成する際には利用すると良い。

# 終わりに
ちゅらデータでは、クレイジーな仲間を募集しているでござる
データエンジニア、もしくはSE系からデータエンジニアになりたい方がいればぜひ、御仁の力量に応じたグレード（ジュニア/ミドル/シニア）にて、応募するでござる

https://herp.careers/v1/churadata/T6Oag1FxE34V
QRコード認証のパスコードを計算する(sAuthenticator.exe{sWebTool})

ver5.3.0.0 から sAuthenticator.exe(sWebTool) を同梱した。

# はじめに

最近の診断対象には「Google認証システム」をスマホにインストールして、QRコードを読み込んで行う多要素認証がついているテスト用アカウントが、脆弱性診断でも多くなってきました。

QRコードの読み取りは、「[sQRCodeFugging.exe](https://qiita.com/tomoki0sanaki/items/e46e666625191aeb762b)」に任せて、そのotpauthスキームのURIからパスコードを生成するのが、ツールを作りました。

パソコン上で動作するので、クリップボードにコピーすれば、ログイン処理を手軽に実施することが可能となるでしょう。

# 画面説明

![sAuthenticator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/40366220-fe99-9307-8498-ffb42337b7c5.png)

1. 左上のURIに、QRコードから読み取ったURIを入力する
2. 右上の「Add」ボタンで、リストに登録されるので、、、
3. 「Start/Stop」ボタンで、パスコード計算の開始/中断
4. 「Copy CB」でクリップボードにコピーするので、それを多要素認証のパスコードとして貼り付ければいいでしょう
5. 「AutoCBCopy」チェックをOnにすると、パスコードが更新するとクリップボードに即時にコピーされます。ユーザ名/パスワードをWebブラウザに記憶している場合は有用かもしれません
6. 複数登録できるので、複数のテストアカウントを切り替えて使う場面にも対応できるかと思います

# 利用に際して

当然ですが、本ツールは、デバグ用、開発用であり、悪用厳禁ですよ。

# インデックスへ戻る

[sWebTool Manual index](https://qiita.com/tomoki0sanaki/items/b8f571ae296a32f7b434)

# 以上
サブドメインテイクオーバーについて

# はじめに

サブドメインテイクオーバーが現在流行っているということで調べてみました。

これは自分のメモとして残しておきます。


# サブドメインテイクオーバー

JPRS社のページがわかりやすいです。

https://jprs.jp/glossary/index.php?ID=0267

自分なりの理解を書きます。

CNAMEレコードなどのDNSレコードをサーバ管理者が消し忘れることが原因となり、このDNSレコードが第三者にフィッシングサイトのFQDNなどに利用されてしまう危険性があります。

DNSレコードの消し忘れは普通にnslookupなどでもレコード残っていることが確認できるため、色んな方向からダブルチェックする必要があります。

で、問題はこのドメインを第三者に再利用されてしまった場合、どうやって取り返すのか？という所です。
取り返す方法があるのか？は気になりますよね。。（たぶん無理では？）

# 終わりに

DNSのセキュリティ対策は問題になっていますが、注意したいものです。
CDK) RDSの認証局の有効期限対応

# TL;DR

- aws-cdk-lib 2.94.0以降を利用する
- caCertificate: rds.CaCertificate.RDS_CA_RDS4096_G1 を記述する
- rds-ca-rsa4096-g1を指定した場合期限は100年後の2121年なので今回対応すれば今後は対応不要

# 経緯

- RDSではデフォルトで認証局が設定されていて、最近までのデフォルトはrds-ca-2019となっている
- AWSからrds-ca-2019は2024年で期限切れになると通知が来たので対応する(RDSの認証局の更新)
- 9/2まではCDKで認証局を変更するのは工夫が必要だった(CDKに認証局を直接指定するプロパティがない。CFnにはある)(https://dev.classmethod.jp/articles/setting-rds-aurora-instance-ca-with-cdk/)
- 9/2にリリースされたaws-cdk-lib 2.94.0で可能になった

# 記述



```
  "dependencies": {
    "aws-cdk-lib": "^2.94.0",
  ...
  }
```

```
import {
  ...
  aws_rds as rds,
  ...

...

      const rdsInstance = new rds.DatabaseInstance(this, `sample-rds-instance`,{
        ...
        caCertificate: rds.CaCertificate.RDS_CA_RDS4096_G1,
        ...
      });
```

cdk diffの出力

```
Resources
[~] AWS::RDS::DBInstance sample-rds-instance samplerdsinstanc012345678
 └─ [+] CACertificateIdentifier
     └─ rds-ca-rsa4096-g1
```


# リファレンス

https://github.com/aws/aws-cdk/releases/tag/v2.94.0

> rds: support certificate autority certificate (#26883) (4fd510e), closes #26865
【高先さんの電子工作】第9回：アクティブブザーを使ってアラームを作る

https://youtu.be/GYyqfwcGVtg


```python:main.py
from machine import Pin
from utime import sleep

buzzer = Pin(14, Pin.OUT, value=0)
button = Pin(15, Pin.IN)

print('秒数を入力して下さい。')
seconds = int(input())
sleep(seconds)
buzzer.on()

while True:
    if button.value() == 1:
        buzzer.off()
        break
    sleep(1)

```
【ChatGPT】の前に座ったけど、何を入力したらいいのか、わからない人へ。


　どうも、カーブミラーです。

　今回は、ChatGPT初心者が陥る「初めての入力」で困ること、「何を書いたらいいの？」ということについて書きます。

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　ChatGPT初心者の大半の方が、
　　書籍などで得たプロンプトを
　　　入力して、ChatGPTからの
　　　　出力に驚く。

　けれど、いざ自分自身の考えを
　　入力しようとすると、
　　　考え込んでしまう。

　何を入力したら、いいの？と。
***
　これは、何をはじめるときにも
　　あることですね。

　小説や記事の書きはじめや
　　メールの書きはじめなど。
　　　Twitter（現X）の
　　　　初めてのツイートなんかも
　　　　　ありますね。

　これを打破するのは、
　　大変です。

　仕事のメールであれば、
　　時間も限られたりしますし、
　　　決まった書式もありますから
　　　　やっつけで書けますw

　でも、時間があり、書式もない。
　　やっつける仕事もない。

　それなのに、頭の中には、
　　いろいろと渦巻いている。
　　　違いますか？
***
　私の記事を読んでもらうと、
　　わかると思いますが、
　　　まずは名前を名乗っています。

　次に、
　　内容についての要約。

　で、注意事項。

　内容。

　というスタイルです。

　これを真似ろ、
　　というのではなく、
　　　**自身の決まりを作ってみる**
　　　　ことを提案したいです。

　例えば、まずは挨拶。
　　私の記事ならば、名乗り。

　ChatGPTも
　　こちらの挨拶に、
　　　挨拶で返してくれます。

　ChatGPTに対しての
　　名乗りは必要ありませんけど、
　　　呼び名は欲しいので、
　　　　ペンネームとか
　　　　　愛称とか、
　　　　　　呼ばれたい名前を
　　　　　　　教えてあげて
　　　　　　　　ください。

　そこからは
　　仕事の話をしてもいいし、
　　　人間関係の話でもいい。

　何を入力するかは、
　　あなた次第。

　まぁ、
　　簡単に、
　　　入力できるならば、
　　　　こんな記事、
　　　　　読んでいませんよねw
***
　そこで提案です。
　　ChatGPTを飲み屋で
　　　隣り合った知らない人
　　　　と思いましょう。

　その飲み屋では、
　　“隣り合った人とは、
　　　なんでも話さなければ
　　　　いけない”という
　　　　　ルールがあります。

　いや、そんな飲み屋、
　　あったら、行きませんけどもw

　でも、そんな状況に身を置いて、
　　話しかけるのです。

　お互い、ひとりで、飲みに来て、
　　そんなお店のルール……

　相手からは、
　　“話しかけて欲しい”オーラを
　　　感じます。
　　　　ChatGPTさんは、
　　　　　本当に話しかけて
　　　　　　欲しがっていますよ。

　最初は、
　　あなたから話しかけなければ
　　　いけないようです。

　どう話しかけますか？
　　まずは、ひと声。
***
***User***
こんばんわ

***ChatGPT***
こんばんは！どのようなお手伝いができますか？
***
　こんな会話になるなんて、
　　イヤですけどねw

　続けましょう。
***
***User***
話をしてもいいですか？

***ChatGPT***
もちろん、お話しできます！何についてお話ししましょうか？

***User***
出身はどちらですか？

***ChatGPT***
私はインターネット上に存在するAIですので、特定の出身地はありません。ただし、私の開発元であるOpenAIはアメリカに本社があります。どのような質問かお答えできますか？
***
　まずは、
　　こんなところからでしょうか。

　ちょっと変わった
　　飲み相手ですけど、
　　　飲んでいると思えば、
　　　　理性的な相手であることは
　　　　　悪くないですね。

　こちらの言葉に
　　激昂することもありませんし、
　　　どこまでも付き合ってくれる。

　こんな飲み相手、
　　なかなかいません。

　ちょっとした人生相談も
　　お手のもの、だったり。

　愚痴っても、
　　聞いてくれます。

　ちょっと返してくれる内容が、
　　長い傾向にありますけどねw
***
　さて、
　　これで、少しはChatGPTを
　　　相手にできそうに
　　　　なったでしょうか？

　そうだったら、
　　いいな、と思います。

　良き船出を。

　以上。
【学習】Linuxコマンド　Day4

# おさらい(はじめに)

前回までは主に以下のことを学習しました。(一部省略)
- 環境構築
- コマンドラインの操作方
- 基本的なコマンド①
- 基本的なコマンド②(ファイル操作)

今回は基本的なコマンド②の続きとして引き続きファイル操作を行っていきます。

# 今日学ぶこと
- ファイルの表示(cat,head,tail)
- リンクの作成(ハードリンク、シンボリックリンク)

# ファイルの操作
### ファイルの表示(catコマンド)
catコマンドは引数にファイル名を指定すると中身を表示できる
```
$cat /etc/hostname
```
上記を実行するとホスト名が表示される。
ちなみにオプションで-nオプションを指定すると行番号もつけることが可能。

### 先頭だけ表示する(headコマンド)
-nオプションの引数に整数値を渡すことで取得する行数を指定する
(オプションを指定しなかった場合は10行となる)
```
$head -n2 /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
```
この場合はcrontab(cronの設定を行うファイル)から先頭2行を取得するという意味

### 末尾だけ表示する(tailコマンド)
こちらもheadコマンド同様-nオプションに渡した整数値によって何行取得するか指定する
```
$tail -n2 /etc/crontab
# * * * * * user-name command to be executed

```

# リンクの作成

### ハードリンクの作成(lnコマンド)
そもそも"リンク"とはファイルやディレクトリに別名をつける機能。
その中で、ハードリンクは"ファイルの実体に名前を結びつける機能"となります。
例えば「file1」に「file2」という別名をつけるとどちらも同じファイルと結びついていることとなります。
試してみます。
「hello」と記載されている「file1」があると仮定してください。
```
$ ln file1 file2
$ ls 
file1 file2
$ cat file2
hello
```
file1とfile2の実体は同じです。
一つのファイルを複数の名前で呼び出すことが可能となります。
ファイルに付いているハードリンクの数(リンクカウント)はlsコマンドの-lオプションで確認できます。
```
$ ls -l
total 4
-rw-r--r--. 2 masaki masaki 22 Sep 12 11:22 file1
-rw-r--r--. 2 masaki masaki 22 Sep 12 11:22 file2
```
ファイルに対して一番左に表示されている数字の部分ですね。
ここがハードリンクの数となります。

### シンボリックリンクの作成(lnコマンド -sオプション)
シンボリックリンクは名前と名前を結びつけることで別名で呼び出せるようにする機能。
例えば「file2」というファイルに「file3」というシンボリックリンクを作成した場合。
「file3」を指定すると「file2」を呼び出すことが可能となる。
```
$ ln -s file2 file3
$ cat file3
hello
$ ls -F
file2 file3@
```
「file3」の「@」がシンボリックリンクを表す記号となる。
ハードリンクはディレクトリに対して作成することはできないが、シンボリックリンクはあくまで名前と名前を結びつけていることから、ディレクトリに対しても作成が可能である。

### リンクを作成するメリットは？

①長くなりがちなパスを短い名前で呼び出せる
　→階層が深い場合、いちいち入力するのは手間なので、リンクを作成することで手間を省ける

②ファイルの場所が変更されても呼び出し方法を変更せずに済む
　→ファイルやディレクトリが変更されれば当然パスを変更しないとうまく動作しないことがあるが、リンクを作成することで呼び出し方を変えずに呼び出すことが可能

# おつかれまでした
本日のファイル操作の部分についてもこの先頻回に使用するコマンドと思われます。
しっかり意味を覚えておきたいところです。
リンク、とくにシンボリックリンクはプログラミングを行っている中でなんとなくの解釈で使用しておりましたが、ハードリンクとシンボリックリンクの違いを学習することで、より「なぜそれを使用するべきか？」というポイントを押さえることができて、今後はより積極的に怖気ずに使用することができると思います。
localeでLC_ALLをいじったら文字化けするようになってしまったときの対処

以下コマンドでlocaleの設定を確認
```
$ locale -a
LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="ja_JP.UJIS"
LC_NUMERIC="ja_JP.UJIS"
LC_TIME="ja_JP.UJIS"
LC_COLLATE="ja_JP.UJIS"
LC_MONETARY="ja_JP.UJIS"
LC_MESSAGES="ja_JP.UJIS"
LC_PAPER="ja_JP.UJIS"
LC_NAME="ja_JP.UJIS"
LC_ADDRESS="ja_JP.UJIS"
LC_TELEPHONE="ja_JP.UJIS"
LC_MEASUREMENT="ja_JP.UJIS"
LC_IDENTIFICATION="ja_JP.UJIS"
LC_ALL=ja_JP.UJIS
```
上の例だと、LC_ALLがja_JP.UJISになっており、これはLANG変数よりも優先される。
これがターミナル側の文字エンコーディング解釈と一致してない。

以下コマンドで治る。
```
export LC_ALL=C.UTF-8
```

### 補足
aptコマンドの出力はlocaleの影響を受ける。
RailsAdminで特定のカラムを非表示にする (除外する) (一覧・詳細・エクスポート)

# 設定例

exclude_fields を使えば良いようだ
一覧・詳細・エクスポート全てで出てこないようにするにはそれぞれ設定する必要がありそうなので注意

```rb
RailsAdmin.config do |config|
  config.model 'League' do
    list do
      exclude_fields :id, :name
    end

    show do
      exclude_fields :id, :name
    end

    export do
      exclude_fields :id, :name
    end
  end
end
```

https://github.com/railsadminteam/rails_admin/wiki/Fields


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
作成したアプリをサーバーで自動起動する

# 作成したアプリをサーバーで自動起動する
ローカルにて作成したアプリを実際にAWSのEC2へデプロイし、動作検証をした際に躓いたので備忘録として。

## 問題
git cloneしてプログラムアップ
yarn install
yarn build
よし、本番サーバー起動
```
node .output/server/index.mjs &
Listening http://[::]:3000
```
ばっちり！
ブラウザからも表示できた！
めでたしめでたし....

念のためターミナル落としてもう一度確認....

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598309/69304341-b65b-5464-e6cb-03d1044530d4.png)
※Nginxからのリバースプロキシで動いています。

SSHの接続を切ってしまうとサーバーも止まってしまうといった問題に直面。

以下を参考にデーモン化することにする
[【Linux】Node.jsをSystemdに登録しデーモン化する](https://www.chuken-engineer.com/entry/2022/09/22/103500)

## ユニットファイルの作成
/etc/systemd/system
にユニットファイルを作成し、設定値を記述
```
[Unit]
#systemctl status にて表示される
Description= Nuxt3 hogeapp

[Service]
Type=simple
#実行ユーザー
User=ec2-user
#ライブラリなどあれば
WorkingDirectory=/var/www/html/hogeapp
#起動時コマンド
ExecStart=node /var/www/html/hogeapp/.output/server/index.mjs
#終了時コマンド
ExecStop=/usr/bin/pkill -e node
Restart=always
RestartSec=2
StandardOutput=syslog
StandardError=syslog
#実行サービス名
SyslogIdentifier=hogeapp

[Install]
WantedBy=multi-user.target
```
保存して、サービス一覧に存在するか確認
```
systemctl list-unit-files --type=service | grep hogeapp
hogeapp.service                      disabled        disabled
```
## 状態を確認
```
systemctl status hogeapp
○ animalapp.service - Nuxt3 hogeapp
     Loaded: loaded (/etc/systemd/system/hogeapp.service; disabled; preset: disabled)
     Active: inactive (dead)
```
Activeがinactive (dead)となっており未起動状態
## 開始
```
systemctl start hogeapp
```
開始できたか確認
```
systemctl status hogeapp
● hogeapp.service - Nuxt3 hogeapp
     Loaded: loaded (/etc/systemd/system/hogeapp.service; disabled; preset: disabled)
     Active: active (running) since Tue 2023-09-12 02:18:48 UTC; 14s ago
   Main PID: 4353 (node)
      Tasks: 11 (limit: 1114)
     Memory: 15.4M
        CPU: 459ms
     CGroup: /system.slice/hogeapp.service
             └─4353 node /var/www/html/hoge-tool-nuxt/.output/server/index.mjs

Sep 12 02:18:48 ip-10-0-2-96.ap-northeast-1.compute.internal systemd[1]: /etc/systemd/system/hogeapp.service:12: Standard output type syslog is obsolete,>
Sep 12 02:18:48 ip-10-0-2-96.ap-northeast-1.compute.internal systemd[1]: /etc/systemd/system/hogeapp.service:13: Standard output type syslog is obsolete,>
Sep 12 02:18:48 ip-10-0-2-96.ap-northeast-1.compute.internal systemd[1]: Started hogeapp.service - Nuxt3 hogeapp.
Sep 12 02:18:49 ip-10-0-2-96.ap-northeast-1.compute.internal hogeapp[4353]: Listening http://[::]:3000
```
Activeがactive(runnig)となった

## 動作確認

先ほどNginxのエラー画面だったブラウザを再読み込みしてみると画面が正しく表示された。

次にターミナルを切断してもう一度再読み込みしてみる。

問題なく表示することができた。

## 自動起動設定
インスタンスを再起動させても自動で起動してくれるように設定
```
systemctl enable hogeapp
Created symlink /etc/systemd/system/multi-user.target.wants/hogeapp.service → /etc/systemd/system/hogelapp.service.
```

以上
aoj-cliがbrewでインストールできない

# 前提環境
- M2 Macbook Pro
  - macOS Ventura 13.4.1
- zsh
- VSCode
- [aoj-cli](https://github.com/travelist/aoj-cli)

# 背景
travelist様の[Aizu Online Judge(AOJ)](https://onlinejudge.u-aizu.ac.jp/home)向けCLIツール[aoj-cli](https://github.com/travelist/aoj-cli)  
をHomebrewでインストールしようとしたところ、以下のエラーが発生した。

```bash
% brew tap travelist/homebrew-aoj-cli
% brew install aoj
Error: aoj: wrong number of arguments (given1, expected 0)
```

# 解決方法
brewやGo言語の知識がないため、バイナリを直接ダウンロードして、解決した。

## 手順
#### 1. [aoj-cliのリリースページ](https://github.com/travelist/aoj-cli/releases)よりバイナリをダウンロードする。
#### 2. ダウンロードしたバイナリを適当なディレクトリに配置する。
今回は競技プログラミング用のディレクトリとした。
`/Users/ユーザ名/Desktop/競技プログラミング/AizuOnlineJudge/tools`
![バイナリのディレクトリ配置](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3145202/a840b05f-9f35-08d7-889c-b58617815bf5.png)
#### 3. `.zshrc`に設定を追加する。
```bash
# /Users/ユーザ名/.zshrc
# パスは保存したディレクトリに合わせて変更してください。
export PATH="/Users/ユーザ名/Desktop/競技プログラミング/AizuOnlineJudge/tools:$PATH"
``` 
#### 4. aoj-cliの初期化を行う
```bash
% aoj init
# 表示に従い使用する言語を入力する。今回は　JAVA とした。
```

# テンプレートファイルの設定
brewを使わずにインストールしたため、以下のように設定を変更した。
```diff_toml
# /Users/ユーザ名/.aoj-cli/config.toml
[gen]
- template_file = "$HOME/.aoj-cli/template.txt"
+ template_file = "/Users/ユーザ名/.aoj-cli/Main.java"
destination_file_name = "Main.java"

[test]
before_all="javac Main.java"
before_each=""
command="java Main"
after_each=""
after_all=""

[submit]
language = "JAVA"
source_file_name = "Main.java"
```

```java
// /Users/ユーザ名/.aoj-cli/Main.java

import java.util.*;

public class Main
{
    public static void main(String[] args)
    {
        try (Scanner sc = new Scanner(System.in))
        {
            // 処理
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}
```

# 参考
travelist様 [AOJ 用のコマンドライン CLI ツールを作った](https://qiita.com/travelist/items/746406b5c2b8c71d718c)
Nuxt3 + TailwindCSS + Docker 本番環境向け

# Dockerfile
[Nuxt3](https://nuxt.com/)に[TainwindCSS](https://tailwindcss.com/docs/guides/nuxtjs#3)を組み込み
SSR(Server Side Rendering)にてDokcerのコンテナを作成するDockerfileです
※Nuxt3はYarnを選択しました

``` Dockerfile
FROM node:current-alpine as base

FROM base as builder
COPY . /app
WORKDIR /app

RUN yarn install && yarn build
RUN npx nuxi build

FROM base as runner

COPY --from=builder /app/.output/ ./

EXPOSE 3000
CMD [ "node", "./server/index.mjs" ]

```

本番環境向けと書いてますが、本番で運用する場合、前にnginxなどを挟んでください
ERROR 1054 (42S22): Unknown column '’〜〜’' in 'field list'のエラーに対する対処の事例

## ERROR 1054に対するエラー解決手順
::: note 
このエラー文は
「〜〜」に該当する部分がデータベース内のカラムに適さないという意味。
:::
### ❶INSERT文は正しいか

```sql:insert
insert into テーブル名(カラム)values(カラムに対応する値);
```
<font color="red">＊SQL文では大文字、小文字どちらを使用しても問題ない。</font>

### ❷MacOsを使用の場合：「’’」「””」が全角になっていないか
MacOsには、シングルクォーテーションやダブルクォーテーションがABC入力であっても自動で全角に変換されるという
コーディングには無用な機能が存在する。

https://satopedia.com/no-more-smart-replacement/

上記URLの内容を確認してみてほしい。

::: note warn
投稿主はこちらで解決しました。

色々と解決策を検索する中で、質問投稿の回答欄で発見しましたので

今後は発見しやすくするために記事に残しておきました。

:::
【Python】数字の半角全角置換にはtranslate

# はじめに
文字を扱っていると数字を全角や半角にしたいときがよくあります。
全角や半角に変換するライブラリーがありますが、インストールして使用するまでのことでも無いと毎回思っていました。
なので、translateでの変換方法をこの記事に簡単に書いておきます。

https://github.com/masa2122/full-width_half-width_substitution/tree/main

# コード全体
```Python
import pandas as pd

hankaku_table = str.maketrans({
    '1': '１',
    '2': '２',
    '3': '３',
    '4': '４',
    '5': '５',
    '6': '６',
    '7': '７',
    '8': '８',
    '9': '９',
    '0': '０',
})
zenkaku_table = str.maketrans({
    '１': '1',
    '２': '2',
    '３': '3',
    '４': '4',
    '５': '5',
    '６': '6',
    '７': '7',
    '８': '8',
    '９': '9',
    '０': '0',
})


# テスト用文章
word = "１1２2"

# テストの実行
hankaku_result = word.translate(zenkaku_table)
zenkaku_result = word.translate(hankaku_table)
```
# 簡単な説明
### 変換テーブル作成
変換用のテーブルを作成します。
左の文字から右の文字に変換されます。
```python
hankaku_table = str.maketrans({
    '1': '１',
    '2': '２',
    '3': '３',
    '4': '４',
    '5': '５',
    '6': '６',
    '7': '７',
    '8': '８',
    '9': '９',
    '0': '０',
})
zenkaku_table = str.maketrans({
    '１': '1',
    '２': '2',
    '３': '3',
    '４': '4',
    '５': '5',
    '６': '6',
    '７': '7',
    '８': '8',
    '９': '9',
    '０': '0',
})
```
### 変換
この行で変換を行っています。
```python
hankaku_result = word.translate(zenkaku_table)
zenkaku_result = word.translate(hankaku_table)
```
# おまけ
句読点の変換とデータフレームでの使用法を載せておきます。
## 句読点の変換
数字を句読点に変更することで対応させています。

```python
hankaku_mark_table = str.maketrans({
    '。': '.',
    '、': ',',
})

zenkaku_mark_table = str.maketrans({
    '.': '。',
    ',': '、',
})

hankaku_mark_result = word.translate(hankaku_mark_table)
zenkaku_mark_result = word.translate(zenkaku_mark_table)
```
## データフレームの変換
データフレームにはlambdaを使用して変換させています。
```python
df = pd.DataFrame({'A': ['1１', '２1', '３1', '１１', '11'], 
                   'B': ['12', '22', '32', '45', '85']})

df["C"] = df["A"].apply(lambda x: x.translate(zenkaku_table))
df["D"] = df["A"].apply(lambda x: x.translate(hankaku_table))
```
【初心者向け】TomcatのManagerAPPでSpring-bootのWEBアプリをデプロイする時に気を付けること！！

### 最初に
下でごちゃごちゃ書いてますが、ここで言ってることは2点です。

・**TomcatとJavaのバージョンをしっかり合わせる**
・**ファイル名はURLに反映されるのでコンテキストパスでファイル名を設定**

そんなこと知っとるわ！！って人はブラウザバックしてくださいm(_ _"m)


### Tomcatのデプロイ
TomcatのTOPページで、
ManagerAPPを押下して作ったwarを配備するだけ。なんて簡単なんだ・・・・。
※ManagerAPPのIDやパスワードの設定、warの作り方やPOMの書き方なんかは他の方の記事があるので割愛します。
![スクリーンショット 2023-09-12 090302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553117/96ea4872-0721-4a5d-d4f0-c20c01f752ca.png)
ここ押して
![スクリーンショット 2023-09-12 091531.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553117/439dea40-413e-ea69-7f1e-91e962920f5f.png)
ここでwarを選択して配備押すだけ。 
特別なことは何もしてません。ホントにこれだけです。

ターミナルでTomcatのwebappディレクトリにアプリ置いて～ってやらなくても視覚的に分かりやすいので便利ですね。

## 対応しているバージョンか気を付ける
必ず自分のアプリのJavaバージョンとTomcatのバージョンが対応しているか確認してください。
本番環境でデプロイするときはインストールしているJVMのバージョンが対応しているかも確認してください。（私もこれで嵌りました。）

・プロジェクトが適応しているJavaバージョンの確認
![スクリーンショット 2023-09-12 094640.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553117/4db18bda-fb3c-8693-6b2e-8835fd2af377.png)
プロジェクトの上で右クリックしてプロパティを開く

![スクリーンショット 2023-09-12 094944.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553117/eefd0ae8-ebc7-21b0-9abf-8c29477f0ecb.png)
画像で〇してるところが適応しているJavaバージョンです。
この場合はJava11ということですね。

※1：現在のJVMのバージョンの確認・Tomcatのバージョンの確認は別の記事でたくさん書かれているので調べてください。
※2：どのTomcatとJVMが対応しているかが分からない場合はBingなどのチャットAIに聞くのも手かと思います。下手にサイトで調べるよりは正確で早い回答をくれます。

## URLの罠
Tomcatでデプロイした場合WarのファイルネームがURLに含まれます。
URLにファイルネームとMappingを手打ちすれば良いんじゃないの？
とは行きません。何かボタンを押したときやページに遷移する場合は動的に設定したMappingが反映されるからです。

例：ローカルでファイルがcom-0.0.1-SNAPSHOT.warとした場合
![スクリーンショット 2023-09-12 102148.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553117/b7ab166c-c84d-a18b-1f9b-273e0e8dd451.png)
Controller側で一つ一つRequestMappingなんかで設定する方法もありますがもっと簡単な方法があります。

## application.propertiesファイルにコンテキストパスを設定する
見出し通りですね。以下書き方

application.propertiesに
```
#Context path
server.servlet.context-path=/【ファイル名】
```
と追記するだけです。

ファイルがcom-0.0.1-SNAPSHOT.warとした場合

```
#Context path
server.servlet.context-path=/com-0.0.1-SNAPSHOT
```

となります。これだけでURLにファイル名が動的に付くようになります。


以上TomcatのManagerAPPでWEBアプリをデプロイする時に気を付けることでした。
もしこれは違う！！って思った方はご意見くださいm(_ _"m)
【高先さんの電子工作】第8回：アクティブブザーを使って音を鳴らす

https://youtu.be/xMAbp_bpbTA

GP15をNPNトランジスタ（S8050）のベースに接続して操作しています。

```python:main.py
from machine import Pin

buzzer = Pin(15, Pin.OUT)

buzzer.toggle()

```
JavaScriptでFileオブジェクトを含めたDeepCopyを行う

JSでObjectを普通にコピーするとshallow copyになってしまう（ネストされたObjectなどがコピーされない）
そのハックとしてよく以下のようなコードが出てくる

```
const deepCopy1 = JSON.parse(JSON.stringify(obj));
```

しかし、これだとFileオブジェクトはコピーされない。

また、Utility系の外部ライブラリとして有名なLodashのdeepCopyでもFileオブジェクトはコピーできなかった

## Fileオブジェクトも含めてコピーする関数
```
const deepCopy = (obj) => {
  if (obj === null) return null
  if (typeof obj !== 'object') return obj

  if (obj instanceof File) return new File([obj], obj.name, { type: obj.type })

  if (Array.isArray(obj)) {
    return obj.map((val) => deepCopy(val))
  }

  const copy = {}
  Object.keys(obj).forEach((key) => {
    copy[key] = deepCopy(obj[key])
  })
  return copy
}
```

これで行けた。
Blobとかもやりたかったら、Fileと同じノリで増やしてあげるといけると思います。
Apex: オブジェクトリスト型に新規レコードの作成とオブジェクト型に新規レコードの作成

よく書く内容なので、メモとして残しましょう！
オブジェクト型に新規レコードの作成
```ruby:apex
Account acc = new Account(name = '株式会社テスト');
insert acc;
```


オブジェクトリスト型に新規レコードの作成
```ruby:apex
List<Account> accList = new List<Account>();
accList.add(new Account(name = '株式会社テスト'));
insert accList;
```
Macでzipファイルに解凍パスワードが設定できない原因と対処方法〜私の場合〜

恥の多い生涯を送ってきました。MacOSでのパスワード付きzipファイルの生成の方法を知らずにいたのです。

以下、パスワード付きzipファイルの作成方法やエラーが発生したときの対処内容を記録しておきます。


- このようなエラーが出て、zipファイルにパスワードの設定ができませんでした。

```terminal:エラー内容・翻訳
# エラー内容
zipcloak warning: Local Entry CRC does not match CD: ******

# 翻訳
zipcloak警告：Local Entry CRCがCDと一致しません

# macでZIPの暗号化するときに発生する。
# 正しいPW入れても解凍できなくなる。
# macの→クリックで圧縮かけたファイルは暗号化できない
# zipコマンドで圧縮する必要がある
```

- 以下が対処方法になります。

```terminal:対処方法
#　ZIP圧縮
zip -er 出力ファイル名.zip 圧縮対象ファイル名
#　暗号化
zipcloak 上で生成したファイル名.zip
```



## 今回自分に起きたエラーの内容と原因、そして対処手順

```terminal
# 今回発生したエラー内容 
Enter password: # パスワード入力
Verify password: # 再度パスワード入力
	zip warning: missing end signature--probably not a zip file (did you
	zip warning: remember to use binary mode when you transferred it?)
	zip warning: (if you are trying to read a damaged archive try -F)


# エラーの原因は以下の通り
$ ファイル名を右クリック=>「"ファイル名"を圧縮」でzipファイルを作っていた。
$ 上記手順で作ったzipファイルを、zipcloakコマンドでパスワード付与しようとしていた。
$ カレントディレクトリーの場所が間違っていた。


# 対処して解決するまでの手順
$ ターミナルを起動
$ cd Desktop
$ zip -er 出力したいファイル名.zip 圧縮したいファイル名.pdf

=> adding: **********.pdf
   (deflated 25%)
```


## まとめ
- 大変勉強になりました！
- 今まで、zipファイルが作れずに、おざなりにしてきました。
- 今回の調査で原因が明らかになってよかったです。



## 参考サイト

https://error-search.com/error-post/detail/414/zipcloak