OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonにオーバーロードを実装する。

# はじめに
Pythonにはないオーバーロード。
`typing`の`@overload`も所詮は型チェッカー。引数の型に応じて分岐してくれる機能はない。
ならば作ってみよう。

追記
1/20 一応こんなものはあるけど、第1引数しか見てない？
[functools.singledispatch](https://docs.python.org/ja/3/library/functools.html#functools.singledispatch)

1/22 アノテーションありなし混合に対応。これによりクラスメソッドにも使用可能。

# オーバーロードの実装
```py
def overload(f):
    from inspect import signature, _empty

    if overload.__dict__.get("funcs") is None:
        overload.__dict__.update({"funcs": {}})
    annotations = tuple([(i, j.annotation) for i, j in signature(f).parameters.items()])
    if overload.funcs.get(f.__qualname__):
        overload.funcs[f.__qualname__].update({annotations: f})
    else:
        overload.funcs.update({f.__qualname__: {annotations: f}})

    def fork(*args, **kwargs):
        check = {}
        for anno, h in overload.funcs[f.__qualname__].items():
            d = dict(anno)
            if len(anno) < len(args) + len(kwargs):
                continue
            argcheck = {
                name: typ == _empty or isinstance(i, typ)
                for (name, typ), i in zip(anno, args)
            }
            kwargcheck = {
                name: d[name] == _empty or isinstance(i, d[name])
                for name, i in kwargs.items()
            }
            if all((argcheck | kwargcheck).values()):
                check[h] = len(d.keys() - (argcheck | kwargcheck).keys())
        if not check:
            raise NameError(
                f"name '{f.__qualname__}({', '.join([type(i).__name__ for i in args]+[':'.join([i, type(j).__name__]) for i, j in kwargs.items()])})' is not defined"
            )
        g = min(check, key=check.get)
        return g(*args, **kwargs)

    return fork

```

# 使い方
関数をデコレートするだけ。アノテーションは型名で。

```py
@overload
def f(a:list, b:str):
    return a, b

@overload
def f(a:int, b:int):
    return a + b

@overload
def f(a:list, b:tuple):
    return {b: a}
```

```py
f([1], "2") # -> ([1], '2')

f(1, 2) # -> 3

f([1], (2,)) # -> {(2,): [1]}

f("1", "2") # -> 
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In [3], line 1
----> 1 f("1", "2")

Cell In [1], line 30, in overload.<locals>.fork(*args, **kwargs)
     28         check[h] = len(d.keys() - (argcheck | kwargcheck).keys())
     29 if not check:
---> 30     raise NameError(
     31         f"name '{f.__name__}({', '.join([type(i).__name__ for i in args]+[':'.join([i, type(j).__name__]) for i, j in kwargs.items()])})' is not defined"
     32     )
     33 g = min(check, key=check.get)
     34 return g(*args, **kwargs)

NameError: name 'f(str, str)' is not defined
```
クラスメソッド
```py
class MyClass:
    @overload
    def __init__(self, a:str, b:int):
        self.ab = (a, b)
        
    @overload
    def __init__(self, a:int|float, b:int): # 3.10以降ではor演算子によるUnionTypeに対応
        self.ab = a + b
```
```py
MyClass("a", 1).ab # -> ("a", 1)
MyClass(1, 2).ab # -> 3
MyClass(1., 2).ab # -> 3.0
```
# 仕組み
overload関数のメンバ変数として関数の辞書を用意し、名前とアノテーションで管理しています。
引数の方をチェックして、矛盾がないものの中で最も適合している関数を返します。

# おわりに
細かな検証・調整はしていないので、使い方により想定通りに動かない問題が残っているかもしれません。
発見の際は報告いただけると幸いです。
普段の学習メモをそのままQiitaにあげてみよう

# はじめに

皆さんはNotionというサービスを使ったことがありますか❓

https://www.notion.so/ja-jp

私は今日初めてこのサービスを使い、授業のメモを取っていたのですが、これならMarkdownを覚えていなくても綺麗にメモを取れ、さらにそのままアウトプットに使えると思い、その方法をまとめてみました！

実際にこの記事も下の流れで作成してみたものです。
メモ→アウトプットのフローにほぼ時間を使わず、綺麗な記事が楽に書けてかなり便利でした😋

今更...？🤫

# 追記(2023年4月26日)
こちらの記事もNotionを使って書いたものです！
参考に貼ります

https://qiita.com/scythercas/items/cf1ea715ac7f606b7329





# Notion上でメモを作成する

## まずは新規登録しましょう

メールアドレスとパスワードで新規登録、ログインすることができます。

その後適当に情報を入力すると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666100/8369b1fd-aa23-c1a7-d16e-7063acb9b5e3.png)

こちらのページが開けたかと思います。

## 実際にメモを作ってみよう

サイドバーの目標管理の下、＋ ページを追加をクリックし、メモ用ページを新規作成します。

また、ページタイトルの左のアイコンをクリックすると、好きな絵文字に変えることが出来ます。

大見出しやテーブル、箇条書きなどのコマンドは、「/」でヘルプを見ることが出来ます。

ここでは簡単によく使うコマンドを紹介します。

| コマンド | 打ち方 | 結果 |
| --- | --- | --- |
| `# ` | シャープ+半角スペース | 見出し1 |
| `## ` | シャープ2つ+半角スペース | 見出し2 |
| `### ` | シャープ3つ+半角スペース | 見出し3 |
| `/table` | （略） | テーブル作成 |
| `/call` | （略） | コールアウト |
| `:smile` | コロン+ 入力したい絵文字の説明 | 任意の絵文字 |
| `+ ` | プラス+半角スペース | 箇条書きリスト |
| `1. ` | 1(など)+コロン+半角スペース | 番号付きリスト |
| `---` | ハイフン3つ | 水平線 |

などでしょうか！

ヘルプを使えば素早くかけるのでそんなに覚える必要もないかもしれませんが、QiitaやZennなどのマークアップ記法も同じであることが多いので、どっかで覚えておくと得します。

# 作成したメモをマークアップ記法に変換する


これがめちゃ便利。

右上の3点リーダをクリックし、エクスポートから、エクスポート形式：マークダウンとCSVを選択し、エクスポートボタンを押します。


作成されたファイルを表示し、Qiitaの新規記事を投稿する画面に張り付けてみましょう。

画像や水平線など、ある程度の修正は必要ですが、ほぼそのままコピペできれいな記事が出来上がります！

その結果はこの記事です。
まだNotionを使い始めて2時間くらいであることを考慮すれば、Notionの使いやすさや魅力が伝わるのではないでしょうか。
レイアウトの手助けが豊富で、スムーズに書くことが出来ました。

# メリットまとめる
普段のメモがそもそも見やすくなる
メモを取ることが楽しくなる
絵文字めっちゃ打ちやすい
メモをフォルダに分類することも出来るので、整理しやすい
多分ほかにもいっぱい

# 以上！
まだQiitaで記事を投稿したことがない人やNotionを使ったことがない人はぜひこの方法を試してみてほしいです。
(回し者ではありません)
PHPを基本からまとめてみた【環境構築】

## PHPとは

サーバーサイドのプログラミング言語

## Wordpress

ブログを作成するシステム

## MAMPとは
PC上にローカル環境サーバ環境一式をインストールできるツール


## 環境構築

ローカル環境構築　⇨  PCの中にサーバー

公式サイト：[MAMP](https://www.mamp.info/en/downloads/)

Pathの設定
```
//terminal

cd /Applications/MAMP/htdocs/
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
composer -V

//プロジェクト作成
composer create-project laravel/laravel <プロジェクト名>
```


```
brew tap shivammathur/php
brew install shivammathur/php/php@7.4
brew link php@7.4
```


## 参考サイト
[0から始めるPHP 001:環境構築(Mac編)](https://www.youtube.com/watch?v=uNUKEMJMAa8&t=6s)
videoタグで動画のサムネイルが表示されないときの対処法

`video` タグで動画を埋め込んだとき、iOSだとサムネイルが表示されないことがありました。

https://developer.mozilla.org/ja/docs/Web/HTML/Element/video

によると、


> 映像のダウンロード中に表示される画像の URL です。この属性が指定されない場合、最初のフレームが利用可能になるまで何も表示されず、その後、最初のフレームをポスターフレームとして表示します。

となっています。`poster` 属性を使用して明示的に画像を指定すればよいのですが、今回は `poster` 属性を使用せず動画の最初のフレームをサムネイルに指定する方法を紹介します。

## 動画の特定のフレームをサムネイルに指定する方法

```html
<source src="動画ファイル.mp4#t=[開始時間]" type='video/mp4'>
```

こうすることで、動画の任意の場所をposterに指定できます。

なので、最初のフレームをサムネイルに指定したいときは、

```html
<video>
  <source src="動画ファイル.mp4#t=0.1" type='video/mp4'>
</video>
```
このように動画再生直後の秒数を指定してあげると設定できます。

### 参考

[https://gist.github.com/webgyo/bc28b4a5efd390ca2546143535a3890b
](https://gist.github.com/webgyo/bc28b4a5efd390ca2546143535a3890b)

https://stackoverflow.com/questions/7323053/dynamically-using-the-first-frame-as-poster-in-html5-video
GitHub Packages で作ったライブラリをローカルでテストする💪

# やりたいこと

以下で作ったライブラリに機能を追加してテストをしたい😃

https://qiita.com/miyuc/items/469275fb3b114cddcd99

# やること一覧

1. ライブラリに機能を追加する
1. コンパイルする
1. ローカルパッケージをインストール

# ライブラリに機能を追加する

```index.ts
export { func } from './features/filename';
export { funcNew } from './features/filename';
```

# コンパイルする

機能の追加や修正をしたら必ずコンパイルしましょう。
package.json に scripts に定義していると思うのでそちらを使ってください。

```
$ tsc
```

# ローカルパッケージをインストール

ライブラリを使用しているプロジェクトでローカルパッケージをインストールします。

```
$ npm install /{テストしたいライブラリのパス}/carmo-kintone-sdk
```

これでテストできるようになりました🤗

# 参考

https://qiita.com/suin/items/c9c342f557bd885dbe06
【dart】Dividerで区切り線を引くとデザインが微妙に崩れる問題


# 問題となるコードと現象

Dividerのthicknessが「線の太さ」なので1.0を指定して線を引いてみます。

```dart
Row(
  children: [
    pageTitleContainer(),

    const Divider(
      thickness: 1.0,
    ),

    mainContents(),
  ]
)
```

超適当ですけどRowでコンテンツを並べてその間に区切り線を入れたい時のコードです。
背景色が異なると下画像のように区切り線の位置が微妙にずれます。
原因がわかるまではContainer(height: 1)とかで区切り線作ってました。

![スクリーンショット 2023-01-20 11.34.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262342/b8ae8c6e-541d-04f1-7739-d07169a958bb.png)

# 原因

Dividerの定義ファイルは以下です、

```dart
const Divider({
    super.key,
    this.height,
    this.thickness,
    this.indent,
    this.endIndent,
    this.color,
  })

~~~中略~~~

  /// If this is null, then the [DividerThemeData.space] is used. If that is
  /// also null, then this defaults to 16.0.
  final double? height;
```

書いてますね、heightに何も指定しないとデフォルトで16.0になるみたいです。

thickness=線の太さと他の記事でも書かれていて、それしか指定していない記事も結構あるのですが、Widget自体のheightがデフォルトで16もあるのでデザインがちょっとずれますよね。

# 解決策

```dart
const Divider(
  height: 1.0,
),
```

![スクリーンショット 2023-01-20 11.44.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262342/a55552de-599e-ac93-bac8-8176cbf1f4f2.png)

無事希望の位置に区切り線引けましたね。めでたし。
thicknessを0.0にするのと1.0にするのとではそんなに変わらなかったです。なんか若干色が薄いな程度です。

widgetは理解して正しく使いましょう、、
てかその辺気にする必要があるならContainerで設定する方が楽なのでは？
区切り線に見えないheightが欲しいパターンあるんですかね？
コンテンツの方にmargin付けた方が分かりやすいと思うし。
Containerで区切り線つけるのはパフォーマンス的に問題あるんですかねえ
PL-900：繰り返しフローの作成

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

[繰り返しフローの作成][MS-Learn]

[MS-Learn]: https://learn.microsoft.com/ja-jp/training/modules/build-automated-solution/2a-build-recurring-flows

## 繰り返しフローの作成
* 次のような特定のスケジュールで複数のタスク(たとえば、メールによるレポートの送信)を実行するフローを作成できる
    * １日、１時間、または １分ごとに １回
    * 指定した日付
    * 指定した日数、時間数、または分数の経過後

### フローを作成する
1\. Power Automateを起動してサインイン

2\. 左側のウィンドウで、「＋作成」を選択

3\. 一から開始の下にある「スケジュール済みクラウドフロー」を選択

4\. ダイアログ ボックスで、フロー名とフローを実行する頻度を指定
たとえば、フローを２週間ごとに実行する場合は、間隔フィールドに「２」と入力し、頻度フィールドで週を選択
フローを実行する必要のある曜日を指定することもできる
設定内容はダイアログ ボックスの下部の説明を参照

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

5\. 入力に問題がなければ、「作成」ボタンを押下

### 詳細オプションの指定
1\. フローが作成されたら、繰り返しカードのタイトルを選択して展開します。 編集を選択し、詳細オプションを表示するを選択します。

:::note warn
詳細オプションは、間隔フィールドおよび頻度フィールドの値によって異なる
表示されるダイアログボックスが次の図と一致しない場合は、間隔フィールドと頻度フィールドが図に表示されている値と同じ値に設定されていることを確認する必要がある
:::

2\. ここではローカル タイム ゾーン、協定世界時 (UTC)、または別のタイム ゾーンを指定できる

3\. フローを実行する必要のある1つ以上の曜日と時刻を指定
たとえば、次の図に示すように、2021年8月5日 午前2時 (太平洋標準時) 以降に開始し、2週間ごとに火曜日の17時30分 (太平洋標準時) に実行するようにフローを設定

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

### 作成アクションの使用
* フローをデザインしているときに、「作成」というアクションを使って同じデータを複数回入力しないようにする
    * 例）数字の配列 [0,1,2,3,4,5,6,7,8,9] を何回か入力する必要がある場合は、作成アクションを使用して次のような配列を保存するなど

1\. 繰り返しステップの下で 「＋新しいステップ」ボタンを選択

2\. 「作成」で検索し、「データ操作」 - 「作成 (データ操作)」を選択

<img src="https://learn.microsoft.com/ja-jp/training/modules/build-automated-solution/media/data-operation-compose-action.png" />

3\. 入力ボックスに「配列」を入力

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

4\. 必要なアクションを次々と追加

5\. 左上の [無題] を選択し、フロー名を変更

6\. 保存ボタンを押下

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

7\. フロー名の横にある「戻る」矢印を選択

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

8\. 最後に、フローを最上位のコマンド バーから実行できる

<img src="https://learn.microsoft.com/ja-jp/training/modules/build-automated-solution/media/command-bar-run-flow.png" />
Oracle Analytics Cloud ： 分析を始める。DataVisualizationで作成した表形式のビジュアライゼーションのタイルに"ヒット"件数を追加する

はじめに
---
Oracle Analytics Cloud ： DataVisualizationで作成した表形式のビジュアライゼーションで、対象の件数が何件あるか？というのを合わせて表示したい。
といったような場合には、ビジュアライゼーションにある"タイル"を利用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/f5ee80e7-e960-73a3-ade3-b22eb8468c4e.png)

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

前提
---
Data Visualizationでワークブックを作成したことがある
Qiita記事の「Oracle Analytics Cloud ： 分析を始める。」シリーズで、表形式のビジュアライゼーションを作成し、保存している。

対象の件数を導きだすためのマイ計算、計算式を追加する。
---
ワークブックを開き、編集モードにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/5b3fadb1-14c8-3c2e-95c2-2b84261640f4.png)

マイ計算を右クリックします。メニューから"計算の追加"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/800246f5-0741-dc65-9313-311760b43c2b.png)

名前を入力します。"ヒット件数"。
式に"COUNT(*)"と入力します。検証をクリック後、エラーがないことを確認し、保存をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/4b7815d5-ba6b-f564-f783-3a572dd61f1e.png)

"ヒット"件数を導出する式列が作成されます。

表形式のビジュアライゼーションのタイルに"ヒット"件数を配置する
---
作成済の式列"ヒット件数"を、真ん中の部分上部にあるタイルに移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/ede972b8-09cc-3467-e63a-a32ec4f5c7bd.png)

対象の件数が何件か、という式列をタイルに配置しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/86c0c0c9-3fa2-46ec-a672-864de643aed9.png)

ヒット件数の書式設定はプロパティ・ペインで行います。
左から４番目の"#"タブをクリックします。ヒット件数の左▲をクリックし展開します。
数値書式を"自動"から、"数値"に変更します。小数点を"0"に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/5f51449b-6dab-a742-d613-ca077cbc5685.png)

対象の件数を表示したいといったニーズがある場合には、こちらのように"タイル"を利用することによって実現できます。

以上
Azure Administrator(AZ-104)：Linux VMのSyslog監視

この記事は、Microsoft Azure Administrator(AZ-104)の受験勉強の中で、自分が間違えやすい、覚えにくいと思ったポイントの一つをまとめたものです。同じく資格取得に向けて勉強されている方の参考になれば幸いです。

## リソースの監視
AZ-104の試験範囲にはリソースの監視も含まれますが、この記事ではLinux VMの異常を検知する方法について記載します。
Linuxでは、アプリやサービスの異常がSyslogに記録される場合が多いと思います。Azureでは、Syslogのイベントを収集する仕組みが提供されていますので、この仕組みを使ってLinux VMの異常を検知する手順を試してみます。

主な流れは下記のようになります。

1. Log Analyticsワークスペースを作成する
1. VMにエージェントをインストールする
1. データ収集ルールを作成する
1. アラートを作成する

## 準備
まずAzureで監視対象となるLinux VMをデプロイします。
ここでは、AzureポータルでOSにubuntu 20.04を指定したものをデプロイしました。
Syslogにエラーを記録できることを確認してみましょう。出力にはloggerを使用します。
sshでVMに接続し、ファシリティにlocal0、プライオリティにerr、メッセージに「Dummy Error」を指定してコマンドを実行してみます。
```
logger -p local0.err "Dummy Error"
```
/var/log/syslogを参照すると、下記の通りエラーが記録されています。
```
Jan 19 08:34:33 VM1 azureuser: Dummy Error
```

## Log Analyticsワークスペースを作成する
AzureポータルでLog Analyticsワークスペースを作成します。

## エージェントのインストールとデータ収集ルールの作成
エージェントにはLog AnalyticsエージェントとAzure Monitorエージェントがあります。Log Analyticsエージェントは、2024年8月31日に廃止されますので、Azure Monitorエージェントを使うことにします。移行についての詳細は[こちら](https://learn.microsoft.com/ja-jp/azure/azure-monitor/agents/azure-monitor-agent-migration)を参照ください。

Azure Monitorエージェントを利用するには[前提条件](https://learn.microsoft.com/ja-jp/azure/azure-monitor/agents/azure-monitor-agent-manage?tabs=azure-portal#prerequisites)があります。AzureポータルでVMを作成し、エージェントをインストールする場合には、特に追加の手順は不要です。マネージドIDも後述のデータ収集ルール作成時に有効化されます。
インストールもいくつか[手段](https://learn.microsoft.com/ja-jp/azure/azure-monitor/agents/azure-monitor-agent-manage?tabs=azure-portal)がありますが、ここではAzureポータルを使ってみます。
詳細な手順は[こちら](https://learn.microsoft.com/ja-jp/azure/azure-monitor/agents/data-collection-rule-azure-monitor-agent?tabs=portal#create-a-data-collection-rule)にありますが、データ収集ルールを作成する中でエージェントがインストールされます。

モニターからデータ収集ルールを作成します。プラットフォームの種類はLinuxを選択します。
データ収集ルールのリソースとして、監視対象のVMを選択します。
![スクリーンショット_20230119_175643.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104149/6d1452c6-b0c5-b9cd-f0e6-0303f2337f17.png)

データソースを追加する際、データソースの種類にSyslogが選択できるようになっています。ファシリティとプライオリティで絞り込むことができます。
![スクリーンショット_20230119_175720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104149/0fee6e59-3baf-580b-6690-0bbf1e3bbb3f.png)

ターゲットに作成したLog Analyticsワークスペースを指定してデータ収集ルールを作成します。

## アラートを作成する
Log Analyticsワークスペースにエラーが送信されることを確認します。
再度VMにログインして下記を実施し、AzureポータルからLog Analyticsワークスペースを確認します。
```
logger -p local0.err "Dummy Error"
```
ログにSyslogテーブルが作成されています。下記のようにerrorでフィルタしたクエリを実行してみると、上記で実施した"Dummy Error"が出力されていることが確認できました。
```
Syslog
| where SeverityLevel == "error"
```
![スクリーンショット_20230119_180553.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104149/e2bcd340-07f7-c9e5-0978-f07c4de7f83f.png)

この状態で「+新しいアラートルール」ボタンを押すと、入力したクエリを条件としたアラートの作成画面に遷移します。アラートの設定の詳細は割愛しますが、評価の頻度や通知先などを入力してアラートを作成すると、メールやSMSなどでSyslogのエラーを受信することができるようになります。

今回はloggerを使って手動でSyslogにメッセージを追加しましたが、SyslogにはVMに搭載している様々なアプリ、サービスのログが記録されていると思います。特定のアプリ、サービスの動作を監視したい、という場合は、Log Analyticsワークスペースのクエリに対応する条件を設定すれば、VMそのものの設定を変更したりすることなく、アラートを受け取ることができるようになります。

また、障害発生時にVMを削除、再作成してSyslogが消える、というような場合でも、Log Analyticsワークスペースに転送しておけば、障害復旧後に原因調査を行うことができます。
【jQuery】プルダウン選択時に値を変更するか確認する

### プルダウン選択で値を変更する前に、確認

【bootstrap3】を使ったWeb開発で、
複数のフォーム要素をselect要素の値によって有効・無効を切り替えるといった実装をしているときに、
フォームの値が変更されている際、プルダウンが変更された時に変更を確認するモーダルメッセージを表示する処理を書きました。
今後も同じような実装をするかもしれないので、備忘録として。

参考はこちらのページです。↓
https://shironeko.hateblo.jp/entry/2014/07/12/120618

```html
<style>
    fieldset {
        display: block;
    }
    fieldset:disabled {
        display: none;
    }
</style>

<form>
    <label class="form-label">月</label>
    <select name='month' id="form_select">
        <option value="202301" selected>2023/01</option>
        <option value="202302">2023/02</option>
        <option value="202303">2023/03</option>
        <option value="202304">2023/04</option>
    </select>
    <fieldset data-month='202301'>
        表示するフォーム要素
    </fieldset>
    <fieldset data-month='202302' disabled>
        隠すフォーム要素
    </fieldset>
    <fieldset data-month='202303' disabled>
        隠すフォーム要素
    </fieldset>
    <fieldset data-month='202304' disabled>
        隠すフォーム要素
    </fieldset>
</form>

<div class="modal fade" id="ChangeAlert" tabindex="-1">
	<div class="modal-dialog">
		<div class="modal-content">
			<div class="modal-header">
				<button type="button" class="close" data-dismiss="modal"><span>×</span></button>
				<h4 class="modal-title">確認</h4>
			</div>
			<div class="modal-body">
				変更が保存されていません。<br>
				表示を切り替えますか？
			</div>
			<div class="modal-footer">
				<button type="button" class="btn btn-default" data-dismiss="modal">いいえ</button>
				<button type="button" class="btn btn-primary" id="btn-change"  data-dismiss="modal">はい</button>
			</div>
		</div>
	</div>
</div>

<script type="text/javascript" src="sample.js"></script>

```

```sample.js

(function() {
    $.fn.exChange = function (callback, fn) {
		let func = fn || function() { return $(this).val(); };
		$(this).each(function() {
			let val = func.apply(this);
			$(this).change(function() {
				Array.prototype.push.call(arguments, val);
				callback.apply(this, arguments);
				val = func($(this));
			});
		});
    }
    $("#form_select").exChange(selectChange);
})();

function selectChange(e, prev) {
	let value = e.target.value;
	if (#変更を確認する条件#) {
		$("#ChangeAlert").modal();
		$("#btn-change").on("click", function() {
			for (let i = 0; i < $("fieldset").length; i++) {
				let fieldset = $("fieldset").get(i);
				if ($(fieldset).data('month') == value) {
					$(fieldset).prop('disabled', false);
				} else {
					$(fieldset).prop('disabled', true);
				}
			}
			$("#form_select").val(value);
		});
		return $("#form_select").val(prev);
	}

	for (let i = 0; i < $("fieldset").length; i++) {
		let fieldset = $("fieldset").get(i);
		if ($(fieldset).data('month') == value) {
			$(fieldset).prop('disabled', false);
		} else {
			$(fieldset).prop('disabled', true);
		}
	}
	return $("#form_select").val(value);
}


```
NetCommos3.3.5をxamppにインストールする

いまさら感があるがxamppにNetCommos3.3.5をインストールのメモ。
結論から言ってxamppだけではインストールできなかったため、Linuxでインストールしてから移植する方法をとった。

* Linuxでインストールする
* xamppにDBとファイルをコピーする
* 動く

# xamppでNetCommos3.3.5をインストールできなかった詳細

* modelのキャッシュを使わないなど、手をつくしてみたが、「テーブルの生成（マイグレーション）に失敗しました。」エラーでできなかった。
* 公式掲示板のトラブル報告（アーカイブ）に記事（NetCommons3.3.1）があったが、この記事も解決していなかった。現在も残ってる不具合と思われる。
　[インストール時に「テーブルの生成（マイグレーション）に失敗しました。」と出る](https://www.netcommons.org/bbses/bbs_articles/view/778/fe4fab986a1448e257a315578954da59?frame_id=199#!#bbs-article-686)
プリザンターの管理画面からチェックのついているユーザーのみ分類Aで選択可能にする

 # はじめに
マスターテーブルに登録したユーザーのうち、チェックAにチェックがついているユーザーのみ分類Aで選択可能にしたい。

 # 前提
テーブルを2つ作成していただきます。今回の例では、マスターテーブルと作業テーブルの2つを作成します。マスターテーブルはユーザー情報をレコード単位で登録するテーブルで、作業テーブルは分類Aからユーザーを選択するテーブルです。
・マスターテーブルの管理画面からチェックAを追加
・マスターテーブルでユーザー情報を作成
・作業テーブルの管理画面から分類Aを追加
・分類Aの詳細設定画面の選択肢一覧に下記サンプルコードを転記

 # サンプルコード
```

[
    {
            "SiteId": サイトID,
            "View": {
                "ColumnFilterHash": {
                    "CheckA": true
            }
        }
    }
]

```

 # 注意
サンプルコードのサイトIDには、マスターテーブルにあるサイトIDを記載するようにお願いいたします。

 # つぶやき
今回のコードはチェックAにチェックがついているユーザーのみ分類Aに表示する処理です。その中からユーザーを選択できるようになりました。ソートなどもあるので、記載方法はマニュアルを参照してください。
git管理しているlatex原稿の差分をわかりやすく見る

## 想定読者

- LaTeX で論文を執筆している
- コマンドラインで LaTeX のコンパイルができる
- 基本的な git コマンドを使える
- 論文の変更を git 管理している
- `git-latexiff` コマンドがインストールされている
  - TeX Live で LaTeX 環境をインストールしていればついてくる

## 背景

- 論文の修正をひと目でわかるようにしたい
  - 指導教員の修正，共著者からのコメント，査読対応など
- Adobe Acrobat の差分作成機能は意図していない挙動が多い
  - 特に数式が多い論文は複雑になりがち
- tex ファイルの diff を見るだけではよくわからないので pdf の組版結果を視覚的に比較したい

## 方法

```
git latexdiff <old> <new> --flatten --latexmk --tmpdirprefix <output-path> --main <main_tex_file>.tex
```

- コマンドが正しく実行されると `<output-path>` 直下に `git-latexdiff.12345`のようなディレクトリが生成される
- `git-latexdiff.12345/new`以下に差分をまとめたファイルが生成される
  - pdf がうまく出力されない場合は，`git-latexdiff.12345/new/<main_tex_file>.tex`をお好みの環境でコンパイルすればよい
- デフォルトで，削除は赤字に取り消し線，追加は青文字に下波線でハイライトされる

### 解説

- `<new>`: 修正後の git のコミットハッシュ．省略可能．省略すると`HEAD`が渡される．
- `<old>`: 修正前の git のコミットハッシュ．
- `--flatten`: `<main_tex_file>.tex`中の`\input`や`\include`をすべて展開する．メインファイル 1 個だけで執筆している場合は省略可
- `--latexmk`: 差分結果を latexmk を使って pdf などで出力する．`latexmkrc`を作っていると便利．
- `--tmpdirprefix <output-path>`: 作成された差分を格納するディレクトリへのパス
- `--main <main_tex_file>.tex`: メインの tex ファイル名

## 応用

日本語の論文では上記コマンドそのままでは動かないので工夫が必要．

### 準備

同じディレクトリに `latexmkrc` を作成しておく．
例えば pLaTeX+dvipdfmx でコンパイルする場合は下記のように設定する．

```pl:latexmkrcの例
#!/usr/bin/env perl
@default_files = ("main.tex");
$latex          = 'platex -synctex=1 -halt-on-error';
$latex_silent   = 'platex -synctex=1 -halt-on-error -interaction=batchmode';
$dvipdf         = 'dvipdfmx %O -o %D %S';
$bibtex         = 'bibtex';
```

### 差分生成

さらに，`--latexopt "-r latexmkrc"` オプションで先ほど作成した`latexmkrc`に従ってコンパイルするよう支持する．

```
git latexdiff <new> <old> -e utf8 -t CFONT --flatten --latexmk --latexopt "-r latexmkrc" --tmpdirprefix <output-path> --main <main_tex_file>.tex
```

## TODO

- 出力結果の例を画像で埋め込む
- git のタグ名を指定して簡単に差分を取れるようにしたい
- 差分を違う色などで表示できるようにしたい
  - 査読者 1 の対応は赤，査読者 2 の対応は緑など分けたい

もし良い方法をご存じの方がいればコメントで共有いただきたいです :bow:

---

## 参考文献

1. [git-latexdiff / Git Latexdiff · GitLab][git-latexdiff-gitlab]
2. [git + latexdiff で TeX の原稿を添削してもらいやすくする。 - やったことの説明][git-latexdiff-hatena]
3. [Latexdiff で日本語を][git-latexdiff-jp]
4. [git で latex 管理 - Qiita][qiita-git-latex]
5. [latexmk の薦め - Qiita][qiita-latexmk]

[git-latexdiff-gitlab]: https://gitlab.com/git-latexdiff/git-latexdiff
[git-latexdiff-hatena]: https://ksknw.hatenablog.com/entry/2015/07/25/230230
[git-latexdiff-jp]: http://www.quickhack.net/nom/blog/2013-06-16-latexdiff-for-japanese-documents.html
[qiita-git-latex]: https://qiita.com/tonta/items/ecf056bc67429df98fed
[qiita-latexmk]: https://qiita.com/tdrk/items/16f31e45826c57bce412
セレクトボックスの選択肢や値を取得したい時

# 結論
取得したセレクトボックスは一旦配列に変換しないといけない。
下記のようにセレクトボックスのelementを配列に変換してから操作する👍
```
// セレクトボックス要素を取得
formElem = document.getElementById(セレクトボックスのid) 

// 選択肢のvalueを配列で取得
Array.from(formElem.options).map(option => option.value)
// 選択肢の表示部分を配列で取得
Array.from(formElem.options).map(option => option.text)
```

## なぜ変換？？
```
formElem = document.getElementById(セレクトボックスのid) 
formElem.options
=> HTMLoptionsCollection[option,option...]
```
このように　取得したセレクトボックス要素.optionsで選択肢達は取得できている...が
この状態で配列の操作をしようとすると上手くいかない

`formElem.options`は、HTMLoptionsCollectionであり、配列では無いのが原因みたい...
なので、`formElem.options`を配列に変換すれば、`map`とか`forEach`とかを使えるようになるので、変換が必須ということですね！

```
formElem.options.map(o => o.value) 🙅‍♂️

const options = Array.from(formElem.options)
options.map(o => o.value) 🙆‍♂️

```

変換には`Array.from`やスプレッド構文が使えます！
なので、こんな感じで書き換えできます

```
// 選択肢のvalueを配列で取得
Array.from(formElem.options).map(option => option.value)
↓
[...formElem.options].map(option => option.value)
// 選択肢の表示部分を配列で取得
Array.from(formElem.options).map(option => option.text)
↓
[...formElem.options].map(option => option.text)
```
個人的にはスプレッド構文の方が記述量が少しだけ減るので好きですね笑

以上！
他の方法や間違い等あればコメントお待ちしております！
WPF Window or Control での初期表示とか

コンストラクタでごにょごにょやるのは嫌だ

Views/MainWindow

```xml
<Window x:Class="WpfApp2.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp2"
        xmlns:prism="http://prismlibrary.com/"
        xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
        mc:Ignorable="d"
        prism:ViewModelLocator.AutoWireViewModel="True"
        Title="MainWindow" Height="450" Width="800">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Loaded">
            <i:InvokeCommandAction Command="{Binding LoadedCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <Grid>
        <TextBlock Text="{Binding Message.Value}"></TextBlock>
    </Grid>
</Window>
```

ViewModels/MainWindowViewModel

```csharp
using Prism.Mvvm;
using Reactive.Bindings;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WpfApp2.ViewModels
{
    internal class MainWindowViewModel : BindableBase
    {
        public ReactiveCommand LoadedCommand { get; set; } = new ReactiveCommand();
        public ReactiveProperty<string> Message { get; set; } = new ReactiveProperty<string>();
        public MainWindowViewModel()
        {
            LoadedCommand.Subscribe(() => {
                Message.Value = $"Loaded {DateTime.Now:yyyy/MM/dd HH:mm:ss}";
            });
        }
    }
}
```


前に同じような記事を書いた気がするのはきっと気のせい。
Google ColabでSeleniumを使うのが超絶面倒臭くなっている件

# TL;DR

[Issues when trying to use Chromedriver in Colab · Issue \#3347 · googlecolab/colabtools](https://github.com/googlecolab/colabtools/issues/3347)

以上。


だと味気ないので

# 補足

Issueに書いてあるけどUbuntuのバージョンがあがったせいでsnapdが使えなくなったせいという解釈でおkか。

以前書いた記事[Seleniumを使ってサイト情報を整形加工する](./956a56941d54e5f80dc4)でのやり方は使えないので詳しくはGithubの方を参考にしていただきたい。

https://github.com/higebobo/my-colab/blob/main/fisco_stock_info.ipynb

:::note
ついでにいうとpandas_datareaderも使えなくなっているのでyfinanceに置き換えている。
:::

実行時間が長くなるので早く以前のように気軽に使えるようになってほしいけど、一つというかかなり勉強になったのはColab上でシェル操作ができるのかという点。
AWSのアクセスキーからどのAWSアカウント、どのIAMユーザーかを確認する

CircleCIでセキュリティインシデントが発生してしまったようです。[^1]

[^1]: https://circleci.com/ja/blog/jan-4-2023-incident-report/

漏洩した恐れのあるAWSのアクセスキーのリストがAWSから送られてきました。
対処としてはキーをローテートすればよいそうです。

ただAWSアカウント、IAMユーザーともにそれなりの数があり、対象のキーをすべてマネジメントコンソールから手作業で確認するのは骨が折れそうです。調べたところAWS CLIで確認できるそうで便利でした。
確認は二段階で、

1. AWSアカウントの特定
1. IAMユーザーの特定

になります。AWSアカウントはAWS CLIで該当のAWSアカウントの権限が無くても確認できるようです。JWTのようにアクセスキー内にアカウント情報が入っているのかもしれません。

## アクセスキーからAWSアカウントを調べる

`sts get-access-key-info` を使い、`AKIAxxxxxxxxxxxxxx` というキーに付いて調べるときには下記のようにします。

```shell
$ aws sts get-access-key-info --access-key-id AKIAxxxxxxxxxxxxxx

{
    "Account": "xxxxxxxxxxx"
}
```

## アクセスキーからIAMユーザーを調べる
AWSアカウントがわかったら、該当のAWSアカウントへの権限があるプロファイルを指定して `iam get-access-key-last-used` を使って調べます。

下記では `someAWSprofile` というプロファイルで、 `AKIAxxxxxxxxxxxxxx` というアクセスキーの確認をします。


```
$ aws --profile someAWSprofile iam get-access-key-last-used --access-key-id AKIAxxxxxxxxxxxxxx

{
    "UserName": "some_iam_user_account",
    "AccessKeyLastUsed": {
        "LastUsedDate": "2025-01-01T00:00:00+00:00",
        "ServiceName": "ec2",
        "Region": "ap-northeast-1"
    }
}
```

もしエラーになった場合には該当のIAMユーザーがいないそうです。

## 終わり
該当ユーザーについては不要そうであれば削除、引続き使う場合にはキーのローテートをすればよいそうです。
echo dotと自宅のIoTを連携させた話

自宅でecho dotを中心にIoTにつながる機械をつなげ、その使用感のログとなります。

## 全体図
![スクリーンショット 2023-01-19 16.11.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217551/68ba6c74-310a-ef81-0e37-091cd7326787.png)

構成はecho dot経由で操作をし、そこからwifi経由で各種機械に命令をします。
実際に操作した端末です。

- switch bot
    - 加湿器
    - リモコン（家電のリモコン全般）
        - テレビ
        - エアコン
        - 照明
    - カーテン
- ルンバ

合わせてデータ収集にnetatomを使っているため合わせて記載します

- netatom

## echo dot

音声入力の中心を担うalexaを担当するecho dotです。

事前にalexaとIoTのアカウントを連携しておくだけで、echo dotの音声入力から各種機械を操作できます。またgoogleアカウントを連携しており、Amazon musicの再生とIoTの操作を主に担当してもらっています。

僕がecho dotを購入したときは¥6,000前後と意外とかからないな、という金額感でした。
[echo dotのamazonのページはこちら](https://www.amazon.co.jp/Echo-Dot-%E3%82%A8%E3%82%B3%E3%83%BC%E3%83%89%E3%83%83%E3%83%88-%E7%AC%AC4%E4%B8%96%E4%BB%A3-%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%82%B9%E3%83%94%E3%83%BC%E3%82%AB%E3%83%BC-with-Alexa-%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A3%E3%83%BC%E3%83%9B%E3%83%AF%E3%82%A4%E3%83%88/dp/B084KQRCGW/ref=sr_1_2?keywords=echo+dot&qid=1674111616&sr=8-2)
※公式紹介ページを見つけられなかったため、amazonのリンクを記載しています。

## switchbot

[switchbot 公式サイトはこちらのリンクから。](https://www.switchbot.jp/)
switchbotは多くの家電のIoT化を支えてくれています。いくつかのswitchbotを購入して試しておりますが、特にコスパが良かったものはハブミニでした。
![Screenshot_20230119-164906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217551/41e32580-9b3b-4ddc-ed4e-320705e2dcc2.png)

[switchbot ハブミニのリンクはこちら。](https://www.switchbot.jp/products/switchbot-hub-mini)

ハブミニはリモコンを記憶させることができ、リモコン操作を音声入力でできるようになります。リモコン操作であるテレビ、エアコン、照明を中心に音声入力で操作しています。布団に入った後から照明を消せるのが良いです。

例：音声入力で照明操作の様子
![MOV_2693_AdobeExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217551/4dceade6-37de-1d67-ad9f-427324dce98b.gif)


## ルンバ

僕「hey, alexa. 掃除して」

スマホにiRobotアプリを入れることでalexaとの連携ができ、ルンバが持つ定型スケジュールで掃除する他、alexa経由で部屋を掃除できるようになったため、在宅ワークの横でルンバを動かすことへの手間が減り、在宅ワークのストレス減につながっています。

![Screenshot_20230119-154341.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217551/df501893-a7b2-20be-00db-c9553549d4d1.png)

[ルンバ　公式サイトのリンクはこちらから。](https://www.irobot-jp.com/product/i2/)

## netatom

netatomは温度計や湿度計の機能をオンラインで保存してくれるサービスです。3-4年前に買ったきりずっと差しっぱなしで放置していますが、文句も言わずにデータを蓄積してくれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217551/d0ba6ed6-c81c-7877-2510-b8f8cc3a63d4.png)
[netatom公式サイトのリンクはこちら。](https://www.netatmo.com/en-gb)

画像は2023/01/17の自宅の気温をプロットしております。朝8時に起きて夜21時過ぎにはエアコンを切った（寝た）ことの確認として使ってます。
netatomから得られるデータで、気温が下がれば自動でエアコンを入れたりなども可能だと思いますが、今後やっていこうと思います。

![スクリーンショット 2023-01-19 15.46.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217551/6f243b99-90eb-1f5b-20b0-bcd028f6b3d8.png)


# 金額感

### 最小限構成のコスパの良いライン

個人的に、最小限構成のコスパの良いラインはecho dot + ハブミニの２つがあればIoTの快適さに触れらると思います。（トータル¥10,000前後）
リモコン操作を音声入力に切り替えることができ、日常的に操作回数の多いリモコンが減ることはコスパ良く感じました。

# 困ったこと

### １つのgoogleアカウントでの複数拠点の管理には向いてない。

alexaを自宅と実家の２拠点に入れてみてわかったことですが、どこの何をと指示しないと当然誤った動作をすることがあります。

僕「alexa. ""自宅""の電気をつけて。」
僕「alexa. ""実家""の電気をつけて。」

何が困るのかというと、誤って遠方の拠点の機械を誤操作したときに、誤操作に気付けないため正常に操作取り消しができないことです。遠方のエアコンを余計に操作してしまったり、利用中のテレビの電源を勝手に消してしまうなどの誤操作をしていた（そう）です。

解決策としては、実家のecho dotには実家住まいの人のアカウントを使い、アカウントを分離することで解決しました。
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/5-identify-subscription-usage)

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

## Azureサブスクリプションの選択
### Azureサブスクリプション選択時の考慮事項
**◆Azureを無料で試すことを検討**
・Azureの無料サブスクリプションにおける無料枠
　-30日間：USD200クレジット分の有料機能を利用可能
　-12か月間：指定されているAzureサービスを月額無料料金内で使用可能
　-常時：55以上の指定されているAzureサービスを月額無料料金内で使用可能
・無料サブスクリプションの設定に必要なもの
　-電話番号
　-クレジットカード(本人確認用)
　-Microsoftアカウント
・クレジットを使い果たすか30日が経過すると、サブスクリプションとサービスは無効になる
⇒有料サブスクリプションにアップグレードするまでは課金されない

**◆使用したサービスに対する毎月の支払いを検討**
・従量課金制では1か月の課金期間に使用したサービスに対して請求
・個人/中小企業/大企業などの多くのユーザに適している

**◆Azure エンタープライズ契約の使用を検討**
・1つの契約でクラウドサービスやソフトウェアライセンスを柔軟に購入可能
・新しいライセンスとソフトウェアアシュアランスの割引がある
※ソフトウェアアシュアランス：Microsoftが提供しているアップグレード各種サービスに関するサポート
・エンタープライズ規模の組織を対象

**◆学生向けのAzureサポート(Azure for Students)を検討**
・USD100クレジット分の有料機能を12か月間使用可能
・登録にクレジットカードが不要
・組織のメールアドレスを使用して、教育機関への所属を証明する必要あり

## 次の学習内容
**◆Microsoft Cost Management**

https://qiita.com/fsd-jume/items/1639233963f93cddd40a

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

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
paizaラーニング レベルアップ問題集 二分探索メニュー JavaScript 効率よく盗もう

効率よく盗もう (paizaランク A 相当)

https://paiza.jp/works/mondai/binary_search/binary_search__application_step1

# 方針

>盗み出す財宝を適切に選んだ結果、平均価値が最大でいくつになるかを答えてください。

以上の問題文より、平均価値で二分探索ができそうです。

***

k個の財宝の平均価値がx以上なら、それ以下の平均価値y(y<=x)も、もちろん達成できます。なので、二分探索ができます。

k個の平均価値は問題文の定義より`(v_1 + v_2 + ... + v_k) / (w_1 + w_2 + ... + w_k)`で求められます。

平均価値がx以上になるなら、
`(v_1 + v_2 + ... + v_k) / (w_1 + w_2 + ... + w_k) ≧ x`
と表現できます。


このままだと考えにくいので、これを、**財宝１つ１つの表現にできないか考えます。**

財宝１つ１つの表現を目指して、式変形をします。
`(v_1 + v_2 + ... + v_k) - x * (w_1 + w_2 + ... + w_k) ≧ 0`
`(v_1 - x*w_1) + (v_2 - x*w_2) + ... + (v_k - x*w_k) ≧ 0`

こうすることで、財宝１つ１つについて、適切に選ぶことができます。
すなわち、n個財宝１つ１つについて`(v_i - x*w_i)`を求め、この値が大きい財宝からk個選んで、足し合わせたときに、0以上であれば、
n個の財宝から適切にk個選んだ最大の平均価値はx以上、ということです。

***

二分探索で、探索範囲[left, right)のとき、平均価値が mid = (left+right)/2 以上となるように 財宝を k 個選ぶことができるかどうかをチェックします。

平均価値が mid 以上となるように財宝を選べるなら、探索範囲の左端を left から mid にします。逆に選べないならば、探索範囲の右端を right から mid にします。

## 解き方の流れまとめ
平均価値の探索範囲[left,right]で、mid=(left+right)/2とした時、
k個の財宝を適切に選んで、最大にした平均価値が、mid以上になるか調べます。

式にすると、
`(v_1 + v_2 + ... + v_k) / (w_1 + w_2 + ... + w_k) ≧ mid`
が成り立つか調べるが、このままだと、k個の財宝を適切に選んで最大の平均価値にできないので、**式変形して財宝１つ１つの表現にします。**
`(v_1 - mid*w_1) + (v_2 - mid*w_2) + ... + (v_k - mid*w_k) ≧ 0`
こうすると、左辺が財宝１つ１つから求められる値になり、大きい順に並べ替えができ、大きい順に選ぶことができるようになり、適切に選んで最大の平均価値にできるようになります。

"その左辺の最大値が0以上"ならば、
"k個の財宝を適切に選んで、最大にした平均価値が、mid以上"なので、
mid以下の平均価値も、もちろん成立します。

よって、範囲の左端leftがmidになります。

また、成立しなかったら、mid以上に高い平均価値はもちろん成立しないので、右端のrightをmidにします。

以上を50回以上繰り返せば、求まります。



## さらに流れまとめ

平均価値を二分探索すればよい。
平均価値の範囲[left, right]の中間をmidとした時、k個の財宝を適切に選んだ最大の平均価値を探索する。
平均価値がmid以上なら、mid以下はもちろん成り立つので、範囲の左端leftをmidに狭める。
平均価値がmid以下なら、mid以上はもちろん成り立たないので、範囲の右端rightをmidに狭める。
これを繰り返して、平均価値の境目を見つける。


ここでポイントは、k個の財宝を適切に選ぶ方法。
**財宝１つ１つに何か値があって、それが大きい順にk個選べればよい。**
与えられた定義(k 個の財宝の価値の和) ÷ (k 個の財宝の重さの和)がmid以上か判定する式がある。
`(v_1 + v_2 + ... + v_k) / (w_1 + w_2 + ... + w_k) ≧ mid`
これを変形すると、
`(v_1 - mid*w_1) + (v_2 - mid*w_2) + ... + (v_k - mid*w_k) ≧ 0`
が得られる。この左辺は**財宝１つ１つの値の形になっている**ので、全部のn個の財宝の値を求めて大きい順にソートでき、大きい順に選ぶことができる。

# 解答コード例(Python3の場合参考)
```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

const [n, k] = lines[0].split(" ").map(Number);
const W = lines[1].split(" ").map(Number);
const V = lines[2].split(" ").map(Number);

//平均価値について二分探索する
//平均価値の範囲は1 ≦ W_i ≦ 5,000 (1 ≦ i ≦ n), 1 ≦ V_i ≦ 5,000 (1 ≦ i ≦ n)より
let [left, right] = [0, 5001];
for (let i = 0; i < 100; i++) { //万全を期すため100回
  /* 解説より、k個の財宝の最大の平均価値がmid以上かは、
  k個の財宝のtmp_iの和が0以上か、で判定できる */
  let mid = (left + right) / 2;
  let tmp = Array(n).fill(0);//ここに各財宝の(v_i - x*w_i)を入れる
  for (let i = 0; i <= n; i++) {
    tmp[i] = V[i] - W[i] * mid;//tmp_iとする。
  }
  //財宝のtmp_iの値を大きい順にソート
  tmp.sort((a, b) => b - a);
  
  //k個の財宝のtmp_iの和が0以上か=k個の財宝の最大の平均価値がmid以上か
  if (tmp.slice(0, k).reduce((a, b) => a + b) >= 0) {//最大の平均価値がmid以上なら
    left = mid;//mid以下に最大の平均価値はない
  } else { //最大の平均価値がmid以下なら
    right = mid;　//mid以上に最大の平均価値はない
  }
  
}
console.log(left);
```
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">

# 依存関係の種類

依存関係とは、2つのプロジェクトタスクの間で、一方の完了または開始が他方の完了または開始に依存する関係のことである。ここでは、4つの一般的な依存関係を紹介します。

## Finish to Start (FS)

このタイプの2つのタスクの関係では、タスクBを開始する前にタスクAを完了させなければならない。これは、プロジェクトマネジメントで最も一般的な依存関係です。これは、あるタスクから別のタスクへの自然な流れに従います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/8688059f-d4a1-bb7f-44aa-16d33c8b96dd.png" width="550">

例：あなたが友人を夕食に招く準備をしているとします。靴下(タスクA)を履き終えるまで、靴(タスクB)を履き始めることができません。

> タスクA：靴下を履き終える。→タスクB：靴を履き始める。

## Start to Start (SS)

このモデルでは、タスクAはタスクBが始まるまで開始できない。つまり、タスクAとタスクBは同時に開始され、並行して実行される。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/659436f4-fdfc-edd5-64d5-4a82b01f18d9.png" width="550">

例 ：あなたは仕事の後、電車で帰宅する必要があります。電車代(タスクA)を払わないと、電車(タスクB)に乗れません。

> タスクA：電車の乗車賃を払うことから始める。→タスクB：電車に乗ることから帰宅を開始する。

## Start to Finish (SF)

このモデルでは、タスクBを完了させる前にタスクAを開始しなければならない。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/11d64acc-2a11-0c75-9d4a-9a2a96611d77.png" width="550">

例 : あなたの友人の一人が、遅刻するとあなたに電話をかけてきました。彼は、同僚がシフト（タスクA）を開始するために到着するまで、自分のシフト（タスクB）を終えて仕事を終えることができません。

> タスクA：あなたの友人の同僚がシフトに入る。→タスクB：あなたの友人が勤務を終える。

# 依存関係グラフ

プロジェクトマネージャーとして、プロジェクト中の作業の流れを視覚的に表現するために、この依存関係を利用することになります。依存関係グラフの使い方を、日常的な例で検証してみましょう。

あなたが、夕食に来る子供たちのためにピーナッツバターとジェリーサンドを作っていると想像してください。そして、依存関係を使用して、あなたの活動をグラフにマッピングしたいと思います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/92b591fc-3bc4-e5f1-a7d6-5cc7fb8bf41d.png" width="550">

各タスクを分解して依存関係グラフを作成してみましょう。

- サンドイッチを作るとき、材料(パン、ナイフ、ゼリー、ピーナッツバター、皿、ナプキン)を集める必要があります(タスク A)。
- この時点で、1枚のパンにゼリーを塗り（タスクB）、もう1枚のパンにピーナッツバターを塗る（タスクC）ことができます。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/b32096d5-f778-086b-8e89-7ee60092d425.png" width="550">

- 今度は、両方のパンを一緒に並べます（タスクD）。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/be760bcf-4f7a-a83d-ea18-40e19433ac03.png" width="550">

- 最後に、サンドイッチをお皿に乗せて、盛り付けをします（タスクE）。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/213a6bea-965d-bbc4-e6dd-f521803c6b10.png" width="550">
【React】react-datepickerを使ってカレンダーを作る

### カレンダーを作る
* イメージは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/e583300e-136c-6c67-d9b7-e9b8975c51ef.png)

* 実装コード
```typescript
// カレンダーを表示する
//react-datepickerを使って実装
import { useState } from "react";
import DatePicker, { registerLocale } from "react-datepicker";
import "react-datepicker/dist/react-datepicker.css";
import ja from "date-fns/locale/ja";
//日本語化
registerLocale("ja", ja);

export const Calendar = () => {
  //初期値は当日
  const initialDate = new Date();
  const [startDate, setStartDate] = useState(initialDate);

  //指定できる日付は31日後まで
  const endDate = new Date(initialDate);
  endDate.setDate(endDate.getDate() + 31);

  console.log("startDate = " + startDate);
  console.log("endDate = " + endDate);
  const handleChange = (date: Date) => {
    setStartDate(date);
  };

  return (
    <div className={"ReservationCalendar"}>
      <p className="dateText">日付:</p>
      <div className="calendar">
        <DatePicker
          locale="ja"
          selected={startDate}
          dateFormatCalendar="yyyy年 MM月"
          dateFormat="yyyy/MM/dd"
          onChange={handleChange}
          minDate={startDate}
          maxDate={endDate}
        />
      </div>
    </div>
  );
};
```

1\. datepickerのインストール
`npm install react-datepicker --save`でdatepickerをインストールします

2\. 日本語化
日本語対応されているので日本語化していきます
```typescript
今回はwebアプリを開いた日を初期値にしたかったのでnew Date()で設定しました。
```

`DatePicker`コンポーネントを呼ぶ際のオプションで`locale="ja"`を指定
```typescript
locale="ja"
```

3\.初期値設定
今回はwebアプリを開いた日を初期値にしたかったのでnew Date()で設定しました。
```typescript
//初期値は当日
  const initialDate = new Date();
  const [startDate, setStartDate] = useState(initialDate);
```

4\. 範囲指定
今回は当日から31日後まで日付を指定できるようにしました。
31日後を超えるとこんな感じ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/c966d5c2-95ab-cead-cf3c-019f3f960314.png)

```typescript
  //指定できる日付は31日後まで
  const endDate = new Date(initialDate);
  endDate.setDate(endDate.getDate() + 31);
```
getDateで当日の日付を取ってきて+31日しています。

これをオプションで設定します。
```typescript
  minDate={startDate}
  maxDate={endDate}
```
`minDate`に当日、`maxDate`に31日後までの日付指定をしています。

5\. 日付フォーマット
日本語化してもフォーマットは変わらないのでお好みでフォーマットを変更します
```typescript
   dateFormatCalendar="yyyy年 MM月"
   dateFormat="yyyy/MM/dd"
```

以上、簡単に作ることができました！
STP/RSTPの仕組み個人メモ

20年前検証に利用したSTP/RSTPのメモ(紙)が出てきた。
おそらく仕組みはそれほど変わっていないと思い、せっかくだからメモをデータに残す。

# STP
- 1つのスパニングツリーではRootBridgeは1つ(ブリッジIDがもっとも小さいもの機器がRootBridgeになる)
- BPDUパケットによるやり取り(2秒間隔)でツリーを構築、維持
- RootBridgeに一番近いポート(コスト最小)がRootポートになる
- リンク毎にRootポート、代表ポートを選ぶ
- Rootポート、代表ポートにならないポートがBlockポート
- Blockポートにより、ループにならない

### Rootポート断でスパニングツリーの再計算
- スパニングツリーに組み込まれた機器のリンクの変化があった場合トポロジーチェンジのBPDUが送出される。
- ただ、送出されても通信断は発生しない。
- Rootポートが変化する場合に通信断が発生する。
- Rootポート変化に伴い、リスニング(15s)～ラーニング(15s)を経てフォワーディング
※トポロジーチェンジのBPDU受信によりMACテーブルがクリアされる



# RSTP
- リスニング(15s)～ラーニング(15s)を経てフォワーディングを無くしたもの。
- 「トポロジーチェンジのBPDU」無し
- BPDUv2としてトポロジーチェンジのフラグが立つ。　(その後MACテーブルがクリア)
- Rootポート変化に伴い、リスニング～ラーニングを経てフォワーディングを省略。
※AlternatePortが瞬時にフォワーディングとなる。

### RSTPでもSTPと同じ断時間が発生する場合がある。
RootポートがないリンクとかSTPになる



# MSTP
VLAN毎に経路を変えたい場合に利用
[Plotly+Streamlit]Pythonで時系列データを可視化する

## 概要
* StreamlitとPlotlyというライブラリを使って時系列データの可視化ツールを作成した
* **Plotly**で**インタラクティブな操作ができる**グラフを描画
  * Pythonの有名なグラフ描画ライブラリである**matplotlib**や**Seaborn**に比べ、グラフ上でドラッグすることでズーム操作等ができる！
  * 使用言語は**Python**のみ。フロントの知識（HTML, CSS, JavaScript, etc...）は不要！

* この記事で紹介しないこと
  * **Streamlit**, **Plotly**の詳細な使い方
  * Python動作環境構築の手順

## はじめに
私の部署では、船のエンジンに関する業務を行っています
船舶のエンジンのセンサから収集した計測データを使って機械学習モデルを作成し、実際の船舶運航時にエンジンに異常がないかをチェックするシステムを運用しているのですが、モデル作成のフェーズにてあるツールを作ってほしいという要望が到来しました
作成するアプリケーションの概要は以下の通りです
* 計測データ（時系列データ）とスコア（機械学習モデルによって算出される、異常の度合いを示す値）を**並べて表示したい**
* センサ数が多い（最大100個くらい）ので、すべてのセンサをグラフとして表示せず
**選択したセンサのみグラフとして表示**したい
* オンライン環境には接続せず、ローカルにあるデータを参照する

## できたもの
こんな感じです
![動作サンプル.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289210/6661ec44-4ad5-fda3-afca-66493e1e92e8.gif)

### 処理の概要
今回のアプリケーションではグラフの元データはcsvファイルで用意されています
* ディレクトリ構成はこんな感じ（自動生成するものなので規則性があります）
  <img width=200px src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289210/61564bd7-5eca-0948-2f50-674ba2a43a96.png">

アプリ右上1段目の部分でユーザにエンジン等を選択してもらい、この部分の情報によってプロット元となるcsvファイルへのパスが確定します

* 1段目のUI
![select_csv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289210/2408521c-4d26-78e6-afcf-96d036d7fe48.png)

その後、選択されたセンサに応じて元データを絞り込み、「Plot Graph」クリック時に作成されたDataFrameの内容で描画される...という流れです

![filter1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289210/91c09bab-8529-6fa1-0165-a3d63f47f3b5.png)
![filter2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289210/4ae9bec8-48a9-926d-add9-fb2ae26c1339.png)

## ライブラリの概要
今回のアプリケーションでメインとなる使用モジュールのStreamlitとPlotlyについてですが
* Stremalit -> UI担当
* Plotly -> グラフ担当
といった役割です

### Streamlit
フロントの知識を使わずともいい感じのWebアプリケーションを作れるPythonライブラリです
似た役割のPythonライブラリとして[Dash](https://dash.plotly.com/introduction)があり、こちらはStreamlit以上にPlotlyとの連携を前提としているような気がします

それぞれに利点があるのですが、なんとなく見た目が好みだったので今回は**Streamlit**を選択しました

Streamlitでは、サイドバーそのものやチェックボックス、プルダウンメニューやボタンまで
色々な入力UIが用意されており、細かいレイアウト等を指定せずともいい感じの見た目に仕上がります
どんなものが用意されているかは公式リファレンスから確認できます
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289210/1def7f22-c7dd-c531-d2ac-81bce6ac7f91.png" width=400px>
https://docs.streamlit.io/library/api-reference/widgets

### Plotly
Pythonのグラフ描画ライブラリです
Pythonでグラフといえば**matplotlib**ですが、こちらと比較して自分で描画されたグラフを操作することができます
![Plotly.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289210/4e599d29-6e36-9615-6393-1e51523a780e.gif)

データ全体の傾向も見たい...けど注目すべき箇所があればその部分に注視したいという場合に適していると思います

似た役割のライブラリに[Bokeh](https://docs.bokeh.org/en/latest/docs/first_steps.html)があります
こちらは使っていないので詳しいことはわかりませんが、やりたいことに適しているか+見た目等の観点から今回はPlotlyを選択しました

## おわりに
使用言語Pythonのみで時系列データ可視化のアプリケーションを作りました
こういうのが作れるよ～という紹介として参考にしていただければ幸いです

## リンク
[Streamlit公式ドキュメント](https://docs.streamlit.io/)
[Plotly公式リファレンス(Python)](https://plotly.com/python/)
Testlink 背景に画像を表示する

# Testlink が殺風景なので背景に画像を表示させてみた

Testlink Ver 1.9.9 

以下のフォルダに表する画像イメージファイルを置く。
ドキュメントルート htdocs の下の img フォルダ
例： tlBG.jpg

背景イメージはTestLinkオリジナルの薄いブルー(#EEEEEE)に近い色合いが違和感なく馴染みます。

下記フォルダにある　testlink.css を編集

---
    C:\xampp\htdocs\testlink\gui\themes\default\css
---

先頭部分の以下のセクションで background-image を指定する。

---
    /* ***** GLOBAL HTML ***************************************************************** */
    body, body.testlink {
    background:      #EEE; 
    background-image: url(/img/tlBG.jpg);　　/*この行を追加する*/
    font-family:     'Trebuchet MS', Arial, Verdana, sans-serif;
    font-size:         small;
    margin:            0px;
    padding:        0px;
    }
---

testlink を再表示させる。

![tlBG-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114660/2343a484-b2be-9878-56cd-d65d2fd230e0.png)

* 背景画像を表示させると、テストレポートの背景まで画像になって見にくい
* C:\xampp\htdocs\testlink\gui\templates\results
resultsNavigator.tpl
にて背景色の指定がなかった。BGColorの指定が必要。
62行目付近、47行目、52行目も修正

---

    <div style="margin:3px; padding: 15px 0px; background-color:#EDF7FF;" >

---


* タイトル行の背景も見にくいので以下を修正。
testlink.css 変更

---

    /* * Menu bar specific *************************************** /
    div.menu_title {
    background: #EEEEEE; /*この行を追加/
    margin-left: 135px;
    padding: 3px;
    }
---
Fortigateのstatus/log確認コマンド


## FortigateのログをCLIベースで確認したいとき

Forigateをリプレイスした際に特定のサービスが通信不可になる現象が発生した際、
ポリシー許可はされているがログでdenyログが無いか確認したかったので以下を参考にしながらCLIコマンドでログを出力した。


【参考】fortigateのstatusを確認したい時

https://hirotanoblog.com/fortigate-cli/4566/#toc22


【参考】ログ出力に関する設定

https://www.network-engineer.info/fortigate/fortigate-cli-log/



# pagingを無くす
以下のコマンドで、output を more から standerd に変更することでページングせずに表示させることが出来る。

~~~
 config system console
  set output standerd
 end
~~~

設定を戻す場合は、output を more に戻します。
~~~
 config system console
  set output more
 end
~~~
【Node.js入門】いままで避けてきたから特徴だけはおさえておきたい

Node.jsをこれまでほとんど勉強してきませんでした。
普段触れることもある言語ですが、ないがしろにしてきたので改めて学んでみました。

:::note
【こんな方にオススメ】
・Node.jsについて勉強したことがない
・Node.jsを勉強しようと思っているけど1歩踏み出せない
:::

本記事は下記書籍の要約です。
気になった方はぜひ読んでみてください！

:::note note
解釈が間違っている場合は遠慮なくコメントをいただけると大変嬉しいです！
:::

https://gihyo.jp/book/2023/978-4-297-12956-9

## 本書の構成
ざっくり下記のような構成でした。
- Node.jsについて
- JavaScriptの基本的な構文
- Node.jsの活用
- フロントエンドとバックエンド
- 運用とチューニング

私は初学者なのでその中でもNode.jsの特徴について触れたいと思います。

## Node.jsってなに？

Node.jsはChromeに内蔵されているV8というJavaScriptの実行環境のこと。
2009年に登場して、サーバーだけでなく今ではフロントエンドまわりで見ない日はなくなり身近な言語となりました。

## Node.jsの言語特徴

### Node.jsはNon-Blocking I/O（ノンブロッキング Input/Output）
「シングルプロセス/シングルスレッド」と聞くとウッとなるかもしれません。
反対にマルチスレッドという言葉がありますが、要するに一つのスレッドで処理するぐらいに理解しています。

### Node.jsのイベントループ
処理の順番のことだと理解しています。
ループが止まると次の処理ができないため同期処理をなるべく減らしながら記述できることが良いとされているようです。

:::note info
「イベント駆動型の非同期フロー」というものがあるらしく、読んだ書簡はReactなどのライフサイクルに似ているな…という印象です。（全く違うものだと思いますが…）
:::

### Node.jsはネットワーク処理が得意
「シングルプロセス/シングルスレッド」の話に通じるものです。
Node.jsはNon-Blocking I/Oで動作するためリソースを効率的に活用できるようになるとのこと。
マルチスレッドでなくても早く動く仕組みとのこと。

### 動画エンコードは苦手
動画のエンコーディングやCPUの中心処理はNode.jsの利用は適さないそうです。
Node.jsを利用するから早いわけではなく、記述する際に同期処理をさけないとパフォーマンスが悪くなる可能性があるので注意が必要です。

:::note alert
なんでもそうですが、何かを使うから早いわけではなく適切な作法を学ばないと真の力は発揮できないということですね…
:::

### みんな大好き「npm」
もともとは「Node package manaager」と言って、Nodeのコードを再利用するために作られたものだそうです。
npmを使ってインストールしたパッケージはバージョンの管理や環境の再構築が容易のため現代のフロントエンドの開発には欠かせません！

## 【まとめ】
TypeScriptが使えたり、Node.jsとJavaScriptの違いなど細かいところまで詳しく解説されており非常にわかりやすい書籍でした。
もっと読み込んでNode.jsだけでなくサーバーのことについても解像度を上げていきたいです！

また、これまで避けてきたNode.jsですが意外にJavaScriptを知っていれば書けそうという思ったのでしっかり踏み込んでいきたいと思いました！
Indigo VPS　初期設定メモ

VPSを契約した後の初期設定についてまとめてみました。
記載日　2023年1月20日
## 環境について
VPS　WebARENA Indigo
OS   Ubuntu22.04

# 1.パッケージの更新
```
# パッケージリストのアップデート
$ sudo apt update
# パッケージのアップデート
$ sudo apt upgrade -y
```
# 2.タイムゾーンの変更
タイムゾーンをAsia/Tokyoに変更
```
$ sudo timedatectl set-timezone 'Asia/Tokyo'
```
# 3.言語を日本語に変更
日本語パッケージのインストール
```
$ sudo apt install -y language-pack-ja
```
インストールの確認
```
$ localectl list-locales
C.UTF-8
en_US.UTF-8
ja_JP.UTF-8
```
日本語パッケージを適用
```
$ sudo localectl set-locale LANG=ja_JP.UTF-8
```
# 5. 再起動
```
$ reboot
```
# 6.まとめ
キータの情報は、いつも参考にさせて頂いているのですが、
投稿する側になるのは、初めてなので結構大変でした。
質は高くなくても、アウトプットしていけば何か身につくはずなので、
頑張って投稿していきたいです！

# 6.参考にしたサイト
[Indigo公式](https://help.arena.ne.jp/hc/ja/sections/360009023513?a8=0NBZ9NG73DCW5lykk1Cky8RhlVT9NnI8LBhkkVCpieyCzVg2pnB0UVg2UOiV6cB0iNU83nBuZn4Mxs00000004307004&_gl=1*1d0wawf*_ga*MTQ3NzIyNTQ1NC4xNjcwOTA2Njg5*_ga_QJHKM384Y3*MTY3NDE3NDc3MC4xMS4xLjE2NzQxNzYxMDguNDkuMC4w"Indigoスタートアップガイド")
Flutter Projectの作り方

この記事では、Flutter Projectの作り方について解説していきます。


# 動作環境

OS: MacOS Ventura 13.1
プロセッサ: 2.6 GHz 6コアIntel Core i7
Android Studio: Chipmunk | 2021.2.1

# プロジェクトの作り方

1. まず始めにAndroid Studioを立ち上げ、画面中央のNew Flutter Projectをクリックします。
![スクリーンショット 2023-01-20 9.08.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933781/e755ad1d-49dc-4eb1-5d21-df3cd2c6a47c.png)

1. 次にFlutter SDK pathを選択し、右下のNextをクリックします。
![スクリーンショット 2023-01-20 9.28.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933781/e69512a8-30d3-abe5-2771-0132fa5be907.png)

1. Project name, Project locaton, Description, Organizationを変更し、開発したいプラットフォームを選択します。完了したら右下のFinishをクリックします。
※特に<font color="red">Organization</font>を変更していない場合、アプリをストアにリリースできないので注意！！
![スクリーンショット 2023-01-20 9.51.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933781/82b57ec4-6826-72fb-339f-19143f1d8873.png)

1. これでFlutter Projectが完成しました！
![スクリーンショット 2023-01-20 9.32.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933781/50af622e-a937-0761-8486-36011211e682.png)