OmniAICreator/Qiita-1.07M huggingface dataset:
Minecraft 1.18をM1 Macでネイティブに動かす

[Minecraft Caves & Cliffs アップデートの第２弾](https://www.youtube.com/watch?v=6XtaM2o1Qps)、バージョン1.18がまもなくリリースされますね！今回のアップデートでは地形の生成ロジックが大幅に変更されて、これまでのマイクラの世界とは大きく体験が変わりそうでとても楽しみです。

マイクラのJava版にはJavaのランタイムが内蔵されているので、通常はJava環境を気にすることなく遊ぶことができますが、Mac用のマイクラに内蔵されているものは `x86_64` なので、M1 (Appleシリコン) Macで起動した場合はRosseta 2経由になり動作が重くなってしまいます。ネイティブ環境で快適に遊ぶためには別途Javaをインストールする必要があります。

今回1.18のリリースに備えて Mac mini (M1, 2020) でセットアップしたのでこちらにまとめます。

## MultiMC

:::note info
**2022年12月24日追記**
MultiMCの代わりに[Prism Launcher](https://prismlauncher.org/)を利用することもできます。こちらはMultiMCをフォークした物で機能やインターフェースはほぼ一緒です。こちらを使うと後述する m1-multimc-hack の導入をしなくてもAppleシリコンで起動可能になるのでおすすめです。
:::

まずMultiMCを導入します。マイクラの複数バージョンのインスタンスを管理したり、MODを導入したりするのに便利です。使用するJavaのランタイムも指定することができます。

以下からMac用をインストールします。
https://multimc.org/

起動したら「Add Instance」からバニラの1.18のインスタンスを追加します。（現時点ではまだリリースされていないので、「Snapshots」にチェックを入れてpre-releaseバージョンを選択しています。）

![スクリーンショット 2021-11-23 14.21.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32084/e6c18a79-b872-6fc5-640c-2ca2fae553ed.png)

## Java

マイクラのバージョン1.18から使用するJavaのバージョンは17になりました。

以下からJDK 17の「macOS/AArch64」をダウンロードします。
https://jdk.java.net/17/

※ Javaのインストール方法はいくつも選択肢があるので好きな方法で大丈夫ですが、arm64アーキテクチャのものを選んでください

展開した `jdk-17.0.1.jdk` を `/Library/Java/JavaVirtualMachines` の下に置きます。

MultiMCのインスタンスの右クリックメニューから「Edit Instance」を選択して「Settings」を開きます。ここで以下のように `java` のパスを指定してください。

![スクリーンショット 2021-11-23 14.35.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32084/6c53e4f7-b6a8-26b3-eb43-693c1b1ee80e.png)

「Test」で正しく設定できているか確認できます。

![スクリーンショット 2021-11-23 14.37.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32084/0609799d-5f34-90ae-692d-4f0de473124a.png)

## m1-multimc-hack

:::note info
**2022年12月24日追記**
上述の通りMultiMCの代わりに[Prism Launcher](https://prismlauncher.org/)を利用すればとこちらの項目の設定は不要です。
:::

以上で基本的には設定完了なのですが、この時点で起動するとLWJGL関連の問題でクラッシュしてしまいます。これを回避するために以下のスクリプトの導入が必要です。

https://github.com/sdirkwinkel/m1-multimc-hack

```
# ラッパースクリプトとライブラリを置くための適当なディレクトリを作ります
mkdir -p ~/Minecraft
cd ~/Minecraft

# リポジトリをクローン
git clone https://github.com/yusefnapora/m1-multimc-hack.git

# スクリプトのパスをクリップボードにコピー
ls ~/Minecraft/m1-multimc-hack/mcwrap.py | pbcopy
```

スクリプトのパスをコピーしたら再びMultiMCの　Edit Instance > Settings を開いて、「Custom commands」タブ内の「Wrapper command」の欄にペーストします。

![スクリーンショット_2021-11-23_14_57_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32084/1d1dc88d-81ed-676a-50eb-d64e6bd3fcd1.png)

インスタンスを起動すると無事マイクラが立ち上がりました :tada: 

![2021-11-23_15.03.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32084/b989e8e3-9217-f67c-9656-a68dfafdfb97.png)

## 参考記事

https://qiita.com/kawanet/items/57a35446b7daa903dfe9
【図解解説】ARC129 B Range Point Distance

## 図解解説シリーズ
競技プログラミングを始めたばかりでAtCoderの解説やJOIの解説ではいまいちピンと来ない…という人向けに、図解を用いて解説を行います。

## 問題文

ARC129 B - Range Point Distance

https://atcoder.jp/contests/arc129/tasks/arc129_b

## 図解解説

問題文を整理するために、具体的な数字を用いて、図示して考えてみます。
![スライド1-11-23-21_14-34-11-495.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2211017/04a9549d-5157-cc0b-2a34-408d133c0abc.png)
そこで、問題文に示されているdist(l,r,x)に具体的な数字を入れて考えます。まずl=2,r=4として、◯をl、●をrとして数直線に表したものが左上の図になります。xの値がlとrの間にあれば、答えは0（dist(2,4,2)=dist(2,4,3)=dist(2,4,4)=0）となります。また、xの値がl=2より小さければ、例えばx=0のときdist(2,4,0)=2-0=2（l>xのときdist(l,r,x)=l-x）となります。一方、xの値がr=4より大きければ、例えばx=5のときdist(2,4,5)=5-4=1（x>rのときdist(l,r,x)=x-r）となります。

従って、範囲が１つのとき、max(dist(2,4,x))を最小にするxは、2<=x<=4となる値を選べば良いので、答えは必ず０になります。

範囲が２つの場合を考えます。
【２つの範囲が重なっているとき】max(dist(1,3,x),dist(2,4,x))を最小にするxは、２つの範囲が重なっている値、つまりx=2（またはx=3）を選べば、dist(1,3,2)=0、dist(2,4,2)=0となり、答えは0になります。

【２つの範囲が重なっていないとき】max(dist(1,3,x),dist(5,7,x))を最小にするxを考えます。x=2からx=6を順次あてはめて計算を行うと、x=4のとき最小になることがわかります。つまり、左の範囲のr=3と右の範囲のl=5の中央値（x=4）が求めるxの値になり、答えは1となります。ここで、中央値が整数にならない場合を考えます。例えば、max(dist(0,2,x),dist(5,7,x))のときは、そのまま計算するとx=3.5になってしまいます。xが整数に反しますので、xの値を切り下げたx=3または、xの値を切り上げたx=4が求めるxの値となり、答えは2となります。

それでは、範囲が多くなったとき、どのように考えればよいでしょうか。
![スライド2-11-23-21_14-34-11-566.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2211017/8387c1e5-0170-5b65-26ba-e2487dada945.png)
図のように、２つの場合で考えます。最初の例では、範囲が離れていますので、x=8で試しに計算を行なっています。すると、x=8を基準にして、左側にある範囲については、rの値を使ってdist(l,r,x)=x-rのように値を計算することになります。一方、右側にある範囲については、lの値を使ってdist(l,r,x)=l-xのように値を計算することになります。最終的に答えに影響する計算は、最小のrを含む範囲と、最大のlを含む範囲となります。さらによく観察すると、答えは最大のlと最小のrの距離の半分となります。答えが小数にはなりませんので、小数になる場合は求めた値を切り上げたものが答えになります。範囲が２つで離れているときの例でも同様に求めることができることを確認してみてください。

次の例では、すべての範囲が重なっています。このとき、先ほどの例で注目した最大のlと最小のrの位置関係を確認してみると、「最大のl<=最小のr」となっています。このときの答えは0ですので、最大のlと最小のrの大小関係に注意しながらプログラムを作成すればよいことがわかります。

## 解答例

最終的に作成したプログラムは以下の通りです。
前述の通り、すべての範囲から、最小のrと最大のlをまずは求めておきます。その後、最小のrと最大のlの大小関係から答えを求めます。

「最大のl<=最小のr」のときは、すべての範囲が重なっているので、答えは0になります。一方、「最大のl>最小のr」のときは、最大のlと最小のrの距離の半分（小数値となる場合は切り上げ）となります。

```arc129b.py
import math
N = int(input())
mxL = -float('inf')
mnR = float('inf')
for i in range(N):
  l,r = map(int,input().split())
  mxL = max(mxL,l)
  mnR = min(mnR,r)
  if mxL<=mnR:
    print(0)
  else:
    tmp = math.ceil(abs(mxL-mnR)/2)
    print(tmp)
```
[提出したプログラム](https://atcoder.jp/contests/arc129/submissions/27434318)
M1チップ搭載のMacBookでDockerのCPU使用率をたった4クリックで倍以上減らす方法

# 方法

Docker Desktopを使っている場合、下記の通りExperimental Featuresの`Use the new Virtualization framework`を有効にしてDockerを再起動します。

![CleanShot 2021-11-23 at 15.01.50@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7565/55a8fec6-3093-64dc-cd87-b773b524de68.png)

# 免責

私の環境では常時160%以上CPUを使用してたコンテナが常時60%程度になりました。この機能はまだ実験的機能で本記事の内容で安定性と効果を保証するものではありません。

# 雑感

筐体の温度やバッテリ持ちも改善すると思う。安定性は特に変わらない。
M1チップって書いてるけど、Intelチップでも改善する気がする。あとで比較してみる。
localhost:8000に接続できないエラー（404 Not found）

# ＜エラー概要＞
◉Laravel学習
http://localhost:8000/admin/profile/create
に接続を試みるも、

:::note warn
404 Not found
:::
と出力されうまく実行できない。

#＜仮説／試したこと＞
◉ルーティングの記述確認
``php artisan route:list``
#＜原因／結果＞
``admin/news/create``
``admin/news/delete``
``admin/news/edit``
→このようにprofileのルーティングが全くできていませんでした、、

```route/web.php
Route::group(['prefix' => 'admin'], function() {
       //ProfileController
       Route::get('profile/create', 'Admin\ProfileController@add');
       Route::get('profile/edit', 'Admin\ProfileController@edit');
       Route::post('profile/create', 'Admin\ProfileController@create');
       Route::get('profile/index', 'Admin\ProfileController@index');
});
```
上記のように追記し解決に至りました。


# ＜感想＞
　「ルーティングはしっかり出来ているはず！」という謎の思い込みから解決に時間を要してしまいました。
自分を疑い続けることは大切だと再認識できました。
今週は学習が中だるみしてしまったので11月最後まで走りきります！

<br>
公開鍵を作成して GitLab に登録する

## 本記事を作成した動機

自分は Git Bash ではなく WindowsTerminal + PowerShell をよく使っている。
が、公式サイトには PowerShell での手順が載っていなかったので、備忘録としてメモ

## PowerShell での手順

1. SSH キーを生成

    ```powershell
    # メールアドレスは自分のものに置き換える
    ssh-keygen -t ed25519 -C "your_email@example.com"
    ```

2. 作成した公開鍵をクリップボードにコピー

    ```powershell
    Get-Content "${HOME}\.ssh\id_ed25519.pub" | Set-Clipboard
    ```

3. 公開鍵を GitLab に登録

    1. [GitLab の設定画面](https://gitlab.com/-/profile) の「User Settings」->「SSH Keys」 ->「Key」にペーストする

    2. 「Add key」を押下する

## 参考サイト

* <https://docs.gitlab.com/ee/ssh/index.html#generate-an-ssh-key-pair>
* <https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account>
* <https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/set-clipboard>
【俺的】COBOL→Java言語移行ガイド（INDEX）

この記事は『[プログラミング学習 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/studying)』の20日目のフライング記事です。

## この記事について

この記事は、年内に書いた「【俺的】COBOL→Java言語移行ガイド」のリンク集です。もうアップもしてしまっていますので、この記事もフライングで公開してしまいます。

## このシリーズを書こうとしたきっかけ

リンクだけ貼っておしまいは味気ないので、ちょっと自分語りさせてください。

私は大学では情報科に在籍し、SIerに就職したのですが、そこでまさかのまさかでCOBOLに出会いました（学生時代は「COBOLなんてもう動いてないでしょw」とか言ってた矢先でしたから驚きですね）。
そんなこんなで入社して数年立ち、現在もCOBOL業務に従事しています。
しかし転機は訪れます。COBOLからJavaへのマイグレーションの話が飛んできたのです。長期計画のためすぐではないですが、いずれはという話でした。
私は大学でご教授頂いたおかげもあり、Javaは自分でサーブレットやJSPを書いてGlassFish Serverを立ち上げてWeb公開できるくらいにはなっていました（最近数年ぶりにしたら結構忘れていましたが）。それとCOBOLを数年触ってきて思ったのが、「COBOL1本で今までお仕事されてきた方がいきなりJavaとなったとき、大変ではないか」ということです。
そこで、「私のできる範囲でCOBOL→Java（オープン系）マイグレーションとなったとき、ほんの少しでも参考になるページを作れたらいいな」というのが今回の企みでした。

## インデックス

さて、話を本筋に戻しましょう。
インデックスと書きましたが、ただのリンク集です。

### 1. [導入](https://qiita.com/zama_8722/items/2e9f82a77c9bebfe12a8)

「なぜマイグレーションが進むのか」を独自目線で調べた記事です。

### 2. [全体構造編](https://qiita.com/zama_8722/items/544e049fa7746e3f4ce2)

「COBOLとJavaで、全体的な書き方でどう変わってくるのか」を簡単にまとめた記事です。

### 3. [基本文法編](https://qiita.com/zama_8722/items/0ae1aa4f144f10d8d324)

「COBOLとJavaで、基本文法がどのように変わってくるのか」を簡単にまとめた記事です。

## アーカイブ集

私個人の記事になるのですが、過去にCOBOL、Java関係の記事を少し書いて言いますので、何かのご参考になれば幸いです。

### Java

__[Javaを使ったオブジェクト指向プログラミング総まとめ](https://qiita.com/zama_8722/items/dcadc8a1eb0b0db977f3)__

Javaのオブジェクト指向プログラミングについて、復習としてまとめた記事です。

### COBOL

__[1人COBOL再研修〜INDEX〜](https://qiita.com/zama_8722/items/be4eaa808243a406cc97)__

入社して初めてのCOBOLでしたので、休日に勉強したのをまとめた記事です。この記事は本記事同様インデックス記事です。全5記事あります。

## 最後に

実際、COBOLとJavaは手続き言語とオブジェクト指向言語な時点で「比べるも何も」というのが正解かもしれませんが、比較して読み替えれる点はいくつかあると思っています。
マイグレーションに従事する方やこれから業務がCOBOL⇔オープンに変わる方に、少しでも支えになれば幸いです。

あと、各記事にLGTMいっぱいください()。

ありがとうございました。
Could not reach host index.rubygems.org. Check your network connection and try again. と言うエラーについて。

### Cloud９を使ってrailsチュートリアルを進めているのですが、`Could not reach host index.rubygems.org. Check your network connection and try again. `と言うエラーについて教えていただきたいです。



### 発生している問題・エラー

```
$ bundle install
$ bundle update
```
などを叩くと

```
Could not reach host index.rubygems.org.
Check your network connection and try again. 
```

と表示されます。

自分で試したことといえば数分時間をおいてから新しくディレクトリを作り直すことしかできず、（お手上げ）しかし、それでなぜかエラーが表示されなくなり、問題なく先ほどのコードを叩くとinstall されてupdate出来てしまいました。


そこで、なぜ解決できたのか質問させてください。

hostに行けないとエラーが出た場合(Could not reach host index.rubygems.org. )、何をするべきか、networkを確認しろ(Check your network connection and try again. )と出た場合も何を確認して、どう対処するべきかを教えていただけないでしょうか。よろしくお願い致します。



…単純に更新されてなかっただけとかなのかなw
EKSクラスタにアクセスできるようにする

```
$ kubectl -n kube-system edit configmap/aws-auth
```

data にIAMユーザーのエントリを追加

```
data:
  mapUsers: |
    - userarn: [ユーザーのARN]
      username: [ユーザー名]
      groups:
        - system:masters
```
JavaScriptで"await"を使わずにsleep(sec);


# 背景

皆さんテレワークで、仕事中に、届け物が来て、わざわざインターホンの場所に向かって
やり取りしないといけないことはないですか？
　特に会議中にこのイベントが発生すると大変ですよね^^;

# ゴール
![IMG_5674.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817/59e4cb5f-cf0e-7e45-ae02-58a4d6c76232.jpeg)
[switchbot](https://www.switchbot.jp/) を使って、インターホンを押されたら

1. 通話/終話を押して、カメラをオンにする
2. 解錠ボタンを押す
3. 通話/終話を押して、カメラをオフにする

これを自動化したいです。

# 直面した問題
switchbotは

```JavaScript
url = "https://api.switch-bot.com/v1.0/devices/${deviceid}/commands";
```

で[API呼び出し](https://github.com/OpenWonderLabs/SwitchBotAPI)できます。

インターホンをトリガーとして

1. switchbot(下)に通話/終話を押させて、カメラをオンにする
2. **N秒**待って、声をかける
3. switchbot(上)に解錠ボタンを押させる
4. **N秒**待つ
5. switchbot(下)に通話/終話を押させて、カメラをオフにする

1-5をシーケンシャルに実行する、webアプリを作りたいです

めんどくさいのでHTMLのアンカータグの中でこんな感じで呼び出したいです

```HTML
<a href="javascript:opengate();">Open Gate</a>
```

つまりopengateはこんな感じで呼び出したいです。

```JavaScript
const nsec = 10;
fetch('switchbot(下)のAPI');
_sleep(nsec);
fetch('switchbot(上)のAPI');
_sleep(nsec);
fetch('switchbot(下)のAPI'))
```


[awaitとPromiseを使ったsleepの方法](https://qiita.com/t-mine/items/d99ce078d4e60ab34304)は見つけましたが
**アンカータグの中にawait書いたらasyncの中ではないので怒られてしましました**

普通にasyncつかったり色々試せばいいのですが、めんどくさいので手っ取り早く下記で解決しました。

# 解決策 (ものすごく前置きが長くなってしまいましたが実際に作ったものは下記です)

``` JavaScript 
/**
 *
 *  function _sleep
 *
 *  @param {number} sec - number of secs to wait
 *  @param {function} cb - function to be executed after waiting
 *
 */
const _sleep = (sec, cb) => {
	// setTimeout ID
	let id = 0;
	// wait function
	const wait = () => {
		// if sec is expired and cb is a "function"
		if (sec-- <= 0 && 
			"function" === typeof cb) {
			cb();
			return;
		}
		// clear current timer and set next timer
		if (id > 0) clearTimeout(id);
		id = setTimeout(wait, 1000);
	};
	// set first timer
	id = setTimeout(wait, 0);
};
```

最終的なopengateはこんな感じで実装しました

```JavaScript
const opengate = () => {
    const nsec = 10;
    fetch('switchbot(下)のAPI');
    _sleep(nsec, () => {
        fetch('switchbot(上)のAPI');
        _sleep(nsec, () => fetch('switchbot(下)のAPI'))
    });
};
```


# 一般的な使い方

``` JavaScript
console.log("start");
_sleep(2, () => {
    console.log("end")
});
```
【Ruby のまずいコード】正規表現で特定の文字を囲む

# お題

引数として与えられた文字列中の小書きの片仮名を `【 】` で囲んだ文字列を返すメソッドを書いてください。
小書きの仮名とは「っ」「ァ」などのことです[^kgk]。
ここでは，片仮名の「ァ」「ィ」「ゥ」「ェ」「ォ」「ッ」「ャ」「ュ」「ョ」「ヮ」のみを対象とします。

[^kgk]: 小書きの仮名は拗音，促音，外来語その他の表記に使う。

例えば

```rb
puts kogaki_mark("キャッシュ")
# => "キ【ャ】【ッ】シ【ュ】"
```

となります。

# コード

```rb
def kogaki_mark(str)
  str.gsub(/[ァ|ィ|ゥ|ェ|ォ|ッ|ャ|ュ|ョ|ヮ]/, '【\0】')
end
```

# 問題点

このコードは，引数によっては正しく動作しません：

```rb
puts kogaki_mark("A|B") # => "A【|】B"
```

与えられた文字列中の `|` という文字が `【 】` で囲まれてしまいました。

正規表現の書き方が間違っているのです。
文字クラスの `[ ]` の中で選択[^sngn]の `|` を使ってしまっています。どうやらやりたいことを二重に表現してしまったようですね。

文字クラスの `[ ]` の中では `|` はメタ文字ではなくリテラル[^literal]なので，

```
[ァ|ィ|ゥ|ェ|ォ|ッ|ャ|ュ|ョ|ヮ]
```

という正規表現は「`ァ` とか `|` とか `ィ` とか `|` とか `ゥ` とか `|` とか `ェ` とか `|` とか `ォ` とか `|` とか `ッ` とか `|` とか `ャ` とか `|` とか `ュ` とか `|` とか `ョ` とか `|` とか `ヮ` とか」という意味になります。
なお，`[ ]` の中に同じ文字が複数回書かれていても 1 回だけ書いたのと同じです。

正規表現の初心者でこのような書き方をしてしまう方は少なくありません。
テストした文字列に　`|` が含まれていなければ正しい結果を返すので，ミスに気づきにくいのです。

[^sngn]: 選言とも言う。要するに「または」のこと。
[^literal]: 正規表現として特別な意味をもたない「そのまんま」の文字のこと。英単語の「literal」には「文字通りの」という意味がある。

# 改善

正しい書き方は

```rb
def kogaki_mark(str)
  str.gsub(/[ァィゥェォッャュョヮ]/, '【\0】')
end
```

または

```rb
def kogaki_mark(str)
  str.gsub(/ァ|ィ|ゥ|ェ|ォ|ッ|ャ|ュ|ョ|ヮ/, '【\0】')
end
```

です。

「いずれかの文字」という検索パターンは，このように，文字クラスでも選択でも書けます。
どちらがいいのでしょうか？
私は前者を勧めます。
一つの理由は，この例を見れば明らかなように，前者のほうが短いからです。
しかし，二つの文字のいずれか，という検索パターンだと

```rb
[AB]
```

よりも

```rb
A|B
```

のほうが 1 字短くなっています。
短さだけを追求するなら後者に軍配があがりますが，文字クラスで書くことにはほかにもいろいろ利点があります。

まず，保守性です。文字の種類を加減するとき，文字クラスで書いておけば当該の文字を追加・削除するだけで済みますが，選択で書くと `|` も一緒に追加・削除しなければなりません。

また，`[ ]` の中では，さまざまな記号がリテラルと解釈されることもポイントです。例えば，「丸括弧またはピリオド」は選択で書くと

```
\(|\)|\.
```

となりますが，文字クラスで書けば

```
[().]
```

のようにエスケープせずにすみます。

また，ほかの正規表現と組み合わせる場合には，文字クラスのほうが簡潔に済む場合があります。例えば「第一次産業」「第二次産業」「第三次産業」という文字列を検索したいとき，もちろん

```
第一次産業|第二次産業|第三次産業
```

とも書けますが，文字クラス　を使って

```
第[一二三]次産業
```

と書けます。この `[一二三]` の部分を選択に置き換えようとすると，単純に `一|二|三` として

```
第一|二|三次産業
```

と書いたのではダメで

```
第(?:一|二|三)次産業
```

のようにグルーピングしなければなりません。
（`(?: )` は `( )` とすれば若干簡素になりますがキャプチャーというオマケもついてきます[^cp]）。

[^cp]: もちろんキャプチャーが必要な場合はそれでいいわけですが，不要なキャプチャーはパフォーマンスを落とし，複雑な正規表現ではキャプチャー番号が大きくなってややこしくなる。
CloudFormationでImportValueを使うとJSONObjectが見つかったと言われる

# 経緯
セキュリティグループをクロススタックで使いたくてyamlでテンプレートを書いていたものの、Outputsの結果がIDになっているのは確認できているのに

```
#/SecurityGroups/0: expected type: String, found: JSONObject
```

とか言われてぐぬぬ…となっていた。
うまくいく方法を見つけた結果からすると、最終的に行き着くのは「一旦フルで書いてみよう」というところ…なのかもしれない。

# 修正前
```
  MountTarget1:
    Type: AWS::EFS::MountTarget
    Properties:
      FileSystemId:
        Ref: NfsBatch
      SubnetId:
        Ref: Subnet
      SecurityGroups: 
        - ImportValue: NfsSecurityGroupId
```

# 修正後
```
  MountTarget1:
    Type: AWS::EFS::MountTarget
    Properties:
      FileSystemId:
        Ref: NfsBatch
      SubnetId:
        Ref: Subnet
      SecurityGroups: 
        - Fn::ImportValue: NfsSecurityGroupId
```

# 終わりに
関数名ちゃんと全部書こうぜという、かれこれ1時間近く悩んでいたのがバカらしくなるような結果でした。
（ほかにもやりようはあるのかもしれない）
Fn::がついていないImportValueで実行した結果がMappingじゃなくてJSONObjectとして認識されているのがちょっと疑問。
Apache POIを使って列の幅の自動調整を行う

Excelの列の幅の自動調整に相当することをApache POIで実現したい場合、`Sheet.autoSizeColumn`を利用すると良いです。ただし、とくに日本語が混ざっている場合、`Sheet.autoSizeColumn`がうまく列の幅を調整してくれないことがあります。これを回避したい場合、自動調整したい列のセルのフォントを日本語対応のものに設定してやると、想定通り動くようです。

以下はそのサンプルになります。

```java
Workbook workbook = ...;
Sheet sheet = ...;

// 幅の自動調整をしたい列のセルのフォントを日本語対応のものに設定する。
// (ここでは例としてYu Gothic UIを使う)
Cell cell = ...;
CellStyle cellStyle = workbook.createCellStyle();
Font font = workbook.createFont();
font.setFontName("Yu Gothic UI");
cellStyle.setFont(font);
cell.setCellStyle(cellStyle);

// 幅の自動調整を行う (ここでは例としてB列とする)
CellReference cellReference = new CellReference("B");
sheet.autoSizeColumn(cellReference.getCol());
```

__環境情報: pom.xml抜粋__

```xml
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.target>11</maven.compiler.target>
    <maven.compiler.source>11</maven.compiler.source>
</properties>

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>5.1.0</version>
    </dependency>
</dependencies>
```
Apache POIを使ってセルにリンクを設定する

Apache POIを使ってセルにリンクを設定する場合のサンプルを以下に示します。

```java
Workbook workbook = ...;
Cell cell = ...;

// セルにハイパーリンクを設定する
Hyperlink hyperlink = workbook.getCreationHelper().createHyperlink(HyperlinkType.DOCUMENT);
hyperlink.setAddress("destination!A1");
cell.setHyperlink(hyperlink);

// セルに値を設定する
cell.setCellValue("destinationシートのA1へのリンク");

// 文字色を青色にして、アンダーラインを設定する
CellStyle cellStyle = workbook.createCellStyle();
Font font = workbook.createFont();
font.setColor(IndexedColors.BLUE.getIndex());
font.setUnderline(Font.U_SINGLE);
cellStyle.setFont(font);
cell.setCellStyle(cellStyle);
```

Excelではリンクを自動設定すると、文字色が青色になってアンダーラインが設定されますが、POIでは自動設定されないため、ここもコーディングする必要があります。したがって文字色とアンダーラインの設定が不要な場合は、サンプルの最後のほうは無視してOKです。

なおこのサンプルを実行したイメージは以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/d3589254-4301-eb77-e363-47ce81391a7b.png)

__環境情報: pom.xml抜粋__

```xml
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.target>11</maven.compiler.target>
    <maven.compiler.source>11</maven.compiler.source>
</properties>

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>5.1.0</version>
    </dependency>
</dependencies>
```
Mininetで `ovs-ofctl show <SWITCH>` ができない

ドキュメントをよく見ればわかることだったが、ちょっとハマったので共有。

## 環境

```bash
$ mn --version
2.3.0.dev6
```

## 準備
以下のトポロジを作成

```bash
sudo mn --mac --topo=single,2
```

`s1` という名前のBridgeがあることが確認できる。

```bash
mininet> s1 ovs-vsctl show
1720ef2b-4901-4013-b167-2e7c793b684f
    Bridge s1
        Controller "ptcp:6654"
        Controller "tcp:127.0.0.1:6653"
            is_connected: true
        fail_mode: secure
        Port s1-eth1
            Interface s1-eth1
        Port s1-eth2
            Interface s1-eth2
        Port s1
            Interface s1
                type: internal
    ovs_version: "2.13.3"
```

## 問題

```
mininet> s1 ovs-ofctl show s1
ovs-ofctl: 127.0.0.1 is not a bridge or a socket
```

上記のようにスイッチ `s1` の情報を確認しようとするとエラーになる。

## 解決
http://mininet.org/walkthrough#test-connectivity-between-hosts に

> If a string appears later in the command with a node name, that node name is replaced by its IP address; this happened for h2.

という記述があり、Mininetコンソール上でコマンドの後ろにノード名が来たら自動的に対応するIPアドレスに変換されるらしい。なので、今回は `s1 ovs-ofctl show s1` の `show` の後ろの `s1` が `127.0.0.1` に変換されてしまっていた。

なので、`show` の後ろの `s1` を文字列として渡せば良いので、以下のコマンドで解決。

```
mininet> s1 ovs-ofctl show 's1'
OFPT_FEATURES_REPLY (xid=0x2): dpid:0000000000000001
n_tables:254, n_buffers:0
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: output enqueue set_vlan_vid set_vlan_pcp strip_vlan mod_dl_src mod_dl_dst mod_nw_src mod_nw_dst mod_nw_tos mod_tp_src mod_tp_dst
 1(s1-eth1): addr:3a:ef:fd:75:7d:8b
     config:     0
     state:      0
     current:    10GB-FD COPPER
     speed: 10000 Mbps now, 0 Mbps max
 2(s1-eth2): addr:56:36:d4:a4:2b:f1
     config:     0
     state:      0
     current:    10GB-FD COPPER
     speed: 10000 Mbps now, 0 Mbps max
 LOCAL(s1): addr:a6:1f:ae:fa:a7:48
     config:     PORT_DOWN
     state:      LINK_DOWN
     speed: 0 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0
```

## Ref
- [Mininet Walkthrough](http://mininet.org/walkthrough)
Python3エンジニア認定試験の勉強

#Pythonエンジニア認定試験
受けてみました。勉強時間は2日間（約10時間）。
CBTで、受験料は1万円。

##筆者のスペック
転職ついでに2020年に2週間ほどかけて無料のPythonセミナーを受けるも、
ほぼ理解できなかった。クラスやpandas分析までやった記憶はあるが、
「printは覚えたぞ！」程度で終了。
それから1年半の間ほぼpython使わずにいたらさっぱり分からなくなった。
仕事で無理やり使ったりしていた程度。（以下参照）
※ファイルのコピーをコマンドではなくPythonを使ってみる
※SQLデータを敢えてPythonで出力してみる
※ネットに落ちてるコードをコピーして形態素解析してみる
※とりあえずProphetが動くようにしてみる

##勉強方法
①過去問を解き続ける
②間違えたところをググる

###①過去問を解き続ける
以下サイトに会員登録して、
・知らない問題が出てこなくなるまで
・950点以上になるまで
繰り返し解いた。
850点→650点→550点→750点→850点→950点
というような推移だった記憶がある。

https://diver.diveintocode.jp/

ある程度自信がついたら、以下サイトで問題を解く。
点数は全然取れないので気にしないが、
650点、700点取れればこの試験には受かる力はついている気がする。
実際の試験設問もここまで難しくない。

https://study.prime-strategy.co.jp/

###②間違えたところをググる
ググって調べる能力をgoogling力というらしい。
とにかく検索して、自分にとってわかりやすい解説を見つける。

文章問題は暗記するか、設問に出てくる単語すべてを調べる。

##よく間違えたところ
自分はリファレンスをすっ飛ばしてコードを動かしたい直感派(?)なので
文章問題は読んでもさっぱり意味不明なことが多かった。
理解するか、暗記するしかないと思う。

あとは、焦るとゲシュタルト崩壊した。

```python
#range(start, stop[, step])
list(range(2, 10))
```

これって、
2から10までの　[2, 3, 4, 5, 6, 7, 8, 9]　だっけ、
2から10個の　　[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]　だっけ
とか、阿呆なゲシュタルト崩壊を起こすので、
きちんとstart、個数ではなくstopであるという理解をすると
焦る場面やポカミスが減ると思った。

#結果
合格しましたが、800点でした。
忘れたらまた過去問を解きたいので、
メモ程度ですみませんでした。
HTMLのコメントで、そこを眺めた人向けに、

HTMLのコメントで、そこを眺めた人向けに、表向きと別のメッセージを出すことがありますが、そこに、見るたびに違う要素があるのは面白いのではないかと思いました。
見るたびに違う、をもう少し考えると、見ている間に更新されるものがあると面白いのでは、と思いました。
そんなとき、

WEBの開発者であれば、息を吸うようにF12の開発者コンソールを開くはず
そこに時計があるのは、なんか、かわいいのでは
と思ってしまったのがきっかけです。
Intel Mac で HomeBrew のインストール先を変更したらエラーになった件

## 経緯
しばらく Mac を使っていなかったので、久しぶりに引っ張り出して環境を再構築してみました。ついでなので、Big Sur にしたのですが、今まで使っていた `fink` が未だに Big Sur に対応していなかったので、HomeBrew を試してみようかと思いました。

`fink` の時は `/opt/sw` 配下にインストールされていたので、試しに使って不要になったら`/opt/sw`ごと消せばよかったのですが、`brew` のデフォルトのインストール先は `/usr/local` です。`/usr/local` は OS のコマンドがインストールされている場所なので、汚したくありません。そこで[こちらの記事](https://qiita.com/usamik26/items/601f5612bd3f8a21cc41)を参考にインストール先を変更してみることにしました。

## 何が起きた？
ところが、実際にインストールしてみると下記のエラーが発生してしまい、正常に動作しませんでした。

```
Error: Cannot install on Intel processor in ARM default prefix (/opt/homebrew)!
```

どうやら、Apple Silicon が発売されたために、`/opt/homebrew`が Apple Silicon 用のデフォルトインストール先になってしまったようです。このディレクトリは ARM アーキテクチャ用に予約されてしまい、Intel アーキテクチャの Mac では使用できなくなってしまったようです。

この問題は[こちらの issue](https://github.com/Homebrew/brew/issues/9130) でも報告されていました。

## 別のディレクトリにインストールしてみる
インストール先のディレクトリを変えるだけなので、特に難しいところはありませんが、備忘録代わりにに作業メモを残しておきます。

まずは、インストール先のディレクトリを下記のように作成します。

```
mkdir -p /opt/homebrew/x86_64
cd /opt/homebrew
```

あとは、[インストールガイド](https://github.com/Homebrew/brew/blob/master/docs/Installation.md)に書いてあるコマンドを、ディレクトリを読み替えて実行していくだけです。インストール先を変えたので、インストールコマンドは下記のように変わります。

```
curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C x86_64
```

インストールできたら、後処理コマンドを順に実行します。

```
eval "$(x86_64/bin/brew shellenv)"
brew update --force --quiet
chmod -R go-w "$(brew --prefix)/share/zsh"
```

これで正常にコマンドをインストールできる環境が整ったはずです。

最後に、毎回パスを通すのは面倒なので `.bash_profile` に下記を追記しておくと便利です。（書き込み先ファイルは使用しているシェルに合わせて読み替えてください。）

```
echo 'eval "$(/opt/homebrew/x86_64/bin/brew shellenv)"' >> ~/.bash_profile
```

### コマンドをビルドできない場合

[参考元の記事](https://qiita.com/usamik26/items/601f5612bd3f8a21cc41)にも書いてありますが、コマンドインストール時にソースからビルドが必要になることがあります。コマンドラインツールをインストールしていない場合は、先にインストールしておいた方が無難だと思います。（XCodeをインストールしている人はもしかするといらないかも）

```
sudo xcode-select --install
``` 

### ビルド時間について

やはり、ソースからビルドが走るので時間がかかってしまいますね。マシンスペックにも依ると思いますが、依存関係が多いと一晩くらいかかることもあります。

`fink` の時も `apt` を使用しないでインストールする際はビルドが走るので、同じくらい時間がかかっていました。本格的に `brew` に乗り換える際は、`/usr/local` にインストールし直そうかと思います。

逆に、Apple Silicon に買い替えてしまえば、`/usr/local` を汚してしまう問題はパフォーマンスを犠牲にせずに解決しそうなので、その点は嬉しいですね。
Google Cloud Certified - Professional Machine Learning Engineerの受験記


## これはなに

Google Cloud Certified - Professional Machine Learning Engineerの受験記録です。

## 動機
なんやかんやでGoogle Cloud認定試験はこれだけ残ったので勢いで。

## 受験概要

<https://cloud.google.com/certification/machine-learning-engineer>

## 受けて欲しいひと

- MLを軽く勉強したい人でGoogle Cloudの基礎的なところを抑えている人。
- MLが前面に出たツールやSaaSを利用する人。（e.g. Prisma Cloud）
- コンプリート目的

上記に該当する人以外は、正直、他の資格を優先でいいようにも思う。
無駄だったとは思ってはいない。

## なぜか？

一部、Google CloudのML関連サービスの知識が求められるが、ごく一部。
それ以外のGoogle Cloudサービス（Database系, GCS, GAEなど）も問題に一部登場するが、一般的な知識レベルで回答できそうなものがほとんど。
これは、おそらくGoogle Cloudのアーキテクチャが洗練されているから、理解しやすい構成になっているからと思われる。
問題の大半がMLについて。
ただ、後述の触り程度の学習でも合格点に達したので、そんなに深いことは聞いてこないと思う。

上記の背景により、Google Cloudについて基本的なことを抑えている人が、MLを勉強してみたいであったり、今後に備え下地を作って置こうという人に向いている気がする。


## 勉強方法

個人的オススメ順。
全体的に言えることだが、試験は英語のみのため、英語が得意でない人ほど、適宜、英語で照らし合わせた方がいい。
そうしないと、試験の時に単語が紐づかない可能性がある。

- Crash Course
Google社内の学習コンテンツを公開したものらしい。
随所に理解度チェックテストもあり、本家のコンテンツであることから、ベストプラクティスへの信憑性も高い。
圧倒的にオススメ！
ただ、動画を飛ばして進めたこともあり、途中置いていかれるところもあった。
そこは後述の書籍や他の情報をググって補完した。
https://developers.google.com/machine-learning/crash-course

- 模擬試験
試験概要は合格後に読み返しても分からないことが多いが、模擬試験は有用だった。
各問題に詳細な解説がついているので、序盤の自分自身の現在地点の確認と、受験直前のおさらいに有効。
正解の選択肢だけでなく、他の選択肢の説明もあるので、そこも理解できるようにする。
https://cloud.google.com/certification/sample-questions/machine-learning-engineer

- 書籍
    - 仕事ではじめる機械学習 - O'Reilly Japan
   
書籍はなんでもいいと思う。たまたま、会社の共用本棚にあったので拝借。
自分は前半部分の機械学習の基礎的なところのみ読んだ。


- 聴講
    - スタビジ（Youtube）

いくつかだけちょっとした合間に観た。一つの動画の時間が短いのがありがたい。
ただ、Youtubeは他の誘惑が多いのであまり活用しきれなかった。
他にもコンテンツは上がっているので、動画派の人は自分好みを探してもいいかも。


## 受けてみたメモ

False -> Pass.
初回はほぼ丸腰で挑んでしまった。機械学習の単語が分からず惨敗。
Recall … リコール。。。車の欠陥で回収するとかのやつかなぁ。学習結果間違っていたので再学習とかかなぁ、と間違った推測のもと、試験を進めてしまった。この辺の単語は知っておくべきだった。
ただ、Google Cloud側の知識は今持っているもので結構カバーできそうだなぁとか、機械学習についてちゃんと勉強してからでないとダメだなぁという感覚は掴めた気がした。

２回目は前述の学習を行った上で挑み、無事成功 :)
あと、見直しでも数問修正できた気がする。１回目はサボってしまった。他の試験でも同様ではあるが、この試験では、より問題をしっかり読むことが大事に思った。

## 勉強メモのハイライト

### これだけは抑えておこう
#### 評価
True-Positive, True-Negative, False-Positive, False-Negative
を基に、正解率、適合率、再現率、AUCとか。
概念的にシンプルなのでML初学者でも簡単に理解できると思う。
先に書いたRecallの件とか、これを知っていたら容易に解けた（知らなければ解けない）問題も多い。

#### 構成図
"GCP ML"で画像検索してみる。
いくつか構成図が出てくるので、そのサイトを眺めておくと、構成観点での設問対策になる。MLのインフラストラクチャ構成を掴める。
公式サイトがオススメ。図付きの方がイメージつきやすい＆丁寧な解説があることが多い。他の試験でもこの作戦は有効。

#### 協調フィルタリング
用途がわかる程度で大丈夫と思う。

### 類似比較による記憶
個人的に超オススメ。
個別で覚えるよりも、試験にも実務にも実践的な気がするし覚えやすい。
メモを以下に共有するが、あくまでメモなので参考程度に。

#### Neural Networkにおける、RNN vs CNN
RNN ... 時系列データの予測など、NNの各層出力を中間データとして出なく通常の結果のように利用。
CNN ... 画像識別などで、ある程度の範囲のデータをまとめたものを重ねていく。

#### RecomendにおけるContent Based vs Colaborative Filtering
Content Based ... 類似商品のオススメ
Colaborative Filtering ... 自分と関連する他のユーザーなどからオススメ

#### BigQuery ML vs Auto ML Table
いろいろ差異があるので単純比較は割愛。
AI Platform vs kubeflowとか、Coomposerとか主要サービスは概要レベルででも押さえておきたい。

#### オンライン予測 vs バッチ予測
オンライン予測 ... その場ですぐに結果を返す。
バッチ予測 ... まとめて予測。

#### AI Platformにおけるgcloud vs REST API
gcloud ... AI Platformタスク向き
REST API ... オンライン予測向き

#### AutoML Natural Language vs Cloud Natural Language
AutoML Natural Language ... ラベリング（分類）
Cloud Natural Language ... 分析

#### クラス分類 vs クラスタリング
クラス分類 ... Classfication。教師アリ。境界線を引いて明確に判別。
クラスタリング ... Clustering。教師ナシ。近くにいるものをグルーピング。
SwiftPMプロジェクトのExampleとしてPlaygroundを利用する

Xcode13.2から、拡張子`.swiftpm`を持つSwift Packageファイルが使えるようになりました。
実態は、Package.swiftをラップしたパッケージファイルなのですが、これを開くとPackage.swiftに指定されたアプリケーションを実行できるXcodeの特別なワークスペースを開くことができます。

このSwift Packageファイルは次のようにSwiftPMプロジェクトのExampleとして扱うことができます。

![CleanShot 2021-11-23 at 13.21.35@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24979/c646db3c-c1d6-9894-04b2-2cf70c430454.png)

Example.swiftpmから、同階層のSwiftPMプロジェクトを呼び出すには、Example.swiftpm/Package.swiftに、相対パス指定でdependenciesを登録する必要があります。

```swift:Example.swiftpm/Package.swift
// swift-tools-version: 5.5

import PackageDescription
import AppleProductTypes

let package = Package(
    name: "Example",
    platforms: [
        .iOS("15.2")
    ],
    products: [
        .iOSApplication(
            name: "Example",
            targets: ["AppModule"],
            bundleIdentifier: "dev.noppe.DebugMenu.Example",
            teamIdentifier: "XXXXXXXXX",
            displayVersion: "1.0",
            bundleVersion: "1",
            iconAssetName: "AppIcon",
            accentColorAssetName: "AccentColor",
            supportedDeviceFamilies: [.phone],
            supportedInterfaceOrientations: [.portrait]
        )
    ],
    dependencies: [
        .package(name: "DebugMenu", path: "../") //ここ
    ],
    targets: [
        .executableTarget(
            name: "AppModule",
            dependencies: [
                .productItem(name: "DebugMenu", package: "DebugMenu", condition: nil)
            ]
        )
    ]
)
```

これで、Xcodeからはlocalとラベルのついたswiftpmとしてプロジェクトに取り込むことができました。

![CleanShot 2021-11-23 at 13.29.15@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24979/e60e72e1-84a9-2094-9b5a-3c0308a9d2a0.png)

localパッケージはXcodeから編集することができるため、このような構成にしてExampleを元に開発することもできます。

謎のxmlなどが消えて、ピュアswiftな非常にシンプルなファイル構成になるのでぜひ試してみてください。

この構成はDebugMenuでも採用しています。
https://github.com/noppefoxwolf/DebugMenu

---

多分この構成にするとiPadのPlaygroundでも開けるようになるんじゃないかなぁ。
Python初心者がノンプロ研でPython学んでみた vol.2

# はじめに
こんにちは、な～です。ノンプロ研でPythonを学び始めました。その学びについての第2弾です。

# 今回学ぶこと
- 条件分岐
- 繰り返し
- 関数
の3本立てです。

# 条件分岐
プログラムの手続きには３種類あります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1208544/5dc7c36c-746f-d4b2-d233-79729a0d58d8.png)
順次：上から順番に処理を実行する
選択；条件によって、処理を選択して実行する
反復：同じ処理を繰り返して行う。条件によってその処理を抜ける

ここはPythonでなくとも、他のプログラムでも学ぶところですね。
今回は2個目の分岐処理です。

分岐処理にはifを使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1208544/2b46d2cc-e786-c3ea-4980-8e5fa31f99e3.png)
条件式は、True・Falseを返す式を書きます。式は特に括弧で囲わなくてもいいです。処理は、インデントをして書きます。GASみたいに{}で囲ったり、VBAのようにEND IFしなくて、インデントで判断するそうです。

![20211117初心者講座Pythonコース-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1208544/494b8b9b-cba4-a17f-69cc-f3bdc8cfc778.png)
Falseのときは、else:とインデントすることで処理ができます。また、条件をいくつかつけたいときはelif文を使います。Switchやcaseのような構文はまだ無いとのことです。

![20211117初心者講座Pythonコース-02 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1208544/de73a095-f2ab-cf18-c6fa-08211ddf2a71.png)
条件式の説明中に論理演算子の説明もありました。Pythonはand・or・notとのことです。
![20211117初心者講座Pythonコース-02 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1208544/8942d177-e041-58a5-33c1-d397c0ccddc5.png)
また、ブール値以外の型の判定の説明もありました。
これはデータの存在チェックをするやつ、便利なのに忘れがちです。（私比）Pythonなら使う場面が多そうなので今回こそ憶えたい。

# 繰り返し
次は手続きの画像の3つ目にありました「繰り返し」です。
![20211117初心者講座Pythonコース-02 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1208544/0626fbe0-ea3d-b266-403c-c1f4b2ffaa75.png)
まずは、whileによる繰り返しです。
whileの後ろの条件式がTrueの間処理を繰り返します。繰り返す処理はインデントをしておきます。
![20211117初心者講座Pythonコース-02 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1208544/979033e3-2d92-f63a-f4a1-04b40a87c459.png)
次はfor文。集合に含まれるデータを順番に取り出しながら処理をします。添字を増やしながらというところでないところがちょいと戸惑いますね。

# 関数
次は関数！
![20211117初心者講座Pythonコース-02 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1208544/4589646a-a0c9-73e9-1ece-0f2da25f62bd.png)
こちらは、関数の定義です。def 関数名()で関数の定義ができます。
returnでも戻り値を指定します。
![20211117初心者講座Pythonコース-02 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1208544/e12a2eb9-d6fe-cead-ba33-44ed3a081f98.png)
こちらは呼び出し側、関数名（）で呼び出せるとのことです。
ただ、関数の呼び出しと定義は、順番があります。関数を定義した後に呼び出す必要があるそうなので注意が必要そうです。

# まとめ
今回は、制御構文と関数について学びました。
Pythonのスペースの置き方に戸惑いがあったので、[ pep8-ja](pep8-ja.readthedocs.io/ja/latest/)
こちらのページを読んでみたのでまとめてみました！[Python学習中。PEP8って？の学びのまとめ](https://togetter.com/li/1806569)

また、いつもの通りに講座中の自分のツイートもまとめしまた！
[ノンプロ研 Python初心者講座第2回目 byな～](https://togetter.com/li/1805256)
余弦定理「浜松医科大学2021（前期）問2(1)」をsympyとWolframAlpha でやってみたい。

オリジナル

https://izu-mix.com/math/?p=3880

https://kaisoku.kawai-juku.ac.jp/nyushi/honshi/21/hm1-21a.pdf#page=2

大学入試数学問題集成＞

https://mathexamtest.web.fc2.com/2021/202110471/2021104710100mj.html#s-0102


# Pycharmで
```python
# (1)三角比の知識で解く
from sympy import *
var('t')
print("#(1)",solve((4*t**2+16-1)/(2*2*t*4)-(9*t**2+16-9)/(2*3*t*4),t)[1]*3)
# (2)ベクトルで解く
print("#(2) 勉強中")
# (3)座標平面を設定して解く
var('t k')
print("#(3)",float(solve([(cos(k)+2*t)**2+sin(k)**2-4**2,(cos(k)-t)**2+sin(k)**2-3**2],[t,k])[3][0]*3))
# (4)定石外れ
from sympy import *
var('AB AC AD t n')
pA=Point( 0,0)
pB=Point(AB,0)
pC=Point(AC*cos(t),AC*sin(t))
pD=pB+n/(1+n)*(pC-pB)
BC=sqrt((pC-pB).x**2+(pC-pB).y**2)\
        .subs({t:solve((pD.x)**2+(pD.y)**2-AD,t)[1]})
print("#(4)",float(BC.subs({AB:4,AC:3,AD:1,n:2})))
# (5)定石外れ
from sympy import *
var('BA BC CA AD n')
print("#(5)",float(solve( (BA**2+ BC**2         -CA**2)/(2*BA*BC          )
                         -(BA**2+(BC*n/(n+1))**2-AD**2)/(2*BA*(BC*n/(n+1))),
                         BC)[1].subs({BA:4,CA:3,AD:1,n:2})))
# (6)定石外れのチェック
print("#(6)",float(sqrt(186)/2))
#(1) sqrt(186)/2
#(2) 勉強中
#(3) 6.819090848492928
#(4) 6.819090848492928
#(5) 6.819090848492928
#(6) 6.819090848492928
```

# WolframAlpha で
(1)三角比の知識で解く

solveの使い方を教えて下さい。一回で計算できますか？

https://ja.wolframalpha.com/input/?i=solve%28%28%284*t**2%2B16-1%29%2F%282*2*t*4%29-%289*t**2%2B16-9%29%2F%282*3*t*4%29%29%29

https://ja.wolframalpha.com/input/?i=t+%3D+%C2%B1+sqrt%2831%2F6%29*3

t = ± sqrt(93/2)

以下勉強中
WAS設計その9 JDBCprovider

jdbcproviderで注意することは

その１　範囲。
データソースの範囲で作成する必要があります。
※大が小を兼ねるようなことはありません。
※JDBCProviderをセル範囲で作成して、データソースがノードとかないです。

その２　Oneフェーズコミット　または　XAか

大前提の
Oracle、Db2、SQLServerと接続は当たり前なので割愛。

個人的に不要だと思うこと
なんでこれを作成するときにわざわざ説明なんて箇所を作成したのでしょう。。。
wsadminコマンドで作成するとき本当に面倒。
※WASのどの設定にもあるなら理解できるが、わざわざJDBCとデータソース系にやたらとある。。。
※今風の言葉ではイミフである。
Ubuntuをインストールする際に、reset systemを繰り返して起動できないときの対処法

#概要
Ubuntuをインストールしようとした際、Ubuntu18.0~21.0まで、どれを試しても、![resetSystem.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/1d3a98fa-7082-1da5-2442-25c92030ec67.png)

「Reset System」と表示されて、再起動を繰り返すエラーにぶつかりました。

#解決方法
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/29cb1cd1-b58b-bde7-4783-d0d34b17b135.jpeg)

TPMを「No」に変更したところ、起動できるようになりました。

誰かの参考になれば・・・
Lucene (Elasticsearch, Solr) のSynonym Graphの基本と問題点と対策

# 概要

Luceneには、トークン列の間のシノニム（同義語）関係を表現するためのSynonym Graphというデータ構造が用意されています。しかし、インデックス側に完全なSynonym Graphを保存するデータ構造がないため、意図しない検索結果を避けるために、**クエリ側で使うと良い**でしょう。Luceneのインデックスに依存するElasticsearchや、Solrでも同様です。

# Synonym Graphの基本

**Synonym Graphは、ポジションを節点とし、トークンを向きのある枝とするデータ構造**です。そして、その名の通り、トークン列の間のシノニム（同義語）関係を表現するためのデータ構造だと説明されることが多いです。

しかし、日本語データセットを扱う場合には、形態素解析結果の揺れを表現するために使われることも多いと思います。例えば、Solr 8.6.3にバンドルされている`text_ja`フィールド型に、`"港区六本木一丁目"`という文字列を入力するだけでも[^1]、以下のようにSynonym Graphを構成するトークン列が生成されます。ただし、説明に使わない属性は省略しました。

|text|港|区|六|六本木|本木|一|丁目|
|-|-|-|-|-|-|-|-|
|position|1|2|3|3|4|5|6|
|positionLength|1|1|1|2|1|1|1|

[^1]: 実際に入力する場合は、SolrのWeb UIのanalysis screen (https://solr.apache.org/guide/8_6/analysis-screen.html) を使うと良いでしょう。なお、`text_ja`フィールド型の設定はインデックス側でもクエリ側でも同じなので、どちらに入力しても同じ結果になります。

これは、ポジションを節点とし、トークンを向きのある枝（始点はposition、終点はposition + positionLength）とするSynonym Graphを構成しています。図示すると以下の通りです。

![synonym_graph.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155352/ade04bad-32bf-1ef1-2776-39deed89a4ac.png)

要は、**ありうる複数通りの形態素解析結果をグラフ構造で表現している**わけです。Synonym Graph上のマッチングは、ドキュメント側のグラフの部分グラフとしてクエリ側のグラフが存在するかどうかによって判定されます（なお、Synonym Graphとしてクエリを入力するには、例えばフレーズクエリを入力します）。ただし、textと隣接関係が一致していれば存在するものとし、positionやpositionLengthが一致する必要はありません。ドキュメント側に上述のグラフを取ると、例えば以下のどちらのクエリ側のグラフが来てもマッチすることになります。これによって、形態素解析結果の揺れに対応できます。

![synonym_graph_phrase_query.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155352/c7b4b5e1-c90d-fccc-c095-89492aa8de89.png)


# Synonym Graph の問題点と対策

Synonym Graphの問題点として、**Luceneのインデックス側にpositionLengthを保存する構造がない**ことが挙げられます[^2]。インデックスにSynonym Graphを保存して、取り出すと、positionLengthは全て1になります。上述の例では、以下のように構造が変わってしまいます。

|text|港|区|六|六本木|本木|一|丁目|
|-|-|-|-|-|-|-|-|
|position|1|2|3|3|4|5|6|
|positionLength|1|1|1|<font color="red">1</font>|1|1|1|

![synonym_graph_invalid.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155352/21a40e35-4e47-a5cf-3e80-d2851e82a8a4.png)

[^2]: Elasticsearchのドキュメントの以下の箇所で述べられている仕様と本質的には同じです。https://www.elastic.co/guide/en/elasticsearch/reference/current/token-graphs.html#token-graphs-multi-position-tokens

構造が変わってしまうため、マッチングも変わってしまいます。例えば、先ほどのクエリの例のうち下のものはマッチしなくなります。また、誤ってマッチするクエリも出てきます。

![synonym_graph_invalid_phrase_query.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155352/5ef59d08-e5a3-0ed7-1776-70988a58d8a7.png)

この問題点を避けるには、**Synonym Graphはクエリ側で使うと良い**でしょう。クエリ側のグラフに複数のパスがある場合は、その中のいずれかがマッチすれば、マッチしたことになります。これまで説明してきた例について、ドキュメント側では揺らさず、クエリ側で揺らした場合は、以下の通りのマッチングになります。

![synonym_graph_query_side.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155352/5a8bfd4b-6318-b21b-b660-e14414f527e1.png)
文字コードってなんだ（詳細編）

[前回](https://qiita.com/tatataichi/items/20608fee92b185c65550)に続き、今回は**文字化けの詳細な仕組み**についてメモを残していこうと思います。
よくあるパターンの**UTF-8からShit-JIS間で起こる文字化け**を例に取ります。

#文字化けさせる文
以下の文を文字化けさせていきます。

>**あいうえお**
>**いろはにほへと**
>**hogehoge fugafuga**

#UTF-8からShit-JIS
| UTF-8 | Shift-JIS |
| :-: | :-: | 
| あいうえお / いろはにほへと / hogehoge fugafuga | 縺ゅ＞縺?∴縺 / 縺?ｍ縺ｯ縺ｫ縺ｻ縺ｸ縺ｨ /　hogehoge fugafuga |

ということで、UnicodeであるUTF-8からShit-JISで変換すると**糸編の漢字**が頻出します。
これは、**文字コードのうち何バイトを一文字とするか**の解釈が異なるために発生します。

UTF-8は**3バイトを全角一文字**として解釈するのに対し、Shift-JISは**2バイトで全角一文字**となります。
一方で**半角文字は双方とも1バイトで一文字なので、先述の解釈違いは基本的に起きません**。（hogehoge fugafugaのところ）

ちなみに、UTF-8では文字コード「E3 81 8*」あたりが「**平仮名**」に対応し、Shift-JISでは「**縺＋何か半角文字**」にあたります。

|　文字コード| UTF-8 | Shift-JIS |
| :-: | :-: |:-: |
|E3 81 BB E3 81 92  | ほげ| 縺ｻ縺 |

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2255713/e47f8b7b-c1d0-acba-2ba7-89b4807360c3.png)

※さらに上図の補足をしておくと、SJISにおける「92」の1バイト解釈文字は存在しないわけではなく、「**EM(End of Medium)**」という記録媒体の終端に辿り着いたかどうかを示す**制御文字**という特殊な文字になります。
※制御文字が出てきたので、さらに余談ですが文字コード「0A」は改行を意味する制御文字で、十進数では「10」になります。そのため、例えばスプレッドシートで「**char(10)**」とすると**改行**が出力されます。

#文字化けの戻し方
**1.使用しているソフト（メーラー、テキストエディタ等）のエンコード設定を変える**
**2.復元ツールを使う（完璧ではない）**

メールの文字化けや、CSVの文字化けについては使用しているメーラーやテキストエディタのエンコード設定を変更すれば大抵解決します。
それでもダメなとき（元の文字コード自体を上書きしてしまった場合等）は、ネット上に転がっている復元ツールを使うといいでしょう。
ただ、先述の通りUTF-8とShit-JISではエンコード時のバイト数が異なるために、一部の文字コードは捨てられるもしくは「?」で表示されてしまいます。
そんなときは元データを再度手に入れるか、復元できているいくつかの文字から解読していくしかないかなと思います。

#参考
・各文字のエンコード・デコードをしてくれるサイト
http://www.edu.i.hosei.ac.jp/~sigesada/kyouzai/mojicodehenkan.html

・SJISの文字コード表
http://charset.7jp.net/sjis.html

・Unicodeの文字コード表
http://ash.jp/code/unitbl21.htm
RealityKitで顔と重なったオブジェクトを表示する（FaceMeshを非表示にする）

RealityKitでFaceAnchorを使うと、顔より後ろのARオブジェクトが透過されます。
この深度オクルージョンをオフにするには、

```swift
arView.renderOptions.insert(.disableFaceOcclusions)

// iOS15からは.disableFaceMesh
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/9ac7aabf-60c1-fe1a-41a5-ac7214a61221.jpeg" width=100>

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
【Kotlin】TextView・AlertDialogにHTMLのタグを適用する

この記事では、以下のような`String`をTextViewにバインドし、TextViewにHTMLタグを適用させていきます。

```kotlin
val link = """
    <a href="https://qiita.com/">Qiita</a>を開く
""".trimIndent()
```

![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484337/d9c01e62-a66c-c3b2-b7e0-e1e211174381.gif)

### HtmlCompactの利用
[HtmlCompact](https://developer.android.com/reference/androidx/core/text/HtmlCompat)を利用することでHTMLのタグをAndroidにも適用することができます。

```kotlin
    private fun transformHtml(text: String): Spanned {
        return HtmlCompat.fromHtml(text, HtmlCompat.FROM_HTML_MODE_COMPACT)
    }
```

上記のメソッドにHTMLタグを含んだStringを渡し、その戻り値を表示したいTextViewに渡してあげることで適用できます。

```kotlin
override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding = MainFragmentBinding.inflate(layoutInflater)
        binding.message.text = transformHtml(link)
        binding.message.movementMethod = LinkMovementMethod.getInstance()
        return binding.root
    }

    private fun transformHtml(text: String): Spanned {
        return HtmlCompat.fromHtml(text, HtmlCompat.FROM_HTML_MODE_COMPACT)
    }
```

また、リンクのタップを検知するには`movementMethod`をつける必要があります。

```kotlin
binding.message.movementMethod = LinkMovementMethod.getInstance()
```

### おまけ
テキストリンクの色を変えたい時は`android:textColorLink`を設定することで任意の色に変更できます。

```xml
android:textColorLink="@color/black"
```

### ダイアログのテキストに適用する
アラートダイアログにも適用することができます。

![Videotogif (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484337/6607ac19-7624-098c-6031-8c1b6d8c5e77.gif)


```kotlin
val dialog = AlertDialog.Builder(requireContext())
            .setTitle("ダイアログ")
            .setMessage(transformHtml(link))
            .setPositiveButton(android.R.string.ok)
            .create()
dialog.show()
        
dialog.findViewById<TextView>(android.R.id.message)?.movementMethod = LinkMovementMethod.getInstance()
```

ダイアログに適用させる場合も基本はTextViewと同様ですが1点注意が必要です。
`movementMethod`を適用する際に、リソースIDの指定が必要になります。しかし、ダイアログで`findViewById`を利用する場合、`show()`の後に呼ばないとリソースIDが参照できないため上記のような書き方をしています。（もっとスマートにかける方法ありましたら教えていただきたいです:pray:　）

参考文献

https://stackoverflow.com/a/5458225

> // Make the textview clickable. Must be called after show()
M1MacでLinux環境を構築する

はじめに
-
今回は、M1Mac上にLinux環境を構築する方法について取り上げます。

M1Mac上でのLinuxOsの構築方法については少しづつ知見が増えてきましたが、依然として情報が錯綜していたりソースごとに食い違いがあったりと、慣れていない場合にはなかなか理解が厳しい状況です。

私自身Linux環境の構築自体が初挑戦だったのですが、幸か不幸か手元のPCがM1Macであり環境構築に苦労したので、備忘録も兼ねて実行手順を残しておきます。

M1Macの発売時期から考えるに、この1年ほどでプログラミングの学習を始めた方にはPCがM1Macというパターンが多いと思いますの。

私と似た境遇の方のお役に立てれば幸いです。

実行環境
-
| 項目 | バージョンなど |
|:-:|:-:|
| PC | M1MacBookAir(2020年モデル/メモリ8GB/ストレージ512GB) |
| OS | 12.0.1 |
| エミュレータ | UTM(GitHub版) |
| Linuxディストリビューション | Ubuntu 20.04.3 LTS |

今回の記事で実施すること
-

- M1Mac上にLinuxOSをインストールし、最低限の動作（ブラウザ検索など）ができるようにする。
- MacOS上からLinuxのシェルに入り操作を行えるようにする。
- ローカル環境でサーバーを立ち上げ(nginx, apache2)、MacOS上および他の端末からLinuxサーバーにアクセスできるようにする。

お断り
-
本記事は解説書というよりは手順書を作る目的で作成しました。

そのため、なぜこのようにすれば良いのかという部分については触れていない、あるいは私自身の理解が足りていない部分もあるかとは思いますがその点についてはご了承ください。

個別記事
-

https://qiita.com/keishi04hrikzira/items/10aadc61483fdd0bc099

https://qiita.com/keishi04hrikzira/items/1b64a876efe2bbeaeaa9

https://qiita.com/keishi04hrikzira/items/c3a4e26488bdfe619505
アメリカでのSenior Software Engineerの就活フロー（2021年版）

アメリカで久しぶりに転職活動をしたので、最近のアメリカのソフトウェアエンジニア採用フローについて何かの参考になればと思って投稿してみようと思います。
今回はFacebookやGoogleみたいな大企業から社員１０名くらいの小さいStartupみたいな会社までかれこれ30社くらいは応募してみました。結果としては複数社からオファーをもらい、中規模の会社にいくことにしました。

背景として、
私はエンジニア歴は５年＋で西海岸のIT企業で数年働いていて、今回はSenior Software Engineerのポジジョンで職探しをしていました。私自身はグリーンカードは運よく抽選に当たって保持していたので、アメリカ就職で一番大変なビザのことは知見がないのでここでは触れません。

0: 事前準備
ベイアリアでのエンジニアの面接はもはや受験みたいに形式化してきていて、事前準備に１〜６ヶ月くらい（特にLeet Code）かけている人が多いような気がします。
a) [LeetCode](https://leetcode.com/problemset/all)でEasy/Mediumの問題を200問＋解いてみて、なまりきったアルゴリズム/データストラクチャーの知識をブラッシュアップする
- Hardも解けるようになった方が面接の突破率は上がりますが、今回はその時間がなかったので、Hardな問題に出くわしたら運がなかったものとして捨てることしました。

企業が新しい問題を出題する
=>その問題がLeetCodeに登録されて受験者が対策する
=>企業がより難しい新しい問題を出題する
みたいな誰得なんだというような循環があって、年々コーディング試験の難易度は上がってきているという一説もあるらしいです。

b) システムデザイン面接のフォーマットに慣れるために一通り[こちら](https://www.educative.io/courses/grokking-the-system-design-interview
)のサイトを読みこむ。
- 反省としては、上部っつらだけ理解するのではなくて、データがどう行き来するのかとか通信プロトコルとか他の選択肢とかトレードオフとかあらゆる質問を想定して、それぞれに対しての自分なりの回答を用意できるくらいまでに読みこむべきでした。
 
c) LinkedInとResumeのブラッシュアップ
反省として[専門の人](https://www.levels.fyi/services/resume)にレビューしてもらった方がよかった。

1: リクルーターとのアポどり
a) LinkedInやGmailで過去にメッセージがきていたらそこから返信する
b) 知り合いにリファラルしてもらう
c) LinkedInで直接メッセージを送ってみる
d) 企業のページから直接応募する（企業によっては機械的にキーワードがひっかからなかったら誰の目にも触れられずレジュメの山の中に消えていくなんてこともあるという噂もちらほら）
dは最後の手段で応募してから１ヶ月後にリクルーターから連絡が来るみたいなこともザラで、私の場合はa,bだと８割くらいの確率で何かしらの返信がきて、cだと４割くらいdは3割くらいの反応率でした。FANGの職歴（特にFacebookとGoogle）があればアポ取れる率は相当高くなるらしいです。

2：リクルーターとのカジュアルチャット
大体15分から30分ほどのカジュアルな会話になります。
簡単に今までの経歴を説明して、次の仕事に何を求めているのかを話します。
小さい企業だと、ここで応募するチームを決めて選考フローが進んでいきます。選考フローの説明がなくHiring　Manager（応募するチームのエンジニアマネージャー）にGood Matchかみてもらうねと言われたら肌感５割くらいの確率でリクルーターからの連絡は途絶えます。。。
FacebookとかGoogleとかの大企業だと選考フローの説明されて、コーディング面接いつするみたいな感じでここでは選考していなそうでした。

3: コーディング面接(zoom/Google meet)
- どこの企業もほぼ同じフォーマットで、最初の5分お互いの自己紹介して、45分くらいでLeet Code easy/Mediumの問題２問くらいとくかHardな問題一問解いて最後の5分くらいで会社や面接官への質問するみたいな流れでした。
*私の記念すべきGoogle初受験は面接官にMedium/Hardな問題を出題されて、いい解法が思いつかずここで幕が降りました。

4:Virtual Onsite
この４問が大体テンプレでした。
- コーディング面接２回（１回当たり２問の出題）
- システムデザイン面接１回
- Behavior面接（Hiring Managerが担当する）１回
最近だと過去のプロジェクトのdeep dive（技術的に一番自分が誇りに思っているプロジェクトを紹介して、技術的なトレードオフや、なんでこの選択をしたのか、何がうまくいって、何がうまくいかなかったか、次やるならどうするか）やよりシニア向けの面接になるとリーダーシップ関連の面接（メンタリングや、チームを超えて組織のために主体的に行ったこと）が加わったり、バグが散らばったコードを渡されて、バグを一つずつ直していくみたいなより実務よりな面接をしてくれる企業もありました。
シニアソフトウェアエンジニアの場合はコーディング面接パスするのは前提の元、システムデザインとBehaviorのできでシニオリティが判断されます。（このできによってオファーの年棒が1.5倍から2倍くらい変わってくるのでとっても大切です。）
＊面接官が彼女と喧嘩中なのが聞こえてきて、心ここに在らずという人もいれば、何かすごいいいことがあったのか終始ニコニコしていて一緒にペアプログラミングをしてくれる天使のような面接官もいて、面接官の調子にも左右されることもあります。


以上が、アメリカのIT企業での2021年版の大体のSenior Software Enginnerの採用フローになります。何かの参考になれたら幸いです。
googleアプリで特定ユーザだけ検索しようとすると「Wi-fiに接続していない」ため検索できない件

タイトルが長いがネットに情報がなかったので。

#結論
Googleアプリを一度アンインストールして、インストールしなおす

#経緯
基本的にホーム画面にウィジェットを設定し、検索してきた。
しかし、ある時検索できなくなった。

wifiに接続できない

まぁ掴みが悪いのかな?と思ったら、他のアプリは普通にwifi使えている。
adguardでブロックしているのか?と思えば、他のgoogleユーザに切り替えると検索できる

ええーーー

メインで使っているユーザアカウントで検索しようとすると
wifiに接続できない
と言われることが分かった。

なんじゃそれ

とおもって、googleアカウントの設定をみなおしたりしたものの特に問題無し。
はぁ???
と思って、ネットをみても情報なし。

うーむ

ここで過去のarrowの記憶が。
一度デグレードしてからインストールし直してください

ええぃやるか!と
アンインストール→インストール
としたらあっさり解決。

#えた知見
困ったらアンインストールしてみよう!
【#PowerApps】公開されたキャンバスアプリをモニター機能でデバックする

# 概要

Power Apps モニター機能を使って公開されているアプリをデバックする方法を記載しています。

なお本記事は Power Apps のバージョンが 3.20042 以降を使って公開されたアプリが必要です。古いアプリの場合は再度公開する必要があります。


# モニター（監視）機能とは

この機能はアプリの操作や通信などをログ形式で表示し、そこからパフォーマンスや問題点などを調査、修正するために提供されている機能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/55448c47-47fa-351d-d7e1-8fe90472199c.png)


ログ形式のため、開発者でない方は表示されている項目に最初はお手上げっ状態になってしまいますが、何が表示されているのかを以下のサイトからご確認いただければ、徐々にわかってくるかと思います。

[モニターの概要](https://docs.microsoft.com/ja-jp/powerapps/maker/monitor-overview)

編集時のモニター機能の使い方は以下の記事になりますのでご確認ください。
[編集時のデバック機能を使う](https://qiita.com/taku_maru/private/3aef8ef38429cd83374a)
[Power Apps のモニター機能を使って効率よくアプリをデバックする方法➀](https://www.powerplatform.work/PowerAppsInsights/)

# やり方

公開されているアプリの監視を選択し、モニターを表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/9fb0516f-e8c7-dc74-137c-ef664ee65f1e.png)

すると、編集時のモニターとほぼ同じ画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/551f1c27-5bd7-e315-c3f5-cf3458c2470d.png)

「ほぼ」の理由は編集時とは右上の項目が2つ増えていることがわかります。
順番に解説します。

## 公開したアプリの再生

公開されたアプリを起動するボタンです。
ここからアプリを起動することで、モニターにログを表示することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/8414a1dd-98cc-0208-4e87-dc36f8d07324.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/6490f24c-039a-49a4-42f9-aaf7348267e4.png)

モニターされているアプリは左上に赤い監視アイコンが表示されるのが特徴です。

## ユーザー接続

テナント内のユーザーのメールアドレスを入力することで、アプリを起動するリンクを作成し、そのリンクからアプリを起動することで、起動されたアプリのログをモニターに表示する機能です。
なお、リンクは 60分後に自動的に削除され、招待したユーザーのみそのリンクを利用することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/51312ed7-4d16-a5f5-b2af-85bd4027272c.png)
[参考](https://docs.microsoft.com/ja-jp/powerapps/maker/monitor-collaborative-debugging)

起動されたアプリは「公開したアプリの再生」を押したのと同様に左上に赤い監視アイコンが表示されます。

これによって、特定のユーザーの時にしか発生しない不具合や、権限によってアクセスできないデータによる不具合のデバックなどが可能になる非常に便利な機能です。


# ログを確認する

アプリを起動した後表示されたログを確認し、デバックを行います。
どういったログが表示されているのかはこちらをご確認ください。

[モニターダッシュボード](https://docs.microsoft.com/ja-jp/powerapps/maker/monitor-overview#monitor-dashboard)


# 制限事項

この機能には 2021/11/23 時点でいくつか制限があるので、こちらの記事をご確認ください。
[サポートされていないモニターのシナリオ](https://docs.microsoft.com/ja-jp/powerapps/maker/monitor-advanced#unsupported-scenarios-for-monitor)

# まとめ

ログ機能を用いることで、効率よく修正箇所を探すことができます。小規模なアプリでは必要になることはそこまでありませんが、パフォーマンスをある程度求められるアプリや、機能が多く複雑なアプリのデバックの効率は格段に上がるため、ぜひ覚えておきましょう。

# 参考

- [モニターの概要](https://docs.microsoft.com/ja-jp/powerapps/maker/monitor-overview)
- [モニターを使用した共同トラブルシューティング](https://docs.microsoft.com/ja-jp/powerapps/maker/monitor-collaborative-debugging)
- [モニターでキャンバス アプリをデバッグする](https://docs.microsoft.com/ja-jp/powerapps/maker/monitor-canvasapps)
- [高度なモニタリングの概要](https://docs.microsoft.com/ja-jp/powerapps/maker/monitor-advanced)
- [サポートされていないモニターのシナリオ](https://docs.microsoft.com/ja-jp/powerapps/maker/monitor-advanced#unsupported-scenarios-for-monitor)