OmniAICreator/Qiita-1.07M huggingface dataset:
SPSS ModelerのストリームファイルをCP4DのModelerFlowにマイグレーションする

SPSS ModelerのストリームファイルをCP4DのModelerFlowにマイグレーションします。
ほとんどの処理を取り込むことができますが、インポート・ノードとエクスポート・ノードは修正が必要です。

* テスト環境
    * CP4D 4.0.5

今回は以下のcreditrisk.complete.strというストリームファイルをインポートしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/8ed24447-5a83-6b44-861c-cafbada2bc2f.png)

# 1. インプットとアウトプットのデータ資産登録
インポート・ノードとエクスポート・ノードがCSVファイルの場合はUTF-8に変換したうえで、あらかじめプロジェクトのデータ資産としてアップロードしておきます。
なお、RDBのテーブルがインプットやエクスポートの対象である場合は対象のテーブルをデータ資産として登録しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4b4a5128-ed8d-61fc-4948-2fdd050590bc.png)


# 2. ストリーム・ファイルのマイグレーション
「プロジェクトに追加」で「Modelerフロー」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/394b88c4-7838-5630-8c04-f4734ed3609b.png)

「ファイルから」を選び、フロー・ファイルのアップロードにcreditrisk.complete.strをドラッグアンドドロップします。うまくいくとファイル名が表示されますので、「作成」でマイグレーションを開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/355926c6-ac7b-69a9-bdec-a047f8ee654e.png)

「ノードをマイグレーションしますか？」と聞かれますので、「はい」をクリックします。なお、「いいえ」を選んで個々のノードを付け替えることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/760f5705-7a79-1beb-63bd-fc33e54b06f1.png)

# 3. データ資産のマッピング
インポート・ノードのCSVファイルとプロジェクトのデータ資産のマッピングを行います。同名のデータ資産がある場合は自動的にマッピングされます。
データ資産を選びなおす場合は「参照」をクリックして選びなおします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/2c61a1a0-254c-0e96-ac4b-3a0658791f95.png)

エクスポートノードのマッピングも同様に行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/55c2d9e3-4b14-60ff-70df-940afd6b1c5a.png)

以下のようにマイグレーションができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7e4e5ad1-d51d-5adb-0d59-298e19889765.png)

# 4. マイグレーションしたストリームの注意点
インポート・ノードでインスタンス化やフィルタリングを行っている場合はスーパーノード化されて、マイグレーションされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/8c117f56-f4ee-96e5-d3f8-fe8418ffb28f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c349691a-8205-288c-dd49-f47eb81de476.png)

エクスポート・ノードはマイグレーションされたエクスポート・ノードは設定できる項目が限られていました。特に上書きができませんので、実行するとエラーになってしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f0fdb452-53dd-bd6c-b5c2-330a0ca37443.png)

エクスポートを新規に作り直すと以下のように設定項目が増えますので、作り直すことをお勧めします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c70720cc-1641-90df-3dfd-49ca828751a3.png)

# 参考URL

Importing an SPSS Modeler stream - IBM Documentation 

https://www.ibm.com/docs/ja/cloud-paks/cp-data/4.0?topic=modeler-importing-spss-stream
ServiceNow - PDI（個人開発者インスタンス）にプラグインをインストール

# 目的
ServiceNowから新しいサービスを購入する前に多くのプラグインはServiceNowから提供されている個人開発者インスタンスで試すことができる。購入が必須のものもありますが、基本的なプラグインは試せる。有償インスタンスの場合はインスタンスにログインしてからプラグインページを利用してインストールしますが、個人開発者インスタンスの場合は最初のログインページから行います。本記事は個人開発者インスタンスにプラグインをインストールする手順を説明します。

# 手順
1. 個人開発者インスタンスのログインページ（https://developer.servicenow.com/） を開く。
1. 右上の自分のイニシャルのアイコンをクリックする。<br/><img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/092577f3-44f7-df6b-5e4b-fb6512ad79d2.png">
1. 「Activate Plugin」をクリックする。<br/><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/bb275400-c12f-24b6-02b5-8fd1abfe10e8.png"/>
1. インストールするプログランの右にある「Activate」ボタンを押下する。<br/><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/048a0f3b-6a55-de85-5728-4d67a1a76bd5.png"/>

以上
Laravel Livewire JSで変数を書き換える

Livewireを使っているとJSからPHP側の変数を書き換えたくなること多い
端的には

@this.set(変数,値);
でOK



admin/voyager/resources/views/test.php
```
<livewire:livewire_test> 
```

app/Http/Livewire/Livewire_test.php
```
?php

namespace App\Http\Livewire;

use Livewire\Component;

class Livewire_test extends Component
{
    public $setvalue;

    public function mount()
    {
        $this->setvalue=10;
    }
    public function render()
    {
        return view('livewire.livewire_test');
    }

}


```

resources/views/livewire/livewire_test.blade.php

```html
{{$setvalue}}

<button onClick="@this.set('setvalue',100)"  >setvalueに100を入れる</button>

```



ドキュメントには$setってなってるけど、それだとうまく行かない・・
JS詳しくないからわからん・・

https://readouble.com/livewire/2.x/ja/actions.html
Salesforce商談レコードにTodo作成数を項目として格納するフロー作成方法

Salesforceの商談オブジェクトのレコードに項目としてToDo作成数を格納するフロー作成方法を紹介します。

「前提条件」
今回の自動化において２つのカスタム項目（数値型）を作成します。
なお作成する項目のデフォルト値は「０」に設定してください。
作成した項目はページレイアウト上に表示しておくとユーザの操作で誤った数値に変更される場合があるのでページレイアウトから項目を外すなどユーザが更新できない（あくまでフローのみ更新される）ようにしましょう

なお、今回はToDoレコードが削除されることは想定しておりません

1.商談オブジェクトに作成するカスタム項目（数値型）（項目test0308という名称にします）
2.活動オブジェクトに作成するカスタム項目（数値型）（項目testtodoという名称にします。）


フロー完成図
![oppflow1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/4a4e980c-7be3-d54d-ec08-10e4e5726779.png)


１つずつ設定確認をしていきましょう


ステップ１　レコードトリガフロー　について
![フロー１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/8fa0a33e-5037-30a9-c273-bf7e8d044960.png)

補足　ToDoオブジェクト作成時に起動するように設定

ステップ２　レコードを取得　について
![フロー２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/fccc06d2-6a31-2c10-b0ab-114979a4107d.png)

補足　今回Todo数を格納する商談レコードを特定します。
特定するには起動したToDoの関連IDを取得します

ステップ３　レコードを更新
![フロー３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/68e53606-f9f0-f387-ee7c-a3ae2cff7ea1.png)
補足　Todoオブジェクトの項目testtodo「2.活動オブジェクトに作成するカスタム項目（数値型）」に、
商談オブジェクトの項目test0308「1.商談オブジェクトに作成するカスタム項目（数値型）」の値を更新します

ステップ４　レコードを更新
![フロー４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/bc677bd0-7a33-7523-2493-513be7a10e1c.png)


補足
商談オブジェクトの項目test0308「1.商談オブジェクトに作成するカスタム項目（数値型）」に
Todoオブジェクトの項目testtodo「2.活動オブジェクトに作成するカスタム項目（数値型）に１プラスした値を更新します。

なお、１プラスするためには商談オブジェクトの項目test0308「1.商談オブジェクトに作成するカスタム項目（数値型）」更新のため、フローに以下のような数式を作成します
![フロー４その２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/9a6560c2-8f0b-7718-43c9-1391cb7fabd3.png)

数式：
$Record.testtodo__c  + 1
100日でSQLの達人になる@LeetCode! Day36 <商品別の最新の価格、要復習>

## 1164. Product Price at a Given Date （問題レベル: Medium）要課金
今日の問題はこれ。
商品IDとその商品の価格改定履歴のテーブルが与えられた時、ある日付時点の価格をリストアップするという問題。
色々な解法が考えられると思うが、`Day35`と同様に`ROW_NUMBER()`を使い、指定の日付に最も近い価格を取り出して上げれば良い問題だった。

最終的な解答は下記で提出した。
```:SQL
SELECT DISTINCT a.product_id, 
CASE 
WHEN c.product_id IS NULL THEN 10
ELSE c.new_price END AS price
FROM products a
LEFT JOIN
(
SELECT b.product_id, b.new_price
FROM (
SELECT product_id, new_price,
ROW_NUMBER() OVER(PARTITION BY product_id ORDER BY change_date DESC) AS rnk
FROM products
WHERE change_date <= '2019-08-16') b
WHERE rnk=1
) c
ON a.product_id=c.product_id
```
`Discuss`を見ても基本的には同様の解法が多かった。
(最も`Vote`が多かったものは、`UNION`を使ったものだが理解が追いついていない。)
今日のポイントは、`グループ毎の最新や上位ｘ番までの？？`には、`ROW_NUMBER()`を使う！にした。
また、`UNION`の解法も理解できるように復習しよう。

* [LeetCode](https://leetcode.com/)の問題は、`MS SQL Server`で解いています。
samba グループ内でのディレクトリ・フォルダ共有

# はじめに  
sambaで意図したパーミッションを付与する際に嵌ってしまったため、sambaでのファイル共有手順のフローを投稿します。
結論としてはUbuntu側のumaskによるものだったようです。

# 行いたいこと
windowsのファイルエクスプローラからUbuntuのディレクトリにアクセスする。
また、同一グループのユーザ間でディレクトリ・フォルダを共有する。

## sambaのインストール
```
$ sudo apt update
$ sudo apt install -y samba 
```
## ポート開放
```
$ sudo ufw allow samba
```

## ユーザ認証
Ubuntuに登録済みのユーザを以下のコマンドでsambaに追加する。
```
$ sudo pdbedit -a <username> 
```

## smb.conf
  /etc/samba/smb.conf を編集する。
  workgroupはwindows側と合わせること。
  各ユーザはUbuntuのアカウント上で<group>に所属していること。
  以下には差分のみ記述する。
```/etc/samba/smb.conf
[global]
  unix charset = UTF8
  dos charset = cp932
  unix extensions = no
  wide links = yes
  workgroup = workgroup

[share]
  path = /mnt/hdd/share
  writeable = yes
  valid_user = @<group>
  force group = +<group>
  create mode = 0775
  directory mode = 0775
  force create mode = 0775
  force directory mode = 0775
```
http://www.samba.gr.jp/project/translation/current/htmldocs/manpages/smb.conf.5.html

## Ubuntu側のumask変更  

``` :論理式
(DOSの属性 & directory mode) | (force directory mode)
```
でUNIX側のパーミッションが決定されるとあるが、うまくいかず嵌ってしまった。
実際には、Ubuntu側のumaskも関係してくるようである。

``` :論理式
{(DOSの属性 & directory mode) | (force directory mode)} & (~umask)
```
また、username でsambaにログインしていても、/home/username/.bashrc のumaskの記述は反映されなかった。

/etc/login.defs [^1] のumaskを変更し、
```
$ sudo service smbd restart
```
で設定が反映され意図したパーミッションを付与できた。

samba.conf の各種設定は以下を参照
参考URL : 
http://www.samba.gr.jp/project/translation/current/htmldocs/manpages/smb.conf.5.html
[^1]: /etc/profile などで変更したほうが良いのかもしれない。
Metashape きれいなメッシュを作成するためのTips

# metashapeのTips

内部向けにさらっと雑に書く程度なので、雑な部分はお許しください。

水中考古学・船舶考古学者の 山舩晃太郎 さん
[Twitter](https://twitter.com/KYamafune?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor)
主催の勉強会に参加した際に自分が学んだ内容の一部です。
他にもためになる情報が多かったので、興味ある方は勉強会に参加してみるといいと思います。半年に一回ぐらいやってるらしいです。


<font color="Red">**これは写真のアラインメントをした後にやることです**</font>

ツールバー＞モデル＞段階的選択＞基準
-プロジェクションエラー
-再構築の不確実性
-画像数
-プロジェクションの精度

のうち、
プロジェクションエラー, 再構築の不確実性, プロジェクションの精度
の三項目において、

① タイポイントの総数の1/10を段階的に選択する。
② 選択した点群を削除する。
③ ツール＞カメラを最適化　一般のチェックボックスにすべてチェックを入れ、OK

という操作を各2回ずつ、プロジェクションの精度 → 再構築の不確実性 → プロジェクションエラー の順で繰り返すと
メッシュの作成時にきれいなアウトプットができます。

## 具体的に
プロジェクションの精度一回目
![スクリーンショット (44).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/9dc362e3-96ba-3f88-4195-d31792cb062a.png)
![スクリーンショット (45).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/54cff733-3d9a-c63b-66c1-2042c886f2a1.png)
![スクリーンショット (46).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/ca00f3d6-ebea-eba7-c847-5427806b842d.png)

<font color="Red">**そしてDelete**</font>



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/453b7124-6d92-fa88-8099-5dea24cc6433.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/1ce2920b-9d7f-ec07-d417-69270b49699a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/cecabc16-127b-a82b-34b2-20734f2437b2.png)
<font color="Red">**そしてDelete**</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/bd188356-afd4-e652-a455-0fabec164510.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/bd0b80e9-4487-2bef-69d8-e634935c9341.png)

<font color="Red">**繰り返し...............**</font>

というような感じで、同じ操作を2回×3項目=計6回
やった後に、メッシュを構築するのです！

## 理論

正直自分もあんまり深くは理解してないんですが、
タイポイントの時点で、信憑性の低いポイント等を取り除くことで、良質なポイントだけでメッシュ作ったほうがいいよね。ってことですよね。簡単に言うと。
てか残念ながら自分は簡単にぐらいしか理解してないっす。


僕はMetashape Educational Licenseでいつもはやってるので、できないですが、Professional であればPythonでこの一連の過程を実装できるはずです。
ContentProviderでUnknown authorityで困った話

ContentProviderを使ってデータを取得しようとしてエラーに引っかかってしまい時間をとられた

``` error
    java.lang.IllegalArgumentException: Unknown authority com.sample.content.provider.testprovider
        at android.content.ContentResolver.call(ContentResolver.java:2402)
        at com.sample.content.client.MainActivity.loadText(MainActivity.kt:27)
        at com.sample.content.client.MainActivity.onCreate$lambda-0(MainActivity.kt:17)
        at com.sample.content.client.MainActivity.lambda$9zIV18Q6InENemqclwLnyzJ6Kg8(Unknown Source:0)
        at com.sample.content.client.-$$Lambda$MainActivity$9zIV18Q6InENemqclwLnyzJ6Kg8.onClick(Unknown Source:2)
        at android.view.View.performClick(View.java:7448)
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
        at android.view.View.performClickInternal(View.java:7425)
        at android.view.View.access$3600(View.java:810)
        at android.view.View$PerformClick.run(View.java:28305)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7710)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1093)

```


呼び出す側のアプリのAndroidManifest.xmlで使用するアプリの<b>パッケージ名</b>(ContentProviderのauthorityではない)を明記しておく必要があった

``` xml:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.sample.content.client">

    <queries>
        <package android:name="com.sample.content.provider" />
    </queries>

    <application
        android:allowBackup="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Main">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
```

この記事によるとAndroid11で発生する模様
https://www.jianshu.com/p/631148c98ac2
php: 参照渡し

引数の変数に&を付けるとリファレンス渡しになる。
グローバル変数のように扱えるが可読性は悪くなる。

https://www.php.net/manual/ja/language.references.pass.php

## 値に参照
```php
function increment(&$var)
{
    $var++;
}

$a = 0;
increment($a);
echo $a; // 1

increment($a);
echo $a; //2
```

## また関数をリファレンス渡しすることもできる
```php
function increment(&$var)
{
    $var++;
    return $var;
}

function &reference()
{
    $a = 0;
    return $a;
}

$a = increment(reference());
echo $a; // 1
```

## 配列やオブジェクトの参照
少し面白い。
配列は参照できないが、objectは参照渡しできるみたい。

```php
function increment($arr)
{
    foreach ($arr as &$i) {
        $i++;
    }
}

$arr = [1,2,3,4,5];
increment($arr);
print_r($arr); // [1,2,3,4,5]

$obj = (object)$arr;
increment($obj);
print_r($obj); // [2,3,4,5,6]
```
【Java 条件分岐における数学との表現の違い】

現在独学でJavaを学習中です。
この投稿はその備忘録になります。

## 「数学の表現」と「条件式の表現」
`　「xは10より大きく、20より小さい」`を表現する時、
数学では、
```
10 < x < 20
```
となりますが、
Javaの条件式では、
```java
10 < x && x < 20
```
のように、`「xは10より小さい、且つ、20より大きい」`
となります。
E2Eテスト入門(Cypress紹介編)

## 目次
* 目的
* E2Eテストのメリデメ
* 導入
* Q & A
* 続けていくために

## 目的
* 自信を持ってリリースできるようになること
* 変更失敗率を下げる
* バグ発生時にMTTR(Mean Time To Recovery)を短縮する
* レビュー時に自動テストの内容を踏まえて確認することでレベルを上げる
* バグを起こしにくいコードを作る


## E2Eテストのメリデメ
### 導入して感じたメリット
* 全体に関わるようなnpmパッケージのアップデートの際に一通りのチェックができる
  - 例えばwebpackやatomicコンポーネントで使用しているライブラリなどをアップデートした際に、全体のUIが意図せず変わっていないかのテストを行うのはかなり大変
* 権限によって表示の有無が変わるようなUIのチェックが簡単にできる
  - 開発中いちいちユーザーを変えてログインしてチェックは結構面倒臭い
* ページをReactに置き換える場合に、テストを記述しておくことで動作確認の信頼性を上げることができる
* シナリオテストがあれば、それを走らせるだけでサービスの主要な部分のチェックだけでなく、どういうサービスなのかを追うことができるので新しくはいるメンバーのキャッチアップの手助けになる

### デメリット
* 実行のコストが大きい
* 自動で実行されるような環境を構築しておかなければすぐにサボるようになってしまう。

=> サービスのクリティカルな一連の操作に関して、一つでも失敗すると影響が大きい処理についてのシナリオを書いておけば、デプロイによるな大きなミスは避けられるのでそこだけでも必ず実行しておくようにすれば良さそう

## 導入

```terminal
$ npm install -D cypress eslint eslint-plugin-cypress
$ npm run cypress open
```

ディレクトリ構造
```
.
├── fixtures
│   └── xxx.csv
├── integration
│   ├── xxx_spec.js
│   └── xxx_spec.js
├── plugins
│   └── index.js
├── support
│   ├── commands.js
│   ├── index.d.ts
│   └── index.js
└── tsconfig.json
```
* fixtures/にアップロード用のCSVやメディアのファイルを置いておく
* integration/にテストを書いていく
* support/によく使う処理をコマンド化して書いておく(ex: ログインとか)


## Q & A

#### テスト時間を短縮の工夫

基本はベストプラクティスに沿って不要な`cy.wait()`を入れないなど、遅くならないようにする工夫はありますが、テストケースが増えればそれだけ時間がかかるのはある程度覚悟が必要です。

#### 管理画面の全テストケースで毎回ログイン処理を記述していく必要はあるか

E2Eテストはただでさえ壊れやすいものなので、テスト間の依存関係はできるだけ減らすことが重要です。なのでログインは毎回行う方が良いです。テスト実行中に何度も行う必要がある処理は、APIを直接叩くようなコマンドを書いておけば実行時間を減らすことが可能です。
逆に、毎回ログイン画面にアクセスしてユーザー名とパスワードを入力して遷移するテストを行うというような「そのテストの実行がリリースの自信の向上に繋がらない」事態も避けるべきです。


#### E2Eテストの導入前に読んでおいて役に立つ書籍やブログなど

cypressのドキュメントは使い方ももちろんですが、思想やテストの書き方とそのメリデメなどもまとまっているので余力があるなら全体を通して読むと良いと思います。ただ、チームメンバーでベストプラクティスだけは読み合わせてから始めた方がスムーズに進むとは思います。

https://docs.cypress.io/guides/references/best-practices


#### Cypress のテストのためのサーバをモックできるか?

https://docs.cypress.io/guides/guides/network-requests

可能ではありますが、テストは自信を持ってリリースするための手段なので、どの部分をモックにするかなどは慎重に考慮する必要があり、クリティカルパスに関しては、きちんとサーバーと通信するようなコードを書くと良いと思います。

#### E2Eテスト専用のユーザを用意するのが良さそうか

各権限を持っているテスト用のユーザーは作成する必要があります。


#### CI環境の構築について

https://engineering.mercari.com/blog/entry/20201207-cypress-testrail-frontend-e2e-automation/

https://docs.cypress.io/guides/continuous-integration/github-actions


## テストを続けていくために

* テストを書く(コスト: 低)
  - どういうテストが必要かは書いてみて初めて気づくことも多い
* githubのPRテンプレートに入れてみる(コスト: 低)
* テストだけのPRを作成してみる
  - 機能を実装したら通るはずのテストを先に書いておく
* CI環境を作る(コスト: 高)
  - 完全なものを作るのは難しいので、とりあえずトリガーだけ作るところから初めてみたりする
11: 浮動小数点数の演算に注意, 代入演算子

<font color="pink"><h2>浮動小数点数の演算に注意</h2></font>

浮動小数点数を含んだ演算子は、時として意図した結果を得られない場合がある。

たとえば↓

```
<?php
print floor((0.1 + 0.7) * 10);
//結果: 7
```

floorは、少数点数を切り捨てるための関数。

この場合、(0.1 + 0.7) * 10で8なので、切り捨てても結果は8となるはずだが結果は7である。

これは浮動小数点数が、内部的に2進数で演算されるために発生する誤差。

10進数ではごく単純に表せる0.1という値ですら、2進数の世界では0.00011001100110011………という<font color="red">無限循環少数</font>となる。

結果として、(0.1 + 0.7) * 10も、内部的には7.9999999999999991118……………のような値となり、正しい結果を得られない。

このような問題を避けるには、任意精度数学関数を利用する。

例

```
<?php
①→ $add = bcadd(0.1, 0.7, 1);
$mul = bcmul($add, 10, 1);

print floor($mul);  //結果: 8
```

任意精度関数では、bcxxxxxという命令でもって加減乗除、剰余、比較などの演算を実施する。

bcadd（加算）

bcsub（減算）

bcmul（乗算）

bcdiv（除算）

bccomp（比較）

のような関数がある。

いずれも先頭から「左オペランド」「右オペランド」「小数点以下の桁数」を渡す。

よって①であれば「0.1+0.7を小数点以下1桁まで計算しなさい」という意味になる。

関数の呼び出しとなった分、コードは冗長になるが、確かに誤差が解消されていることが確認できる。

<font color="pink"><h2>配列の結合</h2></font>

加算演算子（+）は、配列の加算（結合）にも対応している。

<font color="blueviolet"> plus_array.php↓ </font>
```
$assoc1 = [
   ‘Apple’  => ‘Red’,
   ‘Orange’ => ‘Yellow’,
   ‘Melon’  => ‘Green’
];
$assoc2 = [
   ‘Grape’       => ‘Purple’,
   ‘Apple’       => ‘Green’,
   ‘Strawberry’  => ‘Red’
];

$result = $assoc1 + $assoc2;
print_r($result);
////////////////ここまでが①//////////////

$ary1 = [1, 3, 5];
$ary2 = [2, 3, 6];
$result = $ary1 + $ary2;

print_r($result);
////////////////ここまでが②/////////////
```

実行結果:

```
Array(
  [Apple]      => Red
  [Orange]     => Yellow
  [Melon]      => Green
  [Grape]      => Purple
  [Strawberry] => Red
 )

Array(
  [0] => 1
  [1] => 3
  [2] => 5
 )
```

ここで注意が必要なのは、加算演算子は、
<font color="red">左の配列に存在しないキーの要素を右の配列から取り出し、左の配列に追加する</font>
ということ。

つまり、右の配列に左の配列と同じキーがあった場合、その値は無視される。

この考え方を念頭に先ほどの<font color="blueviolet"> plus_array.php</font>の結果を見てみる。

まず①では、配列$assoc1と$assoc2とでキー’Apple’が重複しているので、$assoc2の「’Apple’ => ‘Green’」は無視される。

②では、そもそも配列$ary1も$ary2も数値キーとして0〜2を持った配列なので、配列$ary2の内容はすべて無視される。

特に②については、［1, 2, 3, 5, 6］のような結果を期待するかもしれないが、そうはならない。

<font color="green"><h1>代入演算子</h1></font>

左辺で指定した変数に対して、右辺の値をセット（代入）するための演算子。

何度も出てきた「=」演算子は、代表的な代入演算子の一つである。

また、代入演算子には、代数演算子やビット演算子などを合わせた機能を提供する<font color="green">複合代入演算子</font>も含まれる。

主な代入演算子

|演算子|概要|用例|
|:-:|:-:|:-:|
|=|変数などに値を代入|`$x = 10;`|
|+=|左辺と右辺を加算した結果を、左辺に代入|`$x = 5; $x += 2; → 7`|
|-=|左辺から右辺を減算した結果を、左辺に代入|`$x = 5; $x -= 2; → 3`|
|*=|左辺と右辺を乗算した結果を、左辺に代入|`$x = 5; $x *= 2; → 10`|
|**=|左辺を右辺で累乗した結果を、左辺に代入|`$x = 5; $x **= 2; → 25`|
|/=|左辺を右辺で除算した結果を、左辺に代入|`$x = 5; $x /= 2; → 2.5`|
|%=|左辺を右辺で除算した余りを、左辺に代入|`$x = 5; $x %= 2; → 1`|
|.=|左辺と右辺を連結した文字列を、左辺に代入|`$x = ‘Foo’; $x .= ‘Bar’; → FooBar`|
|??=|左辺が非nullならその値を、nullなら右辺の値を代入|`$x = 10; $x ??= 1; → 10`|
|&=|左辺と右辺をビット論理積した結果を、左辺に代入|`$x = 10; $x &= 1; → 0`|
|\|=|左辺と右辺をビット論理和した結果を、左辺に代入|`$x = 10; $x \|= 1; → 11`|
|^=|左辺と右辺をビット排他的論理和した結果を、左辺に代入|`$x = 10; $x ^= 1; → 11`|
|<<=|左辺を右辺の値だけ左シフトした結果を左辺に代入|`$x = 10; $x <<= 1; → 20`|
|>>=|左辺を右辺の値だけ右シフトした結果を左辺に代入|`$x = 10; $x >>= 1; → 5`|

複合代入演算子は、<font color="blue">「左辺と右辺の値を演算した結果を左辺に代入する」</font>ための演算子。

つまり、次のコードは意味的に等価である。
（●は、複合演算子として利用できる任意の代数/ビット/文字列を表すものとする）。

```
$i ●= $j ↔︎ $i = $i ● $j;
```

代数/ビット/文字列演算した結果を元の変数に書き直したい場合には、複合代入演算子を利用することで、よりシンプルにコードを記述できる。
[Ansible] Inventoryのipアドレスを書き換えたのに、実行時に反映されない場合の対処法。

# 状況

ansibleの実行対象を変更するべく、inventoryファイルのipアドレスをベタ書きで変更。

```
- XX.XXX.XXX.XXX
+ YY.YYY.YYY.YYY
```

いざansibleを実行すると、以下のエラーが発生。

```
TASK [Gathering Facts] *********************************************************
fatal: [XX.XXX.XXX.XXX]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host XX.XXX.XXX.XXX port 22: Connection timed out", "unreachable": true}
```

SSH接続ができないと言っているが、ipアドレスの変更が反映されていないのでそちらの問題だと思われる。

# 対応

色々試してみたところ、ホストにグループ名をつけることで解決した。

```
[hogehoge]
YY.YYY.YYY.YYY
```

playbookのhostの指定は、`all`でもグループ名でもどちらでも良い。

今度は無事に、ipアドレスの変更が反映された。
SafariはPDFがimgタグのsrc要素に指定できる！

これは知らなかったので、メモ的に。

WebブラウザはPDFの表示（別タブ）をサポートし始めて久しいのですが、imgタグに設定できるのは知りませんでした。普通にこんな感じ。

```html
<img src="tokyo.pdf" width="500px" />
```

そうするとPDFのサムネイル表示ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/a0bd97f6-6999-43ad-55d0-4278905314b0.png)

ちなみにChromeではできません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/6c5b2a53-49a3-13e7-59ca-8c1426dd05e0.png)

むしろ表示できてびっくりでした。

iOSのSafariでもいけますが、Androidで表示できないので使い道が難しいですね。
【Automation Anywhere】今日の日付でフォルダを作る - はじめてのAA

# 今日はこれを覚えよう！
今回は「今日日付でのフォルダ作成」を題材に、業務上の処理で非常に多く使う「今日現在の日付を文字列として取得する方法」を紹介したいと思います。

今日の日付はA360事前定義済みのシステム変数「System:Date」(Date型)で簡単に取得可能ですが、フォルダ作成で使用する際には文字列型への変換と日付フォーマット形式の指定が必要となります。

ここでは、下記手順で今日日付のフォルダを”yyyyMMdd”形式（例：20220308）で作成します。
　①システム変数「System:Date」を文字列変換し変数に代入
　②今日日付を代入した変数を用いてフォルダ作成

# 作り方

[Botの作成画面を起動](https://qiita.com/IQ_Bocchi/items/27a23969bcb4917824ec)します。

## ①システム変数「System:Date」を文字列変換し変数に代入
まずシステム変数「System:Date」で今日日付を取得し、”yyyyMMdd”形式で文字列型変数に代入します。

「アクションを検索」の入力欄をクリックし、「日時」と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517299/f455be26-8208-ed6c-b479-edde7c34847b.png)


---
絞り込まれたアクションの中から、「文字列に変換」アクションを開始と終了の間にドラッグします。
その後、画面右側上部の「ソースの日時変数」欄で、システム変数「System:Date」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517299/96d4824f-8827-5216-2214-4158cde12617.png)

---
次に、「日時フォーマットを選択」欄で「カスタムフォーマット」のラジオボタンをONにして、「yyyyMMdd」と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517299/6e065241-d143-cbec-9447-5a26f6db2ae4.png)

---
最後に、「変数に出力を代入」欄で今日日付を代入する任意の文字列型変数を選択します。
※今回は簡便的に事前定義済み変数「prompt-assignment」を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517299/bfb9f5f4-ef4f-41ce-571a-105232ea8226.png)

## ②今日日付を代入した変数を用いてフォルダ作成
「フォルダー」パッケージの「作成」アクションを検索し、①で設定した「文字列に変換」アクションの後にドラッグします。
その後、画面右側の「フォルダー」欄で、作成先のフォルダパスを入力のうえ、今日日付を代入した文字列型変数（今回は「prompt-assignment」）を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517299/00a98603-0b70-ae03-5a5a-b12550e3ef18.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517299/69c8ae48-136d-aa76-616d-7e620f6b5b0c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517299/f4bfb10b-685f-57b0-8390-c7ec4f34a09a.png)

---
「保存」をし「実行」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517299/236d034a-e4eb-5089-1903-85fd05196eae.png)

---
Botの正常終了を知らせる「キラキラ」が表示されるので「閉じる」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517299/d5e0b5b7-13fa-4c60-ad08-d45cc9c42afc.png)

---
指定した場所に今日の日付のフォルダが”yyyyMMdd”形式で作成されています。
<イメージ挿入>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517299/19725035-c305-81a0-7c80-387ff4d849cb.png)

# この演習で学んだこと
今回はシステム変数「System:Date」を使用し「今日の日付でフォルダを作る」流れを学びました。

作成時のポイントとしては、下記になります。

- 今日日付の取得ではシステム変数「System:Date」が使用できる
- システム変数「System:Date」はDate型のため、フォルダ名やファイル名で使用する際は文字列変数への変換・代入が必要
- 文字列変換の際には日時フォーマット（今回は"yyyyMMdd"形式）を指定

いかがでしたでしょうか？「今日現在の日付を文字列として取得」は実務上非常によく使う処理かと思いますので、ぜひ練習してみてください。
手数は多く感じますが、実際のところ使うアクションは非常に少なく、慣れてくるととても素早く日付文字列が取得できるようになります。

また、日付の文字列変換の際に、今回はカスタムフォーマットを使っていますが、規定のフォーマットに希望するものがあれば、そちらも利用できます。​
今回”yyyyMMdd”と入れている個所を”yyyy年MM月dd日”としたり”yy年M月d日”とするなど、フォーマット形式も色々試してみてください。

# もっと知りたい！　学びたい！

この記事を読んで、「Automation 360 の使い方をもっと知りたい！」と思った方は、以下のシリーズをチェックしてみてください。

Automation360の基礎知識や使い方を、わかりやすくまとめたシリーズで、この記事もシリーズの１トピックとなっています。

https://qiita.com/IQ_Bocchi/items/8d28f12256037b5f9058

Automation Anywhere を使い始めたばかりの方はもちろん、これから使ってみようと思っている方や、ずっと使っているけど改めて基本を学びたい方などは、ぜひチェックしてみてください！
useSWRで躓いた話

# そもそもuseSWRとは？
**キャッシュからデータを返し、次にフェッチリクエストを送り、最後に最新のデータを持ってくる**という処理を行なってくれるもの。APIを通してデータの取得やキャッシュを簡単に記述する手助けをしてくれます。

## 使い方
```
npm i swr
```
でインストールし、ファイルの頭で宣言します。
```
import React from 'react'
import useSWR from 'swr'

export default function Home() {
  const fetcher = (...args) => fetch(...args).then(res => res.json())
  const { data } = useSWR('/data.json', fetcher)

  return (
    <div>
      <div className="alert alert-primary text-center">
        <h5 className="mb-4">
          {data != undefined ? data.message : 'error...' }
        </h5>
        <table className="table table-dark">
          <thead>
            <tr><th>Name</th><th>Mail</th><th>Age</th></tr>
          </thead>
          <tbody>
            {data != undefined ? data.data.map((value, key)=> (
              <tr key={key}>
                <th>{value.name}</th>
                <td>{value.mail}</td>
                <td>{value.age}</td>
              </tr>
            )) : <tr><th></th><td>no data.</td><td></td></tr>}
          </tbody>
        </table>
      </div>
    </div>
  )
}
```
上記では外部にdata.jsonというファイル名のものを用意しています。

```
{
    "message": "This is sample JSON data.",
    "data": [
      {"name":"Kevin", "mail":"kevin@abc", "age":39},
      {"name":"Baba", "mail":"baba@opq", "age":28},
      {"name":"Farmhouse", "mail":"farm@happy", "age":17}
    ]
  }
```

**ここで大事なのは**
```
const fetcher = (...args) => fetch(...args).then(res => res.json())
```
**ネイティブの fetch をラップした fetcher 関数を定義してあげて、	useSWRの第二引数にfetcherを指定してあげることで使用することができます。**

# 最後に
Next.jsの勉強中にuseSWRで躓いてしまったので、記録として残しておこうと思い、今回作成しました。
Next.js,楽しいですね。
bitcoin的gossip协议效率如何呢

翻译自 http://gavintech.blogspot.com/2015/09/how-efficient-is-bitcoins-gossip.html

无论是现在还是将来, 你运行一个完全的有效的节点需要多大的带宽呢?
bitcoin 广播区块和交易的p2p网络是一个gossip网络:
节点是半随机的连接到对方, 信息(交易, 区块, ip, 每个区块的洋葱地址 和 很少的警报信息)淹没在整个网络中.

有许多关于gossip 协议的理论研究, 比如 [On the bit communication complexity of randomized rumor spreading](http://pages.cpsc.ucalgary.ca/~ggiakkou/papers/spaa10_rumor.pdf)

> We investigate the number of communication bits required for rumor spreading. 
On the lower-bound side, we establish that any address-oblivious algorithm taking O(lg n) rounds requires Ω(n (b+ lg lg n)) communication bits to distribute a rumor of size b bits. 
On the upper-bound side, we propose an address-oblivious algorithm that takes O(lg n) rounds and uses O(n(b+ lg lg n lg b)) bits. 
These results show that, unlike the case for the message complexity, optimality in terms of both the running time and the bit communication complexity is attainable, except for very small rumor sizes b << lg lg n lg lg lg n.


结论是: gossip网络能很好的通过网络中节点的数量收缩.
从理论上讲，网络中的每一个节点都将接收到b字节的消息，加上通信开销, 可以很好地扩展。
比如, 一个 gossip 网络有 10,000个节点发送500字节的信息, 理论的上限  每个消息的通信开销 是 `lg lg 1000 * lg 500*8`或 `18.4 bits` , 少于3 字节,
扩大到 一百万的节点, 开销是 `21.8 bits`, 仍然少于3字节.

每个节点 通信503字节的数据 得到 500字节的信息给每个人在网络上.
这是理论情况, 实际上 在已存在的bitocin p2p网络上 效率如何呢?

我在主网络上的虚拟机中运行了模拟试验，并测量总体带宽使用情况 (使用 iftop),
初步结果(我需要更长时间的测试并确认数据是可重现的):

1个连接节点
11.1MB 在 3567秒

最近几天平均的块大小已经很接近了 0.7MB, 在1个小时内 运行测试, 我预计 交易跟区块一共 是4MB 或者8MB.
从两次传输交易的数据中得到 100%的开销之上，还有50%无法解释的开销。

8个连接节点
28.8MB 在 6392 秒

这不是坏情况也不是最好的, 8倍的连接数量意味着多了 50%的带宽使用量.

如果使用一个简单的泛洪算法(得到数据, 把它发送给我的所有节点), 带宽使用量将是1个连接情况的7倍.
但是一个更有效率的 rumor-spreading 算法, 将每个点的开销降至接近于零的水平。

它意味着 "你运行一个完全的 有效的节点需要多大的带宽呢"的答案是复杂的,
当前的 区块大小, 如果你运行 `-maxconnections=1`的配置, 每个月至少使用9GB的流量.

我仍需要测试 连接的节点使用了多少带宽,
[statoshi.info](https://statoshi.info/dashboard/db/bandwidth-usage) 是一个长期运行的节点, 有超过100个连接, 每月使用大约350GB的流量.
远超过我的预期, 可能ta是个长期运行的快速连接的节点,传送更多的数, 或者将大量原始块数据提供给新节点.

 
我的待办测试列表:
- 记录bytes-per-network-message 的统计, 查看带宽开销来自哪 (重复的inv消息 或 addr消息)

- 重复试验, 运行更长的时候和 1/8/16/32的外部连接

- 记录模拟交易(可能是 replayed-from-the-main-network 交易) 和 8MB的 `regtest`区块, 或者测量 [btcsim: simulating the rise of Bitcoin](https://blog.conformal.com/btcsim-simulating-the-rise-of-bitcoin/) 带宽使用情况

- 运行一个连接到Matt的快速中继网络的节点，测量带宽，看看它的算法离理论极限有多近。


**Gavin Andresen 发布于 2015-09-10**

---

参考:
https://en.wikipedia.org/wiki/Gossip_protocol
http://kaiyuan.me/2015/07/08/Gossip/
https://www.nomadproject.io/docs/internals/gossip.html
【AWS】EC2内のDockerでcomposer insatllしようとしたときに失敗した話

# はじめに

EC2内部でDockerが動作している環境で、composer install をしようとしたときに遭遇した問題のメモ


# 問題

```
-bash: cannot create temp file for here-document: No space left on device
```

上記が出た。調べてみると、


```
[ec2-user@hoge-web01 ~]$ df -h
/dev/nvme0n1p1  8.0G  8.0G   20K 100% /
127.0.0.1:/     8.0E   17M  8.0E   1% /hoge/storage
```

EC2にアタッチしているEBSが悲鳴を上げていた。

# 原因調査

何のファイルが悪さをしているのだろうとみてみると

```
[ec2-user@hoge-web01 ~]$ sudo du -k / | sort -n | tail -10
852348  /var/log/journal/hogehogehoge
1142784 /var/lib/docker/overlay2/hogehogehogehogehoge/merged
1701636 /var/lib/docker/overlay2/hogehogehogehogehoge

```

「docker/overlay2」と「journal」が悪さをしていた。
つまりログですね。


```
[ec2-user@hoge-web01 ~]$ sudo du -sh /var/lib/docker/overlay2/
5.2G    /var/lib/docker/overlay2/
```

アメイジング。



# 解決


まずjornalを対応しようということで

```
[ec2-user@hoge-web01 ~]$ journalctl --disk-usage
Archived and active journals take up 832.3M on disk.
```

数MBえいや。


```
[ec2-user@dev-taxinext-web01 ~]$ sudo journalctl --vacuum-size=100M

・・・

Deleted archived journal /var/log/journal/hogehoge.journal (8.0M).
Vacuuming done, freed 712.3M of archived journals on disk.
```

ちょっと消えている。

```
[ec2-user@dev-taxinext-web01 ~]$ journalctl --disk-usage
Archived and active journals take up 120.0M on disk.
```

dockerコンテナにログインして、composer install



```
root@hoge:/hoge/web# php -d memory_limit=-1 $(which composer) install
```

無事通ってくれました。

# ちなみに

「docker/overlay2」も悪さしていたのですが、これは無駄なdockerコンテナが動作していることが原因でした。

docker buildやpullしたときに増えるみたいです。
以下の記事が鬼分かりやすいので、参考に。

https://www.creationline.com/lab/35518



# 余談

この時、実は、EBSそもそも小さいよねってことで、16GBにEBSを増加させています。（journal消した後に）

```
FAILED: failed: sfdisk --list /dev/nvme0n1
```

などと言われたりしていたので、
以下とかの記事を参考にさせていただきながら、解消しました。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/ebs-volume-size-increase/
https://tech.innovator.jp.net/entry/expand-nvme-ebs
https://qiita.com/snaka/items/44dbe2cba8b63c3faa5a
入力チェック

+ 必須(空欄不可)
+ 文字種
 + 半角数字
 + 半角英字
 + 半角カナ
 + 半角記号
 + 全角数字
 + 全角英字
 + 全角記号
 + 全角ひら
 + 全角カナ
 + 全角漢字
 + 外字
 + 環境依存文字
+ 相関チェック
 + 登録日は今日以前でないといけない
 + ある期間内で検索するときには開始日が終了日以降になってはいけない。
 + 
+ 文字数
[Stripe Updates]JP_Stripes What's new 2022/02で紹介したStripe Updateまとめ

# JP_Stripes What's newとは？

Stripeのユーザーコミュニティ"JP_Stripes"で、2－3か月に1回の頻度で開催している、オンラインミートアップの１つです。
Stripeで直近にリリースされた新サービス・新機能について、３０分程度で網羅的に紹介するセッションを行っています。

配信は2022/1現在、Facebookグループ内で行われています。
視聴・参加にはグループへの参加が必要ですので、ご注意ください。

https://www.facebook.com/groups/jpstripes

# 2022/1-2のStripe Update Pickup

https://speakerdeck.com/stripehideokamoto/jp-stripes-whats-new-202202

前回のStripe What's new以降にあったアップデートのうち、日本のユーザーへの影響がありそうなものをピックアップしました。

## 機能追加・軽微な更新

### Payment LinksのAPIサポート開始

ノーコードで支払いリンクを作成できる、Payment Linksを管理するためのAPIが登場しました。

https://qiita.com/hideokamoto/items/0cb83f1e4000eb6c0131

これにより、Zapierをはじめとするノーコード・ワークフローツールなどとの連携が容易になります。

https://qiita.com/hideokamoto/items/9bf47fdeaf21eb950faf

また、Webhookと組み合わせることで、設定の監査を行うことも可能です。

https://qiita.com/hideokamoto/items/53fc8c527fe80ba1538a

### Checkout / Payment Links共通の機能アップデート

#### 決済ページのフォントやボタン形状のカスタマイズをサポート

https://qiita.com/hideokamoto/items/0fca21987e5875d91258

#### 商品の数量を顧客が変更可能に

https://qiita.com/hideokamoto/items/bc990f9211ede447b74e

#### アップセル・クロスセルのサポートを開始

https://twitter.com/StripeJapan/status/1499584663941435394

https://qiita.com/hideokamoto/items/dcb11d03b3fe5516c4ba


### Checkoutの機能アップデート

#### ゲスト顧客による注文のサポート

https://qiita.com/hideokamoto/items/783cd6fef5759aaf1505

#### カートの中身を取得するための`listLineItems` APIの追加

https://qiita.com/hideokamoto/items/565e3fbba33885be726e


### ダッシュボードログインユーザーの権限設定がより柔軟に

https://qiita.com/hideokamoto/items/c52961fd536968183a20

### Customer Portalからサブスクリプションをキャンセルした場合に、アンケートが実施可能に

https://qiita.com/hideokamoto/items/41381832f806619e9be6

## Newリリース

### コンビニ決済のサポートを開始

ローソン・ファミリーマート・セイコーマート・ミニストップを利用して料金を支払うことができるようになりました。

https://twitter.com/StripeJapan/status/1499263869742874625

１回きりの決済だけでなく、サブスクリプションやマーケットプレイスなどでも

https://qiita.com/hideokamoto/items/c59c4c4ee24b98ac997b

https://qiita.com/hideokamoto/items/605096153bdf473895f0

https://qiita.com/hideokamoto/items/f0304cb005f276e35d43



## プレビュー募集中

現在ドキュメントサイトなどでプレビュー申請を募集している機能を紹介しました。

### Search API

Stripeのデータを柔軟に検索することができるAPIです。

https://stripe.com/docs/search-api

## その他

## Stripe Tiny Demo

StripeのAPIや製品の機能を簡単にテストすることができるページが登場しました。

https://stripe-tinydemos.glitch.me/

Glitchアカウントがあれば、デモコードを変更したりしてカスタマイズすることなども可能です。

## Developer Digestの日本語化

英語で毎月配信されている開発者向けニュースレター(Developer Digest)の日本語化を開始しました。

https://qiita.com/tags/stripedeveloperdigest

メール配信後にQiitaに日本語化した記事を公開しています。

# JP_Stripes FBグループに参加して、最新イベント情報をGETしよう！

Stripeのユーザーコミュニティ「JP_Stripes」は、Facebookグループにてユーザー同士のコミュニケーションやオンラインイベントの開催、Stripeによる最新情報のオンライン配信などを行っています。

次回のコミュニティイベント情報などの情報も入手できますので、ぜひご参加ください。

https://www.facebook.com/groups/jpstripes
Laravelで現在表示中の記事(News)の前後のIDを簡単に取得する。

## NewsやBlogの詳細ページの前後のデータをDBレコードから取りたい

ニュースページや、Blog機能を作成したときに、
サイト導線として、前後の記事のリンクを作成したときに、
どうしたら良い？って思ったとき、簡単に見つける方法があります。


## DBのテーブル見本
URLでは、ID３の記事を表示しているとします。
|id(主)  |status  |title  |content  |public_at  |updated_at  |created_at  |
|---|---|---|---|---|---|---|
|1  |1  |タイトル1  |記事の内容  |2022-01-01  |2021-12-31 10:00:00  |2021-12-31 10:00:00  |
|2  |1  |タイトル2  |記事の内容  |2022-01-10  |2022-01-05 10:00:00  |2022-01-05 10:00:00  |
|3  |1  |タイトル3  |記事の内容  |2022-01-20  |2022-01-10 10:00:00  |2022-01-10 10:00:00  |
|4  |1  |タイトル4  |記事の内容  |2022-01-31  |2022-01-20 10:00:00  |2022-01-20 10:00:00  |

※status 1は公開、0は下書きとします。
※今日の日付は、2０２２年2月15日とします。

## Controller
コントローラにて、簡単に前後の記事IDを探してこれます。
現在表示中の記事の公開日より、新しいか古いかをWhere条件に含め、並び順のorderByで探し当てるのがPOINT!です！！
```php:Controller
    /**
     * NEWS
     * @return Factory|View
     */
    protected function news_details($id)
    {
        //日付が公開日が、今日より前で、ステータスが公開ステータスの記事を取ってくる。
        //Newsは、Eloquent Modelです。
        $news_contents = News::where([['public_at', '<', Carbon::now()],['status',1],['id',$id]])->first();
        //条件に満たない記事のidの場合、404ページを表示
        if(blank($news_contents)){
            abort(404);
        }


        //現在表示中の記事の1つ前の記事（リンク先を作りたいからselectでidのみ取得)
        $news_contents_prev = News::select('id')->where([['public_at', '<', Carbon::now()],['status',1],['public_at', '<', $news_contents->public_at]])->orderBy('public_at', 'desc')->first();
        //現在表示中の記事の1つ後ろの記事（リンク先を作りたいからselectでidのみ取得)
        $news_contents_next = News::select('id')->where([['public_at', '<', Carbon::now()],['status',1],['public_at', '>', $news_contents->public_at]])->orderBy('public_at', 'asc')->first();

        return view('front.page.news-details', [
            //現在のコンンテンツ
            'news_contents' => $news_contents,
            //レコードが存在しない場合はNULLを渡す
            'prevID' => (!blank($news_contents_prev))?$news_contents_prev->id:null,
            'nextID' => (!blank($news_contents_next))?$news_contents_next->id:null,
        ]);
    }
```

## おわり
これにて、Viewにデータを渡してあげれば、前後の記事のリンクを作成することができます。
以上になります。他にも自分のやりたい条件に合わせて、参考にしていただければ良いかと思います。
npx create-react-appでディレクトリが作れなかった件

いつものようにnpx create-react-app myappを実行しようとしたところ、以下のエラーが出てきてしまいました。

```
You are running `create-react-app` 4.0.3, which is behind the latest release (5.0.0).

We no longer support global installation of Create React App.

Please remove any global installs with one of the following commands:
- npm uninstall -g create-react-app
- yarn global remove create-react-app

```

言われた通り、

```
npm uninstall -g create-react-app
```

を実行しても全く変わらず。というかすでにアンインストールされています。yarnもそもそもインストールしていません。

続いてよく出てくるキャッシュをクリアする方法も試しました。下記をターミナルで実行するとできます。。
もしかしたらこれで直る方もいらっしゃるのではないでしょうか？私はダメでした.....。

```
npx clear-npx-cache
```

### 結論

下記を実行したらできました！

```
npm audit fix --force
```
markdown 特殊语法

## 下标、上标、注音符号

`H<sub>2</sub>O`  H<sub>2</sub>O
`H<sup>+</sup>` H<sup>+</sup>
`注音符号<sup>[1]</sup>`  注音符号<sup>[1]</sup>


## github summary 语法

```html
<details>
<summary>点击查看文件内容</summary>
<br/>
xxxxxxxxx
</details>
```

## markdown表格

| 左对齐标题 | 右对齐标题 | 居中对齐标题 |
| :------| ------: | :------: |
| 短文本 | 中等文本 | 稍微长一点的文本 |
| 稍微长一点的文本 | 短文本 | 中等文本 |

```
| 左对齐标题 | 右对齐标题 | 居中对齐标题 |
| :------| ------: | :------: |
| 短文本 | 中等文本 | 稍微长一点的文本 |
| 稍微长一点的文本 | 短文本 | 中等文本 |

```

---

参考：

https://jmalarcon.github.io/markdowntables/
python2 中类似ruby each_slice的实现

```python
def each_slice(arr, n):
    return [arr[i:i + n] for i in range(0, len(arr), n)]

print(each_slice([1, 2, 3, 4, 5], 2))
print(each_slice([1, 2, 3, 4, 5], 3))
print(each_slice([1, 2, 3, 4, 5], 4))
# => [[1, 2], [3, 4], [5]]
# => [[1, 2, 3], [4, 5]]
# => [[1, 2, 3, 4], [5]]
```
---

参考：

https://cortyuming.hateblo.jp/entry/2016/07/15/161538
Fping：Linux的高性能Ping工具

fping是一个主机扫描工具，相比于ping工具可以批量扫描主机。

### 常用参数

```
-a：只显示存活主机
-u：只显示不存活主机
-l：循环ping
```

### 例子

```
fping ip1 ip2 ip3 ...
fping -f filename
fping -g ip1 ip2 (ip1地址开始范围，ip2地址结束范围)
```

---

参考：
https://www.cnblogs.com/ym123/p/4549579.html
https://www.howtoing.com/ping-multiple-linux-hosts-using-fping
電子書籍：データブリックス クイックスタートガイドを出版します！

日本初のデータブリックス本を出版します！3/14(月)ホワイトデーの発売です。

**Amazon.co.jp: データブリックス クイックスタートガイド**

https://www.amazon.co.jp/dp/B09V1YXFVQ?1

# まえがき(抜粋)

日本初のデータブリックス(Databricks)の書籍を刊行できることを大変嬉しく思っています。

皆様がデータとAIから価値を産み出す支援をすることを目的として、我々データブリックスはレイクハウスプラットフォームを提供しています。レイクハウスの国内での採用は進んでおり、データブリックスの国内での認知は高まりつつあると思いますが、日本語の情報が不足していることを常々痛感していました。

「データブリックスって聞くけど、一体どういうものなのだろうか」と思われている方、データブリックスを触り始めた方を対象として、データブリックス・ジャパンのエンジニアの有志で本書を執筆しました。本書をご一読いただければ、データブリックスとは何か、データブリックスをどのように使うのかを一通り理解できる内容となっています。データとAIを活用して業務を変えたい、機械学習モデルを本格的に運用することを前提としてデータ/AI基盤を構築したいと考えられている方に本書が一助になれば幸いです。

# 目次

これ以外にもコラム、用語集などが含まれています。

## 1章 Databricks(データブリックス)とは？

最初の章では、データブリックスとは何？レイクハウスって何？という疑問に答えます。

1. はじめに
2. 背景
3. レイクハウスの誕生
4. データブリックスとは
5. コンセプト
6. アーキテクチャ
7. 主要機能
8. コスト

## 2章 データブリックスのセットアップ

データブリックスは主要クラウド上にセットアップすることができます。本章ではデータブリックスの構築手順をご説明します。

1. データブリックスのセットアップ - AWS
2. Azure Databricksのセットアップ
3. データブリックスのセットアップ - Google Cloud

## 3章 データブリックスを使ってみる

データブリックスの利用を始める際に理解する必要がある、ユーザー・グループ管理、クラスター、ノートブックなどを説明しています。

1. データブリックスのユーザー・グループ
2. Databricksクラスター
3. Databricksノートブック
4. データブリックスのジョブ

## 4章 ユースケース別ガイド

データブリックスでは、データエンジニアリング、機械学習、BIといった様々なユースケースに対応できます。本章ではサンプルノートブックを通じて様々なユースケースを体験いただきます。

1. データエンジニアリング
2. 機械学習
3. BI

## 5章 ツール連携

データブリックスでは、サードパーティの提供するバージョン管理システム、BIツールなどと容易に連携することがd系ます。

1. Repos
2. Partner Connect

## 6章 MLOpsの実現に向けて

本章ではデータブリックスが目指すMLOpsのあるべき姿を論じます。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
Mosh：一款替代SSH的远程登录软件

>![](https://upload-images.jianshu.io/upload_images/47789-02e9a7b067e25f55.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

### Mosh是什么

[Mosh](https://mosh.org/)表示移动Shell(Mobile Shell)，可以说是 SSH 的 mobile 版本。
**Mosh最大的特点是基于UDP方式传输**，支持在服务端创建一个临时的Key供客户端一次性连接，退出后失效；也支持通过SSH的配置进行认证，但数据传输本身还是自身的UDP方式。

### SSH的问题

SSH 作为一个远程访问协议，在提出时是为了解决 telnet 的安全性。在 20 多年后(SSH 在 1995 年由 Tatu Ylönen 提出)，它已经成为了远程shell 访问的事实标准。

SSH 采用了 TCP， TCP 在 SSH 设计之初是最好的选择。TCP 提供的特性(面向连接、可靠)简直就像量身定制。但是在现在，这种面向连接的设计却不够灵活了：TCP 的有状态连接使得设备在切换网络，或连接因其他原因断开的时候，就会丢失整个 session 无法恢复。

### Mosh 要解决什么问题

- 解决漫游时连接中断问题。当然不仅仅是漫游的问题，还有电脑休眠、无线网闪断等情况。以前的方式是使用 screen 或 tmux。

- 解决了回显慢的问题。这一点尤为重要。一般的 term 所有输入和输出都需要与远程服务器交互，甚至每次敲击键盘的回显也是由远端的 shell 进程控制。mosh 客户端使用代理，对大部分可以预测的回显，直接在本地完成。这一改进意味着以后登陆一个网络很大的服务器，输入命令时不再等待每个字符回显，而可以一口气写下来，由 mosh 去同步命令。

- ......

### 使用

服务端：

```cpp
mosh-server -p 3000 #启动 3000 端口

#MOSH CONNECT 3000 PoLSHfJxwzQ7EcxgdIcmvA
```

客户端：

```cpp
MOSH_KEY=PoLSHfJxwzQ7EcxgdIcmvA mosh-client 1.1.1.1 3000
```

---

参考：

https://zhuanlan.zhihu.com/p/28414523
https://www.hi-linux.com/posts/23118.html
https://blog.yangl1996.com/post/mosh-the-ssh-replacement/
https://my.oschina.net/hao7234/blog/358217
https://github.com/mobile-shell/mosh/issues/1039
初心者ブロックチェーンに挑戦する　7

# 通学路じゃないところを通って学校に行くのが好きな子どもの話

## ともかく行ければいいじゃないか　という

　糖分を補給した脳みそで、決めたことは

-コンフリクトして直せないとき、いったんチャラ〜、といいつついつもやっている手を使う。

　それはなにかという

-zip fileをダウンロードする
-解凍されたフォルダを好きなとこにD&D

　フォルダの名前を修正するのを忘れたので、ちょっとテキストと違うことになってしまったが、それさえ考慮に入れれば、これで先に進める。のちのちpushしたいとかになったらつなぎ直さなきゃならないが、今は先に進むほうを優先する。

-npm install
-npm run start

　無事、ローカルにWEBサイトが表示される。
　MetaMaskは導入済みだからlesson1 終了。

## ときどき猛烈に腹が立つこと

　引き続きlesson2は本番環境構築･･･また本番か･･･でも今回は現在進行形のガイドがついているから大丈夫だろう。
　まず Alchemyを導入

-Alchemyは世界中のトランザクションを一元化しマイナーの承認を促進するプラットフォームです。

　マイナーさんも迷惑だよなあ、たださえ大量の承認事項があるのに、このな素人の勉強にもつきあわされちゃ。

　それにしても、次から次と、いろんな場所に足跡を付ける。思えば1980年代から、どれだけのホームページやらブログやら、つくっては放置し、つくっては放置してきたことか。そういう残骸たちは、どこかのは岩場に打ち寄せられたり、深海に沈んだりしているんだろうか。無事この世から消えてなくなってくれてることを望むけれど、先日友だちに[WaybckMachine](https://archive.org/web/)というサイトを見せられて、恐ろし懐かし、大昔のサイトにご対面した。いやあ、こういうの止めてもらいたい。

　でもためらっている暇はない。午後はやらなきゃならないことがある。
　ああ、テストネットを使うのね。そうよね、あんまりにも迷惑だものね。そして偽のイーサを手に入れるのね。おもちゃのお金ね、子どもみたいにね。

　が、ここでまた詰まった。その場ですぐ0.1ETHくれるとというおもちゃの銀行が、私のウォレットを認識しない。散々駆けずり回って、12時の鐘が鳴るぞ、UNCHAINの魔法が解けるぞ、というところで気がついた。

-テキストから飛んだリンクはSafariで開いていた。

　Macユーザーとしてときどき猛烈に腹が立つことは、Safariはサポートしていません、と言われることだ。だからもちろんGoogleChromeも入れているし、さっきウォレットのアドレスを確認したときには、ちゃんとGooglChromeを開いたのだ。だけど、Discordからテキストに、テキストからおもちゃの銀行に飛んだときは、デフォルトのSafariが開いていた。

-MetaMaskはSafariをサポートしていません。

　それに気づくだけのこと。それだけのことに時間を費やして、できた、0.1ETHのおもちゃのお金。12時の鐘が鳴る、ガラスの靴、両方とも脱げる勢いで、本日は終了。

## ヤだ〜、section-2、終わってない(>_<)
把玩 javascript AST

>![ast](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/36272008-bd5a-c043-4569-7261a982317e.png)


https://github.com/jquery/esprima 从JavaScript源代码形成AST 

https://github.com/estools/estraverse 遍历树的节点并修改 

https://github.com/estools/escodegen   把修改完的AST再次转化为源代码

---

参考：

https://astexplorer.net/ 神器，竟然还支持 solidity
http://jartto.wang/2018/11/17/about-ast
https://blog.fundebug.com/2019/01/22/how-does-javascript-compile/
https://segmentfault.com/a/1190000017992387
https://mp.weixin.qq.com/s/UYzwVRPFas6hwe2U7R0eIg
DNS 协议

http://www.cnblogs.com/chase-wind/p/6910434.html
http://liehu.tass.com.cn/archives/1052
https://www.cyberciti.biz/faq/unix-linux-dns-lookup-command/

---

参考：

https://blog.cyeam.com/network/2015/02/03/dns
https://github.com/mnhkahn/go_code/blob/master/dns.go
[DNS域名解析](http://wangxuemin.github.io/2015/09/04/go%20(golang)%20DNS%E5%9F%9F%E5%90%8D%E8%A7%A3%E6%9E%90%E5%AE%9E%E7%8E%B0/)
[dns 解析源码](http://wangxuemin.github.io/2015/09/04/go(golang)%20dns%20%E8%A7%A3%E6%9E%90%E6%BA%90%E7%A0%81%20dnsclient_unix.go%20%E5%88%86%E6%9E%90/)
https://www.golangnote.com/topic/245.html
https://jameshfisher.com/2017/08/04/golang-dns-server/
https://medium.com/@owlwalks/build-a-dns-server-in-golang-fec346c42889
WebAuthn

>![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/cb9b6286-7e6c-db77-aed4-4d3dcd17e191.jpeg)


---

参考：

https://webauthn.io/

https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Authentication_API

https://thehackernews.com/2020/06/webauthn-passwordless.html
Javaを使用してWord文書の透かしを追加と削除する方法

Wordには、テキスト透かしと画像透かしの2種類の透かしがあります。テキストの透かしは、ドラフトとか、機密とか、認定とか、現在のドキュメントの状態を示すことができることだけでなく、画像の透かしは、会社のロゴを指定するときに使用します。

この記事では、Javaおよび[Free Spire.Doc for Java](https://www.e-iceblue.com/Introduce/free-doc-for-java.html)コンポーネントを使用してテキストおよび画像の透かしをWord文書に追加する方法と、Word文書から透かしを削除する方法について説明します。

## Jarを追加します

開始する前に、jarファイルをインポートする必要があります。[Free Spire.Doc for Java](https://www.e-iceblue.com/Download/doc-for-java-free.html)をダウンロードして解凍し、Spire.Doc.jarパッケージをlibフォルダーからJavaアプリケーションにインポートします。

Mavenプロジェクトの場合、pom.xmlファイルにFree Spire.Doc for Javaへの依存関係を追加できます。

## 透かしを追加する

・テキスト透かし
Free Spire.Doc for Javaでは、TextWatermarkクラスを使用してテキストの透かしを操作します。テキスト透かしを作成するときに、フォント、フォントサイズ、フォントの色、透かしのタイポグラフィスタイルなど、テキスト透かしのプロパティをカスタマイズできます。

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

        //Wordテストドキュメントをロードする
        Document doc = new Document();
        doc.loadFromFile("Input.docx");

        //TextWatermarkインスタントを作成する
        TextWatermark textWatermark = new TextWatermark();

        //透かしのテキストを設定する
        textWatermark.setText("Do Not Copy");

        //カスタムテキスト透かしの属性設定する（フォント、フォントサイズ、フォントの色、タイポグラフィ）
        textWatermark.setFontName("Arial");
        textWatermark.setFontSize(30f);
        textWatermark.setColor(Color.BLUE);
        textWatermark.setLayout(WatermarkLayout.Diagonal);

        //テキスト透かしをドキュメントに追加する
        doc.setWatermark(textWatermark);

        //ドキュメントを保存する
        doc.saveToFile("TextWatermark.docx", FileFormat.Docx_2013);
    }
}
```
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/3037500d-2cb9-8bc4-8e97-0905e070b661.png)


・画像透かし

PictureWatermarkクラスは、画像の透かしを操作するために使用されます。透かし画像は、ローカル画像または別のプロジェクトで作成したストリームにすることができます。
import com.spire.doc.*;

public class ImageWatermark {

    public static void main(String[] args){

        //Wordドキュメントをロード
        Document doc = new Document();
        doc.loadFromFile("Input.docx");

        //PictureWatermarkインスタンスを作成する
        PictureWatermark imageWatermark = new PictureWatermark();
        //透かし画像を設定する（ローカル画像またはストリームからの画像にすることができる）
        imageWatermark.setPicture("C:\\Users\\Administrator\\Desktop\\PIC\\Logo.jpg");
        imageWatermark.isWashout(false);

        //透かし画像をドキュメントに追加する
        doc.setWatermark(imageWatermark);

        //ドキュメントを保存する
        doc.saveToFile("ImageWatermark.docx", FileFormat.Docx_2013);
    }
}
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/7b0ac462-8e5a-229d-fe9a-4408b0e764c0.png)

・透かしを削除する

doc.setWatermark（null）メソッドを使用すると、Word文書の透かしを簡単に削除できます。

```
import com.spire.doc.*;

public class RemoveWatermark {

    public static void main(String[] args){

        //Wordドキュメントをロードする
        Document doc = new Document();
        doc.loadFromFile("ImageWatermark.docx");

        //透かしを削除する
        doc.setWatermark(null);

        //ドキュメントを保存する
        doc.saveToFile("RemoveWatermark.docx", FileFormat.Docx_2013);
    }
}
```
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/9bebdd68-15ca-b6c8-4929-d1a7843f7f22.png)

今回のWord文書の透かしを追加と削除する方法は以上でした、最後まで読んでいただきありがとうございます。
JSXからReactコンポーネントに切り出せるVSCode拡張機能gleanが超便利

### 概要
Reactを書いていると 「ここコンポーネント化できそうだな..」 と後から切り出す事があると思います。そんな時におすすめなのが glean というVSCodeの拡張機能です！
gleanを導入することでJSXコードから自動でコンポーネントを作成することが出来ます。

### glean のインストール

以下から拡張機能をインストールしてください。

https://marketplace.visualstudio.com/items?itemName=wix.glean


### gleanの使い方

実際にページ内からコンポーネントを切り出す流れを紹介しようと思います。
以下のようなページがあるとして、ユーザーの情報を表示している箇所をコンポーネントとして切り出してみます。

```tsx
const Page = (): JSX.Element => {
  const user = {
    name: 'manaki',
    bio: 'ペンギンです',
  }

  return (
    <div>
      <div className="user">
        <h2 className="user__name">{user.name}</h2>
        <p className="user__bio">{user.bio}</p>
      </div>
      ...省略
    </div>
  )
}
```

コンポーネントとして切り出したい箇所を選択して電球マークをクリックしてください。
![スクリーンショット 2022-03-07 23.23.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442365/e977b907-dc5a-d331-3cd9-09bf01697cd0.png)

表示されるメニューから Extract Component to File を選択
![スクリーンショット 2022-03-07 23.24.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442365/2bb1a9a4-f2f5-41b9-7255-86a8a93d6b2e.png)

新しく作成するコンポーネントを配置したいディレクトリーを選択して Enter
![スクリーンショット 2022-03-07 23.28.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442365/8d1926b6-c95c-885f-9f5c-b8598ff23c59.png)

Create New File を選択
![スクリーンショット 2022-03-07 23.30.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442365/91945948-85f7-de2d-7844-f8976901558b.png)

①には選択したディレクトリーが自動で入力されるので、②コンポーネント名を入力してEnter
![スクリーンショット 2022-03-07 23.31.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442365/ec5df250-77a4-52a2-49a2-5dbfbd2f2372.png)

すると選択したディレクトリーにコンポーネントが作成されます！
![スクリーンショット 2022-03-07 23.34.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442365/13671949-11df-2721-4ff8-b79268d7588e.png)
![スクリーンショット 2022-03-07 23.36.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442365/86ecada6-c481-9f50-c7ed-5b0b6397a4f6.png)

切り出した箇所がコンポーネントに置き換えられている事も確認できると思います！
![スクリーンショット 2022-03-07 23.37.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442365/29661591-a644-af40-a0ba-5691dc695244.png)

glean には他にも色々な機能があるみたいなので是非試してみてください！

## 参考にした記事

glean - Visual Studio Marketplace
https://marketplace.visualstudio.com/items?itemName=wix.glean

10 React Antipatterns to Avoid - Code This, Not That! - YouTube
https://www.youtube.com/watch?v=b0IZo2Aho9Y&t=134s