OmniAICreator/Qiita-1.07M huggingface dataset:
rbenv install 2.7.0 Error 


ログをちゃんと読もう

- macOS Ventura 13.2
- Apple M1 Pro
- rbenv 1.2.0
- Homebrew 4.0.1


### OpenSSLが見つからない

`LoadError`で落ちてる

```txt:log
... 中略...

/private/var/folders/yr/0fzl7t0j0wdgl7p199g3jqt80000gq/T/ruby-build.20230220115528.29723.pqOpVp/ruby-2.7.0/lib/rubygems/core_ext/kernel_require.rb:92:in `require': cannot load such file -- openssl (LoadError)
	from /private/var/folders/yr/0fzl7t0j0wdgl7p199g3jqt80000gq/T/ruby-build.20230220115528.29723.pqOpVp/ruby-2.7.0/lib/rubygems/core_ext/kernel_require.rb:92:in `require'
	from /private/var/folders/yr/0fzl7t0j0wdgl7p199g3jqt80000gq/T/ruby-build.20230220115528.29723.pqOpVp/ruby-2.7.0/lib/rubygems/specification.rb:2426:in `to_ruby'
	from ./tool/rbinstall.rb:841:in `block (2 levels) in install_default_gem'
	from ./tool/rbinstall.rb:278:in `open_for_install'
	from ./tool/rbinstall.rb:840:in `block in install_default_gem'
	from ./tool/rbinstall.rb:830:in `each'
	from ./tool/rbinstall.rb:830:in `install_default_gem'
	from ./tool/rbinstall.rb:794:in `block in <main>'
	from ./tool/rbinstall.rb:945:in `block in <main>'
	from ./tool/rbinstall.rb:942:in `each'
	from ./tool/rbinstall.rb:942:in `<main>'
make: *** [do-install-all] Error 1
```

rbenvのdocsにちゃんと注意書きがあるので読みましょう。

https://github.com/rbenv/ruby-build/wiki#macos

**Ruby versions 2.x–3.0 の場合**
```bash
brew install openssl@1.1 readline libyaml gmp
export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@1.1)"
```

参考
https://blog.ingage.jp/entry/2022/11/22/093000

### ffi関連のError

なんか怒られている
`implicit declaration of function 'ffi_prep_closure' is invalid in C99`

```txt:log
closure.c:264:14: error: implicit declaration of function 'ffi_prep_closure' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    result = ffi_prep_closure(pcl, cif, callback, (void *)self);
             ^
6 warnings and 1 error generated.
make[2]: *** [closure.o] Error 1

... 中略 ...

../.././include/ruby/ruby.h:409:33: note: expanded from macro 'RB_ID2SYM'
#define RB_ID2SYM(x) (rb_id2sym(x))
                                ^
make[1]: *** [ext/fiddle/all] Error 2
make[1]: *** Waiting for unfinished jobs....

... 中略 ...

422 warnings generated.
compiling ../.././ext/psych/yaml/writer.c
2 warnings generated.
linking shared-object date_core.bundle
8 warnings generated.
16 warnings generated.
linking shared-object stringio.bundle
4 warnings generated.
linking shared-object zlib.bundle
linking shared-object psych.bundle
make: *** [build-ext] Error 2
```

同様のIssueが上がっており解決法も提示されている

https://github.com/ffi/ffi/issues/869

```bash
export RUBY_CFLAGS=-DUSE_FFI_CLOSURE_ALLOC
```

参考
https://zenn.dev/grinch1252/scraps/62e4df5575e70c
Pythonでのオブジェクト指向構文を学習中！〜その１〜

 さて、今回はPythonでのオブジェクト指向プログラミングを学習しようかと思います。プログラム上で扱う対象をオブジェクト（モノ）に見立てて、オブジェクトを中心にコードを組み立てていく手法をオブジェクト指向プログラミングといいますが、Pythonでオブジェクト指向プログラミングを組むのは初めてです。

　PythonはJavaのような純正オブジェクト指向言語と違い、型（クラス）の定義が不可欠というわけではなく、むしろ、クラスで凝り固まったコードはPython的ではないので、オブジェクト指向によるコードの再利用性、保守性の向上という利点に取り組みながら、Pythonの手軽なコーディングに組み込んでいきたいと思います。

```py
class Person:
  pass

if __name__ == '__main__':
  p = Person()
  print(p)
```

```text:実行結果
<__main__.Person object at 0x0000029B2AD9BDD0>
```
クラスが正しく認識できていますので、次に行きたいと思います。

```py
class Person:
  def __init__(self, firstname, lastname):
    self.firstname = firstname
    self.lastname = lastname

if __name__ == '__main__':
  p1 = Person('太郎', '山田')
  p2 = Person('花子', '鈴木')
  print(f'私の名前は{p1.lastname}{p1.firstname}です！')
  print(f'私の名前は{p2.lastname}{p2.firstname}です！')
```

```text:実行結果
私の名前は山田太郎機能をです！
私の名前は鈴木花子です！
```
 今度はクラスの中にインスタンス変数を追加してみました。インスタンス（オブジェクト）に属する変数を追加することにより、インスタンスが意味のある値を持つことができます。__init__という初期化メソッドでインスタンス変数を定義し、その下の構文でドット演算子を使い定義されたインスタンス変数にアクセスしています。

```py
class Person:
  def __init__(self, firstname, lastname):
    self.firstname = firstname
    self.lastname = lastname

if __name__ == '__main__':
  p1 = Person('太郎', '山田')
  p1.age = 52
  p2 = Person('花子', '鈴木')
  print(p1.age)
  print(p2.age)
```
ちなみにこちらはエラーが出るプログラムですが、ここで言いたいことは、「個々に生成されたインスタンスは互いに別物である」ということです。p1にageというインスタンスを新たに追加していますが、この追加したageはp1だけのものであり、p2には反映されないということです。

　Pythonの場合同一クラスのもとに生成されたインスタンスであっても、それぞれが持つ変数が同一であるとは限りません。




　次にメソッドです。クラス（型）にかかわる共通的な処理は、メソッドとしてクラスにまとめることができます。
```py
class Person:
  def __init__(self, firstname, lastname):
    self.firstname = firstname
    self.lastname = lastname
  
  def show(self):
    print(f'私の名前は{self.lastname}{self.firstname}です！')

if __name__ == '__main__':
  p = Person('太郎', '山田')
  p.show()
```
```text:実行結果
私の名前は山田太郎です！
```
　ここでは、Personクラスにインスタンス変数を表示するためのメソッド（showメソッド）を追加しました。Pythonではインスタンスから「.」でアクセスできるものはすべてアトリビュートです。つまり、メソッドもアトリビュートです。よって、インスタンス変数と同じくメソッドもまた、classブロックとは別に、後から追加することができます。

　今回はPythonのオブジェクト指向プログラミングについて学習しました。またそのうち続きを投稿したいと思います。

エンジニアファーストの会社  [株式会社CRE-CO](https://www.cre-co.jp/)  H.M
TypeScriptおよびJSONにPrettierを適用する方法

# 概要
TypeScriptおよびJSONに「Prettier」コード整形の手動および自動での適用方法の手順について記載します。

まずTypeScriptのプロジェクトディレクトリに移動し、次のコマンドでPrettierをインストールします。

```bash
npm i -D prettier
```

# 手動でフォーマットする場合

```bash
npx prettier [オプション] [対象ファイル/ディレクトリ]
```

## 使用例
ファイルを指定して変更される内容を出力（フォーマットされた結果は反映しない）

```bash
npx prettier ./config/config.ts
```

ファイルを指定してフォーマットされた結果を上書き

```bash
npx prettier --write ./config/config.ts
```
./config 直下のファイルを全てフォーマットして上書き

```bash
npx prettier --write ./config
```

./lib 配下のファイルでフォーマット対象となるファイルをチェック

```bash
npx prettier --check ./lib
```

# 自動でフォーマットする場合
Visual Studio Codeの拡張機能「[Prettier - Code formatter](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)」をインストールして、以下の設定を実行します。

「歯車アイコン」を選択して、「設定」を選択します。

![2023062301.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143947/ee65eaf4-2f72-e92b-4d2c-ddca2b8b1374.jpeg)

プロンプトに「onsave」を入力し、画面上に表示されている「settings.jsonで編集」を選択します。

![2023062302.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143947/02f6bc90-220d-5946-7167-731f9f737c84.jpeg)

以下のように「settings.json」の任意の箇所に赤枠のキー・バリューを挿入します。

![2023062303.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143947/64c9962b-2a70-8c3e-c812-09fc203585e8.jpeg)

挿入した赤枠のキー・バリューは以下の通りです。
```typescript
{
    "[json]": {
        "editor.defaultFormatter": "rvest.vs-code-prettier-eslint" // JSONに対してPrettierを適用
    },
    "[typescript]": {
        "editor.defaultFormatter": "esbenp.prettier-vscode" // TypeScriptに対してPrettierを適用
    },
    "editor. formatOnSave": true // 保存時に自動でフォーマットする
}
```

:::note warn
ファイルを変更した上で保存するタイミングで変更した個所のみフォーマットされます。
フォーマットのタイミングの設定などは好みで変更してください。
:::
Zapier使用例　一部

## Zapier使用例

- **データの同期と移動**
Googleスプレッドシートの新しい行を自動的にSlackチャンネルに通知

CRMツールの顧客データをメールマーケティングツールに自動的に同期させる
***
- **タスクの自動化**
特定のキーワードが含まれるメールを自動的にフィルタリング
↓
特定のフォルダに移動させる

Webフォームの入力を受けて自動的にユーザーにメールを送信

***
- **ワークフローの自動化**

特定のキーワードが含まれるツイートを抽出
↓
Googleドライブに保存
↓
Slackに通知する
***
- **イベントのトリガーとアクション**
新しいフォロワーがTwitterアカウントに追加された場合
↓
自動的にメールを送信する

特定の日時になる
↓
カレンダーアプリに通知を送る
Zapierって何

## Zapier
:::note
異なるアプリケーションやサービスを連携させるためのオンラインの自動化ツール

Webアプリケーションやサービス間でデータを連携・自動化するためのワークフロー（Zap）を作成可能
:::
***

異なるアプリケーション間でデータを連携するためには、APIを使用したプログラミングが必要

**Zapierではプログラミングの知識がなくても簡単に連携を設定できる**
→APIやトリガー、アクションを提供するさまざまなアプリケーションと統合されている
　それらのアプリケーション間でデータの送受信や処理ができる

## 使用例
- Slackからの新しいメッセージを受け取る→自動的に特定のGoogleスプレッドシートに書き込む
- Gmailの特定の受信トレイのメールを解析→Trelloボードに新しいカードとして作成
DockerのUbuntuをunminimizeで通常に戻す

Linux上での操作手順の確認や「Ubuntuでアレどうやるんだっけ？」みたいなときに、いちいち仮想マシンを用意するのは手間なので、手軽に扱えるDocker上で試してみようとすると、思うように動かないことがあります。

そんな時の解決方法を紹介します。

なお、本記事ではUbuntuイメージを対象としています。CentOS等の他のディストリビューションについては事情も異なるでしょうし扱いません。

## DockerのUbuntuは特殊版

Dockerイメージというのは基本的に余計なものを極限まで削ぎ落として軽量化されているものが多く、一般的に中に入ってインタラクティブにあれこれ操作するのには向いていません。

普通のLinuxのような感覚で操作しようと思ったら、下記のような謎のメッセージが表示されて動かない……`man`コマンドも使えない、みたいな経験はありませんか？

```
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, including manpages, you can run the 'unminimize'
command. You will still need to ensure the 'man-db' package is installed.
```

これはDockerコンテナとしてアプリを実行する目的には不要である「インタラクティブな操作に関する機能」が削ぎ落とされている状態なのです。

Ubuntuの場合、Minimal Ubuntu（あるいはUbuntu Minimal Cloud Images）という、人が直接ログインして操作することを想定しない、クラウドやコンテナ向けに軽量化したものが使われているそうです。
（参考: [「Minimal Ubuntu」とは？Google Compute Engineで早速試してみた！ | LFI](https://linuxfan.info/minimal-ubuntu-released)）

では普通のUbuntuのように使うことはできないのでしょうか？
いいえ、そんなことはありません。

## `unminimize`で通常のUbuntuに戻す

メッセージをよく読んでみると、文中に`unminimize`というコマンドが出てきますね？

はい、UbuntuのDockerイメージの場合[^1]は、`unminimize`というコマンドを実行すると、削ぎ落とされていたコンテンツが復元されて、通常のUbuntu Serverとだいたい同じような状態になります。

```console
root@486452421de5:/# unminimize
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

This script restores content and packages that are found on a default
Ubuntu server system in order to make this system more suitable for
interactive use.

Reinstallation of packages may fail due to changes to the system
configuration, the presence of third-party packages, or for other
reasons.

This operation may take some time.

Would you like to continue? [y/N]
```

実行するとこのようなメッセージが表示されるので、`y`を入力すると削ぎ落とされていたパッケージのインストールが始まります。
パッケージのインストール中にも yes/no を聞かれたりするので、`yes | unminimize`というように実行するとよいでしょう。

[^1]: 他のディストリビューションの場合はどのような軽量化がされているのか、また、元に戻す方法は存在するのかなどは、調べていないのでわかりません。

## 追加のパッケージをインストールする

`unminimize`しただけだと、`man`やその他のよく使うユーティリティは入っていないので、これらは別途インストールする必要があります。

```sh
apt install man-db vim git curl wget # などなど
```

Dockerなのでsystemdを使うといったことはできませんが、これでだいたい普通のUbuntuと同じように操作できるようになります。
【PostgreSQL】算術関数を使ってみた

## 環境
CentOS7
PostgreSQL 11.18

## 算術関数とは？
数値に対して処理を行った結果を返す関数。

| 関数 | 説明 |
| :---: | :--- |
| abs(int) | 指定した数値の絶対値を返す |
| div(int1, int2) | 指定したint1をint2で割った商を返す |
| mod(int1, int2) | 指定したint1をint2で割った余りを返す |
| floor(int) | 指定した数値より小さい最大の整数を返す |
| ceil(int) | 指定した数値より大きい最小の整数を返す |
| round(int) | 指定した数値の小数点部分を四捨五入した値を返す |
| trunc(int[, 小数点を切り捨てる位]) | 指定した数値の小数点部分を、指定した位で切り捨てた値を返す<br>小数点を切り捨てる位を省略した場合は、小数点部分をすべて切り捨てる |
| random() | 0以上1未満の範囲でランダムな値を返す |

## 使ってみた
### abs

``` sql
postgres=# select abs(-5);
 abs 
-----
   5
(1 行)
```

### div

``` sql
postgres=# select div(11, 2);
 div 
-----
   5
(1 行)
```

### mod

``` sql
postgres=# select mod(11, 2);
 mod 
-----
   1
(1 行)
```

### floor

``` sql
postgres=# select floor(2.12);
 floor 
-------
     2
(1 行)
```

### ceil

``` sql
postgres=# select ceil(2.12);
 ceil 
------
    3
(1 行)
```

### round

``` sql
postgres=# select round(2.65);
 round 
-------
     3
(1 行)
```

### trunc

``` sql
postgres=# select trunc(2.12, 1);
 trunc 
-------
   2.1
(1 行)
```

### random

``` sql
postgres=# select random();
      random       
-------------------
 0.562132634688169
(1 行)

```
xmlファイルからyolo用のtxtに変換する方法

# はじめに
至らない点なども多いと思いますが、ご了承いただければと思います。
ここでは、Vottなどでアノテーションを行った際に生成されるアノテーションファイル(.xml)をyoloで使用するテキストファイル(.txt)に置き換えるコードを載せたいと思います。
# コードの内容

```Ruby
import xml.etree.ElementTree as ET
import os
from PIL import Image

classes = ['0'] # クラス名のリスト

def convert_annotation(xml_path, txt_path):
    tree = ET.parse(xml_path)
    root = tree.getroot()

    with open(txt_path, 'w') as f:
        for obj in root.iter('object'):
            cls = obj.find('name').text
            if cls not in classes:
                continue
            cls_id = classes.index(cls)
            xmlbox = obj.find('bndbox')
            b = (float(xmlbox.find('xmin').text), float(xmlbox.find('ymin').text),
                 float(xmlbox.find('xmax').text), float(xmlbox.find('ymax').text))
            bb = convert((width, height), b)
            f.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')

def convert(size, box):
    dw = 1.0 / size[0]
    dh = 1.0 / size[1]
    x = (box[0] + box[2]) / 2.0
    y = (box[1] + box[3]) / 2.0
    w = box[2] - box[0]
    h = box[3] - box[1]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return (x, y, w, h)

if __name__ == '__main__':
    img_dir = '/content/drive/MyDrive/ナンバープレート-PascalVOC-export/JPEGImages/' # 画像フォルダのパス
    xml_dir = '/content/drive/MyDrive/ナンバープレート-PascalVOC-export/Annotations/' # XMLフォルダのパス
    txt_dir = '/content/drive/MyDrive/ナンバープレート-PascalVOC-export/txt' # TXTフォルダのパス

    if not os.path.exists(txt_dir):
        os.makedirs(txt_dir)

    xml_files = os.listdir(xml_dir)
    for xml_file in xml_files:
        if xml_file.endswith('.xml'):
            img_name = os.path.splitext(xml_file)[0] + '.jpg'
            img_path = os.path.join(img_dir, img_name)
            xml_path = os.path.join(xml_dir, xml_file)
            txt_path = os.path.join(txt_dir, os.path.splitext(xml_file)[0] + '.txt')

            img = Image.open(img_path)
            width, height = img.size

            convert_annotation(xml_path, txt_path)
```
mp4動画がiPhoneでだけ動画が表示されない

## 現象

videoタグでmp4の動画を背景に設定していたがiPhoneでだけ表示されない。。。

PC端末ではsafari,chromeどちらもレスポンシブで確認しても表示される、スマホ端末はAndroidでは表示される。

iPhone端末ではchromeとsafiri共に表示されない。

（再生されないのではなく、表示されない）

## 原因

mp4の走査方式が「プログレッシブ」方式なら再生が可能で、「インターレース」方式だと再生できないらしい。

この走査方式は専用ソフト等がないと確認できなさそう…(?)。

動画の変換をお願いして、入れ替えたところ表示されました👏

## 参考

**[【HTML5】iOSのSafariでvideoタグ埋め込みのmp4が再生できないのはインターレースだから](https://deep-space.blue/web/822)**
個人的に設定している便利なGit alias

みんなの便利なaliasも教えてくれよな！

```
[alias]
    graph = log --graph --date=short --decorate=short --pretty=format:'%Cgreen%h %Creset%cd %Cblue%cn %Cred%d %Creset%s'
        # 上の省略形
    gr = log --graph --date=short --decorate=short --pretty=format:'%Cgreen%h %Creset%cd %Cblue%cn %Cred%d %Creset%s'
    st = status
    cm = commit
    pl = pull
    ph = push
        # Untracked filesを表示せず，not stagedと，stagedだけの状態を出力する
    stt = status -uno
        # 行ごとの差分じゃなくて，単語レベルでの差分を色付きで表示する
    difff = diff --word-diff
    b = branch
    co = checkout
    arikui = "!f () { git checkout $1; git branch --merged|egrep -v '\\*|develop|main'|xargs git branch -d; git fetch --prune; };f"
```

git arikui はリモートにマージ済みのブランチをローカルから一括で消すコマンド。
arikuiの部分はお好きな文字列でどうぞ。

でも最近はSourceTreeでラクしてます。
初心者がReactをつかってchatbotを作る　環境構築・Material-UI設定まで

## Reactでchatbotを作る開発メモです


こちらの動画を参考にさせていただきます
>https://www.youtube.com/watch?v=MzJkWO73S70&list=PLX8Rsrpnn3IVOk48awq_nKW0aFP0MGpnn

## 開発環境
OS:mac
エディタ：vscode


### さっそくつくっていきます

macターミナルにて　
```ターミナル:macターミナル
$ npx create-react-app chatbot-demo
```

chatbot-demoとはプロジェクトのフォルダ名なので
作りたいフォルダ名でいれてください





vscodeでフォルダを開く
```ターミナル:macターミナル
$　code chatbot-demo
```


vscodeが開いたら
vscode内のターミナルで
```ターミナル:vscodeターミナル
$　npm start
```

とするとReactの初期ページが立ち上がる
一旦ctrl+Cでキャンセルしておく


## Material-UIのインストールと事前設定

```ターミナル:vscodeターミナル
$　cd chatbot-demo
```

カレントディレクトリを移動したらインストールしていく


```ターミナル:vscodeターミナル
$　npm install --save @mui/material @emotion/react @emotion/styled
#Material-UIのスタイル付きコンポーネントをインストール

$npm install @fontsource/roboto
#robotoフォントを使うためのインストール

$npm install @mui/icons-material
#アイコンを使うためのインストール

```

#### package.jsonに以下が記述されていたらインストールは完了している

![スクリーンショット 2023-06-23 12.22.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627182/6d9a8500-86c3-d51a-c853-161098454f1d.png)



Material-UI公式HPの以下のコードを
chatbot-demo/public/index.htmlの
head閉じタグの前にコピペする

```html:index.html
  <head>
    （省略）
    <!-- Robotoフォントとアイコンの読み込み -->
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap"/>
    <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons"/>
    <title>Chatbot</title>
  </head>


```

環境構築とMaterial-UIの事前準備はこれで完了
Power Systems Virtual Serverのブートイメージを国外にエクスポートする場合、ある程度の時間を見積もりましょう

TOKYOにあるPower Systems Virtual ServerのブートイメージをSYDNEYにあるCloud Object Storageにエクスポートしてみました。
以下の手順です。

エクスポート1　取り込んでエクスポートを選択してクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633718/3c721133-6cd6-7a16-2537-679ff8f10852.png)


エクスポート2　160GB程度であることを確認し、「取り込んでエクスポート」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633718/1fd82b7e-7baf-136c-9825-7c6d5d8b399b.png)

エクスポート3　ブートイメージが作成されるのを待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633718/8958d330-b4a6-3ee2-b370-ba9227f39207.png)

エクスポート4　ワークスペースをSYDNEYに作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633718/3f4e8678-9420-95f2-afc1-3eda7fdd9f7d.png)

エクスポート5　ワークスペースがSYDNEYに作成されたことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633718/fd237f27-1d3e-314b-20f2-60a073be15e6.png)

エクスポート6　SYDNEYにCloud Object Storageを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633718/7d39f3b4-e2d4-0896-3765-b7f5736b6936.png)

エクスポート7　3で作成したブートイメージをSYDNEYにエクスポートします。数時間待ちましたが、完了しませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633718/729ad147-b6e4-b7a5-4445-2c6e2e584bf9.png)

エクスポート8　翌日、52.8GBに圧縮されてエクスポートされたことを確認しました。夜間バッチ処理のイメージですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633718/5c935b56-a8eb-03ef-570f-cb07f3b89a0f.png)

このようにPower Systems Virtual Serverのブートイメージを国外にエクスポートする場合、ある程度余裕を持った時間を見積もりをしたほうがよさそうです。
MLBB VIRAL

mlbb viral は、モバイルレジェンドのニュースを新しく更新された最新の方法で提供するサイトです。トーナメントから参加するプロプレイヤー、退場、更新された名簿に至るまで、モバイル レジェンドに関するすべての情報について説明します。
詳細なニュースについては、ここで確認できます<a href=”https://https://www.deviantart.com/mlbbviral/”>berita mobile legends terbaru</a>
Elixirの対話モードで演算子の基本の動作を確認してみた

# 概要
Elixirの対話モードで演算子の基本の動作を確認してみました。以下のページを参考にしました。

https://dev.to/gumi/elixir-03--33im

# 対話モードで実行
以下のコマンドを実行しました。
```
$ iex
Erlang/OTP 24 [erts-12.2.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit]

Interactive Elixir (1.12.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> 4 + 2
6
iex(2)> 4 - 2
2
iex(3)> 4 * 2
8
iex(4)> 4 / 2
2.0
iex(5)> (1 + 2) / 3 + 4 * 5
21.0
iex(6)> div(10, 2)
5
iex(7)> rem(10, 3)
1
iex(8)> list = [3.14, :pie, true, "Apple"]
[3.14, :pie, true, "Apple"]
iex(9)> list ++ ["Cherry"]
[3.14, :pie, true, "Apple", "Cherry"]
iex(10)> ["π"] ++ list 
["π", 3.14, :pie, true, "Apple"]
iex(11)> list -- [true, false]
[3.14, :pie, "Apple"]
iex(12)> name = "alice"
"alice"
iex(13)> "hello " <> name
"hello alice"
iex(14)> "hello #{:world}"
"hello world"
iex(15)> -1 || true
-1
iex(16)> false || 2
2
iex(17)> nil && 3
nil
iex(18)> true && 4
4
iex(19)> !true
false
iex(20)> !1
false
iex(21)> !nil
true
iex(22)> is_atom(:example) and 1
1
iex(23)> false or 1
1
iex(24)> not is_number(false)
true
iex(25)> 1 and true
** (BadBooleanError) expected a boolean on left-side of "and", got: 1

iex(25)> not 1
** (ArgumentError) argument error
    :erlang.not(1)
iex(25)> false and raise("実行されればエラー")
false
iex(26)> true || raise("実行されればエラー")
true
iex(27)> 1 > 2
false
iex(28)> 1 != 2
true
iex(29)> 1 == 1
true
iex(30)> 1 <= 2
true
iex(31)> 1 == 1.0
true
iex(32)> 1 === 1.0
false
iex(33)> :hello > 999
true
iex(34)> {:hello, :world} > [1, 2, 3]
false
iex(35)> 
```

# まとめ
何かの役に立てばと。
アプリを50個リリースしているのにお金が稼げない理由


![スクリーンショット 2023-06-20 13.54.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/b236d3fe-706a-ab30-ba15-6fda3332eac2.png)


こんにちわ。いせりゅーです。


最近は、Qiitaで記事を投稿し、いいねの通知に快感を覚えてきました笑
「Qiita王に俺はなる！」と思いながら頑張っています〜〜👍



## プロフィール

![スクリーンショット 2023-06-19 18.57.56（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/4bd5e708-950d-eaf6-1b16-e28a0135002c.png)


## アプリのリリース数

#### 2023年6月20日現在のリリース数は、
- <b>Apple Storeでは、52個リリースしています!!</b>

リンクはこちら

https://apps.apple.com/jp/developer/ryutaro-iseki/id1544199624?see-all=i-phone-apps


- <b>Google Play Storeでは、20個リリースしています!!</b>

リンクはこちら

https://play.google.com/store/apps/developer?id=ryutaro+iseki


## 稼げない理由

#### １、Admobが垢BANされた。

これは恥ずかしい理由で話したくないのですが、Admobが垢BANされました😢
でも、これは自分のせいでした。その理由は、、、、、
<b>「自分で広告を押してしまった」いや、「故意に広告を押しました。」</b>

これは人としてダメな行為だと思っていますが、お小遣いが欲しいな。。。と思い、広告を押した結果、、、、

![スクリーンショット 2023-06-20 13.45.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/bde8faf0-ebc7-082d-4309-6070aa0ce644.png)


最近は、反省して、新しくアカウントを作っている途中です。次こそはと思っております笑







#### 2、有料アプリにする自信がない。

アプリをたくさん作っているのですが、「有料にしてみたら？？」と言われることがとても多いですが、正直なところ、有料にするほどのクォリティが高いアプリが出せていないと思っています。
いつか、いつか有料にしてもしっかりと使ってくれるようなアプリを作るぞ！！と思い、2年半経ちます。。。。😢
まだまだ作れていないですね。100個目作ってやっと一つできたらいいなぁぁぁ





## 今後やりたいこと

- <b>Admobの復活</b>・・アカウント自体は作り直せたので、近いうちにAdmobを入れてみようかなと思います。
- <b>有料のアプリを作ってみる</b>・・・100個リリースするまでに頑張ります👍
- <b>サブスクのあるアプリを作ってみる</b>・・・これは実務経験でも活かせられそうかなと思っております。

## 最後に

色々と可能性がある分野であるからこそ、やりがいがあるなと思っております。仕事で学べた技術を活用することによってもっといいコードができると思うととても幸せに働けている気がします。

いつか有名なアプリを個人で作れるようにするぞぉぉぉぉぉ



ps.6/24は、Flutter23卒の同期でユニバーサルスタジオジャパンに行ってきます！！鬼楽しみ！！これからもずっと同期やメンバーといい関係で過ごせたらいいなぁぁ
UEのMarcketPlaceで購入したモデルに他のアセットのモーションを設定する

# 設定
こちらのキャラクターに
https://www.unrealengine.com/marketplace/ja/item/4cab9dab5aac4a38866f84374e0a8cce

このモーションをさせたい
https://www.unrealengine.com/marketplace/ja/item/772f6906e79d4b38b1e4dc56a25205bf

## IkRigの作成

このSkeletalMeshのheadはこのBoneからこのBoneだよ的な情報を設定するファイル

Forest CreatureのSkeletalMeshとWitch Animation SetのモーションのSkeletalMesh
をベースにしたIKRigを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/5413e5c5-fe5f-baff-ca09-a94218786a62.png)

SkeletalMeshの設定はここから
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/0519d9e6-9ead-b4f9-c51e-3b29a8a5f25e.png)


それぞれのRigに
head,spine,arm_l,arm_rなどのChainの設定をします。

このSkeletalMeshのheadはこのBoneからこのBoneだよと設定する
両方とも同じ名前で設定しておくと次の作業が簡単です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/0c7c089e-d9d2-ca8f-b36a-bc5beb0507cc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/36019f08-7089-2f64-95f0-2ee7954b4e9f.png)


## Retarget

腕はこれだよを紐づける

次にIK Retargeterを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/e041f66f-dc8c-e362-5323-7308d06fd253.png)

ファイルを開くときにSelect Source IKRigとSelect Target IK Rigを設定します。
（この時に↑で同じ名前になっていると自動で設定してくれるようです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/ba51d4d5-4491-e8c0-4969-88211301e2a8.png)
赤枠の中身がこのように設定されていればOK

chainの設定はここで設定する
追加Chainはここで設定をしなおす。

頭はここだよ、足はこれだよを紐づける作業。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/787cccfb-7921-ddd7-393a-50f20931dbd3.png)

## アニメーションの確認

きちんと設定出来たらここでアニメーションの確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/5e9c62f5-be58-c3f1-138f-eda812947fbc.png)


## アニメーションファイルの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/59f18352-84ed-a058-6f39-5dbe80b44930.png)

ここからExport

## バグ？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/f9ecf022-e461-9aee-383f-2931ff282bcb.png)

Retargeter上では↑のように見えていてもExportすると↓に…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/80a3824e-d710-17f1-09c6-139d6ddddc6e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/07adf2bd-0739-3118-6f13-632b3db793f8.png)

おかしな方向に曲がっているBoneのRotateの曲がっている方向と別の軸に数値を入れると
向いてほしい方向に収まってくれた…
Python開発環境　Linter, Formatterの設定

# Python開発環境　Linter, Formatterの設定

VSCodeでPythonを使っていると右下にやたらとLinterやFormatterのポップアップが表示されます。
適当に流していましたが、最近、本格的にPythonを使用することも多くなったので、LinterとFormatterについて調べました。

## Formatterの導入

今回は**black**を使用します。PEP8というPythonのコーディング規約に準拠しているそうです。
blackはデメリットとして、カスタマイズがほとんどできないという点があります。
こだわりはないので、今回はblackを使用します。

以下の拡張機能をインストールすることで設定が完了します。

https://marketplace.visualstudio.com/items?itemName=ms-python.black-formatter&ssr=false#overview


## Linterの導入

**flake8**を使用します。PythonのLinterの中では有名なもののひとつです。
pipでインストールします。

```bash
pip install flake8
```

Pythonのデフォルトの拡張機能を入れておけば、Linterは適応されるようになります。

## VSCodeの設定

以下に設定しておきます。

```setting.json
{
  "[python]": {
    "editor.defaultFormatter": "ms-python.black-formatter"
  },
  "python.linting.enabled": true,
  "python.linting.flake8Enabled": true,
  "python.linting.flake8Args": [
    "--max-line-length=88",
    "--ignore=E203"
  ],
  "python.formatting.provider": "black",
}
```

blackのFormatはflakeのmax-line-lengthとE203に引っかかるので、flakeの設定を変更しています。エラーとして表示させないように設定を上書きしています。

## 参考

https://github.com/PyCQA/flake8

https://github.com/psf/black

https://dev.classmethod.jp/articles/vscode_black_flake8/
ViTのKとVをPyramid Poolingで計算量削減【P2T】


**原論文**
P2T: Pyramid Pooling Transformer for Scene Understanding
https://arxiv.org/abs/2106.12011


# 関連研究

Vison Transformerの解説
https://qiita.com/wakanomi/items/55bba80338615c7cce73

PVTの解説
https://qiita.com/wakayama_90b/items/77c4c6857210b73e24b8

CNN+ViTモデルの傾向【サーベイ】
https://qiita.com/wakayama_90b/items/96bf5d32b09cb0041c39

# 結論
ViTの計算量削減のためにキーとバリューをPyramid Poolingと畳み込みを使用してダウンサンプリングする．


# 概要
ViTの問題点として，計算量が膨大である問題点がある．それを解決するために，P2Tは，キーとバリューをダウンサンプリングする．ダウンサンプリングにはPyramid Poolingと畳み込みを使用する．




# モデル構造
モデル構造として，4ステージの階層型モデル構造を採用している．最初の処理はに$7 \times 7$の畳み込みを採用して特徴抽出を行う．これは，局所的な認識の補助と特徴量のダウンサンプリングで計算量の削減効果がある．


![スクリーンショット 2023-06-22 17.17.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/3d4684e2-6a10-1127-e048-27c85c4b18c5.png)


![スクリーンショット 2023-06-22 17.17.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/609008af-9404-b7e8-f608-18bb0988a6fa.png)


## Pyramid Pooling Transformer
Pyramid Pooling Transformerの構造としてViTのTransformer encoderと同様な構造を持つ．
左の図から空間認識のSA，チャンネル方向認識のMLPを交互に認識する構造である．
右の図では，KとVのダウンサンプリングのためにをPyramid Pooling+畳み込みをする．
KとVをダウンサンプリングすることで計算量の削減する．

Pyramid Poolingは以下のurlで解説します．
https://qiita.com/wakayama_90b/items/c023816fc8481b4f9fbb



<img width="400" alt="2023-06-22 17.17.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/219764fc-3240-7517-a69f-9707a180e2fd.png">



# まとめ
今回はViTのKとVをPyramid Poolingで計算量削減【P2T】について解説した．
KとVのダウンサンプリングで計算量を削減する．ダウンサンプリング方法は，様々あるのでその1種にPyramid Pooling+convがある．
Pyramid Poolingを解説



**原論文**
Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
https://arxiv.org/abs/1406.4729



# 概要
画像認識分野においてConvolutional Neural Network（CNN）は様々なタスクにおいて高性能を実現した．
CNNの構造は特徴量の少量域に重みカーネルを通す畳み込み処理と近傍の情報を統合するPooling処理がある．今回は，Pooling処理構造を変更したPyramid Poolingについて解説する．



# 構造


入力された特徴量を指定の数に分割する．その分割した範囲でpoolingを行う．例えば，右の図の16つに分割した場合では，それぞれの範囲の値が1つの値に集約されるので，出力は$4 \times 4 \times d$になる．
様々な数で分割してpoolingした値は1次元化されて，コンキャットする．



![スクリーンショット 2023-06-24 7.31.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/a0cad9f8-2c88-3673-f67f-fb8b9dfc3d6a.png)
MacOS Dockの表示スピード調整

こんにちは。藤澤です。

5年くらい前、ちょっとした技術的小ネタをQiitaにまとめていこうとしたのですが、日々の業務で後回しになっていました。これでは行かんなということで、これから少しずつでもローカルに溜め込んだ小ネタ集を紹介してゆこうと思います。

今回はその第１弾ですが、本当に小ネタです。

断然Windows派だった私。数年前からMacbookに乗り換えているのですが、画面の下からニョキっと現れるDockがワンテンポ遅い！というストレスを解消するものです。標準だと、カーソルを画面下に移動して一瞬待つとDockが現れるのですが、「サッ！と出て来なさいっ！」と思ったわけであります。

前置きが長くなりましたが、中身はシンプルです。ターミナルを立ち上げて次のコマンドを打てば、すこぶる素直にサッと現れてくれます。すばらしい:thumbsup_tone2:

### 出始めるまでのウェイトを調整
サッ！と出るのか？ちょっと待ってから出てくるのか？という設定です。早くしたければ1を0に変更してウェイトをなくす。（これはイイ！）
```:既定
defaults write com.apple.Dock autohide-delay -float 1; killall Dock
```

### 出てくるスピードの調整
ニョキっ！と出てくる速さは、次のコマンドで調整できます。より正確にはアニメーションさせるか、させないかという設定のようです。早くしたければ 1を0にしてアニメーションをやめさせる。（そのままでいいかな。）
```:既定
defaults write com.apple.dock autohide-time-modifier -int 1; killall Dock
```

こんな感じでお手軽にMacをキビキビしたマシンに仕立てることができました。同じ悩みをお持ちのあなた！いらっしゃったら、お試しください。
CodeSandbox が Rust や Python など様々な言語に対応したので Qiita に埋め込んでみた

Qiita にはさまざまなコンテンツを埋め込み可能です。CodeSandbox も埋め込み可能なコンテンツの一つです。

https://qiita.com/Qiita/items/612e2e149b9f9451c144

従来の CodeSandbox はブラウザ上で動作するため React や Vue などのフロントエンドのみ対応していましたが、近年の CodeSandbox は Firecracker の microVM という仮想マシンによる処理の実行が可能になりました。それにより、フロントエンド以外のさまざまな言語の実行が可能となっています。

従来のブラウザ上で React や Vue を動かす sandbox を [**browser sandbox**](https://codesandbox.io/docs/learn/sandboxes/editors?tab=browser)、最新の microVM で動作する sandbox を [**cloud sandbox**](https://codesandbox.io/docs/learn/sandboxes/editors?tab=cloud) と呼びます。（詳細はリンク先のドキュメントをご確認ください。）

この cloud sandbox では、Rust や、

https://codesandbox.io/blog/announcing-rust-support-in-codesandbox

https://codesandbox.io/embed/rust-rk69p3

Python が公式にサポートしていることが発表されています。

https://codesandbox.io/blog/introducing-python-support-in-codesandbox

https://codesandbox.io/embed/python-in2qez

他にも、PHP や Go にも対応しているようです。

https://codesandbox.io/blog/say-hello-to-php-support-in-codesandbox

https://codesandbox.io/blog/unleash-the-power-of-go-in-codesandbox

さらに、Docker にも対応しているため、自分で設定等行えば任意の言語が実行可能かもしれません。

https://codesandbox.io/docs/learn/environment/docker

# Qiita で cloud sandbox を埋め込む

:::note warn
cloud sandbox の埋め込みは現在ベータ版のため、仕様が変更される可能性があります。
https://codesandbox.io/docs/learn/sandboxes/embedding
:::

従来の browser sandbox は、埋め込み用URLを貼るだけで埋め込みが可能でした。

```markdown:書き方
(空行)
https://codesandbox.io/embed/qiita-hardcore-einstein-gxwrp2-gxwrp2?fontsize=14&hidenavigation=1&theme=dark
(空行)
```

cloud sandbox も右上の `Share > Copy embed code` から埋め込み用の iframe が取得可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325392/c4710195-d2fb-836c-9915-e35c1a5996df.png)

コピーした iframe ↓

```html
<iframe
  style="border: 1px solid rgba(0, 0, 0, 0.1);border-radius:2px;" width="800" height="450" 
  src="https://codesandbox.io/p/sandbox/rust-sample-6f2825?embed=1" allowfullscreen
></iframe>
```

ですが、そこに含まれる埋め込み用URLは形式が以前と異なります。

```
// browser sandbox
https://codesandbox.io/embed/qiita-hardcore-einstein-gxwrp2-gxwrp2?fontsize=14&hidenavigation=1&theme=dark
// cloud sandbox
https://codesandbox.io/p/sandbox/rust-sample-6f2825?embed=1
```

そこで、 後ろの sandbox の id である `rust-sample-6f2825` を使って従来と同じURLに変更すれば埋め込み可能です。

```
// before
https://codesandbox.io/p/sandbox/rust-sample-6f2825?embed=1
// after
https://codesandbox.io/embed/rust-sample-6f2825
```

https://codesandbox.io/embed/rust-sample-6f2825?fontsize=14&hidenavigation=1&theme=dark


現状ではこのように少し不便ですが、cloud sandbox の新しい形式の埋め込みURLでも埋め込めるようにしたいと考えています。

cloud sandbox の埋め込みは現在ベータ版のため変更される可能があるので、 Qiita で公式に cloud sandbox の埋め込みに対応するのは先になりますが、一旦は上記の方法で埋め込みを試してみてください！！
AWSconfigのルールについて調べた備忘録

# AWSconfigルールについて
- AWS提供のプリセットルール
    - AWSが提供する既存のルールを使用して、AWSリソースのコンプライアンスをチェックします。
- Lambdaを使ったカスタムのルール
    - AWSが提供するルールがニーズを満たさない場合や、特定のロジックを適用してリソースのコンプライアンスを評価するために、Lambda関数を使用してカスタムルールを作成します。
- Gardを使用したルール
    - CloudFormation GuardはCloudFormationのテンプレートを規定したガバナンス、コンプライサンスに沿っているか評価するためのサービス
    以前はLambdaでカスタムルールを策定するしかなかった。なのでPythonなどのコーディング技術が必要だったが、学習コストの少ないDSL言語で書けるようになった。
- AWS configでレコードされる内容
    - AWSconfigでレコードされる内容はAWSリソースの変更内容　S3にjson形式で保存される。
    - そんなにみるものじゃないからS3 glacierにしてもいい？する方法は？

- リソースの構成を管理するのがconfigって話
    - Lambdaでルールを作ってたときにconfigからなにかよくわからへんけど変更あったでだからLambdaくん調査しにいってや−帰ってきたら教えてやー
    だとおもってた

    - 実際は変更があった場合は全ての情報をLambdaくんに渡してこれでええんか？ええんか？って調べてもらってOKもらうって仕組みだったわ
商品購入ページでその商品が購入されたフラグを実装する

```liquid
{% assign already_order = false %}
{% for customer_order in customer.orders %}
  {% if customer_order.cancelled == false %}
    {% for orderd_item in customer_order.line_items %}
      {% if orderd_item.product_id == product.id %}
        {% assign already_order = true %}
      {% endif %}
    {% endfor %}
  {% endif %}
{% endfor %}
```
Dockerfileのベースイメージにcentos8を使ってハマった点

# 概要
今回は、docker imageを作成していてつまづいたところを共有します。
とてもしょーもない理由でした。

# 事象
- dockerfileで'dnf -y update'で以下のエラーが発生

# コード
```Dockerfile
FROM centos:8

WORKDIR /wordpress

RUN dnf clean all
RUN dnf -y update
```
# エラー内容
```
#0 0.892 Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
```

appstreamへ接続できないっていわれますね。

# 原因
centos8がサポート終了してappstreamが閉鎖されたってだけ

# 対処
almalinuxに変更

めでたしめでたし。
ProxmoxのVMディスクをWindows Serverのファイル履歴（VSS）で復元してみる

以前のエントリでWindows Server上の共有ボリュームからVMを起動しましたが、VMディスクの実体ファイルであるQCOW2ファイルを復元しても起動ができるかどうかを検証しました。

:::note info
**結論**
ファイルシステムレベルでボリュームシャドウコピーをとることで、自動でバージョン管理ができるメリットがありそうです。
:::

# VSSの有効化
「シャドウコピーの構成」を選択し、設定します。今回は「アイドル時」「10分」を選択しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/9a6221d8-4006-c666-0479-61e80af2d509.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/010742b1-6e93-9ce7-beff-383abe8240ec.png)

# ファイルの更新

VMを起動し、テキストファイルを置いてディスクを更新します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/934623c8-04ec-90f1-a47a-7c04d739d70b.png)

# 履歴の復元

VMをシャットダウンしたあと、QCOW2ファイルを右クリックし「以前のバージョンの復元」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/2f824df7-aef6-7338-163b-c221d939a656.png)

前日のバージョンに戻します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/d2234614-9dda-a83a-a66b-d1d5ef014c5c.png)

# VMの起動確認
デスクトップにファイルがないことを確認。壁紙も戻っていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/053c0c56-b546-f664-d7bc-ea5fb57b8fc5.png)

# コピーでの復元

バージョンを右クリックすると「コピー」がありますので、任意のフォルダにいったんコピーできます。直接の復元するよりも、こちらのほうが安全そうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/7933a339-99e7-f423-befd-b3800ca9ab52.png)

# フォルダ単位での復元
フォルダ単位だと日付が表示されるのでより分かりやすいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/e0153f1e-300a-f5ac-5da0-0c3176a9f638.png)


# まとめ
- Proxmoxのスナップショットはやや不安定で一時利用に限られるのと、バックアップはファイルサイズが増大したり帯域やマシンに負荷がかかる問題がありました。
- VMをWindows Server上からネットワークブートし、ブート元のファイルシステムレベルでボリュームシャドウコピーをとることで、自動でバージョン管理ができたり、重複排除できたりといったメリットがありそうです。

# 参考にさせていただいたサイト
**Windows Serverのシャドウコピー（VSS）の設定方法と復元方法を解説**
https://ittrip.xyz/soft/windows/shadow-copy

**Windowsサーバでファイル単位のリストアをする方法**
https://dev.classmethod.jp/articles/tsnote-ec2-windows-vss-001/
Semantic Kernel が Copilot stack との連携を明確化しプラグインエコシステムと統合

Microsoft は 大規模言語モデル (LLM) をアプリにすばやく簡単に統合できる SDK である [Semantic Kernel](https://github.com/microsoft/semantic-kernel) の[ドキュメント](https://learn.microsoft.com/semantic-kernel/overview/)を更新し、Build 2023 にて発表された開発フレームワークである [Copilot stack](https://qiita.com/nohanaga/items/c3e92c9adeca7c84a8d5) との連携強化を明確化しました。更新されたドキュメントを参照すると、Copilot stack に合わせた形で用語の変更もありました。


https://qiita.com/nohanaga/items/430b59209b02c298ef2a

# スキルをプラグインへ改名
Semantic Kernel で「スキル」と呼んでいた機能は「プラグイン」へ改名となります。その心は、Semantic Kernel でこれまで作成したセマンティック関数やネイティブ関数の集合であるスキルを Copilot stack における「プラグイン」としてエコシステムに柔軟に統合できるというビジョンに基づいています。

# Copilot stack
Copilot stack は大規模 LLM をオーケストレーターとして利用し、複数のプラグインや外部システムの情報と連携させて GPT-4 のプラグイン機能や Microsoft の各製品に搭載される Copilot と連携したり独自の Copilot を開発できるフレームワークです。

https://qiita.com/nohanaga/items/c3e92c9adeca7c84a8d5

# プラグイン開発
ChatGPT 規格のプラグインを開発すれば、以下のようにブラウザ版 GPT-4 だけでなく、Bing や Microsoft 365 Copilot、Windows Copilot などからも利用可能になります。当然、組織独自の Copilot と統合することもできます。このプラグインによって、最新の情報や組織内のデータを反映させた（Grounding）回答を行ったり、ReAct などのタスクを実行させることが可能になります。Microsoft では、業界全体の連携を推進するために、プラグインの標準として [OpenAPI プラグイン仕様](https://platform.openai.com/docs/plugins/getting-started/)の採用を進めています。

ここでは、**ChatGPT のプラグイン**と **Semantic Kernel のプラグイン（旧スキル）** を区別して解説します。用語がごっちゃになりそうなの注意ですね。

![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/f8741485-f1ce-5d3e-ba6f-97c09c1eb7db.png)

## ①Semantic Kernel で ChatGPT プラグインを利用する
AI オーケストレーターとして Semantic Kernel が ChatGPT プラグインを呼ぶパターンです。これに関してはすでに以下の記事で紹介されています。

https://devblogs.microsoft.com/semantic-kernel/how-to-use-plugins-with-semantic-kernel/

### openapi-skills
https://github.com/microsoft/semantic-kernel/tree/main/samples/dotnet/openapi-skills

## ②Semantic Kernel のプラグインを ChatGPT へ連携する
Semantic Kernel そのものを Web サービスとしてデプロイし、OpenAPI 仕様の ChatGPT プラグインとして利用できるようになります。これまで Semantic Kernel で開発したセマンティック関数とネイティブ関数の利用先がさらに広がります。

https://learn.microsoft.com/semantic-kernel/deploy/deploy-to-azure

# Azure AI Studio との統合
Build 2023 の [Azure AI Studio](https://www.youtube.com/watch?v=DaIYrlMOj7I) のデモでもあったとおり、[Azure Machine Learning](https://azure.microsoft.com/products/machine-learning) 上のプロンプトフローに Semantic Kernel は統合される予定です。すでに開発環境をお持ちの方でもプロンプトフローにコードを持ってくることができ、Azure AI Studio 上でプロンプトの可視化、テスト、安全性評価、デプロイも行えるようになります。これにより Semantic Kernel 開発はさらに加速・スケールできるでしょう。
![016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/0017b748-0244-e85d-b86f-36e4dd6686b6.png)

# Semantic Kernel について学ぶ
 - [Semantic Kernel とは？](https://learn.microsoft.com/semantic-kernel/whatissk)
 - [無料の LinkedIn 学習コース](https://www.linkedin.com/learning/introducing-semantic-kernel-building-ai-based-apps/introducing-semantic-kernel)
 - [microsoft/semantic-kernel](https://github.com/microsoft/semantic-kernel)

# Semantic Kernel 日本語解説
https://www.youtube.com/watch?v=tFgqdHKsOME&t=4687s
Proxmox7 を試してみる　その８　LXC Container を使ってみる

# LXC Container とは
Proxmox では、LXC Container が簡単に扱えるとのことですので試してみます。そもそも LXC Container は、仮想マシン（VM）＝仮想ハードウェアを演算によって実現しているのに対しホストOSの資産を使用することからオーバヘッドが少なく低リソースで運用できるメリットがあります。

・[15分で分かるLXC（Linux Containers）の仕組みと基本的な使い方](https://knowledge.sakura.ad.jp/2108/)

# 小難しいことはいいから
ってことで早速実施してみます。まず LXC のテンプレートからダウンロードするところから始めます。

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/d8cde202-d9a8-110e-f13d-170e560e1dc5.png)

テンプレートボタンを押下する。一覧が表示されるので使いたいLXCを選択しダウンロードしましょう。

![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/792a0757-eb99-8f46-7035-2624360b8d63.png)

ダウンロードすると・・・（almalinuxが好きです）

![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/a95edf19-62bd-ab0d-5c3e-dc1c4513a333.png)

で、CTを作成ボタンを押下しましょう。

![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/cba03650-87bf-9288-063a-60b263b30b5d.png)

詳しくは、下記のURLを参照するとして。ポイントとしては、ダウンロードした LXC を選択するだけです。

・[ProxmoxのLXC Containerを利用してPi-Holeを構築する](https://rakilib.com/build-a-pi-hole-using-proxmoxs-lxc-container/)

![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/48634a53-1bae-7105-21c3-daa26366ec19.png)

# 起動する前に追加でネットデバイスする
ネットデバイスを追加してみます。名前は適当で問題ないですが使用したいブリッジを指定します。

![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/e2132622-1234-0386-feae-289a82c83268.png)

起動してみます。

![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/4c23ecb7-cecb-a06f-d42a-27348e85111e.png)

きたーーー！！
SAPRouter起動オプション

SAP社からリモート接続するために利用するSAPRouterですが、意外とオプションに悩みます。
一応私の最適解はこちら

```
arg 0:     /opt/saprouter/saprouter   #実行ファイルのpath
arg 1:     -r                         #起動オプション
arg 2:     -R                         #SAPRoutetabの指定、pathはarg3
arg 3:     /opt/saprouter/saprouttab
arg 4:     -K                         #SNC接続の場合のみ。arg5とセット
arg 5:     p:CN=SNC<hostname>, OU=xxxxxxxxxx, OU=SAProuter, O=SAP, C=DE
arg 6:     -T                         #トレースログの指定、pathはarg7
arg 7:     dev_saprouter.log
arg 8:     -G                         #SAPRouterのログファイル指定、pathはarg9
arg 9:     /opt/saprouter/saprouter.log
arg 10:    -E                         #ログ、トレースログを上書きしない
arg 11:    -J                         #SAPRouterログファイルを分割するサイズ
arg 12:    1024000                    #1MB、手ごろサイズが良いと思う
```

再起動するとSAPRouterログやトレースログは消えてしまうので、防ぐためにEオプションを使う。
また、SAPRouterログは通信記録がどんどん記録されるので、Jオプションで分割サイズをしていしてあげる。上記では、1MBにしている。
分割したファイルは、下記のようにいつからいつまでのログかファイル名で判別できる。
>saprouter.log_c_20230623_113711-20230623_114837
>saprouter.log_c_20230623_114837-20230623_114839
>saprouter.log_c_20230623_114839-20230623_114839
【React, JS】クライアント側フォーム検証を別処理で実行

# 経緯
業務中に実装する必要が出てきたので自分用にメモします
# 要件
別々の処理の実行前に同じフォーム検証を実行したい
フォーム検証の詳細は[こちら](https://developer.mozilla.org/ja/docs/Learn/Forms/Form_validation)、ざっくり言うとこういうの↓
![スクリーンショット 2023-06-23 11.46.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180934/fa27302e-300c-dd16-7f10-78a2f47b816e.png)
# 方法
`checkValidity()`を使います（詳細は[こちら](https://developer.mozilla.org/ja/docs/Web/API/HTMLSelectElement/checkValidity)）
> HTMLSelectElement.checkValidity() メソッドは、その要素に制約が設定されているかどうか、それを満足しているかどうかをチェックします。その要素が制約を満たしていない場合、ブラウザーはキャンセル可能な invalid イベントをその要素に送り、false を返します。

ReactのHooksを利用して`<form>`に`RefObject`を指定してハンドル関数から実行しました
submitボタンがクリックされないとフォームの検証は行われないので、CSSで非表示にしたダミーのsubmitボタンをさっきと同様にReactのHooksを使ってクリックさせています

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="ExOgxLN" data-user="kitazawa-53" style="height: 300px; 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/kitazawa-53/pen/ExOgxLN">
  manual form validation</a> by kitazawa (<a href="https://codepen.io/kitazawa-53">@kitazawa-53</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

以上になります
ありがとうございました
おすすめのパーソナルトレーニングジム

はじめましてtora4554です。

体力の衰えを感じているのでそろそろ運動習慣をつけなければと思っているのですが、継続できていないのが現状です……。一人では運動を継続させられる自信がないので、最近は真剣にジムに通おうかと考えています。

皆さんはパーソナルトレーニングジムをご存知でしょうか？
パーソナルトレーニングジムはジムの種類の一つで、トレーナーから一対一の指導を受けられるタイプのジムです。トレーナーが自分の要望や運動経験に合わせてトレーニングメニューを作成してくれるので、運動初心者にもおすすめらしいです。メニューの作成だけではなく、トレーニングのモチベーションやメンタル面でもケアしてくれるそうです。

パーソナルトレーニングジムは数多くありますが、Apple GYMとRIZAPが良さそうな印象です。

・Apple GYM

Apple GYMは特許取得済の「海外式ボディメイク」を取り入れたジムで、ここでしか受けられないオリジナルのトレーニングを受けられます。このボディメイクはダイエットや姿勢改善に特に効果があり、欧米人風の美ボディを目指したい人におすすめです。
食事制限も緩めに設定されており、食生活でストレスを溜めないことも大きな利点です。入会金やコース料金が他のパーソナルトレーニングジムより安めなのも大きなメリットですね。

・RIZAP

「結果にコミットする。」をコンセプトにしたジムで、芸能人数多く利用しており実績が豊富です。ダイエットや筋力増強等の様々な目的のトレーニングを受け付けているのも特徴です。
在籍トレーナーはトップレベルでベテラン揃いなので、トレーナーの質の高さが評判のジムです。
食事制限はApple GYMより厳しめなので、本気でダイエットをしたいと考えている人向けかもしれません。
RIZAPの料金は相場価格より高めですが、サポート面は他のジムより充実しているので、費用よりサービスやトレーニングの質を重視する人におすすめのジムです。



参考サイト
アップルジム（Apple GYM）ってどんなジム？評判や口コミを徹底調査！
https://gym-boost.com/brand/apple-gym/
RIZAPってどんなジム？評判や口コミを徹底調査！
https://gym-boost.com/brand/rizap/

まだどのジムに入会するか決めていませんが、ジムデビューの一歩としてまずは体験トレーニングを受けてみようかと思います。
Rubyとzshの配列操作比較表

[配列操作の比較表: Ruby, Python, JavaScript, Perl, C++ - bkブログ](http://0xcc.net/blog/archives/000043.html) のzsh版です。
zshってここまでできたんだ…

|	Ruby	|	zsh	|
|	---	|	---	|
|	a = [1, 2, 3]	|	`a=(1 2 3)`	|
|	a.length	|	`$#a`	|
|	a.empty?	|	`$#a = 0`	|
|	a.push(x)<BR>a &lt;&lt; x	|	`a+=$x`	|
|	a.unshift(x)	|	`a=($x $a)`	|
|	a.pop	|	`a=($a[1,-2])   `	|
|	a.shift	|	`shift a`	|
|	a.concat(b)	|	`a=($a $b)`	|
|	a.clear	|	`a=()`	|
|	a.insert(i, x)	|	`a=(${a::(($i-1))} $x ${a[$i,$#a]}))`	|
|	a.delete(x)	|	`a=${a:#$x}`	|
|	a.delete_at(i)	|	`a=(${a::(($i-1))} ${a[(($i+1)),$#a]})`	|
|	a.nitems {\|e\| e == x }	|	-	|
|	a.include?(x)	|	`${a[(Ie)$x]}` <br>※`(Ie)`だとexact match。`(I)`だとpattern match	|
|	a.index(x)	|	`${a[(Ie)$x]}`	|
|	a.first	|	`${a[1]}` <br>添字は1始まり	|
|	a.last  | `${a[-1]}` |
|	a[i,l] <br> a.slice(i, l)	|	-	|
|	a[i..j]<br>a.slice(i..j)	|	`${a[$i,$j]}`	|
|	a[i...j]<br>a.slice(i...j)	|	-	|
|	a.sort	|	`${(o)a}`   アルファベット順ソート	<br>`${(n)a}`   数値順ソート	|
|	a.sort!	| - 	|
|	a.reverse	|	`${(O)a}`	|
|	a.reverse!	|	-	|
|	a.uniq	|	-	|
|	a.uniq!	|	`typeset -U a`	|
|	a.join(d)	|	`${(j:,:)a}` <br> ,で連結。区切り文字は任意だが変数は使えない	|
|	a.each {\|x\| ... }	|	`for i in $a; do ... ; done`	|
|	a.is_a?(Array)	|	`"$(declare -p a)" =~ "-a"`	|
|   a - b  | `${a:\|b}` 差集合。bに含まれる要素をaから除いた配列を返す

`${(o)a}`や`${(j:,:)a}`の記法は `man zshexpn` の「PARAMETER EXPANSION」->「Parameter Expansion Flags」に記載されている。

## おまけ：文字列を配列にsplitする

| Ruby | zsh |
|---|---| 
| a = s.split(',') | `a=(${(s:,:)s})` |
| a = s.split(':') | `a=(${(s/:/)s})` |
| a = s.split("\n") | `a=${(f)s}` |
| a = s.split("\0") | `a=${(0)s}` |
| - | `a=${(z)s}` <BR>zshの文法に従って単語に分割する |

## おまけ2:mapやselect
select: `${(M)配列名:#パターン}`
reject: `${配列名:#パターン}`
find: `${配列名[(r)条件]}`
find_index: `${配列名[(i)条件]}`
map: パターンマッチによる置換くらいなら下記でできる
```zsh
arr5=("aaa,111" "bbb,222" "ccc,333")

echo ${(M)arr5#*,} #=> aaa, bbb, ccc,
echo ${(M)arr5%,*} #=> ,111 ,222 ,333

echo ${(R)arr5#*,} #=> 111 222 333
echo ${(R)arr5%,*} #=> aaa bbb ccc
```

https://qiita.com/mollifier/items/f897b3fddd2d10369333#%E6%A4%9C%E7%B4%A2

## 参考
[zsh の配列操作の基本から応用まで - Qiita](https://qiita.com/mollifier/items/f897b3fddd2d10369333)
[zshの連想配列の使い方まとめ - Qiita](https://qiita.com/mollifier/items/ba956b7c07acdabd74a7)
[zsh の分かりにくい記号、用語のまとめ - Qiita](https://qiita.com/mollifier/items/26a9ddcb7470f539e575)
【ChatGPT無】犬がいなくなった！（履歴から消えたよ！）

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::
　どうも、カーブミラーです。

　今回は、
　　タイトル、見ても、
　　　わかりませんよね。
　　　　すまんこってす。

[【ChatGPT無】は数を扱える！？](https://qiita.com/kabumira/items/697de1907a2415a90aed)
　で、文章問題であれば、
　　**計算問題が解ける**、
　　　ということが
　　　　判明したわけですが……。

　実は、途中でChatGPTさんに
　　引っ掛け問題を与えたのです。
　　　これは、上記記事の中の
　　　　やり取りで、触れています。
　　　　（犬のことです）


　そのやり取りのあとに
　　こう問いました。

>それぞれに犬がいますね。
>村、町、街と順番に考えてください。
>今、街には何匹がいますか？

　とね。

　それでChatGPTさんは、
>すみません、先ほどの回答で犬の数に関する情報は提供されていませんでしたので、その部分については再度お伺いいたします。

　えっ！？
　　となったわけですよ。
　　　もちろん、遡ってみても、
　　　　書いてあります。

　不審に思って、
[【ChatGPT無】が健忘症になったなら……](https://qiita.com/kabumira/items/f3d53c376f7cbb3c9406)
　　　の
　「**本セッションの履歴から～**」
　　を使ってみたのですが……。

>おっしゃる通り、先ほどの履歴から確認しますと、犬の数に関する情報は提供されておりませんでした。したがって、具体的な犬の数については分かりません。

　これまた、えっ！？　です。

　で、今度は、次のように入力。
>セッション履歴から、私の入力を出してください。

　これには、出してもらえず。

　次に、こう入力。
>では、これまでのやり取りをまとめてください。

　これに対して、ChatGPTさんは、
>以下は、これまでのやり取りの要点をまとめたものです。
>　
>1. 最初の村には、男性12人と女性16人がいました。
>2. 男性と女性の合計は28人でした。
>3. その後、子供が23人加わり、全体の人数は51人になりました。
>4. 更に犬の数に関する情報は提供されていませんでした。
>5. その後、村が4つできて、それぞれの村には同じ人数の人がいると仮定しました。
>6. 4つの村を合わせると、全体の人数は204人になりました。
>7. その後、村が6つの町になり、全体の人数は1224人になりました。
>8. 街に関する具体的な人数や犬の数に関する情報は提供されていませんでした。

　ぬぁにぃ！
　「4. 更に犬の数に関する情報は提供されていませんでした」ぁ？

　場所的に、そこじゃん！
　　バウバウ！

　とにかく、
　　落ち着きましょう。

　ChatGPTさんが、
　　犬の匹数を
　　　記憶から消したのは、
　　　　なぜか？

　思い当たるのは、
　　その後の入力。
　　　犬に関する話題は、
　　　　せずに来た。

　　　だから、
　　　　ChatGPTさんは、
　　　　　今後、
　　　　　　犬は問題にならない、
　　　　　　　と判断した？

　むむむ、
　　犬だって、
　　　立派な一員だぞ！
　　　　ChatGPT君！
　　　　　記憶から消去しないで！
OfficeScriptsを組織で利用する

本日は Office Scriptsを組織（チーム）で利用する方法についてのお話です。

# Background

* Office ScriptsはExcelで利用できる一種のマクロ機能。
* Excelブック内のシートやテーブル、そこに格納されたデータをTypeScriptで参照したり更新したりできる機能。
* 実態はExcel Onlineの仕組みの中で管理されるTypeScript関数なので、シートやテーブルやそこに格納されたデータを処理しない関数（例：引数で与えられた文字列に正規表現パターンマッチをして結果を返すだけの関数）も定義可能。
* 引数として受け取ることができる型、戻り値として返すことができる型には制限あり。
* PowerAutomateでワークフローを作るとき、ワークフローのネイティブなしくみでは実現が難しい機能をOffice Scriptsを利用して実現することができる。

```ts
function main(workbook: ExcelScript.Workbook /* ここに任意の引数 */) {
    /* ここにビジネスロジック */
}
```

# Problem

* Office Scriptsの関数はデフォルトではM365ユーザーの個人個人に属し、各ユーザーのOnDrive内で管理。SharePointで管理されている組織（チーム）で共有のExcelファイルで、他のユーザーが利用することはできない。
* Office Scriptsの関数を「Excelブックに追加」することで、当該Excelファイルにアクセスできるユーザーに限り共有することができる。
* この共有を行った状態であれば、PowerAutomateの「スクリプトを実行」アクションなどから、他のユーザーが定義した関数を実行することも可能。
* ・・・なのだが、どういうわけかこの関数の「共有」がいつの間にかうまく行かない状態となり、 __「スクリプトを実行」の設定画面で関数を選択できなかったり、すでに設定済みの「スクリプトを実行」アクションを実行するとエラーとなったり__ するケースがある。
* そうでなくても、M365ユーザー個人が持つ関数をExcelブックに関連付けるような仕組みで、その関数もExcel Onineの「自動化」タブを表示してはじめて一覧できるというもののため、 __可視性／アクセス性が低く、組織（チーム）で関数を共有して利用する上で課題__ となる。

# Solution

どうやら昨年（2022年）から、Office Scriptsの関数をファイルとしてSharePoint上で管理できるようになったらしい。
これを利用すると、個人所有ではなく組織（チーム）所有の関数が定義できる。
以下のUIで「スクリプトに名前をつけて保存」をクリックすると、従来のOnDriveに加えてSharePointサイトも保存先に選べるようになっていることが分かる：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/d4ec4900-4213-e410-b492-d7c7dbcff245.png)

ここからSharePointサイト上に保存すると、当該SharePointサイトにアクセスできる組織（チーム）のメンバーはこの関数を利用できるようになる。

そしてPowerAutomateからこのスクリプトを実行する場合は、「Run scrip from SharePoint library」アクションを利用する：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/aa87a079-d98d-54f4-5503-48764f3b0989.png)

まだプレビュー版。ドキュメントも見つけられなかったが、このアクションを使用し以下の項目を設定すると組織（チーム）管理の関数を実行することができる：

| 項目名 | 説明 |
|:-----------|:------------|
| ブックの場所       | 関数による操作対象になるExcelファイルの保管されているSharePointサイト        |
| ブックライブラリ     | 上記サイト内で、関数による操作対象になるExcelファイルの保管されているのドキュメントライブラリ      |
| ブック       | 上記ライブラリ内で、関数による操作対象になるExcelファイルの保管されているパス        |
| スクリプトの場所         | 関数の保管されているSharePointサイト          |
| スクリプトライブラリ       | 上記サイト内で、関数の保管されているドキュメントライブラリ       | 
| スクリプト    | 上記ライブラリ内で、関数の保管されているパス     |