OmniAICreator/Qiita-1.07M huggingface dataset:
express-generator-typescriptで、npm start:devができないとき

## express-generator-typescriptとは？
express-generatorをTypeScriptで構築済みでなおかつ認証機能もついているという大変便利なものです。
[GitHub](https://github.com/seanpmaxwell/express-generator-typescript)
[npm](https://www.npmjs.com/package/express-generator-typescript)

## 問題点
初期状態で、`npm start`や`npm start:dev`を実行したら、以下のようなエラーが出ます。

```
SyntaxError: Unexpected token } in JSON at position 573
    at JSON.parse (<anonymous>)
    at parse (/hoge/node_modules/tsconfig/src/tsconfig.ts:195:15)
    at readFileSync (/hoge/node_modules/tsconfig/src/tsconfig.ts:181:10)
    at Object.loadSync (/hoge/node_modules/tsconfig/src/tsconfig.ts:151:18)
    at readConfig (/hoge/node_modules/ts-node/src/index.ts:425:18)
    at Object.register (/hoge/node_modules/ts-node/src/index.ts:189:18)
    at Object.<anonymous> (/hoge/node_modules/ts-node/src/_bin.ts:140:17)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
```
## 対応方法
一見するとライブラリのエラーなので、どうしようももなさそうですが、問題は、`tsconfig.json`の中にあります。
不要な末尾に対するカンマがあったため、エラーが出たようです。

```json:tsconfig.json 
/** 省略  **/
      "paths": {
        "@daos/*": [
          "src/daos/*"
        ],
        "@entities/*": [
          "src/entities/*"
        ],
        "@shared/*": [
          "src/shared/*"
        ],
        "@server": [
          "src/Server"
        ]
      },←このカンマを削除する
    },
    "include": [
      "src/**/*.ts",
      "spec/**/*.ts"
    ],
    "exclude": [
      "src/public/"
    ]
  }
```

## 最後に
もうしかしたら、私の環境だけこうなっている可能性と英語力に自信がないので、Issuesに報告しようか迷っています。
しかし、この記事がきっかけで、express-generator-typescriptの利用を諦めていた人が救われたら幸いです。。
Obsidian 随便说2句

偶尔用过 Obsidian，还没培养起来用 Obsidian的习惯。

网站：https://obsidian.md/ ，是个文档管理工具。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/5496462d-3cc6-dd8f-e327-dfdb7b19bd8e.png)


Obsidian 集成了很多插件，间歇日记就是1个插件。
关于什么是间歇日记，请戳 https://sspai.com/post/63674 


Obsidian导入文档，支持很多应用的格式，比如Roam research。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/41b2d2ad-7531-3f92-416d-f2fadb33226e.png)


ta可开启关系图谱，本人用Obsidian记录的内容非常少，所以不好看。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/ce786fe8-6989-adf1-7f7b-d1d4815dc038.png)


ta把文件保存在本地， 不过你可以通过注册保存到ta的服务器上。Obsidian 也有方法用git的方式管理文档，然后推送到github 。


也推荐大家使用wolai，2020年融资了大笔钱，可以让我安心用了，国内版的 https://www.notion.so/ ，邀请链接 https://www.wolai.com/signup?invitation=SZSP4CM

---


https://github.com/ObsidianLabs/EthereumStudio/  是个 eth IDE

https://obsidian.md/ 是个文档管理工具 

名字基本一样，但这2个是完全不一样的工具 ！！！
target = "_blank"の脆弱性について

#はじめに
オリジナルポートフォリオ作成でビューに苦戦しており、スクールで一番最初に学習したHTML・CSSが抜けている事に気付きました。


スクール同期から「スクールの学習に補う形でドットインストールをいいですよ！」と勧めて頂いたので学習し始めました。

そこでスクールでは学習しなかった知識があったのでアウトプットしていきます。

#target = "_blank" ページを別タブで開く

文字をクリックしたら別のページに遷移させたいとします。

その場合、以下のように`aタグ`と`href属性`を以下のように記述します。

```.html
<p>私のマイページは「<a href="https://qiita.com/N396184501">こちら</a>」です！</p>
```

「こちら」をクリックしたらqiitaのマイページに遷移する事ができます。

[参考](https://techacademy.jp/magazine/27428)
>aタグは、リンク＝次のページ・コンテンツへつながるドアのようなもので、
ドアの先の行き先がhref属性となります。


ページの遷移を仕方で別のタブを開いてページを遷移させたい場合は `target="_blank"`を使用します。

```.html
<p>私のマイページは「<a href="https://qiita.com/N396184501" target="_blank">こちら</a>」です！</p>
```

aタグの中に組み込む事で別のページに遷移する事ができます。

target="_blank について深掘りしていくと脆弱性があり、使うのはよろしくないとの記事がありました。


「web.dev」というGoogleが開発しているwebサイトのパフォーマンスを分析できるサイトに記載されておりました。

https://web.dev/external-anchors-use-rel-noopener/

和訳すると、


>target="_blank "属性を使って他のサイトのページにリンクすると、サイトのパフォーマンスやセキュリティ上の問題が発生する可能性があります。

>target="_blank "リンクにrel="noopener "またはrel="noreferrer "を追加することで、これらの問題を回避することができます。

```.html
<p>私のマイページは「<a href="https://qiita.com/N396184501" target="_blank" rel="noopnener">こちら</a>」です！</p>
```
`rel="noopnener`をつける事で改善されるようです。

#最後に
スクールで学習した以外にもまだまだ学ぶ事があるという事が分かりました。
また今回でカリキュラムに書いてある事を使うのではなく、調べる大切さを知りました。
SQL入門①〜レコードとカラムのデータを取得〜

#はじめに
今回は、SQLの基礎的な部分を学習したので、その内容をまとめていきます。
ボリュームが多くなってしまったので、何段階かに分けて、投稿していきます。
いつもお世話になっている、山浦さんの動画を参考に学習していきました。
[【SQL入門講座 合併版】SQLの基本をたった1時間で学べます【初心者向けデータベース入門】](https://www.youtube.com/watch?v=v-Mb2voyTbc)
#SQLとは
データベースに保存したデータを、操作する際に使用する言語。
#SQLでできること
・カラム操作(データの取得、更新、削除)
・レコード操作(データの取得、削除、更新、保管)
・テーブル操作(テーブルの作成、削除、更新)

#SQLを書く上でのポイント
✅SELECTなどの予約語は**大文字**で表記する(小文字でもエラーは出ない)
　→予約語とカラム・テーブル名の違いをわかりやすくするため
　→エラーの減らす
✅複数の予約語を使用するときは、適度に**インデント・改行**をいれる
 　→エラーを減らすため
 　→可読性が上がる
✅データ数に応じて、LIMITやSELECTで取得するデータを**制限する**
 　→処理が早くなる

#テーブル操作

##テーブルを取得する(FROM)

```
FROM テーブル名;
```
#カラム操作

## カラムのデータを取得する(SELECT)

```
SELECT
  カラム名 
FROM
  テーブル名;
```

##カラム名を変更して、取得(AS)

```
SELECT 
  カラム名 
AS  
  '変更するカラム名'
FROM 
  テーブル名; 
```

##全件取得(*)

```
SELECT 
  * 
FROM 
  テーブル名;
```

## 重複したデータを取り除いたデータを取得

```
SELECT 
  DISTINCT(カラム名)
FROM
  テーブル名;
```

##条件を指定してカラムのデータを取得する(WHERE)

```
SELECT 
  カラム名 
FROM 
  テーブル名 
WHERE 
  条件;
```
##複数の条件を指定してデータを取得する(AND)

```
SELECT 
  *
FROM 
  テーブル名　
WHERE 
  条件 AND 条件;
```
##同カラム内でまとめて指定してデータを取得する(IN)

```
SELECT 
  *
FROM 
  テーブル名　
WHERE 
  カラム名　IN(条件,条件);
```
##同カラム内で複数の条件に当てはまらないデータを取得する(NOT IN)

```
SELECT 
  *
FROM 
  テーブル名　
WHERE 
  カラム名　NOT IN(条件,条件);
```


##どちらかの条件を満たすデータを取得する(OR)

```
SELECT 
  *
FROM 
  テーブル名　
WHERE 
  条件 OR 条件;
```

##範囲を指定したデータを取得する(AND)

```
SELECT 
  *
FROM 
  テーブル名　
WHERE 
  カラム名　BETWEEN 条件 AND 条件;
```
##〇〇から始まるデータを取得(LIKE)

```
SELECT 
  *
FROM 
  テーブル名　
WHERE
 カラム名　LIKE 〇〇%;
```

##〇〇で終わるデータを取得

```
SELECT 
  *
FROM 
  テーブル名　
WHERE 
  カラム名　LIKE %〇〇;
```

##nullのデータを取得(IS NULL)

```
SELECT 
  *
FROM 
  テーブル名　
WHERE 
  カラム名　IS NULL;
```

##nullじゃないデータを取得(IS NOT NULL)

```
SELECT 
  *
FROM 
  テーブル名　
WHERE 
  カラム名　IS NOT NULL;
```

#レコードの操作

##レコード数を指定して取得する(LIMIT)
レコードの件数が多い時に使用すると便利

```
SELECT 
  *
FROM 
  テーブル名　
LIMIT 
  レコード数;
```

##レコードを昇順で並び替える(ORDER BY)

```
 SELECT 
  *
FROM 
  テーブル名 ORDER BY カラム名;
```

##レコードを降順で並び替える(ORDER BY DESC)

```
SELECT 
  *
FROM 
  テーブル名 ORDER BY カラム名 DESC;
```

#(補足)RailsでのDB操作

##DBを起動

```
rail db
```

##テーブルを全て取得

```
.table(s)
```

#まとめ
・簡単ではありましたが、カラム・レコードのデータを操作する方法について、学習していきました。
この学習を通して、少しはSQLに対しての苦手意識がなくなったかなと感じています。
次回もSQLについて学習したことをまとめていこうと思いますので、よければそちらも読んでいただけると嬉しいです。
[次回の記事](https://qiita.com/takumi73/items/6799aad92c48e533350a)

#参考文献
[SQLでできることとは？イチから学ぶデータベース操作【初心者向け】](https://goworkship.com/magazine/what_sql_can_do/)
[【Rails】最初に必要なSQL操作](https://qiita.com/Hal_mai/items/5441c2b625debde8cdbf)
[[SQL]インデントを正しく効果的に使おう](https://qiita.com/s_maeda_fukui/items/11c44206c69bc2780797)
docker-compose runでstandard_init_linux.go:219 原因と解決

#始めに
myappディレクトリ(各自アプリ名)を作成し、その配下に
Dockerfile
docker-compose.yml
Gemfile
Gemfile.lockを用意してあります。


#問題
```
$ docker-compose run web rails new . --force --no-deps --database=mysql --skip-test --webpacker
```
を実行すると、

```
standard_init_linux.go:219: exec user process caused: exec format error
```
のエラーが出て、新たにアプリが作成できない。

#解決
shebangが抜けていたことが原因だと分かった。
新たに、entrypoint.shファイルを作成し、

```entrypoint.sh
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
```
を記述。
再度、

```
$ docker-compose run web rails new . --force --no-deps --database=mysql --skip-test --webpacker
```
を実行し、無事にアプリが作成できた。
#参考記事
https://qiita.com/nsy_13/items/9fbc929f173984c30b5d
https://teratail.com/questions/170342
すれ違いやすい言葉

言葉は時代と共に徐々に本来の意味から別の意味へと変異していくのだけれども、
本来の意味と別の意味が共存している状態であるととてもすれ違いが起きやすい。
(それはもはや共存と言えるのかは置いといて）

実際会話してて　あれ？なんか変だな　と感じて調べてみたものを数点。

見切れる
-
舞台とか映像関係のお仕事をしている方々は
**見えてはダメなものが見えてしまっている**時に使う言葉
つまり邪魔なものを指す

集合写真とかを撮るときなどには
**収まるべき被写体がフレームに収まり切っていない**時によく耳にする
必要なものを指す

完全に真逆の意味を持ってしまっているので、両者が認識している意味が合致していないと面倒なことになる。

体感だけれども徐々に2つ目の意味合いが勝ってきてる気がする。


煮詰まる
-
会議とかで**煮詰まってきたから休憩にしよう**とか聞くけれども

**行き詰ってしまった**場合などによく耳にする。

本来は
**ほぼ結論がでた・でそうな状態**を指すそうで。

料理を思い浮かべると良いのだけれど、煮込み料理は**煮詰めて完成させる**んですよね。

これも1つ目の意味合いが勝ってきている気がする。

確信犯
-
TVなどでもよく「これは確信犯でしょ～」といったように使用されているけれども
**自分が行う事に対して、想像通りの結果が出ると確信した上で実行する**という意味合いですかね。

本来は
**自分が行うことは正しい確信して実行する**
という事らしいのです。

参考
https://www.bunka.go.jp/pr/publish/bunkachou_geppou/2012_05/series_10/series_10.html

これも本来の意味よりも1つ目の方が勝ってきてる気がする

ヌルヌル動く (追記
-
アニメでコマ数が多くて物凄く滑らかに動いて見える時によく言われる。
とある人の大学の授業では低評価の意味で使われていたらしい。
個人的には、コマ数が多くて滑らかに動いてスゲー！の意味で聞くことが多かったかな

---

こういった言い回しは使う側と受け取る側が同じ意味で認識してれば全く問題ないのだけど、
認識がズレてしまってると意味を知らないよりも面倒なことが起きてしまう。

舞台・映像関係の偉い人と集合写真撮るときに　○○さん、見切れてますよ！　なんて言ってしまうと・・・・

なので、個人的にはなるべく使わないようにしてます。
SQL - Enum型カラムのオプションの変更後にNULL許可になってしまう

## 問題

Enum型カラムのオプションの変更後にNULL許可になってしまいます。

例）
変更前のusersテーブル

|  Field  |  Type  | Length  | Allow Null |
| ---- | ---- | ---- | ---- |
|  id  |  BIGINT  | 20 | 許可しない |
|  name  |  VARCHAR  | 255 | 許可しない |
|  type  |  ENUM  | 'member','cancel' | 許可しない |

下記のSQLを実行

```sql
ALTER TABLE users MODIFY type ENUM ('member', 'cancel', 'recess')
```

変更後のusersテーブル

|  Field  |  Type  | Length  | Allow Null |
| ---- | ---- | ---- | ---- |
|  id  |  BIGINT  | 20 | 許可しない |
|  name  |  VARCHAR  | 255 | 許可しない |
|  type  |  ENUM  | 'member','cancel','recess' | 許可する |

変更後にtypeの部分がNULL許可になってしまいます。


## 解決方法

```sql
ALTER TABLE users MODIFY type ENUM ('member', 'cancel', 'recess') NOT NULL
```

## 参考

https://stackoverflow.com/questions/1501958/how-do-i-add-more-members-to-my-enum-type-column-in-mysql
🔰 [Kotlin] 基礎 androidstudioタッチイベント　勉強用メモ

参考書「作って楽しむプログラミング　Androidアプリ超入門」の勉強をまとめていきます。

####環境
java: 1.8.0_281
kotlin:1.5.10

今回は画面のタッチ処理についてまとめていきます

##タッチイベントの主な種類



| 操作名 | 概要 | 
|:-----------|:------------|
|タップ|画面を1度叩く|
|ダブルクリック|画面を2回続けて叩く|
|フリック|画面をスライドさせる|
|ピンチイン|２本の指でつまむようにする|
|ピンチアウト|2本の指で広げるようにする|

今回はタッチ処理についてなので、**onTouchEventメソッド**を使用する

##onTouchEventメソッドのイベント定数
| イベント定数 |イベントのタイミング| 
|:-----------|:------------|
|ACTION_DOWN|画面がタッチされた時|
|ACTION_MOVE|タッチしたまま移動した時|
|ACTION_UP|タッチが離された時|
|ACTION_CANCEL|何らかの要因でタッチがキャンセルされた時|

if文を使用した例

```sample.kt
override fun onTouchEvent(event: MotionEvent?): Boolean {
        //イベントを限定,actionプロパティの値で変更可能
        if (event?.action == MotionEvent.ACTION_DOWN){
            if (omikujiNumber < 0 && omikujiBox.finish) {
                drawResult()
            }
        }
        return super.onTouchEvent(event) //※
    }
```

**※** onTouchEventメソッドをAndroid Studioから作成した場合は、明示的に元のonTouchEventメソッドを実行する必要がある。
→スーパークラスであるActivityクラスの同メソッドをオーバーライドして使用した場合、他のタッチイベントが呼び出されなくなるだけでなく、他の処理が必要となってくる為。

whenを使用した例

``` sample.kt
    class MainActivity : Activity() {
        ...
        // This example shows an Activity, but you would use the same approach if
        // you were subclassing a View.
        override fun onTouchEvent(event: MotionEvent): Boolean {

            val action: Int = MotionEventCompat.getActionMasked(event)

            return when (action) {
                MotionEvent.ACTION_DOWN -> {
                    Log.d(DEBUG_TAG, "Action was DOWN")
                    true
                }
                MotionEvent.ACTION_MOVE -> {
                    Log.d(DEBUG_TAG, "Action was MOVE")
                    true
                }
                MotionEvent.ACTION_UP -> {
                    Log.d(DEBUG_TAG, "Action was UP")
                    true
                }
                MotionEvent.ACTION_CANCEL -> {
                    Log.d(DEBUG_TAG, "Action was CANCEL")
                    true
                }
                MotionEvent.ACTION_OUTSIDE -> {
                    Log.d(DEBUG_TAG, "Movement occurred outside bounds of current screen element")
                    true
                }
                else -> super.onTouchEvent(event)
            }
        }
    }
    
```

参考：https://developer.android.com/training/gestures/detector?hl=ja
Spacemacsでスクロールバーの表示をOFFにする

Spacemacsでスクロールをしたときに一定時間だけスクロールバーが表示される。
スクロールバーが非表示になる際に画面がチラつくのでこの挙動をOFFにする


## 方法
下記の `dotspacemacs-scroll-bar-while-scrolling` オプションに `nil` を設定する

```elisp
   ;; Show the scroll bar while scrolling. The auto hide time can be configured
   ;; by setting this variable to a number. (default t)
   dotspacemacs-scroll-bar-while-scrolling nil
```

`SPC f e R` による設定ファイル再読み込みでは挙動が切り替わらず、spacemacsを再起動することで設定が有効化された。

## 参考
https://emacs.stackexchange.com/questions/64826/how-can-i-stop-my-scrollbar-bouncing-into-and-out-of-existence
replaceコマンドを用意しよう

# はじめに
PHPerにはsedの正規表現は性に合わないから最近はどのOSにもPerl入ってるってことで、ファイルの文字列置換にはperlを使うんですが、いつもオプションを忘れて毎回ググってるんですよね。。
ってことでreplaceをaliasに登録しておきましょう。

```bash:~/.bash_profile(.zprofile)
alias replace='perl -pi -e'
```
# 実行例
```bash
replace 's/localhost/db/g' config/database.yml
```

# おわりに
Windowsにはreplaceコマンドってのがあったんですね。使ったことないけど。
[記事紹介] ドメインの最大長はわかったけど、ぶっちゃけ普通の長さが知りたいので調べてみた

@qualitia_cdevの中の一人、@hirachanさんが書いた記事をみなさまにご紹介します。


### ドメインの最大長はわかったけど、ぶっちゃけ普通の長さが知りたいので調べてみた

https://qiita.com/hirachan/items/d6c7c61696f064b561a4
【CentOS7】画面の解像度の変更

# 環境
* 仮想マシンでCentOS7

# 手順
## １．/etc/default/grubの変更
`vi /etc/default/grub`で編集する
7行目の`quiet`の後ろに`vga=数値`を入れる(例として792を入れいている)

```:変更前
1 GRUB_TIMEOUT=5
2 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
3 GRUB_DEFAULT=saved
4 GRUB_DISABLE_SUBMENU=true
5 GRUB_TERMINAL_OUTPUT="console"
6 GRUB_CMDLINE_LINUX="spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
7 GRUB_DISABLE_RECOVERY="true"
```
```:変更後
1 GRUB_TIMEOUT=5
2 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
3 GRUB_DEFAULT=saved
4 GRUB_DISABLE_SUBMENU=true
5 GRUB_TERMINAL_OUTPUT="console"
6 GRUB_CMDLINE_LINUX="spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet vga=792"
7 GRUB_DISABLE_RECOVERY="true"
```
※行数は:set numberで表示可能

### 数値の決め方
| bit | 640 x480 | 800 x600	| 1024 x768	| 1280 x1024|1400 x1050|1600 x1200|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| 8  | 769  | 771  |  773 | 775  |  835 |  796 |
| 15  | 784  | 787  | 790  |  793 |  - |  797 |
| 16  | 785  | 788  | 791  | 794  |  837 |  798 |
| 24 | 786  | 789  | 792  | 795  |  838 |  799 |
| 32  | 809  | 814  | 824  | 829  |  - | 834  |

## ２．変更後に以下を実行する
```
# grub2-mkconfig -o /boot/grub2/grub.cfg
# reboot
```

# 参考サイト
* https://bit.ly/3cnfji9
* https://www.storange.jp/2017/03/centos-7.html
VBA エクセル サイトから情報を自動取得

サイトからデータを自動取得

|A列|B列|C列|D列|E列|F列|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|h4要素|1番目のtd要素|2番目のtd要素|3番目のtd要素|4番目のtd要素|更新日|

```vb
Sub GetDataList()

    'オブジェクト変数にIEへの参照を格納する
    Dim ieApp As InternetExplorer
    Set ieApp = New InternetExplorer
    ieApp.Visible = True 'IEのウィンドウを表示
    
    'ページを繊維完了するまで待つ
    ieApp.navigate "https://excel23.com/vbaweb/"
    Do While ieApp.Busy = True Or ieApp.readyState < READYSTATE_COMPLETE
        DoEvents
    Loop
    
    'HTMLDocumentオブジェクトを取得
    Dim doc As HTMLDocument
    Set doc = ieApp.document
    
    'listクラスの要素の個数を取得
    Dim listLen As Long
    listLen = doc.getElementsByClassName("list").Length
    
    'listクラスを0番目から順に変数に取得
    Dim i As Long
    For i = 0 To listLen - 1
        Dim el As IHTMLElement
        Set el = doc.getElementsByClassName("list")(i)
        
        'h4要素のテキストを取得
        Cells(i + 2, 1).Value = el.getElementsByTagName("h4")(0).innerText
        
        'td要素のテキストを取得
        Cells(i + 2, 2).Value = el.getElementsByTagName("td")(0).innerText
        
        Cells(i + 2, 3).Value = el.getElementsByTagName("td")(1).innerText
        
        Cells(i + 2, 4).Value = el.getElementsByTagName("td")(2).innerText
        
        Cells(i + 2, 5).Value = el.getElementsByTagName("td")(3).innerText
        
        '更新日のテキストを取得
        Dim str As String
        
        str = el.getElementsByClassName("date")(0).innerText
        
        str = Right(str, Len(str) - 4)
        
        Cells(i + 2, 6).Value = str
        
    Next i
    
    Set doc = Nothing
    
    ieApp.Quit
    
    Set ieApp = Nothing
    
    
End Sub

```
WindowsでDjango + WeasyPrintの環境構築する

# はじめに

mac、EC2上でDjango + WeasyPrintの環境を動かしてたのですが、今回Windows10上で開発環境を構築することになったのでメモとして残します。

### そのときの環境

- Python 3.8.2
- Django 2.2.11
- WeasyPrint 52.5
- gtk3-runtime-3.24.29-2021-04-29-ts-win64.exe


# WeasyPrintとは
PDF および PNG にエクスポートできる HTML および CSS の視覚的なレンダリングエンジンです。これは、印刷用の Web 標準をサポートすることを目的としています。WeasyPrint は、BSDライセンスの下で利用可能なフリーソフトウェアです。


# WeasyPrintを動かすための準備を行います。

```powershell
> pip install --upgrade pip setuptools
```

# WeasyPrintをインストールします。

```powershell
> pip install WeasyPrint
```

# GTK+ 64 Bit Installerをインストールします。
最新のこの [gtk3-runtime-x.x.x-x-x-x-ts-win64.exe](https://github.com/tschoonj/GTK-for-Windows-Runtime-Environment-Installer) をダウンロードします。

ダウンロードしたら`gtk3-runtime-x.x.x-x-x-x-ts-win64.exe`を実行しインストールします。

# WeasyPrintを実行します。

無事インストールできたら、WeasyPrintが実行できるか試します。ここでpdfが出来れば開発環境の構築は終わりです。

```powershell
> weasyprint http://weasyprint.org weasyprint.pdf
```

コマンドを実行したカレントフォルダにweasyprint.pdfが作成されます。


それでは、DjangoでEnjoyしましょう！！
request specでDRYなコードを書きましょう


# はじめに
Rspecを書き始めたばかりなのであまり詳しいことはかけませんが自分の備忘録として書いているので間違えている部分等あれば教えていただけると幸いです。

#そもそもRequest specってなに？
もともとRailsのcontrollerをテストする際にはRails4までのバーションだとController specが用いられてましたがRails5以降になるとそれらが非推奨となりRequest specで書くことが推奨されるようになりました。

要するにcontollerに書くテストを書けばいい！！と私は思います
Railsガイドによるとコントローラの機能テストは

以下引用
> 
 Webリクエストが成功したか
 正しいページにリダイレクトされたか
 ユーザ認証が成功したか
 レスポンスのテンプレートに正しいオブジェクトが保存されたか
 ビューに表示されたメッセージは適切か
>

このようになっています。上記を参考にRequest specを書いていきましょう

# 本題
それでは上記を参考にDRYなコードを書いていきましょう！！

###待った！！DRYってなに！？！？
ってなった方もいると思います。僕もそうでした。
DRYというのはDRY原則と言ってWebフレームワークRuby on Railsが基本理念としの一つとして採用している開発原則です。簡単にいうとコードを重複させないという意味です。
難しい事はここでは省きますがrequest specを下記に書いていくのでそこで雰囲気だけ掴んでいってください！

###例１ HTTPレスポンスコードが200かどうかを判定する場合

```

require 'rails_helper'

Rspec.describe 'Qiita', type: :request do
  describe 'GET Qiita index' do
   it 'statusが200であること'
    get qiita_path
    expect(response).to have_http_status(200) 
   end
  end

 describe 'GET Qiita new' do
   it 'statusが200であること' do
    get new_qiita_path 
    expect(response).to have_http_status(200)
   end   
 end
end
```
例ですが上記のようなコードがあった場合、indexとnewで重複している場所があります。
このような場合にDRYに書くことができます。

## DRYに書いた場合

```
require 'rails_helper'

shared_examples 'statusが200であること' do
  it 'statusが200であること' do
    expect(response).to have_http_status(200)
  end
end 

Rspec.describe 'Qiita', type: :request do
  describe 'GET Qiita index' do
    get qiita_path
    it_behaves_like 'statusが200であること' 
  end

 describe 'GET Qiita new' do
    get new_qiita_path 
    it_behaves_like 'statusが200であること'  
 end
end
```

これだけで圧倒的にみやすくなりました。ここででできたshared_examplesとit_behaves_likeは何かというとshared_examplesを利用してコードを共有しit_behaves_likeでそれを呼び出すと言ったものです。

詳しい説明は下記に記事を貼るのでそこから参照してください！



# 参考にした記事
https://railsguides.jp/testing.html#%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%81%AE%E6%A9%9F%E8%83%BD%E3%83%86%E3%82%B9%E3%83%88

http://samurai.ataglance.jp/rspec_shared_examples/
テザリング利用時の IP をセキュリティグループに登録

### 前提
テザリングを利用していると、 ifconfig 等で調べたアドレスとSSHで利用するIPアドレスが異なる場合があるらしい。
外で作業しているとき、セキュリティグループにIPを追加してサーバーにSSH接続したい場合がよくあるので作業を簡略化した。


### どうやるか
- 以下をターミナルで実行

```sh
#!/bin/sh

IP=`curl -s https://www.cman.jp/network/support/go_access.cgi | ggrep -oP '<div class="outIp".*?</div>' | sed 's#<div class="outIp">\(.*\)</div>#\1#'`
SECURITY_GROUP_NAME='YOUR_SECURITY_GROUP_NAME'

echo ${IP}

aws ec2 authorize-security-group-ingress --group-name ${SECURITY_GROUP_NAME} --port 22 --protocol tcp --cidr ${IP}/32
```



### 参考
https://qiita.com/katsumata_ryo/items/11df52e498c7b795174f
[小ネタ] DockerでlocalDynamoDB起動する時の注意点

# この記事に関して

Qiitaの[3000文字Tips企画](https://qiita.com/official-events/d523df99d6479293ffa7)の投稿記事になります。

# DynamoDBLocal起動時エラー

[AWS公式ページ](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBLocal.DownloadingAndRunning.html)

のDockerタブにあるdocker-comose.ymlを使用する手順通りに実行すると以下のようなエラーが出るケースがあると思います（2021年6月7日時点）。遠くない未来に、コンテナ本体か手順のどちらかが修正されるとは思います。

```console
Starting dynamodb-local ... done
Starting app-test       ... done
Attaching to dynamodb-local
dynamodb-local | Initializing DynamoDB Local with the following configuration:
dynamodb-local | Port:	8000
dynamodb-local | InMemory:	false
dynamodb-local | DbPath:	/home/dynamodblocal/data
dynamodb-local | SharedDb:	true
dynamodb-local | shouldDelayTransientStatuses:	false
dynamodb-local | CorsParams:	*
dynamodb-local | 
dynamodb-local | Jun 07, 2021 1:25:32 AM com.almworks.sqlite4java.Internal log
dynamodb-local | WARNING: [sqlite] cannot open DB[1]: com.almworks.sqlite4java.SQLiteException: [14] unable to open database file
dynamodb-local | Jun 07, 2021 1:25:32 AM com.almworks.sqlite4java.Internal log
dynamodb-local | SEVERE: [sqlite] SQLiteQueue[shared-local-instance.db]: error running job queue
dynamodb-local | com.almworks.sqlite4java.SQLiteException: [14] unable to open database file
dynamodb-local | 	at com.almworks.sqlite4java.SQLiteConnection.open0(SQLiteConnection.java:1480)
dynamodb-local | 	at com.almworks.sqlite4java.SQLiteConnection.open(SQLiteConnection.java:282)
dynamodb-local | 	at com.almworks.sqlite4java.SQLiteConnection.open(SQLiteConnection.java:293)
dynamodb-local | 	at com.almworks.sqlite4java.SQLiteQueue.openConnection(SQLiteQueue.java:464)
dynamodb-local | 	at com.almworks.sqlite4java.SQLiteQueue.queueFunction(SQLiteQueue.java:641)
dynamodb-local | 	at com.almworks.sqlite4java.SQLiteQueue.runQueue(SQLiteQueue.java:623)
dynamodb-local | 	at com.almworks.sqlite4java.SQLiteQueue.access$000(SQLiteQueue.java:77)
dynamodb-local | 	at com.almworks.sqlite4java.SQLiteQueue$1.run(SQLiteQueue.java:205)
dynamodb-local | 	at java.lang.Thread.run(Thread.java:748)
```

# 対応方法

コンテナ内部では、dynamodblocalというユーザーで処理されているので、そのフォルダに書き込み出来たりする権限が必要です。
標準のdocker-compose.ymlのままいくなら、docker-comose.ymlがあるフォルダで、以下のコマンドで権限振りましょう。起動前ならフォルダ作成もしておきましょう。

```bash:
mkdir -p ./docker/dynamodb # docker-compose起動前でフォルダ出来てない時に実行
sudo chmod 777 ./docker/dynamodb # 上記状況で、通常ユーザーでフォルダ作ったならsudoはいらない
```
【論文紹介】Affecting Tumbler: Affecting our flavor perception with thermal feedback

#論文紹介
論文：Affecting Tumbler: Affecting our flavor perception with thermal feedback
著者：Chie Suzuki, Takuji Narumi, Tomohiro Tanikawa, Michitaka Hirose
https://dl.acm.org/doi/pdf/10.1145/2663806.2663825

#どんなもの
　食べ物を口に入れるときに鼻周辺に温度変化を起こすことで、食味認知に影響を与える手法の提案。
→鼻周辺の皮膚を加温したときに食味を強く感じて、食味の心地よさが向上する

#先行研究と比較してすごいところ
　(人によって「おいしい」と感じるのは異なるが、生理反応は共通してあると示した研究で、)生理的変化を疑似的に再現することで、食味認知に影響を与えることができる手法を開発した。
　<font color="gray">生理的変化：おいしいと感じた時には鼻周辺の皮膚温度が上がって、おいしくないと感じた時には温度が下がる</font>

#技術や手法のキモ
　紙コップにつけるホルダー型のAffecting Tumbler
　ペルチェ素子を利用して、温度変化を行う。Affecting Tumblerにセンサーを取り付けて室温と鼻が近づく部分の温度を測る。

#検証方法
<font color="gray">〇飲むときに鼻周辺に冷温覚を提示するAffecting Tumblerの実装
　被験者にAffecting Tumblerを用いて水を一口飲んでもらい、サーモカメラを用いて飲む前の鼻の温度と飲んだ後の鼻の温度の変化を計測。
　温度計測結果に対して二要因分散分析を行った。
　→温度変化の仕方に差は見られない。提示した温度条件の違いによって皮膚温度変化に有意な差が見られた。</font>

<font color="gray">〇鼻周辺へ冷温覚提示による食味認知変化に関する評価実験
　被験者はAffecting Tumblerにリンゴジュースとオレンジジュースを入れて飲み比べて評価する。
　味の濃さと後味の強さ、主観的なおいしさ(個人的な好みを聞くため)、味の快・不快の評価、うま味以外の４つの基本味の質問を評価する。</font>

〇実験手順
　ジュースを入れた２つのAffecting Tumblerを置き、それを被験者に飲み比べてもらう。その食味を評価するアンケートに答えてもらう。
<font color="gray">→味の濃さ：リンゴジュースもオレンジジュースも加温条件において最も味を濃く感じた。
　(加温条件→常温条件→冷却条件)
　後味の強さ：オレンジジュースは加温条件のほうが後味を強く感じる。
　おいしさに対する評価：冷却状態において最もおいしく感じる。
　すべての比較においてオレンジジュースのほうがおいしいと感じる人が多い　
　快・不快に対する評価：どっちも加温条件→常温条件→冷却条件の順で心地いい
　甘味・塩味・酸味：温度提示による違いなし
　苦味：リンゴジュースでは、加温条件は優位に苦味が軽減される</font>
　
→ジュースを飲むときに鼻周辺の皮膚を加温すると食味の心地よさ・食味の濃さが向上し、冷却すると心地よさ・食味の濃さのが減少する

#議論
　鼻周辺の温度提示とジュースの温度差を感じさせない方法はないのか。
　時間を開けて試行したほうがよかったのでは？

#気になった論文
 食卓へのプロジェクションマッピングによる食の知覚と認知の変容
Laravelしくじり先生その1『（型宣言を）「ガチガチにやらなきゃモチモチにならない」と言ったな。あれはやり過ぎ注意だ。』

久々にQiita投稿します。

#前提
- Laravel Valetで開発環境を構築しています（Docker不使用）
- Laravel 8.41.0
- PHP 8.0.5
- Nginx 1.19.10
- macOS Big Sur 11.4
- リクエストしたらテキストをレスポンスボディとして返すAPIを作っています

# 「どうして」となったコード
```php:HogeController.php
<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class HogeController extends Controller
{
    public function fuga(Request $request): string
    {
        return response('OK')->header('Content-Type', 'text/plain');
    }
}
```
と書いたらレスポンスが下記のようになりました。
```bash
% curl https://example.test/api/hoge/fuga
HTTP/1.1 200 OK
OK
```
どうしてHTTPヘッダーもレスポンスに混じっているんですかねぇ🤔

# これが正解

```php:HogeController.php
<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Response;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class HogeController extends Controller
{
    public function fuga(Request $request): Response
    {
        return response('OK')->header('Content-Type', 'text/plain');
    }
}
```
Illuminate\Http\Response
を戻り値の型宣言にしたら
```bash
% curl https://example.test/api/hoge/fuga
OK
```
期待通りstringだけのレスポンスが返ってきました👍

# 結局
「stringを返すからstringで型宣言だな！」という短絡的な思い込みは良くないですね。

# 最後に
マサカリ大歓迎です。
よろしければ、**LGTM**ボタンを押して行ってくださいね🌟

# 見出しの出典
https://www.tv-asahi.co.jp/shikujiri/

https://dic.nicovideo.jp/a/parim%40s
CloudFormationで別アカウントのリソースをパラメータで受け取る際にやるべきこと



# 何をするべきか

最初に結論。クロスアカウントのリソースをパラメータで受け取る際には、CloudFormationテンプレートのパラメータのタイプを`String`, `CommaDelimitedList`のどちらかにする必要がある。

```yaml
Parameters:
  VPC:
    Type: String

  SecurityGroups:
    Type: CommaDelimitedList
```

# なぜStringなどしか指定できないのか

CloudFormationテンプレートのパラメータとしてVPCやSecurityGroupを受け取ろうとした場合、下記のように書くことが多い。

```yaml
Parameters:
  VPC:
    Type: AWS::EC2::VPC::Id

  SecurityGroups:
    Type: List<AWS::EC2::SecurityGroup::Id>
```

単一アカウント上のリソースをパラメータに渡す際は上記がベストなのだが、**クロスアカウントでリソースを参照しようとした場合、これではデプロイできない**。

実際に、上記のようなCloudFormationテンプレートを用意して、デプロイ時のパラメータに別アカウントのリソースを入力した場合、下記エラーが発生してしまう。

```
Parameter validation failed: parameter value xxxx for parameter name yyy does not exists.
```

CloudFormation はデプロイ前に入力値と指定されたパラメータタイプが一致しているかなどのバリデーションを実施してくれる。
この際、パラメータに**AWS固有パラメータを指定していた場合は、対象のリソースが存在するかを確認してくれる**のだが、ここで指定されたリソースが存在しないと判断された場合は、上記エラーが報告される。

「別アカウントには存在するリソースなのに、なぜないと判断されるのか」と考えそうになるが、そもそもあるアカウント上から許可なく別アカウントのリソースの存在有無を確認できたらおかしい。
なので、CloudFormationは**実行されたアカウント内に対象のリソースが存在するかどうかを確認する**。

そのため、クロスアカウントでリソースを参照する場合は、パラメータタイプにAWS固有パラメータ（`AWS::EC2::VPC::Id`など）は指定できない。
代わりに、**`String`か`CommaDelimitedList`を利用する必要がある**。

なお、この話はしっかりとAWS公式のドキュメントに記載されている。

> テンプレートユーザーが異なる AWS アカウントからの入力値を入力できるようにする場合は、AWS 固有のタイプでパラメータを定義することはできません。代わりに、String タイプ (または CommaDelimitedList) タイプのパラメータを定義してください。

[パラメータ - CloudFormation](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html#aws-specific-parameter-types)

# 結論

CloudFormationのパラメータバリデーションは、単一アカウントのみであればとても助かる機能であり、パラメータの入力ミスを減らしてくれる。
しかし、クロスアカウントでリソース参照する場合には使うことができないので、下記のようにする必要がある。

**修正前**

```yaml
Parameters:
  VPC:
    Type: AWS::EC2::VPC::Id

  SecurityGroups:
    Type: List<AWS::EC2::SecurityGroup::Id>
```

**修正後**

```yaml
Parameters:
  VPC:
    Type: String

  SecurityGroups:
    Type: CommaDelimitedList
```
Seleniumを使ってe-typingを自動化した ①準備編


## はじめに

プログラミングアカデミーというyoutubeチャンネルの以下の動画で、seleniumという自動化ツールを使用して「寿司打」というタイピングゲームを自動化しているのを見て 「面白そう！」　と思ったので自分なりにやってみました！

https://www.youtube.com/watch?v=1KOAwXTGpdo

この動画ではみんな知ってる「寿司打」 を自動化しているのですが、僕は以前からタインピング練習で使っていた「e-typing」というタイピングゲームを自動化してみました。


## Seleniumについて

Seleniumとは、ブラウザー自動化を可能にし、それを支えるツール群とライブラリー群のプロジェクトです。
自動化テスト等でよく使われています。
自動でブラウザを操作する処理の流れは以下の通りです。

<pre>ブラウザを操作するコードを言語に対応するseleniumライブラリが読み取る。
↓
seleniumライブラリが各ブラウザのDriverへ処理を伝える。
↓
Driverがブラウザを操作する</pre>



よって、使用する言語に対応するseleniumライブラリ及び使用するブラウザ用のdriverをインストールする必要があります。

## 準備

### seleniumライブラリのインストール
今回はプログラミング言語にJavaScriptを使用した為、Seleniumライブラリのインストールはnpmを使います。

```bash
$ npm install selenium-webdriver
```

### Driverのダウンロード
今回はChromeを使用する為、ChromeDriverをダウンロードします。

以下のサイトからChromeのバージョンにあったChromedriverをダウンロードします。

https://sites.google.com/a/chromium.org/chromedriver/downloads

※Chromeのバージョンはブラウザの設定の「Chromeについて」　で確認できます。
![スクリーンショット 2021-06-05 13.16.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497827/f30849b7-baee-1229-4231-d95598b6c51e.png)

ダウンロードが完了したら、chromedriverをパスの通っているディレクトリ配下に置く。

```bash
# 以下のコマンドを実行した際に出力されるディレクトリがパスの通っているディレクトリになります。
$ echo $PATH
```
※ 今回は/usr/local/binに設置しました。 
これで準備は完了です!

## まとめ
今回は環境の準備を行いました！　
実装編の記事ものちのち書いていきます！


公式ドキュメント

https://www.selenium.dev/documentation/ja/
Google App Script で行数が多い行の高さを指定する

リファレンスを見ると、[setRowHeight(rowPosition, height)](https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#setRowHeight(Integer,Integer)) で出来そうなのですが、このメソッドは行数が指定した高さより多い場合には期待通りに動きませんでした。行数が多い場合、行の高さを「データに合わせる」設定に変更されてしまうようです。

setColumnWidth は文字数に関係なく幅が固定値で指定できるのに…。

他の方法を探していたら Stack Over flow に答えがありました。

https://stackoverflow.com/questions/64098358/google-sheets-apps-script-setrowheight-with-text-inside-cell

# Sheets API を有効にする
https://developers.google.com/apps-script/guides/services/advanced#enabling_advanced_services

GAS の 左側メニュー `< >` のエディタをクリックして、サービスの `+` をクリックします。
サービスを追加から `Google Sheets API` を選択し、追加します。

![スクリーンショット 2021-06-07 9.51.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206323/f0203878-50a5-780b-4364-ddab326dff58.png)

# サンプルスクリプト
このサンプルは、2行目の高さを5pixelに変換します。

```javascript
function myFunction() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("Sheet1");  // Please set the sheet name.

  const requests = {updateDimensionProperties: {
    properties: {pixelSize: 5},
    range: {sheetId: sheet.getSheetId(), startIndex: 1, endIndex: 2, dimension: "ROWS"},
    fields: "pixelSize"
  }};
  Sheets.Spreadsheets.batchUpdate({requests: requests}, ss.getId());
}
```

endIndex オプションを渡さない場合、全行の高さを変換します。

- [UpdateDimensionPropertiesRequest](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#updatedimensionpropertiesrequest)
Elastic Beanstalkにmecabをインストール


ebextensionsに以下の設定ファイルを追加します。

```yaml:.ebextensions/mecab.config
commands:
  000_install_mecab:
    test: test ! -d mecab-0.996
    command: |
        wget 'https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE' -O mecab-0.996.tar.gz
        tar xzf mecab-0.996.tar.gz
        cd mecab-0.996
        ./configure
        make
        make check
        sudo make install
        cd ~
  001_install_mecab_dic:
    test: test ! -d mecab-ipadic-2.7.0-20070801.tar.gz
    command: |
        wget -O mecab-ipadic-2.7.0-20070801.tar.gz "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM"
        tar zxvf mecab-ipadic-2.7.0-20070801.tar.gz
        cd mecab-ipadic-2.7.0-20070801
        ./configure --with-charset=utf8
        make
        sudo make install
        cd ~
```
VagrantのVirtualBoxからPingが外のインターネットに届かない

### 以下のブロックをVagrantfileに追加
```.rb
nfig.vm.provider "virtualbox" do |v|
    v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
    v.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
end
```

### 参考
https://stackoverflow.com/questions/18457306/how-to-enable-internet-access-inside-vagrant
CTFでRSAの問題が解けないので勉強してみた

たまにCTFをやるのですが、RSAの問題が全く解けないしRSAの原理も理解できないので、とりあえずネットで調べてRSAの暗号化と復号プログラムを作って（集めて？）みました。ちゃんと動いているので合っているとは思いますが、使用する時は自己責任でお願いします。

#公開鍵、秘密鍵を作る

まず公開鍵と秘密鍵を作っていきたいと思います。一応下のプログラムで公開鍵と秘密鍵を作れます。pythonのライブラリであるsympyとgmpyを利用しています。

```python:
import sympy
import gmpy
p = sympy.randprime(10000000,100000000)
q = sympy.randprime(10000000,100000000)
n = p*q
e = 65537
l = (p-1)*(q-1)
d = gmpy.invert(e,l)
```

pとqは素数で、これが盗聴者に知られると暗号解読されますので、絶対バレないように隠します。なお（pとqが近いと解読され易い等）作り方が悪いと脆弱性が発生するそうです。よって真面目にRSAを勉強する時はちゃんとしたサイトで勉強し、正しいパラメータを設定し、脆弱性がないことをチェックしてください。今回は動作を理解するだけなので、適当なパラメータ設定をしています。

nはpとqを掛け合わせた数値です。暗号化する平文の最大長に関与します。これより長い平文を使用するときは、平文をこのnに収まるように分割して、複数回暗号化します。

eはpとqと互いに素である素数であり、自分が好きに決める数値となります。理由はわかりませんが65537が多いです。eが小さ過ぎる・大き過ぎるとこれまた脆弱性になるそうです。
この(n,e)の組が公開鍵になります。

lは(p-1)*(q-1)の値で、dを求めるだけの変数です。

dはlとeから逆行列を計算した結果です。
このdが秘密鍵になります。なおdとnで暗号文を復号するので(n,d)が秘密鍵と書いてあるサイトもあります。

#平文の暗号化

下のプログラムで平文を暗号化できます。

```python:暗号化処理
message = 'Hello'
m = eval('0x' + message.encode().hex())
c = pow(m,e,n)
```

文字列のままだと暗号化できないので数値に変換します。やり方は（上の例では）平文である文字列`Hello`を16進数のバイナリデータ`68656c6c6f`に変換し、文字列`0x68656c6c6f`に更に変換してから10進数にして変数mに入れています。

この変数mの値をe乗して、その結果に対しnの剰余（あまり）を求めたものが暗号文cになります。

#暗号文を復号

下のプログラムで暗号文を復号できます。codecsライブラリを使います。

```python:復号処理
import codecs
m2 = pow(c,d,n)
print(codecs.decode(hex(m2)[2:],'hex'))
```

暗号文cの値をd乗し、その結果に対しnの剰余（あまり）を変数m2に入れています。

変数m2の値を16進数にしてASCIIコードに変換したものが復号された平文になります。

#おまけ

gmpyのインストールに手間取ったので、私がうまくインストールできたときのコマンドを記載します。当然環境によってはライブラリが足りずインストールできない場合があるのでご了承ください。

```bash:gmpyのインストール
sudo apt-get install python-dev libgmp3-dev
sudo pip install gmpy
```
AWS EC2 - Amazon Linux2 のホスト名を永久的に変える方法

# AWS EC2 - Amazon Linux2 のホスト名を永久的に変える方法


AWS EC2を　Amazon Linux 2で選択して立ち上げると、ホスト名はプライベートの内部 IPv4 アドレスの形式で割り当てられます。
しかもこのIPv4 アドレスは再起動のたびに変わるので非常に分かりにくい場合が多いです。
今回はEC2を使いやすくするために、ホスト名を永続的に変更する方法を紹介（メモ）します。

### hostname 変更

#### 1. preserve_hostname の値を確認・追加

ただホスト名を変えても、rebootしたらデフォルトに戻るので、まず永続的に保持するように設定を変更します。

```
$ sudo vi /etc/cloud/cloud.cfg
```

Defaultでは preserve_hostnam が入っていので、ファイルの末尾に追加します。

```
preserve_hostname: true
```


#### 2. hostname 確認と変更

現在のホスト名を確認します。

```
$ sudo hostnamectl
   Static hostname: ip-10-0-0-1.ap-northeast-1.compute.internal
         Icon name: computer-vm
           Chassis: vm
        Machine ID: ec12345678
           Boot ID: 1234567890
    Virtualization: kvm
  Operating System: Amazon Linux 2
       CPE OS Name: cpe:2.3:o:amazon:amazon_linux:2
            Kernel: Linux 4.14.198-152.320.amzn2.x86_64
      Architecture: x86-64
```

今回はホスト名をDNSサーバに登録して使いたいので、以下のようにコマンドで変えます。

```
$ sudo hostnamectl set-hostname test.mydomain.com
```

ホスト名が変更されたことを確認します。

```
$ sudo hostnamectl
   Static hostname: test.mydomain.com
         Icon name: computer-vm
           Chassis: vm
        Machine ID: ec12345678
           Boot ID: 1234567890
    Virtualization: kvm
  Operating System: Amazon Linux 2
       CPE OS Name: cpe:2.3:o:amazon:amazon_linux:2
            Kernel: Linux 4.14.198-152.320.amzn2.x86_64
      Architecture: x86-64
```


#### 3. EC2 再起動と確認

EC2 を再起動します。

```
$ sudo reboot
```

再度接続し、ホスト名を確認します。

```
$ sudo hostname
test.mydomain.com
```


### 解説

オンプレのサーバの場合は、hostname をコマンドやエディタを使って変えるだけでそのホスト名を保持しますが、
EC2の場合は独自の設定項目を変える必要がありました。
ただ、このやり方はAmazon Linux 2の場合のみ通用するのでご注意ください。


### 参考

[Amazon Linux インスタンスのホスト名の変更](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/set-hostname.html)
cuda（というかGPUのドライバ）のインストールで嵌ったので、念の為のメモ

PCを１台組んで、ubuntuを入れてから、GPUを挿して嵌った。



# やりたかったこと

deep learning用のマシンの用意。ubuntu入れて、GPUを設定する。

# やったこと

１．PCを組んで、ubuntuを入れた。この時点でGPUはなし。

- マザー

  ASUS ROG MAXIMUS XIII HERO

- ubuntu

  20.04

特に問題なく入る

２．GPUを挿す。

- GPU

  Palit NE63060T19K9-190AD (GeForce RTX 3060 Dual OC 12GB)

ubuntu立ち上がる。GPUはハード的には認識されている。ドライバ未導入。

３．GPUドライバーを入れる。

ここでハマる。ドライバーを入れると、GPUが認識され、nvidia-smi も実行できる。しかし、リブートするとマザーボードのロゴが出た状態で止まる。

操作できないので、仕方なくubuntuを入れ直す作業から再開。

ドライバーのバージョンを色々変えたりしてみたりしたが、症状は変わらず。

で半日くらい潰した。何回ubuntuを入れ直したのか、、、。

その時、ふとひらめいた。

## ***「これはHDMIケーブルをGPU側に刺さないといけないのではないか？」***

HDMIケーブルをマザーボードから抜いて、GPUに挿し直したらubuntuの画面が表示された、、。誰もそんなこと書いてくれていないので、あまりに常識なのかもしれない。



ただ、この後、マザーボード側のグラフィックだけ使おうとして試したが成功しなかった。

- BIOSの設定

- X windowの設定

の両方をいじれば出来るはずだけどNG。Xを使わなくて良いならできるけど。

最終的には、GPU側でCUIで立ち上がるようにした。これなら、それほどメモリ食わない。必要なら（GPU側だけど）Xも立ち上がる。
Arduino スターターキットでセンサーを作る #1 導入&LED点滅

#Ardino スターターキットでセンサーを作る #1 導入&LED点滅
##環境
* Mac
*  ELEGOO UNO キット　レベルアップ 　チュートリアル付 uno mega2560 r3 nanoと互換 Arduino用

https://www.amazon.co.jp/dp/B06XF2HZGT?tag=kaoy05-22&linkCode=ogi&th=1&psc=1

##開封 & インストール
![IMG_0556.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1601949/64d0601e-09ff-6607-42f3-f135b838c71d.jpeg)

付属のCD-ROMを参考にインストールを行う

>Arduino統合開発環境（IDE）は、Arduinoプラットフォームのソフトウェア側です。
Arduinoをプログラミングするために使用するArduinoソフトウェアは、Windows、Mac、Linuxで使用できます。 
インストールプロセスは3つのプラットフォームすべてで異なります。
残念ながら、ソフトウェアをインストールするには一定の作業が必要です。

下記、リンクからダウンロード
https://www.arduino.cc/en/Main/Software

アプリを実行するとスケッチが表示される
![スクリーンショット 2021-06-07 7.53.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1601949/029bf98d-5365-7742-5dc7-94659d3fd25a.png)

##ArduinoとPCをUSB接続する
![IMG_0558.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1601949/233dae5c-886b-b024-e97a-00ece0c9b31e.jpeg)

##点滅時間を変更する
[ファイル]->[スケッチ例]->[01.Basics]->[Blink] を参考に点滅させる
blink:点滅させる
delayの時間を変えると点滅時間の変更が確認できる
変更を読み込ませるためには、「マイコンボードに書き込む」を選択
処理を終了させるためには、USB接続を抜く

```bulink.h
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}
```

##LEDを点滅させる
```blink.h
const int LED_PIN = 13; // デジタルpin13

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_PIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(2000);                       // wait for a second
  digitalWrite(LED_PIN, LOW);    // turn the LED off by making the voltage LOW
  delay(500);                       // wait for a second
}
```

![IMG_0559.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1601949/4ac58822-5a10-6389-384f-aa159e80fc80.jpeg)

* 長い方:プラス
* 短い方:マイナス
 

直接差し込んでみる

* 13番にプラス
* GNDにマイナス

![IMG_0560.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1601949/bc3a510e-2459-1da6-31c0-06b4b49e9934.jpeg)
光った！！
直接刺すのは、電流が多く流れてLEDに負荷がかかって、
長時間経つとLEDが壊れてしまうので、確認用まで

##参考
* [第2回 Arduinoでお手軽電子工作：LEDを光らせてみる](https://deviceplus.jp/hobby/entry_002/)
Gatsbyでマークダウンの記事に目次を追加する

# はじめに
こんにちは。アイスで一番好きなのは、あずきばーです。筆者です:smile:

さて、今回は記事に目次を**追加**したほうが**SEO**の評価がよくなるとからしい:thinking:

そんなわけで、ものは試しに追加してみました。

参考になれば幸いです！

# Gatsbyでマークダウンの記事に目次を追加する
以下を使って追加できます。
https://www.gatsbyjs.com/plugins/gatsby-remark-table-of-contents/

それではやっていきましょう。

## 1. **gatsby-remark-table-of-contents**のインストール.

```sh
$ npm install gatsby-remark-table-of-contents
```

## 2. 別途必要な**gatsby-remark-autolink-headers**のインストール.

```sh
$ npm install gatsby-remark-autolink-headers
```

## 3. gatsby-config.jsを編集.

```js:gatsby.js
module.exports = {
  plugins: [
    {
      resolve: `gatsby-transformer-remark`,
      options: {
        plugins: [
          `gatsby-remark-autolink-headers`,
          `gatsby-remark-table-of-contents`,
        ],
      },
    },
  ],
};
```

## 4. 各種設定が必要であれば調整する.
自分は以下の3点設定しました:+1:

1. `目次` というh2は目次に含めないようにする.
1. ナンバリングする.
1. 目次に使用するh*はh2だけにする.

```js:gatsby-config.js
module.exports = {
  plugins: [
    {
      resolve: `gatsby-transformer-remark`,
      options: {
        plugins: [
          `gatsby-remark-autolink-headers`,
          {
            resolve: `gatsby-remark-table-of-contents`,
            options: {
              exclude: '目次',
              ordered: true,
              toHeading: 2,
            },
          },
        ],
      },
    },
  ],
};
```

## マークダウン側をに以下を追加.
上で設定したので、 目次が表示される 下の`h2の目次`は目次に含まれません:ok_hand:

```md:article.md
    ## 目次

    ```toc
    # This code block gets replaced with the TOC
    ```
```

# おわりに
意外と簡単にできました:smile:
それでは！
VBA エクセル OUTLOOKからメール内容を自動取得

OUTLOOKからメール内容を自動取得

|A列|B列|C列|D列|E列|
|:---:|:---:|:---:|:---:|:---:|:---:|
|受信日時|送信元の名前|送信元のメールアドレス|件名|本文全て|

```vb
'多数の受信メールの情報を取得

Sub GetMultiMail()

    'Outlookアプリを参照
    Dim olApp As Outlook.Application
    Set olApp = New Outlook.Application
    
    'NameSpaceオブジェクトを取得
    Dim myNamespace As Outlook.Namespace
    Set myNamespace = olApp.GetNamespace("MAPI")
    
    '受信トレイの取得
    Dim myInbox As folder
    Set myInbox = myNamespace.GetDefaultFolder(olFolderInbox)
    
    '受信日時の降順にコレクションを並び替え
    Dim myItems As Outlook.Items
    Set myItems = myInbox.Items
    myItems.Sort "ReceivedTime", Descending:=True
    
    '最新の１０件のメールを取得する
    Dim i As Long
    
    For i = 1 To 10
        
        '受信日時
        Cells(i + 1, 1).Value = myItems(i).ReceivedTime
        '送信元の名前
        Cells(i + 1, 2).Value = myItems(i).SenderName
        '送信元のメールアドレス
        Cells(i + 1, 3).Value = myItems(i).SenderEmailAddress
        '件名
        Cells(i + 1, 4).Value = myItems(i).Subject
        '本文全てを取得する場合
        Cells(i + 1, 5).Value = myItems(i).body
    
    Next i
    
    'オブジェクト変数の参照を無しにする。
    Set myNamespace = Nothing
    
    Set myInbox = Nothing
    
    Set olApp = Nothing

    
End Sub

```
蟹さんのお手軽ビルド

FreeBSDのLinuxulatorとDebianで簡単にmruby VMがビルドできるようにスクリプトを作ってみました。BastilleBSDのjailやコンテナのホームディレクトリで以下のように実行するとVMのイメージがビルドできます。

```
$ git clone --recursive https://github.com/yamori813/rtlbm-mruby.git
$ git clone https://github.com/yamori813/rtl819x-toolchain.git
$ cd rtlbm-mruby/build/
$ ./getfiles.sh
$ ./mknewlib.sh
$ ./mklwip.sh
$ ./mkbearssl.sh
$ ./mkmruby.sh
$ cd ..
$ ./mkallvm.sh
```

ruby,bison,rakeのパッケージが必要です。もちろんgitもですが。

焼き方はこちらを参考にしてください。

https://qiita.com/yamori813/items/bf3cb113b2b9c121c0b7

蟹さんのターゲットで一番のお勧めはauの白いやつです。これは元々realtekのbootloaderが焼いてあって、リセット押しながら電源入れるとtftpを受け付ける状態になります。シリアル無くてもVMやmrbが焼けます。

蟹さんはlinuxでも同じようにビルドできるようにスクリプトを用意したつもりですが、bcmbm,admbm,ksbmはFreeBSDのコマンドを使うようにしたので、linuxでビルドする時は少しいじらないとダメだと思います。
RailsとVueを使ったPFをherokuにデプロイするのに苦戦した話

初めての投稿。ドキドキ…

バックエンドにRails フロントエンドにVueを使って、ポートフォリオを作成しHerokuにでプロイしようとしたらエラーで苦戦したのでメモ。

https://qiita.com/jnchito/items/30ab14ebf29b945559f6#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB

https://qiita.com/murakami-mm/items/9587e21fc0ed57c803d0#heroku%E3%81%AB%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%9C%E6%88%90

こちらの記事を参考に進めて

```
$ git push heroku master
```

ここで苦戦。いくらやっても途中でエラー。

```
Your bundle is locked to mimemagic (0.3.5), but that version could not be found in any of the sources listed in your Gemfile. If you haven't changed sources, that means the author of mimemagic (0.3.5) has removed it. You'll need to update your
bundle to a version other than mimemagic (0.3.5) that hasn't been removed in order to install.
```

調べたらmimemagicが削除されていてできないことが判明。
そこで下の記事が見つかり

https://qiita.com/suzuki_sh/items/84806ce231ed9b0f2e6d

railsのアップデートを行う。
####無事完了！！

今後もアウトプットに投稿していこうと思います。初めての投稿ってドキドキしてしまった:relaxed:
二分探索法の使い道

二分探索法は、検索したい値が配列の中にあるか判定するだけでなく、「所与の条件を満たす最小値を求めよ」という最適化問題にも応用でき、さらには「N個すべての値をx以下にできるか判定せよ」という判定問題にも応用が効く、使いこなせるとカッコいいアルゴリズムの一つです。


#配列から目的の値を探索する二分探索法

```Python:BinarySearch1.py
# 二分探索法
# 計算量：O(logN)
def binary_search(key, a):
    left = 0
    right = len(a)
    while right >= left:
        mid = left + (right-left)//2
        if a[mid] == key:
            return mid
        elif a[mid] > key:
            right = mid - 1
        elif a[mid] < key:
            left = mid + 1
    return -1

N = int(input())
a = list(map(int, input().split()))

binary_search(N, a)

# 入力
# 10
# 3 5 8 10 14 17 21 39

# 出力
# 3
```


#条件を満たす最小値を求める二分探索法

```Python:BinarySearch2.py
# 最小値を返す二分探索法
# 配列aの中でa[i]≧keyという条件を満たす最小の添字iを返す
def binary_search2(key, a):
    left = 0
    right = len(a)
    while right >= left:
        mid = left + (right-left)//2
        if a[mid] == key:
            return mid
        elif a[mid] > key:
            right = mid - 1
        elif a[mid] < key:
            left = mid + 1
    return right+1

# ペア和問題
# N個の整数a0,...,aN-1と、　N個の整数b0,...,bN-1からから１個ずつ整数を選び、
# その和が整数K以上となる範囲での最小値を求める

# 入力受取
N, K = map(int, input().split())
a = list(map(int, input().split()))
b = list(map(int, input().split()))

# bに無限大を表す値を追加
b.append(99999)

# bを昇順にソート
b.sort()

# 暫定最小値を格納
min_ = 99999

# aを固定して解く
for i in range(N):
    iter_ = binary_search2(K-a[i], b)
    if min_ > a[i] + b[iter_]:
        min_ = a[i] + b[iter_]
print(min_)
```


#最適化問題を判定問題に帰着して解く二分探索法

```Python:BinarySearch3.py
# AtCoder Beginner Contest 023 D - 射撃王
# N個の風船が初期値h[i]の高さにあり、秒速s[i]で上昇するとし、1秒に1つの速さで風船を
# 割っていき、風船が取り得る最大の高さの最小値を求める

# 入力受取
N = int(input())
h = list(map(int, input().split()))
s = list(map(int, input().split()))

# 二分探索法で解く
left, right = 0, 99999
while right - left > 1:
    mid = (left + right) // 2
    
    # mid以内で風船を割り切れる（風船が取り得る最大の高さの最小値）かの判定
    ok = True

    # 各風船を割るまでの制限時間t[i]を用意
    t = [0 for i in range(N)]

    # 初期値の高さと比較し、各風船の制限時間を格納
    for i in range(N):
        if mid < h[i]:
            ok = False
        else:
            t[i] = (mid - h[i]) // s[i]
            
    # 制限時間に余裕がない順にソートし、順に判定
    t.sort()
    for i in range(N):
        if t[i] < i:
            ok = False
    
    # 判定結果に基づき、midを更新  
    if ok:
        right = mid
    else:
        left = mid
        
print(right)
```
AWS認定ソリューションアーキテクトプロフェッショナル(SAP)を、再認定したふりかえりまとめ

# はじめに
認定をぐるっと回って、SAPの３年の有効期限が来てしまいました。
前回は旧バージョンの試験の時で、今は出題傾向も変わってきているのなと思い、少しだけ情報整理をして臨みました。
本格的な試験対策の記事は多くの方が投稿されているかと思いますので、記録として、事前準備と再認定を受けてみて感じたことについて簡単に記載してみたいと思います。

# 本記事の主な対象者
- AWS認定の他の試験区分は取得済みで、ソリューションアーキテクトプロフェッショナルの受験を検討している方
- 取得に向けて有効な学習方法などの情報収集したい方

# 筆者のAWS認定履歴

|AWS認定  |取得日  |再認定日  |
|---|---|---|---|
|ソリューションアーキテクト - アソシエイト  |2018-05-13|（同SAP）|
|デベロッパー - アソシエイト  |2018-06-03|-|
|SysOpsアドミニストレーター - アソシエイト | 2018-06-10|-|
|ソリューションアーキテクト - プロフェッショナル  |2018-07-29|2021-06-05|
|DevOpsエンジニア - プロフェッショナル  |2018-08-26|-|
|データアナリティクス専門知識<br>(ビッグデータ専門知識)  |2019-08-25|2020-11-21|
|セキュリティ専門知識  |2019-12-08|-|
|機械学習専門知識  |2020-02-23|-|
|高度なネットワーキング専門知識  |2020-06-20|-|
|データベース専門知識  |2020-07-04|-|
|Alexaスキルビルダー専門知識  |2020-07-24|-|
|クラウドプラクティショナー  |2020-07-27|-|

# 事前準備
これまでの受験の過去の経験則から、ベストプラクティスを抑えるのは正答への近道です。
下記のドキュメントを、業務を振り返りながら読み返しました。

 - [AWS Well-Architected フレームワーク](https://wa.aws.amazon.com/wellarchitected/2020-07-02T19-33-23/index.ja.html)

# 再認定を受けてみて感じたこと
 - EC2ベースの3層アーキテクチャの分野は主たる戦場なので、ベストプラクティスを信じて選択しました。
 - サーバレス関連も同上。Lambdaまわりは日頃触れているので、正誤の取捨選択しやすい内容だったような気がします。
 - S3関連は、アクセスポイントやら何やらここ近年でサービスインしたキーワードがチラホラ散見され、３年前とは出題内容が違ってきているのかなと感じました。
 - オンプレ移行、DR要件は頻出な感じがしました。ゆえに原則・普遍的なパターンを抑えているのが肝要です。
 - Organizations、コスト関連は日頃あまり触っていないものあり、ここは事前に重点的にドキュメントを読み返しました。
 - Direct Connect も同上。ANSを取ったとはいえ、確信を持って回答できるものが少なかったです（XXXゲートウェイなど）
 - 各専門知識の認定区分を一通り学習していると、類題シナジーがあったような気がします。
 - 落ち着いて設問を読みましょう。キーワードが隠れている（はず）
 
# おわりに
定期的な知識の棚卸しや、新サービスのキャッチアップという観点で、３年の有効期限は意外と有用かなと思いました。今回新しく得られた知識もそれなりにありました。
今後受験を検討される方の一助になれば幸いです。
最適化問題を解くために pulp と ortoolpy をインストールしたときの記録

### 出発地

Python実践データ分析100本ノック

https://www.shuwasystem.co.jp/book/9784798058757.html

の「ノック61：輸送最適化問題を解いてみよう」で用いられているライブラリ
pulp
ortoolpy
のインストールで迷ったので記録しておきます。
環境によって対処方法が異なると思いますが、私の場合はこうでした。

### 最初の状態
OS: windows 10.0
python: 3.7.3
numpy: 1.16.2

### 実施日
2021/06/07

### 利用ツール
Anaconda Prompt
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/58a833a5-7ab0-3733-fb75-c5166cf19508.png)


### 実施コマンド
```
conda update conda
```
```
conda update numpy
```
```
pip install pulp
```
```
pip install ortoolpy
```

### 到着地
python: 3.7.3
numpy: 1.20.2
pulp: 2.4
ortoolpy: 0.2.38

```
conda list
# packages in environment at C:\ProgramData\Anaconda3:
#
# Name                    Version                   Build  Channel
（中略）
numpy                     1.20.2           py37ha4e8547_0
（中略）
ortoolpy                  0.2.38                   pypi_0    pypi
（中略）
pulp                      2.4                      pypi_0    pypi
（後略）
```
Kibanaだとダッシュボードをiframeで表示するのが簡単だった

## Kibanaに接続

```yml:docker-compose.yml
version: "3"

services:

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.13.1
    environment:
      - discovery.type=single-node
      - cluster.name=docker-cluster
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ports:
      - 9200:9200
    volumes:
      - es-data:/usr/share/elasticsearch/data

  kibana:
    image: docker.elastic.co/kibana/kibana:7.13.1
    ports:
      - 5601:5601
    environment:
      - "I18N_LOCALE=ja-JP"

volumes:
  es-data:
```

* http://host:5601

## 設定

![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/f90d965f-533b-458d-af35-785b1f51c2b3.png)

* サンプルデータ - データの追加
 
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/7862018d-0419-de89-4580-1e59528cf453.png)

* データを表示

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/4f7d865a-369b-711b-970e-fdd714b1cd43.png)

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/b97687df-f3e2-7c05-e6ec-ea294e47f694.png)

* iFrameコードをコピー

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/8d21515b-f57d-2d38-7d4f-af1ed37cc1a9.png)


## iframeを仕込む

以下のような形式になる。

> `<iframe src="http://host:5601/app/dashboards#/view/7adfa750-4c81-11e8-b3d7-01146121b73d?embed=true&_g=(filters%3A!()%2CrefreshInterval%3A(pause%3A!f%2Cvalue%3A900000)%2Ctime%3A(from%3Anow-24h%2Cto%3Anow))" height="600" width="800"></iframe>`

* index.html の作成

![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/a5d96954-549c-36d1-a254-2197f40214b1.png)

* 表示できた。

![7-index.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/aef82680-5da8-6ead-f1a2-ce091ddf2eb2.png)

* 実際はNginxなどでbasic認証などをではさんで接続が良いと思う。

## データの投入

* 開発ツール からjsonの投入が容易

![dev-tool2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/df8af5dd-985e-cf6c-1877-e4c5d17631aa.png)



## その他

Google チャートも簡単かも

https://developers.google.com/chart/

https://cio.go.jp/itdashboard/samplegc