OmniAICreator/Qiita-1.07M huggingface dataset:
【JavaScript】関数とオブジェクト①


#はじめに

Udemyの[【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)の講座の振り返りです。

前回の記事

https://qiita.com/nao0725/items/d9ac00ba64da2f1955a7

#目的

* 関数とオブジェクトについての理解を深める

#本題
###1.関数
####関数の特徴

#####JavaScriptでは、**引数の順番**が重要

`````javascript
// 関数を定義
function fn(a,b) {
  console.log(a,b);
}
// bの引数だけ渡したいと思っても,順番に出力されるからできない
// もし、0を消した場合はundefinedとb側に出力される
fn(0,1);
``````

bの値だけを渡したい場合どうすればいいのか

`````javascript
// 関数を定義
function fn(a,b) {
  console.log(a,b);
}
// もしbの値だけ出力したい場合は、下記のようにaの値の場所にNULLと記述
fn(null,1);
`````

#####JavaScriptの関数名が重複していた場合、後から定義した関数名が有効になる

````javascript
// 関数を定義
function fn(a,b) {
  console.log(a,b);
}
// 同じ名前の関数を用意
function fn(a,b) {
  console.log(2);
}
// この場合、実行結果は2と出力される
fn(1)

// javascriptでは引数が違くても関数で判断されるので注意
// エラーも発生しない
`````

関数の重複を避けたい場合はどのようにするべきか

````javascript
// 下記のように関数式で定義すると
// constによってsyntax errorが発生する
// 基本的には無名関数で書くのでfunctionの後ろのfnは削除（あっても動く）
const fn = function (a,b) {
  console.log(a,b);
}

function fn(a,b) {
  console.log(2);
}

fn(1)
`````


#####default値について

````javascript
// bに予め値を渡しておく　＝＞　default値
function fn(a,b = 1) {
  console.log(a,b);
}
// 実行結果はaで引数の1が、bではdefault値の1が渡ってくる
fn(1);

// もし実行結果の値がundefinedやnullだったら
// nullだと「null」で返ってくる
fn(1, null);
// undefinedだとそのままdefault値が返ってくる
fn(1,undefined);

// 意図的に値を空にしたい場合はnullを使用する
// 下記の書き方は基本的にしない
let c = undefined;
fn(1,c);
// こっちが一般的
let d = null;
fn(1,d);
````

* Argumentsについて

関数コンテキストによって自動生成される

```javascript
function fn() {
  console.log(arguments);
  console.log(a,b);
}
fn(1, undefined)
`````

上記のようにargumentsを出力すると実行結果は下記の通り

`````console.
Arguments(2) [1, undefined, callee: (...), Symbol(Symbol.iterator): ƒ]
0: 1
1: undefined
callee: (...)
length: 2
Symbol(Symbol.iterator): ƒ values()
get callee: ƒ ()
set callee: ƒ ()
[[Prototype]]: Object
`````

0番目に1,1番目にundefinedと出力されている
（配列、、、、？）

```javascript

function fn() {
  console.log(arguments);
  console.log(a,b);
}
// 実引数がargumentsに格納されて出力された
fn(1, undefined)

// 仮引数がなくてもargumentsの値は出力される
`````

例

````javascript
function fn() {
  // 下記のように変数a,bにargumentsの番号を代入
  const a = arguments[0];
  const b = arguments[1];
  // このようにすることで、argumentsが引数の役割をargumentsが果たしていることになる
  console.log(arguments);
  console.log(a,b);
}
fn(1, undefined)

// 引数の数が決まっていない場合（ループなど）で使用する
`````

しかし最近ではES6から導入されたレストパラメーターを使用する

````javascript
// ３つのドットとargsという値で表す
function fn(...args) {
  // argsを出力すると配列として出力される
  console.log(args)
}
// ３つ目の引数を増やしたとしても対応できる
fn(1, undefined,3)
`````

#####returnについて

````javascript
function fn() {
  const a = arguments[0];
  const b = arguments[1];
  // このようにaという値を呼び出し元関数fnに戻す
  return a;
}
// 下記でcに関数を渡す
let c = fn(1, undefined);
// returnによりfnにはaが入っているので、下記の実行結果は1になる
console.log(c);
`````



今日はここまで！

#参考にさせて頂いた記事

* [【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)
あいまい検索用に1文字ずつ*を挟む関数

検索時、`Like`判定する際にいちいち両側に`"*"`を挟むのが面倒なのと、どこに`"*"`を挟むのか見当づけが面倒なので作った

### コード：標準モジュール
``` vb
Option Explicit

Function Like加工(KW)
  '改行対策で1文字ずつ"*"を挟む
  Dim 文字数: 文字数 = Len(KW)
  Dim 何文字目か
  Dim buf
  For 何文字目か = 1 To 文字数
    buf = buf & "*" & Mid(KW, 何文字目か, 1)
  Next
  Like加工 = buf & "*"
End Function

Function Like判定(検索対象, KW) As Boolean
  If 検索対象 Like Like加工(KW) Then
    Like判定 = True
  Else
    Like判定 = False
  End If
End Function
```

### 実行結果：イミディエイトウィンドウ
``` vb:実行結果(イミディエイトウィンドウ)
?Like加工("abcdef")
*a*b*c*d*e*f*

?Like判定("abcdef","ad")
True

?Like判定("abcdef","da")
False

```
「Samba でパスワード無し」且つ「読み書き可」の共有フォルダを作る

|本シリーズのトップページ|
|:--|
|[[備忘録] Samba サーバおよびクライアントの実践例](https://qiita.com/robozushi10/items/47ea76140de4d3605cf3)|


## 概要

「Samba でパスワード無し」且つ「読み書き可」の共有フォルダを提供する理由は、
CI ジョブによる成果物をユーザに公開するためであった.
そして、ユーザ自身に成果物を削除させたかったからである.

ここでは「MYPROJECT」(Windows から見ると大小文字の区別なし) という共有フォルダを公開する.

## 環境

```
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"
```

## 手順

### 1. インストール

```bash
$ sudo apt install samba -y
```

### 2. 共有したいディレクトリを作成しておく

```bash
$ mkdir /var/share/MYPROJECT
```

### 3. 共有する

```
$ sudo vim /etc/samba/smb.conf 
(末尾に以下を追記する)
 
[MYPROJECT]
 path = /var/share/MYPROJECT
 public = yes
 security = share
 writable = yes
 printable = no
 guest ok = yes
```

### 4. 設定を有効にする

```bash
$ sudo systemctl restart smbd.service
```

### 5. 動作確認をする.

Windows から `\\<上記Linux の IP>\myproject\` でアクセスできれば良い.

　

以上.
vistaでstm32duino その4

#概要

vistaでstm32duinoやってみた。
アセンブラ、調べてみた。

#arm命令表

|ニーモニック |呼び名 |動作|
|:--|:--|:--|
|ADC 	|Add with carry 		|Rd := Rn + Op2 + Carry
|ADD 	|Add 				|Rd := Rn + Op2
|AND 	|AND 				|Rd := Rn & Op2 
|B 	|Branch 			|R15 := address 
|BIC 	|Bit Clear 			|Rd := Rn AND NOT Op2 
|BL 	|Branch with Link 		|R14 := R15, R15 := address 
|BX 	|Branch and Exchange 		|R15 := Rn, T bit := Rn[0] 
|CDP 	|Coprocesor Data Processing |(Coprocessor-specific) 
|CMN 	|Compare Negative 		|CPSR flags := Rn + Op2 
|CMP 	|Compare 			|CPSR flags := Rn - Op2 
|EOR 	|Exclusive OR 			|Rd := Rn ^ Op2
|LDC 	|Load coprocessor from memory |Coprocessor load 
|LDM 	|Load multiple registers Stack manipulation| 	(Pop) 
|LDR 	|Load register from memory 	|Rd := (address) 
|MCR 	|Move CPU register to coprocessor register| 	cRn := rRn {(op)cRm} 
|MLA 	|Multiply Accumulate 		|Rd := (Rm * Rs) + Rn 
|MOV 	|Move register or constant 	|Rd : = Op2 
|MRC 	|Move from coprocessor register to CPU register |Rn := cRn {(op)cRm} 
|MRS 	|Move PSR status/flags to register 	|Rn := PSR 
|MSR 	|Move register to PSR status/flags 	|PSR := Rm 
|MUL 	|Multiply 				|Rd := Rm * Rs 
|MVN 	|Move negative register 		|Rd := 0xFFFFFFFF EOR Op2 
|ORR 	|OR 					|Rd := Rn OR Op2 
|RSB 	|Reverse Subtract 			|Rd := Op2 - Rn 
|RSC 	|Reverse Subtract with Carry |Rd := Op2 - Rn - 1 + Carry 
|SBC 	|Subtract with Carry 		|Rd := Rn - Op2 - 1 + Carry 
|STC 	|Store coprocessor register to memory 	|address := CRn 
|STM 	|Store Multiple Stack manipulation 	|(Push) 
|STR 	|Store register to memory 	|(address) := Rd 
|SUB 	|Subtract 			|Rd := Rn - Op2 
|SWI 	|Software Interrupt 		|OS call 
|SWP 	|Swap register with memory 	|Rd := [Rn], [Rn] := Rm 
|TEQ 	|Test bitwise equality 		|CPSR flags := Rn EOR Op2 
|TST 	|Test bits 			|CPSR flags := Rn AND Op2 

#レジスタ

32bit の r0 から r15までの１６個
r13 -- スタックポインタ
r14 -- リンクレジスタ
r15 -- プログラムカウンタ

|レジスタ|	別名|
|:--|:--|
|r7	|wr		
|r9	|sb		
|r10	|sl		
|r11	|fp		
|r12	|ip
|r13	|sp
|r14	|lr
|r15	|pc

以上。
物理ホストUbuntu 18.04 への chrony 導入手順

{{tag> chrony chrony--installation}}

　

# 物理ホストUbuntu 18.04 への chrony 導入手順

# 概要

["非K8s環境" で Prometheus on docker を導入した](https://qiita.com/robozushi10/items/dfb16ffcbbe7745e765e) ときに、
Prometheus が収集したメトリクスのグラフ描画に失敗する現象が発生した.

このとき時刻ズレが発生していたことが描画失敗の原因だった[^1]ので、
chrony を導入して時刻合わせを行った.

なお、当方の場合は /etc/systemd/timesyncd.conf による NTP サーバ指定だと
時刻合わせに失敗したので、chrony を使用した.

　

# 環境

```
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.5 LTS"
```
```
IP は 192.168.1.1 である.
また、LAN は 192.168.1.0/24 である.
```

　

# 参考情報

|URLおよび書籍名|
|:--+
|https://www.server-world.info/query?os=Ubuntu_18.04&p=ntp&f=2|
|CentOS8 実践ガイド サーバ構築編 (古賀政純)|
|https://qiita.com/phase-d/items/97e9a66ffc00a726886e|

　

# 手順

## 1. chrony のインストール

```
$ sudo apt install chrony -y
```

　

## 2. 設定ファイルを更新する

### 差分

なお、`myntp1.co.jp` と `myntp2.co.jp` はローカルで立てている NTPサーバなので、
適宜読み替えること.

```diff
$ sudo diff -u /etc/chrony/chrony.conf.ORIG  /etc/chrony/chrony.conf
@@ -14,10 +14,10 @@
 # About using servers from the NTP Pool Project in general see (LP: #104525).
 # Approved by Ubuntu Technical Board on 2011-02-08.
 # See http://www.pool.ntp.org/join.html for more information.
-pool ntp.ubuntu.com        iburst maxsources 4
-pool 0.ubuntu.pool.ntp.org iburst maxsources 1
-pool 1.ubuntu.pool.ntp.org iburst maxsources 1
-pool 2.ubuntu.pool.ntp.org iburst maxsources 2
+server myntp1.co.jp iburst
+server myntp2.co.jp iburst #🆗
+

 # This directive specify the location of the file containing ID/key pairs for
 # NTP authentication.
@@ -43,3 +43,13 @@
 # Step the system clock instead of slewing it if the adjustment is larger than
 # one second, but only in the first three clock updates.
 makestep 1 3
+
+allow 192.168.1.0/24  # 同一LAN 上の別PC からも参照できるように
+
```

上記🆗の意味について. 丸々引用をさせてもらいました.

> https://qiita.com/phase-d/items/97e9a66ffc00a726886e
iburstもデフォルトでついていることが多いので、そのままで行きましょう。
これがあるとntpdの起動時と相手が応答しないときのみ、2秒間隔で8パケット確認を行い、初回の同期を高速化できます。
burstというパラメータも指定できますが、こちらは常にバーストをすることになるので、余程の必要があって
しかも迷惑がかからない相手以外には指定すべきではありません。


　

## 3. 再起動させる

```bash
$ sudo systemctl status chrony

(表示されるログに時刻調整している形跡があると思う)
```

　

以上


[^1]: 「CentOS8 実践ガイド サーバ構築編 (古賀政純)」の Prometheus での記載のおかげで即座に発見できました
[Firebase, Firestore] custom Map Object で混乱した話

プログラミング初心者の覚書です。

# Unsupported field value: a custom Map object

Firestoreでドキュメントを更新しようとしたときに発生したエラー文です。

```
FirebaseError: Function setDoc() called with invalid data. Unsupported field value: a custom Map object (found in field tags in document 
``` 

では```setDoc()```でどんなオブジェクトを更新しようとしていたかというと、

```js
async saveProfile(user){
  try {
    const obj = {...user}
    // --- abbr ---
    let tags = new Map();
    tags.set(user.basic.gender, true);
    tags.set(user.basic.isTeacher, true);
    obj.tags = tags;
    
    await setDoc(docRef, obj, { merge: false });
  } catch(e) {
    console.log(e);
  }   
}
```

Firestoreからドキュメントを取得(user)し、フィールドの値を```tags```というMapオブジェクトとして保持することで、タグ検索を行うというものでした。
（FirestoreではタグのAND検索クエリを実行できないため、この形を取っています。）

Firestoreのフィールドには既にMapを設定できているのに、なぜこのエラーが発生したのかが分からず困っていました。

というか、そもそも```new Map()```で宣言したものが、Map Objectではなく custom Map Object となる理由が分かりませんでした。
[JavaScriptのリファレンス](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Map)を見ても、Mapの宣言に問題があるようには思えませんでした。


# コンソールで既存のMapフィールドと比較すると違いが分かった

Firestore上でMapフィールドと表示されているものをコンソールで見てみると、理由が分かりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1957294/908b414b-8602-91a8-164c-4841a1b4bf78.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1957294/c74a2e90-a087-624c-6160-d72a72989e25.png)

これで一発でした。
Cloud Firestoreのダッシュボードから見るとマップと書かれたものが、実際にはオブジェクトなんですね。
いや、よく考えてみたら自分でオブジェクトとして入れてたんですが。

という事で、[公式リファレンス](https://firebase.google.com/docs/firestore/data-model?hl=ja#documents)を見てみると、
> ドキュメント内の複雑なネストされたオブジェクトはマップと呼ばれます。


# Firestoreではオブジェクトを「マップ」と呼んでる

僕の理解が及んでいないのか何なのか分かりませんが、とりあえず現状の理解としては

・Firestoreが言う「マップ」は```Object```のこと。
・「マップ」は```Map```オブジェクトの事ではない。

と解釈しました。
自分でコードを書いたりドキュメントを読んでいくうちに、マップなのかオブジェクトなのか分からなくなってしまっていたようです。
マッピングとかそういう意味での「マップ」なんでしょう。

理解が足らなかったようなので、精進したいと思います。
【JavaScript】関数は実行可能なオブジェクトである

# はじめに
改めて``JavaScript``の基本を学び直している。
その中で学んだ内容のメモ兼学習アウトプットです。

基礎的な部分を学び直すと、色々なところで「なるほど〜」とわかった気になって楽しいです。笑

# 関数もオブジェクトである
``JavaScript``のデータ型は大きく**プリミティブ型**と**オブジェクト型**に分けられる。
参考：https://qiita.com/makotoo2/items/9566cebf205ef8b42505

関数も例外ではなく、オブジェクト型に属する。
そのため、基本的にオブジェクトと同様の機能をもつ。

そして**関数は実行可能なオブジェクト**である。


# サンプルコード

まず関数を定義する

```js
// 関数funcを定義
function func() {
  console.log("funcを実行");
}
```

### 値を格納できる
通常のオブジェクトと同様に、関数にも値や関数を格納することができる。

```js
// 関数funcに値（prop）と関数（method）を格納する
func.prop = 10;
func.method = () => {
  console.log("methodを実行");
};

// funcを実行
func();
// func.propの中身を確認
console.log("func.prop：", func.prop);
// func.methodを実行
func.method();
```

**コンソール**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621162/057c3da5-b28f-1120-b75f-fd9170833483.png" width="300">


``関数func``の中身を確認してみる。

```js
// 関数funcに値（prop）と関数（method）を格納する
func.prop = 10;
func.method = () => {
  console.log("methodを実行");
};

// func の中身を確認してみる
console.log({ func });
```

**コンソール**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621162/9f516a38-12e6-5149-d236-350e55f802d5.png"  width="380">


ちゃんと格納した値``prop``と関数``method``が入っていることが確認できる。

### 実行可能なオブジェクトである
関数は``()``をつけることで処理が実行されます。

```js
func();
func.method();
```

# 最後に
いつもありがとうございます！

参考にさせていただきました！

- https://www.udemy.com/course/javascript-essence/
- https://qiita.com/makotoo2/items/9566cebf205ef8b42505
- https://qiita.com/yoshi389111/items/245df2d642e49d2acf3a
【社会人受験者向け】応用情報技術者試験、勉強方法を振り返る

10/10にR2年の応用情報技術者試験が終わりました。
私も受験してきましたが反省点も多く、出題傾向を簡単に分析しつつ振り返っていく記事です。この記事は主に、「応用情報とりたいけど勉強時間がそんなに取れない・・・」そんな社会人受験者の皆さんに実際の受験者から反省点を共有する記事です。
※本内容についてはあくまで個人の感想です。

-目次-
1.[午前問題を集中的に練習しろ！！](#午前問題を集中的に練習しろ)
2.[過去問の計算問題は確実に抑える！！](#過去問の計算問題は確実に抑える)
3.[広く勉強しすぎるな！！](#広く勉強しすぎるな)

##午前問題を集中的に練習しろ
「午後問題は難しい」と解説するサイトは多く、事実難しいです。しかし、今回受験した感想として**「午後問題は慣れる程度の勉強でよい」**と感じました。理由として2つあります。

【理由1】午前問題の綿密な対策が午後問題の対策にも繋がる！
　午後問題は午前問題の応用です。時間に余裕があるならともかく、「仕事しながら勉強なんて時間が足りないTT」なんて社会人の受験者は多いかと思います。ひたすら午前問題の練習をすることが午後問題の対策につながる部分が多いと思います。

【理由2】午後問題の対策は慣れることが何より大事、知識は午前問題で！
　午後問題は選択式で、どの問題を解くかという戦術も重要です。参考書を通して知識を入れ込むことよりも、基礎をしっかり押さえた上で、あらかじめ2年分程度の過去問を通して問題に慣れておくことが重要でしょう。

例えば、午後問題のネットワーク分野であれば、知識としてはOSI参照モデル、WAFやLSI等の基本的なセキュリティ知識を押さえておくことが重要です。しかし、そういった知識は午前問題を練習していれば意識せずとも覚えることになるでしょう。

##過去問の計算問題は確実に抑える
正直、計算問題はすべてサービス問題です。最低限、過去問にでてくる計算問題は確実に解けるようにしておきましょう。午後問題に出てくることも多いです。

下記パターンは少なくとも確実に抑えておきましょう。
・MTTR/MTBRの計算問題　→　R2年秋 問56、H31春 問13
・A/D変換器の計算問題　→　R3年春 問3、R2年秋 問24、R1秋 問20、H31春 問22
・処理性能の計算問題　→　R3年春 問9、R2年秋 問12、H31 問15
・CPU使用率、処理能力問題　→　R2年秋 問15、R1秋 問15
・ターンアラウンドタイムの計算問題　→　R3年春 問16、R2年秋 問32、H31春 問14
・データ送信量の計算問題　→　R2秋 問25、R1秋 問31、H31春 問10
・M/M/1の待ち行列モデルの計算問題　→　R1 問3

上記を見るだけでも、H31春～R3秋までの2年間で同じような問題が何度も出ていることがわかります。これらの問題は、本番では確実に落とせない問題になるでしょう。

##広く勉強しすぎるな
　いざ午前問題の対策をしようにも、応用情報技術者試験は範囲が広すぎます。Oracle資格やMCP試験であれば参考書を隅から隅まで覚えることもできましたし、結果に強く結びつく勉強法でした。しかし、応用情報に至っては参考書の範囲が広すぎる！しかも、***参考所外から出題される問題もザラにある状態***です。なので、時間のない社会人受験者にとっては過去問に出てくる用語を選択肢まで隅々まで理解することが先決でしょう。

それでは、具体的にR3で出題された単語を例にどういった問題が複数回出題されているのか見ていきましょう。

■CASE1 フールプルーフ　「過去に何度も出る類似問題がある」
システムの信頼設計に関する問題は過去に何度も出題されています。R3 秋に出題された問ですが、過去2年間でもR3春 問13、R1秋 問16、H31春 問47とR2以外のすべての試験で出題されています。こういう問題は完璧に抑えておきたいですね。
他にもPMBOKに関する問題や耐タンパ性の問題等いろいろありますね。

□CASE2 ウォッチドックタイマ 「まったく同じ選択肢、問題文の問題が出ることもある」
R1 秋 問21にてウォッチドックタイマの機能について問う問題が出題されています。全く同じ内容がR3 秋でも出題されました。一度出題された単語を抑えることの重要性が伺える例です。
他にも、バーンダウンチャート、スラッシングやラジオシティ法などの問題で過去に文脈、選択肢すら同じ問題が出てきます。

■CASE3 スクラムマスタ 「直近の試験との類似問題も出題されることがある」
スクラムチームにおける各役割に関する問題は、午前問題では過去3年間ではあまり見ることがなかった問題ですが、前回のR3春 問49で出題されました。続いて、R3秋でも出題されており連続で同じような問題が出題された例となります。直近の過去問もしっかりと練習しておきたいですね。

####まとめ
応用情報技術者試験では、過去出てきた問題を1問1問を外さないことが重要です。
勉強時間の少ない社会人受験者にとっては、午前問題の過去4年分(できれば過去5年分)に出てくる言葉をすべて理解しておくことが先決です。間違っても、某参考書に乗っているような「サイバー攻撃の手法」をすべて覚える必要はありません。午後問題はあまり時間をかけず、2年分を一通り解いておく程度にしておきましょう。
環境変数の設定とPATHを通す方法

C、C++のコンパイラを使う際に、PATHを通す方法です。

①下の検索で「path」と入力して、「Enter」キーを押します。

②下の画面で「環境変数」をクリックします。

![1111111.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/1ef5a4e9-f5e7-df80-c2fc-2922bf5c626c.jpeg)

③USERユーザーの環境変数で「新規」ボタンをクリックします。

![2222222.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/7eae271c-867a-a522-440a-e94096d716ab.jpeg)

④上の欄に「Path」、下の欄にフルパスを入力します。

![3333333.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/2ed0763e-8f25-7cb6-68c9-606b34ac48f3.jpeg)
Node.jsでディレクトリを再帰的に作成/削除するのにmkdirpやrimrafはもう必要ない

Node.jsでディレクトリを再帰的に作成するためのnpmパッケージとして[mkdirp](https://www.npmjs.com/package/mkdirp)、ディレクトリを再帰的に削除するためのnpmパッケージとして[rimraf](https://www.npmjs.com/package/rimraf)がありますが、現代のNode.js（[v14.14.0](https://nodejs.org/dist/v14.14.0/docs/api/)以降）において、それらはもはや必要ありません。

## ディレクトリを再帰的に作成する方法

`mkdir -p`のようにディレクトリを再帰的に作成するには、[fs.mkdir](https://nodejs.org/api/fs.html#fs_fs_mkdir_path_options_callback)の`recursive`オプションを使います。

```js
const fs = require('fs')

await fs.promises.mkdir('path/to/dir', { recursive: true })
```

なお、`fs.mkdir`に`recursive`オプションが追加されたのは[v10.12.0](https://nodejs.org/dist/v10.12.0/docs/api/)です。


## ディレクトリを再帰的に削除する方法

`rm -rf`のようにディレクトリを再帰的に削除するには、[fs.rm](https://nodejs.org/api/fs.html#fs_fs_rm_path_options_callback)の`recursive`オプションと`force`オプションを使います。

```js
const fs = require('fs')

await fs.promises.rm('path/to/dir', { recursive: true, force: true })
```

なお、`fs.rm`が追加されたのは[v14.14.0](https://nodejs.org/dist/v14.14.0/docs/api/)です。
【Apex】【エラー】System.ListException: List index out of bounds

#やろうとしたこと
とあるクラスのインスタンスを作ると、itemsにデフォルトで4要素追加される。
removeItemsメソッドはデフォルト4アイテムのうち2～4番目を削除する。

↓例えばこんなかんじ

```
public class piepie001 {
    // なんかリスト
    List<string> items = new List<string>();
    
    // コンストラクタ
    public piepie001(){
        // デフォルトでアイテム4つを追加
        items.add('a');
        items.add('b');
        items.add('c');
        items.add('d');
    }
    
    // アイテム削除
    public void removeItems(){
        // 2～4番目のアイテムを削除
        items.remove(1);
        items.remove(2);
        items.remove(3);
    }
}
```

#エラー
上記のコードでremoveItems()を実行すると、、

`System.ListException: List index out of bounds: 3`

が発生する

前の要素から削除すると要素数減るので
items.remove(3);でそんな要素ねえ！と怒られるわけです。

#修正
しょうもないミスでした、気を付けます。

```
    // アイテム削除
    public void removeItems(){
        // 2～4番目のアイテムを削除
        items.remove(3);
        items.remove(2);
        items.remove(1);
    }
```
ローカル開発環境でDBが必要なときに使う手法(私的)

```yml:docker-compose.yml
services:
  api:
    image: python:3.11
    ports:
      - "8001:8000"
    volumes:
      - ./backend/app:/app
      - ./backend/static:/app/static
    environment:
      - DATABASE_URL=mysql+pymysql://root:password@mysql:3306/database
    depends_on:
      mysql:
        condition: service_healthy
    working_dir: /app
    command: >
      bash -c "pip install -r requirements.txt &&
      python -m alembic upgrade head &&
      python main.py"

  mysql:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_USER=user
      - MYSQL_PASSWORD=password
      - MYSQL_DATABASE=database
      - TZ=Asia/Tokyo
    volumes:
      - ./database/data:/var/lib/mysql
    ports:
      - 3306
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-ppassword"]
      start_period: 10s
      interval: 10s
      timeout: 5s
      retries: 10

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:5.1.1
    depends_on:
      mysql:
        condition: service_healthy
    ports:
    - 8081:80
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=password
      - PMA_PORT=3306
```

![2021-10-16_06h28_30.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/936879/a5fc5c36-fa89-e102-2ba3-e5164cbae7bd.jpeg)
「リーダブルコード」を読んだので、その要点

## [リーダブルコード](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655) 「鍵となる考え」

<img src="https://images-na.ssl-images-amazon.com/images/I/51MgH8Jmr3L._SX352_BO1,204,203,200_.jpg"  width="20%" height="20%" />

からなるほどと思ったところのピックアップです。

### 1.5 でもやるんだよ

- 「コードは他の人が最短時間で理解できるように書かなければいけない」
- 「他の人」というのは、半年後の「君自身」かもしれない
- 「最短時間で理解できるように」は効率化とかその他の目標とは競合しない
- 理解しやすいコードは優れた設計やテストにつながる

大変なことだ
でもやるんだよ

### 2章 名前に情報を詰め込む

- 名前に情報を詰め込む
    - 明確な単語を選ぶ
    - 名前が「他の意味と間違えられることはないだろうか？」と自問自答する
    - 一貫性のあるスタイルは「正しい」スタイルよりも大切
    - コメントの目的は書き手の意図を読み手に知らせること
    - コードからわかることを書かない
    - コードを理解するのに役立つものを書く
- 複数のものを指す可能性のある「それ」や「これ」などの代名詞を避ける
    - 関数の動作はできるだけ正確に説明する
    - コメントに含める入出力の実例を慎重に選ぶ
    - コードの意図は、詳細レベルではなく、高レベルで記述する


### 7章 制御フローを読みやすくする

- 条件式の引数の並び順
    - 「もし君が１年間で10万ドル以上稼げるならば」は自然
    - 「もし君が18歳以上ならば」も自然
    - しかし「もし18歳が君の年齢以下ならば」は不自然
    - 行数を短くするよりも、「他の人」が理解するのにかかる時間を短くする。


### 12章 コードに思いを込める

- 解決策を言葉で説明する。
- ある大学の計算機センターにある方針。デバッグに悩む学生は、部屋の隅に置かれたテディベアに向かって説明しなければいけない。声に出して説明するだけで、学生は解決策が見つかる。この技法はラバーダッキングとも呼ばれる。


### 14章 テストとよみやすさ

最も読みやすいコードは何も書かれていないコードだ

### 解説

- 実際にやる
- 当たり前にする（続ける）
- コードで伝える

あなたには仲間が増える

## 参考記事

https://qiita.com/HiromuMasuda0228/items/f80e4ac45b9160c33013

https://gist.github.com/AKB428/b8970cea987577ec93c2

https://qiita.com/app_js/items/2176cfad20d4d86a2398


## まとめ

自分で書いていて、ポエム味のある書き込みになってしまったなあと思いつつ、これは実際の本に書かれているキーポイント。共感しやすいものばかりだなと思いました。

https://twitter.com/e99h2121/status/1448710484388024320?s=20

以上参考になればさいわいです。
Vulkanをインストールするだけ

なんだかんだでVulkanに興味を持ったのでこれからぼちぼち勉強していこうかなと。

#・Vulkan Driver（NVIDIA）をダウンロード
自分はGeForce使ってるので[ココ](https://developer.nvidia.com/vulkan-driver)から落とした。
難しい手順もなかったので詳細は省略 (^^ω)

https://developer.nvidia.com/vulkan-driver

<br>
#・公式 からvulkan SDKを落とす
[ココ](https://vulkan.lunarg.com/)から落とした。
自社広告+Learn moreの文字が主張激しくてどこからDLするんだって思ったけど、下にスクロールしたら普通にあった。
cookies承認のUIもあるので更に隠れてて余計に分からんかった。

https://vulkan.lunarg.com/


###＊ インストーラを起動
![Vulkan SDK 1.2.189.2 設定 2021_10_16 1_19_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2176879/c967bf90-0d84-2f78-3209-ab47f3dfadfd.png)
基本は何もチェック入れずで良いっぽい、でもシェーダーも少し触ってみようかなと思っているので自分はDebuggable Shader API Libraries(64bit) も追加で入れてみる。
~~…使い方分からなくて投げ出して使わなさそうだけど。~~
<br>
![NOTICE 2021_10_16 0_02_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2176879/00c910fe-ee29-5d90-e098-da9b335f7eca.png)
一瞬エラー吐いたのかと思った。ダウンロードが終わると出てきた。
ダウンロードしたバージョンより前のSDKをインストールする際は一番最後にインストールしたバージョンを消さないといけないらしい。
アンインストール策としてwindowsのアプリ設定から消すかSDKのフォルダ中の maintenancetool.exe を起動するかの2つが挙げられてる。

自分はフォルダ直削除するかなあ。

#・デモを動かしてみる（動作確認）
インストールしたSDKのフォルダ内のversion(自分の場合は1.2.189.2)/Demosがあったのでその中にあったソリューションファイルを開いてみる。
<br>
x64ビルドで無事に起動；； 箱が高速回転してる、スペースを押すとランダムで止まる。
![Vulkan Cube 2021_10_16 2_26_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2176879/04ad8007-ce9c-578f-cca3-1807f0fffccd.png)
ただ右下見てもらったら分かるけど、ウィンドウの端を掴んでサイズ変えてみたら描画範囲が後ろのvisual studioが透けて見えたり等バグってた。もう一回ウィンドウバーなりドラッグすると直るけど。
<br>
<br>
<br>
<br>
<br>
<br>
#・Qiitaの書式を少し勉強(全く関係ない)
↓参考記事  ありがとうございます。

https://qiita.com/shizen-shin/items/a997bc228fa2850c9fce

https://qiita.com/zakuroishikuro/items/f33929eab9d55c5bd073

・#を付けると見出し文に、#の数によって大きさも変えれる。
・ラムダ式みたいに[]はテキスト、()にurlで埋め込みができる。
###・[コーラvsペプシ派](https://j-town.net/2019/01/18270532.html?p=all)

|[]()|コーラ派|ペプシ派|
|---|---|---|
|日本全体|65%|35%|
|大阪のみ|45%|55%|
|埋め込みも|できる|[よ～ん](https://ja.wikipedia.org/wiki/%E3%82%93)|

<details><summary>詳細</summary>
<font color="Lavender">なにもないよ～ん (^^ω)</font>
(↑ font color="color" で色を変えれます)
`rgb(250,180,50)` <- なにこれ
</details>

###・ソースコード(```で囲むと中を強調できる)
・```の中でC++:と書くとC++に対応した色を付けてくれる。
ソースコードを書く時とかに便利。

```C++:"セミコロンの後にタイトルを入力"
int j = 0;
for(int i = 0; i < 16; ++i)
{
  j *= i + 1;
}
std::cout << j << std::endl; // cout派です
```
...この中でtab使えたらいいけどなあ。
でもまあ、htmlの機能も使える事を知って書くのが楽しくなってきた。
<br>
<br>
#・さいごに
脱線したけど、次からvulkanを少しずつ触っていこうかなと。
大変だろうけど頑張りたい。
話題のプログラミングスクール【テックキャンプ】を受講した感想

#はじめに
今回は技術的なお話ではなく、汎用機エンジニアとして5年半、銀行のシステム部門として約1年勤めた私が**テックキャンプ**を利用して学習と転職活動を行なった感想です。

#テックキャンプとは
公式HPは[こちら](https://tech-camp.in/expert?utm_source=google&utm_medium=ls&utm_campaign=name&gclid=Cj0KCQjwqp-LBhDQARIsAO0a6aJwV1r0wRUc3e3agCxrXfKO9_BlENOEq8IJjYh04V1RZH-xyzSX9i0aAugzEALw_wcB)。

主にIT業界未経験の方向けのプログラミングスクールです。ITエンジニアを目指すコースやWebデザイナーを目指すコースがあります。学習期間も夜間休日のみで長期にわたり学習するか、1日11~12時間の学習を前提とした短期集中のどちらかを選ぶことができます。オンライン学習が主体ですが、渋谷などにある教室を利用できるプランもあります。
転職支援ありを選ぶと学習カリキュラムの提供や支援だけでなく、学習終了後の転職活動のサポートもしてくれます。

金額は他のプログラミングスクールに比べお高めですが受講の１ヶ月前までにハローワークで申請すればある程度教育訓練給付金の対象になる可能性があるそうです。（私は対象だと知らなかったので全額自腹で払いました・・・無料カウンセリングのときに教えてくれ・・・。つい最近対象になったのかもしれませんが。）

私は短期集中、教室利用なしのITエンジニア転職コースを受講しました。

#学習内容の感想
カリキュラム、学習スタイルの感想です。
###良かった点
- 学習する技術が幅広い
- 実務に近い学習ができる
- 時間割学習制度が密度の濃い学習に効果的

フロントはHTML/CSSからJavaScript、サーバサイドはRubyと、「一人でWebアプリケーションを一から構築する」ことを目標としているだけあり学習範囲が広いです。DB操作やHerokuやAWSを用いたデプロイ等、コードを書くということだけで終わらないようになっています。
また、フレームワークを使った構築、チーム開発を想定したGithubでのコードレビューなどができる点は私が数あるスクールの中で特に魅力に感じ、受講を決めた部分でもあります。

時間割学習の詳細は説明を省略しますが、人間の集中の持続する時間や知識の定着に着目したテックキャンプオリジナルの学習サイクルに則り学習を進めるというものです。
エンジニア気質の人ほど休憩もせずにエラーに立ち向かいがちですが、やはり効果的な知識の定着というのは休憩やアウトプットが必要で、よく考えられたサイクルだなと思いました。

###悪かった点
- メンターさんが熟練エンジニアではない
- わかりやすさ重視でカリキュラムの解説が甘い部分がある
- 時間割学習運営で学習そのものに影響が出る

通年開校している訳ですから無理なものは無理なのでしょうが、技術質問を受け付けてくれるメンターさんたちは企業で現役バリバリに働いているエンジニアではないです。おそらく卒業生や、情報系の学部に在籍中の学生さんが多数なのではないでしょうか。私はあまり質問すること自体なかったですが、たまにお願いしても疑問が解消されることがほぼなかったです・・・。

時間割学習は良かったのですが、時間割学習を運営するためにチームを作り当番制で役割を回していました。しかしながら様々な個人の事情(家庭のことや健康のこと)があるため、どうにも当番の負担が大きい人とそうでない人が出てきます。通常の企業であればその辺りを上司というか組織が間に入ってうまく立ち行かせるものですが、その部分のサポートは不十分であったと思います。結果、そのチーム運営自体が負荷となり学習に影響が出ることもありました。個人的には一番不満だったところです。

#就職活動支援の感想
学習期間から応募書類の添削や模擬面接があり、学習修了後は求人の紹介や相談にのっていただけます。

###良かった点
- 学習期間から就職活動を意識せざるを得ないため効率的にポートフォリオが作れる
- 就職活動期間中、週に一度ペースで相談できる

卒業課題が終わった後は修了日までオリジナルアプリの実装期間に入るのですが、常にゴールを学習完了ではなく就職として意識しているので、「どういうものを作れば自分の力が見せられるか」「自分のアピールポイントは何か」を考えながら実装に取り組めたと思います。なんとなく作って結局差別化できるものができなかった、という事態になりません。

就職活動は苦しいし、孤独です。そんな状況で週に一度、進捗の確認や不安に思っていることをキャリアアドバイザーの方に相談できる時間は貴重でした。特に私を担当してくださった方は明るい方で取り止めもない雑談をするだけでも気分転換になり、感謝しています。

###悪かった点
- 求人数が少ない（30代以降向けの求人はさらに少ない）
- 連絡が遅い

typ○転職やリク◯ビといった転職支援を主たる事業としている会社とは違い、そもそも保有している求人が少ないです。テックキャンプからの求人紹介にはあまり期待せず自分で探した方が良いです。（それを推奨されます。）
またやはり20代をターゲットにしている部分が大きく、若年層に限定した求人が多いようです。私は30代ですが、体感としてこの年齢でテックキャンプに挑戦したことや学習内容を好意的に思ってくださる企業が多かったので、もっと営業かけたら求人も増えるんじゃないかな・・・と思っています。

各種連絡がとにかく遅い点は非常に気になりました。選考結果等、問い合わせると実は企業からは返事が来ていたけど滞っていたんだな・・・と思う場面は何度もありました。通常転職エージェントサービスなどを利用するとまずないことなので、改善して欲しいところです。

#おわりに
良かったところ、悪かったところ率直に挙げてみました。
総括して、やはり一番は２０代以下でエネルギーがあるIT初学者の方におすすめかなと思います。他の受講者の方では大学生さんも多く、コロナ禍で留学に行けず、サークル活動やアルバイト、ボランティアにも力を入れられない中でITを学ぶという選択をしていることには非常に感心しました。

とはいえ、私自身も受講して本当に良かったですし人生を変える舵を切れたと思います。
この記事が受講を迷っている方の手助けになれば幸いです。迷ったらやりましょう。
AmberのGetting Startedをやってみたら詰まった話

# はじめに
Rubyに似た構文を持つ静的型付けのコンパイル言語[Crystal](https://github.com/crystal-lang/crystal/)を知って、少し触ってみようとCrystalのWeb Frameworkである[Amber](https://github.com/amberframework/amber)の[Getting Started](https://docs.amberframework.org/amber/getting-started)をやってみたら動かなかったのでどうにかしたときの備忘録です。

WSL2上で行ったため、WSL2のタグをつけていますがWSL2特有ではないと思います。

# バージョンなど
- OS Ubuntu20.04
- Crystal 1.2.0
- Amber 1.0.0rc2


# Amberのインストール
[AmberのGitHub](https://github.com/amberframework/amber)にあるインストール方法はmakeでエラーになります。原因は`shards install`をしていまいと`shard.lock`が存在しないためです。また`make install`は権限を要求するので正しくは下記のようにインストールする必要があります。

```bash
sudo apt-get install libreadline-dev libsqlite3-dev libpq-dev libmysqlclient-dev libssl-dev libyaml-dev libpcre3-dev libevent-dev
curl -L https://github.com/amberframework/amber/archive/stable.tar.gz | tar xz
cd amber-stable/
shards install
sudo make install
```

# `Error: undefined constant GarnetSpec::Controller::Test`
`amber watch`を実行した際に上記のエラーが発生しました。[garnet_spec](https://github.com/amberframework/garnet-spec)に由来するもののようだが原因はよくわからなかったです。`shard.yml`の記述を変更し、`garnet-spec`のバージョンを`0.2.1`に変更することでエラーが消えます。

```yml
development_dependencies:
  garnet_spec:
    github: amberframework/garnet-spec
    version: 0.2.1
  ameba:
    github: crystal-ameba/ameba
    version: ~> 0.13.4
```

`shard.yml`編集後以下を実行

```bash
shards install
```

# `--: 1: npm: not found`
`amber watch`はnpmが必要らしいです。普通に`npm`をインストールすればいいです。

```bash
sudo apt install npm
```

# 最後に
とりあえずCrystal&Amberが触れる環境が作れたのでこれからいろいろ試してみたいと思います。
Rubyと似ているので学習コストは低そうな気がする？
AmberもRailsに大分似ているので意外と簡単に使えるかもしれない。(~~ただ、Rails7でだいぶフロントエンドが変わるらしいのでどっちがいいとか言いにくい感じがある~~)
obnizで「10秒当てゲーム」

obnizを購入し、順番にパーツを触っていると、ボタンを見つけました。
ボタンを見ると、皆思わず押したくなるものと思います。
obnizのボタンのページにあるコードを実行すると、押した時間が表示されており、2回測定しその時間差分を図れば、昔懐かしの「ストップウォッチで10秒当てゲーム」が作れるのではないかと思い、制作してみました。

下準備
①　obnizスターターキットの用意
②　obnizの端子にパーツを接続
　　　　ボタン：signal:0, vcc:1, gnd:2
　　　　LED信号：gnd:8, green:9, yellow:10, red:11

実行
　obniz HTMLエディタを開き、以下のコードを入力。

```html
<html>
  <head>
    <script src="https://unpkg.com/obniz@3.x/obniz.js"></script>
  </head>
  <body>
    <script>
      var obniz = new Obniz("OBNIZ_ID_HERE"); // ここに自身のobniz IDを入力する

      obniz.onconnect = async function () { 

var button = obniz.wired("Keyestudio_Button", {signal:0, vcc:1, gnd:2});
var light = obniz.wired("Keyestudio_TrafficLight", {gnd:8, green:9, yellow:10, red:11});

   obniz.repeat(async ()=>{
        await button.stateWait(false); 
        light.green.on();
        start=new Date();
        await button.stateWait(true); 
        light.green.off();

        await button.stateWait(false); 
        stop=new Date();

const va = stop-start
console.log("time: " + va/1000 + "秒");

      if(va <9000){
            light.single("red"); // red
            console.log("早いです。");
            await obniz.wait(1000);
            light.red.off();
      }else if(va >9000 && va <9500){
            light.single("yellow"); // yellow
            console.log("惜しいです。");
            await obniz.wait(1000);
            light.yellow.off();
      }else if(va >9500 && va <10500){
            light.single("green"); // green
            console.log("良いです。");
            await obniz.wait(1000);
            light.green.off();
      }else if(va >10500 && va <11000){
            light.single("yellow"); // yellow
            console.log("惜しいです。");
            await obniz.wait(1000);
            light.yellow.off();
      }else {
            light.single("red"); // red
            console.log("遅いです。");
            await obniz.wait(1000);
            light.red.off();
    }
   }, 0);
  }
    </script>
  </body>
</html>
```
https://twitter.com/21HideK/status/1449306464737107975

遊び方
　ボタンを押すと開始（青LEDライトが一瞬光る）、もう一度ボタンを押すと停止。その間の時間を10秒とできるか試す。
　【評価】
　9.0秒以下ならば、赤LEDライトが光り、「遅いです。」と表示
　9.0-9.5秒ならば、黄LEDライトが光り、「惜しいです。」と表示
　9.5-10.5秒ならば、青LEDライトが光り、「良いです。」と表示。
　10.5-11.0秒ならば、黄LEDライトが光り、「惜しいです。」と表示
　11.0秒以上ならば、赤LEDライトが光り、「遅いです。」と表示。


工夫を要した箇所
　①ボタンを押した時点の時刻を知るため、new Date(); （現在時刻を知る）を用いた。

　②繰り返しゲームを行うため、for文やwhile文を使うことは出来たが、
　　「obniz.repeat」　というものを知り、こちらを使ってみた。

※以下、@wicketさんの「obniz.repeatが便利なのにあんまり使われていない気がする話」を引用。
obniz.repeatって何？
　obniz.repeatはobnizで繰り返し処理をするときに設定する関数です。
　arduinoで言うところのloopですね。

　ずっと繰り返してくれる＝無限ループだ！　ってことで while(true){} と同じだと思われるんですが、
　実ははうらで色々やってて、

　・obnizデバイスとの接続が切れたら自動で止まるように
　・内部でエラーが出ても止まらずに次のループを動かしてくれる
　という機能もついています

　③判定の設定は、検証しやすいように緩い設定にしているが、
　　設定幅を狭めることによりゲームの難易度を上げることが出来る。
ABC180 C - Cream puff から学んだ

https://atcoder.jp/contests/abc180/tasks/abc180_c

![abc180c_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/166bf53e-6e0a-a057-b5a9-9e5959a36d15.png)
![abc180c_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/5777b8d2-ec02-a670-30dd-78ea8e425319.png)
![abc180c_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/2b731773-ea2a-79ad-67bb-ae61e40148c7.png)
![abc180c_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/8ff884d9-d939-d39c-1004-59d1c7738272.png)

WA が抜けない。
他の人の回答を読んで叫ぶ(笑)

```abc180c.py
#before #144ms
from math import *
N = int(input())
lis=[]

if N == 1:
    print(1)
    exit()
for i in range(1,floor(sqrt(N))+1):
    if N%i == 0:
        lis.append(i)
        lis.append(N//i)
lis = list(set(lis))#<= ココ を忘れると WA
lis.sort()

for ans in lis:
    print(ans)

#after #117ms
def solv():
    N = int(input())
    lis = []
    from math import floor
    for i in range(1,floor((N)**0.5)+1):
        if N%i == 0:
            lis.append(i)
            lis.append(N//i)
    lis = list(set(lis))
    lis.sort()
    for ans in lis:
        print(ans)
solv()

```

ちょっとだけ改善した。
解答を眺めていたら猛者を見つけました。

https://atcoder.jp/contests/abc180/submissions/17502284
GPS付きミニNTPサーバー

##元ネタ
https://www.elektormagazine.com/labs/mini-ntp-server-with-gps

![IMG_8104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181687/cbd15380-514e-cc87-02ae-dacbda6e809f.png)

##ハードウェア
・ESP32
・SSD1307
<del>・DS3231</del>
・GPSモジュール

数年前くらいに流行ったWemos Lolin ESP32 OLEDにGPS繋げば、とりあえず動きます。
*このボードの場合、書き込み時にBOOT押しながらEN押してリセットすると書き込みできます。
DS3231は繋げてみたけれども、CPUパニックになるので使えませんでした。

##配線

GPS-ESP32
PPS-GPIO 25
TX-RX GPIO 13
RX-TX GPIO 15
GND-GND
5V-5V

DS3231-ESP32
SDA-SDA GPIO 5
SCK-SCK GPIO 4
GND-GND
3.3v-3.3v

##モジュール
公式によると以下のモジュール

U8G2 by oliver
Time by Michael Magolis
Ticker by Bert Melis
TinyGPS++ ( https://github.com/mikalhart/TinyGPSPlus )
RTCLib by Adafruit
ArduinoJson 6.10.0
CRC32 by Christopher Baker

ArduinoのボートマネージャーからTinyGPS++以外はインストールできます。
TinyGPS++はgithubからzipをダウンロードしてきて、Arduinoに入れるパターン。
ArduinoJson 6.10.0だとうちの環境ではエラー出るので、ArduinoJson 6.10.1を入れました。

##ソース修正

```Firmware.ino
83行目 #define  GPSBAUD ( 9600 ) #GPSモジュールとの通信速度。
130行目 bool pps_active = true; #PPS
687行目  DateTime now = (0,0,0,0,0,0);
```

##Arduino ESP32 filesystem uploader
index.html等をアップロードするツール。
https://github.com/me-no-dev/arduino-esp32fs-plugin

ダウンロードしたzipを解凍して、README.mdの指示にしたがってプラグインを設置。
OSXの場合は/Applications/Arduino.app/Contents/Java/tools/以下に、ESP32FSディレクトリをコピーし、Arduinoを再起動。
設置に成功すると、ツール→ESP32 Sketch Data Uploadの項目が増えているので、クリックするとindex.html等をアップロードできます。

##WiFiで接続して設定を入れる
Elektor NTP Serverの名前でWiFi APがあるので接続、Webブラウザで192.168.4.1にアクセスし、設定を入れる。
タイムゾーンやWiFi設定やネットワーク周りの設定ができます。
Arduinoライブラリを眺めるとAvahiも入ってるっぽい？んですが、設定等はどこにあるんだろう？
Nuxt3（beta）をDocker上で構築した時に詰まったポイント

# 概要

2021/10/12にNuxt3がリリースされました。
早速触ってみようと思い、今回は最近よくDocker上に開発環境を構築することが多いので、せっかくならNuxtもDocker上に構築しようと思いました。
ただ、初期設定で少し詰まった部分があったので、備忘録もかねてまとめようと思います。

https://v3.nuxtjs.org

# 構成

まずは、下記のような構成でファイルを作成します。

```
nuxt3-docker-app
  ├ docker-compose.yml
  ├ node
  │  └ Dockerfile
  └ src
```

# 各ファイルの準備

Dockerの起動に必要な各ファイルを準備します。

## docker-compose.yml

今回はNode.jsのみ使用するので、必要な記述を記載します。

```yml:docker-compose.yml
version: '3'
services:
  node:
    build: node
    volumes:
      - ./src:/root/src
    tty: true
    environment:
      - CHOKIDAR_USEPOLLING=true
    ports:
      - '3000:3000'
```

## Dockerfile

Node.jsのバージョンとポートを記述します。

```Dockerfile:Dockerfile
FROM node:14.16.1

EXPOSE 3000
```

# Nuxt3をインストールする

* まずDockerをCompose Upで立ち上げます
* 次にNode.jsのContainerが起動しているので、Attach Shellします
* Attach Shellしたら下記コマンドを実行し、作業ディレクトリに移動します

```
cd root/src
```

* 下記コマンドを実行します（詳細は公式HPをご参照ください）

```
npx nuxi init 【アプリケーションの名前（今回はappとします）】
```

https://v3.nuxtjs.org/getting-started/installation

* 下記コマンドでディレクトリを移動します

```
cd app
```

* 下記コマンドを実行し、Nuxt3をインストールします

```
npm install
```

* インストールが完了したら、下記コマンドを実行し、開発サーバを立ち上げます

```
npm run dev
```

上手くいけば開発サーバが立ち上がりますが、私は以下のような問題が発生しました。

# 問題

## 開発サーバを立ち上げると無限リロードが起こる

開発サーバが立ち上がり、「 http://localhost:3000/ 」にアクセスすると画面は表示されますが、リロードが無限に起こってしまう問題が発生しました。
これでは、まともに開発出来ないので原因を調べたのですが、以下のようなコンソールエラーが発生していました。

![スクリーンショット 2021-10-16 0.19.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191403/afea909b-e409-d5b7-ecd8-ff9bd8bcb18f.png)

```
WebSocket connection to 'ws://localhost:24678/_nuxt/' failed:
```

解決方を探してみたのですが、Nuxt3が原因なのか、バンドルに使用しているViteが原因なのかなど原因を解明することは出来ませんでした。
ただ、エラーメッセージに表示されているポートをdocker-compose.ymlに追加することでこの問題が発生しなくなりました。

```yml:docker-compose.yml
version: '3'
services:
  node:
    build: node
    volumes:
      - ./src:/root/src
    tty: true
    environment:
      - CHOKIDAR_USEPOLLING=true
    ports:
      - '3000:3000'
      - '24678:24678' # 追加
```

上記のように「- '24678:24678'」を追加後、Docker Restartをして、先ほどと同様に開発サーバを立ち上げると正常に起動していることが確認できました。

# 成果物

今回作成したものは下記リポジトリにアップしました。

https://github.com/InumberX/nuxt3-docker-app/tree/main
[Android]コピペでできる！でバージョンアップを検出しよう！！

#初めに
アプリを開発しているときに、ユーザーにバージョンアップの情報を届けたいときや、バージョンアップによるデータの変更を一度だけ行いたい時があると思います。
その時にバージョンアップの検出を行いたいのだが、少しめんどくさいと感じたため、できるだけ手軽に、コピペだけでできるようにメモを残しておきたいと思った。

#内容
```kotlin
//        今のバージョン番号を取り出す
        val versionNow = PackageInfoCompat.getLongVersionCode(this.packageManager.getPackageInfo(this.packageName, 0))

//        シェアプリのインスタンス化
        val sp: SharedPreferences = getSharedPreferences("DateStore", Context.MODE_PRIVATE)
//        シェアプリから値を取り出す
        val vCode: Int = sp.getInt("VersionCode", 1)

//        値を比べてバージョンが上がっているか判断
        if(versionNow > vCode){
//        　　バージョンが上がっていた場合、新しいバージョン番号に上書きするための部分
            val editor = sp.edit()
            editor.putInt("VersionCode", versionNow.toInt())
            editor.apply()

            //更新時行いたい動作を下に書いていく。


　　　　}

```
ABC179 C - A x B + C から学んだ

https://atcoder.jp/contests/abc179/tasks/abc179_c

![abc179c_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/2d736667-6b0d-2d3d-5db4-ff238de6fbfe.png)
![abc179c_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/221222ad-0a87-1a48-3c20-aef18f2c56c5.png)

悩んだが、何とか出来た。

```abc179c.py
N = int(input())
cnt = 0
for b in range(1,10**6+1):
    if (N-1)//b >= 1:
        cnt += (N-1)//b
print(cnt)
```
Udemy「ネットワークエンジニアを目指す初心者はここから始めよう！「ゼロから学ぶネットワーク基礎」1015

Wide Area Network(WAN)

・離れたLAN同士を接続するためのネットワークのこと。

・通信事業者やサービスプロバイダが提供するサービスを使う。

・Wideと言ってもLAN同士の離れている距離は関係ない。


Local Area Network(LAN)

・自宅や学校、企業などが作るネットワークのこと。

・Localと言う言葉だが広さによる基準はない。

・ネットワークを利用者自身が管理する。


Unicast

一つの相手と通信



Multicast

一部の相手と通信



Broadcast

全員と通信



標準化

・異なるメーカー同士での接続ニーズ

・相互接続可能なルール作成



ユニーク　

・複数の中から一つを特定できることが重要。

・唯一の、たった一つのという意味。



IEEE

・アイ・トリプルー・イー

・電気・情報工学の技術の標準化

・IEEE 802.3○○（Ethernet)

・IEEE 802.11○○(無線LAN)

・IEEE 802.1Q(Virtual LAN)



IETF

・アイ・イー・ティ・エフ

・インターネット関連技術の標準化

・RFC(Request for Comments)

・アール・エフ・シー

・標準化された技術の文書化したもの

・RFC1918のように数字を組み合わせる



ICANN

・アイキャン

・IANA

・アイアナ

・アドレス管理

・IPアドレス(Version4)

・IPアドレス(Version6)

・ポート番号、ドメイン名を管理



ネットワークを使ってコンピュータ同士が通信するには標準化が重要。

ネットワークでは通信相手をユニークで特定できる必要がある。
【HTML/CSS/jQuery】iOSとAndroidのプッシュ通知を作ってみた。

## 初めに

業務で、iOSとAndroidのプッシュ通知をHTML/CSSで作ることになりました。

プッシュ通知をHTML/CSS作っている人がいなかったので、
自分で作ってみました。

Codepenを使用して、作成しています。
画面に埋め込むタイプだと、サイズが小さいので
Codepenのサイトで、触ってください。

## iOS版　プッシュ通知

https://codepen.io/wadakatu/pen/wveZQjw

<div align="center">
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838340/252d71cd-3ea6-b21b-b5ef-9e98b4408de5.png">
</div>



## Android版　プッシュ通知

https://codepen.io/wadakatu/pen/yLoYPjX


<div align="center">
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838340/1f5c0f7d-98ef-1091-98af-ed457b2c1f92.png">
</div>


## 最後に

色々、触ってみてください。
改良点などあれば、ぜひ教えてください。
同一ドメインで複数認証情報の対応方法

# 背景 

* 複数のAWSアカウントのcodecommitを利用している 
* HTTPSでcodecommitのリポジトリにgitで接続する時に、事前に認証情報を保存しておくと、同じドメインで複数の認証情報を登録すると、以下のエラーが起こる 

```
% git pull       
fatal: repository 'https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/xxxxxxx/' not found 
```
 

 

# 対策１- Mac OS X のパスワード管理 

* パスワードの管理方式を設定する 

```
git config --global credential.helper osxkeychain 
```

* プロジェクトにgit設定 

```
Cd path/to/project 

git config --local credential.https://git-codecommit.ap-northeast-1.amazonaws.com.username <YOUR USERNAME> 
```

* git pull実施をして、パスワードを入力して正常に使える

```
% git pull  

Password for 'https://username@git-codecommit.ap-northeast-1.amazonaws.com':/v1/repos/xxxxxx/
```

* パスワード保存場所 
    * キーチェーンアクセスアプリ 
    * ログイン -> gitで検索する 
    * git-codecommit.ap-northeast-1.amazonaws.comを押す 
    * Usernameとpasswordをみえる 

 

 

# 対策2 - ファイルに保存 

* パスワードの管理方式を設定する 

```
git config --global credential.helper store 
```

* プロジェクトにgit設定 

```
Cd path/to/project 

git config --local credential.https://git-codecommit.ap-northeast-1.amazonaws.com.username <YOUR USERNAME> 
```

* git pull実施 

```
% git pull  

Password for 'https://username@git-codecommit.ap-northeast-1.amazonaws.com':/v1/repos/xxxxxx/ 
```

* パスワードを入力して正常に使える 
* ユーザネームとパスワード保存場所 
    * ~/.git-credentials 
* デメリット 
    * パスワードが平文が保存される
【Go】mongo-go-driverでコレクションの全件を取得する

## 概要
MongoDBで全件検索したい時、[[Mongo] findメソッドのいろいろな使い方（MySQLと比較）](https://www.yoheim.net/blog.php?q=20150601)の記事にある通り単純にfindメソッドを使えばOKです。では、GolangでMongoDBを使用する際に使う、mongo-go-driverで全件取得するにはどうすれば良いのか。
[[Mongo] findメソッドのいろいろな使い方（MySQLと比較）](https://qiita.com/h6591/items/a1898bddb6819b27d88f#find%E6%9B%B8%E5%BC%8F)の記事を見ると、Findメソッドは`Find(context.Context, 検索条件, Find オプション)`とあり、検索条件の部分はnilを設定すれば良いのかなと思いnilを設定したところ、エラーとなりました。

## 対応
[こちら](https://pkg.go.dev/go.mongodb.org/mongo-driver/mongo#Collection.Find)のドキュメントを読むと、
`The filter parameter must be a document containing query operators and can be used to select which documents are included in the result. It cannot be nil. An empty document (e.g. bson.D{}) should be used to include all documents.`
とある通り、検索条件にはnilは許可されておらず空のドキュメントを設定する必要があるとのこと。
ちなみに、nilを設定すると`s: "document is nil"`という~~不親切な~~エラーが発生します。

ドキュメントをちゃんと読めば気づけたのですが、この記述に気付かずエラーの原因を探すのに手間取ったので、今回記事にしました。。
MySQL ターミナルでの操作コマンド【Mac】

#【MySQL ターミナルでの操作コマンド】

##MySQLをインストール（5.6を指定する場合）
```:MySQL
brew install mysql@5.6
```

###MySQLのバージョンを確認
```:MySQL
mysql --version
```

###MySQLを起動（5.6を指定する場合）
```:MySQL
brew services start mysql@5.6
```

##MySQLにログイン

- ユーザーを指定してログイン

```:MySQL
mysql -u ユーザー名
```

- rootユーザーでログイン

```:MySQL
mysql -u root
```

##作成済みのデータベースの一覧を確認
```ログイン後、入力値をキャンセルしたい時は「 \c 」で可能。```

```:MySQL
mysql> show databases;
```
※ databases：複数形、タイプミスに注意。
※ 最後の「 ; 」を忘れるとエラーになる。 

##接続しているデータベースを確認
```:MySQL
mysql> select databases();
```

##データベース名を指定して切り替える
```:MySQL
mysql> use データベース名;
```

##データベースのテーブルの一覧を確認
```:MySQL
mysql> show tables;
```
※ tables：複数形、タイプミスに注意。
※ 最後の「 ; 」を忘れるとエラーになる。 

##テーブルの定義（列や型）を確認
```:MySQL
mysql> desc テーブル名;
```

##テーブルの設定内容を確認
``主キー、一意キー（複合主キー、一意キーも）など制約の内容の確認ができる。``

```:MySQL
mysql> show create table テーブル名;
```

##int, tinyint, smallintのデフォルト型
`int : int(11)`
`tinyint : tinyint(4)`
`smallint : smallint(6)`
(a),(b),(c)の箇条書き

#(a),(b),(c)での箇条書きは、下のコードで実現可能
```
\begin{enumerate}[{(}a{)}]
    \item hoge 
    \item fuga

\end{enunmerate}
```
これでうまくいかないときは、プリアンブルに\usepackage{enumerate}を書く必要があるかも。
【Python】日付をforで回したい （〇月〇日から△月△日まで〜）

## はじめに
**〇月〇日から△月△日まで〜** みたいなのをforで回したい時ありますよね。

そんな時に使えそうなライブラリを作ったので投稿します。

## ソースコード

名前は **`dt-range`** めっちゃ普通。

https://github.com/nanato12/dt-range

## 使い方

まずは普通に `pip` を使ってインストール

```sh
$ pip install dt-range
```


### 週単位で回したいとき: **weekrange**

```python
from datetime import datetime

from dt_range import weekrange

START = datetime(2021, 1, 1)
END = datetime(2021, 1, 31)

for dt in weekrange(START, END):
    print(dt)
# 2021-01-01 00:00:00
# 2021-01-08 00:00:00
# 2021-01-15 00:00:00
# 2021-01-22 00:00:00
# 2021-01-29 00:00:00

for dt in weekrange(START, END, weeks=2):
    print(dt)
# 2021-01-01 00:00:00
# 2021-01-15 00:00:00
# 2021-01-29 00:00:00
```

### 日単位で回したいとき: **daterange**

```py
from datetime import datetime

from dt_range import daterange

START = datetime(2021, 1, 1)
END = datetime(2021, 1, 31)

for dt in daterange(START, END):
    print(dt)
# 2021-01-01 00:00:00
# 2021-01-02 00:00:00
# 2021-01-03 00:00:00
# ...
# 2021-01-29 00:00:00
# 2021-01-30 00:00:00
# 2021-01-31 00:00:00


for dt in daterange(START, END, days=4):
    print(dt)
# 2021-01-01 00:00:00
# 2021-01-05 00:00:00
# 2021-01-09 00:00:00
# 2021-01-13 00:00:00
# 2021-01-17 00:00:00
# 2021-01-21 00:00:00
# 2021-01-25 00:00:00
# 2021-01-29 00:00:00
```

### 時間単位で回したいとき

```py
from datetime import datetime

from dt_range import hourrange

START = datetime(2021, 1, 1)
END = datetime(2021, 1, 1, 23)

for dt in hourrange(START, END):
    print(dt)
# 2021-01-01 00:00:00
# 2021-01-01 01:00:00
# 2021-01-01 02:00:00
# 2021-01-01 03:00:00
# ...
# 2021-01-01 21:00:00
# 2021-01-01 22:00:00
# 2021-01-01 23:00:00

for dt in hourrange(START, END, hours=4):
    print(dt)
# 2021-01-01 00:00:00
# 2021-01-01 04:00:00
# 2021-01-01 08:00:00
# 2021-01-01 12:00:00
# 2021-01-01 16:00:00
# 2021-01-01 20:00:00
```

あとは、`minuterange (分単位)` や `secondrange (秒単位)`, `millisecondrange (ミリ秒単位)`, `microsecondrange (マイクロ秒単位)` などがあります。

### `timdelta` を使用して回すことも

```python
from datetime import datetime, timedelta

from dt_range import timedeltarange

START = datetime(2021, 1, 1)
END = datetime(2021, 1, 31)

for dt in timedeltarange(
    START,
    END,
    timedelta(days=5, hours=4, minutes=3, seconds=2, microseconds=1),
):
    print(dt)
# 2021-01-01 00:00:00
# 2021-01-06 04:03:02.000001
# 2021-01-11 08:06:04.000002
# 2021-01-16 12:09:06.000003
# 2021-01-21 16:12:08.000004
# 2021-01-26 20:15:10.000005
```

こんな細かいの絶対使わんやろ


## 最後に
またつまらぬものを作ってしまった。
ポートフォリオ作成で超有益!　Ruby on Railsのログイン機能作成時に使うdevise_token_authの使い方

# devise_token_authとは
***新規登録、ログイン、ログアウトなどの機能を実装する時に、***
使用し、***トークン認証***という、```ユーザー認証```ができるgemです。
この記事ではdevise_token_authの設定を説明していきます。

# Gemfileの設定
まずはGemfileの設定からです。
下のgemをGemfileに追記します。

```Gemfile
 gem "devise"
 gem "devise_token_auth"
 gem 'rack-cors'　　　　#URLのアクセスが重複することを許可してくれる。
```
その後```bundle install```をします。

# インストール
下のコマンドでインストールします。

```
rails g devise:install
```
でdeviseをインストールします。

```
rails g devise_token_auth:install User auth
```
devise_token_authをインストールします。
```authは認証```のことです。

# 認証機能を実装
環境設定は終わったので、認証機能を実装をします。

まずは認証コントローラーを実装します。

```
rails g controller api/v1/registrations
```
すると、```api/v1/auth/registrations_controller.rb```が作成されます。
classの部分を以下のように修正します。

```api/v1/auth/registrations_controller.rb

class Api::V1::Auth::RegistrationsController < DeviseTokenAuth::RegistrationsController

end
```

# ルーティング設定
api/v1/authでコントローラーを作ったので、ルーティングは下のようになります。

```config_routes.rb
Rails.application.routes.draw do
     namespace :api do
     namespace :v1 do
    mount_devise_token_auth_for 'User', at: 'auth', controllers: {
        registrations: 'api/v1/auth/registrations'
    }
    end
    end
end

```
⚫︎補足
```namespace```はapi/v1の名前空間を作る時に使います。Rails.application.routes.draw do
```mount_devise_token_auth_for 'User', at: 'auth'```とは
サインインやサインアウトなどの認証ができるようにするためのルーティングです。
api/v1/registration_controller.rbをmount_devise_token_auth_for 'User', at: 'auth'で
認証するためという意味のコードです。

# devise_token_auth.rbの設定
initializerの中にdevise_token_auth.rbというファイルがありますが、
ここを公式ドキュメントを参照して必要なコードをコメントアウトしていきます。
https://devise-token-auth.gitbook.io/devise-token-auth/config/initialization

```config/initializers/devise_token_auth.rb

DeviseTokenAuth.setup do |config|
#リクエストごとに、headersの情報を変える。
   config.change_headers_on_each_request = false #trueからfalseに変更
#リクエストごとにheadersが変わるのはかなり面倒。

#ユーザーは2週間後に再認証する必要があり、
#トークンが発行された後、トークンが有効であり続ける期間が２週間とする
    config.token_lifespan = 2.weeks

# headersに含まれている名前を下のように変える
    config.headers_names = { 'access-token': "access-token",
                           client: "client",
                           expiry: "expiry",
                           uid: "uid",
                           'token-type': "token-type" }
end
```

# 現場で頭が真っ白にならないために
現場に入ったら頭が真っ白になるのは未経験や経験が浅いエンジニアあるあるです。
僕もそうでした。
そのための対策として***CRUD処理と認証機能を自力で作る***のがいいです。
大半のウェブアプリはこの２つの延長にあるのが多いです。

# 最後に
この辺を実装するとログイン機能は作れましたが、
状況によって実装内容が変わることがあるのでコピペだけにはならないようにお願いします。
あくまで参考資料としてみてください。
Power Automate Desktop「UNIX時間のこと」

## 概要

Power Automate DesktopでUNIX時間を日本標準時（JST）に変換します。某APIのドキュメントで見慣れない時間表記があったので調べました。下記のようなJSONで「1234567890」っていつのこと？Power Automate Desktopではどのように変換するんだという話です。

```json:JSON
{
  "order": [
    {
      "key": "abcd",
      "orderdatetime": 1234567890,
      "dispatched": 1235431895
    },
    {
      "key": "abce",
      "orderdatetime": 1235531898,
      "dispatched": 1236895896
    }
  ]
}
```

## 環境

- Windows 10Pro 21H1
- Power Automate Desktop 2.13.163.21263

## 注意事項等

- 2021年10月の情報です。
- Windows 11の環境は持っていないので試していません。
- 私が使用しているバージョンでの表記はPower Automate DesktopとなっているためPower Automate for Desktopにしていません。

## UNIX時間のこと

https://ja.wikipedia.org/wiki/UNIX%E6%99%82%E9%96%93

ざっくりまとめると
UNIXエポック（協定世界時1970年1月1日午前0時0分0秒）から形式的な経過秒数で表した時刻表現とのこと。これならPower Automate Desktopのフロー内で変換できそうです。

## フロー

![2021-10-15-22-10-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/740442ec-4923-21db-b5ab-e753a504458f.png)

1. 入力ダイアログを」表示
   変数名　%UnixTime%と設定
   ![2021-10-15-22-13-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/8be8f6f8-1052-620b-72d9-60162c36b96c.png)

2. Set variable
  
   変数名を　%UnixBaseTimeJST%
   日本標準時（JST)は協定世界時（UTC) +9時間なので、UNIXエポック（協定世界時1970年1月1日午前0時0分0秒に9時間を足した値を宛先に設定します。
   ```%D'1970/01/01 09:00:00'%```
   ![2021-10-15-22-14-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/238fa5ea-8a58-b305-70c1-6e8d0ec3801f.png)

3. 加算する日時
   %UnixBaseTimeJST%に%UnixTime%を秒として加算します。
   ![2021-10-15-22-24-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/75f3c11a-4441-2a27-c0b6-a20490f11f36.png)

4. メッセージを表示
   加算した日時の結果を表示して確認します。
   ![2021-10-15-22-27-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/dfd4be0d-0be8-c2f7-04b8-5dd0287897aa.png)


```R:PowerAutomateDesktop
Display.InputDialog Message: $'''Input UnixTime''' InputType: Display.InputType.SingleLine IsTopMost: False UserInput=> UnixTime ButtonPressed=> ButtonPressed
SET UnixBaseTimeJST TO D'1970/01/01 09:00:00'
DateTime.Add DateTime: UnixBaseTimeJST TimeToAdd: UnixTime TimeUnit: DateTime.TimeUnit.Seconds ResultedDate=> ResultedDateJST
Display.ShowMessage Message: ResultedDateJST Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed
```

## まとめ

これだけです💦
UNIX時間「1234567890」のような表記がでてきても大丈夫そうです。
「1234567890」がいつなのかは試してください！
2038年問題なんてあるんですねｗ