OmniAICreator/Qiita-1.07M huggingface dataset:
リージョンごとの使えるAzureのVMサイズを確認する方法

### はじめに

Azure（クラウド）はオンプレミスと違いあらかじめ指定した仮想マシンのサイズの中から自身にあったサイズのものを選ぶ必要がありますが、リージョンによって使えるサイズ（SKU）は様々です。この記事ではAzureの仮想マシンのサイズをチェックする方法をまとめます。

### 製品ページを確認する

一番簡単な方法は[製品ページ](https://www.thomasmaurer.ch/2021/02/how-to-check-the-available-vm-sizes-skus-by-azure-region/)を確認することでしょう。仮想マシンだけでなく、他のAzureのソリューションについてもリージョンごとの利用可否が確認できます。
![ProductpageVM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/f2c30d63-4283-d701-8fe6-2fe0125f4b5f.png)


### Azure Portalを確認する

Azure Portalからも確認することができます。この方法の良い点はスペックの詳細と価格についても確認できる点でしょう。ただしAzureにログインできる必要があります。
![PortalVMprice.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/9e478eec-8d66-1f51-2ea2-575a6f7b4d8d.png)

### コマンドで確認する

普段コマンドラインしか使っていないという場合はAzure CLIやAzure PowerShellからも確認できます。
Azure CLI
![AzureCLIVM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/63a3cb64-a80e-42ae-528d-6cc6e065e814.png)

Azure PowerShell
![PowerShellVM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/141ae900-defc-be63-6484-418de230eaef.png)

### まとめ

リージョンごとの使えるAzureのVMサイズを確認する方法をまとめました。日々新しいスペックを持ったVMが各リージョンで利用可能になるので必要なタイミング/使いやすいツールで有効活用するため、参考になれば幸いです。

### 参考

[How to check the available VM Sizes (SKUs) by Azure Region](https://www.thomasmaurer.ch/2021/02/how-to-check-the-available-vm-sizes-skus-by-azure-region/)
テスト94

```vb

'Accessのフォームに対するコード
Private Sub コマンド36_Click()

'○書式
'DoCmd.OpenForm フォーム名, フォームを開いた際のビュー, フィルターの名前, 抽出条件, データ入力モード, ウィンドウモード

'○DoCmd.OpenFormの「抽出条件」を使う時の注意点
'表示するフォームに対して､事前に表示させたいデータの
'テーブルまたはクエリを設定しておく必要がある...〆('ω' )ﾒﾓﾒﾓ

DoCmd.OpenForm "練習フォーム", acNormal, , "グループID='3'", acFormEdit, acDialog, txtbox1.Value

End Sub

'------------------------------------------------

Private Sub Form_Open(Cancel As Integer)

If Not IsNull(Me.OpenArgs) Then

    Me.txt報告3.Value = Me.OpenArgs

End If
    
End Sub
AutoGPT　python -m autogpt --gpt3only実行時のエラー対処【未解決】　ImportError: cannot import name '_imaging' from 'PIL' (c:\users\XXXX\anaconda3\lib\site-packages\PIL\__init__.py)

こんにちは！

次のYouTubeのAutoGPTのチュートリアルをなぞっていたところ、表題のコマンド実行時にエラーが発生し、
対処しましたので、五月雨式に記事にしています。メモ程度になりますので、ご容赦ください。

[【さよならChatGPT】過去一ヤバい完全自動AI「AutoGPT」のインストール手順と使い方
](https://www.youtube.com/watch?v=31eZz-aqY6E)

色々「モジュールが無いから出来ません」のエラーが出ますので、
随時、`pip install`していってどんどん`python -m autogpt --gpt3only`を再実行してください。

# その1
次のエラーで躓きました。
__ModuleNotFoundError: No module named 'yaml'__
```
pip list
```
では、ちゃんとPYYAMLがあるんですが・・・

よく調べると、anacondaのsite-packageには入っているというような状態でした。
```
pip install pyyaml
```
を改めて実行するとRequirement~と一行表示されて、既に"ここ"に入っているよと表示されるのです・・・

ところがsys.pathにこのanacondaのsite-packageが無く、
「あるんだけど、無い」という状態になっていたようです。

次の記事を参考にしました。
[pipでモジュールを確かにインストールしたはずがModuleNotFoundErrorと出た時の解決法初心者的理解](https://qiita.com/yutoman027/items/7ee796c41575eb0511c3)

結果、エラー消えました。👏
なんか、.pthというファイルを作って、入れたいpathを記述しておいて（¥は¥¥にすることに注意）、
既にsys.pathに載っているpathの中でも、site-packageとなっているディレクトリに保存するみたいな・・・

でもそうすると、pythonインタープリターを起動すると次のようなエラーが出てきます。
```
C:\Users\XXXX>python
Python 3.11.0 (main, Oct 24 2022, 18:26:48) [MSC v.1933 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
Failed calling sys.__interactivehook__
Traceback (most recent call last):
  File "<frozen site>", line 445, in register_readline
  File "c:\users\XXXX\anaconda3\lib\site-packages\readline.py", line 34, in <module>
    rl = Readline()
         ^^^^^^^^^^
  File "c:\users\XXXX\anaconda3\lib\site-packages\pyreadline\rlmain.py", line 422, in __init__
    BaseReadline.__init__(self)
  File "c:\users\XXXX\anaconda3\lib\site-packages\pyreadline\rlmain.py", line 62, in __init__
    mode.init_editing_mode(None)
  File "c:\users\XXXX\anaconda3\lib\site-packages\pyreadline\modes\emacs.py", line 633, in init_editing_mode
    self._bind_key('space',       self.self_insert)
  File "c:\users\XXXX\anaconda3\lib\site-packages\pyreadline\modes\basemode.py", line 162, in _bind_key
    if not callable(func):
           ^^^^^^^^^^^^^^
  File "c:\users\XXXX\anaconda3\lib\site-packages\pyreadline\py3k_compat.py", line 8, in callable
    return isinstance(x, collections.Callable)
                         ^^^^^^^^^^^^^^^^^^^^
AttributeError: module 'collections' has no attribute 'Callable'
```
このエラー文の後に続くpythonの対話モード（>>のモードが表示される）自体は使えるんですけどね。

これについては、chatGPTに質問したら、readlineをアンインストールしろみたいな話になり、翌日試したら、何故かこのエラーが消えました。再現性低くてすみません。

# その2
続いて・・・これが本命となるのですが、
今最も苦しめられているエラーが、
__ImportError: cannot import name '_imaging' from 'PIL' (c:\users\kgwtm\anaconda3\lib\site-packages\PIL\__init__.py)__
というエラーです。
```
pip uninstall pillow
pip install pillow
```
をしても一向に解決しません。

また、解決したら記事にさせて頂きます。
お気づきの点ございましたら、コメントを頂けますと大変ありがたいです。

ここまで・・・・

以上、
宜しくお願い致します。
Djangoのクエリセットの評価タイミング

クエリセットの評価タイミングで、正しくない動作をしていたコードを修正したので、メモです。

# ダメだったコード
```python:ダメ
def update():
    update_user_ids = Users.object.filter(status=True).values_list('id').all()
    update_count = Users.object.filter(status=True).update(status=Fasle)
    
   return update_count, update_user_ids
```

この関数では、updateしたuserのidとその件数を返すものです。

しかし、実際に更新した`update_count`と`update_user_ids`の件数が異なっていました。（`update_user_ids`は空の配列）

# クエリセットの評価タイミング

`update_user_ids = Users.object.filter(status=True).values_list('id').all()`

この時点では、update_user_idsにクエリセットが構築されただけで、実際にDBへのアクセスは行われていません。
クエリが実行されるのは、実際の値が必要になったタイミングです。（遅延評価というみたい）

update前の結果を代入したつもりですが、実際には評価されておらず、update後に評価されると対象はすでに存在せず、空の配列が返っていました。

```python:正しい
def update():
    update_user_ids = list(Users.object.filter(status=True).values_list('id').all())
    update_count = Users.object.filter(status=True).update(status=Fasle)
    
   return update_count, update_user_ids
```

`list()`にすることで評価されて、update前の値を取得します。


（この記事書いていて思ったのですが、`return update_user_ids, update_count`の返り値の順番を入れ替えてもできるのでは・・・）

# 参考
https://djangobrothers.com/blogs/django_queryset_cache/
proxmox 7.4 create LVs で止まる場合、15分ほど待てば進む

## 参考

* [Proxmoxのインストールが3%の「LVの作成」にスタックしました。ヘルプガイ| Proxmoxサポートフォーラム](https://forum.proxmox.com/threads/proxmox-installation-stuck-on-3-creating-lvs-please-help-guys.94650/)

* [Proxmox Installation Stuck at 3%: “Create LVs” | Thomas' Miniblog](https://thomas.vanhoutte.be/miniblog/proxmox-installation-stuck-at-3-create-lvs/)

* [Proxmoxのインストールが3%の「LVの作成」にスタック:r / Proxmox](https://www.reddit.com/r/Proxmox/comments/pc52lv/proxmox_installation_stuck_on_3_creating_lvs/)

## 原因

* NVMeのDISKが搭載されているときに起こる模様。


## 対処

* 自分の環境でも発生。15分ほど待てば進んだので、辛抱強く待てばよい。
AnacondaのUpdateでcannot update anaconda navigator condamultierrorのエラー

こんにちは！

表題の通り、AnacondaのUpdateが予約されていて、ポップアップに従って、Updateしようとしたら、
cannot update anaconda navigator condamultierrorのエラーが出て、全然進みませんでした。
![Anacondaのupdateが終わんねぇ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448893/2f85392c-6750-47c1-7e55-0c772ccfaae4.jpeg)

ちょっと悪戦苦闘しましたので、続く方の為に、記事を作成します。

解：Anaconda Promptにて・・・
```
conda deactivate　←仮想環境に入っていた場合、念の為
pip uninstall setuptools
conda install -c anaconda setuptools
conda install anaconda-navigator=2.4.0
 （2.4.0←updateのポップアップで指示されていたVer.）
```

次のStackOverflowの4番目のAnswerを採用しました。
[RemoveError: 'requests' is a dependency of conda and cannot be removed from conda's operating environment](https://stackoverflow.com/questions/54392995/removeerror-requests-is-a-dependency-of-conda-and-cannot-be-removed-from-cond)

また、次の記事を参考にしました。
<https://you.com/search?q=cannot+update+anaconda+navigater+condamultierror&tbm=youchat&cfr=chatb&cid=c2_fa83d09f-b777-4ad0-aa3a-1e8e05c9471c>

以上、
お役に立ちますと幸いです。
AccessのVBAで配列を扱う際の基礎知識（固定長、可変長）

# 固定長（その1）

変数宣言時には要素数を指定せず、 ```Array()``` で初期化する方法。

```vb:動作確認用サンプルコード
Dim arr_1_() As Variant
arr_1_ = Array("あ", "い", "う")

Dim val_1_ As Variant
For Each val_1_ In arr_1_
    Debug.Print val_1_ & "　ですね"
Next
```

要素数が多くなったり、要素の値が長いと ```Array()``` が横にどんどん長くなってしまう。
（コードの可読性が落ちる）
また、後述のような注意点もある。

## 変数はVariantで宣言が必要

下記コードはコンパイルエラーにならない、しかし…

```vb:コンパイルは通るのに実行時に例外となるサンプル
Dim arr_1_() As String
arr_1_ = Array("あ", "い", "う")
```

実行時に下記のように例外になってしまう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/26495eb6-2401-853f-b2f3-f98cbe5e61ab.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/9c6536f1-228a-935a-ab5f-ce2e2dfaf1d4.png)

# 固定長（その2）

『最大インデックス』を指定して変数宣言する方法。
『要素数』ではなく『最大インデックス』なので注意。

```vb:動作確認用サンプルコード
Dim arr_2_(2) As String
arr_2_(0) = "いち"
arr_2_(1) = "にー"
arr_2_(2) = "さん"

Dim val_2_ As Variant
For Each val_2_ In arr_2_
    Debug.Print val_2_ & "　ですね"
Next
```

# 可変長

```ReDim Preserve``` を使って配列を再定義。

```vb:動作確認用サンプルコード
Dim arr_3_() As String

Dim i_ As Long
For i_ = 0 To 2

    'ReDimで配列を再定義できる。
    'しかし、ReDim『だけ』だとそれまで入っていた要素を全て消してしまう。
    'なので、 Preserveを付けている。
    ReDim Preserve arr_3_(i_)

    'UBound()で配列の『最大インデックス』が取得できる。
    arr_3_(UBound(arr_3_)) = (i_ + 1) & "ばんめ"

Next

Dim val_3_ As Variant
For Each val_3_ In arr_3_
    Debug.Print val_3_ & "　ですね"
Next
```

実行結果は下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/d1317eb9-c5ae-9c29-2588-aaa2481eb198.png)


## 変数宣言時に最大インデックス指定するとコンパイルエラー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c0fcadb2-dc21-dcd8-d25d-2bbebb3e7ffc.png)

# 蛇足

『固定長（その1）』は一見便利そうだが、『人が気を付けてコーディングする必要がある』という点があるのでやめた方がいい。

『固定長（その2）』は『要素が固定』という前提が崩れることがほぼゼロ％が場合に限りアリ。

要素が動的に変わる（変わる余地がありそう）なら、配列ではなく連想配列（Scripting.Dictionary）を使った方がいい。


# 参考サイトさん

https://excel.step-learn.com/contents/00/e0042-vba-array-erase.html

https://www.sejuku.net/blog/70180

# バージョン

Windows 10 Pro 22H2 19045.2913
Microsoft Access for Microsoft 365 MSO (バージョン 2304 ビルド 16.0.16327.20200) 32 ビット
【Python】競プロをpytestでデバッグしやすく

# 1. はじめに

AtCoderやPaizaのプログラミング課題で標準入力からデータを入力させられることが多いです。

Pythonの場合、
~~~Python
input()
~~~
を用いて値を受け取る必要があるので、自分の環境でデバッグする際に少々厄介だと思っていました。 テストケースが複数与えられた場合も入力の手間がかかりますし…

そこで、pytestを用いて**一度に複数のテストケース**を**標準入力から**入力してデバッグが行えるようなコードを考えてみたので記しておきます。

結論から先に記すとこのように、提出したいコードのままエディタで製作できますし、ブレークポイントを設定してのデバッグも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293457/7b721c2c-da94-d188-0c30-97b290ee43e1.png)

# 2. 環境
- エディタ：VScode
- 言語：Python

VScodeでのPythonの環境構築については省きますが、pytestを用いるので
~~~sh
pip install pytest
~~~
でインストールを行います。仮想環境を用いる場合は適宜調整してください。

VScodeでのpytestの利用に関しては、以下のサイトが参考になりました。

https://blog.logical.co.jp/entry/2022/09/28/163000

# 3. ソース
例えば、次のようなディレクトリ構成にします。

~~~
repo/
├── src
│   ├── input/
│   │   ├── input1.txt
│   │   ├── input2.txt
│   │   ~~~
│   ├── output/
│   │   ├── output1.txt
│   │   ├── output2.txt
│   │   ~~~
│   ├── main.py
│   └── test_main.py
~~~

- `input` : テストケース(入力)をテキストで記述
- `output` : 期待される出力を記述
- `main.py` : コーディング課題を記述する。
- `test_main.py` : テストケースを呼び出し、テストを行う。

以降`Welcome to AtCoder`の課題を解くことを例に挙げて記述します。

https://atcoder.jp/contests/abs/tasks/practice_1

## `input#.txt`と`output#.txt`
それぞれ、次の通りにします。

~~~txt:input1.txt
1
2 3
test
~~~

~~~txt:output1.txt
6 test
~~~

※テストケース2以降の場合も同様

## `main.py`
~~~python:main.py
def main():
    # 関数やスクリプトを記述
    a = int(input())
    b, c = map(int, input().split())
    s = input()
    print("{} {}".format(a+b+c, s))

if __name__ == '__main__':
  main()
~~~

## `test_main.py`
`main.py`の`main`関数を呼び出してテキストで保存したテストケースを読み取り、標準入力として与えます。

~~~python:test_main.py
from main import *
import pytest
import io

@pytest.mark.parametrize(('fileNo'), [1, 2,]) #適応したいテストケースの番号をリストとして与える
def test_case(capsys, monkeypatch, fileNo):
    inputs, outputs = load_data(fileNo)
    monkeypatch.setattr('sys.stdin', io.StringIO(inputs)) #標準入力にファイルの内容をセット 
    main()
    results, _ = capsys.readouterr()
    assert results == outputs + "\n" #出力が答えと一致するか検証

def load_data(fileNo):
    inputFile = F"src/input/input{fileNo}.txt"
    outputFile = F"src/output/output{fileNo}.txt"
    with open(inputFile, "r") as f:
        inputs = f.read()
    with open(outputFile, "r") as f:
        outputs = f.read()
    return inputs, outputs
~~~

# 4. 実行
VScodeでの`テスト`バッジからpytestを実行すると、テストケースごとの結果得られます。その他デバッグも可能です。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f333239333435372f37623732316332632d646139342d643138382d306333302d3937623239306565343365312e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293457/49538788-bda6-b1ff-6c69-a1d661ec8db4.png)

# 5. まとめ
正直に言うと、私は競技プログラミングは超苦手なのでデバッグできるようになって良かったです。

私のgithub上に本記事で紹介したのと同様のものを挙げています。
ココではdevcontainerを用いて諸々が動作する開発環境を構築することができます。

https://github.com/GawinGowin/codecheck

## その他参考
- https://rurukblog.com/post/Pytest-Discovery-Error/
- https://rinatz.github.io/python-book/ch08-02-pytest
私のポモドーロテクニック

## ポモドーロテクニックとは
- 25分作業、5分休憩のセットを繰り返して、4セット実施したら15分休憩する作業の進め方
- メリット
    - 一つのタスクに集中できる
    - 続けていくうちに作業の見積もりの精度が上がっていく
## 私のやり方
- 26分作業、4分休憩
- 26分より早くタスクが終わったら次のタスクに取り掛かる
- 始業時に今日やるタスクの一覧を作る
    - 最大でも2ポモドーロ（2セット）になるようにタスクを細分化する
- 休憩の時は、椅子から立ち上がってストレッチ
    - 腰痛にならなくなった

## 時間配分
最初は25分作業、5分休憩でやったが5分休憩が長く感じたので、27分作業、3分休憩でやってみた
3分休憩だと短すぎたので4分休憩にしてみたらちょうど良かった

## タスクの細分化によるメリット
- 最大でも1時間以内に終わる単位でタスクを詳細化するので、やるべきことが明確になる
- 大きなタスクより小さなタスクの方が精神的に取り掛かるハードルが下がる効果も得られる

## 最後に
オンラインだと話しかけられて中断することはないのでやりやすい
オフラインではあまりやったことないけど、本とかで「私はポモドーロテクニックをやるから話しかけないで」と意思表示するなどの話があるけど、そこまでメンタル強くない
clipをインストールする

# 目標
* ローカル環境でvenvのpython実行環境を用意する、
* clipにて画像を処理する。

# 環境
* Mac Apple M1 13.3（22E252）
* python3.9.10
* pythonやhomebrewは入っているものとする

# 手順及び途中で発生したエラーの解決 
1. 仮想環境を作成する
    1. python3.9 -m venv myenv
    1. source myenv/bin/activate
以降はvenv環境内

1. pyTorchとCLIPをインストールする
    1. `pip install torch torchvision torchaudio
    1. `pip install clip`
注釈： pythonバージョンは3.9を推奨する。3.6, 3.7, 3.8, 3.9に対応。3.10での動作は公式には明示されていないため
1. pythonコードやサンプル画像データの配置
    1. venv環境の直下にプロジェクトフォルダを任意に作成し、その中にコードを配置する
    1. ファイル用に、そこにimageフォルダを作成
    1. ファイルは、コード上では親環境(mac)の絶対パスを教える
```python
image_path = '/環境の絶対パス/myenv/myProject/image/test_image_data.png'

// これでファイルを読み込める
image = preprocess(Image.open(image_path)).unsqueeze(0).to(device)
```

1. pythonを実行する

### エラーが発生した場合
* 実行時に次のエラー
* `AttributeError: module 'clip' has no attribute 'load'`

```
raceback (most recent call last):
  File "//myenv/myProject/cliptest.py", line 12, in <module>
    model, preprocess = clip.load("ViT-B/32", device=device)
AttributeError: module 'clip' has no attribute 'load'
```


以下のurlに従い対処
https://github.com/openai/CLIP/issues/329

```
pip install git+https://github.com/openai/CLIP.git
```

### 実行時にSSLエラー

```
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1129)
```

次のurlを参考に対処
https://tektektech.com/python-ssl-certification-verify-failed/

* Macintosh HD > Application > Python 3.9 以下にある　`Install Certificates.command` を実行すると自動設定される



### 実行と出力結果の期待値

```bash
(myenv) $ python cliptest.py 
100%|███████████████████████████████████████| 338M/338M [00:59<00:00, 5.94MiB/s]
tensor([[1.]])
```

# サンプルコード
```python
import torch
import clip
from PIL import Image

image_path = '/venvを置いてある絶対パス/myenv/myProject/image/test_image_data.png'


# デバイスの指定
device = "cuda" if torch.cuda.is_available() else "cpu"

# CLIPモデルの読み込み
model, preprocess = clip.load("ViT-B/32", device=device)

# 画像の読み込みと前処理
image = preprocess(Image.open(image_path)).unsqueeze(0).to(device)

# テキストの読み込みと前処理
text = clip.tokenize(["a cat on a table"]).to(device)

# 画像とテキストの類似度を計算
with torch.no_grad():
    image_features = model.encode_image(image)
    text_features = model.encode_text(text)
    similarity = (100.0 * image_features @ text_features.T).softmax(dim=-1)

print(similarity)

```
Salesforce認定アドミニストレーター試験合格後に狙えるSalesforce資格

こんにちは
本橋孝昭です

私はSalesforce認定資格を14個保有しています
（2023年5月現在）

https://trailblazer.me/id/takaaki

今回は、そんな私が考える
「Salesforce認定アドミニストレーター試験合格後に狙えるSalesforce資格」を解説します

これを見れば、Salesforce認定アドミニストレーター試験合格後に何の資格に挑戦するかが分かればと思います


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

https://youtu.be/YUuQplAaW2Y

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



## そもそもSalesforceの資格ってどれくらいあるの？

こちらを見れば分かるように資格数は（日本語版だけでも）20個以上はあります

![引用.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/85e3c6e9-eb42-ee41-1d17-0b6880a66ad1.png)

引用先
https://tandc.salesforce.com/credentials

## Salesforce認定アドミニストレーター試験合格後に受けるお勧めの資格

私のオススメの資格は
・Salesforce認定Platformアプリケーション
です

こちらはSalesforce資格の立ち位置としては
「開発者、アーキテクトにおすすめのファーストステップ」のようなので、初心者向けの資格のようです


そして、Salesfroce認定アドミニストレーター試験とSalesforce認定Platformアプリケーションビルダーでは同じような範囲が多いです

受験ガイドを参考にすると以下のようになります

※SALESFORCE 認定アドミニストレーター
https://quip.com/5FXlAAIRTrqo/SALESFORCE-


※SALESFORCE 認定 PLATFORM アプリケーションビルダー
https://quip.com/93hBAkbHvatd/SALESFORCE-PLATFORM-



（ 認定アドミニストレーター）
生産性向上とコラボレーション:
AppExchange アプリケーションのユースケースを特定する。

（認定 PLATFORM アプリケーションビルダー）
SALESFORCE の基本
AppExchange を使用した組織拡張の一般的なシナリオを特定する 



（ 認定アドミニストレーター）
ワークフロー/プロセスの自動化
ワークフロールール / プロセスビルダー / 承認プロセスの機能とユースケースを説明する。

（認定 PLATFORM アプリケーションビルダー）
 ビジネスロジックとプロセスの自動化
* 与えられたシナリオに従って、承認プロセスの機能とユースケースを説明する
* 与えられたシナリオに従って、ワークフロー、フローおよびプロセスビルダーの機能とユースケースを説明する 

（ 認定アドミニストレーター）
生産性向上とコラボレーション
Chatterの機能について説明できる。

（認定 PLATFORM アプリケーションビルダー）
SALESFORCE の基本
Chatter のカスタマイズ方法とユースケースを説明する 



（ 認定アドミニストレーター）
データ管理＆分析
レポートまたはレポートタイプを作成またはカスタマイズする際に利用可能なオプションを説明することができる。
ダッシュボードを作成および変更する際に利用できるオプションを説明する（例：ダッシュボードコンポーネント、データソース、グラフの種別、ダッシュボードの登録、実行ユーザ）

（認定 PLATFORM アプリケーションビルダー）
レポート、レポートタイプ、ダッシュボードの作成時に利用できる機能を説明する 


以上のことから、Salesforce認定アドミニストレーター試験合格後に何か資格を取りたい場合は認定 PLATFORM アプリケーションビルダーを私はおすすめします

## PLATFORM アプリケーションビルダー勉強方法は？

勉強方法はこちらにまとめてありますのでご確認ください

https://qiita.com/Takaa/items/6434c5838e23f409d01f

（練習問題解説動画一覧はこちらです）

https://www.youtube.com/playlist?list=PLz8HSF-SrLeFbxLWqQHK0XZdn662RG6jo


## 番外編　認定アドミニストレーター試験よりも簡単な試験？認定アソシエイト試験

Salesforce認定アドミニストレーターよりも前段階の資格が実は存在します
認定アソシエイト試験です
認定アソシエイト試験は2023年2月から日本語版がスタートした比較的新しい資格であり、また認定アドミニストレーターよりも前段階の資格なので、正直この資格を取る意味はあるのか？と突っ込まれたら、まあ正直なところ微妙なのですが、とにかく資格を１つでも多く取得したい　という人はお勧めです

また、再試験は無料で資格取得費用は認定アドミニストレーター試験よりも安いのはお勧めですね

## 認定アソシエイト試験勉強方法は？

勉強方法はこちらにまとめてありますのでご確認ください

https://qiita.com/Takaa/items/d35c9955fe8eb889d76b?utm_campaign=post_article&utm_medium=twitter&utm_source=twitter_share

（練習問題解説動画一覧はこちらです）

https://www.youtube.com/watch?v=RCw-CHO8a8E&list=PLz8HSF-SrLeGA3OcX5wuL6b9Tfdm0xf6W
ビルボードで最強の銃弾エフェクトを作る

## 前回
弾丸シェーダーを作りたくてShaderGraphを触っていたので、下の4つの記事の最後になります

https://qiita.com/archeleeds/items/1100c773a1740b7e7de0

https://qiita.com/archeleeds/items/fe4d487105b0fac7ea92

https://qiita.com/archeleeds/items/14eba47866e6ed0f1d6b

https://qiita.com/archeleeds/items/c995608d700446745d12

## 概要
今回実装するのは画面上のサイズの最低サイズを保証するシェーダーです
BattleFieldとかAPEXとか戦場が広いFPSのゲームは、
どこからどこに銃弾が飛んでいるのか、自分の銃弾がどこに着弾したかわかるように工夫されているので真似て見ようと思います
<iframe width="560" height="315" src="https://www.youtube.com/embed/YEICsH8nj3g?start=40" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

## 出来るもの
<iframe width="560" height="315" src="https://www.youtube.com/embed/qyFDNPNuBks" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
モバイルのこの手のゲームでは見やすさの保証は必須だと思います

## ShaderGraph
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154377/0536de60-4cc5-95ea-a66a-afe0ae392a72.png)

今回の追加部分
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154377/e51854ec-c5d5-42fb-be6d-403d4e799917.png)
（Lengthを0.01倍しているのはDivideの後でも良いかもしれません）

## 解説
視野角や距離に応じて大きさを一定に調整する計算は [かもそばさんの記事](https://zenn.dev/r_ngtm/articles/shaderlab-outline-2) を参考にしました

https://zenn.dev/r_ngtm/articles/shaderlab-outline-2

Projection行列の[1][1]に `tanθ⁻¹` が入っているのでそれで距離を割ると、
画面上の大きさを維持出来る係数が手に入るので、
Maximumで1倍以下にならないようにして適当に調整用の係数をかければ必要な値が手に入ります
paiza.ioでelixir その221

# 概要
paiza.ioでelixirやってみた。
練習問題、やってみた。

# 練習問題
gtkwaveのvcdファイルを生成せよ。

# サンプルコード

```
defmodule Va do
	use Agent
	def start_link() do
		Agent.start_link(fn ->
			0
		end, name: __MODULE__)
	end
	def get() do
		Agent.get(__MODULE__, fn v ->
			v
		end)
	end
	def inc() do
		Agent.update(__MODULE__, fn v ->
			v + 1
		end)
	end
	def set(x) do
		Agent.update(__MODULE__, fn v ->
			x
		end)
	end
end

defmodule Main do
    def main(src) do
        IO.puts "$date"
        IO.puts "  Sat Mar 27 16:11:10 2022"
        IO.puts "$end"
        IO.puts "$version"
        IO.puts "  plunker"
        IO.puts "$end"
        IO.puts "$timescale"
        IO.puts "  1ms"
        IO.puts "$end"
        IO.puts "$scope module test $end"
        IO.puts "$var reg 1 ! a $end"
        IO.puts "$upscope $end"
        IO.puts "$enddefinitions $end"
        IO.puts "#0"
        IO.puts "$dumpvars"
        IO.puts "x!"
        IO.puts "$end"
        IO.puts "x!"
        0..2
        |> Enum.map(fn i ->
	        Enum.map(String.split(src, ""), fn x ->
	            if x != "" do
	                Va.inc 
	                IO.puts "##{Va.get}"
	                IO.puts "#{x}!"
	            end
	        end)
        end)
    end
end

Va.start_link
Main.main("111111111000")




```

# 成果物

https://paiza.io/projects/doDULc3EwpcoGrYazH1Bmw

# gtkwaveで見る手順
windows10

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c1ec162d-6415-6fec-7fdc-61fd68953598.png)

- iverilogをインストールする。
iverilog-v12-20220611-x64_setup
- パスを通す。
- 結果をtest0.vcdでセーブする。
- gtkwave test0.vcdで実行する。


以上。
ShaderGraphの頂点シェーダーでペラペラ感の無いビルボードエフェクトを作る

## 概要
ShaderGraphで @kaneta1992 さんの「8頂点でサイリウムを綺麗に表現する」を再現します

https://qiita.com/kaneta1992/items/af7793e5450b891c2e27

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154377/525ab017-eb85-f174-c1f1-4b78a666004b.png" width=300px /><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154377/3332ae8c-95cb-8fa8-d793-3b230cecbc3a.png" width=300px />

<img src="https://i.gyazo.com/3d684b8d71bad4ae0ce393d664ad4d05.gif" width=300px /><img src="https://i.gyazo.com/0a149f44a28fbee172cbfadee291d4c4.gif" width=300px />

## ShaderGraph
ベースはこちらを流用します

https://qiita.com/archeleeds/items/14eba47866e6ed0f1d6b

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154377/78d04823-e028-0f5e-65f8-db0534db5c9d.png)

## 解説
本来4頂点で十分なビルボードを、上下に3分割して折り曲げることで一定の角度まで不自然にならないビルボードを作ることが出来ます

細かい理屈の解説は[元記事](https://qiita.com/kaneta1992/items/af7793e5450b891c2e27)を参考にしてもらうとして、
ShaderGraphでは「Pane」という四角で囲んだ部分が前回との差分です

UV1には移動距離が入れている、ShaderGraphではカメラからの角度だけ計算して掛け算するだけです

#### メモ
- 回転する4つの頂点は最初、回転しない4つの頂点と同じ位置にあること
- 回転しない4つの頂点のUV1は0（移動しない）が入れていること

## オプション
このビルボードエフェクトではMeshに細工が必要です
わざわざ3Dツールを使うでも良いですが、めんどくさいのでUnity上で生成出来るようにします

このコードも @kaneta1992 さんの記事から拝借してます
```
    public class BulletModelController : MonoBehaviour
    {
#if UNITY_EDITOR
        [SerializeField] float height;
        [SerializeField] float radius;
        [SerializeField] string path;
        
        [ContextMenu("MakeMesh")]
        void MakeMesh()
        {
            var mesh = new Mesh();
            mesh.name = "Bullet";
            mesh.vertices = new Vector3[]
            {
                new (radius * -2, -height, 0),  // 0
                new (radius * -2, -height, 0),  // 1
                new (radius * 2 , -height, 0),  // 2
                new (radius * 2 , -height, 0),  // 3
                new (radius * -2,  height, 0),  // 4
                new (radius * 2,  height, 0),  // 5
                new (radius * -2,  height, 0),  // 6 
                new (radius * 2 ,  height, 0),  // 7
            };

            mesh.uv = new Vector2[]
            {
                new (0, 0),
                new (0, 0.5f),
                new (1, 0),
                new (1, 0.5f),
                new (0, 0.5f),
                new (1, 0.5f),
                new (0, 1),
                new (1, 1),
            };

            mesh.uv2 = new Vector2[]
            {
                new (radius * -2.0f, 0),
                new (0, 0),
                new (radius * -2.0f, 0),
                new (0, 0),
                new (0, 0),
                new (0, 0),
                new (radius * 2.0f, 0),
                new (radius * 2.0f, 0),
            };

            mesh.triangles = new[]
            {
                0, 1, 2, 
                1, 3, 2,
                1, 4, 3, 
                4, 5, 3,
                4, 6, 5, 
                6, 7, 5,
            };

            AssetDatabase.CreateAsset(mesh, path);
            AssetDatabase.SaveAssets();
        }
#endif
    }
```

## 他
ShaderGraphを勉強中です
https://qiita.com/archeleeds
CodeIQ:左と右の有理数の解答

@nabetaniさんのCodeIQの問題です。コメントはこちら
->https://nabetani.hatenablog.com/
問題とテストケースはこちらのお世話になりました。解答もあります。
->https://blog.goo.ne.jp/r-de-r/e/cd6758f70389392d70cc3da5ce91c0ac

①ある節の右（左）隣は親の右（左）隣りの左側（右優先）の子　が基本でです。
②ある節の分子>分母/2の時左隣は親の左側の子
③ある節の分子<分母/2で親の分子<分母/2の時ある節の右隣は親の右側の子
④その他の場合はさらに遡ります。

2023.5.8訂正：上の①は④の後が正確のようです。

計算主体の解法も挑戦しましたが、場合分けが複雑になりそうなので断念しました。

solvl46/3で左隣の節、solvr46/3で右隣りの節をそれぞれ祖先にさかのぼりながら求めます。
dwntol/2で左側の子を求めます。dwntor/2では右側の子があればそちら、
無ければ左側の子を求めます。
solvl46/3の三番目で②、solvr46/3の二番目の前半部分で③を扱っています。

```Prolog
%SWI-Prolog version 7.4.2,7.6.4  
%:-initialization(start).    %ideone
%start

solvl46(P,Q,'-'):-
   P>=Q;(P>1,Q mod P =:=0);Q=:=2.
solvl46(P,Q,RL):-
   P*2<Q,Q1 is Q-P,solvl46(P,Q1,RL1),(RL1 =='-'->RL=RL1;dwntor(RL1,RL)).
solvl46(P,Q,RL):-
   P1 is Q-P,dwntol([P1,Q],RL).

solvr46(P,Q,'-'):-
   P>=Q;(P>1,Q mod P =:=0);Q=:=2.
solvr46(P,Q,RR):-
   P*2<Q,Q1 is Q-P,(P*2<Q1->dwntor([P,Q1],RR);
   (solvr46(P,Q1,RR1),(RR1 =='-'->RR=RR1;dwntol(RR1,RR)))).
solvr46(P,Q,RR):-
   P1 is Q-P,solvr46(P1,Q,RR1),(RR1 =='-'->RR=RR1;dwntol(RR1,RR)).
   
dwntor([P,Q],[P1,Q1]):-P*2>Q->(Q1 is P+Q,P1=P);(P1 is Q-P,Q1=Q).
dwntol([P,Q],[P1,Q1]):-Q1 is P+Q,P1=P.   
    
start:-
   f46(X,Y,Q),((solvl46(X,Y,RL),solvr46(X,Y,RR),maplist(form46,[RL,RR],R))->
   (R==Q->Str="good ";Str=" bad ");writeln(fail)),write(" "),write(Str),writeln(R),fail.
start.

form46(L,R):-(L =='-'->R='-';concat_atom(L,"/",R)).

f46(3, 7,['4/5','2/7']).
f46(5, 37,['16/41','27/32']). 
f46(1, 2,[-,-]).
f46(1, 3,[-,-]). 
f46(248, 248,[-,-]).
f46(1, 249,[-,'247/248']).
f46(2, 249,['14662949395604/23725150497407','245/247']).
f46(3, 248,['1032569015/1670731762','242/245']).
f46(144, 233,['89/322',-]).
f46(247, 248,['1/249','246/493']).
f46(65, 81,['16/97','49/114']). 
f46(65, 73,['8/81','57/122']). 
f46(134, 205,['71/276','55/338']). 
```
【自作アプリ　第二期】

### 自作アプリ　経過報告

仕事があり時間の限られている平日の方がアプリ作成に集中して取り組めるので月曜から金曜日で毎日1時間ほどコツコツ進めています。

#### 【アプリ概要】
・株式投資を集計
・集計された収支をグラフとして表示
・固定費計算

#### 【実装機能】
この１ヶ月ほどで実装した機能は以下になります。
☆改行、空白行を通さない機能
☆レイアウト全般
☆株式投資管理画面のバックエンド全般

#### 【工夫した点】
テーブル設計からの工夫になりますが
「ログインしているユーザーの情報のみを取得する」
という機能の実装になります。今回、株式投資管理アプリなので他人のや、自分のが他人に見られるのは当たり前に嫌だと思うのでそこを分けれるような設計にしました。

テーブル　user invest
２つのテーブルがありinvestテーブルにuserのid(user_id)とinvest(id)の２つのカラムをもたすような工夫をしました。これを実現することによってuser_idだけを取得することによりそのuser_idに関するid(invest id)を取得することによりログインしているユーザーの情報だけを取得することが可能になりました。

```sql
--例
SELECT * FROM INVEST WHERE USER_ID = ?;
```

#### ---画面レイアウト一覧---

##### ログイン画面
![ログイン画面　第二期.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/d1cfa23c-28f4-4fe8-3778-db40fe2caed5.png)

##### 新規登録画面
![新規登録画面　第二期.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/ba52a051-e1c8-e65e-42a8-3330f8f95b18.png)

##### トップ画面
![トップ画面　第二期➀.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/a6976a27-4457-960e-30e0-b4cd32e94bb4.png)

![トップ画面　第二期➁.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/de2e6c61-9344-f8a4-f481-071f3aabedcc.png)

##### 株式投資管理・更新画面
![トップ画面　編集画面　第二期.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/be84d49c-7b7d-540a-c259-bd5e8d5934a6.png)

##### 収支管理画面
![固定費計算画面　第二期➀.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/572715d3-aed3-908e-f596-4889ad8eacd3.png)

![固定費計算画面　第二期➁.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/0713ef0c-14d4-5123-7207-ccd58bd0c004.png)

##### 収支管理画面・更新画面
![固定費計算　編集画面　第二期.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/7c0d2a54-662b-22a7-a61b-8abeb934f9ce.png)


【実装予定機能】
・登録・更新の際の異常系対応の処理を実装をしていく
・レイアウトの精度を上げる。（主にjsを使用）
・株式投資の収支をグラフで取れるように実装する

上記のjavascriptでのグラフの実装が大変なのではないかと感じているところですので早めに取り組みたいと思っています。一応目標として7月末あたりにはほとんど完成しているという状況に持っていきたいと思っています。
これは推せる！VSCode拡張機能5選

# 私のVSCodeの拡張機能事情
突然ですが、私はVScodeの拡張機能が割と好きです。なぜかって、拡張機能を入れることで、自分好みにVSCodeをカスタマイズできるのって、わくわくするからです。色々な人の記事やYouTubeの動画をチェックしては、何か良い拡張機能はないかな～と探したりします。今回は、これは推せる！と思う、拡張機能を5つ紹介していこうと思います。

## 1．Auto Rename Tag
Auto Rename Tagとは、HTMLの開始タグと終了タグを一度に編集することができる、地味に便利な拡張機能です。以下の画像のような挙動をします。個人的には、フロントエンドを書く全ての人が入れるべきだと思います（笑）。
![usage.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2816396/b59ab91c-ed39-6d09-01d9-2d495243d128.gif)

https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-rename-tag

## 2．Better Comments
Better Commentsとは、端的に言えば、コメントをより目立たせてくれる機能です。また、Settingsで自分の好きなようにカスタマイズすることもできます。コードを書く上で、コメントをどう残すかという点で、これは一つの選択肢になり得るのかと思います。
![better-comments.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2816396/84437635-bd1b-fdd5-7e9b-087341a30fed.png)

https://marketplace.visualstudio.com/items?itemName=aaron-bond.better-comments
## 3．Auto Markdown Preview
Auto Markdown Previewとは、markdownで書いた文書のプレビューを即時に確認することができる機能です。　プレビューを確認しながら、マークダウンで書いていけるので、個人的に気に入っています。
![2023-05-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2816396/e1fcc3ba-b37e-b548-a74f-535c590a2d1c.png)

https://marketplace.visualstudio.com/items?itemName=hnw.vscode-auto-open-markdown-preview
## 4．Thunder Client
Thunder Clientとは、PostmanのVSCode版のようなもので、手軽にREST APIやGraphQLを叩くことができる機能です。バックエンドを構築する方にとっては、嬉しい拡張機能だと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2816396/6b804e94-3d43-5d7e-e629-4abf140a4890.png)

https://marketplace.visualstudio.com/items?itemName=rangav.vscode-thunder-client
## 5．Material Icon Theme
言うまでもないかもしれませんが、Material Icon Themeはファイルやフォルダーのアイコンのテーマを提供してくれる機能です。テーマが変わると気分転換にもなり、楽しくなります（笑）。また、他にもテーマを提供する拡張機能はたくさんあるので、自分の好みを見つけてみるのも良いと思います！

https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme


以上、5つの拡張機能を紹介してみました！最後まで、お読みいただいた方はありがとうございました！
[memo] git を clone した後にコミット日付に直す

## はじめに

git コマンドで clone すると、タイムスタンプが clone した時点の日付になると思う。
それでは、make コマンドを使う時など、タイムスタンプがずれていると困ることがある。
そのような時のためのメモ。

git のタイムスタンプには author date と committer date の２つがあります。
commiter date は rebase など際にも書き換わることがあるようなので、基本は author date に変換します。

## リポジトリ管理されているファイルの一覧を取得

```shell
git ls-files
```

## 指定ファイルの日付を取得

前述の通り author date を取得します。
あとで `touch` に渡したいので、それで扱える形式で出力します。

```shell
git log -1 --date=format-local:"%Y%m%d%H%M.%S" --pretty=format:"%ad" "${file}"
```

* `-1` は最新 1 コミット分の出力
* `--date=format-local:` は、ユーザーのローカルタイムゾーン、かつ指定フォーマットで出力する
* `--pretty=format:` は、出力項目を指定(%ad で author date)

## 指定ファイルの日付を変更する

```shell
touch -t "${timestamp}" "${file}"
```

* `-t` に渡すのはローカルタイムの値

## まとめると

```shell:git-retouch
#!/bin/sh

for file in $(git ls-files); do
    timestamp=$(git log -1 --date=format-local:"%Y%m%d%H%M.%S" --pretty=format:"%ad" "${file}")
    touch -t "${timestamp}" "${file}"
done
```
Deno KVで画像アップロード【Imgur】

<p class="codepen" data-height="720" data-default-tab="result" data-slug-hash="oNaozWG" data-user="04" style="height: 720px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/04/pen/oNaozWG">
  Deno Imgur</a> by John Doe (<a href="https://codepen.io/04">@04</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

Deno KVに画像を保存してみました！

```typescript
import { serve } from "https://deno.land/std@0.177.0/http/server.ts";

const kv = await Deno.openKv();

serve(async (req: Request) => {
    const filename = new URL(req.url).pathname.slice(1)
    if (req.method === 'GET') {
        const { value } = await kv.get([filename])
        return new Response(value)
    } else if (req.method === 'POST') {
        const form = await req.formData()
        const file = form.get('file')
        await kv.set([filename], await file.arrayBuffer())
        return new Response('201 Created', { headers: { 'Access-Control-Allow-Origin': '*' } })
    }
})
```
Azure Logic Apps で自分がよく使う式関数

自分は、Azure Logic Apps を、ノーコード・ローコードで決まった処理を繰り返し実行させるプログラムが作成できる、統合プラットフォーム ( iPaaS : Integration Platform as a Service ) だと思っています。コードが書けるなら CI/CD 基盤が枯れている Azure Functions も選択肢になりますが、組織やチームで Azure Logic Apps を使う選択をされることもあるかと思います。そこで今回は、Azure Logic Apps で自分がよく使う式関数を紹介します。

## HTTP トリガーで受け取る値を取得

JSON スキーマで指定した `param` の値を取得する。

```
triggerBody()?['param']
```

## HTTP レスポンスの値を取得

`TOKEN` という名前の HTTP リクエストのレスポンスにある `access_token` の値を取得する。

```
body('TOKEN')?['access_token']
```

## Foreach ループ内で値を取得

`Foreach` という名前のループ内で `id` の値を取得する。

```
items('Foreach')?['id']
```

## 配列の個数を取得

例えば、ネットワークセキュリティグループの複数あるルールを `Foreach` でループしながら、あるルールで `destinationPortRanges` 配列の個数が 0 だったら `destinationPortRange` を取得する処理の場合の条件分岐に使用する。

```
length(items('Foreach')?['properties']?['destinationPortRanges'])
```

## 数値の配列を作成

例えば、`60-63` のようなポート番号を意味する文字列があったとして、`split` でハイフン区切りの前と後ろの文字列を取り出し、 `int` で数値に変換しつつ、`sub` で引き算、`add` で足し算をして、`range` で数値の配列 `[60,61,62,63]` を作成する。

```
range(int(split(triggerBody()?['port'], '-')?[0]), add(sub(int(split(triggerBody()?['port'], '-')?[1]), int(split(triggerBody()?['port'], '-')?[0])), 1))
```

## HTTP レスポンスの JSON 内にキーがあるかを確認

例えば、`get-nic` という名前の HTTP リクエストの JSON レスポンス内に `networkSecurityGroup` というキーが存在するかを確認する。

```
contains(body('get-nic')?['properties'], 'networkSecurityGroup')
```

## 値が null だったらデフォルト値を設定

HTTP トリガーで受け取る値が無かったらデフォルト値として `json` という文字列を返します。

```
coalesce(triggerBody()?['type'], 'json')
```

## （おまけ） Azure REST API の nextLink を Until ループで処理

例えば、最初に、変数 `nextLink` に下記の値を設定しておく。

```
https://management.azure.com/subscriptions/[sid]/resources?$top=3&api-version=2021-04-01
```

`Until` ループで `nextLink` に値が無かったら終了するよう条件を設定する。

HTTP リクエストの URI に `nextLink` を入れて実行する。

HTTP レスポンス内の例えば以下のような nextLink の値を `nextLink` 変数にセットする。

```
https://management.azure.com/subscriptions/[sid]/resources?$top=3&api-version=2021-04-01&$skiptoken=*****
```

HTTP レスポンス内に nextLink が無ければ `Until` ループは終了する。

## 参考

https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference
BlenderでUDP通信すーる

# はじめに
BlenderでUDP通信してサーバーにCubeの色情報を送ってみましょう

# 開発環境
- UDPクライアント
    - Windows 11 PC
    - Blender 3.5.0
- UDPサーバー
    - Windows 10 PC 
    - Python 3.9

# 導入

1．同一のWiFiに接続しておく

2．UDPサーバー側のプログラムを作成し、実行

サーバーを起動し、BlenderからのCubeの色情報を取得、コンソールに表示します

~~~python
import socket

# ソケットを作成する
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# サーバーアドレスを設定する
server_address = ('192.168.0.212', 5005) # ipconfigでIPアドレスを確認
sock.bind(server_address)

# データを受信する
while True:
    data, address = sock.recvfrom(4096)
    if not data:
        break

    # 受信したデータをパースする
    data = data.decode()
    r, g, b = data.split(',')
    r = float(r)
    g = float(g)
    b = float(b)

    # パースしたデータを表示する
    print(f'Color: ({r}, {g}, {b})')
~~~

3．Blenderを開き、Scripting->Text->NewからUDPクライアント側のプログラムを作成

Cubeを生成し、色をランダムに変更、サーバーに色情報を送ります

~~~python
import bpy
import socket
import random

# ソケットを作成する
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# サーバーアドレス
server_address = ('192.168.0.212', 5005)

# 立方体が既に存在するかどうかをチェックする
existing_cube = bpy.data.objects.get("Cube")

if existing_cube is not None:
    # 既存の立方体の色をランダムに変更する
    mat = existing_cube.data.materials[0]
    mat.diffuse_color = (random.uniform(0.0, 1.0), random.uniform(0.0, 1.0), random.uniform(0.0, 1.0), 1.0)

    # 変更された色をサーバーに送信する
    message = f'{mat.diffuse_color[0]},{mat.diffuse_color[1]},{mat.diffuse_color[2]}'
    sock.sendto(message.encode(), server_address)
else:
    # 新しい立方体を作成して青色にする
    bpy.ops.mesh.primitive_cube_add()
    obj = bpy.context.active_object
    mat = bpy.data.materials.new(name="Blue")
    mat.diffuse_color = (0.0, 0.0, 1.0, 1.0)

    if obj.data.materials:
        obj.data.materials[0] = mat
    else:
        obj.data.materials.append(mat)

    # 作成された青色の立方体の色をサーバーに送信する
    message = f'{mat.diffuse_color[0]},{mat.diffuse_color[1]},{mat.diffuse_color[2]}'
    sock.sendto(message.encode(), server_address)
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/5e684812-3d23-605b-1a14-4f7263f02d25.png)

4．Blenderで実行する（ALT+P）とサーバー側で色情報が表示されます
![345273798_739565374572712_4568253749779903090_n.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/0726e2c1-0ca1-cd00-ab82-d3de86cab67d.png)

お疲れさまでした。

# 参考

うまく接続できない場合、ファイアウォールを無効にするか、受診の規則・送信の規則で新しい規則を作成し、ポートを開放するなど試してみてください。あとはルーター側でIPが分けられていて、同一ネットワークにいるように見えても接続できない場合も。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/d3e780a5-3271-f96a-062f-d5c37419cf07.png)
Streamlitでmolファイルの分子構造の描画

### はじめに

有機分子の構造を記述したファイルとして、MOL形式（拡張子.mol）があります。これらは分子内の原子の座標を記録したものであり、行列表記法とも呼ばれます。
PythonのケミカルインフォマティクスライブラリーのRDKitを用いることでMOLファイルを読み込んで、描画することができます。また、SMILESやInChIといった線形表記法に変換することができます。
今回、Streamlit Cloudを用いて、Molファイルをアップロードすることで、構造を表示するWebアプリを作成しました。


https://s-yagyu-mol-draw-mol-upload-draw-cloud-x5cmef.streamlit.app/

![mol_app01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165987/b058a793-c39f-a9dd-d5cf-aec56152ee3b.png)

こちらのGithubリポジトリに最終的なコードがあります。
https://github.com/s-yagyu/mol-draw

これまでRDkitはcondaでしかインストールできませんでしたが、pipでもインストールすることができるようになりました。


### 作成プログラム
```python
from pathlib import Path
from tempfile import NamedTemporaryFile

import streamlit as st
import matplotlib.pyplot as plt
from rdkit import Chem
from rdkit.Chem import inchi
from rdkit.Chem import Draw

st.title('Mol Drawing')

# Fileの拡張子をチェックしてくれる
uploaded_file = st.file_uploader("Mol file upload", type='mol')


if uploaded_file is not None:
    file_name = uploaded_file.name

    
    with NamedTemporaryFile(delete=False) as f:
        fp = Path(f.name)
        fp.write_bytes(uploaded_file.getvalue())
    
        m_ = Chem.MolFromMolFile(f'{f.name}')
        m_img = Draw.MolToImage(m_,)
        m_smiles = Chem.MolToSmiles(m_)
        m_inchi = inchi.MolToInchi(m_, options='', logLevel=None, treatWarningAsError=False)
        m_inchikey = Chem.MolToInchiKey(m_)
    
    # ファイルを削除  
    fp.unlink()
    
    fig = plt.figure(figsize=(5,5))
    ax = fig.add_subplot(111)
    ax.set_title(f"InchiKey : {m_inchikey}")
    ax.imshow(m_img)
    ax.set_xticks([])
    ax.set_yticks([])    
    fig.suptitle(f'{file_name}')
    plt.tight_layout()

    st.pyplot(fig)
```

rdkit側では、ファイルのパスを指定しないと読み込むことができないため、
tmpfile.NamedTemporaryFileを利用して、
アップロードしたファイルを一時ファイルとして保存しています。

こちらの記事が参考になりました。
[streamlist-file-uploader-example](https://github.com/hurutoriya/streamlist-file-uploader-example/blob/main/streamlit_pdf_uploader/main.py)

### Streamlit Cloudでデプロイ

Streamlit cloudにログインして、Streamlitで書かれたpythonファイルを指定してデプロイします。
その際に、同じ階層にrequirements.txt、packages.txtを用意します。

#### requirements.txt
requirements.txtを作成して、その中に、今回使うモジュールを記載します。
記載モジュール
numpy
matplotlib
streamlit
Pillow
scikit_learn
rdkit-pypi

#### packages.txt
Matplotlibの描画でエラーになるようなので
packages.txtに
libxrender1
と記載します。

こちらの記事が参考になりました。
・[hemoinfo のアプリをStreamlitを使ってDeployする #streamlit #RDKit #souyakuAC2020](https://iwatobipen.wordpress.com/2020/12/20/chemoinfo-%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92streamlit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6deploy%E3%81%99%E3%82%8B-streamlit-rdkit-souyakuac2020/)
・[chem_streamlit　Github](https://github.com/iwatobipen/chem_streamlit)

#### 試してうまくいかなかったこと
・最初Condaのenvironment.ymlを用意してトライ
-> うまくいかなかった。例も少なかったのでpip環境を利用。
・conda環境はあきらめてpip環境でトライ
必要モジュールをrequirements.txtに記載。
-> from rdkit.Chem import Drawのインポートエラー
・packages.txtを追加 
-> インポートエラーが解消。（Matplotlibを使う場合はこれを追加する必要があるようです。）
WSL2 python pyenv PySimpleGUI インストール

# 概要
Windwos11にてWSL2を利用してPythonのアプリを作成中、PySimpleGUIがインストール済みなのに使えない現象に遭遇。それを解消した道のり。
キーワード「困ったときの再インストール」
# Ubuntu
使用するのはWindows11のWSL2+Ubuntu。
## WSL2のUbuntuを最新版に
インストール済みのUbuntuを最新にするために、Windows11の設定より現在のUbuntuをアンインストール。
Microsoft StoreからUbuntu22.04.2LTSを選択してインストールしたのち、最新状態にしておく。
### コマンド
sudo apt update
sudo apt upgrade
# Python
Python3.11を使いたい。
## インストール済みのPythonのバージョン確認
pythonだと表示されない。
python3でOK。バージョンは3.10.6が入っていた模様。
## pip3のインストール
### コマンド
sudo apt install python3-pip

インストール後、pip3でUsageとかコマンド一覧が表示されたらOK。
# pyenv
システムからは3.10を、ローカル(ログインしたユーザ的)には3.11を使うために、pyenvを導入。
## 参考サイト(1)
[ウチイダのメモリークリップ](https://memoryclip.uchiida.com/2022/11/python_enviroment_build_on_wsl2_01_pyenv/)
こちらの、「インストールする」にあるコマンドをコピペ。
その後、「pyenvでPythonをインストール」にある
pyenv install 3.11 ←記事内は3.10です。
でエラーが発生。
どうやらPythonのbz2とかいうライブラリが不足していた模様。
## 参考サイト(2)
以下のページの、「パッケージのインストール」にあるコマンドをコピペさせていただきました。
[ヤーヤブログ](https://ya-ya-lifelog.com/wsl-install-pyenv-python-on-ubuntu/#index_id2)

再度 pyenv install 3.11 を実行したところ、無事完了。

参考サイト(1)にあるとおり、
pyenv local 3.11
を実行してバージョン指定を完了。
pythonインタプリタを起動して確かに3.11になっていることを確認。
# PySimpleGUI
こちらはとくに迷うことなく
pip install PySimpleGUI
で完了。
インストール後、pipの最新版があるからupgradeしてね、と表示されたので、言われるがままに
pip install --upgrade pip
を実行。
# 後処理
これでPySimpleGUIを使ったGUIアプリが作れるようになったので、さっそく試してみたところ、文字化けが発生。
こちらのサイトを参考にして、IPAフォントをインストールしてロケールの変更を行って文字化け解消。
[BLOG AS CATALYST](https://toritakashi.com/archives/2230)
ただしウィンドウのタイトルだけは文字化けが解消されていないのですよ...。
これ、どなたか原因をご存じの方、いませんか?
![pysimpleguimojibake.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164944/e50c9eda-4793-c270-8e93-b4c017e581d4.png)
GuardDutyの復習と最新アップデート(2023/04)

# ■概要
GuardDutyに関するアップデートがあったので、改めて復習と最新アップデートについて。

# ■GuardDutyとは？
GuardDutyは、AWS CloudTrail、Amazon VPCフローログ、DNSログなどの標準的なAWSログと統合されており、不正行為の検出、通知を行う事ができます。
この検出は、マシンラーニングとAI技術を使用しており、上記のような複数のデータソースから検知イベントを生成、分析して、不正なアクティビティを特定するものです。

GuardDutyについては検出までになり、脅威に対する対応は行われないのでご注意ください。

# ■分析できるログの詳細
・AWS CloudTrail 管理イベント分析
・Amazon 仮想プライベートクラウド (VPC) フローログおよび DNS クエリログの分析
・AWS CloudTrail Amazon S3 データイベント分析
・Amazon EKS 監査ログ分析
・Amazon EKS ランタイムモニタリング
・マルウェアのスキャンを行ったデータ
・Amazon RDS イベント分析
・Lambdaの脅威検出

EKS、RDS、Lambdaはアップデートにより追加されたようです。

# ■使い始め

使い始めにはサービスに入り、下記の部分から有効化を行う必要があります。
逆に言ってしまえば、この最初の有効化で基本的な設定は完了です。
また通知設定は別途必要なので、設定しておきましょう。（後述します！）

![](https://storage.googleapis.com/zenn-user-upload/3a8e39bbbc20-20230427.png)

有効化後↓↓

![](https://storage.googleapis.com/zenn-user-upload/b20644190423-20230427.png)

また設定より、検出結果のサンプルを生成する事ができます。
サンプル生成後は「検出結果」よりどのように検出されているかを確認する事ができます。

![](https://storage.googleapis.com/zenn-user-upload/6240404aef6d-20230427.png)

ちなみにですが、一時停止や無効化も簡単にできるようですね（上記画面参照）

# ■利用料金について
Amazon GuardDutyの料金は、検出された脅威の数に基づいて請求されます。
30日間のトライアル期間があり、最初の30日間10GBのデータ処理は無料、以降は5GBのデータ処理が無料です。

詳細な利用料金については下記の確認が推奨されます。

Amazon GuardDuty の料金
https://aws.amazon.com/jp/guardduty/pricing/

また「使用状況」ページから、現在の使用量を確認する事ができます。

![](https://storage.googleapis.com/zenn-user-upload/01fd5c490207-20230427.png)

# ■SNSを使用した通知方法
EventBridgeで設定できるようですね。下記の手順で実施できました。

https://repost.aws/ja/knowledge-center/guardduty-eventbridge-sns-rule

# ■今回アップデートされた項目について
AuroraのプロテクションとLambda脅威検出ができるようになったようですね。
ただコンソールから確認した所、EKSに関するものもアップデート項目のようです

![](https://storage.googleapis.com/zenn-user-upload/74ce477f4979-20230427.png)

# ■組織内アカウントへの適用簡易化

もうひとつの新機能として、AWS Organizations との統合により組織アカウントに対して GuardDuty を利用できるようになったようです。
検証できていないですが、アカウントID、Eメールアドレスを使用した招待によって管理対象とできそうでした。

![](https://storage.googleapis.com/zenn-user-upload/2898a7c24085-20230427.png)

# ■最後に
使い始めはかなり簡単な部類になると思います。
トライアルもある為、是非使ってみましょう！

参考URL

Amazon GuardDuty RDS Protection for Amazon Aurora の一般提供を開始
https://aws.amazon.com/jp/about-aws/whats-new/2023/03/amazon-guardduty-rds-protection-aurora-generally-available/

Amazon GuardDuty で組織内のアカウントすべてに対する脅威検出の適用が簡素化
https://aws.amazon.com/jp/about-aws/whats-new/2023/03/amazon-guardduty-enforcement-threat-detection-organization/

AWS Lambda の Amazon GuardDuty サポートを発表
https://aws.amazon.com/jp/about-aws/whats-new/2023/04/amazon-guardduty-aws-lambda/
期間限定で通常１０万円のあの有料講座が無料で！？修了証付きの有料版講義が期間限定で無料または低額のサイトまとめ

無料または低額で取得できるサイトのまとめ情報です。

# Googleとcourseraのコラボ

まずはGoogle「Google Career Certificates データアナリティクス プロフェッショナル認定証」「サイバーセキュリティ プロフェッショナル認定証」を目指すコース。通常月額39ドル5000円×6か月×2講座くらいが無料！

https://japan-reskilling-consortium.jp/news/169

couseraで提供されるGoogleデータアナリティクス認定証。（注意）サイトで確認したところ無料受講受付をする締め切りが2024年9月までのようです。それを過ぎると6か月たっていなくても有料となります。先着順ですので急ぎましょう！利用には日本リスキリングコンソーシアムに登録が必要です

# IBMとudemyのコラボ

続いてIBMが提供するudemy for skillsbuildです。udemy for businessだと月額2万円くらいするものがが無料！

https://blog.freelance-jp.org/20210315-11932/

これはやばいです。以前は期間無制限だったのですが、６か月間に改定されました。これはいつ申し込みしてもいいのでしょうか。最高すぎますね。利用にはフリーランス協会に登録が必要です。

# GitHub certification

https://resources.github.com/learn/certifications/

Microsoft社の系列企業の無料講座です。講座は無料です。試験は有料です（２００ドル）。コードの管理ができるプラットフォームの講座なので価値ありです。

また「できる Copilot for Microsoft 365 スタートガイド」を無料配布中です。
https://info.microsoft.com/JA-HW-CNTNT-FY24-04Apr-05-Copilot-for-Microsoft-365-Getting-Started-Guide-SRGCM11972_LP01-Registration---Form-in-Body.html

# Progate path期間限定無料(24/12/31まで)
https://app.path.progate.com/plan/unlimited-learning-in-60-days



以上が有料のものが無料または低額でかつ修了証もゲットできるまとめ情報です。安価に（無料で）勉強できるサービスが増えるのは素晴らしいですね。

是非お好きな講座からどうぞ。

今後追記・更新していく予定です。
gitリポジトリ整備＆容量削減

# はじめに
サーバ管理する上では重要になってくるので勉強も兼ねて...

# 参考サイト
◆git でリポジトリを整理して容量削減するときに嵌った話 | おいもログ
　https://blog.oimo.io/2021/07/19/git-filter-repo/
　　★ここにあるgit-filter-repoの分析機能を参考に

◆windowsにgit-filter-repoをインストールする
　https://qiita.com/error484/items/6d834f2b1de133eb1fc4
　　※このサイトを参考に使えるようにする！！
◆GitHub - newren/git-filter-repo: Quickly rewrite git repository history (filter-branch replacement)
　https://github.com/newren/git-filter-repo
◆【Python】WindowsでPythonインストールしてもバージョンが出ない… Output48
　https://www.out48.com/archives/5720/

```bat:git_environment.ps1
REM gitのサブプログラムのパス確認
> git --exec-path
C:/Program Files/Git/mingw64/libexec/git-core

REM git-filter-repoの1行目変更(python3⇒python)＆上記フォルダに配置

REM PATH変更
> set PATH=C:\Program Files\Python311;%PATH%

REM 分析実行(".git\filter-repo\analysis"フォルダに結果配置)
> git filter-repo --analyze

```

◆Gitリポジトリの総サイズを取得する方法のまとめ
　https://qiita.com/koara-local/items/07d08b099e4e81891df9

```bat:git_count-objects.ps1
REM Gitリポジトリ総サイズ取得
> git count-objects -vH
```

◆git repository size を削減する | DriftwoodJP
　https://www.d-wood.com/blog/2014/10/03_6965.html
　　※大きなサイズのファイルを削除する

◆gitのfor-each-refで各ブランチで最後にcommitした人とその更新時刻を一覧表示させる。 - Continue(s)
　https://taiga.hatenadiary.com/entry/2018/05/04/172538

◆gitの不要なブランチを消すコマンド
　https://qiita.com/mather314/items/a1536c52a2eb0426b2b5
　　★ローカル/リモートでそろっているので、あとで整理
◆【小ネタ】消し忘れのリモートブランチを一括表示・削除するワンライナー
　https://dev.classmethod.jp/articles/git_remove_merged_branch/
　　※オプションの詳細も解説してくれている！！

◆リポジトリのサイズを減らす | Bitbucket Cloud | アトラシアン サポート
　https://support.atlassian.com/ja/bitbucket-cloud/docs/reduce-repository-size/
　　★サイズの大きいファイルの追加を避ける
　　　※大規模なファイルの無視(.gitignore)
　　　※大規模なコミットのブロック(check_added_large_files)

◆Git - 環境変数
　https://git-scm.com/book/ja/v2/Git%E3%81%AE%E5%86%85%E5%81%B4-%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0

```bat:git_count-objects.ps1
REM Git操作をトレースするための準備コマンド
> set GIT_TRACE=true
REM 処理時間の計測
> set GIT_TRACE_PERFORMANCE=true
```

◆WIndowsで(Linuxのfindのような)ファイル検索コマンドを使う
　https://tech.kurojica.com/archives/21461/
　　※ファイルの検索　　：where
　　※ディレクトリの検索：dir

◆Git のガベージコレクションについて
　https://qiita.com/koseki/items/f1af58f1ec1693f0536a

◆git gc --aggressive したら out of memory が発生して失敗する
　https://devadjust.exblog.jp/19298790/
　　※スレッド数(デフォルト：8)を減らして成功させたとのこと　
◆git gcでUnlink of fileっていうエラーが発生 Should I try again? | urashita.com 浦下.com (ウラシタドットコム)
　https://urashita.com/archives/25850
　　※リトライすると成功するのか...

◆Gitリポジトリをメンテナンスして軽量化する
　https://qiita.com/kaneshin/items/0d19fc1cd86f931dc855
◆gitのレポジトリ容量の削減に失敗しないためのチェックポイント
　https://qiita.com/knknkn1162/items/5055daf197c3e751377f

# TODO
- [ ] git gc
- [ ]