OmniAICreator/Qiita-1.07M huggingface dataset:
paiza.ioでrust その4

# 概要
paiza.ioでrustやってみた。
pcgで乱数を作り、湯婆婆やってみた。

# サンプルコード

```

use std::io;

struct Rand {
    seed: u32
}
const RAND_MAX: u32 = 0xffff_ffff;
impl Rand {
    fn new(x: u32) -> Rand {
        Rand { seed: x }
    }
    fn rand(&mut self) -> u32 {
        let x = self.seed as u64;
        self.seed = ((69069 * x + 1) & RAND_MAX as u64) as u32;
        self.seed
    }
    fn random(&mut self) -> f64 {
        (1.0 / (RAND_MAX as f64 + 1.0)) * self.rand() as f64
    }
    fn shuffle<T>(&mut self, buff: &mut [T]) {
        for i in 0 .. buff.len() 
        {
            let j = (self.random() * buff.len() as f64) as usize;
            buff.swap(i, j);
        }
    }
}
fn start_yubaba() {
    let mut rng = Rand::new(5);
    let mut origin_name = String::new();
    println!("契約書だよ、そこに名前を書きな。");
    io::stdin().read_line(&mut origin_name).expect("Failed to read line");
    origin_name = origin_name.trim().to_string();
    println!("ふん、{}というのかい、贅沢な名だね", origin_name);
    let name_length = origin_name.chars().count();
    let new_name_index = rng.rand() as usize % name_length;
    let new_name = origin_name.chars().nth(new_name_index).unwrap();
    println!("今からお前の名前は{}だ、いいかい、わかったら返事をするんだ！{}!!", new_name, new_name)
}
fn main() {
    start_yubaba();
}


```

# 実行結果

```
契約書だよ、そこに名前を書きな。
ふん、腹美恵子というのかい、贅沢な名だね
今からお前の名前は恵だ、いいかい、わかったら返事をするんだ！恵!!
```

# 成果物

https://paiza.io/projects/KfzyY_MkpBjtHGDvvxhVuQ


以上
Intersection Types

[Previous << Enumerations](https://qiita.com/flowcadence/items/13f888d2028c25a86a78)
[Next >> References](https://qiita.com/flowcadence/items/115d12a5deafc732636d)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#cadenceの言語仕様を学ぶ

インタフェースの型は*型のアノテーション*内で直接使用できない為、代わりにIntersection Type(以下、*インターセクション型*と記す)の一部として使用する必要があります。 インターセクション型は、Intersection内部にリストされたすべてのインタフェースに適合した一つの値を表します。

インターセクション型の構文は`{U1, U2, ... Un}`であり、ここで型`U1`から`Un`は、インタフェースに適合することになる型です。

インターフェースのフィールド、関数、そのセットが利用できます。

インターセクション型は、さまざまな異なる入力値で動作する関数を記述する際に便利です。例えば、引数の型にインターセクション型を使用することで、その関数はIntersection内の全ての、インタフェースを実装した値にアクセスすることができます。値はIntersection内部の機能に制限されます。関数が誤って他の機能にアクセスしようとした場合、静的チェッカーによってブロックされます。

```ruby
access(all)
struct interface HasID {
    access(all)
    let id: String
}

access(all)
struct A: HasID {

    access(all)
    let id: String

    init(id: String) {
        self.id = id
    }
}

access(all)
struct B: HasID {

    access(all)
    let id: String

    init(id: String) {
        self.id = id
    }
}

/* Create two instances, one of type `A`, and one of type `B`.
 * Both types conform to interface `HasID`, so the structs can be assigned
 * to variables with type `{HasID}`: Some resource type which only allows
 * access to the functionality of resource interface `HasID` */

let hasID1: {HasID} = A(id: "1")
let hasID2: {HasID} = B(id: "2")

/* Declare a function named `getID` which has one parameter with type `{HasID}`.
 * The type `{HasID}` is a short-hand for `AnyStruct{HasID}`:
 * Some structure which only allows access to the functionality of interface `HasID`.
 */
access(all)
fun getID(_ value: {HasID}): String {
    return value.id
}

let id1 = getID(hasID1)
/* `id1` is "1" */

let id2 = getID(hasID2)
/* `id2` is "2" */
```
インタフェースが2つ以上存在する場合は、その型を実装した値(補足: リソースまたはStruct)はその両方を実装する必要があります。

```ruby
access(all)
struct interface HasMetadata {
    access(all)
    var metadata: AnyStruct
}

access(all)
struct C: HasID, HasMetadata {

    access(all)
    let id: String
    
    access(all)
    var metadata: AnyStruct

    init(id: String) {
        self.id = id
        self.metadata = []
    }

    access(all)
    fun setMetadata(_ data: AnyStruct) {
        self.metadata = data
    }
}

/* valid, because `C` implements both `HasID` and `HasMetadata`. */
let hasID3: {HasID, HasMetadata} = C(id: "3")

/* Invalid, because `A` implements only `HasID`. */
let hasID4: {HasID, HasMetadata} = A(id: "4")
```


翻訳元

https://cadence-lang.org/docs/language/intersection-types

***
<b>[Previous << Enumerations](https://qiita.com/flowcadence/items/13f888d2028c25a86a78)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Intersection Types)

<b>[Next >> References](https://qiita.com/flowcadence/items/115d12a5deafc732636d)</b>
MacOSからDatadog APMを送る (with Datadog Agent)

## 概要

DatadogのTraceを、アプリのローカル実行で確認したいケースがある。
今回は、Mac上にDatadog Agentを立てて、Datadogにトレースを送るのを試す。

## インストール

https://app.datadoghq.com/account/settings/agent/latest?platform=macos から Agentの設定をしていきます。

![Screenshot 2024-10-26 at 9.10.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7059/dffb566e-2ebc-3122-980a-7e5ea3c93979.png)


DD_API_KEYを取得してから、以下のコマンドでインストールすることができます。

```
DD_API_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX DD_SITE="datadoghq.com" bash -c "$(curl -L https://install.datadoghq.com/scripts/install_mac_os.sh)"
```

## 起動

![Screenshot 2024-10-26 at 9.06.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7059/478bc27a-b140-9759-b8a1-15d6a7e6260a.png)

メニューバーから起動、再起動、終了、WebUIを開くなど選択ができます。

## 設定

`~/.datadog-agent/datadog.yaml`またはUI上から設定を変更できます。

![Screenshot 2024-10-26 at 8.52.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7059/54b94f8d-7bad-9f76-8713-05e17c362cf3.png)

今回は試しにTraceの設定をEnableします。そして、Agentをリスタートします。

## Application設定 (Golang)

```go
package main

import (
	"net/http"

	httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http"
	"gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
)

func main() {
	tracer.Start()
	defer tracer.Stop()
	mux := httptrace.NewServeMux(httptrace.WithServiceName("my-service"))
	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("Hello World!\n"))
	})
	http.ListenAndServe(":8080", mux)
}
```

```
curl localhost:8080                
Hello World!
```

## Datadog上で確認

![Screenshot 2024-10-26 at 9.04.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7059/0516c605-2e48-384d-054f-fb6afbcfcadf.png)

![Screenshot 2024-10-26 at 9.04.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7059/68342254-a8df-a9c2-ce05-eff7b39428cd.png)

## Ref

1. https://docs.datadoghq.com/tracing/guide/tutorial-enable-go-containers/
[tips][cpp] std:: unique

# std:: unique

cppで配列`v`から重複を許さないソート済み配列`v`を生成したい場合は、この二行で良い。

`#define all(a) a.begin(), a.end()`とする。
1. sort(all(v));
2. v.erase(unique(all(v)), v.end());


## 詳説

cpp tipsです。標準ライブラリの気になったポイントをメモします。
関数概要は"イテレータ範囲 [first, last) から重複した要素を除ける"です。

- 隣り合った要素のうち重複するもののみ取り除いた配列を生成する
- 生成した配列を元の配列に対して先頭から順番に上書きする
- 先頭に集められた重複なし範囲の末尾の次を指すイテレータが返る

このため、uniqueが返した戻り値のイテレータを使用して、重複したままの要素を削除する必要があります。`auto res = unique()`とすると、区間$\[res, end()\)$が重複したままの配列がそのままなので、`erase()`で取り除きます。

**全ての重複要素を取り除きたい場合は、sortしてsortしたものに対してこの処理を行えば良い**です。

例えばこの処理。

```cpp
#include <iostream>
#include <vector>
#include <algorithm>
#define all(a) a.begin(), a.end()
void print(const char *tag, const std::vector<int> &v) {
  std::cout << tag << " : ";
  bool first = true;
  for (int x : v) {
    if (first) {
      first = false;
    } else {
      std::cout << ',';
    }
    std::cout << x;
  }
  std::cout << std::endl;
}

int main(){
    std::vector<int> v = {2, 5, 3, 3, 1, 2, 4, 2, 1, 1, 4, 4, 3, 3, 3};
    decltype(v)::iterator result = std::unique(v.begin(), v.end());
    print("unsorted unique; before remove", v);
}
```

とすると、隣り合った要素が重複していた場合、それを取り除く処理を行なった数値たちがまず先頭から順番に配置され、**残りはそのまま**になります。
```cpp
unsorted unique; before remove : 2,5,3,1,2,4,2,1,4,3,4,4,3,3,3
```

- 重複したもののうち、隣り合うもののみが取り除かれ先頭に配置される
- 残りはそのままである

ことがわかります。

次の処理で全ての重複要素を取り除きます。

```cpp
    std::vector<int> v = {2, 5, 3, 3, 1, 2, 4, 2, 1, 1, 4, 4, 3, 3, 3};
    std::sort(all(v));
    decltype(v)::iterator result = std::unique(v.begin(), v.end());

    // 不要になった要素を削除
    v.erase(result, v.end());
```

できました。

```cpp
sorted unique : 1,2,3,4,5
```

## 参考

https://cpprefjp.github.io/reference/algorithm/unique.html
https://cpprefjp.github.io/reference/vector/vector/erase.html
LaravelでCommand実行する

:::note
command実行できるアプリケーションをLaravelで作る方法
- artisanコマンドでCommandクラス作成
- routes/console.php内に記述
:::

# 背景
業務でphpファイルをコマンド実行することがありましたので復習の為にまとめます。

:::note
今回はLaravel Sailを使用します。SailはアプリケーションのDockerコンテナ内でArtisanコマンドを実行します。
:::

以下が今回の勉強の為に作ったリポジトリです。

https://github.com/yamatai12/laravel-command

以下参考に進めます。

https://laravel.com/docs/11.x/artisan

# Commandクラスとは
コマンド実行後に呼び出されるクラスです、コマンド実行時に行いたい処理を記述できます。

# Commandクラスを作成する

:::note
`./vendor bin sail`を`sail`に省略しています。
:::

```terminal
sail artisan make:command SampleCommand

   INFO  Console command [app/Console/Commands/SampleCommand.php] created successfully. 
```

以下のファイルが作成されます。

```example-app/app/Console/Commands/SampleCommand.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class SampleCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'app:sample-command';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Execute the console command.
     */
    public function handle()
    {
        //
    }
}

```

# Commandクラスの構成

## signatureプロパティ
command名を決める為に使用されます。

## descriptionプロパティ
コンソール画面に表示する為に使用されます。

## handleメソッド
コマンドが実行されると呼び出されます。
ここにロジックを書きます。

# command実行をしてみる

呼び出されている事を確認する為にhandleメソッドを以下のように修正します。

```example-app/app/Console/Commands/SampleCommand.php
public function handle()
    {
        $this->info('handle method is calld');
    }
```

infoメソッドは文字列をコンソールに出力してくれるメソッドです。

```terminal
sail artisan app:sample-command
handle method is called
```

実行すると呼び出されていることが確認できました。

# routes/console.phpで簡単にコマンドを定義する
```example-app/routes/console.php
<?php

use Illuminate\Foundation\Inspiring;
use Illuminate\Support\Facades\Artisan;

Artisan::command('inspire', function () {
    $this->comment(Inspiring::quote());
})->purpose('Display an inspiring quote')->hourly();
```

このファイルでもコマンドを定義できます。
以下を追記します。

```example-app/routes/console.php
Artisan::command('easy-command', function () {
    $this->info('This is an easy command');
});
```

コマンド実行します。

```terminal
sail artisan easy-command      
This is an easy command
```

# 最後に
- 概要は掴めました
- 次回はEloquentモデルをコマンド実行で操作します
- 業務でブラウザ通知の処理をコマンドで実行していたのでそれも作ってみます
- スケジュール実行する機能についても勉強したいです

# 参考

https://laravel.com/docs/11.x/artisan

https://qiita.com/nenokido2000/items/abbf70c87c9ad86a2b89
JS実行環境「Bun」を使ってみる(Mac OS)

# 概要
- JavaScriptやTypeScriptのアプリケーション開発向けのサポートツールが詰め込まれた統合型のツールキット

# インストール
```terminal
curl -fsSL https://bun.sh/install | bash
bun -v // バージョンが表示されれば成功
```

# 実行
```test.ts
const server = Bun.serve({
  port: 3000,
  fetch(req) {
    return new Response("Bun!");
  },
});

console.log(`Listening on http://localhost:${server.port} ...`);
```
```terminal
bun run test.ts
```
- localhost:3000を開くと画面上に「Bun!」が表示される

![スクリーンショット 2024-10-26 10.43.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3765171/0d78e6af-6e2d-c219-8f1d-774c52736a6d.png)


# コマンド一覧
```terminal
bun run   //JavaScriptまたはTypeScriptファイルを実行
bun test   //組み込みテストフレームワークでユニットテストを実行
bun fmt   //組み込みフォーマッターでコードを整形
bun lint   //組み込みリンターでコードをリント（静的解析処理）
bun bundle   //組み込みバンドラーでコードをバンドル
```
paiza.ioでrust その3

# 概要
paiza.ioでrustやってみた。
pcgで乱数を作り、zundokoやってみた。

# 参考にしたページ

https://qiita.com/hatoo@github/items/652b81e8e83b0680bc0a

# サンプルコード

```

struct Rand {
    seed: u32
}
const RAND_MAX: u32 = 0xffff_ffff;
impl Rand {
    fn new(x: u32) -> Rand {
        Rand { seed: x }
    }
    fn rand(&mut self) -> u32 {
        let x = self.seed as u64;
        self.seed = ((69069 * x + 1) & RAND_MAX as u64) as u32;
        self.seed
    }
    fn random(&mut self) -> f64 {
        (1.0 / (RAND_MAX as f64 + 1.0)) * self.rand() as f64
    }
    fn shuffle<T>(&mut self, buff: &mut [T]) {
        for i in 0 .. buff.len() 
        {
            let j = (self.random() * buff.len() as f64) as usize;
            buff.swap(i, j);
        }
    }
}

fn main() {
    let mut rng = Rand::new(5);
    for _ in 0..3
    {
        println!("{}", rng.rand());
    }
    for _ in 0..3 
    {
        println!("{}", rng.random());
    }
    let mut buff = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
    rng.shuffle(&mut buff);
    println!("{:?}", buff);
    rng.shuffle(&mut buff);
    println!("{:?}", buff);
    rng.shuffle(&mut buff);
    println!("{:?}", buff);
    let mut zcnt = 0;
    loop 
    {
        let s = rng.random();
        let mut zd = false;
        if s < 0.5
        {
            zd = true;
        }
        print!("{} ", if zd {"ズン"} else {"ドコ"});
        if zd 
        {
            zcnt += 1
        }
        else if zcnt >= 4
        {
            break
        }
        else
        {
            zcnt = 0
        }
    }
    println!(" キ・ヨ・シ！");
}


```

# 実行結果

```
345346
2377866395
1599604512
0.8475697415415198
0.7944785314612091
0.8376894944813102
[3, 9, 5, 1, 0, 7, 2, 8, 4, 6]
[0, 1, 6, 9, 5, 2, 8, 3, 7, 4]
[1, 3, 9, 6, 2, 4, 5, 7, 8, 0]
ドコ ズン ドコ ドコ ズン ズン ズン ドコ ドコ ドコ ドコ ズン ドコ ドコ ズン ドコ ドコ ドコ ズン ドコ ドコ ズン ズン ズン ドコ ドコ ズン ズン ドコ ドコ ドコ ズン ズン ズン ズン ドコ  キ・ヨ・シ！


```

# 成果物

https://paiza.io/projects/8v-YSYKusw3DLsoIFv2XYg

以上
【学習】Githubプロジェクト紐づけ


## はじめに
Githubでプロジェクトを作成する時、該当のリポジトリに移動してからプロジェクトの作成をするかと思いますが、私は少し間違ってしまい該当リポジトリとの紐づけ作業をしばらく後回しにしてしまっていたので、今回は紐づけて順含め、簡単に記事にまとめていこうかと思います。

## どんな状況だったのか
- 通常：ホーム画面＞`Repositories`＞`Projects`の順番
- 私：ホーム画面＞`Projects`

当時「プロジェクトの作成をする」という事だけに意識がいき、該当リポジトリから作成するという手順をすっかり読み逃し？ていました。
👇ホーム画面？からProjectsはすぐに作成できる
[![Image from Gyazo](https://i.gyazo.com/ce5d97e173c7c0c85ae6356fe68d1d73.png)](https://gyazo.com/ce5d97e173c7c0c85ae6356fe68d1d73)

## 改めて紐づけ
- `Repositories`から該当のリポジトリを選択
- `Projects`を選択
- `Link a project`をクリック
 [![Image from Gyazo](https://i.gyazo.com/79324426bfed3d83052553f5a3dfee08.png)](https://gyazo.com/79324426bfed3d83052553f5a3dfee08)
- ホームから作成したプロジェクトを選択
- `Submit`を選択して完了！！


## 簡単にできた
意外とサクッと該当リポジトリにプロジェクトを配置することができました。
今回の方法にたどり着く前、先にプロジェクト側からリポジトリに紐づけできないか探っていましたが見つからず（あるのかもしれませんが私は見つけられませんでした。）

今回の記事が何か参考になれば幸いです。
paiza.ioでrust その2

# 概要
paiza.ioでrustやってみた。
xorshiftで乱数を作り、zundokoやってみた。

# 参考にしたページ

https://qiita.com/hatoo@github/items/652b81e8e83b0680bc0a

# サンプルコード

```

struct Rand {
    seed: u32
}
const RAND_MAX: u32 = 0xffff_ffff;
impl Rand {
    fn new(x: u32) -> Rand {
        Rand { seed: x }
    }
    fn rand(&mut self) -> u32 {
        let x = self.seed as u64;
        self.seed = ((69069 * x + 1) & RAND_MAX as u64) as u32;
        self.seed
    }
    fn random(&mut self) -> f64 {
        (1.0 / (RAND_MAX as f64 + 1.0)) * self.rand() as f64
    }
    fn shuffle<T>(&mut self, buff: &mut [T]) {
        for i in 0 .. buff.len() 
        {
            let j = (self.random() * buff.len() as f64) as usize;
            buff.swap(i, j);
        }
    }
}

fn main() {
    let mut rng = Rand::new(5);
    for _ in 0..3
    {
        println!("{}", rng.rand());
    }
    for _ in 0..3 
    {
        println!("{}", rng.random());
    }
    let mut buff = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
    rng.shuffle(&mut buff);
    println!("{:?}", buff);
    rng.shuffle(&mut buff);
    println!("{:?}", buff);
    rng.shuffle(&mut buff);
    println!("{:?}", buff);
    let mut zcnt = 0;
    loop 
    {
        let s = rng.random();
        let mut zd = false;
        if s < 0.5
        {
            zd = true;
        }
        print!("{} ", if zd {"ズン"} else {"ドコ"});
        if zd 
        {
            zcnt += 1
        }
        else if zcnt >= 4
        {
            break
        }
        else
        {
            zcnt = 0
        }
    }
    println!(" キ・ヨ・シ！");
}




```

# 実行結果


``` 
345346
2377866395
1599604512
0.8475697415415198
0.7944785314612091
0.8376894944813102
[3, 9, 5, 1, 0, 7, 2, 8, 4, 6]
[0, 1, 6, 9, 5, 2, 8, 3, 7, 4]
[1, 3, 9, 6, 2, 4, 5, 7, 8, 0]
ドコ ズン ドコ ドコ ズン ズン ズン ドコ ドコ ドコ ドコ ズン ドコ ドコ ズン ドコ ドコ ドコ ズン ドコ ドコ ズン ズン ズン ドコ ドコ ズン ズン ドコ ドコ ドコ ズン ズン ズン ズン ドコ  キ・ヨ・シ！
```

以上
paiza.ioでrust

概要
paiza.ioでrustやってみた。

# サンプルコード

```
fn main() {
    for i in 1..101 
    {
        if i % 15 == 0 
        {
            println!("FizzBuzz");
        }
        else if i % 3 == 0 
        {
            println!("Fizz");
        }
        else if i % 5 == 0 
        {
            println!("Buzz");
        }
        else 
        {
            println!("{}", i)
        }
    }
}

```

# 実行結果

```
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
```

# 成果物

https://paiza.io/projects/AgRGeX1TCCNeddt5pIViyg


以上
p5.js のフィルター用シェーダー「createFilterShader()」で色を減算する処理のわりとシンプルなもの（テンプレート的なもの、WebGL 2.0／GLSL ES 3.0）

以下の記事と似た方向の記事で、自分がよく使っている p5.js のフィルター用シェーダー「createFilterShader()」の話です。

●p5.js のフィルター用シェーダー「createFilterShader()」で Webカメラ画像をそのまま出力（テンプレート的なもの、WebGL 2.0／GLSL ES 3.0） - Qiita
https://qiita.com/youtoy/items/cbd16903cbb14e49662a

シェーダーで、p5.js のスケッチ側から渡したピクセルの情報を使い、それに特定の値を加算・減算する処理を使うことが良くあるのですが、今回はそのような構成のものをわりとシンプルにした内容という感じです。

何らか、シェーダーによる加工を試す際に、そのベースとして利用するテンプレート的なものを自分用に用意したくなり、今回の内容を書きました。

## メインの内容
### 固定値の減算
以下が今回の内容の 1つ目です。
フラグメントシェーダーは、[公式サンプル](https://p5js.org/reference/p5/createFilterShader/)と違って「WebGL 2.0（GLSL ES 3.0）」を使う形にしています。

```javascript
let s;

function setup() {
  createCanvas(640, 480);

  s = createFilterShader(fragSrc);
}

function draw() {
  background(220);
  filter(s);
}

const fragSrc = `#version 300 es
precision mediump float;

in vec2 vTexCoord;
out vec4 outColor;

uniform sampler2D tex0;

void main() {
  vec4 color = texture(tex0, vTexCoord);

  color.rgb = color.rgb - vec3(100.0 / 255.0);
  color.rgb = clamp(color.rgb, 0.0, 1.0);
  outColor = color;
}`;
```

色の処理に関わる部分は、以下のとおりです。

```javascript
...

function draw() {
  background(220);
  ...
}

const fragSrc = `#version 300 es
...

void main() {
  vec4 color = texture(tex0, vTexCoord);

  color.rgb = color.rgb - vec3(100.0 / 255.0);
  color.rgb = clamp(color.rgb, 0.0, 1.0);
  outColor = color;
}`;
```

毎回、背景をグレースケール（値は 0〜255）の 220 の値にして、そこから固定の値を減算します。減算する値は、以下のとおり 255段階のうちの 100 です。

```cpp
  color.rgb = color.rgb - vec3(100.0 / 255.0);
  color.rgb = clamp(color.rgb, 0.0, 1.0);
```

それを、RGB の全てで減算しています。
※ グレースケールなので、元の値は RGB とも同じ値

その際、シェーダーの処理の上で 0〜1.0（ピクセルの値では 0〜255 の値）におさまるように「clamp()」の処理を入れています（今回の例では不要ですが）。

これを実行した結果は、以下のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/67063e3f-982f-58c5-571f-c2ffb986a47c.png)

### 場所に応じた値の減算
以下が今回の内容の 2つ目です。

次は、減算する値を固定値ではなく、左上が 10 で右下が 200 となるような、グラデーションのある値の減算とします。

実装した内容は以下のとおりです。

```javascript
let s;

function setup() {
  createCanvas(640, 480);
  
  s = createFilterShader(fragSrc);
}

function draw() {
  background(200);
  filter(s);
}

const fragSrc = `#version 300 es
precision mediump float;

in vec2 vTexCoord;
out vec4 outColor;

uniform sampler2D tex0;

void main() {
  vec4 color = texture(tex0, vTexCoord);
  
  // 減算する値が、左上が10で右下が200となるようにする
  float subtractValue = mix(10.0, 200.0, (vTexCoord.x + vTexCoord.y) / 2.0) / 255.0;

  color.rgb = color.rgb - vec3(subtractValue);
  color.rgb = clamp(color.rgb, 0.0, 1.0);
  
  outColor = color;
}`;
```

以下がポイントになる箇所です。

```cpp
  float subtractValue = mix(10.0, 200.0, (vTexCoord.x + vTexCoord.y) / 2.0) / 255.0;
```

出力した結果は、以下のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/837ece70-437f-9f90-f04f-aefdcae2be68.png)

右下にいくにしたがって減算する値が大きくなるので、左上から右下に向かうにつれて、だんだん色が暗くなっていきます。
Terraform の AzAPI 2.0 のみで Azure リソース作成を試してみた

Terraform の AzureRM プロバイダーにリソースの定義がない場合、Azure REST API の仕組みが理解できれば AzAPI プロバイダーを使うことで、例えばリリースされたばかりの Azure サービスにも Terraform を使うことができます。今回は AzAPI がバージョン 2.0 になったので、復習も兼ねて AzAPI だけで Azure リソースを作成を試してみました。

## 検証用 main.tf

リソースグループとストレージアカウントを作成します。

```terraform:main.tf
terraform {
  required_providers {
    azapi = {
      source = "azure/azapi"
    }
  }
}

provider "azapi" {
}

variable "prefix" {
  type    = string
  default = "mnrazapi"
}

variable "region" {
  type    = string
  default = "japaneast"
}

resource "azapi_resource" "rg" {
  type     = "Microsoft.Resources/resourceGroups@2022-09-01"
  name     = "${var.prefix}-rg"
  location = var.region
}

resource "azapi_resource" "sa" {
  type      = "Microsoft.Storage/storageAccounts@2018-02-01"
  name      = "${var.prefix}sa"
  location  = var.region
  parent_id = azapi_resource.rg.id

  body = {
    sku = {
      name = "Standard_LRS"
    }
    kind = "StorageV2"
  }
}
```

## Terraform 初期化

`azure/azapi v2.0.1` が使用されていることを確認できます。

```bash:bash
$ terraform init
Initializing the backend...

Initializing provider plugins...
- Finding latest version of azure/azapi...
- Installing azure/azapi v2.0.1...
- Installed azure/azapi v2.0.1 (signed by a HashiCorp partner, key ID 6F0B91BDE98478CF)
```

## Terraform 実行

```bash:bash
$ terraform plan

$ terraform apply -auto-approve
```

## 作成された Azure リソース

![terraform-azapi2-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/840a21ca-c7ce-28da-4755-981af13b9362.png)

## 後片付け

```bash:bash
$ terraform destroy
```

## 参考

https://techcommunity.microsoft.com/t5/azure-tools-blog/announcing-azapi-2-0/ba-p/4275733

https://registry.terraform.io/providers/Azure/azapi/latest/docs

https://github.com/Azure/terraform-provider-azapi

https://learn.microsoft.com/ja-jp/rest/api/storagerp/storage-sample-create-account
Functions workerで.NET 8を選択できない

# 事象

数年ぶりにVisual StudioでAzure Functionsやりたくて、[クイックスタート](https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-create-your-first-function-visual-studio)を参考にAzure Functionsのプロジェクトを作成し始めました。
なぜか、Functions workerの欄に.NET8が表示されず、古いものしか選択できない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/383671b3-8a7e-1e74-37f1-8750033cdc71.png)

> dotnetコマンドで.NET8 SDKがインストールされているか確認しましたが、ちゃんと入っている。
>
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/2c3241e8-5ba2-4a7b-9a41-31ab987d54f9.png)

# 原因

Visual Studioにインストールされている、Azure Functions toolsets and templatesが古い。

# 解決方法

Visual Studioで、Tools > Options...を開き、Projects and SolutionsのAzure Functions画面で、Check for updatesとDownload & Installを実行する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/385de943-97e9-63f8-59ec-bd7598e48297.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/3efba708-499c-69ea-2d83-d57f28799f4e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/3249c6c9-17a1-09c7-5c84-dfb1f47a1c46.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/c038b34c-bfc0-72a7-b1f8-8502a0aa992e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/5226c91d-99de-5de2-6a2a-db5ecde4b72c.png)

# 参考リンク

* [.NET8 での Azure Functions の開発を始めるための準備 ( C# )](https://blog.beachside.dev/entry/2024/01/09/160000)
Kotlin onEachでbreak / continueをおこなう

# はじめに
いつも忘れてしまうのでonEachでbreak / continueする方法を記載します

# continue
**return@&#xFFF0;onEach**でcontinueできます。
具体例で説明します。2がスキップ(*1)できます。

```kotlin:Main.kt
fun main() {
    intArrayOf(1, 2, 3).onEach {
        if (it == 2) return@onEach
        print("$it ")
    }
    // 1 3 (*1)
}
```

# break
run {} でくくって、bk@でbreakできます。
具体例で説明します。2でbreak(*2)できています。

```kotlin:Main.kt
fun main() {
    run bk@{
        intArrayOf(1, 2, 3).onEach {
            if (it == 2) return@bk
            print("$it ")
        }
    }
    // 1 (*2)
}
```
Qiita投稿練習　マークダウン方式の練習からコマンドまでやってみる

# 【qiita投稿練習】とりあえずマークダウン方式の練習からやってみる

この辺の記事を参考にさせていただいて練習してみる。
https://qiita.com/Qiita/items/c686397e4a0f4f11683d
https://qiita.com/kamorits/items/6f342da395ad57468ae3

# 見出し
## 見出し
### 見出し
#### 見出し
タイトルにつかうのかな。＃に半角スペースでできた。
＃を増やすと小さくなりますね。
```
# 見出し
## 見出し
### 見出し
#### 見出し
```
* リスト
    * テキスト
    * 🧀
    * わーい
- リスト2
    - モッツァレラチーズ
    - パルメザンチーズ

リスト出来た。こんな感じね。インデントはTab入れるのね。
```
* リスト
    * テキスト
    * 🧀
    * わーい
- リスト2
    - モッツァレラチーズ
    - パルメザンチーズ
```


`カマンベールチーズ`
インライン表示。網掛けか。
```
`インライン表示`
```
**カチョカヴァロ**
太字ね。はいはい分かってきたよ

```
**カチョカヴァロ**
```

*スキクィーン*
斜体
```
*スキクィーン*
```
:::note alert
うおおおこんなのできるの。警告系ね。
:::
こんなのもできるのね。
```
:::note alert
うおおおこんなのできるの。警告系ね。
:::
```
これ書いたときに気づきましたが、
記事書くときに「/」を押したら下の一覧が出てくる。なるほど便利だ。これでいいじゃん。
ちなみに画像はドラック＆ドロップで貼れた。

![スクリーンショット 2024-10-26 075752.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3868520/81a65a68-8df2-7976-ee17-7a2368071958.png)

:::note warn
注意系ね
:::
「/」打った後「warn 注意の補足説明を挿入します」で出来た。
```
:::note warn
注意系ね
:::
```
<br/>

```
これもできるやんけ「```」とか毎回打つ必要無いんだな。
```
「/」打った後「codeblock コードブロックを挿入します」で出来た。↑
````
```
これもできるやんけ「```」とか毎回打つ必要無いんだな。
```
````



```:これもできるのか
あああ
```
こういうのもできるのね。

`````:書き方
```:これもできるのか
```
`````
ちなみにこれ↑はこう↓書いてる。コードブロックの中にコードブロックを書きたいときは外側と内側でバッククォートの数を変えるとよいらしい。

``````:書き方
`````
```:これもできるのか
```
`````
``````


```java:コードの書き方
int i = 0;
```
プログラムコードはこうね
`````:書き方
```java:コードの書き方
int i = 0;
```
`````


:::note info
ポイント的な？
:::
「/」打った後「info 補足説明を挿入します」で出来た。
```:書き方
:::note info
ポイント的な？
:::
```

一旦記事から非表示にしたいものは、下みたいにできるみたい。見えてないね。
<!--
ほーん
-->

```:書き方
一旦記事から非表示にしたいものは、下みたいにできるみたい。見えてないね。
<!--
ほーん
-->
```

<details><summary>折り畳み</summary>
フェタチーズ
</details>
なんと。折り畳みもできちゃうのね。便利ね。
「/」打った後「details 折り畳みを挿入します」で出来た。

```:書き方
<details><summary>折り畳み</summary>
フェタチーズ
</details>
```

| チーズ名 | 感想 |
|:-:|:-:|
|チーズ|うまい|
|カマンベールチーズ|ほんの少し癖があるのがうまい　ものによって癖の強さは変わる|
|チェダーチーズ|黄色い|

テーブルだあ！
「/」打った後「table テーブルを挿入」でフォーマットは出てくる。
`2x2`って打ってもフォーマット出てきた！「ｘ」は小文字のエックスね！

```:書き方
| チーズ名 | 感想 |
|:-:|:-:|
|チーズ|うまい|
|カマンベールチーズ|ほんの少し癖があるのがうまい　ものによって癖の強さは変わる|
|チェダーチーズ|黄色い|

```


あ、脚注もできるんだすごい、記事っぽい。記事なんだけど。→[^1]注1 [^2]注2
押せば注釈に飛べる。

```:書き方
あ、脚注もできるんだすごい、記事っぽい。記事なんだけど。→[^1]注1 [^2]注2
[^1]: 注釈サンプル。参考とか書くのかな。
[^2]: チーズトッピングは量が多ければいいというわけではない。 
```
* 補足
「/」打った後の
「reference 脚注へのリンクを挿入します」
「footnote 脚注の注釈内容を挿入します」
二つをセットで使うみたい。

まず「/」からreference を打った直後は`[^KEY]`って出てくるからKEYの部分を好きに書き換える。
そのあと「/」からfootnote で`[^KEY]:`が出てくるから「：」の横に注釈内容を書いて、さっき書き換えたKEY部分と同じものを書く。
って使うらしい

[^1]: 注釈サンプル。参考とか書くのかな。
[^2]: チーズトッピングは量が多ければいいというわけではない。
画面要件の作成とポイント解説

# 1. 画面要件とは？
画面要件は、ユーザーとシステムの接点となる画面の詳細な仕様を示したものです。具体的には、画面上で表示する項目・レイアウト・操作方法、および画面間の遷移などが含まれます。

**目的:** ユーザーがどのようにシステムと対話するかを明確にする。
**対象: **開発者、UI/UXデザイナー、プロジェクトマネージャーなど。**

# 2. 画面要件に含まれる項目

**(1) 画面構成・レイアウト**
表示する項目: 各画面でどのデータや情報が表示されるか（例：ユーザー名、商品価格など）。
**レイアウト**: ボタンやテキストの配置、入力フォームの位置など。
例: ヘッダー、サイドメニュー、メインコンテンツ、フッター。

**(2) ユーザー操作の仕様**
操作方法: 各画面での操作（クリック、タップ、ドラッグ、入力など）。
イベント: ボタンを押したときの挙動や、エラー時のアラート表示。
例: 「送信」ボタンを押すと、確認ダイアログが表示される。

**(3) 画面間の遷移**
遷移フロー: 画面から画面への遷移の流れ（例：ログイン画面 → ホーム画面 → 設定画面）。
条件付き遷移: 特定の条件が満たされたときにのみ、次の画面へ遷移する。
例: パスワードが正しくない場合は、エラーメッセージを表示して遷移しない。

**(4) デザイン要件**
配色・フォント: ブランドカラーや標準フォントの指定。
アイコンと画像: 使用するアイコンや画像の規定（解像度や形式など）。

**(5) 入力チェックとエラーメッセージ**
入力バリデーション: 必須項目や文字数制限、メールアドレスの形式チェックなど。
エラーメッセージ: 入力ミスやエラー発生時に表示されるメッセージの内容。

# 3. 画面要件の作成手順
**Step 1: 必要な画面の洗い出し**
プロジェクトの仕様に基づき、どの画面が必要かをリストアップします。
例: ログイン画面、ダッシュボード画面、設定画面。

**Step 2: 各画面の要素を定義**
画面ごとに、必要な入力項目、ボタン、表示内容を具体的に整理します。
例: ログイン画面には「ユーザー名」「パスワード」「ログインボタン」を配置。

**Step 3: 画面遷移図を作成**
画面遷移図（フロー図）を作成し、ユーザーがどのように画面を移動するかを視覚化します。
ツール例: Lucidchart、Figma、Draw.io。

**Step 4: デザイン要件を決定**
カラーやフォントなど、デザインに関する要件を定義します。
例: メインカラーは青 (#007BFF)、フォントは「Roboto」。

**Step 5: 入力チェックとエラー仕様を定義**
どの項目が必須か、どのような形式が必要かを決めます。
例: メールアドレスは「@」と「.」を含む形式。

# 4. 画面要件書のサンプルフォーマット

**画面名**	ログイン画面
**目的**	ユーザーがシステムにログインするための画面
**表示項目**	ユーザー名、パスワード、ログインボタン
**操作**	ユーザー名とパスワードを入力し、ログインボタンを押す
**遷移先**  ホーム画面（ログイン成功時）
**エラー画面**（ログイン失敗時）
**エラーメッセージ**	「ユーザー名またはパスワードが正しくありません」

# 5. 画面要件を作成する際の注意点
**ユーザー視点で設計する**

操作が直感的でわかりやすいか、ユーザー体験を重視しましょう。
開発とデザインの連携を取る

開発者とデザイナーが協力して、画面要件が実現可能であることを確認します。
要件の変更に柔軟に対応する

開発中に要件が変更される場合もあるため、バージョン管理をしっかり行いましょう。

# 6. ツールを使った画面要件の管理
**Figma:** UIデザインと要件整理に使えるクラウドベースのツール。
**Lucidchart:** 画面遷移図やフロー図の作成に便利。
**Jira:** 開発プロジェクトの管理と連携に適したツール。

# ポイントのまとめ:

**画面構成や操作方法を明確にする。**
画面遷移を視覚化して整理する。
入力チェックやエラーメッセージも事前に設計する。
このようにしっかりと設計された画面要件書は、開発の基盤となり、システムの品質向上に大きく貢献します。

**毎日更新していますので、@y-t0910をフォロー,いいねしていただけると嬉しいです。**
Imports

[Previous << References](https://qiita.com/flowcadence/items/115d12a5deafc732636d)
[Next >> Accounts](https://qiita.com/flowcadence/items/5ddbb79fe8438850cf57)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#cadenceの言語仕様を学ぶ

プログラムは、他のプログラムから（型、関数、変数などの）宣言(declarations)をインポートすることができます。

インポートは、`import` キーワードを使用して宣言(declared)します。

importに続いて、すべての宣言をインポートするロケーションを指定するか、宣言の名前を指定して`from` キーワードを続けて場所を指定します。

ローカルファイルをインポートする場合は、ロケーションはstringリテラルとなり、ファイルへのパスを指定します。ファイルインポートが書かれた（スマートコントラクト）コードのデプロイには、[Flow CLI](https://qiita.com/flowcadence/items/5ead732fad703556487d) の使用が必要です。

異なるアカウントのexternal タイプをインポートする場合は、ロケーションはアドレスリテラルとなり、その宣言がデプロイされ公開されたアカウントのアドレスになります。
```ruby
/* Import the type `Counter` from a local file. */
import Counter from "./examples/counter.cdc"

/* Import the type `Counter` from an external account. */
import Counter from 0x299F20A29311B9248F12
```


翻訳元

https://cadence-lang.org/docs/language/imports

***
<b>[Previous << References](https://qiita.com/flowcadence/items/115d12a5deafc732636d)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Imports)

<b>[Next >> Accounts](https://qiita.com/flowcadence/items/5ddbb79fe8438850cf57)</b>
Paths

[Previous << Accounts](https://qiita.com/flowcadence/items/5ddbb79fe8438850cf57)
[Next >> Storage](https://qiita.com/flowcadence/items/129d58ae7cb962056c6c)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#cadenceの言語仕様を学ぶ

アカウントストレージは、path(以下パスと記します)配下にオブジェクトを格納します。パスはドメインと識別子で構成されます。

パスは文字`/`で始まり、ドメイン、パス区切り文字の`/`、最後に識別子が続きます。識別子は文字で始まり、文字、数字、またはアンダースコア`_`のみが続きます。例えば、パス`/storage/test`はドメインがstorage、識別子がtestです。

有効なドメインは2つあります。`storage`と`public`です。

storageドメインのパスは型が `StoragePath`であり、publicドメインのパスは型が`PublicPath`です。`StoragePath`および`PublicPath`は、いずれも`Path`型のサブタイプです。

`storage`ドメインは、リソースや構造体など保存可能なオブジェクトを格納します。 `storage`ドメインに格納されたオブジェクトは、Storage権限(Entitlement)で承認されたアカウント参照のみアクセスができます。

`public`ドメインには、誰でもアクセス可能な機能群（capability）を格納します。

<h1 id="Path-functions">Path functions</h1>

```ruby
fun toString(): String
```
パスの文字列を返します。

```ruby
let storagePath = /storage/path

storagePath.toString()  // is "/storage/path"
```
文字列からパスを生成するユーティリティもあります。
```ruby
fun PublicPath(identifier: string): PublicPath?
fun StoragePath(identifier: string): StoragePath?
```
これらの各関数は識別子を受け取って、適切なドメインのパスを生成します。

```ruby
let pathID = "foo"
let path = PublicPath(identifier: pathID)

// is /public/foo
```

(補足: 短いですが、これが非常に大事な機能です。Flow Blockchainではまずスマートコントラクトでリソースを生成します。それをこのstorageドメインに保存します。但し、リソースは非常に大事であるため、リソースから何かを取り出す時以外は直接storageドメインにアクセスしません。代わりにpublicドメインにスマートコントラクトのfunctionを呼び出すためのCapabilityを保存します。publicと付いていますが、Capabilityはリソースオブジェクトのfunctionの集合ですのでそのリソースの持ち主でないと書き換えが出来ないようになっています。

直感的にトランザクションを実行できるのがこのPathのおかげです。リソースをスマートコントラクトで生成した後、storageのパスに保存し、そのリソース内にある関数を機能を絞ってpublicパスの配下におきます。これで直感的にpublicパスの中から呼び出したいリソース関数を呼び出せます。リソースの機能群を絞るにはインターフェースを使います。Capabilityを作る時にこのインターフェースをあてる事でそのインターフェースに設定した関数しか呼び出せなくなります。詳しくは[Capabilities]()のページを参照下さい。)

翻訳元

https://cadence-lang.org/docs/language/accounts/paths

***
<b>[Previous << Accounts](https://qiita.com/flowcadence/items/5ddbb79fe8438850cf57)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Paths)

<b>[Next >> Storage](https://qiita.com/flowcadence/items/129d58ae7cb962056c6c)</b>
ubuntuでNASを作ってみた（samba）

## sambaの構築
sambaはサーバ上のディスクを共有してファイルサーバを構築するできるサービスです。NASと書いていますけど、この記事ではRAIDを組んだりしていないので、ご注意を。
今回は、Ubuntu 24.04.1 LTS で実施しています

### 事前準備
事前準備としてお決まりのアップデート
~~~
apt update
apt upgrade
~~~

### インストール
~~~
apt install samba
~~~

### 共有するディレクトリを作成してパーミッション設定
~~~
chmod 777 /var/smbshare
~~~

### 設定ファイル編集
vi /etc/samba/smb.conf
~~~
[share]
path = /var/smbshare
browsable = yes
writable = yes
guest ok = no
~~~

### 接続ユーザのパスワード設定
~~~
smbpasswd -a -U userid
~~~

### サービスリスタート
~~~
systemctl restart samba
~~~

### クライアントから接続
windowsなどから、\\[ipアドレス]\share にアクセスすると、認証ダイアログがでてくると思いますので、設定したパスワードでログインしてみてください
Pythonでクラスを理解しよう

Pythonでクラスを理解し、使いこなせるようになると、コードの構造化や再利用がしやすくなり、複雑なシステムの設計や管理が簡単になります！今回は、そんな難しいクラスについて説明します

---

# はじめに

HI Engineer Collegeでは、実務未経験のエンジニアの方や、エンジニアに興味がある方を募集したおります、まずはお気軽にお問い合わせください。

※ (株)G&T（【内々定まで最短2週間】ゼロからしっかりじっくり研修☆20代活躍中！）

https://gat-company.com/

※ HI Engineer Collegeに興味あがある方はこちら（プログラミングを学習したい方）

https://hiengineer.jp/

※ ※ プログラミングでわからない事などを相談したい場合にはLINEオープンチャットにご参加ください（無料）

https://line.me/ti/g2/xRolADFbfopNo4vdgA9hmAlAlMgxvaIUSNDx8A?utm_source=invitation&utm_medium=link_copy&utm_campaign=default


---

### 1. **コードの再利用性が向上する**
   - クラスを使って一度作成した機能は、他のプロジェクトや場所で使い回すことが簡単です。
   - クラスは「設計図」の役割を果たし、そこから同じ特性を持つ「インスタンス」を何度も作成できるため、同じコードを繰り返し書く必要がなくなります。

### 2. **コードの構造化ができ、理解しやすくなる**
   - クラスを使用すると、関連するデータと機能を1つのまとまり（クラス）にまとめられるため、コードの構造が明確になります。
   - 例えば、車の動作や属性を管理する場合、「車」というクラスを作り、その中に車に関連する属性（色、メーカーなど）や動作（走る、止まるなど）を定義することで、管理しやすくなります。

### 3. **データの一貫性とセキュリティの向上**
   - クラスは、データとそれに関する操作をひとまとめにしたものです。これにより、各インスタンスごとに個別のデータが保持されるため、データの一貫性が保たれやすくなります。
   - プライベートなデータ（外部からアクセスできないデータ）を作成することで、直接データにアクセスできなくし、セキュリティや誤操作の防止も可能です。

### 4. **複雑なシステムを設計しやすくなる**
   - クラスを使うと、システム全体を小さな部品（クラス）に分解して構築できるため、複雑なシステムの設計が容易になります。
   - 例えば、大きなアプリケーションを「ユーザー」「商品」「注文」などのクラスに分け、それぞれに適切な属性やメソッドを持たせることで、システム全体が理解しやすくなり、管理しやすくなります。

### 5. **オブジェクト指向の概念を活用できる**
   - クラスはオブジェクト指向プログラミング（OOP）の基本的な構成要素であり、**継承**や**ポリモーフィズム**（多態性）、**カプセル化**などのOOPの特徴を活用できます。
   - 例えば、継承を使うことで、あるクラスの機能を別のクラスに引き継ぎつつ、追加や拡張ができるため、効率的に機能を追加できます。

---

### 例: クラスを使わない場合と使った場合の比較

**クラスを使わない場合**：

```python
car_color = "赤"
car_maker = "トヨタ"

def drive():
    print("車が走っています。")

def stop():
    print("車が止まりました。")

print(car_color)
drive()
stop()
```

**クラスを使った場合**：

```python
class Car:
    def __init__(self, color, maker):
        self.color = color
        self.maker = maker

    def drive(self):
        print(f"{self.color}の{self.maker}が走っています。")

    def stop(self):
        print(f"{self.color}の{self.maker}が止まりました。")

# インスタンスを作成
my_car = Car("赤", "トヨタ")
my_car.drive()
my_car.stop()
```

このように、クラスを使うと「車」に関連するデータや機能を一つの構造にまとめられ、管理が簡単になります。

---

### まとめ
クラスを使うことで、再利用性、可読性、保守性が向上し、複雑なシステムでも構造的に設計できるようになります。オブジェクト指向の概念を活用することで、システム全体が効率的に管理しやすくなるというのが、クラスを理解する大きなメリットです。
Grafana ダッシュボードのクエリを抜き出すツールの検討

Grafana ダッシュボードでパネルに設定したクエリが多数に膨れた場合に、いちいちパネルを見るのが辛くなってきます。  
JSON を見るのも辛くて嫌になってしまいます。  
そこで、エクスポートした JSON からクエリを抜き出すツールについて検討してみました。

## 役立ち情報

- 手軽に Grafana 参照
  [play.grafana.org](https://play.grafana.org/dashboards)を参照すると大まかな挙動把握ができて重宝しています。

- Grafana ダッシュボードの情報をエクスポート
  下記手順で Grafana ダッシュボードの情報をエクスポートでき、他の環境にも移行できます。
  1. Grafana ダッシュボードへ遷移
  1. Grafana ダッシュボードの上部にある Share ボタンか Share マークをクリック
  1. Export, Save to file をクリック

## 目的

Grafana ダッシュボードの情報をエクスポートすると、クエリ情報も出力されますが一行なので辛いです。

```json
【前略】
          "metricColumn": "none",
          "rawQuery": false,
          "rawSql": "SELECT\n  $__timeGroupAlias(payment_date,1h,NULL),\n  sum(amount) AS \"amount\"\nFROM payment\nWHERE\n  $__timeFilter(payment_date)\nGROUP BY 1\nORDER BY $__timeGroup(payment_date,1h,NULL)",
【後略】
```

下記がメインの目的なので、あると助かるが、正直「どうでもいいツール」に分類されるとは思います。

- クエリの問題が発覚したときに、類似する問題点を持ったパネルを一発 grep で把握したい
- 関連修正がもれなく行えたか一発 grep で把握したい
- 出力結果は git にでも突っ込んで構成管理に役立てたい（Grafana でもバージョン管理できるが、json ベースで見にくい）

## やったこと

下記でやりたいことは満たせています。  
ただ、昨今こうしたものをつくるのにも様々選択肢があると思います。  
生成 AI 絡めるとどうだったか、など次に触れようと思います。
[Grafana ダッシュボードのクエリを抜き出すツールを生成 AI に作成してもらった](https://qiita.com/wf-kenji-ikeda/items/44fceb22c2d518ead321)

因みに jq を使わず無理矢理感のある状態は意図的とはなります。  
どうでもいいツールなので、git bash だけあれば動くものがよく、jq 利用パターンを生成 AI 利用で検討する予定です。

```shell
#!/bin/bash

# JSONファイルのパス
json_file="./xxx.json"

# 一時ファイル
temp_file="filtered_json.tmp"

# 出力ディレクトリの作成
output_dir="sql_outputs"
mkdir -p "$output_dir"

# 必要な行だけ抽出（"title"と"rawSql"を含む行）
grep -E '"title":|"rawSql":' "$json_file" > "$temp_file"

# 変数
panel_title=""
raw_sql_content=""

# 抽出済みの一時ファイルから1行ずつ処理
while IFS= read -r line
do

    # パネルタイトルの取得
    if echo "$line" | grep -q '"title":'; then
        panel_title=$(echo "$line" | sed 's/.*"title": "\(.*\)",/\1/')

        # ファイル名として扱うため、スペースをアンダースコアに変換
        panel_title=$(echo "$panel_title" | sed 's/[ \t:]/_/g')

        # tmp.sqlがあればリネーム
        if [[ -f "${output_dir}/tmp.sql" ]]; then
            mv "${output_dir}/tmp.sql" "${output_dir}/${panel_title}.sql"
        fi
    fi

	# rawSqlの内容を処理中
    if echo "$line" | grep -q '"rawSql":'; then
        raw_sql_content=$(echo "$line" | sed 's/.*"rawSql": "\(.*\)",/\1/')

        # クエリの改行を反映
        raw_sql_content=$(echo "$raw_sql_content" | sed 's/\\n/\n/g')

        # 出力ファイル名の作成 (パネルタイトル)
        file_name="${output_dir}/tmp.sql"

        # クエリ内容を書き出し
        echo -e "$raw_sql_content" > "$file_name"
        echo "SQL query written to $file_name"

        # 変数をリセット
        raw_sql_content=""
    fi

done < "$temp_file"

# 一時ファイルを削除
rm "$temp_file"

echo "All SQL queries have been extracted."
```
M5C6)Grove Starter Kit for BeagleBone Green まとめ(M5Nano C6)



![o_coq429.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4e4294dc-8bb4-5557-dd98-520173fea71c.jpeg)



販売コード 109796
型番 110060131
発売日 2015/10/01
メーカーカテゴリ Seeed Studio(シードスタジオ)



https://akizukidenshi.com/catalog/g/g109796/





・[Grove I2C ADC](https://qiita.com/caa45040/items/a89b64202deba6f72422#grove-i2c-adc)

・[Grove I2C Hub](https://qiita.com/caa45040/items/a89b64202deba6f72422#grove-i2c-hub)

・[Grove リレー](https://qiita.com/caa45040/items/a89b64202deba6f72422#grove-%E3%83%AA%E3%83%AC%E3%83%BC)

・[Grove ブザー](https://qiita.com/caa45040/items/a89b64202deba6f72422#grove-%E3%83%96%E3%82%B6%E3%83%BC)

・[Grove ボタン](https://qiita.com/caa45040/items/a89b64202deba6f72422#grove-%E3%83%9C%E3%82%BF%E3%83%B3)

・[Grove 温度センサー](https://qiita.com/caa45040/items/a89b64202deba6f72422#grove-%E6%B8%A9%E5%BA%A6%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC)

・[Grove 音センサー](https://qiita.com/caa45040/items/a89b64202deba6f72422#grove-%E9%9F%B3%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC)

・[Grove OLEDディスプレイ](https://qiita.com/caa45040/items/a89b64202deba6f72422#grove-oled%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4)

・[Grove 3軸加速度センサ](https://qiita.com/caa45040/items/a89b64202deba6f72422#grove-3%E8%BB%B8%E5%8A%A0%E9%80%9F%E5%BA%A6%E3%82%BB%E3%83%B3%E3%82%B5)

・[Grove RGB-LED](https://qiita.com/caa45040/items/a89b64202deba6f72422#grove-rgb-led)






・Grove I2C ADC
-------------------------

https://qiita.com/caa45040/items/507e196f7d94ebf6136e


・Grove I2C Hub
-------------------------

https://qiita.com/caa45040/items/b5f004d7ff074c2ad7a3


・Grove リレー
-------------------------

https://qiita.com/caa45040/items/93a2e165c99ad3ffdcb8


・Grove ブザー
-------------------------


https://qiita.com/caa45040/items/e1aeb10489769e949b53


・Grove ボタン
-------------------------

https://qiita.com/caa45040/items/f77bb88f3f619412936e


・Grove 温度センサー
-------------------------

https://qiita.com/caa45040/items/696505b5da5296bb5176

・Grove 音センサー
-------------------------

https://qiita.com/caa45040/items/049c45fd4128bc9d472f


・Grove OLEDディスプレイ
-------------------------

https://qiita.com/caa45040/items/3a221ff9a54b15d2f0f1


・Grove 3軸加速度センサ
-------------------------

https://qiita.com/caa45040/items/0ecfd16028851f5d2cc2


・Grove RGB-LED
-------------------------

https://qiita.com/caa45040/items/db90ead91aa17b62f456
Go言語とJavaScriptで数値を人にやさしく表示する方法

# はじめに

Go言語とJavaScriptで開発するプログラムから数値を表示する時、人にやさしく表示するためのパッケージをの紹介です。バイト数をMBやGBにしたり、大きな数値をカンマ区切りで表示するためのものです。
82854982Bytesより82MBのほうが直感的にわかりやすいです。
6582491という数値よりも、6,582,491のほうがわかりやすいというものです。

# Go言語のパッケージ

Go言語は、go-humanize

https://github.com/dustin/go-humanize

です。

サンプルプログラムは

```go
package main

import (
	"fmt"
	"time"

	"github.com/dustin/go-humanize"
	"github.com/dustin/go-humanize/english"
)

func main() {
	// バイト数
	fmt.Printf("That file is %s.\n", humanize.Bytes(82854982)) // That file is 83 MB.
	// カンマ区切り
	fmt.Printf("You owe $%s.\n", humanize.Comma(6582491)) // You owe $6,582,491.
	// 少数
	fmt.Printf("%f\n", 2.24)                // 2.240000
	fmt.Printf("%s\n", humanize.Ftoa(2.24)) // 2.24
	// 英語の単数、複数形
	fmt.Printf("%s\n", english.Plural(1, "object", ""))  // 1 object
	fmt.Printf("%s\n", english.Plural(42, "object", "")) // 42 objects
	// SI単位
	fmt.Printf("%s\n", humanize.SI(1234000, "bps")) // 1.234mbps
	// 時間差
	fmt.Printf("%s\n", humanize.RelTime(time.Now().Add(time.Hour*24*7*-3), time.Now(), "earlier", "later")) // "3 weeks earlier")
}

```
で、実行結果は

```termina
That file is 83 MB.
You owe $6,582,491.
2.240000
2.24
1 object
42 objects
1.234 Mbps
3 weeks earlier
```


# JavaScriptのパッケージ

JavaScriptはnumeral.js

http://numeraljs.com/

です。

 サンプルプログラムは

 ```Javascript
 var numeral = require('numeral');

// バイト数
console.log("That file is " + numeral(82854982).format("0b") + ".") // That file is 83 MB.
// カンマ区切り
console.log("You owe $", numeral(6582491).format("0,0") +".") // You owe $6,582,491.
// 少数
console.log(2.24)                // 2.240000
console.log(numeral(2.24).format("0.00")) // 2.24
// SI単位
console.log(numeral(1234000).format('0.000a')+"bps"); // 1.234Mbps
// 時間
console.log(numeral(63846).format('00:00:00')); // 17:44:06

 ```

で実行結果は

```
That file is 83MB.
You owe $ 6,582,491.
2.24
2.24
1.234mbps
17:44:06
```


# 余談

これらのパッケージは、

https://note.com/twsnmp/n/na5c62f59833d

の開発で使っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3874862/cd242d4f-f095-c2a0-ce1a-bb4acf232524.png)

の赤枠の部分です。直感的にサイズ感がわかると思います。
picoCTF #Forensics - Verify

■問題
People keep trying to trick my players with imitation flags. I want to make sure they get the real thing! I'm going to provide the SHA-256 hash and a decrypt script to help you know that my flags are legitimate.

他の人が偽物のフラグを使ってプレイヤーを騙そうとしていますが、私はプレイヤーが確実に本物のフラグを手に入れられるようにしたいと考えています。そこで、SHA-256ハッシュ値と復号スクリプトを提供します。これを使えば、フラグが本物であることを簡単に確認できます。

■解き方
checksum.txt：SHA256のハッシュ値が書かれたファイル
decrypt.sum：復号用のシェルスクリプト
files：複数のファイルが含まれているディレクトリ
の計3つが用意されている。
checksum.txt内に記載されているハッシュ値と同様のハッシュ値をもつファイルを、files配下の複数のファイルの中から探す。
ファイルが特定できたら複合化し、フラグを取得する。

①ssh接続

②lsでディレクトリ・ファイル等を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519665/0a28d62f-4ec3-9d46-1e84-e849938233b6.png)

③checksum.txt内に記載されているハッシュ値を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519665/d020d799-e4cf-1a8e-71eb-1e8853b7a291.png)

④sha256sumコマンドを使用して同じハッシュ値のファイルを検索しファイルを特定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519665/b7f0db81-a049-0260-3624-9ae3e65dbe1f.png)

⑤特定したファイルを復号化してフラグを取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519665/593a51c2-f56c-e3e4-3f4e-c888ba223cec.png)
[アセンブラ] sectionを整列するプログラム　'secsort.py'


axxに必要があって作りました。

例えば、

```
section .text
    mov rax,1
section .data
    .asciiz "test1"
section .text
    mov dsi,2
section .data
    db 10
```

のようなアセンブリリストを、

```
section .text
    mov rax,1
    mov dsi,2
section .data
    .asciiz "test1"
    db 10
```

のように並べ変えます。

`$ ./secsort.py infile.s >outfile.s`のように使ってください。

本体

```secsort.py
#!/usr/bin/python
import sys

pas=0
current_section=".text"
sections={ '.text' :['']}
capital="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
lower="abcdefghijklmnopqrstuvwxyz"
digit='0123456789'
alphabet=lower+capital
lwordchars=lower+capital+digit+"_"


def skipspc(s,idx):
    while len(s)>idx:
        if s[idx]==' ':
            idx+=1
            continue
        break
    return idx


def get_label_word(s,idx):
    idx=skipspc(s,idx)
    t=""
    if len(s)>idx and (s[idx]=='.' or s[idx] in lwordchars):
        t=s[idx]
        idx+=1
        while len(s)>idx:
            if not s[idx] in lwordchars: 
                break
            t+=s[idx]
            idx+=1
    return t,idx

def readsections(fn):
    global sections,current_section
    with open(fn,"rt") as file:
        while True:
            l=file.readline().replace(chr(13),'')
            if l=='':
                return True
            l=l.strip()

            (sec,idx)=get_label_word(l,0)
            if sec.upper()=="SECTION" or sec.upper()=="SEGMENT":
                (secname,idx)=get_label_word(l,idx)
                if secname==current_section:
                    continue
                else:
                    current_section=secname
                    continue
            elif sec.upper()==".LABELC":
                idx=skipspc(l,idx)
                ss=""
                while True:
                    if len(l)<=idx or l[idx]=='"':
                        break
                    ss+=l[idx]
                    idx+=1
                lwordchars=alphabet+digit+ss+"_"
                continue
            elif sec.upper()==".INCLUDE":
                idx=skipspc(l,idx)
                if l[idx]=='"':
                    idx+=1
                fn=""
                while True:
                    if len(l)<=idx or l[idx]=='"':
                        break
                    fn+=l[idx]
                    idx+=1
                readsections(fn)
            else:
                if current_section in sections:
                    sections[current_section]=sections[current_section]+[l]
                else:
                    sections[current_section]=[l]

def writesections():
    l=list(sections.items())
    for i in l:
        (a,b)=i
        print("section    ",a)
        for k in b:
            print(k)

if __name__=='__main__':
    readsections(sys.argv[1])
    writesections()

```

sortと言っても、sectionは見つけた順番に整列されます。

.includeにも対応しています。

```
.include "file.s"
```

とすると、"file.s"をインクルードします。
Java SE Gold で勉強したことメモ(Enum編 その2)

JavaのEnum型のクラスにはコンストラクタを定義することができるみたいです。
Enum型の列挙子はEnumを使用するタイミングでJVMが自動であまねくインスタンス化するらしいです。

また、JavaのEnumはほかの言語のEnumとちがってクラスとして定義されていて、Objectを継承、Serializable、Comparableを実現しているため、toString()やhashCode()、compareTo()などのメソッドが用意されています。

それを踏まえたうえで、以下のコードは次のような結果になります。

```php:EnumSample.java
public enum EnumSample{
    Gold("Gold!"),Silver("Silver!"),Bronze("Bronze!");
    private String value;

    private EnumSample(String value){
        this.value = value;
        System.out.println(this.value);
    }

    @Override
    private String toString(){
        return this.value;
    }
}
```
```php:Main.java
public Main{
    public static void main(String[] args){
        System.out.println(EnumSample.Gold);
    }
}
```

実行結果
```
Gold!
Silver!
Bronze!
Gold!
```

なお、EnumクラスのコンストラクタはEnum型の性質上privateにすることが義務づけられています。
そのため、privateを省略した場合は、暗黙的にprivateになります。


もしかしたらどこかで使うかもしれない？のでメモしました。
間違っている箇所があれば教えてください。
AtCoder日記 2日目

# 目次
[1.今日行ったこと](#今日行ったこと)
[2.次やりたいこと](#次やりたいこと)
[3.所感](#所感)

## 今日行ったこと

###### ・[AtCoder Beginners Selection](https://atcoder.jp/contests/abs)の続きを3問解く
以下を解いた。といっても最初の2問は解説見て理解しながら写経みたいになっていた。
・[ABC081B - Shift only](https://atcoder.jp/contests/abs/tasks/abc081_b)
・[ABC087B - Coins](https://atcoder.jp/contests/abs/tasks/abc087_b)

いざ実践と思いこっちは自分で0から書いてみた。（エラー出た部分だけ調べたりした。）
・[ABC083B - Some Sums](https://atcoder.jp/contests/abs/tasks/abc083_b)

```answer.py
N, A, B = map(int, input().split())

sum = 0

# 1からNまでの数字を網羅するfor文
for i in range(N+1):
    # Nの桁数を測る
    if (N+1)/10 == 0:
        if A <= N+1 and N+1 <= B:
            sum = sum + N+1
    elif (N+1)/100 == 0 and (N+1)/10 >= 1:
        k = (N+1)/10
        l = (N+1)%10
        if A <= k+l and k+l <= B:
            sum = sum + N+1
    elif (N+1)/1000 == 0 and (N+1)/100 >= 1:
        k = (N+1)/100
        l = (N+1)/10
        m = (N+1)%10
        if A <= k+l+m and k+l+m <=B:
            sum = sum + N+1            
    elif (N+1)/10000 == 0 and (N+1)/1000 >= 1:
        k = (N+1)/1000
        l = (N+1)/100
        m = (N+1)/10
        n = (N+1)%10
        if A <= k+l+m+n and k+l+m+n <=B:
            sum = sum + N+1

print(sum)
```
結果は通らず、眠気の限界が来たのであきらめる。。。
この実装だけでわからないことが何個かあったから、次は以下調査したい。

・int(input())じゃ数値を受け取れなかった理由（mapを使う理由？）
・各桁の上手な取り方（10とか100とかの割った数で取るしか思いつかず）
・mapとlistの使い方

###### ・[AtCoder Beginner Contest 376](https://atcoder.jp/contests/abc376)をチラ見
企業のコーディングテストとかで例えられるABC問題がどのくらいの難易度なのか？を知りたくてチラ見してみた。
以下感想。

・[A - Candy Button](https://atcoder.jp/contests/abc376/tasks/abc376_a)
    頑張れば解けそう。
    ボタンを押して飴貰える→数値0に初期化して次押すときC秒経っていなかったら初期化せず次のTに遷移～
    という流れが想像できたため。

・[B - Hands on Ring (Easy)](https://atcoder.jp/contests/abc376/tasks/abc376_b)
    ルールを理解するのに2分ぐらいかかった。
    いわゆる探索系なんだろうけど、さっぱり実装イメージが思いつかず。Lが5だからR動かすときに5経由しちゃダメってどう実装で表すのかがわからない。。。

・[C - Prepare Another Box](https://atcoder.jp/contests/abc376/tasks/abc376_c)
    ルールを理解するのに4分ぐらいかかった。
    Bとよりかは解けそうなイメージあり。Aの最小値>Bの最小値だったらもう終わりで、それ以外の場合は比較しまくってなんとか。。。みたいな実装イメージになった。

解説動画あるっぽいし、時間あるときに見てみたい。（解説手厚いの凄い）
https://atcoder.jp/contests/abc376/editorial

## 次やりたいこと
・[ABC083B - Some Sums](https://atcoder.jp/contests/abs/tasks/abc083_b)の復習
・この記事に書いたわからない部分を調査する
・AtCoder Beginners Selectionを全問解く（残り6問）
・[AtCoder Beginner Contest 376](https://atcoder.jp/contests/abc376)の解説動画を見てみる
・AWS Certified Cloud Practitionerの受験に向けて勉強

## 所感
ちょっとずつ分からないことが分かるようになってきた。（無知の知）
いわゆるアルゴリズムのテンプレを覚えて、それを問題の解法に当てはめていく形になっていくのだろうか？
あと、どこまでやったらコンテストチャレンジするかの目安も決めたい。（当分先だろうけど）