OmniAICreator/Qiita-1.07M huggingface dataset:
Spring BootでExcel作成

## 概要

ApachePoiを利用してExcelファイル出力を行う。
通常はAbstractXlsxViewを継承したクラスを作成して、Excel出力を行う。
ただこの場合、レスポンスを返すときにExcelを作成しているので、出力に失敗した場合にController上でハンドリングできない。
以下では、AbstractViewを継承して、一部AbstractXlsxViewを踏襲したクラスを作成する。
またxlsにも対応させ、テンプレートのExcelファイルがある場合はこれも利用できるようにして、汎用的なクラスにしている。

## AbstractXcelView

```Java
public abstract class AbstractXcelView extends AbstractView {

	protected String templateFile;

	private Workbook workbook = null;

	public void createWorkbook(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		if (Objects.isNull(templateFile)) {
			Object fileName = model.get("fileName");
			if (FilenameUtils.getExtension((String) fileName).equals("xlsx")) {
				workbook = new XSSFWorkbook();
			} else {
				workbook = new HSSFWorkbook();
			}
		} else {
			try (InputStream is = new ClassPathResource("excel/" + templateFile).getInputStream()) {
				workbook = WorkbookFactory.create(is);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		buildExcelDocument(model, workbook, request, response);
	}

	@Override
	protected boolean generatesDownloadContent() {
		return true;
	}

	@Override
	protected final void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		String fileName = (String) model.get("fileName");
		if (fileName != null) {
			String encodedFilename = URLEncoder.encode(fileName, "UTF-8");
			response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFilename);
		}

		response.setContentType(getContentType());
		ServletOutputStream out = response.getOutputStream();
		workbook.write(out);
		workbook.close();
	}

    // AbstractXlsxViewを踏襲
	protected abstract void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request,
			HttpServletResponse response) throws Exception;

}
```
## TestController

- AbstractXcelViewを継承したTestExcelViewを用意する（buildExcelDocumentを実装する）

```Java
@Controller
@RequestMapping("/test")
public class TestController {

	@Autowired
	private TestService testService;

	@RequestMapping("/excel")
    public ModelAndView excel(TestForm form, ModelAndView mav
			HttpServletRequest request, HttpServletResponse response) {
        List<Test> dataList = testService.getDataList();
        mav = new ModelAndView(new TestExcelView());
        mav.addObject("dataList", dataList);
		mav.addObject("fileName", "test.xlsx");
		try {
			View view = mav.getView();
			if (view instanceof AbstractXcelView) {
				((AbstractXcelView) view).createWorkbook(mav.getModel(), request, response);
			}
		} catch (Exception e) {
			// エラーの場合
		}
		return mav;
	}
}
```
Azure から Internet への ICMP の取り扱いについて

# 1. はじめに
Azure を構築する上で、ICMP 通信の許可が分かり難いため、本記事でまとめることにしました。
実際に構築いただくと分かるのですが、「NSG や Firewall で許可・拒否すればいいんじゃないの？」といった話だけではなく、そもそも Azure 基盤側で構成によって ICMP の透過が異なりますのでご注意ください。（ハマった人より）

# 2. Azure 環境の大原則
大原則として、Azure では **Azure Load Balancer を経由する通信で ICMP プロトコルを許可していません。** テスト用途では Port Ping を使うようにガイドが行われています。実際にAzure VM との ICMP 通信が通る・通らない動きの背景には、サービス上 Azure Load Balancer が経路に存在することを理解すれば分かりやすいです。

https://learn.microsoft.com/en-us/azure/cloud-services/cloud-services-connectivity-and-networking-faq#can-i-ping-a-cloud-service-

# 3. 構成パターンサマリー
結果から記載すると以下のような形になります。

| No   | ケース  | ICMP<BR>Inbound<BR>IPv4 | ICMP<BR>Outbound<BR>IPv4 |
| --- | --- | --- | --- |
| 1 | Azure VM にパブリック IP が付与されているケース | 〇 | 〇 |
| 2 | Azure VM にパブリック IP が付与されていない<BR>Azure 基盤で提供されているデフォルト経路にて外部へ通信する | - | × |
| 3    | Azure VM は Azure Firewall を通じて外部へ接続する | ×<BR>DNATなどを想定 | × |

なお、前提事項として ICMP を通す設定が行われているものとします。
- Azure VM の NSG (Network Security Group) では ICMP を許可している
- OS 上の Firewall 機能は ICMP が許可されている (Windows Firewall, Linux Firewalld など)

## 3.1 Azure VM にパブリック IP が付与されるケース (ILPIP)
- PIP (Public IP Address) を Azure VM に付与するケースです。
- インスタンスレベル パブリックIP (ILPIP)と呼ばれたりします。
- このケースでは仮想マシンに対してパブリック IP がマッピングされて内外の通信が行われるため、NSG や HostFirewall の ICMP を許可してあげれば ICMP が通過します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/6673d47a-adc0-eb00-f0c8-a153814eec69.png)

## 3.2 Azure VM にパブリック IP が付与しない、アウトバウンドは標準のAzure アウトバウンド環境のケース
- Azure VM を作る際にパブリック IP を付与しないケースです。
    - 外部からの通信許可を与えたくない、接続は Express Route 経由、もしくは Azure Bastion からの接続などのケースが考えられます。
- Internet への通信は Azure 基盤環境を通じてアウトバウンド許可が行われます。
- このケースでは ICMP Outbound (Ping) は通りません。Azure 基盤側の仕様になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/a5bbdb55-1165-d5d5-0e23-3e1ca386b551.png)

## 3.3 Azure Firewall / NVA を用いて Internet に接続するケース
- Enterprise の構成で、Hub & Spoke の Azure リファレンスアーキテクチャーを用いる代表的なケースです。
- Azure からの外部接続はセキュリティ上 Azure Firewall / NVA を通じて行います。
    - ルート定義をサブネットに設定することで、0.0.0.0/0 を Azure Firewall に向けるなど
- このケースでは、ICMP Outbound (Ping) は通りません。
    - ご存じの通り、Azure Firewall / NVA は内部で冗長化されており、通信の負荷分散に Azure Load Balancer が経路上存在するのが理由となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/8e44d676-0adc-a6d6-a5e1-ae05f63785f2.png)


# 4. まとめ
クラウド環境からの死活監視や正常性確認に ICMP Polling / Ping チェックなどを実行されている方は多いと思うのですが、いざ実行した際に ICMP 応答が返ってこない・・・（でも Web サービスは出来ている・・）といった事象は、Azure 基盤側の仕様が理由になっていることもあるのでご注意ください。

＊本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。
cupsdiable, cupsreject

cupsdisableであれば、キューは受け付ける。処理は停止
cupsrejectは、キューを受け付けない
```
[linuxstudy@localhost ~]$ sudo cupsdisable -c -r "stopped by owner" lp1
[sudo] linuxstudy のパスワード:
[linuxstudy@localhost ~]$ sudo cupsreject pr1
[linuxstudy@localhost ~]$ lpstat -t
スケジューラーは動作中です
システムのデフォルトの宛先: pr1
lp1 のデバイス: lpd://netprint/lp1
pr1 のデバイス: serial:/dev/ttyS0?baud=1200+bits=8+parity=none+flow=none
lp1 は 2023年07月14日 15時38分13秒 からリクエストを受け付けています
pr1 は 2023年07月14日 15時15分58秒 からリクエストを受け付けていません -
	Rejecting Jobs     //cupsreject
プリンター lp1 は 2023年07月14日 15時38分13秒 から無効です -
	stopped by owner       //cupsdisable
プリンター pr1 は待機中です。2023年07月14日 15時15分58秒 以来有効です
	Rejecting Jobs
```
週一でPython勉強会やってみる⑫

前回の続き

https://qiita.com/Waddy675/items/55790ab63ae8b844a1e4

最近悩みが尽きない人←

## スクレイピング
Pythonで自動化するという話をするとよくやる「スクレイピング」をやってみる。
スクレイピングは削り取る的な意味で、今回はHTMLの構造などを抽出する**Webスクレイピング**ができるかを試す。

メンバー1「実際よそのWebサイトの情報抜き取るって泥棒だよね」
総務省とかがスクレイピングしているなど色々ありますが、個人できちんと調べて、違法にならないかを確認すること。
Webサイト作る側はスクレイピングされたくなかったらきちんと対策しておきましょう。

今回はHTMLを扱うために**Beautiful Soup**を使用。（教科書通り

お題：弊社HPのヘッダー画像でもダウンロードしてみる。
``` py
import requests
from bs4 import BeautifulSoup

url = "弊社URL"

html = requests.get(url).text
soup = BeautifulSoup(html)

list = soup.select("画像があるクラス名")

for a in list:
  text = a.img.get("alt")
  if "画像のalt属性に含まれるワード" in text:
    imgUrl = url + a.img.get("src")
    response = requests.get(imgUrl)
    with open('取得画像.svg', 'wb') as fp:
      fp.write(response.content)

```

簡単にできた。と思いきやいくつか躓いた点があったので下記に記載。

## HTMLタグ要素ってどうやって確認するの？
Chrome使っている場合はF12キーで開発者ツールを起動し、Ctrl＋Shift＋Cで取得したい項目を選択する。
すると、該当のHTMLタグに飛べるのでclassやidが分かる。

## imgのalt属性ってどうやって取得するの？
**get("hoge")** で取得可能。取得できればstr型で、取得できないとNoneになる。

## 文字列検索ってどうやるの？
"検索したいワード" in 検索対象文 もしくはfind()関数で判断可能。
↑地味に使い方を逆にしてたせいで動かなかった。。。英語ちゃんと読めば分かりますね・・・


## まとめ
スクレイピングを使うことで各Webから必要な情報を持ってきて一覧にできたり、定例業務の効率化ができる。
とはいえ、本当に泥棒になる可能性もあるので、みんなやってるかといって気を抜かないように。
Gitのコミットメッセージ


[Semantic Commit Messages](https://gist.github.com/joshbuchea/6f47e86d2510bce28f8e7f42ae84c716) を定義した方がいるため、こちらを参考にコミットメッセージのテンプレートを作成する。[Conventional Commits](https://www.conventionalcommits.org/ja/v1.0.0-beta.4/) に絵文字を追加したようなルールになっているのでコミットをしたときに絵文字がカラフルで見やすいのが特徴。

### 1. コミットメッセージテンプレートを作成する

適当なところに下記のファイルを作成する。

```bash:.gitcommit_template
# ==== Commit Messages ====

# ==== Commit Messages(Template) ====
# <Prefix> <Emoji> #<Issue Number> <Title>
# 例) feat :sparkles: #777 ログイン機能を実装

# ==== Prefix Emoji ====
# feat: :sparkles: 機能の追加や変更
# docs: :memo: ドキュメントの更新
# fix: :bug: バグ修正
# refactor: :recycle: リファクタリング
# test: :green_heart: テストコードの追加や修正
# chore: :building_construction: ビルドツールの導入や依存関係を更新など
```

github に push をするとこのようにコミットメッセージが表示されるようになる。
絵文字は以下から好きなものを引っ張ってくると良い。

- https://www.webfx.com/tools/emoji-cheat-sheet/

```
feat: ✨ 機能の追加や変更
docs: 📝 ドキュメントの更新
fix: 🐛 バグ修正
refactor: ♻️ リファクタリング
test: 💚 テストコードの追加や修正
chore: 🏗️ ビルドツールの導入や依存関係を更新など
```

### 2. 作ったテンプレートを git と連携させる

```yaml:~/.gitconfig
[commit]
    template = ~/.gitcommit_template
```

### 使い方

```bash
$ git commit
# -m(--message)でワンラインで記述をするとテンプレートが発動しないため注意

# ==== Commit Messages ====

ここにコミットメッセージを入力する
feat :sparkles: #777 ログイン機能を実装

# ==== Commit Messages(Template) ====
# <Prefix> <Emoji> #<Issue Number> <Title>
# 例) feat :sparkles: #777 ログイン機能を実装

# ==== Prefix Emoji ====
# feat :sparkles: 機能の追加や変更
# docs :memo: ドキュメントの更新
# fix :bug: バグ修正
# refactor :recycle: リファクタリング
# test :green_heart: テストコードの追加や修正
# chore :building_construction: ビルドツールの導入や依存関係を更新など
```
【interact.js】ドラッグアンドドロップテスト

いつか何かに使えるであろうドラッグアンドドロップのテスト

```js
import React, { useEffect, useRef } from "react";
import interact from "interactjs";

const DraggableSquare = () => {
  const squareRef = useRef(null);

  useEffect(() => {
    //MEMO: squareRef.currentが!(false)のとき、処理を終了する
    if (!squareRef.current) {
      return;
    }

    interact(squareRef.current).draggable({
      inertia: true,
      modifiers: [
        interact.modifiers.restrictRect({
          restriction: "parent",
          endOnly: true,
        }),
      ],
      autoScroll: true,
      onmove: dragMoveListener,
    });
  }, []);

  const dragMoveListener = (event) => {
    var target = event.target,
      x = (parseFloat(target.getAttribute("data-x")) || 0) + event.dx,
      y = (parseFloat(target.getAttribute("data-y")) || 0) + event.dy;

    target.style.transform = "translate(" + x + "px, " + y + "px)";

    target.setAttribute("data-x", x);
    target.setAttribute("data-y", y);
  };

  return <div ref={squareRef} style={{ width: 100, height: 100, backgroundColor: "blue" }} />;
};

export default DraggableSquare;
```

実行すると、マウス位置とのズレが発生するので今後改善するかも

ほな、また
本番環境をdockerで立ち上げる

``` 
 backend:
    build:
    context: ./backend
    # productionを指定する
    command: bash -c "bundle exec rails s -p 3000 -e production -b '0.0.0.0'"
    volumes:
      - "./backend:/app"
    environment:
      POSTGRES_USER: $POSTGRES_USER
      POSTGRES_PASSWORD: $POSTGRES_PASSWORD
      RAILS_MASTER_KEY: sdfhsfdhsdddddgdgdfgdgdgdfgdfgdfg
      SECRET_KEY_BASE: sdfhsfdhsdddddgdgdfgdgdgdfgdfgdfg
    　　　　　#backend/config/credentials/production.keyの中身↑
      
    ports:
      - "$VUE_APP_API_PORT:3000"
    stdin_open: true
    tty: true
    depends_on:
      - db
```
ghostscript

ghostscriptはepsを処理する

x11にkan.epsを出力する
```
[linuxstudy@localhost ~]$ gs -sDEVICE=x11 kan.eps
GPL Ghostscript 9.25 (2018-09-13)
Copyright (C) 2018 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
>>showpage, press <return> to continue<<
```

epsを用意するためにGIMPをインストールした。ネットで拾ってきたJPEG画像をエクスポート。エクスポート先をepsにする
AI-OCRはDXに寄与するか

AI-OCRへの私の引っかかりをポエムとして書き起こしてみました。


# AI-OCRとは
AI-OCRはAI技術を活用した光学文字認識の仕組みやサービスです。
この技術によって紙からデータへの書き起こし作業を自動化することが可能になります。
紙書類を受領し人間がデータに書き起こして取り込むという業務フローが、紙書類をAI-OCRでデータに変換しシステムに取り込む流れに置き換わります。
この書き起こし作業は時間がかかりミスも多いため機械的に自動化されることは非常に意義があります。

# AI-OCRへの懸念
ただ、AI-OCRがDXに寄与しているとは一概には断言できません。
そもそもDXとは、デジタル技術を社会に浸透させて人々の生活をより良いものへと変革することです。
確かにAI-OCRはデジタル技術を使用して作業時間を削減し、作業精度を向上させることができます。
しかしAI-OCRがあることで<b>本来必ずしも必要でない紙業務が存在し続けてしまう</b>という危険性があります。

# DXとAIOCR導入のジレンマ
私が思う真のDXとしては紙業務を根本的になくし、人の作業を排除したシームレスなシステム連携や業務フローのシステム化と思っています。
しかしAI-OCRを業務に導入してもインプットとしての「紙」は残り、データ形式への文字起こし作業は依然として行われます。
それを行うのが人か、機械かというだけです。
つまりAI-OCRを導入し業務フローに組み込むことで、逆に「紙」業務を守ってしまう可能性があります。

一方で、AI-OCRが工数削減などで具体的数字をもった大きな効果をもたらすのは確かです



# 便利さゆえの紙業務への依存
弊社では現在AI-OCR製品を積極的に活用しています。
しかし、中にはAI-OCRを使わずに最初からデータを受け取れば問題が解決するケースもあるに関わらずAI-OCRを業務に組み込んでしまうこともあります。
本当に紙で受領しなければならないのか、データで受領が可能なのではないか　が深く議論されないまま業務にAI-OCRが導入され、AI-OCRがなければそもそも「紙」でなくできた可能性を捨てて「紙」のままAI-OCRを組み込んだ業務フローが再構築されます。

理由としてはお客様と交渉して受領形式を変えるよりAI-OCRを設定して使うほうが簡単であるからです。
ただこれは私の懸念そのものであり、効率化や品質はよくなってることは間違いないのですが本質的なDXに逆行しているのではないかと思うのです。


# 結論
外的要因により紙でやらざるをえない業務に絞りAI-OCRを活用すべきという意識を常にもったうえで活用すること　だと思います。
(住民税業務や年末調整調整など自治体や国がフォーマットを決めているものなど)

避けるべくは「OCRがあるから大丈夫」と思考停止に陥り、本来必要でないはずのインプットとしての「紙」が依然として業務内に存在し続けること。
このような状況を避けるためには常に最善の方法を模索し、OCRの必要性について常に意識をしておくことが大事なのだと思います。
【Flutter】Firebaseを使った際のAndroidビルドエラーの治し方。

## 概要
##### ※この記事はFlutterを始めて一週間の人が書いている備考録です。
少し前にFirebaseを使ったログイン機能があるToDoアプリを作ろうとした時に下記エラーが発生しました。
```shell
Launching lib/main.dart on M2101K6R in debug mode...
Running Gradle task 'assembleDebug'...

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:mapDebugSourceSetPaths'.
> Error while evaluating property 'extraGeneratedResDir' of task ':app:mapDebugSourceSetPaths'
   > Failed to calculate the value of task ':app:mapDebugSourceSetPaths' property 'extraGeneratedResDir'.
      > Querying the mapped value of provider(java.util.Set) before task ':app:processDebugGoogleServices' has completed is not supported

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 1s
Exception: Gradle task assembleDebug failed with exit code 1
```
無事解決しましたので治し方を備考録として貼っておきます。
## 治し方
`project/android/app/build.gradle`を開き、コード内から`apply plugin: 'com.google.gms.google-services'`を探してcmd+/またはctrl+/でコメントアウトしてください。
salesforce 入力規則実装例

半角８桁入力規則の実装例：
AND (
NOT ( ISBLANK ( 項目名 ) ) ,
NOT ( REGEX ( 項目名 , "^[ -~ｦ-ﾟ\r\n]*$" ) ),
LEN(項目名) > 8
)

半角英数字入力規則の実装例：
AND (
NOT ( ISBLANK ( 項目名 ) ) ,
NOT ( REGEX ( 項目名 , "^[a-zA-Z0-9]*$" ) )
)

全角入力規則の実装例：
IF ( ISBLANK ( 項目名 ), FALSE, NOT (REGEX( 項目名 , "^[^a-zA-Z0-9ｦ-ﾟ!-~ ]+$") ) )

株式会社PanGuはsalesforce、Java、mulesoft、serviceNowなどの技術者を募集中です！
メール：wangyu@panguinfo.com
【IBM Application Gateway】Docker環境でよく使うコマンド/デバッグ設定

# はじめに

Docker上にデプロイしたIBM Application Gatewayのコンテナとバックエンドアプリケーションを連携させたときの問題対応するときによく使うコマンドを紹介いたします。

# よく使うコマンド

```
dockerサービスの起動、ステータス確認
sudo service docker start
sudo service docker status

コンテナの停止、削除
docker stop <コンテナ名>
docker rm <コンテナ名>

```

```
IBM Application Gatewayのコンテナ起動
$ sudo docker run --hostname <ホスト名> --name <コンテナ名>
--detach --publish 8443:8443 --volume /mnt/c/IAG/xxx/:/var/iag/config/
--env LANG=ja  icr.io/ibmappgateway/ibm-application-gateway:23.04
```

```
コンテナのログ確認
$ docker logs <コンテナ名>
IBM Application Gateway バージョン 23.04 (Build 230424) https://ibm.biz/ibm-app-gateway
Copyright (C) IBM Corporation 1994-2023.  All Rights Reserved.
～～～省略～～～
```

```
コンテナ内へのアクセス
$ docker exec -it <コンテナ名> /bin/bash
```

```
コンテナのConfig.yaml設定確認
$ docker exec -it <コンテナ名> /bin/bash
$ cat /var/iag/config/config.yaml
```

# デバッグ設定とログ確認
```
config.yamlに以下のエントリを設定。trace/snoop/fsssoログの出力設定する。
デフォルトで、 /var/iag/logs/フォルダがあるため、その下に出力するのがわかりやすい。

logging:
  tracing:
    - file_name: /var/iag/logs/trace.log
      component: pdweb.debug
      level: 9
    - file_name: /var/iag/logs/snoop.log
      component: pdweb.snoop
      level: 9
    - file_name: /var/iag/logs/fsso.log
      component: pdweb.wan.fsso
      level:     9
```

```
ログの確認方法① コンテナ内のファイルを参照する
コンテナ内にアクセス
$ docker exec -it <コンテナ名> /bin/bash
デバッグファイルを確認
$ cat /var/iag/logs/trace.log
grepコマンドも利用できる。
$ cat /var/iag/trace.log  |grep server
tailコマンドも利用できる。
$ cat /var/iag/trace.log  |tail -n 10
grepで該当する行の後も一緒に表示する。（-A 10 で10行表示）
$ cat /var/iag/trace.log  |grep -A 10 server
Trace.logで特定リクエストが行われた時刻を確認した後、snoop.logでリクエストの詳細をを確認する。
$ cat /var/iag/snoop.log  |grep -A 100 2023-08-09-07:06:07.706
```

```
ログの確認方法② コンテナ外にファイルを出力する。
IBM Application Gatewayのコンテナ起動時に、コンテナ外のストレージとファイルをマッピングしておく、

sudo docker run --hostname <ホスト名>  --name <コンテナ名>
--detach  --publish 8443:8443 --volume /mnt/c/IAG/xxx/:/var/iag/config/ 
--volume /mnt/c/IAG/xxx/trace.log:/var/iag/trace.log
--volume /mnt/c/IAG/xxx/snoop.log:/var/iag/snoop.log
--volume /mnt/c/IAG/xxx/fsso.log:/var/iag/fsso.log
--env LANG=en  icr.io/ibmappgateway/ibm-application-gateway:23.04
```
異なるAWSアカウント間でプライベートなFTP通信

VPCピアリングを用いて、異なるVPC間でのプライベートIPを使用したFTP接続をやってみます。

# ■VPCピアリングとは？
VPCピアリング（VPC Peering）は、異なる2つのVPCを直接的に接続するための仕組みです。
VPCピアリングを使用すると、異なるVPC間でプライベートIPアドレスを使用して通信することができますので、異なるVPCの間でセキュアかつ低遅延の通信を実現することができます。

VPCピアリングでは、リクエスタのアカウントがアクセプタのアカウントに対してピアリング接続のリクエストを送信し、アクセプタがそれを承認することでピアリング接続が確立されます。

# ■VPCピアリングにおける「リクエスタ」と「アクセプタ」
VPCピアリングでは、「アクセプタ（Accepter）」と「リクエスタ（Requester）」という用語が使用されます。
あまり聞きなれない言葉ですが、ピアリングをリクエストする側とされる側という事です。

リクエスタ（Requester）:
ピアリング接続のリクエストを発行する側のVPC。
アクセプタに対して接続を確立するように要求します。

・アクセプタ（Accepter）:
ピアリング接続のリクエストを受け取る側のVPC。
リクエストを受け取り、承認または拒否の判断を行います。

# ■やってみる

まずはどちらかのVPCにて接続したいVPCへのピアリング接続を作成します。
VPCのコンソール画面にてピアリング接続へ進み、ピアリング接続を作成しましょう。
この時、アクセプタとなる接続先のAWSアカウント番号とVPC IDが必要となります。

![接続の作成20230713173221.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/1eb0cd5e-6617-3de6-05ee-f93e85939ee7.png)

ピアリングを作成するとアクセプタ側でのピアリング承諾が必要となります。
アクセプタ側のVPCコンソール画面からピアリングを承諾します。

![承諾20230713175234.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/ef2d4287-da7b-c427-c78c-80be2a1d6c17.png)

承諾をする事で、異なるAWSアカウントのVPC間でのピアリング接続が作成完了となりました。
ピアリングはできましたが実際の接続には、ルートテーブルの追加が必要になります。

ピアリング後にもルートを追加する旨、表示が出ていました。

![ルート追加1_20230713180235.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/7ce007e2-df9b-71c6-c865-f496add19b87.png)

今回接続したいサブネットに設定されているルートテーブルへ、お互いのCIDR、今回作成したピアリング接続を追加します。

![ルート追加2_20230713180518.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/2c42a02a-f28f-a2eb-c986-b0f5dd2643c1.png)

またセキュリティグループでも同様にピアリング先のIPアドレスをCIDRで許可しておきましょう。
ここまでの設定が完了した所で、ftpでのファイルアップテストを行った所問題なくファイルアップができました！
もちろんFTPだけでなく、SSHなどの通信でもピアリングは利用できます。

![接続完了_20230714010726.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/2771b31f-b4c4-dd1a-854c-6216411cf144.png)

# ■終わりに
ピアリング接続の概要は把握していましたが、初設定でした。
設定についてはかなり簡単に完了できた印象です。どなたかのお役にたてば。
Azure Databricks にて他テナントの Databricks アカウントコンソールにログインする方法

## 概要

Azure Databricks にて他テナントのアカウントコンソールにログインする方法を共有します。

次の URL から接続できます。`{DATABRICKS_ACCOUNT_ID}`の箇所を Databricks のアカウント ID （例：`https://accounts.azuredatabricks.net/?autoLogin=true&account_id=43036428-XXX-XXX-XXX`）に置換する必要があります。

```text
https://accounts.azuredatabricks.net/?autoLogin=true&account_id={DATABRICKS_ACCOUNT_ID}
```

Databricks のアカウント ID を含めた URL は、Databricks workspace にて簡単に取得できます。Databricks Workspace にて、右上のアカウント名を選択後に`Manage account`のリンク先の URL を確認すると、Databricks のアカウント ID を保持した URL となっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f7ba1fe9-348d-229f-a287-2cac02c8cf95.png)

一度ログインすると、Databricks アカウントコンソールにて`Switch account`という項目から切り替えれるようになります。そのため、本記事では、Databricks Workspace からログインする方法を紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/41c8da82-c1d9-7e6e-0e52-86cb58c3e5cd.png)

## 他テナントの Databricks アカウントコンソールに接続する方法

### 1. アカウントコンソールにログインしたいテナント上の Databricks Workspace に接続し、右上のアカウント -> `Manage Account`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5500410a-eb65-97b3-b6d3-c4791dc4a9f1.png)

### 2. ログイン想定の Databricks のアカウント ID のアカウントコンソールに接続できることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c3ed2763-da68-21c4-8d00-d442608ca73c.png)
初めてWebサービスをリリースしたらプチバズった話

## 宣伝

先日、ゆっくり解説などの「ゆっくり動画」を台本から自動で作成するWebアプリケーション、「**YMovieHelper**」を作成しました。

ゆっくり実況などに興味がある方は一度確認していただくと面白いと思います。

https://ymovie-helper.vercel.app

## TL;DR

誰にでも使えるもの、ではなく出来るだけ狭いコミュニティに向け、刺さるものを作れば**運が良ければ**バズるという話です。

## 著者について

ただの学生エンジニアです。初めてWebサービスをリリースしたひよっこなので以下の文章は全て主観に基づいたものであり、必ず正しいとは思っていません。

無論、以下に述べたことを行ってバズるという再現性もあまりないと思います。その点に注意して読んでいただければと思います。

## バズったきっかけ

これを読んでいる方は私の作ったアプリケーション自体に興味はなくて、どうやってバズったか、どうやったらバズるかに興味があると思うのでそれについてまとめたいと思います。

これは単純に「ゆっくり動画を作成しているクリエイター」という狭く具体的なペルソナを設定し、その方々に刺さる紹介文とは何かを推敲したからに尽きると思っています。

クリエイターであればTwitterをやっている場合も多く、コミュニティが形成されていることも用意に想像がつきました。結果、大量にリツイートが行われ、およそ600いいね、300リツイート、250ブックマークをされるというプチバズを観測しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514997/9a92272e-41d7-5b0e-a57a-2ce397085278.png)


私にはおよそ700人ほどのフォロワーがいますが、そのリツイートのほとんどはフォロワー外の方でした。ゆっくり動画のコミュニティに入り込んでおけばもっと伸びたのかもしれませんが、それは私の怠惰です。

「ゆっくり動画を作るのは楽しいけど、単純作業が想像以上に面倒である」という潜在的な不満に応えるための紹介文として「ゆっくり動画を台本から半自動で作成する」という言葉を使いました。

もちろん、バズったのはただの運で、そこからアクティブユーザーが継続的に流入しているのもただの運だと思っていますが、その運も完全なランダム要素ではなくリリース前にある程度は確率を上げられるだろうということです。

------

ここから後は同じ学生エンジニアの方に向けた言葉にはなりますが、何を作りたいか分からないという人はまず、プログラミングという土俵から離れることを考えましょう。初心者にありがちなのが、「プログラミングを...できるツールを作ろう」という発想です。今注力しているものにしか視野が広がらないのは危険です。基本的に世の中のことは「何か」×「何か」で成功しています。なので、「プログラミング」×「自分の好きなもの（よく理解しているもの）」で何かを作るのが良いと思います。

自分の好きなもの（よく理解しているもの）に対する不満を羅列し、それを解決するツールを作成すれば自ずと独自性のあるものになっているはずです。作り始めればわかりますが、案外完成させることは難しくありません（保守運用という地獄が待っていますが...）。

------

## 心に留めておくべきこと

よく勘違いされている話で、その後の金言も受け売りですが個人開発では必ず以下の話を心に留めておくとよいと思います。

> 作成したものにどのような技術、技巧が凝らされているかはユーザーは気にしていない

どういうことかというと、結局はユーザーは「見た目が良いもの、面白そうなもの」を見るということです。もちろん、それにはレビューなども含まれています。

フロントエンド、バックエンドに関わらずどれだけすごい最新の技術やアルゴリズムを使用していても、それはユーザーには分かりません。Twitterの相互フォロー関係にあるエンジニアはユーザーになりうる確率がとても低いです（ペルソナをエンジニアに向けている場合を除く。）。ユーザーが使用するかどうかを決定する指針はそこではないので当然の話ではあります。

なので、**バズりたい**方は何よりも「紹介文」、「見た目（ユーザー体験）」、「宣伝メディア」をしっかり作りこみましょう。そして、SNSや知人のシェアなどを駆使し、とにかく一般人の目に触れる回数を増やしましょう。体感としてインプレッション数の0.1%くらいがユーザーになってくれるイメージです。広告効果もどのプラットフォームでどのペルソナに向けて行うかしっかり考えてからやるのであれば効果的でしょう。

コードの保守性が、堅牢性が、と考える方も多いでしょう。批判を覚悟の上で言いますが、**利用者がいなければコードを保守するモチベもどんどん下がっていきます。**なので、（Webアプリケーションの場合）CI/CDパイプラインだけを整えた後は全力で見た目を整えることに注力しましょう。

## まとめ

最後までご覧いただきありがとうございました。先人たちが言っていることをそのまま並べただけのような気がしますが、あながち間違っていないと実感しました。

1つバズれば、Twitterを活動基点にしている場合、後に作成したものもある程度使用されるだろうと思われるので頑張りたいと思います。
[GCP] Cloud Run 機能xHttpClientでリクエスト

[Cloud Run](https://cloud.google.com/run)は、Google Cloud Platform（GCP）のサーバーレスコンピューティングプラットフォームであり、コンテナ化されたアプリケーションを実行するための環境を提供している。以下にCloud Runの概要と主な機能について説明する。

## Cloud Runの概要
Cloud Runは、ステートレスなコンテナによって構成されるアプリケーションの実行を可能にします。Cloud Runでは、コンテナイメージを提供してアプリケーションをデプロイするだけでなく、自動スケーリング、リクエストトリガー、イベントの統合などの機能を利用することができる。また、Cloud RunはKnativeの上に構築されており、ノードレスなアプリケーション実行環境として機能する。

## Cloud Runの機能
### 1. ステートレスな実行環境
Cloud Runはステートレスなコンテナ実行環境であり、ステートフルなコンポーネントを含むアプリケーションを実行することはできない。ステートレスな実行環境のため、インスタンスのスケーリングやローリングアップデートが容易に行える。

### 2. 自動スケーリング
Cloud Runは、リクエストの数や処理時間に応じて自動的にスケーリングします。トラフィックが増加した場合には自動的にインスタンスを増やし、トラフィックが低下した場合には自動的にインスタンスを減らす。これにより、コストを最適化しながらパフォーマンスを維持することが可能。

### 3. リクエストトリガー
Cloud Runは、HTTPリクエストやCloud Pub/Subなどのイベントに応じてアプリケーションをトリガーすることができる。これにより、特定のイベントに対して特定の処理を行うためのマイクロサービスを簡単に作成することができる。

### 4. イベントの統合
Cloud Runは、Cloud Pub/SubやCloud StorageなどのGCPの他のサービスとシームレスに統合することができる。これにより、イベントドリブンなアーキテクチャを実現し、リアルタイムなデータ処理や連携に活用することができる。

## サンプルコード
以下に、Java、Go、C#のそれぞれの言語でCloud Runに対してHTTPリクエストを送信するサンプルコード。

### Java
```java
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

class Main {
  public static void main(String[] args) throws Exception {
    OkHttpClient client = new OkHttpClient();

    Request request = new Request.Builder()
        .url("https://YOUR_CLOUD_RUN_SERVICE_URL")
        .build();

    try (Response response = client.newCall(request).execute()) {
        System.out.println(response.body().string());
    }
  }
}
```

### Go
```go
package main
import (
    "fmt"
    "net/http"
    "io/ioutil"
)

func main() {
    res, err := http.Get("https://YOUR_CLOUD_RUN_SERVICE_URL")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer res.Body.Close()
    body, err := ioutil.ReadAll(res.Body)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(body))
}
```

### C#
```csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
  static async Task Main(string[] args)
  {
    HttpClient client = new HttpClient();

    HttpResponseMessage response = await client.GetAsync("https://YOUR_CLOUD_RUN_SERVICE_URL");
    response.EnsureSuccessStatusCode();

    string responseBody = await response.Content.ReadAsStringAsync();
    Console.WriteLine(responseBody);
  }
}
```

以上が、Cloud Runの概要と主な機能についての詳細な説明およびJava、Go、C#のサンプルコード。
並列データ ウェアハウス (PDW) 機能が有効になっていないサーバー上のデータを累積計算する

## SQL Server 2008ではPDWが無効

以下のような売り上げテーブルがあるとします。

```SQL
CREATE TABLE Sales (
    SaleDate DATE,
    ProductName VARCHAR(50),
    Revenue INT
);
INSERT INTO Sales (SaleDate, ProductName, Revenue)
VALUES 
    ('2023-07-14', 'Apple', 1000),
    ('2023-07-15', 'Banana', 1500),
    ('2023-07-16', 'Orange', 2000),
    ('2023-07-17', 'Apple', 1200),
    ('2023-07-18', 'Banana', 1800),
    ('2023-07-19', 'Orange', 2200),
    ('2023-07-20', 'Apple', 900),
    ('2023-07-21', 'Banana', 1400),
    ('2023-07-22', 'Orange', 1800),
    ('2023-07-23', 'Apple', 1100),
    ('2023-07-24', 'Banana', 1600),
    ('2023-07-25', 'Orange', 1900),
    ('2023-07-26', 'Apple', 950),
    ('2023-07-27', 'Banana', 1300),
    ('2023-07-28', 'Orange', 1700);
```
| SaleDate      | ProductName     | Revenue |
|-----------|-----------|---------|
| 2023-07-14 | Apple     | 1000    |
| 2023-07-15 | Banana    | 1500    |
| 2023-07-16 | Orange    | 2000    |
| 2023-07-17 | Apple     | 1200    |
| 2023-07-18 | Banana    | 1800    |
| 2023-07-19 | Orange    | 2200    |
| 2023-07-20 | Apple     | 900     |
| 2023-07-21 | Banana    | 1400    |
| 2023-07-22 | Orange    | 1800    |
| 2023-07-23 | Apple     | 1100    |
| 2023-07-24 | Banana    | 1600    |
| 2023-07-25 | Orange    | 1900    |
| 2023-07-26 | Apple     | 950     |
| 2023-07-27 | Banana    | 1300    |
| 2023-07-28 | Orange    | 1700    |

Microsoft SQL Server 2012以前のバージョンではデフォルトで並列データ ウェアハウス (PDW) 機能が無効です。
そのため、以下のような```SUM() OVER(PARTITION BY **)```句によって品目ごとの売上累計を算出しようとするとエラーが発生します。

```SQL
SELECT
    SaleDate, 
    ProductName, 
    Revenue, 
    SUM(Revenue) OVER(PARTITION BY ProductName ORDER BY SaleDate) AS [Accumulated]
FROM
    Sales
ORDER BY
    SaleDate
```

:::note alert
並列データ ウェアハウス (PDW) 機能が有効になっていません。
:::

## リンクサーバー設定

データ サーバーのバージョンアップ対応が取れない場合、PDWが有効なバージョンのサーバーからリンクサーバー設定することで、
新バージョンのサーバーから旧バージョンのデータに対しPDW機能を使ったクエリが実行可能になります。

```SQL
SELECT
    SaleDate, 
    ProductName, 
    Revenue, 
    SUM(Revenue) OVER(PARTITION BY ProductName ORDER BY SaleDate) AS [Accumulated]
FROM
    [リンクサーバー名].[スキーマ名].Sales
ORDER BY
    SaleDate
```

|SaleDate|ProductName|Revenue|Accumulated|
|:----|:----|:----|:----|
|2023-07-14|Apple|1000|1000|
|2023-07-15|Banana|1500|1500|
|2023-07-16|Orange|2000|2000|
|2023-07-17|Apple|1200|2200|
|2023-07-18|Banana|1800|3300|
|2023-07-19|Orange|2200|4200|
|2023-07-20|Apple|900|3100|
|2023-07-21|Banana|1400|4700|
|2023-07-22|Orange|1800|6000|
|2023-07-23|Apple|1100|4200|
|2023-07-24|Banana|1600|6300|
|2023-07-25|Orange|1900|7900|
|2023-07-26|Apple|950|5150|
|2023-07-27|Banana|1300|7600|
|2023-07-28|Orange|1700|9600|

もちろん累積計算自体はPDW機能を使わなくても可能です
(Salesテーブル(別名:S1)に同じSalesテーブル(別名:S2)を「S1のSaleDateがS2以上でProductNameが同じ」という条件で結合する 等)。

```SQL
SELECT
    S1.SaleDate, 
    S1.ProductName, 
    S1.Revenue, 
    SUM(S2.Revenue) AS [Accumulated]
FROM
    Sales S1
    INNER JOIN Sales S2 ON S1.SaleDate >= S2.SaleDate AND S1.ProductName = S2.ProductName
GROUP BY
    S1.SaleDate, 
    S1.ProductName, 
    S1.Revenue
ORDER BY
    SaleDate
```
Android、DatePickerDialogで日付、TimePickerDialogで時間の選択

# Androidで日付の選択、時間の選択
アプリで日付を入力するEditTextを作成する機会があったって、手入力もダルいので、DatePickerDialogで日付、TimePickerDialogで時間の選択できるようなサンプルを作ってみました。よくある、こんなやつでね。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/1dff7e91-a82f-0210-c4d4-72643fcf36eb.png">
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/e28382e7-d6ae-d5b0-ad4e-1d70af562bab.png">

以下のQiita記事を参考にさせていただきました。ActivityからDatePickerDialog、TimePickerDialogが呼ばれる場合は、このサンプルの通りでよいですが、Fragmentから呼ばれる場合はFragmentManagerにひと捻りが必要です。

https://qiita.com/fumiyakawauso/items/dbb0517144f2a4400e6a


## FragmentからDatePickerDialog、TimePickerDialogを呼ぶ場合
通常AndroidアプリはActivityが1個で、Fragmentが複数で1対多の関係。Fragmentをクルクル入れ替えて画面遷移するケースが多いと思います。従って、DatePickerDialog、TimePickerDialogも、Activityじゃなくて、Fragmentから呼ばれます。

Fragmentから呼び出す場合、呼び元から渡す引数のFragmentManagerはparentFragmentManagerだとうまく動きません。（MainActivityが渡される）
ここはchildFragmentManagerじゃないと、うまく動きませんでした。
```kotlin:MainFragment.kt
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        binding.dateBtn.setOnClickListener {
            DatePickerFragment().show(childFragmentManager, "DatePicker")
        }
        binding.timeBtn.setOnClickListener {
            TimePickerFragment().show(childFragmentManager, "TimePicker")
        }
    }
```
DatePickerDialog、TimePickerDialogを表示するFragment側(wrapしている)はonAttach関数で親のFragmentの受け取り方がちょっと違います。parentFragmentで受け取ります。
```kotlin:DatePickerFragment.kt
class DatePickerFragment(): DialogFragment(), DatePickerDialog.OnDateSetListener {
    interface OnSelectedDateListener {
        fun selectedDate(year: Int, month: Int, dayOfMonth: Int)
    }
    private lateinit var listener: OnSelectedDateListener
    override fun onAttach(context: Context) {
        super.onAttach(context)
        if (parentFragment is OnSelectedDateListener) {
            listener = parentFragment as OnSelectedDateListener
        }
    }
    ・・・
}
```

# 最後に
全体のソースは[gitHub](https://github.com/cozyk100/AndroidStudioProjectsPublic/tree/main/DateTimePickerKotlin)に置きました。
AHK(AutoHotkey)を使いアクティブウインドウをメイン画面左上にリサイズして整列していく

AHK(AutoHotkey)を使いアクティブウインドウをメイン画面左上にリサイズして整列していく

開いているフォルダ、ブラウザー、特にOutlookのメールを沢山開いていると、メイン画面の左上隅から、順番に整列表示させたくなるので、AHKで書いてみた。

【使い方】
１．以下のソースコードをAHKで実行

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

;By skojima@kuhen.org
;2023-07-14 12:15
;------------
!w:: ; Alt+w
;------------
WinMove,A,,20,20,700,600
Return

;------------
!q:: ; Alt+q
;------------
WinGetPos, X, Y,,, A
sleep,100
X := X + 40
Y := Y + 40
sleep,100
WinMove,A,,X,Y,700,600

Return

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

２．整列させたいメールやフォルダの枠を　＞　マウス左でクリック
　　＃ウインドウがアクティブになる

３．Alt+ W を押す
　　窓枠サイズ：700 x 600 になり
　　位置：左上 20 x 20　へウインドウが移動移動

４．２個目の窓をマウスで選択　＞　Alt + W を押す
　　１個前の窓と完全に被るので　＞　Alt + Q を押す

５．現在の窓位置から　＞　右下へ　＞　40 x 40 移動する

６．３個目の窓なら　＞　Alt + W　＞　 Alt + Q を　２回押す

コードがシンプルなので、窓枠のサイズや、移動間隔の変更がしやすいかと。

以上
LibreOffice マクロを Ubuntu + Python で作る

# 拡張を作るための基礎知識


拡張は .oxt というファイルとなり、以下の言語がサポートされています。

- Basic
- Python
- JavaScript
- Java
- BeanShell
- C++

今回は、python で試してみます。

# 環境

- Ubuntu 22.04 LTS
- LibreOffice Ubuntu package version: 1:7.3.7-0ubuntu0.22.04.3


# Python バインディングのインストール

```

$ sudo apt install libreoffice-script-provider-python

```

LibreOfficeを改めて起動すると、マクロの管理にPythonが現れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/d8a98a42-b7e6-7a1c-54e6-af61d7897735.png)

Pythonマクロの保管場所は定まっていて、Ubuntu の場合は以下のようになるようです。

- ユーザごとの設定
  -  ~/.config/libreoffice/4/user/Scripts/python
- ユーザ全員用の設定
  - /usr/lib64/libreoffice/share/Scripts/python

今回はユーザごとの設定とします。
上記だと
-  ~/.config/libreoffice/4/user/Scripts/python

となってますが、ドキュメントでは

-  ~/.libreoffice/4/user/Scripts/python
 
となっていました。実はこの記事を書く前の実験で ~/.libreoffice はあったのですが、実験中に知らないうちに

- ~/.config/libreoffice

に変化していました。謎。


さて、 `~/.config/libreoffice/4/user` はありますが、`Scripts/python` ディレクトリが存在しないので、作成します。
```
$ mkdir -p ~/.config/libreoffice/4/user/Scripts/python
```

# サンプルプログラム
「Write Your First Python Macro in LibreOffice」
https://www.debugpoint.com/first-python-macro-libreoffice/

にあるプログラムをそのまま試してみます。

```
# HelloWorld python script for LibreOffice Calc
#
# This file is part of the DebugPoint.com tutorial series for Python Macros in LibreOffice
#
#
import uno

def HelloWorldPythonCalc():

    oDoc = XSCRIPTCONTEXT.getDocument()

    oSheet =oDoc.getSheets().getByIndex(0)
    oCell = oSheet.getCellByPosition(0,0)
    oCell.String = 'Hello World via Python'

    return None
```
上記を  HelloWorldCalc.py として保存します。

# テスト

LibreOffice の表計算を起動し、「ツール」-「マクロ」-「マクロを実行」とすると以下のように出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/6ceee1e0-1c77-9967-adac-580244d82fbb.png)

「 HelloWorldPythonCalc」を選んで実行すると下記のように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/f0653824-9a9e-53c2-53b5-3e97457cb354.png)


# 続き

とりあえず動作確認はできたので、以下のように作っていく


「LibreOffice マクロ：Pythonでのプログラム例集」
https://qiita.com/nanbuwks/items/1f25e8839089eaefd6d4

「Python で LibreOffice 拡張をステップバイステップで作ってみる」
https://qiita.com/nanbuwks/items/53861bac26c521c4b549
初心者がつまずくdocker-composeの up・run・start って何が違うの？

## はじめに
　「dockerってめっちゃ使われてるし、よし、勉強しよ」と思って始めた当初から、「え？何が違うの？？」と戸惑ってました。曖昧なまま勉強を進めていると、何度もこの問いにぶつかるのでまとめようと思います。初心者の備忘録も兼ねてるので、間違いがあればご指摘ください。


## 公式をちゃんと読もう
　やっぱりこういう時には公式リファレンスです。
>**up ・ run ・ start の違いは何ですか？**
>
>一般的には docker-compose up が使われるでしょう。 up を使うと docker-compose.yml ファイル中で定義したサービスの開始または再起動を行います。デフォルトは「アタッチド」モードであり、全てのコンテナのログが画面上に表示されます。「デタッチド」モード（ -d ）では、Compose はコンテナを実行すると終了しますが、コンテナは後ろで動き続けます。
>
>docker-compose run コマンドは「ワンオフ」（one-off；１つだけ、偶発的） または「アドホック」（adhoc；臨時）なタスクの実行に使います。実行するにはサービス名の指定が必要であり、特定のサービス用のコンテナを起動し、かつ依存関係のあるコンテナも起動します。 run の利用時は、テストの実行であったり、データ・ボリューム・コンテナに対するデータの追加・削除といった管理タスクです。 run コマンドは実際には docker run -ti を処理しており、コンテナに対してインタラクティブなターミナルを開き、コンテナのプロセスが終了すると、その時点の該当する終了コードを返します。
> 
>docker-compose start コマンドは既に作成済みのコンテナの再起動には便利です。しかし止まっているコンテナを起動するだけであり、新しいコンテナは作成しません。

　`up`は全サービスを開始or再起動してくれます。とりあえず一括で立ち上げて、全体に不備がないか確認できますね。

　`run`は一つのコンテナにのみフォーカスします。用途として想定されるのは、『テスト実行』『データの追加・削除』など。あるコンテナで色々作業したいときに便利ですね。`depends_on`など依存関係があってもちゃんと考慮して立ち上げてくれます。

　`start`は元々ある停止中コンテナを再起動するだけです。事前にコンテナを作っておかないといけません。

## まとめてみる
　公式とその他記事を参考にして、まとめてみました。

| コマンド | 対象 | イメージ作成 | コンテナ構築 | コンテナ起動 | いつ使うか |
|:-:|:-:|:-:|:-:|:-:|:-:|
| up | 全てのサービス | 初回のみ | 初回のみ | ○ | 全てのサービスを開始or再起動したい |
| run | １つのサービス | ○ | ○ | ○ | あるコンテナを一から作り作業をしたい |
| start | 作成済の全てのコンテナ | ✕ | ✕ | ○ | 停止させていたコンテナを再起動させたい |

　ちなみに、Dockerfileの更新を反映させて`up`を使いたい場合は、`--build`オプションをつけます。すなわち上の表で、`up`の『初回のみ』となっている部分が`--build`のおかげで○になりますね。


## おわりに
　これでやっと迷わずコマンドを打てそうです。やっぱり記事にすると頭の中が整理されて、細かいところまでクリアになるので良いですねー！


## 参考
- [よくある質問と回答 — Docker-docs-ja 20.10 ドキュメント](https://docs.docker.jp/compose/faq.html#up-run-start)
- [docker-compose up とか build とか start とかの違いを理解できていなかったのでまとめてみた - Qiita](https://qiita.com/tegnike/items/bcdcee0320e11a928d46)
- [docker-compose upって何？ - Qiita](https://qiita.com/kobori_akira/items/1cd058f180206fd8d139)
20年前に戻れるならどんなキャリアプランを描くか

## 前置き
本来あるべき終身雇用とはこう。
```
あなたには定年までデジカメを開発してもらい
デジカメのスペシャリストになっていただきます。
ただし、定年までの雇用は確約しますし、
手厚い退職金や厚生年金も保証します。
```

こうすることで、人々は安心して働くことができ
日本は高度経済成長を成し遂げてきた。


## 派遣とピンハネ
ところが平成になって、あたかも全員がそうであるかのように
自由な働き方をしたい人**も**いる、などと言い出し
小泉と竹中が製造業への派遣を解禁してしまった。

本来の派遣とは、特定の技能を持った人に、必要なときだけ助けてもらうこと。
例えば、水道業者には、トイレが壊れたときだけ派遣で来てもらう。
しかしながら、**自社の主力商品**であるデジカメを作るのに
正社員は最小限しか採らず、派遣でやりくりするような企業が出てくる。
（ミナミの帝王96巻～99巻のハケンの真実編を参照）


## 氷河期
当初は、派遣を3年以上続ければ、直接雇用になるルールだったが
2年11か月で契約を切って、再契約するスキームが横行した。
そうしてるうちに、不景気、震災などで売上が減ったとか
正社員様より派遣のほうが年上なのは指示が出しにくいとか
そんな理由で雇い止めに遭ってしまう。

デジカメを作っている同業他社に転職しようとしても、
同じように派遣を使い捨てることしか考えてないので採用されない。
こうして、**キヤノンでしか使えない技術を抱えた35歳無職**が生まれる。

ゆとり世代
　「10年もあったのに正社員になれないのは甘えだ、自己責任だ」
岸田
　「学び直しを、リスキリングを」

### おまえら鬼か！ おまえら悪魔か！

じゃあ、おまえがそのリスキリングとやらを実践して
自民党から共産党へ転職してお手本を示してみろ、という話。


## 根本原因
日本がこうなってしまった理由は明確。

```
人は人を救わない
自分さえ良ければいい
```

社員が10人で売り上げが10の会社があったとして、
不景気で売り上げが9に減ったとする。

全員の給料を1割カットして乗り切りましょう、とはならない。
1人を殺して（クビを切って）、残りは生活レベルを維持しようとする。

そして、殺された1人は、無敵の人（生活保護）になったり、
最悪の場合、銃を自作して英雄になったりする。


## 非正規について
非正規というと、まるで偽ブランド商品のような
何か悪いモノのように感じるが、もはやそんな時代ではない。

昭和の正規
・終身雇用
・年功序列
・社会保険料の負担は2割程度
・ボーナスは非課税
・年金の受け取りは60歳から、払った額の2倍以上返ってくる
・退職金控除2200万

令和の正規
・簡単にリストラ
・簡単に減給
・社会保険料の負担は4割程度
・ボーナスにもガッツリ課税
・年金の受け取りは（おそらく）70歳から、払った額の1倍返し
・退職金控除1600万

現代の正社員には、**源泉徴収というデメリット**しかないので
非正規（フリーランス）を目指したほうが良い。


## 具体的なプラン
社会に出て、最初からはフリーランスになれないため、
とりあえず、どこでもいいので正社員から始める。

必要最低限の仕事だけはして基本給を確保し、
定時で帰って、自己研鑽のための時間を確保する。

そして、1社の製品に依存するような技術ではなく、
TOEICなど、汎用性の高いスキルを身に付けるように心がける。
応用情報技術者レベルに達したら、独立を考える。

会社を愛したところで、会社は自分を愛してくれない。
(リンクだけです)「15° 角度」を調べてみたい。


# google検索
世の中の「15° 角度」を調べてみたい。

https://www.google.com/search?q=15%C2%B0+%E8%A7%92%E5%BA%A6&rlz=1CAUHAM_enJP1038JP1038&ei=4bavZND-B5WF-QbFvJcY&ved=0ahUKEwiQ85KCo4uAAxWVQt4KHUXeBQMQ4dUDCBA&uact=5&oq=15%C2%B0+%E8%A7%92%E5%BA%A6&gs_lcp=Cgxnd3Mtd2l6LXNlcnAQAzIJCAAQBBAlEIAEMgUIABCABDIJCAAQBBAlEIAEMgYIABAeEA86BAgAEEc6BAghEAo6BQgAEKIEOgQIABAeOgYIABAIEB46CAgAEAgQHhAKOgcIABATEIAEOggIABAeEA8QEzoGCAAQHhATOggIABAIEB4QEzoLCAAQCBAeEPEEEBM6CAgAEAUQHhATOgcIABAEEIAEOgYIABAEEB46CAgAEAQQHhAPSgQIQRgAUNYJWIsxYLk4aABwAngAgAHfAYgByA6SAQYyLjEzLjGYAQCgAQHAAQHIAQo&sclient=gws-wiz-serp


# tan 15度
＞直角三角形による求め方

https://mathsuke.jp/trigonometric-ratio-15/

https://www.google.com/search?q=tan+15%E5%BA%A6&rlz=1CAUHAM_enJP1038JP1038&source=lnms&sa=X&ved=2ahUKEwjN5rnMpouAAxUuZvUHHbicBTMQ_AUoAHoECAEQAg&biw=1366&bih=645&dpr=1


# 15度 角度 作り方
 
https://www.google.com/search?q=15%E5%BA%A6+%E8%A7%92%E5%BA%A6+%E4%BD%9C%E3%82%8A%E6%96%B9&rlz=1CAUHAM_enJP1038JP1038&ei=y7evZLCzCcu5hwPwy6nQAw&oq=15%C2%B0+%E8%A7%92%E5%BA%A6&gs_lcp=Cgxnd3Mtd2l6LXNlcnAQARgAMgoIABBHENYEELADMgoIABBHENYEELADMgoIABBHENYEELADMgoIABBHENYEELADMgoIABBHENYEELADMgoIABBHENYEELADMgoIABBHENYEELADMgoIABBHENYEELADMgoIABBHENYEELADMgoIABBHENYEELADSgQIQRgAUABYAGCOpQVoA3ABeACAAQCIAQCSAQCYAQDAAQHIAQo&sclient=gws-wiz-serp


# sympyで
加法定理を勉強中

# FreeCADで
操作を勉強中


# ChatGPT　様

三角比の15°の勉強をしたいので、よろしくお願いします。

もちろんです！15°の三角比についてお手伝いいたします。

まず、15°は特殊な角度であり、正弦、余弦、および正接の値を正確に求めるのは少し難しいです。しかし、一部の近似値を使用することで、おおよその値を求めることができます。

15°の正弦と余弦の近似値は次のようになります:

sin(15°) ≈ 0.2588
cos(15°) ≈ 0.9659

これらの値は、15°の三角関数を計算する際の近似として使用できます。

また、正接の値を求めるには、次のような関係性を利用することができます:

tan(x) = sin(x) / cos(x)

この関係を用いて、15°の正接の値を求めると:

tan(15°) ≈ sin(15°) / cos(15°)

この計算結果は、0.2679となります。

以上が、15°のおおよその正弦、余弦、および正接の値です。ただし、これらは近似値であり、より正確な値を求める場合には計算機や表を使用することがおすすめです。

もしご質問や他の角度についての疑問があれば、遠慮なくお知らせください！

# 参考

https://qiita.com/mrrclb48z/items/9f6adcb515e7cf5e81ba


https://docs.sympy.org/latest/modules/simplify/fu.html

https://qiita.com/mrrclb48z/items/5b1f1946f20ecbca3628
Oracle Cloud Infrastructure Architect Associate 勉強メモ（ブロックストレージ)

# ブロック・ストレージ
OCIで提供されるブロック・ストレージは以下のものがある。
- LocalNVMe
- ブロック・ボリューム
- ファイル・ストレージ
- オブジェクト・ストレージ
- アーカイブ・ストレージ
### ローカルNVMe　SSDデバイス
**DenseI/Oシェイプ**を選択した場合に使用可能。（使用するDenseI/Oシェイプの種類によってアタッチできるSSDが変わる。）
**ローカルに接続された**NVMeデバイスが提供。
パフォーマンスが高いワークロード向け。**低レイテンシで高いI/O性能**を発揮できる。
RAID機能（データを複数に分散する機能）やスナップショット（ある時点での状態を保存し、いつでも戻すことができる機能）、バックアップなどの**データ保護機能が提供されない**（顧客が実装する）。また、データの耐久性においても顧客が実装の責任を持つ。
**SLAの対象**になる。ローカルのデバイスだがインスタンスを削除しない限りデータは削除されない。

::: note
**DenseI/Oシェイプ**に内蔵される**ローカル接続される**デバイス。
**低レイテンシで高いI/O性能**を発揮できる。
**データ保護機能が提供されない**ため顧客が実装し、データの耐久性においても顧客が実装の責任を持つ。
**SLAの対象**になる。
インスタンスを削除しない限りデータは削除されない。
::: 

### ブロック・ボリューム・ストレージ
インスタンスにアタッチして使用するストレージ。
**インスタンスを停止してもデータは消えず、残すことができる。**
性能の自動調整が可能。
ストレージの大きさは50GB-32TBまで1GB単位で設定可能。（伸縮自在な容量）
NVMeベース
より低いコストからUHP（UltraHighPerformance）のシェイプを設定可能。
デフォルトでデータが暗号化される。
インスタンス当たり**最大32ボリュームアタッチ可能。**
可用性ドメイン内の複数のストレージサーバーにまたがって複製される（可用性が高い）
デタッチしたブロックボリュームは再度インスタンスにアタッチ可能。削除した場合は戻せない。
# バックアップとリストア
ブロックボリュームがアタッチされているときもデタッチされているときもバックアップが取れる。
バックアップはOCIオブジェクトストレージに暗号化して保存される。ここからリストアができる。
ブロック・ボリュームやブート・ボリュームのバックアップにはソース・ボリュームのタグが自動的に付与される。
アタッチメント・タイプとして、**iSCSI**または**準仮想化**を選択可能。
### バックアップ手法
- 手動バックアップ
- ポリシーベースバックアップスケジュール
自動化されたポリシーベースにはブロンズ、シルバー、ゴールドの三種類ある。
ここからカスタマイズしてユーザー定義のバックアップポリシーを作成することも可能。
### バックアップ・ポリシー
ブロンズ・シルバー・ゴールドが含まれる。自分でカスタムしたポリシーも利用可能。
- ブロンズ
月ごとにバックアップ取得（月の初日に取得）12か月間保存される。
- シルバー
週ごとにバックアップ取得（日曜日）4週間保存。
ブロンズポリシーの月初めのバックアップも含まれ、こちらは12か月間保存される。
- ゴールド
日ごとにバックアップ取得。7日間保存。
ブロンズポリシーの月初めのバックアップ（12か月間）、シルバーポリシーの週ごとのバックアップ（4週間）も含まれる。
# ブロック・ボリュームのサイズ変更
### オンライン・リサイズ
- インスタンスからボリュームを切り離さずにリサイズできる。
- 増やすことはできるが、減らすことはできない。
- リサイズ後、リサイズしたボリュームの最初のバックアップはフルバックアップになる（差分で作成ではなくなる？）
### オフライン・リサイズ
オンラインと同様に大きくすることのみ可能。
インスタンスからデタッチする必要がある。
オフラインの場合は３つのリサイズの方法がある。
1. 既存のデタッチされたボリュームのリサイズ。（すでにある接続されていないボリュームのサイズを変更）
1. ボリュームの**バックアップから**より大きなボリュームにリストアする。
1. 既存のボリュームをより大きいボリュームに**クローン**する。
# ボリュームグループ
複数のボリュームを個々にバックアップするのは大変なので、グループにまとめて一気にバックアップやクローンの作成を行える。
ブートボリュームとブロックボリューム両方を含めることができる。（無料の機能）
**最大32個**のボリュームをボリューム・グループに追加可能。
**各ボリュームは1つのボリューム・グループにのみ**属することが可能。
# ブートボリューム
OSがふくまれたボリューム（インスタンスの起動に必要なボリューム）
ブロックボリュームとしてアタッチすることもできる。
→ インスタンスが起動しなくなった場合など、デタッチして別のインスタンスにブロックボリュームとしてアタッチすることで、ファイルを修正することができる。
# クローン
ポイントインタイム（特定の時点までのデータ変更、復元可能なデータを選ぶことができる）でボリューム全体をディスクからディスクへディープコピー（実態のコピー。一方が変更されてももう一方は変更されない）する機能。
**同じ可用性ドメインでのみ作成可能。**
数秒で使用可能になる。（実際には裏でコピーを続けているが、整合性が担保されている）
アタッチされている場合は１つ、デタッチされている場合は同時に最大10個クローンを作成できる。
単一のボリュームにもボリュームグループもクローン作製可能。
### クローンとバックアップの違い
||クローン|バックアップ|
|:--:|:--:|:--:|
|スピード|速い|遅い|
|作成されるストレージタイプ|ブロック・ボリューム|オブジェクト・ストレージ（に保存）|
|範囲|可用性ドメイン内|リージョン内|
|ボリュームグループ|サポートされる|サポートされる|
# クロス・リージョン・ボリューム・レプリケーション
ボリュームを別のリージョンに継続的に自動でレプリケーション（複製を作成）する機能。
複製との差分の分だけ時間がかかる。（最初はすべてレプリケーションすることになる）
ボリュームの作成時、作成後どちらでも設定可能。
リージョンによってレプリケーション先は決まっている。（決まっている中から選択）
レプリケーションが有効になっているボリュームは**サイズ変更不可**。
宛先のレプリカは、ソース・リージョンのボリューム・タイプに関係なく、ブロック・ストレージの「**より低いコスト**」オプションの価格で請求される。
# ボリュームの複数インスタンスへのアタッチ
複数のインスタンス（最大8個）に同一のボリュームをアタッチすることができる。
アクセスを共有可能のものを選択する必要がある。
**OCI側では同時書き込みに対する制御等をおこなわない**ので、ユーザー側でソフトウェアやシステムを導入する必要がある。
ローカルのパッケージをyarnで追加したい

# はじめに
ローカルのパッケージを追加するのに手こずったので、備忘録を残しておこうと思います。

# 環境と構成
## 環境
- yarn 3.3.0

## 構成
packages/
　├ myLib/
　└ myApp/

# 経緯
ローカルにある自作ライブラリのパッケージ(myLib)を、モジュール(myApp) `yarn add` で追加した。
`package.json` の `dependencies` にはちゃんと追加されているのに、`yarn install` でファイルが見つからないとエラー。
`yarn build` も当然エラー。
`node_modules` にも自作パッケージは含まれていない。
……というか、そもそも `node_modules` にコピーはしてほしくない！シンボリックリンク(ジャンクション)を貼りたい！
そんな闘いの記録です。

# add のオプションに何かないのか？
`yarn add` のオプションで上手いこといかんのかと思い、`yarn -h` で指定できるオプションを調べてみました。
その結果がこちら。

```
yarn add [--json] [-E,--exact] [-T,--tilde] [-C,--caret] [-D,--dev] [-P,--peer] [-O,--optional] [--prefer-dev] [-i,--interactive] [--cached] [--mode #0] ...
   add dependencies to the project
```

どうもそれっぽいものはありません。
色々調べてみたところ、`yarn add link:<myLibのパス>` でジャンクション貼れるよ！の記事を見つけたので、早速実行！

……ところが、以下のようなメッセージが表示されてしまいました。

```
Usage Error: The link:../myLib string didn't match the required format (package-name@range). Did you perhaps forget to explicitly reference the package name?
```

`link:<myLibのパス>` は使えないらしい……。
yarnのバージョンの問題かもしれません。

とはいえ、何かしらジャンクションを貼る方法はあるはず！
もう一度 `yarn -h` で使用できるコマンド・オプションを確認してみます。

# link コマンドがあったぞ！
見つけました！ `link` コマンドが用意されています！

```
yarn link [-A,--all] [-p,--private] [-r,--relative] <destination>
    connect the local project to another one
```

説明文にもまさにな内容が書かれています。

今回は相対パスでリンクを貼りたいので、オプションには `-r` を指定してコマンドを実行！
正常にリンクが貼られ、その後の `yarn install` も `yarn build` もエラーなく実行できました！ﾔｯﾀｾﾞ!

## ついでに
リンクを剥がす場合は `unlink` コマンドがあったので、それを使えばできるっぽい。

# さいごに
`link` のコマンドでジャンクションを貼れば、ファイルがコピーされて容量を圧迫することもないし、変更のたびにインストールしなおす必要もないので大変に助かる。
上手いこと活用していきたい所存。
プリンタを登録する

新しいプリンターの登録
```
[linuxstudy@localhost ~]$ sudo lpadmin -p lp1 -E -v lpd://netprint/lp1 -P /usr/share/cups/model/pxlcolor.ppd 
```
![sc1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031554/ee74cf60-44b7-472c-0cc4-29a7c9ec364f.png)
lpadmin -dでデフォルトプリンターをlp1に変更
lpstat -d でデフォルトプリンター確認。pr1のまま。反映されてない。。。。
(lpicスピードマスターにはlpadminでデフォルト設定)
```[linuxstudy@localhost ~]$ sudo lpadmin -d lp1
[linuxstudy@localhost ~]$ lpstat -d
システムのデフォルトの宛先: pr1
```
lpoptionsでデフォルトプリンター設定。うまくいった
```
[linuxstudy@localhost ~]$ lpoptions -d pr1
copies=1 device-uri=serial:/dev/ttyS0?baud=1200+bits=8+parity=none+flow=none finishings=3 job-hold-until=no-hold job-priority=50 job-sheets=none,none marker-change-time=0 number-up=1 printer-commands=none printer-info printer-is-accepting-jobs=true printer-is-shared=false printer-location printer-make-and-model='Canon 50i - CUPS+Gutenprint v5.2.9' printer-state=3 printer-state-change-time=1689247004 printer-state-reasons=none printer-type=2134028 printer-uri-supported=ipp://localhost:631/printers/pr1
```
file.txtを印刷
```
lpr file.txt
```
lpq 印刷状態の確認
```
[linuxstudy@localhost ~]$ lpq -P lp1
lp1 は準備ができており印刷しています
ランク  所有者  ジョブ  ファイル                        合計サイズ
active  linuxst 8       file.txt                        1024 バイト
[linuxstudy@localhost ~]$ lpq -a 
ランク  所有者  ジョブ  ファイル                        合計サイズ
active  linuxst 8       file.txt                        1024 バイト
```

参考：https://sh1m4book.hatenablog.jp/entry/2015/06/29/004146
RPCとはなにか、RPCの動作フロー

## RPC / Remote Procedure Callとは

:::note
**クライアントとサーバー間でメソッド呼び出しを行い、リモートのサービスやリソースに対して操作や処理を要求するための仕組み**

プログラムやシステム間でのリモート通信を行うためのプロトコル、仕組み
:::

### RPCプロトコルの例

- XML-RPC
- JSON-RPC
- gRPCなど

→データのシリアル化やネットワーク通信の詳細を抽象化
　開発者が簡単にRPCを実装できるようにしている

**複数のコンポーネントやサービスが相互に通信する必要があるシステムで広く使用**
EX)分散システムやマイクロサービスアーキテクチャ

**異なるプログラミング言語やプラットフォーム間での相互運用性を実現するための手段にもなる**


## RPCの動作フロー

**１，クライアントがリモートサーバーに対してメソッドを呼び出す**

**２，クライアントの要求をリモートサーバーに送信**

**３，リモートサーバーは受け取った要求を処理して、結果を生成**

**４，リモートサーバーはクライアントに結果を返す**

**５，クライアントは結果を受け取り、追加の処理を行う**
【ChatGPT無】に尋ねた、熱中症。

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

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

　今回は、
　　ChatGPTさんに
　　　**熱中症について**
　　　　尋ねました。

　最近は、
　　かなりの気温ですね。
　　　児童公園なんかも
　　　　子どもたちの存在が
　　　　　ありません。

　逆に、
　　台風でもないのに、
　　　大雨で洪水が発生するとか。
　　　　映像で見ると、酷いです。

　異常な天候が続きます。

　エンジニアの方々は、
　　直接的な被害はない、
　　　と思いたいですが、
　　　　室内でも、熱中症には
　　　　　なるそうです。

　注意しましょう。
***
# 熱中症の段階と対処方法
　以下に尋ねた結果を出します。
　引用は、私からの入力です。。
>熱中症の段階は？
それぞれの対処方法もお願いします。

熱中症は、以下の3つの段階に分類されます: 軽度熱中症、中等度熱中症、重度熱中症です。それぞれの段階に応じた対処方法を説明します。

1. 軽度熱中症:
   - 症状: 疲労感、頭痛、めまい、立ちくらみ、軽度の悪心や嘔吐、皮膚の湿度が高い、顔や首筋のほてりなどの兆候が現れます。
   - 対処方法:
     - 直ちに涼しい場所に移動して休息を取ります。
     - 水分補給: 水やスポーツドリンクを少量ずつ飲みます。
     - 衣服をゆるめにし、通気性の良い場所で過ごします。
     - 冷却: 冷たいタオルや氷で体を冷やします。

2. 中等度熱中症:
   - 症状: 高度の疲労感、深刻な頭痛、めまいやふらつき、激しい吐き気や嘔吐、冷たい汗、脱水症状、動悸、筋肉の痙攣などが現れます。
   - 対処方法:
     - 直ちに涼しい場所に移動し、休息を取ります。
     - 早急に医療機関を受診する必要があります。
     - 涼しい水やスポーツドリンクを少しずつ飲みます。
     - 衣服をゆるめにし、体を冷やすために冷却措置を行います。

3. 重度熱中症:
   - 症状: 意識障害、深刻な体力の低下、痙攣、高熱、呼吸困難、意識喪失、血圧の低下などが現れます。
   - 対処方法:
     - 緊急の医療支援が必要です。救急車を呼ぶか、速やかに医療機関へ移動します。
     - 意識がある場合は、涼しい場所に避難させ、体を冷やします。
     - 水分補給は行わず、専門の医療スタッフの指示に従います。

熱中症は重篤な状態に進行する可能性があるため、早期の対処が重要です。症状が悪化する場合や持続する場合は、医療機関を受診することを強くおすすめします。また、予防策を徹底することで、熱中症のリスクを最小限に抑えることができます。
***
# 熱中症の予防方法
>熱中症の予防方法を教えてください。

熱中症を予防するための方法は以下の通りです：

1. 十分な水分摂取：熱中症予防の基本は、こまめな水分補給です。暑い環境下や運動中は特に、定期的に水やスポーツドリンクを飲みましょう。水分補給の目安としては、1時間に約150〜250mlの水を摂取することが推奨されています。

2. 適切な服装：外出時には軽い素材で通気性の良い服を選びましょう。明るい色の服や帽子を着用することで、直射日光を反射し体温上昇を抑えることができます。また、紫外線対策として日焼け止めを使用することも重要です。

3. 涼しい場所で過ごす：屋外での活動を避け、できるだけ涼しい場所に滞在しましょう。屋内の冷房や扇風機を活用して室温を下げることも効果的です。特に猛暑日や高温多湿の日には、クーラーの利用を検討しましょう。

4. 適度な休息：長時間の屋外活動や激しい運動をする場合は、適度な休息を取りましょう。休憩中には涼しい場所で体を冷やし、水分補給を行います。

5. 高温環境への慣れ：暑い環境に長時間いる場合は、最初は軽い活動から始めて徐々に慣れていきましょう。身体が適応するまで時間をかけ、無理な負荷をかけないようにしましょう。

6. 健康管理：基礎疾患を持つ方や高齢者は、特に熱中症に注意が必要です。定期的な健康チェックや医師の指導を受けながら、体調管理を行いましょう。

7. 食事の工夫：バランスの取れた食事を摂ることも予防策の一つです。塩分やミネラルの摂取を意識し、バナナやスイカなど水分やミネラルが豊富な食品を取り入れることをおすすめします。

これらの予防策を実践することで、熱中症のリスクを軽減することができます。また、周りの人々の体調や状況にも気を配り、互いにサポートしながら安全な環境を作りましょう。
***
# 最後に（ここから自分です）
　最後に、
　　外で働く方へ。

　1.営業の方へ。
　　おそらく、
　　　外と冷房の効いた室内との
　　　　行き来があると思います。

　　そうした場所の出入りは
　　　身体を慣らすように
　　　　してください。

　　お風呂場での
　　　ヒートショックみたいに
　　　　なるかもです。

　　また、
　　　道路に出る際は、日陰に。
　　　　日陰がないなら、
　　　　　建物から建物へと
　　　　　　雨宿りするように
　　　　　　　移動しましょう。

　　　路面からの照り返しは、
　　　　思った以上に、
　　　　　身体を焼きます。

　2.工事現場等で働く方へ。
　　水分補給は基本ですが、
　　　空調作業服や冷却タオルなど
　　　　の利用も推奨しますが、
　　　　　仲間との体調確認を
　　　　　　お薦めします。

　　仲間との体調確認は、
　　　声掛けや顔色チェックなどで
　　　　ちょっとした変化が
　　　　　あったら、
　　　　　　即時、休憩です。

　　症状によっては、
　　　救急車要請、
　　　　そのまま、
　　　　　天に召される
　　　　　　可能性もあります。

　　仲間が、そうなる前に、
　　　助けましょう。

　3.最後に、お父様お母様方へ。
　　もし、お子様をお連れでの
　　　お出掛けをお考えならば、
　　　　避けるべきです。

　　どうしても
　　　という場合は、
　　　　自動車での移動を
　　　　　お薦めします。

　　でも、車内に寝かせたまま、
　　　自動車から離れるのは、
　　　　とても危険です。
　　　　　クーラーを過信しないで。

　　子どもが
　　　大丈夫だったとしても
　　　　通報されて、犯罪者に
　　　　　されるケースもあります。
　　　　　　（**児童虐待防止法違反**）

　　子どもが死んだら
　　　それこそ、
　　　　刑務所行きです。

　　子どもだけでなく、
　　　ペットも同じですからね。
***
# 最後の最後
　最後に、と書いたのに、
　　最後の最後に、
　　　思い付いてしまいました。

　自動車の車内に、
　　**スマホやスマホ用バッテリーを
　　　置きっぱなしにしないで**。

　車内の熱で、
　　**爆発炎上します**。

　先日も
　　自動車が、
　　　炎上したというニュースが
　　　　ありましたね。

　みんなで、
　　気をつけて、
　　　乗り切りましょう。
***
　追記です。
　　こちらも参照してください。

[夜間熱中症という言葉を知っていますか？](https://qiita.com/kabumira/items/53882dc9ba37f6502432)

　寝ているあいだに、
　　熱中症になる、という話です。
TypeScript: プリミティブ型とオブジェクト型

## プリミティブ型とオブジェクト型

プリミティブ型には、number, string, boolean, symbolなどがあります。これらは不変の値で、直接操作することはできません。
プリミティブ型の値が不変であるというのは一度作成された値は変更できないという意味。
```js
let str = "hello";
str[0] = "H";
console.log(str); // "hello"
```
このようにプリミティブ型の値は変更しようとしても変更できない。

```js
let str = "hello";
str = "Hello";
console.log(str); // "Hello"
```
このように新しい文字列をメモリ上に確保してそのメモリーに対するポインターを再代入するという形で変数を書き換えることは可能。
ここで重要なのは元の文字列自体が変更されていないということ。

一方、Number, String, Boolean, Symbol, ObjectはJavaScriptのオブジェクト型です。これらはプリミティブ型の値をラップするオブジェクトで、メソッドやプロパティを持つことができます。例えば、Stringオブジェクトはプリミティブ型のstringをラップし、文字列操作のためのメソッドを提供します。

しかし、TypeScriptの文脈では、これらのオブジェクト型はほとんど使用されません。なぜなら、これらのオブジェクト型はプリミティブ型とは異なる振る舞いをする可能性があるからです。例えば、プリミティブ型のstringとStringオブジェクトは、===演算子で比較すると等しくないと評価されます。これは、プログラムの予期しないバグを引き起こす可能性があります。

そのため、TypeScriptではプリミティブ型（number, string, boolean, symbol）を使用することが推奨されています。これらの型はJavaScriptのプリミティブ型と直接対応しており、予期しない振る舞いを避けることができます。

### まとめると
プリミティブ型の値: これらの値（例えば、文字列や数値）は不変で、一度作成されると変更することはできません。新しい値を作成すると、新しいメモリ領域が確保され、その新しい値がそこに格納されます。

オブジェクト型の値: オブジェクトは変更可能で、そのプロパティの値を追加、更新、削除することができます。しかし、オブジェクト自体（つまり、オブジェクトのメモリアドレス）は不変で、一度作成されたオブジェクトを別のオブジェクトに「変更」することはできません。

したがって、プリミティブ型とオブジェクト型の主な違いは、プリミティブ型が不変であるのに対し、オブジェクト型はそのプロパティを変更することができるという点です。しかし、どちらの型でも、一度作成された値やオブジェクト自体を直接「変更」することはできません。新しい値やオブジェクトを作成すると、新しいメモリ領域が確保され、その新しい値やオブジェクトがそこに格納されます。