OmniAICreator/Qiita-1.07M huggingface dataset:
ロボット開発でSBC(ROS)+マイコンを使う理由

# なんでラズパイ、jetsonなどから直接HWを制御しないのか
ROSでロボット開発しているとjetson＋マイコンみたいな構成がよく見られる
なんでなのかと思った。
jetsonにも40pin GPIOついてるから機能的に制御できないわけではない。

## なんでjetsonから直接制御しないのか？
調べてみたら出てきた
TECHNO　ROADという会社のHPに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528717/64e9e068-f33c-f6d7-8adb-23b6fe102782.png)
って書いてあったので納得
https://techno-road.com/devs/dev_ros.html

確かにlinuxで他の多くの処理をしているので、リアルタイム性、安全性を考えるとlinux上で制御するのは、ナンセンスかな
Salesfroce初期設定01～初期レコードを全削除しよう

こんにちは

Salesforce初期導入にやるべきことを説明します

Salsforceには初期段階でいくつかのサンプルレコードがございます

これは実際に使うために使うのは邪魔ですね


このサンプルデータを一括で削除する簡単な方法をお伝えします

今回はTrailheadで作成できるPlay groundを一括で効率よく削除できる方法をお伝えします

今回の内容は動画でも公開しています

https://www.youtube.com/watch?v=Bl56-MOYhOw


<iframe width="560" height="315" src="https://www.youtube.com/embed/Bl56-MOYhOw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>



## まず前提

レコード一括削除方法は過去にも解説していますのでこちらをご確認ください

https://qiita.com/Takaa/items/d50c71f9af709f7a2fe4

こちらで書いているように開発者コンソールでの削除が便利です

「例　商談レコード全削除の場合」

delete [Select Id FROM Opportunity];

とします

今回はこれを応用し、Playground環境にはサンプルレコードとして

・エンタイトルメント（Entitlement）
・商談（Opportunity）
・商品（Product2）
・ケース（Case）
・取引先責任者（Contact）
・取引先（Account）
・リード（Lead）
・ソリューション（Solution）



があるかと思います
（見逃しあったらごめんなさい）

つまり、この上記６つのオブジェクトのレコードをPlay ground環境から削除するには

delete [Select Id FROM Entitlement];
delete [Select Id FROM Opportunity];
delete [Select Id FROM Product2];
delete [Select Id FROM Case];
delete [Select Id FROM contact];
delete [Select Id FROM account];
delete [Select Id FROM lead];
delete [Select Id FROM solution];


となります
MySQLでトランザクション分離レベルを確認する

### MySQLのトランザクション分離レベルを確認しようとしたころ、MySQLのバージョンによって確認方法に差がありました。

まずは確認のためのコマンドを安易にグーグル検索したところ、

```
mysql> SELECT @@global.tx_isolation, @@session.tx_isolation;
```

というのがすぐに見つかったので実行してみます。

すると、

```
ERROR 1193 (HY000): Unknown system variable 'tx_isolation’
```

エラーが出る。そんなシステム変数は無いらしい。

次に見つかったコマンドも打ってみます。

```
mysql> SHOW VARIABLES LIKE 'tx_isolation';
```

するとやはり、

```
Empty set (0.01 sec)
```

何も見つからない。

試しにワイルドカードを使用すると

```
mysql> SHOW VARIABLES LIKE '%isolation%';
```

今度はちゃんと見つかりました。

```
+-----------------------+-----------------+
| Variable_name         | Value           |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.00 sec)
```

変数名がtx_isolationではなく、transaction_isolationでした。

ちゃんと調べたところ、MySQL 5.7のドキュメントに記載があります。

```
Note
transaction_isolation was added in MySQL 5.7.20 as a synonym for tx_isolation, which is now deprecated and is removed in MySQL 8.0.
Applications should be adjusted to use transaction_isolation in preference to tx_isolation.
```

「transaction_isolation は MySQL 5.7.20 で tx_isolation の同義語として追加されましたが、現在では非推奨となり MySQL 8.0 で削除されました。
アプリケーションは、tx_isolationよりもtransaction_isolationを優先して使用するように調整する必要があります。」(機械翻訳)

ということでMySQLのバージョン8からは、SELECT @@global.transaction_isolation, @@session.transaction_isolation が使えます。

```
mysql> SELECT @@global.transaction_isolation, @@session.transaction_isolation;
+--------------------------------+---------------------------------+
| @@global.transaction_isolation | @@session.transaction_isolation |
+--------------------------------+---------------------------------+
| REPEATABLE-READ                | REPEATABLE-READ                 |
+--------------------------------+---------------------------------+
```
<br>
ちなみにMySQLのバージョンはSELECT version() で確認できます。

```
mysql> SELECT version();
+-----------+
| version() |
+-----------+
| 8.0.28    |
+-----------+
```

# まとめ

MySQLでトランザクション分離レベルを確認するには

ver5.7までは
```
mysql> SELECT @@global.tx_isolation, @@session.tx_isolation;
```
ver8.0からは
```
mysql> SELECT @@global.transaction_isolation, @@session.transaction_isolation;
```
ということでした。

# 参考

[MySQL 5.7 Reference Manual](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html)
[MySQLのautocommitとトランザクション分離レベルのメモ](https://qiita.com/rubytomato@github/items/562a1638191aacaeb333)
AWS AmplifyはSSRとSSGを併用できないっぽい

未来のぼくへ

AWS AmplifyはSSRとSSGどちらかしか使えないみたいです

よくわからないエラーでビルドが通らなかったけどそういえば前にもこんなかんじで困った気がするなって思ってgetStaticPropsをgetServerSidePropsに書き換えたらビルドが通ったのでたぶん確定です

今のぼくより

---

過去のぼくへ

ちゃんと情報残しておいてください

今のぼくより
プロセス・オブジェクトの一覧を抽出して管理表を作る

## 趣旨
プロセスやオブジェクトが増えてきたので、管理表を作って整理したい。
新規オブジェクトを作るときに、車輪の再発明をしないよう、一度管理表を見て類似のものが既にないか確認できる仕組みを作りたい。

## 方法
Blue PrismのDBに対して、プロセス・オブジェクト一覧を抽出するSQLを流し、結果をExcelに貼り付けて管理表を作る。

## SQL

```SQL
select
    case
        when t1.ProcessType = 'O' then N'オブジェクト'
        when t1.ProcessType = 'P' then N'プロセス'
        else ''
    end as 'タイプ',
    case
        when t3.name is null then ''
        else t3.name
    end as 'グループ名',
    t1.name as 'オブジェクト・プロセス名'
from
    BPAProcess as t1
    left join
        BPAGroupProcess as t2
    on  t1.processid = t2.processid
    left join
        BPAGroup as t3
    on  t2.groupid = t3.id
where
    t1.AttributeID <> 1
order by
    t1.ProcessType desc,
    t2.groupid
;
```

## 結果
例として日商エレクトロニクス製のオブジェクトを出しています。（理由は特にありません^^;）
また、リタイアしているものは対象から外しています。

各列の説明は以下の通りです。

**タイプ：** プロセス or オブジェクト
**グループ名：** プロセス / オブジェクトをまとめているグループの名前
**プロセス・オブジェクト名：** プロセス/オブジェクトの名前
**概要：** 各プロセス/オブジェクト情報の説明欄に記載された内容

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/4891ae83-c0d4-0ee4-06e1-82e6142eba2b.png)

この結果を全選択コピーして、Excelにペーストして加工すれば管理表の完成です。

プロセス/オブジェクトにおいて、**説明**をしっかり書いておくと車輪の再発明のリスクがグッと減ると思います。
ちょっと面倒ですが、**何をするためのプロセス/オブジェクトなのか？** を明記する癖をつけておくと良いと思います。
JavaScriptにおける演算子の実行順

今までなんとなくで使っていましたが、改めて調べたのでメモとして。  
  
まず先に`優先順`で処理し、同じ優先順の中では`結合順`に従って処理していくようです。 
結合順という概念を今回調べて初めて知りました。 
 
  
```javascript
// ①
console.log(1 + 2 * 3)
// => 7
// 優先順位が異なる（掛け算が優先）ので、記述順に関わらず2*3が先に実行される

// ②
console.log(2 * 2 ** 3)
// => 16
// 優先順位が異なる（べき乗が優先）ので、記述順に関わらず2**3が先に実行される

// ③
console.log(2 ** 3 ** 2)
// => 512
// 優先順位は同じだが、算術演算子の中でべき乗は唯一`右結合`するので、右側の計算（3**2）が先に実行される

// ④
let a
let b
a = b = 3
console.log(a)
// = > 3
// 代入演算子も`右結合`するので、b　=　3, a = bの順に実行されることからaはundefinedにならない

```

## 参考
- [演算子の優先順位](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)  
- [べき乗 (**)](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Exponentiation)
【Excel】ピボットテーブルのスライサー機能を使って、ツールUIを作成する

## 実現したい事
<font color="Red">“複数条件をユーザーライクに同時選択出来る設定オプション”</font>をExcelツールのUI上に配置したい。
## 対応策の検討
以下の対応策を思いつきましたが、使いやすさの観点で、それぞれネックがあるなと思いました、、
* チェックボックスを配置する -->条件が多いと配置が面倒。今後条件が増えた時の更新作業が煩雑
* リストボックスを配置する -->条件が多いと縦方向に長くなり、複数条件を選ぶのが面倒
* ユーザーフォームを作成する -->フォーム作成が面倒。フォームを開くという1STEP作業導線が増える

<font color="Red">「今後の管理・更新作業が楽に出来る」「複数条件を選択・設定しやすい」</font>方法は無いかと考えた所、ピボットテーブルのスライサー機能が見た目的に一番イメージに近かったため、UI作成に取り入れてみる事にしました。
## 設定手順
#### 1.EXCELシート上に条件項目を入力する
![object_01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709200/56df9fdf-2808-0737-3e0b-671ccf3aea48.png)
#### 2.入力項目範囲を“テーブル化”する
![object_02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709200/0c61f243-3fac-a829-00e7-b21069db8415.png)
![object_03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709200/77f8a9c0-acd6-5462-1531-76004eb1bde2.png)
※テーブル化しておくと、後で項目追加した時に、<font color="Red">ピボットのデータ参照範囲が自動で更新される</font>ので、管理と更新作業が楽になります。
#### 3.上記設定範囲を選択し、スライサーを追加する
ピボットテーブルを追加し“行”に項目を設定
![object_04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709200/55ee003d-9193-a287-b07a-d80f1c0959db.png)
［挿入］→［スライサー］と遷移し、項目を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709200/76be225d-5b1f-aef9-66d7-cde0369d021a.png)
スライサーが配置されるので、スライサーを切り取り、UI画面用のシート上に配置します。
![object_06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709200/dd8a91d4-9a80-5fd3-0a5c-44f697326541.png)
スライサーの設定項目は、VBAコードでパラメータ取得が可能です。
※SlicerCaches内のスライサー名を【スライサー_項目名】と指定する必要がある点にご注意ください。
```
Sub 実行()

Dim S1 As Worksheet
Set S1 = ActiveSheet

Dim Sitem As SlicerItem
Dim Val As String
Val = ""

With ActiveWorkbook.SlicerCaches("スライサー_おせち料理の品目")
    For Each Sitem In .SlicerItems
        If Sitem.Selected = True Then
            If Val = "" Then
                Val = "注文したおせち料理の品目は" & Chr(10) & Sitem.Name
            Else
                Val = Val & Chr(10) & Sitem.Name
            End If
        End If
    Next
End With

If Val = "" Then
    MsgBox "品目を指定してください"
Else
    MsgBox Val
End If
End Sub
```
※プログラム実行結果
![object_07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709200/1b06a3f5-670d-8f21-ab3f-427c6cb08eeb.png)
## まとめ
本来の使用目的とは異なる機能を流用しており、最適解では無い気もしますが、、
「複数項目指定をユーザーライクに行えるようにしたい」場合の一案になるかと思い、
設定手順含め、記事に書き起こした次第です。
Aurora PostgreSQLのクローンを作成する

### クローンする場合はクラスターを指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/3cbb2d64-c443-90c2-f8b2-0ef30bde350f.png)

### インスタンス作成のための設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/40f6f2e4-6262-2a46-33ab-8a05cd1ecd1b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/14a2f18d-d22b-9509-ade0-ec5b0167b22a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/b939016c-f839-c301-08c6-44383e3c4420.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/5b8e2761-6c4f-3a4c-a7e7-8e527b04fef9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/6e76b4b8-3de5-d696-5bb8-67e9efddf1b0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/d90c8f46-24aa-51da-eaac-a57828c72f60.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/cd4835c9-c0f4-e0ac-5b08-787a0c56a0a9.png)
作成中…
最初はライターインスタンス一個作られるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/51f298df-605f-3752-f141-4e0513a4afa4.png)

お、出来上がったようです。完成までに約9分。
pg_bench用に適当にデータぶっこんで、サイズ図ってないですが、サイズでかい場合はさらに時間をみといたほうがよさそう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367069/51a5ad96-bdf5-f39b-1538-e6fba8932260.png)


### まとめ
今回の説明では省きますが、同一クラスタから、スナップショット作成してそこから復元ということもしてみました。
詳細は以下で合計20分。時間的にはクローンの方が早かったですが、オリジナルと同じデータ見るときはあるので、ユースケースにハマるか次第かなという感じでした。
スナップショット作成
	3min
スナップショットから復元（実質クラスターとインスタンスの作成と起動）
	16min
	ライターインスタンスの作成と起動が支配的な感じ
トンパ文字をスタンプ感覚で送れるプログラムを作った

# はじめに

日常生活で｢道路標識｣や｢ラインのスタンプ｣等, 様々な箇所で(広義の)象形文字を目にする.
そんな象形文字の代表的存在の一つがトンパ文字である.
wikipedia曰く
> 現在、世界で唯一の「生きた象形文字」とされる

とのことであり, シェアNo1・独占状態 の象形文字である.

こんな象形文字界のiPhoneであるトンパ文字をlineのスタンプのように気軽に打てたら......と思いそんなコードを作成した

↓使用時の動画
![dekita.mp4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950973/a5c8cbfd-2591-407a-a91b-5a2f60e7edb9.gif)

# トンパ文字データセットの作成

まずはじめにトンパ文字の本をPDF化し, 領域を切り抜くことで各トンパ文字の画像ファイルを作成した.

![0011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950973/b54300e4-c9ac-936a-da2b-11af22c077cf.png)

次に日本語と紐づけるために, Tesseract-OCRで下部の文字を読み取った.
以下コードの概要
```py
def imgToStrOCR(img,lang="jpn",tesseract_layout=6):
    path_ocr = r"C:\Program Files (x86)\Tesseract-OCR"
    if path_ocr not in os.environ["PATH"].split(os.pathsep):
        os.environ["PATH"] += os.pathsep + path_ocr
    tool = pyocr.get_available_tools()[0]

    result = tool.image_to_string(
        img, lang=lang, builder=pyocr.builders.TextBuilder(tesseract_layout=tesseract_layout)  
    )
    return result
```
最後にOCRに間違いが多いため, 手動でそこを修正した.

# プログラムの流れについて

1. 検索欄に単語を入力 
1. それに近いトンパ文字を表示
1. その画像をクリップボードに格納
1. 貼り付け

を想定

1,2に関しては各単語をmecabで分かち書きしword2vecで類似語を探すという処理をした.

### mecabを使った分かち書きについて

mecabを用いることで, 入力した日本語を各単語に分割しその品詞等の情報を得ることができる.
今回は, 文を品詞で分解したあと, 助詞と助動詞と記号を除外した.

例えば｢今日は晴れだ｣という文章があったら.
分かち書きをし助詞等を除外することで｢今日｣｢晴れ｣という2単語に変換した. 

以下コードの概要
```py
import MeCab

m = MeCab.Tagger()
def text_to_words(text):
    lines = [
        line for line in m.parse(text).split('\n')
        if (
            "\t助詞" not in line
        ) and (
            "\t助動詞" not in line
        ) and (
            "\t記号" not in line
        ) and (
            line != 'EOS'
        ) and (
            line != ''
        )
    ]
    return [re.split('[\t,]',line)[0] for line in lines]
```

### word2vecについて

各単語の共起性から, 単語をベクトル化するアルゴリズムをword2vecという.
ベクトル化した単語のcos類似度が高いものほど, より意味が近い単語になりがちだと知られている.
入力された単語のベクトルの和とcos類似度の高いトンパ文字を抽出することで, それっぽいトンパ文字検索を実装した.

# プログラムの実装について

word2vecをそのまま実装してしまうと, word2vecの学習データがすべてメモリに乗るため起動に数十秒の時間がかかる.
また, 常駐型ファイルにすると, 常にメモリ上にGBオーダーのデータが残り続けることになる.

その問題を解決するため, word2vecをローカルファイルから高速で読み書きが可能なSQLファイルに変換を行った.
具体的には 
[単語],[ベクトル要素1],[ベクトル要素2],[ベクトル要素3],......
というDBをword2vecの学習済みファイルから作成し, そこから読み書きを行うように実装した.
これにより, 実装時の起動時間が2秒に短縮した.

また, 細かなGUIの実装はtkinterで行った.

# 結論

トンパ文字をより気軽に送れるようになった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950973/84c451f4-857a-97eb-c994-8fa98d9d02d3.png)
MathMLを使って数式をWebに表示して、さらに動的に追加されたDOMのスニペットも数式表示化

 いま開発中のアプリでどうしても平方根やその他の数式を表示したいので、MathMLというJavascriptライブラリを使う。

↓まずはMathJaxのJavaScriptライブラリを読み込み
```ruby:quiz.html.erb
<script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script>
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3.0.1/es5/tex-mml-chtml.js"></script>
```

↓HTMLにべた書きすべき「ルート３」はMathJaxではこのように記述するので・・・

```html
<math><msqrt><mi>3</mi></msqrt></math>
```
↓これをこんなふうにHTMLにべた書きすると・・・
```ruby:quiz.html.erb
<div class='answer' id='answer-1'>
    <h3 class='n'></h3>
    <p><math><msqrt><mi>3</mi></msqrt></math></p>
</div>
```

ふむ、静的に初めからHTMLにべた書きしたスニペットは正しく数式にしてくれているようだった。
![スクリーンショット 2022-11-04 12.22.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628412/0cecf770-d588-35fa-7230-24f7a9a5df6a.png)


しかし、ここからJavaScriptを用いて次の問題や解答の選択肢を追加すると、べたの`<math><msqrt><mi>3</mi></msqrt></math>`が表示されてしまったり、ルート部分が消えてただの「３」になってしまう。
↓ルート３を表示したかったのに・・・
![スクリーンショット 2022-11-04 12.20.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628412/415ccf76-2a3e-018b-3c52-07809fed32fc.png)

今回は問題に対する答えを４択ないし８択で選んで答えるというクイズゲームなので、後から動的に差し替える問題と答えのスニペットもちゃんときれいに数式化してもらわなくちゃ困る訳である。

これはおそらく後から動的に追加したDOMにはイベントハンドラがないというjQueryでよくひっかかる話と似ていて、あとからHTMLに追加されたMathMLスニペットに対してレンダリング処理をかけていないことが理由だろう。そうとしか考えられない。
そこでMathMLのDocumentを漁っているとやっぱり再レンダリングする関数がちゃんとあったので、再レンダリングしたいタイミングで

```javascript:quiz.js
MathJax.texReset();
MathJax.typeset();
```
をかけてやると、問題なくすべてのDOMをレンダリングしてくれた。

↓やったー
![スクリーンショット 2022-11-04 12.22.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628412/f1533dc6-a553-d79d-9deb-6fae6448d247.png)
Pythonで連長圧縮(Run Length Compression)

Pythonで二値連長圧縮
```python
def run_length_compression(array: str) -> list[int]:
    """Return the run length compression of the given binary array.

    Args:
        array (str): The binary array to compress.

    Returns:
        list[int]: The run length compression of the given binary array.
    
    Examples:
        >>> run_length_compression("ABBABBABBB")
        [1, 2, 1, 1, 2, 3]
    """
    compressed = []
    head = array[0]
    count = 0
    for x in array:
        if x == head:
            count += 1
        else:
            compressed.append(count)
            head = x
            count = 1
    compressed.append(count)
    
    return compressed
```
macOS Venturaにアップデート後、ssh接続できない時の対処法

# 問題
macOS Venturaにアップデート後、ssh接続しようとすると以下のような警告文が出る
```
sign_and_send_pubkey: no mutual signature supported
hoge@hoge.example.com: Permission denied (publickey).
```

## 対策
configにて対象のHostに以下の末尾2行を追加

```~/.ssh/config
Host example.com
...
  HostKeyAlgorithms  +ssh-rsa
  PubkeyAcceptedKeyTypes  +ssh-rsa
```

## 追記
macOSVenturaでOpenSSH_9.0p1が標準搭載になり、SHA-1ハッシュのRSA署名が無効になったため発生したようです。
一時対策なので、本来はサーバーのSSHソフトのアップデートが必要

以下参考
https://superuser.com/questions/1749364/git-ssh-permission-denied-in-macos-13-ventura
Android Xlint:deprecationオプションを指定して再コンパイルしてください

久しぶりにAndroidアプリをビルドしたら以下の警告が・・

>Task :app:compileDebugJavaWithJavac
注意:xxxは非推奨のAPIを使用またはオーバーライドしています。
注意:詳細は、-Xlint:deprecationオプションを指定して再コンパイルしてください。


デフォルトだと詳細までは表示してくれないようで、build.gradleを修正します。
```
allprojects {
    repositories {
        google()
        jcenter()
    }
    //　以下を追加
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:deprecation"
        }
    }
}
```

>xxx.java:26: 警告: [deprecation] WebViewClientのshouldOverrideUrlLoading(WebView,String)は非推奨になりました
    public boolean shouldOverrideUrlLoading(WebView webView, String url) {

おぉ、詳細なメソッドまで教えてくれるようになりました。

こんな時はリファレンスを！

https://developer.android.com/reference/android/webkit/WebViewClient

>boolean	shouldOverrideUrlLoading(WebView view, String url)
This method was deprecated in API level 24. Use shouldOverrideUrlLoading(WebView, WebResourceRequest) instead.

API level 24（Android 7.0)で非推奨になったようです。
引数がどうやら変わったようです。

URIを取得する際にparseしていたのをダイレクトに取得する感じですね。

```
Uri.parse(url)
↓
request.getUrl()
```
paiza.ioでelixir その41

# 概要
paiza.ioでelixirやってみた。
Agent使ってみた。

# サンプルコード

```
defmodule FibAgent do
	def start_link do
		Agent.start_link(fn ->
			%{0 => 0, 1 => 1}
		end)
	end
	def fib(pid, n) when n >= 0 do
		Agent.get_and_update(pid, &do_fib(&1, n))
	end
	defp do_fib(cache, n) do
		case cache[n] do
			nil ->
				{n_1, cache} = do_fib(cache, n-1)
				result = n_1 + cache[n-2]
				{result, Map.put(cache, n, result)}
			cached_value ->
				{cached_value , cache}
		end
	end
end

{:ok, agent} = FibAgent.start_link()
IO.puts FibAgent.fib(agent, 10)


```

# 実行結果

```
55
```

# 成果物

https://paiza.io/projects/2Xj3Bg7SeJ4-hFxdHf-x9A?language=elixir


以上。
【DDD実践思考メモシリーズ】ツーサイドマッチングプラットフォームにおけるユーザードメインの扱い方について

#　ツーサイドマッチングプラットフォームとはなにか？
あまり聞き馴染みのない言葉かもしれないですが、
例えば[複業クラウド](https://talent.aw-anotherworks.com/)は企業と働き手をマッチングさせるためのプラットフォームなので、
性質の異なるユーザーが二種類存在し、両者をマッチングさせるサービスです。

# 複業クラウドのマッチング図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114212/fc87b617-ba57-a1d9-07f0-2a8509eb601b.png)

企業は求人を出して求人を通してタレントと企業がマッチングする仕組みとなっている

# ツーサイドマッチングプラットフォームにおけるドメイン設計の難しさとは？
上記の図からDomainモデルとしては
- Company
- JobOffer
- Talent

などが作成されると思います。
ただしこれはCompany、 Talentのどちらもユーザー側の目線として作られたものになります。
複業クラウドは求人に対してエントリーすることもできるし、企業側からタレントに対してスカウトを送ることもできるので、
企業から見た時にはタレントがコンテンツであり、タレントから見た時は企業はコンテンツであるということが考えられます。

企業がタレントを見る際にはメールアドレスなどの個人情報を見ることはできないですが、タレントがユーザーとして活動する上ではメールアドレスは必要になります。
ここでコンテンツとしてのモデルと、ユーザーとしてのモデルは乖離が生まれます。

# タレントというコンテキストと企業というコンテキストで完全に分けてしまうのはだめなのか？
ここもかなり難しいところで実際に分けているチームもあるとは思いますが、あくまでマッチングプラットフォームであり、かつメッセージなどのやりとりが発生し、両者のユーザーの直接的な接点が多いサービスなので完全に分断してしまうのは良くないと考えています。

例えば
- 求人
- スカウト
- エントリー
は両者ユーザーをつなぐものであるのでここのコンテキストが二重管理のような状態になってしまう危険性があります。

# 適切なコンテキストでドメインを分解する
そこで弊社ではドメインレイヤーにタレント検索というモジュールを作成し、Talentエンティティーと検索で利用されるコンテンツとしてのTalentエンティティーを作成しました。

```
- domain
 |- talent
   |- talent.ts
 |- talentSearch
   |- talentSearchItem.ts
```

# Another worksでは一緒に働ける仲間を募集しています！
https://another-works.notion.site/another-works/Another-works-882035fc568b4b60bb767bd2ca1e3182

またもし気軽に話だけでも聞いてみたいという方がいれば私やPMの宮内とお話しできればと思います！

https://meety.net/matches/DhEJUzkjlwGP

https://meety.net/matches/DCdcBhXbqjoR
chromeで"alcで検索"

# 目的

英単語検索でキーボード打ちたくない

# 実現方法
アイコンの著作権問題があるのでやり方だけ

## 適当なディレクトリを作る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2383810/84fb4b7b-e1d8-cf53-4d21-ee5af1b48d9f.png)

### imagesの中
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2383810/0d999333-cda4-9f76-0369-c7b162ec7d1c.png)

名前はmanifest.jsonと合っていればなんでも良い
画像は各自で用意

## manifest.json
```json
{
  "name": "ALCで検索",
  "description": "選択した単語をalcで検索します",
  "version": "1.0",
  "manifest_version": 3,
  "icons": {
    "16": "images/icon_16x16.png",
    "48": "images/icon_48x48.png",
    "128": "images/icon_128x128.png"
  },
  "permissions": ["activeTab","scripting","contextMenus"],
  "action": {
    "default_title": "ALCで検索",
    "default_icon": "images/icon_48x48.png"
  },
  "background": {
    "service_worker": "background.js"
  }
}

```

アイコン要らない場合は該当部分を消せばよいが、
末尾のカンマ(,)に注意すること。

## background.js
```js
chrome.runtime.onInstalled.addListener(function (details) {
    const parent = chrome.contextMenus.create({
      id: "alc",
      title: "%sをalcで検索",
      contexts: ["all"],
    });
});
chrome.contextMenus.onClicked.addListener((info, tab) => {
    chrome.tabs.create({url: "https://eow.alc.co.jp/search?q=" + info.selectionText});
});
```

## ブラウザの設定
1. chromeで`chrome://extensions`を開く
1. 開発者モードをON
1. パッケージ化されていない拡張機能を読み込む
1. 作ったディレクトリを選択

# 結果
左ダブルクリック→右クリック→作ったメニューの選択で検索できる。

SRWare Ironでも動いた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2383810/f9ce5df7-c40a-f35b-c3cf-b91182d22dad.png)

# その他
## 課金してる人向け
pro登録者は`background.js`の
`https://eow.alc.co.jp/search`を
`https://eowf.alc.co.jp/search`に変える

## アイコン
alcのアイコンはここにある
https://cdn2.alc.co.jp/eow/sp/images/icon.png

ちなみに以下で調べられる
https://realfavicongenerator.net/favicon_checker?protocol=http&site=eow.alc.co.jp%2F#.Y2SNLb3ni70
VS Codeがvirtualenv環境を認識しないときの対処法


# 起きたこと
いつもと違うマシンでPythonを動かしたところ、VS CodeがVirtualenv環境を認識してくれませんでした。
これのせいで、例えば以下のようにエラーが出ます↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348026/07756dc2-0254-22b3-3de4-56256d116995.png)
（実際にエラーを表示しているのは「Pylance」という拡張機能で、「import先が見つからないよ」と事前に伝えてくれています）

### 環境
windows 10
VS Code 1.72.2

# 対処方法
VS Codeに、仮想環境の場所を教えてあげます

## 1. Poetry が動かせる環境にて以下を実行
```poetry config virtualenvs.path```

## 2. 1で得られたパスを、そのまま以下の場所に入れ込みます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348026/647a6a34-3c6d-8477-0908-5392950bba23.png)

## 3. 最後にもう一つ
VS Codeの右下のここを押すと、利用できる仮想環境が出てきます。その中から、2で設定したものを選びます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348026/b11c3359-c24a-8edb-aa0f-236d414adc24.png)

# はい、要らないエラーが消えました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348026/97479ea7-4386-c2f7-1f98-aa5a6ca2beee.png)

# 参考
https://qiita.com/psychoroid/items/6646d45d6a019f5cf16f
https://qiita.com/makuramoto1/items/b5aa08d5fc1ce6af0fb4
簡単Elixirシリーズ 〜 うるう年判定をJSとElixirで比較してみる簡単なお仕事


Elixir
東京にいるけどFukuokaexのYOSUKEです。

簡単 Elixirシリーズでは小ネタをサクッと書いていこう。というコンセプトで作っていきます。

仕事柄、Elixir以外の言語を使ってサンプルコードを作成する。または教材を作ることをやっています。最近、うるう年か否かを返してくれる関数を作りなさい。というお題のJavaScriptのコードを書いたので、Elixirで書くとどうなるか？を試してみようという記事です。（そう、この記事はサクッとがコンセプトW）

お題は、```isLeap("2004")```という関数を実行して、```true```のような結果を返すものです。

まずは、JavaScriptのコードを見てみましょう。
```javascript
function isLeap(string){

    const year = parseInt(string,10)
    if(year%4===0){
        if(year%100===0){
            if(year%400!==0){
                console.log(false)
                return false
            }
        }
        console.log(true)
        return true
    }
    console.log(false)
    return false
}
```
これをElixirにしてみます。

```elixir
defmodule Judgment do
  def isLeap?(string_year) do
    string_year
      |> String.to_integer
      |> Date.new(1,1)
      |> elem(1)
      |> Date.leap_year?
  end
end
```

こんな感じでしょうか？ 他にも色々な書き方はあると思います。
get_random_string関数をIDに使ってもまず重複しない - Django

今回はDjangoの `get_random_string` 関数についてです。

僕のプログラミングコ学習コース

→[【中級者向け・Django4対応】Python/DjangoによるECサイト開発講座（Django3.2系にも対応）](https://www.takux.one/#django-ecweb-vegeket)

内でご質問いただいたので解説してみたいと思います。

ご質問内容は次のような感じです（一部省略・編集してます）。


> get_random_string はランダムな値を生成するので、idとして使うと重複してしまうのではないでしょうか？

## コースでの使用例

コースでの使用を簡単な例に書き換えたものが次のコードです。

```python
from django.db import models
from django.utils.crypto import get_random_string

def create_id():
    return get_random_string(22)

class Item(models.Model):
    id = models.CharField(default=create_id, primary_key=True, max_length=22, editable=False)
    ...
```

モデルを定義する時に、idフィールドに対して、CharFieldを設定し、そのdefault値にget_random_string関数で実行した値を渡しています。

Itemモデルのid（pk）に対してランダムな22文字の文字列を渡しているということになります。

## get_random_string を使う
get_random_string がどんなものかを確認するために使ってみたいと思います。

Djangoでは次のようにインポートして get_rangom_string を使うことができます。

```python
from django.utils.crypto import get_random_string
```

get_random_stringはランダムな文字列を生成してくれる関数です。

基本的な使い方は簡単で次のように文字数を引数に指定してあげるだけです。

```python
get_random_string(12)
```

この場合は12文字のランダムな文字列を生成することになります。

試しに3回ほど実行してみた結果です。

```python
# 1回目: 'Paz3kzrlnREK'
# 2回目: 'Yj4M6vRaze0R'
# 3回目: 'zJZ8Lf3AZFEx'
```

## get_random_stringは重複するか検証
ご質問の内容において重複しそうか検証してみます。

次のコードでは100万回get_random_stringを実行し、既に実行された値を集合として保持し、重複しているか確認します。


:::note warn
集合ではなくリストに保持し、in演算子を使っても検証できますが、100万回のループではすごく時間がかかるのでここでは集合を使い重複した場合は要素数にずれが生じることを利用してチェックしています。
:::

```python
from django.utils.crypto import get_random_string

r = set()
for n in range(1000000):
    s = get_random_string(12)
    r.add(s)
    if (n+1) != len(r):
        print(f"Duplicate found: {s} at {n}")
        break
```

検証の結果、100万回実行しても重複しないことが確認できました。

また、コースでは22文字なので、さらに重複しない可能性は格段に上昇しています。

## どれぐらい重複しないのか
ランダムに生成している以上、被る可能性は理論的にあります。ただ現実的な時間内では被らないことをほぼ保証できます。

例えばget_random_stringを12文字で実行した場合を考えてみます。

get_random_stringのデフォルトで設定されている文字は

- 大文字英字（26文字）
- 小文字英字（26文字）
- 数字（10）

となります。

つまり、全部で62文字の中から１文字が選ばれることになります。

それを12回繰り返すことになるので、組み合わせ数を計算すると、

62の12乗、つまり3垓2262京のパターンが存在することになります。

これは一説には同じものを当てるためにはコンピュータでも2000年かかるぐらいの規模のようです。

この時点で、重複に関してはほぼ無視していい確率となります。さらにコースでは12文字ではなく22文字にしているので、被らないと考えて大丈夫です。

:::note warn
逆に考えると、被った場合は宝くじの１等を当てるよりも奇跡を引き当てたことになるので喜ばしいことかもしれませんね。
:::

## idにget_random_stringを使用した理由
djangoではid（pk）を明示的に指定しない場合は連番になります。これも被らないことが保証されるので、一番楽かもしれません。

ただ、連番の場合はそのidをURLパスなどに使用すると、いくつデータ（レコード）があるのかを大まかに推測できることになります。

例えばuserのidが連番になっていて、userのidが15なら、15番目のuserということが推測できたりします。

気にしないならば良いのですが、大抵のユーザーIDやECサイトの商品IDなどはランダムな文字列になっています。

本コースでもその点を考慮してget_random_stringを使用しました。

idにはよくUUIDを使ったりしますが、UUID も基本的に同じ考え方です。UUIDでも良かったのですが、ハイフンが入るので見た目文字列が長くなるので使いませんでした。この辺りは好みの問題になります。

get_random_stringやuuidを使うと何が良いかというと、重複することがまずありえないので、毎回のIDの重複チェックを不要にできることです。

ちなみに今回取り上げたget_random_string関数はDjangoのソースコード内部でも、session_keyやsecret_keyに対しても（文字数などは異なりますが）使用されています。

以上のように、極端に文字数を少なくしないのであれば積極的に使ってもいい関数だと思いますので、ぜひ使ってみてください。
yukicoder no.2051 解説

[yukicoder no.2051 Divide](https://yukicoder.me/problems/no/2051)の解説です．
<h2>1. 問題</h2>
正整数 $A$, $B$ が与えられます． $A$ の約数かつ $B$ の倍数である正整数の個数を解答してください．
<h4>制約</h4> $1 \leq A,B \leq 10^9$ 

<h2>2. 解法</h2>
 $10^9$ 以下の正整数は，高々約数を $1344$ 個しか持ちません．したがって， $A$ の約数をすべて列挙したうえでそれぞれが $B$ で割り切れるかを判定すればよいです．約数列挙は $O(\sqrt{A})$　で行え，これは十分高速です．
<details>
<summary>ACコード</summary>

```cpp
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
    int A,B;
    cin>>A>>B;
    int count = 0;
    for(int i=1;i*i<=A;i++){
        if(A%i != 0) continue;
        int x = i;
        int y = A/i;
        count += (x%B == 0)+(y%B == 0 && x != y);
    }
    cout<<count<<endl;
}
```

</details>
ちなみに，「 $N$ が $N$ 未満のどの正整数よりも多くの約数を持つ」といった性質を持つ正整数 $N$ は無限に存在し，このような数を高度合成数といいます．<br> $10^9$ 以下の最大の高度合成数は $735134400$ であり，これが $1344$ 個の約数を持ちます．
GoogleAppsScriptで大量メール送信　第1回概要

## 経緯
PowerAutomateDesktop(PAD)でメール送信(Gmail)フロー作成した際に、以下の情報が。

>「アカウントを安全に保つため、2022年5月30日より、Googleは、ユーザー名とパスワードのみでGoogleアカウントにログインするサードパーティ製のアプリとデバイスについてサポートを終了いたします。」と発表がありました。

要するに、外部アプリからGoogleアカウント利用に対して制限をかけるとのこと。
確かに、セキュリティ的にも危険ではありますからね。

サードパーティーがダメなら、GoogleAppsScript(GAS)であれば、送信できるのかな？と考えて、実装しました。

::: note info
ちなみに実業務では使っておりません^^
::: 

## GASで実装してみて
1.プログラミング初心者向き
    PHP・Javaなど学習することももちろん良いですが、GASは環境構築は不要なため、直ぐに始めることできます。
    また、JavaScripをベースに作られているようなので、JavaScriptの勉強にもなります。
2.課題解決力向上
    スクリプト実行回数、1日のメール送信件数などGoogleには様々な制限があり、それに対してどう解決できるかを考えるため、課題解決力向上が見込めます。

## 仕様
給与明細及び勤怠表をメール送信
当システムを使用する方は、非エンジニア
### 対象
200人のスタッフ
### 項目
- スタッフ情報
    - ID　国別コード(2桁)　+ 数字5桁
    - 社員名
    - メールアドレス
- メールテンプレート
    - 複数あり
- 勤怠表
    - 複数(上限3ファイル)
- 給与明細
    - 1ファイル   
      
### 全体図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2854030/b5dc8a10-e8bf-c69b-f4ec-0a545d14627b.png)

#### 送信対象リスト
当リストを元にメール送信実行
- 社員ID
- 社員名
- mailアドレス
- mailテンプレート(パターン1、2、3)
- 勤怠表1
- 勤怠表2
- 勤怠表3
- 給与明細
- 送信結果
#### 国別フォルダ管理
当リストを国ごとにフォルダIDを事前に保管。
※フォルダIDとは、Google Drive内で該当フォルダがどこあるのかを示す一意IDのことです。

- 国コード
- 勤怠表フォルダID
- 給与明細フォルダID

#### 勤怠表フォルダ管理
処理速度を考慮して、国コードフォルダ配下に国コードに応じたファイルを保管。

#### 給与明細フォルダ管理
処理速度を考慮して、国コードフォルダ配下に国コードに応じたファイルを保管。

#### mailテンプレート
様々な文書に対応できるように、テンプレートを保管。


## おわり
第1回はこの辺で。
C言語ソースのコメントを翻訳するPythonスクリプト

流用元のソースコードのコメントがドイツ語でさすがに分からん、ということで、ドイツ語から英語に翻訳するスクリプトを作成しました。Google Translateを使用しています。
ポイントは、コメントをリストで抽出後、一度すべて〈translate〉という文字に置き換え、翻訳後上から順に戻すというやり方にしている点です。（文字の位置にしようかとも思いましたが、それだと置き換えるたびにズレてしまうので。）
英語コメントを日本語にして読むような用途にも使えると思います！

```python:translate.py
# -*- coding: utf-8 -*-
# Google Translateはエラーが出るため以下バージョン使用
# python -m pip install googletrans==4.0.0rc1

from chardet import detect
import re
from googletrans import Translator
import glob

def translate(filename):
    # エンコードを検出してファイルを開く
    with open(filename, "rb") as f:
        b = f.read()
        enc = detect(b)
        data = b.decode(enc["encoding"], "ignore")  # デコードエラーは無視

    # 正規表現でコメントを抽出
    # 置換用に一度別の文字列に置き換え
    pattern = "/\*[\s\S]*?\*/|//.*"
    key = "<translate>"
    comments = re.findall(pattern, data)
    trans_data = re.sub(pattern, key, data)

    # Google Translateで翻訳
    translator = Translator()
    trans = []
    for c in comments:
        trans.append(translator.translate(c, dest='en', src='de').text) # 翻訳元、翻訳先の言語を指定
        print(".", end="")
    print("")

    # 翻訳結果で文字列を置換
    # 改行コードを統一
    for t in trans:
        trans_data = trans_data.replace("<translate>", t, 1)
    trans_data = trans_data.replace("\r", "")

    # 元のファイルにUTF-8で書き戻す
    with open(filename, "w", encoding="utf-8") as f:
        f.write(trans_data)

if __name__ == '__main__':
    file_list = glob.glob('folder/*.[ch]')  # 翻訳対象のフォルダを指定
    for file in file_list:
        print(file, end="")
        translate(file)


```
ppc64leをUbuntu on Intel x86-64で動かす

pcc64leをUbuntu on Intel x86-64上で、エミュレーションにて動かします。



https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-22-04

上の記事を参考にしました。


手順としては以下の通り。ターミナルで以下を実行します。

まずはアップデートする。
```
sudo apt update
```
aptにパッケージをHTTPS経由で利用させるための事前パッケージをインストール

```
sudo apt install apt-transport-https ca-certificates curl software-properties-common
```

システムに公式DockerリポジトリのためのGPGキーを追加する

```
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
```

APTソースのためのDockerリポジトリを追加する
```
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```
システムに認識させるためにパッケージをアップデートする

```
sudo apt update
```

デフォルトのUbuntuリポジトリではなく、Dockerリポジトリからインストールするようにする

```
apt-cache policy docker-ce
```

出力は以下のようになります

```
$ apt-cache policy docker-ce
docker-ce:
  インストールされているバージョン: (なし)
  候補:               5:20.10.21~3-0~ubuntu-jammy
  バージョンテーブル:
     5:20.10.21~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
     5:20.10.20~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
     5:20.10.19~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
     5:20.10.18~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
     5:20.10.17~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
     5:20.10.16~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
     5:20.10.15~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
     5:20.10.14~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
     5:20.10.13~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
```

最後にDockerをインストールする

```
sudo apt install docker-ce
```

ここは参考資料にないのですが、qemuをインストール

```
sudo apt-get install qemu-user-static
```

以下のコマンドでDockerを走らせることができる

```
sudo docker run -it ppc64le/ubuntu sh
```
VSCode 1.73のリリースノートでこれいいなと思った機能

VSCode 1.73がリリースされました。
今回も自分が使いそうな機能でいいなと思った機能を紹介します。

1.72の記事はこちら

https://qiita.com/ckbys/items/1ef11a6670cfe4cde2aa

## 検索結果からディレクトリを検索対象に（含める｜除外する）

https://code.visualstudio.com/updates/v1_73#_include-and-exclude-folders-from-search

操作方法はリリースノートを見てもらうとわかるのですが、検索結果のディレクトリのコンテキストメニューからディレクトリを検索結果の対象に含めるか除外するか選択できます。
ただ、既存の設定は上書きされてしまうのであくまで一時的な使い方になると思います。

## コマンドセンター表示

https://code.visualstudio.com/updates/v1_73#_command-center-mode-shortcuts

デフォルトでは非表示になっていますが、コマンドセンターっていうのがウィンドウの中央上部に表示できるようになりました。
また、コマンドパレットで「Launch Command Center」を実行するとコマンドセンターの機能が使えます。（これは前から？）
個人的にはコマンドパレットからコマンドセンターを起動するとショートカットを割り当ててない機能もキーボードでの選択で使えるので便利だなと思いました。

## マージエディタ改善

https://code.visualstudio.com/updates/v1_73#_merge-editor

元ソースとマージ対象の差分処理が賢くなってるみたいですね。
あれ？これはどれを残してどれを削除すればいいんだっけ？みたいな事が減りそうです。

また、差分表示も変更部分がわかりやすくなっていますね。
すごくよさそう！


今回は少なめですが以上です！
自分が普段触らなそうな所も修正点が色々あるようなのでリリースノート見てみてください！
これは正しいだろうか？

「自分は想像力が欠如した人間ではないか？」と思ったことはあるだろうか。ちょっと立ち止まって考えてほしい。

### 例題
1, x, 5という数字の列がある。xに当てはまるものは何か？

### なぜ即答できたのか?
x=3と考えて、それ以外を想像しようともしなかった人は多いかもしれない。

$f(k)=2k+1$

その人は、これしか思いつかなかったのだ。

### もっと色々考えられる
例えば以下のバリエーションについて考えることができる。

- $f(1)=x, g(x)=5$
- $f(1,x)=g(5)$
- $f(1,5)=g(x)$
- $f(1,x,5)=c$
- $f(1)=g(x)=h(5)$

少なくとも、このような関係を持つようなあらゆる$(x,c,f,g,h)$が考えられるはずだ。

例えば

$f(1,x)=(1+x)^2, g(5)=5^2+i, f(1,x)=g(5)$

とする。この場合の代数的な解はなんだろうか？

このような関数を無数に考えることができるというわけだから、問題に大した制約条件もないのに線形性を仮定して、しかもそれだけが解だと考えたのはなぜだろうか？

### 想像と文脈
色々なことに想像が及ばなくなる理由の一つは、

- 与えられた問題に対して、具体的な文脈・状況・制約条件・環境を暗黙理に仮定してしまっている

ということかもしれない。

一方で、物事を抽象化すると、可能な入力は一つではないことがわかる。2k+1よりは、(1,x,5,c,f,g,h) を使った組み合わせについて考えたほうが一般性がある。そして色々なデータを沢山入れてみて、システムをテストすると、前よりも物事がわかるようになるかもしれない。

現実問題は複雑である。

- どのような目的が存在してるか。あるいはその目的が適切なのか。
- 目的に対し、解きたい問題はなんであり、どう定義するか。
- どのようなデータをどこからどうやって取得するのか。

そういうことにも想像力を使うので、全体としてみれば、決まった最適化問題をただ解くだけということはない。

一方、制約条件が非常に具体的に固定化された場合においては、ひたすら最適化を考える方に比重が傾く。リーダーボードに予測結果を投げて精度の数値をひたすら高くなるようにすることだけが目的なら、他のことは考えなくていいのかもしれない。そのような固定の制約条件で問題を解くことも重要だが、視野を広げたい場合は別である。

多くの現場では、モデル職人が人事AIの目的に倫理的な疑問を持ったとしても「それはお前の仕事ではない」というだろう。そして、誰かがTwitter上で人事AIの素晴らしさについて語り始めたとして、あなたはなぜそれを鵜呑みにするのだろうか？

### なにがいいたいのか
一つ言えるのは、インターネット住民が「これが正しい」について話し始めたら、彼らの背後にある文脈において正しいのかもしれないが、あなたの文脈では全く別のことが起こっている可能性はあるということだ。

### Mathematical maturity (数学的な成熟度)
Mathematical maturityは数学者が直接教えることができない数学的経験と洞察の混合物を指す。

https://blogs.ams.org/matheducation/2019/04/15/precise-definitions-of-mathematical-maturity/

このようなQiita記事を書いているのは、自分が完全に独学で数学をする立場であり「語られていない何か」を体得するのが、職業的な数学者よりも困難な状況にいると思うからである。

Mathematical maturityの内容は千差万別になり得るので定義すること自体がナンセンスかもしれない。ただ、人間が社会的動物であるということを十分に利用することが効果的ではないか。お気持ち程度の経験則も、一応こうやってQiita記事にして書いておけば、読んだ誰かがこれは納得できるとかそうではないとか考えてくれるかもしれない。

### 追記

関係ないですが、関数が世界を記述するという概念に魅了された教師のミームを貼ります。

https://twitter.com/dodecahedra/status/1587928442485424131
VSCodeのC/C++ formatで中括弧の位置が気に入らないあなたへ

```c:AllMan
while (x == y)
{
    something();
    somethingelse();
}
```

を

```c:K&R
while (x == y) {
    something();
    somethingelse();
}
```

ってフォーマットしてほしい！！！

そんな時、手軽に変えたいときは…`.clang-format`ファイルを作成して、以下のように設定するとよい

```:.clang-format
BreakBeforeBraces: Attach
```

または俺はGoogle厨なんだ！って人は、

```:.clang-format
BasedOnStyle: Google
```

と設定するとGoogleのフォーマットになってくれる。

#### 個人的な意見

普段Deno使っているので、そのフォーマットが見慣れているだけかもしれないがK&Rが見やすい。

あとは、AllManだと、ifの中が1行の時に行数を削減したいとき、中括弧を省くことがあるが、あとから中身が2行とかになったときに中括弧を書く必要がある。

```c:AllManだと
if (x == y)
{
    something();
}
// 行数削減時には以下のようにする
if (x == y)
    something();

// けど後でifの中身が増えたときには中括弧を書かないといけない
if (x == y)
{
    something();
    somethingelse();
}
```

K&Rだととりあえず中括弧つけておけばいい感じ。

```c:K&Rだと
// 中括弧省いても1行しか変わらない。
// 終わりの中括弧はあった方がifの終わりがわかりやすい
if (x == y) {
    something();
}

// 後でifの中身が増えたときには中身を増やすだけ
if (x == y) {
    something();
    somethingelse();
}
```

という観点から僕はK&Rを推している。
Swiftについて色々調べてみた。

=========================

▼タイトル

Swiftの役割について

=========================

▼背景

NFCのパブリッシャーとデベロッパの要求概要について学習する中で、
今回作成したNFCの開発思想は、Swift(プログラミング)の思想から持ってきたと
言うことで、Swiftについて考察する　

備考
　SwiftとはSwiftはApple社が2014年に発表したオープンソースのプログラミング言語です。
　Mac・iPhone・iPad・Apple Watchなど、さまざまなApple製品向けのアプリケーションをSwiftで開発していくことが可能になった。
さらに、一般的なWebアプリ開発までSwiftで出来るようになった。

=========================

▼目次

本ドキュメントは以下で構成されている。

・Swiftとは
・Swiftメリットとは
・Swiftデメリットとは
・Swiftでできること
・アップルストアにデプロイするための費用

=========================

▼Swiftとは
 
Apple製品のアプリ開発にはObjective-Cというプログラミング言語が使われてきました。Objective-Cからはたくさんの素晴らしいアプリが生まれ、十分成果を挙げていましたが、
今までアプリ開発で使われてきたObjective-Cが、独特な構文や特徴を持っていたので、開発を続けていく上で不便な部分や難しい部分があったことやObjective-CはApple製品に特化していたため、違う言語を使用している人や新しく学ぶ人たちの敷居が高くなっていたこと
 
などの理由からSwiftが発表されました。

=========================

▼NFCメリット

・コードがシンプルだから初心者でも学びやすい
Swiftは、コードをシンプルに書けるように開発された言語です。そのため、初心者でも学びやすい言語になります。例えばSwiftでは、プログラミング言語を書くときに必要とされることの多い、文末のセミコロンが必要ありません。また、そもそも記載する内容が少なかったり、型を指定しなくても推測してくれたりするので、ミスやエラーが起こりにくくなっています。
・動作確認がリアルタイムでできる
プログラミング言語のなかには、完成するまで動作チェックができないものもあります。Swiftの場合、XcodeにあるPlaygroundという機能を使えば、プログラミングの途中でも、動作をチェックできます。そのため、効率よく開発を進められる点もメリットです。
・実行スピードが速い
Swiftを使ったアプリは、実行スピードが速いというメリットがあります。Objective-Cより最大2.6倍、Python2.7よりも最大8.4倍も速いスピードで完了できるというデータもあります。処理速度が速いので、ユーザビリティの観点からもおすすめできる言語です。
・不具合が起こりにくい
Swiftには、変数を空にするとエラーになったり、安全でないコードは排除するなど、不具合が起こりにくい特徴があります。そのため、安定して稼働できる点がメリットです。

=========================

▼SWIFTデメリットとは
・ISOアプリしか作れない
　Swiftが最も多く使われている場所はiPhoneやiPadのアプリです。Swiftが発表された以後　のアプリはほぼSwiftで作られていることが多い。

・コンパイルに時間がかかる
　コンパイル言語のため、コンパイルに時間がかかる。作業の待ち時間が増えるため、
　快適に開発を行いたいエンジニアにとっては不向き。

=========================

▼Swiftでできること
iOSアプリ作成
SwiftはApple社がリリースしていることもあり、iOSアプリの作成に強いです。
例えば、LinkedInやDuolingoなども、Swiftで開発されています。
また、Apple Watchなど周辺デバイスのアプリ開発もできます。


Webアプリやサービスの開発
Swiftは、Apple製品以外のWebアプリケーション開発もできます。
SCADEというクロスプラットフォームを用いることで、
Swift単体ではできなかったAndroid系アプリやWebアプリの開発も可能になりました。SCADEの一部機能は無料で使えるため、Swiftでできることは広がっています。

=========================

▼デプロイにかかる費用とその後の費用
IOSでアプリをリリースしたい場合
Apple Developer Programの登録費用　11800円(税別)

▼デプロイ後
App Storeでアプリを販売すると、売り上げの30％を手数料としてAppleに納める必要がある。“Apple税”などとやゆされることもあるが、Appleは、App Storeでのアプリの審査や運営、課金などを肩代わりする対価と位置付けている。この手数料は、App Storeがスタートした2008年に導入され、現在に至っている。当初はアプリ1本を購入して終わりという買い切り型だけしか存在しなかったが、アプリ内課金やサブスクリプションなど、12年の間に、さまざまな仕組みが導入されてきた。

　ちなみに、30％という数値はあくまで有料アプリのみ適用される。また、サブスクリプション型で継続課金している場合、2年目以降の支払いに対しては、手数料が15％になる。今回のApp Store Small Business Programが適用されると、手数料を除いた収益が100万ドル以下のデベロッパーや、新規参入したデベロッパーの手数料が、一律でこの水準まで引き下げられる。

=========================
phpsandboxのdb（sqlite）接続設定のメモ

## 概要

phpsandboxでsqliteに接続確認

## 執筆理由

phpsandboxのdb（sqlite）接続について、記事が見当たらなかったため。

## phpsandboxのsqlite接続確認

画面からも確認できるが、
`/var/www/database.sqlite`
にあるので、sqlite接続確認

```
<?php

try {
    $pdo = new PDO('sqlite:/var/www/database.sqlite');
    $msg = "MySQL への接続確認が取れました。";
}catch (PDOException $e){
    $isConnect = false;
    $msg       = "MySQL への接続に失敗しました。<br>(" . $e->getMessage() . ")";
}

?>

<html>
<head>
    <meta charset="utf-8">
    <title>Welcome to PHPSandbox</title>
</head>
<body>
<div class="h-screen bg-white flex items-center justify-center font-sans text-gray-700" style="font-family: 'Jost', sans-serif">
    <h1>MySQL接続確認</h1>
    <p><?php echo $msg; ?></p>
</div>
</body>
</html>
```

## 結果

何回か読み込みなおしたり、$msgに値を入れなおしたりすると表示するかもしれません

![sandbox接続.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1563301/6d851e75-2ff0-73bf-f19b-6932f7d967eb.png)
WidthとHeight実は取得方法が二種類ある話

# 初めに
今回は`Android`で`View`を実装する際に必須となる`Width`と`Height`に関することを記事にしていこうと思います。
### 本文
`View`を作るのに必須な`Width`と`Height`、xml上ではただ指定するだけですが、大きさが変動する時などにはコード上で取得をしたりしないといけません。
コード上で
```kotlin:get
view.width
view.heght
```
で取得をしようとした際に候補に下記のようなものが出てくると思います。
```kotlin:measured
view.measuredWidth
view.measuredHeight
```
実はこれも値を取得できます。
では何が違うのかを説明していこうと思います。
`measured`の方は`OnMeasured`時点での子Viewを測定したサイズになります。
`get`の方は`OnLayout`時、つまり描画されるタイミングで確定した子Viewのサイズになります。
そのため、`measured`と`get`には値のズレが発生することが十分にあり得ます。
`measured`を使うときは上記を理解した上で`onLayout`時にどうしても使いたい時か描画前のサイズをとりたい時のみ使うのを強くお勧めします
### 最後に
以前、`Width`で値が取れない時に`measuredWidth`で値が取れたので気になって調べたことを記事にしました。
使われる場面は限定されますし、あまり使うのをお勧めはできませんが、覚えておいて損はないと思い備忘録程度に書かせていただきました。
何かのお役に立てれば幸いです。
再コード変換(Recode)

[Teradata Vantage - Vantage Analytics Library](https://docs.teradata.com/r/Vantage-Analytics-Library-User-Guide/January-2022)[2022/9/22時点]の翻訳です。
(リリース番号 : 2.1.1 | リリース日 : January 2022)
> この記事はVantageアナリティクスライブラリ シリーズのコンテンツです。

# 概要
再コード化変換を使用して、列の値を新しいコード体系で再表現したり、データ品質の問題を修正し、特定の値に分析を集中させることができます。個々の値、NULL 値、または残りの値を、新しい値、NULL 値、または同じ値にマップすることができます。

カラムの値を置換します。

# 前提条件
・Teradata Vantageインスタンスにアクセスできること。
・Vantage アナリティクス・ライブラリがインストールされていること。

::: note info
Vantage アナリティクス・ライブラリのインストールについて、既にVantageを導入頂いているお客様はTeradataサポートサービスにお問い合わせください。
Vantage Express (評価版)やクラウドサービスのDIYでご利用頂く場合は[Teradata Dounload](https://downloads.teradata.com/download)からダウンロードし利用可能です。
Vantage アナリティクス・ライブラリのインストール手順は「[Vantageアナリティクス・ライブラリのインストール](https://qiita.com/ykswi/items/12d0da2ac69b4b161881#vantage%E3%82%A2%E3%83%8A%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)」の記事に従い行います。
:::

# データの準備
## サンプルデータの入手とデータベースへの格納方法
こちらの「[チュートリアル用のサンプルデータを用意する](https://qiita.com/tmsky/items/4d86ca35aef753290020)」を参照ください。


# 実行方法
## SQLから実行する場合の例
Segmentの"Consumer"を"A"に置き換えます。以外は"good"に置き換えます。
Stateの"Alabama"を"A","Arizona"を"B","California"を"C"に置き換えます。以外はNullに置き換えます。
Regionの"Central"を"C","West"を"W"に置き換えます。以外は変換しない。
```SQL
CALL td_analyze (
  'vartran',                          /* 分析手法　*/
  '
  database        = QID;              /* データベース名 */
  tablename       = Customer;         /* テーブル名 */
  recode =
     {recodevalues (Consumer/A Rank),                  recodeother (good), columns (Segment)}
     {recodevalues (Alabama/A,Arizona/B,California/C), recodeother (NULL), columns (State)}
     {recodevalues (Central/C,West/W),                 recodeother (SAME), columns (Region)}
  ;                                   /* 導出項目の定義 */
  '
);
```

## オプションの説明
|置換パラメータ|説明|
|:-|:-|
|リテラル値|リテラル値に置換します|
|NULL|NULLに置換します|
|SAME|変換しない|

:::note information
出力結果をテーブルに書き込む場合は以下オプションを指定可能です。
outputdatabase = 出力データベース名;
outputtablename = 出力テーブル名; 
overwrite = {true | false}; --- 未指定の場合はtrueで上書きします
:::

## 出力結果
データ量が多いため上位10件を表示しています。
|Segment|State|Region|
|:-|:-|:-|
|good||East|
|good|C|W|
|ARank|C|W|
|good||East|
|ARank||East|
|good||C|
|ARank||East|
|ARank||C|
|good||East|
|good||East|
|～|～|～|

# おわりに
:::note information
サンプルコードはSQL関数から掲載し順次Pythonコードも掲載していく予定です。
:::

:::note warn
警告
この本書は[Teradata Vantageドキュメンテーション](https://docs.teradata.com/)よりトピックに必要な情報を抜粋したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
pmconf2022で見たPM初心者の心構えのお話

# 見た講演
「PM初心者が「MyPM像」を確立するまでのストーリー」
コネヒト株式会社プロダクトマネージャー吉岡 詩織さん

# この記事について
pmconfで当日に唯一なんとか見れたやつレポート。業務中で片手間でしか聞けなかったがこれだけはまるまる聞けたので！
私はいまのところPdMやる具体的な予定はない。
しかしどんなロールでもプロジェクトを俯瞰して眺め、先を想像することは大事。
pmconfには視座を上げてみたいと思いオンライン参加。他の録画も追々見たい！

自分はデザイナーからスクラムマスターになった者だが、今回のお話を聞いて共感多々。
スクラムマスターをやって得た知見と重なることも多々。
これから私はデザイナーに戻るが、その後はPdMを目指すという方向性もありなのかもしれないと、視界が広がったお話でした。

# 以下、講演内容
子育て支援の会社コネヒト。代表的なものではmamariというアプリをリリースしている。そのプロダクトマネージャー、吉岡さんの体験談。

## PMって難しい？
やることの範囲がとても大きく、どこから手をつけたらいいかわからなかったり、なぜかすごくデキるPM像もあって、ハードル高めに思われがちな世界。
それに対し、吉岡さんがどう向き合ってきたかというお話。


ふわふわがんばる期「うわーなんだかわからないけどこれからがんばるぞ！」
↓
自信喪失期「周りに甘えちゃってるな、申し訳ないな…」この時に起こったこと

先輩の「前任者と比べる必要ないよ」「甘えることがなんで悪いと思っちゃうのかな」という言葉が転機となり、「自分らしく&今の環境にあった形で行動しよう！」と考えた。
自分の得意不得意好き嫌いは、組織、事業との相性がある。そこに照らし合わせてアプローチを始めた。

### 3つのことをやった
- ユーザーインタビュー芸人
- ワークショップ芸人
- 可視化芸人

になってみた

#### ユーザーインタビュー芸人
得意＆好きなことだった。インタビュー頻度高めたり、離脱ユーザーへのインタビュー開始、社内のママさんとランチなどやってみた。
インタビュー設計などはデザイナーさんと共同作業！←大事！

#### ワークショップ芸人
コミュ力と巻き込み力が得意！それを生かす。
メンバーの意見を吸い上げられることを意識。さまざまなワークショップを行った

#### 可視化芸人
絵にしたり構造化することが得意だけど、開発力がないので、認識齟齬が起こる可能性が高かった。
先輩から言われて、さまざまな会議体の可視化を行うようになった。miro芸人！

## MyPM像を確立してみよう
愛され型PM！とにかく行動と発信で、応援してもらえるようにした！チームの意見を吸い上げて議論のしやすさを上げた！
ほんとは愛されと言うのは恥ずかしいが、先輩に言われてから、言語化するのはいいことということで積極的にいうようにした。

MyPM像つくるといいこと
- 誰かと比較するのではなく、私の場合は？と自分スタイルで物事を進めやすくなる。
- 反対に、弱みも見えてくる。
- 不足しているところを人と補い合えるようになる。

### 今までの話を抽象化
PMのスキルマップを吉岡流で可視化
- 根底にプロダクトの成功を願うマインド(そもそも最初に必要レベル)領域
- 次に知識と技術の領域
- そして熟練者との差が出やすい意思決定・推進力・課題定義の領域(高い要素)

PMはとくに最後の「意思決定、推進力、課題定義」で評価される
これに対し、自分のキャラクター(PM自身が最もパフォーマンスを発揮できるあり方)が相互作用を起こす。
どの領域から得意にしていけるかは少しずつ行動でつけていく。

自分の得意不得意好き嫌い：組織、事業との相性を自覚できたこと＆周りからのフィードバックによって進歩ができる。
またフィードバックは自己開示が大事。対話の機会とポエム発信でやっていった。
その上でアクションを起こしていくとよかった。


## PM初心者としての心得
ユーザー理解と開発理解の両輪を得たことで、信頼と成果を得た。

### PMのベースは信頼
信頼してくれるメンバーがいるから、良いプロダクトを創れる。
行動していこう

### 目標へのコミットは大事だけど、目標数字を達成するだけが「成果」じゃない
仮説を持って行動し、何か学びを得ることができればそれは成果だ
仮説と結果を出すだけでなく、それをみんなに共有しよう

# まとめ
PM初心者は:
- 自分がなりたいPM像を描いてみる！
- 自分の得意不得意好き嫌い、組織、事業の特性を照らし合わせてみる
- 行動し続ける
- 積極的に自己開示!
- PMは信頼がベース。行動と、学びも含む成果で語っていこう！

PM育成者は:
- 初心者さんのキャラクターをキャッチーに言語化してあげる
- 上長だけでなくたくさんの人に対し発信させて、積極的に自己開示を癖づけさせる
- 数字的成果だけでなく、学びも評価してあげる

と、モチベーション高く初心者も動いてくれるかも！
Stripe SDKがどんなAPIリクエストを送信するかをデバッグする２つの方法


StripeのAPI組み込みでは、「システムが、正しくStripe APIにデータを送れているか」を確認したいケースがあります。

例えば、「組み込みテスト時に意図したサブスクリプションや決済処理が実施されていない場合」や「複雑な条件でAPIリクエストを組み立てる場合の、ローカル動作確認を事前に行いたい場合」など、主にローカル開発やデバッグを目的とします。

この記事では、APIリクエストの中身（Body）をローカルやStripeダッシュボードで確認する方法を２つ紹介します。

## 方法1: ダッシュボードの開発者向け機能で、API呼び出しログをチェックする

もっとも簡単な方法は、ダッシュボードを利用して実際に呼び出されたAPIのログを確認することです。

ダッシュボードでは、[開発者]タブの[ログ]から、API呼び出しのログが確認できます。

![スクリーンショット 2022-10-25 15.56.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/9e3b7fb9-dbf4-3691-9fa3-2167c01fb748.png)

APIのパスや呼び出し結果（成功・失敗など）、Connectの親アカウントか子アカウントかなどでフィルタリングできます。

![スクリーンショット 2022-10-25 15.56.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/4ec7d40d-7e5a-f273-35b0-4529576a55a3.png)

ログの詳細画面では、「リクエストの本文（Body）」や「レスポンス」、「クエリパラメータ」・「呼び出し元のSDK・APIバージョン」などが確認できます。

![スクリーンショット 2022-10-25 15.57.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/1e0f49c7-6692-5321-315c-42a9a39ebd29.png)
## 方法2: SDKのAPI呼び出し先を変更する

もう１つの方法では、APIの呼び出し先を変更します。

「Webhookで連携しているシステムを動かしたくない場合」や「GitHub ActionsやCircle CIなどの自動テストで、API呼び出しを抑止したい場合」などに利用できます。

Node.jsの場合、Stripeクラスの初期化時に、Stripe APIの代わりに呼び出したいAPI情報を設定します。

```js
const stripe = Stripe('sk_test_...', {
      apiVersion: '2022-08-01',
      host: 'localhost',
      port: 3000,
      protocol: 'http'
});
```

https://github.com/stripe/stripe-node#initialize-with-config-object

例えば、NestJSで以下のように`GET /v1/customers/:id` APIのダミーを用意しましょう。

```ts
import { Controller, Get } from '@nestjs/common';

@Controller()
export class AppController {

  @Get('/v1/customers1/:id')
  getCustomers() {
    return {
      message: "ok"
    }
  }
}
```

このAPIを`localhost:3000`で起動している場合、Jestで次のようなテストを通すことができます。

```ts
    const stripe = new Stripe('sk_test_xxx', {
      apiVersion: '2022-08-01',
      host: 'localhost',
      port: 3000,
      protocol: 'http'
    })
    const customers = await stripe.customers.retrieve('cus_123')
    expect(customers).toEqual({
      message: 'ok'
    })
```

以下のような、Catch ALLパスを用意することで、APIリクエスト内容のデバッグも可能です。

```ts
import { All, Body, Controller } from '@nestjs/common';

@Controller()
export class AppController {
  @All('/v1/*')
  catchAll( @Body() body: any) {
    console.log(body)
    return {
      message: "ok"
    }
  }
}

```

## 結合テストでは、Jestのモックやspyも活用しよう

今回の記事では、リクエスト内容を確認することを目的とした方法を紹介しました。

さらに一歩踏み込むと、Jestなどのテストツールを使って「意図したリクエストパラメータが送られているか」をテストすることも可能です。

こちらについては、サンプルコードの準備ができ次第、別途紹介したいと思います。

## [PR] Stripe開発者向け情報をQiitaにて配信中！

- [Stripe Updates]：開発者向けStripeアップデート紹介・解説
- ユースケース別のStripe製品や実装サンプルの紹介
- Stripeと外部サービス・OSSとの連携方法やTipsの紹介
- 初心者向けのチュートリアル(予定)

など、Stripeを利用してオンラインビジネスを始める方法について週に２〜３本ペースで更新中です。

-> [Stripe Organizationsをフォローして最新情報をQiitaで受け取る](https://qiita.com/organizations/stripe)
bigqueryの実行上限を設定！



## 概要
bigqueryの実行クエリについて上限設定する方法を調査

## 対応方法

設定方法は２つ存在するので対象ページに遷移してプロジェクト単位とユーザー単位で上限を設定

①プロジェクト全体での実行バイト数の上限設定

②個々のUserレベルでの実行設定が可能

#### 設定方法

* 設定ページ

アクセス方法：Bigqueryページのメニューバー > IAMと管理 > 割当


##### 手順

1.割当設定画面よりサービス：Bigqueryを選択 > 2.割当編集を選択 > 3.上限を設定

割当設定画面よりサービス：Bigqueryを選択

![スクリーンショット 2022-11-03 22.23.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180499/3cbec2db-01bb-1a25-541f-d2911378c8eb.png)


割当編集を選択 > 上限を設定



## 参照ドキュメント

[設定方法](https://qiita.com/laha/items/fb9acb5794a14f9c2d89)

[GCP公式ドキュメント:カスタム管理作成](https://cloud.google.com/bigquery/docs/custom-quotas)