OmniAICreator/Qiita-1.07M huggingface dataset:
Laravelのカスタムバリデーションエラーメッセージでも翻訳した:otherを使いたいとき

# やりたいこと

カスタムバリデーターのエラーメッセージに
required_ifやrequired_unlessのように、他のフィールド名を含めたい。
その際、翻訳したフィールド名を使いたい。

# 翻訳ファイル
```php:resources/lang/ja/validation.php
return [
  // 略
  'required_if'          => ':otherが:valueの場合、:attributeも指定してください。',
  'required_unless'      => ':otherが:valuesでない場合、:attributeを指定してください。',
  // 略
  'required_if_not_false' => ':otherを指定する場合は、:attributeも指定してください。', // <--追加

  'attributes' => [
    'field1'=>'フィールド1',
    'field2'=>'フィールド2',
    //略
  ]
];
```

自作のバリデータを追加

```php:app/Providers/AppServiceProvide.php
    public function boot()
    {
        /**
         * !empty(other_field)の時だけ!empty()
         */
        //ルール
        Validator::extendImplicit(
            'required_if_not_false',
            [\App\Validators\SampleValidator::class, 'validateRequiredIfNotFalse'] //実装はクロージャでもなんでもよい
        );

        //カスタムメッセージ
　　　　//lang/ja/validation.phpのrequired_if_not_falseの文章に対してクロージャが実行される
        Validator::replacer(
            'required_if_not_false',
            function ($message, $attribute, $rule, $parameters, $validator) {
                //getTranslator()でvalidator.php翻訳ファイルのattributeを引っ張ってきて突き合わせる
                return str_replace(':other', \Arr::get($validator->getTranslator()->get('validation.attributes'), $parameters[0]), $message);
            }
        );
    }
```

[Ruleクラス](https://laravel.com/docs/8.x/validation#using-rule-objects) でtrans()を使う時も、同様に自前で置換する必要がある。

```php:Ruleクラスでmessage()の参考
trans('validation.required_if_not_false', ['other'=>'ここに翻訳したフィールド名が入るようにする'])
```

# 実際にバリデーションで使うとき

```php:app/Http/Requests/SampleRequestクラスの例
public function rules()
{
  return [
    'field2' => [
      'required_if_not_false:field1'
    ]
  ];
}
```

ソースを深追いしたらもうちょっといい方法がありそうな気もする（translator周りはあまり詳しくないので・・・）
トレロのAPIでカスタムフィールドの値を更新する！【GAS】

# GOOGLEフォームから送信された内容をトレロのカスタムフィールドに反映したい！

## 問題とやりたいこと

- Googleフォームから送信した内容をAPIを使いトレロのカードに入力する＝よくあるやつ
    - これ自体は結構簡単！
    - ただ、リファレンス見ても、カスタムフィールドを更新する方法が良い感じに書いてない。
- なので本稿はそのためのコードのメモ

## 使うエンドポイント

```
https://api.trello.com/1/cards/[cardId]/customField/[customFieldId]/item
```

## 用意するもの


- カードID
- カスタムフィールドID

これ取得するのは結構簡単なので省略。

## 実際のコード

```javascript

function updateCustomFields() {

//認証系
var api_key = "自分のAPI鍵";
var api_token = "自分のAPIトークン";

//エンドポイント周り
var cardId = "任意のカードID";
var fieldId = "任意のカスタムフィールドID";

var url = "https://api.trello.com/1/cards/"+cardId+"/customField/"+fieldId+"/item?key=" + api_key + "&token=" + api_token + "&fields=name";
var data = {
  "value": {
　//ここにカスタムフィールドに入れたい値とか入れる。textじゃないパターンもあるけど、とりあえずテキストにしてある＝任意なので自分で変えて
    "text": "任意のテキスト"
   }};

   var params = {
    "method" : "put", //GETではなくPUT
    "contentType" : "application/json", //データ形式の指定
    "payload" : JSON.stringify(data), //JSONで渡す
    muteHttpExceptions : true //おまじない
  };

  const response_customFIelds = UrlFetchApp.fetch(url, params);
}
```

# おわり

## だいたいこんな感じ

だいたいこんな感じで動く。本題のフォーム送信して云々は省いたフォーム送信したentryから適当に値抜いてきて、valueに入れといたらよい。
デザイナーとしてTypeScriptをやってみて良かったこと

## これは何

- [こちらの記事](https://qiita.com/xrxoxcxox/items/91f84c6bc3e03deb5853)の続きというか、TypeScript版の内容です
- デザイナーである私がいくらかTypeScriptを勉強して、役に立ったと感じていることをまとめてみました

https://qiita.com/xrxoxcxox/items/91f84c6bc3e03deb5853

## ひとまずプリミティブ型だけの理解でもかなり良かった

https://www.typescriptlang.org/docs/handbook/2/everyday-types.html

- string: 文字
- number: 数字
- boolean: 真偽値（trueとfalse）

これらを覚えるだけでも正直かなり役に立ちました。

エンジニアの皆さんからしたら当たり前の内容かもしれませんが「このコンポーネントのpropsに数字以外が入ってこられちゃ困るな」なんて気がつけるようになったと思います。

booleanも、安心感というか「どんなテキストが入ってくるか分からない」状態よりも「OKかNGか、それだけ」と言い切れるのは脳のメモリを変に使わずに済む感覚があります。

## 複雑な型を考えているとき、そもそもの構成が間違っているのかもと冷静になれる

「このキーと値の組み合わせで、入れ子がこれだけあって、引数にあわせて変化してほしくて……」とか考えているうちに、最終的にどうinterfaceやtypeとして示せばいいか分からなくて投げ出しそうになることが多々あります。

単に私が型を書く力が弱いだけですが、「そもそもコンポーネント分ければ良くない？」となるきっかけになった経験も。

無理してパズルみたいなことに取り組んで自爆しがちな性格なのですが、冷静になるきっかけを作ってくれている気がします。

## 初めて使うライブラリでもちゃんと動かせる場合が増えた

デザイナーといえども、カルーセルスライダーとかフェードインアニメーションとかそういったライブラリは触ることがあります。

使い慣れていれば良いのですが、初めて触るようなライブラリだと「Examplesの通りに書いてるつもりなのに動かない……」みたいな場合もしばしば。

ライブラリがTypeScriptで書かれていると型定義に飛べるので、解決できる場合が増えました。

大抵はしょうもないミスをしているだけなのですが……ちゃんと型のエラーが出てくれたり定義を読めると沼にハマりづらい気がします。

## HTMLのミスにも気づける

普通のHTMLを書いていると、例えばattributesの間違いを犯しても気づきづらいです。

`textarea`と間違えて`input`に`cols`や`rows`を指定していたとしても、特にエラーも吐かずビューが表示されてしまいますよね。

これが例えばTypeScript + Reactであればこんな風に表示してくれます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/cc8bc1fe-4625-22b4-6b84-1f4ce802bd6a.png)

「そんな属性はありません」と怒ってくれるので、その場で間違いに気づけます。

## UIツールでコンポーネントを作るときの視野が広がる

例としてFigmaで説明をします。

Figmaでコンポーネントを作るならvariantsはほぼ間違いなく使う機能ですよね。
variantsの設定をしている時点で「これはリテラルのユニオン型」とか「これは単なるboolean」とかを考えられます。
そこまで考えておけると、その後コードで実装するときに楽になると思います。

## 終わりに

デザイナーにとってのTypeScript、絶対に読み書きできないといけないような代物ではないと思いますが、ほんの少し勉強するだけでも役立つ箇所は多いと感じています。

完璧である必要はないので、ちょっと足を踏み入れてみませんか？
PyCharmで.pyファイルが.txtとして読み込まれるバグへの対応

PyCharmでファイルの拡張子を正しく認識してくれない場合がある。

例えば、以下のような場合。

引用元：https://chico-shikaku.com/2019/07/pycharm-file-cannnot-recog/

例えば「testRecognize.py」というファイルを作りたかったとします。
しかし間違ってテキストファイルとして「testRecognize」という.pyの拡張子がないファイルを作ってしまうときってありますよね。そういうときに後から「testRecognize」をリネームして「testRecognize.py」としてもPythonファイルとして認識されず、テキストファイルとして認識されてしまうときがあります。


![スクリーンショット 2021-11-10 21.16.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2245152/6e50dc65-aa69-9eda-40a0-4f897e17554e.png)

環境設定/エディター/ファイルタイプ/python
で必要なファイルの名前を登録してしまう。正規表現も使える。

※検索するとターミナルから環境設定を直接いじっている方もいたが、自分の環境では再現できなかった。
【備忘録】fairseqでtoken2idにアクセスしたいとき

#はじめに
fairseqでpreprosess後に各トークンにどのIDが割り当てられているのか確認する方法です．
なおfairseqのバージョンは0.9.0で行っています．
#結論

preprocess後に初期設定では`data-bin`にバイナリデータが保存されているはずです．
その中に`dict.en.txt`などdictから始まるファイルが通常存在していますので，今回それを使用します．
以下がtoken2idを取得するコードです．

```python
>>> import fairseq
>>> dict = fairseq.data.Dictionary.load("dict.en.txt")
>>> token2id = dict.indices
>>> {key:token2id[key] for key in list(token2id.keys())[:15]}
{'
': 0, '<pad>': 1, '
': 2, '<unk>': 3, ',': 4, '.': 5, 'the': 6, 'of': 7, 'to': 8, 'and': 9, 'a': 10, 'in': 11, 'that': 12, '“': 13, '”': 14}
```

全てのtoken2idを表示すると大変なので，とりあえず15個出力してみました．
うまくトークンとIDの情報が対応されているのがわかりますね．

#考察
ここではどのようにIDが振られているのか考えてみましょう．
ちなみに`dict.en.txt`の中身は以下のようになっています．

```bash
head -n 10 dict.en.txt 
, 824248
. 801146
the 691194
of 428707
to 425800
and 326036
a 259768
in 255893
that 189164
“ 173250
```

ここで，左側はトークン，右側はテキスト内の出現頻度を表しています．
そのため`tail dict.en.txt` を実行すると右側が1などばかりで低頻度語がファイルの下の行に記述されていることがわかります．
`token2id`と比べてみると，4番以降のIDを持つトークンと行数の順番が一致しています．
そのため，`
,<pad>,
,<unk>`の4つが予約語として割り当てられていて，それ以降は出現頻度順で割り当てられていることがわかります．

このことから`dict.en.txt`にはトークンとその出現頻度のみ記述すればよく，あとはソースコード側で頻度順でIDを振っていけば良いということになります．
ここまでの流れが
`fairseq/data/dictionary.py`に長ったらしく書かれています．
コードを読みたかったら
https://github.com/pytorch/fairseq/blob/main/fairseq/data/dictionary.py
を参照してください．

以上のことを踏まえてtoken2idを実装すると以下のようになります．
ここでは簡略化のため，なにも例外処理などしていません．

```python
defined_tag = ['
','<pad>','
','<unk>']
token2id = dict()
ids = 0
for token in defined_tag:
    token2id[token] = ids
    ids+=1

with open('dict.en.txt') as f:
    for line in f:
        token,_ = line.rstrip().split()
        token2id[token] = ids
        ids+=1
print({key:token2id[key] for key in list(token2id.keys())[:15]})
```

以上により簡単にtoken2idを自作することができますが，例外処理など見落とす場合があるので，`fairseq.data.Dictionary.load()`を使うことをおすすめします．
【備忘録】Pythonでオブジェクトの属性値をfor文で取り出したいとき【getattr()の使い方】

# はじめに
Pythonでリスト型の場合，

```python
>>> for i in list:
...     print(i)
```
で各要素にアクセスできます．
dict型の場合，

```python
>>> for key in dict.keys:
...     print("{}:{}".format(key,dict[key]))
```
で取得できます．
では例えば以下のようにクラス化されたものについてどのようにアクセスしたら良いでしょうか．

```python
class Animal:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
pochi = Animal('pochi',18,'male')
```
このときポチの中身は

```python
>>> vars(pochi)
{'name': 'pochi', 'age': 18, 'sex': 'male'}
```
となります．
このとき各要素にfor文を使ってシーケンシャルにアクセスしようとすると，

```python
>>> for attr in vars(pochi):
...     print(pochi[attr])
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
TypeError: 'Animal' object is not subscriptable
```
となりエラーが出てしまいます．

```python
print(pochi.name)
print(pochi.age)
print(pochi.sex)
```
とすると中身にアクセスできるのですが，いちいち指定するのは面倒ですし，なんとかdict型のようにfor文などでアクセスできないでしょうか．

# 結論
`getattr()`という組み込み関数を使うことで解決します．
先程の例では

```python
>>> for attr in vars(pochi):
...     print("{}:{}".format(attr,getattr(pochi,attr)))
...
name:pochi
age:18
sex:male
```
となり辞書型と同様の扱いをすることができました．

# もうちょっと詳しく
ここで`getattr()`について
https://docs.python.org/ja/3/library/functions.html#getattr
を参照すると
`getattr(object, name[, default])`となっており，任意の第3引数が設定されいることがわかります．
これはもし第1引数に指定した名前の属性が存在しない場合，第3引数に指定したものが返されます．
例を使って確認してみましょう．

```python
>>> attr = 'age'
>>> print("{}:{}".format(attr,getattr(pochi,attr)))
age:18
>>> attr = 'weight'
>>> print("{}:{}".format(attr,getattr(pochi,attr)))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Animal' object has no attribute 'weight'
>>> print("{}:{}".format(attr,getattr(pochi,attr,'No measured')))
weight:No measured
```
例では3つの場合について検討しました．
1つ目は`attr`に設定されている値が`pochi`に含まれている場合．
2つ目は`attr = weight`とすることで設定されていない値が入力された場合．
3つ目は`getattr()`に第3引数として`No measured`が記述されていたときの場合です．

通常の動作が行えている最中は問題ないのですが，2つ目の例では`AttributeError`が返されています．しかし3つ目の例で第3引数に`No measured`を記述した場合，`AttributeError`ではなく`No measured`が返され，エラーが返されることなく動作していることがわかります．

以上のことから結論として，メソッドなどをシーケンシャルにアクセスしたいときは`pochi.name`などのようにいちいちアクセスしなくても`getattr()`を用いればfor文などですべての要素にアクセスできることがわかりました．

さらに詳しいことはリファレンスを見てください．
https://www.python.org/dev/peps/pep-0231/

# 追記

@shiracamusより`getattr()`を使用しなくても`vars()`のみ使用することで同様の操作が可能ではないかとのご指摘頂きました．
今回の記事は`getattr()`を用いることで，例えば指定された`list`型に格納された値のみを参照したい場合のことなども想定しているため，`dict`型の特性などを極力使わず，できるだけ原始的な方法で属性値にアクセスできる方法を紹介しています．
しかし，単一のオブジェクトに対して連続して属性値を取り出したい場合，`vars()`と`dict().keys()`の組み合わせによる方法が明快なため，その事例について追記いたします．原文はコメント欄を参照ください．

`vars()`は`dict()`型を戻り値としています．
またdict型の基本事項として，

```python
>>> for name in vars(pochi):
...     print(name)
...
name
age
sex
```
となり，`list`型と同様に`for`文を設定してしまうと，`dict().keys()`と同様の働きをしてしまい，辞書に登録されている名前を取り出してしまいます．

では，`dict().items()`を`for`ループで取り出すとどのような値が出力されるでしょうか．

```python
>>> for name in vars(pochi).items():
...     print(name)
... 
('name', 'pochi')
('age', 18)
('sex', 'male')
```
以上のように`tuple`型として辞書変数とその中身が取り出されていることがわかります．
これを応用することによって，`getattr()`を使用しなくても

```python
>>> for name, value in vars(pochi).items():
...     print(f'{name}:{value}')
...
name:pochi
age:18
sex:male
```
のように書くことができます．
【備忘録】Pythonのインスタンス（オブジェクト？）の中身を確認したいとき


# はじめに
機械学習のコードをいじっているとき，
出てきたバイナリファイルの中身を確認したいときがありますよね？
そんなとき用に備忘録として確認の仕方を残しておきます．

# 結論
Open-NMTでpreprocessを行った際に，`-save_data`引数に指定したファイルに保存されたバイナリ化したデータを対象に説明していきます．

pythonのインタラクティブモードでデータをloadすると以下のようになっていると思います．
（ここでは`training-data-en-de.vocab.pt`が対象データ）

```python
>>> import torch
>>> data = torch.load('training-data-en-de.vocab.pt')
>>> data
{'src': <onmt.inputters.text_dataset.TextMultiField object at 0x7f14bde081c0>, 'tgt': <onmt.inputters.text_dataset.TextMultiField object at 0x7f140916cee0>, 'indices': <torchtext.data.field.Field object at 0x7f140916cfd0>}
```

このとき，`data`はdict型ですが，それぞれの中身がオブジェクトとなっています．
このオブジェクトの中身を確認したい場合，組み込み関数の`vars()`か`dir()`を用います．

2つの組み込み関数を比較した結果が以下になります．

```python
>>> vars(data['src'])
{'preprocessing': None, 'postprocessing': None, 'is_target': False, 'fields': [('src', <torchtext.data.field.Field object at 0x7f14bde083d0>)]}
>>> dir(data['src'])
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'base_field', 'fields', 'is_target', 'postprocessing', 'preprocess', 'preprocessing', 'process']
```
ざっくり見てみると，
`vars()`はそれぞれの変数に何が格納されているのかdict型で返しているのに対して，
`dir()`は変数やクラスなどの名前をlist型で返してくれます．

# 参考文献
https://qiita.com/wakoit/items/659dd0fdbb16b214454f
https://docs.python.org/ja/3/library/functions.html
論文メモ：Pose Partition Networks for Multi-Person Pose Estimation

# 論文
**論文名**
*Pose Partition Networks for Multi-Person Pose Estimation*

**著者**
*Xuecheng Nie, Jiashi Feng, Junliang Xing, and Shuicheng　Yan*

**学会**
*ECCV2018*

https://openaccess.thecvf.com/content_ECCV_2018/html/Xuecheng_Nie_Pose_Partition_Networks_ECCV_2018_paper.html


# 概要
　　多人数姿勢推定のネットワークであるが、それまでのトップダウンでもボトムアップではもない新しい手法。流れとしては、パーツのコンフィデンスマップと人物の重心をもとにキーポイント候補を重心に埋め込み、キーポイントのグルーピングを行う。姿勢の推定はlocal greedy inference。複数のデータセットで最先端の性能を達成。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246925/667bfd91-a9aa-de4a-de56-02ab7ba4699a.png', width=500>
>Xuecheng Nie, Jiashi Feng, Junliang Xing, and Shuicheng Yan. Pose partition networks for multi-person pose estimation. In ECCV, 2018.

local greedy inference：貪欲法（greedy algorithm）と関係ある？近似アルゴリズムで問題を複数に分割することから組み合わせ最適化に強い（wiki情報）。グルーピングされたキーポイントの繋げ方の組み合わせ問題みたいな？？
# 貢献
- トップダウンでもボトムアップでもない、フィードフォワード型のソリューション
- 姿勢推定高速化のための、多人数関節分割を行う回帰モジュール
- 高い頑健性と精度

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246925/58eb3912-b69f-f8bc-f27a-81cde95d93b6.png', width=500>
>Xuecheng Nie, Jiashi Feng, Junliang Xing, and Shuicheng Yan. Pose partition networks for multi-person pose estimation. In ECCV, 2018.

# 評価
- MPⅡデータセットにおいてSOTA
- PASCAL-Person-PartデータセットにおいてSOTA
- WAFデータセットにおいてSOTA

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246925/7e3640be-03db-4cf7-ce67-69fd7737b979.png', width=500>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246925/059f2b41-e9d5-543f-a56f-6050bc0aa844.png', width=500>

>Xuecheng Nie, Jiashi Feng, Junliang Xing, and Shuicheng Yan. Pose partition networks for multi-person pose estimation. In ECCV, 2018.

WAF：人物の集合写真（平均6人）のデータセット。上半身がアノテーションされており、多人数姿勢推定のタスク。

#参考
- https://www.slideshare.net/DeepLearningJP2016/dlhuman-pose-estimation-eccv2018-117009678
Dockerが「Fatal Error Failed to ping backend API」というエラーを永遠に吐いてくる場合の解決策

# ことの発端
ある日、PCを再起動したら突然Dockerが

> Fatal Error 
Failed to ping backend API

というエラーを吐いてきた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290127/4f90d6c8-da45-2b85-a507-707eb612df8e.png)

# ググって解決を試みるも再発してしまった
https://qiita.com/yuya_yuzen/items/6c4943fe774e47a7f95c

上記の記事を参考にしてDockerのプロセスをKILLし、再起動するも同様のエラーが再発してしまった。
Dockerを起動するまでに時間を置いたりしたが、結局ダメだった。

# Dockerのアプリケーションを削除して再インストールしたら治った
1. AppCleanerのインストール
1. AppCleanerからDockerを削除
1. PCを再起動
1. Dockerを再インストール
1. Dockerを起動して動作確認

# 環境
MacBook Pro
macOS Mojave 10.14.6
2.7 GHz Intel Core i7
Power Queryでよく使う関数

Power QueryはExcelライクに使えるけれど、関数名が全然違う。ちっとも覚えられないので、Excel関数との対応表を作ってみた。随時更新。

# Excel関数
|Excel関数|Power Query関数|備考|
|:-|:-|:-|
|SUBSTITUE| [Text.Replace](https://docs.microsoft.com/en-us/powerquery-m/text-replace) |||
| (文字列の結合, &) | [Text.Combine](https://docs.microsoft.com/ja-jp/powerquery-m/text-combine?view=sql-server-2017)|||
|FIND|[Text.PositionOf](https://docs.microsoft.com/ja-jp/powerquery-m/text-positionof)|||
|LEFT|[Text.Start](https://docs.microsoft.com/ja-jp/powerquery-m/text-start)|||
|RIGHT|[Text.End](https://docs.microsoft.com/ja-jp/powerquery-m/text-end)|||
|MID|[Text.Middle](https://docs.microsoft.com/ja-jp/powerquery-m/text-middle)|||
|TRIM| [Text.Trim](https://docs.microsoft.com/ja-jp/powerquery-m/text-trim)|
|CONCATENATE|[Text.Combine](https://learn.microsoft.com/ja-jp/powerquery-m/text-combine)|Table.Combineと同じ動詞|
|MIN|[List.Min](https://docs.microsoft.com/ja-jp/powerquery-m/list-min)|
|MAX|[List.Max](https://docs.microsoft.com/ja-jp/powerquery-m/list-max)|
|YEAR|[Date.Year](https://docs.microsoft.com/ja-jp/powerquery-m/date-year)||
|MONTH|[Date.Month](https://docs.microsoft.com/ja-jp/powerquery-m/date-month)||
|DAY|[Date.Day](https://docs.microsoft.com/ja-jp/powerquery-m/date-day)||
|MOD|[Number.Mod](https://learn.microsoft.com/ja-jp/powerquery-m/number-mod)||
|INT|[Number.IntegerDivide](https://learn.microsoft.com/ja-jp/powerquery-m/number-integerdivide)||
|Thisworkbook|[Excel.CurrentWorkbook](https://docs.microsoft.com/ja-jp/powerquery-m/excel-currentworkbook)||

# Excelでやりそうな操作

|Excel|Power Query|備考|
|:-|:-|:-|
|`TRUE`, `FALSE`| `true`, `false` （←小文字！） ||
|10^8 （10の8乗）| [Number.Power](https://docs.microsoft.com/ja-jp/powerquery-m/number-power)(10, 8)|||
|IF(条件, 真の場合, 偽の場合) | if 条件 then 真の場合 else 偽の場合 | else以降は省略可 |
|IFERROR(処理, エラーの場合の処理) | try 処理 otherwise エラーの場合の処理 |
|if ○列 in {△, □} | if [List.Contains](https://docs.microsoft.com/ja-jp/powerquery-m/list-contains)({△, □}, ○) |
|数字xのn桁ゼロ埋め| [Text.PadStart](https://learn.microsoft.com/ja-jp/powerquery-m/text-padstart)([Text.From](https://learn.microsoft.com/ja-jp/powerquery-m/text-from)(x), n, "0")|
|年度での月順| Number.Mod([月] - 年度開始月 + 12, 12) | Excel関数なら、`MOD(月 - 年度開始月, 12)` |
|月を四半期に|Number.IntegerDivide(Number.Mod([月] - 年度開始月 + 12, 12), 3) + 1|Excel関数なら、`INT(MOD(月 - 年度開始月, 12), 3) + 1`。|

# その他

|操作|Power Query|備考|
|:-|:-|:-|
| 型変換)| [型変換いろいろ](https://docs.microsoft.com/ja-jp/powerquery-m/type-conversion) |
|文字列を数式として実行|[Expression.Evaluate](https://learn.microsoft.com/ja-jp/powerquery-m/expression-evaluate)("List.Sum({1, 2, 3})", [List.Sum = List.Sum])|
|1から10までの数字のリスト|1..10|結合は{1..10,12..20}|
|リストの連結（アペンド）| [list1 & list2](https://learn.microsoft.com/ja-jp/powerquery-m/m-spec-operators#concatenation)|
|Folder.Files関数で取得した結果から隠しファイルを除く|Table.SelectRows(ソース, **each [Attributes]?[Hidden]? <> true**)||
Arduino IDEでRaspberry Pi Picoを動かす　備忘録

　2021年11月10日記す。
###Arduino IDEにPicoボードの環境をインストールする
　ボードマネージャでpicoで検索し、Arduino Mbed OS RP2040 Boardsをインストールする。今日の最新版は2.5.2。
![2021-11-10 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/7110adce-6bfb-8282-e43d-cf756ac2d73b.png)

###環境
Arduino IDEは1.8.16、Windows10 21H1

###Arduino IDE
　ボードで、Raspberry Pi Picoを選択する。
![2021-11-10 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/a0286fdd-db9f-7cd8-8a83-c4851f61c6ee.png)
　USBケーブルで、Picoを接続する。ドライブRP2が見える。デバイスマネージャでCOMポートは存在しない。
　こまった。
　　https://circuitpython.org/board/raspberry_pi_pico/
から、CircuitPythonのUF2ファイルをダウンロードする。
![2021-11-10 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/492030eb-5f69-a533-ab2c-fc946e657abe.png)

　このダウンロードしたadafruit-circuitpython-raspberry_pi_pico-ja-7.0.0.uf2を、RP2ドライブにドラッグする。シリアルポートが出てくる。
　サンプル例のBlinkを読み込み、コンパイル、書き込みをする。成功。
　もう一度すると、書き込み途中で途中で失敗する。

　Bootselスイッチを押したままUSBケーブルをつなぎ、RP2ドライブを出す。再度、adafruit-circuitpython-raspberry_pi_pico-ja-7.0.0.uf2を、RP2ドライブにドラッグする。シリアルポートが出てくる。
　ボードマネージャでArduino Mbed OS RP2040 Boardsの古い2.0をインストールする。Blinkを書き込む。成功。そのままボードマネージャで最新版の2.5.2をインストールする。
　以降、書き込みに成功する。

　シリアルは、COMX(Raspberry Pi Pico)に表示が変わっている。


###不可解だ


###不明なUSBデバイス
　筆者は初期のデバイスを利用しています。最近のボードでは、不明なUSBデバイスという表示が出るようです。
　対処方法を書かれた方がおられます。
　　[RaspberryPiPicoが不明なUSBデバイスと表示されてしまった場合【解決方法】](https://www.hobbyhappyblog.jp/raspberrypipico-unknown-usb-error)
Docker上のDebianで日本語入力環境を構築する方法

# はじめに

DockerでNodeの公式イメージを使って開発環境を構築したのですが、日本語入力ができませんでした。基本、どの環境も英語だと思うので仕方ないですよね。。

でもやっぱり今のプロジェクトメンバー間では日本語で入力したい！と思ったので、Dockerに日本語入力環境を構築するためにネットで方法を調べてみました。

しかし、いろんな記事を渡ってみるも、なぜか思うように設定できない、、と約2時間奮闘してようやく設定できました。笑

# 環境

使用したイメージは、公式の`node:14.17.6`で、OSは`Debian: 9.13`でした。

# 実装方法
Dockerfileに以下を記述して、Docker環境を立ち上げる。

```Dockerfile:Dockerfile
RUN apt update \
  && apt install -y task-japanese locales locales-all \
  && locale-gen ja_JP.UTF-8 \
  && echo "export LANG=ja_JP.UTF-8" >> ~/.bashrc
```

# 補足
もし、`$'\r': コマンドが見つかりません`というメッセージが表示されたら、Windowsの改行コードが間違っていることが原因です。

以下をDockerfileに追加してみてください。

```Dockerfile:Dockerfile
# 日本語入力の設定をした後に以下を追記
RUN nkf -Lu ~/.bashrc > ~/.bashrc_copy
RUN mv ~/.bashrc_copy ~/.bashrc
```

nkfコマンドが使えない場合は、他に改行コードを変換する方法があるので以下記事などを参考に試してみると良いです。
[Windowsで作ったシェルスクリプトをLinuxでちゃんと使えるようにするメモ(改行コードの修正)](https://qiita.com/saken649/items/8bed3985ff986327cd26)

# 最後に
ネットで見た記事にそれぞれ異なる方法が書いてあったので、いろんな方法があるんだと思いますが、混乱するので一つに統一できたらいいのにな、とコッソリ思っています。
VBA Sleep

```vb
Option Explicit
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Function SleepTest1()
  Dim i                   '// ループカウンタ
  For i = 1 To 5
      '// 1秒停止
      Call Sleep(1000)
      Debug.Print Now
  Next
End Function
Function SleepTest2()
  Dim waitTime As Long
  waitTime = 2
  Call Sleep(waitTime * 1000)
  MsgBox (waitTime & " 秒ストップ")
End Function

```
|用語|備考|
|----|----|
|VBA7|Excel2010以上||
|PtrSafe |64 ビット バージョンの Officeで実行する場合必要||
|Sleep|ミリ秒(1秒の1000分の1)単位||
WSLでWebAssemblyの環境作ってみた

文献大体英語だったんで，素人ながら作ってみました
`html`関連は何も書いてないですが気が向いたら入れるかもしれないし，入れないかもしれない

とにもかくにも『温かい目』でご覧ください
## 環境
WSL:Ubuntu 20.04.3 LTS (GNU/Linux 4.4.0-19041-Microsoft x86_64)

## 下準備

```shell
apt update
apt install make cmake gcc g++
# chromeでもいいけど，firefox楽そうだったからfirefox入れてみた
apt install firefox firefox-locale-fa
```


## インストール
https://emscripten.org/docs/getting_started/downloads.html

```
git clone https://github.com/emscripten-core/emsdk.git
cd emsdk
./emsdk install latest
./emsdk activate latest
source ./emsdk_env.sh
```

毎回起動時同じことするの面倒なので`.bash_profile`とかに入れたほうがよさげ

```
echo 'source "$HOME/emsdk/emsdk_env.sh"' >> $HOME/.bash_profile
```

開発版使うとめっちゃ更新かかるので定期的にpullする  
もしくは嫌なら`latest`->バージョンに書き換える

```
git pull
./emsdk install latest
./emsdk activate latest
```
## コンパイル

`CMakeLists.txt`の作成

```cmake:CMakeLists.txt
cmake_minimum_required(VERSION 3.8)

project(main)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -msimd128 -msse -O3")
add_executable(main main.cpp)
if(EMSCRIPTEN)
    message("EMSCRIPTEN")
    set(CMAKE_EXECUTABLE_SUFFIX ".js")
endif(EMSCRIPTEN)
```


コンパイルしたらいろいろファイルできるはず

```shell
emcmake cmake .
emmake make
# em++ main.cpp -o main.js
```

## 表示
立ち上げ可能なブラウザ検索

```
$ emrun --list_browsers
emrun has automatically found the following browsers in the default install locations on the system:

  - firefox: Mozilla Firefox 94.0

You can pass the --browser <id> option to launch with the given browser above.
Even if your browser was not detected, you can use --browser /path/to/browser/executable to launch with that browser.
```

```
emrun --browser firefox main.html
```

WSLで初のブラウザだったら．．．
windows10に[vcxsrv](https://sourceforge.net/projects/vcxsrv/)を入れる
入れたアプリを開いて全部default（好み）で進む
閉じてXLaunchを開いて全部default（好み）で進む

```shell:Ubuntu
echo "export DISPLAY=localhost:0"  >> ~/.bash_profile
source ~/.bash_profile
```

## コーディング
たぶんCしか動かないので関数の前にいろいろつける
普通のc++でも動くかとか詳しいことは何も試してないのでここは温かい目で．．．

```c
EMSCRIPTEN_KEEPALIVE
extern "C" int add(int a, int b)
{
  return a + b;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1496346/255cf777-b066-8dd0-aab1-e25186440642.png)
コード書いてコンパイルすればこんな感じで表示までできます！
OpenCVより遅いので，とんとんになるくらいまでにします！
目指せ今月！！

## SIMD
https://github.com/WebAssembly/simd  
[SIMD と webassemblyのSIMDの対応](https://emscripten.org/docs/porting/simd.html)
またいつかSIMD関連いつか書きます

## 感想
文献英語ばかりとかはどうでもよくて，日本語英語合わせたところでめちゃくちゃ文献少ないので，参考になると嬉しいなと思います．

### 参考文献
https://tech.akat.info/?p=3219
Docker上のbashに直接、エイリアス（短縮コマンド）を設定する方法

# はじめに
Docker上で使うエイリアスは、ローカルの.bashrcや.bash_profileをマウントする方法もありますが、そもそもローカルに.bashrcや.bash_profileが無い場合はエラーになってしまいます。

プロジェクトメンバーによっては設定していない人もいる（かも）と思うので、どうしたものか、、と悩みましたが、その一つの解決方法として**ローカルをマウントすることなくプロジェクト内でエイリアスを定義して使用できるようにする**方法を考えてみました。

# 概要
Dockerで立ち上げた環境内にある.bashrc にエイリアスを追記することで、ローカルの .bashrcや.bash_profile をマウントすることなくDocker 内でエイリアスが使用できます。

# 実装方法
## 1. プロジェクトルートに.alias ファイルを作成して、追加したいエイリアスを記述

分かりやすいように.aliasファイルとしましたが、他の名前でも良いと思います。
今回は、gitコマンドのエイリアスを設定する例を挙げています。

↓.alias ファイルの中身（例）

```bash:.alias
alias g="git"
alias gs="git status"
alias gb="git branch"
alias gc="git checkout"
alias ga.="git add ."
alias gcm="git commit -m"
alias gcmam="git commit --amend"
alias gps="git push"
alias gpsoh="git push origin HEAD"
alias gfo="git fetch origin"
alias gplo="git pull origin"
alias glo="git log --oneline"
alias grl="git reflog"
```

## 2. プロジェクトルートに Dockerfile を配置して以下を記述

```Dockerfile:Dockerfile
FROM node:14.17.6

# エイリアスを設定
COPY ./.alias /root
RUN cat /root/.alias >> /root/.bashrc
```

立ち上げた環境内のルートディレクトリに.alias ファイルをコピーし、その内容を.bashrc に追記しています。
なぜかプロジェクトルートから直接.alias を.bashrc に追記できなかったので、一旦、ルートディレクトリにコピーを作成して追記しています。。

## 3. Docker で環境を立ち上げてターミナルからエイリアスが使えることを確認

これでDocker上でもターミナルからエイリアスが使えるようになると思います！
.bashrcに追記されている内容を確認するときは、`cat ~/.bashrc`で.bashrcの中身を確認してみてください。

# 最後に
プロジェクトメンバーが各々でエイリアスを設定している場合は今回の方法は使わなくて良いと思いますが、プロジェクト内でエイリアスを統一したい場合やエイリアス自体使うのが初めての人に紹介するときなどに良いのかなと思います。
iOSの場合、正常動作でもiceconnectionStateがdisconnectの状態が返ってきてしまう

# どんな現象か？

リモートからのvideoストリームを受信して、クライアント側のvideoタグで出力しようとしたところ何故かconnectionStateがdisconnectになってしまって焦ったお話し。

#発生したコード

videoストリームの取得は以下の様に至ってシンプル

```typescript
peer = new RTCPeerConnection({ iceServers: iceservers });
    peer.ontrack = async (event: RTCTrackEvent) => {
    this.onAddVideoStream(event.streams[0]);
};
```

取得したstreamをvideoタグに紐付けた変数に代入します。

```typescript
async onAddVideoStream(stream: MediaStream) {
    try {
      if (this.video) {
        this.video.srcObject = stream;
        video.play().catch(() => {});
        this.video.pause();
        setTimeout(() => {
          this.video.play().then((res: Response) => {
            console.log("playing start", res);
          })
            .catch((err: Error) => {
              console.log("error playing", err);
            });
        }, 0);
      }
    } catch (e) {
      console.log(e);
    }
}
```
#結果
PCではvideoタグを使ったstream出力に成功するも、iOSだとpeer.oncoonectionstatechangeが発生してpeer.connectionStateがdisconnectになってしまう。

最初iOSのvideo再生の仕様なのかと疑ったが、どうやらdiconnectが返ってきてもそのままvideo出力をすると見事に成功している。

そもそもdisconectのステータスってどういうこと？と調べてみると以下のサイトでは

https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/iceConnectionState 

>disconnected
Checks to ensure that components are still connected failed for at least one component of the RTCPeerConnection. This is a less stringent test than failed and may trigger intermittently and resolve just as spontaneously on less reliable networks, or during temporary disconnections. When the problem resolves, the connection may return to the connected state.


「コンポーネントがまだ接続されていることを確認するチェックが、RTCPeerConnectionの少なくとも1つのコンポーネントで失敗しました。これは failed よりも厳しいテストではなく、信頼性の低いネットワークや一時的な切断の際に断続的に発生し、同じように自然に解決する可能性があります。問題が解決すると、接続は接続状態に戻ります。」

どうも一時的に切断されるだけで、peerをリリースするほどではないということらしい。failedに遷移するものだけ拾えばいいねと思ったら

https://bugs.chromium.org/p/chromium/issues/detail?id=982793

どうもchromeではfailedに遷移することはないらしく・・・・致し方ないのでdisconnectが返却されても突き進むことで対応しました。この現象はどうも利用しているキャリア依存のようで、私のAU回線では発生していますが、Docomo回線では発生しない模様。
Unicodeまとめ

- コンピュータは数値のみ扱える
- →文字を扱うために文字に番号を割り当てる必要がある

文字コードの一般的な意味

- 符号化文字集合と文字符号化形式の両方
- 文字→(〇,△)等の割り当て　符号化文字集合の役割
- (〇,△)→0xAAAA,08E7,...等のbyte列への変換　文字符号化方式(shiftJIS等)の役割

- winはUnicodeを使用
- IME等の入力変換アプリはUnicodeで動いているので膨大な文字が入力の段階では候補に挙がる
- いざ入力しようとして、アプリがshiftJISを採用していると、unicode→shiftJISへの変換時にその文字が存在しないと文字化けする

#### ①符号化文字集合
- 例：JISが符号化文字集合の規格を作る
- 区と点で「16区5番はホニャララ」のように割り当てる
- 半角文字 JIS X 0201
- 漢字 JIS X 0208

#### 文字符号化方式
- 文字に割り当てられた数字をさらにbyte列に変換する。このときの変換方式がencoderで例えばshift JISやutf-8等。
- 〇区△点→コンピュータが扱いやすい形式への変換。



#### Unicode 標準
- Python の文字列型は文字表現のためのUnicode 標準を使用
- unicodeのコードポイントU+0000~U+10FFFF(110万)
- 文字符号化方式
    - utf-8 1文字が1~4byte
    - utf-16 1文字が2~4byte

例：
ある文字→U+〇△◇×                (文字符号化集合)
utf-8でU+〇△◇×→0x31,A9,FF...             (文字符号化方式)
utf-16でU+〇△◇×→0x2381,23E9,EEEE...    (文字符号化方式)
に変換。utf-16は「1文字が2~4byte」になっている。
[React] window resizeでリサイズする

##シンプルに従来の補法を使ってリサイズする方法
この方法は以前まで自分もよく使っていた方法です。
大事なので、useEffectのretrunでクリーンラップすることです。

```react
  const [WindowHState, setWindowHState] = useState<number>()

  const onChangeBody = () => {
    let timeoutId
    if (timeoutId) return
    timeoutId = setTimeout(() => {
      const H = document.getElementById('l_header').clientHeight
      setWindowHState(window.innerHeight - H - 80)
    }, 500)
  }

  useEffect(() => {
    window.addEventListener('resize', onChangeBody)

    return () => window.removeEventListener('resize', onChangeBody)
  }, [])

  useEffect(() => {
    if (ArrayState === true) {
      const H = document.getElementById('l_header').clientHeight
      googlemapsize.current.style.height = WindowHState
        ? WindowHState + 'px'
        : window.innerHeight - H - 80 + 'px'
    }
  }, [ArrayState, WindowHState])

```

簡単ではありますが、よかったら是非使ってみてください。
【CakePHP3】指定したキーの値を配列で取得する

普段、Laravelを主に使っていたのですが、CakePHPを業務で使用する機会があったので、備忘録として残します。

テーブルの`$item_id`で検索を立てて、該当するレコードの`name`を取得したいとします。

```php
$results = $this->DataBases
     ->find()
     ->where([
         'item_id' => $item_id,
     ]);
foreach ($results as $result) {
     $arrayData[] = $result->name;
}
dd($arrayData);
//結果：arrayData[名前1, 名前２, 名前3]
```
とりあえずこれでもうまくいったのですが、せっかくなのでCakePHPを使い倒したい！
ということでCakePHPの場合、下記の方法でも取得することができます。

```php
use Cake\Collection\Collection;
.
.
.
$results = $this->DataBases
     ->find()
     ->where([
         'item_id' => $item_id,
     ]);
$arrayData = $collection->extract('site_id')->toList();
dd($arrayData);
```
LaravelでいうところのCollectionのpluckメソッドの使い方に近いかもしれません。
CakePHPのcollectionクラスも覚えれば楽しめそうですね^^
Microsoft Access メモ

## フォームをオープン (VBA)
```vb
Sub formOpen()
  DoCmd.OpenForm "F_にゃんこ抽出条件"
End Sub
```

## フォームの値をクエリのパラメータに使用する方法

|項目|説明|備考|
|----|----|----|
|=[FORMS]![フォーム名]![コントロール名]|クエリ デザインモードの抽出条件に記述する|入力候補がつかえＲ|
```
SELECT
 *
FROM
 T_にゃんこデータ
WHERE (((T_にゃんこデータ.[キャラクター名])=[FORMS]![F_にゃんこ抽出条件]![にゃんこ名1]));
```

## Switch関数を使ったSQL
```SQL
SELECT 
 name,score,
 SWITCH(score >= 80, '○',score >50 AND score <= 79, '△',score <= 49, '×') AS grade 
FROM 
 student;
```
#### 参考
https://itlogs.net/access-sql-switch/
STM32を動かすための最低限の回路

## ターゲット
STM32を基盤実装して初めて回路を作りたいと思っている人
## よむとわかること
STM32の石を基盤実装して、Nucleoと同じように使えるようになるまでできます.
STMの石は色々ありますが、今回は446を使います

## 回路図 (F446)
<img width="1001" alt="スクリーンショット 2021-11-10 15.32.06.png (273.5 kB)" src="https://img.esa.io/uploads/production/attachments/11010/2021/11/10/54522/d0fe1e48-baca-498d-87f2-fe6326a1a345.png">

## 解説
### 1.右上のコンデンサ群
こちらは「バイパスコンデンサ」になります。0.1uFくらいでいいでしょう。基盤にするときには、**このコンデンサをVDD、VDDA、のピンそれぞれの近くに配置**してください。
電源基盤からSTMマイコンに来る間に電源に乗った**ノイズを除去するバリアの役割を果たします**。

### 2.左上のST-LINK
左上に配置してあるのはST-LINKです。今回はV3を使っています。
**ST-LINKはSTMにプログラムを書き込む装置**で、
SWDIO,SWCLK,SWOの最低3ピンあれば書き込みできます。
TERATERMでシリアルを読みたいので、USART2もつないでいます。
**MBEDの標準ストリームはUSART2なので1とか繋がないよう気をつけて**ください。

ST-LINKは、Nucleoを割ったやつでも代用できますが、**おすすめしません**。
理由は、「他人が書き込みしたいときピン配置が合わなかったりするから」です。
無駄な時間は減らしたいので、**STDC14**に合わせましょう。

STDC14はST-LINKV3のピン配置の規格で、この配置にしておけば完璧です。ST-LINKV3は秋月に売ってます。
https://akizukidenshi.com/catalog/g/gM-14361/

STDC14の実際の並びはこんな感じです
https://www.st.com/ja/development-tools/stlink-v3set.html#documentation
<img width="764" alt="スクリーンショット 2021-11-10 15.39.35.png (213.9 kB)" src="https://img.esa.io/uploads/production/attachments/11010/2021/11/10/54522/90b081c3-e296-464e-b90c-2e45cb608341.png">

基盤に実装するコネクタは、これを使うと安くて方向間違えもなくぴったりです
https://www.digikey.jp/product-detail/ja/cnc-tech/3220-14-0100-00/1175-1630-ND/3883664
<img width="640" alt="3220-14-0100-00.webp (10.8 kB)" src="https://img.esa.io/uploads/production/attachments/11010/2021/11/10/54522/3183e318-77d3-4e1e-8893-46bc16052ae2.webp">

### 3. 右側R1,R2
R1,R2はそれぞれ10kΩでよいでしょう。
これはSTMの起動モードを指定する抵抗で、
**BOOT0ピンをVCCにつなぐか、GNDにつなぐかを決めています**
R2を取り付けると通常起動、R1を取り付けると特殊な起動をします。
**普段R1は使わないですが、万が一のために場所だけ用意しましょう**
詳しいことは省きますが、変なプログラムを書いてしまってSTMに接続できなくなったとき使います。
「DNP」は、場所だけ用意したよって意味です。

### 4. リセットボタン
NRSTピンをGNDに接続するとSTMマイコンがリセットに入ります。
Nucleoについてる黒いボタンと同じ動きです。適当にタクトスイッチとかつけましょう。並列についているコンデンサはチャタリング防止用です。
参考にしたやつがついてなかったからいいや！って思ってプルアップ抵抗入ってないですが、入れたほうがいいような気もします．

### 5. 下 VCAPのコンデンサ
ここが一番面倒な仕様です。
STM32というのはすごいマイコンで、万が一メインのVCCが電圧降下した場合バックアップ電源のVBATに自動で切り替わる機能、スリープモードなどいろんな電源機能があります。そのため、**マイコン内部での駆動電圧は3.3Vよりも低い電圧で動いています**。

ではなんで3.3V入力できているかというと、内部にレギュレータが入っているからです。このレギュレータを安定して動作させるために、
メインのパスコンと別につけなければならないのが、**2.2μFのコンデンサです**。
https://www.stmicroelectronics.com.cn/resource/en/datasheet/stm32f446re.pdf
<img width="746" alt="スクリーンショット 2021-11-10 15.52.09.png (208.8 kB)" src="https://img.esa.io/uploads/production/attachments/11010/2021/11/10/54522/971741da-8571-4c8e-9693-296432250576.png">
この仕様については、データシート3.17.2節に解説があります。
STM32F303とかはVCAP端子ないので忘れやすいコンデンサですが、ないと不安定になるので気をつけてください。
逆にF7とかF0とかはもっと高機能な電源管理ピンがあるので気をつけてください。

STMの電源管理に興味ある人は、AN4488という日本語の電源のアプリケーションノートあるんでどうぞ
https://www.stmcu.jp/download?dlid=51505_jp

## おわりに
これでとりあえずF446は動かせるはずです。
がんばって基盤を作りましょう！！！
任意の米国株ポートフォリオの過去の成績をグラフで確認する

#概要
指定したポートフォリオの約30日前(任意に変更可)から現在までの推定資産総額を時系列でグラフ表示させます。
#結果
![1Tclub.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558316/72bdbcd5-d9c4-d410-bf68-a3c427300743.png)
#ソースコード
今回はポートフォリオが記述されたportfolio_define.pyと処理が記述されたAssessment.pyを使用します。

```portfolio_define.py
portfolio = {"AAPL":[1],"GOOG":[1],"TSLA":[1],"MSFT":[1],"AMZN":[1]}
```
この辞書型をフォーマットを真似ながら任意のものに変更してください。KeyとValueの数に制限はありませんが、多すぎるとある程度処理に時間がかかると思います。
例として過去30営業日?の1兆ドルクラブポートフォリオの実績を見てみます。

initの中のパラメータは任意に変更してください。
self.duration = 遡る営業日数 約一か月ちょっと... 30 
                             約1年... 300? 等
self.start = データ取得開始日：基本変更なしで良いと思いますが、1000営業日分とか取りたい場合はもっと前に設定する。

```Assessment.py
import datetime 
import portfolio_define 
import numpy as np
from matplotlib import pyplot as plt
import pandas_datareader as dt


class Portfolio_Assessment():
    def __init__(self):
        self.portfolio = portfolio_define.portfolio
        self.duration = 30
        self.start = "2019-01-01"
        self.end = datetime.date.today()
    
    #Utils 
    def JPY_X_rate_N_date(self,start_date, end_date):
        FX_info = {}
        JPYX_Rate = dt.DataReader("JPY=X","yahoo", start_date, end_date)
        for i in range(len(JPYX_Rate)):
            FX_info["{}".format(JPYX_Rate.index[i])] = JPYX_Rate["Close"][i]  
        return FX_info

    def stock_search_to_Date_Prices(self,stock_symbol,start_date, end_date):
        df = dt.DataReader(stock_symbol,"yahoo", start_date, end_date)
        return df.index,np.array(df["Close"])

    def main(self):
        #date USD JPY rate 
        FX_info = self.JPY_X_rate_N_date(self.start, self.end)


        data = {}
        for i, name in enumerate(self.portfolio):
            data[name] = [self.stock_search_to_Date_Prices(name,self.start,self.end)]

        X = []
        Y = []
        for i in range(self.duration):
            USD_total = 0
            for name in self.portfolio:
                if i== 0:
                    date = data[name][0][0][-(i+1):]
                    price = data[name][0][1][-(i+1):]
                else:
                    date = data[name][0][0][-(i+1):-(i)]
                    price = data[name][0][1][-(i+1):-(i)]
                USD_total += price*self.portfolio[name][0]
            try:
                temp = round(FX_info[str(date[0])],2)
                JPY = USD_total * round(FX_info[str(date[0])],2)
            except:
                JPY = USD_total * temp
            X.append(date[0])
            Y.append(JPY)
        plt.plot(X,Y)
        plt.tight_layout()
        plt.xlabel("Date")
        plt.ylabel("JPY")
        plt.title("Your Portfolio Performance")
        plt.show()
if __name__ == "__main__":
    PA = Portfolio_Assessment()
    PA.main()
```



#一言
日付毎、銘柄名毎に該当日の資産価格とドル円レートを元にポートフォリオの資産総額を日本円で算出し、最後にグラフ化した。
一見簡単そうな処理だったが、とりかかってみると複雑で困った。
【React】three.jsをreactで使ってみる(react-three-fiber)

#はじめに
これはメモである。

## 概要
three.jsのReact用ライブラリである「react-three-fiber」を使って
Reactで3Dオブジェクトを表示する。

とりあえずそのために調査をしたこと、キーワードを忘れないように並べておく
※細かい編集はあとでやる。

## 環境
 - codesandboxで作ったReact/TypeScript環境

## 現在までに登場しているライブラリ
 - three
 - react-three-fiber
 - react-three-drei

※ここからは、別で調べて使おうとしているライブラリ
 
 - react-progressbar-semicircle（円形ゲージ）
 - recharts （グラフ）
 - leader-line-new, react-leader-line（要素同士を線でつないでアニメーション付ける）

## 検証したこと
 - オブジェクトを作って表示
 - カメラやオブジェクトの位置や角度の変更
 - 3Dモデルを自分で作る（YouTubeで説明見ながらBlenderで作成）
 - 3Dモデルを読み込んで表示
 - 3Dモデルの色変更、透過変更、質感変更

![スクリーンショット 2021-11-10 19.17.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1243269/a126be60-bb5e-b581-174d-01a5cd7d927b.png)
![スクリーンショット 2021-11-10 19.17.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1243269/324c6b78-1bd4-e772-2ec5-79f90bbe5b4e.png)
![スクリーンショット 2021-11-10 19.17.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1243269/88b82646-451c-20bd-41aa-5661f5d0e124.png)

## 最後に
まだ編集中です。
完成までしばしお待ちを。
こういうのは、投稿することに意味があると思うのでとりあえず公開！
springframework.security JWT実装サンプル

# はじめに
springframework.securityでのJWT実装サンプルです調べてみると、「難しい・分からない」みたいなコメントがたくさん出てくるので、まとめます
実際、ほかにもサンプルはあるのですが、コピペしても動かないことが多々あったのでサンプルの1つとしてどうぞまた、「難しい・分からない」を解消するために処理の流れも追っていきたいと思います

# ソース
下記のソースをダウンロードしておいてください

https://github.com/HawkClaws/SpringSecurityJWTExample

# 必要なクラス群
+ SecurityConfig
  - springframework.securityのconfigを記載
+ User
  - springframework.securityの「UserDetails」の実装
+ UserRepository
  - UserモデルのRepository
+ UserServiceImpl
  - springframework.securityの「UserDetailsService」の実装
+ JsonUsernamePasswordAuthenticationFilter
  - ログイン処理をするフィルタ
+ JWTAuthenticationSuccessHandler
  - JWTを生成するハンドラ
+ JWTAuthenticationFilter
  - JWTを検証するフィルタ
+ JWTProvider
  - JWTの生成・検証の実装

# JWT生成・検証の流れ

下記と照らし合わせて見ると分かりやすいと思います

https://qiita.com/Naoto9282/items/8427918564400968bd2b

### JWT生成の処理
1. ログインを行う
    1. 「SecurityConfig」のクラスの「configure」メソッドの「addFilterBefore」で指定した「UsernamePasswordAuthenticationFilter」メソッド内で定義された"/api/v1/web/login/"がJWT生成のURLです
    1. ログイン認証は「JsonUsernamePasswordAuthenticationFilter」クラスの「Authentication」メソッドで行われます
    1. 「Authentication」メソッド内の「authenticate」メソッドで「UserServiceImpl」クラスの「loadUserByUsername」メソッドが呼び出され、DBからUserに紐づくUserデータを取得し、パスワードの検証を行います    また、ここで行われるパスワード検証は「SecurityConfig」クラスに定義した「passwordEncoder」メソッドのエンコーダーが使用されます
2. ログイン成功後JWTを生成しクライアントに返す
    1. ログイン成功後「JWTAuthenticationSuccessHandler」クラスの「onAuthenticationSuccess」メソッドが呼び出され、「JWTProvider」クラスでJWTが生成され、クライアントに返します
  
### JWT検証の処理
1. ヘッダーからJWTを取得
    1. 「SecurityConfig」のクラスの「configure」メソッドで定義されている通りJWT生成以外の全てのリクエストは「USER」ロールを持っていないとアクセスすることが出来ません    ロールを持っているかどうかのAuthenticationを「JWTAuthenticationFilter」で行います
    1. 「JWTAuthenticationFilter」クラスの「doFilter」メソッドが実行されます
    1.  JWTの検証が行われ、DBからUserに紐づくUserデータを取得し「Authentication」にセットされます    ここでセットされたロールが認証に使用されます
    1. 許可されているロールの場合、controller側へ処理が流れます


# 実際に叩く

- JWT無しで叩く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911989/82f2ac92-5ccc-119c-cdca-e93b8578d437.png)

- JWTを取得する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911989/d3d2e12b-5005-ae4e-34c4-8d99d6bb0345.png)

- JWTをヘッダーに載せて叩く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911989/3a19a476-bc3a-9d67-5fa2-b42207e57d62.png)

以上。

## 参考文献
JWTによるREST APIのログインを実現する

https://retheviper.github.io/spring/2020/06/10/spring-rest-api-login-with-jwt/
プライベートリレー とは

## 勉強前イメージ

リレー？

## 調査

### プライベートリレー とは

iOS15から提供が始まったiCloud+ サブスクリプションの一部のセキュリティ機能で、
有効化することで、Safariを利用したWEBサイトの閲覧履歴や接続元情報(IPアドレス)が匿名化されます

元々、インターネットを使用すると以下の情報がサーバ側で取得できますが、
プライベートリレーを有効化することで、誰が何を見たかを把握できないようにします。

- 誰が見たか → IPアドレス
- 何を見たか → アクセスログ

なので、自分の上記の情報がサーバ側に渡さなくなりますので情報が漏れません。

### chromeやfirefoxを使用した場合は？

プライベートリレーはSafariを介してのみ機能するので、
chromeやfirefoxを使用した場合はプライベートリレーは有効になりません。

## 勉強後イメージ

そもそもiOSよく知らないけど、こういうのがあるのね。
webサーバとかにアクセスログも出ないってことかね？

## 参考

- [iCloud+ のプライベート リレーとは何か、iPhone または Mac でそれを有効または無効にする方法](https://br.atsit.in/ja/?p=15876)
- [【iOS15】プライベートリレーとは｜オンオフの設定やメリットデメリット](https://bitwave.showcase-tv.com/private-relay/)
Zabbix トリガー 条件式 AND(&)、OR(|) が設定できない理由

# 発生している問題
Zabbixのトリガー設定で複数の条件をANDもしくはORで設定したい場合があるかと思いますが
その際に、Zabbixさんに「設定できないよ！」と言われた場合以下の原因が考えられます

# 問題の原因
Zabbixのバージョンによって、条件文 演算子の記載形式やサポートされる形式が異なる

# 対処について
ご利用のバージョンを確認いただき、Zabbixサイトにてサポートしている演算子を確認してください

[Zabbix Ver2.0](https://www.zabbix.com/documentation/2.2/jp/manual/config/triggers/expression)
※ANDとOR条件は、それぞれ、"&","|" で記載

[Zabbix Ver3.0](https://www.zabbix.com/documentation/3.0/manual/config/triggers/expression)
※ANDとOR条件は、それぞれ、"and","or" で記載、その他、演算子も追加されている


問題解決できたら幸いです:relaxed:
ExcelテーブルからSharepointリストを新規作成する方法

##ExcelテーブルからSharepointリストの作成

PowerPlatformを無料枠で活用する時、よく使うことになるSharepointリスト。
SharpeointサイトからローカルにあるExcelファイルを選択して、テーブル認識させる方法がありますが、Excel テーブルを SharePoint にエクスポートする方法を備忘録にしておきます。

###手順
1. テーブル設定
1. 「エクスポート」
1. Sharepointサイトのアドレスとリスト名入力　
1. 内容確認
1. 「完了」

#1 テーブル設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322371/e2286118-f9c8-6ac9-f76d-a6a2de5d0cc9.png)

#2「エクスポート」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322371/0fd6771c-72ac-1882-b7e8-784f467fe256.png)

#3 Sharepointサイトのアドレスとリスト名入力　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322371/2bc130b6-4bb4-c55e-e5d9-753dfc7431ba.png)

この時のアドレスは、サイトのトップページ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322371/607b1896-eaec-1a47-6a04-cc9c638315f7.png)

#4 内容確認
データ型の確認。後から編集できるので無視して「完了」を押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322371/8a79ac7b-280d-274a-7eae-8e194e58b3b0.png)

#5「完了」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322371/73a515a7-533c-0636-6274-3fe8b75b6ee0.png)


データ型を「ユーザー＆グループ」や「選択肢」にしたい場合は、ここからではできないので、エクスポート後に編集する。
【備忘録】LPIC1レベル1の学習環境を構築する

##はじめに
AWSクラウドプラクティショナーに続いて、LPICレベル1を取得するために
WindowsPC上にLinuxを動作させることにしました。

AWS上でEC2を用意すれば簡単な話しですが、ただいま無料期間中(750時間迄)ですが
9月に起動しっぱなしで650時間くらい消費しているので見送りました💦

###PC環境
これまではWindows上でLinuxを動作させる環境として、VMwareとVirtualBoxを使用するというのが常識でした。
が、Windows10になってWSL、最近ではWSL2がリリースされましたのでWSL2で環境構築してみます。

Windows 10 Pro 21H1

###インストールソフトウェア
・Windows Terminal　<-これ便利ですね
・Visual Studio Code　<-もともと使っていました　
・WSL2 (Ubuntu20.04 LTS)　<-UbuntuがStoreからDLできるなんて凄い！
・Git 2.33.1
・Docker 20.10.10

####参考資料
だれでもエンジニア/山浦清透さんのこちらの動画です。
[【Docker超入門 #2】環境構築 for Windows](https://youtu.be/LSQKHW01ACo)
この動画で言っていますが、Windows環境構築は手間がかかること、トラブルが多いということ、
なので、やっぱりMacが必要かなー。

###ハプニング
Gitまで順調に進んだのですが、Dockerをインストールしても動作せず💦
んーん、動画と同じに進めているのに不思議・・・

色々とググってみると、大元となるHyperVにチェックが入っていませんでした💦
そーいえば、過日、Windows10を再インストールしてましたね。
再インストール後はHyperVのチェックは付かないのですね( ..)φメモメモ

つづく

***
Wapper.vm.$nextTick 内の AssertionError を正しくハンドルする

# 環境

```bash
$ npm list vue
app@1.0.0 \app
├─┬ @vue/test-utils@1.2.2
│ └── vue@2.6.14 deduped
├── vue@2.6.14
└─┬ vuex@3.6.2
  └── vue@2.6.14 deduped

$ npm list mocha
app@1.0.0 \app
└── mocha@3.5.3
```

# 問題があるパターン
* DOM の構築後、もしくは更新後の状態を確認する為、`Wapper.vm.$nextTick` を用いて以下の用にテストコードを記述したとする。

```javascript:test.spec.js
describe('Form', function () {
  it('test', function (done) {
    const wrapper = mount(LoginForm)

    wrapper.vm.$nextTick(function () {
      expect(true).to.equal(false) // AssertionError を発生させる
      done() // done の call
    })
  })
})
```

* `npm run unit`実行してものログには`AssertionError`は表示されない
* 代わりに 「done() が 呼ばれてないぞ」エラーになる
* これじゃテストにならない

```bash:log
   Form
      × test
        Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
```

# 解決策

* [Mocha API](https://mochajs.org/#asynchronous-code) をよく読むと、非同期でのテストについて、２パターンあると紹介されている
* done() コールバックを直接呼ぶ or Promiseを返却する
* `Wapper.vm.$nextTick` は、`Vue.nextTick`と仕様が同じ。
* [Vue.js API](https://jp.vuejs.org/v2/api/#vm-nextTick)を読むと、2.1.0 からは実行環境によるが Promise がサポートされるとのこと（ポリフィルは必要）
* 因みに、`vm.$nextTick()`を引数無しで call すると、Promise を返すようになる。（Gitのどっかで見た。公式APIにも記載あり。）


## パターン１：`AssertionError`をハンドルし`done()`にエラーオブジェクトを渡して call する

```javascript:test.spec.js
describe('Form', function () {
  it('test', function (done) {
    const wrapper = mount(LoginForm)

    wrapper.vm.$nextTick()
      .then(function () {
        expect(true).to.equal(false) // AssertionError
        done()
      })
      .catch(err => done(err))
  })
})
```

```bash:log
   Form
      × test
        AssertionError: expected true to equal false
          at webpack:///test/unit/specs/components/molecules/test.spec.js:nn:xxx <- index.js:nn:xxx
```

* アサーションエラーがハンドルされている。
* エラー行も表示されるのでテストが可能。

## パターン2：Promise を返却する

```javascript:test.spec.js
describe('Form', function () {
  it('test', function () { // done を引数として受け取らない
    const wrapper = mount(LoginForm)

    return wrapper.vm.$nextTick()
      .then(function () {
        expect(true).to.equal(false) // AssertionError を発生させる
      })
      .catch(err => { throw err }) // エラーをキャッチして throw する。Error を内包した Promise が返却される
  })
})
```

```bash:log
   Form
      × test
        AssertionError: expected true to equal false
          at webpack:///test/unit/specs/components/molecules/test.spec.js:nn:xxx <- index.js:nn:xxx
```
* アサーションエラーがハンドルされている。
* エラー行も表示されるのでテストが可能。

# 参考

https://mochajs.org/#asynchronous-code

https://jp.vuejs.org/v2/api/#vm-nextTick

以上
WSL環境構築メモ

## はじめに
Ubuntuをぶっ壊したのでUSBデバイスのセットアップまでやってしまおうかなと思ってやってみます。

注意: 下記コマンドは危険

```
C:\Users\user>wsl --unregister Ubuntu-20.04
登録を解除しています...
```

## 環境
- Windows10
- WSL

```
C:\Users\user>wsl --status
既定のバージョン: 2

Linux 用 Windows サブシステムの最終更新日: 2021/11/05
WSL の自動更新が有効になっています。

カーネル バージョン: 5.10.60.1
```

### WSLのインストール
管理者権限でターミナル(cmdなど)を起動して、

```
wsl --install
```
または

```
wsl --install -d "Ubuntu-20.04"
```

### dotfiles
[dotfiles](https://github.com/smk7758/dotfiles)を実行！
以下その内容の一部。

#### aptのサーバー変更など

```
sudo perl -p -i.bak -e 's%https?://(?!security)[^ \t]+%http://ftp.jaist.ac.jp/pub/Linux/ubuntu/%g' /etc/apt/sources.list
sudo apt update
sudo apt upgrade
```

#### GUI環境を設定
参考: [WSL上にXサーバをインストールしてGUIを実現する（VcXsrv編）](https://atmarkit.itmedia.co.jp/ait/articles/1812/06/news040.html)

```
vim ~/.profile
```
上記で開いて、`export DISPLAY=:0.0` を追記する

```
sudo apt install x11-apps
source ~/.bashrc
xeyes
```

##### グラフ表示
```
sudo apt install python3-tk
sudo apt install tk-dev
```

https://matplotlib.org/2.0.2/faq/usage_faq.html#what-is-a-backend
https://ai-gaminglife.hatenablog.com/entry/2019/04/29/204841
https://www.itmedia.co.jp/help/tips/linux/l0450.html
WPFとMVVMについて

# 背景
ウィンドウズで開発する機会が激減して、知らない事が多くなったので知識のアップデートが必要になった。

# MVVM
https://elf-mission.net/wpf-prism-mvvm-net-core-getting-started-2020-index/


# WPF/MVVMフレームワーク
PrismとLibetが有名。後者は個人作成なので除外。やはりマイクロソフト製を選ぶと後々よいと思う。そのほか、MVVMCross, MVVMLIGHT など

https://www.fenet.jp/dotnet/column/%e8%a8%80%e8%aa%9e%e3%83%bb%e7%92%b0%e5%a2%83/1715/

Prism公式サンプル
https://github.com/PrismLibrary/Prism-Samples-Wpf
Sync Gateway利用方法：ドキュメントアクセスの制御

## ドキュメントアクセスの制御


### 読み取り（READ)アクセス制御

Sync Gatewayのクライアントは、（直接またはロールを介して）アクセスが許可されているチャネルに関連付けられたドキュメントにのみアクセスできます。

チャネルは、ドキュメントへの読み取りアクセス制御のみを実施します。（以下で説明する書き込みアクセス制御が行われない限り）ドキュメントにアクセスできるユーザーは誰でも、ドキュメントを更新することができます。

### 書き込み(WRITE)アクセス制御


ドキュメントの書き込みアクセス制御は、Sync関数内に適切なロジックを実装することのよって実現されます。
Sync Gatewayは、そのために、Sync関数内で利用することのできる、ヘルパー関数を提供しています。
この使用してドキュメントの更新と削除を許可されるユーザーを制御することにより、ドキュメントプロパティレベルで適用できます。


次の例は、ドキュメントの所有者のみが変更を行えるようにするSync関数ロジックを示しています。これは、現在ドキュメントの更新を実行しているユーザーが、そのドキュメントに所有者として記録されているユーザーであるかどうかを確認することによって行われます。


```JAVASCRIPT
function (doc, oldDoc, meta) { 
  if (oldDoc) {
    requireUser(oldDoc.owner); 
  }
}
```


変更を行うユーザーが変更前のドキュメントの所有者でない場合、`requireUser`コールで例外がスローされ、更新はエラーにより拒否されます。


## ヘルパー関数使用例
Sync関数APIのヘルパー関数の使用例を示します。


次の例は、ユーザー名が「snej」でない場合は例外をスローします

```JAVASCRIPT
requireUser("snej") 
```

ユーザー名がリストにない場合は例外をスローします

```JAVASCRIPT
requireUser(["snej", "jchris", "tleyden"]) 
```

ユーザーが「admin」ロールを持っていない限り、例外をスローします

```JAVASCRIPT
requireRole("admin") 
```

ユーザーがロールのいずれかを持っていない限り、例外をスローします

```JAVASCRIPT
requireRole(["admin", "old-timer"]) 
```

ユーザーが「event」チャネルを読み取るためのアクセス権を持っていない限り、例外をスローします

```JAVASCRIPT
requireAccess("events")  
```

ユーザーがチャネルのいずれかのアクセス権を持っていない限り、例外をスローします

```JAVASCRIPT
requireAccess(["events", "messages"]) 
```

## 注釈

Sync Gatewayによる同期は、アプリケーションのバックグラウンドプロセスで実施されます。すなわち、Sync関数による検証も、同じタイミングで実行されます。
本質的には、ユーザーは、自身が行ったデータ編集が有効かどうかを意識する必要があり、ドキュメントの保存を実行したタイミングで、無効な操作であることを知るべきだと言えます。
その意味で、Sync関数内での、書き込み権限の検証は、サーバーサイドでのデータの整合性を保証するための手段であり、クライアントサイドで別途検証が行われるべきであると考えることができます。


## 関連情報

https://docs.couchbase.com/sync-gateway/3.0/access-control-how-control-document-access.html