OmniAICreator/Qiita-1.07M huggingface dataset:
Datastage on CP4D の開発及び運用について

## はじめに
- 本稿は、ETLフローをDatastage on Cloud Pak for Data（以下DS on CP4D）で開発し本番に適用するにあたり、開発と本番の環境差異を如何に吸収し、開発したフローを本番にスムーズに適用できるのかを検証したものです。
- あくまで検証したものであるため、必ずしも当該設定がすべての環境で稼働することを保証するものではありません。

## 開発から本番へETLフローを適用するイメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/7986d20c-4709-4831-1762-dd154a1cf432.png)


## 使用したコンポーネント
- Snowflake x 2（開発/本番想定のデータソースとして）
- DS on CP4D 4.8 x 2（開発/本番想定のETL環境として）
    - フロー（ETLの処理をGUIで開発）
    - [パラメータセット](https://dataplatform.cloud.ibm.com/docs/content/dstage/dsnav/topics/passing-values-from-param-sets-into-jobs.html?context=cpdaas&locale=ja)（変数部分）
- RHEL9 x 2 （DSのコマンドライン用端末として）
- [CP4D用コマンドラインツール](https://github.com/IBM/DataStage/blob/main/dsjob/dsjob.4.8.2.md)
- Github（ETLフローのCI/CD部分）


## 開発/本番環境にてETLフローを実行する際のイメージ
コマンドラインにて、実行環境のパラメータを変数に格納するように指定して実行します。
![スクリーンショット 2024-03-19 18.55.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/86684591-bd62-e3dd-0d60-3a2f7bcac978.png)



## 詳細

以下項目ごとに記事を分けて、準備方法を記載します。

1. Github 準備
2. 端末準備
3. CP4D 準備
4. Datastage開発
5. Git連携

Coming Soon...
[Flutter] Windowsでビルドして警告メッセージが文字化けするときの対処方法

放っといても別に問題ないと思うのですが、WindowsでFlutterのビルドをすると、Xlintの警告らしきものが壮烈に文字化けして読めなくなることがあります。

![スクリーンショット 2024-03-19 140209.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/ee2a3a0e-397e-d982-f12b-c2e46c99be64.png)

対処方法が分からずずっと気になってたんだけど、さっきChatGPTに聞いて解決しました。

　*環境変数JAVA_TOOL_OPTIONSに"-Dfile.encoding=UTF-8"をセットする。*

だそうです。

![スクリーンショット 2024-03-19 173957.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114010/343c1624-3857-7653-02c5-3735ec184db7.png)

ちなみにChatGPTは他にもいろいろ手順を示してくれましたが、全部その通りにやったらキーボードで文字入力ができなくなって焦った。環境変数の設定だけでいいみたい。
Pythonで「正規表現パターンを区切り文字として文字列を分割する(Pattern.split)」の動作を確認してみた

# 概要

Pythonで「正規表現パターンを区切り文字として文字列を分割する(Pattern.split)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/regex/index9.html

# 実装

以下のファイルを作成しました。
```sample.py
import re

msg = 'おはよう。朝食は、パン、チーズ、コーヒー、です。'
pattern = re.compile(r'。|、')

result = pattern.split(msg)
print(result)

for s in result:
    print(s)

import re

msg = 'おはよう。朝食は、パン、チーズ、コーヒー、です。'
pattern = re.compile(r'。|、')

result = pattern.split(msg, 2)
print(result)
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
['おはよう', '朝食は', 'パン', 'チーズ', 'コーヒー', 'です', '']
おはよう
朝食は
パン
チーズ
コーヒー
です

['おはよう', '朝食は', 'パン、チーズ、コーヒー、です。']
```

# まとめ

何かの役に立てばと。
20240318の日記 NVMe M.2 SSDのクローン、Desktop Window Managerがメモリとりすぎ、Qiitaの過去記事の編集

### UnitekのM.2/SSDクローンする機械
UnitekというメーカーのSolidForce+というやつ、モデルナンバーはS1222A

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740499/12369e34-2445-d525-02d0-974e6d119f40.png)

M.2⇔SATAのクローンができるやつ
ほんとはM.2⇔M.2が欲しかったけど高かったので断念
なんか自分のPCのSSDは対象外の規格みたいで動かなかった残念すぎる

### Desktop Window Managerがまた凄いことに
PCが異常に重くなって5分に一回マウスの位置が移動する、みたいな状態になった
しばらくしたら３０秒に一回くらいまで落ち着き、さらに５秒に一回くらいになったので、アプリをどんどん閉じていたら、こないだ直したと思ったWindow Managerのメモリ使用料がまた8G超えていたのに気づいた、もしかして治ったつもりで全然治ってなかったとか、、、ありうる
あまりにも重くてスクショもとれなかった

参考：[対処法：デスクトップ ウィンドウ マネージャーのメモリ使用率が高い](https://jp.easeus.com/partition-manager/desktop-window-manager-high-memory-windows-11.html)

1. 最新のIntelドライバーにアップデートする
Dellのに準拠できなくなるかもしれないが、Intelの最新ドライバーにアップデートする
[インテル® ドライバー & サポート・アシスタント](https://www.intel.co.jp/content/www/jp/ja/support/intel-driver-support-assistant.html)
1. 「視覚効果」をパフォーマンス最優先にする
スタートボタン→歯車の「設定」→システム>バージョン情報→「システムの詳細設定」→「パフォーマンス」→「パフォーマンスを優先する」→（以下だけチェックをつける）→「OK」
    * アイコンの代わりに縮小版を表示する
    * スクリーンフォントの縁を滑らかにする
    * デスクトップのアイコン名に影をつける

ちょっと様子見

### Qiitaの過去記事の編集
どうやるの？と思ったがわかれば簡単、
1. 対象の記事を開く
1. 左側のパネルにある「…」をクリック（下図の一番下）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740499/918edde7-3bf7-1854-d9ab-09bd52d3ea60.png)<br>
<br>
3. メニューが開くので「編集する」をクリック 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740499/79d07eff-ffb3-3224-07e1-0797cc4a1cec.png)

これだけです

編集するの前に鉛筆アイコンをつけたかったけど、絵文字の鉛筆は✏となって見栄えがよろしくないし、fontawesomeも使えない
🖋️✒️🖊️🖌️🖍️ 使えそうなのもあるな
大きめのmp3ファイルをGoogle Speech-to-Text でChirpモデルで書き起こす(Python)

# 前提
- mp3ファイルをGoogle Speech-to-Textで書き起こします
- 1時間以上長めのmp3ファイルを想定します

## モデルはChirpを使います

なんか `Googleの次世代のSpeech-to-Textモデル` らしいのでこれを使います.
モデルの違いによる[課金体験の違いなどはなさそう](https://cloud.google.com/speech-to-text/pricing?hl=ja) なのでいいモデルを積極的に使いましょう. 

https://cloud.google.com/speech-to-text/v2/docs/chirp-model?hl=ja


## 非同期音声認識(一括音声認識)を使います

https://cloud.google.com/speech-to-text/v2/docs/batch-recognize?hl=ja

> 60 秒を超える音声を文字に変換するには、非同期音声認識を使用します。短い音声の場合は、同期音声認識を使用したほうが早くて簡単です。非同期音声認識の上限は 480 分（8 時間）です。

ということなので一括音声認識(BatchRecognition)を使います.

> 一括音声認識では、Cloud Storage に保存されている音声のみ文字変換できます。音声文字変換の出力は、レスポンスにインラインで送信することも（単一ファイルの一括認識リクエストの場合）、Cloud Storage に書き込むこともできます。

今回はインラインで出力します.


# 実装

```py
from google.cloud.speech_v2 import SpeechClient
from google.cloud.speech_v2.types import cloud_speech
from google.cloud import storage
from google.api_core import client_options

def execute_speech_to_text():
    # GCSの gs://YOUR_BUCKET_NAME/mp3s/target.mp3 に対象mp3があるとします
    bucket_name = "YOUR_BUCKET_NAME"
    gcs_uri = f"gs://{bucket_name}/mp3s/target.mp3"

    # us-central1のapiを呼び出すためにclient_optionsを指定してclientを初期化します
    # https://stackoverflow.com/questions/76393336/calling-google-cloud-speech-to-text-api-regional-recognizers-using-python-clien
    client_options_var = client_options.ClientOptions(
        api_endpoint="us-central1-speech.googleapis.com"
    )
    client = SpeechClient(client_options=client_options_var)

    # chirpを指定
    config = cloud_speech.RecognitionConfig(
        auto_decoding_config=cloud_speech.AutoDetectDecodingConfig(),
        language_codes=["ja-JP"],
        model="chirp",
    )

    file_metadata = cloud_speech.BatchRecognizeFileMetadata(uri=gcs_uri)

    # chirp使うならlocationをus-central1を指定してください
    request = cloud_speech.BatchRecognizeRequest(
        recognizer=f"projects/YOUR_PROJECT/locations/us-central1/recognizers/_",
        config=config,
        files=[file_metadata],
        recognition_output_config=cloud_speech.RecognitionOutputConfig(
            inline_response_config=cloud_speech.InlineOutputConfig(),
        ),
        processing_strategy=cloud_speech.BatchRecognizeRequest.ProcessingStrategy.DYNAMIC_BATCHING,
    )

    operation = client.batch_recognize(request=request)
    print("Waiting for operation to complete...")
    response = operation.result(timeout=120)

    for result in response.results[gcs_uri].transcript.results:
        if len(result.alternatives) > 0:
            print(f"Transcript: {result.alternatives[0].transcript}")

    return response.results[gcs_uri].transcript
```

# 参考
https://cloud.google.com/speech-to-text/v2/docs/transcribe-client-libraries?hl=ja#python
【CSS】mask-imageプロパティで簡単にSVGの色変えができた

hover時、ナビのカレント時など同じアイコンで色だけ変えたいときに、別の色にした別画像で書き出すのが面倒で悩み続けてきました。
useタグを使う方法もありましたが、何故かうまくできず、、、
そこで出会った`mask-image`がかなり優秀だったので備忘録です。

# `mask-image`の使い方
基本的に`background-image`と同じように扱えます。
`mask-image`にSVGのファイルパスを指定し、`mask-position` 、`mask-repeat`、`mask-size`をそれぞれ指定します。

```scss:SCSS
.nav-item {
  display: inline-block;
  width: 32px;
  height: 32px;
  // mask関連の指定
  mask-position: center center;
  mask-repeat: no-repeat;
  mask-size: contain;
  mask-image: url(../img/icon-home.svg);
  background: navy; // 背景色でSVGの色を指定
  &--green {
    background: green; // 背景色でSVGの色を指定
  }
  &:hover {
    background: red; // 背景色でSVGの色を指定
  }
}
```
```html:HTML
<a class="nav-item"></a>
<a class="nav-item nav-item--green"></a>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304162/8d1de2d6-3476-8fa7-15b5-934a62940561.png)


`::befoer` `::after` にももちろん使えるのでかなり便利です！！
【CSS】<input type="file">は::file-selector-buttonでスタイルをつけよう

`<input type="file">`は直接スタイル指定ができず、デザインの変更
が面倒だったのですが、`::file-selector-button` を使えば簡単に指定できることを知ったので備忘録です。

# 使い方
<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="Pogoyye" data-user="himeka223" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/himeka223/pen/Pogoyye">
  ::file-selector-button</a> by himeka223 (<a href="https://codepen.io/himeka223">@himeka223</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

`::file-selector-button` にボタンのスタイルを設定するだけです！
-  「選択されていません（選択後はファイル名）」の文言のスタイルはinputの方で変更できます。
- `display: block;` を追加すればボタンとテキストの間で改行も可能です。


# すべてのブラウザで対応済み
既にすべてのブラウザで対応済みのようで、安心して使えます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304162/27d6fef6-b60b-9afd-eced-1a917d858c3b.png)

https://caniuse.com/?search=%3A%3Afile-selector-button

# テキストも変更したい場合は疑似要素をのせる

残念ながら `::file-selector-button` ではテキストは変えることができません。`::file-selector-button` は見えなくして、同じサイズの `::before` または `::after` にボタンのスタイルを指定して、文字をのせるしかなさそうです。

<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="JjVoVJa" data-user="himeka223" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/himeka223/pen/JjVoVJa">
  ::file-selector-button（テキストも変更したいとき）</a> by himeka223 (<a href="https://codepen.io/himeka223">@himeka223</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# ドロップエリアについて
デフォルトで「ファイル選択」ボタンにドロップすることが可能です。 
なので`<input type="file">`自体にドロップエリアのスタイルを指定するだけでドロップエリアが作成できます。

<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="mdgONZm" data-user="himeka223" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/himeka223/pen/mdgONZm">
  Untitled</a> by himeka223 (<a href="https://codepen.io/himeka223">@himeka223</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# 注意：サイズを固定しないと中央寄せはできない
ボタンのデザイン、テキストもなんとか変更はできました。
いろいろ試したけど、サイズを固定せずに、ファイル名の長さに関係なく中央寄せすることは不可能でした…。
あまりこだわったデザインは避けるべきだなと思いました。
駒大にLINE公式チャットBOTの利用率を向上させる方法を提案したこと　(画像あり)

提案内容：大学の公式LINEbotのメニューバーにwebサイトへ繋がるボタンを新たに追加することです。目的は駒大のチャットボットのpv数を増やすためです。
![駒大提案２.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457708/70b57e6a-3d9b-9922-deae-a689a6204954.jpeg)


提案した時期：大学4年次、2021年の秋ごろに提案、それまで半年ほど内容や構想、伝え方や組み込むウェブページの構成、同じようなものがないか市場調査などをしていました。

なぜ提案したか:留学後、何かしらの共同開発の前に技術ほぼなしながらもまず個人で何かITのジャンルで大きいことをしたかったためです。
そして自分のコミュニティを軸に、規模の大きいものから検討し、その中から提案可能で比較的自分の意見をそのまま通してくれやすそうなコミュニティを選びました。

手法：実際に交渉に使ったのはメールでした。電話や対面での説明ももちろん考えていました。
まず最初の提案手段をメールに選んだ理由は、メールなら忙しい職員の方でも、その場で電話などで雑な対応をせず、好きなタイミングで内容を確認し、空いた時間に反応をしっかりできる、丁寧な連絡が返ってくると考えたためです。
結果、メールでジャブ、話がすすめば電話や対面で本格的に話すという準備の流れを決めました。
仮に誰か同じようなことを提案して、ネットに情報をあげてない人がいる可能性もありましたが、それを確認するためにも、一度こちらから提案して反応をみるべきでは考えました。
また、自分がこの内容を１番先に提案したかったため、ざっくりサイトの概要を作り、それを見せる程度の粗さの提案になりました。

なぜ提案内容が有効そうだと思ったのか？：
理由は主に2つです。
①飲食店のメニューの書き方と同じで、一番見てもらいたいことは左上に載せる(1番最初に見られる所に見られたいものをおく)理論に当てはまってるのではと思い、需要がそれなりあるのではと考えたためです。
当時学内サイト内のクリックできる項目として1番上に、駒大公式チャットボットが載せてあり、学生に1番見せたいことなのではないかと考えていました。(ここで本当か確認とればよかったです)

②さらに、当時丁度駒大の公式ラインチャットボットが、活発に行動していたこともあり、大学の情報課内でもホットな話題で、アクセス数を増やしたいと考えているのではと私は予想していました。

デメリット
①入れ込むサイトの作りこみレベル低い、サイト詳細の完成度がいまいち
②本格的に情報部に提案するなら、急に提案されても困る感？



結果：結果的に大学から不採用でした。メールで。内容の流れに間違いはなかったようですが、一番大事な、チャットボットの利用率をか上げたいという需要がないとのことでした。
担当の方が会議まで話を持っていって頂けたようですが、そこでだめだったようです。(ほんとなのかわかりませんが)
今思えば、いくつかの社外関係者と取引する必要があるにも関わらず、それに対する大学側のうまみが少ないと考えられた可能性もあります。

当時の大学からの連絡内容:
![IMG_4188.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457708/684010b7-f703-143b-f211-828b5e542f31.png)



反省点：学生といっても、会社員への提案としては甘かった印象です。実際に会社の中の事情知らないと厳しいなと感じました。もし同じような提案事をやるなら、最初から関係者共同でやる状況になっておく必要があり、それら含め準備不足でした。
でも個人的には、ITジャンルでオリジナリティある大きい影響を与える経験ができたという自負が生まれ、今後のいい話の種にすることができ、今後ITの世界を勉強していく土台をつくることができました。
また過言ですが、この提案があったことで、その後駒大で、学生アイデア大会開催や広報担当者が駒大の学食の日替わりをインスタのストーリーであげるようになったのではないかと勝手に思っています。

今後は:次に個人的に何かITサービスを作るなら、相手の状況を掴みにくい意見箱のような一方的な提案ではなく、何かしらのサービス個人開発を頑張ろうと思いました。
現在は会計に関する、あるアプリを作成しています。(4.2024)
Soulagement de la douleur facilité : Essayez Tramadol 50 mg d'Apothekedirekte.

Expérimentez un soulagement efficace de la douleur avec Tramadol 50 mg d'Apothekedirekte. Notre médication de haute qualité offre un soulagement rapide de la douleur modérée à sévère, vous aidant à reprendre le contrôle de votre vie. Que ce soit pour des douleurs postopératoires ou des conditions de douleur chronique, nos comprimés de Tramadol 50 mg offrent un soulagement fiable, conforme aux normes pharmaceutiques. Avec Apothekedirekte, vous pouvez avoir confiance en une livraison fiable et discrète, garantissant que votre parcours de bien-être soit sans stress et sans problème. Faites le premier pas vers une vie sans douleur aujourd'hui avec les comprimés de Tramadol 50 mg d'Apothekedirekte

visit us - https://apothekedirekte.com/product/tramadol-50mg/
AWS Security Hubの新機能 ～セキュリティコントロールのカスタマイズ～

[AWS re:Invent 2023](https://aws.amazon.com/jp/events/reinvent-2023/)で発表されたAWS Security Hubの新機能の中から、個人的に気になった「セキュリティコントロールのカスタマイズが可能になった」というアップデートを確認してみたので、まとめてみます。

https://aws.amazon.com/jp/about-aws/whats-new/2023/11/customize-security-controls-aws-security-hub/

# AWS Security Hubとは
AWS Security Hubは、AWS環境全体のリソースに対してセキュリティのベストプラクティスをチェックしてくれるクラウドセキュリティ体制管理サービスです。
AWS ConfigやAmazon GuardDuty、Amazon Inspectorなど、様々なセキュリティサービスと連携しており、セキュリティアラートを集約して簡単に修復を加えることも可能となります。

https://aws.amazon.com/jp/security-hub/

セキュリティチェックの基準である**コントロール（AWS Config)の基準**を簡単に編集できるようになりました。

今まで、例外的に認めてる要件を許可するためには、無効化するか個別に設定する必要がありました。今回のアップデートで、**アカウントに閉じた範囲で簡単にカスタマイズすることが可能**になりました。

それでは、実際にカスタマイズしてみます。

# セキュリティコントロールのカスタマイズ
「80・443ポート以外のソースがAnyとなる通信は許可しない」というルールである以下の**Security groups should only allow unrestrcted incoming traffic for authorized ports**をもとに、カスタマイズが簡単にできるかたしかめてみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281098/57fa6209-f614-b21f-8bfe-e7cb9ed5be66.png)

以下のように、ためしに80・443以外のぽとからAnyの通信許可設定を入れてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281098/4029a6d8-628a-ca4e-67c8-efc943203945.png)

少し時間たつと、想定通り、以下のようにコンプライアンスステータスが**Failed**になって怒られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281098/f319717f-d2a7-1ad7-e8da-e7770b45d322.png)

そこで、指定したポートからの通信については、このルールで怒られないようにカスタマイズしてみます。

カスタマイズ可能なコントロールを選択すると、以下のように**パラメーター**というタブが表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281098/70bdbd61-418f-2cd1-a111-41a5cfabc807.png)

この**パラメーター**タブ内の、**パラメーターの編集**より、変更可能なパラメーターについては値を編集することができます。今回は、先ほどセキュリティグループに設定したポートを許可対象となるように追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281098/02f22d42-72ba-827a-a113-da399c10f0cb.png)

**オプション**からは、「変更の理由」も設定可能です。今までAWSに問い合わせがあった背景などが選べるようになったんですかね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281098/251858c5-0695-2d46-4e46-c20be6eac9a8.png)

カスタマイズ完了後に、先ほどのコントロールを見てみると、無事コンプライアンスステータスが「PASSED」になったことが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281098/0737894c-0f83-f92c-4f14-985ef9e668e6.png)

Findingsからも、許可するポートとして、カスタマイズした情報が反映されていることが確認できました。ワークフローステータスも**RESOLVED**に変更されていますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3281098/f1fb43d7-cc68-c2ce-2cd6-63ef64299831.png)

# まとめ
アカウント内に閉じた範囲内で、ルールの変更がとても簡単に実施できることが分かりました。
一方で、簡単にいじれてしまうため、社内ルールなども都合のいいように解釈されてしまうことがありそうなので、SCPなどで制限かけるといった対応が必要になるかもしれませんね。
KV-Nano 内蔵ｼﾘｱﾙﾎﾟｰﾄ　特殊ﾃﾞﾊﾞｲｽ一覧

範囲
CR 2CH 内蔵ｼﾘｱﾙ  CR6000~6115 Rと同じ表記
CM 600ﾜｰﾄﾞ  CM5000~5599  DMと同じ表記

ﾃﾞﾊﾞｲｽ一覧

CR6000:通信可能  R
CR6001:送信完了  R
CR6002:受信ﾃﾞｰﾀ読み出し要求
CR6003:処理ｴﾗｰ  R
CR6004:通信ｴﾗｰ  R
CR6005:ｼｰｹﾝｽｸﾘｱ完了
CR6006:設定ﾃﾞｰﾀｴﾗｰ  R
CR6007:ﾌﾞﾚｰｸ信号送信中  R


CR6100:通信許可  R/W
CR6101:送信要求  R/W
CR6102:受信ﾃﾞｰﾀ読み出し完了  ﾃﾞｰﾀの受信処理が完了したときON
CR6103:ﾃﾞﾌｫﾙﾄｾｯﾄ要求  ONするとCR6100の立ち上がりで設定をﾃﾞﾌｫﾙﾄ値に戻します．
CR6105:ｼｰｹﾝｽｸﾘｱ要求  R/W  送受信中にONすると通信を中断します．
CR6107:ﾌﾞﾚｰｸ信号送信要求



CM5001:送信ﾃﾞｰﾀ長さ  R/W
CM5002~CM5257 送信ﾃﾞｰﾀ  R/W

CM5258:受信ﾃﾞｰﾀ長さ  R
CM5259~5514 受信ﾃﾞｰﾀ  R

CM5515:ﾃﾞｰﾀ格納単位設定  R/W 0=ﾊﾞｲﾄ単位  1=ﾜｰﾄﾞ単位

CM5516:ﾓｰﾄﾞ設定  0=ﾉｰﾏﾙ  1=ﾚｽﾎﾟﾝｽ受信ﾓｰﾄﾞ 2=ﾊﾞｯﾌｧｸﾘｱﾓｰﾄﾞ

CM5517:ﾀｲﾑｱｳﾄﾁｪｯｸ時間設定  R/W 0=ﾁｪｯｸしない  0<>ﾁｪｯｸする

CM5518:送信ﾍｯﾀﾞ設定
CM5519:送信ﾃﾞﾘﾐﾀ設定

CM5520:受信ﾍｯﾀﾞ設定
CM5521:受信ﾃﾞﾘﾐﾀ設定

CM5522:受信ﾃﾞｰﾀ長さ設定 0=512byte or 256word
セキュリティの重要性と基本原則


## イントロダクション

こんにちは！エンジニアのM.Y.です！！

エンジニアと切っても切れないテーマ、セキュリティについてです。

社内の注意喚起で使用されたスライド資料を公開します！

(本資料は社内共有用に作成された資料です。あくまでも参考情報としてご利用ください。)

また、補足情報として

*  セキュリティがなぜ注目されているか？
*  セキュリティの基本要素
*  セキュリティクリアランス

について簡潔に分かりやすく紹介させて頂きます！

## セキュリティ喚起スライド

<iframe src="https://docs.google.com/presentation/d/e/2PACX-1vRASEY4TnSGdcDl-Y3bnA3bqgsC2bnQBsxZJJF_O-il0-LALoyllwQpq-oThGI3IaCu8BxOsre08GDM/embed?start=false&loop=false&delayms=3000" frameborder="0" width="960" height="569" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>

## セキュリティがなぜ注目されているか？
近年、セキュリティに関する話題を耳にする機会が増えてきたのではないでしょうか？その理由は何でしょう？

理由は単純で、サイバー攻撃による被害が年々増加しているからです。

[総務省のデータ](https://www.soumu.go.jp/johotsusintokei/whitepaper/ja/r05/html/nd24a210.html)からもサイバー攻撃が年々増えていることが読み取れます。

### サイバー攻撃が増えている原因

サイバー攻撃が増えている原因は、さまざまな要因が複合的に絡み合っています。

主な原因としては、以下のようなものが挙げられます。

*  インターネットの普及
*  テレワークの普及
*  クラウドの利用拡大
*  攻撃ツールの高度化

また、サイバー攻撃の約7割はソーシャルエンジニアリング、ヒューマンエラー、悪意のある内部者による不正行為等の人的要因によるものだそうです。[参考](https://www.verizon.com/business/resources/reports/dbir/)

サイバー攻撃を防ぐには一人ひとりが意識を持ってセキュリティ対策に取り組む必要があります。


## セキュリティの基本要素
情報セキュリティの基盤となるのが、3大要素と4要素です。

これらは情報セキュリティを包括的に捉えるのに重要な概念で、バランスよく保つことで、より強固な情報セキュリティ体制を構築することができます。


### セキュリティ3大要素

情報セキュリティの3大要素は、以下の3つです。
3大要素は聞いたことがある方も多いかと思います。

* **機密性**：情報のアクセスを許可されたユーザーのみがアクセスできる状態を維持すること
* **完全性**：情報が正確かつ完全な状態を維持すること
* **可用性**：必要な時に必要な情報にアクセスできる状態を維持すること

### セキュリティ4要素

近年、3大要素に加えて以下の4要素も重要視されています。

* **真正性**：情報が本物であり、改ざんされていないことを確認すること
* **責任追跡性**：誰が情報にアクセスし、どのような操作を行ったかを追跡できること
* **否認防止**：情報へのアクセスや操作を否定できないようにすること
* **信頼性**：情報システムが信頼できる状態を維持すること

エンジニアとしては、システムの「要件定義」「設計」「実装」「テスト」「リリース」「運用」の全工程でセキュリティ対策を考えておきたいですね。([DevSecOps](https://www.nri-secure.co.jp/glossary/devsecops)の考え方)

## セキュリティクリアランス

2024年4月9日、「セキュリティクリアランス」制度の創設に向けた法案が衆議院本会議で賛成多数で可決されました。

簡単に説明すると、「信頼できる人かどうかをチェックする制度」です。

信頼できる人だと判断されれば、その信頼度に応じて、国家安全保障に関わる機密情報にアクセスできるようになります。

### セキュリティクリアランスの考え方

セキュリティクリアランスは国家安全保障に関するものですが、セキュリティクリアランスの考え方は企業においても重要な考え方です。

* 部長が部下のアカウント・パスワードを使用する
* パートナー企業に過剰なアクセス権限を与える
* セキュリティリテラシーが低い社員が本番環境のDBにアクセスできる状態になっている

などなど、セキュリティクリアランスの考え方は当たり前なものですが、意外と守れてないことも多いのではないでしょうか？

場合によっては、同じ「部長」という役職でもセキュリティリテラシーによってアクセスできる情報に差をつけた方が良いかもしれません。

## まとめ

セキュリティは年々重要度が高まっており、技術面と人的側面の両方から対策を講じることが不可欠です。

一人ひとりがセキュリティ意識を持ち、適切なアクセス制御を行うことで、より強固な情報セキュリティ体制を築くことができます。

頭では分かっていても実際には徹底できていないことも多い分野かもしれません。

サイバー攻撃に対する保険等もありますが、一度失った信頼は戻ってきません。

筆者も再度、身の回りのセキュリティを見直して見ようと思います！
GDAL使ってNetCDFをGeoTIFFに変換

# はじめに
Windowsを前提にしています。
# 準備
1. Dockerを使います。事前にDockerをインストールしてください。参考：[Windows 11にDocker Desktopを入れる手順（令和5年最新版）](https://qiita.com/zembutsu/items/a98f6f25ef47c04893b3)
2. Cドライブにwrkフォルダを作成してください。Dockerコンテナとの共有フォルダにします。ここに変換したいファイルを置いておきます。

# GDALの起動
PowerShell(もしくはコマンドプロンプト）を起動して以下のコマンドを入力すます。
```shell
> docker run --rm -it -v 'c:/wrk:/root/wrk' osgeo/gdal:alpine-normal-3.6.3
```
GDALが起動して、プロンプトが **#** に変わります。
共有フォルダへ移動します。/root/wrk

圧縮を **DEFLATE** でGeoTIFFに変換
```shell
> gdal_translate -if netCDF -of Gtiff -co COMPRESS=DEFLATE input.nc output.tiff 
```
:::note info
可逆圧縮のDEFLATEを付けておくのがおすすめ。画像ならJPEG（不可逆）を選択するととても小さくなるよ。
:::
AWS勉強備忘録11 - ELB について

**Elastic Load Balancing (ELB)** は、AWSが提供するロードバランサーサービスです。ロードバランサーとは、複数のサーバー（例えば、EC2インスタンス）へのネットワークトラフィックを自動的に分散させる仕組みのことを指します。これにより、アプリケーションの可用性を高め、単一のサーバーへの負荷が集中することを防ぎます。

## 負荷分散について

- 負荷分散を行う際、ELBは単一のアクセスポイント（Elastic IPアドレス使用可）を提供し、その後ろで複数のEC2インスタンスにトラフィックを分散します。つまり、ELBを使用することで、ユーザーは複数のElastic IPアドレスを管理する必要がなく、ELBが自動的に負荷分散を行います。

- ロードバランシングを効果的に行うためには、複数のEC2インスタンスが必要です。ロードバランサーの主な目的は、入ってくるトラフィックを複数のサーバー（この場合はEC2インスタンス）間で分散させることにより、どの一つのサーバーにも過剰な負荷がかからないようにすることです。これにより、システム全体の可用性と耐障害性が向上します。 

- 複数のインスタンスがない場合、すべてのトラフィックが単一のインスタンスに向かうため、ロードバランサーを使用する主な利点が失われます。そのため、ロードバランシングを行う場合、効果的に負荷を分散させるためには、2つ以上のEC2インスタンスを用意し、それらをロードバランサーに登録する必要があります。

## ELBの種類

ELBには3つの主要なタイプがあります：**Application Load Balancer(ALB)**、**Network Load Balancer (NLB)**、そして**Classic Load Balancer(CLB)** です。

- **Application Load Balancer (ALB)**: アプリケーション層（第7層）で動作し、HTTPとHTTPSトラフィックの負荷分散に特化しています。高度なルーティング機能を提供し、リクエストの内容に基づいてトラフィックをルーティングできます。
- **Network Load Balancer (NLB)**: トランスポート層（第4層）で動作し、TCP、UDP、およびTLSトラフィックに対して超低遅延での負荷分散を行います。高いスループットと静的IPアドレスをサポートしています。
- **Classic Load Balancer (CLB)**: 従来のロードバランサーで、アプリケーション層とトランスポート層の両方で動作しますが、ALBやNLBに比べて機能が限定されています。

以下の表で、これらのELBタイプを比較します。

| 特徴 | ALB | NLB | CLB |
|---|---|---|---|
| **対応プロトコル** | HTTP, HTTPS | TCP, UDP, TLS | HTTP, HTTPS, TCP, SSL |
| **用途** | アプリケーションレベルでの高度なルーティングが必要な場合 | 非常に高いパフォーマンスと低遅延が求められる場合 | シンプルな負荷分散が必要な場合 |
| **特徴** | コンテンツベースのルーティング、動的ホストポートマッピング | 静的IPアドレスの割り当て、高スループット | 基本的なロードバランシング機能 |

## ELBの料金計算方法

ELBの料金は使用したサービスのタイプ（ALB、NLB、CLB）、使用量（処理したデータ量や新規接続数など）、および選択した追加機能（例：SSL/TLS証明書の利用）に基づいて計算されます。料金は以下の要素に分けられます：

1. **時間単位の使用料**: インスタンスがアクティブである時間に基づいて請求されます。ALB、NLB、CLBごとに異なる料金が設定されています。
2. **処理したデータ量**: ロードバランサーを通じて転送されたデータの量に応じて請求されます。この料金は、データ転送のGB単位で計算されます。
3. **追加機能の料金**: SSL/TLS証明書の利用や、特定のルーティング機能など、標準機能以外のオプションを使用した場合、追加料金が発生することがあります。
vbaで日ポッドテーブルの作成

```vb
Sub CreatePivotTable()
    Dim pivotCache As PivotCache
    Dim pivotTable As PivotTable
    Dim startPivot As String
    Dim wsSource As Worksheet
    Dim wsDest As Worksheet
    Dim dataRange As Range
    Dim pivotRange As Range
    
    ' データソースと出力先のシートを設定
    Set wsSource = ThisWorkbook.Sheets("Sheet1")
    Set wsDest = ThisWorkbook.Sheets("Sheet2")
    
    ' データ範囲とピボットテーブルの配置先を設定
    Set dataRange = wsSource.Range("A1").CurrentRegion ' A1から連続するデータ範囲を自動で選択
    startPivot = "A3" ' ピボットテーブルの開始位置をSheet2のA3に設定
    
    ' ピボットキャッシュを作成
    Set pivotCache = ThisWorkbook.PivotCaches.Create( _
        SourceType:=xlDatabase, _
        SourceData:=dataRange)
    
    ' ピボットテーブルを作成
    Set pivotTable = pivotCache.CreatePivotTable( _
        TableDestination:=wsDest.Range(startPivot), _
        TableName:="NewPivotTable")
    
    ' ピボットテーブルのフィールドを設定
    With pivotTable
        ' 例: "Field1"を行フィールドに、"Field2"を値フィールドに設定
        .PivotFields("Field1").Orientation = xlRowField
        .PivotFields("Field1").Position = 1
        .PivotFields("Field2").Orientation = xlDataField
        .PivotFields("Field2").Function = xlSum
        .PivotFields("Field2").Position = 1
    End With
End Sub

```
カーネル

# カーネル
プロセスがストレージデバイスに直接アクセスできるシステムについて考えてみます
...
ストレージデバイスへのアクセスは、命令順序を正しく制御しなければとても危険なのです。
...
カーネルモードとユーザモードという二つのモードがあります。より正確に言うとCPUアーキテクチャによってはモードが三つ以上ありますが、
...
プロセスはカーネルを介して間接的にデバイスにアクセスしています。
...
Linuxの場合はカーネルのみがこのカーネルモードで動作して、デバイスにアクセスできます。それに対してプロセスはユーザモードで動作するためデバイスにアクセスできません。
このためカーネルモードで動作するプログラムがカーネルなのです。

### 気づき
CPUにはモードがあり、それぞれ権限があることを知った。
プロセスが直接ストレージデバイスに読み書きできないようにカーネルを介して読み書きしているのか。

# 出典
https://gihyo.jp/book/2022/978-4-297-13148-7

# 感想
まだまだ初歩的な投稿になりそうだ。
そこそこ大きなシステム開発に関わって感じたこと

入社3年目である企業の基幹システム（会計システム）のリプレースに関わることになった。メンバーはプロマネ1名、デザイン1名、バックエンド2名、フロントエンド2名の計6名。みな同じ会社のメンバーで、要件定義から運用まで一貫して行うことになった。私はバックエンド担当。

結論から言うと、進め方や要件定義のやり方に間違っていたのではないかと思う。もちろん、良いところもたくさんあったと思う。スケジュールは遅れ気味ではあるが、悪くないペースで進めることはできている。だが、システムの完成形というか、しっかりと動作しているシステムを自分の中でイメージすることができていない。というのも、初期の想定と比べて現行システムが非常に複雑でなおかつ、様々な機能要望も来ているからだ。機能要望については私自身がシステムの拡張性は事前に今後実装されうる機能を知っていれば担保できると考えていたため、お客さんからこんな機能は必要かヒヤリングをしていたら結構要望が出てきた。これを考慮しながら開発するのが想像以上に大変だった。

進め方にも改善の余地があったのではないかと思う。基幹システムの開発だったため、よく聞くウォーターフォールモデルに従って進めてきた。だが、進め方は沿ってはいたが、必要なアウトプットが足らなかったのではないかと思う。要件定義書や設計書を作成しはしたが、それは振り返ってみるとただ機能をまとめた文書に過ぎず、モジュールの入出力、フロントとバックでやり取りするデータなど、インターフェースについては何も記載していなかった。なので、いざ開発してみようとすると連携のところでごたごたや手戻りが生じた。開発とはそのようなものだと言われれば、そうだと思うがもう少し効率的にやることはできたと思う。そもそもウォーターフォールモデルはマンパワーで効力を発揮するものと思っているので、少人数開発ではあまりメリットはないのではないかと思う。前のフェーズには戻らないのでスケジュールは立てやすいのかなと思った。

「前のフェーズに戻らない」と記載したが、これも少し問題がある。実際にやってみて「前のフェーズに戻らない」のは実際のところ不可能ではないかと思う。なぜなら、人間の思いは時間がたてば変化するし、極端にいえばさっき話していたことを覆すことだってある。システム開発が完了するまで同じような思いを持ち続ける人は少ないのではないだろうか。さっさと試作品を開発して順次見せながら開発していくので効率的にもシステム的にもよいのではないかと思う。そのほうがフィードバックをもらいながらイメージに合った機能を開発することができると思う。最後までイメージの中でヒヤリングをしてもお客さんのイメージと自分たちのイメージがあっているのかはシステムが完成してみないとわからない。完成した後、思っていたのと違ってましたとなるのは避けたい。

このプロトタイプを見せるという点でも思ったことがある。
続きはまた今後、気が向いたときにでも。。。
log4netに設定されたAppenderを取得する

## やりたいこと
log4netで設定したAppenderの内容を動的に変更したい

## やりかた
```C#:C#
    var root = ((log4net.Repository.Hierarchy.Hierarchy)logger.Logger.Repository).Root;
    var ap = (log4net.Appender.RollingFileAppender)root.Appenders[0];

    ap.MaxFileSize = 1;
    ap.ActivateOptions();
```

## 感謝
https://garafu.blogspot.com/2014/05/log4net-add-appender.html#google_vignette
Power BI テキストボックスのテキストを縦方向にセンタリングする方法

# はじめに
Power BI レポートを作るとき、ページタイトルをテキストボックスでページの上部に配置することはよくあるかと思います。ただ、Power BI のテキストボックスは横方向のセンタリング機能はあるのですが、縦方向のセンタリング機能がありません。無ければ無いでテキストボックスの大きさをそれらしく調整すればいいのですが、やはり、縦方向をビシッ！とセンタリングしたいという方もいらっしゃるかと思いますので、こちらの Tips を共有させていただきます。

# テキストボックスにおけるセンタリングの問題
こんな感じで Power BI レポートのページにタイトル配置することあるかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/4725113c-52bb-7834-69ea-da41ad8f4439.png)
ただ、このテキストボックスはなかなかの曲者で、背景は書式設定ペインで設定するのに、文字の色はビジュアル上でやらないといけないなど、ちょっと使い勝手がイマイチです。
そして何より、テキストのセンタリングが横方向にしかできません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/18d45ba4-d99e-7382-2ee9-59671bb92b67.png)

こんな状況なので、手動で何となく真ん中に位置するようにフォントサイズやビジュアルサイズを微調整しながら折り合いをつけるのですが、たまに、こんな残念なテキストボックスも見かけます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/f99912df-331b-d93d-44ff-49a087500e2e.png)

# [解決策] テキストボックスではなく「図形」の四角形を使う
横方向・縦方向にきっちりセンタリングしたい場合は、その設定がある「図形」を使用します。「図形」にはテキストを入力できる設定があり、そこには、横方向・縦方向の位置設定のオプションがあります。
1. [挿入]→[図形]→[四角形]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/665c0925-59aa-8fd4-724b-611a051744ce.png)

1. [図形の書式設定]ペインで、[図形のスタイル]→[テキスト]をONにして、[フィル]、[罫線]を設定し、[テキスト]にページタイトルを入力、[フォント]、[横方向の配置]、[縦方向の配置]をそれぞれ設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/76dba4d6-e845-e455-4de7-bbd21b1e853f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/65c26528-8d53-33df-ec36-00fe874363bf.png)

1. 横方向・縦方向にテキストがセンタリングされたテキストボックス風四角形が完成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/cecd4f91-a51d-38ca-2682-430406156864.png)

# 図形でテキストボックスを表現するときの欠点
考えられる欠点としては、
- 折り返し表示をしてくれない
- 動的に値を入れるときにはメジャーを工夫しないといけない
- 部分的な URL リンクには対応していない (アクションで全体的な URL リンクを設定することは可能)
などがあげられます。

# おわりに
用途に応じて、テキストボックスと図形を使い分けて使用するのがよさそうです。
AWS勉強備忘録10 - SSH接続、キーペア、およびElastic IPアドレス

AWS (Amazon Web Services) の運用において、SSH接続、キーペア、Elastic IPアドレスは、サーバー管理とネットワーク設定の基本を形成します。これらの概念の理解は、AWS上でのアプリケーションとサービスの安全かつ効率的な運用に不可欠です。

## SSHでの接続について

SSH（Secure Shell）は、ネットワークを介してサーバーや他のネットワーク機器に対する安全なリモート操作を可能にするプロトコルです。AWSのインスタンスに対するソフトウェア操作や設定変更などは、SSHを介して行われます。このためには、サーバー側でSSHデーモン（背後で常に実行されるプログラム）が稼働している必要があり、クライアント側（操作するユーザーのPC等）にはSSHクライアントソフトウェアがインストールされている必要があります。WindowsではPuTTYやTera TermなどのソフトウェアがSSHクライアントとして一般的に使用されます。これらは基本的に同じ目的で使用されますが、ユーザーインターフェイスや追加機能などに差異があります。

## キーペアについて

AWSでは、SSH接続の認証に**キーペア**を使用します。キーペアは公開キーと秘密キーから構成され、公開キーはAWS上のインスタンスに保存され、秘密キーはユーザーが保持します。SSH接続時には、この秘密キーを使用して認証を行います。これにより、パスワードなしで安全な接続が可能になり、セキュリティを大幅に向上させることができます。

## Elastic IPアドレスについて

**Elastic IPアドレス**は、AWSが提供する静的IPアドレスサービスです。このサービスは、インターネットからAWSインスタンスに対して一貫したアクセスポイントを提供します。動的IPアドレスではなく、固定のIPアドレスを使用することで、DNSの変更なしに、異なるインスタンスへのIPアドレスの再割り当てが可能になります。これにより、障害発生時の迅速な復旧や、管理の簡素化が可能になります。

## Elastic IPアドレスの確保と結び付け

Elastic IPアドレスは、AWSマネジメントコンソールから簡単に確保できます。確保したElastic IPアドレスは、特定のAWSアカウントに結びつけられ、そのアカウント内の任意のEC2インスタンスやネットワークインターフェースに結び付けることができます。既に割り当て済みのIPアドレスをElastic IPアドレスとして使用することはできません。これは、Elastic IPアドレスがAWSによって管理される専用のアドレスプールから提供されるためです。

## Elastic IPアドレスの料金について

Elastic IPアドレスは、使用していない状態で保持していると料金が発生します。AWSでは、Elastic IPアドレスをインスタンスに割り当て、アクティブに使用している場合には追加料金はかかりません。しかし、割り当てられているものの使用していないElastic IPアドレスに対しては、小額の料金が発生します。これは、有限のIPアドレス資源を効率的に使用するためのポリシーです。具体的な料金は、AWSの価格設定が更新される可能性があるため、最新の情報はAWS公式サイトで確認することを推奨します。

Elastic IPアドレスを効率的に使用するには、不要になったアドレスは解放する、または必要なインスタンスにのみ割り当てるといった管理が重要です。これにより、余分なコストを避けることができます。

以上の内容から、SSH接続、キーペア、Elastic IPアドレスはAWSを使用する上で理解しておくべき基本的な要素であることがわかります。SSHは安全なリモートアクセスを提供し、キーペアはその認証メカニズムを強化します。Elastic IPアドレスは、インターネットからの一貫したアクセスを可能にし、運用の柔軟性と信頼性を高めるために不可欠です。これらの概念と使い方をマスターすることで、AWS上でのアプリケーション運用がよりスムーズに、そしてセキュアになります。

## 補足: AWSマネジメントコンソールとSSHの使用

AWS (Amazon Web Services) では、インフラストラクチャの管理と運用を行うために二つの主要な方法があります。一つはAWSマネジメントコンソールを通じての操作、もう一つはSSH（Secure Shell）を使用したリモート接続です。これらは異なる用途に適しており、AWS上での作業を効率的に行うためには、両者の適用場面を理解しておく必要があります。

### AWSマネジメントコンソールによる操作

AWSマネジメントコンソールは、ブラウザを通じてアクセスできるユーザーインターフェイスです。インスタンスの起動や停止、マシンスペックの変更（例えば、CPUやメモリのスペックを上げる、下げる）、バックアップ（主にスナップショットを取ること）など、サーバー全体に関わる操作を行います。スナップショット以外にも、AMI（Amazon Machine Image）の作成など、さまざまなバックアップ手段が提供されています。これらの操作は、直感的なクリック操作で簡単に実行できるため、AWSを扱う上で最初に覚えるべき基本的なツールです。

### SSHによるリモート接続

SSHは、「Secure Shell」の略で、暗号化されたネットワークプロトコルの一つです。このプロトコルを使用して、ユーザーはリモートのサーバーに安全に接続し、サーバー上でコマンドを実行することができます。AWSでは、EC2インスタンスなどのサーバーにインストールされたソフトウェアの設定変更や更新など、具体的なソフトウェア操作を行う場合にSSH接続が一般的に使用されます。SSH接続を行うためには、適切なキーペアの設定と、クライアント側の設定が必要です。SSHを利用することで、安全な環境下でのリモート作業が可能となり、サーバー管理者はどこからでもサーバーの詳細な管理を行うことができます。

これらのツールを適切に使用することで、AWS上でのインフラストラクチャ管理とアプリケーション運用の両方を効率的に、安全に行うことが可能です。AWSマネジメントコンソールは、サーバー全体の管理や設定変更に用いられる一方で、SSHはより詳細な操作やソフトウェアレベルの変更を行うための強力なツールです。
初めてWeb APIを叩いてみた（超初心者）

## 設計
ボタンを押したらランダムに犬の写真が表示されるサイト。必要なのはボタンと写真が表示されるスペースのみです。

## HTMLファイルの作成
```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Dog Image Creater</title>
    <link rel="stylesheet" href="./style.css">
</head>
<body>
    <img src="" alt="" id="dog_image">

    <button onclick="create_image()">Create</button>
    
    <script src="./index.js"></script>
</body>
</html>
```

## CSSファイルを作成
今回はただ写真のサイズがバラバラだった為、サイズだけcssで編集します。
```css
#dog_image{
    width: 900px;
    height: 600px;
}
```

## JSファイルを作成
jsファイルで初めてのfetchメソッドを使っていきます。
今回は下記サイトの無料で利用できるapiを使用します。犬の種類も指定できるそうですが今回はランダムに表示させます。

https://dog.ceo/dog-api/documentation/random

```js
function create_image(){
    fetch('https://dog.ceo/api/breeds/image/random')
    .then(response=>{
        return response.json();
    })
    .then(data=>{
        console.log(data)
        const image_url = data.message
    
        const img = document.getElementById('dog_image');
        img.setAttribute('src', image_url);
        console.log(image_url)
    })
    .catch(error=>{
        console.log(error);
    });
}
```
## 結果
かなり写真を表示させるまでに時間がかかってしまいましたが、最終的には可愛い犬たちの写真を表示できました！response.json();の部分で（）をつけ忘れている凡ミスで時間が溶けました。

みなさんのこのコードに関するご意見もぜひ聞きたいのでぜひコメントをお願いいたします！
拙い文章ですが、最後まで読んでいただきありがとうございました。
SSH接続でWinSCPでのファイルアップロードが30分かかる

AWS EC2へのSSH接続時、WinSCPでのファイルアップロードが30分かかる。

コマンドの発行は普通にできるのに、20MBのファイルのアップロードがやたらと遅く、30分かかる。
待てばいけるけど・・・遅すぎる！

こんな情報が見つかった。
```TeraTermはプロトコルに「UNISPEC」が指定されてるときIPv6での接続を試みる。それが無理なら、IPv4で接続するらしい。```


ならじゃあ、ではでは、IPv4をIPv6より優先にしてみるか。
うおおぉぉぉー！直った！！！！早い
よかった(泣)

### 現在設定されている優先順位の確認
```netsh interface ipv6 show prefixpolicies```


|優先順位  |ラベル  |プレフィックス  |意味 |
|---|---|---|---|
|50  |0  |::1/128  |ループバック |
|40  |1  |::/0  |IPv6通信全般 |
|30  |2  |2002::/16  |6to4 |
|20  |3  |::ffff:0:0/96  |IPv4マップ |


### 設定を変更する
コマンドプロントを右クリック管理者権限から開き、

```
netsh interface ipv6 set prefixpolicy ::ffff:0:0/96 50 0
netsh interface ipv6 set prefixpolicy ::1/128 40 1
netsh interface ipv6 set prefixpolicy ::/0 30 2
netsh interface ipv6 set prefixpolicy 2002::/16 20 3
netsh interface ipv6 set prefixpolicy ::/96 10 4
```

## 設定をリセットする

```
netsh interface ipv6 reset
```
で再起動する。
AWS勉強備忘録まとめ

https://qiita.com/KM9973/items/dca0f673a9a24c300ffc

https://qiita.com/KM9973/items/2368f61070a8040532ff

https://qiita.com/KM9973/items/2da06364bfd5e00d860e

https://qiita.com/KM9973/items/6a7b97299b0ab84ab197

https://qiita.com/KM9973/items/28a9c6088cc988be8147

https://qiita.com/KM9973/items/ba9795ea17b7417cbd28

https://qiita.com/KM9973/items/0a730fffcd94003b0e1b

https://qiita.com/KM9973/items/fc9ff658a73bdeff5c31

https://qiita.com/KM9973/items/0252aa99eaf683b5cf50

https://qiita.com/KM9973/items/168431fd71c6032736bf

https://qiita.com/KM9973/items/f33334dafa55086c94cd

https://qiita.com/KM9973/items/73c7f26ea4513925a207

https://qiita.com/KM9973/items/0d9dd84c547084c010e0

https://qiita.com/KM9973/items/d2d332784cbf9bf8c4a4

https://qiita.com/KM9973/items/8b8a49988627ca90c7c2

https://qiita.com/KM9973/items/664bc604377b66f04bd0

https://qiita.com/KM9973/items/9ccafd7f863fc1dbab90

https://qiita.com/KM9973/items/37051a0671d6fa6fc3a5

https://qiita.com/KM9973/items/5e24a3f0343565731387

https://qiita.com/KM9973/items/b538fc39c7c556881ef7

https://qiita.com/KM9973/items/c1e6a92fcda96cd17d70

https://qiita.com/KM9973/items/25c060b907bf7646d8ae

https://qiita.com/KM9973/items/bbae44e7fc0d3a8b5608

https://qiita.com/KM9973/items/766757bde058f89f2d41
【Excel VBA】ブックで使われているスタイル名を出力するマクロ

イミディエイトウィンドウに、シートごとに使用しているスタイル名を出力するマクロ。

他ブックからシートコピーなどしているとスタイルが増えてしまい、どのシートでどのスタイルが使われているかわからなかったため、AIに作ってもらいました。


* GetStylesInWorksheet - １シート分の処理マクロ
* GetStylesInWorkbook - １ブック分の処理マクロ

# ソース

## １シート分の処理（GetStylesInWorksheet）
指定されたシートまたはアクティブシートを処理対象として、各セルからスタイル名を取得・出力する。

```vb:GetStylesInWorksheet
Sub GetStylesInWorksheet(Optional sh As Worksheet)

' シートが指定されていなければ、アクティブシートを使用する
If sh Is Nothing Then
  Set sh = ActiveSheet
End If

Dim rng As Range
Dim cell As Range
Dim styles As Collection
Dim style As Variant
Dim flag As Boolean

Set styles = New Collection

On Error Resume Next
For Each rng In sh.UsedRange
  For Each cell In rng
    flag = False
    For Each style In styles
      If style = cell.style.name Then
        flag = True
        Exit For
      End If
    Next style
    If Not flag Then
      styles.Add cell.style.name
    End If
  Next cell
Next rng
On Error GoTo 0

Debug.Print "Sheet: " & sh.name 'シート名を表示
'そのシートで使われているスタイル名を表示
For Each style In styles
  Debug.Print style
Next style

Debug.Print '空行を出力

End Sub
```

## １ブック分の処理（GetStylesInWorkbook）
アクティブブックの全シートを対象に１シート分マクロ `GetStylesInWorksheet` をシート数ごとに呼び出すだけ。

```vb:GetStylesInWorkbook
Sub GetStylesInWorkbook()

Dim sh As Worksheet

For Each sh In ActiveWorkbook.Sheets
  Call GetStylesInWorksheet(sh)
Next sh

End Sub
```

# 結果出力例
```
Sheet: Sheet1
Normal
どちらでもない
Hyperlink

Sheet: Sheet2
Normal
悪い

```
C#とVB.NETでWordからXMLへの変換

## はじめに
XMLはデータの保存と転送に使用される通用のマークアップ言語です。この文書形式は、タグ、要素、属性、およびテキストで構成されています。Word文書をXML形式に変換することで、文書の内容、フォーマット、および構造をタグの形式で表現し、より柔軟なデータ処理と交換を実現することができます。
## ツール
* Visual Studio 2022
* [Free Spire.Doc for .NET](https://www.e-iceblue.com/Introduce/free-doc-component.html)

このライブラリは、無料でWordを作成、編集、変換することができますが、段落数の制限があります。または、有料版の製品の無料トライアルを申し込むこともできます。

有料版 :[Spire.Doc for .NET](https://www.e-iceblue.com/Introduce/word-for-net-introduce.html)

## 準備
1. [Free Spire.Doc for .NET](https://www.e-iceblue.com/Download/download-word-for-net-free.html)をダウンロードします。
2. Visual Studioで新しいプロジェクトを作成します。
3. そのプロジェクトを開いた後、「Solution Explorer」>「References」>「Add Reference」>「Browse」を選択します。
4. BINフォルダ内のDLLファイルを見つけて、「OK」をクリックします。

上記の手順で DLL ファイルをプロジェクトに簡単にインポートできます。
## コード：
C#:
```c#
using System;
using Spire.Doc;

namespace WordtoXML
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //Documentクラスのオブジェクトの作成
            Document document = new Document();

            //Word 文書を読み込みます
            document.LoadFromFile(@"sample.docx");

            //Word 文書を XML ファイルとして保存します
            document.SaveToFile("toXML.xml", FileFormat.Xml);
        }
    }
}
```
VB.NET:
```vb
Imports System
Imports Spire.Doc

Module Program
    Sub Main(args As String())
        'Documentクラスのオブジェクトの作成
        Dim document As New Document()

        'Word 文書を読み込みます
        document.LoadFromFile("sample.docx")

        'Word 文書を XML ファイルとして保存します
        document.SaveToFile("toXML.xml", FileFormat.Xml)
    End Sub
End Module
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/e38b038f-d938-e624-7a4e-cfa993227a76.png)
この方法では、Word 文書を [XPS](https://www.e-iceblue.com/Tutorials/Spire.Doc/Spire.Doc-Program-Guide/NET-Word-to-XPS-Converting-Word-to-XPS.html)、[PDF](https://www.e-iceblue.com/Tutorials/Spire.Doc/Spire.Doc-Program-Guide/How-to-Convert-Word-to-PDF.html)、[HTML](https://www.e-iceblue.com/Tutorials/Spire.Doc/Spire.Doc-Program-Guide/Word-to-HTML-Convert-Word-to-HTML-with-C-VB.NET.html) などの他のファイル形式に変換することもできます。
Salesforce認定アドミニストレーターを受験することになったから過去問を解いてアウトプットしていこうと思う。Q131 ~ Q140

## Q131. 入力規則の代わりにルックアップフィルターを使用する利点は何か？

A. Salesforceモバイルアプリでのページ更新の高速化
B. 関連レコードを選択する際のユーザー効率が向上する

解答: B
### 解説
関連した適切な選択肢のみが表示されるため, 選択プロセスが簡略化されたり, それによってユーザーが間違った選択を最初からしないようにすることができる.

## Q132. レコードタイプを作成する前にビジネスプロセスを作成する必要があるのはどのオブジェクトか？

A. ケース
B. キャンペーン
C. リード
D. 商談
E. ソリューション

解答: A, C, D
### 解説
ビジネスプロセスは, 標準オブジェクトの流れ（状況）として開始から終了までの特別な選択リスト項目を管理する.

-- ページレイアウト・レコードタイプ・ビジネスプロセスについて --
https://qiita.com/Takaa/items/ff249904323a3d8ee041

## Q133. 商品スケジュールで設定できる2つのスケジュールの種類は？

A. 数量
B. 予測
C. 収益

解答: A, C
### 解説
-- 商品スケジュールの有効化について 公式ヘルプ --
https://help.salesforce.com/s/articleView?id=sf.enabling_schedules.htm&type=5

## Q134. ワークフローアクションを4つ選べ.

A. Eメール送信
B. TODO作成
C. 項目更新
D. アウトバウンドメッセージ送信
E. テキストメッセージを送信
F. レコードを作成する

解答: A, B, C, D
### 解説
ワークフローアクションとは, ワークフロールールで設定した条件を満たした時に実行されるアクションのこと.

-- ワークフローアクションについて --
https://mrhappyneet.com/sfdc-workflow/#toc1

## Q135. データインポートウィザードを使用して入力規則に違反した場合, インポート処理はどうなるか？

解答: 入力規則に違反していないレコードだけ作成される
### 解説
Salesforceにデータを取り込むためのツール. データローダとの違いはインポートできる数の違いや動作環境の違いがある.

-- データインポートウィザードについて --
https://www.sunbridge.com/blog/column/salesforce-import-wizard/

-- データローダについて --
https://www.sunbridge.com/blog/tips/salesforce-how-to-use-dataloader/

## Q136. ケース用のWebフォームがある. ケース割り当てルールが非アクティブの場合, ケースの作成時に誰に所有権が割り当てられるか？

A. ケースはデフォルトのケースキューに割り当てられる
B. デフォルトのケース所有者が割り当てられる

解答: A
### 解説
レコードが手動, 自動ケースまたはリード割り当てルールを介してキューに配置されると, レコードはユーザーに割り当てられるかキューメンバーの1人によって取得されるまでそこに残り続ける.

-- ケースキューの割り当てについて --
https://qiita.com/Keiji_otsubo/items/79ce77bf1f993b700c37

## Q137.ダッシュボードに不正確なデータが表示されている. 管理者は, ソースレポートを変更していることを発見した. ソースレポートの整合性を維持するために, 管理者が実行する必要がある2つのアクションは？

A. ビューアクセス権を持つ新しいレポートフォルダを作成
B. ダッシュボードをユーザーのプライベートフォルダーに移動
C. ダッシュボードレポートを表示専用フォルダーに移動

解答: A, C
### 解説
ビューアクセス権とは要するにレコードへのアクセス権のことで, そこを制御することで不必要な変更を防ぐことができる. また, 表示専用フォルダに移動することでそのレポートの編集を防ぐことができ, これによっても不必要な変更を防ぐことができる.
Bについて, アクセスという面においては有効的だが, データの整合性を直接保護するものではないから, 設問の解答としては不適切.

## Q138.データを確実にバックアップすることに決定した. 管理者がバックアップのために対応できるものはどれか？次から2つ選べ.

A. データエクスポートサービスを利用して, zipファイル形式のバックアップを行える.
B. AppExchageからバックアップ用アプリケーションをダウンロードしてバックアップを行える.
C. データエクスポートサービスを利用して, 毎週または毎月バックアップを行える.

解答: B, C
### 解説
データエクスポートサービスを利用してzipファイル形式のバックアップを作成できるのでAが間違っているわけではないが, バックアップの中身ではなくバックアップをするための対応が問われているから, BとCが妥当ということになると思う.

-- データのバックアップ 公式ヘルプ -- 
https://help.salesforce.com/s/articleView?id=000386692&type=1


## Q139. キャンペーンを作成・管理するユーザーがいる. そのユーザーのプロファイルにはキャンペーンオブジェクトの作成権限が付与されているが, 新規キャンペーンの作成ができない. 解決方法は？

A. そのユーザーレコードのマーケティングユーザーチェックボックスを選択
B. そのユーザーを標準マーケティングユーザープロファイルに割り当て

解答: A
### 解説
キャンペーンを作成および管理するためには, ユーザーにキャンペーンオブジェクトへの作成権限を付与するだけでは不十分で, マーケティングユーザーとして指定されている必要がある.これは, ユーザーレコード内の「マーケティングユーザー」チェックボックスを選択することで行われる.

Bじゃダメな理由は, キャンペーンを作成する際の主要な要件は「マーケティングユーザー」の設定であるため, プロファイルの割り当てだけで問題は解決しないから.

-- マーケティングユーザーについて --
https://tenshoku-careerchange.jp/column/4098/

## Q140. 顧客が技術的な問い合わせのためにケースを送信できるようにしたいが, コールセンターを設定するためのリソースがない. 別の手段でこれをサポートできるようにするには, 次のうちどのオプションを検討すればいい？

A. Web-to-ケースHTMLコードを生成してWebサイトに追加
B. 知識あるLightningパートナーコミュニティを実装
C. メール-to-ケースの指定されたルーティングアドレスへのリンクの追加

解答: A, C
### 解説
web-to-ケース, メール-to-ケースともに, ケース作成の自動化に寄与するからコールセンターの設置が難しい場合に有効である.
ALBにCognitoでの認証を付ける

# 動機

ECS で作ったウェブアプリに認証機能を付けたいのだけど、アプリに新規実装するとなると手間なので、なんとか楽に実装できないかと思ったら、ALB と Cognito だけで認証機能を実現できると聞きました。
楽に実装出来ると聞きやってみたものの、結局3日かかってやっとできました。
ここに悪戦苦闘の記録を残します。

AWS はすぐに UI が変わるのが本当に良くない。

# 前提

ECS + ALB で既にページを公開済み。
こちらの記事で作成しています。
https://qiita.com/mkt1234/items/52735503624d12243cf9

ALB に証明書を付けて HTTPS 化済み
こちらの記事で作成しています。
https://qiita.com/mkt1234/items/271d690b3aa43fcd5814

# Cognito の設定

ユーザープールを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/3e19c296-a5ee-1a0f-9897-17fde1035093.png)

今回は E メールでのログインにします。ここらへんは好みで。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/88150b4a-092e-aecf-37f2-26a3f597f05f.png)

今回は MFA なしにしました。パスワードや多要素認証は好みで。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/bf593f31-57b4-479d-e7b0-979e94cedeb6.png)

サインアップエクスペリエンスは特に変更なし。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/fd23f632-95de-d722-d8bc-a6e89a84ca44.png)

そこまでユーザーはいないので Cognito で E メールを送信を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/239c8074-9be4-0eb0-c292-c4b4379c4a43.png)

アプリケーションを統合の画面で特に重要なのは、クライアントシークレットを生成することと、許可されているコールバック URL の値です。
許可されているコールバック URL は ALB の URL のパスを `/oauth2/idpresponse` にするのが重要です。これが分からず 1 日以上ハマりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/b13f378b-0541-e33b-4cd8-624b63a0a731.png)

## ユーザーの作成

作成したユーザープールにユーザーを作成します。
パスワードの自動生成等の設定は好みで。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/531157e6-639b-fe57-3fd0-0ad8241bec68.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/ab66cd8c-503e-95b9-dd75-ed3d38356950.png)

# ALB の設定

認証を設定したい ALB を選んで、HTTPS:443 のリスナーの編集を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/45996965-6bb5-d1c3-bbca-c2378c14adaa.png)

途中に「認証」という項目があるのでチェックを入れます。
アイデンティティプロバイダーに Amazon Cognito を選び、項目を埋めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814940/a31ade84-fc66-8089-14b0-920d68d82c05.png)

# 動作確認

ALB のホスト名をブラウザーで開いたときに認証画面が出れば OK です。

Cookie に以前の認証情報が残ってしまって複数回の確認が困難になる場合があるので、動作確認時はブラウザーのシークレットウィンドウを使うと良いです。
[Angular]NgRxで複数Storeを作った時に、Selectorで跨いでfilterとかして取得したい時

いやー、毎日更新しようかなと思ったけど、ネタがなくなって更新止まった瞬間に一気にやる気がなくなったわー

# こんな状況の時のサンプル
- 1システム（アプリ）内でNgRxでデータを管理する
- アプリ共通のStoreと画面や機能単位で管理するStoreがあり、Storeが複数ある
※Action・Reducer・Selectorも複数ある
- 機能Selectorで共通Storeの値を参照して、なんか値を返したい

# サンプルソース
### サンプルフォルダ構成
store
 \|-app-state.ts
 \|-app-selector.ts
 \|-sample-state.ts
 \|-sample-selector.ts
 
### アプリ共通のStateとSelector
```typescript:app-state.ts
export const featureName = 'appState';
export interface State {
  isAdmin: boolean;
}
```
```typescript:app-selector.ts
import {featureName, State} from './app-state'

// app-storeのStateの値を全部参照できるSelector
const featureSelector = createFeatureSelector<State>(featureName);

// isAdminだけ参照するためのSelector
export const isAdmin = createSelector(
  featureSelector,
  (state) => state.isAdmin
);
```

### 機能のStateとSelector
```typescript:sample-state.ts
export const featureName = 'sampleState';
export interface State {
  // 管理者向けメッセージ
  adminMessage: string;
  // 一般ユーザ向けメッセージ
  userMessage: string;
}
```
```typescript:sample-selector.ts
import {featureName, State} from './sample-state'

// app-selectorで定義されていて、このファイル内で参照したいSelector
import {isAdmin} from './app-selector'

// sample-storeのStateの値を全部参照できるSelector
const featureSelector = createFeatureSelector<State>(featureName);

// app-selectorのisAdminを条件に対象のメッセージを返す
export const message = createSelector(
  featureSelector, // ample-storeのStateの値全部
  isAdmin,         // app-selectorのisAdmin
  (state, isAdmin) => isAdmin ? state.adminMessage : state.userMessage
);
```

# 解説
単純なお話で、
sample-selector.tsにて、参照したいSelectorをimportして、
createSelectorの引数で指定してあげるだけ。
createSelectorの引数は別に対象機能のStateだけしか渡せないというわけではなく、
いくらでも別の機能のSelector経由のStateの値を指定することが出来るみたいです。

# まとめ
まぁあまりにもあっちゃこっちゃで参照しあうのは、そもそも設計がよろしくないんじゃね？って感じがしますね。

またComponent側でmargeを使って、pipeを使ってwithLatestFromからそれぞれの値を取得してみたいなことも出来るのかなと思いますが、複雑になって読みづらく保守しずらくなるだけな気もするので、取ってくる段階で加工が出来るのであればComponent側では取って出すだけぐらいにした方がシンプルに作れるのかなって気がします。
「ばー あいぬ むぬーば ふぁいーや みーん。」はUniversal Dependenciesで書けるのか

[昨日の記事](https://qiita.com/KoichiYasuoka/items/0671e0088bbe24151868)の続きだが、下地理則『南琉球宮古語伊良部島方言』(くろしお出版, 2018年3月)の例文9-26は、ひらがなで書くと「ばー あいぬ むぬーば ふぁいーや みーん。」となって、様々な点で手強い。何とかUniversal Dependenciesで書いてみよう。

```
# text = ばー あいぬ むぬーば ふぁいーや みーん。
1-2	ばー	_	_	_	_	_	_	_	_
1	ば	_	PRON	代名詞	_	8	nsubj	_	_
2	あ	_	ADP	助詞-格助詞	_	1	case	_	_
3	あい	_	DET	代名詞	_	5	det	_	SpaceAfter=No
4	ぬ	_	ADP	助詞-格助詞	_	3	case	_	_
5-6	むぬー	_	_	_	_	_	_	_	SpaceAfter=No
5	むぬ	_	NOUN	名詞-普通名詞-一般	_	8	obj	_	_
6	う	_	ADP	助詞-格助詞	_	5	case	_	_
7	ば	_	ADP	助詞-係助詞	_	5	case	_	_
8	ふぁいー	_	VERB	動詞-一般	_	10	advcl	_	SpaceAfter=No
9	や	_	ADP	助詞-係助詞	_	8	mark	_	_
10	みーん	_	VERB	動詞-非自立可能	_	0	root	_	SpaceAfter=No
11	。	_	PUNCT	補助記号-句点	_	10	punct	_	_
```

![shimoji9-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428317/870c50b4-e741-5ed8-ad7c-c5aef96d9595.png)

「ばー」は、代名詞「ば」に格助詞「あ」がくっ付いた形で、できれば長音記号ではなく「ばあ」と書きたいところだが、「ばー」でも縮約の一種とみなせば何とかなる。「あいぬ」の「あい」は、様態を表す指示詞なので、XPOSは「指示詞-様態」としたいところだが、UniDic品詞には指示詞がないので「代名詞」にしている。「むぬーば」も「むぬ」「う」「ば」なのだが、縮約で何とかしている。「ふぁいーや」の「ふぁいー」は、動詞[foː]が[fav]だった名残なのか、[fa-i-i]という不気味な屈折を取るようだが、まあ「ふぁいー」を一語とみなせば大丈夫だ。「みーん」は動詞[miːr]の否定形だが、無理に「みー」と「ん」に分けるのも何なので、「みーん」を一語とみなしている。

こうして見てみると、やはり動詞の屈折が異様に複雑で、どこまでを一語に取るかが、コーパスの作成作業者には判断しにくいように思える。先に「イラヴ語UniDic」に相当するものを、動詞まわりだけでも作っておかないと、作業に入れないかなあ。
Optunaのtrials_dataframeを見やすくする

Optunaは、ハイパーパラメータ探索を自動化する素晴らしいライブラリです。そのtrials_dataframe機能は、探索の過程を詳細に記録し、一覧できるため非常に便利です。以下のコードは、Optunaでの探索を行う基本的な例です。

```python
study = optuna.create_study(direction='maximize')
stusy.optimize(objective, n_trials=100)
study.trials_dataframe()
```

しかし、このDataFrameをそのままStreamlit上で表示すると見づらさを感じるかもしれません。特に、大量のトライアルを扱う場合には、より明瞭に結果を見る必要があります。

例えば、Optunaの標準出力がこちらです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456646/e737fcad-ebe8-93ec-68f9-28b833408f36.png)

これを、次のように見やすく変換したいと考えます：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456646/4dbdad75-aa4f-603c-c9b4-49b3a392e541.png)

## 実際の変換コード
以下に、この変換を実現する実際のコードを共有します。このコードでは、不要な列の削除、ステータスの視覚化、所要時間の単位変換、列の順序変更、および列名の日本語化を行っています。

```python
def get_trials_dataframe(self):
    opt_result = self.study.trials_dataframe()
    # st.write(opt_result)
    opt_result = opt_result.drop(["number", "datetime_start",
                                    "datetime_complete"], axis=1)
    
    # ステータスを見やすく
    opt_result['state'] = opt_result['state'].map(lambda x: '✅' if x == 'COMPLETE' else '❌')
    
    # duration列を変換する（秒単位から分または時間単位に）
    def convert_duration(timedelta):
        seconds = timedelta.total_seconds()  # Timedeltaから秒数を取得
        if isinstance(seconds, str):
            return seconds
        elif seconds >= 3600:
            return f"{seconds / 3600:.2f}時間"
        elif seconds >= 60:
            return f"{seconds / 60:.2f}分"
        else:
            return f"{seconds}秒"
    opt_result['duration'] = opt_result['duration'].apply(convert_duration)
    
    # 順番を入れ替える
    columns_order = ['state', 'value', 'duration'] + [col for col in opt_result.columns if col.startswith('params_')]
    opt_result = opt_result[columns_order]
    
    # 日本語化
    column_name_map = {
        "value": "評価値",
        "duration": "所要時間",
        "state": "実行ステータス",
    }

    # パラメータのカラム名を特定するための正規表現パターン
    params_pattern = re.compile(r'^params_')

    # パラメータ以外の列名を日本語に変換
    new_columns = {}
    for col in opt_result.columns:
        if not params_pattern.match(col):
            # パラメータ以外の列名を変更
            new_columns[col] = column_name_map.get(col, col)
        else:
            # パラメータの列名はそのままにするか、適宜変更する
            # 例: 'params_learning_rate' -> '学習率'
            # new_columns[col] = '日本語の列名'  # 必要に応じて
            pass

    # 列名の変更を適用
    opt_result.rename(columns=new_columns, inplace=True)
    
    return opt_result
```

この関数をStreamlitアプリケーションで使用することで、Optunaの探索結果をより一目で理解しやすくすることができます。これにより、ハイパーパラメータのチューニングプロセスがよりスムーズになります。
セルに新たに一行挿入する

```vb
Sub InsertColumnBeforeE()
    Dim ws As Worksheet
    Set ws = ActiveSheet ' 現在アクティブなシートを設定、またはThisWorkbook.Worksheets("シート名")で特定のシートを指定
    
    ' E列の前に新しい列を挿入
    ws.Columns("E:E").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
End Sub

```