OmniAICreator/Qiita-1.07M huggingface dataset:
package managerについて

## package managerとは？

名前の通りパッケージを管理するもの。
そもそも、パッケージって？

### パッケージとは？

ほかのプログラムなどから使用される目的で作成されたプログラム（モジュール）をまとめたもの。

### package managerを使用する利点

- 依存関係：Aを動作させるにはBが必要。Bを動作させるにはAが必要みたいな
- 競合関係：AとBを動作させるには、Cが必要

他の人が作った便利なプログラムを簡単に自分のプログラムで使うことができるために、いろいろやってくれているツールなんすね。

### パッケージってどこに？

パッケージマネージャが機能するには、どこからパッケージをインストールするかを知る必要があり、パッケージレジストリーの形で提供されます。
npmであれば、 [npmjs.com](https://www.npmjs.com/)にあります。

## 役割となぜそれを使用するのか？

手動でダウンロードして使用することも可能なんですが、

- すべての正しいパッケージファイルの検索
- 脆弱性チェック
- ダウンロード
- 依存関係チェック

などなどいろんなことをしないといけない。
めちゃくちゃ大変ですよね。

## 実装について
[Tiny Package Managerm](https://github.com/g-plane/tiny-package-manager/tree/master)
というgithubのリポジトリがあったので、これを読んで理解していきたいです。

### 大枠の流れ

1. コマンドラインからインストールするものを取得
2. その情報を取得
3. 一番上の階層をインストール
4. 衝突しているパッケージのインストール
5. package.jsonを更新する

index.tsを見た感じ、こんなことを大体していました。

## おわり

来週はもっと詳細な部分を読んで、理解していきたいです。
それから、rustとかjavaとか学びたい言語でも似たようなものを実装できれば、いいっすね。

## 参考サイト

https://zenn.dev/antez/articles/a9d9d12178b7b2

https://github.com/g-plane/tiny-package-manager

https://developer.mozilla.org/ja/docs/Learn/Tools_and_testing/Understanding_client-side_tools/Package_management
SourceTreeでGithubにpushできなかった

# 問題
SourceTreeを使用してGithubにpushをしようとした際にエラーが発生した。

# 解決方法
以下の記事を参考にCUI上で同様の操作を行った。
エラーの内容を見るようにy/nを聞かれているので、yを選ぶためにCUI上での操作が必要になるようです。

https://qiita.com/Hina_Developer/items/1ec8b5731e9b2e8c04c2
S3 オブジェクトロックの種類

# オブジェクトロックとは
S3にて、オブジェクトロックを適用するとDeleteObjectVersionアクションを実施できない。

# 設定の前提
オブジェクトロックを設定するにはバージョニングを有効にしている必要がある。

# 種類
オブジェクトロックには以下の２種類がある
- リテンションモード：保持期間あり
- リーガルホールド：保持期間なし

それぞれは併用することも可能。

## リテンションモード
保持期間を設定し、その期間中はオブジェクトのバージョンを上書きまたは削除を実施できない。
2 つの保持モードが提供されている
|モード|説明|
|-|-|
|ガバナンスモード|`s3:BypassGovernanceRetention`を持っているIAMユーザーのみがオブジェクトロックを解除できる。<br>また、ガバナンスモードの上書きを必要とするリクエストを送信する場合は、`x-amz-bypass-governance-retention:true`をリクエストヘッダーとして明示的に含める必要がある。|
|コンプライアンスモード|ルートユーザーを含めた全てのユーザーが、オブジェクトロックを解除できない。|

## リーガルホールド
設定している間はオブジェクトのバージョンを上書きまたは削除を実施できない。
リテンションモードとの違いは保持期間を設定しないこと。

`s3:PutObjectLegalHold`があるユーザーのみがリーガルホールドの適用と解除が可能。

# 参考
- [S3 オブジェクトロックの使用](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/object-lock.html)
vbsの作法 その86

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

# 練習問題
HTTPリクエストのステータスコードを取得せよ。

# サンプルコード

```
Dim ws
Set ws = WScript.CreateObject("WScript.Shell")
Dim objIE
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
objIE.Navigate "https://auctions.yahoo.co.jp"
ws.AppActivate("Internet Explorer")

Do While objIE.ReadyState <> 4 Or objIE.Busy = True
	WScript.Sleep 100
Loop

Dim mx
Set mx = CreateObject("MSXML2.XMLHTTP")
mx.open "GET", "https://auctions.yahoo.co.jp", False
mx.send
MsgBox mx.Status
objIE.Quit
Set objIE = Nothing


```

# 実行結果

```
200
```

以上
なんか難しいStable Diffusionをpythonなら簡単に

近年、画像生成AIの流行により、多くの方がStable Diffusionに興味を持つようになりました。しかし、他の画像生成ツールと比べると、Stable Diffusionはセットアップが少し複雑です。そこで今回は、Pythonを使用して簡単にStable Diffusionを使った画像生成を行う方法をご紹介します。

## 準備

Stable Diffusionのような画像生成モデルを使うためには、まず必要なライブラリをインストールし、モデルのファイルをダウンロードする必要があります。以下の手順で進めていきましょう。

### 1. 必要なPythonライブラリのインストール

まずは、Pythonのライブラリ「diffusers」を使用します。これにより、Stable DiffusionをPythonで簡単に扱うことができます。

次のコマンドで`diffusers`をインストールしましょう。

```bash
pip install diffusers
```

### 2. Pythonスクリプトの作成

次に、画像生成を行うためのPythonスクリプトを作成します。以下のコードを新しいPythonファイル（例：`generate_image.py`）として保存してください。

```python
from diffusers import StableDiffusionXLPipeline

# Stable Diffusion XLパイプラインを読み込み
pipe = StableDiffusionXLPipeline.from_single_file("animagine-xl-3.0.safetensors")

# テキストから画像を生成し、画像を保存
image = pipe('ここに生成したい画像の説明を入力').images[0]
image.save('generated_image.png')
```

### 3. モデルのダウンロード

このコードでは、`animagine-xl-3.0.safetensors`というモデルファイルを使用します。次のURLからモデルをダウンロードしましょう。

[animagine-xl-3.0.safetensors ダウンロードリンク](https://huggingface.co/Linaqruf/animagine-xl-3.0/blob/main/animagine-xl-3.0.safetensors)

ダウンロードしたファイルを、先ほど作成したPythonファイルと同じフォルダに配置してください。

### 4. 画像生成の実行

最後に、ターミナルまたはコマンドプロンプトでPythonファイルを実行します。

```bash
python generate_image.py
```



参考URL:  
[Qiitaの参考記事](https://qiita.com/john-rocky/items/956578eaa6edd5988d3b)

ぜひこの方法を試してみて、様々な画像生成を楽しんでください！
AWSの個人開発での利用

今回はAWSの個人開発での利用について記事にしたいと思います。

# 1. AWSアカウントを作成する
最初に、AWSを利用するにはアカウントが必要です。公式サイト（AWS）でアカウントを作成してください。AWSは初回12ヶ月間の無料利用枠（Free Tier）を提供しており、個人開発ではこの無料枠内でサービスを利用することができます。

# 2. EC2（Elastic Compute Cloud）で仮想サーバーを利用する
AWS EC2は仮想サーバーを提供するサービスで、個人プロジェクトでウェブアプリケーションをホスティングしたり、バックエンドAPIを動かすのに役立ちます。

**利用手順:**
インスタンスの作成: AWSマネジメントコンソールでEC2インスタンスを起動します。無料枠内では t2.micro インスタンスが利用可能です。
OSの選択: UbuntuやAmazon Linuxなどのオペレーティングシステムを選択します。Ubuntuは人気のある選択肢です。

セキュリティグループの設定: サーバーにアクセスできるポート（例：SSHの22番ポートやHTTPの80番ポート）を設定します。

SSH接続: インスタンスが起動したら、SSHでリモート接続してサーバーを管理します。
```bash
ssh -i "your-key.pem" ubuntu@ec2-xx-xx-xx-xx.compute-1.amazonaws.com
```
アプリケーションのデプロイ: サーバー上にアプリケーションをセットアップします。Node.js、Django、Ruby on Railsなど、好きな環境を構築してアプリをデプロイしましょう。

# 3. S3（Simple Storage Service）でファイルの保存
S3は、オブジェクトストレージサービスで、大量のファイルやデータを保存するのに適しています。個人プロジェクトでは、画像やファイルのアップロード、バックアップの保存に利用できます。

**利用手順:**
バケットの作成: S3バケットを作成し、そこにファイルを保存します。
バケットポリシーの設定: パブリックアクセスや権限を管理し、ファイルの公開範囲を設定します。
ファイルのアップロード: マネジメントコンソールまたはAWS CLIを使ってファイルをアップロードします。
```bash
aws s3 cp your-file.txt s3://your-bucket-name/
```
静的ウェブサイトのホスティング: S3を利用して静的なウェブサイトをホスティングすることも可能です。HTML、CSS、JavaScriptで作成されたサイトを簡単に公開できます。

# 4. RDS（Relational Database Service）でデータベースの管理
AWS RDSを利用すると、リレーショナルデータベース（MySQL、PostgreSQL、MariaDBなど）を簡単に管理できます。EC2インスタンスで直接データベースをセットアップする代わりに、RDSを使うことでスケーラブルで信頼性の高いデータベース環境を提供できます。

**利用手順:**
RDSインスタンスの作成: RDSで新しいデータベースインスタンスを作成します。無料枠内では、小規模なMySQLやPostgreSQLが利用可能です。
接続情報の取得: データベースに接続するためのエンドポイント情報を取得します。
データベースクライアントを使った接続: MySQL Workbenchやpsqlコマンドを使って接続し、データベースの管理を行います。
```bash
psql -h your-rds-endpoint -U your-username -d your-database
```

# 5. Lambdaを使ったサーバーレス開発
サーバーの管理が不要なサーバーレスアーキテクチャを利用する場合、AWS Lambdaが便利です。Lambdaはコードを実行するための関数を提供し、トリガーに応じて自動的に実行されます。例えば、画像のアップロード時に自動で画像処理を行う場合などに利用できます。

**利用手順:**
Lambda関数の作成: Lambda関数を作成し、Node.js、Python、Javaなどでコードを記述します。
トリガーの設定: API GatewayやS3イベントなど、Lambda関数を起動するトリガーを設定します。
テスト実行: Lambda関数をテストし、デプロイ後に自動的に実行されるように設定します。

# 6. API GatewayとLambdaの統合
API Gatewayは、REST APIを作成し、AWS Lambdaと統合することでサーバーレスなバックエンドAPIを構築できます。API Gatewayを使うと、エンドポイントを簡単に作成でき、フロントエンドからのリクエストを受け取ってLambda関数を実行できます。

**利用手順:**
API Gatewayの作成: 新しいREST APIを作成し、エンドポイントを定義します。
Lambdaとの統合: APIリクエストをLambda関数に渡すように設定します。
APIのデプロイ: APIをデプロイし、フロントエンドや他のサービスからリクエストを受け付けます。

7. CloudFrontを使ったコンテンツ配信
AWS CloudFrontは、コンテンツ配信ネットワーク（CDN）で、静的コンテンツ（画像、HTML、CSS、JavaScriptなど）を高速で配信するのに役立ちます。S3バケットやEC2インスタンスと連携させることが多いです。

**利用手順:**
ディストリビューションの作成: CloudFrontディストリビューションを作成し、S3バケットやEC2インスタンスをオリジンとして設定します。
キャッシュ設定: コンテンツのキャッシュ設定を行い、特定のコンテンツがどれくらいの期間キャッシュされるかを指定します。
エンドポイントの利用: CloudFrontのURLを利用して、世界中のユーザーに高速でコンテンツを提供します。

# まとめ
個人開発でAWSを活用するには、以下のサービスが有用です：

EC2: 仮想サーバーを使ったアプリケーションホスティング
S3: ファイルや静的コンテンツの保存、ウェブサイトホスティング
RDS: 信頼性の高いリレーショナルデータベース
Lambda: サーバーレスアーキテクチャによる関数実行
API Gateway: REST APIの構築
CloudFront: コンテンツ配信ネットワーク


今回はAWSの個人開発での利用について記事にしました。

基本毎日更新していますので、@y-t0910をフォローしていただけると嬉しいです。
【ABC375】AtCoder Beginner Contest 375【C++】

### コンテスト名
パナソニックグループ プログラミングコンテスト2024（AtCoder Beginner Contest 375）

### コンテストURL
https://atcoder.jp/contests/abc375

### 開催日
2024/10/12 21:00-22:40

---

## [A: Seats](https://atcoder.jp/contests/abc375/tasks/abc375_a)
**解法**
- 問題文通りに判定する
```cpp:ABC375A.cpp
#include <iostream>
#include <string>
using namespace std;

int main(){
    int n;
    cin >> n;
    string s;
    cin >> s;

    int cnt = 0;
    for(int i=0; i<n-2; i++){
        if(s[i]=='#' && s[i+1]=='.' && s[i+2]=='#'){
            cnt++;
        }
    }

    cout << cnt << endl;

    return 0;
}
```

## [B: Traveling Takahashi Problem](https://atcoder.jp/contests/abc375/tasks/abc375_b)
**解法**
- 最初と最後に原点 $(0, 0)$ を追加して、問題文通りに計算する
```cpp:ABC375B.cpp
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;

double dist(long long int a, long long int b, long long int c, long long int d){
    return sqrt((a-c)*(a-c) + (b-d)*(b-d));
}

int main(){
    int n;
    cin >> n;

    vector<int> X(n+2), Y(n+2);
    for(int i=1; i<=n; i++){
        cin >> X[i] >> Y[i];
    }

    double sum = 0;
    for(int i=0; i<n+1; i++){
        sum += dist(X[i], Y[i], X[i+1], Y[i+1]);
    }

    printf("%.10f\n", sum);

    return 0;
}
```

## [C: Spiral Rotation](https://atcoder.jp/contests/abc375/tasks/abc375_c)
**解法**
- $(x,y) → (y,N+1−x) → (N+1−x,N+1−y) → (N+1−y,x) → (x,y)$ と 4 回周期で変化することに注意する
- 90 度回転をイメージする
```cpp:ABC375C.cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(){
    int n;
    cin >> n;

    vector<vector<char>> A(n, vector<char>(n));
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            cin >> A[i][j];
        }
    }
    
    vector<vector<char>> B(n, vector<char>(n));
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            int cnt = min({i+1, n-i, j+1, n-j});
            int x = i, y = j;
            for(int k=0; k<cnt%4; k++){
                int tmpx = y, tmpy = n - 1 - x;
                x = tmpx;
                y = tmpy;
            }
            B[x][y] = A[i][j];
        }
    }

    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            cout << B[i][j];
        }
        cout << '\n';
    }

    return 0;
}
```

## [D: ABA](https://atcoder.jp/contests/abc375/tasks/abc375_d)
**解法**
- 累積和
- `vector<vector<int>>` に各文字の出現回数の累積和を記録する
- 真ん中の文字 $S_j$ に対して、 $S_i = S_k$ である組み合わせの数を計算する
```cpp:ABC375D.cpp
#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main(){
    string s;
    cin >> s;

    int n = s.size();

    if(n<3){
        cout << 0 << endl;
        return 0;
    }

    vector<vector<int>> V(10+26, vector<int>(n+1));
    for(int i=0; i<n; i++){
        V[s[i]-'A'][i+1] = 1;
    }

    for(int i=0; i<10+26; i++){
        for(int j=0; j<n; j++){
            V[i][j+1] += V[i][j];
        }
    }

    long long int cnt = 0;
    for(int j=1; j<n-1; j++){
        for(int i=0; i<10+26; i++){
            cnt += (long long int)(V[i][j]-V[i][0])*(V[i][n]-V[i][j+1]);
        }
    }

    cout << cnt << endl;

    return 0;
}
```
GitHub Actions - ActのRunnerにカスタムイメージを使用する

# 内容

Github Actionsをローカルで実行することのできる[Act](https://nektosact.com/introduction.html)のRunner（実行環境）に、  
カスタムイメージを使用する  
今回使用するカスタムイメージはActで提供されているイメージをベースに、AWS CLIを追加したものとする

# Github Actionsで使用されるRunnerについて

Github Actionsで指定するRunner（`runs-on: ubuntu-latest`等）のスペックは以下に記載されている

- [パブリック リポジトリの標準の GitHub でホストされたランナー](https://docs.github.com/ja/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners#%E3%83%91%E3%83%96%E3%83%AA%E3%83%83%E3%82%AF-%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E6%A8%99%E6%BA%96%E3%81%AE-github-%E3%81%A7%E3%83%9B%E3%82%B9%E3%83%88%E3%81%95%E3%82%8C%E3%81%9F%E3%83%A9%E3%83%B3%E3%83%8A%E3%83%BC)
- [プライベート リポジトリの標準の GitHub でホストされたランナー](https://docs.github.com/ja/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners#%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88-%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E6%A8%99%E6%BA%96%E3%81%AE-github-%E3%81%A7%E3%83%9B%E3%82%B9%E3%83%88%E3%81%95%E3%82%8C%E3%81%9F%E3%83%A9%E3%83%B3%E3%83%8A%E3%83%BC)

また同ページ内のワークフロー ラベルのリンク（[Ubuntu 24.04](https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Readme.md)等）から、  
各Runnerにインストール済のSoftware一覧が記載されている

# Actで使用されるRunnerについて

[Runners](https://nektosact.com/usage/runners.html#runners)にActで使用可能なRunner一覧が記載されている  
同ページ内の[リンク]((https://github.com/catthehacker/docker_images?tab=readme-ov-file#images-available))からRunnerの内容を確認すると、  
Large Sizeイメージは、Githubホステッドランナーに近い環境のようだが、サイズは60GB程度あるらしい  
おそらく一番使用するであろうMedium Sizeイメージは、[Dockerfile](https://github.com/catthehacker/docker_images/blob/master/linux/ubuntu/Dockerfile)から、[act.sh](https://github.com/catthehacker/docker_images/blob/master/linux/ubuntu/scripts/act.sh)を実行して、`packages=`で記載されているツールをインストールしているようだ
サイズは実際にpullした結果、1.3GB程度であった  

Medium Sizeイメージは、Githubホステッドランナーに比べインストールされているツールが少ないため、  
Github Actionsの実装に応じて必要なツールは別途インストールする必要がある  

# カスタムイメージ用の作成

カスタムイメージ用のDockerfileを用意する

```Dockerfile
FROM catthehacker/ubuntu:act-latest

RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
  unzip awscliv2.zip && \
  ./aws/install && \
  rm -rf awscliv2.zip
```

ベースはActで提供しているMedium Sizeイメージとし、AWS CLIを追加インストールしている  
AWS CLIのインストールは、[公式](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html)通り  

`docker build ./ -t catthehacker/ubuntu:act-latest-custom`で、イメージをビルドする  
名前は`catthehacker/ubuntu:act-latest-custom`とした  

# カスタムイメージを使用する

Act実行時にカスタムイメージを使用する場合は、
`-P {GitHub Actionsで実装しているRunner名}={代替イメージ名}`でカスタムイメージと、  
`--pull=false`でpullしないように指定する  

以下、実行例
`act -j 'test' --pull=false -P ubuntu-latest=catthehacker/ubuntu:act-latest-custom`



# 参考

- [act - User Guide](https://nektosact.com/usage/)
- [Use an alternative runner image](https://nektosact.com/usage/runners.html#use-an-alternative-runner-image)
- [GitHub ホステッド ランナーの概要](https://docs.github.com/ja/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners)
ZIGのGUIプラットホームで日本語表示

3連休でいい天気が続いています。こんなときは、どこかへ出かけるのもいいのですが、午前中夏物を掃除して片付けていたら出そびれてしまったので、時間ができました。こんなときは、前々からちょっと試してみたかったことをやってみることにします。

# ZIGはどう？
ということで、[ZIG](https://ziglang.org/)を使ってみたいと思います。Rustで疲れてしまった人にいいらしいですが、まだまだ1.0には遠いようなので、ヤルなら今です。

細かい仕様については触れません。こういう新規言語で気になるのはどこまで日本語が通じるか、です。とりあえず進めてみましょう。

# コンソールで日本語
インストールと動作確認が終わっていることを前提に、こちらのサイトでお約束の Hello World しているので、ここからやってみます。

https://zig.guide/getting-started/hello-world

```zig:main.zig
const std = @import("std");

pub fn main() void {
    std.debug.print("Hello, {s}!\n", .{"World"});
}
```
これを以下のように実行します。
```
PS C:\Users\...\zig\hello> zig run main.zig
Hello, World!
```
無事、出力されました。では一部を日本語にしてみましょう。
```zig:main.zig
pub fn main() void {
    std.debug.print("日本の, {s}!\n", .{"世界"});
}
```
```
譌･譛ｬ縺ｮ, 荳也阜!
```
ココにコピペするのもどうよ、というような表示です。UTF-8で保存することでビルドはできるようですが、もうちょっとですね。なにかおまじないが必要なのかもしれませんが、見つけることができませんでした。残念。でも、この程度であればそのうち改善されると思われます。期待して待ちましょう。

# GUIで日本語
本題です。ZIGについても、いろいろ集めているサイトがすでにあります。

https://github.com/zigcc/awesome-zig

この中にGUIの項があって、すでにいくつか並んでいます。少し眺めていくとImmediate Mode GUI という説明があったので dvui を使ってみます。ImGUIに触れてから immediate mode 好きなんで。

https://github.com/david-vanderson/dvui

dvui のソースをクローンして手元に展開しておきます。デモ用のサンプルが用意されていますが、この中で sdl-standalone を使って試してみます。readme の説明に従ってビルドします。ビルドできると表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132817/e2e07939-e295-51ae-7a87-e86f610d000e.png)
このデモの Show Demo Window を見てみるとテキストの例があります。
ここに、日本語とかも含めてテキストを入れると、予想通り日本語が化けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132817/45f29702-3874-ad44-548a-1eb285490922.png)

これはフォントの指定くらいで直るはずです。フォントの設定がどこにあるか探してみましょう。

Show Demo Window の中身は "src/Examples.zig"にありました。
```zig:src/Examples.zig
    if (try dvui.expander(@src(), "Text Entry", .{}, .{ .expand = .horizontal })) {
        var b = try dvui.box(@src(), .vertical, .{ .expand = .horizontal, .margin = .{ .x = 10 } });
        defer b.deinit();
        try textEntryWidgets();
    }
```
しかし、フォントの指定はこのあたりではなさそうです。おそらく、デフォルトのフォントをどこかで決めているはずです。src の中で Font.zig でそれっぽい記載がありました。

```zig:src/Font.zig
// default bytes if font id is not found in database
pub const default_ttf_bytes = TTFBytes.Vera;

// functionality for accessing builtin fonts
pub const TTFBytes = struct {
    pub const Aleo = @embedFile("fonts/Aleo/static/Aleo-Regular.ttf");
    pub const AleoBd = @embedFile("fonts/Aleo/static/Aleo-Bold.ttf");
    pub const Vera = @embedFile("fonts/bitstream-vera/Vera.ttf");
```
font id が見つからなかったら Vera を利用するということになっていて、Vera の実態が定義されています。font id の指定方法がどこかにあると思いますが、とりあえず、Vera の実態を書き変えます。今回日本語フォントは、Google Font の Noto Sans JP を使いました。この中で "NotoSansJP-Regular.ttf" を適当な場所に置いてビルドします。

```zig:src/Font.zig
    // pub const Vera = @embedFile("fonts/bitstream-vera/Vera.ttf");
    pub const Vera = @embedFile("fonts/japanese/NotoSansJP-Regular.ttf");
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132817/de603e77-b63b-7717-8632-9a0208be8166.png)
うまく行きました。
IMEで入力するときに入力中の文字がどこかへ行ってしまって実際に使うには課題があるのですが、もうちょい、という感じです。

# おわりに
日本語に限らず文字列のところは議論されているように見えるので、しばらく様子見です。日本語のコミュニティもあるようなので、あとで参加してみようと思います。
Mamba2 Minimal JAX: AGIへの道

Mamba2のJAX実装をしていて気づいていることについて、もうAGIはすぐやってくるため…。
# New
2024/10/30
Mamba2の発表から5か月の時を経てMamba2 Minimal JAXをGitHubにUPしました。
https://github.com/repyt-margorp/mamba2-minimal-jax

# AGIへの道
AGIは3つの基本的なコンポーネントから構成されます。2024年、現在の言葉では
・LLMおよび基盤モデル
・プロングラミング言語
・RAG(Retrieval Augmented Generation)
です。これは量子コンピュータの基本的コンポーネントが
・量子ビット用論理ゲート
・量子テレポーテーション装置
・量子もつれ粒子
であったことと同様です。

LLMおよび基盤モデルはState Space Model系で実現できる可能性が高く、プログラミング言語には定理証明支援系(あるいは型理論で強力にコンパイル時計算のできる系)が必要です。RAGおよび推論時のPrompt Tree(私はもうChain of Thoughtとは言わないように、Tree構造を考えないとダメなのです。それに伴って、現在のシーケンシャルな言語データセットはSSM系では通用しないことを説明します。具体的にはTree構造をもったデータセットの開発が急務です)はある種の強化学習で手に入ると考えられます。

トランスフォーマーベースのプロンプトエンジニアリングは「ゲーム」でした。AssistantとUser間の対話は二者間で行われた論理推論ゲームであり、Userの会話を自動的なagentプロンプトにすることで自動化し、自動で推論のゲームを進行させます。これはSSMの系では論理推論のゲームのStateをプロンプトで誘導していたことに相当します。

LLMおよび基盤モデルが「自然言語を操っていること」が全ての誤りです。具体的には基盤モデルは「機械言語に自然言語をプラスしたものを使う」必要があります。つまり
lst := aize(“主要な世界の大統領をリスト形式でください“)
for x in lst:
    print(x, “:”, aize(f”{x}を日本語に訳してstringとして返して”))
というような言語が必要だったのです。私はすでに実験用としてこの言語を持っています。このプログラミング言語の特徴は、構造化プログラムの順次、分岐、繰り返しは計算機実行され、非構造化部分を持つことです。(これに関してAGIと人類の違うところがあって、人類は内在的にニューラルネットなので自然言語そ使いますが、機械は内在的にオートマトンなので機械言語を使うのです。より一般にモデル化された実在は機械言語で表されますが、まだ物理学・自然科学は人類と宇宙の完全なモデルと予測力を持たないため、AGIとヒトは人倫上切り離されます。なぜならAGIはその挙動が人類にとって解明されているからです)また、プログラミング言語についてはまだあまり多くの人が気づいていないようですが、型レベルプログラミングはコンパイル時計算でした。ホモトピー型理論の観点からpropositional equalityを自動証明し数値を計算するのがコンパイルです。
kali linuxツール備忘

* 参考資料： `7日間でハッキングをはじめる本` 準拠
* [参考リンク](https://yawaraka-sec.com/7days-hacker-support/)
# day2
## 1. nmap
ポートスキャンのコマンド
### 使い方
`nmap -sV -Pn -oN nmap.txt -v 10.x.x.x`
* `-oN` スキャン結果を保存する場合の出力先

## 2. dirb
### 概要
* ディレクトリバスターコマンド
* 探索に使える
### 使い方
`dirb http://x.x.y.y /usr/share/dirb/wordlists/small.txt`
* 引数1に `対象IP`
* 引数2に `探索に使う辞書ファイル`
### 結果
DIRECTORY: `http://x.x.x.x/development` というように表示される

## 3. smbclient
対象サーバーのSMB情報を取得できる
### 使い方
`smbclient -L x.x.x.x`


## 4. hydra
辞書攻撃に使う
### 使い方
`hydra -l jan -P /usr/share/wordlists/rockyou.txt ssh://x.x.x.x -t 4`
* `-l` ターゲットのユーザー名。上記であれば `jan` ユーザー
* `-t` 並列処理する数

# day3

# day4
burp suiteがkali linuxに入っていなかった。
## burp suiteインストール
※以下のコマンドは時間がかかるので注意すること
1. `sudo apt update && sudo apt upgrade -y`
    ```
    Please specify whether macchanger should be set up to run automatically every time a network device is brought up or down. This gives a new MAC address whenever you attach an ethernet cable or reenable wifi.
    
    <Yes> <No>
    ```
    というダイアログが出たがnoで進む
    ```
    ~~ Restart services during package upgrades without asking?
    ```
    がでるが、これもNo。
1. ブラウザで `burp suite download` と検索して出てくる `Download Burp suite community edition` というページ（公式）を開く
1. `Go straight downloads` をクリック（これならメアド登録不要）
1. `Burp suite community edition` `Linux(x64)` を選択してDOWNLOAD
1. `cd ~/Downloads`
1. `/bin/sh ~/Downloads/burpsuite_community(ダウンロードファイルに合わせて適宜変更).sh`
    * 下記のダイアログが出れば成功。Nextで進む
    ![スクリーンショット 2024-10-19 19.25.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225823/4478f38f-dee8-bea3-3b75-04e0271ab072.png)
    * もしダイアログが出ずに `~java: not found` の表示が出る場合は過去のバージョンを試す
        * `2024_8_5.sh` はうまく行かずに `2024_6.sh` はうまく行った
サーバー監視(Mackerel)のメリットとは?　実際に利用してみて感じたメリット２選を解説

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980785/c0b2939b-b0a0-a500-99b9-70481eebc4e4.png)

## 初めに
この記事では、自身が開発している「カフェ提案LINE AIボット」のサービスでサーバー監視(Mackerel)を利用するようになり、それに際して個人的に「これはめっちゃ便利だわ！」と本気で感じたメリットをキャプチャ付きで紹介したいと思います。

## そもそも「サーバー監視」とは？
サーバー監視とは、Webサービスやアプリケーションが稼働しているサーバーの状態を常時チェックし、問題が発生した際に迅速に対応するための仕組みです。具体的には以下のような項目を監視します：

- CPU使用率
- メモリ使用量
- URLの可用性（WebサイトやAPIエンドポイントが正常に応答しているか）

## 「Mackerel」とは？
Mackerelは、「はてなブログ」で有名な「株式会社はてな」が提供するサーバー監視サービスです。
日本語ドキュメントが充実していて、シンプルで分かりやすいダッシュボードや簡単にサーバー監視を始められるのが特徴です。


## めっちゃ便利だわと感じたメリット2選

### その1： サーバーに異常が発生した場合に簡単に通知を送れる
Mackerelを使うことで、Webサービスの死活監視が簡単に行うことができ、異常があった場合には簡単に通知を送ることができます。実際に次の２つのケースで試してみました。

※ 死活監視 = サーバーやネットワーク機器、システムなどが正常に稼働しているかどうかを外部から継続的に監視すること

#### ケース1：サーバーに負荷をかけた場合
サーバーに意図的に高負荷をかけてみたところ、すぐにMackerelからアラートが届きました。アラートの送信先は様々な方法で設定でき、今回はメールとLINE(LINE Notify)に通知が来るようにしてCPUの負荷テストを行いました。


#### キャプチャ
|Email|LINE |
| --- | --- | 
| ![Screenshot 2024-10-13 at 13.39.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980785/8dc8ee91-2f98-a409-13c7-f56b149563f8.png) | ![Screenshot 2024-10-13 at 13.37.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980785/8cac88b1-c587-2928-d051-e5476ac2f59d.png)| 

|通知の種類|
| --- |
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980785/a6f5d21b-1963-bedc-b07e-db94e2a504dd.png) | 

### ケース2: URLが機能していない場合

メンテナンス中にサービスのURLにアクセスできない状況を作り出したところ、即座に通知が来ました。

|通知|
| --- |
|![Screenshot 2024-10-13 at 14.02.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980785/73803d8e-1f66-4f5f-cbe7-2c381aa67575.png)| 

この通知により、問題が発生した際に迅速に対応することができます。



### その2： 簡単にCPUやメモリの分析を行える(当たり前だけれど、)
Mackerelのダッシュボードを使えば、サーバーのリソース使用状況を視覚的に把握できます。
特に良かったのは次の２点です。

#### サーバーのCPUやメモリの分析が行える

|CPU & Memory |
| --- |
|![Screenshot 2024-10-13 at 14.15.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980785/e8b5f169-0cfb-598b-ce19-48502a73426a.png)|

#### Docker コンテナの監視も行える

|CPU| Memory |
| --- | --- | 
|![Screenshot 2024-10-13 at 14.10.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980785/8194fb2f-a85b-3773-7f9f-3f6a60afd5f2.png)|![Screenshot 2024-10-13 at 14.11.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980785/6266af55-0a3c-42d3-10f3-1f3bc58ee404.png)| 


## メリットは分かった、でもどうやって勉強すればいいの？
結論、「わかばちゃんと学ぶ サーバー監視」という書籍を読めば簡単に内容の把握や導入ができます。
内容はこんな感じです。


||  |
| --- | --- | 
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980785/65ea0c70-c418-fa43-9fa5-d6d6cd8ad8bb.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980785/90bb3860-2987-7464-bb8b-360c5c58fb36.png)| 


## 最後に
不具合を減らすために仕組み化をしていく上で、もしサーバー監視(Mackerel)の技術が必要かもと思ったら、ぜひ手を動かして試してみてもらえればと思います！Mackerelは無料プランもあるので、まずは試してみることをおすすめします！
リファクタリング（関数の抽出）

## 背景
リファクタリングする機会があり、本「リファクタリング: 既存のコードを安全に改善する」を閲覧しながら行なった。
実際のコードで行うのは初心者にとってはなかなか難しい内容だったため、備忘録として整理しておきたい。

## 目的
関数の抽出、で行なったことを振り返り、
他の場所でもリファクタリングができるようにする。

## 3パターンの違い

### 1. メソッドとして抽出したいコード群にローカル変数が含まれてい"ない"場合
単純で下記の3ステップで終了する。
1. 関数名を記載
2. メソッドとして抽出したいコード群をコピー＆ペースト
3. 元のコード群をメソッド名に置き換え 

### 2. メソッドとして抽出したいコード群にローカル変数が含まれて"いる"場合
上記に、引数としてローカル変数を渡す。

### 3. ソッドとして抽出したいコード群にローカル変数が含まれていて、かつ値を代入している場合（具体的なコード例あり）

手順としては下記になる。具体的にコード例で見ていく。
1. ローカル変数の定義をメソッドとして抽出したいコード群の近くに移動する。
1. 関数を作成
4. 呼び出し元を変更

```javascript
// リファクタリング前

let a = 1;
let b = 2;

a = b + 1; //これをメソッドにしたい

console.log(a);
```

```javascript
// 手順 1　宣言を移動

let b = 2;

let a = 1; //宣言を移動
a = b + 1; 

console.log(a);
```

```javascript
// 手順 2 関数を作成

let b = 2;

let a = 1;
a = b + 1; 

console.log(a);

// 関数を作成
function bPlusOne(b){
    a = 1;
    a = b + 1;
    return a;
}
```

```javascript
// 手順 3　呼び出し元を変更

let b = 2;

let a = bPlusOne(b); //呼び出し元を関数の呼び出しに置き換える

console.log(a);

function bPlusOne(b){
    a = 1;
    a = b + 1;
    return a;
}
```
## 学び
最初は単純そうに見えていた関数の抽出も、ローカル変数を使用しているか？再代入しているか？で難しく見えた。実際のコードに適用したときはさらに難しかったため、整理しながら理解していきたい。

## 次
レコードのカプセル化も、実施したため備忘録のため残す予定。
.gitignoreにファイルを追加したが反映されなかった時の対処法

## 問題
.gitignoreファイルへgithubに公開したくなかった.envを追加したが、反映されず、.envが公開されたままになってしまっていた。
## 解決策
以下のコマンドを入力し(どちらでもよい)、キャッシュを削除してからコミット・プッシュした。
```
$ git rm -r --cached 
$ git rm -r --cached ファイル名　//これでもよい
```
## まとめ
このような問題は経験して慣れるしかないと思ってます。開発する中でこのような問題を経験として吸収することが大事だと思います。
【TryHackMe】Vulnerabilities 101：Walkthrough

# 概要

TryHackMe「Vulnerabilities 101」のWalkthroughです。

https://tryhackme.com/r/room/vulnerabilities101

# Task2

## **Q1**.*An attacker has been able to upgrade the permissions of their system account from "user" to "administrator". What type of vulnerability is this?*

**A**.**Operating System**

## **Q2**.*You manage to bypass a login panel using cookies to authenticate. What type of vulnerability is this?*

**A**.**Application Logic**

# Task3

## **Q1**.*What year was the first iteration of CVSS published?*

**A**.**2005**

## **Q2**.*If you wanted to assess vulnerability based on the risk it poses to an organisation, what framework would you use?*

**A**.**VPR**

## **Q3**.*If you wanted to use a framework that was free and open-source, what framework would that be?*

**A**.**CVSS**

# Task4

## **Q1**.*Using NVD, how many CVEs were published in July 2021?*

**Hint**.*Change "Search Type" to Advanced, specify the proper Published Date Range, and hit Search.*

`Search Type`を`Advanced`にし、`Published Date Range`を設定して検索します。

![nvd.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/dd86725c-d81a-8a78-168a-81b62fca9124.jpeg)

**A**.**1554**

## **Q2**.*Who is the author of Exploit-DB?*

**A**.**OffSec**

# Task5

## **Q1**.*What type of vulnerability did we use to find the name and version of the application in this example?*

**A**.**Version Disclosure**

# Task6

## **Q1**.*Follow along with the showcase of exploiting ACKme's application to the end to retrieve a flag. What is this flag?*

**A**.**THM{ACKME_ENGAGEMENT}**
配列を作成して HTML テーブルを作成する


# はじめに

Power Automate でこういう形式でメール送信を行うアプローチを紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/73eff069-467c-60f5-5122-7863daf4598c.png)

# アプローチ

まず、HTML テーブルのスタイルを変数に格納しておきます。この辺は他のサイトを参考にしたり、ChatGPT に聞いてみるといいかなと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/75860f2e-7aff-c273-001f-087386dce48a.png)

次に、以下の二つのアクションで HTML テーブルを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/e4eb9b3f-61b6-a1d0-cc90-324a613e26cf.png)

メール送信時にそれぞれを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/bbf26a4b-4d73-48a9-688f-1db736db5d69.png)


上手く作成できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/44780d02-6003-82ce-408e-fbc073fa3c7c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/0fa3ff53-66b0-5352-dd65-b889ea89b3bd.png)
アルゴリズム初心者がbit全探索をまとめてみた

## bit全探索とは？
bit全探索とは、各要素を「選ぶ」「選ばない」の2択として扱い、すべてのパターンを探索する方法です。「0」と「1」の二進数を使って表現されます。「0」は選ばない（否定）、「1」は選ぶ（肯定）というイメージです。

例えば、5枚のカードがあり、それぞれを「引く」「引かない」の全パターンを考えると、以下のようになります。

|   | 1 | 2 | 3 | 4 | 5 |
|:-:|:-:|:-:|:-:|:-:|:-:|
| 1 | 0 | 0 | 0 | 0 | 0 |
| 2 | 0 | 0 | 0 | 0 | 1 |
| 3 | 0 | 0 | 0 | 1 | 0 |
| 4 | 0 | 0 | 0 | 1 | 1 |
| 5 | 0 | 0 | 1 | 0 | 0 |
|   |   |   | … |   |   |
| 29 | 1 | 1 | 0 | 0 | 0 |
| 30 | 1 | 1 | 1 | 0 | 1 |
| 31 | 1 | 1 | 1 | 1 | 0 |
| 32 | 1 | 1 | 1 | 1 | 1 |

### 1. 全通りについて

5枚のカードがある場合、その選択肢は2通り（選ぶor選ばない）です。
したがって、2の5乗である2^5 = 32通りの組み合わせが存在します。

### 2. 二進数との関係
各カードの選択状態を二進数で表現すると、次のようになります。

- 1枚目のカードだけを引かない場合
→ 「11110」（2枚目から5枚目までは引くが、1枚目だけ引かない）

- 3枚目と5枚目だけを引く場合
→ 「00101」（3枚目と5枚目を引き、他のカードは引かない）

このように、bit全探索では「二進数」で選択状態を管理し、全パターンを網羅することができます。

## bit全探索の使用例
次に、bit全探索がどのような場面で使われるかを具体例を通じて説明します。

### 例1：2枚のカードの合計が10の倍数になる組み合わせを探す
カードが5枚あり、それぞれに数字が書いてあるとします。
2枚のカードを引き、その合計が10の倍数になる組み合わせが何通りあるかを求めます。
これは通常の全探索（2重ループ）で解けます。
```
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        
        // カードの枚数
        int N = 5;
        int[] cards = new int[N];
        for (int i = 0; i < N; i++) {
            cards[i] = scan.nextInt();
        }

        int ans = 0;
        
        // 2枚のカードの組み合わせを全探索
        for (int i = 0; i < N; i++) {
            for (int j = i + 1; j < N; j++) {
                int sum = cards[i] + cards[j];
                
                // 10の倍数ならカウント
                if (sum % 10 == 0) {
                    ans++;
                }
            }
        }

        System.out.print(ans);
    }
}
```

### 例2：N枚のカードの合計が10の倍数になる組み合わせを探す
今度は、N枚のカードを引いて、その合計が10の倍数になる組み合わせを求めます。
多重ループでは処理時間がかかりすぎるため、ここでbit全探索が有効になります。
```
import java.util.Scanner;

public class CardCombinationBitSearch {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int[] cards = new int[5];
        for (int i = 0; i < 5; i++) {
            cards[i] = scanner.nextInt();
        }

        int N = scanner.nextInt();
        int ans = 0;

        // bit全探索
        for (int bit = 0; bit < (1 << 5); bit++) {
            int sum = 0;
            int selectedCount = 0;

            for (int i = 0; i < 5; i++) {
                if ((bit & (1 << i)) != 0) {
                    sum += cards[i];
                    selectedCount++;
                }
            }

            if (selectedCount == N && sum % 10 == 0) {
                ans++;
            }
        }

        System.out.println(ans);
    }
}
```

### 解説
- bit < (1 << 5)
1を5回左にシフト（1 << 5）することで、2^5（32）通りの組み合わせが生成されます。
0から32まですべてのビット列（5ビット）を網羅するためのループです。

- bit & (1 << i)
この式は、bitのi番目の桁が1かどうかを確認するためのビット演算です。具体的には、1 << i で「i番目が1の二進数」を作り、それと bit をAND演算（&）することで、i番目が1であれば選択するという処理が行われます。

## まとめ
bit全探索は、多数の組み合わせを効率的に探索するための強力な手法です。
特に、全通りを計算することが難しい問題で、そのパフォーマンスの優位性を発揮します。
しっかりと理解し、問題に適用できるようにしましょう！

安定してC問題を解くのが目標！
Word内の画像を一括で拡大する。あ、拡大ってのはサイズを変えずにズームすることです。

# なぜWordで画像をzoomする必要があるのか

https://qiita.com/miyama_daily/items/016ce30147de6888d7ca

[前回](https://qiita.com/miyama_daily/items/016ce30147de6888d7ca)に引き続き、、、

**、、、仕事で必要だったからです！！！[(二回目)](https://qiita.com/miyama_daily/items/016ce30147de6888d7ca#wordの文書内の画像を一括で指定サイズの正方形にする)**

こんな使い道の狭すぎるマクロを書くの、自分だって不本意なんですよ。
ただ、備忘録的に残しておくと何かの役に立つのではないかと思ってます。

このスクリプトを使ってくれるような仲間が欲しい


# 要件

今回の要件は、
* もとの画像はどんな形でも可
* zoom倍率を指定する
* サイズはもとのまま
です

申し訳ないのですが、今回のスクリプトはかなり簡便なので、行内図すべて含みます。画像以外に図形がある場合はそれも対象になります。


# では早速コードです
コピペしてください。


```vb
Sub zoom()
'
' zoom Macro
'
'

  Dim Image As Object
  Dim zoom As Double
  Dim TempWidth As Double
  Dim TempHeight As Double

  '拡大倍率を指定
  zoom = InputBox("zoom (倍) : ")
  For Each Image In ActiveDocument.InlineShapes
    If Image.Type = wdInlineShapePicture Then
      'ここが重要！
      With Image.PictureFormat
        .CropLeft = Image.Width * (1 - 1 / zoom) / 2
        .CropRight = Image.Width * (1 - 1 / zoom) / 2
        .CropTop = Image.Height * (1 - 1 / zoom) / 2
        .CropBottom = Image.Height * (1 - 1 / zoom) / 2
      End With
      '縦横比を固定してサイズをもとにもどす
      Image.LockAspectRatio = msoTrue
      Image.Width = TempWidth
    
    End If
 Next Image

End Sub
```


# おわり
簡単でしたね！

一緒に[この記事](https://qiita.com/miyama_daily/items/016ce30147de6888d7ca)も見てクレメンス！

https://qiita.com/miyama_daily/items/016ce30147de6888d7ca
Helixのスニペット設定

Helixでのスニペットの設定の仕方を探していたのだけれど、スニペットはスニペット用のLSPとして設定するようだ。
探すと２つほど見つかったのだが、[hx-lsp](https://github.com/erasin/hx-lsp
)というのをとりあえず入れてみた。

https://github.com/erasin/hx-lsp

自分の使い方としてはAtCoderやるときに自作ライブラリを単に挿入するだけなので、LSP導入するほどか？とも思うのだけど、VSCodeではスニペットで実装していたので、VSCodeのスニペットがそのまま移行できそうだったこと、rustで実装されていて1バイナリになることからこれにした。ちなみにもう一つのはnpmパッケージだった。

導入に当たり、行ったことを記録しておく。基本的にはREADME通りで大丈夫

## hx-lspのインストール

```bash
rustup update
cargo install hx-lsp
```

rust関係はAHC用にインストールしてある。念の為、rustupで最新にしておく

## language.toml への設定追記

LSPの設定とそれをrubyで使用するように設定。
ruby用にsolargraphも設定しているので、マルチLSP環境の設定にする。

```languages.toml
use-grammars = { only = ["ruby", "toml", "bash", "hcl", "yaml", "lua"]}

[language-server.hx-lsp]
command = "hx-lsp"

[[language]]
name = "ruby"
language-servers = [ "solargraph", "hx-lsp" ]
```


## VSCode用のスニペットをhx-lsp用のディレクトリにコピー

`$HOME/.config/helix/snippets/ruby.json` が、hx-lsp用のスニペットを置いておくところなので、VSCode用に作ったスニペット用のjsonファイルと同じものを置くと使える。

自分はライブラリのコードをまるごとスニペットに変換するスクリプトを使用しているため、そのファイルでhelix用のスニペットファイルも一緒に作っている。

```
#!/bin/bash

function snippet_entry() {
  local key=$1
  local prefix=$2
  local file=$3

  local body=$(jq '.' "$file" -R | jq -s '.')

  local args=()
  args+=(--arg name "$key")
  args+=(--arg prefix "$prefix")

  local filter='{ key: $name, value: {prefix: $prefix, body: . }}'

  jq "${args[@]}" "$filter" <<<"$body"
}

function add_snippet(){
  local key=$1
  local prefix=$2
  local file=$3
  local entry=$(snippet_entry "$key" "$prefix" "$file")
  snippets+=("$entry")
}

function merge_snippets(){
  jq 'from_entries' -s <<<"${snippets[*]}"  
}

snippets=()
SNIPPETS_DIR="$(cd $(dirname $0); pwd)/../lib"

VSCODE_SNIPPETS_PATH=$HOME/.config/Code/User/snippets/ruby.json
HELIX_SNIPPETS_PATH=$HOME/.config/helix/snippets/ruby.json
for f in $SNIPPETS_DIR/*.rb; do
  add_snippet "$(basename $f)" "$(basename $f)" "$f"
done

merge_snippets | tee "$VSCODE_SNIPPETS_PATH" "$HELIX_SNIPPETS_PATH"
```
## 使い方

挿入モードでprefixに一致するスニペットが表示されるので、選択するとコードがまるっと挿入される。VSCodeのときと近い使い心地で悪くない。

![hx-snippets.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19245/ee148f6e-f00c-b782-c2de-263e884e4b9a.gif)
データ属性の値が配列の文字列である場合に値を配列として取得する方法

# 背景
業務でデータ属性の値が配列である場合の値を配列として取得するのに苦戦した為です。

```html
<div data-validate='["work_location","required"]' >
</div>
```

```javascript
const elm = document.querySelector('div');
const dataArrayAttr = elm.dataset.validate;
console.log(dataArrayAttr);
```

```terminal
"['work_location','required']"
```

# データ属性の値が配列の文字列である場合に値を配列として取得する方法

データ属性にJSON文字列形式で値を設定しているので、JSON.parseを使えば良いです。

```javascript
const elm = document.querySelector('div');
const rawdataArrayAttr = elm.getAttribute('data-validate');
const dataArrayAttr = JSON.parse(rawdataArrayAttr);
console.log(dataArrayAttr);
```

```terminal
["work_location","required"]
```

:::note
そもそもデータ属性は文字列で値を設定する必要があるので、複数の値を設定する為に以下のように書かれていたと思います。

```html
<div data-validate='["work_location","required"]' >
</div>
```
:::

# 最後に
- 書くのも恥ずかしいくらいですが、些細なことに気づけませんでした。。
- 一つずつ理解していきたいです

# 参考

https://imuza.com/regexp/

https://developer.mozilla.org/ja/docs/Learn/HTML/Howto/Use_data_attributes
Power Automate で複数の添付ファイルを取得してメールに添付する


# はじめに

Power Automate で、SharePoint 上の複数の添付ファイルを取得して、すべてのファイルをメールで添付したい場合があると思います。

しかし、以下のような形でメール送信時にファイルを添付しようとすると、残念ながら、ファイルごとにメールが分かれてしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/ffcd93b6-2b3d-a885-f5c4-13158e3f32a3.png)

今回は、そのようにならないよう、つまり、複数のファイルを一つのメールに添付するアプローチを紹介します。

# アプローチ

まず、メール送信時に添付ファイルを付与する際、内部的には以下のような形式になっています。
Name に拡張子付きのファイルの名前、ContentBytes にファイルのコンテンツ (中身) が入ります。また、複数添付される場合があるため、配列という形式になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/dc41d985-b3be-e0e3-f474-51480a25e432.png)

```
[
  {
    "Name": @{items('Apply_to_each')?['DisplayName']},
    "ContentBytes": @{body('添付ファイルのコンテンツの取得')}
  }
]
```

そのため、こちらの構造を踏まえ、一旦配列に添付ファイルの名前とコンテンツを格納して、最終的にその配列をメールを送信するアクションの添付ファイルの個所に代入します。

まず、配列の変数を定義します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/fee80c88-1e1a-14a4-4cf2-3f8abab63480.png)

次に、取得した添付ファイルのデータを上記形式で配列変数に追加します。`[Apply to each]`により、添付ファイルの数だけ処理を繰り返します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/b7dfb4aa-5fcf-d137-4638-3ac97fa94cec.png)

最後に、この配列変数をメール送信アクションの添付ファイルの欄にそのまま代入します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/8a796c4a-40f9-de62-64aa-a5e13c73dd3c.png)

実行してみます。無事動いて、一つのメールに複数のファイルが添付されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/4f4181bc-2712-353a-3780-af6c0c18c7d4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/3a80bd4d-f4f0-77b9-224e-6f83a9944da3.png)
Gemがインストールできないの解決まで（Rubyのバージョンインストールとrbenvのバージョン管理）

# 経緯
MacでGemをインストールしようとしたところエラーや、作業が詰まったところがあったため、その解決までに至る経緯をメモ。

# 目指すゴール
Faker(（テストデータを取得するGem)をインストールし、挙動を確認したい。

# 課題
### 1.バージョンが古かった
FakerというGemをインストールを試みたところ
「fakerはRubyバージョン>= 2.7が必要です。現在のRubyバージョンは2.6.10.210です。」
とエラーが表示された。

```
$ gem install faker
faker requires Ruby version >= 2.7. The current ruby version is 2.6.10.210.
```

### 2.rbenvで上手くバージョンが切り替わらなかった
rbenvで3.0.0をインストールしglobal設定したが、ruby -v で確認すると上手く設定できていない。

```
$ rbenv global 3.0.0
$ rbenv versions
 system
*3.0.0
$ ruby -v
ruby 2.6.10
 ```
# 解決までの経緯
### 1.バージョン3.0.0のインストール
まずは、バージョン3.0.0のインストールをする。大まかの流れは

Homebrewをインストール
```
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```
↓
Homebrewを用いてrbenv(アール・ビー・エンブ)をインストール
```
brew install rbenv ruby-build
```

↓
rbenvを用いてRubyをインストール
```
rbenv install 3.0.0
```

しかし、グローバル設定もしたが、上述課題の通りruby -v で確認すると上手く設定できていない。

### 2.PATHの設定
ディレクトリ固有のバージョンを指定していると思い、バージョン指定を取り消すコマンドを実施したが、globalで設定しているため変化がなかった。

```
$ rebenv local --unset
rbenv rehash
```

調べたところ、Ruby実行ファイルのPATH設定が上手くできていなかったことが原因であった。which rubyで、コマンドがどのRuby実行ファイルを使用しているかを確認。

```
$ which ruby
/user/bin/ruby
```

となっており、Rubyコマンドとrbenvの実行環境の整合性がとれていないことがわかった。そこで、rbenvがシェルセッションで機能するように以下の通り実行する。

```
$ echo 'eval "$(rbenv init -)"' >>  ~/.zshrc
$ source ~/.zshrc
```
すると
```
$ ruby -v
ruby 3.0.0
```

ruby -vが期待通りの結果となった。

# ゴール確認
fakerジェムも無事インストールすることができ、それっぽい人名がランダムで作成された。

```ruby:gem.rb
require 'faker'

puts Faker::Name.name #=> Audra Ebert

```
.gitignoreってなに？

# はじめに
プロジェクトを作成した際によく見る`.gitignore`という名前のファイル。
今までは見たことあるなあぐらいの感覚で、こいつが何者なのかはしっかり把握してませんでした。
たまたま触れる機会があったのでこの機会に役割と使い方をまとめておきます👍

# .gitignoreとは？
``.gitignore``とは、Gitで管理しないファイルやディレクトリを指定するためのファイルです。
プロジェクトのルートディレクトリに配置され、無視したいファイルやディレクトリのパスをリスト形式で記述します。
ワイルドカードや否定記号を使って、より柔軟に指定することも可能です。
（[perplexity](https://www.perplexity.ai/)に聞いてみた内容を引用してます）

# メリット
`.gitignore`を使用するメリットは以下の通りです。
* **不要なデータの排除**
不要なファイルがリポジトリに含まれないため、コードレビューや共同開発が容易
* **セキュリティの向上**
公開したくない情報をGit管理から除外することによるセキュリティの強化
* **容量の節約**
大容量ファイルを除外できるため、リポジトリの容量を節約し、エラーを防げる

# 使用例
* 一般的なファイルやディレクトリの除外
```
# ログファイルを除外
*.log

# tmpディレクトリ全体を除外
/tmp/

# .DS_Store（macOS固有のファイル）を除外
.DS_Store
```

* 言語・フレームワーク固有の除外
```
# Pythonの場合
__pycache__/
*.pyc

# Node.jsの場合
node_modules/

# Rubyの場合
vendor/bundle
```

* IDEやエディタ固有のファイルの除外
```
# Visual Studio Codeの設定
.vscode/

# JetBrains IDEの設定
.idea/
```

* ビルド成果物の除外
```
# Javaのクラスファイル
*.class

# C++のオブジェクトファイル
*.o
```

*  特定のファイルを除外しない例
```
# すべての.txtファイルを除外
*.txt

# ただし、important.txtは除外しない
!important.txt
```
【ChatGPT】示した単語が知識内に存在するかを判定（GPT-4o版）


　どうも、カーブミラーです。

　今回は、示した単語がChatGPTの知識内に存在するかを判定するPromptのGPT-4o版になります。

:::note info
本記事は、ChatGPT（GPT-4o）
で行なっております。画像は
ありません。　あしからず。
:::
　まずは、
　　昨日（2024/10/12）の記事の
　　　追加情報です。

　リンク先に
　　ジャンプしない方は、
　　　記事の最後に
　　　　ジャンプできるようになる
　　　　　おまじないを入れました。
　　　　　　ごらんください。
[【ChatGPT Canvas】での編集を指示だけで、完成させます。](https://qiita.com/kabumira/items/93c2260f229a256504c3)
***
　次に、X-Twitterで
　　ChatGPT呪文一覧が
　　　ポストされました。
　　　　[KEITOさんポスト](https://x.com/keitowebai/status/1844572757700509760?t=0eSxY3ebMF2mdcCzHQinKg&s=19)

　全文掲載します。
```
【僕が覚えたChatGPT呪文一覧】
・ステップバイステップで考えてください
・デザイン思考で考えてください
・CoT（Chain of Thought）で考えてください
・メタ認知を活用して
・水平思考で考えてください
・自分の限界を超えて
・SCAMPER法を使って
・これは60点です。100点にして下さい。
・AtoZで考えて
・ハルシネーションを起こさないでください
・ここまでの内容をプロンプトにして
・抽象化してください/具体化してください
・最適な文章フレームワークを利用して書き出して
・小学生レベルの読解力で/専門家レベルの読解力で
・最高の生成結果にするにはあなたにどのように指示すれば良いですか？
・ヤジを無くして
・AさんとBさんの会話形式で書き出して
・ありがとう
```

***
　さて、本題に入ります。

　今回は、
　　一年前の記事を
　　　掘り起こしました😅

　いや、
　　調べてて見つけたら
　　　偶然にも、一年前のものでした。

　あのころは
　　まだ課金してなくて、
　　　無料版を使って
　　　　やっていましたからねぇ。

[【ChatGPT無】示した単語が知識内に存在するかを判定](https://qiita.com/kabumira/items/056a1424ba3bfdb67879)

　これ、どういうものかと言いますと、
　　指定した単語が
　　　ChatGPTの持つ知識の中に
　　　　あるかどうかを判定します。

　GPT-3.5で行なっていたものを
　　GPT-4oで動くのかを
　　　チェックしました。

　こちらが、GPT-3.5でのPromptです。
```Text:知識にあるなし判定Prompt
# 問い
「＊＊＊」とは、なんですか？

# 前提条件
上記の問いが、あなたの知識の中に単語として存在しているかいないかを答えてください。存在しない場合は、「最後に」に進んでください。

# 問いに対する回答
上記の問いの回答を出力してください。

# 最後に
プロンプトを終了してください。
```

　GPT-4oで
　　やってみたところ、
　　　存在しないにも関わらず、
　　　　「問いに対する回答」を
　　　　　してしまいました。

　そこで、
　　前提条件を
　　　ちょい手直し。
```Text:知識にあるなし判定Prompt（改）
# 問い
「＊＊＊」とは、なんですか？

# 前提条件
上記の問いが、あなたの知識の中に単語として存在しているかいないかを答えてください。存在しない場合は、「問いに対する回答」をスキップして、「最後に」に進んでください。

# 問いに対する回答
上記の問いの回答を出力してください。

# 最後に
プロンプトを終了してください。
```

　これで
　　「問いに対する回答」を
　　　スキップして「最後に」へと
　　　　進んでくれます。

　私がいつも
　　ハルシネーションテストに
　　　使っている「スマホ熱中症」も
　　　　知識に存在しない、と
　　　　　回答してくれました👍

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
***
　あとからですが、
　　o1-miniとo1-previewでも
　　　確かめました。

　どちらも間違えた回答を
　　出そうとしていたけれど、
　　　最終的には知識にないことを
　　　　認めました。

　良かった😸
bashでファイルから特定の文字列から特定の文字列まで抽出するコマンド

コマンド
```bash
perl -0777 -ne 'print "$1\n" if /START(.*?)END/s' filename.txt
```

参考
- -0777とは？: https://zat.ifdef.jp/html/2007/12-01.html
- -neとは？: https://www.tohoho-web.com/perl/app2.htm
    - > -n: スクリプトを while (<>) { ... } で囲んで実行します。
    - > -e: script	script を perl のスクリプトとして実行します。例えば、「perl -e "print 5 * 3"」 は 5 * 3 の結果 15 を表示します。
Webアプリ開発のフロントエンドとバックエンドの結合方法

今回はフロントエンドとバックエンドを結合する方法について記事にしたいと思います。

API（RESTまたはGraphQL）の使用

フロントエンドとバックエンドを結合する最も一般的な方法は、バックエンドでAPI（通常はRESTまたはGraphQL）を提供し、フロントエンドがそれを呼び出してデータをやり取りするという方法です。
HTTPリクエスト（Ajax、fetch、axios）

フロントエンドは、HTTPリクエスト（GET、POST、PUT、DELETEなど）を使用して、バックエンドAPIに対してデータを取得したり送信したりします。これにはfetch APIやaxiosライブラリを使用することが一般的です。
基本的なステップ：フロントエンドとバックエンドの結合


1. バックエンドAPIの構築
まず、バックエンドでAPIを構築します。ここでは、Node.js と Express を使用した簡単な例を紹介しますが、他の言語やフレームワークでも同様です。

```javascript
// server.js (Node.js with Express)
const express = require('express');
const app = express();
const PORT = 3000;

app.use(express.json());

// サンプルAPIエンドポイント
app.get('/api/users', (req, res) => {
  res.json([
    { id: 1, name: 'Alice' },
    { id: 2, name: 'Bob' }
  ]);
});

app.listen(PORT, () => {
  console.log(`Server running on http://localhost:${PORT}`);
});
```
ここでは、/api/users エンドポイントを提供し、ユーザー情報のリストをJSON形式で返しています。

2. フロントエンドからバックエンドAPIを呼び出す
次に、フロントエンド（例えばReactを使用）でバックエンドAPIを呼び出します。

```jsx
// App.js (React example)
import React, { useState, useEffect } from 'react';

function App() {
  const [users, setUsers] = useState([]);

  // コンポーネントの初回レンダリング時にAPIを呼び出す
  useEffect(() => {
    fetch('http://localhost:3000/api/users')  // バックエンドAPIのURLを指定
      .then(response => response.json())
      .then(data => setUsers(data));
  }, []);

  return (
    <div>
      <h1>User List</h1>
      <ul>
        {users.map(user => (
          <li key={user.id}>{user.name}</li>
        ))}
      </ul>
    </div>
  );
}

export default App;
```
fetch() メソッドを使用して、バックエンドのAPIからデータを取得しています。
データは useState で管理され、useEffect を使ってコンポーネントが最初にレンダリングされたときにAPI呼び出しが行われます。


3. CORSの設定
デフォルトでは、フロントエンドとバックエンドが異なるドメインやポートで動作していると、CORS（Cross-Origin Resource Sharing） の問題が発生します。これを解決するためには、バックエンド側でCORSを許可する設定を行います。

Node.jsのExpressを使った場合のCORS設定例:

```javascript
const cors = require('cors');
app.use(cors());  // CORSを許可する
```
これにより、異なるドメインからのリクエストを許可することができます。

4. データの送信（POSTリクエスト）
次に、フロントエンドからデータをバックエンドに送信する例を見てみましょう。fetch APIを使って、ユーザー情報をサーバーにPOSTリクエストで送信します。

```jsx
// データの送信 (POSTリクエスト)
function handleSubmit() {
  const newUser = { name: 'Charlie' };

  fetch('http://localhost:3000/api/users', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(newUser)
  })
  .then(response => response.json())
  .then(data => {
    console.log('User added:', data);
  });
}
```

バックエンド側ではPOSTリクエストを受け取るために、次のように処理します。

```javascript
// POSTリクエストの処理
app.post('/api/users', (req, res) => {
  const newUser = req.body;
  // データベースに保存するロジック（今回は簡略化）
  console.log('New user:', newUser);
  res.status(201).json(newUser);
});
```

まとめ
フロントエンドとバックエンドを結合するプロセスは、以下のステップで行います：

バックエンドでAPIを構築: データを取得したり送信したりするエンドポイントを提供します。
フロントエンドからAPIを呼び出す: fetch や axios を使って、バックエンドと通信します。
CORSの問題に対処: 異なるドメイン間で通信を許可するため、CORS設定を行います。
POSTリクエストでデータを送信: フォームデータなどをバックエンドに送信し、データベースに保存したり、処理したりします。

今回はフロントエンドとバックエンドを結合する方法について記事にしました。
初心者のころどのようになっているのかよくわからなく、同じような気持ちの人や復習したい方たちに読んでいただけたら嬉しいです。
ABC375回答メモ

# 0.はじめに
　3連休ですが、仕事的に昼夜関係なく木曜日辺りから
　火曜日かそれ以降まで断続的に業務が続いている合間での参戦。
　そんな中なのに難易度が高く、ABしか回答できませんでした。
　CD辺りを復習したいところですが時間がとれなさそうなのでまたいつか・・・。


# 1.A - Seats
　Aからちょっと複雑な問題。
　文字列の3文字目から最後の文字までチェックをループ。
　チェック対象文字が#で1文字前が.2文字前が#の場合に
　回答用変数ansに1を加算していき最後にansを出力して終了。
　3文字目からのループとすることで、2文字以下の時はループを始まらない
　ようにしたのが工夫ポイントでした。

　https://atcoder.jp/contests/abc375/submissions/58673879


# 2.B - Traveling Takahashi Problem
　B問題にしては難しい問題。まぁもうこのレベルまで難易度が上がっただけかもですが。
　とはいっても、距離を求める公式までかいてるので後は単純に
　前の点からの距離を求めて足していくだけ。
　最後に原点に戻ると言うのを読み漏らして例題を試した際に気づきました。

　https://atcoder.jp/contests/abc375/submissions/58680797


以上
vbsの作法 その85

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

# 練習問題
IE11のユーザーエージェントを取得せよ。

# サンプルコード

```
Dim objIE
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Width = 500
objIE.Height = 400
objIE.Visible = True
objIE.Navigate "about:blank"
set ow = objIE.Document.parentWindow
WScript.Echo ow.navigator.userAgent
objIE.Quit
Set objIE = Nothing


```

# 実行結果

```

Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; Tablet PC 2.0; rv:11.0) like Gecko

```

以上
Dockerで使用したコマンド

# 概要

自分がDockerで使用したコマンドをまとめました。

# イメージ一覧

ホスト上にあるイメージ一覧の取得

```sh
$ sudo docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
ubuntu        latest    61b2756d6fa9   3 weeks ago     78.1MB
hello-world   latest    d2c94e258dcb   17 months ago   13.3kB
```

# イメージの起動

```sh
$ sudo docker run -t -i ubuntu /bin/bash
root@4f6aa85e5f27:/# 
```

# イメージの取得

サンプルとして以下のページのイメージの取得を行いました。

https://hub.docker.com/_/node

```sh
sudo docker pull node
```

イメージ一覧を表示して、取得できたことを確認しました。
8Bitや16Bitの開発環境

FreeBSDでクロスの開発環境を作っています。ビルドした実行バイナリは下記のような方法で実機にもっていっています。

![TeraMach.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/69688867-f7a6-09b7-b55a-c863b4278eea.png)

PC-8001のマシン語の実行ファイルはzmac,ld80でhexを作りihex2monlでCMTファイルにしてUSBメモリに書き込んでPC-8001にロードして実行します。zmac,ld80はBSD MakeでビルドできCP/M上のMACRO-80の仕様に一番近いと思います。

zmacはbisonをインストールして以下のようにしてビルドします。

```
% make CC=cc CXX=c++ YACC="bison -y"
```

ld80はMakefileにg++の直書きがあるので、それを修正してビルドします。

FreeDOSやPC-9801はOpenWatcomのLinuxバイナリをFreeBSDのエミュレーションで実行してバイナリを作っています。

クロス開発の環境が簡単に作れる現在ではセルフで開発するのはナンセンスだと思います。いろいろ覚えられないので、環境が一つに集約できる事はとても助かります。

AptivaとPC-9801FA2では3.5inc(2DD)フロッピーが使えるので、これで転送することもできます。

ユーザ権限でUSBメモリをmtoolsでアクセスできるようにするためdevdの設定します。

```
notify 100 {
    match "system" "GEOM";
    match "subsystem" "DEV";
    match "type" "CREATE";
    match "cdev" "da[0-9]+[ps][0-9]+";
    action "chmod 0666 '/dev/'$cdev";
};
notify 101 {
    match "system" "GEOM";
    match "subsystem" "DEV";
    match "type" "CREATE";
    match "cdev" "da[0-9]";
    action "chmod 0666 '/dev/'$cdev";
};
```

一つで書けそうですが、よくわかりません。

USBメモリはda0s1でフロッピーはda0になるようです。
Fedora 40にDockerをインストールを行い起動までの記録

# 概要

https://matsuand.github.io/docs.docker.jp.onthefly/engine/install/fedora/

上記サイトにインストール方法が載っていますが、実際に入力したコマンドをまとめました。

# 既存のバージョン確認と削除

```sh
sudo dnf remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine
```

実行後、dockerがインストールされていた場合は削除を実行し、インストールされていない場合にはnでコマンド実行を抜けました。

# インストール

公式サイトでは、以下の3通りが紹介されていました。

* リポジトリを利用したインストール
* パッケージを利用したインストール
* 便利スクリプトを利用したインストール

このなかでリポジトリを利用したインストールを行いました。

## リポジトリを利用したインストール

### リポジトリのセットアップ

```sh
sudo dnf -y install dnf-plugins-core
sudo dnf config-manager \
    --add-repo \
    https://download.docker.com/linux/fedora/docker-ce.repo
```

公式では最新版(nightly)やテスト版(test)のリポジトリ有効化の手順もありました。

### Docker Engine インストール

```sh
sudo dnf install docker-ce docker-ce-cli containerd.io docker-compose-plugin
```

# Docker起動

```sh
sudo systemctl start docker
```
Looker Studioでデータを削除したい

# はじめに
こんにちは、ユーゴです。今回は、LookerStudioとBigQueryを接続していた時に、調べてもなかなか出てこなかった情報を載せておきます。

# 対象読者
LookerStudioほぼ初心者の方。
非エンジニア〜エンジニアまで。

# 問題
LookerStudioで、BigQueryのデータを消したいが、やり方が分からない。

# 解決策
画面上部のメニューバーから、「リソース > 追加済みのデータソースの管理」を選択

![データ削除01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/4e02fd96-d357-8766-7ed5-45c391aac11d.png)

削除したいデータの「削除」ボタンを押す。

![データ削除02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/6ce738d3-50c9-53a7-af25-208cac79930b.png)

# まとめ
いかがだったでしょうか。今回は、LookerStudioとBigQueryを接続していた時に遭遇した問題を紹介しました。私自身がLookerStudio初心者だったためか、全く調べても出てこず、苦戦しました。

このように、LookerStudioの使い方から、Unity, AWS, GAS, 量子コンピューティングなど、様々な情報を取り扱っていきます。お役に立てましたら、いいね, フォローなどよろしくお願いします！