OmniAICreator/Qiita-1.07M huggingface dataset:
azure の storageで中間一致等の自由度の高い検索を行う方法 

## 背景
azure portalはすごく便利ですが、
UIでのazure storageの検索は画像の検索エリアしかなく、前方一致検索しかできず非常に使いづらい。
![temporary_-_Microsoft_Azure_-_Vivaldi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263851/d93a0c12-1ffd-d4c4-6c75-f4e7cedb367f.png)

## やりたいこと
今回、以下の条件のファイル一覧が欲しかった。

* temporyという名称のコンテナの中で
* 特定の名称が含まれている（中間一致）ファイル
* 2021/9/1以降に作られたファイル
* 結果を作成された日付の昇順で並べかえ

## 実現方法
これを実現するにはUIでは無理なので、
azure cliのコマンドと[jmespath](https://jmespath.org/examples.html)を組み合わせると
一発のコマンドで実現できる。

```
az storage blob list --account-name xxxx \
　　　　--account-key xxxxxx \
　　　　--container-name temporary \
　　　　--query "sort_by([?contains(name,'hoge') && properties.creationTime >= '2021-09-01'].{Name:name,creationDate:properties.creationTime},&creationDate)"  \
　　　　--output table
```

## 参考
https://docs.microsoft.com/ja-jp/cli/azure/storage/blob?view=azure-cli-latest
https://docs.microsoft.com/ja-jp/cli/azure/query-azure-cli
https://dev.classmethod.jp/articles/jmespath-tutorial/
devdの丑の時参り

urjtagなどでFTDIモジュールを使う場合devdが勝手にロードするkoが邪魔になります。FTDIのモジュールは通常はシリアルインターフェースとして機能しますが、urjtagなどではMPSSEやBitBangでのアクセスになり、これらは同時には使えないためです。このためdevdに死んでもらう必要があります。

```
% sudo killall -9 devd
```

本来このような手荒な事はするべきではありません。しかしながら、uftdi.koをkldunloadしても、またdevdがloadしてしまうのでしかたありません。明示的にunloadしてるものを再びloadする仕様はおかしいです。MacOS Xのkextはunloadしたらloadされることはありません。

この問題を回避する方法として、デバイスのUSB情報を書き換えるやり方もあります。これはWindows上のアプリのFT_Progを使って書き換えます。

[こちらに書きました](https://qiita.com/yamori813/items/a86c1b13348569d176db)がVIDを変更してしまうと、次からFT_Progが使えなくなるので、あまりお勧めしません。

秋月電子のFT2232Dモジュールを利用しているのですが、FT2232DではEPROMは外付けで、秋月電子のモジュールには実装されていません。自分が使っているモジュールにはマルツで購入したSOP 8PinのEEPROMを実装してあります。EEPROMはFT_Progでも認識できて、プログラムもできるのですが、USB接続時の情報はデフォルトのものが使われてしまいます。いろいろ試したところ、なんらかの理由でEEPROMの値のチェックサムが壊れてしまったのが原因でした。一度FreeBSDで消してFT_Progで書き込みをしたところ問題なくなました。
動画をバラしたり再構成したりする時のffmpegメモ

# 動画→静止画
フレームレート60で設定

```
$ ffmpeg -i input.mp4 -vcodec png -r 60 image_%04d.png
```

# 静止画→動画
こちらもフレームレート60

```
$ ffmpeg -r 60 -i image_%04d.png -vcodec libx264 -pix_fmt yuv420p -r 60 out.mp4
```

# 参考
* [ffmpeg 動画から連番画像を作成する \- Kinaconの技術ブログ](https://kinacon.hatenablog.com/entry/2019/03/13/ffmpeg_%E5%8B%95%E7%94%BB%E3%81%8B%E3%82%89%E9%80%A3%E7%95%AA%E7%94%BB%E5%83%8F%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)
* [ffmpegで連番画像から動画生成 / 動画から連番画像を生成 ~コマ落ちを防ぐには~ \- Qiita](https://qiita.com/livlea/items/a94df4667c0eb37d859f)
[Dfinity] InternetComputer Plugの使い方と説明


####概要
BTCやETHをはじめほとんどのブロックチェーンがAWSやGCCなどのクラウドサービスでフロントエンドをホスティングしている中、フロントエンドにもパブリックブロックチェーンに取り込もうとする新たなクラウドサービスを目指す [Internet Computer]("https://internetcomputer.org/")でブラウザの拡張機能ウォレットであるPlugの使い方と全般の説明になります。

####使い方

**サポートブラウザ**

- chrome
- firefox
- edge
- opera
- brave

詳しくは[こちら]("https://github.com/Psychedelic/plug")まで

**インストールとセッティング**

chomeは[クロイカラスさんのサイト]("https://eosers.com/2021/08/31/plug%E3%82%A6%E3%82%A9%E3%83%AC%E3%83%83%E3%83%88%E5%B0%8E%E5%85%A5%E6%96%B9%E6%B3%95%EF%BC%88icp%E3%82%A6%E3%82%A9%E3%83%AC%E3%83%83%E3%83%88%EF%BC%89/")がわかりやすいと思います。
braveは[no_rulesさんのサイト]("https://no-rules.site/wordpress/brave-function-expansion-install/")が良いと思います。
firefoxは[こちら]("https://addons.mozilla.org/en-US/firefox/addon/plug/")から
edgeは[こちら]("")から

【注意１】
各リンク先でも注意されてますが、リカバリーフレーズとパスワードは絶対に他人に見せたり、ネットに公開しないで、紙に書き写したりしてオフラインで必ず保管して下さい。またリカバリフレーズを要求するようなサイトやメール、DMがきたとしても要求に答えないで下さい。保管資産をすべて盗まれてしまいます。
【注意２】
バージョン0.2.0以前にウォレットを作成していると現在（2021/10/21)のバージョン0.3.5にインポートしようとしても弾かれます。[こちら]("https://docs.plugwallet.ooo/resources/migrating-curve/")から対応してください。私は面倒だったので旧ウォレットから新ウォレットに送金しましたが・・・。


#####使い方
基本的にEthereumのブラウザ拡張機能のウォレットであるMetamaskと同じです。

**アカウント名変更**
下記のようにアカウント名横のペンアイコンをクリックするとアカウント名を変更できます。
![アカウント](https://miro.medium.com/max/1400/1*akM6MpyNIL6ZETIQQxoqtw.png)

**アカウント作成**
デフォルトページの右上ボタン、 Create Accountから新しいアカウントが作成されます。
現在は削除不可ですが削除出来るように対応する予定。
![アカウント作成](https://miro.medium.com/max/1400/1*-vBhmOXSc_fm_c7G0pvnNQ.png)

**送金**
sendボタンから送金出来ますが、送信先には２種類あるので注意して下さい。

- Principal ID
Internet Computer内のNNSやデプロイされたcanister(スマートコントラクト）に一意に付与されたIDで、圏内では送金可能ですが、圏外である取引所・サポートのないdAppsからは送受信出来ません。主な利用はcaninsterをactiveにし続けるためのcyclesの送金だと思われます。少し難しくなりますがcyclesはcanister内のcyclesウォレットで送金・受金しますが、PlugではPrincipal IDに統合して外からは見えないようになっています。
尚、Principal IDを送金で共有することは出来ますが秘匿性は薄れます。

- Account ID
Principal IDから派生したハッシュというデータ算出値のサブアカウントで複数取得可能です。ただし現在複数Account IDが取得出来るか不明です。[【参考】](https://forum.dfinity.org/t/what-is-the-difference-between-account-identifier-principal-identifier-and-public-key/3677/2?u=ueyamamasashi)
Principal IDとは違って、取り扱いのある取引所等から送金が可能です。


**NFT**
バージョン0.3.1からNFTを保管・閲覧することが出来るようになりました。
NFTタブから入ります。
現在（2021/10/21)対応NFTは以下のとおりです。
`Cronic Critters` `Cronic Wearables` `Starverse` `Wrapped ICPunks` `ICP News` `ICMojis` `ICMojis Items` `ICPuzzle` `IC Drip` `Wing` `ICPBunny` `Wrapped ICPBunny` `ICelebrity` `The Universo` `Principia Mathematica` `Candy Library` `Cake` `ICPuppies` `Internet Astronauts` `ICTuts`

**その他**

- add Token
EXT(Extendable Token Standard)に対応します。coming soon

- Contracts
Contracts(MyAccounts>>settings>>contracts)で利用するPrincipal IDとAccount IDをセーブ出来ます。

- Export DFX Identity
~~開発者向けです。~~ Plugウォレットを操作するためにpemファイルをエクスポートできます。DFXコマンドでICPやcyclesを扱う時はpemファイルからpricipalIDの鍵を読み込む必要があります。
dfxコマンドでpemファイルをimportするには以下のコマンド。

```
dfx identity import <new-identity-name> <path-to-pem>
```


間違えていることや不明な点があると思われます。そのときは遠慮なく申し出て下さい。

【参照】
https://docs.plugwallet.ooo/
https://medium.com/@plug_wallet
【合格体験記】CKAD（Certified Kubernetes Application Developer）

# 概要
CKADに合格したので、資格の更新時に復習できるよう勉強法の備忘録にしたい。
CKADは、コマンドやYAMLを使ってKubernetesの基本的な動作ができるかを試させるハンズオン試験だ。

- 試験はオンライン形式　
- 試験時間は2時間　
- 問題数は約19問　
- 合格ラインは66%　

選択式問題ではないので曖昧な理解では合格はできない。
しかし、1ヶ月弱で正しいステップを踏めば合格は可能である。

合格するためには、必要なステップは以下の3つだ。

1. Kubernetesの概要を学ぶ
1. Kubectlを学ぶ
1. ハンズオン試験に慣れる

# 1. Kubernetesの概要を学ぶ
仮想マシンとコンテナの違いは何なのか、DockerとKubernetesは何なのか、podとdeploymentは何なのか。
基本的なコンテナの知識とKubernetesの知識は、必須である。
Kubernetesの中でそれぞれのコンポーネント（podやdeployment）がどう動いているのか頭の中でイメージできるくらいを目安に概要を学ぶ。（Kuberntesを完全に理解しようとすると途方の暮れない時間と労力がかかるので理解のボーダーを決める必要がある）
以下の書籍は、基本的なコンテナの知識とKubernetesの知識を学ぶ上でちょうどいい難易度である。
イラストも分かりやすくイメージしやすい。
## イラストでわかるDockerとKubernetes Software Design plus
![Screen Shot 2021-10-22 at 18.24.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1553280/eef37549-225b-c26b-1208-ba526d937cf7.png)

コンテナランタイムの章は、CKADでは必要ない知識なので、さらっと読む程度でOK

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

# 2. Kubectlのコマンドを学ぶ
Kubernetesの中でそれぞれのコンポーネント（podやdeployment）がどう動いているのか頭の中でイメージできるようになったら、実際にKubectlコマンドを使ってKubernetesを動かす練習をする。
以下のGitHubのCKAD-exercisesのコマンドがスラスラと使えるようになるまで、ひたすら練習。
## CKAD-exercises
https://github.com/dgkanatsios/CKAD-exercises

ところどころで分からない部分が出てくるはずなので、その時はKubernetesの公式ドキュメントを読んで理解の補完をする。

◯公式ドキュメント

https://kubernetes.io/ja/docs/home/

◯Kubectlの公式ドキュメント

https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

## Minikube の使用
コマンドを実際に実行してみたい時は、ローカル環境で簡単にKubernetesを動かすことができるMinikubeがおすすめ。

https://kubernetes.io/ja/docs/setup/learning-environment/minikube/



# 3. ハンズオン試験に慣れる
## A Cloud Guru（7日間無料）
Kubernetesの動かし方が大体分かったら、次は模擬試験に挑戦。
実際の要望に応じてKubernetesを動かしたり、ログを見てバグを修正するなどは、模擬試験でないとできない。
Udemyなどにも教材はありますが、僕は1週間無料で使える A Cloud Guru で模擬試験に取り組んだ。
実際の試験に近い形式でのハンズオン形式の問題なのでとても役に立った。

https://acloudguru.com/course/certified-kubernetes-application-developer-ckad

## Linux Foundation のシュミレーションテスト

試験に申し込むと以下の画面からシュミレーションテストを実施できる。
難易度は少し高めだが、実際のテスト画面や採点の仕組み、自分では気づけなかったKubernetesの設定の間違った理解などが確認できる。
僕もdeploymentとserviceの紐付け方を間違った理解をしていたので、ここで確認できたのは大きかった。
![Screen Shot 2021-10-22 at 18.49.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1553280/f6478da9-37c4-bc8b-e158-cc6c2b877060.png)


# （番外編） しれっと役立つテクニック
**1.試験中は公式ドキュメントを参照してOK**
試験中、ひとつのタブにて公式ドキュメントを参照することが許されている。
僕は、コンポーネントごとのドキュメントのページをChromeのブックマークに登録し、すぐに参照できるようにしていた。
**2.補完機能を使う。**
公式ドキュメントにチートシートというページがある。そこでは補完機能の設定方法が載っている。
他にも大まかなkubectlのコマンドが載っていたりするので便利。

https://kubernetes.io/ja/docs/reference/kubectl/cheatsheet/

**3.英語の試験を受ける**
日本語の試験も存在するが、英語の試験と何も変わらない。
試験監督のチャットのやりとりも英語だったし、試験自体も英語版でも日本語に切り替えることは可能。
なのに日本語試験の方が値段が高い。
今のところは英語試験を受ける一択だ。
Amazon LightsailのRedMineにeasy ganttを導入する

# はじめに
本記事ではAmazon Lightsailで起動済みのRedMineにガントチャートを使いやすくしてくれるeasy ganttプラグインを導入して、ユーザーが使えるようになるところまで設定します

# プラグイン導入の手順
-  [easy redmine](https://www.easyredmine.jp/redmine-gantt-plugin)からEasyGanttFree-4.x.zipをダウンロードし、サーバーの任意のディレクトリ(今回は/tmp/)にアップロード

-  /opt/bitnami/apps/redmine/htdocs/plugins/にプラグインを展開

```sh

// zipをプラグイン用ディレクトリにコピーする
cp -p /tmp/EasyGanttFree-4.x.zip /opt/bitnami/apps/redmine/htdocs/plugins/
// プラグイン用ディレクトリに移動
cd /opt/bitnami/apps/redmine/htdocs/plugins/
// zipを解凍
unzip EasyGanttFree-4.x.zip 
// zipを削除
rm EasyGanttFree-4.x.zip 
```

- Ruby on RAILSの設定

```sh
// root権限に変更
sudo su
// ディレクトリを移動
cd /opt/bitnami/apps/redmine/htdocs/
// gemをインストール
bundle install --no-deployment
// ※上記でインストールできなかったら下記を実行
bundle update rails
bundle update railsinstall --no-deployment
// DBを指定してマイグレート
bundle exec rake db:migrate RAILS_ENV=production
```

- RedMineをリスタート
- 
```sh
touch tmp/restart.txt
```


## RedMineのプロジェクトとロールの設定変更
こちらの記事にしたがってプロジェクトへの設定とメンバーへの権限付与するとEasyGanttを使えるようになります
https://qiita.com/moriyuki/items/431640812578106a85b3


## その他参考記事
https://qiita.com/suzuki_sh/items/84806ce231ed9b0f2e6d
https://knight-3000.hatenablog.jp/entry/2018/08/11/004822

## easy ganttの使い方のおすすめ記事
https://trialanderror.jp/easygantt-review/
Windows10でSource Treeを使うときに個人アクセストークンで認証する方法

# はじめに

リモートにGitHubを、GUIクライアントにSourceTreeを使用した場合の、個人アクセストークンによるGitHubへのアクセスする方法です。
以下の記事を参考に初回の設定をしたところ、どうにも認証に失敗してしまいうまくいきません。
そこで、以下にできるようになった方法を残しておきます。

https://qiita.com/michimichix521/items/5981d9783efcc1d7c7cf

# 下準備

1. 個人アクセストークンを取得しておきます。
1. GitHub上でプライベートリポジトリを作成します。この時に、readme.mdを追加しておくことでクローンできるようにします。

# 手順

1. Source Treeでプライベートリポジトリをクローンします。
1. 以下の画面が出るので個人アクセストークンを入れてSign inします。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2006155/e5777fd8-2b8d-f068-85db-3f9b2595695a.png)

1. リポジトリが正しく認識でき、クローン出来たら成功です。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2006155/b27c9bbb-8bcf-5fac-a40b-340163d2cf7b.png)


# 注意事項

パブリックリポジトリをクローンしようとした場合はサインインの画面が出ないと思われる（未確認）ので、プライベートリポジトリをクローンしてください。

# おわりに

初めてSource Treeを使う際に、個人アクセストークンの登録をできなかったため書きました。
読んでくださった方々の参考になると幸いです。
libcxx 実装メモのまとめ

## 背景

libcxx の一部だったり全部を新アーキテクチャに対応したいとかしたいので, libcxx の実装を知りたい.

## 一般

`libc++` == `libcxx` です.
gnustl(GCC STL)非依存を目指して開発されたっぽい?

## メモ

一部コンパイラの builtin を使っているものがあります
(e.g `__is_constructible`)


libcxx での C++11 type_traits ソースコードツアーメモ
https://qiita.com/syoyo/items/12c35c0eccd759624866

libcxx std::hash 実装のメモ
https://qiita.com/syoyo/items/df31bad4d74c360b5f17

libcxx iostream cin 初期化メモ
https://qiita.com/syoyo/items/69e5bbae2b35e3fd0232

libc++ で parallel STL は対応していない(2021/10/06 clang-12 時点)
https://qiita.com/syoyo/items/03e955886bc404d93b45

## Thread

pthread or Win32 thread を使っています.

variadic な引数を pack(?)するのに tuple を使っています.


## include フォルダ

だいたい STL の名前でファイルが作られているのでわかりやすいです.
コード量が多いようなもの(e.g. memory でのスマポとか)は, `__` prefix がついたフォルダに細かく機能ごとに追加されていたりします.

## src フォルダ

thread の実装などが置かれています. これもファイルレイアウトはわかりやすいです.

## 実装上のメモ

* `_VSTD` : `std::ABI_VER` なネームスペースのマクロです. libcxx 内部で `std::` な関数など呼ぶときに使われています.

## typeinfo

gcc, clang の場合, `typeinfo` をインクルードしないと `typeid` キーワードが使えずエラーになります. しかし自前 STL 実装で適当に `typeinfo` ファイルをでっちあげてもうまくいきません.

### clang

https://github.com/llvm-mirror/clang/blob/aa231e4be75ac4759c236b755c57876f76e3cf05/lib/Sema/SemaExprCXX.cpp#L547

clang のコードを見ると, `std::` を定義しないとだめっぽい.

```
#include "mytype_info"

namespace std {
  using mystl::type_info;
} 
```

とすればいけるようです.

### gcc

上記 clang のやりかただと `type_info` が二重定義だよとエラーになります.

T.B.W.
JenkinsでAzure LDAP認証に失敗する

#現象の再現手順：
1. Azure ADのAADDC Usersにユーザを登録
1. Jenkinsに最新のLDAP 2.7をインストール
1. LDAPを設定して「Test LDAP settings」でユーザログインテストを行うとAuthentication failed for user xxxxエラーになる。

#原因：
Jenkins LDAPプラグイン2.7で利用しているSpring securityバージョンにバグがあり、RootDNに空白をエスケープしないためエラーになる。
https://issues.jenkins.io/browse/9742

#対策
Jenkins Githubプロジェクトのソースコードでは既に修正されているため、自分でソースコードからビルドする。
1. git clone https://github.com/jenkinsci/ldap-plugin.git
1. cd ldap-plugin
1. mvn clean package
1. mvn package -Dmaven.test.skip=true -Denforcer.skip=true
1. 「target」に作成された「ldap.hpi」ファイルをJenkinsにインストール
    1. Jenkinsから既存のJenkins LDAPを削除
        1. 「Jenkinsの管理」を選択
        1. 「プラグインの管理」を選択
        1. 「インストール済み」タブを選択
        1. 「LDAP Plugin」右の「アンインストール」ボタンを押下
    1. ビルドしたJenkins LDAPプラグインをインストール
        1. プラグインマネージャーページの「高度な設定」タブを選択
        1. 「プラグインのアップロード」から作成されたldap.hpiファイルを選択
        1. 「アップロード」ボタンを押下
        1. Jenkinsを再起動
            1. Webブラウザから「http://<Jenkins IPアドレス>:8080/safeRestart」

これでAzure ADのAADDC Userに登録したユーザを正しく認証することができるようになる。

以上
[SwiftUI] どうせなら、かっこよく、Glassmorphism

#はじめに
SwiftUIはカスタマイズも簡単なので、色々なUIデザインを試してみることができます。そこで今回はGlassmorphism風のUI作りを紹介していきます。

#Glassmorphismって？
簡単にいうと、すりガラス風のUIのことです。こちらのサイトはCSS用のものですが見ていただければ大体のイメージはつかんでもらえるかと思います。

[Glassmorphism CSS Generator](https://hype4.academy/tools/glassmorphism-generator)
![Glass.ping.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/713689/d8ff6c64-9ff8-d183-ad54-20184fb19947.png)


#できたもの
まずは完成品をご覧ください。プロのデザイナー！というわけではないのでちょっと不十分なところもありますが、SwiftUIだけでとりあえずこんなものができます。
![名称未設定のデザイン-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/713689/18fcb6fb-4029-4908-7bbe-4df8bfa30f88.png)

#コードと使い方
##半透明の背景
```swift:GlassBackGround.swift

import SwiftUI

struct GlassBackGround: View {
    
    let width: CGFloat
    let height: CGFloat
    let color: Color
    
    var body: some View {
        ZStack{
            RadialGradient(colors: [.clear, color],
                           center: .center,
                           startRadius: 1,
                           endRadius: 100)
                .opacity(0.6)
            Rectangle().foregroundColor(color)
        }
        .opacity(0.2)
        .blur(radius: 2)
        .cornerRadius(10)
        .frame(width: width, height: height)
    }
}
```

`RadialGradient`と`Rectangle`を重ね、透明度もちょっとずらしています。もう少しスマートな解決法があるような気もしますが、色々と試行錯誤した結果、これが一番上のサイトのような見た目に近くなりました。



##使い方
```swift:GlassView.swift

import SwiftUI

struct GlassView: View {
    
     var body: some View {
            VStack {
                Image(systemName: "person.circle")
                    .font(.largeTitle)
                Text("Glass")
            }.foregroundColor(.white)
                .background(
                    GlassBackGround(width: 100, height: 100, color: .black)
                        .shadow(color: .black, radius: 2, x: 2, y: 2)
                )
    }
}

```

背景をグラデーションにしたり、パターンの模様をつけておいたりすると透けている感じがよくわかります。`GlassPlaceHolder`の上に表示するものには影をつけていませんが、これは上記のサイトの見本を参考にしたものです。

#まとめ
SwiftUIそのままよりも格段にカッコイイデザインになりました。アプリの背景やUIの配置によって細かい設定を変えた方が良い時もありますが、大体は上のコードくらいで対応できそうです。

立体感のある画面を作れるのがGlassmorphismのいいところで、個人的には結構お気に入りです。みなさんもぜひ挑戦してみてください。

#　

作成中のアプリなどは以下に掲載しているので、よかったらこちらもよろしくお願いします☺️

[Twitter](https://twitter.com/tokiwa16448392)

[note](https://note.com/izumo092)
MacOS Big SurでRのコンパイルエラー解決に役立つリンク

もうすぐ次のバージョンが出るので需要は不明だがメモ書き．

"r complier big sur"でググっていろいろ試して挙げ句，先人の導きにたどり着く↓

http://yiqingxu.org/public/BigSurError.pdf

Step 3: GNU gfortranをインストールする
Step 4: パスを通す
Step 5: Rが正しいコンパイラを使うようにMakevarsを書き換える

新しいバージョンのRとライブラリのインストールが上手く行かず，途中で過去にインストールしたバージョンに戻したかったので，以下のサイトを参考にした．

https://support.rstudio.com/hc/en-us/articles/200486138-Changing-R-versions-for-the-RStudio-Desktop-IDE

https://stackoverflow.com/questions/56481250/how-to-use-ln-s-to-change-between-r-versions-on-mac
microk8s拡張機能はIBM Cloud Kubernetes Serviceの何に該当するの？

## microk8sって便利ですよね
kubernetesを勉強したい！とまず環境を選ぶ際に、
minikubeやk3sなどを比較しつつ、ubuntuで簡単にインストールできるmicrok8sで実験・学習することが増えてきました。

minikubeは仮想マシンイメージでの公開のため、マシンスペックが必要であったりします。
microk8sは比較的スペックの低いVPCや古いNotePCにUbuntu20を入れて導入することができます。

## microk8s add-onとは
拡張機能としてセットアップの簡略化を目指して準備されているコマンド群です。

[microk8s addons](https://microk8s.io/docs/addons#heading--list)から一覧を作成し、IBM Cloud Kubernetes Serviceにこの拡張機能を持って行った場合どのような機能にあてはまるのかを比較検討しました。
個人的な知見によりあてはめているため、誤りがある場合があります。もし見つけたらコメントいただけるとありがたいです。

きっかけ：　これってマネージドクラウドに持っていくと変わるものや代替ってある？

N/Aのものは未調査などで対応できていないものです。
分類は便宜上カテゴリ分けしたもので、内部の順番は順不同です。

## 基本機能
|microk8s add-on name|on IBMCloud|詳細|
|:--|:--|:--|
|dns|dns| CoreDNS。microk8sでは他add-onからも必須とされる。|
|rbac|rbac enabled| Role Based Access Control の有効化|
|registry|IBM Cloud Container Registry| プライベートレジストリの作成|
|storage|IBM Cloud File Storage|ローカルストレージにPVC要求のみでPVを自動生成・割り当てが可能|

## HW依存
|microk8s add-on name|on IBMCloud|詳細|
|:--|:--|:--|
|gpu|BareMetalServer GPU| ローカルのnvidia GPUをサポート。|
|inaccel|N/A|FPGA管理ソリューション InAccel|

## Network/LoadBalance/API
|microk8s add-on name|on IBMCloud|詳細|
|:--|:--|:--|
|cilium|N/A|Deploys Cilium to support Kubernetes network policies using eBPF.|
|ambassador|istio|API Gatewayとして機能するものでIstioと並んで選択しとして使われるプロダクト|
|ingress|ingress| A simple ingress controller for external access.|
|istio|istio| Adds the core Istio services (not available on arm64 arch).|
|kata|N/A| OCI準拠のイメージでVMを起動することができる機能|
|keda|keda support|イベント稼働型Podオーケストレータ|
|linkerd|N/A|Service Mesh Product linkerd|
|metallb|k8s loadbalancer| MetalLB Loadbalancer|
|multus|N/A| Podに追加NICを接続し複数ネットワークに接続するためのCNIプラグイン|

## dashboard
|microk8s add-on name|on IBMCloud|詳細|
|:--|:--|:--|
|dashboard|dashboard enabled|Kubernetes Dashboard|
|portainer|portainer support| コンテナ管理用ダッシュボード|

## logging/monitoring
|microk8s add-on name|on IBMCloud|詳細|
|:--|:--|:--|
|fluentd|LogDNA| Elasticsearch-Fluentd-KibanaのEFKスタックを導入。IBM CloudではLogDNA|
|metrics-server|metics-server support by helm chart| MetricsAPIによる可視化|
|prometheus|prometheus support| Prometheus　監視の有効化|

## operator
|microk8s add-on name|on IBMCloud|詳細|
|:--|:--|:--|
|helm|Helmカタログ|HELMサポート|
|helm3|Helmカタログ|HELM3サポート|
|knative|knative support|knative|
|kubeflow|kubeflowo support| Kubeflow operators.|
|jaeger|N/A| 分散トレーシング環境のオペレーター|
|juju|N/A| jujuコマンドによるデプロイ|

## その他
|microk8s add-on name|on IBMCloud|詳細|
|:--|:--|:--|
|host-access|N/A| Provides a fixed IP for access to the host’s services.|
|openfaas|IBM Cloud Functions| Serverless Framework|
|openebs|N/A(IBM Cloud BlockStorage)|コンテナ向けにEBSを作るプラグイン|
|traefik|N/A| 未調査|

## この表を作ってみてわかったこと
microk8sでadd-onをすることで便利なのは、インストールが簡略化されて楽であるということ。
IBM Cloudではそれぞれのプロダクトで公開されている手順に則って導入することで利用が可能であること。

## IBM Cloud Kubernetes Serviceで利用できる機能の注意点
FileStorageや、Ingress/Istioなどは有償クラスタでのみ利用が可能となります。
macOS  Swift シンプルカレンダー

1ヶ月カレンダーを表示する。月曜始まり日曜終わりで週数は5週または6週となる。月初は前月の月末日で埋め、月末は翌月の月初日で埋める。月の移動ボタン（< 印）のクリックにより、翌月または前月のカレンダーを表示する。キーボードの矢印キーにより日付を移動する。土曜日曜および祝日は日付の色を変える。祝日の情報は休日ファイルを作成して管理する。

ユーザが、ウィンドウをマウスのドラッグにより拡大・縮小した場合、それに合わせてカレンダーのビューのサイズも変更する。

macOS Mojava 10.14.6 / Xcode 11.3.1 / Swift 5.0

<img src="http://mikomokaru.sakura.ne.jp/data/B64/calendar.png" alt="calendar" title="calendar" width="300">

#### クラス構造図
<img class="lm100 tm20 bm0" src="http://mikomokaru.sakura.ne.jp/data/B64/calendar2.png" alt="[クラス構造図]" width="500">


https://github.com/mikomokaru-jpn/macOS_S_FlexibleCalendar
【Salesforce】apex:repeatの中にapex:repeatを入れてみた。

# 動作確認

下記のように表示できました。

![スクリーンショット 2021-10-22 173841.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/8bef4fee-066e-078d-399b-fb096efa5b79.jpeg)

# 実現方法

```Apex:test.cls

public List<List<String>> testList {get; private set;}

this.testList = new List<List<String>>();
List<String> tList = new List<String>();
tList.add('A');
tList.add('B');
tList.add('C');
this.testList.add(tList);
this.testList.add(tList);
this.testList.add(tList);
this.testList.add(tList);
this.testList.add(tList);

```

```html:test.page

<apex:repeat value="{!testList}" var="tList">
    <!-- var="tList"をvalueに設定する -->
    <apex:repeat value="{!tList}" var="tObj">
        <span>{!tObj}</span>
    </apex:repeat>
</apex:repeat>

```

# 案

PDF→20件ずつデータを表示→印刷とかに使えそうですね。
助かった・・・

# 参考リンク

[apex:repeat | Visualforce 開発者ガイド | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.232.0.pages.meta/pages/pages_compref_repeat.htm)
【win32metadata / CsWin32】ANSI版 Win32APIの定義が生成されないことの解決策


# 予備知識

## 「win32metadata」とは
Win32API を手軽に呼び出すためのメタデータ（？）らしい。

https://github.com/microsoft/win32metadata

## 「CsWin32」とは

前述の「win32metadata」を使い、C# 用に、Win32API 関係の定義を自動で生成してくれるソースジェネレーター。

（プロジェクト直下に「NativeMethods.txt」というファイルを作成し、その中に改行区切りで Win32API の名前を書くだけで、定義が自動で生成される）

https://github.com/microsoft/CsWin32


# 本題

## 問題
NativeMethods.txt に Win32API の名前を書いていたところ、なぜか ANSI 版の Win32API（末尾に"A"が付くやつ）だけ、定義が生成されないことに気づいた。

```NativeMethods.txt
// 生成される
SendMessage
SendMessageW

// 生成されない...
SendMessageA
```

## 解決策
プロジェクト直下に「NativeMethods.json」（CsWin32 が生成するコードを設定するためのファイル）を作成し、下のように記述する。

```NativeMethods.json
{
  "$schema": "https://aka.ms/CsWin32.schema.json",
  "wideCharOnly": false
}
```

どうやら、デフォルトで `wideCharOnliy`（UTF-16 版の Win32API のみ生成）が `true` らしく、ANSI 版の Win32API が生成されなかったみたい。

### 副作用
NativeMethods.txt に末尾 A / W を省略して書いた場合、省略した名前ではなく、UTF-16 版（末尾にWが付く）の名前で定義されるようになる。

例えば、下のように書いた場合、従来ではそのまま「SendMessage」と定義されるが、「SendMessageW」と定義されるようになる。

```NativeMethods.txt
SendMessage
```

※ 当たり前だが、そもそも ANSI 版・ UTF-16 版がない Win32API に影響はない
AWS Outposts とは

## 勉強前イメージ

サービス名から内容があまりわからない・・・

## 調査

### AWS Outposts とは

ローカル環境でのデータ処理や移行、低レイテンシーを維持したいという目的で
専用のハードウェア一式をオンプレの環境に設置して、オンプレにAZが増えたイメージで扱うサービスになります。
AWSのオンプレミス版のイメージの製品になります。
AWS Outpostsを注文すると以下のものがラックに組み立てられてが輸送・搬入されるようです。
- 42Uのラック
- パッチパネル
- サーバホスト
- ネットワークSW
- 電源一式を

画像は [こちら](https://aws.amazon.com/jp/blogs/news/aws-outposts-now-available-order-your-racks-today/) をごらんください
日本でも注文は出来ます！

また、outpostsを利用するには [エンタープライズサポートプラン](https://qiita.com/miyuki_samitani/items/123025b8a3e05354c5e2) に入る必要があります。


### AWS Outposts のメリット

- 自社DCでAWSサービスを使用できる

OutpostsはAWSから送られてきた物理サーバを使ったサービスで
設置から運用・管理までフルマネージドのサービスになります。
AWSサービスを自社のDCで実行できます。

例えば以下のようなサービスを自社のDCで使用することができます。
・ EC2
・ EBS
・ s3
・ EMR

- オンプレとクラウドで一貫して使用できる

Outpostsのメリットは自社DCという独自性を保ちながら
サーバ・ラック、その他ネットワーク機器の保守等はAWSが行うため、実質クラウドと変わらない環境で利用できます。

## 勉強後イメージ

AWSサービスを利用したいけど、
色々制限があって自社内に閉じたところしかだめ！みたいなところだったらすごいいいと思う
エンタープライズ入らないといけないってことはお金が結構掛かりそう

## 参考

- [AWS Outposts](https://aws.amazon.com/jp/outposts/)
- [AWS Outpostsとは？ハードウェアでAWS機能を利用できる](https://www.skyarch.net/column/aws-outposts/)
- [AWS Outpostsをあらゆる場所に！1U、2UサイズのOutpostsが登場します #reinvent](https://dev.classmethod.jp/articles/aws-outposts-1u-2u-form-factors-announce/)
Ubuntu 20.04でVirtualenvwrapperを使ってVirtualenvをセットアップする方法


この記事では、pip3（pip for Python 3）を使ってvirtualenvwrapperをセットアップする方法を紹介します。

このチュートリアルを成功させるには、Ubuntu 20.04がインストールされたコンピュータと、インターネット接続が必要です。また、ターミナルとnanoエディタについての知識があると便利です。システムのアップデートやアップグレードは済ませているものとします。

#仮想環境のセットアップ
ホームディレクトリで、右クリックして「ターミナルで開く」を選択し、ターミナルを開きます。また、キーボードのCTRL、ALT、Tキーを同時に押すと、ターミナルアプリケーションが自動的に開きます。

まず、すべての仮想環境を格納するための特別なディレクトリを作成する必要があります。virtualenv」という新しい隠しディレクトリの作成を進めます。

```
mkdir .virtualenv
```
次に、Python3用のpipをインストールします。

```
sudo apt install python3-pip
```
pip3のインストールを確認します。

```
pip3 --version
```
virtualenvをpip3でインストールします。

```
pip3 install virtualenv
```
virtualenvがどこにインストールされたかは、次のように入力します。

```
which virtualenv
```
virtualenvwrapperをpip3でインストールします。

```
pip3 install virtualenvwrapper
```
これから .bashrc ファイルを修正して、すべての新しい仮想環境が Python 3 を使用するように調整する行を追加します。仮想環境には上で作成したディレクトリ（.virtualenv）を指定し、virtualenvとvirtualenvwrapperの場所も指定します。

では、nanoエディタで.bashrcファイルを開いてみましょう。

```
nano .bashrc
```
nanoエディタをまだ使ったことがない、あるいはコンピュータにインストールしていない場合は、今すぐインストールしてください。nanoは Linux のエディタとして広く使われていますが、それには理由があります。

sudo apt install nano
nano をインストールしたら、ターミナルで nano .bashrc コマンドを入力して、.bashrc ファイルを開きます。.bashrc ファイルの一番下に移動し、以下の行を追加します。

#Virtualenvwrapperの設定。

```
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
export VIRTUALENVWRAPPER_VIRTUALENV_ARGS=' -p /usr/bin/python3 '
export PROJECT_HOME=$HOME/Devel
source /usr/local/bin/virtualenvwrapper.sh
```

完了したら、ctrl-oキーを押します。次に「yes」と入力してエンターキーを押します。このコマンドはnanoエディタを保存します。ctrl-xを押して終了したらターミナルを閉じて、再度開いてください。

Python3で仮想環境を作成し、すぐに有効にするには、ターミナルで次のコマンドを使います。

```
mkvirtualenv name_of_your_env
```
この環境がPython3用に設定されていることを確認してください。

```
Python -V
```
環境を無効にするにはdeactivateコマンドを使用します。

```
deactivate
```
利用可能なすべての仮想環境をリストアップするには、ターミナルで workon または lsvirtualenv コマンドを使用します（workon と同じ結果になりますが、格好良く表示されます）。

```
workon
lsvirtualenv
```
特定の環境をアクティブにするには、workon + 環境の名前を入力します。

```
workon name_of_your_env
```
この他にも便利なコマンドがいくつかありますので、いつか使ってみてください。

Rmvirtualenv は .virtualenv ディレクトリにある特定の仮想環境を削除します。

```
rmvirtualenv name_of_your_env
```
Cpvirtualenv」は既存の仮想環境を新しい仮想環境にコピーして起動します。

```
cpvirtualenv old_virtual_env new_virtual_env
```

#エイリアスの登録
.bashrcファイルにエイリアスを登録することによって、毎回起動時に面倒な仮想環境に起動やディレクトリの移動などを簡単にすることができます。

```
nano .bashrc
```
で、ファイルを開き、以下のエイリアスを挿入する。

```
alias your_aliasname='workon name_of_your_env;cd /name_of_your_directory'
```

次回、ターミナル起動時に、

```
your_aliasname
```
を入力するだけで、name_of_your_envが起動し、name_of_your_directoryに移動してくれます。

お疲れ様でした。これで最初の孤立したPython 3環境ができあがりました。
GitHubリポジトリごとに別のssh鍵を使う

# 概要

「ビルドを自動化したい」といった理由のため、ひとつの端末で、複数のgithubアカウントを使いたいことがあります。その場合、githubに対して複数のssh鍵でアクセスすることになります。その設定方法について説明します。
ここではUNIX系端末(macOS含む)での利用を前提とします。

# なぜ複数のssh鍵が必要なのか

githubにssh経由でアクセスするには、githubに対し事前に自分のssh公開鍵を設定しておく必要があります。
普段とは別の、もうひとつのgithubアカウントでssh経由でアクセスする場合も、githubに対し、事前に自分の別のssh公開鍵を設定しておく必要があります。なぜなら、他のgithubアカウントに既に設定されているssh公開鍵は、別のアカウントへの設定であろうとも、もはやgithubには登録できないからです。言い換えれば、githubに登録するssh公開鍵は、githubの全ユーザに対しユニークな必要があります。

# 別のssh鍵を作る

というわけで、普段づかいとは別のssh鍵を作りましょう。
以下、`hogeなんたら`と書かれている部分は、あなたが扱おうとしているプロジェクトの名称などに適宜読み替えてください。

 - 鍵の暗号アルゴリズムはed25519を使いましょう。早くて強いです。ただし(後述)
 - 何のため作った鍵なのか後でわかるよう、きちんとコメントを付けましょう。
 - 既存の鍵とは別のファイル名も指定します。
 - パスフレーズはなし(空文字列)でok

```sh
ssh-keygen -t ed25519 -C 'ssh key for hogeproj' -f hogeproj-key-ed25519 -N ''
```

ただし、iOSアプリの開発などで、Xcodeに含まれているgit機能も使いたい場合は要注意。バージョン13.3以前のXcodeはed25519鍵に対応していません([リリースノート](https://developer.apple.com/documentation/Xcode-Release-Notes/xcode-13_3-release-notes))。開発上の都合で13.3以前のXcodeを使う必要があり、さらにXcodeのメニューからgitを使いたい場合は、残念ながらRSA暗号を使いましょう。ビット数はせめて4096にしておきます。

```sh
ssh-keygen -t rsa -b 4096 -C 'ssh key for hogeproj' -f hogeproj-key-rsa4096 -N ''
```

私は、Xcodeメニューのgit機能は使わず、shellから単体のオリジナルのgitコマンドのほうを使うことにしたので、ed25519鍵のほうで進めます。

これで、`~/.ssh`の中に、ssh秘密鍵`hogeproj-key-ed25519`とssh公開鍵`hogeproj-key-ed25519.pub`が作られました。
念のため、`~/.ssh`自体はパーミッション700, `hogeproj-key-ed25519`はパーミッション600, `hogeproj-key-ed25519.pub`はパーミッション644になっていることも確認しておきましょう。
これらのファイルは、安全なところにバックアップもしておきましょう。私は1passwordの保管庫に入れました。

# githubにssh公開鍵をセットする

github.comに、もう一つのアカウントのほうでログインしておき、[SSH and GPG keys](https://github.com/settings/keys)にアクセスし、SSH keysのセクションで、`New SSH Key`をクリックします。
Titleには、何のための鍵なのかの説明を記入。上の例にならうと`ssh key for hogeproj`など。
Keyには、ssh公開鍵の「中身」をそのままペーストします。
`Add SSH Key`をクリックして登録します。
登録しようとする内容はgithubがわもきちんとチェックしてくれますし、おかしい場合はエラーを返してくれますので、うまくいかなかった場合はエラー内容をきちんと読みましょう。

# ~/.ssh/configを設定

git cloneするとき、使うssh鍵もオプション指定できたなら、本当は便利なのです。たとえば`git clone -i ~/.ssh/hogeproj-key-ed25519 git@github.com:hogerepos/hogesrc.git`といった感じに。
でも残念ながら、gitコマンド自体には、複数のssh鍵を使い分けるための機能はありません。
いま実行するこのgitではsshオプションはこうしてほしい、といった指定を、環境変数やオプションで与えることはできるのですが、これはあくまでも一時的な指定です。後日またここでgit pullなどするときには、もうその指定は効きません。「こんなリポジトリないぜ? 何いってんの?」といった感じのエラーになってしまいます。

ではどうするか。~/.ssh/configに、「このホストにsshするときはこの鍵を使う」という指定を入れる方法がいちばんましです。~/.ssh/configをエディタで開き、以下を追記します。

```
Host hogeremote
  Hostname github.com
  User git
  IdentityFile ~/.ssh/hogeproj-key-ed25519
```

これで、hogeremoteという(仮想的な)ホストにsshする場合は、本当にsshアクセスすべきホストはgithub.comで、sshユーザはgitで、秘密鍵は~/.ssh/hogeproj-key-ed25519を使うんだよ、というルールを定義できました。

## git cloneする

git cloneしてみましょう。github.comの対象リポジトリにアクセスし、SSHを用いたclone urlを入手します。
clone urlは、通常`git@github.com:hogerepos/hogesrc.git` といった書式になっています。
この`github.com`の部分を、さきほど`~/.ssh/config`で定義した、仮想的なホスト`hogeremote`に置き換えます。cloneしてみましょう。

```sh
git clone git@hogeremote:hogerepos/hogesrc.git
```

こうしてcloneしたフォルダの中では、今後は、普通にgitコマンドを使うだけで、専用githubアカウントと専用ssh鍵が自動的に使われます。専用githubアカウントと専用ssh鍵を使っていることすら忘れてしまえます。
OpenAPI 3.0 の使い方 (POST 引数付き）

##仕様を記述##
>POST で http://localhost:8080/hello に引数を与えてアクセスするとリスポンスがある。

```yaml:post_hello.yaml
openapi: 3.0.2
info:
  description: ユーザ名を与えると挨拶を返してくれるAPI
  version: 1.0.0
  title: POST Hello
tags:
  - name: post_hello
    description: ユーザに挨拶を返すAPI
paths:
  /hello:
    post:
      tags:
        - hello
      description: ユーザに挨拶する。
      parameters: []
      requestBody:
        description: user to create
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/User'
            example:
              id: 362
              name: Richard Roe
      responses:
        "200":
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  HelloUser:
                    type: string
                    example: Hello, userName
        "400":
          description: Bad Request
        "500":
          description: Internal Server Error
components:
  schemas:
    User:
      type: object
      required:
        - id
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
```

https://editor.swagger.io/ でバリデート
![post_hello_aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/35e65b4c-0df7-c9e7-adcb-579a8aaf2f75.png)

##Flask のサーバーを作成##

Generate Server -> python-flask

python-flask-server-generated.zip が出来る

解凍

```bash
unzip python-flask-server-generated.zip
```

ライブラリーのインストール

```bash
pip3 install -r requirements.txt
```

コードの修正

```py:swagger_server/controllers/hello_controller.py
（省略）
#    return 'do some magic!'
    return 'Hello! ' + str(body.id) + ' ' + body.name
```

サーバー実行

```bash
python3 -m swagger_server
```

クライアントでアクセス

```text
$ http POST http://0.0.0.0:8080/hello < in01.json
HTTP/1.0 200 OK
Content-Length: 19
Content-Type: application/json
Date: Fri, 22 Oct 2021 08:15:44 GMT
Server: Werkzeug/1.0.1 Python/3.9.7

"Hello! 567 Scott"

```

```json:in01.json
{
"id": 567,
"name": "Scott"
}
```
【Ruby】class << selfとは

##class << selfとは
特異クラス定義式のこと。
クラスメソッドはクラスインスタンスに属する特異メソッドですが、上記の形式でのクラスメソッドの定義は「<<」の後ろにクラスインスタンスを指定し、その「クラスインスタンスの特異クラスを定義している」とみることができる。
https://www.school.ctc-g.co.jp/columns/nakagoshi/nakagoshi12.html

クラスメソッドを定義するときに全てのクラスメソッドに```self.```をつけるのが手間なときに特異クラスを使うと便利。

```foo.rb
class Foo < ApplicationRecord
  class << self
    def bar
      puts 'bar'
    end
  end
end
```

```foo.rb
class Foo < ApplicationRecord
  def self.bar
    puts 'bar'
  end
end
```

上2つのコードは同じ意味になる。


##参考

https://docs.ruby-lang.org/ja/latest/doc/spec=2fdef.html#singleton_class


より詳しい特異クラスと特異メソッドの説明は下記参考

https://qiita.com/TomoProg/items/23027a866beac66a40c6
機械学習でよく使われる数学記号(1) 

#1 はじめに
機械学習、ディープラーニング関連の論文を読む時に、出てくる数式を理解するため、理解しておくべき数学記号を整理しました。





#2. 代数 (Algebra)

##2.1 総和(Summation)

###記号＆例題
```math
\sum_{k=1}^{n} x^k
```
###例題の意味
```math
x^1 +x^2+ ... +x^n 


```

:::note info
要するに足し算です。
:::




##2.2 総積(Production)

###記号＆例題
```math
\prod_{k=1}^{n} x^k
```
###例題の意味
```math
x^1 \times x^2\times  ... \times x^n 
```

:::note info
要するに掛け算です。少し息が上がりました。
:::

##2.3 関数値が最大になる元(argument)

###記号＆例題
```math
\arg\max_{x\in X}f(x)
```
###例題の意味
```math
f(x)を最大にするようなx
```

:::note info
プログラミング用語かと思ったら、ちゃっと数学記号でした。
:::


##2.4 関数値が最小になる元(argument)

###記号＆例題
```math
\arg\min_{x\in X} f(x)
```
###例題の意味
```math
f(x)を最小にするようなx
```

:::note info
プログラミング用語かと思ったら、ちゃっと数学記号でした。（小梅太夫の声で）
:::

#3. 線形代数 (Linear Algebra)

##3.1 ノルム(Norm)

###記号＆例題
```math
\begin{Vmatrix}
(3,4)
\end{Vmatrix}
```
###例題の意味
```math
\sqrt{3^2+4^2}
```

:::note info
ベクトルの長さor距離
:::


##3.2 写像(mapping)

###記号＆例題
```math
f:x \Longrightarrow y
```
###例題の意味
```math
y = f(x)
```

:::note info
xからｙへの対応付ける
:::


##3.3 合成写像(composite function, composite)

###記号＆例題
```math
f \circ g
```
###例題の意味
```math
y = f(g(x))
```

:::note warn
順番に注意
:::




#4. 論理演算 (Logical Operation)

##4.1 論理和(Logical OR)
###記号＆例題
```math
A \vee  B
```
###例題の意味
AまたはB

:::note info
OR
:::

##4.2 論理積(Logical AND)
###記号＆例題

```math
A \wedge B
```
###例題の意味
AかつB

:::note info
AND
:::

##4.3 論理包含/条件
###記号＆例題
```math
A \Rightarrow  B \\
A \rightarrow  B
```
###例題の意味
AならばB

:::note info
if文より「断言」のニュアンスが強い。
:::



##4.4 全称記号
###記号＆例題
```math
\forall x (x<0)
```
###例題の意味
すべての　x　は、0より小さい

:::note info
for Allと読む。
:::

##4.5 存在記号
###記号＆例題
```math
\exists x (x<0)
```
###例題の意味
0より小さい　xが存在する。

:::note info
Existsと読む。Eをひっくり返した表記
:::



#5. 数の記号 

##5.1 実数
###記号＆例題
```math
\mathbb{R} 
```


##5.2 有理数
###記号＆例題
```math
\mathbb{Q} 
```

:::note info
英語で商を意味するQuotinentの頭文字
:::

##5.3 整数
###記号＆例題
```math
\mathbb{Z} 
```
:::note info
ドイツ語で数を意味するZahlenの頭文字
:::



##5.4 自然数
###記号＆例題
```math
\mathbb{N} 
```
:::note info
Natural Numberの頭文字
:::



#参考資料
http://www27.cs.kobe-u.ac.jp/~masa-n/misc/cmc/j-kiso2001/iabasic/jlshort/node34.html
https://qiita.com/PlanetMeron/items/63ac58898541cbe81ada#%E5%9B%9B%E5%89%87%E6%BC%94%E7%AE%97
https://qiita.com/Qiita/items/c686397e4a0f4f11683d#emphasis---%E5%BC%B7%E8%AA%BF%E5%BC%B7%E5%8B%A2
WinActor_繰り返しのプロパティ(データ数)

###今更ながら…###
皆さんはWinActorの繰り返しのプロパティに何を使っていますか？
作成するシナリオ次第ですが、私は条件式や回数を使うことが多いです。
何気に繰り返しのプロパティを見てると「データ数」という項目があるのを見つけました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127851/4b4b7fe7-b2e2-bded-a411-8e83acaf4e7d.png)
調べてみると便利そうだったので、少し紹介したいと思います。


###繰り返しのプロパティ(データ数)の説明###
繰り返しのプロパティ「データ数」に
1行目がヘッダー行、2行目以降がデータ行で構成された
ExcelファイルまたはCSVファイルのパスを指定すると
設定されたファイルのデータ行を読み取って繰り返し処理を行う。
読み取ったデータ行の項目はヘッダー行と同じ名前の変数に格納される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127851/a50951ee-f870-eb5e-a6d6-fd89ed1f21f4.png)


###実際に動かしてみた###
今回のシナリオは繰り返しのプロパティにデータ数でExcelファイルパスを指定し、
読み取った結果を待機ボックスで出力するというものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127851/a4d2ae0f-ed20-7f32-92c2-57b3a2e8fc6f.png)
以下、実行結果です。
ループ1回目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127851/d3cc1851-11ff-833c-912b-0fc14ccfc8c7.png)
ループ2回目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127851/ace00fac-0b7c-1bd7-18c5-711e9b319ac1.png)
途中割愛
ループ30回目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127851/0aa5f711-6b26-112e-44c3-0e5d764f61c1.png)
最後の行まで読み取ることができました。


###使ってみて###
1行目がヘッダー行になっているExcelファイルやCSVファイルを
1行ずつ処理するのであれば変数へのデータ読み込み(事前に変数の作成が必要)と
繰り返しを同時に行ってくれるので便利に感じました。
AWS CLI v2 を使って指定したプロファイルの ECR にログインするためのスクリプト

# はじめに

AWS プロファイルを指定するだけでさくっと ECR ログインを実現する手段が欲しかったのでスクリプトを用意した。

# 背景

AWS CLI で ECR ログインする際に利用されていた `get-login` は AWS CLI v1 では非推奨、AWS CLI v2 ではそもそもコマンド自体が使えなくなっている。代わりに `aws ecr get-login-password` を利用するようにとのこと。

で、`get-login-password` を利用して ECR ログインするコマンドを素直に書くと以下のようになる。

```bash
$ aws ecr get-login-password | docker login --username AWS --password-stdin <registry url>
```

しかし `<registry url>` が厄介で、デフォルトのプライベートレジストリ URL は `https://<aws_account_id>.dkr.ecr.<region>.amazonaws.com` である。
そう、AWS プロファイルが複数あってログイン先を必要に応じて切り替えたいとき、レジストリ URL はプロファイル毎に基本違うわけで `aws ecr` の方だけ `--profile <profile>` オプションを指定しても意味がない。

# 対応方法

`aws sts` コマンドでアカウントIDを取得できるので、これを組み合わせて以下のような簡単なスクリプトを用意した。

```bash:ecr-login.sh
#!/bin/bash
set -eu
readonly aws_profile=$1
readonly aws_account_id=`aws sts get-caller-identity --profile=${aws_profile} | awk ' $1 == "\"Account\":" { gsub(/\",*/, ""); print $2 } '`
aws ecr get-login-password --profile ${aws_profile} | docker login --username AWS --password-stdin https://${aws_account_id}.dkr.ecr.ap-northeast-1.amazonaws.com
```

これで

```bash
$ ./ecr-login.sh <aws_profile_name>
```

とかを実行すればプロファイル指定で ECR ログインできるようになる。function 化して .rc に書くのもよいかもしれない。
データ分析、前処理、モデル構築・適用

# この記事の狙い・目的
機械学習を取り入れたAIシステムの構築は、
①データ分析→ ②データセット作成（前処理）→ ③モデルの構築・適用
というプロセスで行っていきます。
このブログでは、①②③の全工程ついて解説していきます。

# プログラムの実行環境
Python3
MacBook pro（端末）
PyCharm（IDE）
Jupyter Notebook（Chrome）
Google スライド（Chrome）

# データ分析
Kaggleのボストンの住宅価格予測のデータセットを用いてデータ分析を行なった全手順を解説しています。
##
https://qiita.com/tk-tatsuro/items/561e9fc657422e05f0f7
##

# 前処理（特徴量エンジニアリング）
前処理の各手順を解説しています。
クレンジングなどのデータ整備は割愛させていただきます。
##
https://qiita.com/tk-tatsuro/items/793bc3ec181e30803157
##

# モデルの構築・適用
モデルの構築、パラメータ・チューニング、アンサンブル学習までを解説しています。
##
https://qiita.com/tk-tatsuro/items/ec8c1a36582d4bec7924
##

# まとめ
①データ分析→ ②データセット作成（前処理）→ ③モデルの構築・適用、までを通して行なってきました。
これまで２値分類問題として解くことが多かったため、今回は回帰問題で解いてみることにしました。
実際に色々な手法を試して精度検証を行って見て、やはりアルゴリズムごとに向き不向きがあり、その使い分けを今回学ぶことができました。次はまた別のデータを用いて分析から前処理、モデリングまでを行なって見たいと思います。

# 最後に
他の記事はこちらでまとめています。是非ご参照ください。
##
https://qiita.com/tk-tatsuro/items/f27c012e0cb95a5f51d2
##

# 解析結果
[実装結果：GitHub/boston_regression](https://github.com/tk-tatsuro/data_science/tree/master/20211018_boston_regression)
[データセット：Boston House Prices-Advanced Regression Techniques](https://www.kaggle.com/fedesoriano/the-boston-houseprice-data)

# 参考資料
##
https://www.amazon.co.jp/%E3%83%87%E3%83%BC%E3%82%BF%E8%A7%A3%E6%9E%90%E3%81%AE%E5%AE%9F%E5%8B%99%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E5%85%A5%E9%96%80-%E3%81%82%E3%82%93%E3%81%A1%E3%81%B9/dp/4627817711
##
##
https://www.oreilly.co.jp/books/9784873118680/
##
##
https://www.amazon.co.jp/Kaggle%E3%81%A7%E5%8B%9D%E3%81%A4%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E6%8A%80%E8%A1%93-%E9%96%80%E8%84%87-%E5%A4%A7%E8%BC%94/dp/4297108437
##
bashの変数の展開がいつ行われるのか? あれ、代入済みなのに反映されない?

# bashの変数の展開がいつ行われるのか? あれ、代入済みなのに反映されない?

bashの変数の展開やコマンドの実行の順番の解釈の理解になれば幸いです。

# 遭遇した問題

```bash
$ TEST_A=abc echo $TEST_A
```

果たして、これは何が出力されるでしょうか？もともと`TEST_A`という変数は未定義だったとします。

答え:

```bash
$ TEST_A=abc echo $TEST_A
```
(何も出力されない)

あれ？abcじゃないの？と数人で混乱していました。

# なにが起こっていたか

bashのparserが先に変数`TEST_A`を展開するため、`TEST_A=abc`とは関係なく。何も出力されていませんでした。

そもそもシェルで変数が展開されたあとにコマンドが頭から順番に実行されるため、実質的に

```bash
$ TEST_A=abc echo 
```

をしていたわけですね。したがって

```bash
$ TEST_B=hoge
$ TEST_B=abc echo $TEST_B
```
の場合には`hoge`が出力されるわけですが、実質的には

```bash
$ TEST_B=hoge
$ TEST_B=abc echo hoge
```
を実行していたわけです。

# 確認問題
## 問題

test.pyを以下の内容で作成します(Python3.6以上)。

```python
import os
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--arg')
args = parser.parse_args()
print(f"{args.arg} {os.environ['TEST_A']}")
```

このとき、以下を実行するとなにが実行されるでしょうか？

```bash
$ TEST_A=foo
$ TEST_A=bar python test.py --arg=$TEST_A
```

## 答え

<details><summary>答えを開く</summary><div>

```bash
$ TEST_A=bar python test.py $TEST_A
foo bar
```
</div></details>

## 解説

`arg=$TEST_A`のほうの`$TEST_A`は`TEST_A=bar`が実行される前にこの1行がすべて展開されるので`foo`になっています。一方、`os.environ['TEST_A']`のほうの`TEST_A`は、このコマンドが冒頭から実行されるため`TEST_A=bar`が実行されているために、Pythonが実行されるときには`bar`に書き換わっています。この1行を展開されるときには当然test.pyの内容は展開されていないためにこのようなことが起きているようです。

# 参考

- [How does one properly assign temporary Bash variables on a per-command basis?](https://stackoverflow.com/questions/55912074/how-does-one-properly-assign-temporary-bash-variables-on-a-per-command-basis#:~:text=the[…]20echo%20bar
https://www.gnu.org/software/bash/manual/bash.html#:~:text=%5D-,3.7.1%20Simple%20Command%20Expansion,-When%20a%20simple)
Qiitaにマークダウン方式でデータフレームを載せたい

#Qiitaにマークダウン方式でPythonのデータフレームを載せたい
まずJupiter notebookのセルに以下を打ち込み必要なモジュールである**tabulate**をインストールする。

```.py
!pip install pytablewriter
```
あとはマークダウン化したいデータフレーム(df)に対して以下を実行する。

```.py
import pytablewriter

writer = pytablewriter.MarkdownTableWriter()
writer.from_dataframe(df)
writer.write_table()
```
普通のプログラマがUnreal Engine 4を業務で使うことになった話

半年ぶりの記事投稿になりましたsyntanです。
UE4とせっかく出会ったのでQiita記事を書きたいなあと思いつつ、まだあまり触れていないので、出会った時の話を書いてみました。

# 経緯
とあるイベント案件にて、「プロジェクターで会場のスクリーンに、リアルタイムで点数表示したいなー」（※売り上げ数を東西対決する感じのイベントでした）という要望があり。特に何を使うという指示がなく、せっかくだから何かフリーで使えるゲームエンジンで作ろう。という流れで、オープンソース系のゲームエンジンなどと検討した結果、Unreal Engine 4に行きつきました。

元々私がUnityをVRM関係で触っていたのでとっつきやすかったのと、ライセンスの取り回しが良くて選択されました。ちなみにUnityはライセンス的に使いづらかったので、候補に上がりませんでした…。

猶予は1か月程度…間に合うのか…。

# 要件
* データが蓄積されたサーバーへ数秒毎にリクエストを送って点数を取得、画面に表示できること。
* 二部構成のイベントのため、それぞれリクエストパラメータを変更できること
* いい感じの見た目

# 最初に勉強だ！
UE4というより、ゲームエンジン自体初心者だったため、前半2週間程度は勉強期間となりました。公式のビデオチュートリアルがわかりやすくていい感じでしたね。音声は英語ですが日本語字幕がついていました。
しかし、UE4のUIが英語版なため、説明されている機能を探し出すのがちょっとだけ大変でしたね。

# 実装するぞ！
* GUIにリクエストパラメータの変更のためのドロップボックス、点数表示のためのテキストオブジェクトを配置
* 通信、点数表示変更、リクエストパラメータ変更ためのロジックを実装
* 画面のデザインとして、背景は写真、装飾にちょっとしたアニメーション、イベントキャラクターの配置

を行いました。UE4のブループリントを使用した実装のため、ノンコードプログラミングでした。blender経験者的には、マテリアルのノード設定画面みたいだなーという感じでした。
ノンコードプログラミングは私としてはこれが初体験となりました。ビジュアル的にぱっと説明できるのは一見簡単そうですが、参考サイトからコードをコピペできる利便性は落ちてしまうんだなあとも思いました。

# MacPC問題
最初は通信のために `MQTT` の [BP MQTT](https://www.unrealengine.com/marketplace/ja/product/bp-mqtt)を使おうとしていましたが、実行環境がMacPCだったため使うことができず `TCP` の [TCP Socket Plugin](https://www.unrealengine.com/marketplace/ja/product/tcp-socket-plugin)を使うことになりました。

そのほかにもMacPCのUE4はフリーズしやすかったり、UE4上で実行できるけどビルドすることができなかったり、あまりお勧めできない環境だなあと思いました。
※最終的に、「実行は持ち込みPCでこちらのスタッフが行うからUE4から実行できればいいよ」と許されました。危なかった…。

# 感想と反省点
* UE4がマルチプラットフォームな事に安心せず、実行環境とプラグイン対応環境をちゃんと確認しよう
* UE4をMacPCで動かすのつらい
* （そもそも私がMacPC苦手…）
* UE4はいいぞ

という感じでした。
結論：MacPC初心者つらい😇。

今後また業務が貰えるかはわかりませんがUE4の勉強はやっていきたいなあと思っています。何よりライセンスが取り回しやすい…。特に映像コンテンツ向けには…。
magicleap入門-magicleapを初期化しよう

# はじめに
この記事ではmagicleapデバイス本体の初期化をします．私は次の理由で2回この方法で初期化をしました．ちなみにこの方法を取ることになった理由は次の通りです．今回の方法ではPCから認識されなくなっても初期化することができます．

- LuminOSのアップデート失敗により文鎮化した
- PCから認識されなくなった

# 大まかな流れ
1. 本体操作によりfastbootモードに入る
1. PCからのコマンド入力により初期化する
1. 再度セットアップを行う

# 手順
## fastbootモードに入る
音量ダウンボタンを押しながら，電源を押してください．インジケータが点灯したらすぐにボタンを離してください．インジケータが青色で右から左に伸び縮みするようになれば成功です．

### fastbootモードとは
あくまで推測です．これはLuminOSより更に下のレイヤを起動するモードかと思います．PCでいうとBIOS起動のようなものかと思います．

## PCからコマンド入力を行う
USBケーブルでPCと接続します．ここで認識しなければ，物理的な故障やより深いシステムの損傷の可能性があります．
認識できた場合は次のコマンドをコマンドプロンプトから実行します．

```
fastboot devices        #fastbootモードのデバイスの接続確認をします
fastboot erase userdata #ユーザデータの削除をします
fastboot reboot         #fastbootモードを抜けます
```
## セットアップを行う
セットアップを行います．私の場合すぐにセットアップを行うと何故かアカウント認証のときにエラーが出ましたが，しばらく時間を置いて再度行うと問題なくセットアップすることができました．

# 参考にしたもの
[LuminOSがアップデートできない時のトラブルシューティング大全](https://qiita.com/gaku_hiro/items/abbb72d0c96027236c9c)
magicleap社のサポートから頂いたメール

# 注意事項
この方法はmagicleap社のサポートに問い合わせて教えて頂いた方法を含みます．シリアルナンバーやOSバージョンにより取るべき方法が違う可能性があります．またどのような状況にこの方法が有効か，どのような理屈でこのように動作しているか理解しているわけではないので，あくまで自己責任でこの方法を行ってください．
Terraform + SAM で苦労した話

## はじめに

以下のブログを参考に SAM を Terraform に組み込んでみたところ、

色々苦労することになったので備忘録を残します

https://blog.youyo.io/posts/terraform-aws-sam/

## 実行環境

- Terraform: 1.0.6
- Terraform providers:
  - aws: 3.58.0
  - local: 2.1.0
  - null: 3.1.0
- SAM: 1.24.1

## 背景

AWS Lambda のデプロイに昔は apex を使っていましたが、メンテナンスされなくなってしまいました

https://github.com/apex/apex

昔は他に便利なツールもなかったため、
Docker コンテナで依存ライブラリをインストールしてから圧縮するスクリプトを自前で組みました

それを Terraform から呼んで関数毎にビルド・デプロイする方法です

自前実装で長く運用してきたものの、
やはり Lambda 周りが無駄に複雑になってしまっているため、
公式の Lambda Layer や SAM を使って正しくデプロイしようと考えました

## 長さ制限

最初にぶち当たったのは長さ制限でした

既存システムの Lambda 関数は数が非常に多く、まずそれらを SAM 用に書き下すだけでも大変でした

ようやく全て書いて実行すると、早速エラーが発生

template_body に指定できる長さの上限が 51,200 バイトだったために、実行できなかったのです

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudformation_stack#template_body

そこで、まずは API Gateway から呼び出される Lambda とそれ以外（定時実行など）を分離しました

それでもやはり API の関数が多い、、、

元は GET や POST などのメソッド毎に別関数にしていたのですが、
パス毎、メソッド毎だと、どうしても多くなってしまいます

というわけで、 GET でも POST でも同じパスに来たら同じ関数で処理するようにして、
関数内でメソッドを判別して処理を振り分けるようにしました

```python
def handle(event, _):
    if event["httpMethod"] == "GET":
        ...
    if event["httpMethod"] == "POST":
        ...
```

これで関数が少なくなり、とりあえず SAM の実行まではできるようになりましたが、、、

## Common Layer

元々、データベースアクセスやロギングなどの共通関数は
ビルド時に各関数のディレクトリー内にコピーしていました

最初は「これはしょうがないか、、、」と思ってシェルスクリプトでコピーを組んでいたのですが、

Lambda Layer なるものの存在を初めて知りました

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html

しかも、依存パッケージもこちらに入れられるという、、、

テンプレートに以下のように Layer を定義し、各関数から参照します

Layer 用のディレクトリ（以下の例では `../sam-common/`） に
共通関数の各 Python ファイルと requirements.txt を入れておけば、
あとは SAM が上手くやってくれます

```yaml
  CommonLayer:
    Type: AWS::Serverless::LayerVersion
    Properties:
      LayerName: !Sub ${ServiceName}-api-common-layer
      Description: common layer for API
      ContentUri: "../sam-common/"
      CompatibleRuntimes:
        - python3.8
    Metadata:
      BuildMethod: python3.8

  XXXFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: !Sub ${ServiceName}-xxx
      CodeUri: functions/xxx/
      Role: !GetAtt XXXFunctionRole.Arn
      Layers:
        - !Ref CommonLayer
```

昔からこれがあれば苦労しなかったのに、、、

## 同時実行エラー

上記の問題により、 SAM のテンプレートは API と Others に分かれました

しかし、それぞれの SAM を個別に実行するとエラーにならないのに、
なぜか Terraform で実行すると謎のエラーが、、、

```text
OSError: [Errno 66] Directory not empty:...
```

しばらくはさっぱり理解できませんでしたが、実行状況を眺めてようやく理解できました

Terraform はできるだけ効率的に処理するため、
並列実行可能な箇所は同時に動かしてしまうのです

null_resource から SAM のビルドを実行しているため、
 Terraform からは並列実行できないものとは見なされません

SAM が API 用と Others 用で同時に動いた結果、
同じキャッシュディレクトリーを参照し、エラーになっていたのです

並列実行させないためには、依存性を入れて必ず順序を守らせるしかありません

Others 用が終わってから、 API 用が動くようにしました

```terraform
resource "null_resource" "sam-api-build" {
  ...
  depends_on = [
    null_resource.sam-others-build,
    ...
  ]
}
```

ただし、これには問題があって、 Others 用の変更があった場合、 API 用も無駄に動いてしまうのです

どうしても、これは回避できません

本番用とステージング用がある場合、ステージング用を本番用に依存させることで、ステージング適用時はステージングのみ、本番適用時は本番＋ステージングが動くようになります

逆にするとステージング適用時に本番の方も動いてしまうので注意

## おわりに

他にも細かいエラーが色々あり、結構時間がかかってしまいました

依存性を入れたり、結局、むしろ前より複雑になってしまったのでは、、、、

SAM は単体で運用するならベストですが、 Terraform との相性はあまり良くなさそうです

Layer に関しては1番の収穫だったので、今後は SAM はともかく Layer は必ず使います
iOS15でAirPrintの印刷処理でエラーが発生するようになったので対策する

#iOS15に上げると印刷を行う処理でアプリがクラッシュするようになった

参考) https://developer.apple.com/forums/thread/689876

UIPrintInteractionControllerを使うことで、iOSのアプリからプリンターに印刷指示を出すことができるようになりますが、iOS15にアップデートするとアプリがクラッシュするようになりました。
UIPrintInteractionControllerでは、
①予め設定しておいたプリンタの情報を渡すことで自動で印刷する方法
②iOS標準のプリンタ設定画面を挟んで、そこで印刷指示する方法
があります。

今回はこの①の場合にクラッシュすることを確認しています。
そこで不本意ではありますが、①→②の方法に変更して一旦凌ぐことにしました。

#実際のコード修正(swift)
①予め設定しておいたプリンタの情報を渡すことで自動で印刷する方法

```swift:UIPrintInteractionController&#x20;
func print(to printer: UIPrinter, completionHandler completion: 
UIPrintInteractionController.CompletionHandler? = nil) -> Bool
```
↓
②iOS標準のプリンタ設定画面を挟んで、そこで印刷指示する方法

```swift:UIPrintInteractionController&#x20;
func present(animated: Bool, completionHandler completion: 
UIPrintInteractionController.CompletionHandler? = nil) -> Bool
```

#実際のコード修正(objective-c)
①予め設定しておいたプリンタの情報を渡すことで自動で印刷する方法

```objc:UIPrintInteractionController&#x20;
- (BOOL)printToPrinter:(UIPrinter *)printer completionHandler:(nullable UIPrintInteractionCompletionHandler)completion;
```
↓
②iOS標準のプリンタ設定画面を挟んで、そこで印刷指示する方法

```objc:UIPrintInteractionController&#x20;
// iPhoneの場合
- (BOOL)presentAnimated:(BOOL)animated completionHandler:(nullable UIPrintInteractionCompletionHandler)completion;  
// iPadの場合
- (BOOL)presentFromRect:(CGRect)rect inView:(UIView *)view animated:(BOOL)animated completionHandler:(nullable UIPrintInteractionCompletionHandler)completion; 
```

#まとめ
そもそも根本解決できていおらず、緊急措置的な意味合いが強い対応をしました。
修正方法でもっといい方法あるよという情報をお持ちの方はコメントお待ちしています！

#2021/11/10 追記
参考) https://developer.apple.com/forums/thread/689876
に対応策の投稿がありました。

```swift:UIPrintInteractionController&#x20;
printer.contactPrinter { (available) -> Void in
    if (available) {
        printController.print(to: printer, completionHandler: printCompletionHandler)
    }
}
```
のように一回 `printer.contactPrinter` を挟んでコネクションのチェックをしてOKだったら呼び出す形にするとクラッシュせずに動くようになりました。
構築したWSFCで耐障害性テストを起こす

## 前提
2台のWindows ServerでWSFCを構成（WSFC01とWSFC02というサーバー名）
その中にファイルサーバーを設置
耐障害性テストでテスト要件を考える

## 自分が考えたテスト
正常にアクセスできる

- WSFC01が切断中でもアクセスできる
- WSFC01が切断すると所有者ノードが変更される
- WSFC02が切断中でもアクセスできる
- WSFC01がパワーオフでもアクセスできる
- WSFC01がパワーオフだと所有者ノードが変更される
- WSFC02がパワーオフでもアクセスできる

アクセスできない

- WSFC01とWSFC02が切断中
    - アクセスできない
    - 所有者ノードにてエラーが発生する
    - ファイルを開いていると保存ができなくなる
- WSFC01とWSFC02がパワーオフ
    - アクセスできない
    - 所有者ノードにてエラーが発生する
    - ファイルを開いていると保存ができなくなる

## 正解
インフラの場合は動き続けるか、というテストを行う
つまり動かない、というテストはやることはほとんどない

<b>正常にアクセスできる

- WSFC01がパワーオフでもアクセスできる
- WSFC01がパワーオフだと所有者ノードが変更される
- WSFC02がパワーオフでもアクセスできる

### ネットワーク切断は環境によりけり
今回の仮想環境ではやらないことが多い

### 全台パワーオフや全台ネットワーク異常というのは案件によりけり
多分やらない
単体障害ポイントを作る

### DR
別の地域に同じ構成のものを用意しておいて、ある地域のものが全て止まったという障害を起こしてその際に、別地域に移動するかどうかを確認する

## 実際の挙動
所有者ノードのWSFCをパワーオフにすると所有者ノードが変更されるが、変更されるのに少し時間がかかる
![スクリーンショット 2021-10-22 16.13.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1603537/3600915c-9a17-fed9-27f5-cb5b1222196c.png)
イベントにもログが吐き出されている