OmniAICreator/Qiita-1.07M huggingface dataset:
【備忘録】現場でWebhookを送信することがありました。〜HTTPリクエストにJSONを乗せてPOSTする方法〜

# 挨拶
初めての投稿になります。

初回は現場でJavaをつかってWebhookを叩くことがありましたので、備忘録として残します。

題名にある通りHTTPリクエストにJSONを乗せてPOSTする方法を共有します。


初心者の私には一見難しそうに思いましたが、書いてみると単純にHEADERとBODYに要素をつめてWebhookをHTTPリクエストのPOSTで流してあげるだけになります。
(こんな認識ですが。。。間違ってたらご指摘ください:bow_tone3:)

私と同じく開発ビギナーの方のご参考になれば幸いです！


# 前提・準備
・JavaでHTTPリクエストを用いて**JSON**をPOSTで送信します。
・実行したいWebhookのURLを準備します。
・BODYに詰めるJSONコードを用意します。（jsonファイルは作成せずにString型で作成して直接渡します）
・事前に同じファイルにHTTPクライアントを生成するメソッドを作成しています。

まずは実行したいWebhookのurlとJsonコードを用意します。（後述のコードに引数として使います）
```java
String webhookUrl = ""; //WebhookのURLを文字列の変数に代入
String json = "";   //JSONコードを文字列の変数に代入
```
これでAPIをリクエストするのに必要な要素は準備できました。

あとはHEADERの"Content-type"に"application/json"を設定して
BODYにJSONをつめてAPIのURLにPOSTリクエストするだけです。

その前にHTTPクライアントを生成しましょう。


### HTTPクライアントを生成
```java:SendHttpPost.java
    public static DefaultHttpClient createHttpClient() {
        DefaultHttpClient httpClient = new DefaultHttpClient();{
        HttpParams httpParams = httpClient.getparams();

        //タイムアウトの時間を設定(10秒)     
        HttpConnectionParams.setConnectionTimeout(httpParams, 10000);
        HttpConnectionParams.setSoTimeout(httpParams, 10000);

        ProxySelectorRoutePlanner proxySelectorRoutePlanner = 
            new ProxySelectorRoutePlanne(httpClient.getConnectionManager().getSchemeRegistry(), ProxySelector.getDefault());

        httpClient.setRoutePlanner(proxySelectorRoutePlanner);

        return httpClient;
    }
```

これで準備は完璧です。
あとはHTTPリクエストを送信しましょう。



# HTTPリクエスト 
### JSONをPOSTで送信

```java:SendHttpPost.java
  public static void postJson(String apiUrl, String json) {
    DefaultHttpClient httpClient = createHttpClient();

    try {
        //WebhookのURLを引数に渡します
        HttpPost httpPost = new HttpPost(webhookUrl);

        //HEADERのNAMEに”Content-Type”, VALUEに”application/json”を設定します
        //BODYにString型のJSONを設定します
        httpPost.setHeader("Content-Type", "application/json");
        StringEntity entity = new StringEntity(jsonCode, "UTF-8");
		httpPost.setEntity(entity);
        
        HttpResponse httpResponse = httpClient.excute(httpPost);
      
        HttpEntity httpResponseEntity = httpResponse.getEntity();
        EntityUtils.consumeQuietly(httpResponseEntity);
        
    } catch {
        throw new RutimeException("callPostJson failed", e)
    } finally {
        httpClient.getConnectionManager().shutdown();
    }
  }
```

コメントにも書いていますが
HttpPostのインスタンスをWebhookを引数に入れて作成し
setHeader()でHEADERを
setEntity()でStringEntity型のJSONをBODY設定しています。

あとは作成したHttpClientのメソッドを使ってhttpPostをリクエストしています。



# まとめ
意外と簡単だった印象のWebhook送信。
Httpリクエストのベースさせ押さえておけば工夫しだいでいろんなものを送信できそうな予感。。。
調べてみるといろんな面白いWebhookやAPIが出てきそうなので、いつかまとめて共有できたらなと思います。

みんな大好きポケモンのAPIもあるらしい。。。

ポケモン図鑑でも作ってみようかな
【Alteryx】Excel読み込み時に指数表記になる値を実数にする

# はじめに
桁数の多いExcel指数表記値を実数にする方法をご紹介します。

# 結果
piyo列の6行目が指数値から実数値に変わっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752246/52590ba0-a49b-f2a6-231b-e957922209f3.png)
対応するexcel内の値は赤文字セルです。
同じ値になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752246/faf02333-68ac-ee9c-8ad9-73c21dd1ab84.png)


# 処理内容
フロー図は下記です。
赤枠部分について、詳細に説明していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752246/b0c15aa2-e79e-9f83-ba1c-a7e10591733d.png)

# 処理内容詳細
inputは下記Excel表です。
・A1セルからデータが始まっていない
・値はExcel表示形式で%になっている実数値
というデータになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752246/525e24e3-8273-bcb5-fb30-2f95ef3899ab.png)
上記データをinputツールで読み不要列・行を削除してデータを見ると、
piyo列6行目、9行目が指数表記になっていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752246/b853b942-cf4e-32f6-f02c-cd13a1015428.png)

input形式をcsv等へ変更できれば良いのですが、諸事情で形式が変更できないため、
フロー図赤枠内で、if文とPadRight関数、REGEX_Replace関数を用いて実数にしました。
```R
 if Contains([piyo],"E") then
  ToNumber(REGEX_Replace([piyo],"[E][-](\d+)","")) / 
  ToNumber(PadRight([分母],ToNumber(REGEX_Replace([piyo], "(.+[E][-])(\d+)","$2"))+1,"0"))
 else ToNumber([piyo])
 endif
```
処理内容としては、
　① 指数表記か否かをContain関数で判定
　② REGEX_Replace関数で指数部分を消した値を作る
　③ 小数点を動かす桁数をREGEX_Replace関数で取得
　④ PadRight関数と③で小数点を動かす桁数分の分母を作る
　④ ②÷④を計算、数値にする　となります。

[参考URL](https://community.alteryx.com/t5/Alteryx-Designer-Discussions/E-notation/td-p/9740)によると、
指数は```E```以降の符号と数値により、小数点の位置を動かすと元の実数値が作れるとのことでしたので
無理やり小数点の位置を動かしました。
今回は```E```以降が負の値のみだったため、小数点を左へ動かす除算処理のみ組み込んでおります。
正の値の場合は乗算ください。

# 終わりに
パワープレーですが、inputを変更できない場合は参考になれば幸いです。
【VSCode】ローカルブランチを保護する方法

## はじめに

VSCodeのソース管理からコミットする場合にローカルブランチを保護する方法について記載します。  
具体的にはソース管理から保護ブランチへコミットする場合に以下のメッセージが表示されるように設定します。  

![2720C7C3-C903-45FC-ABDA-3DD65D3F7AAF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/c3a8bf6c-a3ed-de31-5480-916deaad65b2.png)


設定は非常に容易ですがVSCodeのソース管理以外からのコミットに対しては機能しません。  
他の状況にも対応するにはGit Hooksを使用するなど他の方法を採る必要があります。  

## 設定方法

VSCodeのユーザー設定画面を開きます。  

`git.branchProtection`を検索します。  

![76F7E4A0-EC37-47D9-841F-E10F50965AEB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/4fe7a0b0-39c8-d9c4-aa5e-6b713bec21e9.png)

項目の追加をクリックして保護したいブランチ名を入力します。  

![05B65771-3937-4A9C-9048-E268DBA6986C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/780aae82-6742-9e46-6e17-529a52b77d97.png)

これで設定は完了です。  

なおワークスペースにのみ設定を適用したい場合には設定画面のワークスペースを選択して
上記の手順を行います。  

![2B7056C5-3648-40E0-910E-7EC7BBE77533のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/17ce246c-059a-2164-7ef2-b7d3cd3fb510.png)

## 動作確認

VSCodeのソース管理から先ほど追加したブランチへ直接コミットしようとすると以下のように
表示されます。

![2720C7C3-C903-45FC-ABDA-3DD65D3F7AAF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/c3a8bf6c-a3ed-de31-5480-916deaad65b2.png)
Custom Field Suiteのセレクト(ドロップダウンリスト)で

WordPressのCustom Field Suiteのセレクト(ドロップダウンリスト)で，選択不可項目を作りたい。

47都道府県のドロップダウンリストを作りたかったが，
Custom Field Suiteには，
選択不可項目... 
HTMLで言う

![スクリーンショット 2022-10-18 19.32.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869250/4b09abab-88c4-c71d-7224-7fc50c5c8a71.png)

```haml
<select name="hoge">
  <option hidden>選択してください</option> ←コイツ
  <option value="1">1</option>
  <option value="2">2</option>
  <option value="3">3</option>
</select>

```

調べた限りでは専用の設定がないため擬似的に作る。

## WordPressダッシュボードから設定
WordPressダッシュボードの設定→Custom Field Suite→新規作成

![スクリーンショット 2022-10-18 19.36.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869250/e3ae3240-52cb-6a39-963b-8ac4bbd46179.png)

こんな感じで一番上に擬似選択不可項目を入れておく

コード側では，

```php
<?php $values = CFS()->get('m_area'); ?>
<?php foreach ($values as $value => $label) : ?>

	<?php if (!empty($value) && $value != "選択してください") : ?>
	<p>都道府県：<?php echo $value; ?></p>
	<?php endif; ?>

<?php endforeach; ?>
```

こんな感じで，if文で値が空もしくは擬似選択不可項目が選択されている場合は表示しないようにする


ちょっぴり悩んだので備忘録
自作したVBAをアドインにして使う方法

エクセルで作成した自作のマクロ、マクロを作成したブックだけで使用したりしていませんか？
じつは。ブック関係なく、自分のPC上（アカウント）でどのブックでも使えるようにすることができるのです。
しかも、マクロファイルにしなくてもマクロを使えるのです。
その方法についてまとめます。

### この記事でできること

自分のPC上で動作するExcelに自作のツールを追加する
試しにセルのカーソルの位置をホームポジション（最初のシートのA1）にして保存するマクロをアドインとして使えるようにする

# エクセルでアドインの設定をする

まずは自分の作ったVBAをアドインで使えるように設定します。
（開発タブの表示方法は略します）

実験用に簡単なコードをVBE上に書きます。
メッセージボックスで「こんにちは」と表示するだけのコードです。

    Sub オリジナルアドイン()
         MsgBox "こんにちは"
    End Sub


![adin.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2433770/4275a8fd-953b-dc65-810b-5523078428b4.jpeg)

次に、これをアドインのファイル形式で保存します。
エクセルの画面に戻り、「名前を付けて保存」してください。

![adin2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2433770/e8eac869-5eb3-09c6-994d-e5b26de05e04.jpeg)

このとき、ファイルの拡張子を「Excelアドイン（*.xlam）」に変更するのを忘れないでください。
また、アドイン形式で保存すると、隠しファイルに保存されますので、配布等する場合のために保存先をメモしておいてください。

ファイル＞オプションの順に選択し、オプション画面で「アドイン」を選択すると、先ほど作成したアドインが表示されます。確認したら右下の「OK」ボタンを押下してください。

![adin3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2433770/faad31ca-148a-d16f-4334-9a4b0a713831.jpeg)

確認できたら、

ホーム＞オプション＞リボンのユーザー設定

で、先ほど作ったマクロをリボンに追加してください。
プルダウンで「マクロ」を選ぶと、作成したプログラムが表示されます。
せっかくなので、自分用にタブ追加してそこにマクロを設定します。

![adin4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2433770/421890c6-6675-2738-08ea-8c154d9e59b2.jpeg)

タブの下のグループを選択して「追加（A）」を押下すると、グループの下に自作マクロを追加できます。

「名前の変更」でマクロの表示名やアイコンを変更できるので適宜カスタマイズしてください。

![adin5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2433770/80789b0c-70d4-cd72-1494-428b76f1e131.jpeg)
こんなかんじ。

右下の「OK」ボタン押下後、画面にもどって試してみましょう。

![adin6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2433770/ad1d0a01-3e74-a1b5-598a-98d5ae086f8d.jpeg)

簡単でしたね。

では続けて実用性のありそうな、ホームポジションにもどしつつセーブするマクロを書いてみます。

![adin7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2433770/733cf45b-65ca-05d7-96cc-c7717ff2d251.jpeg)


    Sub ホームポジションに戻して保存()
        Worksheets(1).Activate
        Range("A1").Select
        ActiveWorkbook.Save
    End Sub

同じようにリボンに追加すると使えるようになります。

### 上手く動作しないとき

ボタンを押したのにエラーして想定の動作をしないときがあります。
アドインとして保存する前のエクセルファイルを読み込む設定が残ってしまって、意図したアドインファイルを読み込まない場合があるのです。

そのときは、いったんExcelをとじ、アドインの設定からやり直してみてください。
![adin3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2433770/ae74a3ec-56ce-44e6-809a-38d44556e4d2.jpeg)

ホーム＞オプション＞アドイン
から、画面下部「管理（A）」の並びの「設定（G）」押下。

![adin8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2433770/0b6bfe6a-e4b8-a7f6-0aaf-c4bd81e6e90b.jpeg)
作成したアドインにチェックをつけ、「OK」押下。

その後リボンの設定をし直してみてください。
一度動作すれば、あとはプログラムを作成し、リボンに設定してくだけで使用できます。

作成したアドインは配布も可能です。
エクセルを閉じてもうまくいかない場合は、PC再起動でうまくいくこともあるので試してみてください。
SPOリストの複数選択可能な選択肢列の値IDの取得方法

複数選択可能な選択肢列の、```0:hoge、1:fuga、2:foo```の「0,1,2」の値はクラウドフローの動的なコンテンツで取得できないため、式を記述して取得可能か試しました。

試すときは手動ボタントリガーのクラウドフローを作成して、対象の選択肢列をもつリストをSPOコネクタの「項目の取得」アクションを追加し、適当なアイテムIDを入力してテスト実行すると実行履歴から出力のJSONを取得できます。

```「項目の取得」アクション
{
  "@odata.etag": "\"57\"",
  "ItemInternalId": "28",
  "ID": 28,
        ・
        ・
        ・
  "選択肢列名": [
    {
      "@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference",
      "Id": 0,  //動的なアクションでは取得できない
      "Value": "hoge"
    },
    {
      "@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference",
      "Id": 1,　//動的なアクションでは取得できない
      "Value": "fuga"
    },
    {
      "@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference",
      "Id": 2,　//動的なアクションでは取得できない
      "Value": "hoo"
    }
  ],
  "選択肢列名@odata.type": "#Collection(Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference)",
  "選択肢列名#Id": [
    0,
    1,
    2
  ],　//動的なアクションでは取得できない
  "選択肢列名#Id@odata.type": "#Collection(Int64)",
    ・
    ・
    ・
```

こんな感じで、配列のJSONの後ろに
```
  "選択肢列名#Id": [
    0,
    1,
    2
  ],
```
というのがあります。これを使います。式にすると
```
outputs('項目の取得')?['body/選択肢列名#Id']
```
となります。

ひとつひとつ指定したい場合は
```
outputs('項目の取得')?['body/選択肢列名#Id']?[0]
outputs('項目の取得')?['body/選択肢列名#Id']?[1]
outputs('項目の取得')?['body/選択肢列名#Id']?[2]
```
となります。

#### 参考

https://speakerdeck.com/miyakemito/power-automatedepei-lie-woxi-u?slide=20


https://mofumofupower.hatenablog.com/entry/2020/03/26/220403
paizaラーニング Bランクレベルアップメニュー アルファベット探し Java 解答

# STEP: 47 文字列の出力

## 問題

https://paiza.jp/works/mondai/prob60/alphabets_large_or_small_0

## 解答

```java:step47.java

import java.util.*;


public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextLine()){
            String line = sc.nextLine();
            System.out.println(line);
        }
        sc.close();
    }
}

```

## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918186/686308d7-511a-32ae-0848-09ded2bb2afc.png)

 
# STEP: 48 アルファベットの範囲の文字の出力

## 問題

https://paiza.jp/works/mondai/prob60/alphabets_large_or_small_1

## 解答

```java:step48.java

import java.util.*;


public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        displayLeadingAndTrailingCapitalLetters(line);
        sc.close();
    }
    
    /**
     * 先頭から後尾の大文字を表示する関数
     * 
     * @param 変換したい文字列
     */
    public static void displayLeadingAndTrailingCapitalLetters(String line){

        // 先頭の文字を16進数で取得
        int lead = line.codePointAt(0);
        // 後尾の文字を16進数で取得
        int mating = line.codePointAt(line.length()-1);
 
        for(int i = lead; i <= mating; i++){
            // 文字に変換
            System.out.println(Character.toChars(i));
        }
        
    }
}


```

## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918186/c4feaa4a-d483-8267-5eca-1b9307a30221.png)




# STEP: 49 アルファベットの順番

## 問題

https://paiza.jp/works/mondai/prob60/alphabets_large_or_small_2


## 解答

```java:step49.java
import java.util.*;


public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        determineNaturalOrder(line);
    }
    
    /**
     * 自然順か判定する関数
     * 
     * @param 判定用の文字列
     * */
    public static void determineNaturalOrder(String line){
        int lead = line.codePointAt(0);
        int mating = line.codePointAt(line.length() - 1);
        if(lead < mating){
             System.out.println("true");
        } else {
             System.out.println("false");
        }
    }
}

```

## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918186/edd97bd4-53dd-7ccc-4dc0-df1a70dec837.png)


# FINAL問題 アルファベット探し

## 問題
https://paiza.jp/works/mondai/prob60/alphabets_large_or_small_9

## 解答

```java:final.java
import java.util.*;


public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int x = sc.nextLine().codePointAt(0);
        int y = sc.nextLine().codePointAt(0);
        int c = sc.nextLine().codePointAt(0);
        
        if(x <= c && y >= c && x <= y){
            System.out.println("true"); 
        } else if (x < y) {
            System.out.println("false"); 
        } else {
            System.out.println("false");
        }
       
        sc.close();
    }
}

```

## 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918186/53e7ca2e-e073-de09-ff97-78c0e37399ea.png)
【Terraform】Terraformで別のリソースを参照する方法

# はじめに
udemyを使ってTerraformの勉強をしたので、Terraformで別のリソースを参照する方法についての学習備忘録です。

https://www.udemy.com/course/iac-with-terraform/


# Terraformで別のリソース参照する方法
* "."で連結して参照する
* resourceブロックの場合、省略できる

```terraform
<BLOCK_TYPE>.<LABEL_1>.<LABEL_2>
```

```terraform
#　例
resource "aws_vpc" "vpc" {
  cidr_block = "192.168.0.0/24"
}

resource "aws_subnet" "public_subnet_1a" {
  vpc_id = aws_vpc.vpc.id # リソース参照している
  
}
```

各リソースでどのような情報が引き出せるかは、[公式ドキュメント](https://registry.terraform.io/providers/hashicorp/aws/latest/docs)を参照します

https://registry.terraform.io/providers/hashicorp/aws/latest/docs
stablediffusionguiを使ってみた

自分ようのメモを残しておきます。

AIで画像を自動生成
自動ダウンロードしてみよう

https://nmkd.itch.io/t2i-gui


7zファイルをダウンロードされるので、解凍する

https://github.com/harubaru/waifu-diffusion/tree/main/docs/en/weights/danbooru-7-09-2022

からwd-v1-2-full-ema.ckpt をダウンロード


ダウンロードした wd-v1-2-full-ema.ckpt を stable-diffusion-webui\models\Stable-diffusion に置きます。

参考

https://digitallife.tokyo/archives/2022/10/waifu-diffusion-stable-diffusion-web-ui-automatic1111.html

novel ai もダウンロードできる？

https://github.com/AUTOMATIC1111/stable-diffusion-webui/discussions/2017

プロンプト一覧

https://iosworld.blog.2nt.com/blog-entry-528.html

nsfw,{{{{souryuu_asuka_langley}}}},bukkake,facial,squatting,peace sign,empty eyes,magnificent,small breasts,{{ahegao}},puffy nipple, blue eyes

詠唱呪文

https://seesaawiki.jp/nai_ch/d/%b1%d3%be%a7%c1%b4%ca%b8




nude , nsfw,{{{{souryuu_asuka_langley}}}},bukkake,facial,squatting,peace sign,empty eyes,magnificent,small breasts,{{ahegao}},puffy nipple, blue eyes


露出
nsfw, masterpiece, highly detailed, {{{outdoors, In front of the school gate}}, nude, 4girls, looking at viewer, standing, kneeling, {{small breasts}}, medium breasts, {large breasts}, {long hair}, [[blond hair]], bob cut, [[red hair]], [black hair], [[blue hair]], [[[twintails]]], {slender}, red ribbon choker, smile, [[open mouth]], {{white socks, black socks}}, thighhighs, shiny skin, happy, smile, [[[[sweatdrop]]]], shiny hair, loafers, [[[grin]]]


モデル一覧
https://note.com/npaka/n/ned44e0242ac0


裸の画像を生成できるai
https://pornpen.ai/


img2img がすごいみたい
https://ch.dlsite.com/matome/211422
RDSパラメータグループ(utf8)を設定しても日本語が文字化けする

# はじめに

Postmanを利用してLambda(Go)のAPIを試しているときに、日本語を送信するとエラーが発生するという問題が起きました
MySQLを使う際によく起きる現象なので記事を参考に修正をしましたが、どうもうまくいきませんでしたのでまとめます

# 問題

https://bamboo-note.tokyo/AWS/aws-rds-mysql-cannot-japanese/

この記事を参考に設定を行い、DBの更新を行ったがなぜか日本語が文字化けしてしまいます
テーブルを削除して作成しなおしたのですが、それでも日本語が文字化けしました

# 解決方法

テーブル削除でなくデータベース自体を削除する必要があありました

```
 select * from INFORMATION_SCHEMA.SCHEMATA;
```

これで文字形式をみたところ利用しているデータベースが`latin1`になっていて、`utf8`になっていないことから気づきます

RDSを変更したらDBを一回削除してから再度作成しないと変更が適応されませんでした

https://qiita.com/yKanazawa/items/d01bc5a5aae55db3b484

# おわりに

パラメータグループの更新するとRDSの起動までかなり時間かかるので大変でした

# 参考

https://bamboo-note.tokyo/AWS/aws-rds-mysql-cannot-japanese/

https://qiita.com/yKanazawa/items/d01bc5a5aae55db3b484
Danger でコードレビューの機械的な指摘を自動化する話

# はじめに

コードレビューで機械的な指摘をすることがあります。

- MR には Issue 番号を書いてください
- MR にこのラベルを付けてください
- 変更ファイル数が大きすぎます

---

# こんな不毛な指摘は機械化しましょう！

---

# Danger

Github の説明から引用

> Stop saying "you forgot to …" in code review

つまり、簡単な指摘はDangerに任せよう！

https://github.com/danger/danger

---

# まずはミニマムな構成を作ります

---

# ディレクトリ構成

```
.
├── .gitlab-ci.yml
├── Dangerfile
└── Gemfile
```

---

# Gemfile

```Gemfile:Gemfile
source "https://rubygems.org"

gem 'danger-gitlab'
```

---

# .gitlab-ci.yml

```yml:.gitlab-ci.yml
danger_review:
  image: ruby:3.0.2
  before_script:
    - bundle install
  script:
    - bundle exec danger
```

---

# Dangerfile

```ruby:Dangerfile
message("Hello, this worked")
```

---

# マージリクエストを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/1c9f0780-bd1b-003e-ea8f-622405e02899.png)

--- 

# 実用的な例を見てみる

---

# マージリクエストの説明に Issue 番号が無いと警告を出す

```ruby: Dangerfile
if !gitlab.mr_body.match(/#[0-9]+/)
  warn('MRの説明にIssue番号が含まれていません！')
end
```

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/a029b8ff-3e79-2b46-d2eb-8f61d0350b88.png)

---

# 変更ファイル数が多い時に警告を出す

```ruby:Dangerfile
if gitlab.mr_json['changes_count'].to_i > 1
  fail('変更ファイル数が多すぎます！')
end
```

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/257a3192-af86-3598-23ed-1bce879ebf9e.png)

---

# 人間は人間にしか出来ないことをしよう！
意思表示の量とリターンの期待値でコミュニケーションスタイルを分類してみる

会社内における、意思表示を伴う発言量とそれに対するリターンの期待値が人それぞれだなぁと思うことがあります。他の職種に比べコミュニケーションが少なくてもどうにかなるケースが多いとか、そういう背景はありそうです。

なんとなく分類の軸を思いついたので分けてみます。


# スタイル
## 0言ってn聞いてもらう
無口な人。不満とかあった場合にどうやって消化しているのか気になる。

## 1言って1聞いてもらう
基本形。伝達ロス0が前提なので、ちゃんと伝える必要性あり。大企業とかで求められるイメージ

## 1言って10聞いてもらう
言った側からすると「言ったのに!」と思うし、言われた側からすると「言われてないし!」となりそうなパターン。悪意があるわけではないので余計ややこしかったりする。期待値がずれやすい。

## 100言って10聞いてもらう
言ったことすべて理解してもらえると思っていないので、とりあえず言うけどあまり期待しないパターン。

自分はこのパターンで、一応言い方を気をつけたり1on1で事前にそういうスタンスであることを伝えているつもり。実際のところ周りにどう思われているかは分からない。

言われる側の人を選びそう。信用できる上司じゃないと難しいかも。

# その他
- ただのポエムです(大事)
- 企業文化で求められるスタイルは変わりそう
- Slackなどは`100言って10聞いてもらう`が相性が良い気がする。`1言って1聞いてもらう`は一回一回のコストが高そう
- 自分がどういうスタイルであるか自覚した上で、それを知ってもらうのが平和への第一歩
- `期待値`に関しては、[エンジニアのためのマネジメントキャリアパス](https://www.amazon.co.jp/dp/4873118484)という本を読むと理解が進みます
    - 別に自分はマネジメントするような人ではないです。


# 参考リンク
https://www.amazon.co.jp/dp/4873118484
AWS、デフォルトサブネットについて

# デフォルトサブネットとは
**デフォルトVPCのサブネット**
という意味です。
[AWS公式Doc > Default VPCs > Default VPC components](https://docs.aws.amazon.com/vpc/latest/userguide/default-vpc.html#default-vpc-components)

厳密に言うとデフォルトVPCにデフォルトで設定されているサブネットです。

### デフォルトのデフォルト（デフォルトサブネットのデフォルト設定）
デフォルトサブネットはデフォルトでパブリックです。
[AWS公式Doc > Default VPCs > default subnet](https://docs.aws.amazon.com/vpc/latest/userguide/default-vpc.html#default-subnet)

### 混同したところ
どのVPCが作成されたときにも自動でサブネットが作成されるわけではありません。ノンデフォルトVPCにはデフォルトでサブネットは存在せず、自分で作成する必要があります。ちなみにこれはプライベートサブネットです。ルートにインターネットゲートウェイを追加することでパブリックサブネットとなります。

要はAWSはアカウント作成時、各AZにVPCとそのサブネットをインターネットゲートウェイを付加した状態で生成するということ。

|name  |デフォルトで作成される  |Private/Public  |
|---|---|---|
|デフォルトVPC  |Yes  |/  |
|デフォルトサブネット  |Yes  |Public  |
|ノンデフォルトVPCのサブネット  |No  |Private  |
【Python】妻に真夜中のダンスレッスン予約を強要されたので、Webスクレイピングで回避を試みようとしている話 （５．Excelで会員・予約情報の管理を考える）

前回は、<a href="https://qiita.com/sibulabo/items/f951f8e2dfa713cccbdc">「４．処理フロー」</a>について発信しました。
今回は、会員・予約情報を管理する Excelファイルのレイアウトについて考えます。

## 必要項目
実際に予約サイトを操作しながら、必要そうな項目を洗い出しました。
> - ユーザー名
> - パスワード
> - 予約日付
> - レッスン開始時間
> - レッスン名
> - 予約優先位置

処理結果を記録する項目も必要ですね。
> - 予約できた位置
> - 処理メッセージ
> - 記録日時


それをもとに表を作成しました。（会員・予約管理用ファイル：reserveLessonList.xlsx）
![WS000004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2915699/22c54127-8dbc-6f25-496e-f2ed7b76b604.jpeg)
予約プログラムは、この情報を１行ずつ読み込んで処理を行い、処理結果を記録するようにします。

# 予約一覧シートの「優先位置」項目について
以下はレッスンごとの生徒の配置例になります。配置はレッスンごとに、「初級は人数多めのマス目状」、「中級は人数少なめのピラミッド型」といった具合に異なります。
![WS000003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2915699/3c05fee6-91d5-a481-2c6b-119ab3ced5b7.jpeg)
なので、レッスンごとに人気のある場所が変わってきます。妻の言う「良い場所」とは、**先生に近く、且つ前面の鏡に自分の全身が映る場所**だそうです。:flushed:　初級では、「９＞１０＞８＞１１＞３＞４」。中級は「２＞１＞３＞５＞６」）の優先順になるようです。
![WS000004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2915699/03d1c4a0-b632-5046-fcba-54e56049d884.jpeg)
個人的には、そんなのどこでもいいやん。と思っている今日このごろです。:relieved:

とういうことで、この優先順位をどこかに保持しておいて、レッスンごとに割り当ててやる必要があります。優先位置シートを作成し、行ごとに優先順位名と優先位置をプライオリティ順に定義するようにします。
![WS000007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2915699/a5a07ddf-3f61-e8dd-bbc4-218b286a7dcd.jpeg)

そして、予約一覧シートの「優先位置」には、ここで定義した「優先順位名」をレッスンごと（行ごと）に定義できるようにします。
![WS000008.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2915699/d1e2aa17-e45e-c1f4-50ee-47154b6404ee.jpeg)

なんだか、この部分の処理が面倒くさそうです。:flushed:
やる気が 10ポイント減少しました。:grimacing:

## ファイル構成
フォルダのファイル構成は以下のようになります。
カレントに **reserveLessonList.xlsx** を追加しました。
```
C:\reserveList
│  chromedriver.exe
│  reserveLessonList.xlsx
└─env
```

> 今回は、会員・予約情報を管理する Excelファイルの構成について考えてみました。
> 次回から実際にプログラミングに突入します。頑張れ、俺！！:grimacing:
【Docker Compose】固定IPの割りあてとhostsの編集

## はじめに
ローカル開発環境を構築するにあたり固定IPを設定し、`hosts`ファイル を編集する必要があったため、その手順を備忘録として残します。

`docker-compose.yml` に以下を追記する
* IPアドレスを固定する: ネットワーク（`networks`）を追加
* コンテナの `/etc/hosts` を編集する: `extra_hosts` を追加

コンテナ起動後、各コンテナに入り固定IPが設定されているか, `/etc/hosts` が編集されているか確認
```bash
# コンテナに入る
docker compose exec <コンテナ名> bash

# コンテナ内で以下コマンド実行
hostname -i
cat /etc/hosts
```

## 設定例

```docker-compose.yml
services:
  php:
    container_name: php
    build: ./docker/php
    volumes:
    - ./server:/var/www
    networks:
      app_net:
        ipv4_address: 172.20.0.10       # phpコンテナに172.20.0.10を割り振る
    extra_hosts:  
      - "example.com.local:172.20.0.20" # 172.20.0.20 example.com.localが追記される

  nginx:
    image: nginx
    container_name: nginx
    ports:
    - "81:80"
    networks:
      app_net:
        ipv4_address: 172.20.0.20　      # nginxコンテナに172.20.0.20を割り振る
    volumes:
    - ./server:/var/www
    - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
    - php

  db:
    image: mysql:5.7
    platform: linux/amd64
    container_name: db-host
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: database
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --innodb-use-native-aio=0
    volumes:
    - ./docker/db/data:/var/lib/mysql
    - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
    - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
      - "3307:3306"
    networks:
      app_net:
        ipv4_address: 172.20.0.30　      # dbコンテナに172.20.0.30を割り振る

networks:
  app_net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.20.0.0/24        # サブネットを設定
```

## 参考
[dockerのコンテナに固定IPを振る](https://qiita.com/reflet/items/e10442c16834a9ce15b3)
[docker Docs](https://docs.docker.com/engine/reference/run/#managing-etchosts)
Saelsforceでグローバル検索やChatterのレコード検索で出てこない場合の確認事項

こんにちは
本橋です

Salesforceでは
グローバル検索やChatterのレコード検索としてレコード検索したけどレコードがでてこない
という場合の対処事項を共有します


## ステップ１　レコードの共有設定はあるか？

まずはレコードの共有の確認ですね
レコードが閲覧できなければもちろん検索が出ませんね


しかしながらレコード共有ができても（もっと言えばシステム管理者でも）グローバル検索にでなかったりする場合があります
その場合は下記２点をご確認ください


## ステップ２　オブジェクトの検索条件の確認

カスタムオブジェクトの場合

「検索を許可」にチェックがあるかご確認ください
![検索.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/3800c87f-2026-270a-f0a0-499e35ad41a3.png)


こちらにチェックが無いと検索に表示できません

## ステップ３　カスタムタブの確認

カスタムタブを作成してください

カスタムタブが無いと検索に表示できません

![カスタムタブ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/dffb0e8d-1b36-92c4-51d0-befdca942c9f.png)
GitHubのissueを使った開発手順

# 概要

GitHub(issue使用)でのブランチ作成からマージまでの運用手順
実装者（ファイルへの変更を行った人）とレビュー担当者（変更内容をチェックする人）の２名においての新規機能の実装を行う想定
1～4,6が実装者の作業で、5がレビュー担当者の作業になる
(参考)[https://qiita.com/tkmd35/items/9612c03dc60b1c516969]


# 目次
[1. issueの作成](#1-issueの作成)
[2. 機能追加用ブランチを作成](#2-機能追加用ブランチを作成)
[3. コード追加修正作業、コミット](#3-コード追加修正作業コミット)
[4. プルリクエストの作成](#4-プルリクエストの作成)
[5. マージ実行](#5-マージ実行)
[6. issueクローズして作業ブランチをmainに戻す](#6-issueクローズして作業ブランチをmainに戻す)

# 1. issueの作成
GitHubのコンソールの「issues」タブを表示
「new isuue」ボタンをクリック

![1018-001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/2101316f-c226-d953-a895-a1e4857185fa.jpeg)



タイトルと詳細を入力して「submit new issue」ボタンをクリック

![1018-002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/8bf367ee-886b-4267-f131-73cb62d50bce.jpeg)



issueが新しく作成されissueに #番号 が作成される

![1018-003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/7d34f947-06e0-4516-2d87-e8f98e1c5890.jpeg)



# 2. 機能追加用ブランチを作成

「git checkout -b」で新しくブランチを作成
命名規則の例
feature(新機能)、bug(バグ修正)、hotfix(ホットフィックス)等のカテゴリー名を入れる
issueの番号を含める
作成者名を入れる

```
$ git checkout -b feature#8-kubota
```


# 3. コード追加修正作業、コミット

コードの追加修正作業を実行する
完了したら変更内容をステージに上げる→コミットする→リモートにプッシュ


```
$ git status
$ git diff

$ git add .

$ git commit -m '#8-新機能実装'

$ git push origin ブランチ名#番号
```

※コミット時にのコメントにissueの#番号を含めるとissueの関連付ける事が出来る

![1018-004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/1bf66f09-f1fe-b682-94e3-10e2e490910a.jpeg)



# 4. プルリクエストの作成

プルリクエスト(レビュー依頼)を作成する
まず、GitHubのコンソールの「Pull request」タブを開き、「」ボタンを押す

![1018-005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/6b6d20a6-a623-f2b5-b0c6-8dbbee059e33.jpeg)


タイトルを確認、詳細を入力して「Create pull request」ボタンを押す

![1018-006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/1e06278e-0572-efd6-34c0-963a46d84558.jpeg)



# 5. マージ実行

GitHubコンソールの「Pull request」タブを開き、マージするプルリクエストをクリック

![1018-007.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/0bcb2878-b180-d4fe-a76f-28e0e19e0934.jpeg)


コミット履歴が表示されるのでチェックする
問題無ければ「Marge pull request」ボタンをクリック

![1018-008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/f8f4f6b1-4720-d5e2-ff72-3f571dad6d88.jpeg)


タイトルと詳細を入力して「Confirm merge」ボタンをクリック
マージ完了、プルリクエストがクローズされる

![1018-009.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/74617d08-fc21-db8d-7633-cfcd1d68d796.jpeg)


# 6. issueクローズして作業ブランチをmainに戻す

GitHubコンソールの「issue」タブから該当のissueを表示
「Close issue」ボタンをクリックしてissueをクローズする

![1018-010.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2749195/2cc6dcb6-b0b7-98b9-3a53-d136f3e2d9bd.jpeg)



ローカル環境でマスターブランチに移動して更新して作業完了

```
$ git checkout main
$ git pull origin main
```
Ruby + Google Vision API で画像の色合い(RGB)を得る

# コード

```rb
require "google/cloud/vision"

IMAGE_ANNOTATOR = Google::Cloud::Vision.image_annotator

image_path = "https://cloud.google.com/static/vision/docs/images/bali_small.jpeg?hl=ja"

response = IMAGE_ANNOTATOR.image_properties_detection(
  image: image_path,
  max_results: 100
)

response.responses.each do |res|
  res.image_properties_annotation.dominant_colors.colors.each do |color|
    red = color.color.red.round
    blue = color.color.blue.round
    green = color.color.green.round

    puts "Red: #{red} Blue: #{blue} Green: #{green}"
  end
end
```

# 結果

```
GOOGLE_APPLICATION_CREDENTIALS="/path/to/service-account.json" ruby /path/to/script.rb

Red: 241 Blue: 132 Green: 178
Red: 114 Blue: 64 Green: 76
Red: 206 Blue: 212 Green: 205
Red: 228 Blue: 65 Green: 55
Red: 146 Blue: 93 Green: 106
Red: 232 Blue: 159 Green: 185
Red: 222 Blue: 225 Green: 221
Red: 187 Blue: 129 Green: 145
Red: 131 Blue: 91 Green: 115
Red: 109 Blue: 77 Green: 79
```



# チャットメンバー募集


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

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


# Twitter

https://twitter.com/YumaInaura
取引先ロールの最適化によるパフォーマンスと拡張性の向上（ARO：Account Role Optimization）

記載中
　・PCもARO有効化するとロール1階層だがあってるか？（要確認）


https://help.salesforce.com/s/articleView?id=sf.networks_partners_optimize_roles.htm&type=5

ExperienceCloudのライセンスを調査していたところ、
AROが有効化されているか否かでPC／CCPの組織あたりのユーザ数上限が変わるため、
AROは何か？を調べました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/2b2f9d12-2927-fa6a-2e5d-12e97475ad5c.png)

https://help.salesforce.com/s/articleView?id=sf.users_license_types_communities.htm&type=5

### ARO
・Account Role Optimizationの略。
・ロールがたくさんあるとパフォーマンスに悪影響がでるが、この設定を有効化すると無駄なロールは作らないんだそうです。（ロールが最小限で済むことがメリット）
・例えばコミュニティの設定で、ロール数をデフォルト3としてた場合、通常ならCCPもCCもロール数が３になりますが（エグゼクティブ・マネージャー・メンバーの3つが自動生成）、AROを有効化すると、CCPのほうは1ロールに削減されます。
・設定ベースで有効化できます。（最近の環境はデフォルトがTrueになってる・・？？）
・設定方法は、設定＞共有設定＞「作成されるロール数を最小限に抑えます。これにより、処理の負荷が軽減され、パフォーマンスが向上します。」にチェック

### 実機検証
#### ・ARO無効化状態
CCPの場合のロール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/ede92299-99fb-98d9-347a-c6ff1c22a663.png)

PCの場合のロール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/f62eab95-5428-dd56-0b6e-3c9161113cc2.png)


#### ・ARO有効化状態

CCPの場合のロール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/760b27d2-41cb-e2fd-eafe-8bba62512635.png)

PCの場合のロール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/5fb0d654-833d-35f4-73b9-66c7ecb14edc.png)


＜参考＞CCの場合のロール（ロールがない）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/5b37964c-8767-8b24-b69c-143603594826.png)

＜参考＞設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/174aee8e-df8b-ff6a-c21d-1733a91c1b5d.png)
スプレッドシートの二次元データをJSONでダウンロードする

ちょっとしたテストデータを作る時に、GoogleスプレッドシートのデータをJSON形式で欲しくなりました。

調べてみると、いい感じのコードを書いてる人がいたので、拝借しつつ、JSONファイルとしてダウンロード(エクスポート)できるようにしました。

## やりたいこと
これを
| id  | name   | twitter_id        | 
| --- | ------ | ----------------- | 
| 1   | taro   | taro_no_twitter   | 
| 2   | jiro   | jiro_no_twitter   | 
| 3   | saburo | saburo_no_twitter | 

こう変換します
```json
[
	{
		"id": 1,
		"name": "taro",
		"twitter_id": "taro_no_twitter"
	},
	{
		"id": 2,
		"name": "jiro",
		"twitter_id": "jiro_no_twitter"
	},
	{
		"id": 3,
		"name": "saburo",
		"twitter_id": "saburo_no_twitter"
	}
]

```

# シートのフォーマットについて
- 1行目にはオブジェクトのキー名が入力されていること
- 2行目以降に値が入力されていること

# 結論のコード
```javascript:toJson.gs
const getData = () => {
  const sheet = SpreadsheetApp.getActiveSheet();
  const arrays = sheet.getDataRange().getValues();

  const [header, ...rows] = arrays;

  return JSON.stringify(rows.map((row) =>
    row.reduce((acc, cell, i) => ({ ...acc, [header[i]]: cell || null }), {})
  ));
};

/** スプレッドシート読み込み時に実行 */
function onOpen() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "JSONで出力",
    functionName : "toJSON"
  }];
  // メニューバーにJSON出力用メニューを追加
  spreadsheet.addMenu("JSON", entries);
};

/** ダウンロードダイアログ表示 */
function toJSON() {

  // ダイアログテンプレート読み込み
  var dl_html = HtmlService.createTemplateFromFile("dl").evaluate();

  // ダイアログ表示
  SpreadsheetApp.getUi().showModalDialog(dl_html, "JSONファイルをダウンロード");
}

```

ほぼコピペ
```html:dl.html
<!DOCTYPE html>
<html>
<head>
    <base target="_top">
    <script type='text/javascript'>
        //ダウンロード実行
        function handleDownload() {
            //JSONデータの取得
            var content = <?= getData(); ?>;
            //ダウンロード用URL生成
            var blob = new Blob([content], { "type": "application/json" });
            document.getElementById("download").href = window.URL.createObjectURL(blob);
        }
    </script>
</head>
<body>
    <!-- JSONダウンロードボタン：json名は適宜設定してください-->
    <a id="download" href="#" download="download_file.json" onclick="handleDownload()">ダウンロード</a>
</body>
</html>
```

スプレッドシートをリロードすると、こんな感じでメニューバーに追加され、jsonファイルとしてダウンロードできるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256853/727026f2-ffe3-ed27-87d6-c51ac491ddfa.png)

## 未実装のもの

全て文字列となるので、nullやbooleanやDate型は各自要件に応じて対応してください。


## 追記
- 空白のセルはnullとして扱うように修正しました
- 元々booleanやData型には自動変換してくれてました
- 空文字を扱いたい場合は`""`を使ってください

# 参考
> コード
https://ribbit.konomi.app/blog/gas-json

> ダウンロードUIの作り方
>
> https://qiita.com/Yami_37/items/b4ed2bd2e20ffe7dfbca
Power Automateから実行するOfficeスクリプトはセル名指定ができないっぽい?

業務上Office Scriptを利用しないと実現できない機能が出てきたので自己学習をはじめています。Java Scriptは5年触っておらず、Type Script未経験です。

#### Office Scripts利用前提

Amazonで本の評価を下げている人がいましたが、Office Scriptsを利用するための[前提条件](https://learn.microsoft.com/ja-jp/office/dev/scripts/overview/excel?source=recommendations#requirements)があるのでみてくださいね。。

#### 本を買いました

2022/10/11時点でOffice Scriptsについて市販されている書籍はこれしかありませんでした。
（個人で学習された内容を販売されている方はいらっしゃるようです）

https://www.amazon.co.jp/dp/4899775229/ref=cm_sw_r_tw_dp_NYKF8D82040W8KF57NZJ

購入後早速参照しましたセル名の取得についての記述はありませんでした。。

#### Web版Excel上でのスクリプト実行と、Power AutomateからのExcelコネクタ「スクリプトを実行」の差異

https://learn.microsoft.com/ja-jp/office/dev/scripts/tutorials/excel-power-automate-manual

こちらのページで紹介されているサンプルコードのセル位置をセル名に試してみました。

Web版Excel上でスクリプトを直接実行した場合、

```
// A1セルをPracticeという名前に変更しておく
getRange("Practice").setValue("テスト")
```

は動作するのですが、Power Automateで実行すると
> スクリプトを実行できませんでした。もう一度お試しください。

でエラーになってしまいます。

その後スクリプトを変数をやめてスクリプトに値を直書きして保存して誤ってクラウドフローを実行ボタンを押してしまったところ、なぜかフローの変数からデータを受け渡せたかたちで正常終了しました。

#### Power Automateから呼び出すスクリプトを完成させてから再チャレンジ

ひととおり業務で用いるスクリプトのデバッグが終わったものをまるまるコピー（コピーする機能がないためソースコードを全コピーして[新しいスクリプト]から作成、ペーストします）し、セル位置をセル名に変更したスクリプトにします。スクリプト1という名前にします。

クラウドフローの「スクリプトの実行」アクションでスクリプト1に変更すると引数がいつまでたっても表示されません。10分ほど置いても表示されないので読み込みエラーが起きているのだと解釈しました。


レイアウト変更するとスクリプトも修正しないといけなくなるのでセル名で指定する記法をフィードバックいただけたら幸いです。
lodashをimport時のwebpack容量を抑えたい...

# lodashをimport時の容量節約
Webpackのバンドル時にlodashが全部含まれしまい容量が肥大化する。
![スクリーンショット 2022-10-18 17.15.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1583420/3f7269e3-dee8-45bc-470d-c92886592d44.png)

# importの仕方を変える


```js
import { isEmpty } from 'lodash';

...
const obj = hoge.fuga;
if (isEmpty(obj)) {
  // 処理
} else {
  // 処理
}
```

まずは安直に上記のようなコードを書いたが、実はlodashの中身がすべてインポートされている。

```js
// ビルド後
var lodash = require('lodash');
var isEmpty = lodash.isEmpty;
...
```
![スクリーンショット 2022-10-04 14.21.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1583420/104c61cf-15fc-97ba-a3b0-737d56182e4d.png)
VSCodeのプラグインである[import Cost](https://marketplace.visualstudio.com/items?itemName=wix.vscode-import-cost)を使っても変わらないことがわかる。

# 一旦落ち着いた方法
### 一つずつ呼ぶ
```
import get from "lodash/get";
import set from "lodash/set";
import isEmpty from "lodash/isEmpty";
import map from "lodash/map";
.
.
.
.
```
これまた安直だが、一旦はこれに落ち着いた。
容量も減っていることが確認できる
![スクリーンショット 2022-10-18 17.18.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1583420/2708151e-9e13-f2c4-cf2b-f0ebf8b49b94.png)

# 最後に
他に賢いやり方知ってる方いたら教えてくださいまし。。。
「React Inspector」を使ったらUIからのコード特定がすごく楽になった話

## 目次
[どんな問題を解決してくれたか？](#どんな問題を解決してくれたか？)
[参考記事](#参考記事)

# どんな問題を解決してくれたか？
UI画面上からソースコードを特定するのに時間がかかる問題を解決してくれた。
コードを探すのに地味に時間をとられるので、めちゃくちゃありがたいツール。
BeforeAfterをどうぞ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526938/370614c3-9c1c-8423-142d-3ad26debe5c2.png)
※ChromeからVSCodeを開く際、「ウェブサイトがこのアプリケーションを開く許可を求めています。」ダイアログがいちいち表示されてめんどくさい！となったのでMacのコンソールで以下を流し、Chromeを再起動したら出なくなった👍
```
defaults write com.google.Chrome URLAllowlist -array "vscode://*"
```

# 参考記事
・React Inspectorを[作った方](https://qiita.com/hand-dot)の機能紹介記事
https://qiita.com/hand-dot/items/608977ea795512dd4bc0

・URLAllowlistをMacのターミナルから設定する方法
https://owky.github.io/blog/2022/01/09/mac-chrome-url-allow-list.html
MySQL Workbench 8.0.31 for Windows クエリ結果を1000件以上表示

# 結論 → 初期設定の1000 Rows Limitを解除する。

[Edit] → [Prederences...] 
[▼SQL Editor] → [SQL Execution] → [SELECT Query Results] → [✓Limit Rows]（チェックを外す）


**以下に件数確認コマンドや、
画像付きの設定手順を掲載しています。**



# はじめに
本記事は、サンプルデータベースとして
[色々なデータベースをダウンロードできるページ](https://dev.mysql.com/doc/index-other.html)から、
**world database の cityテーブル**を使用しています。


**動作環境**は以下の通り。
| OS | Workbench |
|:-:|:-:|
| Windows 10 Pro  | 8.0.31  |



# 余談を含んだ詳説

## まずは全行表示してみよっと。

```sql:テーブル全行表示
select * from world.city;
```

## あれ？1001件以上データが表示されてない！

![スクリーンショット 2022-10-18 164337.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499476/dcc84432-eec4-1d75-a9a2-af9855a2caae.jpeg)

このテーブル、1000行以上あったはずなのにな・・。

レコード数を確認してみよう。

```sql:レコード数を確認する
select count(*) from world.city;
```
![スクリーンショット 2022-10-18 164611.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499476/c5eb8664-d29a-1d41-f47e-73ca93839948.jpeg)

ほらやっぱり！
表示されている1000件より多いぞ！

## 原因 → Workbenchの初期設定で上限が1000行になっている

Workbenchの設定を開く
![スクリーンショット 2022-10-18 164736.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499476/e034debe-3e9a-88d7-0048-5c53cd23a7e2.jpeg)


行数リミットのチェックマークを外す
![スクリーンショット 2022-10-18 164819.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499476/26158bdb-b860-db63-d15b-c367991a996d.jpeg)
React(Next)で3Dモデル(GLTF)を表示する

# 概要
react-three-fiberというライブラリを使って、GLTF形式の3Dモデルを自分のサイトに載せるのだ
https://docs.pmnd.rs/react-three-fiber/getting-started/introduction


# 環境
```package.json(一部)
"next": "12.2.5",
"react": "18.2.0",
"@react-three/drei": "^9.34.4",
"@react-three/fiber": "^8.8.10",
"three": "^0.145.0"
```

その他筆者の環境にはreact-bootstrapなど入っているが省略

# ディレクトリ構成
>root/
  ├ pages/
  │  　 └ index.tsx
  ├ components/
  │  　 └ model.tsx
  └ public/
    　  　 └ rowlet.gltf
# 準備
プロジェクトを準備するところは省略,create-react-appなりなんなりと
プロジェクトのルートディレクトリに移動し以下のコマンドを実行
```
$ yarn add three @react-three/fiber @react-three/drei
$ yarn add -D @types/three
```

# コード
```tsx:Model.tsx
import React from "react";

import { useLoader } from "@react-three/fiber";
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";

export function Model(prop: { src: string }) {
  const gltf = useLoader(GLTFLoader, prop.src);
  return <primitive object={gltf.scene} scale={0.4} />;
}
```
```tsx:index.tsx
import { Model } from "../../components/Model";
import { Canvas } from "@react-three/fiber";
import { OrbitControls } from "@react-three/drei";
import * as React from "react";


const App = () => {
  return (
        <div style={{ width: "100vw", height: "100vh" }}>
          <Canvas>
            <OrbitControls />
            <ambientLight />
            <Model src="/rowlet.gltf" />
          </Canvas>
        </div>
  );
};

export default App;
```
nextでは静的ファイルのパスがpublicディレクトリをルートとする絶対パスであるため注意しよう(2敗)

## エラー
```
Error:cannot find module 'three'
```
は？？？あるが？？？
しかもランタイムエラーなんですよねこれ、〇すぞ～～～！！！
いろいろ試した結果、キャッシュ削除からのライブラリ再インストールで解決しました
https://sakanasoft.net/yarn-cache/

```
Error: Unknown property 'object' found  react/no-unknown-property
```
うるせ～～～！！！しらね～～～！！！
…というわけにもいかないので、eslintrc.jsonいじって解決
```diff_json:eslintrc.json
{
    "rules": {
+      "react/no-unknown-property": ["error", { "ignore": ["object"] }]
    }
}
```
実はModel.tsx中でdreiのuseGLTF使ってないのは、eslintrc.jsonのいじる項目が多そうで辟易したからです
参考:
https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-unknown-property.md
# 実行画面
https://kerusu.xyz/shadow-box
![スクリーンショット 2022-10-18 165207.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2050525/9ed92ebb-d73c-0e37-80ee-4bdc281ee8c2.png)
うわぁい

# 感想
Three.jsなんもわからん人間でも手軽に使えてええなのお気持ち、カメラ位置とかいじれるみたいなので公式ドキュメント見て挑戦しようね
エラー　![rejected]master -> master (fetch first)


↓こんなエラーが出た時の対処法
```terminal
! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'github.com:アカウント名/リポジトリ名'
```

### 解決手順
調べてみた手順でfetchしてみたりしたけど同じエラーが出続けたので
まだ最初でもあるしやり直した。

①PCのフォルダ内の「.git」フォルダを右クリック削除
②gitの初期化「git init」
③下記の順番でpushまでをやったら
④うまくいった

```terminal
git init
git remote add origin git@github.com:アカウント名/リポジトリ名'
git fetch
git merge origin/master
git checkout master
git add .
git commit -m "コミットメッセージ"
git push origin master
```
【LINE WORKS】指定したトークルームを開くURLを作る

LINE WORKS Advent Calendar 2022 2日目、どうぞよろしくお願いします。
11月にAppLinkの新機能が追加されましたので、AppLinkについて全体的な説明も含め説明させていただきます。

LINE WORKSには「[App Link (Universal Link)](https://developers.worksmobile.com/jp/document/300190001?lang=ja)」という機能が用意されています。

例えば、以下のURLをクリックするとLINE WORKSのトーク画面が起動します。
https://line.worksmobile.com/message?version=26

このURLにパラメーターを設定することで、特定のメンバーやグループのトークルームなど、指定したトークルームを開くことができます。

## 特定のメンバーとのトークルームを開く

emailListパラメータにLINE WORKSアカウントIDを設定すると、特定のメンバーとのトークルームを開くことができます。
Ex: https://line.worksmobile.com/message/send?version=26&emailList=works.taro@domain-name

上記URL末尾をご自身のテナントメンバーのアカウントIDに変更すると、そのメンバーとのトークルームを開くAppLinkになります。

## グループ/組織のトークルームを開く

channelIdパラメータを設定すると、グループ/組織などのトークルームを開くができます。
Ex: https://line.worksmobile.com/message/send?version=26&channelId=181c2516-1fee-91e4-0f6f-449f353fd42b

上記URL末尾を開きたいトークルームのchannelIdに変更すると、指定したトークルームを開くAppLinkになります。

### channelIdの確認方法

channelIdはトークルームから確認することができます。
![l_165927581_6_661ce9efc9777f15a2d0fd41659a21c4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726616/596eec96-1c37-df50-a943-631d9806c30f.png)

他にも、[Bot Callback Event](https://developers.worksmobile.com/jp/reference/bot-callback?lang=ja)でも確認することができます。


## 外部LINE/LINE WORKSユーザーとのトークルームを開く

worksAtResourceIdListパラメータを設定すると、外部ユーザーとのトークルームを開くができます。
Ex: https://line.worksmobile.com/message/send?version=26&worksAtResourceIdList=c052fa11-9676-4393-4e96-043498bd1234

上記URL末尾を外部ユーザーのIdに変更すると、外部ユーザーとのトークルームを開くAppLinkになります。

### 外部ユーザーのIdの確認方法

外部ユーザーのIdは以下のAPIを利用して確認します。
- [連絡先リストの取得 GET/contacts](https://developers.worksmobile.com/jp/reference/contact-list?lang=ja)
- [連絡先の取得 GET/contacts/{contactId}](https://developers.worksmobile.com/jp/reference/contact-get?lang=ja)

上記APIのResponse Parameter `linkedExternalUser.id` で確認することができます。


以上。
gRPCを使ってあそんでみる　環境構築編

# gRPCを使ってあそんでみるの目的
ログデータを永続化するgRPCサービスを立ち上げログを記録する。

## 今回のお題
IDL(Interface Description Language)からRPC用のJavaソースを生成する環境を構築する。

最後にJarファイルを作成する。

## ■事前環境
・Windows10 バージョン21H2
・IntelliJ IDEA 2022.1.4(Community Edition)
・OpenJDK Runtime Environment Zulu17.36+17-CA (build 17.0.4.1+1-LTS)
・Gradle

## １．新規プロジェクトを作成

## ２．IDLコンパイル用Gradleタスクの追加
### ２．１．com.google.protobufプラグインを追加
```build.gradleの必要箇所を抜粋
plugins {
    id 'java'
    id "com.google.protobuf" version "0.9.1"
}
```

### ２．２．Gradleタスクに追加されていること確認
Gradleプロジェクトを再ロード後、６つのタスクが追加されている事を確認。
<img width=300 src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578067/9c0ea3e7-8478-fd52-4681-ce6a303b7261.png'<>


## ３．IDLのコンパイル環境を構築
### ３．１．IDLコンパイラーとJava用クラスファイル生成プラグインを追加
```build.gradleの必要箇所を抜粋
protobuf {
    protoc { artifact = "com.google.protobuf:protoc:3.21.7" }
    plugins {
        grpc { artifact = "io.grpc:protoc-gen-grpc-java:1.50.0" }
    }
    generateProtoTasks {
        all()*.plugins { grpc {} }
    }
}
```

### ３．２．依存関係の追加
Java９以降には、'javax.annotation:javax.annotation-api:1.3.2'が必要となります。
```build.gradleの必要箇所を抜粋
dependencies {
    implementation 'io.grpc:grpc-netty-shaded:1.49.2'
    implementation 'io.grpc:grpc-protobuf:1.49.2'
    implementation 'io.grpc:grpc-stub:1.49.2'
    implementation 'javax.annotation:javax.annotation-api:1.3.2'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.0'
}
```

## ４．IDLファイルの作成
src/main/protoの配下に以下のファイルを作成する。
```logging.proto
syntax = "proto3";

option java_multiple_files = true;
option java_package = "example.grpc.logging";
option java_outer_classname = "LoggingProto";

package logging;

service Logging {
  rpc record (LoggingRequest) returns (LoggingResponse) {}
}

message LoggingRequest {
  string status = 1;
  string message = 2;
}

message LoggingResponse {
  string status = 1;
  string message = 2;
}
```


## ５．IDLよりJavaクラスファイルを生成
GradleののgenerateProtoタスクを実行。
gRPC用のJavaファイルが build/generated 以下に生成される。
<img width=400 src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578067/9b27dd9a-444b-e865-c760-113c5aa4fa55.png'>

## 参考
今回、利用したソース一式です。
https://github.com/shigemax999/sample-grpc-logging.git

## 次回
[gRPCを使ってあそんでみる　サービス起動編](https://qiita.com/shigemax999/items/fa9c3354ee79691b36d5)です。
確率密度関数の変数変換

# 置換積分

## 1変数関数

$x=x(t)$ として変数変換を行い積分計算を簡単にする操作を、特に置換積分といい
$$
\int f(x)dx = \int f(x(t))x^\prime(t)dt
$$
で表される（$x=\phi(t)$として表されることもある）。


### ex. 

$$
\int_{-1}^{1}\sqrt{1-x^2}~dx
$$

$x=\sin\theta$ と変数変換を行い（$x\to\theta$）、積分範囲は $x:-1\to 1$ から $\theta:-\pi/2\to\pi/2$ になる。$dx=\cos\theta~d\theta$ を用いて
$$
\int_{-\pi/2}^{\pi/2}\sqrt{1-\sin^2\theta}~\cos\theta d\theta
= \int_{-\pi/2}^{\pi/2} \cos^2\theta~d\theta
= ... = \pi/2
$$
となる。

よくある例題も、$x\to x(\theta)$ の変数変換と理解できる。積分範囲の変換は $x$ の動く範囲から $\theta$ が動く範囲を求める、というように $x\to x(\theta)$ ではなく $x\to\theta$ のように見えてしまうことに混乱しないこと。

## 2変数関数（多重積分）

$x=x(u,v),~y=y(u,v)$ として$(x,y)\to (u,v)$ の変数変換の場合、変数変換後の積分計算は
$$
\int\int f(x,y)dxdy = \int\int f(x(u,v),y(u,v)) |J(u,v)| dudv
$$
で与えられる。

### ヤコビアン

$(x,y)\to (u,v)$ の変数変換によって $dxdy$ を変形する必要がある。そのときに登場するのがヤコビ行列の行列式であるヤコビアンである。
ヤコビ行列は
```math
J = 
\begin{bmatrix}
\frac{\partial x}{\partial u} & \frac{\partial x}{\partial v} \\
\frac{\partial y}{\partial u} & \frac{\partial y}{\partial v} 
\end{bmatrix}
```
である。このヤコビアンを用いることで
$$
dxdy \to |J|dudv
$$
として重積分の変数変換が可能になる。つまり、ヤコビアンは変数変換に伴うスケールの変化を調整するはたらきを担っている。

ヤコビアンを用いた変数変換の公式は $n$ 重積分でも成り立つ。$\{x_1,...,x_n\}\to \{x_1(u_1,u_2,...,u_n),...,x_n(u_1,u_2,...,u_n)\}$ の変換の際、一般次元のヤコビ行列は
```math
J = 
\begin{bmatrix}
\frac{\partial x_1}{\partial u_1} & \frac{\partial x_1}{\partial u_2} & \dots & \frac{\partial x_1}{\partial u_n}\\    
\vdots & \\
\frac{\partial x_n}{\partial u_1} & \frac{\partial x_n}{\partial u_2} & \dots & \frac{\partial x_n}{\partial u_n}\\    
\end{bmatrix}
```
で $n\times n$ 行列として与えられる。

# 確率密度関数における変数変換

$X=(X_1,...,X_n)$ の $n$ 次元確率ベクトルが同時密度関数 $f_X(x)$ に従っているとする。変数変換 $Y=g(X)$ によって新しい確率ベクトル $Y$ を定義したときに、$Y$ の密度関数を求めたい。ここでは $X$ の密度関数 $f_X(x)$ から（これは既知であるとしている）、$Y$ の密度関数 $f_Y(y)$ をどのように求められるかという問題になる。

変数変換 $y=g(x)$  は1対1の関数であり、連続微分可能な逆関数 $x=g^{-1}(y)$ を持っているとする。

$Y,X$ の標本空間をそれぞれ $A,B$ としたとき（$\{y~|~y\in A\}$、$\{x~|~x\in B\}$）、変数変換は1対1の変換であることを仮定しているので、 $B=g^{-1}(A) = \{x~|~g(x)\in A\}$ とおけ、
$$
P(Y \in A) = P(X\in B)
$$
が成り立ち、重積分の変数変換の公式を用いると以上の議論と同様に
$$
P(X\in B) = \int_B f_X(x)dx = \int_A f_X(g^{-1}(y)) |J| dy = P(Y\in A)
$$
となる。よって、$Y$の密度関数は $f_X(\cdot)$ を用いると
$$
f_Y(y) = f_X(g^{-1}(y))|J|
$$
と求められる。

## 変数変換の方向？について

変数変換の方向（？）の発想が若干多重積分と異なると思っている。多重積分の場合は
$$
\int f(x)dx
$$
の計算が複雑であるため、$x=x(t)$ と変数変換を行うことで積分可能な（or 計算が簡単な）形にしている。密度関数を求める際は
$$
P(Y\in A) = \int_A f_Y(y)dy
$$
が計算できないから $y=g(x)$ の変数変換をしようという形ではない。あくまでも $f_Y(\cdot)$ はそもそも分からないので出発点は
$$
P(X \in B) = \int_B f_X(x)dx
$$
であり、「$Y=g(X)$と変換した確率変数の密度関数を求めたい」という目的に対して、逆関数を用いて $x=g^{-1}(y)$ と変数変換することに留意。

## ヤコビアン

求めたいヤコビアンは
$$
x=g^{-1}(y)
$$
の変換に対するものであるので、（見やすさのために）$x=g^{-1}(y)=h(y)$ とすれば
```math
J = 
\begin{bmatrix}
\frac{\partial h_1(y)}{\partial y_1} & \frac{\partial h_1(y)}{\partial y_2} & \dots & \frac{\partial h_1(y)}{\partial y_n}\\    
\vdots & \\
\frac{\partial h_n(y)}{\partial y_1} & \frac{\partial h_n(y)}{\partial y_2} & \dots & \frac{\partial h_n(y)}{\partial y_n}\\    
\end{bmatrix}
```
で与えられる。

# Reference

- 現代数理統計学の基礎, p.23
- 現代数理統計学, p.41
Excel for MacのVBAでAutoFilterを使う

# 問題

ExcelのVBAでオートフィルターを実行するためには以下のように書きます。

```
Range("A2:Z100").AutoFilter
```

しかし、Excel for Macの場合は、RangeオブジェクトにAutoFilterがないため、実行時エラーになります。

# 解決策

Selectionオブジェクトにしてから利用します。

```
Range("A2:Z100").Select
Selection.AutoFilter
```

参考: https://stackoverflow.com/questions/6860328/vba-range-autofilter-fails-on-excel-2011-mac

おしまい。