OmniAICreator/Qiita-1.07M huggingface dataset:
量子コンピュータと量子通信,演習問題解答例:第２章-その1

$$
\def\bra#1{\mathinner{\left\langle{#1}\right|}}
\def\ket#1{\mathinner{\left|{#1}\right\rangle}}
\def\braket#1#2{\mathinner{\left\langle{#1}\middle|#2\right\rangle}}
$$
# はじめに
初めまして、某大学の学部3年生、来年度から量子情報理論の研究室に配属されるS.Kouと申します。
今回から、僕が現在勉強している「量子コンピュータと量子通信」（いわゆるQCQIだったりニールセンチャンだったり）の解答例を共有していきたいと思います。

さしあたって今回からは2章の前半、線形代数の解答例を紹介します！
このようなブログを書くのは初めてなので、読みにくいところが多々あるでしょうがご意見、ご指摘、質問などは[twitter](https://twitter.com/SKougentiana)までお願いします。

:::note
本記事の内容は
Michel A. Nielsen, Isaac L. Chuang 共著. 木村達也 訳.
量子コンピュータと量子通信. オーム社. 2004
の内容に準拠しています。
:::

# 本編
## 2.1.1 基底と線型独立
### 演習2.1

```math
\begin{pmatrix}
1 \\
-1
\end{pmatrix}
+
\begin{pmatrix}
1 \\
2
\end{pmatrix}
-
\begin{pmatrix}
2 \\
1
\end{pmatrix}
=\vec{0}
```

より、これらは線形従属である。

## 2.1.2 線形オペレータと行列
### 演習2.2

```math
A=
\begin{pmatrix}
a & b \\
c & d
\end{pmatrix}
```

とおくと

```math
A\ket{0} =
\begin{pmatrix}
a & b \\
c & d
\end{pmatrix}
\begin{pmatrix}
1\\
0
\end{pmatrix}
=
\begin{pmatrix}
a\\
c
\end{pmatrix}
=\ket{1} \\

A\ket{1} =
\begin{pmatrix}
a & b \\
c & d
\end{pmatrix}
\begin{pmatrix}
0\\
1
\end{pmatrix}
=
\begin{pmatrix}
b\\
d
\end{pmatrix}
=\ket{0} \\
```

より

```math
A=
\begin{pmatrix}
0 & 1 \\
1 & 0
\end{pmatrix}
```

たとえば、入出力基底として$\frac{\ket{0}+\ket{1}}{\sqrt{2}},\frac{\ket{0}-\ket{1}}{\sqrt{2}}$を用意して、同様の計算を行うと

```math
A=
\begin{pmatrix}
1 & 0 \\
0 & -1
\end{pmatrix}
```

が得られる。

### 演習2.3
オペレータ$A,B$に対して、次の式が成り立つ。

```math
A\ket{v_j}=\sum_i A_{ij}\ket{w_i} \\
B\ket{w_i}=\sum_k B_{ki}\ket{x_k}
```

上の式に左から$B$を作用させると

```math
\begin{align}
BA\ket{v_j} &= B \left( \sum_i A_{ij}\ket{w_i} \right) \\
&= \sum_i A_{ij}B\ket{w_i} \\
&= \sum_i A_{ij}\sum_k B_{ki}\ket{x_k} \\
&= \sum_{ik} B_{ki}A_{ij}\ket{x_k}
\end{align}
```

より、線形変換$B,A$の行列表現の行列式になっている。

### 演習2.4
あるオペレータ$A:V \rightarrow V$とベクトル空間$V$の基底$\\{ \ket{v_i} \\}$を用いて、入力と出力基底が同じであることから

```math
A\ket{v_j} = \sum_i A_{ij} \ket{v_i} = \ket{v_j}
```

従って$A_{ij} = \delta_{ij}$より$A=I$である。

# あとがき
今回はここまでとなります。
演習自体は割と先まで解けているのでこのシリーズは随時更新していきます！
量子情報の勉強の力になれれば幸いです。

次回の記事は[こちら](https://qiita.com/S-Kou/items/ccfb5e01428205ea9bf0)
【laravel】実務で使えそうなプルダウンを書いてみる

## はじめに
laravelなど使っているとフォームを書くことが結構な頻度である。
そこでインプットタグ以外にセレクトタグ(プルダウン)を書くこともまあある。
これまでに書いていたプルダウンだと少し実務的ではないと考えたので、今回は実務でも使えそうなプルダウンを書いていきます。

### これまでに書いていた実務的ではないプルダウン
```
<select class="form-control" id="part_id" name="part">
    <option value="">選択してください</option>
    <option value="胸">胸</option>
    <option value="脚">脚</option>
    <option value="肩">肩</option>
    <option value="背中">背中</option>
    <option value="二頭">二頭</option>
    <option value="三頭">三頭</option>
    <option value="腹">腹</option>
</select>
```
optionタグをそれぞれ書く形ですね。
チュートリアルだったりでやる形はだいたいこれです。
ただこれだと数が多くなったときにコードの可読性が下がってしまうため実務的とは言えないですね。

### configを使って書くプルダウン
少し実務的なやり方を紹介します。
configファイルにプルダウンの型を予め用意してあげてそれをViewで使ってあげる形です。

#### config/pulldown.phpを用意する

まずはconfigディレクトリ配下にどんな名前でもいいのでファイルを作ってあげます。
今回は`pulldown.php`とします。

```config/pulldown.php
<?php

return [
    'part_name' => [
        '胸' => '胸',
        '脚' => '脚',
        '肩' => '肩',
        '背中' => '背中',
        '二頭' => '二頭',
        '三頭' => '三頭',
        '腹' => '腹',
    ]
];
```

中身は上記のようにしてあげます。
これで引っ張ってくる準備ができました。

#### 実際にViewでプルダウンを記述する

```test.blade.php
<select name="part" id="part-id" class="form-control">
    @foreach (Config::get('pulldown.part_name') as $key => $val)
        <option value="{{ $key }}">{{ $val }}</option>
    @endforeach
</select>
```
ビューでは上記のようにして記述してあげます。
`foreach`で先程記述した`pulldown.php`の`part_name`のキー、バリューを回してあげる形です。
これで先程のoptionタグベタ打ちと同様の動きをします。

これのほうが可読性もあがり、optionタグの数が多くなってもスッキリしますね。

### DBに登録しそれを使ってプルダウンを書く
今度は予めDBに使いたいデータを登録し、それをプルダウンとして使う方法について書いていきます。

#### DBにデータを登録する
まずはDBにデータを登録してあげます。
ファイルがあってCSVでインポートしてあげても良いですし、少ないならベタ打ちでDBに登録しても良いです。
なのでとりあえずデータをDBに登録してあげましょう。

![スクリーンショット 2023-01-19 9.35.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589286/e2a5f4f4-05f6-29b5-afeb-150366e32914.png)

#### Controllerでデータを準備する
ControllerファイルにてDBデータをビューで使えるように整えてあげます。
今回は[pluck](https://qiita.com/yastinbieber/items/34ed4f789b05c7d31acb "pluck")メソッドを使ってあげます。

```
public function create() {

        $trParts = TrPart::pluck('part_name', 'id');
        return view('trrecords.create', compact('trParts'));

    }
```

#### Viewにてプルダウンを作る
そうしたらそれをビューで使ってあげます。
```test.blade.php
<select class="form-control" id="part_id" name="part">
    <option value="">選択してください</option>
    @foreach ($trParts as $index => $name)
        <option value="{{ $index }}">{{ $name }}</option>
    @endforeach
</select>
```

先程同様`foreach`で回してあげるだけですね。
かなりスッキリと書くことができます。

そのときによってどの使い方が良いかはわかれるかもしれませんが
それぞれ知っておくと便利かなと思います!
以上。
Googleプロジェクト管理：フィッシュボーン図

# はじめに

わたしが [Google プロジェクト管理:プロフェッショナル認定証で得られた素晴らしい体験][google]を、要点をまとめ小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ ***"Google プロジェクト管理:プロフェッショナル認定証"*** を受講してみてください。

[google]: https://qiita.com/mapami/items/317ae776a2268fd54c8f

https://jp.coursera.org/professional-certificates/google-project-management

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/7c79c997-e4e4-7d71-3686-e01b7badaa3c.png" width="800">

# リスクを特定すのに役立つツール

どんなにシンプルなプロジェクトでも、何らかのリスクはつきものです。しかし、リスクによって、プロジェクトの目標が妨げられることがあってはなりません。大切なのは、準備することです。ここでは、リスクを特定するために使えるツールやテクニックについて説明します。

## ブレーンストーミング

ブレーンストーミングは、グループで自発的に判断することなくアイデアを共有できるため、チームでリスクを特定するための最も効果的なテクニックの1つです。プロジェクトマネージャーとして、あなたは、潜在的なリスクを想像するために、グループをまとめる責任を負います。

このミーティングに誰を招待するかを決めるときに参照できるように、RACIチャートを準備しておいてください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/29e3a09e-d0fd-002b-34bd-12ed01525271.png" width="700">

経験上、このタスクに最適なチームは、さまざまな役割、背景、経験を持つ人が集まった多様なチームです。多様性のあるチームは、異なる視点、経験、スキルセットをもたらすので、自分だけでは思いつかないようなリスクを発見するのに役立つかもしれません。例えば、あるメンバーは複数のプロジェクトに携わった経験があるかもしれませんし、別の新メンバーは他のチームでの経験から新鮮な視点をもたらしてくれるかもしれません。

:::note info
ブレーンストーミングは、判断の自由な場であるべきです。カテゴリーに関連する情報の流れを促し、物事を除外しないようにします。人的要因の場合、個人名を挙げるのは避け、行動のみに注目します。
:::


## 因果関係図（フィッシュボーン図）

ブレーンストーミングの際に使える素晴らしいツールは、因果関係図と呼ばれるものです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/3debc742-e2a3-5227-d1e5-e4df88064609.png" width="700">

因果関係図は、ある事象やリスクの原因となり得るものを示したもので、リスクマネジメントに非常に有効です。

例えば、この図では、サプライヤーが納期を守らないことが原因として挙げられています。これは、プロジェクトにとってのリスクです。左側には、そのような結果をもたらす原因として、デリゲーションの不備やトラッキングツールの不足などをブレーンストーミングします。

つまり、因果関係図は、「結果」と呼ばれる潜在的なリスクを特定し、そのリスクを引き起こす可能性のある原因を逆算して考えることで、物事がうまくいかない可能性のあるすべての方法を特定するのに役立つのです。

さらに原因を分類して分解することで、予算の超過やスコープクリープによるタイムラインへの影響など、潜在的な問題につながる可能性がある部分を特定することができます。注意点として、スコープクリープとは、プロジェクト開始後のどの時点でも、プロジェクトのスコープに影響を与える変更、成長、制御不能な要因を指します。

このようなブレーンストーミングでは、潜在的なリスクのリストがかなり長くなってしまうかもしれませんが、それでもかまいません。それはそれでいいのですが、あなたやあなたのチームが、プロジェクト中に起こりうるすべての問題を考慮することができないのは現実です。

#### ステップ１：リスクを定義する

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/047077ef-13ae-0f24-2214-5bfd1b173d65.png" width="700">

#### ステップ２：リスクに関連する可能性のあるカテゴリーを特定する

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/aedcb574-368d-5751-bd64-e2343a6be895.png" width="700">

#### ステップ３：各カテゴリーに関連する可能性のある原因をリストアップする

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/938d67f5-e1c0-7367-0035-b4540fcf8786.png" width="700">


:::note info
フィッシュボーン図は、プロジェクトのどの段階でも役に立つツールです。
:::

# リスクレジスター

では、どのリスクに焦点を当てるか、どのように決めればよいのでしょうか？

ブレーンストーミングなどで得た結果をリスクレジスターにリストアップする。リスクレジスターとは、あなたがリストアップしたリスクを記載した表やグラフのことです。
メール認証をキューイングして行う

環境: Laravel 9 / PHP 8.2
認証ライブラリ: "laravel/fortify" (今回は関係ないけど一応)


## 1.まずメール認証の準備
詳しくはこちら
[モデルの準備 | Laravel 9.x メール確認](https://readouble.com/laravel/9.x/ja/verification.html#model-preparation)
その他、認証のためのイベントトリガーとかまわりは省略。

```php:app/Models/User.php
<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable;

    // …
}
```

## 2. メール送信時に呼ばれるNotificationsクラスに少し追記する

新しく　`app/Notifications/VerifyEmailQueued.php` を作成

```php:app/Notifications/VerifyEmailQueued.php
<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Auth\Notifications\VerifyEmail;

class VerifyEmailQueued extends VerifyEmail implements ShouldQueue
{
    /**
     * 本来はVerifyEmailだけで済ませるところキューに乗せて実行したかったことから
     * VerifyEmailを上書きすることで実現している
     */
    use Queueable;
}
```

## 3. notify()を実行しているメソッドを上書き

User Modelに戻ってきて

```php:app/Models/User.php
<?php

namespace App\Models;

use App\Notifications\VerifyEmailQueued; // 追加
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable;

    /**
     * メール認証メール送信時に呼ばれるメソッド
     * Illuminate\Contracts\Auth\MustVerifyEmailの上書き
     *
     * Notificationのnofifyはqueueもいける
     * @return void
     */
    public function sendEmailVerificationNotification(): void
    {
        $this->notify(new VerifyEmailQueued);
    }

    // …
}
```

### 確認) 実行してみる
キューを設定しておいて
[ドライバの注意と事前要件 | Laravel 9.x キュー](https://readouble.com/laravel/9.x/ja/queues.html#driver-prerequisites)

`php artisan queue:work ` を実行しておいて
新規登録処理をすると

```
  2023-01-19 14:49:08 App\Notifications\VerifyEmailQueued ........................................................................................... RUNNING
  2023-01-19 14:49:08 App\Notifications\VerifyEmailQueued ...................................................................................... 60.21ms DONE

```

ちゃんとキューイングされて実行された！やったね

### 調査の苦労話


結論はこれだったんだけど
https://codeanddeploy.com/blog/laravel/how-to-queue-the-laravel-8-email-verification

たどり着くまでに
認証メールをカスタムするところで、キューに入れれないかと四苦八苦していた

```php:app/Providers/AuthServiceProvider.php
class AuthServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $this->registerPolicies();

        // ここでキューイングできるように返せばいけるのでは？と思ったけど
        // 掘っていくうちに、ここでは最後Mailableのsendしかしてなかったので、ダメじゃんってなった
        VerifyEmailQueued::toMailUsing(function ($notifiable, $url) {
            return (new EmailVerification($notifiable, $url, $referer));
        });
    }

```




# 最後に
弊社では、一緒に働いてくれるエンジニアを募集しています。
Laravelをこねこねしましょう！
↓最新技術や自社開発に興味のある方はこちらから↓
[Wantedly - スタジオアンビルト株式会社](https://www.wantedly.com/companies/studiounbuilt)

こんなWebサービスを作っています。
・[マドリー](https://madree.jp/)
・[Studio Unbuilt](https://www.studiounbuilt.com/)
マークダウン(編集途中)

# 大見出し
## 中見出し
### 小見出し

普通の文字。

**太字**。

*斜体*。

~~取り消し~~

X<sub>2</sub>

X<sup>2</sup>

以下抜粋。

>ここに引用部分を書く。

整数は`int`型が良い

```cs
int a;
a = 1;
Debug.Log($"a");
```

- 箇条書き
  - 段下げ
    - 段下げ2
- 続き

1. 順番1
   - 下げ
1. 順番2
   1. 順番2-1
   1. 順番2-2
1. 順番3

- [ ] 作業1
- [x] 作業2
- [ ] 作業3

|NO|氏名|フリガナ|
|-:|:-:|:-|
|1|ryu|リュウ|
|2|unity|ユニティ|
|3|github|ギットハブ|
VMware vSphereのUIについて

# 記載内容
VMware vSphereの運用管理をする際に利用するUIが複数存在し、名称や用途が混乱することがあったため自身の勉強もかねてここで整理します。
基本的な機能のみ記載しており、オプション製品群は記載しておりません。あらかじめご了承ください。

# GUI
#### VMware Host Client
* HTML5によるブラウザインターフェース
* ESXiホスト自身にログインして、直接管理する。
* vCenter障害時の場合はこちらで接続する。
* https://ESXiホストのFQDN or IPアドレス/ui でアクセス可能
#### vSphere Client
* HTML5によるブラウザインターフェース
* vCenterにログインして、複数のESXiホストをまとめて管理する。
* https://vCenter ServerのFQDN or IPアドレス/ui でアクセス可能
#### vCenter Server管理 I/F (旧VAMI)
* vCenter Serverアプライアンス自身を管理する。
  * リソース監視 (CPU/メモリの使用率等)
  * アクセス制御 (SSH/DCUI等)
  * ネットワーク設定 (ホスト名/IPアドレスの確認、変更)
  * サービス管理 (正常性確認、起動、停止、再起動)
  * ファイルベースのバックアップ
* https://vCenter ServerのFQDN or IPアドレス:5480/ でアクセス可能
#### vSphere Web Client
* Adobe Flash Playerのサービス終了を受けて、vSphere 6.7で提供終了。
* vCenterにブラウザでログインして、複数のESXiホストをまとめて管理する。

# CLI
#### DCUI (Direct Console User Interface)
* 初期設定時に必ず目にする黒と黄色の画面
* 用途
  * ESXiホストのネットワーク情報、キーボードレイアウトなどの初期設定
  * トラブルシュート用アクセス管理(ESXiシェル/SSH)
  * システムログ確認 (Syslog/ hostd(※1)/ vpxa(※2))
#### VMware vSphere PowerCLI
* PowerShellを使用して、vSphere環境を管理する。
* vCenterから実行できる操作のほとんどをスクリプト化できる。
* https://developer.vmware.com/web/tool/13.0.0/vmware-powercli
#### ESXCLI
* ESXiホストへSSH接続して利用する。
#### vSphere CLI
* vSphere 6.7で提供終了し、PowerCLI/ESXCLIへの移行が推奨されている。
* https://kb.vmware.com/s/article/78473?lang=ja

# 備考
* vSphere7時点での情報を記載しております。
* 過不足、誤りございましたらご指摘いただけると幸いです。
* 画面イメージはまた時間が取れた時に掲載するかもしれません。

# 注釈
* ※1：hostdはESXiで実行される管理エージェントで、ESXiホストへの直接ログイン時にVMware Host Clientとの通信に使用されます。
* ※2：vpxaはESXiで実行される管理エージェントで、vCenterとの通信に使用されます。

# 参考文献
以下を参考にまとめさせていただきました。ありがとうございます。
* 二岡 祐介, 坂井 大和. 2021. 徹底攻略VCP-DCV教科書 VMware vSphere 7対応.
* ヴイエムウェア株式会社. 2020. VMware 徹底入門 第4版 VMware vSphere 6.0対応.
(AWS) タグ付けできるリソース一覧みたいな資料

なかなかタグ付けできるAWSリソースが網羅されている資料がないが、
こちらのドキュメントにある程度網羅されている気がする。
（Resource Groups & Tag Editorの仕様が出ているドキュメントなので、
結局、タグ付けできるリソース全てがまとまっているのではないかと、あくまで予想。）
https://docs.aws.amazon.com/ja_jp/ARG/latest/userguide/supported-resources.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80683/32126b4e-7260-4e07-d7b7-9caec2c4f525.png)
マイクラチュートリアル6-2 送信機プログラム


``` lua
-- 送信
local args = {...}
local id = tonumber(args[1])
rednet.open("back")

local table = {
  w = "turtle.forward()",
  a = "turtle.turnLeft() turtle.forward() turtle.turnRight()",
  d = "turtle.turnRight() turtle.forward() turtle.turnLeft()",
  space = "turtle.up()",
  leftShift = "turtle.down()",
  right = "turtle.turnRight()",
  left = "turtle.turnLeft()"
}


print("Press 'q' to terminate")

while true do
  local event, scancode = os.pullEvent("key")
  local key = keys.getName(scancode)

  if key == "q" then
    break
  end

  local message = table[key]
  print(key, "=>" , message or "none")

  if message then
    rednet.send(id, message)
  end

end
```
【Computer Science】CS初心者がアルゴリズム理解に必須の概念の説明をしてみる【データ構造】

# Array 
Array には Array List と Linked List がある
Array Listはメモリ上に連続的に存在しているためindexさえあればアクセスできる
Linked List は Nodeを元に作成されており、indexでアクセスするためにはheadから辿る必要があり、O(n)かかる。

# recursive

再帰は人間にも分かりづらいが stack を使うと分かりやすい
computerがrecursive function を実行するときに、現在の関数のローカル変数や関数のどこにいるのかを知る必要がある。これは **runtime stack** **stack frame** と呼ばれている。
Pythonなどではstack frame がでかく、n=1000くらいで最大に達する。よって安易に再帰はするべきでない

# Linked List 

Singly Linked List (単連結リスト）。普通の配列に比べて扱いにく過ぎだろ(readがO(N)なので)と思ったが、
連結リストは挿入が簡単というメリットがある。挿入する操作がnextを付け替えるだけで実装できるからだ。配列の場合は、挿入後にあるカラムを全部移動させなければならない。

# Hash Map
hash = map = hashmap = dict. 呼び方は何でもあり。
基本的にhashmapは特定のアルゴリズムを用いてキーを探索しているためソートはしてくれない。けどなぜかPythonのdictはしてくれてる。なんで？
追記順ならいうてnextかなんか実装すれば順番通りにしてもO(1)ですむのかな？未だ謎は多い

# Heap
英語で「山積み」という意味。データ構造の**heap**と、動的メモリ領域の**heap**があるのでややこしいが、実はヒープ領域はヒープ構造で実装されているとかいないとか。

## ヒープ木構造
インデックスは深さ探索。
親ノード(k)は子ノード（2k, 2k+1）よりも小さくなければならない。(**k=1,2,3..**)
ヒープ作成(**build_min_heap**)の最悪計算量はO(n), **min_heapify**(ヒープ構造を作る上で、上のルールを守るためにノードを入れ替える作業)の最悪計算量はO(logn)である。

## ヒープ領域
未使用ノード、使用中ノードに分かれる。最初は一つの大きい未使用ノードで、mallocやnewでメモリ確保されると、未使用ノードから必要分切り離して与える。free or deleteされるとまた未使用ノードに戻るが、動的に削除されるのでフラグメンテーションが発生する。これをガベージコレクションでまとめないと再利用しにくい。
vueコンポーネントを呼び出せなくなった件について

### 1.エラー内容
Chromeのデベロッパーツールに以下のエラーが表示されるようになった。
```
Unknown custom element: <コンポーネント名> - did you register the component correctly? For recursive components
```

### 2.原因
webpack-dev-serverをインストールしておらず、webpack.mix.jsに「.version()」と記載しているにも関わらず、ハッシュ値が更新されなかったため。
(ちなみにハッシュ値はpublic/mix-manifest.jsonファイルで確認できます。)

### 3.解決方法
まず、package.jsonの「"devDependencies"」にwebpack-dev-serverがあるか確認してください。
記載されていない場合はインストールできていないので以下のコマンドをpackage.jsonがあるディレクトリで実行してください。
```.tsx:コマンド
$ npm install -D webpack-dev-server
$ npm run dev
```
コマンド実行後、もし「Cannot read properties of undefined (reading 'component')」エラーが表示されるようでしたら以下を記載してください
```.tsx:app.js
import Vue from 'vue';
```

### 4.まとめ
これで自分の環境では動きました。
チーム内で何人か同じエラーが発生していましたが、なかなか解決しなかったのでとりあえず解決方法が分かってよかったです笑
でも他の方は今まで問題なく開発できていたのが不思議。
【Python3】関数とメソッドの違いは？実は同じもの？

まずはこれを見てほしい。

```python
>>> class X:
...     def y(self):
...         return 1
...
>>> ins = X()
>>> ins.y()
1
>>> X.y()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: y() missing 1 required positional argument: 'self'
>>> X.y(X())
1
```
メソッドはインスタンスにしないと実行できないとどっかの~~TechAc○demy~~ブログで言っていたが半分嘘で、クラスに属する関数でもあるため普通に実行できてしまう。ただ、引数の違いが存在する。

続きを見ていこう。

```python
>>> ins.y
<bound method X.y of <__main__.X object at 0x7fd6203f0d90>>
>>> X.y
<function X.y at 0x7fd61ebcbc10>
```

インスタンスから呼び出すのとクラスから呼び出すので属性が変わっている。前者はメソッド、後者は関数だ。
この差が第一引数に自動的にselfを代入してくれるかどうかの違いのようだ。
つまり、Pythonの内部で、メソッドが呼び出されると**自動的にメソッドの元になっている関数を呼び出し(`ins.y.__func__ == X.y`)、selfをつけて実行する**のだ。

公式ドキュメントより：
> 呼び出された時、引数リストに self 引数が追加されます。
`m.__func__` はそのメソッドを実装している関数です。 
`m(arg-1, arg-2, ..., arg-n)` の呼び出しは、 `m.__func__(m.__self__, arg-1, arg-2, ..., arg-n)` の呼び出しと完全に等価です。
https://docs.python.org/ja/3/library/stdtypes.html#methods

公式ドキュメントの
https://docs.python.org/ja/3/tutorial/classes.html#method-objects
をみるとより理解が深まることでしょう。

特にこの部分が詳しいです。
>インスタンスの非データ属性が参照されたときは、そのインスタンスのクラスが検索されます。その名前が有効なクラス属性を表している関数オブジェクトなら、インスタンスオブジェクトと見つかった関数オブジェクト (へのポインタ) を抽象オブジェクト、すなわちメソッドオブジェクトにパックして作成します。メソッドオブジェクトが引数リストと共に呼び出されるとき、インスタンスオブジェクトと渡された引数リストから新しい引数リストを作成して、元の関数オブジェクトを新しい引数リストで呼び出します。
Edgeの印刷機能で不具合が発生するのでメールワイズの印刷画面をカスタマイズした

# 状況
2023年1月19日現在，Microsoft Edgeの印刷機能で不具合が発生しております。
ショートカットキー（Ctrl＋Shift＋P）で印刷すれば回避できるのですがメールワイズでは使えません。印刷画面が表示されると同時に印刷がスタートしてプレビュー画面が表示されてしまうためです。そこで，印刷画面表示の際にプレビュー画面が表示されないようカスタマイズしました。
# コード
Edgeの場合だけ印刷をキャンセルします。
```javascript
$(function () {
  //メール印刷画面
  if (mw.PAGE == "MailPrint") {
    var browser = window.navigator.userAgent.toLowerCase();
    if (browser.indexOf("edg") != -1) {
      window.onload = function () {
        //onloadを上書きすることでEdgeの場合は印刷をキャンセル
        alert("Ctrl+Shift+P で印刷してください。");
      }
    }
  }
});
```
メールワイズのシステム設定＞JavaScript設定からJavaScriptファイルを登録します。
参考：[メールワイズマニュアル：JavaScriptファイルの設定](https://jp.cybozu.help/m/ja/admin/system/customize.html)

印刷画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102503/ec656914-4653-9619-4ce3-92a345480f83.png)
PL-900：テンプレートからフローを作成する

この投稿はMicrosoft PL-900の受験に向けた勉強資料をMS Learnページを参考にして作っています。
一発合格に向けて頑張りましょう！

[テンプレートからフローを作成する][MS-Learn]

[MS-Learn]: https://learn.microsoft.com/ja-jp/training/modules/build-automated-solution/2-create-flow-template

## テンプレートからフローを作成する
* まず、PowerAutomateにログインし、左側のメニューからTemplatesを選択

<img src="https://learn.microsoft.com/ja-jp/training/modules/build-automated-solution/media/flow-templates.png" />

* ここでは「Dataverse」のような特定の単語やフレーズで検索したり、カテゴリに基づいて検索したりすることができる
* 特定のテンプレートを選択すると、接続するデータソースを含むテンプレートの詳細が表示される

<img src="https://learn.microsoft.com/ja-jp/training/modules/build-automated-solution/media/email-report-template.png" />

* テンプレートを使えば、フローを作成開始もしくはカスタマイズするのに最適になる
これを使って、ビジネスニーズに合わせて拡張できる

## 電子メールの添付ファイルをOneDrive for Businessに保存するフローを作成してみよう
* 添付ファイルを検索するのに時間かかる　→　すべての電子メール添付ファイルをMicrosoft OneDrive for Businessアカウントのフォルダに保存するフローを作成して手間をなくそう

1\. テンプレートのリストから「Office 365の電子メールの添付ファイルをOneDrive for Businessに保存する」を検索し、テンプレートをクリック

2\. 画面下部のCreate Flowをクリックしてフローを作成

* 「Office 365の電子メールの添付ファイルをOneDrive for Businessに保存する」は、ワンクリックテンプレートの１つ。このテンプレートでは、コードを１行も書かなくて済むように、フローの作成に必要な質問に回答することができる

* テンプレート画面には、テンプレートの機能と成功するために必要なことについての説明がある
* Microsoft Office 365 OutlookおよびMicrosoft OneDrive for Businessサービスの資格情報の提供を求められる
→　両方のサービスを利用している場合は、不要

    * このフローは、添付ファイルを取得するために職場の電子メールに接続する
    * その後、OneDrive for Businessアカウントにフォルダが作成され、職場の電子メールアドレスに送信されるすべての添付ファイルがそのフォルダに自動的に保存される

* 上記操作でフローが作成されたので、[Edit]をクリックして、作成された内容の詳細を確認する
* フロービルダーからトリガーとアクションをクリックして、このフローがどのように構築されたかを確認できる

## Microsoft Power Automate の重要な概念
* フローを作成するときは、次の概念を念頭に置いてください。
    * トリガー
        * トリガー　＝　フローの開始アクション
        * 受信トレイに届いた新しい電子メールやSharePointリストに追加された新しい項目などがトリガーになれる
    
    * アクション
        * トリガーが呼び出されたときに実行させるもの
        * たとえば、新しい電子メール トリガーでは、OneDrive for Businessで新しいファイルを作成するアクションとかメールの送信、ツイートの投稿、承認の開始などがある

* アクションのタイプ
    * ループ – フローの次のステップに進むために条件が満たされるまでアクションを実行
    * スイッチ – 入力値から当てはまるケースを識別し、実行
    * Do Until – 指定した条件に一致するまで(trueになるまで)アクションのブロックを実行
    * 各品目に適用する(Apply to each) – 入力配列の各品目についてアクションのブロックを実行
    * 式(Expressions) – フロー作成者が記述できるフロー内のロジックを定義

* また、CSVテーブルの作成、結合、選択など、データ操作をフロー内で実行することもできる

## フローのトリガーまたは実行
トリガーの定義に関するタイプ
* 変更があった場合
    * データが変更されたときに実行されるトリガー
    * 例）SharePointで新しい品目が作成されたり、Dynamicsでリードが更新されたり、イベントがOutlookから削除されたりした場合など。

* スケジュールに従う
    * １日の特定の時刻に、繰り返しでトリガーされるフロー
    * 例）保留になっているアカウントの更新の有無を毎日午前８時に確認し、更新がある場合は必要な人々にメールを送信するというプロセス

* ボタンを押下した場合
    * モバイル アプリでフロー仮想ボタンを押したとか、サード パーティのオプションを使用して物理的なボタンをクリックした場合とか、または、Power Appsの中でボタンを押した場合など
    * ユーザーはオンデマンドでのフローの「実行」を制御できる
【AWS】自動デプロイ後にアクセスしたら502 Bad Gateway

## 結論
deploy.rbに記載ミスがあった。
なんとこれだけです。

## 経緯
AWSへのデプロイに初挑戦。
手動でのデプロイ時点では上手く行っていたのに自動デプロイを試みると502 Bad Gatewayとエラー。
なんじゃこりゃ、、、？


## 502 Bad Gateway とは
とりあえずググってみた。

```
502 Bad Gatewayとは、ウェブサイトのサーバーの通信状態に問題があることを示すエラーメッセージです。
以下のようなエラー画像が表示されます。
```
参考：https://blog.hubspot.jp/502-bad-gateway

通信状態？　
AWS側の不具合やらこっちのWifiが原因ってことかな？
、、、ってそんなわけあるかーーー！


## 原因
以下の記事を参考に原因究明。
https://qiita.com/kana_web/items/638a5d605870558879a4

こちらの記事から、ファイルとディレクトリの位置関係を洗い出すことに。


### currentディレクトリに移動できるか確認してみる
```　:ターミナル（EC2内）
[ec2-user@ip-〇〇 furima]$ cd current
-bash: cd: current: No such file or directory
```
早速異常を発見。
currentディレクトリに移動できない。

### 1つ前のディレクトリの中身を確認してみる
```　:ターミナル（EC2内）
[ec2-user@ip-〇〇 furima]$ cd /var/www/
[ec2-user@ip-〇〇 www]$ ls
furima furina
```
なんか2つできちゃってる！！！
、、、ん？
、、、なんかよく見たら、、、furi「na」!?

、、、はい。原因これでした。

## 修正作業
deploy.rbを修正。
 ```　ruby :config/deploy.rb
set :application, 'furima' 
#'furina'だったものを修正
```
、、、以上！！！
たったこれだけのことに悩まされていたのね。
ま、そんなもんか！！！

あとはGitHubにコミットとプッシュをして、ローカルで自動デプロイを実行すれば終わり！

あースッキリした。
Oracle Analytics Cloud ： 分析を始める。DataVisualizationで作成した表形式のビジュアライゼーションでデータ書式を設定する。

はじめに
---
Oracle Analytics Cloud ： DataVisualizationで作成した表形式のビジュアライゼーションでデータ値の表示形式を3桁区切りや、
整数表示にしたいといった場合、数値書式を設定します。
数値書式を設定するにはプロパティ・ペインというプロパティを設定するウィンドウを利用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/57b72863-8469-34d2-ad6e-133df29fe191.png)

記事記載時のOAC ver：Nov 2022 Update

前提
---
Data Visualizationでワークブックを作成したことがある
作成したワークブックが保存されている


表形式のビジュアライゼーションのプロパティを見る
---
ワークブックを開きます。
OACのURLにアクセスすると表示されるホームページで、左上部のメニューをクリックします。メニューが左に表示されますので、カタログをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/057fe622-3d98-fcfb-3ede-54e8f26ceba3.png)

保存しているワークブックをクリックします。もしくはワークブックの左下の隅にある「・・・(縦)」をクリックし、メニューから"開く"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/194b5add-d3a7-cce5-e2ea-5f447fe5f4f3.png)

編集モードに変更します。上部メニューから"編集"アイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/fc91eb53-a7a7-7d57-8645-ad9f3af75886.png)

左下部にプロパティ・ペインというウィンドウがあります。小さく表示されている場合は適宜、ウィンドウの境界付近にマウスカーソルを置くと、拡げることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/46c3137d-2b04-b9c0-43da-d34b8c271f0b.png)

ビジュアライゼーションや、データセットの列をクリックすると、プロパティ・ペインも、そのクリックしたものに合わせて反映されます。QUANTITY_SOLDをクリックすると、以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/1755bde6-9892-79e7-7a04-0555fc92750e.png)

ビジュアライゼーションをクリックすると、そのプロパティが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/a5462eaf-4536-a65b-9f3a-74d2b3aa8b2f.png)

プロパティ・ペインで書式を設定する
---
データ書式を通貨に変更して、3桁区切りにします。
プロパティ・ペインで、上部がタブになっています。その左から４番目の"#"をクリックします。"AMOUNT_SOLD"の数値書式が自動になっています。数値書式の"自動"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/2c23cb8d-4a68-312d-bb78-38a1e6952924.png)

"通貨"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/d37579b5-7e26-950a-7391-27aa48c02033.png)

"数値書式"の下が"通貨"にかわります。USD/$からJPY/\\に変更します。
3桁区切りが"1,234"、小数点が"0"になっていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/5c4ffc3c-28b6-e451-d6f2-26b6366485e3.png)

データ書式が通貨に変更され、3桁区切りになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/952ac643-4125-67ff-5b17-dc224d412994.png)

プロパティ・ペインは、本記事のデータ書式や、そのほか、タイトルの変更、フォントサイズ、色の変更、背景色、背景イメージの変更、小計、中計、総計の追加など、たとえばビジュアライゼーションなど選択したものに対して、細かな設定を行う際に利用します。

以上
複数のファイルをまとめてzipにする方法

圧縮したいフォルダが既にある場合は5番から始めてください
### 1. Finderを開く
Finderというアプリを開きます
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540178/7c672776-3738-a10d-e583-d6593f71cb31.png)

### 2. 任意の場所を開きます
今回は`デスクトップ`を開きました
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540178/b74735d3-e007-038d-6f75-17869f9ed348.png)

### 3. フォルダを作成します
何もない場所を右クリックして、`新規フォルダ`を押します
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540178/afe1a5c0-fc97-4850-48d9-86e65f661c09.png)
`名称未設定フォルダ`が作成されるので、名前を変更します
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540178/484b52ff-2f6c-6045-238e-b4df912a79b5.png)
フォルダを右クリックして、`名前を変更`
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540178/a07c9364-a5ab-046b-aac4-884ff8f8a568.png)
新しい名前を入力します
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540178/dd989d48-89c7-1f91-973c-2eef32602ebb.png)

### 4. 中身を用意する
まとめたいファイルをフォルダの中に入れます
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540178/d310e1dc-d5c9-f822-d16a-752bb0d5917e.png)

### 5. zipにする
zipにしたいフォルダを選択し、`"フォルダ名"を圧縮`を選択します
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540178/8c12b77c-a59a-333c-d989-002420a40eb6.png)

### 6. 完了
これでzipファイルを作成することができました
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540178/ae2fab68-88aa-7902-f578-521ffc90e713.png)
ES Lintの導入

## 本記事を読んでできること
+ ES Lintを導入できる

## ES Lintとは
+ https://eslint.org/

## 環境
+ Windows10 Pro 64bit
+ Node.js v16.17.1

## 手順
1. Node.jsをインストールします。
    [Nodejsのダウンロード](https://nodejs.org/ja/download/)

1. ターミナルを開き、以下のコマンドを実行してESLintをグローバルにインストールします。
    ```
    npm install -g eslint
    ```

1. プロジェクトのルートディレクトリに移動し、以下のコマンドを実行してプロジェクトにESLintをインストールします。
    ```
    npm install eslint --save-dev
    ```

1. 以下のコマンドを実行して、ESLintの設定ファイルを作成します。
    ```
    eslint --init
    ```

1. package.jsonに以下を追加
    ```
    "scripts": {
        "lint": "eslint ."
      },
    ```

1. 設定が終わったら、以下のコマンドで実行
    ```
    npm run lint
    ```
[HTML]canvasまとめ

# 基本
```html
<canvas id="hoge" width="" height=""></canvas>
```

以降JSから操作する。
タグ内に置いた要素は代替コンテンツとなる

# 描画
キャンパスは二次元とする。

```js
var context = canvas.getContext('2d');
```

以降contextを操作することで描画する

## 図形の描画

次の処理に使う線や塗りの色を指定する。

```js
context.fillStyle = "color"; // 塗り
context.strokeStyle = "color"; // 枠線
```

### 長方形

長方形のみ関数が用意されている。
`x`と`y`は図形の左上の頂点がある座標を示す。

```js
context.fillRect(x, y, width, height); // 塗りのみ
context.strokeRect(x, y, width, height); // 枠線のみ
```

パスを作成することで様々な図形の描画ができる。

```js
# パスの作成
context.beginPath(); // 新しいパスを作成（既存のサブパスのリストを消去）
context.moveTo(x, y); // 最初のサブパスを作成
```

`beginPath()`を使わない場合、ひとつ前に描画したパスを引き継いでしまう。そのため特に理由がないなら空にする。
`moveTo()`は二点間を移動しているような名前だが、実際にはサブパスを追加する操作だと思う(`addSubPath()`でよくね？)

サブパスを追加しつつ、ひとつ前のサブパスとの間を描画する関数もある。

```js
context.lineTo(x, y); // 直線
```

最後に、追加したサブパスを使って図形を描画する。
この際、描画される線は`lineTo()`で追加したサブパスのもののみとなる点に注意。

```js
context.closePath(); // 最初と最後のサブパスをつなぐ
context.fill(); // 塗りのみ
context.stroke(); // 枠線のみ
```

`closePath()`をしないと、最初と最後のサブパスの間の辺が描画されないので注意。
`fill()`のときは自動で閉じられる。

描画の消去もできる。

```js
content.clearRect(x, y, width, height) // 指定領域の削除
```

---

### 円・円弧

```js
arc(x, y, radius, startAngle, endAngle, counterclockwise);
```

`startAngle`、`endAngle`はそれぞれ開始・終了地点の角度を示す。**ラジアンで示す**点に注意。

ラジアンで示す際は、整数ではなく`Math.PI * radian`で表す。
たとえば円なら`0, Math.PI * 2`となる。
`counterclockwise`は反時計回りで描画するかどうかを決定する。`false`を与えると時計回りになる。

余談だが、`arcTo()`という関数もある。
[CanvasRenderingContext2D.arcTo()](https://developer.mozilla.org/ja/docs/Web/API/CanvasRenderingContext2D/arcTo)

```js
context.arcTo(x1, y1, x2, y2, radius);
```

こちらは少し扱いが難しいが、引数で指定した二点の線分、サブパスと`x2, y2`が示す点をつなぐ線分の二つの線分の間で作用する関数。
CSSの`border-radius`みたいなかんじ。

以下に示すベジェや二字曲線も同じ感覚で扱う。

### ベジェ・二字曲線
詳しくは[ここ](https://developer.mozilla.org/ja/docs/Web/API/Canvas_API/Tutorial/Drawing_shapes#%E3%83%99%E3%82%B8%E3%82%A7%E3%81%A8%E4%BA%8C%E6%AC%A1%E6%9B%B2%E7%B7%9A:~:text=Live%20sample-,%E3%83%99%E3%82%B8%E3%82%A7%E3%81%A8%E4%BA%8C%E6%AC%A1%E6%9B%B2%E7%B7%9A,-%E6%AC%A1%E3%81%AB%E8%A6%8B%E3%81%A6%E3%81%84)。（丸投げ）

```js
context.quadraticCurveTo(cp1x, cp1y, x, y); // 制御点1つ
context.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); // 制御点2つ
```

## パスの記録
ここまでは`context`に対して直接描画していたが、`Path2D`オブジェクトに描画したものを描画する事ができる。これにより、パスの記録と再利用ができる。

```js
let hoge = Path2D(); // Path2Dオブジェクトの作成
hoge = rect(10, 10, 50, 50); // パスを設定
context.stroke(hoge); // 描画
```

# 参照
[キャンバスでの図形の描画 - MDN web docs](https://developer.mozilla.org/ja/docs/Web/API/Canvas_API/Tutorial/Drawing_shapes)

[HTML Canvas 入門 - Qiita](https://qiita.com/kyrieleison/items/a3ebf7c55295c3e7d8f0)
Cupyのインストール・環境構築[Windows10]

# 目次
- 環境
- 事前準備
- Cupyインストール
- 参考文献

# 環境
- Windows10
- Anaconda22.11.1
 → python3.9.13

# 事前準備
- グラフィックドライバのアップデート
タスクトレイにあるNVIDIAアイコン上に，「NVIDIA GeForce Experience」が出れば更新しておく必要がある．

- CUDA Toolkitのインストール
GPU上で計算するためには，NVIDIAが提供している「CUDA」が必要になる．
現在（20230119）までに，CupyがCUDA12.0に対応できておらず，CUDA11.8までの対応になっていることに留意する必要がある．
以下のアーカイブサイトからダウンロード可能
→ [CUDA Toolkit Archive](https://developer.nvidia.com/cuda-toolkit-archive)

# Cupyインストール
```
$ python -m pip install -U setuptools pip #インストーラーの更新
$ pip install cupy-cuda11x                #CUDA11.Xに対応させる
```

上記によりイントール完了されるはずだが，私の環境ではここでCupyをインストールできず．調べてみると，Anacondaでは別の方法が提案されていた．下記の方法を試した．
初めにCUDA11.8をインストールしてしまったので，干渉している可能性もあるのだが，実際にpython上でcupyが使えたことから，環境構築に成功したと判断した．
この場合のCupyとCUDAの関係性については後々確認したい．
```
$ conda install -c conda-forge cupy

>>> cudatoolkit 11.1.1
    cupy        11.4.0
```

# 参考文献
- インストール関連
[Cupy公式HP](https://docs.cupy.dev/en/stable/install.html)
[CuPy 10.2 のインストール（Windows 上）](https://www.kkaneko.jp/tools/win/cupy.html)
[NVIDIA ドライバ，NVIDIA CUDA ツールキット 11.8，NVIDIA cuDNN v8.6 のインストールと動作確認（Windows 上）](https://www.kkaneko.jp/tools/win/cuda.html)
[【Windows10】CuPyのインストール](https://qiita.com/BARANCE_TW/items/30abf85c55070a2bdc9d)

- Cupyについて（使用例・利点など）
[CupyとNumpyのパフォーマンスを比較してみた](https://segafreder.hatenablog.com/entry/2017/12/02/210452)
[NumPy互換GPUライブラリによるPythonでの高速計算](https://www.nvidia.com/content/apac/gtc/ja/pdf/2018/1021.pdf)
【GitHub】fatal: destination path 'ファイル名' already exists and is not an empty directory.を解決




# [概要]
gitでプルリクしたコミットの動作確認するために、cloneしようとしたら下記エラー


## ぶつかったエラー

```
fatal: destination path 'redelivery-app' already exists and is not an empty directory.
```

翻訳・意味
致命的: 宛先パス 'redelivery-app' は既に存在し、空のディレクトリではありません。


## 原因
'redelivery-app'とゆう同じファイル名にcloneしようとしていたので、別のフォルダにcloneしてとのこと

## やったこと
1.desktopにcloneファイルを作成
2.ターミナルで `cd clone`に移動
3.`git clone gitからコピーしたURL`を実行


## 結果
cloneファイルにcloneできました。




わかったことがあれば追記していきたいと考えています。
間違った認識などあれば教えて頂けたら嬉しいです🙇

## 追記
【Python】Pythonでディレクトリ（フォルダ）を作成する方法（os.makedirs）

## 背景
- `Python`の`code`内で新しいディレクトリ（フォルダ）を作成したい場合があります。
- `Python`で新しいディレクトリを作る方法として、[`os.mkdir`](https://docs.python.org/ja/3/library/os.html)と[`os.makedirs`](https://docs.python.org/ja/3/library/os.html)がありますが、どちらも既にディレクトリが存在している場合は`FileExistsError`（既にファイルが存在している）というエラーが出ます。
- 作成したいディレクトリが存在するかどうか判定し、存在していれば何もしない。存在していない場合は、ディレクトリを作成する。というプログラムの作り方を紹介します。

## 目標
- `os.makedirs`を使用し、ディレクトリが存在しない場合にのみディレクトリを作成するプログラムを作る。

## ディレクトリの存在の有無を確かめて、存在しない場合にのみディレクトリを作成する方法
- `make_dir_path`に作成したいディレクトリ`path`を代入します。
- `os.path.isdir`を使用し、作成したいディレクトリが存在するかどうかを判定します。
- `if`を用いて、存在しない場合に`os.makedirs`でディレクトリを作成するようにします。

```python:ディレクトリの存在の有無を確かめて、存在しない場合にのみディレクトリを作成する方法
import os

#作成するディレクトリのpathを指定
make_dir_path = './01_example_dir'

#作成しようとしているディレクトリが存在するかどうかを判定する
if os.path.isdir(make_dir_path):
    #既にディレクトリが存在する場合は何もしない
    pass
else:
    #ディレクトリが存在しない場合のみ作成する
    os.makedirs(make_dir_path)
```

## 参考資料
https://docs.python.org/ja/3/library/os.html

## 個人ブログ

https://takuma-tech.com/2023/01/20/384/
プリザンターのスタイルタブにて、「複数選択」を設定した分類項目のスタイル設定を維持したい

 # はじめに
プリザンターには任意でスタイルを設定することができます。プリザンターの管理画面にて、スタイルタブでCSSを記述しますと設定が適応され、表示形式を変更することができます。例えば、色や幅など・・・。分類項目に複数選択可能な状態でCSSを記述したが、設定が反映されなかった。そのため、複数選択にしてスタイルの設定を反映させたい。

 # ソースコード
```css

#Results_ClassA_ms{
    width:300px !important;
}

```

 # 工夫
今回は分類A項目を複数選択にして、スタイルで幅を300pxに設定した状態を維持するようにCSSを書いた。競合が発生していたので、こちらの設定を最優先にするよう「!important」を記述。これによって、問題なくスタイルが維持されました。
OpenCVの解像度設定は1度出来なかったからと言って諦めてはいけない(戒め)

# 背景
産業用のMV-CE050-30UCというUSB3のカメラでOpenCVによる画像処理を行いたかった。
デフォルトで対応していないと思い込んでいろいろ試行錯誤した後、
非常に簡単に対応させる手順が用意されていた。
なんとかOpenCVで画像が出て喜んだものの解像度が640 x 480。最大解像度まで上げたい。
メーカー標準のビューワーやGraphEditでは解像度変更は可能だった。
最大解像度は2592 x 1944、設定間隔は横16、縦2ずつの模様。
設定ファイル的なものは見つからず、どうやらプログラムから変更するしかないようだが・・・

# 実行環境
| モジュール | Ver | 備考 |
|:-:|:-:|:-:|
| python  | 3.10.0  |   |
| opencv-python  | 4.7.0.68  |   |
| numpy  | 1.24.1  | opencv-pythonインストール時に自動でインストールされたもの  |
| MVS  | 3.1.0  |MV-CE050-30UCのデバイスドライバのインストールとユーティリティ|

# 実施内容
OpenCVから解像度を変更した


## デフォルト時を確認
```python:デフォルト時　→　画像は取れる
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
print(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
```
```:出力結果
640.0
480.0
```

## 1600 x 1600で試した結果→エラー
```python:1600x1600に変更
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1600.0)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1600.0)
print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
print(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
```
```:出力結果
0.0
0.0
```

## CAP_PROP_SETTINGSによる変更　→　変更してもデフォルト値に戻る
```python:デフォルト時
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
cap.set(cv2.CAP_PROP_SETTINGS)
cv2.waitKey(0)
print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
print(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
```
```:出力結果
640.0
480.0
```

## OpenCVのバージョン変更　3.7　→　3.6

pipで入れたopencv-pythonをアンインストールして
chocoで入れた3.6への環境変数PYTHONPATHを設定してみた。
っが結果は変わらなかった。設定が反映されない。

## その他実施するなら・・・
・原因がよくわからないもののOpenCV側に問題がありそうなだったのでOpenCVの自前ビルド
・EWCLIBというものを使う案もあるらしい

# 成功例
どこで失敗するのか確認しながらやみくもにコピペしたら成功してしまった。
```:諦めきれずにセット時の結果を確認しながら２回設定してみた
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
print(cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1600.0))
print(cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1600.0))
print(cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1600.0))
print(cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1600.0))

print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
print(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
```
```:2番目
True
False
True
True
1600.0
1600.0
```


# まとめ
1度失敗したからと諦めてしまうのは良くない。
3回くらいはチャレンジしてみるものです。

標準のソフトでも現状最大解像度はfps30は出ないので概ね他と同じ状態になった。
なんで失敗するの？について根本的な原因は不明です。
猫先生のツイートを取得してLINEに通知するテンション爆上げなツールを作ってみた


# 猫先生とは？
「Re:ゼロから始める異世界生活」の作者：長月達平先生の愛称です。   
https://ja.wikipedia.org/wiki/Re:%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E5%A7%8B%E3%82%81%E3%82%8B%E7%95%B0%E4%B8%96%E7%95%8C%E7%94%9F%E6%B4%BB

# このツールの目的
##### 目的は「最新話がアップされたことを知る」
[小説家になろう](https://syosetu.com/)　というサイトで絶賛連載中のRe：ゼロですが、
最新話の更新日については特に決まっておらず、完全な不定期、神出鬼没です。
ただ、「最新話書いたから○○時にアップするね」的なことをご自身のTwitterで呟かれていることを知り、
じゃあそのツイート取得して通知するようにすれば、いちいちサイト巡回しなくてもいんじゃね？
と考えたことがきっかけでした。。（サイト巡回してた時期がありました・・・


## 処理の流れ
やっていることはシンプルで、

EventBridgeで毎朝2:00にLambdaを起動
　　　　　　　　⇩
猫先生の最新ツイート（10件）を取得
　　　　　　　　⇩
ツイート本文に「更新しました」という文字列が含まれているかチェック
　　　　　　　　⇩
含まれている場合：DynamoDBに同じツイートIDの登録が無いか確認
　・あれば既に通知済のツイートなので処理を終了
　・無ければ未通知のツイートなのでLINEに通知

```main.py
    import re
    import tweepy
    import settings
    import line_notify as notify
    import dynamodb_function as dynamodb

    def lambda_handler(event, context):
     
         # 環境変数を設定
        con_key = settings.con_key
        con_sec = settings.con_sec
        acc_tok = settings.acc_tok
        acc_sec = settings.acc_sec
     
     
        auth = tweepy.OAuthHandler(con_key, con_sec)
        auth.set_access_token(acc_tok, acc_sec)
     
     
        api = tweepy.API(auth)
     
     
        #タイムラインを取得し、1ツイートずつループ
        # 「更新しました」という文字列が含まれているかどうか判定し、Trueの場合のみツイートを表示する
        for status in api.user_timeline(id="@｛ここにツイッターID｝"):
            if re.search("更新しました", status.text):
                
                #ユーザ名表示
                print('name:' + status.user.name)
                #内容表示
                print(status.text)
                
                # DBにツイートIDを見に行く
                res_id=dynamodb.db_get_item(status.id)
                
                if res_id:
                    print("登録済み")
                else:
                    # TweetIDをDBへ登録
                    dynamodb.db_put_item(status.id, status.text)
                    try:
                        api.create_favorite(status.id)
                        api.retweet(status.id)
                    except:
                        print("リツイート済み")
                    
                    # LINEに通知
                    notify.send_line_notify(status.text)
                
            else:
                pass
```
### 説明
##### api.user_timeline(id=”@｛ここにツイッターID｝”)　
ここで取得したいツイートのTwitterアカウントIDを指定しています。

##### if re.search("更新しました", status.text):
ツイートに「更新しました」という文字列が含まれていた時、status.id （全てのツイートに割り振られているID）をもとに同じIDのツイートが登録されているかどうかをチェック。
未登録であればレコードを登録して、LINEにツイート内容を通知。

ここでツイートIDをチェックする理由は、CRONで毎日自動実行しているので、同じツイートを取得してしまった時に再度LINEに通知することを防ぐためです。

# 条件にあったツイートを取得すると・・

![Screenshot_20230119-104901_LINE.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424984/cc469ead-9cb3-2a6c-c1ac-a4795f6b7226.jpeg)


# キターーーーーーーーー（テンションMAX）


以上です。
知らないうちにモネロコインの採掘に使われてきたRedisサーバーを探索してみた

# １．はじめに
**Redis**は、Remote Dictionary Serverの略語で、key-value構造の非定形データを保存・管理するための非リレーショナルデータベース管理システムです。[**非構造化データ**](https://ja.wikipedia.org/wiki/非構造化データ)とは固定された構成の原則がなく、フィルタリングされていない原始データ（raw data）で、ウェブ・ログ、XML、JSON、イメージ、テキスト文書、オーディオおよびビデオファイル等、多様な形式が含まれます。

Redisは非同期レプリケーションを支援し、複数のサーバーに同じデータのコピーを維持できるという長所を持っています。これによって、主なサーバーに障害が発生する場合、いろんなサーバーにリクエストが分散され、向上した読み取りや早い復旧が可能になるので、多くの使用者らが利用しているシステムです。

# ２．漏えいされたRedisサーバー、コイン採掘悪性コードを配布してる
本投稿は攻撃者が認証設定が不十分なRedisサービスが実行されているサーバーにアクセスし、**Bitcoin Miner**でサーバーを感染させる事例について説明します。

まずは、セキュリティOSINT検索エンジン、[**Criminal IP**](https://www.criminalip.io/ja/) を通じて "product: redis"キーワードを検索し、外部に漏えいされたRedis Productの情報を確認できます。
> _**Search Query:**_ [_**"product: redis"**_](https://www.criminalip.io/ja/asset/search?query=product%3A+redis)
https://www.criminalip.io/ja/asset/search?query=product%3A+redis
![redis_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003594/1d26d7dc-d77d-998f-6117-cabfb670cc57.png)
検索した結果、11,552件の漏えいされたサーバーが検索されます。

国家ごとに見ると、最も多く漏洩されたRedisシステムを使用している国は中国で、日本は8番目で多く漏洩されたRedisシステムを使用していることが明らかになりました。
> _**Element Analysis:**_ [**country**](https://www.criminalip.io/ja/intelligence/element-analysis/search?query=product%3A+redis)
https://www.criminalip.io/ja/intelligence/element-analysis/search?query=product%3A+redis
![redis_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003594/80eeac06-6f4c-394c-da5e-d7e45982d40e.png)
中国が漏えいされたRedisサーバーを一番多く保有しています。

# ３．認証が不十分な状態で漏えいされたRedisサーバー
redis_cli [target_ip]で活性化されたRedisサービスにアクセスする際、認証装置が揃っている所なら、次のような文句が出力されます。
> _**"[ERROR] NOAUTH Authentication required"**_
![redis_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003594/0b36c719-a08c-8dc3-80ac-fc59b8f8f563.png)
文句が出力される安全なRedisサーバー

しかし、認証装置が設定されていない場合、下の画像のように別の認証過程を通さず、直接アクセスができ、「keys *」を通じて漏洩されるデータを確認できます。
> ![redis_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003594/8f666c16-cdbd-0883-dd3a-819a70cff629.png)
認証が不十分なRedisサーバーにアクセスした画面、「keys *」を通じてデータが漏えいされます。

# ４．モネロコイン採掘悪性コードに感染した漏えいされたRedisサーバー
該当サーバーの特定データにアクセスしてみると、次のように「cleanfda」で続く怪しいパターンが共通的に発見されます。
> ![redis_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003594/d00c31d3-4bdb-d7e6-2f60-bbe0663bb679.png)

[**Criminal IP ドメイン検索**](https://www.criminalip.io/ja/domain)機能を使って上記ドメインの詳細情報を検索してみたところ、該当ドメインにbash shell scriptで組まれたscriptがあることが確認されました。
> ![redis_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003594/6827790b-6194-fa3a-fff2-5a7be56e252b.png)
Criminal IPで漏えいされたRedisサーバーから発見された怪しいURLを検索してみたら、bash shell scriptで組まれていました。

該当URLにアクセスしてこのbash shell scriptをもっと詳しく見ると、**このサーバーでモネロコイン採掘スクリプトが実行されていることが確認されました。**
> ![redis_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003594/e014a1d7-9ae0-a260-fb6c-f756732c17f5.png)

# ５．おわりに
運営しているRedisサーバーがコイン採掘に悪用されないよう防ぐために、セキュリティ担当者は次のようにセキュリティ設定を行う必要があります。
* DockerでRedisサービスをバインディングする際、Default IPの使用を禁止すること（0.0.0.0ではなく127.0.0.1）
* ファイアウォール設定を確認し、非正常的なアクセスをするIPはブロックすると共に、認証された使用者がホワイトリストIPになっているか点検すること
* 保有しているRedisサーバーが漏えいされているのではないか、認証装置が欠落していないかを定期的に点検すること
(AWS) NAT Gatewayの監視方法について

NATGWの監視方法について

* NATGWのモニタリング項目
    * https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-nat-gateway-cloudwatch.html
        * **BytesOutToSource** の値(単位: Byte)が **BytesInFromDestination** の値より少ない場合、NAT ゲートウェイの処理中、またはトラフィックが NAT ゲートウェイによりアクティブにブロックされている間に、データ損失が発生する可能性があり
            * [Metric Math を使用する](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/using-metric-math.html)
            * [メトリクスの数式に基づく CloudWatch アラームの作成 ](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Create-alarm-on-metric-math-expression.html)
        * **PacketsOutToDestination** の値(単位: 個)が **PacketsInFromSource** の値よりも小さい場合、NAT ゲートウェイの処理中にデータ損失が発生する可能性があります。
        * **PacketsDropCount**
            * NAT ゲートウェイによって破棄されたパケットの数。値が 0 より大きい場合は、NAT ゲートウェイで進行中の一時的な問題を示している可能性があります。この値が NAT ゲートウェイ上の総トラフィックの 0.01% を超える場合は、[AWS service health dashboard](http://status.aws.amazon.com/) をチェックしましょう。
PowerShell なんちゃってクリックワンス(新旧比較なし)

## `概要`
##### 今回クライアントからツール(VBA)をユーザーが意識せず常に最新版を実行したいとの要求があり、メールなどで展開ではなくWEBサーバー上のファイルを自動でダウンロードして実行する仕組みを考察
## `要件`
:::note info
①ユーザーは常に一つのファイルしか実行しない
②ツールに改修が入った場合でも配布することなく最新版が実行出来る
③VisualStudioなど使わずPowerShellで実現する
:::
## `実装`
:::note info
①WEBディレクトリに対象ファイルを配置
②テキストファイルに以下コードを貼り付け.ps1で保存
:::


```powershell:ps1
#-- 多重起動防止
    if((Get-Process|Where-Object{$_.MainWindowTitle -like '*test.xlsm*'}).Count -gt 0)
    {
        Exit
    }

#-- Excelファイルをダウンロード
    Invoke-WebRequest -uri http://~/test.xlsm -outfile .\test.xlsm

#-- 終了遅延
　　Start-Sleep -s 2

#-- Webのマークを削除する
　　Get-ChildItem -Recurse -File | ?{
　　  $_ | Get-Item -Stream Zone.Identifier -ErrorAction Ignore;
　　} | Remove-Item -Stream Zone.Identifier;

#-- VBA起動
try {
    $excel = New-Object -ComObject Excel.Application
    # 表示する・しない            
    $excel.Visible = $false
    # ブックを開く                                     
    $book = $excel.Workbooks.Open([string](Resolve-Path (Get-ChildItem "*.xlsm")))
}
finally {
    # プロセスを開放する
    $excel = $null
    [GC]::Collect()
Exit
}
```
Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「Azureサブスクリプションの取得方法」

Microsoft Learnを用いたMicrosoft Azure Administrator(AZ-104)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始め、AZ-900取得後の資格としてAZ-104取得を目指している方の参考になれば幸いです。
※AZ-900の内容は本投稿では省略しております。再度復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：試験合格に向けた学習内容のまとめ](https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8)

## 今回の学習内容
**◆「Azureサブスクリプションの取得方法」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure での ID とガバナンスの管理](https://learn.microsoft.com/ja-jp/training/paths/az-104-manage-identities-governance/)
◇対応するモジュール
[Azure サブスクリプションを取得する](https://learn.microsoft.com/ja-jp/training/modules/configure-subscriptions/4-obtain-subscription)

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「Azureサブスクリプション」](https://qiita.com/fsd-jume/items/d5a1e10f9cde21e84c86)

## Azureサブスクリプションの取得方法
### Azureサブスクリプションの取得方法
**◆エンタープライズ契約(EA：Enterprise Agreement)**
・大規模で長期間使用する法人向けの契約
・3年間の料金を見積もりして前払いで契約(超過した場合は超過分を請求)
・ボリュームライセンスで契約

**◆Azureインオープンプラン**
・Microsoftリセラーから法人のみ購入可能
・100ドル単位のプリペイド方式で利用可能(認証後12か月間有効)
・残高不足時はいつでも追加可能

**◆CSP(Cloud Solution Provider)契約**
・CSPプログラムに登録しているCSPパートナーが直接/間接的にAzure利用を仲介
　-Directパートナー：直接顧客と契約し、Azure利用をサポート
　-InDirectパートナー：顧客との間にリセラーが入り、Azure利用をサポート
・従量課金制の法人向け契約
・管理や技術面などのサポートはCSPパートナーが提供
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/a849c12b-1ffe-69e2-79c2-6b0bfc98b0f7.png)

**◆MOSP(Microsoft Online Subscription Program)**
・個人も利用可能な唯一の契約
・クレジットカードの登録が必要な従量課金制
・初回であれば無料枠を使用可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/3c75bc16-0142-99c5-f57a-3316b3ed72f3.png)

## 次の学習内容
**◆Azureサブスクリプションの選択**

https://qiita.com/fsd-jume/items/d393f76e0da4f5bea00b

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
docker-composeのログローテーション

## はじめに

dockerのログは放っておくとどんどん溜まります。
そのうち、ホストを圧迫して・・・死にます。

ということで、docker-composeをつかっているなら、docker-compose.yamlに次のように書いてログをローテーションしましょう。

```yaml:docker-compose.yaml
services:
  my-app:
    build: .
    logging:
      driver: json-file
      options:
        max-size: 1m
        max-file: '3'
```

## 説明

`logging`の`options`に`max-size`と`max-file`を指定します。
`max-size`あたりでログがロールオーバーされ、`max-file`の数だけログ保持されます。

## 疑問点

ログは、`docker-compose logs`や`docker logs`コマンドで確認しますが、ロールオーバーされた古いログはどう扱われるのでしょうか。

## 検証

とりあえず、stdoutにベラベラ出力するコンテナを作成します。

```Dockerfile
FROM alpine

CMD seq 100000001 100500000; sleep 300
```

100000001から100500000まで9桁の数字を出力するので、出力1行あたり10Byteです。
500000行出力するので、出力は5MBになるはずです。

ビルドして実行してみます。

```sh
docker-compose build
docker-compose up -d
```

ログの実体を確認してみましょう。

```
# cd /var/lib/docker/containers/5671d9b180b36d67e0d7aa4418b2f91d7249e163829016c37b927871b3d696f7/

# ls -lh *log*
-rw-r----- 1 root root 921K Jan 17 15:44 5671d9b180b36d67e0d7aa4418b2f91d7249e163829016c37b927871b3d696f7-json.log
-rw-r----- 1 root root 977K Jan 17 15:44 5671d9b180b36d67e0d7aa4418b2f91d7249e163829016c37b927871b3d696f7-json.log.1
-rw-r----- 1 root root 977K Jan 17 15:44 5671d9b180b36d67e0d7aa4418b2f91d7249e163829016c37b927871b3d696f7-json.log.2
```

977KBでロールオーバーされて、現行のログファイルも含めて3つのログファイルが残っています。

一番古いファイルの先頭を見てみると、

```
# tail -n 3 5671d9b180b36d67e0d7aa4418b2f91d7249e163829016c37b927871b3d696f7-json.log.2
{"log":"100463168\n","stream":"stdout","time":"2023-01-17T06:44:26.117807532Z"}
{"log":"100463169\n","stream":"stdout","time":"2023-01-17T06:44:26.118047805Z"}
{"log":"100463170\n","stream":"stdout","time":"2023-01-17T06:44:26.118051124Z"}
```

こんな感じのJSONで保存されていました。
1MBでローテーションというのは、このJSON形式になったときのサイズで、stdoutに出力されたサイズではないようです。

では、logを見るコマンドではどのログが見えるのでしょうか。

```
# docker-compose logs | head -n 3
docker-log-test-log-test-1  | 100463168
docker-log-test-log-test-1  | 100463169
docker-log-test-log-test-1  | 100463170
```

3つのファイルのうち一番古いものから取り出しているようです。
では、最後はどうでしょうか。

```
# docker-compose logs | tail -n 3
docker-log-test-log-test-1  | 100499998
docker-log-test-log-test-1  | 100499999
docker-log-test-log-test-1  | 100500000
```

こちらは最新のログファイルの最後です。

ということで、docker-compose logsコマンドは、ロールオーバーの結果分割されたログを結合していい感じに見せてくれるようです。


では、docker logsコマンドはどうでしょうか。

```
# docker logs 56 | head -n 3
100463168
100463169
100463170

# docker logs 56 | tail -n 3
100499998
100499999
100500000
```

はい。こちらも、同様に分割されたログを結合していい感じに見せてくれるようです。

## まとめ

docker-compose.yamlに

```yaml:docker-compose.yaml
    logging:
      driver: json-file
      options:
        max-size: 1m
        max-file: '3'
```

と書いておくと、1MB毎にログをロールオーバーして、3つのファイルだけ残してくれる。

`docker-compose logs`や`docker logs`コマンドは分割されたログを結合していい感じに処理してくれる。
Google Meet中に自宅のネット回線が不調になる場合

# 初めに

こんにちは、2022年10月から在宅中です。
弊社では会議によく使う順にGoogle Meet、Teams、Zoomを使っています。
なぜかGoogle Meetを使っているとGoogleのサービス以外のインターネットにアクセスできなくなる魔の問題が時々発生していました。（時々ってのがたちが悪い）

同じ現象になっている人のために書き残しておきます。

# 使用機器など

ルーター：WSR-5400AX6S（Buffalo）
ブラウザ：Google Chrome

# 結論

ルーターのipv6自動判別をやめたら解消しました。

# 症状

理屈は良くわかっていませんが、Google Meet中にルーターが判別を混乱しているような挙動です。
再起動したら一時的に直ります。Google Meetに繋ぐとまた再発していました。

# 手順

http://192.168.11.1/ にアクセスします。
初期パスワードについては公式を参照してください。
Buffalo：https://www.buffalo.jp/support/faq/detail/15793.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662111/1cb55e71-0e4c-5786-77ef-ad022a452d22.png)

右下の詳細設定にクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662111/3abb9ae7-5ff7-2c7c-f32b-ef498e0ed975.png)

Internet -> Internet -> v6プラスを使用する or IPv6オプションを使用する（契約に合わせて選択してください）
「設定」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662111/46b3a91b-b6e5-a9bf-b3e7-5ca28a4c804d.png)


待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662111/61e75589-7c9f-aeea-4b67-c7b33d4ade69.png)

更に3分くらい待ちます。バッテンマークがなくなれば完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662111/6fbfcfaf-8432-a3dd-fb9b-338eb97a933b.png)

# その他

実は2022年10月にも同じ現象が起きました。
その時は、Internet -> IPv6 -> 「インターネット@スタートを行う」から「NDプロキシを使用する」に変更するだけで解消しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662111/5053a5d5-c8a5-c940-11b5-7f6e02ddab29.png)

３カ月後の今日、また同じような現象にあたりました。
恐らく自動判別とGoogle Meetの相性が悪いんだと思います。（Chrome＋MeetでIPv6周りで何かやってそう）