OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonのsetを使って高速な検索を実現する

## はじめに
Pythonでデータの検索を行う際、リストを使用するのが一般的です。しかし、大量のデータを扱う場合、リストの検索は非効率になる可能性があります。そこで登場するのが`set`です。この記事では、Pythonの`set`を使って高速な検索を実現する方法を紹介します。

## setとは

`set`は、Pythonの組み込みデータ型の1つで、重複のない要素の集合を表します。`set`の大きな特徴は、要素の検索が非常に高速であることです。これは、`set`がハッシュテーブルを使用して実装されているためです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/3f53cb41-fec2-5996-a4b7-2fce8f3b012f.png)

## setを使った検索の基本

まずは、簡単な例を見てみましょう。

```python
import timeit

# 大量のデータを含むリストを作成
data = list(range(1000000))

# setを作成
data_set = set(data)

# 検索
target = 999999

# リストでの検索
list_time = timeit.timeit(lambda: target in data, number=1000)

# setでの検索
set_time = timeit.timeit(lambda: target in data_set, number=1000)

print(f"リストでの検索時間: {list_time:.6f}秒")
print(f"setでの検索時間: {set_time:.6f}秒")
print(f"setの方が{list_time / set_time:.2f}倍高速")
```

この例を実行すると、次のような結果が得られます：

```
リストでの検索時間: 0.047231秒
setでの検索時間: 0.000082秒
setの方が576.92倍高速
```

`set`を使用した検索が圧倒的に高速であることがわかります。

## setを使う場合の注意点

1. **メモリ使用量**: `set`はハッシュテーブルを使用するため、リストよりもメモリを多く使用します。

2. **順序の保持**: `set`は順序を保持しません。順序が重要な場合は、`list`や`collections.OrderedDict`を検討してください。

3. **可変性**: `set`内の要素は変更不可能（イミュータブル）である必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/a2806d28-e5bc-238a-729f-f98cee7eb601.png)

## 実践的な使用例

大量の単語リストから特定の単語を検索する例を考えてみましょう。

```python
import random
import string
import time

# ランダムな単語を生成する関数
def generate_random_word(length):
    return ''.join(random.choice(string.ascii_lowercase) for _ in range(length))

# 大量の単語リストを生成
word_list = [generate_random_word(5) for _ in range(1000000)]

# 検索対象の単語（リストの最後の要素）
target_word = word_list[-1]

# リストでの検索
start_time = time.time()
found_in_list = target_word in word_list
end_time = time.time()
list_search_time = end_time - start_time

# setでの検索
word_set = set(word_list)
start_time = time.time()
found_in_set = target_word in word_set
end_time = time.time()
set_search_time = end_time - start_time

print(f"リストでの検索時間: {list_search_time:.6f}秒")
print(f"setでの検索時間: {set_search_time:.6f}秒")
print(f"setの方が{list_search_time / set_search_time:.2f}倍高速")
```

実行結果：

```
リストでの検索時間: 0.046875秒
setでの検索時間: 0.000001秒
setの方が46875.00倍高速
```

この結果から、`set`を使用することで検索速度が劇的に向上することがわかります。

## 公式ドキュメントと参考情報

Pythonの`set`に関する詳細な情報は、公式ドキュメントで確認することができます。以下に関連するリンクを示します：

1. [Python公式ドキュメント - set型](https://docs.python.org/ja/3/library/stdtypes.html#set-types-set-frozenset)
2. [Python公式ドキュメント - set操作](https://docs.python.org/ja/3/library/stdtypes.html#set)

これらのドキュメントでは、`set`の基本的な使い方から高度な操作まで詳しく解説されています。

## まとめ
Pythonの`set`を使うことで、大量のデータの中から特定の要素を高速に検索することができます。ただし、メモリ使用量や順序の保持など、トレードオフもあるため、適切な使用場面を見極めることが重要です。大規模なデータセットを扱う際や、検索速度が重要な場面では、`set`の使用を検討してみてください。

実際のパフォーマンスは、データのサイズや性質、実行環境によって異なる場合がありますので、自身のユースケースで適切な選択を行うことが重要です。また、上記の参考情報を活用して、より深い理解を得ることをお勧めします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/253ca041-60ab-7a31-7479-39fc965b6cb3.png)
クロスアカウントアクセスでS3バケットへファイルアップロード

# やりたいこと
BアカウントのIAMユーザーから、Aアカウント所有のS3バケットへファイルをアップロード

# やり方
## ①Aアカウント
### バケット作成
設定がデフォルトでいい
（ACL使わない）
（パブリックアクセスブロックをオンのまま）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/e5b2d54f-795a-944c-e254-c05171821306.png)

### バケットポリシー設定
（BアカウントのIAMユーザー作成へアクセス権限を付与）
```
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Sid": "Only allow writes to my bucket with bucket owner full control",
         "Effect": "Allow",
         "Principal": {
            "AWS": [
               "arn:aws:iam::BアカウントのID:user/BアカウントのIAMユーザー名"
            ]
         },
         "Action": [
            "s3:PutObject"
         ],
         "Resource": "arn:aws:s3:::Aアカウントのバケット名/*",
	"Condition": {
            "StringEquals": {
               "s3:x-amz-acl": "bucket-owner-full-control"
            }
         }
      }
   ]
}
```


## ②Bアカウント
### IAMユーザー作成
CLIのアクセス情報を発行してください

## ③ローカルPC
### CLIのスイッチロールを設定

credentialsファイルにBアカウントのアクセス情報を登録
```
[default]
aws_access_key_id = AアカウントのID
aws_secret_access_key = Aアカウントのアクセスキー
[b-account]
aws_access_key_id = BアカウントのID
aws_secret_access_key = Bアカウントのアクセスキー
```
## ④コマンド
--profileを付けて、Bアカウントのアクセス情報を使う
aws s3 cpのコマンドでファイルをアップロード


```
aws --profile b-account s3 cp ./アップロードファイル名 s3://Aアカウントのバケット名 --acl bucket-owner-full-control
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/5f60606e-3000-cc73-2870-71e3508ca43d.png)

無事Aアカウントのバケットへアップロードできた

# 参考サイト

https://dev.classmethod.jp/articles/aws-cli-assume-role-with-mfa/

https://zenn.dev/jyama/articles/29f2dcfddd0093

https://www.cloudbuilders.jp/articles/1932/
メモ6

了解了，你可以在 `forwardToPage` 方法中调用外部 API，然后将获得的 URL 返回给前端，使用 JavaScript 在新窗口中打开该 URL。可以通过 AJAX 调用来实现这一点。

以下是一个示例：

### JSF 页面

```html
<h:commandButton value="Forward" action="#{bean.forwardToPage}" onclick="openInNewWindow(); return false;"/>
<script>
    function openInNewWindow() {
        // 通过 AJAX 调用后台方法
        jsf.ajax.request(this, event, {
            render: 'newUrlOutput',
            onevent: function(data) {
                if (data.status === 'success') {
                    var newUrl = document.getElementById('newUrlOutput').innerHTML;
                    window.open(newUrl, '_blank');
                }
            }
        });
    }
</script>

<h:outputText id="newUrlOutput" value="#{bean.newUrl}" style="display:none;" />
```

### 后端 Bean

```java
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

@ManagedBean
@ViewScoped
public class Bean {
    private String newUrl;

    public void forwardToPage() {
        // 调用外部 API 获取 URL
        try {
            URL url = new URL("https://api.example.com/getRedirectUrl");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.connect();
            int responseCode = conn.getResponseCode();
            if (responseCode == 200) {
                Scanner scanner = new Scanner(url.openStream());
                if (scanner.hasNext()) {
                    newUrl = scanner.nextLine();
                }
                scanner.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public String getNewUrl() {
        return newUrl;
    }

    public void setNewUrl(String newUrl) {
        this.newUrl = newUrl;
    }
}
```

### 解释
1. **JSF 页面**:
   - `<h:commandButton>` 按钮会触发 `openInNewWindow` JavaScript 函数。
   - 在 `openInNewWindow` 函数中，通过 `jsf.ajax.request` 发起 AJAX 请求来调用 `forwardToPage` 方法。
   - 当 AJAX 请求成功时，会将后台返回的 `newUrl` 赋值给隐藏的 `<h:outputText>` 组件，然后用 `window.open` 在新窗口中打开该 URL。

2. **后端 Bean**:
   - `forwardToPage` 方法调用外部 API，并将返回的 URL 赋值给 `newUrl` 属性。
   - `newUrl` 属性通过 `<h:outputText>` 在页面中隐式呈现，用于 JavaScript 的处理。

这种方式可以确保外部 API 返回的 URL 能够在新窗口中正确打开。
静的サイトのアクセスログを取る

## はじめに
IBM Object Storageで静的サイトを公開した際、アクセスログを取る方法を調べたのでまとめました。

## やってみる

1.静的ウェブサイトホスティングを有効にしたバケットに適当なhtmlファイルを置く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885167/79d0c1fa-ace7-8f15-ba06-cf1e607e325b.png)

2.パブリックURLを控える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885167/075ced7f-6eac-2326-fd2d-900b5e5a9124.png)

3.ブラウザからアクセスできることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885167/228bf749-f927-9305-e68e-80b82f416cad.png)











4.ActivityTrackerと関連づける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885167/454b43b4-2697-e003-a8eb-77db1f14923f.png)


5.ActivityTrackerのコンソールに移動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885167/a709a126-19f1-fe49-9748-fbbd5f0c386d.png)



6.Object Storageで絞る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885167/8267769a-2eeb-d2e8-6056-f21b6a72aa65.png)

7.read object index.htmlで検索をかける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885167/bb062ad3-fc87-13b4-78a8-5913e76788c9.png)



8.選択すると細かく確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885167/a0c11e52-4079-af4b-d3ed-4de09a3123f7.png)
「ソフトウェア開発現場の『失敗』集めてみた。」読んでみた

# はじめに
ソフトウェア開発において失敗は避けられないものです。しかし、それをどう捉え、学びに変えるかが成功への鍵となります。今回紹介する書籍「ソフトウェア開発現場の『失敗』集めてみた。」は、開発現場での失敗事例を集め、その教訓を分かりやすく解説した一冊です。

https://amzn.asia/d/0g2IyJUS

# 本書の概要
本書籍ではソフトウェア開発プロジェクトにおける失敗事例を具体的にエピソード形式でマンガで記載されています。失敗事例数は全部で42個あります。なお構成は下記のように開発のフェーズごとに分かれており，非常に読みやすかったです。

- Chapter1　「企画」で失敗
- Chapter2　「仕様」で失敗
- Chapter3　「設計・実装」で失敗
- Chapter4　「進捗管理」で失敗
- Chapter5　「品質管理」で失敗
- Chapter6　「リリース後」に失敗

それぞれの失敗事例に対して, 原因分析と改善策が丁寧に解説されています。

# 印象に残った失敗事例と教訓
各チャプターにおいて個人的に気になったエピソードをいくつか紹介したいと思います。
## 「企画」で失敗
**事例：**
- リーダーも新人も一緒「全員一人前計画」

**教訓：**
- 開発だけが見積もり対象じゃない！

プロジェクトを発足する際のメンバーのスキルセットはバラバラであることがほとんどかと思います。このような状況下でメンバー全員が同一のスキルレベルを持っている前提で計画を立ててはいけないといった内容でした。

現在は開発者ロールでプロジェクトに参加していますが，今後PMロールなどに縁があったときにはこの辺をしっかり考慮した上でプロジェクトをスタートさせたいなと。

## 「仕様」で失敗
**事例：**
- 実装できない「ふんわり仕様」

**教訓：**
- その仕様書を読んでみんな同じ仕様で実装できるか？不明瞭な点はしっかりと確認

「ふんわり仕様」で実装を初めてしまうと開発者の中の常識と受け入れ担当者の常識の乖離から思わぬ成果物が出来上がってしまうことがありますよね。

## 「品質評価」で失敗
**事例：**
- バグが出ない「開発者バイアス」

**教訓：**
- 早期のテスト戦略大事！

「開発者バイアス」ってなんぞや，と読み進めましたがこのエピソードに近い経験は最近の開発の中でもあったなあと…

無意識のうちにバグを避ける方法で開発やらデバッグをやってしまうんですよね。そして肝心のデモの時に動かなかったり…

# 総評
「ソフトウェア開発現場の『失敗』集めてみた。」は, 開発における失敗を疑似体験でき開発者, PM, PO, SMなど様々なロールの方々にとって非常に有益な一冊であると思いました！

定期的に読み返しながら日々の開発業務で失敗を未然に防げたらなと思います。
AstroでMDXファイルを使っていたら、急にVSCode上でのシンタックスハイライトが異常になった話

# 要約

- IDE: Visual Studio Code (VSCode)
- JSフレームワーク: Astro
- スターターキット: Starlight & Starlight Blog

<dl>
<dt>Q</dt><dd>
VSCode上でのMDXファイルのシンタックスハイライトが正常に動いていません。どうすればいいですか？
</dd>
<dt>A </dt><dd>VSCodeの拡張機能の「YAML」が有効にしてみてはどうでしょうか。</dd>
</dl>

# 課題

VSCodeでAstro Starlight製のサイトをつくっていた。

ある日、MDXファイルをVSCode上で開いてみると、
なんかシンタックスハイライトが正常に機能していない。

つまり、こうなっていた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821654/5c67e973-f01e-06c4-e783-4ff2417a8934.png)

見た感じ、Frontmatter部分の閉じが正常に認識されていないっぽい。

それで、その後の文章の大部分が真っ赤になっている。（まあ色合いはシンタックスハイライトの種類に依存するけど）

これは見づらい。
というか、なんで急にこうなった？

# 調査

適当に調べていて、解決方法がわかっただけなので、調査過程はぶっ飛ばします。

# 解決方法

VSCodeの拡張機能「YAML」を入れたら直りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821654/4afbe19a-2e44-023d-f78b-198992c1877c.png)

まあ、そりゃFrontmatterはYAMLだもんね。

# おわりに

昨日までは普通に動いていた気がするんだけどなあと思いながらも、まあ直ったので問題なしです。

以上、ひとまずメモと、同じ状況に陥った人の役に万が一でも立てばということで記事にしました。
最小努力と最短時間でAZ-900合格記

前回(SC-900)に引き続きAZ-900も無事一回で合格しました。
SC-900の知識があるため、いままで受けた中で最もインプット量が少なく感じた試験でした。
勉強時間も3時間程度。暗記量も少ないため、問題も簡単でした。

毎度の如くほぼ当日詰め込みショートカット勉強法なので、きちんと正攻法で勉強することをお勧めします。


過去の体験記はこちら

https://qiita.com/ponponmikankan/items/fd363bb0323569d3676f

https://qiita.com/ponponmikankan/items/77202be0de32cda5893d

https://qiita.com/ponponmikankan/items/4b64124be47a34467019


## 前提

非エンジニアのため、仕事等の中でサーバを立てたり、Azureを使ってなにかデプロイしたことはないです。
これまでにPL-900、MS-900、SC-900を受けているため最低限のAzureの知識はある状態です。

## 参考にした勉強法

前回受験したSC-900で赤本に対する信頼度がMAXとなったため、今回も赤本頼みで挑みました。
この赤本シリーズ、本当に網羅性、質問の再現性がすごい。1周するだけで絶対に受かる。
私が購入したのは2023年9月版のものだったのですが、内容のアップデートはあったものの致命的な変更等は特になかったです。

https://learn.microsoft.com/ja-jp/credentials/certifications/resources/study-guides/az-900#skills-measured-as-of-january-23-2024

## 実際の勉強でやったこと

### 「MCP教科書 Microsoft Azure Fundamentals（試験番号:AZ-900）」を購入し読む(3時間程度)

https://www.shoeisha.co.jp/book/detail/9784798183381

分厚いように感じますが、わりとキャプチャ多めだったり、一般的なクラウドの考え方等が載っていて、「へーへー」とどんどこめくりながら楽しく読めました。
似たような名前のAzureなんちゃらはちょこちょこ出てきますが、暗記量は少なめです。
Learnで一応試験範囲等は確認しましたが今回はこれ一本勝負。より理解を深めたい方はLearnやUdemyを実施することをお勧めします。

### 試験の感想

試験時間45分ですが、15分で終了（見直し1周）。
またまた赤本から一字一句そのまんまのラッキー問題が5問くらいでておりました。赤本あざますすぎ。

…というわけで、今回も超最低限勉強法で無事合格！
次はAI-900かDP-900を目指そうと思います。（赤本がないため、Learnをやらないといけないが…）
【ChatGPT＋Code Interpreter】でエッジ検出をします。


　どうも、カーブミラーです。

　今回は、エッジ検出をします。別になんの目的があるわけではありませんけどね😸

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
あります。　あしからず。
:::

　まずは、ニュース。

　ChatGPTのGPT-4oの
　　音声会話モードですが、
　　　日本の方に開放されました。

　いろいろと試されて
　　その結果を動画にして
　　　いらっしゃいます。
　　　　[りくおさんポスト](https://x.com/riku720720/status/1818672503411425542?t=WnAErAp4Swm3N6T3UHS_cA&s=03)
***
　さて、本題です。

　エッジ検出を
　　ご存知でしょうか。
***
***Perplexity***
エッジ検出は、画像処理やコンピュータビジョンで使用される技術で、画像内の明るさの急激な変化（エッジ）を特定する方法です。これにより、物体の輪郭や重要な特徴を抽出できます。
***

　実際にやると
　　こんな感じです。
　　　上が元画素、
　　　　下がエッジ検出した画像です。
![combined_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/43b3d74c-3fe3-9429-c35a-f7a2cdfdf3c2.png)

　ちなみに
　　Promptはこちらになります。
```Text:
CodeInterpreterで、エッジ検出してください。
ダウンロードリンクを示してください。
```

***
***user***
上で行なってもらったエッジ検出の詳細を教えてください。
コード不要です。

***GPT-4o***
上で行ったエッジ検出は、Cannyエッジ検出アルゴリズムを使用しています。Cannyエッジ検出は、以下の手順に基づいてエッジを検出します：

1. **グレースケール変換**：
   - カラー画像をグレースケール画像に変換します。これにより、エッジ検出の計算が簡単になります。

2. **ノイズ除去**：
   - Gaussianフィルタを使用して画像のノイズを除去します。これにより、エッジ検出の精度が向上します。

3. **勾配の計算**：
   - Sobelフィルタを使用して、画像の水平方向および垂直方向の勾配を計算します。これにより、各ピクセルのエッジ強度と方向を求めます。

4. **非極大抑制**：
   - エッジ強度が最大でないピクセルを抑制し、細いエッジのみを残します。

5. **ヒステリシスしきい値**：
   - 2つのしきい値（低しきい値と高しきい値）を設定し、高しきい値を超えるエッジを強いエッジとして検出します。低しきい値を超えるエッジは、強いエッジに隣接している場合にのみエッジとして検出されます。

上記のプロセスにより、Cannyエッジ検出はノイズに強く、エッジを効果的に検出することができます。今回使用した具体的なパラメータは、低しきい値が100、高しきい値が200です。これにより、エッジの検出感度を適度に調整しました。

***user***
CodeInterpreterで行なえるエッジ検出について教えてください。
コード不要です。

***GPT-4o***
CodeInterpreterで行えるエッジ検出には、以下のような方法があります：

1. **Cannyエッジ検出**:
   - 最も広く使用されるエッジ検出手法で、ノイズ除去、勾配計算、非極大抑制、ヒステリシスしきい値処理を経てエッジを検出します。調整可能なパラメータにより、精度の高いエッジ検出が可能です。

2. **Sobelフィルタ**:
   - 画像の水平方向および垂直方向の勾配を計算し、エッジ強度と方向を求める手法です。エッジの方向を強調するために使用されます。

3. **Laplacianフィルタ**:
   - 画像の二次微分を用いたエッジ検出法で、エッジの検出に非常に敏感です。細かいエッジやノイズを含むエッジも検出します。

4. **Prewittフィルタ**:
   - Sobelフィルタに似ていますが、異なる重みを使用してエッジを検出します。エッジの方向を強調するのに適しています。

5. **Scharrフィルタ**:
   - Sobelフィルタの改良版で、より精度の高い勾配計算が可能です。微細なエッジを検出するのに適しています。

これらのエッジ検出手法は、画像の特性や目的に応じて選択し、適用することができます。エッジ検出は、画像の輪郭抽出、物体認識、画像分割などの画像処理タスクで重要な役割を果たします。
***

　今回、たまたま興味を惹かれて
　　やってみましたが、
　　　何に使えるのか
　　　　正直わかりません😅

　おそらく
　　画像解析の知識があれば
　　　また違ってくるのかな、と
　　　　思いますけどね。

　とりあえず、
　　今回はこんなところです。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
ソケットプログラミングで学習したことをまとめてみた③（close();, shutdown();について）

# はじめに
こんにちは。
[42tokyo](https://42tokyo.jp/)といったところで、コンピュータサイエンス？を学んでいます。
最近、簡単なIRCサーバを実装する課題を通して、ソケットプログラミングについて学びました。
本記事は、close();やshutdown();の働きについてまとめています。

間違い等があれば、ご指摘ください。

:::note info
本記事は、TCP/IP上で行われる通信を想定しています。
:::

# 参考

https://www.ohmsha.co.jp/book/9784274065194/

https://ja.manpages.org/close/2

https://ja.manpages.org/shutdown/2

# 全体図
![スクリーンショット 2024-06-21 17.30.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282897/877f4046-de49-7771-c589-d0c21d27da98.png)

# close();を実行したときの処理に流れ

### 1. 「送信バッファ」にあるデータを、全て「受信バッファ」に送る
:::note info
今回は、「受信バッファ」に十分な空きがあることを想定している。
:::
![スクリーンショット 2024-06-21 17.16.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282897/53623a30-1c48-2226-e93c-7cef16ae700e.png)

### 2. TCPハンドシェイクメッセージ（切断）を送信
:::note info
これ以上データを送らないことを相手に伝える意味を持つ。
:::
![スクリーンショット 2024-06-21 17.17.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282897/d9c541ef-8e6b-170c-4db9-23f314e3a5dd.png)

### 3. ソケットディスクリプタの割り当てを解放する
:::note info
「ソケットの状態」が「Closing」になり、プログラムは制御を返す。
:::
![スクリーンショット 2024-06-21 17.38.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282897/203748c6-e8eb-b083-d7cb-35a36d7ce181.png)

### 4. 相手からの肯定応答を受け取る
:::note info
「ソケットの状態」が「Half-Closed」になる
:::
![スクリーンショット 2024-06-21 17.39.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282897/38bef175-6fc1-f3cf-0575-56814015ea2d.png)

### 5. 相手側の切断処理が始まる
![スクリーンショット 2024-06-21 17.40.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282897/4a3688e0-4d8f-5e4d-e604-b486aae5656d.png)

### 6. TCPハンドシェイクメッセージ（切断）が送られてきたら肯定応答する
:::note info
* 「ソケットの状態」が「Time-Wait」になる
:::
![スクリーンショット 2024-06-21 17.41.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282897/af3a09bd-e5f7-b292-24db-3dffab9a5f07.png)

:::note info
* 以降、このTCPコネクションでのデータ送信はできない
* この状態のソケットに、bind();できない
（他のソケットがこの状態のソケットのローカルポートにバインドされない）
（再接続時、前接続時に送られてきたデータを、今回接続時のデータとして処理することを防ぐ）
* 「ソケット構造体」の割り当ては、しばらく残る
:::

# close();とshutdown();の違いと共通点
### 違い
#### close();
* 両方向のデータ転送が切断される
* ソケット関連のfdの割り当てが解除される
* 受信バッファにあるデータは破棄される

#### shutdown();
* ソケットによるコネクション切断を制御する
* 切断するコネクションの方向を指定できる

### 共通点
* TCPハンドシェイクメッセージ（切断）の完了を待たずに制御を返す

# さいごに
不備がありましたらお申し付けください。
ありがとうございました。
読書記録 2024/7/22週

## 始めに
勉強として本を読んでいます。
内容や所感をまとめて、本から学んだ内容を整理したいと思います。

## 本の情報
**タイトル**
ひとつ上の思考力
**著者**
安澤武郎

## 本の主な内容
タイトルにもある「ひとつ上の思考力」とは、**ダブルループ**というサイクルを回せることである。
##### シングルループ
「目標」→「実践」→「結果」→「目標」→．．．のループ。
多くの人が行っている。
ここで止まってしまうと、ループの中で得た経験を他のことに活かせないままとなってしまう。

##### ダブルループ
「目標」→「実践」→「結果」→「目標」→．．．と、「目標」→「実践」→「内省」→「法則化」→「目標」→．．．の2つのループ。
自分のルールを持って取り組み、結果に応じてルールを修正していく。
ルールを持っているので、結果のどこが悪かったかを理解して改善することができる。
更に、ルールを他の事象にも当てはめることができるので、良い結果をもたらしやすくなる。

## ためになったところ
* ダブルループの考え方
やったことをやったままにするのではなく、結果を受けて改善をしていくことが必要ということの認識はあったが、実行できていなかった。
今回、ダブルループという言葉と共に改善の流れを学べたことや、「ルールを持ちつつ、そのルールを修正していく」という考え方が学べたことで、改善に取り組むということのイメージが持てたように思う。
* 感情との向き合い方
ルールを修正する話に関連して、自分の感情との向き合い方に言及している箇所があった。
(「相手が本当はどう思ったかは分からない。あくまでも、相手がそう思ったのだと自分が考えているだけ」「自分がなぜそう感じるのかを理解することで、冷静な対処をすることができる」など)
ダブルループを回すうえでの考え方として言及された箇所であるが、同時にダブルループに限らず、仕事やその他日常においても前向きに過ごせるヒントであると感じた。

## まとめ
「振り返り、改善する」という行為をしていないことを意識させられる本でした。
ぼんやりとやらなければいけないという思いだけで止まっていたので、まずはダブルループに乗せるところから始めます。
この感想文も、何回か書いた後に自分のルールを持って改善する機会を設けてみたいと思います。
ありがとうございました。
[paiza]みかん農家に俺はなる！

# 命の水だ、ポンジュース（みかんみかんみかん
自分が中学ぐらいにメタルというジャンルを日本に広めた素晴らしいバンドだったと思う。

https://paiza.jp/works/mondai/c_rank_skillcheck_archive/mikan

# 面倒くさいので画面パタメータをListでもらった後のFunctionだけ
ちなみに引数のListを作ってる箇所は[こっちの記事](https://qiita.com/AsilHatake/items/842548e48ae4a0eae119)に書いてあるYO!!

```javascript:mikan.js
// [問題文（原文）]
// あなたはみかん農園を営んでいます。
// 収穫の季節になると、あなたはみかんを収穫し、重さごとに仕分けなければいけません。
// 仕分け作業は非常に時間がかかる作業なので、あなたはみかんを重さごとに仕分けてくれるプログラムを書くことにしました。
// みかんはある定数 N の倍数のうち、正の整数の重さが書かれた箱に仕分けられます。
// 例えば N = 10 の時、10 g, 20 g, 30 g ... のように仕分けられます。
// そして、そのみかんの重さが一番近い数の重さに仕分けられます。
// 重さが一番近い箱が複数ある場合、数が大きい方の箱に仕分けられます。
// 入力例 1 は以下のようになります。
// 24 g のみかんはより値の近い 20 g と書かれた箱に仕分けられます。
// 35 g のみかんは 30 g, 40 g の箱と差が同じです。この場合は数の大きい方の 40 g の箱へ仕分けてください。
// 0g に仕分けられることはないので、一番小さい重さに仕分けてください。
function mikan(lines) {
  // 入力は以下のフォーマットで与えられます。
  // 
  // N M
  // w_1
  // w_2
  // ...
  // w_M
  // 
  // ・ 1 行目にそれぞれ仕分ける重さの区切りを表す整数、みかんの個数を表す整数 N, M がこの順で半角スペース区切りで与えられます。
  // ・ 続く M 行のうちの i 行目 (1 ≦ i ≦ M) には、i 番目のみかんの重さを表す整数 w_i が与えられます。
  // ・ 入力は合計で M + 1 行となり、入力値最終行の末尾に改行が １ つ入ります。

  // すべてのテストケースにおいて、以下の条件をみたします。
  // 
  // ・ 1 ≦ N ≦ 100
  // ・ 1 ≦ M ≦ 10
  // ・ 1 ≦ w_i ≦ 1,000 (1 ≦ i ≦ M)
  if (!Array.isArray(lines) || lines.length < 1) {
    console.log("2行以上入れろや！");
    return;
  }
  // 1行目チェック
  const sp = lines[0].split(' ').map(v => Number(v));
  if (sp.length !== 2 && !sp.every((v) => Number.isInteger(Number(v)))) {
    console.log("数値 数値 の形式で入れろや！");
    return;
  } else if (sp[0] < 0 || sp[0] > 100) {
    console.log("1行目：1つ目の数値は1～100の範囲で入れろや！");
    return;
  } else if (sp[1] < 0 || sp[1] > 10) {
    console.log("1行目：2つ目の数値は1～10の範囲で入れろや！");
    return;
  };
  // みかんチェック
  const mikans = lines.slice(1).map(v => Number(v));
  if (sp[1] !== mikans.length) {
    console.log("みかんの数が合わないんや！");
    return;
  } else if (!mikans.every((v) => Number.isInteger(Number(v)) && v >= 0 && v <= 1000)) {
    console.log("みかんの重さは1～1000の整数で入れろや！");
    return;
  }

  // 仕分けるべき重さを以下の形式で出力してください。
  // 
  // 
  // y_1
  // y_2
  // ...
  // y_M
  // 
  // ・ 期待する出力は M 行からなります。
  // ・ i 行目 (1 ≦ i ≦ M) にはそれぞれ i 番目のみかんの仕分け先の重さを表す y_i を出力して下さい。
  // ・ すべて整数で出力してください。
  mikans.forEach((mikan) => {
    if (mikan < sp[0]) {
      // 0 gに仕分けられないので、1番小さい重さを出力
      console.log(sp[0]);
    } else {
      if (mikan % sp[0] === 0) {
        // ぴったりサイズならそのまま出力
        console.log(mikan);
      } else {
        const near = Math.floor(mikan / sp[0])
        // 近いサイズ
        const near1 = near * sp[0];
        // 次のサイズ
        const near2 = (near + 1) * sp[0];
        // diff
        const diff1 = mikan - near1;
        const diff2 = near2 - mikan;
        console.log(diff1 >= diff2 ? near2 : near1);
      }
    }
  });
}

module.exports = {
  mikan
};
```

ifがだいぶ多い気もするけど結局のところ
・みかんが基準値（最小の箱）より小さければ、最小の箱に入れる
・みかんを基準値で割ってピッタリ割れるなら、そのまま出す
・みかんを基準値で割った数に基準値をかけて下側の箱を割り出す。
　割った数に1足してから基準値を掛けて上側の箱を割り出す。
　それぞれの値とみかんとのDiffとって、
　同じか上側の箱に近かったら上の箱の値を表示、
　ソレ以外なら下の箱を表示

最後だけなんかややこしくなってるけど、きちんと頭で整理すればチョチョイのJOYやで！
決定変数を分母にした割合で制約を作る

数理最適化で決定変数を分母にした割合を制約にしたいことがあります。

以下の問題は、CPLEXのOPLで書いた「卓上電話と携帯電話を何個作るか」という問題です。
```java
//卓上電話の数
dvar float+ desk;
//携帯電話の数
dvar float+ cell;

maximize 12 * desk + 20 * cell;
subject to {
  desk >= 100;
  cell >=100;
  0.2 * desk + 0.4 * cell <= 400;
  0.5 * desk + 0.4 * cell <=490;
}
```

ここに「全電話のうち卓上電話を30%以上にする」という制約を追加したいとします。
しかし以下のように記述すると、決定変数である「(desk+cell)」で割り算することになり、非線形になってしまうため失敗します。
```java:エラーになる
//全電話の内、卓上電話を30％以上にする
desk/(desk+cell)>=0.3;
```
* エラーメッセージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a47835d1-db15-398b-b8e5-4ea4a4a4f19f.png)

```java
記述/説明
CPLEX(default) cannot extract expression: 0.3 <= desk / (desk+cell).
CPLEX(default) cannot extract expression: desk / (desk+cell).
```


分母である「(desk+cell)」を両辺にかけて、右辺の掛け算の式にすると解けるようになります。
```java:分母を両辺にかけて、掛け算の式にすると解くことができる
//全電話の内、卓上電話を30％以上にする
desk>=0.3*(desk+cell);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ae2974ab-443f-a6f4-4e86-af3e31516326.png)
VBAにおける整数化について

ロックマンです。

今回は最近触ってるEXCELツール（VBAマクロ）の作成時の気付きについて忘備録として記事を挙げさせていただきます。（その２）

# 最初に
**VBA嫌いじゃ～～～～～～～～～～～～～～～～～～～～！！！！！！！！**
　　:
　　:
こほん。

## やりたいこと
実数（小数点付き）のデータを整数化をする。
今回の要件では切り捨てをおこなう事になった。

## 初めにどう考えたか？
Roundがあることは知っていた。ので

Floor,ceil的な物があるだろうと思った。
ないんだな、それが（画像略)

後はだいたいCastすればだいたい解決できると思った。
そうはならなかった。ならなかったんだよ、ロック（画像略）

## 実験対象
以下の処理を行う。

* Int(数値)
* FIX(数値)
* CInt(数値)
* Application.WorksheetFunction.RoundDown(数値,桁数)

# 実証

## IntとFix

結論としては、この2つで切り捨てはできました。
プラス値では挙動は同じですが、マイナス値のときに挙動が変わります。

>Int と Fix はどちらも、number の小数部分を除去して、結果の整数値を返します。 Int と Fix の違いは、number が負の場合、Int は number 以下で最初の負の整数を返すのに対し、Fix は number 以上で最初の負の整数を返します。

https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/int-fix-functions

コード
```
Dim p1 As Double, p2 As Double, p3 As Double
Dim m1 As Double, m2 As Double, m3 As Double

p1 = 0.5: p2 = 1: p3 = 1.5
m1 = -0.5: m2 = -1: m3 = -1.5

Debug.Print (Int(p1) & " " & Int(p2) & " " & Int(p3))
>>> 0 1 1
Debug.Print (Int(m1) & " " & Int(m2) & " " & Int(m3))
>>> -1 -1 -2

Debug.Print (Fix(p1) & " " & Fix(p2) & " " & Fix(p3))
>>> 0 1 1
Debug.Print (Fix(m1) & " " & Fix(m2) & " " & Fix(m3))
>>> 0 -1 -1
```

## RoundDownとCast(Cint)

**RoundDown**はマークシート関数ですが、結果としては**FIX**と同じ挙動になります。が私としてはワークシート関数は可読性が悪いので極力使わないに越したことがないので、**FIX**でええやんとなります。

問題は**CAST(CInt)**、コードをみてもらうと分かりますが。
0.5が 0、1.5が 2 になります。...四捨五入じゃない！？

これはCastの記事に書いてありました

>小数点以下が 0.5 の場合、CInt および CLng は、常に一番近い偶数に数値を丸めます。 たとえば、0.5 は 0 に、1.5 は 2 に丸められます。

https://learn.microsoft.com/ja-jp/office/vba/language/concepts/getting-started/type-conversion-functions

なんでそうなんねん！！！！！！！！

コード
```
    Dim p1 As Double, p2 As Double, p3 As Double
    Dim m1 As Double, m2 As Double, m3 As Double
    
    p1 = 0.5: p2 = 1: p3 = 1.5
    m1 = -0.5: m2 = -1: m3 = -1.5
    
    Debug.Print (Application.WorksheetFunction.RoundDown(p1, 0) & " " & Application.WorksheetFunction.RoundDown(p2, 0) & " " & Application.WorksheetFunction.RoundDown(p3, 0))
>>> 0 1 1
    Debug.Print (Application.WorksheetFunction.RoundDown(m1, 0) & " " & Application.WorksheetFunction.RoundDown(m2, 0) & " " & Application.WorksheetFunction.RoundDown(m3, 0))
>>> 0 -1 -1
    
    Debug.Print (CInt(p1) & " " & CInt(p2) & " " & CInt(p3))
>>> 0 1 2
    Debug.Print (CInt(m1) & " " & CInt(m2) & " " & CInt(m3))
>>> 0 -1 -2

```

# 結論

なんでそうなんねん！CAST
Grafanaで２軸複合グラフを作る

以下のようなグラフを作ってみました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242268/6e8f2a0d-3d51-75ed-9962-2a5e8e79eba2.png)
元ネタはこんな感じのデータです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242268/df3c7d93-4298-8b84-3f4e-d5ec9a82f6e0.png)

選択するVisualizationsは、Business Charts
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242268/5d5394c1-6e6c-9032-21d0-03f8477bbb1e.png)

まずはPostgreSQLでテーブルを作ります。
```
CREATE TABLE "売上高" (
"年"        decimal(4,0) not null,
"売上高"    decimal(9,0),
"社員数"    decimal(9,0),
PRIMARY KEY("年")
);

INSERT INTO "売上高" VALUES (1993, 202487, 5451);
INSERT INTO "売上高" VALUES (1994, 230507, 5492);
INSERT INTO "売上高" VALUES (1995, 263510, 5660);
INSERT INTO "売上高" VALUES (1996, 319100, 6065);
INSERT INTO "売上高" VALUES (1997, 330028, 6489);
INSERT INTO "売上高" VALUES (1998, 311724, 6621);
INSERT INTO "売上高" VALUES (1999, 307119, 6316);
INSERT INTO "売上高" VALUES (2000, 314246, 6272);
INSERT INTO "売上高" VALUES (2001, 303657, 6251);
INSERT INTO "売上高" VALUES (2002, 298198, 6236);
INSERT INTO "売上高" VALUES (2003, 316578, 6222);
INSERT INTO "売上高" VALUES (2004, 342537, 6294);
INSERT INTO "売上高" VALUES (2005, 380277, 6297);
INSERT INTO "売上高" VALUES (2006, 402886, 6379);
INSERT INTO "売上高" VALUES (2007, 437616, 6585);
...
```

左のクエリー(Query)は以下の形、テーブル、カラムを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242268/a506658e-4df4-5ef8-090a-3115ae7d4218.png)

年で順番が必要なのでソート（Order by)も指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242268/f9749feb-4787-40b2-47ed-f6059d7d1959.png)
件数（Limit)の箇所はデフォルトで50という値が入るんですが、未入力にしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242268/e8e868b3-3467-16a4-693a-479694fda094.png)

VisualEditorのDataset Itemsの箇所には、列名、年、売上高、社員数の順で登録しておきます。Seriesの箇所は何も設定しません。コードで補完します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242268/d7cf4ef3-1316-12fa-88d9-0d2dcb02ef9c.png)

コードの箇所です。２軸あると両側のＹ軸の目盛がどちらからわからなくなるので色を変えて分かりやすくします。yAxisIndexの指定でグラフの描画（高さ）が変わってくるので必ず指定します。
```
return {
  dataset: context.editor.dataset,
  series: [
    {
      type: 'bar',
      name: "売上高",
      color: 'blue',
      yAxisIndex: 0,
    },
    {
      type: 'line',
      name: "社員数",
      color:'green',
      yAxisIndex: 1,
    },
  ],
  xAxis: {
    type: 'category',
  },
  yAxis: [
    {
      type: 'value',
      name: '売上高(百万円)',
      min: 0,
      max: 1000000,
      interval: 100000,
      axisLabel: {
        color: 'blue'
      }
    },
    {
      type: 'value',
      name: '社員数(人)',
      min: 0,
      max: 10000,
      interval: 1000,
      axisLabel: {
        color: 'green'
      }
    }
  ]
}
```
asp.net の hideenfield値更新がうまくいかない

asp.net の hideenfield値更新で詰まったため備忘録

⚪︎操作手順(ソースは割愛、、)
1.親画面から小画面を呼び出し
2.小画面更新時に親画面のクライアント側のリロードイベントを呼び出し

⚪︎事象
小画面更新時、親画面のリロードイベントが正常に呼び出され、Hiddenfieldの更新処理も正常に実施
画面描画後、開発者ツールにてHiddenfieldの値が更新されておらず

⚪︎対応
Hiddenfieldの定義をUpdatepanel内に移動


なぜUpdatepanel内にいると更新されるのか分からず、、
初歩的な事象なのかも知れませんがまた1つ賢くなりました笑
私のプログラミングスクール通いが上手くいかなかった理由

# ITを学ぶ上で基礎となる知識が足りなかった
　講師の言っていることや講師の紹介しているHPに書いてある内容でわからないところがいくつもあった。一つ一つ検索して調べると、膨大な時間がかかり、授業のスピードついていけなくなった。
# 英語が読めなかった
　プログラミングというのは1文字でも間違えたら動かない英語の作文と言えるので、英語の意味がわからないと、自分で自分が何をやっているのかわからなくなる。コードを間違えてエラーを起こしても、なぜエラーになっているのか理解できず、エラー文が読めない。
 　プログラミングで使うソフトのサービスで使うHPもこれまた英語で書かれているので、英語が読めないとこれもまた全く意味がわからない。単語の一つ一つを検索したり、翻訳をソフトを使えばいい話かもしれないが、それをやること自体がタイムロスを生み、それの積み重ねが授業に追いつけないといった状態になる。
# 講師にどう質問すればいいのかよくわからなかった
　上記の2つの要素によって、自分で自分が何をやっているのかよくわからない状況になっているため、講師に聞くにも「自分が何をやりたくて」「エラーの何が出て何が困っていて」「何をどうしたいのか」といったことがわかっていないので、ロクな質問ができなかった。
 　検索で調べるにもどういった言い回しで検索したりChatGPTに聞けばいいのかもわからなかった。
  # ChatGPTの学習の弊害
  　基礎知識がない状態でChatGPTに質問文を打ち込んでアプリを作っているので、自分で自分が何をやっているのかわからない状態で、作業が進んだりエラーがで出て作業が遅れたり、といったことになった。
   　自分でアプリ制作の進行度をコンロールできないとなると、ChatGPTの出た結果次第になり、双六で賽の目を振って進んだマスに書いてあるイベントが起こるような状況で目も当てられなかった。これが仕事だと考えるとゾッとしてしまう。
# 対策
　思った以上に、モニタ越しで文章を読むといった行為は、頭に入らないので参考書で勉強した方が遠回りで近道だと思った。
　英語の単語帳を読んで読める単語を増やす。
　ITの用語帳を読んでわかるIT用語を増やす。
 　ChatGPTの参考書を読んで質問文のレパートリーを増やす。
  　勉強したい言語があったら参考書を一通り読んでうろ覚えでもいいから頭に入れる。
GR-CITRUSについて

せっかくRX210をいじったので、秋月電子で処分価格（税込1500円 2024/8現在）になっていたのでGR-CITRUSも入手してみました。

ChromeやVSCODEの拡張機能でmrubyが開発できるようです。

内部的には以下のようになっていると思われます。

![GR-Flash.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/9c8b09de-5333-f70b-4baa-3c57130e3e57.png)

RESETボタンを押しながらUSB接続するとUMASSが起動します。押してないとパスされDOWNLOADERが起動します。

IDE側にmrbcがいて、MRBを作ってDOWNLOADERに渡してData Flashに書き込んでいるのではないか思われます。

MRBはData FlashではなくCode Flashの方に置いてるのかもしれません。

DOWN LOADERはWindowsではCDCのドライバをインストールするとシリアルで見えるようになります。

```
EEPROM FileWriter Ver. 1.77.v2
 Command List
 L:List Filename..........>L [ENTER]
 W:Write File.............>W Filename Size [ENTER]
 G:Get File...............>G Filename [ENTER]
 F:Get File B2A...........>F Filename [ENTER]
 D:Delete File............>D Filename [ENTER]
 Z:Delete All Files.......>Z [ENTER]
 A:List FAT...............>A [ENTER]
 R:Run File...............>R Filename [ENTER]
 X:Execute File...........>X Filename Size [ENTER]
 S:List Sector............>S Number [ENTER]
 .:Repeat.................>. [ENTER]
 Q:Quit...................>Q [ENTER]
 E:System Reset...........>E [ENTER]
 M:Drive Mount............>M [ENTER]
 U:Write File B2A.........>U Filename Size [ENTER]
 T:'>'Auto Print Switch...>T [ENTER]
 C:License................>C [ENTER]

WAKAYAMA.RB Board Ver.CITRUS-2.35(2017/10/25)f3(256KB), mruby 1.2.0 (H [ENTER])
```

JP1(MD)をショートすると以下のデバイスとして認識されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/21cd3472-c39f-de2e-be21-a6a80d179a2a.png)

Renesas Flash Programmerで認識できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/815032fd-8909-304b-cdd4-2bd87eacb70a.png)

これをするとUMASSなど消えちゃうみたいです。^ ^;
AWS Certified Data Engineer - Associate(DEA-C01)を受験してみた

# はじめに
先月に「AWS Certified Data Engineer - Associate」(DEA-C01)を受験しました。

# スコア
**840/1000**

無事に合格できました。
やはり、Professional系の試験と比較して問題文・選択肢の文章量がすくなく、気が楽でした。
難易度については、以前から業務で出題範囲内のGlueやらRedshiftを使ってたこともあり、勉強中もイメージしやすかったように思います。

# 受験対策

### Web問題集
3～4周くらい実施しました。

https://cloud-license.com/

### 公式練習問題

#### Exam Prep Official Practice Question Set: AWS Certified Data Engineer - Associate(DEA-C01 - Japanese)
こちらについても何周か実施しています。

# 受験方法
テストセンターで受験しました。
試験に集中したいというものあり、テストセンターでの受験を個人的におすすめしています。
受験日が平日の昼間だったというのもあり、空いていました。

# 対策と受験の心構え
あらかたプロフェッショナルや専門知識の試験を受けたからではありますが、アソシエイトの問題が易しく見えました。難易度的にはDVAと同じくらい？と思っています。
とりあえずいつも通り、わからない問題はチェックを付けて飛ばす、すべての問題に回答するなどを意識して問題を解きました。
大体の問題が解き終わったあとに一通りの見直しを実施して、1時間弱でテストセンターを退出しました。

# おわりに
合格できてよかったです。
次は専門知識の機械学習・ネットワークあたりに挑戦したいと考えています。

# AWSの相談・お困りごとありましたら、、、

AWSの活用方法や、お困りごとの相談、随時、お仕事の受付しております。

https://www.cs-cloud-aid.com/
2024年8月 AIOps 定点観測

# 概要
AIOps の動向や学習のため、Google で AIOps を検索した結果を記録している記事です。

# 2024年8月2日の検索結果 (リスティング広告)

![スクリーンショット 2024-08-02 101119.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/3abde8b0-5c24-4e99-4542-edad84f7fff3.png)

* Splunk
* Pure Storage
* ServiceNow
* オージス総研

Splunk がトップで Pure Storage と ServiceNow が続いています。オージス総研が初登場です。

先月の結果はこちら --> [2024年7月 AIOps 定点観測](https://qiita.com/mkodera/items/ba44d52db1f743367ce3)

# 2024年8月2日の検索結果 (広告以外)

![スクリーンショット 2024-08-02 101228.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/b5e72c57-d615-4da8-89ae-960289ae6749.png)

* HPE
* AWS
* IBM
* Monstar Lab
* ServiceNow

HPE が不動のトップで AWS と IBM が続いています。Monster Lab が初登場です。

先月の結果はこちら --> [2024年7月 AIOps 定点観測](https://qiita.com/mkodera/items/ba44d52db1f743367ce3)
VisualStudio教えろ(クソ備忘録)

VisualStudioインストールしたもののその後の作業指示が丸投げでビルドしろと言われたもののビルドの手順があっているかわからずエラー内容からプロジェクトに使われてる.NetFrameworkのバージョンを確認しようとしたもののプロジェクトのプロパティが表示されずどうしたらいいんだと猫ミームの叫び猫のように叫び散らかしたくなったけどグッとこらえてようやく解決した備忘録

## プロジェクトの開き方
__VisualStudioでプロジェクト・ソリューションを開くには.slnファイルを開かないとダメ__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/990851/adb603ea-1dca-b57c-ef8b-dfa3bc724b6e.png)
ファイル＞開く＞プロジェクト/ソリューションを選んで、プロジェクトファイルを開く。(sln以外にもある？)

VSCodeの感覚で「フォルダを開く」でどうにかしようとしてはいけない。(戒め)

## 参考になった操作録

https://xn--u9jvb8ha7qwbyd4a1d8746d4o1a.com/get-started-programming/get-started-visualstudio/

## 結び(愚痴)

~~そもそも俺何でこんなことやってるの専門外でしょいい加減ちゃんとしてくれ~~
馬鹿がよ(自分)
プロフェッショナルの方々が読んでいたら自分にもこんな頃があったかもしれないと鼻で笑いながら通り過ぎてくだちい。
非常にイラつきますので今日はお高めの弁当買って食べます。
Tableau CloudのHyperforce移行

# Hyperforceの概要
- Salesforceのサービスを共通のクラウドプラットフォームで運用
- Data Cloudなどはもうすでにプラットフォーム上で稼働が始まっている
- Tableau Cloudはこれからプラットフォーム上に移行

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3333313639302f34353733646232622d663038342d633461662d646465632d3134383834366333636162612e706e6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394381/0424c21b-d190-f2bc-d6fd-cf32b595c643.png)

# Hyperforceの特徴

- データレジデンシー
    - 3AZ
- 拡張性
- セキュリティ
    - ゼロトラストとか
- プライバシー
    - データの透明性と管理
        - トランスペアレンシー
- 俊敏性
    - ゼロダウンタイムの更新
    - テスト環境の提供

### 3AZ全体のレジリエンス

- 3つのAZで構成
    - レジリエンス、可用性、パフォーマンスの向上
    - 3つは100km圏内に存在
- ユーザからのリクエストが合った場合
    - ロードバランサーで3つの可用性ゾーンのいずれかのどこかに割り振り
    - データ更新のときだけプライマリDBノードにアクセス
- 1つのプライマリDBノードと2つのセカンダリDBノードで構成
    - 3つのAZにそれぞれ1つ
    - セカンダリがダウンしたときは他の2つで補う
    - プライマリがダウンした際にはセカンダリをプライマリとして利用

# Hyperforceへの移行の理由
- 信頼性の向上
    - 3AZの導入
    - セキュリティの強化
- メンテナンス時間の削減
    - メンテナンス頻度やダウンタイムの削減
- 顧客価値
    - 拡張性のあるアーキテクチャ
    - プライベートコネクト
    - データ暗号化

# 移行の概要 事前通知と当日の留意点
- 日本のリージョンの移行予定は今年の年末あたり
    - ポッド内の通知やメールでの通知が事前にある
    - 90日前、45日前、15日前、当日
- 通知メールの内容
    - 対象ポッドの移行日時
    - メンテナンス時間の予定など
- 当日のメンテナンス時間は約6時間
    - 日曜日1:00-7:00
    - その時間はtableau cloudにアクセスできない
    - その時間に割り振られたタスクは更新後に実行される

# 移行に際して必要な対応
- IPアドレスの変更 IP Filterなど
    - ドメイン名を解析してIPアドレスを直接叩いている場合はIPが変更される
        - Ingress IPは公開しているものではないので公開されているドメイン名を利用するように変更を推奨
    - ホスト名、URLの変更はないため、プロキシ設定の変更は不要
        - IPアドレスを使っている場合はドメイン名に変更してください
    - Tableau Cloudの(Egress)IPアドレスをプロバイダなどで設定している場合はHyperForceのTableau用のIPアドレスレンジに変更が必要(移行前に新IPアドレスを追加し、移行後に旧IPアドレスを削除しよう)
    - IPアドレスレンジは今後変更されることがある
        - ベストプラクティス的には2週間に1度くらいは確認
    - IPアドレスレンジは他社から貸し出されたものではなく全てSalesForce社が保有

- Tabcmd1.0のサポート廃止
    - 元々Tabcmd1.0は非推奨
    - まだ使っている場合はTabcmd2.0に移行する必要がある

- Hyperforce以降完了後にBridgeの再接続が必要
    - 基盤が変わるのでTableau Cloudに接続状態の場合は接続状態が失われる
    - Rebootとかで再接続する

## 補足

- 個別の対応：延期や別日にはできない
- 移行の状況確認
    - Salesforce trust > tableauページにて公開されるメンテナンス状況を見て
- APIや組み込みAPIの変更はない
Oracle Analytics Cloud：このビジュアライゼーションは予測をサポートしていませんとでたときにの対処例

はじめに
---
Oracle Analytics Cloud (OAC) で、予測を使おうとしたら、このビジュアライゼーションは予測をサポートしていません。とでることがあります。そんなときの対処について試してみました。
![g1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/f73b7454-841c-be25-f239-e8003fd606c1.png)

記載時のOACバージョン：OAC 2024 Jul版

使用データ
---
下図のデータセットを利用します。数値型の列である年数を使います
![g3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/9ece7dd5-ffce-eb39-e7f4-87107221256b.png)

年数、販売金額を使った折れ線グラフに予測を追加してみる
---
数値型の列である年数と販売金額を使って、折れ線グラフを作成します
![g4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/66c6286d-76da-e05d-c0b2-802d6a56c520.jpeg)

左上部の"分析"タブを開きます
![g5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/082dc1b1-3b83-ae34-2984-4207b63c53ad.jpeg)

"予測"をドラッグし、右部の折れ線グラフのビジュアライゼーションにもっていくと、"このビジュアライゼーションは予測をサポートしていません"がでて、予測を追加することができません
![g6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/85386d03-f48e-89b6-1ef9-f3512062db93.jpeg)

数値型の年数の列を、日付型に変換し予測する
---
日付型の列を用意します。本書では、データセットの編集画面を開き、年数の列を複製、複製した列を編集し日付型の列を追加する例です。
to_datetime関数を利用するためcast関数で数値型からテキスト型に変換したものを、to_datetime関数を使って日付型に変換しています。
下部の検証をクリックし、列の名前を年数(DATE型)に変更、ステップの追加をクリックします。
![g7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/380ce397-187c-9c23-3e56-34e01859d18f.jpeg)

その後、データセットを保存します

ワークブックに戻り、数値型の列をDATE型の列におきかえます。年数(DATE型)を配置します。
![g8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/f8ba2300-fb34-c2ee-e3b0-e6442daa5269.jpeg)

左上部の分析タブを開き、予測をドラッグ、右部にもっていき、ドロップします
![g9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/34c36fbd-c96c-213d-8e58-44c2f2827f60.jpeg)

予測を追加できました。
![g10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/5033e0d8-dab2-cd62-19f2-b933262b350b.jpeg)

まとめ
---
日付型の列を使うと、"このビジュアライゼーションは予測をサポートしていません"のメッセージは表示されず、予測を追加することができました。

以上
CPLEX Optimization Studioのデータ・ビューでfloat型の決定変数を見やすくする

CPLEX Optimization Studioのデータ・ビューでは、決定変数の結果を簡単に見ることができて便利です。
しかしながら、float型の配列の場合、感度分析の情報もでてくるので、結果だけを見たい場合はちょっと見にくくなってしまいます。

１次元配列の場合
```java
dvar float+ product [Ptype];
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b1fd3822-e14b-a7f1-0095-f435945b7ce3.png)

２次元配列の場合
```java
dvar float+ product [Ptype][Years];
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c8ce8a91-25d3-6759-8345-69fc500c9b3c.png)

データビューで見やすくするためには、別の変数を作ってそこにコピーすれば結果だけを見ることができます。

# １次元配列の場合
以下productRという変数を作って決定変数のproductからコピーしました。

```java
float productR[Ptype];
execute{
  for(i in Ptype){
    productR[i] = product[i]
  }
}    
```

結果データという中にproductRができて結果のみが参照できています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/08ce57d2-1bbe-5a88-5778-9abb264c284f.png)

# ２次元配列の場合
同様にproductRという変数を作って決定変数のproductからコピーしました。

```java
float productR[Ptype][Years];
execute{
  for(i in Ptype){
    for(j in Years){
      productR[i][j] = product[i][j]
    }
  }
}    
```
やはり結果データという中にproductRができて結果のみが参照できていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/69b64e9c-b7ea-6c2e-4ca3-db0bf08574be.png)
Re:ECS タスクの停止理由を Slack へ通知してみた

# はじめに
暑い日々が続きますね。
なんだかんだでAI界隈に中々DeepDiveできない [@\_\_\_nix___](https://twitter.com/___nix___)  です。

# 背景
「ECS のタスク停止理由を Slack に通知してみた」をテーマにすると、ECSタスク停止後の昇天までの時間は1時間以内ということで皆さん様々なご苦労をされているかと思います。

* 1時間以内にログを確認
* EventBridgeでストップイベントをフック
* 等々

そこで先日（勝手に）リスペクトしているたかくにさんが次のようなブログを執筆してました。

https://dev.classmethod.jp/articles/ecs-task-stop-reason-slack-notification/

これ、めっちゃ便利やん！と思いながらも画面見ながらポチポチし、「ここはこうかな？」と考えながらAWSマネージドコンソールとにらめっこするのがツラミでした。

「それならもうIaC(Terraform)で書いちゃおう！」という勢いで進めて行こうと思いますが、更にアーキテクチャをシンプルにした実装をご紹介します。

# 概要
## EventBridge API Destinations
みなさん、EventBridge に **API Destinations** という仕組みがあることをご存知でしょうか。

https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-api-destinations.html

実はこの仕組みを使うと SNS や Chatbot を経由しなくても Slack に簡単に通知が出来てしまうのです。

## アーキテクチャ
ではアーキテクチャの紹介です。ドン！
しっかりとたかくにさんの魂を受け継いでいます。
![](https://storage.googleapis.com/zenn-user-upload/fc6c2d681369-20240801.png)

## ダイアグラム
AWSリソースのそれぞれの役割と仕組みです。
難しそうに見えますが、実はほぼ EventBridge の機能です。
![](https://storage.googleapis.com/zenn-user-upload/27ee5151a6b8-20240801.png)

## 通知例
こちらもたかくにさんのテンプレートを踏襲しています。
しかも痒いところに手が届いた情報も！（これはきっと嬉しいでしょう）
![](https://storage.googleapis.com/zenn-user-upload/0ee13cc70dfd-20240801.png)

# 実装
## 準備
さて、ここまでを読んで少しは胸が高揚してきたでしょうか。
IaC(Terraform) でやり切るという宣言通りみなさんにも簡単に実現できる方法をご用意しました。

https://github.com/nix-tkobayashi/aws-ecs-task-monitoring-slack-notification

## 始め方
リポジトリからCloneして、terraform.tfvars で以下の3つの変数を設定するだけです。
その他の手順は README.md をご覧ください。
```
aws_region         = "ap-northeast-1"
slack_webhook_url  = "https://hooks.slack.com/services/XXXXXXXXX/YYYYYYYYY/ZZZZZZZZZZZZZZZZZZZZZZZZ"
cluster_name       = "my-ecs-cluster"
```

# 終わりに
「Re:ECS のタスク停止理由を Slack に通知してみた」は如何でしたでしょうか。

恐らく多くの環境で既に通知やデータ蓄積等の仕組みが実装されているかと思いますが、「こんな軽量なアーキテクチャで出来るなら！」とリファクタリングを検討される方もおられるのではないでしょうか。

通知のカスタマイズもコードを少し変えれば良いのでご自由にアレンジしてください。
payload が間違っていていつまでも通知が来ないとかにはご注意を^^

# 一言
最後に改めてたかくにさん及びその記事に感謝申し上げます。

気安くお名前を連呼させて頂きましたが、面識はございませんｗ
どこかでAWS界隈の方と仲良くできる日を楽しみにしております。

この記事良かったと少しでも思って頂けたら是非 [@\_\_\_nix___](https://twitter.com/___nix___) をフォローしてあげてください。或いは記事に対してリアクションをお願い致します。
競プロで使わないほうが安全な変数名

競技プログラミングでは短い変数名を使いがちです。
それ自体は問題ないのですが、 **変数名として `rm`, `del`, `erase` を用いるべきではありません。**
`RM`, `Del` など大文字が含まれるものも同様に不適です。

これらは Bash・コマンドプロンプト・PowerShell などで削除コマンドとして使われます。
例えば Bash で `rm a.txt` を実行するとファイル `a.txt` が削除されます。
そのため、変数名に `rm` などを使うと、提出時のコードのコピペの際に誤ってターミナルにコードを貼り付けた場合、コマンドとして解釈され、ファイルを削除してしまう事故が起きやすいです。

特に Python などで `rm = [0] * 100` と書いている行を bash などのシェルに貼り付けた場合、 **ディレクトリ内の全ファイルが削除されてしまいます。**
`*` が全ファイルを表すためです。`rm *` と同じ結果になります。

「消えたかどうかのフラグ」などでつい上記の変数名を使いたくなることがあるかもしれませんが、避けるのが安全です。
Windowsで特定フォルダーへのショートカットをタスクバーに設置

# やり方

まず設置したいフォルダーのショートカットを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/f1ef5f18-2640-410b-daff-af90741d9c40.png)

ショートカットのプロパティを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/783e29e5-15da-d083-690b-043aeb52829a.png)

リンク先の先頭に『C:\Windows\explorer.exe 』を付けて適用します。
『.exe』とフォルダーパスの間に半角スペース必要なので注意。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/1bc96e99-9b2d-51a7-e982-8937801bfa86.png)

最後に『タスクバーにピン留めする』を設定すればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/2ff14742-9d88-8d3f-f142-6610559fb205.png)

こんなふうにタスクバーに設置されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/698ec9fd-ee70-2962-e267-796e46f9bc79.png)

**タスクバーのアイコンクリックするだけでフォルダーが即開く** ので、かなり頻繁に使うフォルダーはこうしておくと便利です。

# 参考サイトさん

https://usedoor.jp/howto/digital/pc/windows-folder-pindome-on-taskbar/

# バージョン

Microsoft Windows [Version 10.0.22631.3880]
ECS Fargate で Secrets Manager の内容を環境変数に一括でセットする

# はじめに
皆さんご存知の通り、ECS Fargate は タスク定義で Secrets Manager と連携し、自動で環境変数にSecret値をセットすることが可能です。
[Amazon ECS の Secrets Manager シークレットを使用した機密データの指定](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/specifying-sensitive-data-tutorial.html)

利用方法は簡単でタスク定義の環境変数で「値のタイプ」を「ValueFrom」にするだけです。
値に「シークレットの ARN」を指定した場合は Secrets Managerのシークレット全体（JSON）が環境変数にセットされます。
値に「キーまで含めたARN」を指定すると、指定したキーと値の環境変数がセットされます。
そのため、通常、タスク定義ではキーまで指定しておくことになりますが、その場合、環境変数が増えるたびにタスク定義を更新する必要があります。
一方で、CodeDeployなどではタスク定義の新しい環境変数を自動でセットする簡単な方法はありません。
そのため、CodeBuildやStepFunctionを組み合わせたり、またはIaCで更新する必要があります。
。。。。
めんどくさい。そう、めんどくさいのです！！
という訳で今回タスク定義にはSecrets ManagerのシークレットのARNを設定し、環境変数にセットされたJSON値を解析し、JSONのキー・バリューで環境変数をセットすることにしました。

# 早速結論
まず、今回は go のプロジェクトで利用したため Dockerfile は下記としました。
```
FROM golang:1.22-alpine3.20

ENV LANG C.UTF-8
ENV TZ Asia/Tokyo

WORKDIR /app
COPY . /app

RUN apk update && \
    apk upgrade && \
    apk add --no-cache \
    jq

RUN chmod 755 /app/docker-entrypoint.sh
RUN go mod tidy
RUN CGO_ENABLED=0 GOOS=linux go build -o /tmp/main ./api

EXPOSE 1323

CMD ["/app/docker-entrypoint.sh"]
```
ポイントはJSONを分割するために使用する「jq」をインストールしておくこと、docker-entrypoint.sh を作成しておくことです。

次にdocker-entrypoint.sh は下記のようにしました。
```
#!/bin/sh

echo $SECRETS_JSON | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" > ".env"

while IFS="=" read -r key value; do
  key=$(echo $key | tr -d '[:space:]')
  export ${key}="${value}"
done < ".env"

rm ".env"

/tmp/main
```
docker-entrypoint.shの作成はかなり時間がかかりました。
まず、「#!/bin/sh」である必要がありました。bash や zh などは alpine ではインストールされていないらしく、docker-entrypoint.sh が見つからない（no such file or directory）と言われてしまいます。
docker run -it xxxx ls で確認してもファイルあるじゃん！！となっていたので気づくまでに、かなり時間がかかりました。
次に、JSONファイルからKey=Valueのセットのファイル（ここでは.env）を作成します。
これは次のwhileで利用するためですが、例えば下記のような書き方はダメでした。
```
echo $SECRETS_JSON | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" while IFS="=" read  key value; do
  key=$(echo $key | tr -d '[:space:]')
  export ${key}="${value}"
done
```
これはパイプ「|」を利用していることが問題で、while内のexportで設定した環境変数が外に反映されないためです。
そのため、先にファイルを作成することでパイプ「|」を利用しないようにしました。


最後にタスク定義の環境変数は下記で設定しておきます。
キーがSECRETS_JSONでSecretsを選択し、値が Secrets ManagerのシークレットのARN です。
```
"secrets": [
  {
    "name": "SECRETS_JSON",
    "valueFrom": "arn:aws:secretsmanager:ap-northeast-1:xxxxxxxx:secret:xxxxxx/xxxxxxx"
    }
],
```

# まとめ
以前から環境変数をいい感じに設定できないかなぁと思ってましたがこれで自動的に設定されるようになりました。
アプリケーション起動時に Secrets manager から取得してましたが、ビジネスロジックではないため悶々とさせられてましたが開放されてスッキリしました。
もっと良い方法があればぜひ教えてください！！
システムテーブルを用いたDatabricksアシスタントのモニタリング

こちらのアップデートです。

[システムテーブルによるDatabricksアシスタントアクティビティの監視 (パブリックプレビュー)](https://docs.databricks.com/en/release-notes/product/2024/july.html#monitor-databricks-assistant-activities-with-system-tables-public-preview)

> システムテーブルを用いることで、ダッシュボードでDatabricksアシスタントのアクティビティを監視できるようになりました。詳細は、[Databricks Assistantシステムテーブルリファレンス](https://docs.databricks.com/ja/admin/system-tables/assistant.html)をご覧ください。

[アシスタントシステムテーブルダッシュボード](https://docs.databricks.com/ja/admin/system-tables/assistant.html#assistant-system-table-dashboard)に説明があります。

こちらのGithubにある[jsonファイル](https://github.com/databricks/tmm/blob/main/System-Tables-Demo/Assistant-Events/databricks-assistant-metrics.lvdash.json)をダウンロードします。

**ダッシュボード**に移動し、**ダッシュボードを作成 > ファイルからダッシュボードをインポート**を選択します。
![Screenshot 2024-08-02 at 9.27.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1e5d72c6-2c96-8044-4b7e-8faf1c25af6b.png)

先ほどダンロードしたjsonファイルを選択してインポートします。
![Screenshot 2024-08-02 at 9.28.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3e69de29-e68e-cb15-97f6-7fb3a046f0f4.png)

アシスタントがどの程度利用されているのか、どのユーザーが頻繁に利用しているのかといったことを確認できます。ぜひご活用ください！
![Screenshot 2024-08-02 at 9.28.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9a13e832-6c62-2088-4f17-b8b48964671e.png)
![Screenshot 2024-08-02 at 9.28.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c12ebd9d-24c2-be1e-b2af-56639df037e9.png)


### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
【Flutter】ドラえもんシリーズ第３弾！FittedBoxのBoxFitプロパティ

# Boxfitとは

### BoxFitはFittedBoxのfitプロパティの一つです。
型: BoxFit
デフォルト: BoxFit.contain

ここではどこでもドアを親ウィジェットとして、ドラえもんを子要素として
BoxFitの各オプションがどのようにドラえもん（子要素）をどこでもドア（親ウィジェット）にフィットさせるかで説明します！

### BoxFit.fill
説明: ドラえもんをどこでもドアに合わせて無理やり変形させるイメージです。縦横比を無視して、ドラえもんの体をどこでもドアのサイズに完全にフィットさせます。
例: どこでもドアが細長い場合、ドラえもんも細長くなってドア全体を埋め尽くします。


### BoxFit.contain
説明: ドラえもんの縦横比を保ちながら、どこでもドアの中に完全に収まるようにします。どこでもドア内に余白ができるかもしれませんが、ドラえもんの形は変わりません。
例: どこでもドアが四角形で、ドラえもんが少し小さくなってドアの中に収まりますが、ドアの周りに空きスペースがあります。

### BoxFit.cover
説明: ドラえもんの縦横比を保ちながら、どこでもドアを完全に覆うようにします。ドラえもんの一部がドアの外に出るかもしれませんが、ドア全体はドラえもんで埋まります。
例: どこでもドアが正方形の場合、ドラえもんが拡大されてドア全体を覆い、手や足の一部がドアの外に出てしまいます。

### BoxFit.fitWidth
説明: ドラえもんの縦横比を保ちながら、どこでもドアの幅にフィットさせます。高さが足りない場合、上または下に余白ができます。
例: どこでもドアが広い場合、ドラえもんがその幅に合わせて広がり、上下に空きスペースができます。

### BoxFit.fitHeight
説明: ドラえもんの縦横比を保ちながら、どこでもドアの高さにフィットさせます。幅が足りない場合、左右に余白ができます。
例: どこでもドアが高い場合、ドラえもんがその高さに合わせて高くなり、左右に空きスペースができます。

### BoxFit.none
説明: ドラえもんのサイズを全く変更せず、そのままの大きさで表示します。どこでもドアに収まらない場合もあります。
例: どこでもドアが小さい場合、ドラえもんの一部だけがドアに表示されます。

### BoxFit.scaleDown
説明: ドラえもんをどこでもドアの中に収めるために小さくしますが、ドアより大きくすることはありません。必要な場合にだけ縮小します。
例: どこでもドアが小さい場合、ドラえもんがそのサイズに合わせて小さくなりますが、元のサイズより大きくなることはありません。

# 使用するメリット
### 画面サイズに柔軟に対応
   どんなデバイスでも、画像やウィジェットをきれいに表示できます。
### 画像の歪みを防ぐ
   画像やビデオを元の形に保つことができます。
### 一貫した見た目
   ロゴやアイコンが常に正しいサイズで表示されるので、デザインが統一されます。
### パフォーマンス向上
   メモリを無駄に使わず、アプリをスムーズに動かすことができます。
### 使いやすいUI
   テキストやボタンが見やすく配置され、ユーザーが使いやすいインターフェースを作ることができます。
### 簡単に綺麗なレイアウト
   複雑な調整なしで、綺麗なレイアウトを実現できます



#### 以上のことからBoxFitプロパティを使うことで、アプリの見た目と使い勝手が簡単に格段に良くなります！
自己の紹介です(非要必読)

## 導入
今朝，バスの中に身分証明書を落として人に迷惑をかけました(懺悔)．自分がものを失くしやすいというのは重々承知の上でして，しっかり家のカギと一緒に首から下げていたのですが，身分証明書のみを落とすというテクニカルな紛失をしてしまいました．原因はカードホルダーの緩みです．クリップで留めようと思います．
とまあ，私はとってもおっちょこちょい．よく食べないしよく寝ないのによく忘れてしまう子．もう成人しているので，忘れっぽいのは許容して，忘れても思い出せるような覚書をしようというので，今回Qiitaのアカウントを作成する運びとなりました．

## 基本情報
* 22歳，頭のいかれた父親に影響されないように高専に逃亡するも高専で無事頭がいかれた．逃亡先は慎重に選ぶべき(一敗)
* 自宅にある3DプリンタはAdventurer 5Mだが，他の3Dプリンタも使用できる環境があるため，記事はそっちで書くかも
* 高専ではロボットの設計から動作までを万遍なく勉強したため，機械設計，回路設計，制御プログラムなど幅広く経験があるが，どれも微妙に浅い
* 自動車免許の取得から逃げ続けているため，日常における移動のほぼすべてを徒歩で行っている
* 自転車は中学3年でパンクしたときにやめた
* 高専時代の欠席は多分1日
* なので4年の2月に無断欠席をした際，親の職場に連絡がいった
* ちなみに学校をサボって行った場所は本屋

## 執筆予定
* 3Dプリンタ関連(スライス設定やメンテナンスなど)
* 機械設計
* 電子工作
* マイコン制御等の簡単なプログラミング

## その他
* 将来は随筆を書いて生活したいと思っている
* 叶わないだろうなと思っている
* お刺身を頂くときに日本酒を飲まないのは失礼だと思っている
* 夏休みに1日を48時間にしたことがある
itch.ioのWebアプリでクリップボードが使えない時の対処法

## まとめ
クリップボードは使えません。ファイルドロップやファイルダウンロードのHTML5機能で対処するしかない。


itch.ioはフレームの中にアプリを配布するためなのか、Webアプリによる、clipboardによるコピー・ペーストができません。自分の作った検証環境では、使えたりするので、リリース時に初めて気づくこともあると思います。

そもそも、ブラウザーによっては、通常のクリップボードのやり取りもできないものもあります。

hugging face使うのが１番の解決策かも

## ペーストの対処法
API keyの入力とか手動では不可能ですので
ファイルのドロップはできますので、txtやjsonファイルに書いてもらって、ドロップしてもらいましょう。

これは、ユーザーにはまったく受け入れられないので、丁寧な説明、jsonファイルをダウンロードしてもらって、少しでも手間が省ける努力が必要になります。

## コピーの対処法
ファイルダウンロードはできますので、html5のファイルダウンロード機能でtxtを保存してもらいましょう。

　こちらはユーザーにも十分許容してもらえると思います。