OmniAICreator/Qiita-1.07M huggingface dataset:
我流でExcelのマクロを使えるようになった人がマクロを作る時に考えていること7選

## はじめに
私が2,3年目のころにSEなのにExcel触っている時間の方が長いことと、Excelでの繰り返し系の業務を楽にしたいという思いで何かできないか考えた結果、マクロにたどり着き徐々にツールを作るようになっていくと徐々に案件や社内で「マクロの人」として認知されるようになり教える機会も増えてきてしまった。
しかし、独学でググりながらやっていたので教えられることが正直ない。
とはいえ、何も教えないというのも周りの人的に良い訳がなく、せめて「考え方」位なら教えられるので作る時の考え方を言語化してみた。
そうしたら7個あがったのでとりあえずまとめてみた。
（すべてのケースで7箇条が全部当てはまらない場合もある。あと異論はお待ちしてます。）

## 前提条件
マクロの有効化してない人は以下のページを参考に設定しましょう。

https://sakusaku-office.com/excel/post-16231/

## １．原案は「マクロの記録」で作ろう
一番最初にマクロ書こうとして陥るのが何をどう書いていいか分からなくなることだと思う。
それを防ぐためにも「開発」にある **「マクロの記録」** を選択し、記録している間に想定される動きを手動でやるとマクロ側でスクリプトを組んでくれる。
ここで記録された内容と完全に同じ処理ならそのままでも良いが、実際には参照するセルが違ってたり、何度も同じ処理を実行したりする等一致しないケースの方が殆どなので、マクロの動きや書き方を把握したり最初の原案を作る程度に留めておこう。

※「マクロ記録」の使い方について以下のページを参照。

https://www.sejuku.net/blog/68271


## ２．「１つのセル」でできることは「１つのセル」でやろう
複数のセルを一括で作業をすると参照元／先の行列がズレるなど事故る可能性が高いのと、ゆくゆくは将来他のマクロを作るとなったときに他のマクロへの応用が利きにくくなる。
ある一行をコピーしたいのであれば、多少面倒だがその行をまるっとコピーするのではなく必要な列分セルのコピーを繰り返す方が安全。

## ３．二つ以上のシート／ブックに跨るときはそれぞれ定義しよう
「２」に関連することだが、マクロのセル選択は何も設定していないと「今表示しているシート」で処理をし始める。
例えばシートAの値をシートBに繰り返しコピーする作業をするときに、最初の1回はコピーできているけど2回目以降できていないケースがたまに発生する。
そうならないためにも、繰り返し作業などで複数のシートやブックに跨る作業をするのであれば最初にシート／ブックをそれぞれで定義してから作業するようにしよう。

## ４．ワークシートにリストを作って作業しよう
他の言語であれば配列とかリストとかクラスとか定義してオブジェクトを定義しその中に詰め込んでいくだろうが、Excelの場合何も考えずにシートに必要な中間データやファイルを書き込んでプールしていくことが可能。（ちなみにマクロで配列やクラスを作って対応することも可能だけど、ほぼ必要性がない。）
そのため事前に作業シートを作りそこにリストを作って、マクロ実行時にそこに書き込んだり、参照したりするスタイルにすればいい。

## ５．「テンプレートシート」を作ろう
どんな作業をやるかにもよるけど、outputが固定の場合には「テンプレート」となるシートを作っておいて、作業開始時にテンプレートをコピーしてから作業を始めると作業効率が図れるし、見る側的にも資料ごとに差が出にくくなるから見やすい。

## ６．整数値の変数は「Long型」で定義しよう
他の言語に触れていると **とりあえず「整数＝Int／Integer」** と思うぐらいには浸透していると思うが、VBAの場合は扱える数値の範囲や性能面どちらもで「Long型」が優勢なので「Integer型」を使う必要がない。
※詳しくは以下を参照

https://moripro.net/vba-integer-long/

## ７．コーディング時のエラーを教えてくれることに慣れよう
他の開発ツール同様、行ごとにチェックしてくれるのは非常にありがたいのだが、作業途中で不正な記述があるとすぐさま **モーダルとして** 表示される。
※以下はif文で条件を書いてなくてエラーになっている場合（「OK」押さないと作業再開できない）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640942/c5072ef7-cf95-4f97-99e9-816231e94b75.png)

開発時にざっくり書きたいときに毎回モーダルが表示されるとウザさも感じるのだが、無視する精神か空想のオカンが毎回面倒見てくれているというおおらかな気持ちで作業するようにするといいかも。

## さいごに
我流でExcelのマクロを使えるようになるためによく見てたサイトたちの紹介。

### Office TANAKA
とりあえず **「マクロのこと知りたければココ！」** ってぐらいにマクロの基本的なことが書いてある。

http://officetanaka.net/index.stm

### エクセルの神髄
ここも「Office TANAKA」同様基本的なことから応用技術までそろってるサイト。
「Office TANAKA」かここのどちらかを見れば解決するケースが多い。
また問題集もあるので実践しやすい。
ついでにサイト内でExcelの関数のことも説明してくれているので便利。

https://excel-ubara.com/

### わちょんのゆっくりIT
ExcelのマクロだけでなくExcelの関数の使い方などをゆっくり音声で教えてくれるチャンネル。
「エクセルの神髄」のVBA100本ノックの解説をしているので、文章で分からない人も動画見ればわかるかも。

https://www.youtube.com/@wachi-excel
Azure ADのサービスをAWSで例えてみた

## 前書き
会社でAzureの資格取得が奨励されていて、この波に乗るしかない！勉強に勤しんでおりました。
だいたいのサービスはほとんど同じやん！余裕やん！素敵やん！と思っていました。

しかし、アカウント周りのところがすんなり理解できなかったので、ちょっと本腰入れて
記事にしてみようと思った次第です。

## テナント

一般
> テナント【tenant】 の解説
１ ビルなどの一区画の借り主。
２ 貸店舗。「15の―が3月に一斉オープン」

MS公式
> Azure AD テナントは、組織で使用されるアプリケーションとリソースに ID とアクセス管理 (IAM) 機能を提供します。～(中略)～。
Azure AD テナントは、組織の IT 部門の管理下にある ID セキュリティ境界です。 このセキュリティ境界内では、オブジェクト (ユーザー オブジェクトなど) の管理とテナント全体の設定の構成は、IT 管理者によって制御されます。

組織が少しわかりづらかったのですが、おそらくMSアカウント１つ分を指していると思われます。

テナント配下にあるリソースの権限を与えるものなので、オンプレADでいうところのドメインにあたると思われます。
ただ、Azure ADのテナントには親子関係がなく、すべてのテナントがフラットな関係になっています。




:::note info
配下にあるリソースの権限を与える、という点から、これはAWSでいうと**IAM**に対応していると言えそうです。
:::

## サブスクリプション

一般
> 「サブスク」とは、一定の利用料を支払うことで一定の期間だけ商品やサービスが提供される（利用できる）という方式のサービスまたはビジネスモデルのことである。

MS公式
> サブスクリプション: リソースの論理コンテナー。 各 Azure リソースは、1 つのサブスクリプションだけに関連付けられます。 Azure の導入はサブスクリプションの作成から始まります。

調べてたら[弊社のブログ記事](https://cloud.bigtreetc.com/column/azure_ad_subscription/ )が出てきてびっくり
サブスクリプションはテナントの下位概念で、必ず１つのテナントに紐づくみたい。
１つのテナント下で、料金請求や使用権限などを分割したときに使用する。たとえば、開発環境用のサブスクリプションと本番環境ようのサブスクリプション、みたいに。

:::note info
環境を分離する、という点から、これもまたAWSでいうと**AWSアカウント**に対応していると言えそうです。
:::

AWSに慣れていたので、環境ごとにアカウントを分けるのが当然だと思っていたのですが、Azureではサブスクリプションごとに権限を分けるんでしょうね。

サブスクリプション　＝　AWSアカウント
Azureアカウント（MSアカウント？）　＝　Organizationのマスターアカウント

と考えればしっくりくる気がする。

## ディレクトリ
一般
> ディレクトリ ［directory］
フロッピーやハードディスクの中のファイル情報を管理する概念。また、その部分。

MS公式
> Azure AD ディレクトリ: 
各 Azure AD テナントには、信頼された専用のディレクトリが 1 つ用意されます。 ディレクトリには、テナントのユーザー、グループ、アプリケーションが含まれています。 ディレクトリを使用して、テナント リソースに対する ID とアクセスの管理機能を管理します。 ディレクトリは複数のサブスクリプションに関連付けることができますが、各サブスクリプションが関連付けられるディレクトリは 1 つに限られます。

調べたけど、テナントとほぼ同義、でも厳密には違う、みたいな厄介な用語らしい。
資格対策には細かい違いは必要なさそうなので、いったんディレクトリ＝テナントとして覚えることにします。


## 感想
BTCの記事にもあった通り、Azureは権限周りがちょっと特殊なんですね。ここさえ理解できればほかはAWSと大体一緒な感じがしてます。資格対策をしているあなた！ここさえ乗り越えれば合格はすぐそこです。
【Paizaレベルアップ問題集】標準入力メニュー/半角スペース区切りでの文字列の分割

# Paiza問題集
Pythonで回答

## 標準入力メニュー/半角スペース区切りでの文字列の分割

### Step1 2つの文字列の半角スペース区切りでの分割
```Python
"""
2つの文字列の半角スペース区切りでの分割
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__split_string_step1
"""

# Hello paiza２行で表示
string = 'Hello paiza'

# スペースで区切って2行で表示
str1, str2 = string.split(' ')
print(str1)
print(str2)
```

### Step2 3つの文字列の半角スペース区切りでの分割
```Python
"""
3つの文字列の半角スペース区切りでの分割
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__split_string_step2
"""

string = 'He likes paiza'

# 半角スペースで文字を区切る
str1, str2, str3 = string.split(' ')

# 区切った文字を表示
print(str1)
print(str2)
print(str3)
```

Step3 5つの文字列の半角スペース区切りでの分割
```Python
"""
5つの文字列の半角スペース区切りでの分割
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__split_string_boss
"""

string = 'one two three four five'

# スペースで区切って表示
for i in string.split(' '):
    print(i)
```
pythonでテトリスアート自動実行してみた


### 目次
- 自己紹介
- 取り組み背景
- テトリスアートについて
- 自動化してみました
- まとめ

---
### 自己紹介
・ハンドルネーム: @seigot
・関西在住の社会人
・python歴：3年〜ほど
・Qiita: https://qiita.com/seigot
・GitHub: https://github.com/seigot

・前回: [Qiita記事 テトリスを題材にpythonを学べるツールを作成してみた話2](https://qiita.com/seigot/items/0b42a807217dbe636226)
・前々回: [Qiita記事 テトリスを題材にpythonを学べるツールを作成してみた話](https://qiita.com/seigot/items/0b42a807217dbe636226)

---
### 取り組み背景

- これまで、テトリスを題材にpythonを学べるツールを作成 [過去記事](https://qiita.com/seigot/items/0b42a807217dbe636226)

![スクリーンショット 2023-05-14 23.38.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/114b4817-4038-593f-519d-cab379cf79ec.png)

- テトリス操作を強化学習で自動実行することに成功 [過去記事](https://qiita.com/seigot/items/af3cac69a5272591d4bb)
- 次なるステップ --> 最近テトリスアートが流行っているらしい（？）

---

### テトリスアートについて
- テトリスのブロックを使ってフィールドに模様を描く取り組み
- スコアを競うのではなく、フィールド上に模様をどれだけ正確に再現できるかを競う(?) 
- どうやら自動化できるらしいです   [「テトリスプリンター」アルゴリズム](https://nlab.itmedia.co.jp/nl/articles/1306/05/news133.html)  

<blockquote class="twitter-tweet"><p lang="qme" dir="ltr"><a href="https://twitter.com/hashtag/%E3%83%86%E3%83%88%E3%83%AA%E3%82%B9%E3%82%A2%E3%83%BC%E3%83%88?src=hash&amp;ref_src=twsrc%5Etfw">#テトリスアート</a> <a href="https://t.co/ORXDzaOjOq">pic.twitter.com/ORXDzaOjOq</a></p>&mdash; くうはく (@kuuhaku1240) <a href="https://twitter.com/kuuhaku1240/status/1657244076402671616?ref_src=twsrc%5Etfw">May 13, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


---
### 自動化してみました

せっかくなのでクイズ形式でお届け

Q.何の模様でしょうか

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">example <a href="https://t.co/Zl5ABy3Jhd">pic.twitter.com/Zl5ABy3Jhd</a></p>&mdash; seigot (@st17890027) <a href="https://twitter.com/st17890027/status/1657758344323665920?ref_src=twsrc%5Etfw">May 14, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

---

### まとめ
- テトリスアートを自動実行してみました
- ものが動くと面白い、自動化がアツい、もっと複雑な模様も作成してみたい
- よろしければQiita記事いいねお願いします(>人<)

---

### 参考

[どんなドット絵もテトリスで描ける「テトリスプリンター」アルゴリズム](https://nlab.itmedia.co.jp/nl/articles/1306/05/news133.html)  
[テトリスを題材にpythonを学べるツールを作成してみた話](https://qiita.com/seigot/items/0b42a807217dbe636226)  
[テトリスを題材にpythonを学べるツールを作成してみた話2](https://qiita.com/seigot/items/e16e9d8f6fc04853855f)
[pythonでテトリスの大会をやってみた！（継続していく予定）](https://qiita.com/seigot/items/af3cac69a5272591d4bb)
Jupyter bookでビルド時にコードを実行する方法

# Jupyter bookでビルド時にコードを実行する方法
JupyterBookを用いてGithub-Pagesでウェブサイトを公開する際に、Markdownファイルに記述したコードを実行し結果も表示するようにする方法を紹介します。

## Jupytextをpipする

```
pip install jupytext
```

でjupytextをインストールしましょう．

## MarkdownファイルをMyst Markdownファイルに変換する
Jupyter BookにはMarkdownファイルを MystMarkdownファイルに変換する機能が備わっています。
以下のkernelnameをpython3 または julia-1.8に置き換えて以下のコードを実行することでkernel言語で書かれたコードを実行できるようにします。

```
jupyter-book myst init 変換するMarkdownファイル.md --kernel kernelname
```

これを実行すると、mdファイルの上部に


jupytext:
  cell_metadata_filter: -all
  formats: md:myst
  text_representation:
    extension: .md
    format_name: myst
    format_version: 0.13
    jupytext_version: 1.14.5
kernelspec:
  display_name: Python 3 (ipykernel)
  language: python
  name: python3


といったものが追加されます(上はpythonの場合)


## 実行したいコードを{code-cell}内に書く

Markdownファイルに実行したいコードを書きます。その際、

![cell.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652252/91949211-2b9b-8c94-ffa1-c885b10aa719.png)


とすることでJupyterBookのbuild時に勝手に実行してくれるようになります。

以下は自分のサイトですが、実例です。

https://syunpeta.github.io/math2.html


以上です。
【初心者向け】JavaでShift JISからUTF-8へ！ディレクトリ全体を一括変換する方法

こんにちは！JavaでShift JISからUTF-8へ、ディレクトリ全体を一括で変換する方法をご紹介します。それでは、手順について見ていきましょう。

#### 1. まずはコードの準備
既にご用意のあるコードをコンパイルして実行するだけで、ディレクトリ全体の文字コードを一括変換できます。私が用意したコードは以下の通りです。
※安全のために、Javaファイルのみ対象です



```java:convert.java
package convert;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.io.IOException;

public class main {
    public static void main(String[] args) {
        if (args.length == 0) {
            System.out.println("エンコードしたいファイルが存在するディレクトリのパスを指定してください.");
            return;
        }

        // コマンドライン引数からエンコードしたいファイルが存在するディレクトリのパスを取得
        String targetDirPath = args[0];

        try {
            Files.walk(Paths.get(targetDirPath))
                .filter(Files::isRegularFile)
                .filter(path -> path.toString().endsWith(".java"))
                .filter(path -> !path.toString().endsWith("_bak.java")) // ファイル名の末尾に _bak があるファイルは対象外とする
                .forEach(main::processFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void processFile(Path path) {
        try {
            // SJISでファイルを読み込む
            String data = new String(Files.readAllBytes(path), "MS932");

            // バックアップファイルのパス（元のファイル名に _bak を追加）
            String backupPath = path.toString().replace(".java", "_bak.java");
            Files.copy(path, Paths.get(backupPath));

            // 出力先パス（同じファイルに上書き）
            String outputPath = path.toString();

            // ファイル出力（UTF-8)
            try (FileOutputStream fos = new FileOutputStream(outputPath);
                 BufferedOutputStream bos = new BufferedOutputStream(fos);
                 OutputStreamWriter osw = new OutputStreamWriter(bos, "UTF-8")) {

                osw.write(data);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

#### 2. 使い方：Step by Stepで解説！
では、このコードをどのように使うのか、具体的な手順を見ていきましょう。

Step 1: 新規フォルダの作成
まず、新規のフォルダを作成します。この例では、フォルダ名を「convert」にします。

Step 2: テキストファイルの作成
新規フォルダ内にテキストファイル（main.javaとします）を作成し、上記のコードをコピーします。

Step 3: コマンドラインから対象のパスに移動
次に、コマンドプロンプト（Windowsの場合）またはターミナル（macOSの場合）を開き、以下のコマンドを実行します。 
```
cd 該当のフォルダのパス
```
Step 4: コンパイル
以下のコマンドでJavaファイルをコンパイルします。
```
javac -encoding UTF-8 main.java
```
Step 5: フォルダの移動
コンパイル後、一つ上のフォルダに移動します。

```
cd ../
```
Step 6: 実行
最後に、以下のコマンドを実行します。

```
java convert.main "変更したいフォルダのパス"
```

#### 3. 結果：変換成功！
この手順を踏むことで、指定したディレクトリ内の全てのファイルがUTF-8に変換されます。元のファイルは「_bak」がついてバックアップされるので、安心して操作できます。

#### 4. なぜこのツールを作ったのか？
それは、教科書のサンプルがShift JISで書かれていて、その度に変換するのが手間だったからです。このツールを使用すれば、手間なく一括でShift JISからUTF-8へと文字コードを変換できます。これで、あなたも文字コードの問題に悩まされることなく、よりスムーズにコーディングに集中できるでしょう！

以上、JavaでShift JISからUTF-8へ、ディレクトリ全体を一括で変換する方法のご紹介でした。このツールが皆さんのプログラミングライフを少しでも楽にする手助けになれば幸いです。何か問題や疑問があれば、お気軽にコメント欄からお知らせください。
HackerRank - The Coin Change Problem Solutions in PHP

# はじめに

こんにちは！！！
ミャンマー人エンジニアのピェッピョーアウンです。

今回はHackerRankのThe Coin Change Problemを再帰的関数を利用して実装してみました！
皆さんにとって、参考になると嬉しいです。

# The Coin Change Problem

通貨両替問題とはさまざまな通貨を利用して、与えられた金額に対して、両替できる方法の数を計算する問題になります。
皆さんがわかるようにいくつか例をピックアップしてきました。
詳細は[The Coin Change Problem][link-1]にてご確認ください。

例１：

入力: 両替する合計金額 n = 4, 通過 coins[] = {1,2,3}, 
出力: 4
説明: 両替できる方法: {1, 1, 1, 1}, {1, 1, 2}, {2, 2}, {1, 3}

例２：
入力: 両替する合計金額 n = 10, 通過 coins[] = {2, 5, 3, 6}
出力: 5
説明: 両替できる方法: 
{2,2,2,2,2}, {2,2,3,3}, {2,2,6}, {2,3,5}, {5,5}

# 再帰的アプローチ
この問題はDynamic Programmingの中でも2-D配列を使った考え方とメモリのスペースを最適化した1-D配列 といったたくさんの解決方法がありますが今回は再起的なアプローチで解決していきます。

![coin_change_problem_recursive.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545454/3819dc42-1689-4b78-6485-c754f8f6c704.png)

疑似コードとして
1. コインには、① 含めるか、②除外するかの２つの選択肢があります。
2. 左側：含めるときは、count(coins, n, sum – coins[n-1])
3. 右側：除外するときは、count(coins, n-1, sum)
3. 最後の数は両方を足算した結果：count(coins, n, sum – coins[n-1] ) + count(coins, n-1, sum )

という感じです。

上記の疑似コードをPHPで書いてみました。

```php

function coun($coins, $n, $sum) {
    if ($sum == 0)
        return 1;
    
    if ($sum < 0)
        return 0;

    if ($n <= 0)
        return 0;

    return coun($coins, $n - 1,$sum ) +
           coun($coins, $n, $sum - $coins[$n - 1] );

}

$fptr = fopen(getenv("OUTPUT_PATH"), "w");
$first_multiple_input = explode(' ', rtrim(fgets(STDIN)));
$n = intval($first_multiple_input[0]);
$m = intval($first_multiple_input[1]);
$c_temp = rtrim(fgets(STDIN));
$c = array_map('intval', preg_split('/ /', $c_temp, -1, PREG_SPLIT_NO_EMPTY));
$ways = coun($c, count($c), $n);
fwrite($fptr, $ways . "\n");
fclose($fptr);

```

# 再帰的アプローチの感想

再帰的アプローチはあくまでたくさんの方法の中の一つの解決方法です。個人的な意見として重複したサブ問題をたくさん計算しなければならないので効率的にはベストとは言えないです。考え方がシンプルで分かりさすさがあるのが再起的なアプローチのメリットになります。
この記事を読んで何かお役立ちできると嬉しいです！
最後まで読んでいただき、ありがとうございました。

[link-1]: https://www.hackerrank.com/challenges/coin-change/problem
「/etc/samba/smb.conf」・・・[global]セクションで使用される全般設定に関わる主な設定項目

●Sambaの設定ファイル「/etc/samba/smb.conf」には3つの特別なセクションである[global]、[homes]、[printers]セクションと、個々の共有の設定を行う任意の名前のセクションがある。


●[global]セクションで使用される全般設定に関わる主な設定項目

・workgroup=ワークグループ名　所属するワークグループを指定
・server string=文字列　ブラウジングの際に表示されるサーバの説明
・netbios name=NetBIOS名　SambaサーバのNetBIOS名を指定
・browseable=yes|no　ブラウジングの際に表示するかどうかの設定。表示されていなくてもアクセスは可能
・wins support=yes|no　SambaサーバをWINSサーバとして動作させるかどうかの設定
・wins server=IPアドレス　WINSサーバが存在する場合、IPアドレスを指定
・hide dot files=yes|no　「.」で始まるファイルを隠すかどうかを指定
・logon script=スクリプトファイル名　ログオン後に実行されるスクリプトを指定


※「browseable」と「hide dot files」は他のセクションでも使用可能。[global]セクションに書かれた設定内容はデフォルトの値として扱われます。
DynamoDbException: Conditions can be of length 1 or 2 only の対応方法


DynamoDBのQuery オペレーションでデータ取得をした時に以下のエラーが発生されました。
```
DynamoDbException: Conditions can be of length 1 or 2 only
```

<b>Dynamodb名 :  stock_details

<table>
<tr>
  <td> <b>列名</td>
  <td><b>Key</td>
  <td><b>型</td>
</tr>
<tr>
  <td>item_id</td>
  <td>PK</td>
  <td>String</td>
</tr>
<tr>
  <td>type</td>
  <td>SK</td>
  <td>String</td>
</tr>
<tr>
  <td>deliver_flag</td>
  <td></td>
  <td>Boolean</td>
</tr>
<tr>
  <td>content</td>
  <td></td>
  <td>String</td>
</tr>
<tr>
  <td>item_nm</td>
  <td></td>
  <td>String</td>
</tr>
<tr>
  <td>ins_ts</td>
  <td></td>
  <td>Number</td>
</tr>
<tr>
  <td>upd_ts</td>
  <td></td>
  <td>Number</td>
</tr>
</table>



<b>取得コード：
```
dynamo_db = Aws::DynamoDB::Client.new(
        access_key_id: 'aws_key',
        secret_access_key:'aws_secret',
        region: 'aws_region'
      )
options = {
  key_condition_expression: "item_id = :item_id AND type = :type AND deliver_flag = :deliver_flag",
  limit: 30,
  scan_index_forward: false,
  expression_attribute_values: {
  ':item_id' => '32381234562',
  ':type' => '101',
  ':deliver_flag' => false,
  },
  table_name: 'stock_details'
}
dynamo_db.query(options)
```
実行すると以下の例外が発生される
    <b>DynamoDbException: Conditions can be of length 1 or 2 onlyが発生される

DynamoDBの仕様で調べました。原因は「KeyConditionExpression」に「PK」　と 「SK」以外は利用できないことがわかりました。
↓
検索条件を指定するには、キー条件式 (テーブルまたはインデックスから読み取る項目を決定する文字列) を使用します。
等価条件としてパーティションキーの名前と値を指定する必要があります。キー条件式では、非キー属性を使用することはできません。

【DynamoDB資料リンク】
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Query.html

Queryの結果から絞り込みが必要な場合は「filter_expression」を使って絞り込みできます。
↓
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Query.html#Query.FilterExpression






修正後：
```
dynamo_db = Aws::DynamoDB::Client.new(
        access_key_id: 'aws_key',
        secret_access_key:'aws_secret',
        region: 'aws_region'
      )

options = {
  key_condition_expression: "item_id = :item_id AND type = :type",
  filter_expression: "deliver_flag = :deliver_flag ",
  limit: 30,
  scan_index_forward: false,
  expression_attribute_values: {
  ':item_id' => '32381234562',
  ':type' => '1',
  ':deliver_flag' => false,
  },
  table_name: 'stock_details'
}
result = dynamo_db.query(options)
puts "Search Result : #{result}"
```
【実行結果：】
```
Search Result : {:items=>[{"item_id"=>"32381234562", "ins_ut"=>0.167534e10, "type"=>"1", "deliver_flag"=>false, "content"=>"test content", "item_nm"=>"desk"}], :count=>1, :scanned_count=>1, :last_evaluated_key=>nil, :consumed_capacity=>nil}
```
Databricks ノートブックにて Markdown 形式の文字列を整形して表示する方法

## 概要
Databricks ノートブックにて Markdown 形式の文字列を整形して表示する方法を共有します。`IPython.display`の`Markdown`メソッドと Databricks 標準の`display`を利用することで、整形して表示してくれるようです。本記事ではその検証結果を共有します。

```sql
from IPython.display import Markdown
 
display(Markdown(md_sample))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6df7f1a7-f7e0-e8f6-e97c-1d117d3b0ccf.png)

Markdown 形式の文字列のサンプルとしては、Databricks のドキュメントに記載されている文字列を利用します。

~~~markdown
# Header 1
## Header 2

**bold text**

*italics text*

~~strikethrough text~~

`monospace text`

---

> Block quote

Ordered list:
1. Item 1
1. Item 2
1. Item 3

Unordered list:
- Item a
- Item b
- Item c

```
def my_function():
    return my_value
```

[Link](https://www.markdownguide.org/cheat-sheet/#basic-syntax)
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/162b7a1b-2642-bea2-846c-f3f828f16618.png)

引用元：[Document data with markdown comments | Databricks on AWS](https://docs.databricks.com/data/markdown-data-comments.html#example-of-supported-markdown-documentation)

## 0. 事前準備

### 0-1. 表示する項目を変更にセット

~~~python
md_sample = """
# Header 1
## Header 2
 
**bold text**
 
*italics text*
 
~~strikethrough text~~
 
`monospace text`
 
---
 
> Block quote
 
Ordered list:
1. Item 1
1. Item 2
1. Item 3
 
Unordered list:
- Item a
- Item b
- Item c
 
```
def my_function():
    return my_value
```
 
[Link](https://www.markdownguide.org/cheat-sheet/#basic-syntax)
"""
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c6350407-1860-57a5-6510-4f43ffe50d59.png)


## 1. Markdown 文字列をそのまま表示

### 1-1. print 関数で表示

整形されていないことを確認。

~~~python
print(md_sample)
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5a59b6ff-b8f6-accb-f7f9-17a8daca8c96.png)

### 1-2. display 関数で表示

整形されていないことを確認。

~~~python
display(md_sample)
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6beee733-8c1e-21ce-de96-b27cbb783169.png)

### 1-3. displayHTML 関数で表示

整形されていないことを確認。

~~~python
displayHTML(md_sample)
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6fa2d2b7-915d-a255-2461-77665c28fdb7.png)

## 2. `IPython.display`の`Markdown`メソッドを利用

### 2-1. Markdown 形式の文字列の変数を表示

想定通りに整形されて表示される。

~~~python
from IPython.display import Markdown

display(Markdown(md_sample))
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/65e0a19e-e6f0-013c-6b94-9fdf48b581ba.png)


### 2-2. dbfs 上にある Markdows ファイルを表示

想定通りに整形されて表示される。

~~~python
path_to_md = "dbfs:/databricks-datasets/tpch/README.md"
 
display(Markdown(dbutils.fs.head(path_to_md)))
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b306c9a0-7e8e-8323-8104-b4b2dc640ce7.png)
NoMethodErrorに対応する

## 初めに...

未経験エンジニアのぐっちと申します。
エンジニアになれるか不安ですが、とりあえず行動あるのみということで
初回は勉強中のRubyonRailsのNoMethodErrorについて書きたいと思います!!!:fist:

## この記事を書いた理由

RubyonRailsを勉強してきて、サンプルやポートフォリオ作成時にエラーに苦しみ
もっと成長する為にQiitaに挑戦しようと思いました。
また、下記の記事を参考にしました。

https://qiita.com/Katu_any/items/80797dfdc3ba175332f0

## 環境について
Rails 6.1.7.3

## NoMethodError が起きた時
最初にエラー内容と原因ですが、こちらの記事を参考に。

https://qiita.com/okamoto_ryo/items/843bb818f40ae0ad7400

今回は+αで自分がNomethodErrorが起きた時、どう対応しているかを書きたいと思います。

①まずエラー箇所をよく読み、落ち着いて内容を理解する。
(undefined method 〜 nil:NilClass は友達)

個人的にメソッド前のインスタンス変数が上手く設定出来ておらず発生する経験が多いです...

②エラー箇所と関係しているコントローラーのアクションコードを見て、間違いがないか確認する。
・自分が対象のviewファイルで表記したいインスタンス変数を定義出来ているか
・スペルミスがないか(controllerとview)
・単数形と複数形を間違えていないか
・if分を含んでいる場合、ifとelse両方にインスタンス変数を定義出来ているか

③ModelやDBのSchema.rbを確認する
※レアなパターンですが、
　実装中にたまたまModelファイルにカーソルが移りうっかり一部の記述を削除したり
　そもそも必要なカラムが思い込みで設定出来ていなかったこともありました。:sob:

短いですが、とりあえずこんな流れで取り組むように努力しています。
また、今後気づいたことがあれば修正したいと思います。

最後まで読んでくれた方、ありがとうございました。
Swiftの_modify {}, _read {}について調べた

TCAのソースコードを眺めていた際にこのような書き方を見つけました。

```Swift
  fileprivate var path: PathView {
    _read { yield PathView(base: self) }
    _modify {
      var path = PathView(base: self)
      yield &path
      self = path.base
    }
    set { self = newValue.base }
  }
```
subscriptやcomputed propertyではget, setアクセッサが使用可能でしたが、_read, _modifyというものを見つけ詳しく調べてみることにしました。

# 調べた結果
どうやらgetやsetは以下のコードのようにコピーが発生してしまうらしく、パフォーマンスが重要な場面ではこれらのアクセッサは有用ではないとのこと。

```Swift
var numbers = [1, 2, 3]
let hoge = numbers[2] * 2 // getから値がcopyされてくる
numbers[0] = hoge * hoge // setに渡す際に値がcopyされる
```

基本的な_readと_modifyの動作はgetとsetとほぼ同じみたいです。
```Swift
var _x = 1

var x: Int {
    _read { yield _x }
    _modify { yield &_x }
}

print(x) // 1
x += 2
print(x) // 3
```
xに変更を加えると、_modifyが呼び出され、_xへのmutableな参照が取得されます。
yieldキーワードは呼び出し元へ処理を戻すために使用され、呼び出し側は取得した_xの参照で任意の変更を加えることができます(この例では+=を呼び出し変更を加えている)。
変更が終了したときに処理が_modifyに戻される、という流れです。
このように_modifyを使うことによって無駄なコピーを防ぎ、追加の記憶領域を使用することなく(in-place)値を変異させることができるようです。
めっちゃ難しいですね。
普段プログラムを書いててこの恩恵を受けることはほぼないと思いますが、標準ライブラリでは広く使われているらしく、Swiftを支える重要な概念となっています。

# 参考
https://github.com/apple/swift/blob/main/docs/OwnershipManifesto.md#generalized-accessors

https://stackoverflow.com/questions/56426696/when-is-the-modify-method-of-a-computed-property-called-and-what-does-it-do

https://trycombine.com/posts/swift-read-modify-coroutines/

https://speakerdeck.com/hokuron/generalized-accessors
D/A変換　基本情報

# 学習前
デジタルの計算問題か、、？
よくわからない

# D/A変換
デジタル→アナログへ変換する。
基本情報での出題イメージはこちら。

https://www.fe-siken.com/kakomon/25_aki/q22.html

# 学習しての感想
計算問題の解説が分かるようなわからないような、、
しっくりこない
【個人開発】LINE BOT x GPT4 x Wolfram 学習アプリ ~ 宿題モードの追加

こんばんは、ぽ〜さんです。

「ぽ〜さんのお勉強アプリ」をリリース後、徐々に使っていただいている方も増えております。

https://qiita.com/bizposan/items/60f4b627b8afd71974b6

ありがとうございます。
まだの方はぜひこちらからお友だち登録してください。もちろん無償です。

<a href="https://lin.ee/TrVQV1C"><img src="https://scdn.line-apps.com/n/line_add_friends/btn/ja.png" alt="友だち追加" height="36" border="0"></a>

## これまでの機能まとめ
こちら宿題アプリで実現している機能です。

* 問題分をOCR読み込み（Mathpixを利用）
* 数式を含む問題分の場合には、Wolfram Alpha経由で解答を取得する
* Wolfram Alpha経由の場合は、Promptで　問題文と解答をGPTに与え、解説を生成させる

この3点目により、GPTは苦手な数学の解答ではなく、得意な、「順序だった説明」の役割を担います。
また、Wolfram Language に翻訳する部分もGPTが担ってます。

要はGPTなので、Wolframがわからないところは、GPTが ”GPTなり” に答えてくれます。

# Wolframとは

http://www.suri-joshi.jp/enjoy/wolfram-alpha/

日本ではまだまだ知られてませんが、自然科学ならなんでもござれの強者です。

>構造化されたデータを使って計算し答えを返す質問応答システムです。科学者であれば知らない人はいないMathematica （数式>処理システム）を開発したWolfram 社が提供しています。アメリカの多くの中高生がWolfram Alphaを自宅学習に利用しています

# 画面

Wolframはリッチに数式をグラフ化できたりするので、GPTでは、出来得ない画像が表示できたりします。
HTML化してLINEでは送付してます。

この生成の過程で Flex messenger の仕様に詳しくなりました。

###  参考画像

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356879/2fb3aee1-d305-e63b-b1bf-46a13e402fab.jpeg">

# 追加機能　- 宿題モード
今回は、GPTの生成能力をより生かして、【宿題モード】を追加してみました。
宿題モードは、「Wolfram alphaの答えがあった場合のみ」の限定モードです。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356879/b23eb9ac-40f3-f4d0-b08b-01429b967a18.jpeg">

### Prompt上の考慮
* 送付された問題の”勉強させようとしている内容＝二次方程式の因数分解であるなど、をGPTに把握さる
* その上で、追加の問題を生成させる
* 以降は解説生成まで同じプロセス
* 宿題のおかわりが可能　
→ 永遠に問題を解き続けることが可能

Promptがまだ未熟で、ほぼ連立方程式だとほぼ係数部分を置き換えただけの問題になるので、Promptをいろいろ追加調整は必要そうです。

# まとめと課題

宿題モードは、Promptの調整によって、計算ドリルを不要としてしまう可能性を感じます。

### 課題
GPT4をToken多めに贅沢に使っているので、とにかく反応が遅い。
120秒以上かかることも平気であります。もちろんHerokuはTime outしています。

ぽ〜さんは「Code Stranger」なので、コードの冗長部分の最適化や、非同期処理
（ただLINE messangerには公式の非同期処理はないらしい？）までいくと、技術力不足に直面します。

このあたりが今後の課題で要調査です。

#開発環境 
```
Python
LINE messenger API
Mac
Heroku
LINE messenger API
Wolfram API
Mathpix API
Open AI 
```
phpでページを再読み込みでデータ登録されない方法

# リロードした際の再処理を防ぐ方法


```言語名:php
//登録ボタンが押されたら入る処理
if(isset($_POST["submitButton"])){
    //insertクエリでDBに内容を登録する処理
    $stmt = $db->prepare('INSERT INTO `table` (`username`, `comment`, `postDate`) 
            VALUES (:username, :comment, :postDate)');
    
    header('Location: ' . $_SERVER['PHP_SELF']);//これを足す
}
```

このような処理があったとしてリロードするとなぜかsubmitButtonの値が見た目上何も入っていない状態でも内部的に値が残っているようで再びinsert文が走ってしまいます
解決策として
header('Location: ' . $_SERVER['PHP_SELF']);
を上部の位置に足すと再処理されないようになるようです。
[Flutter]ThemeData classを使ったカラー設定

Flutterでアプリを開発する際のカラーの設定方法についてご紹介します！

# ThemeData Class

ThemeData Classは、MaterialAppやウィジェットツリーの全体的なビジュアルテーマを定義するクラスです。

ちなみにMaterialAppとは、FlutterでMaterial Designを実装するアプリケーションに必要な複数のウィジェットを包含する便利なウィジェットです。home、routes、themeなどのプロパティを持ち、ナビゲーション、テーマ設定などの機能を提供します。

MaterialAppのthemeプロパティにThemeDataを使うことで、アプリ全体で一貫したカラーを使うことができます。以下はコード例です。

## コード例

```
/// main.dart

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'My Flutter App',
      theme: ThemeData(
        primarySwatch: Colors.green, // ここで色を変更する
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Home Page'),
      ),
      body: const Center(
        child: Text('Hello, World!'),
      ),
    );
  }
}
```

flutterのmain.dartファイルにMyAppクラスを作成し、そこでMaterialApp()を使用しています。MaterialApp()内のthemeプロパティにThemeData()を指定し、primarySwatch: Colors.greenとすることで色を緑色にしました。


primarySwatchは、ThemeDataクラスのプロパティの一つで、アプリケーションのプライマリカラーとその派生色を定義します。

primarySwatchで設定された色は、アプリケーションの主要な部分、例えばツールバーやFloating Action Button(FAB)の色を決定します。


```
@override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'My Flutter App',
      theme: ThemeData(
        primarySwatch: Colors.green, // ここで色を変更する
      ),
      home: const MyHomePage(),
    );
  }
}
```
  
![image32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364582/47975c61-5dff-1993-ef02-9a0ba6e611bc.png)

例えばこの画面にFABを追加してみると

```
class MyHomePage extends StatelessWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Home Page'),
      ),
      body: const Center(
        child: Text('Hello, World!'),
      ),
      floatingActionButton: FloatingActionButton( /// 追加
        onPressed: () {},
        backgroundColor: Theme.of(context).primaryColor,
        child: const Icon(Icons.add),
      ),
    );
  }
}
```
右下のFABの色が同じく緑色に変わっています。

![image33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364582/7602684b-9a9c-4565-1277-c9053cee87d4.png)




また、ThemeDataでは他にもプロパティを指定することで、例えばbrightness: Brightness.darkでダークモードにしたり、テキストの色を変更したりすることも可能です。
```
@override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'My Flutter App',
      theme: ThemeData(
        primarySwatch: Colors.green,
        brightness: Brightness.dark, ///追加
        textTheme: const TextTheme(
          bodyText2: TextStyle(color: Colors.purple),
        ),
      ),
      home: const MyHomePage(),
    );
  }
```


# まとめ

上記のように、ThemeData Classを使えば簡単にFlutterアプリ全体のカラー等を変更できるのでとても便利です！
GPUとは

# 学習前
確か画像処理を担当するやつ、、、
# GPUとは
Grahical Processing Unitの略。
「画像処理のための演算を高速に行うプロセッサ」のこと。

優れている点は以下。
・複数のタスクを一度のこなせるので、並列処理が得意。
・CPUの10倍から100倍以上の計算速度がある。（※単純処理が得意）
・行列演算を高速に実行できる。

試験での出題は以下のような感じ

https://www.itpassportsiken.com/kakomon/28_aki/q58.html

https://www.ap-siken.com/kakomon/03_haru/q10.html

より詳しく知りたい人はこちら

https://www.youtube.com/watch?v=YWgvxqw3JWY

https://www.ntt.com/business/sdpf/knowledge/archive_05.html

# CPUとは何が違うの？
CPU：複雑な処理が得意。
GPU：単純な処理が得意。

# 感想
画像処理が得意なのに加えて、GPUは単純な処理が得意で、並列処理が得意ということを新たに知れた。
【Mac】ファイルの文字コードを確認する方法

## ファイルの文字コードを確認するコマンド

次のいずれかのコマンドで文字コードを確認できます。

### `file -I`
```terminal
file -I /path/to/file
```

```terminal
$ file -I sample.txt
sample.txt: text/plain; charset=utf-8
```

### `file --mime`
```terminal
file --mime /path/to/file
```

```terminal
$ file --mime sample.txt
sample.txt: text/plain; charset=utf-8
```

### `file --mime-encoding`

```terminal
file --mime-encoding /path/to/file
```

```terminal
$ file --mime-encoding sample.txt
sample.txt: utf-8
```
SSH公開鍵と秘密鍵の作成方法

# SSH公開鍵と秘密鍵の作成方法

## 必要なソフトウェア

- Git Bash

  Git BashはWindowsで使えるUNIXコマンドライン環境です。Git Bashをインストールしていない場合は、以下のURLからダウンロードしてインストールしてください。

  [ダウンロードリンク](https://gitforwindows.org/)

## 公開鍵と秘密鍵の作成手順

1. Git Bashを開きます。

2. 次のコマンドを入力して、鍵のペアを生成します。ここで`your_email@example.com`はあなたのメールアドレスに置き換えてください。

    ```bash
    $ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
    ```
3. プロンプトが表示されたら、Enterキーを押してデフォルトの場所にキーファイルを保存します。
    ```bash
    > Enter a file in which to save the key (/c/Users/you/.ssh/id_rsa):[Press enter]
    ```
4. 次にパスフレーズを設定します。パスフレーズは空でも大丈夫ですが、セキュリティを強化するために設定することを推奨します。
    ```bash
    > Enter passphrase (empty for no passphrase): [Type a passphrase]
    > Enter same passphrase again: [Type passphrase again]
    ```
これで、~/.ssh/id_rsa（秘密鍵）と~/.ssh/id_rsa.pub（公開鍵）の二つの鍵が作成されます。
Visualforce　標準コントローラの拡張とカスタムコントローラどちらにするときに考慮したいこと

標準コントローラの拡張とカスタムコントローラのどちらにするを悩むとき、
考えてほしいのはその成果物は誰が、何をどの画面でどのように使うことです。

**①まず標準コントローラの拡張とカスタムコントローラの一番違いは実行モードが違います。**

カスタムコントローラはシステムモードで実行されます。そのためカスタムコントローラを指定した場合は、現在のユーザの権限と項目レベルのセキュリティが適用されせん。
拡張コントローラで標準コントローラを拡張した場合、ユーザモードで実行され、現在のユーザの権限、項目レベルのセキュリティ、および共有ルールが適用されます。

※ただし、クラスの定義で with sharing キーワードを使用することによって、ユーザの組織全体のデフォルト、ロール階層、および共有ルールを適用するかどうかを選択できます。
参照ヘルプ：
https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_controller_def.htm

**②salesforceの標準の機能を使いたいときは標準コントローラの拡張をお勧めします。**
例えば：リストビュー画面でVFページを載せる場合、StandardSetController クラスのgetSelected()メソッドを使うと、選択されている sObject のリストを返すので、とても便利な機能です。
ほかに便利なメソッドは下記のURLを参照してください。
参照ヘルプ：
https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/apex_ApexPages_StandardSetController_methods.htm

**③基本的に別のオブジェクトのレコードベースで作りたいものがなければ、標準コントローラの拡張でも大丈夫です。**

今のところは以上の三点を要約しましたが、今後ほかの違うところに気づいたら、その都度追伸で記載します。
My GitHub post

* [📘 How to use](https://zenn.dev/zenn/articles/zenn-cli-guide)
# Zenn
Zennとの連携リポジトリです。

記事を書く際にはcodespaceを立ち上げてください
新しい記事を作成するためにコマンドを入力します
```
npx zenn new:article
```
Chromium版EdgeでIEモードを使う際の注意点

Chromium版EdgeのIEモードを使用して、IE専用のイントラのWebアプリケーションを表示していると、人によって、もしくは端末によって、表示や動きに違いがありました。あるWebアプリケーションのページを表示する際、ある人のEdgeではIE11で描画されるのに対して、私のEdgeではIE7として描画されました。調べてみると、人/端末によって、互換表示するIEバージョンが異なっているようです。この動作の差異について調べてみました。

## 前提

本記事は、Windows10/11において、Chromium版Edgeを使用していることを前提としています。

## ポイント

Chromium版EdgeのIEモードにおいて、ページ描画時に使用するIEのバージョンには、Edgeの「IEモード」とIE11の「互換表示設定」が関連する。

## Edgeの「IEモード」

Edgeの「IEモード」を有効にする方法はいくつかあります。

- 一つは、Edgeのメニューから「設定など」＞「Internet Explorerモードで再読み込みする」を実行する方法です。
- 別の方法としては、Edgeのメニューから「設定など」＞「設定」を開き、「既定のブラウザー」で、「Internet Explorer の互換性」に設定を行う方法があります。
- また、エンタープライズサイトリストマネージャーで、対象サイトを登録する方法もあります。

Edgeの「IEモード」を有効にすると、ページの描画には、IE11のエンジンが使われます。IE11のエンジンでは、基本的にはIE11として動作しますが、IE11の「互換表示設定」が有効な場合は、IEの11～5を自動判定して動作することがあります。

エンタープライズサイトリストマネージャーでは、「互換モード」として、「既定のモード」やIE11～5を選択できます。

ちなみに、IEモードで開発者ツールを使うには、IEChooser.exeを使うことができます。実行パスは「C:\Windows\System32\F12\IEChooser.exe」です。

## IE11の「互換表示設定」

IE11の「互換表示設定」が有効な場合、IEの設定やWebページの内容によって、IE11, IE7, IE5あたりを自動判定して動作することがあります。ただし、詳細な条件は煩雑そうで詳しくは調べていないです。

IE11の「互換表示設定」を参照/変更するためには、IEを起動する必要がありますが、私の環境ではスタートメニューなどにIEが表示されませんでした。その場合は、コマンドプロンプトや「ファイル名を指定して実行」から次のコマンドを実行することで、IEを起動して設定することができます。この起動方法は、下記参考サイトに載っていました。

```bat
rem IEを起動するコマンド
rem 「bing」部分は変更可能だが、何かしら記述する必要がある。
iexplore bing -embedding
```

上記では上手くIE起動できないこともありました。その場合は、PowerShellで次のコマンドを実行してIE起動できましｔ

```powershell
$objIE = new-object -com InternetExplorer.Application
$objIE.visible=$true
```

以上のように、Edgeの「IEモード」とIE11の「互換表示設定」は、ページの描画に大きな影響を与えることが分かりました。正しく設定することで、Webアプリケーションをスムーズに表示することができます。しかし、設定が間違っている場合は、表示や動作に不具合が生じる可能性があります。

## 参考サイト

- [Edgeの「IEモード」を、サポートが終了するIE代わりに使う方法：Tech TIPS - ＠IT](https://atmarkit.itmedia.co.jp/ait/articles/2009/02/news022.html)
- [Microsoft Edge内の「IEモード」トラブルシューティング：Tech TIPS - ＠IT](https://atmarkit.itmedia.co.jp/ait/articles/2009/16/news025.html)
【備忘録】VScodeにてDjangoのmanage.py runserver を実行するタスクの書き方

【備忘録】VScodeにてDjangoのmanage.py runserver を実行するタスクの書き方
とりあえず動いたのでメモ

```json:tasks.json
{
    "tasks": [
        {
            "label": "Django runserver",
            "type": "shell",
            "command": "${command:python.interpreterPath}",
            "args": [
                "manage.py",
                "runserver",
                "--noreload",
                "--nothreading"
            ],
            "problemMatcher": [],
            "options": {
                "cwd": "${workspaceFolder}",
            },
        },
    ]
}
```
[Linux] tracerouteのオプションごとにパケットキャプチャした

## この記事は

Linuxの`traceroute`がオプションごとに
どんなパケットを投げているのか調べる

パケットの中身は`tcpdump`コマンドでキャプチャし、WireSharkで閲覧する

:::note warn
Windowsの`tracert`ではない
:::

### バージョン traceroute --version

tracerouteコマンドにもバージョンが存在し、今回使うバージョンは`version 2.1.0`らしい

```bash
Modern traceroute for Linux, version 2.1.0
Copyright (c) 2016  Dmitry Butskoy,   License: GPL v2 or any later
```

### オプションの種類 traceroute --help

tracerouteコマンドのヘルプを一部抜粋する
今回はオプション無しに加えて、下記３つのオプョンを試す

```bash
Options:
  -I  --icmp                  Use ICMP ECHO for tracerouting
  -T  --tcp                   Use TCP SYN for tracerouting (default port is 80)
  -U  --udp                   Use UDP to particular port for tracerouting
                              (instead of increasing the port per each probe),
                              default port is 53
```

次章からさっそくキャプチャの中身を見ていく

## traceroute (オプション無し)

問い合わせ|応答
-|-
UDP|ICMP Port unreachable

無茶苦茶なポーへのUDP問い合わせに対して、ポート到達不可の応答が返される


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/023167fa-d45c-ab26-ab6f-80df27c55d1b.png)

### ICMP応答の詳細 Port unreachable

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/f0d62205-f9aa-5d53-c0a4-4ede89f84471.png)

> port unreachableはサーバーまで通信が出来ていますが、サーバーのポートが解放されていない時に使われます。この場合、サーバーまでパケットは届いている事が分かります。
> [ICMPヘッダーの構造
](https://beginners-network.com/icmp.html)

## traceroute -U

問い合わせ|応答
-|-
UDP 53|ICMP Port unreachable

- `--help`に`default port is 80`と記載があるとおりの問い合わせ
- 応答の種類は、先ほどのオプション無しtracerouteと同じ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/765fc798-69cb-4983-5ccb-10c1801cbc7a.png)

## traceroute -T

問い合わせ|応答
-|-
TCP 80|TCP ACK

- `--help`に`default port is 80`と記載があるとおりの問い合わせ
- SYNに対するSYN/ACKまたはRST/ACKが応答として返される

### 相手がウェブサーバーの場合（ポート80が開いている場合）

ウェブサーバーの場合は80番ポートで実際に通信が可能であるため
通信を継続しようとする応答SYN/ACKが返ってくる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/cde50636-a5bc-a4da-905b-eeb6414bfbe1.png)

### 相手がウェブサーバーではない場合（ポート80が開いていない場合）

相手がウェブサーバーではない場合は、普通は80番ポートは閉まっている
そのため80番ポートとコネクションを拒否するためにリセット（RST/ACK）が返ってくる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/1a6f6d2c-893b-be15-7091-4479463d580c.png)

## traceroute -I

問い合わせ|応答
-|-
ICMP Request|ICMP Reply

PINGによる疎通確認と同じ内容

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/8988fec4-1156-dfad-b933-d333f5c7f777.png)

## まとめ

Linuxのtracerouteの様子をWireSharkでキャプチャした

WindowsマシンのファイアウォールではICMPに応答を返さない設定にされていることが多々ある
また、途中のファイアウォール機器によって特定ポート以外のパケットを拒否していたりすることもある

さらには、過去に自分もハマったTCPオフロードの機能のオン／オフによっては
チェックサムが無効であるとUDPのパケットが破棄されて
「Port unreachableの応答が返ってこないが、ICMPリプライとSYN/ACKは返ってくる」といったケースもある・・・[その時の様子](https://qiita.com/t13801206/items/0aa1d0f2b762d013e9f8#%E9%9D%99%E7%9A%84%E3%83%AB%E3%83%BC%E3%83%88%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B)

**「tracerouteから応答が返ってこない！！」など困ったときは
オプションを変更すると返ってくるかもしれない**

以上

## 参考

https://succzero.hatenablog.com/entry/2013/09/01/181615

https://itmemo123.net/windows/1063/


## 糸冬了！！
【自分用メモ】Xcodeの最新verをインストールする際の注意点

まず初心者の方が思いつくXcodeの最新verのインストール方法ですが
おそらく「App Storeのアップデート欄からする方法」かなと思います。

個人的には
「App Storeのアップデート欄からする方法」ではなく
「Appleの公式サイトからアップデートする方法」をお勧めします。

そして、アップデートした後の注意点について記載しておきます。

多くの学習者がXcodeをよく使うのでMacのDockに追加していると思います。

アップデートした後にアップデート以前のverのDockに追加されたXcodeを
タップしてアップデート以前のverのXcodeを
無自覚に使うといったことが起こりうるので

アップデート以前のverのXocdeは削除して
アップデートしたverのXcodeを新しくDockに追加してください。

自分は無自覚にアップデート以前のverのXcodeを使っていたことで
エラーが発生してXcodeのverをAbout Xcodeから調べると
アップデート以前のverを使っていたことに気づきました。
Android Studioの空のpackage/folderを連らないようにする

# Android Studioの空のpackageを連らないようにする

![スクリーンショット 2023-05-14 21.03.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3391014/2ba838e6-fd36-d9e1-b0b1-90ea7a1541a2.png)
↑を↓にしたい
![スクリーンショット 2023-05-14 21.03.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3391014/b6641b42-ee91-034f-0261-a61a65ecdf05.png)

サイドメニュのオプションから縦の三点リーダー> Tree Appearance > Compact Middle Packages 
のチェックマークを外す

![スクリーンショット 2023-05-14 21.02.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3391014/59587132-a9fe-e2a1-d306-9445796e6857.png)
【macOS】ターミナルにサジェストを表示してくれるツールが神

# はじめに
過去の履歴に応じてターミナルにサジェストを表示してくれるツールを見つけたので紹介します

https://github.com/zsh-users/zsh-autosuggestions

Homebrewでインストールします
Homebrewのインストール方法は以下の記事を参考にしてください

https://qiita.com/SNQ-2001/items/9c527c9326376b0f48ab

# 導入
インストールします
```:ターミナル
brew install zsh-autosuggestions
```

`.zshrc`を開きます
```:ターミナル
open ~/.zshrc
```

`.zshrc`に以下をコピペします
```.zshrc
source /opt/homebrew/share/zsh-autosuggestions/zsh-autosuggestions.zsh
```

`.zshrc`を読み込みます
```
source ~/.zshrc
```

# 動作確認
白くなっている所までしか打っていないのにも関わらず、灰色でサジェストしてくれました！
![スクリーンショット 2023-05-14 21.07.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/de00e744-fd54-f2e5-1915-e865b6e0e242.png)

# おわり
これはマジで便利ですね
使ってないと損です

# 参考記事
https://zenn.dev/sprout2000/articles/bd1fac2f3f83bc
42Tokyo の Web試験に下第して

2023年5月11日（木）の毎日新聞朝刊で、42Tokyo のことを知りました。
そして、5月13日の午後に、Web 試験を受けました。
そして、5月14日の午後に、以下のメールを受け取りました。

```text
【42 Tokyo】ゲームの合否について	
残念ながらあなたはゲームの合格基準に達しませんでした。

ゲームをクリアできなくても、落ち込まないでください。 42の教育方法とはマッチしなかっただけで、他にも学ぶ選択肢はたくさんあります。

もしゲームを再挑戦したい場合、再度アカウントを作成し挑んでください。

この度は、42東京に参加いただきありがとうございました。

42 Tokyoチーム
```

しばらくしたら、再挑戦するかもしれませんが、「他の選択肢」も考えたいと思います。
例えば、Qiita でも、「お互いに教え合う」ということが出来ないかなと思います。
Qiita を見ると、

```text
この記事は最終更新日から1年以上が経過しています。
```

```text
この記事は最終更新日から3年以上が経過しています。
```

という表示を良く見かけます。私も、そういう記事を沢山持っています。私の記事の半数以上は、
そういう状況だと思います。
例えば、第三者が、その時点の最新のバージョンで確認したら、例えば、このバージョンで確認
したところ、この記事は正しかったという情報を付加することはできないでしょうか。
例えば、

```text
この記事は、***により、何年何月何日に有効であることが確認されました。
```

というような情報を付加することです。

Node.js とか Deno とかどんどん進化している状態の言語には、第三者が最近確認した
という情報は、役に立ちます。

Qiita が、42Tokyo に対して、優位に立てるのは、入学試験がないことです。うまく仕組みを
構築すれば、「生徒同士で教えあう」という状況が作れるのではないでしょうか。
【DJI MSDK V5】KeyStartAutoLanding送信後に降下が途中で止まってしまう問題について

# 問題
自動着陸を行うために、```KeyStartAutoLanding```送信後、高度-0.5付近で降下が止まってしまった。

```Kotlin:
    fun startLanding(callback: CommonCallbacks.CompletionCallbackWithParam<EmptyMsg>) {
        FlightControllerKey.KeyStartAutoLanding.create().action({
            callback.onSuccess(it)
        }, { e: IDJIError ->
            callback.onFailure(e)
        })
    }
```

▼-0.5付近で降下が止まっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2584877/13a0e0d0-49cf-f1d2-989a-5d313eec7e26.png)

# 解決
```KeyConfirmLanding```を送信すれば着陸できた

```Kotlin:
    fun confirmLanding(callback: CommonCallbacks.CompletionCallbackWithParam<EmptyMsg>) {
        FlightControllerKey.KeyConfirmLanding.create().action({
            callback.onSuccess(it)
        }, { e: IDJIError ->
            callback.onFailure(e)
        })
    }
```

▼実施時の動画
<iframe width="560" height="315" src="https://www.youtube.com/embed/gFrexXMoEhk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

# 前提条件
* [Android Studio Flamingo](https://developer.android.com/studio)
* [DJI Mini 3](https://www.dji.com/jp/mini-3)
* [Huawei Mate 20](https://www.gsmarena.com/huawei_mate_20-9367.php)
* [Mobile SDK V5](https://github.com/dji-sdk/Mobile-SDK-Android-V5)
NAT Gatewayを自動起動・終了するCDK Construct 

### 背景
NAT Gatewayは、プライベートサブネットからインターネットへの通信を可能にするために使用されます。しかし、NatGatewayが常に起動されていると、使用されていない時間帯でも課金されるため、コストが高額になってしまいます。

指定された時間帯にのみNAT Gatewayを起動し、必要がなくなったら自動的に削除することで、無駄なコストを削減することを検討しました。例えば、平日の9時から18時までの間にNAT Gatewayを起動して、それ以外の時間帯は自動的に削除することで、年間で数百ドル程度のコストメリットが得られる可能性があります。

### 「ScheduledNatGateway」Constructの開発

「ScheduledNatGateway」は、AWS CDKを使用して、決まった時刻に対象のパブリックサブネットにNatGatewayを生成及び削除するlambdaを作成するConstructです。また、プライベートサブネットに紐づけるルートテーブルに0.0.0.0/0宛にNatGatewayを指すルートを自動で設定します。

このConstructは開発環境での使用を想定しており、シングルAZ対応となっています。

このライブラリを使用するためには、AWS CDKがインストールされている必要があります。AWS CDKのインストール方法は、[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/cdk/latest/guide/getting_started.html#getting_started_install)を参照してください。

Construct Hubのリンクはこちら

[![View on Construct Hub](https://constructs.dev/badge?package=scheduled-natgateway)](https://constructs.dev/packages/scheduled-natgateway)

### インストール方法

「ScheduledNatGateway」はnpmパッケージとして公開されています。以下のコマンドを使用して、インストールすることができます。

```
$ npm install scheduled-natgateway
```

### 使い方

以下のように、CDKのStack内で「ScheduledNatGateway」を使用することができます。

```typescript
import * as cdk from 'aws-cdk-lib';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import { ScheduledNatGateway } from 'scheduled-natgateway';

const app = new cdk.App();
const stack = new cdk.Stack(app, 'MyStack');

// Create a VPC with two subnets (public and private)
const vpc = new ec2.Vpc(stack, 'MyVpc', {
  cidr: '10.0.0.0/16',
  subnetConfiguration: [
    {
      cidrMask: 24,
      name: 'public',
      subnetType: ec2.SubnetType.PUBLIC,
    },
    {
      cidrMask: 24,
      name: 'private',
      subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
    },
  ],
});

// Create a NAT Gateway in the public subnet on a schedule
const scheduledNatGateway = new ScheduledNatGateway(stack, 'NatGateway', {
  publicSubnetId: vpc.publicSubnets[0].subnetId,
  privateSubnetId: vpc.privateSubnets[0].subnetId,
  createSchedule: '0 22 * * ? *',
  deleteSchedule: '0 10 * * ? *',
});
```

上記の例では、毎日22時(UTC: JST7時)にNatGatewayを生成し、毎日10時(UTC: JST19時)にNatGatewayを削除するための「ScheduledNatGateway」コンストラクターが呼び出されています。引数には、対象となるパブリックサブネットのID、プライベートサブネットのID、生成する/削除する時刻のcron式が必要です。

### 結論

「ScheduledNatGateway」を使用することで、AWS CDKを使用して簡単にNatGatewayを自動生成/削除することができます。CDKを使用している場合は、ぜひ使ってみてください！
dockerを使用中flaskのapp.run()の設定を間違えてホストマシンからアクセスできなかった話

# 内容

最近、Dockerを使ってPythonのWebアプリを開発しています。Dockerコンテナを起動して、Flaskのサーバーを起動し、ホストマシンからアクセスできるようにしました。ただし、通常、`app.run(host="0.0.0.0", ～～)`のように記述することで、localhostからアクセスできるようになります。

このプロジェクトでは、`app.run()`を書く場所が`app.py`と`run.py`の2つあったのですが、`app.py`にだけ`host="0.0.0.0"`を記述していました。そのため、ホストマシンからアクセスすることができず、問題が発生しました。

最終的に、`app.py`と`run.py`の両方に`host="0.0.0.0"`を記述することで、ホストマシンからアクセスできるようになりました。プログラミングを行う際には、細かい部分も見逃さずにチェックすることが大切です。

# dockerfile
```dockerfile
# ベースイメージを指定
FROM python:3.9

# ワーキングディレクトリを設定
WORKDIR /app

# 必要なパッケージをインストール
RUN pip install flask

# ポート番号を指定
EXPOSE 5000

# アプリケーションを実行
CMD ["flask", "run", "--host=0.0.0.0"]
```

# ディレクトリ構造
本アプリは、じゃんけんアプリを想定。

```
C:.
│  docker
│  dockerfile
│  run.py
│
└─app
    │  app.py
    │
    ├─static
    │      choki.png
    │      gu.png
    │      pa.png
    │
    ├─templates
    │      index.html
    │      janken.html
    │      root.html
    │
    └─__pycache__
            app.cpython-39.pyc
```

# 締め

今回の記事を読んでいただき、ありがとうございました。何か質問やコメントがあれば、お気軽にお聞きください。また、次回の記事もお楽しみに！
Android　曜日を取得する方法

Androidで曜日を取得する方法です。


```.kt
    val calendar: Calendar = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tokyo"), Locale.JAPAN);
    val week: Int = calendar.get(Calendar.DAY_OF_WEEK)
    getWeek(week)
```


```.kt
fun getWeek(day: Int): String {
    return when (day) {
        Calendar.SUNDAY -> "(日)"
        Calendar.MONDAY -> "(月)"
        Calendar.TUESDAY -> "(火)"
        Calendar.WEDNESDAY -> "(水)"
        Calendar.THURSDAY -> "(木)"
        Calendar.FRIDAY -> "(金)"
        Calendar.SATURDAY -> "(土)"
        else -> {
            ""
        }
    }
}
```

``calendar.get(Calendar.DAY_OF_WEEK)``で曜日をIntで取得できるので、``getWeek``のような関数を作成して、何曜日か判定してみました。
[fullcalendar]イベントへのオプションの付け方

# はじめに

fullcalendarを使用している時に、jsonでのイベントへのオプションの付け方に関する分かりやすい記事がすぐに見つからなかったので、簡潔にまとめておきます。

## こんな方にぜひ読んでいただきたい

- fullcalendarを初めて使用した
- fullcalendarを少しカスタマイズしたい
- オプションを付けたいけど、どうしたらいいのだろう？
- json　の使い方がわからない

# [結論]公式ページ

以下のfullcalendar公式ページにも記載があります。

https://fullcalendar.io/docs/event-source-object

書き方は意外と簡単です。


## 前提

こちらの記事を参考に、fullcalendarの導入を行っています。

https://qiita.com/rakko1124/items/faa93cb7e81e312b9ae3

https://qiita.com/rakko1124/items/e9c3f8dccde6e2c11869

## オプションの書き方

上記記事に、実は記載がありました。


>```view/events/index.json.jbuilder
>json.array!(@events) do |event|
>    json.id event.id
>    json.title event.title
>    json.start event.start  
>    json.end event.end 
>   end
>
>  # json.〇〇は送るデータの型
>  # event.〇〇はそれに対応するモデルのカルム
>```

ただ、fullcalendar初使用の私には、これからオプションを追加するにはどうしたら良いかわからなかったのです...
これをさらにカスタマイズしていきます。


### イベントをクリックした時の遷移先を設定したい時

```view/events/index.json.jbuilder
json.array!(@events) do |event|
    json.id event.id
    json.title event.title
    json.start event.start  
    json.end event.end 

### 以下を追加 ###
    json.url event_path(event.id)
   end
```

必要に応じて、パスは変更できます。

### 色を変更したい時

```view/events/index.json.jbuilder
json.array!(@events) do |event|
    json.id event.id
    json.title event.title
    json.start event.start  
    json.end event.end 

### 以下を追加 ###
    json.color "#2b2b2b"
   end
```

"#2b2b2b"の部分には希望の色を入力してください。
色は以下のページから検索可能です。

https://www.colordic.org/search


### 条件分けをしたい時

```view/events/index.json.jbuilder
json.array!(@events) do |event|
    json.id event.id
    json.start event.start  
    json.end event.end 

### 以下を追加 ###
    case event.kind
    when "event"
        json.title "[予定] #{event.title}"
    when "todo"
        json.title "[TODO] #{events.title}"
    else
        json.title event.title
   end
```

上記では、eventテーブルのkindカラムによって条件分けをしていますが、必要に応じて変更してください。
もちろん、if文なども使用できます。


## 終わりに

できるようになると、とてもとても簡単な内容ですが、調べても調べてもこのような記事が出てきませんでした．．．
調べるのにかなり時間を費やしてしまったので、参考になれば幸いです。

お読みいただきありがとうございました。

#### 参考

全て本記事内ですでに紹介したものですが、まとめておきます。

https://fullcalendar.io/docs/event-source-object
https://qiita.com/rakko1124/items/faa93cb7e81e312b9ae3
https://qiita.com/rakko1124/items/e9c3f8dccde6e2c11869
https://www.colordic.org/search
[Java]ConcurrentModificationExceptionが出る時の対処方法

個人的なメモとして残しておきます。
まずエラーが出るコードがこちら
``` Java
List<String> sList = new ArrayList<>();
        sList.add("A");
        sList.add("B");
        sList.add("C");
        sList.add("D");

for(String s : sList) {
    if(s.equals("B")) {
        sList.remove(s);
    } else {
        System.out.println(s);
    }
}

```
上記のプログラムを実行すると<b>ConcurrentModificationException</b>という実行時エラーが発生します。
これはforEachの中で要素を削除していることが原因で起こっています。
例外として最後の要素と最後から2つ目の要素は削除してもエラーは起きません。

# 代替方法
ここでは特定の要素を削除してそれ以外の要素を出力したいと仮定します。
まずはremoveIfで特定の要素を削除してからforEachで出力する方法
``` Java
sList.removeIf(s -> s.equals("B"));
for(String s : sList) {
    System.out.println(s);
}
```

次にforEachではなくて普通のforを使う方法です。
``` Java
for(int i = 0; i < sList.size(); i++ ) {
    if(sList.get(i).equals("B")) {
        sList.remove(sList.get(i));
        i--;
    } else {
        System.out.println(sList.get(i));
    }
}
```
この方法は要素を削除した分インデックスが前にずれるのでそれを解消する為に削除した際にインデックスを１減らしています。
個人的にはこの方法よりもremoveIfで特定の要素を削除してから出力する方法の方がコードも少なくてわかりやすいと思います。
【Intellij IDEA】 C++ BuildToolsがストレージくい虫なのでIntellijに移行したいなって話。 - 第一話

ｱ､ﾄﾞｳﾓﾐﾅｻﾝ。

専門学生でソフトウェア開発を行っていますあまみやです。

今回は私が悩んでいたWindowsでのRust開発に必要なC++BuildToolsからの移行をしてみようかと思います。

# VS2022 C++ BuildToolsとは

https://github.com/MicrosoftDocs/cpp-docs/blob/main/docs/overview/visual-cpp-tools-and-features-in-visual-studio-editions.md

このツールはWindowsでC++やそれをベースとした環境で開発を行うためのツールで、RustだけでなくUnreal Engineでも必要になります。しかしいがんせんストレージを大量に消費することになるので悩んでいました。

移行先として従来のBuildToolsからCLionやintellij IDEAのRustプラグインを使った環境に移行したいと思いました。

企業であれば大事ですが、個人で実験するだけですので。。。(;^ω^)

多分Linuxだといらないかもです。多分。

移行にすごい時間がかかるので、続きはまた余裕があるときに。

それではぁ