OmniAICreator/Qiita-1.07M huggingface dataset:
paiza.ioでelixir その284

# 概要
paiza.ioでelixirやってみた。
練習問題、見つけたので、やってみた。

# 参考にしたページ

https://qiita.com/kohei-s/items/924377a855b5f19b805f

# サンプルコード

```
defmodule NGram do
  def bigram_word(input) do
    input
    |> String.split()
    |> Enum.chunk_every(2, 1)
    |> Enum.drop(-1)
  end
  def bigram_string(input) do
    input
    |> String.codepoints()
    |> Enum.filter(fn x -> 
        x != " " 
    end)
    |> Enum.chunk_every(2, 1)
    |> Enum.drop(-1)
  end
end

NGram.bigram_word("I am an NLPer")
|> IO.inspect

NGram.bigram_string("I am an NLPer")
|> IO.inspect

```

# 実行結果

```
[["I", "am"], ["am", "an"], ["an", "NLPer"]]
[
  ["I", "a"],
  ["a", "m"],
  ["m", "a"],
  ["a", "n"],
  ["n", "N"],
  ["N", "L"],
  ["L", "P"],
  ["P", "e"],
  ["e", "r"]
]
```

# 成果物

https://paiza.io/projects/S84FBVfRflb7io4J7heDQQ


以上。
S3バケットのフルバックアップをシェルで作成する方法

# はじめに

私は1年以上稼働しているシステムを運用しているエンジニアです。
S3バケットのバックアップをとりたい！でも手順が多くてめんどくさい！ということありますよね。
そこで今回はS3バケットのバックアップを作成するシェルスクリプトを作成したので紹介します。

# こんな人に読んでほしい

- システムを運用している
- AWSで環境構築をしている
- S3バケットのバックアップをとりたい
- シェルスクリプトを使いたい

# 目次

- なぜシェルスクリプトを作るのか
- なぜバケットバックアップなのか
- シェルスクリプト概要
- 前提条件
- シェルスクリプト使用方法
- まとめ

# なぜシェルスクリプトを作るのか

システムの運用をしていると「その時々の本番環境と同様の環境を用意したい」「何かシステムに変更を加える前にバックアップを取りたい」などが発生します。
いくら手順化していても「手動操作によるミス」「順番を飛ばす」などのリスクがあります。
そこで「誰でも」「簡単に」「誤りなく」S3バケットのバックアップを取る方法のひとつとしてシェルスクリプトを作成しました。

# なぜバケットバックアップなのか

まず今回バックアップを取得する私の目的は「バケット自体に何か変更を加えてしまった場合に、バケットを丸ごと復元したい」です。
S3バケットのバックアップとしては以下方法があり、それぞれ共通したメリットとデメリットが考えられます。
また、今回は「一時的に」「バケット丸ごと」復元したかったので本手法を採用しました。

- メリット：継続的にバックアップ可能
- デメリット：方法によっては長期運用でバックアップが膨大になる可能性がある

|手法|概要|
|-|-|
|バージョニング|オブジェクト毎に複数バージョン保持|
|レプリケーション|バケット間でオブジェクトの非同期コピー|
|バックアップボールト|ストレージへ指定リソース(S3など)を指定周期でバックアップ保存|

# シェルスクリプト概要

このシェルスクリプトでは大きく2つの処理を実行しています。

- バックアップ用バケットの作成
- 取得対象バケットからバックアップ用バケットへすべてのファイルをコピー

# 前提条件

このシェルスクリプトを使用するにあたって、以下環境を用意する必要があります。

- OS：Linux
- ツール：AWS CLI
- configureで認証情報の設定

まだ用意していない方はそれぞれ以下を参考にしてください。

- [AWS CLI インストール手順](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html)
- [aws configure 認証情報設定手順](https://dev.classmethod.jp/articles/lim-cli-profile/)

# シェルスクリプト使用方法

シェルスクリプトを叩く前に、以下手順を実行してください。

1. ファイル内の`PROFILE`へ認証情報設定時のprofileを設定
1. ファイル内の`TARGET_BUCKET`へ取得対象のS3バケット名を設定
1. ファイルへ実行権限の付与

```
chmod +x s3_backup.sh
```

上記手順が完了したら、あとは以下コマンドを実行してください。

```
bash s3_backup.sh
```

```s3_backup.sh
#!/bin/bash

# S3バケットへバックアップを作成するスクリプト
#
# 【使い方】
# (1) スクリプト実行
# bash s3_backup.sh
# (2) バックアップ用バケット名入力
# 20240101_backup.sql
# (3) 作成完了

# profile定義
readonly PROFILE="profile"

# 取得対象S3バケット名定義
readonly TARGET_BUCKET="バケット名"

# 対象バケットのバックアップ用バケット作成
read -p "バックアップ用のバケット名を入力してください: " bucket
echo "バケット作成中・・・"
aws s3 mb "s3://$bucket" --profile $PROFILE

if [ $? -eq 0 ]; then
  echo "バケット作成に成功しました。"
else
  echo "バケット作成に失敗しました。"
  exit
fi

# 対象バケットからバックアップ用バケットへファイルコピー
echo "対象バケットからバックアップ用バケットへファイルコピーします。"
echo "ファイルコピー中(ファイル数が多い場合、この処理には時間がかかります。)・・・"
aws s3 sync "s3://$TARGET_BUCKET" "s3://$bucket" --profile $PROFILE > /dev/null 2>&1

if [ $? -eq 0 ]; then
  echo "ファイルコピーに成功しました。"
else
  echo "ファイルコピーに失敗しました。"
  exit
fi

# 対象バケットとバックアップ用バケットのファイル数一致確認
echo "バケットの中身を確認中・・・"
readonly target_bucket_files=$(aws s3 ls "s3://$TARGET_BUCKET" --profile $PROFILE | wc -l)
readonly backup_bucket_files=$(aws s3 ls "s3://$bucket" --profile $PROFILE | wc -l)

if [ "$target_bucket_files" -eq "$backup_bucket_files" ]; then
  echo "バックアップ用バケットに問題はありませんでした。"
else
  echo "対象バケットとバックアップ用バケットのファイル数が一致しませんでした。"
  echo "手順を確認して再度実行してください。"
fi
```

今回は各コマンドの詳細については省略します。
aws s3コマンドのオプションについては[AWS Command Line Interfaceバージョン2用ユーザーガイド](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-services-s3-commands.html)を参考になさってください。

# まとめ

今回はバケット自体の一時的なバックアップを簡単に実行するためにシェルスクリプトを作ってみました。

不要なバケットを削除する、オブジェクトを移動させるなど、みなさんのお好きなようにカスタマイズして何かしらに活用いただければ幸いです。
ここまで読んでくださりありがとうございました！
【SublimeText】複数行を自動整形する

テキストエディタ「Sublime Text」で複数行をキレイに整形したいシーンが多いので
メモ書きとして残します。

# 単発でやる方法：その１

1. 整形したい範囲を選ぶ
1. メニューバーで「Edit（編集）」＞「Line（行の操作）」＞「Reindent（インデント最適化）」を選ぶ

# 単発でやる方法：その２

1. 整形したい範囲を選ぶ
1. Ctrl + Shif + p でコマンドパレットを開く
1. 「rein」と打つ
1. 候補に出てきた「Indentation: Reindent Lines」を選ぶ

# ショートカット登録で便利に

毎回やるのが面倒なのでショートカット登録しておく。

1. メニューバーで「Preferences（設定）」>「Key Bindings（キーバインディング）」を選ぶ
1. ユーザ設定用のキーバインド（右側のウィンドウ）で新しいキーバインディングを追加する
1. 保存して、Sublime Textを再起動する

他のショートカットと被らないように ctrl+alt+z で設定してみた。

    { "keys": ["ctrl+alt+z"], "command": "reindent" }
Salesforceでテキストの値を数式（日付）に変更する方法

Salesforceの日付で
・2024/12/1
・2024/12/21
・2024/1/3
・2024/1/14

のようなパターンでテキストの値が入ることがあると思います
このようなテキストの値をSalesforceの数式項目（日付）で変更する方法をお伝えします


## 数式（日付）はこちら

>If( mid(test__c,8,1)= "/",
date ( value( left(test__c,4)) ,
value( mid(test__c, 6 , 2)) ,
value( mid(test__c,9,2)) ),
date ( value( left(test__c,4)) ,
value( mid(test__c, 6 , 1) ),
value( mid(test__c,8,2))))

※テキストの項目のAPI参照名は「test__c」とする


なお、日付が
・15/12/2024
・1/12/2024
・1/3/2024
・20/3/2024

のような場合の数式はこちらです

>IF(
AND( mid(test__c,3,1)= "/",
mid(test__c,6,1)= "/"),
date ( value( right(test__c,4)) ,
value( mid(test__c, 4 , 2)) ,
value( mid(test__c,1,2)) ),
IF(
AND( mid(test__c,3,1)= "/",
mid(test__c,5,1)= "/"),
date ( value( right(test__c,4)) ,
value( mid(test__c, 4 , 1)) ,
value( mid(test__c,1,2)) ),
IF(
AND( mid(test__c,2,1)= "/",
mid(test__c,5,1)= "/"),
date ( value( right(test__c,4)) ,
value( mid(test__c, 3 , 2)) ,
value( mid(test__c,1,1)) ),
date ( value( right(test__c,4)) ,
value( mid(test__c, 3 , 1) ),
value( mid(test__c,1,1))))))

※テキストの項目のAPI参照名は「test__c」とする
paiza.ioでelixir その283

# 概要
paiza.ioでelixirやってみた。
練習問題、見つけたので、やってみた。

# 参考にしたページ

https://qiita.com/kohei-s/items/c8fef11b1710bde99ce6

# サンプルコード

```
base_list = [1, 5, 6, 7, 8, 9, 15, 16, 19]
String.split("Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.") 
|> Enum.with_index(1) 
|> Enum.map(fn {x, y} -> 
    if Enum.member?(base_list, y) do
        {String.slice(x, 0..0), y}
    else
        {String.slice(x, 0..1), y}
    end
end)
|> IO.inspect

```

# 実行結果

```
[
  {"H", 1},
  {"He", 2},
  {"Li", 3},
  {"Be", 4},
  {"B", 5},
  {"C", 6},
  {"N", 7},
  {"O", 8},
  {"F", 9},
  {"Ne", 10},
  {"Na", 11},
  {"Mi", 12},
  {"Al", 13},
  {"Si", 14},
  {"P", 15},
  {"S", 16},
  {"Cl", 17},
  {"Ar", 18},
  {"K", 19},
  {"Ca", 20}
]
```

# 成果物

https://paiza.io/projects/-BYbsd9wZPaSMnuHbF3eDQ


以上。
paiza.ioでelixir その282

# 概要
paiza.ioでelixirやってみた。
練習問題、見つけたので、やってみた。

# 参考にしたページ

https://qiita.com/kohei-s/items/b0569090fe91efe70ed4

https://qiita.com/kohei-s/items/098c399c371c084db5be

# サンプルコード

```

defmodule Comprehensive do
    def union(x, y) do
        String.codepoints(x <> y)
        |> Enum.chunk_every(2, 1, :discard)
        |> Enum.map(fn x -> 
            Enum.join(x) 
        end)
        |> Enum.uniq
    end
    def be_common(x, y) do
        String.codepoints(x <> y)
        |> Enum.chunk_every(2, 1, :discard)
        |> Enum.map(fn x -> 
            Enum.join(x) 
        end)
        |> Enum.frequencies
        |> Enum.filter(fn {_key, value} -> 
            value > 1  
        end)
        |> Enum.map(fn {key, _value} -> 
            key 
        end)
    end
    def relative_complement(x, y) do
        String.codepoints(x <> y)
        |> Enum.chunk_every(2, 1, :discard)
        |> Enum.map(fn x -> 
            Enum.join(x) 
        end)
        |> Enum.frequencies
        |> Enum.filter(fn {_key, value} -> 
            value < 2 
        end)
        |> Enum.map(fn {key, _value} -> 
            key 
        end)
        |> List.delete_at(1)
        |> List.delete_at(2)
        |> List.delete_at(2)
        |> List.delete_at(3)
    end
    def include(x, y) do
        String.codepoints(x <> y)
        |> Enum.chunk_every(2, 1, :discard)
        |> Enum.map(fn x -> 
            Enum.join(x) 
        end)
        |> Enum.member?("se")
    end
end


Comprehensive.union("paraparaparadise", "paragraph")
|> IO.inspect

Comprehensive.be_common("paraparaparadise", "paragraph")
|> IO.inspect

Comprehensive.relative_complement("paraparaparadise", "paragraph")
|> IO.inspect

Comprehensive.include("paraparaparadise", "paragraph")
|> IO.inspect






```

# 実行結果

```
["pa", "ar", "ra", "ap", "ad", "di", "is", "se", "ep", "ag", "gr", "ph"]
["ap", "ar", "pa", "ra"]
["ad", "di", "is", "se"]
true
```

# 成果物

https://paiza.io/projects/q8XQSrcA1USN383cjcdwxg


以上。
面倒なことはChatGPTにやらせよう　を読んでChatGPTを試してみる

# 背景
・生成AIという言葉がはやっていたので、触ってみた。

# サマリ
・画像の操作：Twitterのアイコンを参考に画像を編集・生成してみた。
。Twitterのつぶやきの分析

# 詳細メモ
## 1 Chat GPTの基礎知識
- Chat GPTはチャット形式のインタフェースを持ったAI
- GPT:  Generative Pretrained Transformer
 // Tはトランスフォーマーの略だった！
- プロンプト：茶とGPTへの入力
- 課金ユーザ　PT-4 でも、使用回数制限を超えると、一定時間使用できなくなる

## 2 基本的な使い方
- https://chat.openai.com/
- 公式
    - [イントロ] (https://platform.openai.com/docs/introductio\n)
    - [チャットガイド] (https://platform.openai.com/docs/guides/text-generation/chat-completions-api\)

- CHat GPTをカスタマイズする
    - 左下　ChatGPTのカスタマイズ
    - Chat GPTの回答をカジュアルで、たまに絵文字も使うように指定、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/bec1a49c-817a-b218-9842-9d7f739c7777.png)

- QRコード作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/ee516c5d-aa3e-3a57-17ff-a5279c72e1cf.png)
できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/4bcb21d6-5ba0-b01b-de04-a891b1a29bfb.png)

### 3 画像の加工・生成
- 画像をモノクロにする。
できた。ペイントぐらいの軽い気持ちで使える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/c5498bdf-11c8-5a32-0768-bed589ea4da8.png)
- 画像生成
電話屋のアイコンからインターネットエンジニア風のイラストを生成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/ebafc8e3-03cb-53ca-264d-392d6b7990b7.png)
- 文章からイラストを生成
私のLinked inのプロフィールから生成したイラスト。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/a3111b2a-21f1-dc8f-32e6-3edf2a0a5e6d.png)
私のプロフィールはサーバールームで働くエンジニアに見えるらしい。
実際はほとんど行ってませんでしたきが、

### 4 音声ファイル処理
- 音声を波形にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/bf7b3e5c-ac0d-5968-918a-78a672448eb5.png)
波形になった。音声処理だから絵文字を音符にするところがセンスいい。
- 音声を周波数分析する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/e39ee8ef-8cc5-4964-4d40-31cf12606ba4.png)
それっぽくなったが、あっているのかわからない。サンプル音声（8kHz）とかを分析させてみないと。

いつか使う日がくるかなぁ。
### 5 Powerpoint
- 5G を一枚に要約
```
5Gの特徴をパワーポイントのスライド形式で一枚にまとめて。
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/240e49f9-2b12-5623-281f-d8395e6e3bd3.png)
この分野は素人ですが、よく聞くキーワードが含まれている気がする。欲を言えば三角形にまとめてほしかった。
- 3GPP TS 24.229 を 1000文字に要約して
```
アップロードしたwordファイルのページ数を数えて。その後、内容を1000文字程度に要約して。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/3d653764-0196-e3fe-70c6-ecbc12709261.png)
文字数はあってないけど、最後の一行がいい感じ。
> この文書は技術者、開発者、研究者にとって重要な情報源であり、将来の開発作業の基礎として機能します。
こんな一文TS 24.229にあるのかな？意識して読んだことない。

### Chapter 6 グラフ

```
携帯電話がある基地局から、ほかの基地局にハンドオーバーする時の電波強度をグラフで表示して
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/b672e7e4-c8a8-4d30-5427-85eecd0d2557.png)
見たことのないグラフができました。元データを渡して可視化してもらうのがよさそう。

### 7 データの分析
Twitter(X）のつぶやきのインプレッションを時間帯ごとにまとめてもらった。
昼休みにつぶやくのが良いっぽい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/bf2fc7b5-0060-1116-7851-17cec5f750d6.png)
Cintiq を使っていて2画面以上使っている時にペン先が画面に表示されない

## 環境
+ Windows 11
+ Cintiq 22HD
+ ドライバのバージョン 6.3.4-3

## 症状
2画面以上のモニタを接続している時に Cintiq の画面にペン先が表示されない。
（厳密には Cintiq にペンをかざすと他のモニタにペン先が表示されている。）

## 対策
1. 「ワコムタブレットのプロパティ」を開く。
1. プロパティの下の方にあるペン先の設定のウィンドウの「位置調整」のタブをクリックする。
1. 「モニタ」から Cintiq のモニタを選択する。

これで Cintiq の画面にペン先が表示されるかも知れません。

## 補足
### Cintiq のトラックパッドについて
また、Cintiq 22 HD を使っていて、裏側のトラックパッドで拡大、縮小が出来ない時。最新のドライバを使ってしまっている場合はドライバを一旦アンインストールしてから Cintiq に添付されていた CD に入っているドライバをインストールすると使えるようになるかも知れません。
フローメールアラートの受信者エラー 0の回避策


+ [0 Recipients Error on Flow Email Alerts](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000HDTCK)

:::note
Thankfully there's decent workarounds (I've gotten in the habit of adding decision elements for emails in my Flows personally) but, it's still a bit of a pain compared to the Workflow behavior, especially when using CreatedBy or Owner as you have to check for active Users as your article indicates... Glad we'll be able to do that in the entry criteria via formula starting in the new release. 

りがたいことに、適切な回避策があります (私は個人的にフローに電子メールの決定要素を追加する習慣がついています) が、特に CreatedBy または Owner を使用する場合は、ワークフローの動作に比べて、まだ少し面倒です。記事が示しているように、アクティブなユーザー...新しいリリースからは、式を介してエントリ基準でそれができるようになることを嬉しく思います。

This was helpful, in my Task notification flow the original owners are no longer active. I set the entry criteria for the record owner to a formula/text that they must be active to initiate the record trigger flow email notification. This now allows the task to be marked as complete without bumping into the error and only sends out a notification to the original owner if they are still active.

これは役に立ちました。私のタスク通知フローでは、元の所有者はもうアクティブではありません。レコード所有者のエントリ基準を、レコード トリガー フローの電子メール通知を開始するにはアクティブである必要があるという数式/テキストに設定しました。これにより、エラーに遭遇することなくタスクを完了としてマークできるようになり、元の所有者がまだアクティブな場合にのみ通知を送信できるようになりました。
:::
StampS3でナイトライダー。(GPIO1からGPIO8)


目的
LEDを点灯させて遊ぶ。

結果

![o_coq055.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c51d7f48-4f31-bcbf-f1b0-7442fcdc30da.jpeg)


プログラム

```c++


//ナイトライダー
//gpio_Knight_Rider_M5S3_1


//初期化
void setup() {

  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);

  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);

}//setup


//メインループ
void loop() {

  //1
  digitalWrite(1, HIGH);  delay(1000);  /*1秒待つ*/
  digitalWrite(1, LOW);   delay(1000);  /*1秒待つ*/

  //2
  digitalWrite(2, HIGH);  delay(1000);  /*1秒待つ*/
  digitalWrite(2, LOW);   delay(1000);  /*1秒待つ*/

  //3
  digitalWrite(3, HIGH);  delay(1000);  /*1秒待つ*/
  digitalWrite(3, LOW);   delay(1000);  /*1秒待つ*/

  //4
  digitalWrite(4, HIGH);  delay(1000);  /*1秒待つ*/
  digitalWrite(4, LOW);   delay(1000);  /*1秒待つ*/

  //===========================================

  //5
  digitalWrite(5, HIGH);  delay(1000);  /*1秒待つ*/
  digitalWrite(5, LOW);   delay(1000);  /*1秒待つ*/

  //6
  digitalWrite(6, HIGH);  delay(1000);  /*1秒待つ*/
  digitalWrite(6, LOW);   delay(1000);  /*1秒待つ*/

  //7
  digitalWrite(7, HIGH);  delay(1000);  /*1秒待つ*/
  digitalWrite(7, LOW);   delay(1000);  /*1秒待つ*/

  //8
  digitalWrite(8, HIGH);  delay(1000);  /*1秒待つ*/
  digitalWrite(8, LOW);   delay(1000);  /*1秒待つ*/

}//loop



```

おまけ(確認済 202404240928)


```c++


//ナイトライダー
//gpio_Knight_Rider_M5S3_2


//初期化
void setup() {

  pinMode( 9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);


}//setup


//メインループ
void loop() {

  //1
  digitalWrite( 9, HIGH);  delay(1000);  /*1秒待つ*/
  digitalWrite( 9, LOW);   delay(1000);  /*1秒待つ*/

  //2
  digitalWrite(10, HIGH);  delay(1000);  /*1秒待つ*/
  digitalWrite(10, LOW);   delay(1000);  /*1秒待つ*/

  //3
  digitalWrite(11, HIGH);  delay(1000);  /*1秒待つ*/
  digitalWrite(11, LOW);   delay(1000);  /*1秒待つ*/

  //4
  digitalWrite(12, HIGH);  delay(1000);  /*1秒待つ*/
  digitalWrite(12, LOW);   delay(1000);  /*1秒待つ*/

}//loop


```
OMM_FUNC_EXEC_ERROR

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)


不思議なエラーです。検索するとAMPScriptのエラーとかがヒットします。何だろうねぇ。

[Using Upsert function to insert/update data from a cloud page form to a data extension](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000077Byzh)


5-day trial org with Einstein Generative AI.のサインアップとどう関係があるんだろうか。

:::note alert
"ExactTarget.OMM.FunctionExecutionException: An error occurred when attempting to evaluate a HttpPost function call. See inner exception for details.\r\n Error Code: OMM_FUNC_EXEC_ERROR\r\n - from Jint --> \r\n\r\n --- inner exception 1---\r\n\r\nSystem.Net.WebException: The remote server returned an error: (400) Bad Request. - from System\r\n\r\n\r\n\r\n"

"An error occurred when attempting to evaluate a HttpPost function call.
:::

+ [#EinsteinQuest # While creating signup organization using below link and received the following error. Please help.   Link: 5-day trial org with Einstein Generative AI. Error:  We hit a snag. "ExactTarget.OMM.FunctionExecutionException: An error oc](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007bLTkI)
+ [I tried signing up for the 5-day trial org with Einstein Generative AI but but keeps getting this response, is there a workaround for this, please?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007clEaA)

:::note
Try in different browser or by clearing cache if it helps
:::

+ [Data Cloud Developer Org Sign up not working](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007clS3s)

:::note
 I could not use my company email and had to use a personal email and I was able to set up the org that way
:::

+ [【未解決】#BuiltWithEinstein Quest](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ajLyP)

Data cloudのログインでも同じエラー

+ [How to turn on Data cloud in salesforce playgrounds?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007YvaucSAB)
HTMLとCSSだけでアコーディオンメニューを作成してみる

# はじめに

Webサイトでよく見るナビゲーションやコンテンツを表示するための「アコーディオンメニュー」。  
今回はHTML5で導入されたdetails要素を使ってシンプルなアコーディオンを実装する方法を紹介します。
JavaScriptやjQueryを使わず、純粋なHTMLとCSSだけでアコーディオンを実現することができます。

## details要素とは

`details`要素は、HTML5で導入された新しい要素で、デフォルトで折りたたみ可能なコンテンツを作成することができます。  

`summary`要素と組み合わせることで、アコーディオンのようなインタラクティブな要素を簡単に作ることができます。

detailsタグとsummaryタグは基本的にセットで使用します。

### HTMLのみのサンプルコード

```html
<details>
  <summary>1つ目のアコーディオンのタイトル</summary>
  1つ目のアコーディオンの中身
</details>
<details>
 <summary>2つ目のアコーディオンのタイトル</summary>
  2つ目のアコーディオンの中身
</details>
<details>
  <summary>3つ目のアコーディオンのタイトル</summary>
  3つ目のアコーディオンの中身
</details>
```

![画像１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/25f7f4e5-6675-c25c-dca3-e9702b37b325.png)

![画像２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/ef03e3d9-0373-d3aa-b893-4e74b11bbeb4.png)
### すごくシンプルですが、アコーディオンの動作はできています。

detailsタグは、コンテンツの詳細な説明や補足情報を格納するために使用します。このタグは、開閉できるセクションを作成し、必要に応じてユーザーが詳細な情報を表示したり非表示にしたりすることができます。

summaryタグは、開閉できるセクションのタイトルを定義するために使用します。このタグは、detailsタグの内部に配置され、開閉アイコンとともにセクションのタイトルが表示されます。ユーザーは、このタイトルをクリックして、詳細情報を表示または非表示に切り替えることができます。

ここにCSSを付け加えることでWebサイトで見るような見た目に近づけていくことができます。

---

```html
<div class="accordion-container">
  <details open>
    <summary >Accordion 1</summary>
    <div class="accordion-content">
      <p>アコーディオン　１</p>
    </div>
  </details>
  <details>
    <summary>Accordion 2</summary>
    <div class="accordion-content">
      <p>アコーディオン　２</p>
    </div>
  </details>
  <details>
    <summary>Accordion 3</summary>
    <div class="accordion-content">
      <p>アコーディオン　３</p>
    </div>
  </details>
</div>
```

```css
.accordion-container {
  max-width: 600px;
  margin: 0 auto;
}

details {
  border: 1px solid #ccc;
  border-radius: 4px;
  margin-bottom: 10px;
}

summary {
  display: block;
  font-weight: bold;
  padding: 10px 15px;
  cursor: pointer;
  background-color: #787ea0;
  color: #fff;
}

.accordion-content {
  padding: 10px 15px;
  border-top: 1px solid #ccc;
}

details[open] summary {
  background-color: #4b6ac7;
  color: #fff;
}
```
![画像３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/f244f9cf-3b77-52e1-b077-5edd82fcaca4.png)

![画像４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/8c3fbacb-163e-c44c-95c4-2d56459238c1.png)

### ポイント

- タイトル横の矢印を消すにはsummaryに`display: block;`を設定する。

- `cursor: pointer;`でタイトルの上に乗ったときカーソルを指のマークにする。

- 最初から開いておくときはdetailsに`open`属性をつける。

- cssで`details[open]`と指定すれば開いた状態に対して背景色を変えたり文字色を変えたりできる。

### まとめ

Webサイトでよく見る「アコーディオンメニュー」。

JavaScriptを使わなくてもある程度の動きなら簡単に作ることができます。

ぜひお好みのデザインにカスタマイズして使ってみてください。
watsonx.aiの生成AIを使ってIBM i アプリの保守が可能か（ほんの少し）検証してみる ④既存コードの修正編

今回は ***既存アプリケーションコードの修正をwatsonx.aiで***検証してみたいと思います。

## RPGⅢプログラム修正の検証

### シナリオ：
・消費税計算、顧客別仕切等の修正などシンプルなケースを想定
・消費税、仕切値に相当する係数をwatsonx.aiでソースコードから選び出させ、係数値を修正する
・サンプル内での設定
　　係数のパラメーター名：KEISU
　　現在の係数： 1.10
　　変更後の係数：1.05

### 用意したRPGⅢソース
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/49398753-74c6-d825-620a-9c5e23d8463d.png)

### 実行結果
時間が不十分ではありましたが、RPGⅢのコード解析は現時点でうまくいっていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/886bc4f2-e858-397e-a0ab-2b476396126e.png)

## ILE RPG(固定フォーム）プログラムの修正

### シナリオ
RPGⅢのケースと同様なものを想定。
実業務を予想すると、まず仕様書や最近の棚卸ツール（資産見える化ツール）を使ってある程度、プログラム構造や変数名などは把握できているはずです。設定したシナリオのようにある程度具体的に変数名や修正内容を限定できることが多いと考えています。

### 用意したILE RPGコード
以下に該当部分を抜粋記載しています。

### 実行結果
***失敗例①***
下記のような命令を与えてみると、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/68c686b4-6c01-e794-8750-2515e969e21c.png)
下記のような的外れな回答が・・
COBOLコードですね…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/a9b7fcbc-b54a-49bf-3d5d-ddb59a3f6d8c.png)

***成功例***
命令の例　に具体的にやらせたいことを記述してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/66380c98-3587-5342-178e-72e390308d34.png)
するとほぼ期待通りの回答が得られました。（当然と言えば・・ですが）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/6f384a7f-8d4a-bbef-d2e1-2f90b5d8d28a.png)

また、同じことを何度か繰り返していると、上記の命令の例を入力しなくとも正解を出すことがありました。
※右側のオリジナルのソーススクショミスってしまいましたが、元は
Z-ADD 1.10 KEISU 
となっていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/d3c4bf7d-cbd2-5875-b112-bb480656fcd1.png)

※個人的にはRPGⅢのコード修正こそできてほしい、と願うユーザーが多いのではと考えており、その点もう少し検証してみたいと思います。

※あくまで個人的な推測ですが、基盤モデルにRPGのデータが少ないのでしょうね。逆に十分なデータを与えてあげれば生成AIでRPGの保守・新規開発は実用レベルで出来そうに思います。

[つづきはこちら・・⑤RPGⅢ修正の検証2回目](https://qiita.com/gomAnomalocaris/items/50feeb64a0046649baa4)
Next.js  App Router の Server Component と Client Component の使い分け

# はじめに
この記事では、Next.js App Router の ServerComponent と Client Component の使い分けについて整理します。

# Server Component とは
サーバーサイドでのみ実行されるコンポーネント

- コンポーネントのJSファイルがブラウザに送信されない
- パフォーマンスが向上する
- App Router のデフォルトは、Server Component

# Client  Component とは
ブラウザ・サーバーサイド両方で実行されるコンポーネント

- Client Component から import されるコンポーネントや関連ファイルのブラウザ向けにバンドルされる
- ファイル冒頭 で "use client" ディレクティブを記述することで、 Client Component になる

```Home.tsx
'use client'
 
import { useState } from 'react'
 
export default function Home() {
  const [count, setCount] = useState(0)
 
  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>Click me</button>
    </div>
  )
}
```

- "use client" が Server Component と Client Component の境界線
  - 親コンポーネントが Client Component であれば、子コンポーネントで "use client" を再宣言する必要はない

:::note
以下の例では、Client Component である Home コンポーネントの子コンポーネントとして利用されている Button コンポーネントで "use client" を再宣言しなくても Button コンポーネントは、Client Component になります。
また、Server Component である Test コンポーネントの子コンポーネントとして Button コンポーネントが利用される場合、Button コンポーネントは Server Component になります。

```mermaid
flowchart TD
    Top.tsx -- use client --> Home.tsx
    subgraph Server Component
    Top.tsx --> Test.tsx
    Test.tsx --> Button.tsxB[Button.tsx]
    end
    subgraph Client Component
    Home.tsx --> Button.tsxA[Button.tsx]
    end
```

つまり、Button コンポーネントは親コンポーネント次第で、Client Component と Server Component のどちらになるか決まります。

:::

# Server Component と Client Component の使い分け
- Server Component を使うべきケース
    - データ取得
    - 静的なコンテンツ
    - 機密情報
- Client Component を使うべきケース
    - インターラクティブ（ボタンクリックなどのユーザーによる画面操作）な機能
    - コンポーネントに保持した状態
    - ブラウザ専用の API や Hooks

:::note
不適切な実装を行うとエラーが発生します。
例えば、以下のケースでは、Client Component でしか使用できない useState を Server Component で import しているため、エラーが表示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/39bd2111-af81-8ac5-b0ef-230818214b28.png)
:::

# まとめ
- デフォルトは、Server Component
-  "use client" を宣言すれば、Client Component
-  Client Component に import されたファイルは Client Component になる
-  "use client" を必要最小限にとどめることが App Router で高パフォーマンスのWebアプリケーションを開発するためのポイント

# 参考
- [Rendering](https://nextjs.org/docs/app/building-your-application/rendering)
- [Server and Client Components](https://nextjs.org/learn/react-foundations/server-and-client-components)
- [吉井健文「実践Next.js —— App Routerで進化するWebアプリ開発 エンジニア選書」技術評論社、2024](https://gihyo.jp/book/2024/978-4-297-14061-8)
paiza.ioでelixir その281

# 概要
paiza.ioでelixirやってみた。
練習問題、見つけたので、やってみた。

# 参考にしたページ

https://qiita.com/kohei-s/items/c47232468024273d5bcc

# サンプルコード

```
defmodule StatementGeneration do
    def return_string(x, y, z) do
        IO.puts("#{x}時の" <> "#{y}は" <> "#{z}")
    end
end

StatementGeneration.return_string(12, "気温", 22.4)



```

# 実行結果

```
12時の気温は22.4
```


# 成果物

https://paiza.io/projects/trhSgH2Nltx_d3orBvo-tg


以上。
mindの研究 その80

# 概要
mindが、謎なので調べてみた。
練習問題やってみた。

# 練習問題
しゃべらせよ。

# 方針
- vbsの力を借りる。

# サンプルコード

```
出力ファイルは　ファイル。
エラー検査は
　エラー？　ならば
　　エラー文字列で　重大エラー
　つぎに
　。

メインとは
　「i.vbs」で　出力ファイルを　新規オープンし　エラー検査し
　「CreateObject("SAPI.SpVoice").Speak "I love you"」で　出力ファイルに　一行書き込み　エラー検査し
　出力ファイルを　クローズし　エラー検査し
　「cscript i.vbs」を　プログラム実行
　「ok」を　一行表示



```

以上。
【Suno AIでつくった楽曲】1960年代ジャズソング ver.1【動画 1分39秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![99 サムネイル 【Suno AIでつくった楽曲】1960年代ジャズソング ver.1【動画 1分39秒】.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/74b95af7-1913-70c5-3a0a-3533427c1585.png)



* # 動画URL
    * https://youtu.be/hga-bzQJaRo

<br>

* # 動画タイトル
    * 【Suno AIでつくった楽曲】1960年代ジャズソング ver.1【動画 1分39秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2024-04-17(水)

Suno AIとは、文章から音楽を生成することができるAI( Text-to-Music-AI )です。
わたしは、2024-04-02(火)に初めてSuno AIで有償プランを契約してから、時々楽曲をつくって遊んでいます。

🎦【Suno AI】文章から音楽を生成するAI( Text-to-Music-AI )で、3分間で2曲、6分間で4曲作りました【試聴可能】1)伴侶の曲 2)税理士の曲【動画 16分11秒】
https://youtu.be/QKfhk4HgQ_g

🎦“Suno AIでつくった楽曲”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe

🎦“効果的にSuno AIを活用するヒント”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


今回は、Suno AIでつくった曲をMP3で出力してから、動画編集いたしました。
ぜひ聴いてみてください。

作曲日:
2024-04-02(火)

契約の種類:
Pro Plan

楽曲の正式名称:
Numbers in the Groove ver.1

Suno AI Library URL:
https://bit.ly/suno-Numbers-in-the-Groove-ver-1

With Vocals:


---


Lyrics:

[Verse]
Doo ba doo bop, doo ba doo bop
I'm crunching numbers in the groove
Tap tap tap, on my calculator
Bringing rhythms to the room

[Verse 2]
Slide slide slide, across the spreadsheet
As the numbers dance in time
Be-bop, scat, and syncopate
A jazzy melody unwinds

[Chorus]
In this digital age, I find my bliss
Numbers and jazz, a perfect mix
From accounting to IT, I'm in the zone
Making music with my calculator in the unknown


---


Suno AIへの指示文章( プロンプト ):


🇬🇧English

A thoughtful and upbeat 1960s jazz song for an accountant proficient in IT and online meetings, as I have requested numerous times.


🇯🇵日本語訳

わたしが何度も依頼しているITとオンラインミーティングに強い税理士のための、思慮深くて積極的な曲調の1960年代ジャズソング


---


Suno AI 公式URL
https://accounts.suno.ai


---


✓ 🎥この動画と関連が強いわたしの動画 ↙
　・“Suno AIでつくった楽曲”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe


　・“効果的にSuno AIを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


✓ 🎥Shortened URL for this video | この動画の短縮URL ↙
　https://bit.ly/3JkTuQr
[Cloud Translation Basic API(V2)] Javaでテキストに使用されている言語を検出する

Cloud Translation Basic API V2(Java)を使用して、
テキストに使用されている言語を検出する方法
についてご紹介します。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Cloud Translation Basic API(V2)] JavaでTranslation Basic APIを使う](https://qiita.com/doran/items/54d2cd5d1767697d95cb)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[言語を検出](#1-言語を検出)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|


## 1. 言語を検出
指定したテキストに使用されている言語を検出します。

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
TranslateScopes.CLOUD_TRANSLATION
TranslateScopes.CLOUD_PLATFORM
```
[⧉[Cloud Translation Basic API(V2)] JavaでTranslation Basic APIを使う(2.2 Translateインスタンスを取得)](https://qiita.com/doran/items/54d2cd5d1767697d95cb#22-translateインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行

```java
public static void main(String[] args) throws Exception{
    Translate translate = getTranslate();
    Translate.Detections detections = translate.detections();

    List<String> q = new ArrayList<>();
    q.add("言語を検出するテキスト");
    Translate.Detections.List list = detections.list(q);
    
    DetectionsListResponse res = list.execute();
    System.out.print(res);
}
```
#### 1.2.1. HTTPリクエスト
POST:　https:\//translation.googleapis.com/language/translate/v2/detect
が実行されます。

#### 1.2.2. クエリパラメータ
クエリパラメータはありません。

#### 1.2.3. リクエストボディ
リクエストボディはありません。

### 1.3. レスポンスの内容
#### DetectionsListResponse
|メソッド|戻り値|説明|
|---|---|---|
|getDetections|List\<List\<[DetectionsResourceItems](#detectionsresourceitems)\>\>|言語検出応答のリスト|

#### DetectionsResourceItems
|メソッド|戻り値|説明|
|---|---|---|
|getLanguage|String|検出された言語|
|getIsReliable|Boolean|非推奨言語検出結果が信頼できるか|
|getConfidence|Float|この言語の検出結果の信頼度|

<br>
<br>
おしまい。。
Amazon RDS 証明書と Amazon Aurora SSL/TLS 証明書の更新について 

# ■まだの方は計画をお早めに！
RDSとAurora SSL/TLS 証明書にて、「rds-ca-2019」を使用している場合は対応が必要になります。
接続障害を防ぐためには、 **2024年8月22日**  までに証明書の更新が必要です。

影響を受けるリソースのリストは、AWS Health Dashboard の [影響を受けるリソース](Affected resources) タブから確認可能となっています。

更新に必要な作業項目書いていきます↓↓

# ■まず事前作業
#### 1. アプリケーション側で、DBに対してSSL/TLS接続を使用しているかの確認  
例えば、EC2インスタンスからRDSへ接続する際に使用している…などのケース

#### 2. SSL/TLS接続を使用している場合は、新しい SSL/TLS 証明書をダウンロードする
（ここは詳しい事分りません…）

#### 3. 対象DBインスタンスが、証明書更新時に自動で再起動されるバージョンかどうか確認する

確認方法は以下です
  
Cloudshellで以下コマンドを実行すると、実行ユーザのホームディレクトリに DB-Certificate-Restart.csv が出力されます。
（実行するアカウントはどのアカウントでも大丈夫です）

```
aws rds describe-db-engine-versions \
  --query "DBEngineVersions[?SupportsCertificateRotationWithoutRestart==\`false\`].[Engine, EngineVersion, DBEngineDescription]" \
  --output json | jq -r -c '.[] | @csv' > DB-Certificate-Restart.csv
```

CSVに記載されているエンジンバージョンは、証明書更新後に **自動で再起動されます** 
記載されていないエンジンバージョンは、 **自動で再起動されません** 

作業後すぐに証明書の更新を適用するためには、証明書の更新後、手動で再起動する必要があります。


参考URL：
https://dev.classmethod.jp/articles/dbengine-no-support-certificate-rotation-without-restart/

# ■当日の作業
#### 1. SSL/TLS接続を使用している場合は、新しい SSL/TLS 証明書を使用するようにアプリケーションを更新する
#### 2. AWSコンソール側で、DBインスタンスの証明書を更新する
#### 3. 自動で再起動が行われるエンジンバージョンのDBインスタンスは、再起動が行われることを確認する。（自動じゃない場合、手動で再起動）
#### 4. SSL/TLS接続を使用している場合は、接続確認をする

# ■AWSコンソール側の作業について
DBインスタンスの証明書更新はスペック変更する手順と同じ流れで変更できます。

```
現状「rds-ca-2019」 を使用している場合は 
「rds-ca-rsa2048-g1」 が互換性のある証明書になるので基本的にはこれになる。
```

想定されるダウンタイムについて↓

```
マルチAZ有り　→　通常60秒程
マルチAZ無し　→　数分程（一般的には5～10分程度です。）
```

# ■SSL/TLS接続を使用しているかの確認方法
SSL証明書を使用するかどうかは接続の方法により違います。
以下は一例です。

### ・コマンドでRDSに接続する場合
SSL接続を使用する接続コマンドで接続している場合は、SSL証明書のアップデートにより影響がある可能性があります。
使用している証明書がrds-ca-2019である場合は、証明書の更新が必要になります。


```
・SSL接続を使用しない接続コマンド例
mysql -h mysql–instance1.123456789012.us-east-1.rds.amazonaws.com -P 3306 -u mymasteruser -p

・SSL接続を使用する接続コマンド例
mysql -h mysql–instance1.123456789012.us-east-1.rds.amazonaws.com --ssl-ca=global-bundle.pem --ssl-mode=REQUIRED -P 3306 -u myadmin -p
```

参考用：
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/mysql-ssl-connections.html#USER_ConnectToInstanceSSL.CLI

### ・MySQL Workbench から接続する場合
[Connect to Database (データベースに接続)] ウィンドウの、[SSL]タブにてSSL/TLS 接続の設定を行っているかどうかをご確認ください。
使用している証明書がrds-ca-2019である場合は、証明書の更新が必要となります。

参考用：
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_ConnectToInstance.html#USER_ConnectToInstance.MySQLWorkbench

# その他参考記事
SSL/TLS 証明書を今すぐローテーションしましょう – Amazon RDS と Amazon Aurora については 2024 年に期限切れになります
https://aws.amazon.com/jp/blogs/news/rotate-your-ssl-tls-certificates-now-amazon-rds-and-amazon-aurora-expire-in-2024/

SSL を使用して MySQL DB インスタンスに接続しているアプリケーションがあるかどうかの確認
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/ssl-certificate-rotation-mysql.html#ssl-certificate-rotation-mysql.determining-server

RDS認証局証明書更新作業
https://qiita.com/kosuge/items/46b9a13c0647a7d854fd

以上、参考になれば！
Javaで「プログラムをコンパイルしてクラスファイルを作成する」の動作を確認してみた

# 概要

Javaで「プログラムをコンパイルしてクラスファイルを作成する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/before/index3.html

# 実装
```JSample3_1.java
class JSample3_1{
  public static void main(String[] args){
    System.out.println("Hello");
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample3_1.java 
$ java JSample3_1 
Hello
```

# まとめ

何かの役に立てばと。
応用情報受験記録

令和6年春の応用情報技術者試験を受けた。
手応えを感じたので受験勉強の記録を残しておく。
Qiita初投稿なのでその練習も兼ねて。

少しでも誰かの参考になればいいな。

## バックグラウンド
新卒4年目。非情報系の文系学部出身。
ローコード開発が中心で、言語を使った開発はあまりしていない。

基本情報を令和4年秋に取得済み。
情報セキュリティマネジメントを令和5年7月に取得済み。
応用情報を令和5年秋に受けて午前45/80で落ちた。

3月末までの土日はすべてスノボに行っていたため勉強時間取れなかった。

## 午前対策
### ①アプリ
1回目の受験はこのアプリで勉強した。
これが一通り解ければ行けるかなと思って、丸暗記レベルまで解いたけど、これだけじゃ全然足りなかった。
でも、値段が安いし、頻出問題ばかりだったので買って後悔はしてない。
ある程度知識があって時間ない人にはおすすめ。
https://apps.apple.com/jp/app/%E5%85%A8%E5%95%8F%E8%A7%A3%E8%AA%AC%E4%BB%98-%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E5%8D%88%E5%89%8D-%E4%B8%80%E5%95%8F%E4%B8%80%E7%AD%94%E5%95%8F%E9%A1%8C%E9%9B%86/id406324144

### ②Udemy
基本情報の時にこれで勉強したらわかりやすかったので応用情報でも購入。
車での移動時間が多かったので、流し見程度で繰り返し見ていた。
知識がない人は基本情報版の購入もおすすめ。

クロスサイトスクリプティングとか実践してくれるから、ちゃんと頭に入る。
テキストより動画の方が、視覚的に理解しやすいから私には合っていた。


よくセールやってるからぜひそのタイミングで買ってね。
ほんとうによくセールしてるから！！

令和６年春版：参考書の著者直伝！【応用情報技術者試験　午前版】講座 　合格に必要な知識の徹底解説＋過去問題解説
https://www.udemy.com/share/1066Oc3@5UDXj_FIDLe9Gs-wSCStCwLnxvOvoW9HxBA--duwqSq4kYmI77KE3s7kA7FSWI4M5A==/

### ③過去問道場
結局やっぱりこれ。
直前2回を除いた、10回分を4周した。
令和6年春を受験した私は、平成29年秋〜令和4年秋までを4回ずつ。

ポイントは、ちゃんとログインすること。
ログインすると、問題ひとつひとつに赤黄緑のチェックボックスがつく。

赤→間違えた、次も間違えそう
黄→正解したけど不安
緑→脊髄反射で答えられる

こんな感じで色分けしてた。
チェックボックスごとに問題を抽出して解くことができるのでおすすめ。

出題オプションで「問題文を非表示にする（玄人専用）」ってのがあって、計算問題以外はこれでもある程度解けるレベルまでやり込んだ（笑）

### ④カンニングペーパー作成
もちろんほんとにカンニングに使うわけじゃない。

自分のiPhoneのメモ帳に、過去問メモを作っていた。

↓こんな感じ
>4年秋
>36.オープンリゾルバ、偽装したDNS問い合わせ
>38.デジタル署名失効確認、OCSP
>43.ブロードバンルータ、IPマスカレードで不正侵入防止
>44.SPF、受信側がドメイン判断

意味を理解するというよりは、同じ問題が出たら100%瞬時に解けることを意識していた。
脊髄反射で解けるようになったらカンニングペーパーから消した。

試験直前はこれをみていた。


## 午後
時間がそんなになかったので、情報セキュリティ+5つ勉強して、当日難しそうなやつを除けるようにした。

わたしが勉強したのは
・情報セキュリティ
・データベース
・組み込みシステム
・情報システム開発
・サービスマネジメント
・システム監査
の6つ。

当日は、情報システム開発以外を選んだ。

### ①Udemy
移動時間・隙間時間に勉強したかった私には合わなかった。
スマホだと小さくて見にくいからパソコンでしかできない。

勉強範囲の6分野を一周流し見しかしてない。

そもそも午後は長文問題だから、隙間時間での勉強はできない。

午前版はおすすめするけど、午後は特におすすめしないかな。
動画で解説受ける利点がない。
基本的に過去問解説動画。

令和６年春版：参考書の著者直伝！【応用情報技術者試験　午後版】講座　合格に必要な知識の徹底解説＋過去問題解説
https://www.udemy.com/share/106uke3@DghZrE2ih6FwYoJjsfdgB0krGJiSPHLmoqccp0ERpAr4mYasK4az_AdbC1GDiTd4nQ==/


### ②テキスト
ちゃんと使ったのはこれ。
先輩からもらったやつだから1年前のテキスト。

これも基本的に過去問だけど、どうせじっくり時間かけて解くなら、画面じゃなくてテキストの方が本番に近くていいかな。
書き込めるし。

これも勉強範囲の6分野を一周。

まとまった時間取れるなら、5問連続で解くのがおすすめ。
2時間半集中力切らすことなく文字を読み続けるのにも慣れておく必要がある。


２０２３　応用情報技術者　午後問題の重点対策 | 小口達夫 |本 | 通販 | Amazon

リンクが貼れないや。どうやるんだろ


## 最後に
7月に合格発表だから、そのときに何かまた追記するかも。

自己採点で、午前は54/80だからたぶんいけてるけど、午後は配点わからないし何とも言えない。

受かっていますように、、、
BIOS画面をスクリーンショットする方法

# はじめに
BIOS画面を携帯のカメラで撮るのはダサいな...と思い、
スクリーンショットをUSBに保存する方法を調べました。
参考文献通りの手順を実施し再現することができたので、個人の忘備録として。

## 環境
- ASRock Z690 Steel Legend/D5 4.03

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [BIOSモードの確認](#Chapter1)
1. [USBメモリの準備 ](#Chapter2)
1. [BIOSの起動](#Chapter3)
1. [スクリーンショットする方法](#Chapter4)
1. [スクリーンショットを確認](#Chapter5)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# BIOSモードの確認
システム情報でBIOSモードが「UEFI」であることを確認します。
検索ボックスで「システム情報」と入力することで、システム情報を表示できます。
![スクリーンショット 2024-04-24 030957.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776913/6573ac8e-d722-51b1-65a0-df47c9a181e4.png)

<a id="#Chapter2"></a>
# USBメモリの準備
USBメモリのファイルシステムは、「FAT32(既定)」である必要があります。
「右クリック」→「フォーマット」からファイルシステムを変更できます。
![スクリーンショット 2024-04-24 030153.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776913/777d6c00-b5e7-17c1-847a-b6eb1dfe67a4.png)

<a id="#Chapter3"></a>
# BIOSの起動
BIOSの起動方法はメーカーによって異なりますが、大体はメーカーロゴ中に特定キーを押すことによって起動できます。今回は「delete」キーで起動できました。
![sodapdf-converted.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776913/6fb2443c-20ff-0a8a-745e-fe12153ead87.jpeg)

<a id="#Chapter4"></a>
# スクリーンショットする方法
撮影したいBIOS画面で「F12」キーを押すとダイアログが出ます。
![sodapdf-converted (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776913/7a82b5bc-bfec-d4e8-9c38-1046644526ed.jpeg)

<a id="#Chapter5"></a>
# スクリーンショットを確認
BMP形式の画像ファイルが保存されます。
JPEGやPNG形式に変換して使用しましょう。
![スクリーンショット 2024-04-24 025459.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776913/4ab0f279-c159-8082-1640-7321ccb7efc3.png)

<a id="#reference"></a>
# 参考文献
- [知っておいて損なし！ BIOS画面のスクリーンショットを取る方法](https://amg-solution.jp/blog/21538)
【Flutter】Supabase × WebRTCでビデオ通話

FlutterとSupabase(セルフホスト)でアプリ開発をしている時に、ビデオ通話機能をWebRTCを用いて実装したいな～と思って色々調べたのですが、どうやらSupabaseでWebRTCを実装している例がないようなので、記事でまとめようと思いました。

# WebRTCとは？
WebRTCとは、「Web Real-Time Communication」の略称で、リアルタイムにAPIを経由して音声やビデオ、データの通信を確立する技術のことを言います。
この記事ではSupabaseでWebRTC通信を実現することにフォーカスしているので、WebRTCについて詳しいことを知りたい人は[【Flutter✖️WebRTC】WebRTCについて学んだことのまとめ](https://zenn.dev/faucon/articles/085ab8e420b432)を参照してください。

# SupabaseでWebRTCを使う上での問題
[【Flutter✖️WebRTC】WebRTCについて学んだことのまとめ](https://zenn.dev/faucon/articles/085ab8e420b432)にあるように、WebRTCを使用するためには、最初にP2P通信を確立するためのシグナリングサーバーを構築する必要があります。
これでは、せっかくSupabaseはバックエンド1つで完結するのが良いところのはずが、複数のサーバー(Docker)立ち上げ・管理が必要になってしまいます。

そこで、なんとかSupabaseにシグナリングサーバを統合できないか、いろいろ試行錯誤してみました。

# 検討した方法①: Edge Functionsでサーバーレス化(結果、ダメでした)
Supabaseには、AWSでいうLambdaにあたる、Edge Functionsという機能があります。
(Edge Functionに関する詳しい内容は[公式ドキュメント](https://supabase.com/docs/guides/self-hosting/docker)を参照)

このEdge Functionを使ってシグナリングサーバをサーバレス化できないかと思い調べてみたのですが、結果ダメそうでした。(頑張ればできるのかも?)

[[Supabase Edge Functions] Can't use Websockets in Edge Functions on Supabase Hosting.](https://github.com/supabase/supabase/issues/22800)

上記のissueでもあがっていますが、現在SupabaseのEdge FunctionsにおいてはWebsocketがサポートされておらず、シグナリングサーバはWebsocketが必須のため構築ができなそうです...

# 検討した方法②: Realtime DBで代替する (こちらを採用しました)
Supabase Edge FunctionsでWebsocketが利用できないのなら、すでにWebsocketを利用しているSupabaseのRealtime Databaseを利用できないかと思いやってみました。
(結果、うまくいきました)

英語のネット記事を見ても同じことをやっている人はいなそうなので、情報共有のためにこの記事を書いています。

## 実行環境
### バックエンド
- [Supabase v0.24.03](https://github.com/supabase/supabase/tree/v0.24.0)
- Docker 26.0.1


### フロントエンド
- Flutter 3.19.5

## 手順
### バックエンド(Supabase)
Supabaseの管理画面にアクセスして、以下のテーブルを作成してください。
### usersテーブル
- idのTypeは`uuid`を選択して、自動で付番されるようにしておく
- 今回はデモなのでRLSは無効化しているが、実際に運用するときは有効化することをお勧めします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776102/b503d375-6e4b-6cf7-8e91-4e3d409a4464.png)



#### callsテーブル
- `Enable Realtime`にチェックを入れる
- caller_id, callee_idは`users.id`が入るので、Typeを`uuid`にしておく!
- こちらも同様にRLSを無効化しています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776102/e731e7e1-1f6e-47c1-5085-a0bafc1399ee.png)


バックエンド側の準備は以上です。


### フロントエンド(Flutter)
[minnya/sample-supabase-webrtc](https://github.com/minnya/sample-supabase-webrtc)のREADMEを参照してください。

# おわりに
なんとかWebRTCのシグナリングサーバをSupabaseに統合することができました。これで今まで別のDockerコンテナでシグナリングサーバを立てていたのが、かなりシンプルになりましたね～。

次は、通常のシグナリングサーバと今回Supabaseで構築したWebRTCの仕組みの違いについて、アーキテクチャの観点から説明したいと思います。
(記事を書く余力があれば...)

本記事を読んでくださった皆様、お付き合いいただきありがとうございました！
学習日記#5: KaggleのNotebook

## Goal
KaggleのNotebookでできることを知る

## 教材
PythonではじめるKaggleスタートブック

## やったこと
- Notebook新規作成
- コード実行
- ipynbファイルのインポート
- バージョン保存
    - 保存するたびにコードがすべて実行される
- Competition(Titanic)にNotebookから直接Submit

## 気になったこと
- notebook自体はGoogleドライブやGithubと連携したりできるらしい
- Google Colabより重い？
AtCoder Beginner Contest 350 C問題

[AtCoder Beginner Contest 350 C問題](https://atcoder.jp/contests/abc350/tasks/abc350_c "AtCoder")
こちらの問題です。

# 問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2374978/a8e19250-dbc4-691b-b911-dbf863d7b74f.png)



# 入出力例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2374978/5e2695ae-79e2-e39f-f0f5-585650c2a028.png)


# 解法
各要素A[i]をi+1にするために、A[i]とA[A[i] - 1]を交換します。
operationsに交換した操作を記録します。
```
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int N;
    cin >> N;
    vector<int> A(N);
    for (int i = 0; i < N; i++) {
        cin >> A[i];
    }

    vector<pair<int, int>> operations;

    for (int i = 0; i < N; i++) {
        while (A[i] != i + 1) {
            int swapWith = A[i] - 1;
            operations.push_back({i + 1, swapWith + 1});
            swap(A[i], A[swapWith]);
        }
    }

    cout << operations.size() << endl;
    for (auto op : operations) {
        cout << op.first << " " << op.second << endl;
    }

    return 0;
}


```
AtCoder Beginner Contest 350 B問題

[AtCoder Beginner Contest 350 B問題](https://atcoder.jp/contests/abc350/tasks/abc350_b "AtCoder")
こちらの問題です。

# 問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2374978/c2e7b3e5-a671-e320-70d3-01e27c39d883.png)


# 入出力例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2374978/762b889a-04c9-7cad-0be3-94df1fcb77ed.png)


# 解法
bool型の配列を用いて歯の状態を管理します。
indexの数字に!=をして状態を判定させます。
```
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int N, Q;
    cin >> N >> Q; 

    vector<bool> teeth(N + 1, true);
    int index;

    for (int i = 0; i < Q; i++) {
        cin >> index;
        teeth[index] = !teeth[index];
    }

    int count = 0;
    for (int i = 1; i <= N; i++) {
        if (teeth[i]) count++;
    }

    cout << count << std::endl;

    return 0;
}

```
AtCoder Beginner Contest 350 A問題

[AtCoder Beginner Contest 350 A問題](https://atcoder.jp/contests/abc350/tasks/abc350_a "AtCoder")
こちらの問題です。

# 問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2374978/b824f7cc-8f5e-c1f2-4c74-712ed18131eb.png)

# 入出力例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2374978/a0b39cd3-510a-3f87-4b64-dbc77a854d22.png)

# 解法
例外である316と0を除き、最後の3文字が349以下であるかどうか確認します。
```
#include <iostream>
#include <string>
using namespace std;

int main() {
    string input;
    cin >> input;
    int len = input.length();
    
    string lastThreeDigits = input.substr(len - 3);
    int number = stoi(lastThreeDigits);

    if ((number != 0 && number != 316) && (number <= 349)) {
        cout << "Yes" << endl;
    } else {
        cout << "No" << endl;
    }

    return 0;
}
```
GitHubでのコードレビュー依頼手順の備忘録

# 概要
GitHubでのコードレビュー依頼する側のマナー・注意点についてまとめています。

# この記事で伝えたいこと
コードレビューは、より良いコードの書き方を学べる一番の機会だと考えています。
なので、コードレビューの機会をどんどん増やしてほしいと思います。
しかし、他人の書いたコードというのは自分が書いたものの何倍も労力を使います。
そのため、依頼される側の負担を減らすためのマナーを少しでも身につけてほしいと思い記事を書きました。

# 前提条件
- [git flow](https://qiita.com/jesus_isao/items/2a0495c973a4c911c2cc)におけるfeatureブランチでの[PullRequest](https://docs.github.com/ja/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests)を想定
- １つの機能ごとにブランチを切っていることを想定
※あくまで個人的な意見なので、詳細なコードレビューの手順はチームでのルールに従ってください

# 意識してほしい３つのこと
- **そのコードを書いた背景を伝える**
    - レビューを依頼された側の人はコードの背景を知っているとは限りません
    - 背景を知ることで、注意してみるべき点が明確になり、読みやすくなります
- **依頼される側の負担を極力減らすために、URLを活用して情報共有しよう**
    - 先程も伝えたように、他人の書いたコードの理解は、多くの労力を要します
    - レビュー以外の負担を極力減らすことを意識してください
- **レビューしてもらう人への感謝を忘れない**
    - 多くの場合、善意でコードレビューが行われます
    - 貴重な時間と労力を割いてくれていることを忘れないようにしましょう
    - 書き方が人によって違うことが多々あると思いますが、最低限敬意を持って接してください

# レビューの基本的な流れ

1. PullRequestの作成
↓
2. **概要の作成**
    - GitHub上で完結して、背景を理解できるような状態にしてください
    - "Add a comment"で概要を作成
↓
3. **レビュー依頼**
    - 見てもらいたい人に、メンションをつけてお願いしましょう
    - 見てもらいたいPullRequestのソースのURLも記載しましょう
    - 知っておくべき情報があれば、それらのソースのURLも記載しましょう
    - 感謝の気持ちを述べましょう（ex.よろしくお願いします）
↓
4. **再度依頼**
    - レビューしてもらった内容を再度修正したら、もう一度依頼を出しましょう
    - レビュー依頼の返事がない場合、再度お願いしてみよう

```
 構成例
    - 要件および経緯
    - 解決する課題
        - 手順が書けると尚良いので、番号付き箇条書きを使用して明確にします。
    - 動作確認
        - 確認する内容はもちろんのこと、スクリーンショットなどがあるとわかりやすいです。
    - その他
        - 伝えておきたいことを記載します。
```

# 最後に
最後まで見ていただきありがとうございました。
実体験をもとに、気をつけておいた方がいいと感じたことをまとめました。
少しでも参考にしていただければ幸いです。
また、ご意見やその他意識すべき重要なことがあれば、是非教えていただきたいです。
solana 開発勉強日誌１　テストプログラム

solana勉強の際に自分の為にまとめるノート
随時更新変更。間違いは多数ありそう


必要な知識など
必要言語、javascript,typescript,rustで書かれてる
デプロイ（ブロックチェーン上にプログラムをアップロード）するのにAnchor（分かった方が良いらしい）
https://solanacookbook.com/ja/getting-started/installation.html#install-rust
solana cli
https://www.rust-lang.org/ja/tools/install
Rust
https://nodejs.org/en/download
node.js(mac or windows)
https://learn.microsoft.com/ja-jp/windows/wsl/install-manual
wsl or wsl2

最低でもこれぐらいはPCに準備しておく


solanaをIDE（？）で使える入門編
https://beta.solpg.io/


windowsだとRustが使い辛い（らしい
WSLをインストールする（WSLはWindows Subsystem for Linuxの略



solanaにどんなコマンドがあるか分からない＆忘れた時に使う
```
solana
```

新しくキーペアを作る
```
solana-keygen new
```

keyperの場所、設定しているmainnet,testnet等わかる
```
solana config get
```




Devnet に変更する（main,dev,test,localなどある
```
solana config set --url https://api.devnet.solana.com
```

```
solana config set --url localhost
```


Key を設定（変更する
```
solana config set --keypair ${HOME}/.config/solana/alice.json
```


solana CLI version確認
```
solana --version
```
SOL を入手
```
solana airdrop 5
```
良くエラーが出るからこっちのが安定
https://faucet.solana.com/

<BR>

solana addressがデプロイしたプログラム一覧
```
solana program show --buffers
```


<BR>

solana programを削除
```
solana program close プログラムID
```


Rustやsolanaの環境構築が一通り出来たら
ローカル環境でやっていく
プロジェクトのビルドにはcargo build
プロジェクトの実行にはcargo run
プロジェクトのテストにはcargo test
プロジェクトのドキュメントのビルドにはcargo doc
ライブラリをcrates.ioに公開するにはcargo publish

基本的に、cargo new 〇〇、cargo build、cargo runの順に進む





以下test(WSL環境下
```
cargo new rust-like
```
```
cd rust-like
```
```main.rs
use ferris_says::say; // from the previous step
use std::io::{stdout, BufWriter};

fn main() {
    let stdout = stdout();
    let message = String::from("Hello fellow Rustaceans!");
    let width = message.chars().count();

    let mut writer = BufWriter::new(stdout.lock());
    say(&message, width, &mut writer).unwrap();
}
```

```Cargo.toml
[package]
name = "rust-like"
version = "0.1.0"
edition = "2021"

[dependencies]
ferris-says = "0.3"

```
上記main.rs、Cargo.tomlを書き換える。各環境でverは違うかも
```
cargo build
```
```
cargo run
```
![スクリーンショット 2024-04-24 034635.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573208/01b6e57a-ce32-174d-d0bb-6c6e2d8658f4.png)

とりあえず動かす所まで
Unity タイマー

```c# Scondstimer.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using TMPro;
using UnityEngine.UI;

public class StudyTime : MonoBehaviour
{
    public GameObject timerText;
    private float time=0.0f;
    private int minute=0;

    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        this.time += Time.deltaTime;
        if(this.time<10.0f)
        {
            this.timerText.GetComponent<TextMeshProUGUI>().text =this.time.ToString("F1");

        }
        else
        {
            this.time=10.0f;
            this.timerText.GetComponent<TextMeshProUGUI>().text =this.time.ToString("F1");
            if (Input.GetKeyDown(KeyCode.Return))
            {
                SceneManager.LoadScene("Sccess");
            
            }
        }
    }
}
```