OmniAICreator/Qiita-1.07M huggingface dataset:
WindowsServer RDGWの接続ログ出力

## 前提

オンプレミスWindowsServerでRemoteDesktopGatewayServer(RDGW)を運用しています。
RDGWはインターネット側環境から専用LANを通った先の閉域網環境のDMZに配置されています。ユーザはインターネット側環境からWindows標準のリモートデスクトップ接続クライアントを使い、このRDGWで認証を行い、閉域網上の個人のマシンにRemoteDesktop接続を行います。


運用管理者としてはこのRDGWに接続してきたユーザのログの一覧というのが欲しくなると思います。しかし、WindowsServerのRDマネージャやイベントログビューアで閲覧していてはとても内容解析や統計処理ができません。またイマドキ個々のイベントのxmlを集めて、さらにそこからそれをどうこうするというのもちょっとやる気が起きず…

## 今回の内容：RD接続ログのCSV出力

そこで、RD接続してきて認証を試行したユーザのID、接続元のIP、接続日時といった情報をPowerShellでCSV出力するスクリプトを作成しました。以下のスクリプトを任意の場所で実行すればその場所にログCSVが出力されます。

```Powershell:connected_ip.ps1
$hostname = hostname
$timestamp = Get-Date -Format "yyyyMMdd"
$filename = $hostname + "_" + $timestamp +".csv"
Get-WinEvent -LogName "Microsoft-Windows-TerminalServices-Gateway/Operational" | Where-Object{ $_.Id -eq 302 } | ForEach-Object{
    $ipAddress = $_.Properties[1].Value
    $date = $_.TimeCreated
    $user = $_.Properties[0].Value
    [PSCustomObject]@{
        date = $date
        ip = $ipAddress
        user = $user
    }
} | Export-Csv -Path .\$filename -NoTypeInformation -Encoding UTF8
```

目的に応じてイベントログ名、フィルタするイベントIDやCSVに出力する情報は修正してください。

イベントIDは300は認証され接続が許可されたことを示し、302は単に接続が試行されたことを示すらしいです。また、303は切断時のログです。ただし、イベントIDによってプロパティの構造は異なるかもしれません（未確認）。

【実行結果例：WindowsServer2016で実行】

```rdgw_20240420.csv
"date","ip","user"
"2024/04/20 12:34:56","192.168.10.199","domain\tanaka"
"2024/04/20 12:46:57","192.168.10.234","domain\sato"
"2024/04/20 12:47:57","192.168.10.123","domain\yamada"
...
```
PHP 8.3の新規機能と改善

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527282/5ae7029c-df9c-56d9-12e6-29a8afbf4f57.png)



# この記事について


PHPは、毎年新しいメジャーまたはマイナーバージョンのリリースを続け、2023年11月23日に新たにPHP8.3がリリースされました。この新バージョンは、多くの新機能と改善を加え、PHPの汎用性と進化する言語としての地位をさらに固めています。

この記事では、PHP8.3に導入された注目すべき新機能を紹介します。

# 新機能

### クラス定数の型付け
クラス定数に型をかけるようになりました。

```php

// valid 
class TestClass {
    const string MY_TEXT = 'my text';
}

// valid 
interface TestInterface {
    const string MY_TEXT = 'my text';
}

// valid 
trait TestTrait {
    const string MY_TEXT = 'my text';
}

// valid 
enum TestEnum {
    const string MY_TEXT = 'my text';
}
```

```php 
// invalid 
// この初期宣言では型と値が一致しません。
class TestClass {
    const string MY_TEXT = 123;
}
```


```php
class TestClass {
    const string VERSION = "PHP 8.2";
}

class MyTestClass extends TestClass {

    // valid
    // ここでVERSIONの値を変更しても問題ありません。
    const string VERSION = "PHP 8.3";

    // invalid
    // 親クラスで指定された場合は型を宣言する必要があります。
    const VERSION = "PHP 8.3";

    // invalid
    // この場合、親クラスで宣言された型を変更することはできません。
    // 新しい型とその値が互換性がある場合でもです。
    const float VERSION = 8.3;
}
```

## json_validate関数

PHP8.3は、新しい関数json_validate()を導入しています。この関数は、JSONデータが構文的に正しいかどうかを確認するため、それを配列やオブジェクトに変換する必要がなく、以前このプロセスで使用されていたメモリを節約します。

```php

// PHP <= v8.2.0

$maybeJSON = '';

$obj = json_decode($maybeJSON);

if (json_last_error() === JSON_ERROR_NONE) {
    // Probably do something with $obj   
}

// PHP >= v8.3.0
var_dump(json_validate('{ "test": "test" }')); // true
var_dump(json_validate('{ "test": "test }')); // false

```


## クラス定数の動的なアクセスができる

PHP

PHP8.3からは、クラスから定数を動的にアクセスすることができるようになりました。

```php

class Framework {
    const NAME = 'Laravel';
}

$name = 'NAME';

// PHP <= v8.2.0で構文エラー
echo Framework::{$name}; // Laravel

```

---

こちらの新機能について詳しく知るために、PHP8.3の前後の例が載っている[PHP8.3リリースアナウンスメント](https://www.php.net/releases/8.3/ja.php "PHP8.3リリースアナウンスメント")ページをチェックしてください。また、廃止予定の機能や後方互換性の破壊も確認してください。

---

本記事についてのご感想をお聞かせください。読者の皆様の意見を反映させて、今度の内容改善につなげたいと考えております。
Neovim用のLatex環境を整えてみた

# はじめに
神エディタneovim（初心者です）で，texプラグインを使ってレポートを執筆するための環境構築を行ったので，まとめておきます．

# 筆者の開発環境
* M3macbookair(13-inch)
* homebrewインストール済み
* nvimはinit.luaで管理

# latexmkのセットアップ
まずは，texの面倒なコンパイルをコマンド一発で行ってくれるという便利ツールlatexmkを設定していきます．vimでtexを動かすプラグインはlatexmkが裏で動くので必須です．
そもそもtex環境入ってないって場合は以下のコマンドでインストールしましょう．
```shell
brew install mactex
```
GUIはいらねーって人は下記のコマンドでインストールしてください
```shell
brew install mactex-no-gui
```
パスを通してあげます（gui版はインストール時にやってくれてたかも？）
2024の部分は変わってきます．
```shell
export PATH=$PATH:/usr/local/texlive/2024/bin/universal-darwin
```
mactexにはlatexmkも入っているので，あとは設定ファイル書くだけで使えちゃいます．
```shell
nvim ~/.latexmkrc
```
で設定ファイルを開いて，以下の内容を記述します
```sh:~/.latexmkrc
#!/usr/bin/perl
$latex = 'platex -guess-input-enc -src-specials -interaction=nonstopmode -synctex=1';
$latex_silent = 'platex -interaction=batchmode';
$dvips = 'dvips';
$bibtex = 'pbibtex';
$makeindex = 'mendex -r -c -s jind.ist';
$dvi_previewer = 'start dviout'; # -pv option
$dvipdf = 'dvipdfmx %O -o %D %S';
if ($^O eq 'darwin') {
    #$pdf_previewer = 'open -a Preview %S';   #プレビュー使うならこっち
    $pdf_previewer = 'open -a Skim';          #skimはこっち
} elsif ($^O eq 'linux') {
    $pdf_previewer = 'evince';
}
$preview_continuous_mode = 1;
$pdf_mode = 3;
$pdf_update_method = 4;
```
これだけで
```shell
latexmk *.tex
```
とコマンドを打つだけでpdfの生成までやってくれます．
オプションもありますが，今回はコマンドを使うことが目的ではないので割愛します．

# vimtexのセットアップ
ここからはvim/nvimにtexの便利機能を与えてくれるvimtexプラグインをインストールしていきます．僕の場合はlazy.nvimでプラグインを管理しているので，nvim/lua/plugins下にvimtex.luaを作成し，
```lua:vimtex.lua
return {
    "lervag/vimtex",
    lazy = false,
    tag = "v2.15",
    init = function()
        vim.g.vimtex_view_method = 'skim'
    end
}
```
と記述します．
僕の環境では最新版はうまく動いてくれなかったので，以前のv2.15を指定しています．
初めなぜか動かないってなったので注意
また僕はビューアーにはskimを指定していますが，プレビューなどを使用している人は変更しておいてください．
あとは，nvimを再起動すればインストールが始まるので最低限の機能が使える用になります．

nvimでtexファイルを開き，ノーマルモードで
```
<localleader>ll
```
と入力しましょう．（デフォルトでlocalleaderは\なので，キーマップ設定してない場合は\llです）
すると，自動的にコンパイルが行われるとともに，ビューアーが開いてpdfが表示されるはずです．コードを編集した場合:wで保存すると勝手に再コンパイルされますが，これが嫌な人は設定で変えれます．

（skimの場合，skim→設定→同期から，ファイルの変更をチェックと自動的にリロードするを選択しておくことで，編集したら自動でコンパイルして表示の更新までできちゃいます．）

# おわり
vimだけでpcの作業をできるだけ完結したいと思っていたので，またひとつvimでできることが増えて嬉しいです．またこの記事が誰かの一助になれば幸いです．

## 参考
* https://qiita.com/tdrk/items/16f31e45826c57bce412 (2024年4月24日確認済み)
WordPressサイトをWOVNというSaaSで他言語化してみた感想

 # 概要
WordPressサイトをWOVNというSaasのサービスで他言語化してみたので、その感想を書きます。

https://wovn.io/ja/

# WOVNの仕組み

### サイトに翻訳文を表示する仕組み
[公式ドキュメント](https://support.wovn.io/hc/ja/sections/360007819411-WOVN-io%E3%81%AE%E5%8B%95%E4%BD%9C%E6%A6%82%E8%A6%81)に書かれていることを自分なりに解釈すると

WOVNの方式には
・スクリプト
・ライブラリ
・プロキシ
の３つがあるが、基本的には下図のように
1. 自サイトにブラウザからアクセスが行く
1. 翻訳文をWOVNサーバにリクエストする
1. 翻訳文がWOVNサーバからレスポンスされる
1. HTML上の文字列を翻訳文に差し替える
1. 翻訳したHTMLをブラウザに返す

といった流れになる

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813353/9098e30c-d5ad-117a-fb80-e57c3f2bf356.jpeg">

このうち2~4はWOVN側のスクリプトで自動的に実行される
この2~4の「翻訳文のリクエスト〜差し替え処理」がどの場所で実施されるかが各方式によって異なる

自分の理解だと下記
- スクリプト ：　ブラウザ上で実施
- ライブラリ ：　自サイトのサーバ側で実施
- プロキシ ：　WOVN側のサーバで実施

### WOVNが翻訳文を取得する流れ（想定）
WOVNがサイトから翻訳対象のテキストを取得する流れは以下だと思う
※ 公式ドキュメントにこのあたりの仕組みが書いてなかったので想定で書いてます。
1. 自サイトに埋め込んだWOVNのスクリプトがHTMLから翻訳対象のテキストを抽出・収集
1. 抽出されたテキストをWOVNの管理画面から任意の言語に翻訳
1. 翻訳結果はWOVNのサーバ・CDNに配置され以後のサイト翻訳に利用される

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813353/316053ae-9ac1-5f55-72c4-57fda630d168.png">




# 良いところ
以下はWOVNを導入して「良いな」と思ったところ

### 導入が簡単
WPサイトだと導入は簡単、公式が配布しているプラグインを入れるだけ

https://support.wovn.io/hc/ja/articles/360007899191

### ドキュメントが日本語対応
WOVNのドキュメントは日本語で書かれているので、導入やシステム概要の理解にあたって躓くことが無かった
※ 英語の読めない自分にはありがたい

https://support.wovn.io/hc/ja



### 翻訳がUIが直感的
管理画面から翻訳文を流し込むにあたって
「ライブ編集」という機能が使いやすかった

イメージだと自サイト上のテキストをリアルタイムで翻訳していく感じ
自分が今”どこ”のテキストを翻訳しているのか分かりやすかった

https://support.wovn.io/hc/ja/articles/12814848163609



# 注意すべきところ

当然といえば当然だがWOVNは**動的要素が翻訳されない**

なのでWOVNが翻訳対象として収集するのは基本的に**HTMLタグに設定されている静的なテキスト**になる
たとえば下記は翻訳対象になる
``` html
<title>タイトル</title>
<p>本文</p>
<a href="hoge.jp">リンクテキスト<a>
```

逆に翻訳対象にならないのは**動的要素全般**
例えば下記は翻訳対象外になる
- javascript等でページ表示後にHTMLに埋め込んだテキスト
- `<script>`タグに囲まれたスクリプト内の文字列全般

[参考](https://support.wovn.io/hc/ja/articles/360007910811-%E5%8B%95%E7%9A%84%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%81%A8%E3%81%AF)

## 動的要素への対応方法
動的に変わるテキストを翻訳するための手法が、いくつか用意されている

### ダイナミックバリュー
ダイナミックバリューという機能がある
これは、前述の[ライブ編集](https://support.wovn.io/hc/ja/articles/12814848163609
)機能を使えば、静的テキストと同じ要領で動的テキストを編集できるというもの


ただ、自分で使った限りではあまり効果を実感できずで
翻訳したはずのテキストが元に戻っているなどの事象がよくあった

https://support.wovn.io/hc/ja/articles/8406150266265


### API
WOVNはいくつかのAPIを提供している

APIの中には「指定テキストの翻訳文をWOVNサーバから取得する」ものもあり
この機能を使えばJavascriptの中でも翻訳文を取得し表示に用いることができる様子
``` javascript
// 例
WOVN.io.translateTexts('en', 'ja', ['good afternoon', 'good night'])
{'good afternoon': 'こんにちは', 'good night': 'おやすみ'}
```

ただし一度翻訳文をWOVN管理画面から投入しないといけないようで、それが面倒かも


https://support.wovn.io/hc/ja/articles/360007718372-Widget-API-WOVN-io-Javascript

### HTML内に非表示のテキストを埋める
WOVNは非表示のテキストも取得対象になっている
乱暴だがHTMLに非表示で要素を埋め込んで、それを後からscriptで参照する方法も可能

``` html
# 例

<style>
#b {
    display: none;
}
</style>

<p id="a" hidden>非表示テキストA</p>
<p id="b" >非表示テキストB</p>

<script>
var a = document.getElementById('a').textContent;
var b = document.getElementById('b').textContent;
</script>
```

# 感想
総じて良いサービスだと思う
特にWordpressサイトを簡単に多言語化できるのはすごい

ただやっぱり動的な機能が絡んでくると、途端に実装が面倒になったり、翻訳されないケースが発生する。

また、翻訳されないテキストが発生してもエラーが表示されないので
原因の調査が難しく、都度サポートに問い合わせる事になるのも、もどかしい所だった
(Windowsユーザー用メモ)gitでPlease make sure you have the correct access rights and the repository exists. が出た時の対処法

# 記事の内容
[この記事](https://qiita.com/GakuNaitou/items/81dbbd3ea6211af71648)がLinux用に書かれた記事だったため，Windowsユーザー用にメモを残しておく．詳しい内容は上記記事を確認してください！

# エラー内容

```
Bad owner or permissions on ~/.ssh/config
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

# 解決方法

### 具体的な手順

➀ sshKeyの再発行
➁ githubに公開鍵を登録
➂ 使用する秘密鍵をconfigファイルに設定

### ➀ sshKeyの再発行

sshKeyを作成する。 (hoge以降はgithubに登録しているメアド)
```
$ ssh-keygen -t rsa -C hoge@example.com
```

以下の３つが聞かれるが「すべてEnter」でOK
```
Enter file in which to save the key (~/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter passphrase (empty for no passphrase):
```

sshKeyが発行されたか確認
```
$ dir ~/.ssh
```

以下の２つが表示されればOK

```
id_rsa
id_rsa.pub
```

#### ➁githubに公開鍵を登録

##### Githubにログインして、右上の自分のアイコンをクリック, Settings > SSH and GPG keys > New SSH keys をクリックします。
Titleの欄に何に使う為なのか、わかるように名前をつけてあげます。(会社用Macbookとか、AWS cloud9 とか)

★公開鍵をコピー

以下のコマンドを実行して公開鍵を表示

```
$ Get-Content ~/.ssh/id_rsa.pub
```
上記で以下のようなエラーが出たら．．．

```
get-content' is not recognized as an internal or external command, operable program or batch file.
```
以下を実行．
```
$ type ~/.ssh/id_rsa.pub
```

以下のように公開鍵が表示される

```
ssh-rsa hogehogehogehoge...~~略~~...hogehoge  mail@example.com
```

「ssh-rsa」~「mailの前まで」をコピー
→ Githubに戻り、Keyの部分にコピーした内容をペーストして、Add SSH Keyをクリックすれば、Githubに公開鍵を登録できます。

#### ➂使用する秘密鍵をconfigファイルに設定

まずconfigファイルを開く．
以下は，メモ帳を使って開く．
```
$ notepad.exe ~/.ssh/config
```

vscodeがインストール済みなら以下
```
$ code ~/.ssh/config
```

configファイル開いたら，以下をコピー＆ペースト
```
Host github
  HostName github.com
  IdentityFile ~/.ssh/id_rsa
  User git
```

完了！

# 参考文献
・[gitでPlease make sure you have the correct access rights and the repository exists. が出た時の対処法](https://qiita.com/GakuNaitou/items/81dbbd3ea6211af71648)
StableDiffusionWebUIで一定時間後にランタイム接続解除して無駄にリソースを消費しない方法

すっごく久々の記事になります。

GoogleColaboでStable Diffusion Web UIを利用していて、ランタイム接続を解除し忘れたり、寝てしまってずっと接続してた、なんてことありませんか？
その間もリソースが消費され、お金がもったいない。

ってことで、下記のコードを入れることで回避してます。

```

割愛

# ここから
# ====================================================================================================
import threading
import time
from google.colab import runtime

def cut_connect():
  # 一定時間後に切断
  time.sleep(3600 * 2)
  runtime.unassign()

thread_cut_connect = threading.Thread(target=cut_connect)
thread_cut_connect.start()
# ====================================================================================================
# ここまで

割愛

try:
  model
  if os.path.isfile(model):
    !python /content/gdrive/$mainpth/sd/stable-diffusion-w$blsaphemy/webui.py $share --api --disable-safe-unpickle --enable-insecure-extension-access --no-download-sd-model --no-half-vae  --ckpt "$model" --xformers $auth --disable-console-progressbars --skip-version-check $ckptdir
  else:
    !python /content/gdrive/$mainpth/sd/stable-diffusion-w$blsaphemy/webui.py $share --api --disable-safe-unpickle --enable-insecure-extension-access --no-download-sd-model --no-half-vae  --ckpt-dir "$model" --xformers $auth --disable-console-progressbars --skip-version-check
except:
   !python /content/gdrive/$mainpth/sd/stable-diffusion-w$blsaphemy/webui.py $share --api --disable-safe-unpickle --enable-insecure-extension-access --no-download-sd-model --no-half-vae --xformers $auth --disable-console-progressbars --skip-version-check $ckptdir

```

上記は2時間後にランタイム接続が解除されるコードになります。
ホント、なんてことないんですが、誰かのお役に立てれば。

Stable Diffusion Web UIでスクリプトなんか組んで放置する、みたいな使い方をしていると、ついついリソースを無駄に消費してしまいますよね。
【Docker Compose】MariaDBでmy.cnfを使ってクエリキャッシュを設定する方法

## はじめに
備忘録
タイトルの通りです。
どなたかのお役に立てれば幸いです。

## 解決方法
ファイル構造は以下とします。
```
root/
  ├─ db/
  │   ├─ conf.d/
  │   │     └─ my.cnf
  │   │
  │   ├─ data/
  │   └─ Dockerfile
  │
  └─ docker-compose.yml
```

また、`my.cnf`は以下のようになっています。

```:my.cnf
[mariadb]
query_cache_limit=1M
query_cache_size=32M
query_cache_type=1
```

:::note warn
Docker Hubの、MariaDBのページ（[こちら](https://hub.docker.com/_/mariadb)）にも書いてある通り、`.cnf`の最初に`[mariadb]`をつけないと、設定が正しく反映されません。

> Custom configuration files should end in .cnf and be mounted read only at the directory /etc/mysql/conf.d. These files should contain the minimal changes from the MariaDB workload required for your application/environment. A MariaDB configuration file will have a [mariadb] group followed by variable = value settings per Setting Server System Variables or option-prefix-variable.
:::

`docker-compose.yml`の`volumes`の部分に、`- ./db/conf.d:/etc/mysql/conf.d`を追加して、`conf.d/`をマウントします。

```yaml:docker-compose.yml
services:
  db:
    build: ./db
    ports:
      - 3306:3306
    volumes:
      - ./db/data:/var/lib/mysql
      - ./db/conf.d:/etc/mysql/conf.d
```

コンテナを立ち上げて、ちゃんとマウントできているか確認します。

```console
$ docker compose up -d --build
[+] Building ...
︙

$ docker ps
CONTAINER ID   IMAGE     COMMAND     CREATED         STATUS         PORTS   NAMES
1e467bc1155b   db        "cron -f"   30 minutes ago   Up 30 minutes          db-1

$ docker container exec -it db-1 bash
root@1e467bc1155b:/#
root@1e467bc1155b:/# cd /etc/mysql/conf.d
root@1e467bc1155b:/etc/mysql/conf.d# pwd
/etc/mysql/conf.d
root@1e467bc1155b:/etc/mysql/conf.d# ls
my.cnf
```

MariaDBに入ってクエリキャッシュの設定を確認してみます。

```console
root@1e467bc1155b:/# mysql -h localhost -P 3306 -u username -p
Enter password:

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 11
Server version: 10.8.2-MariaDB-1:10.8.2+maria~focal mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
```

`SHOW VARIABLES LIKE '%query_cache%';`でクエリキャッシュの設定を表示してみます。

```shell
MariaDB [(none)]> SHOW VARIABLES LIKE '%query_cache%';
+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| have_query_cache             | YES      |
| query_cache_limit            | 1048576  |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 33554432 |
| query_cache_strip_comments   | OFF      |
| query_cache_type             | ON       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+
7 rows in set (0.002 sec)
```

`query_cache_type`が`ON`となっている（クエリキャッシュが起動している）ことを確認できました。
CpawCTF Q20.[Crypto]Block Cipher

# CpawCTF Q20.[Crypto]Block Cipher
問題から以下を読み込みます。読みやすいように一部書き換えました。
```c++:problem.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[]) {
	int i;
	int j;
	int key = atoi(argv[2]); //文字列を整数に変換
	const char* flag = argv[1]; //文字列
	printf("cpaw{");
	for (i = key - 1; i <= strlen(flag); i += key) {  //keyの値だけ文字列をスキップしながら文字列をループ
		for (j = i; j >= i - key + 1; j--) { //keyの値だけ戻りながら文字列を逆順にループ
			printf("%c", flag[j]);
		}
	}
	printf("}");
	return 0;
}
```
開発者用コマンドプロンプトでcrypto.cのあるディレクトリがあるフォルダに移動して
```terminal:comand.tr
$cl
使い方: cl [オプション...] ファイル名... [ /link リンク オプション...] //これが出てきたらあっています
$crypto ruoYced_ehpigniriks_i_llrg_stae 4 
//argv[1]:ruoYced_ehpigniriks_i_llrg_stae, argv[2]:4
cpaw{Your_deciphering_skill_is_graeat}
```
答えがわかりました。
【VBScript】ユーザーフォーム起動

Const FILE_NAME = "C:\Users\wm350\OneDrive\デスクトップ\まとめ.xlsm"
Const PROC_NAME = "メニュー表示"
Dim app
Set app = CreateObject("Excel.Application")

With app
     'Excel非表示
     .Visible = False
     Dim wb
     Set wb = .Workbooks.Open(FILE_NAME)
     .Run wb.Name & "!" & PROC_NAME
     'アラートを消す
     .DisplayAlerts = False
     wb.Save
     wb.Close

End With

app.Quit
AZ-900:AzureFandamentalsを1週間で合格する


自身の体験に基づくAZ-900試験を1週間でクリアするための方法について説明いたします。

この試験を受けようと思ったきっかけは、Azureを使ったプロジェクトに参加することになり、お客様とスムーズにコミュニケーションを取るためには、Azureの基本をしっかりと理解しておく必要があると感じたからです。

例えば、ストレージの話題では、ログをBlobストレージにアーカイブしたり、ファイル共有を利用したりすることがあります。これはAWSのS3のようなものだろうと軽く見ていたら、話をしていくうちにつじつまが合わなくなることに気づき、各サービスの詳細に精通していなければ、認識あわせが難しいなと思いました。

でもいざ勉強と思っても、ただ単にAzureの基礎から学ぶことに魅力を感じませんでした。ですので一旦AZ-900取得（奨励金も...）を目標に設定し、短期間で効率的に学べる方法を選びました。

結果は889で合格。試験では学習し忘れていたAzureサービスの問題があったので、もう少し勉強していれば点数をとれることができたかと思います。

<h2>想定読者</h2>
仕事で忙しく時間が限られる中でも、短期で確実にAZ-900をとりたい方


<h2>試験勉強期間の目安</h2>
1日あたり1~2時間程度（仕事終わり想定）として
期間は7日程度あれば十分かと思います。
連続して学習できない状況であれば２～３週間ぐらいでしょうか。

<h2>試験勉強のディバイス</h2>
Udemyの最新アプリがインストールできるタブレットかスマートフォンを使用します。
画面サイズが大きめのタブレットがおすすめです。
私は11インチの画面サイズのタブレットを利用し、模擬テストの設問がほぼスクロール無しでみれたので良かったです。

Udemyアプリが古いバージョンですと、模擬テストタイプの講座が実施できないので注意しましょう。

<h2>学習リソースの選定</h2>
Microsoft LearnのAzure基礎コースを進めて把握していきましょう。
特に図や表になっている箇所はよく出ますので暗記する気力があれば覚えてしまいましょう。

https://learn.microsoft.com/ja-jp/credentials/certifications/azure-fundamentals/?practice-assessment-type=certification

また、こちらの記事がAzure基礎の全体を把握するのに役立ちました。

https://qiita.com/takaki-imura/items/5aa1892cbb92e0dc6856

上記2点を一通り読み込めば十分かと思いますが、
書籍のほうが良いといった方はこちらが良いかと思います。
Microsoft認定資格試験テキスト AZ-900: Microsoft Azure Fundamentals
ただ、Azureのサービス内容や名称はよく変わりますので、最新版の書籍を選択するよう注意しましょう。

<h2>問題演習を繰り返す</h2>
基礎を一通り学習したら、以下のUdemyの問題集を解いていきます。

https://www.udemy.com/course/microsoft-azure-az900-exam/

Udemyのバーゲンの時期に合わせて購入するとよいでしょう。

初回は半分ほど解ければよいかと思います。
ダメだったところの解説を読んで把握した上、また模擬テストを受けます。

点数は90点以上取れるようになればOKです。
理想は100点です。

注意点は1日で模擬テストをやりこまないことです。
別日でも、点数が90点以上とれることが大事です。（ほんと、すぐに忘れてしまいますね）

<h2>Azureサービスの理解を深める</h2>
テストでいまいち理解できないことや、何度も間違えるところを中心に、
Microsoft Learnの解説や実際公開されているサービスのページにアクセスし機能概要を確認していきましょう。

<h2>試験対策のポイント</h2>
ここまできたら試験準備OKです。

まずは試験範囲、試験内容、配点割合を確認しましょう。

https://learn.microsoft.com/ja-jp/credentials/certifications/resources/study-guides/az-900

ここら辺のサービスは紛らわしいので概要をよく把握するとよいです。
Microsoft Purview
Azure Policy
Azure Arc
Azure Advisor
Azure Service Health


試験時間は45分で、問題数は約35問前後です。
模擬テストで慣れていれば全問解くのに15分もかからないと思います。
余裕があれば2週し、回答ミスがないか確認しましょう。

また、オンライン受験を選択する場合は環境が整っているか確認したほうがよいです。
wifiはお勧めしません。途中で切れると試験が中断されてしまうからです。
私はwifiで試験しましたが、試験開始後、回線が切れるのではないかという不安が残り、完全集中できませんでした。
ですので、有線接続をするようにしましょう。
あと試験を行うテーブルの上に何かものがあると試験監督者から指摘がありますので、何も置かないようにしましょう。
引き出しがあるテーブルも要注意です。物があると、取り除くよう指示があります。
私は文房具類が大量にあったので、直前に慌てて対応することになりました...


<h2>さいごに</h2>
AzureFandamentalsを1週間で合格する方法について説明させていただきました。

この記事をみてAZ-900に合格し、Azure関連業務に活かすことができれば幸いです。
DataSpider⇒Salesforce接続方法(OAuth接続)

# はじめに
はじめまして。Dai2です。
ジールでエンジニアを初めてやっと1年になります。

知識ゼロでDataSpiderを触り始めた私がどこかにあったらよかったなーと思ったものについて書いていければと思います。


# DataSpiderとは
ノンプログラミングで多様なシステム間のデータ連携が行えるETLツールです。
DataSpiderの標準機能として様々なシステムに対して固有のアダプタが備わっているため、容易に連携設定が可能となっているのが特徴です。

https://www.hulft.com/software/dataspider


# DataSpiderのSalesforce接続設定について
DataSpiderには標準でSalesforce接続設定が備わっています。
その中でSalesforce接続方法は2種類あります。
* ユーザーID、パスワードを利用した接続方法
* __OAuthを使用した接続方法__

今記事では2.OAuth接続方法について解説します。

### ※OAuthとは
個別にユーザーID、パスワードを入力するところを、**APIを利用してユーザー認証を行う仕組み**のことをOAuthと言います。

https://www.tdk.com/ja/tech-mag/knowledge/147


# 利用環境
* DataSpider Servista 4.4 クライアント,サーバー
* Windows Server 2019 Standard 1809バージョン
* 利用環境インストール済み想定で解説します。


# 接続設定方法
１. コントロールパネル＞グローバルリソースの設定から、新しいグローバルリソースを作成＞クラウド＞Salesforceを選んで次に進みます。
![qiita1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528751/0deee147-8db4-437e-cadf-64bc5418c2d7.png)

２, 必須設定タブ下の方に記載がある「OAuthを使用して接続する」にチェックを入れると、画像の通り表示が変わってOAuth接続先情報を入力できる形になります。
![qiita3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528751/511ee005-9dcc-919a-236e-505a21ee0d5a.png)

３. 2.画像の「認証URL」部分にURLが発行されるため、そのURLにブラウザでアクセスします。

４. 認証URLにアクセスすると、画像の通りSalesforceログイン画面が表示されるのでログインを行います。
(Salesforceを利用しているブラウザでは自動ログインするのでログイン不要です。)
![qiita4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528751/b4c01459-2678-e46e-a8a4-be62ac70ad53.png)

５. 「Salesforce Adapter OAuth」から、アクセス許可を聞かれるため許可します。

６. 画像の通り「Remote Access Application Authorization」と表示されたら、そのページのURLの中に、接続するために必要なリフレッシュトークンが記載されているので抜き出してコピーします。
![qiita6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528751/526e5a3b-ef22-40c1-d693-c2c97321316f.png)

ページURL👇
``https://login.salesforce.com/services/oauth2/success#access_token=~~&refresh_token=<<ここに記述されたものをコピー>>&instance_url=~~&issued_at=~~&signature=~~&scope=~~&token_type=~~``

７. DataSpider画面の「Refresh Token」にコピーしたトークンを添付して、接続テストが成功したら接続設定完了になります。
![qiita8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528751/88c7255b-88c0-1b60-2fbb-728a035769ec.png)


# まとめ
今記事では、DataSpiderでのSalesforce接続設定方法(OAuth接続)について解説しました。
接続設定される際はこの記事を参考いただければ幸いです。


# ご紹介
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area
CodeDeployでつまづいた件

# はじめに
Code PipelineからEC2にCodeDeployする際に、想定以上に手を取られました
起こった事象と対応方法をShareします

# 事象と対策
## EC2のデプロイが途中で止まる
CodeBuildの設定をCodeBuild内のエディタで1行
> go build -o xxxx main.go

としていると、CodeDeployが途中で止まり、5分でタイムアウトになりエラーとなります
その際のメッセージが、S3にアーティファクトを取りに行ったけど「S3へのアクセス権限がない」というものです
RoleやPolicyを確認しますが、特に不味そうなところはなく...

手を抜かずに、buildspec.ymlを作成し、そのArtifactsにビルド後のファイル名(xxxx)を記載したところ、解決しました

## EC2にデプロイできない
デプロイ先に同名のファイルがあるとダメなようです
BeforInstallに、デプロイ先のファイルを削除するshellファイルを指定すれば大丈夫でした


## appspec.ymlがないと怒られる
これは単純にCodeBuildのArtifactsに、appspec.ymlがないだけでした


参考までに、今回使ったbuildspec.ymlとappspec.ymlを載せておきます
（1部改変しています)

```buildspec.yml
version: 0.2

phases:
  install:
    runtime-versions:
      golang: 1.21
  build:
    commands:
      - go build -o xxxx main.go
artifacts:
  files:
    - xxxx
    - appspec.yml
    - hooks/rm_xxxx.sh
```


```appspec.yml
version: 0.0
os: linux
files:
  - source: /xxxx
    destination: /home/ec2-user/bin

hooks:
  BeforeInstall:
    - location: hooks/rm_xxxx.sh
      timeout: 5
```

以上、同じエラーで困っている方の参考になれば嬉しいです
SPSS Modelerによる非線形回帰分析

# はじめに
SPSS Modelerには非線形回帰の機能はないのですが、4次元の多項式の非線形回帰を行ってみました。


■テスト環境
* Modeler 18.5
* Windows 11 64bit

# データの入力
テストデータを読み込みます。
以下のようにxとyのデータが読み込めました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f5a39e74-04f6-919d-3fcc-848c33d18b89.png)

# データの可視化
「散布図」ノードで、変数「x」をｘ軸に、変数「y」をy軸に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e7864df0-d9c3-da16-ac29-1e72d7dd5fcf.png)


以下のようなデータです。4次関数が想像されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e6b75268-fb55-77cf-a3ad-6da08f86f92c.png)

# 説明変数の作成


以下のような4次関数の多項式を想定します。
```math
\alpha+\beta1x+\beta2x^{2}+\beta3x^{3}+\beta4x^{4}
```
以下は「フィールド作成」ノードで作ってしまいます。
```math
x^{2}, x^{3}, x^{4}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/1f7a17d3-56b4-f419-9975-ad846e93d423.png)

# 回帰分析
非線形回帰がないので、「線形回帰」ノードで代用してみます。
「エキスパート」タブでモードを「[エキスパート](https://www.ibm.com/docs/ja/spss-modeler/18.5.0?topic=SS3RA7_18.5.0/modeler_mainhelp_client_ddita/clementine/regression_experttab.htm)」にします。
すべて「x」から派生していて、独立性がない説明変数を使うので、特異性許容範囲「1.0E-12」を選んで強制投入させます。
やはり、すべて「x」から派生しているので多重共線性が強く出るはずです。「出力」ボタンをいれて「共線性の診断」を入れておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f4a28ef3-9a11-c7ad-23ea-d4e96d0db65e.png)

モデルナゲットを開いて「詳細」タブを開きます。
「R2乗」を見ると「0.972」ですのでかなり当てはまりがよい結果でした。
「係数B」をみると各パラメーターの推定値がでています。
「VIF」は10以上で多重共線性を疑うのがセオリーですが、予想通り、非常に大きな値が出ていますので、不安定なモデルにはなってしまっている可能性が高いとは言えます。
ただ実は、[Statisticsの非線形回帰機能で行った結果](https://qiita.com/kawada2017/items/975b12edbb5850d9f491#%E9%9D%9E%E7%B7%9A%E5%BD%A2%E5%9B%9E%E5%B8%B0%E5%88%86%E6%9E%90)と全く同じでしたので、今回は妥当なモデルができていると思われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7b2d92e5-ee4f-f12d-dc67-7aa51c36f4fb.png)

# 結果の可視化
「線グラフ」ノードで変数「x」をｘフィールドに、変数「y」と予測値「$E-y」をyフィールドに設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/18d5f2e9-ac41-6029-80ba-df698b4c161c.png)

確かによくフィットできているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/75373474-a8bd-80f0-af97-afdd5167f2ae.png)


# おわりに
独立性がない説明変数をつかっていますので、本来は線形回帰で解くべきではありませんが、参考にできることはあるかと思いました。

# サンプル
#### サンプルストリーム
https://github.com/hkwd/spsssample/raw/master/240424nonlinear/240424nonlinear.str

#### サンプルデータ
https://github.com/hkwd/spsssample/raw/master/240424nonlinear/4d.sav

# 参考
#### SPSS Statisticsによる非線形回帰分析
https://qiita.com/kawada2017/items/975b12edbb5850d9f491

#### 【機械学習入門】実験データの解析に役立つ非線形回帰分析を利用してみよう
https://qiita.com/kwi0303/items/283eea5211f9ca4c2a05

こちらの記事で作成されていたデータを流用させていただきました。
Tiltでカスタムライブラリを作成する: ステップバイステップガイド

Tiltでは開発者が自分のニーズに合わせてカスタマイズされたライブラリを作成できます。この投稿では、TiltでHello World的なことをするシンプルなライブラリを作成するプロセスを順を追って説明します。このガイドを最後まで読めば、自分でカスタムライブラリを設定し、Tiltプロジェクトで使用する方法をしっかりと理解できるでしょう。

ステップ1: ディレクトリを設定する
=============================

まず、ライブラリを置くための新しいディレクトリを作成します。この例では、"tilt-extensions/hello-world"とします。

```bash
mkdir tilt-extensions/hello-world
```

ステップ2: Tiltfileを作成する
============================

次に、新しく作成したディレクトリ内にTiltfileを作成します。

```bash
touch tilt-extensions/hello-world/Tiltfile
```

このファイルにカスタムライブラリのコードを書いていきます。

ステップ3: 関数を実装する
===============================

Tiltfileを開き、以下のコードを追加します。

```python:Tiltfile
def say_hello(name):
  print("Hello %s!" % name)

say_hello("alice")
```

この簡単な関数は、名前を入力として受け取り、コンソールに挨拶メッセージを表示します。

ステップ4: ライブラリを実行する
========================

ライブラリを実行するには、以下のコマンドを使用します。

```bash
tilt ci --file tilt-extensions/hello-world/Tiltfile
```



💡 **ヒント**

別のTiltプロセスがすでに実行中であるというエラーが発生した場合は、`--port`オプションを使用して別のポートを指定できます。

```bash
tilt ci --file tilt-extensions/hello-world/Tiltfile --port 0
```

実行が成功すると、以下のような出力が表示されるはずです。

```
Tilt started (without browser UI) 
v0.33.12, built 2024-03-29

Initial Build
Loading Tiltfile at: /Volumes/x/appthrust/appthrust/tools/tilt/tilt-extensions/hello-world/Tiltfile 
**Hello alice!**
Successfully loaded Tiltfile (409.125µs)
ERROR: No resources found. Check out <https://docs.tilt.dev/tutorial.html> to get started!
```

"Hello alice!"というメッセージは、関数が期待通りに動作していることを確認します。

ステップ5: 別のTiltfileでライブラリを使用する
==============================================

ライブラリをより汎用的にするために、テスト呼び出しをTiltfileから削除します。

```diff:Tiltfile
def say_hello(name):
  print("Hello %s!" % name)

-say_hello("alice") 
```

これで、ライブラリを別のTiltfileにロードして使用できます。まず、ライブラリをロードします。

```python:Tiltfile
load("./tilt-extensions/hello-world/Tiltfile", "say_hello")
```

次に、関数を呼び出します。

```python:Tiltfile
say_hello("alice")
```

おわり
==========

Tiltでライブラリを作成すると、決まった手順などを再利用可能にできたり、複雑なことを隠蔽することで、宣言的なTiltfileにしあげられたりとメリットがあります。このガイドで説明した手順に従えば、自分のライブラリを作成し、Tiltのプロジェクト全体で使用できるようなり、生産性を向上させるためのライブラリが開発できるようになるでしょう。
VMware上のUbuntu 22.04にROS2を入れてOpen-RMFデモを動かしてみた(ROS2導入編)

# 前回の記事
前回はUbuntu22.04までの準備をしました。  
[VMware上のUbuntu 22.04にROS2を入れてOpen-RMFデモを動かしてみた(準備編)](https://qiita.com/SeagullShingo/items/2f3029b30d747da00afa)

今回はROS2を導入したいと思います。

# 手順
1. ホストOS(Windows11)準備  
2. ゲストOS(Ubuntu 22.04(LTS))準備   
3. ROS2導入 **←今回はここの内容**
4. Open-RMF導入
5. デモ操作

思いのほか長くなりそうだったので、いくつかの記事に分割しています。

[VMware上のUbuntu 22.04にROS2を入れてOpen-RMFデモを動かしてみた(準備編)](https://qiita.com/SeagullShingo/items/2f3029b30d747da00afa)
[VMware上のUbuntu 22.04にROS2を入れてOpen-RMFデモを動かしてみた(ROS2導入編)](https://qiita.com/SeagullShingo/items/6e296a6f64c2bf9a56ea)
[VMware上のUbuntu 22.04にROS2を入れてOpen-RMFデモを動かしてみた(Open-RMF導入編)](https://qiita.com/SeagullShingo/items/59914f1a99acb0935f8a)
[VMware上のUbuntu 22.04にROS2を入れてOpen-RMFデモを動かしてみた(デモ操作①)](https://qiita.com/SeagullShingo/items/221d068ee872d0cd584a)

## 3.ROS2導入

公式を参考にROS2を導入していきます。  
https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html

### localeの確認

localeの設定が「UTF-8」じゃない場合、設定が必要です。


```
locale  # check for UTF-8

sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8

locale  # verify settings
```


### レポジトリ設定

Ubuntu Universeレポジトリの設定
```
sudo apt install software-properties-common
sudo add-apt-repository universe
```

ROS2 GPGキーの設定
```
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
```

レポジトリをソースのリストに追加
```
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
```

### ROS2導入
次にROS2の導入になります。

事前にパッケージの更新を行っておきます。  
```
sudo apt update && sudo apt upgrade
```

今回は「ros-humble-desktop」を導入します。
```
sudo apt install ros-humble-desktop
```

# sourceスクリプトの設定
毎回読み込まなくてもよいように.bashrcにsetup.bashを登録しておきます。
```
vi ~/.bashrc
下記を追加
source /opt/ros/humble/setup.bash
```

# 動作確認
ROS2が動作するかを確認します。  
2つのウインドウでそれぞれコマンドを実行してください。

ウインドウ1
```
source /opt/ros/humble/setup.bash
ros2 run demo_nodes_cpp talker
```

ウインドウ2
```
source /opt/ros/humble/setup.bash
ros2 run demo_nodes_py listener
```

下記のような形でpublishする側とlistenする側でHello Worldが表示されていればOKです。
![2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225931/eda50049-4725-ca54-703d-9bf35ae0e993.png)



# 便利ツールの導入
ROSはたくさんのコマンドウインドウを開くので「terminator」など導入しておくと便利です。
また、現時点でUbuntuとしての設定などはあまりしていない状態ですので、別途必要なツールやパッケージなどは必要に応じてインストールしてください。
```
sudo apt install terminator
```
アプリから「terminator」と検索して出てくればOKです。
![2-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225931/218c95dc-37f8-12ef-9c9b-7b0fcef75bff.jpeg)


←←[VMware上のUbuntu 22.04にROS2を入れてOpen-RMFデモを動かしてみた(準備編)](https://qiita.com/SeagullShingo/items/2f3029b30d747da00afa)

→→[VMware上のUbuntu 22.04にROS2を入れてOpen-RMFデモを動かしてみた(Open-RMF導入編)](https://qiita.com/SeagullShingo/items/59914f1a99acb0935f8a)
vCenter Server でVMにvTPMを追加する際の"一般的なランタイム エラーが発生しました。"エラーの解決

# 要約
VMにvTPMを追加するには、クラスタが必要だった。

# 状況
vSphare上のWindows 11のVMにTPMを設定したいと思い以下を実施
* 下記URL「vSphere 信頼機関 の設定」を参照

https://docs.vmware.com/jp/VMware-vSphere/8.0/vsphere-security/GUID-39D8AB34-AD45-4B0A-8FB0-7A1D16B25C9A.html

* しかしよくわからず、下記URLを参照を行い

https://ss-engineer.com/nkp-vtpm-windows11/

> Native Key Provider を設定
> Native Key Provider のバックアップを実施

（この時に、vCenter Server のホスト名がIPだったので、https://kb.vmware.com/s/article/84068 に該当し失敗、vCenter Server のホスト名変更）
* その後、VMにvTPMを追加するが、以下現象が発生

# 現象
vCenter Server でVMにvTPMを追加する際に「一般的なランタイム エラーが発生しました。」のエラーが発生
セキュリティデバイスとして、Trusted Platform Module を追加
![20240424A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354637/a69ec630-8df3-64c0-57b4-e4eb0bc65fac.png)
OKを押すと「操作に失敗しました。」エラー発生
![20240424B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354637/acfde7a1-cfc4-f3d8-618a-186ad409ce79.png)
> 操作に失敗しました。
> タスク名 仮想マシンの再設定
> ターゲット (マシン名)
> ステータス RuntimeFault.summary

タスク欄のエラー表示は
![20240424C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354637/a70c9367-7c9f-021c-80eb-60ff7824c7e2.png)
> ステータス 一般的なランタイムエラーが発生しました。
> キープロバイダ Native Key Provider はホスト と互換性がありません。理由:"ホストはクラスタ内にないため、Native Key Provider をサポートしていません。"

# 対処方法
* インベントリ = データセンター = ホスト の3段構成だったのを、インベントリ = データセンター = クラスタ = ホスト の4段構成に変更
* 新規クラスタを作成し、クイックスタートで「1. クラスタの基本」実施
* 「2. ホストの追加」で、既存ホストの追加を実施
* 再度VMにvTPMを追加
* 無事成功
SwiftUIであそぼ！〜 Flip Transition 〜

# 本記事について

毎日数分でも良いから、SwiftUIで遊びたいと思っていたところ、素晴らしいYouTubeチャンネルを見つけました。

https://www.youtube.com/@Kavsoft

このチャンネルは、SwiftUIを使った実装を多く取り上げており、新しい実装アイディアを得るのに最適です。

今回は、動画で解説されている実装を模写し、まとめたいと思います。


# 完成イメージ

カスタムしたTransitionのアニメーションを実装し、フリップできるViewを作成します。
こちらの動画を参考にしました！

https://www.youtube.com/watch?v=hwmDFxvUCRY

![demo_gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3368292/9539afac-0f18-e792-85b8-c74ad0b487fe.gif)


# 学べること

- ViewModifierの使い方
- Transitionのアニメーション

# 実装の解説

## 全体の実装

```swift
import SwiftUI

struct ContentView: View {
    @State private var showView: Bool = false

    var body: some View {
        VStack {
            ZStack {
                if showView {
                    RoundedRectangle(cornerRadius: 25)
                        .fill(.black.gradient)
                        .transition(.reverseFlip)
                } else {
                    RoundedRectangle(cornerRadius: 25)
                        .fill(.red.gradient)
                        .transition(.flip)
                }
            }
            .frame(width: 200, height: 300)
            
            Button(showView ? "Hide" : "Reveal") {
                withAnimation {
                    showView.toggle()
                }
            }
            .padding(.top, 30)
        }
    }
}

#Preview {
    ContentView()
}

struct FlipTransition: ViewModifier, Animatable {
    var progress: CGFloat = 0
    var animatableData: CGFloat {
        get { progress }
        set { progress = newValue }
    }

    func body(content: Content) -> some View {
        content
            .opacity(progress < 0 ? (-progress < 0.5 ? 1 : 0) : progress < 0.5 ? 1 : 0)
            .rotation3DEffect(
                .init(degrees: progress * 180),
                axis: (x: 0.0, y: 1.0, z: 0.0)
            )
    }
}

extension AnyTransition {
    static let flip: AnyTransition = .modifier(
        active: FlipTransition(progress: 1),
        identity: FlipTransition()
    )
    
    static let reverseFlip: AnyTransition = .modifier(
        active: FlipTransition(progress: -1),
        identity: FlipTransition()
    )
}

```

## ViewModifierについて

https://developer.apple.com/documentation/swiftui/viewmodifier

ViewModifierプロトコルによって、カスタムのmodifierを再利用できるようになります。

下記のような形でカスタムのModifierを作ることができます。

```swift
struct CustomModifier: ViewModifier {
    func body(content: Content) -> some View {
        content
            .font(.caption2)
    }
}
```

今回の実装では、`.rotation3DEffect`と`.opacity`を使ってViewをflipできるアニメーションを実現しています。


## AnyTransitionの拡張

https://developer.apple.com/documentation/swiftui/anytransition

https://developer.apple.com/documentation/swiftui/anytransition/modifier(active:identity:)


AnyTransitionは、トランジションのアニメーションを定義する型です。

下記のように定義することで、Transitionのアニメーションを新たに追加することができます。

```swift
// 定義
static let custom: AnyTransition = .modifier(active: CustomTransition(value: 1), identity: CustomTransition())

// 利用側
RoundedRectangle(cornerRadius: 25).transition(.custom)
```


# 終わりに

今度は別の動画の実装を模写し、SwiftUIの表現力を強化したいです。
ED法と1.58bit LLMについて

<h2>DISCLAIMER</h2>

すみません！

今回はCNCでもEtherCATでも、CODESYSでもなく、特定のAIに関する話題です。ポエムかもしれません。

<h2>ED法</h2>

https://qiita.com/kanekanekaneko/items/901ee2837401750dfdad

掘り起こしている人、すごいですね。

ディープラーニングの基礎や、BitNet b1.58( 1bit LLM )の話題をちょっと思い出しつつ、読んでみました。それと応用数学、基本的ロジックIC、あれ、なにかしら、共通点あるっぽい？つながるんでは？と思いました。

AIの大量の行列計算の基本的な部分が、脳神経伝達の仕組みをまねると高性能化する、なんて、めちゃくちゃロマンがあります！

AIの大量の行列計算の大幅な省力化については、大きな次元の行列の逆行列の計算に、内部が０で三角形になる行列をつかったり、ありましたね。Pythonの数学ライブラリでゴリゴリ解く時代になったかと思いますが、数式計算、手計算の推察も役に立ったりするのでしょうか・・


こちらでPythonで実装されている方もいらっしゃいました、動いている！お仕事速いです。

https://qiita.com/pocokhc/items/f7ab56051bb936740b8f



<H2>「仮説２）　各ニューロンは(-1, 1)の二値を取る」 に、0を加える</H2>

昨今、1.58bit LLMの衝撃もあったのですが、(-1,1)を、(-1,0,1)の３値（　1.58bit表現 ）にしたときの知能化のメリットを考えてみます。

0の項目の多数の出現により、多層・多数になったときのの行列計算は必要入力だけに大きく簡素化されます。(-1,1)にくらべ、「どうでもよい入力」に対する出力振動が学習して抑えられる。

機械学習においてはなんでもつっこめるものをつっこむので「出力に関係がない、関係させないほうがよいもの」も沢山あります。
また、ハイパーパラメータのさじ加減が難しいです（職人技みたいな感じ）。
スパース化は、無関係な入力（いろんなものから推定して）の0の項を特定するなどして調整していきます。
これらは、1.58bit＋ED法にすることで、いくつかのハイパーパラメータの調整や、スパース化が自動的におこなえる可能性があるのではという想像というか妄想です。

<h2>３値、というのは、なんとなく中途半端に思いますが</h2>

論理はH/Lの1bitです。すっきりしているというか、なんかこれにもう１個つけくわえるって・・なんていう無駄なんだ！
それなら、おまけにもう１個つけくわえて、2bitにしてみたら、と、思わないこともないです。

ただ、それだとfp8同様に、スパース化がはっきりしないのかもしれません。一方で、NVIDIAの生成AI向けプロセッサのライブラリではfpをつかっていますがビット数は8や4に削減される方向にあります。

ところで、原始的なMPU回路（マイコン基盤）では、回路（すなわちネットワーク）に対して、３ステートを処理するICの部分がかならずあって、H/Lとは無関係な状態、切り離された状態、をもっています。３ステートがないと、ちょっとしたマイコン基盤でも出来ないんですよね。

３値、あるいは、1.58bit、は、ネットワークの情報理論に対して、必要な数学的要素と想定できるし、おそらくは、脳神経伝達のメカニズムに相当する反応や分子があるんじゃないかな？なんかありそう。


以上のことを、ちょっと妄想してみた次第です。
【HTML】「本当に○○して良いですか？」確認メッセージ

## 問題
削除ボタン等を押した時に
「本当に○○して良いですか？」
確認メッセージを表示したい。

確認メッセージを承諾したら〇〇を実行。
拒否したら元に戻るようにしたい。

## ゴールの確認
![スクリーンショット 2024-04-24 16.10.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/84db478a-522d-2f68-ea38-581306318838.png)

## 参考サイト
https://sorauta1.blog.fc2.com/blog-entry-492.html

## 解決方法
### 結論
confirm()メソッドを使う

### コード
```index.blade.php
<form action="{{ route('spending.destroy', ['spending' => $spending['id']]) }}" method="post">
    @csrf
    @method('DELETE')
    // ⭐️↓これ
    <button type="submit" class="btn btn-danger ml-5" onclick="return confirm('支出内容を削除しても良いですか？');">削除</button>
</form>
```

### 解説
onclick = ユーザが要素をクリックした際に起動する処理を指定するイベント属性
confirm = ウェブページ上に確認ダイアログボックスを表示させる

https://style.potepan.com/articles/21691.html

https://www.sejuku.net/blog/28217
未来を見据えて働く

## 未来を見据えて働こう
この記事が初投稿になるわけですが、現在応用情報技術者取得に向けて勉強中です。
下手なベンダー資格よりも、無期限で資格を所有できる国家資格の方がコスパいいじゃん！と気づいたため選択しました。
結局有象無象のエンジニアの中に埋もれないようにするためには、リーダー職目指すしかないもんね。。。

## 転職について
転職ってどれくらいのペースでするのがベストでしょうか、転職しましたが思っていたより給料が上がらず、もう転職を考えている自分がいます。。。~~ボーナスもらってから辞めたい~~（まだ転職して半年^^;

ぜひコメントで転職について意見いただけますと泣いて喜びます。
XAMPPのMySQLポート競合を解決する方法（Windows & Mac）


XAMPPを使用している際にMySQLが起動しない問題は、ポート競合が原因であることが多いです。MySQLがデフォルトで使用するポート3306が他のプロセスによって既に使用されている場合があります。この記事では、WindowsおよびMac (M1) 環境でのポート競合の診断と解決方法をステップバイステップで解説します。

## 1. 問題の確認

XAMPPコントロールパネルを開いた際に表示されるログから、MySQLがポート3306で起動できないことが示されています。これは、他のプロセスがポートを使用しているためです。

## 2. 競合するポートの診断

### コマンドプロンプト/ターミナルの使用

#### Windows

1. 管理者権限でコマンドプロンプトを開きます。
2. 次のコマンドを使用して、どのプロセスがポート3306を使用しているかを確認します：

   ```cmd
   netstat -aon | findstr 3306
   ```

#### Mac (M1)

1. ターミナルを開きます。
2. 次のコマンドを使用して、どのプロセスがポート3306を使用しているかを確認します：

   ```bash
   sudo lsof -i :3306
   ```

### プロセスの特定と終了

#### Windows

プロセスIDを使用して競合しているプロセスを特定し、終了させます：
おそらく管理者としてコマンドプロンプトを開かないといけません。

```cmd
tasklist /fi "PID eq [PID]"
taskkill /PID [PID] /F
```

ここで、`[PID]`は`netstat`から得られたプロセスIDに置き換えます。

#### Mac (M1)

プロセスIDを使用して競合しているプロセスを特定し、終了させます：

```bash
sudo kill -9 [PID]
```

ここで、`[PID]`は`lsof`から得られたプロセスIDに置き換えます。

## 3. `0.0.0.0:3306` の意味

`0.0.0.0:3306` という設定は、MySQLサーバーがコンピュータのすべてのIPv4アドレスに対してポート3306で接続を待ち受けている状態を意味します。これにより、ローカルネットワーク内の任意のデバイスや、適切なネットワーク設定を通じて外部のデバイスからもアクセスが可能になります。

## 4. 競合の解決

競合しているプロセスが重要でない場合は、そのプロセスを終了させることができます。それが可能でない場合は、MySQLのポート番号を変更する必要があります。

### MySQLのポート変更方法

1. XAMPPのMySQL設定ファイル (`my.ini`または`my.cnf`) を開きます。
2. ポート番号を3306から別の番号（例えば3307）に変更します。
3. XAMプコントロールパネ

ルを再起動して、変更を適用します。

## 5. セキュリティ考慮事項

外部からのアクセスを安全に管理するためには、適切なファイアウォールの設定が必要です。`0.0.0.0`と`[::]`のアドレスでリスニングする場合、特定のIPアドレスからのみアクセスを許可するようにファイアウォールを設定することをお勧めします。
AWS S3互換のWasabiオブジェクトクラウドストレージをWindowsに外部ストレージとしてマウントする

# Wasabiとは
https://wasabi.com/ja/

Wasabiは、AWS S3互換のオブジェクトクラウドストレージです。
アップロード・ダウンロードの転送量が無料で、実際使用料のみ1TB毎に課金される仕組みです。
詳細は省きますが、国内では最安値で1TBが使用可能なオブジェクトストレージです。
私も利用していますが最低料金より少し高めの$7.97/月前後で推移しています。

![CleanShot 2024-04-24 at 14.43.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569001/8460f604-4b33-592f-a0a5-b6d15d762319.png)

今回は私の使用方法も含めて、「WasabiをWindowsの外部ストレージとして使用する」方法を解説します。

# WasabiをWindowsの外部ストレージとして使う

Wasabiはクラウドストレージとは異なり、APIベースでファイルの取得・アップロード・ダウンロードを行います。
そのため、Wasabiを契約したからと言ってすぐにファイルサーバーとして使うことは出来ません。

最も簡単な方法は「AirLive Drive」を使用してマウントする方法です。
https://www.airlivedrive.com/en/

AirLive Driveであれば無料で1ドライブ/クラウド、最大3ドライブまでマウントが可能です。
ですが、それじゃあ面白くないですよね。
Qiitaに書き込む以上、もっとニッチな方法が良いと思い、RcloneとWinFspを使ってマウントしてみました。

## Rclone + WinFspを使ってマウントする

1. まず、WinFsp Installerをダウンロード→インストールします。特に設定などは必要ありません。
https://winfsp.dev/rel/
Rcloneでマウントする際に必要になります。

2. Rcloneをダウンロード・解答し、好きなフォルダに設置します。私はCドライブ直下に設置しました。
https://rclone.org/downloads/

3. 設置したRcloneフォルダにターミナル(PowerShell)またはコマンドプロンプトでアクセスします。

4. 以下のコマンドを順に実行します。
```powershell
./rclone.exe config
```
「No remotes found, make a new one?」
→「n」

「Enter name for new remote.」
→好きな名前を入力します。例:「wasabi」

「Option Storage...」と、接続先の一覧が表示されます。
→ 「Amazon S3」の数字を入力（私の場合は「4」）

「Option Provider...」と、プロバイダ一覧が表示されます。
→ 「Wasabi Object Storage」を入力（私の場合は「29」）

「Option env_auth...」と設定をどうするかを聞かれます。
→一旦「1」を入力します。

「Option access_key_id...」と表示されます。
→ Wasabiのアクセスキーを入力します。

「Option secret_access_key...」と表示されます。
→ Wasabiのシークレットキーを入力します。

「Option region...」と表示されます。
→一旦「1」を入力します。

「Option endpoint...」と、リージョン一覧が表示されます。
→自身のリージョンの番号を入力します。私は東京リージョンのため、「10」を入力します。

「Option location_constraint」と表示されます。
→とりあえずそのままEnterします。

「Option acl...」と、何の権限で接続するか表示されます。
→ ご自身の要望に併せて選択しますが、今回は「6（FULL_CONTROL bucket-owner-full-control）」を選択します。

「Edit advanced config?」と表示されます。
→ 特に設定はないため「n」を入力します。

「Configuration Complete...」と表示されます。
→ 設定をキープするか聞かれているため、「ｙ」を入力します。

最初の画面に戻りますので、一旦「ｑ」でRcloneを終了します。

以下のコマンドを入力して、正しく接続できるかをチェックします。
```powershell
./rclone.exe ls wasabi:
```
コマンドを入力すると、bucket内のファイルリストが表示されます。
問題なく表示されれば、以下のコマンドを入力してマウントします。（表示されない場合は設定ミスの可能性があります。）
```powershell
./rclone.exe mount wasabi:<bucketの名前> <マウント先の割り当てたいドライブ名>:
```
Windowsの場合、DドライブやEドライブなどで指定するため、実際は以下のように入力します。
```powershell
./rclone.exe mount wasabi:bucket-name W:
```
この状態で、エクスプローラを見てみると、Wasabiがマウントされていると思います。

上記をバッチ化すると、起動時に自動接続することが出来ますね。

## マウントを解除する
以下のコマンドを入力します。

```powershell
./rclone.exe unmount W:(割り当てたドライブ名)
```

これで、ファイルをアップロード・ダウンロードできる環境が整いました。

プログラミングと組み合わせてファイルをミラーリングしたり、タスクスケジューラで自動アップロードなど、色々と汎用性が高そうですね。
wmicコマンドをPowerShellのCimInstanceへ置き換えたい

職場でbatファイル(コマンドプロンプト)を使用している。
そのうち、wmicコマンドを多量に使用している。
将来、wmicコマンドが廃止される事を知った。
廃止スケジュールは、Windows11 24H2で無効(Disable)化され、次期Windows(Windows12 ?)で削除されると発表されている。

https://techcommunity.microsoft.com/t5/windows-it-pro-blog/wmi-command-line-wmic-utility-deprecation-next-steps/ba-p/4039242

batファイル内のwmicコマンドの代替えとして、ps1ファイル(PowerShell)内でCimInstanceを使いたい。
そこで、batファイル内でWindows のビルド番号を確認して22631(バージョン23H2)を超えていたらPowerShellのCimInstanceを使う。
それ以外(Windows10 や Windows11の23H2　以下のバージョン)なら従来通りwmicコマンドを使う。
その分岐処理をbatファイル内に追加したく、考案。

2024年04月24日水曜日にWindows 10とWindows 11で確認済み。
以下を、別途batファイルへ保存する。
保存する際は改行コードを「Cr + Lf」に。
文字コードを「Shift-JIS」又は「ANSI」にする。

~~~bat
@echo off
rem Windows のビルド番号が22631（バージョン23H2）を超えていたら、PowerShellのCimInstanceを使う。
rem それ以外(Windows10 や Windows11の23H2　以下のバージョン)なら従来通りwmicコマンドを使う。

rem 初期状態を新し目のビルド番号にしておく。
set osBuildNumber=22632
set flgCIM=1

rem レジストリ内から、Windowsのビルド番号を取得。(Windows10 と Windows11で有効。※次期Windows(Windows12 ?)でも有効かどうかは不明。)
for /f "tokens=1,2*" %%i in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v "CurrentBuildNumber"' ) DO (
    if "%%i"=="CurrentBuildNumber" (
        set osBuildNumber=%%k
    )
)
if %osBuildNumber% gtr 22631 (
    rem echo osBuildNumberは22631を超えている。PowerShellのCimInstanceを使う。
    set flgCIM=1
) else (
    rem echo osBuildNumberは22631未満である。wmicコマンドを使う。
    set flgCIM=0
)
echo osBuildNumber=%osBuildNumber%

rem 他のwmicコマンドを使っている箇所でも、変数「flgCIM」の値を参照する事で
rem wmicコマンドを使えるかどうかを共有できる。
echo flgCIM=%flgCIM%

if %flgCIM% equ 0 (
    rem 従来通り、wmicコマンドを使う処理。
) else (
    rem ps1ファイルを呼び出す等、PowerShellのCimInstanceを使う処理。
)

rem 続きの処理を色々実施。

pause
~~~
Googleマイビジネスって何？

# Googleマイビジネスで集客を加速させよう
## エリアナンバーワンのシェアを取りたい
## Googleマイビジネスとは


Googleが提供する無料のツール。Googlemapと連携してビジネスオーナーとして発信ができる。

**何がいいの？　
→
曖昧な検索で辿り着いたお客様を自社ウェブサイトへ流し込む
検索結果に地図上に出てくる
3つ以上の事業所も表示させられる**


ユーザーからの見え方の例：
出先でお店を探したい場合、引っ越し先で店を探したい場合
→　とりあえず地名＋業種名で検索（「東京　美容室」　など）
→→　検索結果の1番上に表示
→→→　検討対象に入りやすい。（入口になる、まず土俵に上がることができる）

### 特徴
* クリックするとお店の詳細画面とGooglemap上での経路が表示される。
* 営業時間も表示。
* 電話を掛けることも可能。
* お店の内装の写真や口コミも簡単に閲覧できる。
* 予約可否の確認が可能。
＝　顧客の気になる情報が網羅されている。同業種の他店も簡単に比較。

## ローカル検索結果のランキングを改善
Google検索時により上位に自分のお店を表示させる為には、
* 詳細なデータを入力する
* ビジネスのオーナー確認を行う
* 営業時間の情報を正確に保つ
* 口コミの管理と返信を行う
* 写真を追加する
* 店舗の商品を追加する
上記の改善方法が公式で示唆されています。

## で、結局何すりゃいいわけ？
* 正確でかつ豊富な情報量を載せる（そのお店が何に特化しているのか？）
* お客様とのコミュニケーションを密にとる（口コミには素早いレスを）
* 自社ウェブサイトやSNSと連携させる（より詳細な情報を訴求できるwebページへ誘導）

## 集客テクニック
カバー写真とロゴ
人気のある写真をメインに・明度を高く・プロの手を借りる

ユーザー投稿の写真は消せる？
→消せない。なのでオーナー側でより良い写真を投稿して後ろのほうへ持っていくしかない。

## 投稿で集客効果を上げる
webライティングの4つのポイント
* 対象を絞る 
* 「あなた」を主語に置く
→　当社は～、お届けするサービスは～というこちらが主体になる書き方は避ける。
まだウチをご利用頂いていないお客様へ訴求する。＝お客様は何を得ていただけるのか、何が手に入るのかを想像していただきやすい書き方。
例：美容室なら「毎朝ブローをする必要がなく、手櫛だけで髪型がキマるようになり、手間が省けます」
* 具体的なことを書く
→　キラキラした形容詞ばかり使うのはNG。
具体的に想像できるような書き方を用いる。
* 起こしてほしいアクションを書く
お客様に起こしてほしい行動を書き、購買活動への背中を押す。
電話をかける、予約をする、お店へ足を運んでいただくetc...

1.対象の絞り込み
2.お悩みやニーズを提示
3.こちらが提供できる解決策の提示
4.安心材料の提示
5.起こしてほしい行動

### 雑な例
1.サウナで汗を流してサッパリしたい。疲労も溜まっているから浴槽にもゆっくり浸かりたい...。
でも家のお風呂じゃ足が伸ばせずいまいち。銭湯は好きだけど混んでるのが嫌だからあまり行きたくない。
そんな方へ

2.家のお風呂では汗は流せるが狭くてゆっくりできない。
追い炊き機能もないのですぐにお湯がぬるくなる。
そもそも家にサウナがないよ！温泉旅行に行くお金も時間もねえよ。
銭湯はどこもたいてい混んでるから余計に疲れるわ！！
どうすればええんや？

3.サウナも大浴場もある完全予約制のスパがそのニーズにお応えします。
お値段も平日なら1,800円と比較的リーズナブル。お風呂の種類も白湯からジャグジー、薬湯まで多種多様にお楽しみいただけます。もちろん水風呂も。
予約制で人数制限を設けておりますので、混雑してゆっくり温泉に浸かれないという状況も生まれません。
ーーー浴場の写真ーーー
ーーー店舗公式サイトのURLーーー

4.夜中の1時まで営業しているので仕事帰りでも時間に余裕をもってお越しいただけます。
バスタオルをはじめとした各種アメニティもフロントで安価で購入できるので手ぶらでもOK。
駅から徒歩2分なのでアクセスも良好です。

5.まずは、公式HPから来店希望日・時間帯をご予約ください。
初めてご来店の方は会員登録をお願いします。その際性別とご年齢もご回答ください。
ーーー会員登録・予約リンクーーー

::: note
会員登録でクーポンなどの特典をお渡しするのはOKですが、
Googleマイビジネスの場合、**割引クーポンと引き換えに口コミをお願いするような、いわば謝礼と引き換えに口コミを得る行為**はポリシー違反になりますのでご注意ください。
万が一ポリシー違反が認められた場合は最悪アカウント停止などのペナルティが課せられます。
[投稿コンテンツに関するヘルプ](https://support.google.com/contributionpolicy/answer/7411351?hl=ja&ref_topic=7422769&_fsi=GayZ9FEJ#zippy=%2C%E5%86%99%E7%9C%9F%E3%81%A8%E5%8B%95%E7%94%BB%2C%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AE%E3%82%AF%E3%83%81%E3%82%B3%E3%83%9F%E3%81%A8%E8%AA%AC%E6%98%8E)
:::


## おわり
雑なまとめで恐縮ですが、ここまで読んでいただきありがとうございました。
使い方でなく正しい使い方で正しい成果を挙げられるよう
ツールはうまく活用していきたいものですね。
コメント　〜備忘録〜

備忘録として以下の記事を参考にする

[コメントつける際の留意点](https://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E6%9B%B8%E3%81%91%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8%E3%81%AE%E3%81%BF%E3%82%92%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AB%E3%81%99%E3%82%8B/)
[java備忘]switchの文に使用できるデータ型を語呂合わせで覚える

## switchの文に使用できるデータ型を語呂合わせで覚えたい

switch分の式に使用できるデータ型は以下の型である
byte、char、short、int、およびそのラッパークラス、enum、String

## 語呂合わせ

Switch
を買いに来た
ストリート(String)ラッパー(ラッパークラス)
のエミネム(enum)
ショー(short)ウィンド(int)ウに蹴飛ばし
バイちゃ(byte char)

## chatgptでイラスト生成

ラッパーのエミネムがswitchの飾ってあるショーウィンドウに激突する簡易なイラストを生成してください

結果はこちら
![エミネム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759654/8ef65a51-5047-5860-8993-6552bd10a3e2.png)
エミネム....?

## まとめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759654/a6f8a18f-3cf9-ba47-8844-1aa771edf234.png)
Google Professional Cloud Developerの勉強メモ

https://cloud.google.com/learn/certification/cloud-developer

試験を受けることになったので、勉強するよ

# 公式資料

- [試験ガイド](https://cloud.google.com/learn/certification/guides/cloud-developer)
- [模擬試験](https://docs.google.com/forms/d/e/1FAIpQLSc_67KaPnNwQrLZ7kuhw-aubz7gMAwY6DQwRJYcW0qlG-iajA/viewform?hl=ja)
- [skills boost](https://www.cloudskillsboost.google/paths/19?hl=ja)

# 他の人の受験メモ

- https://future-architect.github.io/articles/20240117a/
- https://qiita.com/ysmmb12/items/deb7c4ddd903ee65a71a
- https://zenn.dev/yamada_kazumasa/articles/f520a29ab10221
- https://blog.g-gen.co.jp/entry/professional-cloud-developer

# 何かあったら書く

随時更新

問題になりそうなサービス

- run, app engine, gke, functions
- kubernetes, istio, wi
- cloud build, artifact registry
- cloud deploy
- workflows
- eventarc
- tasks
- scheduler
- sql, spanner, bigtable, firebase
- logging, monitoring, profiler, trace
- https://cloud.google.com/architecture?hl=ja
- https://www.coursera.org/professional-certificates/google-cloud-developer#courses

[模擬試験受けてみた](https://qiita.com/ieiringoo/items/deda37aaf3f8cb392aa0)
【競プロ】広義単調増加数列と狭義単調増加数列の最大数【O(N log N)】

# 狭義単調増加数列の最大数
```python:
from bisect import bisect_left

N = 5
INF = 10**20

A = [2, 1, 4, 5, 5]
B = [INF]*(N+1)

for a in A:
    B[bisect_left(B, a)] = a
ans = bisect_left(B, INF)
```
アルゴリズムの詳細

https://qiita.com/python_walker/items/d1e2be789f6e7a0851e5

# 広義単調増加数列の最大数
等しいことを認めるので `bisect_right` を使う
```python:
from bisect import bisect_left, bisect_right

N = 5
INF = 10**20

A = [2, 1, 4, 5, 5]
B = [INF]*(N+1)

for a in A:
    B[bisect_right(B, a)] = a
ans = bisect_left(B, INF)
```

# 単調減少数列の場合
逆から見れば良い
```python:
A = [2, 1, 4, 5, 5]
A = list(reversed(A))

# 略
```
【小ネタ】Copilot for PowerPointでテンプレートを使って生成したい

Copilot for PowerPointを利用する際にパワポテンプレを使う場合は、
利用したいテーマを開いた状態でプロンプトを打つと、テーマに合ったデザインで生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/b907835a-dc87-4a0c-4232-669cccba1d87.png)

ちなみにCopilot for Power PointはWordファイルをもとにスライド作成が可能ですが
まだパワーポイントテンプレートを読み込む機能はないようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/88a83b9f-eb2e-9505-2742-081157930267.png)