OmniAICreator/Qiita-1.07M huggingface dataset:
【TCA】@BindingStateを使って値を監視する

# はじめに
@BindingStateの使い方を記録しておきます

# 完成
![画面収録-2023-09-15-19.59.47.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/920c9395-67a6-67f5-da04-c8a74c04e617.gif)

# 実装
### Reducer
```diff_swift
import Foundation
import ComposableArchitecture

public struct SampleReducer: Reducer {
    public init() {}

    // MARK: - State
    public struct State: Equatable {
+       @BindingState var text = "" // @BindingStateを付与
        
        public init() {}
    }

    // MARK: - Action
+   public enum Action: BindableAction, Equatable { // `BindableAction`に準拠させる
+       case binding(BindingAction<State>)
    }

    // MARK: - Reducer
    public var body: some ReducerOf<Self> {
+       BindingReducer() // ここが重要
        
        Reduce { state, action in
            switch action {
+           case .binding(\.$text):  // ここにtextの変更が流れてくる
+               print("変更:", state.text)
+               return .none
+           case .binding: // ここはその他の`binding`が流れてくる(今回はなし)
+               return .none
            }
        }
    }
}
```

### View
```swift
import SwiftUI

struct ContentView: View {
    @ObservedObject private var viewStore: ViewStoreOf<SampleReducer>
    
    let store: StoreOf<SampleReducer>
    
    init(store: StoreOf<SampleReducer>) {
        self.store = store
        self.viewStore = ViewStore(store, observe: { $0 })
    }
    
    var body: some View {
        VStack {
            TextField("search", text: viewStore.$text) // 使う時は`$`を付ける
                .textFieldStyle(.roundedBorder)
        }
        .padding(.horizontal, 20)
    }
}
```

# おわり
TCAめっちゃむずいです
せんせー、プログラマブルバイオマテリアルってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、プログラマブルバイオマテリアルってなに？

# プログラマブルバイオマテリアルとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## プログラマブルバイオマテリアルって何？

プログラマブルバイオマテリアルは、まるで魔法の材料のようなものだよ。人々がこの材料に特別な命令を出して、それが自分で形を変えたり、色を変えたりすることができるんだよ。

## どういうこと？

この特別な材料は、科学者がコンピュータを使って「プログラム」することができるんだ。プログラムするというのは、この材料に「君はこうなってね」と教えることだよ。そして、この材料はその命令に従って、形を変えることができるんだ。

## どうしてそれがすごいの？

これはすごいことなんだよ。なぜなら、このプログラマブルバイオマテリアルを使って、今までにない新しいものや、特別なものを作ることができるからだよ。たとえば、変わった形のおもちゃや、自分で動く服などを作ることができるよ。

## だから、プログラマブルバイオマテリアルってなに？

プログラマブルバイオマテリアルは、人々がコンピュータで命令を出して、自分で形を変えることができる特別な材料なんだよ。

# まとめ

プログラマブルバイオマテリアルは、まるで魔法のように特別な命令で色んな形に変わることができる材料なんだよ。これから、この材料でとても楽しいものや便利なものがたくさん作られるかもしれないね！
せんせー、プラズマエンジンってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、プラズマエンジンってなに？

# プラズマエンジンとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## プラズマエンジンって何？

プラズマエンジンは特殊なエンジンで、宇宙に行くロケットに使われることがあるよ。このエンジンは、ガスをとても、とても熱くして「プラズマ」という状態にして、それを使ってロケットを動かすんだよ。

## どういうこと？

普通の車はガソリンを使って動くけど、プラズマエンジンは特殊なガスを使って動くんだよ。このガスをとても熱くして、それから速く吹き出す力でロケットを前に進めるんだ。

## どうしてそれがすごいの？

このエンジンは、普通のロケットエンジンよりももっと遠くの宇宙まで行けるんだよ。だから、未来の宇宙探査には、このプラズマエンジンがとても重要になるかもしれないんだ。

## だから、プラズマエンジンってなに？

プラズマエンジンは、特殊なガスを使って宇宙ロケットを動かすすごいエンジンなんだよ。これを使えば、今まで行けなかった遠くの宇宙まで行けるようになるかもしれないんだよ。

# まとめ

プラズマエンジンは宇宙探査をもっと進めることができるすごいエンジンなんだよ。このエンジンを使ったロケットで、新しい星や惑星を発見することができるかもしれないね！
せんせー、脳波制御ゲームってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、脳波制御ゲームってなに？

# 脳波制御ゲームとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## そもそも、脳波ってなに？

脳波は、私たちの頭の中にある脳という部分が出す、とても小さな「電気のようなもの」だよ。この小さな電気が集まって、私たちが考えたり、動いたりすることを助けているんだよ。

## 脳波でできるゲームって？

脳波制御ゲームとは、この脳から出る小さな電気を使って遊ぶゲームのことだよ。特別な帽子のようなものをかぶって、その帽子が脳波を読み取るんだ。そして、私たちが考えることで、ゲームの中のキャラクターを動かしたり、形を変えたりすることができるんだよ。

## どうやって遊ぶの？

特別な帽子をかぶって、ゲームを始めると、画面に出てくるキャラクターを「考えるだけ」で動かせるんだよ！例えば、「前に進め！」と強く考えると、キャラクターが前に進んだりするんだ。

## それって、どんなふうに遊べるの？

いろんな遊び方があるよ。例えば、レースゲームでは、早くゴールを目指してキャラクターを動かしたり、パズルゲームでは、パズルのピースを正しい場所に移動させたりするんだよ。

# まとめ

脳波制御ゲームは、特別な帽子をかぶって、私たちの脳波を使って遊ぶ新しいタイプのゲームなんだよ。考えるだけで遊べるので、手や足を使わずに楽しむことができるんだ。お友達や家族と一緒に、新しい体験を楽しんでね！
Denoに入門するときに役立つサイトをまとめてみた。

# はじめに

Denoをキャッチアップするときに有益だと思ったサイトをまとめておいたので公開🦕
随時更新予定


## 公式様🧝🏻‍♂️

https://deno.land/manual@v1.36.4/introduction

https://github.com/denoland

## 日本語でチュートリアルを見たい人向け
https://deno-ja.vercel.app/manual

https://zenn.dev/uki00a/books/effective-deno/viewer/first-step

## denoスタイルガイド
ファイル・関数名はスタイルガイドを遵守したい人へ

https://deno.land/manual@v1.36.4/references/contributing/style_guide

## Denoの最新情報をお手軽にウォッチしたい人へ
RSS購読しておくとよし👍
情報が整理されていて読みやすい、圧倒的感謝🙇‍♂️

https://uki00a.github.io/deno-weekly/

## 標準モジュールについての詳しい解説
https://gihyo.jp/article/2023/01/deno-standard-modules-01#ghdaDe0qZ9

## 公式のYoutubeチャンネル
ライブコーコーディングしている時もあるし、過激なことを言ってる時もあっておもろい。

https://www.youtube.com/@deno_land

https://www.youtube.com/watch?v=qvieJBbUuDk&t=2575s

## Deno showcase 
サンプルからコードいじる時に使う

https://fresh.deno.dev/showcase

#おまけ

https://deno.com/blog
コピペ集（自分用）

### htmlのテンプレ

```python
<!DOCTYPE html>
<html lang="ja">
   <head>
      <meta charset="utf-8">
      <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
      <script src="https://code.jquery.com/jquery-3.7.0.js" integrity="sha256-JlqSTELeR4TLqP0OG9dxM7yDPqX1ox/HfgiSLBj8+kM=" crossorigin="anonymous"></script>

   </head>
   <body>
      <nav class="navbar navbar-expand-lg navbar-light bg-light">
        <a class="navbar-brand" href="{% url 'accounts:home' %}">ホーム</a>
      </nav>
      {% block content %}
      {% block javascript %}{% endblock %}
      {% endblock %}
   </body>

</html>
```
Vertex AutoML の分類モデル予測結果をBigQueryで確認する方法

AutoMLで分類モデルのバッチ予測結果をBigQueryに出力すると、結果はREPEATEDという型でクラスとスコアが格納されます。
ここから、最もスコアが高い分類結果を抽出するには以下のように一度REPEATED型をUNNESTしてからWINDOW関数でスコアが高い順にして、一番スコアが高いものだけWHERE句で指定できます。

```
SELECT
  customer_id,
  classes,
  scores
FROM (
  SELECT
    customer_id,
    classes,
    scores,
    ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY scores DESC) AS rank
  FROM
    myproject.mydataset.predictions_2023_09_13T19_47_23_623Z_960 p,
    UNNEST(p.predicted_class.classes) AS classes,
    UNNEST(p.predicted_class.scores) AS scores )
WHERE
  rank=1
```
「Gitでのタスク依存関係」タスク1が終わらないとタスク2が進めないときに

## はじめに

基本的に新しいタスクを取り組むときに、`main`または`master`ブランチから新しいブランチを切ると思うよね。しかし、チーム開発でよくある問題で、「このタスクがまだマージされないから、関連するタスクが進めないよ」という時にどうすればいい？

## 具体的な事例

タスク1とタスク2の関係がある。タスク1が終わらないとタスク2が進めない状態。タスク1を先にやって、PR作成して、レビュー待ちの状態になっている。今はタスク2をやると思ったらまだレビューを待っている。

## 解決方法

### ブランチを切る

**基本的に`タスク1`（PR作成したブランチ）からタスク2のブランチを切る！**

git graphを見るとこういう感じ

```
...---A---B---C  master
           \
            D---F  task1
```

ここで`タスク2`のブランチを切る

```
...---A---B---C  master
           \
            D---F  task1
                 \
                  H---I  task2
```

`タスク1`のPRがマージされたら

```
...---A---B---C---M  master
           \     /
            D---F  task1
                 \
                  H---I  task2
```

そこから、開発を進んでいくといいと思う！
しかし、`タスク1`がレビューされて修正がある場合にどうしよう？

ここでは、`タスク１`をマージされることを待って、`master`ブランチから`タスク2`にマージする。理由は`master`にマージされるということは、修正が終わったため、修正した部分を今のブランチにマージして大丈夫！（`M`はマージされたコミット）

```
...---A---B---C-------J  master
           \         / \
            D---F---G   \  task1
                 \       \
                  H---I---M  task2
```

### タスク2がmasterにマージする時に

`タスク2`が完成して、`master`にマージしようとして、直接`master`にPRを作成する

```
...---A---B---C-------M-------N  master
           \         /       /
            D---F---G---H---I   task2
                    |
                 task1
```

こういうgit historyになります！
また、タスク1の修正があっても、タスク2にマージされるので、コンフリクトが起きないはず！


## 最後に

gitを使って管理できるけど、レビューによって仕様が変わったり、修正点もあるから、結局タスク2で結構な修正があるかもしれない。一番いいのが、他のタスクがあれば、そっちに進んだ方がいいと思われるだろう。
あくまで、調べた回答と自分の経験で書いたので、もっといいやり方があれば教えてください！

## 参考

https://stackoverflow.com/questions/51378279/dependent-task-and-pull-request
【VBA Collection オブジェクト】 使い方 まとめ

こんにちは。
今年の4月に入社し、8月から現場に配属された新人エンジニアです。
配属と同時に今まで全く触ってこなかったVBAの言語を用いての開発などを行うことになりました。
今後、VBAの力をつけていく為にも、Qiitaで主にVBA関連の知識をアウトプットしていきます。

## 目次
[1.本記事で分かること](#1-本記事で分かること)
[2.Collectionオブジェクトとは](#2-Collectionオブジェクトとは)
[3.Collectionオブジェクトの使い方](#3-Collectionオブジェクトの使い方)
[4.まとめ](#4-まとめ)
[5.参考文献](#5-参考文献)

## 1. 本記事で分かること
・Collectionオブジェクトのプロパティ・メソッド一覧
・VBAのCollectionオブジェクトの使い方

## 2. Collectionオブジェクトとは
「データのアイテムとキーのペアを保存するオブジェクト」のこと。
またキーは省略可能。
配列のようにサイズを宣言する必要はない。
各キーには数値と日付は代入不可。
データ型の異なるデータを格納できる。

## 3. Dictionaryオブジェクトの使い方
### 1.宣言
```vb
Dim coll As New Collection
```

### 2. メソッド・プロパティ
#### メソッド・プロパティ一覧
![20230915Collectionオブジェクト一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509157/1909bfef-3f51-de5c-04a8-d96754079be5.png)


#### 使用例
```vb
Sub Sample_Collecion()

    Dim coll As New Collection
    Dim value As Variant
    
    'Collectionにアイテムとキーを追加
    coll.Add 100, "キャベツ"
    coll.Add 150, "レタス"
    coll.Add 200, "長ネギ"
    coll.Add "八百屋" 'キーは省略可能
    
    'インデックス1と4を確認
    Debug.Print coll.Item(1)
    Debug.Print coll.Item(4)
    'キーでも指定可能
    Debug.Print coll.Item("キャベツ")
    
    coll.Remove (2)  'インデックス2を削除(キーでも指定可能)
    
    Debug.Print "Count：" & coll.Count
    
    'アイテム一覧を確認
    For Each value In coll
        Debug.Print value
    Next
    
    

End Sub
```
#### 実行結果
![20230915Collection実行結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509157/79258f46-4372-9d21-3ae0-bdca315f8d60.png)



## 3. まとめ
今後もVBAの学習の為に記事の投稿をしていきます。
ありがとうございました。

## 4. 参考文献
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/collection-object
pyautogui を使ってみた

# pyautogui とは

>Pythonでデスクトップオートメーションを簡単に行うためのモジュールです。
>このモジュールを使用すると、マウスの動きやクリック、キーボードの入力など、ユーザーが普段手動で行う操作をプログラムから自動化できます。


## 使い道

例えば、Celenium ライブラリはブラウザ上のスクレイピングだけなのに対し、こちらはGUI上でファイルのドラッグなども可能。  
組み合わせると大部分のルーティン業務は自動化できそう。  
bot と認識されないメリット(?)もあります。


## 基本関数

### click(x, y)
モニター上の座標をクリックする。  
下で紹介する画像認識で、その見つかった画像（アイコン）をクリックさせることも可能

### moveTo(x, y)
モニター上の座標にポインタを移動させる。  

### scroll()
マウスホイールを上下に動かす。  
例えば、Webページで特定の画像が見つからなかったら下にスクロールさせる、というような使い方が可能

### dragTo()
ドラッグ&ドロップする。ファイルの移動等に使える


## 画像判定

### locateOnScreen()

ディスプレイ上に、指定した画像が存在するかどうかを調べる。存在する場合、その座標が返る。  
特定のアイコンが画面上に存在したらそれをダブルクリック、といった用途で使える。  
後述のパラメータを指定して使う。

※複数モニタ使用の場合、メインディスプレイが対象となる
※Retinaディスプレイの場合は、座標が2倍になるので要注意

#### confidence
一致度の確からしさ。  
デフォルトが1(完全一致)になっていて、基本的にこの引数を1より小さく指定しないと画像は取得できない。  
0.5 位だと、思わぬ似た画像に引掛かる場合もある  
0.7 位ならだいたい見つかる  
0.95 にすると、ほぼ似た画像は排除できる

画像の明度については 判定が弱いようで、例えば以下画像だと、0.9上にしないと区別できなかった。

**判定用画像**
![test.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418521/c3cf1287-2a65-dab6-518c-0c19e79c7fa3.jpeg)


**モニター上の画像**
![screencapture 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418521/2084b4ce-7092-a778-0785-4e350ef178fc.jpeg)


confidence を .8 にすると、左のグレースケールの画像でも一致すると判定された。  
※grayscale というパラメータも存在するが、そちらを False にしても同じ
この画像の場合だと、0.9以上で右にしか一致しなくなった

#### region
画像を探す範囲をタプルで指定できる。  
例えば、(0,100, 400, 300) と指定すると、座標(0, 100) から 400(w) × 300(h)の範囲を検索する

## 所管
MLと組み合わせると、更に色々と面白いことができそうな予感。  
触ってて楽しい。
SASS記法のマップ変数でエラーが出る

SassのSASS記法だとマップ変数のところでエラーが出る。
検索してもほとんど出てこなかったのでここにメモ書きしておく

```sass
@use "sass:map"

// 以下の書き方だとOK
$breakpoint-up: ("sm": "only screen and (min-width: 400px)","md": "print, screen and (min-width: 768px)","lg": "print, screen and (min-width: 980px)","xl": "print, screen and (min-width: 1400px)",) !default 
// 以下の書き方だとエラーが出る
$breakpoint-up: (
  "sm": "only screen and (min-width: 400px)",
  "md": "print, screen and (min-width: 768px)",
  "lg": "print, screen and (min-width: 980px)",
  "xl": "print, screen and (min-width: 1400px)",
) !default 
```

SASS記法の場合、map変数は一行で書く必要がある
うっかり忘れるけど`@use "sass:map"`も必要
amplifyで作成したCognitoのユーザープールのカスタム属性をAuthで取得する 2023/09/15

### amplifyでCognitoを作成
下記の内容を参考にCognitoを作成しましょう。
その際、カスタム属性の作成はできません。できるのは標準属性のみが作成できます。
> https://docs.amplify.aws/cli/auth/overview/
### cognitoにカスタム属性を追加
awsコンソールを表示してcognitoのユーザープールに移動します。上記で作成したユーザープールを選択して、サインアップエクスペリエンスタブを選択してカスタム属性を追加してください。
### amplifyのライブラリでカスタム属性を取得
``` js
import { useAuthenticator } from '@aws-amplify/ui-react'
const {user} = useAuthenticator()
```
上記を使って、attributes(属性)を取得します。その際、自分は取得できませんでした...
しかし、下記のように```amplify/backend/auth/{ユーザープールのID}/cli-inputs.json```に
```js
"userpoolClientReadAttributes": [
      "email",
      "name",
      "custom:test"
]
```
を設定したら読めるようになりました。
Microsoft Sentinel を活用してサインインログから不正な攻撃のアクセスを検出

# 1.はじめに

Microsoft Sentinel では、セキュリティ上の脅威を検出するための分析ルールが用意されています。

https://learn.microsoft.com/ja-jp/azure/sentinel/detect-threats-built-in


Microsoft Sentinel の分析ルールを活用することでも脅威を検出することが可能ですが、より効果的に脅威を見つけるための方法として、一定の時間枠内に発生する Microsoft Entra ID SigninLogs の頻度に焦点を当てて検討しました。


# 2.概要

攻撃者は、様々な手法を用いてシステムやネットワークへの不正アクセスを試みます。
一般的な攻撃手法の例として、以下のようなものが挙げられます。

<dl>
  <dt>ブルートフォース攻撃</dt>
  <dd>攻撃者は総当たりでパスワードを試行し、正しいパスワードを見つけることを試みます。これにより、サインインの試行回数が急増します。</dd>
  <dt>ソーシャルエンジニアリング</dt>
  <dd>攻撃者はユーザーから情報を騙し取り、それを利用してアクセスを試みます。
例えば、フィッシング詐欺、スピアフィッシングなどが含まれます。</dd>
  <dt>DDoS攻撃</dt>
  <dd>攻撃者はサービスやサーバーに大量のトラフィックを送信し、システムをオーバーロードさせることを試みます。これにより、正当なユーザーのアクセスが妨げられます。</dd>
</dl>


上記以外にも様々な攻撃はありますが、攻撃者が不正なサインインを行う際には、**一定の時間内に多数のサインイン試行を行い、システムのセキュリティを乗り越えようする傾向** があります。この攻撃傾向をモニタリングし、異常なアクティビティを素早く検出することが、セキュリティ対策の重要な一環となります。そのため、一定の時間枠内に発生するサインインの頻度に焦点をあてて検討しました。



# 3.不正アクセスの検出方法
Microsoft Sentinel のログを収集する Log Analytics ワークスペースで実行できる Kusto クエリを作成し、攻撃と想定されるログを検出します。

<dl>
  <dt>条件１</dt>
  <dd>業務利用のアクセスをできる限り検出しないように、 RiskLevelDuringSignIn （サインイン中のリスク レベル）の値はリスクの低い値を除外します。</dd>
  <dt>条件２</dt>
  <dd>攻撃者によくみられる一定時間内に複数回のアクセス試行を検出するため、1分間に3回以上のサインインを実行しているログに限定します。
過去の傾向分析から、4回以上に設定すると攻撃を見逃すケースが増えることから、3回としました。</dd>
</dl>


```
SigninLogs
//SigninLogs テーブルを指定する
| where TimeGenerated > ago(30d)
//対象期間を設定する
| where RiskLevelDuringSignIn !in ("none","low")
//条件１：RiskLevelDuringSignIn の値が "none" または "low" を除く
| summarize count() by bin(TimeGenerated, 1m), UserPrincipalName,IPAddress,ResultType,UserAgent,Location
//TimeGenerated を1分単位でグループ化し、各グループのログ数をカウントする
| where count_ >= 3
//条件２：ログ数が3以上であるものだけを選択
```

# 4.参考URL

* SigninLogs（テーブル名）：ユーザーからの対話型の Entra ID へのサインインログ

https://learn.microsoft.com/ja-jp/azure/azure-monitor/reference/tables/signinlogs

* ResultType（列）：サインイン イベント中に生成される 5 ～ 6 桁のエラー コードを提供

https://login.microsoftonline.com/error

# 5.おわりに
攻撃の手法は、近年急速に進化し攻撃スタイルの変遷に合わせて絶えず学習し続けることが不可欠です。今回は、その活動の一例として、一定の時間枠内に発生するサインインの頻度に焦点を当てた検出例を紹介しました。不正アクセスの検出方法として、今回紹介した観点以外にも様々な観点で検出するための Kusto クエリを作成することが可能です。

みなさまの環境に対するセキュリティ上の脅威を検出するお役に立てると幸いです。
MotionBoardのGEOコーディング

# はじめに
GEOコーディングは、住所データを緯度経度に変換して地図上にピンを表示することができる機能で、MotionBoard GEO Codingオプションというライセンスを持っている場合のみ使用可能です。
ここでは簡単にGEOコーディングの設定の流れを紹介します。

:::note info
補足
本記事の内容・キャプチャ等はMotionBoard Ver.6.3のものです。
詳細は[MotionBoard Ver.6.3公式マニュアル＞GEOアイテムの作成](https://cs.wingarc.com/manual/mb/6.3/ja/UUID-58c33fe4-b41a-1d7e-68ff-037970377f24.html)を参照してください。
:::

# 地図データ、道路情報データのインストール
GEOアイテムで使用するデータがインストールされているか確認します（MotionBoardのインストールディレクトリに「geo」というフォルダがあればインストールされているはずです）。
もしインストールしていない場合は、インストーラから追加でインストールが可能です。
また、より詳細なレベルの地図データが必要な場合はマニュアルの[「GEOアイテム用のデータを準備する」](https://cs.wingarc.com/manual/mb/6.3/ja/UUID-5d3863b9-4492-0313-79d7-7e8142f0d75c.html#UUID-f8d9a28c-11f5-ce8a-c9ac-614d9101bcd0)を参照して対応してください。

# ライセンスのアクティベーション
冒頭で述べた通りGEOコーディングを使用するにはGEO Codingオプションというライセンスが必要です。事前に必ずアクティベーションキーをアクティベーションしてください。
[MotionBoard Ver.6.3公式マニュアル＞アクティベーション](https://cs.wingarc.com/manual/mb/6.3/ja/UUID-ae6ac516-79e0-0de1-6b71-76d5b5bac8e8.html#UUID-e0e63622-9338-495e-056f-3236e50c679d)

# 住所データの準備
GEOコーディングで緯度経度に変換したい住所のデータを用意します。
なお、緯度経度に変換できるデータは日本国内の住所です。
今回はExcelでサンプルデータを用意しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/48c8f972-c64f-681a-1144-b75ac28a1217.png)

# Excelをアップロードと専用データソース作成
MotionBoardで新規ボードを作成して編集モードにして、画面上部のボードメニューから「管理＞共有アイテム管理」を開きCSV/ExcelにExcelファイルをアップロードします。
アップロードしたExcelを元に専用データソースを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/c78efba5-c444-526e-3bb9-12a25786b419.png)

# GEOアイテムの作成
画面下部のエディタメニューから「GEO」をクリックしてレイアウトに挿入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/1372af13-8d6c-31d2-b27f-6ae99933e2fe.png)

さきほどExcelから作成した専用データソースを選択し、GEOコーディングを選びます。
利用データタイプから明細データを選び、住所の項目を「住所1」に、名称にあたる項目を「表示名」に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/264e824f-bd65-ac74-f56c-d0c590e51fab.png)

「詳細設定」タブを開き、マップスタイルから「Mapion(Japan)」「MapFan(Japan)」などを選びます。
下部の「ズーム設定」タブを開き、フォーカスの「データ読み込み時に全データが収まるようにフォーカスする」のチェックを外します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/4c9cbd22-abfe-9bc7-9b3d-9a474176a41a.png)

「ポイント設定」タブを開き、描画タイプを選びます。ここではピンを選択してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/fd0b1909-c514-c99a-bd4d-084460328233.png)

最後にOKをクリックすると地図上に住所データがプロットされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/5d334e0f-1442-d0cd-8d9a-488de5cfeae5.png)
Nuxt2 Node.js 18へのバージョンアップの方針

# 背景
弊社のnuxtプロジェクトの構成は以下です    
    nuxt v2.15
    node v16
    yarn

Node.jsでv16がEOLになった為、18にバージョンアップする必要が出た。

# Nuxt2とNode.js v18のバージョンアップ対応について調査
    
- Nuxt2のプロジェクトでNode v18は問題ないとのこと。
    >The main change in this patch release is that we now patch the crypto node built-in during build to allow Nuxt 2 to be used on Node versions greater than Node 16, which should ease the pressure users feel after Node 16 reaches its own EOL this year.

    [バージョン v2.16.2](https://v2.nuxt.com/ja/deployments/21yunbox#-highlights:~:text=The%20main%20change%20in%20this%20patch%20release%20is%20that%20we%20now%20patch%20the%20crypto%20node%20built%2Din%20during%20build%20to%20allow%20Nuxt%202%20to%20be%20used%20on%20Node%20versions%20greater%20than%20Node%2016%2C%20which%20should%20ease%20the%20pressure%20users%20feel%20after%20Node%2016%20reaches%20its%20own%20EOL%20this%20year.)

よって以下の流れで対応するのが良いと思われる。
- Node v16 → v18 バージョンアップ手順
    1. nuxt 2.15→2.17
    2. バージョンアップ時に出た修正、それに関するunit test
    3. node v18に上げる
    4. バージョンアップ時に出た修正、それに関するunit test
    5. Node v18 changeLogをチェック
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/10437f5f-0f79-e879-ee7e-d332e252c72a.png)
        [CHANGELOG_V18.md](https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V18.md#18.17.1)
    長すぎて見れなくなっていた。
    [Release Notes for Node.js 18](https://access.redhat.com/documentation/en-us/red_hat_build_of_node.js/18/html-single/release_notes_for_node.js_18/index)
    [Node.js 18 Release: What's New](https://blog.appsignal.com/2022/04/26/nodejs-18-release-whats-new.html)
    6. dev動作確認

次回はバージョンアップ時に出たエラー等の記事を書きます！

https://recruit.iimon.co.jp/
LWCでApexメソッドの呼び出しがたくさんあるなら、Promise.allを使おう

## はじめに
LWCからApexの呼び出しが色んな種類に渡って必要になること、あると思います。  
例えばこんな感じに。
```javascript:example.js
import { LightningElement, api } from 'lwc';

import isAdmin from '@salesforce/apex/ProfileUtil.isAdmin';
import isReadOnly from '@salesforce/apex/ExampleUtil.isReadOnly';
import getPickList from '@salesforce/apex/ObjectUtil.getPickList';
import getAccount from '@salesforce/apex/ExampleController.getAccount';

export default class Example extends LightningElement {
  @api
  accountId = '';

  isAdmin = false;
  isReadOnly = false;
  customColumnOptions = [];
  accountData = {};

  async connectedCallback() {
    this.isAdmin = await isAdmin({});
    this.isReadOnly = await isReadOnly({});
    this.customColumnOptions = await getPickList({object: 'Account', column: 'CustomColumn__c'});
    this.accountData = await getAccount({accountId: this.accountId});
  }
}
```

このとき、処理にかかる時間としては下記の通りになります。   
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603116/62f82ced-fd81-cd39-7122-b1a94b089307.png)


## Promise.allを使おう
`Promise.all`を使うことで、同期処理ではありながらも並行して（並列ではない）Apexメソッドを呼び出すことが出来ます。
[Promise.all() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/all)

```javascript:example.js
import { LightningElement, api } from 'lwc';

import isAdmin from '@salesforce/apex/ProfileUtil.isAdmin';
import isReadOnly from '@salesforce/apex/ExampleUtil.isReadOnly';
import getPickList from '@salesforce/apex/ObjectUtil.getPickList';
import getAccount from '@salesforce/apex/ExampleController.getAccount';

export default class Example extends LightningElement {
  @api
  accountId = '';

  isAdmin = false;
  isReadOnly = false;
  customColumnOptions = [];
  accountData = {};

  async connectedCallback() {
    const values = await Promise.all([
      isAdmin({})
      ,isReadOnly({})
      ,getPickList({object: 'Account', column: 'CustomColumn__c'})
      ,getAccount({accountId: this.accountId})
    ]);

    this.isAdmin = values[0];
    this.isReadOnly = values[1];
    this.customColumnOptions = values[2];
    this.accountData = values[3];
  }
}
```

並行して処理を呼び出すことで、手前の処理の終了を待つ必要がなく時間が短縮されます。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603116/fa280360-2f8a-679e-21aa-eb82921c904f.png)


### おまけ：JavaScriptの並行処理について
JavaScriptはシングルスレッドなので、**並列**処理は出来ません。  
そのため、上記の通り**並行**処理という書き方になるようです。

#### 並列処理のイメージ
4人の相手とキャッチボールするために、4人に分身する。  
1人の相手に対して1人がいるため、キャッチボールが可能となる。

#### 並行処理のイメージ
4人の相手とキャッチボールするために、すごい勢いでボールを投げ返したり体の向きを変える。  
厳密に見ればそれぞれラグが発生しているが、素早く対応する相手を切り替えることで同時にキャッチボールしているかのように感じさせている。

間違ってたらご指摘ください・・。

## おわりに
全人類使おう。`Promise.all`。  
おじさんとの約束だ。
Jest(Nextjs13)でError: invariant expected app router to be mountedというエラーが出る

# はじめに

NextjsでRoterを使ったページ遷移の処理を実装したのですが、その実装が影響して既存のコンポーネントテストが動かなくなったのでまとめていきます

# 問題

今まで動いていたコンポーネントテストの`render(<Smaple />`がエラーになるようになりました

```
-----
Error: invariant expected app router to be mountedJest
(alias) function Contact(): JSX.Element
import Sample
```

# 解決方法

Routerをモックする必要があったので以下をテストの最初に追加することで解決しました

```tsx:sample.spec.tsx

const mockedUseRouter = jest.fn();

jest.mock("next/navigation", () => ({
  useRouter: () => mockedUseRouter(),
  usePathname: jest.fn().mockReturnValue("/some-route"),
}));

describe(....
```

調べたところ

```ts
const mockedUseRouter = jest.fn();
```

この箇所がないものがあり、うまく動かなかったので注意が必要です

# おわりに

まとめようか悩んだのですが困りそうな人がいると思ったので投稿しました
Go言語を学んでみる #3

for文等の繰り返し処理、分岐処理のあたりのまとめ。

# For
```
for i := 0; i < 10; i++ {
	sum += i
}
```

値の初期化・条件式・後処理の部分は割と他の書き方と一緒。
違いはカッコが無いくらい？

```
func main() {
	sum := 1
	for ; sum < 1000; {
		sum += sum
	}
	fmt.Println(sum)
}
```
条件式以外は任意で、省略することも可能。

```
func main() {
	sum := 1
	for sum < 1000 {
		sum += sum
	}
	fmt.Println(sum)
}
```
セミコロンまで省略できちゃう。便利。
これでC言語にある`while`と同じような処理ができる。

```
package main

func main() {
	for {
	}
}
```
こうすれば無限ループも作れちゃう。らくちん。

# If
```
func sqrt(x float64) string {
	if x < 0 {
		return sqrt(-x) + "i"
	}
	return fmt.Sprint(math.Sqrt(x))
}
```

if文もだいたい同じ。条件式のカッコは必要なくて、実行式の中かっこは必要。

```
func pow(x, n, lim float64) float64 {
	if v := math.Pow(x, n); v < lim {
		return v
	}
	return lim
}
```
if文の中でしか使えない、簡単なステートメントを定義することもできる。
スコープ外では使用不可。if文の中で使われている変数が、スコープ外で使えないってのと同じことやね。

```
func pow(x, n, lim float64) float64 {
	if v := math.Pow(x, n); v < lim {
		return v
	} else {
		fmt.Printf("%g >= %g\n", v, lim)
	}
	// can't use v here, though
	return lim
}
```

else文の中でも使えちゃいます。
Go言語を学んでみる #2

# Go Tour
ブラウザ上でもできるけど、Go言語をインストールすればローカルでもGo Tourが実行できるらしい。

せっかくだからローカルでやってみようかな。

ダウンロードは済んでいるので、コマンドラインで以下のコマンドを実行。


```
go tool tour
```
動かない。
もう一つ記載されているコマンドを実行。

```
go get github.com/atotto/go-tour-jp/gotour
gotour
```

やっぱり動かない。
仕方ないので別サイトを調べてみる。


https://learning-collection.com/go-tour%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%EF%BC%88%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%89%E3%82%A2%E3%83%AD%E3%83%B3%EF%BC%89/

このサイトのやり方でうまくいきました。

完了すると、ブラウザ上にA Tour og Goが立ち上がる。


# Go言語の構成
パッケージ(`package`)で構成されていて、`main`パッケージからプログラムが実行される。

```
package main
```

ファイルの一番上に書いているのがそれかな？

でもって次の行から、実行したいパッケージの名前を記載してインポートしている。

```
import (
	"fmt"
	"math/rand"
)
```

これでこのパッケージのメソッドとかを使えるって感じっぽい。


```
func main() {
	fmt.Println("My favorite number is", rand.Intn(10))
}

// 実行結果

My favorite number is 7
```

割とシンプルそう。

個別でインポートすることも可能。

```
import "fmt"
import "math"
```



# 外部のパッケージへのエクスポート方法
`export ~`みたいな前置きは必要なくて、大文字から始めればいいだけ。シンプル過ぎん？

```
package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Println(math.pi)
}

// 実行結果
./prog.go:9:19: undefined: math.pi
```
`func main()`内の`pi`は大文字で始まっていないのでエラーになってしまう。

`Pi`に置き換えれば実行可能。


# 関数(メソッド)
基本的な書き方は、ほかの言語とだいたい一緒。

```
package main

import "fmt"

func add(x int, y int) int {
	return x + y
}

func main() {
	fmt.Println(add(42, 13))
}
```
引数とることもできる。

型宣言は変数名の後ろに書けばOK。

```
func add(x, y int) int {
	return x + y
}
```
2つ以上の引数が同じ型なら、最後の型だけ残せばいい。


```
func swap(x, y string) (string, string) {
	return y, x
}
```

複数の戻り値を返すことも可能。なんと…
最初のカッコに引数を、そのあとのカッコに戻り値を記載できるみたい。

```
func split(sum int) (x, y int) {
	x = sum * 4 / 9
	y = sum - x
	return
}
```
戻り値に変数名を記載し、その変数名を関数内で使用すると、`return`に何も書かずとも変数を自動的に戻り値として認識してくれる。便利。。。

ただし長い関数で使うのは非推奨。可読性が悪くなるので。


# 変数
他の言語にもあるように、変数の頭には`ver`を付ければOK。

```
var c, python, java bool
```

一気にいろんな変数に代入することもできる。

```
var c, python, java = true, false, "no!"
```
変数宣言と一緒に値も代入すれば、型を省略して書くこともできる。
その場合、最初に代入された値が持つ型が自動で設定される。

```
k := 3
```
関数の中だけは`:=`を使って、暗黙的な型宣言ができる。


# Go言語の基本型

```
bool

string

int  int8  int16  int32  int64
uint uint8 uint16 uint32 uint64 uintptr

byte // uint8 の別名

rune // int32 の別名
     // Unicode のコードポイントを表す

float32 float64

complex64 complex128
```

`bool` `string` `int`辺りは分かるけど、それ以外がよくわからんな…`float`は小数点？

https://www.wakuwakubank.com/posts/776-go-datatype/#index_id0

```
i1 int    = 10  // 符号あり	実行アーキテクチャに依存(32bit or 64bit)
i2 int    = 1e9 // 10の9乗(=1000000000)
i3 int16  = 10  // 符号あり	最小:-32768                  最大:32767
i4 int32  = 10  // 符号あり	最小:-2147483648             最大:2147483647 (約20億)
i5 int64  = 10  // 符号あり	最小:-9223372036854775808    最大:9223372036854775807 (約900京)
i6 uint   = 10  // 符号なし	実行アーキテクチャに依存(32bit or 64bit)
i7 uint32 = 10  // 符号なし	最小:0                       最大:4294967295 (約40億)
```

変数に初期値を与えない場合、ゼロ値が与えられる。

::: note
数値型(int,floatなど): `0`
bool型: `false`
string型: `""` (空文字列( empty string ))
:::

`型名(変数名)`で型変換ができる。

```
var z uint = uint(f)
```
もし型名を指定しない場合、代入した値の型から型推論がおこなわれる。

```
var i int
j := i // j is an int
```


# 定数
おなじみ`const`で定義。

```
const World = "世界"
```

基本的な定義とかはこのあたりで終わりかな。
線形光学の関係式

忘れちゃう線形光学周りの事項の備忘録

# 屈折率と誘電関数の関係
複素屈折率$ n + \mathrm{i} \kappa $, 誘電関数$\epsilon = \epsilon_r + \mathrm{i} \epsilon_i$について
$$
n^2 = \frac{\left| \epsilon \right| + \epsilon_r}{2}, \kappa^2 = \frac{\left| \epsilon \right| - \epsilon_r}{2}
$$

$(n+\mathrm{i}\kappa)^2 = \epsilon_r \pm \mathrm{i} |\epsilon_i|$


# 反射率
## 垂直入射の反射率
$$
R = \frac{(1-n)^2 + \kappa^2}{(1+n)^2+ \kappa^2} , \theta = \tan^{-1} \left( \frac{2 \kappa}{n^2 + \kappa^2 -1} \right)
$$

# 吸収係数

$$
\alpha = \frac{2 \omega \kappa}{c}
$$
【rails】ActiveStorage上のmp3ファイルにWhidperAPIを使う

# はじめに
PythonでWhisperを使用する方法は簡単に見つかったが、rails上でwhisperを使用する方法があまり出てこなかった。
今回は、試した中で成功したプログラムを紹介する。

# 状況
・ActiveStorageを使用して、S3上にmp3ファイルを保存している。
・mp3ファイルは、```Chat```モデルの```mp3_file```というカラムに格納されている。
・mp3ファイルをWhisperを使って文字起こししたい。

# 準備
rails上でWhisperを使うには、```"ruby-openai"```というgemをインストールする必要がある。
また、S3にアクセスするには、```"aws-sdk-s3"```というgemも必要である。
Gemfileに、
```ruby
gem "ruby-openai"
gem "aws-sdk-s3"
```
を追記して、```bundle install```しておきましょう。

# S3からファイルを取り出す
まずは、S3から音声ファイルを取り出す。
```ruby
s3_client = Aws::S3::Client.new(region: ENV["REGION"], access_key_id: ENV["ACCESS_KEY_ID"], secret_access_key: ENV["SECRET_ACCESS_KEY"])
file = s3_client.get_object(bucket: ENV["BUCKET"], key: @chat.mp3_file.key).body.read
```
S3からのファイル取り出しは、
1. ```region```、```access_key_id```、```secret_access_key```を与えて、クライアントを立てる。
1. ```bucket```、```key```を与えて、ファイルを取得する。

という流れで行います。

# tempfileに一時保存する
次に、取り出したファイルをtempfileに書き込みます。
tempfileに一時保存しておくことで、Whisperで扱えるようになるようです。

まず、tempfileに格納する関数を用意しておきます。
```ruby
def create_tempfile(file)      
    tempfile = Tempfile.open(["temp", ".mp3"])
    tempfile.binmode
    tempfile.write(file)
    tempfile.rewind

    return tempfile
  end
```
1. ```Tempfile```のOpen関数で、```mp3```形式のtempfileを作成します。
1. ```binmode```でバイナリーモードにします。
1. ```write(file)```で書き込みます。
1. 変更を加えた後は```rewind```する必要があるみたいです。(iosを入力の先頭に配置する。)
1. 最後に、```tempfile```を返します。

```create_template```関数にS3から取ってきた```file```を与えて、tempfileに書き込みましょう。
```ruby
tempfile = create_tempfile(file)
```

# Whisperを使って文字起こし
それでは、Whisperを使ってみましょう。
まずは、文字起こしする関数を作成します。
```ruby
def transcribe(tempfile)
  client = OpenAI::Client.new(access_token: ENV["OPENAI_API_KEY"])
  response = client.transcribe(
    parameters: {
      model: "whisper-1",
      file: File.open(tempfile, 'rb'),
  })

  return response.dig("text")
end
```
1. APIキーを使ってクライアントを立てる。
1. ```transcribe```関数を使って文字起こしします。
1. ```tempfile```を与えることで文字起こしすることができます。
1. ```response```から文字起こしの結果を取り出し、```return```します(```response.dig("text")```)。

この関数に```create_tempfile```で返した```tempfile```を渡し、文字起こししましょう。
```ruby
transcribed_text = transcribe(tempfile)
```

# おわりに
今回は、rails上でWhisperを使ってみました。
```tempfile```を使用するということろがコツだったようです。

参考になったら「いいね」と「ストック」お願いします！
リーダーシップとマネジメントについて

# リーダーシップとは？
チームや組織が設定した目標の実現を目指し、メンバーを結束させて同じ方向性に向かわせることで、実現可能性や効率を高め、引っ張っていく能力です。

#  リーダーシップの役割
①	メンバーに進む方向を示し導く
　　　目標や目的の達成を目指し、組織に明確な長期的ビジョンや進んでいく方向について示すこと
②　組織やチームの維持
　　　目標や目的を無事達成させるためには、組織やチームを最後まで維持していくこと
③　積極的な課題解決
　　　目標や目的を達成するまでには、さまざまな課題に直面しているので、その都度、きちんと解消していくこと

# マネジメントとは
　英単語を直訳すると「経営」や「管理」という意味
　ビジネスで使用する場合「ヒト・モノ・カネ」の3つの経営資源を管理することを指している。

# マネジメントの役割
組織に必要な要素の分析や管理を適切に実行し、組織活動を維持、促進する役割を担っています。つまり、成果を引き出すために働きかける管理・責任者のことで、チーム全体の監督や部下への適切な指導を行う役割があるのが特徴だ。

#  両者が共通して求められるスキル
①	意志力
設定した目標を実現しようとする意志力が必要、強い意志力を持つことで、設定した目標は必ず達成できるとのこと。
②	意思決断力
迅速に判断し意思決定を下す力が必要。
組織で目標達成していくためには、複数ある施策のなかから何を選択するのか決断能力
③	コミュニケーション能力
チームやプロジェクトを上手く導くために、ビジネスのニーズや目標を理解し、その情報を適切な人に適切なタイミングでその情報を効率的に他者に伝達する能力


#  リーダーに求められるスキル
・先見性（情報収集能力・適応力）
常に社会や業界の動向についての最新・最適な情報にリーチできる能力
世の中の変化を敏感に察知できるようになることで、収集した最新情報に沿って、時代変化に速やかに適応できる能力／従来のやり方に固執せず、変化に柔軟に対応する適応力

・物事の全体を捉えて考える能力
物事の一部分だけを見ることでは長期的な目標やビジョンを適切に設定できないのである。物事全体を見ることにより、新たな発見やトラブルの予防につながるのではないでしょうか

# マネージャーに求められるスキル
・管理調整能力
組織の目標を明確にし、目標に対して現在どの程度の進捗具合なのかを把握し、必要に応じて業務の進め方を調整する能力
・情況把握力
組織が目指す目標やビジョンを達成するために、短期的もしくは長期的な見通しを立て、組織に属するメンバーの特徴や力量を把握、状況に応じて効率的な方法や手段を検討することができる能力とメンバーから報告される内容をもとに、状況を正しく把握して、適切なアドバイスをするスキル能力。


# 身につけるためには？
①実践で身につける　
　　リーダーとして活躍できる機会があればチャンスを見逃さず、チャレンジすることが大切である。
　　実践することによって、臨機応変な対応力やさまざまな人とのコミュニケーションスキルなどを実践で積み重ね磨くことができる

②手本となる人物を探して観察／一緒に仕事
　　自分の管理職としての才能を育てるために、他のリーダーに指導してもらうのも効果的だと思う。
　　優れたリーダーを探し、一緒に仕事しながら観察して仕事のやり方、問題の解決策など自分のものとして身につく姿勢が大事。
　　同時に他の人からフィードバックをもらうことで自分が見落としているかもしれない改善点を特定でき、スキルアップに繋がる。

③社内外講座を利用する
　　社内勉強会などあれば参加して学ぶ。
　　会社によって、社員教育に予算を掛けている会社があれば、ない会社もあります。
　　予算を掛けてあれば、有料の社外セミナー講座を受けて学ぶ。
　　予算を掛けてないであれば、無料の社会セミナー講座を受け学ぶ。
　　　　　例：https://www.doorkeeper.jp/
Vue / TypeScriptでAPIのレスポンスがundifinedで返ってくる

# はじめに

フロントエンドでバックエンドを叩く処理を書いていたのですが、うまくいかず時間がかかってしまったので、このような原因もあるよというメモを残していきます

# 問題

以下のようなコードを書きました

```ts:response.ts
export default interfaceApiGlobalIdsResponse {
  apiIds: string[];
}
```

```ts:client.ts
  static findApiGlobalIdByUserId(userId) {
    const apiUrl = `/user/${userId}`
    return ClientUtility.get<ApiGlobalIdResponse>(apiUrl)
  }
```

ここでgetリクエストを作成しているAPIに対して行いましたが、なぜかデータが取得できませんでした

# 解決方法

原因は、クライアントとサーバーでJsonのキー名が一致していなかったことでした

サーバー側では以下のように`apiGlobalIds`という名前で返していますが

```java:fetchApiGlobalIdsResponse.java
import lombok.Data;
import java.util.List;

@Data
public class FetchApiGlobalIdsResponse {
    private final List<String> apiGlobalIds;
}
```

フロント側では`apiIds`としていました

```ts:response.ts
export default interfaceApiGlobalIdsResponse {
  apiIds: string[];
}
```

マッピングするときにキー名が違うのでうまくいかずにundifinedになって返ってきていたようです

# おわりに

モックを挟んでいなかったので気づくのが難しかったです
この問題を同じエラーで悩んでいる人に伝えるのにタイトルどうすればいいんだと思いました
iPhone ショートカット Appで充電完了を Slack へ通知

# はじめに
iOS 標準の便利アプリである ショートカットアプリ を使用して、充電が n% を超えたときにSlackへ通知して、過充電を防ぎたいと思います。
ショートカットアプリは、バッテリー残量の検知以外にも、様々なことをトリガーにできるので、他の用途でも流用可能です。

# 前提
- Slack の Webhook URL を取得済であること

# 環境
- 確認 iOS バージョン: 16.6.1

# 手順
1. ショートカットアプリのオートメーションで、右上の ＋ をタップ

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2080620/4394f141-0516-8498-3fde-2aa6d8e52948.png">
 
２. 個人用オートメーションを作成をタップ

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2080620/9a4aeedc-63ac-a863-4c79-a638cac2a907.png">

３. トリガーとなる動作として「バッテリー残量」をタップ

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2080620/39bfadbb-ba11-7240-969b-faf7aba355ee.png">


４. しきい値を設定

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2080620/4b758aba-bee6-2bf7-ef3a-3a0fd02e5339.png">


５. アクションを設定するため「アクションを追加」をタップ

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2080620/d1a97f1e-5710-9948-04e9-7092bc6a5f26.png">


６. すべてのアクションをタップ

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2080620/7f38cd9c-02cd-87de-0c86-a9cf2aed4bf1.png">


７. URL の内容を取得をタップ

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2080620/fc3e8248-6ec5-dfe9-e342-06bcdb8bca2f.jpeg">


８. アクションの詳細を設定

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2080620/b10eed80-1ad8-1e9a-3ac8-44874527880e.png">

本記事の肝の部分になります。

- Slack Webhook URL を `URL` に貼り付け
- 方法は POST
- body に相当する部分は任意に設定
    - text 要素がメッセージ本文になります

普通に REST API をコールできるんですね。

９. 動作確認

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2080620/6c486282-50b6-d393-52a5-7b99acf65890.png">

右下の再生ボタンみたいのをタップ

１０. Slack で確認

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2080620/a888cd31-ec54-eae7-1f99-8a88d11a2d8a.png">

無事に届きました！

# おわりに
手順的には結構簡単に設定が出来ました！
が、実際はアクションの詳細部分で、何度かトライしてこれにたどり着きました。
同じように iOS ショートカットから Slack 通知をしたい方の参考になれば幸いです。
SphinxでPDFを出力したときにヘッダー、フッターが表示されない

備忘録

## 環境

Sphinx 7.2.6
TeX Live 2023

## 問題

SphinxでPDFを出力すると
目次や章が始まったページでヘッダーやフッターが表示されなくなる。
見栄えがよろしくないので調査することに

## 解決

調べていくと日本語に設定した場合のみこの症状が発生することがわかった。
そこでjsbook.clsを調べていくと次のような記述があった。

```tex:jsbook.cls
\def\plainifnotempty{%
  \ifx \@oddhead \@empty
    \ifx \@oddfoot \@empty
    \else
      \thispagestyle{plainfoot}%
    \fi
  \else
    \thispagestyle{plainhead}%
  \fi}
```

ここでスタイルが設定されるため、ヘッダーやフッターが表示されなくなる。
よってlatex_elementsという設定オプションを使用して、コードを無効にする。

```python:conf.py
latex_elements = {
    'preamble': r'''
        % plainifnotemptyを無効化
        \renewcommand{\plainifnotempty}{}
    ''',
}
```
【Jetpack Compose】Recompose が発生していないことをテストする

小ネタです。 Recompose が発生していないことをテストするシンプルな方法を紹介します。

## コンポジション回数をカウントする

次のコードは [BasicTextField2 のテストコード](https://cs.android.com/androidx/platform/frameworks/support/+/36f456591396272fbc26d5139a79a72efe535f3c:compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text2/BasicTextField2Test.kt) からの引用です。やっていることは実にシンプルでコンポジション回数をカウントするための変数(`compositionCount`)を1つ用意し、それを Composable 関数の冒頭でインクリメントするだけです。

このコードでは "hello" "world" という単語を入力したときに Recompose が発生していないことをテストしています。よって最後に `compositionCount == 1` であることを確認しています。

```kotlin
fun textField_imeUpdatesDontCauseRecomposition() {
        val state = TextFieldState()
        var compositionCount = 0  // コンポジション回数をカウントする変数
        rule.setContent {
            compositionCount++ // Composable 関数の冒頭でカウントをインクリメントする
            BasicTextField2(
                state = state,
                modifier = Modifier
                    .fillMaxSize()
                    .testTag(Tag),
            )
        }

        rule.onNodeWithTag(Tag).performTextInput("hello")
        rule.onNodeWithTag(Tag).performTextInput("world")
        
        rule.runOnIdle {
            assertThat(compositionCount).isEqualTo(1) // コンポジション回数が1であることを確認する
        }
    }
}
```
Private subnetに存在するECS taskから外部ネットワークに通信する

## Private subnetとは
awsではinternet gatewayがアタッチされていないsubnetのことを**private subnet**と呼んでいます。
ここでは通常internetから直接アクセスされたくないDatabaseなどを配置し、public subnetに存在するインスタンスからのみの通信を許可するというのが一番ポピュラーなユースケースです。

## Private subnetから通信したい
そんなPrivate subnet内にサーバを配置し、そこから外部へ通信したい場合があります。
主にはprivate subnet内のDBへ何らかしらの処理を定期的に実行したいなどでしょうか。そんな時にECSからsubnet外への通信を行いたい場合があります。
例えばECSをprivate subnet内で実行しながら、
・ssm/secret managerからパラメータを取得したい
・ECRからイメージを取得したい
・cloudwatchlogに書き込みをしたい
・s3とのデータやり取りをしたい

## やり方は2つ
・NAT gatway
・(おすすめ)Amazon PrivateLink

### NAT gateway
subnetに対して設定することでインターネットに接続することができるものです。
subnetにアタッチし、デフォルトルート(0.0.0.0/0)をNAT gatewayに向けることでインターネットへの接続を可能にできます。

### Amazon PrivateLink
 VPCにVPCエンドポイントというものを設置し、そこからawsの各種サービスと通信を行えるようになります。
例えば、secret managerにECSから接続したい場合はVPCにcom.amazonaws.ap-northeast-1.secretsmanagerというVPCエンドポイントを配置します。

【メリット】
・NAT gatewayより安い
・インターネットを経由せず、aws内のネットワークで通信が完結するためセキュリティ面で安心

【デメリット】
・awsが提供しているサービスや提携パートナーと通信するためのエンドポイントしか作成できないので完全に外部からデータを取りたい場合はNATを使うしかない
→S3に必要パッケージを置いたりECRにイメージに含めることである程度は回避できる

## 設定方法
1.エンドポイントを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541083/dd504417-67fe-aa77-04ac-1bd2123a2b3c.png)

2.「エンドポイントを作成」から各種情報を入力
名前：(不要)わかりやすい名前を
サービスカテゴリ：awsのサービスとの接続であれば「AWSのサービス」
サービス：(例)com.amazonaws.ap-northeast-1.secretsmanager(通信したいサービスごとに設定)
※ECSは必ず設定しないといけないものもあるので下記参照
https://dev.classmethod.jp/articles/vpc-endpoints-for-ecs-2022/
VPC：配置するVPCを選択


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541083/9eabd06c-eb08-8abf-7964-f1aeb9270eee.png)



これだけOK!

※注意
下記の通り、「DNS名を有効化」を設定しないと名前解決してくれないので通信ができません。
確実にやりましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541083/fe851de8-e045-f36b-8f60-8a8f0af74f15.png)
【学習】Linuxコマンド　Day9

# おさらい
前回まで学習した内容はこちらです
- 環境構築 
　→https://qiita.com/imagatasaki/items/4c510cacc6f17556c3b9
- コマンドラインの操作方
- 基本的なコマンド① 
　→https://qiita.com/imagatasaki/items/37a7c12bce015d6bdc4a

- 基本的なコマンド②(ファイル操作)
　→https://qiita.com/imagatasaki/items/7abc96b0afea475077a2
　→https://qiita.com/imagatasaki/items/6ccf0e1cd44ebe1d3e9b
- パーミッション
- スーパーユーザー
　→https://qiita.com/imagatasaki/items/39e081d9c10c1448e0c7
- Vim
  →https://qiita.com/imagatasaki/items/f4302837756102d0d430
- リダイレクト
- パイプライン
  →https://qiita.com/imagatasaki/items/cfc37493ad95ee82c48d
- フィルタ
- テキスト処理
　→https://qiita.com/imagatasaki/items/737427c41a6d8dbc5fc0

# 今日学ぶこと
- プロセス
- プロセスの表示
- ジョブ
- ジョブの表示

# プロセスとは
Linuxはプログラムの実行をプロセスという単位で管理している。
実行されているプログラムに対し、プロセスID等の情報を追加したまとまりで、管理しやすくなる。
メモリで実行されたタイミングでプロセスとなる。
メリットとしては例としてプロセスIDが存在することで、同じプログラムが実行された場合でも別のプロセスとわかる。
しっかり区別できるということである。
LinuxはマルチユーザーシステムのOSであることからデータが混ざってしまうなどのトラブルを防ぐためにもプロセスでの管理を行う。


# プロセスの表示(psコマンド)
### 実行中のプロセスを表示する
現在実行中のプロセスを表示するためにはpsコマンドを使用する。
```
$ ps
  PID TTY          TIME CMD
1498  tty      00:00:00 bash
1519  tty      00:00:00 ps
```
上から順にBashのプロセス、psコマンドのプロセスとなる。
psコマンドを出力した際の列の意味はこちら。
| 列     |       意味|  
|:-----------------:|:------------------|
| PID       |              プロセスID |   
| TTY           |            標準入出力に設定されている端末 |      
| TIME             |              CPUを使用した時間 |       
| CMD             |                コマンド名 |        

プロセスがプログラムに対し情報が追加されたまとまりであることが確認できた。

### 詳細情報付きで表示する(uオプション)
詳細情報つきでプロセスを表示してみる
uオプションを使用するが「-」は前につけないという点に注意。(BSDオプション)
 ```
$ ps u
USER       PID　 %CPU %MEM    USZ    RSS TTY      STAT START  TIME COMMAND
imagata    1498  0.0   0.1 115684   2348 tty1     Ss   13:57  0:00 -bash
imagata    1519  0.0   0.1 155448   1840 tty1     R+   14:22  0:00 ps u
```
一番左側USERは「誰の権限で実行されたプロセスか」を表している。
他のユーザーが勝手に操作はできないようになっている。

### 端末を持たないプロセスも表示末う(xオプション)
```
$ ps x
```
xオプションを使用することで標準入出力に設定されている端末がないプロセスも表示できる。以下は一部
```
1572 ?        Ss      0:00 [kworker/0:1]
```
このように端末が設定されていないプロセスをデーモンという。
見えないところで働いているというイメージ。

### すべてのユーザーのプロセスを表示
psコマンドは現在ログインしているユーザーのプロセスのみ表示するが、aコマンドを使用することですべてのユーザーのプロセスを表示することが可能。
```
$ ps a
```
これらを利用してデーモンを含むすべてのユーザーのプロセスの数を数えてみる。
```
$ ps ax | wc -l
100
```
100と表示さているが、列名の行も含むため-1をした結果が正しい。
そのため99個であることがわかった。

# ジョブとは
実行されているコマンドラインのことをジョブと呼ぶ。
例えば1行のコマンドラインにコマンドが2つ存在した場合、ジョブは1つ、プロセスは2つとなる。
視点を意識すると覚えやすい。
カーネル視点→コマンドの実行の単位
ユーザー視点→コマンドラインの実行の単位

# ジョブの表示(jobsコマンド)
ジョブの一覧を表示するためにはjobsコマンドを使用する。
```
$ jobs
$ 
```
実行してみても何も表示されない。
これはコマンドラインを実行していないため。
```
$ man bash
```
bashのマニュアルを表示したあとCtrzを入力し、プロンプトに戻る。
再度jobsコマンドを実行すると、、、
```
$ jobs
$ [1]+  Stopped                  man bash
```
これは停止中のジョブを表示している。
左側の[1]はジョブ番号。プロセスでいったところのプロセスID
ただし、マシン内で一つの番号が割り当てられているわけではなく、シェルごとに割り当てられているため注意。
-lコマンドを使用するとプロセスIDも同時に表示できる。
```
$ jobs -l
$ [1]+  1556 Stopped                  man bash
```

# おつかれまでした
今回は少し短めの内容でした。
詳細情報を表示したりすると数値や英字が複数の列で表示されるので意味をよく理解していないと肌感が悪いですが、一つ一つ整理して覚えていけば怯えなくてよい。と思っています。
そして、プロセス、ジョブについて机上での学習で(資格勉強)なんとなく覚えておりましたが実際に動かして確認することでそれらが存在する意義がよく理解できたと思います。
Chromium 及び Microsoft Edge の unload() イベントの非推奨化について

# 追記
v119 時点で unload イベントは組み込まれていません。

# これは何？
Web Enginner が親の仇より見た (かもしれない) イベント unload() の非推奨化と、
そのスケジュールについての記事です。

# そもそもの発端
端的に言えば、[unload](https://developer.chrome.com/articles/page-lifecycle-api/#the-unload-event) は時代遅れのイベントだからです。
このイベントはモダン ブラウザの 「頻繁に切り替わるタブ」 という概念と相性が悪いもので、
発火しないことが多々ある厄介なハンドラでした。
(よくある例としてはバックグラウンド化されたタブがクローズされた際に動作しない、など)

長らくMDN でも非推奨だったこのイベントですが、正式にブラウザが追放の準備を始めた、
というのがざっくりとした経緯になります。

# タイムライン
あくまで Microsoft Edge のタイムラインです。
(Chromium に追従するので、Chrome と互換はあるものと思いますが

## v117 
・unload イベント の非推奨化機能組込
・デフォルトで有効
・起動時引数にて強制的に無効化可
``` cmd
--enable-features=PermissionsPolicyUnload,DeprecateUnload --disable-features=DeprecateUnloadByUserAndOrigin
```

## v118 以降
・ **どこかで**デフォルトで無効化 (段階的に、であり具体的にどこで適用されるか未定)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/c7074a79-68b3-dc59-ee3b-bf0c63415e05.png)

・ 無効になった場合、ポリシー[ForcePermissionPolicyUnloadDefaultEnabled](https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies#forcepermissionpolicyunloaddefaultenabled) で有効化可能。


## 未定
・ 完全廃止 (ポリシーが廃止されるタイミング)

# 参考
[お知らせ: unload イベントの非推奨(Microsoft Edge Beta チャネルのリリースノート内)](https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-relnote-beta-channel#announcement-deprecating-the-unload-event)
[Deprecating the unload event](https://developer.chrome.com/blog/deprecating-unload/)
[Disable unload handlers by default and add Permissions-Policy to opt-in to enabling them.](https://github.com/fergald/docs/blob/master/explainers/permissions-policy-deprecate-unload.md#disable-unload-handlers-by-default-and-add-permissions-policy-to-opt-in-to-enabling-them)
ubutnu 20.04 全角ピリオド 標準入力設定

- install
mozc設定ツールのインストール

```
sudo apt install mozc-utils-gui 
```
- 起動
デスクトップ画面左上の「アクティビティ」をクリックし，「Mozcの設定」を起動します．

設定画面の`句読点`を`，．`のものに変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/55afa6f5-9da7-0630-8ce8-944c69549c9d.png)

日本語入力時自動で`，．`が入力されるようになりました．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/7ad0563d-eb15-b625-8ab3-4e22d5004ccb.png)
OAuthとOpenID ConnectとSAMLの違い

何となくどんなものか知ってるけど、人には説明できないなって思ったので整理してもう少し詳しくなろうと思い学び直してみることにしました。

## 認証と認可
それぞれの違いを理解する前にまずは認証と認可について理解しようと思います。
認証とは誰であるのかを確認すること、本人確認になります。サービスを利用するのが正しい利用者なのかを確認するためにIDとパスワードを使ってその利用者が利用者本人なのか確認をとっています。
次に認可ですが、これは特定の条件下において対象(リソース)に権限を与えることです。
このように認証と認可を行うことで利用者本人と正しい権限を制御して安全にセキュリティを強化することになります。

## OAuthとは
OAuthは認可を行うプロトコルのことです。アクセストークンを使用してユーザーがアプリケーションにアクセスできるように認可を行う考え方です。アクセストークンはどのような権限を持っているのかしますことができます。

例えばAPIを利用するときに何も保護されていないとデータが不正に抜き取られる危険性があります。こういったAPIを保護するための仕組みにOAuthがあります。

OAuthの仕組みを解説します。

1. ユーザーがアカウント連携などの利用をサービスやアプリに対して要求します
2. アプリやWebサービスなどのクライアントから認可サーバーに対してアクセストークンを要求します。
3. 次に認可サーバーはアクセストークンを発行していいかユーザーに問います
4. 許可が出たらアクセストークンを生成します
クライアントにアクセストークンを発行します。
5. クライアントはAPIに対してアクセストークンを使ってデータを要求します
6. サーバーはAPIを介してアクセストークンが正しいか検証します
7. 正しい場合はAPIを介してデータを渡します。

## OpenID Connectとは
認証を行うプロトコルです。IDトークンを使用して認証を行います。IDトークンを持っていることでユーザーがどこの誰であるかを示すことができます。
従来のopenIDとは違って導入しやすくGoogleなど様ざまなところで使用されています。

Open ConnectIDの仕組みを解説します。

1. あるアプリにgoogleなどのアカウントでログインしようとします
2. アプリなどのクライアントはIDトークンの発行をIDプロバイダーに要求します
3. IDプロバイダーはユーザーに発行の許可を問いIDとパスワードを要求します
4. ユーザーからIDとパスワードを渡されたらIDとパスワードの含まれたIDトークンを発行します
5. リソースサーバではクライアントのIDトークンの認証を行います

## SAMLとは
シングルサインオンやフェデレーションを実現する認証のためのプロトコルです。
IdPとSPが情報をやり取りする際に、情報形式の変換を省く方式で、ユーザーはサーバーに一度だけログインすれば、SAML認証方式に対応しているサービスを利用できます。

イントラネット(社内ネットワーク)やIdPにログインした後、Salesforce、Workdayなどの多数の追加サービスに、認証情報を再入力せずにアクセスできるようになります。

## OAuthとOpenID ConnectとSAMLの違い
OAuthは認可するためのプロトコル、OpenID Connectは認証をするためのプロトコルになります。

OpenID ConnectとSAMLの違いになります。

> OpenID Connectは、OAuth 2.0プロトコルをベースに構築されており、IDトークンと呼ばれる追加のJSON Web Token（JWT）を使用して、スコープやエンドポイントの発見など、OAuth 2.0が選択に委ねている部分を標準化しています。ユーザー認証に特化しており、消費者向けWebサイトやモバイルアプリでユーザーのログインを可能にするために広く利用されています。
SAMLは、OAuthとは独立しており、JWTとは対照的に、XML SAMLフォーマットで認証するためのメッセージの交換に依存しています。一般的には、企業ユーザーが1回のログインで複数のアプリケーションにサインインするために使用されます。

OpenID ConnectとSAMLは単独で使用してSSOを実現できますが、どちらもOAuthと連携して使用もできます。

似ていて紛らわしいですが、このくらいの理解で充分かと思っています。

### 参考文献
[SAMLとは？SSO（シングルサインオン）認証の仕組み・メリット](https://boxil.jp/mag/a2950/)
[OAuth、OpenID Connect、SAMLの違い](https://www.okta.com/jp/identity-101/whats-the-difference-between-oauth-openid-connect-and-saml/)
[OAuthとOpenID Connectについて～仕組みや特徴など解説～](https://solution.kamome-e.com/blog/archive/blog-auth-20221108/)
Lattigo GenSwitchingKey で、変換先の秘密鍵を関数に渡さない様にする回避備忘録

## 概要

かなりニッチな内容になりますが、
Lattigoという準同型暗号のライブラリの使用例を以前解説しました。

https://qiita.com/kenmaro/items/20d8c448530354345842


このLattigoには、CKKS形式の暗号の鍵交換
と呼ばれる機能が搭載されていますが、
使い方が制限される様な書き方になっていて少し困ったので、回避方法について調べてみました。


## 鍵交換

鍵交換とは、Aさんが復号可能な暗号を、
Bさんが復号可能な暗号に、暗号状態で変換する機能です。

鍵交換には、鍵交換を実行するための公開鍵である、鍵交換鍵が必要であり、
その鍵を前もって作っておく必要があります。


## 鍵交換鍵のプロトコル

鍵交換鍵の生成は、雑に書くと以下の様な流れになります。

- Aさんの暗号からBさんの暗号にするための鍵交換を実行したい
- Aさんの秘密鍵Aと、Bさんの公開鍵Bを使って、Aさんが鍵交換鍵(AtoB)を作成する
- Aさんがデータを暗号化して、暗号文Aを取得する
- AさんはCさんに鍵交換鍵(AtoB)と暗号文Aを送信する
- Cさんは鍵交換鍵(AtoB)と暗号文Aを使って、鍵交換を実行し、暗号文Bを取得する
- Cさんは暗号文BをBさんに送信する
- Bさんは自身の秘密鍵Bを使って暗号文Bを復号する


## 問題だった点

Lattigoの鍵交換鍵生成のための関数の定義を見てみると

```rlwe/keygenerator.go
GenSwitchingKey(skInput, skOutput *SecretKey) (newevakey *SwitchingKey)
```

となっており、

- Aさんの秘密鍵A
- Bさんの秘密鍵B

が必要な関数になっていました。

これだと先ほどのステップの、

`Aさんの秘密鍵Aと、Bさんの公開鍵Bを使って、Aさんが鍵交換鍵(AtoB)を作成する`

の時に、AさんはBさんの秘密鍵Bにアクセスすることになりますから、
これは実際問題としてやりたくないことです。


## 考えた解決策

```rlwe/keygenerator.go
GenSwitchingKey(skInput *SecretKey, pkOutput *PublicKey) (newevakey *SwitchingKey)
```

という様な関数を用意することが回避方法です。

こうすることで、先ほどの

- Aさんの秘密鍵Aと、Bさんの公開鍵Bを使って、Aさんが鍵交換鍵(AtoB)を作成する

ことが可能になります。


## 実際に作った解決策

上記の様な解決策に基づいてLattigo を少し変更しようと思ったのですが、
試行錯誤した挙句最終的に

```rlwe/keygenerator.go
GenSwitchingKeyExplicit(skInput *SecretKey,pkOutput *PublicKey, swk *SwitchingKey) (newevakey *SwitchingKey)
```

このような関数を作るのにとどまりました。
swkは鍵交換鍵のインスタンスですが、これを前もってBさんが生成しておいて、
Aさんに送っておくことが必要です。
こうすると、実際は鍵交換鍵の生成にはBさんの秘密鍵は実質的に使っていることに変わりはないのですが、
このswkをAさんに事前共有することは問題ないため、
Aさんが鍵交換鍵を生成する際に、Bさんの秘密鍵を取得する必要はない、
というもともと達成したかったことはクリアできています。


## 実装

実装は

https://github.com/kenmaro3/lattigo/commit/8fded9f4fb682f197d6840dce2948f6f3c2305b7#diff-6cc25ffd707f7f1fe48c7b716ae0374dc1957930f3f055685abf5a7cfb10a2c0

こちらのコミットで行っています。
コードが汚いのは仕様です🙇



## まとめ

今回は、Lattigoという準同型暗号のOSSライブラリを用いて鍵交換を実行する時の
関数をより実務的に処理するパッチについて備忘録的にまとめてみました。

興味のある方がもしいたらもっといい実装をやってみてください。


今回はこの辺で。


@kenmaro
【チラ裏】Emacsをアンインストールして再インストールしたらmozcが使えなくなった【解決】

完全に自分の間抜け話。

Emacsにmozcで日本語入力していたが、諸般の事情でEmacsをアンインストールした。
Ubuntuなのでaptを使った。

```bash
$ sudo apt remove emacs*
```

再度新しいEmacsをインストールした。
日本語入力にバインドしている ***M-`*** キーを押下するとMozcは起動するのだが、日本語を入力しようとすると ***communication error with the helper process*** というエラーが出るだけで日本語が入らない。

しばらく調べたら、上のアンインストールのときに ```emacs*```とスター付きで書いているので、emacs-mozcというヘルパープロセスまでアンインストールしていた。

```bash
$ sudo apt install emacs-mozc
```

で解決。

こんな間抜けなやつもそうそういないと思うけど、Emacs、mozc、エラーメッセージで検索できるようにした方が（将来の自分が）助かると思って書いた。

***（以上）***
AWS Terraform – CloudWatch ロググループを import して有効期限を設定する例 

# tfファイル例

```
log.tf
```

```tf
resource "aws_cloudwatch_log_group" "xxx" {
  retention_in_days = 30
}

import {
  # tfファイル に書いている resource名を指定する
  to = aws_cloudwatch_log_group.xxx

  # ARNではなくログ名を指定する 
  id = "/aws/lambda/yyy"
}

```

# 実行方法

`terraform apply`

# コマンドでimportする場合

tfファイルにはresourceだけを書いておく

```tf
resource "aws_cloudwatch_log_group" "xxx" {
  retention_in_days = 30
}
```

コマンド実行

```
 terraform import aws_cloudwatch_log_group.xxx /aws/lambda/yyy
```

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
ちょっとした工夫でzshでのターミナルを見やすくする。

ターミナルでの表示は淡白で空行もないため、見にくい時があります。今回は少しでも見やすくするためにプロンプトの設定を少し追加してみます。

変更点は以下の2点です。
・ユーザー名を緑色にする。
・プロンプトの前に空行を1行追加する。
### .zshrc ファイルを開く
（nanoを使っていますが、編集できればエディタはなんでもいいです。）
```
nano ~/.zshrc
```
### PS1 の設定を更新
.zshrcファイルに以下の設定を書き足してください。

```zsh
export PS1=$'\n''%F{green}%n@%m:%~%# %f'
```
この設定では、$'\n' が改行を生成するようになっています。

### 変更を反映:

変更を保存してファイルを閉じた後、以下のコマンドを実行して変更を反映します。また、ターミナルを再起動することでも変更反映させることができます。

```
source ~/.zshrc
```
以上で終わりです。
どうでしょうか？少しの変更だけでも個人的には見やすくなったと思っています。