OmniAICreator/Qiita-1.07M huggingface dataset:
Laravelで多対多のテーブルからデータを取得しようとして詰まった話

### 結論：中間テーブルの名前が間違っていた
最初に結論から話しますと、中間テーブルの名前が間違っていました。

マッチングアプリを作成しようとしており、ユーザー情報の入った'users'テーブルとマッチングルームの'rooms'テーブルをまず作成しました。そしてその中間テーブル'room_user'を作成しようとしたのですが、'room_users'になっていました。

### 原因
なぜ中間テーブル名に余分な's'が入っていたかというと、以下のコマンドでマイグレーションファイルを作成したからです。
```php artisan make:model RoomUser -m```
これでModelと一緒に'room_users'を作成してしまいました。

### 解決方法
以下のコマンドでマイグレーションファイルのみを作成して正しいテーブル名にできました。
```php artisan make:migration create_room_user_table --create=room_user```
タイプミスも見当たらず、リレーションにも間違いが見当たらなかったので、かなり時間を消費しましたが、これで解決することができました。

### 最後に
かなり初歩的なミスで時間を消費してしまいましたが、同じようなことで詰まっている誰かのお役に立てれば幸いです。
AWS に PowerShell で SSH接続する方法

接続できなくて5時間以上潰した。
解決した忘備録。

結論：アクセスキーを再生成した。

# 1. Windowsで作業するターミナルのインストール
- Taddy https://github.com/Eugeny/tabby/releases/tag/v1.0.215
# 2. ssh 接続準備
- AWS CLI MSI Windows 用 インストーラ (64 ビット): 
    - https://s3.amazonaws.com/aws-cli/AWSCLI64PY3.msi
- EXE インストーラを使用して Session Manager プラグインをインストールする
    - https://s3.amazonaws.com/session-manager-downloads/plugin/latest/windows/SessionManagerPluginSetup.exe
# 3. SSH の設定
- インストールしたAWS CLI のパスを調べる
```bash
where aws
```
- C:\Users\【UserName】\.ssh\config に設定を追加
```config
# SSH over Session Manager
host i-* mi-*
ProxyCommand C:\Program Files\Amazon\AWSCLI2\aws.exe ssm start-session --profile aws-pro --target %h --document-name AWS-StartSSHSession --parameters "portNumber=%p"
```
*Windowsの場合、実行ファイルのフルパスが必要
# 4. アクセスキーと秘密鍵の生成
1. ブラウザから AWS ログイン
1. 左メニューバー ≫ アクセス管理 ≫ ユーザー ≫ 該当ユーザー（選択） ≫ セキュリティ認証情報 ≫ アクセスキー ≫ アクセスキーを作成
1. AK と SK を保存。CSV をダウンロード

# 5. IAM で SSH接続を許可する
1. ブラウザからAWSにログイン
1.  左メニューバー ≫ アクセス管理 ≫ ユーザー ≫ 該当ユーザー（選択） ≫ 許可ポリシー ≫ 許可を追加 ▼ ≫ 許可を追加 ≫ ポリシーを直接アタッチする ≫ 検索欄「AmazonSSMFullAccess または AmazonSSMManagedInstanceCore」を選択 ≫ 次へ ≫ 許可を追加

*グループを作成し、管理したほうが良い
# 6. プロファイル作成
```bash
$ aws configure --profile [profile名]
AWS Access Key ID [None]: [AWS CLIアクセスキー]
AWS Secret Access Key [None]: [AWS CLI秘密キー]
Default region name [None]: ap-northeast-1
Default output format [None]: json
```
# 7. Session Managerを通したSSH接続
```bash
aws ssm start-session --target i-***************** --profile [profile名]
```
- ssm-user から別のユーザーに切り替える
ssm-user は AWS Systems Manager セッションマネージャーを通じて EC2 インスタンスに接続した際にデフォルトで使用されるユーザー
```bash
 sudo su - *****
```


# 参考URL
- https://qiita.com/TAC_yacht/items/eb7ac101c27cec221e2d
- https://qiita.com/Ted-HM/items/9a60f6fcf74bbd79a904
- https://qiita.com/reflet/items/e4225435fe692663b705
- https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/install-plugin-windows.html
- https://docs.aws.amazon.com/ja_jp/cli/v1/userguide/install-windows.html
- https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started-enable-ssh-connections.html#ssh-connections-permissions
Amazon AWS に Windows から SSH接続する方法

接続できなくて5時間以上潰した。
解決した忘備録。

結論：アクセスキーを再生成した。

# 1. Windowsで作業するターミナルのインストール
- Taddy https://github.com/Eugeny/tabby/releases/tag/v1.0.215
# 2. ssh 接続準備
- AWS CLI MSI Windows 用 インストーラ (64 ビット): 
    - https://s3.amazonaws.com/aws-cli/AWSCLI64PY3.msi
- EXE インストーラを使用して Session Manager プラグインをインストールする
    - https://s3.amazonaws.com/session-manager-downloads/plugin/latest/windows/SessionManagerPluginSetup.exe
# 3. SSH の設定
- インストールしたAWS CLI のパスを調べる
```bash
where aws
```
- C:\Users\【UserName】\.ssh\config に設定を追加
```config
# SSH over Session Manager
host i-* mi-*
ProxyCommand C:\Program Files\Amazon\AWSCLI2\aws.exe ssm start-session --profile aws-pro --target %h --document-name AWS-StartSSHSession --parameters "portNumber=%p"
```
*Windowsの場合、実行ファイルのフルパスが必要
# 3. アクセスキーと秘密鍵の生成
1. ブラウザから AWS ログイン
1. 左メニューバー ≫ アクセス管理 ≫ ユーザー ≫ 該当ユーザー（選択） ≫ セキュリティ認証情報 ≫ アクセスキー ≫ アクセスキーを作成
1. AK と SK を保存。CSV をダウンロード

# 4. IAM で SSH接続を許可する
1. ブラウザからAWSにログイン
1.  左メニューバー ≫ アクセス管理 ≫ ユーザー ≫ 該当ユーザー（選択） ≫ 許可ポリシー ≫ 許可を追加 ▼ ≫ 許可を追加 ≫ ポリシーを直接アタッチする ≫ 検索欄「AmazonSSMFullAccess または AmazonSSMManagedInstanceCore」を選択 ≫ 次へ ≫ 許可を追加

*グループを作成し、管理したほうが良い
# 5. プロファイル作成
```bash
$ aws configure --profile [profile名]
AWS Access Key ID [None]: [AWS CLIアクセスキー]
AWS Secret Access Key [None]: [AWS CLI秘密キー]
Default region name [None]: ap-northeast-1
Default output format [None]: json
```
# Session Managerを通したSSH接続
```bash
aws ssm start-session --target i-***************** --profile [profile名]
```


# 参考URL
- https://qiita.com/TAC_yacht/items/eb7ac101c27cec221e2d
- https://qiita.com/Ted-HM/items/9a60f6fcf74bbd79a904
- https://qiita.com/reflet/items/e4225435fe692663b705
- https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/install-plugin-windows.html
- https://docs.aws.amazon.com/ja_jp/cli/v1/userguide/install-windows.html
- https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started-enable-ssh-connections.html#ssh-connections-permissions
【Linux】mvに-rがいらない理由

# はじめに
現在Ubuntuを使用してLinuxを勉強していますが、ふと`mv`に`-r`がないのはなぜだろうと思い記事にすることにしました。

## `-r`とは
というのも、`rm`や`cp`コマンドでディレクトリの操作を行うときに`-r`を付けないとエラーが出ますが、`mv`の場合だと不要なのは不思議ですよね。
これについて、いろいろ調べてみたところ、`-r`のrは`recursive`(再帰的な)という英単語の頭文字らしいです。

## 再帰的とは
ディレクトリの中にはディレクトリやファイルがあり、そのディレクトリの中にも...と何層ものファイルやディレクトリが存在します。
上記のように、似たもの(ファイルやディレクトリ)が階層になって存在する構造を再帰的構造といいます。
例えば`~/dir1/dir2/dir3/file`(dirはディレクトリ、fileはファイル)のようなファイル構造があったとします。
```linux
rm -r dir1
```
このコマンドによって削除されるのはdir1だけでなく、dir2やdir3、fileも同様に削除されます。

このようにディレクトリ全体を削除する場合はその中にあるすべてのファイルやサブディレクトリを削除する必要があります。
これは再帰的な操作（ディレクトリ内をすべて辿って操作を行うこと）になるため、`-r`（recursive）が必要になります。

`cp`においても同様で、ディレクトリの場合はその中身をすべてコピーする必要があります。
ディレクトリの中にディレクトリがあったりファイルが複数あったりする場合、それらを再帰的に辿ってコピーするために`-r`が必要です。

では`mv`の場合はどうでしょうか。
`mv`はファイルやディレクトリを移動または名前変更するコマンドです。`mv`はファイルもディレクトリも区別せず、そのまま移動するか名前を変更します。

移動の際は、ディレクトリそのものの構造が変わらないため、再帰的に中身を辿る必要はありません。ディレクトリごと、そのまま移動するだけなので、`-r`は不要です。
gemを使う？自分で書く？Starを確認しよう

# 今回はgem導入時に自分が注意すべきだと思う点について話したいと思います。
それはズバリ
### Starの数
です

# gemって何？

:::note info
gemとは、RailsやRubyのアプリケーションに追加の機能を提供するために使用されます。例えば、認証システム、ファイルアップロード、テストフレームワーク、データベース接続などの機能を提供するものがあります。
:::

# 具体例

例えば、画像についてバリデーション処理を行いたい場合、
active_strage_validationを利用してもいいですが、このgemのstarを見ると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3878564/5755fbfb-707d-2fe6-3de1-c46668bee443.png)
1kしかstarがついていないことがわかります。

なので、このgemを入れるよりは、
```
class Article < ApplicationRecord
  has_one_attached :image

  validate :validate_image

  private

  def validate_image
    if image.attached?
      if !image.content_type.in?(%w[image/jpeg image/png])
        errors.add(:image, 'はJPEGまたはPNG形式でアップロードしてください。')
      elsif image.byte_size > 2.megabytes
        errors.add(:image, 'のサイズは2MB以下でなければなりません。')
      end
    else
      errors.add(:image, 'をアップロードしてください。')
    end
  end
end
```
のような感じでコード書いてあげたほうがうまくいきます。

### 備忘録でした
ABC065 ARC076 の問題を解いてみました

## A問題
https://atcoder.jp/contests/abc065/tasks/abc065_a

賞味期限を何日過ぎているのかは、$B - A$ で求められるので、それを用いて判定しましょう。
~~~C++
#include <bits/stdc++.h>
using namespace std; using ll = long long;
//Created by karaju.

signed main(void){
  int x, a, b;
  cin >> x >> a >> b;
  
  int over = b - a;
  //何日過ぎたかを表す変数
  
  if(over > x){
    cout << "dangerous" << endl;
  }
  else if(over > 0){
    cout << "safe" << endl;
  }
  else{
    cout << "delicious" << endl;
  }
}
~~~

## B問題
https://atcoder.jp/contests/abc065/tasks/abc065_b

実際にボタンを押して何回か調べればよいです。

1回押したボタンをもう一度押すことになれば無限ループに陥るということがわかり、このことから答えは必ず$N$未満になるということがわかります。
なので、最大でも繰り返しを$N$回行えばいいです。

~~~C++
#include <bits/stdc++.h>
using namespace std; using ll = long long;
//Created by karaju.

signed main(void){
  int n;
  cin >> n;
  int a[n + 1];
  for(int i = 1; i < n; i++){
    cin >> a[i];
  }
  int shine = 1;
  //どこが光っているかを記録する変数
  
  for(int i = 1; i < n; i++){
    shine = a[shine];
    
    if(shine == 2){
      cout << i << endl;
      //何回ボタンを押したかを出力
      return 0;
    }
  }
  cout << -1 << endl;
}
~~~

## C問題
https://atcoder.jp/contests/abc065/tasks/arc076_a


犬の方が1匹多い場合、犬猿犬猿...犬猿犬 と並べ替えられ、猿の方が1匹多い場合、猿犬猿犬...猿犬猿 と並び替えられます。
犬の数 と 猿の数 の差が2以上の場合、並べ方は0通りです。
犬の数 と 猿の数 が等しい場合、犬猿...犬猿 という並べ方と、猿犬...猿犬 という並べ方の二通りあります。

さて、ここからどのように並べ方の数を求められるかを考えます。

犬猿... か 猿犬... か決めると、
$全体の並べ方の数 = 犬の並べ方の数 \times 猿の並べ方の数$

と全体の並べ方の数は表せるので、それぞれの動物の並べ替え方を計算できればよいです。
$N$匹の動物の並び替え方は $N!$ 通りなので、全体の並び替え方は$N!M!$通りあります。

犬の数 と 猿の数 が等しい場合は、犬猿...犬猿 という並べ方と、猿犬...猿犬 という並べ方があるので、$2N!M!$通りなことに注意してください。

~~~C++
#include <bits/stdc++.h>
using namespace std; using ll = long long;
//Created by karaju.

ll MOD = 1000000007;
//10^9 + 7

ll factorial(ll a){ //階乗を計算する関数
  ll b = 1;
  for(int i = 1; i <= a; i++){
    b *= i;
    b %= MOD;
  }
  return b;
}

signed main(void){
  ll n, m;
  cin >> n >> m;
  
  if(n == m){ //場合分け
    cout << 2 * factorial(n) * factorial(m) % MOD << endl;
  }
  else if(abs(n - m) == 1){
    cout << factorial(n) * factorial(m) % MOD << endl;
  }
  else{
    cout << 0 << endl;
  }
  
}
~~~

<!--

## D問題
https://atcoder.jp/contests/abc065/tasks/arc076_b

問題文を言い換えると、最小全域木のコストを求めるという内容になります。
最小全域木を求めるアルゴリズムといえば、クラスカル法です。

[最小全域木・クラスカル法についての解説](https://qiita.com/karaju/items/bb722574a01c837e1a71#%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%AB%E3%83%AB%E6%B3%95)

しかし、愚直に実装すると辺の数が約$N^2$個になってしまいます。

ここで問題文をよく見てみると、道を作るコストを決定する式がかなり特殊であることがわかります。
いくら2つの都市が縦方向に離れていても、横方向での距離が近ければ、その2つの都市を結ぶ道のコストは小さくなります。

![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3602077/26014d3d-db44-934f-e206-1790eac861aa.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3602077/d0a2256b-c926-6c7d-7487-a7e4609ded45.png)



つまり、 1枚目の画像のように道を結んでも、2枚目の画像の様に道を結んでも、かかるコストは同じです。

もちろん、同じコストなら多くの街を結んだほうが良いので、2枚目の画像のように道を結ぶべきだとわかります。

x座標,y座標でソートしたときの前後の街にしか道を結ぶ意味がないということなので、その道のみでクラスカル法を行いましょう。

~~~C++

~~~

-->
memo1

Sub AttachFilteredFiles(docA As NotesDocument, docB As NotesDocument)
    ' リッチテキストフィールドのオブジェクトを取得
    Dim rtFieldA As NotesRichTextItem
    Dim rtFieldB As NotesRichTextItem
    Dim rtNavigator As NotesRichTextNavigator
    Dim rtFile As NotesEmbeddedObject
    
    ' 文書Aと文書Bのリッチテキストフィールドを設定
    Set rtFieldA = docA.GetFirstItem("Body") ' 文書Aのリッチテキストフィールド名を指定
    Set rtFieldB = docB.GetFirstItem("Body") ' 文書Bのリッチテキストフィールド名を指定
    
    If rtFieldB Is Nothing Then
        ' 文書Bにリッチテキストフィールドが無い場合は新たに作成
        Set rtFieldB = New NotesRichTextItem(docB, "Body")
    End If
    
    ' 文書Aのリッチテキスト内の添付ファイルをナビゲート
    Set rtNavigator = rtFieldA.CreateNavigator
    If rtNavigator.FindFirstElement(RTELEM_TYPE_FILEATTACHMENT) Then
        Do
            ' 各ファイルの添付を取得
            Set rtFile = rtNavigator.GetElement
            ' ファイル名を取得して"001"で終わるか確認
            If Right(rtFile.Source, 3) = "001" Then
                ' 条件に一致するファイルを文書Bに添付
                Call rtFieldB.EmbedObject(EMBED_ATTACHMENT, "", rtFile.Source)
            End If
        Loop While rtNavigator.FindNextElement(RTELEM_TYPE_FILEATTACHMENT)
    End If
    
    ' 文書Bを保存
    Call docB.Save(True, False)
End Sub
備忘録　ラズパイ5 ROS2 勉強再開 ① エラーが解消？

　8月の始め、colcon buildでエラーが出てROS2の勉強を放置していました。
 
 https://qiita.com/jamjam/items/d337f9718343581bae50
 
 　何度かのupdateでsetup.pyがどうとかいうエラーはなくなった模様です。
 

```
yoshi@yoshi:~/ros2_ws$ source /opt/ros/jazzy/setup.bash
yoshi@yoshi:~/ros2_ws$ colcon build --packages-select vl53l1x
Starting >>> vl53l1x
Finished <<< vl53l1x [9.67s]

Summary: 1 package finished [9.83s]
yoshi@yoshi:~/ros2_ws$ source ~/ros2_ws/install/setup.bash
not found: "/home/yoshi/ros2_ws/install/lely_core_libraries/share/lely_core_libraries/local_setup.bash"
```
　lely_core_librariesというのは、CANopen用のライブラリのようで、いつ？インストールしたのか記憶があいまい。
 　調べたことはあるのだけれど。

### jazzyのアンインストール
　一度消しますね。
 ```
$ sudo apt install plocate
$ sudo updatedb
$ plocate jazzy
```
　たくさんのファイルが表示されます。
```
sudo apt remove ~nros-jazzy-*
sudo apt autoremove
sudo apt upgrade
sudo apt-get purge ros-jazzy-ros-base
sudo apt-get purge ~nros-jazzy-*

rm -rfv ~/.ros
rm -rfv ~/.config/ros.org

$ plocate jazzy
```
　まだたくさん表示されるが、影響がないものとして無視することにした。
```
sudo reboot
```
```
$ sudo apt update
$ sudo apt upgrade
```
　変わりませんでした。
　大元を調べました。
```
yoshi@yoshi:~/ros2_ws/install/lely_core_libraries/share/lely_core_libraries$ cat ./package.bash
```
の中に、
```
# source bash hooks
_colcon_package_bash_source_script "$COLCON_CURRENT_PREFIX/share/lely_core_libraries/local_setup.bash"
```
という記述がありました。hookした？ようです。で、local_setup.bashはないのです。

　canopen関連のフォルダを削除（GUI）しました。
　そしたら、パッケージの登録、
```
yoshi@yoshi:~/ros2_ws$ source ~/ros2_ws/install/setup.bash
```
では、エラーが出なくなりました。

 ### 環境

- Raspberry Pi 5 8GB
- 追加ボード；NVMe Base for Raspberry Pi 5 (NVMe Base by Pimoroni)
- Crucial クルーシャル P2シリーズ 500GB 3D NAND NVMe PCIe M.2 SSD CT500P2SSD8
- Ubuntu Desktop ***24.04LTS***(64-bit)
- ROS2 **Jazzy**

### 動作確認
　ToF距離センサVL53L1Xのpubliser側です。

https://qiita.com/jamjam/items/21074d7ed830926d7ff4

　パッケージを実行します。
```
yoshi@yoshi:~$ ros2 run vl53l1x vl53l1x_node
```

 ラズパイ側でターミナルを開き、可視化ツールを起動します。リフレッシュしたら、Publishしている様子が表示されました。

 ```
 $ source /opt/ros/jazzy/setup.bash
 $ rqt_graph
 ```
　ビルドの動作確認ができました。

![Screenshot from 2024-08-07 03-54-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/49a8a0c1-6334-b3a6-7c9f-26967e959dcd.png)

　VL53L1Xのsubscriber側のプログラムです。

 https://qiita.com/jamjam/items/6c0b48747fd405989917

 Windows10でもう一つsshでログインします。
 ```
 $ source /opt/ros/jazzy/setup.bash
$ cmake -S . -B build
$ cd build
$ make
$ ./sub002
start subscribe VL53L1X vl53l1x/range
```
　実行すると、VL53L1Xのpubliserのrangeデータをsubscribeします。
 
![vl101a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/13533d5c-968b-6ac4-56c1-89036e4066de.png)

　可視化ツールをリフレッシュします。
 
![Screenshot from 2024-10-04 08-41-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/8d473c78-06fa-1da8-04d3-f94abe950e7b.png)

　ROS2の勉強を再開します。
Công ty quảng cáo Facebook Quảng Cáo Siêu Tốc congtyqcfacebook_qcst

Bạn đang tìm cách tăng cường hiệu quả kinh doanh trên Facebook bằng cách chi ngân sách vào quảng cáo nhưng lại không biết cách chạy hoặc kết quả không như mong muốn? Bạn có thể cần tìm một công ty quảng cáo Facebook để được tư vấn và triển khai chiến dịch hiệu quả nhất. Hãy cùng Quảng Cáo Siêu Tốc khám phá những yếu tố quan trọng để chọn lựa công ty quảng cáo uy tín.

Nguồn: https://trello.com/w/userkhonggianlamvic28537836

![chuyen-gia-facebook-ads.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3901633/d1f97f59-6455-6342-7b2a-93c9e08c2c50.jpeg)
Backlog APIで利用する、自身のユーザーIDを確認する

開発者ツールのConsoleタブで以下のコマンドを実行する
```js
console.log(Backlog.resource['loginUser.id']);
```

ログインユーザーの情報をまとめて取る場合
```js
Object.fromEntries(
    Object.entries(Backlog.resource)
        .filter(([k]) => k.startsWith("loginUser.")
    )
)
```
IBM i 仮想テープ機能でzLib圧縮を使ってみました

## はじめに
IBM i 7.4 TR7およびIBM i 7.5から保管処理における圧縮オプションとしてzLib圧縮がサポートされるようになりました。
zLib圧縮は特にPower10プロセッサーではチップに搭載されたNest Accelerator (NX) GZIPが使用されますのでPower9マシンよりも圧縮時のパフォーマンス向上が見込まれます。

[Compression with ZLIB algorithm - Save Commands and APIs](https://www.ibm.com/support/pages/compression-zlib-algorithm-save-commands-and-apis)

今回Power Virtual ServerのPower9マシンとPower10マシンを使用する機会がありましたので、両者でのzLib圧縮のパフォーマンスを比べてみました。

## バックアップ・パフォーマンス検証
### 検証環境
検証は以下の環境で実施しました。
最初にケース1の環境をPowerVS上で作成、検証実施後にその環境のイメージをエクスポート、Power10マシン上にデプロイすることでケース2の環境を簡単に組み上げることができました。こういう使い方が簡単にできるのはPowerVSならでは、ですね！

||検証環境1|検証環境2|
|-|-|-|
|モデル|Power9 S922|Power10 S1022|
|プロセッサー|0.25 Uncapped|0.25 Uncapped|
|メモリー|4 GiB|4 GiB|
|ディスク|100 GiB x 5 (Tier1)|100 GiB x 5 (Tier1)|
|OS|IBM i 7.5|IBM i 7.5|

### 検証パターン

テストしたのは、複数の物理ファイル (テーブル) が配置されている約12GBのライブラリー1つをSAVLIBコマンドで保管するテストと約60GBのライブラリー1つをSAVLIBコマンドで保管するテストの2種類を行いました。どちらも圧縮なしのパターンとzLib圧縮の2パターンを実行した形です。

|#|保管対象|保管処理内容|
|-|:-|:-|
|1-1|約12GBのライブラリー x 1|SAVLIBで仮想テープに非圧縮で保管|
|1-2|約12GBのライブラリー x 1|SAVLIBで仮想テープに*ZLIB圧縮で保管|
|2-1|約60GBのライブラリー x 1|SAVLIBで仮想テープに非圧縮で保管|
|2-2|約60GBのライブラリー x 1|SAVLIBで仮想テープに*ZLIB圧縮で保管|

検証パターンのイメージ
![image01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1305251/12e5e527-4fa5-176e-339f-a6149b8ddf7f.gif)

### 検証結果

上記検証パターンについて2つの検証環境での実施結果として所要時間とバックアップ・データが書き込まれた仮想テープ・イメージのサイズをまとめたのが以下の表です。
Power9, Power10いずれのマシンでも効果的に圧縮されていますが、Power9マシンでは所要時間が大幅に増えています。一方でPower10マシンでは処理速度も非圧縮時と同等 (むしろ少し速い！) という結果になりました。

なお、Power9/Power10でのzLib圧縮後のサイズ相違は圧縮メカニズム (Power10における専用ユニットの使用) の相違によるものかと思います。念のためにPower9マシン上のIBM i でzLib圧縮保管したテープ・イメージからPower10マシン上のIBM i に復元できるか、またその逆もテストしてみまして、特に問題なく復元できることを確認しました。

検証パターン1-1および1-2
(上段: 所要時間, 下段:イメージ・サイズ, 1-2のカッコ内は1-1との比較)
|#|検証環境1 (Power9)|検証環境2 (Power10)|
|-|-:|-:|
|1-1|49秒<br>11.68 GiB|43秒<br>11.68 GiB|
|1-2|3分21秒 (**4.1倍**)<br>0.79 GiB (**93.2%減**)|29秒 (**0.7倍**)<br>0.95 GiB (**91.9%減**)|

検証パターン2-1および2-2
(上段: 所要時間, 下段:イメージ・サイズ, 2-2のカッコ内は2-1との比較)
|#|検証環境1 (Power9)|検証環境2 (Power10)|
|-|-:|-:|
|2-1|5分42秒<br>60.59 GiB|3分41秒<br>60.59 GiB|
|2-2|38分25秒 (**6.7倍**)<br>9.77 GiB (**83.9%減**)|3分28秒 (**0.9倍**)<br>11.04 GiB (**81.8%減**)|

## ICCでのICOSへの圧縮転送を加味したパフォーマンス比較
IBM i とICOS間のファイル転送ソリューションであるICC (IBM Cloud Storage Solutions for i) には転送時に圧縮して送る機能があります。
そこで今回、
- 非圧縮で保管した仮想テープ・イメージをICCで圧縮してICOSに転送
- ZLIB圧縮で保管した仮想テープ・イメージをICCでは非圧縮でICOSに転送

の2パターンでどのような違いがあるかを検証してみました。

検証イメージ
![image02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1305251/f355d1e9-9e53-e70d-eae0-d83093d212bc.gif)

以下表の検証結果は3回実施の平均です。

||転送所要時間|IBM i 上でのサイズ|ICOSでのサイズ|
|-|-:|-:|-:|
|SAVLIB非圧縮 + ICC圧縮|19分6秒|60.59 GiB|13.67 GiB|
|SAVLIB zLib圧縮 + ICC非圧縮|9分29秒|11.04 GiB|11.04 GiB|

先ほどのバックアップ・パフォーマンス検証の結果とICCでのICOSへの転送検証を合わせて考えますと、Power10マシンでは
- ICCによる転送時の圧縮よりも保管時のzLib圧縮の方がサイズを小さくできる
- zLib圧縮と非圧縮での転送の組み合わせの方が全体の所要時間を短くできる

と言えそうです。

## 終わりに
IBM i でのオブジェクト保管時のzLib圧縮は、特にPower10マシンにおいてかなり有益な機能だと感じました。
また、保管時に圧縮することでICCによる転送前のイメージ・ファイルの一時な保管領域として必要なIBM i 側でのストレージ領域も小さくすることができます。そうするとPower Virtual Serverではコスト的にも有利ですよね。
もちろん対象のデータによって変動があるかと思いますので、全てのケースで効果が保証される訳ではありませんが、バックアップ・ソリューションを考える上での参考になる結果が得られたかなと思います。
データ移行を簡単・高速にする「AWS DataSync」とは？

## はじめに

今回は、AWSのサービスの中でも特に注目すべき「AWS DataSync」について、超初心者の方でも理解しやすいように解説していきます。

### データ移行の課題：速度、セキュリティ、コスト…

大量のデータをAWSに移行しようとすると、様々な課題に直面します。

* **送信元のストレージの速度**: データの読み込み速度が遅いと、全体的な転送速度も遅くなってしまう
* **ローカルネットワークの帯域幅**: 社内ネットワークの速度がボトルネックになる
* **インターネット回線の帯域幅**: インターネット回線自体が遅いと、データ転送に時間がかかる
* **セキュリティ**: データを安全に転送するために、適切な暗号化が必要
* **データの整合性**: 転送先のストレージでデータが正しく保存されているか、確認する必要
* **運用**: データ転送のスケジュール管理、エラー発生時の対応など、運用面も考慮する必要

### AWS DataSyncが解決してくれる！

AWS DataSyncは、これらの課題を解決してくれるサービスです。

**簡単に言うと、AWS DataSyncは、オンプレミスや他のクラウドストレージからAWSのストレージサービスにデータを移行するためのマネージドサービスです。**

**DataSyncの主な特徴は以下の通りです。**

* **簡単**: エージェントをデプロイし、タスクを設定するだけで、データ転送が自動的に行う
* **高速**: マルチセッション、圧縮、ロードバランシングなどの技術を用いて、高速なデータ転送を実現
* **安全**: データの伝送路と保存時に暗号化を行い、高いセキュリティ
* **低コスト**: 1GBあたり0.012USDという低コストでデータ転送を提供

### データ移行のユースケース

DataSyncは、様々なユースケースで利用できます。

* **オンプレミスからAWSへのデータ移行**: オンプレミスのNFSやSMBストレージからAmazon S3、EFS、FSxシリーズへデータを移行することが可能
* **AWSアカウント間のデータ転送**: 同じAWSアカウント内はもちろん、異なるアカウント間でもデータ転送が可能

### まとめ：AWS DataSyncでデータ移行をスムーズに！

AWS DataSyncは、データ移行を簡単、高速、安全、低コストに行うための強力なツールです。経営層の方々も、AWS DataSyncを活用することで、スムーズなデータ移行を実現できます。

ぜひ、AWS DataSyncを検討してみてください！

### 関係資料
[AWS DataSync【AWS Black Belt】](https://youtu.be/j-AgT53vrc0?si=0RCW2dVpxUK9gJaj)
[AWS DataSync【AWS Black Belt】/PDF](https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqa2pxdDYyM2dOekRmZVUwM0JSRzJ4Wm1NbWtCQXxBQ3Jtc0treXVIWnhONVFBb1g4bUxiUVZ6dHFGTFI2VkFtbWJyd1ZFc0FENGpBSHZCZmgzanJjcjF2dkowUHJGRWFWYk5VVldCVmhoRTlZZmN4TF9jdHp3dHpxVERMLUNNYWRkUmhuZFJQZUJ2R2gtWk1kSzViQQ&q=https%3A%2F%2Fpages.awscloud.com%2Frs%2F112-TZM-766%2Fimages%2FAWS-Black-Belt_2024_AWS-DataSync_0930_v1.pdf&v=j-AgT53vrc0)
2024/10/04時点でのMinGW、C/C++のコンパイラを導入手順

# はじめに
どの記事を見ても10/04の時点でMinGWの導入手順が異なっていた。知り合いからも調べても出てこないと聞いたので現時点での導入を簡潔に説明する。

# 先走りたい人へ
以下のページから7zファイルをダウンロードしてください。

https://github.com/niXman/mingw-builds-binaries/releases

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015774/0d61d819-9ba6-f2cf-6528-ccbc03e7ca85.png)

ダウンロード後、展開して任意の場所にフォルダを設置し、パスを通します。

# 本題
## MinGW-w64のページを開く
https://www.mingw-w64.org/downloads/

MinGW-W64-buildsのGitHubリンクを開きたいのだが・・・
DownloadsのPre-built toolchains and packagesにある「MinGW-W64-builds」を開くことができないんだけど...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015774/a08b6a36-3c5c-92e0-a316-abb8221c92e7.png)

見出しのidが変更されたにも関わらず、リンク先が変更されていないようでした。

なお以下のリンクから直接アクセスできます。
- https://www.mingw-w64.org/downloads/#mingw-w64-builds

ちなみに、下までスクロールすると見つかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015774/a6d9d2b6-1349-e999-2193-ab7b6eb243a0.png)

GitHubをクリックしてMinGWのGitHubのリリースページを開きましょう。

https://github.com/niXman/mingw-builds-binaries/releases

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015774/0d61d819-9ba6-f2cf-6528-ccbc03e7ca85.png)

赤い線で引かれたファイルを開きます。

ダウンロードしたファイルを任意のフォルダに移動して展開します。

C:\gcc\などといったフォルダに入れておきましょう。

「システム環境変数の編集」を開きましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015774/18e38e0b-ff9e-a6aa-89df-1e8b563c62e6.png)

そして「環境変数...」から

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015774/9c07d6fe-e1a0-5eaa-b5db-816458380d83.png)

下側のシステム環境変数からPathを選んで編集をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015774/27015064-7f53-e09f-f942-967b19473599.png)

「新規」をクリックして展開したフォルダの中にある「bin/」までのパスをコピーして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015774/92dd7b6d-8530-9cea-d15d-170fa8f073df.png)

このように追加し、「OK」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015774/c616d5fd-a22c-efcc-c8de-bfed76399e5a.png)

これでコンパイラ、MinGWの導入は完了です
KUROKO Connectのメール認証を設定してみた

#### KUROKO Connectのログイン処理はオプションでメール認証に対応しています。<br>メール認証はユーザー単位で設定する形になります。
:::note alert
自分自身のログイン認証を変更することは出来ません。（セキュリティ確保のため）
:::


早速設定を試してみたいと思います。

# 1. ログイン
KUROKO Connectのログイン画面でまずはログインします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/5e3b9d9a-596b-acc6-aaab-047f65b5bbf5.png" width="60%">

# 2. ユーザーの選択
メニューの　管理＞User＞User一覧をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/d5701f14-d23c-3d57-d643-6db31f0f7373.png" width="30%">

メール認証設定したいユーザーの「Actions」をクリック、「詳細情報」をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/0c8c6314-4759-b962-f67d-a3a374c5feff.png" width="80%">


# 3. メール認証の設定
メール認証を「必要」にチェックを入れます。
ここで注意事項があります。

:::note warn
メール認証を設定する場合は必ず「メールアドレス」を登録する必要があります。<br>メールアドレスが登録されていないと、下記の様にエラーが表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/0662b194-3ed2-1fb9-904d-4403a312cbfc.png">
:::

メールアドレスを登録して、「変更」ボタンを押して保存します。
これで、このアカウントはログインする際にメール認証が必要になります。

***
これで設定はすべて完了したので、実際にこのアカウントでログインしてみましょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3869727/5fdd5d1c-ca36-7e03-4c85-1355841561f6.png" width="80%">

正しいアカウント、パスワードでログインに成功すると、この様にメールに送付されたパスコードを入力する画面が表示されます。

今回はKUROKO Connectのメール認証オプションを試してみました。
KUROKO Connectについての詳しい情報はこちらまで。
[KUROKO Connect](https://connect.kuroko.cloud/)
`box-shadow`プロパティの使い方

駆け出しエンジニアのtaiyoです。今日は`box-shadow`プロパティについてまとめたいと思います。

`box-shadow` は、要素に影をつけるための CSS プロパティです。存在はもちろん知っていましたが、改めて一から影を作れと言われたら難しいなと思ったので、今回はその指定の仕方と概念をまとめたいと思います。

## 1. 基本的な構文

```css
box-shadow: offset-x offset-y blur-radius spread-radius color;
```

まず、基本的な概念として、**色以外何も設定のないbox-shadow**（`box-shadow: 0 0 0 0 black;`）**では、”影”は要素の真下に要素と同じ大きさ&指定した色ベタ塗りで隠れています**。

つまり、このままでは見えない＆全く影感がありません。

この真下に隠れている"影"を、上下左右に移動させたり、ぼかしたり、拡大・縮小したりして、より影っぽくしていくのがこれから指定する値たちです。

- **`offset-x`**: 影を水平方向にどれだけずらすかを指定します。正の値で右、負の値で左に影がずれます。
- **`offset-y`**: 影を垂直方向にどれだけずらすかを指定します。正の値で下、負の値で上に影がずれます。
- **`blur-radius`**: 影のぼかし具合を指定します。値が大きいほど影がぼかされ、柔らかい影になります。省略可能ですが、これがないと色がベタ塗りになるので、「箱」感が強くなり「影」感は皆無です。
- **`spread-radius`**: 影の拡大・縮小を指定します。正の値で影が拡大され、負の値で影が縮小します。省略可能です。
- **`color`**: 影の色を指定します。`rgba()` などを使って透明度を含めることも可能です。

### 例

```css
/* 基本的な影 */
box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.3);
```

- **`5px 5px`**: 影が右下に 5px ずつずれる
- **`10px`**: 影のぼかしの強さ（半径 10px）
- **`rgba(0, 0, 0, 0.3)`**: 30% の透明度の黒い影

この設定により、要素が少し浮き上がっているように見えます。

## 2. その他オプション

### 1. 複数の影を使う

カンマ区切りで複数の影の設定をすることも可能です。この例では、黒い影が右下に、白い影が左上に配置されて、より立体的に見えます。

```css
box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.5), -2px -2px 3px rgba(255, 255, 255, 0.3);
```

### 2. 内側の影（`inset`）

通常の影は外側に表示されますが、`inset` を使うと、要素の内側に影がつきます。これを使ってくぼんだような効果を作ることができます。

```css
box-shadow: inset 0px 0px 10px rgba(0, 0, 0, 0.5);
```

## 3. （おまけ）TailwindCSSのデフォルト設定

ちなみに、Tailwindの`shadow`クラスは次のように設定されています。

|クラス名|実際のCSS|
| --- | --- |
| **shadow-sm** | box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); |
| **shadow** | box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); |
| **shadow-md** | box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); |
| **shadow-lg** | box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); |
| **shadow-xl** | box-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); |
| **shadow-2xl** | box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25); |
| **shadow-inner** | box-shadow: inset 0 2px 4px 0 rgb(0 0 0 / 0.05); |
| **shadow-none** | box-shadow: 0 0 #0000; |

また、インラインで直接`box-shadow`プロパティの設定をしたいときは、ハイフン`_`で繋いで書きます。

```jsx
<div class="shadow-[0_35px_60px_-15px_rgba(0,0,0,0.3)]">
  <!-- ... -->
</div>
```

基本的な内容になってしまいましたが、ご参考までに！
FlutterのdidChangeDependenciesメソッド解説

### はじめに

`didChangeDependencies`は、Flutterの**StatefulWidget**のライフサイクルメソッドの一つで、ウィジェットが依存するデータが変わった際に呼び出されます。これは、主に`InheritedWidget`などの依存関係に基づいた更新を検知します。
メモとして簡単にまとめたため、詳しく知りたい方は[こちら](https://api.flutter.dev/flutter/widgets/State/didChangeDependencies.html)をご覧ください。もし他に良い方法や改善点があれば、ぜひコメントいただけると幸いです。


### 呼ばれるタイミング

1. **`initState`の直後**: 初期化が完了するとすぐに呼ばれます。
2. **依存する`InheritedWidget`の変更時**: ウィジェットが依存しているデータ（例えばテーマやグローバル設定）が変更された場合に再度呼ばれます。

### 使いどころ

- 通常は`build`メソッドが依存関係の変更を検知しますが、**重い処理**（ネットワークリクエストなど）を`build`で行うとパフォーマンスが悪化する可能性があるため、**一度だけ実行したい処理**を`didChangeDependencies`で処理することが推奨されます。

### 簡単な例

```dart

@override
void didChangeDependencies() {
  super.didChangeDependencies();
  // 初回依存データのセットアップや重い処理
  fetchData(); // 例: APIリクエスト
}
```

### まとめ

- **依存関係の変化をキャッチするメソッド**
- **`initState`直後**と、**`InheritedWidget`の変更**に反応します。
- **パフォーマンスを改善**するために、`build`で行うべきでない重い処理をここで実行します。

これにより、アプリが効率的に依存データを扱い、不要な再構築を防ぐことができます。
Windows PC があれば簡単にできちゃう無線LANサイトサーベイの方法

# やりたいこと
かんたんお手軽にどこのアクセスポイントに繋がっていて、どれくらいの強さで繋がっているか確認したい。

# 調査
netsh コマンド使えば目的の結果が得られることがわかりました。

#### netsh wlan show interface の実行結果
```
システムに 1 インターフェイスがあります:

    名前                   : Wi-Fi
    説明                   : Intel(R) Wi-Fi 6 AX201 160MHz
    GUID                   : a1b2c3d4-5678-90ab-cdef-1234567890ab
    物理アドレス           : aa:bb:cc:11:22:33
    インターフェイス 入力        : プライマリ
    状態                  : 接続されました
    SSID                   : Sample-no-ssid
    BSSID                  : dd:ee:ff:44:55:66
    ネットワークの種類     : インフラストラクチャ
    無線の種類             : 802.11ax
    認証                   : WPA2-パーソナル
    暗号                 : CCMP
    接続モード        : 自動接続
    バンド                   : 5 GHz
    チャネル                : 60
    受信速度 (Mbps)        : 310
    送信速度 (Mbps)        : 574
    シグナル               : 90%
    プロファイル           : Sample-no-ssid

    ホストされたネットワークの状態: 利用不可
```

# 思考
この中で欲しいのは **「BSSID」** と **「シグナル」** です。
これを **「findstr」** で取り出し、 **「for 文」** で変数にいれて、 **「SET」** を使って置換して、 **「echo」** で表示させて、 **「TIMEOUT」** で数秒ごとに更新して、 **「goto」** で回して…

# 出来上がり
```電波強度確認君.bat
@echo off
:LOOP
for /f "usebackq delims=" %%A in (`netsh wlan show interface ^| findstr BSSID`) do set BSSID=%%A
SET BSSID=%BSSID:dd:ee:ff:44:55:66=１階東事務所%
SET BSSID=%BSSID:dd:ee:ff:55:66:77=１階西事務所%
SET BSSID=%BSSID:dd:ee:ff:66:77:88=２階事務所%
SET BSSID=%BSSID:dd:ee:ff:77:88:99=３階大会議室%
SET BSSID=%BSSID:dd:ee:ff:88:99:11=倉庫%
SET BSSID=%BSSID:dd:ee:ff:99:11:22=受付%
for /f "usebackq delims=" %%B in (`netsh wlan show interface ^| findstr シグナル`) do set SIGNAL=%%B
echo %BSSID%
echo %SIGNAL%
TIMEOUT /t 5
goto LOOP
```

# 結果
```
    BSSID                  : 受付
    シグナル               : 87%

0 秒待っています。続行するには何かキーを押してください ...
    BSSID                  : 受付
    シグナル               : 32%

0 秒待っています。続行するには何かキーを押してください ...
    BSSID                  : １階東事務所
    シグナル               : 96%

5 秒待っています。続行するには何かキーを押してください ...
```

「受付」から「１階東事務所」に移動して、AP が切り替わった事がわかります。
このバッチがあればどこまで電波を掴むのか、扉を締めたらどう変化するのかいろいろなことがバッチりわかります。

これは生成AIなどがまだない頃に自力で作った会心の作となります。
キモは **BSSID** を場所に変換しているところです。
みなさん是非とも使ってみて下さい。
そして感想など頂ければ嬉しいです。
SPSS Modelerで作成するテーブルのスキーマを指定する

SPSS ModelerのエクスポートノードでRDB内にテーブルを作成することができ、デフォルトだと文字列ならVARCHAR(255)、整数ならBIGINTなどが選ばれます。

しかしながら無駄な領域をとらないために、列のデータ型などのテーブルのスキーマを明示的に指定したいことがあります。

その場合にはスキーマ指定のオプションを使います。

# 作成するテーブルのスキーマを指定する

例として以下のデータを「VARCHAR(10)」,「DECIMAL(2,0)」の列に保存したいとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/dc3f41fa-d353-4737-59fd-1419fe329375.png)

データベースのエクスポートノードで「スキーマ」をクリックし、「データ型」から「指定…」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/d18397e7-3315-51ee-d319-839ec5a2747b.png)

そして、「VARCHAR(10)」,「DECIMAL(2,0)」のように指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/1093fc32-4998-8da1-f6c8-17729aed8373.png)

そして実行すると以下のように指定したデータ型でテーブルがつくれられているのがわかります。
```
CREATE TABLE INSERTTEST2 ( NAME VARCHAR(10),AGE DECIMAL(2,0) )
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/419133f6-e3a5-18a8-cf69-d85a89dffbc8.png)


#### 参考：データベース・エクスポートのスキーマのオプション - IBM Documentation 

https://www.ibm.com/docs/ja/spss-modeler/18.5.0?topic=node-database-export-schema-options

フィールドの SQL データ型を設定し、エクスポート時に作成した CREATE TABLE 文をカスタマイズすることができます。

#### 参考：SQL - IBM Documentation 
https://www.ibm.com/docs/ja/spss-modeler/18.5.0?topic=configuration-sql

Default SQL string length. (default_sql_string_length)。 データベース・キャッシュ・テーブル内に作成されるストリング列のデフォルト幅を指定します。 上流のデータ型の情報がない場合、データベース・キャッシュ・テーブル内に作成される文字列フィールドの幅は、デフォルトの 255 になります。 データ内にこの値よりも幅が広い値がある場合、上流のデータ型ノードをこれらの値でインスタンス化するか、このパラメーターをこれらの文字列値に対応した大きい値に設定します。
python 仮想環境のメリット・作り方・削除方法まとめ

## メリット
ローカル環境で独立した環境を楽に作成できる。
他のライブラリとの競合を起こさない。

## 作り方
### linux環境の場合
ディレクトリ移動
```
cd /home/nkuser/target
```
仮想環境作成
```
python -m venv myenv
```
仮想環境アクティブ
```
source myenv/bin/activate
```
必要なライブラリをインストール
```
pip ~~~~~~ほにゃらら
```
完了
インストールしたライブラリ一覧を抽出する
```
pip freeze > requirements.txt
```
ライブラリ一覧からライブラリを一斉インストールする。※これで一個ずつライブラリをインストールする面倒な動作を省ける。
```
pip install -r requirements.txt
```
-----------------------------------------
### windows環境の場合


クトリ移動
```
cd /home/nkuser/target
```
仮想環境作成
```
python -m venv myenv
```
仮想環境アクティブ
```
myenv\Scripts\activate
```
必要なライブラリをインストール
```
pip ~~~~~~ほにゃらら
```
完了
インストールしたライブラリ一覧を抽出する
```
pip freeze > requirements.txt
```
ライブラリ一覧からライブラリを一斉インストールする。※これで一個ずつライブラリをインストールする面倒な動作を省ける。
```
pip install -r requirements.txt
```
仮想環境終了
```
deactivate
```
## 削除方法
ディレクトリ選択して削除でOK。
【個人メモ】コマンド生成してテキストファイルに出力するマクロ

chatgptが作った
動作確認未実施

```
Sub WriteCommandsToFileWithOverwriteCheck()
    Dim cellValue As String
    Dim commandText As String
    Dim filePath As String
    Dim fileNum As Integer
    Dim i As Integer
    Dim lastRow As Integer
    Dim overwrite As VbMsgBoxResult
    
    ' 出力先として指定するフルパスをセルA1から取得
    filePath = ThisWorkbook.Sheets(1).Range("A1").Value
    
    ' もしセルが空の場合のエラーハンドリング
    If filePath = "" Then
        MsgBox "セルA1に有効なファイルパスを入力してください。", vbExclamation
        Exit Sub
    End If
    
    ' ファイルパスに拡張子が含まれていなければ、".txt"を追加
    If LCase(Right(filePath, 4)) <> ".txt" Then
        filePath = filePath & ".txt"
    End If
    
    ' ファイルが既に存在するか確認
    If Dir(filePath) <> "" Then
        ' ファイルが存在する場合、上書き確認ダイアログを表示
        overwrite = MsgBox(filePath & " は既に存在します。上書きしますか？", vbYesNo + vbExclamation, "上書き確認")
        If overwrite = vbNo Then
            MsgBox "処理をキャンセルしました。"
            Exit Sub
        End If
    End If
    
    ' テキストファイルを開く
    fileNum = FreeFile
    On Error GoTo ErrorHandler ' ファイルオープン時のエラーハンドリング
    Open filePath For Output As fileNum
    
    ' ここからファイルに随時コマンドを出力
    ' 例として、B列にあるデータをコマンドとして書き込む
    lastRow = ThisWorkbook.Sheets(1).Cells(Rows.Count, 2).End(xlUp).Row ' B列の最終行の取得
    
    For i = 1 To lastRow
        cellValue = ThisWorkbook.Sheets(1).Cells(i, 2).Value
        commandText = "echo " & cellValue & " > output.txt"
        
        ' コマンドをファイルに書き込む
        Print #fileNum, commandText
    Next i
    
    ' ファイルを閉じる
    Close fileNum
    
    MsgBox "コマンドを保存しました: " & filePath
    Exit Sub

ErrorHandler:
    MsgBox "ファイルを開く際にエラーが発生しました。パスを確認してください。", vbCritical
    Close fileNum
End Sub
```
178日目　基本情報技術者試験を受験した時の学習法をいまさらまとめてみるby社畜S

## :checkered_flag:はじめに
こんにちは、社畜Sです
突然ですが皆さん、来週日曜日の10月13日に何があるかご存じでしょうか。

そうですね 
**応用情報技術者試験**
の試験日です。

ということで今回は、応用情報技術者試験についての記事を………と行きたいところなんですが……
悲しいことに社畜Sは**応用情報3連敗中**。
このままでは応用情報についての記事が書けない………

そこで！今回はワンランク下になりますが、基本情報技術者試験に合格した際のおすすめサイトと学習法をまとめることで、これからIT系の資格に挑戦しようとする皆さんの助けになろうと思います。
ITパスポート、応用情報でも使える情報を書いていこうと思うので、良ければ参考にしてください！

## :checkered_flag:社畜Sのスペック（基本情報受験当時版）<br> 
受験当時は専門学生でした。スペックをどうぞ。
> 所持資格➡ITパスポートのみ取得。あんまり関係はないが、MOS（PowerPoint、Excel）も取得していた。基本情報を取ってすぐにセキュリティマネジメント試験も合格。
> ITについての知識➡ITパスポートの勉強と専門学校での学習でちょっとだけ詳しくなっていた。

こんな感じでした。~~なんだか今とそこまで変わってない気がしますね………~~
この頃はITパスポートに合格したのと、専門学校に入学したのもあってそれなりに勉強のモチベーションがありました。
学校でもどっちも受けたら？という感じだったので、何を血迷ったのかセキュリティマネジメント試験と同時進行で受験しました。
セキュリティマネジメント試験の話は、またおいおい……

## :checkered_flag:これだけは絶対にやっとけ！！！！！！！！
おすすめのテキストとか勉強方法とか色々あるんですが、まずこのサイトを紹介させてください
そのサイトとは…

**[基本情報技術者試験ドットコム](URL "https://www.fe-siken.com/")**　  

です！！！！！
有名なので、IPAの資格試験を受ける人ならもうすでに知っているかもしれませんね。
平成16年～からの過去問を**解説付き**かつ**一問一答形式**で解くことができる神サイトです。
しかも**全問無料**！！！！！（メンバーシップ制度に加入すればより快適に）

①基本情報技術者試験ドットコムの過去問道場を解く
②解説を読むだけではわからなかった問題をテキストで調べて理解する
③以後1～2の繰り返し
冗談抜きでこれだけで合格できます。私もこの二つしかしていません。


もうこれだけでも神なのですが、おすすめ参考書紹介ページや同じく基本情報を受験しようとしている人達と交流できる掲示板など、他のサイトであれば有料級のコンテンツをこれまた**無料**で使えちゃいます

人によってはテキストすら買わずにドットコムだけで合格できちゃうんじゃないでしょうか。
それくらいすごいサイトです。

さらにITパスポート版、セキュリティマネジメント試験版、応用情報版と、他のIPA試験にも対応しています。
これからIPA試験にチャレンジしたい人は絶対に利用したほうがいい神サイトです！！！！！

## :checkered_flag:学習法
①テキストを**ざっくりと**読んで理解を深める
②過去問道場を解いて解説を読む
③ある程度知識がついてきたら模擬試験モードでランダムに問題を解く
④最終手段はいつも通り暗記

私は上記の手順で学習しました。
①と②は人によっては順番を入れ替えて、問題を解いて解説を読んでもわからなかった問題をテキストで調べる…という流れでもわかりやすいかもしれません。
また、全部の年度分解くのは時間がいくらあっても足りない（１回につきA試験B試験合わせて80問近く出る）ので、過去5年分程度解くのが**個人的には**良いと思います。

セットで使うテキストはなくてもいいとは思いますが、もし買うのであればドットコムでも紹介されている「かやのき先生シリーズ」がとてもおすすめです！
イラスト付きでわかりやすいのはもちろん、「○○ときたら△△」といった感じにまとめをしてくれるのでかなり覚えやすいです。
私もITパスポートや基本情報の受験時にかなりお世話になりました。

勉強につかれたときは掲示板機能を使って同じ試験を受ける仲間たちに相談するのもアリかも？
## :checkered_flag:まとめ
というわけで、今回は基本情報技術者試験を学ぶ上でおすすめのサイトと学習法を紹介しました。
基本情報はITについて幅広い知識を学ぶことができる資格なので、これからITについて深く学んでいきたい！という初心者～中級者にお勧めしたい資格です！
難易度は少し高い（SAAよりちょっと上か下くらい？）と思うので、ハードルが高いなぁと感じる人はまずITパスポートから受けてみるのもいいかもしれません！
基本情報より浅い範囲にはなりますが、こちらも幅広い知識を身に着けられると思います！
もちろん、ITパスポート、セキュリティマネジメント試験でも今回紹介したサイトと学習法は活用できますので、ぜひ活用してください！

私も応用情報技術者試験がんばります！
Storekit2を使った課金処理でpending時の挙動をデバッグ＆テストする

## 概要
StoreKit2ではpurchaseの実行時、`Product.PurchaseResult`がレスポンスとして返却される。
その中の`PurchaseResult.pending`について、XCode上でのデバッグ及びStoreKitTestを用いたユニットテストを実装したのでその備忘録。

## pendingとは

何らかの事情により、購入が一時保留となり、承認後に購入が確定する状態のこと。

主に子どもがアプリ内課金で製品を購入しようとした際に、親や保護者の承認がないと通らないパターン。
アプリの性質上あまり該当者はいないと思うが、とは言え対応は必要。

## デバッグ方法
pending時には、保留ダイアログが表示される実装を行ったので、その動作確認を行う。

StoreKitConfigを使ってXCode上でデバッグ可能な状態にしてあるので、Configを設定する。

![スクリーンショット 2024-09-28 21.52.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66928/a23a6c00-4477-b5bf-941a-9391b2e16e28.png)

Purchase Options のAsk to BuyをEnabledにする

デバッグ用のアプリを起動し、課金処理を行うと承認を求める旨がダイアログで表示されるようになる

![スクリーンショット 2024-09-28 21.53.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66928/0c289a55-b0d9-b83d-2823-3d9535f200d7.png)

Askを選択。これで保留状態になり、`PurchaseResult.pending`が返ってくる、自前で実装したダ
イアログも表示されることが確認できた。

![スクリーンショット 2024-09-28 21.58.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66928/d643250e-85aa-46dd-c772-c0ee14031382.png)

実際に承認/非承認を行う際はXCodeで
Debug > Manage Transactions からpendingになっているトランザクションを選択し、赤枠のどちらかのボタンを押す。

![スクリーンショット 2024-09-28 22.00.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66928/936e7b4c-24a8-7aa7-ba23-e701211a3415.png)

なお、下記実装によりアプリ起動中にトランザクションを監視しているため、承認直後、購入完了状態が即座に反映される。
（復元ボタンは実装しているが、実際はこの監視によりユーザの操作はほぼ不要）

```Swift
func updatePurchasedProducts() async {
        for await result in Transaction.currentEntitlements {
            guard case .verified(let transaction) = result else {
                continue
            }
            
            if transaction.revocationDate == nil {
                //承認された場合、このスコープの処理が実行される。（トランザクションを終了させる）
                self.purchasedProductIds.insert(transaction.productID)
                await transaction.finish()
            } else {
                self.purchasedProductIds.remove(transaction.productID)
            }
    
        }
    }
    
    // アプリの外部で作成されたトランザクションの更新の監視。init時にこのメソッドを実行している。
    private func observeTransactionUpdates() -> Task<Void, Never> {
        Task(priority: .background) { [unowned self] in
            for await _ in Transaction.updates {
                await self.updatePurchasedProducts()
            }
        }
    }
```

## テスト

Ask to BuyをEnabledにする設定をStoreKitTestで書く場合、SKTestSession.askToBuyEnabledをtrueにするだけでよい

```Swift
final class PurchaseManagerTest: XCTestCase {
    
    var session: SKTestSession!
    var purchaseManager: PurchaseManager!

    // setUp関数でsessionを初期化しておく

    func testPurchasePending() async throws {
       
        session.askToBuyEnabled = true // この1行を書くだけ
        
        await purchaseManager.purchase(product)
        
        //...
    }
```

##まとめ
`PurchaseResult.pending`のデバッグ及びユニットテストの実装が問題なくできた。

アプリ内課金全般に言えることだが、やはりStoreKitConfigで簡単にデバッグ出来るのがありがたい。
CmakeのAndroid用ビルドでNDKが見つからないと言われる時

## 状況
CmakeでAndroid用のビルドが必要なためAndroid StudioからNDKをインストールしたがNDKが見つからないと言われる。

## エラー内容
```
CMake Error at C:/Program Files/CMake/share/cmake-3.29/Modules/Platform/Android-Determine.cmake:217 (message):
  Android: Neither the NDK or a standalone toolchain was found.
Call Stack (most recent call first):
  C:/Program Files/CMake/share/cmake-3.29/Modules/CMakeDetermineSystem.cmake:184 (include)
  CMakeLists.txt:3 (project)


CMake Error: CMake was unable to find a build program corresponding to "Ninja".  CMAKE_MAKE_PROGRAM is not set.  You probably need to select a different build tool.
CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage
CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage
-- Configuring incomplete, errors occurred!
```

## 解決方法
環境変数に以下を追加
変数名
```
ANDROID_NDK
```
Path
```
C:\Users\<YourUser>\AppData\Local\Android\Sdk\ndk\{ndk-version}
```

## 所感
環境変数の書かれ方が何パターンかあるため使用するソフトでどれが優先されているか分からない。
Ninjaもないと言われてるが今回はNDKが通ってないために出ているだけで実際は問題なかった。
【基本情報】独学マラソン 情報セキュリティ Day 4

脳の可塑性を信じる

:::note worn
この記事は自分用の備忘録です。
:::



# IDS・IPSとは

### IDS (Intrusion Detection System)

- 不正侵入検知システムのこと
    - 不正アクセスを検知してくれる
        - 検知しかしない
            - つまり防御はしない
                - 通知は来る

### IPS (Intrusion Prevention System)

- 不正侵入防御システムのこと
    - 不正アクセスを防御してくれる

### IDS・IPSのそれぞれのメリット・デメリット

<table>
  <thead>
    <tr>
      <th>システム</th> <th>メリット</th> <th>デメリット</th> 
    </tr>
  </thead>
  <tr>
    <td> IDS </td> <td>ネットワークへの負荷が比較的低い</td> <td>検知だけなので対応遅れると怖い</td>
  </tr>
  <tr>
    <td> IPS </td> <td>リアルタイムでの自動防御が可能</td> <td>・システム負荷が高い<br>・正常な通信を誤ってブロックするリスクがある</td>
  </tr>
</table>

<br>

# 検知方法

### シグネチャ型

- 不正なアクセスパターンを登録し、合致した通信を不正と判断する検知方法
    - ブロックリストみたいなもの
        - ブロックリストに載ってないアクセスは検知できない

### アノマリ型

- 正常なアクセスパターンを登録し、異なる通信を不正と判断する検知方法
    - アクセス権限付与する感じ
        - ログイン時刻などで閾値を設定して判断
            - シグネチャ型と比べて誤検知が多くなるらしい

<br>

# IDS・IPSが機能する攻撃の種類


### Dos攻撃

- バルス祭りのやつ
    - 攻撃対象のWebサービスに大量のアクセスを集中させ、サーバダウンやサービス停止に追い込む
        - バルス祭りもほどほどに

### バッファオーバーフロー攻撃（BOF）

- 一時保存メモリー領域をオーバーフローさせる
    - 古いやつが消えて新しいやつが上書きされていく感じ
        - データ破壊、管理者権限乗っ取りなどにも発展するらしい



# 感想
- なんか昔詐欺サイトに対して「みんなでDos仕掛けてサーバー落とそうぜ」みたいなことで2chが盛り上がってたような‥
    - 不正指令電磁的記録に関する罪（刑法168条の2）
    - 電子計算機損壊等業務妨害罪（刑法234条の2）


# 参考

https://zenn.dev/mukanakazato/articles/b9a877f9e91ef4

https://it-trend.jp/ids-ips/article/explain
【AWS】AWS-SAA試験に向けてやったこと

## 使用した書籍やサイト
・[AWS認定SAA本](https://books.rakuten.co.jp/rb/16516852/)
・[ping-t](https://mondai.ping-t.com/g)
・[くろかわこうへい（youtube）](https://www.youtube.com/@TV-rp3gc)

## 受験までの期間
・２か月（１日：約１～２時間勉強のペース）

## 試験までの流れ
１．AWS認定SAA本をとりあえず一通り読んでみる。
　（クラウドの経験はなかったが、オンプレの経験があったので、オンプレでの置き換えで理解していった。
 　例：Route53　→　DNSサーバ、EC2　→　物理サーバ、EBS　→　HDD（SSD）など）

２．ping-tのWeb問題集を解いていく。（当時は約700問あった。）
　基本１０問形式で解いていくが、最初はその中でも、１問解いて→解説を繰り返して、解けることよりも、理解していくことに専念する。

３．くろかわこうへいさんの動画で各AWSリソースに関するものがあるので、そちらを参考に理解を深める。

４．ping-tの模擬試験で９割をコンスタントに取れるようにする。

５．peasonVUEで受験予約

６．試験

## 受験してみての感想
　クラウドの経験がない不安もありましたが、インフラに関する考え方は、オンプレ環境と似ている部分もあり、大きな壁に感じることはありませんでした。
 
　しかし、試験対策で今回もping-tの問題集を使用しましたが、問題数の割には、試験で問われている内容と違った印象がありました。
 では、どの教材が適しているのかについてですが、[CloudTech](https://kws-cloud-tech.com/)はオススメです。

理由は、現在AWS-SOA試験に向けて、私自身、このCloudTechを教材として使用しています。
問題数が少ない割には、試験の的を得た問題が出題されており（SAAを解いてみての感想）、解説も図を用いてわかりやすく、効率的な学習が行えると感じました。

もう一つやっておけば良かったと思うことが、AWSコンソールを使用して、ハンズオンに取り組めば、理解はさらに深まっていたと反省しています（笑）

是非、受験を考えている方の参考にしていただけると幸いです。
GEFORCE RTX4090の２本刺し

GEFORCE RTX 4090がコスパよろしということになり写真のように組みました。
4090はぶ厚いので２本させるケースがなかなかにない。冷却、静音を考えるとオープンケースにしたいところ。
結局、長尾製作所のケースを、６角スペーサー(M3ネジ60mmを１本、M4ネジ60mmを３本）で6cmもちあげて、補強バー30cmを斜めに2本入れてます。二本目はx４動作ということだが致し方ない（自分たちの研究では律速しないけど）。

Ryzen9950x
Crucial memory 32GBx4 
M.2 SSD2TB
チップセットX680E
[デュアル電源](https://note.com/solabou/n/n4ac721cf30aa) 1200W+750W

用途を考えそれなりにスペックを検討して購入したほうがいいかもしれない
[いろいろとベンチマークがあるので参考になる](https://www.gdep.co.jp/information/report/rtx-6000-ada-vs-rtx-a6000-%E3%83%99%E3%83%B3%E3%83%81%E3%83%9E%E3%83%BC%E3%82%AF%E9%80%9F%E5%A0%B1/)

1台目：
![geforce4090x2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482779/1ef599fc-fd00-2ab0-4834-88de132c5fcc.jpeg)

![20241002_152018.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482779/fc2830a5-6504-cbe9-61e6-543164f74634.jpeg)

2台目：
![kr2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482779/40e5397f-b788-93f8-c8d0-e365c951bbb4.jpeg)

[デュアル電源](https://note.com/solabou/n/n4ac721cf30aa) のメモ：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482779/7de192f7-b1ec-58d1-c96c-2dcaf0a1cd89.png)
LLMアプリ開発環境Dify入門 〜 VPSセルフホストの方法まで

# DifyでLLMが楽しすぎる！

遅まきながら、LLMアプリ開発プラットフォームのDifyに触れて夢中になっています。

Pythonが苦手でLangChainも未修。LLMは「**必要に応じてAPI呼んだらよくない？**」くらいに思っていたのですが、Difyに触れて、特にプロトタイピングには必須のプラットフォームだと痛感しました。

興奮にまかせて入門記事や、セルフホスト手順をまとめてみたので紹介します。

## Difyの何が嬉しいの？

Difyにはどんなことができて、何が嬉しいのか記事にまとめました。

https://notes.ideamans.com/posts/2024/dify.html

遠巻きに眺めるだけだった以前の自分に、「**Difyはよ使え！**」と諭したいポイントはこちら。

- **チャットボットメーカーじゃないの？**
    - 本質的にはビジュアルプログラミングができるワークフローエンジン
    - n8nとかZapierとか好きでしょ？自分
- **RAGを超簡単に実現**
    - 興味はありつつ、ベクトルデータベースの敷居が高かった
    - DifyだとWebクロールによるナレッジ構築も超簡単！
- **API連携も充実**
    - 自前APIもSwaggerでLLMと安定的にスキーマを共有できる
- **ログ・統計・API公開**
    - ゆくゆく必要だけど、実装するのは億劫な機能が最初から付いている
    - ロジック作りと検証に集中できる
- **モデル比較検証も簡単**
    - ChatGPTで検証したけどGeminiでもいけるかな？みたいな疑問も即座に確かめられる

# セルフホストする手順

Difyの有料プランは1ヶ月$59 (3アカウント)からですが、VPSなどでセルフホストすると、お安く思い切って使えます。

親切なことにLet's Encryptのcertbotも同梱されているので、少し手間をかければSSLで安全に利用できます。

何よりOSSアプリの展開や運用も楽しい！というわけで、Difyを実用的にセルフホストする手順をまとめました。

https://notes.ideamans.com/posts/2024/my-own-dify.html

## Firecrawlもセルフホストしちゃおう！

Dify自体はWebクローラーを内蔵しておらず、[Firacrawl](https://www.firecrawl.dev/)と[Jina Reader](https://jina.ai/reader/)に対応しています。

Firecrawlも無料プランがありますが、お安く同じVPSでセルフホストして、Difyと連携させる方法をまとめました。

https://notes.ideamans.com/posts/2024/my-own-firecrawl-for-dify.html

## Difyすごいぜ

Difyに触れて、初めて「**自分もAI失業ありえるな…**」と感じてゾクっとしました。

そのくらいDifyの短期間での仕上がりに圧倒されてしまいました。

自分もこうして啓蒙したりと、わずかですが貢献していきたいと思います。
rex0220 計算式プラグイン ボタンクリックでテーブル内項目の更新

計算式プラグインを使って、ボタンクリックでテーブル内項目の更新する例です。

# 概要

FSET 関数で、テーブル内項目を指定できるようになりました。
配列のループ処理ができる ARRAY_MAP 関数や、テーブルの集計関数の SUMIF 関数と FSET 関数を組み合わせて、テーブル内項目を更新できます。
※Ver.82 以降

「完了日時設定」で、作業ステータスが "完了"の場合、日時に現在時刻を設定します。
「完了日時設定2」も同様に作業ステータスが "完了"の場合、日時に現在時刻を設定しますが、計算式で使用している関数が異なります。

※計算式プラグイン Ver.82 以降で対応

![2024-10-04_08h10_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/85b1ed76-a598-38f6-616d-fef30ba5d8ab.png)

# 操作例

![2024-10-04_08h14_40.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/71227bfc-4a71-7ca3-2145-0debdfbfbf4f.gif)

# アプリ設定

スペース項目を追加します。
ボタン用にスペース項目を要素IDをつけて設定

![2024-10-04_08h18_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/f9609f76-1347-bb4f-60fc-6154e75153a0.png)


# 計算式プラグイン設定

- SP4: テーブル行のループ処理に ARRAY_MAP 関数を使用
    - テーブル内項目の「日時」を参照するには、SUBTABLE 関数が必要
    - 処理中のテーブル行位置は、idx
- SP5: テーブル行のループ処理に SUMIF 関数を使用
    - SUMIF 内で、テーブル内項目の「日時」参照する場合は、そのまま「日時」でOK
    - 処理中のテーブル行位置は、ROWNO(タスク)

![2024-10-04_08h16_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a08c1b75-6bc9-c2e7-87e7-3f08608a5782.png)

```.js
OPTION: 循環参照を許可

// SP4:(SP4) SPACER
BUTTON("完了日時設定",
  ARRAY_MAP(TARRAY(作業ステータス),x,idx,
     IF(AND(x="完了",SUBTABLE(日時,idx)=""),
       FSET(日時,NOW(),idx)       
     )
  )
)

// SP5:(SP5) SPACER
BUTTON("完了日時設定2",
  SUMIF(AND(作業ステータス="完了",日時=""),
    FSET(日時,NOW(),ROWNO(タスク))       
  )
)

```
python3 基礎試験 判定と繰り返しのメモ

# 1. `is` と `==`
```
if value is None:
```
```
if value == None:
```
このふたつがあったとき、
前者は value が Noneであるかを判定可能。
後者もほとんどの場合で正しく判定可能ではあるものの、 `is`での判定よりも時間がかかったり、`==`の動作を変更するようなことも可能。
よって、`valueがNoneであるかを判定する最適な方法`は`if value is None:`である。
# 2. range()関数
```
range(stop)
range(start, stop)
range(start, stop, step)
```
のいずれかで使用可能。
`stop は含まない (< stop)`
`start 省略 => 0始まり`
`step 省略 => 1ずつ増加`
# 3. dicに使えるメソッド
`items()` : key, valueをペアで取得。
`keys()` : keyのみを取得。
`values()` : valueのみを取得。
```python
data = {'key1':100, 'key2':200, 'lkey3':300}

for k, v in data.items():
    print(k, v)
```
の実行結果は
```
key1 100
key2 200
key3 300
```
となる。
# 4. sorted()関数
反復可能体から、昇順にソートしたリストを取得でき、文字列の場合にはアルファベット順になる。
```python
print(sorted("EAT") #['A', 'E', 'T']
```

# 5. reversed()関数
リストや文字列を逆順にしたオブジェクトを取得。
```python
reversed(['A', 'E', 'T'])   #['T', 'E', 'A']
```

# 6. zip()関数
複数の反復可能体から並列で要素を取得。
```python
for n, c in zip([1, 2, 3], ["1", "2", "3"]):
    print(c * n)
```
を実行すると
`n=0, c=0`から始まり、`n`は`[1, 2, 3]`のindex、`c`は`["1", "2", "3"]`のindexとして扱うため
```python
# n=0, c=0
"1" * 1 = "1"

# n=1, c=1
"2" * 2 = "22"

# n= 2, c=2
"3" * 3 = "333"
```
となり、結果は
```python
1
22
333
```
となる。
短絡演算 (Python)

Python3エンジニア認定基礎試験の勉強中です。
基礎の基礎を総復習...メモがわりに残していきます。
## 短絡演算
### 💡A and B
```
1. Aを評価し、その結果の真偽を判定する
2. 判定が「偽」であればBは評価せずにAの判定結果を返す
3. 判定が「真」であればBを評価し、その判定結果を返す
```
### 💡A or B
```
1. Aを評価し、その結果の真偽を判定する
2. 結果が「真」の時、Bを評価せずにAの判定結果を返す
3. 結果が「偽」の時、Bを評価し、その判定結果を返す
```
以下のようなコードがあった場合はどうなるか？？
```python
def num(value):
    return value

value1 = num(0) and num(1) and num(2)
value2 = num(0) or num(1) or num(2)

print(value1, value2)
```
### 💡andが複数続く場合
```
1. 左から順に評価していく
2. 最初に「偽」になったものが最終結果として返される
3. 「偽」になるものがないときは、一番最後の評価結果を返す
```
### 💡orが複数続く場合
```
1. 左から順に評価していく
2. 最初に「真」になったものが最終結果として返される
3. 「真」になるものがないときは、一番最後の評価結果を返す
```
:::note info
数値の場合
=> 「0」が「偽」、「0以外」が「真」
文字列、リストなどの場合
=> 「空」が「偽」、「空以外」が「真」
ユーザー定義クラスのインスタンスの場合
=> デフォルトは「真」、__bool__や__len__を定義することで変更可能
（公開後、ご指摘を受け修正、追記いたしました。）
:::
以上を踏まえて先ほどのコードの結果を見てみると

```python
value1 = num(0) and num(1) and num(2)

num(0) = 0 #False
```
① andが複数続く式なので、最初に「偽」となったnum(0)で評価を終わり、`value1 = 0`となる

```python
value2 = num(0) or num(1) or num(2)

num(0) = 0 #False
num(1) = 1 #True
```
② orが複数続く式なので、最初に「真」になったnum(1)で評価を終わり、`value2 = 1`となる

上記の①②より、このコードの実行結果は以下の通り。
```
0 1
```
30秒で読める｜JavaScriptのオブジェクトデータ型とは何か

## JavaScriptのオブジェクトデータ型とは
オブジェクトデータ型とは、キーと値のペアを格納するためのデータ構造を指す。

関数とデータを保持しておくコンテナのようなものだ。

オブジェクトは、プロパティ（キー）とその値を持つことで、さまざまなデータ型を格納できる。

…と言ってもいまいち掴めないので例をひとつ。

### オブジェクトの例

このように記述するものがオブジェクトデータ型だ。

```// personという名前のオブジェクトを作成
const person = {
  name: "太郎", // nameというプロパティに"太郎"という値を設定
  age: 30,     // ageというプロパティに30という値を設定
  job: "エンジニア" // jobというプロパティに"エンジニア"という値を設定
};
```
オブジェクトは、中括弧 {} を使って作成する。

### プロパティへのアクセス
もちろん、オブジェクト内の値を取り出すこともできる。

それにはまず、プロパティ（キー）にアクセスことが必要で、そのためにはドット記法もしくはブラケット記法を使用する。

```
// ドット記法を使ってプロパティにアクセス
console.log(person.name); // "太郎"と表示

// ブラケット記法を使ってプロパティにアクセス
console.log(person["age"]); // 30と表示
```

### プロパティの追加と変更

また、オブジェクトに新しいプロパティを追加したり、既存のプロパティの値を変更することもできる。

```
// 新しいプロパティを追加
person.gender = "男性";

// 既存のプロパティの値を変更
person.age = 31;

console.log(person); // { name: '太郎', age: 31, job: 'エンジニア', gender: '男性' }
Copy
```

### プロパティの削除

プロパティを削除することができる。
削除する場合は、delete演算子を使う。

```
// jobプロパティを削除
delete person.job;

console.log(person); // { name: '太郎', age: 31, gender: '男性' }
Copy
```

### まとめ
オブジェクトデータ型は、JavaScriptでデータを構造化し、複雑なデータを整理しやすくする手段の一つである。