OmniAICreator/Qiita-1.07M huggingface dataset:
[備忘録]Ruby クラス内の変数とメソッドを調べる


# クラス内の変数とメソッドの調べ方についてまとめます


# 確認用のクラス(Suica)

~~~
class Suica
    DEFAULT_DEPOSIT = 500

    @@val1 = "class_variable"
    @@val2 = "class_variable"
    @val3 = 1
    attr_reader :money

    def initialize()
        @money = DEFAULT_DEPOSIT
    end

    public
    def charge(_money)
        @money += _money
    end

    private
    def spend(_money)
        @money -= _money
    end

    private
    def money
        @money
    end
end
~~~

# 変数を確認する

`クラス変数：Class_variables`
`インスタンス変数：instance_variables`

~~~
suica = Suica.new

puts "インスタンス変数一覧:suica.instance_variables"
puts suica.instance_variables

# => @money

puts "インスタンス変数一覧:class.instance_variables"
puts Suica.instance_variables
puts suica.class.instance_variables

# => @val3

puts "クラス変数一覧:class.class_variables"
puts Suica.instance_variables
puts suica.class.class_variables

# => @@val1
# => @@val2

~~~

# メソッドを確認する（Public, Private, Protected)

`Public: .public_methods`
`Private: .private_methods`
`Protected: .protected_methods`

~~~
puts "public method一覧:suica.public_methods"
puts suica.public_methods

puts "private method一覧:suica.private_methods"
puts suica.private_methods

puts "protected method一覧:suica.protected_methods"
puts suica.protected_methods
~~~

# 参考ページ

https://qiita.com/rsooo/items/ce4f3c0028312d513e3b
【Swift】macアプリのdockアイコンをアニメーションさせる方法

# 概要
この記事では、Swiftでmacアプリのdockアイコンをアニメーションさせる方法について紹介します。dockアイコンのアニメーションには、「DSFDockTile」というライブラリを使用します。

https://github.com/dagronf/DSFDockTile

# デモ
https://twitter.com/shota_appdev/status/1661888101806129153?s=61&t=MALrObBW3B-1Vh80LT3SVQ

# 作るもの
起動時に、dockアイコンでgifアニメーションを再生するアプリを作ります。

# 手順

## gifファイルを用意する
まず、アニメーションさせたいgifファイルを用意します。

## Assets.xcassetsにgifファイルを追加する
Assets.xcassetsに、用意したgifファイルを追加します。

## DSFDockTileをインストールする
DSFDockTileはSwift Package Managerでインストールできます。
1. Xcodeのメニューから「File」->「Swift Packages」->「Add Package Dependency...」を選択します。
1. 「 https://github.com/dagronf/DSFDockTile 」と入力し、「Add Package」をクリックします。
1. 「DSFDockTile」にチェックを入れ、「Add Package」をクリックします。

## AppDelegateにコードを追加する
AppDelegateがない場合は、新たに作成してください。


```swift
import AppKit
import DSFDockTile
import DSFImageFlipbook

final class AppDelegate: NSObject, NSApplicationDelegate {
    let animatedDockTile = {
        let data = NSDataAsset(name: NSDataAsset.Name("gifファイルの名前"))! // gifファイルを読み込む

        let flipbook = DSFImageFlipbook()
        _ = flipbook.loadFrames(from: data.data)
        return DSFDockTile.Animated(flipbook, dockTile: NSApplication.shared.dockTile) // DSFDockTile.Animatedを作成する
    }()

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        animatedDockTile.startAnimating() // アニメーションを開始する
    }
}
```

このコードでは、以下の処理を行っています。
1. gifファイルを読み込む
1. DSFDockTile.Animatedを作成する
1. アニメーションを開始する

## SwiftUIでAppDelegateを使用する
SwiftUIでAppDelegateを使用するには、〇〇App.swiftに以下のコードを追加します。

```swift
import SwiftUI

@main
struct SampleApp: App {
    @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate // これを追加

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
```

# おわりに
この記事では、Swiftでmacアプリのdockアイコンをアニメーションさせる方法について紹介しました。今回は、起動時にアニメーションを再生する方法を紹介しましたが、アニメーションの再生タイミングを変更することもできます。ぜひ、いろいろ試してみてください。
特徴量エンジンKaskadaの宣言型クエリ言語 Fenl〜レコード(Record)とその操作

# はじめに

先日、以下の記事を発表しました。

https://qiita.com/yoshiyuki_kono/items/7dc7bdad5e02ff986f5d

新しいテクノロジーに触れる時はいつでも楽しいものです。
中でも新しいプログラミング言語（のパラダイム）を学ぶことは、特別に楽しいことです。

ということで、まだまだ勉強中ですが、公式ドキュメントの学習過程の記録として、以下の記事をまとめてみました。特に、日本語に置き換えるにあたっての用法が固まっていない分野として、自分にとって受け止めやすいのは何か？という観点からの試みとなっています。

Fenlとは何か、については、下記の記事を参照ください。

https://qiita.com/yoshiyuki_kono/items/e2056d884242901facfd

本稿情報のソースとして、下記ドキュメントを参照ください。

https://kaskada.io/docs-site/kaskada/main/fenl/working-with-records.html

## レコード(Record)基礎


Fenlでは、レコード(Record)と呼ばれるデータセットが用いられます。
１つのレコードには、 複数の値を含めることができます。
各値は名前を持ちます（名前付きフィールド）。


レコードは、  `{name: "john", age: 32}`のように、中括弧を使用して作成できます。対応するタイプは  `{name: string, age: number}`のように、記述されます。

レコード内のフィールドは順序付けされています（JSONとは異なる）。
順序は、以下のようなケースに影響します。
 - 2 つのレコードを比較する（それらが同じタイプであるかどうかを判断する）場合
 - レコードの内容を出力する場合（の出力順）。
 

## レコードの拡張
レコードは、別のレコードのフィールドで拡張できます。名前が衝突すると、新しいフィールドが古いフィールドをオーバーライドします。これは`extend(new_record, original)`または`original | extend(new_record)`として実行できます 。

例:` {name: "john", age: 32} | extend({age: 33, lastname: "smith" })`により、`{name: "john", age: 33, lastname: "smith" }`レコードが生成されます。

## フィールドの選択または投影
レコードの特定のフィールドは、 `select_fields`を使用して選択できます。結果は、指定されたフィールドのみを含むレコードになります。

例: `select_fields({name: "john", age: 33, lastname: "smith" }, "lastname", "name")`は、 `{name: "john", lastname: "smith"}`レコードを生成します。

## フィールドの削除
レコードの特定のフィールドは、 `remove_fields`を使用して削除できます。結果は、名前付きフィールドのないレコードになります。

例: `remove_fields({name: "john", age: 33, lastname: "smith" }, "lastname", "name")`は、 `{age: 33}`レコードを生成します。
PC操作をGIF動画にする方法

# PC操作をGIF動画にする方法

## はじめに

GitHubのREADMEで一番わかりやすいのがGIF動画。これを簡単に作成したい。

## 環境

| 項目 | バージョン |
| ---- | ---- |
| OS | Windows11 |

## ScreenToGifをインストールする

* [公式サイト](https://www.screentogif.com/)から「ダウンロード」>「インストーラー」とクリックしてmsiファイルをダウンロードする。

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23570/8e8359c2-aae1-340e-805b-1f412b8be790.gif)

* msiファイルを実行する。
* 「次へ」>「インストール」>「終了」とクリックしてインストールする。

## ScreenToGifで録画する

* ScreenToGifを開く
* 「録画」>「録画」をクリックして、録画を開始する
* 「停止」をクリックして録画を終了する
* 編集画面になるので、いらないフレームを選択してからDeleteを押して削除する
* 「ファイル」>「名前をつけて保存」をクリックして保存する
* ScreenToGifを閉じる

## 参考サイト

[Windows で 画面操作を Gif で録画したいなら ScreenToGif がオススメ](https://dev.classmethod.jp/articles/introduction-screentogif/)
[ScreenToGifの公式サイト](https://www.screentogif.com/)
3で割りきれる2進数とその正規表現

以下のサイトで勉強していると、「3で割りきれる2進数の正規表現」というテーマが出てきました。

https://www.geeksforgeeks.org/designing-finite-automata-from-regular-expression-set-1/

結論から言うと、(1+1(01*0)*1)*です。
(「+」を「または」の意味で使っています。)

なぜそうなるのかが記載されていなかったので、導出しました。

（以下導出）

nを非負整数として、2^nを3で割った余りは、以下の様になります。

2^0 → 1
2^1 → 2
2^2 → 1
2^3 → 2
2^4 → 1
...

このことから、2^(2n) mod 3 = 1, 2^(2n+1) mod 3 = 2 (nは非負整数) がわかります。

ここで、2進数において、偶数桁にある1の数をeven1、奇数桁にある1の数をodd1とします。

先ほどの考察から、3で割り切れる2進数は、

(2(odd1) + (even1)) mod 3 = 0
⇔ ((even1) - (odd1)) mod 3 = 0

が成り立っていることがわかります。

つまり正規言語は、
{w | wを2進数とみなすと ((even1) - (odd1)) mod 3 = 0}
となります。

しばらく手を動かしてみると、これを受理するような有限オートマトンは、以下の様になるとわかります。ただし、受理状態はAです。
（マウスで描いたので気持ち悪いかもしれません。）
![A.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1693441/23821185-6277-288b-d145-ed67f84064d8.jpeg)

最終的に状態Aに遷移するような言語の正規表現を導出します。
ただし、以下の記事にあるArden's theoremを前提知識とします。

https://www.geeksforgeeks.org/theory-of-computation-ardens-theorem/

上記のオートマトンによる言語方程式は、以下の様になります。

A = ε + A0 + B1 (1)
B = A1 + C0 (2)
C = B0 + C1 (3)

(3)より、C = B01* (3)' (∵Arden's theorem)
(2)と(3)'より、B = A1(01* 0)* (2)' (∵Arden's theorem)
(1)と(2)'より、A = (0+1(01*0)*1) * (∵Arden's theorem)

求める正規表現は、受理状態であるAの、(0+1(01*0)*1)*であることがわかりました。

誤り、誤字、脱字などがあれば教えていただければ幸いです。
React Routerとhistory【初心者向け解説】

Webアプリケーションを作成する際、異なるページ間を移動する機能は必須です。React Routerは、Reactで使うことができるルーティングライブラリで、このようなページ遷移を管理します。

今回は、React Routerの重要な部分である**history**オブジェクトについて解説します。

## React Routerとは何か

React Routerは、シングルページアプリケーション（SPA）でページ間の遷移を可能にするためのライブラリです。SPAでは、通常、ページ全体をリロードせずに部分的な更新（通常はコンポーネントの置換）を行うことで、ユーザーに複数ページが存在するかのように感じさせます。

## historyとは何か

**history**はReact Routerが提供するオブジェクトで、ブラウザの履歴スタックの状態を管理します。historyオブジェクトは、ページ遷移を行ったり、前のページに戻ったりするためのメソッドを提供します。

```javascript
history.push('/home'); //新しいエントリを履歴スタックに追加し、その位置に遷移します。
history.replace('/home'); //現在のエントリを新しいもので置き換え、その位置に遷移します。
history.goBack(); //履歴スタックの前のエントリに遷移します。
history.goForward(); //履歴スタックの次のエントリに遷移します。
```

## historyの利用方法

React Router v5までは、`withRouter` 高階コンポーネント(HOC)を使用してhistoryオブジェクトにアクセスすることができました。しかし、React Router v6ではこの方法は廃止され、代わりに`useHistory` フックを使用します。

**例: React Router v5**

```javascript
import React from 'react';
import { withRouter } from 'react-router-dom';

function MyComponent({ history }) {
  const navigateToHome = () => {
    history.push('/home');
  };

  return (
    <button onClick={navigateToHome}>
      Go to Home
    </button>
  );
}

export default withRouter(MyComponent);
```

**例: React Router v6**

```javascript
import React from 'react';
import { useNavigate } from 'react-router-dom';

function MyComponent() {
  const navigate = useNavigate();

  const navigateToHome = () => {
    navigate('/home');
  };

  return (
    <button onClick={navigateToHome}>
      Go to Home
    </button>
  );
}

export default MyComponent;
```

## まとめ

React Routerの**history**オブジェクトは、ブラウザの履歴スタックを管理し、ページ間の遷移を制御する強力なツールです。ページ遷移を行う`push`メソッドや前のページに戻る`goBack`メソッドなど、様々なメソッドを提供しています。

React Router v5では、`withRouter` 高階コンポーネントを用いてhistoryオブジェクトにアクセスできましたが、React Router v6ではこの方法が廃止され、代わりに`useNavigate`フックを使用します。
デジトラ(DTA)を使おうとして、使えなかった話（解決策）

## はじめに

筆者はFETしか使ったことがありませんでした。

基板設計をするうえで、デジトラにメリットを感じたので使ってみようと思いました。

#### メリット

-   抵抗が内臓していて、部品点数を減らせる。
-   IOの最大電流が小さいマイコンでも十分使える。



デメリットも、もちろんあります。

#### デメリット

-   流せる電流はせいぜい100mA程度
-   所詮、トランジスタ



使用用途としては、少量のLEDやパワーMOSFETのスイッチングです。



## 注意点（本題）

使用したデジトラは**DTA114E**(PNP)という型です。一般的に多く使われているデジトラです。

ピンアサインを、パッケージ型**TO-29**の場合で考えてみます。

1.   G(GND)
2.   O(OUT)
3.   I(IN)

今までMOSFETとJFETしか使ったことがありません。

G(ゲート),D(ドレイン),S(ソース)と似たような表記だと待ち構えていたので、少し戸惑いました。

### 使用法

色々して自己解釈した結果、下記のような使い方だと分かりました。

意外と初歩的なことなので、このピンアサインについて詳しく紹介しているサイトがあまりありませんでした。

|  ピン名  |         PNP          |         NPN          |
| :------: | :------------------: | :------------------: |
| G（GND） |         ５V          |         GND          |
| O（OUT） |    制御したい機器    |    制御したい機器    |
| I（IN）  | マイコンなどの制御IO | マイコンなどの制御IO |

## おまけ

データシートをよくよく見てみると、ちゃんと**GND(+)**って書いてました。

電気特性のところにも**最大供給電圧-50V**とちゃんと書いてました。負電圧、私の苦手な言葉です。



![image-20230526100043497.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455831/00355952-5451-c39f-4c9e-72a1938bd895.png)
スクレイピングでステータスコードの取得と利用方法


特定のURLに対して、ステータスコードを取得し、有効性を判断します。
例えば、リストからURLへ逐次アクセスする場合、アクセス先が有効かどうかを確認しておけばアクセスエラーをあらかじめ回避できます。

URLの有効性の判定はHTTPレスポンスのステータスコードを確認します。
ステータスコード200が取得できれば、そのURLは一応正常という形です。
さらに、200以外のステータスコードでも対応方法を選ぶことができます。

問題の判定に利用しているのは以下のようになります。
|ステータスコード|不具合|対応方法|
|:-:|:-:|:-:|
|404|URLが間違っている<br>無効になった可能性が高い|URLのチェック|
|429|リダイレクト（phpか.htaccess）が設定されている可能性が高い|個別に確認<br>seleniumを利用してリダイレクト先を再取得する|
|30x|httpリダイレクトが設定されている|meta情報にリダイレクト先が記載されているのでURLを書き換える|
|5xx|サーバーエラー|時間をおいてアクセス|


実際に判定に利用しているコードです。

```python:.py
import requests

def isCheckURL(url):
    try:
        response = requests.head(url, timeout=10)
        if response.status_code == 200:
            return True
        elif response.status_code == 405:  # Method Not Allowed
            allowed_methods = response.headers.get('Allow', '')
            if 'GET' in allowed_methods:
                response = requests.get(url, timeout=10)
                if response.status_code == 200:
                    return True
                else:
                    print(f"URL is not valid. HTTP status code: {response.status_code}")
                    return False
            else:
                print(f"URL is not valid. Neither HEAD nor GET requests are allowed.")
                return False
        else:
            print(f"URL is not valid. HTTP status code: {response.status_code}")
            return False

    except requests.exceptions.RequestException as e:
        print(f"URL is not valid. Error: {e}")
        return False

url = "https://example.com"
if isCheckURL(url):
    print("The URL is valid.")
else:
    print("The URL is not valid.")
```
#個人的な感想
これを使い始めてから、スクレイピングやクローラーの設計・メンテナンスがとても楽になりました。
アクセスの可否を事前判定できますし、動かしながら問題箇所を個別に判定できます。
JavaScriptとReactで分割代入を活用

JavaScriptのオブジェクト[分割代入](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment)（object destructuring assignment）は重要な機能です。分割代入とは、オブジェクトから特定のプロパティを取り出し、それを新たな変数として扱うことができる機能のことを指します。

具体的な例として、ユーザープロフィールから情報を抽出するシナリオを考えてみましょう。まずは、次のようなユーザープロフィールオブジェクトを定義します。

```javascript
let userProfile = {
  name: 'Satoshi Tajiri',
  email: 'satoshi.tajiri@example.com',
  age: 58,
  location: 'Tokyo'
};
```

分割代入を使わない場合、各プロパティを取り出すには次のようにします：

```javascript
let name = userProfile.name;
let email = userProfile.email;
let age = userProfile.age;
let location = userProfile.location;
```

しかし、分割代入を使用すると、これらのプロパティを一行で取り出すことが可能です：

```javascript
let { name, email, age, location } = userProfile;
```

以上のコードは、ユーザープロフィールオブジェクトから `name`, `email`, `age`, `location` の各プロパティを取り出し、それぞれ同名の新しい変数に代入するものです。


それで、Reactのコンポーネントで活用してみましょう。Reactでは、コンポーネントのプロパティ（props）を分割代入することがよくあります。これにより、コードがすっきりとし、各プロパティが明確になります。前回と同様に、ユーザープロフィールの表示を例に取りましょう。まずは以下のように、ユーザープロフィールを表示するコンポーネントを定義します：

```jsx
function UserProfile(props) {
  return (
    <div>
      <h1>{props.name}</h1>
      <p>Email: {props.email}</p>
      <p>Age: {props.age}</p>
      <p>Location: {props.location}</p>
    </div>
  );
}
```

このコンポーネントでは、propsを直接参照して各プロパティを取り出しています。しかし、分割代入を使えば、よりシンプルに書くことができます：

```jsx
function UserProfile({ name, email, age, location }) {
  return (
    <div>
      <h1>{name}</h1>
      <p>Email: {email}</p>
      <p>Age: {age}</p>
      <p>Location: {location}</p>
    </div>
  );
}
```

上記のコードでは、関数の引数部分でpropsオブジェクトを分割代入しています。その結果、コード内で`props.`を繰り返す必要がなくなり、より直感的にプロパティにアクセスすることができます。

分割代入は、コードを簡潔にし、可読性を向上させるための有効なツールです。JavaScriptの基本的な機能を理解し、それをReactの開発に適用することで、効率的かつ読みやすいコードを書くことができるようになります。
Drupal 管理用テーマを変更する

毎回一瞬アレってなるのでメモ。
1. テーマ切り替え画面に遷移
`/admin/appearance`
2. 切り替える

![スクリーンショット 2023-05-26 9.23.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1323938/a8bd47bd-74f1-8315-1b9b-741438682c0d.png)
承認者のコメントをカスタムフィールドに追加する方法


+ [How to add approver comments to a custom field](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PeghQ)

:::note
I think it is possible by using Apex trigger.

**Capture an approval comments to populate a lead custom field**
https://developer.salesforce.com/forums/?id=9060G000000I3uzQAC
:::


```
List<Id> pId = new List<Id>();

        Map<Id,ProcessInstance> xyz = new Map<Id,ProcessInstance>();

        Map<Id,ProcessInstanceStep> abc = new Map<Id,ProcessInstanceStep>();

        for(ProcessInstance pi : [SELECT Id,Status,TargetObjectId FROM ProcessInstance WHERE TargetObjectId =: newmap<object>.keySet() ORDER BY CreatedDate DESC]){

            if(!xyz.containsKey(pi.TargetObjectId)){

                xyz.put(pi.TargetObjectId,pi);

                pId.add(pi.Id);

            }

        }

        for(ProcessInstanceStep pis : [SELECT Id, Comments,ProcessInstanceId, StepStatus, OriginalActorId, ActorId FROM ProcessInstanceStep WHERE ProcessInstanceId IN: pId]){

            if(!abc.containsKey(pis.ProcessInstanceId))

 abc.put(pis.ProcessInstanceId, pis);   

        }

        system.debug('ProcessInstanceStep'+abc);

        system.debug('ProcessInstance'+xyz);

        

        for(<obj> abxy : lstOfNew<obj>) { 

            if(conditions if any) {

                

                ProcessInstance p = .get(abxy.Id);

                if(conditions if any)  

                

 system.debug('anyname'+abc.get(p.Id).Comments);

 <field that u want the comments> = abc.get(p.Id).Comments;

                    

                }

            }        

        }
```
AWSでプレゼンテーション層を構築する



## はじめに
#### Web三層構造のおさらい
- プレゼンテーション層（webサーバー）
    - クライアントとサーバーのインターフェースを担当
- アプリケーション層　（APサーバー）
    - システムに実際の処理を担当
- データベース層（DBサーバー）
    - データベースとの連携を担当

今回はプレゼンテーション層を構築するためのAWSのサービスについてまとめる

## AWSにおけるプレゼンテーション層のサービスまとめ

今回は代表的な3つのAWSのサービスを取り上げる
- Amazon S3
- Amazon Cloud Front
- Elastic Load Balancing

この３つのサービスはそれぞれ特徴があり、異なる目的で使用される。
（"これらのサービスは、単独で使用することもできるが、一緒に使用することでより強力な機能を実現することができる"）

### Amazon S3
**オブジェクトストレージサービス**と言われるものらしい...
オブジェクトストレージサービスとは？
2つの特徴がある
- 静的Webサイトホスティング
    - **静的コンテンツ（フロントエンド（HTML,CSS,Javascript)）を配信できる**
- データをオブジェクトとして保存・管理する
    ＝ **画像・動画ファイルなど（非構造化データ）を保存することが得意**

### Amazon Cloud Front
**コンテンツ配信ネットワーク**と言われるものらしい...
コンテンツ配信ネットワークとは？
3つの特徴がある
- 静的コンテンツと　動的コンテンツの配信ができる
    - 静的コンテンツ（フロントエンド（HTML,CSS,Javascript)）
    - 動的コンテンツ（サーバー側でリアルタイムで生成されるWebページ(APIの呼び出し・データベースの反映)）
- 配信速度が早い（速度）
    - エッジロケーションという技術によって可能になっている
        - エッジロケーションとは、世界中の複数の場所に設置されたサーバーのネットワークを利用する技術。これにより、ユーザーに最も近い場所から配信できる。
- セキュリティ機能が強い（安全性）
    - SSL・TLS管理（？）
    - DDos攻撃の防御（？）

### Elastic Load Balancing

執筆中...
Vue.jsをLaravel uiでインストールする方法をまとめてみた*確認問題つき

## はじめに
プロジェクトでVue.jsを使用する必要があり、Laravel UIパッケージを使用してVue.jsをインストールする手順を調査しました。この記事では、LaravelでVue.jsをLaravel UIを使ってインストールする方法を備忘録としてまとめました。

:::note info
さいごに簡単な確認問題を用意しています。
この記事がもしよければ、内容の確認として是非お試しください！
:::
https://mondai-diy.com/play_question/252/dldvzz43QwBnH6Tj43IFvO0ilWzdnPRB6zR4XJdg



##  インストール手順
1.Laravelプロジェクトのルートディレクトリに移動します。
```
cd [プロジェクト名]
```

2.コマンドラインで以下のコマンドを実行して、Laravel UIパッケージをインストールします。
```shell
composer require laravel/ui
```


3.インストールが完了したら、以下のコマンドを実行してVue.jsをインストールします。
```shell
php artisan ui vue
```

4.インストール中に質問が表示される場合は、適切な選択肢を選んで進めてください。通常は「Use npm to install dependencies」というオプションを選択します。

5.インストールが完了したら、以下のコマンドを実行して必要なリソースを生成します。
```shell
npm install && npm run dev
```

６.BladeファイルにVue.jsのコンポーネントを表示させるために、resources/viewsディレクトリ内の適当なBladeファイルを開き、以下のコードを追加します。
```php:resources/views/example.blade.php
<div id="app">
    <example-component></example-component>
</div>
```
７.CSSとJavaScriptファイルをBladeファイルに読み込むために、Bladeファイルの<head>セクション内に以下のコードを追加します。
```php:resources/views/example.blade.php
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
<script src="{{ asset('js/app.js') }}"></script>
```

8.ブラウザでアプリケーションを実行し、Vue.jsのコンポーネントが正常に表示されていれば、成功です。

以上で、LaravelプロジェクトにVue.jsをLaravel UIを使ってインストールし、Bladeファイルでコンポーネントを表示させる手順とapp.css/app.jsの読み込み方法は完了です。

## まとめ
この記事では、LaravelでVue.jsをLaravel UIを使ってインストールし、さらにBladeファイルでコンポーネントを表示させる方法とapp.css/app.jsの読み込み方法を紹介しました。プロジェクトでの導入時に参考にしていただければ幸いです。

## さいごに
:::note info
簡単な確認問題を用意しました。
この記事がもしよければ、内容の確認として是非お試しください！
:::
https://mondai-diy.com/play_question/252/dldvzz43QwBnH6Tj43IFvO0ilWzdnPRB6zR4XJdg
Vue.jsのslotの使い方をまとめてみた*確認問題つき

## はじめに
最近、Vue.jsのコンポーネント開発の過程で、Vue.jsの機能の一つである「slot」について学ぶ機会がありました。この記事では、その使い方についてまとめたいと思います。

:::note info
最後に簡単な確認問題を用意しています。
この記事がもしよければ、内容の確認として是非お試しください！
:::
https://mondai-diy.com/play_question/254/h6Ffrgr8R86TIYbSFIwnUKGJC6b2miOPvNBIcn4h

## Vue.jsのslotとは
Vue.jsのslotは、コンポーネントのテンプレート内で、親コンポーネントから渡されたコンテンツを表示するための仕組みです。親コンポーネントから子コンポーネントに対して、特定の場所に挿入する要素やテキストを渡すことができます。


## slotの基本的な使い方
slotを使うには、親コンポーネントで子コンポーネントを使用する際に、特定の場所にコンテンツを挿入するためのタグを設定する必要があります。以下はその例です。

```vuejs:html
<template>
  <div>
    <slot></slot>
  </div>
</template>
```
上記の例では、<slot></slot>の間に挿入されたコンテンツが、子コンポーネントの該当する位置に表示されます。このように、slotタグを使うことで、柔軟なコンテンツの挿入が可能になります。

## 名前付きスロット
slotには、名前を付けることもできます。これにより、複数のslotを持つコンポーネントを作成することができます。以下は、名前付きスロットの例です。

```vuejs:html
<template>
  <div>
    <slot name="header"></slot>
    <slot></slot>
    <slot name="footer"></slot>
  </div>
</template>
```

上記の例では、<slot name="header"></slot>は<slot></slot>よりも前に挿入され、<slot name="footer"></slot>は後に挿入されます。名前付きスロットを使用することで、より細かなコンテンツの制御が可能になります。

## 子コンポーネントと親コンポーネント
Vue.jsのslotは、コンポーネント間で柔軟なコンテンツの受け渡しを行うための強力な機能です。親コンポーネントから子コンポーネントにコンテンツを挿入することで、再利用性の高いコンポーネントを作成することができます。開発中のプロジェクトでslotを使用する際には、以下の手順を参考にしてください。

`` 子コンポーネント ``のテンプレート内にslotタグを配置します。これにより、親コンポーネントから渡されたコンテンツが表示される位置を指定します。

`` 親コンポーネント ``で子コンポーネントを使用する際に、slotタグ内に挿入したいコンテンツを記述します。このとき、名前付きスロットを使用する場合は、<template v-slot:スロット名>を使用してコンテンツを指定します。

`` 子コンポーネント ``を再利用する際には、異なるコンテンツを挿入することも可能です。`` 親コンポーネント ``ごとに異なるコンテンツを表示させることができます。

## まとめ
本記事では、Vue.jsのslotについて基本的な使い方を紹介しました。コンポーネント開発においてslotを活用することで、柔軟で再利用性の高いコンポーネントを作成することができます。


## さいごに
:::note info
簡単な確認問題を用意しました。
この記事がもしよければ、内容の確認として是非お試しください！
:::
https://mondai-diy.com/play_question/254/h6Ffrgr8R86TIYbSFIwnUKGJC6b2miOPvNBIcn4h
SNSで画像付きのカード表示を実現するためのメタタグの設定方法をまとめてみた*確認問題つき

## はじめに
私たちの自社サイトのリンクをSNS上でシェアした際に、画像が表示されずにシンプルなリンクプレビューだけが表示されてしまいます。これでは情報の伝達が十分にできず、利用者の関心を引くことも難しいです。そこで、画像付きのカード表示を実現するために、メタタグの設定方法を調査した時の内容をまとめます。



:::note info
さいごに簡単な確認問題を用意しています。
この記事がもしよければ、内容の確認として是非お試しください！
:::
https://mondai-diy.com/play_question/253/3PK3bC72qYRIhp8i9OoZTmN1veUzGLvTL6fcPKMo


## メタタグの設定方法
SNSで画像付きのカード表示を実現するためには、以下のようにメタタグを設定する必要があります。

```html
<meta property="og:title" content="サイトのタイトル">
<meta property="og:description" content="サイトの説明文">
<meta property="og:image" content="画像のURL">
<meta property="og:url" content="サイトのURL">
```  


## 各プロパティの説明:

`` og:title ``
サイトのタイトルを指定します。これはカードの見出しに表示されます。

`` og:description ``サイトの説明文を指定します。これはカードの本文に表示されます。

`` og:image ``
カードに表示する画像のURLを指定します。画像は推奨サイズにリサイズしておくことが望ましいです。

`` og:url ``
サイトのURLを指定します。これにより、カードをクリックした際に対応するページに遷移します。

上記の基本的なメタタグを設定した後は、追加のプロパティやカスタマイズオプションを指定することもできます。例えば、`` og:type ``プロパティでサイトのコンテンツタイプを指定したり、`` og:site_name ``プロパティでサイト名を指定することも可能です。

## まとめ
SNS上で自社サイトのリンクをシェアする際に、画像付きのカード表示を実現するためには、適切なメタタグの設定が必要です。`` og:title ``、`` `` og:description ``、`` og:image ``、`` og:url ``のプロパティを使用して、カードの見出し、本文、画像、URLを指定します。

※注意: メタタグの設定方法はSNSプラットフォームや利用するメタタグの種類によって異なる場合があります。各プラットフォームやメタタグのドキュメンテーションを参照して、最新の設定方法を確認してください。


## さいごに
:::note info
簡単な確認問題を用意しました。
この記事がもしよければ、内容の確認として是非お試しください！
:::
https://mondai-diy.com/play_question/253/3PK3bC72qYRIhp8i9OoZTmN1veUzGLvTL6fcPKMo
Set Up Salesforce Scheduler


+ [Set Up Salesforce Scheduler](https://trailhead.salesforce.com/content/learn/projects/set-up-salesforce-scheduler)

# Book and Modify Appointments

+ [Schedule Appointments at Lightning Speedボタンがない](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000QLqFl)

ページレイアウトには追加したらしいけどページを編集していたみたい？

:::note
Please follow the below-mentioned steps to add the Schedule Appointment button.
1. Go to the Account record for which you want to show the button.
2. Click on the Setup (Gear icon).
3. Click on the Edit Page option.
4. Click on the Highlight Panel on which your buttons are showing of Lightning record page.
5. On the Right-side of the record page, you'll buttons and actions like this:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5ead0ed6-4c01-a9e8-76fc-5dd4f2cad06b.png)
6. Click on the Add Action button.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d5a2f39e-9483-7e80-8dd3-379079fa0447.png)
7. Enter your Action button name in the Actions field and Sets Action Visibility as per your requirement.
8. Click on Done.
9. Arrange the order of that Action button.
10. Click on Save.
11. Click on the Activation button to activate the record page.
Now you can see your New Resource Page button on the Detail Page.
:::

+ [After selecting the service territory am facing the error,Looks like that service territory doesn't have anyone available for those work type groups. Try choosing another service territory.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007LWaMy)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c2fc3664-2e62-e2bd-d8a3-2c3b03f601b5.png)

:::note
What resolved the issue for me is setting the Service Resource > Resource Type = Technician
:::
vbsの作法 その71

# 概要
vbsの作法、調べてみた。
練習問題、やってみた。

# 練習問題
chromeを起動せよ。

# サンプルコード

```
Dim sh
Set sh = CreateObject("WScript.Shell")
url = "https://qiita.com/ohisama@github"
res = sh.Run("chrome" + " " + url, 1, False)
Set sh = Nothing


```

以上。
Amazon Linux 2023にsshログインしてMySQL Clientを入れてRDSインスタンスでSQLを実行する

## 1. EC2インスタンスを作成
- 秘密鍵を作成する
  - `~/.ssh`ディレクトリに保存する
- public subnetに作成する
- public IPを割り当てる

## 2. sshログインする

```.ssh/config
Host my-host
  User ec2-user
  HostName xx.xx.xx.xx
  IdentityFile ~/.ssh/xxx.pem
```

## 3. sshログイン

```
% chmod 700 .ssh
% chmod 600 .ssh/*
% ssh my-host
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
Last login: Fri May 26 00:02:24 2023 from 114.150.224.148
[ec2-user@ip-xx-xx-xx-xx ~]$
```

## 4. EC2インスタンスにMySQL Clientをインストール

```
[ec2-user@ip-xx-xx-xx-xx ~]$ sudo su
[root@ip-xx-xx-xx-xx ec2-user]$ dnf -y localinstall https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
[root@ip-xx-xx-xx-xx ec2-user]$ sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
[root@ip-xx-xx-xx-xx ec2-user]$ dnf -y install mysql mysql-community-client
```

## 5. MySQLに接続

```
[ec2-user@ip-xx-xx-xx-xx ~]$ mysql -h <host> -P <port> -u <user> <database> --password=<password>
...
mysql> SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
```
vbsの作法 その70

# 概要
vbsの作法、調べてみた。
練習問題、やってみた。

# 練習問題
edgeを起動せよ。

# サンプルコード

```

url = "https://qiita.com/ohisama@github"

With CreateObject("Shell.Application")
	.ShellExecute "microsoft-edge:" + url
End With

```

以上。
Android Studioで Unresolved Referenceエラーになったらパスからコンマを消すこと(EOF)

Android Studio for Mac で発生。

/user/me/AndroidStudio/test_for_A,B,C/ みたいなパスの中で開発していたら、ビルド時に同じフォルダ内の別クラスがUnresolved Referenceエラーになってしまいました。
カンマを消して、/user/me/AndroidStudio/test_for_A_B_C/ みたいにしたら復旧。
openjdkのjava16ベースのdockerfileでapt-getできない

DockerでJava16の環境構築をしていたら詰まったのでメモ。

### 詰まったところ
openjdkのjava16ベースのdockerfileでapt-getできない。

### 前提条件
- Docker 23.0.4
- windows11(wsl2)

### やったこと・怒られ内容
以下のDockerfileを下記コマンドで実行したが、``apt-get``が見つからないと怒られた。
```Dockerfile
FROM openjdk:16
RUN apt-get update \
    && apt-get install -y maven \
    && apt-get clean \
    && rm -rf /var/lib/apt-get/lists/*
```

```bash
docker image build --tag java-app .
```

```bash
/bin/sh: apt-get: command not found
```

### 原因
- イメージのlinuxディストリビューションがdebian系ではない
```bash
bash-4.4# ls /etc | grep red
redhat-release
```

### 対応したこと
Dockerfileを以下のように修正する。openjdkが非推奨だったのでeclipse-temurinを使う
```Dockerfile
FROM eclipse-temurin:16
RUN apt-get update \
    && apt-get install -y maven \
    && apt-get clean \
    && rm -rf /var/lib/apt-get/lists/*
```

```bash
docker image build --tag java-app .
docker container run \
--name java-container \
--interactive --tty --rm \
java-app bash
```

### 参考
- [Docker HubのOpenJDKイメージの利用を更新するためのアドバイス](https://rheb.hatenablog.com/entry/updating-docker-hubs-openjdk-image)
- [dockerhub-openjdk](https://hub.docker.com/_/openjdk)
- [Linux ディストリビューション・バージョンの確認方法](https://qiita.com/i35_267/items/5c722fc39b6d4b8db4f0)

### 追記
- 2023.05.30 誤記を修正しました。
Pythonでの多ラベル分類と層化クロスバリデーションの実装: iterative-stratificationパッケージを使った方法

# はじめに
多ラベルの分類問題は、各インスタンスが複数のクラスに属する可能性がある状況で頻繁に遭遇します。データセットの分割方法が結果に大きな影響を及ぼす可能性がありますので、この種の問題に対してクロスバリデーションを正しく適用することは非常に重要です。本記事では、iterstratライブラリのMultilabelStratifiedKFoldを使用して、層化クロスバリデーションを実装する方法を紹介します。

```
# 必要なライブラリのインポート
from iterstrat.ml_stratifiers import MultilabelStratifiedKFold
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
import numpy as np
import pandas as pd
```

# データの準備
まずは、sklearn.datasetsからload_iris関数を使用してirisデータセットをロードします。このデータセットには4つの特徴量と3つのクラス（setosa, versicolor, virginica）が含まれています。

```
# データの読み込み
iris = load_iris()
X = iris.data
y = iris.target
```

# 層化クロスバリデーションの実装
MultilabelStratifiedKFoldクラスを使用して層化クロスバリデーションを実装します。ここでは、5分割することにします。

```
# ラベルをマルチラベル形式に変換
y_multilabel = pd.get_dummies(y).values

# MultilabelStratifiedKFoldのインスタンスを作成
mskf = MultilabelStratifiedKFold(n_splits=5, shuffle=True, random_state=0)

# クロスバリデーションを実行
for train_index, test_index in mskf.split(X, y_multilabel):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    
    # モデルの学習と予測
    model = RandomForestClassifier(n_estimators=100, random_state=0)
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    
    # 性能評価
    print(classification_report(y_test, y_pred))

```

以上で、Pythonでの多ラベル分類問題に対する層化クロスバリデーションの実装方法について解説しました。
【AWS】CloudFormationでクロススタックしてみた

CloudFormationでテンプレートを分割する場合、ネストとこのクロススタックという方法があります。クロススタックは**他のスタックで出力した情報を別のスタックで取得させることができます。**

例えば、VPCIDをスタックAで出力させ、スタックBでサブネットを作るときに**スタックAで出力させたVPCIDを取得できる**、といったような感じです。

CloudFormation上、一番上のレイヤーを分割できるので、設計段階でまず最初に考えるべきはネストよりも**クロススタック**で良いかと思います:bulb:

## 概要図
ネストとかスタックとかなんやねんて...なる人もいると思うので例を書いてみました。図内に記載されている通り、**大きい枠がスタックで、小さい枠がネスト**です。
![スクリーンショット 2023-05-26 8.37.30.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984662/15bb4caf-16af-31db-9398-896418b54099.jpeg)


## クロススタックしてみる
#### テンプレート作成
実際にスタックするコードを作成します。コードは別記事から拝借しました。**Outputs/Export**でエクスポート、**{Fn::ImportValue: XXX}** でインポートという形です。

https://qiita.com/3244/items/c9e9428dd94ae4a7120a

```yaml:vpc.yaml
Resources:
  MainVpc:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 172.16.0.0/16

Outputs:
  MainVpc:
    Value: !Ref MainVpc
    Export:
      Name: main-vpc-id

```

```yaml:subnet.yaml
Resources:
  MainSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 172.16.1.0/24
      VpcId: {Fn::ImportValue: main-vpc-id}
```

#### スタック作成
CLIでスタックを作成します。
```
aws cloudformation deploy --stack-name vpc-stack --template-file vpc.yaml
```

スタックが完了すると、エクスポートされます。
![スクリーンショット 2023-05-26 8.15.24.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984662/65ad7884-3b59-2af9-9f3e-fbc4fffa9fb2.jpeg)

同様に次のスタックを作成し、サブネットが該当VPCで作成できていればOKです。
```
aws cloudformation deploy --stack-name subnet-stack --template-file subnet.yaml
```
## 補足（必要性に疑問がわいたとき）
クロススタックやネストうんぬんは、 **そもそも必要なのか（テンプレート１つでやれ派）** という疑問わきがちです。そんな時のために、参考になりそうな記事を記載しておきます。何事もやってみるは大事ですが、無駄にやるとまさに無駄にしかならないので、この辺りの見極めはなかなか難しいところですね。わりと永遠のテーマな気がしてます:thinking:

https://zenn.dev/minamiso/articles/7a71e625cdea90

https://zenn.dev/mjxo/articles/fbc3d487fdfbec

https://qiita.com/fukuchan_milk/items/6d7fe1f13cb18de151c0
Pandocで出力されるWordファイルの見た目をカスタマイズする

Pandocで出力されるWordファイルの見た目を変更する方法の備忘録です。見出しにつく青い付箋マークの消し方も扱います。

変更前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092391/0ce40e90-8133-763a-b3c4-ff42850949d7.png)

変更後(一例)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092391/396bc946-fd39-c764-b4a0-53fa5468767c.png)

# 環境
・ Windows11
・ VSCode
・ Word(Web版)

# テンプレートファイルを用意
pandocでは一つのWordファイルをテンプレートとして読みこみ、それを元にデザインを決定します。なのでまずは自分で好きにデザインしたWordファイルを用意します。
一つ注意点ですが、見出しなどを作りたいとき、本文に書いてからフォントサイズを大きく、とするとpandocは見出しではなく本文として扱います。なので見出しなどを作りたいときは以下の画像のように「見出し1」などを選択してから変更してください。表題や引用なども同様です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092391/d44d6c1d-99a3-b7ba-c398-1f1b69c08ae9.png)

pandocデフォルトのスタイルを知りたいときは、ターミナルなどで`pandoc -o custom-reference.docx --print-default-data-file reference.docx`と打つとpandocデフォルトのスタイルのWordファイルが出力されます。

今回は以下のようなファイルを作成しました。([Microsoftが配布しているレポート用のテンプレート](https://templates.office.com/ja-jp/%e8%ab%96%e6%96%87%e3%81%a8%e3%83%ac%e3%83%9d%e3%83%bc%e3%83%88?page=1)を改変)
これを`reference.docx`として保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092391/68101dcd-7a33-6d19-0255-0eee4625bb02.png)


# テンプレートファイルの配置
ユーザーデータディレクトリに先ほど作成したテンプレートファイルを配置します。
ターミナルなどで`pandoc -v`を実行すると、 ユーザーデータディレクトリへのパスなどが表示されます。
人によって異なると思いますが今回は以下のように表示されたので、`pandoc`ディレクトリにテンプレートファイルを配置します。
`User data directory: C:\Users\username\AppData\Roaming\pandoc`

注意点を３つ。
1. AppDataは隠しファイルなので、隠しファイルを表示する設定にしてください。
2. `pandoc`ディレクトリが存在しない場合は自分で作成してください。
3. `pandoc`ディレクトリではなく`pandoc\templates`ディレクトリでないと[うまくいかないかもしれません](https://qiita.com/sky_y/items/3736faa6c9dca1f554be#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%87%E3%83%BC%E3%82%BF)。

# 青い付箋マークの消し方
実行時のコマンドに`-f markdown-auto_identifier`を追加すると見出し横の青い付箋マークが消えます。
VSCodeの場合は`setting.json`に`"pandoc.docxOptString": "-f markdown-auto_identifiers"`を追加します。

# 参考サイト
[Pandoc User’s Guide 日本語版](https://pandoc-doc-ja.readthedocs.io/ja/latest/users-guide.html)
[メモ: Pandocのテンプレートとデータディレクトリの優先順位](https://qiita.com/sky_y/items/3736faa6c9dca1f554be)
[論文とレポート(Microsoftのテンプレート)](https://templates.office.com/ja-jp/論文とレポート?page=1)
[generation of bookmarks in docx writer cannot be disabled · Issue #3476](https://github.com/jgm/pandoc/issues/3476)
vimのよく使うコマンドをまとめてみた

# Vimコマンド
## モード変更

| vim | モード |
|:----|:-----|
|esc|ノーマルモード|
|i|インサートモード|
|v|ビジュアルモード|

## カーソル移動

| vim | 起動 |
|:----|:-----|
|k|上に移動|
|j|下に移動|
|h|左に移動|
|l|右に移動|

## ファイル保存

| vimコマンド | 結果 |
|:----|:-----|
|:w ファイル名|名前をつけて保存|
|:w|上書き保存|
|:q|編集終了|
|:q!|保存しないで編集終了|
|:wq|保存して終了|
|:wq|保存して終了|

## 入力

| vimコマンド | 結果 |
|:----|:-----|
|a|次の文字から入力|
|o|選択行の下に空白行を入れて入力|
|O|選択行に空白行を入れて入力|

## 削除

| vimコマンド | 結果 |
|:----|:-----|
|x|1文字削除|
|dw|単語の削除|
|dd|1行削除|
|2 dd|2行削除|
|u|Undo|
|[control]+r|Undo redo|

## コピー＆ペースト

| vimコマンド | 結果 |
|:----|:-----|
|yy|1行コピー|
|p|下にペースト|
|P|現在行にペースト|
|2 yy|2行コピー|
|.|repeat|

## コマンドモード

| vimコマンド | 結果 |
|:----|:-----|
|: または /|command mode|
|!python a.py|コマンド実行|
|!!|前のコマンドを実行|

## 移動

| vimコマンド | 結果 |
|:----|:-----|
|:set number|行番号を表示|
|:10|10行目に移動|
|$|行末に移動|
|0|先頭に移動|
|^|インデントの先頭に移動|
|{|段落ごとに上に移動|
|}|段落ごとに下に移動|
|[[|セクションごとに上に移動|
|]]|セクションごとに下に移動|
|:1 または gg|ファイルの先頭に移動|
|G|ファイルの最後に移動|
|[CTRL]+o|移動前に戻る|

## 検索と置換

| vimコマンド | 結果 |
|:----|:-----|
|/[文字列]|[文字列]を検索|
|n|次の検索結果に移動|
|N|前の検索結果に移動|
|R|置換|
|:%s/[置換前]/[置換後]/g|一括置換|
|:%s/[置換前]/[置換後]/gc|確認しながら置換|
|:noh|ハイライトを消す|

## インデント

| vimコマンド | 結果 |
|:----|:-----|
|J|行の連結|
|>|右にインデント|
|<|左にインデント|
|y|カーソル指定コピー|

## 複数行コメントアウトする
| vimコマンド | 結果 |
|:----|:-----|
|1.ビジュアルモード|[control]+v|
|2.行選択|j または k|
|3.先頭に入れる場合|:norm I#|
|3.行末に入れる場合|:norm A#|
Kafkaのイベント到達保証モード

|到達保証の種類|意味|注意事項|
|---|----|----|
At least once|最低一回のイベントを送信|イベントの損失はないが、重複が発生する可能性がある
At most once|最大一回のイベントを送信|イベントが再送されず、損失が発生する可能性がある
Exactly once|確実に一回のイベントを送信|イベントの損失も重複も発生しない

デフォルトは`At least once`となる

# At least once

プロデューサーがKafkaブローカーからack（acknowledgement）を受け取り、acks=allの場合、そのメッセージはKafkaトピックに正確に一度書き込まれたことを意味します。

しかし、プロデューサーのackがタイムアウトするかエラーを受け取った場合、メッセージがKafkaトピックに書き込まれていないと仮定してメッセージの送信を再試行するかもしれません。

ブローカーがackを送信する直前に失敗し、メッセージがKafkaトピックに成功して書き込まれた後であれば、この再試行によりメッセージが2回書き込まれ、したがってエンドコンシューマーに対して一度以上配信されることになります。このアプローチは二重の処理と不正確な結果をもたらす可能性があります。

# At most once

プロデューサーがackがタイムアウトするかエラーを返したときに再試行しない場合、そのメッセージはKafkaトピックに書き込まれず、したがってコンシューマーに配信されない可能性があります。

ほとんどの場合は書き込まれますが、重複の可能性を避けるために、時々メッセージが通過しないことを受け入れます。


# Exactly once

プロデューサーがメッセージの送信を再試行しても、そのメッセージはエンドコンシューマーに対して正確に一度だけ配信されます。

Exatly onceは最も望ましい保証ですが、理解が難しいものでもあります。これは、メッセージングシステム自体とメッセージをプロデュース・コンジュームするアプリケーション間で協力が必要だからです。

例えば、メッセージのコンジュームに成功した後にKafkaコンシューマーを以前のオフセットに巻き戻すと、そのオフセットから最新のものまでの全てのメッセージを再度受け取ることになります。これを実現するためにメッセージングシステムとクライアントアプリケーションがExactly Onceを実現するために協力しなければなりません。


# 考慮しなければならない障害

## ブローカーが障害になる可能性
Kafkaは非常に高可用性で、持続性があり、耐久性のあるシステムで、パーティションに書き込まれたすべてのメッセージは一定の回数（これをnと呼びます）保存され、複製されます。

その結果、Kafkaはn-1のブローカーの故障を許容でき、少なくとも1つのブローカーが利用可能である限り、パーティションは利用可能です。

Kafkaのレプリケーションプロトコルは、メッセージがリーダーレプリカに成功して書き込まれると、それがすべての利用可能なレプリカに複製されることを保証します。


## プロデューサーからブローカーへの通信が失敗する可能性

Kafkaの耐久性は、プロデューサーがブローカーからackを受け取ることに依存します。そのackを受け取らなかったとしても、リクエスト自体が失敗したことを必ずしも意味しません。ブローカーはメッセージを書き込んだ後、プロデューサーにackを送り返す前にクラッシュすることがあります。また、メッセージをトピックに書き込む前にクラッシュすることもあります。プロデューサーが故障の性質を知る方法がないため、メッセージが成功して書き込まれなかったと仮定し、それを再試行することを強いられます。これにより、同じメッセージがKafkaのパーティションログに重複して記録され、エンドコンシューマーがそれを一度以上受け取ることがあります。

## クライアントが失敗する

正確に一度だけの配信は、クライアント側の失敗も考慮に入れる必要があります。しかし、クライアントが実際に故障しているのか、それとも一時的にブローカーから分割されているのか、アプリケーションが一時停止しているのかをどのように判断するのでしょうか？永続的な故障と一時的な故障を区別できることは重要です。

正確性のために、ブローカーはゾンビプロデューサーによって送信されたメッセージを破棄するべきです。これはコンシューマーにも同様に当てはまります。新しいクライアントインスタンスが開始されたら、それは失敗したインスタンスが残した状態から何でも復旧し、安全な点から処理を開始することができなければなりません。これは、消費されたオフセットは常に生成された出力と同期していなければならないことを意味します。
PythonでPDFからテキストを抽出し、テキストファイルに保存する

# 前提条件
* Windows10
* Python3
* PyMuPDFライブラリ
* Tkinterライブラリ

サンプルのPDFファイルは下記のウィキペディアトップページをPDFとしてローカルに保存したものを使用します。
https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8

PyMuPDFライブラリの公式ドキュメントは以下です。
https://pymupdf.readthedocs.io/en/latest/

Tkinterライブラリの公式ドキュメントはこちらです。
https://docs.python.org/ja/3/library/tkinter.html

# 目的
PyMuPDFライブラリを利用して、ローカルにあるPDFからテキストを抽出し、それをテキストファイルに保存する。Windows OSによる文字化けを防ぐため、文字コードはShift_JISとして統一して扱う。

# 環境構築
PyMuPDFライブラリのインストール
```
pip install pymupdf
```

# サンプル
```pdf2text.py
# -*- coding: utf-8 -*-

import fitz # pymupdfライブラリ

pdf = 'C:\\Wikipedia.pdf'
doc = fitz.open(pdf)

file = f'{pdf}_to_text.txt'
f = open(file, 'w',  encoding='shift_jis', errors='ignore')

for page in range(len(doc)):
    tmp = doc[page].get_text()
    tmp2 = tmp.encode('shift_jis','ignore')
    text = tmp2.decode('shift_jis')
    f.write(text)

doc.close()
f.close() 
```
Tkinterライブラリを利用し、PDFをGUIで選択できるようにする。
```pdf2text2.py
# -*- coding: utf-8 -*-
import fitz # pymupdfライブラリ
from tkinter import filedialog #thinterライブラリ
import os

typ = [('pdfファイル','*.pdf')] 
dir = './'

pdf = filedialog.askopenfilename(filetypes = typ, initialdir = dir) 
doc = fitz.open(pdf)

file = os.path.splitext(pdf)[0] + '_to_text.txt'
f = open(file, 'w',  encoding='shift_jis', errors='ignore')

for page in range(len(doc)):
    tmp = doc[page].get_text()
    tmp2 = tmp.encode('shift_jis','ignore')
    text = tmp2.decode('shift_jis')
    f.write(text)

doc.close()
f.close() 
```
# 参考資料
https://www.amazon.co.jp/Python%E3%81%A7%E6%96%87%E6%9B%B8%E5%87%A6%E7%90%86%E2%80%95%E8%B3%87%E6%96%99%E3%81%AEPDF%E5%8C%96%E3%80%81%E6%96%87%E5%AD%97%E8%AA%8D%E8%AD%98%E3%80%81%E6%A4%9C%E7%B4%A2%E3%80%81%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E4%BD%9C-%E5%8C%97%E5%B1%B1-%E6%B4%8B%E5%B9%B8/dp/4877834974?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=K018UDE4Y69J&keywords=python+pdf&qid=1686010977&sprefix=%E4%BA%BA%E5%8F%A3%2Caps%2C2758&sr=8-1&linkCode=ll1&tag=qiitajinbei23-22&linkId=6fd240817b25e70d26c80bf24d192ed7&language=ja_JP&ref_=as_li_ss_tl

# きっかけ
下記で抽出したテキストをまずはテキストファイルに保存したかったので、このプログラムを書いた。

https://qiita.com/jinbei100613/items/fc01e8cd4469302f5e1c
[2023年５月時点]WSL2におけるPython環境構築

Windows11にて環境構築を行ったので備忘録。

# 1. 目次

2-1. wsl
2-2. python

# 2. 本文
wslインストール
→　Python環境構築(pyenv)
の順で以下に示す。

## 2-1. wsl
### 2-1-1.　MicrosoftStoreからwslをインストール
検索boxに「wsl」と検索。以下赤枠３つをインストールする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3137982/80dc45a8-36d2-aa1e-5024-df8ad81d7d69.png)
### 2-1-2. ネットワークドライブの割り当て
Ubuntuをネットワークドライブに割り当てることでアクセスしやすくなるのでお勧め。

## 2-2. pthon環境構築
環境構築にあたって、pyenv
### 2-2-1. 初期設定
```
$ sudo apt update -y
$ sudo apt upgrade -y
$ sudo apt-get install git gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev zlib1g-dev -y
```
### 2-2-2. pyenv
see: https://github.com/pyenv/pyenv#windows

READMEの記載の手順に従う。
まずはINSTALL
```
$ curl https://pyenv.run | bash
```
PATHを通す
・ ~/.bashrc
```
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
```

・ ~/.profile
```
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile
$ echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile
$ echo 'eval "$(pyenv init -)"' >> ~/.profile
```

ここまで来たらShellを開きなおす。

pathが通っていることを確認しつつ、対象を探す。
```
$ pyenv -v
pyenv 2.3.18
$ pyenv install -l
```
2023/05/26時点での最新の安定板3.11.3をInstallすることにした。
```
$ pyenv install 3.11.3
$ pyenv global 3.11.3
```
自己紹介

# はじめまして！ガチど素人（にうぶ毛が生えたくらい）です！
こんにちは、Air.と申します！
先日大学の教授にハッパかけられて勢いでQiitaを登録しました(*´ω｀*)
Qiita初投稿なので自己紹介をします！
***
## 名前　　Air.

## 職業 学生（情報系の2回生）とSA(大学授業の手伝い)
SAかっこいいと思って応募したら、ただの先生のパシリでした…
でもお金は頂いてるので文句は言えませんメソメソ;;

## 主な使用言語 R,Python
もろデータ分析系ですね！Javaとかも触ってます！

## 出身　関西 在住　関東
お上りさんですね！日に日に関西弁が薄れいくのに危機感を覚えています

## 当面の目標 大学院に行きたい！
そもそも私はデータサイエンティストになりたい、情報技術もひよっこのペーペー野郎です;;
それでも大学院に行きたい！っていう意思はあるんですよね、へへ
最近「本当にデータサイエンティストになっていいのか」みたいな迷いが生じてるんですけど、とりあえず分析楽しいし、いっぱい勉強してぇ〜ってことで大学院いきたいですね！

## 趣味　音楽、散歩、漫画、お絵かき
音楽はボカロ洋楽jpopHiphopなんでも大好き！
漫画は呪術やWeb漫画をよく読みますね〜

***

Qittaでは自分が勉強していることを日記形式に書いていこうと思います！
これが黒歴史になるかどうかは私次第なので、期待ですね〜(^-^)

***
最後に私のお気に入りの写真を
![IMG_2736.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3456944/5e6ad8a2-e6e0-5fb9-6f1a-ca2fe880a6c8.jpeg)
暗いけどめっちゃ綺麗やんね〜
これからよろしくお願いします！
お名前.comのレンタルサーバーからgmailにメール送れない件

お名前.comのレンタルサーバーのメールアドレスを利用して、
gmailにメールを送るとMAILER-DAEMONからエラーメールが返る件について、
お名前.comのヘルプが事象はドンピシャだが全然ヘルプになってない。
https://help.onamae.com/answer/20489

上記ヘルプの通りに作業をすると
不可視のデフォルト設定が裏に存在するようで、
以下の通りのエラーでSPFレコードが作れない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168300/1bcdd876-272e-73a6-4149-15084b3cec4c.png)



やったこと。

1. https://www.kitterman.com/spf/validate.html?
で自ドメインを検索して、認識されるSPFがないことを確認する。
（エラーの元ネタのデフォルト設定は実在してないということを確認）

2. https://mxtoolbox.com/SuperTool.aspx?action=mx%3ag-p-f.jp&run=toolpage
で自ドメインを入力してMX lookupでIPを取得する。

3. https://urashita.com/archives/33688#com
を参考にSPFレコードを書く。
（XXXは手順2のIP、**はお名前.comのヘルプに記載の通りの方法で調べる）
```
v=spf1 +ip4:XXX.XXX.XXX.XXX include:spf**.gmoserver.jp ~all	
```

4.お名前.comのSDサーバーのドメイン設定に手順3のTXTレコードを足して、
　10分後ぐらいに手順1でSPFが認識されてることを確認する。

5.テストメールを送る。

以下サイトがSPFの理解を一番深めてくれて最後は安心して適用できた。
https://baremail.jp/blog/2020/02/28/579/
MacでGoogle Slideを作っているときに，クリックで辞書が出てきてしまう時の対処

エンジニアの方は共有スライドをGoogle slideを用いて作成する方もいると思います．

そんな時に，画像をずらそうとするとなぜか辞書が出てきてしまう時がありませんか？

画像をずらす度に，辞書が出てきてうんざりしてたので対処法を探したら簡単に修正できたので紹介します．
ググっても出てこなかったのでQiitaに残したいと思います．


対処法：
1.マック上で「トラックパッド」と検索，または設定からトラックパッドを選択．
![スクリーンショット 2023-05-26 0.39.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569463/74816182-fa1a-97a9-b0e6-55deed426056.png)


2.「ポインタとクリック」を選択
![スクリーンショット 2023-05-26 0.40.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569463/b2177aaf-49f4-eae8-935d-5679965ad327.png)

3.「調べる&データ検出」のタブのオプションを，「1本指で強めのクリック」から「3本指でタップ」に変更
![スクリーンショット 2023-05-26 0.40.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569463/890ea895-5de5-82a6-c184-15629adbf26a.png)

これでメディアの位置を調整する時に辞書を開かずに済むようになりました！
参考になれば幸いです．
M1 Macでscikit-learnが入らないときにやったこと

M1 Macでpyenv環境を作成してもろもろライブラリをインストールしようとしたところ、scikit-learnが入らない。
scikit-learnが入らないと簡単なMLモデルが作れないので致命的。
※ pyenvではpythonバージョンを3.9.16としている

# やったこと
1. `curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh`を実行
1. ターミナルを再起動
1. `pip install transformers==2.5.1`

参考：https://github.com/huggingface/transformers/issues/2831#issuecomment-600141935
Pythonのf-stringについて（桁数を変数で指定する場合）

### 本記事の背景
Pythonは常に進化している言語で、C言語の「%d」みたいな指定から専用の「.format()」で指定する方法のほかに、f-stringで指定できるのがほかの言語にない特徴である（個人的な感想）

### f-stringの基本

f'{<変数名>:書式}'

書式については、やや複雑な仕様になっているため、細かい解説を参照してほしい。
https://prograshi.com/language/python/python-f-string/

以下は10進から2進へ変換する例
```python
number = 8
s = f'{number:b}'
print(s)
# output(10進から2進）
1000
```
### 桁数の指定
```python
x = 1.23456789
res = f'{x:.2f}'
print( res )

#出力
#　'1.23'
```
### 桁数を変数で指定する方法
2進数の桁数に合わせて、表示する数字を全体に反映させたい場合は、
｛｝を2重で書けます。
なかなか大胆な発想です。
```python
number = 16
s = f'{number:b}'
bin_len = len(s)
# f-stringを2重で指定する例
for n in range(1, number+1):
    s = f'{n:{bin_len}} {n:{bin_len}o} {n:{bin_len}X} {n:{bin_len}b}'
    print(s)
```
出力結果
```terminal
    1     1     1     1
    2     2     2    10
    3     3     3    11
    4     4     4   100
    5     5     5   101
    6     6     6   110
    7     7     7   111
    8    10     8  1000
    9    11     9  1001
   10    12     A  1010
   11    13     B  1011
   12    14     C  1100
   13    15     D  1101
   14    16     E  1110
   15    17     F  1111
   16    20    10 10000
```
fatal: not a valid object name: masterの解決方法

# イントロ
この記事は、RailsアプリケーションをAWS EC2インスタンスへデプロイしようとした際に直面した一つの問題とその解決方法について説明します。

## 発生した問題
CapistranoがGitのデフォルトブランチ名の変更（masterからmainへ）を反映していないことから生じる
```
fatal: not a valid object name: master
```
というエラーメッセージが表示される問題です。

### 本記事の対象となる読者

- RailsアプリケーションをEC2にデプロイしようとしている開発者
- Capistranoを使ってデプロイの自動化を行っている開発者
- Gitのデフォルトブランチ名の変更により生じる問題に直面している開発者

それでは、まずは問題の発生から詳しく見ていきましょう。

# 問題発生: fatal: not a valid object name: master
私が最初にこの問題に直面したのは、Capistranoを使ってRailsアプリケーションをAWS EC2インスタンスにデプロイしようとしたときでした。デプロイを実行すると、次のようなエラーメッセージが表示されました。

```
fatal: not a valid object name: master
```
masterというワードは、Gitのデフォルトのブランチ名を指します。
しかし、私の場合、ローカルリポジトリではデフォルトブランチの名前がmainになっていました。
そのため、Gitがmasterブランチを見つけられず、上記のエラーが生じていたのです。

### ブランチ名が違う理由
この問題は、2020年10月以降にGitHubが新規リポジトリのデフォルトブランチ名をmasterからmainに変更したことに原因です。この変更は、新規に作成されるリポジトリに対してのみ適用され、既存のリポジトリには影響を及ぼさないため、分かりづらいです。

それでは、次の章では、この問題を解決するために私が試した手順を詳しく説明していきます。

# 解決のためにやったこと: ブランチ名の調整

### deploy.rbファイルに「ブランチ名はmain」ということを明記する
解決策は、Capistranoに自分がmainブランチを使っていることを明示的に伝えることでした。
具体的には、deploy.rbファイルに以下の行を追加しました。
```
//末尾に追記
set :branch, 'main'
```
この行を追加することで、Capistranoはブランチ名が「main」ということを理解します。

この変更を加えた後、再度デプロイコマンド
```
bundle exec cap production deploy
```
を実行しました。

# 結果：デプロイ成功
まずここまでやったことは、
1. deploy.rbファイルの末尾に`set :branch, 'main'`を追記
2. リモートリポジトリにプッシュ
3. デプロイコマンド`bundle exec cap production deploy`をローカルで実行

このコマンドを再度実行することで、新たに追加された設定が反映され、CapistranoがGitHubリポジトリのmainブランチからソースコードを取得しようとします。

これでデプロイは成功です。
新しい設定が正しく反映され、CapistranoはGitHubからソースコードを正しく取得し、AWSのEC2サーバーに適切にデプロイすることができました。


まさしくその通りです！それでは最後の章、第5章に移りましょう。

# 学び：バージョンによるエラーに初心者はヒヨる
今回の問題は、Capistranoの設定がデフォルトのブランチ名（master）に対して行われていたために発生しました。しかし、私のGitHubリポジトリでは、デフォルトのブランチ名がmainに変更されていました。その結果、Capistranoは存在しないブランチからソースコードを取得しようとして失敗し、デプロイがうまくいかなかったのです。

この問題は比較的簡単に解決できました。Capistranoの設定ファイルを更新し、正しいブランチ名を指定することで、ツールは再び正常に動作しました。

この経験を通じて、私たちは以下のことを学びました。

-　プログラミング学習初心者はバージョンの違いによるエラーに弱い
-　仮説を立てて確認として誰かに聞くのが重要


以上です。あなたが同様の問題に遭遇したときの助けになれば幸いです。

そして、最後になりましたが、何か質問やフィードバックがあれば、ぜひコメントでお知らせください。あなたの意見をお待ちしています！
ガチコンパイラ初心者が Rust の OSS に Python で初コントリビュートした話

# ガチコンパイラ初心者が Rust の OSS に Python で初コントリビュートした話

RustにマージされたPR

https://github.com/rust-lang/rust/pull/110906

https://rust-lang.github.io/thanks/rust/all-time/

Rust の コントリビューターリストに無事名前が載りました🦀

## 経緯と自分に関して

Rust 言語で書かれた OSS への初コントリビュートを Python で行うというわけわからんことをやってみた記事です。
最初に断っておきますが、[自分](https://twitter.com/ekusiadadus)はコンパイラ等は全くの初心者です。
普段は Web アプリケーションの開発をしています。
記事も、全くのコンパイラ初心者がなんにもわからない(今もわかってない)Rust の OSS になんとかコントリビュートしたという話です。
記事の内容で間違っているところがあるかもしれませんが、ご容赦ください。

## 経緯

個人的にコンパイラに興味を持ちつつあり、コンパイラの実装をいろいろ探し回っていました。
最近良く触っている、Rust のコンパイラの実装を見てみようと思い、Rust のコンパイラのソースコードを見てみました。
はじめのうちは、ソースコードを流し読みしてました。

「実際に触ってみないと結局わからん...」になってきたので、Rust の コンパイラを実際に手元で動かそうとしていました。

[Rust Compiler Development Guide](https://rustc-dev-guide.rust-lang.org/getting-started.html) で、Rust のコンパイラに関して詳しく丁寧に書かれていました。
コンパイラの動かし方まで書かれていました。

しかし、手元で上の記事通りに動かそうとしても全く動かない...となって困っていました。
最初は、Windows で開発しているから変な挙動しているのか？と思っていましたが、WSL の Ubuntu で同じようにやってもどうも動かないようでした。

## Rust の BootStrap

Rust のコンパイラは、Rust で書かれています。
「ブートストラッピング（Bootstrapping）」とは、コンパイラやその他の自己参照的なシステムを生成するプロセスを指します。コンパイラとは、あるプログラミング言語（ソース言語）で書かれたプログラムを、別の言語（ターゲット言語）に変換するためのプログラムです。

Rust BootStrap の始まりは、Python のスクリプト実行です <- なんでや..
OSS にコントリビュートしたときには知らなかったのですが、わかりやすく日本語で Rust BootStrap について書かれている記事がありました。

[Rust コンパイラ自体のビルドプロセスを理解する](https://zenn.dev/ohno418/articles/f57219c1b2e53e)

上の記事から Rust BootStrap について引用します。

> Stage 0
> Rust の bootstrapping は Python スクリプトを実行することで始まる。(だからこの時点では Python を実行できる環境でさえあれば良い。) この Python スクリプトの主目的は 2 つ。

> 1. 既存の Rust コンパイラをダウンロードする。
> 2. rustbuild をビルドして実行する。

本当に上の通りで、この時に Python のスクリプト x.py ([Rust のソースコード](https://github.com/rust-lang/rust/blob/master/x.py)) が実行されます。
この x.py は、Rust のコンパイラをビルドするためのスクリプトです。

## 初コントリビュート

どうやらそもそも、この Rust のコンパイラをビルドするためのスクリプトが壊れている？ようでした。

https://github.com/rust-lang/rust/pull/110906

上の PR にも詳細を書きましたが、x.py であるファイルを生成するのですが、このファイルの生成には sudo 権限が要求されていました。

良く調べると、sudo 権限を要求されない or される場合は動くように処理されているのですが、あるファイルだけは sudo 権限が要求されていました。

自分は、とりあえず何とかコンパイラのビルドをしたかったので、このファイルの生成を sudo 権限が要求されないように(無理やり)変更しました。
↑ が正しい変更だったのかはわかりませんが、とりあえず 動くようになりました。

そのうちこの話を、知り合いの Rust のコントリビュータに雑談程度に話したら、その人が「それはおかしい」と言っていました。

## その後

一旦、自分が困っていたところを PR だしてみるか～くらいの軽い気持ちでなげたら、割と他にも悩んでいる人がいたみたいで、最終的にマージされました。

悩んでいそうな issue

https://github.com/rust-lang/rust/issues/111653

自分は、正直 Rust のコンパイラ自体には手を加えていないのですが、BootStrap 部分で少し手を加えたことで、他の人の役に立てたのかなと思うと嬉しいです。

https://rust-lang.github.io/thanks/rust/all-time/

Rust の コントリビューターリストに無事名前が載りました🦀

## まとめ

ガチコンパイラ初心者が Rust の OSS に Python で初コントリビュートした話でした！
CNNについて理解したこと。

# 畳み込みの理解
畳み込みを式で表すと以下のようになる。Lはフィルタ数、Kは入力のチャネル数、xは入力データ、wは重みを表す。

$$h_{i,j}^{l} = \Sigma_{p,q,k}x_{i+p,j+q}^{k}w_{p,q}^{l}$$

図式化と実装アイデアを書いたものが以下です。
<img width="300" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2845261/8a2447e0-7f03-3d7f-3386-8daf74e39943.jpeg">　

forループを減らしたい....