OmniAICreator/Qiita-1.07M huggingface dataset:
Goのスライスを直感的に理解した

## はじめに
Go言語の基礎文法を勉強していますが、スライスの処理の仕方がイマイチわかりませんでした。解説を見ても配列のインデックスを気にしながら指を折って数える始末・・・。

しかし、直感的に考えるコツを見つけたのでシェアします。
以下は`A Tour of Go` のスライスの解説。

> コロンで区切られた二つのインデックス low と high の境界を指定することによってスライスが形成されます。
>これは最初の要素は含むが、最後の要素は除いた半開区間を選択します。

```
a[low : high]
```

## 実践
では実際にどのようなスライスの挙動が展開されるかというと以下の具合です。

```go
package main

import "fmt"

func main() {
	s := []int{9, 10, 13, 15, 20}

	s = s[1:4]
	fmt.Printf("%v\n", s) //[10 13 15]

	s = s[:2]
	fmt.Printf("%v\n", s) //[10 13]
	
	s = s[1:]
	fmt.Printf("%v\n", s) //[13]
}
```
>%v は、さまざまなデータ型の値を文字列として表示するための汎用的なフォーマット指定子です。(ChatGPT3.5)


「最初の要素は含むが、最後の要素は除いた半開区間を選択します」
なので`s[1:4]`の場合は、`10`がインデックス番号が1番目であり、
4のインデックス番号、つまり、`20`以降を除く、ということなので`[10 13 15]`になると思います。

このときに感じるのが、スライスということでもっと直感的に扱いたいが、インデックスが絡んでくるとややこしくなることがネックだと感じました。

## もっと直感的に考えると

そこで以下のスケッチの通り対処すると簡単に扱えることがわかりました。
どういうことかというと、インデックスで考えるより、要素の数え順で見た方がより直感的に扱えるということです。
たとえば、
```go
s := []int{9, 10, 13, 15, 20}
s = s[1:4]
```
このときに、まずは`4`に着目すると、インデックス番号ではない、並び順でまずは4つ目を含ませる（黄色）ようにします。
そして、左の`1`の通りひとつめを削るイメージになります（赤色）。
結果的に`[10 13 15]`がつくられます。

![IMG_0094.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954882/6cf0cbd3-5fea-620a-ad6b-f1f1c029a9da.png)

なのでスライスを直感的に数え順で理解しようとすると`右側で含ませて左で削る`というとわかりやすいかと思います。同様に、`s[:2]`の時は、直前にできた`[10 13 15]`を元にすると、
`右側`の「含む」部分にあたるので、`[10 13]` がつくられます。

![IMG_0095.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954882/871a9edc-7c30-486a-8d9e-8dfdb040800d.png)

最後の`s[1:]`についても同様に考えたら、これは`左側`の「削る」部分にあたるので、
`1`を削って、`[13]` がつくられます。

## 最後に
以上がスライスを直感的に扱う方法でした。
インデックス番号を交えて考えると、「どこからどこまでをスライスするんだっけ？？」と一瞬頭の中がこんがらがるので、あえて数え順で直感的に考えてみる方法をお伝えしました。
ただし、Goについては学習中ということもあり、この考えで不都合が起こる可能性がある場合はご指摘いただけたら幸いです！
plunkerでthree.js その6

# 概要
plunkerでthree.jsやってみた。
THREE.DragControls、やってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/bb52b3d9-6c17-a5be-3687-275977700e27.png)


# サンプルコード

```
const renderer = new THREE.WebGLRenderer()
renderer.setSize(400, 400)
document.body.appendChild(renderer.domElement)
const scene = new THREE.Scene()
scene.add(new THREE.AxesHelper(5))
const light = new THREE.PointLight(0xffffff, 100)
light.position.set(10, 10, 10)
scene.add(light)
const camera = new THREE.PerspectiveCamera(75, 400 / 400, 0.1, 1000)
camera.position.z = 3
const geometry = new THREE.BoxGeometry()
const material = [
    new THREE.MeshPhongMaterial({ 
        color: 0xff0000, 
        transparent: true 
    }),
    new THREE.MeshPhongMaterial({ 
        color: 0x00ff00, 
        transparent: true 
    }),
    new THREE.MeshPhongMaterial({ 
        color: 0x0000ff, 
        transparent: true 
    })
]
const cubes = [new THREE.Mesh(geometry, material[0]), new THREE.Mesh(geometry, material[1]), new THREE.Mesh(geometry, material[2])]
cubes[0].position.x = -2
cubes[1].position.x = 0
cubes[2].position.x = 2
cubes.forEach((c) => scene.add(c))
const controls = new THREE.DragControls(cubes, camera, renderer.domElement)
window.addEventListener('resize', onWindowResize, false)
function onWindowResize() {
    camera.aspect = 400 / 400
    camera.updateProjectionMatrix()
    renderer.setSize(400, 400)
    render()
}
function animate() {
    requestAnimationFrame(animate)
    cubes[0].rotation.x += 0.01
    cubes[0].rotation.y += 0.011
    cubes[1].rotation.x += 0.012
    cubes[1].rotation.y += 0.013
    cubes[2].rotation.x += 0.014
    cubes[2].rotation.y += 0.015
    renderer.render(scene, camera)
}
animate()




```

# 成果物

https://embed.plnkr.co/plunk/ajNuqVIjhCCwlUlt


以上。
plunkerでthree.js その5

# 概要
plunkerでthree.jsやってみた。
THREE.Raycaster、やってみた。

# 参考にしたページ

https://qiita.com/Arihi/items/62c612450f0219bf8225


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/b526d9a2-3503-caee-b881-a1afc63db766.png)


# サンプルコード

```
var container = document.getElementById("container");
var canvas = container.firstElementChild;
var width = container.clientWidth;
var height = container.clientHeight;
canvas.width = width;
canvas.height = height;
var renderer = new THREE.WebGLRenderer({ 
  antialias: true, 
  canvas: canvas
});
var camera = new THREE.PerspectiveCamera(30, width / height, 1, 100);
camera.position.set(0, 20, 20);
camera.lookAt(new THREE.Vector3());
var scene = new THREE.Scene();
var ambientLight = new THREE.AmbientLight(0x111111);
scene.add(ambientLight);
scene.add(new THREE.GridHelper(400, 10));
scene.background = new THREE.Color(0xffeeee);
var directionalLight = new THREE.DirectionalLight(0xaaaaaa, 0.9);
directionalLight.position.set(0, 100, 40);
scene.add(directionalLight);
var loader = new THREE.JSONLoader();
var mesh;
loader.load('lib/rough_plane.json', function(geo) {
    var material = new THREE.MeshLambertMaterial({ 
      color: 0xffffff, 
      vertexColors: THREE.FaceColors 
    });
    mesh = new THREE.Mesh(geo, material);
    scene.add(mesh);
    renderer.render(scene, camera);
});
window.addEventListener('click', function(e) {
    var square = getIntersectedIndex(e);
    if (square !== undefined && mesh) 
    {
        mesh.geometry.colorsNeedUpdate = true;
        mesh.geometry.faces[square].color.set(0x00ff00);
        if (square % 2 === 0)
        {
            mesh.geometry.faces[square + 1].color.set(0x00ff00);
        }
        else
        {
            mesh.geometry.faces[square - 1].color.set(0x00ff00);
        }
    }
    renderer.render(scene, camera);
}, true);
var raycaster = new THREE.Raycaster();
function getIntersectedIndex(e) {
    var raymouse = new THREE.Vector2();
    raymouse.x = (e.offsetX / width) * 2 - 1;
    raymouse.y = -(e.offsetY / height) * 2 + 1;
    raycaster.setFromCamera(raymouse, camera);
    var intersects = raycaster.intersectObjects(scene.children);
    if (intersects.length > 0) 
    {
        var square = intersects[0].faceIndex;
    }
    return square;
}




```

# 成果物

https://embed.plnkr.co/plunk/o8NdYpARbcPbsqrY


以上。
WSL2のOracleLinux8.6でsystemctlを使う

# 概要
WSL2のOracleLinux8.6環境で
```
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
```
が発生した場合の対応方法です。


# OSインストール時点の動作確認
WSL2にてOracleLinux8.6をインストールして起動した時点で稼働中のサービスを確認→ステータスを表示してみる

稼働中のサービス表示
```
$ systemctl list-unit-files -t service | grep enabled
autovt@.service                        enabled
getty@.service                         enabled
import-state.service                   enabled
loadmodules.service                    enabled
rsyslog.service                        enabled
selinux-autorelabel-mark.service       enabled
sshd.service                           enabled
syslog.service                         enabled
systemd-pstore.service                 enabled
```
sshdのステータス確認→表示に失敗する
```
$ sudo systemctl status sshd
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
```
PID1を確認
```
$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 09:19 ?        00:00:00 /init <- systemdではない
root        34     1  0 09:19 ?        00:00:00 /init
```
※systemdがPID 1でbootされていないから使えないらしい

# genieのインストール
現時点で最新は2.5.1ですがいろいろ問題がおきるので今回は1.4.4

パッケージダウンロード
```
$ wget https://github.com/arkane-systems/genie/releases/download/v1.44/genie-1.44-1.fc34.x86_64.rpm
```
必要となるdaemonizeをダウンロード(1.7.8-6が最新のようですがいろいろ問題おきるので1.7.8-1）
```
$ wget https://download-ib01.fedoraproject.org/pub/epel/8/Everything/x86_64/Packages/d/daemonize-1.7.8-1.el8.x86_64.rpm
```
インストール
```
$ sudo dnf install daemonize-1.7.8-1.el8.x86_64.rpm
$ sudo dnf install genie-1.44-1.fc34.x86_64.rpm
```
genieの初期化と反映 (-iは結構時間かかります）
```
$ genie -i
$ genie -s
```

# 動作確認
```
$ ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 09:52 ?        00:00:00 systemd  ←systemdになった
root          28       1  0 09:52 ?        00:00:00 /usr/lib/systemd/systemd-journald
root          43       1  0 09:52 ?        00:00:00 /usr/sbin/rsyslogd -n

$ sudo systemctl status sshd
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2023-10-21 09:52:37 JST; 9min ago
     Docs: man:sshd(8)
           man:sshd_config(5)
```

# 参考記事
https://shigeo-t.hatenablog.com/entry/2022/02/16/050000
AtCoder初心者 DailyTrainingメモ②

AtCoder初心者 DailyTrainingメモ②

AtCoder Python DailyTraining 

# ABC265 B-問題
https://atcoder.jp/contests/adt_easy_20231019_2/tasks/abc265_b

**問題文**
洞窟は N 個の部屋が一列に並んだ構造で洞窟内には M 個のボーナス部屋があります。i 番目のボーナス部屋は部屋 X であり、この部屋に到達すると持ち時間が Y 増加します。
高橋君は部屋 N にたどりつくことができますか？

**ポイント**
ボーナスを部屋番号をインデックスとして取り扱い、移動の消費時間と同期させる
例）bonus=[0,2,5,3,0]

````Python:265B.py
入力例
4 1 10
5 7 5
2 10

# 入力
N,M,T = map(int,input().split())
L = [0] + list(map(int, input().split()))   # スタート位置を 0 とする
# L:[0, 5, 7, 5]

bonus=[0]*(N) # ボーナスを格納する　初期値 0埋め
for i in range(M):
    X,Y = map(int,input().split())
    bonus[X-1] = Y

# bonus:[0, 10, 0, 0]
for i in range(1,N):
    T -= L[i] 
    if T <= 0:
        print("No")
        exit()
    T += bonus[i]
print("Yes")
````

# ABC282 A-問題
https://atcoder.jp/contests/adt_easy_20231018_2/tasks/abc282_a

**問題文**
整数 K が与えられます。英大文字を A から昇順に K 個繋げて得られる文字列を答えてください。

**ポイント**
数値をアルファベット大文字に置換するとき、Pythonでは、「chr(ord('A') + i)」を使う
i が 0 のときは、A
i が 1 のときは、B

````Python:282A.py
K = int(input()) 

S = ""

for i in range(K):
    c = chr(ord('A') + i)   # 数値をアルファベット大文字に置換する
    S += c

print(S)
````

AtCoder初心者 DailyTrainingメモ②

AtCoder Python DailyTraining 

# ABC271 A-問題
https://atcoder.jp/contests/adt_easy_20231018_1/tasks/abc271_a

**問題文**
0 以上 255 以下の整数 N を、必要に応じて先頭に 0 を加えることでちょうど 2 桁の 16 進表記に変換してください。

**ポイント**
10進数から16進数に変換するときは、hex() を使う

````Python:271A.py
# 入力
N = int(input()) 

X = hex(N) # 16進数に変換

# hex を使うと　N=12の場合は、0xc　N=255の場合は、0xff
# 答えは、それぞれ　0C /  FF  にする必要がある

if N <= 15:
    # 前ゼロを付けて、末尾の1桁を表示(小文字→大文字)
    X = X[-1]
    print("0" + X.upper())
else:
    # 末尾の2桁を表示(小文字→大文字)
    X = X[2:] 
    print(X.upper())
terraformでAWSリソースの変更対応について

## terraformでAWSリソースの変更
業務でAWSリソースをterraformを用いて変更しようとしたところ、いろいろと考慮すべき点があったので、備忘録として残しておきます。
今回はEC2インスタンスの変更について記載しますが、他のリソース変更についても記事を残して行く予定です。


### エラーが出るEC2インスタンスタイプの変更

intelアーキテクチャからt4gファミリーへの変更を行う際は以下のようなエラーがでます。


```
│ Error: updating EC2 Instance (i-0515e532dac1baa6c) type: modifying EC2 Instance (i-0515e532dac1baa6c) attribute: InvalidInstanceAttributeValue: 't4g.micro' is not a valid instance type for instance 'i-0515e532dac1baa6c' of architecture 'x86_64'.
│       status code: 400, request id: ********************
│ 
│   with aws_instance.kenshou,
│   on main.tf line 3, in resource "aws_instance" "kenshou":
│    3: resource "aws_instance" "kenshou" {
│ 
```
x86_64からArmのアーキテクチャへの切り替えはできないため、他のインスタンスタイプを選択するかAMIの変更対応を行なった上で変更対応する必要があります。
現在のインスタンスタイプがどのプロセッサを使用しているかは以下の公式サイトを参照してください。
参考: [インスタンスタイプ - Amazon EC2 | AWS](https://aws.amazon.com/jp/ec2/instance-types/
)

### エラーが出るかもしれないEC2インスタンスタイプの変更(解決可能)

古いバージョンのT2インスタンスの場合T3へと更新できない可能性があります。
それはENA拡張ネットワーキングをサポートしていない場合です。
問題がないAMIについては以下の公式ガイダンスに載っています。
参考: [Linux インスタンスにおける Elastic Network Adapter (ENA) を使用した拡張ネットワーキングの有効化](
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/enhanced-networking-ena.html)
また、対応インスタンスがENAの適用を行う方法もあるので、もし上記のリストを満たしていない場合でも最終的にT3インスタンスへと変更することができます。


### 終わりに
今回はEC2インスタンスタイプの変更時のエラーについて記載しましたが、以上二つは自分が実際に体験した範囲のものなので、実際にはより多くの変更時エラーが発生する可能性があります。
WordPress on Azure AppService - Email Integration を試してみた

稼働中の WordPress on Azure AppService に、あとから Email Integration を追加する検証をしてみました。

## Azure Communication Services のメールを追加

以下の Azure リソースを追加しました。

![appservice-email-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/e45aaa1c-41a1-0a07-44a2-ca203cbdf75d.png)

## AppService のアプリケーション設定を追加

`WP_EMAIL_CONNECTION_STRING` という名前で、値に `endpoint=<endpoint>;senderaddress=<sender-address>;accesskey=<access-key>` を追加しました。

![appservice-email-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/a1d95daf-d8b3-fddd-a37c-426a4800c385.png)

## App Service Email プラグインを WordPress に新規追加

zip ファイルをアップロードして有効化しました。

![appservice-email-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/f34ad5b8-556a-b736-4add-7d8120536752.png)

## WordPress にユーザーを追加して Email Logs を確認

Status が Success と表示されました。

![appservice-email-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/16a2666b-b53e-3fcf-8bf8-cec8c91b8c41.png)

## 受信したメール

ユーザーの新規追加時に登録したメールアドレス宛にメールが届きました。

![appservice-email-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/93e4c5df-73bf-7690-560a-f5ef76d70c28.png)

## 参考

https://techcommunity.microsoft.com/t5/apps-on-azure-blog/wordpress-on-azure-appservice-email-integration/ba-p/3890486

https://qiita.com/mnrst/items/80f604cb4162204aa244

https://qiita.com/mnrst/items/fba80e997b043a8a05c0
【3D Object Detection】BEVFusion

# 概要
- CameraからBEVに変換する為の計算の高速化を2つ提案
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/efb1d05c-d4c6-60c9-9cc7-8f5fc9ecf473.png)

- CameraのDepth DistributaionにおけるBEV Gridの位置を事前計算しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/f0858c11-95a8-c01e-1e6c-79d696b380d4.png)

- GPUでGridの中の値をSumするoperationを並列化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/e63daa09-b3fd-e91f-3a94-5739e92dcbcb.png)

# 参考文献
https://arxiv.org/pdf/2205.13542v2.pdf
ヤマハルーターをLTE接続

# ヤマハルーターをLTEルーターとして使う
ヤマハルーターNVR700WをLTEルーターとして使ったときのメモ。今回のネタは軽いが、小生にとっては大事であった。

## 設定
GUI設定は楽だが、「おまけ」が多い。CLIによる最小設定が本稿の目的。

### GUI
GUIによる設定方法は下記にある。
- [内蔵無線WANでインターネット接続 : NVR700W Web GUI設定](https://network.yamaha.com/setting/router_firewall/internet/internet_connect/wireless_wan)

### LTE I/F
ヤマハ的には、LTE I/Fは「内蔵無線WAN」という名称であり、CLIでは、「wwan」というキーワードを用いる。

### 最小設定
日本語によるコメント（#）を追記
```conf
administrator password himitsu
ip route default gateway pdp wan1  #　デフォルトゲートウェイをI/F wan1(pdp:内蔵無線WANモジュール=LTE)とする
ip wan1 address pdp　　　　　　　　　#　wan1のIPアドレス情報をpdpから取得
wan1 bind wwan 1                   # LTEをwan1に結びつける
pp disable all
wwan disable all
wwan select 1                       # wan1の設定内容
 description wwan Secret
 wwan always-on on                  # 常時ON
 wwan auth accept chap              # 認証方式
 wwan auth myname ID PASSWORD       # アカウント情報
 wwan auto connect on               # 自動接続
 wwan disconnect time off           # 切断タイマーOFF
 wwan disconnect input time off
 wwan disconnect output time off
 wwan access-point name mvno.net    # APN名
 wwan access limit length off       # 従量制限なし
 wwan access limit time off         # 時間制限なし
 wwan enable 1                      # 有効化
no tunnel enable all
wwan-module use on                  # 内蔵無線WANモジュール有効化
```
LAN側の設定はないが、少なくとも、コンソールから、通信を確認できる（例：「ping 8.8.8.8」。また、DNS情報が必要であれば、下記設定が必要となる。
```
dns server pdp wan1
```
wan1から得られるDNSサーバーを使うというものである。

### L2TPv3の設定
結局は、L2TPv3を実施したかったので、その設定も記載。下記は受け側の設定であり、送り側からのL2TPv3接続を待つもの。このあたりおよびL2TPの詳細は、下記記事を参照。
- [ヤマハルーターでL2TPv3（その２：NAT環境＋α）](https://qiita.com/infinite1oop/items/e2ada5bf6ab99d66978f)

```conf
administrator password himitsu
ip route default gateway pdp wan1
bridge member bridge1 lan1 tunnel1
ip bridge1 address 192.168.2.20/24
ip wan1 address pdp
ip wan1 nat descriptor 1
wan1 bind wwan 1
pp disable all
wwan disable all
wwan select 1
 description wwan Secret
 wwan always-on on
 wwan auth accept chap
 wwan auth myname ID PASSWORD
 wwan auto connect on
 wwan disconnect time off
 wwan disconnect input time off
 wwan disconnect output time off
 wwan access-point name mvno.net
 wwan access limit length off
 wwan access limit time off
 wwan enable 1
no tunnel enable all
tunnel select 1
 tunnel encapsulation l2tpv3-raw
 l2tp hostname RT2
 l2tp tunnel auth on yamaha
 l2tp tunnel disconnect time off
 l2tp keepalive use on 60 3
 l2tp keepalive log on
 l2tp syslog on
 l2tp local router-id 192.168.2.20
 l2tp remote router-id 192.168.2.10
 l2tp remote end-id yamaha
 ip tunnel tcp mss limit auto
 tunnel enable 1
nat descriptor type 1 masquerade
nat descriptor address outer 1 primary
nat descriptor address inner 1 auto
nat descriptor masquerade static 1 1 192.168.2.20 udp 1701
l2tp service on l2tpv3
wwan-module use on
```

EOF
CPUバウンドの場合のFlowによる並列処理の有効事例〜1000バイトの強固な暗号鍵を生成してBase32でエンコード

ElixirのFlowを用いると，極めて簡潔に並列処理を書くことができます．特にI/Oバウンドの場合，威力を発揮します．一方，CPUバウンドの場合には，負荷の軽い処理では逐次処理よりかえって遅くなるため，簡潔かつ有効な事例を示す必要がありました．そこで，本記事では，`:crypto`と`Base`を用いて比較的重たい暗号処理を行わせたFlowによる並列処理を紹介し，有効性を示します．

## 逐次処理版のコード

Elixirではパイプライン演算子を用いることで，上から下へ流れるように読むことができるプログラムコードを記述できるという点が，大きな強みとなっています．

以下に1,000,000個の1000バイトの強固な暗号鍵を生成してBase32でエンコードし，結果として1,000,000個の1600文字の暗号文字列を得るという，Elixirコードを紹介します．

```elixir
1..1_000_000
|> Enum.map(fn _ -> :crypto.strong_rand_bytes(1000) end)
|> Enum.map(& Base.encode32(&1, case: :lower)) end)
```

なお，このコードを作る際に参考にした記事は次のとおりです．

https://qiita.com/mnishiguchi/items/90380b61df4e41966556

## 並列処理版のコード

ではFlowによる並列処理にするとどうなるでしょうか．

```elixir
1..1_000_000
|> Flow.from_enumerable()
|> Flow.map(fn _ -> :crypto.strong_rand_bytes(1000) end)
|> Flow.map(& Base.encode32(&1, case: :lower)) end)
|> Enum.to_list()
```

なお，Flowを用いるには，`Mix.install([:flow])`をあらかじめ実行するか，Mixプロジェクト中の`mix.exs`にFlowを読み込む設定をします．

Flowを用いた時の注意点としては，並列処理をした時の到着順にリストが生成されるので，結果の順番がランダムになることです．この例では，各要素の計算結果は要素の順番に全く依存しないランダムなものなので，特に問題になることはありません．もし到着順ではなく，最初に生成したリストと同じ順番にしたい時には，適宜ソートをする必要があります．

## 実行時間の計測

Bencheeというベンチマークプログラムを使って，逐次版と並列版の実行時間を計測・比較します．

```elixir
Mix.install([:flow, :benchee])

Benchee.run(
  %{
    "sequential execution" => fn -> 1..1_000_000 |> Enum.map(fn _ -> :crypto.strong_rand_bytes(1000) end) |> Enum.map(& Base.encode32(&1, case: :lower)) end,
    "parallel execution" => fn -> 1..1_000_000 |> Flow.from_enumerable() |> Flow.map(fn _ -> :crypto.strong_rand_bytes(1000) end) |> Flow.map(& Base.encode32(&1, case: :lower)) |> Enum.to_list() end
  }
)
```

```
Operating System: macOS
CPU Information: Apple M2 Max
Number of Available Cores: 12
Available memory: 96 GB
Elixir 1.15.7
Erlang 26.1

Benchmark suite executing with the following configuration:
warmup: 2 s
time: 5 s
memory time: 0 ns
reduction time: 0 ns
parallel: 1
inputs: none specified
Estimated total run time: 14 s

Benchmarking parallel execution ...
Benchmarking sequential execution ...

Name                           ips        average  deviation         median         99th %
parallel execution            0.71         1.40 s     ±3.20%         1.40 s         1.46 s
sequential execution         0.180         5.54 s     ±0.00%         5.54 s         5.54 s

Comparison: 
parallel execution            0.71
sequential execution         0.180 - 3.96x slower +4.14 s
```

並列実行版(parallel execution)の方が逐次実行版(sequential execution)より3.96倍高速です．
【AWS】Lambda関数の処理時間増加を抑える方法【システム改善】

## はじめに
Lambdaを実行できる時間は15分までに制限されている。大量データの処理にはLambdaではなくtimeoutの設定がより長い時間設定できるGlueを選択することも多いが、オンライン処理のように処理速度が求められるシステムの場合やAWSのコストを抑えたい場合などの理由からLambdaを選択されるケースもあります。
システムの非機能要件には将来予想される処理対象のデータ量を要求された時間内に処理できることが求められることが多いですが、予想される時間が15分以上だからという理由でLambdaを諦めるのはもったいないです。
今回の記事ではStepFunctionsを組み合わせた方法でLambda単独で15分以上かかる処理を15分以内で完了させる方法について記載しました。

## 使うAWSサービス
・AWS Lambda
・AWS Step Functions

## 実現方法
### 実現方法①順次処理を並行で処理を行う(Parallel tate)
![Prallel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/78961884-7664-6d37-10ac-39c55a4d7f7d.png)
<ポイント>
・Lambdaが処理するデータが多いがそのデータがいくつかの種類に分類できる場合は並列処理が可能。この場合ではParallel tateを利用する
・順次に処理を行うと処理A → 処理B → 処理Cと流れるので全体の処理時間は3つの処理時間の合計になるが、並行処理を行うことで一番時間のかかる処理時間が全体処理の処理時間にできる。そのため、全体で15分以上かかる処理であってもLambdaで処理できる。
・ParallelState内のLambdaはすべての処理のコードが入った同じLambdaを使って渡されるパラメータを制御して実行される処理を分けるのも悪くはないが、私の好みとしては各処理ごとにLambdaを分けるほうが良い気がする(その処理を他に流用する処理ではないかや実装工数など、条件にもよるが・・・)

### 実現方法②同じ種類の大量のデータに対する同じ処理を並列化する(Map State)
![Map.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/5344368b-ef65-035a-e330-7131a5f9ecb4.png)
<ポイント>
・大量のデータがあり、そのそれぞれに対して同じ処理をするLambbdaである場合、MapStateを使って並列処理を実現することで処理時間を短縮できます。
・渡すデータをJson配列にして渡すことでMap内のLambdaに並列にデータを分けて同時実行されます
・Json配列にすることが大変だと思われるかもしれないが、例えばあらかじめデータをDynamoDBに保存しておきそのDynamoDBからデータを取得してMapに渡すなどすればJson配列にする手間は省けるので検討してみてください。

(DynamoDBと組み合わせた構成)
![Map+Dynamo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/eeeedafa-22c2-43d1-62da-ff8447817576.png)


## さいごに
GlueとLambdaはどちらも同じようなことができるのでどちらを選んでシステムを構成するのか迷うこともあります。様々な要因があるので一概にこれが正解とはいえませんが、簡単な判断材料としてユーザが処理結果をすぐ確認したいオンライン処理はLambda、日次バッチのような多少時間がかかってもよい処理はGlueを使うようにしています。
そのため、単独のLambdaで処理するとデータ量に比例してユーザを待たせてしまうよう課題(例えば大量のデータを画面からアップロードするなど)の場合は今回紹介したようなStepFunctionsと組み合わせた構成をお勧めします。
並列/並行実行に適さないデータの場合は、データにデータのカテゴリ分けするなど必要に応じてデータの管理方法も再検討してみて下さい。
Pythonで「Markdownセルを使ってテキストを表示する」の動作を確認してみた

# 概要

Pythonで「Markdownセルを使ってテキストを表示する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/jupyter-notebook/index4.html

# 実装

以下のファイルを作成しました。
```file20231021.ipynb
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "cb9249f7-691e-4a04-88b0-4da535f567a3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "120.0"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "150 * 8 * 0.1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "04f3bb01-32c6-4be4-a659-a7da8fb94a40",
   "metadata": {},
   "source": [
    "四則演算を行いました。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7bbe1888-9aec-4f39-88d2-98afb9736c02",
   "metadata": {},
   "source": [
    "- Python3.10.12を利用\n",
    "- データ検証用\n",
    "- 詳細は資料4.A参照"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5c79af1a-8d30-4e7c-88c5-bfe6bac77474",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
```

実行画面は以下の通りです。
![Screenshot from 2023-10-21 08-30-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/c3980210-5360-3cbb-68d0-57ac5fa17622.png)

# まとめ

何かの役に立てばと。
【3D Object Detection】EA-LSS

# 概要
BEVでのLiDARとCameraのFusionではCameraのDepthが不正確でLiDAR単体に対してPefromanceがそこまで上がらないという課題があった。そこでEA-LSSモジュールを追加し、カメラでの距離推定を向上させ、最終的な3次元物体認識の精度を上げる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/93aa6ab6-5f7d-6987-55e3-0c195618c7d0.png)

## EADF Module
1. LiDARの点群をCameraにProjectionする
1. kxkのカーネルを使ってMaxPoolingする
1. ←↑↓→の四方向のEdgeを検出するためSobel Filterを使用する
1. 得たEdge　Mapを0~1にNormalizationする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/d54e3cb8-277d-c651-89c4-d976e7d0b85a.png)

## FGD Module
1. CameraとLiDARの情報をFusionしたFeature Mapから、Transposed Convolutionを使って解像度をあげながら、Depthを推定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/4783ad23-fef8-c03d-79ec-91a3d125926f.png)

## EA-LSS
1. LiDARから得たDepth MapとEdge MapをCameraのFeature MapにConcatする
1. Context Featureと推定したDepth distributionを使ってFrustum Featureを得る
1. LiDARから得たDepth MapをGround Truthとして、推定したDepth MapのLossを計算する(FGD LossとDADF Loss)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/bfaec3c4-3d38-dc40-92fb-8535f6c57f79.png)
[MetaQuest3]本体の電源が入らなくなった時の対応方法

# 概要
MetaQuest3の電源が急に入らなくなって困った時、対応した手順を共有します。
# 本文
①本体の電源ボタンと音量ボタン(本体下部右側にあります。音量を下げる左側を押します)を同時長押し
②設定画面が表示されるので音量ボタンで「Power off」にカーソルを移動させて電源ボタンで決定
③本体の電源が落ちたら再度電源ボタンだけ長押し
# 補足
:::note warn
この操作で症状が回復するとは限りません。本当に困った時の最終手段として自己責任でお試しください。
:::
# 参考にした記事
最初はこの記事を参考にリセットするつもりでしたが、設定画面が表示された時点で直ったようでした:raised_hands_tone2:
[Meta Questヘッドセットを出荷時設定にリセットする](https://www.meta.com/ja-jp/help/quest/articles/fix-a-problem/troubleshoot-headsets-and-accessories/troubleshooting-factory-reset-quest/)
【Reactアプリ100本ノック】02 Counter

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/1bde02c9-e894-a0a2-a5bc-7abcd05c4dd8.png)


# はじめに

<h3>こんにちは！！@Sicut_studyです！</h3>

https://qiita.com/Sicut_study/items/78910cd8d103b8d45a73

こちらの記事が嬉しいことに多くの方に見ていただきました。
そこで**React**が多くの初心者の方に注目されているんだなということを実感させられました。

私の記事では何度も言っている通り

<font color="red"><h4>最速で学ぶならとにかく何か作る</h4></font>

というのが大事になってきます。そこで **「Reactアプリ100本ノック」** というのに挑戦していこうかと思います。徐々に難易度を挙げていってどこまでお題を作りきれるかの腕試しでやっていただければと思います。

今回は`useState`を学ぶのに最適なカウンターアプリを作っていきます！

# 前回のお題

https://qiita.com/Sicut_study/items/3c5cd798313854a471a0

# Reactアプリ100本ノックルール

- 主要なライブラリやフレームワークはReactである必要がありますが、その他のツールやライブラリ（例: Redux, Next.js, Styled Componentsなど）を組み合わせて使用することは自由
- TypeScriptを利用する

# 02. Counter

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/1351242c-debc-d6a4-bd2d-6e1bef45b0d9.png)


## 問題

カウンターを作成する

## 目的

React の基本を理解する: カウンターアプリは、ステート管理やイベントハンドリングなど、React の基本的な機能を学ぶのに適しています。初心者にとっては、これらの概念の理解を深める良いスタートポイントとなります。

## 達成条件

1. 表示領域: 数字を表示するエリアが存在する。
2. インクリメントボタン: このボタンをクリックすると、表示されている数字が 1 増える。
3. デクリメントボタン: このボタンをクリックすると、表示されている数字が 1 減る。
4. 初期表示: アプリを起動した際の数字は 0 である。
5. ステート管理: React の useState や useReducer を使って、カウントの数字を管理する。

## 実際に解いてみた

### 利用技術

- React
- TypeScript
- Vite
- Emotion

解答時間 : 25分

機能自体は難しくないのでデザインをどうするかのほうに時間がかかってしまった
またEmotionのインポートをミスしていたので、そこの調査にも時間を使った
デザインはそれぞれお好きに作ってみると良いかもしれないです。

# おわりに

React100本ノックの記事を地道に上げていこうと思いますので、一緒に挑戦したい方は @Sicut_study をフォローいただけるととてもうれしく思います。
ここまで読んでいただけた方はぜひ**いいね**と**ストック**よろしくお願いします。

<h5>少し宣伝します🔥🔥🔥🔥🔥</h5>

これからエンジニアになろうとしている人を本気でコーチングして3か月の期間で立派なエンジニアにするようなチャレンジをしてみたいなと考えております。

もし、本気でエンジニアを目指してコーチングを受けてみたいという方がいれば、[Twitter](https://twitter.com/Sicut_study)に「プログラミング教えてほしいです」みたいなリプライ送っていただけたらなと思います！！

以上です。
今週もプログラミング頑張りましょう！

![bandicam 2023-10-04 20-58-54-525.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/f41a0065-b23e-1895-da22-66bf0e48c5fb.jpeg)

# 次回

https://qiita.com/Sicut_study/items/5dec3c42c8f3c90f0487
Grafana® 9でモニタリングを強化しよう

<font color="Grey">*[Strengthen your monitoring game with Grafana® 9](https://aiven.io/blog/strengthen-your-monitoring-game-with-grafana-9)の翻訳です。*</font>

2022年10月20日

# Grafana® 9でモニタリングゲームを強化しよう

Aivenは現在、Grafana® 9をマネージドサービスとして提供しています。どのように提供されているのか、主な改善点を見てみましょう。

オープンソースへのコミットメントにより、Aivenは常に最高のオープンソースツールをお客様にお届けするよう努めています。私たちは、Grafana® 9が今日までで最高のオープンソースの可視化技術であると信じています。


新しいGrafanaリリースは、以下のような豊富な新機能をもたらします：


* プロメテウス・クエリ・ビルダー
* 改善されたユーザーインターフェース
* 新しいヒートマップモデル


Grafana 9 は、モニタリングのプロセスを飛躍的に簡素化します。


## 新機能と更新された機能


### プロメテウス・クエリー・ビルダー


Prometheusは、さまざまなソースからメトリクスを取得するために広く使用されている技術エージェントです。Aivenでも、[メトリクス統合ソリューション](https://aiven.io/integrations-and-connectors)に使用しています。しかし、PromQLは最も簡単な言語ではなく、学習曲線が急です。Grafana 9は、PromQLクエリビルダーを登場させることでこの問題に取り組んでいます。


![Prom query builder from Grafana 9](https://cdn.sanity.io/images/sczeoy4w/production/630c588249e963c2174dfd4770a10dfb636877a7-1454x654.png?q=80&fit=min&auto=format&dpr=1.5)


これがPromQLクエリビルダーの使い方です：


* 複数のメトリクスとラベルを同時に選択して検索できます。
* 同じクエリ内で進行中のさまざまな操作や集計を明確に定義できます。


PromQLクエリビルダーは、ハードコアな開発者のためにコードベースのユーザーインターフェースも保持しています。


### 新しいヒートマップパネル


時系列データは、モニタリングと観測可能性の重要な部分です。一定期間を通してサービスに関する重要な情報を運び、サービスがどのように実行されたかを洞察してくれます。Grafana のヒートマップは、大量の時系列データをヒストグラムとして可視化するのに役立ちます。


![Heatmap in Grafana 9](https://cdn.sanity.io/images/sczeoy4w/production/302997d9a46e2e391b43fb9020deded306c9ca84-1286x614.png?q=80&fit=min&auto=format&dpr=1.5)


Grafana 9では、ヒートマップの表示方法が刷新されました。新しいヒートマップパネルは複数の新機能をもたらします：


* データ分布の問題を分離するのに役立つExemplars（トレース）オーバーレイ
* プロメテウス・スパース・ヒストグラムにより、個別のバケットを作成することが不可能な場合のデータ分析を強化します。
* 粒度を反映した表示色数のカスタマイズ
* バケツ化されていないデータの自動バケツサイジングをよりスマートにします。
* ゼロに近いが正確ではないバケツ値をフィルタリングすることができます。


さらに、新しいヒートマップは、古いものより数桁高速です。


### ユーザーインターフェースの改善


#### ダッシュボードのプレビュー


ダッシュボードのプレビューは、Grafana 9 で実装される新しい機能強化です。タイトル名に頼る代わりに、顧客は複数のダッシュボードをよりよく区別するために、ダッシュボードのグラフィカルな表現を持つことができるようになりました。


この機能は、Aiven Console for Grafanaサービスのオプトイン機能として、「詳細設定」で利用できます。


#### パネルタイトル検索


パネル一覧の検索機能が改善されました。この機能は、Aiven Console for Grafanaサービスの「詳細設定」でもオプトイン機能として有効になっています。


#### スター付きダッシュボード


ナビゲーションからお気に入りのダッシュボードに直接アクセスしやすくなります。この機能はAiven for Grafanaでデフォルトで有効になっています。


## 変更点


Grafana 9の変更の中には、ビルドを壊す可能性があるものがあります。[Grafana 9の変更点の全リスト](https://github.com/grafana/grafana/blob/main/CHANGELOG.md#900-2022-06-10)を見て、潜在的な問題箇所を見つけましょう。


## Grafana 用に Aiven をアップグレードする


Grafana 9はAiven Consoleで利用可能で、Grafana 8からの安全なアップグレードパスを提供しています。Aiven for Grafanaを手動でアップグレードするか、次の定期アップデートを待つことができます。


優れたマネージドGrafanaサービスをお探しの方は、[Aiven for Grafana製品ページ](https://aiven.io/grafana)をご覧ください！



Aivenに関する日々のニュースは[LinkedIn](https://www.linkedin.com/company/aiven/)と[Twitter](https://twitter.com/aiven_io)のフィードでご覧いただけます。サービスの最新情報を知りたい方は、[changelog](https://aiven.io/changelog)をご覧ください。
メモ　Open InterpreterをGoogle Colabで動かす手順

# はじめに
Open Interpreter、とてもすごいわけですが、自分の環境に勝手にどんどん変な？ライブラリを導入されるので、Python環境をボロボロにされます。
Google Colabを使えば、環境は使い捨てなので便利です。
ちょっと使うのに手間取ったので、自分向けのメモです。
おそらく、もっと簡単な方法もあるし、Google Colabの構成も日々変わっているので、使えなくなることもあると思います。
そうした点があれば、教えていただけると幸いです。

# 事前準備手順
```
!pip install urllib3==1.26.7 | tail -n 1
```

```
!pip install lida==0.0.10 | tail -n 1
```

```
!pip install llmx==0.0.15a0 | tail -n 1
```

```
!pip install typing-extensions==4.5
```

```
!pip install open-interpreter　| tail -n 1
```


### 利用手順
open-aiのAPI keyは事前に取得しておきます

```
import interpreter
interpreter.chat()
```
mruby-cairoで回転

小型のLCDにcairoを使い表示をしています。LCDの向きが逆になったので、画像を回転させて見ました。

![rotate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/eab81cbf-3f33-a8d9-1cca-c47ab7cdbf1c.png)

回転するにはまず以下のように移動します。

```ruby
  c.translate(w, h)
```

移動させた先は表示エリア外です。これを180度回転して表示エリアに戻します。180度はπ(3.14)になります。

```ruby
  c.rotate(3.14)
```

画像の反転の準備ができました。これ以降は描いたものが反転します。描画が終わったら元に戻します。

```ruby
  c.rotate(-3.14)
  c.translate(-w, -h)
```

順番重要です。

90度回転は以下のようにして出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/e70bd9f1-7129-071f-be9f-8babe3c268ac.png)

この場合横の幅の正方形分しか描画できません。
Ankiを使ったRuby技術者認定試験 Gold Version 3 勉強記録

先日、Ruby技術者認定試験 Goldを受けて合格できたのでその勉強方法を共有します。思いのほか、Ankiの効果が高いと感じていて、よかったら本記事からその有用性なんかを少しでも感じ取ってもらえたらと思いま。

# 用語
[Ruby技術者認定試験](https://www.ruby.or.jp/ja/certification/examination/)は、Rubyベースのシステムを設計、開発、運用するエンジニア、Rubyでシステム提案を行うコンサルタント、Rubyを教える講師及びRubyを学ぶ学生などを対象とした認定試験制度です。

[Anki - powerful, intelligent flashcards](https://apps.ankiweb.net/)とは、暗記のための自由/オープンソースソフトウェアで、能動的に思い出すテスト（active recall）、間隔をあけた復習 (spaced repetition)、忘却曲線に基づいて出題頻度を管理することができる - 出典: フリー百科事典『ウィキペディア（Wikipedia）』

# 前提
* 受験者は、Webを中心としたエンジニア歴15年、うちRuby on Rails経験6年のひつじ年の野生アラフォーエンジニア
* Ruby技術者認定試験を受けたのは今回が初めてで、Silverを受けずにGoldを受験

# Ankiカードの登録元
## Version3.1
* [prep-test/gold_ja.md at version3 · ruby-association/prep-test · GitHub](https://github.com/ruby-association/prep-test/blob/version3/gold_ja.md)
* [Ruby Gold 3.1の対策と出題傾向について(2022年11月) #Ruby - Qiita](https://qiita.com/heysan/items/82bdfb7af4325f05e0e5#tally)
## Version2.1
* [\[改訂2版\]Ruby技術者認定試験合格教本(Silver/Gold対応) Ruby公式資格教科書](https://amzn.to/46UZ3in)
* [REx - Ruby Examination](https://rex.libertyfish.co.jp/)
* [1ヶ月後「Ruby Association Certified Ruby Programmer Gold version 2.1」に合格する方法 #Ruby - Qiita](https://qiita.com/sogu/items/5ff2bf8702e14daf1804)

# 記録
## 要約
資格を取る準備として合格教本の購入とAnkiへの登録が2023年4月後半から、その後8月くらいになってやっとエンジンが掛かる。10月には練習問題を過学習してしまい、また暗記率もよかったので（mature 80%）試験を申し込む。しかし、直前になってVersion3になっていることに気づくことができ、日程を2週間後に変更、88点で試験をパスする。

* 休日3、4日使ってAnkiの登録とメンテナンス
* ご飯や電車乗ってるときなど隙間時間にAnkiで暗記
* 合格教本やWeb(REx)の練習問題を3周


## 詳細
* およその合計勉強時間 40.5時間
    * Ankiへの登録とメンテナンス 28時間
    * Ankiでの暗記 8.5時間
    * 練習問題 4時間
* 勉強期間: およそ6ヶ月（実質3ヶ月）
* Anki カード数: 881
* Anki 合計レビュー数: 9,689
* Anki 1日平均見直し数: 56
* Anki 最終 Mature 暗記率: 74.58%

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179979/82809a68-e37b-b6fe-9c0e-5d18ee1ab59b.png)
![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179979/2f78311c-6557-4f02-ce20-1a58033ced86.png)
![c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179979/5add2a33-7150-a2c0-4eb3-da41efacad03.png)
![d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179979/63f762c7-b530-dfc5-27f6-2779f774c67c.png)
![e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179979/9d20fb9a-f6f1-edad-b13b-6137b2e1e717.png)
![Screen Shot 2023-10-18 at 17.14.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179979/154b2e87-e054-4bf1-9ea5-4a943597b651.png)


# 所感
* Ankiは神
* Ruby技術者認定試験については、試験で使うコードはLintしておいてほしいし、[Ruby Style Guide](https://rubystyle.guide/)にも従ってほしい
* Rubyコミュニティの人たちは暖かい

# Ankholeges
この記事がなければVersion2.1の用意で突撃していました。。。がち助かった🙌

https://qiita.com/universato/items/e5a9b2fb75e412f8e780
10.20)SAA-C03合格について

# 概要

10月20日、日本橋試験場で14時のテストを受験しました。問題自体を解くのに1時間ほど、あとは復習に時間を使い、15時40分に試験を早々に終了しました。試験結果は24時間以内に出て、最大5日かかる可能性があると書いてありましたが、当日18時20分に結果がすぐに出ました。

:::note info
通常、試験を受けた当日に結果が出ると考えても大きな違いはないと思われます。
:::

試験結果は1000点満点の776点、720点が合格点なので、少しギリギリで合格したと言えます。

SAAの合格体験記については、他の方の口コミが多く、長くても重複する点があるので、決まり文句は省略して、試験を準備する上で私が考える核心的な部分だけ取り上げて個人的な感想に移ろうと思います。

# 本文

### 1.試験準備と実際のAWSサービスに対する理解は別物

私は会社で仕事をしながらAWSサービスを1年ほど扱った経験があるので、準備する上で役に立った部分もありましたが、確実に体感したのは、試験の準備をするにしても、サービスに対する理解とは別に「**実感**」が足りないと思いました。

後述しますが、SAAでは、普遍的なアーキテクチャ案＆よく使われる汎用サービスであるかどうかを検証する感じが強かったです。 実際の状況では、より多くの変数があり、それによって考慮すべき要素も増え、組み合わせのバリエーションも増えます。

試験を準備しながら資格取得を優先される方が多いと思うので、試験に関してはどのような方法論を選ぶかは自由ですが、AWSをこれから使うのであれば、試験準備とは別にいろいろと勉強しておくとより深い理解ができると思います。 

### 2.試験で求められるアーキテクチャとサービスはパターンが決まっていて、キーワードを把握しておくことが重要 

SAA試験では基本的にセクターごとに出題範囲が固定されており、問題を出すタイプも決まっています。Associateレベルの知識を要求するため、必要以上に複雑化することができないため、そのような傾向があるのだと思います。

つまり、試験合格だけを目指すのであれば、パターンやキーワードさえ知っていれば、より簡単にアプローチできるのです。

最適なアーキテクトを決定する上で、問題からヒントが得られるのですが、

:::note info
- ストレージ、コンピューティング、サーバーレス、ネットワーク、データ移動などのようなそれぞれのセクションに分類されるサービスのパターン。
- コスト効率的、性能効率的、高可用性、スループットなどの状況を与えるキーワード。
:::

この2つをマッチングして問題に備えておけば、答えそのものを導き出すのは簡単でしょう。

例えば、ストレージ関連のセクションで「ファイルシステム」+「Windows」がキーワードとして出題された場合、EFS for Windowsが正解となる方式です。


### 3.与えられた時間に応じて戦略的にアプローチ

上記で方法論の話をしましたが、試験に先立って勉強できるリソースが多様なので、どのように勉強を始めればいいのか、何が良いのかについて悩んでいる方が多いと思います。

私は3つに分けたいと思います、 

:::note info
- AWS側で提供するリソース
- 講義の形で提供される第3のリソース
- 問題タイプを把握できるリソース
:::

私は試験準備のために主にユーデミで講義を購入して、講義で整理してくれる内容と問題を解いて勉強しました。 他の場所でも上記3つの枠組みから大きく外れない状態で勉強したと思います。 時間が足りないほどAWSが持ってる全てのサービスについて調べるのは難しいと思うので、自分の状況に合わせて戦略的に勉強するといいと思います。 資格を取ってからでも足りない部分はいつでも勉強することができます。

# 結論

今年中にSAA、DVA、SOAの取得を目標にしていたので、今回の試験がちょっと重要でした。 費用的な部分でもAWSの資格を取得すると、その後は半額で試験を受けることができる特典があることも含め、CLFを飛ばして資格を取得することになるので、ちょっと負担がありました。

本来は年初にCLFの勉強をしながら取得しようと思っていましたが、Kubernetes勉強会を進めながらCKAの取得を優先し、7月にCKAを取得し、少し時期的に遅れたので、SAAをすぐに取得することに路線変更しました。

試験の難易度は混乱する問題が結構ありましたが、15問はAWS側で試験的に入れる点数なしの問題が混ざっているとのことで、その影響があるのではないかと思います。

現在はスキル的に証明したい部分が強いので、休むことなくテンポよく資格を取得したいと思います。次の試験はDVA試験で11.11受験で予約しています。

SAAとある程度の関連性もあり、仕事をしながらもDVAに関連する内容も覚えていることが多いので、無理はないと思います。

順調に合格すれば、SOAを12月初めに受験してAssociate3つの資格取得という目標を達成し、SAPの準備につなげることができそうです。
情報セキュリティ管理の概要

### 情報セキュリティの三大要素
企業が保有する情報は単なる情報ではなく、「情報資産」と認識し、情報資産の価値に損失が出ないようにしなければならない。
**物理的脅威**　火災、天災、ハードウェア障害などの物理的障害
**技術的脅威**　不正アクセスによる情報漏洩、Web改ざん、ウイルスによるデータ破壊など
**人的脅威**　オペレーターによる入力ミス、削除ミス、データ持ち出しなど
これらの脅威に対策する為に、**情報セキュリティ**という。
**情報セキュリティ**　情報の**機密性**、**完全性**、**可用性**を維持すること
**機密性**　強化されていない利用者及びプロセスは、情報にアクセスできないようにすること
**完全性**　情報及びその処理方法が、正確及び完全であること。たとえば、ある情報に対して入力や変更といった処理が行われる過程で、内容の改ざんと欠落などがなく、正しく処理されること。
**可用性**　許可された利用者及びプロセスが要求した時、いつでも情報にアクセスできること。
　要は、**情報の機密性、完全性、可用性を確保、維持することにより、様々な脅威から情報システムや情報などの情報資産を保護し、情報システムの信頼性を高めること**が情報セキュリティの概念。
### 情報セキュリティポリシーは運用ルール
企業や組織は総合的な情報セキュリティポリシーを策定し、それを従業員に公表・通知しなくてはならない。組織全体で統一な情報セキュリティ対策を実施することが不可欠。
　この情報セキュリティポリシは、情報セキュリティ基本方針と情報セキュリティ対策基準から構成される。
　**情報セキュリティ基本方針**、組織における情報セキュリティ対策の基本的な考え方を表すもので、どのような脅威から、何を、何故保護になければならないかを明らかにし、組織の情報セキュリティに対する姿勢を示す。
　**情報セキュリティ対策基準**、情報セキュリティ基本方針に基づき、情報セキュリティ対策を講ずるにあたり遵守すべき行為及び判断などの基準の統一するため、必要となる基本的な要件を定めたものです。
### 情報セキュリティポリシの位置付けと策定手順
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/e296b26f-3fc5-a6cd-67a5-133d2ee572f4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/90998b4c-8e10-8b31-2cc5-4dd7b06ee5aa.png)
### リスク分析とリスク対応
#### リスク分析
**リスク分析の手順**
①どのようなリスクが存在するかを調査する。
②それぞれのリスクがどれくらいの頻度で発生するのかを分析する
③それぞれのリスクが起こった時の損失や被害の程度、損失額、業務への影響を見極める。
リスクの大きさを**リスク値**で算定する。算定方法は、**定量的評価**と**定性的評価**
定量的評価　リスクが現実化したときの「予想損失額*確率」をリスク評価額。
定性的評価　数量的に評価するのではなく、情報資産の価値、脅威、脆弱性相対的評価値を用いて、その積でリスク値を算定する。
#### リスク対応
　二つの考え方
①**リスクコントロール**　リスクが現実化しないように事前防止、現実化しても損失を最小限。
②**リスクファイナンス**　リスクが現実化したときのために備える資金対策。
#### 情報セキュリティポリシの実施サイクル
　情報セキュリティ対策は、後に見なす必要がある。
　PLAN（計画・策定）⇒DO（実施）⇒CHECK（点検、評価）⇒ACT（見直し・改善）といった**PDCAサイクル**を継続的に繰り返す。
　この取り組みは、**ISMS（情報セキュリティマネジメントシステム）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/7de92e59-906e-6167-a555-0899d9e8ab62.png)

練習問題
情報セキュリティは、機密性、完全性、可用性の三つの事項を維持するものと定義される。
情報セキュリティ基本方針は、組織における情報セキュリティ対策に対する基本的な考え方や仕組みを明文化したものである。
情報セキュリティポリシの適用対象は、パートを含める全従業員である。
リスク分析におけるリスク値の算定方法は、定量的と定性的評価がある。
PDCAサイクルにおいて、情報資産のリスクアセスメントはPLANフェーズで実施される。
PDCAサイクルにおいて、セキュリティ教育はDOフェーズで実施される。
FlutterでFirebaseのCloud Storageに写真をアップロードしたときのメモ

## 利用環境
``` yaml:pubspec.yaml
  firebase_auth: ^4.2.2
  firebase_auth_web: ^5.2.10
  firebase_core_web: ^2.2.2
  firebase_core: ^2.10.0
  image_picker: ^0.8.7+4
  firebase_storage: ^11.1.1
```

## 実現したかったこと
- flutter経由でFirebaseのCloud Storageにスマホの写真フォルダにある写真をアップロードして、アプリ画面に映し出せるようにしたかった。
- Cloud Storageにアップロードされた写真のurlを取得する

## 起こった問題
- 現在(2023年10月時点)の[公式ドキュメント](https://firebase.google.com/docs/storage/flutter/upload-files?hl=ja)通りやったがうまくいかなかった

## 解決法
・メタデータ(ファイルのパス?)も一緒にアップロードしたら解決した。
``` dart
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:image_picker/image_picker.dart';

//一部省略しています

//写真をアップロードするメソッド
void _uploadPhoto() async {

      UploadTask uploadTask; 
      final uid = FirebaseAuth.instance.currentUser?.uid; //uid取得
      ImagePicker imagePicker = ImagePicker();  //写真フォルダを開く

      XFile? file = await imagePicker.pickImage(source: ImageSource.gallery);
      if (file == null) return;

      Reference referenceRoot = FirebaseStorage.instance.ref("images/$uid").child(file.name); //cloud storageの/imagesフォルダにアップロード

      final metadata = SettableMetadata(
          contentType: 'image/jpeg',
          customMetadata: {'picked-file-path': file.path});

      if (kIsWeb) {
        uploadTask = referenceRoot.putData(await file.readAsBytes(), metadata);
      } else {
        uploadTask = referenceRoot.putFile(io.File(file.path), metadata);
      }

      print('アップロード完了');
      downloadUrl = await referenceRoot.getDownloadURL(); //url取得
      print('downloadUrl:$downloadUrl');
  }
```
自宅サーバーにUbuntu22.04をインストールしてSSH接続できるようにした話

## 目次
[はじめに](#はじめに)

[手順1 windowsのバックアップ](#手順1-windowsのバックアップ)
[手順2 Live USBの作成](#手順2-Live-USBの作成)
[手順3 Ubuntuをインストール](#手順3-Ubuntuをインストール)
[手順4 必要なパッケージのインストール](#手順4-必要なパッケージのインストール)
[手順5 メインPCとSSH接続](#手順5-メインPCとSSH接続)
[手順6 公開鍵認証の設定](#手順6-公開鍵認証の設定)

[おわりに](#おわりに)

## はじめに

先日ミニPCを新たに購入したので、Ubuntu22.04 serverをインストールしてメインPCからSSH接続できるようにした記録を残します。
今回買ったミニPCにはデフォルトでWindows11が入っていたので、手順1でデータを回復ドライブに移します。OSが入っていない状態から始める場合は「手順1」は飛ばして問題ありません。

## 手順1 windowsのバックアップ
ミニPCにはデフォルトでwindowsが入っていたのですが、今回はミニPCのストレージに直接Ubuntuをインストールするためwindowsが完全に削除されます。
特に使う予定はないのですが、念の為気持ち程度に回復ドライブを作成しておきます。

※この方法でwindowシステムが復旧できるとは保証できないので行う場合は自己責任でお願いします。あくまで「わんちゃんこれで復旧できるんじゃね」くらいのモチベです。(自分でプロダクトキー買うと高いからね)

回復ドライブの作り方は調べればすぐに出てくるのでここでは省略します。このサイト↓が参考になりました。

https://www.fmworld.net/cs/azbyclub/qanavi/jsp/qacontents.jsp?PID=8511-2867

## 手順2 Live USBの作成
こちらのサイトからUbuntu22.04 serverをダウンロードします

https://jp.ubuntu.com/download

ダウンロードが完了したら、isoファイルをUSBに書き込んでLive USBを作成します。

今回はbalenaEtcherを使用しました。

https://etcher.balena.io

## 手順3 Ubuntuをインストール
作成したUSBをミニPCに挿して起動します。Ubuntuのインストーラーが起動しない場合はBIOSで起動順序を変更してUSBを一番上に持っていく必要があります。

うまく行くとUbuntuのインストーラーが起動するので画面の指示に従って設定をしていきます。

## 手順4 必要なパッケージのインストール
`sudo apt update`
`sudo apt upgrade`
で最新の状態にします。

SSH接続をするために`openssh-server`をインストールします。
`sudo apt install openssh-server`

## 手順5 メインPCとSSH接続
ミニPCをメインPCと同じWiFiに接続して、プライベートIPアドレスをメモします。

次にメインPCで次のコマンドを実行します。
`ssh {作成したユーザー名}@{メモしたIPアドレス}`
パスワードの入力を求められるので入力するとログインができます。

## 手順6 公開鍵認証の設定
1. メインPCで公開鍵と秘密鍵のペアを作成します。作成した公開鍵はコピーしておきましょう。
`ssh-keygen -f {作成する鍵のファイル名}`
`cat {作成した鍵のファイル名}.pub`

2. サーバー側に作成した鍵を登録します。
`vi ~/.ssh/authorized_keys`
コピーした公開鍵をペーストして`:wq`で保存します。

3. メインPCのSSHの設定ファイルにミニPCの情報を記述します。
メインPCで`~/.ssh/config`に以下の記述を追加します。
ミニPCの名前は自分の好きな名前を設定してください。
```~/.ssh/config
Host {ミニPCの名前}
   HostName {ミニPCのIPアドレス}
   User {作成したユーザー名}
   IdentityFile {作成した鍵のファイル名}
```
これでメインPCで`ssh {ミニPCの名前}`でミニPCにログインできるようになります。

## おわりに
今回はミニPCをセットアップしてメインPCからSSH接続ができるようにしました。次回はセキュリティ関連の施策を施した上でサーバーを公開していきたいと思います。
AWSソリューションアーキテクトプロフェッショナル合格記

## はじめに

先日、タイトルの通りAWSのソリューションアーキテクトプロフェッショナル（以下、SAP）に合格することができました！！
勉強の方法や当日の内容面以外での注意点等まとめようと思います。

## プロフィール
私の簡単なプロフィールです。
ITエンジニア歴：4年
AWS歴：3年
業務内容：要件定義、基本設計、詳細設計、構築など
保有AWS資格：SAA

## 受験の動機
業務でAWSを扱っており、会社としても資格は取ってねという風潮でした。SAA取得から1年以上期間が開いてしまっていたのでそろそろ取るか。。というタイミングになったので今回受験しました。

## 勉強のあれこれ
　私は短期間で詰め込むのが苦手、かつコツコツするのも苦手なので本当の最初の勉強を始めたタイミングからだと、9か月ほど時がたっていました。後で詳しく書きますが、最初は比較的簡単な参考書を買いそれを少しづつ読んでいくということをしていました。その後勉強しない期間を挟み合格の2か月前くらいから勉強量を上げていきました。ただ、やっても毎日平均30-40分ほど練習問題を解くといったくらいでした。
　最初はちゃんと理解したうえで合格を目指いしていましたが、範囲が広すぎる＆細かいことまで聞かれすぎるなということに気づき、1回しか出てこないサービスは覚えようとしない、苦手分野（ADの認証周りなど。。）は触りくらいまでしか理解しないでOKというように割り切りました。
結果合格はできましたが、当日は2択までは絞れてあとは運！みたいな問題も多くたまたま合格できたなという感じでした。ですので確実に1回で合格したい問う方は苦手分野をなくして、練習問題で出てきたサービスは全部頭に入れるくらいで行く必要があるかと思います。

## 教材　
AWS認定ソリューションアーキテクト－プロフェッショナル～試験特性から導き出した演習問題と詳細解説～
Amazonのリンクは[こちら](https://www.amazon.co.jp/gp/product/B08F9CQ6LT/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&psc=1)です
おススメ度　★★☆


Udemy【SAA-C03版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）
おススメ度　★☆☆

Cloud License
リンクは[こちら](https://cloud-license.com/)
おススメ度　★★★

上記の3つの教材で勉強しました。結果として「Cloud License」が一番役に立ちました。本番の試験とレベルが一番近く、解説もわかりやすい。また、1問ごとに答えが出るので短時間でも勉強がしやすいという点もお勧めです。
「AWS認定ソリューション・・」は、解説書＋模擬試験が1回分という形です。解説も割と初歩的な部分から各サービスがどのようなものか書かれており、業務で実際にAWSをあまり触っていないという方には導入としておススメです。ただ、実際の試験で問われる細かい仕様まではカバーできていない部分があるのでそこは都度調べたりする必要があります。
最後がUdemyについてです。これは買う前から少しうわさで聞いていたんですが、内容が難しすぎました。。実際の試験でもここまでは聞いてこないだろうという細かい箇所まで問題になっていました。特に私は勉強を始めた序盤で手を出してしまったため結局あまり使うことはなかったです。ただ、満点に近い点数を目指したいという方には最後の総仕上げとしてよいかもしれないです。

## 当日
試験時間が3時間ととても長丁場なので集中力が肝になると思います。私は普段より早く寝ることで当日は普段より3倍くらいは集中できていたと思います（笑）。3時間一度も集中力が途切れることなく望めました。
また、季節によりけりですが体温調整できる服を持っていくこともお勧めます。私は夏場（9月ですが暑かった）の受験でクーラーが効いている環境でした。最初の2時間くらいは特に問題はなかったですが、それ以降はずっと風にあたり続けることもあり結構寒く感じることがありました。

## 今後
今後はとりあえず残りのアソシエイト資格（SAA以外）を2023年中に取得しようと思っています。会社でSAPをすでに取得した方に聞きましたが、SAPを取得した後だと他のAWSの資格も楽に取れるとのことでした。（具体的にどの資格かは忘れてしまいましたがノー勉強で取得できたそう。。）また、Cloud Licenseも90日単位の課金でまだ期間が残っているのでついでに資格をお得に取得しようというところです。
axiosのインターセプター axios.interceptors.response.use()

## axios.interceptors.response.use()

:::note
axios.interceptors.response.use() は、APIからのレスポンスが返された直後、またはエラーが発生した場合に実行される関数を指定することができる。
:::

このメソッドは以下の2つのコールバック関数を引数として提供する。

#### Success Callback
最初のコールバックは、レスポンスが成功した場合に実行される。このコールバックは、レスポンスを受け取り、必要に応じてレスポンスを変更または加工し、その後の処理に渡すことができる。

#### Error Callback
2つ目のコールバックは、レスポンスがエラーを返した場合、またはリクエスト中に何らかのエラーが発生した場合に実行される。このコールバックを使用して、エラーハンドリングやエラーロギング、特定のエラーレスポンスに基づくアクションの実行などの処理を行うことができる。

```javascript
// apiClientはaxiosのインスタンス
apiClient.interceptors.response.use(
  function(response) {
    // 何らかの成功時の処理。例えば、レスポンスデータを変更することもできます。
    return response;
  },
  function(error) {
    // 何らかのエラーハンドリング。例えば、特定のエラーコードに応じてリダイレクトすることもできます。
    return Promise.reject(error);
  }
);
```

インターセプタの設定により、全てのAPIリクエストのレスポンスに対して一貫した処理を適用することができる。
情報共有をして稼働率を上げていこう！

みなさん、こんにちは！
旅行とおうちでまったりすることが大好きな社会人3年目のキイロです！

今回は**作成したツールを試してもらいました！**


前回の記事もあわせてよんでみてください！

https://qiita.com/kiiro-akari/items/b894b2ae785c85484f50

# ツールを作った経緯
前回の記事でも書かせていただきましたが、キイロの職業はスーパーマーケットの社員です！
所属している部署は手書きや口頭での伝達が多い職場なので、今日あったことを簡易的に書き留めることができる**日報的なものを作成し、保存できるツールを作成しよう**と思いました！

# 完成形

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">こんな感じ。<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a><a href="https://twitter.com/hashtag/%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8%E3%83%A3%E3%83%BC%E3%82%BA?src=hash&amp;ref_src=twsrc%5Etfw">#チャレンジャーズ</a> <a href="https://t.co/f5R4mrC36s">pic.twitter.com/f5R4mrC36s</a></p>&mdash; あかり (@akashiro_as) <a href="https://twitter.com/akashiro_as/status/1715011523851235390?ref_src=twsrc%5Etfw">October 19, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 今回使用したツール
[Glide](https://www.glideapps.com// "Glide")
Google スプレッドシート

作成方法の参考記事

https://qiita.com/kaito1994/items/564b6c3734d00a82d8b2



# 使用する前の説明
今回このツールを使用していただいたのは、同じ部署の同世代の同僚のAさん。

⓵店舗に行った際に感じたことをすぐに書き留められるような**簡単な日報**みたいなものを作成したいこと
⓶さまざまな店舗があるなかで、**店舗によりそった対応**をしていきたいこと
⓷部署の課題でもある**稼働率をどう読み解いているのかを統一**していきたいこと
⓸集めた**データから読み取れるポイントを探っていき次につなげていきたい**こと
⓹店舗名、記載した人、良かったポイント、悪かったポイント、日付をツールの中身として入れたこと
⓺どの範囲まで閲覧・記載できるように設定するかは未定ということ

この6つを使用する前に説明しました。


# フィードバック（試作品に対して）
・使いたい機能ではある
・使用する人によって使用方法までの手順を考えて使ってもらうことを考えると難しい
・新しいことを取り入れることが簡単にはできない
・稼働率は自身で記入するのではなく、自動で出力してもらいたい
・店舗によって目標値を設定できるようすると高めあえそう
・その場でのお客さまのご意見も入れる欄がほしい



# フィードバック（機会があれば試作してもらいたい・提案）
2人で話をしているうちにまだまだ作っていきたい、デジタルのチカラで改善していきたいものが浮かんできました。


**⓵部署内での書類検索機能**
書類1つに対してもいろんなところに提出されていたり、データがいろんなところに散らばっていたりするので、ワードや内容を検索すればヒットする部署内検索機能

**⓶さらば手書き領収書**
サービスカウンター業務のなかの1つでもある手書き領収証
計算を間違えたり、記載事項をミスすると書き直しになってしまってお客さまにもご迷惑をおかけしてしまうけれども手書きとはさらばして、項目を1つずつセレクト、お客さまごとに変化する宛名だけは入力にできれば、ミスなく簡単に手書き領収証が完成させられる機能


**⓷同じ内容の入力シートと手書き記載書類をまとめたい**
1つの内容なのに提出するものはなぜか2つある書類があり、提出形式は異なるが1つにまとめる機能

# 終わりに

実装するにあたって、簡単に作成したものを何度もフィードバックをもらい改良を重ねることで、より良いものが完成するのではないかと感じました。
1つツールを作成してみることによって、この機能があればこんなこともできそう！といった提案まで考えられるので、試しに作成してみるということの大切さを感じました。

続けて改良したものを作成していきたいと思います！
バックグラウンドにある Xcode をショートカット1回でアクティベート&ビルドする【Keyboard Maestro】


# 概要

最近アプリの作成にソースコードの編集は別のエディタで行って、ビルドは Xcode で行っています。
ビルドのたびに Xcode のビルドボタンを押すためマウスに持ち替えていました。とても手間でした。

Keyboard Maestro というツールを使って、ショートカット1回で済むように設定しました。
その設定がとてもかんたんだったので設定内容の紹介です。

## Keyboard Maestro 概要

Keyboard Maestro は自動化ツールです。
バージョンごとの買い切り型です。
導入手順や新規マクロ作成手順はこの記事には記載しません。

公式サイト

https://www.keyboardmaestro.com/main/

# 設定

マクロを以下のように設定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63607/eaaff0c0-459e-0f2a-30f7-1c3082d6271e.png)

トリガー設定とアクション設定に分けて説明します。

## トリガー設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63607/1959e68d-8df3-3995-8571-33882d34a37c.png)

`This hot key` はショートカットキーの設定です。
今回はテンキーの4を割り当てています。

アクティブなアプリごとにマクロの有効/無効を設定できます。普通にテンキーを使いたいアプリがあっても安心です。

## アクション設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63607/73d30389-a001-0717-ae56-6ad16f2c9491.png)

マクロ内のアクションは以下です。

1. `Activate ...`: Xcode をアクティブにして
1. `Pause for ... Seconds`: 3秒待って
1. `Type ... Keystroke`: ビルドのショートカットキー入力する

アクションは GUI 選択式で設定でき、パラメータもわかりやすいです。

# おわり

マクロ作成がトリガー、アクション合わせてたった4つで済みました。かんたん。

使い勝手がいいため、ここ2週間ぐらいでも利用回数は100超えているはず。ショートカットってたのしいです。

# NOTE: Keyboard Maestro のアクションについて

Keyboard Maestro のアクションは今回のもの以外にもたくさんあります。
アクション一覧が公式ページにまとまっています。各アクションごとのヘルプページもあります。

https://wiki.keyboardmaestro.com/Actions

名前だけ一覧で見てもピンとこないですが、GUIだとカテゴリ分け+アイコン+名前なのでイメージが付きやすいです。
Keyboard Maestro が強力なツールだと感じるカテゴリについてスクショ貼ります。

## 操作系

|Application Control|Clipboard|Image|Interface Control|
|:--|:--|:--|:--|
|アプリの操作<br>起動、アクティベート、終了が理解しやすい。|クリップボードの操作<br>アクションの結果をクリップボードにセットできる。|画像に関する操作<br>単体でOCRができる。<br>画面から画像に一致するものがあるか調べられる。結果は変数に保存される。|キーボード入力やマウスカーソル操作<br>`Click at Found Image` は画面から画像に一致する箇所を探してクリックができる最強の自動化機能。|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63607/4156bac1-4a46-f6ef-4504-bc5acafc6368.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63607/d21093be-b034-fff2-04aa-0ed787fdc8c1.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63607/e28a27f4-d09b-38ec-1f57-71527c8b65c0.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63607/7ec3a173-207f-7ebe-6364-9ad1da9c93b0.png)|

## 制御系

|Control Flow|Variables|
|:--|:--|
|`If`,`While` がある。|アクションの結果は変数で扱えます。入力プロンプトもあります。|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63607/09710c09-837d-e16c-66a1-5796c8d3b3e5.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63607/ac04d84c-2d6b-cf75-51bd-b7e046d6a06a.png)|