OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScriptのお勉強のやり方

# プログラミングの勉強を始める前に・・・
学習の心構えとして
１）最初から完璧にしたいと思わないで！
２）少しずつ段階を踏んでいこう
３）近道はないよ

以上のことを踏まえて、最初はキレイな書き方ではなく不格好でも「書くことができる」を目指していきましょう！！！

# JavaScript入門：まずはコンソールを使ってみよう！

こんにちは！このQiita記事では、JavaScriptを初めて学ぶ方に向けて、簡単な例題を使ってコンソールでコードを実行する方法を紹介します
コードを書きながら学べるので、ぜひ一緒に手を動かしてみてください

## 1. コンソールって何？

コンソールは、プログラムの出力を確認したり、直接JavaScriptのコードを入力して実行するためのツールです
ブラウザに標準で備わっており、Google ChromeやFirefoxなどで簡単に使うことができます

### コンソールを開く方法
1. ブラウザを開く
2. キーボードショートカットで「`F12`」または「`Ctrl + Shift + I`（Macなら`Cmd + Option + I`）」を押して開発者ツールを表示
3. 「コンソール」タブを選択

これで準備完了です！コンソールにJavaScriptのコードを入力して実行してみましょう

---

## 2. 初めてのJavaScriptコードをコンソールで実行しよう

### 例1: `console.log()`を使ってみよう

まずは基本の「`console.log()`」を使って、コンソールにメッセージを表示してみましょう

```javascript
console.log("Hello, World!");
```

これをコンソールに入力して実行してみてください
画面に「`Hello, World!`」と表示されるはずです

### 解説
- `console.log()`は、JavaScriptで値やメッセージを表示するための関数です
- プログラムが正しく動いているかを確認するのに便利です

---

## 3. 変数を使ってみよう

プログラミングでは「変数」を使ってデータを保存します
次の例では、変数に数値を代入して、コンソールに表示してみましょう

### 例2: 変数を宣言して表示する

```javascript
var number = 10;
console.log(number);
```

このコードでは、`number`という変数に10を代入し、それを`console.log()`で表示しています

### 解説
- `var`は変数を宣言するキーワードです
- `number`という変数を作って、`10`をその中に保存しています
- その後、`console.log(number)`で変数の値が表示されます

---

## 4. 条件分岐を試してみよう

次に、条件分岐（`if`文）を使って、値に応じて異なるメッセージを表示するプログラムを作ってみましょう

### 例3: `if`文を使った条件分岐

```javascript
var score = 75;

if (score >= 80) {
  console.log("Good job!");
} else {
  console.log("Keep trying!");
}
```

### 解説
- `if`文は、条件に応じて異なるコードを実行するための構文です
- `score`が80以上なら「`Good job!`」を、そうでなければ「`Keep trying!`」を表示します

---

## 5. 繰り返し処理をしてみよう

最後に、繰り返し処理（`for`文）を使って、同じ処理を何度も実行するプログラムを作ってみましょう

### 例4: `for`文を使ったループ

```javascript
for (var i = 1; i <= 5; i++) {
  console.log("This is loop number " + i);
}
```

### 解説
- `for`文は、繰り返し処理を行うための構文です
- `i`という変数が1から5まで変化しながら、その値を使ってコンソールにメッセージを表示しています

---

## 6. まとめ

今回は、JavaScriptの基本を学びながら、コンソールで実際にコードを実行する方法を紹介しました
特に以下の点に注目して学んできました

- コンソールの使い方：簡単にコードを実行できる開発者ツールのコンソール
- console.log()の便利さ：デバッグやプログラムの動作確認に役立つメソッド
- 変数や条件分岐、ループ：プログラムの基本的な構造を作る要素
初めてのJavaScriptでは、まずは「どう動くか」を試してみることが大事です
コンソールを使って、エラーが出ても怖がらずに実験することで、プログラミングに対する理解が深まります

次のステップとしては、自分で小さなアプリケーションを作ってみたり、日常生活で使えるちょっとしたツールを作成してみるのがおすすめです
たとえば、「簡単な計算機」や「ToDoリスト」を作ってみるのも良い練習になります
その次くらいにコーディング規約を意識していくという流れで進めていきたいものですね
コーディングは学び続けることで成長するので、ぜひ楽しみながら続けてみてください！
HVACの一般的な問題を解決する簡単なステップ

一年中快適な住まいを保つには、十分に機能するHVACシステムを維持することが重要です。しかし、最も信頼性の高いシステムでも、時間の経過とともに問題が発生することがあります。空気の流れの悪さであれ、予期せぬノイズであれ、これらの一般的な問題のトラブルシューティング方法を知っていれば、時間とお金を節約することができます。
## よくあるHVAC問題の認識
1. 冷暖房が効かない
冷房や暖房の効きが悪くなった場合、最も一般的な原因はエアフィルターの汚れです。エアフィルターが詰まると、空気の流れが妨げられ、効率が低下します。まずはエアフィルターをチェックし、必要に応じて交換してください。また、設定温度が正しいか、サーモスタットが正常に作動しているかも確認しましょう。

また、屋外ユニットが詰まっている場合、空気の流れが妨げられている可能性があります。ユニット周辺にゴミや草木がないか確認し、障害物を取り除いてください。

2. 異常な音や振動
HVACシステムから異常な音がする場合、内部の部品が故障している可能性があります。カチカチ音、ブンブン音、または金属音など、音の種類に応じて原因が異なります。特にカチカチ音が聞こえる場合、リレーやキャパシタが問題を引き起こしているかもしれません。

このような場合、プロの技術者に点検を依頼するのが最も安全です。地域に精通した専門家、[たとえば Blackice Heating and Cooling のような](https://blackiceheatingandcooling.com.au/)専門業者に相談することをお勧めします。

3. 電気代が急増した
突然の電気代の増加は、HVACシステムの効率が低下している可能性を示唆しています。これは、システムのメンテナンス不足が原因である場合が多く、エアフィルターの汚れやコンデンサーの故障が主な原因です。システムのメンテナンスを怠らず、年に一度は定期点検を行いましょう。

また、外部ユニットのコイルに汚れが溜まっている場合も効率が低下し、エネルギー消費が増える原因となります。これに対処するためには、コイルを定期的に清掃することが重要です。

## 問題が解決しない場合の対処方法
上記の基本的なトラブルシューティングを行っても問題が解決しない場合は、専門家に相談することが最善の選択肢です。[例えば、Air Conditioning Mornington Peninsula のような地元の業者が迅](https://blackiceheatingandcooling.com.au/air-conditioning-mornington-peninsula/)速かつ信頼できるサービスを提供してくれるでしょう。

## 専門家による定期メンテナンスの重要性
HVACシステムの寿命を延ばし、効率を最大化するためには、定期的なメンテナンスが必要不可欠です。フィルターの清掃、空気の流れの確認、冷媒レベルの調整など、プロによる点検は故障を未然に防ぎ、エネルギー効率を維持するための最善策です。

特に季節の変わり目には、定期点検を行うことが重要です。これにより、極端な気温時でも快適さを保ちながら、無駄なエネルギー消費を避けることができます。

HVACシステムのトラブルは放置するとコストがかさみますが、基本的なトラブルシューティングを行うことで多くの問題を解決できることが分かります。また、問題が解決しない場合やメンテナンスが必要な場合は、専門業者に頼ることで、システムの効率を最大限に引き出すことができます。
アクセス範囲の制限【備忘録】

今日も今日とて誰の為でもない自分の為だけの記事を書く。

投稿者、ログイン者の見れるサイトを限定する場合
該当するコントローラーの最初に書く（今回はitems)
```
before_action :authenticate_user!, except: [:index, :show] 
#トップページと詳細ページ以外はログインしている人だけしか見れない  
```

ログイン以外の人はトップと詳細ページ以外を見ようとするとコントローラー内の最後に飛んで

```
def move_to_index
  @item = Item.find(params[:id])
  unless @item.user == current_user
    redirect_to action: :index
  end
```
unlessは投稿者と今のログイン者が同じじゃなかったらトップページに飛ぶ、の意味。


同じコントローラー内でここ大事！
```
def item_params
  params.require(:item).permit(:title, :catch_copy, :image, :concept).merge(user_id: current_user.id)
end
```
itemsはマージしない。

でも別コントローラー内ではマージする時もある（例：commentsコントローラー)。
```
 def comment_params
    params.require(:comment).permit(:content).merge(user_id: current_user.id, item_id: params[:item_id])
  end
```

いやあ、難しいなあ。。。
【React】keyの使い方

## リストの項目を識別する

`map()`などを使用して配列からコンポーネントのリストを表示する場合、各コンポーネントの`key`にユニークな値を渡す必要があります。

```jsx
const FruitList = () => {
    const fruits = [
        { id: 1, name: 'Apple', color: 'Red' },
        { id: 2, name: 'Banana', color: 'Yellow' },
        { id: 3, name: 'Cherry', color: 'Red' },
        { id: 4, name: 'Date', color: 'Brown' },
    ];

    return (
        <div>
            <h2>Fruit List</h2>
            <ul>
                {fruits.map((fruit) => (
                    <li key={fruit.id}>
                        {fruit.name} - <span style={{ color: fruit.color }}>{fruit.color}</span>
                    </li>
                ))}
            </ul>
        </div>
    );
};

export default FruitList;
```

https://react.dev/learn/rendering-lists#keeping-list-items-in-order-with-key

## 状態をリセットする

`key`を渡すことでコンポーネントの状態をリセットすることができます。

```jsx
import { useState } from 'react';

export default function Scoreboard() {
  const [isPlayerA, setIsPlayerA] = useState(true);

  return (
    <div>
      {isPlayerA ? (
        <Counter key="Alice" person="Alice" />
      ) : (
        <Counter key="Bob" person="Bob" />
      )}
      <button onClick={() => {
        setIsPlayerA(!isPlayerA);
      }}>
        Next player!
      </button>
    </div>
  );
}

function Counter({ person }) {
  const [score, setScore] = useState(0);
  const [hover, setHover] = useState(false);

  let className = 'counter';
  if (hover) {
    className += ' hover';
  }

  return (
    <div
      className={className}
      onPointerEnter={() => setHover(true)}
      onPointerLeave={() => setHover(false)}
    >
      <h1>{person}'s score: {score}</h1>
      <button onClick={() => setScore(score + 1)}>
        Add one
      </button>
    </div>
  );
}

```

`key`を設定することで 2つの`Counter`は別のコンポーネントであると認識され、`isPlayerA`の値が切り替わるたびに状態がリセットされます。

https://react.dev/learn/preserving-and-resetting-state#option-2-resetting-state-with-a-key
シェルスクリプトでプログレスバーをつくろう

# はじめに
シェルスクリプトで一連の処理を書く際に、プログレスバーを利用すると進捗がわかりやすくなります。

例：
![スクリーンショット 2024-10-17 23.24.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682035/e4059e8e-932d-0d1c-1afd-853a012c94e0.png)

# スクリプト

```sh:progress.sh
#!/bin/sh

# 最大値の設定
max=100

# プログレスバーを描画する関数
progress_bar() {
    local progress=$1
    local width=50  # プログレスバーの幅
    local completed=$((progress * width / max))

    printf "["

    if [ $progress -lt $max ]; then
        # 100%未満の場合
        if [ $completed -eq $((width - 1)) ]; then
            # 99%の場合、最後の2文字を "=="にする
            printf "%0.s=" $(seq 1 $((completed + 1)))
        else
            printf "%0.s=" $(seq 1 $completed)
            printf ">"  # 右矢印
            local remaining=$((width - completed - 1))
            printf "%0.s-" $(seq 1 $remaining)
        fi
    else
        # 100%の場合
        printf "%0.s=" $(seq 1 $width)
    fi

    printf "] %d%%" "$progress"

    tput el # 行末までを消去
}

# 進捗バーを100%まで表示
for i in $(seq 0 $max); do
    tput civis  # カーソルを非表示にする
    progress_bar "$i"
    sleep 0.05  # プログレスバーの更新速度を調整
    if [ $i -lt $max ]; then
        tput cr  # 100%未満の場合、行の先頭にカーソルを戻す
    fi
done

tput cnorm  # カーソルを再表示
echo -e "\e[32m\n完了しました！\e[0m"

exit 0
```
【C#】bUnitでHTMLタグのidを指定して対象を取得する方法

## 初めに

Blazor用の単体テストフレームワークのbUnitを使用した際に気になったことを備忘をかねてまとめます。

追記 2024/10/18
bUnit公式のメソッド仕様の欄にIDを用いた絞り込み方法について記載がありました。
解決方法の部分を修正しました。
@albireo 様。教えてくださりありがとうございます。

## 問題

bUnitの公式チュートリアルを見てみるとテスト対象のテキストを取得する際には`<p>`タグでのみ絞り込みを行っています。

https://bunit.dev/docs/getting-started/create-test-project.html?tabs=xunit

実際のプロジェクトでは同じHTMLタグを複数回使用するケースが普通であるためIDを指定して要素を取得する方法を調査しました。

## 解決方法

[こちら](https://bunit.dev/api/Bunit.RenderedFragmentExtensions.html#Bunit_RenderedFragmentExtensions_FindAll_Bunit_IRenderedFragment_System_String_System_Boolean_)にあるようにcssSelectorで指定することができます。

``` Csharp
[TestMethod]
public void OnButtonClick_InitialState_ByValue()
{
    // Arrange
    var calc = Render(@<Calculator />);
    var ele = calc.Find("div#test");

    // Assert
    Assert.AreEqual("", ele.TextContent);
    }
```

上記の例では`div`タグのIDが`test`の要素を取得しています。
もちろんタグとIDを修正すれば別の要素の指定も可能です。

<details><summary>LINQを使用する方法(旧バージョン)</summary>

(上に空行が必要)

```rb
puts 'Hello, World'
```


IDはプロパティとして保持しているためLINQを使用して取得可能です。

``` Csharp
[TestMethod]
public void OnButtonClick_InitialState_ByValue()
{
    // Arrange
    var calc = Render(@<Calculator />);
    var ele = calc.FindAll("div", false).First(o => o.Id == "test");

    // Assert
    Assert.AreEqual("", ele.TextContent);
    }
```

`div`要素のうちIDが「test」のものを指定取得しています。`First()`メソッドを使用している理由はそのままだと`IEnumerable`クラスの値が返ってくるため先頭１つを指定しています。

::: note info
`FindAll()`メソッドで`div`タグ絞り込まなくても、IDで一意に取得できます。ただしこちらのほうが、取得した要素の種類をコード上から読み取れイメージがしやすくなります。
:::

</details>

## おわりに

bUnitのポテンシャルが徐々に見えてきた気がします。

## 参考

https://bunit.dev/docs/getting-started/create-test-project.html?tabs=xunit
Felica Lite-S nfcpyのauthenticateメソッドでハマった話

ドキュメントを真面目に読めば書いてるかもしれないが、ハマったので備忘録

# 結論
`password`はカード鍵(`CK`)のこと。メソッドに渡す際にはCK1,CK2それぞれをリトルエンディアンに変換する必要があるようです。

```python
# リーダーの読み込み
clf = nfc.ContactlessFrontend("usb")
tag:Type3Tag = clf.connect(rdwr={'on-connect': lambda tag: False})

# IDブロックの値を読み出し、カード鍵を生成
# ここで生成されるCKは図3-13に従ったビッグエンディアン（デフォルト）の値です
ID = tag.read_without_encryption([ServiceCode(0, 0x0b)], [BlockCode(0x82)])
CK = auth.generate_personalized_card_key(ID)

# カード鍵を用いて相互認証
print(tag.authenticate(CK[7::-1]+CK[:7:-1]))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629819/a7cfe8f4-9bce-60ee-0503-0a6864c79c2a.png)


# セッション鍵(SK)の生成方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314089/85885f1d-d4d5-ee7b-bc75-dd8d1804ca97.png)
☆でバイトーオーダーを反転、⊕は排他的論理和です。

# passwordとは？
以下のように記載があります。`password`ってなんやねん！？！！？！？

Google翻訳
>`authenticate(password)`
FeliCa Lite-S Tagで相互認証します。
>
>FeliCa Lite-Sは強化されたセキュリティ機能をサポートしており、その一つがこの方式による相互認証です。相互認証の最初の部分は、FelicaLite.authenticate() でタグを認証することです。成功すると、共有セッション キーを使用して書き込み操作の整合性チェック値が生成され、特定のメモリ ブロックが更新されます。それが成功すると、タグはリーダーが正しいカード キーを持っていることが保証されます。

原文
<details>
>`authenticate(password)`
Mutually authenticate with a FeliCa Lite-S Tag.
>
>FeliCa Lite-S supports enhanced security functions, one of them is the mutual authentication performed by this method. The first part of mutual authentication is to authenticate the tag with FelicaLite.authenticate(). If successful, the shared session key is used to generate the integrity check value for write operation to update a specific memory block. If that was successful then the tag is ensured that the reader has the correct card key.
</details>

わからないのでライブラリの中身を覗くと、どうやら`SK`を生成するための鍵が`password`のようです。`SK`の生成方法の図を見ると、これは`CK`が該当するようです。

```nfc.tag.tt3_sony.py
from pyDes import triple_des, CBC
def _authenticate(self, password):
    # 色々あるけど省略

    key = b"\0" * 16 if not password else password[0:16]
    
    # The session key becomes the triple_des encryption of the random
    # challenge under the card key and with an initialization vector of
    # all zero.
    sk = triple_des(key, CBC, b'\00' * 8).encrypt(rc)
```

# CKをリトルエンディアンに変換するのはなぜ？
察しの良い方はもう気づいているかもしれません。図を見ると`CK1`,`CK2`のバイトオーダーを反転させているのに、ライブラリでは反転させずに`SK`を生成しています。
これを調整するため、`password`で`CK`の値を渡すときにあらかじめリトルエンディアンに変換します。
```nfc.tag.tt3_sony.py
sk = triple_des(
    key, # <-バイトオーダーを反転させてない
    CBC, 
    b'\00' * 8
    ).encrypt(rc)
```

# 補足
`CK`を生成する方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629819/e919a0eb-92f0-524c-5345-a541b767b20e.png)
投稿 109 Dockerイメージ 2024/10/17

本日の勉強時間　2H

Dockerイメージとは
Dockerコンテナ構成をまとめたもの(テンプレート)を指します。
Dockerイメージを元にDockerコンテナを作成します。

Dockerイメージは使い回しができるので複数コンテナをまとめて作成できます。

別のDockerホストに同じDockerコンテナを作成することもできます。
投稿 108 Dockerエンジン 2024/10/16

本日の勉強時間　2H

エンジンとは、一般的には内燃機関を指すが、
IT用語としては
ある特定の処理を行うための機能を提供する、ひとまとまりになった処理装置のこと。
プログラムを指す場合が多いが、カスタムICなどのハードウェアを指す場合もある。


Dockerエンジンとは、コンテナ型仮想化技術(機能)を提供するプログラムを指します。
投稿 107 Docker コンテナ 2024/10/15

本日の勉強時間　3H

Dockerコンテナとは、Docker社が開発するコンテナ型のアプリケーション実行環境（仮想環境）です。Dockerコンテナは、独立した環境として存在し、他のDockerコンテナやホストとなる環境に影響することはありません。﻿
【Pygame】TEXTEDITINGイベントの文字数制限を超えて入力を受け取る方法

# 結論
環境変数SDL_HINT_IME_SUPPORT_EXTENDED_TEXTを"1"に設定する。
制限を超えた分は複数のイベントに分けて送信されるので、それを処理する。

# 解説
Pygameでテキスト入力を実現するには、入力の内容をTEXTINPUT、TEXTEDITINGイベントから取得するのが一般的です。
TEXTEDITINGイベントでは、pygame.event.get()で取得したEventオブジェクトにtext（入力テキスト）, start（入力の編集カーソル位置）, length（編集カーソル位置からの編集文字数）属性が設定され、TEXTINPUTイベントでは、text属性にTEXTEDITINGで入力した内容が格納されます。

## SDL_HINT_IME_SUPPORT_EXTENDED_TEXTとは？
初期状態では、 SDL_TEXTEDITINGEVENT_TEXT_SIZEという環境変数で保持できるテキストのサイズがあらかじめ設定されており、サイズはchar(1バイト) × 32ですから、それを超える分の入力は確定しても捨てられます。（UTF-8の日本語は一文字3バイト、ほぼ使われないが最大4バイトの文字まで定義されている）
これを事実上解除する設定がSDL_HINT_IME_SUPPORT_EXTENDED_TEXTというわけです。

## 仕様
SDL_HINT_IME_SUPPORT_EXTENDED_TEXT="1"では、TEXTEDITINGイベントのtext属性で SDL_TEXTEDITINGEVENT_TEXT_SIZEを超える分は、複数回のTEXTINPUTイベントに分けて送信されることになります。
![pygame_textediting_textinput_event_example.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176822/c795986f-7b37-99b3-51ff-2483e8d240df.gif)



# 参考
https://wiki.libsdl.org/SDL2/SDL_HINT_IME_SUPPORT_EXTENDED_TEXT>

https://dygv.github.io/blog/post/2021/01/pygame%E3%81%AE%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E5%85%A5%E5%8A%9B/

https://github.com/libsdl-org/SDL/blob/SDL2/include/SDL_hints.h
Ubuntu 24.04 (Noble Numbat) でRをセットアップする方法

# はじめに
RはデータサイエンスやSEMなどの統計解析で広く使用されているプログラミング言語です。本記事では、最新のUbuntu 24.04 (Noble Numbat) にRをインストールする方法を詳しく解説します。最新のOSでは時にパッケージの互換性の問題に直面することがありますが、そのような課題の解決方法も含めて説明していきます。

# 前提条件
 Ubuntu 24.04 (Noble Numbat) がインストールされていること
 ターミナルの基本的な操作ができること
 sudo 権限を持っていること

# 使用するツール
 apt: Ubuntuのパッケージ管理システム
 wget: ウェブサーバーからコンテンツを取得するためのコマンドラインツール
 gpg: GNU Privacy Guard、暗号化と署名のためのツール

# 実装手順
## 1. Rのリポジトリを追加する
まず、RのオフィシャルリポジトリをUbuntuのソースリストに追加します。
```text:text
sudo add-apt-repository "deb https://cloud.r-project.org/bin/linux/ubuntu $(lsb_release -cs)-cran40/"
```
このコマンドを実行すると、システムがリポジトリの追加を確認し、プロセスを続行するかどうか尋ねてきます。Enterキーを押して続行してください。

## 2. GPG公開鍵の追加
リポジトリを追加した後、次のステップはGPG公開鍵を追加することです。これは、パッケージの信頼性を確保するために重要です。
```text:text
wget -qO- https://cloud.r-project.org/bin/linux/ubuntu/marutter_pubkey.asc | sudo tee -a /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc
```
このコマンドは、R ProjectのGPG公開鍵をダウンロードし、Ubuntuシステムの信頼されたキーリングに追加します。

## 3. パッケージリストの更新
GPG鍵を追加したら、パッケージリストを更新します。
```text:text
sudo apt update
```

## 4. Rのインストール
最後に、Rをインストールします。
```text:text
sudo apt install --no-install-recommends r-base
```
--no-install-recommendsオプションを使用することで、必要最小限のパッケージのみをインストールします。

# 結果と考察
上記の手順を実行することで、Ubuntu 24.04にRを正常にインストールできるはずです。しかし、最新のUbuntuバージョンを使用しているため、いくつかの注意点があります

パッケージの互換性: 最新のUbuntuバージョンでは、Rの一部のパッケージがまだ完全にサポートされていない可能性があります。

エラーへの対処: GPG鍵の追加時にエラーが発生した場合は、以下のコマンドを試してみてください
```text:text
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
```
安定性: 開発中のバージョンであるUbuntu 24.04を使用しているため、予期せぬ問題が発生する可能性があります。重要な作業環境では、Ubuntu 22.04 LTSなどの長期サポートバージョンの使用を検討することをおすすめします。

# まとめ
本記事では、Ubuntu 24.04 (Noble Numbat) にRをインストールする方法を詳しく解説しました。最新のOSを使用する際には、パッケージの互換性や安定性に注意が必要ですが、適切な手順を踏むことで問題なくインストールできます。
Rをインストールした後は、必要に応じてRStudioなどの統合開発環境をインストールすることで、より快適な開発環境を整えることができます。
また、tidyverseなどの人気のパッケージをインストールして、データ分析の幅を広げることもおすすめです。 Rの世界は広大で、常に進化し続けています。この記事が、皆さんのデータサイエンスの旅の良いスタートとなれば幸いです。

# 参考文献
・The Comprehensive R Archive Network
・Ubuntu Documentation - AptGet/Howto
・R for Ubuntu
GAS(スプレッドシート) と VBA(エクセル) をザックリ比較

GAS と VBA を触ってみての比較になります

::: note info 
**【結論】**
* **GAS は初めてでも理解しやすい**
    * Googleフォームとの親和性も高く素早くモノを作れる
    * 個人利用や小規模のコミュニティ程度の利用であれば十分
　
* **VBA は GAS に比べて難しく感じるが複雑な要件も満たせる**
    * VBA 自体が静的型付け言語で GAS に比べ習得が難しい
    * Excel だと Python も実行可能
        * VBA と組み合わせれば更に高度な実装要件も満たせる
    * 導入事例などを確認すると法人向けなど大規模な対象に適している
:::

# それぞれの特徴について
## GAS
### 知名度も人気も高い言語を主体に開発を進められる
* GAS は JavaScript を主体に開発を進めていく
    * そのため新たに"GAS 専用の言語"を勉強する必要が無い

> 一般的なウェブ言語を使用
Apps Script を使えば、HTML、CSS、JavaScript を使って開発を行えます。独自のフレームワークの知識を新たに身に付ける必要はありません。
> 
> [Google Workspace](https://workspace.google.com/intl/ja/products/apps-script/#:~:text=%E4%B8%80%E8%88%AC%E7%9A%84%E3%81%AA,%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82) より引用

### Googleフォームとの親和性が高い
* 下画像のようにスプレッドシートから Google フォームとの連携が行える
    * これにより「Google フォームで受け取った値をスプレッドシートで記録」といった構成を素早く構築できる
        * Google フォームがフロント側、スプレッドシート側がバックエンド側 
            * GAS がバックサイドの処理担当、シートが DB の役割担当というイメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518714/c96b94e1-2d61-435d-300e-ae5e107e9d37.png)

## VBA
### 静的型付け言語である
* VBA は Java, Go と同じ静的型付け言語であるため GAS (JavaScript 互換言語) に比べ習得難易度が高い
    * 開発段階から厳密な型付けなど要求されるので大規模開発に向いている

### Python が使用可能 (Python in Excel)
* データ分析にも使用される Python が Excel 上で使用可能
* "Python in Excel" で Excel に記録しているレコードを基にデータ分析をして、その作業を VBA で作業の自動化を図るといったことも可能
    * これにより更に法人など大規模組織への導入が増えそう

---
### 所感
* 単純な「スプレッドシート v.s. Excel」での比較であればそこまで差は無いのでどちらを採用しても良いかと考えていたが、こうやって比較すると目的によって使い分けられるのではないかと感じた
    * 両者の特色がハッキリと異なっており似たようなアプリと思いきや住み分けが出来ているのではないか

---
### 参考資料など

https://workspace.google.com/intl/ja/products/apps-script/#:~:text=%E4%B8%80%E8%88%AC%E7%9A%84%E3%81%AA,%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82

https://vbae.odyssey-com.co.jp/benefits/case.html
【配列操作】flat()メソッドで配列の配列を展開する

```js
const array = [['aaa', 'bbb'],['ccc', 'ddd']
```

上記のような配列の中にある配列を展開して、1つの配列にしたい場合、flat()メソッドを使うと便利だったのでメモ。

```js
const array = [['aaa', 'bbb'],['ccc', 'ddd']]

const newArray = array.flat()

console.log(newArray) // ['aaa', 'bbb', 'ccc', 'ddd']
```

APIなどで取得したデータを整形して配列に入れたものを、再び1つの配列にしたいときに使える。

ちなみに、引数に展開する深さを指定することができる。

引数を指定しない場合は「深さ＝１」になるので、上記のような2次元配列を1次元配列に、3次元配列の場合は2次元配列に...といった具合に展開できる。
```js
const array = [[1, 2], [3, [4, 5]]]

const newArray = array.flat(2)

console.log(newArray) // [1, 2, 3, 4, 5]
```

それにしても、Reactって配列の操作が肝になってくるなぁ。
プロジェクトの内容次第なのだろうけれど。
Reactも大事だけど、JavaScriptの方が大事っていうのがよく分かりました。
コーディング初心者が知っておくべき基本テクニック


---

# 新米コーダーが知っておくべきプログラミングの基本
my site:https://edusupportbd.com
こんにちは、皆さん！私は新米コーダーで、プログラミングの世界に足を踏み入れたばかりです。このブログでは、私が学んだことや、初心者が知っておくべき重要なテクニックについて紹介します。これからプログラミングを始める方や、基礎を再確認したい方にとって役立つ情報となれば幸いです。

## プログラミング言語の選択

プログラミングを始める際に、どの言語を学ぶかは非常に重要です。以下の言語は初心者におすすめです。

### 1. Python
Pythonはシンプルで読みやすい文法を持ち、データ分析やAI、Web開発など幅広い分野で使われています。初心者でも学びやすいので、まずはこの言語から始めることをお勧めします。

### 2. JavaScript
Web開発に興味がある方にはJavaScriptが必須です。ブラウザ上で動作するため、すぐに成果を確認できるのが魅力です。フロントエンドだけでなく、Node.jsを使ってバックエンド開発も可能です。

### 3. Ruby
Rubyは特にWebアプリケーション開発に人気があります。Ruby on Railsというフレームワークを使用すれば、短期間で効率的にアプリケーションを構築できます。

## コーディングスタイルの重要性

コーディングの際には、一貫したコーディングスタイルを守ることが大切です。可読性の高いコードを書くことで、他の開発者とスムーズに協力でき、バグの発見も容易になります。

### コーディングスタイルガイド

- **命名規則**：変数や関数の名前は、役割が分かるように意味のある名前を付けましょう。例えば、`userAge`や`calculateTotal`など。
- **インデント**：コードの階層を分かりやすくするために、一貫したインデントスタイルを使用しましょう。
- **コメント**：重要な処理や難解な部分にはコメントを残し、コードの意図を明確にしておきます。

## バージョン管理の活用

プログラミングでは、変更履歴を管理することが非常に重要です。Gitを使ったバージョン管理を取り入れることで、コードの変更を簡単に追跡し、過去のバージョンに戻すことが可能になります。

### Gitの基本コマンド

- **リポジトリの作成**：`git init`コマンドで新しいリポジトリを作成します。
- **変更のステージング**：`git add .`を使って変更をステージします。
- **コミット**：`git commit -m "メッセージ"`で変更をコミットします。
- **プッシュ**：`git push origin main`でリモートリポジトリに変更を反映させます。

## テストの重要性

コードが思い通りに動作するかどうかを確認するためには、テストが不可欠です。ユニットテストや統合テストを実施することで、バグを早期に発見し、修正することができます。

### テストフレームワーク

- **JUnit（Java）**：Javaプログラムのユニットテストを行うためのフレームワークです。
- **pytest（Python）**：Python用のテストフレームワークで、簡単にテストが作成できます。
- **Jest（JavaScript）**：JavaScriptのユニットテストに特化したフレームワークで、特にReactアプリケーションにおすすめです。

## コミュニティへの参加

プログラミングは孤独な作業と思われがちですが、実は多くの学びがコミュニティから得られます。QiitaやGitHubなどのプラットフォームで、他の開発者と交流し、知識を共有しましょう。

### コミュニティでの活動

- **Qiitaに投稿**：自分の学んだことを記事にまとめ、他の初心者に役立ててもらいましょう。
- **オープンソースプロジェクトへの参加**：GitHubで興味のあるプロジェクトに貢献することで、実践的なスキルを身につけることができます。
- **勉強会やミートアップ**：地域の勉強会やミートアップに参加し、他の開発者とのネットワークを広げましょう。

## まとめ

新米コーダーとしての旅は始まったばかりですが、プログラミングは非常に魅力的な世界です。基本的なテクニックを習得し、一貫したコーディングスタイルを維持することで、スムーズに成長していけるはずです。バージョン管理やテスト、コミュニティへの参加を通じて、より深い知識と経験を得ていきましょう。

最後まで読んでいただき、ありがとうございました。皆さんのプログラミングの旅が素晴らしいものになりますように！

---
SaaS型認証サービス、IDaaS８選

DaaS（Identity as a Service）は、クラウド上で提供されるアイデンティティ管理サービスで、企業や個人がユーザーの認証、認可、シングルサインオン（SSO）、アクセス管理などを簡単に実現できるサービスです。ここでは、いくつかの代表的なIDaaSサービスを紹介します。

### 1. **Okta**

- **概要**: Oktaは、IDaaS分野で最も広く使用されるプラットフォームの一つで、エンタープライズ向けのアイデンティティおよびアクセス管理ソリューションを提供します。
- **特徴**:
  - シングルサインオン（SSO）を提供し、数千のアプリケーションと統合可能。
  - 多要素認証（MFA）やディレクトリサービス、ユーザーライフサイクル管理をサポート。
  - SAML、OAuth、OpenID Connectなど、さまざまなプロトコルをサポート。
  - APIによるカスタム統合や、エンタープライズグレードの監査・レポート機能も提供。

### 2. **Azure Active Directory (Azure AD)**

- **概要**: MicrosoftのAzure Active Directoryは、クラウドとオンプレミスで利用できるIDaaSソリューションで、Office 365を含む多くのMicrosoftサービスと緊密に統合されています。
- **特徴**:
  - SSO機能により、数千のSaaSアプリケーションにアクセス可能。
  - 多要素認証（MFA）、条件付きアクセス、デバイス管理をサポート。
  - Azure AD B2C/B2Bでエクスターナルユーザー（顧客やパートナー）の認証も管理可能。
  - Active Directoryとのシームレスな統合や、ハイブリッド環境への対応。

### 3. **OneLogin**

- **概要**: OneLoginは、シングルサインオンや多要素認証を含むID管理に特化したIDaaSソリューションで、クラウドとオンプレミスのアプリケーションを統合できます。
- **特徴**:
  - SSOにより、数千のアプリケーションに対する統一的なアクセス管理が可能。
  - MFA、ディレクトリ統合（LDAP、Active Directory）、自動プロビジョニング機能を提供。
  - セキュリティ要件を満たす条件付きアクセスや、ID管理における監査機能をサポート。
  - ゼロトラストセキュリティアーキテクチャを提供し、企業のセキュリティを強化。

### 4. **Ping Identity**

- **概要**: Ping Identityは、エンタープライズ向けのIDaaSソリューションで、シングルサインオンやアクセス管理を中心にしたアイデンティティサービスを提供します。
- **特徴**:
  - SSO、MFA、条件付きアクセスをサポートし、エンタープライズアプリケーションに容易に統合可能。
  - オンプレミスおよびクラウド環境での柔軟なアイデンティティ管理。
  - OAuth、OpenID Connect、SAMLなどの業界標準プロトコルをサポート。
  - ゼロトラストアーキテクチャやAPIセキュリティソリューションを提供。

### 5. **IBM Security Verify**

- **概要**: IBMのIDaaSプラットフォームで、クラウドやオンプレミスアプリケーションの統合的なアクセス管理を実現します。IBMのエンタープライズ向けセキュリティサービスと統合されています。
- **特徴**:
  - SSO、MFA、コンディションベースのアクセス制御を提供。
  - リスクベースの認証や、AIによる不正アクセスの検出機能を搭載。
  - カスタムアプリケーションやSaaSアプリケーションと容易に統合可能。
  - 組織全体のユーザーライフサイクル管理を提供し、外部パートナーや顧客のアクセス管理もサポート。

### 6. **Google Identity Platform**

- **概要**: Google Identity Platformは、Googleのクラウドアイデンティティおよびアクセス管理ツールで、G Suite（Google Workspace）やGoogle Cloudと連携して、ユーザーやグループの管理を行います。
- **特徴**:
  - SSO、MFA、条件付きアクセスをサポートし、Googleアカウントでのログインを可能にします。
  - Firebase Authenticationとの連携で、開発者が簡単に認証機能を導入可能。
  - OAuth 2.0やOpenID Connectをサポートし、外部アプリケーションとの認証をシームレスに統合。
  - 高度なユーザー管理機能とセキュリティコントロールを提供。

### 7. **Auth0**

- **概要**: Auth0は、IDaaS分野で柔軟かつ拡張性の高いサービスを提供しており、さまざまなアプリケーションにシンプルかつ強力な認証機能を統合できます。
- **特徴**:
  - SSO、MFA、ソーシャルログインなど多様な認証方法をサポート。
  - カスタム認証フローやトークン管理を行い、カスタマイズの自由度が高い。
  - APIと連携した認証・認可機能が容易に実装可能。
  - セキュリティ機能が強化されており、データ保護や監査機能も充実。

### 8. **JumpCloud**

- **概要**: JumpCloudは、ディレクトリサービスとして、SSO、アクセス管理、多要素認証を統合して提供するIDaaSソリューションです。特に多拠点に分散した企業に適しています。
- **特徴**:
  - SSOを通じた統合アクセス管理、デバイスやユーザーのライフサイクル管理を提供。
  - クロスプラットフォームでのデバイス管理（Windows、Mac、Linux）をサポート。
  - LDAP、SAML、RADIUSなどの標準プロトコルに対応し、オンプレミスとクラウドをシームレスに統合。
  - ゼロトラストセキュリティモデルの実装をサポート。

### まとめ

これらのIDaaSサービスは、企業や組織がセキュリティリスクを最小限に抑えながら、効率的なユーザー認証とアクセス管理を実現するために重要です。各サービスは、組織の規模やニーズに応じて異なる機能や柔軟性を提供しているため、使用目的に応じた選択が必要です。
ansible Amazon Linux 2のパッケージ管理でdnfのバージョンが検出できない

# ansible Amazon Linux 2のパッケージ管理でdnfのバージョンが検出できない
```
FAILED! => {"ansible_facts": {"pkg_mgr": "unknown"}, "changed": false, 
"msg": ["Could not detect which major revision of dnf is in use,
which is required to determine module backend.",
"You should manually specify use_backend to tell the module
whether to use the dnf4 or dnf5 backend})"]}
```

# ansible 10で起きる！

# ansible 9に落としましょう
ガバメントクラウド よもやま話

お疲れ様です！エンジニアのMasakiです。

あちらこちらで話題になっている（私の周りだけ？）**ガバメントクラウド**について、個人の主観を交えながら記事としてアウトプットしたいと思います。

:::note info
本記事はガバメントクラウドに関する個人的な意見をまとめた内容となっております。あくまで、1個人の意見として読んでもらえれば幸いです。
:::

# そもそもガバメントクラウドとは？
とりあえず、デジタル庁ホームページに掲載されている内容を見てみると？
>最新クラウド技術の活用ができる環境についてテンプレートを使ってベストプラクティスに基づく標準的な環境として提供することにより、政府や地方自治体のアプリケーション開発を現代的なものにしていくことを最大限支援します。

正直、「なんのこっちゃ？」といった感じですね......

すごくざっくり言えば、**どの自治体も共通システムを用いて開発/運用していこうぜ**といった取り組みですね。（まあ、「システム間でのデータのやり取り」やら「セキュリティ基準」やら「関連各所との調整は誰が行うのやら」など多くの課題を抱えていますが......）

※ガバメントクラウドというワードが先行していますが、実際は「地方公共団体の基幹業務システムの統一・標準化」の一環としてガバメントクラウドを活用するというのが正しいそうです......

2023年の閣議決定では「2025年度末を目標に基幹システムの移行完了」としているそうですね。

### （個人的な意見）
システム標準化関連は何かと関係者が多いので、「なかなかうまくいかないだろうなぁ」という印象を持っていましたが、その通りの状態になっているなぁって感じですね。

一応、クラウドサービスベンダーとして「AWS,Google Cloud,Azure,OCI（Oracle Cloud）」の4者が登録されていますが、各クラウドベンダー間での認識合わせは行えているのかいまいち見えていないのが現状かなぁと思います。

（発注者側・受注者側での「ガバメントクラウドに対する理解のギャップ」や「既存システムとのマイグレーション対応」なども考えると、どのレベルまで認識合わせを行えばいいのかわからないといった感じかと思います。）

あと、「システム基盤（クラウド）」についてはベンダー含め、ある程度情報公開はされている印象を持っていますが、データ連携ベンダー（HULFTなど）やシステム監視などについて、ほとんど情報が出てきていないので、「うーん、なんだかなぁ」といった印象を持っていますね。

総括として、「そもそもの目的を見失わずに進めてもらえればうれしいなぁ」って感じですね～～
今後も大きな動きがあれば、記事として取り上げたいと思います。

:::note info
最後まで、記事を読んでいただきありがとうございます。
記事を読んでみて「よかった」と思っていただければハートボタンを押していただければ嬉しいです。
また、コメントなども遠慮なくお願いします！
:::

## デジタル庁ホームページ
デジタル庁：[地方公共団体の基幹業務システムの統一・標準化](https://www.digital.go.jp/policies/local_governments#reference)
デジタル庁：[ガバメントクラウド概要解説](https://guide.gcas.cloud.go.jp/general/overview-explanation/)

## 解説サイト
NTT東日本：[ガバメントクラウドとは？概要や開始時期、自治体の活用メリットなど](https://business.ntt-east.co.jp/content/cloudsolution/municipality/column-06.html)
テスト環境を外部公開してみた(AlmaLinux+ngrok+react)

# Nginxの導入方法
1\. 事前準備
2\. 投稿主の実装環境
3\. ngrokとは
4\. 環境構築
5\. nginx便利コマンド

## 1\. 事前準備
・今回はngrokがメインのため、Reactの構築は省くものとする。Reactの構築については以下参照。
https://qiita.com/momotaroukunn/items/06a9cce5e90138e884aa
・Reactがローカルホスト3000番等で公開できること。

## 2\. 投稿主の実装環境
・AlmaLinux(9.2)
・ngrok(3.17.0)

## 3\. ngrok（エングロック）とは
ngrokとは、ローカルホストサーバーを外部からアクセスできるようにしたツールです。
例えば、ローカルホスト3000番などでサーバを立てている場合、外部からのアクセスはできないですが、ngrokツールを使用することでngrokサーバを経由してグローバルに公開してくれます。

この、ローカルホスト3000番などのポートから別のサーバのポートを経由することをトンネリングといいます。

これだけ聞くとサーバ公開が簡単になると思うかもしれませんが、それは大間違いです。

あくまで、ローカルホスト3000番のアプリケーションを強引に別サーバを経由して外部に公開しているだけなので、セキュリティ面は非常によろしくないです。そのため、開発段階のデモページとして運用する分には良いかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984034/437c971d-6c56-442f-cfc1-ba01be2ae503.png)


## 4\. 環境構築

### 4-1.ngrokのインストール

最新版のngrokをインストール：
```
$ wget https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-linux-amd64.tgz
```
ngrokの(.tgz)を解凍：
```
$ sudo tar xvzf ~/Downloads/ngrok-v3-stable-linux-amd64.tgz -C /usr/local/bin
```
ngrokのバージョン確認：
```
$ ngrok -v
ngrok version 3.17.0
```

### 4-2.ngrokの登録
ngrokは無料版と有料版でサービスが提供されていますが、個人開発レベルだと無料版で全然問題ないので今回は無料版で登録する。

＜ngrok.com/＞
https://ngrok.com/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984034/071a21bc-fb75-1ed7-d968-1f6565fa2ea3.png)

登録及び、ログインが完了したら左のバーから「Your Authtoken」を押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984034/6c64eaf7-45e6-4992-0abd-59903ded0758.png)

「Your Authtoken」が表示されたらコピーする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984034/c81d1b32-f2f8-fcb2-c60b-646119078c9d.png)

ngrokを無料版として使用するにはローカルホストサーバにngrokのtokenを登録しなければならないため以下の作業により、登録する。
先ほどコピーしたtokenを「ngrok config add-authtoken」の後ろに貼り付ける。
```
#サービス状態確認
$ ngrok config add-authtoken <token>
```
その後、Reactが配置されているディレクトリに移動して「npm start」をする。
```
# Reactが配置されている場所に移動する。
$ cd my-app

# React開始
$ npm start
```
Reactの開始まで完了したら、ngrokをスタートさせる。

ここからローカルホストとngrokサーバでトンネリングを行います。
そのため、現在Reactが何番ポートで立ち上がっているのか確認してください。
(基本的には3000番ポートだと思いますが。)
```
# Reactが3000番ポートで立ち上がっている場合。
$ ngrok http 3000
```
無事起動できると以下の通り起動メッセージが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984034/cfd26275-290a-88eb-41cd-8cad7f7dfe42.png)

その後起動メッセージから、
Fowardingと記載されている行の「https://XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.app」にブラウザでアクセスします。

ブラウザでアクセス後、以下の画面に遷移するので「Visit Sita」というボタンを押下します。
その後、Reactの画面が表示されていれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984034/6ea4d933-8a12-d7ab-12dc-8d8ed47029c3.png)

五月雨でしたが、ここまでありがとうございました。

以上
Rust入門

# 1 環境構築
https://www.rust-lang.org/ja/tools/install
```
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```

```
Current installation options:


   default host triple: aarch64-apple-darwin
     default toolchain: stable (default)
               profile: default
  modify PATH variable: yes

1) Proceed with standard installation (default - just press enter)
2) Customize installation
3) Cancel installation
>
```
1を押してインストール
```
Rust is installed now. Great!

To get started you may need to restart your current shell.
This would reload your PATH environment variable to include
Cargo's bin directory ($HOME/.cargo/bin).

To configure your current shell, you need to source
the corresponding env file under $HOME/.cargo.

This is usually done by running one of the following (note the leading DOT):
. "$HOME/.cargo/env"            # For sh/bash/zsh/ash/dash/pdksh
source "$HOME/.cargo/env.fish"  # For fish
```

メッセージに従って以下を実行
下のコマンドは[fish shell](https://qiita.com/hennin/items/33758226a0de8c963ddf)用らしい。


```
. "$HOME/.cargo/env"
```

以下が動けば成功
```
rustup --version
rustup 1.27.1 (54dd3d00f 2024-04-24)
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: The currently active `rustc` version is `rustc 1.81.0 (eeb90cda1 2024-09-04)`

```
rustcのバージョンとは違うと教えてくれる
```
rustc --version
rustc 1.81.0 (eeb90cda1 2024-09-04)
```
rustcやらrustupやらの違いは以下のようになっているらしいです（ふわふわ）
- rustup：管理ツールのようです
- rustc：コンパイラ
- cargo：ビルドツール兼パッケージマネージャ（rustupと役割が被ってる印象、インストール時の挙動に違いがあるようです）
  - rustup component add：バイナリDL、
  - cargo install：ソースDL後ローカルでビルドされる違いがある

Rustではクロスコンパイルというのができるらしい

https://rust-lang.github.io/rustup/cross-compilation.html

RustをビルドしてWebAssenmblyを使用するのにビルドターゲットを追加する
```
# ビルドターゲットの一覧が表示される
rustup target list
# 以下２つ追加する
rustup target add wasm32-unknown-unknown
rustup target add wasm32-wasip1  
```
【基本情報】独学マラソン DWH Day 17

イライラの根っこにある幸せを掴み取るのだ

:::note worn
この記事は自分用の備忘録です。
:::

集めたデータっていろんなデータベースに散らばっているから
分析をかけるの面倒にならない？

<br>

### そのお悩み、データウェアハウスが解決します!!

<br>

# データウェアハウス（DWH：Data Ware House）とは
企業内の複数システムから大量のデータを時系列で蓄積するシステム
意志決定のため、目的別に編成され、統合された時系列であり
削除や更新をしないデータの集合体

![スクリーンショット 2024-10-21 21.26.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736578/0e6b6750-c3ab-4f07-b8eb-0f3b16599ae8.png)


別々のデータベースに保管されている会計管理、在庫管理、顧客管理などを業務横断的に分析できる素晴らしいもの
超並列処理アーキテクチャを採用しており、1つのクエリ処理を同時並行で行えるらしい

### UpdateやDeleteをしない？なんで？
もしデータが更新・削除されると、過去のデータ履歴が失われてしまい、正確な過去の状況が把握できなくなる
データの履歴を含めて全部保持することが重要

git logみたいやね

### それだとすぐ容量オーバーになるんじゃないの？
別のストレージにアーカイブしたり、増分だけ保存したり、圧縮や要約したりして工夫しているとか


# DWHの活用例
### クレジットカード業界
不正利用を発見するために、膨大なデータ量やその関連性の中から通常利用とは明らかに異なる支払いをあぶり出す

### 医療業界
複数の医療機関から患者の診療記録や検査結果を一元的に統合し、医師が患者の全体像を把握しやすくすることで、より適切な治療方針を立てるのに役立てる

### 通信業界
通信ネットワークのトラフィックデータを収集・分析し、ネットワークの最適な配置やトラフィックのボトルネックを特定

### 教育業界
生徒の成績や学習進捗を分析し、個別の指導方針を立てたり、教育プログラムの改善に役立てたりする 

↑これ教員時代にずっとやりたかったことだ！

# 感想
やっぱりITは教育を大きく変えることができると改めて感じた


# 参考

https://www.dal.co.jp/column/b-dwh/
～未経験・知識なしでセキュリティエンジニアになる人！～『{Level4}とりあえず書こう。下手でもいい。でも・・・』

こんばんはItoshinです。前回は今受講している講座の復習内容を書き出して睡魔が来てしまい、書きたいことが書けていませんでした...。
はっきりと公の場で自己申告しておくべき大事なことがあると思うのです。
それは、
1.『目標設定』
2.『何をしたいか』、
3.『今の環境を最大限に活用するなら何ができるか』
を明確にしておくこと。

登りたい山を決めないで登れる人はいないでしょう。
登る山で何をしたいか決めないと楽しみやモチベが出ないでしょう。
持ってる装備や共に登る仲間がどんな人なのか把握していないと、到達できるものもできなくなるかもしれません。
以上のことから、まず先に書いておきたいと思っていたのですが、講座内容を書き起こし、Markdown記法で書くことに気を取られておりました(^^;

さて、
ではまずセキュリティエンジニアになるための講座期間中（半年間）での『目標』ですが、
【大目標】セキュリティエンジニアを目指す人材として採用されること
（最初は保守運用メインのシステムエンジニアからスタートだろう）
↑↑↑
【中目標】保守運用業務が可能なレベルまで知識・実践経験
（講座内でできるかはまだ不明）を積む
【中目標】攻撃者視点での新たな情報を収集をし、防衛方法を考えられるようにする
（現環境なら可能かも？）
↑↑↑
【小目標】情報処理技術者、Cisco、LinuC系資格をまず取り、基本的な知識がある証明物を取得する
【小目標】苦手な英語を勉強し直し、IT関連のものをピックアップして学習
（英検やTOEICはどうだろう？リスニングは考慮しない）
【小目標】コマンドプロンプトに慣れる
【小目標】講座期間中だけではなく、就職後も長く情報交換できる仲間を作る（もし、情勢が許すなら野望を一緒に目指せる人がいたらいい）

大きな目標レベルほど、ブレないほうが良いと思うので現在はこんな感じ。
中小目標は3週間～1か月毎に見直して、調整や変更するかも。


次に『何をしたいか』
【就職後】SEからステップアップし、セキュリティエンジニアへ、さらにホワイトハッカーで活躍またはセキュリティコンサルタントとして独立or難聴者向け講師になってデフエンジニアを増やす。
【講座期間～就職】セキュリティ実績を作りたい。もしくはシステム構築（その後、自分で攻撃するのもいいかもしれない）。
短時間もしくは土日だけ業務経験させてくれそうな企業様で経験を積む。（そんな都合のいいところあるかな）
【現在～】楽しみながら、ベストパフォーマンスで学習できる環境と勉強方法を確立したい。


『今の環境を最大限に活用するなら何ができそうか』については、
【講座】他にもホワイトハッカー育成クラスや前職はプログラマーやコンサルタントなどの経歴を持つ人がいるので、今後学びうる情報知識を吸収しにいく。
【自宅】使っていないPCがあるのでサーバー構築用に、IoT商品があれば弄れないか調べてみる。
【外】図書館で参考書を借りてみる。
【日常】攻撃者視点で考えてみる。

とりあえずこんなところかな。今夜も思ったより時間が掛かってしまったけど、指針を示せたので良し。

Markdown記法と学習内容の記入はちょっと考えます！（今使ってるマインドマップを貼れたら楽そうなんだよなぁ・・）

では、お休みなさい＾＾
Gitって何？

プログラミングを学び始めてGitというツールがあることを知りました。
Gitとはバージョン管理ツールです！と言われて、なるほど！と思っていましたが、
一体何のバージョンを管理してるのだろう？というかバージョンとは何？と今さら悩みましたので自分用のメモとして簡単にまとめておきます。

Ｇitの機能としては、
・ソースコードの管理ができる。変更を加えた後も、過去のバージョンに戻すことができる。
・誰がどのように変更を加えたかを追跡（履歴管理）することができる。
・テキストベースのファイルの履歴管理ができる。
辺りがメインなのかと思われます。

私のような超初心者的な認識としては、Gitはプログラムの「変更履歴（バージョン）」が簡単に確認できる便利ツール、と思っておいてよさそうだと思いました。
Gitのことがほんの少し理解できました。

ついでに、テキストベースのファイルが管理できるという意味がわからず、テキストベースってWordも含まれるのかな？と思って調べたらwordはバイナリファイルということでした。文字情報多いからwordも含まれると勘違いしていました。.txtとか.csvとか.yamlなどがテキストベースのファイルということで、確かにこれらは文字情報しかない（余計な装飾がない）なと納得しました。

テキストベースのファイルの重要性を今までわかっていませんでしたが、色々調べるとコンピュータの世界では重要ということもやっとわかりました。.txtはメモ帳としてしか認識していなかったなぁ。奥が深いというか、今まで超浅い使い方しかしていなかったので、テキストファイルについても追々勉強していきたいと思います。
WebpackからViteに移行するとどのくらい速くなるのか

# この記事を3行で
- Viteの速さの秘訣と、webpackと比較してどのくらい速くなるか比較
- ホットリロードの時間は87%削減、開発サーバーの立ち上げ時間は89%削減、ビルドの時間は74%削減できた
- 今回対象のSPAにおいてFCP（First Contentful Paint）は速くならなかった

# はじめに
2019年にCreate React App（CRA）で作成された大規模Webアプリケーション（SPA）をViteに移行したら、めちゃくちゃ速くなりました。何がどのくらい速くなったのか、なぜ速くなったのかを見ていきましょう！

# 前提条件
- vite: v5.3.4
- webpack: v4.44.2
- react-scripts: v4.0.3
- 開発規模
  - 全体で95画面
  - src以下のコード 74,771行
  - src以下のファイル 1,156個

# ホットモジュールリロード
webpack: 8秒　→ vite: 1秒

## なんでこんなに速いの？
ネイティブ ESMが速さの秘訣です！
最近のブラウザはES modulesのコードを直接実行できるから、viteはバンドルせずにブラウザに渡しています。
なので、コードが変更されたモジュールだけをブラウザに再送信するだけで良いのです！
変更されてないモジュールのリクエストには304 Not Modified ヘッダー使ってキャッシュすることで高速化しています！

webpackは変更されたモジュールと他のモジュールをバンドルしてブラウザに渡しているので、コードが大きければ大きいほど遅くなってしまいます。

# 開発サーバーの立ち上げ
初回  webpack: 92.6秒　→ vite: 9.5秒
2回目 webpack: 30.2秒　→ vite: 6.3秒


- 上:webpack 下:vite （初回）
![webpack_first.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586145/5dea9ec4-ca2c-5dde-4646-3881ee05433b.jpeg)
![vite_first.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586145/307a5356-8c97-51b3-5c4e-dd042d253e42.jpeg)


- 上:webpack 下:vite （2回目）
![webpack_second.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586145/a191c03a-37bf-192f-5dc5-547c1a643fa9.jpeg)
![vite_second.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586145/1d16db8d-277a-dad5-7295-254b393cc1bd.jpeg)



## なんでこんなに速いの？
バンドル戦略が速さの秘訣です！
npmパッケージなどの依存関係は事前にバンドルしておいて、私たちが書くソースコードはバンドルしません。webpackは全てバンドルするけどviteはしません！
そして、ルーティングなどによって必要になるモジュールのみを処理する事で開発サーバーの立ち上げを高速にしているのです！

# ビルド
webpack: 1分13.70秒　→ vite: 18.527秒

上:webpack 下:vite
![webpack_build.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586145/40be2cc1-c345-ca67-d957-f4fccb0782fe.jpeg)
![vite_build.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586145/4fbcf05b-ce07-eacc-4d7d-1f850cd4c8a5.jpeg)


## なんでこんなに速いの？
Rollupを使ってることが速さの秘訣です！RollupはTree-shakingとコード分割を効率的に行いつつ、使ってないコードを削除することでビルド時間を大幅に短縮しています！

# 速くならなかったもの
今回対象のSPAにおいてFCP（First Contentful Paint）は速くなりませんでした。
理由は、Viteのデフォルト設定ではSPAのchunk分割が最適化されていなかったのです。
ただ、Viteでchunk分割をマニュアルで設定することは簡単なので、Dynamic importと組み合わせたchunk戦略を使えばFCPも改善できます！
年末調整、確定申告、源泉徴収、住民税の申告

### はじめに
いい歳をして「年末調整」「確定申告」「源泉徴収」がよく分かっていないのはまずい。
技術に関することではないが、自分の勉強のアウトプットの場でもあると思っているので記事を書くことにした。
まとめる中で副業で稼いだ金額が20万以下の場合、「確定申告」は不要だが、「住民税の申告」をしなければならないという知らなかった知識も得ることができた。
ちゃんと調べてみるものである。。

### 年末調整とは
- 会社が従業員に支払った給料や賞与から**源泉徴収**した税額の年間の合計額と
本来徴収するべき所得税の一年間の総額を再計算し、過不足金額を調整して
年税額を一致させる精算の手続き
- 給与等が2,000万円を超える従業員は年末調整の対象から外れる

### 源泉徴収とは
- 給与や報酬を支払う事業者（会社）が給与の支払い時に、
所得税などを差し引いて国などに納付する制度のこと
- 給与明細には所得税として記載される

### 確定申告とは
- 「給与所得」「退職所得」以外の所得が20万円を超える場合は、
年末調整をしていても確定申告が必要
- 確定申告を行った場合は同時に**住民税の申告**も行ったものと
見なされるので、別途住民税の申告を行う必要はない
- 対象期間はその年の1/1～12/31
- 申告は翌年の3月15日まで

### 住民税の申告
- 「給与所得」「退職所得」以外の所得(雑所得など)が20万円以下の場合、申告が必要
- 対象期間はその年の1/1～12/31
- 申告は翌年の3月15日まで

### 年末調整と確定申告の違い
- 目的は、いずれも国に納めるべき「所得税」を確定させること
- 年末調整は主体が会社
- 確定申告は主体が個人
- 会社員でも副業などで数か所から給与支払いを受けている場合、確定申告が必要

### 参考：
年末調整
https://biz.moneyforward.com/payroll/basic/2981/#i

源泉徴収
https://biz.moneyforward.com/tax_return/basic/52338/

住民税
https://www.mmea.biz/29605/#anc3
プログラム思考を鍛える

# プログラム思考をつけたいなら普段からスプレッドシートを使え！
いきなりですが、スマートフォンアプリの電卓使ってませんか？
プログラミングをやりたいなら電卓は禁止です。
では何を使うのか？
その答えは、スプレッドシートです。
Excelはパソコンを使っていれば、今はMicrosoft IDを取ることを矯正されます。
Microsoft IDがあるとMicrosoft 365とOneDriveが無料で使え、Excel Onlineが無料で使えます。
プログラマでは考えにくいですが、PCは持ってないよという人はgoogleアカウントがあればgoogle spreadsheetが使えます。

# プログラム思考を鍛える例１
シングルトイレットペーパーの単価を考える。
物価高の昨今、物の値段を考えることは重要です。
ということでトイレットペーパーの単価比較をスプレッドシートで考えてみましょう。
トイレットペーパーは、１ロールで売られていることは少なく、通常は１パックに複数ロール入っています。
単価を考える際は、１パックの値段／ロール数で１ロールの単価が分かります。
１ロールはすべて同じ長さではないので、１ｍあたりの長さで計算する必要があることがわかります。
なので単価計算は、１パックの値段／（ロール数×１ロールの長さ）で計算に必要なのは１パックの値段・パック中のロール数・１ロールの長さのデータのを集て計算式を入れたシートを作っておけばデータの内容を書き換えるだけで比較デーキルシートが出来上がります。
これでトイレットペーパー単価の比較アプリケーションが出来上がったことになります。

# プログラム思考を鍛える例２
割り勘計算を考えてみます。
食事会でよくあるのは割り勘計算です。
考慮すべき内容を、成人男性の参加者数、成人女性の参加者数、子供の参加者数、お釣りを考慮して支払い単位（１００円単位で支払うなど）を考慮するとするならば・・・
計算ルールとして
成人男性の支払いを１００％：成人女性の支払いを９０％：子供の支払いを５０％に設定
成人男性が５人、成人女性が６人、子供が５人参加した食事会の支払総額が２３，０００円
だったとします。
この条件でまずは何を求めるべきかというと１％あたりの支払金額がいくらになるかです。
１％あたりの支払金額は、
支払総額／（成人男性参加者数×１００＋成人女性参加者数×９０＋子供の参加者数×５０）
となるり
２３０００／（５×１００＋６×９０＋６×５０）＝２３０００／１３４０＝17.164．．．
という端数が出ます。
これで計算する場合、端数を考慮すると
成人男性の支払額は　１００×２３０００／１３４０＝１７１６．４１７．．．という１円以下の端数が出ます。
この端数を切ってしまうと支払額が足りなくなるので切り上げ処理をすると、
成人男性の金額は１７１７円で更に１００円単位支払いにするには１７を切り上げる処理となるので１８００が支払額になります。
これと同様に成人女性の支払額は９０×２３０００／１３４０＝１６００円
子供の支払額は５０×２３０００／１３４０＝９００という計算になります。
これを整理すると・・・
必要な情報として、
成人男性の参加者数、成人男性の支払い割合
成人女性の参加者数、成人女性の支払い割合
子供の参加者数、子供の支払い割合
および支払い単位
という情報があれば計算できて、計算例の１３４０という数値は
成人男性の参加者数×成人男性の支払い割合＋成人女性の参加者数×成人女性の支払い割合＋子供の参加者数×子供の支払い割合で計算されています。
これを１つのセル（支払い割合総計という名前とします）に計算し、このセルの結果で総支払金額を割ると１％の支払額が端数付きで出ます。
ここまで計算できると端数付きの支払額は
端数付き成人男性の支払額　＝　払額総額　×　成人男性の支払い割合　／　支払い割合総計
同様に
端数付き成人女性の支払額　＝　払額総額　×　成人女性の支払い割合　／　支払い割合総計
端数付き子供の支払額　　　＝　払額総額　×　子供の支払い割合　　　／　支払い割合総計
で計算できて
この端数を切り上げる処理は、RoundDown関数を使うと
RoundDown(（端数付き成人男性の支払額＋支払い単位）／支払い単位 , 0) ×　支払い単位　で切り上げ処理ができますので
成人男性の支払額　＝　RoundDown(（端数付き成人男性の支払額＋支払い単位−１)／支払い単位 , 0) ×　支払い単位
成人女性の支払額　＝　RoundDown(（端数付き成人女性の支払額＋支払い単位−１)／支払い単位 , 0) ×　支払い単位
子供の支払額　　　＝　RoundDown(（端数付き子供の支払額　　＋支払い単位−１)／支払い単位 , 0) ×　支払い単位
で求めることができ支払い単位の端数の総計がお釣りとして幹事さんに帰ってくることになります。

# 以上の例から考察すると
１．プログラム思考を鍛えるには具体的な計算をやってみる
２．計算に必要な要素を整理する
３．そこから計算の手順をまとめて式をたてる
４．スプレッドシートにたてた式を配置していく
という手順でスプレッドシート上にアプリケーションができていくことになりプログラム思考を鍛えることができます。
楽譜を描画したい！ part1 [パーカッション(打楽器)]

打楽器の中には音程を持たない楽器があります。
皆さんは、楽譜の一番初めのところにある、
このような記号を見たことがあるのではないのでしょうか？
![Music-GClef.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907325/a084c8c3-c34f-a775-2510-e79375ce1e91.png)
![Music-Fclef.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907325/c61ddf66-d2d4-8dec-6846-57467080a491.png)
(wikipediaより)

これはト音記号とヘ音記号です。それと同じく、パーカッション記号というものがあります！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907325/30aff731-b17d-8ce5-ddfc-12f14838f744.png)というような記号です。


それをp5.jsで再現してみました！

```js
function setup() {
  createCanvas(400, 400);
}

function draw() {
  background(255);
  drawscore();
}

function drawscore(){
  score_one_line(10,50,380);
}

function score_one_line(sx,sy,n){
  strokeWeight(2);
  for(let j = 0; j < 3; j++){
    per_sym(sx,sy + j * 130,n);
    strokeWeight(2);
    stroke(0,0,0,50)
    line(sx,sy + 30 + j * 130,sx + n,sy + 30 + j * 130);
  }
}

function per_sym(sx,sy){
  stroke(0,0,0,255)
  strokeWeight(2)
  line(sx+20,sy+17,sx+20,sy + 43);
  line(sx+30,sy+17,sx+30,sy + 43);
}
```

drawscore 楽譜を描く
score_one_line 楽譜の線を日宇
per_sym パーカッション記号を描く

次は4分音符などの音符の再現をしようと思います！
Firebaseでデプロイして開けていたアプリが、Uncaught Error: supabaseUrl is required.のエラーになった

# はじめに
予期しないエラーが出たので解決方法をメモします。

# 問題
Firebaseにデプロイしていたアプリが開けなくなった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881019/2fddf9cf-9585-5c37-4039-f58d8003d9db.png)

コンソールには、以下のエラーが出ていた。
```
Uncaught Error: supabaseUrl is required.
    at new xm (index-JsRZQA-D.js:40:158379)
    at Om (index-JsRZQA-D.js:40:161428)
    at index-JsRZQA-D.js:40:161465
```
```
81Unchecked runtime.lastError: A listener indicated an asynchronous response by returning true, but the message channel closed before a response was received
```

# 解決方法
chromeをシークレットモードにすることで開けた。
chromeの拡張機能が原因のようだった。

※念の為、URLは消去

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881019/62ac68c6-f652-2423-37cf-24f4e0e2694e.png)

自分は「XPath Helper」が原因だったようで、無効化したら通常のchromeでも開くことができた。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881019/f7845aca-addb-89d8-e953-b38f58eb3531.png)


# おわりに
make deployをし直したりして、時間を使ってしまいました。
PowerPointに関数のグラフを描く


# はじめに

PowerPointでスライドを作成していると，サインカーブのような波が欲しくなったりします。
曲線で気合で描いてもよいのですが，端の方がいい塩梅にならないので，VBAで描けるようにしてみました。
(似たようなものは巷にたくさんあると思いますがいい感じに使えるようにしてみたので)

# コード

```vb
Option Explicit

' Size of the shape, in cm
Private Const Width As Single = 8
Private Const Height As Single = 2.5

' Minimum and maximum value of x-axis.
Private Const xMin As Single = -31.4
Private Const xMax As Single = 31.4
' y range from -1 to +1 will be scaled to the size specified by `Height`

' Number of control points must be 3n+1, where n is a positive integer
Private Const NumPoints As Long = 901

Private Const PixelsPerInch As Single = 72 / 2.54

Function func(ByVal x As Single) As Single

    func = Sin((xMax - 1.28 - xMin) / (xMax - xMin) * (x - xMin)) * Exp(-(x - xMin) / 256)

End Function

Sub DrawFunc()
    
    If NumPoints Mod 3 <> 1 Then
    
        MsgBox "Number of control points must be 3n+1, where n is a positive integer", vbExclamation + vbOKOnly
        Exit Sub
    
    End If
    
    Dim slide As PowerPoint.slide
    
    Dim sWidth, sHeight As Single
    Dim xRange As Single
    Dim xScale, yScale As Single
    Dim xOffset, yOffset As Single
    Dim step As Single
    
    Set slide = ActivePresentation.Slides(1)
    sWidth = ActivePresentation.PageSetup.SlideWidth
    sHeight = ActivePresentation.PageSetup.SlideHeight
    
    xRange = xMax - xMin
    xScale = Width * PixelsPerInch / xRange
    yScale = Height * PixelsPerInch / -2  ' Invert vertical axis and scale [-1, 1] to 1
    
    xOffset = sWidth / 2
    yOffset = sHeight / 2
    
    step = xRange / (NumPoints - 1)
    
    Dim points(1 To NumPoints, 1 To 2) As Single
    Dim x, y As Single
    Dim i As Long
    
    For i = 1 To NumPoints
    
        x = xMin + step * (i - 1)
        y = func(x)
        points(i, 1) = x * xScale + xOffset
        points(i, 2) = y * yScale + yOffset
    
    Next

    slide.Shapes.AddCurve SafeArrayOfPoints:=points
    
End Sub
```

## 使い方

`Width`から`NumPoints`までのパラメータを設定し，`func`をプロットしたい関数にします。
`DrawFunc`を実行すると関数のグラフが1ページ目の中央にプロットされます。
※ VBEの起動やマクロの実行方法は他の場所を当たってください。

### パラメータ

#### `Width`, `Height`

図形全体の大きさをcm単位で指定します。

高さは，関数の値域が[-1, 1]であるときの大きさが指定した高さになります。
値域が[-2, 2]の場合には実際の高さは`2 * Height`になります。[^1]

[^1]: 元々三角関数をプロットしたかったのでこのような仕様になっています。y軸の範囲も指定してそれによってスケールするようにしても良いかもしれません。

#### `xMin`, `xMax`

x軸の最小値，最大値を指定します。

#### `NumPoints`

描画に用いる制御点の数を指定します。
制御点の数は 3n+1 (nは整数)でなければなりません。

点の数が多いほど曲線は滑らかにはなりますが，その分描画のコストは高くなるのでほどほどにしましょう。

### 関数

`Single`から`Single`を返す関数になっていれば分岐などを含んでいても問題ありません。
上述のように値の範囲が2になっていると高さが思った通りのものになります。

# 実行例

上のコードにある減衰しながら位相がずれるサインカーブは以下のように出ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211353/489531c6-0628-200a-14f1-d99452e4b0d0.png)

制御点の数で曲線にしているので，頂点の編集をしようとするとツブツブしています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211353/c494bb92-3098-1207-cbe8-9ee413b56f8a.png" width="50%">

# おわりに

発表用のスライドをわざわざマクロ有効にはしたくないので，プロット用の共通pptmを作成してページを追加しつつ使いまわしています。
色，太さや線のスタイルなども指定できるようにしてもいいかもしれません。
SEOマーケティングとは？

SEO（Search Engine Optimization）は、検索エンジン最適化の略で、ウェブサイトの可視性を向上させるための手法です。SEOマーケティングは、企業や個人がオンラインでの存在感を強化し、ターゲットオーディエンスにリーチするための戦略的なプロセスです。

1. SEOの基本
SEOは、検索エンジンのアルゴリズムに基づいて、ウェブサイトのコンテンツや構造を最適化することを目的としています。検索エンジンは、ユーザーの検索クエリに対して最も関連性の高い結果を提供するため、ウェブサイトのランキングが重要です。SEOには以下の二つの主要なカテゴリがあります。

オンページSEO：ウェブサイト内部の要素を最適化すること。具体的には、コンテンツの質、キーワードの使用、メタタグの最適化、内部リンクの構造などが含まれます。

オフページSEO：ウェブサイト外部の要素を最適化すること。これには、バックリンクの獲得、ソーシャルメディアのシェア、オンラインレビューなどが含まれます。

2. SEOマーケティングの重要性
SEOマーケティングは、以下の理由から重要です：

トラフィックの増加：検索エンジンからのオーガニックトラフィックを増加させることで、ウェブサイトへの訪問者を増やすことができます。

ブランドの信頼性向上：検索結果の上位に表示されることで、ユーザーに対する信頼性が向上し、ブランドの認知度が高まります。

コスト効果：他のデジタルマーケティング手法と比べて、SEOは長期的な投資として効果的です。一度の最適化で長期間にわたってトラフィックを得ることが可能です。

3. 効果的なSEOマーケティング戦略
効果的なSEOマーケティング戦略には、以下のポイントが含まれます：

キーワードリサーチ：ターゲットオーディエンスが検索するキーワードを特定し、それに基づいてコンテンツを作成します。

コンテンツの質：価値のある、オリジナルのコンテンツを提供することで、ユーザーのエンゲージメントを高めます。

技術的SEO：サイトの読み込み速度やモバイルフレンドリーなデザインを最適化し、ユーザーエクスペリエンスを向上させます。

バックリンク戦略：信頼性の高いサイトからのバックリンクを獲得することで、検索エンジンの評価を高めます。

まとめ
SEOマーケティングは、デジタル時代において非常に重要な戦略です。ウェブサイトの可視性を向上させ、ターゲットオーディエンスに効果的にリーチするためには、SEOの基本を理解し、適切な施策を講じることが求められます。定期的な分析と改善を行うことで、長期的な成功を収めることができるでしょう。!
口頭だけの認識合わせは危険　メモや図を活用する

## 口頭だけの認識合わせの危険性
* 言った言わないの問題が発生しやすい
* 自分と他人の言葉の捉え方の違いがある
* 口頭だけの認識合わせはすぐ忘れる
## 認識合わせにはメモや図を活用する
* 自身のアウトプット力の向上につながる
* 認識合わせする相手の労力を減らす
* 記録に残るのであとから見返すことができる

口頭で認識合わせをすると、認識が合った気がして安心感が生まれるのですが、アウトプットのない認識合わせはその場限りのものになりやすく事故に繋がります。

特に複数人と認識を合わせる必要がある場合は、メモや図などのアウトプットを用意してから望みたいです。

私自身、口頭だけの認識合わせをしてしまい後から困ったことがあり自戒の念を込めて記事にしました。
Material Iconsの使い方と活用方法

# 1. Material Iconsとは？
**Material Iconsは、Googleが提供する美しいアイコンセットで、次の特徴があります。**

無料で使用可能：商用・非商用問わず、自由に利用可能。
豊富な種類：数千種類のアイコンがあり、UIデザインに適したものが見つかります。
カスタマイズ可能：色やサイズを自由に調整可能。
SVGとフォント形式：CSSフォントとして使うか、SVGとして直接使うこともできます。

# 2. Material Iconsの使い方
**2.1 Google Fontsからの導入（HTML・CSSでの使用）**
Google FontsでMaterial Iconsを探す

Google FontsのMaterial Icons にアクセスします。
HTMLにリンクを追加する
以下のコードをHTMLファイルの<head>内に追加します。

```html
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
```
HTML内でアイコンを表示する
<span>タグにmaterial-iconsクラスを使ってアイコンを指定します。

```html
<span class="material-icons">home</span>
```
結果：🏠（homeアイコンが表示されます）

**2.2 サイズと色のカスタマイズ**
**1. サイズの変更**
CSSでフォントサイズを指定することで、アイコンのサイズを変更できます。

```html
<span class="material-icons" style="font-size:48px;">home</span>
```
結果：48pxサイズのhomeアイコンが表示されます。

**2. 色の変更**
CSSでcolorプロパティを使うと、アイコンの色を変更できます。

```html
<span class="material-icons" style="color: red;">favorite</span>
```
結果：❤️（赤色のfavoriteアイコン）

**2.3 Material Iconsのスタイルバリエーション**
Material Iconsには、複数のスタイルが用意されています。

Filled（デフォルト）：<span class="material-icons">で使用。

Outlined：枠線だけのスタイル。

```html
<link href="https://fonts.googleapis.com/icon?family=Material+Icons+Outlined" rel="stylesheet">
<span class="material-icons-outlined">home</span>
```
Round：角の丸いデザイン。

```html
<link href="https://fonts.googleapis.com/icon?family=Material+Icons+Round" rel="stylesheet">
<span class="material-icons-round">home</span>
```
Two-Tone：2色のデザイン。

```html
<link href="https://fonts.googleapis.com/icon?family=Material+Icons+Two+Tone" rel="stylesheet">
<span class="material-icons-two-tone">home</span>
```

# 3. SVG形式での利用
アイコンをSVG形式で利用することも可能です。SVGは軽量で拡大・縮小しても画質が劣化しません。

Google FontsのMaterial Iconsページから、使いたいアイコンを検索し、「Download SVG」をクリックしてSVGファイルをダウンロードします。

HTMLにSVGを埋め込む
ダウンロードしたSVGをHTMLファイルに直接挿入します。

```html
<svg xmlns="http://www.w3.org/2000/svg" height="48" viewBox="0 96 960 960" width="48">
  <path d="M480 936q-17 0-28.5-11.5T440 896V616H320q-17 0-28.5-11.5T280 576q0-17 11.5-28.5T320 536h120V416q0-17 11.5-28.5T480 376q17 0 28.5 11.5T520 416v120h120q17 0 28.5 11.5T680 576q0 17-11.5 28.5T640 616H520v280q0 17-11.5 28.5T480 936Z"/>
</svg>
```

# 4. Material IconsをReactで使う
Material IconsをReactで使用するには、次のような手順を取ります。

Google FontsからリンクをHTMLに追加
public/index.htmlに以下を追加します。

```html
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
```
Reactコンポーネントで使用
spanタグを使ってアイコンを表示します。

```javascript
import React from 'react';

function HomeIcon() {
  return <span className="material-icons">home</span>;
}

export default HomeIcon;
```

# 5. アイコンの使いどころとデザインのポイント
ナビゲーションメニュー：ホームアイコンやメニューアイコンで使いやすさを向上。
アクションボタン：お気に入りやシェアのボタンにアイコンを使って直感的なUIを提供。
フィードバック：成功やエラーのアイコンを使ってユーザーに状態を示す。

# 6. まとめ
Material Iconsは、Googleが提供するオープンソースのアイコンセットで、ウェブサイトやアプリケーションで簡単に使えます。HTMLやCSS、SVG、Reactなど、さまざまな形式で利用でき、UIを向上させるための重要なツールです。

無料で使用可能で、豊富なアイコンセットを活用できます。
色やサイズを自由に変更し、プロジェクトに合わせたデザインが可能です。
ReactやSVGを使った応用も簡単で、幅広い場面で活用できます。

**毎日更新していますので、@y-t0910をフォローしていただけると嬉しいです。**
link_toでpostメソットがきかなくてなぜかgetメソットになってしまう方への解決策(Rails7)

# Rails7でpostメソットと定義してもなぜかgetメソットとなってしまう!!!!

```
<%= link_to("ログアウト", "/logout", {method: "post"}) %>
```
このようにviewのファイルでpostメソットに行くようにを書いて、
下のように、routes.rbでpostメソットと定義して
```
post "logout" => "users#logout"
```
実行しても
```
Routing Error
No route matches [GET] "/logout"
```
というエラーがでて、なぜかgetメソットとして扱われる!!
progateではこのように教わったのに(クソーーー)!!

# 解決策
turboパッケージをインストールするために、まずGemfileに
```
gem "turbo-rails"
```
と書いて、ターミナル上で
```
bundle install
```
と書いて、パッケージをインストールする。
(すでに、"turbo-rails"がインストールされている人はスキップ)

次に、viewファイルで
```
<%= link_to("ログアウト", "/logout", data: { turbo_method: "post" }) %>  
```
このように書いて、下のように、routes.rbはそのままで
```
post "logout" => "users#logout"
```
実行すると解決できた