OmniAICreator/Qiita-1.07M huggingface dataset:
vba outlook　検索返信

'ika code

Sub AutoReplyToEmail()
    Dim OutlookApp As Object
    Dim OutlookNamespace As Object
    Dim Inbox As Object
    Dim MailItem As Object
    Dim ReplyMail As Object
    Dim Item As Object
    Dim subjectToFind As String
    Dim found As Boolean
    
    ' 件名を指定
    subjectToFind = "Your Email Subject Here" ' 検索するメールの件名に置き換えてください
    
    ' Outlookアプリケーションを起動
    On Error Resume Next
    Set OutlookApp = GetObject(, "Outlook.Application")
    If OutlookApp Is Nothing Then
        Set OutlookApp = CreateObject("Outlook.Application")
    End If
    On Error GoTo 0
    
    ' Outlookの名前空間を取得
    Set OutlookNamespace = OutlookApp.GetNamespace("MAPI")
    Set Inbox = OutlookNamespace.GetDefaultFolder(6) ' 6 は受信トレイを示す定数
    
    ' 受信トレイのメールをループ
    found = False
    For Each Item In Inbox.Items
        If Item.Class = 43 Then ' 43 はMailItemを示す定数
            Set MailItem = Item
            If MailItem.Subject = subjectToFind Then
                found = True
                Exit For
            End If
        End If
    Next Item
    
    ' 該当するメールが見つかった場合、返信
    If found Then
        Set ReplyMail = MailItem.Reply
        With ReplyMail
            .Body = "This is an automatic reply." & vbCrLf & .Body ' 自動返信の本文に置き換えてください
            .Display ' メールを表示（送信は手動で行う）
        End With
        MsgBox "Reply created for the email with subject: " & subjectToFind
    Else
        MsgBox "No email found with subject: " & subjectToFind
    End If
    
    ' オブジェクトの解放
    Set ReplyMail = Nothing
    Set MailItem = Nothing
    Set Inbox = Nothing
    Set OutlookNamespace = Nothing
    Set OutlookApp = Nothing
End Sub


コードの説明
件名の指定:

vba
コードをコピーする
subjectToFind = "Your Email Subject Here" ' 検索するメールの件名に置き換えてください
自動返信したいメールの件名を指定します。
Outlookアプリケーションの起動:

vba
コードをコピーする
Set OutlookApp = GetObject(, "Outlook.Application")
If OutlookApp Is Nothing Then
    Set OutlookApp = CreateObject("Outlook.Application")
End If
Outlookアプリケーションを起動します。既に起動している場合はそのインスタンスを取得します。
受信トレイのメールをループ:

vba
コードをコピーする
For Each Item In Inbox.Items
    If Item.Class = 43 Then ' 43 はMailItemを示す定数
        Set MailItem = Item
        If MailItem.Subject = subjectToFind Then
            found = True
            Exit For
        End If
    End If
Next Item
受信トレイ内のすべてのメールをループし、指定した件名のメールを探します。
メールが見つかった場合、返信を作成して表示:

vba
コードをコピーする
If found Then
    Set ReplyMail = MailItem.Reply
    With ReplyMail
        .Body = "This is an automatic reply." & vbCrLf & .Body ' 自動返信の本文に置き換えてください
        .Display ' メールを表示（送信は手動で行う）
    End With
    MsgBox "Reply created for the email with subject: " & subjectToFind
Else
    MsgBox "No email found with subject: " & subjectToFind
End If
該当するメールが見つかった場合、そのメールに返信を作成し、Outlookの送信ダイアログを表示します。送信は手動で行います。
使用手順
Excelファイルを開き、Alt + F11を押してVBAエディターを開きます。
メニューから "Insert" > "Module" を選択し、新しいモジュールを挿入します。
上記のコードをコピーして、挿入したモジュールに貼り付けます。
subjectToFindを自動返信したいメールの件名に置き換えます。
VBAエディターを閉じて、Excelに戻ります。
Alt + F8を押して "Macro" ダイアログを開き、"AutoReplyToEmail" を選択して "Run" をクリックします。
これで、指定された件名のメールに対して返信メールが作成され、Outlookの送信ダイアログが表示されます。送信は手動で行うことができます。
指示の不明確さと情報伝達の難しさ

## はじめに
開発現場では、コミュニケーションが円滑に進むことが重要です。
私は基本的に出社して開発を行っており、直接コミュニケーションを取ることができます。また、SlackやNotionを使用して作業指示やちょっとした会話も行っています。しかし、これらのツールを使っていても、コミュニケーションの課題が生じることがあります。以下では、具体的な課題とその解決方法について述べます。

### 課題例: 指示の不明確さと情報伝達の難しさ
現場でよく見られるやり取りの一例として、以下のようなものがあります。

例:
「〇〇さん、これをこうしてああしておいて！」
「〇〇先輩、できました！」
「いや、全然ちゃうんだけど。」

このようなやり取りでは、指示が不明確であるため、正しい作業が行われないことが多々あります。この問題の根本には、作業ゴールが共有できていないという点があります。

### 解決方法
1. **具体的な指示を出す**
指示を出す際には、具体的かつ詳細な内容を伝えることが重要です。例えば、「〇〇を〇〇のフォーマットに沿って作成し、〇〇フォルダに保存しておいて。」のように、具体的な作業内容、形式、保存場所を明示します。

2. **作業ゴールのイメージを共有する**
作業ゴールを共有するために、以下のような方法が有効です。
ビジュアルな参考例を提供する：完成形のイメージがつかみやすいように、参考となるサンプルやノートに書いた図など。

ただ工数もかかるので、パッと言葉や文字からイメージを作成して伝えられるサービスがあったらいいな〜とも思っています。

3. **期限と進捗報告を明示する**
指示を出す際には、いつまでにやってほしいのか、また途中で進捗状況を報告してほしいタイミングを明示することが大切です。例えば、「このタスクは明日の午後3時までに完了させてください。途中経過を今日の午後5時に教えてください。」と具体的に伝えることで、期待するタイミングと結果が明確になります。

4. **文書化する**
口頭での指示だけでなく、書面での指示も併用することで、情報の漏れや誤解を防ぎます。SlackやNotionを活用し、タスクの詳細を文書化し、共有することが効果的です。

5. **確認とフィードバックを徹底する**
作業が完了した際には、結果を確認し、フィードバックを行うことで、次回以降の改善につなげます。これは、特に新人やまだ経験の浅いメンバーにとって重要です。

6. **定期的なミーティングを開催する**
定期的なミーティングを開催し、進捗状況や問題点を共有することで、情報の共有と課題の早期発見が可能になります。この際、会議の目的や議題を事前に共有し、効率的な進行を心がけます。

7. **質問を奨励する文化を作る**
不明点があればすぐに質問できる環境を作ることが大切です。質問することが推奨される文化が根付けば、誤解や情報不足によるミスが減少します。

## まとめ
コミュニケーションの課題を解決するためには、具体的な指示の提供、作業ゴールのイメージ共有、期限と進捗報告の明示、文書化、確認とフィードバックの徹底、定期的なミーティング、質問を奨励する文化の構築が重要です。これらの方法を実践することで、情報伝達の精度が向上し、作業の効率化と品質向上につながります。

自分が作業報告する側の時も、タスクを振る側の時も、心地良いコミュニケーションができるように心掛けていきたいと思います。
何となく使っている"npm"ってなぁに？

# はじめに

多くの開発者が日常的に使用しているnpmですが、その仕組みや重要性を深く理解している人は意外と少ないのではないでしょうか。
私もそうです。

この記事では、調べて分かったnpmについてのいろいろを説明していきます。

# npmって？
npmはNode Package Managerの略称で、JavaScriptのパッケージ管理ツールです。
Node.jsのデフォルトパッケージマネージャーとして広く使用されています。

パッケージのインストールと管理、バージョン管理、そして依存関係の解決という割と重要めな役割を担っています。

# npmの歴史
npmは2010年にIsaac Z. Schlueterによって開発されました。

Node.jsの普及と共に急速に成長し、現在では世界最大のソフトウェアレジストリとなっています。
150万以上のパッケージが登録されており、その数は日々増加しています。

2020年にはMicrosoftがnpmを買収し、将来的にはGitHubとnpmの統合が進むと言われています。


# npmの基本的なところ
npmの基本機能は主に三つあります。
まず、パッケージのインストールです。

```bash
npm install <パッケージ名>
```

よく使うこれですね。

次に、package.jsonファイルの役割があります。
このファイルはプロジェクトの設定や依存関係を管理する重要なファイルで、`npm init`コマンドを実行することで生成されます。
`name`、`version`、`dependencies`、`devDependencies`、`scripts`などの主要な項目が含まれています。

あとは、依存関係の管理ですね。
いい感じに管理してくれます。


# npmを使うと何がうれしいか
まず考えられることはコードの再利用性でしょうか。
膨大な数のパッケージにアクセスできることで、コードの再利用性あります。

プロジェクトの再現性が高いのも大きな利点です。
`package.json`ファイルさえあれば、どの環境でも同じ開発環境を再現できます。

# npmの注意点
npmを使用する際には、いくつかの注意点があります。

npmに限った話ではありませんが、セキュリティリスクには当然留意する必要があります。
信頼できないパッケージを安易にインストしないように。

また、依存関係が複雑になりすぎると、いわゆる「依存地獄」に陥る可能性があります。
パッケージの品質管理も重要で、人気のあるパッケージでも品質にばらつきがあることを認識しておきましょう。

最後に、使用するパッケージのライセンスを確認することも忘れてはいけません。
オープンソースのライセンスには様々な種類があり、ライセンスによって扱い方がかなり変わってきます。

知らないうちにライセンス違反をしている方を見かけることも多々あるので、理解することは割と重要な気がします。


# さいごに
npmは単なるツールではなく、モダンなJavaScript開発の中心的存在です。
サーバーレス然り、最近のイケイケしてるモダンな開発では避けて通れません。

インターフェースは比較的単純で単に使うだけであればわりかし簡単にはじめられるので習得しておくとしあわせになれます。

この記事が誰かのお役に立てれば幸いです。

それでは。


# 参考
https://docs.npmjs.com/about-npm

https://www.zdnet.com/article/microsoft-buys-javascript-developer-platform-npm-plans-to-integrate-it-with-github/

https://github.blog/2020-03-16-npm-is-joining-github/

https://licenses.opensource.jp
アウトプットがいかに大変か思い知る

## はじめに
Qiita Engineer Festa 2024 に参加して
期間内１９記事投稿を達成しました(この記事を持ってする予定)
継続的なアウトプットを求められたわけですがぶち当たった壁と
やって良かったことを書き連ねます

## そもそも
私はこの企画を持って初めてQiitaでの記事投稿をしました
今までコーディングをしていく上で色々な方の記事を見てお世話になっていたので
初めて記事投稿をしたときは、自分の書いた文字が世界に発信されてしまっている！！
と高揚感と責任感をとてつもなく感じました

なぜ参加したかというとたまたまQiitaを見ていたらイベントのバナーに目が留まり
Qiitaのグッズ欲しいな〜という気持ちから始めました
その時は３８記事の投稿を目指していました

## 記事を書くってすごく時間取られる
１日に２記事くらい投稿できれば達成できるかな？と思っていたのですが
平日はお仕事をしているので帰宅してから書きたい内容を決めて
内容をまとめて記事を作成するまでがものすごく時間がかかる...

１記事投稿した時にこれを後３７記事も...？？と一瞬にして心が折れました

## ネタが切れる
毎日のように記事を投稿していると投稿したい内容がなくなってきました
記事に起こすにはそのことに関して自分のものにしておく必要があります
当たり前ですがインプットが大前提です
序盤はすでに知っていることを連ねたので比較的楽でしたが
後半は動画視聴してみた記事など正直インプット記事として
知識のつくものになっていなかったように思います

## はじめていいねがついた時は横転
そんなしょぼい記事を投稿していたのですが、初めて**いいね**がつく事件が起きました
内容は本当に大したことのない記事だったのですが
誰かが自分の記事を見て、**いいね**のボタンを押した...という事実だけで
とてつもない達成感に包まれました

自分も今後Qiita記事を参考にさせていただいた時は必ず**いいね**をしようと思います

## やっぱりやって良かった
自主学習が続かないことが多いかったので、今回１９投稿やり切れたこと達成感はもちろんですが
アウトプットはインプットが大前提なので普段なら調べない部分を読んでみたり
行動に移す良いきっかけになったと思っています
このイベントがなかったら読まなかった文章もたくさんありました

## 今後は
イベントは終わってしまうのですが、引き続き記事投稿は頑張りたいです
内容が薄いものばかりになってしまったのが心残りなので、
自分が納得のいく知識の詰まった記事投稿をしていきたいと思っています
Docker で "no space left on device" というエラーが出た時の備忘録

# Docker で "no space left on device" というエラーが出た時の備忘録

Dockerを使っていると、時々以下のようなエラーに遭遇することがあります。

```
failed to register layer: Error processing tar file(exit status 1): write ~~~~: no space left on device
```

このエラーは、エラーメッセージにある通り、ディスク容量が不足していることを示しています。この記事では、このエラーの原因と解決方法について解説します。

## エラーの原因と対策

### 容量を圧迫している原因

このエラーは、Dockerが使用するストレージが一杯になったときに発生します。Dockerはイメージ、コンテナ、ボリューム、ネットワークなどをキャッシュとして保持しており、これがディスク容量を圧迫します。

### 解決方法: docker system prune の実行

容量を確保するためには、不要なデータを削除する必要があります。そのために、`docker system prune` コマンドを実行します。このコマンドは、以下のものを削除します：

- 停止したすべてのコンテナ
- 少なくとも1つのコンテナで使用されていないすべてのネットワーク
- すべてのダングリングイメージ（使われていないイメージ）
- 未使用のビルドキャッシュ

```bash
docker system prune
```

このコマンドを実行すると、以下のような警告が表示されます。

```
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - unused build cache
Are you sure you want to continue? [y/N]
```

ここで `y` を入力して実行すると、不要なデータが削除され、ディスク容量が解放されます。

## まとめ

Dockerでの「no space left on device」エラーは、ディスク容量不足が原因です。`docker system prune` コマンドを使って不要なデータを削除することで、簡単に解決できます。この方法を使って、ディスク容量を確保し、スムーズなDockerの運用を続けてください。

## 参考記事

- [Docker Documentation](https://docs.docker.com/engine/reference/commandline/system_prune/)
記事投稿をしてみて感じたこと

## 記事投稿をしてみて感じたこと
技術に対する理解が浅かったり、他の人に説明できるような技術の習熟度を目指すために、記事投稿を始めました。記事を書くことで、復習にも利用でき、他の人の参考になればいいなと思ったのがきっかけです。

まだ投稿し始めて間もないですが、30記事ほど書いてみて感じたことをまとめます。

## アウトプットとしての技術記事投稿
技術記事を投稿することで、インプットも同時に行うことができると実感しました。特に感じたのは、アウトプットしようとすると自然と学習時間が増えることです。記事を書くために他の情報や元ネタを調べることで、自分の知識が深まりました。また、他の人の記事を読むことで新しい知見が広がり、自分の中で驚くべき変化を感じています。

## 学習時間の増加
アウトプットするためには、その前にしっかりと学習する必要があります。記事を書く際には、調べたり、理解を深めたりするために自然と学習時間が増えました。これにより、技術の理解がより深まったと感じています。

## 他の人の記事からの学び
他の人が書いた記事を読むことで、様々な視点やアプローチを知ることができました。自分が知らなかった技術や新しい方法を学ぶことで、自分の知識が広がり、視野が広がりました。

## 驚くべき変化
記事投稿を始めてみて、自分の中での変化に驚いています。学びが深まり、他の人の意見や方法を取り入れることで、自分の技術力が向上していると感じます。

## 他のエンジニアとの交流
まだ自分の会社以外のエンジニアとあまり交流していないのですが、記事投稿を通じて、たくさんの素晴らしいエンジニアがいることを感じます。他のエンジニアの記事を読むことで、その技術力や知識の深さに感心し、刺激を受けています。

## これからも続けていきたい
これからもアウトプットを続けていきたいと思います。記事投稿を通じて、自分の技術力を高めるだけでなく、他のエンジニアとの交流や情報共有を続けていきたいです。

記事投稿を始めて、学びの大切さや他の人とのつながりの重要性を実感しています。これからも日々の学びを大切にし、より良い技術者を目指していきたいです。
【React】useRefを使ってinputへの全角文字の入力を弾く

# はじめに
備忘録として記事にします。
より良い実装方法があれば指摘していただけると幸いです。

全角文字の入力を弾く目的として、任意のユーザーIDを作成してもらうときに半角のみ受け付けるといったことが挙げられます。

下記コードを編集することで、Webアプリ側で、使用できない文字（使用してほしくない文字）を打ち込めないようにすることも可能になります。

# コード
```validationCheck.ts
export const varidationCheck = (checkText: string) => {
  const regex = new RegExp(/^[0-9a-zA-Z]*$/);

  return regex.test(checkText)
}
```

```page.tsx
'use client';
import { useState } from 'react';
import { validationCheck } from './validationCheck';


const Page = () => {
  const inputRef = useRef<HTMLInputElement>(null);

  const handleChange=()=>{
    if(!inputRef.current) return;
    if(!validationCheck(inputRef.current.value)){
      inputRef.current.value = inputRef.current.value.slice(0, -1);
    }
  }

  return (
    <div>
     <input ref={inputRef} onChange={handleChange}/>
    </div>
  );
};

export default Page;
```

# 説明
validationCheck.tsで使用できる文字の正規表現を作成しておき、渡された文字列が正規表現を守れているか（正しい表現ではないかもしれません。）確認しています。
返り値はbooleanです。

page.tsxのhandleCheck関数でvalidationCheckを呼び出し、input要素に変更があるたびに全角文字の入力がないか確認します。
全角文字の入力があった場合、validationCheckからfalseが返ってきます。
その時には、inputRef.current.valueに最後の文字を除いた文字列を代入することで全角文字の入力を弾くことを行っています。
記事用のコード画像を作りたい

## はじめに

「記事用のコード画像を作りたい」
上記を叶えるVSCodeの拡張機能の紹介をします

## Polacode

https://marketplace.visualstudio.com/items?itemName=pnp.polacode

![スクリーンショット 2024-07-16 23.57.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812987/08c90e82-7995-d5d9-fb91-4c98f83d7ad8.png)

 ## 使用例

 
- 拡張機能をインストール
-  `⌘ + shift + P` から Polacodeを選択

![スクリーンショット 2024-07-17 0.01.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812987/be2232e1-d387-248f-7d98-b71f927d1a15.png)

- 画像にしたいコードをplaygroundにペースト


![code.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812987/48eb8d80-da29-78e2-6741-75a1cf70343e.png)

- アイコンクリックで上記のようなアウトプットを得ることができます

## さいごに
正直マークダウン方式の記事ばかり書いていたので下記の形で良いだろと思っていましたが
```c
 console.log("Hello World!");
```
見栄えは良いのでPDFでの資料とかに使えそうです。
注意点としては当たり前ですが画像なのでコードのコピーは容易ではなく写経になってしまいます。
Selfhostedなサイトにログインできない時はCookieを確認しろ

### 目次
- はじめに
- トラブル
- 解決方法
- 余談

## はじめに
自分でセルフホストしているサイトにログイン/アクセスできなくなった時の対処。

## トラブル
今まではNextcloudなどのホストに対してTailscaleを用いて直接アクセスしていました。しかし、Proxmoxの導入に際してさまざまコンテナが乱立し、それぞれがTailscaleのアドレスを持つと管理が煩雑になります。そこで、一つの踏み台サーバーからNginxを用いたreverse proxyで他のホストにアクセスすることで踏み台サーバーのアドレスのみを覚えるだけで済ませることにする計画でした。
Nginxの設定を済ませ、アクセスしようとするとログイン画面でスタックするなどいくつかの問題が発生。

## 解決方法
ブラウザのCookieを削除する。これだけです。
どうやら、直接アクセスしていた際のCookieがログインを妨げていたようでした。

## 余談
最初にこのトラブルに遭遇した際はnginxやnextcloud側の設定かと思い3日程度格闘していました。ブラウザを変えることでとりあえずアクセスできるようになったものの、根本的な解決には至らず。拡張機能の削除などいろいろ試して最終的にCookieに辿り着くまで一週間かかりました。
良いサービスを作ろう！！

## はじめに

受託開発の現場では、納期や予算が重要な要素となります。しかし、その中でも私は「良いサービスが作れるか？」を考えています。ここでは技術的にどのような設計するかではなく、気持ちや姿勢として、こうあるべきっていう内容を記事にしています。

### サービスを良くするための工夫
作成するアプリケーションの競合サービスがどのようなユーザーインターフェース（UI）で設計されているのか、どのような機能が提供されているのか調査したり。そして、それらを基にサービスをどう改良するか、どんな新しい価値を提供できるかを考えます。

### 限られた予算と納期の中での挑戦
もちろん、受託開発では予算や納期が限られているため、全てのアイデアを実現することは難しい場合もあります。しかし、その制約の中でできる最大限の工夫を凝らすことが重要です。例えば、ユーザーが本当に必要としている機能を見極め、それを優先的に開発することで、限られたリソースを有効に活用することができます。

### エンジニアとしての姿勢
エンジニアとしてのレベルがどうであれ、良くしたいと思う気持ちが大事だと思います。どんなに経験が浅くても、「もっと良くしたい」という熱意があれば、それがサービスの質向上につながります。新しいアイデアや改善点を見つけることは、エンジニアとしての成長にもつながります。

### お客様との信頼関係を築く
良いサービスを提供することは、お客様からの評価を高めることにつながります。良い評価を得ることで、保守作業や新たな開発案件を任せてもらえる機会も増えるでしょう。これは、受託開発者としての成長にもつながります。

### 納期だけが全てではない
確かに、受託開発では納期が最優先となることが多いです。しかし、それだけに囚われてしまうと、本質的に良いサービスを作ることができません。納期を守ることはもちろん大切ですが、それと同じくらい重要なのは、ユーザーにとって価値のあるサービスを提供することです。

### 本質的に良いサービスを作るために
- ユーザー視点を忘れない：常にユーザーが何を求めているかを考え、彼らのニーズに応えるサービスを作る。
- 競合分析を怠らない：他のサービスを研究し、それよりも優れた点を見つけ出す。
- 限られたリソースを最大限に活用する：重要な機能に焦点を当て、優先順位をつけて開発を進める。
- お客様とのコミュニケーションを大切にする：フィードバックを積極的に取り入れ、改善を続ける。
- 改善への情熱を持つ：エンジニアとしての経験に関わらず、サービスを良くしたいという気持ちを持ち続ける。

## まとめ
本質的に良いサービスを作ることは簡単ではありません。しかし、納期や予算の制約がある中でも、ユーザーにとって価値のあるサービスを提供することを目指していきたいと思います。そうすることで、お客様からの信頼を得て、さらなる成長の機会を掴むことができると信じています。

「本質的に良いサービスを作ろう！！」という気持ちを胸に、これからも受託開発に取り組んでいきたいと思います。
（MDN）画像の切り替え

お疲れ様です。

今日はMDNというサイトの中にある、「Javascriptの基本」というページにて、Javascriptの初歩について勉強していました。
その中にあった、画像を切り替えるという項目を実践してみました。
切り替えると言ってもイベントを使っての切り替えです。

![161.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/406c8db8-32d0-a51d-59aa-495c66d4105e.png)
![162.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/3c1015c8-efdd-24ec-392b-cc78ab030cfa.png)
![163.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/214d989a-4057-e2ab-079e-79c810a3e533.png)

**getAttribute**…指定された要素の属性の値を返す
**setAttribute**…指定された要素の属性の値を設定する。すでに設定されている場合は更新される。
<br>
1枚目が切り替え前の画像で、マウスを画像に重ねると2枚目に切り替えられるというコードです。
ここのイベント内容はクリックでも可能です。

そして今回コードを書き終えた後、コメントアウトをコード内容を復習しながら自分で書き起こしました。
「1冊ですべて身につく～」の本にもありましたが、コードが長くなりそうな時や複雑になりそうな時は、まず日本語にして整理してから書いてみるとよいとのことでした。今回はこのコードは何をしているのかを読んで、内容を復習しながら書いてみましたが、自分の言葉で書いてみるのは、なかなかいい復習だなと思いました。

一度コードを書いて、結果思い通りになったとしたら、次に進んだりしがちなのですが、このコードでは何をしているのかを見返すいいきっかけになったと思います。
考え方の訓練にもなると思うので、続けていこうと思います。
【Next.js】Local ImagesとRemote Imagesの違い

## Local Images

`.jpg`, `.png`, `.webp`のいずれかのファイルを`import`します。

```jsx
import Image from 'next/image'
import profilePic from './me.png'
 
export default function Page() {
  return (
    <Image
      src={profilePic}
      alt="Picture of the author"
    />
  )
}

```

上記の方法で `src` を記述すると画像の `width`と `height` は自動的に決定されます。
また、`blurDataURL` も自動で設定され、 `placeholder` を `blur` に設定するだけでプレースホルダーが表示されるようになります。

以下は `placeholder`　を　`blur`に設定した場合のデモページです。

https://image-component.nextjs.gallery/placeholder

## Remote Images

`src`にURL文字列を記述します。

```jsx
import Image from 'next/image'
 
export default function Page() {
  return (
    <Image
      src="https://s3.amazonaws.com/my-bucket/profile.png"
      alt="Picture of the author"
      width={500}
      height={500}
    />
  )
}

```

Local Images とは異なり、 `width` や `height` は自動計算されないため、必ず指定する必要があります。
また、 `placeholder`　を `blur` に設定する場合には `blurDataURL`　を指定しなければなりません。

外部画像を使用するには `next.config.js` に `remotePaterns`　を追記する必要もあります。

```js:next.config.js
module.exports = {
  images: {
    remotePatterns: [
      {
        protocol: 'https',
        hostname: 'example.com',
        port: '',
        pathname: '/account123/**',
      },
    ],
  },
}

```

https://nextjs.org/docs/app/building-your-application/optimizing/images
Dockerを使ってWordPressのローカル環境を構築して、ファイルのアップロード上限を1GBにする手順


今回の記事では、Dockerを使ってWordPressのローカル環境を構築して、ファイルのアップロード上限を1GBにする手順を解説します。

手順は以下の通りです。

1、ディレクトリを作成 mkdir wordpress_test
2、php.iniを作成
3、Dockerfileを作成
4、docker-compose.ymlを作成
5、docker-compose up -d

順番に解説していきます。

## ディレクトリを作成

まず、ディレクトリを作成します。今回はwordpress_testというディレクトリを作成しています。
```
mkdir wordpress_test
```

## php.iniを作成

先ほど作成したディレクトリの中にphp.iniを作成し、中身を以下のように編集します。

```php.ini
upload_max_filesize = 1G
post_max_size = 1G
```

php.iniを作成する理由はファイルのアップロード上限を1GBに変更するためです。

## Dockerfileを作成

Dockerfileを作成したら以下のように中身を変更します。

```Dockerfile
FROM wordpress:php7.4

# 必要なパッケージをインストール
RUN apt-get update && apt-get install -y \
    rsync \
    && rm -rf /var/lib/apt/lists/*

# WordPressのバージョンを指定してダウンロード
RUN curl -o /usr/src/wordpress.tar.gz https://wordpress.org/wordpress-6.5.tar.gz && \
    tar -xzf /usr/src/wordpress.tar.gz -C /usr/src/ && \
    rm /usr/src/wordpress.tar.gz && \
    rsync -av --ignore-existing /usr/src/wordpress/ /var/www/html/

# カスタム php.ini を適用
COPY php.ini /usr/local/etc/php/
```

## docker-compose.ymlを作成

次は、docker-compose.ymlを作成して中身を以下のようにしてください。

```docker-compose.yml
version: '3.8'

services:
  wordpress:
    build:
      context: .
    container_name: wordpress
    ports:
      - "8000:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - ./wordpress_data:/var/www/html
    depends_on:
      - db

  db:
    image: mysql:5.7
    container_name: db
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
      MYSQL_ROOT_PASSWORD: rootpassword
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:
```

## docker-compose up -d

ターミナルで以下のコマンドを実行します。
```
docker compose up -d
```
http://localhost:8000 にアクセスするとWordPressの初期画面が表示されるはずです。

今回の実装のGithubのリポジトリはこちらです。

https://github.com/masakiwakabayashi/wordpress_docker_template
pnpmでnpm-scriptのpost,preプレフィックスが使えなかった話

# pnpmでnpm-scriptのpost,preプレフィックスが使えなかった話

私は業務でバックエンドにnestjs、フロントエンドにnextjsを使って業務を行っています。それでバックエンドのパッケージマネージャはpnpm、フロントはbunを使用しています。

## npm-scriptのpost,preプレフィックスについて

皆さんはnpm-scriptのpost,preプレフィックスを知っているでしょうか？簡単に説明すると、npm-scriptには特定のスクリプトの前後に自動的に実行されるスクリプトを定義することができます。例えば、`predev`は`dev`スクリプトの前に実行され、`postdev`は`dev`スクリプトの後に実行されます。

### 具体例

例えば、フロントエンドで以下のように設定していたスクリプトがあります。

```json
"scripts": {
  "dev": "next dev -p 3000",
  "predev": "format"
}
```

これは、`dev`スクリプトを実行する前に`format`スクリプトが実行されることを意味します。しかし、これをバックエンドに持ってきた際に問題が発生しました。

## pnpmでの問題点

バックエンドでも同様に設定を行ったのですが、`predev`スクリプトがきちんと動作してくれませんでした。調査した結果、以下の理由が判明しました。

### 理由

pnpm v6.0.0では、Pre/Postスクリプトの自動実行が無効化されています。これは、npm-scriptが複雑化してしまうことを避けるための措置のようです。

参考記事: [pnpm Issue #2891](https://github.com/pnpm/pnpm/issues/2891)

### 解決策

この問題を解決するためには、`.npmrc`に以下の設定を追加する必要があります。

```ini
enable-pre-post-scripts=true
```

これにより、pnpmの動作がv6.0.0以前の挙動に戻り、Pre/Postスクリプトが自動的に実行されるようになります。

## まとめ

今回のケースでは、pnpm v6.0.0の仕様変更によって、npm-scriptのPre/Postスクリプトが動作しないという問題が発生しました。しかし、`.npmrc`に設定を追加することでこの問題を解決できました。皆さんも同様の問題に遭遇した際には、この記事を参考にして設定を見直してみてください。

## 参考記事

- [pnpm Issue #2891](https://github.com/pnpm/pnpm/issues/2891)
Python Pandas Plotly Steramlitによる可視化

# PythonによるBIツールの提案

ある一定の間隔で蓄積された時系列データ（CSV）を読み込み、
なんやかんやして動的グラフ（積み上げ棒グラフ）を作成します。
また、学習コストの低さから後述するライブラリを試用してみました。

---

### 環境
- Windows10：WSL2：Linux（Ubuntu-24.04）
- Python：3.12
- ライブラリ
    - Pandas
    - Plotly
    - Streamlit
---
### 手順
1. CSVデータの読み込み
2. データの読み込み
3. 1か月分ごとの合計を算出
4. データを年と月に分割
5. プルダウンメニューで表示する列を選択
6. データを整形
7. Plotly Expressでアニメーショングラフを作成
8. Streamlitでグラフを表示
---


### ソースコード
~~~python:
import streamlit as st
import pandas as pd
import plotly.express as px

# CSVファイルのパスを指定
csv_path = "file.csv"

# 1. CSVデータの読み込み
@st.cache_data
def load_data():
    try:
        df = pd.read_csv(
            csv_path, 
            header=None,    
            skiprows=4      
            )
        df['datetime'] = pd.to_datetime(df.iloc[:, 0])  
        df.set_index('datetime', inplace=True)          
        return df
    except FileNotFoundError:
        st.error(f"CSVファイルが見つかりません: {csv_path}")
        return None

# 2. データの読み込み
df = load_data()

st.title('Python BI Tool')
st.write('データファイル名')
st.write('バージョン情報')

if df is not None:
    # 3. 1か月分ごとの合計を算出
    monthly_sum = df.resample('ME').sum()

    # 4. データを年と月に分割
    monthly_sum.reset_index(inplace=True)
    monthly_sum['Year'] = monthly_sum['datetime'].dt.year
    monthly_sum['Month'] = monthly_sum['datetime'].dt.strftime('%B')

    # 5. プルダウンメニューで表示する列を選択
    columns = monthly_sum.columns[2:-2].tolist()  # datetime, Year, Month列を除外
    selected_columns = st.multiselect(
        '表示する分類を選択してください', 
        columns, 
        default=columns[1:10]  # デフォルト選択（適宜調整）
        )

    # 6. データを整形
    melted_df = monthly_sum.melt(
        id_vars=['Year', 'Month'], 
        value_vars=selected_columns, 
        var_name='Category', 
        value_name='Value')

    # 7. Plotly Expressでアニメーショングラフを作成
    fig = px.bar(melted_df, 
                 x='Month', 
                 y='Value', 
                 color='Category',
                 animation_frame='Year',
                 labels={'Value': '合計', 'Month': '月'},
                 title='年別・月別合計')

    # 月の順序を設定
    month_order = [
        'January', 'February', 'March', 'April', 'May', 'June', 
        'July', 'August', 'September', 'October', 'November', 'December'
        ]
    fig.update_xaxes(categoryorder='array', categoryarray=month_order)

    # 8.Streamlitでグラフを表示
    st.plotly_chart(fig)
else:
    st.warning("データが読み込めませんでした。CSVファイルの場所を確認してください。")
~~~

## おわりに

自身が持っていたCSVデータは綺麗に構造化されたデータだったので扱うのが簡単でした。
Plotlyではもっと有効な動的グラフを作成できるはずなので機能拡張したものも考えています。

---


#### 今後の展望
---

- Streamlit
    - 複数のグラフを同時に表示し、スライダーによって全てのグラフ操作
    - 何かしらのUIで表示カラムの変更
    - 表示書式（グラフの種類）の変更機能
- Plotly
    - 円グラフ
    - 散布図
    - その他諸々のグラフ実装

などなど出来るかどうかも分からないものを含めて色んな機能を実装してみたいと思っています。
**実用性は考えていません**

---
悩んで解決したときの喜びがAIによって失われた気がする

## はじめに
最近ChatGPT筆頭にAIが出てきて、ググるよりAIに聞くという形が多くなったりしてきて、思うことがあったので記載します。

## 悩んで解決したときの喜びがAIによって失われた気がする
2021年、私はIT業界に飛び込みました。初学者として、毎日が新しい発見と挑戦の連続でした。わからないことが多すぎて、一日中悩むこともありました。ググってもなかなか解決しないときは、焦りや不安に駆られることも。

でも、その中にも喜びがありました。1日、2日、時にはもっと長く悩んで、ようやく答えを見つけたときのあの感覚。達成感というか快感のような、あのなんとも言えない気持ち良さを感じてました。夜に悩んで、夢の中でふと思いつく解決策。散歩中にひらめいたりする瞬間とかね。

しかし、最近はAIが発達してきて、その風景が少し変わってきました。わからないことがあっても、AIに聞けばすぐに答えが返ってくる。確かに便利だし、時間の節約にはなります。でも、あの悩み抜いてようやく解決したときの喜びは、少し薄れてしまった気がします。

今の子供達は公園で集まってPSPでモンハンやらないんだよな〜とか、ガラケーの時のメールが待ち遠しくて受信ボタン押したりとか。。ちょっと違う気もするけど。笑

悩みながらも成長していく過程は、今でも大切にしたいと思っています。AIのおかげで解決が早くなったことは嬉しい反面、昔のようにじっくりと考える時間が減ったのは少し寂しいです。

悩む時間も、成長の一部として大切にしていきたいと思います。
EC2環境でmjs拡張子が読み込めない

## はじめに
有効な記事を見つけるのに少し苦労したので、どなたかの助けになれば幸いです。

# 前提と経緯
reactにreact-pdf（v9.0.0）をインストールしている状態です。
ビルドツールはviteを利用しています。
下記の公式リファレンスをもとに、pdfjsを用いてpdfを表示させようとしていました。

https://www.npmjs.com/package/react-pdf#:~:text=Configure%20PDF.js%20worker

# エラー
npm run buildで生成されたものをEC2環境に入れたところ、コンソールにエラーが出力しました。

```
Failed to load module script: 
Expected a JavaScript module script but the server responded with a MIME type of "text/plain".
Strict MIME type checking is enforced for module scripts per HTML spec.
```

1文目から、jsファイルの何かが悪さをしている・・？と仮説が立ちました。

# 結論

pdfjsのファイルパスを設定する箇所で、mjsという拡張子のファイルパス(npm run build)を指定していることが原因でした。
publicフォルダ中にある、.htaccessファイルに下記を追加することで改善しました。

``` ruby:.htaccess
<IfModule mod_mime.c>
  AddType text/javascript mjs
</IfModule>
```
参考：https://stackoverflow.com/questions/77473744/pdf-js-library-not-able-to-import-due-to-disallowed-mime-type

### 補足

上記htaccessの設定で、mjs拡張子がtext/javascriptのふるまいをするように設定を上書きするようです。

https://qiita.com/shotets/items/cf0783530a1f2809c4d5#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E6%8B%A1%E5%BC%B5%E5%AD%90%E3%81%AE%E6%8C%AF%E3%82%8B%E8%88%9E%E3%81%84%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B:~:text=DirectoryIndex%20index.html-,%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%EF%BC%88%E6%8B%A1%E5%BC%B5%E5%AD%90%EF%BC%89%E3%81%AE%E6%8C%AF%E3%82%8B%E8%88%9E%E3%81%84%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B,-%E6%8B%A1%E5%BC%B5%E5%AD%90%E3%81%AE
VSCodeのインデントを虹色にしたいんだ！

## はじめに
「VSCodeのインデントを虹色にしたいんだ！」
上記を叶えるVSCodeの拡張機能の紹介をします

## indent-rainbow

https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow

![スクリーンショット 2024-07-16 23.34.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812987/45758f76-b50c-956c-d585-fb1d4e1a0f30.png)

## 使用例

インストールするだけでこんなカラフルになります。

![スクリーンショット 2024-07-16 23.36.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812987/7e943e06-c99f-ef78-5ad2-434e967a38f2.png)

`setting.json`に色の詳細を指定することもできるので自分好みに変更するのもありです

```json
    "indentRainbow.colors": [
        "rgba(255,255,64,0.3)",
        "rgba(127,255,127,0.3)",
        "rgba(255,127,255,0.3)",
        "rgba(79,236,236,0.3)"
    ]
```

上記の結果は以下

![スクリーンショット 2024-07-16 23.39.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812987/2f7e08af-0475-daa5-73f7-f05437c7aacd.png)

## さいごに
短い人生の中でVSCodeを見ている時間はどれくらいあるんでしょうか
少しでも楽しいコーディングをするのに導入してみてはいかがでしょうか
単純にどこがずれているのか分かり易い利点もあります！

~~ちなみに自分は社内のフリーウェアの申請を上長が出していたので安心してインストールしました！~~
スケジュールの立て方

# はじめに
個人のタスクのスケジュールを立てるときの考え方、方法について記載していく。
 
※リーダーが案件全体のスケジュールを立てるときも基本的には同様の考え方と思われるが、案件全体のスケジュールの場合はもっと考慮すべき点があるため、基本的には個人のスケジュールの立て方に絞って以下に記載していく。 

# [追記]一番重要なこと
※スケジュールを立てる上で一番大事なことを記載していなかったので、一番最初に加筆します。

スケジュールをパンパンになるまでタスクを入れないこと。
要求されたタスクは、得てして明確なものばかりではありません。

調査対応や検討事項などもあり、
結果次第では元々のスケジュールにハマらないということもよくあります。

リスケすれば良いでしょ、という考え方もありますが、
最初からバッファ込みでスケジューリングしましょう。
パンパンに詰め込んで、苦労するのは自分です🔥
 
# タスクの明確化 
対応するタスクの目的、内容を明確化する。
開発であれば、作成する機能や難易度により開発期間は前後するため、要件や非機能要件などを明確化する必要がある。

この過程で、Input/Outputを明確にすべき 
　で、Inputの提供が遅れたその分だけスケジュールは遅れることを予め関係者とネゴっておく 

:::note info
もしスケジュールを立てる段階で要件が明確化していない状態であれば、必ず要件が確定した段階で再度リスケジュールすることを前提とする。 

つまり、スケジュールを再度引くことをリーダーなどにあらかじめネゴっておこうね、ということ
まあ得てして最初の概算見積もりが一人歩きするんだけどね🔥
:::
 
# 期日の明確化 
期日を明確化する。
その上で
・期日は必ず守る必要があるのか？
・それとも要件が明確化した段階でリスケジュールし、期日を後ろにずらしたり調整可能か？
も明確にする。 

また、逆算して、期日までにどういうサブタスクをこなし、どういう関係者と連携していく必要があるか考える。
 
# タスクの前提条件と目的達成条件の明確化 
目的を達成するために、どんな前提条件が必要か検討する。 

また、目的達成条件として何をどの範囲まで、どの程度まで対応する必要があるのか明確にする、ということ。

この明確化は、自分一人で決めることが出来れば良いが、多くの場合はリーダーなど自分より上の人に確認が必要になると思う。

この判断が難しい場合は、とにかく周りに聞くこと。不明瞭な状態でタスクを進めると確実に失敗します😨

 
# タスクの明確化 
目的を達成し、期日を守るためには何が必要かを逆算して考える。 

また、要件を満たすためにどんなサブタスクが必要なのか考える（タスクの粒度が細かくなれなるほど精度は高くなるはず）。 

そして、"クリティカルパス"　を把握し、開発中の進捗に影響の出るタスクに対して特に注視する必要がある。 
（クリティカルパス=プロジェクトを進めていく上でスケジュールに影響が出る作業経路） 
 
# 利害関係者の洗い出し 
登場する利害関係者が増えるほど、スケジュール調整が必要となりより長い期間が必要になってくるため、スケジュールを立てる際に洗い出す。 
 
# 連携する機能、システム 
他社、もしくは他担当者が開発する範囲で、自分（もしくは自社）が開発する機能にどう影響するかを把握する。 

システム内の機能の連携、他のシステムとの連携が発生する場合、各機能の担当者間で意思疎通のための打ち合わせが必要となる。また、連携先のシステムでも改修が発生する場合は足並みを揃えてリリースしなければならないため、その影響は大きい。 

例） 
　サーバ側のAPI修正が必要で、自分が担当するアプリ修正に影響が出るとする。 
　　→サーバ側のAPI修正のスケジュールも意識する必要がある。 
　　→関係するPhase（テスト担当者、デザイナーやディレクターによる受け入れ、
  　　　総合試験、顧客のレビューなどなど）によっていつまでに実施する必要があるのかを理解し、
     　　　逆算することで自分のタスクをいつまでに実施する必要があるのかが分かる。 
 
その上で、作業量と見合わせてスケジュール通りにこなせるのか？無理やりスケジュールに当てはめていないか考える。無理なスケジュールを立てても自分が苦しむだけだが、顧客に説明を求められたときにある程度説明できる程度の範囲で自分が苦しまないスケジュールを立てる。 
 
 
# 開発中のトラブル対応
最初に立てた理想通りのスケジュール通りに事が進めば良いが、自分のタスクの一部であるコーディング作業が思いのほか重かったり、他担当者の遅延の影響で自分の作業が止まる、他担当者のチェックが漏れており終盤でチェックしたら重大な仕様の考慮漏れがあった、とか、、 

こういう場合は、以下順序で検討していく
・まずは自分だけで対処可能なのか？
・自分だけで無理であればチーム内のメンバーを巻き込んで対処可能か？
・上記が無理そうであれば、スケジュールが調整可能か検討すべき 

:::note warn
スケジュールに入れたタスクを明確化しないと何が起きるのか、、、 
・スケジュールの精度が落ちる 
　→実際のブレが生じやすくなり、不測の事態がおきやすくなる 
・やるべきタスクの見落としが発生する可能性が高くなる 
　→特に他担当者が実施するタスクが、実は自分が実施する必要があるタスクだったりとか、、 
:::

例） 
　ある機能の開発に3日かかるというスケジュールを立てたとする 
この期間内に対応完了して顧客に報告し、３日目に顧客側で受入試験を実施しクレームが入る。遅延が発生していると言われたがよくよく顧客にヒアリングしたところ、顧客側は顧客受入試験も完了しバグ0の状態が３日という想定だ、という。 
 
　上記例だと結果的に以下のような齟齬があったことになる 
　・開発側：開発側での実装・単体試験・結合試験 
　・顧客側：生産・製造リードタイム（実装から顧客受入試験を経てバグ0の状態とする） 
 
　これで顧客から怒鳴られることもあるため、立てたスケジュールがどういう前提でたてられているのかを明確化する。
C_TS452_2021 - SAP Certified Application Associate - SAP S/4HANA Sourcing and Procurement対策（12/100）

【12日目】
トピック2：供給元（1/8）

≪問題12≫
購買発注を登録する必要があります。品目と仕入先の購買情報はあります。購買情報から価格を決定するためにシステムではどのようなロジックが使用されますか。
（２つ選択）
□利用可能な場合は、有効なプラント別価格が常に提案される。
□利用可能な場合は、前回の購買発注から価格が常に提案される。
□有効な条件がない場合、前回の購買発注（利用可能な場合）から価格を提案できる。
□利用可能な場合は、購買組織レベルで保存された価格が常に提案される。

≪解答≫
■利用可能な場合は、有効なプラント別価格が常に提案される。
□利用可能な場合は、前回の購買発注から価格が常に提案される。
■有効な条件がない場合、前回の購買発注（利用可能な場合）から価格を提案できる。
□利用可能な場合は、購買組織レベルで保存された価格が常に提案される。

≪解説≫
◆購買伝票を登録する際に、システムは調達対象品目の価格を検索いたします。検索は常に「具体的なもの」から「一般的なもの」へと行われます。手順は以下の通りです。
（1）購買発注の登録時に、購買組織レベルやプラントレベルで仕入先と品目の組合せの購買情報が検索されます。
（2）購買組織やプラントの組合せの具体的なデータがない場合、購買組織レベルで検索されます。
（3）このレベルでもデータがない場合、価格を手動で入力する必要があります。
◆購買情報がある場合、価格決定時に有効な条件が優先されます。購買情報に条件がない場合や無効な条件しかない場合は、購買情報の前回の購買伝票番号が読み込まれ、その伝票の価格が提示されます。この方法で設定された価格は初期値となりますが、必要に応じて変更することが可能です。
AzurePipelines: deployment 結果の確認

# 背景

以下の対策として、deployment log の最終 message を確認するようにしてみた記録

https://qiita.com/baku2san/items/d04c731e08aa81cb0726

そんなもんイランやろ、というのが本筋

# 概要

- <code> az webapp log deployment</code> を使うことで、デプロイセンターのログが取れる
- 最終的な message で <code>successful</code> となってれば、成功してそう

ということで、pipelines にて、それを確認しとくかって話。

https://learn.microsoft.com/ja-jp/cli/azure/webapp/log/deployment?view=azure-cli-latest#az-webapp-log-deployment-show


```yaml: deployment log
 - task: AzureCLI@2
    displayName: 'Deployment log is Successed?'
    inputs:
      azureSubscription: '{Survice Connection}'
      scriptType: 'bash'
      scriptLocation: 'inlineScript'
      inlineScript: |
        set -e
        # 環境変数取得
        env_vars=$(azd env get-values --output json)
        # Resource Group Name
        rg_group=$(echo $env_vars | jq -r '.AZURE_RESOURCE_GROUP')
        # Extract App Service Endpoint URI
        backend_uri=$(echo $env_vars | jq -r '.BACKEND_URI')
        # Extract App Service Name
        if [[ $backend_uri =~ https://([^\.]+)\.azurewebsites\.net ]]; then
            host_name=${BASH_REMATCH[1]}
        else
            exit 1
        fi

        # Extract the final message
        message=$(az webapp log deployment show --resource-group $rg_group --name $host_name --query "[].{time: log_time, message: message}" | jq -r 'sort_by(.time) | last(.[]).message')
        if echo "$message" | grep -i "successful"; then
            echo "Succeeded!"
        else
            exit 1
        fi
    timeoutInMinutes: 5
    env:
      AZURE_SUBSCRIPTION_ID: $(AZURE_SUBSCRIPTION_ID)
      AZURE_ENV_NAME: $(AZURE_ENV_NAME)
      AZURE_LOCATION: $(AZURE_LOCATION)
```

# 問題点

これだと、deploy 自体は error 扱いのまま。
condition: 指定したり、continueOnError を指定したとしても・・

Partialy Succeed となって、正常成功時とは若干違う結果が通知されてくるのが困る・・


他に、show だと、最終のlog 取れないこともあったので、
実際には、list で最新ログを取得して、deployment_id を元に取得しないとあかんかも？

https://learn.microsoft.com/ja-jp/cli/azure/webapp/log/deployment?view=azure-cli-latest#az-webapp-log-deployment-list


# あとがき

ん－む、もう諦めるしかないですかね・・ :sweat_smile:
【合格体験記】SecuriST 認定ネットワーク脆弱性診断士試験

## はじめに
　2024年7月16日に、グローバルセキュリティエキスパート株式会社（GSX） の [SecuriST 認定ネットワーク脆弱性診断士試験](https://cbt-s.com/examinee/examination/securist.html)に合格しました。どういう問題が出るのか、どう対策すればよいのか、とにもかくにも情報が少ない試験で困ったので、今後受ける予定のある方に向けて合格体験記を書きます。

## 筆者のプロフィール
- 社会人5年目27歳
- ユーザー企業のセキュリティ部門に所属
- 脆弱性診断業務に携わって2年目
    - といっても手を動かしているのではなく業者に委託した診断結果を評価する仕事
    - ツール診断をかけるところを見学したことがある程度
- これまでに合格した当試験に関連する試験
    - 情報処理安全確保支援士試験
    - ネットワークスペシャリスト試験
    - LinuCレベル1

## 受験したきっかけ
　一年前に会社のお金で公式トレーニングを受講しましたが、試験のバウチャーを使っておらず、バウチャーの期限ギリギリに気づいて腹を括りました。

## 学習期間
　一ヶ月間、やったりやらなかったりでのんびり学習しました。途中仕事が忙しくなったり、長期の旅行に行ったりしたので、がっつり時間を取ることはありませんでした。

## やったこと
　まずは公式トレーニングのパワポを最初から最後まで見返しました。一年前に受けた研修だったのでほとんど覚えていませんでした。研修のときに貸与された環境はもう使えないため、動きを確認できないツールもありましたが、気にせず進めました。たまたまKali Linuxの仮想環境が自分のPCの中に入っていたので、たまに使えるツールもありました。ちなみにkali Linuxの環境構築は[こちら](https://booth.pm/ja/items/4337301)の本を参考にやりました。(まだ環境構築のみで読了していませんw)

　次に公式の試験範囲である[脆弱性診断士（プラットフォーム）スキルマップ＆シラバス](https://github.com/OWASP/www-chapter-japan/tree/master/skillmap_project#%E8%84%86%E5%BC%B1%E6%80%A7%E8%A8%BA%E6%96%AD%E5%A3%AB%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%B9%E3%82%AD%E3%83%AB%E3%83%9E%E3%83%83%E3%83%97%E3%82%B7%E3%83%A9%E3%83%90%E3%82%B9)に書いてある用語を上から下まで全てチェックしました。いまいち自分の言葉で説明できない用語は[マスタリングTCP/IP―入門編―](https://www.amazon.co.jp/%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0TCP-IP%E2%80%95%E5%85%A5%E9%96%80%E7%B7%A8%E2%80%95-%E7%AC%AC6%E7%89%88-%E4%BA%95%E4%B8%8A-%E7%9B%B4%E4%B9%9F/dp/4274224473)と[情報処理安全確保支援士重点対策](https://www.amazon.co.jp/2024-%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E5%AE%89%E5%85%A8%E7%A2%BA%E4%BF%9D%E6%94%AF%E6%8F%B4%E5%A3%AB%E3%80%8C%E5%B0%82%E9%96%80%E7%9F%A5%E8%AD%98%EF%BC%8B%E5%8D%88%E5%BE%8C%E5%95%8F%E9%A1%8C%E3%80%8D%E3%81%AE%E9%87%8D%E7%82%B9%E5%AF%BE%E7%AD%96-%E4%B8%89%E5%A5%BD%E5%BA%B7%E4%B9%8B/dp/4865753176)で確認し、本に載っていないことはネットで調べてノートにまとめました。「よく使われるサービス」は[zennスクラップ](https://zenn.dev/chiiirotty/scraps/565b5e87b8e0a5)にまとめたのでぜひ参考にしてください。他の分野も全体的にこの粒度で勉強しました。

## 結果
**76.6％で合格**でした！7割以上なので結構ギリギリですね。(「関連法令」の正答率が0％なのは見逃してください汗)
![スクリーンショット 2024-07-16 23.11.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958610/c71f49d4-c020-fe98-1b5f-3acfdcea45b6.png)

## 所感
　ギリギリで合格しておいてなんですが、**思っていたより簡単**でした。過去問などの情報がなかったことと、「脆弱性診断士（プラットフォーム）スキルマップ＆シラバス」が手を動かして診断をした経験なしにはわからないような内容も多かったことで、受験前はかなりハードルが高く感じていたためです。
 
　しかし蓋を開けてみると、重箱の角を突くような問題は出ず、問題自体はかなり素直なものでした。その場で考えさせる問題も少なく、知っていれば解ける、知らなければ解けないという感じです。情報処理安全確保支援士試験で勉強した内容と、まがりなりにも脆弱性診断に仕事で関わっている経験に助けられました。勉強の粒度は私の[zennスクラップ](https://zenn.dev/chiiirotty/scraps/565b5e87b8e0a5)程度で十分でした。
 
　試験時間もゆっくりやって一周目は25分、2・3周目は残り13分で終わったので、余裕がありました。ただ、「でないものを選べ」「複数選べ」「n個選べ」など、引っかかりそうな設問が多いので、注意が必要です！よく見直しましょう。

## おわりに
　最後まで読んでいただきありがとうございました。試験頑張ってください！

　私は9月に[認定Webアプリケーション脆弱性診断士](https://cbt-s.com/examinee/examination/securistweb.html)のトレーニングを受けさせてもらう予定なので、また近々試験を受けるでしょう！Coming soon...
nvidia-smiでGPU使用率をモニタリングする

GPUのメモリ使用量/使用率を見るときにnvidia-smiコマンドで確認することはお手軽なこともあり多いかと思いますが、リアルタイムでモニタリングしようと思うと何回もnvidia-smiを叩き続けないといけないのか？と思ったのですがそんなことはなかったというお話。

## nvidia-smiコマンドの定期実行
```sh
# 1秒間隔で実行
nvidia-smi -l 1
# 500ミリ秒=0.5秒間隔で実行
nvidia-smi -lms 500
```

## CSV形式で出力
```sh
nvidia-smi --query-gpu=timestamp,name,utilization.gpu,memory.used --format=csv -l 3
# 以下出力例
timestamp, name, utilization.gpu [%], memory.used [MiB]
2021/03/06 14:21:31.143, GeForce GTX 1080 Ti, 0 %, 440 MiB
2021/03/06 14:21:34.144, GeForce GTX 1080 Ti, 0 %, 440 MiB
2021/03/06 14:21:37.145, GeForce GTX 1080 Ti, 15 %, 575 MiB
2021/03/06 14:21:40.145, GeForce GTX 1080 Ti, 36 %, 10595 MiB
2021/03/06 14:21:43.146, GeForce GTX 1080 Ti, 35 %, 10594 MiB
```
```--query-gpu```はGPU単位での情報。
```--query-compute-apps```とするとプロセス単位での情報を出力可能。
```-f <FILE_PATH>```を付けるとファイル出力できる。

## watch
```sh
watch -n 1 nvidia-smi
```
1秒間隔でnvidia-smiを実行、同一画面で出力が順次更新される。

## 参考
https://note.nkmk.me/nvidia-smi-monitoring-gpu/
GraphQLが向いているプロジェクト

## GraphQLが向いているプロジェクト

### 1. 多くのリレーションシップを持つデータ
複雑なデータ構造や多くのリレーションシップを持つプロジェクトに最適です。例えば、ソーシャルメディアプラットフォームやeコマースサイトなど、多くの関連データを一度に取得する必要がある場合に有効です。

### 2. リアルタイムデータが必要なアプリ
リアルタイムでデータを更新する必要があるアプリケーション、例えばチャットアプリやライブ更新が必要なダッシュボードなどに向いています。GraphQLのサブスクリプション機能を利用することで、リアルタイムデータを簡単に取得できます。

### 3. モバイルアプリ
モバイルアプリでは、データの過剰取得を避け、必要なデータだけを効率的に取得することが重要です。GraphQLを使うことで、ネットワークリソースを最適化し、レスポンスを高速化できます。

### 4. マイクロサービスアーキテクチャ
複数のマイクロサービスからデータを統合する必要があるプロジェクトに向いています。GraphQLは単一のエンドポイントで複数のデータソースからデータを取得するのに適しています。

## GraphQLのメリット
**効率的なデータフェッチ**：クライアントは必要なデータだけを取得できるため、ネットワーク帯域の節約とレスポンスの高速化が図れます。
**柔軟なクエリ**：クエリを自由に構成できるため、クライアント側での開発が柔軟になります。
**強力な型システム**：型定義によってエラーを早期に検出でき、開発者の生産性が向上します。
**リアルタイム更新**：サブスクリプションを利用して、リアルタイムデータの取得が可能です。

## GraphQLのデメリット
**複雑さの増加**：GraphQLのセットアップやスキーマ設計はRESTよりも複雑になることがあります。
**キャッシュが難しい**：REST APIのようにURLベースのキャッシュが使えないため、キャッシュ戦略が難しくなることがあります。
**オーバーヘッド**：クエリ解析や実行時にオーバーヘッドが発生するため、シンプルな要求には不向きな場合があります。

## 実例のサンプル
### 例1：ソーシャルメディアアプリ
ソーシャルメディアアプリでは、ユーザー情報、投稿、コメント、いいねなど、複数のリソースを一度に取得する必要があります。GraphQLを使えば、以下のようなクエリで必要なデータを一度に取得できます。

```graphql
{
  user(id: "1") {
    name
    posts {
      title
      comments {
        content
        author {
          name
        }
      }
      likes {
        user {
          name
        }
      }
    }
  }
}
```

### 例2：リアルタイムチャットアプリ
リアルタイムチャットアプリでは、新しいメッセージが送信されるたびにクライアントに通知する必要があります。GraphQLのサブスクリプションを使えば、リアルタイムで新しいメッセージを取得できます。

```graphql
subscription {
  messageAdded {
    id
    content
    author {
      name
    }
  }
}
```

## まとめ
GraphQLは、システムを理解している人であれば扱いやすいのかなと思いました。
OPEN APIのような、中身の仕様を気にせず利用できるものはRESTがいいかと思いました。マイクロサービスなどは特に取り入れられると便利そう！っていう印象です。
GraphQLの概要と特徴

# GraphQLの概要と特徴

## GraphQLとは？
GraphQLは、Facebookが2012年に開発し、2015年に公開したクエリ言語およびサーバーサイドのランタイムです。GraphQLは、クライアントが必要とするデータを明確に指定できる柔軟なデータ取得方法を提供します。従来のREST APIとは異なり、GraphQLでは一度のリクエストで複数のリソースからデータを取得できます。

## GraphQLの特徴

### 1. **柔軟なクエリ**
GraphQLの最大の特徴は、クライアントが必要とするデータを正確に要求できることです。これにより、必要なデータだけを取得し、不要なデータの過剰取得を避けることができます。例えば、次のようなクエリを実行することで、ユーザー情報とそのユーザーが投稿した記事のタイトルだけを取得できます：

```graphql
{
  user(id: "1") {
    name
    posts {
      title
    }
  }
}
```

### 2. 型システム
GraphQLは強力な型システムを持っています。これにより、APIのエンドポイントやデータの構造が明確になり、開発者がエラーを早期に発見しやすくなります。スキーマを定義することで、データの型やリレーションシップを明示できます。

```graphql
type User {
  id: ID!
  name: String!
  posts: [Post!]!
}

type Post {
  id: ID!
  title: String!
  content: String
  author: User!
}
```

### 3. リアルタイムデータの取得
GraphQLはリアルタイムデータの取得をサポートするサブスクリプション機能を提供します。これにより、クライアントはサーバー側のデータ変更を即時に受け取ることができます。サブスクリプションはWebSocketを使用して実現されます。

```graphql
subscription {
  newPost {
    id
    title
  }
}
```

### 4. 単一のエンドポイント
REST APIでは、異なるデータリソースに対して複数のエンドポイントを設ける必要がありますが、GraphQLでは単一のエンドポイントで済みます。これにより、APIの管理が容易になり、エンドポイントの増加に伴う問題を回避できます。

### 5. 効率的なデータフェッチ
GraphQLは、クライアントが必要とするデータを最適な形で提供するため、過剰取得（over-fetching）や不足取得（under-fetching）の問題を解決します。これにより、ネットワーク帯域の節約やレスポンス時間の短縮が可能です。

## まとめ
GraphQLは、クライアントが必要とするデータを効率的に取得するための強力なクエリ言語です。柔軟なクエリ、強力な型システム、リアルタイムデータの取得、単一のエンドポイント、効率的なデータフェッチといった特徴を持ち、従来のREST APIの欠点を補完します。これにより、開発者はより効率的で柔軟なデータ操作が可能となり、ユーザーエクスペリエンスの向上が期待できます。
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（71/100）

【71日目】
トピック 8：SAPS/4HANAの製造指図（3/15）

≪問題71≫
製造指図の作成中に、複数の有効な製造バージョンが見つかりました。製造バージョンはどの基準で自動選択されますか。
□ロットサイズまたは品目原価
□英数字または供給量割当
□有効期間または受注
□計画手配または品目コード

≪解答≫
□ロットサイズまたは品目原価
■英数字または供給量割当
□有効期間または受注
□計画手配または品目コード

≪解説≫
◆計画手配が登録されると、有効期間とロットサイズ範囲に基づいて適切な製造バージョンが選択されます。
◆同時に複数の製造バージョンが有効な場合は、英数字順で最初の有効な製造バージョンが選択されます。また、供給量割当を更新することで、使用する製造バージョンを制御できます。
◆いずれの場合でも、必要に応じて、計画手配の製造バージョン割当を手動で変更することが可能です。
RESTとRESTfulの違い

# RESTとRESTfulの違い

## RESTとは？
REST（Representational State Transfer）は、ウェブサービスを作るための設計原則やスタイルのことを指します。これは、リソース（データや機能）をHTTPプロトコルを使ってどうやって操作するかを決めるためのガイドラインです。RESTの主な特徴には、以下のようなものがあります。

- **クライアント-サーバーアーキテクチャ**：クライアント（ユーザーやアプリ）とサーバー（データを持つ場所）がはっきりと分かれている。
- **ステートレス**：各リクエストは完全に独立しており、サーバーはリクエストごとにクライアントの状態を覚えていない。
- **キャッシュ可能**：レスポンスはキャッシュでき、同じデータに何度もアクセスする際の効率を上げる。
- **統一インターフェース**：リソースへのアクセス方法が一貫している。例えば、GET、POST、PUT、DELETEのようなHTTPメソッドを使用する。

## RESTfulとは？
RESTfulは、「RESTの原則に従って設計されたウェブサービス」を意味します。つまり、RESTの考え方に基づいて、リソースの操作が統一された方法で行われるウェブサービスのことです。RESTfulなサービスは、以下のような特徴を持ちます：

- **リソースの明確なURL**：例えば、`/users`や`/orders`のようなURLでリソースにアクセスします。
- **HTTPメソッドの使用**：GETはデータの取得、POSTはデータの作成、PUTはデータの更新、DELETEはデータの削除に使われます。
- **ステータスコードの利用**：リクエストの結果に応じて、200（成功）、404（見つからない）、500（サーバーエラー）などのHTTPステータスコードを返します。

## 例を使った説明
イメージしやすいように、図書館を例にしてみましょう。

- **REST**：図書館のルールです。例えば、本を借りるには図書カードを使う、本を返すときは返却ボックスに入れるなど、図書館での行動に関するルールがRESTです。
- **RESTful**：そのルールに従って運営されている図書館です。具体的には、本を借りるために図書カードを使い、返却するときは決められた場所に返すなど、ルールに従って運営されている図書館の運営方法がRESTfulです。

まとめると、**REST**はウェブサービスを作るための設計原則やルールであり、**RESTful**はそのルールに従って作られたウェブサービスのことです。

## REST APIとRESTful APIの違い
REST APIとRESTful APIについても、同様の考え方が適用されます。簡単に言うと、これらの用語はしばしば同じ意味で使われることがありますが、正確には以下のような違いがあります。

### REST APIとは？
REST APIは、**RESTの設計原則に基づいて構築されたAPI（Application Programming Interface）**のことです。これは、リソースに対する操作（取得、作成、更新、削除）をHTTPメソッドを使って行うことを指します。例えば、以下のような操作がREST APIです。

- `GET /books`：すべての本のリストを取得する
- `POST /books`：新しい本を作成する
- `PUT /books/1`：IDが1の本の情報を更新する
- `DELETE /books/1`：IDが1の本を削除する

### RESTful APIとは？
RESTful APIは、RESTの設計原則に従って構築されたAPIを指します。基本的にREST APIと同じ意味で使われることが多いですが、より具体的には以下の特徴を満たすAPIのことを指します。

- **明確なリソースのURL**：例えば、`/users`や`/products`のように、リソースごとに明確なURLが設定されている。
- **HTTPメソッドの適切な使用**：GET、POST、PUT、DELETEなどのHTTPメソッドが適切に使われている。
- **HTTPステータスコードの利用**：操作の結果に応じて、200（成功）、404（リソースが見つからない）、500（サーバーエラー）などのステータスコードを返す。
- **ステートレスな通信**：各リクエストは独立しており、サーバーはクライアントの状態を保持しない。

### まとめ
- **REST API**：RESTの原則に基づいて構築されたAPI。リソースに対する操作をHTTPメソッドを使って行う。
- **RESTful API**：RESTの設計原則を忠実に守ったAPI。具体的な特徴として、明確なURL、適切なHTTPメソッドとステータスコードの使用、ステートレスな通信が挙げられる。

実際には、REST APIとRESTful APIはほぼ同じ意味で使われることが多いので、混同しても大きな問題はありません。
APIの種類と用途

# APIの種類と用途

## はじめに
API（Application Programming Interface）は、ソフトウェア間のインターフェースとして機能し、異なるアプリケーションが互いに通信し、機能を共有するための手段を提供します。本記事では、さまざまな種類のAPIとその用途について詳しく説明します。

## APIの種類

### REST API
REST（Representational State Transfer）APIは、HTTPプロトコルを使用して通信を行う最も一般的なAPIの一つです。リソースをURLで指定し、HTTPメソッド（GET、POST、PUT、DELETEなど）を使用して操作を行います。

#### 用途
- **Webサービス**: REST APIは、Webアプリケーションとサーバー間の通信に広く使用されます。
- **モバイルアプリ**: サーバーからデータを取得し、モバイルデバイスに表示するために使用されます。
- **IoTデバイス**: センサーやデバイスがデータを送信および受信するために使用されます。

#### 参考リンク
- [REST APIとは？](https://www.redhat.com/ja/topics/api/what-is-a-rest-api)

---

### SOAP API
SOAP（Simple Object Access Protocol）APIは、XMLベースのメッセージングプロトコルを使用して通信を行います。SOAPは、セキュリティやトランザクション処理が必要な企業向けアプリケーションによく使用されます。

#### 用途
- **企業システムの統合**: 複雑なトランザクション処理やセキュリティ要件を満たすために使用されます。
- **銀行および金融サービス**: 高度なセキュリティと信頼性が求められるアプリケーションに使用されます。

#### 参考リンク
- [SOAP APIとは？](https://www.redhat.com/ja/topics/integration/whats-the-difference-between-soap-rest)


### SOAPとRESTの比較

https://aws.amazon.com/jp/compare/the-difference-between-soap-rest/

---

### GraphQL API
GraphQLは、Facebookによって開発されたクエリ言語で、クライアントが必要なデータを正確に要求できるようにします。REST APIとは異なり、単一のエンドポイントから複数のリソースにアクセスできます。

#### 用途
- **フロントエンド開発**: クライアントが必要とするデータを一度に取得するため、複数のAPIコールを減らすことができます。
- **モバイルアプリ**: ネットワーク帯域幅の節約と効率的なデータ取得が求められるモバイルアプリケーションで利用されます。

#### 参考リンク
- [GraphQLとは？](https://graphql.org/learn/)

---

### gRPC
gRPCは、Googleによって開発されたRPC（Remote Procedure Call）フレームワークで、高性能な通信を実現します。Protocol Buffersを使用してデータをシリアライズし、効率的なバイナリ形式でデータを送受信します。

#### 用途
- **マイクロサービス**: 高性能なサービス間通信が求められるマイクロサービスアーキテクチャで使用されます。
- **リアルタイム通信**: 低遅延が求められるリアルタイムアプリケーションで利用されます。

#### 参考リンク
- [gRPCとは？](https://grpc.io/)

---

### OpenAPI
OpenAPIは、RESTful APIを記述するための標準仕様であり、Swaggerとしても知られています。APIの設計、ドキュメント作成、テストに使用されます。

#### 用途
- **API設計とドキュメント**: APIの仕様を標準化し、開発者が簡単にAPIを理解し使用できるようにします。
- **自動生成**: APIクライアントとサーバースタブの自動生成に使用されます。

--- 
#### 参考リンク
- [REST APIとは？](https://www.redhat.com/ja/topics/api/what-is-a-rest-api)  
- [SOAP APIとは？](https://www.ibm.com/cloud/learn/soap-api)  
- [GraphQLとは？](https://graphql.org/learn/)
- [gRPCとは？](https://grpc.io/)  
- [OpenAPIとは？](https://www.openapis.org/)
MarkdownAI 試用

つい先日Qiitaに投降した記事とほぼ同じ内容をMarkdownAIで記述してみました。
![スクリーンショット 2024-07-14 123617.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674574/98bacd3b-9ef6-1219-23f5-56b70620ce2b.png)


~~~

## 目的：Python 実行環境の構築

元々はWindows10環境下にてPythonを使っていましたが、新規PCへの移行に伴い、環境構築をすることになりました。
せっかくなのでPandasの高速化（？）ライブラリである[fireducks](https://fireducks-dev.github.io/ja/)などを使用してみたく、今回の内容を実施しました。


~~~

### 感想

触ってみた感じ、普段慣れているような機能が無いため不便に感じました。
公開するだけならQiitaを使ってしまいそう。
ただ自身がこういうサービスを扱う初心者であるため機能自体はあるかもしれません。
ただ今後AIによって執筆がラクになるっぽいのでそれ次第なトコロは大きいと思っています。

- 不便と感じた点
    - TABインデント
    - 画面プレビューが面倒（トップまで戻ってボタン押下）
    - ダークモード移行
Dockerコマンド集

※適宜追加予定

以下で出てくるcontainernameはコンテナidでも良い。

## Dockerイメージの一覧を表示する
```
docker image ls [オプション]
```

## Dockerコンテナの一覧を表示する
```
docker container ls [オプション]
```
```-a```を付けると停止中のコンテナも表示する。
```docker ps```でも同じ。

## Docker HubからDockerイメージを取得する
```
docker image pull [オプション] imagename
```
imagenameはimagename:tagとしてタグも指定可能。

## DockerfileからDockerイメージをビルドする
```
docker image build [オプション] Dockerfileのパス
```
オプションは```-t```でイメージ名:タグを指定など

## DockerイメージからDockerコンテナを起動する
```
docker container run [オプション] imagename
```

例：
バックグラウンドで実行
```
docker container run --name httpdcontainer -d -p 8080:80 httpd
```
bashでインテラクティブ
```
docker container run -it imagename /bin/bash
```
ホスト側のディレクトリをマウント
```
docker container run -it -v host_dir:docker_dir imagename /bin/bash
```
コンテナを抜けると削除する
```
docker container run -it --rm imagename /bin/bash
```

## 停止中のコンテナを起動する
```
docker container start [オプション] containername
```

## 起動中のコンテナを再起動する
```
docker container restart [オプション] containername
```

## 起動中のコンテナでコマンドを実行する
```
docker container exec [オプション] containername コマンド
```
コマンド → bashとか

## 起動中のコンテナを停止する
```
docker container stop [オプション] containername
```

## 停止中のコンテナを削除する
```
docker container rm [オプション] containername
```

## Dockerイメージを削除する
```
docker image rm [オプション] imagename
```

## 参考サイト

https://www.kagoya.jp/howto/cloud/container/dockercommand/
ABC362Eを解いた


筆者はレート600前後の茶色コーダ

7/13開催のABC362で解けなかったE問題を解いていく

https://atcoder.jp/contests/abc362/tasks/abc362_e

# 実装コード

初項(or末項)と長さ、公差をパラメータにしてDPで解くようだ。

```python
from collections import Counter
import sys
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

class ModInt:
    def __init__(self, x, mod = 998244353):
        self.mod = mod
        self.x = x.x if isinstance(x, ModInt) else x % self.mod
    __str__ = lambda self:str(self.x)
    __repr__ = __str__
    __int__ = lambda self: self.x
    __index__ = __int__
    __add__ = lambda self, other: ModInt(self.x + ModInt(other).x)
    __sub__ = lambda self, other: ModInt(self.x - ModInt(other).x)
    __mul__ = lambda self, other: ModInt(self.x * ModInt(other).x)
    __pow__ = lambda self, other: ModInt(pow(self.x, ModInt(other).x, self.mod))
    __truediv__ = lambda self, other: ModInt(self.x * pow(ModInt(other).x, self.mod - 2, self.mod))
    __floordiv__ = lambda self, other: ModInt(self.x // ModInt(other).x)
    __lt__ = lambda self, other: self.x < ModInt(other).x
    __gt__ = lambda self, other: self.x > ModInt(other).x
    __le__ = lambda self, other: self.x <= ModInt(other).x
    __ge__ = lambda self, other: self.x >= ModInt(other).x
    __eq__ = lambda self, other: self.x == ModInt(other).x
    __ne__ = lambda self, other: self.x!= ModInt(other).x

class mint(ModInt):
    pass

def main():
    N = rI()
    A = rLI()
    
    ans = [mint(0)] * (N+1)
    ans[1] = mint(N)
    
    Sd = set()
    
    for i,a in enumerate(A):
        for j in range(i,N):
            Sd |= {A[j]-a}

    Ld = list(Sd)
    Nd = len(Ld)
    
    kd = {d:i for i,d in enumerate(Ld)}
    
    dp = [[[mint(0)]*Nd for _ in range(N+1)] for _ in range(N)]
    
    for i in range(N-1,0,-1):
        for j in range(i):
            dp[i][2][kd[A[i]-A[j]]] += 1
                   
    
    for k in range(3,N+1):
        for i in range(N-1,0,-1):
            for j in range(i):
                d = kd[A[i]-A[j]]
                dp[i][k][d] += dp[j][k-1][d]
    
    for k in range(2,N+1):
        for i in range(N):
            for d in range(Nd):
                ans[k] += dp[i][k][d]

    print(*ans[1:])
if __name__ == '__main__':
    main()

```

# まとめ

ABC362Eを解いた。実装には動的計画法を使用した。

# 感想

今回の問題は動的計画法で解く問題だが、条件が複雑で理解が大変だった。

いままで解いてきたDPの問題はD問題以下だったので、
E問題で使用するDPはやはり一段階高度なものが必要なんだという認識をした。