OmniAICreator/Qiita-1.07M huggingface dataset:
「現代数理統計学の基礎」演習問題解法メモ　第3章問4～9

第3章問4は「統計学の数理」にも【問題7-1】として同問がありました。解説では、「とけたろうプログ」と「長崎大学番外編動画」がありました。
問9は、n→∞　ではなく　λ→∞　なのが要注意です。![第3章問4　P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/bf7f2b31-9faf-e3f9-4782-ac849f71f77f.jpeg)
![第3章問4　P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/e9f60d6b-4486-3832-d4ae-6736f9afaf53.jpeg)
![第3章問5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/2e073a3f-26e4-4f35-581b-3fb4440aee4d.jpeg)
![第3章問6　P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/5f5c3f8c-fdcb-4391-3dd1-5bdd9d1a2752.jpeg)
![第3章問6　P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/bebe6863-5501-5c1a-d036-e6f8df2d65c0.jpeg)
![第3章問7　P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/b22a9544-880d-fe01-9aa3-5dab76c8da4c.jpeg)
![第3章問7　P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/509968e3-4fc7-7cd7-15a7-8484f5a5c30e.jpeg)
![第3章問8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/d819a33a-1bf0-2d1f-68d7-223b9026fd65.jpeg)
![第3章問9　P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/0d79235e-496c-5e20-e331-ce292f2e0466.jpeg)
![第3章問9　P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/e0c1aa7d-2b21-3cd2-9945-2123698e1332.jpeg)
Siv3Dでpdfを表示したかった

## はじめに
この記事は[Siv3D Advent Calendar 2023](https://qiita.com/advent-calendar/2023/siv3d)の17日および[OUCC Advent Calendar 2023](https://adventar.org/calendars/9315)の20日の記事です。
タイトルの通り、成功していません。
やり方を求めてこの記事を見つけた方にとってあまり参考にならないかと思います。
結論：WebVew2が一番希望がありそう。

## 動機
コマンドで動かすグラフ作成ツールが使いにくいので、Siv3Dを使ってGUIから作成するツールを作っていました。
しかしpdfファイルはSiv3Dアプリ内で確認することができず、外部のブラウザなどで作成したグラフを表示し、ウィンドウを並べて見てもらう必要がありました。
それを表示したくいろいろ試したというお話です。

## 試したこと

### [mupdf](https:mupdf.com)
Cで書かれているがC++のAPIがあるとのこと。他にpythonなどもある。
[Quick Start Guide](https://mupdf.readthedocs.io/en/latest/quick-start-guide.html)を参考に`libmupdf`をビルド。
Siv3Dのプロジェクトに導入（追加のインクルードディレクトリ設定、リンカの設定）するも`LNK2005`が発生するのを解決できず。
（途中でエラー解決に「最新の v142 ビルドツール用 C++ MFC (x86 および x64)」をVisual Studioに入れた。）

### [Spire](https://jp.e-iceblue.com/introduce/spire-pdf-for-cpp.html)
有料なので試せず。[.Net](https://jp.e-iceblue.com/download/free-spire-pdf-for-net.html)や[Java](https://jp.e-iceblue.com/download/free-spire-pdf-for-java.html)なら無料らしい。

### [Aspose](https://products.aspose.com/pdf/cpp/)
[ダウンロードページ](https://releases.aspose.com/pdf/cpp/)より23.11をダウンロード&展開、さらに`CodePorting.Translator.Cs2Cpp_vc14_23.11.zip`を展開。
ReadMeより`HelloWorld.sln`のテストプロジェクトを実行。
いくつかのexampleでエラー発生するもそれらをコメントアウトして、通して成功。
アカウント登録やライセンス購入なくできたので個人使用には良い選択肢だと思うが、これを含んでの配布はかなり怪しいのでパス。

### [poppler](https://poppler.freedesktop.org)
mupdfの派生らしい。
ちゃんと試せていない。

### [WebView2](https://learn.microsoft.com/ja-jp/microsoft-edge/webview2/get-started/win32)
MicrosoftEdgeの表示を組み込む感じで、そのブラウザでpdfを表示する。

[WebView2Samples](https://github.com/MicrosoftEdge/WebView2Samples)の`GettingStartedGuides/Win32_GettingStarted`のソリューションを開いて`プロジェクト>NuGetパッケージの管理`から`Microsoft.Web.WebView2`と`Microsoft.Windows.ImplementationLibrary`をインストールし、実行するとC++でブラウザを開けた。pdfも表示できた。

Siv3Dのプロジェクトに導入し、CreateWindowの類を除いて表示部分のみを貼り付けるも`IcoreWebView2Environment* env`が`nullptr`とエラー。
自前ビルド版で`CWindow.cpp`にかけばどうにかなるのではと試すも今度はパッケージも認識してくれない。
そもそもwindow作成からWebViewまで知識が何もないのでこれ以上できないかと断念。

## おわりに
いろんな方法を試していたらアドベントカレンダーの予約日に間に合わなくなりかけました。よってどの検証も浅いです。
mupdfとWebView2に関しては自分のスキル不足が原因のようなので、どなたか試して成功した場合は教えてください。

自分以外にはSiv3Dでpdfを表示する需要はないでしょうが、ウェブページのアプリ内表示は需要がありそうです。

- 操作方法の説明書をリンクで開くのではなくアプリ内で表示（説明書はGitHubとかに上げておけば、ダウンロードされた後から追記しても最新版を見てもらえる）
- アプリ起動時にGitHubのリリースページを表示することで、新バージョンがリリースされて更新できることや変更内容を見せられる
- フィードバックを得たいとき、リンクのボタンを置いておくより、アンケートページがそのまま表示されている方が回答率が高そう

など。

できたとしてもかなり先になると思いますが、将来的にSiv3DにWebViewが実装されたら嬉しいです。
Browserslistの更新

## はじめに
フロントエンドのビルド時にエラーが出たのでサクッと解決しました！

## 対象者
この記事は下記のような人を対象にしています。

- 駆け出しエンジニア
- プログラミング初学者

## 結論
忘れずにBrowserslistの更新しましょう。

## 課題
- フロントエンドのビルド時に、下記メッセージが出ていた。
    ![スクリーンショット 2023-08-07 14.20.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2157342/62f9d028-9cee-e6d8-6104-22728b4a05ae.png)

## 解決策    
- 下記実行したら出なくなりました。

    ```
    sail npx update-browserslist-db@latest
    ```

## おわりに
Browserslistの更新についてまとめました。



## 参考記事
[[React] アプリのビルド時にBrowserslistの更新を要求されるので対処してみる](https://dev.classmethod.jp/articles/asked-to-update-the-browserslist-when-building-react-app/)
Alert表示のメソッドをViewControllerから切り出す方法

# ViewControllerから別のファイルにAlert表示のメソッドを切り出す際の問題点
複数箇所で同じアラート文を複数の画面で使用するため、ViewControllerから別のファイルにAlert文を切り出そうとしたら、下記のようなエラーが起こりました！
```swift:AlertMaker.swift
struct AlertMaker {
    func showAPIErrorAlert() {
        let alert = UIAlertController(title: "エラー", message: "通信に失敗しました。", preferredStyle: .alert)
        let retryAction = UIAlertAction(title: "リトライ", style: .default, handler: {(action) -> Void in
            print("OK")

        })
        let cancelAction = UIAlertAction(title: "キャンセル", style: .default, handler: {(action) -> Void in
            print("キャンセル")
        })
        alert.addAction(retryAction)
        alert.addAction(cancelAction)
//🟥　エラー：Cannot find 'present' in scope
        present(alert, animated: true, completion: nil)
    }
}
```
### なぜ上記のように🟥Cannot find 'present' in scopeというエラーが起こったのか？
```swift
func present(
    _ viewControllerToPresent: UIViewController,
    animated flag: Bool,
    completion: (() -> Void)? = nil
)
```

presentメソッドはclassであるUIViewControllerのメソッドであるため、UIViewController内でしか使用できません。

# 解決方法：Alert表示のメソッドを切り出す！
```swift:AlertMaker.swift
struct AlertMaker {
    func showAPIErrorAlert(didTapRetry: @escaping () -> Void) -> UIAlertController {
        let alert = UIAlertController(title: "エラー", message: "通信に失敗しました。", preferredStyle: .alert)
        let action = UIAlertAction(title: "リトライ", style: .default, handler: {(action) -> Void in
            didTapRetry()
        })
        alert.addAction(action)
        return alert
    }
}
```
先ほど見たようにpresentメソッドはUIViewControllerで使用する必要があるため、AlertMakerファイルの戻り値として、UIAlertControllerを戻すようにした。

```swift:okyoViewController.swift
class TokyoViewController: UIViewController {
    private let latitude = "35.689753"
    private let longitude = "139.691731"
    let apiClient = APIClient()
    let alertMaker = AlertMaker()

    @IBOutlet weak var weatherLabel: UILabel!
    @IBOutlet weak var prefectureLabel: UILabel!

    @IBAction func tappedTokyo(_ sender: UIButton) {
        showWetherView()
    }
    func showWetherView() {
        apiClient.getWeatherFromAPI(
            latitude: latitude,
            longitude: longitude,
            success: { description, cityName in
                DispatchQueue.main.async {
                    self.weatherLabel.text = description
                    self.prefectureLabel.text = cityName
                }
            },
            failure: {
                DispatchQueue.main.async {
                //🟩UIAlertControllerの戻り値を受け取る！
                    let alert = self.alertMaker.showAPIErrorAlert {
                        self.showWetherView()
                    }
                    self.present(alert, animated: true, completion: nil)
                }
            }
        )
    }
}
```
UIViewController側で、AlertMakerファイルから🟩UIAlertControllerの戻り値を受け取りalert定数に代入し、presentメソッドのみをUIViewController側で使用することができました！

# 参考文献

https://developer.apple.com/documentation/uikit/uiviewcontroller

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621380-present
【Python】SeleniumのCache Access Deniedでハマったときの対策

Seleniumを扱っていたときに遭遇したエラーの対策をメモ書きしておく。ネットで調べまくったがヒットしなかったので。


# エラーメッセージ

社用PCで発生したので正確に覚えていないが以下のようなメッセージであった。
* html形式でエラーメッセージが表示された。
* タイトルは`Cache Access Denied`であった。
* `localhost`に接続できないという旨のメッセージもあり。

# 対策
結論としては、PCに設定していた環境変数`HTTP`を削除することで解決できた。以下のコードを追加すると、エラーを回避することができた。
```python
import os
del os.environ['HTTP']
```

社内プロキシのせいで上手くいかなかったみたいです。
[Unity]Material '〜' with Shader '〜' doesn't have a color property '_Color'

# 概要
MaterialやShaderGraphをいじっていると以下のようなエラーが出ることがあります。

```
Material '〜' with Shader '〜' doesn't have a color property '_Color'
```
このエラーについて記事にまとめます。

# 本文
マテリアルの色設定にアクセスして色を変えたい時は以下のように記述できます。
```cs
_renderer.material.color = Color.blue;
```

これはマテリアルのシェーダー内にある_Colorにアクセスして色を変えているのですが、それをシンプルに記述できるようにしてくれているものです。
[→公式リファレンス](https://docs.unity3d.com/ja/2018.4/ScriptReference/Material-color.html)

シェーダーを自作した時、色設定のプロパティが「Color」以外の場合は_Colorは存在しないことになって上記のようなエラーが出てしまいます。

# じゃあどうすればいいの？
色設定のプロパティを「Color」にすれば解決できます（厳密にはColorという名前をつければ内部的に_Colorとして扱ってくれます）

どうしても「Color」以外の名前にしたい時は、画面左上から色指定に使いたいプロパティを選択して、画面右上のNodeSettingsからReferenceに「_Color」を指定すればOKです:sunny:


![スクリーンショット 2023-12-17 16.27.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/a61b705e-49ee-8a59-612d-4c42c5841f5c.png)

:::note warn
ShaderGraphではプロパティ名に指定した名前の先頭にアンダーバーを付けた形式でReferenceを自動生成してくれます。この手順をすることでデフォルトと違うReferenceになりますのでその点は注意が必要になります。
:::

:::note info
Material.colorにこだわらなければ
material.SetColor("_BaseColor", _color);
みたいにアクセスするのでも大丈夫です。
:::
海外で半年リモートワークをしてみて

こんにちは、なかやまです。
現在、オーストラリアに半年以上滞在しながらリーモートで働いています。そこで、実際、海外でリモートワークをやってみて、気付いた事を書かせて頂きたいと思います。

### はじめに
元々、海外の文化に興味があり、高校の時も長期でオーストラリアに語学留学した経験があったので、海外(オーストラリア)に長期で行くという事にハードルはあまり感じていませんでした。
そんな中、当社にはすでに海外で働いている社員が何人かいる事を知り、オーストラリアに住んでいる方に話を聞き、自分もいけそうだなと思い、入社して間も無くして、旅立ちました。

海外で生活していると様々な事の気づきを得られますが、今回はエンジニアとしての観点から、(一時的な)海外でのリモートワークのメリデメを書かせて頂ければと思います。


### デメリット

- 日本でのオフラインイベントに参加できない。
- 社員メンバーのオフライン懇親会、打ち上げなどに参加できない。
- 作業環境(モニターやデスク、チェアなど)を整えにくい。
- 多少時差があるので、時間感覚がバグる。(朝会、夕会が昼会、夜会になる。)(当社のヨーロッパにいるメンバーは現地時間で作業しているそう。)
- 祝日が違うので、現地の知り合い、イベントの予定を合わせにくい。

やはり、日本でのオフラインイベントに参加できない事と、作業環境が整えにくい事は日本で働いている同僚を見ていると、もどかしくなります。

### メリット

- 行動力がある人と思われる。
- 英語のドキュメントを読む事に抵抗が一切無くなる。
- エンジニア視点で色々な海外のサービスを触り、気付きを得られる。
- 海外のオフラインイベントに参加できる。
- エンジニアは海外でも市場価値が高いという事を実感できる。
- 日本の祝日が現地で平日だったりするので、人混みを避けやすい。(ちなみに、日本の祝日は他国と比べ多い。)

日系、外資、大手、Web、ハード、問わず現地にいる様々なタイプのエンジニアの方々とお話しする機会があり、とても良い刺激を得られたと思います。日本人同士の結び付きというものが海外にはあり、歴を問わずお話しして頂けた事はとてもありがたかったです。

### 最後に

海外に行く理由の一つとして、正直今まで学生をやってきて、無知すぎるので、もう少し社会を見るべきだと感じ、手取り早い方法が海外に行く事だと思ったという背景もありました。
正直、当初はもしかすると、エンジニア以外に適正のある仕事があるんじゃないかとも思っていました。
しかし、半年間、意識しながら、他業種の方などともお話しをしたり、注意深く見ながら、生活していましたが、エンジニアほど自分にあった仕事は無いと確証しました。
こうして、リモートワークが出来き、環境を選択できる事や奥深い技術を探求できる事、市場価値がとても高い事などなど。そういった気付きが得られただけでも十分すぎる海外生活だなと思います。皆さんも一緒に、これからもどんどんエンジニアライフをエンジョイしていきましょう！！🧑‍💻
それではまた！！✨
【laravel】モデルやコントローラーのディレクトリをいじったらルーティングでつまづいた

# はじめに
Laravel6を使用しています。Userモデルは初期でApp/Httpディレクトリ直下に作成されるため、モデルが増えるとごちゃつきます。モデルだけでまとめて整理したくなってきます。

合わせてどのコントローラーがどのモデルと結びつくのかも分かりやすくしておきたくなり、それぞれ新しくディレクトリを作成することにしました。

そこでnamespaceをいじったのが全ての始まりでした。

# 解決方法
### ■ Target class [~Controller] does not exist.

新しく作ったディレクトリにモデルを移動させるだけでは、namespaceが合わなくなるためエラーを吐かれます。参考サイトは[こちら](https://www.takafumitaba.com/laravel-certification)。

今回はHttpの中にModelsを作成し、さらにUsersを入れ子にしています。

```php:App\Http\Models\Users\User.php
namespace App\Http\Models\Users

class User extends Authenticatable
{
 // 略
}
```

コントローラーもUsersディレクトリを作成しました。

```php:App\Http\Controllers\Users\UsersController.php
namespace App\Http\Controllers\Users;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class UsersController extends Controller
{
    public function show(Request $request)
    {
        return view('profile');
    }
}
```
web.phpも一致させます。

```php:routes/web.php
Route::namespace('users')->group(function () {
  Route::get('/profile', 'UsersController@show')->name('showUsers');
});

```

# おまけ
### ■ Method Illuminate\Auth\SessionGuard::~ does not exist.
ログイン後のリダイレクト先の名前(HOME)も変更していたため、web.phpをいじったときに「そんなSession Guardはない」と怒られてしまいました。

RouteServiceProviderのHOMEがweb.phpに書いたものと一致するように修正しました。

```php:Providers/RouteServiceProvider.php
class RouteServiceProvider extends ServiceProvider{
  // 略
  public const HOME = 'ここを修正';
}
```

# 終わりに
特にルーティング関係では複数のエラーが同時に出たりして「どこから手をつけよう……」と困ってしまうのですが、１つ１つ潰していくと意外とシンプルでした。

# 参考
- Laravelで認証機能のエラー。app直下に作ったディレクトリにモデルを格納したら解消した
https://www.takafumitaba.com/laravel-certification

- 本気で詳細を理解したい人向けのLaravelログイン認証
https://reffect.co.jp/laravel/laravel-authentification-by-code-base
[Azure AD] Azure B2B/B2C の違い

## AzureB2BとB2Cの違いについて、備忘録としてここに記す。

### 環境
- MacOS Monterey

### まとめ
- B2B:Microsoft Entra ID(Azure AD)の機能の１つ
- B2C:Azure AD B2C(IDaaSと呼ばれる)サービス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955010/35b21274-9b17-46db-501b-a9a3ac613968.png)


 ### 比較
||対象システム|対象ユーザー|
|:---|:---:|:--:|
|B2B|ある企業の社内システム|ある会社の社員・派遣社員|
|B2C|ある会社が提供するショッピングサイト|ショッピングサイトのユーザー|

 ### ソリューションに求められる特徴
- B2B:Microsoft Entra ID(Azure AD)
    1. 管理権限の適切な委譲
    1. Microsoft 365 サービスの利用
    1. 組織が管理する SaaS アプリとの連携
    1. オンプレミスの Active Directory との連携
    1. ゲスト ユーザーを招待する B2B 機能
- B2C:Azure AD B2C(IDaaSと呼ばれる)
    1. ユーザーが自身で会員登録を行えるセルフサインアップ機能
    1. サインアップ時に名前や住所、電話番号などのユーザー属性を収集する機能
    1. ブランド イメージに合わせたサインイン画面のカスタマイズ
    1. ユーザーが自身で行えるプロフィールやパスワード変更 (リセット) 機能
    1. 本人確認や身分確認のためのサービスとの連携機能(API連携)
    
  ### 両者の代替案
  #### 選択肢
  1. 既存の Azure AD テナントに外部ユーザーを B2B ユーザーとしてゲスト招待し、組織内のアプリケーションにサインインをさせる (シングル テナント アプリ)
  1. マルチテナント アプリケーションを作成し、すべての Azure AD テナントのユーザーがサインイン可能なアプリを作る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955010/c160fff2-b0ba-d87d-9c38-13dbd845ae6c.png)


### 参考リンク
- [Azure AD B2Bとは](https://jpazureid.github.io/blog/azure-active-directory/what-is-b2b/)
- [B2B コラボレーションの概要](https://learn.microsoft.com/ja-jp/entra/external-id/what-is-b2b)
- [Azure B2Cのキホンとよくある質問 ](https://jpazureid.github.io/blog/azure-active-directory/azure-ad-b2c-fundamentals/)
- [Microsoft Entra 外部 ID の概要](https://learn.microsoft.com/ja-jp/entra/external-id/external-identities-overview)
PythonでのWEB操作　各モジュールについて

PythonでのWEB操作をしたいため、各モジュールについて調べました

以下に結果をまとめますが、コメント等あれば更新していきます

①webbrowser
標準の組込みモジュールのため新たにモジュールをインストールする必要がない
マウス操作のためにpyautoguiをインストールする必要があり、また処理中は別の作業ができない


②Selenium
JavaScriptが使われているサイトからのデータの取得や、ドライバを経由してブラウザを操作することができる
Seleniumはブラウザを操作してデータを取得しますので、動作が遅いことが難点
従って、できるだけ必要最低限の箇所でSeleniumを使うことをお勧めされている
標準のモジュールには組み込まれていない


③BeautifulSoup
Webサイトをスクレイピングしてデータを取得して解析するライブラリ
標準のモジュールには組み込まれていない


④Requests
HTMLデータの取得によく用いられる
簡単にWEBサイトからデータを取得することができる
標準のモジュールには組み込まれていない
IPFSをほんの少しだけ深堀り

# はじめに

IPFS（InterPlanetary File System）は、分散型のファイルストレージとファイル共有システムです。従来のHTTPベースのファイルストレージとは異なり、IPFSはデータをP2Pで分散させることで、より効率的かつ堅牢なデータアクセスを提供します。

同一コンテンツには同じIDが割り振られ、P2P通信でデータを取得するということはご存知の方は多いと思いますが、裏側ではどのような技術が使われているか少し調べました。

# プロトコルスタック
IPFSはいくつかのモジュールプロトコルのスタックであり、各プロトコルの実装は仕様を満たしていれば何を使っていても問題ありません。各レイヤーについて、主に使われている技術を紹介します。

IPFSは以下の5つのレイヤーからなっています。（[IPFS specs](https://github.com/ipfs/specs/blob/main/ARCHITECTURE.md)より引用）

- naming - a self-certifying PKI namespace (IPNS)
- merkledag - data structure format (thin waist)
- exchange - block transport and replication
- routing - locating peers and objects
- network - establishing connections between peers

## naming
IPFSはCIDというコンテンツの内容ごとに固有のIDで管理されているのは有名ですが、それでは内容が少し変わっただけで毎回CIDが変わるのが面倒です。これを解決するのがIPNS（InterPlanetary Name System）という公開鍵を使った自己検証的なIDを作成して、ファイルと紐付けることができます。

これはSFS（Self-certifying File System）というものが元になっているのですが、詳細は以下リンクより確認ください。

https://specs.ipfs.tech/ipns/

## merkledag
IPFSではデータを分割して保存しているのですが、その分割されたデータ同士の繋ぎ合わせをMerkle DAGを使って表現しています。
このデータ構造はGitにも活用されています。

```
message MDagLink {
  bytes Hash = 1;    // リンク先オブジェクトのハッシュ値
  string Name = 2;   // リンクの名前
  uint64 Tsize = 3;  // リンク先オブジェクトのサイズ
}

message MDagNode {
  MDagLink Links = 2;  // 他のデータへの参照の配列
  bytes Data = 1;      // 分割データ（256kb以下）
}
```
上記データ構造は[Spec](https://github.com/ipfs/specs/blob/main/ARCHITECTURE.md#34-merkledag----making-sense-of-data)より引用しました。

Gitでイメージしてもらうと分かると思うのですが、この形式だと例えばファイルの一部のみ変更があった場合に、そのファイル全体を残す必要はなく、分割されたデータのみ変更を残しておけば良いので全体としてストレージを節約できます。


実際にはIPFSではIPLD（InterPlanetary Linked Data）というものを使っていて、これはMerkle DAGを含めたデータ構造を抽象化したものです。

IPFSではファイルをCIDで識別すると述べましたが、たとえばブロックハッシュなど、ブロックチェーンエコシステムの中でもコンテンツを識別するのにハッシュは様々な使い方をされていますが、IPLDはこれら異なるプロトコルでデータ構造を統一することを目的としています。

## exchange
実際のデータのやり取り部分です。
データのやり取りのプロトコルは主にBitswapを用いており、これはBitTorrentを一般化したものです。
この部分はデータのやり取りなので、実際はHTTPでも問題はありません。

## routing
ルーティングは2つの種類に分かれています。

- ノードのルーティング
- コンテンツのルーティング

いずれにせよDHT（Distributed Hash Table）が最もよく使われています。
DHTにもいくつか種類があり、Kademilia DHT, Coral DSHT等があります。

システム全体で巨大なDHTを保持しており、各ノードはその一部分を担っています。
例えばコンテンツのルーティングではkeyはCIDで、valueには保存されてるノードのIDやIPアドレスが入っており、この情報を元にデータを保持しているノードにアクセスします。

## network
通信はP2Pで行われており、以下の特徴等を持ちます

- NAT越え
- TCP, UTPなどをサポート
- 暗号化
- リンク多重化

ネットワークの構成（ルーティングも含む）に関しては[libp2p](https://libp2p.io/)が使用されています。
libp2pは[Protocol Labs](https://protocol.ai/)が開発しており、IPFS, Filecoinと同等に重要なプロジェクトとして位置付けられています。

# まとめ
IPFS自体の利用はチュートリアルを読めば割と簡単に実装できますし、IPFSにデータをアップロードするサービスもあるのでなんとなくの概念は知っていましたが、どのような技術が使われてるかを深堀りすると、各レイヤーそれぞれ本にしなきゃ説明できないくらいの技術を使っていました。
この先さらに進むのは難しいですが、概要を掴む良いきっかけになりました。

# 参考
[IPFS Docs](https://docs.ipfs.tech/)
[IPFS Specs](https://github.com/ipfs/specs/tree/main)
[実践IPFS入門](https://amzn.asia/d/3docQ6K)
個人アプリで技術選定に失敗した話

## はじめに

皆さん普段技術選定はどのように行っているでしょうか？
仕事であればリードエンジニア、先輩エンジニアがすでに選定しているケースや、会社で普段から使用しているものを使うことがほとんどだと思いますが、個人で作る際は自分で選定しなければいけません。
私は**自分が作りたいアプリの根幹の機能をサポート**しているかを最重要視して技術選定しています。
この記事では私が個人でアプリを作成した際に経験した失敗談から、私の選定基準を話していければと思います。

## 何を失敗したのか

元々私は個人アプリを作る際、学習もかねて興味のある技術でアプリを作成してきました。
学習目的でアプリを作るだけであればそれで問題なかったのですが、明確に作りたい機能があった際にこの基準で選んでいたのでめちゃめちゃ困りました。

具体的に話していくと、当時シフトの自動計算アプリを作成していました。
要件として

- 必要人数
- 必要能力値
- 必要役職
- 理想人数
- 理想能力値
- 一人当たりの出勤に数

これらを入れると一カ月のシフトを自動で計算してくれるというものです。
技術は触ってみたかった Go, GraphQL, React, ORTool で作成することだけ決めて開発を進めていきました。

Go でそれぞれ必要情報を保存できるようにし、React で mock を使用して大まかな画面作成、GraphQL でそれぞれの内容を取得できるようにした後、根幹の機能である自動計算を ORTool と Go 作ろうとしたしたのですが、これがうまくいきませんでした。そもそも ORTool が Go をサポートしてなかったのです。issue を見ながらできる方法を探しましたが、更新なし。無理やり使えるようにすることはできなくもなさそうでしたが私の技術力では無理でした。
というか ORTool は Google の製品なんだから Go で使えうるようにしとけよ、と思いましたが下調べしなかった私が完璧悪い。
結局、ORTool のサポートしている Python でバックエンドはすべて作り直ししました。

## この一件を教訓として

この失敗から使用する技術が根幹の機能をサポートしているかを下調べしてから開発をしています。
根幹となる機能を一番最初に作ることは当たり前のことではあるのですが、個人で開発するときは何してもいい分興味が勝ってしまうんですよね。

こんなミスそうそうしないと思いますが、皆さんの技術選定の一助になれば幸いです。
RSpecのパラレル実行：効率的なテストのための道

## はじめに
開発の現場では、テストの実行時間がプロジェクトの生産性に直接影響を与えます。特に大規模なプロジェクトでは、テストが肥大化し、時間がかかりがちです。ここ最近は私が普段使っているRSpecというRuby on Railsでよく使われるテストの実行時間を削減するためにも、パラレル実行(並列で実行するテストの方法)の導入の必要性を感じ始めました。
この記事は「テストをパラレル化してみたいよ」という計画についてまとめたものになります。

## パラレル実行の必要性
テストの実行時間を短縮することは、開発サイクルを加速し、より迅速なフィードバックを可能にします。これは、バグの早期発見や機能改善の迅速な実装につながり、結果として生産性が向上します。

## 実現方法の具体化（Myappの例）
例えば`Myapp`アプリというでRSpecのパラレル実行を設定するには、以下の手順に従います：

### Gemの導入
- `Gemfile`に`parallel_tests`を追加します。

    ```ruby
    gem 'parallel_tests'
    ```

- コマンドラインで`bundle install`を実行してgemをインストールします。

### データベース設定
- `config/database.yml`で、テストデータベースの設定を変更します。例えば、データベース名にプロセス番号を含めるように設定することができます。

    ```yaml
    test:
      database: myapp_test<%= ENV['TEST_ENV_NUMBER'] %>
    ```

- これにより、各テストプロセスが異なるデータベースを使用します。

### パラレルテストの実行
- パラレル実行を開始するには、以下のようにコマンドを実行します。

    ```bash
    bundle exec parallel_test -n [プロセス数] --pattern "spec/**/*_spec.rb"
    ```

- 例えば、4プロセスを使用する場合は以下のようになります：

    ```bash
    bundle exec parallel_test -n 4 --pattern "spec/**/*_spec.rb"
    ```

## モニタリング方法の詳細
パラレル実行の効果を評価するためには、モニタリングが重要です。以下のツールを使ってパフォーマンスデータを収集し、分析します：

### Prometheus
- システムとアプリケーションのメトリクスを収集します。
- RSpecの実行中にCPUとメモリの使用状況を監視するために設定します。

### Grafana
- Prometheusから収集したデータをグラフィカルに表示します。
- ダッシュボードをカスタマイズして、テスト実行時のリソース使用状況をリアルタイムで視覚化します。

これらのツールを組み合わせることで、パラレル実行のパフォーマンスを詳細に分析し、テストプロセスの最適化に役立てることができます。

## 参考にした記事の概要と計画
私が参考にしたのは、[ラクーンの技術ブログ](https://techblog.raccoon.ne.jp/archives/1645488056.html)に掲載されている記事です。この記事では、`parallel_tests` gemを用いてRSpecのテストを効率的にパラレル実行する方法が詳述されています。具体的には、データベースの設定、RSpecのコンフィグレーション、そして実行コマンドに至るまでの詳細な手順が説明されています。

この記事に触発され、私は自分のプロジェクトにおいても同様のアプローチを採用することに決めました(来年達成したいことの一つ)。具体的には、まず`parallel_tests` gemの導入と設定を行い、テストデータベースの設定を調整して、最終的にはパラレル実行の効果を評価するためのモニタリングシステムを設定します。

## まとめ
RSpecのパラレル実行は、テストの効率化に大きな可能性を秘めています。適切なツールと戦略を用いることで、テストプロセスを高速化し、生産性を向上させることが可能です。この取り組みにより、より迅速かつ効果的な開発プロセスが実現できることを期待しています。
ESP32 BLEプログラミングの落とし穴: 'esp_ble_adv_data_t' コンパイルエラーの解決法

`#include <BLEDevice.h>`, `#include <BLEServer.h>` を含むクラスを、別のクラスに参照渡しで追加した際に、PlatformIOで ```error: 'esp_ble_adv_data_t' does not name a type; did you mean 'esp_ble_adv_data_type'?``` というコンパイルエラーが発生しました。 platform.ini ファイルに `build_flags = -DBLE_42_FEATURE_SUPPORT=TRUE -DBLE_50_FEATURE_SUPPORT=TRUE` を追加することで、このエラーは解消されました。

エラーの発生原因が少しわかりづらかったので、内容についてまとめます。

### 解説
```error: 'esp_ble_adv_data_t' does not name a type というエラーは、esp_ble_adv_data_t``` という型がコンパイル時のコンテキストに存在しないことを示しています。esp_ble_adv_data_t は ESP32のBluetooth Low Energy (BLE) 関連の構造体で、広告データの定義に使用されます。

### エラーの原因
このエラーの原因は2つ考えられます。

#### ヘッダーファイルの不足:
```esp_ble_adv_data_t``` が定義されているヘッダーファイルがインクルードされていないか、プロジェクトに適切に含まれていない可能性があります。

#### コンパイルフラグの欠如:
特定の機能や定義は、コンパイル時のフラグによって有効化されることがあります。この場合、```-DBLE_42_FEATURE_SUPPORT=TRUE -DBLE_50_FEATURE_SUPPORT=TRUE``` フラグが必要だった可能性があります。

### build_flags による解決
```build_flags = -DBLE_42_FEATURE_SUPPORT=TRUE -DBLE_50_FEATURE_SUPPORT=TRUE``` の追加によってエラーが解消されたことは、これらのフラグがESP32のBLE関連の機能を有効化するために必要だったことを示唆しています。

BLE 4.2およびBLE 5.0のサポートを有効にすることで、`esp_ble_adv_data_t` が含まれるヘッダーファイルや関連機能がコンパイル時に利用可能になった可能性があります。

### 結論
この種の問題は、プロジェクトの設定や依存関係の複雑さから生じることが多いです。特に、ESP32のような組み込みシステムでは、ハードウェア機能やSDKのバージョンによって、コンパイル時のフラグが重要な役割を果たすことがあります。この場合、適切なビルドフラグの追加により、必要な型定義や機能がコンパイル時に利用可能になり、問題が解決しました。

### 関連
[BLE Advertising type are not defined in v4.4 · Issue #6388 · espressif/arduino-esp32](https://github.com/espressif/arduino-esp32/issues/6388#issuecomment-1108162383)
読書感想 コンピュータはなぜ動くのか

# 書籍名「コンピュータはなぜ動くのか」
著者：矢沢久雄


# 読もうと思った動機
低レイヤー（コンピュータ）の入門レベルの知識を得るため


# 印象に残った部分

## コンピュータの３大原則

### 1.入力、演算、出力
コンピュータは入力、演算、出力を行う機械です。

入力：キーボード
演算：CPU
出力：ディスプレイ

### 2.プログラムは、命令とデータの集合体

例
data ="sample" ←データ
console.log(data); ←命令


### 3.コンピュータは数字で表現する

例：
人間側
赤色

コンピュータ側
FF0000

## コンピュータを作ってみよう（紙で）

### 配線


配線工程|説明|
---|----
データ線配線|データの受け渡しをするための配線。CPU-メモリ、CPU-I/O
アドレス線配線|番地を指定してデータの受け渡しをするため。（データだけだとできない）
制御線配線|メモリとI/Oの読み込み、書き込みを担当

以下画像


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/c8132443-8914-9aa6-40a0-74b7b7616ff3.png)


MREQ: Memory Request
IORQ: I/O Request
WR: Write
RD:Read
CE:chip enable


# 実践できること or 感想

業務で実践する術は想像つかんかったですね。
あくまで知識として習得した範疇です。
低レイヤー界隈の知見が浅い私でも読みやすい本でした。

再読時にChapter3「一度は体験してほしいアセンブラ」読む。
【PostgreSQL】VACUUMについて

## 初めに
PostgreSQLでは、データの更新や削除が行われると、「デッドタプル」と呼ばれる不要なデータがデータベース内に残ることがあります。これらを効率的に削除し、データベースのパフォーマンスを最適化するために使用されるのが`VACUUM`コマンドです。

## VACUUMとは？

PostgreSQLでは、レコードの更新や削除を行うと、旧版のレコード（デッドタプル）がデータベース内に残ります。これはPostgreSQLがMVCC（Multi-Version Concurrency Control）という方式を採用しているためで、これにより複数のトランザクションが同時に行われても一貫性を維持することができます。

しかし、これらのデッドタプルが増えると、ディスクスペースの無駄になるだけでなく、テーブルのスキャン速度を低下させる原因ともなります。`VACUUM`コマンドはこれらのデッドタプルを削除し、そのスペースを再利用可能にすることで、データベースのパフォーマンスを改善します。

## VACUUMの使い方

`VACUUM`コマンドは非常に簡単に使用することができます。基本的な形式は以下の通りです。

```sql
VACUUM table_name;
```

このコマンドを実行すると、指定したテーブルに対して`VACUUM`が行われます。

なお、`VACUUM`は通常、データベースの管理者やスーパーユーザーが実行します。ただし、テーブル所有者でも`VACUUM`を実行することができます。

#### VACUUMのオプション

`VACUUM`コマンドはいくつかのオプションを持っており、その挙動を柔軟に制御することができます。

- `VACUUM VERBOSE`：このオプションを使用すると、`VACUUM`が行う作業の詳細な情報が表示されます。デバッグやパフォーマンスチューニングに役立ちます。

``` sql
postgres=# VACUUM VERBOSE;
INFO:  vacuuming "public.accounts"
INFO:  table "accounts": found 0 removable, 0 nonremovable row versions in 0 out of 0 pages
DETAIL:  0 dead row versions cannot be removed yet, oldest xmin: 733
Skipped 0 pages due to buffer pins, 0 frozen pages.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.
INFO:  vacuuming "pg_catalog.pg_statistic"
INFO:  table "pg_statistic": found 0 removable, 406 nonremovable row versions in 18 out of 18 pages
~~~ 省略 ~~~
DETAIL:  0 dead row versions cannot be removed yet, oldest xmin: 733
Skipped 0 pages due to buffer pins, 0 frozen pages.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.01 s.
VACUUM
```

- `VACUUM FULL`：通常の`VACUUM`はデッドタプルを削除し、そのスペースを再利用可能にしますが、ディスクスペースをOSに返すことはありません。それに対して`VACUUM FULL`はテーブルを再構築し、不要なスペースをOSに返します。ただし、`VACUUM FULL`はテーブルをロックするため、長時間の実行は避けるべきです。

``` sql
postgres=# VACUUM FULL;
VACUUM
```

- `VACUUM ANALYZE`：このオプションを使用すると、`VACUUM`の後にテーブルの統計情報を更新する`ANALYZE`が実行されます。これにより、クエリプランナがより効率的な実行計画を作成することが可能になります。

``` sql
postgres=# VACUUM ANALYZE;
VACUUM
```

## AUTOVACUUM

PostgreSQLには`AUTOVACUUM`という機能もあり、これはデータベースが自動的に定期的に`VACUUM`と`ANALYZE`を実行する機能です。これにより、データベース管理者が手動で`VACUUM`を行う手間を省くことができます。

しかし、`AUTOVACUUM`の設定は適切に調整する必要があります。データベースのサイズやトラフィック、ハードウェアの性能など、システムの特性に応じて`AUTOVACUUM`のパラメータ（例えば、`autovacuum_vacuum_scale_factor`や`autovacuum_vacuum_threshold`など）を調整することが重要です。

## まとめ
PostgreSQLの`VACUUM`コマンドについて簡単に紹介しました。`VACUUM`はPostgreSQLのパフォーマンスを維持するために重要な作業であり、適切に使用することでデータベースの健全性とパフォーマンスを確保することができます。また、`VACUUM`のオプションを理解し、適切に使用することで、より柔軟かつ効率的に`VACUUM`を行うことができます。
【Rails】Active Model Serializersとjson-api-serializerの比較

# はじめに
RailsでAPIモードを扱う時に、`Active Model Serializers`もしくは`json-api-serializer`を`シリアライザー`の選択肢として用いる事がほとんどかと思います。
今回はこれらの`シリアライザー`について簡単に比較してみました。

# シリアライズとは
`オブジェクト`や`データ構造`を、`ファイル`や`データベース`、`ネットワーク`越しの通信でやり取りできる形式（たいていの場合は文字列）に変換することです。`JSON`や`XML`が挙げられます。


# 比較

| 特徴 | ActiveModel::Serializer | json-api-serializer | 
|------|------------------------|--------------|
| 設計 | MVCに沿った構造で、JSON構造を細かくコントロールできる | パフォーマンスに特化しており、シンプルな定義で高速にシリアライズ可能 | 
| 使用例 | `render json: user, serializer: UserSerializer` | `render json: UserSerializer.new(user).serialized_json` |
| 開発元 | ライブラリとしての歴史が長く、広範囲にわたるRailsコミュニティによってサポートされている | アクティブなメンテナンスとFast-jsonapiの後継Gemの立ち位置で、AMSより速度が圧倒的に速い| 
| コードの簡潔さ | 各モデルごとに詳細なシリアライザーを書くことが多いため、コード量が増えることがある | シリアライザーの定義がシンプルで、コード量を抑えることができる | 
| GitHub スター数 | 約5.3k | 約1.3k | 

https://github.com/jsonapi-serializer/jsonapi-serializer

# ActiveModel::Serializer
```ruby
gem 'active_model_serializers'
```
```ruby
class UsersController < ApplicationController
  def show
    user = User.find(params[:id])
    render json: user, serializer: UserSerializer
  end
end
```
```ruby:使用例
class UserSerializer < ActiveModel::Serializer
  attributes :id, :name, :email
  has_many :posts
  has_one :profile
  
  def posts
    object.posts.limit(10)
  end
end
```

`ActiveModel::Serializer`の場合は`シリアライザー`内にメソッドを定義できる為、容易にカスタマイズが可能です。
一方で、ビジネスロジックが肥大化してしまうと、モデルファイルとの区分けや見通しが悪くなる為、設計を考える必要があります。

# json-api-serializer
```ruby:
gem 'jsonapi-serializer'
```
```ruby
class UsersController < ApplicationController
  def show
    user = User.find(params[:id])
    render json: UserSerializer.new(user).serializable_hash.to_json
  end
end
```
```ruby:使用例
class UserSerializer
  include JSONAPI::Serializer
  attributes :id, :name, :email
  has_many :posts, serializer: PostSerializer
  has_one :profile, serializer: ProfileSerializer
end
```

`json-api-serializer`は`NETFLIX`が開発した`fast_jsonapi`を基に作られたGemです。

`fast_jsonapi`は**パフォーマンステストによると、Active Model Serializersと比較して最大40倍以上高速に動作**したことが結果として得られたそうです。

一方で`fast_jsonapi`のメンテナンスは止まっており、現状唯一シリアライザーとしてメンテナンスされている`json-api-serializer`を扱う事がスタンダードかもしれません。


https://qiita.com/rana_kualu/items/700284059cb0d893dc0e

https://github.com/Netflix/fast_jsonapi
ODCにおける「ほどほどの」アーキテクチャ設計（2023/12/12 OutSystems User Groups Tokyo LT）

2023/12/12に開かれたOutSystems User Groups Tokyoのイベント[OutSystems Connect: 年忘れLT大会！](https://usergroups.outsystems.com/events/details/outsystems-inc-tokyo-presents-outsystems-connect-nian-wang-reltda-hui/)で行ったLTの内容にちょっと追記・補足したもの。

# 要旨
ODCは設計・実装をマイクロサービスベースで行うことを前提としている。

しかし、Martin FowlerのMicroservicePremiumや、いくつかのマイクロサービス適用経験談で示されているように、マイクロサービス実現には追加的なコストがかかる。システムの複雑さがさほど高くない場合、追加的なコスト > メリットとなるケースがあるとされている。

個人的な経験から、システムの複雑さが中程度（OutSystemsで構築するアプリケーションはほとんどこの範囲と思われる）なら、マイクロサービスを避ける方法も取り得るという感触を持っている。

# MicroservicePremium
martinFowler.comの[MicroservicePremium](https://martinfowler.com/bliki/MicroservicePremium.html)に示されている。

マイクロサービス実現には追加的なコストがかかり、システムの複雑さがさほど高くない場合、追加的なコスト > メリットとなるケースがある。そのため、システム構築時には、モノリシックなシステムとして構築することを基本とし、どうしても必要な時にのみマイクロサービス化を検討すべきというもの。

つまり、モノリシックなシステムとして構築してしまうと、小さな変更でも、システム全体が大きく複雑すぎるため、開発・リリースに困難を感じるような場合。

## 補足
とはいえ、マイクロサービス化にあたって必要なもののうちいくつかは、OutSystemsがODCの機能として担当してくれている。
よって、マイクロサービス化に必要なコストは、OutSystemsを使わなかった場合よりは低いことが期待できる（議論の余地はありそうだが、そのようにうまく設計・実装してくれると思っていないのであれば、OutSystemsを導入していないはず）。

難しいのは、ODCを利用する前提でどの程度、マイクロサービス化に追加のコストが発生するかが不明なこと。

# システム規模によるアーキテクチャ設計方針検討
システムの複雑さによって以下の三段階に分け、アーキテクチャ設計をどうするかを考えてみる。

1. 複雑さ：低い（開発対象システムそれぞれが、1つのAppに押し込められる程度）
1. 複雑さ：中程度（1.にも3.にも分類できない程度）
1. 複雑さ：高い（モノリシックなシステムとして構築すると、開発・保守・リリースの生産性が低下し、マイクロサービス化が明らかなメリットをもたらす場合。あるいは将来そうなることが想定できる場合）

| 複雑さ | アーキテクチャ設計方針 | 備考・補足 |
|:-|:-|:-|
| 1. 低い  | 真剣に検討する必要が無い  | 1つのAppに収まる程度なので、アーキテクチャ設計がそんなに影響を持たないと思われる  |
| 2. 中程度  | ①O11のアーキテクチャ設計を微修正して踏襲<br />② マイクロサービス設計 | 現実的には、OutSystemsで作るアプリケーションはこの範囲に収まるのでは？ ODCを触ってみた感じでは、現実的には①も十分可能と思われる |
| 3. 高い  | マイクロサービス設計  | マイクロサービス設計が明らかにメリットを持つので、OutSystemsの推奨に合わせるのがよさそう  |

## ⓵O11のアーキテクチャ設計を微修正して踏襲
[ODCのアーキテクチャ設計の変更に備える（2023/10/18 UserGroup LT）](https://qiita.com/jyunji_watanabe/items/d5c27f611c251c697a4a)で書いたような事項への考慮が必要。

具体的には、以下。特にトランザクションが分散してしまうのを避けるのが重要（実装が難しくなってしまうので）

- Applicationは無くなったのでApplicationにまとめるステップはなし
- Architecture Canvasであれば、業務ロジックはCore Businessレイヤーのモジュール、UIはEnd Userレイヤーのモジュールというように分割していたが、ODCではAppをまたがるActionの参照は通信ベースになる（＝オーバーヘッドがある）ので、O11のモジュールよりはODCのAppは気持ち粒度が大きくなる
- ODCの制約により、Appをまたがると別トランザクションになるため、ある一連の処理で更新するEntityは同じAppに分類されるように設計する

# O11 -> ODC移行ドキュメントからのフィードバック
元々、ODCではマイクロサービス設計やDDDを推奨するような記述は多かった。

最近追加されたOutSystems 11アプリケーションをODCのApp/Libraryに移行するためのドキュメントでも、この点を補強するような記述があった。

このようにOutSystemsが公開する資料は、マイクロサービス設計やDDDを前提とするものが増えてきているので、マイクロサービス設計にしておければ、将来の変動に備えやすくなる（現実的にどの程度の追加コストがかかるのかが不明なので、気軽にできる選択ではないが）。

ドキュメントについては、読んだ感想を以下にまとめてある。参考までに。

[O11からODCへの移行についてのドキュメントを読んで見る（2023/12/16時点）](https://blog.house-soft.info/archives/2205)
AWS ElastiCache Serverless を利用してみる

# ElastiCache Serverless の利点

- 1 分以内で作成
- アプリケーションのトラフィック パターンに基づいて容量を即座に拡張
- キャッシュノードタイプ、シャード数、レプリカ数、AZ 間のノード配置などを気にすることない

CloudFormation の作成方法によっては後でシャード数とかを増やそうとかなんとかなった時に置き換えが発生したりとかして、仕方なくコンソールもしくは CLI からやってとかいろいろ考慮が必要だったような記憶があり、このあたりを勝手にやってくれるのは嬉しい。

https://aws.amazon.com/jp/about-aws/whats-new/2023/11/amazon-elasticache-serverless/


# サポート

- Redis バージョン 7.1 と Memcached バージョン 1.6.22 以降でサポート


# エンジン バージョンのアップグレード

- 新しいマイナーバージョンやパッチエンジンバージョンは透過的に適用。
- 新しいメジャーバージョンは利用可能になると、ElastiCache Serverless はコンソールに通知を送信し、EventBridge にイベントを送信。 ElastiCache Serverless のメジャーバージョンアップグレードは、アプリケーションが中断されないように設計。


# 設定

「サーバレス」
![スクリーンショット 2023-12-17 15.42.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/a4536e26-0902-d8be-c922-3a3f1371609a.png)

「デフォルト設定」
![スクリーンショット 2023-12-17 15.51.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/424b4d14-9419-886a-702a-59532673fe5a.png)
ここで気になるのは「使用量の上限」でしょうか。
メモリは、キャッシュのメモリまたはコンピューティングの上限を選択し、設定すると、キャッシュはこの制限を超えてスケールしなくなります。

# 起動時間

正確な時間は計測できていませんが、1 分以内というよりは、約 1 分程度とい右ところでしょうか。


# 既存の Redis から移行

なお、既存の Redis から移行することも可能なので、その場合は、AWS News Blog を確認しましょう。

https://aws.amazon.com/jp/blogs/aws/amazon-elasticache-serverless-for-redis-and-memcached-now-generally-available/


# 既存の AWS ElastiCache の概要

https://qiita.com/leomaro7/items/f031cfdd7d12d5d5ccc5
分類問題と回帰問題

前記事では、ニュートラルネットワークの導入をした。

https://qiita.com/mitsumizo/items/2cba9b623b75939a89a3

今回は、ニュートラルネットワークの利用先である「分類問題」と「回帰問題」について考える。

## 分類問題

**入力データがどのクラスに属するか**という問題である。

人の写った画像やある人の音声など、インプットは問わないが、そのインプットが男性なのか女性なのか、どちらであるかを分類する問題が具体例である。

この生物学的男女のようなものは「2値分類」と呼ぶ。
チームA,B,Cなどの3つ以上の分類を「多値分類」と呼ぶ。

## 回帰問題

**入力データから数値の予測**を行う問題である。

人の写った画像やある人の音声など、インプットは問わないが、そのインプットがその人の体重とか身長がどれくらいなのかという予測値を出す問題が具体例である。


## まとめ

インプット：人間の写真
アウトプット
    - 男か女か → 分類問題
    - 予測体重 → 回帰問題


一般的に分類問題は「ソフトマックス関数」、回帰問題は「恒等関数」を用いるらしい。
それは次の記事にて。
Excelに自動更新される祝日カレンダーを追加する（営業日計算用）

# 結論

- 内閣府ホームページにある「国民の祝日.csv」を利用する
https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv
- PowerQueryを利用して、テーブルデータとして取得する

# 手順

1. Excelファイルを開く
1. タブメニューのデータから「データの取得と変換」→「Webから」を選択する
  ![スクリーンショット 2023-12-17 154911.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119135/5b2259b8-59a5-e60e-31b4-bbc758a35007.png)
1. 基本のままにして、URLに下記URLを入力して、OK
  ![スクリーンショット 2023-12-17 155024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119135/c19b765d-e2f3-cde6-0d4c-202588a1fa7b.png)
1. URLからデータを取得するので、「読み込み」を押す
  ![スクリーンショット 2023-12-17 155104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119135/aa062df7-c2f4-a633-e197-34f92cfe400a.png)
1. 「syukujitsu」テーブルとして、シートに読み込まれる
  ![スクリーンショット 2023-12-17 155205.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119135/72634aef-790f-3a2e-752f-ca811f0197f3.png)

# メモ

- 2023年12月時点で取得すると、1955年～2024年まで取得された。
- 基本的に1年更新？
- 12月31日（大晦日）は祝日扱いでは無い
- 金融系のデータを扱う際に使用するのであれば、注意が必要
- CSVデータなので、プログラミング言語で取得して使うことも可能
- PowerQueryは便利
アルコールセンサー MQ-3B を試す

自分用メモにつき雑なのはご了承ください

[MQ-3B](https://akizukidenshi.com/catalog/g/gP-16269/)
[ピッチ変換キット](https://akizukidenshi.com/catalog/g/gK-16296/)
[フォトカプラ TLP624](https://akizukidenshi.com/catalog/g/gI-07551/)
[可変抵抗10kΩ](https://akizukidenshi.com/catalog/g/gP-06110/)

https://akizukidenshi.com/download/ds/winsen/mq-3b.pdf
https://akizukidenshi.com/download/ds/toshiba/tlp624.pdf

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/8f00de26-7587-3cde-d799-0235479ae18a.png)
![MQ-3B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/a38b0ad5-686a-ca25-7d39-1eb6a44bdd23.png)

```
#include <Arduino.h>

//#define HEATOR_PIN 2
#define REGIST_PIN 3
#define SENSOR_PIN A0
#define MOTOR_PIN 5
#define LED_PIN 13
#define THRESHOLD 500
#define CHECK_INTERVAL 500

void setup() {
  //pinMode(HEATOR_PIN, OUTPUT);
  pinMode(REGIST_PIN, OUTPUT); // 103 VR
  pinMode(SENSOR_PIN, INPUT);
  pinMode(MOTOR_PIN, OUTPUT);
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(115200);
  //digitalWrite(HEATOR_PIN, HIGH);
  digitalWrite(REGIST_PIN, HIGH);
  digitalWrite(LED_PIN, LOW);
  // set default output value to 300
}

void loop() {
  int sensorValue = analogRead(SENSOR_PIN);
  Serial.println(sensorValue);
  if (sensorValue > THRESHOLD) {
    digitalWrite(LED_PIN, HIGH);
    digitalWrite(MOTOR_PIN, HIGH);
  } else {
    digitalWrite(LED_PIN, LOW);
    digitalWrite(MOTOR_PIN, LOW);
  }
  delay(CHECK_INTERVAL);
}

```

回路を組んで実行すると、arduinoから値が返ってきます。
```
---- Closed serial port COM24 due to disconnection from the machine ----
---- Reopened serial port COM24 ----
447
607
720
775
808
827
840
846
```
返ってくる値が３００程度になるように可変抵抗で調節します（雑に合わせる程度で大丈夫です）。
その後アルコールで湿らせた布などを近づけると値が上昇し、THRESHOLDを超えるとＬＥＤが点灯します。

https://youtu.be/sIyWL1VYnhg?si=XQVTB69LGgr_x6Uq
【Next.js × GraphQL】query、mutationの書き方について

Next.js で GraphQL クエリやミューテーションを行う際に `graphql-request` ライブラリを使用する方法を説明します。このライブラリは、GraphQL クエリの実行を簡単にするための最小限の GraphQL クライアントです。

### 基本的なセットアップ

1. **パッケージのインストール**: まず `graphql-request` をプロジェクトに追加します。
   ```bash
   npm install graphql-request
   ```

2. **GraphQLClient のインポートと設定**: クライアントをインポートして、GraphQL サーバーのエンドポイントを設定します。
   ```javascript
   import { GraphQLClient } from 'graphql-request';

   const client = new GraphQLClient('your-graphql-endpoint');
   ```

### クエリの実行

GraphQL クエリは、通常の文字列として記述されます。`graphql-request` を使用してこれらのクエリをサーバーに送信できます。

```javascript
// クエリの例
const query = `
  query GetUser($id: ID!) {
    user(id: $id) {
      name
      email
    }
  }
`;

// クエリの実行
client.request(query, { id: 'ユーザーID' }).then((data) => {
  console.log(data);
});
```

### ミューテーションの実行

ミューテーションもクエリと同様の方法で実行できますが、操作の種類が `mutation` になります。

```javascript
// ミューテーションの例
const mutation = `
  mutation UpdateUser($id: ID!, $email: String!) {
    updateUser(id: $id, email: $email) {
      id
      name
      email
    }
  }
`;

// ミューテーションの実行
client.request(mutation, { id: 'ユーザーID', email: 'new-email@example.com' }).then((data) => {
  console.log(data);
});
```

### エラーハンドリング

GraphQL クエリやミューテーションの実行中にエラーが発生した場合、`catch` ブロックを使用してエラーを捕捉し、適切に処理できます。

```javascript
client.request(query, { id: 'ユーザーID' })
  .then((data) => console.log(data))
  .catch((error) => console.error(error));
```

これで、Next.js で `graphql-request` を使用して GraphQL クエリやミューテーションを実行する基本的な方法を理解できました。API エンドポイントやクエリの詳細は、使用している GraphQL スキーマに応じて異なります。
eslint の no-await-in-loop の指摘の検証

# Promise.all() による非同期実行の性能

このテストプログラムでは、eslint が [no-await-in-loop](https://eslint.org/docs/latest/rules/no-await-in-loop) で指摘するコードについて、どのような問題かを調査するため、ファイルの読み込みを同期的に順次実行した場合（指摘の対象となるコード）とPromise.all() を使って非同期に並列実行した場合の性能の比較します。
ソースコード全体は https://github.com/procube-sandbox/await-in-loop-test で公開しています。

## await を含むループで実行

以下に 2000 個のファイルを順次読み出すプログラムを示します。

```typescript　{.line-numbers}
async function testSync() {
    const logger = new BufferdLogger()
    const numbers = []
    for (const filename of filenameGenerator(size)) {
        logger.log(`start process for file ${filename}`)
        const data = await readData(filename, logger)
        logger.log(
            `end process for file ${filename} result = ${JSON.stringify(data)}`,
        )
        numbers.push(data.number)
    }
    logger.log(`numbers=${JSON.stringify(numbers)}`)
    // 実行順序・結果を確認する場合は以下を実行
    // logger.print()
}
```
上記を eslint にかけると、 [no-await-in-loop](https://eslint.org/docs/latest/rules/no-await-in-loop) の規則に引っかかってエラーになります。 await(非同期に実行可能な処理）を同期的に順次実行するので効率が悪いと言う指摘です。

## 並列処理版

上記と同等のプログラムを Promise.all() を使って書き直しました。

```
async function testAsync() {
    const logger = new BufferdLogger()
    const numbers = await Promise.all<number>(Array.from(filenameGenerator(size)).map(async (filename) => {
        logger.log(`start process for file ${filename}`)
        const data = await readData(filename, logger)
        logger.log(
            `end process for file ${filename} result = ${JSON.stringify(data)}`,
        )
        return data.number as number
    }))
    logger.log(`numbers=${JSON.stringify(numbers)}`)
    // 実行順序を確認する場合は以下を実行
    // logger.print()
}
```

## 性能測定結果

以下により、Promise.all() を使用した方が3倍以上性能が良いことがわかりました。

```
$ yarn start
yarn run v1.22.19
$ yarn build && node index.js
$ tsc -p tsconfig.json
elapstime for testSync() = 480ms
elapstime for testAsync() = 128ms
Done in 2.37s.
```

二度目の実行の場合やテストの順序により結果は変動しますが総じて２倍以上の差があることは確認できています。また、ファイルの数が増えると差が開く傾向にあります。

## 実行手順

上記テストプログラムを実行するためには node.js の 18 以上と git cli がインストールされた環境が必要です。以下のコマンドで実行できます。

```shell
git clone https://github.com/procube-sandbox/await-in-loop-test.git
cd await-in-loop-test
yarn install
yarn start
```
Ubuntu20.04.6 LTSにOpenVPNでVPNサーバーを建てる

本記事は、[めんどい太郎の Advent Calendar 2023](https://qiita.com/advent-calendar/2023/mendoitarou_first_calendar) 23日目の記事です。

# はじめに

この記事は初心者が書いています。

今回はUbuntu 20.04.6 LTSでOpenVPNを使ってVPNサーバーを建てていきたいと思います。

# OpenVPNとは
[日本の公式サイト](https://www.openvpn.jp/introduction/)によると、

>OpenVPNはOpenVPN Technologies, Inc. を中心に開発が行われているオープンソースのVPN（Virtual Private Network）ソフトウェアで、GPLライセンスによって公開されています。

とのことです。

つまり誰でも使えるVPNソフトってことだと思います。

# サーバーを建てる
早速VPNサーバーを建てていきます。

こちらの記事[^1]を参考にしました。

## OpenVPNのインストール
シェルスクリプトファイルを用います。

https://github.com/angristan/openvpn-install

```Shell
curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh
chmod +x openvpn-install.sh
sudo bash ./openvpn-install.sh
```

あとは指示通りやれば...

**終わり**

簡単ですね！

(DNSサーバーはGoogleのを使うのをおすすめします。)

## ファイアーウォールの設定
こちらもコマンドでサクッと

```Shell
sudo ufw allow openvpn
sudo ufw reload
```

これでOK

## クライアント側の設定
scpなどを用いて先ほど作成した``~~.ovpn``ファイルをクライアントに転送します。

あとはスマホアプリを入れるなり、PCのクライアントソフトを入れるなりしてこのファイルを読み込ませればOKです。

ChromebookはAndroid版のクライアントアプリで接続できます。

# 終わりに
すべて手動でやったのにもかかわらず何故かうまく行かず、調べたらこんな便利なスクリプトがありました。

忘れないようにするためと皆さんの役に立てばと思います。

[^1]:[爆速OpenVPNサーバー設定＆接続](https://qiita.com/__deracio__/items/54b75ab514abd1e660e8)
[TypeScript] ETHのSepoliaテストネットの残高の取得

# はじめに

この記事は、[METAMASK](https://metamask.io/)でウォレットが作られている状態から、typescriptで残高を表示するところまでの流れです。概要としては以下のような流れで行います

1. METAMASKのウォレットにSepoliaのフォーセットを受け取る
2. フォーセットの受け取りを確認
3. アドレスを使用して、seploiaのテストネットの設定をするための選定
4. typescriptで残高取得をする
5. ついでにpythonでもやってみる？

# 前提
:::note info
METAMASKのアカウントが作られている。
:::

## 【前提1】 Seploiaとは

めっちゃ簡単に言えば、とりま今回使用するETHのテストネットです。

>Sepolia はアプリケーション開発に推奨されるデフォルトのテストネットです。
Sepolia ネットワークは、許可型のバリデータセットを使用しています。 また、まだ新しいものであるため、ステートや履歴などデータ量が少ないことも特徴です。

https://ethereum.org/ja/developers/docs/networks/


## 【前提2】 ETHに興味がある
今回行うものとしては、ETHの開発に興味があるけど、手の付け方がわからない人のためのものです。そのため、多少噛み砕くことから、正確でない言葉を用いているところがあります。ご了承ください。




# 【Step01】 METAMASKのウォレットにSepoliaのフォーセットを受け取る

## METAMASK上のSepoliaのアドレスを入手します。
METAMASKに入った状態で、以下の項目を選びます。

<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556108/486682bb-adc0-30ea-ef34-1ba61c6f6eee.png">

この後に、赤枠のところからウォレットアドレスをコピーして、以下のページでフォーセットを受け取ってください。テストネットにおけるフォーセットには価値がありません。あくまでもテスト環境でどのように動かせるかの体験になります。ちなみに、Goerliなドンネットワークでは、メインネットのウォレットに少量でもETHを持っていないとテストネットで試すことができないものもあります。そっちでやりたい場合は、課金しておいてください（笑）


**Sepoliaでは無課金でいけます!!!!**

![Screenshot 2023-12-17 at 15.27.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556108/8a7e0209-33d1-a774-f049-5570ddab4de9.png)

こぴったら、以下のページにアクセスして、受け取る！！！

[Sepolia Faucet](https://sepoliafaucet.com/) で自分のMETAMASKのSepolia


https://sepoliafaucet.com/

# 【Step02】 フォーセットの受け取りを確認

以下のページで確認してみましょう。

https://sepolia.etherscan.io/

![Screenshot 2023-12-17 at 15.33.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556108/3fbb78f6-4cc2-51f6-1b36-072422c24930.png)

取引（トランザクション）が発生して、0.5ETHが送られたことがわかりますね。これしか受け取っていないため、現状の残高は0.5ETHです。

:::note warn
この記事では、別でマイニングをした後に記事を書いたため、正確には、**1.483ETH** が正確な残高になります。
:::

残高を1.483ETHとして話を進めます。



# 【Step03】 アドレスを使用して、seploiaのテストネットの設定をするための選定

ブロックチェーンは、分散型台帳としての役割を果たし、暗号通貨からスマートコントラクトまで様々な応用が可能です。しかし、ブロックチェーンのデータにアクセスするためには、特定の方法が必要とされます。ブロックチェーンネットワーク内のノードと、それらにアクセスするためのRPC（Remote Procedure Call）というものがあります。このRPCを使用して、残高を今回は取得していきます。

これを探すためのページを以下から探します。どれか一つでいいと思います。今回は、**" https://rpc.sepolia.org "** を使用します。

https://chainlist.org/chain/11155111?testnets=true


# 【Step04】 typescriptで残高取得をする

実際にコードを書いてみましょう。

このコードで使用するパッケージは、[ethersパッケージ](https://www.npmjs.com/package/ethers)になるので、

```
$ npm install ethers
```

をしておいてください。パッケージ詳細は↓


https://www.npmjs.com/package/ethers

ついでに、実行のために、typescriptとts-nodeを入れておきましょう

```
$ npm install typescript ts-node
```


```typescript: getBalance.ts
import { ethers } from 'ethers';

// ネットワークの設定（先とったエンドポイント）
const sepoliaProvider = new ethers.JsonRpcProvider('https://rpc.sepolia.org');

async function getBalance(): Promise<void> {
    const walletAddress:ethers.AddressLike = "<ここにはウォレットのアドレス>";
    // 指定されたアドレスの残高を取得
    const balance = await sepoliaProvider.getBalance(walletAddress);
    // Etherの単位に変換
    const balanceInEther = ethers.formatEther(balance);

    console.log(`SepoliaのネットワークのETHの残高は: ${balanceInEther} ETH`);
}

// 関数の実行
getBalance();

```


### 出力結果

```terminal: 実行と結果
$ npx ts-node getBalance.ts

SepoliaのネットワークのETHの残高は: 1.483 ETH
```

しっかりと取れましたね。

以上！！！！
ベーシックリカバリという考え方と実践

はじめまして。私はとあるSIerで、とある大規模サービスのITサービスマネージャをやっています。相対しているサービスは歴史のある金融系サービスでベストプラクティスもさまざま取り揃えています。近年はクラウド化や一つの機能を提供するのに複数のサービスを組み合わせるなどして、サービスはどんどん複雑化するし、故障箇所はタテにもヨコにも増えており稼働率を稼働箇所の掛け算と考えると、残念ながら稼働率で捉えた信頼性を向上させるのが難しい状況です。
外部サービスを含めた横串でのサービスレベルの向上というのは、一つの重要なテーマですが、今回の記事はそっちではなく、故障発生時の迅速な復旧について書きます。私が相対しているサービスのうち、複数のサービスで故障の長時間化が発生し、問題になったためベーシックリカバリという早期復旧の手順整備に取り組んだ時の話です。

# ベーシックリカバリとは
故障原因が特定／確定できない状況下において、故障原因を含むと思われる部位の状態を初期化することで、原因を除去し復旧を行う考え方
要は、試しに再起動やフェイルオーバをやってみるというやつです。
皆さんもやったことがあったりするのではないでしょうか？

ベーシックリカバリとして考えられるのはおおよそ以下の手段です。

:::note info
1\.再起動
2\.リストア
3\.機器交換
4\.DRサイトへの切り替え
:::
# ベーシックリカバリの適用は案外難しい
メモリリーク、ファイルディスクリプタやプロセスが上限に達したなど、ポチッと再起動で治る場合は多いのですが、思い切って再起動するのは難しいです。仕掛かり中のバッチの復旧のさせ方や、状態の一貫性などあとで辻褄を合わせないといけない項目が想像以上に多く、頑張って復旧させたと思っても、2、3日後に実は一部がおかしいことが判明なんてこともあります。

# サービス停止の長時間化は悪という共通認識
それでも最近は、サービスが少しでも止まると、新聞、ネットニュース、テレビなどシステム障害に関するニュースバリューが高いのかすぐに報道されます。技術者としては、原因究明を行い、原因を除去した上で安全に復旧させたい気持ちもわかります。
が、それはお客様ファーストの考えではありません。原因究明に走ると、作業者は作業に潜ってしまい、お客様への経過報告も滞りがちになります。
故障が起きたら、まずは以下を行う必要があるのです。

:::note info
1\.サービス提供状況の把握
2\.速やかな復旧
3\.お客様への情報提供
:::
# 故障対応で潜るのも悪
私の相対するサービスは50程度あり、大規模な故障が起きると、開発、維持、営業と運用ですぐに100人以上が集まります。

原因がわからないと、調査も何をやったらいいのかわからず、それでも何かをやっていないと気まずいので、マネジメントやガバナンスの力が弱いと個々人が思ったことをやります。ログの調査、技術情報の収集などそれっぽいことです。効果のあるなしに関わらずです。。。なぜか？

:::note alert
役に立ってないと思いつつ、何かをやっていることで、エクスキューズができるからです。
:::
しかしこれでは復旧に向けて一直線に動いているとはいえません
（この問題の対策は機会があれば記事にします）

# ベーシックリカバリ手順の整備の意義
ベーシックリカバリ手順を整備する意義は、迅速な復旧の実現に他なりません。長時間停止は悪、故障対応で潜るのも悪という共通認識ができれば、みんな対処方法がわからないときにベーシックリカバリで行こうという共通認識が持てます。たとえ、仕掛かりバッチの復旧が大変でも、利用者向けのサービス提供をまずは復旧させることが優先なのは明白だからです。

手順書整備の目的は、*運用担当者が復旧を行える*ということです。
開発担当者が復旧できるではダメで、*24/365サービスを多く抱える*私の部門では、夜中に故障が起きて開発が駆けつけて対応すると2、3時間はすぐに経過してしまうので、

:::note info
24時間張り付いている運用担当者ができることがとても重要です。
:::
# 運用担当者ができるための手順ー標準化された運用受け入れ
50もサービスがある私の運用部門では、かねてから運用受け入れの手続きが決まっていて、手順書に対する要求事項も標準化されており、サービスごとに必要な教育はできるだけ小さくなるようにしています。
ベーシックリカバリにおいても、さまざまな構成のサービスの故障部位に対して、公約数となるようフロントエンド、バックエンドなどの要素ごとにグルーピングし、各サービスには統一された考えで復旧方法、手順を運用に示すことを要請し、運用担当者はどのサービスが故障しても、*ベーシックリカバリと聞けば、ああ、あれをやるのか*と頭の切り替えができるようにしています。

# 手順は作ったら終わりではない。実効性とメンテの問題
私たちの運用部門では、運用受け入れ会議というセレモニー？で正式に運用が承認されます。ここに至るまでに作成された手順は

:::note info
運用部門で検証され、実際に打鍵され、作業時間や、オペミス回避の工夫など要求所用時間を満たしているか確認され、合格する必要がある
:::
のです。

また、作成された手順書は陳腐化してはなりません。昔は変更管理の仕組みで陳腐化をカバーしようとしていましたが、棚卸しを開発部門に要求することと、運用部門から新しい要求事項への対応（例えば自動化に向けた準備のステップの推進）を行う中で、

:::note info
必要な変更がなされているか定期的に検証する
:::

仕組みを作り、開発部門に要求をしています。
緊急対応で暫定的に受け入れた手順を本格手順に叩き直すのもこの棚卸しの意義だったりします。

# 日頃の訓練の「やり方」の重要性
ベーシックリカバリに限らずですが、やると決まっていることが簡単なことでも案外できません。これは訓練を繰り返し、作業を分解し、一人一人できることできないことを把握し、組織として

:::note info
どこが難しいのかを分析し、次の訓練では弱点にフォーカスして集中的にやることが重要
:::
だと思います。
これまで訓練をやってきて効果が出ないと思ってる組織は試してください。1人1人評価することで、個人として頑張るところ、組織として引き上げる部分、フォーカスできるようになります。

# もちろん営業も故障対応がある
訓練は開発と運用がやればいいのではなく、顧客アナウンスの面では営業に活躍してもらわねばなりません。運用部門が発出する故障報でカバーしきれな情報、細かな顧客からの問い合わせの管理、サービス停止の状況によっては返金対応や、会社としてのニュースリリースの掲載など営業部門も組織化されている必要があり、故障時に必要な体制を故障対策本部運営マニュアルとして定義して、それが実効的であるための確認を営業を含めた故障対応訓練として実施しておくことが必要なのです。

以上、ベーシックリカバリを通じて、私が故障対応で気にしていることも併せてお伝えしました。不定期にこのような発信ができればと思います。引き続きよろしくお願いします。
一年を振り返りつつ Ruby コミュニティに関わっていくこころみ

# 一年の振り返りと Ruby コミュニティへの新たな歩み
- Ruby コミュニティに参加してみたら楽しかったので
- 2024年は関わっていこうかなと考えています。

---

# 1: 自己紹介
- 吉澤修（よしざわおさむ） [@pugiemonn](https://qiita.com/pugiemonn)
- 調布市飛田給
- 4月から駆け出し事業部長
- ![CleanShot 2023-12-17 at 15.32.50@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1624/c28d0a20-a973-9053-e1e2-be2c5e98b16a.png)


---

# 2: JobQ Town について
- 人材匿名 Q&A サービス Rails 産
- <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1624/38fff1b5-dbc9-f571-e178-e2408816684a.png" width="50%" /><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1624/f37b2ce5-c0f7-ac3f-523d-40bcf8c22f57.png" width="50%" />


---

# 3: コミュニティへの参加
- Ruby Kaigiへ13年ぶりに参加
    - <img src="https://kray.jp/wp/wp-content/uploads/2010/09/cap0100913_1.jpg" width="100%" />
- 5/11~5/13 RubyKaigi 2023
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1624/42364761-94f4-5682-de7a-b11296dd3873.png)
- 9/9 Osaka RubyKaigi
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1624/d3ad5d09-72a0-3d6a-f60d-09bb3fcd2e12.png)
- Kaigi On Rails
    - 
- 11/18（土） 13:00〜 千歳烏山.rb #01
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1624/4ac3b739-e15d-461b-a9a2-d209ac434a9a.png)



---

# 4: チームの現状
- チームメンバーの現状とRubyコミュニティとの関わり
- メンバーの多様性と関心事
- コミュニティへの参加も増やして楽しくやりたいかなと思っています。

---

# 5: 将来の展望
- チーム全員で Ruby コミュニティに関わる計画
- エンジニアのキャリアを考えるといろいろなことを提案できそう

---

# 6: 結論とクロージング
- 2024年は Ruby 系のイベントに参加する人が出るように推していきた
- 経営陣と話をして啓蒙をがんばっていきたいです
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1624/3d910dc4-4522-4243-b089-1d7e316dbfcf.png)
    - 参考： [X](https://twitter.com/nukumaro22/status/1657426661313511425/photo/1)