OmniAICreator/Qiita-1.07M huggingface dataset:
初心者がpythonanywhereでハマった話

## pythonanywhereでハマった

ローカルで仮想環境を立てて製作開始、いい感じに動いたのでgitに投げてpythonanywhere上で実行したところエラーで表示されなかった、ローカルでは動いていたのになぜ？

とりあえずサーバーのエラーログを見てみる
エラーが出た時のページでリンクとしてアクセスログ、エラーログ、サーバーログへのリンクが表示されているので確認
どうやら`print`周りでエラーが起きていたらしい、全ての`print`を`console.log`に置き換えて実行したところ通りました。

## 試しても無駄だったこと
### killコマンド
プロセス確認は不可能でした、権限もないためどうしようもなく


## 実際に作ったもの
マイナーなゲームのチーム編成エミュレーター

https://fuwafuwad0504.pythonanywhere.com/team
Markdownで画像をリサイズする

Markdownのコードを全てVSCodeなどのエディタに貼っつけて、以下の文字列で正規表現で検索して変換する。

```vim:検索文字列
(?:<img[^>]*src="(http[^"]*)")|(?:!\[[^\]]*\]\((http[^)]+)\))
```

```markdown:変換内容
<img src="$1$2" width="50%" />
```

## 補足
[Find & Replace for Text Editing](https://chrome.google.com/webstore/detail/mogefjlnnldblkakpbakdaffphhjfjba) など、テキストエリアを検索してその中を直接編集する拡張機能は存在するが、2024年6月12日現在、どの拡張機能もハイライトや変換がうまく行っていないようなので、こちらの方法が確実。
Bizrobo!　DAでのLocation Foundのコンポーネントに変数を「複数」代入する

こんにちは！

今回はBizrobo!のDAにて、LocationFoundのコンポーネントに変数を「複数」代入するやり方を通して変数の代入の使い方をしっかりお伝えします！

この内容にいたった理由として、私自身がネットに上がっている内容では理解できなかったためです。(ただの私の理解力不足です。笑)

■前提
まずルールとしては３つです！
①文字列は「""」で囲う。
②変数と文字列を連結させるときは「+」で繋ぐ
③役割のある文字をただの文字列として認識させたいときは前に「¥」(エスケープ文字)をつける。

■今回の対象
編集[name="テスト"][id="1"]
→nameの「テスト」とidの「1」を変数に置き換える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796227/b44090f4-2d23-9f64-7ae2-35431d2663e4.png)

■手順
１．代入をできる状態にするために、左側をクリックして「＝」が表示される状態にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796227/ebd0d660-dfc3-9c69-2d28-b9186c2b7ebe.png)

２．文字列となる範囲を「"(ダブルクォーテーション)」で囲う(ルール①)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796227/770b6005-d225-960a-df71-c40dfc9b136b.png)
※補足
　囲んでいる範囲をスラッシュで分けますね！(スラッシュを囲み文字の「"」と思ってください！)
　<font color="blue"> / </font><font color="red"> 編集[name=" </font><font color="blue"> / </font> テスト <font color="blue"> / </font><font color="red"> "][id=" </font><font color="blue"> / </font> 1 <font color="blue"> / </font><font color="red"> "] </font><font color="blue"> /</font>



３．文字列して扱いたい「"」の前に「¥」を置く(ルール③)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796227/cab68da3-9643-dd70-13fb-3cbc5bef01a6.png)
※補足
　今回文字列として扱った「"」を色付けしておきます！
　"編集[name=<font color="red">**"**</font>"テスト<font color="red">**"**</font>"][id=<font color="red">**"**</font>"1"<font color="red">**"**</font>]"


４．変数として扱いたい部分と文字列として扱いたい部分を「+」で繋ぐ(ルール②)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796227/80853cea-c26a-90b5-871f-cdb0e17e251e.png)

５．変数を置き換える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796227/0db5e72c-db13-198b-471c-cff856331bb1.png)

これで代入完了です！ここまでお疲れ様です。
お気づきの方もいらっしゃるかもしれませんが、１～４までの手順は順不同です。５は最後にしてあげた方が作業しやすいと思います。

では、より良いRPAライフを～
4x+y<= 9, x+2y >= 4, 2x-3y >= -6の時、2x+y、x^2+y^2の最大値と最小値「2010 京都大学 文系【２】」(その2) ChatGPTとsympyでやってみたい。

(その1) RとWolframAlphaとCVXPY(非線型計画法)でやってみた。2021年03月30日
https://qiita.com/mrrclb48z/items/57602db64e2133a5f813

# (再)オリジナル

・大学入試数学問題集成 様＞ 文系【２】 テキスト

https://mathexamtest.web.fc2.com/2010/201010541/2010105410100mj.html#top-0103

・望星塾 様＞ 文系【２】 解答

https://bouseijuku.sakura.ne.jp/2010kyoto-sugaku.pdf#page=14

＞最大値は6。最小値は2。
＞最大値は11.25。3.2が最小値である。

# ChatGPT-3.5先生へ(1回目)

大学入試数学問題集成 様＞ 文系【２】 テキスト

・ページのソースを表示です。MathMLです。
　省略しようと思いましたが、大学入試数学問題集成 様 の全文から必要部分の抜粋です。
```
<div class="qbody">
<p class="slevel"><a name="q-0103" 
id="q-0103"></a><span 
class="qnum">【２】</span>　座標平面上の点<math>
<mspace width=".2em"></mspace><mi mathvariant="normal">P</mi>
<mo lspace=".5em" stretchy="false">(</mo>
<mi>x</mi><mo>,</mo><mi>y</mi><mo rspace=".2em" stretchy="false">)</mo>
</math>が<math>
<mspace width=".2em"></mspace><mn>4</mn><mo>&it;</mo>
<mi>x</mi><mo>+</mo><mi>y</mi><mo>&lE;</mo>
<mn>9</mn><mspace width=".2em"></mspace><mtext>，</mtext>
</math><math>
<mrow><mi>x</mi><mo>+</mo><mn>2</mn><mo>&it;</mo>
<mi>y</mi><mo>&gE;</mo><mn>4</mn>
<mspace width=".2em"></mspace><mtext>，</mtext></mrow>
</math><math>
<mrow><mn>2</mn><mo>&it;</mo><mi>x</mi><mo>-</mo>
<mn>3</mn><mo>&it;</mo><mi>y</mi><mo>&gE;</mo>
<mo>-</mo><mn>6</mn></mrow><mspace width=".2em"></mspace>
</math>の範囲を動くとき，<math>
<mrow><mn>2</mn><mo>&it;</mo><mi>x</mi><mo>+</mo>
<mi>y</mi><mspace width=".2em"></mspace><mtext>，</mtext>
</mrow>
</math><math>
<mrow><msup><mi>x</mi><mn>2</mn></msup>
<mo>+</mo><msup><mi>y</mi><mn>2</mn></msup>
</mrow><mspace width=".2em"></mspace>
</math>のそれぞれの最大値と最小値を求めよ．
</p>
</div>
</div>
```
結果
関数 2𝑥+yの最大値は 6、最小値は 2。
？？？関数 x^2+y^2 の最大値は 11.25、最小値は 4。

＞望星塾 様　
＞最大値は6。最小値は2。
＞最大値は11.25。3.2が最小値である。

 
# ChatGPT-3.5先生へ(2回目) sympyのソースコード
```
sympyのソースコードをお願いします
```
```python
import sympy as sp

# 変数の定義
x, y = sp.symbols('x y')

# 不等式の定義
inequality1 = 4*x + y - 9 <= 0
inequality2 = x + 2*y - 4 >= 0
inequality3 = 2*x - 3*y + 6 >= 0

# 目的関数の定義
f1 = 2*x + y
f2 = x**2 + y**2

# 不等式をリストにまとめる
inequalities = [inequality1, inequality2, inequality3]

# 範囲を求める関数
def find_extrema(func):
    extrema = []
    for ineq in inequalities:
        solution = sp.solve([ineq, sp.Eq(sp.diff(func, x), 0), sp.Eq(sp.diff(func, y), 0)], (x, y), dict=True)
        extrema.extend(solution)
    boundary_points = []
    for i in range(len(inequalities)):
        for j in range(i+1, len(inequalities)):
            boundary_solution = sp.solve([inequalities[i], inequalities[j]], (x, y))
            if boundary_solution:
                boundary_points.append(boundary_solution)
    extrema.extend(boundary_points)
    return extrema

# 極値の計算
extrema_f1 = find_extrema(f1)
extrema_f2 = find_extrema(f2)

# 最大値と最小値の計算
max_f1 = max([f1.subs(point) for point in extrema_f1])
min_f1 = min([f1.subs(point) for point in extrema_f1])
max_f2 = max([f2.subs(point) for point in extrema_f2])
min_f2 = min([f2.subs(point) for point in extrema_f2])

# (max_f1, min_f1), (max_f2, min_f2)
print("#", (max_f1, min_f1), (max_f2, min_f2))
```

ValueError: can only solve for one symbol at a time

申し訳ありません。私は、ここまでです。
PythonのコードをRustから使う

## 概要
Rustを使ってロボット用ミドルウェアを作っています。Pythonも色々と便利なモジュールがあるので、RustからPythonで作ったモジュールを呼び出す機能を実装したのでメモを取ります。

Rustからはpyo3というクレートを使って呼び出すことにしました。

## 使用方法

### 環境
MacOS + rustc (1.77.2)


### Cargo newする
```terminal
$ cargo new pyo3_test
```
### Cargo tomlを編集
```toml
pyo3 = {version = "*", features=["auto-initialize"]}
```

### src/main.rsを編集
```rust
use pyo3::prelude::*; // 主要なモジュール

fn main() {
    // Python::with_gilでPython環境呼び出す
    let pyresult = Python::with_gil(|py| -> PyResult<Py<PyAny>> {
        // ここでコードをモジュールとしてロード。ロードした時にグローバルに置いたprintの行が実行される
        let module = PyModule::from_code_bound(py, 
            r#" 
print("Hello, World from Python!")

def function1():
    print("function1() called")
            "#
            , "", "")?;
        // ここでモジュールの中のfunction1にアクセスできるようになる
        let app_func: Py<PyAny> = module.getattr("function1")?.into();
        // 引数なしの関数として呼び出して返却値をそのまま返す。
        app_func.call0(py)        
    });
    println!("pyresult is {pyresult:?}");
}

```

### cargo run
```terminal
$ cargo run
Hello, World from Python!
function1() called
pyresult is Ok(Py(0x105d19d00))
```

これは超簡単な例だけど、基本の'き'です。



## 続き
https://qiita.com/ysuga/items/c5dacb0406db4e7dfebd
【Xcode】エラー `No such file or directory: '/Users/xxx/Library/Developer/Xcode/DerivedData/ （中略） /PackageFrameworks/AlamofireDynamic.framework/AlamofireDynamic'`

# どういう状況で起こったか

差分をマージした掲題のエラーが出てビルドできなくなった。

## やったけどダメだったこと

* クリーンビルド（cmd + shift + k）
* パッケージ入れ直し
* Xcode、PC再起動
* 別プロジェクトを立ち上げてAlamofireを入れてみたが問題なくビルドできた

## 解決方法

画像にあるリストから `AlamofireDynamic` を削除したらビルドできた（画像は消したあと）。

![スクリーンショット 2024-06-12 15.28.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413699/ca2916bd-9a91-813a-791e-dddea4819570.png)
Create React AppでTypeScriptを指定した場合の絶対パスの書き方

簡単に設定できるかと思いきや苦戦したのでQiitaに残しておきます。

## 設定方法
https://create-react-app.dev/docs/importing-a-component/#absolute-imports
記事内のAbsolute Importsというところを参考に設定すると簡単に絶対パス指定ができます。

## 追記
本当は@から始まるパスを書きたかったけど、色々試してもダメだったので大人しくリファレンス通りに設定しました。
Viteとかだとまた@から始まるパスを簡単にできるらしい。
ElasticSearch8でRangeクエリをJavaで書く

# はじめに

ElasticSearchのRangeクエリに躓いたのでまとめます

# 問題

ElasticSearchのRangeクエリを作ろうとしたのですがドキュメントなどもなく困りました

```kotlin
fun RangeQuery.toEsRequest(): Query {
    return RangeQuery.Builder()
        .field(key)
        .gte(null)
        .lte()
        .build()._toQuery()
}
```

`lte`には`JsonData`というものをいれるらしくよくわかりませんでした


# 解決方法

以下のように書くことでうまくクエリを作れました

```kotlin
fun RangeQuery.toEsRequest(): Query {
    return RangeQuery.Builder()
        .field(key)
        .gte(null)
        .lte(JsonData.of(max))
        .build()._toQuery()
}
```

# おわりに

Es8は本当にドキュメントがなさすぎるので色々大変です

# 参考

https://blog.csdn.net/PureIuck/article/details/134825078
Visual Studio Installer でプログラムメニューにショートカットを作成したら途中のフォルダが表示されない

## 何が起こったのか
スタートメニュー > すべてのアプリ で表示される内容に
[企業名] - [プログラム名] 
という階層で設定していたが、
すべてのアプリの直下に [プログラム名] が表示される。
[企業名]フォルダがどこかに飛んで行った。

## 原因
どうやらWindows11特有の事象らしい

https://jpwinsup.github.io/blog/2022/06/09/UserInterfaceAndApps/Windows11StartMenuFolder/

すべてのアプリの直下にフォルダを作成したい場合は、ショートカットを２つ以上作成するなどの対応が必要。

Windows10での動作については確認出来次第、追記予定。
PowerShellを使用したCP2102ドライバのインストール方法

# 概要
本記事では、Silicon LabsのCP2102 USB to UART BridgeのドライバをPowerShellを使用して一行のコマンドでダウンロード、解凍、インストール、およびクリーンアップする方法を詳しく解説します。この方法は、複数のシステムに対して迅速かつ効率的にドライバを導入する際に特に便利です。

# 使用するコマンド
PowerShellを管理者権限で実行して開いて、以下のコマンドを入力してください。
```powershell
Invoke-WebRequest -Uri "https://www.silabs.com/documents/public/software/CP210x_Universal_Windows_Driver.zip" -OutFile "$env:TEMP\CP210x_Driver.zip"; Expand-Archive -Path "$env:TEMP\CP210x_Driver.zip" -DestinationPath "$env:TEMP\CP210x_Driver"; pnputil /add-driver (Get-ChildItem -Path "$env:TEMP\CP210x_Driver" -Filter "*.inf" -Recurse).FullName /install; Remove-Item "$env:TEMP\CP210x_Driver.zip"; Remove-Item -Path "$env:TEMP\CP210x_Driver" -Recurse
```

# コマンドの解説
1. **ダウンロード (`Invoke-WebRequest`)**: 
   `Invoke-WebRequest` コマンドレットを使い、指定したURLからドライバのZIPファイルをダウンロードします。このファイルは一時ディレクトリに保存されます。

2. **解凍 (`Expand-Archive`)**:
   `Expand-Archive` コマンドレットを使用して、ダウンロードしたZIPファイルを同じ一時ディレクトリに解凍します。

3. **ドライバのインストール (`pnputil`)**:
   `pnputil` コマンドは、Windowsのツールで、ドライバをインストールまたは更新するのに使用されます。このステップでは、解凍したディレクトリ内から`.inf`ファイルを探し出し、それを使用してドライバをシステムにインストールします。

4. **クリーンアップ (`Remove-Item`)**:
   ダウンロードしたZIPファイルと解凍したフォルダを削除することで、不要なファイルをシステムから清掃します。

# メリット
- **効率性**: 複数の手順を一行のコマンドで実行することで、プロセスを大幅に簡略化し、時間を節約できます。
- **自動化の可能性**: このコマンドはスクリプトに組み込むことができるため、大規模な展開や定期的な更新が必要な環境での自動化が容易になります。
- **エラーの削減**: 手動でのインストールプロセスに比べてユーザーの入力ミスが減少するため、エラーが少なくなります。
WandB で作成済みの Run の情報を後から更新したい

[Weight & Biases (wandb)](https://www.wandb.jp/) は MLOps のためのプラットフォームであり，機械学習実験の管理や学習ログの可視化機能を提供しています

W&B を使う中で，過去の実験 (**Run**) を整理するために後からタグをつけたりグループ化したい場面があるかと思います．
W&B では GUI から過去の Run の情報を更新できない (?) みたいなので，
今回は Python で API を叩いて更新する方法を記事にします

## Python から Wandb API を叩く
まず，クライアントライブラリをインストールします
```bash
    pip install wandb
```

CLIで `wandb login` するか 環境変数`WANDB_API_KEY`にAPIキーを設定して認証を済ませておきます (ここまでは設定済みかと思います)

認証が終わったら API にアクセスするためのインスタンスを作成します
```python
    from wandb import Api

    # W&B APIを初期化
    api = Api()
```

### Run クラスのオブジェクトを取得する
過去の Run を更新するために Python のオブジェクトとして取得します

**`Run`オブジェクトを取得する場合**
`api.run`から Run のパスを指定して取得します．パスは Run を開いたときのURL `https://wandb.ai/<entity>/<project>/runs/<run_id>`で確認できます．あるいはブラウザから Run を開いて **Overview** タブ > **Run path** でも確認できます


```python
    project = 'project_name'
    entity = 'user_name'  # W&Bアカウントのユーザー名またはチーム名
    run_id = 'run_id'
    
    run = api.run(path=f"{entity}/{project}/{run_id}")
```

**`Runs`オブジェクトを取得する場合**
過去の Run から特定の条件にマッチするものを絞って取得することも可能です
config.dataset が CIFAR10 である Run を取得する場合は次のようにします
```python
    project = 'project_name'
    entity = 'user_name'  # W&Bアカウントのユーザー名またはチーム名

    filters = {"config.dataset": "cifar10"}
    runs = api.runs(path=f"{entity}/{project}", filters=filters)

    # runsはiterable
    for run in runs:
        print(run.name)
```

### Run の各種設定を更新する
Run オブジェクトのプロパティを直接更新すれば良いです．`run.update()`を呼び出せば更新した情報がブラウザ上のデータと同期されます

```python
    import time
    
    for run in runs:
        # configの更新 (nameのみ置き換わる)
        run.config.update({"name": "updated"})
        # tagの更新 (全てのタグが置き換わるので注意)
        run.tags = ["updated"]
        # groupの更新
        run.group = "updated"
    
        # データを置き換えたら同期する
        run.update()

        # 念の為APIサーバーに負荷をかけないようにしておく
        time.sleep(5)
```


## 参考
https://docs.wandb.ai/ja/ref/python/public-api/
LaravelでSlack通知をする世界で一番簡単な方法

LaravelでSlack通知するためにFacadeを設定したり色々ややこしいことをしている記事があるが、Laravelには標準でSlack通知できる機能が備わっています。便利。
# 手順
1 . Slackの Webhook URLを発行
https://api.slack.com/apps

2 . `.env` に以下を追加
```vim:.env
LOG_SLACK_WEBHOOK_URL="1.で発行したURL"
LOG_SLACK_USERNAME="Hello Slack"
LOG_LEVEL="debug"
LOG_STACK=single,slack
```

![aaa](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/c408d098-a2cd-d21e-ad22-8650fb8edc2a.png)


3 . `php artisan config:clear` で .env の設定更新
4 . `src/config/slack.php` を作成し、以下のように追加
```php:src/config/slack.php
<?php

return [
    'webhook_url' => env('LOG_SLACK_WEBHOOK_URL', ''),
    'sender_name' => env('LOG_SLACK_USERNAME',    ''),
    'level'       => env('LOG_LEVEL',        'debug'),
];
```
5 . `src/config/logging.php` の該当箇所を以下のように変更
```php:src/config/logging.php
        'stack' => [
            'driver' => 'stack',
            'channels' => explode(',', env('LOG_STACK', 'single')),
            'ignore_exceptions' => false,
        ],
        // ......
        'slack' => [
            'driver' => 'slack',
            'url' => config('app.slack.webhook_url'),
            'username' => config('app.slack.sender_name'),
            'level' => config('app.slack.level'),
            'emoji' => '',
            'replace_placeholders' => true,
        ],
```
6 . 呼び出す
```php:src/routes/web.php
<?php

use Illuminate\Http\Request;

use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Log;

Route::get('/slack', function (Request $request) {
    Log::info('Hello!');
});
```

7 . 出力結果
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/03e0da29-28e5-1069-d2c9-95865dbc561a.png" width="500">


## 補足

### slack app で作成したアプリの Webhook URL ではアイコンを設定することはできない
[Making it fancy with advanced formatting/Sending messages using incoming webhooks](https://api.slack.com/messaging/webhooks#advanced_message_formatting) 

の末尾に書いている。
アプリアイコンが表示される。
> You cannot override the default channel (chosen by the user who installed your app), username, or icon when you're using incoming webhooks to post messages. Instead, these values will always inherit from the associated Slack app configuration.


### .env で設定している`LOG_LEVEL`が、`src/config/logging.php` の `syslog.level`と `slack.level` の高い方より低く設定していると、Slackに出力されない
ログレベルは、

（高）emergency、alert、critical、error、warning、notice、info、debug（低） 

という順番になっている。両方debugに設定するとどんなlevelでも出力される。

```
# 設定例
# .envで設定したLOG_LEVELがそれぞれのLevelでSlack出力されるか

（高）        syslog.level      slack.level     .env/LOG_LEVEL
emergency                                        出力される
alert                                            出力される
critical      syslog                             出力される
--------------------------------------------------------------
error                           slack            出力されない
warning                                          出力されない  
notice                                           出力されない
info                                             出力されない
debug                                            出力されない
（低）
```
参考：[Laravel 11.x ログ](https://readouble.com/laravel/11.x/ja/logging.html)
Azure AIのCustom Speechのトレーニングで The dataset is not suitable for this operation.が出る

## カスタムモデルを作ろうとしたらエラーが出る
音声テータセットをこつこつエディターで弄り、それをトレーニング用にアップロードしようとしたら`The dataset is not suitable for this operation.`との表示
ドキュメント上では問題なさそう。
調べたところ以下のようなものが

https://learn.microsoft.com/en-us/answers/questions/1302590/why-does-my-audio-dataset-not-work-for-training-a


>Karin Hedberg
15Reputation points
Mar 18, 2024, 5:40 PM
@Elizabeth if I recall correctly, there was an error in the Microsoft documentation. See my answer to Qossay just above your message. Meaning all of the files in your input package of audio files individually need to adhere to a 60 second limit, no matter what the documentation says.

どうも60秒以上のものは学習に使えないらしい。
【Ruby初級】クラスメソッドを用いて野菜の金額を表示する

# 問題
以下の要件を満たすVegetableクラスを実装しましょう。

### 条件
##### クラスメソッド
メソッド名：description
処理："新鮮で美味しい野菜です"と表示する

##### インスタンス変数
name：野菜の名前
color：野菜の色

##### インスタンスメソッド
メソッド名：initialize
処理：引数で名前と色を受け取り、インスタンス変数に代入します。

メソッド名：details
処理："【名前】は【色】です"と表示します。


### 雛形
```ruby
class Vegetable
  def クラスメソッド
    # 正しくメソッドを定義した上で、ここに処理を記入してください
  end

  def initialize
    # ここに処理を記入してください
  end

  def インスタンスメソッド
    # 正しくメソッドを定義した上で、ここに処理を記入してください
  end
end

# 3つのインスタンスを生成してください

# クラスメソッドを呼び出し、「新鮮で美味しい野菜です」と表示してください
# インスタンス毎にインスタンスメソッドを呼び出し、「【名前】は【色】です」と表示してください
```

期待している実行結果例
```
新鮮で美味しい野菜です
キャベツは緑色です
トマトは赤色です
にんじんはオレンジ色です
```

# 回答
```ruby
class Vegetable
  def self.description
    puts "新鮮で美味しい野菜です"
  end

  def initialize(name, color)
    @name = name
    @color = color
  end

  def details
    puts "#{@name}は#{@color}です"
  end
end

# 3つのインスタンスを生成してください
cabbage = Vegetable.new("キャベツ", "緑色")
tomato = Vegetable.new("トマト", "赤色")
carrot = Vegetable.new("にんじん", "オレンジ色")

# クラスメソッドを呼び出し、「新鮮で美味しい野菜です」と表示してください
Vegetable.description

# インスタンス毎にインスタンスメソッドを呼び出し、「【名前】は【色】です」と表示してください
cabbage.details
tomato.details
carrot.details
```

# 解説
##### クラスメソッドの定義
```ruby
def self.description
  puts "新鮮で美味しい野菜です"
end
```
クラスメソッド`self.description`を定義し、「新鮮で美味しい野菜です」を表示します。

##### インスタンス変数の初期化
```ruby
def initialize(name, color)
  @name = name
  @color = color
end
```
`initialize`メソッドで、インスタンス変数`@name`と`@color`を初期化します。

##### インスタンスメソッドの定義
```ruby
def details
  puts "#{@name}は#{@color}です"
end
```
`details`メソッドで、インスタンス変数`@name`と`@color`を使って指定された形式で出力します。

##### インスタンスの生成
```ruby
cabbage = Vegetable.new("キャベツ", "緑色")
tomato = Vegetable.new("トマト", "赤色")
carrot = Vegetable.new("にんじん", "オレンジ色")
```
Vegetableクラスのインスタンスを3つ生成し、それぞれに名前と色を渡します。

##### クラスメソッドの呼び出し
```ruby
Vegetable.description
```
クラスメソッド`description`を呼び出して、"新鮮で美味しい野菜です"と表示します。

##### インスタンスメソッドの呼び出し
```ruby
cabbage.details
tomato.details
carrot.details
```
各インスタンスに対して`details`メソッドを呼び出し、それぞれの名前と色を表示します。
自動テストの秘訣: テストメソッドを独立させる

この記事では xUnit （PHPUnit や JUnit など）を使った自動テストを作成する上での秘訣をご紹介します。

今回ご紹介する秘訣は「テストメソッドの独立」についてです。

## 独立していないテスト

サンプルとして、以下のようなメールアドレスを登録する機能について考えてみましょう。

- `register()` メソッドで、メールアドレスをDBに登録する。
- 登録時、アドレスが登録済みのものと重複している場合はエラーメッセージを返す。

これをテストするコードは、例えば以下のようになります。（PHP で書かれています。）

~~~php
public class SampleTest extends TestCase
{
    /** テスト対象 */
    private $testing;

    public static function setUpBeforeClass(): void
    {
        // ... DB を初期化する
    }

    public function setUp(): void
    {
        $this->testing = ... ;  // テスト対象を生成する
    }

    /** 登録が成功することを検証する。 */
    public function testRegister(): void
    {
        $result = $this->testing->register('my-email@example.com');
        $this->assertSame(200, $result->getStatus());
        $this->assertSame('成功!', $result->getMessage());
    }

    /** メールアドレスが重複している場合はエラー */
    public function testEmailDuplicated(): void
    {
        $result = $this->testing->register('my-email@example.com');
        $this->assertSame(400, $result->getStatus(), '重複したメールの登録は失敗するべき。');
        $this->assertSame('メールアドレスが重複しています。', $result->getMessage());
    }
}
~~~

`testRegister()` で登録したメールアドレスを `testEmailDuplicated()` で再度登録し、重複エラーが発生するケースを検証しています。

一見して問題ないように見えますが、このテストは1つ大きな問題が存在します。以下のように `testEmailDuplicated()` だけを実行すると、テストが失敗するのです。

~~~php
phpunit --filter SampleTest::testEmailDuplicated
~~~

先ほどの例ではテストメソッドが2つだけですが、さらにテストメソッドが増えた場合はどうなるでしょうか？ テストAがテストBに依存していて、そのテストBがテストCやDに依存していたとしたら……？

このように、テストメソッド同士が依存するとそれを修正するのが大変になり、余計な時間がかかるのです。

そうならないためには、各テストメソッドを独立させる必要があります。

## 独立したテスト

先ほどのテストを書き直したものが、以下になります。

~~~php
    /** 登録が成功することを検証する。 */
    public function testRegister(): void
    {
        $result = $this->testing->register('my-email@example.com');
        $this->assertSame(200, $result->getStatus());
        $this->assertSame('成功!', $result->getMessage());
    }

    /** メールアドレスが重複している場合はエラー */
    public function testEmailDuplicated(): void
    {
        $this->testing->register('test-duplicated@example.com');
        $this->assertSame(200, $result->getStatus(), '1度目の登録は成功するべき。');
        
        $result = $this->testing->register('test-duplicated@example.com');
        $this->assertSame(400, $result->getStatus(), '2度目の登録は失敗するべき。');
        $this->assertSame('メールアドレスが重複しています。', $result->getMessage());
    }
~~~

先ほどの例とは違い、 `testEmailDuplicated()` のみでテストを実行しても成功します。

このように**独立したテストを書くことで、テストが複雑化するのを防ぎ、その後の修正が容易になる**のです。

ちなみに、独立したテストメソッドとは以下のようなものです。

- テストメソッドを単体で実行しても正しく動作する。
- テストメソッドの実行順を変えても正しく動作する。

## まとめ

各テストメソッドを独立させることで、その後のテスト修正が容易になり、時間の節約になります。

他のテストで作られたデータや結果に依存しないよう、注意してテストを作りましょう！
Visual Studio Installer で作成したショートカットにアイコンが反映されない件

## いきさつなど
社内で使用するツールを作成した際、インストーラー形式で配布することになった。
せっかくなのでインストール時にショートカットを作成。
そのショートカットにアイコンの設定をしたところ反映されなかった。

## 設定した内容
#### 以下の設定でインストーラーのプロジェクトを新規作成
* Setup Wizard プロジェクトをソリューションに追加
* Create a setup for a Windows Application を選択
* プライマリ出力を選択

#### 上記の後、以下の対応を実施
* ショートカットを User's Desktop 及び User's Programs Menu に追加
* それぞれのショートカットの Icon プロパティを設定
その際に .ico ファイルを直接指定した

その後、ソリューションのビルドを行いセットアップファイルを作成。
試しにインストールを実施したが、
デスクトップやプログラムメニューに作成されたショートカットのアイコンが既定のものになっていた。

## 最終的にどうしたのか
アイコンを指定する際に、.ico ファイルではなく、.exe ファイル (プライマリ出力) を選択する。

## 参考
* 以下のアイコン設定の項 (導入から作成まで一通り載ってました)

https://www.osadasoft.com/visual-studio-2022%E3%81%A7%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%A9%E4%BD%9C%E6%88%90/

* .ico ファイル自体に問題があったケースも

https://blog.yuizi.com/2019/12/shortcut-icon.html
x≧0,y≧0,x3-xy+y3=1を満たすx+yの最大値,最小値「1998 学習院大学」をChatGPTとWolframAlphaとsympyでやってみたい。



・私は、3年前あきらめていた問題でした。
　今回再チャレンジしましたが、あきらめました。
・WolframAlphaで3Dプロットがでます

# オリジナル
MathLABO 様 (0:00〜10:29)

https://youtu.be/ZrKcmeTsJus

大学入試数学問題集成＞未登録

# ChatGPT-3.5先生へ(1回目)できませんでした。

```
x>=0,y>=0,x3-xy+y3=1を満たすx+yの最大値,最小値を求めよ.
```

？？？　3年前
＞...SciPyのminimize関数を使用して...

今回
？？？ x+y の最大値は 1、最小値は 2/2**(1/3) です。


# ChatGPT-3.5先生へ(2回目)できませんでした。
```
x>=0,y>=0,x3-xy+y3=1を満たすx+yの最大値,最小値をsympyを使って求めよ.
```
？？？したがって、与えられた条件のもとで、x+y の最大値と最小値はどちらも 2 です。
```
本当ですか
```
途中突然英語になりました。
```
日本語で
```

x+y=2 が最大値および最小値の解である可能性が高いです。

あきらめました。


# WolframAlphaで
＞私の環境で
＞標準の計算時間制限を超えました...

https://www.wolframalpha.com/input?i=x%3E%3D0%2Cy%3E%3D0%2Cx3-xy%2By3%3D1%2Cx%2By%E3%81%AE%E6%9C%80%E5%A4%A7%E5%80%A4%E3%81%A8%E6%9C%80%E5%B0%8F%E5%80%A4&lang=ja

最大値
(x, y) = (1, 1) のとき, max{x + y|x>=0 ∧ y>=0 ∧ x^3 - x y + y^3 = 1} = 2
最小値
(x, y) = (0, 1) のとき, min{x + y|x>=0 ∧ y>=0 ∧ x^3 - x y + y^3 = 1} = 1
(x, y) = (1, 0) のとき, min{x + y|x>=0 ∧ y>=0 ∧ x^3 - x y + y^3 = 1} = 1

https://www.wolframalpha.com/input?i=x3-xy%2By3%3D1%2Cx%2By%E3%81%AE%E6%9C%80%E5%A4%A7%E5%80%A4%E3%81%A8%E6%9C%80%E5%B0%8F%E5%80%A4&lang=ja

(制限なしだと、)3Dプロットがでます
最大値
(x, y) = (1, 1) のとき, max{x + y|x^3 - x y + y^3 = 1} = 2
最小値
最小値は決まりませんでした。

# sympyで(オリジナル 様の方法を参考に)
勉強中



# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

# いつもと違うおすすめです。

https://qiita.com/mrrclb48z/items/f13b657078bdee1c20f2
【Suno AIでつくった楽曲】父の日に贈る、3拍子のアコースティックソングが描く父との風景【動画 2分50秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![99 サムネイル 【Suno AIでつくった楽曲】父の日に贈る、3拍子のアコースティックソングが描く父との風景【動画 2分50秒】.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/28fa6eac-db16-6d78-3cb7-10a7fe816682.png)



* # 動画URL
    * https://youtu.be/sZsJFeEX6es

<br>

* # 動画タイトル
    * 【Suno AIでつくった楽曲】父の日に贈る、3拍子のアコースティックソングが描く父との風景【動画 2分50秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2024-06-11(火)

Suno AIとは、文章から音楽を生成することができるAI( Text-to-Music-AI )です。
わたしは、2024-04-02(火)に初めてSuno AIで有償プランを契約してから、時々楽曲をつくって遊んでいます。

🎦【Suno AI】文章から音楽を生成するAI( Text-to-Music-AI )で、3分間で2曲、6分間で4曲作りました【試聴可能】1)伴侶の曲 2)税理士の曲【動画 16分11秒】
https://youtu.be/QKfhk4HgQ_g

🎦“Suno AIでつくった楽曲”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe

🎦“効果的にSuno AIを活用するヒント”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


今回は、Suno AIでつくった曲をMP3で出力してから、動画編集いたしました。
ぜひ聴いてみてください。
そして、ぜひみなさんも、あなたがつくった楽曲を愛する家族に贈ってみてください！

作曲日:
2024-06-11(火)

契約の種類:
Pro Plan

楽曲の正式名称:
父の日に贈る歌 2024年版

Suno AI Library URL:
https://bit.ly/suno-Fathers-Day-Song-2024

Custom Mode: On

With Vocals:


---


Lyrics:

[Intro]

[Verse]
いつも、いつも
心のささえとなってくれた
感謝の気持ちを込めて
父よ、ありがとう

[Verse 2]
過ぎ去った日々を思い出す
あの笑顔、優しい言葉
どんな時も励ましてくれた
僕のヒーロー

[Chorus]
父の日のメロディを奏でよう

[Outro]


---


Suno AIへの指示文章( プロンプト/Prompt ): Custom Modeの場合は”Style of Music”を指定します。


🇬🇧English

[Around 80sec][Piano][Ballad,Enka,Jazz,Adult][female][Acoustic guitar][Down Tempo]


🇯🇵日本語訳

[約80秒][ピアノ][バラード、演歌、ジャズ、大人向け][女性][アコースティックギター][ダウンテンポ]


---


Suno AI 公式URL
https://accounts.suno.ai


---


✓ 🎥この動画と関連が強いわたしの動画 ↙
　・“Suno AIでつくった楽曲”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe


　・“効果的にSuno AIを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


✓ 🎥Shortened URL for this video | この動画の短縮URL ↙
　https://bit.ly/3yXGZbT
Rubyでハッシュを文字列にできるのに文字列をハッシュにできなくて困りました

# 結論
`eval`を使えば大体できる。使い所は`testコード`。
# 背景
ハッシュを文字列にしたログの出力結果をminitestで検証しようとした時に、文字列をハッシュに変換し、各項目に正しく値が入っていることを確認しようとした時でした。
**文字列に対してto_hashしようとしてもエラーになる。**
ハッシュオブジェクトに`to_s`すると文字列になるのに、文字列に対して`to_hash`するとエラーになります。
どうすれば文字列をハッシュに変換できるか、私なりに考えてみました。
# evalを使う
evalを利用すると簡単に文字列をハッシュに変換することができます。
```ruby
hoge_hash = { key1: 'hogehoge', key2: 999 }
# => {:key1=>"hogehoge", :key2=>999}
hoge_string = hoge_hash.to_s
# => "{:key1=>\"hogehoge\", :key2=>999}"
eval(hoge_string)
# => {:key1=>"hogehoge", :key2=>999}
```
以上で大体の文字列からハッシュへの変換は簡単にできます。
しかし次のようなハッシュの場合はどうでしょうか？
```ruby
hoge_hash = { key1: Time.current, key2: Date.today }
# => {:key1=>Tue, 11 Jun 2024 09:33:55.541579252 JST +09:00, :key2=>Tue, 11 Jun 2024}
```
時関系の型の出力値は半角スペースがあるのでevalでうまく行かなそうです。
実際にやってみましょう。
```ruby
hoge_hash = { key1: Time.current, key2: Date.today }
# => {:key1=>Tue, 11 Jun 2024 09:33:55.541579252 JST +09:00, :key2=>Tue, 11 Jun 2024}
hoge_string = hoge_hash.to_s
# => "{:key1=>Tue, 11 Jun 2024 09:33:55.541579252 JST +09:00, :key2=>Tue, 11 Jun 2024}"
eval(hoge_string)
# (irb):3:in `eval': (eval):1: syntax error, unexpected constant, expecting => (SyntaxError)
# {:key1=>Tue, 11 Jun 2024 09:33:55.541579252 JST ...
```
やはりエラーが発生しました。
これに対し、今回はこのような時間系のデータがある場合のケースに対応する方法も考えてみたいと思います。

# 時間系のデータにも対応する
今回は値が確認さえできれば値の方は問わないので時関係の方が文字列で取得できても問題ないこととしました。

```ruby
def string_to_hash(hash_string)
  time_fix = hash_string.gsub(/(.{3}, \d{1,2} Jun \d{4} \d{2}:\d{2}:\d{2}.\d+ JST \+\d{2}:\d{2}|.{3}, \d{1,2} Jun \d{4})/) do |match_string|
    "'#{match_string}'"
  end
  eval(time_fix)
end
```
いい方法を考え付かなかたので愚直に正規表現を利用し、Time型とDate型の記述を文字列型に置き換えることにしました。
他にいい方法がある方はコメントいただけると幸いです。
# evalは実行内容をコントロールできるときに使う
evalをコードで見つけたら無条件に拒絶してしまいがちですがその理由はなぜでしょうか。
私は以下のように思います。

**eval実行内容を動的に変化させる時に、悪意のあるプログラムが実行される可能性がある**

外部の通信から受け取ったパラメータをevalに食わせることで簡単に脆弱なシステムが出来上がります。パラメータに悪意のあるプログラムを入れられるとそのままevalがそれを実行してしまうからです。
それを回避するために、evalの利用はどのような内容が実行されるかが確定しているtestコードの利用に留めておくのがいいのではないかと私は思いました。
【Ruby初級問題】それぞれの野菜の重さは合計いくつ？

# 問題
以下のように、野菜の名前と重さが入った配列があります。この配列を用いて、野菜の名前とそれぞれの総重量が出力されるコードを記述してください。

```ruby
veggies_weight = [["carrot", [120, 150, 130]], ["potato", [200, 250, 180]], ["onion", [100, 80, 90, 110]]]
```

### 出力例
```
carrotの総重量は400グラムです"
```
## ヒント
`sum`メソッドを使いましょう。
リスト内のすべての値を合計してくれます。

### 例
```ruby
banana_price = [100, 100, 100]

 puts banana_price.sum
 # 出力結果「300」
 ```

 # 回答
 ```ruby
 veggies_weight = [["carrot", [120, 150, 130]], ["potato", [200, 250, 180]], ["onion", [100, 80, 90, 110]]]

 veggies_weight.each do |veggie|
   name = veggie[0]
   weights = veggie[1]
   total_weights = weights.sum
   puts "#{name}の総重量は#{total_weight}グラムです"
 end
```

# 解説
```ruby
veggies_weight.each do |veggie|
```
eachメソッドを使って、配列の各要素（野菜の名前とその重さのリストのペア）に対して処理を行います。
|veggie|は、各要素を受け取るためのブロック変数です。

```ruby
name = veggie[0]
```
veggieは配列の各要素を指します。
veggie[0]は、その要素の最初の部分（野菜の名前）を取り出します。
```ruby
weights = veggie[1]
```
veggie[1]は、その要素の2番目の部分（重さのリスト）を取り出します。

```ruby
total_weight = weights.sum
```
weightsは重さのリストです。
sumメソッドを使って、リスト内のすべての重さを合計します。
```ruby
puts "#{name}の総重量は#{total_weight}グラムです"
```
putsメソッドを使って、結果を出力します。
`#{name}と#{total_weight}`は、それぞれ野菜の名前と総重量を文字列の中に埋め込むための記法です。
参画して一週間経ちました 

お疲れ様です。
今年の4月に未経験でIT業界に転職しました。
新人研修(1ヶ月)と自己研鑽&参画面談期間(1ヶ月)を経て今月から参画しております。
戦々恐々と過ごしていたら1週間経ったのであった事を文章化します。

# 現在の装備
* 若干あるCCNAの知識。
* ITILV4の参考書をさらっと読んだ知識。
* 1ヶ月間の広く浅いIT研修で得た知識。

# 未知との遭遇
現場は別の星に来たかもと思うレベルで宇宙語が飛び交ってます。意味不明の連続ですが、研修で習った事が目の前で巻き起こるのでこれを言ってたのかー！となります。
「わからない」を打破するために聞くしかないのですが、聞いても経験無さすぎてわからないです。現時点でどれだけ理解していれば良いか、現場の人に聞いてみると良いです。
あと皆さん忙しそうで、頭を抱えながらお仕事されてます。ですが、忙しそうだから、は聞かない理由にはなりません。聞かない方がウン千倍まずいので聞きましょう。

# 手順書は自分で作るもの
到底手順書とは言い難い、概念を宇宙語で記されたものを渡されました。
質問しながら手順書を自分で作りましょう。
自分で人語に訳す作業は理解が深まります。

# セキュリティ意識
現場の方が1番口酸っぱく言うことです。
セキュリティカードは無くさないこと、パスワードをきちんと管理すること、他にも様々なルールがありますが、セキュリティさえ守れば大丈夫です。

# オススメ本
現場の方から借りました。
宇宙語を人語に直訳してる感じではなく、人間に分かりやすく砕いて解説してます。
鈍器のような参考書を読む前にこれを読むと良いです。(鈍器から手をつけて挫折しました)
[ゼロからわかるネットワーク超入門ー基礎知識からTCP/IPまで　改訂第3版](https://books.rakuten.co.jp/rb/17559017/?scid=we_bks_genre_all_pla-all-shopping_20230919)

# 最後に
周りの方が色々な事を教えてくださるのでめちゃくちゃ助かってます。
わからないことを前提にやってみよー！というノリなので分からない事を言いやすいです。
みんな最初はわからないよ！と言っていただけるのが救いですが、分からない事を申し訳なく思います。申し訳なさを糧に頑張ります。
周りの人に大変恵まれているのですが、それでも不安です。
周囲への申し訳なさと自分の理解の遅さで発狂してしまったらどうしようと思いますが、Crane&Iは相談しやすい環境なので、発狂せずに済んでいます。本当にありがとうございます。
対話を重ねながら理解を深めていきたいです。

ここまで読んでくださりありがとうございます。
Lama-CleanerをSD A1111に統合してインストールする方法について 

Lama-Cleanerは、Adobe Fireflyにほぼ近い機能を持つ画像修正用のオープンソースAIで、今ではStable Diffusionによる画像生成と組み合わせて使用することが一つの定番といってもいいAIと言えます。

実際、SD A1111用の拡張機能(https://github.com/aka7774/sd_lama_cleaner
)も公開されており、この拡張機能を使用すればA1111に統合した形で、Lama-Cleanerをインストールすることも可能です。

しかし、この拡張機能にはいくつか弱点もあります。

Lama-CleanerもまたSDと同様にPythonを使用して動作するAIである為、当然CUDAを使用した方が高速に動作しますが、A1111用のLama-Cleanerはデフォルト設定ではCUDAを使用しないcpuモードで起動します。
(但し、拡張機能そのものの設定を弄ればCUDAモードで起動させることは可能です)

更に、これが大きいのですが、拡張機能を介してLama-Cleanerを使用する場合には「A1111を起動させてからLama-Cleanerを別途立ち上げる」という条件が付くために、Lama-Cleaner単体を起動させることが出来ません。

確かにLama-CleanerはSDと組み合わせて使用することが多いAIですが、SDとは無関係に画像修正にも使えるツールであり、出来うれば単体で起動できるようにしておきたいところです。

また、Lama-Cleanerが使用できるPythonライブラリーに関しても、初期状態では不足している部分があるので、それらの問題を解決する形でLama-CleanerをA1111に統合する形でインストールする方法について記述していきます。

...

その前に何故「統合」に拘るかと言いますと、A1111とLama-Cleanerを別個に仮想環境を構築してインストールした場合、それだけでストレージ消費が数GB単位で増加してしまうからです。

PytorchだけでもCUDA用ならば約3GBある訳で、A1111もLama-Cleanerも使用しているPythonライブラリーは共通の部分が多いのであれば、統合してしまった方が合理的だからです。

...

それでは本題に入っていきますが、A1111はインストールが完了している前提で以下解説します。かつForgeでも、以下の手法は完全に適用可能です。

また、この手法においてはA1111乃至はForgeにLama-Cleaner用の拡張機能をインストールする必要はありません。

まず下図のように、powershellを起動してA1111の仮想環境をアクティベートし、「pip install lama-cleaner」と入力して実行します。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661150/22113768-3acd-7449-a9a6-e10726d5f138.png)

次に下図のように、「pip uninstall -U diffusers」と入力して実行します。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661150/45f0a59b-9590-a3ae-4654-1fe61cf703b5.png)

次に下図のように「pip install -U transformers==4.30.2」と入力して実行します。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661150/85785055-51aa-ef05-4e6d-3057f50e29b6.png)

Lama-Cleanerをインストールした際に、tansformersとdiuffusersは強制的に古いバージョンに置き換わってしまう為、ここで元のバージョンに戻す作業をする訳です。

次に下図のように、「pip install realesrgan」と入力して実行します。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661150/d47b50b1-cbe6-2e0d-a1f6-c99e1c79e606.png)

次に下図のように、「pip install rembg」と入力して実行します。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661150/6d6f1586-3d95-9ffc-e377-2f37c95afefd.png)

次に、起動用のバッチファイルを下図のようにSDのインストールフォルダ「stable-diffusion-webui」に作成していきます。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661150/07f6b2f6-4967-a8f6-9123-a33d5f1bdd5c.png)

作成するバッチファイルの記述は以下の通り。

@echo off
start http://localhost:7870/
call venv\Scripts\activate
echo http://localhost:7870/
lama-cleaner --model=lama --port=7870 --device=cuda
popd

作成したバッチファイルをダブルクリックすると、下図のようにWebUIが起動し、Lama Cleanerを使用できるようになります。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661150/f42afd05-cdd7-cf9f-51cc-a9fa304929da.png)

A1111の仮想環境に統合する形でありつつも、A1111を起動せずとも単独でLama-Cleanerが利用できるようになります。
【Rails】FontAwesomeのCDN読み込みと使い方

## はじめに
この記事では、「Font Awesome」のCDN(Contents Delivery Network)を使った読み込み方法と基本的な使い方についてまとめました。
SNSのアイコンや設定、編集、削除などの機能をアイコンで表現する際に、Font Awesomeは非常に便利です。自前でアイコンを作成する手間を省き、豊富なアイコンライブラリを簡単に活用できる方法をお伝えします。

この記事が皆さんの役に立てば幸いです。

## 環境
- rails
- docker
- taiwindcss

## Font Awesomeセットアップ

まずはFont Awesomeの公式ページにアクセスし、アカウントを作成します。

https://fontawesome.com/

登録後、以下の手順で自分用のCDNリンクを取得します。

### 1.ヘッダーメニューまたは画面中央の「**Your Kits**」をクリックします。

![スクリーンショット 2024-06-12 10.26.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772961/2f0d166a-62f2-e382-91ef-d5a9c5ddef28.png)

### 2.自分のKitsをクリックします。

![スクリーンショット 2024-06-12 10.30.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772961/1f7e0502-80d0-f1f9-2c7a-9d1fb4355a1e.png)

### 3.スクロールして「**Set Up**」タブをクリックし、表示されたCDNリンクをコピーします。

![スクリーンショット 2024-06-12 10.35.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772961/c5af8e79-f2b0-55eb-9f00-3c5843d60353.png)


### 4.これを自身の```app>views>layouts>application.html.erb```に貼り付けます。
```application.html.erb
<!DOCTYPE html>
<html>
  <head>
    省略
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>
    <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
    <%= javascript_include_tag "application", "data-turbo-track": "reload", type: "module" %>
    
    <!-- Font AwesomeでコピーしたCDNリンクを貼り付ける -->
    <script src="https://kit.fontawesome.com/あなたのCDNリンク" crossorigin="anonymous"></script>
  </head>

  <body>
    <%= yield %>
  </body>
</html>
```

これでセットアップ完了です。

## 使いたいアイコンを探してコピー

ヘッダーメニューの「**Icons**」をクリックし、使いたいアイコンを探します。例えば、設定用の歯車アイコンは「**gear**」、編集用は「**pen**」、削除用のゴミ箱アイコンは「**trash**」で検索できます。

[![Image from Gyazo](https://i.gyazo.com/a90d5230b2a4a479a4a63582338ab8a1.gif)](https://gyazo.com/a90d5230b2a4a479a4a63582338ab8a1)

アイコンをクリックすると、色々な設定が可能なので、試してみてください。

## 記述方法

### 通常使用

アイコンを使用するには、以下のように記述します。

```
<i class="fa-solid fa-trash"></i>
```
クラスを追加して色やサイズを変更することも可能です。
```i class="〜"```に追記します。
```
<i class="fa-solid fa-trash fa-lg text-blue"></i>
```

サイズや色に関しては、Font Awesomeが提供するクラスや自身のCSSを使ってカスタマイズできます。私の場合、Tailwind CSSを使用しているので、そのクラスを当てています。

他にも回転や反転させることもできたりするので調べてみてください。

https://saruwakakun.com/html-css/basic/font-awesome#san2

### link_toでの使用
アイコンをクリックして画面遷移させたい場合、```link_to```を使用します。
```
<%= link_to root_path do %>
    <i class="fa-brands fa-instagram"></i>
<% end %>
```

私の場合、以下のようにして編集と削除のアイコンをセットにしました。

```
<div>
    <%= link_to edit_path do %>
        <i class="fa-solid fa-pen text-blue"></i>
    <% end %>
    <%= link_to boards_path(board), method: :delete, data: { turbo_method: :delete, turbo_confirm: "削除しますか？", class: 'ml-2' do %>
        <i class="fa-solid fa-trash text-blue"></i>
    <% end %>
</div>
```
## おわりに 
今回は、初歩的なFont Awesomeの使い方についてまとめました。私のやり方がすべて正しいわけではありませんが、参考になれば嬉しいです。もし、この記事の内容に不備や改善点などがありましたら、ご指摘いただけると幸いです。

素敵なアイコンを活用して、アプリ開発を楽しんでください！

## 参考

https://fontawesome.com/

https://saruwakakun.com/html-css/basic/font-awesome#san2
OPPO Reno7A に気圧計がなかった話

https://dailyportalz.jp/kiji/love-atmospheric-pressure

これで紹介されていた気圧計が3万円と高く、気軽には買えないなーと。

https://www.amazon.co.jp/dp/B00JBFNNVS/

以前、iPhoneを使っていたときはWidgetで気圧を測るものがあり、最近のスマホにはだいたいついているという話を聞いたので、termuxでセンサーの値を取ってきてゴニョゴニョすればいいと思いつく。

```
termux-sensor -l
```
```
{
  "sensors": [
    "bmi26x Accelerometer Non-wakeup",
    "mmc56x3x Magnetometer Non-wakeup",
    "Rotation Vector  Non-wakeup",
    "bmi26x Gyroscope Non-wakeup",
    "stk32600 Proximity Sensor Wakeup",
    "gravity  Non-wakeup",
    "linear_acceleration",
    "Rotation Vector  Non-wakeup",
    "mmc56x3x Magnetometer-Uncalibrated Non-wakeup",
    "Game Rotation Vector  Non-wakeup",
    "bmi26x Gyroscope-Uncalibrated Non-wakeup",
    "sns_smd  Wakeup",
    "pedometer  Non-wakeup",
    "pedometer  Non-wakeup",
    "sns_geomag_rv  Non-wakeup",
    "pick_up_motion  Wakeup",
    "device_orient  Non-wakeup",
    "stationary_detect",
    "motion_detect",
    "bmi26x Accelerometer-Uncalibrated Non-wakeup",
    "OPLUS Fusion Light Sensor",
    "OPLUS Side Panel Fusion Light Sensor",
    "sensor_logger  Non-wakeup",
    "sx933x Sar Sensor Wakeup",
    "lux_aod  Wakeup",
    "stk32600 wise Light Sensor Non-wakeup"
  ]
}
```
気圧計のセンサーはなかった。こんなもんかもしれん。
気圧計は高度の参考データとして、GPS測定の補助に使われるらしい。

気圧計が入っていない端末では、アンドロイドアプリの気圧計は近隣の気圧データを参照するよう（頭痛ーるの気圧データはそれから取ってきているっぽい）。
偏頭痛持ちのため、気圧データを集積して頭痛との関連を調べてみようと思っていた。この目的なら近隣の気圧データの蓄積でも問題なさそう。
指定したdataset配下のTBの有効期限を一括で"none"にするシェル



```bash
#!/bin/bash

PROJECT_ID=任意のもの
DATASET_ID=任意のもの
NEW_EXPIRATION="none"

TABLES=$(bq ls --project_id=$PROJECT_ID --dataset_id=$DATASET_ID --format=json | jq -r '.[] | .tableReference.tableId')

for TABLE in $TABLES; do
    bq show --format=prettyjson $PROJECT_ID:$DATASET_ID.$TABLE > schema.json
    jq '.expirationTime = "'$NEW_EXPIRATION'"' schema.json > temp.json
    bq update --source=temp.json $PROJECT_ID:$DATASET_ID.$TABLE
    rm schema.json temp.json
done
```
「1冊目の技術書」が学習効率を上げる

## はじめに

◆この記事は何？
技術書の選び方・読み方を紹介する記事です

私は年間50冊以上の技術書を読みます。
その経験をお伝えできればと思います。

◆対象
エンジニア
特に技術書の読み方を確立できていないエンジニア

## 先に結論
- 初学者は「1冊目の技術書」が重要
- 「1冊目の技術書」を選ぶときには**基礎**の観点を気をつける
    - 「何が基礎なのか」が分かる本
    - 「基礎を理解できそう」と内容を読まずに感じられる本
    - 事前にリサーチしてロードマップを探す

## 「1冊目の技術書」が重要

初学者は「1冊目の技術書」が重要です。

ある技術領域を学びたいとき、たとえ名著であっても初学者にとっては難しいことがあります。

まずは適切な難度の「1冊目の技術書」を読む方が、学習効率は良くなる場合があります。

初学者の段階では、次のような本をおすすめします。
- **「何が基礎なのか」が分かる本**
- **「基礎を理解できそう」と感じられる本**
- ロードマップ等で**入門向けに推奨**されている本

初学者は基礎を積み上げていくと効率が上がります。

分からない単語を減らし、分かることを増やしていきます。
結果、学習するモチベーションの維持にもつながります。

ゆえに、**基礎の観点**で「1冊目の技術書」を選ぶのが有効です。

初めて技術書を選ぶ新人の方は、感触がよく分からないかもしれません。
webで検索すると、書籍のロードマップが作成されていることがあります。
購入前にロードマップを探すのも有効です。

参考

https://qiita.com/mkt_hanada/items/d08e409fe90e829f5d34

## 私のセキュリティの1冊目

例えば、私がセキュリティ分野を学んだときの1冊目は[「教育系YouTuberまさるの情報処理安全確保支援士１冊目の教科書」](https://amzn.asia/d/72cu1XG)でした。

この本の特徴は次のとおりです。
- 本当に重要な**基礎を取捨選択**していること
- 解説が平易であること
- 図解がわかりやすいこと
- 学ぶ順番が練られており、章立てが良く、学習効率が良いこと
- [Youtube](https://www.youtube.com/@masaru-study)にも解説があり、**「分かりそう」と感じられる**こと

批判的に読めば、「難しい内容を掲載していない」とも言えます。
しかし「1冊目の技術書」としては、基礎を効率よく学べるため、「難しい内容を掲載していないこと」が有効に働きます。

本書の「おわりに」では次のように書かれています。
> 本書では、情報処理安全確保支援士の基礎知識を取り扱っています。これからさらに、専門的な参考書を読んで、過去問を反復して、試験対策をしていく必要があります。

セキュリティ初学者にとって適切な1冊でした。

## さらに効率を上げる2冊目

さらに学習効率を高めるために、2冊目を意識しながら、1冊目を読むのも有効です。

例えば、セキュリティを勉強するときの私の2冊目は[「報処理安全確保支援士「専門知識＋午後問題」の重点対策」](https://amzn.asia/d/bOFbpEH)でした。

次の観点を先に把握しました。
- 2冊目の難易度
- 今の自分に何が足りないか？
- 2冊目で書かれている基礎

「2冊目の内容を理解すること」を念頭に1冊目を読むことで、理解のハードルが下がり、結果的に早く読み終えることができたと思います。

## おわりに

この記事では、「1冊目の技術書」の重要性、選ぶときのコツ、活用方法を紹介しました。

基礎の観点を意識しながら技術書を活用することで、学習効率を高めることができます。

参考になれば幸いです。
【Slack】チャンネルにメンバーが参加したら通知する方法

# はじめに
Slackのチャンネルに人が参加すると19人位までは通知がされるのですが、それ以降は誰がいつ参加したかわからないため通知させる仕組みを作成しました。

# 手順
1.Slackから「自動化」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523103/f0aa7c6f-9ddb-49ea-3ef7-0659d1e7bd61.png)

2.「ワークフローを作成する」をクリック

![Pasted Graphic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523103/ef335f1e-99c8-6179-e3e3-e925ae0d54f0.png)


3.「誰かがチャンネルに参加した時」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523103/b3a234fd-6115-599f-1577-edebe7862033.png)


4.該当のチャンネル（今回は#general）を選択し、「ステップを追加」→「メッセージ」→「チャンネルへメッセージを送信する」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523103/df9adc38-16af-365b-270c-915944caa45e.png)



5.参加時に送信するメッセージを設定する。
ワークフローには変数が使えるので参加したユーザ毎にメンションすることもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523103/6c63c6ee-824b-2eef-46d3-6aaecb992bde.png)

あとは保存すればOKです。
yt-dlpでyoutubeの動画を保存する

## はじめに
この記事では、youtubeの特定チャンネルで公開されている動画をすべてダウンロードしてきます。既にyt-dlpの使い方に関しては多くの記事が存在しているかと思います。自分用に備忘録として残している側面が強いです。
やろうと思ったきっかけは、某アーティストが不祥事を起こし、あらゆるところから動画が消えそうだったので、自分の楽しみのために残しておきたかったというのがあります。(ダウンロードしたデータは個人での楽しみのみに留めてくださいね)

## インストール
簡単にpipでインストールします
```
 pip3 install -U "yt-dlp[default]" 
```

## 動画のダウンロード
以下のコマンド実行ですべて落とせます
```
yt-dlp -o "%(title)s.%(ext)s" "[チャンネルのURL]" --write-thumbnail -f mp4
```
`-o`で出力ファイル名を決定しています。今回の書き方だと、単純に`動画のタイトル名.mp4`となります。
`--write-thumbnail`では、サムネの保存を実行しています。
`-f mp4`でmp4形式でのダウンロード指定をしています。デフォルトでは`.webm`で落ちてくるので、変えたい人は付けること。


dt-dlpはyoutube以外の場面でも使えるので活用していきたいですね。
おしまい

## 参考文献
https://github.com/yt-dlp/yt-dlp
slackにプログラム完了報告 appをつくった話

1. appをslackに追加

```
https://api.slack.com/apps/
```
2 token取得
 OAuth & Permissions で tokenを取得 (コピーして保存しておく 4.のtokenの部分に使用します。)
 
3  OAuth & Permissions で 同じく権限を追加
→ chat:write
→ incoming-webhook

4  例えば以下のようにコマンドを発行するとslackにメッセージが送信される。
curl -X POST -d 'token=xxxxxxx&channel=(チャンネル or ユーザ名)&text=テキスト' https://slack.com/api/chat.postMessage
66日目 先輩エンジニアに色々聞いてみた社畜S


## :writing_hand:はじめに
こんにちは、社畜Sです。  
現在私たち社畜は、新人課題、SAA受験も終わり、本格的にエンジニアとしての仕事が始まろうとしている段階です。  
なので今回は、エンジニアとして活躍する前準備も兼ねまして、エンジニアがどういう仕事なのかを実際に作業をしてきた先輩方から聞いてみようと思い、
**先輩エンジニアの方々にエンジニアについてのアンケートをしてみました！**  

質問は全部で４つ出題しました！どんな~~珍回答~~いいことが書いているのか今から楽しみですね。 

さっそく集計結果を見てみましょう！
## :writing_hand:Q1.新人のうちにやっておけばよかった！と思うことは？
この質問の答えは
**「まず基礎をしっかり勉強しとくべき！」**
という答えが多く上がりました！  
実際に業務が始まったとき、初めてするようなこと任された場合でも基礎を学習しているだけで全然違うようです。  
ITエンジニアとして活動する以上、環境は変化し続けると思うので、基礎をしっかり固めて、変化し続ける環境についていけるようにしていきたいですね。  

  また、次に多い答えとして  
  **「『Git』の勉強をしとくべき！」**  
  という答えも複数人から上がりました。プログラミング言語は開発によって違うかもしれないが、Gitはだいたいの開発で使う必須スキルだから、という理由で挙げられたようです。  
お恥ずかしいことに、社畜Sはgit cloneしか使ったことがありません。  
今からでも学習して、実務で急に使うことになっても対応できるようにしておきたいと思います。

## :writing_hand:Q2.エンジニアをやっていて一番きつかった瞬間を教えてください！
この質問の答えは
**「障害・エラー対応をしているとき」**
という答えがほとんどでした。
対応作業の関係で残業が増えてしまうのに加えて、調べても手掛かり一つ出ないときもあるのが更なる絶望に繋がっているようです:scream:  
何かを作る以上、エラーが出て残業時間が伸びてしまうのは覚悟の上ではあるのですが………  
> **お客さんの会社で謝りながら障害対応したとき**
>——————とある先輩エンジニアの一番辛かった瞬間    

こんな状況になってしまったら正直怖すぎて泣いてしまう自信があります。  
こういう出来事があっても折れずにエンジニアを続けられている先輩エンジニアたちは本当にすごいと思います。  
エラーを起こさないのは無理だと思う（エラーなかったらそれはそれで怖い）ので、せめてそれでくじけないように心を強く保ちたいです。
## :writing_hand:Q3.エンジニアになろうと思ったきっかけを教えてください！
このあたりから多種多様な答えが出てくるようになってきました！  
**「IT系の知識は他の分野にも活かせそうだから」**
**「ExcelでVBAを使ってみて楽しかったから」**
のようなIT分野に興味を持ってなろうと思った方や
**「システム営業だったが、実現可否の判断が大変で、もう自分で作りたいと思ったから」**
という現場の苦労が少し伝わってくる理由でエンジニアになろうとしている方もいました。  

珍しいものだと  
**「高校の担任に『おまえはシステムエンジニアにはなれない』と言われたから」**  
というものすごいものもありました。ガッツがすごい。  

ちなみに社畜Sは「昔からPCを触るのが好きだったから」という量産型のような理由でエンジニアになっています。小さい頃はゲームクリエイターになりたかったんですが、中学生くらいで現実を見るようになって断念した思い出があります。
## :writing_hand:Q4.オフの時、職業病だなぁと思うのは？
ついに最後の質問ですね。
この質問の答えで多く出たのは
**「ゲームやシステムの内部が気になる」**
というものでした。ものすごくわかる…………  
私も、昔は頭空っぽでゲームを楽しんでいたんですが、ある程度知識がついてから見てみると「すごいことしてたんだな……」となりました。  
長時間メンテナンスにも少し優しくなれた気がします。  
他の物事にも言えることですが、ある程度知識がついてくると普段目がいかなかったものに目が行くことってよくありますよね。  

また、面白い回答として
> **嫁との喧嘩の時に徹底的に理論で攻める（あっちは感情で攻めてくる）**
>——————とある先輩エンジニアの職業病  

というものがありました。論理的思考が大事になるエンジニアらしい戦い方ですね。  
ちなみに他の先輩曰く、大体の場合「感情」には敵わないようです。  
感情、強い……  
## :writing_hand:まとめ
というわけで、今回は先輩方にアンケートした結果をまとめてみました！  
文章量の都合上省いたものも何個かありますが、個性的な回答も多くありとても読みごたえがありました。そのうち機会があれば省いたものも公開したいですね。  
~~本当にこれからの業務に活かせるようなアンケートになったかは一旦おいといて~~  
とても興味深い話がたくさん聞けたので、今後も機会があればアンケートしてみたいと思います！  
読んでいる皆さんも、「俺はこういう職業病がある！」「これがつらかった…」ということがあればぜひコメント欄に書き込んでいってください！
picoMini by redpwn writeup login

## login (Web Exploitation)

My dog-sitter's brother made this website but I can't get in; can you help? login.mars.picoctf.net

とりあえず、記載のリンクに飛ぶと、usernameとpasswardを入力するところがあるので、adminでSQLインジェクションを試みる。
パスワードが違うというアラートが出ること以外は何起きないので、Burp Suiteでresponseを確認する。
と、Base64で暗号化されたusernameとpasswardが出てきた。
usernameは`YWRtaW4`でadmin、passwardは`Gljb0NURns1M3J2M3JfNTNydjNyXzUzcnYzcl81M3J2M3JfNTNydjNyfQ`で、これがフラグだった。

`picoCTF{53rv3r_53rv3r_53rv3r_53rv3r_53rv3r}`

ちなみに、usernameがadminでない場合は、usernameが違うというアラートが出るようだ。奇跡的にusernameが合っていたために、usernameエラーが出なかったらしい。usernameとpasswardはデコードしたもののみログインすることができた。ログインすると、ダイアログボックスでフラグが表示された。
[AWS]QuickSight Demo Centralを使ってみた

## はじめに
Amazon QuickSightはAWSが提供しているBIサービスです。AthenaやRedShift、S3などのAWSのデータソースと統合し、ダッシュボードを作成できます。弊社でもQuickSightを導入しており、SBOMやAWSのコスト可視化などに活用しています。

QuickSightを利用したSBOMについての過去記事はこちらです。

https://qiita.com/nishimura-POHD-CCoE/items/3eddea627ff6fb69035a

BIツールの導入においては、データソースとの親和性や機能面の比較検討も大切ですが、直感的に操作できるかどうかなどの操作感の確認も重要なポイントです。また、導入後にもダッシュボード作成について学べるコンテンツがあると嬉しいですよね。

今回は、QuickSightの導入検討や構築に役立つデモ環境をご紹介したいと思います。

## こんな方におすすめの内容です
- QuickSightに関する情報収集をしたい
- QuickSightのダッシュボード作成方法について学びたい
- AWSエンジニアとしてQuickSightを触ってみたい

## QuickSight Demo Central
QuickSightには初回1か月のトライアル期間がありますが、QuickSightアカウントを作成しなくても手軽にQuickSightの機能を体験できる環境があります。それが、今回ご紹介する「[QuickSight Demo Central](https://democentral.learnquicksight.online/)」です。

https://democentral.learnquicksight.online/

データセット作成やダッシュボードの新規作成はできませんが、ユーザー登録不要でダッシュボードのサンプルの閲覧や編集、QuickSight Qの一部機能を無料でお試しできます:clap:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333262/9896ed65-5ebf-3786-e403-f18758a28043.png)

### **ダッシュボード閲覧**
左側にあるメニュー「≡」内にある、「Dashboard Demo」の中にサンプルのダッシュボードのリンクがあり、さまざまな内容のサンプルが公開されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333262/0c1cab5e-7b53-6bb9-835b-83792dd47e20.png)

「Dashboard Demo」以外にも、「Feature Demo」、「Tips & Trics」という計算フィールドやフリーフォームレイアウトなど、QuickSightの特定の機能に着目したサンプルも用意されています。

以下は「Feature Demo」のメニュー内にある、コントロールのフィルタを使った例です。ラジオボタンやドロップダウンリストのコントロールを追加し、閲覧者がダッシュボード内で操作できるフィルタが設定されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333262/d6e9ff23-a98b-d722-8529-35644169f06d.png)

公開されているダッシュボードのほとんどが英語ですが、メニュー内の「Other Languages」には日本語のサンプルも3つ提供されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333262/12b9e5fb-3575-e732-b80a-5eb3d9188c57.png)


### **ダッシュボード編集**
サンプルのダッシュボードは、閲覧だけでなく編集もできます。編集したいダッシュボードを開いたら、左側のメニューにあるペンのマークのアイコン![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333262/db89322c-f963-b562-b4eb-cebfb6113c10.png)をクリックすると、編集モードに切り替わります。

編集モードでダッシュボード内のビジュアル（ダッシュボード中の表やグラフのこと）を選択すると設定項目が表示され、それぞれの設定内容を編集することができます。また、ダッシュボード内のデータセットを使って、新しいビジュアルを追加することもできました。

編集モードではビジュアルの設定方法を見ることができるので、サンプルと同じようなビジュアルを設定したいときにはとても参考になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333262/ca8c9d87-23a9-eb7a-1c12-9d793e5d4f21.png)

### **QuickSight Qのデモ**
QuickSight Demo Centralでは、QuickSight Qの一部であるAsk Qという機能のデモも提供されています。Ask Qは、自然言語で質問した内容に対して、データを元に回答、可視化してくれるという機能です。「Ask Q」のダッシュボードでは、この機能をお試しできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333262/47ba5456-e210-2502-873b-ef73d02c2472.png)

ダッシュボードの上部にあるテキストボックスに質問内容を英語で入力して実行したところ、10秒程度で以下のような回答とビジュアルを生成してくれました。料金は高くなってしまいますが、ダッシュボードを作ることなく気になった点についてのインサイトを得られるので、蓄積されたデータの活用が進みそうです。

2024/6/12時点では利用できるリージョンが限られている機能ですが、日本語対応も含めて東京リージョンで提供される日を待っています！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333262/208217b0-5051-4086-d6ff-75ea0caa9748.png)


## まとめ
今回はQuickSightの導入・構築に役立ちそうなQuickSight Demo Centralのコンテンツをご紹介しました。
次回はQuickSightで構築したAWSのコスト可視化ダッシュボードをご紹介したいと思います。最後までお読みいただきありがとうございました！
Raspberry Piでカメラモジュールを使う簡単チュートリアル

##必要な材料
-Raspberry Pi (モデル不問、Raspberry Pi 4推奨)
-Raspberry Piカメラモジュール（[参照可能](https://www.sinoseen.com/what-is-raspberry-pi-camera-module)）
-microSDカード（Raspberry Pi OSがインストールされているもの）

##ステップ
###1.OSをインストールする
Raspberry Pi OSがMicroSDカードにインストールされていることを確認してください。インストールされていない場合は、Raspberry Pi Imagerを使ってOSをインストールすることができます。

###2.カメラモジュールを接続する
-Raspberry Piの電源が切れていることを確認します。
-Raspberry PiのCSI(Camera Serial Interface)コネクタのプラスチッククリップを開きます。
-カメラモジュールのケーブルを、金属の接点が HDMI コネクタに向くように CSI コネクタに差し込みます。
-プラスチッククリップを閉じてケーブルを固定します。

###3.Raspberry Piを起動する
モニター、キーボード、マウスを接続し、Raspberry Piの電源を入れます。
Raspberry Pi を起動し、デスクトップ環境にログインします。


###4.カメラインターフェースを有効にする
-ターミナルウィンドウを開きます。
-以下のコマンドを入力し、Raspberry Pi Configuration Tool にアクセスします：
```
sudo raspi-config
```
-Interface Options（インターフェース・オプション）「を選択し、」Camera（カ メラ）"を選択してカメラインターフェースを有効にします。

-完了したら、「Finish」（完了）を選択し、変更を有効にするためにシステムを再起動することを選択します。

###5.カメラモジュールのテスト
-システムが再起動した後、端末を開き、カメラモジュールが正常に動作するかテストします。

-写真を撮ってください：
```
raspistill -o test.jpg
```

カレント・ディレクトリで写真を撮影し、test.jpgとして保存します。

-ビデオを録画する：
```
raspivid -o test.h264 -t 10000
```

10秒間のビデオを録画し、test.h264として保存する。

###6.Pythonでカメラを制御する
picamera ライブラリを使用すると、Python スクリプトでカメラモジュールを制御できます。 まず、picameraライブラリをインストールします：
```
sudo apt-get update
sudo apt-get install python3-picamera
```
Python スクリプトを作成します (例 camera_test.py)：
```
from picamera import PiCamera
from time import sleep

camera = PiCamera()

camera.start_preview()
sleep(5)
camera.capture('/home/pi/image.jpg')
camera.stop_preview()
```

スクリプトを実行します：
```
python3 camera_test.py
```
5秒間のプレビュー後に写真を撮影し、/home/pi/image.jpg に保存します。

ここでは、カメラモジュールは、初期調整が完了したものとみなされ、次のあなたは、コンピュータビジョン、顔認識などの他のアプリケーションを展開するために、これに基づいてすることができますもちろん、これはプログラミングのスキルの一定程度を必要とします。

また、Raspberry Piに適用できるカメラモジュールについては https://www.sinoseen.com 。
必要なものが見つかるかもしれない。