OmniAICreator/Qiita-1.07M huggingface dataset:
これから、AIやML・データサイエンティストのスクール講座を受講される方へ

**初めまして、ももちゃんのパパです。**

タイトルがいきなり偉そうな事言いやがってと言われそうですが、今まで某スクールで200名以上教えてきました。
Python,AI（じゃなくてMLなんだけど。。。）、DataScience、Blockchain（Solidity）と、幅広くメンターとして
教師ではなくこれから同じ業界で働いてくれる仲間を増やせるんだと意気込みを持って、最初は転職活動中でしたが、仕事が決まってからは
仕事の合間にメンターとして（講師とか教師とかではなく、敢えて言うなら新人の方に仕事が出来るようになるために
他のことも色々と相談に載ったり）活動してきました。これが、日本が遅れていると言われているところを変えられるんだ！！
と意気込んで、仕事を後回しにして（徹夜になりますが。。。（笑））力を注いできました。

**2021年でスクールでのメンター活動は辞めます**
------------------------------------
**理由は**
**1.コースを受けた人が転職なり就職なり出来ていないこと＝理解出来ていない、使えない事実を知った**
**2.メンターが、環境構築すらできない（環境が壊れたから作り直せ＝今までの結果は、全て消えることを平気で言う）**

**スクール運営されている側は、「出ているじゃないか」「出来ているじゃないか」と言うでしょう。**
事実は事実。実現は、変えられません。今まで、沢山の事例とヘルプも受けました。そんなことも知らないの？と
愕然としたことも何度もありました。私は、合う人とは話すタイプ（逆に、初めての方は苦手だけど、打ち解けるのは早いです。
弄られるのが仕事？（笑）みたいなものなので）で、相手の将来を思いすぎて厳しいことを言いすぎたり、
相手が適当なら適当に合わせて来ました（適当な奴に真剣にやる必要ある？）。

***何故知ったか。これは、皮肉にも受講生の方からのフィードバックでした（スクールも予測していなかったでしょうね）。***
同じスクール出身者が同じスクールでデータサイエンスを学んだその道のプロが面接する機会があったそうです。
（面接する側が、私の受講生だった方で、私も数学では到底及ばない方でPythonでのデータサイエンスを学びに来られていました）
面接も進み、話していてペイズ統計がとか、シミュレーションとか、色々話しが出たそうです。でも、その方はこう仰ったそうです。

**「それ、データサイエンティストじゃないよ」**

これで、面接は終わりになりました。こ
Pythonでプログラム作れるとか、データサイエンスの理論（ベイズ統計とか）の課題を早々に解いても、
試験と同じで、正解です。しかし、現場で必要な人は、データを理解している人なのです。
最初は、色々あると思いますが、その姿勢がある人が欲しいのです。
「データを見て、ゴールまでの理論に関する仮説を立てて検証し、結果を理論的に説明できる人」
なのであって、1＋1＝2のような答えを出すだけの人なら、PCで十分です。
（現に、間違えてとってPCで計算だけさせている人も多いそうです）

##理系とか文系とか分ける必要は無く、ちゃんとした教育を##
受講生には、お医者さんもいらっしゃいます。医療に役立てようと、凄く忙しい中、時間を取って参加されています。
お医者様に限らず、受講生の方には2つのタイプに大別されると感じています。
（1）とても、勉強熱心だけどプログラムは良くわかっていないから、課題提出も遅い
（2）早々に課題を全て終わらせて、メンター開始時には課題は全て合格（後で見ると、？なのはありますが）

この2の受講生に、「機械学習の結果、600枚画像分析を86％の精度で17秒でできました。さて、お仕事に使えますか？」と質問します。
貴方ならどう答えますか？
「医療なんだから、99％精度がないと駄目ですね」→その通りです。でも、99％でないといけない根拠がありません。
「人がやった場合は17秒ではできないので、残りをどうするかを考えます」→人間がやれば、17秒で86％＝516枚を正しく判別できますか？（出来たら、TVのニュースになりますね（笑））

**必要なのは、後者の人です。常識や業界知識、その他必要な知識を総動員して、機械学習が出した結果を検証できる人です。**

IT業界が長いので、数多くのプログラムを作ってきました。見てきました。レビューしてきました。
最近、単体テストレベルの不具合が、本番で発生することが多いですよね。そりゃそうですよ、目先のことしか考えてないんですから。
IT業界は、魅力的かも知れません。デスマーチとか、平気でありますが（最近は、無能管理職が引き起こしているのが殆どですが）
エンジニアになりたい方は、是非プログラミングを学んで下さい。プログラムを作れる人は、普通です。色んなプログラムを合わせて
デバッグしたり機能追加したりして、期限までに目的を達成できる、そんなことを教えてくれるスクールだと良いと思います。
（どれ？と言われてもねぇ。。。行ったこと無いのでーｗ）

・プログラムではなくプログラミングが出来る人
・数値の根拠を説明出来る人
を育成するために、チャレンジして行きたいです。
2021年の年頭に当たって、今までのモヤモヤやこれでいいのか？をスッキリさせるために記事にしてみました。

※これは、私見です。色々ご意見はあるでしょうが
RDkit を用いた分子構造の描画


# 前準備


### モジュールのインストール
```
conda install -c conda-forge rdkit
conda install xlsxwriter
```

# 分子構造の描画
### モジュールのインポート
```python
import pandas as pd

from rdkit import Chem
from rdkit.Chem import Draw
from rdkit.Chem import Descriptors
from rdkit.ML.Descriptors import MoleculeDescriptors
from rdkit.Chem import PandasTools
```

### MOLオブジェクトの準備

```python
# 適当な化学構造のsmilesリストを準備する
smiles_list = ['Oc(cccc1)c1O', 'OC(C(C1)C1(Br)Br)=O', 'Cc(cc1)ccc1O',
       'Oc(cc1)ccc1Cl', 'OC(c1cocc1)=O', 'CC(C)c1nnn[nH]1',
       'CN(C=C1)C=CC1=N', 'CCc1cccnn1', 'C[C@H]([C@H]1NC)[C@@H]1NC',
       'CCCc1ncc[nH]1']

# 化合物のラベルを作成
label_list = ['sample_{}'.format(i) for i in range(len(smiles_list))]

# molオブジェクトのリストを作成
mols_list = [Chem.MolFromSmiles(smile) for smile in smiles_list]
```

### 分子ひとつの画像（png）を作成・保存する

```python
# とりあえず描画したい時
Draw.MolToImage(mols[0])

# pngファイルとして出力
Draw.MolToFile(mols_list[0],'test.png',size=(300, 300))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348376/a122e162-635a-6b42-7448-e9e372f8282c.png)

### 分子セットからグリッドレイアウトの画像を作成する

```python
img = Draw.MolsToGridImage(mols_list,
                           molsPerRow=5, #一列に配置する分子の数
                           subImgSize=(200,200),
                           legends=label_list #化合物の下に表示するラベル
                           )

#ファイルに保存する
img.save('test_grid.png')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348376/50f7c0b9-7d29-990c-76a7-4cf7b46c03f7.png)

### 画像が埋め込まれたエクセルファイルとして出力する
各分子の構造が貼り付けられた pandas dataframe を作成して、エクセルファイルとして出力する。
（例として、RDkitの分子記述子の DataFrameを使用する）

```python
# RDkit記述子の作成
descriptor_names = [descriptor_name[0] for descriptor_name in Descriptors._descList[:5]]
descriptor_calculation = MoleculeDescriptors.MolecularDescriptorCalculator(descriptor_names)
RDkit = [descriptor_calculation.CalcDescriptors(mol_temp) for mol_temp in mols_list]

df = pd.DataFrame(RDkit, columns = descriptor_names,index=label_list)
df['smiles'] = smiles_list

# DataFrameへのImageの追加とエクセルファイルでの出力
PandasTools.AddMoleculeColumnToFrame(df, molCol='IMAGE', smilesCol='smiles')
PandasTools.SaveXlsxFromFrame(df, 'data_frame.xlsx', 
                              molCol='IMAGE', 
                              size=(150,150)
                              )
```

## 追記
2018年時点では、１分子の描画 "MolToImage" 及びエクセルファイルへの出力 "SaveXlsxFromFrame" が問題なく実行できていましたが、現在は以下のエラーで実行できなくなってしまいました。

```
'Image' object has no attribute 'tostring'
```

どなたか解決策を知っていましたら、コメントいただけると幸いです。


# 参考HP
- [RDKitのPandasToolsでデータ分析を加速する（化学の新しいカタチ）](https://future-chem.com/rdkit-pandastools/#i-3)
- [RDKitの分子Molオブジェクトを扱う（化学の新しいカタチ）](https://future-chem.com/rdkit-mol/)
- [RDKitドキュメンテーション非公式日本語版サイト](https://rdkit.org/docs_jp/index.html)
- [rdkit.Chem.PandasTools module](https://www.rdkit.org/docs/source/rdkit.Chem.PandasTools.html)
centos6を使っていたdocker環境でサポート切れを対応する

# 原因
12月に入ってから今まで使えていたDocker環境が立ち上げられなくなっていたので調べたところ、centos6が11月末でサポート切れ(End Of Life)になったことに伴いepelパッケージが導入できなくなっていた。

# 変更前
```
RUN rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
```
リポジトリの場所が404になっていたので、アーカイブのディレクトリを参照するように変更。

# 変更後

```
FROM centos:6
RUN sed -i "s|#baseurl=|baseurl=|g" /etc/yum.repos.d/CentOS-Base.repo
RUN sed -i "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-Base.repo
RUN sed -i "s|http://mirror\.centos\.org/centos/\$releasever|https://vault\.centos\.org/6.10|g" /etc/yum.repos.d/CentOS-Base.repo
RUN rpm -ivh http://dl.fedoraproject.org/pub/archive/epel/6/i386/epel-release-6-8.noarch.rpm
```

# 参考にした記事
http://smoogespace.blogspot.com/2020/10/rhel-6centos-6scilin-6epel-6-end-of.html
https://qiita.com/y-do/items/b23d24a647cb99528b16

ほんとはサポート切れに伴ってcentos7にアップデートするのがベストだと思いますが、大人の事情でできないやつもありますよね。。
Gridviewのカスタマイズ

#表示、編集するためのクラス

|クラス|機能|
|---|---|
|BoundField|文字列を出力する。数値や日付などの初期設定が可能|
|HyperLink|リンクを出力する|
|ImageField|画像を出力する|
|CheckBoxField|チェックボックスを出力する|
|ButtonField|ボタンを出力する|
|TemplateField|テンプレートに基づく内容を出力する|

#参考文献
TECHNICAL MASTER はじめてのASP.NET Webフォームアプリ開発 VisualBasic対応 第２版
データの数値的要約　

データ解析の基本的な要約法である数値的要約について書いていきます。

#一次元データの要約
```
import  numpy as np

x=np.array([1,2,3,4.5,5,6.5,7,8,9,10])

average=np.mean(x)  ///平均値　  mean関数///
(Out  5.6)

med=np.median(x)   ///中央値　　median関数///
(Out  5.75)

var.p=np.var(x)  ///標本分散　　var関数///
(Out  8.19)

std=np.std(x)   ///標準偏差　　std関数///
(Out  2.86)
```

各言葉の意味についてはこちらを参考にしてください。
https://note.com/karaage_love/n/n6f617d38c528

#二次元データの要約

```
import numpy as np
import matplotlib.pyplot as plt

array=np.loadtxt(fname='example.csv',delimiter=',',encoding="utf-8_sig")
///example.csvには二列のデータが入っています。///

array_x=array[:,0]
array_y=array[:,1]  ///スライス///

plt.scatter(araay_x,array_y,s=10,c='blue',alpha='0.5')  

///散布図の作成    sは大きさのこと cは散布図の色のこと　　alphaは透明度のこと///

np.cov(array_x,array_y,bias=True) 
(Out   [[6.72727273 3.54545455]
        [3.54545455 6.        ]])
 //共分散    結果は2×2の行列　　対角成分はそれぞれx、ｙの分散。残りは共分散です。///
np.corrcoef(array_x,array_y)  
(Out   [[1.         0.55805471]
        [0.55805471 1.        ]]
///相関係数　　やはり対角成分以外が相関係数です。///


```

二次元データの要約の詳しいことをこちらを参照。
https://note.com/karaage_love/n/n992a7fdf9b1f
レンダリングエンジンはすごい！

# 目次

* レンダリングエンジンはすごい！
* レンダリングエンジンについて
* ゲームのレンダリング部分
* エンジンを作るにあたって

# レンダリングエンジンはすごい！

レンダリングエンジンってすごいんです。レンダリングエンジンっていうのは、ブラウザでいうとHTMl,CSS, JSのデータ通りに画面に写す物なのですがこれを僕が作ろうとすると絶対フリーズします。
なんで絶対フリーズする！といえるのかは、僕が一からゲーム作っているときにレンダリングに似た処理に遭遇したからです。
ゲームはすごい単純に言えば、パラパラ漫画みたいなものです。x秒間に2D3Dを描画して入力をしたら当たったかどうかを判定して描画をする。これを基本的に繰り返しています。
言ってしまえばなんてことはありません。ただのパラパラマンガです。ですが、ここにメモリが入ってくると自体は変わります。
よくメモリリークが大変、ということを耳にすることがあると思います。これって要するにメモリ内に必要のないデータが溜まってパソコンがフリーズするようになってしまいます。
そうすると、ゲームやっている最中に固まったり、操作ができなくなったりしてゲームができなくなってしまいます。
これを避けるためには、人間側でメモリリークをしないようにするか、ガベージコレクションのようなアルゴリズムを利用して避ける方法があります。僕が作っていたゲームだと、起動はできるのですが１分後にパソコンがフリーズしてしまって、どうやってメモリを開放すればいいかが全くわからなかったです。
一般で出回っているレンダリングエンジンの何がスゴイって、要するに他のソフトに干渉させずに最大限のパフォーマンスを出せるところなんです。ゲームも、性能のいいパソコンを持っていればChrome開きながらゲームをすることもできます。１６GBのメモリがあってゲームで利用するメモリの量を4GBでできれば他の12GBを使ってブラウザを開いたり、VSCODEを開いたりすることができます。
要するに非常に高価なハードを自由自在に使わせてもらえるレンダリングエンジンというのはスゴイんです！
レンダリングエンジンの構成を考えてみると、ブラウザもゲームも結構似ている構成になっていることが分かります。


# レンダリングエンジンについて

レンダリングエンジンとは、簡単に言うとパソコンが画面に描画するときに使うソフトです。FireFoxでもレンダリングエンジンが使われていてHTML, CSS, JSを読み込んでそれにあった動きを画面に映してくれます。
HTML, CSS, JSを解釈をしてそれにあった動きをエンジンが任せて描いてくれている。基本的にはメモリを自分で管理をすることはありません。少なくともHTML, CSSではメモリを気にした書き方を指摘されることはまずないです。よほどトリッキーな動きをしない限りは気にする必要はありません。
レンダリングエンジンを使うことで、作る人はフリーズのことをあまり考える必要がなくきれいなサイトを作ることができます。これってすごい画期的なんですよ。
エンジンがなくてHTML, CSS, JSの規格だけあったと仮定します。規格だけあれば、作る人は規格に合った実装を行えばサイトを解説してユーザに規格どおり作ったブラウザを配布すれば大丈夫です。しかし先程も言った通り、メモリの管理は難しいです。
HTML一つとっても、文字をただ出すのにどうやって文字を出せばいいのか、文字を出せたとしてもその状態を何時間キープしてもパソコンがフリーズしないか、ということをクリアしなければなりません。それがサイトごとに作れば作成者の自由度は上がりますが、それだけに作成者の技量が物を言って広く作ることができません。そして、利用者から見てもサイトごとに性能の差があり利用する時に必ずダウンロードをしてインストールしなければならない。
FireFoxにもいろいろな必要な機能はあるが、レンダリングエンジンがあればサイトの配布にはサーバと自分が作ったHTML, CSS, JSをサーバに置けば自分のサイトを見せることができます。

# ゲームのレンダリング部分

ゲームのレンダリングは見ている先程も言った通りパラパラマンガです。要するに写真を連射してそれをパラパラと写すようにしています。
ただ、ゲームの場合ですとカメラに写すために光の動き、オブジェクトの動きを計算してから写します。例えば、ゲームオブジェクトと光オブジェクトがあったとすると、２つのオブジェクトが並列に計算しなければなりません。２つのオブジェクトが並列で計算するのでそれだけメモリーリークの可能性が高くなります。メモリの中身を人間がいじりながらやるのでメモリを効率よく使うためにはメモリ管理はもちろんアルゴリズムも必要となります。
レンダリングエンジンとゲームエンジンを利用することで作成者はある程度までメモリの利用について気にする必要はなくなります。ゲームエンジンを使うことで通常ならメモリを気にしなければならない部分を触らずに開発ができるので１から作るよりもより自由な開発が可能になります。

# エンジンを作るにあたって

エンジンはスゴイです。エンジンの仕様をなぞればメモリをそれほど気にする必要なく作ることができます。
もちろん、マシンの性能の限界突破をしようとすればメモリの管理はしなければなりません。ゲームもサイトもアイディア勝負になる部分があり、そこでみんながアイディアを出しあえればよりよいものになります。
エンジンを作ることはやめませんが、こうしてレンダリングがすごい！ということが分かっただけでも良かったと思っています。
C++, Xcodeで競技プログラミングをしよう！

### はじめに
2021年、明けましておめでとうございます。皆様新年をいかがお過ごしでしょうか。

さて、今年2021年になって個人的に競技プログラミングに本格的に取り組もうと思い、この記事を書いています。というのも、今現在大学3年なのですが、もう時期大学4年になり、授業も少なくなるということで自分が時間が比較的確保できることになります。そこで、競技プログラミングを通してアルゴリズムとデータ構造をもう一度勉強し直そうと思い立ちました。

将来的にエンジニアとしてインターンに参加したり、就職をする上で、コーディングテストは避けては通れないことでしょう。

本記事が、Xcodeを用いてC++で競技プログラミングをするための指南書としてお役に立てば光栄です。

#### 言語はC++
競技プログラミングやインターン・就職の際のコーディングテストではC++が用いられることが多いです。競技プログラミングではコンテストごとに使用可能な言語は異なりますが、ほとんどのコンテストで使うことができ、実行速度が速い、ライブラリが充実しているなどの理由によりC++は人気が高いです。実際に競技プログラミングの回答の6割以上がC++だと言われています。「C++は競技プログラミングやコーディングテストのための言語」と言っている人がいると聞いたこともありますが、C++を使いこなせて損はないと思います。

#### エディタはXcode
環境はMacを想定しているので、Xcodeを利用していきます。

#### Atcoder向けの設定
Xcodeを開くと以下のような画面が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922608/b199c37f-e3ee-0a9b-71bd-012262e2eed5.png)

ここで、”Create a new Xcode project"　をクリックします。

すると下のようなものが出てくると思います。
ここではどのようなプロジェクトにするかを選べます。例えば、iosのアプリ、apple watchのアプリを作るかなどを選べます。

上のタブの "macOS" を選択して "Command Line Tool" をクリックし、 "Next” をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922608/977834fc-166c-8268-0c69-61e3c92f3903.png)

すると、以下のような画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922608/df926689-d904-111b-aab0-64ceaf9945a5.png)

* Project Name  
作りたいアプリケーションの名前です。
* Team  
個人だと思うので適当にPersonal Teamでご自身の名前を埋めてしまいましょう。
* Organization Name  
特に会社でするプロジェクトでもないと思うので個人名で結構です。
Organization Identifierは自分のニックネームがあるかたは、「com.ニックネーム」としてください（なんでもいい）。
* Language  
書きたいプログラミング言語の名前です。ここではC++を選びます。

埋め終えたらNextをクリックし、そのプロジェクトをどこに保存するかを選びます。

main.cppは以下のようになっていると思います。

```c++:main.cpp
//
//  main.cpp
//

#include <iostream>

int main(int argc, const char * argv[]) {
    // insert code here...
    std::cout << "Hello, World!\n";
    return 0;
}
```
これは、Hello Worldという文字を画面（コンソール）に出力するというプログラムです。
左上にある再生ボタンみたいなものを押すと(もしくはコマンド+R)、このファイルをコンパイル（機械語に変換）して走らせてくれます。

次に、main.cppと同じ場所にinput.txtを作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922608/4089632f-513b-5693-e6ea-5e14ca88f8b4.png)

こうするとinput.txtをXcodeから直接編集できるのでテストデータの入力が楽になります。

input.txtをコードから読み込めるように設定を行う。
Edit Schemeを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922608/cd8610a0-fbd0-18fe-fa8a-99f51c2dedef.png)

下記で、"Options" タブを選択し、"Working Directory" を先程のinput.txtが格納されているディレクトリを指定する。

### 使い回す用のコード
コード部分だけに集中できるように、他の部分はあらかじめ設定する。

```c++:main.cpp
//  main.cpp
//  CppTest

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

int main(int argc, const char * argv[]) {

    // input from txt （提出時にこの箇所は削除すること）
    std::ifstream in("input.txt");
    std::cin.rdbuf(in.rdbuf());

    // cinを高速にするためのおまじない
    cin.tie(0);
    ios::sync_with_stdio(false);

    /////////////////////
    // Write code below /
    /////////////////////


    return 0;
}
```
Creating DataFrames

# Missing values

To detect if the DataFrame has missing values.
Below will print boolean for every value in every column. If the value is ```NaN``` then it will print True

```python
equity_px_df.isna()
```

But above is not helpful when our DataFrame is huge. Instead we can run below to quickly tell if a column has any missing values at all

```python
eq_px_df.isna().any()
```

Since ```False``` has a value of 0, and ```True``` has a value of 1, we can run below to see how many missing values every column has

```python
eq_px_df.isna().sum()
```

You can also draw a bar plot to quickly visualize how many missing values each column has

```python
import matplotlib.pyplot as plt
eq_px_df.isna().sum().plot(kind="bar")
plt.show()
```

What can we do about missing values. One option is to drop rows that contain any missing value

```python
eq_px_df.dropna()
```

However above is not good if our dataset contains too many NaN values.
Instead we can replace NaNs with a specific value such as 0

```python
eq_px_df.fillna(0)
```

# Creating DataFrames

We can create DataFrames from 

- a list of dictionaries
- dictionary of lists

For instance to create a DataFrame of users

```python
users_list = [{"name":"Jack", "email":"jack@mail.com","age":30},
{"name":"Abror", "email":"abror@mail.com", "age":25}]
users_df = pd.DataFrame(users_list)
```

Alternatively

```python
users_dict = {"name":["Jack", "Abror"], "email":["jack@mail.com","abror@mail.com"],"age":[30,25]}
users_df = pd.DataFrame(users_dict)
```
Obsidianの<C-d>問題の解決を少し前に進めた

### 背景

[ObsidianのVimモードで<C-d>問題をなんとかしようとおもっていろいろやってみた](https://qiita.com/hann-solo/items/e62da5102e8edafb3cb9)という記事で書いた通り、

- Obsidianというメモアプリがすばらしい
- Vimの挿入モードで`<C-d>`を右一文字削除にしたいが、うまく設定できなくて困った
- Vimrc Supportプラグインの作者に相談すると「CodeMirrorのバグだとおもうから、バグレポートするといいとおもうよ」といわれたけど、待ってるのもやだ
- ので、`main.js`を直接書き換えた

これで（個人的には）満足していたのだけれど、Vimrc Supportプラグインの作者に「もう少し一般化すると、他の人も助かるなあ」といわれたので、パッチを送った。

### 改訂の要点

`main.js`の、`CodeMirror.Vim.defineOption('tabstop')`と`vimCommands.split("\n").forEach()`のあいだに、`CodeMirror.Vim.defineEx('iunmap')`を追加

```main.js
CodeMirror.Vim.defineOption('tabstop', 4, 'number', [], function (value, cm) {
    if (value) {
        cmEditor.setOption('tabSize', value);
    }
}); // ←ココ！
CodeMirror.Vim.defineEx('iunmap', '', function (cm, params) {
    if (params.argString.trim()) {
        CodeMirror.Vim.unmap(params.argString.trim(), 'insert');
    }
});
vimCommands.split("\n").forEach(function (line, index, arr) {
    if (line.trim().length > 0 && line.trim()[0] != '"') {
        CodeMirror.Vim.handleEx(cmEditor, line);
    }
});
```

`CodeMirror`の`defineEx()`メソッドをつかって、`iunmap`というコマンドを追加している。

`.obsidian.vimrc`に

```.obsidian.vimrc
iunmap <C-d>
```

と書けば良い。

### ソースコード修正とプルリク

実際には`main.ts`を修正し、`GitHub`からプルリクを送った。最終形になるまでになんどかやりとりあったけど、`merge`されてリリースされたので、もう手でしこしことプラグインを直す必要がない！！！感激。

### リソース

`CodeMirror`のキーマップ定義ファイル
https://codemirror.net/keymap/vim.js

`CodeMirror`のオンラインデモ
https://codemirror.net/demo/vim.html

`CodeMirror`のマニュアル
https://codemirror.net/doc/manual.html

Obsidian Vimrc Support Pluginのサイト（GitHub）
https://github.com/esm7/obsidian-vimrc-support


### 環境
Obsidian Vimrc Support version 0.2.2
Obsidian v0.10.1
macOS BigSur バージョン 11.1
MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
M5Paperを比較的見やすい温度計＋湿度計(Deep Sleep付き)にする

＊注意
こちらの記事はM5初心者が記述しています。つっこみは優しく、そしてアドバイスをいただけたらうれしいです。何卒よろしくお願いいたします。

M5Paperのsampleをベースにしたのですが、大変見えにくく電池消耗も激しいのでサンプルとしてどーなのかなーと思うところがあり、コードを試行錯誤で改善してみました。

```Arduino
#include <M5EPD.h>

char temStr[10];
char humStr[10];

float tem;
float hum;

M5EPD_Canvas canvas(&M5.EPD);
void setup()
{
    M5.begin();
    M5.SHT30.Begin();
    M5.EPD.SetRotation(180);
    M5.EPD.Clear(true);
    canvas.createCanvas(950, 530);
    canvas.setTextSize(6);    
}

void loop()
{
    M5.SHT30.UpdateData();
    tem = M5.SHT30.GetTemperature();
    hum = M5.SHT30.GetRelHumidity();
    Serial.printf("Temperatura: %2.2f*C  Humedad: %0.2f%%\r\n", tem, hum);
    dtostrf(tem, 2, 2 , temStr);
    dtostrf(hum, 2, 2 , humStr);
    canvas.drawString("Temperature:" + String(temStr) + "*C", 100, 30);
    canvas.drawString("Humidity:" + String(humStr) + "%", 100, 130);
    canvas.pushCanvas(0,0,UPDATE_MODE_A2);
    sleep(1);
    esp_deep_sleep(500*1000*1000);
}
```
[M5StickCで小型環境センサ端末を作る](https://ambidata.io/samples/m5stack/m5sitckc/)
deep sleepについてはこちらを参考にしました。他にも参考にしたかもしれないコードがあったと思いますが、失念したのでその点お許しください。
ガチガチのウォーターフォール開発脳からアジャイル開発脳に劇的に変化した1年を振り返る

###経緯
約1年前まで、大手SIerでガチガチのウォーターフォール開発をしていた筆者が会社を辞め、食わず嫌いしていたアジャイル開発を1年経験し、アジャイル開発への意識が劇的に変化したので、そんな1年を振り返る。

ウォーターフォール開発とアジャイル開発は対立構造にあるものとは思ってないけれど、比較することで見えてくるものもあるので、こんな思考からあんな思考に変わったよ！というのを書いていく:cow2:

###スクラムとは？
アジャイルのうちスクラム開発というのは、スクラムガイドで定義されている。スクラムガイドは20ページほどしかない。抽象的な表現が多く、スクラムの捉え方はチームによって異なることを推奨しているかのようにも見える。
[スクラムガイド](https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf)
わたしのチームではこんな考えをしているよ！というものを紹介したいと思う。

###アジャイル的考え方(スクラムVer)
1. 要件定義工程で要件をかっちり決め、それ以降の工程では簡単に仕様変更をのまない！！！
これはウォーターフォール開発をしているベンダーでは、あるある。お客さんの仕様変更を受け入れてあげたいところだけれども、後ろの工程にいけばいくほど、手戻りは増え、その仕様変更に対する影響調査も増える。また、障害を埋め込むリスクも上昇する。
お客さんにとってもベンダーにとってもなんというマイナス。
→スクラムでは、1つ1つのバックログで仕様を決める。つまり、スクラムのアウトプットの完了条件を定める。わたしのチームでは、アクティブなスクラムにバックログを入れる前に仕様をPOと協議する時間を設けている。（1週間のスプリントで1時間程度）実際のスクラムに入ったあとは、仕様の変更はほとんどしないが、仕様の詳細化は行うため、POとコミュニケーションをとる。仕様の変更が行われるタイミングはスプリントレビュー。スプリントレビューのタイミングでアウトプットを見て仕様変更ができるので、開発者にとっては、次のスプリントのスケジュールに組み込めばよく、ステークホルダーにとっても、アウトプットを見て仕様を決めることができる。これはアジャイル開発の1番の強み::cow2::four_leaf_clover:

2. レビューする側とレビューされる側という体制が生む主体性のなさ！！！
SIerでよくある下請け・孫請け構造は、責任範囲を明確にしているため、自分の役割やタスクの範囲はここまで！責任をとりたくない！気持ち・人を生み出しやすい。わたしのチームでは、誰もがどのタスクもとれるように工夫している。例えばとれないと思うタスクがあればペアプロやモブプロ（プログラミング以外も）で実施し知識の共有化を行う。その結果、1年後には全員がすべてのタスクがとれるようになった（これは本当に劇的な進化！）誰もがどのタスクもとれるになると、レビューする立場、される立場という上下の関係性ではなく、フラットなメンバーシップになり、相互にレビューできるようになり、品質もあがる！

3. 大規模プロジェクトの見積もりは、どんなに審議を通しても正確になるはずがない！！
大規模プロジェクトの受注は、Sier にとっては売上確保に欠かせないもの。要件定義から基本設計までを準委任契約、その後の工程を請負契約で行うパターンが多いかと。基本設計までは決まっているので、内部設計から開発は見積もれるという前提で請け負っている。本当にそうでしょうか？影響調査や技術調査し、タスクを洗い出して詳細に見積もり、過去の大規模プロジェクトと比較したとしても、開発してみたら、想定以上の工数がかかったぁああ！ということがわたしはよくありました...まだやってないことを正確に見積もるのは、大きい単位ほどずれが発生するのは当たり前。スクラムではそのチームのアウトプットをストーリーポイントで見積もる。スクラムが1週間であれば1週間のアウトプットがどのくらいのタスクなのかを毎回見積る。毎回小さい単位で見積もることで、どんどん見積りの精度が上がるサイクルができあがるのだ。スクラムガイドに経験主義に基づくと記載があるのも頷ける。

###最後に
スクラムの難しいところもたくさんあるのだが、新年なので？(笑)今回はいいところだけを紹介して、終了したいと思う:cow2:難しい点はまたの機会に！
indexアクションの設定　自分のメモ

メモ　
database.ymlではデータベースの設定を記述できる
RDBとは表形式でデータを管理できるデータベース
RDBMSはRDBを管理するシステムで、RDBMSの中にはMySQLがある！！

複雑な機能をまとめたものをライブラリという
Gemの情報はGemfile内で管理する



データベースに記録する内容をマイグレーションファイルに記述する時

def change
  create_table :tweets do |t|
    t.string :name 
    t.text :image
  end

のように記述する　t.型 :カラム名　　の形で記述
データベースに反映させるときは　rails db:migrateコマンドを使用

・ここまでの流れで出来上がったカラム名に対してデータを追加する場合
コンソールを起動

Tweet.create(name: "takashi", text: "Nice to meet you!")

これでTweetモデルから作ったtweetsテーブルのnameカラムとimageカラムにそれぞれ情報を保存（create）できたことになる。
→でもレコード番号を指定してないなら保存できないんじゃ...??
と思ったけど勝手にレコード番号が１になるらしい



ツイート一覧表示

コントローラーにはindexアクションを定義する
routes.rbファイルに書き込む

7つのアクションへのルーティングを自動生成するメソッドとしてresourcesメソッドを用いる

Rails.application.routes.draw.do
   resources :tweets
end

→resourcesの引数として :tweets というシンボルを指定している。
すると、/tweets のパスに対応するルーティングが生成される！

表示機能つまり、indexアクションのみを指定したければ　resources :tweets, only: :index と記載


コントローラー編

rails d controller tweets  でtweetsという名前のコントローラーを作る！
tweets_controller.rbを編集する！

app/controllers/tweets_controller.rbのパスを指定

class TweetsController にindexアクションを記載

def index
  @tweets = Tweet.all
end

→これでtweetsテーブルのの中にある全てのレコードをインスタンス変数に代入し、ビューへ送れるようになった



ビュー編


index.html.erbというファイルを作成する。ここで、ツイート投稿全てを表示する
tweetsテーブルにある全ての情報を抜き出したいときはeachメソッドを使う！

@tweets.each do |tweet|

 tweet.text
 tweet.name

end


これで、全てのレコードから(eachメソッドによって)tweetsテーブルのtextカラムとnameカラムから情報を抜き出し、投稿一覧画面に表示できた！

<%  %>などを全部省略して大事なとこだけ記載した
  





レイアウトテンプレートについて
→ヘッダーやフッターなど、全てのビューファイルで共通する部分を記載
application.html.erb というファイルに記載
これはapp/views/layouts/application.html.erb に存在する

application.html.erbのbody要素にある　<%= yield %> に各ビューファイルの記述が集約される



CSSの記述に関して
→　　app/assets/stylesheets/application.css
に記述する

stylesheetsというファイルの中に存在する●●.cssの記述は、全てapplication.cssに読み込まれる！
postgreSQLで大量のレコードをロードする際に気をつけたこと

仕事で数億のレコードをテーブルにロードする機会がありました。初めての経験で戸惑うことも多かった為、忘備録として残します。

### 環境

Windows10
PostgreSQL13

### 気にしなければならないこと
①大量のデータをロードすると、どうしても時間がかかってしまいます。なので、その時間をいかに短縮するか。
②レコード数が多いと、何かしらの不備でレコードのロードミスが発生する可能性もある。確認が必要。
③Cドライブの容量不足にならないか確認。

####①の解決方法。
少しでもロードを早くする為に、インデックスをつける際にはデータをロードした後に追加すると良い。
ここでいうインデックスは、プリマリーキーも含まれる。

###②の解決方法
ロードが終わった際に、総レコード数の件数（SELECT　COUNT)と、NULLがないかのコマンドを使用する。

###③の解決方法。
テーブルスペースを使用して、他の場所にデータをロードする。
参照：　https://qiita.com/taxi-btn/items/32a890f08d0944a09d17



### データベースに接続

```sql
postgres-# \c db201225
データベース"db201225"にユーザ"postgres"として接続しました。
db201225-#
```

### テーブルの作成

```sql
CREATE TABLE testtable (
  red bigint not null,
  blue varchar(10000) not null,
  yellow varchar(10000) not null,
  green varchar(10000) not null,
  pink numeric not null,
  black integer not null,
  white varchar(10000) not null
);
```
ここでは、テーブルとカラムを作成するが、インデックスはつけない。上記で書いたように、先にインデックスをつけてしまうとロード時間が長くなってします。PKも同様。

あとは、not nullも後付けの方が良いのかなあなんて思っています。万が一レコードにNULLが発生したらエラーになってしまうので。

### データをロードする

```
COPY testtable FROM 'D:\color.csv' with csv header;
```

ここでは、Dドライブに入っているcolor.csvのレコードをロードするコマンドを書いています。

### インデックスをつける

```
CREATE INDEX ON testtable (red);
CREATE INDEX ON testtable (blue);
CREATE INDEX ON testtable (yellow);

```
インデックスの種類を指定しないのであれば、デフォルトでB-treeになる。
選ぶ基準が難しいので、B-treeでいいんじゃなかと思ってしまいます。わかりやすい記事などあれば教えて欲しいです。

### レコードの件数を数える

```
SELECT COUNT(*) FROM testtable;

```
* ←このワイルドカードで全てを表します。


### NULLがないか確認する。

```
SELECT COUNT(red)FROM testtable;
```
testtableテーブルのredカラムのカウント数を数えることで、レコード数と見比べて数が間違っていないか調べることができる。

### エラーが出ていないかログで確認する為、ログファイルの設定（confファイルをいじるのは自己責任で！）

※順番が前後してしまいますが、ロード前に修正してください。

設定ファイル　C:\Program Files\PostgreSQL\13\data 直下にあるpostgresql.confファイルを使用。

ファイルが開かなければ、7-zipとsublimeの併用で開く。

https://sevenzip.osdn.jp/

https://www.sublimetext.com/

①修正１：

420行目あたりにある、REPORTING AND LOGGING項目で

log_destination = 'stderr'にする。

②修正２：

420行目あたりにある、

logging_collector = onにする。（ファイル出力の設定）

③修正３：

558行目あたりにある、

log_statement = "all"にする。（どのSQL文をログに記録するかを制御する）。



#### ログの確認方法

C:\Program Files\PostgreSQL\13\data\log\対象のファイルをクリック。
中にログが記載されている。


#### 文字ばけしている可能性有。

もし文字化けしていたら、

postgresql.conf内で、以下のように変更をする。

```sql
【変更前】
lc_messages = 'Japanese_Japan.932'

【変更後】
lc_messages = 'en_US'
(Ubuntuの場合は'en_US.UTF8'のようです）

※変更はPostgreSQLを再起動すると反映されます。
```

logを確認することで、正常にロードができているか確認することができる。
【Java】Optionalの使い方①

#プログラミング勉強日記
2021年1月1日
JavaのOptionalの使い方について簡単にまとめる。

#Optionalとは
　メソッドの戻り値としてnullを返す可能性があることを明示的に示したいときに使う。メソッドがnullを返す可能性があるということを示すことで、より安全に実装することができる。

#Optionalの書き方
　Optionalクラスを使うにはjava.util.Optionalをインポートする必要がある。一般的にはオブジェクトを定義して利用する。Optionalのオブジェクトはダイヤモンド演算子('<>')ないのType Parameterにnullの可能性があるオブジェクトの型を指定して宣言する。
　ofNullableメソッドの引数にはnullの可能性があるオブジェクト名を指定する。

```java:基本的な書き方
Optional<T> オブジェクト名 = Optional.ofNullable(nullの可能性があるオブジェクト名);
```

```java:サンプルコード
String str = null;
Optional<String> value = Optional.ofNullable(str);
```

##orメソッドの使い方
　orメソッドは、Optional.ofNullableメソッドの引数に指定したオブジェクトがnullの場合にのみ処理を実行する。

```java:サンプルコード
import java.util.Optional;
 
public class Sample {
    public static void main(String[] args) {
        String str = null;
        Optional<String> value = Optional.ofNullable(str);
        System.out.println(value.or(() -> Optional.of("nullです")).get());
    }
}
```

```:実行結果
nullです
```


##orEsleメソッドの使い方
　Optional.ofNullableメソッドの引数がnullの場合にorElseメソッドの引数に値を返す。nullでない場合はnullでないその値を返す。

```java:サンプルコード
import java.util.Optional;
 
public class Sample {
    public static void main(String[] args) {
        String str = null;
        Optional<String> value = Optional.ofNullable(str);
        str = value.orElse("nullです");
        System.out.println(str);
    }
}
```

```:実行結果
nullです
```



#参考文献
[JavaでOptionalクラスを使う方法【初心者向け】](https://techacademy.jp/magazine/18612)
[JavaのOptionaとは？使い方をパターン別にわかりやすく解説](https://www.sejuku.net/blog/60892)
AWS Lambda実践ガイドでハマった話。event['body']がbase64だった

はじめに
---
　AWS Lambda実践ガイドの5章Sの3に配置したhtml のフォームを叩いてAPI経由でlambdaを呼出してpostした内容をdynamoDBに書き込む練習問題でハマったた備忘録として記載。結論として、event['body']がbase64にエンコードされていた。

経緯
---
実践ガイドのサンプルコードをそのまま実装しても動かないため、CWのlogを見てみると
htmlのフォームから入力されたデータを受け取るところに問題がありそう。

案の定、print(param)してみるとnullになっていたので、
`print(json.dumps(event,indent=4))`でevent全体を見てみる。
すると
`"body": "dXNlcm5hbWU9YWEmZW1haWw9aGg=",`でどうやら値が入ってはいるが、なんだこれ。


　色々とネットを漁るとbase64というすべてのデータをアルファベットと一部の記号であらわすエンコード仕様らしい。
試しに`https://www.en-pc.jp/tech/base64.php`でエンコードしてみるとちゃんと結果が返ってきていた！


コードの修正
---

というわけでbase64にデコードしてparseするように修正した。

```
import base64
(中略)
body = base64.b64decode( event['body'] )
param =urllib.parse.parse_qs(body.decode('utf-8'))
```


おわりに
---
今回のような値を渡すところは、勝手にエンコード等されていないか確認することが大切と学んだ。
テスト22

```vb

'表から指定の値を複数取得してコンボボックスに格納
------------------------------------------------

Sub collec()

UserForm2.Show vbModeless

End Sub

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

Private Sub UserForm_Initialize()

Dim col As Collection
Set col = New Collection
Dim MaxRow As Long
Dim i As Long

Mrow = ThisWorkbook.Sheets("Sheet7").Cells(Rows.Count, 2).End(xlUp).Row

For i = 3 To Mrow

    With ThisWorkbook.Sheets("Sheet7")
    
        col.Add Item:=.Cells(i, 2).value & "," & .Cells(i, 3).value, Key:=CStr(i - 2)
        
    End With

Next

ComboBox2.ColumnCount = 2
ComboBox2.ColumnWidths = "40;50"

Dim tmp() As String

For i = 1 To col.Count

    With ComboBox2
    
        tmp = Split(col.Item(i), ",")
        .AddItem tmp(0)
        .List(i - 1, 0) = tmp(0) & vbTab & tmp(1)
        .List(i - 1, 1) = tmp(1)
    
    End With

    Erase tmp

Next

End Sub

'------------------------------------------

Type Hyou

    ID As Variant
    Kenmei As Variant

End Type

'構造体による動的疑似二次元配列
Sub Kouzoutai_Test()

Dim Hyou2() As Hyou

ReDim Preserve Hyou2(0)

Dim MaxRow As Long
Dim i As Long

Mrow = ThisWorkbook.Sheets("Sheet7").Cells(Rows.Count, 2).End(xlUp).Row

With ThisWorkbook.Sheets("Sheet7")

    For i = 3 To Mrow
    
        ReDim Preserve Hyou2(i - 3)
    
        Hyou2(i - 3).ID = .Cells(i, 2).value
        Hyou2(i - 3).Kenmei = .Cells(i, 3).value
          
    Next

End With



For i = LBound(Hyou2) To UBound(Hyou2)

    Debug.Print Hyou2(i).ID
    
    Debug.Print Hyou2(i).Kenmei

Next


End Sub


```
型宣言についてまとめる

これまでしてこなかった型宣言について
公式の内容を纏めて自分なりに解釈してみました。

参考： [PHP.net](https://www.php.net/manual/ja/language.types.declarations.php)

#なぜ型宣言をするのか？
そもそもの型宣言とはなにか？
>関数のパラメータや戻り値、 クラスのプロパティ (PHP 7.4.0 以降) に対して型を宣言することができます。 これによって、その値が特定の型であることを保証できます。 その型でない場合は、TypeErrorがスローされます。

自分なりに解釈すると
パラメータや戻り値が定義されていることで求めた型以外が参照された場合に
エラーを返すことによって大きなバグになることを事前に防いでいるのかと考えます。
またバグ出た際の原因追求もしやすくなるのかなと思います。

わかりやすく言うと
スーパーとかがイメージしやすいのかなと！
お酒コーナーにはお酒をおいてあるのでそこから持ち出したら
もちろんお酒を持っていくことになりますよね！
お菓子コーナーから商品を持ち出したらそれはもちろんお菓子です。
そのメソッドを使ってどんな反応が返ってくるのか
その範囲、カテゴリを指定することでおおよその返り値を想定することが出来る。
そんなイメージがわかりやすいかなと思います。

#基本的な型

|型|説明|ver|
|:---:|:---:|:---:|
|クラス/インターフェイスの名前|値が指定したクラスやインターフェイスのインスタンでなければいけません。||
|self|値がそのメソッドが定義されているクラスと同じクラスのインスタンスでなければいけません。クラスの内部でのみ使えます。||
|array|値が配列でなければいけません。||
|callable|値がcallableでなければいけません。クラスのプロパティの型では宣言できません。||
|bool|値がbool値でなければいけません。||
|float|値がfloatでなければいけません。||
|int|値がintでなければいけません。||
|string|値が文字列でなければいけません。||
|iterable|値が配列か、Traversableのインスタンスでなければなりません。|PHP 7.1.0以降|
|object|値がobjectでなければなりません。|PHP 7.2.0以降|
|mixed|値はあらゆる値であることが出来ます。|PHP 8.0.0以降|

####※union型
型をunionとして宣言するとひとつではなく複数の異なる型を値として受け入れることが出来る。

```PHP
<?php
function getItem(): T1|T2...
{
    //返り値はT1|T2となる
}
```

####※mixed型
mixed型は
array|bool|callable|int|float|object|resource|string|null
と同等の型です。

###Nullを許容する型宣言
型の名前の前にクエスチョンマークを付けることで
返り値がnullである場合も許容される

```PHP
<?php
function getItem(): ?string
{
    //返り値はnull|stringのどちらかである
}
```

###返り値でのみ有効な型
####void
voidは関数が値を返さないことを示す戻り値の型

####static
値が、メソッドが呼び出されているクラスと同じインスタンスでなければいけない。

###型宣言は完全でもなければ最低限でもない
他の言語のことは知らないのでなんとも言えませんが
型の扱いがゆるいイメージのPHP特有なのか
型宣言をしたからと言って必ずしもその型で扱われているとも限らない
わかりやすい例でコードを書くと

```PHP
<?php
function getItem(): int|string
{
    //
    return true;
}
```

上記のコードでは
true = 1
とした扱いになり
intとboolは互換性がありエラーとはならないので
型を定義したのであればしっかりと定義した型で
返してあげるようにしたほうがいいかと思います。
Jetson NanoでMacから手軽にリモート接続する方法

![jetson_nano_remote_desktop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/380d2a75-fb78-4e65-756e-a2bf4d5f0969.png)

## MacでJetson Nanoにリモート接続
　Jetson Nanoのリモートデスクトップ、ラズパイに比べて色々手間取ったのでメモです（[ラズパイの場合はこちらをどうぞ](https://qiita.com/karaage0703/items/9650e7aeceb6e1b81612)）。「Jetson Nano超入門」という本を参考にしました。[実は、私も共著者の一人です。良ろしければどうぞ](https://karaage.hatenadiary.jp/entry/2019/11/29/073000)

　手軽なのがXRDP（Windowsのリモートデスクトップ）を使う方法です。Windowsはもちろん、Macでも「Microsoft Remote Desktop」というアプリでリモートデスクトップができます。

　Jetson Nanoでは、以下コマンドを実行します。

```sh
$ sudo apt update
$ sudo apt -y install xrdp
```

　これでできるかと思いきや、これだけだと、リモート接続したあと、一瞬NVIDIAのロゴが見えたあと落ちてしまいます。

　既知の問題らしく、改善するためには、ログインのデスクトップ環境をxfceに変更すれば解決するようです。ということでxfceに変更してみましょう。

## ログインのデスクトップ環境をxfceに変更
　このあたりも「Jetson Nano超入門」も書いてありましたので、それをベースにネット情報で補足しました。

　以下でxfceをインストールします。

```sh
$ sudo apt install -y xfce4 xfce4-goodies
```

　設定をします。以下の設定は、全ては不要かもしれません（今後検証します）。

```sh
$ echo xfce4-session > ~/.xsession
```

　`/etc/xrdp/startwm.sh` の最後の2行をコメントアウトして以下を追加します。

```
startxfce4
```

　再起動したら、MacのリモートデスクトップからJetson Nanoにアクセスします。

## まとめ
　簡単にまとめました。Jetson Nano情報知りたい方は、以下のまとめ記事もよろしければ参考にしてみてください。

[Jetson Nano関係のTIPSまとめ](https://qiita.com/karaage0703/items/b14c249aa33112669ee4)

## 関連記事
[Mac標準のリモート接続でラズパイに繋ぐ方法](https://qiita.com/karaage0703/items/9650e7aeceb6e1b81612)

## 参考リンク
- [Jetson Nanoにリモートデスクトップ(VNC)環境を用意する](https://qiita.com/take-iwiw/items/a3bd8d0527dec431ef0f)
- [Issue with xrdp](https://forums.developer.nvidia.com/t/issue-with-xrdp/110654/23)
AWS IAM ユーザが, 自身で MFA 登録できるようにするメモ

## 背景

AWS で IAM でチームメンバー用にユーザを作りたい(権限は最低限 + CodeCommit 用に git repo アクセス).
ユーザは. MFA 認証を各自で設定できるようにしたい.

デフォルトだと, 最低権限だとユーザは MFA 認証を使えません.

## 方法

https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_aws_my-sec-creds-self-manage.html

IAMユーザにMFA設定を強制するにあたりiam:ListUsersが必須では無くなった話
https://blog.serverworks.co.jp/tech/2019/04/02/mysecuritycredentials/

ありがとうございます.

AWS は MFA 認証したい場合いろいろと JSON でポリシー設定しないといけないのでめんどいですね.
(基本はコピペでいけますが, 一度理解しないといけないので結局めんどい)

他のサービスのように, MFA 認証をぺろっとお手軽に設定できるようになってほしい.

## CodeCommit との連携

上記だと, codecommit 関連も deny されてしまい. git clone とかするとエラーになってしまいます.

MFAを強制しながらCodeCommitをgitコマンドや各種ツールから利用する
https://qiita.com/Morihaya/items/0ab6d5599cca96de3543

ありがとうございます.
文系新卒エンジニアがAWS認定ソリューションアーキテクト – アソシエイトに一発合格した話

#概要
先日SAAに合格したので、合格体験記的なものを書いておこうと思います。
これからSAAを受験される方の参考になれば幸いです。
#自己紹介
高校時代、理系を志すもmolで挫折し文転。大学はそのまま文系学部へ。
その後、国内独立系SIerに就職。
営業職で内定をもらっていたが、SE職かっこええな～と思ってダメ元で転向願い出したらOK出てSEの道へ。
AWSを扱うチームに配属される。
#だいたいのスケジュール
いつごろ何をやってたか、徒然と書いていきます。
###7月
配属される。AWSとは、、、そもそもクラウドとは、、、という状態。
何か勉強しなきゃ！と思って先輩に何から始めればいいか尋ねると、とりあえずSAA目指せば？と言われた。
（なぜクラウドプラクティショナーすっ飛ばしたのかは不明）

とりあえず参考書を購入。先輩からオススメされた[黒本](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-AWS%E8%AA%8D%E5%AE%9A-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E6%95%99%E7%A7%91%E6%9B%B8-%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-ebook/dp/B07M7S9GDL)をポチる。
割と有名な参考書っぽい。

###8~9月
基本的なサービスについて勉強する。
黒本の第1章だけ読んでた。
○○ってサービスは何ができるサービス？って聞かれたらなんとなく答えられるようになる。

###10月
各サービスがどんな感じで連携するんか勉強する。
黒本の第2章以降を読み進めて、代表的なアーキテクチャを知る。
あ～～このサービスってこんな使われ方するんや～～ってなる。

会社の検証環境でEC2立てたり、S3バケット作ったり、IAMロール作って適当にアタッチしたりした。
実物を触るとどんなオプションがあるんかとか分かる。
SAAではオプション機能について聞いてくるもの（例↓）もあるから、役に立った。
・ [EBS ボリュームの DeleteOnTermination 属性](https://aws.amazon.com/jp/premiumsupport/knowledge-center/deleteontermination-ebs/)
・ [S3オブジェクトのバージョニング](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/ObjectVersioning.html)
・ [MFA Delete](https://dev.classmethod.jp/articles/s3-mfa-delete/)
 　　⇒クラスメソッドさんの記事です。いつも本当にありがとうございます。
　　　（公式よりクラスメソッドさんの記事の方が分かりやすいまである）

###11月
黒本付属の演習問題に手を付け始める。
分からないところがあれば、公式サイトやクラスメソッドさんのサイトで調べる。
EC2の購入オプション、IAMポリシーの種類、RDSとAuroraの違い、AutoScalingのスケーリングポリシー、Route53のルーティングポリシーなどなど、細かい知識を足していく。
（○○ポリシー系はアップデートが頻繁にあるため要チェック）

YouTubeのAWS関連動画を漁る。通勤中とか食事中とかにラジオ感覚で流してた。
興味あるやつだけ見ればいいかと、、、
オススメはセキュリティ・可用性関連の動画。
最新アップデートの発表みたいなやつもあるけど、試験にはあまり出ない気がするので、試験対策としてはたぶん見なくていい。

そろそろ受験すっかと思って[サイト](https://aws.amazon.com/jp/certification/certification-prep/)から試験を予約。
ネタで受験日を12/25にした。

###12月
認定トレーニング「[Architecting on AWS](https://aws.amazon.com/jp/training/course-descriptions/architect/)」に経費で参加（圧倒的感謝）
試験対策のつもりでいくとイメージと違うな～～ってなるかも。
どちらかといえば、実際にAWS上でリソース立ててみよう～～みたいな感じだった。
実務でAWS触ってるから、正直行かなくてもよかったかもと思う。
ただ黒本に載っていない（初見の）サービスを~~すごくざっくり~~紹介してくれたり、講師の方に自分の誤った理解を指摘してもらったりしたので、無駄ではなかった。
会社が行ってもいいよと言ってくれるなら行ってもいい。
個人で行くのは出費的に死ねる。

あとは最後の追い込み。
少しでも理解があやふやな部分は公式サイトやクラスメソッドさんの（ry

クリスマス（試験日）が迫り、街を歩くたびやる気（殺意の間違いでは）が湧いてくる。

試験当日。
試験終了後すぐに合否が表示される。いいような悪いような。
脳の疲労がピークで合格を実感できない。ほぼ放心状態だった気がする。

#所感
###黒本だけじゃ無理
黒本で触れられていないサービスが普通に試験に出たりする。
黒本で触れられているけどめっちゃあっさりとしか書いてないサービスもある。
基本的にAWSの情報はネットにあふれているので、ネットの情報を活用しない手はない。

AWS系資格は、参考書の内容が「最新」でなくなるスピードが恐ろしく速い。
もしかしたら黒本の内容が間違ってるかも、、みたいな意識は常に持っておいたほうが安全。

###初手からSAAでもいけるけど・・・
やっぱクラウドプラクティショナー取ってからSAAの方が安全かもしれない。
クラウドプラクティショナーでクラウド特有の考え方やお作法の部分を理解してからSAAの勉強したほうがいろいろ捗ると思う。
まあクラウドプラクティショナーってどんな試験なのか全然知らないんですけどねぇ（）


###試験の問題を解釈するのに読解力が必要（余談）
○○を実現したいんだけどどのサービス使えば実現できそう？？みたいな、あらかじめ解決すべき課題が明示されている問題は知識だけで回答できる。
が、どんな課題を解決しないといけないのか、というところから読み取る必要がある問題もある。
それには読解力が必要。
SE業務全般に言えることだが、文系の国語力って割と必要だったりする。
もっと文系SEが増えればいいのにと思う。
【Azure】Static Web Appを使って自動デプロイ

#はじめに
Azure Static Web Apps×GitHubで簡単にWebアプリケーションを自動デプロイができるとのことで、今回行いたいと思う。
[Azure Static Web Appsの説明](https://azure.microsoft.com/ja-jp/services/app-service/static/)

#手順
既にGitHubにリポジトリは作成されているので、今回はそれを使用する。
(※もしリポジトリがない人は、ドキュメントにリポジトリを作成するがあるのでそちらを参照。）
Azureポータルに行き、リソースの作成を選択する。
![スクリーンショット 2020-12-31 18.59.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/319ce1da-4491-7957-ce86-47a4dccb1578.png)
検索バーで「static」を入力すると「Static Web App(preview)」が出てくるので、そちらを選択する。
![スクリーンショット 2020-12-31 18.59.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/1bb1b1bc-bfbc-26c5-eecb-1fe5ad1ee152.png)
作成ボタンを押す。
![スクリーンショット 2021-01-01 15.37.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/714ede68-2bd4-04a0-5917-d60a88f0bf26.png)
静的Webアプリの作成が出てくるので、入力する。
GitHubアカウントでサインインを選択する。
![スクリーンショット 2020-12-31 20.39.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/ac99f782-c40b-6c24-90d4-bf1a98d1db1d.png)
下記のような画面が出てくるのでログイン・承認を行う。
![スクリーンショット 2020-12-31 20.40.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/0276bfc3-a3f5-cd17-e4a7-2156d3a7308e.png)

リポジトリとビルドの詳細を入力する。
確認と作成を選択し、作成する。
![スクリーンショット 2020-12-31 20.40.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/d534fbd3-f6dd-26a3-3dd1-f2fab0467f38.png)

![スクリーンショット 2020-12-31 20.43.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/4a9cd8d0-f33b-4d81-be31-4a3a89632637.png)
デプロイが完了したらリソースに移動を選択する。
![スクリーンショット 2020-12-31 20.48.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/d9807a26-522f-e449-348c-2c3b26eddf86.png)
URLをクリックすると、自動でデプロイできているのが確認できる。(デプロイできるまで時間がかかるので注意。)
![スクリーンショット 2021-01-01 15.53.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/d2566785-9c16-d26b-4c0c-2e9424c6cb18.png)

#参考
[Azure Static Web Apps のドキュメント](https://docs.microsoft.com/ja-jp/azure/static-web-apps/)
[マンガでわかる Azure Static Web Apps: クラウド初心でもできる！CIツール不要の自動デプロイ] (https://www.amazon.co.jp/dp/B08CXL3GD9/ref=cm_sw_r_tw_dp_x_8YR7Fb0PGNABC)
CuteRでQRコード画像をつくった

### 背景

年賀状にQRコードを貼ろうとおもった。ふつうのじゃおもしろくないし、真ん中にロゴが入っているのもちょっと違うし。CuteRというpythonで書かれたコマンドがおもしろそうなので、使えるようにしてみた。

<img src="https://github.com/chinuno-usami/CuteR/raw/master/sample_output.png" width=40%>
↑　こんなかんじのQRコードがつくれるらしい！　ほかでも遊べそうｗ


### pythonのインストール

別記事でまとめた　⇒　[macOSでpythonを使えるようにした](https://qiita.com/hann-solo/items/674140a69bcb48aba38c)


### CuteRのインストール

作業ディレクトリを作成して移動

```bash
$ mkdir CuteR
$ cd CuteR
```

つくったディレクトリに`venv`で仮想環境をつくり、アクティベート

```bash
$ python3.9 -m venv .venv
$ . .venv/bin/activate
```


### CuteRをつかってみる

公式サイトにある、サンプルコマンドを打ってみる。無事に動く！！

```bash
$ CuteR -c 10 -e H -o sample_output.png -v 10 sample_input.png http://www.chinuno.com
```

いろいろ試して、コマンド調整

```bash
$ CuteR -c 10 -e H -o output.png -v 6 input.png https://scrapbox.io/HPNY2021/01-Jan
```

使用前　⇒　使用後
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/45698bba-c0cb-1015-c9f0-72176c14c8be.png" width=40%>　⇒　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/14bcf32a-e5af-2413-9a9b-d8aabc8b90a5.png" width=40%>


仮想環境を抜ける

```bash
(.venv) $ deactivate
```


### リソース

CuteRのページ：https://github.com/chinuno-usami/CuteR


### 検討したけど使わなかったもの

QArt Codes：https://research.swtch.com/qart
オンラインサービスもあったみたいだけど、終了していた。

qart.js：https://github.com/kciter/qart.js
よさそうなんだけれど`SecurityError: The operation is insecure.`を解消できず。呼んでいるモジュールが危ないみたい？GitHubのメンテもしばらく行われていないので、自力解決をあきらめた（CuteRのほうが最新更新が新しかった）。


### 環境

Python 3.9.1 (Dec 28 2020, 11:25:16)
macOS BigSur バージョン 11.1
MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
SpringBootで作成したWebアプリをEC2にデプロイするときに躓いた話

###はじめに
自分用のメモです。

###開発環境
・Windows10
・OpenJDK 1.8
・SpringBoot 2.2.4
・Gradle 6.3
・MySQL5.7
・AWS（EC2・RDS・VPC）

###作業の流れ
1.デプロイ用のSpringBootアプリを用意
2.EC2・RDS・VPCを準備する
3.Amazon Linux2で必要ツールをインストール
4.Buildしてデプロイ

####1.デプロイ用のSpringBootアプリを用意する
こちらは何でも構わないので自身で作成しているアプリで可

####2.AWS（EC2・RDS・VPC）の用意
ここは後日投稿する予定です

####3．Amazon Linux2で必要ツールをインストール
EC2にログインしyumを最新にします

```
# yum update
```
Gitのバージョンを確認とインストール

```
# yum search git
# yum install git
```
Gitがインストール終わったら一応確認
 
```
# git --version
```
Java8をインストール

```
# yum install -y java-1.8.0-openjdk-devel
```
Tomcatをインストールし配置しなおす
詳しくは[こちら](https://qiita.com/hiren/items/2a4f1b55c99ebfb3fd08)

gitをクローンする

```
# git clone https://github.com/sample.git
```
クローンしたディレクトリに移動しgradlewの権限を広める

```
# chmod 755 gradlew
```
このままビルドしたいがapplication.propertiesに移動し設定変更
application.propertiesは環境に依存する関係

```
# cd src/main/resources
# vim application.properties
```
MySQLのURLがlocalhostになっていると思うのでここを変更

```
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://「localhost」←ここ！:3306/sample?serverTimezone=JST
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.initialization-mode=always
```
localhostの部分をRDSのエンドポイントに変更

```
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://~~~~~~~~~~:3306/sample?serverTimezone=JST
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.initialization-mode=always
```
これでRDSに接続していけるように変更しました。
ここからbuildしていきます！！

```
# ./gradlew build
```
ビルド終了次第buildのlibs配下に移動
ビルドしたアプリケーションがあると思うので権限を緩めるのと
持ち主とグループをtomcatに変更

```
# chmod 755 sample.war
# chown tomcat:tomcat sample.war
```
そしてwebapps配下に移動させTomcatを起動させる
 
```
# mv sample.war /opt/apache-tomcat/webapps
# systemctl start tomcat.service
```

EC2の設定したURLに接続してあげると・・・

以上です
JavaでLibreOffice Calcのfodsファイルを読み書きするサンプル 2021

https://github.com/sonota88/libreoffice-java-sample/tree/20210101

以前書いたこれ↓のアップデート版。細かい修正と「2021年初でも動きましたよ」という動作確認の報告です。

[JavaでLibreOffice Calcのfodsファイルを読み書きするサンプル 2019](https://memo88.hatenablog.com/entry/2019/12/02/070925)

ちなみに上記は 2019年末の記事なのでだいたい1年ぶりのアップデートになります。

# 変更内容

- 使用範囲内での行インデックス・列インデックスの最大値を取得するサンプルコードを追加
- mvnw を使うように変更
- JUnit のバージョンアップ: 4.x => 5.7.0

# 環境

```
Ubuntu Linux 18.04
LibreOffice 6.0.7.3
OpenJDK 1.8.0_275
```

# 参考

- [Java LibreOffice Programming (Calc)](https://fivedots.coe.psu.ac.th/~ad/jlop/#calc)
  - インデックスの最大値を取得する部分を参考にしました

# 他に LibreOffice 関連で書いたもの

https://memo88.hatenablog.com/archive/category/LibreOffice
ネットワークの基礎（１）【接続形態と通信方法】

CCNAの試験に向けて学習中。
復習に見返せるようにメモしていきます。
ほぼ自分の勉強メモです。
過度な期待はしないでください。


ネットワーク
-

- ネットワークとは

-ネットワークとは、パソコンやネットワーク機器といった複数の要素がケーブルなどで
接続され相互に通信出来る状態をさす。

-<font color="Red">ノード</font>とは、ネットワークを構成する要素の事をいう。
PCやルータといった機器がノードに該当します。

-<font color="Red">リンク</font>とは、ノードとノードを結ぶ線を呼び、
リンク上のデータの流れを、<font color="Red">フロー</font>といいます。
また、ネットワーク上で流れる情報やその量を、<font color="Red">トラフィック</font>と呼びます。

<br>

- ネットワークの種類

-<font color="Red">LAN(Local Area Network)</font>は、家庭、企業、ビルといった一つの建物や
施設内といった程度の範囲で利用されているネットワーク。
LANは、人が自由に配線や機器の設置を行える、基本的には自分達で行う形。

-<font color="Red">WAN(Wide Area Network)</font>は、本社と支社といった地域的に離れたLANとLANを
接続するネットワーク。
WANは、利用者たちで機器の設置や配線を行うことは出来ません。

-<font color="Red">インターネット</font>とは、数多くのネットワークを接続した地球規模で巨大なネットワーク。
インターネットは、家庭のパソコンや企業のLANなどから、<b>インターネットサービスプロバイダ(ISP)</b>を
介して接続します。

なお、インターネットの仕組みを利用して構築したLANを<font color="Red">イントラネット</font>という。
<br>


ネットワークトポロジ
-
ネットワークトポロジとは、端末やネットワーク機器をどのように接続しているのか、
その接続形態の事をいう。

- バス型

基幹となるケーブル（バス）に、各ノードを接続する接続形態のこと。
なので、ケーブルに障害が発生するとノード間の通信が出来なくなる。
<br>

- リング型

接続しているノードを円状に接続する接続形態のこと。
１箇所で障害が発生すると全体に影響が出る。
<br>

- スター型

中央の集線装置に各ノードを接続する接続形態のこと。
※集線装置とは、複数の線（ケーブル）を挿すことによって、線同士を合体させる装置（を指す総称）
これによって、それぞれのパソコン同士でデータをやり取りできるようになったりする。


<br>

- メッシュ型

ノード間をそれぞれ接続する接続形態とのこと。
どこか１箇所で障害が起きても、他のノードを経由して通信が出来る為、障害に強い構成となっている。

全てのノードが互いに接続している形態を、<b>フルメッシュ</b>、
部分的にメッシュとなっている形態を、<b>パーシャルメッシュ</b>という。
<br>

- ハイブリット型

これらにネットワークトポロジを複数組み合わせた接続形態とのこと。

<br>

通信の方式
-

- ユニキャスト

ある特定の宛先に対してのみデータを送信する方式で、<font color="Red">１対１</font>での通信となる。
また、<b>通信したい相手を指定するアドレス</b>を使用する。

- ブロードキャスト

不特定多数に同じデータを送信する方式で、<font color="Red">１対多</font>での通信となる。
また、<b>全体宛を意味するアドレス</b>を使用する。

しかしながら、ブロードキャストの場合、その通信を必要としていない端末にも通信が届いてしまう為、
ネットワークに負荷が掛かります。なので、ブロードキャストを大量に使用するとネットワークに対する
負荷が掛かりやすくなってしまいます。
<br>

- マルチキャスト

ある特定のグループに対して同じデータを送信する方式で、<font color="Red">１対グループ</font>での通信となる。
また、<b>グループを指定するアドレス</b>を使用する。

宛先をマルチキャストにする事で、送信元は１つのパケット（データのかたまり）を送信すれば、
途中の集線装置などがデータ複製して転送してくれるので、
宛先の端末の数だけ送信元がパケットを複製して送る必要がない。

つまり、マルチキャストを使用することで、送信元は１つのパケットを送信するだけで必要としている
複数の端末にデータを送信できるので、効率の良い通信方式と言える。
<br>
バッチファイルから、SQLを実行させる方法

### 環境
windows 10
postgreSQL 13

####  バッチファイルの作成


★の箇所は内容が変動するので、ディレクトリに配置した後修正が必要。

```bat
rem --------------------------------------------------
rem DB接続パラメータ
rem --------------------------------------------------
set PGPATH=C:\"Program Files"\PostgreSQL\13\bin\★
set HOSTNAME=localhost
set PORTNUM=5432
set DBNAME=postgres★
set USERNAME=postgres★
set PGPASSWORD=××××××★
rem --------------------------------------------------
rem bat実行パラメータ
rem --------------------------------------------------
set LOGFILE=result.log
set ERRORFILE=error.log
set SQLFILE=test.sql
rem --------------------------------------------------
rem SQL実行
rem --------------------------------------------------
%PGPATH%psql -h %HOSTNAME% -p %PORTNUM% -d %DBNAME% -U %USERNAME% -f %SQLFILE% 1>%LOGFILE% 2>%ERRORFILE%

shutdown /s /f /t 0
```

###　説明
set は代入、　remはコメントアウトです。
最初の15行でひたすら必要な内容を代入していきます。
batファイルを実行すると、result.logとerror.logが自動で作られるようになります。本当は実行結果とエラーの結果を１つにまとめて出力できるようにしたかったのですが、知識不足でできませんでした。

ここでは、test.sqlというファイルを作成し、それをSQLFILEに代入しています。
代入した引数は%%で囲みます。
-f %SQLFILE%で、test.sqlを実行しています。

1> は　標準出力をLOGFILEにリダイレクト
2>は　エラー出力をERRORFILEにリダイレクトすることを表しています。

最後のshutdownコマンドで、PCが勝手にシャットダウンされます。必要なければこの１文は消しましょう。

これで、バッチファイルを実行すると、SQLを実行することができます。あとは、SQLファイルにバックアップのコマンドを書いたり、データをロードするコマンドを書くなどすると、バッチファイルをダブルクリックするだけで自動で実行されます！


### 自動でバッチファイルを実行する方法

さらに便利にする方法として、バッチファイルを自動で実行する方法もあります。ここでは、夜間にバッチファイルを実行する方法を書いていきます（夜間バッチは企業で多く実施されているので）。


左下スタートから「プログラムとファイルの検索」欄に「タスクスケジューラ」と打ち込む。タスクスケジューラをクリックし起動。操作タブから「タスクの作成」を選択。

①「全般」タブより、名前と説明を入力。

名前（M):バッチデータロード

説明（D)：バッチの夜間データロードをします。

②「トリガー」タブより、「新規」ボタンを押して、設定欄で１回にチェックが入っているのを確認したら、開始時間を任意で設定。

③「操作」タブより、「新規」ボタンを押して、操作欄がプログラムの開始になっていることを確認。設定欄で「プログラム￥スクリプト」に「参照」ボタンから作った「バッチファイル」を指定。

D:\Users\×××\test_data\test.bat みたいな記述を書く。

「OK]ボタンを押して、「タスクの作成」画面に戻り、さらに「OK]ボタンで閉じる。

これで、任意の指定した時間に自動でバッチファイルを実行（バッチファイルにSQL実行コマンドを書いているので、SQLが実行される）。

これで、真夜中に自動でバックアップがされたり、大量のデータをロードすることで日中に時間を割かずに済みますね。便利。
html, javasript, jquery とSakura Editor

#初めに
　Sakura EditorでHTMLページを保存する。
#Sakura Editorのダウンロード

https://sourceforge.net/projects/sakura-editor/

#HTMLページを保存する
```HTML
<html>

  <head>
    <title>タイトル</title>
  </head>

  <body id="main-id">
      <div>サンプルテキスト</div>
  </body>

</html>
```
![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965456/01c352d8-58e4-035e-03b7-20966d5a530c.png)

HTMLで保存して、実行する
![キャプチャ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965456/1b02343e-21f2-f0df-33aa-3fe5fa96cce0.png)

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965456/54b27d88-6e07-568d-4c30-53a5f45682b8.png)

![無題１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965456/e9c14f4b-421f-8b38-a168-1be638559ec4.png)

![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965456/40b07ed4-e573-2541-877f-89086ac64190.png)

#jQueryの追加
```
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
```
![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965456/65ccf746-3e9f-67e3-baff-913bf910970b.png)


#jQueryのロード（HTMLを読み込んでからjQueryの処理を開始）
```javascript
    <script> 
        $(document).ready(function(){
          // todo
        });
    </script>
```
![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965456/6d876e6d-51c5-8343-6c6c-0e94d48e4a0d.png)

結果
![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965456/0f6157f8-53ad-9369-ed45-7ce5ca467556.png)


以上
パスワードなしで sudo で apt を実行できるようにする

# パスワードなしで sudo で apt を実行できるようにする

```
echo $USER ALL=NOPASSWD: /usr/bin/apt | sudo tee -a /etc/sudoers
```

## 参考

[パスワードなしで sudo で apt を実行できるようにする (ubuntu 21.04)](https://qiita.com/m-tmatma/items/04b54062116c4080ab93)
StoryBoardの代わりにXibを使う第一歩

#環境
Xcode12.3

#ゴール
StoryBoardを削除し、Xibから起動する。

#プロジェクトを作成
![スクリーンショット 2021-01-01 14.06.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930365/873fdd64-4085-ce82-d998-e5be723fc86c.png)

#ViewControllerとStoryBoardを削除
ViewController.SwiftとMain.storyBoardを選択 > 右クリック > Delete > Move to Trash

#Info.plistの設定
(1) Main storyboard file base name > 削除

(2) Application Scene Manifest > Scene Configuration > Application Session Role > Item 0 (Default Configuration) > Storyboard Name > 削除
<注意>(2)も削除しないとエラーになってしまします。

#ViewControllerとXibファイルを作成
New File > Cocoa Touch Class > Subclass of: UIViewContoroller > Also create XIB file にチェックを入れる > Next > Create

![スクリーンショット 2021-01-01 14.40.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930365/b22af0ad-cccc-27ba-3863-b0f0a906b094.png)
ファイルを2つ作成する事ができました。

<img width="300" alt="スクリーンショット 2021-01-01 14.42.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930365/55f4eca7-6da8-fb27-f112-7cb774bc9212.png">
今回は起動した時にわかり安いようにBackgroundに青色を設定しておきます。

#SceneDelegate.swiftを設定
``func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)``で起動時に表示される画面をXibファイルに対応しているViewContorollerにします。

```Swift:SceneDelegate.swift
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let _ = (scene as? UIWindowScene) else { return }
        //ここから下追記
        let window = UIWindow(windowScene: scene as! UIWindowScene)
        self.window = window
        window.makeKeyAndVisible()
        let xibViewController = XibViewController()
        window.rootViewController = xibViewController
        
    }
```
#シュミレーター起動
<img width="300" alt="スクリーンショット 2021-01-01 15.13.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930365/5e16f89e-7c0a-4931-2c1b-f483f5fc668b.png">
先ほど設定した、背景が青のXibがしっかり起動しました。

#参考
[StoryBoardの代わりにxibで画面を実装する](https://qiita.com/Tatejima_Seagull/items/6632d1a8898cfbc3e595)
[【Swift】iOS13でStoryBoardではなくXibから起動する](https://qiita.com/Tatejima_Seagull/items/6632d1a8898cfbc3e595)