OmniAICreator/Qiita-1.07M huggingface dataset:
画面の解像度の問題


+ [csvをインポートするトレイルヘッドのまとめ](https://qiita.com/Keiji_otsubo/items/74259ef8c1e245e68e68)

このエラーメッセージでも有効です。
**The matching field you chose (Name) is not mapped and is required for an Update and Insert operation.**

+ [the matching field name is not mapped and is required for an update and insert opertions.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ajTVN)

:::note
When mapping fields, there are instances that you have already selected the field to map however the option to 'map' it does not appear on the pop-up window. When this happens, zoom out your browser's page settings so that the mapping button will be visible.
:::

フィールドをマッピングするときに、マッピングするフィールドをすでに選択している場合がありますが、「マッピング」するオプションはポップアップウィンドウに表示されません。この場合、ブラウザのページ設定をズームアウトして、マッピングボタンが表示されるようにします。

ズームアウトした結果の画面の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/93ddf314-c127-e77d-3a3e-abdca88e7763.png)


# 画面の解像度が低い時の回答例

:::note
When mapping fields, there are instances that you have already selected the field to map however the option to 'map' it does not appear on the pop-up window. When this happens, zoom out your browser's page settings so that the mapping button will be visible.

Press and hold the Ctrl key and press the - (minus) key or + (plus) key to zoom out or in of a web page or document.
:::


+ [i don't see continue button while creating new activation](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erCAiSAM)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/655a611e-af94-3c91-f897-60d1a49f30d7.png)

:::note
Zoom out on the page and the button will be visible. It is located in the area outside your screen

CTRL + "-"
or
with pressed CTRL -  scroll the mouse wheel
:::

+ [Issue with Platform App Builder Certification Maintenance (Winter '24) Get Hands-on with Mass Quick Action module](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000nwrP)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4cfa5a1a-4b8c-afa8-61f4-bac1599f22c1.png)

:::note
Press and hold the Ctrl key and press the - (minus) key or + (plus) key to zoom out or in of a web page .
:::

+ [Lightning Experience Customization Create Custom Buttons and Links](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000J7gJU)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7ec70a85-cc2b-a28d-9e5e-46a8e69f10d3.png)

+ [Cannot create a service contract](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KCcef)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/1036639b-6993-4377-b9d3-15eb0cbc8f7a.png)

:::note
Zoom out on the page and the button will be visible. It is located in the area outside your screen

CTRL + "-" 

or 

with pressed CTRL - scroll the mouse wheel
:::
[12/4]Amazon Bedrock Multi-agent collaboration

AWSがBedrockにマルチエージェントコラボレーションをサポートしました。

12/4時点で日本語記事はできていません。
https://aws.amazon.com/about-aws/whats-new/2024/12/amazon-bedrock-multi-agent-collaboration/

要約した内容と引用した原文を記載し、Bedrockの機能説明に追加されたマルチエージェントコラボレーションの説明を紹介します。

## Amazon Bedrock マルチエージェントコラボレーションの概要

### 機能概要
- Amazon Bedrockが「マルチエージェントコラボレーション」をサポート開始。
- 複数のAIエージェントが連携し、複雑なワークフローを効率的に解決可能。

### 主な利点
- 開発者が特定の業務ニーズに合わせた専門エージェントを作成可能。
  - 例: 財務データ収集、調査、意思決定。
- エージェント間のシームレスな連携により、以下の業界でパフォーマンスを最適化。
  - 金融
  - 顧客サービス
  - ヘルスケア

### 具体例
- 金融サービス:
  - データ収集・分析・提言を行う専門エージェントが協力。
  - 応答速度と精度を向上。

### ビジネスへのメリット
- マルチエージェント環境を迅速に構築・展開・スケール可能。
- 開発時間の短縮や進化するニーズへの柔軟な適応を実現。

### 利用可能リージョン
- 現在、以下のAWSリージョンで提供中:
  - 米国東部（北バージニア）
  - 米国西部（オレゴン）
  - ヨーロッパ（アイルランド）

### 詳細情報
- 詳しくは [Amazon Bedrock Agents](https://aws.amazon.com/bedrock/) の公式ページを参照。

## 引用
> Amazon Bedrock now supports multi-agent collaboration, allowing organizations to build and manage multiple AI agents that work together to solve complex workflows. This feature allows developers to create agents with specialized roles tailored for specific business needs, such as financial data collection, research, and decision-making. By enabling seamless agent collaboration, Amazon Bedrock empowers organizations to optimize performance across industries like finance, customer service, and healthcare.
> With multi-agent collaboration on Amazon Bedrock, organizations can effortlessly master complex workflows, achieving highly accurate and scalable results across diverse applications. In financial services, for example, specialized agents coordinate to gather data, analyze trends, and provide actionable recommendations—working in parallel to improve response times and precision. This collaborative feature allows businesses to quickly build, deploy, and scale multi-agent setups, reducing development time while ensuring seamless integration and adaptability to evolving needs.
> Multi-agent collaboration is currently available in the US East (N. Virginia), US West (Oregon), and Europe (Ireland) AWS Regions.
> To learn more, visit Amazon Bedrock Agents.


## マルチエージェントコラボレーションの機能紹介

Amazon Bedrockのマルチエージェントコラボレーションは、開発者が複数の専門エージェントを構築、展開、管理し、それらをシームレスに連携させることで、ますます複雑化するビジネスワークフローに対応できるようにします。  
各エージェントは特定のタスクに集中し、監督エージェントがこれらを調整します。この監督エージェントは、複雑なプロセスを管理しやすいステップに分解し、精度と信頼性を確保します。

これらの複雑な業務プロセスを自動化することで、企業は運用上の負担から解放され、チームが革新に集中し、実際のビジネス価値を提供できるようになります。
GameDay

# GameDayに参加しました！

AWS re:Invent 2024に初参加しました。初めてのre:InventとGameDayに参加した体験記を残したいと思います。

## GameDayとは

GameDayは、チームでAWSのサービスを活用して技術的な問題を解決する学習イベントです。制限時間内に与えられた課題を解決し、チームでポイントを獲得します。ポイントはリアルタイムで集計され、他チームと競い合います。技術力だけでなく、チームワークも必要なイベントです。

## 参加したGameDayの内容
**制限時間**：4時間  
**内容**：侵害された資格情報の対応、IPv6への資産移行、データ漏洩防止、VPC接続の問題解決、インスタンスの侵害対策など、現実世界で直面するネットワークおよびセキュリティの課題を解決する。  

## GameDayに参加したきっかけ

- セキュリティの重要性が増しており、自分もその分野について学びたい
- 具体的なセキュリティ対策や実践的なスキルを身につけるために、実際の環境での経験をしてみたい
- 海外のエンジニアたちとの交流を通じて、新しい視点や知識を得られるのではないかと期待

## 私のスキルセット

- セキュリティやネットワークについては全くの素人

## 当日

今回参加したセキュリティとネットワークのGameDayでは、会場の受付で日本人チームに案内され、日本人チームとして海外勢と戦いました。ちなみに、会場で案内してくれたスタッフも日本人でした。チームは、セキュリティ担当でもネットワーク担当でもないエンジニアが集まったチームでした。

### 私が担当した内容
今回のGameDayの課題は8個ほどあったと思います。その中でも私が担当した課題は、複数のEC2インスタンスで構成されているウェブサイトがランサムウェアによってハッキングされたという内容です。

- **侵害されたインスタンスのうち1つを隔離し、暗号化されたデータを持つものをフォレンジック分析のために保存する**
- **監視ツールがウェブサイトのステータスをテストするのを妨げないように注意しながら、攻撃をブロックする**
- **侵害されたインスタンスを交換してウェブサイトを復元する**

## GameDayの手応え

正直なところ、全く歯が立ちませんでした。何から手をつけていいのかわからない状態でした。ポイントを消費して課題のヒントを得ることができたので、ヒントを活用し、チームメンバーと協力して試行錯誤しながら、なんとか少しずつ課題を進めることができました。

## GameDayに参加しての感想

各課題を少しでもクリアできると、その度にチーム内で歓声が上がり、達成感を共有できました。普段担当していない分野の技術に触れることで、自分の知識の幅を広げる良い機会になりました。また、GameDayならではの本格的なシナリオを通じて、実際の業務ではなかなか経験できないような問題に直面し、それを解決する体験ができたことは非常に貴重でした。

今後は、今回学んだセキュリティやネットワークの知識を活かし、自分のスキルセットをさらに充実させていきたいと思います。
【AWS re:Invent 2024】AWS GameDay: LoL Esports editionに参加してきた

# はじめに
2024/12/3(火)に「AWS GameDay: LoL Esports edition」に参加してきました。
![IMG20241202143117.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3786376/b50f73a8-0801-46f4-e8bd-8bc304c1840f.jpeg)

日本人でチームを組んだのではなく、たまたま居合わせた前後2人の海外の方とチームを組んできました。
なかなか経験できない出来事なので、技術的な点やどう感じたかなどブログにつづってみます。


# メンバー構成と言語について
ノルウェーの方1名とアメリカの方1名とチームを組みました。
ノルウェーの方はとても英語が流暢でした。調べてみると、ノルウェーの母国語はノルウェー語ですが、子供のころからの英語教育が盛んで、大人も英語を流暢にしゃべる方が多いとのことです。

私は道を尋ねる程度の英語しかできないため、実際にAWSマネコンを見て「これを直したほうがいいね」「次はこれをしよう」などと英語で話せるレベルではありません。
基本的にはノルウェーの方とアメリカの方が喋りながら問題を解いていき、私は相槌したりたまにググって調べる　といった動きをしてました(これも経験です)

技術的理解よりも当然ですがやはり言語の壁が厚かったです。

# 使用アーキテクチャ
中身を詳細に記載することはできないので概要を説明します。
使用したアーキテクチャ(技術要素)は以下の通りでした。
- Sagemaker
- Lambda
- ChatGPT
- Python
- Pandas(Pythonのデータ分析ライブラリ)
- VSCode



# 流れ
始めは一問一答形式の問題が続きました。
Sagemakerであらかじめ用意されたPythonスクリプトを流していけば答えが探し出せるものであり、はじめは順調でした。

瞬間1位になったタイミングもあり、何故かそのタイミングで可愛いぬいぐるみももらいました。
![1000001458.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3786376/b8b736ad-7dd9-6367-f9bd-b9b0742bc255.jpeg)

次第に、自分たちでPythonコードを書いていかないと答えが導き出せないフェーズになり、私たちのチームも詰まってきました。
ノルウェーの方がVSCodeで「# connect to Sagemaker」とコメント打ち、分からんという仕草をしたので、横で私は「Python Sagemaker 接続方法」でググったりしていました。

# 泥沼にはまったところ
LambdaでSagemakerのエンドポイントURLを指定して、Webページを作成しそのURLを回答欄に書くという問題がありました。

回答を記載しましたが「incorrect」という結果となり、以下切り分け調査を行いました。

:::note info
【切り分け調査内容】
・Lambda上のテストは通る。
・GameDayの回答にLambdaのFunction URLを記載し「Submit」ボタンを押下しても正解とならない。
・別途HTTPクライアントツールを使用しFunction URLに対してPUTを投げてみたが「Internal server error」の結果となる。
・CloudWatchのログを見ると「Invalid Sagemaker URL」の旨のエラーが出ている。
・SagemakerのエンドポイントURLがスペルミス、コピペミスしているか確認したが、ちゃんと合ってる。
:::
テーブルを回っていたAWSの方にも聞きましたが、結局解決策もわからず時間切れとなりました。

# 得たもの
#### ・日本で使っているサービスやトラブルシューティング方法が海外でも同等であることを知れた
コードが分からなければChatGPTに聞くところや、Pythonのコードで行き詰まったら[Pandasの公式リファレンス](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.groupby.html)で確認してみる、AWSインフラ上でエラーが出てないか見たければまずCloudWatchのログを見る、、など。
日本で当たり前のようにやっていることが、海外でも同じであるということを知れる機会はなかなか無いですし、ITエンジニアのデファクトスタンダードを確認できた気がしました。

GameDayは、もちろん全問すんなりいくことは少ないです。難問も用意されていて、チームコミュニケーションを通じて解決させることを目的にしていると思います。
意図せずトラブルシューティングできる機会にもなりますし、とてもいいre:Inventのコンテンツの一つだと思いました。

#### ・英語でのコミュニケーション
「私はこう思う」→「I guess」「Maybe」
「スペルミス」→「misspell」
など、自然な英語がチーム競技を通して耳に入れることができたのも収穫です。

# おわりに
またre:Invent参加する機会があればGameDayやってみたいです！
![IMG_20241203_142202.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3786376/70bce440-0494-4dbc-16b7-ffa0c774f4e0.jpeg)
LangChainのRunnableBranchで条件分岐した処理をする

# やりたいこと

前のChainで得られた結果によって呼ぶChainを変えたい

# RunnableBranch

https://python.langchain.com/api_reference/core/runnables/langchain_core.runnables.branch.RunnableBranch.html

RunnableBranchを使うと

> Runnable that selects which branch to run based on a condition.
> The Runnable is initialized with a list of (condition, Runnable) pairs and a default branch.

conditionとRunnableのペアをリストとDefault branchを設定すればいいということがわかります。

```py
from langchain_core.runnables import RunnableBranch

branch = RunnableBranch(
    (lambda x: isinstance(x, str), lambda x: x.upper()),
    (lambda x: isinstance(x, int), lambda x: x + 1),
    (lambda x: isinstance(x, float), lambda x: x * 2),
    lambda x: "goodbye",
)

branch.invoke("hello") # "HELLO"
branch.invoke(None) # "goodbye"
```

例として載っているのは、入力の値の型によって、処理を変え、デフォルトは"goodbye"と返すものです。

結構わかりやすいですね。


# Example: メッセージがあればサマリーし、なければ固定で `no message found` を返す

:::note info
具体的に自分がやりたかったことは、Slack MessageのSummaryですが、Slack APIから取得した結果が空のときは、そもそもSummary するChainをよばずに固定の値を返して、最後のメッセージを変えたいと思っていました。
:::

以下の例では、メッセージを取得する部分とサマリーする部分は擬似的にRunnableLambdaで表現しています。

```py
from random import randint
from langchain_core.runnables import RunnableLambda, RunnableBranch


def example_runnable_branch():
    # branch
    extract_message_chain = RunnableLambda(lambda x: {"messages": ["message"] * randint(0, 2)})  # randomize message
    message_summary_chain = RunnableLambda(lambda x: f"this is the summary of {len(x['message'])} messages")  # emulate chain with LLM

    # chain
    chain_with_branch = extract_message_chain | RunnableBranch(
        (lambda x: bool(x["messages"]), message_summary_chain),
        lambda x: "no message found",  # fixed result when empty
    )
    print(chain_with_branch.batch([{}, {}, {}]))
```



- `extract_message_chain` でmessageの数が異なるmessageが生成される
- `message_summary_chain` でmessageの数を数えてサマリーしたことにしている
- `RunnableBranch` で、 `x["messages"]`が存在するときには`message_summary_chain`を呼び、デフォルトでは`"no message found"`を返す


実行結果:

毎回ランダムなので結果は変わってしまいますが、`no message found`やsummaryされたタイプの結果が返ってきていて想定通り処理できている事がわかりました。

```
['this is the summary of 1 messages', 'this is the summary of 1 messages', 'no message found']
```
Chakra UI v3 ボタンの色を変えた時の挙動の確認

# はじめに
はまったので記事にします。

# 問題
https://qiita.com/like-mountain/items/a8b70f0eacc58729c138
前回投稿の、カスタムフックで色を変える処理をしたところ、Buttonが正常に動かなくなっている
(hoverしても色が変わらない)


# 解決方法
background colorを変えて、ボタン機能を使えるようにはなっていませんが、
動きの違いはなんとなく分かりました。

gifのボタンは、上から順番に以下の通りになっています。
(1)(2)前回の方法で色を変えた(hoverが使えず、ボタン機能が失われている)
(3)(4)色を変えずにボタン機能を使う(ボタン機能が使える)
(5)chakra.buttonでhoverを記載する(bgで色を変えると、borderRadiusが効かない)
(6)chakra.buttonでhoverを使う(ボタン機能は使えて、hoverすると色を変えることはできたが、通常時の色やborderRadiusが効かない)

![画面収録 2024-12-04 6.54.12.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881019/eaae99f9-8e99-163e-eddf-a3c212d6af47.gif)


``` App.tsx
import { Table, VStack, Button } from "@chakra-ui/react";
import { RiArrowRightLine, RiMailLine } from "react-icons/ri"
import { chakra } from "@chakra-ui/react"

export default function App() {

~~~中略~~~

return (
    <>
        <VStack>
            <Button bg="red.300/40" >Button</Button>
            <Button  bgColor="red.200" >Button</Button>

            <Button colorPalette="teal" variant="solid" >
                <RiMailLine /> Email
            </Button>

            <Button colorPalette="red" variant="outline">
                    Call us <RiArrowRightLine />
            </Button>

             <chakra.button
                borderWidth="1px"
                colorPalette="blue"
                borderColor="colorPalette.500"
                bgColor="red.200"
                padding="4px 8px"
                fontSize="16px"
                borderRadius="xl"
                _hover={{
                    borderColor: "gray.400",
                    backgroundColor: "red.800",
                }}
            >
                    Click me
            </chakra.button>

            <chakra.button
            //上と同じコードで、1部分だけcommentoutして挙動を確かめる
                // borderWidth="1px"
                // colorPalette="blue"
                // borderColor="colorPalette.500"
                // bgColor="red.200"
                padding="4px 8px"
                fontSize="16px"
                borderRadius="xl"
                _hover={{
                    borderColor: "gray.400",
                    backgroundColor: "red.800",
                }}
            >
                Click me
            </chakra.button>
        </VStack>
    </>
)
}
```

# おわりに
Chakra UI のv3はリリース直後のため、未知な部分、バグなどがあるのかもしれません。
Railsでnamespace付きでSTIしたいとき

## はじめに
Railsでnamespace付きモデルクラスを使用してSTI(Single Table Inheritance)を実現する場面に何度か遭遇していますが、そのたびに調べ直してしまっているのでまとめようと思います。

## 概要
Railsにおいて愚直にnamespaceがついたモデルクラスで、STI(Single Table Inheritence)をしようとすると以下のような挙動になります。

- Read
    - 検索条件の`type`カラムにnamespaceを含めた定数名が入る
- Write
    - `type`カラムにnamespaceを含めた定数名が保存される

```ruby
class Namespaced::Vehicle < ApplicationRecord; end
class Namespaced::Car < Namespaced::Vehicle; end
class Namespaced::Airplane < Namespaced::Vehicle; end
```
例えば、上記のようなnamespace付きモデル構成でSTIを利用するとします。
この場合、ActiveRecord越しにRead/Writeすると以下のようなクエリが発行されます。

```ruby
app(dev)> Namespaced::Car.create(name: "lamborghini")
  TRANSACTION (0.4ms)  BEGIN
  Namespaced::Car Create (6.1ms)  INSERT INTO `vehicles` (`name`, `type`, `created_at`, `updated_at`) VALUES ('lamborghini', 'Namespaced::Car', '2024-09-17 14:30:48.257055', '2024-09-17 14:30:48.257055')
  TRANSACTION (3.9ms)  COMMIT

app(dev)> Namespaced::Car.all
  Namespaced::Car Load (3.4ms)  SELECT `vehicles`.* FROM `vehicles` WHERE `vehicles`.`type` = 'Namespaced::Car' /* loading for pp */ LIMIT 11
```
大抵の場合、このnamespace付きで扱うのは都合が悪いはずです。

## 解決策
基底クラスに`self.store_full_sti_class = false`を設定することで、namespaceを省略して扱うことができます。

関連するPRは以下です。

https://github.com/rails/rails/commit/bca8751e40a5594c4de2ca58e089b8d98e44632b

https://github.com/rails/rails/pull/19531

実装例
```ruby
class Namespaced::Vehicle < ApplicationRecord
  self.store_full_sti_class = false
end

class Namespaced::Car < Namespaced::Vehicle; end
class Namespaced::Airplane < Namespaced::Vehicle; end
```

```ruby
app(dev)> Namespaced::Car.create(name: "lamborghini")
  TRANSACTION (0.2ms)  BEGIN
  Namespaced::Car Create (3.7ms)  INSERT INTO `vehicles` (`name`, `type`, `created_at`, `updated_at`) VALUES ('lamborghini', 'Car', '2024-09-17 14:43:39.617122', '2024-09-17 14:43:39.617122')
  TRANSACTION (2.0ms)  COMMIT

app(dev)> Namespaced::Car.all
  Namespaced::Car Load (1.3ms)  SELECT `vehicles`.* FROM `vehicles` WHERE `vehicles`.`type` = 'Car' /* loading for pp */ LIMIT 11
```
M5StampS3で三角関数の計算し、ベンチマークする。(単精度浮動小数点)



参考


https://ichiken-engineering.com/arduino-uno-r4-minima_keisan/


https://qiita.com/caa45040/items/209d5cd9e5dacd9f4aaf



x 過去ログを見よ!!
x ICHIKEN様のホームページの内容を非営利、研究調査目的で引用しました。


結果


![o_coq675.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/cfa78f65-3648-07ef-4798-e7fa37b7634f.jpeg)




プログラム


```c++


//度数で与えられた角度を弧度法に変換し、それをsin, arcsin, cos, arccos, tan, arctanの順で三角関数の計算を行い、それを0~359°まで反復する。
void setup() {
  Serial.begin(9600);
  Serial.println();
  Serial.print("START");
  for(int i = 0;i < 9;i++){
    Serial.print('.');
    delay(500); //起動待ち
  }
  Serial.println();
}
float deg_to_rad(float deg) {
  float rad;
  rad = deg * (PI / 180);
  return rad;
}
float rad_to_deg(float rad) {
  float deg;
  deg = rad / (PI / 180);
  return deg;
}
void loop() {
  unsigned long start_time, end_time;
  unsigned long time;
  float rad, deg1, deg2, deg3, t_sum;
  t_sum = 0;
  unsigned int temp;
  int x;
  start_time = millis();
  for (x = 0; x < 100; x++) {
    for (int deg = 0; deg < 360; deg++) {
      rad = deg_to_rad((float)deg);
      deg1 = rad_to_deg(asin(sin(rad)));
      rad = deg_to_rad((float)deg1);
      deg2 = rad_to_deg(acos(cos(rad)));
      rad = deg_to_rad((float)deg2);
      deg3 = rad_to_deg(atan(tan(rad)));
      if( deg3 < 0.0f ) { deg3 = 0.0f - deg3;}
      t_sum = t_sum + deg3;
    }
  }
  end_time = millis();
  time = end_time - start_time;
  Serial.print("END Value:");
  Serial.print(x); //最後の値の出力
  Serial.print('-');
  Serial.print(t_sum); //最適化対策 1から90の足し算91*45=4095 (16380-180)*100
  Serial.print(" rad:");
  Serial.print(rad);
  Serial.print(" deg2:");
  Serial.print(deg2);
  Serial.print(" deg3:");
  Serial.print(deg3);
  Serial.print("\n");
  Serial.print("StartTime:");
  Serial.print(start_time);
  Serial.print(" EndTime:");
  Serial.print(end_time);
  Serial.print(" Time:");
  Serial.println(time);
  delay(3000);
}


```
Power Automate for desktop での Excel のシリアル値（時刻）の扱い

# はじめに

業務において、Power Automate for desktop で Excel を操作する機会は多いと思います。
Excel から時刻の情報を読み取ると、Power Automate for desktop ではシリアル値として保持されます。
これを、時刻の形式に変換する方法を記載します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/fcc02eb0-265c-6ae7-b0f4-2ea3c78031a7.png)



# Power Automate for desktop でシリアル値から時刻を求める

以下のアクションで実現可能です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/e95f17c5-fd5d-201c-3400-8cbeb10921d4.png)


## ① Datetime型変数を生成

変換の準備として、DateTiem型変数を用意します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/91db8cbc-4cf2-fbf2-d341-73a1bccd2cc7.png)

『変数の設定』アクションで、

```
%D'1900/01/01 00:00:00'%
```
をセットします。
（日付部分 "1900/01/01" は、任意の日で大丈夫です）



## ② シリアル値を秒に変換

『数値の切り捨て』アクションを利用します。

Excel は、時刻を24時を 1 として保持します。
ですので、以下のようにシリアル値で管理されます。

　時間：1/24
　分　：1/24/60
　秒　：1/24/60/60

 Power Automate for desktop で読み取った値に * 86400（24 × 60 × 60 ）することで、秒に変換できます。
 小数点以下は、四捨五入しておきます。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/996dc47f-2a02-7d81-871d-adaa79dd5d6f.png)



## ③ 日時データに秒を追加

② で求めた秒数を、① の DateTiem型変数に追加します。
『加算する日付』アクションを利用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/c065c232-be8a-ca35-0c86-5dde68a0c6ae.png)


## ④ 時刻の表示形式に変換

『datetimeをテキストに変換』アクションで、時刻の形式を整えます。

:::note info
カスタム形式は、"T" を指定すると、『 : 』（コロン）区切りの24時制日付に変換できます。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/180dc8b2-b691-7050-f8ee-c6964cb64866.png)


# まとめ

Excel から読み取った時刻のデータを、Power Automate for desktop で扱う場合は、86400 で乗算して秒数に変換し Datetime型で扱うことで、表示形式を変換可能です。

もっとスマートに実現できる方法をご存知でしたら、是非ご教示ください。
docker-composeによるLaTeX組版

# はじめに

Cloud LaTeX や Overleaf の登場により、オンラインで簡単に LaTeX 文書を組版できるようになりました。しかし、これらのツールはオフライン環境では使用できず、git を使ったバージョン管理との相性も良くありません。**結局のところ、最後に頼るのは昔ながらのローカル環境でのLaTeX組版です。**

ローカル環境でaTeX組版を行う場合、ハードルとなるのが環境構築です。しかし、現在ではDockerを利用することで、簡単かつ効率的に環境を整えることが可能です。とはいえ、Dockerを使ってLaTeX組版を行う際には「どのコンテナを選ぶべきか」「どのようなコマンド構成にすればよいか」などの点に悩みます。

本記事ではコンテナに[paperist/texlive-ja](https://github.com/Paperist/texlive-ja)を、コマンドはすべて[docker-compose](https://docs.docker.jp/compose/)にまとめてしまう方法を紹介します。日本語LaTex組版の環境としては、これ以上シンプルにできない気がします（もっとシンプルな方法があれば教えてください( ;∀;)）。

# 結論

### 1. Docker Desktop をインストールする
Dockerを利用するためDocker Desktopをインストールします。

https://docs.docker.com/desktop/

### 2. docker-compose.yml を書く
以下のように`docker-compose.yml`を記述します。
```
sample/
├── docker-compose.yml
└── main.tex
```

```yml
version: '3.8'  # 使用するComposeファイルのバージョンを指定

services:
  latex:
    image: paperist/alpine-texlive-ja  # 日本語対応のTeX Liveを含む軽量なDockerイメージを指定
    volumes:
      - .:/workdir  # 現在のディレクトリをコンテナ内の/workdirにマウント
    working_dir: /workdir  # コンテナ内での作業ディレクトリを指定
    command:  # コンテナ実行時に実行するコマンドを指定
      - /bin/bash  # Bashシェルを使用
      - -c  # 次の文字列をコマンドとして実行
      - |
        # pLaTeXでmain.texをコンパイルしてDVIファイルを生成
        platex main.tex
        # 生成されたDVIファイルをPDFに変換
        dvipdfmx main.dvi
```
日本語LaTex組版環境としては[paperist/texlive-ja](https://github.com/Paperist/texlive-ja)が一番軽量かつ利用数が多そうな為これにしてます。

https://github.com/Paperist/texlive-ja

### 3. 実行
```
$ docker-compose up
```


# 試す
国内学会のいくつかの予稿テンプレートをdocker-composeで組版してみました。
`command:`の箇所を適宜変更することで、それぞれのテンプレートに合わせています。

https://github.com/ysdzm/docker-compose-latex-sample

# おわりに

[devcontainer](https://code.visualstudio.com/docs/devcontainers/containers)や[Latex WorkShop](https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop)を利用することで、より便利に執筆することも可能です。

ただ、個人的にはVSCodeに依存しない形で利用したい＆可能な限り設定ファイルは少なくしたいので、docker-composeだけで完結できるようにして利用しています（`./vscode`とか書いても後輩が気づかない説）。

例えば、研究室内のLaTexテンプレートに追加でdocker-composeまで書いてあげることで、後輩は環境構築に悩まず`docker-compose up`を実行するだけで先輩と同じ組版をすることができて便利だと思います。

# 備考

- [paperist/texlive-ja](https://github.com/Paperist/texlive-ja)ではepsファイルは利用できないようなので、別の画像形式にするか別のコンテナを使う。

https://blacktanktop.hatenablog.com/entry/2021/08/08/122458

- 生殺与奪の権をOverleafに握らせるな

https://x.com/ran350jp/status/1864323767624978860
PythonでSSL証明書を利用してREST APIを呼び出す方法

# はじめに

　Pythonで、SSL証明書が必要なサイトに対して、REST APIを呼ぶと下記のようなSSLエラーとなる。事前にダウンロードしたSSL証明書を指定することで、エラーを解消することができる（[参考](https://qiita.com/ryan5500/items/24fe626a25f977c0e860)）。本記事では、SSL証明書をPython上でダウンロードしてREST APIで設定するまでを行う方法を紹介する。この方法は自己署名証明書などを利用している場合に有用である。

 ```bash
 requests.exceptions.SSLError: HTTPSConnectionPool(host='example.com', port=443): Max retries exceeded with url: /exampleapi (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)'),))
 ```

# 動作確認環境
* Windows 10 64bit
* Python 3.10.11

# 方法

## 依存関係のインストール

　以下のコマンドを使用して、必要なパッケージをインストールする。

* requests
* pyopenssl

  ```bash
  pip install requests
  pip install pyopenssl
  ```

## Pythonコード

　SSL証明書をダウンロードして、REST APIを呼ぶサンプルコードを以下に示す。

 
```python
#!/usr/bin/python3
# -*- coding: utf-8 -*-

import requests
from OpenSSL import crypto
import ssl
import socket

# SSL証明書をダウンロードしてファイルに保存する関数
def download_cert(hostname, port, output_file):
    context = ssl.create_default_context()
    conn = context.wrap_socket(socket.socket(socket.AF_INET), server_hostname=hostname)
    conn.connect((hostname, port))
    cert_bin = conn.getpeercert(True)
    cert = crypto.load_certificate(crypto.FILETYPE_ASN1, cert_bin)
    with open(output_file, 'wb') as f:
        f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert))
    conn.close()

def main():
    # SSL証明書をダウンロードしてファイルに保存
    download_cert('example.com', 443, '/tmp/example-certificates.crt')
    # 上記SSL証明書を利用して、REST APIを呼ぶ
    requests.get('https://example.com/exampleapi', verify='/tmp/example-certificates.crt')

if __name__ == '__main__':
    main()
```

# まとめ
　PythonでSSL証明書を利用してREST APIを呼び出す方法を紹介した。自己署名証明書を利用している場合に有用。　

# 参考

https://qiita.com/ryan5500/items/24fe626a25f977c0e860

https://rakuraku-engineer.com/posts/python-request-get-error-ssl/
SQLパズル　36 １人２役 の 解法3の学習メモ

# 概要
SQLパズル　36 １人２役 の 解法3の学習メモです。

基本的に解法１と同じ考え方ですね。
違うのはCASE式使ったぐらいですね。


# 要件
・重役と役職持ちを取得したい。
・role='O'と'D'が１つの場合、'O','D'のいずれかを表示
・role='O'と'D'を２つ持っている場合、'B'とする。(BothのB)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/b8b073c9-8c5d-ff18-efdb-9d6f65093e34.png)

# SQL

## DDL
```sql
DROP TABLE IF EXISTS Roles;
CREATE TABLE Roles(
 person VARCHAR(32), 
 role   VARCHAR(32), 
    PRIMARY KEY (person, role));

INSERT INTO Roles VALUES('Smith', 'O');
INSERT INTO Roles VALUES('Smith', 'D');
INSERT INTO Roles VALUES('Jones', 'O');
INSERT INTO Roles VALUES('White', 'D');
INSERT INTO Roles VALUES('Brown', 'X');

```

## 答えのSQL

```sql
--36 １人２役　その３
SELECT person,
        CASE WHEN COUNT(*) = 1
        THEN MAX(role)
        ELSE 'Both' END AS role
    FROM Roles 
    WHERE role IN ('D','O')
    GROUP BY person
	Having Count(*) = 1
	UNION
	SELECT R2.person, 'B'
	FROM Roles AS R2
	WHERE R2.role IN ('D','O')
	GROUP BY R2.person
	HAVING COUNT(*) = 2
	;   
-- UNION前のSQL部分を確認する
SELECT person,
        CASE WHEN COUNT(*) = 1
        THEN MAX(role)
        ELSE 'Both' END AS role
    FROM Roles 
    WHERE role IN ('D','O')
    GROUP BY person
	Having Count(*) = 1
;

-- UNION後のSQL部分を確認する
	SELECT R2.person, 'B'
	FROM Roles AS R2
	WHERE R2.role IN ('D','O')
	GROUP BY R2.person
	HAVING COUNT(*) = 2
	; 


```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/67144469-89ec-c11a-616d-f7b238f257bf.png)


# 参考

SQLパズル　p152

SQLパズル　サポートページ
https://mickindex.sakura.ne.jp/database/db_support_sqlpuzzle.html#LocalLink-p36

達人に学ぶSQL徹底指南書第２版 p18 CASE式の中で集約関数を使う。

github 差分
https://github.com/RYA234/SQL_Puzzle_Learning/commit/4e0496903f2e6c73bec47cac52b223d54fdcad1c
AWS re:Invent 2024 金融系エンジニアから見たCEO keynote

金融系の企業で働くエンジニアです。
AWS re:Inventに参加する機会をいただきました！
Matt Garmanのキーノートの感想を現地の写真とともに最速でレポートします！

## サマリー

予想通り、生成AIトレンドです。具体的には、BedrockやAmazon Qの機能追加に加え、Novaのアップデート（Speech-to-Speech対応）もありました。さらにLLMに特化した新しいEC2インスタンスTrn2）の発表も注目ポイントでした。

---

## 注目技術

### 1. **Amazon Aurora DSQL**

マルチリージョンで強い一貫性と高可用性を保てるようになりました。
アクティブ/アクティブ構成のため、セキュリティパッチ適用時などにあるダウンタイムの心配もありません。
今まではデータ更新時に何度もリージョン間のやり取りがありましたが、コミット処理をただそれぞれのデータベースが処理するようになりました。Amazon Time Sync Serviceを使うことで正確な時間を参照し、コミット履歴を正確な順序で捉えるような仕組みによって実現しているようです。

### 2. **Amazon S3 Table**

大量のパケットファイルがあり、それによりコストとパフォーマンス劣化が今までのDatalake連携の課題でした。icebergに最適化された形式のデータ形式、それがS3 Tableです。
今までパケットファイルで分割されていたものを1まとめに管理することでトランザクションが10倍に向上するようです。（12/6追記 Glue data catalogの自動連携がサポートされておりCrawlerを作成する必要がないようです）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405031/f98a37de-4457-9456-3689-b0f31ec5f8ad.png)

### 3. **Amazon S3 Metadata**

ファイルのメタデータを自動で抽出してくれる機能です。例えば、ファイルがどこに保存されているかを簡単に把握できるようになります。ファイル管理の効率化に非常に役立ちそうです。

### 4. **Amazon Bedrock Knowledge Bases（Automated Reasoning checks）**

推論結果を自動でチェックする機能が追加されました！
自動推論ポリシーを設定すれば、ワークフローの中で自動チェックしてくれるようになるようです。

金融系の企業では、顧客分析や与信判定で機械学習を活用したいというニーズが高まっています。
一方で、誤判定によるリスクが残っており、それを防ぐためのビジネスルールの設定をアプリケーション側で行わなくてよくなるのかな？と捉えました。

---

### 5. **Combining QuickSight and Amazon Q Business Data**

ビジネスデータのサイロ化を解消するというテーマで、Amazon QとQuickSightの統合に関する新機能が発表されました。問い合わせ履歴や購入履歴をAmazon Qで集約し、QuickSightのダッシュボードで可視化できるようになります。

実際、ビジネスデータを綺麗なテーブルにまとめるのは手間がかかります。例えば、顧客の累計LTVを問い合わせや購買傾向に紐づけて分析することができそうです。

![s3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405031/f8eb1323-e119-7191-51f1-d637c436c3c1.jpeg)

---

## 結論
"We Invent so you can reinvent"という言葉でプレゼンは締めくくられました。
今回学んだ技術を生かして、事業アーキテクチャを常にアップデートしていきたいです。

ビジネスサイドのメンバーにも紹介したくなるような技術のリリースが多かったです。
生成AIは普段の業務であまり使わないので、気持ちストレージやデータベース中心の内容となってしまいましたことご容赦ください（笑）

---

以上、re:Invent 2024 keynoteの独断サマリでした！
また興味深かったセッションやLTなど別記事でまとめようと思います！
2024 年、はじめて本「開発論論」を書いてみた話

今年を振り返る「なんかかく」アドベントカレンダー 4 日目です。今日もなんか書いていきます。今年自分を褒めたいことの一つに「本を書いた」があります。関連記事は以下。

[技術書典 16 に「開発論論」を出してみた #技術書典16 - Qiita](https://qiita.com/e99h2121/items/7b9b66382834c2ad2f14)
[製品哲学をDesign Systemsに記そう #ポエム - Qiita](https://qiita.com/e99h2121/items/a4fb8f4b2fa6bb20e3a7)
[何をしても文句を言うユーザーに開発がどう向き合うか、開発論 というものを語り継ぐ勉強会をした話 #デザインシステム - Qiita](https://qiita.com/e99h2121/items/e984de0c1e9b3c073baa)

「開発論」という、デザインシステムというと聞こえが良さそうだが、開発者の行動指針みたいなものがあったのだ、という話を昨日書きました。

技術的な話は [「エリック・エヴァンスのドメイン駆動設計」](https://qiita.com/e99h2121/items/48351c7d47d4288d87ea) を読むといいです。「開発論論」にためになる話はありません。


## 本を書いた

それはそれとして、かねてより「本を出したい」と言っていたのですが、今年はそれをギリギリ達成しました。

https://techbookfest.org/product/suzuALeaBg8uu7jvn6YBXM

内容は昨日と一転して、面白おかしくも輝かしい前職でのエピソード集でもあります。


## 本を書くことのメリット

私、ブログは [チョット書いてた](https://qiita.com/e99h2121) つもりですが、本の形にしたことで何に気づいたか、何が良かったのか、考えてみました。


### 達成感がある

達成感があるって、めちゃくちゃ個人的だな、というか何を言っているのかと自分でも思いますが、実感としてはこれにつきます。良いんです同人誌だし。

やり切った感が得られました。本って、ブログよりは厚いです。1 日では書けません。コツコツまとめました。それなりの時間をかけたものには、かけたなりの味わいがあります。


### 読み返しやすくなる

一つのテーマで束ねた話を読み返すとより対象への理解が深まる気がします。


### これをきっかけに会話できる

何かと話題にできて、それを基にまた人との会話のネタにしています。本のあとがき自体も、先輩 2 名に書いていただきました。


## 「開発論論」こぼれ話

そういえば、本にも書かなかったなというエピソードをふと思い出したのでここに書いておきます。だてに 20 年弱勤めてないぜ。


### 職人気質の先輩もいいもんだ

製品を持っている会社だと、年次で開発発表会的なイベント、大小ありますね。

前職でも全社での開発発表会みたいな会が過去何度かありまして。開発が、自身の新規開発した機能とか改善した機能とかを発表するんですが、とあるチームのとある先輩の発表が何となく印象に残っていてそれを思い出したのでした。

その先輩の発表は画面上でタスクマネージャーを立ち上げて、自分の改善した画面を立ち上げて、ポチっと処理ボタンを押すだけ。で、タスクマネージャーのグラフがウニョッと動くわけだけどそれを使用前・使用後で比較して「以上です (ニヤリ)」って言うわけですね。

その発表のまあ映えないこと。多分見ていた人の半分以上に伝わってないんじゃないかと思うのですが、その先輩の発表したいことたるやはそのアプリをすっげえチューニングしてリソース消費がこんなに改善したよって話だったと記憶。

開発者としてすっごいできる人に分類される方なんだけど、昔ながらの職人気質というかチャラい発表を一切しないひとでした。私の思い出バイアスというか偏見が多分に加算されている気もするけれど、そういうとんがった人たち、最近はどうしてるんだろな、そういう人が生きやすい現場も残っていてほしいなと思ったりもするのであります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/24f47312-86b6-7113-57be-a79ae1e9dc2c.png)

(Memory Usage 3 %)


## 改めて経験を整理できる

本を書くのは楽しい。いずれにしてもどうにか実現にこぎつけた。商業出版でなくても届いてほしい人に届けばいいな、という気持ちがわかった。そういえば高校生高中学生高の進路指導の先生が、漫画家になりたいと言う子に「漫画家になりたいならまず 1 本書けよ書いてねえじゃねえか」と諭したという話 (概要) をどこかで読みました。

書いてみると、本を書くことの本質って本を書くことには無いというか、本は所詮ただの手段でもっと大事なことが他にあると思います。それは何なのかという答えは濁しつつ。


## おひとつどうぞ

https://techbookfest.org/product/suzuALeaBg8uu7jvn6YBXM

開発論、お茶うけにどうぞ。

以上ですー。
AWS Application Load Balancer がヘッダー変更機能を導入し、トラフィック制御とセキュリティを強化した件について

こんにちは。山﨑です。
私は今、AWS re:Invent 2024でラスベガスに来ています！

2017年に初めて参加して以来、なんと7年ぶりの参加です。
この記事を執筆しているのがAWS re:Invent 2024の初日12/2なので、これから様々な発表があるのを楽しみにしているところです。

![reInvent-1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619198/85f70627-7ed1-b8d7-957b-0e5039b80ae6.jpeg)


## 記事の目的

さて、この記事では、re:Invent前の2024年11月21日に発表された「[AWS Application Load Balancer がヘッダー変更機能を導入し、トラフィック制御とセキュリティを強化](https://aws.amazon.com/jp/about-aws/whats-new/2024/11/aws-application-load-balancer-header-modification-enhanced-traffic-control-security/)」というニュースをご紹介するとともに、私の感想を書きたいと思います。

## アップデートの内容

この変更には、ALBに対して3つの機能追加が含まれています。
1. ロードバランサーが生成した特定のヘッダーの名前変更
1. 特定のレスポンスヘッダーの挿入
1. サーバーレスポンスヘッダーの無効化

この機能は、すべての商用AWSリージョン、AWS GovCloud(米国)リージョン、および中国リージョンのALBで利用できます。

これらの機能は、商用ロードバランサーにも備わっている機能です。

### ヘッダー名の変更機能（TLS/mTLSヘッダー）

ALBは、6種類のmTLSヘッダーと2種類のTLSヘッダーの名前を変更することができるようになりました。これにより、特定のリクエストやレスポンスヘッダーを必要とするアプリケーションをサポートします。
参考:[「HTTP header modification for your Application Load Balancer - Elastic Load Balancing」のRename Headers](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/header-modification.html)

多くの商用ロードバランサー（F5、BIG-IPなど）は、従来からこのような機能を提供していますが、AWSがALBの機能としてクラウドネイティブな形で提供することにより、柔軟な運用が可能になることが期待されます。
また、オンプレミスからAWSへアプリケーションを移行するとき、アプリケーションへの影響を最小限に抑えることが期待できます。

なお、一般的に、TLS/mTLSヘッダーの変更を必要とする主なケースとしては、次のようなものが挙げられます。ご参考までに。
- 既存アプリケーションとの互換性を維持したい
- 組織内で統一されたヘッダー命名規則を適用したい
- 使用しているプラットフォーム、クラウドプロバイダーを公開したくない
- マルチクラウド環境でヘッダー名を統一したい

### セキュリティヘッダーの挿入（CORS、HSTS）
ALBがHTTPレスポンスに新しいレスポンスヘッダーを追加することができます。
セキュリティヘッダー、カスタム識別子、その他のメタデータの追加に特に有用です。

参考:[「HTTP header modification for your Application Load Balancer - Elastic Load Balancing」のInsert headers](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/header-modification.html#insert-header)」

この機能もほとんどのエンタープライズ向けのロードバランサーでは対応されていますが、AWSがALBの機能として追加することにより、サーバーレスアーキテクチャとの統合が容易にできることが期待されます。

なお、CORS (Cross-Origin Resource Sharing) ヘッダーおよびHSTS (HTTP Strict Transport Security) ヘッダーが一般的にどのようなケースで利用されているかを参考として記載します。

#### CORSヘッダー
- ブラウザの同一オリジンポリシーを緩和し、許可された特定ドメインからのアクセスのみを安全に受け入れたい
- SPAやマイクロフロントエンド、APIなどで異なるドメイン間の通信を制御したい
- 意図しないクロスドメインリクエストによる情報漏洩やCSRF攻撃を防止したい

#### HSTSヘッダー
- HTTPSの使用を強制し、SSL Strippingなどの中間者攻撃を防止したい
- ブラウザに対して、ある期間中はHTTPSのみを使用するよう指示したい
- サブドメインを含めたすべての通信を暗号化したい

### Serverレスポンスヘッダーの無効化
Serverレスポンスヘッダーは、HTTPレスポンスヘッダーの1つです。一般的にServerレスポンスヘッダーはWebサーバーのソフトウェアの種類やバージョン情報を示します。トラブルシューティングに役立ったりもしますが、外部からの攻撃のヒントになり得るため、無効化することで技術情報の無用な提供を防止し、セキュリティ強化に繋がります。

Serverレスポンスヘッダーの無効化機能も、商用ロードバランサーでは一般的な機能として存在していますが、AWSがALBの機能として提供することで、クラウドネイティブな環境において、Serverレスポンスヘッダーの無効化というセキュリティ対策の一元化が可能になります。


## 機能追加の意義
今回ALBに行われた機能追加には、以下に示すような意義があります。

### クラウドネイティブな統合が容易になる
従来の商用ロードバランサーでも同様の機能は提供されていましたが、AWSのサービスとシームレスに統合できるため、導入が容易になります。

### セキュリティ設定管理が簡素化される
アプリケーションのコードを変更することなく、セキュリティ設定を一元管理でき、クラウド環境での設定が、より直感的になります。

### コスト効率が上がる
従来の商用ロードバランサーと比べて、必要な分だけ支払う料金体系になっているため、コスト効率が上がります。

## おわりに
これらはALBの地味なアップデートのように見えるかもしれませんが、AWSのマネージドサービスの機能として提供されたことで、より多くのユーザーが容易にこれらの機能を利用できるようになったことが主な価値だと思います。
進化計算コンペティションに参加しよう！

KLab機械学習グループの濱田です。この記事では、私が運営委員を務めます『進化計算コンペティション』というイベントを紹介します。

今年のコンペは『難易度と面白さを考慮したナンプレの自動作成問題』で、今まさに開催中です！開催期間は12月14日までです。今からでも十分な時間をかけてプレイできますので、お気軽にご参加ください。コンペは初めて...という方から競プロガチ勢までお待ちしております！

[進化計算コンペティション2024 Webサイト（参加登録はこちらから）](https://opthub.ai/ja/competitions/eccomp2024)

# 進化計算コンペティションとは？
進化計算コンペティションは[進化計算学会](http://jpnsec.org/)が主催する最適化のコンペティションです。 最適化とは「与えられた制約条件を満たす最も優れた解を見つけよ」というタイプの問題で、工業製品の設計から社会インフラの運用、機械学習モデルの訓練まで様々な場面で現れます。

進化計算コンペティションでは、参加者は出題された最適化問題に対してできるだけ良い解を見つけることを競います。例年10月～12月頃に開催され、開催期間中にいくつかの問題を解き、12月の[進化計算シンポジウム](http://www.jpnsec.org/symposium202403.html)で表彰式を行います。名前には「進化計算」とありますが、進化計算学会の会員に限らずどなたでも参加できますし、進化計算以外のどんな最適化手法を使って問題を解いてもかまいません。

コンペでは毎年、実際の企業や研究所の現場で扱われているリアルな実問題を出題しています。
- 2017年：[複数車種の同時設計最適化問題](https://opthub.ai/ja/competitions/eccomp2017)
- 2018年：[月着陸ミッションの最適着陸地点の選定問題](https://opthub.ai/ja/competitions/eccomp2018)
- 2019年：[風力発電用風車の設計問題](https://opthub.ai/ja/competitions/eccomp2019)
- 2020年：[ゲームを楽しくする乱数の設計問題](https://opthub.ai/ja/competitions/eccomp2020)
- 2021年：[社会シミュレーションによる経済支援施策の設計](https://opthub.ai/ja/competitions/eccomp2021)
- 2022年：[群集シミュレーションを用いた発生交通量推定](https://opthub.ai/ja/competitions/eccomp2022)
- 2023年：[製造工場における機械加工スケジューリング問題](https://opthub.ai/ja/competitions/eccomp2023)

通常のコンペのようにスコア入賞もありますが、本コンペの大きな特徴として、実用的な知見やアプローチを見出したチームに対して贈られる「産業応用特別賞」もあります。実問題を扱う本コンペでは、どちらも同じくらい重要な賞として位置づけられています。より詳しくは、[以前会社のブログに書いた紹介記事](https://www.klab.com/jp/blog/tech/2021/shinka-20211124.html)をご覧ください。

# さらに遊びやすくなったコンペシステム
これまでは学会のボランティアで運営してきましたが、年々大きくなるコンペを支えるために、コンペシステムOptHubの開発・運用を法人化し（[OptHub株式会社](https://corp.opthub.ai/)）、システムを刷新しました。

コンペサイトも分かりやすくなり、システムも使いやすくなりました。最適化に馴染みのない方でもステップバイステップで遊び方がわかるチュートリアルもあります。学会員以外の方にとっても敷居が下がったのではないでしょうか？この機会にぜひご参加ください！

[進化計算コンペティション2024 Webサイト（参加登録はこちらから）](https://opthub.ai/ja/competitions/eccomp2024)
CSSの疑似クラスhasを使い、任意の要素の有無でスタイルの制御をしたい

やったこと
-------

class属性で状態用のclassをJavaScriptで付けたり外したりすることで、CSSでclassの有無で見た目を切り替えるという事をよくやっています。

そこで、ある要素Xが存在する場合にある要素Yの表示を切り替えたいと思いました。今どきはJavaScriptのフレームワークでコントロールしてしまうとは思いますが（Vueのv-showなど）

調べましたが、サンプルが子要素か兄弟要素を使うモノしか見当たらず悩んで試行錯誤してました。

結果、`body:has(要素Xのセレクタ) 要素Yのセレクタ`とすればできたので書き残しておきます。

デモ
----------

次のデモでは5秒毎に`#target`要素(要素X)を交互に追加・削除しており、これがDOM上にあるかどうかで、`#view`要素(要素Y)のスタイルを変える、という感じになっています。chrome/firefox/safari(iOS)で確認。

Demo: https://jsbin.com/haleqeqiji/2 ([コード](https://jsbin.com/haleqeqiji/2/edit?html,css,js,output)）

```css
/* "ある"ときも"ない"ときも適用する */
#view::before {
  content: '表示されることは無い';
  font-weight: bold;
}

/* #target が "ある" ときに適用する */
body:has(#target) #view::before {
  content: 'あるよ';
  color: green;
}

/* #target が "ない" ときに適用する */
body:not(:has(#target)) #view::before {
  content: 'ないよ';
  color: red;
}
```

（デモでは`::before`という疑似要素を使っていますが、任意のセレクタで大丈夫です）

解説
----------

### なぜ機能するか？

`body:has(セレクタ)` とすることで、bodyから見てセレクタを満たせるか、という感じになります。
![Pasted image 20241204040508.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/69224602-cfa1-6902-87ce-3b2de58da9d7.png)


`body:not(:has(セレクタ))`は逆で、bodyから見てセレクタを満たせないか、という感じになります。
![Pasted image 20241204040525.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/1d6884ea-c2bc-f2b7-50c5-90ea2cf9b9d4.png)

`body:has(セレクタ)`もしくは`body:not(:has(セレクタ))`が満たされると、bodyが対象要素(Subject element)となります。

今回の例では、`body:has(セレクタ) #view`もしくは`body:not(:has(セレクタ)) #view`としているので、bodyの子孫要素である `#view`が対象要素となるので、狙った通りうまくいく、という感じです。

難点はCSSセレクタの意図がわかりにくいところでしょうか。

### bodyでないといけないのか？

「有無を見たい要素（今回は`:has(セレクタ)`）」と「対象要素（今回は`#view`）」が同じ子(子孫)に存在するならbodyでなくても機能します。

Demo: https://jsbin.com/nayucazopi/3/ ([コード](https://jsbin.com/nayucazopi/3/edit?html,css,js,output))

しかしbodyなら必ず親(先祖)にいる要素なので確実な気はします。

### bodyは省略できないのか？

bodyはコンテンツ上一番上にある要素なので、省略したいところですが、`:has`から始めるやり方はうまく機能しません。
困ったことに、ちょっとうまく動いてしまうという事があります。

具体的には、"ある"時だけを考えたときは省略しても動いているように見えてしまう、というのがあります。

```css
/* "ある"ときも"ない"ときも適用する */
#view::before {
  content: 'ない？';
  font-weight: bold;
}

/*  #target が "ある" ときに適用する */
:has(#target) #view::before {
  content: 'あるよ';
  color: green;
}
```

"ある"ときだけ適用するのはそれっぽく見えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/89d7e471-9e23-262b-5ca6-d94b029aa00a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/bea8ff73-079d-1e0b-5390-2fc69e00b035.png)

しかし、"ない"時に適用しようとすると、この書き方はうまくいきません。

```css
/* "ある"ときも"ない"ときも適用する */
#view::before {
  content: 'ある？';
  font-weight: bold;
}

/* #target が "ない" ときに適用したかった */
:not(:has(#target)) #view::before {
  content: 'ないよ';
  color: red;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/9a755402-0f85-750b-dc99-0de607142089.png)

`#target`の要素があるのに、`:not(:has(#target))` が適用されてしまい、意図しない表示となってしまいました。難しい。


### 参考

https://developer.mozilla.org/ja/docs/Web/CSS/:has

https://webkit.org/blog/13096/css-has-pseudo-class/

（:hoverと組み合わせているサンプルはどういう考え方をすれば身に付くのだろう…）
【TryHackMe】How Websites Work：Walkthrough

# 概要

TryHackMe「How Websites Work」のWalkthroughです。

https://tryhackme.com/r/room/howwebsiteswork

# Task1

## **Q1**.*What term best describes the component of a web application rendered by your browser?*

**Hint**.*This component is also often called "client-side".*

**A**.**Front End**

# Task2

## **Q2**.*One of the images on the cat website is broken - fix it, and the image will reveal the hidden text answer!*

**Hint**.*The cat-2 image (line 10) is missing its image extension.*

`img/cat-2.`の拡張子がないので画像が表示できていません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/0678c647-c54d-f52e-26fd-07838c319f72.png)

拡張子`.jpg`を追加してが同を正しく表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/6f1020ba-b68a-98b2-6bc1-2037a1239b13.png)

**A**.**HTMLHERO**

## **Q3**.*Add a dog image to the page by adding another img tag (<img>) on line 11. The dog image location is img/dog-1.png. What is the text in the dog image?*

**Hint**.*Add <img src="location/of/image" /> to the page.*

`<img src='img/dog-1.png'>`を追記し、犬の画像を表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/a5dfa1a0-e003-a289-025c-f84c65efb919.png)

**A**.**DOGHTML**

# Task3

## **Q1**.*Click the "View Site" button on this task. On the right-hand side, add JavaScript that changes the demo element's content to "Hack the Planet"*

**Hint**.*Add your JavaScript to line 9 and click the "Render HTML+JS Code" button.*

下記JSコードを追加し、HTML要素を変更します。

```
document.getElementById("demo").innerHTML = "Hack The Planet"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/f1aa2af6-3fb1-226a-fac6-15af5a55d469.png)

**A**.**JSISFUN**

# Task4

## **Q1**.*View the website on this link. What is the password hidden in the source code?*

**Hint**.*The link requires internet access, so you can not use it with a free AttackBox but instead open it from your own machine.*

下記サイトのソースコードから認証情報を得られました。

https://static-labs.tryhackme.cloud/sites/howwebsiteswork/html_data_exposure/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/ae819bf5-b8fd-3dc3-bbb7-767e64fbea91.png)

**A**.**testpasswd**

# Task5

## **Q1**.*View the website on this task and inject HTML so that a malicious link to http\://hacker.com is shown.*

**Hint**.*Google how to create a HTML link and use it as input to the "What's your name" field.*

HTMLインジェクションで`a`タグを挿入します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/9fa31d96-a78b-8bc1-13ba-a6d45806e0e0.png)

**A**.**HTML_INJ3CTI0N**
Mac環境にてShadcn/uiで作ったDialogをズームイン・ズームアウトする方法

[shadcn/ui](https://ui.shadcn.com/)を使っていて出くわしたバグと仕様について書きます。shadcn/uiが何かという詳細な説明は省きます。

## 何が起きたか

[Shadcn/uiのDialog](https://ui.shadcn.com/docs/components/dialog)は簡単にダイアログを実装することができます。
shadcn/uiそのものはnpmのライブラリを持っているわけではなく、様々なライブラリのな組み合わせによって成り立っています。

Dialogについては `npx shadcn@latest add dialog` で生成されたDaialogコンポーネントを参照するとわかるように、 `@radix-ui/react-dialog` を使ってます。

MacでChromeを使っている方であれば、実際に上記Shadcn/uiのDialogのPreviewからダイアログを開いて見るとわかるように、トラックパッドによるピンチイン・ピンチアウトができません。（2024/12/4現在)
つまり、 __ダイアログが開いた状態だとズームイン・ズームアウトができない__ ということです。

## 原因と解決策

解決するには `@radix-ui/react-dialog` のバージョンを `1.1.2` にするだけでOKです。

実はこの問題はIssueがすでに存在おり原因も判明していて、つまるところ `react-remove-scroll` のバグでした。

https://github.com/radix-ui/primitives/issues/1554

ただ、上記のIssueでは「react-remove-scrollのバグを修正してパッチを適用すればOK」という内容でした。
パッチを用いた解決策をプロダクトに適用して保守していくのは面倒なことになるなぁと思い、 react-remove-scrollに対してPRを出して修正→radix-ui/primitives もPRを出してバージョンアップしてもらいました。

---

この問題自体は英語でGithub内をググればみつかるのですが、shadcn/uiは依存するライブラリが多すぎて問題（Issue）がどこにあるか分かりづらいため、日本語でここに残しておきます。

なお、Shadcn/uiのドキュメントページが修正されていないのは個人的に気になりますので、どなたか修正PRを出していただけるとすごく助かります。
多分以下URLの `"@radix-ui/react-dialog": "^1.1.1",` を `1.1.2` に変更するだけで問題ないと思います！！

https://github.com/shadcn-ui/ui/blob/805ed4120a6a8ae6f6e9714cbd776e18eeba92c7/apps/www/package.json#L33
Google公式のTransformerのcolabを2024年現在で動くようにした。

# 概要
Googleのtransformerのサンプルを動かそうとしたところ2024年12月現在では動かなかったので、**修正して動くようにしました**。
https://colab.research.google.com/drive/1GfSTyJPwXNyUV13ozFpeihbXbldkUAEk?usp=sharing
2024年12月現在正常に動くことを確認しました。
ご自由にお使いください。

# 詳細
Googleの**Transofomer**のサンプルは、tensorflowで**ポルトガル語**から**英語**に翻訳するサンプルです。日本語で説明してくれているのが嬉しいですね。
TransfomerのAPIを使っていなく、全ての要素を**tensorflowだけを使って書いている**ので、これからTransfomerを改造して性能を上げたい人におすすめです。
Apache Licenseなので改変して再配布は大丈夫なはずです。

# エラー原因
主に古いことが原因です。データセットのロード方法が少し変わっているのと、引数をtraining = trainingというようにしっかり指定しないとcolabに怒られるみたいです。
Synology NASでI/Oエラー

# イントロダクション -1
この記事は愚痴です。
誰かにとって有用な記事ではありません。

# イントロダクション
小さいながらも組織に属し、複数人で仕事をしています。
そうなると現在社会においては、NAS、使ってますよね？
いやほらクラウドでしょ？という声もあるかと思いますが、弊社はSynologyさんのNASを使っております。

# 突然のエラー
そのNASにある、とあるxlsmファイルが開けない、とモニターの向こうから聞こえてきました。
ファイルは?→ある
開こうとすると?→パスが無いか他のプログラムで使われているか、といったエラーをエクセルが吐き出す
コピーをすると?→エラー 0x8007045D:I/Oデバイスエラー
...だそうです。

# ファイルの確認
ブラウザを開いてNASに直接アクセスしてみることに。
目的のファイルをコピーして、別のフォルダにペーストしてみると→フォルダがロックされたか云々
うーん。
これは困った。

# やってみたと
+ NASの再起動

以上。
結果は変わらず。
えー?これ以外に何をやるべきなんだろう?

# 世代を戻せる？
DSMのデスクトップ的なところに、Synology Drive Adminコンソールがあるので、そこで世代管理していたんじゃないかなー?
って開いてみると、Synology Drive Serverが動いてないからダメですー!って怒られて、パッケージセンターで確認すると、ステータスは実行中になってる。
なんだろこの現象。
これじゃ戻せないよう。

# 物理的に戻してみる
目的のファイルは何年も前に作ったモノなので、物理的に古いHDDに残っているはず。
てことで乗せ換えてみたけど、Windowsのネットワークから見てみると、すでに登録されている云々て表示されて接続できず。
なにこれホントもうわかんない。

# 残ったもの
deleteもmoveもrenameも出来ない、ただ1つのxlsmファイル。
Dim が好きではないという話題について

# はじめに
これは、[Visual Basic Advent Calendar 2024](https://qiita.com/advent-calendar/2024/vb)の4日目の記事となります。

Visual Basic の Discord を眺めていたら、気になる話題がありました。

https://discord.com/invite/Y8EH5fF6WG

「Dim が好きではないので、ModVB で Let を拡張しています。」

この発言は、VB.NET の拡張コンパイラ[ModVB](https://qiita.com/yaju/items/2c154a939b9896c855e2) の開発者である [Anthony D. Green](https://anthonydgreen.net/) 氏です。彼は、Microsoft のマネージ プログラミング言語チームで 8 年の経験があり、主に Roslyn コンパイラ チームのプログラムマネージャーをしていた方です。

「1993 年に初めて GWBASIC を学んで以来、BASIC で理解できなかったことがあります。それは、Dim という単語がどこから来たのか (中略) 実際、私はいつもそれが不適切だと感じていました。」

この発言は、[Small Visual Basic](https://github.com/VBAndCs/sVB-Small-Visual-Basic) の開発者である Mohammad Hamdy 氏です。

これは、どういう理由なのでしょうか？
好き嫌いとか考えたこともありませんでした。

# Dim はどこから
変数宣言の時に使用する Dim ステートメントですが、「Dimension」の略語となります。
これは、配列を宣言するために使用されていた FORTRAN の用語 DIMENSION から、BASIC の最初のバージョン（米国ダートマス大学、 1966年頃）で採用されました。

FORTRAN の初期の頃は、すべての変数は数値型で、1文字の変数名が常に宣言され、配列はデフォルトで10個の要素を持っていた。配列のデフォルトが正しくない場合に Dim が必要でした。しかし、これは次元を意味します。そのため、VB には次元を「変更」するための ReDim ステートメントがあります。

>変数は基本的に浮動小数点数である。変数名は、AからZまでと、後ろに数字を1文字続けた2文字（A0、Z9 など）が可能で、全部で286個の変数が使える。配列名はAからZまでに限られる。配列は定義しなくても使えるが、DIM文で定義していない配列は要素数10（添え字が1から10まで）となる。
[ダートマスBASICのWikipediaページ](https://ja.wikipedia.org/wiki/%E3%83%80%E3%83%BC%E3%83%88%E3%83%9E%E3%82%B9BASIC)より

https://qiita.com/yaju/items/38f63900491d4ac51af7

# 忘れられている LET
本来、DIM は "深さ" または次元ごとに許可される要素数を持つ要素を作成するためのものです。つまり、配列の次元を指定するために使用され、スカラー(単体)は別の方法で宣言されました。

それが「LET」です。

https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/let-statement

使用例は、明示的な Let ステートメントを使用して、式の値を変数に割り当てます。

```vb
Dim MyStr, MyInt
' The following variable assignments use the Let statement. 
Let MyStr = "Hello World"
Let MyInt = 5
```

次の例では、Let ステートメントを使用せずに同じ代入を行います。

```vb
Dim MyStr, MyInt
MyStr = "Hello World"
MyInt = 5
```

省略可能であるため、すっかり存在を忘れていました。

## インライン変数の初期化
VBScript や VBA では、Dim は変数の宣言するだけで次のインライン変数の初期化のようなことが出来ないんですよね。

```vb
Dim MyStr = "Hello World"
Dim MyInt = 5
```

つまり、それが Let の役割だった。

# 最後に
話題の発端は、Small Visual Basicの開発者である Mohammad Hamdy 氏が、Small Visual Basic を VB.NET に一歩近づけるため Dim を追加しようと考えていた際に、
代わりに Let を使うべきか、それとも Dim を使うべきか を悩んでいたわけです。

その回答として、「Dim が好きではないので、ModVB で Let を拡張しています。」と返していました。

英語がネイティブの方にとって、Dim は「Dimension」の略語で、深さや次元という意味で配列用だったのに、スカラー(単体)用としても扱えてしまうことに違和感があったということですね。
トランスポート層とは

# トランスポート層
>トランスポート層はネットワーク層の上位にあり、送信元マシンから宛先マシンまでの間、使用中の物理的ネットワークから独立に、必要なレベルでの信頼性を保ったデータ転送を実現している。

>トランスポート層は、アプリケーションがネットワークを使用する際の抽象化された機能を提供する。

# トランスポート層の役割
>トランスポート層の究極の目的は、`効率的で信頼性があり、コスト効率の良いデータ転送サービスをユーザー（通常はアプリケーション層のプロセス）に対して提供する`ことである。トランスポート層は、ネットワーク層から提供されるサービスを利用してこの目的を達成する

# OSなどのトランスポート・エンティティがトランスポート層の仕事をする
>トランスポート層内でこの仕事を行うソフトウェアあるはハードウェアは、`トランスポート・エンティティ(transport entity)`と呼ばれる。トランスポート・エンティティは、`オペレーティング・システムのカーネル`や、`ネットワーク・アプリケーションに付属したライブラリ・パッケージ`、`個々のユーザー・プロセス`、あるいは`ネットワーク・インターフェース・カード`などに存在する。

# ネットワーク層の２種類のプロトコルに対応する処理
>ネットワーク層のサービスにはコネクション指向とコネクションレスという２つのタイプが存在するため、それに対応してトランスポート層のサービスにも２つのタイプである。

### コネクション指向の場合
>コネクション指向のネットワーク層サービスと多くの類似点を持つ。

>両者とも`コネクションには３つのフェーズ（確立、データ転送、そして解放）`があり、`アドレッシングとフロー制御を類似`している。

### コネクションレスの場合
>コネクションレスのネットワーク層サービスとよく似ている。しかしながら、単一のパケットを送信した直後にコネクションを解放するように設定するのは非効率であるため、`コネクション指向のネットワーク層サービスの上にコネクションレスのトランスポート層サービスを提供`するのは困難である。

# トランスポート層とネットワーク層が別々にいるのか？
>トランスポート層サービスがネットワーク層サービスと類似しているのならば、なぜ２つの別の層が存在するのか。一つの層では不十分なのだろうか。答えは難解であるが、非常に重要である。

### トランスポート層とネットワーク層の環境の違い
>トランスポート層のコードは完全にユーザーのマシン上で動作しているのに対し、ネットワーク層（少なくともWANでは）通信事業者によって運用されているルーター上で動作している。

# 仮にネットワーク層でトラブルが起こるとどうなるか？
### トラブル
>仮に、ネットワーク層が低信頼のサービスを提供する場合、何が起こるだろうか。頻繁にパケットが落ちるとしたらどうなるだろうか。

>あるいはルーターが時々クラッシュするとしたらどうなるのか。

### これらトラブルにユーザーが対処するには
>ネットワーク層について実際の制御を持たないから、もっと良いルーターを使ったり、データ・リンク層で誤り対策を行うことにより、貧弱なサービスを改善することはできない。唯一ユーザーができるのは、`ネットワーク層の上にもう一度別の層を配置し、サービスを改善させる`ことである。

### トランスポート層がネットワーク層のトラブルをキャッチ
>コネクションレス・ネットワークにおいて、`パケットがロスしたり、壊されたりした場合、トランスポート・エンティティは問題を検出し、再送によって補う`ことができる。コネクション指向のネットワークにおいてトランスポート・エンティティは、送信途中にネットワーク・コネクションが不意に（つまり、何が起こったかという通知なしに)切断したことを知らせると、遠隔のトランスポート・エンティティに新規のネットワーク・コネクションを設定することができる。このコネクションを用いて到着済みのデータと未到着のデータとそのデータがあった場所を相手に問い合わせ、中断した箇所からデータ転送を再開する。

>本質的には、トランスポート層の存在により、トランスポートサービスは下位の信頼性の低いネットワーク層よりも高い信頼性を提供できる。

# トランスポート層はネットワークとアプケーションを分離させる層
>トランスポート・プリミティブは、ネットワークごとに`異なるネットワーク・プリミティブと独立に設計できる`（例えば、コネクションレスのイーサネットに基づく要求はコネクション指向のネットワークの要求とかなり異なる）。
### 異なるネットワーク・プリミティブの違いを隠し、置き換えることができる
>トランスポート・サービス・プリミティブ群が`その裏側にネットワーク・サービスを隠すことにより、ネットワークが変更されても同等の別のライブラリ手続きに置き換える`ことで確実に対応できる。`ネットワーク層のアプリケーションが切り離されている`ことは素晴らしいことである。

>トランスポート層のおかげで、アプリケーション・プログラマはプリミティブの標準セットを用いてプログラムを記述することができ、`異なるネットワーク・インタフェースや信頼性のレベルをについて気にすることなく`、`広域のさまざまなネットワーク・プリミティブを持ち、決して変化がない`ことが保証されていれば、トランスポート層はおそらく必要とされないであろう。しかし現実には、トランスポート層は`ネットワークの技術、設計、不完全さから上位層を分離させるという重要な役割`を果たしている。

# トランスポート層が境界線
### 境界から上下で立ち位置が変わる
>多くの人が第一層から第四層までの下位層と、それより上位の層を質的に区別する。
下位四層は`トランスポート・サービス・プロバイダ(transport service provider)（サービス提供者）として、上位層はトランスポート・サービス・ユーザー(transport service user)（サービス利用者）と見なすことができる。
### 境界線
>プロバイダとユーザーの区別は、高信頼データ転送サービスのプロバイダとユーザーの間に明確な境界線を引くものであり、階層の設計に大きな影響を与え、トランスポート層を重要なものとして位置付けている。その境界はアプリケーションから見える。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/