OmniAICreator/Qiita-1.07M huggingface dataset:
Power Automate で高速に差集合を求める方法 by Office Scripts

# 概要
Power Automateで**差集合**を求める方法は・・

1. 二重ループで処理
1. 二重ループの内側を、Filter Arrayで代用
1. Office Scriptsで、Excepts()を実装して処理

この最後のやり方を記録しておくことで、簡単に再利用できるといいな、と
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/24a02817-6ba6-9615-3cc4-88ee1fe7964d.png)

::: note warn

以下を利用した方が簡単で高速です

[差集合 by Filter Array](https://qiita.com/baku2san/items/a1490cab663cdf37e0cb)

:::

# まずは速度比較
| 方法 |　504件での記録 | 
|:-:|:-:|
|   二重ループ + Filter Array| 3 [min] [^second]  |   
|  Office Scripts で実装 |  **8 [sec]** |   
**20倍以上**の速度差で、ストレス軽減 :relaxed: 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/91157908-4b86-d5bc-c309-dc40a6bc665f.png)

[^second]: 180 [s]以上

# Automate での実装比較
- ループの面倒な点
    - 比較結果を別途変数に残す必要がある
    - Items(), Item()　から、プロパティを選択するのは結構手作業で、ついついミスが・・
    - コメント書いておかないと、このループなんだっけ？ってのが分かりにくくなる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/28b1bdf3-4099-89e4-dd88-0addf0a90961.png)


# で、Office Scripts での実装例
```typescript:Excepts
function main(
	workbook: ExcelScript.Workbook,
	json1st: object,	// 基礎となるJSON
	json2nd: object,	// 除外するJSON
	key: string			// 比較するプロパティ名
) {
	let array1st = []
	// convert json to array by 'map'
	Object.keys(json1st).map((index) => {
		array1st.push(json1st[index])
	});
	let array2nd = []
	// convert json to array by 'for'
	for (let index in json2nd) {
		array2nd.push(json2nd[index]);
	}
	// Automateなら二重ループでの処理
	let excepts2 = array1st.filter(f => !array2nd.find(f2 => f2[key] == f[key]));

	return JSON.stringify(excepts2)
}
```

## Office Scripts 簡単な説明

### 引数

| 引数 | 概要 | 補足 |
|:-:|:-:|:-:|
|  json1st | 基礎となるJSON  |   |
| json2nd  |  除外するJSON |   |
| key| 比較するプロパティ名  | 各Objectを一致判断させる対象。PrimaryKey的な。複数対応は面倒だったのでやってない・・ |

### Object to Array
- 二種類のやり方（Object.keys と for) にしているのは、Type Script自体初心者なので備忘録として。指摘歓迎 :laughing: 

# あとがき
- 一旦Office Scripts で実装すると、以下のようなことも簡単になるのでお勧め。ってことで以降は次回へ？
    - 排他的論理和<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/45d08355-ccf7-2841-6272-2cb78c51d51f.png)

    - 置換

# description
Comparing two JSON Array to get differences immediately
    
# 参考

https://docs.microsoft.com/ja-JP/office/dev/scripts/

https://developer.microsoft.com/ja-JP/office-scripts
PX4のドキュメント・通覧

# はじめに
- PX4というドローンのフライトコントローラについて、かなりしっかりとしたドキュメントがあるのでどれを読んでいきたいと思います.
- 順次別の記事にまとめていこうと思います
- 間違い等あれば指摘していただければと思います.

# そもそもPX4とは
<div align="center">
<img src="https://docs.px4.io/master/assets/img/logo_pro_small.e0fa34bd.png" alt="px4_logo" width="100">
</div>

> https://docs.px4.io/master/assets/img/logo_pro_small.e0fa34bd.png

- PX4はドローンなどのいわゆるUV(無人機)向けのオープンソースのコントローラです.
    - 公式サイト: https://px4.io/
- 主にセンサ値を受け取り、モーター等への制御信号を生成するAutopilitにおける頭脳的な役割をはたすハードウェアの開発が行われています.
- 研究・開発用として、ハードウェアをソフトウェア的に再現したもの(これを`SITL(software-in-the-loop)`といいます、反対に実際のハードウェアを用いて行うことを`HITL(hardware-in-the-loop)`といいます)も提供しています
    - github: https://github.com/PX4/PX4-Autopilot
    - シミュレータ等も含まれています.
- PX4のプロジェクトはDronecodeというLinux Foundationが運営するオープンソースのドローン統合開発向けのプラットフォームとそのプロジェクトの一部となっています.
    - リンク: https://www.dronecode.org/

<div align="center">
<img src="https://www.dronecode.org/wp-content/uploads/sites/24/2020/08/dronecode_logo_default-2.png" alt="dronecode_logo" width="100">
</div>

<div align="center">
<img src="https://www.dronecode.org/wp-content/uploads/sites/24/2018/02/Dronecode-software-stack.png" alt="dronecode_projects" height="200">
</div>

> https://www.dronecode.org/wp-content/uploads/sites/24/2020/08/dronecode_logo_default-2.png
> https://www.dronecode.org/wp-content/uploads/sites/24/2018/02/Dronecode-software-stack.png

- 例えば、QGroundControlはいわゆる管制塔の役割をするソフトウェアで、MAVLINKというプロトコルを用いてPX4は外部と通信を行なっています.
- かなり動きの激しいプロジェクトで、細かく理解するには少し時間がかかりそうです..

# 今回読んでいくドキュメント
- リンク: https://docs.px4.io/master/en/
- ドローンについてや、PX4内部でどの様な処理がなされているか、また、シミュレーションのやり方等が書いてあると思っています.

# 目次とリンク(随時更新)


# 終わりに
- 意見・誤植等あった場合は教えていただければと思います.
AtCoderログ：0018 - ABC 082 B

# 問題：[ABC 082 B - Two Anagrams](https://atcoder.jp/contests/abc082/tasks/abc082_b) ([AtCoder に登録したら次にやること 第02問類題](https://qiita.com/drken/items/fd4e5e3630d0f5859067#%E7%AC%AC-2-%E5%95%8F--abc-081-a---placing-marbles-100-%E7%82%B9))

## 問題文
> 英小文字のみからなる文字列 $s, t$ が与えられます。 あなたは、$s$ の文字を好きな順に並べ替え、文字列 $s′$ を作ります。 また、$t$ の文字を好きな順に並べ替え、文字列 $t′$ を作ります。 このとき、辞書順で $s′<t′$ となるようにできるか判定してください。

## 制約
> ・$s,t$ の長さは $1$ 以上 $100$ 以下である。
> ・$s,t$ は英小文字のみからなる。

# 回答 (AC)
文字列 $s$ を好きに並べ替えた文字列 $s'$ と、文字列 $t$ を好きに並べ替えた文字列 $t'$ が $s'<t'$ となるには、$s'$ の最大値 (つまり文字列 $s$ を降順にソートした結果) よりも $t'$ の最小値 (つまり文字列 $t$ を昇順にソートした結果) が大きくなる必要があります。従って、文字列 $s,t$ を受け取り、$s$ を昇順にソートした結果と、$t$ を降順にソートした結果を比較すれば良いです。なお、文字列 s の昇順ソートは sort(s.begin(), s.rend()), 降順ソートは sort(s.rbegin(), s.rend()) とかけます。

```C++:abc082b.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  string s, t;
  cin >> s >> t;

  sort( s.begin(), s.end() );
  sort( t.rbegin(), t.rend() );
  if ( s<t ) {
    cout << "Yes" << endl;
  } else {
    cout << "No" << endl;
  }
}
```

# 誤回答 (WA)

最初、この問題を「文字列 $s$ を好きに並べ替えた文字列 $s$' に対し、文字列 $t$ を並べ替えて $s'<t'$ となる文字列 $t'$ を作れるか？」と誤解して、文字列 $s,t$ を昇順にソートした結果を比べていました。日本語を微妙に読み間違えたようでした...

```C++
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  string s, t;
  cin >> s >> t;

  sort( s.rbegin(), s.rend() );
  sort( t.rbegin(), t.rend() );
  if ( s<t ) {
    cout << "Yes" << endl;
  } else {
    cout << "No" << endl;
  }
}
```

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc082/tasks/abc082_b/editorial) → [コンテスト全体の解説](https://img.atcoder.jp/abc082/editorial.pdf)
回答と同じ方針でした。

# 学んだこと
- 文字列のソート (昇順, 降順)

# リンク
- 前の記事 → [AtCoderログ：0017 - ABC 069 B](https://qiita.com/RoadLynton/items/b5453cc46676fcaec6b4)
go-cmpでpanicがおきたら

# 対処方法

```go
package main

import (
	"fmt"

	"github.com/google/go-cmp/cmp"
	"github.com/google/go-cmp/cmp/cmpopts"
)

type Struct struct {
	XXX int
	xxx int
}

func main() {
	s1 := Struct{ 1, 1}
	s2 := Struct{ 1, 2}
	
	opt := cmpopts.IgnoreUnexported(Struct{}) // ここ大事
	fmt.Println("Diff: ", cmp.Diff(s1, s2, opt))
}
```
[PlayGroundで試す](https://play.golang.org/p/bSXVpa_XKnR)

# もう少し詳しく
どうやら`go-cmp`は、プライベートな変数があるとパニックになってしまうらしい。
実はこのプライベートの取り扱い方でいくつかパターンが用意されている。

+ [プライベート変数は一致しなくてよい場合](#プライベート変数は一致しなくてよい場合)
+ [プライベート変数も一致していてほしい場合](#プライベート変数も一致していてほしい場合)
+ [指定した変数のみ無視してほしい場合](#指定した変数のみ無視してほしい場合)

### プライベート変数は一致しなくてよい場合
```go
import (
	"github.com/google/go-cmp/cmp"
	"github.com/google/go-cmp/cmp/cmpopts"
...
	opt := cmpopts.IgnoreUnexported(Struct{}) // 最初のものと一緒
	fmt.Println("Diff: ", cmp.Diff(s1, s2, opt))
```
[PlayGroundで試す](https://play.golang.org/p/bSXVpa_XKnR)

### プライベート変数も一致していてほしい場合
```go
import (
	"github.com/google/go-cmp/cmp"
...
	opt := cmp.AllowUnexported(Struct{}) // こちらはcmpoptsではないので注意
	fmt.Println("Diff: ", cmp.Diff(s1, s2, opt))
```
[PlayGroundで試す](https://play.golang.org/p/1-4EeiTtE8j)

### 指定した変数のみ無視してほしい場合
```go
import (
	"github.com/google/go-cmp/cmp"
...
	// 変数名を文字列で指定, パブリック変数も指定可能
	opt := cmpopts.IgnoreFields(Struct{}, "xxx") 
	fmt.Println("Diff: ", cmp.Diff(s1, s2, opt))
```
[PlayGroundで試す](https://play.golang.org/p/gHWeG914teY)

# さらに詳しく
ここまでで解決できない方は恐らく、構造体が複数の層に分かれているかと思います。
今回は、各構造体のプライベート変数の一致を無視した場合の対処法を以下に示します。
各自のユースケースに合わせてご使用ください。

```go
package main

import (
	"github.com/google/go-cmp/cmp"
	"github.com/google/go-cmp/cmp/cmpopts"
)

var (
	ignoreOpts = cmpopts.IgnoreUnexported(
		Car{},
		Wheel{},
	)
	car1 = &Car {
		speed: 2.0,
		Wheels: []*Wheel{
			&Wheel{
				Size: 3.0,
				hardness: 1.0,
			},
			&Wheel{
				Size: 4.0,
				hardness: 2.0,
			},
			&Wheel{
				Size: 5.0,
				hardness: 3.0,
			},
			&Wheel{
				Size: 6.0,
				hardness: 4.0,
			},
		},
	}
	car2 = &Car {
		speed: 4.0,
		Wheels: []*Wheel{
			&Wheel{
				Size: 3.0,
				hardness: 4.0,
			},
			&Wheel{
				Size: 4.0,
				hardness: 3.0,
			},
			&Wheel{
				Size: 5.0,
				hardness: 2.0,
			},
			&Wheel{
				Size: 6.0,
				hardness: 1.0,
			},
		},
	}
	car3 = &Car {
		speed: 2.0,
		Wheels: []*Wheel{
			&Wheel{
				Size: 3.0,
				hardness: 1.0,
			},
			&Wheel{
				Size: 4.0,
				hardness: 2.0,
			},
			&Wheel{
				Size: 5.0,
				hardness: 3.0,
			},
		},
	}
			
)

type Car struct {
	speed float64
	Wheels []*Wheel
}

type Wheel struct {
	Size float64
	hardness float64
}

func CarDiff(left *Car, right *Car) string {
	return cmp.Diff(left, right, ignoreOpts)
}

func main() {
	println("car1 & car2\n", CarDiff(car1, car2))
	println("car1 & car3\n", CarDiff(car1, car3))
}
```
[PlayGroundで試す](https://play.golang.org/p/T094R4idCDX)

# その他
まとめて比較してくれる機能は大変便利ですが、使用する場合はテストの結果を比較するときか、簡単なコードを書くときくらいにしときましょう。
svelte-material-uiを使用しているときにcssが反映されない時の対処法


# 問題
divにcssを適用させて、ボタンとテキストフィールドを中央に配置させるために、svelteファイルのstyleタグにcssを書いたのですが、全然反映されませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329475/5a60998b-6e3e-b351-c2cc-8fec60d5a810.png)


# 対処法
`_smui-theme.scss`に書きます。
そうするとちゃんと反映してくれました。
JavaScriptの基礎 Part2

#length

配列.lengthとすることで要素の数を取ることができます。

```JavaScript:script.js
const fruits = ["apple","banana","orange"];
console.log(fruits.length);
```
出力結果はこちらです。

```
3
```
#オブジェクト

配列とオブジェクトの違いを理解しなければいけません。
配列は [値,値,値];で表しますが、
オブジェクトはプロパティという名前を使い、管理します。
{プロパティ1:値1,プロパティ２:値2};

ES5では連想配列という名前になっていて、プロパティに代わりに
キーという名前になっています。
キーはダブルクォーテーションで囲むようにして下さい。

#undefined

存在しない配列の要素や存在しないオブジェクトのプロパティを出力すると
undefinedと表示されます。これは定義されていないという意味です。

#push

ES5ではpushメソッドもあります。
配列.push(値)を入れることで配列の後尾に値を代入することができます。

#最後に

初心者ですので、拙い文章や書き方だと思いますが、最後まで見て頂き
ありがとうございました。もし、ご指摘等がございましたらよろしくお願い致します。
FontAwesomeのアイコンの大きさを変更する

#はじめに

FontAwesomeのアイコンをオリジナルアプリに取り入れています。

そこでサイズを変更がなかなかうまくいかなくて時間がかかったので投稿します。

#間違えたこと

```erb
 <div class="review-gear">
   <i class="fas fa-cog"></i>
   <i class="fas fa-trash-alt"></i>
 </div>
```

```.scss

.fas {
       width: 5px;
       height: 5px;
      }
```

![スクリーンショット 2021-07-15 21.49.03（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/b334006d-c932-223f-1fb7-fad816c2055b.png)

変わりませんでした。。。

#正解

```scss
.fas {
       margin-right: 5px;
       font-size: 25px;
     }
```

![スクリーンショット 2021-07-15 21.51.43（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/361e03f3-d92f-f985-9a4a-b18ced0f8305.png)

画像と勝手にとらえてたので勘違いをしていました。
このアイコンは文字ととらえ`font-size`なのかなと思いました。

※正しいやり方かは分かりません・・・
2.6(難) 非負の離散確率変数の期待値 (方針で二重和の計算を解説)

## 方針

初見で解くのは不可能．

```math
k=1+...+1=\sum_{k=0}^{k-1}1
```

であることを用いる．二重和についての公式が必要になるので，シグマの公式や二重和の意味について確認しておく．

### シグマ公式(平行移動)

---

```math
\sum_{i=1}^na_i=\sum_{i=k+1}^{n+k}a_{i-k}
```
上端，下端を同方向にずらして添字を逆方向にずらす．

---

### 二重和の意味

---

1. 全ての要素a_ijの和．

```math
\sum_{i=1}^m\sum_{j=1}^na_{ij}=\sum_{i=1}^m(a_{i1}+...+a_{in})
```


2. i=>jなる全ての要素a_ijの和．

```math
\begin{align}
\sum_{i=1}^n\sum_{j=1}^ia_{ij}&= \sum_{i=1}^n(a_{i1}+...+a_{ii})\\
&= (a_{11})+(a_{21}+a_{22})+(a_{31}+a_{32}+a_{33})+...+(a_{n1}+...+a_{nn})
\end{align}
```

---


### 二重和の計算

---

1. a_ijの総和は可換，

```math
\sum_{i=1}^m\sum_{j=1}^na_{ij}=\sum_{j=1}^n\sum_{i=1}^ma_{ij}
```

2. i=>jなる全てのa_ij (ただし要素は無限) の総和は以下のように可換．

```math
\sum_{i=1}^\infty\sum_{j=1}^ia_{ij}=\sum_{j=1}^\infty\sum_{i=j}^\infty a_{ij}
```
---

## 答案

```math
\begin{align}
\mathbb{E}_{X\sim f_X}[X]&= \sum_{k=0}^\infty kP[X=k]\\
&= \sum_{k=0}^\infty(\sum_{i=0}^{k-1}1)P[X=k]\\
&= \sum_{k=0}^\infty\sum_{i=0}^{k-1}P[X=k]\\
&= \sum_{i=0}^\infty\sum_{k=i+1}^\infty P[X=k]\\
&= \sum_{i=0}^\infty(P[X=i+1]+P[X=i+2]+...)\\
&= \sum_{i=0}^\infty(1-P[X\leq i])\\
&= \sum_{k=0}^\infty(1-F(k))
\end{align}
```

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
Flutter SystemChromeとRotatedBoxが同時に使われた際に混乱したのでメモ

RotatedBoxとSystemChromeで向きを変える処理が同時に走った時に混乱したのでメモ

# まずはRotatedBoxのみで検証

コード

```dart

import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; // rootBundle

void main() {
  runApp(MyApp());
}

// MyApp ウィジェットクラス
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.light(),
      home: const RotatedBox(
       // ここをいじる
        quarterTurns: 0,
        child: Text('Hello World!'),
      )
    );
  }
}

```

quarterTurnsが０なので、まだ回転はしておらず通常のhello worldなのでこんな感じ
![Simulator Screen Shot - iPhone 8 - 2021-07-15 at 21.01.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439295/8eecc461-80b6-f81e-ed6d-585e7a4afd21.png)

quarterTurnsを0から1に変更するとこんな感じ、横に傾けるとちょうど見やすくなる。90度角度を回転しているように見える。

![Simulator Screen Shot - iPhone 8 - 2021-07-15 at 21.03.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439295/14cda233-78b1-762f-7a1b-a3ee301de677.png)

quarterTurnsを1から2に変更するとこんな感じ 1から90度、0から180度入れ替えたうような角度になる。

![Simulator Screen Shot - iPhone 8 - 2021-07-15 at 21.06.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439295/6a8fbf86-d167-0f67-2630-0edd22b694aa.png)

quarterTurnsを2から3に変更すると同じように2の画像から90度,0から数えると270度回転させたようなhello worldが表示される。

## 結論
quarterTurnsを1あげるごとに９０度回転されることになる。

# つぎにSystemChromeとRotatedBoxを同時に使った時の検証

つぎはSystemChrome.setPreferredOrientationsを右向きにしていた際にRotatedBoxによってUIにどんな変化が生まれるか検証する。結論から言うとかなりシンプルで、SystemChrome.setPreferredOrientationsで右向きになったあとRotatedBoxのquarterTurnsの処理が走る。

コード

```dart

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {

  WidgetsFlutterBinding.ensureInitialized();

  SystemChrome.setPreferredOrientations([
    DeviceOrientation.landscapeRight,
  ]);
  runApp(MyApp());
}

// MyApp ウィジェットクラス
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.light(),
      home: const RotatedBox(
        quarterTurns: 0,
        child: Text('Hello World!'),
      )
    );
  }
}

```

SystemChromeはhot reloadだと更新されなかったので再ビルド

上記のコードだとSystemChromeでwidget全てが右に回転するので、下記画像のようになる。
quarterTurnsは０なので、RotatedBoxの回転処理はまだ実行されていない。
![Simulator Screen Shot - iPhone 8 - 2021-07-15 at 21.30.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439295/cb0af35e-871a-dcca-8251-8242db2a6f09.png)

quarterTurnsを1に変更、これもシンプルに考えればよく、SystemChromeで右向きになったhello worldを90度回転させるというようなイメージでok、画像は下記のような感じ

![Simulator Screen Shot - iPhone 8 - 2021-07-15 at 21.37.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439295/25fe0c9c-c123-33a4-47ee-5228e3693e6e.png)

同じようにquarterTurns:2なら右向きから180度、3なら右向きから270度回転するような画像になる。
PC-8001 IOの謎

PC-8001のZ80は8080由来のIOはメモリと別の256のアドレス空間に置けます。

通常この空間に8251や8255をおくわけですが、Z80からINしたときにそのアドレスになにもなくてDATAの信号線がプルアップされていればINは255を返すはずです。

ところがPC-8001のN-BASICで何もいないアドレスをアクセスするとそのアドレスが返ってきます。

```
? INP(254)
254
```

以下のようなアセンブラでUSRで拾ってみると120が返ってきます。

```
   1:				;
   2:				; PC-8001 assembra
   3:				;
   4:				
   5:				
   6:     -	E800'         		ORG	0E800H
   7:     -	E800'         	USR:
   8:    0+7	E800' 4E      		LD	C,(HL)
   9:    7+12	E801' ED78    		IN	A, (C)
  10:   19+7	E803' 77      		LD	(HL), A
  11:   26+10	E804' C9      		RET
```

謎仕様です。

初期のマイコンIOチップの8251や8255などにはIDのようなものを返す機能がありませんでした。このため255が返ってきたときにチップが返したのか、誰もいなくてプルアップが返したのか判別できませんでした。

8086の頃にPlug And Playが出てきてCPUがどんなデバイスがいるのか知ることができるようになりました。
【Rails】HTTPメソッドまとめとPATCHとPUTの違い

####My Profile
プログラミング学習歴②ヶ月目のアカウントです！
プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。
また、プログラミング初学者の方にわかりやすく、簡潔にまとめて情報共有できればと考えています。
もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。　



#対象者

* HTTPメソッドについて知りたい方


#目的


* HTPPメソッドの種類を知る
* PATCHとPUTの違いを知る


#実際の手順と実例
###1.HTTPメソッドのまとめ
メソッド名	　　よく使うアクション	　　　意味
GET	　　　　　Read/new/show/edit	　　 リソースの取得
POST	  　　　     　Create	　　　  　　　　　   子リソースの作成、　リソースへのデータ追加、その他処理
PUT	　　　　　Create/Update	　　　　　リソースの更新、リソースの作成
DELETE	　　　Delete	　　　　　　　　　リソースの削除
HEAD	　　　　　　　　　　　　　　　　	リソースのヘッダ (メタデータの取得)
OPTIONS	　　　　　　　　　　　　　　	リソースがサポートしているメソッドの取得
TRACE	　　　　　　　　　　　　　　　	プロキシ動作の確認
CONNECT	　　　　　　　　　　　　　  	  プロキシ動作のトンネル接続への変更
PATCH	 　　　　Update	
		


###2.PATCHとPUTの違い

**ほとんどの更新処理はPATCHメソッド！**

* PATCHメソッドは箱の中身（一部）を入れ替える
* PUTメソッドは箱ごと（全部）替えて置き換える
【AWS】Node.js 14.xを使って、Lambda関数から他のLambda関数を呼び出す

## きっかけ
とある案件の要件確認MTGをしているときに、
僕:「LambdaAを動かすために定期的にLambdaBを動かす構成」
👦:「LambdaBを定期実行ではなく、条件を満たしていない時だけ動かしたい」
みたいな話があり、そういやLambdaから他のLambdaを動かす方法ってどうやるのか？という疑問から
※ そもそもLambdaから他のLambdaを呼び出すことに抵抗があり、できれば定期実行を軸に進めたいのは本音。フェイルセーフ的な位置づけでロジック自体は実装することになりそうとの考察。(基本は定期実行。なんらかの問題で条件を満たさない場合があればLambda呼び出し実行。) Best Practiceに沿った内容があればコメントください。。。

## 前提
- AWS: 社用アカウント利用

## Summary
- 呼び出す側Lambda関数で、AWS-SDKのインポート、AWS-SDK.Lambdaのインスタンス化、Lambdaインスタンスでinvoke関数の実行
- 呼び出す側Lambda関数のIAMポリシーに "lambda:InvokeFunction"を許可する設定を追加

## 構築Step
1. 呼ばれる側Lambdaの構築、ソース修正
1. 呼ぶ側Lambdaの構築、ソース修正
1. 呼ぶ側Lambdaに紐づくIAMロールの修正
1. 動作確認


### 1. 呼ばれる側Lambdaの構築、ソース修正
- AWS Lambdaのダッシュボードから'関数の作成'を押下
- 以下、添付画像の内容へ変更、'関数の作成'を押下
    - 関数名: test-called-function
    - ランタイム: Node.js 14.x
    - デフォルトの実行ロールの変更: ☑基本的な Lambda アクセス権限で新しいロールを作成
![screencapture-ap-northeast-1-console-aws-amazon-lambda-home-2021-07-12-12_49_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/d1d9fafc-6ff3-3262-3f71-c8473fa8f7e9.png)
- 作成完了後、コードタブでソースコードを以下に修正、デプロイ

```javascript:index.js
exports.handler = async (event) => {
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Called Lambda!'),
    };
    return response;
};
```

### 2. 呼ぶ側Lambdaの構築、ソース修正
- AWS Lambdaのダッシュボードから'関数の作成'を押下
- 以下、添付画像の内容へ変更、'関数の作成'を押下
    - 関数名: test-calling-function
    - ランタイム: Node.js 14.x
    - デフォルトの実行ロールの変更: ☑基本的な Lambda アクセス権限で新しいロールを作成
![screencapture-ap-northeast-1-console-aws-amazon-lambda-home-2021-07-12-12_55_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/65f8a9b7-78e2-128f-694d-824cf9d789cd.png)
- 作成完了後、コードタブでソースコードを以下に修正、デプロイ

```javascript:index.js
'use strict';

const aws = require('aws-sdk');
const lambda = new aws.Lambda();

exports.handler = async (event) => {
    const params = {
		FunctionName: 'test-called-function',
		InvocationType: 'RequestResponse',
	};
	const result = await lambda.invoke(params).promise();
    
    const response = {
        statusCode: 200,
        body: JSON.stringify(result),
    };
    return response;
};
```

### 3. 呼ぶ側Lambdaに紐づくIAMロールの修正
- test-calling-function関数の画面で設定タブ>アクセス権限>実行ロールで記載されているロール名リンクを押下
- IAMロール画面でリンクになっているポリシー名を押下(例: AWSLambdaBasicExecutionRole-XXXXXX)
- IAMポリシー画面で'ポリシーの変更'を押下
- JSONタブに切り替えて、以下のアクセス情報を追加

```json:IAMポリシー
        {
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": test-called-functionのARN (例:"arn:aws:lambda:ap-northeast-1:XXXXX:function:test-called-function")
        }
```

### 4. 動作確認
- test-calling-function関数の画面でテストタブを選択、テンプレート名を適当に入力し、'テスト'を押下
- 実行結果: 成功、　詳細の返却値が以下のようになっていることを確認
- 
```json:レスポンス
{
  "statusCode": 200,
  "body": "{\"StatusCode\":200,\"ExecutedVersion\":\"$LATEST\",\"Payload\":\"{\\\"statusCode\\\":200,\\\"body\\\":\\\"\\\\\\\"Hello from Called Lambda!\\\\\\\"\\\"}\"}"
}
```

### 参考サイト
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/API_Invoke.html

https://qiita.com/spring_i/items/c4b605402360cdfd4c0e
Latex For Mac 表の基本

[目次へ戻る](https://qiita.com/okirakuna_danna/items/5cc04d44ed12480fab31)

## 表
表は`tabular`で定義します。横線は`\hline`で指定し、`{l c|r}`の列指定の`|`で指定しています。列指定では、l（左寄せ）、c（中央：センタリング）、r（右寄せ）を項目の数だけ記述します。 
`\centering`で表を中央寄せ（センタリング）にしています。
縦線、横線は最小限に

```
  \begin{table}[htbp]
    \centering
    \begin{tabular}{l c|r} \hline
      商品名 & 商品コード & 単価 \\ \hline \hline
      液晶テレビ & TV50 & 100,000 \\
      電子レンジ & ER101 & 10,000 \\ \hline
    \end{tabular}
    \caption{タイトル}
    \label{ラベル}
  \end{table}
```

![シンプルな表](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1758523/876538bf-686a-9a08-826a-d08c62113771.png)


[目次へ戻る](https://qiita.com/okirakuna_danna/items/5cc04d44ed12480fab31)
DynamoDBのオペレーションとプレースホルダーについて

##　はじめに
　こんばんは！今回はDVA対策で勉強しているときに出てきたDynamoDBのAPIとプレースホルダー、についてまとめてみました。
　試験で出てくるかは別として、業務で使うことも今後あると仮定して記事にしてきたいと思います！！！

　よろしくお願いします(｡･ω･)ﾉﾞ

##　DynamoDBのCRUD処理
　Amazon DynamoDBでは、項目は属性の集まりです。各属性には名前と値がありまる。属性値は**スカラー値、セット型、ドキュメント型**のいずれかになります。
　DynamoDB は、**作成、読み込み、更新、削除 (CRUD)** の 4 つの基本的なオペレーション機能を提供します。

  ◆DynamoDBのCRUD
　　・**PutItem**    ：作成
　　・**GetItem**    ：読み込み
　　・**updateItem** ：更新
　　・**DeleteItem** ：削除

 この４つ以外にも下記のオペレーションがあります

##　Batch
　大量のデータの書き込みや読み込みをまとめて行うときにPutItemやGetItemによるオペレーションでは非効率な場合があります。その場合に使用するオペレーションを紹介します。

　◆Batch
　　・**BatchGetItem**：大量データの読み込み操作
　　・**BatchWriteItem**：大量なデータの書き込み操作

　BatchGetItemとBatchWriteItemによって並列処理ができて、パフォーマンスの向上が期待できます。一部の項目の書き込み、読み込みが失敗しても処理が継続し失敗した項目は、レスポンスのUnprocessedItemsに含まれるので、失敗原因や失敗処理、場合によっては再試行処理が行われる。

##　Transaction
　複数のテーブルでタイミングを合わせて処理を行いたい場合はTransactWriteItemes、TransactGetItemsを使用する。トランザクションを成立させる必要上、１つでもリクエストが失敗した場合は処理全体を失敗にする。
　
　◆Transaction
　　・**TransactWriteItemes**：複数テーブルへのタイミングを合わせた書き込み処理操作
　　・**TransactGetItems**：複数テーブルへのタイミングを合わせた読み込み処理操作

　この2つの操作は2018年に追加されたオペレーションであり2018年以前はDynamoDBではトランザクションはサポートされていなかった。現在はサポートされているので、認定試験対策として「**DynamoDBはトランザクションをサポートしているNoSQLDB**」である。

##　PutItemについて
　新規項目の追加はPutItemオペレーションで行い同じキーを持つ既存の項目があった場合は、**既存のアイテムがPutItemされたアイテムに置き換える**

##　UpdateItemについて
　DynamoDBテーブルの特定のアイテムの特定の属性のみを更新するときに使用されるUpdateItemオペレーションですが、予約語を属性として使用する場合はプレースホルダーを使用しなければならない。

　◆プレースホルダー
　　**・ExpressionAttributeNames**：予約語を属性として指定する
　　**・ExpressionAttributeValues**：予約語を更新する値

　DynamoDBテーブルにUpdateItemを実行する際に、**オプティミスティックロック**を使用する場合は**ConditionExpression**を使用すると条件付きのUpdateItemができる。

　・**オプティミスティックロック**
　　　更新 (または削除) しているクライアント側の項目と、Amazon DynamoDB の項目を確実に同じになるようにするための手段です。

　・**ConditionExpression**
　　　DynamoDBテーブルにUpdateItemを実行する際にオプティミスティックロックを使用したいときに条件式を指定して使用する場合に使う。

##　GetItemについて
　GetItemではプライマリキーが必須であり、特定の属性や強力な整合性で読み込みたい場合はこれらのパラメーターを使用します。

　**・ProjectionExpression**：取得したい属性の指定
　**・ConsisitentRead**：強力な整合性を指定

##　DeleteItemについて
　キーを指定して項目を削除することができる。

　・**ReturnValues**：削除前の項目の取得をすることができる。

##　おわりに
　今回もお疲れ様でした。仕事終わりに少しづつ書いてきたので全然進みは遅かったですが、また来週も書いていこうとおもいます。

　お疲れ様でした(｡･ω･)ﾉﾞ
「ラビット・チャレンジ（応用数学レポート）」を参考にWolframAlphaとSymPy Liveでやってみたい。

# original link

https://qiita.com/telcchi/items/48cf9a62074283ad488f

##WolframAlphaで
### 第１章：線形代数


(途中勉強中)

#### 固有値・固有ベクトルの求め方

https://www.wolframalpha.com/input/?i=%5B%5B1%2C4%5D%2C%5B2%2C3%5D%5D&lang=ja

固有値:
λ_1 = 5
λ_2 = -1

固有ベクトル:
v_1 = (1, 1)
v_2 = (-2, 1)

対角化:
M = S.J.S^(-1)
ここでのそれぞれの値は以下の通りである
M = (1 | 4
     2 | 3)
S = (-2 | 1
      1 | 1)
J = (-1 | 0
      0 | 5)
S^(-1) = (-1/3 | 1/3
           1/3 | 2/3)


#### 固有値分解
https://www.wolframalpha.com/input/?i=%5B%5B1%2C4%5D%2C%5B2%2C3%5D%5D+%E5%9B%BA%E6%9C%89%E5%80%A4%E5%88%86%E8%A7%A3&lang=ja

結果:
{5, -1}

#### 特異値分解

https://www.wolframalpha.com/input/?i=%5B%5B1%2C2%2C3%5D%2C%5B3%2C2%2C1%5D%5D+%E7%89%B9%E7%95%B0%E5%80%A4%E5%88%86%E8%A7%A3&lang=ja

結果:
M = U.Σ.V^†
ここでのそれぞれの値は以下の通りである
M = (1 | 2 | 3
3 | 2 | 1)
U = (1/sqrt(2) | -1/sqrt(2)
1/sqrt(2) | 1/sqrt(2))
Σ = (2 sqrt(6) | 0 | 0
0 | 2 | 0)
V = (1/sqrt(3) | 1/sqrt(2) | 1/sqrt(6)
1/sqrt(3) | 0 | -sqrt(2/3)
1/sqrt(3) | -1/sqrt(2) | 1/sqrt(6))


#SymPy Liveで
以下のソースコードを貼り付けて、Evaluateです。

https://live.sympy.org/


勉強中
「pythonを便利に使おう第五回！ 数学編!」を参考にWolframAlphaでやってみた。

# original link
https://qiita.com/Garaku49/items/4d2b814670413ad27bc3

##WolframAlphaで
####　第一問　次の定積分を解け

https://www.wolframalpha.com/input/?i=integrate%28sqrt%284*x-x**2%29%2C%28x%2C2%2C3%29%29&lang=ja

定積分:
integral_2^3 sqrt(4 x - x^2) dx = 1/6 (3 sqrt(3) + 2 π)≈1.9132


#### 第二問　次の不定積分を求めなさい。

https://www.wolframalpha.com/input/?i=integrate%28cos%284*x%29*sin%283*x%29%29&lang=ja

別の形:???????

https://www.wolframalpha.com/input/?i=integrate%28cos%283*x%29*cos%282*x%29%29&lang=ja

別の形:???????


#### 第三問　次の不定積分を求めなさい。

https://www.wolframalpha.com/input/?i=integrate%281%2Fsin%28x%29%29&lang=ja

不定積分:
integral1/sin(x) dx = -log(cot(x) + csc(x)) + 定数
(複素数値の対数を仮定しています)

https://www.wolframalpha.com/input/?i=integrate%281%2Fcos%28x%29%29&lang=ja

不定積分:
integral1/cos(x) dx = log(tan(x) + sec(x)) + 定数
(複素数値の対数を仮定しています)
Pythonしか知らない人がGoに入門した時モジュール管理がわからんかった

## 注意
この記事は 2021/03/16 にGoを始めたときに書いた記事です。
あとからもうちょい修正しようと思って寝かしてたんですが、結局直さなかったので
途中までになりますが、載せておきます。

## Goはじめたい理由
噂によるとGoは動作が速いらしいので、PythonのFlaskで書いてたAPIをGoのEchoで置き換えたい。
大体それだけが理由です。()

## 用意したもの
Windows 10
  - Macは持っていないのでとりあえず

Python 3.8.6 windows/amd64
  - いつもよく使っているPythonくん
　- 公式サイトからインストーラをダウンロードして実行しただけ

Go 1.15.6 windows/amd64
　- 割と最近入れたGoくん
　- 公式サイトからインストーラをダウンロードして実行しただけ

VSCode
  - メインで使っているエディタ


## まずはじめにしたこと

Go 入門 でググってみる。
すると [Go言語の初心者が見ると幸せになれる場所](https://qiita.com/tenntenn/items/0e33a4959250d1a55045) が出てきたので
各ページを若干読んでみることとした。

この中だと、友人いわく [A Tour of Go](https://go-tour-jp.appspot.com/welcome/1)がおすすめとのことらしいが、とりあえず何かしら作ってみないと構文を覚えられる気がしないので、ハローワールド、BMI、ガチャを作ってみることにした。

## VSCodeを設定しよう
VSCode → 拡張機能タブ → Goと検索 → 一番上に出てくる拡張機能をインストールする。
その時点で Goが綺麗に表示されるようになるはず。

よくわからないがおすすめっぽいので、[Go言語をVSCodeで開発する環境をインストールする](https://wp.go-sign.info/setup-golang-and-vscode/)を読んで、拡張機能の依存関係もインストールした。


## Helloworldをしよう
まぁこれは一瞬でできる。見た通りだよなって感じだったので特に苦労していない。

```golang:main.go
package main

import (
	"fmt"
)

func main() {
	fmt.Println("Hello world!")
}
```
このファイルをVSCodeで作って保存する。
そして、F5キーを押すと実行されて Hello world! と出るはず。



## Hello world! という文字を 別モジュールから読み出したい
ハローワールドはわかったが、よくあるやつすぎて面白くないので、 Hello world! って文字列を 別ファイルから読み出したくなった。


### Pythonではpip Goでは Go modules が定番?
チュートリアルの一部では GOPATH がどうこうという話が出てきていたが、 最近(Go 1.11以降)では Go modules という依存関係管理ツールが使われることが多いらしい。[Go言語の依存モジュール管理ツール Modules の使い方](https://qiita.com/uchiko/items/64fb3020dd64cf211d4e)を読んで、やってみようとした。

とりあえずまず、コマンドプロンプトで ```go env -w GO111MODULE=on ```する。
次に main.goと同じフォルダ内で、 fixed_valueというフォルダを作り、 ```go mod init fixed_value``` してみた。
すると、go.mod というファイルができて、モジュールとして扱ってくれるようになる。
最後にパッケージとして

```golang:fixed_value/fixed_value.go
package fixed_value

var Message string = "Hello world"
```
っていうのを作ってみた。

これをmain.goで読み出したいので

```golang:main.go
package main

import (
	"fmt"

	"./fixed_value"
)

func main() {
	fmt.Println(fixed_value.Message)
}
```

### Pythonの```__init__.py```みたいには動かない
で、実行してみると ```build command-line-arguments: cannot find module for path _/D_/Documents/Gits/go-practice/helloworld/fixed_value``` と怒られてしまった。 どうやら Pythonの ```__init__.py``` のつもりで パッケージフォルダ内に置いても動かないようだった。 (VSCodeのlintが起きてる場合はそもそも保存させてくれなくて実行できない)

### じゃあどうするの?
相対インポートというものは、許されざる悪みたいな立ち位置にいるらしく、絶対インポートしないとダメらしい。
絶対インポートと言っても、フォルダのパスではなく、リポジトリのパスを入れるってことらしい。

### リポジトリを使う絶対インポート??
まずさっき 作った fixed_value/go.mod は削除する。その上で 直下に改めて go.modを作成する。 その際には、 ```go mod init github.com/Dosugamea/go-practice/helloworld``` というようにリポジトリ名(+必要ならフォルダパス) を付ける。 これで go.modを作った。じゃあどうやって main.goからfixed_valueをインポートをするのかというと以下のようにする。

```golang:main.go
package main

import (
	"fmt"

	"github.com/Dosugamea/go-practice/helloworld/fixed_value"
)

func main() {
	fmt.Println(fixed_value.Message)
}
```
これでいざできたと思って実行しようとすると、実は実行できない。先に go.mod と fixed_value を コミットして リポジトリにプッシュした後で初めて main.goが実行できるようになるようだ。 go.modの中で Replaceという細工をして、相対インポートをさせる方法もあるが、リポジトリにプッシュしてしまうのが一番丸いらしい。


これでなんとなく Goでのモジュールの扱い方がわかった。gg。
ALBでのCookieによる振り分け設定

#まず始めに

この記事はAWSのALBでのCookieによる振り分け設定をまとめたものです。
　
#ALB(Application Load Balancer)の振り分け
 基本的な説明は省略します。(こちらを[参照](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/introduction.html)ください。)
まずAWSでのLB作成の際には主に以下の種類があります。
・**ALB(Application Load Balancer)**
　...HTTP,HTTPSのトラフィックをリクエストレベルで動作し、高度なルーティング設定が可能です。
・**NLB(Network Load Balancer)**
　...大規模なTLSオフロードやアプリケーションの性的IPが必要な場合に、
　　　接続レベルで動作し、低いレイテンシーで大量のリクエストを処理できます。
・**GLB(Gateway Load Balancer)**
　...ファイアウォール、侵入検知・防止システムなどの仮想アプライアンスをデプロイスケーリング管理できます。
・その他(Classic Load Balancerなど)
　...EC2-Classic ネットワークで既存のアプリケーションを実行している場合に使用します。

今回はHTTPSでのリクエストを振り分けのためALBを使い、条件にCookieを用いる方法をご紹介します。

#HTTPSリクエスト振り分け
　基本的にAWSでALBを作成する際にリスナー(設定したプロトコルとポートでの接続リクエストをチェックするプロセス)も一緒に作成します。プロトコルはHTTPもしくはHTTPSを選択できますが、HTTPSの場合、証明書も必要です。
　リスナーのデフォルトアクション(追加した条件に当てはまらない場合)を設定するため、ターゲットグループ(1つ以上のルーティング先を含めたもの)も作成します。

　
#Cookieによる振り分け
　ターゲットグループ1にアプリケーションa,アプリケーションbを設定し、負荷分散を行っているとします。
アプリケーションaでリクエストを処理したあと、再度同じアプリケーションaにリクエストを送りたい際に、このままではアプリケーションbに送信される可能性があります。
そのため、リスナールール(リクエストごとにチェックする条件)にアプリケーションで付与したCookieをしようして、振り分けたいと思います。

まず、ターゲットグループ2(アプリケーションaのみリクエスト送信)とターゲットグループ3(アプリケーションbのみリクエスト送信)を作成します。
アプリケーションで付与するCookieがそれぞれapl=a,apl=bとします。
リスナールールにHTTPヘッダでCookieがapl=aのときにターゲットグループ2にルーティング、
HTTPヘッダでCookieがapl=bのときにターゲットグループ3にルーティングする2つのルールを作成します。
以上で振り分け設定は完了です。

検証方法としては下記のcurlコマンドでCookieを自由につけて検証が可能です。
```curl -H 'Cookie:apl=a' [URL]```

####追記
　上記で作成したリスナールールだとCookieが複数あった場合にうまく振り分けされない。
　(原因としては複数のCookieを一つのヘッダとして送るため。)
　そのため、ヘッダの条件部分を\*apl=a\*とすることで振り分け可能。


#最後に
　今回はALBでのCookieによる振り分け設定を簡単にまとめてみました。
　同じターゲットグループにリクエストをしたい場合に
　Cookieを用いずとも、ALBの[スティッキーセッション機能](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/sticky-sessions.html)をしようして行う方法もあります。
セッション維持の期間なども細かく設定できるため、またいずれまとめようと思います。
最後まで読んでいただきありがとうございました。
報連相のやり方をフローチャート図で作成してみた

#報連相のやり方をフローチャート図で作成してみた

入社3年目までの若手の方へ
報連相難しいですよね。私も苦手です。
学生時代には経験したことがないことですから。

でも安心。
この流れに乗っ取れば、少なくとも報連相が出来ないヤツと思われることはないでしょう。
設計だろうが開発だろうがテストだろうが、どんな業務内容でも適用できる気がします。

画像が小さくて見にくいと思うので、適宜拡大してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413385/bdce3bb8-b126-508b-072b-b08d9061774f.png)


##最後に
ちょくちょく論理的におかしいところ(再見積もりしたらわからないことがでてこない前提になっているなど)がありますが、許してください笑

あとは、タスクは割り当てられるのではなく、WBSで既に決まっている場合もありますね。

もっと良い報連相のやり方があるって方がいましたら、コメント欄で共有いただけるとうれしいです。
ECSのコンテナ内のディレクトリを、ローカルにコピーする

AWSのECSで、「コンテナ内の特定ディレクトリをローカルに落としたい！」という機会があったので書いときます。

- sshをして、
- ssh先にコピーをして、
- ローカルに落とす。

そんな手順でやればできますね。

## sshログイン

```
$ ssh -i <キーのある場所>/<キーの名前> <インスタンスのユーザー名(ec2-userとか)>@<ssh先のパブリックIP or DNS>
```

セキュリティグループでsshの設定をし忘れてると、Connection timed outになりますね。

## dockerからssh先にコピー

ssh先で

```
$ docker ps
$ pwd

$ docker cp <dockerコンテナ名>:<docker内のコピーしたいディレクトリのパス> <ssh先のコピーファイルを仮置きするパス>
```

docker cpコマンドはファイルでもディレクトリでもオプションなしで問題ないです。

## ssh先からローカルに落としてくるコマンド

ローカル環境で

```
$ scp -i <キーのある場所>/<キーの名前> -r <ssh先のパブリックIP or DNS>:<ssh先のコピーファイルを仮置きするパス> <ローカルのファイルを置きたいパス>
```

しょうもないのですが、sshしている中からscpコマンドを叩いて少しハマってました。
ssh: connect to host <IPアドレス> port 22: Connection timed outが出ていたので、「あれ？sshってそこまで遅いんだっけ？」とか思ってました...
WPFで既定のアプリでファイルを開く方法

#はじめに
既定のアプリでファイルを開くというのは、Windowsを使っていると当たり前のような機能なのですが、WPFで実現しようとするとどうすればいいの？と思ってしまいます。
調べていくと、[ファイルに応じた既定のアプリの起動](https://docs.microsoft.com/ja-jp/windows/uwp/launch-resume/launch-the-default-app-for-a-file)というMicrosoftのドキュメントがありました。
ところが、これ、UWPのAPIを使用しています。つまりWPFではないわけです。
ということはWPFでUWPのAPIを使用できるようにすればいいということです。

#UWPのAPIをWPFで使用できるようにする
実装方法ですが、.NetFrameworkを使用している場合と、.NET5を使用している場合とでは異なるようです。

##.NetFrameworkの場合
Microsoft.Windows.SDK.ContractsというNuGetパッケージをインストールします

##.NET5の場合
プロジェクトファイルを以下のように設定します

```C#
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Library</OutputType>
    <TargetFramework>net5.0-windows10.0.17763.0</TargetFramework>
    <UseWPF>true</UseWPF>
  </PropertyGroup>
</Project>
```
TargetFrameworkのところがポイントで、

* net5.0-windows10.0.17763.0の場合は Windows 10 Version 1809
* net5.0-windows10.0.18362.0の場合は Windows 10 Version 1903
* net5.0-windows10.0.19041.0の場合は Windows 10 Version 2004

となります

この設定の留意事項としては、プロジェクトのプロパティの対象フレームワークがグレー表示になるところです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/49c37609-92a5-02d0-9252-ed7ce8beb9c4.png)

#既定のアプリでファイルを開く
これでWPFでも利用できる環境が整ったので実装ですが、これはシンプルで、以下のコードを使うだけ

```C#
IStorageFile file = await StorageFile.GetFileFromPathAsync(filePath)
await Windows.System.Launcher.LaunchFileAsync(file)
```
この引数のfilePathで開きたいファイルのパスを指定します

以上で完了です。
実装はとても簡単なのですが、ここまでたどりつくのにいろいろと調べたりと、時間がかかったので、同じような方がいればその助けになればと思います。
シートをコピー (Copy Sheet)アクティビティの謎

この記事はUiPathブログ発信チャレンジ2021サマーの15日目の記事です。

:::note info
※こちらに記載の内容は、某社内環境にて独自に確認したものです。公式な情報ではないことをご了承くださいませ。
それでもこれを記事にしようと思ったのは、何人か同じ事象で悩み、時間を費やしていたことがあったため、モヤっとを解消するかもしれない１つの情報として記載させて頂きます:bow:
StudioのVersionは2020.10.4で検証しております。
:::

##シートをコピー (Copy Sheet)アクティビティが「正しく」動作しない
StudioのExcelアクティビティパッケージに含まれている**「シートをコピー (Copy Sheet)」アクティビティ**を使われたことはありますでしょうか？
https://docs.uipath.com/activities/lang-ja/docs/excel-copy-sheet

見ての通り、Excelのシートをコピーするために使用するアクティビティで、結構使う場合も多くあります。
ただ、公式ページにも記載のある通り、officeのバージョンによっては正しく機能しないという注意書きがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356722/9553621a-1ea8-4846-3fe2-449bd0c0c175.png)
この表現、開発者的にはめちゃくちゃ引っ掛かるんですよね。
~~「正しく」ってなんやねん！「正しくない」ってどういう動きやねーーーん！~~
というのは置いておいて。。。、

さらに、office2016でも**正しく**機能しないことが判明しました。
ということで、何がダメなのか、検証しました。

##何ができて何ができないのか？
####Case1：コピー元シートとコピー先のブックが同じ場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356722/2496eed8-129d-e95e-0e6f-e87d4f43f067.png)
<font color="Gray">※サンプルソースの注釈には、同じブックで使えると書いてある・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356722/af2da598-9fa7-fb46-3553-66e092c26208.png)

####Case2：コピー元シートとコピー先のブックが異なる場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356722/57c7c2b1-da2f-834a-dfaf-aa10c3718749.png)
無事にExample2.xlsxファイルの方にシートがコピーされていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356722/69bb7119-1df3-95af-d320-315d084f4e28.png)

##推測される挙動　※あくまでも勝手な推測です。
どうやら最初のエラーは自分(Excel)をもう一度開こうとしているような感じがします。
自分自身を別物として再認識しようとしてうまくいかず、キャストできない！って怒ってる状態のようです。
Excelのバージョン依存で動かないという理由もこのあたりにあるのかもしれない。
そして、Excelの仕様として、内部的な処理として2019では同じファイルを開くことができるようになったってことかもしれない。🦆🦆🦆

##最後に
勝手な深掘りにお付き合い頂き、ありがとうございました。スッキリしてくださった方が1人でもいらっしゃればいいなぁと。
（自分的にスッキリなので、1人カウントしちゃおう！）

##補足
・Excel2019の場合、同じブックでもコピーすることが出来ました。
・かんたんExcelパッケージの「シートをコピー(同じブック内)」を使用するとExcel2016でも同じブックでコピーすることが出来ました。
[Docker + Rails] Webpackerのインストール時のエラー解決方法

# 概要
Docker + Rails環境でSprocketsからWebpackerに移行作業時にWebpackerをインストールするまでのエラーにハマってしまったため、解決方法を紹介します。
暫定的対応のため、本来のエラー解決方法をご存知の方はコメント下さると幸いです。

# 環境
- ruby 2.6.3
- Rails 5.2.3
- docker

# エラーが起こるまで
1. Dockerfileにyarnを使用するための記述追加
1. Gemfileに```gem 'webpacker'``` 追加
1. docker-compose run web bundleにてgemインストール  
**\  エラー発生 /**

````
webpack binstubs not found.
Have you run rails webpacker:install ?
Make sure the bin directory or binstubs are not included in .gitignore
Exiting!
ERROR: 1
```


エラー文にある
```rails webpacker:install``` は```webpacker```のインストール完了後に実行するつもりだったし、
```.gitignore```  にbin/以下を無視するような記述を加えてないし。。。という感じでハマりました。

# 解決方法
① ```bin/``` に```webpack```という名前で空のファイルを生成後に```docker-compose run --rm web bundle```実行。（webpack binstubs not found.と言われているので） 


**\ エラー文が変わった! /**

```
Configuration config/webpacker.yml file not found. 
Make sure webpacker:install is run successfully before running dependent tasks
ERROR: 1
```

②エラー文に従い、``config/webpacker.yml``作成
   
- ファイルの中身は[github](https://github.com/rails/webpacker/blob/master/lib/install/config/webpacker.yml)からコピペで。

③ ```docker-compose run --rm web bundle```実行。
 
- gemインストール完了！

④```docker-compose run --rm web bundle exec rails webpacker:install```実行にて、Webpackerをインストール。

- ①、②で作成したファイルを上書き出来ます。


以上が解決手順です。

# 終わりに
本来```bin/webpack```も```webpacker.yml```もwebpackerインストール時に自動生成されるもののため、何故手動生成する必要があったかモヤモヤしています。
もしわかる方いらっしゃいましたら教えてください！！

# 参考情報
https://qiita.com/junara/items/28fbc5e4d2ba6a162d24
[Rails5.2 + Docker環境にVue.js (Webpacker) を導入する](https://remonote.jp/rails-docker-vuejs-construction)
【Laravel】DBから取得したCollection型の空判定

# はじめに

PHP、Laravel初学者である私だが、他の方のコードをレビューする機会があった。
そこで、Collection型と配列で空のチェックが異なることを知ったため、ここに記載する。

# 結論

Collection型と配列の空を判定する方法は以下の通り。

### ■ Collectionの空チェック

```PHP
$collection = collect([]);
$collection->isEmpty(); // true
```

### ■ 配列の空チェック

```PHP
$array = [];
empty($array); // true
```


# 詳細

Collection型は、LaravelにあるObject型の一種であり、配列のラッパーである。例えば、DBから値を複数取得した結果（クエリビルダ等を用いた際）の型がCollectionである。また、Collection型にはメソッドが存在しており、今回は、Collectionが持っているメソッドを用いて空かどうかを判定している。



### ■ 備考

因みに、今回は`isEmpty()`を紹介したが、`isNotEmpty()`も存在する。
他にも、Collectionのメソッドは複数あるため、興味があれば以下公式ページを参照して欲しい。

https://readouble.com/laravel/5.8/ja/collections.html
Intel oneAPI で並列計算環境構築 (Fortran + MPI + parallel HDF5 + FFTw)   

# 研究を始めたての４年生〜大学院生向けにLinux (CentOS7)での並列計算環境構築についてまとめる。 
この記事ではIntel Fortranで並列版HDF5をソースからビルド(コンパイル)します。もちろん、Intel Cコンパイラも動きます。

:::note 
余裕があるときに行ってください。3-4時間作業は覚悟！
:::

:::note
(更新@2025 Apr.)  → Rocky Linux 9.5で環境構築しました．
mpiifort と mpiicc のままでは，
`C compiler cannot create executable`
というエラーで詰まります．
mpiifx と mpiicx に読み替えて以下を実行して下さい．(注) mpifcではなくmpiifxです．
(参考) https://www.hpc.co.jp/tech-blog/2023/12/06/intel-oneapi-2024-released/
:::

>(追記) Windows10 Linux Subsystem UbuntuではaptでIntelOneAPIをインストールできるが、HDF5をビルドするときに改行コードの問題でconfigureでエラーが出て通らないので、工夫する必要がある（調査中）。
　とりあえず、簡単に並列環境(gfortran + MPI + parallel HDF5)を構築するならば、以下でOK (Ubuntu用). 
`$ sudo apt install mpich libhdf5-mpich-dev`


##  base toolkit と HPC toolkit のダウンロードとインストール
こちらの[記事](https://qiita.com/implicit_none/items/35bc4be8f2022903747a)を参考に頑張る（１時間位かかる）。（インストール方法は Web & localで良い。）

出くわしたトラブルと対処については以下のようにメモを残しておくので、参考にしてください。
>nss.x86_64, nss-devel.x86_64を探してインストール. 
>>まだ，nssライブラリがないと言われるが無視してインストールを継続
>>>GPUを使うにはOpenCVなどのインストールが必要だそうだが，時間がかかりそうなのでスキップ．

`$source /opt/intel/oneapi/setvars.sh`
でIntelの環境を読み込んだあとに
`$which mpiifort`
でmpiifortへのパスが通っているところまで確認して以下へお進みください。

## parallel HDF5を自分でコンパイルしてIntel 環境で利用する
HDF5 source codeを以下からダウンロード
https://www.hdfgroup.org/downloads/hdf5/source-code/

解凍する

```bash:tar
tar zxvf hdf5-1.12.1.tar.gz
```

解凍フォルダへ移動

```bash:cd
cd hdf5-1.12.1
```
インストールフォルダの指定, オプションを設定

```bash:configure
$./configure --prefix=/opt/hdf5-1.12.1_oneAPI --enable-shared --enable-fortran --enable-parallel CC=mpiicc FC=mpiifort
```
> 
```
 configure: error: C++ preprocessor "/lib/cpp" fails sanity check
```
というエラーには`$sudo yum install gcc-c++`

```bash:make
$make
```

> makeには時間がかかるので5分くらい放置

インストールをsuで行い、他のユーザーも利用できるようにする。

```
$su -
```
>rootになってから mpiへのパスを通っているかを確認しておく．
>>rootでパスが通ってなければ、ライブラリのリンクに失敗するので、rootになった後でも`$source /opt/intel/oneapi/setvars.sh`

```
$make install 
```

>うまくいかない場合は、/opt/hdf5-1.** のフォルダを消して再度やり直す。
>> やり直す場合は、 `./configure` の前に `$make clean`をしてから。
>>> hdf5-1.**/binへのパスを.bashrcに書いてしまっていたらパスを元に戻してターミナルを再起動してやり直す。

## `.bashrc`にパスの設定を書く
最後に、パスの設定

```bash:.bashrc
export PATH="/opt/hdf5-1.12.1_oneAPI/bin/:$PATH"
```
これで完了です。
`$ which h5pfc`
で確認。
intel のコンパイルオプション`-xCORE-AVX512`が使えたらOK.
週刊Transformer（画像認識向け）６号

凄まじい勢いで増殖中のTransformer論文＋αにとりあえず、目を通しつつコメントを残していく。内容があっている保証はない。

[An Alternative Practice of Tropical Convolution to Traditional Convolutional Neural Networks](https://arxiv.org/pdf/2103.02096.pdf)
CNNの掛け算を足し算に、足し算をmin/max operationsにすることで計算を高速化。

[Vision Transformer Pruning](https://arxiv.org/pdf/2104.08500.pdf)
ViTで重要ではないFeatureをPruneする。

[How many degrees of freedom do we need to train deep networks: a loss landscape perspective](https://arxiv.org/pdf/2107.05802.pdf)
必要な次元に関するTheoreticalな説明。

[CMT: Convolutional Neural Networks Meet Vision Transformers](https://arxiv.org/pdf/2107.06263.pdf)
CNNとTransformerのHybrid。かなり小さくてSOTA。

[Per-Pixel Classification is Not All You Need for Semantic Segmentation](https://arxiv.org/pdf/2107.06278.pdf)
FAIR論文。SSもinstance segmentationのmask classificationと考えることができる。新しくDETRっぽいMaskFormerと言うのを考えた。SSとpanoptic segmentationでSOTA。

[A Generalized Lottery Ticket Hypothesis](https://arxiv.org/pdf/2107.06825.pdf)

[Is MLP-Mixer a CNN in Disguise?](https://wandb.ai/wandb_fc/pytorch-image-models/reports/Is-MLP-Mixer-a-CNN-in-Disguise---Vmlldzo4NDE1MTU)
MLP-mixerをCNNと言うかどうか？　まあ、結局、言葉をどう定義するかだよね？　

---

[Local-to-Global Self-Attention in Vision Transformers](https://arxiv.org/pdf/2107.04735.pdf)
ViTの同じLayer内で、近くを細かく見て、遠くをざっくり見る。

[MULTI-LAYER HEBBIAN NETWORKS WITH MODERN DEEP LEARNING FRAMEWORKS](https://arxiv.org/pdf/2107.01729.pdf)
Hebbian networkを簡単に学習する方法

[Industry and Academic Research in Computer Vision](https://arxiv.org/pdf/2107.04902.pdf)
どこがどんな論文を出しているか。Industry強い。

[A Survey of Uncertainty in Deep Neural Networks](https://arxiv.org/pdf/2107.03342v1.pdf)
DNNの自信についてのSurvey

[Hyperparameter Optimization: Foundations, Algorithms, Best Practices and Open Challenges](https://arxiv.org/pdf/2107.05847.pdf)
ハイパラを探す手法のSurvey
【React】faviconの設定をする

<h2>画像を作る、探す</h2>
設定したいfaviconの画像を作ったり探したりします。
今回はすでに作成されているものをこちらのサイトからお借りします。

https://icooon-mono.com/

なお、ブラウザによってfaviconで使う画像サイズが違うため、対応させたいブラウザのサイズにしましょう。
すでに設定したい画像がある場合も、画像サイズの調整をしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927880/232732a6-ceb4-5029-925d-403636bf8c4b.png)
画像引用:　https://sdesignlabo.com/web/favicon/



ちなみに、オリジナルのものを作成したいときは、こちらのサイトでも作成できるようです。

https://iconsflow.com/

https://ao-system.net/favicon/

https://iconifier.net/


<h2>実装方法</h2>
今回はReactで実装していきます。
実装方法は2ステップ。

まず、設定したい画像を配置します。
配置するディレクトリは、public直下になります、

2つ目にpublic直下のindex.htmlファイルのfaviconを設定している箇所を修正します。
初期値は「favicon.ico」で、最初に配置した画像の名前が同様ならこのステップは必要ありません。

```html:index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />#ここを設定したい画像の名前にする
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="theme-color" content="#000000" />
    <meta
      name="description"
      content="Web site created using create-react-app"
    />
    <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
    <!--
      manifest.json provides metadata used when your web app is installed on a
      user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
    -->
    <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
    <!--
      Notice the use of %PUBLIC_URL% in the tags above.
      It will be replaced with the URL of the `public` folder during the build.
      Only files inside the `public` folder can be referenced from the HTML.

      Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
      work correctly both with client-side routing and a non-root public URL.
      Learn how to configure a non-root public URL by running `npm run build`.
    -->
    <title>React App</title>
  </head>
  <body>
    <noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="root"></div>
    <!--
      This HTML file is a template.
      If you open it directly in the browser, you will see an empty page.

      You can add webfonts, meta tags, or analytics to this file.
      The build step will place the bundled scripts into the <body> tag.

      To begin the development, run `npm start` or `yarn start`.
      To create a production bundle, use `npm run build` or `yarn build`.
    -->
  </body>
</html>

```


これでfaviconの設定が完了です。アプリを起動して実際に確認してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927880/157d2856-9122-d23a-8864-32e1030cc010.png)


<h2>参考</h2>
https://qiita.com/yono2844/items/6853470460ecbf1ce6c9

https://sdesignlabo.com/web/favicon/
[Python]PDFから表を抽出し、CSV/Excel保存・グラフ描画する方法 メモ

* Pythonライブラリ`tabula-py`を利用し、PDFから表を抽出し、CSVやExcel形式で保存する方法やグラフ描画する方法についてメモする※n番煎じ記事

## 事前準備

* tabula-pyインストール

  ```shell
  pip install tabula-py
  ```

  ※Java1.8以上の環境で動作する
  ※その他pandasなどのライブラリも必要に応じてインストールする。

## 実装

* 経済指標情報が記載されているPDFファイルから失業率の表を抽出。
* 抽出結果をCSV,Excelファイルとして保存。
* 抽出結果をグラフ化する。

* `test.py`

```python
import tabula
import pandas as pd
import matplotlib.pyplot as plt

# テストPDFデータ:主要経済指標/2.2 失業率
pdf_path = 'https://www.mofa.go.jp/mofaj/files/100053858.pdf'

# PDFから表をDataFrame型のListで抽出
# ※全頁の表を抽出したい場合は、pages='allを指定する
dfs = tabula.read_pdf(pdf_path, stream=True, pages=9)

### CSV保存 ###
dfs[0].to_csv('失業率.csv', index=None)

### Excel保存 ###
dfs[0].to_excel('失業率.xlsx', index=None)

### グラフ描画 ###
# 1. データ整形
# 日米独の2016~2020年のデータを英語表記にして抽出
target = dfs[0].iloc[0:5, 0:4].rename(columns={'Unnamed: 0': '',
                                               '日': 'Japan',
                                               '米': 'USA',
                                               '独': 'Germany'}, index={0: '2016', 1: '2017',
                                                                       2: '2018', 3: '2019', 4: '2020'})
target = target.drop('', axis=1)
print(target)
# 2. グラフ描画
target.plot(marker="o")
plt.title('Unemployment Rate')
plt.xlabel('Year')
plt.ylabel('Rate')
plt.show()
```

### 実行

```
python test.py
```

```
      Japan  USA  Germany
2016    3.1  4.9      4.1
2017    2.8  4.4      3.8
2018    2.4  3.9      3.4
2019    2.4  3.7      3.1
2020    2.8  8.1      3.8
```

![uer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/8a746ed0-66e6-926d-c5d4-9926363d7684.png)

## 参考情報

* [chezou](https://github.com/chezou)/[tabula-py](https://github.com/chezou/tabula-py)

* [主要経済指標※テストデータ](https://www.mofa.go.jp/mofaj/files/100053858.pdf)
floatプロパティとclearfixの使い方

##floatプロパティとは？
 要素を横並びに配置することができるCSSコード。

####書き方
float: 値；

「値」には、
・left…左寄せ
・right…右寄せ
以下2つを使うことはあまりない。
・ none…フロートやめる
・ inherit…継承させる

例）
以下のように横並びしたい時は…。
対象のクラスにfloat: left；。要素の２つともに記述すること。
![スクリーンショット 2021-07-15 19.14.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1162001/a38cd655-3f94-d83e-7641-8138c2ce54de.png)


##floatの解除 ***-clearfix***　***-clearプロパティ***
floatの解除する理由は、floatプロパティによる回り込みを防ぐため！！
なので、clearfixという解除用classを親要素へ与え、子要素のfloatを解除することを行う。


clear fixの書き方

``````css
.clearfix::after {
    content: " ";
    display: block;
    clear: both;
}
`````

* clearfix::after…clearfixクラスの後ろ(after)に対しての要素に下記のCSSを適用するという意味。

* content: “”;…「” “」の間に文字を入れる。

* display: block;…指定された範囲をブロック要素に変換。

* clear: 値;…値に入力された側に寄せられた要素に対する回り込みを解除。
both;【左寄せも右寄せも解除】
left;【左寄せされた要素に対する解除】
right;【右寄せされた要素に対する解除】
Google Cloud のIAMについて

#### 

![スクリーンショット 2021-07-15 19.21.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/df40c21a-ad61-84d5-80db-1f207d62c4e5.png)


```
https://cloud.google.com/iam/docs/overview?hl=ja
```

GCP IAMにはよりきめ細かいRoleがあります。
各GCPサービスには、独自の定義済みのRoleがあり、Roleを適用できる対象が定義されています。
たとえば、Compute Engineでは、仮想マシンをサービスとして提供しており、複数の定義済みRoleが用意されています。

それらは特定のプロジェクト、特定のフォルダ、組織全体のCompute Engineリソースに適用できます。

Compute EngineのInstanceAdmin役割を持つユーザーは、VMに対して特定の操作を行うことができます。
たとえばVMの一覧表示、構成の読み取りと変更、VMの起動と停止です。

多くの会社では最小権限のモデルを使って、各メンバーに必要最小限の権限のみを付与していると思います。
たとえばInstanceOperator-Roleを定義して、特定のユーザーにCompute EngineとVMの起動と停止を許可し、再構成は許可しないとします。

Custom Roleを使えばこれを実現できます。ただし注意点があります。
第一に、Custom Roleを使うことについて、明確に決める必要があります。権限の管理が必要になるからです。
第二に、Custom Roleを使用できるのは、プロジェクトまたは組織レベルのみです。フォルダレベルでは使用できません。

権限を付与する対象がユーザーではなく、Compute Engine VMだとしたら？その場合はサービスアカウントを使用します。
たとえばVMで実行しているアプリのデータを、Google Cloud Storageに保管するとします。

そのデータへのアクセスは、インターネット上の全員に許可するのではなく、VMだけに許可します。
そこで、Cloud Storageに対してVMを認証するためのサービスアカウントを作成します。

サービスアカウントの名前はメールアドレスにします。ただし、パスワードではなく、暗号鍵でリソースにアクセスします。

サービスアカウントにCompute EngineのInstanceAdmin役割が付与されているとします。
VMで実行中のアプリはこのアカウントを使って、他のVMを作成、変更、削除できます。

サービスアカウントの管理について。
たとえば Aが特定のサービスアカウントで、実行可能な操作を管理するとします。

一方、Bは表示さえできれば十分であるとします。サービスアカウントはIDであると同時に、リソースでもあるため、IAMポリシーをそれ自体に適用できます。
サービスアカウントでAには編集者の役割を、Bには閲覧者の役割を付与できます。

さらに複雑な例を紹介します
Compute Engineの複数のVMにまたがって、実装されたアプリがあるとします。

あるアプリコンポーネントには、別のプロジェクトでの編集者役割が必要ですが、他のコンポーネントには不要です。
そこで２つのサービスアカウントを作成します。VMのサブグループごとに１つ作成します。

この場合、最初のサービスアカウントにだけ、別のプロジェクトでの権限を与えます。
これで、アプリのコードが誤っていたり、VMが感染したりしたとしても、その影響を軽減できます。
YOLOv4 を iOS で動かそうとして残念だった話

## はじめに

iOS でとにかく速く正確に動くモデルを模索する今日この頃

こちらの素晴らしい記事を参考に YOLOv4 を動かしてみたのですが、、、

https://qiita.com/TakaoNarikawa/items/e4521fd8c7a522e9d4fd

## 実行環境

- macOS Big Sur 11.4（20F71）
- XCode 12.5.1 (12E507)
- iPhone SE2
- coremltools 3.3 , 4.1

## クラッシュ

上記記事を参考にモデルを変換し、 `yolov4.mlmodel` を手に入れました

嬉々として動かしてみたところ、、、

![スクリーンショット 2021-07-15 19.09.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/876fa410-ce1a-771e-0ba9-aa5d717e01fc.png)

実行時に見事にクラッシュしました

念の為、 coremltools の 3.3 と 4.1 のそれぞれで変換しましたが、どちらもダメです

なぜ？

## 調査結果

調べてみると、 coremltools の Issues に行き当たりました

https://github.com/apple/coremltools/issues/932#issuecomment-705081682

どうも現在の環境でカスタムレイヤーがあるとダメのようです

## 修正

以下のように修正することで動作しました

※付随して修正が必要なところもありますが省略します

```swift
  let model = yolov4()

  public init() { }
```

```swift
    let model: yolov4?

    public init() {
        let config = MLModelConfiguration()
        config.computeUnits = MLComputeUnits.cpuAndGPU
        let url = Bundle.main.url(forResource: "yolov4", withExtension: "mlmodelc")!
        let mlmodel = try! MLModel(contentsOf: url, configuration: config)
        self.model = yolov4(model: mlmodel)
    }
```

コンフィグに指定している `config.computeUnits = MLComputeUnits.cpuAndGPU` は、モデルが CPU もしくは GPU しか使わないようにするものです

より高速な Neural Engine は使わないようになります

https://developer.apple.com/documentation/coreml/mlcomputeunits/cpuandgpu

動きましたが、iPhone SE2 で ６ FPS　程度しか速度が出ず

結局、別のモデルを使った方が良さそうです