OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Coud9でphpMyAdmin画面へアクセスしたときに 404|not foud エラーを解決する方法

# Cloud9で開発環境を整えて、時間がたってからなぜかphpMyAdminへアクセスできず、ログイン画面で見れなくなる症状に躓きました。

いくら調べても解決しなかったんですが、もしかしたら稀にいるかもしれないと思って記事を書くことにしました。

<h2>解決のために事前チェックその１</h2>
サーバーを起動しているか確認

```qiita:サーバー起動コマンド
$ ^Cec2-user:~/environment/project1 $ php -S $IP:$PORT
PHP 7.3.11 Development Server started at Mon Nov 25 15:22:41 2019
Listening on http://127.0.0.1:8080
Document root is /home/ec2-user/environment/project1
Press Ctrl-C to quit.
```

下記のコマンドで起動したサーバーは phpMyAdminのページへアクセスしても 404|not foudとなります。

```qiita:サーバー起動コマンド（１）
$ ec2-user:~/environment/project1  $ php artisan serve
Laravel development server started: http://127.0.0.1:8000
```


```qiita:サーバー起動コマンド（２）
$ ec2-user:~/environment/project1  $ php artisan serve --port=8080
Laravel development server started: http://127.0.0.1:8080
```


<h2>事前チェックその２</h2>
Laravelのプロジェクト（ディレクトリ）内でmysqld を起動しているか確認

```qiita:mysqld起動コマンド
$ sudo service mysqld start
ec2-user:~/environment/project1  $ sudo service mysqld start
Starting mysqld:                                           [  OK  ]
```

```qiita:mysqldの状態確認コマンド
$ ec2-user:~/environment/project1  $ sudo service mysqld status
mysqld (pid  20873) is running...                              [  OK  ]

```
running...と表示されていれば、起動中です。

一応、mysqld 停止コマンドも明記しておきます。

```qiita:mysqldの停止コマンド
$ ec2-user:~/environment/project1  $ sudo service mysqld stop
Stopping mysqld:                                           [  OK  ]
```

<h2>事前チェックその３</h2>
phpMyAdminのURLを "https://～～.vfs.cloud9.～～.amazonaws.com/phpMyAdmin/index.php" まで指定している


<h3>それでも解決しなかった場合、Cloud9上で作成した他のプロジェクト内でmysqldが起動している可能性があるので、それを停止します。</h3>
（アクセス権限に関しても調べて変更してみましたが、結果的に関係ありませんでした。）
linuxコマンドに詳しい方はもうわかると思うので、読み進める必要はないです。

念のためlinux初心者の方のために細かいコマンド実行の様子を記しておきます。

まずはディレクトリの移動

```qiita:親ディレクトリ移動
$ ec2-user:~/environment/project1  $ cd ../
```
そこでlsコマンドを実行すると他にもプロジェクトがあることがわかります。

```
ec2-user:~/environment $ ls
project1  project2  README.md 
```
project1 のディレクトリから project2 (別のプロジェクト)のディレクトリを移動します。

```qiita:親ディレクトリ移動
$ ec2-user:~/environment/  $ cd project2
```

その中で再度、mysqldの状態を確認してみると、、、

```qiita:mysqldの状態確認コマンド
$ ec2-user:~/environment/project2 $ sudo service mysqld status
mysqld (pid  20873) is running...                              [  OK  ]
```
動いてる。。。。（このプロジェクト、ずっと触ってなかったのに、、）

それで、もしかしたらと思い停止コマンドを実行して停止し、
project1 の方のディレクトリに移ってから、mysqldを起動してみると

```qiita:mysqldの停止コマンド
$ ec2-user:~/environment/project2 $ sudo service mysqld stop
Stopping mysqld:                                           [  OK  ]
$ ec2-user:~/environment/  $ cd ../project1
ec2-user:~/environment/project1 $ sudo service mysqld start
Starting mysqld:                                           [  OK  ]
```

無事表示されました！！

![phpmyadmin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531595/d88eaf0f-ec22-1d92-9418-396f23a0da66.png)


以上です。　うっかり他のプロジェクトでのmysqldを停止し損ねて、
別プロジェクトで使おうとしたときに起きた症状の対策方法でした。

AWSはまだ触り始めたばかりなので、わからないことだらけで苦戦していますが、
上記の方法以外で解決方法をしっていたり、設定方法をご存知の方がいらっしゃいましたら
ぜひコメントいただけるとありがたいです。
Unity UIの自分用まとめ

ピボット、アンカー、RectTransform、Canvas・・・色々な要素があるUI。いろんなサイトをまわってみたが、体系的にどの要素がどう作用するのか、順を追って解説してくれておりかつ私自身の感覚にマッチするまとめ方をしているものが見当たらなかった。マジ難しいので、TechAcacemyのメンターさんと話してなんとかイメージできた(かな？)内容をまとめておく。
※未熟なので、表現の誤りなどには目をつむっていただきたい。私流の言葉で表現しているので。


# UI
Canvasという平面オブジェクトの子オブジェクト。Canvasとカメラ、スクリーンとの関係はまず3種類ある。

# Canvasのスクリーンへの描画
Canvasとカメラとスクリーンの関係はCanvasオブジェクトをヒエラルキービューで選択してインスペクタに表示される**Canvas - Render Mode**で設定できる。

デフォルトで``Overlay``が選択されており、他の選択肢としては``Camera``、``World``という順に並んでいる。

**メモ**
World→Camera→Overlayの順に仕様としての理解をしていった方が個人的にはわかりやすいと思った。
Overlayはマジで世界座標系上での表示をやめてほしい・・・意味ないし混乱するから。

## World
Canvas以外のオブジェクトと同様、カメラを通して実際のCanvasオブジェクト(および子オブジェクトたるUI)の大きさと世界座標系における位置を考慮してレンダリング、スクリーンに表示するというモード。Canvasオブジェクトを動かしてカメラから見えなくなると当然Canvasオブジェクトの子オブジェクトであるUIはスクリーンに表示されない。

## Camera
Worldと同じく実際のCanvasオブジェクトの大きさ、世界座標系における位置を考慮してレンダリングされる。違いとしては、カメラとCanvasが紐付けされ、Canvasの位置は必ずカメラの真正面に来る状態になる。カメラを動かすとCanvasも動き、逆も然り。

## Overlay
World, Cameraとは大分毛色が異なり、実際のCanvasオブジェクトの大きさや世界座標系における位置といったものは一切考慮されず、カメラを通してレンダリングされることがなく、Canvasオブジェクトをそのままスクリーンに表示させるような形になる。すなわちクロマキー的なもの、プリクラのお絵かき機能のお絵かきに相当するもの、ポケモンGoのARモードで描画されるポケモンに相当するもの(背景は実際の風景であり、こちらは現実空間の物体がレンダリングされたもの)というようなイメージがわかりやすいか。




**注意**
カメラを通してレンダリングされるわけではないのに、シーンビュー上でOverlayのオブジェクトが世界座標系上に存在するのでマジで混乱する。**UnityのUIがおかしい**んだと割り切って気にしてはいけないのだが、初学者がそんなことを知るわけがなく・・・これはUnityのUIとして機能改善してほしい。最新バージョンだとされてるのかもしれないけど。

# UI描画領域の大きさと位置
UIオブジェクトをヒエラルキービューで選択してインスペクタに表示される「Rect Transform」で設定する。
私自身の混乱を避けるため、今の段階ではAnchorsのMin、Maxがx,yそれそれで同じ値で設定する前提とする。
※違う値になると相対位置？みたいな感じになるらしい。

https://tech.pjin.jp/blog/2017/03/22/unity_ugui_rect-transform/

## UI描画領域の大きさ
Width, Heightで設定する。


## UI描画領域の位置
UIはCanvasの子オブジェクトであり、UI描画領域の位置はCanvasを基準に決定される。
決定に関係する設定はAnchors, Pivot, PosX, PosY, PosZである(把握している分だけでいえば)。
今の所、描画領域の位置の決定はPosX,Y,Zは0,0,0固定でAnchorsとPivotのみの設定でほぼ事足りるように思える。


### Anchors
アンカー。UI描画領域の基準点(Pivot)をCanvasのどこに合わせるか？を示す座標値を設定する。
ただし、**Anchorsの座標値はCanvasの大きさを0〜1のスケールで表した座標系**となる。


### Pivot
ピボット。UI描画領域の基準点であり、この基準点の座標値を設定する。
Pivotの座標値は**UI描画領域の大きさを0〜1のスケールで表した座標系**となる。

### PosX,Y,Z
これが**0,0,0である = AnchorsとPivotがぴったり合わさっている**状態。この状態から**PosX,Y,Zの方向へ設定値分並行移動させて最終的なUI描画領域の位置が決定される**・・・というイメージ。座標値は世界座標系のスケール。

### 設定例
インスペクタでRect Transformを以下のように設定した場合のUI描画領域のCanvas上における位置を図示してみた。
※図の中での(x,y)はCanvasの0~1スケール座標値、[x,y]はUI描画領域の0〜1スケール座標値を表している。

**RectTransform設定値**
- (PosX, PosY, PosZ) = (0,0,0)
- (Width, Height) = (100, 100)
- Anchors(MinX, MinY, MaxX, MaxY) = (1, 1, 1, 1)
- Pivot(x,y) = (1,1)

![IMG_5755.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/9782c3d1-0736-4cf3-a9cf-c27fd6e8534d.jpeg)
プロパティ名がキーと一致しているときは省略して書ける

表題の件、コードレビューで教えていただいた :pray: 

キー名と変数名が同じなら省略できる :pencil: （簡単なことかもだけどすぐ忘れそうなのでメモ）

### 修正前

```
const data = await this.SampleRequest({ id: id })
```

### 修正後

```
const data = await this.SampleRequest({ id })
```

### 参考

[あなたが知らないJavaScriptの便利すぎるショートハンド19選 \- WPJ](https://www.webprofessional.jp/shorthand-javascript-techniques/)
日本語プログラミング言語「プロデル」で日本国憲法をやる

## はじめに

以下のプログラムを実行しても，エラーが発生しません（バージョン1.6.980で確認）。

```プロデル
「日本国憲法.rdr」を参照する。

朕は、日本国民の総意に基いて、新日本建設の礎が、定まるに至つたことを、深くよろこびて、
枢密顧問の諮詢及び帝国憲法第七十三条による帝国議会の議決を経た帝国憲法の改正を裁可し、
ここにこれを公布せしめる。
日本国民は、正当に選挙された国会における代表者を通じて行動し、われらとわれらの子孫のために、
諸国民との協和による成果と、わが国全土にわたつて自由のもたらす恵沢を確保し、
政府の行為によつて再び戦争の惨禍が起ることのないやうにすることを決意し、
ここに主権が国民に存することを宣言し、この憲法を確定する。
```
（見やすいように改行を入れていますが，実行時にはあっても無くても構いません）


## 解説

このプログラムは，ただの代入文で構成されています。朕は～，日本国民は～，とありますが，残念ながら動詞の主語ではありません。

また，1箇所だけどうしても原文を維持できなかった部分があります。「よろこび」を「よろこびて」に改編しています。

基本的な方針としては，プロデルでは動詞の連用形を用いることで複数の命令を1つの文に書くことができるので，これを利用します。この際の制約として，連用形の動詞（手順）が何らかの値を返すことが要求されます。そして，これに伴って，後続の動詞（手順）は引数として受け取らねばなりません。

### 1文目解説

まず，`日本国民の総意に基づいて`という部分には，`日本国民の総意に基づく手順`を用意します。

```
日本国民の総意に基く手順
	「」を返す。
終わり
```

次に，`新日本建設の礎が、定まるに至つたことを、深くよろこびて`の部分を説明します。日本語においては，深くよろこんでいるのは朕ですが，致し方なく新日本建設の礎がよろこんでいることにします。
新日本建設の礎の手順として「定まるに至る」を用意したかったのですが，「こと」が邪魔なのです。仕方ないので，名詞として用意します。

```
定まるに至つたことは，「」。
新日本建設とは
	単一種類
	＋礎
	はじめの手順
		礎という礎を作る。
	終わり
終わり
礎とは
	はじめの手順
	終わり
	自分が［あ］を深くよろこぶ手順
		「」を返す。
	終わり
終わり
```

「よろこぶ」の連用形「よろこび」は連用形として認識されないので，「よろこびて」とテ格にする必要があります。この場合，元の動詞は「よろこぶ」ではなく「よろこびる」という変な動詞にします。日本語の動詞はとても大変です。

続いて，`枢密顧問の諮詢及び帝国憲法第七十三条による帝国議会の議決を経た帝国憲法の改正を裁可し`の部分は，もう面倒なので，

```
枢密顧問の諮詢及び帝国憲法第七十三条による帝国議会の議決を経た帝国憲法の改正は，「」。
［い］で［あ］を裁可する手順
	「」を返す。
終わり
```

としました。

最後に，`ここにこれを公布せしめる`ですが，プロデルには「これ」という代名詞が用意されています。よって「ここ」だけを定義すればOKです。

```
ここは，「」。
［国民］に［憲法］を公布せしめる手順
	「」を返す。
終わり
```

### 2文目解説

まずは，`正当に選挙された国会における代表者を通じて行動し`の部分を説明します。通じて行動し，と2つの動詞がつながっているので，2つの動詞（手順）を用意します。「正当に選挙された国会における代表者」は，もう名詞として用意します。

```
正当に選挙された国会における代表者は，「」。
［あ］を通じる手順
	「」を返す。
終わり
［あ］を行動する手順
	「」を返す。
終わり
```

次に，`われらとわれらの子孫のために、諸国民との協和による成果と、わが国全土にわたつて自由のもたらす恵沢を確保し`ですが，よく見ると，「確保する」という動詞に対して，「～に」「～と」「～を」の3つの補語から成り立っていることが分かります。ちなみに「ため」は名詞です。

```
われらとわれらの子孫のためは，「」。
諸国民との協和による成果は，「」。
わが国全土にわたつて自由のもたらす恵沢は，「」。
［え］で［あ］に［い］と［う］を確保する手順
	「」を返す。
終わり
```

続いて，`政府の行為によつて再び戦争の惨禍が起ることのないやうにすることを決意し`ですが，`政府の行為によつて再び戦争の惨禍が起ることのないやうにすること`という名詞を定義できなかったので，動詞として処理します。

```
［あ］で政府の行為によつて再び戦争の惨禍が起ることのないやうにする手順
	「」を返す
終わり
［あ］で［い］を決意する手順
	「」を返す。
終わり
```

最後に，`ここに主権が国民に存することを宣言し、この憲法を確定する`をやります。

```
主権が国民に存することは，「」。
【この憲法：文字列】は，「」。
［あ］で［う］に［い］を宣言する手順
	「」を返す。
終わり
［あ］に［い：文字列］を確定する手順
	「」を返す。
終わり
```

プロデルには，表部品種類に「確定する」手順が存在するので，オーバーロードによってエラーを回避します。表部品種類以外であればどのような型でも問題ありませんが，今回はどの手順も「」を返しているので，文字列にしています。

これで完成です！

## すべて

```プロデル:日本国憲法.rdr
定まるに至つたことは，「」。
枢密顧問の諮詢及び帝国憲法第七十三条による帝国議会の議決を経た帝国憲法の改正は，「」。
ここは，「」。
正当に選挙された国会における代表者は，「」。
われらとわれらの子孫のためは，「」。
諸国民との協和による成果は，「」。
わが国全土にわたつて自由のもたらす恵沢は，「」。
主権が国民に存することは，「」。
【この憲法：文字列】は，「」。
［あ］で政府の行為によつて再び戦争の惨禍が起ることのないやうにする手順
	「」を返す
終わり
［国民］に［憲法］を公布せしめる手順
	「」を返す。
終わり
日本国民の総意に基く手順
	「」を返す。
終わり
天皇とは
	はじめの手順
	終わり
	［あ］を深くよろこびる手順
		「」を返す。
	終わり
終わり
新日本建設とは
	単一種類
	＋礎
	はじめの手順
		礎という礎を作る。
	終わり
終わり
礎とは
	はじめの手順
	終わり
	自分が［あ］を深くよろこぶ手順
		「」を返す。
	終わり
終わり
［い］で［あ］を裁可する手順
	「」を返す。
終わり
［あ］を通じる手順
	「」を返す。
終わり
［あ］を行動する手順
	「」を返す。
終わり
［え］で［あ］に［い］と［う］を確保する手順
	「」を返す。
終わり
［あ］で［い］を決意する手順
	「」を返す。
終わり
［あ］で［う］に［い］を宣言する手順
	「」を返す。
終わり
［あ］に［い：文字列］を確定する手順
	「」を返す。
終わり
```

## 感想

何か可能性を感じました。
railsのsidekiqのdelayの注意点

# 気軽に非同期処理ができる
config/initializers/sidekq.rbに
Sidekiq::Extensions.enable_delay! 
を追加すると、Hoge.delay.hogehoge
で気軽に非同期処理ができる

# 注意点
インスタンスメソッドでdelayするとよくわからないエラー起きるみたいなので、
クラスメソッドで使用する。

https://www.wazalab.com/2019/07/04/sidekiq%E3%81%A7delay%E3%82%92%E4%BD%BF%E3%81%86%E3%80%82%E3%81%97%E3%81%8B%E3%81%97%E3%80%81%E3%82%AF%E3%83%A9%E3%82%B9%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E4%BD%BF%E3%81%84%E3%83%80/
年末まで毎日webサイトを作り続ける大学生 〜38日目 cssで吹き出しを作る〜

##はじめに
こんにちは！@70days_jsです。

cssで吹き出しを作ってみました。

今日は38日目。(2019/11/25)
よろしくお願いします。


##サイトURL
https://sin2cos21.github.io/day38.html

##やったこと

こんな感じの吹き出しを作りました。↓

![スクリーンショット 2019-11-25 23.50.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/5e96557c-aa0f-878e-ed91-a84d47d85d70.png)

コピペで繰り返し使えるように作りました。↓

```html
<body>
    <div class="wrapper">
        <img class="image" src="pic.png" alt="画像">
        <div class="fukidashi">吹き出しがあると、ポップに見えるよね</div>
    </div>

    <div class="wrapper2">
        <div class="fukidashi2">そうだね</div>
        <img class="image2" src="pic.png" alt="画像">
    </div>

    <div class="wrapper">
        <img class="image" src="pic.png" alt="画像">
        <div class="fukidashi">うん。</div>
    </div>
</body>
```

.wrapperクラスが左側に配置される方です。
.wrapper2クラスは右側に配置されます。

違いは、つけているクラスと、divとimgの順番だけです。

吹き出しの作り方。↓

```css

.fukidashi {
    width: 200px;
    margin-left: 10px;
    position: relative;
    display: inline-block;
    text-align: center;
    color:#FFF;
    padding: 30px;
    background-color:black;
    border-radius: 50%;
    z-index: 0;
}
.fukidashi::before {
    top: 50%;
    left: -5px;
    margin-top: -10px;
    content: '';
    position: absolute;
    display: block;
    z-index: 1;
    border-style: solid;
    border-color: transparent black;
    border-width: 10px 10px 10px 0px;
}
```

absoluteとrelativeを使って実現します。
吹き出しの三角形部分はborrderのプロパティを変えることで実現しています。

吹き出しの本体はradiusでちょっと丸めるだけです。
あとは位置関係を相対的にずらして、三角形を見える部分に持ってくるだけです。



##感想
サイトを作る際に、吹き出しがあるとポップな感じになるので前々からやりたいと思っていました。できてよかったです。

最後までお読みいただきありがとうございます。明日も投稿しますのでよろしくお願い致します。

##参考
1. 実際に書いてみる！CSSで吹き出しを作る方法【初心者向け】 | TechAcademyマガジン (https://techacademy.jp/magazine/12936)

とても分かりやすかったです。ありがとうございます！
初学者目線でみるPWA

PWA Advent Calendar 2019 2日目の記事です。

PWA（Progressive web app）というワードを最近よく見かけるようになりました。
そこで、PWAを初めて学ぶなら？という立場で情報をまとめてみます。

# 1. PWA is 何
オフラインで利用できるWebアプリ？プッシュ通知ができるWebアプリ？それともService Wokerを使っているWebアプリ？PWAを提唱しているGoogleのドキュメントを見てもどうにも掴みきれず。そんな中でとても納得／共感できたスライドを紹介します。

***[なぜ今PWAがきているのか トレンドの背景](https://speakerdeck.com/hitoshi_sumiya/nazejin-pwagakiteirufalseka-torendofalsebei-jing) / TAM 角谷 仁***

つまり、PWAとは「よりよいウェブ体験をつくる」「先進的なWebアプリケーション」ですね。

# 2. Service Worker is 何
PWAを調べる中でService workerなるワードが度々出てきます。PWAを理解して実装する上で重要な要素と考えられます。そこで、Service Workerとは何なのか、その概念を理解するにあたって参考になった記事を紹介します。

***[Service Workerってなんなのよ (Service Workerのえほん)](https://qiita.com/kosamari/items/5e2235d26eb339a33660) / [@kosamari](https://qiita.com/kosamari)***


「Service Worker はブラウザ星とインターネット水道管の間に立ってくれる助っ人のようなもの。」とある通り、Webサイトとブラウザ間で補助的に動くプログラム、です。


# 3. PWAを実際に体験（実装）する
知識の吸収は必要最低限にして、あとは手を動かして学びましょう。私は今ここのフェーズです。簡単に始められる記事をいくつか紹介します。

- ***[PWAをもっと簡単に初めてみる](https://qiita.com/poster-keisuke/items/6651140fa20c7aa18474) / [@poster-keisuke](https://qiita.com/poster-keisuke)***

- ***[PWA（Progressive Web Apps）を最低限で試してみる](https://qiita.com/tsunet111/items/450728056ba92d35508c) / [@tsunet111](https://qiita.com/tsunet111)***

- ***[offline-cookbook](https://jakearchibald.com/2014/offline-cookbook/) / Jake Archibald***

# 4. PWAの知見をアウトプットする
カンファレンスに参加するなどしてアウトプットしましょう。例えば、東京、大阪の方はPWA Nightが良さそうです。

***[PWA Night 次世代のWebを作ろう](https://pwanight.connpass.com/)***
PWA NightはPWAに関わるすべての方のためのコミュニティです。

以上、簡単になりますが初学者目線でみるPWAでした。

---
今はPWA自体が話題になったり取り上げられたりしていますが、きっと将来的にはWebアプリとネイティブアプリの境界はなくなっていき、PWA自体はWebアプリに自然と／当然のように組み込まれていくようになるのかなと思います。

自分自身まだPWAとは何か学んでいる身のため、本記事が情報の集約にとどまってしまった（自分のアプリ開発／開発を通じて得た知見を発信できなかった）ことは残念ですが、PWAがこれからもっと盛り上がって、Webアプリがより便利になれば嬉しいです。

ありがとうございました。
勉強のアウトプット　～ブラウザのローカルストレージ基礎編～

# はじめに
はじめまして。
某金融系会社でシステムテスト、ホームページのリグレッションテストを主に実施しています。
Qiitaはずっと読んでいるばかりだったのですが、やはりどの記事でも
**勉強したらアウトプットが大切！**
と仰っていたので、初心者もいいところですが、アウトプットの場として使わせていただければと思います。
投稿するのは恐らく`JavaScript`と`UiPath`についてが多くなると思います。
よろしくおねがいします。
それでは。
~~Twitterは自分からは載せません……ゲームの話ばかりで恥ずかしい~~

#そもそもなんでローカルストレージを学んだのか？
知るきっかけは、システムテストをしている際に、
>ローカルストレージを利用して、ユーザ設定値を保存している

という機能でした。
なんとなく聞いたことあるけれども、そういえばきちんと理解したことはないな、と思い調べてみました。
また、`Cookie`や`Session`についても、きちんと理解したことはなかったので
これを期にちゃんと勉強しよう、と思った次第です。

#ローカルストレージとは
>ローカルストレージとは、その名の通りではありますが、各ブラウザのローカルで保存するストレージのことです。

調べた際にそのように出てきて、そりゃそうだろうよ、となったので、もう少し調べて、自分なりに解釈してみました。

Qiitaでは、 @pipiox さんが書かれた
[CookieとWebStorageとSessionについてのまとめ](https://qiita.com/pipiox/items/95554673ba3b078ac112)
を参考にさせて頂きました。有り難うございます。

1. 情報をユーザのブラウザに保存しておく機能
2. "key":"value"という、keyに対応したvalueが1セットで保存される
3. どちらも文字列でのみ保存される
4. 自分で明示的に削除しない限り、半永久的に保存される
5. サーバとのやり取りは発生しない

というのがローカルストレージの特徴でしょうか。

#実際に、どうやってローカルストレージにアクセスするのか
JavaScriptの簡単なコードによってアクセスが可能です。

###ローカルストレージにセットするとき
***localStorage***プロパティの***setItem()***メソッドで値をセットします。

```js:SetItemTest.js
localStorage.setItem(key, value);
```

###ローカルストレージから値を取得するとき
***localStorage***プロパティの***getItem()***メソッドで値を取得します。
戻りはvalueに保存している文字列です。

```js:GetItemTest.js
localStorage.getItem(key);
```

###ローカルストレージの一つの値を削除するとき
***localStorage***プロパティの***removeItem()***メソッドで値を削除できます。
keyに対応するもののみを削除します。

```js:RemoveItemTest.js
localStorage.removeItem(key);
```

###ローカルストレージすべてを削除するとき
***localStorage***プロパティの***clear()***メソッドで値を削除できます。
removeItem()と違い、こちらはすべて削除します。

```js:ClearTest.js
localStorage.clear();
```

---

以上になります。
valueにセットする際、オブジェクトを渡すこともできるそうなのですが、
私はまだどうすればよいかわからず…。

今回ローカルストレージで簡単なToDoリストを作ってみようと思ったのもありますので、
不要かな、と……。

ゆくゆくはしっかり調べて使えるようになりたいな、とは思います！
お読み頂き、ありがとうございました！
CentOS 6.5でIUS Community Project リポジトリ追加ができなかったときの対処方法

[前回の同タイトル記事](https://qiita.com/usyuuu/items/384b852576bb4e553be4)で書いた記事のやり方では、CentOSのバージョンが変わってしまう事が分かった。
今回はCentOS6.5のままで、IUSリポジトリを追加する方法を書く。

## IUSリポジトリを追加できなかった時の環境
-  CentOS6.5（VirtualBox）
    - インストール直後の状態
    - ネットワーク設定はひと通り完了済み
- 打ちたかったコマンド=`# yum install -y https://centos6.iuscommunity.org/ius-release.rpm
`

##　やるべき事
<font color="Red">**firefoxのアップデートを行う**</font>

`sudo yum update firefox
`

これを打つだけでOK！

##　IUSリポジトリの追加が失敗していた理由
firefoxのSSL証明書が古かった。
CentOS6.5をインスコしたばかりの状態だとSSLが古くて失敗するようです。

##　終わりに
今回firefoxをアプデする事に気づいたのも、エラー文章を一つ一つ確認した事が大きかった。
今後も何か起こっても、冷静にエラー文章を読んで原因を突き止めよう！

## 参考
[CentOSのバージョンをアプデして解決する方法](https://qiita.com/usyuuu/items/384b852576bb4e553be4)
[IUSリポジトリを追加してpython3.4をインスコする記事](https://qiita.com/f-akazawa/items/5ec741f8a5cca999d7b3)
プライベートリポジトリをパスワードで限定公開するアプリを作った

GitHubのプライベートリポジトリを不特定多数に公開したい時ってありません？　私はあります、書類選考など。
不特定多数だから一人一人招待は無理だし、パスワード認証程度でいいんだけどなあと思いながら、
GitHubの設定でどうにかできないかと調べてみたんですが、ダメですね、なかったです。かなしいです。

クソみたいなリポジトリなんてどうせ誰も見ないんだからパブリックにしちゃえば？と思われるかもしれません。
パブリックはなんか嫌だし、私が作ったものはクソじゃないし、百歩譲ってクソだったとしても<b>自分のクソを全世界に公開する趣味はないです</b>。

なので作りました。他になさそうだったので。

http://35.233.244.144/
(クリックしても飛べない場合URLをコピーしてみてください)

[GitHubのリポジトリはこちら](https://github.com/simoyama1333/git_limited_access)

![ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29223/1ea8b573-3e74-3592-c65c-22349c44d315.png)

MineSweeper3Dのみパスワード公開してます。「unity」

# これなに？

Webアプリケーションです。
使用技術は
フロント:React
サーバー:Golang echo
DB:Mongo
これはGCEのインスタンスの中のDockerで動いてます。
Webサービスではないので自分のリポジトリに適用させる場合はサーバー立ててCloneして云々が必要です。

#### なぜWebサービスにしなかったのか

これはGitHubのアクセストークンを使用し、プライベートリポジトリを取得してきています。
悪意のある運営者であれば、サービスを使用した人のプライベートリポジトリを取得できます。
それって気持ち悪くない？　私だったら利用しません。なのでWebサービスにはしませんでした。

### どのように動いているのか

GitHub APIではアクセストークンを使用してリポジトリのファイルを取得できます。トークンは生成する必要があります。
`https://api.github.com/repos/ユーザー名/リポジトリ/contents?access_token=トークン`
みたいな。最初のディレクトリしか出ないので全て取得するにはディレクトリかを判別して再帰的に繰り返す必要があります。

サーバーを立てる前にGolangで対象のリポジトリをクローリングするところから始まります。
`./repo -repo yourrepo -expire 2020-02-02 -password yourpassword`
こんなコマンドをサーバー内で実行します。
これはプロジェクトのファイル一覧を再帰的に取得してDBに入れています。

あとはサーバーを立ててパスワード認証をして、認証に成功したらファイルを表示させてます。
ファイルは逐一GitHub APIを介してます。
用途としては、プライベートリポジトリの完全なミラーが目的ではなく、パスワード認証して限定公開が主目的だからです。
コマンド実行時のディレクトリ構造を保存し、そのパスをもとにファイルにアクセスしています。

全体的に難しいことはしてません。

![ss2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29223/92f3fe1f-4f39-20c9-f01a-a272c7d1ee3d.png)

# まとめ

本当に技術的に気になりましたらソースを見てください。
私のようにプライベートリポジトリを限定公開したいという人がいましたら、これを使うなり、使わなくともこれが参考になればと思い、記事をしたためました。
調べても同様のものが見つからなくて絶望した過去の私のような人間が一人でも救われるのであれば幸いです。
名前が日本語のファイルをrsyncでコピーする方法

#前提条件
まず最初に、homebrewがインストールされている必要がある。

#方法
```
brew install rsync libiconv
```
これだけ。
あとは、普通にrsyncをすればいい。

#追記
Ubuntuの場合
```sudo apt install rsync libc6-dev```

#例
rsyncを使って、testディレクトリをsubmitディレクトリへコピーする。

```
rsync -av test submit
```
勉強記録　2日目 - Effective C++ 第3版 -

#　はじめに
コメントなどありがとうございます。
引き続きやっていきます。
今回行うのは、C++の指定子 explicit についてです。

# Effective C++ 第3版 - イントロダクション -
## C++の指定子 explicit 

explicitとは？
C++で、暗黙の型変換を禁止する機能(指定子)です。

暗黙の型変換とは？
コンパイラが勝手にこうだろと認識して変換し、コンパイルすること。

下にクラスのコンストラクタにexplicit指定子を使った場合と使ってない場合のサンプルコードを示します。

下のサンプルコードでコンパイラが暗黙の型変換をしている箇所は、
```
ClassB2 test4 = 6;
```
の部分です。
どのようにコンパイラが認識しているかというと、
```
ClassB2 test4 = ClassB2(6);
```
のように認識して、コンパイルしています。
つまり、explictなしで宣言されたコンストラクタは、予想外の型変換を引き起こすので、一般的には、explict付きで宣言されたコンストラクタのほうが良い。
したがって、特に理由がないならexplictを付けるように心がけようかと思います。
ちなみに、explictありで宣言されたコンストラクタのクラスを呼ぶ場合、
```
ClassB   test3 = 5;
```
のようにクラスを呼び出すと、コンパイルエラーとなります。

### サンプルコード
```cpp:intro_default_constructor2.cpp
#include <iostream>

class ClassB {
 public:
  explicit ClassB(int a) { std::cout << __func__ << " 引数 : " << a << std::endl; };  // デフォルトコンストラクタではない
  ~ClassB(){};
};
class ClassB2 {
 public:
  ClassB2(int a) { std::cout << __func__ << " 引数 : " << a << std::endl; };
  ~ClassB2(){};
};

int main(int argc, char *argv[]) {
  std::cout << "intro_default_constructor2.cpp" << std::endl;
  ClassB  test(3);
  ClassB2 test2(4);
  // ClassB   test3 = 5; // コンパイルエラー
  ClassB2 test4 = 6;
}
```
### 実行結果
![intro_default_constructor2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367151/50c800ff-6326-b1a8-e70c-5ade5281770d.png)

## 参考文献
・https://www.amazon.co.jp/gp/product/4621066099/ref=dbs_a_def_rwt_hsch_vapi_taft_p1_i0
GitHubリモートリポジトリをローカルにcloneする

自分のGitHubリポジトリをローカルPCにcloneする方法をまとめる。

##前提条件
・GitHubアカウント取得済み
・Windows PCにgit for Windowsをインストール済み。（Macでもだいたい一緒かと思う）

##Git Bashを起動
Windowsメニューから**Git Bash**を起動。
※スタートメニューの検索でgitと入れれば出てくるよ。

![002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529867/bce62e0d-35e1-f154-08ad-fec5dbc4d396.png)

##ローカルリポジトリ格納先に移動
cd コマンドでGitHubのリモートリポジトリを複製する、ローカルリポジトリ格納先を決めてカレントディレクトリにする。cloneするとリモートリポジトリのトップディレクトリごと生成されるので一つ上のフォルダに移動すればよい。

ここでは一つ上の階層のフォルダ**repo**を作成して、カレントディレクトリにしておく。

![003.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529867/2801887c-cea1-d973-c790-d3f78dd694c0.png)

##GitHubリポジトリのURLをコピー
ブラウザでGitHubリポジトリのページを開く。

GitHubリポジトリを選択し、**clone or download**（緑色）のプルダウンを選択。
httpsのURLが出てくるので、URL右側のコピーボタンを押し、クリップボードにコピーする。

![001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529867/99ddb0cd-143a-11f5-af81-340a6cccaf70.png)

##Git Bashでcloneコマンドを実行
コピーしたURLをgit cloneコマンドの引数に指定して実行する。
sshも指定可能だが、ここではhttpsのURLを指定。

```
git clone https://github.com/kanazwk/dev.git
```

実行例：
![004.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529867/b10079e2-37ab-5634-0c4f-ef2c98c22a02.png)

##cloneされたことの確認
GitHubリポジトリのトップディレクトリ（この例ではdevディレクトリ）が出来ていることを確認。

![005.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529867/a97f99c0-f8d0-585d-a056-f8a8e1bab828.png)

ls -laで見てみる。
.gitフォルダが生成され、コードがローカルに複製されたことを確認できる。
![006.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529867/be4109bb-e4cd-ea95-791f-301300896313.png)

##cloneしたローカルリポジトリをcommitし、pushしてみる
QIITAARTICLE.txtファイルを作成し、GitHubリモートリポジトリにpushする。

ファイルを作成：
![007.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529867/add521c5-ca20-dee4-66ef-7838828d2e61.png)

commitしてpush：
![009.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529867/a2e0ddf5-d0ce-ab3c-724f-67cdf93185d2.png)

※githubのユーザID、パスワードが求められるので入力する。

Webで見ておくとGitHubに上がっていることが分かる。
![010.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529867/b38d7da0-638d-0c16-050c-b67224e2a342.png)
さくらVPSでSSH接続が出来なくなった

<h1>はじめに</h1>
セキュリティがいい加減甘すぎるなぁ、と思ってたがそのままにして過ごしていたある日
なんかサーバーに接続できなくなってる？？と気づいたので、今更だがセキュリティを高める。

<h2>やったこと</h2>

１．SSH接続のポート番号をデフォルトの22から変更。
２．公開鍵認証でログイン。

<h2>困ったこと</h2>
<h3>SSH接続が出来ない！！！！！</h3>
～以下設定したこと～

```
$ vi /etc/ssh/sshd_config
...
#Port 22
Port ××××
...

$ /etc/rc.d/init.d/sshd reload
```
変更内容リロードしたのに「ホストに接続できません」って出る。
なんで？？調べたらファイアウォールiptables修正していなかった。
（ポート変えたのに、iptablesで新しいポートを許可していなかったから！）

<h2>解決策</h2>

```

$ vi /etc/sysconfig/iptables
...
#-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport ×××× -j ACCEPT
...

$ /etc/rc.d/init.d/iptables restart
```

これで動いた。
あとは鍵認証の設定だけ！
サーバーのこと、まだよく知らないんだなと痛感した出来事だった。
精進します！

<h2>環境</h2>
SAKURA VPS
CentOS 6.10
cometchatの日本語対応について

みなさん、[cometchat](https://www.cometchat.com/)ってご存知でしょうか？

cometchatとはチャットAPI&メッセージSDKで、自分のWebサイトに簡単にチャット機能が設置できます。

私はこのcometchat pro(cometchatのもっと柔軟に扱えるサービス）のAPIを使って自分のサイトにチャット機能をつけました。
（[こちら](https://prodocs.cometchat.com/v1.8/reference#send-messages)を元にpython(Django)で実装しています。）
しかし完成後、悲劇が起こります。

　　

cometchatで日本語のテキストが送れない。。。。
私のサイトは日本語
<img src="https://3.bp.blogspot.com/-o923r-dReJA/V0Qnltw4f-I/AAAAAAAA68s/xvpxp_idWzEHjBLB1F4X75ctAKASMWEGACLcB/s800/pose_zetsubou_man.png" width=200px>

サイトがインターナショナルになってしまった訳です。  
  
  
　　


公式ドキュメントには「日本語も対応しているよ！」と書いてありますが、
実際日本語でメッセージ送ろうとすると以下のエラーが出ます。

```
UnicodeEncodeError: 'latin-1' codec can't encode characters 
in position 90-92: Body ('あああ') is not valid Latin-1. 
Use body.encode('utf-8') if you want to send it encoded in UTF-8.
```


Use body.encode('utf-8')←上記のエラーでこれ試せばいいって教えてくれてますが、
試すとERR_BAD_REQUESTが返ってきます。


```
{"error":{"code":"ERR_BAD_REQUEST","details":{"receiver":["The
 receiver field is required."],"receiverType":["The receiver 
type field is required."]},"message":"Failed to validate the 
data sent with the request."}}
```


## 解決方法

メッセージを送る時。
byteにして16進数文字列に変換する。

```python
text = "送りたいメッセージ"
text.encode().hex() 
# 'e98081e3828ae3819fe38184e383a1e38383e382bbe383bce382b8'
```

メッセージを受け取る時。
16進数文字列をbyteに変換、byteをstrに変換する。

```python
bytes.fromhex(text).decode()
# "送りたいメッセージ"
```
　　　　
　　

※一応公式サイトには日本語も対応していると書いているので、
もしかしたら普通に送っても問題ない可能性があります。
メモ

<img width="285" alt="スクリーンショット 2019-11-25 23.00.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302540/ace2e480-5731-b4c6-eacf-a9415e9b8dcb.png">
<img width="253" alt="スクリーンショット 2019-11-25 23.00.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302540/67954d52-3950-d1be-1cd8-d57321ce5699.png">


可変である上のlabelのオートレイアウトはwide上下左右に付与

<img width="285" alt="スクリーンショット 2019-11-25 22.59.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302540/2d7f7c03-1c0d-3e00-84bb-3523d086c2a8.png">

下のlabelはwide高さ左右に付与
下のオートレイアウト は付与しない

#全体のコード

```swift
 func view() {
        let view1 = CustomView.init(frame: CGRect(x: 0, y: 0, width: 200, height: 591))
        view1.test.text = "あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ"
//        view1.test.sizeToFit()
        
        let height = view1.test.sizeThatFits(CGSize(width: view1.test.frame.size.width, height: CGFloat.greatestFiniteMagnitude)).height
        view1.test.heightAnchor.constraint(equalToConstant: height).isActive = true
        
        view.addSubview(view1)
```
Blazorで未ログイン時にログインページにリダイレクトする

# 概要
Blazorで未ログイン時にログインページにリダイレクトする方法のメモ。
試しているのはClident-side版ですが、恐らくServer-side版でも動くと思われます。

# 背景等
Blazorではログイン時、未ログイン時に表示するページの認証制御機能などが標準機能として提供されています。[(参照)](https://docs.microsoft.com/ja-jp/aspnet/core/security/blazor/?view=aspnetcore-3.0&tabs=visual-studio)

これらの機能を組み合わせて、認証時にのみアクセス可能なページを作成可能です。
良く紹介されている例として、認証が必要なページに未認証な状態でアクセスした場合に、下記のような未認証状態と表示させる例があります。

```html:App.razor
<Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData">
  <AuthorizeRouteView RouteData="@routeData" 
            DefaultLayout="@typeof(MainLayout)">
    <NotAuthorized>
    　<h1>未ログインのため表示できません。</h1>
    </NotAuthorized> 
 </AuthorizeRouteView >
</Found>
</Router>
```

```html:Counter.razor
@page "/counter"
@attribute [Authorize]
@inherits CounterModel

<h1>Counter</h1>

<p>Current count: @CurrentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

```

App.razor内でAuthorizeRouteViewを定義し、未認証状態の場合にはNotAuthorized属性の内容を表示するようにします。

各ページのコンポーネントにAuthorize属性を付与することで、そのページは認証状態でしかアクセス不能になり、未認証時には上記のNotAuthorized属性の内容が表示されます。

しかしながら実際のウェブサイトでは、アクセス不可のページを表示するのではなく、ログインページにリダイレクトすることが多いと思います。
今回はその実現方法に関する紹介です。

# 実装方法

## コンポーネントの作成
ログインページにリダイレクトするrazorコンポーネントを作成します。

```csharp:RidirectToLogin.razor

@inject NavigationManager Navigation
@code {
    protected override void OnInitialized()
    {
        Navigation.NavigateTo("/Login", false);
    }
}

```

このコンポーネントはUI要素は持たず、コンポーネントの初期化処理(OnInitialized)でログインページへの遷移を行うだけの機能となります。


## コンポーネントの配置
作成したRedirectToLoginコンポーネントをApp.razorに配置します。

```html:App.razor
<Router AppAssembly="@typeof(Program).Assembly">
    <Found Context="routeData">
        <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
            <NotAuthorized>
                <RedirectToLogin />
            </NotAuthorized>
        </AuthorizeRouteView>
    </Found>
</Router>
```

これで、未認証時にはRidirectToLoginコンポーネントが実行され、ログインページにリダイレクトされます。


# 参考資料

https://docs.microsoft.com/ja-jp/aspnet/core/security/blazor/?view=aspnetcore-3.0&tabs=visual-studio
https://github.com/aspnet/AspNetCore/issues/13709
https://visualstudiomagazine.com/articles/2019/10/25/authorizing-users-in-blazor.aspx
picoCTF 2019 asm3 - Points: 300

#問題

https://2019game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/32954762-73c9-2663-aa2a-9edf142c23de.png)

#解いてみた

asm3(0xaeed09cb,0xb7acde91,0xb7facecd)のときの戻り値（eax）を求める問題です。

スタックの状態はこうでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/38134ec8-b832-f502-380b-aedf58d9c9f6.png)


ソースを見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/3d331f3a-85bd-13e7-d7bc-d994878f14d7.png)

eax、ax、ah、alが出てきたので一度表にしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/1486b4a3-10bb-a139-1072-6fb9b81a4b70.png)


```
<+3>:	xor    eax,eax
```

これはeaxを0にする処理です。

```
<+5>:	mov    ah,BYTE PTR [ebp+0xb]
```

ahにebp+0xbを代入する。
ebp+0xbは何かというとebp+0xcが引数2なので、その直前に2桁。
つまり引数1の一番左の2桁になるのでaeとなります。
BYTEなので2桁です。
ahはae。

```
<+8>:	shl    ax,0x10
```

axを0x10bit左にシフトする。
ax=0xae00なので左に16bitシフトするとax=0x0000です。

```
<+12>:	sub    al,BYTE PTR [ebp+0xe]
```

alから[ebp+0xe]を引く。
ebp+0xeはacなので0x00-0xac=FFF~FF54
ってなるんですけど、BYTEってことなので2桁。FFFの部分はたぶん無視して良さそうなので
al=0x54

```
<+15>:	add    ah,BYTE PTR [ebp+0xd]
```

ahに[ebp+0xd]をたす。
[ebp+0xd]は0xde、ah=0x00なので
0x00+0xde＝0xde

```
<+18>:	xor    ax,WORD PTR [ebp+0x12]
```

ax=0xde54
[ebp+0x12]=0xb7fa
0xde54 xor 0xb7fa = {flag}

ということでできました。
HTTPリクエストのヘッダフィールド「Host」について

[HTTP/HTTPSについて学んだことまとめ](https://qiita.com/katu_/items/97938eda9caf64d98fbc)にて
HTTP/HTTPSについて学んだことを書きとめたが、HTTPリクエストのヘッダフィールド「Host」について理解ができていなかったため、再度学習。簡単にメモります。

## Hostとは

- 1996年5月、HTTP/1.0が発表された
    - HTTP/1.0では、IPアドレスのみで相手を特定することができた
    - この頃、1台のサーバで複数のWebサイトを運用するのが主流（1つのサーバで複数のドメインを運用する技術のことをバーチャルホストという）
    - ある1台のサーバに「hoge.example.com」と「fuga.example.com」という2つの仮想Webサーバが存在しても、IPアドレスが同じであるため、リクエストされているWebサイトを判別することができなかった
- 1997年1月、HTTP/1.1が発表され、この時Hostヘッダが追加された
    - それぞれにIPアドレスを付与する方法も対策としてはあったが、IPv4の資源を無駄にしてしまうことになるので、Hostヘッダが追加された
    - Hostは、リクエスト先のサーバ名である
        - 例 hoge.example.com
        - ホスト名とドメイン名でサーバを表す
    - ある1台のサーバに「hoge.example.com」と「fuga.example.com」という2つの仮想Webサーバが存在しても、HostのおかげでリクエストされたWebサイトを判別できるようになった



## 参照
- [Hypertext Transfer Protocol - Wikipedia](https://ja.wikipedia.org/wiki/Hypertext_Transfer_Protocol) 
- [HTTP 1.1のHost:ヘッダーの保持](https://docs.oracle.com/cd/E48349_01/studio.300/studio_install/src/cidi_studio_reverse_proxy_preserve_host_headers.html)
- [ヘッダフィールドの一覧 - IT](https://www.atmarkit.co.jp/fnetwork/rensai/netpro01/header-fields.html)
新人が今後の業務効率化のために色々なTera Termマクロ作ってみた3(mailサーバーで使えるマクロ)

#今回の目的
今までの投稿のマクロを参考にしながらメールサーバーに使うと役に立ちそうなTeraTermマクロを作る。
###前回の記事の紹介
前回はlogの自動化やrootの昇格を自動化するマクロの作り方や説明をしています。[こちら](https://qiita.com/kunutomo22/items/7e4715e48c0cf5f38997)を見てからの方が理解が深まるかもしれないのでお勧めします。(テイのいい宣伝)
#早速マクロのコードを見てみる
```ruby:catmaillog.ttl
;接続情報
username = 'XXXX'                                          ;ログインするサーバーのユーザー名
rusername = 'root'                                         ;rootのユーザー名
hostname = 'XXX.XXX.XXX.XXX'                               ; ログインするサーバーのホスト名またはIPアドレス
passwdfile = 'passwd.dat'                                  ; パスワード暗号化ファイル
rpasswdfile = 'rpasswd.dat'                                ;rootアカウントのパスワード暗号化ファイル
portnum = '22'                                             ;port番号の指定
getdir dir                                                 ;Teratermマクロ配置ディレクトリを取得

;log directry
logdir = dir
strconcat logdir '\maillog\'

;there isn't logdirectry
foldersearch logdir
if result = 0 then
foldercreate logdir
endif

getpassword passwdfile username userpasswd                 ; パスワード暗号化ファイルからパスワード取得
getpassword rpasswdfile rusername ruserpasswd              ; パスワード暗号化ファイルからrootユーザーのパスワード取得

msg = hostname
strconcat msg ':portnum /ssh /auth=password /user='
strconcat msg username
strconcat msg ' /passwd='
strconcat msg userpasswd
strconcat msg inputstr

connect msg

;logfile information
getdate logdate '%Y-%m-%d_%H%M%S'
strconcat logname logdir
strconcat logname logdate
strconcat logname '-mail.log'

;create logfile
logopen logname 1 0

;comand
wait '$'
sendln 'su'
wait 'パスワード:'
sendln ruserpasswd
wait '#'
sendln 'cat /var/log/maillog'
wait '#'
disconnect 0

end
;マクロ仕様============================================================================================
;一般ユーザーとしてログインする。
;初回ログイン時は一般ユーザーのパスワードとrootユーザーのパスワードを打ち込む必要がある。
;maillogはttlファイルの保存されているフォルダのmaillogというフォルダに保存する。なければ自動でフォルダを作る。
;maillogのファイル名はYYYY-MM-DD_HMS.log
;maillogは特殊文字の表示有り
;maillogを完全に取り終わったら自動でTeraTermを終了する
```

今回は前回の投稿と違う部分は少ししかない。
`end`から上四行が違う部分なのだが、`sendln 'cat /var/log/maillog'`の行はただ単にやりたいコマンドの文字列を送っているだけである。
今回のポイントは`disconnect 0`である。

#disconnectの仕様
disconectはここでは0というオプションを指定している。
このオプションをつけないと、いったん本当に切断するか聞かれるダイヤログが表示される。

#次回予告
今回はdisconectの解説だけで終わってしまって、このシリーズもそろそろネタ切れとなってしまいそうなのだが、次は初期設定値の確認に使えるマクロを紹介する。
How to run rake with rspec with Rails ( anti LoadError:  Can't find ) ( use rake_require and invoke )


# rake

`/app/lib/tasks/foo/bar.rake`

```rb
namespace :foo do
  task bar: :environment do |task|
    SomeClass.run
  end
end
```

# rspec


```rb
require "rails_helper"
require "rake"

describe do
  before(:all) do
    @rake = Rake::Application.new
    Rake.application = @rake

    # This line require file e.g '/app/lib/tasks/foo/bar.rake'
    Rake.application.rake_require('bar', [Rails.root.join('lib', 'tasks', 'foo')])

    Rake::Task.define_task(:environment)
  end

  before(:each) do
    @rake[task].reenable
  end

  describe  do
    # Do not use dot
    # BAD CASE : foo.bar 
    let(:task) { 'foo:bar' }

    it do
      expect(SomeClass).to receive(:run)
      @rake[task].invoke
    end
  end
end
```

# Doc


https://apidock.com/ruby/v1_9_3_392/Rake/Application/rake_require

>File lib/rake/application.rb, line 452

```rb
def rake_require(file_name, paths=$LOAD_PATH, loaded=$")
  fn = file_name + ".rake"
  return false if loaded.include?(fn)
  paths.each do |path|
    full_path = File.join(path, fn)
    if File.exist?(full_path)
      Rake.load_rakefile(full_path)
      loaded << fn
      return true
    end
  end
  fail LoadError, "Can't find #{file_name}"
end
```

# Ref

[Rspecでrake taskをテストする方法　 - Qiita](https://qiita.com/geshi/items/4ea8e88a4e82c0934371)
[Rakeタスクのテストの仕方 - Qiita](https://qiita.com/kawakubox/items/26cf71a14bd5827175f6)
[[Ruby on Rails]RSpecによるRakeのテスト ｜ Developers.IO](https://dev.classmethod.jp/server-side/ruby-on-rails/ruby-on-rails_rspec_rake_test/)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2768








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Python　Scikit-learn　線形回帰分析　非線形単回帰分析　機械学習

Pythonでcsvデータを読み込んで線形回帰と非線形回帰を実施する方法について書きます。
windows10環境でPythonのverは3.7.3です．


コードは以下になります．

◆csvデータを読み込んで線形単回帰分析

```python
import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
 
#変数
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
 
#y軸csvデータ読み込み
data = pd.read_csv('cp.csv') 
y = np.array(data)#配列化
y = y.reshape(-1,)#次元変更(2から1次元)
 
#日付のx軸を作成
x = pd.date_range('2019-08-30 00:00:00', periods=16, freq='d')
x1=np.arange(16)
x2 = [[x1] for x1 in x1]
 
#線形単回帰
from sklearn import linear_model
clf = linear_model.LinearRegression()
clf.fit(x2,y) # 予測モデルを作成
 
print("回帰係数= ", clf.coef_)
print("切片= ", clf.intercept_)
print("決定係数= ", clf.score(x2,y))
 
#グラフ作成
ax.plot(x2,y,'b')
ax.plot(x2, clf.predict(x2),'k')
 
#グラフフォーマットの指定
plt.xlabel("Days elapsed")#横軸ラベル                    
plt.ylabel("plice")#縦軸ラベル
plt.grid(True)#目盛表示                 
plt.tight_layout()#全てのプロットをボックス内に
 
plt.show()
```



◆csvデータを読み込んで非線形単回帰分析

```python
import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
 
#変数
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
 
#y軸csvデータ読み込み
data = pd.read_csv('cp.csv') 
y = np.array(data)#配列化
y = y.reshape(-1,)#次元変更(2から1次元)
 
#日付のx軸を作成
x = pd.date_range('2019-08-30 00:00:00', periods=16, freq='d')
 
#非線形回帰次数
x1=np.arange(16)
fit = np.polyfit(x1,y,5)
y2 = np.poly1d(fit)(x1)
 
#決定係数
from sklearn.metrics import r2_score
print(r2_score(y,y2))
 
#予測
x_30 = np.poly1d(fit)(30)
print(x_30)
 
 
#グラフ作成
ax.plot(x,y,'bo')
ax.plot(x,y2,'--k')
 
#グラフフォーマットの指定
dayｓ = mdates.DayLocator() 
daysFmt = mdates.DateFormatter('%m-%d')
ax.xaxis.set_major_locator(days)
ax.xaxis.set_major_formatter(daysFmt)
plt.xlabel("date")#横軸ラベル                    
plt.ylabel("price")#縦軸ラベル
plt.grid(True)#目盛表示                 
plt.tight_layout()#全てのプロットをボックス内に
 
plt.show()
```


回帰分析の技術説明と各コードの詳細な解説はこちら(´・ω・`)☟☟☟
https://kgrneer.com/python-numpy-scikit-kaiki/

重回帰についても勉強中です。
【QA】標準化について

# 概要

QAとしてソフトウェア開発の品質保証に携わる中で感じた、「誤った標準化」と「効果的な標準化」について筆者の考えをまとめた。
本記事では主に「標準プロセス」と「標準観点」について筆者の意見をまとめている。

なお、基本的な説明がない限りは、日本のWeb業界（アジャイル開発）に対する品質管理を想定した記述とする。
Web業界に関わらず、標準化について様々な意見やご指摘等を頂けたら嬉しい。



# 標準化とは？

まず、標準化について筆者の考えを共有する。一般的な標準化については下記のリンクを参照。

[JSA:用語集「標準化とは」](https://webdesk.jsa.or.jp/common/W10K0500/index/dev/glossary_1/)

ソフトウェア開発の品質保証に関しては、従来の標準化とは違う考え方が必要ではないかと考えている。
その理由としては、IT業界では日々新しい技術が生まれ進歩し続けているため、標準化により「統一した規格」や「一定の品質」を実現できたとしても、その規格や品質レベルが新しい技術に適用できる保証はない。

特にWeb業界では新しい技術をいかに活用できるかがサービスを成長させる必須条件とも言える。そのため従来の標準化の考えでは新しい技術へのチャレンジや成長の機会を阻害してしまう可能性があるためだ。

筆者が考えるソフトウェア開発の品質保証における標準化の目的とは**車輪の再発明を防ぐ**ことだと考える。



# 「誤った標準化」とは？

標準化に対して筆者が経験した誤った標準化を２つ紹介する。

#### 1. マニュアル化した標準プロセス
残念ながら、どんなに素晴らしい標準プロセスを考えたとしても、開発の現場ではプロセスが守られない場合が多々発生する。
   標準プロセスをマニュアル的に運用してしまった場合、ルールが増えて単純に各担当者に追加作業が発生するだけになってしまう結果に落ち入りやすい。
   新規参画者や経験が浅いメンバには有効な場合もあるが、効果のある範囲が作成コストや運用コストを上回る場合は少ない。

#### 2. 使用方法がわからない標準観点
膨大な量の観点をまとめた標準化観点をよく見かけるが、ほぼ全ての担当者が標準観点をどのように使用するか把握できていない。
   レビューや観点漏れのチェックに使用するなどの使用方法が話される場合もあるが、筆者は活用されている状況をあまり見たことがない。
   設計スキルがなくても設計(観点作成)ができることを目的としているはずが、必要な観点を選択するために設計スキルが必要となってしまっている。



# 「効果的な標準化」とは？

続いて、筆者が効果的と感じている標準化について２つ紹介する。

#### 1. 標準プロセスはツール
マニュアル的なルールとして標準プロセスを設定するのではなく、プロジェクトの方針や方向性を共有できるツールとして設定する。 
フロー図のような見える化も大切だがフロー図だけでは利用方法の具体性に欠けるため、WBSのように担当者が直接利用可能なドキュメント化（仕組み化）まで行うことが重要だ。
標準プロセスのまま対応できる場合では各担当者ごとに同じことを考える時間を削減できる。標準プロセスを単純に利用できない場合こそ、担当者が頭を使って考えなければならない重要な仕事だ。
また、振り返りを行う時にも標準プロセスは重要な役割を持つ。単純にプロセスを守れなかったことを問題としてあげるのではなく、プロセスを守らないと判断した理由や、そもそも適切な判断がされていたのかを検討することが重要だ。更に言えば、プロセスを守っていた部分に対しても、プロセスを守った故に発生した問題がないかも検討し、必要に応じて標準プロセス自体の変更も検討する。標準プロセスを基準として「あるべき姿」を描き、現状との差分から本当の問題が明確にできる。

#### 2. ナレッジを抽出した標準観点
観点の考慮漏れゼロという理想を追いかけて、使用するかも分からない標準観点を大量に作成するよりも、検証対象の検証範囲の中で共通する観点を洗い出し、標準観点として開発メンバーに共有する方が効果が高い。
例えばページネーションの機能はほとんどのWebアプリケーションで利用されているが、別アプリどころか同一アプリの設計でも画面が違うだけで設計担当者が異なり、それぞれがページネーションの設計を行っているような状況は度々発生している。車輪の再発明を行わないように、共通する観点を標準観点としてチーム内で共有することは、１つ１つの観点で見ると大した工数ではないが、観点が増え共有するメンバーの増えていくと決して無視できない効果が出てくる。
また、標準観点は工数削減だけではなく、観点や項目の粒度の統一にも効果がある。
案件によって要求される品質や開発体制が異なるため、ほとんどの場合で観点や項目の粒度にバラツキが発生する。標準観点では全ての観点を網羅できていなくても、ある程度設計範囲内に該当する標準観点があるだけで、粒度のバラツキを抑える効果がある。



# 最後に

具体的な使用方法を考慮されずに作成されている標準化はほぼ現場では活用されない。効率化を行うことが標準化の目的のはずが、標準化を行うこと自体が目的となっていて手段と目的が逆転している。
最初から大規模な標準化を行うのではなく、効果範囲は小さくても具体的な目標や運用が明確にできる範囲でスタートすることが大切だと感じている。

今回の標準化に対する考え方は、筆者の経験した環境において効果的であると考えた内容であり、効果の低いと表現した標準化についても、最適な対応となる環境は存在すると思う。

筆者の考えが読者の方々に少しでもプラスになれば嬉しい。また、意見やアドバイス等のコメントを頂くことで、筆者も一緒に成長させて頂きたい。

反対意見については単純にダメだなどのコメントだけではなく、何故ダメなのか？どうしたら改善できるのか？
前向きな反対意見を頂けると大変嬉しい。（賛成コメントは簡単でも良いので頂けるだけで嬉しい）
#Rails + #rspec で rake を実行する方法を毎回忘れるので書き留めておく ( LoadError: Can't find 対策 )

# まとめ

- 公式なやり方ではなく、あくまで内部メソッドやらをHackして利用するやり方っぽいので煩雑で使いにくいことは心える
- rake_require で元のrake fileさえloadできたら勝ち
- rake_require ではタスク名でも階層でもなく、単にファイル名とディレクトリパスを与えているところがポイント
- 一度rake file をrequireしてしまえば、task invoke できる
- うまくrequireできない場合は `Rake.load_rakefile` など内側のメソッドを使って、パスが正しいかどうかひたすらチェックせよ

# rake

`/app/lib/tasks/foo/bar.rake`

```rb
namespace :foo do
  task bar: :environment do |task|
    SomeClass.run
  end
end
```

# rspec


```rb
require "rails_helper"
require "rake"

describe do
  before(:all) do
    @rake = Rake::Application.new
    Rake.application = @rake

    # This line require file e.g '/app/lib/tasks/foo/bar.rake'
    Rake.application.rake_require('bar', [Rails.root.join('lib', 'tasks', 'foo')])

    Rake::Task.define_task(:environment)
  end

  before(:each) do
    @rake[task].reenable
  end

  describe  do
    # Do not use dot
    # BAD CASE : foo.bar 
    let(:task) { 'foo:bar' }

    it do
      expect(SomeClass).to receive(:run)
      @rake[task].invoke
    end
  end
end
```

# Doc


https://apidock.com/ruby/v1_9_3_392/Rake/Application/rake_require

>File lib/rake/application.rb, line 452

```rb
def rake_require(file_name, paths=$LOAD_PATH, loaded=$")
  fn = file_name + ".rake"
  return false if loaded.include?(fn)
  paths.each do |path|
    full_path = File.join(path, fn)
    if File.exist?(full_path)
      Rake.load_rakefile(full_path)
      loaded << fn
      return true
    end
  end
  fail LoadError, "Can't find #{file_name}"
end
```

# Ref

[Rspecでrake taskをテストする方法　 - Qiita](https://qiita.com/geshi/items/4ea8e88a4e82c0934371)
[Rakeタスクのテストの仕方 - Qiita](https://qiita.com/kawakubox/items/26cf71a14bd5827175f6)
[[Ruby on Rails]RSpecによるRakeのテスト ｜ Developers.IO](https://dev.classmethod.jp/server-side/ruby-on-rails/ruby-on-rails_rspec_rake_test/)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2767








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Linux サーバ設定

Linuxは、1つのマシンへ複数のユーザーが同時にログインして
操作することを前提として作られているので
他のユーザーから編集できないようにする設定について書きます。

# ユーザーの設定
ユーザーは基本一般とrootに分けられています。
ファイルに対して権限レベルの違があります。

SSHでリモートサーバにログインするときにユーザー名を指定してログインすることで
リモートサーバでの権限を調整することができます。

rootユーザーはサーバ上の全てのファイルの閲覧することができ
すべてのコマンド実行することができるので
SSHを使ってrootユーザーを使うことは避けましょう。

```bash
$ ssh root@ex.com
$ ssh gimei@ex.com
```

## 一般ユーザー
一般ユーザーは自分の許可されているファイルしか操作できません。

## rootユーザー 
root ユーザーには他のユーザーが所有するファイルも含めて、全ての制御権限があります。

# 管理者権限
一時的に管理者権限が必要になることや
サーバ内の他のユーザーに代わってコマンドを実行する必要な時のコマンドです。

## sudo
現在のユーザーのまま他のユーザーに成り代わってコマンドを実行することができます。
ただし予めsudoが使える権限がそのユーザーに付与されている必要があります。
 
## su
他のユーザーにログインし直す事ができます。
このコマンドはいつでも使うことができますが、成り代わろうとしているユーザーのパスワードが必要です。

# 所有者
ファイルには、その持ち主がいます。その持ち主を所有者と呼びます。
ファイルを作成すると、作成したユーザーがその所有者として設定されます。
所有者にだけ書き込み権限を与えておけば、そのファイルを他のユーザーに変更される心配はありません。

# パーミッション
ファイル、またはディレクトリに対して「誰にどのような操作を許可するのか」という権限を規定した情報のことです。

所有者、その他のユーザーのそれぞれに対して、読み込み(r)、書き込み(w)、実行(x)
の権限を与えるものになります。

##r(read) 読み込み権限
ファイルを開いて中身をみれる

##w(write) 書込み権限
ファイル記述の追加と変更ができる。

##x(execute)　実行権限
ファイルを実行、ディレクトリを開くことができる。

## 権限の確認
権限の確認はls -l [権限を確認したいファイルのパス]で確認できます。

```bash
$ ls -l [権限を確認したいファイルのパス]

例
$ ls -l projects/sample

出力結果
drwxr-xr-x  01 taka  main      748  1 01 12:12 sample
```

「誰にどのような操作を許可するのか」というのは、ターミナルに出力される
「 rwx r-x r-x 」の部分で確認できます。

下記に格項目を書くと

### 所有者
1桁目が、マスター権限を持っているユーザー。
読み込み権限(r)・書き込み権限(w)・実行権限(x)が可能です。

### グループユーザー
2桁目がグループに属しているユーザー
読み込み権限(r)・実行権限(x)が可能です。

### 一般ユーザー
3桁目がその他のユーザー
読み込み権限(r)・実行権限(x)が可能です。

## 権限の数値の意味　r＝4、w＝2、x＝1
それぞれの権限には、r＝4、w＝2、x＝1 という数字が割り当てられています。
アクセス権限は、3桁の数字で表されます。
一桁ずつが権限を与える所有者、グループ、そして一般ユーザーを表しています。

1桁目が、マスター権限を持っているユーザー。
2桁目がグループに属しているユーザー。
3桁目がその他のユーザーです。
マスター権限とは、ファイルやディレクトリの所有権のことです。

そして、それぞれの桁の数字は、各ユーザーが所有しているアクセス権限の数値を足し合わせた値になります。

例えば、755という値について見てみましょう。
一桁目の7がr＝4、w＝2、x=1の合計になっていますね。
つまり、マスター権限を持っているユーザーが、読み、書き、実行、の全てを行うことができるという意味になります。

二桁目と三桁目は、共に5となっています。これは、r ( = 4 ) + x ( = 1 ) の合計ですので
つまりグループに属しているユーザーと、属していない一般のユーザーには、ファイルの読み込みと実行はできるけれど書き換える権限が与えられていないということになります。

## 権限の変更

### chmod
アクセス権限を書き換えるためのコマンドです。
chmod [与える権限の種類] [権限を行使する主体]

```bash:例
$ chmod 777 sample/pictweet
```

権限の数値の意味より
7は全権限を許可するという意味で
3桁ともなってるいるということは

全てのユーザーに全権限を許可するという意味です。

### chown
ファイルやディレクトリの所有者を変更するコマンドです。
chown [所有者][ファイル名・ディレクトリ名]という構成で入力します
アノテーションとは？

#はじめに
今回はJavaのアノテーションについて。
知っているようで知らない（？）アノテーションの意味やメリットを簡単に整理するという、ただのメモ。

#アノテーションってなに？
+ Annotation ＝ 注釈 の意。
+ コード中に "@" を使って記述する。
+ たとえば、以下のようなコードになる。

```java
package hoge.nwobhm;
 
public class Metallica {
    @Override
    public String playMetal() {
        return "riff";
    }
    public static void main(String[] args) {
        Metallica metal= new Metallica ();
        System.out.println(metal.playMetal());
    }
}
```

#例えばどんなものがあるの？
具体的には以下のようなものがある。

+ Override　：　オーバーライドメソッドであることを宣言する。
+ Deprecated　：　クラスやメソッドを非推奨にする。
+ SuppressWarnings　：　コンパイル時の警告抑制。

また、アノテーションは３つの種類に分けられる。
　１．マーカー　：　名前だけでデータのないもの
　２．単一アノテーション　：　データをひとつ持つもの
　３．フルアノテーション　：　複数のデータを持つもの

#決められたものしか使えないの？
+ アノテーションは独自実装することができる。
+ "@interface"を指定して実装する。
+ たとえばこんな感じ。

```java
package hoge.nwobhm;

public @interface Megadeth {
    String value();
}
```

#使うメリットは？
+ アノテーションはコンパイル対象のため、コードが統一できる。（コードが見やすくなる）
+ アノテーションは独自実装できるため、活用の幅は広い。

#参考
+ [@IT いまさら聞けない「Javadoc」と「アノテーション」入門](https://www.atmarkit.co.jp/ait/articles/1105/19/news127.html)
+ [Samurai blog 【Java入門】アノテーションの使い方と作成する方法](https://www.sejuku.net/blog/22694)
Xiaomi Mijia Bluetoothを使用した温湿度ロギング環境構築

# Xiaomi Mijia Bluetoothを使用した温湿度ロギング環境構築
AliExpressで入手した格安温湿度計を使った温湿度ロギング環境構築方法。
![xiomi.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457056/75860452-c66e-35a5-9add-b195316e4896.jpeg)

## 環境
Debian 9.8
mysql  Ver 15.1 Distrib 10.1.37-MariaDB
MySQL Workbench 8.0
Power BI Desktop

Raspberry Pi Zero W
Xiaomi Mijia Bluetooth　2個、1個あたり1300円くらいかと。
dynabook EX/56LWH、Windows10 Home 64bit

## 方針
Raspberry Pi Zero WとXiaomi Mijia Bluetooth　2個をBluetoothでペアリングし、Raspberry Pi Zero WのMySQLにデータを蓄積して、dynabookにインストールしたPower BIでグラフ化します。

## 設定
ラズパイと温湿度計を接続するまでは下記の記事を参考にしました。
[Xiaomi 気温湿度計](https://goozenlab.com/blog/2019/03/mi-temperature-monitor/)

室外だと外壁があるため、見通し1mも届かないようです。
窓のすぐ近くの物置内に室外用の温湿度計を設置して、室内窓際にRaspberry Pi Zero Wを設置してなんとかペアリング出来ました。室内に設置した温湿度計はRaspberry Pi Zero Wから2mくらい離してもOKみたいです。

(1)/home/pi/mitemp/demo_custom.pyを編集する。
温湿度計を2個設置したので、MACアドレスで区別してデータを蓄積するようにコードを追加して、Raspberry Pi Zero Wに作成したテーブルにデータを書き込みます。
MySQL Workbench 8.0で事前にデータベースとテーブルを作成しておきます。

```python:demo_custom.py
def poll(args):
    """Poll data from the sensor."""
    backend = _get_backend(args)
    poller = MiTempBtPoller(args.mac, backend)
    print("Getting data from Mi Temperature and Humidity Sensor")
    print("FW: {}".format(poller.firmware_version()))
    print("Name: {}".format(poller.name()))
    print("Battery: {}".format(poller.parameter_value(MI_BATTERY)))
    print("Temperature: {}".format(poller.parameter_value(MI_TEMPERATURE)))
    print("Humidity: {}".format(poller.parameter_value(MI_HUMIDITY)))
    print("MAC: {}".format(args.mac))

    battery = format(poller.parameter_value(MI_BATTERY))
    temp = format(poller.parameter_value(MI_TEMPERATURE))
    humi = format(poller.parameter_value(MI_HUMIDITY))
    mac = format(args.mac)
    now = datetime.datetime.now()

    connection = MySQLdb.connect(host='192.168.**.***',user='****',passwd='****',db='pizero_db',charset='utf8')

    cursor = connection.cursor()

    sql = 'INSERT INTO env_table VALUES (%s, %s, %s, %s, %s)'
    data = (now,mac,battery,temp,humi)
    cursor.execute(sql, data)

    connection.commit()

    connection.close()

```

(2)crontabを編集する。
温湿度計が電池駆動なので1時間に1回の測定にしています。

```
0 * * * * python3 /home/pi/mitemp/demo_custom.py --backend bluepy poll mac_outside
0 * * * * python3 /home/pi/mitemp/demo_custom.py --backend bluepy poll mac_inside
```

(3)Power BIでグラフ化する。
冬が近づいているので、日ごとの最小値をプロットしてみています。
![PBI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457056/c213d838-8392-b2ad-f4af-681a808db13b.jpeg)

## 今後
分電盤のブレーカーにCTを設置して、AD変換したデータからラズパイで消費電力を求めるシステムを作っています。温湿度計のデータと連携させて、室外環境から消費電力を予測するシステムを作ろうかと思います。


以上
Zephyr + STM32F769 Discovery Kit  > Error: dtcバージョンが古い > zephyr/build/を消してからwest build

```動作環境
ホストOS: Ubuntu 18.04 LTS
ボード: STM32F769 Discovery Kit (以下、STM32F769)
RTOS: Zephyr 2.1.0-rc1
```

### Error: DTCバージョンが古い

I2C接続のキャラクタディスプレイAQM0802を使うI2Cの実装を試そうとしていた。

```
west build -p auto -b stm32f769i_disco zephyr/samples/drivers/wrk_AQM0802_191125
```

上記のコマンドにて「dtcバージョンが古い」というエラーが出た。

### 対処 > build/を消す

https://github.com/zephyrproject-rtos/zephyr/issues/17543#issuecomment-512223884

上記にて「zephyr/build/を消すように」という回答がある。
実際にzephyr/build/を消してからwest buildするとdtcのバージョンが古い旨のエラーは解消した。

### dtcバージョン

Ubuntu 18.04 LTSのDTCバージョン。これが古いというバージョン。

```
$ /usr/bin/dtc --version
Version: DTC 1.4.5
```

Zephyrに含まれるDTCバージョン。本来はこちらを使うはずだが何かの失敗でUbuntuの方を使っていた。

```
$ $ZEPHYR_SDK_INSTALL_DIR/sysroots/x86_64-pokysdk-linux/usr/bin/dtc --version
Version: DTC 1.4.7-g78e113e8-dirty
```
PowerShellでSharePointへファイルを登録する

※この記事ではオンプレのSharePoint 2019で試したことを記載しています。

### 背景
オンプレのSharePoint環境を構築する機会があり、
普段SharePointサーバ自体さわることないので、備忘録のために記載します。

以下の参照元に答えがあります。
参考元：[Add-PnPFile(Microsoftページ)](https://docs.microsoft.com/en-us/powershell/module/sharepoint-pnp/add-pnpfile?view=sharepoint-ps)

####サンプル１ file.txtファイルを「upload/folder」フォルダにアップロード
　``Add-PnPFile -Path c:\sample\file.txt -Folder "upload/folder"``

####サンプル２ file.txtファイルを「convertFile.txt」にリネームしてアップロード
　``Add-PnPFile -Path c:\sample\file.txt -Folder "upload/folder" -NewFileName convertFile.txt"``