OmniAICreator/Qiita-1.07M huggingface dataset:
多変量正規分布を二つのブロックに分けてgibbs sampling(ギブスサンプリング)する。

以下の多変量正規分布を考えます。
```math
\begin{pmatrix}
x_1 \\ 
x_2
\end{pmatrix} \sim N\left( \mu, \Sigma   \right) \\

\mu = \begin{pmatrix} \mu_1 \\ \mu_2 \end{pmatrix}、
\Sigma = \begin{pmatrix} \Sigma_{11} & \Sigma_{12} \\ 
\Sigma_{21} & \Sigma_{22}  \end{pmatrix}\\
```
このとき以下の条件付き確率がなりたちます( 以下に詳しい導出があります。https://qiita.com/m1t0/items/12b58f3583eab6e1e05c )。
```math
p(x_1 | x_2 ) = N( \mu_{1|2}, \Sigma_{1|2} ) \\
\mu_{1|2} = \mu_1 + \Sigma_{12} \Sigma_{22}^{-1} (x_2 - \mu_2) \\
\Sigma_{1|2} = \Sigma_{11}- \Sigma_{12}  \Sigma_{22}^{-1}\Sigma_{21} \\
```
以上の条件付き確率を用いて、以下のgibbs sampling(ギブスサンプリング)を行えます。
```math
x_1 \sim p(x_1 | x_2 ) \\
x_2 \sim p(x_2 | x_1 )
```
matlabでコードしたものを以下に示します。
```matlab
%
% 正規分布を二つのブロックに分割し、gibbs samplingします。
%
rng(4);
close all; clear all;

N = 10^5;


% 共分散行列を乱数で生成します。
X = randn( 4, 4 );
X = X'*X;

% 共分散行列をブロックに分割します。       
x11 = X(1:2,1:2);
x12 = X(1:2,3:4);
x22 = X(3:4,3:4);
x21 = x12';

% 散布図をプロットしてみます。
test1( X, x11, x12, x21, x22, N )

% gibbsサンプリングを行います。
xx = zeros( 1, 4 ); % 初期値
for i = 1:N
b = xx(end,3:4);
a = cd(  b, x11, x12, x21, x22 ); % 上半分をサンプリング
b = cd(  a, x22, x21, x12, x11 ); % 下半分をサンプリング
xx(end+1,:) = [ a b ];
end

subplot( 3, 3, 7 );
plot( xx(:,1), xx(:,2), '.' );
subplot( 3, 3, 8 );
plot( xx(:,3), xx(:,4), '.' );
subplot( 3, 3, 9 );
plot( xx(:,2), xx(:,3), '.' );

muhatx = mean( xx );
covhatx = cov( xx );

%
% 条件付き確率の計算
%
function a = cd( b, x11, x12, x21, x22 )
mu = x12 /( x22 )*(b');
cv = x11 - x12 /( x22 ) * x21;
a = mvnrnd( mu, cv );
end

%
% 多変量正規分布の散布図を部分的にグラフ表示
%
function test1(X, x11, x12, x21, x22, N)

mu = zeros( 4, 1 );
xs = [];
xs = mvnrnd( mu, X, N );
figure( 1 );
subplot( 3, 3, 1 );
plot( xs(:,1), xs(:,2), '.' );
subplot( 3, 3, 2 );
plot( xs(:,3), xs(:,4), '.' );
subplot( 3, 3, 3 );
plot( xs(:,2), xs(:,3), '.' );


muhat = mean( xs );
covhat = cov( xs );

%
% ためしに上半分と下半分を入れ替えてグラフ表示
%
X2 = [ x22 x21; x12 x11];
xt = mvnrnd( mu, X2, N );
muhat2 = mean( xt );
covhat2 = cov( xt );

subplot( 3, 3, 4 );
plot( xt(:,1), xt(:,2), '.' );
subplot( 3, 3, 5 );
plot( xt(:,3), xt(:,4), '.' );
subplot( 3, 3, 6 );
plot( xt(:,2), xt(:,3), '.' );

end

```
DyBNN論文読み

# はじめに

DyBNNの論文を読んだ要約です。
自分用にまとめたものなので、理解の漏れなどありましてもご容赦下さい。
また、より詳細な内容を知りたい場合は元の論文をご覧ください。

### DyBNNの概要
- 論文名: Dynamic Binary Neural Network by learning channel-wise thresholds
- 著者: Jiehua Zhang, Zhuo Su, Yanghe Feng, Xin Lu, Matti Pietikäinen, Li Liu
- 公開: 2021年10月8日
- URL: https://arxiv.org/abs/2110.05185

入力によって閾値とシフトパラメータを動的に生成できるDySign関数とDyPReLU関数を用いて、ReActNetのRSign関数とRPReLU関数を置き換えたBNN。モデルの表現能力が向上し、精度が向上した。

# ReActNet

- URL: https://arxiv.org/abs/2003.03488

ReActNetとは，BNNが入力の特徴分布に敏感であることに着目して、Sign関数の閾値とPReLU関数のシフトパラメータを学習可能なRSign関数とRPReLU関数を使用したBNN。RSign関数およびRPReLU関数は以下の式で表される。

```math

RSign(x_i) = \left\{
\begin{array}{ll}
+1 & (x_i \geq α_i) \\
-1 & (x_i \lt α_i)
\end{array}
\right.

```

```math

RPReLU(x_i) = \left\{
\begin{array}{ll}
x_i - γ_i + ζ_i & (x_i \geq ζ_i) \\
β_i(x_i - γ_i) + ζ_i & (x_i \lt ζ_i)
\end{array}
\right.

```

### 問題点

Rsign関数は事前に学習された静的な閾値を使用している。
しかし入力によっては最適な閾値が異なり、静的な閾値では特徴を捉えることが困難である場合がある。
下記の画像の場合、左から3番目がRSignを使用して特徴検出を行った例であり，(b)と(c)の画像の特徴をうまく捉えることができていないことがわかる。

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383380/797d2e35-24ca-0aa4-d034-34584600c45f.png)

## DyBNN
入力の特徴分布によって閾値を動的に生成可能なDySign関数とシフトパラメータを動的に生成可能なDyPReLU関数を使用したBNN。ReActNetで静的な閾値を使用していたために、特徴情報の損失を起こす問題を改善した。

DySign関数とDyPReLU関数の式自体はそれぞれRSign関数とRPReLU関数と同様である。
RSign関数やRPReLU関数では閾値やシフトパラメータを学習により決定していたが、DyBNNでは以下の式で表される。

```math

α = f(X) = FC^{\frac{C}{16}×C}(FC^{C×\frac{C}{16}}(GAP(X)))

```

ここで、αは閾値またはシフトパラメータ、FCは全結合、GAPはGlobal Average Poolingである。

### 評価
以下のデータセットと実装で評価

|項目|内容|
|---|---|
|データセット|ILSVRC12 ImageNet classification dataset|
|学習方法|2段階に分けて学習|
|最適化方法|Adam, 線形学習率減衰|
|初期学習率|5e-4|
|バッチサイズ|256|

### 結果

mobileNetV1ベースのDyBNNはTop1精度71.2%を達成。これはmobileNetV1ベースのReActNetと比較して1.8%の精度向上。

![スクリーンショット 2022-05-08 22.47.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383380/247a5d2b-4c78-c750-7277-1c9f5b398469.png)

# まとめ

BNNにおいて、入力に対して動的に生成可能な閾値やシフトパラメータを用いる手法は有効である。
CentOS Stream 9でCRI-Oを使ってKubernetesクラスターをつくる1 マスターノード

# サマリー
・サポート切れのCentOS8は使わない
・非推奨のDockerは使わない（って書いてるけど下のリンクは読んだほうがいい）

Docker非推奨に対する誤解
https://jaco.udcp.info/entry/2020/12/03/172843

・できるだけ新しい１．２４にしてみる
・今回はmasterとworkerをわけてちゃんとしたクラスターを組む

## OSインストールと設定
CentOS Stream 9
Serverだけでインストール

### rootのsshを許可
vim /etc/ssh/sshd_config
PermitRootLogin yes

### Firewall止める
systemctl disable firewalld.service
systemctl stop firewalld
sysctl -p

### SE Linux無効化
setenforce 0
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

### Swap無効化
swapoff -a
vi /etc/fstab
/dev/mapper/cl-swap     swap                    swap    defaults        0 0　#コメントアウト

### 自分を含めを名前解決できるようにする
vi /etc/hosts
192.168.1.1 master　#自分自身を名前解決できるようにする
192.168.1.2 worker2
192.168.1.3 worker3
192.168.1.4 worker4

## CRI-Oインストール
export OS=CentOS_8_Stream
export VERSION=1.24:1.24.0　#2022/5現在最新

curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/devel:kubic:libcontainers:stable.repo
curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$VERSION/$OS/devel:kubic:libcontainers:stable:cri-o:$VERSION.repo

yum install cri-o

systemctl daemon-reload
systemctl start crio


## kubeadmインストール
modprobe br_netfilter
lsmod | grep br_netfilter
sh -c 'echo "br_netfilter" > /etc/modules-load.d/br_netfilter.conf'

cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

systemctl enable --now kubelet

echo "KUBELET_EXTRA_ARGS=--cgroup-driver=systemd" >> /etc/sysconfig/kubelet

systemctl daemon-reload
systemctl restart kubelet

## kubeadmを使用したクラスターの作成

kubeadm config images pull
kubeadm init --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=10.(略）

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

#いらない
#export KUBECONFIG=/etc/kubernetes/admin.conf

### 1ノードクラスターにするときの大事なおまじない（書いたけど今回はやらない）
kubectl taint nodes --all node-role.kubernetes.io/master-


## ダッシュボード
https://github.com/kubernetes/dashboard/releases
1.24と互換性がない。

とりあえず入れてみる。
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml

kubectl get pod -n kubernetes-dashboard

今回はここまで。[次回はワーカーノード](https://qiita.com/tsurun2/items/71ef90db76df22b0cf3f)。
PostgreSQL　カラムの情報一覧を取得する方法

# はじめに

PostgreSQLを学び始めました。
KaggleのデータをPostgreSQLに入れて、いろいろ実験しています。

まずは、どのようなデータが格納されているのか、チェックしたかったのでスキーマについて調べてみました。

## スキーマとは?

スキーマはテーブルに紐付いているスコープのような概念です。
ディレクトリを設けるようにデータ間に仕切りを設けることで、命名の干渉や、参照できる権限を管理することができます。

ユーザーが作成するテーブルには、指定をしなければ、デフォルトでpublicというスキーマが定義されます。

[PostgreSQL 13.1文書 5.9. スキーマ](https://www.postgresql.jp/document/13/html/ddl-schemas.html#DDL-SCHEMAS-PUBLIC)

## カラムの情報一覧を表示

どんなテーブルがあり、どのような情報を格納しているのか一覧を出力する

以下のSQLを入力するとanimeというテーブルが持っている情報の一覧が取得できます。

```sql
SELECT
    *
FROM
    information_schema.columns
WHERE
    table_schema = 'public'
    AND table_name = 'anime'
;
```

## プライマリーキーの一覧を取得

```sql
SELECT
    *
FROM
    information_schema.table_constraints
WHERE
    constraint_type = 'PRIMARY KEY'
;
```

## 参考

[PostgreSQL 13.1文書](https://www.postgresql.jp/document/13/html/index.html)
[PostgreSQLのシステムテーブル入門　（暗記用のSQL集） - 主に言語とシステム開発に関して](https://language-and-engineering.hatenablog.jp/entry/20100220/p1)
ヤクルト1000の効果をエンジニアならどう読むか

# まず最初にプラシーボ効果だと疑う

>偽薬効果（ぎやくこうか）、プラシーボ効果（placebo effect）、プラセボ効果とは、偽薬を処方しても、薬だと信じ込む事によって何らかの改善がみられることを言う

Wikipediaより

# 公式情報で成分を調べる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/c9905cbd-be8a-a73e-5a0a-ea96f595c3ba.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/13d7fdf0-16e3-52f5-704f-7cfa52068c51.png)

カフェインやGABAやら既存の成分のおかげではないかと疑う

# 事実としてのデータをチェックする

根拠やグラフやらをちゃんと読む

ちゃんと偽薬との比較実験があるようだ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/a3bc1eea-f513-f0ca-10eb-486e443fed90.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/58b8a427-05db-38e6-5864-44ad050bb1bf.png)

根拠が示されているので、実は良いのではないか？と思い始める

# とりあえず試してみる

エンジニアは実践して試すことが一番大事。

既にコンビニに走っている自分がそこにはいた。


# 虚偽表示を疑う

だがどこかで騙されていないかを疑う。

>「乳酸菌 シロタ株を1,000億個含む飲料」の継続飲用により、一時的な精神的ストレスがかかる状況でのストレスをやわらげる機能が報告されています。

ヤクルト1000にそもそも1000億個のシロタ株が含まれているのかどうか。

どうやら含まれているらしいが、ぜんぜん普通のヤクルトでも良さそうなことが分かる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/f232aba8-387a-e645-1b96-d27e2a8019bf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/10948f39-e3b2-a648-126e-c11114664a15.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/5fefceb0-a078-46e0-f7a6-7119f2ea0bc5.png)
interface2

```solidity
contract NumberInterface {
  function getNum(address _myAddress) public view returns (uint);
}

contract MyContract {
  address NumberInterfaceAddress = 0xab38...; 
  // ここは、イーサリアム上のFavoriteNumberコントラクトのアドレスが入る。
  NumberInterface numberContract = NumberInterface(NumberInterfaceAddress);
  // `numberContract`は他のコントラクトを指し示すものになっているぞ 

  function someFunction() public {
    // コントラクトから`getNum`を呼び出せるぞ：
    uint num = numberContract.getNum(msg.sender);
    // ...よし、`num`を操作するぞ。
  }
}
```
【GAS】doPost内でcheckboxの送信内容を配列で受け取りたい

## はじめに
GoogleFormではなく別途htmlのフォームを作ってGASでそのPOSTされた内容を受け取りたい場合、チェックボックスのように同じ名前で複数送られる形式のものは、e.parameter内では1つしか受け取ることができませんでした。
なので、別途送られた内容を分解してセットしてあげるようにします。

## 内容
今回はこの記事を参考にしました。
[JavaScriptでクエリストリングを取得&分解&整形する方法](https://garafu.blogspot.com/2013/12/javascript.html)
**e.postData.contents**に必要なデータが入っているので、それを分解します。

```javascript
//======================================================================================================
// リクエストパラメータを分解して利用可能な形に整形する
//======================================================================================================
function getParameters(e){

  var params = {};

  //KeyValue単位で分割する
  //デコード前に+を半角スペースに変換しておく
  var postItems = e.postData.contents.replace(/\+/g," ").split('&');
  var reg = /^(\w+)\[(\w*)\]$/;

  postItems.forEach(function(postItem){

    if(postItem.length > 0){

      //KeyとValueに分けてからデコードする
      var item = postItem.split('=');
      var key = decodeURIComponent(item[0]);
      var value = item[1] ? decodeURIComponent(item[1]) : "";

      //配列か変数かチェック
      var matches = reg.exec(key);

      //変数(例：<input name="id" value="xxx">)
      if (!matches) {
        params[key] = value;

      //配列(例：<input name="id[]" value="xxx">)
      }else if(!matches[2].length){
        key = matches[1];
        if(!(key in params)){
          params[key] = [];
        }
        params[key].push(value);

      //連想配列(例：<input name="id[test1]" value="xxx">)
      }else{
        key = matches[1];
        if(!(key in params)){
          params[key] = {};
        }
        params[key][matches[2]] = value;      
      }    
    }
  });
  return params;
}
```
getParametersにdoPost(e)で取得したeを渡すと、例えば
```html
<input type="checkbox" name="id[]" value=1>
<input type="checkbox" name="id[]" value=3>
<input type="checkbox" name="id[]" value=5>
```
のような形のデータは、配列になって格納され、
```html
<input type="checkbox" name="user[name_1]" value=1>
<input type="checkbox" name="user[name_2]" value=3>
<input type="checkbox" name="user[name_3]" value=5>
```
のような形のデータは連想配列になって格納されます。
正規表現内で連想配列のキーに指定できる文字は\wで指定しているので、キーは英数字とアンダースコアで指定してください。
【GitHub】リポジトリの削除方法

# 【GitHub】リポジトリの削除方法
## リポジトリの削除
#### 1　削除するリポジトリページのSettingタブを選択
![2022-05-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676400/557f020f-10c0-03dd-ae9d-0c734328c2e5.png)
#### 2　「Danger Zone」内にある赤文字の「Delete this repository」をクリック
「Danger Zone」はページの一番下にあります。
![2022-05-24 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676400/37fdf703-2330-1e81-3ea4-f71fccb7a0c1.png)
#### 3　青枠の中に削除するリポジトリ名を入力する
最終確認のポップアップ表示です。
青枠の上の「Please type 〇〇 to confirm.」の〇〇の部分がリポジトリ名です。
![2022-05-24 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676400/25001c93-c719-3a42-68a3-ed985c39cfcd.png)
#### 4 「I understand the consequences, delete this repository」をクリック
削除完了です。
React 18で関数コンポーネントReact.FCからchildrenが消えた

# 誰に向けて？

「プロパティ 'children' は型 '{}' に存在しません」と言われて焦っている、React, TypeScript初学者向け。

# 関数コンポーネントにてchildrenを明示しないとエラーになる

気がついたらReactがバージョン18になっていました。
（2022年3月29日npmに公開らしい）

18、、ついに成人したのですかね？:thinking:（年齢ではない）

そして、関数コンポーネントでは以下のようなエラーが出るように。

```tsx
// エラー:「プロパティ 'children' は型 '{}' に存在しません。」と怒られる
export const Hoge: React.FC = ({ children }) => {
  return (
    <div>
      {children}
    </div>
  );
};
```

結論から言うとReact18から、以下のように**明示的にchildrenを定義してやる**必要があるそうです。

```tsx
// childrenを明示してやる
// ?をつけるとオプショナル型となり、渡しても渡さなくてもいいように
type Props = {
  children?: React.ReactNode;
};

export const Hoge: React.FC<Props> = ({ children }) => {
  return (
    <div>
      {children}
    </div>
  );
};
```

# なぜこのような仕様に？

もともとは、関数コンポーネント（Function Component）にReact:FCの型を当ててやると、暗示的にchildrenを渡せるようになっていました。

しかしこの仕様だと、childrenとして何か渡した方がいいのか判断できないとか、実はchildren使われてないので渡しても意味ないとか、不要なのにchildren含まれてて気持ち悪い、childrenとして渡せるものの種類が多いなどなど面倒があったのですね。

そこで、React.VFCというchildrenを持たない関数コンポーネントの型が生み出されました。

そしてついに、React 18でReact.FCにもchildrenが含まれなくなったのでした。

~~この一連の流れを、子供たち(children)の(型)安全を守ろう運動と言う、言わない。~~

childrenに関して、過去記事を参考にするときは注意ですね。

# 参考
https://stackoverflow.com/questions/71788254/react-18-typescript-children-fc
Thanks
Qiitaのユーザーをブロック(非表示)にするChrome拡張を作りました

# はじめに

Qiitaのページでユーザー指定して記事とコメントを非表示にするChrome拡張を作りました。

# Chrome ウェブストア

Qii-U-Blocker - Chrome ウェブストア
https://chrome.google.com/webstore/detail/qii-u-blocker/lbneehhdkkgcgbempdkgabccfibbjjdj

# GitHub 

standard-software/chrome-qii-u-blocker
https://github.com/standard-software/chrome-qii-u-blocker

「パッケージ化されていない拡張機能を読み込む」の機能でmanifest.jsonファイルのあるフォルダを指定するとChromeブラウザに登録することができます。

page.js を修正して再読み込みすると自分用のオリジナルなものも簡単につくれそうです。ボタンの色変えたり、表示非表示のトグルを押せなくしたり。

# 使い方

ブロックする人のページに行き、左下の「Qii-U-Blokeerでブロックする」ボタンを押します。

ボタンはトグルするので、ブロックを解除するには「Qii-U-Blockerのブロックを解除」ボタンを押してください。

![2022-05-20_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96423/07d693a3-6e71-968b-5851-4d56069a51a7.png)

Qiita のホーム、タイムライン、トレンド、の各画面で対象ユーザーの記事が非表示になります。
「Qii-U-Blocker」のボタンを押すと、展開して中身を見ることができます。

![2022-05-23_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96423/abf1dac8-9e3d-6f58-f363-ed37d478d029.png)

Qiita のユーザー投稿記事内のコメントでも、対象ユーザーのコメントが非表示になります。
「Qii-U-Blocker」のボタンを押すと、展開して中身を見ることができます。

![2022-05-23_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96423/141a03d8-9caa-7fbb-0465-c80cacbacadf.png)

# 予定

今後の開発予定です。

- 質問に対するブロック機能。なぜついてないかというと、私がQiitaの質問ページ見ないから。
- ブロックユーザーの一覧表示と更新機能。インポートエクスポート的な機能がないとつらい。
- 記事ごとのブロック機能。ユーザーだけよりも細かくブロックしたい場合もあったりなかったりする気がする。

# フィードバック

不具合あったら教えてください。
ご意見、ご感想、ご要望などありましたら、コメントに書いていただくと嬉しいです。
機能不十分で、実装足りないところ多々あるので、お手柔らかにお願いします。

# 使用について

言うまでもないことですが、この機能拡張を使った事による損害があったとしても私は一切の責任を負いません。

また、この機能は誰かの気分を害するために作ったのではなく、全く逆で、使っていただく方の気分を下げないため、気持ちを守るために作っています。

コミュニケーションを発する権利は誰にでもありますが嫌なコミュニケーションを受け取らない権利も誰にでもあります。

実の親から虐待を受ける子は、親から距離をあける権利があるべきでしょうし、会社や学校でいじめられるのなら、そこにいかない権利があるべきです。
もちろんそうしてしまうことによる受ける不利益は自分でなんとかしなければいけないかもしれません。ですが、コミュニケーションを受け取らない権利は大事だと思います。

Qiitaのコミュニケーションの、すれ違いや誤解やあるいは意図的だったりする事からくる傷つけ合いは、大きさの大小はあれども、現実として存在して、そういうものを目にしたくない人もいると思います。

個人の、当然な理由、または身勝手な理由で特定の相手を好きではなく嫌いになる事もあるわけで、そういう相手の投稿を見かけることでQiitaを使いたくなくなったりする事もあるかもしれません。

そのようなことがなるべく起こらないようにするため、自分のブラウザ内で表示されるものに傷つけられないようにするために、こういう機能拡張を作りました。

自分のブラウザ内だけの処理なので、誰にも知られずに特定の相手の投稿を見ないようにすることができます。

そういうことをふまえて使っていただけると助かります。

# 感想など。

わりと、ボタンのデザインかっこよく出来てよかった。

以前あったQアクセラレーターみたいに、いろいろページ加工して機能追加するための拡張機能にすりゃよかったかもしれないけど、ユーザーブロック特化的な名前にしてしまった。ちょっとまずったかもしれないけど。まあ、しょうがない。

# 参考

【chrome拡張機能】teratailで不快なユーザをブロックする拡張機能を開発 - Qiita
https://qiita.com/mineralwater/items/5a6e016633bf00e4ea24
非常に参考にさせていただきました。ありがとうございます。
mysqlのアップグレードを考える際に見たいページメモ

# 概要
mysql(正確にはamazonAurora mysql互換)のメジャーバージョンアップデートを考えるにあたり、見た方が良いページメモ
リンクのバージョン指定だけ変えれば今後も使えるはず

# 参考
https://videohub.oracle.com/media/MySQL+8.0%E3%81%B8%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%81%A8%E5%BF%85%E8%A6%81%E6%80%A7/1_e6680dit

# ページリンク
機能差分

https://dev.mysql.com/doc/refman/8.0/ja/upgrading-from-previous-series.html

オプション差分

https://dev.mysql.com/doc/mysqld-version-reference/en/optvar-changes-8-0.html

リリースノート

https://dev.mysql.com/doc/relnotes/mysql/8.0/en/

差分表 (非公式

https://mysql-params.tmtms.net/
nuxt/storybook+storybook/addon-interactions導入でやったこと

![Nuxtjs-v2.15.8](https://img.shields.io/badge/Nuxtjs-v2.15.8-brightgreen) ![nuxt/storybook-v4.3.1](https://img.shields.io/badge/nuxt/storybook-v4.3.1-brightgreen) ![storybook/addon-interactions-v6.4.22](https://img.shields.io/badge/storybook/interactions-v6.4.22-brightgreen)

# はじめに
`nuxtjs/storybook`+`storybook/addon-interactions`の導入で少しハマったので記事にしました。
大した内容ではないですが、あまり同じ構成の情報が見つからなかったためいつか誰かのためになれば幸いです。
導入に当たっては下記の記事を大変参考にさせていただきました。下記の記事で触れていない内容について記載します。
https://zenn.dev/azukiazusa/articles/storybook-interaction-testing

# やったこと
## バージョンを揃える
`nuxt/storybook`の`4.3.1`ではアドオンのバージョンは`6.4.22`になっています。
`storybook/addon-interactions`をインストールする時はバージョン指定することになります。
```sh
npm install -D storybook/addon-interactions@6.4.22
```
下記のライブラリに関しては、対応時の最新版で動作しています。
`@storybook/jest`: `0.0.10`
`@storybook/test-runner`: `0.0.8`
`@storybook/testing-library`: `0.0.11`

## ステップ実行を有効にする
ステップを有効にするためにはStorybookの`main.js`に下記を設定する必要があります。
```javascript
module.exports = {
  features: {
    interactionsDebugger: true,
  },
};
```
`nuxt/storybook`ではこれを`nuxt.config.ts`で指定することが出来なかったため、ejectでStorybookの設定ファイルを外出しする必要があります。
```sh
npx nuxt storybook eject
```
`.storybook`フォルダが生成されるので、その中の`main.js`にfeaturesおよびinteractionsDebuggerを設定してください。

## withinではなくscreenを使う
こちらは環境要因もあるかもしれませんが、NuxtのユニバーサルモードではStorybook上でF5リロードするとcanvasから要素を取得することが出来ませんでした。
```typescript:Sample.stories.ts
import { within } from '@storybook/testing-library'
...
Default.play = async ({ canvasElement }) = {
  const canvas = within(canvasElement)
  const textbox = await canvas.findByRole('textbox')
}
```
上記では下記のエラーでテストが失敗してしまいました。
```
Unable to find role="textbox"

Ignored nodes: comments, <script />, <style />
<div
  id="root"
/>

Ignored nodes: comments, <script />, <style />
<div
  id="root"
/>
```
下記のようにwithinではなくscreenから要素を取得することで解決しました。
```typescript:Sample.stories.ts
import { screen } from '@storybook/testing-library'
...
Default.play = async () = {
  const textbox = await screen.findByRole('textbox')
}
```
ただし、READMEには`While you can technically use screen, it's recommended to use within(canvasElement). Besides giving you a better error message when a DOM element can't be found, it will also ensure your play function is compatible with Storybook Docs.`とあるのでなるべくwithinで対応出来るように注視していきたいと思います。

## アイコンボタンを取得する
今回のプロジェクトではUIフレームワークにVuetifyを使っており、マテリアルアイコンのみを使ったボタンもあります。
そういったボタンはtext等で要素の取得が出来ないため、`aria-label`を適用することで見つけられるようになります。
```CloseButton.vue
<template>
  <v-btn icon aria-label="close">
    <v-icon size="18px">mdi-close</v-icon>
  </v-btn>
</template>
...
```
```typescript:Sample.stories.ts
...
Default.play = async () = {
  const closeButton = await screen.findByRole('button', { hidden: true, name: /close/i })
  ...
}
```

# おわりに
Nuxt3も控えているのでもっと安定するかと思いますが、現状でもこれだけの対応でStorybookを活用してテストを書いていくことが出来ます。
より良い方法等あれば教えていただけると嬉しいです。
また何かあれば追記していきたいと思います。
[Solidity]変数の型について


![Solidity.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/c4e167e6-4ffd-9705-c467-bc383c972715.png)



いつもはflutterを書いているのですが、ブロックチェーンに興味をもち勉強を始めました。
アウトプットのために書こうと思います。
自分用のメモにも使います。

# 数字関連

```Solidity
  //正の数と負の数の両方使用できる。
  int a = -5;
  //正の数しか使えない。
  uint b = 3;
```

## 注意点

・小数は使えない　　例） 0.5ETH = 0.5 * 10^18 wei で表せる！

# 文字列関連

```Solidity
    //String型
    string d = 'Hello world';
    //文字列の長さに制限がある（下の場合は、３２）
    bytes32 e = 'EHT';
```
### メモ
・byte32は、`EHT`や`BCT`など決まった長さに使用することが多い


## アドレス型
　
```Solidity
   //ウォレットのアドレスなどで使用する。
   address f = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
```

## bool型
```Solidity　
　　　　　　　　//true　or falseが使用可能
    bool c = false;
```

# 簡単関数例
```
pragma solidity >= 0.4.0 < 0.8.9;

contract MyContract{
    int a = -5;
    uint b = 3;
    bool c = false;
    string d = 'Hello world';
    bytes32 e = 'EHT';
    address f = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;

 　　　　　
    function add (uint x, uint y) public pure returns(uint) {
        uint result;
        result = x + y;
        return result;
    }

  
    function addByB(uint x) public view returns(uint result) {
        result = x + b;
    }

    function changeB(uint x) public returns(uint) {
        b = x;
        return b;
    }
}

```

# 結果

![スクリーンショット 2022-05-24 14.33.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/632e12b5-2cb6-0e03-d065-1621eedb6cd3.png)





# 注意点
・<b> solidyは、uintの方が使われる　
 → マイナスがあまりないから。

 
# 最後に

まずは基本からやっていこうと思っています。
修正点があれば、コメントください！！
interface

・interface
　一見コントラクトに見えるが外部コントラクトのデータを読み込むために使用するものをinterfaceと呼ぶ

```solidity
contract NumberInterface {
  function getNum(address _myAddress) public view returns (uint);
}
```
ここでは外部コントラクトのgetNum関数を読み込んでいる。(uint)後に{}を使用せず;が使われてるのが特徴。
SOAFEE One-Page Overview

### SOAFEE

#### Policy / Motto?

“Cross-development is pointless and stupid when the alternative is to just develop and deploy on the same platform.” — Linus Torvalds

#### What is the Problem?

Code for embedded systems like those in the automotive domain has been that the software is written on the supplied API’s available in the BSP that is delivered with the selected processor, dependence on specific API’s in the underlying BSP.

We just cannot do the following `Intelligent Workload Migration`...

![SOAFEE-CloudNative-to-Automotive.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112819/c07f0cb0-1167-3b69-c99a-c7e83e3249c4.png)

#### Summary

- Scalable Open Architecture For Embedded Edge
- Real-Time software architecture, including `Cloud Native`
- Basically extends `Cloud Native` architecture to Embedded Devices
- 1st priority is autonomous driving as reference

#### Technical Insights

![SOAFEE-ArchitectureOverview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112819/08abaf51-fae8-31b5-201d-1c96b5df9dd3.png)

- ADLINIK, OpenRobotics, Eclipse
  SOAFEE’s reference application is Open Robotics ROS 2 with Autoware.Auto, and the default ROS middleware Eclipse Cyclone DDS with iceoryx zero-copy and Zenoh V2X.
- OCI (Open Container Initiative) compatible including CRI(Container Runtime Interface), CNI(Container Network Interface) and CSI(Container Storage Interface)
- (CDI, Container Device Interface) is not listed as SOAFEE aspect, but I believe it will be. This device abstraction layer will be required as key part.
- What's missing for SOAFEE requirements?
  - as container orchestrator, IO bandwidth, execution time and cache policy.
  - as container runtime, privilege control to resource
  - [VirtIO](https://www.linux-kvm.org/page/Virtio) is lack of Safety, Realtime, does not cover all enough [VirtIO](https://www.linux-kvm.org/page/Virtio) interfaces for automotive domain.

#### Reference

- ADLINK Technology Hardware Reference, Ampere Altra SoC, https://www.adlinktech.com/en/soafee
- [gitlab.arm.com/soafee](https://gitlab.arm.com/soafee), currently almost empty atm
- [SOAFEE white paper](https://armkeil.blob.core.windows.net/developer/Files/pdf/white-paper/arm-scalable-open-architecture-for-embedded-edge-soafee.pdf)
- [arm DevSummit 2021 Cloud-Native to Car](https://www.youtube.com/watch?v=uqJszsVhrfs)
- [Scalable Open Architecture For Embedded Edge – SOAFEE](https://www.youtube.com/watch?v=8MkXiceCxSM)
MySQLでDELETEにサブクエリがあるとインデックスが効かない

# 原因
サブクエリを含むSQLは外側から先に分析されるため

# 改善
サブクエリをJOINに変更

## NG
```sql
DELETE FROM main
WHERE id IN (
	SELECT main_id
	FROM sub
	WHERE fld = xxx
)
```

## OK
```sql
DELETE m FROM main AS m
INNER JOIN sub AS s ON m.id = s.main_id AND s.fld = xxx
```
![1653379379.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249425/63eed54f-a862-f90b-84ad-c743b26dda9c.png)
乗ってる！

# ふむ
~~SQL Serverではこんな悩みなかったな~~ 慣れておこう

## 先人に感謝
 - http://tech.aainc.co.jp/archives/397
 - https://oreno-it3.info/archives/789
たった7Stepで、自分だけのWikiを構築する方法

## 本記事を読んでできること 
Dockerを使って、自分だけのWikiを構築することができるようになる。

## Growiとは
https://growi.org/ja/

## 環境
+ Ubuntu 20.4

## 手順
### 1. Ubuntuが動作する環境を用意する
- Hyper-V
- 仮想マシン

### 2. Dockerをインストールする
~~~
sudo apt install docker
~~~
### 3. Docker-Composeをインストールする
~~~
sudo apt install docker-compose
~~~

### 4. GrowiをCloneする
~~~
git clone https://github.com/weseek/growi-docker-compose.git growi
~~~

### 5. コンテナを立ち上げる
~~~
sudo docker-compose up -d
~~~

### 6.　IPアドレスを調べる
~~~
hostname -I
~~~
### 7. ブラウザからGrowiにアクセスする
- 自分自身のIPアドレス:3000
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442933/0f5b4a4c-ac73-5e85-e7e2-e55fd5e6cc2b.png)
SpringBoot 概念1

定義

スプリングフレームワークを使用するプロジェクトを非常に簡便に設定できるスプリングフレームワークのサブプロジェクトと

URLについて
scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]

>>https(Skim)

//ユーザー情報@

卸売人（naver.com）/

サーバが提供するリソースの経路

クライアントがサーバに要請する際に送信するデータ

補助リソースに対する方向性を提供するフラグメント識別子


核心技術（四つ）
POJO(Plain Old Java Object)

: 古い方式の簡単なジャワオブジェクト(ex:getter,setter,メンバー変数)

IOC(Inversion of Control)

: オブジェクトの生成、生命周期の管理まで全てのオブジェクトをフレームワークが管理

DI(Dependency Injection)

: 各クラス間の依存関係を空の設定←開発者設定(xml,annotation)

設定情報をもとにコンテナが自動的に接続

AOP(Aspect Oriented Programming)

: モジュール性を高める目的で異なる関心事を分離(separationofcross-cuttingconcerns)するプログラミングパラダイム


コンテナについて

スプリングで使用するオブジェクトを含んでいるもの

登録されたスプリングbeanを生成、依存関係を注入、生命周期を管理->???

- ジャワオブジェクトを含んでいる

- いつでもスプリングコンテナから必要なオブジェクトを持ってきて使用することができる

- Beanの生命周期を管理->???

- SpringContainerはアプリケーションを構成するBeanを管理するためにIoCを使用

コンテナ種類二つ
１．BeanFactory

空きを登録、生成、照会、返し、の他に付加的なBeanの管理。

BeanFactoryが定義は直ちにロードする
反面、Bean自体が必要になるまではインスタンス化をしない

getBean()が呼び出されると、Factoryは依存性注入を利用してBEANをインスタンス化し、ウィーンの特性を設定る
ここでBEANの人生が始まり

2.ApplicationContext

BeanFactoryを相続した、BeanFactoryを拡張した向上したコンテナ

基本的な機能
BeanFactoryと同じ

国際化がサポートされるテキストメッセージを管理

画像をロードできる包括的な方法を提供

リーナス->???に登録されたウィーンにイベント発生のお知らせあり


BeanFactoryとApplicationContextの差異

BeanFactory
初めてgetBean()が呼び出された時点で該当BEANを生成(lazyloading)

アプリケーションコンテキスト
あらかじめBEANを生成してBEANが必要な時に直ちに使用できるように保障
エンジニアは専門書籍を買ってはいけない

# 理由 : 本を買うと安心して結局あなたは読まない

本というものは買う前の段階が一番吸収率が高い。つまり立ち読みをしていたり、Amazonでレビューを読んだり、Kindleで試し読みをしている時だ。

いったん買ってしまった途端に、あなたは本を獲得してしまう。
心は満足し、あなたは積ん読のリストにまたひとつ新しい本を付け足す。

買った途端に興味を失ってしまうこの現象はなんなのだろう？
獲得は人間に特別な効用を与える。

なのでできることならば、いちばん大事な本ほど買わないほうが良い。
もちろん無用な本は絶対に買わないほうが良い。

お金を出して本へのモチベーションを失いなど、本末転倒だ。


# 理由 : 読むべき本はあなたが思うより100倍少ない

本は読むものではない。読まないためのものである。

読む本は少なければ少ないほど良い。
読むページ数は少なければ少ないほど良い。

なぜならこの世には無数の本があるが、本当にあなたに必要な情報というのは、ごくわずかだからである。

本屋に行けば無数の魅惑的な本が立ち並ぶが、優先順位10位ぐらいの本を買ってはいけない。
3位でも2位でもいけない。つまり圧倒的な1位を買うべきだ。

その1位が不在で「何も買わないこと」が正解ということもある。

# 理由 : あなたの興味は1日単位で移り変わる

今日読むべき本は、明日読むべき本ではない。
今日読みたい本は、明日読みたい本ではない。

つまり今日の興味で本を買ってしまうということは、明日には役立たないものを買うことだ。



# 理由 : コードと書籍の相性の悪さは抜群である

コンピューター上で扱われるべきコードが書籍に書かれている、これこそ悪魔のミスマッチだ。
書籍のコードはコピーすることも、編集することも出来ない。

ネット上にもコードが公開されてるだって？
ならなおさら書籍形式である必要がないだろう。

プログラミングの書籍を買うならば、コード例がメインの本ではなく、概念理解のための本を買うのが良い。


# 対策 : 本屋に頻繁に通い、目を通す

本屋によっては椅子が用意されており、ゆっくりと買っていない本を読める場所もある。
そうでなくても、いろいろな本を手にとって開けば、あなたが興味の湧く本、湧かない本があるだろう。

100冊の中で99冊は不要な本かもしれない。
90冊は開いて一瞬で閉じるかもしれない。

そうやって究極の一冊を探して行く。

選ぶことにそんなに時間をかけてどうするんだって？
いや、無益な本を買ってしまい読む時間と比べれば、どれだけ「読まない本」を選ぶ時間は重要だろうか。

それにそうやって様々な本を選別すること自体が、すなわち情報の取捨選択によって見識を広めるということなのだ。

つまり本屋で本を選ぶこと自体が知恵のトレーニングなのだ。

そしてついに究極の一冊を見つけたところで、あなたの役割は完了する。本は買わずに帰ること。もし気になるならば、また次の日にでも本屋に立ち寄れば良い。

![E815FA32-B301-4652-B6B2-F58F78C0225C_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/307bbc97-d8db-80f5-c600-271d9da78077.jpeg)



# 対策 : ブックカフェを活用する

プログラミングの書籍が豊富にあるような、冊数の多いブックカフェがあれば最高だ。
たとえばTSUTAYA書店とスターバックスがコラボしているブックカフェがある。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/d81d3260-8b90-2a66-c27d-6b9beb7237f9.png)


抹茶のティーラテでも飲んで体を温めながら本を読み、そして絶対に買わずに帰ること。買いたい誘惑に抵抗し、読みたければまたブックカフェに立ち寄るのだ。

そのたび美味しいドリンクが味わえることだろう。


# 対策 : 電子書籍の試し読みを活用する

本というものはまえがきや目次、序章に最も大事な情報が載っているものである。
つまりほとんどの本は、試し読みの範囲で十分だったりする。

それを正式に購入してしまったが最後、退屈な2章以降に悩まされることになる。

続きが読みたい誘惑に抵抗し、もし読むのであれば別の新しい本を試し読みすると良いだろう。

# 対策 : Amazonのレビューや詳細を読む

本の概要がレビューを読むだけで十分な本もある。
エッセンスを掴むならAmazonが良い。コスパはおそらく最強だ。

# それでも本を買うときは？

インテリアとして書い、家に飾ると良い。
購入済みの本はインテリアである。それ以外の用途は認めない。


# 関連

https://qiita.com/YumaInaura/items/92d412fc7e55ef9d9b67


<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
bundle install(gem install pg)が通らない時の対処 on macのhomebrew環境

ただのメモ書きです

# 背景とか

gemのnative拡張の.so依存は、基本的にはpkg-configにまかせていればよいのだけど、
残念ながら、`gem "pg"`においては、pg_configを参照できないときに、pkg-configにfallbackしてくれるのは、2022年1月リリースのv1.3.0からである。
see: https://github.com/ged/ruby-pg/blob/master/History.rdoc#v130-2022-01-20-michael-granger-gedfaeriemudorg-

プロダクトコードのライブラリバージョンを上げるのは後からにして、ひとまずbundle configでの解決策をメモしておく。
(他にもpkg-configに対応していないnative拡張のgemがあったら後で自分で参照する用)

# ネイティブライブラリのインストール

homebrewのpostgres formulaeを入れると、サーバーごと入ってしまうので、libpqのみ入れる
gemは"p**g**"だけど、ライブラリは"libp**q**"なので注意。(なんなんや)

```shell-session
brew install libpq

# 確認
ls -l $(brew --prefix libpq)/bin/pg_config
```
```
-r-xr-xr-x  1 hoge  hoge  72016  5 10 06:25 /usr/local/opt/libpq/bin/pg_config
```

# bundlerのconfigを設定してインストール

gemコマンドに対するオプションはbundle-configで与えるようにする。
この設定は永続化するので1回だけやればいい。
プロジェクト毎にconfigするのは面倒なので、--globalにして、$HOME/.bundle/config に設定を入れてしまって構わないと思う。(詳しい人、問題がありそうなら教えてください)

```shell-session
bundle config --global build.pg --with-pg-config=$(brew --prefix libpq)/bin/pg_config
```

# 解決したはず

```shell-session
bundle
```


### 参考にした記事

- https://qiita.com/gobtktk/items/9e7a8462f680a3716680
- https://qiita.com/tarosay/items/b97e3f40d6b8acfa1bb7
- https://github.com/ged/ruby-pg#how-to-install-
- https://stackoverflow.com/a/9235107/8674935
Simple Data Integrator (SDI) 実践入門：スケジューラー設定

# はじめに
Simple Data Integratorにはスケジューラー機能が用意されています。スケジューラを使用すると、定期的にマッピングタスクを自動的に実行できます。

下記のようにスケジュール実行できます。
* 毎時の特定の時刻。
* 毎日の特定の時刻。
* 毎週指定された曜日（複数可）の特定の時刻。
* 毎月指定された日付（複数可）の特定の時刻。
* 一定時間間隔でリピート実行

### ファイルトリガーにも対応
時間ベースのスケジュールに加え、**ファイルトリガー**による実行も可能です。  
ファイルトリガーとは、以下のような**ファイルの変化を検知してタスクを起動する仕組み**です。

> 🔹 指定フォルダ内のファイルが「新規作成」された場合  
> 🔹 ファイルが「更新」された場合  
> 🔹 ファイルが「削除」された場合

これにより、**特定のファイルが到着したタイミングで処理を自動開始する**ことが可能になり、バッチ処理や外部システム連携と相性の良い運用が可能です。


# スケジューラー設定
:::note info
対象のマッピングを事前に設定完了してください。
参考資料：
https://qiita.com/RiCCT/items/d486d06b6591c8873d27
:::

### シナリオ
毎日１時、マスターデータを連携するスケジューラー設定例。
連携対象：社員マスター、部署マスター
タスク失敗の場合、５分後一回リトライ

### 1 .「新規スケジューラー」ボタンをクリックしてスケジューラー設定画面を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/379d4ee3-750b-0da9-823c-9c538c604d97.png)


#### 2 . スケジューラー基本情報設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/37b8738a-329c-5e79-26d7-b542e89cd54e.png)


|No|項目|説明|
|----|----|----|
|1|スケジューラー名 |スケジューラー名を入力、任意の名前設定できます。システムは名前の重複チェックしていないですが、管理上、ユニークの名前の設定をお勧めします。 |
|2|頻度|`毎日`を選択|
|3|対象期間、開始時間|`対象期間` -現在日付から2099/12/31 に設定<br />`開始時間` - 1:00:00 (時:分:秒形式)　<br /><br />頻度、対象期間、開始時間につきまして下記の公式資料を参照してください。<br>https://ja.sdi.ricct.com/userguide/schedulefrequency/ |
|4|有効・無効|`有効`を選択|
|5|タスク実行順番|`パラレル`を選択|
|6|リトライ|`する`を選択 <br />`リトライ回数`　- 1 <br />`リトライ間隔` - 5 分<br /> |
|7|マッピングタスク追加|マッピング一覧画面を表示して対象のマッピングを選択|

#### 3 . 対象マッピングを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/7586d98e-6857-9460-12ac-881a05864d2a.png)

|No|項目|説明|
|----|----|----|
|8|フィルター|マッピング数多い場合、フィルターにキーワードを入れて検索できます。|
|9|選択|対象マッピングに`選択`をチェックします。|
|10|追加|`追加`ボタンをクリックして実行対象に選択されたマッピングを追加|


#### 4 . スケジュール確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/c4b678f8-d130-0ac2-359b-33cf46cfae96.png)
`スケジュール確認` ボタンをクリックして、スケジュール確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/860d986b-b03a-ae3d-8b14-5689a894906f.png)
|No|項目|説明|
|----|----|----|
|12|対象日付|日付を選択|
|13|タスク実行予定一覧|対象日付、時間に予定されているマッピングタスク一覧を確認|

#### 5 . 保存
`保存` ボタンをクリックして、スケジューラー設定を保存します。
※保存する前動作確認したい場合`スケジューラー実行`をクリックしてスケジューラー手動実行できます。

以上です。

[Simple Data Integrator (SDI) 実践入門](https://qiita.com/RiCCT/items/3dc109ff82546459a8b0 "Simple Data Integrator (SDI) 実践入門")

# 参考資料
[SDI日本語公式サイト](https://ja.sdi.ricct.com/ "SDI日本語公式サイト")
[SDI English Official Website](https://sdi.ricct.com/ "SDI English Official Website")
[SDIスケジュール設定](https://ja.sdi.ricct.com/userguide/schedule/ "SDIスケジュール設定")
STM32G031でI2Cを使いアナログサーボ信号の値を受信したい。


x 動作確認済み　2022/5/24 19:32


目的
アナログサーボ信号をモニターしたい。
既存のプログラムの使い回し
Arduino Uno等から好き勝手な時に
アナログサーボの値を読み取る

[138の値に当たるPWM発振器]-[PWM受信 I2Cスレーブ]-[I2Cマスター(リード)]



![o_con490.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9a718485-be4f-08ef-1890-939c91a0822a.jpeg)



元ネタ


https://qiita.com/caa45040/items/1d3036d6a5ae59e946de


https://qiita.com/caa45040/items/bcd26fe2d33488098b26



https://qiita.com/caa45040/items/8c9b4ccbd59bd8f82d70


https://qiita.com/caa45040/items/c27704a159eb2eca4b87


いろいろ
ソフトは、簡単だがハードを間違えなく組み直すのがむずい
PWMで遊ぶからPWMのプログラムをそのままチョイス
I2C同士からI2Cマスターのプログラムをそのままチョイス
I2C温度計からスレーブのプログラムをいただく
モニターのプログラムからPWM受信をいただく




プログラム



```c++


//I2C_slave_r_PWM_031_1

#include <Arduino.h>
#include <Wire.h>

//10の割り算 0から1028までは、正しい。主に0から999
#define DIV10(n) ((n*205)>>11)

#define in_pwm   PB7 // 5pin

byte b = 0;

void setup() {

  //I2Cの初期化
  Wire.setSDA(PA12);
  Wire.setSCL(PA11);
  Wire.begin(); //pa12 pa11

  Wire.begin(8);// Slave ID #8
  Wire.onRequest(requestEvent);

  pinMode(in_pwm, INPUT); //pa11

}//setup

void loop() {
}//loop

void requestEvent() {

  Wire.write(b);
  //Wire.write(123);

  //PWMでデータ取得
  int pwmco2 = pulseIn(in_pwm, HIGH, 500000);
  //pwmco2 = 2400;

  /*
    //データの表示 debug
    String thisString9 = String( pwmco2 );
    pc_printf( (char *)thisString9.c_str() );
    pc_printf( "\r\n" );
  */

  if (pwmco2 <= 400  ) {
    pwmco2 = 400;
  }
  if (pwmco2 >= 2400 ) {
    pwmco2 = 2400;
  }

  pwmco2 = pwmco2 - 400;

  int vel = (pwmco2 * 523) >> 12;

  b = vel & 0xff;

}//requestEvent



```
【Go】Ginの.IndentedJSONと.JSONの違い

# 概要

GinでAPIを開発するチュートリアルをWeb上で探すと色々出てくるが、JSON形式の文字列をレスポンスとして返す際IndentedJSONメソッドで返している場合とJSONメソッドで返している場合があったため違い何なのか調べた。

# 調査結果

Ginのドキュメントから引用(Google翻訳かけてます)

https://github.com/gin-gonic/gin/blob/master/context.go

JSONメソッド
> JSONは、指定された構造体をJSONとして応答本文にシリアル化します。
また、Content-Typeを「application/json」として設定します。


IndentedJSONメソッド
> IndentedJSONは、指定された構造体をきれいなJSON（インデント+エンドライン）として応答本文にシリアル化します。
また、Content-Typeを「application/json」として設定します。
警告：きれいなJSONを印刷すると、CPUと帯域幅がより多く消費されるため、これは開発目的でのみ使用することをお勧めします。 代わりにContext.JSON（）を使用してください。

どちらも構造体をJSON形式にする点は同じだが、IndentedJSONでは開発目的での使用を推奨しているため、どちらか迷った場合はJSONメソッドを使った方がよさそう。
【Sourcetree】GitHubに100MBを超えるファイルをプッシュしようとしてしまった時の対処法【.gitignore】

下の画像のように　"this exceeds GitHub's file size limit of 100.00MB" が出てプッシュできないときの対処法です．
![over100MB.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459660/dabbc831-0a52-bebc-f19d-12904092fe8e.jpeg)

100MBを超えるファイルをコミットしてしまった場合は，まずこの<b>コミットを取り消す必要があります</b>（プッシュに失敗したままの状態で100MBを超えているファイルの削除や移動などしても，コミット履歴は消えないのでエラーが残ります）．

SorcetreeのHistoryから戻りたいコミット部分で右クリックして「現在のブランチをこのコミットまでリセット」を選びます．Soft，Mixed，Hardなど選択肢が出ますが基本はSoftでOKです．
![reset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459660/703ee906-755f-e7ef-e708-8d1c5223ec12.png)
![soft.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459660/796ae56e-6a0d-b994-8636-936e4932029c.png)
Hardにすると，100MBを超えるファイル以外にもそのコミットで行ったローカルの変更がすべて削除されてしまうので注意です．
Softは，ローカルの変更はすべてのそのままに，コミットのみを取り消します．


コミットの取り消しができたら，「.gitignore」に100MBを超えるファイルを記述してGitHubで管理しない対象にします．
自分の場合はフォルダ「App」内のファイルが100MBを超えており，このフォルダはGit管理しなくても特に問題はないと考えたため，これを「.gitignore」に追加しました．
![ignore.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459660/76bd825b-db6c-a4c5-35f4-6ea70ccb7d72.png)
.gitignoreでは「#」で始まる行はコメントアウトになります．正規表現による記述もできるようです．
このあと再びSourcetreeでコミット&プッシュすると，問題なくできました．

100MBを超えるファイルもGit管理したい場合はGitLFSというものがあるそうですが，この記事では扱いません．


___
【参考記事】

https://blog.s-giken.net/393.html

https://bibinbaleo.hatenablog.com/entry/2020/06/06/224940
[GA4]グローバルサイトタグをhtmlファイルに貼り付けたらUnallowed document protocol.警告が表示されて動作しなかった

## TL;DR
ローカルファイルじゃ動かないよ。Webサーバーで実行してね。
localhostでもいいから、
URLのプロトコル名がhttp/httpsの状態で動作確認しましょ。

## 経緯
Googleアナリティクスのgtag.jsを使うことになったんですが、
公式の[新しいタグを設定する](https://developers.google.com/analytics/devguides/collection/app-web?hl=ja#install_a_new_tag)の手順を見て、
本当にHTMLタグを追加するだけで設定が終わるの？？？なんて失礼なことを思いました。
いきなり実装中のアプリに入れたくなかったので、
> *「HTMLだけで実行できるならhtmlファイルを一個作ればいいじゃん！」*
> *（貼り付け）*
> *「できたよ！これで動くんだろう！」*

のテンションで**デスクトップ**に以下のhtmlファイルを作成しました。


```test.html
<!DOCTYPE html>
<html>
    <head>
        <!-- Global site tag (gtag.js) - Google Analytics -->
        <script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
        <script>
        window.dataLayer = window.dataLayer || [];
        function gtag(){dataLayer.push(arguments);}
        gtag('js', new Date());
        gtag('config', 'G-XXXXXXXXXX');
        </script>
        <title>TEST</title>
    </head>
</html>
```
ダブルクリックして開くと、画面が真っ白…のは当然で、
DevToolsのConsoleを確認すると、こちらも真っ白です。
ログが一つもありません。
そういうものかと思ったら、Googleアナリティクスのサイト（コンソール側）も反応していない。

これじゃ何も分からないので、拡張機能[Google Analytics Debugger](https://chrome.google.com/webstore/detail/google-analytics-debugger/jnkmfdileelhofjcijamephohjechhna?hl=ja)を追加しました。
すると以下のワーニングが表示されました。

> ⚠️ Unallowed document protocol.
Event processing aborted.

## 原因
いざ、ソースコードへ。
`Unallowed document protocol.`で検索すると一箇所のみヒット。
最小化されていて何が書いてあるか分からなかったが、
Chrome DevToolsのPretty Printで整形したおかげで読みやすくなっている。

```
var c = H.location.protocol;
"http:" != c && "https:" != c && (Xm("Unallowed document protocol.")
```
一部は謎のままだが、`location.protocol`が`"http:"`、`"https:"`でない場合に`"Unallowed document protocol."`が出力されるなのが分かりました。
あっ今はローカルファイルだから`"file:"`だわ…

## 解決策
適当にVueのプロジェクトを新規作成して、同じタグを貼り付けて`http://localhost:8080/`で実行したら今度はできました。
Googleアナリティクスのサイト（コンソール側）もすぐに反応しました。
`location.protocol`が`"http:"`、`"https:"`であればlocalhostでもちゃんと動作します。

## おまけ
[Google アナリティクス＞測定＞GA4 Cookie ドメインの設定](https://developers.google.com/analytics/devguides/collection/ga4/cookies-user-id?hl=ja#cookie_domain_configuration)によると、
> サーバーがローカル環境（localhost）で実行されていることが検出されると、cookie_domain は自動的に 'none' に設定されます。

ちなみにconfigでcookie_domainを設定しようとするとワーニングが出る。
npm install するとフリーズする

### 環境
- WSL2 (Win11)
- node 16.15.0
- npm 8.10.0

### 症状
パッケージをインストールすると何度やっても以下の状態で固まって進行しない

```bash
$>npm install 〇〇
(■■■■■■■■■■) /idealTree:lib sill idealTree buildDeps
```

### 解決
普通にWindowsごと再起動したら治った
もしかしたらubuntuの再起動だけで治ったかも
SNSに飛んできたアラートをTypetalkに投稿する

AWSでインフラ構築をしていて、リソースモニタリング時のアラートとアプリログを何らかの形で通知してほしい。という依頼がありました。
* CloudWatchでリソース監視＆アラート設定をして、しきい値を超えたらSNSに通知する
* ログはCloudWatchLogs（？のAgent）でログを吸い上げてサブスクリプションフィルターでSNSに通知する
* SNSのサブスクリプションでメーリングリストを指定して関係者に配信する

という流れをひとまず作りました。こんなイメージ。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78336/f0664d77-a9c3-4e94-dc95-ca547bbdefc2.png" width="70%">

業務でBacklog、Typetalkを使ってるのですが、Typetalkの方にもアラートを投げてほしい。という要望が出たのでそちらも対応することにしました。
Amazon Chatbot（ https://aws.amazon.com/jp/chatbot/ ）というのがあり、簡単そう！ともいましたが、AmazonChimeとSlackしか対応してないみたいなので却下。
SNSからメール配信しているので、その配信先にTypetalkが加われば一番手間がかからなさそう。こんなイメージ？
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78336/d72afa76-4845-a0e2-31f8-cc95529ed146.png" width="70%">

Typetalkを調べてみると、APIが用意されていて、APIをコールしたら特定のトピックに投稿できるとのこと
https://developer.nulab.com/ja/docs/typetalk/api/1/post-message/
シンプルですね。
でもSNSから直接APIコールはできなさそうなのでググる。
あ、みんなlambdaを挟んでAPIをコールしてるんですね。こんなイメージかな
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78336/70dc6c15-79ca-8927-d17f-b3af30f151cb.png" width="70%">

こんな構成で行けそう。
ではlambda関数を作っていきます。

```python
import requests
import json
import os

token = os.environ['TYPETALK_TOKEN']
url = os.environ['TYPETALK_TOPIC_URL']

def lambda_handler(event, lambda_context):
    records = event.get("Records")
    if records and len(records) > 0:
        for record in records:
            sns = record.get("Sns")
            if sns:
                subject = sns.get("Subject").replace("\\", "\\\\" )
                message = sns.get("Message").replace("\\", "\\\\" )
                timestamp = sns.get("Timestamp")
                topic_message = subject + "\n"
                topic_message += message + "\n"
                topic_message += timestamp + "\n"

                data = {'message': topic_message[:4000]}
                headers = {'X-TYPETALK-TOKEN': token}
                res = requests.post(url, json = data, headers = headers)
```

先人たちのコードを参考にこんな形にしました。
Typetalk自体はTokenと投稿先のTopicIDがわかれば後はPOSTするだけでOKです。
[Typetalk APIリファレンス：メッセージの投稿](https://developer.nulab.com/ja/docs/typetalk/api/1/post-message/#%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AE%E6%8A%95%E7%A8%BF)

TokenとTopicIDはlambdaの設定側から突っ込む形式にしました。
また、Typetalkでメッセージを投稿する際は一度に4,000文字が最大とのことなのでメッセージ文字列を4000の位置までで切ってPOSTしています。

比較的簡単！
SwiftUIでダイアログを実装する（例：ローディング）

## すべてのコンテンツ上でローディングダイアログを表示
以下の「モデルクラス」と「モディファイア」を導入することで、すべてのコンテンツ上でローディングダイアログを表示します。
* DialogModel.swift
* DialogModifier.swift

## DialogModel
ObservableObjectプロトコルに準拠したクラスです。
これを使用して、ダイアログをアクティブ・非アクティブします。
```swift:DialogModel.swift
import Foundation

public enum DialogType {
    case none
    case loading
}

class DialogModel: NSObject, ObservableObject {
    @Published var dialogType: DialogType = .none
}
```

## Dialog モディファイア
DialogModelのdialogTypeに基づいてローディングダイアログをアクティブにします
オーバーレイは、ビューをコンテンツの上に配置するために使用されます
```swift:DialogModifier.swift
import SwiftUI

struct DialogModifier: ViewModifier {
    @ObservedObject var dialogModel: DialogModel
    
    func body(content: Content) -> some View {
        content
            .overlay(
                Group {
                    switch dialogModel.dialogType {
                    case .loading:
                        VStack {
                            Text("Loading...")
                            ActivityIndicator(isAnimating: .constant(true), style: .large)
                        }
                        
                    default:
                        EmptyView()
                    }
                }
            )
    }
}

extension View {
    func dialog(_ model: DialogModel) -> some View {
        self.modifier(DialogModifier(dialogModel: model))
    }
}

struct ActivityIndicator: UIViewRepresentable {
    
    @Binding var isAnimating: Bool
    let style: UIActivityIndicatorView.Style
    
    func makeUIView(context: UIViewRepresentableContext<ActivityIndicator>) -> UIActivityIndicatorView {
        return UIActivityIndicatorView(style: style)
    }
    
    func updateUIView(_ uiView: UIActivityIndicatorView, context: UIViewRepresentableContext<ActivityIndicator>) {
        isAnimating ? uiView.startAnimating() : uiView.stopAnimating()
    }
}

```

## Dialog モディファイアを適用する
一番上の親ビューにDialogModelを生成し、@StateObjectで保持する
そして、この親ビューに.environmentObjectでDialogModelをセットし、DialogModifierを適用する
これで、DialogModelのdialogTypeを指定することで、アプリのコンテンツビュー（一番トップの親ビュー）からダイアログが表示されるようになります。

:::note info
オーバーレイは、アタッチされているビューにのみ適用されます。 そのため、「ダイアログ」を他のすべてのコンテンツ上に表示するには、一番上の親ビューにオーバーレイを配置する必要があります。
:::
```swift:TDDApp.swift
import SwiftUI

@main
struct TDDApp: App {
    
    // アプリ起動時にDialogModelをインスタンス
    @StateObject var dialogModel = DialogModel()

    var body: some Scene {
        WindowGroup {
            ContentView()
            // アプリのコンテンツビュー（一番トップの親ビュー）に共有オブジェクトとして登録し、ダイアログのモディファイアを適応
                .environmentObject(dialogModel)
                .dialog(dialogModel)
        }
    }
}
```

## ローディングダイアログを表示する
ダイアログを表示したいビューにDialogModelを取り込みます
```swift:
    @EnvironmentObject var dialogModel: DialogModel
```

その後、ダイアログを表示したいビューでローディングダイアログを表示
```swift:
    self.dialogModel.dialogType = .loading
```
その後、ダイアログを消す
```swift:
    self.dialogModel.dialogType = .none
```

## 参考
https://www.keaura.com/blog/modal-dialogs-with-swiftui

## GitHub
[TDD](https://github.com/TakanobuSano/TDD)
【Android】Android12のスプラッシュスクリーン後にツールバーが二重表示される問題

### 問題
Android12からスプラッシュスクリーンが標準実装されましたが、適当に対応したところAndroid12でのみツールバーが二重に表示されてしまったため解決策を残しておきます。
そもそも二重に表示されること自体殆ど無いと思いますが、テーマをActivity内からSetTheme()で切り替えたりしてる場合にこの問題が発生するようです。

### 解決策


```kotlin:StartActivity.kt

   override fun onCreate(savedInstanceState: Bundle?) {
        // val splashScreen = installSplashScreen() <-これを消すだけ
        setTheme(R.style.MainTheme)// ここでテーマを切り替える(今回は固定)
        super.onCreate(savedInstanceState)
        val toolbar = findViewById<Toolbar>(R.id.toolbar)
        setSupportActionBar(toolbar)

     // 省略

```

![コメント 2022-05-23 182156.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637123/9923bff4-1a82-e30c-5f40-4732d76d573c.png)


installSplashScreen()はSplashScreenのアニメーションなどを持ったオブジェクトだそうで、アイコン一枚表示するだけなら無くても問題ありませんでした。
逆にこれがあるとAndroid12でSetTheme()が効かず(?)何故かSplashThemeのツールバーが表示されてしまいました(自分で実装したツールバーと二重に表示されてしまう)。


公式ドキュメントを見る限りSetTheme()ではなくSplashTheme内のpostSplashScreenThemeでメインのテーマを指定するのがセオリーっぽいですが、動的にテーマを変えたい場合はSetTheme()を使うしかないと思います。

```xml:AndroidManifest.xml
       <!--省略-->
       <activity
            android:name=".StartActivity"
            android:exported="true"
            android:theme="@style/SplashTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!--省略-->

```
```xml:style/SplashTheme.xml

    <!--Splash theme-->
    <style name="SplashTheme" parent="Theme.SplashScreen">
        <item name="android:colorPrimary">@color/colorPrimary</item>
        <item name="android:colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="windowSplashScreenBackground">@color/colorBackground</item>
        <item name="windowSplashScreenAnimatedIcon">@drawable/splash_image</item>
        <item name="windowSplashScreenAnimationDuration">200</item>
        <!--<item name="postSplashScreenTheme">@style/MainTheme</item>--><!--SetTheme()するのでいらない-->
    </style>
    <!--省略-->

```


### 解決！
正攻法ではないと思うので何か問題があったりおかしなことをしていたら教えてもらえると嬉しいです。
アップストリームによる問題解決

ServiceNowの最高情報責任者であるクリス・ベディ（Chris Bedi）のポッドキャストの最後にダン・ハース著「Upstream: How to Solve Problems before They Happen」 を推奨している。
https://omny.fm/shows/servicenow-cloudcast/finding-water-with-chris-bedi

まだ和訳はされていないようですが、次ぎの日本語サイトに概要が書かれている。
https://monza-study.com/archives/8083

次ぎの英語のビデオに分かりやすく説明されている。
https://www.youtube.com/watch?v=5D5PU1cJqv8

簡単に言うと問題を解決するのではなく、問題が起こらないようにすることが重要である。例えば会社でネットワークがループする問題が頻繁に起こていた。その都度現場に行き確認をしてループしているケーブルを抜いていた。ループをいち早く探し、問題のケーブルを抜くのではなく、何故ネットワークがループするようになるかを探す。
私の場合はケーブルの爪がダメになりネットワークに接続できないためにケーブルを差し替えている人がいたからでした。爪がダメなケーブルを全部交換したらネットワークケーブルをいじる人が少なくなり、ネットワークループ問題も殆どなくなりました。

話は戻ますが、クリス・ベディ氏が話されているようにServiceNowの価値は問い合わせは迅速に解決することではなく、情報を収取して問題が起きる前に解決できる仕組みを作ることである。クリス・ベディ氏が話されているように理想的には人間からの問い合わせ件数は0件である。

今まで行っていた作業を自動化するのではなく、問題が発生しないように防止する作業を自動化しました。その結果、私が担当している業務の問い合わせは今では半年に1件か2件である。今までの問い合わせ対応時間を別作業に使うことができる。

以上