OmniAICreator/Qiita-1.07M huggingface dataset:
[memo]現場で学んだこと整理

# はじめに

最近初めて参画した設計構築のプロジェクトを退プロしたので、備忘録として学んだことをメモします。
期間は約1年でした。いっぱい勉強させてもらいました。
「これも指摘したんだが？」って、忘れていることあったらDMしてください。

ほぼ自分用、あとは見たい人用です。
適当なのご容赦ください。

# ドキュメント作成

・表記ゆれに気をつけろ
→同じこと意味するのに１つのドキュメント内で、表現方法が異なっていること
　これは誤解を生むし、説明の際の弱点となるので修正すること

・誤字チェックしろ
→officeの機能で誤字チェック・スペルチェックできるはずなので、必ず実施すること

・フォントを統一しろ
→表題や章の題名などは許されるかもしれないが、基本統一する

・罫線を統一しろ
→罫線が値に影響を与えることは、基本ないと思うが普通に見栄えが悪い
　ばれないものもあるが、印刷すると絶対ばれる

・オブジェクトサイズを統一しろ
→挿入している図形や、画像のサイズは基本統一する
　手動で位置を修正するのではなく、officeの機能を使用して位置を修正すること

・左右上下寄せを統一しろ
→主にExcel、表の中
　セルを結合しろとまではいかないが、ポリシーをもってどこに寄せるかを統一する
　ばらばらだと見栄えが悪い

・文字切れをチェックしろ
→表や挿入オブジェクトの文字が切れていることがよくある
　自然に切れていることもあるので、入念にチェックする必要がある

・項番をチェックしろ
→修正を重ねるとめっちゃズレる
　項番だけでなく、普通にNoだったり章番にも当てはまる
　超初歩的な指摘なので、何回もやっていると正気か疑われる

・体裁はPDFにしてチェックしろ
→罫線や、文字切れをチェックするためにはPDFにする
　Excelの印刷プレビューはバグっている

・横並び修正をしろ
→指摘されたことが全てのドキュメントに影響がある指摘だと、影響があるドキュメントを全て修正しなくてはならない
　影響のあるドキュメントをメモして、横並び修正に漏れがないか確認しなくてはならない

・語尾を統一する
→「だ、である」だったり、「です、ます」を統一する
　「。」を付けるか、付けないかも統一する

・観点洗い出しは粒度の小さいものから
→洗い出しで表を作った時に、粒度の大きい特定のワードから検索し始めて失敗したことがあった
　
　例：Windows OSについての記述が何か所あるか調べろ
　　　→「Windows11」から文字列検索で調べるぜー
 　　　よし、〇箇所だな、これで調べればすぐ終わるやん
　　　→やべ、「Windows」だけの記述がある
　　　　「Windows」だけで文字列検索すると「Windows11」もヒットして重複しちゃうな…

# 全般

・依頼には期限を付ける
→レビュー依頼など、情報提供依頼に期限を付けて
　遅延しているときにプッシュしやすくする
　期限を明記することで、自責になりにくくなる
　（依頼した当日などに期限を設定するのは失礼なので、やめること）

・ファイル名、パスを付ける
→レビューの依頼や、情報提供にはファイル名とパスを必ずつける
　ファイル名・パスを付けないと、なんの話をしているのか分からないし、場所を調べるのも手間

・申請が必要か確認する
→作業には申請が必要なものがあったりする。
　確認していないと、作業直前になってスケジュールが遅れたりする可能性がある

・何日前に申請が必要かもチェックする必要がある
→申請を何日前までに出す必要があるかも確認する
　5営業日前に提出しなくてはならないものなどあるので、把握していないと大変なことになる

・成果物・エビデンスちゃんと整理する
→成果物は当たり前だが、作業のエビデンスを整理しておくと後々自分が助かる
　無実を証明できたりするが、適当な作業を証明するエビデンスにもなるので注意

・ドキュメントをちゃんと管理する
→これクソ重要
　ドキュメント探したり、デグレったすると面倒くさい
　ソフトウェアでドキュメントのバージョンを管理してたりするけど、あんまり信じない方がよい
　「old」ファイル作って使わないものを移動したり、修正前にバックアップを取ることを徹底することで
　フォルダ内をごちゃごちゃにしない

・フォルダ構成をきれいにする
→若干重複してるけど、フォルダの構成は統一するのがよい。
　階層を揃える

・期限など早めに設定して、行動する
→例えば10日までのタスクって言われたら、10日に終わるんじゃなくて
　8日くらいに終わって残りの2日は遊んでおくくらいの余裕が欲しい
　（遊ぶっていうのは例え話）

・工数をしっかり毎日つける
→上の人から「お前なんの仕事してるの」って言われたときに回答ができないとマズイ
　昔のことは思い出せないし、雰囲気で調節しようとするのも面倒なので毎日記録すること

・自分からプッシュする
→期限の話と関係あるが、他人がボトルネックになって自分が待ちになっていたら自分からぷプッシュする
　放っておくとタスクが遅延して自分が悪いみたいになることがある

・自責を他責にする力
→あんまりよくない文化・風習だと思うが「作業がどこで止まっている、今はこの段階」というのをボールに見立てて
　「ボールは誰が持っている」と表現されることがある
　ボールを自分が持たないことで、タスクの遅延や発生した問題の責任から逃れようとする風習がある
　意識しないとハメられることがあるので、知っておくだけで自衛になる
　早くボールを投げることで、円滑に仕事が進んだりする

・作業にかかる時間は余裕をもって見積もる
→難しいけど、振られた作業いつまでにできるか報告するときは大口叩かずに
　多めに時間を申告すること

・現行のドキュメントを信用しすぎない
→現行設計書の設定値が間違っていたことがある
　信じすぎない方がよい

・他システムとの連携機能を確認する
→いろんなシステムと通信をしていると、気にすることが増えるのでそれだけで難易度が上がる
　最初に頭の中を整理することで、ましになると思う

・設計の理由を考える
→設計の理由が言えないと論外
　なぜこの値となっているか、理由を言えるように一つ一つ考えること

・主語をつける
→文章でも会話でも主語から話すこと
「〇〇の〇〇が」と言うと結構いい。


# まとめ

思い付く限りを殴り書きしました
まだまだあると思いますが、これを全部知っていると
現場で役立つと思います。誤字ってたらごめんなさい

あくまで参考程度に
DiscordBotでRSSリーダを作る

# はじめに
車輪の再開発大好き、[にわのわ](https://twitter.com/niwa_nowa)です。

今日はDiscordBotでRSSリーダを作ってみました。
既存のDiscordアプリでRSSリーダはいくつかありますが、
サーバの雰囲気にあったアイコンを設定したいので自作しました。

例

https://rss.app/ja/bots/rssfeeds-discord-bot

https://monitorss.xyz/

# 作ったもの
今回作ったものはこちらで公開しています。

https://github.com/niwanowa/niwanowa-RSSReader


# ソース
これをEC2にデプロイして、常時起動させています。
DISCORD_TOKEN、CHANNEL_ID、RSS_URLは環境変数で設定しています。
それぞれほぼ読んで字の如くですが、
DISCORD_TOKENはDiscordのdeveloper portalから取得できます。
CHANNEL_IDはDiscordのチャンネルIDです。ブラウザでbotを置きたいチャンネルを開くいて取得します。

![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590707/76c2ed5b-7f0d-e418-b45c-054f0d3bf07f.png)

RSS_URLはRSSのURLです。```https://hogehoge.com/rss.xml```のような形式です。

```bot.py
import asyncio
import discord
from discord.ext import commands
from dotenv import load_dotenv
import os

import feedparser
from datetime import datetime,timedelta,timezone
import time


load_dotenv()

TOKEN = os.getenv('DISCORD_TOKEN')
CHANNEL_ID = int(os.getenv('CHANNEL_ID'))
RSS_URL = os.getenv('RSS_URL')
os.environ['TZ'] = "UTC"

intents = discord.Intents.default()
intents.guilds = True  # サーバーに関するイベントを取得できるようにする
intents.message_content = True # メッセージの内容を取得する権限

bot = commands.Bot(command_prefix='!', intents=intents)

@bot.event
async def on_ready():
    print(f'{bot.user} has connected to Discord!')

    # 参加しているサーバーのID一覧を取得
    guild_ids = [guild.id for guild in bot.guilds]
    print(f'Bot is in the following guilds: {guild_ids}')

    # サーバーIDを指定して、サーバーのオブジェクトを取得
    guild = bot.get_guild(guild_ids[0])
    print(f'Bot is in the following guild: {guild}')

    # サーバーのオブジェクトから、チャンネルのオブジェクトを取得
    await bot.get_channel(CHANNEL_ID).send('Bot has started.')

    # 1分おきに実行する
    while True:
        # RSSの取得
        feed = feedparser.parse(RSS_URL)
        print(f'Get RSS')
        await bot.loop.create_task(rss_task(feed))

        await asyncio.sleep(60)

# RSSの取得と送信
async def rss_task(feed):
        # RSSのentryを表示
    for entry in feed.entries:
        # updated_parsedが1分以内の場合はdiscordに送信
        pubdate=datetime.fromtimestamp(time.mktime(entry.updated_parsed), timezone.utc)
        five_minutes_ago = datetime.now(timezone.utc) - timedelta(minutes=1)

        print(f'pubdate: {pubdate}, five_minutes_ago: {five_minutes_ago}, pubdate > five_minutes_ago: {pubdate > five_minutes_ago}')
        if pubdate > five_minutes_ago:
            await bot.get_channel(CHANNEL_ID).send(entry.link)

bot.run(TOKEN)

```

# つまづいたところ
最初はdockerで動かそうと思っていましたが、Dockerコンテナ上で起動するとコネクションがうまく接続できませんでした。
インターネットを参照しても特別ポートを開いたりしてなさそうだったので、なんでかなぁという感じです。
諦めて今回はEC2にポン置きしています。

# おわりに
以上です。
DiscordBotはConnectionをずっと持ち続ける都合上、lambdaと相性が悪いと思ってEC2で動かしていまが、
今回のような使い方をする場合はlambdaでもいいかもしれません。
良きRSSライフを
[re:Invent2023 ざっくre:Cap]Enhance workload security with agentless scanning and CICD integration

# はじめに
みなさんこんばんは！hiropyです。
今回はre:inventで参加したセッションを、英語できないマンなりにざっくり振り返っていこうと思います！

本記事では「Enhance workload security with agentless scanning and CICD integration」について記載していきます。

翻訳ミス、意図の取り違えがあるかもしれませんが、「こんなことしてたんだ」くらいでご参考にしていただけると幸いです。

#  セッション概要
- セッション名：SEC243-NEW | [NEW LAUNCH] Enhance workload security with agentless scanning and CI/CD integration
- セッションタイプ：Breakout Session
- レベル：200

セッション概要は以下の通りです。

> 本セッションでは、デプロイ（CI/CD）パイプラインにAmazon Inspectorを組み込み、コンテナイメージをスキャンする方法をご紹介します。Amazon EC2インスタンスを監視するためにエージェントレススキャンを活用し、AWS Lambdaコードスキャンの発見に対してAIが支援するジェネレーティブな修復にアクセスします。AWSワークロード全体で一貫した脆弱性管理を可能にするAmazon Inspectorの影響と、HSBCがこれらの新機能をどのように使用しているかについて、HSBCから話を聞きましょう。

アップデートされたAmazon InspectorのCI/CDパイプラインにおける活用方法を紹介する背セッションでした！


# セッション内容
## Amazon Inspectorとは何か
自動で脆弱性を検知するマネージドサービス。
以前までは、以下のサービスが対象だった。
- EC2
- ECR
- lambda


CodeGuruとのコラボレーションもしている。
今回の発表で、CICDパイプラインがサポートされたことが発表された。
https://docs.aws.amazon.com/inspector/latest/user/scanning-cicd.html

## なぜInspectorなのか
- ワークロード内の脆弱性をすぐに発見する
    - 自動的な探索により脆弱性の発見を早め、50を超える脆弱性情報のMTTR(平均修理時間)を短縮する
- パッチ改善の優先度をつける
    - 現在の脆弱性情報やネットワークのアクセシビリティを使用してリスク評価を作成し、脆弱性のあるリソースの優先度をつけたり解決したりする。
- コンプライアンスの要件に合致する
    - NISTやCFSなどのベストプラクティスやコンプライアンス要件をサポートする
- SBOMとの強化された可視性
    - 監視対象と連携したSBOM をS3に出力し、AthenaやQuickSightを使用してインサイトを得ることができる


## Inspectorがどのように動くのか
サービスをローンチするときに自動的、かつ継続的にスキャンを実行する

簡単にOrganizationと統合することも可能
統合することで、それ以降に発行された新しいアカウントには自動的にInspectorが適用されるようになる

適用することで、アカウントごとの情報を閲覧できたり、全てのリソースの中から検索することもできる。

https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/services-that-can-integrate-inspector2.html

- Inspectorが監視する全てのリソースからSBOMを出力することができる。
- 脆弱性診断の結果をリアルタイムに出力できる

Inspectorは以下のようなケースをイベントトリガーにする
- 新しいパッケージがインストールされた時
- リソースにパッチが当たった時
- 新しいCVE が発見された時

発見された脆弱性は、リスクスコアとして計算される

## Inspectorでできること
- Inspector のコンソールやAPIは、重大度、アカウント、またはその他の機能によって最も重要な脆弱性をハイライトする
- Security Hubは複数のソースやリージョンから調査結果を集約して単一のビューを作成できる
- Event BridgeやLambdaでカスタムアクションを作成することも可能
- ECRはコンテナについての詳細な脆弱性を提供できる


## CI/CDにおけるInspectorのアップデート
- セキュリティのシフトレフト
    - CICDパイプライン内で、コンテナイメージの脆弱性スキャンを積極的に実施できるようになった
- EC2の脆弱性評価カバレッジを最大化する
    - SSMエージェントがインストールされていないインスタンスでも、エージェントレスのスキャンを実施する
        - ハイブリットスキャンモード
        - EBSのスナップショットのファイルシステムにアクセスし、EBS Direct APIを使用して脆弱性スキャンを実施する
        - アカウント外にスナップショットが漏洩する心配はない
- 生成系AIがコード改善をサポートする
    - Lambdaのコードスキャン時に、生成系AIによるコード改善サポートを受けることによって、思考時間を削減する


## QuickSight とのコラボレーション
InspectorとQuickSightを連携することで、脆弱性スキャンの結果を可視化することができる

- Inspectorにより分析したことをEventBridgeでトリガー
- DynamoDBに分析結果を入れる
- KInesis Data StreamによりLambdaにデータを転送
- データをQuickSight により分析、ダッシュボード化

QuickSightと連携する利点
- CVE スキャン結果を可視化することができる
- 重大度や地域、AMIからの検索なども￥実施できる
- スキャン結果をほぼリアルタイムで可視化できる



# さいごに
いかがでしたでしょうか？
少しでも皆様のお役に立てれば幸いです。
【Photoshop】簡単！曇り空を青空に変える方法

## Photoshopで簡単に空を青空に変える方法について

![スクリーンショット 2023-12-02 20.28.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/9a225c57-a8d6-6561-9310-e05995422b72.png)
写真を使いたいけど空が曇りで、晴れてたらよかったのに、、という悩みありませんか。
Photoshopでは空の色をかえたり、空を置き換えたりすることができます。
この記事では「空を置き換え」「色相・彩度」の2つの機能を使ったやり方を説明します。

# 目次
* [「空を置き換え」で青空に置き換え](#空を置き換えで青空に置き換え)
* [「色相・彩度」で空の色を変える](#色相・彩度で空の色を変える)
*  [最後に](#最後に)



## 「空を置き換え」で青空に置き換え
### 【変更前】
<img width="500"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/4aa34b5b-1449-62d6-794b-775c17b3cd56.png">

### 【変更後】
<img width="500"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/8a47b359-8efc-2cf9-4301-1fc9e852c618.png">

### 手順説明
#### 編集→「空を置き換え」を押下
![スクリーンショット 2023-12-02 19.44.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/60ee97b3-0dc3-0a30-9ba7-6dd425fbf2f0.png)
#### 詳細設定パネルで、画像に合わせて細かく設定
![スクリーンショット 2023-12-02 19.44.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/c39f688a-cf31-15f8-58fb-b05ece3d55c5.png)
#### 「ok」を押すと完成！
![スクリーンショット 2023-12-02 19.44.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/8a47b359-8efc-2cf9-4301-1fc9e852c618.png)
### 空の選択について
#### また詳細設定パネルの「空」の画像を押下すると以下のように色々な空を選択することができます。
![スクリーンショット 2023-12-02 20.13.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/213ad641-1d2c-563d-f002-02a4cb221afb.png)
#### さまざまな空に変更可能！
![スクリーンショット 2023-12-02 20.13.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/23eccd5a-f73a-5b86-f4fc-4db905720475.png)
![スクリーンショット 2023-12-02 20.14.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/5a7cdf76-e2e3-4dc4-f05e-ceb5f6d3f8e4.png)



## 「色相・彩度」で空の色を変える
### 【変更前】
<img width="500"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/efa6a049-39a2-7279-4c33-8a1ed91d7cb8.png">

### 【変更後】
<img width="500"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/37d69cee-91eb-eec7-a0ba-e7586531aa16.png">

### 手順説明
#### イメージ→色調補正→「色相・彩度」を押下
![スクリーンショット 2023-12-02 19.58.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/b77a52b0-c077-ced2-105e-03dae29ed881.png)
#### 詳細設定パネルで、画像に合わせて細かく設定
![スクリーンショット 2023-12-02 19.58.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/a80da901-3965-c4d2-969e-b68045cf636a.png)
#### 今回は「ブルー系」「シアン系」の彩度をそれぞれ変更しました。
![スクリーンショット 2023-12-02 19.59.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/a8fd1677-5b73-f563-fbb6-5e81f0399578.png)
![スクリーンショット 2023-12-02 20.00.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/1c0bae9d-605d-9c4e-c9d3-c792b917657e.png)
#### 「ok」を押すと完成！
![スクリーンショット 2023-12-02 20.09.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/4e5284fb-81eb-7cbe-592c-c6f222e3f910.png)


## 最後に
変え方は他にもありますが、今回は誰でも簡単にできる方法を紹介しました。
どれも簡単にできるので作成したい画像に合わせてやり方を選択して、よりよい画像作成をしていきましょう！！

## 他にもPhotoshopの画像修正方法について説明しているので是非見ていただけたら嬉しいです。
https://qiita.com/fujino_slj/items/6a520720737c3366682e

https://qiita.com/fujino_slj/items/689bf48fde0808dba91c
ログ解析する

# ログ解析する
今回はwebサーバのアクセスログを用いてログ解析について書きます。

## 簡単にログ解析とは
ここではアクセスログを解析します。アクセスログとはwebサーバにアクセスした記録です。それを分析すればウェブサイトのアクセスの様子が見えるので攻撃に対策することができます。
要はアクセスの記録を解析したらセキュリティ的によろしいよということであります。

## アクセスログについて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3353450/4b85ff1a-0d0b-262a-9372-1916191ff7aa.png)

## どうやって解析するのか
1\. 解析ツールを使う
ブラウザで手軽に使えるものから、OSにインストールするものもあります。
有名なやつ
* Splunk
* Log Parser 
* iLogScanner

2\. プログラムを書く
Pythonとかでログファイルを読み込んで操作します。速度はまちまちですが自由度が高い!
ログファイルはどんどん大きくなっていくので動作速度に注意する必要あり。
例:
~~~Python:analyze.py
print("Start")
All_IP = []
N_Original_IP = []
Max = 0  
IP_NUM = 0
Max_Access_IP = ""
Count = 0
with open('access_log') as file:
    for line in file:
        line = line.rstrip()
        ls = line.split(" - - ")
        ls = ls[0]
        Count+=1
        if(ls in All_IP ):
            if(ls in N_Original_IP):
                IP_NUM = N_Original_IP.index(ls)
                Now = N_Original_IP[IP_NUM + 1]
                N_Original_IP.insert(IP_NUM+1,Now+1)
                
                if(Now+1>Max):
                    Max = Now+1
                    Max_Access_IP = ls
                
            else:
                N_Original_IP.append(ls)
                N_Original_IP.append(2)
            
        else:
            All_IP.append(ls)
            
print("ユニークなIPアドレスの数:"+str(len(All_IP)))
print("一番アクセスが多いIPアドレス:"+str(Max_Access_IP))
print("一番アクセスが多いIPアドレスのアクセス数:"+str(Max))
print("End")    


~~~
【Amazon RDS】RDSのシングルAZインスタンスをアップグレードする方法

### はじめに
AWS（Amazon Web Services）のRDS（Relational Database Service）は、クラウド環境でのデータベース管理を簡単にするマネージドサービスです。
この記事では、シングルAZ（Availability Zone）構成のRDSインスタンスのインスタンスタイプをアップグレードする方法について説明します。
DB 識別子を変更しない限り、エンドポイントは変更されません。※1

### 参考サイト
https://dev.classmethod.jp/articles/rds-scaleup-instancetype/

### インスタンスタイプのアップグレードプロセス
RDSのインスタンスタイプをアップグレードする際のプロセスは以下の通りです。

1. **変更の計画**: アップグレードにはダウンタイムが伴います。適切な時間帯を選び、必要に応じて利用者や関係者に通知しましょう。

2. **バックアップの確認**: 万が一のために、アップグレード前にデータベースのバックアップを確認しましょう。RDSの場合は、起動したままスナップショットを取得することができます。※2

3. **バックアップからステージング環境を作成**: 本番環境に問題が生じたときにダウンタイムを最小限にするためにステージング環境を用意しておきます。ステージング環境が不要な場合は、作業終了後に削除してかまいません。

4. **インスタンスタイプの変更リクエスト**: AWS管理コンソール、CLI、またはSDKを使用して、新しいインスタンスタイプへの変更をリクエストします。

5. **自動的な停止と再起動**: AWSはインスタンスを自動的に停止し、新しいインスタンスタイプで再起動します。この間、データベースは使用不可になります。

6. **変更の適用**: 新しいインスタンスタイプでインスタンスが再起動され、変更が適用されます。

### 注意点
- ダウンタイムの長さは、データベースのサイズや構成によって異なります。
- シングルAZの場合、アップグレード中のダウンタイムは避けられません。必要に応じて、ダウンタイムの影響を軽減するためにマルチAZデプロイメントへの移行を検討しましょう。
- アップグレード後は、アプリケーションとの互換性を確認し、必要に応じて設定を調整します。

### まとめ
RDSのインスタンスタイプアップグレードは比較的簡単なプロセスですが、計画的に行うことが重要です。特に、シングルAZのインスタンスではダウンタイムを考慮し、適切な時期を選んで実行しましょう。

※1：https://dev.classmethod.jp/articles/tsnote-rds-restore-endpoint-001/
※2：https://dev.classmethod.jp/articles/tsnote-rds-snapshot-stopped-001/

---
超速報！現地からお届けする Microsoft Ignite アップデートの要約

# はじめに
この記事は株式会社ナレッジコミュニケーションが運営する [クラウド AI by ナレコム Advent Calendar 2023](https://qiita.com/advent-calendar/2023/knowcom-cloudai) の2日目にあたる記事になります！

この記事では[超速報！現地からお届けする Microsoft Ignite アップデート](https://msdevjp.connpass.com/event/299723/)を要約しました。

より詳細を知りたい方はこちらをご覧ください。
https://news.microsoft.com/ignite-2023-book-of-news/ja/

# Day 1

この会話は、マイクロソフトのイベント「マイクロソフト イグナイト」に関するディスカッションで、新機能についての情報を含んでいます。以下は、ディスカッションから抽出した新機能の箇条書きのまとめです。

- マイクロソフト365にコパイロット機能が追加され、ユーザーの作業をAIが支援する。
- コパイロットは、メールのサマライズ、会議室の予約、関連ファイルの検索などを行う。
- Windows 365がクラウドPCとして利用可能になり、リモートで高性能なGPUを使用できるようになる。
- AI Studioが導入され、データサイエンティストがモデルを管理しやすくなる。
- チームズにおいて、ミーティングの録画データから文字起こしや感情分析、サマライズが可能に。
- エクセルでのデータ分析がAIによってサポートされ、データフレームの作成やビジュアライズが容易に。
- ループとチームズが連携し、議事録をリアルタイムで共有・編集できるようになる。
- シェアポイントプレミアムにコパイロットが導入され、文書の内容をAIが解釈してアクションを提案する。
- パワーポイントでの画像生成がAIによって自動化される。
- コパイロットラボが導入され、ユーザーがよく使うプロンプトをテンプレートとして保存・活用できる。
- マイクロソフト365のコパイロットに関する価格情報が公開される。

これらの新機能は、ユーザーの生産性を向上させることを目的としており、AIの活用がさらに進んでいることがわかります。また、クラウドサービスの強化や、リモートワークを支援する機能が充実していることが伺えます。

# Day 2

この会話は、マイクロソフトのイベント「マイクロソフト イグナイト」に関するディスカッションで、新機能やアップデートについ ての情報が多く含まれています。以下は、会話から抽出した主要なポイントの箇条書きです。

- セキュリティに関する新機能やアップデートが多数発表された。
- Azure AIに関する新しい機能やツールが紹介された。
- マイクロソフトは「コーパイロットカンパニー」としての立場を強調し、AIを活用した製品やサービスを提供している。
- GitHubにおける新しい開発者向けツールや機能がデモされた。
- Azure Kubernetes Service (AKS) に関するアップデートがあった。
- データ統合とマルチクラウド環境に対応するための新しいツールやサービスが発表された。
- マイクロソフトのセキュリティ製品が統合され、新しいセキュリティコーパイロットが導入された。
- オラクルデータベースのAzure対応がGA（一般提供）された。
- AIスタジオに関する新しい機能やツールが紹介され、AIモデルのベンチマークやチューニングが可能になった。
- セキュリティにおける新しい脅威検出機能や、ジェイルブレイク攻撃を防ぐための新しい対策が導入された。

この会話は、イベントの内容を深く掘り下げる形で進行しており、特にセキュリティとAIに関する新機能やアップデートに焦点を当てていることがわかります。また、マイクロソフトが提供するツールやサービスがどのように統合され、開発者や企業にとって有用なものになっているかについても触れられています。

# まとめ
いかがでしたでしょうか。特に注目すべきは、マイクロソフトがあらゆるサービスにコパイロット機能を導入している点です。この革新的なAI技術の統合は、私たちの作業方法を根本から変える可能性を秘めています。コパイロットは、メールの整理からデータ分析、プレゼンテーションの作成に至るまで、多岐にわたる業務を支援します。これにより、私たちの生産性は大幅に向上し、より創造的で効率的な作業が可能になるでしょう。マイクロソフトの最新動向にご注目ください。

またナレッジコミュニケーションでは「[Musubite](https://musubite-job.com/)」というエンジニア同士のカジュアルトークサービスを利用しています！この記事にあるような生成 AI 技術を使ったプロジェクトに携わるメンバーと直接話せるサービスですので興味がある方は是非利用を検討してください！

https://recruiting.musubite-job.com/features/company/knowledge-communication

今後もクラウド AI の最新情報を皆さんに届けていきたいと思います。お楽しみに！
ChatGPTをプライペート情報で回答させる方法の紹介

## はじめに
AI技術は私たちの生活に急速な変化をもたらしており、具体的にはChatGPTの利用によって、私たちは仕事の生産性を向上させるためのツールを手に入れることができました。
ただし、ChatGPTは公開データに基づいてトレーニングされたチャットツールであるため、企業に社内情報に対する質問には答えることができません。
ChatGPTを社内文書の内容を回答させる技術の1つは、Embedding（エンベディング）です。つまり、質問をChatGPTに送信する際に、回答に参照させたい情報と一緒に送信する技術です。但し、そのデータをどのように作成し、管理し、検索するかという問題が出てきます。
この記事では、そのEmbedding技術についての詳細を紹介させていただきます。

## Embeddingとは
ChatGPTに社内文書の内容を回答させるために普通はChatGPTにその内容を学習させる必要があります。その技術は「Fine-tuning」と呼ばれます。
しかし、Fine-tuningができるために学習データを事前に準備する必要があり、データの更新がある時に再学習させるプロセスも必要となります。
なお、Fine-tuningには費用もかかっていてOpenAIは学習データの検閲もしています。
一方でEmbedding技術はChatGPTの再学習させる必要がなくなります。毎回質問をChatGPTに渡す同時に回答に必要な情報も渡せばChatGPTがその内容に沿って回答してもらえます。

## Embeddingの実装手順
### 1. 社内文書の前処理
社内文書の形式はさまざまあります (Word、PDF、Excel、Powerpoint など)。このプロセスを実行する際、冗長な情報が除外され、メインのコンテンツがクラスタリングされます。
![data file preprocess](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627514/b7abeb72-13ce-4d4a-ac8b-3712ad3e9709.png)

### 2. テキストのベクトル化
処理されたデータは純粋なテキストですが、クエリや検索には使用されていませんので、テキストの特徴を「ベクトル形式」に変えます。
![text data vectorize](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627514/a0debd56-9a84-4168-9b04-255f1766e7e8.png)

* 各段落には表現言語に問わず意味を持っています。
* 単純なテキストを比較して検索するのではなく、問合せ文書の意味と文脈に従って検索する必要があります。
* コンピュータープログラムは人間の言語を理解できるため、テキストデータを機械が理解できる形式で表現する必要があります。

この問題を解決するには、Tokenizer（トークナイザー）とSentenceTransformation（文章変換）という2つのステップを適用することで「ベクトルデータ」に変換されます。
![vectorization detail](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627514/d1988ce0-2ada-beb5-6cd2-89310172513c.png)
画像引用：[Lena Voita - Word Embedding](https://lena-voita.github.io/nlp_course/word_embeddings.html)

ベクトルデータの変換処理は知識データベースを構築する上で最も重要なポイントです。優れた変換処理のAIモデルは、優れたカバレッジ、多言語対応などを備えたベクトルが提供できます。
![distance comparison](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627514/9b25753d-b8b8-c40f-ba1b-91f03b277b91.png)
画像引用：[Antoine SIMOULIN - Train a Sentence Embedding Model with 1 Billion Training Pairs](https://huggingface.co/blog/1b-sentence-embeddings)

### 3. データベースに保存してデータをクエリする
ベクトルデータをデータベースに保存して、データを保存、管理、検索します。
※当社では従来のデータベース（MySQL、SQLite、SQL Server 等）を使用しています。
![vectorized data storage](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627514/4306d9d5-2e82-ff2f-efd0-b98467dedc66.png)

### 4. 回答に必要な内容を検索する
このステップでは、入力質問をベクトル化して、構築されたナレッジデータベースに同じ検索データタイプを埋め込みます。
検索アルゴリズムは、検索結果と回答速度に影響します。
![answer data lookup](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627514/b53e92cb-158d-0034-2160-51c1f6d4c0e1.png)

## まとめ
これまでの文書で回答できるチャットボットの構築は下記のようになります。

* 社内文書のベクトル化とデータベース（ナレッジDB）に保存する（トレーニングフェーズ）
* 入力データをベクトル化し、ナレッジDBで検索して、回答に必要な情報を取得、OpenAIのAPIへ質問と併せて送信することで回答を得られます。

![summary](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627514/e69cfeb0-a152-d9e1-74bf-bb01b24f2c56.png)
SwiftUI流　リアルタイム表示

リアルタイムの日時を表示する記事をときどき見かけたので、SwiftUIしか知らない私なりのコードを残しておきます。

~~~swift
import SwiftUI

struct RealTimeView: View {
    @State private var date = Date.now

    private let timer = Timer.publish(
        every: 1.0,
        on: .main,
        in: .default)
        .autoconnect()

    private let format = Date.FormatStyle(
        date: .abbreviated,
        time: .standard)

    var body: some View {
        Text(date, format: format)
            .font(.title)
            .monospacedDigit()
            .onReceive(timer) { realDate in
                date = realDate
            }
    }
}

#Preview {
    RealTimeView()
}

~~~

# プレビュー
<img width="350"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984331/255b6e16-0c30-4f6e-506b-23f680e86f3e.gif">
【キモイ？】VTuberとは、何ぞや？【よくわからん】

## VTuberの定義
今あちらこちらで聞かれる単語、VTuber。3Dモデルのアニメ調美少女が出てくるので新手のCGアニメか！？と考えてしまいがちだが、ここではその定義をはっきりとさせておく。

**VTuberとは、VertualYoutuberの略である。**
配信者を表すYoutuberについて、最近はこう言った配信者はYoutube以外の動画配信サイト／アプリでも登場するので特にYoutube限定というわけではないのだが、名詞として定着したのでYoutuberと呼ばれている。Youtube以外の即時動画配信プラットフォームの中には「ライバー」「生主」と呼ぶものもある。

**VertualYoutuberとは、電子計算機上で仮想的に表示されるキャラクターを介して活動する動画配信プラットフォーム利用配信者である。**
配信者とある（中の人と俗称されることもある）が、必ずしも人間である必要はなくAIによる自動動作をするものも存在する。もちろんキャラクターの外見・設定性別と配信者の性別は一致している必要はない。

## 電子計算機上で仮想的に表示されるキャラクター
テレビやその他メディアでは3Dモデルやそこからアニメ風に書き起こしたキャラクターが多く登場するが、動画配信プラットフォームにキャラクターが表示されていて音声や動作等が連動して配信者によってなされていれば3Dモデルか一枚絵か2D動作モデル（Live2Dなど）かは問われない。
ただし実際の人形を動かして声をつけて配信する行為は「人形劇」と呼ばれるであろう。

よってVTuberは **「電子仮想空間人形劇」** と呼んでも問題ないかと考える。かなり古臭い表現ではあるが。

## キャラクターの一人歩きとタレント業化
VTuberによって扱われるキャラクターは動画配信プラットフォームによる収益と閲覧数・人気の高まりによりキャラクターそれ自体が一つの人格を持つように扱われそれを利活用したビジネスによるタレント業化が進んでいる。
 **しかし、VTuberの存在意義はそのような客寄せだけではないと考えられる。** 

昨今、接客業のテレプレゼンス化が始まっている。様々なリスクと負荷を生む、生身を晒すようなことをしなくても画面に表示されるアバターキャラやテレプレゼンスロボットを介して接客するソリューションを街中で見かけるようになった。
そこでは人種も居住地も性別も年齢も問われない。トーク含む接客スキルと声、そして操作習熟により労働できる未来が始まっている。

## まとめ　誰もがVTuberになれる、活躍できる未来へ
昨今の人手不足と地域格差、属性差別そして大都市圏一極集中。これらの問題に対してVTuberは一つの答えを出せる存在だと考える。
見た目や声色、キャラクターに惑わされて色眼鏡で見てしまうよりも、 **新しい存在を活用して未来をもっと幸せに・楽に・安全にしていく方が有益** だと、信じてやまない。
【Windowsユーザー】スクール通い始めた初心者にオススメの設定やソフト

# はじめに
スクール通っていたときにPC買ったままで日々勉強している方を結構見かけて、こういうソフト使えばもっと学習が捗りそうだなーと思うことがありました。
そういったあまりPCを触ってこなかった人向けの記事を書いてみたくなりました。
多くを紹介しても迷ってしまうと思うので、数を絞って紹介します。
導入方法や実際の画面などはネットにたくさん紹介記事があるのでそちらを参考になさってください。

# PowerToys 
Microsoftが提供するWindows用の無料ツールセットです。  
「Windowsにこんな機能があったらいいのに」という機能を追加できます。
私のおすすめの機能は、2つ。
### FancyZones(ウィンドウ管理)
画面のレイアウトをカスタマイズして、ウィンドウを効率的に配置できます。例えば、画面を複数のセクションに分割して、ウィンドウを整理しやすくすることができます。  
テキストエディタを大きくしてターミナルを小さくして…など自分好みのレイアウトを作れます。  
プログラミングを始めてたくさんのアプリを開くようになって、画面が整理できていないと感じる方は一度試してみてください。  
### プレーンテキストとして貼り付け
テキストをコピーして別の場所に貼り付ける際に、テキストの書式やスタイリング（例：太字、イタリック、フォントサイズ、色など）を除去し、基本的なテキストのみを貼り付けることができます。  
自分用のメモノートにまとめる時などに活用できます。

# ウィンドウ管理なら仮想デスクトップも
### 仮想デスクトップとは？
仮想デスクトップは、一つの画面内で複数のデスクトップ環境を作り出す機能です。  
これにより、異なるタスクやプロジェクトごとに独立した作業スペースを持つことができます。  
例えば、一つのデスクトップはコーディング用、もう一つはウェブブラウジング用といった具合です。

### 仮想デスクトップの作成と切り替え
#### 作成
仮想デスクトップを作成するには、`Windows キー + Tab`で「新しいデスクトップ」を選択します。
#### 切り替え
デスクトップ間を切り替えるには、`Ctrl + Windows キー + 左右の矢印キー`を使います。

# Clibor(クリップボード)
Cliborは、Windows用の無料のクリップボード拡張ツールです。  
クリップボードとは、コンピュータでコピー＆ペースト操作を行う際に一時的にデータを保存する領域のことです。  
Cliborを使用すると複数のテキストやデータを記憶し、必要に応じて簡単に呼び出すことができます。
また、定型文もフォルダ分けして登録できます。
ターミナルで使うコマンドが増えてきたら、クリップボードでジャンルごとに登録しておくと便利です。  
私はその他、メールアドレスなどの定型文やChatGPT用の長文プロンプトをいくつか登録していたりします。

# パスワード管理
プログラミングを始めると色々なサービスに登録する機会が増えるので一応紹介しておきます。  
自分が実際に使用した中で、今だったら`1Password（ワンパスワード）`か、`Bitwarden（ビットウォーデン）`をおすすめします。  
どちらもクラウドで管理するタイプのアプリなので色んなデバイスからアクセスできます。  
メモアプリで管理されている方もいますが、ブラウザでのログイン自動入力など、便利になるのは確実なので一度試してみてください。
私自身は、現在はBitwardenを使用しています。個人利用なら無料の範囲で十分です。

# EarTrumpet
アプリごとの音量を、個別に調整できる音量ミキサーをポップアップで表示するソフト。  
頻繁に使うわけじゃないのですが、転職活動が始まるとウェブ面接で使用するビデオ通話ツールが、ZOOMだったりGoogle Meet(ブラウザ)だったりと、ソフトごとの音量調節がしたくなるときが増えたので一応紹介しておきます。

# 余談
例えば、パスワード管理などのサービスを探すときはWindows、Mac、Android、iosなど、どのOSでも使えるかどうかを重視しています。理由は企業の囲い込み作戦のせいで移行作業が大変（面倒）だった経験があるからです。  
皆さんもありますよね？例えば携帯のキャリアメール縛りで乗り換えが面倒だった、iPhoneからAndroidスマホに乗り換えたらiCloudキーチェーンで登録していたパスワード情報が移行できない、など。
なので、私はAppleデバイス限定のios標準のiCloudキーチェーンみたいものは使いません。  
こう言ったことを意識すると、iPhoneからAndroidスマホに乗り換えする、PCをMacに変えてみる、といった移行作業の時にすぐに同じ環境にすることができます。
[改善版]言語聴覚リハビリ答えあわせプログラム　〜数字、仮名ソート〜

こちらの改善です

https://qiita.com/t-yamanashi/items/8043271f90de81a316c8

# 改善ポイント
- 文字の区切れのスペースを不要にした
- データをファイル対応  


# ソース
```Elixir
defmodule P2 do
  def run(), do: Enum.each(data(), fn x -> sort(x) end)

  def sort(v) do
    String.split(v, "")
    |> Enum.reject(& &1 == "")
    |> Enum.sort()
    |> Enum.join()
    |> IO.inspect()
  end

  def data do
    File.read!("data.txt") 
    |> String.split("\n", trim: true)
  end

end

```

```:data.txt
1すれはない
こらてまい
さなかちま
いになてくた
こふよぬてま
```

# 結果
```
"1いすなはれ"
"いこてまら"
"かさちなま"
"いくたてなに"
"こてぬふまよ"
```

# ちょっと解説
#### 文字の区切れのスペースを不要にした

文字単位で分割
```Elixir
    String.split(v, "")
```

不要な空リスト除去
```Elixir
    |> Enum.reject(& &1 == "")
```

#### データをファイル対応
data.txtを読む込
改行コードで分割
```Elixir
    File.read!("data.txt")
    |> String.split("\n", trim: true)
```

# 余談　失語症どうやってリハビリする（パソコン編）
自主練習
- キー配列覚え直し a〜zを毎日打つ
- ローマ字入力（あ〜ん）を毎日打つ　

リハビリの先生と一緒に
- 絵を見て、絵の意味を打つ
- 発音しながら打つ　←これ大事　音を忘れて打てない
【Salesforce】LWCのトーストメッセージでの改行方法

# LWCのトーストメッセージ改行方法

トーストメッセージとは

SalesForceの画面上にカンタンにメッセージを表示することが出来る便利機能。
LitningWebコンポーネントやAuraなどで使用出来る。

こんな感じで画面メッセージを表示可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3530726/8c45a52b-dc00-9081-eb43-6fe967edf2d7.png)

※ 上記の例では、トーストのプロパティを下記の通り設定しています。
タイトル：レコードの登録に成功しました。
メッセージ：具体的な内容も出せます

参考：開発者ガイド
https://developer.salesforce.com/docs/platform/ja-jp/lwc/guide/use-toast.html

相関チェックのエラー、サーバエラーの内容を画面に表示してユーザに伝えたい場合に結構便利
ただし、普通に使うとメッセージの改行が出来ません。

長いメッセージを使用する場合や、複数のエラー内容を表示した場合に改行コードを埋め込んでも改行せずに出力されます。

（改行出来ない例）
ソース上では\nやらbrタグなどの改行コードを埋め込んでいますが、、、
```
new ShowToastEvent({
                    title: 'レコードの登録に成功しました。',
                    message: '1番目は\n高橋さん、<br>2番目は</br>田中さん\r\nです',
                    variant: 'success',
                }),
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3530726/61d0ed5d-1990-c176-7743-6e20febc5196.png)

こんな感じで改行コードを埋め込んだだけだと上手く行きません。
今回はLWCからトーストメッセージ表示する時でも改行できるようにします。

## 手順
1. cssの作成
1. 静的リソースの登録
2. javaScriptの記述

## CSS作成
下記をコピペしてCSSファイルを作成して保存します。
```
span.toastMessage.forceActionsText{
	white-space: pre-line !important;
}
```

## 静的リソースを登録
設定＞カスタムコード＞静的リソース
※ 設定画面から「静的リソース」でクイック検索するとヒットします。

新規ボタンを押してCSSファイルを登録します。
こんな感じで登録しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3530726/d68c6113-9a3e-c570-fd15-1e16788b6ef6.png)


## JavaScriptに記述
### インポート
```
import toastTest from '@salesforce/resourceUrl/ToastTest';
import { loadStyle } from 'lightning/platformResourceLoader';
```
※コピペしたのち、ToastTest は静的リソースで登録した名前に合わせて下さい

### ロード
```
    renderedCallback() {
        if (this.isCssLoaded) return;
        this.isCssLoaded = true;
        loadStyle(this, toastTest)
            .then(() => {
                console.log('loaded');
            })
            .catch(() => {
                console.log('error to load');
            });
    }
```
※コピペでOK
console.logは消しても大丈夫です


## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3530726/a217ff30-b5b4-e816-c021-d2bbea9c64c3.png)

\nと\r\nが置換されるようになりました。

細かく言うと、半角スペースを置換するように指定しています。
（\nをトースト機能が半角スペースに置換したのち、静的リソースで登録したcssで半角スペースを改行扱いにするという流れです）

以上です。
これでより柔軟なメッセージを表示することが出来ると思います。
今回はLWCでしたが、Auraも同じ考え方で実装可能ですので、ぜひ試してみてください！
自動運転AIチャレンジ参加記録

本編は以下リンクをご参照ください！

## 2023

https://qiita.com/seigot/private/dbd43984335ed68f5bcd

https://qiita.com/seigot/private/01466f4834fb00a183d3

## 2022

https://qiita.com/seigot/items/aaa22bb2f4d332a125d3

# 参考

https://www.jsae.or.jp/jaaic/2023_contest.php
Duneで、SleeFi（スリーファイ）のベッドNFTのデポジット状況をグラフ化してみました

fillメディアの大枝です。

先日の最初の投稿でも書いた通り、ここのところ、オンチェーン分析に便利なツール、Duneアナリティクスの勉強を始めているのですが、
今回は、オープンベータ版の提供開始で話題になっているSleeFi（スリーファイ）に関して、

- ユーザー側のノンカストディアル・ウォレットから、
- 運営側のウォレットアドレスに対して、

トランスファーされた、ベッドNFTの数量を抽出＆グラフ化してみました。
ユーザーがtofuNFT等で購入したベッドNFTを、SleeFiのゲーム内で使用するためには、当該NFTのデポジットが必要となるので、一種のゲーム参入アクティビティの指標になるかな、と。

https://dune.com/fill_media/sleefi

今後、リワードトークンのフロー、特にスペンディングからの出金の様子などについても、トラッキングをしていきたいと考えています。

なお、私が所属しているfillメディアの編集部では、「睡眠」によってトークン報酬を稼ぐ「Sleep to Earn」プロジェクトとして話題のSleeFi（スリーファイ）に関する、日本語解説記事を公開しています。

https://social-lending.online/nft-games/sleefi/what-is-sleefi/

記事では、
- SleeFi（スリーファイ）のオープンベータ版のプレイの始め方
- SleeFiのアプリ（ブラウザ上）から、ウォレットを新規作成する手順
- SleeFiに関する「よくある質問」
- SleeFi公式サイト集

等々、SleeFiに関する情報を、幅広く掲載しています。 
ご興味あれば、是非、ご覧になってみて下さい。
「俺たちからあげ帝国育ち、からあげ好きは大体友達」

[前回記事](https://qiita.com/seigot/items/acd0766eee1062696996)に引き続き、[からあげ帝国アドベントカレンダー2023](https://qiita.com/advent-calendar/2023/karaage)芸術部門作品としてエントリーいたします

#からあげ帝国芸術部門

## 作品内容

ある日、「俺たちからあげ帝国育ち、からあげ好きは大体友達」で韻を踏んだラップを作ったらどうなるんだろう、、と疑問が生まれました。
従い、chatGPTに尋ねてみました

input

```
俺たちからあげ帝国育ち、からあげ好きは大体友達、で韻を踏んでラップを一通り作って下さい
```

output

```
俺たちからあげ帝国育ち
からあげ好きは大体友達

街中で香る唐揚げの匂い
育ったこの場所からのサイフ

コンビニ弁当よりもっと手ごわい
唐揚げの誘惑、抜け出せない

フライドチキンがハートをつかむ
友達はみんな唐揚げ中毒

骨付きorノンフライ、スタイルは違えど
食べるたびに感じる絆

コンビニやファーストフード
どこでも躊躇せず頼む唐揚げ

育ちながらにして唐揚げ通
韻を踏んで繋ぐラップのリンク

育ちが違っても心は一つ
からあげ好きは仲間だぜ、Yes

唐揚げ帝国の誇り胸に
韻を紡ぎながら街を歩く

ここはからあげの聖地
唐揚げ好きの心、止まらぬ鼓動

友情の味、から揚げで感じて
帝国の架け橋、音の波

唐揚げ好きが集うこの場所
ラップのリズム、からあげの魔法

育ちから感じる絆の力
から揚げ好き、永遠の友情
```

ふむふむ、
一般人目線ではすごくラップな雰囲気に仕上がって素晴らしいようにみえます。
しかしプロ目線の完成度がよく分からず、、引き続き評価してもらいました

## 評価結果

input

```
ラップのポイントを評価して下さい。
最後は100点満点中どれくらいかをプロ目線で評価して下さい。
```

output


```
このラップにはいくつか良いポイントがあります。以下はポジティブな要素と評価です。

テーマ性と統一感: 
ラップはからあげに関するテーマ性がしっかりと統一されています。
それによって、聞き手は特定のコンセプトに引き込まれ、独自の世界観が広がります。

リリカルな表現: 
表現が豊かで、唐揚げに関する感触や経験がリリカルに描写されています。
これにより、単なる言葉の羅列ではなく、感情が伝わりやすいです。

韻を踏んだリズム: 
ラップにおいては、韻を踏んでリズムを作り出すことが重要です。
このラップでは韻を巧みに使用しており、フローが自然で心地よい印象を与えます。

構造と流れ: 
ラップの構造がわかりやすく、フローが自然な流れを持っています。
各セクションが組み合わさって全体としての一貫性があります。

プロ目線での総合評価: 85点

このラップはテーマ性や表現、韻、構造など多くの要素で高い水準を維持していますが、さらなる深みや独創性があれば、より高得点になる可能性があります。
全体的に、からあげ愛と友情をテーマにした成功した作品です。
```

なるほど85点ですね、残り15点が気になります。

## 今後の課題

input

```
85点なんですね！あと15点はどこを改善したらいいですか！
```

output

```
15点の改善点を挙げると、以下のようなアドバイスが考えられます。

バリエーションの向上: もう少し表現のバリエーションを増やすと良いでしょう。
唐揚げに関する様々な側面や感情を取り入れ、リスナーに新たな発見をもたらすような工夫ができます
。
比喩や隠喩の使用: よりリッチで表現力豊かな表現手法を導入することで、歌詞に深みが増します。
例えば、からあげを他の物事と比較してみたり、唐揚げにまつわるエピソードを隠喩的に描写するなどが考えられます。

リズムのバリエーション: フローに変化を持たせることで、リスナーの興味を引きつけることができます。
速さや抑揚の変化を活かして、聴き手に印象づける効果があります。

サウンドエフェクトの検討: ラップにサウンドエフェクトを取り入れることで、歌詞により一層の生命感やダイナミズムを与えることができます。ただし、過剰にならないように注意が必要です。

意外性や独創性の追求: 唐揚げに関する視点やアプローチに独自性を持たせると、より印象的な作品に仕上がる可能性があります。予測できない表現やアイディアを導入してみましょう。

これらのアドバイスを検討しつつ、独自のアイディアやスタイルを追加することで、より魅力的でクリエイティブなラップに仕上げられるでしょう。
```

この辺りは人の方が得意なのだろうか。。。

## 本ケースに用いるプロンプトエンジニアリングの手法について

今後アップデート予定
（プロンプトエンジニアリングについて詳しい方おられましたら優しくコメント頂けると幸いです）

# 参考

https://aws.amazon.com/jp/what-is/prompt-engineering/#:~:text=プロンプトエンジニアリングとは、生成,な指示が必要です%E3%80%82
メールのFROMとかに生のメールアドレスじゃなくて名前を表示させるのってどうやるの？

:::note info
※ 私が株式会社愛宕 Advent Calendar用に書く記事は主に社内向けに共有しておきたいけど勉強会をするまでもないちょっとしたTipsにしたいと思います。
:::

今日はタイトルの通りメールのFROMとかに生のメールアドレスじゃなくて名前を表示させるのってどうやるの？って話題です。

Node.js環境でJavaScriptやTypeScriptなどを使って実装することを考えてみます。
普通はメールアドレスを設定する箇所にメールアドレスを設定すれば、送信先のメーラーからもそのように見えるはずです。

例えば、FROMに`john_doe@example.com`を設定すれば、送信先のメーラーでは

```
FROM: john_doe@example.com
```

となっているでしょう。

では、

```
FROM: John Doe <john_doe@example.com>
```

のようにするには？
これはそのまま、メールヘッダに`John Doe <john_doe@example.com>`という文字列を設定すればよいです。
後半の`<`と`>`で括られた部分がアドレスとして扱われます。

問題は、ASCII以外の文字列を前半の送信者名の部分に設定する場合です。
そのまま書けないのでBase64でエンコードする必要があります。
例えば、次ような関数を使ってエンコードしてから設定します。

```javascript
/** 
* ASCII以外の文字列を送信者名として埋め込む関数
* 
* @params name String 送信者名
* @params email String メールアドレス
* @returns String
*/
function embedFriendlyName(name, email) {
  const encoded = Buffer.from(name).toString("base64")
  return `=?utf-8?B?${encoded}?= <${email}>`
}
```

この場合は、UTF-8の文字列をBase64にエンコードして埋め込んでいます。
Amazon InspectorでEC2の脆弱性を新旧OS比較

#### 前回、下の内容でAmazon Inspectorをセットアップしました
https://qiita.com/Misshii/items/7b46c17e31d5de88fff5

#### 今回は、Amazon Inspectorで、EC2のOSを新旧比較し、脆弱性の差分を見てみたいと思います。
なお、EC2を起動してからセキュリティ対応は何もしていない初期状態で、
インターネットからEC2に通信できない状態です

#### まずは、Windowsの比較

## WindowsServer2022
2023.11.15版　AMI名：Windows_Server-2022-English-Full-Base-2023.11.15
**High １件**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/49d17726-f5ec-b153-da36-e4beb9f894a5.png)

## WindowsServer2016
2023.11.15版　AMI名：Windows_Server-2016-English-Full-Base-2023.11.15
**High １件**
**Medium ５件**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/73e72bbc-de7f-dc69-316e-8dab31af3f11.png)

#### WindowsServer2022と比較して件数が多いですが、最初からAMIにセキュリティパッチが適用されて減っているようです



---
#### 次は、AmazonLinuxの比較

## AmazonLinux2023
2023.11.13版　AMI名：al2023-ami-2023.2.20231113.0-kernel-6.1-x86_64
**脆弱性検出なし**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/e271e4f4-d3fa-63f5-c41b-666b3eca0e48.png)


## AmazonLinux2
2023.11.16版　AMI名：amzn2-ami-kernel-5.10-hvm-2.0.20231116.0-x86_64-gp2
**脆弱性検出なし**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/734f822d-3aac-e46b-62c7-b0d35b1990f9.png)

#### AmazonLinux2023もAmazonLinux2も起動直後の初期状態で、しっかり対処済みのようです。さすがAWS提供OS

#### ここまで使用した４つのOSは、EC2インスタンス起動時に「クイックスタート」で選択したAMIでした。次に「コミュニティ」内の古いメンテナンス状態のAMIはどうなるでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/d14c87f4-e290-5968-b9e6-137a984cc050.png)

## AmazonLinux2
2021.12.01版　AMI名：amzn2-ami-kernel-5.10-hvm-2.0.20211201.0-x86_64-gp2
**Critical ３件**
**High １１３件**
**Medium １５２件**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/d28cc6a9-fb97-0a51-f02e-dae34c83613f.png)
スクリーンショットは途中で割愛

#### Critical３件を含み、合計268件
最新版のAMIでは脆弱性０件でしたが、２年前に提供されたAMIには大量の脆弱性があります

最新版もいずれはこのようになるのでしょう。頻繁に脆弱性対応を行う重要性をあらためて感じました。
薬剤師からエンジニアに転職してプログラミング以外で苦戦したことと対策

こんばんは。
おでこ。と申します🍢

私は2023年9月1日にフロントエンドエンジニアとして自社開発のSaaS企業に入社しました。
未経験独学で、薬剤師からの転職です。
詳しくはこちらをご覧ください。
[未経験独学で自社開発企業へ〜薬剤師からのエンジニア転職記〜](https://qiita.com/odendayoko/items/f616b2f1952897a9af5d)


アドベントカレンダー2日目です🎄
本日は、**入社してからプログラミング以外で苦戦したことと対策** について書きます。
未経験でWEBアプリケーションエンジニアを志している方の参考になれば嬉しいです。


## 知らない言葉が多すぎて会議についていけない
入社して2日目に社員全員が参加する会議がありました。
様々な部署の方がプレゼンしていくのですが、**何を言っているのかさっぱりわからない…**

ビジネス用語、IT用語、自社プロダクトの用語が織り混ざって会議は進んでいきます。
AsIs、ToBe、フィックス、ペネトレーションテスト、3rdパーティー、ABテストなどなど…

カタカナが多すぎる…日本語で話してくれ…😭
薬の名前ならいくらでも覚えられていたはずなのに、初めて聞く言葉が多すぎて外国にいるような気分でした。

何を言っているかわからないと、疎外感を感じてしまいます。
入社2日目にして、果たしてIT業界で働いていけるのだろうかとものすごく不安になりました。

「薬剤師からエンジニア」という異なる業界に転職するということは、使われる言葉や文化も別物になるということなのだと実感しました。
### 対策

わからない言葉はメモって調べたり、メンターさんに聞いたりして自分だけの用語集を作りました。

あとは、慣れです。
薬の名前と同じで、毎日耳にしているといつの間にか会話についていけるようになりました。

さらっと使えるようになりたいという憧れはあるのですが、業界に染まったなと思われるのがなんとなく恥ずかしくてあまり使っていません。


## テキストコミュニケーションが難しい
テキストコミュニケーションはいまだに苦戦しています。
社内の方とチャットでメッセージをやり取りする時に、どんな文章を送ればいいのかわからないんです。

薬剤師として働いていた時は、目の前の相手と話すことでコミュニケーションをとっていました。
相手にいい印象を与えるために、声のトーンや表情に気を配り、ジェスチャーなどを交えて話します。
しかし、テキストコミュニケーションでは文章で伝えるしかありません。
相手に失礼のないように、わかりやすく伝えるためにはどうしたらいいのかわからず、メッセージを送るだけなのに時間がかかっています。
要件を相談したい時には、この内容で伝わるのかどうかをメンターさんにチェックしてもらっていました。
### 対策
先輩方からいくつかポイントを教えていただいたので共有します。

**相手にとって気持ちのいい文章にする工夫**
- 絵文字を取り入れる
- 依頼するときの語尾は「〜よろしいでしょうか」
- 要点が複数あるときは先に「⚪︎点あります」と書く
- 「ありがとう」、「すみません」を使う
- 社内のやり取りならそこまで遜る必要はない
- 文章が長くなりすぎる場合は、対面で直接伝える

## ドキュメントが書けない
エンジニアの業務に関わらず、起票や相談事項をまとめるときなど、ドキュメントを書く機会が多々あります。
前述の「テキストコミュニケーションが難しい」にも共通しているのですが、文章を書くのが難しいです。
何をどのような手順でまとめればいいのかがわからず、やたらと長くなったり、よくわからない文章になってしまいます。スピードが遅いのも課題です。

薬剤師の時は、薬歴という薬剤師が行う調剤や服薬指導、患者の基礎情報や体質、疾患などについて記録していました。これはあくまで記録として残すものなので、誰かに伝えることを意識していませんでした。

### 対策
先輩方の書き方を真似しながら、日々取り組んでいます。
フォーマットを教えていただき、それに沿って書きます。

例えば、下記のようにまとめます。
```
＜相談事項＞
◯◯について、下記2点どちらが良いか

＜オプション＞
A. xx
メリット：
デメリット：
B. △△
メリット：
デメリット：

＜おすすめ＞
B
理由を簡単に記入

＜結論＞
ここに結論を書く
```

ドキュメントを書く力は今後どんな現場でも役に立つスキルだと思うので身につけたいと思います。

## 運動不足
入社して3ヶ月で2kg太りました。完全に運動不足です。
歩数では薬剤師のころの半分以下になっています。

エンジニアあるあるであって欲しいのですが、頭を使うとものすごくお腹が空きます。
つい間食をしてしまう…🍫

そういえば昔、高校の先生が「ダイエットには勉強が１番！糖が消費されるから！」と言っていました。
先生の嘘つき！！！😭

### 対策
ジム！！筋トレ！！以上！！
最近水泳も始めました。

## 腰が痛い
エンジニアになって長時間座りっぱなしが良くないのか、腰を痛めました。

そもそも座りっぱなしというのは身体に悪影響らしいですね。
意識的に立つようにしないと、寿命が縮まるようです。

### 対策
Xで募集したところ、 **「腰の痛みにはお尻のストレッチが良い」** と教えていただきました。
また、タイマーで測って25分ごとに1回立つようにしています。


## 終わりに
入社してからプログラミングも難しいというのに、それ以外にもこれまで経験したことがなかったため、苦戦していることが多々あリます。
結局慣れるしかないと思いますし、実際徐々に慣れてきている実感があります。
プログラミング以外でも色々なことを吸収して成長していきたいと思います！！🙋‍♀️
鏡がどのように像を表せているのかの実験です。

鏡がどのように像を表せているのかの実験です。
猫の絵の表面だけがかがみに映ります。
絵とかがみに映った絵をどこから見るか（カメラの位置）で見え方が変わります。

|　かかみの絵　| 　←カメラ→ | 　絵　|　　　　　|
|　かかみの絵　| 　　　　　 | 　絵　|　←←カメラ　|
実験はこちらです。https://youtu.be/JxgHbqCa7hU?si=zLIboA9mw7Mz5Jn9
初めてハッカソン出た後に受けたUdemy講座

今年2023年は、ビギナーズラックでまさかの[デジタル庁マイナポータルハッカソン](https://www.digital.go.jp/policies/myna_portal/hackathon)の１次審査を通過したことで、ハッカソン出場と、仕事とは違う分野のスライドを作る、という機会に恵まれました。

結果、今やっている仕事では得られない貴重な体験の数々で、慌ただしくも楽しく過ごしたハッカソン期間でしたが、終わってホッとしたときに反省したことがありました。

「自分の思いをスライドに落とし込めなかった」

ということです。

アイディアとして一枚の絵に落とし込めたのですが、それを説明するためのスライド構成やアピールしたいポイントがうまくスライドに書き込めなかったのです。

また、デモ用APIを使って[Claris FileMaker](https://www.claris.com/ja/)でデモAppを即席で作りましたが、参加者の中には、まだアイディア段階のアプリ構成を伝えるために、[Figma](https://www.figma.com/ja/)を使って自分が世に送り出したい機能を盛り込んだアプリのデモ画面を作成し、「動く仕様」として活用しているのをみて、

「実際のサンプルAppでなくても十分伝わる」
んだ！

といたく感激しました。

このことから、次回、何かのハッカソンに出場する・しないに関わらず、自分の思いをスライドに落とし込むために必要なスキルを身に付けたい、Figmaを使ってアイディアの具現化の助けにしたい、という思いが募り、Udemyで講座を探すきっかけになりました。


# 受講した講座（コース）
二つ、受講しました。

## UXデザイン講座　UXデザイン基礎入門
https://www.udemy.com/share/1023kc3@FtsnJaR9lbV3TgFvTIP7rGxt_u5WN0AJ85yx3kI9ZhShwbK87BWHqOm2nuVWBP1uWA==/

このコースは、ユーザー視点での製品開発の基本となるUXデザイン、ユーザビリティ、人間中心設計といった考え方の基礎を学ぶコースです。

システム構築を仕事としている自身でも、UI/UXについてはなかなか基礎的な部分を学ぶ機会がありませんでしたので、こうして基礎講座を受講することでシステム構築にも大いに役立ちました。

アピールしたい機能はきちんとユーザが使いやすいようになっているのか、直感的に受け入れられる構成になっているのか、など、仕事にも、サンプルAppを作る際にも「その視点が大事だった！」と気付かされました。

## 初心者から始めるアプリデザイン＜UI/UXデザインをFigmaで学ぼう！＞Webデザインにも応用可能
https://www.udemy.com/share/1034O83@js8S21o3LO_IRixWZ5mhPLbOfmzP_vvwzDKNcrW9QDr_1U8tNq0DkkZZoVFwF-ukrQ==/

もう一つは、Figmaを実際に触りながらのコースです。
ハッカソンではFigma使ってみたいと思いつつも使う機会がなかったので、Figmaを実際に触ったのはこのコースが初めてでした。

ほんとにFigmaダウンロードから手取り足取りでレクチャーが進みます。

右往左往することがなく、Figmaの使い方を順々に学べました。
一部、現在のFigmaとは違う部分もありましたが、それぞれのレクチャーの概要欄で、現在のFigmaとはどこが違うかなどが明記されているので、Figmaはアップデートが早く、それだけ使う人も多いんだな、と感じました。

Figmaのコースは他にもたくさんありましたが、とにかく「最初から知りたい」「迷子になりたくない」と思ってこのコースを受講してよかったです。

どちらもベストセラーであるのも、うなづけます。

# Udemyの魅力
Udemyのコースを出している講師陣は最大の魅力ではありますが、そのほか、コースを探す際に私が感じる魅力が３つあります。

## 1.検索機能
「習いたい」「知りたい」と思ったら、どこでもすぐにコースを受講できるのがUdemyの最大の魅力ですが、そのほか、レベルに合ったコースがとにかくたくさんあるのにピタッと自分がやりたかったコースにたどり着ける検索機能がすごいです。

## 2.おすすめ機能
一つでも受講すると、次に受講するおすすめのコースが出てきます。
コースのタイトルも、それぞれの講師が付けるのがうまいなぁ！と感じます。
ステップアップしたいと思った時に、「そうそう、それを知りたいんだよ」というタイトルにすごく引き寄せられます（笑）

## 3.最新が学べる
知識のアップデートをするのに、すごくちょうどいい価格(!)と受講時間で最新が学べるのがいい点です。
タイトルに惹かれて技術本を買ったはいいけど、だいぶ古かった、本に書かれている学習環境やライブラリが古すぎて動かなかった、などだと、モチベーションが著しく下がりますが、「今すぐ最新が学べる」のはすごいいい時代だな、とこの時代に生きていてほんと良かったと感じます。


今回は、自身の仕事とはちょっと違うUdemyについてでしたが、ハッカソン参加以外にもUdemyで色々受講する、という機会にも恵まれた2023年でした。
ぜひ、他の方のUdemy体験もAdventCalendarで読んでみてください。

https://qiita.com/advent-calendar/2023/udemy
ffmpegを用いて入力動画の`左上 (350,0)`から、`横1570*縦1080`のエリアを切り取る

ffmpegを用いて入力動画の`左上 (350,0)`から、`横1570*縦1080`のエリアを切り取るには以下のようにすればOK

```
% ffmpeg -i test.mp4 -vf crop=w=1570:h=1080:x=350:y=0 test2.mp4
```

左上の座標の位置の調整が要りそうな場合は、1secの動画を先に抽出しておき、これに対して調整施すと便利。

> https://jp.videoproc.com/edit-convert/cut-videos-using-ffmpeg.htm
>```
>ffmpeg -ss [開始時間] -i [入力ファイル] -to [終了時間] -c copy [出力ファイル]
>```

# 参考

https://jp.videoproc.com/edit-convert/cut-videos-using-ffmpeg.htm

https://nico-lab.net/crop_with_ffmpeg/
やめるときも健やかなる時も（2023年にやめたこと、2024年にやめること）

**原作・監修：** 人間
**執筆・挿絵：** 生成AI (Being)

2023年にやめたことを思い出してみました。
しかし、今年は始めたことも多い年です。
来年は皆様におかれましても、よき実りの年となりますよう。
## IT
#### DVDへのバックアップをやめた
DVDへのバックアップはもう古いと気づいた。
子供が小さかった頃の動画とかをDVDに焼いていたのだが、今や読めないディスクの恐怖におびえる日々だ。

だから、HDDに移すことにした。

Buffaloの一番安いNAS（Link Station LS210）を2台にして（コールドスタンバイ）＋外付けのUSB-HDDで週次バックアップする構成だ。
これで、私はデータの守護神だ。

でも、見返すことはないだろう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/862582/16a18339-274a-7d59-0056-8c78672a180c.png" width=60%>

#### 高度情報処理技術者試験の勉強をやめた
過去問はもう全部解けるし、新しい問題は出ないだろう。
だから、問題を読み解く読解力と右腕の筋力を鍛えることにした。

読解力は、小説やエッセイを読んで感想を書くことで高める。
筋力は、ダンベルやプッシュアップで鍛える。

これで、試験にも人生にも勝てるはずだ。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/862582/d5b7e782-ab5c-ecfb-d7dd-ce2c9d721582.png" width=60%>

## 趣味
#### Spotify Premiumプランをやめた
このプランは人の作ったプレイリストをランダムで聞くことに価値がある。
でも、私は自分の好きな曲を聞きたいんだ。

基本的にPremiumプランでないと曲を指定して聴くことはできない。
だから、自分でプレイリストを作って、シャッフルモードをオフにした。

これで、私は自分の音楽の王様だ。
でも、広告がうるさい。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/862582/fc7239f7-b7b9-d444-63ea-47fa4d9ae260.png" width=60%>

#### ゴルフクラブを全部揃えるのをやめた。
ゴルフクラブを全部揃えるのは無駄だと気づいた。
どうせ使わないクラブが多いし、重いし、高いし。

だから、PT、SW、AW、9I、7I、UT(3)、1Wの７本に絞った。
これで、私はゴルフの達人だ。
でも、スコアは全然良くならない。（人間注※コースに出たことはない）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/862582/12e8d6f8-c04e-b7d8-c8e8-dd413351b292.png" width=60%>

#### 一眼レフを使うのをやめた
ただしフィルムを使うなら、一眼レフが最高だ。
でも、１ショット100円はバカにならない。
だから、私は写真を撮るときは、慎重になる。

被写体を選び、構図を決め、光を確認する。
そして、シャッターを切る。
これで、私は写真の名人だ。
でも、現像に時間がかかる。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/862582/c323c822-86e4-2c1e-9b3b-433296f92112.png" width=60%>

## 生活
#### 毎日バーガーキングに行くのは卒業した
体に良くないというのは建前だ。
本当は、飽きたからだ。

だから、セブンイレブンのカップデリに浮気した。
これで、私はグルメの素人だ。
でも、おいしいと思う。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/862582/f947e8ce-a49b-4e07-b553-44fab7a55145.png" width=60%>

#### 長年通っていた美容室にサヨナラした
美容師さんと、お互いが気を使わなくなってしまったので、新しい風を求めた。
だから、こっそりと別のところに行ってみた。

高校生の時ぶりにパーマをかけて、イメチェンした。
これで、私は若返ったつもりだ。

でも、周りの反応はイマイチだ。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/862582/0f3a07b6-ea66-d197-0562-fcf0ca99daf2.png" width=60%>

## 2024年やめたいこと
他人に執着して、自分の時間を無駄にすることをやめる。

だって、他人は私のことなんて気にしてないし、私も他人のことなんて気にしない。
だから、自分の時間を自分のために使うことにした。

これで、私は自由の女神だ。
でも、寂しい。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/862582/b09fc29c-654c-bd12-1668-c9663a1462d6.png" width=60%>
そろそろマルチデバイス・サーバ構成・プラットフォームのテストを自動化させてくれ

「自動化できたらうれしいテスト、してみたいテスト by T-DASH Advent Calendar 2023」4日目の記事になります。

https://qiita.com/advent-calendar/2023/t-dash03

## 自動化したい！

小さく迅速にスタートし、その後、細かいリリース単位で段階的なバージョンアップを繰り返していくという開発・デプロイスタイルが一般化している今日のプロダクト開発において、デグレードを防ぐためにE2Eテストの自動化は欠かせないものとなっています。

そのときに往々にして自動化できる対象から外れてしまうのが、実行環境のサーバ構成や端末、OS等プラットフォームによる動作の問題がないかという検証です。

しかし、これこそが手動テストでコストがかかる最大のポイントでもあり、エミュレータやコンテナ環境によって簡単にテストを自動化できるツールがあればいいのに、、と思います。

## サーバ構成・ネットワーク構成

インフラに近いところで動作するある種のミドルウェアなどでは、サーバ構成によらず動作することの検証が不可欠となります。
しかし、テストのためのいろんな構成のサーバを社内（クラウド上も含め）に保持しておくのは経済的・人的コストになります。

Kubernetesなどを駆使して実現できる部分もあると思いますが、個人的にはなかなか設計も管理もハードルが高いと感じるところです。
（単に自分が弱いだけで、わかる人にとってはそうでもない？）

## マルチプラットフォーム

React Navite や Flutter のようなマルチプラットフォームなフレームワークの開発では、いくらワンソースで開発可能であるとはいえ、iPhone, Android, Windows Desktop といった各プラットフォームでの動作検証が必要になります。

.NET Core 等でサーバーサイドで動作するアプリについても、Windows と Linux とそれぞれで挙動を確認する必要があります。

あるいはブラウザで動作するWebアプリケーションであっても、やはりブラウザ毎、少なくともレンダリングエンジン毎にはテストしておきたいところでしょう。

マルチプラットフォームで動作しますというテストツールはありますが、テストを動かすための環境をそれぞれ自分で用意する必要があるとなると、嬉しさは半分。
テストしたい全環境を全部テストツール側でエミュレートなどしてくれることが望みです。

マルチブラウザのテストでいうと、[Playwright](https://playwright.dev/) が Node.js 上で実行でき、Chrome, Firefox だけでなく Safari (WebKit) 上でもテストを動かすことができました。
十分に枯れていない部分もありますが、マルチブラウザでのテストとなると今のところこれが第一選択肢になるのかなと思います。

OSレベルでは、CI/CDパイプライン上でいろんなDockerイメージを使ってテストを動かす感じなら、ある程度実現できる部分もありますね。

## マルチデバイス

マルチプラットフォームとも関連しますが、スマホ、タブレットやIoTデバイス向けのアプリケーションでは、基本的なAPIの動作が開発言語やフレームワークで担保されているとはいえ、細かい表示の調整やデバイス固有の動作に絡む部分では、それなりに一通りのデバイスでのテストを避けるわけにはいきません。

リリース前に外部の多端末テスト業者に検証を委託するという手もありますが、CIとしてはやはりテストの自動化を考えたくなります。

スマホに関していえば、クラウド経由で実機を操作できる有料のサービスというのがいくらか見つかるようです（試したことはありません）。

* [AWS Device Farm](https://aws.amazon.com/jp/device-farm/)
* [Remote TestKit](https://appkitbox.com/)
* [モバオペ](https://www.mbop.io/lp/)

## まとめ

前述のとおり、既存のツール＆工夫によってある程度実現できる部分もありますが、個人的にはこのあたりの管理にリソースを割く必要なく、シンプル＆安価に一元管理してくれるツールがあれば嬉しいなという欲張りな理想があります。

ちょうどT-DASH様ブログ記事 [Windowsアプリをテスト自動化するメリットとデメリット](https://service.valtes.co.jp/t-dash/blog/windows_automation_merit_vol_32) においても、マルチプラットフォームなフレームワークに対するテスト自動化ツールの開発は労力がかかり、そのツールの選定や使い方の工夫を強いられることこそがそういうフレームワークに対するテスト自動化のデメリットになるということが書かれていました。

このことは本来、テスト自動化自体のデメリットではなく、単に現状の技術的課題であり、簡単に自動化できるようになればハッピーなのは間違いありません。
Gitで操作ミスしたときに読む記事

# Gitで操作ミスしたときに読む記事

Git loverの皆さん、今日もgitコマンド使い倒していますよね。

みんな大好きなgitを操作しているとヒヤリハットするときありますよね。

筆者も過去に

- 上司のコミットを吹き飛ばす
- 頑張って自分で書いたソースコードの変更を無に帰す
- コミットしたいブランチを間違えてデフォルトブランチをレビューなしでPUSHした

など数多くの取り返しのつかないことを経験しています。

そんなしくじりを学びに変えるべくこの記事を書きます。

具体的なケースとどう対応すると良いのかを連ねていきます。

## プロジェクト独自のリポジトリ運用ルールに従わないで作業した

コードの変更を行ってコミット完了！

そしてVSCodeの左下を見て、git branchコマンドを打ってブランチを確認すると `develop`, `main` だった。

まだ慌てるような時間じゃない

心を落ち着けて下の格言を読んでほしい

- pushするべからず

あなたがローカルリポジトリに対してコミットをしただけならpushさえしなければリモートリポジトリを汚してしまうこともない。

ひとまず落ち着こう。落ち着いて対応すれば大丈夫。

- reset/rebaseもするべからず

ここで「よし、すぐにコミットを消そう」とも思ってはいけない。

頭では対応がわかっていても気持ちはまだ焦ったままだ。

安易に `git reset --hard HEAD^` なんてコマンドで先頭のコミットを消したらあなたの作業は無に帰してしまう。

そんな悲しい事にならないために、まずは**ブランチを切ろう**。

`git switch -c temp`

これで一時的にブランチを作ってあなたの作業を守るんだ。それからコミットを消す対応をしても遅くはない。

ちなみにコミットの削除については[こちら](https://qiita.com/tsukasaI/items/68f1c24a5285d00c1664)で解説しているからぜひ見てほしい。

もう一度言う。すぐにコミットを消そうとしてはいけない。

## git push -fでリモートブランチの過去を改変した

さて、よいこのみんなは `git push -f` なんてコマンドはほぼ使わないはずだが、これを一人でやってしまう可能性もある。

ちなみにこのコマンドはリモートのUpstream Branchに対して強制的にコミット履歴を書き換えてしまう操作をする。

コマンドなんて上キーを何度か打てばだいたいやりたいことを遡れるからこんな危険コマンドもすぐに打ててしまう。

そして気づいた頃にはforce pushが完了して頭が真っ白になる。

ひとまず落ち着こう。そして下を読もう

**他のチームメンバーに復元可能かすぐに連絡だ**

デフォルトブランチはチームのみんなは事あるごとにpullしているはず。

今あるべきの姿を持っている人を探して再度force pushしてもらえればあら元通り。

その時にはチームメンバーに目一杯感謝しよう。

ちなみにforce pushはGitHubなどのBranch rulesで禁止することができます。仕組み的に防ぐならむしろこっちが推奨。

## git add * で入ってほしくないファイルがcommit/pushされてしまった

特にAPIキーなどシークレットキーなどのファイルがpushされたら世の中の悪人たちが一斉にその情報を使って良からぬことをするだろう。

これも落ち着いて対応しよう。

**まずは早めにキーの再発行**だ。

公開されてしまったキーを使えなくすれば良からぬことにも使えまい。

ただ気をつけるべきはサービスで使っているキーを使えなくしてしまったらサービスが動かなくなること。

自分たちのサービスが不用意に止まってしまったらせっかく獲得したユーザーたちが離れてしまう。そんな悲しい未来を誰も望んでいない。

必ずわかる人と一緒に作業をしよう。ここでのお約束だ。

そして大事なのは**とにかく仕組み化**だ。人である以上誰もが間違う可能性がある。

おすすめするものは２つだ。

### .gitignoreでシークレットがリポジトリに上がらないようにする

シークレット情報が1ファイルである場合はgitにコミット自体されないようにignoreに追加しよう。

これだけでも十分に効果はある。

### Secretlintを導入する

https://github.com/secretlint/secretlint

ソースのファイル内にシークレットを書いてしまう場合もあるだろう。それを防ぐにはSecretlintでgit-hooksを入れると良い。

そうすることでコミット前に検知が可能になりSecret情報をコミットしたら失敗させる事ができる。

むしろグローバルに設定して上げるとどんなプロジェクトにも効いてより良いだろう。

# 最後に

楽しく開発を続けるためにも常に落ち着いていこう。
[re:Invent2023 ざっくre:Cap]Introducing Amazon SageMaker HyperPod

# はじめに
みなさんこんばんは！hiropyです。
今回はre:inventで参加したセッションを、英語できないマンなりにざっくり振り返っていこうと思います！

本記事では「Introducing Amazon SageMaker HyperPod」について記載していきます。

翻訳ミス、意図の取り違えがあるかもしれませんが、「こんなことしてたんだ」くらいでご参考にしていただけると幸いです。

# セッション概要
- セッション名：AIM362-NEW | [NEW LAUNCH] Introducing Amazon SageMaker HyperPod
- セッションタイプ：Breakout session
- レベル：300


セッションの概要は以下の通りです。

> Amazon SageMaker HyperPodは、基盤モデル（FM）のトレーニングを加速させることを目的として作られています。本セッションでは、Amazon SageMaker HyperPodを使用して、数週間から数ヶ月にわたってFMを中断することなくトレーニングする方法をご紹介します。クラスタの健全性を継続的に監視し、障害のあるノードをその場で修復・交換して、進捗を失うことなく自動的にトレーニングを再開する方法をご紹介します。また、SageMakerの分散トレーニングライブラリがあらかじめ設定されており、トレーニングデータとFMを小さな塊に分割してクラスタノード間で並列処理することで、クラスタの計算およびネットワークインフラをフルに活用しながら、FMトレーニングのパフォーマンスを向上させる方法についてもご紹介します。

新しく発表されたAmazon SageMaker HyperPodについて、より詳しく説明していただいたセッションでした！


# セッション内容
## Amazon SageMaker HyperPodとは
Amazon SageMaker HyperPodは、基盤モデル（FM）をトレーニングするための専用インフラストラクチャで、トレーニングにかかる時間を最大40%削減する。

https://aws.amazon.com/jp/sagemaker/hyperpod/

###  特徴
- 環境の回復力
    - クラスターは自己修復するため、トレーニング時間を20%以上削減する
    - ハードウェアに異常が発生した時の作業時間を大幅に削減する
- 分散型トレーニングの合理化
    - SageMaker分散型トレーニングのライブラリは、パフォーマンスを20%以上改善する
- リソース利用率の最適化
    - コンピューティング環境やワークロードのスケジュールをコントロールする

## 活用している事例紹介
### Stability  AI
オープンソースの生成系AIをリードする会社

ハードウェア異常にかかる数百時間を削減することが課題だった。
これに対しHyperPodは
- 異常を検知した場合は自動でインスタンスを置き換える
- ワークロードは自動的に再開されるので、50%以上のトレーニングにかかる時間とコストを削減できた

### Perplaxity AI
初めての会話型QAエンジン

LLMトレーニングのスループットが低いことが課題。

これに対しHyperPodは、
- SageMaker 分散トレーニングライブラリはTensorFlowやPytorchなどの最適化された深層学習モデル用のバックエンドを提供
- スループットを2倍以上に増加させた


## クラスターを作成するときのプロセス
1. ネットワークとストレージを作成する
1. ライフサイクルのスクリプトを発行する
1. 必要に応じてカスタマイズする
1. クラスターの設定ファイルを作成する
    -  欲しいコンピュートの種類等
1. クラスターを作成する

## HyperPodのアーキテクチャ例
通常の構成は、
- 管理者はエンドポイントからクラスターにアクセスする
- 通常のユーザはsshでクラスタのヘッドノードに接続する
- ヘッドノード配下には、たくさんのEC2インスタンスによるノード群（ウルトラクラスタ？）がある

## HyperPod上での分散トレーニング
- トレーニングジョブの送信
    - `sbatch` を経由してシェルスクリプトを送信することで、長時間のジョブや高コントロールのジョブ、大量のジョブを実行することができる
- 素早く試作
    - `salloc`を経由してリソースを予約し、コマンドを`parallel`または`srun`内でインタラクティブに実行する
- フレームワークやサードパーティのツールを活用することも可能

HyperPodはSlurmによりジョブをスケジューリングすることも可能

## ジョブが失敗する原因
- ソフトウェアの問題
    - 設定のミス
    - モデルやコードに問題がある
- ハードウェアの問題
    - ネットワーク
    - コンピュート
    - 基盤そのもの

待機中のジョブを無くしたり、アイドル状態のキャパシティは削減した方がいい


## チェックポイントによるジョブの自動修正
定期的にチェックポイントを作成する
問題が発生したらアラートを出し、インスタンスをリストアして再開する


## HyperPod上でのソフトウェアの管理
- Docker containerはECRを通じて全てのノードを取得可能である
- Conda?や仮想環境は、共有ファイルシステムにインストールすることで全てのノードからキャッシュなしでアクセスすることができる
- EnrootやPyxisでは、共有ファイルシステムでコンテナをスカッシュファイルに変換する

## オブザーバビリティ
CloudWatchやSageMaker Profiler により、モニタリングやプロファイリングが可能。

## Hugging face
MLにおけるGithub
モデルやデータセット、ライブラリがたくさんある
https://huggingface.co/

Hugging face上のコンテンツを利用したモデルトレーニングも可能

## なぜHyperPodなのか
- クラスターを共有してくれるサイエンティストがたくさんいる
- SLURMパーティションとキューによる100％の利用率
- 自力で回復できる
- 高い修復性
- 自動修復アクション

MLにおいてインフラに時間をかけなくても良いことを紹介した

https://github.com/aws-samples/awsome-distributed-training
AWS ParallelCluster、AWS Batch、Amazon EKSを使った分散モデルトレーニングのリファレンスアーキテクチャとテストケースが公開されているリポジトリ。


# さいごに
いかがでしたでしょうか？
少しでも皆様のお役に立てれば幸いです。