OmniAICreator/Qiita-1.07M huggingface dataset:
AWS クラウドプラクティショナー受験記録


昨年、AWS認定クラウドプラクティショナーに合格しました。
![スクリーンショット 2023-01-10 22.38.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691862/706a44d8-9c54-d0dd-6189-fad16dc982cb.png)

かなり時間が経ってしまいましたが、勉強開始〜受験までを記録に残そうと思います。
筆者は未経験入社の3年目です。AWS実務経験も無し。

# 受験動機

・~~資格手当ほしい~~
・新卒研修時に触れてたこと（EC2構築、S3の使用くらい）
・実務で触れる機会が出来たとき用に最低限の知識がほしい
~~・AWS分かってたらちょっとカッコいい~~

'22/7月ごろに受験を決め、業務や予定との兼ね合いで受験日を9/3に決めて申し込みました。


# 使用テキスト

[AWS認定資格 クラウドプラクティショナーの教科書: 合格へ導く虎の巻 CloudTech制作委員会シリーズ Kindle版](https://www.amazon.co.jp/gp/product/B0B1HXPSH8/ref=ppx_yo_dt_b_d_asin_title_o05?ie=UTF8&psc=1)
Kindleなので、どこでも気軽に見ることができて重宝しました。
2ヶ月ほどで3周強したかと思います。

[この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集](https://www.udemy.com/course/aws-4260/)
模擬試験／問題はほぼこれのみを使用していました。
応用レベルは全く行わず、基本レベルと本番レベルのみ取り組みました。
基本を5回、本番を3回ずつ解いて最終的には90％／70％強の正答率でした。
分からなかった問題・覚えてない単語をKindleや後述する単語帳で確認したり、自分でもテキストにメモ書きして覚えてました。

[AWS Skill Builder](https://explore.skillbuilder.aws/learn)
問題数が少ないですが、AWS公式の問題集があったのでやりました。（20問ほど）
Udemyの模擬試験のみでも十分だったかな？とは思います。

[AWS単語帳](https://qiita.com/hy_working/items/f537a21b27ad6f772149)
覚えてないサービス等、空き時間によく見ていました。

# その後

残念ながらまだ実務で触れる機会はないのですが、
社内でのAWSに関する発表等が以前よりよく分かって聞くことが出来てちょっとは身についたな〜と実感しております。
まだ知識が残っているうちにSAA取得にも動いて、いつか実務で触れられる機会を狙っていきます。
3次元点群が平面を構成しているか把握する方法

## 背景
3次元点群が平面を構成しているか(直線上に並んでいないか)を検出したいときがあったので、手法などをこちらにまとめました。直線上に並んでいて、平面を構成できていない下画像のようなものを検出するのが目的です。
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663246/bcf822a7-d795-ab0d-7342-9d2e0b7162d5.png)

## 手法
[こちら](https://www.ltu.se/cms_fs/1.51590!/svd-fitting.pdf)のAlgorithm 3.1のやり方をベースにやってみました。特異値分解することにより、x, y, z方向の散らばり具合を求めて、値が大きい2つの値の比を求めることにより、平面を構成しているか確認しました。主成分分析の[資料](http://www.sanko-shoko.net/note.php?id=cv7g)も参考になりました。

### 1. 3次元点群の中心を求める
```math
c=\frac{1}{n}\sum_{i=1}^{n}p_i
```

### 2. 元の点群から中心を引いた行列を作る
```math
A = [p1 − c, . . . , pn − c]
```

### 3. 行列Aを特異値分解する
```math
U S V ^{T} = A
```

### 4. 特異値のS[0], S[1]の比を算出して、閾値より大きいかチェックする
散らばり具合が大きい軸の値からS[0], S[1], S[2]と並ぶので、S[0]がS[1]より極めて大きい場合は、点群が直線上に並んでいる可能性が高いです。
```math
ratio = S[0] / S[1]
```

## 実装
詳細は省きますが、Pythonであれば、numpyのlinalg.svdを使えば特異値分解は簡単にできます。S[0]/S[1]の値の閾値に関しては、今は40より大きい場合は平面を構成していないとみなすようにしています。この値は、実際のデータで実験しながら決めていくといいと思います。S[1]の値が0になる可能性もあるので、注意してください。

## 参考資料
- [Using SVD for some fitting problems](https://www.ltu.se/cms_fs/1.51590!/svd-fitting.pdf)
- [主成分分析](http://www.sanko-shoko.net/note.php?id=cv7g)
Kivy と Python で電卓を作る2：設計

# Kivy と  Python で電卓（ダサい）を作る:方針

前回に続き, 実装方針を考える.  
人は Kivy で電卓を作りたがる修正があるらしく, 他にも数件の記事を見かけた.
* [Python Kivyの使い方②　～電卓を作成する～](https://qiita.com/dario_okazaki/items/910abf09344a60dd7823)
* [Python GUI kivyで電卓を作ってみる](https://medium.com/@hokan_dev/python-gui-kivy%E3%81%A7%E9%9B%BB%E5%8D%93%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B-c32d64de1a99)

見直してみるとそれぞれに違って面白い.

## 目次
[Kivy と Python で電卓を作る:概要](https://qiita.com/ShrikeWasHere/items/07c879b4485a612eee33)  
[Kivy と Python で電卓を作る:方針]() ←イマココ  
[Kivy と Python で電卓を作る:基本部分の作成]()  
[Kivy と Python で電卓を作る:電卓機能の追加]()

## 2. 基本的な方針

### 2-1. 数値入力の受け取り

**入力を文字列として保存, 計算前に数値に変換し計算**を基本方針とする. 
```
1 の入力
input_num.append('1')
2 の入力
input_num.append('2')
``` 
例えば, 12 + 16 = 28 という計算を行うときは

1. '12' の入力（文字列A）
2. 演算子入力
3. '16' の入力（文字列B）
4. = の入力（文字列A, B を数値に変換し計算結果を表示)

のような流れで計算が進んでゆく.  
数値で入力を受け取っても良いのだけれど,
```
1 の入力
input_num = 1
2 の入力
input_num = 1 × 10 + 2
```
少数とか入力の削除とかがあると大変なので...

### 2-2. 電源の ON, OFF と状態変化

電源の ON, OFF を実装する.  
方法自体は何通りかありそうだが, 今回は
```
from transitions import Machine
```
で使えるパッケージ 'transitions'を使って実装してみる.  
transitions の詳細については  
[Pythonで状態遷移(transitions)](https://qiita.com/noca/items/f7ffd4acc641a809ac67) に詳しく書かれている.  

#### 2-2-1. 状態変化一覧

* OFF：電源が切れている状態. AC 二回押しで InputNum 状態に遷移
* InputNum：最初の数値入力. AC 二回押しで OFF

正直, 何も transition 使わなくっても良い気が...  

### 2-3. 計算関連

1. input_num (名前変えるかも) で数字を受け取る

* 最初に数字ボタンが押された時, 元の input_num の数字は削除, それ以外なら追加

2. 演算子ボタン (+, -, ×, ÷) が押された場合は input_num を数値変換して保持
3. = が押された時は input_num を数値変換して計算する. 

* 演算子入力がない場合は, 計算を行わない. 

これで電卓の基本機能は考えられた（気がする)  

### 3. 次回予告
ボタンの作成と簡単なレイアウトを実装する.  
前回：[Kivy と Python で電卓を作る1：概要](https://qiita.com/ShrikeWasHere/items/07c879b4485a612eee33)
次回：[# Kivy と Python で電卓を作る3：基本部分の作成](https://qiita.com/ShrikeWasHere/items/a15588b3ac91a53a1eaf)
情報システム部門の役割

1. 情報システムの位置づけ
　　経営活動の支援ツールが情報システムの位置づけ。情報システムを作ること自体は目的ではない。
　　経営活動に寄与することが目的である。

2. メインフレーム・オープン化の意味
■メインフレーム：汎用機とも。企業の基幹業務システム等に利用される大型コンピュータシステム。特徴は電源やCPU、記憶装置等のハードウェアが多重化され、並列処理による処理性能や耐障害性が高いこと。

※CPU：コンピュータの主要な構成要素の１つ。他の装置、回路の制御やデータ演算等を行う装置。演算装置と制御装置を統合したもの。

※記憶装置：データやプログラムの保存・記憶を行うための装置。CPU内部の半導体メモリ、メインメモリ、ストレージ等に分類される。

■オープン化：ハードウェア規格やソフトウェア仕様を公開すること。

3.　データと情報の違い
データは分析後に情報を引き出すために使用される未分析、未整理、中断のない資料。数字、記号など。
情報はデータに乗っている数字や記号から部分的に収集、加工したものであり、データに意味を与える。

4．BPRとは：Business Process Reengineering：既存業務の構造を抜本的に見直し業務プロセスを最適化すること。業務の見直しと同時に利用されるシステムの刷新も必要となる。

5．情報システムの要件
■機能要件：要件定義の中で「実装する機能」に関する要件、クライアントが必要とする機能のこと。
■非機能要件：システムの性能など「実装する機能以外」に関する要件。

6．情報システムの品質とは
■本来備わっている特性の集まりが、要求事項を満たす程度
■システム・コンポーネント・プロセスが指定された要求を満たしている度合い
■システム・コンポーネント・プロセスが顧客・ユーザーのニーズを満たしている度合い

7．システム開発の流れ
■企画工程、要件定義
組織の戦略に基づき、情報システム化計画を立案。業務に対する要件を把握したうえで、システム化への要求仕様を決める。

■設計工程
計画工程の構想に基づき、実現するシステムの設計を行う。

■製造工程
設計内容に従い、必要なプログラムを作成する。

■テスト工程
作成したプログラムが、仕様通りに動作するかを確認する。

■運用・保守工程
テストにより安定的な稼働が確認出来たら、実際の運用を開始する。
必要に応じシステムの保守・改善を行う。

8．情報システム部門の役割
■情報システムの稼働を維持する：システム状態を監視し、障害発生時の復旧を行う。
                                
■業務上の要望に応える：業務効率化のためのシステムを企画し、開発・保守する。

■システムの全体最適を図る：部分最適化された業務プロセス・情報システムを全体最適化し重複業務の削減やシステム運用コストの低減につなげる。

■ICT導入により業務改善、改革をする：新規事業立ち上げや業務プロセス改善には情報システムが不可欠であるため、ビジネスモデルや業務プロセス改革の推進を担うことが情報システム部門に期待される。

9．情報システム部門とステークホルダー
情報化施策には様々なステークホルダー（利害関係者）が存在する。

■経営層：事業計画の実現

■利用部門：新規事業立ち上げ、既存業務効率化

■情報システム部門：情報システム施策の実現可能性

■外部ベンダー：システム開発・運用の受託

10．パッケージ・サービスを利用した開発
既存の製品を使い新規業務とのギャップを埋めるシステムの進め方としてパッケージ・サービス適用の開発がある。
既存製品を使わず新規で開発することをスクラッチ開発という。
Kivy と Python で電卓を作る1：概要

Python, Kivy, 関連するパッケージの勉強とアウトプットの練習を兼ねて, Python と Kivy で電卓を作ってみる. 今回は導入編.

## 1. 今回の目標

Kivy と Python を使って簡単な電卓を作る.  
今回の目標は下画像のように基本的な入力と計算・出力ができるものを作成すること.  

後々, 見た目を変更する（未定）


### 要件

* 計算関連
    * 四則演算ができる（当然）
    * 少数も入力・計算ができる
    * 0 での割り算にはエラー表示
    * 表示は10桁まで10桁を超えた場合は OF を表示
* 入力関連
    * 数字を入力せずいきなり演算子を入力することはできない
    * 001 のような入力はできない
    * del ボタンで最後に入力した数字を消去できる（123 は 12 に変化）
    * AC ボタンを1回押しで入力数値リセット, 2回押しで電源OFF
    * 電源OFF 状態では AC ボタン以外の入力を受け付けない

こんなところかな？　必要に応じて追加・削除をおこなってゆく  
（注：仕様を適宜, 追加・削除するのは良い開発法ではありませんね）

## 2. 使うもの

1. Mac Mini(M1, 2020) macOS Monterey 12.4
2. LG HDR 4K ディスプレイ(3840 × 2160)
3. Python 3.6.13
4. Kivy 2.0.0

## 3. 次回予告

実装方針を考える.
## 4. 目次
[Kivy と Python で電卓を作る:概要](https://qiita.com/ShrikeWasHere/items/07c879b4485a612eee33) ←イマココ  
[Kivy と Python で電卓を作る:方針](https://qiita.com/ShrikeWasHere/items/b45d8ebb7ed23600f45c)  
[Kivy と Python で電卓を作る:基本部分の作成](https://qiita.com/ShrikeWasHere/items/a15588b3ac91a53a1eaf)  
[Kivy と Python で電卓を作る:電卓機能の追加]()
SwiftUIを触ってみた

　Storyboardでの開発に挫折して以来Swiftを全く触っていないが、最近作りたいスマホアプリができたのでSwiftUIで再挑戦しようと思いたちました。ということで早速Xcodeを最新版(Version 14.2)にしてやってみました。

# 今回の目標
タップして1〜10の間の数字を0.05s間隔でランダム表示させて、もう一度タップすると一時停止するプログラムを作成

# プロジェクトを作成する
welcome画面で"Create a new Xcode project"を選び、iOSSのAppでNext、InterfaceでSwiftUIにしてプロジェクトの置き場を決めたらCreateでプロジェクトが作られます。

# 外観をつくる
ContentViewファイルを開きます。
VStackでアイテムを縦に並べることができるので、テキストと円を追加していきます。
```swift
struct ContentView: View {
    @State var disp_num = Int.random(in: 1...10)
    var body: some View {
        VStack {
            Text("\(disp_num)")
                .font(.system(size: 250, weight: .black))
                .padding(-1)
            Circle()
                .foregroundColor(.red)
                .frame(width: 300, height: 300)
        }
    }
}
```
プレビュー画面はこうなります。ここまでが早い。
![view.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/845709/dc4ca5e1-9d23-55d8-094f-ee610e438bc6.png)

# ボタンを押したときにフラグを立てる
円をボタンのように動作させるのにフラグの用意した。
```swift
@State var flag = false
```
Circle()に下記を追加
```swift
.onTapGesture {
    self.flag = !flag
}
```
# フラグが立った時に数字をランダム表示
[こちらの記事](https://dev.classmethod.jp/articles/operation-love/)を参考にTimerを使用します。
```swift
private let timer = Timer.publish(every: 0.05, on: .main, in: .default).autoconnect()
```
お作法などは一切分かりませんが、今回はテキストを変えたいのでわかりやすくText()に下記追加します。
```swift
.onReceive(timer) { _ in
    if (flag) {
        disp_num = Int.random(in: 1...10)
    }                
}
```

以上！終わり！

# 感想
　GUIの開発はProcessingでちょこっとだけの経験値しかない筆者にとって結構馴染みやすいなと感じました。今度こそ挫折せずに何かしらのそれっぽいものを作りたいです。  

　一応完成したソースコードも載せておきます。
```swift
import SwiftUI

struct ContentView: View {
    @State var disp_num = Int.random(in: 1...10)
    @State var flag = false
    private let timer = Timer.publish(every: 0.05, on: .main, in: .default).autoconnect()

    var body: some View {
        VStack {
            Text("\(disp_num)")
                .font(.system(size: 250, weight: .black))
                .padding(-1)
                .onReceive(timer) { _ in
                    if (flag) {
                        disp_num = Int.random(in: 1...10)
                    }
                }
            Circle()
                .foregroundColor(.red)
                .frame(width: 300, height: 300)
                .onTapGesture {
                    self.flag = !flag
                }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
```
TypeScript: オブジェクトから動的に別オブジェクトを生成する

# 背景
DynamoDB の更新式を動的に作りたい、という目的からまずは

- 引数から動的オブジェクトの生成を

という課題を解決することに

# 結論

```typescript: 作成例
import _, { keyBy } from "lodash";

const createUpdatingFormula = async (content: any) => {
    let mergeData = {};
    Object.keys(content).forEach((k) => {
        if (typeof content[k] == "object") {
            // 再帰処理へ
        } else {
            console.log("k", k);
            let keyName = `#${k}`;
            mergeData = _.merge(mergeData, {
                ExpressionAttributeNames: {
                    [`#${k}`]: k
                },
                ExpressionAttributeValues: {
                    [`:${k}`]: content[k]
                }
            });
        }
    })
    console.log(mergeData);
}
const item = {
    age: 33, name: "hoge", items: {
        Key: "hoge",
        Value: 15,
    }
};
createUpdatingFormula(item);
```
結果はこんな感じ
```json: 結果例
{
  ExpressionAttributeNames: { '#age': 'age', '#name': 'name' },
  ExpressionAttributeValues: { ':age': 33, ':name': 'hoge' }
}
```

# 説明
## Object.keys/entries 
これを使って、オブジェクトのキーを取得して作成していく
オブジェクトが内部にある場合は、typeof で型取得をして再帰するしかなさそう・・（とりあえず今はパス
```typescript: Object.keys でキー一覧
[ 'age', 'name', 'items' ]
```
```typescript: Object.entries で要素一覧
[
  [ 'age', 33 ],
  [ 'name', 'hoge' ],
  [ 'items', { Key: 'hoge', Value: 15 } ]
]
```

## computed property で、プロパティを動的定義
"#column" や ":column" という名称でのプロパティ定義は、これを使って定義していく

```typescript: 更新式の動的定義
ExpressionAttributeNames: {
    [`#${k}`]: k
},
```

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-9.html

## _.merge() で、結合
存在しているプロパティをすべて結合していけば完了
```typescript: 結合
mergeData = _.merge(mergeData, {
    ExpressionAttributeNames: {
        [`#${k}`]: k
    },
    ExpressionAttributeValues: {
        [`:${k}`]: content[k]
    }
});
```

# 失敗の記録
## TypescriptParser は静的解析
当初、オブジェクト解析と考えて、TypescriptParser を試行したら・・
Class等の静的解析用だった・・。いつか使うこともあるだろう、Roslyn みたいに・・
```typescript: parser
const parser = new TypescriptParser();
const parsedCode = await parser.parseFile('./lib.ts', '');

const parsedSource = await parser.parseSource(`class Person {
    // クラスの型宣言
    name: string
    age: number
    // constructorの引数に型宣言
    constructor(name: string, age: number) {
      this.name = name
      this.age = age
    }
  }
  `);
 console.log(parsedSource);
```
parseFile の第二引数は、内部で、path.relative() で第一引数を補完している

# あとがき
再帰処理も頑張るか・・・どうか・・
まずは必要かを検討してこよう
GitHubCopilotライクな無料で使えるAIコード生成のVSCode拡張を見つけた

# GitHubCopilotライクな無料で使えるAIコード生成のVSCode拡張を見つけた


## その名も。。。
[CodeGeeX](https://marketplace.visualstudio.com/items?itemName=aminer.codegeex)

>その公式ドキュメントによると、「CodeGeeX は、20 を超えるプログラミング言語の大規模なコード コーパスで事前トレーニングされた 130 億のパラメーターを備えた大規模な多言語コード生成モデルです」。簡単に言えば、CodeGeeX は人工知能を利用したコード生成ツールであり、コードの記述を高速化するのに役立ちます。

らしい。

## 生成サンプル


~~カットセンテンスとは。。。~~
![test2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911989/bc5c4f81-423d-4cd5-b8a2-f456f7532056.png)


~~掛け算嫌いで、ループ好き？~~
![test1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911989/5539335a-a03e-bb23-2ea0-9707822ed511.png)



## この記事で見つけた
https://blog.logrocket.com/using-codegeex-github-copilot-alternative/

## 終わりに
もう少し使ってみよーと思います
Array to XML

ググってもXML to Arrayの記事は多いけどArray to XML があんまり少ない気したので。
- simpleXMLのaddChildメソッドを使いました。
- 配列の中身をforeachでぶん回しながらノードに子要素を追加してく的な感じで、keyをXML要素名としていきます。
- 取り出した配列の値が配列の場合は、再帰して、これで多次元配列に対応

```
    public static function array_to_xml(array $target_array, SimpleXMLElement $xml)
    {
        foreach ($target_array as $key => $value) {
            if(is_array($value)) {
                self::array_to_xml($value, $xml->addChild($key));
            } else {
                $xml->addChild($key, $value);
            }
        }
        return $xml->asXML();
    }

//実行例
//array_to_xml($sample_array, new SimpleXMLElement('<root/>'));
}
```
- ※毎回呼び出す時にsimpleXMLのオブジェクト生成して引数に渡す必要があるのはこれちょっとセンスないかなと思うのですが、よしなに
- 今時jsonでええやんって感じですが
.ipynbファイル(jupyter notebook)が重くて開けない

## 問題　

.ipynbファイルが重くて開けなくなった。(250MB)

## 対処法
外部からセルの出力量を減らし、メモリ使用を減らすことで開けるようになりました。

```
pip install nbclean
input_file = "./hoge.ipynb"
output_file = "./hoge_out.ipynb"

cleaner = nbclean.clean.NotebookCleaner(input_file))
cleaner.clear("output")
cleaner.save(output_file)
```

上記を.pyファイルで作成し、python hoge.py で実行すると、出力がなくなったoutputファイルが作成され、開けるようになりました。
[高校数学] 集合理論・命題と条件

明日あるIT企業の２次試験で数学を解かないといけないので、ノー勉で行くか迷った挙句とりあえずちょっとは勉強することにしたので記事化。


<h2>集合</h2>

<h3>集合で用いられる記号一覧</h3>

<h5>要素 ∈</h5>
AがBの要素であるとき、A∈Bと表す。
<h5>部分集合  ⊂</h5>
AがBの部分集合であるとき、A⊂Bと表す。
<h5>共通 ∩</h5>
AとBが共通であるとき、A∩Bと表す。
ここでいう共通とは、集合AとBがあったとき、そのどちらにも含まれている部分のことである。
<h5>和集合 ∪</h5>
AとBどちらかに面している部分。
<h5>空集合 ⦶</h5>
一つも要素を持たない集合のこと。
共通している範囲がない集合AとBがの共通を求められたときなどに、A∩B=⦶ と表す。
<h5>補集合 ¯</h5>
否定を示す。
Aの部分以外　を示すとき、A¯(表示上このようになっているが、実際には文字の上に「¯」がある。

集合の問題に関しては、基本的なこれらを押さえておけば応用が効くだろうと予想。


<h2>命題と条件</h2>

集合理論については基本情報技術者試験や応用情報技術者試験でも学習するのであまり学習は必要ないが、命題と条件については学ぶ必要があるとみた。

必要条件と十分条件を混同してしまいがちなので、記憶用に書いていく。

必要条件と十分条件の基本的な構造はこれだ。

<h5>二つの条件p,qにおいて、pならばqが真であるとき、qはpであるための必要条件であり、pはqであるための十分条件である。</h5>

もうちょっと深く考えてみる。


なぜ、「必要」条件なのか？


①pならばq　というのは、簡単にいうとpであればqであることは確定ということ。
②では、pであるためにはどうすればいいか？
③pであるためには、qであればよい。
④だから、qはpであるための「必要」条件となる。

これは具体的に考えたほうがわかりやすい。

<h5>例1.</h5>

命題:  x=10  ならば  x>2。

x>2はx=10であるための必要条件である。
なぜなら、x>2でなければx=10になることは絶対にあり得ないからだ。

<h5>例2.</h5>

命題:  x=15  ならば  xは奇数。


「xは奇数」はx=15であるための必要条件である。
なぜなら、xが偶数だった場合、x=15になることは絶対にあり得ないからだ。




視点を変えて十分条件について考えてみる。



なぜ、「十分」条件なのか？




①pならばq　というのは、簡単にいうとpであればqであることは確定ということ。
②すなわち、qであることを証明するために、pであれば十分。
③だから、pはqであるための「十分」条件となる。



もう一度例１に戻って考えてみる。


例1.

命題:  x=10  ならば  x>2。

x=10はx>2であるための十分条件である。
なぜなら、x=10という時点で、xは2より大きいからである。


<h4>必要十分条件</h4>


必要十分条件は簡単だ。



pならばq、qならばpがどちらも真だった場合、
qはpであるための必要十分条件であり、pはqであるための必要十分条件である。


となる。



以上。本当はもっと書くつもりだったが、11時になりそうなので終了。
※毎晩寝る前の1時間は応用情報技術者の勉強と決めている




この記事について意見ありましたらコメント等ください。
また、Twitterもフォローよろしくお願いいたします。
React + TypeScript – 複数の型定義 UnionType を UseState / UseEffectで使う

# コード例

以下でコメントアウトで示した行のように未定義の文字を扱おうとするとエラーを起こしてくれる

```tsx
import React, { useState, useEffect } from 'react';

export const UnionType = () => {
  type ValueTypes = 'A' | 'B';

  const [value, setValue] = useState<ValueTypes>();

  const clickA = () => {
    setValue("A")
  }

  const clickB = () => {
    setValue("B")
  }

  // Error
  // const clickC = () => {
  //   setValue("C")
  // }

  useEffect(() => {
    switch (value) {
      case "A":
        console.log("is A")
        break
      case "B":
        console.log("is B")
        break
      // Error
      // case "C":
      //   console.log("is C")

    };
  });


  return (
    <div>
      <button onClick={clickA}>ClickA</button>
      <button onClick={clickB}>ClickB</button>
    </div>
  );

};

export default UnionType;
```

# 環境

- react@18.2.0
- next@13.1.1


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
Homebrew を使ってインストールしたライブラリを用いるコンパイル・ビルド（C++）

こんにちは。
Homebrew を使ってライブラリをインストールし、それを用いた c++14 ソースをコンパイル・ビルドしました。

ライブラリ（boost, zlib）を用いた場合の例です。

```console
$ brew install boost zlib
$ clang++ -std=c++14 -stdlib=libc++ -I/usr/local/include -L/usr/local/lib -lz -lboost_iostreams -o a.out main.cpp 
```

#### linuxbrew
linuxbrew の場合は、GCC（Homebrew を使ってインストールしたもの）を用い、同じソースをコンパイル・ビルドしました。

```console
$ brew install boost zlib gcc
$ g++-13 -v 2>&1 | grep "gcc version"
gcc version 13.1.0 (Homebrew GCC 13.1.0) 
$ export HOMEBREW_PREFIX=/home/linuxbrew/.linuxbrew
$ g++-13 -std=c++14 -I$HOMEBREW_PREFIX/include -L$HOMEBREW_PREFIX/lib -lz -lboost_iostreams -o a.out main.cpp  
```
AWS DataSyncとAzure File Sync 比較 ～AWS DataSync動作確認編～

AWS DataSync(以下、DataSync)と Azure File Sync(以下、File Sync)シリーズの5本目の記事です。
1本目は記事はこちら
[AWS DataSyncとAzure File Sync 比較 ～共通点と相違点～](https://qiita.com/hidekko/items/9610ef551999f6ea1f37)
2本目は記事はこちら
[AWS DataSyncとAzure File Sync 比較 ～前提条件定義編～](https://qiita.com/hidekko/items/45eab57f6c6088eb1607)
3本目は記事はこちら
[AWS DataSyncとAzure File Sync 比較 ～AWS DataSync構築事前準備編～](https://qiita.com/hidekko/items/8e7a3fb6494462926597)
4本目の記事はこちら
[AWS DataSyncとAzure File Sync 比較 ～AWS DataSync構築編～](https://qiita.com/hidekko/items/3c042c3ef159bd8e28fd)

今回はDataSyncの動作確認です。

# 動作確認
それではお待ちかねの動作確認ですが、動作確認時の構成図を掲載していなかったので追記しました。

## 構成図
以下の構成図の通りに構築して動作確認を行いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/fa070b78-350c-75a3-b5ee-5dd4737e4c1c.png)
<font color="Blue">青線で同期</font>を行い、<font color="Red">権限確認に必要なディスクマウントの処理は赤線</font>で行っています。

## 同期実行
[開始]をクリックして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/10c95355-7b41-5aef-4a0f-c80f97b7c7a8.png)
[デフォルトから開始する]をクリックすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/d8874a50-8284-19d6-69f8-67f0975f8a66.png)
以下のように[実行ステータス]が[起動中]になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/9b7873d7-e228-ab31-a86c-2291d337d82d.png)

## 異常系(権限が足りない場合)
[3本目の記事](https://qiita.com/hidekko/items/8e7a3fb6494462926597#%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E5%85%B1%E6%9C%89%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E5%85%B1%E6%9C%89%E3%81%A7everyone%E3%81%AE%E6%A8%A9%E9%99%90%E3%82%92%E4%BB%98%E4%B8%8E%E3%81%99%E3%82%8B)でも書いているEveryoneに対する権限追加を行っていないとこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/16ab9ad4-520f-93d4-f4b4-85936ef3c6bb.png)

## 正常系
実行ステータスが[成功]になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/5566a39b-05c5-6123-bf40-1800a859dd31.png)

## NTFSアクセス権確認
正常系の中でも肝心要のNTFSアクセス権はどうか確認します。

今回NTFSアクセス権でアクセス許可しているA_Divisionのユーザー、user01でアクセスしてみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/487b5d16-091b-092b-4ca5-772da998450e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/81d7e712-652c-d69d-e646-5e2d4e4d4134.png)
無事開けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/1c8153ea-1f47-27b6-4889-1c32c99179c0.png)
でもなんかよくわかんない、本来は隠しフォルダになってなきゃいけないものが見えてますね・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/29e4102e-1d60-7edb-10f0-0c5eb731fc59.png)
B_Divisionに所属するuser11でアクセスすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/e5460a05-1e6b-c423-4a40-63b39ee15d20.png)
ちゃんとアクセスできません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/79ec86d0-c3e2-2723-0eb3-5a83ddd766f1.png)

<font color="Orange">**完璧ですね！AWSさん！
良い動きです！
よくわかんないフォルダ見えてますけど！**</font>

AWSさんの環境は検証環境を維持するにもゴリゴリお金がかかっちゃうのでこれにて終了とします。
なんせ自腹なんでね。

今回は短いですがここまで。
【SwiftUI】NavigationBarの背景色を半透明にする方法

# はじめに
iOS標準メモアプリのNavigationBarって実は半透明なんですよ
今回はそれを再現します。

# 環境
- Xcode14.2
- iOS16.2

# UIBarAppearanceを使う方法

```swift
import SwiftUI

struct ContentView: View {
    @State private var text = ""
    
    init() {
        UINavigationBar.appearance().standardAppearance = {
           let appearance = UINavigationBarAppearance() // 1
            appearance.configureWithTransparentBackground() // 2
            appearance.backgroundColor = .systemBackground.withAlphaComponent(0.9) // 3
            return appearance
        }()
    }
    
    var body: some View {
        NavigationStack {
            TextEditor(text: $text)
                .ignoresSafeArea()
                .navigationTitle("タイトル")
                .navigationBarTitleDisplayMode(.inline)
        }
    }
}
```

1. ナビゲーションバーの外観をカスタマイズするためのオブジェクト
1. 影をなくし、背景を透明にする
1. 背景色を不透明度0.9の UIColor.systemBackground にする

# UIBarAppearanceを使わない方法
```swift
import SwiftUI

struct ContentView: View {
    @State private var text = ""
    
    var body: some View {
        NavigationStack {
            GeometryReader { geometryProxy in
                TextEditor(text: $text)
                    .ignoresSafeArea()
                    .navigationTitle("タイトル")
                    .navigationBarTitleDisplayMode(.inline)
                    .toolbarBackground(.hidden, for: .navigationBar)
                    .overlay(alignment: .top) {
                        Color(.systemBackground).opacity(0.9)
                            .frame(height: geometryProxy.safeAreaInsets.top)
                            .ignoresSafeArea()
                    }
            }
        }
    }
}
```

# スクリーンショット
![94EF94B8-906A-498A-A859-7C228951BB14_1_201_a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366249/14fe05ef-1f1d-54ae-bdc8-af68de487d7f.jpeg)

# おわり
開放感があってかっこいいですね。ぜひ試してみてください。

---

ご覧いただきありがとうございました。

🐦 [Twitter: @shota_appdev](https://twitter.com/shota_appdev)

📱 [個人アプリ: Symbols Explorer](https://apps.apple.com/jp/app/symbols-explorer/id1612933742)
【Rails】画像アイコンを作ってみよう！【画像表示、加工】

## はじめに
どうも、春からエンジニア転職予定のkazuhiroです。
文系職からの転職であり、プログラミングは未経験ですが、
初学者目線で疑問に思った点などを、アウトプットしていきたいと思います。
※間違いや改善点などありましたらコメントいただければ幸いです。

## 本題
転職先のBossより、このような練習問題が出された。![スクリーンショット 2023-01-04 1.18.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083940/585419cf-e369-c754-7f01-065d661ba97a.png)

やってやんよ、と。
ユーザー一覧画面については、以前掲示板一覧画面を作成していたため、
同様の手順で作成することができたが、画像の表示方法で引っかかってしまう。
![掲示板.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083940/c8c22586-d21a-7a7a-8830-8d0dd6825ded.png)

### ・画像追加
早速ググってみたところ、`image_tag`メソッドを使うのが良さそうだ。

        <%= image_tag '画像ファイルパス', 'オプション' %>

今回の課題ではusersテーブルのimage_urlカラムに画像urlが格納されているため、
下記のようにコーディング。

        <%= image_tag user.image_url %>
結果を見てみよう。
![スクリーンショット 2022-12-30 23.40.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083940/a1fdc644-118d-a8b8-2398-9b50c17ba9df.png)


クソでかデンジくん降臨。
オプションで画像のリサイズができるようなので修正して、
他ユーザーも追加してみた。

        <%= image_tag user.image_url, size: "75x75" %>

![丸アイコン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083940/f385b3a2-cdf1-04f2-ceb3-3cc87d2ee3ad.png)
いい感じのサイズ感になリました。
ただ、画像が引き伸ばされてる感があるのでもう少し修正します。

### ・画像加工

ここで使用したのがcssの`object-fit`プロパティ。
用途に応じていろいろできるみたいですが、今回は`contain`
（アスペクト比を維持したまま、指定サイズに収まるよう拡大縮小してトリミング）を適用。
※こちらのサイトの解説がわかりやすかったです。
https://developer.mozilla.org/ja/docs/Web/CSS/object-fit

      .resize_image {
        width: 75px;
        height: 75px;
        object-fit: cover;　
        border-radius: 50%; #画像を円形に
        padding: 2px;
        border: 2px solid #333300;
     　　　}


![スクリーンショット 2023-01-10 21.38.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083940/c32c3ada-4836-c7f2-823c-0dfa91b17978.png)
いい感じになりました。


今回は`border-radius`（画像の角を丸める）で画像を円形にしましたが、
画像を丸くしたいだけであれば`rounded-circle`でもOKのようです。

      <%= image_tag user.image_url, class: "rounded-circle", size: "75x75" %>



## おわりに
噛み砕きすぎて、くどい表現になってしまった感もありますが、
Railsにおける画像表示、加工方法について記載しました。
初歩中の初歩の内容かもしれませんが、何かの参考になれば幸いですm(_ _)m
エンジニアインターン0日目

今日は初めてのエンジニアインターンに参加しました。
仕事は会社のLP作成や修正を行いました。
最初は環境構築としてgitを連携し、FileZilaでローカルとリモートのサーバをつなぎました。
FileZilaに変更したコードをアップロードし、サイトに反映させました。
でも、直接アップロードすることより、gitなどにテストとしてコードを反映させ、確認してもらう方が安全で確実です。
使った言語としてはPHP,Javascriptを利用しました。
WordPressのテンプレートを使ってLPを作成しました。
WordPressのテンプレートを一回作ってしまえば似たようなサイトを作ることはとても簡単になることを知りました。

カテゴリー別にLPのサイトを分け、そのLPとカテゴリーが同じになるようにJavaScriptを利用してチェックボックスを変化させようとしました。JavaScriptだけでなくjQueryも使いました。テンプレートにscriptを読み込むにも手間があって苦労しました。

初日で感じたことはエンジニアになるためにはたくさん努力しなければならないと実感しました。Progateやドットインストールなどの知識はそれほど必要なく、現場でチーム開発に携わることがエンジニアになるためにとても重要なことだと感じました。わからないことがあればすぐに先輩エンジニアに聞くのではなく、自分で調べて解決できるようにならなければならないと思いました。これから一生懸命頑張って学生エンジニアとして活躍できるように努力していきたいと思いました。
Photoshopレイヤーネームを大きな文字で編集するKeyboard Maestroマクロ

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f33353437372f62383361646666312d383033632d363436612d333438332d6163633034643064333264392e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/d65c0611-e288-9f3c-c120-117330f7a611.png)

# レイヤー名変更は老眼につらい仕様
Photoshopレイヤー名は、レイヤーパネルの文字部分をダブルクリックする、またはレイヤーメニュー＞レイヤー名の変更で変えられますが、
![スクリーンショット 2023-01-10 21.57.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/655aae0a-6233-3a04-629b-0459b7cabf3c.png)
あまりにも小さい！ミスタイプしたまま人に渡すと恥ずかしい！
ということでなんとかできないかやってみました。Keyboard MaestroのカスタムHTMLプロンプトを使います。
## こうなります
![スクリーンショット 2023-01-10 22.01.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/b83adff1-803c-646a-3483-acc04d0d32d9.png)
入力してreturnで確定、escでキャンセルします。


## KMマクロを作ろう
### AppleScriptでレイヤー名取得
```AppleScript
tell application id "com.adobe.photoshop" to name of current layer of current document
```
### CustomHTMLPromptを書く
:::note warn
HTMLもCSSもJSXも初心者なので調べまくって書いたやつです。もちろん正しく書ける方は適宜直してください。
:::

:::note info
escでキャンセルしたかったので…ごちゃごちゃとjavascriptでイベント拾っています。なぜか？type="reset"だとうまく発動しなかった。
:::


```html
<!DOCTYPE html>
<html lang="ja-jp">
<head>
<meta charset="UTF-8">
<title>レイヤー名編集</title>
<style>
#textinput{
border:none;
border-radius:10px;
padding:5px 15px;
font-family:"ヒラギノ角ゴ Pro W3";
font-size:32px;
background-color:#f2f2f2;
width:95%;
}
</style>
<script type="text/javascript">
    document.addEventListener('keydown', function(e) {
    if(e.key === 'Escape'){
    window.KeyboardMaestro.Cancel('');
  }
})
const a = window.KeyboardMaestro.GetVariable('PSLayerName');
    function init1() {
        document.getElementById("textinput").value=a;
        document.getElementById("textinput").focus();
        document.getElementById("textinput").select();
    }
</script>
</head>
<body data-kmwindow="1000,90" onload="init1()">
<form>
<input type="text" id="textinput" name="PSLayerName">
<button type="submit" style="padding:0;border:0;" onclick="window.KeyboardMaestro.Submit()"></button>
</form>
</body>
</html>
```
:::note info
inputのnameにKMのVariable書いとくとSubmitしたときに自動で格納されます。CustomHTMLPromptの歯車マークからFloatingとTransparentにチェックいれとくときれい。
:::


### 戻り値で書き戻すか決めて、OKなら戻す
マクロのifで、The txt:
```
%HTMLResult%
```
が`Cancel`なら何もせず、そうでないときにAppleScriptでPhotoshopのレイヤー名にセットします。
```AppleScript:
tell application id "com.adobe.photoshop"
	tell application "Keyboard Maestro Engine" to set myLN to getvariable "PSLayerName" as text
	set name of current layer of current document to myLN
end tell
```

マクロDLはこちら（2023/01/10時点のもの）
[https://d.pr/f/1q6BUT](https://d.pr/f/1q6BUT)

## 問題点
実行時、ウインドウモードだと浮いてるパネルが隠れます。アプリケーションフレームにくっつけて、アプリフレームで実行すればレイヤーパネルも見えたまま実行できます。
[AWS][Terraform]Iot ruleをLambdaのトリガーに設定する方法

# はじめに
- 最近業務でTerraformを使ってLambdaのトリガーにIot ruleを追加する機会があったので、設定方法を備忘録として残しておきます。
- バージョン
    - Terraform:1.3.5
    - aws provider:4.49.0

# やりたいこと
- TerraformでLambdaのトリガーにIot ruleを追加したい
※マネジメントコンソールから追加する場合は下記のようにLambda設定画面から「トリガーを追加」をクリックし、「AWS Iot」を選択し、「Rule」のARNを入力すればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/51ff6f2e-19c3-a83a-dde3-3cad295ece74.png)

# ハマったこと
以下のIot ruleリソースを作成するTerraformコードを作成し、lambdaブロックのfunction_arnに対象Lambdaを記述したのですが、terraform apply後、Lambdaのコンソールで確認したら該当トリガーが追加されませんでした。

```terraform
resource "aws_iot_topic_rule" "sample_iot_topic_rule" {
  name        = var.sample_iot_topic_rule.name
  enabled     = true
  sql         = "SELECT * FROM '${var.sample_iot_topic_rule.topic}'"
  sql_version = "2016-03-23"

  lambda {
    function_arn = aws_lambda_function.test_lambda.arn
  }
}
```

# 原因
aws_lambda_permissionリソースも記述しないといけないので、aws_iot_topic_ruleリソースのlambdaブロックにfunction_arnを記述するだけではダメでした。
しかし、aws_lambda_permissionが記述されていなくてもterraform applyが通ってしまうので、少しややこしかったですね。

以下、Terraform[公式ドキュメント](https://registry.terraform.io/providers/hashicorp/aws/4.49.0/docs/resources/lambda_function)からの引用
>To give an external source (like an EventBridge Rule, SNS, or S3) permission to access the Lambda function, use the aws_lambda_permission resource. See Lambda Permission Model for more details. On the other hand, the role argument of this resource is the function's execution role for identity and access to AWS services and resources.

EventBridge RuleやSNSなどと同様に、Iot ruleをLambdaのトリガーに追加する際もaws_lambda_permissionを記述する必要がありました。

# 修正後のコード
```terraform
resource "aws_iot_topic_rule" "sample_iot_topic_rule" {
  name        = var.sample_iot_topic_rule.name
  enabled     = true
  sql         = "SELECT * FROM '${var.sample_iot_topic_rule.topic}'"
  sql_version = "2016-03-23"

  lambda {
    function_arn = aws_lambda_function.test_lambda.arn
  }
}

resource "aws_lambda_permission" "sample_iot_topic_rule_permission" {
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.test_lambda.function_name
  principal     = "iot.amazonaws.com"
  source_arn    = aws_iot_topic_rule.sample_iot_topic_rule.arn
}
```

# 参考
- [Resource: aws_lambda_function](https://registry.terraform.io/providers/hashicorp/aws/4.49.0/docs/resources/lambda_function)
- [Resource: aws_lambda_permission](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_permission)
AWS cloud9で表示数を増やす方法

ログなど出力の量が多いものを表示させたい場合に、デフォルトの表示数が少ないため
全ての出力が表示されない場合があります。
cloud9のターミナルに表示できる数を増やす設定ができます。


右上歯車＞Usersetting＞Scrollback（デフォルト1000なので数を増やします）
IoTプラットフォームを知ろう!

# はじめに
毎週1本様々な技術に関する記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiixta.com/7_inai_)

# IoTプラットフォームとは
IoTプラットフォームとは、`IoTを構成するための要素である、IoTデバイス・アプリケーション・センサー・ネットワーク等をクラウドを介して繋ぐための土台(プラットフォーム)`となるものです。

# IoTプラットフォームでできること
IoTプラットフォームは、様々なベンダーからリリースされており、その機能や特徴はそれぞれ異なりますが、主な特徴としては次の3つが挙げられます。
## ①センサーから集められた情報の蓄積
無数にあるセンサーによって取得した信号は、膨大なサイズになります。そのデータ([ビッグデータ](https://qiita.com/7_inai_/items/0bbce95823ca7ae9ae2e))を蓄積するための基盤を提供します。

## ②蓄積した情報の分析
IoTで蓄積した無数にあるデータはAIを用いて分析し、その傾向の把握や今後の対策の策定をする必要があります。このAIによるデータ分析用のAPIを提供しているプラットフォームもあります。


## ③デバイスのセキュリティ機能およびマネジメント機能
ネットワークの規模によりますが、大規模なものでは数十万ものIoTデバイスを同じネットワークに接続し管理する必要があります。そのため、IoTプラットフォームによって提供されるAPIを使用してIoTデバイスの管理を行う必要があります。



# IoTプラットフォームの種類
IoTプラットフォームには以下のような種類のものがあります。ただ、それそれの特徴までこの記事に記入すると情報過多になってしまうため、以下のリンクから確認お願いします。
リンク：[IoTプラットフォームの種類](https:XXX)
- Predix(GE)
- AWS
- Azure
- sinalytics(シーメンス)
- Lumada(日立)
- MotionBoard(ZEAL)



# 終わりに
大企業ほど、別会社のIoTプラットフォームを使用するのではなく、自社で内製する傾向にあります。もちろん内製することにも、システムのカスタマイズ性の向上や、ノウハウの蓄積といったメリットはありますが、余分な開発コストの発生や、トレンドの変化に開発速度が追いつかないといったデメリットがあります。多くのベンダーが様々なIoTプラットフォームをリリースしていますので、自社に合ったIoTプラットフォームを導入して、余分なコストや時間を削減することも可能となるでしょう。


最後までお付き合いくださりありがとうございました。
SyntheticEventとは

<h1>SyntheicEventとは</h1>
イベントは、ブラウザ毎に動作が異なるケースがありますが<br>
Reactでは、Reactを使用するユーザーに一貫した経験を提供するためにSyntheicEventオブジェクトを
使用します。
SyntheicEventとブラウザののイベントはほぼ一緒ですが、全く同じものではありません。

<h2>SyntheicEventの特徴１</h2>

```react
import React from 'react'

export default function Event() {
    const handleButtonClick = (e) => {
        console.log('handleButtonClick');
    }
    const handleMouseLeave = (e) => {
        console.log('handleMouseLeave');
        console.dir(e);
    }
    const handleClickCapture = () => {
        console.log('handleClickCapture');
    }
    const handleClickCapture2 = () => {
        console.log('handleClickCapture2');
    }
    const handleClickBubble = () => {
        console.log('handleClickBubble');
    }

    return (
        <div onClickCapture={handleClickCapture}>
            <div onClickCapture={handleClickCapture2} onClick={handleClickBubble}>
                <button onClick={handleButtonClick} onMouseLeave={handleMouseLeave}>Button</button>
            </div>
        </div>
    )
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3097775/8393611d-7fcf-bece-0e1d-13f2667b9c7b.png)
ここでボタンからマウスを離すと、SyntheticEventを受取ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3097775/c5b20e20-d768-e4a0-92bb-e49ef7d5b5d2.png)

上記で、SyntheicEventとブラウザのイベントは少し違いがあると話しましたが、ここでその理由が分かります。
SyntheicEventのnativeEvent中を見ると、実際に起こるイベントはmouseoutであることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3097775/a143b90f-f1ff-7bc9-e654-f2c4139e4a3d.png)

<h2>SyntheicEventの特徴２</h2>
javascriptではformでreturn falseをするとdefault eventが制御されますが、
Reactではreturn falseの機能を提供せず、その代わりにevent.preventDefault()を提供しています。
formでsubmitをするとdefault eventとしてページ更新が起こりますが、preventDefault()を指定することでページ更新が起こらないようになります。

```react
import React from 'react'

export default function Event() {
    const handleSubmit = (event) => {
        event.preventDefault();  // do prevent default event
        console.dir(event.target); 
    };

    return (
        <form onSubmit={handleSubmit}>
            <input type="submit" defaultValue="Submit" />
        </form>
    )
}
```
<h2>Captureとbubble</h2>
Capture：親から子まで下りながら誰が呼ばれたか、ターゲットを探す行為。<br>
　　　　　例えば、ボタンが押されたらボタンを囲んでいるDOMの一番最初は親が呼ばれます。<br>
Bubble：Captureが終了した後（ターゲット特定済みの状況）ターゲットの親のイベントをチェック<br>
ReactではcaptureをonClickCaptureとして提供。<br><br>
「SyntheicEventの特徴１」のコードからReactではどのようにCaptureとBubbleが動くか分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3097775/2c41ad30-de07-a2a0-46a9-2b8871646200.png)
globとコマンドラインのワイルドカード(*)でハマった件

# 発生した問題
データセットを作成する時は大体拡張子別にディレクトリを分けているのですが，今回はたまたま 2 種類の拡張子を持つファイルが 1 つのディレクトリに入ってしまっていたので，Python のコード内でこれらを分けて取得する必要がありました．
しかし，この取得の段階で **glob コマンドがなぜかうまく動きませんでした**．
本記事では発生した事項，解決策，結論について述べたいと思います．

以下に今回のディレクトリ&ファイル構造を示します．
```:dir_structure
.
├── glob.py
└── dataset_dir
    ├── 001.txt
    ├── 002.txt
    ├── 003.txt
    ├── ...
    ├── 100.txt
    ├── 001.png
    ├── 002.png
    ├── 003.png
    ├── ...
    └── 100.png

```
このディレクトリ構造に対して，以下のコードを用いて```.txt```および```.png```ファイルの path を格納したリストを作成します．
```python:glob.py
txt_path = glob.glob(sys.argv[1])
png_path = glob.glob(sys.argv[2])
print(txt_path, len(txt_path))
print(png_path, len(png_path))
```

```:command line
python glob.py ./dataset_dir/*.txt ./dataset_dir/*.png 
```
しかし，このプログラムの出力は以下の通りでした．
```./dataset_dir/001.png 1```
```./dataset_dir/002.png 1```
なぜこのようなことが発生したのでしょうか？

# 解決策
私の脳内の理解では以下のようなものでした．
1. ```python glob.py ./dataset_dir/*.txt ./dataset_dir/*.png```が実行される
2. プログラム内で与えられた引数が str 変数として```txt_path = glob.glob(./dataset_dir/*.txt)```および```txt_path = glob.glob(./dataset_dir/*.png)```のように渡される．
3. glob 関数によってディレクトリ内のファイル一覧を取得する．

しかし，この**2が間違っていました．**
そもそも，**Python の引数としてワイルドカードを利用すると，str としてそのまま受け取られるのではなく，その段階でディレクトリ内全てのファイルを指定したことになる**ので，実行段階の```python glob.py ./dataset_dir/*.txt ./dataset_dir/*.png```とは，```len(sys.argv)``` = 3 ではなく，```len(sys.argv)``` = 101 (script1 + txt50 + png50) という時点でミスを犯していたことになります．

ですので，コマンドライン上でワイルドカードを利用しないというのが正解なようです．
よって，以下のようにプログラムを変更することが正しいです．

```python:glob.py
txt_path = glob.glob(sys.argv[1] + '/*.txt')
png_path = glob.glob(sys.argv[2] + '/*.png')
print(txt_path, len(txt_path))
print(png_path, len(png_path))
```

```:command line
python glob.py ./dataset_dir/
```

# 結論
コマンドライン上でワイルドカードを用いると即効魔法が発動するので，sys.argv に吸収される時には既にデータはワイルドに獲得されている．

# 追記
@yoshi389111 さんよりコメントをいただきました．(2023/01/11 確認)
ご提案いただいた内容は「**そもそもコマンドライン上で実行する時にはクォーテーション(またはダブルクォーテーション)で囲うことでワイルドカードを非アクティブ化できる**」というものでした．確かに！その手がありました！！

```:command line
python glob.py './dataset_dir/*.txt' './dataset_dir/*.png' 
```
SAP BusinessObjects データをCSVエクスポートする場合、文字コードがShift_JISに設定できない

**SAP BusinessObjects Business Intelligence Platform 4.3 Support Package 01**
（以下、BO4.3SP01と略）に関連する製品不具合の情報です。

BO4.3SP01上でWebIレポートを作成して、データ部分のみをCSVにエクスポートしようとしたところ、どの文字セットを指定しても全てUTF-8の文字コードで出力されてしまう、という不具合事象が発生しました。
SAP公式サポートに問い合わせた結果、原因と対処方法が判明し、実際に不具合事象の解消に至りました。
SAPの公式ドキュメントは基本的に英語が多いので、当該SAP Noteの日本語訳を掲載させていただきます。
同様の事象が起こった場合の参考にしていただければ幸いです。
***
**（SAP Note 原文リンク）**
[3050020](https://launchpad.support.sap.com/#/notes/3050020 "SAP Note 3050020") - The charset cannot be set to Shift_JIS when exporting data of a Web Intelligence document to CSV.
***
**3050020
：Web Intelligence ドキュメントを CSV にエクスポートする場合、文字セットを Shift_JIS に設定することができない**

※本ドキュメントのリリース日付：2021/08/11


**現象**
    Web Intelligenceを使用してWeb IntelligenceドキュメントのデータをCSVにエクスポートする場合、書き出されるファイルの文字コードをShift_JISに設定することができない。

**関連キーワード**
    WebI, webintelligence, UTF8, UTF-8, set, query, queries

**原因と前提条件**

**環境：**
SAP BusinessObjects Business Intelligence Platform 4.3 Support Package 01
Web Intelligence

**再現手順：**
    1. Web Intelligenceを使用して、BOレポート等、日本語の文字列を含むWeb Intelligenceドキュメントを開く。
    2. 「データ」のラジオボタンを選択し、ドキュメントをCSVファイルとしてエクスポートする。
    3. 「オプション」タブで、文字セットをUTF8からShift_JISのものに変更する。
    4. 「エクスポート」ボタンをクリックして、CSVファイルを保存し、開く。
    >> CSVファイルの文字コードがUTF-8になる。


**注意：**
    CSVファイルのエンコーディングは、メモ帳などの外部ツールで簡単に確認することができます。

**原因：**
    本問題は、製品の不具合に起因するものです。

:::note info
**解決方法**
    この問題は、**BO4.3SP01 Patch08以上**のパッチを適用することで解消されます。
:::
クラウドプラクティショナーの備忘録

# はじめに
AWSのクラウドプラクティショナー取得のために勉強したことをまとめます。

https://aws.amazon.com/jp/certification/certified-cloud-practitioner/

こちらのサイトに試験ガイドや模擬問題が提供されています。

# 試験ガイドについて
4つの分野から問題が出されるそうなので、試験ガイドの中にある出題範囲のリストをベースに何となく大事そうだと思ったポイントを記載しておきます。
## 第1分野 クラウドのコンセプト
* 総所有コスト(TCO)を削減するために「資本的支出(CapEx)」を「運用維持費(OpEx)」に変えていくことができる。モノを持たないことで、変化に強い財務体質が作れる。
* Well-Architectedが5本柱からサステナビリティが追加されて6本柱になった件

## 第2分野 セキュリティとコンプライアンス
* 責任共有モデルはサービスによって異なる
    * EC2はOS以上がユーザー責任
    * RDSはデータとプログラムがユーザー責任
    * lambdaはプログラムだけがユーザー責任
* Trusted Adviserでセキュリティチェック
* [rootでないとできないこと](https://dev.classmethod.jp/articles/only_aws_account/)

## 第3分野 テクノロジー
* リージョン、アベイラビリティゾーン、エッジロケーション
* S?Sの違い。
    * SQS プル型のメッセージ授受。到達保証。
    * SNS プッシュ型のメッセージ配信。メールやSMSなど多様。
    * SES メール送受信。

## 第4分野 請求と料金設定
* Organizationsについて
    * 一括請求のみ／統制も実施するの2パターンあり。
    * [RIとSPはOrganizationsで共有が可能](https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/ri-turn-on-process.html)

# 模擬問題で引っかかったポイント
模擬問題をやってみて、正解できなかったものがあったので、復習します。
### 問題「(7) システム管理者がユーザーの AWS Management Console にログインセキュリティレイヤーを追加するには、どうすればよいですか。」
#### 答え「C) Multi-Factor Authentication (MFA) を有効化する。」
ログインセキュリティレイヤーって? 問題の日本語を読み取れませんでした。解説によれば、ユーザー名/パスワードに加えさらに保護レイヤーを追加するためのシンプルなプラクティスだそうです。ログイン時のセキュリティレベルを少し上げるにはどうすればいいかを聞かれていたようです。
### 問題「(10) AWS インフラストラクチャ上で禁止されているアクションに関する情報は、どこで見つけることができますか。」 
#### 答え「D) AWS Acceptable Use Policy」
何それ? 初めて見ましたが下記のサイトに行くと、AWSを利用してやってはいけないことが書かれていました。AUPと略すこともあるようです。

https://aws.amazon.com/jp/aup/

# おわりに
無事に合格することができました。
2年前に[SAAを取得した](https://qiita.com/talomina/items/9605db1b3e3e1987ae24)こともあり、正直プラクティショナーを甘く見積もっていたのですが、わからない問題がたくさん出てきたのでショックでした。

# 参考文献

https://qiita.com/mzmz__02/items/b4e0d95ec0de5c1d71d7

https://aws.amazon.com/jp/architecture/well-architected/

https://aws.amazon.com/jp/s3/storage-classes/

https://aws.amazon.com/jp/premiumsupport/plans/

https://dev.classmethod.jp/articles/new-aws-official-practice-questions/
matplotlibで3次元点群を色付きで表示

### 前提
点群: 
代表点4つを基にして同じ分散を持つ点群120点(4*30点)を生成する
表示:
カラーマップ(teb10)を基にして点ごとに色をつけて表示

### コード

```python:sample.py
import matplotlib.pyplot as plt
import numpy as np
#点群の生成

# 生成するグループの数
k = 4
# グループ毎の分散
sigma = [[20, 0, 0], [0, 20, 0], [0, 0, 20]]

# 座標を格納する空の配列を作成
x = np.empty((0,3))

# 配列の中に座標を格納
for ell in range(k):
    # グループ毎の代表点
    pc = np.random.uniform(low=-20, high=20, size=(3,)) 
   
    #代表点を基に分散sigmaの点を30点作成
    xs = np.random.multivariate_normal(pc,sigma,30)
    
    #xに３次元の座標を持った点群を格納
    x = np.concatenate([x,xs])
# 3次元座標を分割
x_ = x[...,0]
y_ = x[...,1]
z_ = x[...,2]

# plt.scatterで３次元にplot
# colormapを取ってくる
cmap = plt.get_cmap("tab10")

# 配列にcolorコードを格納
colors = np.empty((120,4)
for i in range(120):
    colors[i] = cmap(i % 10)

fig = plt.figure()
# projectionを3dと指定する
ax = fig.add_subplot(projection='3d')
ax.scatter(x_, y_, z_, color=colors)
plt.show()
```
### 結果
点ごとに色付きで表示できていることが確認できた
![スクリーンショット 2023-01-10 21.18.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675330/695a74a2-7756-ff3b-4cfa-d78455cd8ba9.png)

### 注意
`ax = fig.add_subplot(projection='3d')`で3dを明示的に設定することで３次元の表示ができる

### 詳細
コードの説明はおいおい追加する予定
Rustで標準入力を取得する

プログラミングの問題を解くときに使用している標準入力の取得方法まとめ

## Stringで取得
```rust
use std::io;

fn read_buffer() -> String {
    let mut buffer = String::new();
    io::stdin().read_line(&mut buffer).expect("Failed to read line.");
    buffer.trim().to_string()
}
```

## 符号なし整数で取得

```rust
use std::io;

fn read_buffer() -> u32 {
    let mut buffer = String::new();
    match io::stdin().read_line(&mut buffer) {
        Ok(_) => buffer.trim().parse().expect("Failed to parse."),
        Err(e) => panic!("Failed to read line: {}", e)
    }
}
```

## ベクタ型(String)
スペース区切りで入力された場合
```rust
use std::io;

fn read_buffer() -> Vec<String> {
    let mut buffer = String::new();
    io::stdin().read_line(&mut buffer).expect("Failed to read line.");
    buffer.trim().split_whitespace().map(|s| s.to_string()).collect()
}
```

## ベクタ型(符号なし整数)
スペース区切りで入力された場合
```rust
use std::io;

fn read_buffer() -> Vec<u32> {
    let mut buffer = String::new();
    io::stdin().read_line(&mut buffer).expect("Failed to read line.");
    buffer.trim()
        .split_whitespace()
        .map(|s| s.parse().expect("Failed to parse."))
        .collect()
}
```

## ベクタ型(char)
スペース区切りで入力された場合
```rust
use std::io;

fn read_buffer() -> Vec<char> {
    let mut buffer = String::new();
    io::stdin().read_line(&mut buffer).expect("Failed to read line.");
    buffer.trim().chars().collect()
}
```
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

# 親の顔より見たエラー

```bash
sudo apt install -y mysql-server \
  && echo "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY ''" | sudo mysql \
  && mysql -uroot
```

参考

https://serverfault.com/a/809071
マルチテナントのunplug/plugを使って、SE2からEEのCDBにPDBを移動させることはできるのか？

## はじめに
　マルチテナントのunplug/plug機能を使って、Standard Edition2(SE2)のCDBに存在するPDBをEnterprise Edition(EE)のCDBに移動できるのかについて調べました。

## 該当する記事（英語）

以下の記事を見つけました。ただし、英語なので翻訳してご紹介します。
著者はアメリカのOracleで働いている方なので信頼できる情報のようです。

https://mikedietrichde.com/2017/07/18/switching-from-se-to-ee-with-oracle-multitenant/

【以下要約】

「簡単にSE2からEEにスイッチできるのか？」という質問に対して、**２つの条件**があります。
+ 2つのバージョンが一致している事
+ 2つのキャラクターセットが一致している事
の２つです。

以上の条件がそろっていれば、シンプルにSE2のPDBをunplugして、EEのCDBにplugするだけです。



反対に、EEからunplugしてSE2にplugすることもできます。ただし以下の**条件付き**です。
+ ターゲットCDBに存在しないオプションをEEのPDBが持っている場合、それらをすべて取り除かなければならない。

## 終わりに
unplug/plug機能でPDBをSE2からEEのCDBに移動させる事について中心に書きましたが、著者は記事の最後にデータポンプを使う事を強くおすすめしています。
データ移行の方法にはたくさんの種類がありますので、場面に応じて適切な方法を選択することが大切です。
他にも色々な方法を私自身ももっとキャッチアップしていきたいと思います。
Rails devise パスワードリセット後のリダイレクト先の指定

# 何がしたい？
ログイン画面の「パスワードを忘れた方」よりパスワードをリセットした場合に特定のページへリダイレクトしたい。
（deviseのデフォルトの場合はログイン画面へ遷移します。）

# 何が難しかったのか
なんといってもdeviseは簡単にログイン回りの機能を全て実装できる代わりに何が起きているのかわからないブラックボックス状態じゃないですか？
少なくとも僕は完全に理解したとは言い難いです。
今回パスワードリセットのメールを送った後に遷移するページを指定したいだけなのに異常に難しかったので記事にしておきました。

# 結論
いいから教えろ！

## 1. routesに追加
```ruby
devise_for :users, controllers: {
  passwords: 'users/passwords',
}
```

## 2. Users::PasswordsControllerを作成
Devise::PasswordsControllerの継承を忘れずに。

```ruby
module Users
  class PasswordsController < Devise::PasswordsController
  end
end
```

## 2. after_sending_reset_password_instructions_path_forを設置

```ruby
module Users
  class PasswordsController < Devise::PasswordsController

    private

    def after_sending_reset_password_instructions_path_for(resource_name)
      # リダイレクト先を指定
      {redirect_path}
    end
  end
end
```

以上！
gtsummaryのtbl_regressionの変数や係数等を日本語に直し注釈を入れる

gtsummaryはRのtibbleや計量結果の出力を美しく手軽に出力するのにとても有用です。
ただ、変数名の変更や注釈の入れ方が意外と探しても出てきにくいので、参考のため共有したいと思います。色々試してみてください。


```r
#ライブラリの読み込み
library(gtsummary)
library(gt)
```

```r
tbl_1 = tbl_regression(model_1, label = list(population ~"人口（2020国調）", fiscal_v_100 ~ "財政力指数"))%>%
  add_glance_table(include = c(r.squared, AIC, BIC)) %>%
  modify_header(label = "**変数**", estimate = "**係数**") %>%
  bold_p(t = 0.05)
tbl_2 = tbl_regression(model_2, label = list(population ~"人口（2020国調）", fiscal_v_100 ~ "財政力指数", balance_v ~ "経常収支比率", laspy ~ "ラスパイラス指数", fund_v ~ "財調基金規模")) %>%
  add_glance_table(include = c(r.squared, AIC, BIC)) %>%
  modify_header(label = "**変数**", estimate = "**係数**") %>%
  bold_p(t = 0.05)
tbl_all = tbl_merge(list(tbl_2, tbl_1), tab_spanner = c("**Model 2**", "**Model 1**")) %>% 
  modify_caption("**市町村の2022年新型コロナウイルス感染症<br>対応地方創生臨時交付金の計画申請額（千円）の回帰結果**") %>% 
  modify_header(label = "**変数**") %>%
  as_gt() %>%
  tab_source_note(md("出所）内閣府ホームページ「新型コロナウイルス感染症対応地方創生臨時交付金」及び総務省ホームページ「地方財政状況関係調査」より筆者作成。<br>注）財調基金規模は2020年度、その他変数は21年度のもの。財調基金規模は同年財調残高を標準財政規模で除した数値となる。"))
tbl_all
```
出所を入れる場合は、gtsummaryの変数でなく、gtの変数のなかにあるtab_source_noteを使って、記述内容をmd関数の中にいれて宣言する方法が良いようです。
この際、as_gt関数でtbl_関数内でgtが作用するように宣言をしてから実行するのがコツのようです。
なお、各種の改行は< br >タブで行います。これは、gt形式の出力がhtmlによって制御されていることに起因しています。ggplotになれた身だとつい正規表現の\nで改行をいれたくなりますが、これは機能しませんので気をつけましょう。

なお、出力結果はこんな感じになります。
![covid19_r4_reguression_resultのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504024/1132aadc-5df9-7a88-981b-0a64fa35851e.png)


※未定稿の図なので、結果はマスクしています。刊行されたら結果を公開したいと思います。
Power Automate で Excel シリアル値を求める方法

# はじめに

Power Automate で Excel のシリアル値（日付）を取得する方法を記載します。



# ちなみに

Power Automate の　Excelアクションには、、シリアル値を ``ISO 8601形式`` に変換し取得するオプションも用意されています。
Power Automate の日付関数は、ISO 8601形式で記載された日付データ（テキスト型）をIN/OUTとすることが多いので、こちらの利用も考慮してください。
その場合、本記事で実施する処理が不要となるケースも存在します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/a903e749-b286-07e0-c48a-38044ba057c6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/65891a53-c152-30a5-83c2-1fa55a64ac21.png)

取得したデータに対し、「アレイのフィルター処理」で、ISO 8601形式の日付を利用し、レコードの抽出が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/092b9b44-4043-c9fa-1991-e72927a493da.png)



# Power Automate でシリアル値を求める

シリアル値は、以下の数式で求められます。
```
add(div(sub(ticks('[求める日付]'),ticks('1/1/1900')),864000000000),2)
```

[求める日付]部分には、``1/10/2023``など、``MM/dd/yyyy``形式で指定してください。
日本の今日であれば、以下の式になります。
```
formatDateTime(convertFromUtc(utcNow(),'Tokyo Standard Time','o'),'MM/dd/yyyy')
```

よって、今日（日本時間）のシリアル値は
```
add(div(sub(ticks(formatDateTime(convertFromUtc(utcNow(),'Tokyo Standard Time','o'),'MM/dd/yyyy')),ticks('1/1/1900')),864000000000),2)
```

です。

Excel コネクタの 「行の取得」 アクション等で利用可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/664aec65-fddc-7e71-aec5-8101c4641b98.png)



# 解説

add(div(sub(ticks('[求める日付]'),ticks('1/1/1900')),864000000000),2)

について解説します。

Excelのシリアル値とは、**「1900年1月1日 を 「1」 とした連番」** です。

対して、Power Automate では直接シリアル値に変換する関数はなく、日時を連番で取得するには ```ticks()``` を利用します。

ticks() とは、**「0001年1月1日午前00時00分00秒 を 「0」 とし、経過した 100 ナノ秒間隔の数」** を表します

https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#ticks

よって、ティック化したのち、

① 1900年と0001年の差を吸収し、
② ナノ秒を日（日付）に変換し、
③ シリアル値の「1」から開始する仕様と、Excelの「1900/02/29」への対応

を行っています。順に説明します。

## ① 1900年と0001年の差を吸収

上記でも記載しましたが、シリアル値は1900年1月1日から、ticks()は0001年1月1日からスタートした経過日時になります。
よって、求める日付のティック値より、約1900年分を差し引く必要があります。

```
sub(ticks('[求める日付]'),ticks('1/1/1900')
```

## ② ナノ秒を日（日付）に変換

シリアル値は1日を1とした連番ですが、ticks()は100ナノ秒ごとの連番です。
よって、1,000,000×60×60×24=864,000,000,000 で除算し、日単位に変換します。

```
div([①の結果],864000000000)
```

## ③ シリアル値の「1」から開始する仕様と、Excelの「1900/02/29」への対応

シリアル値は「1」から開始しますが、ticks()は「0」から開始します。
また、Excelには、「1900/02/29」という本来ありえない日付が存在しており、この日もシリアル値にて1加算されています。
よって、上記②で求めたシリアル値に2日分を追加する必要があります。

```
add([②の結果],2)
```

# まとめ

Excelの日付値を、参照/更新する際、ISO 8601形式での指定が可能となっていますが、シリアル値を扱うことも可能です。その際、当記事をご参考いただければ。