OmniAICreator/Qiita-1.07M huggingface dataset:
Microsoft Azure DevOps 個人開発環境構築して頓挫した備忘録(Boards中心)

### 経緯：
- 仕事でDevops使う場面があったが、全然ついていけなくて足を引っ張ったから
- 仕事でTeamsやMiroと連携したかったから
- 家用に開発環境を作りたい＆一緒にTODO整理もしたい
- 頑健な開発プロジェクト管理ツールを勉強したい
- かといって沢山コーディングする訳ではないから，年度区切り位のイメージで
  複数のプログラムを一つのプロジェクトで管理して，Boardsは半ば自己管理的に使いたい

# Azure Devops Boards初期設定備忘録
1. Microsoft Azureアカウントを作成
2. Azure DevOpsにサインアップし，プロジェクトを作成
3. プロジェクトのProcessをBasicからAgileに変更して，<br>以下のタスク管理が可能な構造にする
   Processの概念↓
   https://masskaneko.hatenablog.com/entry/2020/05/14/095039
4. BoardsのBacklogで，Epic, Feature, User Story, Taskの4段階構成のWork itemsでWBSを作成する
   設定方法参考は以下↓
   https://qiita.com/mstakaha1113/items/9e0be0aaa5db89dd5ca9

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421973/da130bba-798e-d401-77d4-f10e9d29dd89.png)

※Epicsを表示するにはbacklogsの歯車マークSettingsでチェックを付ける。
※デフォルトではUser Storyには期限を付けられないが、自由に属性を追加可能。
(User Storyを開いて3点コロン→Customize→New Field)
属性の例：
- State (default): New, Active, Resolved, Closed
- Start Date: 開始予定日を設定(Delivery Plansに必要)
- Target Date: 完了予定日を設定(Delivery Plansに必要)
- Original Estimate: 必要時間を記入

なんだかんだでこんな感じになる↓
- Backlogs: 今後のTODOを階層構造でまとめる
![Backlogs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421973/f5a7fe32-671f-fd63-dea0-1e52f9bd34d7.png)

- Work items: Backlogsを階層問わず羅列する(検索用)
![WorkItems.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421973/d619b925-8ac2-d1c2-120d-eb603b4b94fd.png)

- Boards: Epic, Feature, Storiesいずれかの階層について，全てState毎にまとめる
![Boards.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421973/503794e1-6c13-cd9d-1611-2c7dbe35ac3b.png)

- Sprints: Work itemに指定期間Sprintsを設定して，期間中にやることをまとめる
![Sprints.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421973/453570d4-9fcd-451b-64d3-969636d04f0c.png)

- Delivery Plans: WBS
![DeliveryPlans.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421973/e9b56e64-bb9f-6750-7990-931dceb6a388.png)

- 各Work itemでは，説明や議論，資料添付等が可能
![WorkItemContent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421973/b66674f6-20d7-a9b5-4382-62927a8ba217.png)

## しかし...
最終的には習慣化できなかった．
理由として，1つの予定変更に対して作業量が多いのと，マイクロマネジメントが苦痛だった．
結局は手書きで線表書いてイメージ膨らませた上で，資料にまとめるだけで十分と判断した．
それでも，TODOではなく「やったこと」をまとめるものとしては有用に思うので，
Azure DevOps Reposを使うついでに気が向いたら記入したい

# Azure DevOps Boards × Teams連携断念
--> 個人用のMSアカウントのTeamsでは連携できないみたい．残念．
https://answers.microsoft.com/ja-jp/msteams/forum/all/teams%E3%82%92%E5%80%8B%E4%BA%BA%E3%82%A2%E3%82%AB/05487d59-ee2f-48c7-8a36-e3b5c3a29810

# Azure DevOps Boards × Miro連携断念
下リンクのようにAzure CardsとMiroを組み合わせることが可能だが，Upgradeが必要だった．
あと，クラウド上にあるMiro dashboardのPrivate化にも，Upgradeが必要だった．
Starterで良いんだったら＄8/M，Businessだったら＄16/Mかかる．
https://miro.com/ja/blog/planner-azuredevops/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421973/945a3fe5-30e6-7f73-4c1c-ad6c3dea8aa5.png)
Azure Devopsは無料なはず．(最初にクレカ入力して「2か月するとサブスクリプションIDがなくなります」という通知が来たので少し不安だが...)

ということで，流石に個人開発だったらGithubやローカル環境で良くて，
（むしろGithubの方が無料サービスだからこそ習得価値高い）
BoardsもExcelに記録程度で良いか...とモチベーションが低下した．
Devopsは実務で使い方習得するか...となったので頓挫した．

以上
現役看護師が困っていること

現役看護師で、現在エンジニアを目指して勉強中の命です。現場で感じるリアルをお伝えしようと思います。
![8BF7338F-423C-4582-86FF-4C1603F60EC3.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763893/e9ce4a85-af86-6792-9b79-4941ad1cdf9c.jpeg)



# 忙しすぎて電子カルテに毎回文字を打てない
1. 看護師に限らず医療従事者は行った処置や臨床的な医療的推論（アセスメントと言います）を記録に書かなければなりません。受け持ち全員のバイタル（血圧や体温など）を経時的に記入しながら、処置や検査案内もしながらの記録ははっきり言って時間がいくらあっても足りません。中にはタイピングが遅いため３時間以上も記録のために残業する人もいます。そのため、テンプレートなどを駆使して記録を簡略化していますが、それでもまだ時間はかかります。効率的なデータ入力方法（例：省略可能フィールド、自動補完）やタッチベースの操作（例：フローチャート形式）があると作業負担を軽減するかもしれません。

# 時間管理が大変
看護師は複数名の処置を同時並行で行います。点滴・注射をしたり、決まった時間に検査案内をしたり、食事の介助をしたりとやることが膨大にあり、そのタスクをリマインド機能などを使わず動きながら時間管理しています。さらに患者の希望に応じて順番を変更したり、業務が増えたりしなくてはならないため、頭と体をずっとフル活用しながら働いています。もし入院することがあって看護師が怖くてもあなたに怒っているわけではなく、減らない業務に怒っているので気にしないでください。

# エラーが起こると命に関わる
病院では一つミスが命に関わることが十分にあり、責任やプレッシャーが給料に見合ってないことが多いです。（役職が付かなければほとんどは給料も一律なので集中治療室や救急外来のような緊迫した現場であっても同じような報酬になります）そのため、事故が起こらないよう対策を立てていますが、私の病院ではITを使った事故の防止は薬を使う時の照合にしか使われていません。患者にとってさらに安全を求めるならもっとITを使った安全対策あると嬉しいものです。

いかがでしたか。
今回はこのくらいにしますがまた更新しようと思います。
お付き合いいただきありがとうございます。
Mac買い替え時の設定備忘録(自分用)

### 経緯
MacBook Air M2を買いました。
以前使っていたMacの環境をTime Machineからまるごと移行することもできるのですが、SlackやAtomなど「もう使わない機能だなこれ...」というものまで入れてしまいたくなかったので、必要最低限の設定をもう一度行うことにしました。
Macを買い替えるたびに設定の手順を調べまくるのが面倒なので、ここに書き残しておこうと思います。

### 環境
MacBook Air M2、macOS Sonoma 14.4.1

## 目次

## 1. システム設定をいじる

設定の各項目(ホットコーナー、Night Shiftの色設定等も忘れずに)を見直して自分好みにいじっておく。

### PCの名前変更

`システム設定 > 一般 > 情報`
から変更。

### バックスラッシュの設定

https://www.cc.kyoto-su.ac.jp/~mmina/bp1/settingForBackslash.html

こちらのサイトを参考に、
1. `システム設定 > キーボード > テキスト入力-入力ソース　編集`
1. `日本語-ローマ字入力` > `英字`にチェック, `“¥”キーで入力する文字`を`\(バックスラッシュ)`に設定
1. ABC キーボードを選択し、下部の`-`を押して削除

### トラックパッド

トラックパッドを押した感覚が以前のものより重く、手の筋トレ過ぎるので
`設定 > トラックパッド > タップでクリック`
をONにしてもいいかもしれない。

## 2. Chrome

Chromeを検索し、ダウンロードする。
自分のアカウントでログインした後、同期を有効にする。

## 3. VSCode

VSCodeを検索し、ダウンロードする。

アカウントを作っておけば、jsonの設定をそのまま適応できる。

https://qiita.com/shirokuma89dev/items/c6f58065a2c0f46ef9ee

こちらのサイトを参考に、元のPCで以下の手順を行う。
1. サインイン
2. `👤 > 設定の同期がオン > (上部) 設定の同期:Configure...`
3. 全ての設定が同期対象になっていることを確認

次に、新しいPCで以下の手順を行う。
1. サインイン
2. `👤 > 設定の同期がオン > (上部) 設定の同期:Sync now`
3. VSCodeを再起動

これで元のテーマや設定、拡張をそのまま引き継げる。

## 4.Homebrew
https://zenn.dev/watakarinto/articles/16451707aa08d1

pathを通した後、
```
brew update
```
を実行して完了。

#### 困ったときのPATHの確認方法
以下のコマンドで確認できる。
```
echo $PATH | tr ':' '\n'
```
#### PATHの追加方法

初期の状態では、zshrcファイルがないので、まず空ファイルを作成する。
その後、
```
open ~/.zshrc   
```
をして、zshrcファイルに直接
```
export PATH=$PATH：<追加 PATH1>
export PATH=$PATH：<追加 PATH2>
...
```
のように書き込む。こうするとあとで整理しやすい。
書き終わったら、

```
source ~/.zshrc  
```
を実行して読み込ませる。


参考：

https://qiita.com/benzene/items/865506483377ad4128ee


https://www.kikagaku.co.jp/kikagaku-blog/path/#i-9

## 3.TeXLive

以下のサイトを参考にやりました。

https://qiita.com/DaikiSuyama/items/d463c5b7afdabc5fcde5


### 試行錯誤したところ

#### うまくいかなかったらとりあえずアプリ閉じて再起動

mac texのインストールの手順の一番最後にて、
```
sudo tlmgr update --self --all
```
を実行すると、pathが通っているにも関わらず「tlmgrが見つからないよ！」と言われてしまった。
```
exit
```
としてターミナルを閉じ、再起動してからもう一度試したら、うまくいった。

#### latexmkrcファイルの編集
ホームディレクトリにある隠しファイルを開くコマンドはこれ。
```
open ~/.latexmkrc
```
また、latexmkrcファイルのplatexの部分をuplatexとした。
日本語でtexを打つのにこうする必要があったはず。
```
latex = 'uplatex %O %S -halt-on-error';
```
#### 「latexmkのpathが通ってないよ！」と怒られた

```
which latexmk
```
でlatexmkまでの道のりを確認できる。
その後、ターミナルとVSCodeを再起動してあげるとうまくコンパイルしてくれた。
cscの作法 その479

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
PerformanceCounterを、使え。


# サンプルコード

```
using System;
using System.Collections.Generic;
using System.Diagnostics;

namespace App
{
	class Program {
		static void Main(string[] args) {
			string machineName = ".";
			string categoryName = "Processor";
			string counterName = "% Processor Time";
			string instanceName = "_Total";
			if (!System.Diagnostics.PerformanceCounterCategory.Exists(categoryName, machineName))
			{
				Console.WriteLine("登録されていないカテゴリです。");
				return;
			}
			if (!System.Diagnostics.PerformanceCounterCategory.CounterExists(counterName, categoryName, machineName))
			{
				Console.WriteLine("登録されていないカウンタです。");
				return;
			}
			System.Diagnostics.PerformanceCounter pc = new System.Diagnostics.PerformanceCounter(categoryName, counterName, instanceName, machineName);
			for (int i = 0; i < 10; i++)
			{
				Console.WriteLine(pc.NextValue());
				System.Threading.Thread.Sleep(1000);
			}
		}
	}
}




```

# 実行結果

```
>pf0
0
1.195673
1.142482
6.190276
0.003367271
0.4517617
0.7958871
0.1010572
0.3737908
0.8037181

```

以上。
Macシリコンでクロスコンパイラ

# Macシリコンでクロスコンパイラを扱う
クロスコンパイラで有名どころの「crosstool-ng」を、Macシリコンでトライしたときの記録。

## crosstool-ngのインストール
Macにcrosstool-ngを利用するためには、まず、開発環境を整える必要がある。下記をインストール（詳細略）。
- Xcodeコマンドラインツール
- パッケージマネージャーのHomebrew

そして、crosstool-ngのインストール。
```
$ sudo brew install crosstool-ng
```

## クロスコンパイラの作成
### つまづき
crosstool-ngでは、大文字小文字を区別する必要があるとのこと。そのまま、Buildしようとすると、ログに下記メッセージが表示され、Buildがストップする。
```
[ERROR]  Your file system in '/Users/xxxyyzz/proj/crosstool-ng/rpi/.build' is *not* case-sensitive!
```
MacのデフォルトファイルシステムAPFSでは、大文字小文字を区別しないらしい。そこで、[この記事](https://tnishinaga.hatenablog.com/entry/2014/10/15/010926)などの情報から、ディスクユーティリティーで、大文字小文字を区別するAPFS内コンテナを作成した。
![DiskUtilityForCross.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/4f8cac11-06d7-1f94-8e16-20b48cd744d3.png)
```
/Volumes/ForCross
```
上記Path配下で、crosstool-ngを実行する。

### ターゲットはx64（インテルバイナリ）
ここからは、過去の小生の記事「[意味のないクロスコンパイラ](https://qiita.com/infinite1oop/items/35da317ed81a740d469a)」とほぼ同じ。
```
$ cd /Volumes/ForCross
$ mkdir x64
$ cd x64
$ ct-ng x86_64-unknown-linux-gnu
$ ct-ng menuconfig
```
menuconfigにて、パスを適宜変更する。
![menuconfigのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/ce4082c1-3899-4b6e-d1a1-3a0ee6db2ad4.png)
その他、必要に応じて、configの内容を修正しBuild。
```
$ ct-ng build
```
結果、下記Pathにクロスコンパイラができあがる。
```
/Volumes/ForCross/x64/x-tools/x86_64-unknown-linux-gnu/bin
```

## 実行
### ターゲットソースコード
```c
$ cat test.c
#include <stdio.h>
int main()
{
	(void)printf("Test\n");
	return 0;
}
```

### クロスコンパイル
```
% /Volumes/ForCross/x64/x-tools/x86_64-unknown-linux-gnu/bin/x86_64-unknown-linux-gnu-gcc test.c -o x64

% file x64
x64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, with debug_info, not stripped

% ./x64
zsh: exec format error: ./x64
```
x64バイナリが作られている。当然のことながら、Mac(ARM)環境では実行不可。

### x64(Linux)環境下での実行
x64配下にコピーし実行。
```
$ file x64
x64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, with debug_info, not stripped
$ ./x64
Test
```
当然、実行できる。

## おまけ（実行時間）
小生のMac（CPU:Apple M2, 24GB memory）でのいくつかのターゲットの実行（コンパイラ作成）時間は下記となった。
|x86_64-unknown-linux-gnu|armv7-rpi2-linux-gnueabihf|x86_64-multilib-linux-gnu|
|---|---|---|
|19分15秒|18分00秒|25分00秒|

まずまずの時間であろうか。

EOF
簿記3級に合格するため、3週間でやったこと

## はじめに
日商簿記3級に合格しました。(2024/3/25)
エンジニアのなかでも、簿記知識の習得のため受験するケースは多々あると聞きます。
私の攻略方法を合格体験記として残します。

# 前提条件
・簿記の知識はゼロ。
・貸方、借方といったキーワードだけは知っている。
・法人向けの請求処理の開発に関わったことで受験を決意する。
・サーバーサイドの開発歴6年。
・文系出身。

# 学習内容
合格まで要した時間は3週間でした。
週当たり20時間（平日は1～2時間程度、休日は6時間）の学習時間です。
合計学習時間は70時間（前日の詰め込み含め）になります。

使用したのは[パブロフ簿記の総仕上げ問題集](https://amzn.asia/d/81OSTRQ "アマゾンへ")のみです。
簿記3級は解法を覚えて、ひたすら演習するのが近道だと思います。

# ポイント
基本的には以下のサイトを一読することで簿記攻略に必要な情報は揃います。非常に丁寧です。
https://pboki.com/

簿記3級の大問と配点は以下の通りです。
大問１ 仕訳（45点）
大問２ 補助簿等（20点）
大問３ 貸借対照表／損益計算書／精算表等（35点）

方方でも言われていますが仕訳の配点が非常に高く、大門２、３でも仕訳の知識は必須のため、仕訳ができれば合格します。（合格するとは言っていない）

### 1週目
YouTube動画で通勤中に簿記の概念を理解し仕訳を覚え、帰宅後に問題集を解くという生活を送りました。
初めは補助簿や損益計算書・貸借対照表のことは何も考えず、只ひたすら仕訳を理解することに徹しました。
- 基本の仕訳
- 計算が必要になる仕訳
- 決算時の特殊な仕訳

覚えることは、どういった取引なのか（何が増えて何が減っているのか）、貸方に書くべきなのか、借方に書くべきなのか（ホームポジションとは）といったことになります。

### 2週目
損益計算書・貸借対照表の攻略に入りました。
決算時の仕訳がキーになることを気付き、改めて仕訳を叩きこみました。

結果、時間をかければ表が埋められ、決算時仕訳のミスはあれど形にはなっているという状態に持ってこれました。

### 3週目
大問２を放置していたため、問題集を2周回して、なんとなくこうするのかなレベルで解法を抑えます。
その後は問題集の模擬試験を繰り返し解きました。
前日、問題集に特典として付いているWEB模擬試験を受けて8~9割ほどの正答率でした。

# 反省点
### 電卓を前日に購入したこと
これまで電卓を使わずに解いていたため、電卓を使いながら問題を解くことに慣れないまま受験してしまいました。
もっと早めに購入しておくべきです。

### WEB模擬試験を前日に解いたこと
結論、もう少し早めに取り組み、慣れておくべきでした。
紙で模擬試験を解く場合、表に直接書き込んだり、メモしたりと自由にやってしまっていましたが、WEB試験だとまっさらなメモ用紙2枚で、PC画面に問題と回答欄があるという環境の違いがあり、受験時も戸惑いました。

# まとめ
今後業務に役立つかと言われると、開発者レベルではあまり必要ない知識かもしれません。
ただ、今後転職を考える人にとってはポテンシャルとしてアピールできますし、簿記2級まで進めることができれば社内SEを目指す人にとっては非常に有用なスキルになると思います。

合格時の点数は
大問１：42点
大問２：10点
大問３：28点
80点／100点でした。

もう1週間あれば、大問２を安定して得点できるようにしたかった。

駄文失礼しました。
Amazon Cognitoによる認証・認可の導入［概要編］

## はじめに
今までの案件でCognitoの導入を担当することがあったんですが、この辺の仕様は時が経つと忘れがちなので、備忘録として残しておこうと思います。

認証・認可の技術は結構難しいので、1記事にまとめるとわかりづらいかなと感じたので、記事をいくつかにわけて投稿していこうと思います。

今回は概要編をやっていきます。

## Cognitoってなにができるの？

簡単にいうと、会員登録制のサイトなどユーザー登録が必要なアプリに対して簡単に認証・認可の仕組みを導入できます。

つまり
- ログイン画面の用意
- アプリからユーザー情報の切り離し
- ロール・権限の定義

などをやってくれるので、本質的なアプリ自体の機能の開発に集中できます。

## Cognitoの実際のログイン画面

Cognitoで利用できるログイン画面は2パターンあって、AWSが用意しているHosted UIとユーザー側が独自で用意するUIがあります。

### Hosted UI
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520632/9f6c5ef5-2673-7f64-ed20-19f5e67fd689.png)

ロゴやCSSは変更できるものの、HTML自体は変更できず、日本語化ができません。
しかし、このHosted UIを使わないと使用できないAPIがあります。

### 独自UI
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520632/5adcab15-0d62-bbf0-ee19-e14f3623b06f.png)

ユーザー側が自分で用意するUIです。
画像はAmplify UIといって、AWSが用意しているUIテンプレート。

## ユーザープールとIDプール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520632/1b06e3cb-53ef-7620-e9e1-c0abe4534790.png)

上記画面にあるように、CognitoにはユーザープールとIDプールという２つのリソースがあります。

### ユーザープール
ユーザーのサインアップやサインイン、ユーザー属性の管理など、アプリケーションのユーザー認証に関連する機能を提供しています。

### IDプール
アプリケーションの認証済みユーザーに対してAWSリソースへのアクセスを管理します。

## 基本的にユーザープールを使う
簡単に言うと、ユーザープールはユーザーの認証を処理して、IDプールはAWSリソースへのアクセスを許可します。

基本的にアプリケーションの認証・認可にはユーザープールを使うと覚えておいてください。

## 次回
次回は実践編ということで実際にサンプルアプリを用意して、そこにCognitoによる認証機能を組み込んでいきます。
Laravel11 認証されていないユーザーのリダイレクトの設定方法


Laravel11 では、app/Http/Middleware群がフレームワーク側に移動されました。
そのため、認証されていないユーザーのリダイレクトの設定方法を変更する必要があります。


### Laravel10 までの認証されていないユーザーのリダイレクトの設定方法

Laravel10 の認証されていないユーザーのリダイレクトの設定方法は、`app/Http/Middleware/Authenticate.php` の
`redirectTo` メソッドを変更することで行います。

```php:app/Http/Middleware/Authenticate.php
<?php

namespace App\Http\Middleware;

use Illuminate\Auth\Middleware\Authenticate as Middleware;
use Illuminate\Http\Request;

class Authenticate extends Middleware
{
    /**
     * Get the path the user should be redirected to when they are not authenticated.
     */
    protected function redirectTo(Request $request): ?string
    {
        return $request->expectsJson() ? null : route('login');
    }
}
```


### Laravel11 の認証されていないユーザーのリダイレクトの設定方法

Laravel11 では、`bootstrap/app.php` の `withMiddleware` でフレームワーク側のミドルウェアを設定します。
認証されていないユーザーのリダイレクトの設定は、`redirectGuestsTo` メソッドを使用して行います。

```php:bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {
    $middleware->redirectGuestsTo('/login');
})
```

`redirectGuestsTo` メソッドはクロージャも受け入れます。

```php:bootstrap/app.php
use Illuminate\Http\Request;

->withMiddleware(function (Middleware $middleware) {
    $middleware->redirectGuestsTo(fn (Request $request) => route('login'));
})
```

#### 管理者用の認証されていないユーザーのリダイレクトの設定方法

ルートグループのルート名を使用して、管理者用の認証されていないユーザーのリダイレクトを設定することもできます。
以下のように、`Route::name('admin.')` でルートグループを設定が設定されている場合 ...

```php:routes/web.php
Route::name('admin.')->group(function () {
    // ...
});
```

`$request->routeIs('admin.*')` で管理者用のルートかどうかを判定し、リダイレクト先を設定します。

```php:bootstrap/app.php
use Illuminate\Http\Request;

->withMiddleware(function (Middleware $middleware) {

    $middleware->redirectGuestsTo(function (Request $request) {

        if ($request->routeIs('admin.*')) {
            return route('admin.login');
        }

        return route('login');
    });
})
```
スッキリわかるSQL入門第４版を読んで

# はじめに
スッキリわかるSQL入門第４版を読んで、良かったところ、学んだこと、難しかったことをまとめていこうと思います。

# 良かったところ
* 環境構築なしに専用のサイトで演習問題ができる
* 読んでいて疑問に感じる部分を会話形式で説明してくれるのがわかりやすいです
* 最後の章で基本的なデータベースの設計の部分まで説明してくれる

# 学んだこと
### SQLの体系（2章）
* SELECT、UPDATE、DELETE、INSERT の4つの命令が基本
* 4つは検索系と更新系（操作内容から見た）、既存系と新規系（対象とするデータから見た）の2通りの分類方法がある

### 主キー（3章）
「この値を指定すれば、ある1行を完全に特定できる」役割を担う列のこと
* 自然キー：自然に主キーの役割を担う列
* 人工キー：管理目的のために人為的に作られた列（自然キーが存在しない時は人工キーを追加して識別可能にする）

### 検索結果の加工（4章）
* DISTINCT：重複行を除外する
* ORDER BY：結果を並び替える
* OFFSET - FETCH：行を限定して取得する
* UNION、EXCEPT/MINUS、INTERSECT：結果を集合演算する

### 集計関数（6章）
* SUM：データを合計する （数値）
* MAX：最も大きい値を求める （数値、日付と時刻、文字列）
* MIN：最も小さい値を求める （数値、日付と時刻、文字列）
* AVG：データを平均する （数値）
* COUNT：行数をカウントする （すべてのデータ型）

### 副問い合わせ（サブクエリ）について（7章）
SQL文の中に別のSELECT文を記述することができる
#### 副問い合わせパターン
* 単一行副問い合わせ：結果が1行1列になるもの
* 複数行副問い合わせ：結果がn行1列になるもの
* 結果がn行m列の表形式になる副問い合わせも使われる
#### 複数行副問い合わせと演算子
* IN、ANY、ALL演算子と合わせてよく使われる
* 結果にNULLが含まれると、NOT IN、<>ALL演算子の評価結果もNULLになる

### トランザクション（9章）
複数のSQL文を送るときにひとかたまりとして扱うように指示できる

### テーブルの作成（10章）
* CREATE TABLE文：新規のテーブルを作成
* DROP TABLE文：テーブル削除
* ALTER TABLE文：テーブルの定義を変更

### データベースをより安全に扱う（11章）
* ACID特性：データを正確かつ安全に取り扱うためにシステムが備えるべき4つの特性
  * 原始性：　処理が中断しても中途半端な状態にならない
  * 一貫性：データの内容が矛盾した状態にならない
  * 分離性：複数の処理を同時実行しても副作用がない
  * 永続性：記録した情報は消滅せず保持され続ける
  
* インデックス:テーブルの列に対して、索引情報を生成することができる。書き込み性能の低下を招く可能性もあるため乱用は禁物
* ビュー:SELECT文の結果表を　仮想的なテーブルとして扱うことができる
* 採番とシーケンス：複雑な採番を行う際は、採番テーブルを作るなどして自力で実装する必要がある
* バックアップ：正確なデータ処理には、正確なACID特性が求められる。データベースの内容だけでなく、ログファイルもバックアップしておき、そこからデータベースの操作をロールフォワードすることで、障害発生直前の状態まで復元できる。

# 難しかったこと
テーブル設計の部分はまだまだ理解が足りないと感じました。
自力で1から作成するには別の書籍も使って勉強する必要があると感じました。

# 参考文献
[スッキリ分かるsql入門 第4版 ドリル256問付き](https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BSQL%E5%85%A5%E9%96%80-%E7%AC%AC4%E7%89%88-%E3%83%89%E3%83%AA%E3%83%AB256%E5%95%8F%E4%BB%98%E3%81%8D%EF%BC%81-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8B%E5%85%A5%E9%96%80%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1/dp/4295018465/ref=sr_1_1?crid=1XH9YB3VIDIJB&dib=eyJ2IjoiMSJ9.xInwby6L9meVu-DcOzcsfK6z5ePG5-SuA18Than2xNJiaSHc_KqF60ZtYe5bZdvsGWJiR57UrNJSpG9gKmP7AfIjUjn9s-jHszu8PWhwyDinhTMZ5ZSLj3iG0Ro_cR0fY6Ppeb6nCd1TPyWo8oJy050VEYKPzjBti2vsf7XuKTynQNyps0Q2itVCY0gMLbrMXIUw5PcwMzksOcqFCJXXsX_QsXOD3F2PpFP5Q6u-nf9OxJddjJzTF0iXDRfzHHV8.8hins12yQgTxyllzbrk1bN6hHtMmSfA3YqpCRDxjB0k&dib_tag=se&keywords=%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E5%88%86%E3%81%8B%E3%82%8Bsql%E5%85%A5%E9%96%80+%E7%AC%AC4%E7%89%88+%E3%83%89%E3%83%AA%E3%83%AB256%E5%95%8F%E4%BB%98%E3%81%8D&qid=1712364445&sprefix=%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8Bsql%E5%85%A5%E9%96%80%2Caps%2C167&sr=8-1)
Laravel11のDockerとか自動テストの環境を作成した

# はじめに

こんにちは、エンジニアのkeitaMaxです。

前回作成したLaravelの色々やった記事がLaravel１０でやっていたので、同じ環境をLaravel１１で作ってみました。

# Git

https://github.com/NiheiKeita/docker-laravel11-example-app

# やっていること

やっていることについては前回の以下の記事を読んでいただけると幸いです。

https://qiita.com/keitaMax/items/c7dec65eeb1079cca09e

# おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！

# Laravel10のリポジトリ

https://github.com/NiheiKeita/docker-laravel-app
仮想マシンをBridge接続に切り替えたらイーサネットが切断済みになった件

# 経緯
仮想マシンでDNSサーバーを構築時、画面右上に「接続に失敗しました」のポップが発生（非常に鬱陶しい...）
原因はBridge接続に切り替えていた為だったのですが、その時調べたことなど新しく仕入れた知識をメモついでに共有します。

# 試したこと
最初Bridge接続に切り替えていたことを失念していた為、考えられる原因がNetWork Manager関連かな？と思い
```ruby
# nmcli d
```
を実行したところ、案の定イーサネットは切断済みになっていました。
そこで、
```
# nmcli c u ens●●
```
を出力したのですが暫く経った後、接続のアクティベーションに失敗しましたとのエラー。いろいろ調べてたらそういや接続方式変えたんだったなと思いだし、無事解決した流れです。



# NAT接続とBridge（ブリッジ）接続
仮想マシンがホストコンピューターのネットワークに接続する方法
### ・NAT接続 
ホストコンピューターが仮想マシンにプライベートなIPアドレスを割り当て、インターネットへのアクセスを仮想マシンに提供します。
### ・Bridge接続
仮想マシンにホストコンピューターと同じネットワーク上のIPアドレスを割り当て、ネットワーク上の他のデバイスと直接通信できるようになります。
<br>

# 考えられうる原因

1. **IPアドレスの競合**: 
ブリッジ接続では、ホストコンピューターと同じネットワーク上にあるため、ホストや他のデバイスと同じIPアドレスを持つと競合が発生します。これにより、ネットワーク上で正しく通信できなくなります。

2. **ネットワーク設定の不一致**: 
Bridge接続では、ネットワークの構成が正しく設定されていない場合、通信が遮断されることがあります。例えば、正しいゲートウェイやサブネットマスクが設定されていない場合などです。

3. **ファイアウォールの設定**: 
ファイアウォールがブリッジ接続をブロックしている可能性があります。ファイアウォールが仮想マシンとネットワーク間の通信を遮断している場合、仮想マシンはネットワークに接続できなくなります。

4. **MACアドレスの問題**: 
ネットワーク機器がMACアドレスを認識していない場合、通信が妨げられることがあります。ブリッジ接続では、仮想マシンがホストコンピューターと同じMACアドレスを使用するため、ネットワーク機器がMACアドレスを認識できない可能性があります。

# 解決策
まずネットワーク設定を確認し、必要に応じてIPアドレス、ゲートウェイ、サブネットマスクなどを調整します。また、ファイアウォールやネットワーク機器の設定も確認し、必要な変更を行います。

# 参考

https://uetora.hatenablog.com/entry/things-to-check-when-vmware-virtual-machine-does-not-connect-to-internet

https://pepe-log.com/vmware-solve-trouble-2/

https://amidagamine.com/notes/303

おまけ

https://qiita.com/liqsuq/items/1474702cb01c9cc9e781

https://go-journey.club/archives/4124
Pythonで「テキストファイルを読み込む」の動作を確認してみた

# 概要

Pythonで「テキストファイルを読み込む」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/file/index2.html

# 実装

以下のファイルを作成しました。
```sample.py
f = open('myfile.txt', 'r', encoding='UTF-8')
data = f.read()
print(data)
f.close()

f = open('myfile.txt', 'r', encoding='UTF-8')
datalist = f.readlines()
for data in datalist:
  print(data, end='')
f.close()

f = open('myfile.txt', 'r', encoding='UTF-8')
while True:
  data = f.readline()
  if data == '':
    break
  print (data.rstrip('\n'))
f.close()

f = open('myfile.txt', 'r', encoding='UTF-8')
for data in f:
  print (data.rstrip('\n'))
f.close()
```

```myfile.txt
明日の天気はどうだろう。
晴れたらいいな。
雨じゃなかったら公園に行こう。
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
明日の天気はどうだろう。
晴れたらいいな。
雨じゃなかったら公園に行こう。

明日の天気はどうだろう。
晴れたらいいな。
雨じゃなかったら公園に行こう。
明日の天気はどうだろう。
晴れたらいいな。
雨じゃなかったら公園に行こう。
明日の天気はどうだろう。
晴れたらいいな。
雨じゃなかったら公園に行こう。
```

# まとめ

何かの役に立てばと。
cscの作法 その478

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
treeviewを、一から組み立てよ。（スクラッチで）

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/be21ad31-fcfb-7d67-e45a-c8c269c73e60.png)

# サンプルコード

```

using System;
using System.Drawing;
using System.Windows.Forms;

namespace App
{
	public partial class Form1: Form {
		private TreeView treeView1;
		Button button1;
		public Form1() {
			ClientSize = new Size(500, 300);
			Text = "TreeView";
			button1 = new Button();
			button1.Text = "get";
			button1.AutoSize = true;
			button1.Dock = DockStyle.Bottom;
			button1.BackColor = Color.Red;
			button1.Click += new EventHandler(button1_Click);
			this.Controls.Add(button1);
			treeView1 = new TreeView();
			treeView1.Dock = DockStyle.Fill;
			treeView1.HotTracking = true;
			treeView1.Location = new Point(10, 10);
			treeView1.Name = "treeView1";
			treeView1.Size = new Size(480, 280);
			treeView1.TabIndex = 0;
			TreeNode tNode;
			tNode = treeView1.Nodes.Add("Websites");
			treeView1.Nodes[0].Nodes.Add("Net-informations.com");
			treeView1.Nodes[0].Nodes[0].Nodes.Add("CLR");
			treeView1.Nodes[0].Nodes.Add("https://net-informations.com/vb/default.htm");
			treeView1.Nodes[0].Nodes[1].Nodes.Add("String Tutorial");
			treeView1.Nodes[0].Nodes[1].Nodes.Add("Excel Tutorial");
			treeView1.Nodes[0].Nodes.Add("Csharp.net-informations.com");
			treeView1.Nodes[0].Nodes[2].Nodes.Add("ADO.NET");
			treeView1.Nodes[0].Nodes[2].Nodes[0].Nodes.Add("Dataset");
			this.Controls.Add(treeView1);
		}
		private void button1_Click(object sender, EventArgs e) {
			MessageBox.Show(treeView1.SelectedNode.FullPath.ToString());
		}
		[STAThread]
		static void Main() {
			Application.Run(new Form1());
		}
	}
}


```


以上。
派生元ブランチとの差分のPHPファイル一覧を取得する

必要に迫られてエイリアスを作りました。

`~/.zshrc` に追記する。

```zsh:~/.zshrc
alias derived-branch='git show-branch | grep '\''*'\'' | grep -v "$(git rev-parse --abbrev-ref HEAD)" | head -1 | awk -F'\''[]~^[]'\'' '\''{print $2}'\'''
alias derived-diff="git --no-pager diff --name-only \$(derived-branch)"
alias derived-php-diff="git --no-pager diff --name-only \$(derived-branch) -- '*.php'"
```

派生元ブランチを取得します。
ローカルにないとブランクになります。

```zsh
$ derived-branch
```

派生元ブランチと差分のファイル一覧をすべて表示します。

```zsh
$ derived-diff
```

派生元ブランチと差分のPHPファイル一覧を表示します。

```zsh
$ derived-php-diff
```

## Gitシリーズ記事まとめ

https://qiita.com/ucan-lab/items/33c63a402f533aa92f3e

## 参考

https://qiita.com/upinetree/items/0b74b08b64442f0a89b9
Azure App Service で JupyterLab をユーザーごとに用意してみた

例えば、新入社員研修などで JupyterLab を用意したいとします。Azure App Service プランの B1 は 8 アプリをのせる事ができます。アプリごとに利用者を割り当てるという使い方を想定して、JupyterLab を動かす検証をしてみました。

## App Service プランの B1 を作成

```bash:bash
prefix=mnrlab
region=japaneast

az group create \
  --name ${prefix}-rg \
  --location $region

az appservice plan create \
  --name ${prefix}-asp \
  --resource-group ${prefix}-rg \
  --sku B1 \
  --is-linux
```

## user01 用の JupyterLab を作成

```bash:bash
username=user01

az webapp create \
  --name ${prefix}-$username \
  --resource-group ${prefix}-rg \
  --plan ${prefix}-asp \
  --deployment-container-image-name quay.io/jupyter/scipy-notebook:2024-03-14 \
  --https-only

az webapp config access-restriction add \
  --name ${prefix}-$username \
  --resource-group ${prefix}-rg \
  --priority 100 \
  --rule-name MyIP \
  --action Allow \
  --ip-address $(curl -s inet-ip.info)

az webapp config appsettings set \
  --name ${prefix}-$username \
  --resource-group ${prefix}-rg \
  --settings WEBSITES_PORT=8888

az webapp log config \
  --name ${prefix}-$username \
  --resource-group ${prefix}-rg \
  --web-server-logging filesystem
```

## user01 用の JupyterLab にアクセス

![appservice-jupyterlab-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/0a4bc462-161f-df7a-58fc-5a1444266890.png)

## ログストリームから token を探す

![appservice-jupyterlab-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/b3d41077-65aa-79b2-cb52-24e5553726ed.png)

## user01 用の JupyterLab ログイン後画面

![appservice-jupyterlab-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/ee011973-6dbf-8ede-0ff7-5f9568106a3c.png)

## 簡単な動作確認

![appservice-jupyterlab-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/3bd14308-ae82-c7e2-b33e-abbcdec7592a.png)

## user02 用の JupyterLab を作成

```bash:bash
username=user02

az webapp create \
  --name ${prefix}-$username \
  --resource-group ${prefix}-rg \
  --plan ${prefix}-asp \
  --deployment-container-image-name quay.io/jupyter/scipy-notebook:2024-03-14 \
  --https-only

az webapp config access-restriction add \
  --name ${prefix}-$username \
  --resource-group ${prefix}-rg \
  --priority 100 \
  --rule-name MyIP \
  --action Allow \
  --ip-address $(curl -s inet-ip.info)

az webapp config appsettings set \
  --name ${prefix}-$username \
  --resource-group ${prefix}-rg \
  --settings WEBSITES_PORT=8888

az webapp log config \
  --name ${prefix}-$username \
  --resource-group ${prefix}-rg \
  --web-server-logging filesystem
```

## user02 用の JupyterLab にアクセス

![appservice-jupyterlab-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/e156bf93-f897-ca3d-08fb-cc5ef6f5a9de.png)

## 参考

https://techcommunity.microsoft.com/t5/apps-on-azure-blog/step-by-step-guide-deploying-jupyterlab-to-azure-app-service/ba-p/3856590

https://jupyter-docker-stacks.readthedocs.io/en/latest/
APIを使わずにTwitterでシェアする

# はじめに

Twitterでシェアリンクを作る、これが結構簡単でしたので記事にします。

# Twitterシェアリンクの作り方

最も原始的なやりかた「手打ち」でリンクを生成しましょう。
これができればどの言語からでも利用できますからね。

今回は、自分のQiita URLを本文付きでシェアしてみましょう。

メモアプリを使うのが良いと思います。
## 1.  シェアリンクの基礎

`https://twitter.com/intent/tweet?`

↑を儀式だと思ってコピーしてください。

`intent/tweet?`は`share?`とも書けますが、特定のプラットフォーム（Androidネイティブアプリ？）では機能しないことがあるようです。
`intent/tweet?`と書きましょう。

https://foxism.jp/2023/05/twitter-share-button/

## 2. シェアURLの指定

先程の続きに、`url=https://qiita.com/kohki_takatama`と入れてください。

（`https://twitter.com/intent/tweet?url=https://qiita.com/kohki_takatama`となっています。）

`kohki_takatama`の部分は、ご自身のユーザーネームに変えてください。

## 3. 本文テキストの指定

さらに続いて、`&text=テスト：Qiitaリンクのシェア`と入れてください。

`テスト~シェア`までの文字列は変えても構いません。

## 4. 完成したURLにアクセス

`https://twitter.com/intent/tweet?url=https://qiita.com/kohki_takatama&text=テスト：Qiitaリンクのシェア`をブラウザに貼り付け、アクセスしてみましょう！

![スクリーンショット 2024-04-05 20.23.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/0bec002e-b5e6-9c08-2662-a9745459d694.png)

シェアリングが作れました！

## そのほかに指定できるもの

`url=...&text=...`という形になっているのはお気づきでしょうか？
このように、`&`を使ってこの他にも指定できます！

### `hashtags`

例：先程のURL`&hashtags=Qiita,テスト`

![スクリーンショット 2024-04-05 20.29.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/67e0e518-3f4c-2101-570f-e00d169a5cc8.png)

改行したいですね。先程の`text`の最後に、URLの改行コード`%0A`を2つ入れましょう。

`https://twitter.com/intent/tweet?url=https://qiita.com/kohki_takatama&text=テスト：Qiitaリンクのシェア%0A%0A&hashtags=Qiita,テスト`

![スクリーンショット 2024-04-05 20.36.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/118cbfad-d5de-cbd7-4706-b9f92f7e8f07.png)

### `via`

例：`&via=Qiita`

![スクリーンショット 2024-04-05 20.54.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/bec21723-8593-c3cb-7d6c-fc8488ba2bac.png)

### `in_reply_to`

リプライを飛ばします。
使い道が思いつかなかったです。

使い方：`in_reply_to=tweet_id`

# おわりに

Twitter APIを使わずともシェアツイートできるんですね・・・便利。

今回の記事の内容について、[すみさん](https://twitter.com/sumisumi2000308)に大きくサポートいただきました！感謝。

https://twitter.com/sumisumi2000308

すみさんの記事もぜひお読みください！

https://qiita.com/sumisumi2000/items/9e5184c7f5616961e5e2

すみさんの作ったサービスはこちら
みんなのバケットリスト（死ぬまでにやりたいことリスト）を見ることができます！

https://wishway.onrender.com/wish_lists

さて、次は何を書こうかしら・・・

# 参考

https://zenn.dev/ganmo3/articles/db1817e05f89a5

https://foxism.jp/2023/05/twitter-share-button/

https://qiita.com/sumisumi2000/items/9e5184c7f5616961e5e2
[Google Calendar API(V3)] Javaでアクセス制御ルール(ACL)を変更を監視する

Google Calendar API V3(Java)を使用して、
Googleカレンダーのアクセス制御ルール(ACL)を変更を監視する方法
についてご紹介します。

**カレンダーのアクセス制御ルール(ACL)とは**
指定したユーザー、またはグループと予定の共有ができます。
UIでは、カレンダーの設定 -> [特定のユーザーまたはグループと共有する]
から設定できる内容です。
<img width=480 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/b4ceb33f-d6c5-84ce-49fb-a1e68d192a65.png">

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Google Calendar API(V3)] JavaでCalendar APIを使う](https://qiita.com/doran/items/c735c7b05c0a2ed4bfdb)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[ACLの変更を監視](#1-aclの変更を監視)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|
|2||[ACLの監視を停止](#2-aclの監視を停止)|
|3||[変更通知を受信](#3-変更通知を受信)|

## 1. ACLの変更を監視
Googleカレンダーのアクセス制御ルールの変更を監視します。

### 1.1. スコープ
このAPIを実行するには、以下のスコープを指定してください。
```
CalendarScopes.CALENDAR
```
[⧉[Google Calendar API(V3)] JavaでCalendar APIを使う(2.2 Driveインスタンスを取得)](https://qiita.com/doran/items/c735c7b05c0a2ed4bfdb#22-calendarインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行

```java
public static void main(String[] args) throws Exception{
    Calendar calendar = getCalendar();
    Calendar.Acl acl = calendar.acl();
    
    Channel content = new Channel();
    content.setId("チャンネルを識別するUUID");
    content.setType("web_hook");
    content.setAddress("変更通知が配信されるURL");
    Calendar.Acl.Watch watch = acl.watch("カレンダーID",content);
    
    Channel res = watch.execute();
    System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
POST:　https:\//www.googleapis.com/calendar/v3/calendars/{カレンダーID}/acl/watch
が実行されます。

#### 1.2.2. クエリパラメータ
クエリパラメータはありません。

#### 1.2.3. リクエストボディ
Channelのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setId|String|【必須】チャンネルを識別するUUID|	
|setAddress|String|【必須】変更通知が配信されるURL|
|setType|String|【必須】このチャンネルで使用される配信方法の種類<br>"web_hook"（または"webhook"）のみ|
|setToken|String|このチャンネル経由で通知と一緒に対象のアドレスに配布される任意の文字列|	
|setParams|Map\<String,String\>|配信チャンネルの操作を制御する追加のパラメータ|	
|setExpiration|Long|通知チャンネルの有効期間（秒）|
### 1.3. レスポンスの内容

#### Channel

|メソッド|戻り値|説明|
|---|---|---|
|getKind|String|リソースの種類<br>固定文字列："api#channel"|
|getId|String|このチャンネルを識別するUUID|	
|getResourceId|String|このチャンネルで監視するリソースを識別するID|
|getResourceUri|String|監視対象のリソースのバージョン固有のID|	
|getToken|String|このチャンネル経由で通知と一緒に対象のアドレスに配布される任意の文字列|
|getExpiration|long|通知チャンネルの有効期限|

## 2. ACLの監視を停止
Googleカレンダーのアクセス制御ルールの監視を停止します。

変更通知の停止は、
[⧉[Google Calendar API(V3)] Javaで変更通知を停止する](https://qiita.com/doran/items/3c3ad1d6406d8fac634e)
の記事を参照ください。

## 3. 変更通知を受信
アクセス制御ルール(ACL)の変更があった場合、登録したURLへPOSTされます。
HTTPヘッダーの「x-goog」から始まるヘッダーの内容で確認できます。

|ヘッダ|内容|例|
|---|---|---|
|x-goog-channel-expiration|通知チャネルの有効期限|Tue, 02 Apr 2024 03:29:03 GMT|
|x-goog-channel-id|チャンネルを識別するUUID|test|
|x-goog-message-number|通知チャネルのこのメッセージを識別する整数|5238|
|x-goog-resource-id|チャンネルで監視するリソースを識別するID|NM0q1CyhvAtfdSZIlhdhdKtz68Q|
|x-goog-resource-state|通知をトリガーした新しいリソースの状態<br>sync,exists,not_exists|exists|
|x-goog-resource-uri|監視対象リソースの API バージョン固有の識別子|`https://www.googleapis.com/calendar/v3/calendars/*******/acl?alt=json`|

<br>
<br>
おしまい。。
Information Security

PRE-DRAFT Call for Comments | Small Business Information Security: The Fundamentals
https://csrc.nist.gov/pubs/ir/7621/r2/iprd


<この項は書きかけです。順次追記します。>
This article is not completed. I will add some words in order.

# NIST IR 7621
NISTIR 7621 Revision 1
Small Business Information Security: The Fundamentals
https://nvlpubs.nist.gov/nistpubs/ir/2016/NIST.IR.7621r1.pdf

http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/03/post-d57ebb.html


https://csrc.nist.gov/files/pubs/ir/7621/r2/iprd/docs/ir7621-comment-template.xlsx

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.


# 文書履歴(document history)
ver. 0.01 初稿 　20240306
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
WebSocketでSymbol監視

## 必要なモノ
- Node.js 

## インストール
wscat をグローバルにインストール。
```bash
npm install -g wscat
```

## Symbol を監視
### 接続
HTTPの場合
```bash
wscat -c ws://finnel.harvestasya.com:3000/ws
```

HTTPSの場合
```bash
wscat -c wss://finnel.harvestasya.com:3001/ws
```

### サブスクライブ
接続に成功すると、コンソールに下記のような応答があります。
```plaintext
Connected (press CTRL+C to quit)
< {"uid": "YUM33OHO7OAOYMDUELUTSCAAHCW7KWK7"}
```

これをコピーして、さらに subscribe 項目とキーを付け足します。
```
{"uid": "YUM33OHO7OAOYMDUELUTSCAAHCW7KWK7", "subscribe": "サブスクキー"}
```

例えば、「新しいブロック」の検知通知は以下です。
```
{"uid": "YUM33OHO7OAOYMDUELUTSCAAHCW7KWK7", "subscribe": "block"}
```
新しいブロックが生成されると通知が来ます。
接続後何も通知がないと切断されるので、これを入れて切断されないようにすると良いと思います。


| サブスクキー        | 説明 |
|--------------------|--|
| block              | 新しいブロック生成通知 |
| finalizedBlock     | ファイナライズ通知 |
| confirmedAdded     | 承認トランザクション通知<br>`confirmedAdded/アドレス` の様にするとアドレスでフィルタ可能 |
| unconfirmedAdded   | 未承認トランザクション追加通知<br>`unconfirmedAdded/アドレス` の様にするとアドレスでフィルタ可能 |
| unconfirmedRemoved | 未承認トランザクション削除通知<br>`unconfirmedRemoved/アドレス` の様にするとアドレスでフィルタ可能 |
| partialAdded       | パーシャル追加通知<br>`partialAdded/アドレス` の様にするとアドレスでフィルタ可能 |
| partialRemoved     | パーシャル削除通知<br>`partialRemoved/アドレス` の様にするとアドレスでフィルタ可能 |
| cosignature        | 署名要求通知<br>`cosignature/アドレス` の様にするとアドレスでフィルタ可能 |
| status             | ステータス通知<br>(アナウンス時のエラー通知)|
div タグに p タグは入れられるけど、p タグに div タグは入れられない

# 起こる現象

HTML の `p` タグの中に `div` タグを記述すると、`div` タグが `p` タグを閉じた次に置かれた状態になってしまい、`p` タグの中に `div` タグを入れることができない。
`div` タグの中に `p` タグを記述した場合は、素直に入ってくれる。
`p` タグの中に `span` タグを記述した場合も、素直に入ってくれる。

```html:ソースコード
<p><div>div in p</div></p>
<div><p>p in div</p></div>
```

```html:開発者ツールでの表示
<p></p>
<div>div in p</div>
<p></p>
<div>
  <p>p in div</p>
</div>
<p>
  <span>span in p</span>
</p>
```

# なぜこうなるか

[HTML Living Standard](https://html.spec.whatwg.org/) では、それぞれのタグに入れることができる要素の種類が[コンテンツモデル](https://html.spec.whatwg.org/#content-models)として決まっている。

今回使用したタグおよびテキストでは、以下のようになっている。

|タグ/テキスト|属する種類|入れることができる種類|
|---|---|---|
|[`p` タグ](https://html.spec.whatwg.org/#the-p-element)|フローコンテンツ<br>パルパブルコンテンツ|フレージングコンテンツ|
|[`div` タグ](https://html.spec.whatwg.org/#the-div-element)|フローコンテンツ<br>パルパブルコンテンツ|フローコンテンツ<br>(`dl` タグの子でないとき)|
|[`span` タグ](https://html.spec.whatwg.org/#the-span-element)|フローコンテンツ<br>フレージングコンテンツ<br>パルパブルコンテンツ|フレージングコンテンツ|
|[テキスト](https://html.spec.whatwg.org/#text-content)|フローコンテンツ<br>フレージングコンテンツ<br>パルパブルコンテンツ|-|

これから、以下のことがわかる。

* `p` タグはフローコンテンツなので、`div` タグに入れることができる
* `span` タグはフレージングコンテンツなので、`p` タグに入れることができる
* `div` タグはフレージングコンテンツ**ではない**ので、`p` タグに入れることが**できない**

また、`p` タグの直後に `div` タグ (など) がある場合は、`p` タグの終了タグを省略できることになっている。

そのため、`p` タグの中に `div` タグを入れようとしても、入れることはできず、`p` タグの終了タグを省略して直後に (`p` タグの兄弟として) `div` タグを置いた、として扱われる。

# p タグにブロックを入れたい場合は

何を実現したいかにもよるが、テキストのブロックを入れたい場合は `span` タグに CSS の `display: block;` や `display: inline-block;` をつけるとよい。

# 参考

* [【一覧表あり】HTML5でのタグの入れ子のルールを徹底まとめ｜webliker（ウェブライカー）](https://webliker.info/html/46840/)
* [HTML5でのタグの入れ子のルール | 社員ブログ | くらしを楽しむ世の中を、もっと。](https://me-pro.co.jp/blog/creative_046.html)
私が、何でプログラミングを学んでいるのか？

# はじめに
皆さま、こんにちは、ham(@sweettweet000000)と申します。
趣味でゲーム作りつつ、都内のプログラミング教室で小中学生の生徒にScratchとUnityを教えています。

ある同僚に **「何でプログラミングを学んでいるのか？」** と問われたのがきっかけでこの記事を書いています。

# 目次
1. [はじめに](#はじめに)
2. [目次](#目次)
3. [困ったこと](#困ったこと)
4. [本題](#本題)
    - [プログラミング学習は外国語学習と似てる](#プログラミング学習は外国語学習と似てる)
    - [単語](#単語)
    - [文法](#文法)
    - [実践](#実践)
    - [フレーズ](#フレーズ)
5. [終わりに](#終わりに)

# 困ったこと
どう返そうかと考えてみましたが、すぐに困ったことに気づきました。
この問い、答えられなかったんです。

## 理由
おそらくこの問いは、教科書はどれ？ということなのですが、ないんです。
少なくとも自分は、ScratchやUnityを勉強しようと思って書籍も買ってないし、よくある入門サイトも見てない。

 **「自分ってどうやって勉強してたっけ・・・？」**

実際にアプリを使ってゲーム作りながら、へぇ、これってこう使うんだなとか、分かんないことはネットで適宜調べつつ・・・でも、これだときっと聞きたいことと違うんだろうな、と至りました。

そこで、自分の勉強スタイルを一から記事みたく説明してみよう、と閃いたわけです。
ここからやっと本題に入ります。

# 本題
まず、自分の目指しているゴールは２つです。

* **他人のコードが何となく読める**
* **自分でコードが何となく書ける**

そもそも、プログラミングのような先端技術は流行に影響を受けやすいので、この前勉強したことなのにもう使えない、ということがたまに起こります。また、言語によっても文法が異なるので丸覚えしていると応用が効かなくて辛くなりがちです。

>例えば、「ふむふむ、C++ではint main() { return 0; }で関数が実行されるんだな」と丸覚えしてもPythonでは全然動きません。

そのため、自分は細かなところをいちいち覚えてはいません。Pythonでfor文にコロン必要かな？というふうに毎度ネットで調べています。
でもそれだと時間かかりません？ってツッコまれそうですが、頻出の構文があって何回も調べれば勝手に覚えてしまいます。そうつまり、この調べる過程が超重要なんですよね。

この流れどっかで見たことあるような・・・

## プログラミング学習は外国語学習と似てる
ちょって待って・・・

**ゴールが読みと書きなら、ほぼ外国語学習じゃん！！！！！！**

実際、プログラミング学習は外国語学習にかなり似ていて応用がききます。

* **単語**を学び
* **文法**を学び
* **実践**して確かめ
* よくある**フレーズ**を覚え
* 何となく言ってることが解るし、何となく自分の言いたいことを表現できればゴール

以下、それぞれの段階で自分がどうしてるのかについて簡単に説明します。

## 単語
プログラミング学習において、単語はあまり重要じゃないです。ネットという素晴らしい辞書のおかげですぐに調べられるから。

>例えば、
    ・true / false
    ・int / float / string / bool
    ・Vector
    ・Rigidbody2D

:::note
trueなど、一部の語は大抵のプログラミング言語に共通しているため、一度覚えれば応用が効くのでお得
:::

勉強するなら、知識の漏れがないように網羅的に扱っているものがオススメ。例えば、自分は「〇〇　入門」で出てくるサイトに加えて、店頭で読み比べして買った書籍が数冊で勉強しました。
コードを読んでてよく出てくる単語は覚えていて、たまに出てくる単語も調べたらすぐ分かるくらいの理解が理想です。

## 文法
プログラミング言語の文法は必須です。特別な概念が多々あるのがちょっと難しいですが、使用頻度が超高く超重要です。

>例えば、
・波括弧({})  セミコロン(;) の用法
・void / return の用法
・private / public の用法

勉強法は、単語と同じです。
文法がわからないと読みにも書きにも影響するので完璧にしておきたいです。

## 実践
単語と文法に慣れてきたら読み書きの練習をします。
自分もやっていることですが、おすすめは他人の短いコードを手本にすることです。
流れは、こんな感じ。

* **理解する**　
* **アレンジする**
* **もっと長いスクリプトに挑戦する**

はじめは、一行ずつ丁寧に理解していきますが、だんだん慣れてくればスピードが上がって読み流せるようになります。また、このとき分からないことがあれば即座に調べるのが重要です。これがよい復習になります。

:::note
コメントを読む、print()といった出力を用いて変数の中身を確認する、なども理解につながります
:::

コードが理解できたら、元のコードを少し変えてみたり新たにコードを追加したりして動きを試してみます。思った通りの動きができると楽しいです。
慣れてきたらもっと長いスクリプトに挑戦してみましょう。自分で一から作ってみるのも大変勉強になります。

## フレーズ
おまけです。
いくつもコードを読むと、同じような箇所が多くあることに気づくと思います。それがフレーズです。例えば、「〜キーが押されたら」や「音を鳴らす」など。
よく出てくるフレーズを覚えておけば、次に出てきた時にとっても楽です。保存しておけばコピペして使うこともできます。

# 終わりに
プログラミングってどう勉強してるの？と何度か聞かれたことがありましたが、上手く答えられずにいました。
外国語学習とほぼ一緒という気づきで説明がわかりやすくなっていればと期待しています。

長い文章を最後までお読みいただき、ありがとうございました！

X（旧Twitter）もやっています。よろしければフォローお願いします。

https://twitter.com/ham24701293
資格がなくては面接にすらたどり着けない今日この頃。

## まだ資格持ってません
職業訓練校の授業が進むほどにふくらむ興味や妄想。

求人をみては **「オモシロソー！！！！」** が増えること増えること

裏腹に興味のある求人に応募しては、数日後にお祈りメールをいただくこと数回

これはやはり資格を取らなくては、門前払いである。

悲しいかな **「未経験可」**  は「ただし若者に限る」がついているのかもしれない。

もしかしたら、40代×未経験ってだけで職業訓練校に通っているところまで読んでもらえていない可能性もある。

年齢が足かせになるのは残念であるが人間社会においては、そうゆうもんらしい。

チンパンジーは経験を多く持っている年齢を重ねたメスの方がモテるんだけどな

「積極的に面接をします」
「nn人採用します」
「未経験OK」

そんな求人に応募しているんだけど
まだ面接にたどり着けないのは、エントリー時の情あまねの報を見ても
面接したくなるほどのものがないんだよな

まだ数社だけど、PDCAを回しまくって
がんがん方向転換や優先順位の入れ替えをしていきたい

## だったら資格を取ろうじゃないか
職業訓練校に通っている以上、資格は何かしら取るんだけど
じゃあなんの資格を取るんだい？というのが問題である。

これに関しては、ネットのブログ、YouTube、Xなどなどでいろいろ調べた結果

最初に取ろうと思っていたITパスポートが就職にはまったく役に立たないと知ったので
Oracle Java Bronzeの優先順位を上げることにした

しかしながら、いかんせんOracleの試験はお高いのだ。
無職には14,630円(税込み)は清水の舞台から飛び降りるが如くである。

とりあえず、通称：紫本
『Java プログラマ Bronze SE』を購入した。

これまでの人生でハンズオンでなんとか乗り切ってきた、あまねとしては
テキストを使った座学は難関であるが、面接にたどり着きたいのでここが正念場である。

Oracle Java Bronzeが年齢を凌駕するほどのインパクトがあるかは不明だけど
もうやるしかない。

基本情報も気になるから、Oracle Java Bronzeのあとに受験するか考えようと思う。

そうなると、必然的にQiitaでも受験と就活のお話が中心になってくると思われるが、ポートフォリオを作るので、その辺のことも書いていこうかな。

## まとめ
2本目の投稿となりましたが
最後まで読んでいただきありがとうございます。

また、最初の投稿で、いいねやフォローをしていただいた方ありがとうございます。
記事を更新するはげみになりました。

技術的なことを発信できるようになるといいな。
Azure VM と ブート診断用のストレージ アカウントってバックボーン通信だっけ？

こんにちは、アーキテクトのやまぱんです。

補足コメントや質問、<font color="red">**いいね、拡散**</font>、是非お願いします🥺！
間違ってたら<font color="red">**優しく**</font>教えてください！

## モチベ
いまさらながらですが、**「ブート診断用のストレージ アカウントってバックボーン通信だっけ？」**、具体的には **「ストレージ アカウントのネットワークアクセスをパブリックアクセスにしてなくても、パブリックアクセスを無効にしていても使えるんだっけ？」** という話があって検証してみました。

## 結論
結論からいうと<font color="red">　ストレージ アカウントのパブリックアクセスを無効にしてもブート診断に使えます</font>、つまり Azure 基盤側・バックボーン(コントロールプレーン)で処理されます。

**ここでお話はおわりです。はい、以下はおまけです。**

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


## 具体的にどのへんの話？
### ドキュメント
ドキュメントは以下です。

+ Azure のブート診断

https://learn.microsoft.com/ja-jp/azure/virtual-machines/boot-diagnostics


Azure VM 作成の部分だと下記の画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/1dfd89dd-0c94-1452-0f60-a52149b84b5c.png)


### ストレージ アカウント
ストレージ アカウントのネットワークアクセスで言えばこのへんです。
ここを、**「パブリックアクセスを無効にし、プライベートアクセスを使用する」** にしてもストレージ アカウントが使えるか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/5593f524-1719-74ad-efad-d9c2faca290a.png)


## メモ的なエビデンス
それぞれ下記のようなファイルが入ってます

```
pubvm.065d4566-7b64-4e2e-bcf4-ded5c65d70e9.serialconsole.log
pubvm.065d4566-7b64-4e2e-bcf4-ded5c65d70e9.serialconsole.bmp
```
bmp ファイルの内容は以下のような画面ショットです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/39790cb7-c687-34fc-4ed3-cf3229242f73.png)


### Public アクセス ストレージ アカウント

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/976042fc-4e73-4550-7900-a04ffaffaafd.png)

### private アクセス ストレージ アカウント

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/c1002121-da90-6477-2a92-fcbd91b91910.png)
【TouchDesigner】Rayの接触判定がParticleに効かない場合の原因と解決法

### はじめに
こんにちは。MEMEMIYAです。
大学3年生になりました。時が過ぎるのは早いですね。

4月になったので何か春らしい映像でも作ろうかと思い、TouchDesignerを使って、マウスの動きに連動して水面に波紋が広がり、桜の花びらが揺れ動くインタラクティブな映像作品を作ろうとしていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3644489/e319ac33-eeaa-8573-c974-02e945b1a3ac.png)
↑制作途中の水に桜の花びらが浮かんでいるプロジェクト(趣味かつ個人で作っているもの)

まずは桜の花びらがかき混ぜられるような機能を付けようと考えていたのですが、途中で問題が発生しました。

プロジェクトを作成していく途中ではきちんとマウスの動きに反応していたものの、気が付くと何の反応も示さなくなってしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3644489/2dfeff98-690e-f3d5-187f-0a9985df190a.png)
↑反応していた頃の様子

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3644489/e5d0a765-eb6f-0b34-0b7e-89dc66491ade.png)
↑どれだけマウスを動かしても反応しなくなりました

怪しいOPのパラメーターを調整してみたり、ネット上の情報も参考にしてみましたが、原因特定には至りませんでした。そこで、Backupフォルダから過去の.toeを開いて一つずつ置きかえていきました。

* * *
### 結論
パーティクル発生源がGridである場合は、RowsもしくはColumnsのどちらか(もしくは両方?)の値が1になってると今回のような不具合が発生する。

* * *
### 対処法
2以上にすれば解決することが分かりました。
そもそもRowsが1だとMesh(Mesh設定にしていました)として成立していないので当然と言えば当然でした。

加えて、よく見てみるとViewの表示も違っていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3644489/493ac85c-3744-a327-6b6d-9bea6094a18e.png)
↑Rowsの値が1の方

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3644489/b26e4177-9cfb-f426-7d2c-a628b89157d9.png)
↑正しい方

* * *
### おわりに
Particle SOPとRay SOPは関係ありませんでした。

* * *
### ひとこと
2024年4月6日現在、Claude.aiはTouchDesignerについてあまり詳しくないようなので、備忘録としてこの記事を書きました。ゆくゆくは詳しくなると良いですね……！
Globally Coupled Mapの時系列データをCSVファイルに保存する

### Step0. 使用するパッケージ
~~~python:
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot') #グラフのスタイル
plt.rcParams['figure.figsize'] = [8, 3] # グラフサイズ設定
plt.rcParams['font.size'] = 10 #フォントサイズ
import random
import pandas as pd
import csv
import warnings
warnings.simplefilter('ignore')
~~~

### Step1. 写像を定義
~~~python:写像を定義
def f(x, alpha):
	y = 1 - alpha*x*x
	return y

def coupled_f(x_list, alpha, e):
	total = 0
	y_list = []
	num = len(x_list)

	for n in range(num):
		total += f(x_list[n], alpha)
	for n in range(num):
		y_list.append((1 - e) * f(x_list[n], alpha) + (e / num) * total)
	return y_list
~~~

### Step2. 時系列を生成
~~~python:時系列を生成
def series(alpha, e, initial, length, trans_period):
	num_coupled = len(initial)  # 結合数
	x_list = [n + trans_period for n in range(length)]
	y_list = []

	for n in range(num_coupled):
		y_list.append([initial[n]])
	length -= 1
	for n1 in range(length + trans_period):
		pre_y_list = []
		for n2 in range(len(initial)):
			pre_y_list.append(y_list[n2][n1])

		after_y_list = coupled_f(pre_y_list, alpha, e)
		for n2 in range(len(initial)):
			y_list[n2].append(after_y_list[n2])

	for n1 in range(num_coupled):
		y_list[n1] = y_list[n1][trans_period:]
	return x_list, np.transpose(y_list)
~~~

### Step3. CSVファイルに書き込み
~~~python:CSVファイルに保存
data = []

for sublist1, sublist2 in zip(x_list, y_list):
  data.append([sublist1] + sublist2.tolist())

header = ["index"]
for n in range(len(y_list[0])):
  header.append("Element_{}".format(n))
# CSVファイルに書き込む
with open('data_set.csv', 'w', newline='') as csvfile:  # 'w'は書き込みモード、newline=''は改行コードを指定
  csv_writer = csv.writer(csvfile)
  csv_writer.writerow(header)  # ヘッダーを書き込む
  csv_writer.writerows(data)  # データを書き込む
~~~

~~~python:読み込んでプロット
dataset = "data_set.csv"
df = pd.read_csv(
  dataset,
  parse_dates=True,
  index_col="index"
)
print(df)
df.plot()
plt.show()
~~~

~~~:実行結果
       Element_0  Element_1  Element_2
index                                 
1000    0.922458  -0.007941   0.922458
1001   -0.270728   0.818381  -0.270728
1002    0.819108   0.055648   0.819108
1003   -0.002265   0.852572  -0.002265
1004    0.922458  -0.007941   0.922458

...
1026    0.819108   0.055648   0.819108
1027   -0.002265   0.852572  -0.002265
1028    0.922458  -0.007941   0.922458
1029   -0.270728   0.818381  -0.270728
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127285/6f5715b4-b66d-0954-64e7-0a9a3e6542f3.png)

#### Appendix. パッケージ化したものをGithubに公開しました．
https://github.com/Kojiwada-math-hokkaido/myapp
#10 換算アプリ

今回の開発のインスピレーションは、6月に日本に引っ越す予定の私の経験から来ています。家を探す過程で、日本の物件のサイズの単位が台湾人と異なることに気付きました。そこで、このテーマを中心に開発を進めることにしました。

機能紹介

目標はシンプルで明確です。ユーザーが数値を入力するだけで、他の2つの単位への変換結果を迅速に得られる直感的なインターフェースを提供します。アプリには3つの主要機能が含まれており、それぞれ異なる面積の単位の変換に対応しています。

    畳の変換：ユーザーが畳の数を入力すると、アプリが対応する坪数と平方メートル数を計算して表示します。

    平方メートルの変換：ユーザーが平方メートル数を入力すると、アプリが対応する坪数と畳数を計算して表示します。
    
    坪の変換：ユーザーが坪数を入力すると、アプリが対応する畳数と平方メートル数を計算して表示します。

![１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3703986/5f0ec994-f351-5e1e-a67b-13d3426a39ca.png)

![１.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3703986/20f24437-f9d3-5141-c9b6-c573877a2bb0.gif)

ユーザー入力の安全な処理

開発過程での主要な技術的な挑戦の一つは、ユーザーの入力を安全かつ効率的に処理する方法でした。ユーザーは何でも入力する可能性があるため、数字以外や空の文字列を含むことがあります。ここで、クラスで学んだif let機能を活用しました。これは、Swift言語でオプショナル（Optional）値を処理する方法の一つで、変数に確定値がある場合にのみ操作を行うのに役立ちます。

畳の数を変換する例では、ユーザーがUITextFieldから値を入力し、「計算」ボタンを押してcalculateメソッドをトリガーします。この時、if let構造を使用してテキストフィールドの内容をDouble型に変換しようと試み、その値が0より大きいことを確認します。これらの条件がすべて満たされた場合にのみ、変換プロセスが進行します。

```
@IBAction func calculate(_ sender: UIButton) {
    if let tatamiText = tatami.text, let tatamiValue = Double(tatamiText), tatamiValue > 0 {
        // 入力値を正常に変換し、結果を計算...
    } else {
        result.text = "0より大きい数字を入力してください" // ユーザーに有効な数字の入力を促す
    }
}
```

https://github.com/liyoway/AreaConvert?source=post_page-----0e0dc74e663c--------------------------------
xamppのDocumentRootを変更する3ステップ【Windows】

# 1. ApacheのConfigのhttp.confを押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/87128815-9d50-379a-5a7d-d59c27053612.png)

# 2. DocumentRoot と Directory を書き換える(すべて置換)

`C:/xampp/htdocs` → `C:/Users/john/Downloads/test`

`C:/Users/john/Downloads/test`は設定したいDocumentRoot

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/12e4476e-beac-00bd-490d-a46a93c5ac7f.png)

Directoryも書き換える理由は、アクセスできるファイル権限とかも許可したいから
DirectoryIndexはデフォルトで有効

# 3. 保存する( Ctrl + S )