OmniAICreator/Qiita-1.07M huggingface dataset:
【CopilotForXcode】Xcode版GitHubCopilotがめちゃくちゃ便利になってた

# はじめに
https://qiita.com/SNQ-2001/items/3777c50e8c3a1aa894f0

以前、XcodeでGitHub Copilotを使う方法の記事を書きました。
ずっとこの時のままのバージョンで使ってたのですが、最近アップデートがあったみたいでめっちゃ便利になってました！！

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">CopilotForXcode、どうせまともに動かないんでしょ（先入観）と思ってたら UI がちゃんと考えられているしリアルタイムでの提案のレスポンスも速くてかなり使いやすかった<a href="https://t.co/aICqzFf3bF">https://t.co/aICqzFf3bF</a> <a href="https://t.co/b0MorvcimG">pic.twitter.com/b0MorvcimG</a></p>&mdash; maiyama18 (@_maiyama18) <a href="https://twitter.com/_maiyama18/status/1637354808259809280?ref_src=twsrc%5Etfw">March 19, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 最新バージョンをインストール

https://github.com/intitni/CopilotForXcode/releases/tag/0.8.6

① アプリをダウンロードします
![スクリーンショット 2023-03-19 17.52.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/0b51dc3b-f87d-8829-368d-3cfe26872811.png)

# アプリを使うための設定
https://qiita.com/SNQ-2001/items/3777c50e8c3a1aa894f0

上記の記事と全く同じなのでそちらを見てください。

# リアルタイムサジェストを使う設定
① 「Present suggestions in」を「Floating Widget」に変更します
② 「Widget position」を「Follow Text Cursor」に変更します(任意だけどおすすめ)
③ 「Real-time suggestion」をオンにします
④ 「Real-time suggestion fetch debounce」を設定します(私は0.10sにしました)
![スクリーンショット 2023-03-19 17.56.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/d2bfd367-8d10-dc8e-c97d-e62439274b6f.png)

# 使ってみる
① 「Editor」を選択します
② 「Copilot」を選択します
③ 「Real-time Suggestion」を選択します
![スクリーンショット 2023-03-19 18.05.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/421c4fdd-414f-22f4-218c-8c3adb99eae3.png)

右側に候補が表示された！！！
![スクリーンショット 2023-03-19 18.19.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/251652c9-c053-2b26-4224-f4b8ae132b51.png)


めっちゃ画質悪いですが、どんな感じで動いてるのか見てください笑

<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/61941f25-f135-62dd-6f09-f243bf22fe00.gif">

# おわり
これはVSCodeレベルまで到達したのでは！？
CSSの基礎を学び直す

CSSの基本ルール

セレクター（どこの）{
    プロパティ（何を）:値（どうする）;
}

例
h1{
    color:#bb0000
}


マージンとパディングの違い
・マージンはボーダーの外側。また負の値が使える。値にautoが使える
・パディングはボーダーの内側

色んなセレクタ
id＝同じid名は一つまで
class=同じclass名を何回も使える
*＝全ての要素に
スペース＝A B。Aの中の全てのB
>=A>B。Aの一つ下の階層のB。例えばpの中にstrongとdivがあったら、strongがそれに該当する
+=A+B。Aの後に記述した同じ階層のB。Aの次に出てくるやつ。
~=A~B。Aの後に記述した全ての同階層のB

command+/でコメントアウトできる

擬似クラス
a:link　ー未訪問のクラス。よくある青文字のやつ
a:visited　ー訪問済みのリンク。クリックした後の色のやつ
a:hover　ーホバー状態のリンク。カーソル当てた時
a:active　ークリック状態のリンク。
↑この順番で記載する
rsyncエラー(code 24)が出た

# 【rsyncエラー(code 24)が出た】

## はじめに

ある日、移設元サーバと移設先サーバの同期のために`rsync`をした。
以下のような`rsync`スクリプトを実行し、Slackへ通知するようにしていた。

```:例文
#!/bin/bash

set -eu

--- snip ---

set +e
<rsynスクリプト>

RSYNC_STATUS=$?

if [[ "${RSYNC_STATUS}" = 0 ]]; then
    MESSAGE="message=$(hostname): rsyncが成功しました ($RSYNC_STATUS)";
else
    MESSAGE="message=$(hostname): rsyncが失敗しました ($RSYNC_STATUS)";
fi

curl <Slackへメッセージ>

```

もちろん、正常終了の`0`を期待していたのだが`24`が返ってきた...
`rsync`と`(code 24)`がよくわかっていなかったので調べた時のメモ。

## ざっくりrsync

1. ファイル複製・転送を始める前に処理対象（`ファイル名`、`タイムスタンプ`,`ファイルサイズ`）のファイルリストを作成する
1. コピー先でrsyncを実行し、コピー元からのファイルリストを分類する
    1. 同一ファイル
    1. 存在しないファイル
    1. 差分があるファイル
1. コピー元からコピー先へファイル転送
    1. 同一ファイルはスキップ
    1. 存在しないファイルは丸ごとコピー
    1. 差分があるファイルは差異だけをコピー
1. （ファイルリスト作成後にアプリケーションプログラムの一時ファイル等が消失するケースがよくある）

## rsyncエラー(code 24)

まず、rsyncコマンドの実行中にエラーが発生することはよくある(?)そうです。
（コピー元をサーバを停止させるとよいと書かれていたが、それはできないサーバでした）

>エラー コード 24 は主に、ソース ファイルが消失したために部分的な転送が行われた場合に発生します。

ref. https://bobcares.com/blog/rsync-error-24/

今回のエラーは、以下が考えられることがわかった。
1. ファイルリスト作成時に存在していたものが、転送前に削除された
1. ファイル名の読み取りエラー

1つ目について、以下のようなことがあるとわかった。

>ライブ バックアップ中にファイルが消失するのは、まったく正常なことです。たとえば、多くのアプリケーションは有効期間の短い一時ファイルを作成します。そして、それらは後で削除されます。これは特に、メール サーバーの場合に発生します。メール サーバーでは、電子メール メッセージを含むファイルが常に 1 つのディレクトリから別のディレクトリに移動されます。

ref. https://bobcares.com/blog/rsync-error-24/

結論、よくあることでエラーが出る時と出ない時があるが、深刻には受け止める必要はないらしい...
が、自分は気になったので再実行し、再度失敗したらエラーログを確認して調べることにした。

すると、正常終了した。
`rsync`は何度か実行すると、ファイルリストを作成のやり直してくれるだろうか。。
`rsync`の仕組みを調べるきっかけになったのはよかった。

はぎれがわるいが、おわり。

## 参考

https://www.ginnokagi.com/2021/11/ba-in-timersync24.html

https://bobcares.com/blog/rsync-error-24/
（PostgreSQL）テーブルの権限について

- データベースのオーナーとしてユーザー（user1）を作成
- user1にテーブルの操作権限を付与
- user1としてデータベースにログインし、テーブル操作

これらの操作を通してテーブル権限について理解を深める。

## 下準備
```sql:データベースとオーナーを確認
psql -l
```

実行結果
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313039323336362f66343330633665362d306262652d363861652d323035352d3537316335656230393465662e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092366/e161210e-152f-b1d0-28a6-89633345b6d2.png)

新しくデータベースを作るのも面倒なので、前に[この記事](https://qiita.com/class_kouta/items/09136d77cdb1747f6c6d)を書いた時に作った「mydb」を今回も使う。

```sql:mydbにオーナーとしてログイン
psql -U オーナー名 mydb
```

```sql:検証用テーブルを作成、データの挿入
CREATE TABLE test_permission_table (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL
);

INSERT INTO test_permission_table (name) VALUES 
('denji'),
('power'),
('aki');
```

用意したテーブル
| id | name  |
|----|-------|
| 1  | 'denji'   |
| 2  | 'power' |
| 3  | 'aki'   |



## ユーザーの作成
```sql:SQL
CREATE USER user1 WITH PASSWORD 'user1';
```
今回パスワードはてきとー

作成したユーザーは以下のコマンドで確認できる
```sql:ユーザー一覧を確認
SELECT usename FROM pg_user;
```

## 権限の付与

```sql:構文
GRANT SELECT, INSERT, UPDATE, DELETE ON table_name TO user_name;
```

今回は、user1に対し、test_permission_tableについて、SELECTのみ権限を与える
```sql:構文
GRANT SELECT ON test_permission_table TO user1;
```

権限を確認したい場合は以下のSQLを実行
```sql:テーブルに設定されている権限を確認
SELECT grantee, privilege_type
FROM information_schema.table_privileges
WHERE table_name = 'テーブル名';
```

## ユーザーの切り替え
オーナーからuser1に切り替えてログインし直す
```sql:user1でmydbにログインし直す
psql -U user1 mydbv
```

## テーブル操作してみる
```sql:セレクト、インサート
SELECT * FROM test_permission_table;
-- 実行できた

INSERT INTO test_permission_table (name) VALUES ('kishibe');
-- ERROR: permission denied for table test_permission_table
```
権限があるセレクトはできるが、インサートはできない
AWS　GPUが使えるインスタンスの調べ方テクニック

# GPUが使えるインスタンスの調べ方

AMI名がそのインスタンスの設定を示しているので、それを確認します。

EC2の左サイドバー、イメージの「AMI」を選択、左上のところで「パブリックイメージ」を選択。
検索で`gpu`と入れて検索する。

AMI名が`amzn2-ami-ecs-gpu-hvm-2.0.20210331-x86_64-ebs` とかになっているので、そこを確認する。

この場合、ecsで利用可能な、GPU搭載のインスタンス、という意味になる。

なので、`ecs-gpu`と検索すればecsで利用可能な、GPU搭載のインスタンスを検索することができる。

リンクの方法を使えば、AWS CLIでも検索できる。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/retrieve-ecs-optimized_AMI.html

ちなみにGPUを使用する場合は、こちらに記載のインスタンスを指定する必要がある。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-gpu.html
IAMユーザーに設定されてるMFA認証をAWS CLIを使って無効化してみた

## この記事を読むとできること
***IAMリソースを更新可能なアクセスキーが手元のPC上にあってAWS CLIを実行できる環境があればCLIからIAMユーザーのMFA認証を無効化することができる。***
## 背景
*　携帯を機種変したときに、MFAの引き継ぎに失敗‥
*　IAMユーザーはMFAを有効化しててログイン不可能の状態に
*　AWSのアカウント管理者は自分ではないので、ルートアカウントの情報は知らない

土日にAWSの勉強をしようと思ったけど、ログイン出来ないんじゃどうすることもできないし
休みの日に管理者に連絡してMFAを無効化してもらうこともできない。
なんとか自力でできないもんかと思い調べたところ、クラスメソッドさんでこんな記事を発見！！

https://dev.classmethod.jp/articles/disable-iam-user-mfa-with-aws-cli/

CLIが使える環境ならコマンド打てば無効化できるっぽいぞ！！
公開されたから、だいぶ年月が経ってるけど行けるかなと不安な気持ちを抱えつつ
試してみることに。

## 手順
### IAMユーザーに設定されてるMFAデバイスの情報を確認
```
$ aws iam list-mfa-devices --user-name IAMユーザー名
```
実行後に返ってくる情報のうち「SerialNumber」の値をこの後の作業で使うので
どこかにコピペしておくと作業しやすい。

### MFAデバイスを無効化
```
$ aws iam deactivate-mfa-device \
  --user-name IAMユーザー名 \
  --serial-number SerialNumberの値
```

### デバイスが無効化されていることを確認
```
$ aws iam list-mfa-devices --user-name IAMユーザー名
{
    "MFADevices": []
}
```
この状態になったら、コンソールからユーザー名とパスワードのみでログインできるようになるので
ログイン後は必要に応じてMFAを再度有効化すればいい。

### 無効化したデバイス情報を削除する
無効化した後も、仮想認証デバイスの情報は残ったままになってしまうとのことなので
コマンドを打ってこちらも削除しておく
```
$ aws iam delete-virtual-mfa-device --serial-number SerialNumberの値
```

これでMFA無効化の削除は全て完了。

## まとめ
CLIが使えない環境だったら完全に詰んでいたので
今後機種変する際は、MFAの対応はしっかり対策を打っておこうと思いました。
そして、今回参考にさせてもらったクラスメソッドさん記事には大変感謝しております。
参考にさせて頂いた記事は公開されてから、年月が経っておりますがこの記事を公開した時点では
まだMFAの無効化は行えたので、同じように困っている人が居たら参考になるかと思います。


## 参考
https://dev.classmethod.jp/articles/disable-iam-user-mfa-with-aws-cli/
【Mac】Macのマウスホイールが逆に動く

<< [【Mac】MacOSの基本操作を覚える](https://qiita.com/hiroyuki-eguchi-0731/items/99a0d771fda18adac9f0)

# Macのマウスホイールが逆に動く

Macに対応したマウスをやっと手に入れたのでトラックパッドからマウスに操作を変更。
ホイールもぐりぐりと動くのでよしよし、、、と思ったらホイールの動きが逆になっていることに気づく。

ネットで調べてみるとすぐに確認できましたが、備忘録としてまとめておきます。

* [システム環境設定]-[マウス]を開く
* ”スクロールの方向：ナチュラル”のチェックをOFFにする

無事に期待通りのホイール動作ができました。

---

2023-03-19 初稿
初めてDNSのゾーン転送を試してみた

## はじめに
現在、基幹システムをプライベートクラウド上に構築中で、その中一件検証が必要になりました.
備忘の意味も込めて、その内容を記事にまとめます。

## 概要
■検証内容
    オンプレミスのDNSレコードを、新たに構築するDNSにコピーできることを確認する

■構成図（めっちゃ雑）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/2c87acb3-0935-deaf-904e-b7b51a4745a7.png)
■環境
・OSはすべてWindows Server 2019
・ミドルウェアなどは特に考慮の必要なし
・現行DNSはActive directoryを兼ねている
・新DNSはActive directoryとの同居なし

## 検証詳細
以下が実際の検証手順になります
①サーバーを3台用意し、それぞれにDNSサービスをインストール
②DNSの設定を実施
③プライマリとセカンダリDNSサーバーで、設定が同期されているかどうか確認する

#### サーバの用意とDNSサービスのインストール
今回はAWS上で実施しましたので、以下のテンプレートでリソースを作成しました。
※サブネットとセキュリティグループは既存のものを使用しました。

```yaml
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-0edcdc40ffd2c6589
      InstanceType: t2.micro
      KeyName: my_Keypair
      SecurityGroupIds: 
      - !Ref MySG
      SubnetId: !Ref MySubnet
      IamInstanceProfile: MyinstanceProfile
      Tags:
        - Key: Name
          Value: test
　　　 UserData:
        Fn::Base64: !Sub |
          <powershell>
          Install-WindowsFeature -Name DNS -IncludeManagementTools
          Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False
          </powershell>
```
ユーザーデータのスクリプトで以下を実施します
・DNSサービスのインストール
・ファイヤーウォールの無効化

#### DNSサーバーの設定
こちらのを参考に、プライマリとセカンダリのDNSを設定します

https://jp.fujitsu.com/platform/server/primergy/technical/construct/pdf/win2016-network-guide.pdf


DNSの基本設定が終わったところで、次はプライマリDNSでレコードを設定していきます
作成したゾーンを右クリックし、「新しいホスト（AまたはAAAA）」をクリックすることでレコード設定ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/88f12341-6dc7-b572-a302-e4402e66406d.png)

レコードの設定が終わったら、プライマリDNS上からゾーン転送の設定を以下の手順で実施します。

①転送するゾーン名を右クリックし、”プロパティ”を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/1c9bc41e-8d87-dffe-5b62-f88ab6133bbf.png)


➁ゾーン転送を許可するサーバを選択し、セカンダリDNSサーバのIPアドレスを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/54300d8b-c0f8-e6a5-4eba-191c88193524.png)

以上で設定は終了です

#### 設定が同期されていることの確認
プライマリDNS上でレコードを追加します。
今回は、10.0.15.217というIPアドレスのサーバを新たに同セグメント上にたて、Server3というAレコードを登録しました。

結果、再起動なしに即座にレコードがセカンダリDNSに反映されていることを確認しました。

## 終わりに
お客さんの稼働中DNSを触る必要があったので、念のためという意味を込めて検証しました。
以下参考です。

https://milestone-of-se.nesuke.com/l7protocol/dns/zone-transfer/#:~:text=%E9%80%86%E5%BC%95%E3%81%8D%E5%8F%82%E7%85%A7%E3%82%BE%E3%83%BC%E3%83%B3%E3%81%AF,%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%BE%E3%83%BC%E3%83%B3%E3%81%A7%E3%81%99%E3%80%82

https://server-network-info.blogspot.com/2018/03/windows-server-2016-dns-a.html

AWS上でのレコード登録は経験済でしたが、実際にWindowsにDNSサービスをインストールし、レコードの編集をするのは初だったので、よい経験になりました。
MSX-BASIC の浮動小数点数（BCD浮動小数点数）

# はじめに

MSX-BASIC のソースコードは MSX（エミュレータを含む）上で打ち込んで実行するのが正しい作法（？）なのかもしれませんが、普段から vim などの便利なテキストエディタに慣れきってしまった軟弱な現代っ子である私にとって、それは中々ハードルが高いです。

> _今更MSX-BASICを触り始めたのは msx0 関連_

という訳で、MSXで扱えるフロッピーディスクイメージ（FAT12形式）を作成できるツールを作ってみました。

https://github.com/suzukiplan/msx-disk-manager-cli

これにより、

1. PC (vim等) で MSX-BASIC のソースコードを作成
2. `dskmgr` でディスクイメージを作成
3. MSXエミュレータ上でディスクイメージ読み込み
4. MSX-BASIC のソースコードを読み込んで実行

という手順で動くだろうと思ったのですが、実は MSX 上でフロッピーディスクに保存する MSX-BASIC のソースコード（.BASファイル）は、テキスト形式ではなく中間言語形式に変換されたものだったというトラップがあることを（作った後で）知りました。

確かにその方がメモリ消費を押さえつつ、インタプリタの構文解析によるオーバーヘッドも抑えられるメリットがあるので、（当時としては）そういう仕様にならざるを得ないものと類推できます。

という訳で、MSX-BASICのソースファイル（拡張子 .BAS のファイル）については、テキスト形式と中間言語形式を相互変換できるフィルタプログラムを作って、それを咬ませる魔改造をすることにしました。

https://github.com/suzukiplan/msx-disk-manager-cli/pull/3

これでようやく、vimでMSX-BASICのソースコードを書いてエミュレータ上で実行できるようになりました。

フィルタプログラムを作った際、MSX-BASICの実数表現（BCD浮動小数点数）がかなり直感と異なっていて解析するのが少し面倒でした。

という訳で、本書ではMSX-BASICの実数表現（BCD浮動小数点数）についてなるべく分かりやすく解説してみようと思います。

# BCD 浮動小数点数

MSX-BASIC（1983）の浮動小数点数は BCD 浮動小数点数という（やや特殊な）方式が採用されています。

IEEE754（1985〜）で規定されているデシマル浮動小数点数の元祖のようなものでしょうか。

> デシマル浮動小数点数はC言語ならC23以降の規格で利用できるようです。
>
> 一般的な浮動小数点数（バイナリ浮動小数点数）と違って誤差が発生しないため、金融系のシステムでは必須です。Java (BigDecimal) や C# (decimal) などの近代的なプログラム言語では当然使えますし、レガシー言語でも COBOL あたりで使うことができるらしいです。

MSX-BASIC の BCD 浮動小数点数とデシマル浮動小数点数の主な違いは、仮数部の数値表現が BCD (1234 → 0x1234) であることと、指数部の仕様が独特であることぐらいです。つまり、全く別物とも言えるかもしれませんが、基本原理はだいたい同じだと思われます。

## (データ構造)

データ構造は次のような形です:

- 1 bit の符号部
- 7 bits の指数部
- 仮数部:
  - 24 bits (単精度)
  - 56 bits (倍精度)

MSXで倍精度とかなかなかクレイジーですね。（褒め言葉）


_しかも、倍精度がデフォルトです。_


> デフォルトに関しては結構曖昧なようで仕様がよく分からないため一旦削除

## (符号部)

MSX-BASICのコード上の浮動小数点数は全て正の値のみとなっています。

負数を表現するには数値の前に 0xF2 (`-`) を配置する仕様のようです。

> やや無駄感...

## (仮数部)

例えば、仮数部が `0x123456` だとすると、指数部を乗じない状態の数値は `0.123456` と仮定されます。

そして、その数値に **10 の n（指数部）乗** を乗算した値が実数となります。

## (指数部)

MSX-BASIC の BCD 浮動小数点数の指数部はやや特殊です。

当初、私の直感では実数 `123456.0` を表現したい場合、計算式にすると `0.123456 * 10^6` となるので、指数部に `6` を指定した形（`0x06, 0x12, 0x34, 0x56`）になるものと想像しました。

しかし、実数 `123456.0` を表現したい場合の指数部は `0x46` となっていました。

以下、仮数部 `123456` で色々なパターンの実数を求めた時の指数部の内容を示します。

```basic
1 LET A=!1234560
2 LET A=!123456
3 LET A=!123.456
4 LET A=!.123456
5 LET A=!.0123456
```

上記のBASICコードを打ち込んだ時の中間言語形式をダンプして BCD 浮動小数点のバイトコードを調べた結果を下表に示します。

|実数|計算式（参考）|バイトコード|
|:-|:-:|:-|
|`!1234560`|0.123456 × 10<sup>7</sup>|`0x47, 0x12, 0x34, 0x56`|
|`!123456`|0.123456 × 10<sup>6</sup>|`0x46, 0x12, 0x34, 0x56`|
|`!123.456`|0.123456 × 10<sup>3</sup>|`0x43, 0x12, 0x34, 0x56`|
|`!0.123456`|0.123456 × 10<sup>0</sup>|`0x40, 0x12, 0x34, 0x56`|
|`!0.0123456`|0.123456 × 10<sup>-1</sup>|`0x3F, 0x12, 0x34, 0x56`|

つまり、7 bits の指数部は MSB が ON の時が正数、OFFの時が負数となるようです。

また、指数部が 0 の場合、仮数部にどのような値が設定されても実数が 0 になるという謎仕様にもなっているようです。（多分、ゼロの比較を高速化したかった感じかなと想像）
JetBrains CLion + PlatformIO (macOS)

## 概要

[PlatformIO](https://platformio.org/) を macOS 上で JetBrains の C/C++ 開発用 IDE である [CLion](https://www.jetbrains.com/clion/) から使う方法についてごく簡単に整理してみました。

非商用であれば無償で使えるようになったようなので、ぜひ使ってみてください！

- [CLion Is Now Free for Non-Commercial Use - JETBRAINS Blog](https://blog.jetbrains.com/clion/2025/05/clion-is-now-free-for-non-commercial-use/)

以下の記事を参考にさせて頂きました。インストール後の使い方についてはこちらのほうが詳しく記述されていますのでこちらも合わせてご参照ください。

- [CLionでPlatformIOを使って、M5StackのHello Worldを作るまで](https://qiita.com/kaluna/items/da597447958176797316)

## インストール

参考) [Installation - PlatformIO](https://docs.platformio.org/en/latest/core/installation/index.html)

### Python 3 のインストール

PlatformIO の実行には Python 3 が必要です。[Homebrew](https://brew.sh/) でインストールする場合は以下のコマンドでインストールします。

```shell
brew install python
```

### PlatformIO Core のインストール

PlatformIO の CLI 版である [PlatformIO Core](https://docs.platformio.org/en/stable/core/index.html) をインストールします。こちらも Homebrew でインストールできるようですが、システムを汚したくない場合は推奨手順に従って[インストーラースクリプト](https://docs.platformio.org/en/stable/core/installation/methods/installer-script.html)を使います。これにより、ホームディレクトリの ~/.platformio/ 配下にインストールされます。

```shell
curl -fsSL -o get-platformio.py https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py
python3 get-platformio.py
```

次に、インストールしたシェルコマンドを使うためパスを設定します。[手順](https://docs.platformio.org/en/stable/core/installation/shell-commands.html)に従って、~/.platformio/penv/bin にインストールされたコマンドに ~/.local/bin からリンクします。

```shell
ln -s ~/.platformio/penv/bin/platformio ~/.local/bin/platformio
ln -s ~/.platformio/penv/bin/pio ~/.local/bin/pio
ln -s ~/.platformio/penv/bin/piodebuggdb ~/.local/bin/piodebuggdb
```

その上で、~/.local/bin にパスを通します。(Bash なら ~/.bash_profile など)

```bash
export PATH="${HOME}/.local/bin:${PATH}"
```

### PlatformIO for CLion プラグインのインストール

CLion に [PlatformIO for CLion](https://plugins.jetbrains.com/plugin/13922-platformio-for-clion) プラグインをインストールします。

![PlatformIO for CLion](https://hirose-public.s3-ap-northeast-1.amazonaws.com/qiita/2023/03/19/33b17011-39e3-40fe-a90b-d12b24b639cd.png)

## プロジェクトの作成

### プロジェクトを新規作成

メニューの File > New > Project... から、新規プロジェクトを作成します。ターゲットに「PlatformIO」、Board に開発対象のデバイスを選択します。

![New Project](https://hirose-public.s3-ap-northeast-1.amazonaws.com/qiita/2023/03/19/7273c06a-7a42-47c3-a8a0-d846682b54d0.png)

### 既存のプロジェクトを開く

メニューの Open > Open... から、既存の PlatformIO プロジェクトのディレクトリを選択します。

## PlatformIO プロジェクト設定

PlatformIO プロジェクトに対する各種設定は、CLion から離れて別途 PlatformIO のホーム画面からおこないます。

CLI から `platformio home` コマンドを実行するか、CLIon メニューの Tools > PlatformIO > Home から PlatformIO のホーム画面を表示します。設定用の Web サーバーがローカル PC 上で動作し、ブラウザを UI としてアクセスします。プロジェクトの設定に変更を加えた場合は、CLion のメニューから Tool > PlatformIO > Reload PlatformIO Project を実行して設定を反映します。

## 基本操作

### ファームウェアのビルド・書き込み

ウインドウ右上にある以下の部分から、Environment を選択して各アイコンをクリックします。アイコンは左から「Build」「Run」「Debug」となっています。

![Build](https://hirose-public.s3-ap-northeast-1.amazonaws.com/qiita/2025/05/08/365d0b7f-35e1-44d6-b208-b068ad38e629.png)

### その他の操作

Tool Window の PlatformIO から各種操作をおこなうことができます。

![Build](https://hirose-public.s3-ap-northeast-1.amazonaws.com/qiita/2025/05/08/6ee95409-fe9e-4fc7-944d-d9d379581121.png)
SOC

# セキュリティオペレーションセンター(SOC, ソック)
システムやネットワークなどの```監視対象に発生する何らかのセキュリティイベントを検知した際に、検知した内容を一定の基準に従って取捨選択し、通知先に知らせる一連の仕組み```であり、営みです。

CSIRTがセキュリティ事故の対応を行う一連の営みであるのに対して、SOCはあくまでも```監視と通知が主な営み```

# 使用する機器や情報
### IDS
セキュリティイベントを検知するために必要

https://qiita.com/masatom86650860/items/aa569b05fcdb5ea2a6d7

### SIEM
各種のログを収集・管理して脅威の分析に役立てる

https://qiita.com/masatom86650860/items/e01bdef7da4772151995

他にもファイアウォールをはじめとするネットワーク機器やセキュティ機器、サーバー類が出力する各種ログが必要になることもあります。

# 出典
https://www.sbcr.jp/product/4797388800/
GPT4にChatGPT3.5TurboのAPIで動作するDiscordのチャットボット書いてって依頼した

ちゃんと動くソースコードが20回くらいのやり取りで出たので、記念に残す。

↓うらたん代理bot
https://discord.com/api/oauth2/authorize?client_id=1086206556393193523&permissions=3072&scope=bot

※環境について
更新しました。Discord.pyの2.2以降のバージョンで動きます。

注文内容のざっくりとしたプロンプト

「全量メッセージを受け取って」
「うらたんが呼ばれたと思ったら〇、呼ばれなかったら×で返答して」…A
　〇だったら　→　「猫人族の男性としてロールして返答して」…B
「summary文字列に会話記録の要約を残して」…C

これで設計。

Aについて、要約記録であるsummary文字列と共に最新のメッセージを放り込む挙動をするので、
メッセージ単体ではうらたんが呼ばれてなくても、会話中であることが認められるなら返答してくる。
※ただしAの判定器のプロンプトが悪いのかバラつきが激しい。

Bについては、多分既存のbotでも似たような運用をしてると思う。要約記録と最新の会話を投げてる。
ファインチューニングが出来ない代わりに料金がバリ安なので安心してローンチ出来るのはありがたい…

Cは、単に会話ログ取るだけだと味気ないなと思い、
トークン消費量考えるとこうやってログ取った方が得じゃねーかなと思って実装。
会話するたび要約する。たまにログ見ると「要約できませんでした」って言って全部消えてるのも楽しい。

どうせ著作権もGPT4が持ってるに等しいような開発の仕方してたので、botの内容も公開していきます。


https://drive.google.com/file/d/1dulVAmIB0WtZOmVkltyi5DY1KzfY5RLv/view
Java_RPGのアイテム一覧を再現2

paizaラーニングforTEAM Java入門編
レッスン9の#06

```Java:9-#06
// RPGのアイテム一覧を再現
import java.util.*;

public class Main {
    public static void main(String[] args) {
        // 画像用ハッシュ
        HashMap<String, String> itemImages  = new HashMap<String, String>();
        itemImages.put("剣", "http://paiza.jp/learning/images/sword.png");
        itemImages.put("盾", "http://paiza.jp/learning/images/shield.png");
        itemImages.put("回復薬", "http://paiza.jp/learning/images/potion.png");
        itemImages.put("クリスタル", "http://paiza.jp/learning/images/crystal.png");

        // アイテムの並び順配列
        String[] itemOrders = {"クリスタル", "盾", "回復薬", "剣", "回復薬", "回復薬"};
        
        // アイテム名を取り出す
        for (String itemName : itemOrders) {
            // 画像ファイル名を取り出す
            // 出力をhtmlにして画像ファイルを表示させる
            // イメージタグを使う
            // ソースに画像ファイル名を指定
            System.out.println("<img src = '" + itemImages.get(itemName) + "'>");
            // アイテム名をbrタグで改行
            System.out.println(itemName + "<br>");
        }
    }
}
```
EagerロードとLazyロード

### はじめに
PHP及びLaravelの勉強中。
参考URL : https://readouble.com/laravel/9.x/ja/eloquent-relationships.html
### 設定
- Categoryモデル（カテゴリーモデル）とItemモデル（商品モデル）が１対多の関係性で存在
  - Categoryモデル側 -> hasMany
  - Itemモデル側 -> belongsTo
- Itemモデル（商品モデル）とStockモデル（在庫モデル）が１対１の関係性で存在
  - Itemモデル側 -> hasOne
  - Stockモデル側 -> belongsTo
### 本文
通常、リレーション先へのプロパティアクセスはLazyロードされる。(N+1問題)
上記の問題を解決するのがEagerロード
->　使用すればアプリケーションのパフォーマンスが向上

例 : 全ての商品のカテゴリー名を取得したい時
```
// ⑴ Lazyロード
$items = Item::query()->get();
foreach($items as $item){
     echo $item->category->name;
 }
```
```
// ⑵ Eagerロード
$items = Item::query()->with('category')->get();
foreach($items as $item){
     echo $item->category->name;
 }
```
出力結果は同じだが、⑴はクエリが商品の数だけ発行される（100個商品あれば100回）。
⑵ではクエリの発行回数は2回だけ。（すべての商品取得とすべての商品のカテゴリ取得）
#### 様々なパターン
複数のリレーション先の取得
```
$items = Item::query()->with(['category', 'stock'])->get();
```
リレーション先のリレーション先の取得
```
$categories = Category::query()->with('items.stock')->get();
```
特定のカラムのみの取得（関連する外部キー、idは必ず必要）
```
$items = Item::query()->with('category:id,name')->get();
$items = Item::query()->with('stock:item_id,stock')->get();
```
クエリ条件の追加
```
$items = Item::query()->with(['stock' => function ($query) {
       $query->where('stock', '>', 300);
 }])->get();
```
HTMLの基礎を学び直す

サイトが反応しないために<>で閉じてない箇所があり見辛くなっています。すみません。


HTMLの基本構文
```html
<p>pは段落って意味。paragraph</p>
```
<>で始まり、</>で終わる。

基本構造

HTML文書
ーDOCTYPE宣言〜HTMLの種類を宣言ー
ーhtml要素〜HTML文章の最上位要素ー↓
    head要素〜文書タイトル、関連ファイル、文字コードなど。Webページに表示されない部分
    body要素〜本文。Webページに表示される部分

↓例で表すと

```html
<!DOCTYPE html>
<html lang="ja"> <!-- 日本語でHTML書くよ〜 -->
 <head>
  <meta charset="utf-8">　　<!-- 文字化け防ぎ。これで日本語OK。このmetaは終了タグはない -->
  <title>これが基本！</title>
 </head>
 <body>
  <h1>でっかい見出し</h1>
  <p>文章です</p>
 </body>
<html>
```


基礎要素
<p>　ー文章
<div>　ー意味を持たない凡用ブロック
<section>　ーセクションをグループ化。意味のあるグループをまとめる。メインの中が多い
<header>　ーセクションのヘッダーを示す
<footer>　ーセクションのフッターを示す
<main>　ー文章のメインコンテンツ
<article>　ー記事コンテンツ。コメント欄とかも。メインの中が多い
<aside>　ー余談場所。サイドバーとか広告表示
<nav> ーナビゲーション。リストのとこに。ヘッダーの中
<span> ー意味を持たない要素。文章の特定の部分をCSSで装飾したい時に使う。divはブロック。spanはインライン

<h1,<h2,<h3　ー見出し。1~6まであり、数字１が一番大きい。（h1は一つのページに一つまでが好ましい）
<br　ー　改行(閉じいらない)
<hr　ー　区切り(閉じいらない)
<strong　ー太字になるがそのためには使わない。重要だぞってところにつける
<small　ー小さい字になるがそのためには使わない。よく著作権表示に使われる。(&copy;をつけると©︎マークに)

<ul　ー　・とかを使った羅列リスト(<li></li>で開け閉じ)
<ol　ー　１、２、３といった順序ありのリスト(<li></li>で開け閉じ)
↓
リストにはさらに入れ子というやり方があり
```html
<ul>
  <li>アルバム</li>
    <li>裏アルバム
    <ol>
      <li>粉雪</li>
      <li>キセキ</li>
    </ol>
    </li>
</ul>
```
↓
ウェブ上では
・アルバム
・裏アルバム
　　　　　　　　1.粉雪
　　　　　　　　2.キセキ
てなる
挟み挟まれちょっとややこしい。ちなみに裏アルバムの部分を<li>裏アルバム</li>にするのはだめらしい。

<dl ー説明の作り始め。
<dt　ー説明の用語
<dd　ー説明の定義

```html
<dl>
<dt>粉雪</dt>
<dd>平成のベストヒット曲。ドラマ１リットルの涙の主題歌</dd>
<dt>キセキ</dt>
<dd>ドラマルーキーズの主題歌</dd>
</dl>
```
↓
ウェブ上だと
粉雪
　　　　平成のベストヒット曲。ドラマ１リットルの涙の主題歌
キセキ
　　　　ドラマルーキーズの主題歌


テーブル
<table ーテーブル作成
<caption　ーテーブルのタイトル
<tr　ーテーブルの行作成。横方向
<td　ーテーブルのデータが入るセルを作成
<th　ーテーブルのヘッダーを作成。tdと同じ位置

<thead　ーテーブルのヘッダー行を定義
<tbody　ーテーブルのボディ部分を定義
<tfoot　ーテーブルのフッター行を定義
↓
CSSでスタイルしやすくなる

<colspan　ー横にセルを結合
<rowspan　ー縦にセルを結合
↓
```python
<table>
    <caption>横方向</caption>
        <tr>
            <th colspan="3">３つ分結合</th>
        </tr>
        <tr>
            <td>１セル目</td>
            <td>２セル目</td>
            <td>３セル目</td>
        </tr>
<table>
    <caption>縦方向</caption>
        <tr>
            <td rowspan="3">３つ分結合</td>
            <td>１セル目</td>
        <tr>
        <tr>
            <td>２セル目</td>
        <tr>
        <tr>
            <td>3セル目</td>
        <tr>
```


属性
<a href="~~~.com" Qiita　　　→外部リンク
<a hred="~~~.com" target="_blank" rel="noopener"　→クリックすると新しいタブでリンクを開く。
<a href="~~.html" →内部リンクへ
<a href="#page"　　→ページ内のid="page"がある場所へ

<img src="~~.jpg"　width="200" height="150" alt="何の画像かわかる"　　　　→画像を表示できる。この例は相対パス（ファイルが同じフォルダ内に場所にある）。だが絶対パスの場合は画像が載っているURLを貼り付ける
<link rel="stylesheet" href="~~.css"　　　　→CSSを持ってくる



フォーム
<form action="#" method="POST"
↓
actionーどこにデータを送信するか
method=HTTPリクエストメソッド(ブラウザからサーバーに対して依頼する処理の種類)の種類を記述↓
GET（サーバからデータを取得したい時。Webページ、画像、RSSフィードなど）とPOST（サーバへデータを送信したい時。ログイン、アンケート、商品注文）が多い。

<input　type="text" ーデータ入力のためのフォームを作る要素。様々な入力フォームを作成可能。(ファイルアップロード、選択肢、チェックボックス、レンジ入力など)

name属性〜サーバー側のプログラムが送られてきたデータの種類が何かわかるようにしてる
placeholder属性〜入力前にうっすら書かれてるアレ
value属性〜ボタンのラベルを作成
↓
```python
<form action="#" method="POST">
    <input type="text" name="username" placeholder="ユーザー名">
    <input type="password" name="password" placeholder="パスワード">
    <input type="submit" value="ログイン">
</form>
```
CSIRT

# CSIRT(シーサート)
```発生したセキュリティ事故に対して、専門的な知見と適切な他者とのインタフェースを持って対応するチーム```です。

# 非常時以外には非常時を減らすための取り組みを行う。
```具体的な予防策・改善策を検討し、実行に移していく```のもCSIRTの役割

# CSIRTは連携することで強みを発揮する
```適切な他者```は、他のCSIRTである可能性もあります。

適切な連携を行うことで、単独のCSIRTでは対処が困難な事象であっても、```対処を行えるようなケースはよくあります```...

```他事業者のCSIRTとの緊密な連携を図り、最新の脆弱性情報・攻撃予兆情報を共有することが必要。```

# FIRST
```世界各国に存在するCSIRTの連携のための枠組み```

# 出典
https://www.sbcr.jp/product/4797388800/
gitの修正や取消のいろいろ

# 【gitの修正や取消のいろいろ】

その都度、なにかあったら追記する方針

## push 取り消し
- `git push`後に間違いに気づくことってありますよね。

### git reset
※ Pull Request 作成後は、`git reset`はやめておく。

- **local の commit,add,ソースコードの変更は残して、pushのみ取り消す**
```
$ git reset --soft HEAD^
```

- local の commit,add,ソースコードの全変更を取り消す。
```
$ git reset --hard HEAD^
```

- ※ 上記のコマンドは極力使わない方が良いが、もし使って間違ってしまったら、`git reflog`を使う。
```
# 操作履歴を見て、戻りたい地点の数字を確認
$ git reflog

# 戻りたい地点の数字を指定する(例は「1」)
$ git reset --hard HEAD@{1}
```

- `git reset`後、修正したものを pushするには「-f」オプションをつけて強制的にpushする必要がある。
  - 以前の commitとコンフリクトエラーになっているので。
```
$ git push -f origin HEAD
```

### git revert
※ Pull Request 作成後は、`git revert`するとよい。

- 変更を取り消すのではなく、打ち消す(不要な履歴が残る)
```
$ git revert HEAD
```

- 上記を実行すると、commmitを打ち消すcommitができるので、再度 pushする。
```
$ git push origin HEAD
```

## commit message　の修正
※ `git push`する前に修正する。

- 「--amend」で上書く
```
$ git commit --amend
```

## add 取り消し

`git add`した変更を、全て一括で取り消す

```
$ git reset .
```

ファイルやディレクトリを指定して、取り消す

```
$ git reset <ファイル>
$ git reset </ディレクトリ/>
```

1番最初の`git add`を取り消す場合

```
$ git rm --cached <ファイル>
$ git rm --cached -r </ディレクトリ/>
```

※ `--cached`を付け忘れると、間違ってまだどこのも保存していないファイル実体を削除してしまうことになる。

## add の変更内容を確認

HEAD からインデックスの差分を確認
`--cached`により、インデックスへの変更状況を確認

```
$ git diff --cached
```

## branch削除

```
$ git push origin :<ブランチ名>
```

## `rebase`を中断

```
$ git rebase --abort
```
自チームでクラウドを対応することになったリーダー/管理職へ（学習方法）

# はじめに
これは、自分のチームでクラウドを対応することになった自身の経験をもとにしています。
最終的にクラウドアーキテクトチームを組織するまでの試行錯誤を共有できればと思います
自分のチーム/組織でクラウドを対応することになったリーダー、管理職の方々への参考に！
なお、本投稿ではIaaSクラウドを基本とし、AWSを前提にしています。

# まずは座学？
技術を学ぶ際に、実際に手を動かすことと座学、どちらが先かというのは悩ましいのですがクラウドではまずは座学が優先かなと思います。
これは、何かミスを犯した際にセキュリティインシデントや予想を超えたコストにつながる可能性があるからです。
（「クラウド　破産」で検索してみると事例が多数出てきます）

個人での学習なら自己責任かもしれませんが、チーム/組織に責任が及ぶ状況では実環境を操作する前にまずは基礎知識は持っておくべきでしょう。ただ、座学と言っても実際の環境を操作しながら学習できるコンテンツが揃っているところがクラウドの素晴らしいところです。

# 座学から資格取得へ、無償教育を活用しよう
クラウドに限らず、実際に手を動かすことが重要なわけですが、AWSではそれを座学としてある程度無償で提供してくれます。「AWS スキルビルダー」は是非活用したいコンテンツです！

https://aws.amazon.com/jp/training/digital/

ここで学習をしつつ、「[AWS Certified Solutions Architect - Associate](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)」の取得をメンバーに目指してもらうのがお勧めです。

# 実環境で腕を磨く！
「[AWS Certified Solutions Architect - Associate](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)」の取得ができたら、是非メンバーには実環境でのシステム構築にトライしてもらいましょう。ここでの試行錯誤がチームのスキルアップに必ずつながると思います。
ただ、単に何か模擬環境作って勉強してみて、というのはあまり効果的ではないと思います。この環境をどのように構築してゆくのか、別の回で書いていきたいと思います。

# スキルアップフォロー＆フロー
「[AWS Certified Solutions Architect - Associate](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)」を取得した後も、是非プロフェッショナル試験や専門試験に向けた学習ができるようリーダー/管理職はチームのモチベーションを高めていく必要があります。組織によっては報奨金などの制度もあると思いますし、ない場合は人事評価に組み入れる、チームKPIとする、などやり方は様々あると思います。
（ただ、受験費用はそれなりに高額なのでここは是非組織的な手当てができるようしておくべきでしょう）

なお、「[AWS Certified Solutions Architect - Associate](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)」を取得した後は、是非メンバーにはAWSプロフェッショナルの証明となる「[AWS Certified Solutions Architect - Professional](https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/)」を目指して欲しいと思います。
ただ、試験内容的にも実際にAWSを対応していく上で身につけておくスキル的にも下記の流れをお勧めします。

[AWS Certified Solutions Architect - Associate](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)
↓
**[AWS Certified Advanced Networking - Specialty](https://aws.amazon.com/jp/certification/certified-advanced-networking-specialty/)**
（ネットワークアーキテクチャの設計と維持に関する専門知識を認定）
↓
**[AWS Certified Security - Specialty](https://aws.amazon.com/jp/certification/certified-security-specialty/)**
（AWS クラウドにおけるデータやワークロードのセキュリティ確保に関する専門知識を認定）
↓
[AWS Certified Solutions Architect - Professional](https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/)

AWS（他のクラウドも同様）では、実はネットワークスキルも重要なんです。クラウド内のネットワーク設計やどのようにクラウド外と通信を行うのかなど、業務でクラウドを扱う上でネットワーク考慮は不可欠です。
また、セキュリティは業務では必須考慮ですね。そして、これらの要素が、[AWS Certified Solutions Architect - Professional](https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/)でも求められますので、段階を踏む意味でも、実務の面でも決して回り道ではありません。

その際には、下記のようなより深い機能説明も用意されていますので、こちらも是非活用しましょう。

https://aws.amazon.com/jp/events/aws-event-resource/archive/?cards.sort-by=item.additionalFields.SortDate&cards.sort-order=desc&awsf.tech-category=*all

# 最後に
様々な学習コンテンツが揃っており、それらを実際の操作を通じて学ぶことができるのは非常にありがたいです。
ただ、やはり実際にゼロから自分たちで環境を作って学ぶことがスキルアップには不可欠です。ただ、それ以上にチーム/組織で対応する以上はセキュリティインシデントや「事故」を起こさないことも重要です。
それを見極める上で、リーダー/管理職はメンバーの力量を計るだけでなく、共に学習をしていく姿勢が大事だと思います。
Zoxideの威力 もうcdはいらない

# Zoxideコマンド

これは、cdの完全上位互換のコマンドで
個人的にはこれは入れないと仕事できないレベル。

https://github.com/ajeetdsouza/zoxide

Macなら、いつもどおり、

```
brew install zoxide
```

でインストールできる。
基本的には、公式にインストール手順はすべて書いてある。

https://github.com/ajeetdsouza/zoxide

あとは、シェルごとにパスを通す必要がある。
zshなら、.zshrcに

```
eval "$(zoxide init zsh)"
```

を追記する。

公式にfzfのインストールも推奨しているので、
このタイミングで入れるのもあり。

```
brew install fzf
```

これでziコマンドが使えるようになる。

ziコマンドは、死ぬほど便利で、
zコマンドとかで行ったディレクトリパスとかを検索して、
移動できる。

階層が深いディレクトリの行き来もこれがあれば、
一瞬でできる。
Java_HashMapをループで処理する

paizaラーニングforTEAM Java入門編
レッスン9の#04

```Java:9-#04
// HashMapをループで処理する
import java.util.HashMap;
import java.util.Map.Entry; // 拡張for文でエントリーを取り出し処理するため

public class Main {
    public static void main(String[] args) {
        HashMap<String, String> enemyMap = new HashMap<String, String>();
        enemyMap.put("ザコ", "スライム");
        enemyMap.put("中ボス", "ドラゴン");
        enemyMap.put("ラスボス", "魔王");
        
        // 拡張for文でエントリーを取り出し処理する
        // 拡張for文では前半に要素を取り出す変数を指定する(:の前)
        // 後半に対象となるデータの集まりを指定する(:の後)
        // キーが文字列で値も文字列であるエントリーを格納する変数entryを用意
        // entrySetメソッドを使用してエントリーの集まりを取り出す
        // Entry<String, String>はエントリーを表すデータ型
        for(Entry<String, String> entry : enemyMap.entrySet()){
            System.out.print(entry.getKey() + ", "); // getKeyメソッドでエントリーのキーだけを取得して表示
            System.out.println(entry.getValue()); // getValueメソッドでエントリーの値だけを取得して表示
        }
    }
}
```
Bcryptハッシュ

spring securityを学習している中で、使用されているハッシュ化アルゴリズム「Bcrypt」について調べたのでメモ

## Bcryptとは
パスワードのハッシュ化手法のひとつ。
「暗号化」とは異なります。暗号化の場合は「復号」することが可能ですが、ハッシュ化は「復号」はできません。


## BCryptを使用したハッシュ値の例（passwordをハッシュ化）
<font color="Red">$2a</font><font color="Blue">$08</font><font color="Red">$isRjA7vCYFZ5GCNGwGlQ5u</font><font color="Blue">5aP65dNojiQ6/pMeLajNAqlHphGue6C</font>

- 「$2a」はハッシュアルゴリズムのバージョン  
- 「$08」はストレッチング回数
- その後の22文字はハッシュ化に使用する文字列です。
Bcryptではこの文字列をランダムに生成しています。（ソルトという）  
毎回違うソルトが使用されるので元のpasswordを推測することが非常に困難となる
- 最後の31文字が結果のハッシュ値です

## 検証（認証）
- ハッシュ値からソルトを取得し、同じソルトを使用して入力されたpasswordをハッシュ化
- ハッシュ化したpasswordと元のハッシュ値を比較し、一致するかどうかで検証する

## Bcryptがなぜ安全性が高いのか
理由１：ソルトであること（ハッシュ化に使用する文字列がランダムであること）。
理由２：ストレッチング回数を任意の回数を指定することができること

## どんな攻撃に対する対策なのか
- 「レインボーテーブル攻撃」
- 「ブルートフォース攻撃」
に対する対策といえます。

## レインボーテーブル攻撃とは
あらかじめ、ハッシュ化前のパスワードとハッシュ化したパスワードの一覧（テーブル）を用意しておき、漏洩したハッシュ化されたパスワードから元のパスワードを解読する攻撃手法です。

仮にパスワードのハッシュ化が固定値を使用したハッシュ化の場合、レインボーテーブルから解読されてしまう可能性が高くなります。

ハッシュ化に使用する文字列がランダム（ソルト）のため、あらかじめハッシュ化した一覧を用意することが困難となります。

## ブルートフォース攻撃
総当たり攻撃です。ハッシュ化したパスワードが漏洩してしまうと、使用されている「ソルト」も判明してしまうため、単純にソルトを使用したハッシュ化のみの場合、総当たり攻撃によってパスワードを解読されてしまう可能性が高くなります。（解読するのに要する時間が短くてすむ）

ストレッチング回数はハッシュ化を実施する回数です。
2のn乗繰り返されます。上記例では８を指定しているので、２５６回ハッシュ化を繰り返しています。
推奨は１０（1024）以上とされているようです。

ストレッチング回数は多い方がパスワード解読に要する時間が多くなります。
これにより、事実上パスワード解読が不可となる時間がかかることとなります。
※多い方が安全性は高くなりますが、その分サーバへの負荷は高くなるので、充分な考慮が必要です。

上記理由により、Bcryptは安全性が高いハッシュ化手法なんだと思います。

## 注意
ここでいう「ブルートフォース攻撃」とは、漏洩したハッシュ化されたパスワードから、ハッシュ化前のパスワードを解読する際のことです。
ログイン認証に対して直接ログインを可能かを実施する「ブルートフォース攻撃」とは異なります。
ログイン認証に対する「ブルートフォース攻撃」への有効な対策は規定回数パスワードを誤った場合は一定時間ロックする等となります。

また、Bcryptはハッシュ化したパスワードが漏洩してしまった場合に対する対策です。
短いパスワードや、予測可能なパスワードは避け、記号やアルファベット（大文字、小文字）、数字などを組みあせた複雑なパスワードを設定することが大切です。
ざっくりと仮想化をまとめてみた

# 【ざっくり仮想化】

## 仮想化

仮想化は、CPUやメモリ、ストレージ等のハードウェアリソースをユーザーから隠蔽し、代わりとなる論理的なリソースを提供する技術

- 仮想化される個々のハードウェアリソース
    - 仮想CPU
    - 仮想メモリ
    - 仮想ネットワーク ...etc

1台のコンピュータマシンを仮想化した場合、それらを仮想マシン(VM: VirtualMachine) 等と呼ぶ。

### 仮想マシンの活用用途

- 1台の物理マシン上で、複数の仮想マシンを動かすことができる
    - ユーザーからは物理マシンのように見え、表面的な違いはない(透過的性質)
- 物理マシンのハードウェアリソースが許す限り、何台でも仮想マシンを作成することが可能
    - 仮想マシンは複製や移行が容易なため、システムの柔軟性と拡張性を向上させる
- 複数の物理マシンで構成していたシステムを仮想マシンに置き換えることで、物理マシンを集約できる

## 仮想化ソフトウェアの実装方式

一般的な3つ

- ホストOS型
- ハイパーバイザー型（ベアメタル型）
- コンテナ型

### ホストOS型

ホストOS型は、物理マシンにOSをインストールし、そのOS上で仮想化ソフトウェアと仮想マシンを動かす。

- 物理マシン上で動作するOSをホストOS
- 仮想マシン上で動作するOSをゲストOS

※ ゲストOSとホストOSを使うので重くなりがち

### ハイパーバイザー型(ベアメタル型)

ハイパーバイザー型（ベアメタル型）は、ホストOSを必要としない仮想化方式。

ハイパーバイザーと呼ばれるソフトウェアを物理マシンに直接インストールし、その上で仮想化ソフトウェアと仮想マシンを動かす。

※ ホストOSを介さないので高速でリソース効率が良いのでパフォーマンスが高い。仮想環境の構築に限られる。

### コンテナ型

コンテナ型は、近年急速に普及した仮想化方式。

ホストOS型と同じように、物理マシンにインストールされているOS上でコンテナエンジンを動かし、ゲストOSを使わずにコンテナイメージを作成し、仮想環境（コンテナ）を動かす。

※ コンテナエンジンという、仮想化ソフトウェア

ホストOS型との大きな違いとして、コンテナはコンテナ間でホストOSを共有しており、仮想環境（コンテナ）にゲストOSや仮想ハードウェアが含まれない。

1つのOSで動くため高速。コンテナイメージのコピーが容易なので手軽にコンテナを動かすことができる。コンテナのデプロイ時はOSの再起動が不要なのでデプロイも高速である。

### 簡単まとめ

**ホストOS型**
- 物理マシンの上にホストOS、ホストOSの上に仮想化ソフトウェア、仮想化ソフトウェアの上にゲストOS

**ハイパーバイザー型（ベアメタル型）**
- 物理マシンの上にハイパーバイザー、ハイパーバイザーの上にゲストOS

※ ホストOS型のホストOSと仮想化ソフトウェアは、ハイパーバイザー型のハイパーバイザー。

**コンテナ型**
- 物理マシンの上にホストOS、ホストOSの上にコンテナエンジン、コンテナエンジンの上にコンテナイメージ

※ ホストOS型の仮想化ソフトウェアは、コンテナ型のコンテナエンジン。ホストOS型のゲストOSは、コンテナ型のコンテナイメージ。
不正のトライアングル

# 動機
```不正を行いたいと考える原因```

# 機会
```行動を起こせるチャンス```

# 正当化
```これは不正ではないと思う理由```

この三要件が揃った時、不正が起こしやすくなる。

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8
デジタル署名

# デジタル署名（電子署名）の役割と仕組み
### 1
送信者は、```送信するメッセージ（平文）からハッシュ関数を使ってメッセージダイジェストを作成```する。

### 2
さらに```メッセージダイジェストを送信者の秘密鍵（=署名鍵)で暗号化```したものをメッセージと一緒に送信する。

### ３
送信されてきた```デジタル署名を送信者の公開鍵で（=検証鍵)で複合```し、メッセージダイジェストを得る。

### ４
また受信者は、```送信されてきたメッセージから、送信者と同じハッシュ関数を使ってメッセージダイジェストを作成```する。

### 5
```送信者が作成したメッセージダイジェストと受信者が複合したメッセージダイジェストを照合```し、一致すれば送られてきたメッセージは改竄されていないことが証明される

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8

# 関連記事　（図があります）
https://www.jipdec.or.jp/project/research/why-e-signature/PKI-crypto-mechanism.html

送りたい内容を使ってハッシュ化する

# 感想
平文でメッセージダイジェストを作成、それを送信者の署名鍵(秘密鍵）で暗号化
受信者に送られて
送信者の検証鍵（公開鍵)で複合化、送られてきた平文を同じハッシュ関数を使ってメッセージダイジェストを作成
二つのメッセージダイジェストを比較して、改竄されているか確かめるのか。
Java_HashMapの基本操作

paizaラーニングforTEAM Java入門編
レッスン9の#03

```Java:9-#03
// HashMapの基本操作
import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        HashMap<String, String> enemyMap = new HashMap<String, String>();
        enemyMap.put("ザコ", "スライム");
        enemyMap.put("中ボス", "ドラゴン");
        enemyMap.put("ラスボス", "魔王");
        
        // System.out.println(enemyMap.get("中ボス"));
        
        // HashMapのキーを変数で指定
        enemyMap.remove("中ボス"); // エントリーを削除
        String level = "中ボス";
        System.out.println(enemyMap.get(level));
        
        // level = "未定義";
        // System.out.println(enemyMap.get(level));
        System.out.println(enemyMap.size()); // エントリー数を調べる
    }
}
```
統計検定２級:歪度・尖度について

# 歪度・尖度について



#### 歪度
・歪度はヒストグラムにしたときにどれだけ左右に偏っているのかを表すもの

#### 尖度
・尖度はヒストグラムにしたときに正規分布に対してどれだけ先が潰れているのか、尖っているのかを表すもの



＊正規分布（ガウス分布）とは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2591484/648dcbd2-76bf-3fcc-d029-b73e4399037e.png)
上記のような確率分布で、左右対称である。

正規分布には以下のような特徴がある。
1,中央値、最頻値、平均値が一致
2,平均値を中心にして左右対称。
3,𝑥軸が漸近線である。
4,分散（標準偏差）が小さくなると、山は高くなり、とんがった形になる。それに対して、分散（標準偏差）が大きくなると、曲線の山は低くなり、左右に広がって平らになる。
> 上記参考サイト:https://ai-trend.jp/basic-study/normal-distribution/normal-distribution/


### 歪度・尖度ともにデータがどれだけ偏っているのかを表す用語

**歪度は正規分布を基準に左右**
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f323539313438342f36343864636264322d373662662d336663632d643032392d6237336534333939303337652e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2591484/09d5ac47-122c-3ef6-cfb3-62f81b78bc9f.png)

歪度がプラスであれば、右、歪度がマイナスであれば、左になる。

**尖度は正規分布を基準に上下**

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f323539313438342f36343864636264322d373662662d336663632d643032392d6237336534333939303337652e706e67 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2591484/6311f95b-b888-9318-0cca-b421981780ca.png)


尖度がプラスであれば上に尖った様な図、マイナスであれば潰れたような図になる。



## あとがき
統計検定２級の試験では、グラフがあり、平均値と中央値の値が与えられ、分布と歪度の特徴などを聞かれる問題が出題される。
その問題の過去問をといた際に知識が全くなかったため解けなかったので、知識をまとめと対策を含めこの記事を執筆しました。
少しでも、参考になれば幸いです。
AWS-SDKでアシュームロールをしてS3にアクセスする方法

## 背景
Javaのバッチ処理でAWSのS3の操作を作成することになったのだが
バッチPGはAWSの外部（Dockerコンテナ上）で実行されるので認証が必要。
また認証には対象バケットにアクセス可能なIAMユーザのアクセスキーではなくアクセス用のIAMロールがあり、それに対してAssumeRole可能なIAMユーザのアクセスキーが発行される。

ということで、以下のような流れで認証を行う。
①IAMユーザで基本認証
②①からアクセス用のロールにAssumeRoleして一時認証用のセッションを生成
③②のセッションからS3にアクセス


## PG構成
+ Java
+ AWS SDK for Java V2


## ソース
### gradle設定
lombokは無くてもいいけど入れておく。
とりあえずAssumeRoleとS3アクセスが出来る最小構成。
```build.gradle
dependencies {
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	implementation platform('software.amazon.awssdk:bom:2.20.24')
	implementation 'software.amazon.awssdk:s3'
	implementation 'software.amazon.awssdk:sts'
}
```

### PGソース
S3Client取得
検証用なのでキー等は定数で直書き。実装時はコンフィグファイルで設定するよ！
```java
private S3Client getS3Client() {
  // 踏み台IAMの認証キー
  final String ACCESS_KEY_ID = "アクセスキー値";
  final String SECRET_KEY = "シークレットキー値";
  // アシュームロール
  final String ROLE_ARN = "arn:aws:iam::1234567890:role/hoge-S3OptimizationRole";
  final String ROLE_SESSION_NAME = "hoge_session";  // 適当なセッション名

  // 踏み台IAMの認証
  AwsCredentials bastionCredentials = AwsBasicCredentials.create(ACCESS_KEY_ID, SECRET_KEY);

  // S3アクセス用のロールにアシュームロール
  StsClient sts = StsClient.builder()
    .credentialsProvider(StaticCredentialsProvider.create(bastionCredentials))
    .build();
  AssumeRoleRequest asmRoleRequest = AssumeRoleRequest.builder()
    .roleArn(ROLE_ARN)
    .roleSessionName(ROLE_SESSION_NAME)
    .build();
    
  // アシュームロールしたセッションでS3Clientを生成
  StsAssumeRoleCredentialsProvider provider = StsAssumeRoleCredentialsProvider.builder()
    .stsClient(sts)
    .refreshRequest(asmRoleRequest)
    .build();
  S3Client s3Client = S3Client.builder()
    .credentialsProvider(provider)
    .build();

  return s3Client;
}
```

バケット内のファイル一覧をコンソール出力
```java
public void printFileList() {
  final String BUCKET_NAME = "hogebkt";

  var s3Client = getS3Client();

  // バケット内のファイル一覧取得
  var lsRequest = ListObjectsRequest.builder()
    .bucket(BUCKET_NAME)
    .build();
  ListObjectsResponse objList = s3Client.listObjects(lsRequest);

  // 結果表示
  objList.contents().forEach(obj -> {
    System.out.println("key : ".concat(obj.key()));
  });
}
```

以上。

なかなかサンプルソースが見つからず公式ドキュメント読みながら作成したのでいろいろ拙い部分がありそうだけど、ひとまずアクセス検証は完了。

あとは上記の方法だと、S3Clientを生成するたびに一時認証セッションが発行されるので連続して処理を行うときはS3Clientを使いまわした方がよさそう。
ただし一時認証のセッション生存期間はデフォルトだと1時間らしいので処理に合わせて対応が必要。
[Delphi][FMX] ScreenScale 取得方法４つ

# FireMonkey の解像度の概念
FireMonkey は自分でコントロールを描画するためデバイスの物理的な解像度ではなく、仮想解像度を使って描画を管理しています。
また Windows においては Form の大きさも DP 単位で管理されていて、やはり物理的な解像度と切り離されています。

ということで、全て物理解像度とは別で管理されているため、実際のピクセルベースの大きさなどが知りたいときに ScreenScale が必要になります。
例えば、Bitmap は Pixel で幅や高さが指定されています。
Bitmap の物理解像度⇔仮想解像度間の変換は ScreenScale が必要です。

FireMonkey には ScreenScale を取得する方法がいくつかあるので、それを紹介します。

# FireMonkey ScreenScale 取得方法

## 1.IFMXScreenService

最初は [IFMXScreenService](https://docwiki.embarcadero.com/Libraries/ja/FMX.Platform.IFMXScreenService) による方法です。
これは、どんな場面でも使えるものの数行書かないといけないのでちょっと面倒です。

```pascal:IFMXScreenScale
// IFMXScreenService は FMX.Platform unit に宣言されている
var S: IFMXScreenService;
if
  TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, S)
then
  var Scale := S.GetScreenScale; // GetScreenScale で取得できる
```

IFMXScreenService を TPlatformServices から取り出して [GetScreenScale](https://docwiki.embarcadero.com/Libraries/ja/FMX.Platform.IFMXScreenService.GetScreenScale) を使って ScreenScale を取り出します。

## 2.TControl.Scene

[TControl](https://docwiki.embarcadero.com/Libraries/ja/FMX.Controls.TControl) から派生した Control（例えば TButton や TEdit など）があれば、簡単に取得できます。

```pascal:TControl.Scene
var Scale := Button1.Scene.GetSceneScale;
```

TControl の [Scene プロパティ](https://docwiki.embarcadero.com/Libraries/Sydney/ja/FMX.Controls.TControl.Scene)の GetSceneScale で取得できます。

:::note warn
IScene から取る方法は GetScreenScale ではなく Get**Scene**Scale です。
:::

## 3.IScene

TControl.Scene プロパティの実体は [TCustomForm](https://docwiki.embarcadero.com/Libraries/ja/FMX.Forms.TCustomForm) です。
ですので Form を IScene にキャストすると Control と同じように GetSceneScale を使って取り出せます。

```pascal:ISccene
var Scale := (Form1 as IScene).GetSceneScale;
```

## 4.TDisplay.Scale

[TDisplay.Scale プロパティ](https://docwiki.embarcadero.com/Libraries/ja/FMX.Types.TDisplay.Scale)を使うとディスプレイ毎の Scale を取り出せます。
TDisplay の取得方法はいくつかありますが、ここでは [Screen.DisplayFromForm](https://docwiki.embarcadero.com/Libraries/Alexandria/ja/FMX.Forms.TScreen.DisplayFromForm) を使いました。
これは引数で指定した Form が表示されている Display を返すメソッドです。

```pascal:TDisplay
var Scale := Screen.DisplayFromForm(Form1).Scale
```

# まとめ
一番簡単なのは TControl.Scene.GetSceneScale を使う方法です。
つぎに簡単なのは TForm を IScene として使う方法です。

Display 毎の Scale が必要な場合は Screen から Display を取り出して使います（[Screen.Displays プロパティ](https://docwiki.embarcadero.com/Libraries/ja/FMX.Forms.TScreen.Displays)を使えば任意の Display を取り出せます）。

IFMXScreenService は正統な方法だと思いますが、他の３つの方法があれば、これを使う機会はあまり無さそうです。
NestJS+GraphQLでISO8601DateTimeを使う


[Apollo Router](https://www.apollographql.com/docs/router/)を使う場合、一致する型は完全に揃える必要がある(コメントまで含めて)


```src/iso8601-date-time.scalar.ts
import { Scalar, CustomScalar } from '@nestjs/graphql';
import { Kind, ValueNode } from 'graphql';

@Scalar('ISO8601DateTime')
export class ISO8601DateTime implements CustomScalar<string, Date> {
  description = 'An ISO 8601-encoded datetime';

  parseValue(value: string): Date {
    return new Date(value); // Value from the client input variables
  }

  serialize(value: Date): string {
    return value.toISOString(); // Value sent to the client
  }

  parseLiteral(ast: ValueNode): Date | null {
    if (ast.kind === Kind.STRING) {
      return new Date(ast.value);
    }
    return null; // Invalid hard-coded value (not client input)
  }
}

```

```src/app.module.ts
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
import { PostsModule } from './posts/posts.module';
import { UsersModule } from './users/users.module';
import { ISO8601DateTime } from './iso8601-date-time.scalar';

@Module({
  imports: [
    PostsModule,
    UsersModule,
    GraphQLModule.forRoot({
      autoSchemaFile: true,
      installSubscriptionHandlers: true,
    }),
  ],
  providers: [ISO8601DateTime],
})
export class AppModule {}
```

*まぁAIが作ってくれたんですけどね*

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165443/551756ff-e2e9-2d8b-fb7f-4a7c1240ef28.png)
When GNU GRUB appears and Ubuntu doesn't start

# 1.What partition is Ubuntu's root path on?
Check your drive partition by running the following command `ls (hd0,1)`. In my situation, I found the partition which has total size 1000204576KiB(approx. 1TB).
```
grub> ls (hd0,1)
grub> ls (hd0,2)
grub> ls (hd0,3)
        .
        .
        .
grub> ls (hd1,1)
grub> ls (hd1,2)
        .
        .
        .
```
If your drive partition locate (hd1,2), run the following command and set root path.
```
grub> set root=(hd1,2)
```
# 2. What is the path to the kernel image,  the drive name, and initial RAM disk path?
If your drive partition locate (hd1,2), run the following command.
```
grub> ls (hd1,2)/boot
```
And, please look for `[kernel image path] root=[drive name]` and `[initial RAM disk path]`.
In my situation, I run `ls (hd1,2)/boot` and found above information from the bottom line.
```
grub> linuxefi /boot/vmlinuz-2.19.0-35-generic root=/dev/sda2
grub> initrdefi /boot/initrd.img-2.19.0-35-generic
grub> boot
```

# Reference

https://kajindowsxp.com/grub2/

---
<font color="yellowgreen">**QiitaLink**</font>
<font color="black">**Designed by RENOX**</font>
IT業界でフリーランス50代向けの職種別求人数を集計してみました

#### 前置き
私は40代後半のインフラ系客先常駐エンジニアです。
スカウトメールは毎日のように届いているし、収入も歳相応に頂けています。
しかし、50代も仕事があるのだろうか？コンサルやPMになれなければ仕事が無いというのは本当だろうか？
と心配です。

心配ばかりしていても仕方がないので、
まずは現状を正しく認識する所からスタートすることにしました。
流行りのChatGPTに
「IT業界で50歳以上でも正社員派遣(客先常駐)で仕事を得られている人の職種別の比率を教えて下さい。」
と質問するも、統計データが無いので回答できないとの返答でした。
ならば自分でデータを収集してやろうと、Qualtricsでアンケートを作成してtwitterで呼びかけるもフォロワーが少なすぎて回答が集まりませんでした。

では、求人数をカウントしてやろうと言う事で、furienというフリーランス向けの求人サイトで50代OKの求人数を職種別にカウントすることにしました。
職種別求人数の分布を見れば、50代はPMやコンサルばかりなのかどうかが分かりますし、
本当に50代で求人数が激減するのかも分かるからです。
表を全部埋めるのは大変なので、PM系、インフラ系のみ詳細カウントしました。

#### furienにてフリーランスで関西の50代の週5日勤務の求人の職種別件数集計結果
#### 条件
		
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729552/0594d84e-14dc-b01d-876d-c3b3de1b7e2b.png)

#### 関西、50代活躍中での職種別件数集計
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729552/c3f7c84a-af3a-2384-0f18-5f0abe9b001f.png)


## 集計結果について
関西での50代のフリーランス案件数は40代の77.5%。
また、SEES社の調査結果によると50代を採用しても良いと考える採用担当者は全体の64.5％と
40代を採用しても良いと考える81%と比較すると79.6%(64.5/81=79.6)です。
激減とまでは行きませんが、40代の頃に比べて7割程度の成約率にDownする事は覚悟しておいた方が良いと思われます。

職種別でみるとPMやコンサルになれなければ仕事が得られないと言う事は無く、
インフラ系であれば、詳細設計・構築以降の経験があれば仕事を探しやすい傾向にあると思われます。
という結果となりました。

## シニアエンジニアに対する採用担当者の意識調査
![image.webp](https://sees-production.s3.amazonaws.com/articles/VLJiVmNpLUA4oeRnloA6Q4VZuqgJBh5y7igagD3v.webp)

## まとめの一言
高齢でPM、コンサルでなくても仕事はある！
ESModulesの、export default と export の違い

- `export default`は1つのみ、`export`は複数の変数を渡すことができる。

## export default の場合
- モジュール側
    ```javascript:modules.mjs
    const getAge = () => {
        return 18;
    }
    export default getAge;
    ```
- モジュールを呼ぶ側
    ```javascript:modules.mjs
    import getAge from './modules.mjs';
    console.log(getAge());
    ```
## export の場合(複数渡せるが1つでも渡せる)
- モジュール側
    ```javascript:modules.mjs
    const getAge = () => {
        return 18;
    }
    export { getAge };
    ```
- モジュールを呼ぶ側
    ```javascript:modules.mjs
    import { getAge } from './modules.mjs';
    console.log(getAge());
    ```
## export の場合(複数渡せる)
- モジュール側
    ```javascript:modules.mjs
    const getName = () => {
        return 'hoge';
    }
    const getAge = () => {
        return 18;
    }
    export { getName, getAge };
    ```
- モジュールを呼ぶ側
    ```javascript:modules.mjs
    import { getName, getAge } from './modules.mjs';
    console.log(getAge());
    console.log(getName());
    ```
cos(3/4πy3)「[演習]重積分2(体系大学数学)」をwolframalphaとsympyでやってみたい。

3Dプロットしたい。
wolframでできました。
sympy  でできませんでした。

オリジナル

https://youtu.be/LunlBTA4hFM

# wolframで

https://www.wolframalpha.com/input?i=integral_0%5E1+integral_sqrt%28x%29%5E1+cos%28%283+%CF%80+y%5E3%29%2F4%29+dy+dx&lang=ja

https://www.wolframalpha.com/input?i=2%E9%87%8D%E7%A9%8D%E5%88%86&assumption=%7B%22F%22%2C+%22DoubleIntegral%22%2C+%22rangestart2%22%7D+-%3E%22sqrt+x%22&assumption=%7B%22F%22%2C+%22DoubleIntegral%22%2C+%22rangeend1%22%7D+-%3E%221%22&assumption=%7B%22F%22%2C+%22DoubleIntegral%22%2C+%22rangestart1%22%7D+-%3E%220%22&assumption=%7B%22F%22%2C+%22DoubleIntegral%22%2C+%22integrand%22%7D+-%3E%22cos%283%2F4%CF%80y3%29%22&assumption=%7B%22F%22%2C+%22DoubleIntegral%22%2C+%22intvariable2%22%7D+-%3E%22y%22&assumption=%7B%22C%22%2C+%222%E9%87%8D%E7%A9%8D%E5%88%86%22%7D+-%3E+%7B%22Calculator%22%7D&assumption=%7B%22F%22%2C+%22DoubleIntegral%22%2C+%22intvariable1%22%7D+-%3E%22x%22&assumption=%7B%22F%22%2C+%22DoubleIntegral%22%2C+%22rangeend2%22%7D+-%3E%221%22&lang=ja

# sympyで
できませんでした。
```python
from sympy import *
x,y =symbols('x y',real=True)
print("#",integrate(cos(3/4*pi*y**3),(x,0,1),(y,x,9*x)))
ans=integrate(cos(3/4*pi*y**3),(x,0,1))
ans=integrate(ans,(y,x,9*x))
print("#",ans)
ans=integrate(cos(3/4*pi*y**3),(y,x,9*x))
ans=integrate(ans,(x,0,1))
print("#",ans)
```

# 参考

# つづく

https://qiita.com/mrrclb48z/items/fa75aa9070074a7a6045