OmniAICreator/Qiita-1.07M huggingface dataset:
Power Automate for desktop のカスタム フォームの利用シーンを考えてみる

# Power Automate for desktop のカスタム フォームとは
2022 年 2 月の Power Automate for desktop (以下、PAD) のアップデートで、カスタム フォーム (Custom form) の作成と表示機能が追加されました。
PAD のフローの中で、任意の入力項目やボタンを追加したフォームを作成し、フロー実行時に表示することができます。
PAD の前身にあたる WinAutomation に備わっていた機能の 1 つでしたが、PAD にも満を持して追加されました。

本機能は、2022 年 2 月のリリース時点ではプレビュー機能として追加されており、この記事を作成した時点では、日本語の環境の PAD では正常に動作しないことがあることを確認しています。(フォームの作成でエラーが生じることがあります。)

そのため、この記事では、カスタムフォームの簡単な紹介と利用シーンを考えて、来たるべき一般公開に備えてみたいと思います。

# カスタム フォームの紹介
カスタム フォームの作成方法や利用方法について簡単にまとめてみました。

### カスタム フォームを作成する
カスタム フォームは、[メッセージ ボックス] のアクション グループ上にある、[カスタム フォームの表示 (プレビュー) ] アクションから利用することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/a432a3fa-6f56-3195-4f30-2b70449e886f.png)

追加したアクションからカスタム フォームの作成画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/222d3a93-e2b2-7add-5125-51e20ba38c22.png)


入力用のテキスト ボックスやボタン、ファイル選択ダイアログをドロップ アンド ドロップで設定し、フォームを作成することができます。フォームの作成は、勿論ノーコードです。
![CS006.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/479c9875-ef9d-02cb-8319-5ec538d3bfb2.gif)

### カスタム フォームを実行する
フローを実行すると上で作成したカスタムフォームが表示され、データの入力や表示を行うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/26e5df29-8218-f5ee-eeda-5144289883b2.png)

入力を行った結果は、カスタムオブジェクトという変数の中に結果が格納されます。結果をもとに後続の処理を実行することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/3888bbef-4740-1eea-b3cd-b78c93720d8e.png)

# カスタム フォームの利用シーンを考えてみる
カスタム フォームは、上述の通り PAD のフローの実行時に使用できるフォームになります。
どのような場面で使えるか、いくつか利用シーンを考えてみました。

### 1. 操作対象のファイルを指定して処理をしてもらう
PAD を使用するシナリオとして、Excel ファイルや CSV ファイルの情報を基幹システムに登録するような内容が考えられます。
この場合、処理対象のファイルを特定のフォルダーに処理前に保存しておくようなオペレーションが想定されますが、ファイルの保存忘れや異なるファイルを保存したために、処理が正常に実行できない可能性があります。
カスタム フォームには、添付ファイルを受け入れることができる項目があるので、それを使用することで、処理実行時にファイルを指定して処理を実行することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/7db2215c-3cb5-2aba-08bd-a025282948a5.png)

### 2. 処理に関する情報を入力する
システムにログインして処理を実行するタイプ処理を実行しているユーザーの情報や処理の日付など、
変数やローカルファイル上にユーザー ID とパスワードの情報を残すことがないとセキュリティを高めた運用を実現できる可能性があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/425066e4-8d29-6653-7179-2b088a889d6d.png)

入力文字列は現時点で入力時にマスキングすることはできないので注意です。
ただし、PAD では、変数に格納された値を機密データをマスクし、ログに値を保存しないようラベル設定ができるので、併用すると良いかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/dae6f8a2-e871-a1b0-846e-20e6fbefc782.png)

### 3. 画像を見て処理をする
カスタム フォームには、画像を表示するコントロールが備わっています。
画像を見て処理を判断するような処理がある場合は、カスタムフォーム上に画像を表示して、確認した結果を入力の上処理を行うこともできます。(特定の画像だけでなく処理内容に応じた画像を動的に表示することも可能です。)
OCR の機能と組み合わせて使っても面白いかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/74920294-ce61-bf67-6be2-787e3b8d88eb.png)

# カスタムフォームは 「Human in the loop」 の実現方法の 1つ
例で記載した自動化処理の中で、例外対応や、確認作業など、あえて人の判断を含めることで、より効率的で正確な自動化を実現することを 「Human in the loop」 と言うそうです。
カスタム フォームを介することで、フローの中で人の判断や対話式の操作を加えることで、より正確で多彩な処理を実現することができるのではないとか期待しています。
今回のカスタム フォームの追加は大きなアップデートだと思います。
【Flutter】IOSのモーダルアラートを日本語にLocalizeする方法

# はじめに
Flutterで開発したIOSアプリを審査に提出した際、
モーダルアラートが日本語になっていないとのことでリジェクトされました。

当方、IOSアプリの経験がなく結構ハマったため
同じようにハマられている方向けに解決策を記載します。

# リジェクト内容の詳細

要約すると
> 日本語設定なのにフォトライブラリのモーダルアラートが英語になっています。


フォトライブラリのモーダルアラートとはこのことです。
![Screen Shot 2022-03-03 at 12.01.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563564/48e915f8-68ee-9840-6874-f1a0eb63976d.png)

赤枠の部分を日本語にしなければいけないみたいですね。


原文
> Guideline 4.0 - Design
> We noticed an issue in your app that contributes to a lower-quality user experience than Apple users expect:
>  - Your app's photos modal alerts are written in English while the app is set to the Japanese localization. To help users understand why your app is requesting access to a specific feature, your app's modal alerts should be in the same language as your app's current localization.
> 
> Next Steps
> To resolve this issue, please revise your app to address all instances of this type of issue.


# 日本語にする方法

### プロジェクトに日本語を追加する

1. Xcodeで対象のFlutterプロジェクトを開きます
2. 左のサイドメニューの`Runner`を選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563564/88435adc-7ba3-82fb-9ba9-184ebe561f10.png" width="400" /><br>
選択すると真ん中の画面の左側にPROJECTとTARGETSが表示されるはずです。

3. PROJECT配下のRunnerを選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563564/0341e290-9251-1e69-8669-aa7f4d356e25.png" width="400" /><br>

4. 真ん中画面下部のLocalizationsの`+`ボタンをクリックし`Japanese`を追加
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563564/53c9624d-533a-46c6-7615-9c006520a610.png" width="400" /><br>
Finishをクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563564/ea46410c-a439-7c93-a594-2fc1c90326da.png" width="400" /><br>

### アラートのテキストを日本語にする

アラートのテキストはRunner > Runner > Info.plistで設定できますが、  
これを日本語にローカライズするには新しくファイルを作り、日本語のテキストを記載します。

**1． ファイルを作成する**
左のサイドメニューのRunner > Runnerを選択して
File > New > File...を選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563564/724454cc-a313-9449-c014-fdb909249bb5.png" width="400" /><br>
Strings.Fileを選択してNext
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563564/04f42f4c-835d-4c75-c316-5b70cbe9df07.png" width="400" /><br>
ファイル名は`InfoPlist.strings`にします。
保存場所はXcodeで見ると`Runner > Runner`
Vscodeで見ると `Flutter project > ios > Runner`


**2． InfoPlist.stringsをローカライズする**
InfoPlist.stringsを選択したら右側にLocalize...ボタンが表示されるのでクリックします。
クリックすると`Do you want to localize this file?`と聞かれるので  
Japaneseを選択してLocalizeをクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563564/e15f1ded-55ad-24a1-4b92-4d6d66a16cd9.png" width="400" /><br>



**3． 対象のKeyを探す**
最初にInfo.plistを開いて該当箇所を探します。
今回はフォトライブラリのアラートなのでKeyは`NSPhotoLibraryUsageDescription`になります。

```xml:Info.plist
<key>NSPhotoLibraryUsageDescription</key>
<string>{アラートに表示する説明文(英語)}</string>
```

※`{アラートに表示する説明文(英語)}`を変更するとアラートの説明文も変更されます。

**4． 日本語対応させる**
先ほど作成したInfoPlist.stringsを開き
`NSPhotoLibraryUsageDescription`に対応する値を記載します。

```
NSPhotoLibraryUsageDescription = "アプリは選択した画像をアプリに投稿するためフォトライブラリへのアクセスが必要です";
```


再度ビルドしてアラート内の説明文が変わっていたら成功です！
Rancher Desktopアンインストール後のWSLの後始末

### Docker Desktop有償化後のDocker環境

まず、私はWSL上で動かすようにした。

https://qiita.com/hkato/items/7cf083ee73753162120a

その後、Rancher Desktopの存在を知ったのでこちらを入れてみた。

https://qiita.com/moritalous/items/14d4099023981dcf4fd2

### 結果

しかし、私の用途では、GUIとKubernetes環境は不要、単純に軽く使いたいのでRancher Desktopは消すことにした。

### アンインストール

通常のWindowsアプリの様に `コントロール パネル\プログラム\プログラムと機能` から削除する。しかし、コマンドプロンプトから`wsl -l`コマンドで見るとrancherのWSL環境が残ったまま(2022-03-03現在)。

```cmd
>wsl -l
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-20.04 (既定)
rancher-desktop-data
rancher-desktop
```

### 対応

コマンドプロンプトから`wsl --unregister`コマンドで消してあげる。

```cmd
>wsl --unregister rancher-desktop-data
>wsl --unregister rancher-desktop
```

### 補足

rancher-desktopのissueを探すとこの話ありました。今後どういう挙動になるかはこちらをチェック。

https://github.com/rancher-sandbox/rancher-desktop/issues/1504

https://github.com/rancher-sandbox/rancher-desktop/issues/1534
MySQL（Amazon Lunux 2）のパケットの最大サイズを変更する

### 初めに
Amazon Lunux 2 + MySQL + Sequelizeを使用して、画像をINSERTする際に以下のエラーが出力された。
MySQLのパケットの最大サイズを変更することよって解決できたため、その方法を記載する。

```
Unhandled rejection Error: SequelizeDatabaseError: ER_NET_PACKET_TOO_LARGE: Got a packet bigger than 'max_allowed_packet' bytes
```

### 環境
■ 使用OS
Amazon Lunux 2
■ MySQLバージョン
5.7.35
■ Sequelizeバージョン
3.30.4
■ データベース管理ツール
MySQL Workbench

### 解決方法

MySQLの設定ファイルを編集する。
```
# vim /etc/my.cnf

[mysqld]
max_allowed_packet=52MB
```
max_allowed_packetという変数に任意のバイト数を格納する。
今回は52MBまでのパケットを許容する設定にする。
※アプリの仕様上必要な値が52MBだったため今回は上記の設定だが、バイト数は任意で変更する。

>MySQL 5.6 Server およびクライアント間で転送可能なパケットの最大サイズは 1G バイトです。

MySQLの公式によると最大サイズは 1G バイトとある。


MySQLを再起動する。

```
# service mysqld restart
Redirecting to /bin/systemctl restart mysqld.service
```

Workbenchにて以下のコマンドを入力して結果を確認。

```sql
show variables like 'max_allowed_packet';
```
![SnapCrab_NoName_2022-3-1_12-28-5_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1229062/a69fa5b5-302d-0804-0a06-663665ee7c17.png)

上記で変更可能である。

## Dockerの場合
[mysql:5.7](https://hub.docker.com/_/mysql)を使用している場合は下記のファイルを変更する。

```
/etc/mysql/mysql.conf.d/mysqld.cnf
```

上記と同じように記載を行い、再起動すれば設定が反映される。


### 参考文献
https://dev.mysql.com/doc/refman/5.6/ja/packet-too-large.html
sendgrid で 許可IP を php から追加

sendgridを利用し、IPをホワイトリストに追加して利用するのはセキュリティ上必須である。

しかし、接続元のIP設定を間違えたり、
モデムを変更した場合などログインできなくなる。

上記の場合は api_key を用いて
php から ip アドレスを追加してログインできるようにしよう。

前提として当該サーバーからはメールを送信できる状態である。
（認証済み）

参考
https://github.com/sendgrid/sendgrid-php/blob/main/examples/accesssettings/accesssettings.php

```hoge.php

$sg = new SendGrid(env('SENDGRID_API_KEY'));

$request_body = json_decode('{
"ips": [
    {
        "ip": "82.122.28.23"
    },
    {
        "ip": "37.126.154.*"
    }
    ]
}');

try {
    $response = $sg->client->access_settings()->whitelist()->post($request_body);
    print $response->statusCode() . "\n";
    print_r($response->headers());
    print $response->body() . "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}


```

これで指定したIPをホワイトリストに追加することが可能。
読み込んだらツイートできるQRコードの作成方法

(1)以下のURLエンコード欄にツイート内容を記載してエンコード

https://www.tagindex.com/tool/url.html

(2)以下の「テキスト」部分を(1)で作ったものに置き換え
https://twitter.com/intent/tweet?text=テキスト

(3)以下サイトの「さっそく作る」からQR作成

https://qr.quel.jp/
PowershellでWindows10のタスクバーにピン留めする

できないという情報ばかりでしたが、できる方法を見つけたので記載します。

# ハマりポイント
１．タスク バーにピン留めする(K)　は駄目（(K)が不要）。
（右クリックメニューのエクスプローラ上とスタートメニュー上の表示の違い）

２．設定後にエクスプローラの再起動やサインアウト＆インが必要

# タスクバーにピン留めするPowershell

```powershell:CreateTaskPIN.ps1
#########################################################
# ショートカットをタスクバーにピン止めする
#########################################################
function Pin2Taskbar($FileFullPath){
	if( Test-Path $FileFullPath ){
		$PathName = Split-Path $FileFullPath -Parent
		$FileNmae = Split-Path $FileFullPath -Leaf

		$Shell = new-object -com "Shell.Application"
		$TergetFolder = $Shell.Namespace( $PathName )
		$TergetItem = $TergetFolder.ParseName( $FileNmae )
		$Verb = $TergetItem.Verbs() | ? {($_.Name -match "^タスク バーにピン留めする") -or ($_.Name -match "^&Pin to Taskbar")}
		$Verb.DoIt()
	}
}

Pin2Taskbar $Args[0]
```

# 実行ファイル（bat）

１．※ps1と同パスに配置する。
２．右クリック「管理者として実行」する。

```bat:CREATE_IE_PINSTOP.bat
@echo off
echo;

REM ショートカットのフルパス
set LNK="%appdata%\Microsoft\Windows\Start Menu\Programs\Accessories\Internet Explorer.lnk"
REM Powershell実行環境設定有無に関わらず実行可能にする設定
set POW=C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
set PSExecutionPolicyPreference=RemoteSigned
REM エクスプローラ再起動コマンド
set REB="spps -name explorer"

%POW% %~dp0CreateTaskPIN.ps1 %LNK%
echo;
%POW% %REB%

pause
```
【備忘】PostgreSQL バックアップ～リストア テーブル全削除


## 概要
>とあるデータ移行バッチ試験のバグでDBが汚染されDBを試験実施前に戻す作業を行ったので
>備忘録としてバックアップからテーブル削除、リストアまで手順を記述してます。
>※使用しているDBはPostgreSQL 12.6 （バージョンによってpg_dump等のコマンドが使用できないことがるので注意）


### バックアップ
 試験実施前には必ずバックアップは取っておきましょう
##### ※ デフォルト（スクリプト形式で出力）
```console
$ pg_dump  -h ホスト -p ポート -U ユーザー -d DB名　> 出力先パス/ファイル名
```


### テーブルの全削除
##### ※ 全てのテーブルがpublicスキーマーであること
```console
--スキーマーを全削除
$ drop schema public cascade;

--削除したスキーマーを再作成
$ create schema public;

--所有者を付与
$ alter schema public owner to ユーザー ;
```

### リストア
##### ※ スクリプト形式で出力しているのでpsqlでリストアする
```console
$ psql -h ホスト -p ポート -U ユーザー -d DB名 < 参照先ディレクトリ/ファイル名
```
Javaを使用してPowerPointスライドをコピーする方法

この記事では、Javaプログラムを使用してPowerPointスライドをありのままコピーする方法を紹介します。ここでコピーするケースを2つ紹介します。

・同じスライドドキュメント内でコピーする
・異なるスライドドキュメント間でコピーする

**使用したツール：Free Spire.Presentation for Java（無料版）**

JARファイルの取得とインポート：

方法1：jarファイルパッケージは、E-iceblueの公式Webサイトから[ダウンロード](https://www.e-iceblue.com/Download/presentation-for-java-free.html)できます。ダウンロード後、ファイルを解凍し、libフォルダー内のSpire.Presentation.jarファイルをJavaプログラムにインポートします。次のインポート結果を参照してください。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/515c1fed-23a4-e4ea-dbda-fec73bd693e8.png)

方法2：Mavenリポジトリを介してインストールおよびインポートします。

以下は二つのテストドキュメント：
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/a3612c2b-4f98-c453-ca55-1d4b0d2e75de.png)

## Javaサンプルコード
**同じスライドドキュメント内でコピーする**

```
import com.spire.presentation.*;

public class Copy1 {
    public static void main(String[] args) throws Exception{
        //テストするPowerPointドキュメントをロードする
        Presentation ppt = new Presentation();
        ppt.loadFromFile("C:\\Users\\Administrator\\Desktop\\test.pptx");

        //スライド1（コピーされたスライド）を取得する
        ISlide slide = ppt.getSlides().get(0);

        //シングルコピー：1番目のスライドを3番目のスライドとしてコピーする
        int index = 2;
        ppt.getSlides().insert(index, slide);

        //シングルコピー：1番目のスライドを3番目のスライドとしてコピーする
        for(int i = 3;i < 5;i++) {
            ppt.getSlides().insert(i, slide);
        }
        //ドキュメントを保存する
        ppt.saveToFile("result1.pptx",FileFormat.PPTX_2013);
        ppt.dispose();
    }
}
```
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/a2871012-6347-83cb-b413-a0f641c6f846.png)

**異なるスライドドキュメント間でコピーする**

```
import com.spire.presentation.*;

public class Copy2 {
    public static void main(String[] args) throws Exception{
        //スライドドキュメント1をロードし、コピーする必要がある3番目のスライドを取得する
        Presentation  ppt1 = new Presentation();
        ppt1.loadFromFile("C:\\Users\\Administrator\\Desktop\\test.pptx");
        ISlide slide = ppt1.getSlides().get(2);

        //スライドドキュメント2を読み込み、スライドドキュメント1からコピーしたスライドをドキュメント2の3番目のスライドとして挿入する
        Presentation ppt2 = new Presentation();
        ppt2.loadFromFile("C:\\Users\\Administrator\\Desktop\\sample.pptx");
        int index = 2;
        ppt2.getSlides().insert(index,slide);

        //スライドドキュメント2を保存する
        ppt2.saveToFile("result2.pptx",FileFormat.PPTX_2013);
        ppt2.dispose();
    }
}
```
コピーした結果：
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/24a82cd3-6c8d-0d0b-4d68-997d78af749f.png)

今回のPowerPointスライドをコピーする方法は以上でした、最後まで読んでいただきありがとうございます。
[Laravel Livewire]非同期でURLのパラメータを書き変える

# はじめに
環境
・Laravel 8.x
・Livewire 2.x

この過去記事と環境は同じです
<a href="https://qiita.com/sgrs38/items/89a6a59b896669dfd725">【Laravel】Laravel-AdminLTEとlivewireを布教したい</a>

livewireで非同期な検索機能を実装したとして、そのままだとURLにパラメータが無いので検索結果をURLで共有する事が出来ません。
livewireプロパティとURLパラメータを同期する方法があったので書きます。

<a id="#前提"></a>
# queryStringプロパティ
例としてこのようなview側とphp側を用意します

```php:app/Http/Livewire/Sample0303.php
<?php

namespace App\Http\Livewire;

use Livewire\Component;

class Sample0303 extends Component
{
    public $search_word, $search_word2;

    public function render()
    {
        return view('livewire.sample0303')
            ->extends('adminlte::page')
            ->section('content');
    }
}

```

```html:resources/views/livewire/sample0303.blade.php
<div>
    @section('content_header')
        <h1>検索</h1>
    @stop
    <div class="card">
        <div class="card-body">
            <div class="row">
                <div class="col-6">
                    <div class="row">
                        <x-adminlte-input name="search_word1" label="検索文字列1" value=""
                                          fgroup-class="col-md-4" wire:model="search_word"/>
                        <x-adminlte-input name="search_word2" label="検索文字列2" value=""
                                          fgroup-class="col-md-4" wire:model="search_word2"/>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

```

この状態でフォームに値を入力してもURLは変わりません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282328/75980faa-4bf1-0482-4dc1-6aed1716eef3.png)

``queryString``プロパティにURLのパラメータと同期させたいプロパティ名を書きます。

```diff_php:app/Http/Livewire/Sample0303.php
<?php

namespace App\Http\Livewire;

use Livewire\Component;

class Sample0303 extends Component
{
    public $search_word, $search_word2;

+    protected $queryString = ['search_word', 'search_word2'];

    public function render()
    {
        return view('livewire.sample0303')
            ->extends('adminlte::page')
            ->section('content');
    }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282328/f2bb2910-86be-a097-b110-7c5d7e8d3381.png)

フォームに値を入力するとURLパラメータと同期されるようになりました。

同期のタイミングは``wire:model``の修飾子と同じです。
何も書いていなければ入力と同時に、``lazy``ならフォームからフォーカスが外れた時、など。

``queryString``プロパティを設定していれば、``/?search_word=test&search_word2=test2`` にアクセスした場合、
``search_word``、``search_word2``プロパティに値がセットされた状態でページを開けます。

``as``構文でパラメータの表記名称を変更する事も出来ます

```php
    protected $queryString = [
        'search_word' => ['as' => 's'],
        'search_word2' => ['as' => 's2']
    ];
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282328/200ad50b-559f-9cc5-5727-214fb4c8c876.png)



<a id="#reference"></a>
# 参考文献
- [livewireドキュメント:クエリ文字列](https://laravel-livewire.com/docs/2.x/query-string)
std::multisetに比較関数を定義したい

## やりたいこと
std::multisetやstd::setを降順で定義したい

### case1 降順で定義したい
各要素に-1をかければいいじゃん？←ダサい

```c++:compareという比較関数を定義
using namespace std;
typedef pair<long long, long long> pll;

auto compare = [](const pll a, const pll b) { return a > b; };
multiset<pll, decltype(compare)> ms{compare};
```
pairにはあらかじめ比較関数が定義されているので、ok
これで例えばイテレータをms.begin()から回した場合、要素を降順に取り出すことができる
Kuberentesコントローラーの監視対象オブジェクトのReconcile処理を並列化するための設定

Kubernetesのカスタムコントローラーで、監視対象のオブジェクトの状態を制御するための制御ループ処理（以下、Reconcile）を同時に複数回すことはできないか調べてみたので結果をメモとして残しておく。

結論から言うと、新しくコントローラーを作成する際に渡すcontroller-runtimeのオプションにMaxConcurrentReconcilesというフィールドがあって、フィールドの説明コメントに書いてあるように、これでReconcileの最大同時実行数を設定できる。

```golang:controller.go
// Options are the arguments for creating a new Controller.
type Options struct {
	// MaxConcurrentReconciles is the maximum number of concurrent Reconciles which can be run. Defaults to 1.
	MaxConcurrentReconciles int

	// Reconciler reconciles an object
	Reconciler reconcile.Reconciler

	// RateLimiter is used to limit how frequently requests may be queued.
	// Defaults to MaxOfRateLimiter which has both overall and per-item rate limiting.
	// The overall is a token bucket and the per-item is exponential.
	RateLimiter ratelimiter.RateLimiter

	// Log is the logger used for this controller and passed to each reconciliation
	// request via the context field.
	Log logr.Logger

	// CacheSyncTimeout refers to the time limit set to wait for syncing caches.
	// Defaults to 2 minutes if not set.
	CacheSyncTimeout time.Duration

	// RecoverPanic indicates whether the panic caused by reconcile should be recovered.
	RecoverPanic bool
}
```
> ソース: [controller-runtime/pkg/controller/controller.go](https://github.com/kubernetes-sigs/controller-runtime/blob/eb292e5d9bd6c59663fc6777ae2b99f901f386e4/pkg/controller/controller.go#L39)

MaxConcurrentReconcilesは複数のループで並列処理を可能にするため、単一のループで処理するのに比べて遥かに早くキューに積まれたリクエストを排出できるようになる。コントローラーの監視対象のオブジェクトが頻繁に変化して、大量のReconcileリクエストがキューに送られてしまうような状況において有効である。

以下、MaxConcurrentReconcilesオプションを設定の設定例になるが、SetupWithManagerにおいてWithOptionsでカスタムコントローラーにMaxConcurrentReconcilesを３で設定している。オプションを指定しない場合はデフォルトの1で設定される。

```golang:gatling_controller.go
// SetupWithManager sets up the controller with the Manager.
func (r *GatlingReconciler) SetupWithManager(mgr ctrl.Manager) error {
	return ctrl.NewControllerManagedBy(mgr).
		For(&gatlingv1alpha1.Gatling{}).
		WithEventFilter(predicate.Funcs{
			DeleteFunc: func(e event.DeleteEvent) bool {
				return false
			},
		}).
		WithOptions(controller.Options{MaxConcurrentReconciles: 3}).
		Complete(r)
}
```
> 元のソース: [gatling-operator/controllers/gatling_controller.go](https://github.com/st-tech/gatling-operator/blob/4d3e204a965b850a70ac090f796c488e66ec5dee/controllers/gatling_controller.go#L1005-L1017)

最後に、MaxConcurrentReconcileに関して、OpenKruiseの[Learning Concurrent Reconciling](https://openkruise.io/blog/learning-concurrent-reconciling/)記事が超絶参考になる。なお、記事中に書かれているが、複数のReconcileが同じオブジェクトを同時に処理することはないとのこと。安心。
WSL Install Memo

Microsoft Windows Subsystem for Linux(WSL)をWindows10 Proにインストールするメモです。
1. Powershellターミナルを管理者として起動します
2. インストールコマンドを実行します
```powershell:PowerSell管理者
wsl --install
```
:::details 実行結果
```text:PowerShell実行結果
インストール中: 仮想マシン プラットフォーム
仮想マシン プラットフォーム はインストールされました。
インストール中: Linux 用 Windows サブシステム
Linux 用 Windows サブシステム はインストールされました。
ダウンロード中: WSL カーネル
インストール中: WSL カーネル
WSL カーネル はインストールされました。
ダウンロード中: Ubuntu
要求された操作は正常に終了しました。変更を有効にするには、システムを再起動する必要があります。
```
:::
3. Windowsを再起動します
4. Ubuntuターミナルが開き、インストールしている旨のメッセージが表示されます
```terminal:Ubuntu
Installing, this may take a few minutes...
```
5. デフォルトUNIXユーザーアカウントを作成します
```terminal:Ubuntu
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: teruroom
New password:
```
6. ウェルカムメッセージが表示され、Ubuntuのプロンプトが表示されます
:::details ウェルカムメッセージ
```bash:Ubuntu
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.10.16.3-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sat Jan 15 02:22:08 JST 2022

  System load:  0.0                Processes:             8
  Usage of /:   0.4% of 250.98GB   Users logged in:       0
  Memory usage: 1%                 IPv4 address for eth0: 172.26.120.168
  Swap usage:   0%

0 updates can be installed immediately.
0 of these updates are security updates.


The list of available updates is more than a week old.
To check for new updates run: sudo apt update


This message is shown once once a day. To disable it please create the
/home/teruroom/.hushlogin file.
```
:::
```bash:Ubuntu
teruroom@DESKTOP-Q98KR5E:~$
```
7. 試しにコマンドを打ってみます
```bash:Ubuntu
teruroom@DESKTOP-Q98KR5E:~$ pwd
/home/teruroom
```
Rubyで特定の数字を検知するプログラムを実装する

# はじめに
プログラミングスクールでRubyについて学習しています。
これから平日は毎日何かしらアウトプットのため投稿を続ける予定です。
今回は特定の数字が存在するかどうかを判定するプログラムをinclude?メソッドを使用して実装していきます。

# 問題
以下の要件を満たすarray123メソッドを実装します。

・配列内に1,2,3が全て入っている場合は、「True」と出力する
・配列内に1,2,3の全てが入っていない場合は、「False」と出力する

```Ruby:雛形
def array123(nums)
  # 処理を記述
end

# 呼び出し例
array123([1, 1, 2, 3, 1])
```
include?メソッドについて
[Ruby 3.1 リファレンスマニュアルinstance method String#include?](https://docs.ruby-lang.org/ja/latest/method/String/i/include=3f.html)
[Ruby 3.1 リファレンスマニュアルinstance method Array#include?](https://docs.ruby-lang.org/ja/latest/method/Array/i/include=3f.html)


まずはif文で1,2,3が全て入っている場合は、「True」、1,2,3の全てが入っていない場合は、「False」を記述しました。
```Ruby
def array123(nums)
   if #条件式
    puts "True"
   else
    puts "False"
   end
 end
```
条件式は公式マニュアルを参考にし、下記のように記述しました。
&&で１かつ、２かつ、３という記述をしています。（とっても単純ですね:smile:） 
```Ruby
if nums.include?(1) && nums.include?(2) && nums.include?(3)
```

あとはこれをガッチャンコしてこう
```Ruby
def array123(nums)
  if nums.include?(1) && nums.include?(2) && nums.include?(3)
    puts "True"
  else
    puts "False"
  end
end
```
これで１,２,３全てが含まれているかを判別することが出来ました:100:
ABC225 B Dif:62 『AtCoder ABC201~225 ARC119~128 灰・茶・緑問題 超詳細解説』サンプル

この記事は **『AtCoder ABC201~225 ARC119~128 灰・茶・緑問題 超詳細解説』** のサンプルです。

**【その他のサンプル】**
ABC201 A：https://qiita.com/sano192/items/3258c39988187759f756
ABC213 C：https://qiita.com/sano192/items/9cd14b2cefd8bafa5615
ABC221 D：https://qiita.com/sano192/items/8679200f0f89e636b354
ARC122 B：https://qiita.com/sano192/items/1f314701f2d5b18c8816

「ものすごく丁寧でわかりやすいABC解説」シリーズをベースに【キーワード】【どう考える？】【別解】を追加し、【解説】と【実装のコツ】を分けることでよりわかりやすく、具体例や図もより豊富に全ての問題の解説を書き直しました！
さらにQiitaでは公開していないARC119~128の灰・茶・緑問題も解説しています！
緑を目指す灰・茶コーダーの方へおすすめ！

https://qiita.com/sano192/items/54accd04df62242b70f0

値段：**300円(Kindle Unlimited対象)**
**【kindle】**

https://www.amazon.co.jp/dp/B09TVK3SLV

**【booth(pdf)】**

https://booth.pm/ja/items/3698647

**ARC119~128の部分のみ抜粋した廉価版** もあります。
値段：**200円(Kindle Unlimited対象)**
**【kindle】**

https://www.amazon.co.jp/dp/B09TVKGH17/

**【booth(pdf)】**

https://sano192.booth.pm/items/3698668

https://atcoder.jp/contests/abc225/tasks/abc225_b

**【キーワード】**
なし

**【どう考える？】**
問題文を読むだけでは「スター」というのがどういうものか分かりづらい。入力例を紙に書いてみて、どのような条件なのか確認しよう。
紙に書いてみると各頂点に対してつながっている辺の本数で「スター」かどうか判定できることがわかる。(N-1)本の辺がつながっている頂点があるかないかで場合分けを行えば良い。

**【解説】**
まず「スター」であるというのはどういう状態か、入力例1を紙に書いて確認しよう。

「入力例1」
N：5
a1 b1：1 4
a2 b2：2 4
a3 b3：3 4
a4 b4：4 5

![ABC225_B_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/c6b3cdc3-ef24-b90f-7cb5-608ead3ad24d.png)

これは「スター」である。確かに頂点④から他の全ての頂点へ辺がつながっている。

各頂点に対し、出ている辺の本数を確認し
・(N-1)本の辺が出ている頂点がある→「Yes」を出力
・上記以外→「No」を出力
とすればよい。

**【実装のコツ】**
＜途中終了＞
(N-1)本の辺が出ている頂点が一つでもあれば「Yes」を出力して終了する。

途中終了する場合は
exit()
と書く。

**【提出】**

```python:提出　
# 入力の受け取り
N=int(input())

# 辺の本数を数える
count=[0]*(N+1)

# (N-1)回
for i in range(N-1):
    # 入力の受け取り
    a,b=map(int, input().split())
    # a,bから出ている辺の数を数える
    count[a]+=1
    count[b]+=1

# i=1~N
for i in range(1,N+1):
    # 頂点iから出ている辺が(N-1)本なら
    if count[i]==N-1:
        # 「Yes」を出力
        print("Yes")
        # プログラムの終了
        exit()

# 「No」を出力
print("No")
```
テキストエリアの高さを行数に合わせて自動で変更する

# cssでheightプロパティー、 値autoを使ってテキストエリアの高さを中身の行数によって自動で変更

## 具体的な使用例
```
.css{
 height: auto;
}
```

## 結果
![スクリーンショット 2022-03-03 10.59.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533976/984ee0e1-6299-1f2f-93bd-0d487339d0b0.png)
こんな感じで長い文章でも表示できます。
ABC201 A Dif:12 『AtCoder ABC201~225 ARC119~128 灰・茶・緑問題 超詳細解説』サンプル

この記事は **『AtCoder ABC201~225 ARC119~128 灰・茶・緑問題 超詳細解説』** のサンプルです。

**【その他のサンプル】**
ABC225 B：https://qiita.com/sano192/items/10133eeb6abc64f1441e
ABC213 C：https://qiita.com/sano192/items/9cd14b2cefd8bafa5615
ABC221 D：https://qiita.com/sano192/items/8679200f0f89e636b354
ARC122 B：https://qiita.com/sano192/items/1f314701f2d5b18c8816


「ものすごく丁寧でわかりやすいABC解説」シリーズをベースに【キーワード】【どう考える？】【別解】を追加し、【解説】と【実装のコツ】を分けることでよりわかりやすく、具体例や図もより豊富に全ての問題の解説を書き直しました！
さらにQiitaでは公開していないARC119~128の灰・茶・緑問題も解説しています！
緑を目指す灰・茶コーダーの方へおすすめ！

https://qiita.com/sano192/items/54accd04df62242b70f0

値段：**300円(Kindle Unlimited対象)**
**【kindle】**

https://www.amazon.co.jp/dp/B09TVK3SLV

**【booth(pdf)】**

https://booth.pm/ja/items/3698647

**ARC119~128の部分のみ抜粋した廉価版** もあります。
値段：**200円(Kindle Unlimited対象)**
**【kindle】**

https://www.amazon.co.jp/dp/B09TVKGH17/

**【booth(pdf)】**

https://sano192.booth.pm/items/3698668

https://atcoder.jp/contests/abc201/tasks/abc201_a

**【キーワード】**
なし

**【どう考える？】**
問題文にある「即ち、A3-A2=A2-A1を満たすようにAを並び替えることはできますか？」を判定できればよい。
(A1,A2,A3)の並び替えパターン数が6パターンしかないことに気づけばあとは6パターンを書き下してifで条件分岐するだけ。

**【解説】**
A1,A2,A3の並び替えとしてありうるものと、判定する条件は以下の通り。
(A1,A2,A3) → A3-A2=A2-A1
(A1,A3,A2) → A2-A3=A3-A1
(A2,A1,A3) → A3-A1=A1-A2
(A2,A3,A1) → A1-A3=A3-A2
(A3,A1,A2) → A2-A1=A1-A3
(A3,A2,A1) → A1-A2=A2-A3
これをそのままifで書く。
条件を満たしていれば「Yes」、満たしていなければ「No」を出力する。

**【実装のコツ】**
＜ifの書き方＞
if 条件:
　　処理内容
elif 条件:
　　処理内容
else:
　　処理内容

if,elifは「条件を満たせば」→「処理内容を行う」という意味。コードの上から順に処理を行っていく。
elseは「そうでなければ」すなわち「if,elifの条件が満たされなければ」→「処理内容を行う」という意味。

＜文字列の出力＞
文字を出力する際は
print(”文字”)
というようにダブルクオーテーションをつける。
pythonにこれは変数ではなく、文字であると伝えるため。
・正　print(“Yes”)
・誤　print(Yes)

**【提出】**

```python:提出
# 入力の受け取り
A1,A2,A3=map(int, input().split())

# (A1,A2,A3) → A3-A2=A2-A1ならば
if A3-A2==A2-A1:
    # 「Yes」を出力
    print("Yes")
# (A1,A3,A2) → A2-A3=A3-A1ならば
elif A2-A3==A3-A1:
    print("Yes")
# (A2,A1,A3) → A3-A1=A1-A2ならば
elif A3-A1==A1-A2:
    print("Yes")
# (A2,A3,A1) → A1-A3=A3-A2ならば
elif A1-A3==A3-A2:
    print("Yes")
# (A3,A1,A2) → A2-A1=A1-A3ならば
elif A2-A1==A1-A3:
    print("Yes")
# (A3,A2,A1) → A1-A2=A2-A3ならば
elif A1-A2==A2-A3:
    print("Yes")
# そうでなければ
else:
# 「No」を出力
    print("No")
```

**【別解】**
A1,A2,A3を小さい順に並び替え、条件「A3-A2=A2-A1」を満たしているか調べればifを並べなくても解ける。
まずA1,A2,A3をリストとして受け取り、ソートして、条件を満たすか調べればよい。
以下のように書くとリストを小さい順にソートできる。
(リスト).sort()

```python:別解
# 入力をリストとして受け取り
A=list(map(int, input().split()))

# 小さい順に並び替え
A.sort()

# A[2]-A[1]=A[1]-A[0]ならば
if A[2]-A[1]==A[1]-A[0]:
    # 「Yes」を出力
    print("Yes")
# そうでないなら
else:
    # 「Noを出力」
    print("No")
```
初心者ブロックチェーンに挑戦する　１

# 好奇心だけはある

## 『ブロックチェーン　dapp&ゲーム開発入門』を読みつつ同時進行で手を動かしてみようというだけの

　ちょうど一年前くらいに、老後の楽しみにある壮大なサービスをつくりたい、という妄想を抱いて、2021年５月からプログラミングを学び始め、同６月からflutterの勉強を始め、同７月に[flutter大学](https://kboyflutteruniv.com)に入り、即共同開発に参加して、11月に初めてのアプリである「はじめてのえにっき」をリリースした。思い入れのあるアプリではあるけれど、「壮大なサービス」の練習台という意味でもあった。2022年になって、身辺がブロックチェーン周りの用語で賑やかになり、興味を持つうちに、自律分散、という思想が自分の性格にも理想にもあっていると確信して、はまりつつある。
　語学が好きで、今はフランス語に専念しているけれど、文法とか段階的な学習とか見向きせずに、いきなり小説を読むような性格なので、今回のブロックチェーン周りも、エンジニアとしての基礎はないまま突入するつもり。訳者がせっかく列挙してくれている「事前に読んでおくとよい資料」も、今のところオミットしている。なので、この記事もあまり人様の役には立たないと思うけれど、アプリをつくっていたとき、詰まりどころを記録しなかったという後悔があるので、今回は防備録として、進捗を細かく追っていこうと思う。

## chapter2 イーサリアム開発環境

　形から入る性格なので、わが壮大なサービスのために最新のMacBook Pro 16inchを買った。M1Max、メモリ64GB、ストレージ2T、とりあえず足りるかな。ちなみに、環境構築に5Mbpsで８時間かかるぞと書いてある。我が家のWiFiはNURO光だけど、どうだろう。そもそも、スペックとかよく変わっていない初級者のやることなので、出たとこ勝負です。

　いきなり、HomeBrewのパスが通らないけど、さすがにこれぐらいでは慌てなくなった。エラーメッセージに素直にしたがって、解決。
　テキストエディタを入れろと。お勧めはSublimeTextかAtomと書いてあるけど、VisualStudioが既に入っているので、とりあえずそれでいく。
　gitも既に入っているのでよし。
  Node.jsとNPMのインストール･･･2019年刊行の本で、$ brew install nodeと書いてあり、それでも走るけど、最後に「なんかできずに残ったことがあります」的メッージがあったので、ググって対処するも、解決に至る前に時間切れ。主婦にはほかにもすることがあるのでした。ということで次回に続く。


https://www.amazon.co.jp/dp/B07MXGY6XM/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

https://nullnull.dev/blog/how-to-install-node-js-and-npm-on-m1-mac/

https://www.webdesignleaves.com/pr/plugins/mac_terminal_basics_02.html

https://blog.flutteruniv.com
ASP.NET MVCでセッションの内容を確かめたい

セッションは本来`Controller.HttpContext`に属するため、中身を見ることはできない。
しかし、確認したい場合は出てくる。ビューでセッション変数を読み込む場合だ。
そこで、以下の様なコードをテストに入れる（MSTestを利用しているが、他のフレームワークに即した形で修正すれば大丈夫なはずだ）。

```cs
[TestMethod]
public void Test()
{
    var controllerContext = new Mock<ControllerContext>();
    var session = new Mock<HttpSessionStateBase>();
    var sessionValue = string.Empty; // セッションの値を受け取る変数
    session.SetupSet(s => s["value"] = It.IsAny<object>())
        .Callback((string name, object o) => { sessionValue = (string)o; });
    controllerContext.Setup(p => p.HttpContext.Session).Returns(session.Object);

    var controller = new FooController { ControllerContext = controllerContext.Object };
    var result = contoller.Index() as ViewResult; // FooController.Index()内でSession["value"]の値が"bar"に変わると想定

    Assert.AreEqual(string.Empty, result.ViewName);
    Assert.AreEqual("bar", sessionValue);
}
```

参考：[Tales from the Evil Empire - Mocking indexer setters with Moq](https://weblogs.asp.net/bleroy/mocking-indexer-setters-with-moq)
100日でSQLの達人になる@LeetCode! Day31 <OVER句で複数条件を使う>

## 1308. Running Total for Different Genders （問題レベル: Medium）要課金
今日の問題はこれ。
性別ごとにスコアの累積和をリストアップするという問題。

最初は`OVER句`に複数条件を使う方法を思いつかず、性別毎に累積和を出したものを`UNION`でつなげたもので回答しました。
しかし、`Discuss`を見ると、非常にシンプルな回答ばかり。

今日のポイントは`OVER`句で複数条件が使えるだった。
最終的な回答を提示しておきます。

```:SQL
SELECT gender, day, 
       SUM(score_points) OVER(PARTITION BY gender ORDER BY day) AS total
FROM Scores
```
追記:`PARTITION BY 変数1 ORDER BY 変数2`は、順番も大切。逆にすると動かない。また`ORDER`の前には`,カンマ`は不要！
* [LeetCode](https://leetcode.com/)の問題は、`MS SQL Server`で解いています。
G.U.Introduction

【Corporate Site】

[G.U.Labs株式会社] ：https://gulabs.com/ja/
革新的な発想と技術で、より自由で楽しい世界を。
G.U.Labsは、ブロックチェーンが引き起こす様々な社会変革に対応するためのクラウドツールやソリューションの提供、セキュリティ技術、研究開発力を提供します。


[G.U.テクノロジーズ株式会社]：https://gu-tech.com/
デジタルの力で、人々に自由を。
G.U.Technologiesでは、ブロックチェーンによる金融と情報が融合した新たなデジタル革命時代に向けて、豊かな発想と確固たる技術で誰もが自由で幸せな社会を作っていくことを目指します。

【Product Site】

[G.U.Blockchain Cloud]：https://www.bccloud.net/ja/
日本初。簡単3ステップで
ブロックチェーン基盤を構築。
G.U.Blockchain Cloudは「誰でも簡単・低コスト」に初期導入が可能。Enterprise領域で利用できる機能やセキュリティを備えたEthereum互換ブロックチェーン構築クラウドサービスです。

[G.U.net]：https://www.gu.net/ja/
ブロックチェーンによる
新しいデジタル世界を構築しよう
G.U.netは、ブロックチェーン技術の普及を目的としてEthereum互換ブロックチェーン上でのNFTや
DeFi（分散金融）などの分散アプリ開発（DApps）を体験できるG.U.Sandbox Chainの提供や情報発信を行うサイトです。

[Lunascape]：https://www.lunascape.org/browser/phoebe
シンプル且つ高速で使いやすいDAppsに対応したデスクトップ＆モバイルのタブ型Webブラウザ。
広告ブロック機能やプライバシー保護を重要視し、安心・安全にインターネットを利用可能。

[Lunascape Wallet]：https://chrome.google.com/webstore/detail/lunascape-wallet/nfinomegcaccbhchhgflladpfbajihdf?hl=ja&authuser=0
DApps対応のEthereumウォレット。
Google Chromの拡張機能版。
cloudwatch.get_metric_dataを利用してECSで実行しているタスク数を取得する

事前準備：https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/deploy-container-insights-ECS-cluster.html


    def get_task_cnt():
    """
    ECSタスク数の取得を行う

    Returns:ECSタスク数(int)
    """

    cloudwatch = boto3.client('cloudwatch')
    response = cloudwatch.get_metric_data(
        MetricDataQueries=[
            {
                'Id': 'm1',
                'MetricStat': {
                    'Metric': {
                        'Namespace': 'ECS/ContainerInsights',
                        'MetricName': 'TaskCount',
                        'Dimensions': [
                            {
                                'Name': 'ClusterName',
                                'Value': ECS_CLUSTER_NAME
                            },
                        ]
                    },
                    'Period': 300,
                    'Stat': 'Average',
                    'Unit': 'Count'
                },
            },
        ],
        StartTime=datetime.datetime.now() - datetime.timedelta(minutes=1),
        EndTime=datetime.datetime.now()
    )
    values = response['MetricDataResults'][0]['Values']
    if len(values) != 0:
        value = int(response['MetricDataResults'][0]['Values'][0])
    return value

参考：

https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Container-Insights-metrics-ECS.html

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cloudwatch.html
【VSCode拡張機能】TypeScript Import Sorterの使い方


# TypeScript Import Sorterの使い方

## 目次
- はじめに
- 使い方
    - 【手動】 ファイル単体をソートする
    - 【手動】 フォルダを指定し、内部の対象ファイルをソートする
    - 【自動】 保存時にソートするようにsetting.jsonに設定を保存する

## はじめに
こちらの記事は、VSCodeの拡張機能`TypeScript Import Sorter`の使い方を説明したものになります。
詳しくは下記サイトを参照してください
[TypeScript Import Sorter](https://marketplace.visualstudio.com/items?itemName=mike-co.import-sorter)

## 使い方

下記の方法があります
- 【手動】 ファイル単体をソートする
- 【手動】 フォルダを指定し、内部の対象ファイルをソートする
- 【自動】 保存時にソートするようにsetting.jsonに設定を保存する

### 【手動】 ファイル単体をソートする

1. 対象のファイルをVSCodeで開く
2. VSCodeのコマンドパレットを開く
3. `TSI: Sort Imports`を選択
4. 選択中のファイルがソートされる


### 【手動】 フォルダを指定し、内部の対象ファイルをソートする

1. サイドメニューにて対象のフォルダを右クリック
2. `Sort Imports (Directory deep)`を選択

**※ フォルダ内にサブモジュールファイルなどがあるとそちらもソートしてしまうので注意！**

### 【自動】 保存時にソートするようにsetting.jsonに設定を保存する

1. VSCodeのコマンドパレットを開く
2. `基本設定: 設定(JSON)を開く`と入力し`setting.json`を開く
3. 下記を`setting.json`に記載し保存する
```
{
  // ...その他拡張機能
  // TypeScriptインポートソーターの自動ソート
  "importSorter.generalConfiguration.sortOnBeforeSave": true
}
```
3. VSCodeを再起動する
4. 対象のファイルを保存しソートできていることを確認する
リコーのプリンタ（RICOH　MP　C6503）がWindowsUpdateあてたら印刷出来ない


https://www.nichepcgamer.com/archives/windows10-kb5006670-printer-problem.html

コレに関して表記します。

うちの会社では
あるプリンタサーバー（PS-o1）上のプリンタを
共有して使っています。

ですが最近
・KB5007186 (2021/11/10公開 セキュリティ更新プログラム)
・KB5006738 (2021/10/27公開 プレビューリリース)
・KB5006670 (2021/10/13公開 セキュリティ更新プログラム)
が当たってプリントアウト出来なくなったので
その対処でやった事を表記失礼いたします。
Facebookアプリからプライバシーポリシーのコンプライアンスでアラートが来た場合 CloudFlare利用

Facebook認証用にアプリを設置しているのですが、メールがやってきました。

![Cursor_と_LNestIDの新しい開発者アラート_-_y_lne_st_-_株式会社リバネス_メール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/c361f3c0-7443-6226-337f-f942798b3494.png)

設定してあったと思うんだけどなと、確認してみるとURLは入っていることが分かります。

![Cursor_と__1__LNestID_―_設定_-_Facebook_for_Developers.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/e0329285-b874-521c-0006-5dd7c4aa8b2d.png)

どうやら、URLが入っているだけでは駄目だということが分かりました。

https://www.setouchino.cloud/blogs/54

ただ、今回はこちらのブログに書いてあるエラーは出ていません。

![Cursor_と_SSL_Server_Test__lne_st__Powered_by_Qualys_SSL_Labs_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/f75c54f8-8a9e-de72-1bbd-708c389f5daa.png)

エラーは
This server supports TLS 1.0 and TLS 1.1. Grade capped to B. MORE INFO »

というものでした。TLSの低いバージョンが有効のままだぞということです。

## CloudFlareを使っています
今回のサイトはCloudFlareを通しています。
ということで確認してみると、「SSL/TLS 推奨機能」という欄があります。

![Cursor_と_概要___SSL_TLS___lne_st___Info_lne_st_s_Account___Cloudflare.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/955bff55-6b0a-5755-b4b0-eec86b5981a1.png)

こちらをONにすることで、Facebook側のエラーが解消しました！
Memory usage of different types for rust structures


```rust
use std::collections::HashMap;
use std::mem::size_of;

enum E {
    A(f64),
    B(HashMap<String, String>),
    C(Result<Vec<u8>, String>),
}

macro_rules! show_size {
    (header) => {
        println!(
            "{:<24} {:>4}    {}    {}",
            "Type", "T", "Option<T>", "Result<T, io::Error>"
        );
        println!("{}", "-".repeat(64));
    };
    ($t:ty) => {
        println!(
            "{:<24} {:4} {:8} {:12}",
            stringify!($t),
            size_of::<$t>(),
            size_of::<Option<$t>>(),
            size_of::<Result<$t, std::io::Error>>(),
        )
    };
}

fn main() {
    show_size!(header);
    show_size!(u8);
    show_size!(f64);
    show_size!(&u8);
    show_size!(Box<u8>);
    show_size!(&[u8]);

    show_size!(String);
    show_size!(Vec<u8>);
    show_size!(HashMap<String, String>);
    show_size!(E);
}
```

```
Type                        T    Option<T>    Result<T, io::Error>
----------------------------------------------------------------
u8                          1        2           24
f64                         8       16           24
&u8                         8        8           24
Box<u8>                     8        8           24
&[u8]                      16       16           24
String                     24       24           32
Vec<u8>                    24       24           32
HashMap<String, String>    48       48           56
E                          56       56           64
```

---

Ref:

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=34c66e50a56c5e4bb3a3dd97c3a90358

https://stackoverflow.com/questions/27324821/why-does-an-enum-require-extra-memory-size
Databricks SQLにてPivot Tableのデフォルト表示の項目を変更する方法

## 概要
Databricks SQLでは、Redashがバックエンドに組み込まれていていることからクエリ結果を可視化できるのですが、この記事にて可視化のビジュアルの１つであるPivot Tableのデフォルト項目を保存する方法を共有します。

デフォルト項目は、SQL Editor側で設定することで保存ができるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4118773f-678e-162b-232f-81e06f8471ce.png)

## 困ったこと

Dashboardにてピボットテーブルの項目を変更しても、ページをリロードすると項目が保持されません。

まず、`s_nationkey`という項目を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e8c04a18-4162-1044-12ee-1310150495b1.png)

その後、ページをリロードすると、`s_nationkey`の項目が外れてしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/527e1b1a-003a-c778-1f77-05ff4f84db5d.png)

## 対応方法


### 1. Pivot Tableの右側にあるメニューを選択後、`View Query`を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/01b8d2c3-94b8-1cb0-3f06-f984afe3051a.png)

### 2. Pivot Tableのタブを選択後、`Edit Visualization`を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/641f7ad9-7728-d9a1-7acb-274e6eca314a.png)

### 3. 項目を変更して、`Save`を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/abf7faa2-29ec-696a-1618-57c285e4b2c0.png)

### 4. `Save`を選択して、クエリも保存。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6b3a190c-3a28-1582-b2b8-6e9410036976.png)

### 5. Dashboardに戻り、デフォルトの項目が変更されたことを確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c104bb2f-6523-fdb0-71f4-245365fa8679.png)
rubyにおけるcount,size,lengthメソッドの違い

結論からいうと、配列、ハッシュ、文字列によって異なります。
## 配列のとき
ある条件を満たす要素数を知りたいとき→**count**
単に配列の要素数を知りたいとき→**length, size**countも使える

## ハッシュのとき
ある条件を満たすkeyとvalueの要素数を知りたいとき→**count**
単にKeyとvalueの要素数を知りたいとき→**length, size**countも使える

## 文字列のとき
ある条件を満たす要素数を知りたいとき→**count**
単に文字数をしりたいとき→**length, size**countは使えないです

この結論をもとに話を進めていきます。

## lengthとsize
先ほどの説明からも分かる通り、同じメソッドなんです。やってることが同じです。
実際にコードを打っても同じ結果が返ってきます。

## count
countは文字列以外を除いては、lengthとsizeと同じ働きをします。書き方に多少の差はありますが、同じ動きをしてくれます。
では何が違うのか？length/sizeとcountだと処理速度が違ってきます

実際に見ていきましょう
今回は、benchmark_driver という gem を使って処理速度を測ってみます

※以下は@scivola様のコードと結果を拝借しております。

```
gem "benchmark_driver"
require "benchmark_driver"

Benchmark.driver do |r|
  r.prelude "a = Array.new(1000){ rand }"
  r.report "a.count"
  r.report "a.length"
end
```
すると結果は、
```
Comparison:
            a.length: 161043915.9 i/s
             a.count:  33329644.2 i/s - 4.83x  slower
```

lengthは1秒間で1B回処理なされ、countだと1秒間に10M回の処理がなされている。
なぜこのような結果が生まれてしまうのか。countというメソッドについて深堀りしていきたいとおもいます
arrayやhashでのcountというメソッドは、 Enumerableというモジュールのメソッドなのです。[参考資料](https://docs.ruby-lang.org/ja/3.0/class/Enumerable.html)
そして、Enumeriableはeachを使ってメソッドが定義されているんです。
eachはN+1問題からもわかるように、不必要な値を取得してしまうことが多々あるんですね。

そのため、countはlength/sizeメソッドに比べて処理が遅いんです。

今回は、length/sizeメソッドとcountメソッドの違い、そしてcountメソッドはなぜ処理が遅いのかという部分を解説させていただきました

以上です。何か間違いがございましたら、ご教示いただけますと幸いです。


【参考文献】

https://qiita.com/motoki4917/items/ffc89d955e20b91d1014

https://qiita.com/sainu/items/7d761c026563a649d046
iPad OS 15.2以上の共有iPadにおいてシステム言語を日本語にするとフリーズする

# iPad OS 15.5で修正済み

# 概要
Microsoft Intuneで管理している共有iPadが突然フリーズしてしまった。
原因を調査したところ、iPad OSが15.2以上で、システム言語が日本語かつ、共有iPadの一時セッション (ゲスト) にサインインしようとした際に発生することがわかった。
こんなマニアックな設定をしているところも他にないと思うけど、一応対処方法を残しておく。

ちなみに現時点で最新のiPad OS 15.3.1でも改善していない。


# 前提条件
- Enrollment Program トークンを使用して、Apple Business ManagerからMicrosoft Intuneにデバイスを同期している。
- Microsoft Intuneで共有iPadを構成している。


# フリーズの原因
以下をすべて満たす際に発生する。
- iPad OSが15.2以上
- システム言語が日本語
- 一時セッション (ゲスト) でサインイン

# フリーズしたときの対処方法
- Microsoft Intuneからリモートワイプをする。
(フリーズしていてもMicrosoft Intuneとの同期は取れている模様)
- iPadをリカバリモードにしてiTunesを使ってファクトリーリセットをする。

# 今後の対策
- 修正されるまでアップデートしない。
- 初期セットアップ時の言語選択で英語などの日本語以外の言語にする。
- 一時セッション (ゲスト) を使用しない。


# Appleに報告した
年末くらいにAppleに電話で事象を報告したところ、開発チームにエスカレーションするとのこと。
あれからアップデートが何度かあったけどいまだに改善されていない。。。

# ref.
https://docs.microsoft.com/ja-jp/mem/intune/enrollment/device-enrollment-program-enroll-ios

https://docs.microsoft.com/ja-jp/mem/intune/enrollment/device-enrollment-shared-ipad
認証

authenticate　認証するとは？
本人確認することを認証するという。
とすると
authenticateの戻り値はboolで良し。
とするとuserクラスにメソッドの実装をすれば良い？

ログイン時のセッション確認処理
まずセッション側の確認が必要
確認することは、既に作成済みか？を確認する。
次にdb側の確認が必要
ユーザがそもそも存在するか？
またパスワードはあっているか？を確認する。
セッション未作成かつユーザが存在し認証できれば
そうでなければunauthを返す
ログインに移動

ログイン時のセッション発行処理
セッションを作成しユーザidを登録する。
終わればOKを返す。

逆にログアウトは
セッション存在確認
あれば消す。
db側の処理はなし
JavaScript: クロージャ [アウトプット全くしてこなかったのでアウトプットする003]

クロージャについてあまり使うことがなく知識が曖昧なのでアウトプットしました

> クロージャは、組み合わされた（囲まれた）関数と、その周囲の状態（レキシカル環境）への参照の組み合わせです。言い換えれば、クロージャは内側の関数から外側の関数スコープへのアクセスを提供します。JavaScript では、関数が作成されるたびにクロージャが作成されます。 By MDN(久しぶりにサイト見に行ったら俺の知っているMDNじゃなくなっていた...)

いつも通りわからないことをわからないことで説明され余計わからなくなるパターンです。
ただ「わかったときにこの説明がしっくりくる...」というパターンでもあります。

まずレキシカルスコープの理解が必要でした。

## レキシカルスコープ
```js
function init() {
  var name = 'Mozilla'; // name は、init が作成するローカル変数

  function displayName() { // displayName() は内部に閉じた関数
    alert(name); // 親関数で宣言された変数を使用
  }
  displayName();
}
init();
```

関数内で指定された変数を探すときに inner => outer => outerのように探していきます。
`例) 鍵(変数)をなくしたときにポケット(inner)から探します。次に机の上(outer)、次に部屋全体(outer)、次に家全体(outer)、次に家の外(outer)..........`
上記のコードでは、displayName関数の中で関数内にname変数があるかまず確認します。なかったので一段階上のinit関数の中からnameを探します。ありました。

init()内の変数nameはinit()が実行されると消えて無くなります。

> 通常、関数呼び出しが終わった後、すべての変数のとともに、レキシカル環境はメモリから削除されます。これはそこへの参照が存在しないためです。他のJavaScriptオブジェクトと同様に、到達可能な間だけメモリに保持されます。
しかし、関数の終了後も依然として到達可能なネストされた関数がある場合、それはレキシカル環境への参照である [[Environment]] プロパティを持ちます。
この場合、レキシカル環境は関数の完了後も依然として到達可能なので、存在し続けます。

変数nameをどうにかして生かす方法があります。
以下のクロージャでは 引用文の`これはそこへの参照が存在しないためです` この言葉が肝になります。

## クロージャ
```js
function makeAdder(x) {
  return function(y) {
    return x + y;
  };
}

var add5 = makeAdder(5);
var add10 = makeAdder(10);

console.log(add5(2)); // 7 と表示される
console.log(add10(2)); // 12 と表示される
```

> 内部のレキシカル環境は外部のものへの 外部 参照を持っています。
コードが変数にアクセスしたいとき、最初に内部のレキシカル環境を探します。その次に外側を探し、チェーンの最後になるまで繰り返します。

クロージャではこのレキシカルスコープを使用して値を保持し続けるということをしています。
なので以下のように値を保持してcountを増減させるといったことができます。

```js
function makeCounter() {
  let count = 0;

  return function() {
    return count++;
  };
}

let counter = makeCounter();

alert( counter() ); // 0
alert( counter() ); // 1
alert( counter() ); // 2
```

Reactのhooksとかこういった機能で成り立たせているのか?など思ったりしました。

実際に自分がクロージャを使うことを考えたときにカプセル化になるからいいんじゃないかと思ったのですが、デバッグできないというデメリットがあるらしいです。

https://ja.javascript.info/closure#:~:text=%E7%8F%BE%E5%AE%9F%E3%81%AE%E6%9C%80%E9%81%A9%E5%8C%96(Real%2Dlife%20optimizations)

以下のクロージャのクイズが面白かったので見てみてください。

https://ja.javascript.info/closure#:~:text=%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82-,%E3%82%BF%E3%82%B9%E3%82%AF,-%E9%96%A2%E6%95%B0%E3%81%AF%E6%9C%80%E6%96%B0

参考

https://developer.mozilla.org/ja/docs/Web/JavaScript/Closures

https://zenn.dev/hinoshin/articles/61ae2404997ec0

https://ja.javascript.info/closure


強くなりたい!!!!!!!
カレントディレクトリとは

# はじめに
カレントディレクトリって何んとなくわかるけれどちゃんと理解していなかったためまとめます。

# カレントディレクトリとは
今いるディレクトリのことで、ユーザーが現在作業を作業を行っているディレクトリのこと。「カレント」は今いるところ、「ディレクトリ」はフォルダです。合わせるとカレントディレクトリになり、今いるフォルダのことを指します。

# コマンド入力
カレントディレクトリを知るためには以下のようにコマンド入力をしてください。
MacとかLinuxはコマンドラインに`pwd`と入力するとカレントディレクトリが表示されます。
Windows系はコマンドプロンプトに`cd`と入力するとカレントディレクトリが表示されます。

# 終わりに
簡単にですがまとめさせて頂きました。改めてみるとまとめるほどではなかったですが、自分の中でちゃんと定義できてよかったです。

[参照サイト：「分かりそう」で「わからない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word1537.html)

[参照サイト：＠IT](https://atmarkit.itmedia.co.jp/ait/articles/1712/14/news021.html)
Databricks SQLダッシュボードのアクセスコントロール

[Dashboard access control \| Databricks on AWS](https://docs.databricks.com/sql/user/security/access-control/dashboard-acl.html) [2021/12/15時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

ダッシュボードのアクセスコントロールにより、それぞれのアクセス権がユーザーができることを規定します。本書では、それぞれのアクセス権を説明し、ダッシュボードのアクセスコントロールをどのように設定するのかを説明します。

# ダッシュボードのアクセス権

4つのアクセス権レベルが存在します。**No Permissions**、**Can Run**、**Can Edit**、**Can Manage**です。ダッシュボードのオーナーは**Can Manage**アクセス権を保有します。アクセス権を*共有することはできません*。

以下の表ではそれぞれのアクセス権を一覧しています。

| できること | No Permissions | Can Run | Can Edit | Can Manage |
|:--|:--|:--|:--|:--|
| ダッシュボード一覧の参照  |   | x  | x  | x  |
| ダッシュボードと結果の参照  |   | x  |  x | x  |
| ダッシュボードのクエリー結果の更新(あるいは別のパラメーターの選択)  |   | x  | x  |  x |
| ダッシュボードの編集|| |x [(1)](#1)|x|
| アクセス権の編集  |   |   |   | x  |
| ダッシュボードの削除  |   |   |   |  x |

###### (1)
**Run as viewer**[共有設定](#共有の設定)が必要となります。

> **注意**
クエリーの実行に使用されるプリンシパルはクエリーを作成したユーザーであり、**Refresh**ボタンをクリックしたユーザーではありません。

# 共有の設定

ダッシュボードは2種類の共有設定をサポートしています。**Run as viewer**(参照者として実行)と**Run as owner**(オーナーとして実行)です。

共有設定を変更するには以下の手順を踏みます。

1. サイドバーの![](https://docs.databricks.com/_images/dashboards-icon.png)**Dashboards**をクリックします。
1. ダッシュボードをクリックします。
1. 右上の![](https://docs.databricks.com/_images/share-button.png)ボタンをクリックします。アクセス権管理ダイアログが表示されます。
1. **Sharing settings > Credentials**フィールドで以下を選択します。
    - **Run as viewer**: ダッシュボードに含まれるクエリーを実行するのに参照者の認証情報が使用されます。
    - **Run as owner**: ダッシュボードに含まれるクエリーを実行するのにオーナーの認証情報が使用されます。

**Run as viewer**を許可すると、**Run as owner**に戻すことはできません。全ての共有設定を削除すれば、**Credentials**を設定することができるようになります。

# UIによるダッシュボードアクセス権の管理

1. サイドバーの![](https://docs.databricks.com/_images/dashboards-icon.png)**Dashboards**をクリックします。
1. ダッシュボードをクリックします。
1. 右上の![](https://docs.databricks.com/_images/share-button.png)ボタンをクリックします。アクセス権管理ダイアログが表示されます。
![](https://docs.databricks.com/_images/manage-permissions1.png)
1. 許可したいアクセス権に基づいて、以下のステップを実行します。

    - **Can Edit**アクセス権
        1. **Run as viewer**[共有設定](#共有の設定)を選択します。
        1. ユーザー、グループを追加するために上部のフィールドをクリックします。
        1. **Can Edit**アクセス権を選択します。
        1. **Add**をクリックします。
    - **Can Run**アクセス権
        1. ユーザー、グループを追加するために上部のフィールドをクリックします。
        1. **Can Run**アクセス権を選択します。
        1. **Add**をクリックします。

1. ダイアログを閉じます。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)