OmniAICreator/Qiita-1.07M huggingface dataset:
Sentryの「Profiling」機能の特徴5選

Sentryの「Profiling」機能は、コードのパフォーマンスを詳細に追跡し、パフォーマンスのボトルネックや改善点を特定するための機能です。以下が主な特徴です。

### 1. 関数単位のパフォーマンス測定

Profiling機能では、アプリケーション内でどの関数がどれだけのリソース（CPUやメモリなど）を使用しているかを測定し、リクエスト処理中のボトルネックを可視化します。特定の関数やコードのブロックがどれほど時間を消費しているかがわかり、最適化の対象を明確にできます。

### 2. 自動的なデータ収集

Profiling機能はアプリケーションの動作中にバックグラウンドで自動的にデータを収集するため、開発者がパフォーマンスの情報を手動で追加する必要がありません。データは特定のリクエストやトランザクションと結びつけられて保存されるため、個別のプロファイリングデータがわかりやすく関連付けられます。

### 3. パフォーマンスボトルネックの特定

収集されたプロファイリングデータはSentryのUIで可視化され、遅延が発生している箇所や高リソースを消費している箇所を一目で確認できます。たとえば、フレームグラフやツリービューで処理の詳細を追跡できるため、パフォーマンス改善の優先度を決めやすくなります。

### 4. 統合されたエラーとパフォーマンスデータ

Profilingは、他のエラー情報やトランザクションのパフォーマンスデータと統合されています。これにより、エラーや遅延が発生したコンテキストの詳細がわかり、パフォーマンス問題の根本原因を突き止めるのに役立ちます。

### 5. サンプリング設定による柔軟なプロファイリング

Profiling機能はサンプリング設定をサポートしており、すべてのトランザクションをプロファイルせず、特定のトランザクションのみを対象にプロファイリングすることでリソースの節約が可能です。これにより、運用環境でのパフォーマンス負荷を最小限に抑えつつ重要なデータを収集できます。

### 6. サポートする言語や環境

SentryのProfiling機能は、Node.js、Python、Ruby、JavaScriptなど、幅広いプログラミング言語とフレームワークでサポートされています。これにより、様々なアプリケーション環境におけるパフォーマンスの一貫したモニタリングが可能です。

Profiling機能を活用することで、Sentryはアプリケーション全体のパフォーマンス問題の根本原因を発見し、パフォーマンスの最適化に必要な洞察を提供します。
[Minecraft]人並みにPluginが書けるようになって...。

開発を初めて早１年。それなりにコードも書けるようになってきて初めての人に教えることも増えてきました。
教えていて思ったこと、これまで自分がどうしてきたかをちょっとまとめようと思います。
## Step1　環境を整える
環境を整えると一言で言っても色々やることがあります。
 - IDE(総合開発環境)の設定
 - MinecraftJava版の取得
 - ローカルサーバーを立てる
### IDE（総合開発環境）の設定
Pluginのレッスンのとき、大体出てくるIDEの設定。色々ソフトはありますが著者は**IntelliJ Idea**を使ってます。学生ならUltimate版が無料で使えるのでとてもおすすめ。
導入方法は色んな人が書いてくれてるはずなのでそっちを見てください。
### MinecraftJava版の取得
まあ要するにJava版のマイクラを買ってください。じゃないとテストもほとんどできないので話になりません。
### ローカルサーバーを立てる
意外と書かれてないことが多いですが意外と重要。
Plugin書いても実際動かすサーバーがなきゃ意味がないですからね。ローカルならポートも開けなくていいのでセキュリティ的にも安心。
立て方も色んな人が書いてますからぜひ見てみてください。
## Step2　基本を叩き込む
Java言語を使うのでJavaの基礎がないと全く書けません。（Kotlinなら両方してもいいかも。）
ただ、Javaライブラリを使うことはあんまりないのでクラス、メソッドの概念などそういったことを学べば大丈夫だと思います。（特にインスタンス化など）
## Step3　後はとにかく書く
ここがまあまあ肝の部分で、実際書くとわかりますがJavaの初心者レッスン！みたいなので書いたことはほとんどでてきません。書き方は似てるんですけど...。
Pluginは独自のクラスが存在しますから、実際に書かないと感覚が掴めないと思います。
基本の書き方(forやswitchなど)がわかったら簡単なコードをひたすら書きましょう。
どれがどんな動きをしているか実際に体験することが大切です。
## Step4　わからない時は...？
もちろん、書いていくとわからないことが出てくるはずです。メソッドの引数がわからない時などは[Spigot API](https://hub.spigotmc.org/javadocs/spigot/index.html?overview-summary.html)を見ましょう。
SpigotAPIを見る際、バージョンに注意してください。自分が開発しているバージョンのものを見るようにしましょう。
もう１つ、AIに頼る方法もあります。半分おすすめです。
コードを書かせるとバケモンみたいなコードを書くことが時々あるので書かせるのには向いてないかもしれませんが、エラーの解読や簡単なコードであれば参考になる部分があります。丸写しはまじでやめておきましょう。
あとはネットの記事を参考にすることです、かなり古くて使えないことがありますが、こういう感じなんだという雰囲気はつかめるはずです。
GitHubなどで実際にどう書かれているか見てみるのも１つなのではないでしょうか。
## Step?　そういえば大切なこと
開発においてモチベーションはとても大事です。初めての人は**自分の作ってみたいもの**を想像して作りましょう。
モチベが無い時は想像を膨らましてみることだけでもとても大切です。

## 最後に
PluginはJava,Kotlin,その他ツールを使えば他の言語でもかけるそうです。
メインはJava,Kotlinにはなりますが...。
とにかくチャレンジする精神があれば作れるはずです。エラーが出ても、めげずにコードを直してみる。
私もまだまだ半人前ですが、地道な努力を続けていこうと思います。
他にもこういうこと大切だというのがあればコメントなどください。もしかしたら追記します。
C++のsingletonクラスをC言語から呼び出す

# 手順

## 概要
`sampleclass` をシングルトンとして実装し、C 言語から呼び出せるようにラッパーを提供する。

## 手順

### 1. `sampleclass.hpp` の作成
- シングルトンのクラス `sampleclass` を定義します。
- プライベートコンストラクタを使用し、コピーコンストラクタと代入演算子を削除してシングルトンを実現します。

### 2. `sampleclass.cpp` の作成
- `sampleclass` の実装を記述します。
- インスタンスは静的メンバ変数として確保します。
- `getInstance()` メソッドでインスタンスを返します。

### 3. `c_interface_wrapper.cpp` と `c_interface_wrapper.h`の作成
- `extern "C"` ブロック内に C 言語から呼び出せる関数を定義します。
- シングルトンインスタンスを `getInstance()` で取得してメソッドを呼び出すようにします。

### 4. `main.c` の作成
- C 言語から `sampleclass` のメソッドを呼び出すコードを記述します。
- `#ifdef __cplusplus` ディレクティブで C++ と C のコンパイルを可能にします。

## ファイル構成
- `sampleclass.hpp`: クラス定義
- `sampleclass.cpp`: クラス実装
- `c_interface_wrapper.cpp`: C 言語インタフェースラッパー
- `c_interface_wrapper.h`: C 言語インタフェースラッパー(ヘッダ)
- `main.c`: C 言語からの呼び出し例



## sampleclass.hpp
サンプルとなるシングルトンなクラス(ヘッダ)
```cpp
#ifndef SAMPLECLASS_H
#define SAMPLECLASS_H

class sampleclass {
public:
    static sampleclass* getInstance();
    void procA(void);
    void porcX(int val);

private:
    sampleclass() = default; // コンストラクタをプライベートにしてシングルトンを実現
    sampleclass(const sampleclass&) = delete; // コピーコンストラクタの削除
    sampleclass& operator=(const sampleclass&) = delete; // 代入演算子の削除
    static sampleclass instance;
};

#endif
```

## sampleclass.cpp
サンプルとなるシングルトンなクラス(本体)

```cpp
#include "sampleclass.hpp"

sampleclass sampleclass::instance;

sampleclass* sampleclass::getInstance() {
    return &instance;
}
void sampleclass::procA(void) {
}
void sampleclass::porcX(int val) {
}
```

## c_interface_wrapper.cpp
クラスをC言語から呼び出すためにエクスポートする
```cpp
#include "sampleclass.hpp"

extern "C" {

    // C インタフェース関数
    void sampleclass_procA() {
        sampleclass::getInstance()->procA();
    }

    void sampleclass_procX(int val) {
        sampleclass::getInstance()->porcX(val);
    }

}
```

## c_interface_wrapper.h
クラスをC言語から呼び出すためにエクスポートするためのヘッダ
```cpp
#ifndef WRAPPER_DEF_H
#define WRAPPER_DEF_H

#ifdef __cplusplus
extern "C" {
#endif

	void sampleclass_procA();
	void sampleclass_procX(int val);

#ifdef __cplusplus
}
#endif

#endif
```

## main.c

```cpp
#include "wrapper_def.h"

int main() {
    sampleclass_procA();
    sampleclass_procX(42);
    return 0;
}
```
[プログラミング言語評論]　Schemeが完全なプログラミング言語です。

手続き型、関数型、オブジェクト指向型、色々とプログラミング言語は、制御構造とデータ構造が開発され、これからも進歩していきますが、手続き型、関数型、オブジェクト指向型の完成形の一つの形はSchemeです。自分自身やプログラムをデータとして扱えます。

これからの、先鋭的なデータ構造・制御構造を持つ言語は、他にあると思いますが、システム処理でなければ、Schemeで書けるので、良いと思います。欠点を挙げるとすれば、Lisp系統なので、書きにくい、可読性が低い事でしょう。さらに、Schemeで書けない処理は、「パフォーマンスが厳しく要求される処理」、「並行処理を多用する処理」、「大規模なソフトウェア開発」です。

Schemeは、ネイティブコードを出力するコンパイラ（gambitなど）もあるし、オブジェクト指向をサポートしています。手続き型、関数型、オブジェクト指向型の構造化言語の一つの完成形は、Schemeでしょう。
Schemeがあるのに普通に書ける完全なプログラミング言語がないと言うのはおかしいです。あるはず。

今まで調べた時点で、一番良さそうなプログラミング言語はrustです。
ネイティブコードを出力するし、静的型付けで、システムプログラミングもOK、手続き型、関数型、オブジェクト指向型の構造化言語ですが、自分自身やプログラムをデータとして扱えません。メタプログラミングができれば、Rustがベストですが、今の所、普通に書けるプログラミング言語の完成型はないようです。Pythonの改良型が出来たら一番いいです。
React学習して5ヵ月経った ~3つ目のアプリ作りました~

## はじめに
現在エンジニア3年目に突入しました。
Reactの勉強を6月から行なっており、学習の記録として記事を書いています。

## 5ヶ月の間にやったこと
Udemyを2本受講しReactの基本的な構文を学ぶ
学習管理アプリを作成(TODOアプリ)し、アプリのデプロイまでやってみる

こうやってみてみると全然量をこなせてないですね、、
副業もやっているとはいえ、半年経つころには個人学習でなく本格的にサービスを作っている目標設定でした。
時間の確保は相変わらず課題です。

## 先月やったこと
名刺アプリを作成しました。
名刺作成機能、検索＆閲覧機能、バッチによるデータベース削除機能が主な機能です。
![ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810842/24e8622a-73b9-409c-63b2-8ac7c31033a4.gif)

### 技術スタック
・React
・TypeScript
・Supabase(データベース)
・Firebase(デプロイ)
ライブラリは以下を使用しました
・Chakra-UI(CSS)
・React Hook Form(バリデーション)
・react-router-dom(ルーティング)

### 成長したこと
**公式ドキュメントから調べる力がつきました**
業務ではつよつよエンジニアがサクッと問題解決してなるほど。と思って終わってしまうことが多いですが、個人開発ではゆっくり調べる時間があります。
身の回りの強いエンジニアは公式ドキュメントを読んで体系的に理解しているし、自分もその習慣が少しずつ付き始めたと思っています。

**学習の習慣が身についた**
時間がなくても毎日最低何かコードを書きました。
(旅行や休むと決めた日はやりませんが)
アプリ作成をかなり細かい粒度でやることを分割していたのが学習を継続できた要因だと思います。

前の私はいきなりアプリを作る！と意気込み、やることが大きくどこから手を付ければ良いか分からずいつの間にかモチベーションが消えていく。という勉強のサイクルでした。
やることを細かく分割すると、時間がなくてもここまではやろうと思えて毎日学習を行えました。

**Reactに慣れてきた**
Jestでのテストも行なっているのですが、画面レンダリングのタイミングを理解していないせいでテスト落ちてしまいました。
公式ドキュメントを読んだりデバッグを繰り返しているうちに少しずつReactがどう動いているか理解し、エラーの解消の時間も短くなってきました。

## 最後に
次は自分でサービスを考えてアプリを作っていきます。
次の6ヶ月目はスピード感持って学習していきたいです。
年内のリリースを目指します！

最後まで読んでくださってありがとうございました。

# JISOUのメンバー募集中
プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
気になる方はぜひHPからお願いします:下向き指差し:
https://projisou.jp
正規表現（Regex）について

# 正規表現（Regex）について

正規表現（Regular Expressions、略してRegex）は、文字列のパターンを指定して検索や置換を行うための強力なツールだ。プログラミングやテキスト処理で広く使われ、VSCodeや`grep`などのツールでもよく使用される。

## 基本構文

正規表現は、特定の文字列や文字列パターンを効率的に検索するための方法を提供する。ここでは、よく使われる正規表現パターンを紹介する。

### 特殊文字

- **`.`**: 任意の1文字に一致する。
- **`^`**: 行の先頭に一致する。
- **`$`**: 行の末尾に一致する。
- **`*`**: 直前の文字が0回以上繰り返されることに一致する。
- **`+`**: 直前の文字が1回以上繰り返されることに一致する。
- **`?`**: 直前の文字が0回または1回の出現に一致する。
- **`[]`**: 文字クラスを定義する（例: `[a-z]`は小文字のアルファベットに一致）。
- **`|`**: 論理ORを表す（例: `cat|dog`は`cat`または`dog`に一致）。
- **`()`**: グループ化して、1つの単位として扱う。

### エスケープ文字

正規表現の特殊文字を文字通りに検索する場合は、`\`（バックスラッシュ）でエスケープする必要がある。

- **例**: `\.` は実際のピリオドに一致する。

## Visual Studio Codeでの使用

VSCodeでは、検索と置換の際に正規表現を使うことができる。検索バーで正規表現を有効にするには、検索ウィンドウの`.*`アイコンをクリックする。

### VSCodeの基本的な例

1. **任意の文字に一致する**
   - 検索: `he..o`
   - 一致する例: `hello`, `heazo`

2. **特定のパターンを検索**
   - 検索: `^TODO:`
   - 一致する例: 行の先頭が`TODO:`で始まるテキスト。

3. **数字を含む行を検索**
   - 検索: `\d+`
   - 一致する例: `123`, `4567`

4. **特定の単語の複数形を検索**
   - 検索: `cat(s|)`
   - 一致する例: `cat`, `cats`

5. **複数行にわたる検索**
   - 検索: `foo.*bar`（`.*`は改行を除く任意の文字に一致）
   - **注意**: 複数行にまたがる検索はVSCodeでは少し制限があるので、工夫が必要。

### VSCodeでの置換例

1. **日付フォーマットの置換**
   - 検索: `(\d{4})-(\d{2})-(\d{2})`
   - 置換: `$3/$2/$1`
   - **結果**: `2024-11-13` が `13/11/2024` に置換される。

## grepコマンドでの使用

`grep`コマンドでも正規表現を使った検索が可能だ。基本的な構文は次の通り。

```bash
grep "正規表現" ファイル名
```

### grepの基本的な例

1. **行の先頭に一致するパターンを検索**
   ```bash
   grep "^start" file.txt
   ```
   - `"start"`で始まる行を検索する。

2. **行の末尾に一致するパターンを検索**
   ```bash
   grep "end$" file.txt
   ```
   - `"end"`で終わる行を検索する。

3. **任意の文字列を検索**
   ```bash
   grep "h.t" file.txt
   ```
   - `h`と`t`の間に任意の1文字がある文字列（例: `hat`, `hot`）を検索する。

4. **数字を含む行を検索**
   ```bash
   grep "[0-9]" file.txt
   ```
   - 数字を含む行を検索する。

### grepでのエスケープ

特殊文字を検索する場合は、`\`でエスケープする。

```bash
grep "\." file.txt
```

- ピリオドそのものを検索する。

## 実用例

1. **複数のファイルからエラーを検索**
   ```bash
   grep "error" *.log
   ```
   - すべての`.log`ファイルから`"error"`を検索する。

2. **大文字と小文字を区別せずに検索**
   ```bash
   grep -i "warning" system.log
   ```
   - 大文字小文字を無視して`"warning"`を検索する。

3. **正規表現を使って特定のパターンを検索**
   ```bash
   grep -E "user_(one|two)" file.txt
   ```
   - `user_one`または`user_two`に一致する行を検索する（`-E`は拡張正規表現を使用するオプション）。

## まとめ

- **正規表現の基本**: 検索パターンを指定する強力なツールで、VSCodeや`grep`で活用できる。
- **VSCodeの検索と置換**: `.*`アイコンで正規表現を有効にし、柔軟な検索や置換が可能。
- **grepでの検索**: ログ解析や特定のパターンの抽出に便利。
grepコマンドについて

# grepコマンドについて

`grep`コマンドは、ファイルや出力の中から特定の文字列を検索するための強力なツールだ。LinuxやUNIX系システムで頻繁に使われ、ログファイルの解析やデータの抽出に役立つ。

## 基本構文

```bash
grep [オプション] 検索パターン [ファイル名]
```

- **検索パターン**: 検索したい文字列を指定する。
- **ファイル名**: 検索対象のファイルを指定する。ファイル名を省略すると標準入力から検索する。

### 例

```bash
grep "error" /var/log/syslog
```

このコマンドは、`/var/log/syslog`ファイルの中から`"error"`という文字列を含む行を表示する。

## よく使うオプション

### 1. `-i`（大文字と小文字を区別しない）

大文字と小文字を区別せずに検索する。

```bash
grep -i "error" /var/log/syslog
```

- `"Error"`や`"ERROR"`も一致する。

### 2. `-r`または`-R`（再帰的検索）

指定したディレクトリ内のすべてのファイルを再帰的に検索する。

```bash
grep -r "TODO" /path/to/project
```

- ディレクトリ内の全ファイルから`"TODO"`を検索する。

### 3. `-v`（一致しない行を表示）

指定したパターンに一致しない行を表示する。

```bash
grep -v "debug" log.txt
```

- `"debug"`という文字列を含まない行を表示する。

### 4. `-n`（行番号を表示）

検索結果に行番号を付けて表示する。

```bash
grep -n "fail" /var/log/auth.log
```

- `"fail"`が含まれる行の行番号も一緒に表示する。

### 5. `-c`（一致する行数を表示）

パターンに一致する行の数だけを表示する。

```bash
grep -c "root" /etc/passwd
```

- `"/etc/passwd"`内で`"root"`が出現する行数を表示する。

### 6. `-l`（一致するファイル名のみ表示）

パターンに一致する行があるファイルの名前を表示する。

```bash
grep -l "main" *.c
```

- `*.c`ファイルの中で`"main"`が含まれるファイル名を表示する。

## 前後の行を表示するオプション

`grep`には、検索結果の前後の行も一緒に表示する便利なオプションがある。ログファイルの解析などに役立つ。

### 1. `-A`（After）

検索パターンに一致した行の**後の行**を指定した数だけ表示する。

```bash
grep -A 3 "error" log.txt
```

- `"error"`が含まれる行と、その後の3行を表示する。

### 2. `-B`（Before）

検索パターンに一致した行の**前の行**を指定した数だけ表示する。

```bash
grep -B 2 "warning" log.txt
```

- `"warning"`が含まれる行と、その前の2行を表示する。

### 3. `-C`（Context）

検索パターンに一致した行の**前後の行**を指定した数だけ表示する。

```bash
grep -C 4 "fail" log.txt
```

- `"fail"`が含まれる行と、その前後4行を表示する。

## パイプとの組み合わせ

`grep`はパイプと組み合わせて使うことで、他のコマンドの出力から特定の文字列を抽出することができる。

### 例

```bash
ps aux | grep "nginx"
```

- 実行中のすべてのプロセスの中から、`"nginx"`を含む行を抽出する。

## 正規表現を使った検索

`grep`は正規表現を使って、より柔軟な検索を行うこともできる。

### 例

```bash
grep "^root" /etc/passwd
```

- `"^root"`: 行の先頭が`"root"`で始まる行を検索する。

```bash
grep "[0-9]\{3\}" file.txt
```

- `"[0-9]\{3\}"`: 3桁の数字を含む行を検索する。

## 実用例

1. **ファイル内のエラーメッセージを検索**
   ```bash
   grep "error" application.log
   ```

2. **複数のファイルから特定の文字列を検索**
   ```bash
   grep "user" file1.txt file2.txt
   ```

3. **大文字小文字を区別せずに検索**
   ```bash
   grep -i "warning" /var/log/messages
   ```

4. **検索結果の前後の行を表示**
   ```bash
   grep -C 2 "critical" system.log
   ```

## grepコマンドの応用

`grep`は、特定の情報をすばやく見つけるために多くの場面で役立つ。システム管理者がログを解析する際や、プログラマーがソースコード内の特定の記述を探す際などに広く使われている。

## まとめ

- **基本的な使い方**: `grep "パターン" ファイル名`
- **よく使うオプション**:
  - `-i`: 大文字小文字を区別しない
  - `-r`: 再帰的に検索
  - `-v`: 一致しない行を表示
  - `-n`: 行番号を表示
  - `-c`: 一致する行数を表示
  - `-l`: 一致するファイル名を表示
  - `-A`: 後の行を表示
  - `-B`: 前の行を表示
  - `-C`: 前後の行を表示
- **パイプとの組み合わせ**: 他のコマンドの出力から文字列を検索するのに便利。
パスの表現について

# パスの表現について

LinuxやUNIX系システムでファイルやディレクトリを指定する際には、パスの表現を理解することが重要だ。パスの種類には、絶対パスと相対パスがあり、いくつかの記号が使われる。ここでは、エンジニア初心者が知っておくべきパスの基本を解説する。

## ルートディレクトリとは？

ルートディレクトリは、ファイルシステムの最上位にあるディレクトリで、すべてのファイルやディレクトリはここから始まる。ルートディレクトリは`/`で表される。

#### 例

```bash
/var/log/syslog
```

- **`/`**: ルートディレクトリを示しており、ここからすべてのパスが派生する。

## ホームディレクトリとは？

ホームディレクトリは、各ユーザーに割り当てられた作業用のディレクトリだ。ユーザーがログインしたときに最初にアクセスする場所であり、ユーザーの個人ファイルや設定が保存される。`~`（チルダ）で表される。

#### 例

```bash
~/documents/file.txt
```

- **`~`**: 現在のユーザーのホームディレクトリを指す（例えば、`/home/username`）。

## 絶対パスと相対パス

### 絶対パス

ファイルシステムのルート（`/`）から始まるパスを絶対パスと呼ぶ。常にシステム全体から見た位置を指定する。

#### 例

```bash
/home/user/documents/file.txt
/var/www/html/index.php
```

- **`/home/user/documents/file.txt`**: ルートディレクトリから始まる完全なパス。

### 相対パス

現在のディレクトリを基準にして指定するパスを相対パスと呼ぶ。絶対パスより短くて書きやすいが、実行する場所によって意味が変わる。

#### 例

```bash
./file.txt
../documents/file.txt
```

- **`./file.txt`**: 現在のディレクトリにある`file.txt`を指す。
- **`../documents/file.txt`**: 現在のディレクトリの一つ上のディレクトリにある`documents/file.txt`を指す。

## パスの表現に使う記号

### `~`（チルダ）

ホームディレクトリを表す記号。ユーザーのホームディレクトリのパスを簡単に指定できる。

#### 例

```bash
~/documents/file.txt
```

- **`~/documents/file.txt`**: 自分のホームディレクトリの`documents`フォルダ内の`file.txt`を指す。

### `.`（ドット）

現在のディレクトリを指す記号。相対パスでよく使われる。

#### 例

```bash
./script.sh
```

- **`./script.sh`**: 現在のディレクトリにある`script.sh`を指す。

### `..`（ドットドット）

一つ上のディレクトリを指す記号。相対パスでディレクトリを移動するときに使う。

#### 例

```bash
../config/settings.json
```

- **`../config/settings.json`**: 現在のディレクトリの一つ上にある`config`フォルダ内の`settings.json`を指す。

### `/`（スラッシュ）

ディレクトリの区切りに使われる記号。また、ルートディレクトリを指す場合にも使われる。

#### 例

```bash
/var/log/syslog
```

- **`/var/log/syslog`**: ルートディレクトリから始まる絶対パス。

## 実用例

1. **ホームディレクトリに移動**
   ```bash
   cd ~
   ```

2. **現在のディレクトリにあるスクリプトを実行**
   ```bash
   ./run.sh
   ```

3. **一つ上のディレクトリに移動**
   ```bash
   cd ..
   ```

## よくある誤解

- **`/`と`./`の違い**: `/`はルートディレクトリを指す絶対パスの始まりだが、`./`は現在のディレクトリを指す相対パスの一部だ。
- **`~`は自分のホームディレクトリのみ**: 他のユーザーのホームディレクトリを指定する場合は`~username`のように書く必要がある（例: `~john/documents`）。

## まとめ

- **ルートディレクトリ**: システム全体の最上位ディレクトリで、`/`で表される。
- **ホームディレクトリ**: 各ユーザーの作業用ディレクトリで、`~`で表される。
- **絶対パス**: ルートディレクトリからの完全なパスを指定する。
- **相対パス**: 現在のディレクトリを基準にしてパスを指定する。
- **特殊記号**:
  - `~`: ホームディレクトリ
  - `.`: 現在のディレクトリ
  - `..`: 一つ上のディレクトリ
  - `/`: ディレクトリの区切りやルートディレクトリ
SSHでサーバに接続する方法

# SSHでサーバに接続する方法

SSH（Secure Shell）は、安全にサーバにリモート接続するためのプロトコルだ。サーバの管理やファイル転送に使用され、セキュリティが確保された環境で操作が行える。

## 基本的なSSHコマンド

SSHでサーバに接続するには、次の基本コマンドを使用する。

```bash
ssh ユーザー名@ホスト名
```

- **ユーザー名**: サーバにログインするためのユーザー名。
- **ホスト名**: サーバのIPアドレスまたはドメイン名。

### 例

```bash
ssh root@192.168.1.1
```

このコマンドは、`192.168.1.1`というIPアドレスのサーバに、`root`ユーザーとして接続する。

## ポート番号を指定する

デフォルトではSSHはポート`22`を使用するが、カスタムポートを指定することもできる。

```bash
ssh -p ポート番号 ユーザー名@ホスト名
```

### 例

```bash
ssh -p 2222 user@example.com
```

このコマンドは、`example.com`にポート`2222`を使用して接続する。

## SSHキーを使った認証

パスワードの代わりにSSHキーを使って認証する方法もある。SSHキーは、公開鍵と秘密鍵のペアで構成されている。

### SSHキーの指定

```bash
ssh -i /path/to/private_key ユーザー名@ホスト名
```

- **-iオプション**: 使用する秘密鍵のファイルパスを指定する。

### 例

```bash
ssh -i ~/.ssh/id_rsa user@example.com
```

このコマンドは、`~/.ssh/id_rsa`に保存されている秘密鍵を使って、`example.com`に接続する。

## 接続オプションのカスタマイズ

SSHコマンドには、多くのオプションがあり、接続をカスタマイズできる。

### よく使うオプション

- **-C**: 通信を圧縮する。回線速度が遅いときに役立つ。
- **-L**: ローカルポートフォワーディングを設定する。
- **-R**: リモートポートフォワーディングを設定する。

### 例

```bash
ssh -C user@example.com
```

このコマンドは、`example.com`に接続し、データを圧縮して転送する。

## サーバに接続できない場合

SSHでサーバに接続できないときは、以下を確認しよう。

1. **ネットワーク接続**: サーバがインターネットに接続されているかを確認する。
2. **ポート設定**: SSHのポートが変更されていないか確認する（例: ファイアウォールの設定）。
3. **ユーザー名とパスワード**: 誤りがないか再確認する。

## SSH接続の終了

SSHセッションを終了するには、`exit`コマンドを入力するか、`Ctrl + D`を押す。

```bash
exit
```

これで接続が切れる。

## まとめ

- **基本コマンド**: `ssh ユーザー名@ホスト名`で接続する。
- **ポート指定**: `-p`オプションを使ってカスタムポートを指定できる。
- **SSHキー認証**: `-i`オプションを使って秘密鍵を指定する。
- **便利なオプション**: `-C`で通信圧縮、`-L`や`-R`でポートフォワーディングを設定できる。
Laravel Tinkerで特定のメソッドを実行する

# Laravel Tinkerで特定のメソッドを実行する

`Laravel Tinker`は、アプリケーション内で特定のメソッドを簡単に実行できる便利なツールだ。インスタンス化してメソッドを呼び出す方法や、引数を変数、連想配列、多次元配列で定義する方法を紹介する。

## Tinkerの起動

プロジェクトのディレクトリに移動して、以下のコマンドで`tinker`を起動する。

```bash
php artisan tinker
```

## クラスのインスタンス化とメソッド実行

クラスをインスタンス化し、メソッドを実行することで、データベース操作やロジックを試せる。

```php
// クラスのインスタンスを作成
$user = new App\Models\User();

// インスタンスメソッドを引数付きで実行
$user->calculateDiscount(100, 'VIP');
```

### 引数を変数や配列で定義してメソッドを実行

#### 1. 変数を使って引数を渡す

```php
// 変数で引数を定義
$amount = 150;
$category = 'Gold';

// メソッドを実行
$user->applyDiscount($amount, $category);
```

#### 2. 配列を使って複数の引数を渡す

```php
// 配列で引数を定義
$args = ['SUMMER2024', 30, 'VIP'];

// スプレッド演算子を使用してメソッドを実行
$user->applyCoupon(...$args);
```

### 連想配列を渡す場合

メソッドが連想配列（キーと値のペア）を引数として受け取る場合、連想配列を定義して渡すことができる。

```php
// 連想配列で引数を定義
$data = [
    'code' => 'WELCOME2024',
    'discount' => 20,
    'user_type' => 'Premium'
];

// メソッドを実行
$user->applyPromotion($data);
```

- `$data`: キーと値のペアで構成される連想配列。

### 多次元配列を渡す場合

多次元配列を渡す場合も、配列を定義してメソッドに渡すことが可能だ。

```php
// 多次元配列で引数を定義
$complexData = [
    'user' => [
        'id' => 1,
        'name' => 'John Doe'
    ],
    'orders' => [
        ['order_id' => 101, 'amount' => 50],
        ['order_id' => 102, 'amount' => 75]
    ]
];

// メソッドを実行
$user->processOrder($complexData);
```

- `$complexData`: 多次元配列で構成され、ネストされたデータをメソッドに渡す例。

## 静的メソッドの実行

静的メソッドは、インスタンス化せずにそのまま呼び出せる。

```php
// 静的メソッドの実行
App\Services\DiscountService::calculateTotal(200, 15);
```

- `calculateTotal(200, 15)`: `DiscountService`クラスの静的メソッドを引数付きで実行する。

## リターン値の確認

Tinkerでは、メソッドのリターン値をその場で簡単に確認できる。

```php
$points = $user->getRewardPoints(5);
$points;
```

- `getRewardPoints(5)`: 引数`5`を渡してリワードポイントを取得するメソッドを実行する。

## Tinkerを終了する

`tinker`を終了するには、`exit`や`quit`を入力するか、`Ctrl + D`を押す。

```bash
exit
```

## まとめ

- **インスタンス化**: クラスのインスタンスを作成してメソッドを呼び出す方法。
- **配列の活用**: 変数、連想配列、多次元配列を使って柔軟に引数を定義し、メソッドに渡せる。
- **スプレッド演算子**: 配列を展開してメソッドに渡す場合に使用する。
Laravel Tinkerの使い方

# Laravel Tinkerの使い方

`Laravel Tinker`は、Laravelでインタラクティブにアプリケーションを操作できるREPL（対話型シェル）だ。データベースにアクセスしたり、Eloquentモデルを操作したり、特定のメソッドを試したりするのに便利。

## Tinkerを起動する

まずは、ターミナル（コマンドライン）を開いて、プロジェクトのディレクトリに移動し、以下のコマンドを実行する。

```bash
php artisan tinker
```

これで、Tinkerが起動し、Laravelアプリケーションの環境にアクセスできるようになる。

## 基本的な使い方

### 1. Eloquentモデルの使用例

データベースからレコードを取得したり、作成したりする際に便利だ。

```php
// すべてのユーザーを取得
App\Models\User::all();

// IDが1のユーザーを取得
$user = App\Models\User::find(1);
```

### 2. 特定のメソッドを実行する

Eloquentモデルやカスタムクラスのメソッドを試したい場合は、インスタンスを作成してメソッドを呼び出すことができる。

```php
// メソッドを実行する例
$user = App\Models\User::find(1);
$user->someMethod(); // someMethodを実行
```

### 3. 静的メソッドの実行

```php
// 静的メソッドを実行する例
App\Services\SomeService::someStaticMethod();
```

## ファサードを使用する

LaravelのファサードもTinker内で使用可能だ。

```php
// キャッシュをクリア
Cache::flush();
```

## Tinkerを終了する

`Tinker`を終了するには、`exit`または`quit`と入力するか、`Ctrl + D`を押す。

```bash
exit
```

## よくある使い方

- **デバッグ**: モデルやメソッドの動作確認に便利。
- **クエリのテスト**: クエリの結果をリアルタイムで確認できる。
- **開発中のサービスの実行**: 新しく作成したクラスやメソッドをすぐに試すことができる。
vimの基本コマンドまとめ

# vimの基本コマンドまとめ

`vim`は高機能なテキストエディタで、多くのプログラマーが愛用している。初心者にとっては覚えるべきコマンドが多いように感じるかもしれないが、まずは最低限のコマンドだけを覚えて使いこなせるようになろう。

## 基本モード

`vim`には3つの基本モードがある。

1. **通常モード**: `vim`を開いたときのデフォルトのモード。ファイルの編集、移動、削除などのコマンドを実行できる。
2. **挿入モード**: テキストを入力できるモード。通常モードで`i`を押すと挿入モードに入る。
3. **コマンドモード**: ファイルの保存や終了などのコマンドを入力するモード。通常モードで`:`を押すとコマンドモードに入る。

## よく使うコマンド

### 1. ファイルの開き方と終了方法

- **ファイルを開く**: `vim ファイル名`
- **保存して終了**: `:wq`（コマンドモード）
- **終了（保存せずに）**: `:q!`（コマンドモード）

### 2. 挿入モードへの切り替え

- **挿入モードに入る**: `i`（カーソルの前に挿入）
- **挿入モードを終了**: `Esc`キーで通常モードに戻る

### 3. 移動コマンド

- **h, j, k, l**: 左（h）、下（j）、上（k）、右（l）に移動する
- **0**: 行の先頭に移動
- **$**: 行の末尾に移動
- **gg**: ファイルの先頭に移動
- **G**: ファイルの末尾に移動

### 4. 削除・コピー・貼り付け

- **x**: カーソル位置の文字を削除
- **dd**: 現在の行を削除
- **yy**: 現在の行をコピー
- **p**: コピーした行を貼り付け

### 5. 検索と置換

- **文字列を検索**: `/文字列`（次の一致部分に移動するには`n`を押す）
- **文字列を置換**: `:％s/検索文字列/置換文字列/g`（ファイル全体で置換）
nohupと&について

# nohupと&について

Linuxでスクリプトやプログラムを実行するとき、`nohup`と`&`を使うことで、プログラムをバックグラウンドで動かし続けることができる。これは、リモート接続を切っても処理が止まらないようにする場合に役立つ。

## nohupとは？

`nohup`は「no hang up（ハングアップしない）」の略で、シェルを終了してもプログラムが実行し続けられるようにするためのコマンドだ。通常、シェルを終了すると実行中のプロセスも終了するが、`nohup`を使えば、ログアウトしてもプログラムは停止しない。

### 基本構文

```bash
nohup コマンド &
```

- `nohup コマンド`: プログラムがシェルの終了に影響されないように実行する。
- `&`: コマンドをバックグラウンドで実行するための記号。

## &（アンパサンド）とは？

`&`は、コマンドをバックグラウンドで実行するための記号だ。これを付けると、コマンドはバックグラウンドで動き続け、シェルがユーザーに戻ってくる。これにより、別のコマンドをすぐに実行することができる。

### 基本構文

```bash
コマンド &
```

## nohupと&の組み合わせ

`nohup`と`&`を組み合わせることで、シェルを閉じてもプログラムがバックグラウンドで実行され続けるようにすることができる。

### 例

```bash
nohup python script.py &
```

このコマンドは、`script.py`をバックグラウンドで実行し続け、シェルを閉じても処理が止まらないようにする。実行結果やエラーメッセージは、デフォルトで`nohup.out`というファイルに記録される。

## 実用例

- **長時間実行するスクリプトをリモートサーバーで動かす場合**: リモート接続を切ってもスクリプトが動き続けるようにする。
- **バッチ処理やバックアップ**: システム管理者が定期的に実行する処理に便利。

## 注意点

- 出力を明示的に指定しないと、`nohup`は標準出力とエラー出力を`nohup.out`ファイルに保存する。出力ファイルを指定したい場合は、リダイレクトを使うのがよい。
- 例: `nohup コマンド > output.log 2>&1 &`
psコマンドについて

# psコマンドについて

`ps`コマンドは、LinuxやUNIXシステムで現在実行中のプロセスを確認するために使用する。プロセスとは、稼働中のプログラムやスクリプトのことを指し、システムの状態を調査したり、特定のプロセスを管理する際に役立つ。

## 基本構文

`ps`コマンドの基本的な構文は以下の通り。

```
ps aux
```

- `a`: すべてのユーザーのプロセスを表示する。通常は、ログインしている自分のプロセスだけが表示されるが、このオプションを使うと他のユーザーのプロセスも含めて表示できる。
- `u`: ユーザーにとってわかりやすい形式でプロセスの詳細を表示する（例えば、プロセスの所有者やCPU使用率など）。
- `x`: 端末に関連付けられていないプロセスも表示する。バックグラウンドで実行されているデーモンなどが含まれる。

## 実用例

特定のプロセスを探したい場合は、`grep`コマンドと組み合わせて使う。

```
ps aux | grep php
```

このコマンドは、実行中のすべてのプロセスの中から「php」という文字列を含むプロセスだけを表示する。PHP関連のプロセスが正常に動作しているかどうかを確認する際に便利。
Sentryの設定項「traces_sampler」の役割

Sentryの設定項目「`traces_sampler`」は、トランザクションごとにサンプリング率を動的に決定するための機能です。この設定により、パフォーマンストレースのどの部分を収集・保存するかを、リクエストやコンテキストに応じて柔軟に調整できます。

### 主な役割と使用例

- **動的なサンプリング**: `traces_sampler` は関数を指定する形式で設定され、各トランザクションのサンプリング率を動的に設定します。例えば、特定のリクエストパスやユーザー属性に基づいて、トレースの収集頻度を変えられます。
- **効率的なデータ収集**: 大量のトランザクションを発生させるシステムであっても、`traces_sampler` により、重要なトランザクションのみを選んで収集し、データの保存コストを抑えつつ分析に役立つ情報を収集することができます。
- **サンプルのカスタマイズ**: `traces_sampler` に設定する関数では、トランザクションのメタデータ（例：ユーザー情報、リクエストパス、サービス名など）に基づいてサンプリング率を変更できるため、特定のエンドポイントや機能の詳細なパフォーマンスを追跡する際に役立ちます。

### 設定例

以下は、`traces_sampler` を使って特定のリクエストパスに基づいてサンプリング率を設定する例です。

```python
def traces_sampler(sampling_context):
    # 特定のパスの場合、サンプリング率を100%に設定
    if sampling_context["transaction_context"]["op"] == "http.server" and \
       sampling_context["transaction_context"]["description"].startswith("/important-path"):
        return 1.0  # 100%収集

    # その他のトランザクションは10%の確率で収集
    return 0.1

sentry_sdk.init(
    dsn="YOUR_SENTRY_DSN",
    traces_sampler=traces_sampler
)
```

この例では、特定のパス（例：`/important-path`）については100%の確率でトレースが収集され、それ以外のトランザクションは10%の確率で収集されます。
ハッシュを使いこなそう！配列との違いと強みを理解する

## はじめに
データ変換ツールを開発していると、データの管理や変換を効率的に行う方法が求められます。特に、複雑なデータ構造を扱う際、ハッシュは便利なツールとなり、必要なデータに素早くアクセスできるようになります。ここではそんなハッシュについて簡単にまとめてみました。

## ハッシュについて

ハッシュは、**キーと値のペア**でデータを管理するためのデータ構造です。配列のようにインデックス番号で要素にアクセスするのではなく、「キー」を使って値を取得する特徴があります。

例えば、次のようにユーザー情報をハッシュで管理できます。

```ruby
user = { name: "Taro", age: 25, city: "Tokyo" }
user[:name]  #=> "Taro"
```

上記の例では、`:name`, `:age`, `:city`がキーで、それぞれ"Taro", 25, "Tokyo"が値です。  
次に、配列と比較してハッシュの特長を見ていきましょう。

## 配列との違い

ハッシュと配列は、データを管理する方法に違いがあります。以下が主な相違点です。

- **配列**：順序が重要で、インデックス（0, 1, 2…）を使って要素にアクセスします。
- **ハッシュ**：順序は関係なく、キーと値のペアでデータを管理します。キーで直接値にアクセスできるため、インデックスを意識する必要がありません


配列の場合
```ruby
colors = ["red", "green", "blue"]
colors[1]  #=> "green"
```
ハッシュの場合
```ruby
person = { name: "Yuki", age: 22 }
person[:age]  #=> 22
```
配列は順序を保つ必要がある場面に向いていますが、ハッシュは情報を「キー」で管理するため、順序に依存しない場面で特に便利です。

## 基本的な使い方

ここでは、Rubyでハッシュを操作する基本的な方法を紹介します。

### ハッシュの作成と初期化

以下のように、ハッシュを `{}` で囲むことで簡単に作成できます。
```ruby
local_cuisines = { miyagi: 'ずんだ餅', iwate: 'わんこそば', fukushima: 'いかにんじん' }
local_cuisines[:miyagi] #=> "ずんだ餅"
```

### 要素の追加・更新

新しい要素を追加する例です。
```ruby
local_cuisines = { miyagi: 'ずんだ餅', iwate: 'わんこそば', fukushima: 'いかにんじん' }
local_cuisines[:akita] = 'いぶりがっこ'
local_cuisines #=> {:miyagi=>"ずんだ餅", :iwate=>"わんこそば", :fukushima=>"いかにんじん", :akita=>"いぶりがっこ"}
```
既にキーが存在する場合、値が更新されます。
```ruby
local_cuisines = { miyagi: 'ずんだ餅', iwate: 'わんこそば', fukushima: 'いかにんじん' }
local_cuisines[:miyagi] = 'おくずかけ'
local_cuisines #=> {:miyagi=>"おくずかけ", :iwate=>"わんこそば", :fukushima=>"いかにんじん"}
```

### キーの確認

特定のキーが存在するか確認したい場合は、`has_key?` または `key?` を使用します。
```ruby
local_cuisines.has_key?(:miyagi)  #=> true
local_cuisines.key?(:aomori)    #=> false
```

### ハッシュを使った繰り返し処理

ハッシュの全てのキーや値を順番に処理するには、`each` を使用できます。
```ruby
local_cuisines.each do |key, value|
    puts "#{key}: #{value}"
end
#=> miyagi: ずんだ餅
#   iwate: わんこそば
#   fukushima: いかにんじん
```
ブロックパラメータを１つにした場合、キーと値が配列として扱われます。
```ruby
local_cuisines.each do |key_value|
    puts "#{key_value[0]}: #{key_value[1]}"
end
#=> miyagi: ずんだ餅
#   iwate: わんこそば
#   fukushima: いかにんじん
```

## ハッシュが力を発揮する場面

ハッシュの強みについてです。

### 大量のデータを効率的に管理

多くの情報をキーで管理できるため、大量のデータを効率よく操作できます。

### 可読性の向上
意味のあるキーを使うことで、構造が直感的に理解しやすくなります。
この記事では、ハッシュのキーを**シンボル**というオブジェクトで管理しましたが、組み合わせて使う事でパフォーマンスの向上にも繋がります。

## まとめ

Rubyにおけるハッシュについてまとめてみました。特性を活かすことで、効率的にデータを管理・操作できるようになると思います。私自身、インターンバイト先でデータ変換ツールなどを開発していてハッシュって便利だなと感じることが多いため、これらをより使いこなせるようになりたいです。

## 参考資料
[プロを目指す人のためのRuby入門［改訂2版］ 言語仕様からテスト駆動開発・デバッグ技法まで]　https://gihyo.jp/book/2021/978-4-297-12437-3
オンライン計算機：便利で効率的なツールで日常の計算を簡単に

現代社会では、オンライン計算機は様々な場面で役立っています。日々の計算作業や複雑な数式の処理を効率的にこなすため、誰でも簡単にアクセスできるオンラインツールは非常に便利です。この記事では、オンライン計算機の利便性や使い方、選び方について詳しく解説します。

オンライン計算機とは？
オンライン計算機（またはウェブ計算機）は、インターネットを通じて利用できる計算ツールです。PCやスマートフォン、タブレットなど、インターネットに接続されたデバイスから簡単にアクセスできます。これにより、特別なソフトウェアをインストールすることなく、即座に計算が可能になります。

オンライン計算機の特徴：
即座に計算結果が得られる：オンライン計算機は、複雑な計算を短時間で処理することができます。
無料で利用できる場合が多い：多くのオンライン計算機は、無料で提供されており、誰でも利用可能です。
手軽で使いやすい：使い方がシンプルで、専門的な知識がなくてもすぐに利用できます。
多機能性：基本的な四則演算から、複雑な統計計算、三角関数まで対応したものまで多種多様なツールが提供されています。
オンライン計算機の種類と使い方
オンライン計算機にはさまざまな種類があります。以下はその一部です。

1. 基本的な計算機
最も一般的なオンライン計算機です。足し算、引き算、掛け算、割り算などの基本的な演算を行うことができます。例えば、簡単な日常の買い物の計算や、小さなビジネスでの経費計算に便利です。

2. 科学計算機
科学計算機は、より高度な計算をサポートします。三角関数、指数計算、対数、平方根など、科学や工学に必要な計算を行うことができます。大学の授業や研究に役立つツールです。

3. 財務計算機
オンラインの財務計算機は、ローン計算、利息計算、投資シミュレーションなど、財務に関連する複雑な計算を支援します。これにより、金融業界や個人の財務管理がスムーズになります。

4. 統計計算機
統計計算機は、平均、標準偏差、相関係数などの統計学的計算を簡単に行うことができます。データ分析や研究に役立つツールです。

5. 単位換算ツール
単位換算ツールでは、メートルからフィート、キロからポンド、リットルからガロンなど、異なる単位間での変換ができます。国際的な取引や旅行時に非常に便利です。

オンライン計算機を選ぶポイント
数多くのオンライン計算機が存在する中で、自分に最適なものを選ぶためのポイントをいくつか挙げておきます。

1. 機能の豊富さ
自分が必要とする計算ができるかを確認しましょう。例えば、基本的な計算だけでなく、複雑な数式や統計計算ができるものが必要な場合、機能が豊富なツールを選ぶことが重要です。

2. ユーザビリティ
直感的に操作できるインターフェースを持つ計算機を選びましょう。特に長時間使用する場合、シンプルで使いやすいデザインが求められます。

3. 信頼性と精度
計算結果が正確で信頼性が高いことは非常に重要です。特に専門的な計算を行う際には、精度の高いオンライン計算機を選びましょう。

4. モバイル対応
スマートフォンやタブレットで使用する機会が多い場合、モバイルに最適化されたオンライン計算機を選ぶと便利です。

5. 広告の少なさ
広告が多いサイトでは操作が煩わしくなることがあります。できるだけ広告が少ない、またはプレミアム版を選ぶことを検討しましょう。

オンライン計算機の利点
オンライン計算機には、特に以下の利点があります。

アクセスのしやすさ：インターネットがあれば、どこからでも利用可能です。
無料で使えるツールが多い：多くのオンライン計算機は無料で利用でき、コストをかけずに便利な計算ができます。
デバイスに依存しない：PCだけでなく、スマートフォンやタブレットでも利用でき、移動中でも計算作業が行えます。
まとめ
オンライン計算機は、日常的な計算から専門的な数式まで対応できる非常に便利なツールです。ビジネス、教育、日常生活のあらゆるシーンで活用できるため、必ずブックマークしておきたいツールの一つです。自分に合ったオンライン計算機を選んで、より効率的な作業を行いましょう。
https://webdentaku.org/
【Git】リポジトリ専用のGit Aliasesを設定する方法

## リポジトリ専用のGit Aliasesを設定する方法

```terminal
git config --local alias.ci commit
```

設定したリポジトリでのみ `git ci` で　`git commit` が実行できる。

## 外部コマンドにエイリアスを設定する

外部コマンドにエイリアスを設定する場合にはコマンドの最初に `!` を記述する必要がある。

```terminal
git config --local alias.sync "!git switch main && git pull --prune && git branch --format '%(refname:short) %(upstream:track)' | grep -oP '.*(?=\s\[gone\]$)' | xargs -r git branch -D"
```

設定したリポジトリで `git sync` で `git switch main && git pull --prune && git branch --format '%(refname:short) %(upstream:track)' | grep -oP '.*(?=\s\[gone\]$)' | xargs -r git branch -D` が実行できる。

## 参考

https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-Git-%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9
BitNet.cppの環境構築での躓きと解消

# 環境情報と構築背景
環境: MacBook Pro M2 Max / Mem 32G / OS: Sequoia 15.0.1
https://qiita.com/2626/items/da7811c8b044f5f04927
こちらの記事を参考にさせていただき、実行した結果、2つのエラーに遭遇

## 1

```
ERROR:root:Error occurred while running command: 
Command '['cmake', '--build', 'build', '--config', 'Release']' 
returned non-zero exit status 2., check details in logs/compile.log
```

## 2

```
ERROR:root:Error occurred while running command: Command '['/usr/local/bin/python', 'utils/convert-hf-to-gguf-bitnet.py', 'models/Llama3-8B-1.58-100B-tokens', '--outtype', 'f32']' died with <Signals.SIGKILL: 9>., check details in logs/convert_to_f32_gguf.log
```

# 解決1: 不足している標準ライブラリの追記

## 結論: utils/codegen_ti1.py に #include &lt;cstdlib&gt; と　#include &lt;cstring&gt;　を追記する

下記関数が見つけられないエラーが発生していた。
posix_memalign
free
memset
これらは、
#include &lt;cstdlib&gt;
#include &lt;cstring&gt;
で定義されている。
対象のヘッダに上記が指定されていないことが原因のよう。

setup_env.pyを確認すると、ローカルから bitnet-lut-kernels-tl1.h をコピーしてビルドをしているようで、今回は

```
        elif get_model_name() == "Llama3-8B-1.58-100B-tokens":
            run_command([sys.executable, "utils/codegen_tl1.py", "--model", "Llama3-8B-1.58-100B-tokens", "--BM", "256,128,256,128", "--BK", "128,64,128,64", "--bm", "32,64,32,64"], log_step="codegen")
```

こちらの条件を通過していることが確認できた。
utils/codegen_ti1.pyを確認すると、
#include &lt;cstdlib&gt;\n\\
#include &lt;cstring&gt;\n\\
が含まれていないことがわかったので、追記。

```
def gen_ctor_code():
    kernel_code = "\n\
#include <stddef.h>\n\
#include <cstdlib>\n\
#include <cstring>\n\
#include \"ggml-bitnet.h\"\n\
  :
  :
```

# 解決2: 

## 結論: メモリ不足のため、Docker desktopの Memory limitを最大に。

Signals.SIGKILL: 9 は、経験上だいたいメモリ不足なので、Docker desktopのメモリを24Gに引き上げてみたが、解決せず、32Gに設定したところ、解決し、

```
INFO:root:GGUF model saved at models/Llama3-8B-1.58-100B-tokens/ggml-model-i2_s.gguf
```

ggufファイルが生成できた。

# 結果

これらの問題が解決でき、

```
python run_inference.py -m models/Llama3-8B-1.58-100B-tokens/ggml-model-i2_s.gguf -p "Daniel went back to the the the garden. Mary travelled to the kitchen. Sandra journeyed to the kitchen. Sandra went to the hallway. John went to the bedroom. Mary went back to the garden. Where is Mary?\nAnswer:" -n 6 -temp 0

  :
  :

Daniel went back to the the the garden. Mary travelled to the kitchen. Sandra journeyed to the kitchen. Sandra went to the hallway. John went to the bedroom. Mary went back to the garden. Where is Mary?
Answer: Mary is in the garden.


llama_perf_sampler_print:    sampling time =       0.33 ms /    54 runs   (    0.01 ms per token, 164634.15 tokens per second)
llama_perf_context_print:        load time =    3506.26 ms
llama_perf_context_print: prompt eval time =    5601.12 ms /    48 tokens (  116.69 ms per token,     8.57 tokens per second)
llama_perf_context_print:        eval time =     586.33 ms /     5 runs   (  117.27 ms per token,     8.53 tokens per second)
llama_perf_context_print:       total time =    6188.78 ms /    53 tokens
```

正常動作が確認できた。
無料でサクッとアプリを作る(React×TypeScript)

# はじめに
本記事は無料でサクッとアプリが作れる技術スタックの紹介と、使ってみての感想です。
具体的なセットアップは範囲外にしています。

# 技術スタック
・React
・TypeScript
・Supabase(データベース)
・Firebase(デプロイ)

使用しているものはすべて無料です。
データベースはSupabaseを選びました。
プロジェクトインスタンスが2個まで無料で利用できます。

作成したアプリをWeb上に公開したいのでホスティングサービスとしてFirebaseを選びました。
毎月一定の利用量に達するまでは無料で利用可能です。

## 今回作成したアプリ
デジタル名刺アプリです。
以下の機能があります。
・idで名刺を検索して閲覧する
・名刺を新規作成する
・各項目のバリデーション

![ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810842/f619b251-2934-aaeb-329c-331d055732b9.gif)


## サクッと作るために
### プロジェクト立ち上げ
viteというビルドツールを使って1つのコマンドでプロジェクトを立ち上げることができます。
プロジェクトを作成したいディレクトリに移動し、
`npm create vite@latest`を打つ。あとは指示に従うだけです。

### デザイン
UIはほぼ時間をかけていません。
[Chakra-UI](https://www.chakra-ui.com/)というCSSライブラリを使用しています。
Buttonなどが簡単に作成でき、ローディングアイコン等もChakra-UIで完結します。

### バリデーション機能
React Hook Formを使用し、フォームの入力に不備がある時の挙動を簡単に実装できました。
![スクリーンショット 2024-11-14 23.24.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810842/d5a09aa9-3821-7bff-8301-0cc278f626b5.png)

## 使ってみての感想
プロジェクトを立ち上げてFirebaseでデプロイするだけなら1時間もかからずにWeb上でサイトを公開できました。
Herokuも数年前に有料になってしまったので、Firebaseが今のところ個人開発で使うのに勝手がいいのではと思っています。
複数のダミーデータ挿入に便利。LaravelでFactoryを使う。Factoryで主要なメソッド一覧掲載

## はじめに

初心者向けです。
最後にメソッド一覧載せておきます。

またLaravel11での実装になります。

## Factoryを使うにあたって
　
流れは、
##### 【Seederでデータを探しこむ際にFactoryを使ってダミーデータを入れていく】

ダミーデータでなければSeederだけでデータの一括挿入は可能。
手動で書く必要はあるので少し手間ですが画面やSQLで登録するより
一度書いてしまえば簡単にいつでもデータの挿入ができるので便利です。

※今回はダミーデータになるのでSeederは割愛します。

## Seederの生成

```
php artisan make:seeder テーブル名Seeder
もしくは
./vendor/bin/sail artisan make:seeder テーブル名Seeder

※テーブル名は最初大文字から
```

上記のコマンドでSeederが作成された。
database/seeder/ここ

```php
<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use App\Models\Eloquent\Sorting;  // ← モデルをセット

class SortingsSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        Sorting::factory(10)->create(); 　// ←Factoryを使う準備（今回は１０件やっていきます）
    }
}
```

上記でSeederは完了！
次にFactoryを生成する。
```

```

```php
<?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;　// ←ここ忘れずに


class テーブル名Factory extends Factory
{

    public function definition()
    {
        return [
            'user_id' => 1,               // 固定文字可能
            'title' =>faker->text(30),    // ３０文字のテキストをランダムに
            'name' =>fake()->name(),      // 名前をランダムに
        ];
    }
}

```
このreturnの中はテーブル定義で使い分けてくださいまし。
またfakeの使えるメソッドについては最後にまとめておきます。

これでfactoryのセットも完了です！
全部を動かさず、指定してSeederを動かす場合
```
php artisan db:seed --class=sortingsSeeder
または
./vendor/bin/sail php artisan db:seed --class=テーブル名Seeder
```
全部のSeederを動かす場合
```
php artisan db:seed
または
./vendor/bin/sail php artisan db:seed
```

## factoryのメソッド
※右の機能はすべてランダムになります。
```
fake()->boolwan(); 
```
このように使う。
| メソッド名| 機能 |
|:-:|:-:|
| boolean( ) |  真偽値 |
| randomNumber( )  | 整数値  |
| randomFloat( )  |  実数値 |
| numberBetween(最小値,最大値 )  | 引数の間の数値  |
| randomHtml(階層,最大エレメント数) | 階層はタグのネストの深さ、エレメントはタグの数  |
| shuffle( 配列 ) | 配列の要素  |
| randomLetter( )  | アルファベット  |
| word( )  | 英単語  |
| text( 文字数 )  | 最大文字数が指定した数  |
| sentence( )  | 一文  |
| paragraph( )  | 一段落のテキスト  |
| emoji  |  絵文字 |
| name( )  | 名前  |
| firstName( )  | ファーストネーム  |
| firstNameMale( )  |  男性のファーストネーム |
| firstNameFemale( )  |  女性のファーストネーム |
|  lastName( ) |  ラストネーム |
|  country | 国名  |
| state( )  | 州  |
|  city( ) | 街  |
| address( )  | 住所  |
| postcode( )  |  郵便番号 |
| latitude( )  | 緯度  |
| longitube( ) |  経度 |
| phoneNumber( )  | 電話番号  |
| date( )  | 年月日  |
| time( )  | 時分秒  |
| dateTime( )  | 日時  |
|  email( ) | メールアドレス  |
|  userName( ) | ユーザー名  |
|  password( ) |  パスワード |
|  domainName( ) | ドメイン  |
| url( )  |  URL |
|  hexcolor( ) |  色を表す16進数 |
|  rgbcolor( ) | RGBの各値  |
|  colorName( ) | 色名  |
|  locale( ) | ロケール（jaなど）  |
【EC2】次世代EC2！メモリ特化のRインスタンス vs 計算力重視のCインスタンス



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806193/0e45bcac-5aa6-5786-323e-fbd4a255f4c6.png)
SAPの試験で比較問題が出たので、まとめました。

## 一言で要約
::: note info
- C5インスタンスは「高い計算能力が必要なワークロード向け」
- R5インスタンスは「メモリ使用が多いワークロード向け」
:::
---

## ユースケースに基づいて使い分けを説明

### C5インスタンス: 計算重視の選択肢
C5インスタンスは、コンピューティング能力に最適化されたインスタンスで、高性能なCPUを求めるアプリケーションに適しています。例えば、大規模なデータ処理、バッチ処理、ゲームサーバー、科学技術計算など、計算リソースを多く消費する場面で威力を発揮します。  
**C5が最適なユースケース:**
- ビデオエンコードやバッチ処理などの大量データ処理
- ゲノム解析のような高度な計算処理
- ウェブサーバーやアプリケーションサーバーでのCPU集約型ワークロード

### R5インスタンス: メモリ重視の選択肢
R5インスタンスは、RAM（Random Access Memory）容量が大きく、メモリ使用率が高いアプリケーションに適したインスタンスです。データを大量に保持するインメモリデータベース（例: Redis、Memcached）、リアルタイムのビッグデータ解析、大規模な検索やキャッシュ用途などに向いています。  
**R5が最適なユースケース:**
- インメモリデータベース（Redis、Memcachedなど）でのデータ保持
- ビッグデータ解析やデータベース処理
- データキャッシュや検索、分析の負荷が大きい作業

---

## まとめ
C5インスタンス（C:Compute）とR5インスタンス（R:Random Access Memory）は、それぞれ「計算力」と「メモリ容量」に特化したAWSの代表的なインスタンスです。C5はCPU性能が求められる処理に、R5は大量のメモリが必要なアプリケーションに向いています。  

**ポイントはアプリケーションの要件を見極め、適切なインスタンスタイプを選ぶこと。**
これにより、パフォーマンスとコストのバランスを取りながら、インフラの効率を最大化することが可能です。AWSの豊富なインスタンスタイプを活用して、最適なワークロードに応じたリソース選定を行いましょう！
【Tableau】動的に画像を表示

Tableauのマップ機能を使っていく中で、
都道府県章（画像）と県庁所在地・人口・面積が動的に出てくれると嬉しいなと思い、適当に作ってみた。

### 目指したいもの
マップ上で都道府県を選択またはカーソルを合わせた際に、
左上に都道府県章と情報が表示されるようにしたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3437732/3a3da882-f716-710d-9d64-4ab1385471c8.png)

### 手順
１．ひとまず都道府県のデータが必要なので、簡単に都道府県マスタというファイルを用意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3437732/c0a19120-7c33-8d5c-ded1-25a9014d5cc6.png)

２．用意したマスタと元のファイルを結合してTableauにデータを取り込む
[都道府県]は文字列型から地理的イメージで"都道府県/州"に置き換え、適当なグラフを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3437732/0806f07f-1db8-4cd7-ddb5-b1a4ffc06055.png)

３．マスタの情報を適当にすべて行に入れ、表示するための表を用意する。
データ上はURLの文字列のため、当たり前だが[都道府県章]はURLのみが表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3437732/c3cc7942-b45e-9c9a-deb0-002286d0fa5a.png)

４．そこで[都道府県章]を右クリックし、イメージの役割から「URL」を選択する
上記の対応をすることでデータのURLを呼び出し、イメージを表示してくれるようになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3437732/31204e8f-0bb7-1a50-272b-fd449dda2fec.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3437732/3f85ee76-3d59-0209-fb1c-a3727b3d973a.png)

５．次にダッシュボードでマップを配置し、表を浮動で画面左上に配置する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3437732/4e3bd651-a672-adad-d630-0a48a63de91f.png)

６．今のままだとすべての都道府県情報が表示されるため、マップの都道府県をフィルターとして利用する
マップのシートを選択した状態で、「フィルターとして使用する」を選択する（ここまでやれば都道府県を選択した際にひとつの都道府県情報が表示される）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3437732/cbf7892e-97d1-8cfe-741f-4beac75ca5cd.png)

７．ダッシュボードのアクション（Ctrl+SHift+D）で６．で作成されたアクションを編集する
アクションの実行対象：　選択　から　カーソルを合わせる　に変更
選択項目をクリアした結果：　すべての値を表示　から　フィルターされた値を保持　に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3437732/7c742eb5-6cf5-ec87-0f29-dee40663d67a.png)

ここまで設定が終われば、マップ上でカーソルを合わせた都道府県の情報が左側に動的に表示される
【Cコード解析】コメントの削除

# コメントの記述を削除する
gccコンパイラを使ってプリプロセッサをかければいいじゃん。という話は置いといて、それをpythonで実現してみる。

```python
import regex
import glob

filelist = glob.glob("test.c", recursive=True)


REGEX_PATTERN_BLOCK_COMMENT = r"/\*.*?\*/"
REGEX_PATTERN_LINE_COMMENT = r"//.*?(?=\n)"

for file in filelist:
	with open(file, "r", encoding="utf-8") as file_obj:
		filetext = file_obj.read()
		filetext = regex.sub(REGEX_PATTERN_BLOCK_COMMENT, "", filetext, flags=regex.DOTALL)
		filetext = regex.sub(REGEX_PATTERN_LINE_COMMENT, "", filetext, flags=regex.DOTALL)

	with open(file, "w", encoding="utf-8") as file_obj:
		file_obj.write(filetext)
```

globメソッドの部分を変えれば、複数のファイルを一度に処理できます。

# まとめ
コメントを削除することで他の解析作業に活かせたりする。コードツリーの作成とか。。。
正規表現を使った置換の魔法（葬送のフリーレン風に）

## フリーレンの記録：正規表現の魔法の学び
旅を終えた後も、学びは続く。
魔法の書を手にしたのもつかの間、最近、フリーレンは自然言語処理の中で使われるという「正規表現」という魔法を発見した。
この不思議な文字列操作の力を、決して忘れることがないよう、ここに記録することにした。

## replace関数は扱いやすいけど…
Pythonのreplace関数は、まるで初めて手にする杖のように、扱いやすく心強い。
何かを別のものへと変えるこの魔法は、たとえば簡単な言葉を別の言葉に置き換えるにはぴったりだ。
しかし、旅路で遭遇する多くの複雑な問題、たとえば電話番号や郵便番号のような特殊な書式には、replaceの魔法だけでは力が足りない。

### 一応replace関数の使用方法
```python
text = "Hello World"
new_text = text.replace("World", "Python")
print(new_text)  # Hello Python
```

↓↓↓replace関数の知識の泉はこちら（公式ドキュメント）↓↓↓
[https://docs.python.org/ja/3/library/stdtypes.html#str.replace](https://docs.python.org/ja/3/library/stdtypes.html#str.replace)


## reモジュール：深淵の正規表現の魔法
この先、replaceの魔法の力を超えるために「reモジュール」という魔導書が必要となる。
reモジュールには、正規表現の魔法が数多く秘められているらしい。
- re.search(pattern, string)
    - 文字列全体を読み解き、魔法の文様に合うものを最初に見つけ出す
- re.match(pattern, string)
    - 文字列の始まりから魔法の文様が重なっているかを確認する
- re.findall(pattern, string)
    - 文様と一致するすべての部分を見つけ出し、リストにして返してくれる

いずれの呪文も、習得の時が訪れるだろう。

↓↓↓re.subの知識の泉はこちら（公式ドキュメント）↓↓↓
[https://docs.python.org/ja/3/library/re.html](https://docs.python.org/ja/3/library/re.html)

### re.sub：柔軟なる置換の魔法
いよいよ、フリーレンが注目する置換魔法、re.subの出番だ。
この呪文を使うと、魔法の文様を頼りに、より精密な置換を実行できるようになる。
文字列のどんな姿も、この魔法の力で変えることができるのだ。

↓↓↓re.subの知識の泉はこちら（公式ドキュメント）↓↓↓
[https://docs.python.org/ja/3/library/re.html#re.sub](https://docs.python.org/ja/3/library/re.html#re.sub)

#### 例えば、電話番号を消し去る魔法
```python
import re
re.sub(r'.*?\d{3}-\d{4}-\d{4}.*', '', '070-1234-5678')  # 携帯番号削除
re.sub(r'.*?\d{4}-\d{2}-\d{4}.*', '', '1234-56-1890')  # 固定1電話番号削除
re.sub(r'.*?\d{3}-\d{3}-\d{4}.*', '', '123-456-1890')  # 固定2電話番号削除
re.sub(r'.*?\d{2}-\d{4}-\d{4}.*', '', '12-3456-1890')  # 固定3電話番号削除
```
これで、意図した番号を消し去り、余計な痕跡を残さずに済む。

旅は続く。そして、学びもまた続く。
変数、定数、値、関数、パラメータ、引数、戻り値の混乱しない解釈

お疲れ様です。
出張から帰ってきてからはひたすらドキュメント作成をしております。
先日現場上長からVBA覚えてくれ〜！と言われたので勉強し始めました。
前々回投稿した手順書作成の際に、助けていただいた、VBA仙人ことシニアマネージャーが「俺がVBA職人してやろう！！」と張り切ってくださり、仙人主催のVBA塾に参加させていただいてます。
そこでVBAに限らずプログラミングは料理だよと教わったので、プログラミングの基本用語をを料理に例えて整理したいと思います。初学者向けにまとめたので、知ってる方は物足りないと思いますのでサラッと読んでいただけると嬉しいです。

### 1. 変数
**変数**は、料理における「材料を入れる器」や「ボウル」です。
- 例: 大きなボウルを用意し、ここに様々な材料を入れていきます。このボウルの名前を「サラダボウル」とすると、後でどの材料がどのボウルに入っているかを管理しやすくなります。材料の入れ物なので、その中身が変わる事があります。日によって盛り付ける食材が違うようなものです。VBAでは、変数を使用することで、一時的にデータを保存します。

### 2. 定数
**定数**は「決まった量の特別な材料」や「固定の調味料」で料理のベースとなる基本的な材料のことです。
- 例: レシピに「砂糖は必ず小さじ2」と決まっている場合、この砂糖の量は変わらないので、定数として扱います。VBAでは、定数を使用することで、プログラム内で変更されない値を定義できます。

### 3. 値
**値**は料理の「個々の食材や調味料」です。
- 例: トマト、きゅうり、塩、油など、これらが具体的な値です。VBAでも、数値や文字列など、実際に使うデータが値として扱われます。

### 4. パラメータ
**パラメータ**はレシピにおける「材料の量」や「料理の条件」です。
- 例: サラダのレシピに「このレシピでは、トマトを2個使います」という具体的な量がある場合、これがパラメータです。関数に渡される情報で、特定のデータや設定を指定するための役割を果たします。

### 5. 関数
**関数**は料理の「レシピそのもの」です。
- 例: サラダを作るための手順が書かれたレシピが関数です。このレシピには、どの食材をどのように調理するかが書かれています。「煮る」「焼く」といった処理です。VBAの関数は、特定の処理をまとめたもので、何度でも呼び出して使うことができます。

### 6. 引数
**引数**は関数に渡す「具体的な材料やその量」です。
- 例: 料理のレシピで、特定のサラダを作る際に「トマトは2個」と書いてある場合、その「2個」が引数です。VBAでは関数を呼び出す際に、実際にパラメータに当たる値を渡します。

### 7. 戻り値
**戻り値**は完成した「料理そのもの」です。
- 例: サラダができあがったとき、それが戻り値です。この完成した料理を提供することで、材料や手順の結果を得ることができます。VBAでは、関数が処理を完了した際に、結果として返す値のことを指します。

### 全体の流れ
1. **材料を選ぶ（値）**: トマト、きゅうり、レタスなどを用意。
2. **器を選ぶ（変数）**: ボウルを取り、名前をつける（例: `saladBowl`）。
3. **特定の材料の量を決める（定数）**: 砂糖は常に小さじ2と決める（例: `Const SUGAR As Double = 2`）。
4. **材料の量をレシピに書く（パラメータ）**: サラダのレシピにトマトを2個と記載。
5. **作る手順を決める（関数）**: サラダを作るレシピが関数。
6. **実際に材料を渡す（引数）**: 関数を呼び出して、`MakeSalad(2, 1)`のようにトマトときゅうりを指定。
7. **できあがったサラダ（戻り値）**: 関数がサラダを作り、その結果を返す。


## まとめ
これらの用語は、プログラミング全般で共通して使われる基本的な概念ですので、VBAだけでなく、他の言語を学ぶ際にも同じように理解することが出来ると思います。
プログラミングは料理と同じで、材料（変数や値）を組み合わせて、特定の手順（関数）を通じて、最終的な料理（戻り値）を作り出すプロセスだと教わりました。
最近実際の料理を始めたのですが、レシピの分量（定数）を無視しがちです。。（私の料理は常に変数なので柔軟性が高いと思いたい）
今のところ得意料理はリクガメの餌のようなサラダなので、レシピ(関数)をたくさん覚えたいです。
ここまで読んでくださりありがとうございました！
Nginxのログレベルの一覧表

Nginxのログレベルとそれぞれの用途について一覧表にまとめました。

| ログレベル | 説明 | 用途例 |
| --- | --- | --- |
|debug | デバッグ情報。Nginxの動作の詳細が記録され、トラブルシューティングに役立つ情報を含む。 | 詳細なトラブルシューティングが必要な場合|
|info | 一般的な情報。通常の動作や情報メッセージが記録される。 | サーバーの接続状況や開始・終了に関する情報など|
|notice | 通知レベル。重要だが直ちに問題になるわけではない情報を記録。 | 設定変更などに関する情報|
|warn | 警告レベル。すぐには重大な問題ではないが注意が必要な状況を記録。 | 一時的なリソース不足や将来的に問題になる可能性|
|error | エラーレベル。リクエストに失敗した場合や問題が発生した場合に記録。 | ファイルの読み込み失敗、プロキシ先に接続できない場合|
|crit | 重大エラー。アプリケーションに深刻な問題が発生した場合に記録。 | メモリ不足や重要なリソースの使用不可|
|alert | アラート。直ちに対応が必要な問題を示すログ。 | 重要なプロセスの停止や即時対応が必要な事態|
|emerg | 緊急エラー。システムが使用不能で、Nginxの継続が不可能な場合に記録。 | システムクラッシュや即時対応を要する非常事態|

‌

### 補足

- **デフォルトレベル**: ログレベルを指定しない場合は`error`レベルがデフォルトとなります。
- **適切なログレベルの選定**: 開発環境では`debug`など詳細なログレベルが役立つ一方、本番環境では`warn`や`error`レベルで運用するのが一般的です。
Flutterの学習 - 簡単なGeminiアプリの起動

こんにちは！

前回、[Flutterの環境構築に関する記事](https://qiita.com/yam_dev/items/f58dc02260df7aa053ed)を書きました。

今回は、簡単なGeminiアプリを作成してみます。

# プロジェクトの新規作成
まずは Android Studio を起動して、「New Project」をクリックします。

![スクリーンショット 2024-11-14 20.16.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/8757e078-ea48-78e4-1684-c2b496367bd0.png)

何を作りたいか聞かれるので、「Gemini API Starter」を選択。

![スクリーンショット 2024-11-14 20.20.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/5d870515-54c2-f61a-1876-de0aefe5913d.png)

この画面でプロジェクト名を決めます。
今回は、他のパラメータはデフォルトのままにしてます。

![スクリーンショット 2024-11-14 20.21.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/5da7f8d5-493e-ea2b-91e6-7d4e4d930ea0.png)

次の画面で、SDKのインストールが始まります。

![スクリーンショット 2024-11-14 20.21.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/97eeaf60-b256-8f51-9adc-2c778b4b0099.png)

次に、Gemini の APIキーを設定します。
APIキーは、Google AI Studio の「[Get API Key](https://aistudio.google.com/app/apikey)」から取得してください。

![スクリーンショット 2024-11-14 20.29.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/69bc80fd-4349-0a18-681f-b0ab42a89f6d.png)

APIキーをセットして Next をクリックすると、新規プロジェクトが立ち上がります。

![スクリーンショット 2024-11-14 20.38.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/e62b6577-4abc-b941-d41e-d2f084810ee1.png)

依存関係のインポートも自動で完了しました。

![スクリーンショット 2024-11-14 20.48.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/a2eb72ae-b269-cdf4-a48c-158a59cf5cb3.png)

ビルドが完了し、アプリが起動しました！

![スクリーンショット 2024-11-14 22.36.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/e54b0b2c-d0e3-892d-4a4d-71f2d07bfde1.png)


途中で前回の記事のようなエラーが発生しましたが、プロジェクトの直下で`./gradlew --stop`を実行し、デーモンを止めてから再ビルドしたらうまく行きました。

また、JDKのバージョンも古かったようで、最新版をインストールしたら、起動できました。

次回はプロジェクトのファイル構成について調べてみます🙂
Supabaseにデータ保存されない事象について

<b>Reactでコードを書いて、Supabaseにデータを格納しようとした。</b>
【コードに誤りはないはずなのに、データが格納されない】こんな場合はSupabase内の
➡「Add RLS policy」の設定を確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864206/07366635-b87e-889e-ea0a-1a6c246c289c.png)

これを「Disable RLS」にすれば、ロック解除されるようなアイコンが付き、データが保存される

あまり意味のない記事でした・・。
rex0220 計算式プラグイン 複数ユーザー選択の結合

[rex0220 計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)で、複数ユーザー選択の結合を行います。

# 概要

ユーザー選択Aとユーザー選択Bで、選択されたユーザーをユーザー選択C にセットします。
レイアウトは、わかりやすいように[横並びプラグイン](https://qiita.com/rex0220/items/b24c41d6c3b6ce3f3d78)でグループを表示しています。

![2024-11-14_22h03_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/89d3607c-5685-0dca-d5d5-004092582c9f.png)

# 操作例

![2024-11-14_22h13_07.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/1f499e38-58b5-4963-c085-93b874324f04.gif)

# 計算式プラグインの設定

ユーザー選択Aとユーザー選択B の値を取得して、ARRAY 関数で結合します。

![2024-11-14_22h10_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/b95bdff9-ff63-aa9c-8b2b-ae9027c021d3.png)

```.js
// ユーザー選択C USER_SELECT
ARRAY(
  SEL_CODE(ユーザー選択A,"obj"),
  SEL_CODE(ユーザー選択B,"obj")
)
```
【Unity】Terrainのテカリを消す方法

Terrainが光る現象に悩まされました。
かなり眩しいので、放っておくわけにもいきませんが、Post-ProcessをOFFにしても軽減するだけで、直りませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850966/80088d5c-4c27-b2a0-b89e-145d6e6b697c.png)

問題となってるテクスチャを見て、Alpha Sourceを確認すると、「Input Texture Alpha」になってました。これを「From Gray Scale」にすることで、光る現象はなくなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850966/bd865790-9816-f3b5-171e-7ac4babec473.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850966/a35a85ab-bcf9-b27b-e85f-9791948dbc6d.png)

ただし、色味が変わるため、好みがあるかもしれません。
また、これ以前にEnvironment Reflectionsを「SkyBox」から「Custom」に変更することで、全体的なテカリの軽減を行いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850966/16cde5d8-fe70-3aaf-b759-e6dda9d9dbf6.png)

こちらも好みがあるかとは思いますが。。
参考になれば幸いです。
[WSL2]何もしていないのにWSL2が動かなくなった[0x80070002]

WSL2が唐突に起動しなくなったため、どう対処したか忘備録として残します。

# 環境
OS：Windows 11 Enterprise
バージョン：23H2
WSL2：2.3.*

# 事象
スリープモードにして席を離脱
→ 戻ってログイン
→ 立ち上げていたアプリが何故かすべて閉じられている
→ docker再起動
→ WSLが起動していませんエラー
→ ターミナルでUbuntuに入ってみる
→ エラーコード：**0x80070002**

# 対処法
とりあえずGoogle検索で出てくる対処法をあらかた試したけど動かない…
ひたすらに情報を探していたところ、こんな投稿を発見。

https://x.com/okoi_mk2/status/1803316878041088442?mx=2

救世主でした。

---

**以下の手順は「PowerShell 管理者権限」で実行しています**

### 1. wslのバージョンを1に下げる
```
wsl --set-default-version 1
```

### 2. 再起動
```
# 再起動 → WSL2だとここでエラー落ちしました
wsl
```

※ ディストリビューションをアンインストールした場合は以下を実行
```
# 筆者は一度Ubuntuをアンインストールしたため、ここで再インストールしました
wsl --install
```

### 3. WSLとディストリビューションのバージョンを2に戻す
```
PS C:\Program Files\WSL> wsl --set-default-version 2
WSL 2 との主な違いについては、https://aka.ms/wsl2
 を参照してください
この操作を正しく終了しました。
```

```
PS C:\Program Files\WSL> wsl --set-version Ubuntu 2
...
ディスク 'C:\Program Files\WSL\system.vhd' を WSL2 にアタッチできませんでした: 指定されたファイルが見つかりません。
Error code: Wsl/Service/CreateInstance/CreateVm/MountVhd/HCS/ERROR_FILE_NOT_FOUND
```

新たなエラーに遭遇

### 4. https://github.com/microsoft/WSL からmsiをダウンロード
https://zenn.dev/masinc/articles/9c93db64af5f47

https://github.com/microsoft/WSL から任意のバージョンを選択し、msiをダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385855/ee7b52c8-957d-c4b1-7384-e1965c00abad.png)

wslのバージョンは合わせたほうがいいかも？
（バージョンは```wsl --version```で確認できます）

:::note warn
**msiはarm64版とx64版があります。
ここを間違えてダウンロードすると以降の手順.7でエラー落ちします。**
:::
どちらを選べばいいかは、**コマンドプロンプト**で以下を実行して確認できます。
```
# AMD64 -> x64版
# ARM64 -> arm64版

C:\Users\username>echo %PROCESSOR_ARCHITECTURE%
AMD64
```

### 5. インストーラ実行
```
msiexec /a c:\Users\username\Downloads\wsl.2.3.26.0.x64.msi /qb TARGETDIR=c:\任意の場所
```

### 6. ```C:\Program File\WSL``` に ```System.vhd``` を配置
```
Copy-Item 5のTARGETDIR\PFiles64\WSL\system.vhd -Destination 'C:\Program Files\WSL\'
```

### 7. 再度ディストリビューションのバージョン設定
```
wsl --set-version Ubuntu 2
```

### 8. 再起動
無事起動しました :sob:
```
PS C:\Program Files\WSL> wsl
username@LAPTOP-***:/mnt/c/Program Files/WSL$
```

# 原因
相変わらず不明