OmniAICreator/Qiita-1.07M huggingface dataset:
実際にWebの閲覧で眼を悪くした人がおすすめするWebの色配色

MSXパソコンで color 15,4,7 ではじめて
そのあと、白文字、黒背景のMS-DOSとかを比較的長期間体感して、今の時代に目を悪くした人が、色の提案をしています。

## ライトモード

背景に使用すべき色：#ccc～#eee
通常の文字：#222
目立たせる色：#000 (過剰利用はしないこと）

## ダークモード

背景に使用すべき色：#222～#333
通常の文字：#ddd～#eee
目立たせる色：#fff (過剰利用はしないこと）

## この配色の考え方

普段からディスプレイで白色は多く見る為に、白色は全体的になるだけ抑えており、ちょっとでもグレーに近づけておきます
明るい色と暗いの差異を減らし、かつ、明確にしておく

:::note info
これで対処しておけばいいや、っていう悪い例をあげます。
この配色は、かえってピュアブラックとかを使ったほうのが見やすくなるし、色の差異が逆に少なくなり、目の疲労が更に加速します

color: #ccc;
background: #444;

color: #444;
background: #eee;

:::


かつ、白色の白さを減らせば、特にスマホ等でディスプレイの消費電力を少し減らすことができる

背景の黒は極度に明るくしすぎない。明るくしすぎることにより外で太陽光直下の環境で全体的に見にくくなる

手間に惜しまないのであれば、別途ハイコンストラクト色もあるとよい。必要とする方もいらっしゃいます。

## この記事を書いてるエディタ画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149448/4b92346d-dac7-94c7-e4c2-0dc18891cda9.png)

このぐらいの配色で、目の苦痛がなくなっています。

## 長年利用しているファイラーの画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149448/04a85796-3d07-6c73-666c-bbe5193a222f.png)

フォントは変わっているものの、デフォルト色です。
MS-DOS由来の、本来のやさしい画面が、目の癒しになっています。

## 今のTeraTermの色

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149448/471e4f42-c590-f131-0077-a916bb2f6a7a.png)

ファイラー等と違う系列の色として、TeraTermのアイコン、黄色に近いダーク色にしてみています。

## コマンドプロンプト（旧MS-DOSプロンプト）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149448/6d71a33c-f72d-3b8e-8564-4ef9bfc3e13b.png)

あまり大して考えられていない色と感じるようですが、ずっと見てても悪影響をしない、かなり目に優しい色です。

## おまけ 作ってみたお問い合わせフォーム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149448/658c5c84-a572-0f24-1726-85eb6de26788.png)


qiitaの画面比べると、明らかにグレーになっていることがわかると思いますが、
フォーカスした時にピュアホワイト、ブラックにすると、今、どこにいるのかわかりやすくなるのかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149448/fb060955-d465-a521-9a4c-3a49ebde983d.png)

もちろんですが、ダークモードも存在します。

※実際には透過色を用いたbackground背景画像があるのですが、そこはあえてはぶいています

## 多くの方のストックありがとうございます。

### 実際に起きる症状 qiita

もし、仮にガチでqiitaのエディタ画面を見ている場合、
左の文字が細い、ブラウザで拡大したい、と少なくとも感じられます

### 実際に起きる症状 不満買取センター

https://app.fumankaitori.com/

メニューの文字が薄すぎて読めないよ（これは大きくなってるので読めますが、実サイズとなると、ほぼ読めません）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149448/71d8b9d6-406d-a283-22d7-e551d6383f5c.png)


### 実際に起きる症状　テキストエディタ（秀丸）のピュアホワイト、ピュアブラック

まじ、目がいたい。。。

### 実際に起きる症状　Windows 11（白色系のテーマ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149448/b557dc40-0eaa-b080-27c5-dc36b528a256.png)

眼がいたくて、何やればよいのかわからなくなる

### 実際に起きる症状　テレ朝ニュース
https://news.tv-asahi.co.jp/

TOPページは別に問題ありませんが、記事の本文は何をかいてあるのか理解できず、理解するために目を疲れさせてしまう。

### 参考

現時点でのディスプレイの明るさ（ノートPC）は以下の通りです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149448/f7f1390c-5c56-6a01-16bf-bee00b103fa0.png)
neosでlogix その83

# 概要
neosでlogixやってみる。
練習問題、やってみた。

# 練習問題
ツールを作れ。

# 方針

logixノードが、高い位置にあると、desktopモードでは、移動が大変なので、平地に降りてもらうツール。

Find Child By Nameノード
Set Local Positionノードを使う。

# 写真

![2022-05-20 20.54.02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/43fab2bb-528d-de25-91bd-5c0ef0550cd3.jpeg)


# 手順
- devtooltipを装着
- 新規->空のオブジェクト
- logixtooltipを装着
- ノードブラウザを表示
- Find Child By Nameをスポーン
- Root Slotをスポーン
- Get Child をスポーン
- Forをスポーン
- Children Count をスポーン
- Local Transformをスポーン
- Set Local Positionをスポーン
- つなぐ
- インスペクターを表示。
- ☆を使って子スロットを作り、それをlogix0という名前にする。
- logixtooltipを装着
- logix0スロットをグラブして、リングメニューからSet Packing Rootを選ぶ
- ノードをクリックして、rでパッキング
- 親のスロット名を変更 (zend)
- それをグラブして、ctrl + sで、インベントリーに保存

# 成果物

```
neosrec:///U-ohisama/R-0ee1ec21-db19-425b-ba63-9a699caff48e
```


以上。
テンプレートを使って外部向けのポータルを作成する

## はじめに

## どういったときに使うの？
* お客様向けにFAQポータルを作成したい、社内のFAQポータルを作成したい
* 外部ポータルを用意したいとき
* クラウドサービスであるため、プログラミングなしにボタン数クリックで会員ポータルを用意できる。
* もちろん、HTMLでカスタマイズもできるため、自由に画面を変更できる

会員向けFAQポータル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/499a1ef4-88c7-012c-f9c0-28688fd040db.png)


## 手順
### Power Apps の作成ページに飛ぶ、ホーム画面よりその他の作成オプションを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/f558febc-6797-2e88-cbe3-1e7927eab626.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/6ab647ce-da97-8e19-9904-5e5aa463adcd.png)

### ポータルで検索すると６つでてきた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/2313022d-ee5c-6e6b-ef41-f5b436b3b52a.png)

### 今回検索窓も欲しいため、自己解決できるようなFAQ ポータルを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/485ec315-636b-de7e-56cc-72872b935f2f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/4140e88e-ac22-0ae1-42f9-826e9a6e9329.png)

しばらく待ちます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/8ce9e8a6-2860-4855-6523-0814dbfd32d0.png)

完成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/7cd965f8-c4cc-19d0-9812-ef102b6b8598.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/d4144a4c-0a6d-cae7-5baf-35e7840bfa8e.png)

以上
Web のライトモードとダークモードのデザイン

## きっとこれが良い、というデザインを提唱してみます。

### 会社ロゴとか

堂々とピュアホワイトやピュアブラックを利用する

ただし、外側は透過となるように作成する

### ヘッダー部分

ライトモードでもダークモードでも、堂々と白を使用する。

ただし実際の色は、以下のとおり

ライトモード：#eaeaea
ダークモード：#d0d0d0

## 全般的なデザイン

ライトモードでは白っぽく、ダークモードでは黒っぽく作成するが
#ffffff や #000000 等のピュアホワイトやピュアブラックは避ける

また、ダークモードを少し青っぽくするのもよさそう

ホワイト、ブラック系列の色でないページにおいても、
明るめ、暗めの色を用意するべきです

## 画像のダークモード対応が困難な場合

画像の編集はコストがかかります。

そのため、ライトモード用の画像で、背景を一部白っぽくぼかすことによって
簡易的にダークモードに対応できるようになります。

## ライトモードとダークモードの画像

可能であれば <img タグを拡張を行い、ライトモードとダークモードで別の画像を用意し、画像の明るさでアクセシビリティーをはかる

↑というのは、今回うちは全く実行してはいないのですが、逆に同じ機能を利用して、ライトモードとダークモードで全く違う画像を用意することで、遊び心を実現しています。

## ライトモード、ダークモードの切り替え

prefers-color-scheme: dark

であることを検出するだけで実装するのであれば、確かに簡単なのですが、
実際に調査してみると、ウェブサイトごとに色合いが異なる理由で
実際にサイトを閲覧してからライト・ダークモードを切り替えたい、という消費者意見が多いので
ウェブサイトに設定画面や、ダークモードへの切り替えボタンを設置するのが最も良い
Git hub 久しぶりに使う人のまとめ

## はじめに
自分用に使うときにコマンド忘れてるため、メモ

## リモートリポジトリからクローンする
gitプロジェクトは、githubから自分の環境にクローンを作成する。

### 1.緑ボタンのCodeをクリックし、 レポジトリURLコピーする
HTTPS clone URLのボタンをクリックするとクリップボードにコピーされる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/fa442a61-d03f-c9fd-41bb-f4fc156ffacc.png)



### 2.Visual Studio Code ターミナル画面起動し、コマンドを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/8f02f96a-d308-44de-edc6-9dbf68765d0d.png)

```
$ git clone https://github.com/microsoft/CDM.git
```

参考

https://qiita.com/mountcedar/items/682743c95fd3b8fc274b

https://qiita.com/gakisan8273/items/6ebaf9217d140ff1f031

Gitプロジェクト元

https://github.com/microsoft/CDM

エンティティの見つけ方

https://microsoft.github.io/CDM/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/ea31275b-ea0e-90df-7cf6-5fd3af6e85bd.png)
36 解答

# 参考
[Nick White](https://www.youtube.com/watch?v=Pl7mMcBm2b8) : LeetCode 36. Valid Sudoku (Algorithm Explained)
[GeeksforGeeks](https://www.geeksforgeeks.org/hashset-add-method-in-java/) : HashSet add() Method in Java
英語がわかる人は絶対こっちのほうがわかりやすいので、[Nick White]さんのYouTubeを見てね！　（ステマではないです）

# 解答

```Java
	public boolean isValidSudoku(char[][] board) {
		Set<String> seen = new HashSet<>();
		for (int i = 0; i < 9; i++) {
			for (int j = 0; j < 9; j++) {
				char current_val = board[i][j];
				if (current_val != '.') {// if each mass contains value
					if (!seen.add(current_val + " found in row " + i)
							|| !seen.add(current_val + " found in column " + j)
							|| !seen.add(current_val + " found in sub box " + i / 3 + "-" + j / 3)) {// if the element
																										// is already
																										// contaitned in
																										// the HashSet
						return false;
					}

				}

			}
		}
		return true;

	}
```
# 簡単な解説
解答としては HashSet を３つ作ってそれぞれ確認する方法もあるが、今回はHashSet<String>だけを使っている。
add() メソッドはHashSetに要素を追加する機能もあるが、boolean を返す機能もある。
## HashSet add() Method
[GeeksforGeeks](https://www.geeksforgeeks.org/hashset-add-method-in-java/) : HashSet add() Method in Java
ここに書いてある通り、
HashSetに要素がすでにある場合は -> False
HashSetに要素がない場合は　-> True

つまり、もっと簡単に言うと
その要素がuniqueではない場合は -> false
その要素がuniqueな場合は　-> True

と認識しているがあっているかは自信がない。

## どちらが先に実行されるか問題
```Java
if (!seen.add(current_val + " found in row " + i)
							|| !seen.add(current_val + " found in column " + j)
							|| !seen.add(current_val + " found in sub box " + i / 3 + "-" + j / 3))
```
add() されてから評価しては常にfalseが帰ってきてしまうので、実際は,,,
評価（True or false）をしてからadd()する。
UI UX を改善して何の意味があるの？ 利益になるの？


UI/UXを改善しても直接の利益は得られない。開発の自己満足ではないか？
そんなことより利益を上げなさい。金金金。

いた自分のことを振り返って考えてみよう。

- 僕が「楽天市場」を使いたくないのは、UIもUXも悪いからだ。
- 僕がFacebookを使いたくない理由の一つは、とにかくアプリ等の挙動が重く、UXが悪いからだ。
- 僕がQiitaやGithubを好む理由の大きな一つは、動作が軽快なこと。UIが優れているからだ。

さて、ここで

# あなたもしくは上司が知らない法則

- UI/UXが悪いことを理由に離脱したユーザーの数は測定できず、誰にも分からない。(機会損失の計測の損失)
- UI/UXが気に入ってサービスを利用しているユーザーは、明確にそれをフィードバックとして開発に伝えるわけではない。(暗黙のFavorite)
- 住所入力に全角文字「しか」許さないフォームに、僕らは何度悩まされたことか。(住所エラーの反逆事件)

こうしてUI/UXの重要さは測定ができず、それを神として信じる者だけに見える。

ところで

- Googleはページの反応速度がコンマ数秒改善するごとに、広告売上が改善することを測定した。(ググレカス爆速の法則)



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
VSCodeでCoqを動かす

この記事は, VSCodeでCoqを動かすための環境構築に関する備忘録です.  
この記事は備忘録であるので, あまり参考にしない方が良いと思います.
私の環境で上手く動くようになっただけで, これが正しいかは分かりません.

- [VSCodeでCoqの環境構築](#vscodeでcoqの環境構築)
  - [Coqのインストール](#coqのインストール)
  - [環境変数の編集](#環境変数の編集)
  - [VSCodeで書いてみる](#vscodeで書いてみる)
    - [VSCodeの拡張機能](#vscodeの拡張機能)
    - [ファイルの作成1](#ファイルの作成1)
    - [プレビュー機能](#プレビュー機能)
    - [ファイルの作成2](#ファイルの作成2)
  - [終わりに](#終わりに)
  - [参考文献](#参考文献)

## Coqのインストール

[Coqの公式サイト](https://coq.inria.fr/)上部の<font color="SlateBlue">Get Coq</font>を押す.  
<font color="SlateBlue">The Coq Platform</font>の<font color="SlateBlue">Windows and macOS installers</font>を押すと, Githubの<font color="SlateBlue">Coq/platform</font>に飛ぶ.  
1番下の<font color="SlateBlue">Assets</font>から最新版(`Coq-Platform-release-yyyy.mm.dd-version_hoge_yyyy.mm.dd-windows-x86_64_signed.exe`)を選択する.  
インストールした<font color="SlateBlue">.exe</font>ファイルを押すと, Coqのインストールが始まる. 

## 環境変数の編集

環境変数の編集でPathの編集から
```
C:\Coq-Platform~8.15~2022.04\bin
```
を追加する. (数字はインストールしたCoqのverによって変わる.)

## VSCodeで書いてみる

Coqのインストールは済んだので, VSCode上で動かすための準備をする. 

### VSCodeの拡張機能

VSCodeの拡張機能の検索で`vscoq`と入力し, 出てくる<font color="SlateBlue">vscoq</font>をインストールする. 

### ファイルの作成1

`Ctrl + N`で作成し, `test1.v`で保存し,  以下のコードを書く. (Coqの拡張子は`.v`である.)
```Coq
Definition one := 1.
Print one.
```

### プレビュー機能

`Fn + F1`でコマンドパレットを開き, `>Coq: Open proof view`を押す. この時, 右側に<font color="SlateBlue">PrrofView:test1.v</font>が出れば良い.  
ソースコードの1番上の行にカーソルを合わせて, `Alt + ↓キー`で1番下まで選択する.
この時, 下の<font color="SlateBlue">OUTPUT</font>に
```
 one = 1
     : nat
```
と出力される. 
右のプレビュー画面は
```
Not in proof mode
```
である. 

### ファイルの作成2

`Ctrl + N`で作成し, `test2.v`で保存し, 以下のコードを書く. 
```Coq
Require Import Arith.
Definition f x := x + 1.

Definition g x := x - 1.

Theorem g_f : forall x, g (f x) = x.
Proof.
    intros x.
    unfold f, g.
    SearchRewrite(_ + _ - _).
    rewrite Nat.add_sub.
    reflexivity.
Qed.
```
プレビュー画面の変化を見ていく. 
(詳しい説明は次回以降の記事でしたい.)  
ソースコードの1番上の行にカーソルを合わせて, `Alt + ↓キー`で6行目まで進めると, 
```Coq
(1/1)
forall x : nat, g (f x) = x
```
8行目まで進めると, 
```Coq
x : nat
(1/1)
g (f x) = x
```
9行目まで進めると, 
```Coq
x : nat
(1/1)
x + 1 - 1 = x
```
10行目まで進めると, <font color="SlateBlue">OUTPUT</font>に
```
Nat.add_sub: forall n m : nat, n + m - m = n
minus_plus: forall n m : nat, n + m - n = m
minus_plus_simpl_l_reverse: forall n m p : nat, n - m = p + n - (p + m)
Nat.add_sub_swap: forall n m p : nat, p <= n -> n + m - p = n - p + m
Nat.add_sub_assoc: forall n m p : nat, p <= m -> n + (m - p) = n + m - p
```
11行目まで進めると, 
```Coq
x : nat
(1/1)
x = x
```
12行目まで進めると, 
```
No more subgoals
```
13行目まで進めると, 
```
Not in proof mode
```
となる. 

## 終わりに

意外に簡単だったので, これでこの先も上手くいくことを願います.  
次回以降で, Coqの記事を(備忘録として)書いていきたい. 

## 参考文献

[Coqの公式サイト](https://coq.inria.fr/)
[Visial Studio CodeでCoqの環境作ってみた](https://qiita.com/gyu-don/items/e2760f7583b92fcbbe58)
P2V で VirtualBox に移行したとき、US配列になってしまったけど、AutoHotkey で キーマップを JP106 にリマップしてみた件。

# 物理マシンを VirtualBox に移行、、しかし、何故か キーボードが US配列に・・・


### そんなつもりは無いのだけれど、何故かキーマップが US配列になってしまう事があるようです。


　**ホストOS に Windows** を使っていて、**ゲストOS にも Windows** を使っている場合、**VirtualBox だけでは JP106 には変えられない:interrobang:** ようです。
検索した限りでは、ホストOS に Linux を使っていると、VirtualBox 上で 変えられるよう、、
また、ゲストOS が Linux の場合にも、キーマップは 自由に指定できるよね。

　**ゲストの Windows OS 上で キーボードドライバを 再インストールすれば 解決するらしい**のだけれど、**_今回は それを <a href="https://www.autohotkey.com/">AutoHotkey</a> で回避してみた_**、というお話。

　**ゲストOS が かなり古い Windows OS** だったり、**諸々の諸事情で ドライバの再インストールが出来ない場合**に、さぁどうしよう〜(笑)

　物理キーの単純入替であれば、常駐ソフトを使わずとも、レジストリ指定で 入れ替え 出来ます。
ただし、US配列→JP配列の リマップ のように、**Shiftキーと同時入力する文字と 入れ替えたい など**、***複雑なことが レジストリだけでは出来ない。***

そんな時にも、

:::note info
### <a href="https://www.autohotkey.com/">AutoHotkey</a> があれば、キーボード自由自在！:thumbsup:
:::

　**<a href="https://www.autohotkey.com/">AutoHotkey</a> をインストールしたあと**、以下の内容を **拡張子 .ahk で保存**して、ダブルクリックしましょう:heavy_exclamation_mark:
タスクトレイ:bookmark_tabs:に常駐し、キーマップが JP106 に変わったはず。
右クリックで 常駐終了させると元の US配列 に戻ります。
```sh:us2jp106.ahk
sc029::vk19
@::Send,{U+0022}        ;; "
^::Send,{U+0026}        ;; &
&::Send,{U+0027}        ;; '
*::Send,{U+0028}        ;; (
(::Send,{U+0029}        ;; )
)::Send,+0
_::Send,{U+003D}        ;; =
=::Send,{U+005E}        ;; ^
+::Send,~               ;; ~
sc07D::Send,{U+005C}    ;; \
+sc07D::Send,{U+007C}   ;; |
[::Send,{U+0040}        ;; @
{::Send,{U+0060}        ;; `
]::Send,{U+005B}        ;; [
}::Send,{U+007B}        ;; {
:::Send,{U+002B}        ;; +
'::Send,{U+003A}        ;; :
"::Send,{U+002A}        ;; *
\::Send,{U+005D}        ;; ]
|::Send,{U+007D}        ;; }
sc073::Send,{U+005C}    ;; \
+sc073::Send,{U+005F}   ;; _
```
<a href="https://www.autohotkey.com/">AutoHotkey</a> には、他のソフトを立ち上げたり、ウィンドウを閉じたり、Windowsハンドル取得したり、他にも色々な機能があるので、興味ある人は 調べてみてください:heavy_exclamation_mark::wink:
EC2 Instance Connectでの接続に挑戦してみた

## はじめに
AWSフルコース22年３月度、第６回の課題まで終了したところ。
VPC内にEC2、RDSを設置し、EC2に接続。さらにEC2からRDSへの接続確認を行う。
というものだった。
で、EC2への接続方法はsshの他に、EC2 Instance Connectを使う手もあるらしい。
ブラウザからEC2に接続できるのって便利じゃん。と思い、挑戦してみることに。
課題とは関係ないけどまあいいや。

## 方針
なるべく公式ドキュメントで頑張る
よく分からないときはQiitaの解説記事などに頼る

## とりあえずやってみた
* まずは接続ボタンを押してみた。繋がらない。
![スクリーンショット 2022-05-20 7.50.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921126/432fd3f9-2604-6d57-058a-67c8e77ba00e.png)

* 最初は何でダメなのか分からなかったが、[EC2 Instance Connect セットアップ](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-connect-set-up.html#ec2-instance-connect-setup-security-group)を読みながら試行錯誤していくうちに一応整理できた。正確に理解できてるかは自信なし。
    - EC2 Instance Connectは、「ブラウザベースのクライアント」からEC2インスタンスにssh接続できますよ、という機能。
    - EC2インスタンスのインバウンドルールは、通信プロトコルとIPアドレスを見て、そのトラフィックを通すか否かをフィルタリングするもの。
    - よって、「ブラウザベースのクライアント」のIPアドレスからのsshトラフィックを許可、というインバウンドルールを設定してやればOK。

## 公式ドキュメントを読みながら試行錯誤
#### タスク 1: インスタンスへのネットワークアクセスを設定する
 * セキュリティグループの設定
   - 22番ポートで、sshトラフィックを許可。
   - このときの送信元IPは、どうやら[AWS IP アドレスの範囲](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-ip-ranges.html)を見ればいいらしい。
   - リンク先のip-ranges.jsonを確認。その中に以下の記載があった。
  
```
{
      "ip_prefix": "3.112.23.0/29",
      "region": "ap-northeast-1",
      "service": "EC2_INSTANCE_CONNECT",
      "network_border_group": "ap-northeast-1"
    }
```
 - というわけで、IP 3.112.23.0/29からのsshトラフィック（２２番ポート使用）を許可、これでOK。

#### タスク 2: (条件付き) EC2 Instance Connect をインスタンスにインストールする
* 自分の場合、デフォルトでインストールされているのはずなので、この工程はパス。

#### タスク 3: (オプション) EC2 Instance Connect CLI をお使いのコンピューターにインストールする
* オプションということなのでパス

#### タスク 4: EC2 Instance Connect の IAM アクセス許可を設定する
>IAM プリンシパルが EC2 Instance Connect を使用してインスタンスに接続できるように、パブリックキーをインスタンスにプッシュするアクセス許可を付与する必要があります。

* …イマイチ何言ってるかよく分からない。EC2 Instance Connectを使用する権限をIAMユーザーに付与しなさい、ということなのか？
* 公開鍵をプッシュする権限…???
* ともかく、ポリシーを作成してアタッチ。接続確認。

![スクリーンショット 2022-05-21 1.44.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921126/79ed40d5-c444-c7ca-050a-dca29a0cc517.png)

成功。

## おわりに
これ書くのに時間かけすぎた。書こうとするといちいち手が止まるので、やっぱり分かってるつもりが分かってないんだなと実感。
jenkins:インストールと構築 Mac編

# 背景
会社では、Mac/Windows/ubuntuで構築したことはあるのですが、なんせ会社にあるマシンに構築しているので、ログをここに書くわけにもいきません。
ということで、自分のマシンに入れた記事を書こうと思います。

ちなみにですがWindowsマシンへのインストールはだるかったです。
なぜなら、Windowsマシンの場合、Firewall設定がややこしかった・・（会社の）
おかげで、DNS登録したのにリモート接続できないとか、色々あってインフラさんとやりとりしたりしました。（有線だと接続できるとか、Wifiで接続できないとか）

他の環境もそうですが、インフラさんたちとのやりとりも必要になってきます。
接続面、DNS登録（これはやっておいた方が良いです）、LDAPログイン周りなど、インフラさんたちに作業してもらうシーンが出てきます。
特に、DNS登録はしておいた方が良いです。
IPアドレスでマシンにログインしたり、Jenkinsページにアクセスしたりするのはめちゃくちゃだるいし、名前でアクセスした方がいいですよね。

# 本題
## インストール
### 必須環境
- Java(Macの場合はバージョンそんなに縛りなかったかと。Windowsは11じゃないとエラーが起きる）
- homebrew

上記環境を入れておく、やり方は割愛

### jenkinsのインストール
```
%brew install jenkins
```
m1とかだとこうなる
```
% arch -arm64 brew install jenkins
```

## jenkins起動チェック
```
%brew services start jenkins
```
問題なければ、エラーが特に出ずサービスをスタートできる。
brewでインストールしたものは、マシンを再起動すると自動的にスタート。

## jenkinsページアクセス
http://localhost:8080/login?from=%2F

初回なので、adminパスワードを聞かれる。

> /Users/ユーザー名/.jenkins/secrets/initialAdminPassword

ここに初回パスワードがあるから、これを入れてね、と記載されている　

| ![スクリーンショット 2022-05-21 1.29.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1026740/22565a7c-c468-1c90-88b9-fe9a4897e719.png) |
|:--|

好みの問題だけど、suggested plugins押さないでみる。
selectの場合は、suggestedの中からさらに選択させるようだ。
| ![スクリーンショット 2022-05-21 1.40.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1026740/84564a26-0107-251c-cfbd-40e8c2f2cf95.png) |
|:--|

下記あたり有用そう。
- Build Timeout
- creadentials Binding
- Timestamper
- Workspace cleanup
- LDAP(会社ではいると思う）
- SSH Build Agents
- Git
- GitHub(場合により）
- P4(場合により）
- Subversion(場合により）
- Copy Artifact
- Role Base Authorization Strategy(ユーザーの権限周り決めるのに有用）
- Pipeline
- GitHub Branch Source
- Pipeline:GitHub Groovy Libralies
- Pipeline Stage View
- Rebuilder

| ![スクリーンショット 2022-05-21 1.41.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1026740/691f2996-dffe-0c18-009c-b63741c535b5.png) |
|:--|

Pluginのインストール始まる
終わると、最初のIDとパスワード設定、メアド設定などあるのでささっと入力。

| ![スクリーンショット 2022-05-21 1.49.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1026740/e910e867-89a5-bbd1-7085-52c09041a3f3.png) |
|:--|

アドレスはこれでいいかな？！と聞かれるとでそのままとりあえずOKして進む。

| ![スクリーンショット 2022-05-21 1.50.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1026740/75d90530-1b73-20a1-a27e-b796d928eb88.png) |
|:--|

その１は完了！
Linux ユーザー入力で文字列や選択を要求する

# 初めに

以下 2 つを試しました。

- 文字列のユーザー入力
- 選択肢を表示する

# コード例

```bash:sample.sh
# while true で無限ループし、break や exit の処理を行わなかった場合、ユーザー入力処理を繰り返す
while true
do
  # ユーザー入力を待ち、入力された文字列を source_file という変数に格納
  read -p 'Input copy source file (Entering ? will display a list of files and directories):' source_file
  if [ "$source_file" = '?' ]; then
    # 「?」 が入力された場合、ls コマンドを実行する
    ls
  elif [ "$source_file" = '' ]; then
    # 空文字が入力された場合
    echo "An empty word was entered. Please retry."
  elif [ -e "$source_file" ]; then
    # ファイルが存在する場合、
    break
  else
    # 処理を中止する
    echo 'Source file does not exist.'
    exit 1
  fi
done

# ~/sample ディレクトリ以下を選択肢にする
select destination in `ls ~/sample`
do
  if [ `echo $destination | grep 'do_not_copy'` ]; then
    # ディレクトリ名に「do_not_copy」という文字列が含まれている場合、コピーできない旨を表示し、再度ユーザーに選択を求める
    echo "You cannot copy to $destination."
  elif [ "$destination" = "" ]; then
    # 空文字が入力された場合、選択肢の番号から選ぶことを要求し、再度ユーザーに選択を求める
    echo "You need to select 1)-`ls ~/sample | wc -l`)."
  else
    # コピー先が妥当な場合、コピーを実行し、処理を終える
    cp $source_file ~/sample/$destination
    echo "You copied $source_file to $destination."
    break
  fi
done
```

# 動作確認

- コピー元ファイルが存在し、コピー先ディレクトリが正当な場合

```
[ec2-user@ip-172-31-8-7 ~]$ sh sample.sh
Input copy source file (Entering ? will display a list of files and directories):source_file.txt
1) child_1
2) child_2
3) child_do_not_copy
#? 1
You copied source_file.txt to child_1.
[ec2-user@ip-172-31-8-7 ~]$ ls ~/sample/child_1
source_file.txt <===ファイルがコピーされたことを確認
```

- コピー元ファイルが存在しない場合

```
[ec2-user@ip-172-31-8-7 ~]$ sh sample.sh
Input copy source file (Entering ? will display a list of files and directories):hello
Source file does not exist.
```

- コピー元ファイル入力で空文字を入力した場合

```
[ec2-user@ip-172-31-8-7 ~]$ sh sample.sh
Input copy source file (Entering ? will display a list of files and directories):
An empty word was entered. Please retry.
Input copy source file (Entering ? will display a list of files and directories):
```

- コピー元ファイル入力で `?` を入力した場合

```
[ec2-user@ip-172-31-8-7 ~]$ sh sample.sh
Input copy source file (Entering ? will display a list of files and directories):?
cat_eof_output.txt  cat_eof.sh  sample  sample.sh  source_file.txt
Input copy source file (Entering ? will display a list of files and directories):
```

- 選択で `child_do_not_copy` を選択した場合

```
[ec2-user@ip-172-31-8-7 ~]$ sh sample.sh
Input copy source file (Entering ? will display a list of files and directories):source_file.txt
1) child_1
2) child_2
3) child_do_not_copy
#? 3
You cannot copy to child_do_not_copy.
#?
```

- 選択肢にない番号を入力した場合

```
[ec2-user@ip-172-31-8-7 ~]$ sh sample.sh
Input copy source file (Entering ? will display a list of files and directories):source_file.txt
1) child_1
2) child_2
3) child_do_not_copy
#? 4
You need to select 1)-3).
#?
```

# 参考記事

https://linuxcommand.net/select/

https://qiita.com/quryu/items/cf330e3e5cc7b39e3897
jenkinsのタイトルとfaviconを変更する方法

jenkinsに初めて触り始めたのだけど、色々なビルドマシンがあると、どれがどのマシン？？って思うことがよくある。
で、現在会社では全部同じ見た目とタイトル。

ジョブの名前と、URLの名前で判断する感じになっています。

UI的には、一瞬で、このマシンだ！！とわかるのがベストなので、これを変更する必要があると思い対応した時の話。

# simple theme pluginのインストール
タイトルとかロゴを変更する場合、カスタマイズしたcss/jsを使う必要があるので、まずカスタマイズできるように
simple theme pluginをインストールする。

https://plugins.jenkins.io/simple-theme-plugin/

インストールすると、jenkins管理画面で、css/jsのファイルの指定先を記述する場所が出てくるので、
/var/lib/jenkins/userContents/... とかの中にフォルダやファイルを置いて指定する。


# css/jsのカスタマイズ
## ico/pngを用意
何か適当なサイズのicoを用意してください。

## css/js
### css
```
/* headerの中の背景変更。変えとくとわかりやすい。qiitaでいうとこの緑帯らへん */
#header{
    background: steelblue;
    position: relative;
}
 
/* サイトコンテンツ内部の調整（色とかフォントサイズとか） */
.header-text{
    font-size: 32px;
    line-height: 0.3 em;
    color: whitesmoke;
    padding-left: 16px;
}
 
/* サイトのアイコン変更する #jenkins-head-iconは、cssで指定する名前みたいなかんじらしー */
#jenkins-head-icon {
    content:url('/userContent/icon.png');
    height:36px;
}
```

### js
```
var titleStr = "ビルドマシン"

// favicon変更 
const changeFavicon = link => {
  let $favicon = document.querySelector('link[rel="shortcut icon"]')
  // If a <link rel="icon"> element already exists,
  // change its href to the given link.
  if ($favicon !== null) {
    $favicon.href = link
  // Otherwise, create a new element and append it to <head>.
  } else {
    $favicon = document.createElement("link")
    $favicon.rel = "shortcut icon"
    $favicon.href = link
    document.head.appendChild($favicon)
  }
}
 
// タイトル変更(タブのとこに表示されるタイトル）
window.addEventListener("load", function() {
  var title = document.querySelector('title')
  title.innerHTML = title.innerHTML.replace(/\[Jenkins\]/, titleStr)
  // faviconの変更
  changeFavicon("userContent/favicon.ico")
}, false);
 
 
 
// コンテンツの中のタイトルを変更
document.addEventListener("DOMContentLoaded", function(){
  var img = document.getElementsBySelector('[id="jenkins-home-link"]')[0];
  var alink = img.parentNode;
  //alink.removeChild(img); これがあるとロゴが消えちゃう
  alink.appendChild(document.createTextNode(titleStr));
  alink.setAttribute("class", "header-text");
}, false);

```

css/jsはほとんど触ったことがないので、ぐぐった記事のコピペですが、faviconってどう変えたらいいの？がよくわかりませんでした。
手順としては、

1. ページ内部のソースを表示
2. icoと出てくる部分をチェック
3. <link rel="icon">みたいになっているので、そこの部分を上記ソースコードで変更
4. つまり、favicon.rel="icon"だったり、favicon.rel="shortcut icon"だったりするのでソースをチェックしてよしなに変更
5. タブのロードのイベントのところに仕組みを入れると、アクセスした時にfaviconも変更されるようになる


という感じでした。
ただ、ログイン時のfaviconとか、管理画面でのfaviconとかは変更されない挙動になっていました。
ちゃんとやるならもうちょっと調べないと、というところですが、お手軽にやるならこの程度で良いかと。
（ちなみに、jenkinsはcssの仕様を公開してないらしいので、バージョンをあげるとうまく動かない可能性があるようです。）
Is your zFS running sysplex filesys ?

If you want to confirm your zFS is running in sysplex mode, you can see following message in the syslog.
```
IOEZ00617I zFS is running sysplex SysLevel with interface level IntLevel.
IOEZ00350I Successfully joined group IOEZFS   
```
- https://www.ibm.com/docs/en/zos/2.5.0?topic=messages-ioez00617i
- https://www.ibm.com/docs/en/zos/2.5.0?topic=messages-ioez00350i

And if you want to confirm OMVS is running in sysplex mode, you can issue following commands:
```
F BPXOINIT,FILESYS=DISPLAY
```
If OMVS is not running in sysplex mode then you can see following message
```
BPXM106I UNIX SYSTEM SERVICES WAS NOT STARTED IN SYSPLEX MODE.THE MODIFY FUNCTION CANNOT BE PERFORMED.   
```
else you can see following messages (sample from manual):
```
BPXM027I COMMAND ACCEPTED.
BPXF040I MODIFY BPXOINIT,FILESYS PROCESSING IS COMPLETE.           
BPXF242I 2006/10/05 13.30.41 MODIFY BPXOINIT,FILESYS=DISPLAY,GLOBAL
SYSTEM   LFS VERSION ---STATUS--------------------- RECOMMENDED ACTION  
SY1        1.  9.  0 VERIFIED                       NONE                
SY2        1.  9.  0 VERIFIED                       NONE                
SY3        1.  9.  0 VERIFIED                       NONE                
CDS VERSION=  2        MIN LFS VERSION=  1.  9.  0                      
DEVICE NUMBER OF LAST MOUNT=      10                                    
MAXIMUM MOUNT ENTRIES=     500   MOUNT ENTRIES IN USE=       9          
MAXIMUM AMTRULES=           50   AMTRULES IN USE=            0          
MAXSYSTEM=                   8          
SYSTEM PERFORMING ZFS RECYCLE                                                  
  (Since 2006/10/05 13.30.36)                                           
  SY2                                                                   
ACTIVE QUEUE                                                            
  RECYCLING               EXCLUSIVE
```


- https://www.ibm.com/docs/en/zos/2.5.0?topic=command-controlling-zos-unix-system-services-zos-unix


See also you should confirm XCF status:
```
D XCF
D XCF,SYSPLEX,ALL
D XCF,COUPLE,TYPE=BPXMCDS
D XCF,GRP,SYSBPX,ALL
```
- https://www.ibm.com/docs/en/zos/2.5.0?topic=dc-displaying-cross-system-coupling-facility-xcf-information-xcf

Note:
Confirm MODE: MULTISYSTEM-CAPABLE or not. If not, non SYSPLEX share (MODE: MONOPLEX)  mode is used.
公式ロゴの画像変更(.eps→.png)とリサイズで死にそうになった話。

自社の会社ロゴをリサイズして、外部サイトにアップする必要性が生じたのですが、死にそうになったので、備忘録を兼ねて記載します。

自社のマーケティング部門からは提供されたロゴは、.epsと言う拡張子でした。
まず、.epsって何だ？ と言うことですが、私も知らなかったので、まずその調査から始めました。
下記サイトに詳しいのですが、要は、JPEGやPNGよりも高品質な画像ファイルとの事です。
https://aprico-media.com/posts/6339
デザイナーなら使い慣れているらしいが、それ以外の人には馴染みのない拡張子の様ですねえ。。。

一方で、自社ロゴを貼り付ける外部サイトは、.epsをサポートしません。
つまり、jpeg,peg,pngみたいな「普通の拡張子の画像」しかサポートしないので、まず、.epsを変換しないといけません。（今回は、pngに変換することにしました。）

従って、手順としては下記です。
ロゴをリサイズしてアップする手順に関して。
①.epsファイルを、.pngファイルに変更して、
② 更に、その.pngファイルをリサイズして、外部サイトにアップする。
こんなのすぐ出来るだろうと思ったけど、甘かったですなあ。。。

①は、あっさり見つかりました。
https://convertio.co/ja/download/176bf861c1dc6a23935a34971623fab13637bf/
このサイトは、ネット上のサービスなので、アプリを自分のPCにインストールする必要はありません。

②のアプリの選定に難航しました。
ネットでは色々なソフトが紹介されていますが、どれもキチンと動作しません。
５〜６個のアプリをチェックして、下記がベストと断定します。笑
まず、操作が簡単。そして、リサイズがキチンとできます。
https://www.shutterstock.com/ja/editor/home
これも、ネット上のサービスなので、アプリを自分のPCにインストールする必要はありません。

そんな訳で、.epsファイル変換問題は解決しました。
各種検証で、５〜６時間掛かりました。
皆様のお役に立てば！
includesの使い方

# includesとは？
- 〇〇が含まれているかどうか判断する時に使う

# 実践
まずはじめに以下の変数を定義します。
```index.js
const color = '赤青'
const red = '赤'
const blue = '青'
const white = '白'
```

次に任意の文字が含まれているかどうかのロジックを作ります。（本題）
```index.js
color.includes(red)
// true

color.includes(blue)
// true

color.includes(white)
// false
```

実際にアプリなどで使う場合の想定としては、その値が含まれているかどうかで条件分岐を行ったりする場面が想定されます。
MATLABの静的変数

静的変数の設定。
Singletonなので、実質グローバル変数。運用時には注意。


# 静的データ
参考：[静的データ](https://jp.mathworks.com/help/matlab/matlab_oop/static-data.html)

appdesinerの各methodからインスタンスとして開くclass
```matlab:UseData.m
classdef UseData
   properties (Constant)
      Setting = SettingClass;
      Condition = ConditionClass;
   end
   % Class code here
end
```

上のUseData.m内のSettingとConditionのclass。
propertyは途中で増やせない。
```matlab:SettingClass.m
classdef SettingClass < handle
   properties 
      SetA = 10;
      SetB = 20;
   end
end
```
```matlab:ConditionClass.m
classdef ConditionClass < handle
   properties 
      ConditionA = 100;
      ConditionB = 200;
      ConditionC = 200;
   end
end
```

appdesinerのmethodで変数を使うときや、変更するとき。
```matlab:matlab.m
h = UseData;    % インスタンス。最初やclear UseData後はコンストラクタ。
h.Setting.SetA = 30;    % 変数変更。
% SettingClassに直接入力しているコンストラクタ値は変わらない。
% 下記clear UseDataとしない限り、他のmethodで呼び出してもSetAは30が返る。
```

appdesinerを閉じるmethodに仕込む。
```matlab:closefunction.m
clear UseData
```
この操作後、改めてh = UseData;とすると、h.Setting.SetAの値は10が返る。
appdesiner立ち上げmethodに入れたほうがよいかも。
なぜ？Macの仮想デスクトップが勝手に入れ替わる"怪奇現象"をなんとかしたい 【Mac OSX】



## 仮想デスクトップが入れ替わる現象
例えば普段<b>＜デスクトップ2＞</b>にはVS codeで、<b>＜デスクトップ3＞</b>にはブラウザを用意していたりと仮想デスクトップ毎にメインのアプリを置いて作業しています。

でも、なぜかしばらく経つと勝手に<b>＜デスクトップ1＞</b>と<b>＜デスクトップ2＞</b>が勝手に入れ替わったりします。
![スクリーンショット 2022-05-16 19.19.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173803/11f70245-5c1c-c848-a700-5bcf5289e811.png)


## Macのシステム環境設定から解除できます
なんと、OS側のデフォルト設定が反映されていました。

システム環境設定 / Mission Control の設定画面
<b>最新の状況にもとづいて操作スペースを自動的に並べ替える</b>
のチェックを外すと勝手に入れ替わらなくなります。
![スクリーンショット 2022-05-16 19.28.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173803/54ddc1fc-3110-c00e-249b-7b7e3de4e7fe.png)
Vagrantで使用するboxをubuntu20からubuntu22へ変更したメモ

## 概要
Vagrantfileのboxを `ubuntu/focal64`から`ubuntu/jammy64`へ変更した。
今まで動いていたものが動かなくなったので対応した。

[対応コミット](https://github.com/hibohiboo/develop/commit/af114ffa67517a6059058269f25fca6f74105560)

## 環境
* Windows10 Home バージョン21H2(OS ビルド 19044.1706)
* VirtualBox 6.1.34 r150636 (Qt5.6.2)
* Vagrant 2.2.19


## apt-get updateに失敗する。
以下のエラーが発生。

```
 Temporary failure resolving
```

[Vagrant で Temporary failure resolving となる問題の解決 – イントラネット DNS 編](https://aquasoftware.net/blog/?p=1575)を読むに、systemd-resolved のスタブリゾルバ周りの問題。

このboxには、記事で紹介されている `/etc/netplan/01-netcfg.yaml`が入っていなかったので、
それを作成して`netplan apply`で適用する方法をとった。

## docker-composeが止まる

```
 => => extracting sha256:ae7bcede80b1916d73be58ae0a2af8321770c4ce0c8ada05c39271e292355325                                                                  0.9s 
 => => extracting sha256:37471fc83c2dc382a8aec5dc1c1f0f2f8156f4df529cd1aea7647cbaee4b25fa                                                                  0.9s 
 => => extracting sha256:0162432a49c07aa492d3e1031af58a9a9f9b22acde859829434e5a54d019aa1c                                                                 11.9s 
 => => extracting sha256:7ee8ddc463fd0224112f41976e81d15dd46444f93185d9cde6203a0185857be2                                                                138.3s 
 => [internal] load build context                                                                                                                          0.2s 
 => => transferring context: 653B        
```

virtualboxには以下の文言が表示されていた。

```
BUG: soft lockup - CPU#
```

また、別のバグも検出。

```
failed to solve: failed to register layer: error creating overlay mount to /var/lib/docker/overlay2/9ff8a5dc965cad8f64e927be8b02a933d369743fc78bb54cb4be74d3b1877c45/merged: too many levels of symbolic links
```

起動オプションを治したらなおった、、、？
ちょっと不明

[対応コミット](https://github.com/hibohiboo/develop/commit/e8f75dc4a3248219112bee57ba706f921f33f037)

## 参考

[Vagrant で Temporary failure resolving となる問題の解決 – イントラネット DNS 編](https://aquasoftware.net/blog/?p=1575)
[Ubuntu 16.10 その7 - ローカルDNSリゾルバーの仕組みが変わる・systemd-resolvedの採用](https://kledgeb.blogspot.com/2016/06/ubuntu-1610-7-dnssystemd-resolved.html)
[ubuntu 初期設定 : ネットワークの設定](https://www.server-world.info/query?os=Ubuntu_20.04&p=initial_conf&f=3)
古いMATLABでcsv保存

R2013より前を想定。最新のバージョンを使う場合は、非推奨の方法。
カンマ区切りのcsvかtxtファイルとして書き出したい。

# 古いMATLABで使えない関数
writetable (R2013b)
writecell (R2019a)
writetimetable (R2019a)
writematrix (R2019a)
など

# 保存先を作る
ファイル名と出力先が決まっている場合は
[fopen](https://jp.mathworks.com/help/matlab/ref/fopen.html)
を使う。

```matlab:matlab.m
fid = fopen('filename.csv', 'w');    % 新規作成もしくは上書き保存の場合
fid = fopen('filename.csv', 'a');    % 新規作成もしくはファイルの末尾にデータを追加する場合
```
| permission | 意味 |
|:-|:-|
| 'r' | 読み取り用にファイルを開きます。 |
| 'w' | 書き込み用にファイルを開くか、新規ファイルを作成します。既存の内容がある場合、その内容は破棄されます。 |
| 'a' | 書き込み用にファイルを開くか、新規ファイルを作成します。ファイルの末尾にデータを追加します。 |
| 'r+' | 読み込みおよび書き込み用にファイルを開きます。 |
| 'w+' | 読み込みおよび書き込み用にファイルを開くか、新規ファイルを作成します。既存の内容がある場合、その内容は破棄されます。 |
| 'a+' | 読み込みおよび書き込み用にファイルを開くか、新規ファイルを作成します。ファイルの末尾にデータを追加します。 |
| 'A' | 現在の出力バッファーの自動フラッシュを行わずに、追加用にファイルを開きます。 |
| 'W' | 現在の出力バッファーの自動フラッシュを行わずに、書き込み用にファイルを開きます。 |


ファイル保存のためのダイアログボックスを開く場合は、
[uiputfile](https://jp.mathworks.com/help/matlab/ref/uiputfile.html)
を使う。

# ヘッダーの追加
文字列をdlmwriteで保存すると、一文字づつカンマ区切りになるので、
[fprintf](https://jp.mathworks.com/help/matlab/ref/fprintf.html?searchHighlight=fprintf&s_tid=srchtitle_fprintf_1)
を使う。

```matlab:matlab.m
% さっきのfidに書き込む
header = ['header1', ',', 'header2', ',', 'header3'];
fprintf(fid, '%s\n', header);
fclose(fid);
```

| type | formatSpec | 説明 |
|:-|:-|:-|
| 整数、符号付き | %d または %i | 基数 10 |
|| %u | 基数 10 |
|| %o | 基数 8 (8 進法) |
|| %x| 基数 16 (16 進法)、小文字 a–f |
|| %X | %x と同じ、大文字 A–F |
| 浮動小数点数 | %f | 固定小数点表記 (小数点以下の桁数の指定には精度演算子を使用) |
|| %e | 3.141593e+00 などの指数表現 (小数点以下の桁数の指定には精度演算子を使用) |
|| %E | %e と同じだが、3.141593E+00 のように大文字 (小数点以下の桁数の指定には精度演算子を使用) |
|| %g | %e または %f をコンパクトにしたもので、後続のゼロなし (有効桁数の指定には精度演算子を使用) |
|| %G | %E または %f をコンパクトにしたもので、後続のゼロなし (有効桁数の指定には精度演算子を使用) |
| 文字または文字列 | %c | 単一の文字 |
|| %s | 文字ベクトルまたは string 配列。出力テキストのタイプは formatSpec のタイプと同じです。 |

# 数値配列の追加
文字列を含む場合は、ヘッダーと同じ書き方。
数値配列の場合は、
[dlmwrite](https://jp.mathworks.com/help/matlab/ref/dlmwrite.html)
を使う。

```matlab:matlab.m
% さっきのfilename.csvに書き込む
M = magic(3);
dlmwrite('filename.csv', M, '-append');
```
'-append'は、データを既存ファイル filename の末尾に追加する意味。
この関数が、R2019a 以降は非推奨。
Object.keysの使い方

# Object.keysとは？
- あるオブジェクトがあったとして、その中のキー名だけを抽出したい時に使う
- 値が取れたあとは新しい配列を生成する
# 実践
まずはじめに以下のようなオブジェクトを用意します。
```index.js
const datas = {id: 1, string: 'box', number: 10, boolean: true}
```
次に`id`と`string`と`numer`と`boolean`を抽出します。（本題）
```index.js
const dataKey = Object.keys(data)
console.log(dataKey)
// ['id', 'string', 'numer', 'boolean']
```

これですべてのキーを取ることができました。

コンソールで実際に試すと以下のようになります。
![スクリーンショット 2022-05-20 23.12.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2559448/fc536778-05e7-8850-205e-97c3aecf398d.png)
WordPressでアニクラDJ用のアーティストサイトつくってみた。その2【サイト構成の設計】

# サイト構成をきめよう！
土台となるサイト構成を設計していこうと思います。
設計といっても、そこまでガチガチではないものです。

### まずは情報収集

https://www.amazon.co.jp/Web%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E8%89%AF%E8%B3%AA%E8%A6%8B%E6%9C%AC%E5%B8%B3-%E7%9B%AE%E7%9A%84%E5%88%A5%E3%81%AB%E6%8E%A2%E3%81%9B%E3%81%A6%E3%80%81%E3%81%99%E3%81%90%E3%81%AB%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%A2%E3%82%A4%E3%83%87%E3%82%A2%E9%9B%86-%E4%B9%85%E4%BF%9D%E7%94%B0-%E6%B6%BC%E5%AD%90/dp/4797389036/ref=tmm_hrd_swatch_0?_encoding=UTF8&qid=&sr=

デザイン集を参考にしながら、方向性を決める。

### アーティストサイト

アーティストサイトをネットサーフィン。
かっこよいおしゃれなサイトないか見ていきます。

https://www.yonyon-musiq.com/

https://www.j-popper.jp/

#### サイトの重要なポイント
- かっこいい写真
- ミックス音源のポートフォリオ

このあたりは、意識していかないとダサくなりそうな感じします。


その中でまとめサイトを発見

https://japandjnet.com/

DJ-Searchのタブから、昭和歌謡、アニソン、J-POPを選択。
探してみたが、Twitter・Instagram・Facebookアカウントをそのままアーティストページとして運用している方がほとんどです。

プロとして、事務所に所属している場合は公式サイトがありますが、個人的にDJのアーティストサイトを作成している人はあまりいない印象です。


### ワイヤーフレームのようなものを作成
以下の手順で、大まかに作成します。大切なのはクイック＆ダーティです。
とにかく早く汚くていいので、アウトプットします。
- 基本的に手書き
- いくつかのサイト構成で良さげなものを抜き出す。
- その中から比べて、共通項目を必須コンテンツとする。


### サイト構成をきめた
- 必須ページ

| ページの要素 | 固定OR投稿一覧 | カテゴリ | 備考 |
|:-:|:-:|:-:|:-:|
| トップ | 固定  |   |   |
| アバウト  |  固定 | プロフィール、スキル、ライク  |   |
| ブログ  |  投稿一覧 | イベント、DJ、アニメ、その他  |   |
| コンタクト  | 固定  |   |   |
| よくある質問  | 固定  |   |   |
| プライバシーポリシー  |  固定 |   |   |

- 追加要素
sns連携、ファビコン作成、写真加工

# 次回の作業
- トップページの作成
- ロゴ、写真などの素材準備
統計ど素人がpythonでt検定をした

## 1. 初めに
初めに断りを入れておくと、大学時代から一応軽く統計を学んできたがいまいち自信がない
何か間違っていたり、勘違いをしていそうでしたらどんどんご指摘をいただきたいです

## 2. 背景
emacsのpython設定も（なんとか？）終了し、kaggleを物色していたところSpotifyのデータを見つけた。このデータの中身は2010年〜2019年のtop100のデータが入っている
https://www.kaggle.com/datasets/muhmores/spotify-top-100-songs-of-20152019

面白そうだなーとなんか分析できないかなーと考えた結果、年を１つの標本として差がありそうなところをt検定してみることにした。(この時点で無作為抽出ではないのではないかとヒヤヒヤしている）

## 3. データ観察
ということで、時系列とデータに分けてグラフに書き出してみた
横軸は年の推移を表しており、縦軸にそれぞれの属性の値の平均値が入る
縦の棒は標準偏差を表している
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607844/c3cf9bcb-2751-c5e8-56d7-f1e04c2258ec.png)

うーーん...ばらつきすぎかな？？
年別に見ていくとnrgyとdnceとpopの2010 vs 2019がいいのかなあと思い、そこを分析していく

要素説明（かなりそのまま）
nrgy:enrgic the song is
dnce:danceability of the song
pop :populality of the song

## 4. ヒストグラム
分布を見るためにnrgyとdnceとpopの2010 vs 2019の個数をヒストグラムに書き出してみた
![Figure_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607844/10bbd121-b9df-b8e5-0762-07066084218a.png)

あ、でもなんか正規分布っぽさがありそうな気がしないでもない...
中心極限定理で正規分布に従うと仮定する(ここも完璧な理解では無い)

そしてここからは有意差が出る可能性があるnrgyについて検定を行っていこうと思う

## 5. F検定
分散によってウェルチを使うかスチューデントを使うか変化するので調べる
ソースコードは以下

```python:python
from typing import Any
import pandas as pd
import numpy as np
import scipy.stats as st

data = pd.read_csv("Spotify2010-2019Top100.csv")

data: Any
d_2010 = data[["topyear","nrgy"]].query("topyear == 2010")
d_2019 = data[["topyear","nrgy"]].query("topyear == 2019")
d_2010 = d_2010[["nrgy"]]
d_2019 = d_2019[["nrgy"]]
d_2010 = d_2010.values
d_2019 = d_2019.values

d_2010Var = np.var(d_2010,ddof=1)
d_2019Var = np.var(d_2019,ddof=1)
d_2010df = len(d_2010)-1
d_2019df = len(d_2019)-1
f = d_2010Var/d_2019Var
one_sided_pval1 = st.f.cdf(f, d_2010df, d_2019df)  # 片側検定のp値 1
one_sided_pval2 = st.f.sf(f, d_2010df, d_2019df)   # 片側検定のp値 2
two_sided_pval = min(one_sided_pval1, one_sided_pval2) * 2  # 両側検定のp値

print("F:      ",round(f,3))
print("p-value:",round(two_sided_pval,3))
```

F検定は以下のようになった
`F:0.71 ,p-value: 0.09`
0.05 < p なので、スチューデントのt検定かな

## 6. t検定
先ほどのデータに追加して以下を記述
```print(st.ttest_ind(d_2010,d_2019))```
結果は以下のようになった

`Ttest_indResult(statistic=array([7.11047038]), pvalue=array([2.05645336e-11]))`

一般的な有意水準は5%なので
p<0.05で有意差ありと

つまり2010のSpotify Top100 の方が 2019のSpotify Top100より曲がエネルギッシュということが示された（多分）

## 7. 感想
なんとか一通りのt検定を行った。
ツッコミどころだらけだと思いますので、何かあればコメントをよろしくお願いします。


## 8. 参考文献
https://www.kaggle.com/datasets/muhmores/spotify-top-100-songs-of-20152019
https://qiita.com/suaaa7/items/745ac1ca0a8d6753cf60
https://qiita.com/code0327/items/a96dd2fbd8a491d2eeaa
Lambdaでgoを取り扱う


## Functionを作る

```handler.go
package main

import (
	"context"
	"fmt"

	"github.com/aws/aws-lambda-go/lambda"
)

type MyEvent struct {
	Name string `json:"name"`
}

func tes(ctx context.Context, name MyEvent) (string, error) {
	return fmt.Sprintf("Hello %s!", name.Name), nil
}
func main() {
	lambda.Start(tes)
}
```

## Zipを作る
- LambdaでGoを扱う場合、go buildしたバイナリファイルをzipにしてLambdaFunctionへアップロードする必要がある

```
go mod init go-lambda
go get github.com/aws/aws-lambda-go/lambda
go mod tidy
GOOS=linux go build -o handler handler.go
zip function.zip handler 
```

## Lambda設定
zipファイルをアップロードし、ハンドラーを`handler`にする。
Lambda設定のハンドラーはZipにした際のバイナリファイル名になるので注意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/93f909d2-bd2c-bd3c-6e8b-37fc3d687357.png)

## テスト
テストするといけるはず。
今回のコードではインプとされるJSONデータはなんでもよいので何も考えずにテストボタンを押せば良い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/9eba2108-e0dd-e2a1-2d01-386c08e12d29.png)


## 参考
https://www.cview.co.jp/cvcblog/2021.01.15.Pu1pTwLHNUXVe6dnNHrHc#deploy
やっぱり、エンジニアは黙って CUI って話

Ubuntu マシンの OS (14.04)をアップグレードする必要があり、深く考えず GUI （アップデートマネージャ）で行いました。

しばらくして確認してしたら、下記のように表示されて起動しなくなっていました。
（おそらく、アップグレード中に PC　が落ちで、再起動した。）
```
[FAILED] Failed to start Load Kernel Modules.
...
```

結局、CUI （Ctrl + Alt + F2） に切り替えて、コマンドでアップグレードしました。
```
sudo apt update
sudo apt upgrade
```

昔、先輩エンジニアから、「男は黙って、CUI だ」と言われたことを思い出しました。
ローカルでも使える超簡易な絞り込み機能（プルダウン・キーワード検索）付きリスト

## 画像やPDFも載せられる絞り込み機能付きリストがほしい

自分が過去に作ったページとか画像などを見返す必要が時々あって、リストにして管理したかった。

外部サービスを使うほどでは無かったので、パワポに画像を貼り付けてリストっぽくしてctrl+Fで探したりしてたけど、絞り込みできないから不便だった。エクセルだと画像やPDFを含む絞り込みは厳しい。

なので、htmlだけでそれっぽいリストを作成しました。

データはJS内の配列で羅列。
移動させやすいようにCSSもJSも全部htmlファイルにインラインで入れてしまっているので、ミニマムこの1ファイルだけでOKです。
jQueryをCDN読み込みじゃなくてダウンロードすれば、オフラインでも使えますね。

<p class="codepen" data-height="700" data-default-tab="html,result" data-slug-hash="NWygdPy" data-user="watar" style="height: 700px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/watar/pen/NWygdPy">
   easysearch</a> by wataru (<a href="https://codepen.io/watar">@watar</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

**▼検索フォーム周り**
プルダウンの値とキーワードは掛け合わせで検索可。単純にtd内のテキストを全件findしてるだけです。
リセットボタンで、絞り込み全部解除＆フォームリフレッシュするようにしています。

**▼テーブル**
JSの最初の配列にデータ羅列したら、自動的にhtmlのテーブルが生成されるようにしています。
上記の例ではテキストと画像を入れているけど、`<object>`タグを使ってPDFを読み込んだり、リンクにしたり、まとめたい情報によって変えると良いと思います。

上記の例ではqiitaにアップした画像を使っていますが、相対パスでローカルの画像を読みこむようにすれば通信が発生しないのでサクサクです。
（`<object>`タグや`<embed>`タグで埋め込むようにすると、数十件以上あると激重になるのでそこだけ注意です。`<object>`でPDF資料200ページ分読み込むようにしたら表示に1分半かかった）
FIDO とは

## 勉強前イメージ

セキュリティのなにかの用語だった気もする

## 調査

### FIDO とは

Fast Identity Online の略で、ファイド と読み 高速なオンラインID認証 という意味になります。
認証技術でパスワードに代わる認証手段で、指紋認証や虹彩認証などが挙げられます。

FIDOの背景として、ID・パスワードの漏洩やなりすましが多く課題となっています。
最近ではID・パスワードの他にワンタイムパスワードや端末IDなど使用する多要素認証が多くなってきていますが
それぞれ端末を盗まれたりされることで安全性が落ちてしますケースが多く存在します。
その為ID・パスワード以外での本人確認の強化が進められており
認証情報を盗み取られることが不可能で、また認証情報をサーバに保存しなくても良い認証方法として注目されています。

FIDOはFIDOアライアンスという非営利団体が開発を行っており、国際標準化を進めています。

### FIDOのメリット

- セキュリティが高い

機密情報をサーバとやり取りをしないので
情報漏洩のリスクが低いです。

- 操作が簡単

ID・パスワード方式はパスワードを覚えることだったり、定期的に入れ替えが必要になりますが
FIDOは覚えることがなく認証が完了します。

### FIDOの認証方式

- FIDO UAF : パスワードレス認証

スマホでの利用を想定した生体認証などを用いて行う認証方式です。

- FIDO U2F : 二段階認証

ID・パスワードを入力した後、セキュリティキーなどでの二個目の要素の認証も行います。

- FIDO2 : Web認証

生体認証のデバイスなどを利用して、webブラウザを通じたログインを行います。

## 勉強後イメージ

AWSではMFA認証はほぼ必須だけど、それでも確かに端末盗まれたら終わりよね・・・

## 参考

- [～パスワードのいらない世界へ～より手軽かつ強固な認証を](https://ftsafe.co.jp/products/fido/)
- [FIDO（Fast Identity Online）](https://www.nec-solutioninnovators.co.jp/ss/insider/security-words/27.html)
JupyterLabのvim拡張でvimrcを使う

##

https://github.com/jupyterlab-contrib/jupyterlab-vim
こちらの拡張機能でjupyterlab内でvimを使っている場合に、キーバインドのカスタマイズなどでvimrc的なものを書きたい時。

https://github.com/jupyterlab-contrib/jupyterlab-vim/blob/HEAD/modify-keybinds.md

拡張機能のgithubのmodify-keybinds.mdに、jupyterlab-vimrcが使えると書いてある。

https://github.com/ianhi/jupyterlab-vimrc#jupyterlab-vimrc

自分はとりあえずEscだけjkで使えるようにしました。(mac)
基本情報（基数変換）

基数変換は簡単に言うとn進数からm進数に変換することです。
ここは実際に例を見ながら計算してみます。

## N進数から10進数への基数変換

2進数で11011という数値が10進数だといくつになるか計算してみます。

```
各桁の重み 128 64 32 16 8 4 2 1
2進数       0  0  0  1 1 0 1 1
``` 
11011という2進数があったとすると
16+8+2+1=27

となります。

## 10進数からN進数への基数変換(重みを使う)
例えば199という10進数を2進数に直すとします。
199から各桁の重みを引いていきます
```  
各桁の重み 128 64 32 16 8 4 2 1
2進数       1  1  0  0 0 1 1 1  
```
197-128=71 引けたから1
71-64=7    引けたから1
7-32       引けないから0
7-16       引けないから0
7-8        引けないから0
7-4=3      引けたから1
3-2=1      引けたから1
1-1=0      引けたから1

で11000111です。
## 10進数からn進数への基数変換（わり算とかけ算を使う方法）
「整数部はわり算」で「小数部はかけ算」を行うやり方もあるようです。

13.375という10進数を例にすると

```
整数部
2|13 
2| 6 ... 1  
2| 3 ... 0
2| 1 ... 1
 ---
   0 ... 1  あまりの部分を下から上に数えます
小数部
2 * 0.375 = 0.75  *.**の整数の部分を上から下に数えます
2 * 0.75  = 1.5
2 * 0.5   = 1.0
```
1101.011

整数部の余りの数と小数部の整数部を組み合わせて上記の結果となりました。

## 2進数から8進数・16進数の基数変換

8進数は2の３乗で16進数は2の4乗です。

2の3乗とは1×2×4が2の3乗ですね。
例えば1101.01という2進数を8進数に直した場合は
```
001 101 . 010
421 421 . 421
-------------
001 401 . 011
// 3つに分割してその中で足し算する  
```
1と5と2で15.2となります。

2の4乗とは1×2×4×8が2の4乗ですね。
1101.01という２進数を16進数に直した場合は
```
1101 . 0100
8421 . 8421
-----------
8401 . 0400  
// 4つに分割してその中で足し算する
```
１６進数は図で表さないと忘れてしまうので図で見てみます。

|十進法|0	|1	  |2	|3	  |4	|5	  |6	|7	  |8    |9	  |10   |11   |12	|13	  |14	|15   |
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| 
|十六進法|0	|1	  |2	|3	  |4	|5	  |6	|7	  |8	|9	  |A	|B	  |C	|D	  |E	|F    |

13.4ですが13はDなのでD.4で表します。
16進数は9の次にA~Fですね。

## 8進数・16進数から2進数への基数変換
先ほど記述したことと逆を行うとできます。

15.2という8進数を2進数に戻す場合は
```
421 421 . 421
001 101 . 010
```
2進数だと1101.01

D.4という16進数を2進数に戻す場合は
```
8421 . 8421
1101 . 0100
```
2進数だと1101.01

となります。


### まとめ
進数の計算は色んな方法があるようなので自分にあった計算方法でやることが重要ですね。
Visual Studio CodeでLive ServerのGo Liveを押してもブラウザが起動しない場合の対応方法

## 概要
Visual Studio Codeの拡張機能であるLive Serverをインストールし、Go Liveを押してもブラウザが起動しない場合に設定すべき項目をまとめます。

## 現象
本来ならば以下の手順でブラウザ上でソースコードを確認できるはずだが、3でブラウザが自動的に起動しない。
1.Visual Studio Codeの拡張機能のLive Server(以下)をインストールする。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248421/94827f20-781c-4a26-1703-4b8eb198bda3.png">

2.確認したいファイルを右クリック「Open with Live Server」をクリック。
<img width="300" alt="OpenWithLiveServer.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248421/2938c0e6-da38-9f44-78a5-532aca7986e1.jpeg">

3.ブラウザが自動的に起動し、実装した内容が表示される。

## 対応方法
以下の手順で環境変数のパスを設定する。
1.コントロールパネル
2.システムとセキュリティ
3.システム
4.システムの詳細設定
5.環境変数
6.システム環境変数のPathを選択
7.「C:\Windows\System32」を追加する。
<img width="300" alt="環境変数.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248421/0bc0b756-2961-fc19-3ffa-d65f0c31efb7.jpeg">
8. Visual Studio Codeを再起動し、Live Serverを再度確認する。

これでうまくいくはずです。
以上。

## 分からないこと
wsl+ubuntuの場合、Live Serverを実行してもブラウザが起動しない。
ESP32 と MicroSD スロットの結線（SPIの場合）

## 結論

Arduino のコードでは、下記のピンがデフォルトになっているようです、

```pins_arduino.h
static const uint8_t SS    = 5;
static const uint8_t MOSI  = 23;
static const uint8_t MISO  = 19;
static const uint8_t SCK   = 18;
```

つまり、下記の通りです。

| ESP32 PIN番号 | SPI(ESP側) | SPI(MicroSD側) | SD mode |
|:-:|:-:|:-:|:-:|
| 5   | SS    | CS   | CD/DAT3  |
| 23  | MOSI  | D1   | CMD  |
| 19  | MISO  | D0   | DAT0  |
| 18  | SCK   | SCLK | CLK  |

## Arduino の場合

上記の結線をした場合、下記のコードでいけます。

```.cpp
#include <SD.h>

void setup() {
  Serial.begin(115200);
  
  if(!SD.begin(sd_ss)){
      Serial.println("Card Mount Failed");
      return;
  }
  Serial.println("INIT OK");
}
```

SPI のピンを変更する場合は下記です。

```.cpp
#include <SPI.h>
#include <SD.h>

enum { // ここを適切に変更する
    sd_ss = 5,
    sd_mosi = 23,
    sd_miso = 19,
    sd_sck = 18
};

void setup()
{
    SPI.end();
    SPI.begin( sd_sck, sd_miso, sd_mosi, sd_ss );

    Serial.begin(115200);

    if ( !SD.begin( sd_ss, SPI ) )
    {
       Serial.println("Card Mount Failed");
       return;
    }
}
```

## 参考

悩んだらコードをみるべし。

- [pins_arduino.h](https://github.com/espressif/arduino-esp32/blob/master/variants/nano32/pins_arduino.h) 
- [SPI.h](https://github.com/espressif/arduino-esp32/blob/master/libraries/SPI/src/SPI.h)
- [SD.h](https://github.com/espressif/arduino-esp32/blob/master/libraries/SD/src/SD.h)