OmniAICreator/Qiita-1.07M huggingface dataset:
PowerShellでMicrosoft Graph APIを実行し、Azure ADのユーザー情報を更新する

## 使用するAPI
https://docs.microsoft.com/ja-jp/graph/api/user-update?view=graph-rest-1.0&tabs=http

## 前提条件
Azure ADにアプリケーションの登録が必要です。
詳細は以下の記事をご確認ください。
https://qiita.com/Yosuke_Sakaue/items/cb8a3cc2e2705ad52e62

## PowerShell全体

```powershell
$clientid = "クライアントID"
$tenantName = "AADのテナント名"
$clientSecret = "クライアントシークレット"

$ReqTokenBody = @{
    Grant_Type    = "client_credentials"
    Scope         = "https://graph.microsoft.com/.default"
    client_Id     = $clientID
    Client_Secret = $clientSecret
} 

# トークンを取得
$TokenResponse = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$tenantName/oauth2/v2.0/token" -Method POST -Body $ReqTokenBody

$apiUrl = 'https://graph.microsoft.com/v1.0/users/＜更新対象ユーザーのオブジェクトID＞'
$headers = @{
    "Content-Type"  = "application/json"
    "Authorization" = "Bearer $($Tokenresponse.access_token)"
}

# ポイント1
$body = '{
    "displayName": "世存 二郎",
    "givenName": "二郎"
}'

# ポイント2
$body = [System.Text.Encoding]::UTF8.GetBytes($body)

try {
    Invoke-RestMethod -Headers $headers -Uri $apiUrl -Body $body -Method PATCH
}
catch {
    # エラー時のレスポンスを表示
    $r = $_.Exception.Response
    $rs = $r.GetResponseStream()
    $rs.Position = 0
    $sr = [System.IO.StreamReader]::new($rs)
    $res = $sr.ReadToEnd()
    $sr.Close()
    "StatusCode : {0}, Response : {1}" -f $r.StatusCode.Value__ , $res
}
```

## ハマりポイント
### ポイント1
> 次のプロパティを更新するには、上記の表に示した他のプロパティを含めずに、独自の PATCH 要求で指定する必要があります: aboutMe、birthday、interests、mySite、pastProjects、preferredName、responsibilities、schools、および skills
※公式の注意文より抜粋：https://docs.microsoft.com/ja-jp/graph/api/user-update?view=graph-rest-1.0&tabs=http#:~:text=%E3%80%81Guest%20%E3%81%AA%E3%81%A9)%E3%80%82-,%E6%B3%A8%E6%84%8F,-%E4%BB%A5%E4%B8%8B%E3%81%AE%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3

上記に該当するプロパティを更新するには単体でリクエストする必要があります。また、一部プロパティはSharePointOnlineのライセンスが必要なものもありました。

### ポイント2
ボディに日本語（マルチバイト文字）を含む場合、JSONをUTF-8のバイト文字に変換してやる必要があります。
そのために`[System.Text.Encoding]::UTF8.GetBytes($body)`を実施しています。

また、実行環境によってはそもそもPowerShell自体がUTF-8を読み込めないことがありますので、psファイルをUTF-8(BOM付)に変換する必要があるので注意です。

以上、参考になれば幸いです。
モジュール分割

## 構造化設計
<b>システムの機能に着目して、ソフトウェア開発の上位レベルの大きな機能から段階的に詳細化していく設計手法
詳細化一覧
・システム設計 - サブシステムに分割<br>
・ソフトウェア開発 - サブシステムを<font color = blue>コンポーネント</font>に分割する
コンポーネント -ある機能を実現するために部品化されたプログラム <br>
・モジュールの設計 - コンポーネントを<font color = blue>モジュール</font>に分割
モジュール - プログラムを構成する最小単位
## モジュール分割
モジュールの独立性が高くなるように設計する。

### モジュール強度
<b>一つのモジュール内に含まれる機能間の関連性の度合い。強いほど、独立性が高くなる。

![module-strength-800x311.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/0d4682df-13e1-21d0-a63b-cf5b0e1f60cc.png)

### モジュール結合度
<b>複数のモジュール間の結合の度合い。弱いほど、独立性が高くなる。

![20200802214034.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/7a1879b0-226a-e716-6475-b393b66ae97d.gif)
### レビュー
<b>各工程終わりの検討会のこと。
<font color = blue>ラウンドロビン</font> - 参加者がテーマ毎に進行役となる。
<font color = blue>ウォークスルー</font> - レビュー対象物の作成者が説明者となる
<font color = blue>インスペクション</font> - 進行役の議長(<font color = blue>モデレータ</font>)がコーディネートを行い、参加者の役割を明確にし、チェックリストなどを活用して進めていく。
【初心者向け】Python　なんかこんなやつ「if __name__ == '__main__':」の動作。#先輩は#おまじないって#言ってた

文系やPython初心者向けの記事。
何かコードを渡されて解読しようにも、全く知識が無くて何で検索すれば良いのか分からない人向け。

・ナニコレ
```
if __name__ == '__main__':
```

長い説明は抜きにして動作だけ確認してみる。
※長い説明は他の人の記事参照。詳細動作説明があると読めなくなる人向け。


## 「if __name__ == '__main__':」があるパターン

・ソースコード

``` python
#!/usr/bin/python3

def main():
  print("Hello")

if __name__== "__main__":
  main()
```


・直接実行してみる。Helloが出力された＝main()の中が実行された

``` shell
$ ./python_test.py
Hello
```

・モジュールとしてimportしてみる。Helloが出力されない。
（なんかそうすれば動作の違いが分かるらしい。ほかの動作説明ページで見て一応、理解した。つもり）

``` shell
$ python3
>>> import python_test
```

## 「if __name__ == '__main__':」がないパターン

・ソースコード

``` python
#!/usr/bin/python3

def main():
  print("Hello")

main()
```

・直接実行してみる。Helloが出力された＝main()の中が実行された

``` shell
$ ./python_test.py
Hello
```

・モジュールとしてimportしてみる。<B>Helloが出力された。★★★★★★ここが違うところ★★★★★★★★★</B>

```
$ python3
>>> import python_test
Hello
```
GPEN受験記

# はじめに
無事にGPENに合格できましたので、いつものとおりの受験記です。といっても、攻略法はすでに確立されており、以下のとおりです。

https://qiita.com/log0417/items/78f1e3136f508d54784d

GPENについては公式サイトにあるとおりです。

https://www.giac.org/certifications/penetration-tester-gpen/

大事なポイントとして、他のGIAC試験が概ね70%で合格のところ、GPENは75%以上必要です。
この理由は推測ですが、GPENが他の試験と比べて簡単なのだと思われます。

今回はGIAC試験で初めてハンズオン問題を経験しましたので、主にハンズオンについての記事になります。
ハンズオン以外の問題については、上記記事にあるとおり、テキストを読んでインデックスを作るという方法がベストだと思います。
また、GCFA、GREM、GNFAの３つの試験を過去に受験しましたが、GPENはこれらに比べると簡単だと感じました。これは業務経験によるものかもしれませんが、ペネトレーションテストよりはフォレンジック、インシデントレスポンスの経験の方が圧倒的に多い私がそのように感じましたので、やはり試験そのものがやや簡単なのではないかと思います。

# ハンズオンについて
GIACのハンズオンはCompTIAのシミュレーション問題とは全く異なります。
CompTIAのシミュレーション問題は、（私が受験した時点では）完全な仮想マシンではありませんでした。
GIACのハンズオンは、完全な仮想マシン（以下、VM）上で行われるため、WindowsやLinuxの機能を使うことが可能です。もちろん、各コマンドのヘルプを見ることも可能です。一方で、VMであるゆえ、正しい手順で操作してもうまくいかない場合もあります。そのような場合に備えてVMをリセットできるようになっています。（実際の試験でも2回リセットを行いました）
おかしいなと思ったらVMをリセットしてみると良いと思います。なお、VMをリセットしたためなのか、試験時間が2分延長されました。繰り返し延長されることはないと思われますが、１，２回程度のリセットであればタイムロスにはならないはずですので、気にせずリセットして良さそうです。

また、試験用のVMは複数あるようで、中には接続が非常に遅いVMもありました。これは模擬試験でも本番でも発生しており、自宅の高速回線でも発生しました。私が試した限り、リセットしても解消されませんでしたので、そういうものだと思って諦めるしかないと思います。入力したコマンドが画面上にすぐに出てこないこともありますが、しばらく待ては表示されます。また、コマンド入力はTabキーで補完されますので活用してください。

# ハンズオン試験対策
試験対策はトレーニング内のラボを実施することです。また、模擬試験でもハンズオンは出題されるので、模擬試験でも対策可能です。
ハンズオンは手順さえ知っていれば簡単だと思います。本番の試験で手順がわからなくても配布されたWorkbookを確認することができますので、そこまで難しくはありません。ハンズオンは得点が高いようなのでハンズオンに時間を十分残しておき、確実に得点できるようにした方が良いでしょう。

# 次の目標
トレーニングを受けられるかわかりませんが、GCFEやGCIH、GWAPTあたりを受けてみたいなぁと思います。
Oracle Analytics CloudのAuto Insight機能の使い方

# 利用環境 #

BIサービス：Oracle Analytics Cloud

機能セット(Enterprise Analytics、またはSelf-Service Analytics) 、容量(２OCPU)



# Oracle Analytics CloudのAuto Insights機能の使い方

Oracle Analytics Cloud6.4では、Auto Insight機能が追加されました。Auto Insightsは、Oracle Analyticsに投入されたデータセットに対して、自動的に最適なビジュアライゼーションを推奨してくれる機能です。

[Let Oracle Analytics Suggest the Best Visualizations for a Dataset Using Auto Insights](https://docs.oracle.com/en/cloud/paas/analytics-cloud/acubi/let-oracle-analytics-suggest-best-visualizations-dataset.html)

ただ残念なことに、デフォルトでは有効化されていないので、この機能の存在に気が付いていなかったり、いざ、この機能を試してみようと思ってマニュアルを見ても、うまく利用できない方が多いようです。今回は、この新機能を活用する上での事前設定事項を中心にご紹介しようと思います。



# ステップ①：システム設定パラメータの有効化

まず、Analytics Cloudの**ホームメニュ**から、**コンソール**⇒**システム設定**にアクセスします

![AutoInsight.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/1bac5b31-b70a-3858-e2eb-f09b1e8b505e.png)



システム設定画面右上の検索ウィンドウに、"**Enable Auto**"と入力すると、”**Enable Auto Insights on Datasets**”が表示されます。デフォルトでは、非有効化になっているので、このパラメータを有効化してからシステム設定をクローズします。

※念のため、**ブラウザのキャッシュをクリア**すると良いでしょう。

![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/d3ad235c-302a-ef57-6b4d-15684c7b9e2d.png)


# ステップ2：インサイトの有効化

Auto Insightはデフォルトでは非有効化になっているので、この機能を利用する際は、対象となるデータセットごとに有効化の設定を行う必要があります。機能を利用したいデータセットのメニュから**検査**にアクセスします

![010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/5c09fe76-0261-44e5-3905-a8c6d6ad64fc.png)


**一般タブ**から、**インサイトの有効化チェックボックス**にチェックを入れて、**保存**ボタンをクリックします。
![011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/3c23a40a-e49c-f5fd-f204-0a8b2e1713f7.png)


以上で、Auto Insightsを使う準備は完了です。



# Auto Insights機能の確認

Auto Insights機能を使いたいデータセットを選択して、メニュから”ワークブックの作成”を選択します。


![013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/b2781473-d096-1b97-b877-114c955b2daa.png)



新規ワークブックの作成画面上部に、**Auto Insights**のアイコンが表示されるようになりました。

![014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/642b7c6a-7df1-bb84-74f8-273e4fb65402.png)


次に、**Auto Insights**のアイコンをクリックすると、画面右側に、自動的にツールが何パターンかビジュアライゼーションを推奨してくれます。スクロールダウンすると、推奨してくれたビジュアライズと、ビジュアライズに対するコメントを確認することが出来ます。今のところ、このコメントは自然言語にはなっているものの残念ながら英語になっていますね。

![015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/5ff57e40-af03-a3ab-abfc-211ad5703d80.png)


推奨されたビジュアライズは、ドラグ＆ドロップまたはチェックボックスをチェックすることによって、キャンバスに展開することが出来ます。キャンバスに展開されたビジュアライズは、自分で一から作成したビジュアライズと同様に、自由にプロパティの編集などを行ったり、カスタマイズすることが可能となっています。

与えられたデータセットのデータパターンからツールが自動的にビジュアライズを推奨してくれるこの機能は、分析を始める取り掛かりとして非常に役に立つ機能ではないかと思います。


![016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/a9289088-bd2c-b6c0-e44e-ed4d60f4f0ae.png)

# まとめ

- Oracle Analytics Cloudでは、Auto Insightsの機能が使えるようになっているが、デフォルトで非有効化されているので、利用する際は、事前に有効化の設定が必要
- Auto Insightsの機能を有効活用することによって、データに隠れた傾向やパターンを効率的に視覚的に把握することが可能
M5Stack Core2: QRCode の作成

こちらのサンプルを参考にしました。
[QRCode.ino](https://github.com/m5stack/M5Core2/blob/master/examples/Advanced/QRCode/QRCode.ino)

実行結果
　![IMG_20220530_153855.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/c8126c53-255d-fcd0-155b-db2d80e8407c.jpeg)

```text:QRCode.ino
/*
*******************************************************************************
* Copyright (c) 2021 by M5Stack
*                  Equipped with M5Core2 sample source code
*                          配套  M5Core2 示例源代码
* Visit the website for more information: https://docs.m5stack.com/en/core/core2
* 获取更多资料请访问: https://docs.m5stack.com/zh_CN/core/core2
*
* describe: QRcode.  创建二维码
* date: 2021/7/26
*******************************************************************************
*/

#include <M5Core2.h>

void setup() {
  M5.begin(); //Init M5Core2.  初始化M5Core2
  M5.Lcd.qrcode("https://ekzemplaro.org/qiita",50,0,230,6);  //Create a QR code with a width of 150 QR code with version 6 at (0, 0).  在(0,0)处创建一个宽为150二维码版本为6的二维码
  //Please select the appropriate QR code version according to the number of characters.  请根据字符数量选择合适的二维码版本
}

void loop() {
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/c6c0e5ec-6e8a-2abf-7925-d78060a31169.png)
ServiceNow 日付フォーマットの変換方法

本記事はServiceNowのDate型フィールドの値を、メール通知等でアウトプットする際、フォーマットを変換する際のスクリプト作成方法となります。

バージョンとUI情報は以下となります。
バージョン：Sandiego
UI：旧版（Quebec以前）より

日付フォーマット変換のコード
ServiceNowではデフォルトでDate形式は以下となっています。

yyyy-MM-dd hh : mm : ss

今回はこのフォーマットをyyyy年MM月dd日 h時m分のフォーマットに変換しています。
下方のコードはメール通知スクリプトより作成、メールを通知する際、開始日時（opend_at）フィールドを変換しています。

```
(function runMailScript(/* GlideRecord */ current, /* TemplatePrinter */ template,
          /* Optional EmailOutbound */ email, /* Optional GlideRecord */ email_action,
          /* Optional GlideRecord */ event) {

	var date = new GlideDateTime(current.opened_at);
	var date2 = date.getDate();
	var date3 = date2.getByFormat("yyyy年MM月dd日");
	
	var time = date.getTime();
	var h = time.getHourOfDayLocalTime();
	var m = time.getMinutesLocalTime();
	var s = time.getSeconds();

	template.print(date3+h+"時"+m+"分");
	
})(current, template, email, email_action, event);
```

GlideDateTime,GlideDateに関する詳細は以下を参照ください。
https://developer.servicenow.com/dev.do#!/reference/api/sandiego/server_legacy/c_GlideDateTimeAPI#r_GDT-GlideDateTime

# Appendix ServerSideScriptのログ出力・確認方法
合わせてServerSideScriptのログ確認方法をAppendixとして載せておきます。

```
gs.debug("debug");
gs.info("info");
gs.warn(""warn);
gs.error("error");
```

上記ログ出力を導入した場合、

```
(function runMailScript(/* GlideRecord */ current, /* TemplatePrinter */ template,
          /* Optional EmailOutbound */ email, /* Optional GlideRecord */ email_action,
          /* Optional GlideRecord */ event) {

	var date = new GlideDateTime(current.opened_at);
	var date2 = date.getDate();
	var date3 = date2.getByFormat("yyyy年MM月dd日");
	
	gs.info("date="+date);
	gs.info("date="+date2);
	gs.info("date="+date3);
	・・・
```

上記のように記載することで、スクリプト途中の値をログとして出力し、Debugを行うことが可能です。
ログの確認方法は以下となります。

手順1
アプリケーションナビゲータに"application log"と入力し、メニューより"Application log"を選択します。

Created
Level（info等）
Message（date3=yyyy年MM月dd日等）

を確認し、想定通りの処理、出力が行われているか確認可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399414/0eaa5649-7bcb-894c-034e-2edf3634b998.png)

詳細は以下のリンク参照ください。
https://developer.servicenow.com/dev.do#!/learn/courses/quebec#scripting-in-servicenow

https://docs.servicenow.com/ja-JP/bundle/sandiego-application-development/page/app-store/dev_portal/API_reference/glideSystemScoped/concept/c_GlideSystemScopedAPI.html#r_ScopedGlideSystemInf_String_Object_Object_Object_Object_Object

以上です。
今後もServiceNowのスクリプト関連に関しても事例を用いて投稿していきたいと思いますので宜しくお願いします。
OSの役割   -Overview

# はじめに
<!-- 発端や概要を記載 -->
Operating Systemの基礎（主な役割と機能）のまとめです。


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [概要(基礎)](#Chapter1)
1. [主な役割](#Chapter2)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# Chapter1
オペレーティングシステムとは、ユーザーとハードウェア（CPU、I/Oデバイス、RAMなど）との間の仲介役として機能する、**ソフトウェアのシステム**の事です。

オペレーティングシステムの主な目的は、ユーザーに利便性を提供することです。 
現在「Windows」が世界最大のシェアを占めており、「Linux」のユーザー数は年々増加しています。（Linuxは**Throughput**(単位時間あたりに処理できるデータ量≒PCの能力)の観点で優れています）。 

オペレーティングシステムの主な目的:
* ユーザーに利便性を提供すること - convenience :Windows優勢
* 効率性 -efficiency：Linux優勢
　→ （**Throughput**(単位時間あたりに処理できるデータ量≒PCの能力)の観点で優れている）


<a id="#Chapter2"></a>
# Chapter2
オペレーティングシステムの主な機能：
1. **リソース管理 - Resource manager**（CPU、RAM、I/O devicesなど）
2. **プロセス管理 - process manager**（CPU）
3. **ストレージ管理 - Storage**（HD）
4. **メモリ管理 - Memory management**（RAM, file systemなど）
5. **セキュリティとプライバシー - Security & Protection**（例：パスワード, プロセス同士の干渉阻止）
6. **IOデバイス管理 -I/O Device  management**
<a id="#reference"></a>
# 参考文献
- [Modern Operating Systems by Andrew S. Tanenbaum, Herbert Bos](https://www.amazon.co.jp/-/en/Andrew-Tanenbaum/dp/013359162X)
ShopifyでFAQ（よくある質問）を導入する際のおすすめアプリ4選

## はじめに
今回の記事では、ShopifyでFAQ（よくある質問）を導入する際のアプリを調査した結果を、自分用のメモ書きとして残しておきたいと思います。

それでは、頑張っていきましょう。

## よくある質問どこでも挿入｜リテリア FAQ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672276/afb71e17-a330-a4f8-807e-7b138201e2a5.png)

https://apps.shopify.com/reterior-faq?locale=ja

こちらは、FAQ（よくある質問）をShopifyストアに導入することができる日本製のアプリです。

ノーコードでFAQ（よくある質問）を追加することができます。

以下、アプリリストからの引用です。

>お好きなページに、ノーコードでよくある質問（FAQ）を追加することができます。よくある質問（FAQ）を追加して顧客の不安を取り除き、コンバージョン率をアップさせましょう！

デザイン性に、特に力を入れているようです。

>ノーコードで編集できるから簡単にデザイン編集を行えます。テキストのサイズ / 色 / 太さ、アイコンの種類、ボーダーのスタイルなど、さまざまな項目をカスタマイズすることができます。

日本製のアプリであるため、管理画面も当然日本語になっています。

>日本語のアプリなので、日本語対応した管理画面になっています。管理画面に日本語の使い方ガイドも掲載しているので、Shopifyに不慣れな方でも安心してご利用できます。また、導入に困った際は日本のエンジニアがサポート致します！

以下の画像のように、FAQ（よくある質問）をShopifyストアに導入することができるアプリです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672276/b98ceee2-37b6-3943-fd5c-5232737f5c60.png)

以下の画像のように、３つのデザインからお好きなFAQ（よくある質問）を導入することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672276/ea993d7e-9c48-0ea1-eef7-c1924bd45492.png)


日本製のShopifyアプリであるため、管理画面も日本語になっていて、非常に使いやすいです。

Shopifyストアのカスタマイズ画面でデザインを編集することができるので、デザインを変更しながら調整することも可能です。

こちらのアプリは、FAQページだけでなく、全てのページのどこにでもFAQ（よくある質問）を挿入することが可能になっています。

価格も安価でリーズナブルなので、非常におすすめです。

## Easy FAQ Page, Customer FAQs

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672276/879a8ed4-2047-d7ad-c3e4-61ea4c076e65.png)

こちらのアプリは、海外製のFAQ挿入アプリです。

こちらのアプリには４つの豊富なテンプレートが付属しており、ストアのテーマに合わせて調整できます。こちらのアプリも、見た目に重きをおいているようです。

しかし、海外製のアプリなので、デザインが海外よりになっている感は否めませんが...。。

以下の画像のようなFAQを、ストアに挿入することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672276/1514dcaa-5dfe-db4a-2f1c-43503a40695b.png)


FAQ（よくある質問）を挿入する数に応じて、料金が変更されるっぽいです。

海外で人気のアプリなので、品質は問題無さそうです。


## FAQ by POWE.io
こちらのアプリは、**FAQ**という名前のシンプルなアプリです。

https://apps.shopify.com/powr-faq?locale=ja&surface_detail=FAQ&surface_inter_position=1&surface_intra_position=6&surface_type=search

カスタマーエクスペリエンスにあるよくある質問や、コンバージョンを促進するためのFAQを挿入することが可能になっています。

また、重要なブランドと製品の詳細を共有することで、顧客に信頼感を与えることができます。

以下の画像のようなFAQをShopifyストアに挿入することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672276/68cc46f8-7314-1645-951e-7c3fb6bb10aa.png)

価格帯はこんな感じで。そこそこ高額です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672276/ac153eb8-4cd7-9eec-049e-226f1c41faca.png)


## FAQ Page & Help Center Pro

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672276/6938bf0d-e250-c76e-59e7-5c8cb9de89b1.png)

https://apps.shopify.com/faq-page-smart?locale=ja&surface_detail=FAQ&surface_inter_position=1&surface_intra_position=7&surface_type=search


こちらのFAQ（よくある質問）アプリも、**どこにでもFAQを表示**させることができるのを強みとしています。また、SEOも意識されているようです。

12以上の素敵なFAQページテンプレートがあるので、技術的な要件なしで、素敵なFAQページを簡単に作成できます。

## 終わりに
今回は、おすすめのFAQ（よくある質問）を導入する際のおすすめアプリ4選を紹介しました。

お疲れ様でした。
【レーティング】Elo Ratingでロケットリーグ大会(RLCS)でのレートを求める。

# はじめに 
この記事はレーティングシステムの中で最も有名な手法であるイーロレイティングについて学ぶ。
イーロレイティングは次のような特徴を持つ。

- プレイヤーのレートは正規分布に従う
- 試合によるレートの変動を試合ごとに計算できる
- 試合によるレートの変動は相手プレイヤーと自分のレート差に依存する。

なおこの記事は、[前回記事](https://qiita.com/takenakadx/items/320a9766bedfd0208b9a)の続きであるが、この記事単体でもElo raitingは理解していただけると思う。
# Elo rating
イーロレイティングははじめに、初期のレートを決定してその後に試合結果からレートを更新するという方法を取る。その為、試合結果を増やした時の計算を行いやすいのが利点である。

試合結果の更新は次の式に基づいて行われる。

``` math
r_{i}(new) = r_{i}(old) + K ( S_{ij} - \mu_{ij}) \tag{1}
```

ここで、$S_{ij}$は試合結果によるパラメータでチェスの場合次のようなものが用いられる。

``` math
S_{ij} = 
\begin{cases}
 & 1 & \text{ i  win} \\
 & 0 &  \text{i lose} \\
 & 1/2 & \text{draw}
\end{cases} \tag{2}
```

さらに、$\mu_{ij}$は次のようにlogistic関数を用いて表せる。
``` math
\mu_{ij} = \frac{1}{1 + 10^{-d_{ij}/400}} \tag{3}
```
## K因子について
(1)式に登場したKという定数は、レート変動の大きさを表している。
一回の試合が大きくレートを変えるようなものならこの変数を大きく変えたりすればよい。

例えば、サッカーでのK因子は次のように決定されている(Unofficial)
- $K=60$ W-cup決勝
- $K=50$ 国際戦
- $K=40$ W-cupトーナメント
- $K=30$ その他トーナメント
- $K=20$ 親善試合

## S因子について
(2)式で表せるS因子はチェス用のものである。他にもサッカーでは次のようなS因子が用いられている。

``` math
S_{ij} = 
\begin{cases}
 & 3 & \text{ i  win} \\
 & 0 &  \text{i lose} \\
 & 1 & \text{draw}
\end{cases}
```

## logistic関数のパラメータについて
(3)式でlogistic関数内に400というマジックナンバーが出てきたことに驚いていると思う。
この400という数字は、勝率に関係しており、400倍のレート差があると勝率が10倍になるというものである。

例えば、私のチェスレートは600程であり、チェスの世界チャンピオン、ボビーフィッシャーと2000以上のレート差がある。簡単のためにレート差を2000として私がボビーフィッシャーに勝つ確率を計算すると次のようになる。

$$
10^{-\frac{2000}{400}} = 10^{-5} = 0.001 \text{[%]}
$$

つまり、私は10万回試合すれば一回はボビーフィッシャーに勝てるという事である。(あくまで計算上は)
# 例題(RLCS)
今回例として[ロケットリーグチャンピオンシップ(RLCS)シーズン10のリーグ戦結果](https://liquipedia.net/rocketleague/Rocket_League_Championship_Series/Season_X/Spring/North_America/3)を用いてレーティングを求めてみる。

ロケットリーグ(RL)はサッカーのようなルールなので、S因子についてサッカーのものを用いようと思ったが、RLには引き分けが無いので、チェスと同じ(2)式を用いることにした。
K因子としては400を利用し、初期レート400、logistic関数のパラメータを1000にしてみた。

この条件で試合結果からレートを導出すると次のようになった。

|  order  | team name  |    rate    |
| ------- | ---------- | ---------- |
|    1    |     V1     |  451.672   |
|    2    |    OXG     |  421.988   |
|    3    |    RGE     |  421.529   |
|    4    |     SQ     |  392.316   |
|    5    |    VOLT    |  312.495   |

この結果は[前回](https://qiita.com/takenakadx/items/320a9766bedfd0208b9a)、[前々回](https://qiita.com/takenakadx/items/c16d1515a08251dc552f)導出した結果と同じ順位となり、ある程度の保証がある事が分かった。


# 最後に
今回とても有名なレーティングシステムであるイーロレイティングについて書いた。
個人的には、レートの更新にすべての試合結果を用いないことが、レートを更新しやすいため使いやすいと感じた。イーロレイティングについては様々な記事があるので分からなかったことが他の記事を読んでみるのもいいと思う。個人的には[この記事](https://qiita.com/kenta_eros/items/960ba93fceaa5fddfda5)が面白かった。
shotgun [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1108)>

https://community.shotgridsoftware.com/t/certificate-verify-failed-error-on-windows/8860


or users of Powershell on Windows 10 or Powershell 3 on Windows 7 (I don’t have access to a Windows 8 machine, it may work, or not, in which case you’ll want to keep reading until the end), you can run the following script as an administrator on the computer to get the new certificate.

```
$cert_url = "https://www.amazontrust.com/repository/AmazonRootCA1.cer"
$cert_file = New-TemporaryFile
Invoke-WebRequest -Uri $cert_url -UseBasicParsing -OutFile $cert_file.FullName
Import-Certificate -FilePath $cert_file.FullName -CertStoreLocation Cert:\LocalMachine\Root
```

If the command worked, you should see this:
  PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\Root

Thumbprint                                Subject
----------                                -------
8DA7F965EC5EFC37910F1C6E59FDC1CC6A6EDE16  CN=Amazon Root CA 1, O=Amazon, C=US

This will make the certificate available for all user accounts on the computer it is run on. If you don’t have admin access, you can change the last line with
Import-Certificate -FilePath $cert_file.FullName -CertStoreLocation Cert:\CurrentUser\Root

and the certificate will be added for the current user only.
VS Code拡張機能のREST Clientを使ってみた

こんにちは！  
最近業務でAPIを作成していたのですが、  
テストの仕方に困っていたところにいいものを教えていただいたので備忘録がてら書き綴ります。  
間違ってたらごめんなさい。  

# 概要

今回使っていくのがREST ClientというVS Codeの便利な拡張機能。  

以下が軽い使用環境。  
エディター : VS Code
拡張機能　 : REST Client (https://marketplace.visualstudio.com/items?itemName=humao.rest-client)  

# REST Clientの説明

VS CodeでいうREST ClientとはAPIをコードベースでテストすることができる拡張機能のことを言います。  
エディターからHTTPリクエストを送信して、レスポンスを受け取ることができるものです。  
REST ClientとはVS Code固有の拡張機能名というわけではないみたいです。  
（調べたらVS Code以外にも出てきた。当然か。）  
ここでは基本的な説明しかしないので、
詳しく知りたい方は https://marketplace.visualstudio.com/items?itemName=humao.rest-client へ  

## REST Clientのいいところ

・ファイルなので共有が簡単（エビデンスも残しやすい）  
・いつでも何度でも同様のテストが可能  
・別の人別の環境でも同様のテストが可能  
・エディターで動くからテストに別のアプリが不要  
・レスポンスデータをファイルとして保存可能  
 
# REST Clientの使い方

## まずはじめに

REST Clientは.httpもしくは.restのファイルで実行することができます。  
今回は、rest_client.httpというファイルにリクエストを記載していきます。  
  
まずは、使用するHTTPメソッドとURLを以下のような感じで記述していきます。  
```http:rest_client.http
GET https://httpbin.org/get HTTP/1.1
```
![rc_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2509990/e1456aba-4a1b-469f-12bb-4865d62a5be4.png)

すると、Send Requestという文字が出現します。  
これをクリックすることでURLにリクエストを送信できます。  
後ろのHTTP/1.1とありますが、正直なくても動きます。  
理解がまだ足りていないので、おまじないくらいの気持ちでつけてます。(←誰か教えて...)  

## 送信データの設定

次は、content-typeとデータを設定します。  
今回は、jsonを使っていきます。  
```:rest_client.http
content-type: application/json

{
    "id": "1",
    "name": "test"
}
```
content-typeはjson以外にもいくつかあるので用途に合ったものをご使用ください。  
データは{}の中にすべて入れます。  
こんな感じ。  

![rc_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2509990/134be006-c422-d288-f00a-c65d74a04744.png)


## tokenの設定

APIのテストなので、もちろん認証情報が必要ですよね。  
それを設定していきます。  
```:rest_client.http
Authorization: Bearer DummyBearer
access-token: dummyAccessToken
```
上のように設定していきます。  
Authorizationもaccess-tokenなども必要なものだけ設定してください。  

## リクエスト内容の可変化

今のままでも十分なテストはできます。  
ですが、ベースURLを変更したり、tokenも随時変更したりすることがあると思います。  
なので、定数やシステム変数にしちゃいます。  

.httpファイルの中では、{{}}の中に定数やシステム変数を設定できます。  
こんな感じ。  
```http:rest_client.http
@baseUrl = https://httpbin.org/

GET {{baseUrl}}get HTTP/1.1
```
これであとは試しにリクエストを送ってみるだけ。  

## rest_client.httpの最終形態

```http:rest_client.http
# rest_client.http
@baseUrl = https://httpbin.org/
@auth_token = DummyBearer
@ac_token = dummyAccessToken

GET {{baseUrl}}get HTTP/1.1
content-type: application/json
Authorization: Bearer {{auth_token}}
access-token: {{ac_token}}

{
    "id": "1",
    "name": "test"
}
```

# まとめ

かなりざっくりですが、一応業務で使えるくらいの内容にはなったかな？  
最近はREST Clientもかなり常用化されてきているようなので、使い慣れていきたいですね。  
REST Clientを使ってみた感想としては、マジで超便利。
今までPostmanでやってたのが、テキストベースで共有もできて楽ったらありゃしないって感じ。
好きです。

拙い文章を最後まで読んでくださりありがとうございました。  
コメントや指摘等あればください！お願いします！ 

# 参考文献
https://marketplace.visualstudio.com/items?itemName=humao.rest-client

https://qiita.com/toshi0607/items/c4440d3fbfa72eac840c

https://www.ipride.co.jp/blog/2201
Oracle Analytics Cloud 予測機能～誰にも聞けない基礎の話～　その４

皆さんこんにちは。

今日はその２の続きでOracle Analytics Cloud の機械学習のモデルの話をします。
その２ではARIMAモデルの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1251127/243a0bc8-448e-974e-4620-4611e2f07305.png)

「回帰」というキーワードで引っかかってしまい、その３の閑話休題に話が飛んで行ったかと思います。以前、季節性ARIMAモデル、ARIMAモデルは類似のモデルであるため、データ内容によって（季節性のあり/無しで）適用するのが良いという話をしました。

今日は、残りのETSモデルについてのお話です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1251127/7dd22f4d-00c0-eeca-e21f-14bc6e2de961.png)

ARIMAモデル同様、ETSはExponential Smoothing State Space Modelの「頭文字」を使っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1251127/29fcae54-10ae-a518-f627-1786db4142c1.png)

名前はさておき、検索をしてみると
・より直近の過去値からの影響を重視し、過去になればなるほど指数関数的に影響が小さくなるモデル
・普通の加法型誤差項だけでなく乗法型誤差項も可能なモデル
・以上の制約のもとで状態空間モデルにまとめたもので、モデル推定は観測値ではなく状態値に基づく

ちょっと何言ってるかわかりませんね。。。
また、一つ一つ解説していきましょう。

指数関数は高校の数学で出てきます。グラフを見ると「記憶の隅にかすかに・・・」となると思います。
下式で表すｘの関数です。aを「底（てい）」といい、0より大きく1以外の定数です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1251127/4e5f372b-6a5d-f9a7-9680-52e25541a99b.png)

ｘの値が小さいほどｙは0に近づき、ｘの値が大きいほどｙも大きな値になります。
「だから何？」といわずにもう少しお付き合いください。

指数関数ともう一つの難題である「状態空間モデル」についても少し解説します。

状態空間モデルは、ほとんどの時系列モデルを表現できる汎用性の高い時系列分析のモデルです。状態空間モデルは、
・観測できない隠れた「状態モデル」
と
・観測した結果である「観測モデル」
からなります。

例えば観測モデルは株価の実績値、状態モデルとは観測できないものですので市況データなどです。
状態空間モデルでは様々な要因を分解して時系列予測を行うため、データ間の関連性や影響具合を明らかにすることが可能で、マーケティングの意思決定へつなげやすくなっています。
先ほどのxの値の大きさでyの値が変わっていくという話がようやくつながってきました。
また、「より直近の過去値からの影響を重視し、過去になればなるほど指数関数的に影響が小さくなる」ということも影響しそうです。

古くからよく知られる時系列解析モデルとしてその１から解説してきた、MAモデル、ARモデル、ARMAモデル、ARIMAモデルがあり、これらのモデルでカバーできない時系列データに対して、ETSモデルは威力を発揮します。

まずは自社データの状態がどうなっているかをよくご覧になってみて下さい。
そしてデータがそろっているのか、他の要素を入れるとどうなるのか、様々な角度からOracle Analytics Cloud を使って分析をし、自社にあったモデルはどれだろうと考えながら適用なさってみてはいかがでしょうか。

検索すると、たくさん情報は出てきますが専門用語が駆使されていて拒否反応が出た方も多くいらっしゃると思います。一つ一つ丁寧に見ていくことで、理解が進むお手伝いができていれば幸いです。
【ServiceNow】San Diegoリリース　FlowDesginer「フローダイアグラムビュー」について

ServiceNowの新バージョンであるSan Diegoが正式にリリースされました。
FlowDesignerの新機能である「フローダイアグラムビュー」を使用してみた結果をまとめました。

## フローダイアグラムビューとは
フローダイアグラムビューとは作成したフローを以下のような図に変換してくれる機能です。
見た目が大きく変わり、下図ではifの分岐が通常ビューよりわかりやすくなっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/24474dda-4299-4d8a-db17-75d8584114be.png)


https://docs.servicenow.com/ja-JP/bundle/sandiego-servicenow-platform/page/administer/flow-designer/concept/flow-diagramming-view.html

## フローダイアグラムビューを有効にする

フローダイアグラムビューを使用するにはSan Diegoにバージョンアップするだけではなく、
システムプロパティ「**sn_flow_diagram.flow_diagramming_enabled**」をTrueにする必要があります。

しかしこのシステムプロパティは手動更新ができないので、
Trueに更新してくれるプラグイン「**Flow Diagramming**」をバージョン**21.1.2**に更新します。

【プラグイン】
![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/8dd13525-78bf-f6bf-08be-4add64d93926.png)

【システムプロパティ】
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/46c095ae-8fb0-f5b4-74f8-1dfa74404188.png)

## フローダイアグラムビューの使い方

使い方は、画面上部に表示されているビューセレクターをONにするだけです。
![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/759d25a6-4b7d-a37a-dbd2-92e229a9335b.png)

## フローダイアグラムビューの使用できる条件
フローダイアグラムビューは使用できる条件が限られています。
以下の条件に合致する場合はビューセレクターをONにできます。

・「レコード」または「日付」のセクション配下のトリガーである
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/c4b399fd-40cd-dee9-aeb3-d7fa62d274ca.png)



・以下のFlow Logicを使用している
　If、 Else If、 For Each、 End
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/7297f5d7-0a00-5397-c0fb-c88a3bc501ae.png)


・フローステージを使用していない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/d636eab1-1092-24cc-197c-b45b3714b00e.png)



条件を満たさない場合は、ビューセレクターがクリックできないようになっていました。

## フローダイアグラムビューでできる操作
今まで使用していたビューと比較してみました。

**フローダイアグラムビューでのみできること**
ノードのキーワード検索ができます。
複雑なフローの場合ノードの階層が多くなり、特定のアクションやサブフローを探し出すのが難しくなってきます。
その時に活躍する便利な機能です。
検索対象はアイテム名やフローロジックの条件等なので、
アクション名を完全に記憶していなくても記憶しているキーワードを打ち込むこと検索することができます。
![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/d8ef7e81-b669-c72d-4678-2a66e167882f.png)

**通常ビューと同様にできること**
通常ビューでできる以下の操作は、フローダイアグラムビューでも操作できました。
・トリガーやアクションのプロパティを設定
・トリガーとAction/Flow Logic/Subflowのノードを追加
・各ノードにNoが振られている


**通常ビューでできるがフローダイアグラムビューではできないこと**
・各ノードのアウトプットの確認
・ノードプロパティのフィールドに、他のノードのアプトプットをドラッグアンドドロップで設定
・フローステージの作成/追加

## 終わりに
ちょっとした便利機能ですが、実装時には複雑なフローの整理に役立ちますし、
実装者以外がフローを読み解く際の補助機能としても使用できそうです。
Gitの個人的な使い方まとめ

## 事前知識
作業ディレクトリ
　　　↓
ローカルリポジトリ
　　　↓
リモートリポジトリ

の順番で上げで行く

## 初期設定
フォルダーを指定し以下のコマンドを入力しローカルリポジトリを作成する
```
git init
```

```
git remote add origin 任意url
```

誰が変更したかを確認するための情報入力
- ユーザ名
```
git config --global user.name 任意のユーザ名
```
- メールアドレス
```
git config --global user.email 任意のメールアドレス
```
- 登録情報の確認
```
git config --list
```

## GitHubのアカウント作成
[github](https://github.com/new)にアクセスしアカウント作成
以下省略

## ssh
push時にidとps入れるのめんどうなのでsshの設定をしておく

以下コマンドでssh鍵生成しgithubに投げる
> ※この鍵は本人確認で使うんだなと思えば良い
```
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/(username)/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

$ cat ~/.ssh/id_rsa.pub
```


接続を確かめる
```
ssh -T git@github.com
```

作業ディレクトリをgithub連携してあげる
```
git remote set-url origin git@github.com:[ユーザID]/[リポジトリ].git
```

## githubにファイルを送る

ローカルリポジトリに追加
```
git add .
```

ローカルリポジトリにコミットする
```
git commit -m "変更説明"
```

githubに投げる
```
git push origin master
```

## ブランチ
以下コマンドでブランチを一覧表示する
```
git branch
```

ブランチの追加 sub1 を追加してみる
```
git branch sub1
```

ブランチ移動
```
git checkout sub1
```

ブランチの作成と移動は、以下のコマンドでまとめて行うこともできる。
```
git checkout -b sub1
```

ブランチの削除は以下
```
git branch -d sub1
```

ブランチを更新
```
git pull
```

## よく分からんくなった時用

https://training.github.com/downloads/ja/github-git-cheat-sheet/

## git commit
コミット時のメッセージの例

```
feat: 新しい機能
fix: バグの修正
docs: ドキュメントのみの変更
style: 空白、フォーマット、セミコロン追加など
refactor: 仕様に影響がないコード改善(リファクタ)
perf: パフォーマンス向上関連
test: テスト関連
chore: ビルド、補助ツール、ライブラリ関連
```
スタートメニューにピン留めしたタイルが移動できない(引用と追加情報)

スタートメニューにピン留めした「ごみ箱」タイルが移動できない問題の解決方法

--引用--
>タイトル：一部の標準アプリのタイルのみ移動できない
>サブタイトル：スタートメニュー上に作成した「ピクチャ」タイルを移動したい
>https://answers.microsoft.com/ja-jp/windows/forum/all/%E4%B8%80%E9%83%A8%E3%81%AE%E6%A8%99%E6%BA%96/a45e2cdd-ee70-4751-81b5-9f1099b1ef5f?page=2
>【現象】
>スタートメニューにピン留めしたタイルが移動できない。以前は普通にできていた。
>【対処方法】
>ピン留めしたタイルは以下フォルダにショートカットが作成されるようです。
>
>C:\Users\～～～\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
>
>このフォルダ内で、問題のあるタイルのショートカットを削除してください。
>その後、再度、「スタートメニューにピン留めする」を行います。
>ショートカットでは無い実体のフォルダを間違って削除しないようにご注意ください。

【追加情報】
「ショートカットを削除」とありますが
ショートカットを作りまくっていると誤動作でタイルが移動できないらしく
いろんなところに作ってしまったごみ箱のショートカットを削除したら直りました。
突然、docker-compose buildが失敗するようになった時。

# 突然、docker-compose buildが失敗するようになった時。

docker-compose buildコマンドでpull処理あたりで失敗する。
```[XXXXXXXXXXX internal] load metadata for docker.io/library/ubuntu:XX.XX```

## 心当たり
最近docker desktopアプリのアップデートをおこなった。
docker desktopアプリを見るとログインされていない状態になっていた。

## やってみたがダメだった
docker desktopアプリでログイン。


## 解決法
1.docker desktopアプリでログアウトする。
2.docker desktopアプリでログインする。


## 注意
一度ログアウトしてからじゃないと内部的に古いログイン情報のままになってしまうのでNG.
一度ログアウトしてから再度ログインすることがポイント。
【初心者向け】Pythonタプルとは。括弧で宣言された何か。

文系やPython初心者向けの記事。
何かコードを渡されて解読しようにも、全く知識が無くて何で検索すれば良いのか分からない人向け。

・タプル
オブジェクトの宣言の仕方の1つらしい。
何かイコールの後に、括弧で囲まれたこんな感じのもの。
イミュータブル（とかいう変更ができないという意味）で、変更ができないらしい。

```
python_tuple = ('TEST0','TEST1','TEST2')
```

試してみる

・ソースコード

``` python
#!/usr/bin/python3

python_tuple = ('TEST0','TEST1','TEST2')
print("python_tuple[0]:" + python_tuple[0])
print("python_tuple[1]:" + python_tuple[1])
print("python_tuple[2]:" + python_tuple[2])
print("python_tuple[-1]:" + python_tuple[-1])
print("len(python_tuple): %d" % len(python_tuple))
```

・実行結果

``` python
./python_test.py
python_tuple[0]:TEST0
python_tuple[1]:TEST1
python_tuple[2]:TEST2
python_tuple[-1]:TEST2
len(python_tuple): 3
```



本ページ検索用の言葉
　イコールの後に括弧
　括弧の中にカンマ区切り
sort() に渡す比較関数の書き方

をいつも忘れるのでメモ。

数値の場合
```js
(a, b)=> a - b
```

文字列の場合
```js
(a, b)=> a < b ? -1 : 1
```

逆順にしたい場合は、a と b をひっくり返す。

同点の場合に次の比較方法がある場合は ```||``` でつなぐ。まず数値で比較し、同点なら文字として比較するなら
```js
(a, b)=> a - b || (a < b ? -1 : 1)
```
ただしこの場合、先の比較関数は同点の場合に必ず 0 を返すこと。
access2000の作法 その9

# 概要
access2000の作法、調べてみた。
クエリーを表示してみた。


# クエリーを表示する手順。
- menuフォームを右クリック。
- デザインビューを開く
- ボタンを設置
- ウィザードが開く　キャンセル
- プロパティシートを開く
- イベントを開く
- クリック時、コードビルダーを開く

```
Private Sub コマンド5_Click()
    DoCmd.OpenQuery "q売上テーブル", acViewNormal
End Sub
```

- フォームを閉じる
- 保存する


以上。
個人用タブのアプリへのリンクを作る（ディープリンク）

こちらの続編？になります。
https://qiita.com/Satoshi_Yoshino/items/c4d92e65d669b4a58a25

チャネルにピン止めしたアプリへのリンク（ディープリンク）は上記のエントリーをもとに作成いただければと思います。
では個人用タブのアプリのリンクはどうするか？

基本的にはピン止めすることをお勧めしますし、管理者であれば「強制ピン止め」をしたほうがいいことが多いです。（社内ポータルとか、Power Appsで作った業務アプリとか）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/54436d01-e134-6317-1d64-24ba141d1096.png)


ディープリンクにより個人用タブのアプリを起動したい場合は以下のようになります。

`https://teams.microsoft.com/l/entity/e031fc80-b6c5-49df-aa54-bf14b477****/entityId`

GUID部分はTeamsアプリのID、entityId部分はマニフェスト作成時に定義した一意の文字列ですね


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/a62f8660-e87e-b953-cb83-2cd0747d8edb.png)


Docsには以下のように記載されていますが、WebURL以下など省略が可能です。
https://docs.microsoft.com/ja-jp/microsoftteams/platform/concepts/build-and-test/deep-links?tabs=teamsjs-v2

使い方としてはポータルにハイパーリンクを貼るとか直接送付するとかですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/cc226a79-040d-9e5b-a374-c92b284c33b6.png)
access2000の作法 その8

# 概要
access2000の作法、調べてみた。
クエリーを作ってみた。

# クエリーを作る手順。
- menuフォームを右クリック。
- デザインビューを開く
- ボタンを設置
- ウィザードが開く　キャンセル
- プロパティシートを開く
- イベントを開く
- クリック時、コードビルダーを開く

```
Private Sub コマンド4_Click()
    Dim cDB As DAO.Database
    Set cDB = CurrentDb
    Dim Q As QueryDef, Tbl As TableDef
    Set Q = cDB.CreateQueryDef("q売上テーブル", "SELECT * FROM 売上テーブル WHERE 売上>1000;")
    MsgBox "ok"
End Sub
```

- フォームを閉じる
- 保存する

以上。
access2000の作法 その7

# 概要
access2000の作法、調べてみた。
テーブルを表示してみた。

# テーブルを表示する手順。
- menuフォームを右クリック。
- デザインビューを開く
- ボタンを設置
- ウィザードが開く　キャンセル
- プロパティシートを開く
- イベントを開く
- クリック時、コードビルダーを開く

```
Private Sub コマンド2_Click()
	DoCmd.OpenTable "売上テーブル", acViewNormal
	MsgBox "ok"
End Sub
```

- フォームを閉じる
- 保存する


以上。
Helix-Editorのアップデートまとめ

Helixのアップデートが来たので軽く紹介する 
```plaintext 
💡 注意点 version22.05
上記のバージョンなので注意する
```
参考：:point_right: [website](https://helix-editor.com/news/release-22-05-highlights/)，[change log](https://github.com/helix-editor/helix/blob/master/CHANGELOG.md#2205-2022-05-28)

releasesは[こちら](https://github.com/helix-editor/helix/releases/tag/22.05)から

## webサイトのかいつまみ

インデントがきちんと機能するように作り変えた

左側のガター(隙間みたいなところ)を設定できるようになった

各言語ごとに上書き可能な設定を作れるようになった

ルーラーが設定できるようになった

空白や改行などを表示できるようになった :thumbsup:

```toml:config.toml
[editor]
rulers = [10,20,30] # 複数設定できる

[editor.whitespace.render]
space = "none"
nbsp = "all"
tab = "all"
newline = "all"

[editor.whitespace.characters]
space = "·"
nbsp = "⍽"
tab = "»"
newline = "↲"
```

レジスターを使ったペーストをファイルピッカーで使えるようになった :thumbsup:

選択箇所を指定した幅にハードラップできる :thumbsup:

分割したウィンドウを入れ替えられる

エディタ起動中に言語サーバーを切り替えできる

## チェンジログの簡単な説明

ピッカーで`C-j`，`C-k`で上下に移動できていたのが削除された

同様に，`C-f`，`C-b`の上下スクロールが`C-d(own)`，`C-u(p)`に変更された

`A-hjkl`のTree-stterを使ったの操作が一貫性を考えて`A-pion:p(rev)i(n)o(ut)n(ext)`に変更された

`[p`，`]p`によるパラグラフのモーションとテキストオブジェクトのが追加された

`:buffer-next`，`:buffer-prev`が追加された

`Space-F`でワーキングディレクトのファイルを選択ができるようになった

`:write!`サブディレクトリを含め再帰的にディレクトリを作成する

`m`で最も近い周りのペアを選択するテキストオブジェクトを追加した

`:pipe`で入力可能なコマンドが追加された :thumbsup:
pythonの`black`のようなコマンドとhelixの`%:全選択`を一緒にマッピングできるようになった

`:run-shell-command`vimの`:!`とにた動作，結果がポップアップ画面で表示される

`:log-open`ログファイルを開けるようになった :thumbsup:
`helix -vv file`でログを付けてバグらせて，logを見るというのが楽にできるようになった

その他利便性の向上やバグフィックス，多数のテーマやLSP，言語追加などがある

### 所感

利便性の高いコマンドやバグ修正が多くだいぶ使いやすくなった

間違った解説は後で修正する

私のconfig.tomlはこんな感じ

特にこだわっているところはあまりない

```toml:config.toml
# theme = "gruvbox"
theme = "onedark"

[editor]
line-number = "relative"
scrolloff = 3

[editor.cursor-shape]
insert = "bar"
normal = "block"
# select = "underline"

[editor.file-picker]
hidden = false

[editor.whitespace.render]
space = "none"
tab = "all"
newline = "all"

[editor.whitespace.characters]
space = "·"
tab = "»"
newline = "↲"

[keys.normal]
space = { w = ":write", c = "toggle_comments" }
tab = ":buffer-next"
S-tab = ":buffer-previous"
C-h = ["select_all", "select_regex"]

g = { e = "goto_file_end" , j = "goto_next_paragraph", k = "goto_prev_paragraph" }

ret = ["open_below", "normal_mode"]
S-ret = ["open_above", "normal_mode"]

# 解説予定，あまり使わない
# w = "move_next_japanese_word_start"
# e = "move_next_japanese_word_end"
# b = "move_prev_japanese_word_start"

C-t = { c = ":buffer-close", n = ":new", h = ":hsplit-new", v = ":vsplit-new" }

[keys.insert]
j = { j = "normal_mode" }

# quick select mode
C-v = "select_mode"
A-v = "extend_to_line_bounds"

# delete
C-a = "delete_word_backward"
C-d = "delete_word_forward"

C-h = "move_prev_word_end"
C-j = "move_line_down"
C-k = "move_line_up"
C-l = "move_next_word_start"

[keys.select]
k = "extend_line_up"
j = "extend_line_down"
```

他の部分を設定したい場合は[docsのconfig](https://docs.helix-editor.com/configuration.html)を参照する
Anacondaを使わずにDeepLabCutを使いたい（Linux)

DeepLabCutはAnaconda推奨と書かれていますが、AnacondaをインストールしなくてもDeeplabcutを使うことはできます。
# 事前準備
Anacondaを利用する場合と同様に
CUDA等をインストールしてGPUが動作する環境は整えておく必要があります。
[こちらのページ](https://qiita.com/suginaga/items/dfd6b891ecf3d678f476)を参考にしてAnacondaをダウンロードする説明の前まで行っておきます。


# DeepLabCutのインストール
<font color="red">新しいバージョン2.3のdeeplabcutが出ました。
deeplabcutのインストールは次の１行のみでOKになりました。（2023/2/1）</font>
~~~
pip install 'deeplabcut[gui,tf]'
~~~
Deeplabcutを起動
~~~
python3 -m deeplabcut
~~~
![img1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/9e7d77cb-4884-1266-ee07-611f6f026e5c.png)

#
旧バージョン2.2をインストールする場合は以下をご覧ください

~~~
sudo apt update
sudo apt upgrade
sudo apt install git
~~~

GitHubよりDeepLabCutをコピーします
~~~
$ git clone https://github.com/DeepLabCut/DeepLabCut.git
~~~
DeepLabCutを起動する上で必要なものをインストールします
~~~
pip install tensorflow
pip install networkx
pip install pandas
pip install ruamel.yaml
pip install scipy
pip install filterpy
pip install numba
pip install tqdm
pip install scikit-image
pip install opencv-python
pip install opencv-contrib-python
pip install sklearn
pip install imgaug
pip install tensorpack
pip install tf_slim
pip install statsmodels
~~~
~~~
sudo apt install -y libgtk-3-dev
pip install wxPython
~~~
DeepLabCutが保存されているディレクトリに移動します
~~~
cd deeplabcut
~~~
Deeplabcutを起動
~~~
python3 -m deeplabcut
~~~

![img18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/6a5500ce-165e-0533-a97a-9d3fd5f4bd0a.png)
Flutterでもスクレイピングがしたい

# 目次
1. [準備](#準備)
1. [WindowControllerでhtmlを取得する](#windowcontrollerでhtmlを取得する)
1. [要素を探す](#要素を探す)
1. [欲しい値を取得する](#欲しい値を取得する)
1. [コード全文](#コード全文)

# 準備

universal_htmlというライブラリを使います
https://pub.dev/packages/universal_html
pubspec.yamlに下記を追加
`universal_html: ^2.0.8`

# WindowControllerでhtmlを取得する
WindowControllerでhtmlを取得します
今回はQiitaのトレンドページから記事一覧を取得します
```
final url = 'https://qiita.com/trend'
final controller = WindowController();
await controller.openHttp(uri: Uri.parse(url));
```

# 要素を探す
querySelectorAllというメソッドで要素を探します
```
final elements = controller.window!.document.querySelectorAll("article > h2 > a");
```
今回は要素を特定するのにhtmlタグを使っていますがclass名を使うこともできます
(例)
```
final elements = controller.window.document.querySelectorAll(".className > .className2 > a");
```

# 欲しい値を取得する
```
elements.forEach((element) {
  final title = element.innerHtml;
  final href = element.attributes['href'];
});
```


# コード全文
コピペ用です
強制アンラップしているので気をつけてください
```
import "package:universal_html/controller.dart";

final url = 'https://qiita.com/trend'
final controller = WindowController();
await controller.openHttp(uri: Uri.parse(url));
final elements = controller.window!.document.querySelectorAll("article > h2 > a");

elements.forEach((element) {
  final title = element.innerHtml;
  final href = element.attributes['href'];
});
```
WSLで開発環境整えたときのメモ

# WSLインスコ
特にどれでも良かったのでUbuntu22.04を入れた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606574/dd594915-6a28-5bf6-b678-c5d823ef05de.png)

ちなみにこれインスコするときにエラーして進めなかった。
原因はWSLのkernelが古かった。
最新版インストールしてからUbuntuのインスコやり直したらいけた
（https://docs.microsoft.com/ja-jp/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package）

# GWSLのインスコ
StoreでGWSLで検索すれば出てくる。
これが地味に便利
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606574/d9f44dfa-8d24-a64a-65dc-fdad56666751.png)

### 何ができの？
公式サイト：https://opticos.github.io/gwsl/
公式のデモ動画：https://www.youtube.com/watch?reload=9&v=S6GXBEQ5KzA&feature=emb_title

まあつまりWSLのランチャー
これひとつでWSLにインスコしたアプリをぽちっと実行できる
ブラウザだってメディアの再生もいける

__設定方法は下記の参考にしたサイト様を参照__
https://ari23.hatenablog.com/entry/gwsl-install
https://qiita.com/1024xx4/items/45a5cce13eafa17ca6f1


あとは好きなアプリを入れてランチャーから起動すればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606574/10279ad1-99a9-2ac7-58c0-646523e911ac.png)

# Chromeのインスコ方法
https://docs.microsoft.com/ja-jp/windows/wsl/tutorials/gui-apps#install-google-chrome-for-linux
日本語文字化けする場合
`sudo apt-get install unifont`

# VSCodeもWSLで実行
これはWSL上でVSCodeを実行するのではなく、Widnows上でWSLに置いてるソースファイルにアクセスする感じ。
Windwosに普通にVSCode入れて、
拡張機能でRemoteWSLを入れて、
WSL上で開きたいディレクトリやファイルを引数に指定して`$ code {開きたいディレクトリやファイルを指定}`で開けばOk
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606574/d62d611f-e254-1232-6cab-aa00d5d8c81c.png)

MSの公式が丁寧に書いてくれてるから詳しくはそっち見たほうが早い
https://docs.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-vscode

# Dockerの対応
公式からWindows版を入手
https://www.docker.com/products/docker-desktop/

このへんぽちぽち設定すればWSLでdocker使えるようになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606574/964164bf-ce39-3d79-31df-a343629619ff.png)
詳細：https://docs.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-containers#install-docker-desktop

うん、MS公式優秀。

Docker使えてVSCode使えてGUIのアプリも表示できて。もうあとはどうにでもなるっしょ
MLKitの一次元バーコード読み取り

# MLKitの一次元バーコード読み取り
一次元バーコードを読み取るAndroidアプリで[zxing-android-embedded](https://github.com/journeyapps/zxing-android-embedded)というライブラリを利用していましたが、ベースが旧CameraAPIだったためAndroid11などで動作しない問題があり、代わりにMLKitのバーコードスキャンAPIの利用を検討することにしました。

## ユースケース
作りたいのはバーコードスキャナのイメージなのでバーコードを読み取った後、処理する予定なのでプレビューは停止させます。サンプルコードのようにリアルタイムでバーコードをマークしたままプレビューし続けるようなことはしません。

今回は試しにこのバーコードを読んでみます
IQOSレギュラーのバーコードですw
![20220518_131724.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351880/5e1e559c-80ce-d19f-929d-f42878d4557c.jpeg)

#### うまく行った時
![Screenshot_20220518-132246_sampleApp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351880/538bbde0-d6d4-93ae-6ae3-1403dd6dcda7.jpeg)

#### 誤検出した時
![Screenshot_20220518-131634_sampleApp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351880/a154f705-8e2f-5eea-97a6-8d4477632a66.jpeg)

後述するmlkitのサンプルコードでは[CameraX](https://developer.android.com/training/camerax?hl=ja)と[画像解析](https://developer.android.com/training/camerax/analyze?hl=ja)を利用して[BarcodeScanner](https://developers.google.com/android/reference/com/google/mlkit/vision/barcode/BarcodeScanner)でバーコード検出しています。
しかし、オートフォーカスが動作中だったりスマホが動いていて画像がブレている状態でも処理してしまっているので、その場合に誤検出が起きることがあります。本当はCamera2APIのようにオートフォーカスのステータスを見てフォーカスロックされている時の画像を解析に回したいが、CameraXではフォーカスの状態が取れない？のでCamera2APIで置き換えた方が良いかもしれない。
また、[BarcodeScanner](https://developers.google.com/android/reference/com/google/mlkit/vision/barcode/BarcodeScanner)では
バーコードにはチェックデジットがあるにも関わらず、チェックデジットも正しく見えるような誤検出をしていました。


# 結論
MLKitのバーコードスキャナを利用するにあたり、一次元バーコードではカメラをゆらゆら動かし続けていると数十回に1回くらいの割合でチェックデジットも含めた絶妙な誤検出をしていた。
商用利用向けに開発するには、MLKitの検出結果にさらに各種バーコードの誤り検出の処理を組み合わせる必要がありそう。例えば、３フレームほど結果を保持しておいて全て同じ解析結果だったら検出として扱うような。
フレーム毎の検出結果の保持数を上げれば時間はかかるけど、精度は上がるといった仕組み。
ちなみにZxingは単一のバーコードしか解析できなさそう？なので、複数バーコードを一度に読み込みのはMLKitを使った方が良さそう。

# 参考
[Scan Barcodes with ML Kit on Android](https://developers.google.com/ml-kit/vision/barcode-scanning/android?hl=ja)

https://github.com/googlesamples/mlkit/tree/master/android/vision-quickstart

https://github.com/googlesamples/mlkit/tree/master/android/material-showcase
名前解決の順番について

## 記事
インターネットの世界で名前解決を行う場合、DNSサーバーを使って名前解決を行うが、社内のローカル環境（LAN）といった、限られた範囲内だけで名前解決をするときは、hostsファイルを使って名前解決を行うことができます。社内にDNSサーバーを立てるといった、大げさなことを行う必要はありません。ただし、ノードが追加になった場合は、hostsファイルに新しいノードを都度追加して、全てのノードに配布しなくてはいないという煩わしさは発生します。

hostsファイルを全ノードで分散管理をすることなく、サーバーで一元管理できないだろうかという発想で生まれた仕組みがDNSです。中小企業の営業所など、規模の小さいLAN環境であれば、hostsファイルでこと足ります。

hostsファイルを使った名前解決の仕組みはレガシーであるが、最新のLinuxのバージョンにも、hostsファイルを使って名前解決ができる仕組みは残っています。hostsファイルは、/etcの中に存在します。cat /etc/hostsで中身を確認すると、デフォルトで127.0.0.1とlocalhostsを紐づける記述だけがあります。

つまり、この記述があることで、下記のコマンドのどちらを使っても、ループバックテストが行えるようになります。
```
ping 127.0.0.1
ping localhosts
```

hostsファイルとDNSの情報に矛盾があった場合、どちらの設定が優先されることになるだろうか。実は、hostsファイルとDNSの名前解決を行う優先順位をカスタマイズすることができるようになっています。優先順位を設定するファイルは、/etc/nsswitch.confです。
```
cat /etc/nsswitch.conf
hosts:          files dns
```

このファイルを見ると、デフォルトで、①hostsファイル、②DNSの順番で参照するように設定されています。このファイルを触ることで、優先順位を逆にすることも可能です。（あまりしないとは思いますが。）因みに、WindowsでActiveDirectoryが登場する前に使われていたWINSの仕組みを使って、Linuxの名前解決を行うことはできません。WINSとはDNSのWindowsオンリー版のようなものです。

## 補足
Windows環境で名前解決を行うには、ActiveDirectoryでドメイン管理を行っている環境であれば、DNSで名前解決を行うことになります。ActiveDirectoryが登場したことで、従来のWINSによる名前解決の仕組みはレガシーになりました。Windows環境だけで構築されたローカル環境（LAN）であっても、インターネットと同じ仕組みで、ドメイン管理、名前解決をさせるようにマイクロソフトが方針転換をしました。

Linuxのhostsファイルに対応するWindowsの名前解決の仕組みに、lmhostsファイルというのがありました。厳密にいえば、hostsファイルはホスト名を解決させるための仕組みであるのに対し、lmhostsファイルはNetBIOS名を解決させるための仕組みです。Windowsでよくコンピューター名という言い方をするが、正式には、コンピューター名をホスト名と言い換えることはできません。コンピューター名とは、厳密にいえばNetBIOS名のことです。

lmhostsファイルのlmって何の意味だか分かりますでしょうか？Microsoftから公式な発表はないため明らかにはなってはいないが、LANマネージャーの意味だと推測されています。LANマネージャーはWindows3.1で搭載されていたLANを管理するための機能です。当時はコンピューターをLANで接続すること自体珍しく、プロトコルにTCP/IPを採用することもほぼほぼない時代でした。ベンダーが独自に開発したプロトコルを使って通信を行っていました。Windows95が登場し、そして、インターネットが普及すると、これらの代物は消えていくことになりました。
Python if文の書式

## はじめに
4月からIT業界に入り、勉強を続けています。
勉強してきたことを復習を兼ねてQiitaで投稿を始めました。
## 対象者
この記事は下記のような人を対象にしています。

・駆け出しエンジニア
・プログラミング初学者

## if文とは
if文は 条件分岐を行うための文法です.
pythonのif文は一般的に,if..elif..elseで構成されています。
条件式の結果が真(true)または偽(False)であるかを判断し、条件にあった処理を行います。

## if文の書式

### if文の基本
```
if 条件式:
   　結果が真のときに実行
```
### if else の場合
```
if 条件式:
     結果が真の場合に実行
else:
     結果が偽の場合に実行
```
### if elif else　の場合
```
if 条件式1:
     1の式の結果が真の場合に実行
elif 条件式2:
     1の式の結果が偽で2の式の結果が真の場合に実行
else:
     全ての条件式が偽の場合に実行
```
## まとめ

今回は初歩的なif文の書式について書きました。if文では他の構文の中に使用することが多く、きちんと理解しておきたいです。

## 参考文献

[python if文を使った条件式分岐](https://www.javadrive.jp/python/if/index1.html#section1)
`pd.DataFrame.groupby()`のキーにすると速いデータ型・遅いデータ型

# `pd.DataFrame.groupby()`のキーにすると速いデータ型・遅いデータ型

[pandasのgroupbyにおける型別速度調査](https://kagglenote.com/misc/pandas-groupby-speed/)という記事をみかけました。

`pd.DataFrame.groupby()`を行ったときに、キーとする列がどのデータ型だと処理が速く、どのデータ型だと処理が遅いのかを探った記事になります。

しかし、調査対象となるデータ型は`int64`・`float64`・`object`・`category`のみでした。

本記事では、`Int64`・`Float64`・`string`データ型を追加してこれを行うことにしました。

```python
import benchit
import numpy as np
import pandas as pd

CAT_N = 30
rng = np.random.default_rng(0)


def makeDataFrame(row_num):
    df = pd.DataFrame({"id_int": rng.integers(0, CAT_N, row_num)}, dtype=int)
    df = df.assign(
        id_Int64=df["id_int"].astype("Int64"),
        id_float=df["id_int"].astype(float),
        id_Float64=df["id_int"].astype("Float64"),
        id_str=df["id_int"].astype(str),
        id_string=df["id_int"].astype("string"),
        id_categorical=df["id_int"].astype("category"),
        values=rng.random(row_num),
    )
    return df

def id_int(df): df.groupby("id_int")["values"].sum()
def id_Int64(df): df.groupby("id_Int64")["values"].sum()
def id_float(df): df.groupby("id_float")["values"].sum()
def id_Float64(df): df.groupby("id_Float64")["values"].sum()
def id_str(df): df.groupby("id_str")["values"].sum()
def id_string(df): df.groupby("id_string")["values"].sum()
def id_categorical(df): df.groupby("id_categorical")["values"].sum()


inputs = [makeDataFrame(n) for n in 10 ** np.arange(8)]

funcs = [id_int, id_Int64, id_float, id_Float64, id_str, id_string, id_categorical]
t = benchit.timings(funcs, inputs)
t.plot(figsize=(10, 8), logx=True)
```

## 結果

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394333/6793b505-5db4-4956-a8b4-039290daa465.png)

（当然ながら？）`category`型の優位は動きません。それに次ぐ`Int64`と`int64`、`Float64`と`float64`はあまり変わらないようです（なお`datetime64`・`timedelta64`型もやってみましたが`Int64`とほとんど同じでした）。`string`データ型が（`object`よりも！）最も遅い結果となりました。
tmuxのInstall・How to Use

# Install
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344532/252d686c-8931-0c68-89fb-da6d3cddb214.png)
# How to Use

## 基本コマンド
と言いつつ、[ここの記事](https://qiita.com/nmrmsys/items/03f97f5eabec18a3a18b)を見るのが一番良い
### Session定義・開始
`$ tmux new -s ${Setssion Name}`
### Session確認
`$ tmux ls`
### Sessionにアタッチ
`tmux attach -t ${Setssion Name}`
## コマンドモード
### コマンドモード起動
`$ Control + b`
### Sessionから抜ける
`$ d`
# 参考
- [tmux github rep](https://github.com/tmux/tmux/wiki/Installing)
- [tmuxを使ってSSHの接続が切れてもコマンドを動かし続ける](https://www.karakaram.com/how-to-execute-a-command-in-a-tmux-session/)
xsetwacomでのBambooの設定

MTE-4xxのホイールのボタン設定は

xsetwacom set < Device ID > AbsWheelUp key < keycode >

といったフォーマットになっているが、
keycodeが独特なのかメンテされなくなった後に大きな変更があったのかはわからないが、
例えばKP_Plus（Numpadの＋)などが軒並みエラーとなる。

xevで調べたkeycodeははじかれるが、keysymだといけるようだ。

例えば、Blender用にホイールによるズームをNumpadの"+-"にマップしたければこう。

xsetwacom set < Device ID > AbsWheelUp key 0xffab
xsetwacom set < Device ID > AbsWheelUp key 0xffad

永続化したい場合はxorg.conf.dに設定ファイルを置くのだが、
そのフォーマットもまた違うものになっているので余計カオスに。

素直に、上記コマンドのシェルを.bashrcあたりで実行させるのが無難。