OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】JSON logger formatter

# やりたいこと
- Loggerクラスを定義してそれを他のクラスから呼び出して使う
- JSONフォーマット
- `message`以外に常に紐づけておきたい動的パラメータ、`shopId`と`itemId`も入れたい

```python:JsonFormatter.py
import logging
import datetime
from pytz import timezone
from pythonjsonlogger import jsonlogger

class JsonFormatter(jsonlogger.JsonFormatter):

    def parse(self):
        return [
            'timestamp',
            'level',
            'name',
            'class',
            'shopId',
            'itemId',
            'message',
        ]
    
    shopId = None
    itemId = None

    def add_fields(self, log_record, record, message_dict):
        super().add_fields(log_record, record, message_dict)

        if not log_record.get('timestamp'):
            now = datetime.datetime.now(timezone('Asia/Tokyo')).strftime('%Y-%m-%dT%H:%M:%S%z')
            log_record['timestamp'] = now

        if log_record.get('level'):
            log_record['level'] = log_record['level'].upper()
        else:
            log_record['level'] = record.levelname

        # logを出力するファイルとその行
        log_record['class'] = record.pathname + ":" + str(record.lineno)

        # taskNameいらない
        del log_record['taskName']

        if self.shopId and self.itemId:
            log_record['shopId'] = self.shopId
            log_record['itemId'] = self.itemId

    def setItemId(self, shopId, itemId):
        print(shopId, itemId)
        self.shopId = shopId
        self.itemId = itemId
    


def getLogger(module_name):
    logger = logging.getLogger(module_name)
    handler = logging.StreamHandler()
    formatter = JsonFormatter()
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    logger.setLevel(logging.DEBUG)
    return logger, formatter
```

```python:test.py
from JsonFormatter import getLogger
import time

logger, formatter = getLogger(__name__)

error_code = 100
shopId = "11111"
itemId = "22222"

logger.error('Error occured due to xx', extra={'error_code': error_code})

formatter.setItemId(shopId, itemId)
time.sleep(3)
logger.error('Error occured due to xx', extra={'error_code': error_code})
```

実行します
```
$ python3 test.py
```
```:結果
{"timestamp": "2024-07-22T11:50:05+0900", "level": "ERROR", "name": "__main__", "class": "/Users/shuto.kawabata/Desktop/test.py:10", "shopId": null, "itemId": null, "message": "Error occured due to xx", "error_code": 100}
{"timestamp": "2024-07-22T11:50:08+0900", "level": "ERROR", "name": "__main__", "class": "/Users/shuto.kawabata/Desktop/test.py:14", "shopId": "11111", "itemId": "22222", "message": "Error occured due to xx", "error_code": 100}
```
となり
```python
formatter.setItemId(shopId, itemId)
```
したことで期待値通りにshopIdとitemIdに値が代入されました
入力した文字列の中に禁止ワードが含まれているかチェック

```javascript
  var inputA = lines[0];
  var NGWord = ["NGWord1", "NGWord2", "NGWord3"];

  var contains = NGWord.some(char => inputA.includes(char));
  ```

## NGWord.some(char => inputA.includes(char))について
### NGWord.some メソッド
some メソッドは、配列メソッドの一つで、配列内の**少なくとも一つの要素が与えられた条件を満たすかどうか**をテストする。**満たす要素が見つかるとすぐに true** を返し、**全ての要素が条件を満たさない場合は false** を返す。

### includes メソッド
includes メソッドは、文字列が**指定された文字列を含んでいるか**どうかをチェックする。**含まれていれば true** を、**含まれていなければ false** を返す。


### 処理の流れ
dame 配列内の最初の要素 "I" が inputA.includes("I") によって inputA 内に存在するかどうかチェック
**含まれていれば true** が返され、**some メソッドは即座に true** を返す
もし "I" が inputA に**含まれていなければ**、**次の要素** "l" に対して**同じチェック**を行う
これが全ての要素に対して行われ、**いずれかの要素が含まれている時点で true** を返す。
**全ての要素が含まれていない**場合は **false**を返します。


## 使用例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527006/5c46c875-d332-f2a3-e646-ebc49c3160d7.png)
【Preview】ref 構造体のジェネリック制限の緩和

# 概要

C# の ref 構造体はスタックに配置する必要がある都合上、これまでのバージョンだとジェネリック引数に渡せませんでした。これが [.net9 preview6](https://github.com/dotnet/core/blob/main/release-notes/9.0/preview/preview6/libraries.md#allows-ref-struct-used-in-many-places-throughout-the-libraries) で制限が緩和されました。

```cs
public static string Create<TState>(int length, TState state, SpanAction<char, TState> action) where TState : allows ref struct;

ReadOnlySpan<char> input = "Hello, World!";
var str = string.Create(input.Length, input, static (stringBuffer, input) => input.ToLowerInvariant(stringBuffer));
Assert.Equal("hello, world!", str);
```

## 標準ライブラリの変更とか

`System.Action<T>` `System.Func<T>` などの汎用のデリゲートで、`T` に ref 構造体を使えるようになっています。確認していませんが、`List<T>` 等のジェネリック型がヒープに置かれる型を除けば、 ref 構造体を使えるようになっている可能性があります。

```cs
Action<ReadOnlySpan<int>> act = span =>
{
    Assert.Equal([1, 2, 3], span);
};
act([1, 2, 3]);

Func<ReadOnlySpan<int>> func = () => [1, 2, 3];
Assert.Equal([1, 2, 3], func());
```

ref 構造体のフィールドにも使用できます。

```cs
file ref struct ValueHolder<T> where T : allows ref struct
{
    public T Value;
    public ValueHolder(T value) => Value = value;
}

var holder = new ValueHolder<Span<int>>([1, 2, 3]);
Assert.Equal([1, 2, 3], holder.Value);
```

## インターフェイスも継承できる！

なんと ref 構造体がインターフェイスを継承できるようになりました。つまり、ジェネリック引数に「特定のメソッドがある」制約をもたせることができます。

```cs
file interface INumber
{
    int GetNumber();

    static int GetNumberGeneric<T>(T number) where T : INumber, allows ref struct
        => number.GetNumber();
}

file ref struct RefStructNumber : INumber
{
    private Span<int> _span;

    internal RefStructNumber(Span<int> span) => this._span = span;

    public int GetNumber()
    {
        var result = 0;
        foreach (var n in this._span)
            result += n;
        return result;
    }
}

var number = new RefStructNumber([1, 2, 3]);
Assert.Equal(6, INumber.GetNumberGeneric(number));
```

ボックス化が起こるコードは書けませんが、ref 構造体を使える場所が増えそうです。
APIテストやPostmanの学習を始める前に知っておくべきこと

### PostmanやAPIテストの学習に興味がありますか？
APIテストをPostmanや他のツールで学び始める前に、APIの基本やそれがソフトウェアやウェブアプリケーションにどのように適合するかを理解することが重要です。

私は非常に簡単な、主に非技術的な用語で、レストランとAmazonのショッピングウェブサイトの例を使って説明します。

まず、APIとは何かを知る必要があります。

レストランの例を使って理解しましょう。

* あなたはクライアントです
* メニューはUI（アプリやウェブサイト）です。メニューを見て食べ物を注文します
* ウェイターはAPIです。彼は注文を受けてキッチン（サーバー）に提出し、食べ物を持ってきます
* ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839981/e8350a12-957c-f8c9-5491-91f69b4adaae.png)

さて、これでAPIが何か少しはわかってきたかもしれません。

Amazonの場合、ショッピング中に次のようなことが起こります。

* アプリやウェブサイトでUIを見る（レストランのメニューのようなもの）
* 商品を購入する（ウェイターに注文を出すのと同じように）、基本的にこれをAPIと呼びます。このAPIはあなたのリクエストをサーバーに送ります。サーバーはこのデータをデータベースに書き込み、注文番号を返します
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839981/f2c918e1-9090-c674-3c67-f2dd86851f82.png)
 
### 次に、なぜAPIテストが必要なのかを理解しましょう。
APIサーバーはUI（アプリやウェブサイト）とは独立しているため、このユニットが独立してうまく機能することを確認する必要があります。

APIの機能をテストすることができます。APIは常に契約を持っています。つまり、APIは常に固定された契約に従って何かを受け入れ、返すことを約束しています。

例えば、注文番号を渡すと、APIはその注文の事前定義された情報を返すことを約束します。

UIのコードは、APIが受け入れ、返すものに完全に依存しています。したがって、APIが契約どおりに動作することを確認することが非常に重要です。

この説明が、APIとは何か、そしてなぜAPIをテストする必要があるのかを理解するのに役立つことを願っています。
カスタムURLのまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)

---------------------------

+ [一般的なカスタムドメインの問題のトラブルシューティング](https://help.salesforce.com/s/articleView?id=sf.domain_mgmt_troubleshoot.htm&type=5)


+ [【未解決】サイト内のカスタムURLが作成できない件について](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54V00007cmNhGSAU)
+ [How to set up a Custom URL for Site?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T6JVbSAN)

+ [Custom Url is not working for force.com sites](https://salesforce.stackexchange.com/questions/88248/custom-url-is-not-working-for-force-com-sites)

:::note
First of all you can not test Custom Domain in Sandbox environment. You have to do it in production org only. 
:::
EasyOCRインストール時の注意点（2024/6以降）

# はじめに

先日（2024/7）新しく構築した環境でEasyOCRを使ったプログラムがなぜか動かなかった（既存環境ならちゃんと動く）。調べたところ、EasyOCRが依存パッケージのバージョンアップについていけていないようなのでまとめた。

# 環境

+ EasyOCR 1.7.1
+ Python 3.9.13 / Python 3.12.4 (両方ともMicrosoft Store版)
+ Windows 10 Pro (64bit) 22H2

# 状況

EasyOCRを使ったプログラムを実行すると次の2種類のメッセージが出て、プログラムが異常終了する

```
A module that was compiled using NumPy 1.x cannot be run in
NumPy 2.0.0 as it may crash. To support both 1.x and 2.x
versions of NumPy, modules must be compiled with NumPy 2.0.
Some module may need to rebuild instead e.g. with 'pybind11>=2.12'.

If you are a user of the module, the easiest solution will be to
downgrade to 'numpy<2' or try to upgrade the affected module.
We expect that some modules will need time to support NumPy 2.
```
```
ModuleNotFoundError: No module named 'bidi.algorithm'
```

# 原因

EasyOCRが依存パッケージのバージョンアップに対応できていない

+ numpy 2.0.0（2024/6/16リリース）
+ python-bidi 0.5.0 (2024/7/21リリース)

::: note info
numpy, python-bidiモジュールのバージョンを確認するコマンド
```
python3 -m pip show numpy python-bidi
```
:::

動作を確認できたのは次のバージョン

+ numpy 1.26.4
+ python-bidi 0.4.2

# 解決方法

EasyOCRインストール前に旧バージョンの依存パッケージを先にインストールしてしまうのが簡単
```
python3 -m pip install "numpy<2.0" "python-bidi<0.5"
python3 -m pip install easyocr
```


すでにEasyOCRをインストールして新しい`numpy`,`python-bidi`モジュールがインストールされてしまっているのであれば、`numpy`,`python-bidi`をバージョンダウンすればよい

```
python3 -m pip install --upgrade "numpy<2.0"
python3 -m pip install --upgrade "python-bidi<0.5"
```

::: note info
`install --upgrade`コマンドでバージョンダウンも可能
:::

## (追記:2024/7/24)
`python-bidi`のバージョンが0.5.1になって、`python-bidi`についてはエラーが発生しなくなった模様。したがって、

+ EasyOCRが未インストールの場合
```
python3 -m pip install "numpy<2.0"
python3 -m pip install easyocr
```

+ EasyOCRがインストール済みの場合
```
python3 -m pip install --upgrade "numpy<2.0"
```

# 参考情報

+ [EasyOCR](https://github.com/jaidedai/easyocr)
+ [numpyリリース履歴](https://pypi.org/project/numpy/#history)
+ [python-bidiリリース履歴](https://pypi.org/project/python-bidi/#history)
Excel VBAスタンダード【VBAエキスパート】

## 結果
1000点満点中875点

## 参考資料
公式テキスト

## テスト概要
40問 50分

## 事前
オデッセイのIDとPWが必要です。
MOS 2016 Excelを以前受かってたので、受験金額が割引になりました。

## 感想
馴染みのないテストセンターで受けたのでどきどきしましたが、合格しました。

少しでも考える問題は全部飛ばして、10分ですべての問題に目を通しました。その後に何度も見返しして解けなかった問題を解きました。

## 次
LinuCレベル1合格するぞ！
ubuntuのpodman-composeについて

ubuntuのpodman-composeがクセ強いので、注意

## 環境について
こちらの環境で確認しております
```bash
PRETTY_NAME="Ubuntu 24.04 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=noble
LOGO=ubuntu-logo
```

## インストール方法
```bash
apt-get install -y podman podman-compose
```

## とりあえず使ってみる
```
podman compose up -d
```
デバッグ情報が流れ込んでくるが、とりあえず動く

## ユーザー空間で使ってみる
sudoでユーザーを移動するなら`DBUS_SESSION_BUS_ADDRESS`環境変数をいい感じにセットしてあげる必要がある。

```bash
export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$(id -u)/bus"
```
bashrcに登録するといいかもね
```bash
export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$(id -u)/bus" >> ~/.bashrc
```

あと、ログイン設定を変更してあげないといけない。
systemd環境における通常のログインプロセスは、ユーザーがログインと同時にユーザー空間用systemdが動作する。
これにより、`systemctl --user`関連のコマンド、つまりはユーザー専用サービスが起動する。
しかし、sudoなどはログインプロセスを実施してくれない。

そこで、systemdにユーザーが**常時ログインしている状態**を維持するよう指示しないといけない
それが`linger`と呼ばれるもの


まず、rootか通常sudoでこれを実行
```
sudo loginctl enable-linger <ユーザー名>
```

これで常時起動させられる。 また、ユーザー空間のサーバーが常時起動するようになるため、
ユーザー空間で動作させたいサーバーなどには最適解だったりする

## composeを自動起動させる
ユーザー空間のcomposeやpodmanのpodは自動起動をしない。
なので、systemdなどで起こしてやる必要がある。　この際にもlingerが役に立つ。

まず、rootかsudoで
```
sudo podman compose systemd -a create-unit
```

ubuntu版の場合、どういうわけかコンテナ起動時にpodman startをするが、
コンテナの名前解決がふつーにできないのでユニットファイルを改造する。

```
sudoedit /etc/systemd/user/podman-compose\@.service
```
```
# /etc/systemd/user/podman-compose@.service

[Unit]
Description=%i rootless pod (podman-compose)

[Service]
Type=simple
EnvironmentFile=%h/.config/containers/compose/projects/%i.env
ExecStart=/usr/bin/podman-compose -f ${COMPOSE_PROJECT_DIR}/${COMPOSE_FILE} up
ExecStop=/usr/bin/podman-compose -f ${COMPOSE_PROJECT_DIR}/${COMPOSE_FILE} down

[Install]
WantedBy=default.target
```

これができてたら
```
podman compose systemd
```
```
systemctl --user enable podman-compose@
```
(@の先にcompose名)
で動くはず

:::note info
なぜStop時にdownさせるの？

まずdownの挙動が、コンテナを停止させ、削除するというものなんだけど
コンテナを削除するという理由が、コンテナ内に不要物（ログとか）がたまっていく恐れがあるというもの、
あとは、コンテナが永久的に存在する保証がないというところから、思い切って消去してます

なので、コンテナ設計時もそれを意識するのがいいと思います。
(イメージをビルドしたら半永久的に使えるようになります)
:::

## 個人的な疑問
- `machinectl`使えって公式が言ってるが、環境変数などで解決できるから問題ないんじゃないか？
> どういうわけかコンテナ起動時にpodman startをするが、
- などといったが、実際元コードがどうしてそうなったのか理解してない（...いやな予感がする
paiza.ioでc# その2

# 概要
paiza.ioでc#、やってみた。
練習問題やってみた。

# 練習問題
int, floatの変換


# サンプルコード

```
using System;

public class Hello {
    public static void Main() {
        float k = float.Parse("1.5");
        int a = Convert.ToInt32("5");
        int b = int.Parse("6");
        int s = (int) Math.Floor(a * k);
        float g = a * k;
        Console.WriteLine(a.ToString());
        Console.WriteLine(k.ToString());
        Console.WriteLine(s.ToString());
        Console.WriteLine(g.ToString());
    }
}

```

# 実行結果

```
5
1.5
7
7.5



```

# 成果物

https://paiza.io/projects/6YdsTPL3QtX2b002A3ltUA?language=csharp


以上。
パスワードの盗み方

まずはこちらをご覧ください

https://blog.kaspersky.co.jp/kaspersky-international-password-day-2024/36284/

恥ずかしながら知りませんでした。（知ってたひといる？）
5月の第1木曜は「世界パスワードデー」なんだそうです。

そのようなわけで、パスワードについて思うところをお話してみたいと思います。

古今東西さまざまな手法でパスワードを盗み出すことが試みられてきました。
そもそもどうしてパスワードが漏れるのか、有名なところだけをご紹介したいと思います。


●ソーシャルハッキング
ハッキングと行ってもPCを使用したものばかりとは限りません。
最も原始的なハッキング手法、それがソーシャルハッキングです。
やり方は、スパイ映画よろしくビル清掃などを請け負う会社に入社するとか、
あるいは制服を偽装したりしてビル内に潜入します。
IDカードがないと昨今は難しくなったかも知れませんが、清掃スタッフをひとりどうにかすれば手に入りそうです。

こうしてターゲットに潜入したあとはいくつかの手段でもって機密を盗み出します。
ゴミ箱を漁る、ディスプレイに貼り付けられた付箋を見る、機密を知る人物の口から何らかの手段で聞き出す、などです。
その中には下記のショルダーハッキングが含まれます。

●ショルダーハッキング
これは簡単なもので肩越しにタイプ内容を覗き見る行為です。
そのためパスワードはタイピングが苦手な人も素早く打てるようにする練習をしておくべきでした。
ただし現在は要求されるパスワードの桁数と複雑性のせいで早くタイプすることが難しくなっています。
スマートグラスのようなもので観たものを動画として保存し、あとでゆっくり再生すればクラックできそうですね。

●ブルートフォースアタック
これは総当たり攻撃とも言います。
高性能なCPU/GPUがあれば、対象のパスワードを総当りで試していくことでいつかパスワードを突破できます。

ではその「いつか」とはどのくらいなのでしょうか。
下記URLに驚きの数値が記載されていますのでぜひご覧ください
https://devblog.lac.co.jp/entry/20220513

こちら2年前の記事なので現在はもっと性能が上がっていますね。

それと同時に、パスワード長の重要度がわかるかと思います。
もちろん複雑性も兼ね備えているとより良いですね。
この表はぜひとも一読しておいていただきたいと思います。

またこの記事内に「ペネトレーションテスト」という言葉が出てきます。
セキュリティ会社などで使う言葉で、システムにセキュリティ上の問題がないか、侵入試験を行うものです。（やってみたい・・・）


●ディクショナリーアタック
あらかじめ辞書を用意しておき、それらをパスワードとして試すものです。
単語をすべて使用したあとは辞書に載っている言葉の組み合わせで攻撃を続行していきます。
パスワードを意味の通る言葉にしないよう、心がけてください。

* 上記2項に関しては簡単に攻撃を行えるツールが存在します。
　またそういったツールは1時間いくらでレンタルも出来ます。
　自分ではコードが書けないけれどもそうしたツールをレンタルすることで攻撃者はより手軽に攻撃を行うことができるのです。
　つまりサイバー犯罪者とはどこか遠い国の話ではなくて、
　あなたのすぐ隣に住んでいるかも知れない身近な存在なのです。
　（もはや地理は関係ないですが）

------------
さてここまでパスワードを奪取する方法を少しだけ紹介しました。
覚えておいていただきたいのは、
・パスワードはいつか破れる
・桁数12は必要
・侵入できないシステムはない

ということです。
クローズドな環境であれば物理的に侵入すればよいのです。
誘拐を行って口を割らせても構いません。

システム担当（だったひとを含む）を買収する、拷問にかける
家族を人質にとるなど、いくらでも可能なのです。


------------
少し前にご紹介した、情報セキュリティ10大脅威 2024 解説書（PDF）
https://www.ipa.go.jp/security/10threats/nq6ept000000g22h-att/kaisetsu_2024.pdf

32ページから36ページだけでもお読みください。
こちらではIDとパスワードによる認証の限界を論じ、パスキーへの移行を促しています。
　＞IPAとしてはもはやパスワードによる保護よりもパスキーの普及を推奨している模様(P32～）


★もうすこしお話したいこともありますがまた長くなりそうなので、今回はこんなところにしておきたいと思います。
python3.12へバージョンアップしたところ「japanize_matplotlib 」でModuleNotFoundError発生。原因と対処

# 環境
macOS ventura 13.2
Python 3.12.4
japanize-matplotlib 1.1.3(pip)
# Errorの内容
```python
Traceback (most recent call last):
  File "/Users/myname/Library/Mobile Documents/com~apple~CloudDocs/_program_ver3124/年金関連/main.py", line 3, in <module>
    import japanize_matplotlib #日本語化モジュール
    ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/myname/.pyenv/versions/3.12.4/lib/python3.12/site-packages/japanize_matplotlib/__init__.py", line 1, in <module>
    from japanize_matplotlib.japanize_matplotlib import japanize, get_font_path, get_font_ttf_path
  File "/Users/myname/.pyenv/versions/3.12.4/lib/python3.12/site-packages/japanize_matplotlib/japanize_matplotlib.py", line 5, in <module>
    from distutils.version import LooseVersion
ModuleNotFoundError: No module named ‘distutils'
```
# 原因
このエラーは、**distutilsモジュールが見つからない**ために発生しています。
<font color="red">distutils</font>はPythonの標準ライブラリの一部ですが、**Python 3.12**からは別のパッケージとして提供されるようになりました。そのため、<font color="red">手動でインストールする</font>必要があります。
**distutilsの廃止と統合**：**Python 3.12**以降、<font color="red">distutils</font>はPython標準ライブラリから廃止され、<font color="red">**setuptools**</font>に統合されました。これにより、distutilsの機能を使用するには<font color="red">**setuptools**</font>をインストールする必要があります。


# setuptoolsのインストール
1,まずは**ensurepipを使ってpipを最新にする**（pipをインストールまたはアップグレードするために使用）：
```python
python3.12 -m ensurepip --upgrade
```
2,**distutilsをインストールする**：
**Python 3.12**以降では、distutilsモジュールはsetuptoolsに統合され、<font color="red">**distutils自体を直接インストールすることはできません。そのため、setuptoolsをインストールすることが推奨され**てます。</font>
```python
python3.12 -m pip install setuptools
```
これでdistutilsモジュールがインストールされ、Errorは解消されたはずです。
"cannot load such file -- sassc"のエラー解決法

Rails 7.0.8.4において新規のアプリを作成しようとしたところ"cannot load such file --sassc"という下の画像のエラーに遭遇しました。備忘録として残します。

[![Image from Gyazo](https://i.gyazo.com/88b1ed40a9ffbaf78c9f810b220884a2.png)](https://gyazo.com/88b1ed40a9ffbaf78c9f810b220884a2)

原因としては `` sassc ``というGemが見つからないことです.
下の画像の通りGemfileの４６行目に`` gem "sassc-rails" ``という記述はありますが、コメントアウトされていました。
[![Image from Gyazo](https://i.gyazo.com/69ffdf8a54d6ce8b7b3cc6a099e4f6a0.png)](https://gyazo.com/69ffdf8a54d6ce8b7b3cc6a099e4f6a0)
コメントアウトを戻して`` bundle install ``すると解決することができます。


### `` gem "sassc-rails" ``について

SASSC（Syntactically Awesome Style Sheets）をコンパイルするためのCライブラリである libSass をRubyで利用するためのGemです。SassはCSSプリプロセッサであり、CSSをより効率的に書くための機能（ネスト、変数、ミキシンなど）を提供します。sassc はそのコンパイルを高速に行うためのツールです。

## Sass と SassC の関係
- Sass: CSSプリプロセッサ。SCSSとSassという2つの構文をサポートしており、CSSをよりモジュール化して書くことができます。
- LibSass: SassのC言語実装で、非常に高速にSassをコンパイルすることができます。
- SassC: RubyとLibSassのバインディングであり、RubyプロジェクトでLibSassを利用するためのGemです。
### SassC のメリット
- 高速なコンパイル: LibSassを使用しているため、純粋なRuby実装のSassに比べて非常に高速です。
- 安定性と互換性: SassCはLibSassの機能を活用しているため、高い互換性と安定性があります。
firebaseにデプロイするとFirebase Hosting Setup Completeと出る

# はじめに
reactアプリのfirebaseデプロイで少し苦戦したので記事にしておきます。

# 問題
firebase deployコマンドを叩くとなぜかWelcomeされる。
![スクリーンショット 2024-07-22 9.23.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3279945/1a07e908-b012-1ecf-3474-10b2e15736db.png)

# 解決策
firebase init hostingコマンド叩いた際に聞かれる質問を以下のように答えて
```
$firebase init hosting
  ? What do you want to use as your public directory? dist
  ? Configure as a single-page app (rewrite all urls to /index.html)? Yes
  ? Set up automatic builds and deploys with GitHub? No
  ? File dist/index.html already exists. Overwrite? No
```
buildとdeployしなおしたら、無事Hosting URLからアプリの画面を確認できました。
```
$npm run build
$firebase deploy
```

ただ他の方の記事を見ていると人それぞれ原因が違ったり、質問も少し違う場合があったので人によって解決策も変わってくるかと思います。

# おわりに
次はcicdにもチャレンジしていきます。

# 参考記事
https://qiita.com/taisei_code/items/ee065476fef5a7bb34df

https://qiita.com/shintyoku/items/db0c8cf8d7e72a99b9f9

https://qiita.com/h-yoshikawa44/items/441da9ac75eaeea00537

# JISOUのメンバー募集中
プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？

気になる方はぜひHPからライン登録お願いします👇

https://projisou.jp
ネットワークが繋がる理由

## はじめに
こんにちは、テリスです！
ネットワークが繋がる理由についてアウトプットするために書きました。
備忘録として残しておきます。

## 用語解説
- **Web** = WWW(World-Wide-Web)：インターネットを利用して文章や画像などを公開・閲覧できる仕組みのこと
- **インターネット**：世界中のコンピューターを相互接続したネットワーク網
- **HTTP**：情報を取得したり発信したりする際のプロトコル（約束事）
- **URI**(Uniform Resource Identifire)：インターネット上における情報の場所
- **URL**：正確には違いがあるが、URIと同じとして考えて問題ない
- **クエリパラメータ**：?の後に名前=値が続く。パラメーターを渡す
- **URIフラグメント**：URIのリソースの、さらに具体的な部分を指定する
- **ドメイン名**：インターネット上で使われるユニークな名前
- **IPアドレス**：ネットワーク上の機器を識別するためのインターネットの住所
- **DNS**：ドメイン名をIPアドレスに変換する仕組み
- **DNSサーバー**：ドメイン名とIPアドレスの対応表を持っているサーバーで、インターネット上に配置されている
- **ポート番号**：どのアプリケーション宛の通信なのかを指定する番号（手紙でいうと〜様宛と書くのと同じ）
- **TCP/IP**：インターネットを構築する上で必要なプロトコル群の総称。宛先へ通信を届ける役割を担っている
- **HTTPメソッド**：リソースに対して実行したいアクションの種類
- **HTTPステータスコード**：HTTPリクエストが正常に完了したかを示すレスポンスの3桁の数字
- **リソース**：URIを持っている情報のこと

## 用語解説の詳細

### URI(Uniform Resource Identifire)
URIはスキーム、ホスト名、ポート番号、パス名、クエリパラメータ、URIフラグメントから構成されている
http(スキーム)://example.jp(ホスト名):50080(ポート番号)/usr/index.html(パス名)?tag=top(クエリパラメータ)#middle(URIフラグメント)

### HTTP
決められた書式により、クライアント（web検索などインターネットを使う人）がHTTPリクエストを送り、サーバーがHTTPレスポンスを返す

HTTPリクエスト【クライアント　→　サーバー】 ※（）は説明
```
GET（HTTPメソッド） / HTTP/1.1（HTMLのバージョン）
Host: www.google.com:443
Accept: text/html
```

HTTPレスポンス【クライアント　←　サーバー】
```
HTTP/1.1 200（HTTPステータスコード）
cacha-control: private, max-age=0
...
```

### HTTPメソッド
アクションの種類は9種類
- GET：リソースの取得
- POST：リソースの作成
- PATCH：リソースの部分修正
- DELETE：リソースの削除
- PUT：リソースの更新
- HEAD：リソースのヘッダの取得
- OPTION：リソースの利用可能なメソッドの取得
- TRACE：リクエストメッセージを返す試験を実行
- CONNECT：プロキシ動作のトンネル接続への変更

### HTTPステータスコード一覧
ステータスコードは先頭の数字によって5つに分類できる
- 1xx：情報
- 2xx：成功
- 3xx：リダイレクト
- 4xx：クライアントエラー
- 5xx：サーバーエラー

| ステータスコード | 意味 |
|:-:|:-:|
| 200 | OK |
| 201 | Crested |
| 204 | No Content |
| 301 | Moved Permanently |
| 400 | Bad Request |
| 401 | Unauthorized |
| 403 | Forbidden |
| 404 | Not Found |
| 500 | Internal Server Error |
| 503 | Service Unavailable |

## 通信はどのように届くのか

1. HTTPリクエストのHostに記載されているドメイン名をDNSサーバーでIPアドレスに書き換える
2. 書き換えたIPアドレスとポート番号から宛先を特定する
3. TCP/IPがデータをパケットという形で小分けにして送信する※1
※1 インターネットは様々なネットワークが繋がっているため、大きなデータを一度に流すとエラーになる可能性があるため、小さければエラーがしにくく再送もしやすいため、パケットという形で送信している。

## まとめ
現代でネットワークは私たちの生活と切っても切り離せないものとなっています。
日常で使うネットワークの仕組みを少しでも理解しようと学習したが、思っていたよりもネットワークを完全に理解するのは難しそうでした。
今後もネットワークについての学習を進めていきたいと思います！

### 参考
https://dokugaku-engineer.com
Reactの代わりとなる技術について

## はじめに
アプリ制作のフロントエンドやバックエンドの事を学ぶ中でReactについて少し学習しました。今回はReactの代わりとなる技術について少し深ぼってみたのでアウトプットしたいと思います

## Reactは使わなくてもよくなった？！
Reactは、Facebookが開発したJavaScriptライブラリで、ユーザーインターフェース（UI）を構築するためのツールです。
ですが、Ruby on Rails 7以降はWebpackerの代わりにインポートマップ（import maps）やesbuild、Viteなどの新しいフロントエンドツールを導入ています。
これにより、JavaScriptの依存関係をRailsアプリケーション内で直接管理できるようになり、ReactなどのJavaScriptフレームワークを必須とせずにフロントエンドを構築することが可能となっています。

## 早速表にまとめてみました
| <br>フレームワーク/ライブラリ | 特徴 | メリット | デメリット | 相性のいいバックエンド |
| - | - | - | - | - |
| Vue.js | 柔軟で学習曲線が緩やか。コンポーネントベース。 | ・学習しやすい<br>・ドキュメントが豊富<br>・小規模から大規模アプリまで対応 | ・プラグインエコシステムが少ない<br>・大企業のサポートが少ない | Laravel, Node.js, Rails |
| Angular | Googleが開発。<br>フルスタックフレームワーク。 | ・フル機能を提供<br>・大規模アプリに適している<br>・強力な型安全性（TypeScript） | ・学習コストが高い<br>・設定が複雑 | Node.js, ASP.NET, Java (Spring) |
| Svelte | コンパイル時に効率的なコードを生成。 | ・パフォーマンスが高い<br>・コンポーネントベースで書きやすい<br>・設定が簡単 | ・エコシステムがまだ小さい<br>・他のフレームワークに比べて新しい | Node.js, Go, Rails |
| Alpine.js | 軽量なJavaScriptフレームワーク。 | ・非常に軽量<br>・シンプルで直感的<br>・インタラクティブなUIを簡単に構築可能 | ・大規模アプリには向かない<br>・高度な機能が少ない | Laravel, Rails, PHP |
| Stimulus | Railsと相性の良い軽量フレームワーク。 | ・Railsとの統合が簡単<br>・小規模なインタラクティブUIに適している<br>・学習コストが低い | ・大規模アプリには不向き<br>・限られた機能セット | Rails |
| Lit | 	Web Componentsに基づいたライブラリ。 | ・ネイティブWeb Components対応<br>・高い再利用性<br>・小規模なプロジェクトに最適 | ・学習曲線がある<br>・他のライブラリとの統合が難しい | Node.js, Java, Rails |
| jQuery | クロスブラウザ互換性のあるDOM操作ライブラリ。 | ・学習が簡単<br>・豊富なプラグイン<br>・クロスブラウザサポート | ・パフォーマンスの問題<br>・モダンな開発手法に不向き | PHP, Rails, Django |
| Backbone.js | 	MVCアーキテクチャを採用した軽量フレームワーク。 | ・シンプルで軽量<br>・ 高い柔軟性<br>・学習コストが低い | ・大規模アプリには不向き<br>・他のライブラリと組み合わせる必要がある | Node.js, Rails, PHP |


## 適切なフロントエンドフレームワークの選択方法
| スキルレベル | 推奨フレームワーク<br>ライブラリ | 適用プロジェクト例 |
| - | - | - |
| 初心者<br>基本的なHTMLとCSSの知識がある。ウェブ開発始めたばかりの人 | jQuery | 既存サイトのインタラクティブ化、小規模なフォームバリデーションやアニメーション |
| 同上 | Alpine.js | 軽量なインタラクションの追加、シンプルなモーダルウィンドウやツールチップ |
| 中級者<br>中規模なウェブサイトやアプリを構築できる人 | Vue.js | ダッシュボード、シングルページアプリケーション（SPA） |
| 同上 | Stimulus | 小規模なインタラクティブUI |
| 上級者 | Angular | エンタープライズアプリケーション、複雑な業務システム |
| 同上 | Svelte | 高パフォーマンスを求められるインタラクティブなユーザーインターフェース |

## フレームワークの公式サイト
公式サイトは全て海外版のものです。日本語版はVue.jsとAngularのみ確認できました。

https://backbonejs.org/

https://jquery.com/

https://lit.dev/

https://alpinejs.dev/

https://svelte.dev/

https://angular.dev/

https://vuejs.org/

https://stimulus.hotwired.dev/

日本語版はこちら

https://angular.jp/

https://ja.vuejs.org/


## さいごに
Reactの代わりとなるフレームワークについて私個人として見やすい表の形式で紹介しました。私自身、Reactを使用しないといけない…みたいな状態にあり、ほかの人から教えてもらうことで使用しなくても作成できることを知りました。使用するフレームワークによっては見栄え等がアップしますが、私含め初心者さんは、まずは最低限を目指しましょう！
OpenAIのAPIを準備なしの状態から最速で叩くまでの手順

## OpenAIのAPIをとりあえず叩いてみたいという人向け
OpenAI公式のドキュメントのうち、最速で叩くために必要な情報をピックアップします。

https://github.com/openai/openai-python

:::note info
既存のOpenAIのアカウントでAPIを叩きたい人は、無料利用枠がない可能性があります。なんらかの理由で既存のアカウントでAPIを叩きたい場合は、クレジットをチャージする(課金する)必要があります。

新規アカウント作成を行ない場合は、無料利用枠があるために不要です。
:::





## 手順

https://openai.com/api/


### 1. "Start building"をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1045261/4449445b-596c-8e84-ff9e-298be7318da6.png)

### 2. 右上のLog inあるいはSign upをクリック
無料利用枠を利用したい方はSign upから新規アカウント作成を行ないましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1045261/bed8a903-1cc4-e819-64c7-77a5b536fc50.png)

### 3. API keyを発行

https://platform.openai.com/api-keys

このページにアクセスし、左サイドバーからAPI keysを選択。
画面中央下あたりにある"+ Create new secret key"をクリックしてsecret keyを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1045261/c5e6b0a3-1b62-c54d-d26a-d206aecab2b8.png)

最速を目指すのでNameは設定せず、"Create secret key"を選択すると、keyが生成されます。

発行されたkeyは安全な場所に保存しておきましょう。
※間違ってもkeyをgit管理したりブログに載せたりしないように(見知らぬ人に重課金されたり、無料枠全部使われたりしちゃうかも)。


### 4. APIを叩くためにlocal環境を構築
terminalを起動して下記コマンドを実行しましょう。
```
pip install openai
```

### 5. 発行したkeyを環境変数にexport
```
export OPENAI_API_KEY="put your key hereeeeeee"
```

### 6. sample.pyを作成
``` sample.py
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ.get("OPENAI_API_KEY"),
)

chat_completion = client.chat.completions.create(
    messages=[
        {
            "role": "user",
            "content": "猫という名前の由来を教えてください。"
        },
    ],
    model="gpt-3.5-turbo",
)

print(chat_completion.choices[0].message.content)

```

上記のソースコードはOpenAIのGitHubにあるものを少し改造したものになります。

https://github.com/openai/openai-python#:~:text=pip%20install%20openai-,Usage,-The%20full%20API

### 7. sample.pyを実行してOpenAIのAPIを叩く
```
python sample.py
```

うまくいけば下記のような出力が得られるはずです。

>「猫」という名前の由来は諸説ありますが、一般的には古代エジプトの言葉「マウ」や古代ギリシャ語の「アイルウロス」に由来しているとされています。これらの言葉は、猫の鳴き声を表す語とされており、その後「マウ」や「アイルウロス」が古代ローマ語や中世ラテン語を経て、「猫」という言葉が現在の日本語になったとされています。

:::note warn
openai.RateLimitErrorが発生してしまう場合
なんらかの理由で無料枠がアカウントに存在しないと思われるため、新規アカウントを作るか下記の手順に従ってクレジットを購入しましょう。
:::
https://qiita.com/tnktnk/items/19c1df67cca52b380141
エンジニアにおける心理的安全性の高いチームとは？

今回は[こちらのいただいたコメント](https://qiita.com/nakaizumi_slj/items/b7296af4a97e8e8d43b0#comment-6f722fb4f73d3e826540)をヒントに記事を作成いたしました。

心理的安全性とは、チームメンバーが自分の考えや意見を自由に表現できる環境のことを指します。この環境では、メンバーがミスを恐れず、新しいアイデアやフィードバックを共有できるため、チームの生産性や創造性が向上します。
# 1. はじめに
エンジニアリングチームでは、高度な専門知識が要求されるため、メンバーが互いに信頼し、安心して意見を交わすことが不可欠です。また、複雑な問題解決やイノベーションには、オープンで安全なコミュニケーションが必要です。バグやエラーの早期発見と修正が容易になるため、品質の向上にも寄与します。

<img 　width="10px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/ca9fc71b-6c6c-2334-0653-b442f4f01129.png">


# 2. 心理的安全性
ハーバード・ビジネス・スクールの教授であるAmy Edmondsonは、心理的安全性を
>「チームのメンバーが持つ、チームは対人関係でリスクを取るのに安全であるという共通の信念」

と定義しています。
彼女の研究によれば、心理的安全性が高いチームは、メンバーのエンゲージメントやパフォーマンスが向上します。


# 3. エンジニアリングチーム特有の課題
心理的安全性が高いチームでは以下のようなリスクの低減が期待できます。
- **チームの成長が阻害される**
エンジニアリングチームでは、専門知識が深いため、メンバーが互いに意見を交換し、学び合うことが重要です。
心理的安全性が低いと、知識の共有が滞り、チームの成長が阻害されます。

- **品質が悪くなる**
エンジニアはバグやエラーを避けられない存在ですが、心理的安全性が低いと、これらの問題を報告することをためらいます。
これにより、問題の発見と解決が遅れ、品質に影響を与える可能性があります。

- **パフォーマンスの低下**
タイトなデッドラインやプロジェクト管理のプレッシャーがかかる中で、心理的安全性が低いと、質問をしにくい等の問題が発生することでメンバーがストレスを感じ、パフォーマンスが低下します。
心理的安全性が高い環境では、メンバーが協力してプレッシャーに対処しやすくなります。

# 4. 心理的安全性を高める具体的な方法

### リーダーの役割
- **リーダーが示すべき具体的な行動**  
リーダーは、オープンなコミュニケーションを奨励し、フィードバックを受け入れる姿勢を示す必要があります。
具体例としては、メンバーの意見を尊重し、積極的に質問を促すことが挙げられます。

- **透明性とオープンなフィードバックの奨励**  
リーダーは、チーム内での透明性を確保し、オープンなフィードバックを奨励することで、心理的安全性を高めることができます。
これにより、メンバーは安心して意見を共有しやすくなります。

### チームメンバー間の信頼関係構築
- **信頼を築くためのアクティビティ**  
コードレビューやペアプログラミングなど、チームメンバーが協力して作業する機会を増やすことで、信頼関係を築くことができます。
メンバー間のコミュニケーションが円滑になり、心理的安全性が高まります。

- **1on1ミーティングや定期的な振り返りセッションの重要性**  
1on1ミーティングや定期的な振り返りセッションを実施することで、メンバーの意見や感情を把握し、信頼関係を深めることができます。
信頼関係を深めることによって、メンバーは安心して意見を共有しやすくなります。

### エラーを恐れない文化の形成
**これは心理的安全性を高める上で最も重要な項目であると考えています。**
- **ミスを学習機会として捉える姿勢**  
チームは、ミスを責めるのではなく、学習機会として捉える姿勢を持つことが重要です。
これにより、メンバーは安心してミスを共有し、次の改善につなげることができます。

- **振り返りセッションを通じた失敗の共有と学び**  
プロジェクト終了後の振り返りセッション等を通じて、失敗から学ぶ文化を形成することが重要です。
これにより、チーム全体が学びを共有し、次のプロジェクトに生かすことができます。

# 5. 心理的安全性の評価方法
心理的安全性を評価するために、アンケートやツールを活用することが有効です。
評価結果をもとに、具体的な改善アクションを実施することで、心理的安全性を高めることができます。
例えば、コミュニケーションの改善やフィードバックの奨励などがあります。

# 6. オンライン環境での心理的安全性の維持方法

- **リモートワークやハイブリッドワーク環境でのチャレンジ**  
リモートワークやハイブリッドワーク環境では、心理的安全性の維持が難しくなることがあります。
これに対処するためには、定期的なオンラインミーティングやバーチャルチームビルディング活動が有効です。
チームビルディングの際には双方カメラをオンにして行うことで、心理的抵抗感が少なくよりスムーズに関係構築ができると考えられます。

- **オンラインツールを活用したコミュニケーションの工夫**  
オンラインツールを活用して、チーム内のコミュニケーションを円滑にする工夫が重要です。
例えば、SlackやTeamsなどのツールを活用して、オープンなチャット環境を提供することが考えられます。

# 7. まとめ  
エンジニアリングチームの心理的安全性を高めるためには、リーダーとメンバーが協力して取り組むことが不可欠です。
この記事を参考に、チームの心理的安全性を向上していただけると幸いです。
ここまで読んでいただきありがとうございました。

# 参考文献
https://media.unipos.me/psychologicalsafety-ted

https://www.jcss.gr.jp/meetings/jcss2021/proceedings/pdf/JCSS2021_P2-65.pdf

https://rework.withgoogle.com/jp/guides/understanding-team-effectiveness#help-teams-determine-their-needs

# 謝辞
@mogamoga1337 様
コメントをいただきまして、心よりお礼申し上げます。
HULFT10 for Container Services アンインストールについて （環境構築）

## はじめに
こんにちは。すぎもんです:smile:

こちらは、[HULFT10 for Container Services (EC2) 環境構築してみた](https://qiita.com/sugimon/items/375904187a043aeed2bc)に併せて記載したサブ記事になります。
HULFT10 for Container Services (EC2) 環境構築してみた、記事により簡単に環境構築できるようになりました。あとは簡単に削除できることがわかればさらに気軽に環境構築してみよう！となれるはず。そんな期待を込めた記事となります。

:::note
別途インスタンス停止の記事を記載していますが、本記事は完全削除実施でインフラに対する課金は0になります。再構築は再度導入が必要になります。
:::

関連記事：
* [HULFT10 for Container Services AWSインスタンスの停止について （環境構築）](https://qiita.com/sugimon/items/0cabf046058421452fbb)

CloudFomationを利用して構築した環境はCloudFomationで削除できます。

* ①Cloud Formation 2 の削除
* ②Cloud Formation 1 の削除
* ③事前導入準備で作成した環境の削除
* ④Marketplace解約
　（管理コンテナベースの課金となるので解約不要です。）

## ①Cloud Formation 2 の削除
:::note
RDSのインスタンスを停止していると削除に失敗します。その際はインスタンスを起動し、削除の再試行で削除できます。
:::

* ネスト表示をオフにするとシンプルな表示となります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/32cf304d-16a5-87ff-d5a3-72618d7e05ff.png)
* 削除を実施します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/453bad46-e152-29a0-1792-8d489ba4b554.png)
* 削除中（20-30分）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/36245529-92f3-b1b2-de31-9778ea9699f3.png)

## ②Cloud Formation 1 の削除
オペレーションはCloud Formation 2と同様です。（20-30分）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/7464f825-f88b-3f5e-261e-9b1792c26ce3.png)

## ③事前導入準備で作成した環境の削除
※無料枠のEC2は削除しなくても無料です。
※ドメイン削除は年額初期支払いのため、実施しないこととします。
セキュリティーグループの削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/d69ef642-264c-71b5-864c-48f955acd1a6.png)
VPCの削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/cf8da2ac-9647-0c09-3a75-02e88cefde68.png)

## ④Marketplace解約
　　（管理コンテナベースの課金となるので解約不要です。）
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/51f7f8eb-2602-e620-a75f-246337bec354.png)
  サブスクリプションのキャンセルで解約できます。

## 最後に

いかがでしたでしょうか。まずはHULFT10 for Container Servicesの試験環境構築の削除をしてみました。

HULFT10 for Container Servicesの環境は、インスタンス起動時の従量課金となるため環境削除やインスタンス停止はコスト削減に大きく役立ちます。

HULFT10 for Container Servicesですが、これまでのHULFTとは全く違いますね。機能ではどんな違いがあるのか・・・それはまた触ってみて、記事を書いてみようと思います。

このブログでは、今後も様々なTopics記事や接続検証等、皆さんの役に立つような記事を投稿していきたいと思います！
ここまで読んでいただきありがとうございました。それでは、また！
Docker初心者必見！ゼロから学べる実践入門

Dockerとは？
---
Dockerは、アプリケーションのデプロイメントを自動化するためのコンテナ型の仮想化技術です。
従来の仮想マシンとは異なり、軽量で高速に動作します。
コンテナを使用することで、開発環境と本番環境の差異をなくし、一貫性のある環境でアプリケーションを実行できます。

基本的なDockerコマンド
---

``` .イメージの取得
docker pull <イメージ名>
```
例: docker pull nginx
___

``` .コンテナの起動
docker run -d -p <ホストポート>:<コンテナポート> <イメージ名>
```
例: docker run -d -p 80:80 nginx
___
``` .コンテナの一覧表示
docker ps
```

``` .コンテナの停止
docker stop <コンテナID>
```
Dockerfileの作成
---
``` .Dockerfileの作成
# ベースイメージを指定
FROM node:14

# 作業ディレクトリを設定
WORKDIR /app

# パッケージファイルをコピー
COPY package.json /app

# 依存関係をインストール
RUN npm install

# アプリケーションのソースコードをコピー
COPY . /app

# アプリケーションを起動
CMD ["node", "index.js"]

# コンテナが使用するポートを指定
EXPOSE 3000
```
Dockerfileは、Dockerイメージを作成するためのレシピファイルです。
___

``` .Docker Composeの使い方
version: '3'
services:
  web:
    image: nginx
    ports:
      - "80:80"
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: example

```
Docker Composeは、マルチコンテナDockerアプリケーションを定義し実行するためのツールです。
docker-compose.ymlファイルを使用して、アプリケーションのサービス、ネットワーク、ボリュームを設定します。

Docker Hubへのイメージのプッシュ
---
``` .Docker Hubにログイン
docker login
```

``` .イメージにタグを付ける
docker tag <イメージID> <Docker Hubユーザー名>/<リポジトリ名>:<タグ>
```

``` .イメージをプッシュ
docker push <Docker Hubユーザー名>/<リポジトリ名>:<タグ>
```
まとめ
---
Dockerは、アプリケーションの実行環境を一貫して提供するコンテナ型仮想化技術です。
OpanAIのAPIを叩くとopenai.RateLimitErrorと言われる

## OpenAIのAPIを叩いてみたところ、下記のようなエラーが発生してしまった...
`openai.RateLimitError: Error code: 429 - {'error': {'message': 'You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.', 'type': 'insufficient_quota', 'param': None, 'code': 'insufficient_quota'}}`



## どうやら事前に支払いを行っておく必要があるらしい？
　無料枠があると色々な記事で読んだのだが、無料利用のための18ドルのクレジットは新規に電話番号を登録した際にもらえるらしい。つまり、新しくアカウントを作成するか既存のアカウントで課金を行わないとAPIを叩けないということ。


 ## openai.RateLimitErrorを解決するには、事前にクレジットを課金する必要がある

 https://platform.openai.com/settings/organization/billing/overview

　支払いの設定はこちらのURLから可能となっている。設定方法は下記の通り。

 1. 「Add payment details」 をクリック
 1. 「Individual」をクリック
 1. クレジットカード番号などの支払い情報を入力

　
　クレジットが足りなくなった際にオートチャージを行うかどうかも設定できる。私はテストのためにAPIを利用したかったので、オートチャージはオフにして10ドル課金した。
「サブネットマスク」ってなに？

さて、前回はネットワークってなんだって観点から、
TCP/IPという各メーカー共通の規格を使ってやり取りしよう。
それでTCPとIPの2つを解説するにあたり、まずはIPアドレスに少し触れました。

ここでIPアドレスの対になる概念をお話します。

それが「サブネットマスク」です。

例えばIPアドレスを振ってくださいというときに
IP：192.168.10.9
SM：255.255.255.0

などという表記をみたことがあるでしょうか。
この例ではSMと略されたものがサブネットマスクです。

んじゃこれ一体なんなの、といいますと、
「ネットワークの大きさを示す数値」だと思ってください。

わたしが今までにみた一番秀逸な説明方法が、電話番号に例えたものです。

みなさん自宅に電話ありますか？（もうない人いますよね）

東京と大阪は、03と06から始まります。
わたしの住む京都市は075から始まります。
場所によっては4桁となりますね。

電話番号の総桁数は10桁固定です。
地域を示す番号が先頭から3桁の場合、のこり7桁で加入者の番号を賄う必要があります。
東京や大阪では加入者が多いので7桁でまかないきれません。
そのため先頭の地域番号を2桁にしました。
そうすると加入者には8桁のアドレス空間から番号を振ることができます。

住む人が少ない地域はどうでしょう。
そんなにたくさん空間が要りません。
そのため先頭4桁を地域番号としました。

これと同じことをIPアドレスにも行います。
上記の例では人間にわかりやすいように10進数でアドレスを示してありますが
コンピュータの内部では2進数で扱われます。

（10進数）
IP：192.168.10.9
SM：255.255.255.0

これを2進数に変換すると、

（2進数）
IP：11000000.10101000.00001010.00001001
SM：11111111.11111111.11111111.00000000

こうなります。
SM行に注目してください。
第3オクテットまですべて「1」ですね。
これで、「先頭24ビット（８x３）はネットワーク番号ですよ」という意味になります。

これを、このように書いて表現することがあります。
IP/SM：192.168.10.9/24


サブネットマスク自体は上記が理解できていればとりあえず業務は遂行できると思うのですが、もうひとつだけ書いておきたいと思います（また話が長くなる・・・）

あなたはとある部署のネットワーク管理者で管理区分は
192.168.10.0/24です。

ある日このネットワークを2つに等しく分割してくれと言われました。
どうすればいいでしょうか。

CIDR（サイダー）と呼ばれる手法を使います。
24ビットマスクのネットワークを2つに分割ということですから、マスクを一つ増やせばいいわけです。
サブネットマスクを25ビットとします。

（2進数）
SM：11111111.11111111.11111111.10000000
　　　　　　　　　　　　　^^^
　　　　　　　　　　　　　↑ココが増えた！

これを10進数にすると、
（10進数）
SM：255.255.255.128

となります。
CIDR表記でいうと
IP/SM：192.168.10.9/25
です。

このようにアドレッシングにはまず
◯クラスフルアドレッシング（クラスA、B、C）
があり、それを柔軟に活用するために
◯クラスレスアドレッシング（CIDR)
というものもあるということを覚えておきましょう。
Enhanced Transaction Security 拡張トランザクションセキュリティ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)


+ [拡張トランザクションセキュリティとは](https://successjp.salesforce.com/article/NAI-000581)
+ [拡張トランザクションセキュリティ](https://help.salesforce.com/s/articleView?id=sf.enhanced_transaction_security_policy_types.htm&type=5)
+ [Enhanced Transaction Security](https://developer.salesforce.com/docs/atlas.en-us.securityImplGuide.meta/securityImplGuide/enhanced_transaction_security_policy_types.htm)

拡張トランザクションセキュリティは、リアルタイムイベントを受信し、ユーザー活動を監視して制御するための適切なアクションを適用するフレームワークです。どのトランザクションセキュリティポリシーにも、イベントを評価する条件と、条件を満たした後にトリガーされるリアルタイムアクションがあります。アクションは、ブロック、多要素認証、通知です。ポリシーを作成する前に、使用可能なイベント種別、ポリシー条件、一般的な使用事例を理解します。拡張トランザクションセキュリティは、リアルタイムイベント監視に含まれています。


# エラー

+ [Who is the running user for Apex based Enhanced Transaction Security policies?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007epuSY)

:::note
 you are doing this in the context of executing a Transaction Security Policy, the running user is Automated Process so using FeatureManagement.checkPermission applies to Automated Process.

 これはトランザクション セキュリティ ポリシーを実行するコンテキストで実行されています。実行中のユーザーは自動プロセスなので、FeatureManagement.checkPermission の使用は自動プロセスに適用されます。
:::

+ [トランザクションセキュリティポリシーにて、ログインイベントを用いて、ユーザーログインの追跡を行いたいです。要望としてはユーザーがいつ Chrome ブラウザーを使用してログインしたかを追跡できるようにしたいです。どのように条件設定すればよろしいでしょうか](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Vh79d)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d06158ea-ba57-21f7-64d9-5f2f77a01023.png)

:::note
以下の内容、また実際のログイン履歴を見るとChrome はChrome 120のようにChrome とバージョンになっていると思います。
よってChromeから始まるとか、含むではどうでしょうか？
https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8JGzSAN

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8a58e37b-43b9-e771-9b8a-0790e0ca18bc.png)
:::
【Flutter】Textを透明にする

こんにちは。
今回は、Textを透明にする方法を紹介します。

# 方法
![スクリーンショット 2023-08-13 20.18.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/ce57fee2-1687-ea40-8538-b4c8b9db94e0.png)

Textの透明度を設定するには、Opacityを使います。
TextをOpacityでラップします。
Opacityの引数「opacity」に透明度を０〜１の値で指定します。
透明度は、0が透明で、1に近いほど不透明になります。




# 使用例
```dart
class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  var _selectDate = DateTime.now();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text("Opacity"),
        ),
        body: const Center(
          child: Opacity(
            opacity: 0.5, //半透明
            child: Text('半透明'),
          ),
        ));
  }
}

```

# 実行例
![スクリーンショット 2024-07-22 9.11.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/5bcdd48c-7199-ecad-9524-b0029f82a42a.png)



# 最後に
ここまで読んでいただき、ありがとうございました！
いいねしてくれたら、スキップして喜びます:heartpulse:
【ネットワークとはなんですか】


皆さんの中には、産まれたときすでにインターネットがあったという方がいらっしゃるかもしれません。

インターネットとは何でしょう。

ネットワークとネットワークを繋いで相互に行き来できるようにしたもの、と考えてみてください。
それではそのネットワークとは何でしょうか。

舞台を大学の研究室だと仮定してお話してみましょう。

コンピュータのなかった頃は論文は紙と鉛筆で書いていました。
そのうちワープロという機器ができました。

とある先生は大学のなかでパソコンを導入したと思ってください。
★今回はメインフレームとかの話はまだしません。

導入したコンピュータは2台です。
1台は電算室の中に設置されていてプリンタが繋がっていて、1台は先生の研究室の机の上にあります。

論文を書くのは研究室のパソコンなのですが、これを印刷する必要があります。

書き上がった論文をフロッピーディスクに保存して、これを助手くんに頼んで電算室のパソコンまで持っていって印刷してもらいます。

これを、「スニーカーネットワーク」と呼びます。
助手くんはスニーカーを履いてフロッピーと出力された紙の論文を持って移動するわけです。

プリンタを2台買えば良いのかもしれませんが、予算が足りません。

これでは規模が大きくなると不効率だということで、研究室のパソコンからファイルを電算室のパソコンに直接送ってしまいたいという欲求が産まれました。
（もちろんプリンタを共有してもいいのですが、その発想はちょっと置いといてください。）

ではどうするか。

2台のパソコンを繋ぐ仕組みが必要ですね。
そのためにNICという部品が生み出されました。
NICというのはNetworkInterfaceCardの略です。

そのNICという物理デバイスをパソコンに組込みます。
パソコンには拡張スロットという部分があり、そこに差し込むスタイルのものが主流でした。
そのうえで企画にあったケーブルで両者を接続します。

さてその次に必要なのはパソコンのOSに通信というものを理解させる仕組みが必要となります。

それぞれのメーカーが、独自の企画でやり取りをしていました。
よって2台のパソコンが違うメーカーですとやり取りはできません。（できる仕組みはもう少しあとで作られます。）
たとえば、IPX/SPXとかNetBEUIなどと呼ばれる物がありました。
これらを「プロトコル」と呼びます。

このときはまだTCP/IPというものはありません。
ちなみにこのころはWindowsすらまだありません。

---------------------------
さてインターネット老人会よろしく、昔のことばかりを書いても仕方ありません。
とはいえ、できるだけ仮定をシンプルにしたかったので黎明期の話をしてみました。

ここでざっと時間を進めてみましょう。

それぞれのメーカーが独自に規格をつくっていたのでは、不便ですね。

ISOという団体が規格を決めました。
「OSI参照モデル」と呼びますが、内容はここでは扱いません。
扱いませんがぜひとも知っておいていただきたい内容ですので、みなさんもざっとお調べになってみてください。

ともかく、これで「統一規格」と呼べるものが作られました。
今後はこれに沿って発展して行くことになります。


上述のOSI参照モデルに沿って、「TCP/IP」というプロトコルが産まれます。
このTCP/IPの登場によりネットワークは大きく飛躍することになります。

また、時代の変遷とともにWindowsやLinuxといった、いま主流となって使われているOSも登場します。

---------------------------

それで先生の研究室では年度ごとにPCを追加し、設備も充実してきました。

そんな折、となりの研究室の先生からデータのやり取りをしたいという電話がありました。（まだメールとかありません。。。。）

どうしたらいいのでしょう。

現段階では、先生のPCにはIPアドレスなんてものはついていません。
物理的につなげて、共有したいものを選んで共有設定をかければだれでもどこからでも（つながってさえいれば）アクセスが可能です。
このときはセキュリティなんてものは存在しません。

まず、いままでは「ホスト名」で共有資源にアクセスしていました。
すべての共有資源が一覧表示され、そこにアクセスすれば完了です。

先生の研究室PCのホスト名が「kenkyuPC」だったとしましょう。
相手のセンセイの研究室PCのホスト名も同じ名前だったとしたら、どちらにアクセスすれば良いのかわからずに通信が出来ません。

そこで考えられたのが「IPアドレスを使用してそれでアクセスする」ということです。

先生の研究室のPCにTCP/IPを導入して、それぞれのPCにIPアドレスを振ります。
相手の研究室のPCには重複しないアドレスを振ってもらいます。

そのうえで、ケーブルを接続すればやり取りが可能になります。
このときに、
A研究室では192.168.0.xxx
B研究室では192.168.129.xxxを振れば、それがどちらの研究室のPCであるかがわかります。

つまり「つけられたアドレスによって所属が明らかになる」ということですね。

このアドレスは、IPXなどの他のプロトコルでも存在します。
TCP/IPというのはTCPというプロトコル（OSI参照モデルでのレイヤー４）とIPというプロトコル（OSI参照モデルでのレイヤー３）のことを指します。
IPアドレスというのはIPで使用するアドレスということで、
たとえばIPXならはIPXアドレスということになります。

管理者が一人であればすべての資源はその管理者が管理しているのでわからないことはありません。
しかし、研究室が２つつながる＝それぞれの管理者がバラバラに管理しているものを繋げる場合に、考慮すべき内容が増えていくわけですね。

---------------------------

さて、先生の勤める大学はどんどんIT化がすすみ、いささか無茶ではありますが今ではPCとプリンタなどのIPアドレスを持つ機器（以下ノードと呼称）が800万台を超えました。

いまからこの800万台の機器にIPアドレスを振ってほしいのですが、どうしたらいいと思いますか？

いままでは192.168.1.xxxを振っていたのですけど、この方法では254台しか収めることができません。

IPアドレスというのはだいたい以下のように記載されますね

例）10.20.30.40

これはわかりやすいように10進数で表していますが、実際には2進数を読みやすく変換したものです。
よって先頭から8ビットずつ、合計で32ビットで表されるものです。
この1つ1つの区切りを「オクテット」と呼びます。
例えば上の例の「30」の部分は「第3オクテット」と呼びます。

ここで、ネットワークの大きさというものを説明する必要があります。
ネットワークの大きさは「クラス」という概念を用いて差別します。

IPアドレスの32ビットのうち、
第1オクテットのみをネットワーク番号と決めたものをクラスA
第2オクテットまでをネットワーク番号と決めたものをクラスB
第3オクテットまでをネットワーク番号と決めたものをクラスC
と呼称します。

それで、800万ノードを収めることのできる大きさをもつネットワークはクラスAとなります。

このあたり（ビットの計算とか）もう少し詳しくやりたいのですが、後日に回します。
React初心者必見！ゼロから学べる実践入門

はじめに
---
Reactは、Facebookによって開発されたJavaScriptライブラリで、ユーザーインターフェイス（UI）の構築に使用されます。
コンポーネントベースのアプローチにより、再利用可能なUI部品を簡単に作成できます。

メリット
---
`コンポーネントベース`：UIを小さな部品に分割し、それぞれを独立して開発・管理できます。
`仮想DOM`：実際のDOM操作を最小限に抑え、高速なUI更新を実現します。
`コミュニティとエコシステム`：豊富なライブラリやツールがあり、開発効率が向上します。

JSX
---
JSXは、JavaScript内でHTMLを記述するための構文です。
直感的にUIを記述できるため、開発がスムーズになります。
``` .jsx 
const element = <h1>Hello, world!</h1>;
```

Reactの基本
---
``` .コンポーネントの作成
import React from 'react';

function HelloWorld() {
  return (
    <div>
      <h1>Hello, World!</h1>
    </div>
  );
}

export default HelloWorld;
```

useState
---
Reactでは、コンポーネントの状態を管理するためにuseStateフックを使用します。
ユーザーインターフェイスの一部のデータを保持し、コンポーネントの再レンダリングに影響を与えます。
``` .useState
import React, { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

export default Counter;
```

useEffect
---
関数コンポーネント内で副作用（サイドエフェクト）を処理するためのフックです。
副作用とは、コンポーネントのレンダリングに直接関係しない処理のことを指します。
例えば、データのフェッチ、手動でのDOM操作、サブスクリプションの設定や解除などです。
``` .useEffect
import React, { useState, useEffect } from 'react';

function DataFetching() {
  const [data, setData] = useState([]);

  useEffect(() => {
    fetch('https://api.example.com/data')
      .then(response => response.json())
      .then(data => setData(data));
  }, []);

  return (
    <ul>
      {data.map(item => (
        <li key={item.id}>{item.name}</li>
      ))}
    </ul>
  );
}

export default DataFetching;
```

ディレクトリ例
---
```
my-app/
├── public/
│   ├── index.html           # アプリケーションのHTMLテンプレート
│   └── favicon.ico          # ファビコン
├── src/
│   ├── assets/              # 画像やフォントなどの静的ファイル
│   ├── components/         # 再利用可能なUIコンポーネント
│   │   ├── Button.js
│   │   ├── Header.js
│   │   └── Footer.js
│   ├── pages/              # ページコンポーネント
│   │   ├── HomePage.js
│   │   ├── AboutPage.js
│   │   └── ContactPage.js
│   ├── hooks/              # カスタムフック
│   │   └── useFetch.js
│   ├── services/           # API呼び出しやビジネスロジック
│   │   └── apiService.js
│   ├── context/            # コンテキストAPIの定義
│   │   └── ThemeContext.js
│   ├── utils/              # ユーティリティ関数
│   │   └── formatDate.js
│   ├── App.js              # アプリケーションのメインコンポーネント
│   ├── index.js            # アプリケーションのエントリーポイント
│   └── setupTests.js       # テストセットアップ
├── .gitignore              # Gitで無視するファイル
├── package.json            # プロジェクトの依存関係とスクリプト
└── README.md               # プロジェクトの説明

```

まとめ
---
ReactはJavaScriptライブラリで、コンポーネントベースのアプローチを使用して再利用可能なUI部品を作成し、仮想DOMにより高速なUI更新を実現します。
豊富なコミュニティとエコシステムがあり、開発効率が向上します。
Material-UI（MUI）初心者必見！ゼロから学べる実践入門

はじめに
---
GoogleのMaterial Designガイドラインに基づいたReactコンポーネントライブラリです。

MUIのインストール
```
npm install @mui/material @emotion/react @emotion/styled
```
```
npm install @mui/icons-material
```

MUIの基本的な使用法
---
MUIを使用するには、まずアプリケーションにMUIのテーマプロバイダーを追加する必要があります。
```
import React from 'react';
import { CssBaseline, ThemeProvider, createTheme } from '@mui/material';
import Button from '@mui/material/Button';

// テーマを作成する
const theme = createTheme({
  palette: {
    primary: {
      main: '#1976d2',
    },
    secondary: {
      main: '#dc004e',
    },
  },
});

function App() {
  return (
    <ThemeProvider theme={theme}>
      <CssBaseline />
      <div style={{ padding: 20 }}>
        <h1>Hello, MUI!</h1>
        <Button variant="contained" color="primary">
          Primary Button
        </Button>
        <Button variant="outlined" color="secondary">
          Secondary Button
        </Button>
      </div>
    </ThemeProvider>
  );
}

export default App;
```
主要なコンポーネント
----
`Button`: ボタンを作成します。variantプロパティで、contained（塗りつぶし）やoutlined（枠線）などのスタイルを選択できます。
`Typography`: テキストを表示するためのコンポーネントで、フォントスタイルやサイズをカスタマイズできます。
`AppBar`: アプリケーションのヘッダー部分を作成するためのコンポーネントです。
`Card`: コンテンツをまとめるためのコンポーネントで、画像やテキスト、アクションを含めることができます。

MUIのテーマカスタマイズ
---
MUIでは、テーマをカスタマイズしてアプリケーションの外観を変更できます。
createTheme関数を使って、カスタムテーマを作成します。
```
const theme = createTheme({
  palette: {
    primary: {
      main: '#4caf50', // プライマリカラーを緑色に変更
    },
  },
});

```

まとめ
---
Material-UI（MUI）は、Reactアプリケーションで素早く美しいUIを構築するための強力なツールです。
HULFT10 for Container Services AWSインスタンスの停止について （環境構築）

## はじめに
こんにちは。すぎもんです:smile:

こちらは、[HULFT10 for Container Services (EC2) 環境構築してみた](https://qiita.com/sugimon/items/375904187a043aeed2bc)に併せて記載したサブ記事になります。
HULFT10 for Container Servicesの「環境構築」を実施するとAWSインフラに対するコストが発生します。試験運用時などは待機時間が多いことが想定されるので待機コストを削減する設定を簡単に記載します。

関連記事：
* [HULFT10 for Container Services アンインストールについて （環境構築）](https://qiita.com/sugimon/items/66e2312e753445d9d258)
試しに構築した環境は簡単に削除できます。

:::note
Marketplaceから導入したHULFT10 for Container ServicesもAWSインフラ同様に停止によるコスト削減ができます。
HULFT10 for Container Servicesのサブスクリプションは管理コンテナ起動時間による従量課金と年額課金の選択です。
:::
:::note
HULFT10に関する記述やAWSの設定画面などは記事執筆段階でのものです。その後異なる場合がある点、ご留意ください。
:::
## 今回やること

今回は特に稼働によるコスト影響の大きいEC2とRDSについて言及します。

　　①EC2 インスタンスの停止（AutoScaring設定）
　　②AWS RDSの一時停止

## ①EC2 インスタンスの停止（AutoScaring設定）
* EC2のAuto Scaling グループを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/046b1a4f-23a7-1bb9-073f-a61d820cc0e4.png)
* グループの詳細からインスタンス数を変更できます。すべてを0にすると停止となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/6b807a53-4cab-9ada-b58f-b0a1f4330e36.png)

## ②AWS RDSの一時停止
RDSを選択し一時停止を行います。注意としてRDSは7日後にインスタンスが自動起動し、課金が発生します。
自動再起動を避けるためには別途対策が必要ですがここでは言及しません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/fdaa5942-df6f-ed14-0371-8dd86c8f8475.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/e9fdac9a-c913-77c7-a9b4-fb9973a5c9fa.png)

## 最後に

いかがでしたでしょうか。まずはHULFT10 for Container Servicesの試験環境構築でのインスタンス停止をしてみました。

HULFT10 for Container Servicesの環境は、インスタンス起動時の従量課金となるためインスタンス停止はコスト削減に大きく役立ちます。

HULFT10 for Container Servicesですが、これまでのHULFTとは全く違いますね。機能ではどんな違いがあるのか・・・それはまた触ってみて、記事を書いてみようと思います。

このブログでは、今後も様々なTopics記事や接続検証等、皆さんの役に立つような記事を投稿していきたいと思います！
ここまで読んでいただきありがとうございました。それでは、また！
(QA) IBM i OSをバージョンアップします、コマンド・機能等の変更点を調べたい

## IBM i バージョン間で変更になった機能の一覧はプログラム資料説明書に記載されています。

[こちらの記事](https://qiita.com/gomAnomalocaris/items/6faa16b8885d10834a3f)にも登場した、***プログラム資料説明書*** には一つ前のIBM i OSバージョンからのOSコマンドの変更点（デフォルト値の変更、パラメーター追加等）や細かい機能面での変更点（新バージョンのOSではサポートされなくなる機能・コマンド等も含まれます。）が記載されています。

「プログラム資料説明書」は英語原文名で ***Memo to Users*** と呼ばれることもあります。

## プログラム資料説明書PDFの場所？

IBM i OSバージョン毎にPDFファイルとウェブページ（内容は同一）があります。

PDFのリンクはコチラです。

[***IBM i 7.5 プログラム資料説明書***](https://www.ibm.com/docs/ja/ssw_ibm_i_75/pdf/rzaq9.pdf) 


[***IBM i 7.4 プログラム資料説明書***](https://www.ibm.com/docs/ja/ssw_ibm_i_74/rzaq9/rzaq9.pdf) 

[***IBM i 7.3 プログラム資料説明書***](https://www.ibm.com/docs/ja/ssw_ibm_i_73/rzaq9/rzaq9.pdf) 


## ウェブページのURL？

IBM i 7.5は、、
https://www.ibm.com/docs/ja/i/7.5?topic=users-pdf-file-memorandum

からリンクしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/88ec0280-c77c-c258-1378-07905f30ddd1.png)

上記の　「プログラム資料記述」　からPDFファイルにリンクしています。
※7.5から自動翻訳になり、ときどき間違った？変な？訳語になってる場合がありますね・・・
正しくは「プログラム資料説明書」です。

## (QA) IBM i OS 7.3 から7.4に上げるときは？

A. IBM i 7.3 -> 7.4　と　7.4 -> 7.5 の2つのバージョンの変更点を確認する必要があります。

大昔の話をするとこの辺見ずにバージョンアップしてしまって、上げた後に、あっ、変わってる・・みたいな話もあったわけですが・・(^^;、昨今のサービス概念の定着によって最近はきちんと全部確認する事が大半だと思います。

ページ数は相応にありますが、データベースやIBM提供IBM i OS周辺ソフトウェアの変更点も含む記載なので未導入のソフトウェアなどはスキップする事ができます。

頑張って読み解きましょう。。未然防止の要です。
SQLのバインド変数について

:CompanyCd のようなバインド変数は、SELECT句では使用できない。

【例】:Subで自由に列指定しようとした場合
```ruby:失敗例
SELECT CompanyCd,
 EmployeeNo,
 :SubCd
FROM EmpMaster
WHERE salary > 50000
 AND :SubCd = 'A10' 
```
上記例ではEmpMasterテーブルに同一のコード保持カラムがあればそのままSQL文を使いまわせるという考えだが、エラーとなる。

自分は仕方なく列ごとにSQL文を作りましたが、
これを実現できるような書き方を知っている方がいたらご教授いただきたいです。
(QA) IBM i 初心者向けの（網羅的な）資料サイトはありますか？

主題のご質問をいただきました。

## A. 

### 1.アイマガジン
[保存版「これから使う人のためのIBM i入門ガイド」(全42章)](https://www.imagazine.co.jp/imagazine-7071/)
　※当記事執筆時点で最終更新は2018/08です。そろそろ更新必要かもしれませんね・・

### 2.Qiita

[Qiita : IBM i 初心者向け情報記事一覧](https://qiita.com/ibm_knowledge_mall/items/9ad69f32743a5c0481e4)
 　※当記事の執筆時点で最終更新は2023/09です。