OmniAICreator/Qiita-1.07M huggingface dataset:
Oracle Cloud: Network Visualizer でネットワーク・トポロジを表示してみてみた

Network Visualizer は、選択したリージョンおよびテナンシのすべてのVCNに実装されたトポロジのダイアグラムが表示され、各コンポーネントの詳細なリソース情報を取得でき、リソース情報画面から 1 回のクリックで選択したコンポーネントの構成を表示および管理できるようになります。この機能により、ネットワークの可視性が向上し、トラブルシューティングが容易になります。
OCIコンソールのこのツールには、次の詳細レベルがあります。

**・リージョン・ネットワーク・トポロジ**
リージョン内の仮想ネットワーク構成全体のレイアウトおよびルーティング・トポロジの概要を表示できます。このトポロジには、DRG、VCN、CPE、および様々なタイプのゲートウェイが含まれます。

**・Virtual Cloudネットワーク・トポロジ**
サブネットおよびルーティング構成を含む単一VCNの組織を表示できます。このトポロジには、サブネット、VLAN、および他のリソースへのゲートウェイが含まれます。

**・サブネット・トポロジ**
サブネット内のインスタンス、ロード・バランサ、FSSおよびOKEクラスタに関するリソース情報を確認できます。 

ということでネットワーク・ビジュアライザを使用してみてみます。


# ■ 必要な権限
ネットワーク・ビジュアライザにアクセスできるようにするには、次のポリシーを設定する必要があります。
```
Allow group <your_admin_group> to READ all-resources in tenancy
```
ネットワーク・ビジュアライザはvirtual-network-familyに属しておらず、より詳細な権限を持つ特定のグループにも属していません。


# ■ ネットワーク・ビジュアライザの使用
## ⚫︎ リージョン・ネットワーク・トポロジの表示
**1) OCIコンソール画面**
ナビゲーション・メニューを開き、[ネットワーキング] > [ネットワーク・コマンド・センター] グループにある [ネットワーク・ビジュアライザ] をクリック

![02-NWビジュアライザ-00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/48eb7010-ffe3-8f96-1c9d-f851c5f18ac0.jpeg)


**2) ネットワーク・ビジュアライザ画面**
ネットワーク・ビジュアライザ・ツールのダイアグラムでは、ネットワーク構成の構造の概要を表示でき、コア・コンポーネント間の迅速なナビゲーションに役立ちます。これにより、リージョンとコンパートメントの特定の組合せにおけるすべてのリソースのビューが提供されます。

このダイアグラムでは次を表示および理解できます:

    VCNの相互接続方法
    オンプレミス・ネットワークの接続方法(FastConnectまたはサイト間VPNを使用)
    トラフィック・ルーティングを制御するルーティング・エンティティ(DRGなど)
    転送ルーティングの構成方法


![02-NWビジュアライザ-VC01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/c76924e7-d55a-7224-e33c-14178f1d82b1.jpeg)




# ■ 参考
[ネットワーク・ビジュアライザ](https://docs.oracle.com/ja-jp/iaas/Content/Network/Concepts/network_visualizer.htm)
[Announcing Oracle Cloud Infrastructure Network Visualizer](https://blogs.oracle.com/cloud-infrastructure/post/announcing-oracle-cloud-infrastructure-network-visualizer)
メモ: SnapアプリをX11 Forwardできないとき

# 問題
Ubuntuでfirefoxなどsnapアプリをssh下でX11 Forwardできず、以下のようなエラーが出る。

```sh
$ firefox
X11 connection rejected because of wrong authentication.
Error: cannot open display: localhost:11.0
```

# 対処
```sh
export XAUTHORITY=$HOME/.Xauthority
```

# 一言
最近はWSLgのお陰でWindowsからのX11 Forwardも簡単でいいですね。

# 参考
- https://unix.stackexchange.com/questions/674214/x11-connection-rejected-because-of-wrong-authentication
- https://forum.snapcraft.io/t/x11-forwarding-using-ssh/2381
- https://forum.snapcraft.io/t/x11-connection-rejected-because-of-wrong-authentication/16528/3
【6日目】OSS連携してみたい！(4) Autoware-Microにエセ自作モジュール追加する

この記事は筆者オンリーの[Advent Calendar 2023](https://qiita.com/advent-calendar/2023/aichallenge_racing_for_mas)6日目の記事です。  

# 前回までのあらすじ
ROSモジュールを追加し、AutowareからサブスクライブしたメッセージをそのままAutowareに渡すという処理を追加し動作することを確認しました

# 今回やること
OSS連携を見据えて、Autowareのメッセージのメンバーを分解して渡すという処理をやりたいと思います

# Autowareのメッセージの構造
例として[PathWithLaneId](https://github.com/tier4/autoware_auto_msgs/blob/tier4/main/autoware_auto_planning_msgs/msg/PathWithLaneId.idl)を見てみます。
ここから、メッセージは
・Header型のheader
・PathPointWithLaneId型のpoints
・Point型のleft_bound
・Point型のright_bound
で構成されていることがわかります。
Point型はROS2で定義されているもののようです。

[PathPointWithLaneId](https://github.com/tier4/autoware_auto_msgs/blob/tier4/main/autoware_auto_planning_msgs/msg/PathPointWithLaneId.idl)を見てみます。
・PathPoint型の point
・int64型のベクターのlane_ids
で構成されていることがわかります。

[PathPoint](https://github.com/tier4/autoware_auto_msgs/blob/tier4/main/autoware_auto_planning_msgs/msg/PathPoint.idl)を見てみます。
・Pose型のpose;
・float型のlongitudinal_velocity_mps
・float型のlateral_velocity_mps
・float型のheading_rate_rps
・boolean型のis_final
で構成されていることがわかります。
Pose型はROS2で定義されているもののようです。
Autoware独自の定義は[こちら](https://github.com/tier4/autoware_auto_msgs/tree/tier4/main/)で見られるようです。

# 作業
例によってソースコードを作成します。
作成は[前回記事](https://qiita.com/Massy0127/private/bad2a1ed65fc21446259)のcpp_pathwithlaneid_pubsub_impl.cppを改造して作ります。

# ソースコード
```cpp_pathwithlaneid_pubsub_impl.cpp
#include "cpp_pathwithlaneid_pubsub.hpp"
#include <memory>

using PathWithLaneId = autoware_auto_planning_msgs::msg::PathWithLaneId;
using std::placeholders::_1;

PathSubscriber::PathSubscriber() : Node("path_subscriber")
{

  sub_path_pub_ = create_publisher<PathWithLaneId>(
      "behavior_planning/path_with_lane_id_modified", 1);

  sub_path_sub_ = create_subscription<PathWithLaneId>("behavior_planning/path_with_lane_id", 10, std::bind(&PathSubscriber::topicCallback, this, _1));
}

void PathSubscriber::topicCallback(const PathWithLaneId::ConstSharedPtr msg)
{
  PathWithLaneId path;

  /*PathPointWithLaneID*/
  path.header = msg->header;
  path.left_bound = msg->left_bound;
  path.right_bound = msg->right_bound;
  path.points = msg->points;


  // RCLCPP_INFO(this->get_logger(), "I heard");

  sub_path_pub_->publish(path);
}

```


# これから
C++を用いたROS2モジュールの作成を一通りやりました。
が、連携OSSはPythonが多数のようです。
次回はC++と同様のことができるかPythonでも試してみたいと思います。
GPUのメモリを検査する

## はじめに
　GPUのメモリが故障しているかどうか気になることがあると思いますが、そうした場合Direct 3DやVulkan、CUDAやOpenCL経由では見ることができるメモリは一部にすぎないのでちょっとしたテストプログラムを用意しても不安になるかもしれません。そこで、より広いメモリ領域を検査する方法を拾ってきたので紹介したいと思います。  

## 注意
　GPUやその使われ方によりますが、メモリの末尾部分がコンソール表示に用いられていたりしてエラーが集中して出る場合があります。不良部分を末尾に固めてマップしている場合もあるかもしれません。具体的にはRX 580では末尾8MiB、RX Vega 56では末尾28MiBのみにエラーが出ていました。  

## 方法
　[How To Test AMD Radeon GPU RAM memory using Linux Scripts](https://www.youtube.com/watch?v=k8LUKBzfDSU)というYouTubeにある動画にあるのですが、Englishという見慣れない聞きなれない言語でよくわからないので訳すことなく日本語で書いてみることにします。  

#### 用意するもの
* Windows
* [Rufus](https://rufus.ie/ja/)
* [Arch Linux](https://archlinux.org/download/)
* [検査用スクリプト](https://drive.google.com/file/d/1Zkhl_3hr_qlysV1uiPkcS5XehL8yXNAH/view)
* USBマスストレージデバイス(USBメモリ)など

#### メモリを検査する手順など
* Rufusを管理者として実行し、Arch Linuxを起動可能になるようUSBメモリに書き込み、そこに検査用スクリプトをコピーします。  
* USBメモリからArch Linuxを起動できるようにするためにUEFI設定でセキュアブートを無効にします。Smart Access MemoryやClever Access Memory、或いはResizable BARと呼ばれるものは無効のままでもメモリ全域が現れるようです。  
* 検査対象のGPUにモニタを繋げたままでも問題ないと思います。  
* USBメモリからArch Linuxを起動します。  
  選択項目が表示されますが、一番上のArch Linux install medium (x86_64, x64 UEFI)のようなものを選びます。  
* 検査用スクリプトを読めるようにするため、スクリプト保存先のパーティションをマウントします。  
  マウント先を作ります。  
    mkdir /hoge  
    などでいいでしょう。  
  
  スクリプト保存先のパーティションを表すファイル名を見つけ出します。  
  fdisk -l  
  として見つけます。ここでは/dev/sdc1がそのファイル名だとします。  

  マウントします。  
    mount /dev/sdc1 /hoge  
  といった感じになると思います。  
* 検査対象のアドレスを探します。  
  lspci -v | less  
  とタイプして探します。大抵の日本語キーボードの場合『|』は、Shiftを押しながらEnterのすぐ左の『む』を押すと出せるはずです。  
  lessでの表示中は、jキーで進み、kキーで戻り、qキーでlessを終了できます。  
  対象デバイスのところに  
  Memory at 6000000000 (64-Bit, prefetchable) (size=8G)  
  といった感じでGPUのデバイスメモリの先頭アドレスとサイズが出ているはずです。  
* 検査用スクリプトを実行します。
  python3 /hoge/memtest.py (検査開始アドレスを十六進数で) (テストサイズをメガバイト単位の十進数で)  
  たとえば、  
  python3 /hoge/memtest.py 6000000000 8192  
  といった感じです。
* 環境にもよりますが数分間から十数分間ほど検査に要するので、まずは64MiBなど小さめのテストサイズで実行してから検査時間を見積もるとよいかもしれません。
systed-networkdで場所によって固定IPアドレス、動的と振り分ける

家や会社では固定IPアドレス、それ以外は動的にIPアドレスを決めたいという事がある
と思います。

それ以外の場所ではネットワークアドレスがわからないし、DNSもGatewayもわからない。
IPアドレスがかぶるかもなので、DHCPにすべて任せたいということです。

## 設定

下記のように/etc/systemd/network/配下に.networkという拡張子でファイルを
置くと設定に応じたネットワークで固定IPアドレス、動的IPアドレスが
割当られます。

これを設定したい数だけ配置してください。

### 家や会社

ネットワークに接続するときのSSIDから固定IPアドレスを設定するように
ファイルを書けば良い。

```bash:/etc/systemd/network/myhome.network
[Match]
# 使うnicの名前。,で区切って複数指定する事もできる。
Name=wlp3s0
# 複数のSSIDを指定するときは下記のように,で区切る。
SSID=Buffalo-A-XXXX,Buffalo-G-XXXX

[Network]
Address=192.168.11.19/24
Gateway=192.168.11.1
DNS=192.168.11.1

```

### それ以外の場所

カフェなど知らないネットワークでは動的にIPアドレスを決める。

SSIDを指定しない場合は、他の設定にないすべての場所になる。

```bash:/etc/systemd/network/unknown.network
[Match]
Name=wlp3s0

[Network]
DHCP=yes

```

## reference

他のOSで説明あるとこ無いんで、Archwiki見ることになります。
ただ、systemdなので設定一緒ですが。

[archwiki](https://wiki.archlinux.jp/index.php/Systemd-networkd)

## まとめ

その後のwpa_supplicantの設定は[ここ](https://zenn.dev/oto/articles/1215d33206f047)を参考にしてください。

windowsも同じ要領でSSIDから固定IPアドレス、動的IPアドレスと切り替える
事ができます。windowsの場合はGUIから出ないと無理か、かなり複雑ですが。

詳しくは[Buffaloのサイト](https://www.buffalo.jp/support/faq/detail/15257.html)を見てください。これをSSIDごとに自動、手動で設定していくことになります。
UiPath StudioでZoomの会議を予約してみた

## はじめに
①本記事は、2023年12月開催の「UiPath (produced with UiPath Friends) Advent Calendar 2023」の1日目のブログです。
ブログはまだまだ募集中:santa:以下よりぜひ登録してくださいね！

https://qiita.com/advent-calendar/2023/uipath

②このブログ情報は、2023/12時点の情報です。
③UiPathはCommunity Edition、Versionは2023.10.0使用しています。

## 実は...
今年の7月に、以下のブログを投稿しました。
(覚えていない方は見てみてくださいね)

https://qiita.com/saosao885/items/8704400b9f715b8c0b26

https://qiita.com/saosao885/items/8c2c438afd2d57b27a70

Zoomの会議をStudio Webで設定するとどんな感じ？というブログ記事を書いてみました。前回はStudio Webでやってみたのですが、Studioでも同様にZoomの会議スケジュールが設定できるようです。

では、Studioでやってみた場合を見てみましょう。

## アクティビティについて
ここ最近のVersionからなのでしょうか、「パッケージを管理」から行かなくてもアクティビティパネルからダウンロードできるようになっていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/ba25d323-ae23-791b-6b00-21281de15c53.png)


## やってみましょう
早速2023/12/3(日)の7:00～8:00に「Javaの勉強とPythonについて」という会議を設定してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/f863bf98-30b8-5faa-ebe4-8ae9862a6cb0.png)

【設定】
既定：Zoomのアカウントを設定します
 (Integration Serviceのほうに登録されている場合は、自動的にアカウントが出てくるようです)
トピック：会議の題名
開始時間：会議のスタート時間
タイムゾーン：東京に設定するため"Asia/Tokyo"で設定
期間：会議の分数(今回は60分で設定してみましょう)
アジェンダ：あれば書きましょう
既定のパスワードを使用：TrueかFalseのいずれか選択(今回はデフォルトのFalse)
パスワード：パスワード設定することができます(今回はしません)
承認の種類：3種類ありますが、必須ではないです(今回はしません)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/4d5a1bad-4a9d-2f35-ca41-1866d62cdf11.png)

## 実行してみましょう
動かしてみると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/2f207a19-27cd-2320-26b0-9226ee5e38e2.png)
設定できましたね！

## まとめ
Studio WebでもStudioでもZoomだけでなく、AsanaやSlack等ほかのツールも利用することができます。
興味があればぜひ使ってみましょう。

次回は、(本記事ではすっ飛ばしてしまった)プロパティ欄について触れていこうと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/4a6c9573-d9bf-95c0-01fe-eb2d51b34ff8.png)

最後までお読みいただきありがとうございました。
あなたの書いた日本語の設計書はコンパイルできますか？

# はじめに
みなさんは「あなたの書いた日本語の設計書はコンパイルできますか？」と聞かれてどんなことを連想されますか？

「コンパイル」ってプログラミングに関係しそうだけど、ソフトウェアの設計書のことだとしたら、ふつうそれはプログラミング言語でコンパイルする手前の資料のことでしょ。このひといったい何言ってんの！？的な感想を持たれた方は多いかと思います。

https://qiita.com/advent-calendar/2023/remind

この記事は日本語構造化仕様記述言語 Re:Mind（リマインド）アドベントカレンダー2023の8日向けの記事です。

## 対象読者
とりあえずこの記事の想定読者はシステムエンジニアさんです。あなたが自分自身でプログラミングするのではなく、別の人にプログラミングしてほしい場合を想定しています。

# みなさんは設計書何語で書いてますか？
みなさんは設計書何語で書いてますか？わたしは日本語です。外国の協力会社さんに実装を依頼する場合も日本語で書いていました。すみません。
この記事ではグローバルに活躍されていて、設計書も英語とかで書かれている方はとりあえず対象外です。自然言語か構造化言語かの問題ではあるので言語によらず参考になるものはあるかもしれません。

## 設計書とは内部設計書のこと
設計書にもいろいろあって、システムのアーキテクチャやサーバーの機能わけとか、システムの設計書は多肢にわたります。
ここでは、設計書の意味をロジックやアルゴリズムを記述した資料というように限定します。

## 設計書をどこに書くか
設計書をどこに書くかという問題があります。markdownだったりExcelだったり、あるいはシステム設計システムのシステム画面(webやOSのフォーム)だったりするかもしれませんが、とりあえずここでは、「どこに」の問題はさておいて、「なにを」書くかの点にまとをしぼります。

# 設計書を日本語で書く際のあるある
いちおうフェーズのイメージを要件のとりまとめや定義が終わって、どのようにそれらを実現するかということを考案していく状況にあるとします。
ここではその要件が合目的的かの検証はしないものとします。別の機会記事にゆずるとします。

## 要求内容を少し細かく書く
よくあるのは、どのように実現するかのヒントにとどめている記述です。それは往々にして要求的な宣言的な記述を少し自然言語の日本語で補足しているような書き味となっています。

## いちおうロジックがざーっと一本書きされている
自然言語の日本語にも、〇〇の場合は～　という条件分岐的な表現が可能なので、いちおう場合分けが書いてある場合があります。
しかし、意外と抜けているのが〇〇の条件式に相当する部分が、あいまいで未定義の単語や「なに」と「なに」が等しいのか等しくないのか、「なに」と「なに」の対となる表現が欠落して片方の「なに」だけになっている「なにが等しい場合」というような表現もよく見受けられます。

## 場合分けの分岐先がスパゲティ
箇条書きでセンテンス番号が打ってあると、場合分けの分岐先がそのセンテンス番号で表現される場合がよくあります。分岐が複雑になってくると書いている本人もあとからよむとよくわからなくなる場合があります。

# 日本語の設計書がコンパイルできるとは
日本語の設計書がコンパイルできるとは２つの意味があると考えられます。

## ２つの意味　その１　実装言語に書き換えれるレベルに達している
２つの意味のその１は、実装言語に書き換えれるレベルに達しているという意味です。直接コンパイラに通せるほど厳密に構造化はされていないにしても、多少のあいまいさを含みつつもおおむね慣れているプログラマであればただしく解釈できる程度には記述が論理的で矛盾がない状態です。
これはしかしコンピュータの支援をうけずにここまで脳裏に構成できる人材はなかなかいないのが現状と推察されます。私を含めてです。

## ２つの意味　その２　日本語プログラミング言語でコンパイルできるレベル
これが実は本記事のお題でした。
ハードウェアの設計現場では図面や回路などコンピュータの支援を受けて矛盾や不適合が可能な限り最小化されているのにくらべて、ソフトウェアの設計現場では伝統的に自然言語によるテキスト記述がまだまだ一般的です。
記入する枠としてはmarkdownやExcelまたはシステム画面の入力フォームで記述内容の大枠は決められている現場は多いと思いますが、考案されたロジックが妥当であるかどうかの検証はよくて人間系のデザインレビューにとどまっています。

# おわりに
設計情報をコンパイルときくと、めんどくさい、そこまで工数が割けないとか、いろいろあるかとは思いますが、システムの中核的なロジックは試作の意味も含めて、構造化された日本語対応のコンパイラを通過するかどうかだけでも検証する価値はあるような気はします。
実行可能かどうかまではいかないにしても、想定しているデータ構造・型の組み合わせ、変数名の定義漏れの検査を含めて、日本語プログラミング言語によるコンパイラを通してみるのは、後工程の生産性向上に寄与する気がします。
LaravelのマイグレーションでCHECK制約を設定する方法

# はじめに
タイトル通りにはなりますが、LaravelのマイグレーションでCHECK制約を設定する方法について書いています。  

# CHECK制約とは
SQLで使える制約で、データを追加・更新する際、指定した条件を満たさない場合はデータを保存できないようにするものです。
例えば年齢を保存するカラムに対して18以上しか保存できないようにするなどの使い方があります。

# 前提
* Laravel：9.24.0
* PHP：8.1.13
* MySQL：8.0.31

# 設定方法
まずはマイグレーションファイルを作成します。  
```sh
php artisan make:migration create_users_table
```

マイグレーションファイルの中でDBファザードの`statement`メソッドを使ってCHECK制約を設定します。  
`statement`は引数に`SQL`文を入れて実行することができます。  
```php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->integer('age');
            $table->string('phone_number')->unique()->nullable();
            $table->string('email')->unique()->nullable();
            $table->string('password');
        });

        // ageが18以上であるかどうかをチェックする
        Schema::table('users', function (Blueprint $table) {
            DB::statement('ALTER TABLE users ADD CONSTRAINT check_age_over_eighteen CHECK (age >= 18);');
        });

        // phone_numberかemailのうち、少なくともどちらか一方はNULLでないことをチェックする
        Schema::table('users', function (Blueprint $table) {
            DB::statement(
                'ALTER TABLE users ADD CONSTRAINT check_required_phone_number_or_email
                CHECK (phone_number IS NOT NULL OR email IS NOT NULL);'
            );
        });
    }
    
    public function down()
    {
        Schema::dropIfExists('users');
    }
}
```
CHECK制約は下記のように設定します。
```php
ALTER TABLE { テーブル名 } ADD CONSTRAINT { 制約名 }　CHECK ({ 制約 });
```

以上になります。
【備忘録的メモ】NeoPixelをmicro:bitで使うときに条件を変えるとどのくらいの電流が流れるか測ってみた

micro:bitでNeoPixelを使う時は使うLEDの個数を増えせば増やすほど多くの電流が流れます。

明るさを暗くするなどの対応はとれますが、実際にどの程度の電流が流れているかテスターで測ってみました。

V1を使っていましたので上限は90mAのはずですがそれを超えてもなんとか動作し、150mAを超えるとさすがに動作が不安定になるという結果となりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71746/d9aa16b3-3779-f364-5f5e-0dec68480384.png)



https://docs.google.com/spreadsheets/d/16IReubpp-Hw8CPQySj9UmvyUbkD2SiIGC_WKH5dKtj8/edit?usp=sharing


なお、参考までにmicro:bitの仕様としては

>micro:bitボードは無線などを含めて最大で30mAを消費するので，エッジコネクタから取り出せる電流は90mAまでです。
micro:bit v2では3.3V電圧レギュレータの最大電流は300mAとなっています。
micro:bitボードは無線などを含めて最大で90mAを消費するので，エッジコネクタから取り出せる電流は210mAのはずですがWeb資料では190mAまでとなっています。

https://coskxlabsite.stars.ne.jp/html/for_students/microbit/powersupply/powersupply.html#:~:text=micro%3Abit%E3%83%9C%E3%83%BC%E3%83%89%E3%81%AF%E7%84%A1%E7%B7%9A,300mA%E3%81%A8%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82


とのことです。
SAML認証によるSSOをDockerのKeycloakで構築する

# はじめに
SAML認証によるシングルサインオンをアプリケーションに実装するため、開発環境にセットアップしていきます。
SAML認証そのものについては割愛。

## 準備
ローカル環境にDockerとDocker ComposeがあればOK。

## docker composeの設定

Keycloakの設定をデータベースに保存しておきたいのでmysqlのイメージも利用します。

```yaml
keycloak:
    image: quay.io/keycloak/keycloak:21.0.2
    command: start-dev
    depends_on:
      - mysql
    ports:
      - 18080:8080
    environment:
      KC_DB : mysql
      KC_DB_URL: jdbc:mysql://mysql:3306/keycloak
      KC_DB_URL_DATABASE: keycloak
      KC_DB_USERNAME: root
      KC_DB_PASSWORD: password
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: admin
```

これでdocker compose upするだけです。

## Keycloakの設定
http://localhost:18080
上記をブラウザで表示してAdministration Consoleから上記ユーザとパスワードでログインします。

ログインできたら新しいRealmを作成します。

![スクリーンショット 2023-12-01 21.49.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6404/71a51f02-e0e9-bf75-478b-b790e0f0c39f.png)

Clientsから新しいクライアントを作成します。

![スクリーンショット 2023-12-01 22.09.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6404/49023bd7-93df-fc22-3815-6f4ca1bd57b4.png)

![スクリーンショット 2023-12-01 22.27.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6404/6e897d0b-4746-4543-d105-ebcf2af1ae16.png)

IDP-Initiated SSO URL nameに入力したのち、下側にでるURLを控えておきます（あとからでもOK）


Usersから新しいユーザを作成します。

![スクリーンショット 2023-12-01 21.56.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6404/e47759ba-e13a-e3fb-ae53-51c2f82e3d70.png)

Credentialsのタブからパスワードを設定します。

![スクリーンショット 2023-12-01 21.58.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6404/62045390-9f1c-e4d2-1c3e-0df27c5778f0.png)

Keycloak側の設定は以上です。

## その他

アプリケーション側の設定は言語やライブラリによって様々なので詳細は省きますが、必要なのは、

```
ENTITYID
SSO_URL
x509
```

の辺り。

SSO_URLは上記で控えたURL
ENTITYIDとx509はRealm settingsのGeneralタブにあるEndpointsから取得します。

![スクリーンショット 2023-12-01 22.14.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6404/e8997043-633f-9efd-e623-9837cbc1877a.png)

entityIDとX509Dataの値がそれです。

![スクリーンショット 2023-12-01 22.18.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6404/1c1989a9-22c0-9c22-d602-2a068d08f46e.png)
センサ類を接続する前提でMilk-v duo用Duo USB&Ethernet IOBを使用する

## はじめに
秋葉原ロボット部の有志で、milk-v duoを購入し、個々人が様々な実験を行って、勉強会内で報告しています。

Milk-v duoは9ドルのrisc-vコンピュータとして知られています。
ハードウェアは以下の通りです。

1. CPUはCVITEKのCV1800B (C906@1Ghz + C906@700MHz)
2. 最高1 GHzで動作するデュアルRV64コア
3. 64 MBのラム
4. オプションのアドオンボードを接続すると10/100Mbpsの速度でイーサーネットに接続可能

Milk-v duoの周辺機器には、Duo USB&Ethernet IOBという、4つのUSB端子と有線LAN端子、UART端子を利用可能にするボードが存在します。
https://milkv.io/docs/duo/io-board/usb-ethernet-iob

このボードに、ピンヘッダを取り付けたmilk-v duo本体を接続すると、I2Cなどの端子が利用しにくくなります。
そこで、ピンヘッダではなく足の長いピンソケットを使って、本体とボードを接続します。

## 足の長いピンソケット
Milk-v duoでは、1x20のピンソケットを用います。
Pico用20ピンコネクタ(足長ピンソケット)　が使えます。

## テグスプロトタイピングで本体、ソケット、ボードを接続
Milk-v duo本体とボードのLAN端子は、本体裏からポゴピンで接触しています。
したがって、ソケットのプラスチック部分を本体に接触してはんだ付けしてしまうと、LAN端子との接続ができなくなります。
高さの調整が難しいので、調整可能なテグスプロトタイピングで、接続します。
以下の記事を参考にしてください。
https://qiita.com/kazueda/items/18128ff8f951161a424f
<font color="Red">**くれぐれも、組み立ての最中に基板を壊さないように注意してください。**</font>
実際の位置は以下の様になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/6893c2b8-72ec-08a3-d289-2b170f23e362.png)

ボード上のソケットと足の長いピンソケットとのすきまの中間あたりに本体があります。
この状態ですと、LAN接続も実現しつつ、ピンソケットにセンサ類をジャンプワイヤで接続可能となります。

## おわりに
テグスプロトタイピングの良い点は、組み立て分解が可能で、微調整の必要な配置をあらかじめ決められる点です。
位置の調整がうまくいったら、テグスを取り除いてからはんだ付けするのもいいかもしれません。
<font color="Red">**くれぐれも、組み立ての最中に基板を壊さないように注意してください。**</font>
大事なので2回書きました。
オススメの無料学習サイトfreecodecamp

- freecodecampのBasic JavaScriptを終えました。
progateやdotinstallなどで、JavaScriptを勉強していましたが、今回はfreecodecampで復習してみました。
freecodecampはyoutubeとウェブサイトで、無料でプログラミングを勉強することができます。次はJavaScriptでゲームを作る講座を観てみようと思っています。
- 現在は、学ぶ意欲さえあれば、無料で学べる教材があちこちに落ちています。
Learning is the process of change of behavior or an increase in knowledge.とITF Academyのウェブサイトにありました。
興味のあるものを次々学び、change of behaviorしたいと思います。

<a href="https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/">オススメの無料学習サイトfreecodecamp</a>
docker-compose buildに必ず挫折するload metadata for docker.io/library/…というエラーを潰す

## 今回の構築環境

- Mac Intel + macOS Ventura(Version 13.4.1)
- Docker Desktop(v4.25.2)

Dockerで環境構築を行なった際に、タイトルが述べられたエラーが二回出ましたので、念のためメモしときます。

## エラーの背景

`docker-compose up -d --build` で実行する際に何度もこのようなエラーに遭遇しました。

```
...中略...
=> ERROR [api internal] load metadata for docker.io/library/...
...中略...

------
 > [api internal] load metadata for docker.io/library/composer:2.5:
------
failed to solve: composer:2.5: failed to do request: Head "https://registry-1.docker.io/v2/library/composer/manifests/2.5": dialing registry-1.docker.io:443 with direct connection: connecting to ******: dial tcp ******: connect: operation timed out
```

つまりこのエラーのせいで、タイムアウトという結果になってしまい、結局環境構築ができなくなりますね。

## 調べてみたら…？

解決策を調べてみたら、私は三つの方法でやってみました。

### 方法1（もう解決できなさそうな方法だと思う）

一番目のよくある解決策は、DockerのSettings→generalでUse Docker Compose V2のチェックを外すこと。

しかし、私の画面だと、そもそも「Use Docker Compose V2」という箇所は…

無いですね！

[Dockerの公式ブログ記事](https://www.docker.com/blog/new-docker-compose-v2-and-v1-deprecation/)で調べてみたら、とてもでかい文字で「****Compose V1: So long and farewell, old friend!（Compose V1: 我が友よ、さようなら！長くお世話になりました！）****」書かれています。

![Docker-Compose-v1-end-of-life-timeline.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/816933/b9e771fb-bc19-a7f7-edde-a5b7c4b15b8e.png)

詳しく説明すると、2023年4月からはじめ、ユーザーがもう`disable-v2`という関連コマンドを使えなくなりますね。

だからチェックを外せないということですね！

記事でよく書かれている解決方法はいつか使えなくなる恐れがあるので、念のため、公式ブログなどをチェックすることも忘れないでください。

### 方法2（効くか効かないか自分の運次第で決まるという方法）

これもよく書かれている方法ですが、理由もわからないほど効く時もあります。

それが：

- Dockerのバージョンをアップデートして再起動します
- あるいはとにかくDocker Destopをリスタートします
- `docker-compose disable-v2`（V2を一回無効化）から再び`docker-compose enable-v2`（V2を有効化）へ

方法2での言い方が良くないと認めますが、ダメ元としてやってみたら効くケースもあります。

良かったら使ってみてください。

### 方法3（この方法で解決できました）

Docker Desktopにも設定できるケースですが、Settings→Docker EngineでJSONのコードを少しだけ修正します。

こちらの記事に参考になりました：https://shiimanblog.com/engineering/error-internal-load-metadata/

私の場合だと：

```json
{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "experimental": false,
  "insecure-registries": [
    "docker.io"
  ] 
}
```
この中に追加したいのは：
```
  "insecure-registries": [
    "docker.io"
  ] 
```


JSONの文法が間違えなければ、一旦`Apply&Restart`を押します。

再起動してから、奇跡が出るかどうかをよく検証してくださいね。

できなければ、方法2という運ゲーと併用することもいいかも！

## 後書き

今回は`docker-compose up -d --build` で実行する際によく出たエラーについて、自分がいま試した方法を紹介しました。

まだ理解できないところがいっぱいありますが、やはりDockerで環境構築することがいいということも認めます。

ただ、次回同じような問題がまた出たら、冷静に解決できるように願っております。
【SwiftUI】3Dマップと2Dマップを切り替える（iOS17）

# はじめに
iOS17のMapKitに関する記事をいくつか書きました。
新規のはまだまだあるので記事にしていきます。

今回は3Dと2Dの切り替えです。

# サンプルアプリ
![Simulator Screen Recording - iPhone 15 - 2023-12-01 at 22.28.25.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/9bb742cb-3d08-50d2-6481-ca0af686743c.gif)

# 実装
```swift
import SwiftUI
import MapKit

struct ContentView: View {
    // 東京駅の座標
    @State private var position: MapCameraPosition = .region(.init(
        center: .init(latitude: 35.681236, longitude: 139.767125),
        span: .init(latitudeDelta: 0.005, longitudeDelta: 0.005)
    ))

    var body: some View {
        Map(position: $position)
            .mapControls {
                MapPitchToggle()
            }
    }
}
```

# 解説
今回の新機能は2つあります。
1つ目は`mapControls`です。
`mapControls`の中に追加するとマップの左上にViewが表示されます。
```swift
.mapControls {
    // View
}
```

2つ目は`MapPitchToggle`です。
これが3Dマップと2Dマップを切り替えている機能です。
```swift
MapPitchToggle()
```

# おわり
まじで便利になりましたねー
ピンのグルーピングはできるんですかね？

# 公式ドキュメント
https://developer.apple.com/documentation/mapkit/mapscaleview/4234522-mapcontrols

https://developer.apple.com/documentation/mapkit/mappitchtoggle
Proxmoxについて知る

# Proxmoxについて知る
Proxmox Virtual Environmentを触ってみるにあたり調べてみたことをまとめました。
## Proxmox Virtual Environmentとは
オープンソースの仮想化プラットフォームです。webの管理画面から複数の仮想マシンやLinuxコンテナの管理が行えます。debianベースでKVMを使用した仮想マシンとLXCを使用したLinuxコンテナを一つの管理画面から行えることが特徴とされています。
![管理画面と２つのVMにアクセスしている図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959926/4e5f7401-a206-1cd7-0f37-0708a8c38640.png "管理画面と２つのVMにアクセスしている様子")

### サブスクリプションの有無による違い
ドキュメントにはそれぞれのリポジトリについて以下のように説明されています。
* Proxmox VE Enterprise Repository(有料 サブスクリプションあり)
`
This is the default, stable, and recommended repository, available for all Proxmox VE subscription users. It contains the most stable packages and is suitable for production use. The pve-enterprise repository is enabled by default:
`
https://pve.proxmox.com/wiki/Package_Repositories#sysadmin_enterprise_repo
* Proxmox VE No-Subscription Repository（無料 サブスクリプションなし）
`
This is the recommended repository for testing and non-production use. Its packages are not as heavily tested and validated. You don’t need a subscription key to access the pve-no-subscription repository.
`
https://pve.proxmox.com/wiki/Package_Repositories#sysadmin_no_subscription_repo



サブスクリプションに加入すると安定した（無料版に比べよりテストした）パッケージリポジトリのProxmox Enterprise Repositoryにアクセスでき、技術サポートを受けることができるようです。
[サブスクリプションについての情報](https://www.proxmox.com/en/proxmox-virtual-environment/pricing)
私が調べた限りでは、無料版のリポジトリであっても機能の制限等はなく使えるようです。

## 導入
自宅のデスクトップに導入しました。
パソコンのスペックは以下の通りです。
| |  |
|:-:|:-:|
| CPU | Ryzen 5 5600G   |
|  RAM | 16GB  |
|  SSD | 1TB  |

[推奨スペック](https://www.proxmox.com/en/proxmox-virtual-environment/requirements)


インストールした際の手順は別で投稿したのでそちらをご覧ください。

https://qiita.com/C_Kenta/items/70ecb32495fce9e1de52
## 公式URL
https://www.proxmox.com/en/

https://pve.proxmox.com/pve-docs/
windowsで共有ライブラリのシンボルを調べる


dumpbinコマンドをインストールする必要があります。
dumpbinはVisual Studioをインストールしないと使えないのでVisual studioをインストールします。
(Visual studio community 2019は配布されなくなりました。2019でないとダメな人は有償版を買うか、BuildToolsをインストールしましょう。)

```powershell
winget install Microsoft.VisualStudio.2022.Community
```

こうするとdeveloper command promptを起動するかvisual studioのターミナル部分からdumpbinを実行することができるようになります。
が、Powershellやその他のツールからも実行したいですよね？

ということで環境変数PATHにdumpbinへのPATHを通します。

```powershell
$Path = Get-ItemProperty HKCU:\Environment\ -Name Path

$Path.Path += ";C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.37.32822\bin\Hostx64\x86"

# 値確認。
Write-Output $Path.Path

Set-ItemProperty HKCU:\Environment\ -Name Path -Value $Path.Path
```

結構不細工なコードになりますが、これが環境変数を操作する上で一番安全な操作です。
windowsには環境変数のバグがあるのでレジストリから環境変数を操作することをお勧めします。

これで下記のように実行するとシンボルを取得することができます。

```powershell
dumpbin /exports C:\Windows\System32\Kernel32.dll
```
Next.jsでTOPページと下層ページで条件分岐をさせる方法

Next.jsで現在Webサイトを作っていて､TOPページと下層ページでヘッダーにあてるCSSを変えたくなりどうやってやるんだろうとなって調べたのでまとめておきます｡
ちなみにNext.jsははじめて書いているので､この書き方が最適化どうかもわかっていないのでもしもっといい書き方あるよという方は教えていただけるとうれしいです！

## usePathname()を使う
```javascript
import { usePathname } from 'next/navigation'

const path = usePathname()
```
`usePathname`を使うことでアクセスしたときのパスを取得することができます｡
```
結果
http://localhost:3000/
→ /

http://localhost:3000/worksにアクセスしたとき
→ /works

http://localhost:3000/works/hello
→ /works/hello
```

このパスを使って条件分岐を実装します｡
トップページかどうかの変数を定義します｡

```javascript
  const path = usePathname()
  const isTop = path === '/'
```

TOPページのときには`isTop`にtrueが入って､それ以外のページではfalseになります｡

あとは､CSSの箇所で`isTop`を書いて当てたいCSSを記述します｡

```html
<header className={`${isTop ? 'absolute' : 'relative'} w-full py-3`}>
```

## まとめ
`next/navigation`には`useParams`と`useSearchParams`もあるみたいですがまだ使い分けの方法など調べられていないので､調べてみようと思います｡
macのvirtualenvとpyenvメモ

## virtualenv 
- ディレクトリ作成
`mkdir hogehoge`
- ディレクトリ移動
`cd hogehoge`
- 仮想環境作成
`virtualenv venv`
- 仮想環境へ入る
`source venv/bin/activate`
- 仮想環境から抜ける
`deactivate`
 - pythonのバージョンを指定して仮想環境を作成する
 `virtualenv -p python3.9.6 venv`

## pyenv
インストール方法は[こちら](https://github.com/pyenv-win/pyenv-win)のGithubを参照
- インストールできる一覧
`pyenv install --list`
- インストールする
`pyenv install 3.8.6`
- localに指定しているpythonのバージョンを確認する
  `pyenv local`
- localを指定すると実行したディレクトリ内だけで、Pythonのバージョンが固定されます。
`pyenv local 3.6.8`
- globalは、フォルダを超えてもそのバージョンが使われます。
`pyenv global 3.6.8`
40代半ばからのエンジニア①

＜背景＞会社では、ウェブサービスを開発している。自分自身がモノづくり何もできてない。２回目の起業。今回、モノヅクリニコダワロウと。お客様に価値を届けられるようになりたい。
　
　
　
　
　
　
＜現状＞今年から、新たにモノづくりを始める見習いとして、ボチボチ活動。
過去の経験①学生時代、アルバイトで、ホームページの更新作業
過去の経験②前職時代、SQLのセレクト文をちょこっと。
　
　
　
　
　
　

＜システムを学ぶ上で大切だなと思うこと＞
１）新しい世界に対する強い好奇心。当然だが、これが弱いと、強制されてない中、前に進む力が弱い。
２）メタ認知。問題解決力が大切だと思うが、問題解決するためには、40代までに染みついた物事の見方を俯瞰していく事が、問題解決に繋がるように思う。自分自身の習熟・理解に対する問題解決、自分自身の時間アロケーションに対する問題解決、アプローチの仕方・やり方に対する問題解決など、メタ認知ができていると、問題解決に繋がるように思う。
３）本質理解：これも、問題解決力に繋がるところかと。付け焼刃ではなく、時間はかかっても、本質的な所を理解することによって、pitfallにはまった時や障がいが起こった時に何をどうすればいいのか、考えられるかと。
　
　
　
　
　
　

＜いまいま＞実践やりながら、基礎も学ぶ。例えば、vsCode/vue.js/python/dockerを使っているが、そもそもの、コマンドラインになれず、GUIとCUIの「インストールの違い」について、気になり、chatGPTに聞いてみる。GUIだと、ダウンロードとインストールが切り分けられている、等、CUIだとインストールとダウンロードが切り分けられてないところに違和感がありました。「インストール」という言葉をそれ以上不可星もしたことなく、思考停止だったが、どのパッケージか検索と選定のプロセス、解凍と配置の実行、依存関係のチェック、コンパイルとビルド、設定（preference　例：テーマカラーの色の好み）と環境設定（control panel　例：室内の温度等）などしてくれてるなど、全く考えてませんでした。
課題：結局ペースが遅くなってしまうリスクがあるので、excitingと感じるところをやることにより、エネルギーで推し進めたい。
Swift での Singleton Pattern とその注意点


## 最小限の実装

```swift
class SomeManager {
    static let shared = SomeManager()
}
```

## init メソッドを制限

設計によって init をさせたくないばいは -

```swift
class SomeManager {
    static let shared = SomeManager()
    private init() {}
}
```

## 必ず `class` にすること

struct にすると、アサインするたびにコピーされ、新たなオブジェクトが作られるて、 singleton ではなくなりますので要注意です

```swift
struct SomeManager {
    static let shared = SomeManager()
    private init() {}
}
```

```swift
let someManager = SomeManager.shared
```
Nuxt.jsでのリダイレクト処理

# 記事概要
Nuxt.jsで```nuxt generate```で生成した静的ファイルにアクセスすると、なぜかURLの末尾に必ず"/"が挿入されてしまう。
```
【例】
/hoge          ⇒  /hoge/
/hoge?key=val  ⇒  /hoge/?key=val
```
それの解決方法。  

※nuxt.config.jsに、⇓この設定をしてもうまく行かず。
```js
trailingSlash: false
```


# 環境
開発環境
```
OS : windows 10
Node : v18.18.0
仮想化: nvm 1.1.11
WebServer: go1.16.6 => "net/http"で作成
```
package.json
```js
…
  "dependencies": {
    "@nuxt/content": "^1.0.0",
    "@nuxtjs/axios": "^5.13.6",
    "@nuxtjs/sitemap": "^2.4.0",
    "core-js": "^3.25.3",
    "nuxt": "^2.17.2",
    "vue": "^2.7.10",
    "vue-server-renderer": "^2.7.10",
    "vue-template-compiler": "^2.7.10",
    "vuetify": "^2.6.10"
  }
…
```
# 解決方法
redirect-moduleの導入で解決。参考URL【<a href="https://qiita.com/_y_s_k_w/items/16a54f5f11c6dbb6f4b9" target="_blank">nuxtでのリダイレクト設定について</a>】

## ➀ redirect.jsを作成
plugins\redirect.js\redirect.js
```js
export default function ({ route, redirect }) {
  if (route.path.slice(-1) === '/' && route.path !== '/') {
    const search = route.fullPath.match(/\?.*$/)
    if (search) {
      const redirectUrl = route.path.slice(0, -1) + search[0]
      return redirect(301, redirectUrl)
    } else {
      const redirectUrl = route.path.slice(0, -1)
      return redirect(301, redirectUrl)
    }
  }
}
```
参考にしたURLでは、"/"を付ける方法だが、今回は"/"を削除するのが目的。

## ➁ nuxt.config.jsにpluginsを追加

```js
…
  plugins: [
    { src: '~plugins/redirect', ssr: false }
  ]
…
```

# 最後に
このリダイレクト処理は色々応用が利きそう。
CORSってなに

# 完全に理解できる気がしないのであっさりと
JSでAPIをたたいた時にエラーが出たよ、iframeとかでも出るよ
## CORSとは
Cross-Origin Resource Sharingd です。
日本語ではオリジン間リソース共有です。
ブラウザとかで動いてます。
違うオリジンにアクセスする際に発動してアクセスできなかったりします。
## そもそもオリジンとは
* プロトコル
* ホスト(ドメイン)
* ポート
です。これらがそれぞれすべて同じものは同一オリジンとして解釈されます。

https://negishi-tako.com
http://negishi-tako.com
は別オリジンになります。なぜなら80番と443番でポートが違うからです。
## CORSの存在意義
XSSやCSRFを防ぎます。悪意のあるコードが実行されないようにして悪意のあるサーバとかにアクセスしないようにします。

## CORS回避
APIサーバを自分で持ってる場合:Access-Control-Allow-Originをヘッダーに追加する。
持ってない場合:プロキシサーバを利用する。CORS回避の拡張機能などを利用する。（非推奨）
mosya<TC> で中級までチームの皆で解いてみた

自分の事業部では、毎朝チームで朝会を実施してます。

自分が所属していたチームでは毎日1問、
脳の準備体操を兼ねてTypeScriptの型問題に取り組むことになりました。

`mosya<TC>`というType Challenge用のWEBアプリがあったので、チームで解いてみることに。

https://mosya.dev/type-challenges

## `mosya<TC>`初級編

Googleアカウントがあれば登録できるようなので、早速ログイン。

初級編だし、朝の頭の体操にちょうどいいよね〜。
と思っていましたが大間違いでした。

![017e9ffca642d4183b7abcaca077f35f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265957/0ef722f2-bfea-10a5-b820-c22df27d0f61.png)

> 初級編とは名ばかりで初見殺しです

結構な裏切りを何回も喰らいました。
（しかも前回の問題でやった内容とかなので余計悔しいです）

難易度としては以下のような感じです。

```ts
// JavaScriptのArray.include関数を型システムに実装します。
// この型は、2 つの引数を受け取り、trueやfalseを出力しなければなりません。

// Includesを実装してください
type isPillarMen = Includes<["Kars", "Esidisi", "Wamuu", "Santana"], "Dio">; // expected to be `false`

```

朝会のメンバーは4人いるのですが（全員Type Challengeとかは未経験）、全員でちゃんと悩んでギリクリアできるような難易度で、適度な楽しさを感じながらも、**後に控えている中級編**にドキドキしていきました。

この難易度でも、しっかりとヒントは活用していきました。（笑）

## `mosya<TC>`中級編

初級をなんとかすべてクリアして挑んだ中級編ですが。。。

![8ae4909f11d2dc5114ded10dfeee3a31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265957/6fdc87c9-a6e1-faca-299a-d0d2d89af374.png)

> 中級編とはいえないレベルで難しい。

文字通り、めちゃくちゃ難しくて全然解けませんでした。

ノーヒントクリアする時もあったんですが、初めて答えまで見る時もあったり、中には難易度が高いのにヒントが存在しない問題もありました。

でも、チームで「実務で使わないでしょ！」とか、「これはずるい！」とか言いながら問題を解いていくのは楽しかったです。

中級編はこんな感じ。

```ts
// Union 型を Union 型の値の順列を含む配列に変換するPermutation順列型を実装します。

type perm = Permutation<'A' | 'B' | 'C'>; 
// ['A', 'B', 'C'] | ['A', 'C', 'B'] | ['B', 'A', 'C'] | ['B', 'C', 'A'] | ['C', 'A', 'B'] | ['C', 'B', 'A']
```

## 上級編 to be continue...

正直中級編くらいのレベルが、朝会という限られた時間（10分くらい）の中で、ちょうど解けたり解けなかったりを楽しむことができます。

上記の難易度でもまだ行けそう、という方は是非上級編をお楽しみください。
（自分も時間が空いている時にやってみます。）

![da362137511dfbbde8666abad4173b28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2265957/5534d283-6571-2958-c032-f4dc342cc262.png)
Box社員はBox AIをどのように使っているのか！？

# Box AIとは
先日、Box AI for NotesとBox AI for Documentsのベータ版がリリースされました！

https://support.box.com/hc/ja/articles/22412110122771

### Box AI for Notes概要
簡単なプロンプトでコンテンツを数秒で作成できます。Box Notes内のコンテンツを選択して、要約したり、Box AIから得られた回答を修正することができます。

https://support.box.com/hc/ja/articles/22198577315347-Box-AI-for-Notes

### Box AI for Documents概要
自然言語でドキュメントに関して質問して、コンテンツから回答を得たり、スプレッドシートからインサイトを導き出したり、プレゼンテーションを要約できます。

https://support.box.com/hc/ja/articles/22158484213267-Box-AI-for-Documents

# Box社員はBox AIをどのように使っているの？
Box AI、なんだかとても便利そうですよね？でも、正直どんな使い方をすれば便利なんだろう・・AIってまだよくわからないし、、、という方も多いと思います！
そこで、Box Japan社員にヒアリングを行い、実際業務でどんな使い方をしているのか聞いてみました。

### Box AIを活用したBox社員の1日
Box AIを活用して、たとえば営業職の方は
* 大量のコンテンツを要約したり、BoxAIを壁打ち相手にしながら「お客様攻略プランを作成」し
* Box AIにアポを取得するためのメール文面を考えてもらい
* 商談で何を話すか、その資料のストーリーラインもBox AIにアドバイスをもらい
* 新たな情報から次に何をすべきかをまたBox AIを壁打ち相手として考える

といったように業務の効率化・質の向上をBox AIをフル活用して実現しています。

![営業の1日.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986270/594df959-8420-876e-92d4-949c45d19846.png)

代表的な使い方の詳細を3つほど記載します。

### Box AIを通訳にして言語の壁を突破
Boxの本社はアメリカにあるので、英語でのドキュメントやメールのやりとりも多いです。しかし全員が英語をすらすら使えるわけではない・・・そんなときにもBox AIは大活躍します！

　　　　　![通訳.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986270/206dd138-d8dc-8ac3-2cde-ccb8e3d6bcb3.png)

### 文章作成もBox AIにおまかせ
メールやSNS投稿の文面、1日に何度も考えなければならず工数が取られる・・・そんな日々からはさよならです。Box AIにお任せしてしまいましょう！

　　　　　![ b運小作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986270/703ebb92-0e7a-0ca4-8f6e-efec73b49bec.png)

### お客様に何を聞くべきかもBox AIがアドバイス
商談の準備、誰かに相談したいけど上司も同僚も空いていない・・そんな時はBox AIをぜひ相談相手にしてください！いつでもどこでも相談に乗ってもらえます！

　　　　　![ かべうち.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986270/2b9316bc-9320-fb73-1ec8-f031eb559c1e.png)

# さいごに：Box on Box (Box AI編)資料のご紹介
Box社員がどのようにBox AIを使っているか、その全てをまとめた資料は下記からご覧いただけます。ぜひご覧ください！

https://cloud.box.com/v/bononbox-boxai
【生産性向上】スタンディングデスクのすゝめ

## はじめに
こんにちわ。オルトプラスでサーバーサイドエンジニアやってます勝城です。

普段は社内プロジェクトでテックリードをしつつ、サーバーサイドエンジニアの採用担当をしております。

今年はCEDEC2023で登壇する機会があり、社内の活動やNFTゲーム開発のおける実装と運用のノウハウを紹介することができました。

講演資料は<a href="https://cedil.cesa.or.jp/cedil_sessions/view/2715">CEDEC Digital Library</a>にアップロードされていますので、ご興味のある方はどうぞ。

さてオルトプラスではコロナ禍が終わってもリモートワークを継続しており、私個人リモートワークをする上で以下の2点が重要だと認識しています。

・コミュニケーション
・生産性

今回"生産性"に焦点をあて、3年前から導入したスタンディングデスクについてご紹介しつつ、スタンディングデスクの良さを布教したいと思います。

本記事は <a href="https://qiita.com/advent-calendar/2023/altplus2023">オルトプラス Advent Calendar 2023</a> の12/12の記事です。

## 結論
![desktop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661678/48bbbf68-65a2-36d9-844d-b3218118e16b.png)

スタンディングデスクを導入することで集中力がアップし、仕事とプライベートのオンオフの切り替えがスムーズに行えるようになりました。

立ち作業では思考がスッキリし、長時間の作業でも集中できます。同時に運動不足の解消にも繋がり、リモートワークにおける生産性向上の1つの道具としておすすめします。

## 概要
この記事ではスタンディングデスクのメリット、デメリット、導入前と導入後でどれくらい生産性が向上したかを紹介します。

私が導入したスタンディングデスクは<a href="https://www.flexispot.jp/e7-set.html">FlexiSpot社のE7</a>というモデルです。

電動昇降式なので、ボタンを押すと事前に設定しておいた高さで立ち作業、座り作業ができ非常に便利です。

## スタンディングデスクを導入するメリット

スタンディングデスクを導入するメリットを3つ挙げてみました。

:::note info
・仕事とプライベートの切り替えができる
・運動不足解消と腰の負担軽減
・集中力がアップする
:::

リモートワークでは仕事とプライベートの境目がなく、常に同じ環境で過ごすことが多いと思います。

スタンディングデスクを導入後、仕事するときは立ってプライベートや食事の時は座ってというルールにすることでオンオフの切り替えがうまくできるようになりました。

また長時間座っていることは身体や心臓に負担がかかり健康に悪いという研究結果もある通り、立って仕事することで運動不足解消にも繋がります。

ここ3年程度立って仕事していますが、足腰は確実に強くなっています。

また座り姿勢から立ち姿勢に切り替えた直後から思考がすっきりする感覚（集中力がアップ）があり、設計する際や仕様書を読み込む時、コーディングする時にとても捗ります。

以上からリモートワークにおけるありがちな問題を解決し、生産性を上げてくれる1つの道具としてスタンディングデスクを推奨します。

## スタンディングデスクを導入するデメリット

次にスタンディングデスクを導入するデメリットを2つ挙げてみました。

:::note warn
・初期投資がやや高額
・慣れるまで時間がかかる
:::

私にとって今では手放せないスタンディングデスクですが、導入時や導入直後は少しデメリットを感じました。

まずスタンディングデスク自体やや高額であること。私が購入したE7というモデルは定価で6万円ほどします。

一般的なデスクだと1万円台から購入できるので、それを考えると初期投資が嵩みます。

導入直後は運動不足だったこともあり、1時間程度で足がパンパンになり慣れるまでは休憩を挟みつつ慣らしていきました。

今となっては逆に座って仕事する方が気持ちが悪いくらい立ち作業の方が捗っています。

## まとめ

リモートワークでは通勤時間がなくなり、時間を有効に使えるメリットがあるものの、プライベートとのオンオフの切り替えが遅れることで生産性にも影響します。

その生産性をあげる1つの方法としてスタンディングデスクを取り上げてみました。

今後も継続するリモートワークでの集中力や生産性といった部分でこの記事が参考に慣れば幸いです。

## 参考
・<a href="https://www.wantedly.com/companies/altplus/post_articles/872413">アフターコロナも継続中！オルトプラスのリモートワーク制度</a>
・<a href="https://www.flexispot.jp/spine-care-center/Five-benefits-of-a-standing-desk">スタンディングデスクの5つのメリット(FlexiSpot)</a>
・<a href="https://www.nikkei.com/nstyle-article/DGXKZO11574300S7A110C1NZBP01/">座り過ぎは寿命縮める？　心臓病や糖尿病のリスク上昇 立ってパソコン操作、奨励する企業も（日本経済新聞）</a>
RSpecでテストケースのテストを書きたい

[SmartHR Advent Calendar 2023](https://qiita.com/advent-calendar/2023/smarthr) シリーズ2の1日目です。

最近、あるメソッドに対してテストケースが漏れなく書かれていることを保証するテストがほしいと思うことがあったので調べてみた記録を残します。


どういうときにそのようなテストが欲しくなるか、具体例を見ながら説明していきます。

## 具体例
ここに2つの数値と演算子となる文字列を渡すと計算結果を返してくれる`.calc`メソッドを持つCalculatorクラスがあります。
現時点では足し算（`plus`）、引き算（`minus`）に対応しています。

```ruby
class Calculator
  AVAILABLE_OPERATORS = %w(plus minus)# 足し算、引き算のみできる

  def self.calc(left, operator, right)
    raise ArgumentError unless AVAILABLE_OPERATORS.include?(operator)

    case operator
    when 'plus'
      left + right
    when 'minus'
      left - right
    end
  end
end
```

このメソッドに対するテストを以下のように書いたとしましょう。

```ruby
RSpec.describe Calculator do
  describe ".calc" do
    context 'plus' do
      it { expect(Calculator.calc(1, 'plus', 2)).to eq(3) }
    end

    context 'minus' do
      it { expect(Calculator.calc(3, 'minus', 2)).to eq(1) }
    end

    context 'invalid operator' do
      it { expect { Calculator.calc(1, 'invalid', 2) }.to raise_error(ArgumentError) }
    end
  end
end
```

すべての処理を通っておりカバレッジは100%です。よかったですね。

その後、追加で掛け算、割り算にも対応することになったので実装しました。

```ruby
class Calculator
  AVAILABLE_OPERATORS = %w(plus minus times divide) # 掛け算、割り算もできるようにした

  def self.calc(left, operator, right)
    raise ArgumentError unless AVAILABLE_OPERATORS.include?(operator)

    case operator
    when 'plus'
      left + right
    when 'minus'
      left - right
    when 'times'
      left * right
    when 'divide'
      left / right
    end
  end
end
```

無事、掛け算や割り算を追加できちゃんと動くことも確認できました。おめでとうございます。

## 本題
しかし、ここからが本題。この実装をした時点でテストの追加を忘れていた場合でもテストはパスしてしまいます。コードレビューでも見逃してしまった場合、テストがない状態で本番にリリースされてしまいます。

また今回はケースが4つだけなので仮にすべてのテストケースが書いてあったときには書かれている！とわかりますが、ケースが数十にもなってくる場合、全てのテストケースを網羅できているかどうか目で見て判断することは難しくなってくると思います。

この抜け漏れの防止を仕組みで解決したいというのがモチベーションでした。

## どうすればいいのか
調べたりChatGPTとお話したりCopilotに導かれるまま指を動かしてみたりしました。

するとRSpecにはメタデータを取得するメソッドが用意されており、それを使うことでやりたいことを実現できそうでした。


```ruby
RSpec.describe Calculator do
  describe ".calc" do
    it 'すべての演算子のテストが存在すること' do
      # テストのタイトルを取得する
      example_descriptions = RSpec.current_example.example_group.children.map(&:description)
      # => ["plus", "minus", "invalid operator"]
 
      Calculator::AVAILABLE_OPERATORS.each do |operator|
        expect(example_descriptions).to include(operator)
        # => times、devideのテストがないのでfailedとなる
      end
    end

    context 'plus' do
      it { expect(Calculator.calc(1, 'plus', 2)).to eq(3) }
    end

    context 'minus' do
      it { expect(Calculator.calc(3, 'minus', 2)).to eq(1) }
    end

    context 'invalid operator' do
      it { expect { Calculator.calc(1, 'invalid', 2) }.to raise_error(ArgumentError) }
    end
  end
end
```

これで、演算子を追加したらテストの追加も強制することができるようになりました。

## まとめ
他にもカバレッジをきちんと計測する方法など解決手段はいくつかあると思います。テストケースのテストをすることの是非についてはまだあまり考えられていないですが、少なくともこういったケースでは有効なこともあるんじゃないかと思っています。

今回の調査でRSpecのコードも少し読んだのですが、こんなメソッドもあるんだ便利〜とよい勉強にもなりました。
軽深演習 #2 関ケ原

### 軽深（かるしん　なんちゃって圏論） Advent Calendar 2023 2日目の記事です。
演習形式をとっているので、ぜひ　回答を試みてください。

### 圏とは、

圏論は圏を扱う数学の基本理論です。圏が何だか分からないとさすがまずいので、説明します。簡単な内容なんですが、実は、桁違いに難しいです。

- 対象の集まりがあって対象がある
- 対象間に　射（矢印）がある　（例）A　→ B
- 恒等射：対象が同じ、何もしない射がある
- 射の合成：射は合成できる  A　→ B　→ C なら、A　→  C と合成できる
- 結合律：射は適用の順序をかえてもよい　  (A　→ B)　→ C 　　A　→  (B　→ C ) (注)厳密ではないけど、

### 圏の具体例
圏論はCategory theory というくらいなので、分類でとりあえず説明します。
- 種族を対象の集まりとします。
- 属することを射とします。（例）　猫　→　動物
- 恒等射：　猫は猫　（対象は同じ対象に属するとします。）
- 合成：　猫　→　動物　→　生物　なら、猫　→　生物　もいえます。
- 結合律：　猫　→　動物　　と　動物　→　生物　はそれぞれ成り立ちます。

# 演習　関ケ原の戦い　で西軍の敵、味方の分類はどんなものがあるか
射がひとつの単純な場合を考えます。

細川　→　西軍の味方
小早川　→　西軍の味方か敵かわからない

敵、味方の分類をすると、分からないがでてきます。
実際には、どんな分類も　分類できない対象がでてきます。
では、味方か敵かわからない　以外にはどんな分類があるでしょうか？
この演習は、想定外はどう分類できるのかという演習とも共通点ありです。

こんな単純な事例でも、なんか実践的に役立つ気はしませんか？
関ケ原では、小早川の行動は、勝敗を決める重要な要素でした。

プログラミングの世界では、想定外はエラー処理そのものです。
プログラミングしたことのある人なら、エラー処理が手間がかかり、かつ重要だという実感はお持ちでしょう。
リーダブルコードから学んだこと【前編】

## はじめに
こんにちは。エンジニアを目指す大学３年生です。

最近、オライリー・ジャパンの[リーダブルコード](https://amzn.asia/d/3864jsR)を読んだので、
備忘録がてらに学んだことを残そうと思います。

この本では「良いコードとはなにか」について、真面目すぎず面白く、
しかも分かりやすく述べられています。読んでいて楽しかったです。

この記事では、リーダブルコードを読んでから気づいた、
今まであまり意識していなかったことや、印象に残った部分に絞って書きます。
一つの記事にまとめるとボリュームが大きくなりすぎるので、２つの記事に分けます。

前編、後編を通して、以下の4つを扱います。
- 他人は未来の自分
- 誰が見ても処理がわかる命名をする
- コメントは、理解が早くなるように書く
- 理解しやすいコードは短い

この記事が、
新しい気づきを得たり、知っていることを復習するきっかけになれば嬉しいです。

## 他人は未来の自分
### 結論
**わかりやすいコーディングは他人のためであり、その他人の中には未来の自分も含まれます。**
自分だけで実装しているプロダクトだからといって、
わかりやすいコードを書く努力をしないのはナンセンスです。
自分のためにも、わかりやすいコードを書くことを心がけると良いです。

### 詳細
コードはできるだけ分かりやすく書く必要がありますが、それはなんのためでしょうか。
答えは、**他人がコードをすぐに理解できるようにするため**だと思います。

では、自分一人で開発しているプロダクトでは、分かりやすく書く必要はないのでしょうか。
答えは、Noです。どうしてでしょうか。

それは、**「他人」には、未来の自分も含まれる**からです。
どうして自分なのに他人なのかというと（何か哲学的な文ですね笑）、
人はだいたい自分の書いたコードをそんなに先まで覚えていないからです。

自分が書いたコードを少し後に見返して、「なんだこれ」となった経験はありませんか？
私はしょっちゅうあります（汗）。

このように、「自分の頭の中にないコードを見る立場」という意味で、自分も他人に含まれます。

### 今後意識したいこと
開発の生産性を上げるため、
自分にも他人にも理解しやすいコードを書く！
ということを**意識して**コーディングしていきたいです。

## 誰が見ても処理がわかる命名をする
### 結論
プログラム中で何かを命名するときは、
**他人から見てわかりやすい命名になっているか**を確認することが重要です。

### 詳細
変数名、定数名、関数名、クラス名...
プログラムを書いていると、何かしらを命名する機会がたくさんあります。

これらは、すべて他の人から見て処理がわかりやすい命名になっていることが望ましいです。

例えば、「filter」という関数名は、
条件に合うものを取り除くのか、それとも抽出するのか、不明確です。
取り除くならexclude、抽出するならselectなど、意味が明確になる単語を選ぶのが良いです。

また、他の例として、
「get」という関数名は、一般的にはデータを取得するだけの軽い処理という認識がされています。
そのため、複雑な処理を実行する関数名に「get」をつけてしまうと、
意図せず処理に時間がかかりすぎてしまうことがあります。

このように、自分の書いたプログラムを読んで理解できるかだけでなく、
使う立場の人が自分のプログラムをどう思って使うのかまで想像して、命名する必要があります。

### 今後意識したいこと
何かしらの命名をするときには、「なぜその命名にしたのか」を答えられるように、
一つ一つの命名に責任を持ってコーディングしていきたいです。



## 最後に

私は今まで、AtCoderなどの競プロに取り組んできて、
「競プロなら変数名とかテキトーで良いでしょ」と思って実装していました。

ただ、テキトーに実装していると、処理が複雑になってきたときに
iってなんだっけ？
a_listってなんぞや？
と思うことがよくありました。

なので、
この本を読んで「未来の自分も他人」ということにすごくハッとさせられました。

これからは、自分しか読まないコードでも、
リーダブルなコードを意識してコーディングしていきたいです。


参考文献：[リーダブルコード](https://amzn.asia/d/3864jsR)
CircleCI の 2023年を振り返る

[CircleCI Advent Calendar 2023](https://qiita.com/advent-calendar/2023/circleci)の12/1を担当します CircleCI Developer Advocate の @mfunaki です。

# 2023年1月4日 - セキュリティインシデント
CircleCI の2023年を振り返ると、年初は1/4のセキュリティインシデントでご利用いただいていた皆さまには多大なるご迷惑をおかけしてしまいました。
- ブログ「[CircleCI 2023年1月4日セキュリティインシデントに関するインシデントレポート](https://circleci.com/ja/blog/jan-4-2023-incident-report/)」

単純な不注意がきっかけになったというよりは、明確な侵入の意図を持ち、さまざまな手段をとった攻撃者によって引き起こされたと考えています。その後、攻撃に対する強靭さを備えるための仕組化が社内でも進められ、また、OIDCサポートの強化やシークレットのローテーション、監査ログ出力などのサポートを強化してきました。
- ブログ「[AWS へのアクセスに Open ID Connect(OIDC) を使用する](https://circleci.com/ja/blog/circleci-aws-oidc/)」

# CI/CDがIT系企業から事業会社に広がり始める
CircleCI のお客様が従来はいわゆるIT系企業さまが圧倒的に多かったのが、最近では、事業会社さまが増えてきています。自社で開発をしようというお客様であれば、「CIやCD」の言葉の意味を説明するところから始める必要はなくなってきているのを感じます。CircleCI も[設定ファイルのポリシー管理機能](https://circleci.com/docs/ja/config-policy-management-overview/#how-config-policy-work)のように、YAMLで書けば何でもできるではなく、組織でポリシーを設定しておき、書いてもできないようにするといった統制が広く受け入れられた年でした。
- スライド 「[CircleCIで実現できる「高速、安全なソフトウェア開発](https://speakerdeck.com/mfunaki/circlecideshi-xian-dekiru-gao-su-an-quan-nasohutoueakai-fa)」 の 「[よりフレキシブルなポリシー設定](https://speakerdeck.com/mfunaki/circlecideshi-xian-dekiru-gao-su-an-quan-nasohutoueakai-fa?slide=32)」以降

# CircleCI、独自のアカウントを持つ
また、古くから利用されている方はお気づきになられていないでしょうが、CircleCI も独自のアカウントを持つようになりました。
GitHubアカウント経由やBitbucketアカウント経由でCircleCIにログインするのではなく、CircleCI アカウントでログインし、必要に応じて GitHub や Bitbucket、GitLab上のリポジトリ上のプロジェクトをビルド、テスト～デプロイできるようになっています。
- Qiita [【2023年版】CircleCIにサインアップ(Sign up)](https://qiita.com/mfunaki/items/14080547b352be9d265c)
- Qiita [【2023年版】CircleCI で GitHub プロジェクトをビルド＆テストする](https://qiita.com/mfunaki/items/7a68fd137e936798b391))

# CircleCI、AI/MLワークロードのサポートを強化
CircleCIの12年の歴史を駆け足で見ると、
- CI/CDプラットフォームをSaaSで提供
- モバイルアプリケーションのビルド、テスト、リリースをサポート
- バージョン 2.0でよりスケーラブルな構造に
- 各種ダッシュボードによる見える化、インサイトによる分析機能の提供
を経て、前述の独自のアカウントを持つに至っています。つまり、
- バージョン管理システム(GitHubなど)へのコミット＆プッシュ以外のトリガーをサポート(インバウンド Webhook)

ということで、私も公式ブログを書いています。
- ブログ「[Optimize your MLOps pipelines with inbound webhooks (インバウンド Webhook で MLOpsパイプラインを最適化)](https://circleci.com/blog/mlops-trigger-inbound-webhooks/)」

こちらのブログはCircleCIとHuggingFaceとの連携を取り上げていますが、まだ日本語版が用意できていないのと、公開にあたって(Webhookの機能にかかわる箇所以外を大幅に削ってしまったので)、日本語版をアドベントカレンダー向けに公開する予定です。

また、CircleCI も出展した AWS re:Invent 2023 Las Vegas に合わせてリリースした[Amazon SageMaker](https://aws.amazon.com/jp/sagemaker/)との連携についても、クリスマス前にご紹介できればと思います。
- [CircleCIからAWS SageMakerを利用する(1)](https://qiita.com/mfunaki/items/319e0fd4c3c6077732b9)
Error: cannot estimate gas に遭遇したらここを見る

## はじめに
EVMチェーンにトランザクションを送ろうとした時、
謎の `cannot estimate gas` エラーに遭遇したこと
あなたもありませんか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181210/a8e032d5-82aa-2618-994a-496c053cc041.png)

具体的なエラー理由も特に出てこないし、どう直していいかわからない。。
そんな経験でデスクを濡らしたことのある人も多いかと思います。

もうそんな思いをしなくてもいいために、解決法をまとめました。

## チェック項目一覧
#### コントラクトアドレスとABIは正しいか
そもそも存在しないアドレスを指定してました、とかよくあります。
特にプロキシ利用時は下記注意です。
- Implementationでは無く、Proxyコントラクトを指定しているか
- ABIが最新のImplementationのものになっているか

#### 関数セレクタは正しいか
`hoge(uint256)`と`hoge(uint256,uint256)`は違う関数です。
同じ関数名でも、引数の型が完全に一致していないと呼び出せません。

特に引数に構造体を指定する時は完全一致しているか念入りに確認しましょう。

#### RPC Nodeサービスを利用しているか
[ChainList](https://chainlist.org/)とかにのってるパブリックRPC URLを使用すると繋がらないことがよくあります。~~これ知らなくてQA前に徹夜した~~

無料でも一定回数は使えるRPCノードサービスがあるので、基本はそれ使ってください。
個人的には [ChainStack](https://chainstack.com/) がコスパよくておすすめ。

あと、`wss://`ではじまるURLを使ってる場合は`https://`のものに直すと安定したりします。

#### チェーン指定は正しいか
メインネットとテストネットでIDが違います。
[ChainList](https://chainlist.org/)で確認してください。

RPC URLもチェーン毎に異なるので注意。

#### GasLimitを一旦30000000にしてみる
call時のgasLimitはデフォルトで 21000 が指定されていますが、
割と簡単にオーバーしがちです。

開発中であれば、`{ GasLimit: 30000000 }` に変更して通るか試し、
その後適切に調整していくと楽です。

#### Gasが十分にあるか
Gasを支払うための残高が不足している可能性もあります。

#### エラートランザクションのトレースを見てRevert理由を確認
トランザクションの途中でRevertしている可能性もあります。
Foundryを利用している場合は、
`cast run`コマンドを利用するとトランザクションのトレースが見れます。

トレースのエラー箇所に`0xa1b2c3d4`のようなエラーセレクタが出てくるので、
先頭の `0x` を除いた英数字をABI内で検索すれば
エラー内容を特定することができます。

参考：
- [Foundry Book - cast run](https://book.getfoundry.sh/reference/cast/cast-run?highlight=cast%20run#cast-run)
- [Txnのトレースを見たい](https://qiita.com/bakuchi/items/bcf6bf05dee41d3daca7#%E4%BE%8B4txn%E3%81%AE%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B9%E3%82%92%E8%A6%8B%E3%81%9F%E3%81%84)


## まとめ
Dapps開発はどんどん便利になっていっています。
これからも情報を出し合って、日本に風穴を開けるWeb3をどんどん盛り上げていけたら嬉しいです！

それでは良い開発ライフを⭐︎
Cloudflareって何ですか？

# Cloudflareとは何か？
`Cloudflare`は、サイトのパフォーマンス向上と安全性の確保を目的とした、グローバルな`Content Delivery Network（CDN）`サービスのひとつです。ウェブサイトを高速化し、DDoS攻撃などの脅威から保護するための機能を提供しています。

https://www.cloudflare.com/ja-jp/



 # 主なサービス
### Cloudflare CDN 
高速なコンテンツ配信を実現するサービスで、`Argo Smart Routing` や `Polish` などの機能を備えています。世界中のデータセンターにコンテンツをキャッシュし、ユーザーがアクセスした際に最も近いサーバーから迅速にデータを提供することで、サイトのロード時間を大幅に短縮します。

###  Advanced DDoS Protection
ウェブサイトへの分散型サービス拒否（DDoS）攻撃を自動的に検出し、それらを軽減する`Advanced DDoS Protection` サービスを提供しています。サイトを常に監視し、攻撃を受けた際には迅速に対処することで、サービスの中断を防ぎます。

### CloudFlare WAF (Web Application Firewall)
ウェブアプリケーションのセキュリティを強化するためのファイアウォールです。`OWASP Top 10`などの一般的な脅威に対するプリセットルールや、カスタムルールを設定して、悪意ある`トラフィック`を効果的にブロックします。

### Universal SSL 

`Universal SSL` として知られるSSLのサービスで、どのプランでも無料で提供されています。これにより、ウェブサイトとユーザー間の通信を暗号化し、セキュアなHTTPS接続を確立します。

###  CloudFlare DNS 
CloudFlare DNS は、高速かつ信頼性の高いDNS解決を実現します。DNSSEC に対応しており、DNSスプーフィングなどの攻撃からドメインを保護します。
### Cloudflare Pages

`Jamstack` アーキテクチャに最適化された**静的サイトホスティングプラットフォーム**です。`GitHub`リポジトリと連携し、プッシュするたびにビルドとデプロイが自動で行われます。高速なロード時間、無料のSSL証明書、無制限の帯域幅など、開発者がスムーズにウェブサイトを公開できる機能を提供しています。また、`Cloudflare`のグローバルCDNを利用することで、世界中どこからのアクセスに対しても高速なページ読み込みを実現します。

`Cloudflare Pages`は、特に静的サイト生成ツール**SSG**を使用して開発されたプロジェクトに適しており、ブログやマーケティングサイト、ポートフォリオサイトなど、静的コンテンツが主体のウェブサイトに最適です。簡単なセットアップと自動化されたワークフローで、開発者はコードに集中することができ、サイトの公開と管理の効率を大幅に向上させることができます。

# AWSとの違い
`AWS`は、クラウドコンピューティングプラットフォームであり、幅広いIaaS（Infrastructure as a Service）とPaaS（Platform as a Service）を提供しています。一方で`CloudFlare`は、主に**CDNとインターネットセキュリティに特化**しています。

`AWS`の`CDNサービス`である`CloudFront`と比較すると、`CloudFlare`は**セキュリティ機能により強い焦点を当てており、特にDDoS保護やWAFで知られています**。また、`CloudFlare`には無料プランがあり、小規模サイトでも手軽にセキュリティとパフォーマンスの向上を図ることが可能です。

# まとめ
今後も活用できるよう、色々見ていきたいです！
ありがとうございました！
Brainでlinux(その4)-ターミナルの変更

# 1. 初めに
i3wmの初期設定で起動するターミナルはBrainuxには重い。
Brainux標準のLXDEのLXTerminalに変更する。

# 2. configファイルの設定
~~~
vi ~/.config/i3/config
~~~

下記がターミナルの起動の設定部分のた変更する。
~~~
#bindsym $mod+Return exec i3-sensible-terminal
bindsym $mod+Return exec lxterminal
~~~

# 3. 再起動

mod+Shift+c
で設定ファイルを再読み込み
mod+Shift+r
でi3を再起動

mod+Returnでlxterminalが起動できるようになる。

# 4.次回予告
未定です。