OmniAICreator/Qiita-1.07M huggingface dataset:
Microsoft Build Japanセッションレポート【AI 導入に伴うデータセキュリティの重要性】

## はじめに

2024年6月28日(金)に開催された「Microsoft Build Japan」Day2にオンラインで参加しました。

本記事は、セッション「AI 導入に伴うデータセキュリティの重要性」の内容のうち、以下について記載します。
- 生成AI利用によるセキュリティ課題
- Microsoft 365 Copilotにおけるデータ保護方法
- Purviewによるセキュリティ対策
- セキュリティ対策の基本ルール

## イベント概要

「Microsoft Build Japan」は、米国で5月に開催された年次開発者会議「Microsoft Build」の最新情報と日本独自のコンテンツを日本の開発者向けに提供するものです。


## 1. AI導入時に注意すべき点

### AIの重要性が増すほどデータガバナンスとセキュリティの課題が増大する

#### 課題

- 既存の課題が増幅される
    - ユーザ本人も知らないアクセス可能なデータが存在する。水面下で何も起きていなかったことが表面化する。
- データの価値が高まる
    - 生成AIが出力したデータ（例えば複数資料を要約したデータ）の価値は高い。社外、悪意のある人にとっても価値が高い。価値が高まる＝危険も高まる。
- データ漏洩の新たな経路
    - 生成AIを利用することでデータ入出力箇所が増え、ファイル作成も可能なため、データ漏洩の経路が増える。

生成AIの重要性が増すほど、データガバナンスとセキュリティ対策が大事になります。
本記事では、上記のような課題に対し、Microsoftのサービスでどのような対策を取れるかご紹介します。

## 2. 対策

### 1. Microsoft 365 Copilotにおけるデータ保護方法

#### Microsoft 365のポリシーやコントロールを継承

Microsoft 365 Copilotは、既存の認証サービス、役割（ロール）をベースに、同じような堅牢さを持ちます。

- **データのアクセスと権限**
    - 少なくとも閲覧権限を持つユーザにだけデータを提供する。例えば自身の上司しか知らない情報、特定部署しか知らない情報を、自身の質問に対するアウトプットとしては出さない。
    - Microsoft 365サービス内の権限モデルを活用して、ユーザやグループに適切なアクセスを確保可能。
- **ユーザのテナントのみ**
    - 分析できるのは利用ユーザのテナントのみ。
- **顧客データの保護**
    - 各テナントの顧客データは論理的に分離され、転送中に暗号化して保護している。
- **データ処理とデータの居住地**
    - CopilotはGDPR、EUDBに準拠している。

#### LLMを介して処理されるデータの保護
- **利用**
    - すべてのプロンプトを含めた取得データはサービスの境界内で保持される。
- **生成**
    - Microsoft社が責任をもって取り組んでいる。公平性、信頼性と安全性、プライバシーとセキュリティ、包括性、透明性、説明責任を中心に展開している。
- **所有権**
    - 所有権のあるデータ（顧客データ）はLLMのトレーニングには使用されない。

### 2. Purviewの秘密度ラベルとの連携

#### Copilotの会話は、参照されたファイルの秘密度ラベルを継承
秘密度ラベルによって、該当ファイルを誰が閲覧可能か、を設定可能です。
例えば、「企業の機密情報」というラベルがファイルに適用された場合、誤ってファイルが外部に出たとしても、閲覧権限を持たないユーザは中身を閲覧することができません。
Copilotの会話全体に対し、秘密度ラベルを適用することができます。

### 3. 3つの『黄金のルール』

生成AI導入時のセキュリティのルールとして、以下3点の紹介がありました。

#### 1. データアクセス制御（API、ACLs、秘密度ラベル）

- 現在うまくいっているデータアクセス制御を変更しない。境界を広げない方が良い。

#### 2. アプリケーション制御（アクセス、インプット、アウトプット）

- 無制限のアクセスを与えない。
    - 例：部署ごとにアプリケーションを分ける。

#### 3. AIモデル制御
- 保護レイヤーをたくさん置く。AIの特定タスク実行を防御する。
- メタプロンプトとAIのガードレールを考慮する。
    ※メタプロンプトとは：ユーザが利用するプロンプトより上位のレイヤーで規定を指定すること。

## 3. まとめ

### AIセキュリティの基本コンセプト

生成AIを導入する際には、以下のポイントを押さえてセキュリティ対策を行うことが重要です。

1. AIの利用：ユーザのトレーニング、ポリシー（ユーザがどのようにAIを利用するのか規定し通知する）
1. データ：データへのアクセス制御
3. AIアプリ：AIアプリの保護
4. AIモデル：AIモデルの保護

## 感想
AIの導入に伴う新たなセキュリティ課題と、それに対するMicrosoftの取り組みについて勉強になる内容でした。

特に印象的だったのは、AIの導入によって既存のデータセキュリティの課題が増幅されるだけでなく、新たな脅威も生まれるという点です。生成AIの攻撃ポイントや新しいリスクについての説明は、AIを安全に活用するための重要な視点を提供してくれました。

また、Microsoft 365 Copilotにおけるデータ保護方法や、Purviewの秘密度ラベルとの連携など、具体的な対策についての説明も非常に有益でした。

最後に紹介された「3つの黄金のルール」と「AIセキュリティの基本コンセプト」は、AIを安全に活用するための実践的なガイドラインとして非常に有用だと感じました。
Markdown完全マスターガイド

# Markdown完全マスターガイド

## 目次

1. [Markdownとは](#markdownとは)
2. [基本の書式](#基本の書式)
   1. [見出し](#見出し)
   2. [段落](#段落)
   3. [強調](#強調)
4. [リスト](#リスト)
   1. [番号なしリスト](#番号なしリスト)
   2. [番号付きリスト](#番号付きリスト)
5. [リンクと画像](#リンクと画像)
   1. [リンク](#リンク)
   2. [画像](#画像)
6. [コード](#コード)
   1. [インラインコード](#インラインコード)
   2. [コードブロック](#コードブロック)
7. [引用](#引用)
8. [テーブル](#テーブル)
9. [チェックボックス](#チェックボックス)
10. [詳細の開閉](#詳細の開閉)
11. [特殊文字](#特殊文字)
12. [エスケープ](#エスケープ)

---

## Markdownとは

Markdownは、軽量マークアップ言語の一つで，GitHubのREADMEを書く際にも使われます。ちなみにZennの記事もMarkdownを使って書いています。
Markdown初心者にとっては網羅的なサイトを見つけるのが意外と大変で，とあるWebsiteを見つけても他に機能があるのではないか？と思いずっと検索してしまうことがあると思います。この無駄な時間をなくす無くすために，，，ここにすべての機能をまとめます！
筆者自身も「書き方なんだっけ？」とノート的な感じで使っていくつもりです。読者の皆様もフランクな感じで使っていただくと大変えうれしいです！
さて本題に入りましょう。ここからは無駄話なしで，一気に機能を紹介していきます！

## 基本の書式

### 見出し

見出しは、`#`記号を使って作成します。`#`の数が増えるほど、見出しのレベルが下がります。

```markdown
# 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5
###### 見出し6
```

### 段落

段落は、空行で区切られたテキストのブロックです。

```markdown
これは最初の段落です。

これは次の段落です。
```

### 強調

テキストを強調するためには、以下のようにします。

- **斜体**: `*斜体*` または `_斜体_`
- **太字**: `**太字**` または `__太字__`
- **斜体と太字**: `***斜体と太字***` または `___斜体と太字___`

```markdown
*斜体* または _斜体_

**太字** または __太字__

***斜体と太字*** または ___斜体と太字___
```

## リスト

### 番号なしリスト

番号なしリストは、`-`、`*`、`+`のいずれかで項目を始めます。

```markdown
- 項目1
- 項目2
  - サブ項目1
  - サブ項目2
```

### 番号付きリスト

番号付きリストは、番号とドットで項目を始めます。

```markdown
1. 項目1
2. 項目2
   1. サブ項目1
   2. サブ項目2
```

## リンクと画像

### リンク

リンクは、`[リンクテキスト](URL)`の形式で記述します。

```markdown
[Google](https://www.google.com)
```

### 画像

画像は、リンクと同じ形式ですが、先頭に`!`を追加します。

```markdown
![Altテキスト](画像URL)
```

## コード

### インラインコード

インラインコードは、バッククォート `` ` `` で囲みます。

```markdown
これは `インラインコード` です。
```

### コードブロック

コードブロックは、バッククォート3つで囲みます。特定の言語を指定することもできます。

```markdown
```
これはコードブロックです。
```

```markdown
```python
def hello():
    print("Hello, world!")
```
```

## 引用

引用は、`>`を使います。

```markdown
> これは引用です。
>> ネストされた引用です。
```

## テーブル

テーブルは、行をハイフン`-`と縦線`|`で区切って作成します。

```markdown
| 見出し1 | 見出し2 |
| ------- | ------- |
| セル1   | セル2   |
| セル3   | セル4   |
```

## チェックボックス

チェックリストは、`- [ ]`または`- [x]`で作成します。

```markdown
- [ ] 未完了の項目
- [x] 完了した項目
```

## 詳細の開閉

詳細の開閉は、HTMLの`<details>`タグを使用します。

```markdown
<details>
<summary>詳細を表示</summary>
隠れていた内容
</details>
```

## 特殊文字

特殊文字は、`&`で始まるHTMLエンティティで記述します。

```markdown
&copy; &amp; &lt; &gt;
```

## エスケープ

Markdownの特殊文字をエスケープするには、バックスラッシュ`\`を使います。

```markdown
\*エスケープされたアスタリスク\*
```

---

## おしまい！

この記事はZennにも投稿しています。
よかったらぜひのぞきに来てください。
https://zenn.dev/yuruma
`'process' is not defined.`のESLintのエラーについて

# はじめに

こんにちは、エンジニアのkeitaMaxです。

Next.jsでESLintを入れた時に`'process' is not defined.`というエラーが出て困ったことがあったので備忘録として残そうと思います。

# 困ったこと

```
const apiURL: string | undefined = process.env.NEXT_PUBLIC_BACKEND_URL ?? ''
```
こんな感じでenvファイルを読み込もうとした時にESLintで`'process' is not defined.`というエラーが表示されてしまいました。

# 解決策

ESLintの設定ファイルのenvに`"node": true`を追加したら直りました。

```json:.eslintrc.json
{
  "env": {
    "browser": true,
    "es2021": true,
    "jest": true,
    "node": true
  },
```

`Node.js`環境をESLintに追加し、`process`が定義されるようになりました。

# おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！
GitHubのDependabotがプルリクを作ったときに、なるべく簡単にSlackへ通知するには

こんにちは！
ポーラ・オルビスホールディングスのITプロダクト開発チームでスクラムマスターをしている川田です。

突然ですが、みなさん脆弱性の対策はしていますか？:muscle:
私たちのチームではパッケージマネージャとしてnpmを使用していることもあり、GitHubのDependabotでセキュリティアップデートを検知しています。

https://docs.github.com/ja/code-security/dependabot/working-with-dependabot

Dependabotが検知した内容はGitHub上で確認できますし、自動でプルリクを作成するなど便利な機能がたくさんあります。ですが能動的に確認しに行かなくても、自動的にアップデートを検知して通知することで取りこぼしを無くせると良いですよね。
そのため、何とかしてSlack通知を実現できないものか・・・:thinking_face:と考え、試してみました！

# GitHubのSlackアプリを使ってみる
Dependabotが作ったプルリクかどうかは考慮せず、とにかく対象のリポジトリでプルリクが作られたら通知するだけであればGitHubのSlackアプリを使えばOKです！:ok_hand:

https://github.com/integrations/slack

今回の本題ではないので詳細な手順は割愛しますが、Slackの [App Directory](https://slack.com/apps) からアプリをインストールし、チャンネル設定やGitHubアカウントとの紐づけを行った後、通知したいチャンネルで `subscribe` コマンドを実行すれば設定完了です。

```
/github subscribe owner/repo pulls
```

GitHubアプリのオプションとして、特定のラベルが付いている場合のみ通知するオプションがあります。Dependabotが作成するプルリクには `dependencies` ラベルが付与されるので、このオプションを使用すればDependabotのプルリクだけフィルターできるのでは？

```
/github subscribe owner/repo +label:"dependencies"
```

と思ってやってみたのですが、残念ながら意図した挙動にはなりませんでした:sob:
Dependabotが作成したプルリクを見るとプルリクが作成された後にラベル付けを行っているようなので、Slackに通知される時点ではまだラベルが付いていないものと思われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550354/15058775-d7f7-fae3-eba2-dcdae270f881.png)

# GitHub Actionsを使ってみる
ラベル付けのタイミングが問題であるならば、特定のラベルが付けられたことをトリガーにして通知できるのではないかと考えました。そのため、ラベルが付いたことを検知して動くGitHub Actionsを試してみました。

結論として予想は正しく、無事に通知されました！:clap:
作成したGitHub Actionsとしては以下の内容です。

``` dependabot.yml
name: Notify pull request opened by Dependabot

on:
  pull_request_target:
    types: [labeled]

jobs:
  pull_request_notify:
    runs-on: ubuntu-latest
    if: github.event.action == 'labeled' && github.event.label.name == 'dependencies'
    steps:
      - name: Send custom JSON data to Slack workflow
        uses: slackapi/slack-github-action@v1.25.0
        with:
          payload: |
            {
              "title": "${{ github.event.pull_request.title }}",
              "repository": "${{ github.event.repository.full_name }}",
              "url": "${{ github.event.pull_request.html_url }}"
            }
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
```

ポイントとしては
- L5 : `labeled` によってラベルが付けられたことをトリガーに動かす
- L10 : `dependencies` ラベルが付けられたときだけ動かす

といった点です。
また、Slackへの通知はお好みの方法でOKですが、今回はあらかじめSlack側でワークフローを作成し、ワークフローのWebhook経由で送る方法を利用しました。

https://slack.com/intl/ja-jp/help/articles/360041352714

実際の通知は以下のような感じです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550354/ff396dda-d434-2498-5f2b-1f97ebfa2be1.png)

# さいごに
脆弱性対応は避けて通れないものですが、本記事の内容が対応の手間を減らすことに少しでもお役に立てれば幸いです！:grinning:

（※本記事はQmonus Value Streamの投稿キャンペーン記事です。）
GPTのAPIが安くなったのでOpenAI(GPTなど)を開発で使ってみよう

皆さん開発にChatGPTなどのAIを用いていますか？今の時代LLMを用いて開発することが主流だと思うが，なかなかやり方が分からず手を出せない人もいるだろう．そこで本記事ではOpenAIのAPIキーを取得して，実際にpythonの入力値に対してGPTが答えてくれるコードを説明する．

# OpenAIのAPIキーを取得する
[OpenAI](https://openai.com/)のホームページにアクセスし，`Products`-`API login`を選択する．
![スクリーンショット 2024-06-30 22.58.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/b699f20a-8ca5-8171-9084-c9a5ded159e5.png)
その後，OpenAIのアカウントでログインする．ここでは`API`を選択する．
![スクリーンショット 2024-06-30 22.59.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/65394f23-bcdd-c1c5-8d1a-18752d386910.png)

`API Key`を選択する．
![スクリーンショット 2024-06-30 23.00.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/97c901d9-93b0-9eb3-818a-20006979f559.png)

`+ Create new secret key`を選択する．すると，作成するAPIキーの名前が聞かれるので答えたらキーが出てくる．

:::note warn
キーは1回しか表示されないので注意
:::

![スクリーンショット 2024-06-30 23.01.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/27058595-03f1-d612-ba5c-3a9e7d76ca81.png)

# PythonでChatGPTに聞けるコードを書く
```py
from openai import OpenAI

text = input("テキストを入力してください\n")

client = OpenAI(api_key='OpenAIのAPIキー')

prompt = f"以下の単語を説明して：\n\n{text}"
response = client.chat.completions.create(
    model="モデル", 
    messages=[
        {"role": "system", "content": "前提条件"},
        {"role": "user", "content": prompt}
    ],
    max_tokens=300
)
print(response.choices[0].message.content.strip())
```
ここに先ほど取得したキーを記述．
```py
api_key='OpenAIのAPIキー'
```
ここにLLMモデルを記載
```py
   model="モデル", 
```

ここに使えるモデル一覧がある(料金も)

https://platform.openai.com/docs/models

ここにはじめに入力する前提条件を書いても良い．(別になくても良い)
例えば，日本語で説明して，など
```py
{"role": "system", "content": "前提条件"},
```

入出力する最大トークン数を指定．
```py
max_tokens=300
```
なんとこれだけでGPTを使えちゃうのだ．

# `おまけ` トークンをケチる方法
実は日本語のトークン数は英語の3倍らしい．これは大損である．そこで無料で使える量には限界があるが，Google翻訳のAPIを用いて日本語を英語に直してその後出力結果を英語に再翻訳するとトークンが少なく済む．

:::note info
Google翻訳は5000字/日まで無料みたいです．
:::
```py
import googletrans

translator = googletrans.Translator()

# 翻訳したい言語を指定
target_lang = 'en'  # 英語に翻訳

# 翻訳したい文字列を入力
input_text = "翻訳したい日本語の文字列"

# 翻訳結果を取得
translated_text = translator.translate(input_text, dest=target_lang).text

# 翻訳結果を出力
print(f"翻訳結果: {translated_text}")
```
これを先ほどのpythonのコードに組み込めばトークンをケチることができる．
社内フィードバックがわいわいする共感!ボタン

## はじめに

こんにちは。エンジニアの鈴木です。

みなさん、開発中の機能のフィードバックってどんなふうにもらってますか？

先日、社内の方々に開発中機能を触ってもらった際、とある施策(タイトルでネタバレ)を入れてみたら思いのほか盛り上がったのでTipsとしてご紹介します！

# 開発中の機能に触れてもらう『社内お触り会』

弊社では、開発中の機能を社内で実際に触ってもらい、お客様に近いセールスやカスタマーサクセスからのフィードバックを開発に活かしています。

このあたりは次の記事にまとめておりますので、興味ある方はご覧ください！

https://qiita.com/4486/items/6eae2840160d4f06cc84

先日も「〇〇機能_実装お触り会」として開催しました。ざっくり次のような流れです。

1. 会の目的や、機能の説明
2. 開発中の機能を実際に操作する
3. **フィードバックの記入**
4. **フィードバックの深堀り**
5. クロージング

フィードバックは内容やカテゴリなどを書いてもらいつつ、 [Notionのデータベース](https://www.notion.so/ja-jp/help/category/databases) に貯めています。(一部抜粋)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30246/9b43b574-d22f-e92f-f077-33e8530ca6e1.png)

これまでも共感する場合はコメントにその旨を書いてもらってましたが、あくまで自由記入という感じでした。

## 共感!ボタン

「いいね！みたいなことができると楽しいかもな？」とふと思いつき、会の途中で次の3つの列を追加してみました。

- `共感ボタン` 列
   <img width=300 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30246/50c1c19b-4fee-fe43-554c-927ea31ed3c6.png" />
- `共感した人` 列
- `共感人数` 列
    - 式: `共感した人.length()`

`共感!`ボタンを押すと、 `共感した人`列に押した人が追加され、 `共感人数`列にその数が表示されます。(一部抜粋)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30246/646af930-71e7-1e76-d717-e3b236158e01.png)

## その場のわいわい感がアップ

共感ボタンがあることで、次のようなアクションが**自然発生的**に生まれるようになりました。

* 「おー、〇〇さんのやつめっちゃ押されてるじゃん！」みたいな反応を楽しむ会話
* 「え、みんな俺のやつ押さないの！？w だってこう思わない？」といった、フィードバックを深堀りするコミュニケーション

1クリックでできる手軽さがよかったのか、フィードバックの時間がわっと盛り上がったのは印象的でした。

### 参加者の声

共感ボタンについての感想をいくつかご紹介します。

**■Nice👍**

- 1クリックでできるので楽でした
- 自分の感覚と他の人の感覚のズレなどが分かるので良い
- それが自分の書いた質問/FBだとなんか嬉しいw（いいの出せたー！みたいな感覚で、頑張って出したくなる　→Moreにもつながるが、ベストFBみたいなの選ばれたい！笑
- コメント書いた側としては「いいね！」をもらえたような感じで嬉しい
- どんどん記載したくなる
- 他の人の共感ボタンが多ければ、もっと「いいね！」もらうために意見を出したいと思う
- 自然とコメントが多くなりそう
- 共感ボタンが多いコメントは何だろー？と興味を持って見にいける
- コメントが多いときに、どのコメントを優先的に見れば良いか分かるので時短になりそう

**■More🔥**

- 共感度ランキングに並び替えられているといいかも
- そもそも共感をもっと押すような仕組みにしたらよさそう（思っていても押していなさそう　or　3つだけ押すとしたらどれ？みたいなのでもいいかも
- これのデメリットとしては、共感の多いコメントが優先的に見られて、共感の少ないコメントが軽視されそうつまり、本当は良いコメントなのにたまたま他のコメントの共感が多いがゆえに見られなくなる可能性はあるなーと（もったいない）

## 開発側にも嬉しい効果が。

「共感人数」という定量的な指標が増えたことで、フィードバックをプロダクトに取り込んでいく際の新たな判断材料になっています。

## おわりに。

最初は軽いノリで導入してみた共感ボタンが、今では他チームにも広がりを見せています。チームの振り返りの場でも「たしかにね」的な使われ方がされており、お手軽な同意や共感は思ったより活用の幅がありそうです！
主成分分析のbiplotを回帰で使う

先日主成分分析で因子負荷量と第一第二主成分をプロットするbiplot関数を作ったのですが、これを回帰に応用してみようと思います。
使用するデータはボストン住宅価格のデータセットです。
```Python3
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
def biplot_spv(df, y):
    for col in df.columns:
        df[col] = (df[col] - df[col].mean()) / df[col].std()
    model = PCA()
    model.fit(df)
    df_pc = model.transform(df)
    com = model.components_
    evr = model.explained_variance_ratio_
    fac = []
    for i in range(len(evr)):
        fac.append(np.sqrt(model.explained_variance_ratio_)[i] * model.components_[i])
    fig, ax1 = plt.subplots()
    ax2 = ax1.twinx()
    ax2.scatter(df_pc[:, 0], df_pc[:, 1], cmap="brg", c=y)
    ax3 = ax1.twiny()
    ylim = [abs(max(fac[1])), abs(min(fac[1]))]
    xlim = [abs(max(fac[0])), abs(min(fac[0]))]
    for i in range(len(df.columns)):
        ax3.plot([0, fac[0][i]], [0, fac[1][i]], color="#FF0000")
        ax3.text(fac[0][i], fac[1][i], df.columns[i])
    ax3.set_xlim(-max(xlim), max(xlim))
    ax3.set_ylim(-max(ylim), max(ylim))
    plt.show()
```

```Python3
import pandas as pd

df = pd.read_csv("boston.csv")
y = df["PRICE"]
x = df.drop("PRICE", axis=1)

biplot_spv(x, y=y)
```
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/738c5451-e2cf-1954-64bd-84c75f761c59.png)

青が低く赤が中間で緑が高い値となっています。
その上で見てみると因子負荷量がどれも案外無視できない値になっていてトイデータって意外と因子負荷量が強いんですね。
競プロ精進録（灰色から茶色へ）

# どうでもいい前置き
　競技プログラミングというのを最初に知ったのは、今は昔の話で10年近くも前になるだろうか。A問題とB問題くらいしか解けず、かといってアルゴリズムを勉強してCやD問題を解くことはなかった。たまに存在を思い出しては参加して、簡単な問題を解いて終わるということを繰り返していた。

 　転職もしたいし、プログラミングの勉強にもなるだろうということでAtCoderに本格的に取り組むことにした。記録を見ると、前は2023年6月頃に取り組み始めて11月頃には止めたらしい。そして、2024年5月に熱意が再燃した。

　ちなみにプログラミング言語はC++で、エディタはNeovim、コンパイラはg++を使用している。どれも機能をまったく使いこなせていない。

# まずは茶色を目指すぞ～
　AtCoderの最高レーティングは<font color="brown">404</font>（2023年11月4日時点）で<font color="brown">茶色</font>の8級が最高到達点だ。もちろん、夢は大きく<font color="red">赤色</font>の<font color="red">レッドコーダー</font>であるが、それは遥か夢の彼方というわけで、まずは<font color="brown">茶色</font>に戻るところからだ。Rated参加登録をしたものの参加しないということが何回かあり、レーティングが劇的に下がってしまった。現在（2024年6月12日時点）のレーティングは<font color="gray">313</font>で灰色。

　コンテスト成績表のパフォーマンスを見るに、きっとレーティング500くらいの実力はあるだろう。1回あたり20程度は上がりそうなので、5回くらいコンテストに参加すれば茶色に成れそうだ。



# コンテスト参加準備

　他の参加者の方々が、どんな風に準備をして参加しているのかはあまり存じ上げない（調査して参考にした方がいいいんだろうけど、まあ、それはいずれ）。

## ソースファイルのテンプレ
　こんな感じのテンプレを a.cpp ～ d.cpp として用意している。きっと、`#include <bits/stdc++.h>`と書いた方がいいんだろうし、少なくともstringやvector、map、setなどよく使うヘッダーファイルはインクルードするよう書いておいた方がいいんだろう。でも、不要な記述はなるべく減らしたい派なので必要になったらインクルードする方針にしている。整数型もlong longを使用するのがいいんだろうけど、必要なければintを使用している。

　前は`using namespace std`を記述するのも邪道だと考えていた時期もあって、その頃はちゃんと`std:`を記述していた。

``` C++
#include <iostream>

using namespace std;

int main()
{
    return 0;
}

```

## コンパイル
　コンパイルは下記のコマンドをターミナルに打ち込んでいた。これをいつも直打ちするのはスマートではない気がするので、少しずつ改良していきたい。

``` shell
$ g++ -o a a.cpp
```

## Neovimの設定

　なんか Vim ってカッコいいよね、という意識で使っている。特に拘りが無ければ、Visual Studio Codeを使用するのがいいと思う。

　カラースキーマを入れたり、vim-airlineでステータスラインをカッコよくしている以外、特にカスタマイズはしていない。いつか別の記事で、Neovimの設定を勉強がてらまとめてみようかな。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507271/62b8bd08-7494-ff0b-60d4-c928cd129c1d.png)

## 修行

　問題集を読んで、ひたすら解いていた。後は、AtCoder ProblemsでABCのAB問題を消化していった。何問かに一回くらい知らなかった有用な関数などを知れるので、B問題を解いていくのは有用だったと思う。

# そして実戦へ

目標
- C問題を時間以内に解き切ること
- レーティング : 400

|コンテスト|パフォーマンス（目標）|パフォーマンス(実際)|新Rating|
|---|---|---|---|
|ABC358|500|620|343(+30)|
|ABC359|520|811|396(+56)|
|ARC180|500|904|459(+63)|
|~~ABC360~~|~~540~~||
|~~ABC361~~|~~560~~||

　パフォーマンス（目標）は、毎週成長していることを願ってる程度の適当な数値。ARCは参加しない方が無難だとは思うけれど、A問題でも解けたらレーティングが上がるだろうから参加することに。

# というわけで、茶色になりました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507271/687eed58-9ffb-9232-43e7-014d22b45020.png)

　上の方々が優秀過ぎるだけで、<font color="brown">茶色</font>だって誇っていいと思うんだ(｀・ω・´)。~~最近あまり見ないよね、顔文字。古いのかな、好きなんだけど。~~

　整数と文字列に関して基本的な操作が自由にできて、基本的な全探索ができれば茶色になれる気はする。C++でいえばvectorとstringに関して基本的な操作ができて、algorithmヘッダーのsort()や、cctypeヘッダーのto_lowerとか基本的な関数の知識を徐々に積み上げていくことで到達できるんだろう。

 　二分探索、グラフ、累積和やDFSとかは茶色から緑になる過程で必要になっていく感じがする。

　では、次は<font color="green">緑色</font>になった際に。

# おすすめ書籍

## アルゴリズム的思考力が身につく！ プログラミングコンテストAtCoder入門
　中級編までやれば茶色には成れると思う。練習問題の中には何日か掛けて解いたものもあったりして、真面目に自力で解こうとすると時間は掛かる。スマートな取り組み方もあるんだろうけど、私は愚直に練習問題を解答を見ずにウンウン悩んで取り組みました。
 
　いい解法が思い浮かばなかったり、エッジケースに詰まると、つい解答を見たくなってしまうけれど、エラーを自力で解決する力というのは、実際に独力で問題解決する中で身に付く気がする。

　ちなみに、まだ中級編を読み終えていません。(-_-;)

# 参考記事

https://qiita.com/e869120/items/f1c6f98364d1443148b3
Azureで自分のロールが確認できなかった件

ある日の作業中、権限が足りない。。。けど、自分の権限が見れない？？？
という状況になったので、少し調べてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3242301/b4df8cc3-dad8-da1a-1719-c6a247ef5a54.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3242301/45c476ff-5957-3b5a-d8a6-9927080e8e3c.png)

## AzureロールとEntraロール

どうやら自分のロールを見るためには、**"Microsoft Entra ロール"** なるものが必要らしい。

### Azureロール
Azureリソースの管理に関する権限。
- 例）
    - 所有者
    - 仮想マシン共同作成者

Azure RBACと呼ばれるのはこちら。

### Microsoft Entra ロール
ディレクトリ内の Microsoft Entra リソースの管理に関する権限。
ユーザやアプリケーションの管理にはこちらのロールが必要になる。
- 例）
    - 全体管理者
    - グローバル管理者

エラーの表示を見るに、今回はこちらの **"ディレクトリ閲覧者"** が必要な模様。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3242301/761b3b81-6d0b-e537-c219-02a7d8fdd9c4.png)

このあたりの権限がなかったということですかね。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3242301/e54e3c2f-6dae-47b6-d5a1-fd1e462c2377.png)


#### 補足（?）
Azureロールで"所有者"を付与すると、下記の権限もついてくるのですが、"ディレクトリ閲覧者"の権限がないと、見られないようです。
このあたりはどうも難しいですね。。。
**"ロール割り当ての取得"**（Microsoft.Authorization/roleAssignments/read）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3242301/f7871327-ac2d-f8ef-14a7-4497632e3c4d.png)


#### 参考：
https://learn.microsoft.com/ja-jp/azure/role-based-access-control/rbac-and-directory-admin-roles

https://learn.microsoft.com/ja-jp/azure/role-based-access-control/built-in-roles

https://learn.microsoft.com/ja-jp/entra/identity/role-based-access-control/permissions-reference
業務改善小ネタ。１時間ごとに自動で特定URLページを開くようにしてみました

※以前の投稿は、個人情報が入っていたため、削除して再投稿させていただきました💦
すみません🙇


工数メトリクスをWebでつけてるのですが、どうも記入を忘れてしまう。
・・・という個人的な悩みが有ります。
（ほんで４個ほどプロジェクト掛け持ちしてるので、１日立つと、もう昨日何したか忘れて
困った。。。）

なんとかしよう、と考えたところ

**１時間位ごとに自動でブラウザから強制的にメトリクスツールひらけばいいんじゃね？**

と思いまして、ちょっと色々試して見ました。

↓
↓
↓

最終的に、**macのAutomator + cron**の構成になりました！

備忘録的に載せておきます。

---

1. mac環境で、Automator立ち上げて、アプリケーションを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812996/ddc9d97c-4c67-dfc7-0fe6-66ba7252534c.png)
2. 指定されたURLを取得　→　Webページを表示、の二つを組み合わせます。
「指定されたURL」には、工数メトリクスのWebページのURLを設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812996/c0a17bd8-9eac-4c7a-19bd-206d15b02847.png)
3. 適当なところにAutomatorのアプリケーションとして保存
4. ターミナルから "crontab -e" します。

        % crontab -e
        59 9-11,13-21 * * 1-5 /path/to/Documents/openMetrix.app/Contents/MacOS/Automator\ Application\ Stub


月(1)〜金(5)曜日の、9〜11時、13時〜21時の59分に
Automatorのアプリケーションを開く設定です。
（１２時は昼休み）

Automatorの.appだと、ターミナルから見たらただのディレクトリなのでブラウザ起動しません。
パッケージ内にある/Automator\ Application\ Stubを指定する必要が有りました。


・・・これで無事１時間ごとに工数メトリクスのページ（特定のURL）を、ブラウザ自動起動してくるようになりました！

---

※ 後日談（オチ）

自動起動が強力すぎて、
お客様とのWebミーティングで画面共有しているときに、メトリクスページに遷移しそうになりました（＞＜

もうちょっと簡単にON/OFF切り替えられるといいんですけどねー。なんかないかもう少し探してみます。
React.js propsとstateの基礎を理解

# 簡単なカウンターアプリを実装


https://codesandbox.io/embed/x2skmt?view=preview&module=%2Fsrc%2FApp.js

## 基礎をおさらい

### props (プロパティ)
コンポーネントが親（上の部品）から子（下の部品）にデータを渡すためのもの。

例）親が子どもにプレゼントを渡すようなもの。子どもはそのプレゼントを使うことができますが、プレゼント自体は変えられません。

### state (状態)
stateは、コンポーネントの中で自分自身のデータを持つことで、このデータは変えることができます。

例）おもちゃの車があって、その車がどこにあるかを覚えているようなもの。車を動かすと、その位置が変わります。

## コードの説明

```
// カウンター部品（Counter）
function Counter({ initialCount }) {
  const [count, setCount] = useState(initialCount);

  const increment = () => setCount(count + 1);
  const decrement = () => setCount(count - 1);
  const reset = () => setCount(initialCount);
```
### Counter部品
- initialCountというプレゼント（props）を受け取る。
- useStateを使って、`count`という数字を覚える。この数字が<b>state</b>です。
- incrementという関数を作り、ボタンを押すと`count`が1増える。
- decrementという関数を作り、ボタンを押すと`count`が1減る。
- resetという関数を作り、ボタンを押すとcountがinitialCountに戻る。

```
// メインアプリ部品（App）
function App() {
  return (
    <div style={styles.appContainer}>
      <h1 style={styles.title}>Counter App</h1>
      <Counter initialCount={0} />
    </div>
  );
}
```
### App部品
- ここではカウンター部品を使います。
- カウンター部品に`initialCount`として0を渡します。

```
return (
    <div style={styles.counterContainer}>
      <p style={styles.counterTitle}>Count</p>
      <p style={styles.counterText}>{count}</p>
      <div style={styles.buttonWrap}>
        <button style={styles.button} onClick={increment}>
          +
        </button>
        <button style={styles.button} onClick={decrement}>
          -
        </button>
        <button style={styles.button} onClick={reset}>
          Reset
        </button>
      </div>
    </div>
  );
```

### 
- `{count}`は、カウントの状態（state）を表示しています。
- `onClick={increment}`はイベントハンドラーを設定。ボタンがクリックされたときに対応する関数を呼び出しています。
- `{increment}` カウントアップ
- `{decrement}`　カウントダウン
- `{reset}`　値をリセット

### なぜリセットが`setCount(initialCount)`なのか？

`initialCount`は、カウンターの初期値を表す。

#### 親コンポーネント（App）:

CounterコンポーネントにinitialCountという名前のpropsを渡します。
`<Counter initialCount={0} />`では、initialCountの値を0として渡しています。

#### 子コンポーネント（Counter）:

Counterコンポーネントはpropsとして`initialCount`を受け取ります。
useStateフックを使って`count`という状態を作成し、その初期値を`initialCount`で設定します。

### hooksの理解
上記コードに、hooksで機能を追加してみた

https://codesandbox.io/embed/9qcmk5?view=preview&module=%2Fsrc%2FApp.js&expanddevtools=1

`useEffect`を使って、副作用（コンソールログの表示）を追加しています。

```
  useEffect(() => {
    console.log(`カウントされた: ${count}`);   // 第1引数
  }, [count]);  // 第2引数
  ```

- 第1引数
  - 副作用関数。countが変更されるたびにこの関数が実行され、カウントが更新されたことをコンソールに表示する
- 第2引数
  - 依存関係の配列。この配列にはcountが含まれており、countが変更されると副作用関数が再実行される。
エラーFailed to start the Kernel.  Bad file descriptor 





# 問題

VSコードでJupyter notebookのPythonコードを回そうとすると前は使えてたのにいきなり下記のようなエラーが出てきた

~~~
Failed to start the Kernel. 
Bad file descriptor (C:\Users\runneradmin\AppData\Local\Temp\tmpkywtyyea\build\_deps\bundled_libzmq-src\src\......). 
View Jupyter log for further details.


~~~


# 解決できた

基本的に下記を拝見したらできました。ありがとうございました。

https://y-kitaro.hatenablog.com/entry/2024/04/19/210023


# 追加でやったこと

~~~
S C:\Users\xxxxx> pip install pyzmq==25.2.1
Defaulting to user installation because normal site-packages is not writeable
ERROR: Could not find a version that satisfies the requirement pyzmq==25.2.1 (from versions: 2.0.7, 2.0.8, 2.0.10, 2.0.10.1, 2.1.1, 2.1.4, 2.1.7, 2.1.9, 2.1.10, 2.1.11, 2.2.0, 2.2.0.1, 13.0.0, 13.0.1, 13.0.2, 13.1.0, 14.0.0, 14.0.1, 14.1.0, 14.1.1, 14.2.0, 14.3.0, 14.3.1, 14.4.0, 14.4.1, 14.5.0, 14.6.0, 14.7.0, 15.0.0, 15.1.0, 15.2.0, 15.3.0, 15.4.0, 16.0.0, 16.0.1, 16.0.2, 16.0.3, 16.0.4, 17.0.0b1, 17.0.0b2, 17.0.0b3, 17.0.0b4, 17.0.0, 17.1.0, 17.1.1, 17.1.2, 17.1.3, 18.0.0, 18.0.1, 18.0.2, 18.1.0, 18.1.1, 19.0.0, 19.0.1, 19.0.2, 20.0.0, 21.0.0, 21.0.1, 21.0.2, 22.0.0, 22.0.1, 22.0.2, 22.0.3, 22.1.0, 22.2.0, 22.2.1, 22.3.0, 23.0.0b1, 23.0.0b2, 23.0.0, 23.1.0, 23.2.0, 23.2.1, 24.0.0, 24.0.1, 25.0.0b1, 25.0.0, 25.0.1, 25.0.2, 25.1.0, 25.1.1b1, 25.1.1b2, 25.1.1, 25.1.2, 26.0.0a1, 26.0.0a2, 26.0.0a3, 26.0.0a4, 26.0.0a5, 26.0.0a6, 26.0.0b1, 26.0.0b2, 26.0.0, 26.0.1, 26.0.2, 26.0.3)
ERROR: No matching distribution found for pyzmq==25.2.1
~~~
と出たので

~~~
PS C:\Users\xxxxx> pip install pyzmq==25.1.2
~~~

にしてみたらうまく回るようになりました。

つい１週間前まで何も設定いじってなかったのにいきなり使えてたものが使えなくなるとビビりますね！
Salesforce にて作成されているレポート の Report ID 等の情報を一覧化したレポートを作成する方法

## 概要

Salesforce にて作成されているレポート の Report ID 等の情報を一覧化したレポートを作成する方法を共有します。私の環境では、`report`というカスタムレポートタイプでは Report ID の項目がなかったため、カスタムレポートタイプを作成することで対応しました。作成したレポートは下記です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a3fbdc40-f1a1-caa5-c456-ed3944111c7f.png)

Rerports という標準レポートタイプには、 Report ID が含まれていませんでいた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b064d52c-0757-eda1-8d5c-1ca676eeb2b1.png)

Rerport のみのカスタムレポートタイプでは Report ID が表示されなかったのですが、 `Dashboard Components`を追加したカスタムレポートタイプでは Report ID が表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8e11d609-5fe4-9f66-d951-d98ca3341f69.png)

## 手順

### 1. Setup -> Report Types を選択し、`Report Types`ウィンドウにて`New Custom Report Type`を選択
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/faeea27b-e9b8-87db-3214-c200304e81c2.png)

### 2. `Primary Object`を`Reports`とし、それ以外に任意の値を入力後に`Nex`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8a20462a-4544-b3f5-c1c6-731b2726082b.png)

### 3. `Click to relate another object`を選択し、`Dashboard Components`を選んだ上で`Save`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8e11d609-5fe4-9f66-d951-d98ca3341f69.png)

### 4. 作成されたレポートタイプを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b3c08e72-1b71-3c92-1e93-0b17566166be.png)

### 5. アプリケーションランチャーから Reports に移動し`New Report`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/842332a6-b1ca-10d1-6374-6c3c52b73b59.png)


### 6. 作成したレポートタイプを選び`Save Reprot`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c496d0cc-601f-f775-a773-4cddf4dae12c.png)

### 7. Fileter が設定されているためすべてのコンテンツを表示するように変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a847e9a3-54ed-df16-96f2-3c5dd2a26ce4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7e95e2b9-191f-041d-42ad-cd828350196e.png)


 ### 8.  表示する項目（Report ID、Report Type、及び、Report Name）を`Columns`に追加

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/063e4b28-8354-eefb-1194-04e15040dd32.png)

 ### 9. `Save & Run`を選択し、レポートに任意の名称を設定した上で`Save`を選択

[image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7035226a-f4d8-c2fb-c940-2630c3b56821.png)

### 10. レポートを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/34538838-7246-72d5-7014-282fe89c9b0f.png)
AWSSummitへ初めて行く人に向けた最大限楽しむためのTips

### はじめに
AWSSummit2024が6/20-21に幕張メッセで開幕されました！
私は初めての参戦でしたが、面白い企画やブースがたくさんありとても楽しかったです。
せっかくなので、「行って見たいけど、一歩が踏み出せない」「いつもオンライン参加で、現地って何がいいの？」って方向けに会場の周り方や行くときに覚えておくと良いことをここ残していきます。

## 事前準備
これだけは、事前に準備しておくと当日スムーズに周れるよっていうのを挙げておきます！
#### テーマを決める
今回のAWSSummitへ行くテーマを来ましょう！
周り切れないほどたくさんのブースがあります。
AWS Summit 2024の私のテーマは優先度順に以下のような感じ
1. AWS Summitを歩き回って雰囲気を感じたい
1. AWSのセキュリティサービスの理解を深めたい
1. サードパーティの監視サービスの理解を深めたい
1. 出展しているAIの体験してみたい

#### ホテルは早めに予約を！
幕張メッセ周辺のホテルは、すぐなくなりますので遠方からお越しの方は早めに予約をしておくのがおすすめです。

#### 服装は動きやすい服で！
+ スーツである必要はない！楽な格好でOK！（ジーパンの人もいます）
+ できるだけ涼しい恰好をすること（6月でもすごく熱いです）
+ 結構歩き周るのでスニーカーもおすすめ

#### 持ち物リスト
+ ポータブル充電器（一応会場にコンセントありますが、基本歩き周るので必要です）
+ 飲み物（入場時や各ブースでももらえますが、とても暑かったので一瞬でなくなりました）
+ 入場票（できれば印刷して持っていくと良いです）
+ リュックサック（名刺交換やメモをするので、両手が空く方が良いです）
+ メモ帳とペン（聞いたことはしっかりメモしましょう）
+ クリアファイル（もらった資料を綺麗に保管するため）

## 会場への行き方
京都在住の私は前泊を錦糸町でして会場へ向かいました。
Google Mapと一緒に歩いたのですが、私は乗り換えにめっちゃ迷いました。
なので、地方から向かう方は以下Tipsです。
+ JR海浜幕張駅から会場付近までバス移動ができますが、「朝はすごく混む」＋「どこに並んでいいか分からない」ので、JR海浜幕張まで電車で移動した方が無難
+ JR海浜幕張駅からは歩いても15分ほど

## 受付
会場に着いたら、流れで受付をします。受付では入場のためのQRコードを見せて入場することができますが、<font color="Red">早め(大体9時くらいまで)に入場すると以下特典がもらえる</font>のでお勧めです！
※2024年調べです。
+ 素敵なお弁当がもらえる！（今年はまい泉と塚田農場でした）
+ 10:00～のオープニングセッションを座り席で参加できる。（座席には翻訳機もついております）
+ AWS Summitオリジナルクッションがもらえる！

## 展示ブースのまわり方
いろんな展示がありますが、どう周っていいかわからない:cry:という方向けに以下Tipです。
#### Partner Solution Expoは目的を明確にして周ろう！
すべて話を聞いていては時間がいくらあっても足りません。
前章でも触れておりますが、行きたい企業ブースやジャンルを明確にして周りましょう。
私の場合では午前はフラフラ歩きまわりましたが、午後はNew RelicやTraceroute等に絞って周りました。おかげでしっかりとSREの勉強や比較検討ができるようになりました。

#### AWS VilledgeはガンガンAWSの人に声をかけて教えてもらう！
AWSのセキュリティサービスを勉強したい！と思いつつも、私はAWSビギナーだったので、「AWS Security Hub」って何？？の状態からのスタートでした。そういった基礎的なところから、しっかりとAWSの展示スタッフの方に教えて頂きました。
また、展示物のサービス構成や業務で抱える悩みなども聞いたら快く教えてもらえてとても参考になりました。
是非皆さんもガンガン、スタッフの方に声をかけて行きましょう！！

## セッションのまわり方
今回、私が会場を歩き周ってコミュニケーションを取りたかった＋後でオンデマンドでも見れるので、セッションは優先度が低くあまり参加してないです。もし、参加する場合は以下Tipsです。
+ セッションは基本的に事前予約をしておくこと
+ 立見席もあるので、気になるなら予約できなくても行ってみる
+ 英語のセッションは翻訳機を配布しているので、それをもらう

## その他
#### AWS認定者ラウンジは午後がおすすめ
AWSの認定資格を持っているとラウンジでステッカーをもらえますが、人が多いので午後の人が比較的少ない時間に行くのがおすすめです。

#### AWS Deep Racerは盛り上がっているので一見すべし
会場に足を運んだのであれば、少しでいいので是非見てみてください！とても盛り上がっていて、おもしろいコンテンツになっています。ルールわからない方も雰囲気だけでも味わってみて欲しいです。

#### 会場付近は昼食場所は少ない
会場付近でお昼を食べられる場所はとても少なく、そしてとても混みます。できるだけ保険としてコンビニで少しだけ買っていき、前述のお弁当をもらうのがおすすめです。

#### 今回の私の周り方
最後に、私は一日のみの参戦でしたが、私の周り方を以下に記載しておきます。
##### 午前
8:30 現地到着
10:00-10:40 オープニングセッションの参加
11:00-12:00 ひたすら会場をうろうろ
##### 午後
12:00-13:00 お昼休憩と作戦会議
13:00-14:00 Partner Solution Expoをゆっくり回る（NewRericやTraceRoute、Datadog等）
14:00-15:00 会場の外で休憩（少しだけ仕事があったので、外部オフィスで仕事をしました）
15:00-17:00 AWS Villedgeをゆっくり回る
17:00-17:30 適当にぶらぶら
17:30 帰宅
AWSコンソールのサインイン画面が新しくなってます。

# 新しいコンソールが確認できるよ！
タイトル通り、新しいUIにできるみたいなので差分確認です。
コンソールに入れば新規サインインの有効化があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273072/fa32bd44-9d15-ff2e-aeb9-d87134b11f14.png)

新規UIに入ってみましたがIAMユーザーのサインインでは、そこまで違いがないように見えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273072/4c1f8924-f532-3ee8-b76e-84bb70ecb041.png)

右上の新しいサインインを押下すると従来のサインインに戻ることができます。

ちなみにルートユーザーに関しては変更されていません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273072/cac5b1a7-c5a0-66f2-eb90-20e543e90c0c.png)

# まとめ
手動でログインする分には特に問題なさそうですね！
自動ログインしている人は注意です！
中小企業に就職する？電話対応や車の運転大丈夫そ？

布川シーランド公爵です。
公爵は新卒で中小企業に就職した、地方在住のエンジニアです（サンプル数N＝１）。

# 雑務、あるかどうかは運要素が強い

新しいところでお仕事しようと思ったら、ときに雑務があります。

雑務といっても、「細かいタスクなんでもやります」「やったことはまずすべてをドキュメントにしました」っていう改革のかっこいいアレじゃなくて泥臭いやつです。
ゴミ箱のゴミ集めとか、水場のお掃除とか、電話応対とか、直接的には生産性にはかかわらないやつです。

この辺は会社ごとにちがいます（ないところはほんとうにない）。

エンジニアの友人と話してると、私が当たり前のようにやっている雑務をやっていないということがあって、結構場所によって違うんだなあと思います。
「このくらいは普通だし、ここでしがみつかないとどこでもやっていけない！」って歯を食いしばって耐えてると**別に他の人はやんなくてもよかったりするわけですよ。**

あんまり選り好みするとできることなくなっちゃったりするわけですが、本当に、本当に苦手だったら避ける道があるわけです。

なんか、雑務の中には、時勢とノリと受け持ってる仕事とキャラクターでたまたましなくてもいいことがあって、そのへんってすごくギャンブルなんですよね。

なんとなく、状況とキャラクターで許されることがあるのがこの手の業務です。

自分の好きなことをお仕事にしようというよりは「死ぬほど嫌なことは死なないようにやんないようにしよう」みたいなコンセプトで就活しました。
「どうせ8時間業務するなら、パソコン仕事がいいな」という苦痛の少ない選択肢を選んで今ここにいます。

私にとってどうしても嫌なこととは、例えば、犯罪、飲み会（※）、運動会です。
※お取引先とかとたまにお食事するのとか、年に数度くらいなら、いいか、と思っています。

新卒のみなさんには、嫌なことはあるでしょうか？
そしてそれは避けられそうな困難でしょうか？

「中小企業でのんびりやりたいな」、と思った場合、見えない要件には気を付けてご検討ください。

## 電話対応
名刺交換、電話対応、来客対応、新人のマナー研修の定番ですね。

私は実際に会社でもぼちぼち電話対応をやっています。
きらいじゃないです。

とくに怒鳴られたりするようなクレーム対応窓口ではなく、〇〇さんに繋いだりといったような感じ。
名前聞き取れなくて困り果てたりもしますが……、まあ、たまにだしね。

友人は常駐SEなので（自分宛ての内線に出る以外は）一切ナシと聞きました。

たまに、電話対応（＊人に回すタイプ）がすごくニガテな人がいるっぽい。

「慣れ」とかではなくてほんとに電話だけニガテで、電話で削られる人は気を付けてください。場所を選ぶとその困難を回避できる可能性があります。

大きいところだと、完全に受付窓口があってそっちに飛んでくので外からの電話を受けることがないというのが確定していたりもすると思うんですが、中小企業はギャンブルです。
新卒が一人か二人だと、結構な頻度で電話を取る必要がある場合があります。

まあ、相談して、ほかの業務頑張りますっていえば、免除してもらえるかもしれません。

なんか、思ってたのとだいたい一緒なんですが、実際やってみると、想像と違う細かい差異はあって、たとえば、たまーに小さなうそをつく必要があることがあります。

たとえば、営業電話に「いないって言って！」っていわれて、しれっと「居ませんー」って言ったりです。このへんダメな人がいるっぽい。

## 自動車運転

まあ車の運転は中小企業じゃなくてもあったりなかったりすることだろう……。

これが私にとって死ぬほど嫌なタスクです。
免許は取りましたが心底「車の運転、向いてねえ……」と思っています。

これはほんとうにやりたくなくて、やらざるを得なくなったら、キャリアを含めて身の振り方も考えようかなと思っています。

まあ、真剣に運転をしないと職を失ったり、生活が立ち行かなくなってしまうという覚悟で挑んだことはないので、慣れたら何とかなるのかもしれません。
なんとかなるくらいの地方です。

ほんとは就職時の要件に入ってたんですが、なんか流れで「やんなくてもいい」ムードの中にいてやんなくてすんでます。
すごいラッキー。これはほんとにデカい。

## 社内清掃

業務時間外に清掃作業がありましたが、ここ数年で業務時間として認められることになりました。
やったね。

私は業務時間ならいいや、息抜きになるし、ってタイプです。
業務時間外にさせられるのは、……。

これにも向き不向きがありそうです。

## 除雪作業（雪国）

除雪はなあ、労働だぞ！

これも、ここ数年で業務時間として認められることになりました。

あるかどうかは完全に運で、ないところは別にないです。自社ビルかどうかみたいなのが大きいのではないだろうか。

当番制だったのですが、「家が近いのではないか？」と遠回しに来いと言われたこともありました。当番じゃない日は、いきませんでした。いきませんでしたがいったほうがいいんだろうなと思っていますがいきませんでした。

素直に引き受けるか、圧力をスルーするか、なんかこのへんに向き不向きありそうです。

# リモートワークだと、QOLはデカいのである

リモートワークがあるところは職場環境が良い傾向にあります。

単純におうちが快適で、家にいればQOLが上がるってコトでもありますが、数名、とくに若手がフェアに働ける環境があるかってことに直結します。

リモートは、雑務がないです。
議事録のまとめとかデジタルのなにかはあるかもしれませんが、新人が「やれ」といわれるような、職場をめぐってゴミを集めたり水道周りを歯ブラシで磨いたり、みたいなことがないです。

特に小さいところ（小さいところしか知らんが……）は、あればあるほどいいです。つまり若手が若手のうちは、って、無理して出社していろいろやる圧力がないってことです。

電話応対もそうだし、掃除もそうだし、運転もまあ、そうかな……。一人か二人しかいない若手が、ひょいっとリモートにしても耐えられる。
そういう分担がしかれているか。これはQOLに直結します。

週数回でも、自分はやらなくても、「できる」という選択肢があるってことは環境が良いです。完全じゃなくてもいいので、リモートやってるところは狙い目です。

実態がちゃんとあるかどうかは入るときに見極めていきましょう。私は「子供のケガなどの特段の事情が別になくても、業務上可能なときは希望してリモートワークができるか？」が大事だと思います。
[MacOS node2Vec] TypeError: cannot pickle 'PyCapsule' objectのエラー

# 1. TypeError: cannot pickle 'PyCapsule' objectのエラー

[pyg公式サイト](http://pytorch-geometric.readthedocs.io)でnode2vecを動かすとpickle関係でエラーが出たので、解決方法を共有します。

## 1-1. 該当ソース

```node2vec_sample.py
import torch
from torch_geometric.nn import Node2Vec
from torch_geometric.datasets import Planetoid

data = Planetoid('./data/Planetoid', name='Cora')[0]

device = 'cuda' if torch.cuda.is_available() else 'cpu'

model = Node2Vec(
    data.edge_index,
    embedding_dim=128,
    walks_per_node=10,
    walk_length=20,
    context_size=10,
    p=1.0,
    q=1.0,
    num_negative_samples=1,
).to(device)

optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

loader = model.loader(batch_size=128, shuffle=True, num_workers=4)

pos_rw, neg_rw = next(iter(loader))

print(pos_rw.shape, neg_rw.shape)
```

```
$ python node2vec_sample.py

Traceback (most recent call last):
  File "/node2vec_sample.py", line 24, in <module>
    pos_rw, neg_rw = next(iter(loader))

  File "/3.11.1/envs/pygEnv/lib/python3.11/site-packages/torch/utils/data/dataloader.py", line 439, in __iter__
    return self._get_iterator()
           ^^^^^^^^^^^^^^^^^^^^
  File "/3.11.1/envs/pygEnv/lib/python3.11/site-packages/torch/utils/data/dataloader.py", line 387, in _get_iterator
    return _MultiProcessingDataLoaderIter(self)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/3.11.1/envs/pygEnv/lib/python3.11/site-packages/torch/utils/data/dataloader.py", line 1040, in __init__
    w.start()
  File "/3.11.1/lib/python3.11/multiprocessing/process.py", line 121, in start
    self._popen = self._Popen(self)
                  ^^^^^^^^^^^^^^^^^
  File "/3.11.1/lib/python3.11/multiprocessing/context.py", line 224, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/3.11.1/lib/python3.11/multiprocessing/context.py", line 288, in _Popen
    return Popen(process_obj)

  File "/python3.11/multiprocessing/popen_spawn_posix.py", line 32, in __init__
    super().__init__(process_obj)
  File "/3.11.1/lib/python3.11/multiprocessing/popen_fork.py", line 19, in __init__
    self._launch(process_obj)
  File "/3.11.1/lib/python3.11/multiprocessing/popen_spawn_posix.py", line 47, in _launch
    reduction.dump(process_obj, fp)
  File "/3.11.1/lib/python3.11/multiprocessing/reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)

TypeError: cannot pickle 'PyCapsule' object
```

## 1-2. 修正方法

```node2vec_sample.py
.
.
.

#↓num_workersの値を0に変える

#loader = model.loader(batch_size=128, shuffle=True, num_workers=4)
loader = model.loader(batch_size=128, shuffle=True, num_workers=0)

pos_rw, neg_rw = next(iter(loader))

print(pos_rw.shape, neg_rw.shape)
```

```
$ python node2vec_sample.py

torch.Size([14080, 10]) torch.Size([14080, 10])
```
tensorflow-metalを用いて機械学習にApple SiliconのGPUを利用する方法

## TL;DR

- TensorFlowで機械学習をしたい
- Apple SiliconだとNVIDIAのGPUが使えない（当たり前）なので遅い
- tensorflow-metalを入れよう

## あとでがっかりする前に

- tensorflow-metalは3.11系以上では動きませんでした
- tensorflow-metalはマルチGPUをサポートしていません

これらを期待している方・必須な方は涙をふきながらブラウザバックをお願いします。

## 大まかな手順と前提

- pyenvでPython 3.10系を入れる
- venvを立てる
- tensorflow-metalを全部突っ込んでいき

Pythonとpyenvは入っている前提で、この記事を読んでいるということでOSはmacOSを前提にしてます。

## pyenvでPython 3.10系を入れる

tensorflow-metalは3.8系から3.10系にしか対応していない（目立つところに書いてなくてハマった）ので、pyenvでインストールしていきます。3.8系から3.10系の人はこの手順はスキップして良いです。私は何も考えずにとりあえずこの中で最新の3.10.14を入れました

```sh
pyenv install --list
pyenv install 3.10.14
```

バージョン一覧を確認してインストールされていたら成功です。

```sh
% pyenv versions
  system
  3.10.14
* 3.12.3 (set by /Users/shirokuma89dev/.pyenv/version)
```

## 仮想環境を作る

対応させるために3.10系にバージョンを下げましたが、それを今後使い続けるのもダサいので仮想環境を作ります。

任意の機械学習の作業ディレクトリに移動して

```
pyenv local 3.10.14
```

します。

## venvを立てようの会

~/venv-metalにvenvをつくります。ここの先は任意の場所で構いません。私は別プロジェクトもtensorflow-metalを利用する可能性を考えてホームディレクトリに作りました

```
python -m venv ~/venv-metal
source ~/venv-metal/bin/activate
```

## tensorflow-metalをインストールしていき

```
python -m pip install tensorflow
python -m pip install tensorflow-metal
```

## 検証

以下を実行してみてGPU is available ✅とでたらGPUが利用可能な状態になっています。

```python:gpy_check.py
print("GPU Check")

import tensorflow as tf
import platform

print(f"Python Platform: {platform.platform()}")
print(f"Tensor Flow Version: {tf.__version__}")

is_gpu_available = len(tf.config.list_physical_devices('GPU')) > 0
print("GPU is", "available ✅" if is_gpu_available else "not available ❌")
```

```sh
% python gpu_check.py
GPU Check
Python Platform: macOS-14.2.1-arm64-arm-64bit
Tensor Flow Version: 2.16.2
GPU is available ✅
```

## 参考文献

https://developer.apple.com/metal/tensorflow-plugin/
Microsoft365(Exchange Online)はどこまで送受信セキュリティ機能があるのか

## メール環境のセキュリティ

メール送受信にはいろいろとセキュリティ機能があります。
Gamilが「対応しないと受け取らなくする」とか言っているのは有名ですが、
Microsoft365(Exchange Online)利用時にはどれだけ対応できるのでしょう？

ここでテストしてみます。

https://internet.nl/


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667610/ffe0466a-c51a-8817-bdbf-74c618d3c4ac.png)

IPv6,DNNSEC,DMARC,DKIM,SPF,TLS,DANE,RPKIについてチェックされます。

## IPv6

mail server (MX)がIPv6アドレスを持つか。
これは、セキュリティではなくパフォーマンス面で影響が出るらしい。
Exchange Onlineのサーバーは非対応。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667610/c9c8e16b-ebba-3aee-2e84-d4e28cd27f69.png)


## DNSSEC

![スクリーンショット 2024-06-27 144735.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667610/232eda97-3357-dc88-12ed-87e042753aaa.png)


現在インターネットはDNSが必須で、いくつかのセキュリティもDNSに依存してたりしますが
肝心のDNSがセキュアでなければいけない、ということでしょう。

アドレスのドメイン自体は既にDNSSEC対応済みですが
MXである「*.mail.protection.outlook.com 」がDNSSEC未対応です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667610/7a826722-b583-6d4f-50af-a2a1f02003e2.png)


## DKIM

DNSレコードを設定できる前提ですが、DKIMは対応済み。
設定をしておけば、ExchangeOnlineで送信したメールにはDKIM署名が付与される。

https://learn.microsoft.com/ja-jp/defender-office-365/email-authentication-dkim-configure

## SPF,DMARC

SPF,DMARCは送信サーバー自体の機能ではなく、DNSレコードへの設定次第なので、適切に設定すれば問題なし。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667610/2bfcb86b-967a-fab1-09d1-caca0edc87c1.png)

## TLS (STARTTLS)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667610/e4360dfc-ee34-3091-3031-08aa82dae213.png)


STARTTLSでTLS接続に切り替えられるか、そのTLS接続はセキュアか？
これは問題なし。
さすがにこのご時世TLS接続出来ないのは手抜きが過ぎると思う
(実は、とある日本の大きな会社で非対応なのを見つけちゃってたりするけど)

## DANE

https://learn.microsoft.com/ja-jp/purview/how-smtp-dane-works

> Exchange Online のお客様は、送信メールのこの強化された電子メール セキュリティを構成するために何もする必要はありません。 
> この強化された電子メール セキュリティは、Microsoft が構築したものであり、すべての Exchange Online のお客様に対して既定でオンになり、
> 宛先ドメインが DANE のサポートをアドバタイズするときに使用されます。
> DNSSEC と DANE チェックを使用してメールを送信する利点を得るために、
> これらの標準を使用して電子メールを受信できるように、DNSSEC と DANE を実装する必要があるメールを交換するビジネス パートナーに連絡します。

送信する分には既に対応済み。

受信に関しては

> 現在、受信 SMTP DANE は Exchange Online ではサポートされていません。 近い将来、受信 SMTP DANE のサポートが提供される予定です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667610/8a2be050-2750-8f1a-b317-d3d14dd56579.png)


DANEの動作にはMXのドメインがDNSSECに対応していることが前提なので、DNSSECが非対応ならもちろん非対応。



近い将来というのは今年らしい。

https://techcommunity.microsoft.com/t5/exchange-team-blog/implementing-inbound-smtp-dane-with-dnssec-for-exchange-online/ba-p/3939694


これ、試せるようになったらやってみたい。

2024年7月19日 追記：
やってみました

https://qiita.com/ripple_naip/items/a815f53a619e486da4af

## RPKI

これは詳しくないけど、ネットワークのルーティングに関して、誤った経路情報が検出できるように
認証するシステムらしい。

これNGでも手が出ないだろうけど。

##　終わりに

メールアドレスのドメインのDNSSEC対応があれば
Exchange Onlineでの対応は、おそらく今年中にこのテストで100%が取れるようになるんじゃないかな。
LLM（大規模言語モデル）からマルチモーダルの変遷と活用方法

# LLM（大規模言語モデル）からマルチモーダルの変遷

2022年11月にChatGPTが発表されてから、生成AIやLLM（大規模言語モデル）という用語も一般的に使われてきました。
ChatGPTの発表は衝撃的で、筆者もこれまで教師あり学習によるデータ予測や画像認識を実装してきましたが、データサイエンティストでなくてもAIモデルを利用する時代がやってきたと痛感させられました。
ChatGPTでどこまでできるのかに興味を抱き、筆者は2023年の「[IBM Community Japanのナレッジモール研究](https://community.ibm.com/community/user/japan/blogs/ibm-ibm-community-japan-office1/2023/11/16/2023-kmr-award)」で「ITシステム導入の提案書評価」をChatGPTに行ってもらう研究もしてきました。


そんな中2023年の後半からは「マルチモーダル」という技術が発展し、これまで「スクリプト」と呼ばれる文章中心のインプットだったものが、文章+α（画像、音声など）をインプットに、回答を返してくれるようになりました。
この記事では、LLM（大規模言語モデル）からマルチモーダルに技術の進展がされることで、どのようなことが可能になるか、活用方法とともに紹介します。
なお、LLMやマルチモーダルを利用するためのサービスは多数ありますが、この記事ではChatGPTを使ってご紹介します。

## LLM（大規模言語モデル）
LLM（大規模言語モデル）とは、生成AIの一種です。
生成AIはネット上などに存在する膨大なデータを学習することで、テキスト、画像、音声などのデータを自律的に生成できるAI技術です。
LLMは、その一種であり、膨大なテキストデータに特化してディープラーニングされた、自然言語処理（NLP）に特化したモデルです。
2022年11月にChatGPTが発表されましたが、ChatGPTはLLMを利用するためのサービスです。あまり意識することはないかもしれませんが、ChatGPTの中ではGPT-3.5やGPT-4などのLLMモデルを選択でき、精度やレスポンスの速度、無償/有償に違いがあります。

## LLMの課題
ChatGPT含むLLMのサービスは、文章生成の分野で大きな影響を与えました。
しかし、LLMには課題もあります。
普段、私たちの暮らしでは文章だけで何かを伝え、文章だけで答えてもらうということは少ないです。

### 房総に旅行した例（LLM編）
筆者は房総で「なめろう」という料理を食べましたが、その料理をそもそも知らなかったとします。
そのため、ChatGPTに次のように質問しました。

#### GhatGPTへのインプット
```
私は房総にいます。房総でアジが細かく切られて葉っぱの形に盛られた料理を食べました。この料理について教えてください。
```

#### GhatGPTからのアウトプット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3345895/c45e0899-1502-bcd6-a958-e5764aa27e82.png)

ChatGPTは正確な答えを返してくれました。
ただし、自分が食べた料理をこのように文章にして質問する機会は、人を相手にする場合では少ないです。

## マルチモーダル
そんな中、2023年の後半から**マルチモーダル**という用語が広まりました。
また、ChatGPTでも2024年5月から**GPT-4o**というマルチモーダルに対応したモデルが利用できるようになりました。（注意：無償の場合、利用制限あり）

マルチモーダルとは、複数のインプットに対応した生成AIであり、例えば画像とテキストをインプットとして回答を得たりすることができます。
つまり、スマホで撮った写真と、その状況の説明をするだけで、簡単に質問することが可能となるのです。

### 房総に旅行した例（マルチモーダル編）
先ほどのなめろうの例を、ChatGPTのGPT-4oモデルで試してみます。
なお、画像は[日本交通公社](https://tabi.jtb.or.jp/res/120001-)から引用しています。

#### GhatGPTへのインプット
![images.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3345895/e1a72570-d748-0521-ea95-0f5b601080e1.jpeg)
```
千葉県で食べたこの料理について教えて
```

#### GhatGPTからのアウトプット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3345895/be43524a-d4e6-9e9a-f119-d41a2dd0348e.png)

画像中心の質問でも、正しく回答されました。
これからは、人間がAIへ質問するために、文章化するという手間を省ける時代がやってくることを期待させてくれます。

### そのほかの活用例
ここまで、房総旅行のなめろうを元に活用方法を紹介してきました。
でも、なめろうくらい誰でも知ってるよね？と思われる方もいるかもしれません。

他の活用例として、雑草の名前を教えてもらう例を挙げます。

#### GhatGPTへのインプット
![nagamihinageshi050202.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3345895/0b7bab4c-c1e1-2544-ae67-7c9949c253ab.jpeg)
```
春によく見かけるこの花の名前を教えて
```

画像の引用：[春日部市](https://www.city.kasukabe.lg.jp/soshikikarasagasu/recyclesuishinka/gyomuannai/6/25875.html)

#### GhatGPTからのアウトプット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3345895/029fbfbc-4598-991c-100b-381b1b6e527d.png)

結果は、この通りです。
文章だけでは説明が難しいですが、写真と文章によって見事に雑草の名前を知ることに成功しました。


## まとめ
2022年11月にChatGPTが発表されてから2年経っておりませんが、ChatGPTの対話型AIの衝撃を受け、2024年になってからはマルチモーダルの衝撃を受けるなど、生成AIはとてつもないスピードで進化が進んでいます。
特にマルチモーダルはまだまだ出始めの技術であり、これからますます進化すると予想されます。
技術の進化をキャッチアップし、今後もお伝えできればと思います。
【ChatGPT＋DALL-E3】【Dream Machine】のパノラマの動画をつなげる（失敗）


　どうも、カーブミラーです。

　今回は、Dream Machineで作成したパノラマの動画をつなげる、その予定でしたがうまく行きませんでした。その失敗談を書きます。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はありません。あしからず。
:::

　ニュースがないので、
　　さっそく本題です。

　昨日（2024/06/30）作成した
　　パノラマの四分割を使って、
　　　Dream Machineで
　　　　Extendしようとしたのですが
　　　　　二回目以降が
　　　　　　Keyframeを使えない
　　　　　　　ことがわかりました。

　まぁ、体験版ですから
　　そうした制限を受けていても
　　　仕方ないわけですが。

　さて、困ったぞ。
　　ExtendでもKeyframeを
　　　当てにしていたわけですから。

　まぁ、
　　動画をくっつければいいや、と
　　　やってみました。
　　　　方法は下記参照。
[【ChatGPT＋DALL-E3】【Dream Machine】の動画をつなげる方法](https://qiita.com/kabumira/items/5cda411691a23e21a6b6)

　つなげてみると
　　途中の接合部で
　　　一瞬、停止します。

　それもそのはずで
　　同じ画像が、両方の動画に
　　　含まれているためです。

　前の動画の最後の部分と
　　後の動画の最初の部分が
　　　同じ画像なのですから
　　　　当然の結果です。

　ならば、その部分を
　　削除した動画を作成すれば
　　　いいはずです。

　削除した動画を作成するには
　　こちらを参照してください。
[【ChatGPT＋DALL-E3】【Dream Machine】の動画から指定箇所を抜き出します。](https://qiita.com/kabumira/items/45f1a26ccf7d99ed2764)

　――

　どうも
　　最後のフレームを削除しても
　　　一時停止します。

　そこで
　　２フレーム、３フレームと
　　　削除してみたのですが、
　　　　一時停止はなくなりません。

　こりゃ、
　　うしろの動画が悪いのか、と
　　　前のフレームを
　　　　１フレーム、２フレームと
　　　　　削除してやりましたが
　　　　　　やはり、一時停止して
　　　　　　　しまいます。

　削った結果の動画の
　　詳細情報をChatGPTさんに
　　　問い合わせた結果は、
　　　　正しく削除されている模様。
***
　もう少し
　　粘ってみます。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
Proxmoxでapt-get update' failed: exit code 100を解決する方法

## 今回解決すること

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782197/2355e6cf-71e7-5391-28aa-7243eab60c83.png)


"TASK ERROR: command 'apt-get update' failed: exit code 100" というエラーを解決します.

## なぜエラーが起きるのか

まずなぜこのエラーを吐くのかというと, パッケージマネージャがProxmoxエンタープライズリポジトリにアクセスしようとしていて, サブスクリプション登録をしていないとこのエラーが発生します.

では, エンタープライズリポジトリにアクセスしないように設定を変更することで解決ができます.


## 解決手順

ノードのシェルに入って次のファイルを変更します.

```shell
nano /etc/apt/sources.list.d/ceph.list
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782197/d62ac841-d67b-51a5-4f03-9d9ee11ecfb3.png)

おそらくこのような内容が記述されていると思うので, この1行目の先頭に'#'をつけてコメントアウトを行います.

同様に以下のファイルを開きコメントアウトを行います.

```shell
nano /etc/apt/sources.list.d/pve-enterprise.list
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782197/6cdfb665-6e7a-ed5f-1705-390c869e11a6.png)

最後に, "pve-no-subscription.list"を作成して以下の内容を入力し保存をしてください

```shell
nano /etc/apt/sources.list.d/pve-no-subscription.list
```

↓ 入力内容 ↓
```shell
deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription
```

入力し保存したら, 以下のコマンドを実行します.

```shell
apt-get update && apt-get dist-upgrade
```

apt-get update && apt-get dist-upgradeを実行して問題が起きなければ解決です.


## さいごに

毎日ログに赤文字で目についていたので解決方法を模索しました.
同じ問題で困っている方の助けになれば幸いです.

ご閲覧いただきありがとうございました.