OmniAICreator/Qiita-1.07M huggingface dataset:
EmacsのProjectileでghqを使う

### 概要

[ghq](https://github.com/x-motemen/ghq)でリポジトリを管理し、fzfやpecoでそのディレクトリを簡単に移動できるのはとても便利ですが、同じようなことをEmacsでも行う方法です。

これまでも、Emacsの補完機能と組み合わせたemacs-lispで、これを実現する方法が提供されています。

- [GitHub - masutaka/emacs-helm-ghq: ghq with helm interface](https://github.com/masutaka/emacs-helm-ghq)
- [GitHub - uwabami/ido-ghq: ghq with ido](https://github.com/uwabami/ido-ghq)
- [GitHub - analyticd/ivy-ghq: Navigate to ghq managed git repos quickly using ivy Emacs package](https://github.com/analyticd/ivy-ghq)

ただ、Emacsには[Projectile](https://github.com/bbatsov/projectile)というプロジェクト管理の便利なパッケージがあるので、そこでghqの管理するリポジトリ一覧を使いたいなと思いました。

### 設定

Projectileとghqを設定した上で、以下の設定を追加するだけです。ghqで管理するリポジトリ一覧をProjectileから使えるようになります。Projectileの標準的な設定ならプロジェクト切り替えは "C-c p p" です。idoやivyなどが設定されていれば、この切り替えに補完インターフェースも機能します。

``` emacs-lisp
(when (executable-find "ghq")
  (setq projectile-known-projects
        (mapcar
         (lambda (x) (abbreviate-file-name x))
         (split-string (shell-command-to-string "ghq list --full-path")))))
```

ただ、とても簡単なコードなので、ghqで管理していないものは一切利用できなくなります。また細かいところですが、Emacs起動中にghqで新規にリポジトリを用意した場合、それを自動的に検知してくれたりはしないです。

### おまけ

Projectileは特定のプロジェクト配下に限定してfind-file ("C-c p f")したり、grep ("C-c p s g")したりできます。以下は、use-packageを使った場合の設定例です。

``` emacs-lisp
;; projectile
(use-package projectile
  :ensure t
  :diminish
  :custom
  (projectile-switch-project-action 'projectile-dired)
  :config
  (projectile-mode +1)
  (when (executable-find "ghq")
    (setq projectile-known-projects
          (mapcar
           (lambda (x) (abbreviate-file-name x))
           (split-string (shell-command-to-string "ghq list --full-path")))))
  :bind-keymap
  ("C-c p" . projectile-command-map))
```
FANUC PMCプログラミング入門 目次

# FANUC PMCプログラミング入門

- [第1部](https://qiita.com/oshino_maru/items/c51b7455b1278b51fb36)
    - プロローグ
    - 信号
    - 接点
    - コイル
- [第2部](https://qiita.com/oshino_maru/items/5cf3663cb06703bf11c3)
    - 機能命令を使ってみる
    - タイマ命令
    - カウンタ命令
    - 転送命令
- [第3部](https://qiita.com/oshino_maru/items/38eff39311fe1fee8b13)
    - ジャンプ命令による条件分岐・ループ
    - サブプログラム呼び出し
    - ファンクションブロック
    - 分割ラダー
- [第4部](https://qiita.com/oshino_maru/items/a36faf6963d68eef0f19)
    - CNC機能との連携
    - F/G信号による連携
    - ウインドウ命令による連携
    - CNC系統とPMC系統について
    - 外部データ入力
    - ラダープログラムによる軸制御
    - 位置信号出力
WindowsのCUIの見た目を変える

# 背景

デフォルトのWindowsのコマンドプロンプトなどのCLIがダサくてやる気が出ないので、それを変える時の自分用メモ。
個人的にはWSL2でUbuntuも使うのでそちらでもストレスなく使えるようなフォントや配色を選択した。

# やること

## フォントを変える

**Cica**をインストールする。決め手は`❯`などの記号や、絵文字を正しく表示できること。
https://github.com/miiton/Cica

もともとプログラミング用のフォントは**Myrica**が好きでよく使っていたが、CLI用途としては絵文字や記号も含めたより広い文字がサポートされていないとつらい面があるので、候補になるフォントは結構限られてくるかもしれない。

フォントの変更自体はウィンドウの上端を右クリックすると出てくるプロパティから変えられる（説明が雑）。
![cmd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265900/c13bda4a-b25e-bd75-3b79-0727cf33f765.png)

## 色を変える

### 色を変えるのに便利なツール（ColorTool）

コマンドプロンプトやPowershellなどには、残念ながらスタイルのプリセットをインポートしたりエクスポートしたりする機能はない。そもそもプリセットという概念がない。その状態では色を変えるのは至難の業なので、microsoft公式で用意してくれているツール（ColorTool）をダウンロードして使用する。

[ColorTool](https://github.com/microsoft/terminal/tree/main/src/tools/ColorTool)

このColorToolはterminalというプロジェクトの一部なので、もし上のリンクが切れていたらREADMEのページから探したりすると良さそう。

[microsoft/terminal](https://github.com/microsoft/terminal)

ダウンロードしたColorToolの実行ファイルに引数を渡してテーマを変更する。
例えば下記コマンドのように引数にプリセットを渡してあげると色を変えることが可能。
2020/12/26時点で、`schemes/solarized_light.itermcolors`はダウンロードしてきたときに付属している。

```
ColorTool.exe schemes/solarized_light.itermcolors
```

`-d`オプションをつけることで、レジストリに書き込んでデフォルトの配色を変更することができる。

```
ColorTool.exe -d schemes/solarized_light.itermcolors
```

### 他の色がいい！（例えばMonokai）

我が家の宗派は先祖代々、配色唯一教Monokai宗なのでMonokaiしかない。他の色は教義に背くことになるので許せない……という人でもご安心ください。
ColorToolで読み込める`.itermcolors`はもともとMacのターミナルアプリiTerm用の設定ファイルの拡張子であるので、ネットの海にはプリセットが沢山公開されている。Monokaiはメジャーな配色なので容易に見つけることができた。ありがたい。

https://github.com/mbadolato/iTerm2-Color-Schemes
https://github.com/deepsweet/Monokai-Soda-iTerm

ファイルを作成したら前述同様に`-d`オプション付きでColorToolに読み込ませれば完了。
私の推しは**[Monokai Vivid](https://github.com/mbadolato/iTerm2-Color-Schemes/blob/master/schemes/Monokai%20Vivid.itermcolors)**です。

## その他

あとはWSL2で動くUbuntuのデフォルトのシェルをzshに変更したり[Prezto](https://github.com/sorin-ionescu/prezto)のテーマを適用してオシャンティにしたりもしたけどその辺はUbuntuの話になってしまうので今回の記事からは割愛する。

# 最終成果物

WSL2のUbuntuから見たときにこんな感じになる。
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265900/fcfbfd06-dfa7-148e-39e0-4a5416b0f158.jpeg)
RDS Graviton2 インスタンスを試してみた（MySQL 編）

先に、こちらの記事で Amazon RDS の PostgreSQL 12.4-R1 を使って Graviton2 インスタンスと Intel x86_64 インスタンスを比較してみたところ、判断が難しい微妙な結果が出ました。

 - **[AWS の RDS（PostgreSQL）で Graviton2 インスタンスを試してみた](https://qiita.com/hmatsu47/items/139640aea998f6602b6e)**

**結果の概要**は以下の通りです。

 - m6g.xlarge(Graviton2) vs m5.xlarge(Intel x86_64)
   - 4vCPU・メモリ 16GiB
 - 最初に試した「3 種類の主キーでひたすら`INSERT`対決」では「引き分け」
 - 追加で試した`pgbench`では m6g.xlarge に軍配が上がる
   - ただしインスタンスを m6g.4xlarge・m6.4xlarge（いずれも 16vCPU・メモリ 64GiB）に上げて`pgbench`してみたところ、SSD（汎用 IOPS）の書き込み IOPS の上限に突き当たって判断が難しい状況に
 - 先に MySQL 8.0.22 on EC2(gp3) でサーバローカルから`mysqlslap`を実行して試したときは**ｖCPU 数が少ないうちは Graviton2 が高速だが、vCPU 数が多い環境で高い負荷を掛けるほど Intel x86_64 が高速**という結果が出ていた
   - **[MySQL 8.0.22 で innodb_log_writer_threads の効果を見てみる](https://qiita.com/hmatsu47/items/06489ef05bfcaaf310f3)**

そこで今回、RDS MySQLを使って「追試」を行ってみました。

# 追試の内容

 - RDS MySQL 8.0.21 (m6g.4xlarge / m5.4xlarge・700GiB SSD) を使って`mysqlslap`を実行
   - `mysqlslap`の`mixed`で、スレッド数 150・300・450・600・750・900 で負荷を掛けて所要時間を比較
     - この範囲なら`pgbench`とは違って 10,000 IOPS 以下の範囲で収まる
   - パラメータグループはデフォルト
   - バックアップを無効化してバイナリログを出力しないように
 - MySQL 8.0.22 on EC2 (m6g.4xlarge / m5.4xlarge・200GiB gp3 SSD 16,000IOPS) に対してもネットワーク越しに`mysqlslap`を実行してあらためて RDS と比較
   - CentOS 8.3
   - `innodb_log_writer_threads`は有効（デフォルト）
   - バイナリログは ON / OFF の 2 通りで

```bash:mysqlslapの内容
mysqlslap --auto-generate-sql --auto-generate-sql-guid-primary --engine=innodb --number-int-cols=20 --number-char-cols=20 --concurrency=【スレッド数】 --auto-generate-sql-write-number=2000 --auto-generate-sql-execute-number=2000 --auto-generate-sql-load-type=mixed -u mysqluser -h 【RDSエンドポイントまたはEC2のIPアドレス】 -p
```

※MySQL on EC2 では`innodb_dedicated_server=ON`でバッファプールサイズ等を調整・`max_connections=1000`に設定

# 結果 1 : RDS MySQL 8.0.21

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/e2f26125-a66e-41ff-104b-48e6962d0453.png)

縦軸は所要時間（秒）。値が低いほど高速です。

RDS PostgreSQL の結果（書き込み IOPS の上限に突き当たる前）と同様、**Graviton2 インスタンスのほうが高速**という結果に。スレッド数を増やして負荷を上げるほど差が大きくなりました。

# 結果 2 : MySQL 8.0.22 on EC2

 - **バイナリログ ON**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/c9225939-3765-2445-2515-cc22accc081d.png)

 - **バイナリログ OFF**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/2f56dd7a-4f6b-51c4-b67d-b86567e8dcb3.png)

RDS MySQL の結果とは逆に、**バイナリログ ON / OFF とも Intel x86_64 インスタンスのほうが高速**になりました。vCPU 数の多いインスタンスを使ってサーバローカルで`mysqlslap`を実行したときと同じですね。

# まとめ

それぞれで**真逆の結果**が出ました。

汎用的な CentOS 8.3・MySQL Community Server 8.0.22 rpm パッケージと比べて、RDS 環境では Graviton2 向けに何らかのチューニング・最適化が行われているのかもしれません。

---

 - **[Qiitaに投稿したMySQL 8.0関連記事](https://hmatsu47.hatenablog.com/qiita_mysql80)**
 - **[MySQL 8.0 の薄い本](https://github.com/hmatsu47/mysql80_no_usui_hon)（無料で配布中！）**
ViewModel ~AACを初学者がアウトプット~

ViewModelを考え設計に組み込むと何が良いのかを学んだことをアウトプットしたいと思います。

何故ViewModelを考えるのか
→1)バンドルデータで保存は、データの容量が大きくなるとエラーが出てしまうこと
→2)画面の回転、強制終了時にデータが初期化されてしまうこと

上記のような不具合を減らすために役割を持たせた設計を心掛ける必要があるということをコードラボで勉強しました。

ViewModelの役割とは?
→UI ControllerであるFragmentに、インスタンスを作って情報を渡すために必要である
そのため、ViewModelはデータの保持などのビジネスロジックをする必要がある。また、ViewModelFactoryによってインスタンス化された時の処理を決めておくこともできる。

前置きが長くなりましたが、模写したコードとスクショで振り返りたいと思います。


[1]
ライブラリの追加をする
→参考にどうぞ https://developer.android.com/jetpack/androidx/releases/lifecycle

[2]
ViewModelのクラスを作成する
![スクリーンショット (322).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975701/908aac42-c6b2-05df-c837-e76df22d45b3.png)

[3]
Fragmentと関連付けることで、UI controllerと関係を持たせる
![スクリーンショット (321).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975701/86e1cb4d-2410-315c-9102-73302b7ef932.png)

以上、最低限必要だと思った知識を簡単にアウトプットしてみました。
github→https://github.com/Ryosuke-N00/ViewModeltutorial

めちゃくちゃ適当なアウトプットですがこれで終わりです。失礼します
1週間でブラインドタッチにする

## 背景
エンジニアになるのだからブラインドタッチを身に着けたいと思い練習をしてみた。

## How
練習はこのサイトを使用しました。
[typing club](https://www.typingclub.com/)

ホームポジションの説明から始まり徐々に練習に使用する文字が増えていく。![2020-12-26_19h57_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667634/fbe391b5-c276-b737-3db6-9f8ecdec9af5.png)

**200レベル**あたりからアルファベットの練習が終わり、スピードを求めるようになります。筆者はこの前までは楽しんでやっていましたが一気にストレスになりました。

ちなみにコーディングに使うようなシンボル(!@#$など)が終わるまでは**418レベル**でした。シンボルの配列で想定されているのが英語キーボードのため変更して練習しました。個人的に英語キーボードのシンボルの配列はタッチタイピングに最適化されている気がして気に入ったのでこのまま使っています。

ここまでくるのに5日かかりました。

以降はひたすらに英文を打って速さを磨いていきます。結局筆者が到達できたのは7日間で**467レベル**まででした。(全部で685レベル)

## 寿司打で腕試し

ローマ字にも慣れたいと思い寿司打というフラッシュゲームを使ってみました。
結果はこんな感じ

![2020-12-26_21h21_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667634/72fd9954-0069-0080-79e0-7384a70da6fc.png)

ギリギリランキングに参加できる成績でした。
英字とローマ字のタイピングだと結構感覚が違うので多少練習しましたが、7日でこのくらいの成績でした。

ブラインドタッチでここまでの成績が出せるようになるとは思わなかったのでちょっと感動しました。

## 実際に使えるようになってみて
やはり目線の移動が減って集中力が格段にあがりました。文章を打っているときのミスタイピングにもすぐ気づけるため一週間でかなりの収穫だなと感じました。
またvimの操作にカーソルキーを使わない意味が理解できました。ホームポジションから離れすぎです。

## 所感
1週間でここまで身につくのはかなりコスパ高いです。ブラインドタッチできないと仰るインフルエンサーのエンジニアの方もいらっしゃいますがこんなに短期間で身につくなら自己学習のリソースを当ててあげてもいいと思いました。
数列1,1,4,5,1,4の一般項を求める

# 問題

```math
\displaylines{
f(0) = 1 \quad f(1) = 1 \quad f(2) = 4 \\
f(3) = 5 \quad f(4) = 1 \quad f(5) = 4
}
```
を満たす多項式関数$f(x) \ (x \in \\{ 0, 1, 2, 3, 4, 5 \\})$を求めよ。

# 求める

$x \in \\{ 0, 1, 2, 3, 4, 5 \\}$として

```math
\displaylines{
f(x) = g_0(x) + g_1(x) + 4g_2(x) + 5g_3(x) + g_4(x) + 4g_5(x) \ \cdots i

\\ \\

g_0(x) = \left\{
\begin{array}{ll}
1 & (x = 0) \\
0 & (x \neq 0)
\end{array}
\right.

\quad

g_1(x) = \left\{
\begin{array}{ll}
1 & (x = 1) \\
0 & (x \neq 1)
\end{array}
\right.

\quad

g_2(x) = \left\{
\begin{array}{ll}
1 & (x = 2) \\
0 & (x \neq 2)
\end{array}
\right.

\\

g_3(x) = \left\{
\begin{array}{ll}
1 & (x = 3) \\
0 & (x \neq 3)
\end{array}
\right.

\quad

g_4(x) = \left\{
\begin{array}{ll}
1 & (x = 4) \\
0 & (x \neq 4)
\end{array}
\right.

\quad

g_5(x) = \left\{
\begin{array}{ll}
1 & (x = 5) \\
0 & (x \neq 5)
\end{array}
\right.
}
```
上記の多項式関数$f$は問題の解を満たす。
よって多項式関数$g_n \ (n \in \\{ 0, 1, 2, 3, 4, 5 \\})$を求めればよい。

せっかちなのでいきなり解を書くが、以下の多項式関数は求めている$g_n$を満たす。

```math
g_n(x) = \frac{x(x-1)(x-2)(x-3)(x-4)(x-5)}{(-1)^{5-n}n!(5-n)!(x-n)}

\quad (n \in \{0, 1, 2, 3, 4, 5\}) \ \cdots ii
```

<details><summary>確認用プログラム（ES6）</summary><div>

```javascript
const fact = x => x === 0 ? 1 : x * fact(x - 1);

function g(n) {
    return function(x) {
        let bunsi = 1;
        for (let i = 0; i <= 5; i++) {
            if (i !== n) bunsi *= x - i;
        }
        const bunbo = Math.pow(-1, 5 - n) * fact(n) * fact(5 - n);
        return bunsi / bunbo;
    }
}

for (let n = 0; n <= 5; n++) {
    const gn = g(n)
    for (let x = 0; x <= 5; x++) {
        const rtn = gn(x);
        if (rtn === (x === n ? 1 : 0)) console.log(`g(${n})(${x}) -> ${rtn}: やりますねえ！`);
        else console.log(`g(${n})(${x}) -> ${rtn}: ダメみたいですね・・・`);
    }
}

```

実行結果は省略

</div></details>

$i, ii$より

```math
f(x) = \frac{1}{120}(13x^5 - 120x^4 + 295x^3 - 60x^2 - 128x + 120)
```

<details><summary>確認用プログラム（ES6）</summary><div>

```javascript
const yaju = x => (13 * Math.pow(x, 5) - 120 * Math.pow(x, 4) + 295 * Math.pow(x, 3) - 60 * Math.pow(x, 2) - 128 * x + 120) / 120;

console.log(yaju(0)); // 1
console.log(yaju(1)); // 1
console.log(yaju(2)); // 4
console.log(yaju(3)); // 5
console.log(yaju(4)); // 1
console.log(yaju(5)); // 4
```

</div></details>

以上より野獣先輩は多項式関数である。
Q.E.D 証明終了

# あとがき

昔、某掲示板で以下のプログラムを見て感銘を受け、感化されて今回の数式を求めました。

```c
#include<stdio.h>
#include<math.h>
int main()
{
	int i;
	double t;
	for (i=0;i<10;i++) { 
		t = 0.6283*i; 
		putchar(77+7*cos(t+3)+cos(t*2+4.6)+cos(t*3+4)+3.4*cos(t*4+0.3)); 
	} 
	return 0;
}
```

https://ideone.com/UJmCTT

何度見てもすごい。どうやってこの数式を求めたのか分からない。

（追記）
↑の元ネタを発見

http://www2s.biglobe.ne.jp/~tinyan/sell/index_helloworld.htm
[エラー] The size of tensor a (4) must match the size of tensor b (3) at non-singleton dimension 0

# The size of tensor a (4) must match the size of tensor b (3) at non-singleton dimension 0


## [忙しい人のための解決策]

```python
#後ろにconvert('RGB)をつけてchannels数を3に変更する
input_image = Image.open(filename).convert('RGB')
```

## [原因]　入力された画像のchannel数が4であるために３に戻してあげる必要がある。



<該当コード>

```python
from torchvision import transforms
    
input_image = Image.open('test.png')  #ここが問題
    
preprocess = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
    ])
input_tensor = preprocess(input_image)
```

<エラー画像>

![](https://paper-attachments.dropbox.com/s_D0F3D6903F9F4A654BC416119204AD0B46A3D0CA20186133C4188BEC49EEDB82_1608984679817_image.png)



<訂正後のコード>

```python
from torchvision import transforms
    
input_image = Image.open('test.png')  #ここを訂正した
    
preprocess = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
    ])
input_tensor = preprocess(input_image)
```

## 参考
https://stackoverflow.com/questions/58496858/pytorch-runtimeerror-the-size-of-tensor-a-4-must-match-the-size-of-tensor-b
【初心者】PHPで10進数を2進数に変える

# 10進数を2進数に変換したい
簡潔に。

```php
decbin(10進数);
```
実際に使ってみると…

```php
$str = 18;
echo decbin($str);
// 出力結果
10010
```
このような感じで、10進数"18"が"10010"と2進数に変えることができた。
## 逆に2進数を10進数には…
では逆はどうだろうか。

```php
bindec(2進数);
```
実際に使ってみると…

```php
$str = 10010;
echo bindec($str);
// 以下結果
18
```
このように2進数を10進数に変えることができた。

簡単に覚えておけそうなので、覚えておく。
VPCをサブネットに分割する方法

### ■　サブネットの考え方
　実際のネットワークでは、割り振られたCIDRブロックを、そのまま使わずに、さらに小さなCIDRブロックに分割して利用することがほとんどである。このように、細分化したCIDRブロックのことを**「サブネット（Subnet）」**という。
 
　サブネットに分割すると、その部分でネットワークを分けることができる。分ける理由として主に2つ挙げられる。


#### ①　物理的な隔離
　社内LANを構築する場合、「1階と2階とで、別のサブネットに分けたい」というように物理的に分たいことがある。
 
　サブネットに分けておくと、万一、どちらかのサブネットが障害を起こした時も、もう片側に、その影響が出にくくなります。
 
#### ②　セキュリティ上の理由
　サブネットを分ければ、それぞれに対して、別のネットワークの設定ができる。
 
### ■　VPC領域をサブネットに分割する
　今回は、前回作成したVPC領域を、2つのサブネットに分割する。
 
#### ①　パブリックサブネット（10.0.1.0/24）
　インターネットからアクセスすることを目的としたサブネット。のちの手順で、この領域には、Webサーバーを設置して、インターネットからアクセスできるようにする。
 
#### ②　プライベートサブネット（10.0.2.0/24）
　インターネットから隔離したサブネット。のちの手順で、この領域には、データベースサーバーを配置する。

### ■　パブリックサブネットを作る
　「10.0.1.0/24」のCIDRブロックで作成する。

#### ①　[サブネット]をクリックして、[サブネットを作成]をクリックする。
[![Image from Gyazo](https://i.gyazo.com/98e4b0c8f02642e544cc5e3fd2ab828c.png)](https://gyazo.com/98e4b0c8f02642e544cc5e3fd2ab828c)

#### ②　VPC IDに「前回作成したVPC」を、サブネット名に「パブリックサブネット」を、IPv4 CIDR ブロックに「10.0.1.0/24」をそれぞれ入力し、[サブネットを作成]をクリックする。
[![Image from Gyazo](https://i.gyazo.com/8d684e1187170d481dc00ba7ac407e1a.png)](https://gyazo.com/8d684e1187170d481dc00ba7ac407e1a)
MacにzipでPayaraをインストールする方法

- 環境
    - macOS Big Sur バージョン11.1
    - openjdk version "11.0.8" 2020-07-14


# インストールする
[Homebrewを使ってインストールする方法はこちら](https://qiita.com/ponsuke0531/items/611039314a2e85d02f2b)

## zipをダウンロードする
Macに`wget`がないことに気がつかなかった・・・ので`curl`コマンドを代用してMavenのサイトからzipファイルをダウンロードします。

- 参考 : [MacのTerminalでファイルをダウンロード - Disce gaudere. 楽しむ事を学べ。](https://keroring.hatenadiary.org/entry/20130507/1367896626)

現時点で一番新しげなpayara-5.2020.7.zipをダウンロードします。

- 参考 : https://repo1.maven.org/maven2/fish/payara/distributions/payara/

```zsh
# 任意のディレクトリへ移動する
% cd /usr/local/opt

# curlでzipをダウンロードする
% curl -O https://repo1.maven.org/maven2/fish/payara/distributions/payara/5.2020.7/payara-5.2020.7.zip
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  138M  100  138M    0     0  12.9M      0  0:00:10  0:00:10 --:--:-- 23.5M
```

## 解凍する
```zsh
# zipを解凍する
% unzip payara-5.2020.7.zip 
Archive:  payara-5.2020.7.zip
   creating: payara5/
   creating: payara5/mq/
   # ...省略...
  inflating: payara5/glassfish/bin/appclient  

# 使い終わったzipを削除する
% rm payara-5.2020.7.zip 

# バージョンを確認してみる
% payara5/bin/asadmin version
Version string could not be obtained from Server [localhost:4848].
(Turn debugging on e.g. by setting AS_DEBUG=true in your environment, to see the details.)
Using locally retrieved version string from version class.
Version = Payara Server  5.2020.7 #badassfish (build 2130)
Command version executed successfully.
```

## パスを通す
```zsh
# .zshrcにパスを通す設定を追記して
% vi ~/.zshrc
#...viエディタで以下の内容を追記する...
% cat ~/.zshrc | grep -i glass
export GLASSFISH_HOME=/usr/local/opt/payara5
export PATH=${JAVA_HOME}:${PATH}:${GLASSFISH_HOME}/bin

# 設定内容を反映してパスを通す
% source ~/.zshrc

# パスが通ったことをバージョン確認して確認する 
% asadmin version
Version string could not be obtained from Server [localhost:4848].
(Turn debugging on e.g. by setting AS_DEBUG=true in your environment, to see the details.)
Using locally retrieved version string from version class.
Version = Payara Server  5.2020.7 #badassfish (build 2130)
Command version executed successfully.
```

# 起動する
```zsh
# 起動する
% asadmin start-domain
Waiting for domain1 to start ............
Successfully started the domain : domain1
domain  Location: /usr/local/opt/payara5/glassfish/domains/domain1
Log File: /usr/local/opt/payara5/glassfish/domains/domain1/logs/server.log
Admin Port: 4848
Command start-domain executed successfully.
```

http://localhost:4848/common/index.jsf をブラウザで表示して起動したことを確認する。
![スクリーンショット 2020-12-26 20.39.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/b2a3755c-b5ff-e5f9-17dd-503a333e4c94.png)

```zsh
# 使い終わったら停止する
% asadmin stop-domain
Waiting for the domain to stop 
Command stop-domain executed successfully.
```

# 有効期限が切れているSSL証明書を削除する
[有効期限が切れているSSL証明書を削除する - Qiita](https://qiita.com/ponsuke0531/items/611039314a2e85d02f2b)

# EclipseにPayaraを設定する
環境 : Eclipse IDE for Enterprise Java Developers Version: 2020-12 M1 (4.18.0 M1)

[EclipseにPayaraを設定する方法 - Qiita](https://qiita.com/ponsuke0531/items/e2f2f1145cbf5065d142)
ネットワークの基礎知識メモ

## 概要
Webアプリケーションを開発していく上で必要不可欠になるネットワークの知識を簡潔にまとめました。

## 通信の仕組み

### Web（World Wide Web）

コンピュータを使って文書と文書を結びつける仕組みのことです。
文書とは`HTML`（HyperText Markup Language）のことでのことウェブページを作成するために開発されました。HTMLのことを正式に**ハイパーテキスト**と呼びます。

ハイパーテキストは、別のハイパーテキストへの参照を埋め込むことができ`aタグ`などのリンクを貼り付ける場合などが当てはまります。このことを**ハイパーリンク**と呼びます。

### TCP/IP
まず、前提にWebアプリケーションが表示される仕組みとしてクライアントがサーバーにリクエストを送り、サーバー側がそれに対してレスポンスを返すという仕組みになっています。

この通信にはルールがあり、そのことを**プロトコル**と呼びます。
**TCP/IPというのはルールの総称**のことです。

### HTTP（Hyper Text Transfer Protocol）
上記で示した通信プロトコルの中でもWebアプリケーションで用いられるのが`HTTP`というプロトコルです。
HTMLなどの文書をやりとりするときに用いられます。

### HTTPS（Hyper Text Transfer Protocol Secure）
HTTPをよりも安全に通信できるようにしたものです。通信内容を暗号化することによって安全に通信を行えるようにしています。

**HTTPS化のメリット**

- サイト利用者の安全
- サイトの信頼性
- SEOにおいて有利に働く


## 住所
インターネットにも住所があります。サイトなど見たいものがある時、そのページがどこにあるのかということを示しています。これがないとページの区別をすることができません。

### IPアドレス
馴染みはあまりありませんが、住所は`IPアドレス`というもので設定されています。たとえば、`192.168.0.1`のようなものです。
これだとわかりにくいので普段URLを入力するときもIPアドレスを入力して検索することはありません。これを人間がわかりやすいようにしたものが**ドメイン**です。

### ドメイン
たとえば、`https://www.google.com/`というURLがあります。
この全体のことを`URL`、`https`を**プロトコル**、`https://`を**スキーム**、`www`（World Wide Webの略称）を**ホスト名**、`google.com`を**ドメイン**と呼んでいます。

検索欄にドメインを入力するだけでサイトにアクセスすることができています。
これができるのは、IPアドレスとドメインを結びつける**DNS**というシステムがあるからです。

### DNS（Domain Name System）
**DNSのポイント**

- ドメインをIPアドレスに変換する仕組み。
- 電話帳のようなもので、名前と番号で管理されている。
- DNSのサービスを提供するサーバーを**DNSサーバー**という。

DNS（名前解決）の流れはこのようになります。

1. `https://www.google.com/`のホームページを見よう。 （リクエスト）
2. DNSサーバーに問い合わせ (裏側の処理)
3. `google.com`のIPアドレスは？ (裏側の処理)
4. `google.com`のIPアドレスは`172.217.26.99`だよ。 (裏側の処理)
5. `172.217.26.99`で`google.com`にアクセス （レスポンス）

裏側で処理が起きているため普段意識することはありませんがこのように処理がされ、目的のサイトを閲覧することができています。

### ポート番号

住所でいうところの部屋の番号の何号室か？を表しています。IPアドレスに加えてポート番号を指定することでリクエストを送ることができるようになります。[こちらの記事が参考になりました。](https://eng-entrance.com/network-port)


## まとめ

- 通信を行う際のルールや手順のことを「**プロトコル**」という
- HTTPS化をしたからといって100%安全ではないが、リスクを抑えることができるため必須
- DNSというシステムがあるため、ドメインを入力するだけで目的のサイトにたどり着くことができている


## 参考文献

- [URLのwwwとはどんな意味？Webとは？わかりやすく解説](https://saruwakakun.com/it/web/www)
- [DNS とは](https://aws.amazon.com/jp/route53/what-is-dns/)
- [すぐわかる！DNSのしくみ](https://xn--u8j7eobcu7j2kyg7f.jp/special/dns/page_02.html)
- [【3分で把握】ポート番号とは？と代表的なポート番号まとめ](https://eng-entrance.com/network-port)
【Swift】アサーションによるプログラムの終了

#アサーションに とは
アサーションは、**プログラムがある時点で満たしているべき条件を記述するための機能です。**
条件が満たされていない場合はプログラムの実行を中断します。

アサーションは実行時エラーを発生させてプログラムを終了させるのですが、
**実行時エラーを発生させるのはデバッグ時のみになります。**

リリース時には条件式の成否によらず処理を継続します。
個人的には結構便利なんじゃないかな？と思います。

##実装方法
標準ライブラリの`assert()`関数と`assertionFailure()`関数を利用します。

###assert( )関数
assert( )関数は、
**この関数が実行される際に満たされているべき条件を宣言するための関数です。**
この関数の実行時に条件が満たされていなかった場合は実行時エラーになります。

assert( )関数の第一引数には条件式を、第二引数には終了時のメッセージを取ります。

**条件式がtrueの場合は後続の処理を続け、
falseの場合は第二引数で渡したメッセージとファイル名、行番号を出力します。**

```swift

let a = 10
let b = 11
assert(a == b, "aとbの値が異なります。")

実行結果
Assertion failed: aとbの値が異なります。: file __lldb_expr_383/MyPlayground.playground, line 5
```

###assertionFailure( )関数

assertionFailure( )関数は、**条件式を持たない常に失敗するアサーションです。**

実行されること自体が条件を満たしていないので、
**第一引数にfalseを持つassert( )関数と同様です。**

次のサンプルコードでは、
引数に渡された値を元に季節を出力しています。

渡された値に該当する季節がなかった場合は実行時エラーが発生します。

```swift

func printSeason(month: Int) {
    switch month {
    case 1...2, 12:
        print("冬")
    case 3...5:
        print("春")
    case 6...8:
        print("夏")
    case 9...11:
        print("秋")
    default:
        assertionFailure("１から１２の値で設定してください。")
    }
}

printSeason(month: 1)
printSeason(month: 10)
printSeason(month: 100)

実行結果
冬
秋
Fatal error: １から１２の値で設定してください。: file __lldb_expr_385/MyPlayground.playground, line 13
```

##利用タイミング

###デバッグ時に想定外の状況を検出する

アサーションを利用して関数が想定する値の範囲を宣言することで、
デバッグ時に想定外の値を検出することができます。

###リリース時は想定外の状況でもプログラムの実行を継続する場合

リリース時でもプログラムを終了するfatalError( )関数と違い、
アサーションはリリース時には想定外の状況であってもプログラムの実行を継続します。

**つまり、想定外の状況に陥った際に処理を継続するか中断するかで判断します。**


以上がアサーションについても説明になります。

アサーションもfatalError( )も頻度多く起こることではないですし、
そんなに難しい処理ではないので頭の片隅に置いておく程度で良いと思います！

他のエラー処理についても記事にしているのでぜひご覧ください。
・[【Swift】Optional\<Wrapped>型でエラー処理を行う](https://qiita.com/onishiApp/items/110cc714139cd3dc7507)
・[【Swift】Result\<Success, Failure>型でエラー処理を行う](https://qiita.com/onishiApp/items/76e66d1504fcf42a9136)
・[【Swift】do-catch文でエラー処理を行う(その１)](https://qiita.com/onishiApp/items/cba5e6c7361163d8931e)
・[【Swift】fatalError関数によるプログラムの終了](https://qiita.com/onishiApp/items/e6f8cd28fe2ea38ebb7a)

最後までご覧いただきありがとうございました。
dotnet-traceがどのようにして起動時からの監視を可能にしているか

# はじめに

dotnet-traceは、[v5.0.160202から起動時からトレースログの収集を行えるようになった。](https://github.com/dotnet/diagnostics/releases/tag/v5.0.160202)
この記事では、どのようにその機能を実現しているかということを解説したいと思う。

# dotnet-traceとは

詳しくは [dotnet/diagnosticsのドキュメントを参照](https://github.com/dotnet/diagnostics/blob/v5.0.160202/documentation/dotnet-trace-instructions.md) してほしいが、要はEventSourceの情報を外部から収集するためのツールで、[EventPipeの仕組みを使用している](https://github.com/dotnet/diagnostics/blob/v5.0.160202/documentation/design-docs/ipc-protocol.md)。

dotnet-traceは[v5.0.152202](https://github.com/dotnet/diagnostics/releases/tag/v5.0.152202)までは、起動中のプロセスから選択して収集するという方法しか取れなかった。
というのも、使用しているIPCプロトコルの都合上、PIDが接続時に必要で、これはどうしても起動しないとわからなかったからである。
そこで、Diagnostic Portsという概念を導入して、起動時からの監視をできるようにしたというわけである。

# Diagnostic Portsとは

Diagnostic IPC Protocolは、PIDを含んだ名前付きパイプ、あるいはunixドメインソケットで通信を行うが、前述したように、
デフォルトで使用されるポートはランタイム側でPIDを含めた形で作成される。
しかし、一部のシナリオではこの仕組みは不都合な点があったため、追加で以下のような動作をランタイム側に追加した。

1. 環境変数に`DOTNET_DiagnosticPorts`があるか見る
2. もしあれば、スタートアップで動作を停止し、その名前のパイプが作成されるまで待つ
3. 誰かが指定した名前のパイプを作成して、ランタイムが接続に成功したら、そこにAdvertiseメッセージを送る
4. 以後はその確立した接続を使用して通常のEventPipeのやり取りを行う

図にすると以下のような感じ
![diagnosticports-seq.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103253/63ba178b-43e1-2644-2b7f-3e40843cbd5d.png)


図中にあるAdvertiseメッセージは以下のようなフォーマット

|オフセット|サイズ|名前|概要|
|---------|-----|----|----|
|0|8|magic|固定データ(`ADVR_V1\0`)|
|8|16|runtimeCookie|IPC ProtocolのProcessInfoのruntimeCookieと同じGUID(同一PIDで異なるプロセスの割り込みを防ぐため?)|
|24|8|PID|プロセスID(リトルエンディアン)|
|32|2|reserved|将来のための予約領域(現在は常に0)|

ProcessInfoに関しては、[dotnet/diagnosticsのIPCプロトコルドキュメントを参考に](https://github.com/dotnet/diagnostics/blob/master/documentation/design-docs/ipc-protocol.md#processinfo)

# 注意点

**上記手順は現在のクライアントライブラリ(Microsoft.Diagnostics.NETCore.Client)では素直に実現はできない**。
なぜならば、
1. 図中で必要なResumeRuntimeメッセージを送るためのAPIがinternal
    * ソースは https://github.com/dotnet/diagnostics/blob/5734230e3ee516339a4b0e4729def135027aa255/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/DiagnosticsClient.cs#L155
2. Collector側のパイプを待ち受ける処理もinternal
    * ソースは https://github.com/dotnet/diagnostics/tree/v5.0.160202/src/Microsoft.Diagnostics.NETCore.Client/ReversedServer の辺り

dotnet-traceでこの辺りの処理ができているのは、クライアントライブラリでInternalsVisibleToされているからである。

1に関しては、一応パイプ待ち受け処理の中で手動でResumeRuntimeメッセージを送るという回避方法はある。
2に関してはAdvertiseメッセージにPIDが入っているため、これさえ取得できれば後はDiagnosticClientに渡せば通信可能。
この辺りがinternalな理由は、やはり一度publicにすると仕様変更が難しいためではないかと思う。
一応、[dotnet-6.0のタイミングで対応を検討している模様](https://github.com/dotnet/diagnostics/issues/1810)なので、将来的には実装されるかもしれない。

# 終わりに

dotnet-traceで、起動時からEventSourceのログが取得できるようになったのは嬉しいことではある。
クライアントライブラリの方でもこの辺りの処理ができれば、夢が広がるというものである。
【Swift】グラデーションのフィルターをかける

# 3行で

- グラデーション用のクラスを作る
- グラデーション用のクラスを読み込む
- グラデーション用のクラスに値を渡す

## 色設定のクラスを作る

今回は別でクラスを作る。
ページによって色を変えたいときなどはこっちのほうがつぶしが効くし、**可読性**もあがる（レビュアーに叱られない）。

```swift:ChangeColor.swift
import Foundation
import UIKit

class ChangeColor {
  func changeColor(topR:CGFloat, topG:CGFloat, topB:CGFloat,
                   topAlpha:CGFloat,
                   bottomR:CGFloat, bottomG:CGFloat, bottomB:CGFloat,
                   bottomAlpha:CGFloat)
  ->CAGradientLayer {
  
    // グラデーション開始色
    let topColor = UIColor(red: topR, green: topG, blue: topB, alpha: topAlpha)
    
    // グラデーション終了色
    let bottomColor = UIColor(red: bottomR, green: bottomG, blue: bottomB, alpha: bottomAlpha)
    
    // グラデーションの色を配列で管理
    let gradientColor = [topColor.cgColor, bottomColor.cgColor]
    let gradientLayer = CAGradientLayer()
    gradientLayer.colors = gradientColor
    
    return gradientLayer
  }
}
```

## 色設定のクラスに値を渡す

```swift:ViewController.swift
class ViewController: UIViewController {

  // 色設定のクラスをインスタンス化する
  var changeColor = ChangeColor()
  var gradientLayer = CAGradientLayer()
  
  override func viewDidLoad() {
    super.viewDidLoad()
     
    // 色設定のクラスに値を渡す
    gradientLayer = changeColor.changeColor(topR: 0.07, topG: 0.13, topB: 0.26, topAlpha: 1.0, bottomR: 0.54, bottomG: 0.74, bottomB: 0.74, bottomAlpha: 1.0)
    // boundsは全体を表す
    gradientLayer.frame = view.bounds
    
    view.layer.insertSublayer(gradientLayer, at: 0)
  }
}
```

ところで『インスタンス化する』ってなんなんだろう？
漠然と使っている。
EC2 インスタンス毎に利用しているセキュリティグループを CSV で吐かせる AWS CLI

# はじめに
なんか仕事で AWS を触ることになってしまったので、AWS CLI を触ってみるぞ！
セキュリティグループが、どのインスタンスに紐づいているか、大量にあって分からんということで AWS CLI で調べてみる。

# やったこと
インスタンスの情報から、インスタンスの名前とセキュリティグループ名を引っ張ってきて　json へ出力。
その後、jq コマンドで csv 出力。

```
% aws ec2 describe-instances \
 --query "Reservations[].Instances[].{Name: Tags[?Key==\`Name\`].Value, SecurityGroup: NetworkInterfaces[].Groups[].GroupName}" \
 --output json |
 jq -r ".[] | [.Name[0], .SecurityGroup[] ] | @csv"
"JohnMcClane","inbound-web","launch-wizard-4"
% 
```
ジョンマクレーンに、"inbound-web","launch-wizard-4"の 2 つのセキュリティグループが紐づいていることがわかりました。

# おわりに

上記のコマンドで EC2 インスタンスに紐づいているセキュリティグループが CSV で取得できるようになりました。
今回の例では EC2 インスタンス 1 台だけですが、複数台の EC2 インスタンスでも同じコマンドでセキュリティグループを取得できます。
セキュリティグループの棚卸し、セキュリティグループを別に作って集約するときに参考にするなどで使っていこうと思います。
amdgpu-pro 20.45 の Vulkan のメモ


Vulkan Version: `1.2.152`

## icd 設定ファイル

`/opt/amdgpu-pro/etc/vulkan/icd.d` にあります.

別の Vulkan ドライバと競合していて vulkan アプリがうまく動かないときは,

`export VK_ICD_FILENAMES=/opt/amdgpu-pro/etc/vulkan/icd.d/amd_icd64.json`

で `VK_ICD_FILENAMES` 環境変数を設定しましょう.

## Ray tracing 拡張はまだ

RX6800 で試しましたが ray tracing 拡張はまだありませんでした :cry:
pickadate.jsで特定の日付を無効にしようとすると、ひと月先が反映される原因

# どうも7noteです。pickadate.jsの日付無効を指定したら、ひと月先に反映される原因

2021/4/17 追記：コメントいただきました。pickadate.js自体の仕様のようです。

ちょっとニッチですが、様々なカレンダーjsがある昨今で「シンプルで高機能」と言われている**pickadate.js**というカレンダーがあります。
しかし、**問題が発生しました。**

---

***「いくつかの指定日をdisable設定したのになぜか効かない問題」***
***「指定した日よりもちょうど1ヵ月先の日がdisabledされている」***

---

いろいろ試してみたのですが、どうやらこうなっているようです・・・
そうなのです、なぜか、ひと月先の日がdisabledされてしまっているのです。

## ソース

・pickadate.js  3.6.2
・jQuery 3.4.1

```index.html
<!DOCTYPE html>
<head>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link id="theme_base" rel="stylesheet" href="./lib/compressed/themes/default.css" />
<link id="theme_date" rel="stylesheet" href="./lib/compressed/themes/default.date.css" />

<script src="./lib/picker.js" charset="utf-8"></script>
<script src="./lib/picker.date.js" charset="utf-8"></script>
<script src="./lib/picker.time.js" charset="utf-8"></script>

<script type="text/javascript">
$(function(){
  $('.datepicker').pickadate({
    disable: [
      [2020, 11, 30],   // なぜか2020/12/30がdisabledになる
      [2020, 11, 31]    // なぜか2020/12/31がdisabledになる 
    ],
  });
});
</script>
</head>
<body>
  <input type="text"  placeholder="日付選択" name="date" class="datepicker" />
</body>
</html>
```

**結果は失敗・・・**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/66e2c274-d24c-c91d-a0a1-e5e8a38aa58c.png)


余計なものはすべて省き、最新のjqueryとpickadate.jsのファイルを使ってもダメでした。
おそらくもともとのデータで既に不具合があるのではと考えています。


## まとめ

まだ解読できていないので、時間のある時に元ファイルを解体して原因を探ってみたいと思います。
ひとまずはややこしいですが、一か月前を指定して対応するしかなさそう。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
初心者必見！Vue.jsでSlick（スライドショー）を導入する方法

サイト制作で、ページトップでスライドショーを入れたいなと思ったことはありませんか？

**そんな方に必見！**

「こんなに簡単だったんだ」と思えるくらい簡単に説明していくので、是非学習の参考にしてください！

今回僕が紹介するのは、Slickでのスライドショーの手順を紹介していきたいと思います！！

それでは説明していきます。

#モジュールのインストール#

```
npm install vue-slick 
npm install jquery
yarn
```

#Slickのインポートとオプションの設定#

次に、スライドショーを実行するページでSlickをインポートし、オプションを設定していきます。
以下のコードをコピペするだけでOKです！

```Home.vue
<script>
import Slick from 'vue-slick'
data() {
  return{
    slickOptions:{
        arrows: true,    //スライドの矢印ボタン
        dots: true,      //ドットマーク
        autoplay: true,  //自動スライド
        autoplaySpeed: 4000,  //自動スライド間隔(ms)
        pauseOnFocus: false,  //ドットマークを押すとスライドショーが止まるのを防ぐ
        prevArrow:'<button type="button" class="slick-prev"></button>',  //ひとつ前の画像に戻る矢印ボタン
        nextArrow:'<button type="button" class="slick-next"></button>'   //ひとつ先の画像に進む矢印ボタン
      }
  }
},
components: {
      Slick
}
</script>
```

オプションは、基本的にはこれがあれば大丈夫です。なので、これをコピペしてください。

#CSSファイルのインポート#

次は、まず``node_modules/slick-carousel/slick``を開いてください。

そしたら、その中の``slick.min.js,slick.css,slick-theme.css,fonts,ajax-loader.gif``をpublicファルダに以下のようにコピーします。

```
C:.
│  data.json
│  favicon.ico
│  index.html
│
├─css
│  │  ajax-loader.gif  //追加
│  │  config.rb
│  │  main.css
│  │  slick-theme.css  //追加
│  │  slick.css        //追加
│  │
│  └─fonts　　　　　　　//追加
│
│
└─js
        slick.min.js  //追加
```

そしたら、CSSファイルをインポートします。

```Home.vue
<style scoped>
@import "../../public/css/slick-theme.css";
@import "../../public/css/slick.css";
</style>
```

#jsファイルの読み込み#

```index.html
<body>
<script src="js/slick.min.js"></script>
</body>
```

また、以下を参考にして矢印ボタンやドットの場所や大きさを変更して見て下さい。

```slick-theme.css
.slick-prev,.slick-next{z-index:1000}  /* これを設定しないと矢印ボタンが画像に埋まる */
.slick-prev{left:-25px}                /* 矢印ボタンの場所を調整 */
.slick-next{right:-25px}               /* 矢印ボタンの場所を調整 */
.slick-bots{bottom:-25px}              /* ここでドットの場所を調節 */
.slick-dots li button:before{font-size:6px}  /* 大きさ調整 */
```

#コンポーネントの追加#

最後は、コンポーネントを追加してスライドショーの画像を設定します

```Home.vue
         <Slick ref="slick" :options="slickOptions" class="slick-outer">
            <div><img src="../assets/slideimg1.jpg" class="slick-img"></div>
            <div><img src="../assets/slideimg2.jpg" class="slick-img"></div>
            <div><img src="../assets/slideimg3.jpg" class="slick-img"></div>
          </Slick>
```

画像を追加したい場合は、同じように追加してあげれば追加されます！

これで、スライドショーを実行できると思います！

何かご不明な点がございましたら、コメントにてご報告ください。

以上、「Vue.jsでSlick（スライドショー）を導入する方法」でした！！

良ければ、LGTM、コメントお願いします。

また、何か間違っていることがあればご指摘頂けると幸いです。

他にも初心者さん向けに記事を投稿しているので、時間があれば他の記事も見て下さい！！

Thank you for reading
AWS CLI 入門

# はじめに
なんか仕事で AWS を触ることになってしまったので、AWS CLI を触ってみるぞ！

# 本家の情報

 - [設定ファイルと認証情報ファイルの設定](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-files.html)
 - [名前付きプロファイル](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-profiles.html)
 - [AWS CLI を設定する環境変数](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-envvars.html)
 - [IAM ユーザーのアクセス権限の変更](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users_change-permissions.html)
 - [AWS CLI の設定](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-configure.html)

# 要約

1. AWS CLI を利用する IAM ユーザを作成する
2. AWS 接続情報の編集
3. 利用するプロファイルの設定
4. AWS CLI 接続テスト

# やったこと
## 1. AWS CLI を利用する IAM ユーザを作成する
IAM で AWS CLI を利用するユーザーを作成します。
アクセスの種類は、プログラムによるアクセスのみをチェックボックスONにします。
アクセスキーの認証情報を使って、AWS にアクセスするため、認証情報のファイルをダウンロードしておきます。

## 2. AWS 接続情報の編集

IAM ユーザー作成時に作った認証情報を AWS CLI を使う端末に設定します。
複数の環境で AWS CLI を使う想定で、名前付きのプロファイルにしています。

```
% aws configure --profile develop
AWS Access Key ID [None]:（秘密）
AWS Secret Access Key [None]: （秘密） 
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

## 3. 利用するプロファイルの設定

AWS CLI のコマンドを利用するプロファイルを環境変数で指定します。

```
% export AWS_PROFILE=develop
```

## 4. AWS CLI 接続テスト

AWS CLI で、インスタンス一覧を確認します。
ジョンマクレーンという EC2 のインスタンスが見えたので接続成功です。

```
%  aws ec2 describe-instances
{
    "Reservations": [
        {
            "Groups": [],
            "Instances": [
                {
                    "AmiLaunchIndex": 0,
                    "ImageId": "ami-01748a72bed07727c",
                    "InstanceId": "i-049b87af5a5873da4",
                    "InstanceType": "t2.micro",
                    "KeyName": "JohnMcClane",
                    "LaunchTime": "2020-12-26T10:29:03+00:00",
                    "Monitoring": {
                        "State": "disabled"
                    },
                    "Placement": {
                        "AvailabilityZone": "ap-northeast-1a",
                        "GroupName": "",
                        "Tenancy": "default"
                    },
                    "PrivateDnsName": "ip-172-31-34-175.ap-northeast-1.compute.internal",
                    "PrivateIpAddress": "172.31.34.175",
:
```

# おわりに

AWS CLI が利用できると、設定の自動化や設定情報を取得が楽にできるようなので、チャレンジしようと思います。
MacにあるクイックアクションのPDF作るやつWindowsにも欲しい

# 初めに
![PXL_20201226_090521131.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/b5b98ee0-421a-f31d-8410-b953ad121c35.jpeg)
MacのPDFを作成という機能をスキャナで読み取った画像データをまとめることが多く、その機能使うためにMacを使うこともあるので(オンラインもあるけど)Windowsにも同じ機能を付けたかった。

# 動作環境
- Windows10
- Python 3.8.6

# コード
[GitHub](https://github.com/EveSquare/PDF_creation_tool)にコードがあります。
pythonファイルを置いた場所(絶対パス)を.batに書き込む必要があります。

```PDFを作成.bat
@echo off
 
if not "%~0"=="%~dp0.\%~nx0" (
     start /min cmd /c,"%~dp0.\%~nx0" %*
     exit
)

python G:\Python\PDF_creation_tool\create_pdf.py(ここはcreate_pdf.pyの絶対パス) %*
```

# 設定
Windowsキー + R でshell:sendto　と入力して出てきたファイルに.batファイルを入れる
![send_to_open.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/1a36da61-41b7-5e99-e565-14d97e20033a.jpeg)
![スクリーンショット 2020-12-26 194718.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/87006cda-3d92-b88a-5924-795e01042947.jpeg)

# 動作確認
二つの画像ファイルを選択して右クリック->送る->PDFを作成.bat
![dawdawda.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/cc6dccab-7b04-93e8-4f3f-0623e0e5d0f3.jpeg)

「い.pdf」が作られました。
![eqda.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/1a80ff36-5bfa-68d5-7e69-6dcb63c8f5ec.jpeg)

Chromeで開いてみた図
![i.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/5bbe7c01-5d44-3786-ca84-d864437ede5c.jpeg)

# 感想
右クリックのメニューにPDFを作成.batの拡張子がついているのが気になるので、ショートカットとかシンボリックリンクとか作ってみたのですが、出来ませんでした。。

捗りポイント90

# 参考
http://dalmore.blog7.fc2.com/blog-entry-191.html
https://uguisu.skr.jp/Windows/bat_nowindow.html
wslでubuntu その10

#概要

windowsとwslのアクセス、やってみた。

#環境

windows10 64bit
ubuntu 18.04

#wslのhomeは、どこ。

wslのシェルで、以下を打つ。

```
explorer.exe .
```

自分の場合、\\wsl$\Ubuntu-18.04\homeでした。

#wslからファイルをドキュメントに送る。

```
cp test.txt /mnt/c/Users/***/Documents
```

#wslから、mp4を再生する。

```
cmd.exe /c start $(wslpath -w ./media/videos/test0/480p15/test0.mp4)
```

#wslから、エクスプローラを開く。

```
explorer.exe .
```

以上。
RDKitでアミノ酸配列をSMILESに変換する

#はじめに
アミノ酸配列で表現される化合物をMOLオブジェクトに変換し、分子の記述子を計算して機械学習を行いたい。このため掲題の件を調べたのでメモっておく。

#方法
RDkitのChem.MolFromFASTAを使う。

#コード
```peptide.py
import rdkit
from rdkit import Chem

def main():
    smiles = Chem.MolToSmiles(Chem.MolFromFASTA("RGDfK"))
    print(smiles)

if __name__ == "__main__":
    main()
```

#出力結果
```
N=C(N)NCCC[C@H](N)C(=O)NCC(=O)N[C@@H](CC(=O)O)C(=O)N[C@@H](Cc1ccccc1)C(=O)N[C@@H](CCCCN)C(=O)O
```
お、出てる。

#課題
https://www.novoprolabs.com/tools/convert-peptide-to-smiles-string のサイトのように、条件を指定して環状にした形でSMILESを得る方法が、まだよくわからない。

#参考
-[How do I convert my peptides into SMILES strings?](https://www.researchgate.net/post/How_do_I_convert_my_peptides_into_SMILES_strings)
GitHubに草が生えない件について

## ２ヶ月たってようやく草が生えていないことに疑問を覚えた
すでに解決方法はたくさん載っているが、個人的なアウトプットのため投稿。
２ヶ月前にGitHubには毎日草を生やすべきだと知り、毎日欠かさずcommitしていたのに、いつまで経っても緑豊かにならなかった。原因を詳しく探ろうとしなかった自分を殴りたい。

## 結論　ローカルとGitHubのメールアドレスを一致させる
まず、GitHub→Settings→Email settingsでメールアドレス確認。
ほとんどの人の場合、ローカルとGitHubのメールアドレスが違うことが多いと思うが、自分の場合はなぜかローカルにメールアドレスが設定されていなかった。

```
git config user.email
何も出ない
```
ローカルのメールアドレスの変更、または設定する

```
git config user.email "your mailadress"
```

参考：https://qiita.com/endo_hizumi/items/49edf021b8b9189b4f88
くりぼっち慰めプログラム

どうも、山田長政です
クリスマスなんでツイッターのくりぼっちツイートにいいねを押すプログラムを
作りました。

#いるもの

python
tweepy
　　

#プログラム
countのとこに押す回数を入れます。

```python:tw.py

import tweepy
from time import sleep

consumer_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxx'
consumer_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
access_token = 'xxxxxxxxxxxxxxxxxx'
access_token_secret = 'xxxxxxxxxxxxxxxxx'



auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth)

    
for status in api.search(q='くりぼっち', count=10000):
    tweet_id = status.id
# 例外処理をする
    try:
# いいね実行
        api.create_favorite(tweet_id)
        print("ok")
    except:
        print('error')
```
Excel マクロ　チェックボックス(activateX コントロール)を使用した処理分岐

###◇マクロのチェックボックス(activateX コントロール)を使用した処理分岐

###〇事前準備
　・シートにチェックボックス(activateX コントロール)を配置
　・シートに処理ボタンを配置
　・各種チェックボックスのオブジェクト名、Captionを分かりやすいように編集
　　(編集は「開発」タブ→「デザインモード」→対象選択して「プロパティ」)　
　　今回は以下のように設定
　　　ボタン　オブジェクト名　caption
　　　　k　　　checkBox_k　　　k
　　　　y　　　checkBox_y　　　y
　　　　s　　　checkBox_s　　　s
　　　 m1　　　checkBox_m1　　m1
　　　 m2　　　checkBox_m2　　m2

![jizen1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730953/eda6de98-eec0-bb39-20f0-20b8f25283a5.png)

![jizen2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730953/e4c37b4d-a045-9872-f9ea-6ab447d8b9b8.png)

###〇ソース
Option Explicit

Const SHEET_NAME_MAIN = "sheet1"

Sub selectSheetProcess()

Dim st_k, st_y, st_s, st_m1, st_m2 As String

'mainシートをactive
Worksheets(SHEET_NAME_MAIN).Activate

'以下チェックボックスの状態で処理分岐
'チェックボックスの状態を取得し、〇 or × を変数に格納
'checkBox_k
If ActiveSheet.checkBox_k.Value = True Then
  st_k = "〇"
ElseIf ActiveSheet.checkBox_k.Value = False Then
  st_k = "×"
End If

'checkBox_y
If ActiveSheet.checkBox_y.Value = True Then
  st_y = "〇"
ElseIf ActiveSheet.checkBox_y.Value = False Then
  st_y = "×"
End If

'checkBox_s
If ActiveSheet.checkBox_s.Value = True Then
  st_s = "〇"
ElseIf ActiveSheet.checkBox_s.Value = False Then
  st_s = "×"
End If

'checkBox_m1
If ActiveSheet.checkBox_m1.Value = True Then
  st_m1 = "〇"
ElseIf ActiveSheet.checkBox_m1.Value = False Then
  st_m1 = "×"
End If

'checkBox_m2
If ActiveSheet.checkBox_m2.Value = True Then
  st_m2 = "〇"
ElseIf ActiveSheet.checkBox_m2.Value = False Then
  st_m2 = "×"
End If

'状態の取得結果を文字連結
MsgBox st_k & st_y & st_s & st_m1 & st_m2


End Sub

###〇実行
　・全てチェックされている場合
![res1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730953/f1fa83ec-3c05-c944-168b-d99e79f40ea3.png)
　
　・k, s, m2のみチェック
![res2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730953/2ed07741-476b-45db-5cbc-b9483bbf57c0.png)

###〇結果
　チェックボタンの状態が取得できる！
プロキシを越えるために使えるツール/方法を紹介していく

この記事は[多摩科学技術高校 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/tkg-ac2020)の23日目ですが遅れました．

この記事では多摩科技生が苦労するHTTPプロキシ越えのために使えるツールを紹介します．

## SoftEther VPN

[SoftEther VPN プロジェクト - SoftEther VPN プロジェクト](https://ja.softether.org/)

IPAの未踏ソフトウェア創造事業から生まれたVPNです．
このVPNでは通信をover HTTPでカプセリングします．
これによってHTTPしか通らないプロキシサーバを通過することができます．

## Teleport

[Teleport - Access Computing Resources Anywhere](https://goteleport.com/)

Teleportはセキュアなアクセスを実現するゲートウェイです．
CNCF(Cloud Native Conmputing Foundation)の配下にあるプロジェクトです．
エージェントを導入することでSSH over HTTPSが行えます．

## CONNECT + SSH

HTTPプロキシのCONNECTメソッドとSSHを組み合わせる方法です．
HTTPプロキシでHTTPS通信を通過させるためにCONNECTメソッドが使われます．
これを利用することで443/TCP宛でSSHを通せます．
SSHサーバを443/TCPでListenさせておく必要があります．

OSSの実装の一つにConnect Proxyがあります．
Puttyでも同様の操作を行えるようです．

- [larryhou/connect-proxy](https://github.com/larryhou/connect-proxy)
- [LinuxでHTTP proxy越しにSSHする - YAMAGUCHI::weblog](https://ymotongpoo.hatenablog.com/entry/20110325/1301039272)
- [Blog Alpha Networking: SSH over HTTPS(HTTP)でプロキシ、ファイアウォール超え](https://alpha-netzilla.blogspot.com/2015/05/tunnel.html)

NginxでHTTPSとSSHの両方を443/TCPでListenする方法があるようです．

- [Diary: nginxだけで、HTTPSとsshを同時に443番ポートで待ち受ける](https://blog.onodera.asia/2021/03/nginxhttpsssh443.html)

## Google Cloud IAP

[TCP 転送の概要  |  Identity-Aware Proxy  |  Google Cloud](https://cloud.google.com/iap/docs/tcp-forwarding-overview)

Googleの提供するIdentity Aware Proxyです．
TCP通信をover HTTPSで転送することでVPNレスでプライベートネットワークのリソースへアクセスできます．
Google Researchでの研究であるBeyondCorpをもとに製品化されています．

## Pomerium

CNCFに属するプロジェクトであるPomeriumに新たにTCP Forwardingが追加されました．

https://twitter.com/atpons/status/1352460175261589504?s=21

## おわりに

今回はプロキシを越える方法をいくつか紹介しました．
これらの方法は使い方によってはセキュリティホールにつながります．
目的と影響範囲を十分に考えてから利用してください．
Python3でパスワード自動生成してみた

##はじめに
こんにちは、Snakeseedです。今日はPythonの組込み変数「chr」を使った自動パスワード生成プログラムを作ったので共有しようと思います。アルファベットのパスワード以外は使いづらいですが、それでも面白いので作ってみました。覚えづらいって?それはまぁ......

色々なパスワードを生成していこうと思います。

##この記事の見方
この記事、実は「実用性」というものを作っています。
実用性は、
★★......どこで使うのか疑問
⭐️★.....使える
⭐️⭐️......どこでも使える
の3段階です。

##実行環境
[Paiza.IO](https://paiza.io/ja)のPython3です。

##漢字のパスワード
@shiracamus 様にrandomの```choice```を教えていただき、修正いたしました。

```Python
import random

l = range(11936, 12000)
n = 20  # パスワードの長さ
x = ''.join(chr(random.choice(l)) for _ in range(n))
print(x)
```
実用性 ★★
これそもそも日本語の漢字ではないので、日本語しか喋ることができない人にはもちろんのこと、他の人も覚えるのが大変です。

##アルファベットのパスワード
####小文字だけ
```Python
import random

l = range(96, 123)
n = 20  # パスワードの長さ
x = ''.join(chr(random.choice(l)) for _ in range(n))
print(x)
```
####大文字だけ

実用性 ⭐️★






##おまけ:適当版
####1つ目
パスワード例

```
؃جأؠب؉؊ׯ؊פײزس׭جـؐװײا
```

```
⇲⇷∁⇖⇶∖∇⇯∞∂∉⇻⇩∙√∑⇟∠⇤⇕
```
お分かりの通りなんでもありです。ハングル・漢字は入っていない（はずです）。

```Python
import random

l = range(1000, 10000)
n = 20  # パスワードの長さ
x = ''.join(chr(random.choice(l)) for _ in range(n))
print(x)
```
実用性 ★★

####2つ目
パスワード例

```
䭖䭏䬹䭐䬪䬩䬯䬤䭋䬼䭆䭑䭝䭛䭋䬴䭘䬺䬏䬕
```

意味もあるようです。 ([Google 翻訳](https://translate.google.com/?hl=ja&sl=zh-CN&tl=ja&text=%E4%AD%96%E4%AD%8F%E4%AC%B9%E4%AD%90%E4%AC%AA%E4%AC%A9%E4%AC%AF%E4%AC%A4%E4%AD%8B%E4%AC%BC%E4%AD%86%E4%AD%91%E4%AD%9D%E4%AD%9B%E4%AD%8B%E4%AC%B4%E4%AD%98%E4%AC%BA%E4%AC%8F%E4%AC%95&op=translate))

```
웕욫웕욹욤웁욷웉욝웢욵욵욣욎욤욘욵욑웚웥
```
ほとんど漢字です。（文字数が多いから）
お分かりの通りなんでもありです。*ハングル・漢字も入っています。*

```Python
import random

l = range(1000, 70000)
n = 20  # パスワードの長さ
x = ''.join(chr(random.choice(l)) for _ in range(n))
print(x)
```
実用性 ★★




##参考文献
##Qiita
- https://qiita.com/okkn/items/3aef4458ed2269a59d63

##その他
- [Unicode版 文字コード表](http://www.m-hoz.com/jsp/unicode.jsp?Bgn=0&End=65536)
- [[python] いろいろな文字種のリストを作成](https://qiita.com/okkn/items/3aef4458ed2269a59d63)

##メモ
2020年12/26(土)19:22投稿
roman numerals（hashで簡潔化してみた）



# roman numerals


## 問題

**アラビア数字(arabic numerals)を受け取って，ローマ数字(roman numerals)を返すmethodを書きなさい．**

各ローマ数字は以下のように対応する．

| roman num | arabic num |
|:----------|-----------:|
| I         | 1          |
| V         | 5          |
| X         | 10         |
| L         | 50         |
| C         | 100        |
| D         | 500        |
| M         | 1000       |


## 解法

基本的にローマ数字各種に対応するアラビア数字で順に割っていくのが正攻法だろう．ただし，ローマ数字はアラビア数字における 4 や 9 においては少し特殊な挙動をする．計算式でうまいことやろうとするとif 文を乱用しそう．

今回は簡潔で美しいプログラムにすべく，アラビア数字各桁における 4 や 9 についてはあらかじめ配列に登録しておく．とはいったものの配列を用意するとなるとローマ数字とアラビア数字の 2 つ配列を用意しないといけない．これでは簡潔で美しいプログラムではなくなってしまう．

そこで授業内では触れられていないが，Ruby ならではの便利な hash を活用する．hash を簡単に説明すると Python でいう辞書型である．2 つの配列に対し，不規則だが対応関係があるものについては hash と each を活用すれば簡潔なプログラムにできる．プログラミングスクールのメンターをしていたときに学んだことがこんなところで活かせるとは．


### 2 つの配列を Hash で

配列を用いたら

    arabic_value = [1000,900,500,400,100,90,50,40,10,9,5,4,1]
    roman_value = ["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"]

と 2 行になってしまうところを，ハッシュを用いれば

    value_sets = {"1000"=>"M","900"=>"CM","500"=>"D","400"=>"CD","100"=>"C","90"=>"XC","50"=>"L","40"=>"XL","10"=>"X","9"=>"IX","5"=>"V","4"=>"IV","1"=>"I"}

こんな感じで 1 行にでき，視覚的にも直感で理解しやすくなる．


### 実装

それでは，hash を用いてアラビア数字をローマ数字に変換するメソッド to\_roman を実装してみる．hash の key は アラビア数字なので，先頭から順に key で割っていき，商の回数分ローマ数字である value を代入すれば良い．これを hash の先頭から each で繰り返せば良いので，プログラムは以下のようになる．

```ruby
def to_roman(num)
  str = ""
  value_sets = {"1000"=>"M","900"=>"CM","500"=>"D","400"=>"CD","100"=>"C","90"=>"XC","50"=>"L","40"=>"XL","10"=>"X","9"=>"IX","5"=>"V","4"=>"IV","1"=>"I"}
  value_sets.each do |arabic,roman|
    quotient = num/arabic.to_i
    num = num%arabic.to_i
    str << roman*quotient
  end
  str
end

puts to_roman(ARGV[0].to_i)
```

想像以上に短いプログラムにできた．


## 発展問題

Integer class を拡張して，

    999.to_roman #=>CMXCIX

のように実行することで，ローマ数字を返すようにしたい．

ここまできたらもう簡単．


### 実装

こんな感じ．

```ruby
class Integer
  def to_roman
    num = self
    str = ""
    value_sets = {"1000"=>"M","900"=>"CM","500"=>"D","400"=>"CD","100"=>"C","90"=>"XC","50"=>"L","40"=>"XL","10"=>"X","9"=>"IX","5"=>"V","4"=>"IV","1"=>"I"}
    value_sets.each do |arabic,roman|
      quotient = num/arabic.to_i
      num = num%arabic.to_i
      str << roman*quotient
    end
    str
  end
end

puts ARGV[0].to_i.to_roman
```


### 動作確認

忘れずに動作確認しておく．

    $ ruby roman_numerals.rb 23 
    XXIII
    
    $ ruby roman_numerals.rb 169
    CLXIX
    
    $ ruby roman_numerals.rb 1997
    MCMXCVII
    
    $ ruby roman_numerals.rb 2020 
    MMXX

問題なさそう．


# 参考ページ

今回参考にしたページはこちら．[roman numerals](<https://qiita.com/daddygongon/items/ba94b0f2a73990fc6a07>)



------
 - **source** ~/grad_members_20f/members/e79a93e5b7b1/posts/class/roman_numerals.org
効率的に読むには from エンジニアの知的生産術(マイピックアップ)


「[エンジニアの知的生産術](https://www.amazon.co.jp/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E7%9F%A5%E7%9A%84%E7%94%9F%E7%94%A3%E8%A1%93-%E2%80%95%E5%8A%B9%E7%8E%87%E7%9A%84%E3%81%AB%E5%AD%A6%E3%81%B3%E3%80%81%E6%95%B4%E7%90%86%E3%81%97%E3%80%81%E3%82%A2%E3%82%A6%E3%83%88%E3%83%97%E3%83%83%E3%83%88%E3%81%99%E3%82%8B-WEB-PRESS-plus-ebook/dp/B07JFRF6MW/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2GRDGUXMBTF82&dchild=1&keywords=%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E7%9F%A5%E7%9A%84%E7%94%9F%E7%94%A3%E8%A1%93&qid=1608975046&sprefix=%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E7%9F%A5%E7%9A%84%2Cstripbooks%2C272&sr=8-1)」を読み、今の自分にとって大切な考え方をピックアップ！


# 第4章. 効率的に読むには

読書は手段であり目的ではない。**読書する目的を明確に**することが効率的に読む前提となる。

**目的の例:**
悪い例 →　情報収集をしよう　
良い例 →　情報のアウトプットとは具体的に何をすることかを学ぶ

##「読む」にはいくつか種類がある。
- 熟読すべき本、読み流すべき本、情報を見つける本など、その本に対する目的によって「読む」の種類を使い分けが必要であり、**種類によって読み方・スピードを意識的に変更していくことが大切**


## **「インプット(読む)量 = 理解できた情報量とは限らない」**

- 自分の理解できる範囲の最速を知ることが大切

※ 投稿者の意見:  自分の理解できる最速を上げる訓練も大切かも

## 速度の使い分け

- 速い読み方 : 　情報を見つける
- 遅い読み方 : 　頭の中で知識を組み立てる(既存の知識と組み合わせる)

## 読書術の紹介

- 同じトピックの本を複数同時に読み進める
→ 予期しない知識の結合が出来るかもしれない
NVL関数について

##はじめに
とあるJavaソースを確認していた時に発見した「nvl」。
なんかみたことあるけどどういう意味だっけ？と思ったのでメモ。
##NVLとは
JAVAというよりも、SQLで見ることが多いのかなと思います。
この関数のまず構文を確認します。（ORACLEの場合）

```
NVL(AAAA,BBBB)
```

意味としては
・AAAAがNULLだった場合に、BBBBを返します。
・AAAAがNULLではない場合は、AAAAを返します。
となるようです。
##おわり
調べているとJavaで使用している例があまりないように見られます。
Javaだと別の方法を使うことが多いのでしょうか？
この件、アドバイスいただけると幸いです。
最後までご覧いただきありがとうございます。
Node.jsで巨大なファイルを読み込む場合

Node.jsでファイルを読み込む場合、以下のようなコードを書く。


```txt:list.txt
りんご
ごりら
らっぱ
```

```js
const fs = require("fs");
const text = fs.readFileSync("list.txt");
```

readFileSyncは関数実行時にファイル全量を読み取りメモリに展開するので、list.txtがPCのメモリより巨大なファイルの場合にメモリエラーとなってプログラムが落ちる。

createReadStreamで小分けにして少しずつ読みだすことでメモリエラーを防げる。

```js
const fs = require("fs");

const stream = fs.createReadStream("list.txt", {highWaterMark: 1024});

stream.on("data", (chunk) => {
  console.log(chunk.toString("utf8"));
});
```