OmniAICreator/Qiita-1.07M huggingface dataset:
もし事業責任者がデータ分析のために『SQL』を学んだら（第三章）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280581/cad7678c-3c62-f6e3-a4f0-a8901db247d3.png)

## これはなに
* SQLを学ぶ過程で、知識として定着したいことをQiitaにまとめて行こうと思います
* 僕と同じようにSQLをこれから学ぼうとしている人、学び始めた人にとって有益な情報になれば幸いです

## 過去の記事
https://qiita.com/tanaka_shoya/items/88bc9ae867985f4f34ce

https://qiita.com/tanaka_shoya/items/937013329c0458f0c9a0

 
## 内部結合
* それぞれのテーブルの指定したカラムの値が一致するものだけを結合する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280581/7b1c47be-be7b-417a-e248-cbb7dcb959e5.png)



### 基本
```sql
SELECT
    テーブル１.カラム１,
    ...
FROM
    テーブル名１
INNER JOIN
    テーブル２
    ON 結合の条件
;
```

### 具体例
```sql
SELECT
    *
FROM
    dogs
INNER JOIN
    owners
    ON dogs.owner_id = owners.id
;
```


## 外部結合
* 条件に一致するものを結合する（内部結合）に加え、どちらかのテーブルにしか無いものも取得できる結合のこと
* 外部結合には２つある
    * 左外部結合
    * 右外部結合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280581/83eed4f6-40bb-8035-2b47-59d33850fa66.png)

 
### 左外部結合
* 左側のテーブル（`FROM`で取得する方）を軸にして行う外部結合


### 基本
```sql
SELECT
    テーブル１.カラム１,
    ...
FROM
    テーブル名１
LEFT OUTER JOIN
    テーブル２
    ON 結合の条件
;
```

### 具体例
```sql
SELECT
    *
FROM
    dogs
LEFT OUTER JOIN
    owners
    ON dogs.owner_id = owners.id
;
```

### 右外部結合
* 右側のテーブル（`JOIN`で取得する方）を軸にして行う外部結合。
* あまり使わないらしい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280581/473b868e-8d53-dcbe-d588-f019f56e806f.png)


### 基本
```sql
SELECT
    テーブル１.カラム１,
    ...
FROM
    テーブル名１
RIGHT OUTER JOIN
    テーブル２
    ON 結合の条件
;
```

### 具体例
```sql
SELECT
    *
FROM
    dogs
RIGHT OUTER JOIN
    owners
    ON dogs.owner_id = owners.id
;
```
【Java】3個以上の複数の値からMAX（もしくはMIN）値を取得する際にどう書けばいいか

## 概要
例えば、配列にもListにも格納されてないintの値が3個以上あって、その中からMAXやMINを取得したい場合、どういうふうに書くのが良いでしょうか。[Math.max関数](https://eng-entrance.com/java-math-max)を入れ子にしたり、一度Listに入れてStreamAPIのmax関数を使うとかもありだと思いますが、もう少し良い書き方ないかなと思い、今回メモ書きとして残しておきます。

## 対応案
* [Find the max of 3 numbers in Java with different data types](https://stackoverflow.com/questions/4982210/find-the-max-of-3-numbers-in-java-with-different-data-types)のstackoverflowの記事に色々対応方法書いてありますが、可変引数でメソッド化して、その後にList化してmaxを取るやり方が個人的には一番スマートかなと感じました。
* 可変引数については[こちら](https://www.javadrive.jp/start/method/index9.html)を参照してください。

## 実装サンプル

```java:sample.java
import java.util.Arrays;
import java.util.Collections;

public class MaxTest {

    public static void main(String[] args){
        int test1 = 3;
        int test2 = 4;
        int test3 = 5;
        System.out.println(getMax(test1, test2, test3));
    }

    private static int getMax(Integer... vals) {
        return Collections.max(Arrays.asList(vals));
    }
}

```
Helping Users Perceive Recommendation Diversity

# はじめに

- 今回は、多様性は大事というお話です。
- http://ceur-ws.org/Vol-816/paper6.pdf
    - 2011年

# 要約

- ユーザの多様性の認知度（知覚レベル）を高めるインターフェースを考える
- 大カテゴリ or カテゴリ内での多様性 をインターフェース化し、ユーザに使ってみてもらった
- カテゴリ分けは、多様性の認知度やシステムの満足度に効果的であることがわかった（ただ、カテゴリ内での多様性はあまり効果に寄与していないようだった）

# 知識（関連）

- 推薦されたアイテムがユーザにとって最良であることを、ユーザに認識させることは重要なことの一つ
    - アイテムに多様性があることで比較が容易になり、ユーザはアイテムの信頼を高めることにつながる
- ユーザの満足度は、アイテムの正確さだけではなく、ユーザの関心の範囲にも依存する
- 人間の知覚は、あるレベルまでの多様性しか認識できない

# 提案手法

- organization-based なインターフェース
    - カテゴリ間、カテゴリ内の多様性を考慮
- EPC(Editorial Picked Critiques)

# 実験

- Amazon
    - 「他のお客様はこんな商品を閲覧しています」
    - カテゴリ分けあり

![スクリーンショット 2021-05-05 12.13.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343913/e88135f9-2496-3b7b-af6e-9f12053c683c.png)

- 既存のAmazonリスト↓

![スクリーンショット 2021-05-05 12.13.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343913/28ee929d-ab5c-8d83-b085-1dfad6e1bb1f.png)


# 結果

- 概ね、organization-based なインターフェースの方が、ユーザに効果的であると言える
  - 満足感、また使いたくなる
- Q3.アイテム間の多様性については有意ではなかった
  - カテゴリ分けしたことで、アイテム間類似度が寄りやすくなったのかも

![スクリーンショット 2021-05-05 15.53.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343913/e022323c-717f-e40a-6a7b-9c3195010232.png)

- どっちのインターフェースがいいですか？

![スクリーンショット 2021-05-05 16.24.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343913/6b9aed21-e611-06ac-0173-014aaf9d1de9.png)


# まとめ

- カテゴリレベルの多様性は効果的
- システムの信頼度を高めるのには、多様性+アイテムの集団化するのは良さそう
【Lazy Loading】画面表示を速くする簡単な方法

# はじめに
[フロントエンド強化月間](https://qiita.com/official-events/b9ad63394fa2635dfca9)の参加記事です。

# 概要
画像をたくさん使用するWebサイトでは画面の読込に時間がかかってしまうというパフォーマンスの課題を常に抱えています。

その課題の簡単な解消方法として「Lazy Loading」があります。

## Lazy Loading とは
Lazy Loading（遅延読込）はリソースを事前に読み込むのではなく、必要になった時にリソースを読み込む手法のことです。
要は、画像を表示するタイミングになった時に初めて画像を読み込みます。

## Lazy Loading の効果
通常の画面読込ではブラウザの表示領域外の画像も事前に読み込んでいます。
これでは画面が表示されるまで時間がかかります。

![before.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122485/c5f1340d-7395-0929-c37f-3df3449edb97.png)

Lazy Loading ではブラウザの表示領域外にある画像（破線の部分）を読み込まないことで画面の表示速度を向上させることができます。

![after.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122485/97495b6c-e8fb-395a-021a-73abfcaafc93.png)

# 実装
では、実際に実装してみましょう。

## 1. lazysizes.min.jsをダウンロードする
[lazysizes](https://github.com/aFarkas/lazysizes) をGitHubから取得します。
2021/05現在の最新バージョンは5.3.1です。

## 2. lazysizes.min.jsをscriptタグで読み込む
bodyの閉じタグの直前辺りでlazysizes.min.jsを読み込みます。

```html:index.html
    <script src="lazysizes.min.js" async></script>
</body>
```

## 3. imgタグのclass属性に"lazyload"を指定する
`class="lazyload"` とすることで、lazysizes.min.jsに遅延読込の対象であると判断させます。

```html:index.html
<img class="lazyload" src="image.jpg">
```

## 4. imgタグのsrc属性をdata-src属性に変更する
`data-src="image.jpg"` とすると、画像が表示領域に差し掛かったタイミングでlazysizes.min.jsが画像を読み込みます。

```html:index.html
<img class="lazyload" data-src="image.jpg">
```

以上でLazy Loading（遅延読込）の実装は完了です。

# 検証
Lazy Loadingによってどれくらいの変化があるか検証してみます。

## 検証方法
Lazy Loadingを(a)実装していないページと(b)実装しているページの2種類を用意し、
キャッシュを利用しないでページを読み込んだ際の読込完了時間の差異を計測します。
両方のページでは15枚ほど画像を読み込みます。

## 実装内容

```html:index.html
<body>
    <div>
        <img class="lazyload" data-src="img-001.jpg">
    </div>
    <div>
        <img class="lazyload" data-src="img-002.jpg">
    </div>
    <div>
        <img class="lazyload" data-src="img-003.jpg">
    </div>
    <!-- 省略 -->
    <div>
        <img class="lazyload" data-src="img-013.jpg">
    </div>
    <div>
        <img class="lazyload" data-src="img-014.jpg">
    </div>
    <div>
        <img class="lazyload" data-src="img-015.jpg">
    </div>
    <script src="lazysizes.min.js" async></script>
</body>
```

# 検証結果

## (a)実装していないページ

![before2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122485/c1d8931a-9ee3-ee79-e8e5-a7cf5c8ad5cd.png)

すべて読み込み終えるのに1.47秒かかっています。
15枚近くある画像をすべて読み込んでいるせいか17回もリクエストが発生しており、6.1MBのリソースを取得しています。

![before3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122485/34860d70-562f-b9e7-9747-37eddd7584e6.png)

LightHouseのスコア判定でも「Avoid enormous network payloads」が警告として現れています。


## (b)実装しているページ

![after2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122485/1ed704f4-82db-0e90-d7b1-b8fbff115e44.png)

すべて読み込み終えるのに0.584秒かかっています。
表示領域内の4つの画像のみを取得しているため、リソースが1.2MBに抑えられています。
ブラウザをスクロールして画像が表示領域に差し掛かった時、残りの画像が随時読み込まれます。

![after3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122485/9a39d6ac-36be-2b46-3436-12c7637e792c.png)

LightHouseのスコア判定でも「Avoid enormous network payloads」が現れていません。
つまり、パフォーマンスが改善していることがわかります。

## 結果
Lazy Loading は比較的、簡単に実装・導入できる上、画像をたくさん利用するWebサイトにおいてはパフォーマンスが改善されることが見込めます。

# 参考
https://web.dev/codelab-use-lazysizes-to-lazyload-images/
NordVPNの設定でローカルネットワークにpingが通らなくなった件

# ローカルネットワークへのpingが一般エラー

事の発端はローカルネットワークへのpingが一般エラーになったことでした。
![qiita_nordvpn_ping_error001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98298/a2e89133-f748-3cb6-14b3-c7d50cf34c1d.jpeg)
自宅のローカルネットワークは192.168.1.0/24なのですが、デフォルトゲートウェイ 192.168.1.1 へのpingは「一般エラー。」になる一方、GoogleパブリックDNSへのpingは問題なく通っています。

# NordLynxという謎のアダプター

そこでipconfigコマンドを見てみると「NordLynx」という謎のネットワークアダプターがあります。
![qiita_nordvpn_ping_error002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98298/30c55b4c-7c78-5636-bf14-b5e791aad708.jpeg)
(「VirtualBox Host-Only Network」というアダプターは、PC上にVirtualBoxを使って構築した仮想マシンとの通信に使っているものです)

名前からして自宅PCにインストールしてある「NordVPN」関連のようです。

# NordVPNのInvisibility on LANが原因

NordVPNを起動し、設定をあちこち調べた結果、「Invisibility on LAN」がOnになっていることが原因と判明。
![qiita_nordvpn_ping_error003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98298/0535a88b-522e-fd0f-a148-5ee21e5b887b.jpeg)
説明をよく読まずにOnにしていましたが、たしかにVPN接続をしているかどうかに関係なく、あなたのデバイスがローカルネットワークから見えなくなりますと書いてあります。

この設定をOffにして解決しました。
Flutter Dialogueの中でState管理する方法

使用例: アカウント削除時に削除前にパスワードを求め、認証してから削除する時にパスワードの入力状態によって削除ボタンをenableしたりする場合。

StatefulBuilderを使用して、Dialog内でsetStateを使用し、Dialog内でのみWidgetsを更新します。

```
Widget _buildSubmitButton() {
    return ElevatedButton(
      onPressed: _isButtonEnabled ? _deleteConfirmDialogue : null,
    );
  }

  Widget _enterPassword() {
    return StatefulBuilder <- StatefulBuilderで包んであげる
      builder: (context, setState) {
        return Container(
          child: SimpleDialog(
            title: Text(
              'Enter password',
              textAlign: TextAlign.center,
            ),
            children: [
              Container(
                padding: EdgeInsets.all(15),
                child: Column(
                  children: [
                    Text("please enter your password to proceed"),
                    TextField(
                      keyboardType: TextInputType.visiblePassword,
                      decoration: InputDecoration(
                        // border: InputBorder.none,
                        icon: Icon(
                          Icons.lock,
                          color: Color(0xff6bceff),
                        ),
                        hintText: 'password',
                      ),
                      onChanged: (value) {
                        setState(() {
                          password = value;
                          _isButtonEnabled = password.length > 0;
                        });
                      },
                    ),
                    SizedBox(height: 10),
                    _buildSubmitButton(),
                  ],
                ),
              )
            ],
          ),
        );
      },
    );
  }
```
![Screen Shot 2021-05-05 at 16.27.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101996/ff24b67a-4cb2-9157-7784-0b88ffb2238f.png)

![Screen Shot 2021-05-05 at 16.27.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101996/3d3ffabe-0fc6-fca0-84e6-6b2a30fbb242.png)
LIGGGHTSでTutorial~ちょっとした改造まで

# LIGGGHTS-PUBLIC (LIGGGHTS3.8)
LIGGGHTS2.Xと3.X系ではちょっと違う模様。
（LIGGGHTS-PUBLICとなったらしい）

特に、結果の可視化が大幅に簡素化された。
インストールのメモを残しておく。

なお、環境は、
WSL-Ubuntu20.04 (Win10)
です。vaioのノートPC (i7-10700U)で試しました。
後日、UltraVNCでつないだワークステーション
(Ubuntu20.04, AMD 3970X)でも試したが、
VNCとParaviewの相性が悪いらしく、不便。

# インストール

```
sudo apt install openmpi-bin libopenmpi-dev
```


```
git clone https://github.com/CFDEMproject/LIGGGHTS-PUBLIC.git
```


```
cd LIGGGGHTS-PUBLICS/src
make auto
```

初回は警告をだして、Makefileをつくってくれる。
`vtk`は自動インストールもできるが、うまくいかなかったので、手動。

```
vi MAKE/Makefile.user
```

の、120~122行目を

```
120 #VTK_INC_USR=-I/usr/include/vtk-6.3↲
121 # Path that contains the VTK libraries↲
122 #VTK_LIB_USR=-L/usr/lib/cmake/vtk-6.3↲
```

とした。
なお`vtk`は、

```
sudo apt install libvtk6.3 libvtk6-dev
```

で入れた。
その後、

```
make auto
```
数分待つ。
lmp_autoが実行ファイル

```
cp lmp_auto /home/hoge/hoge
```

で、pathの通ったところに置く。
また、bash_rcなどに

```
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/cmake/vtk-6.3↲
```

を書いておく。
これで、インストールは完了。

viewerのParaviewを

```
sudo apt install paraview
```

して、いれておく。

# Tutorials

```
cd /hogehoge/LIGGGHTS-PUBLIC/examples/LIGGGHTS/Tutorials_public/chute_wear
mpirun -np 4 lmp_auto -in in.chute_wear
```

2-3分でいける。

結果を、`Paraview`を開いて、
ファイルの読み込みで、`/hogehoge/LIGGGHTS-PUBLIC/examples/LIGGGHTS/Tutorials_public/chute_wear/Post/`
の`.vtk`を全部選ぶ。
`Paraview`の左上のファイルの並んでいるところをクリックして、
目のアイコンを開くと、ストラクチャが表示される。

# chute wearの回転
ストラクチャーを回転させましょう。

`in.chute_wear`で、12行目を変更、38行目のあとに追加。

```
...
12 region        domain block -0.5 0.5 -0.5 0.5 -0.4 0.15 units box
...
38 fix  granwalls all wall/gran model hertz tangential history mesh n_meshes 1 meshes cad
39 fix move_cad all move/mesh mesh cad rotate origin 0. 0. 0. axis  0. 0. 1. period 1
...

```

12行目で、計算の空間をしていしているが、cad (ホーン？）を回転させると、デフォルトの領域だとぶつかる。
39行目で、回転させている。
ここで、`wall/gran`や`move/mesh`が関数のようである。
意味は
https://www.cfdem.com/media/DEM/docu/Section_commands.html#fix-styles
にある。

# 粒子のサイズ分布

42~44行目。


```
#distributions for insertion
42 fix  pts1 all particletemplate/sphere 15485863 atom_type 1 density constant 2500 radius constant 0.0010
43 fix  pts2 all particletemplate/sphere 15485867 atom_type 1 density constant 2500 radius constant 0.0050
44 fix  pdd1 all particledistribution/discrete 32452843  2 pts1 0.3 pts2 0.7
```

pts1が0.001, pts2が0.005で、pts1:pts2 = 0.3:0.7 (mass %)
たくさん増やすときは、使えるrandom seedに注意。(順番につかう？)




# Paraviewで粒子の大きさをかえる

1. 粒子(chute)を選んでApplyをしてから、`Glyph`を押す。
2. Glyph type>Glyph sourceでsphere
3. Scale > Scale Arrayでradius
4. Scale Factorをリセット
5. Applyする。目のアイコンで表示させることをわすれずに。

http://miyuki9898.blogspot.com/2015/08/paraview.html

# アニメーションの保存
最後に`File>Save animation`すれば、かっこいい。
拡張しにaviを選んで、好きなフレームレートを入れる。

![a.0300.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221968/99d24ff7-46b5-bf68-4dd2-c174de5b056c.jpeg)

(Qiitaは動画の貼り付けができないのですね・・・）



# 参考
https://www.cfdem.com/media/DEM/docu/Manual.html
https://www.engineerdo.com/wp-content/uploads/2020/06/EngineerDo_Installation_liggghts.pdf
https://qiita.com/baozam/items/ba1b1333407891107901
イベント修飾子.stop/.prevent

v-onディレクティブで設定したイベントを止めることができます。

stop修飾子
-

```vuejs
<body>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
  <div id="app">
      <p v-on:mousemove="mousePosition(10, $event)">マウスを乗せてください
      <span v-on:mousemove.stop>マウスを乗せてみてください</span></p>
      <p>X:{{x}}、Y:{{y}}</p>
</div>
<script>
  new Vue({
    el: '#app',
      data: { 
          number: 0,
          x:0,
          y:0
        },
      methods: {
        mousePosition: function(divideNumber, event) {
          this.x = event.clientX / divideNumber;
          this.y = event.clientY / divideNumber;
        }
      }
  })
</script>
</body>
```

stopをつけるだけです。

```vuejs
<span v-on:mousemove.stop>
```

prevent修飾子
-

```vuejs
<body>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
  <div id="app">
     <a v-on:click.prevent="url" href="https://google.com">Google</a>
</div>
<script>
  new Vue({
    el: '#app'
  })
</script>
</body>
```

```vuejs
<a v-on:click.prevent="url" href="https://google.com">Google</a>
```

.stop.preventと続けて書くこともできます。
Animationと@keyframesの基礎を理解するためbuttonを作ってみました

Animationを使ってbuttonにアニメーションをつけてみる



目標：``Animationと@keyframes``の基礎を理解するため
テキストエディターはVSCode.
↓下記の方のtransitionの説明を参考にしました
[@7968様] (https://qiita.com/7968/items/1d999354e00db53bcbd8)
とても解りやすかったです！！


　　　
今回はcodePenで書いてみました♪ ※head部分は省略

<p class="codepen" data-height="296" data-theme-id="light" data-default-tab="css,result" data-user="swan2pink" data-slug-hash="oNZvJQG" style="height: 296px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="oNZvJQG">
  <span>See the Pen <a href="https://codepen.io/swan2pink/pen/oNZvJQG">
  oNZvJQG</a> by トモゑ☛Web作成の37🌺 (<a href="https://codepen.io/swan2pink">@swan2pink</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


詳しくcodeを書いてみます

```css
.button {
  color: white;
  width: 200px;
  height: 80px;
  background-color: pink;
  font-size: 30px;
  border-radius: 5px/5px;
  text-align: center;
  line-height: 80px;
  box-shadow: 5px 5px 5px black;

  
}

.button:hover {
  animation-name: buttons; ※
  animation-duration: 1s;　※　
  animation-iteration-count: 3;　※
}

@keyframes buttons {
  0%{
    width: 200px;
  }
  100%{
    width: 20%;
    background-color: blue;
  }
}
```

``Animation`` と``@keyframes`` を使ってアニメーションしてみました
また、カーソルを ``hover``した時にアニメーションしてほしかったので、
 ``hover``に ``animation``設定をしました。

``animation-iteration-count: 3`` カウントを３回にしましたが無限に繰り返したい時は、３を``infinite``　に変更してあげます



##まとめ
今回は、``Animation`` と``@keyframes``  の基本について書いてみました。

引き続き応用にもチャレンジしていきたいと思います
今回は以上です！
ありがとうございます
【AWSで始める異常検知】Part3. 異常検知に便利なAWS製品

#はじめに

[前回の記事](https://qiita.com/omiyu/private/25e52c3396014d0b70f4) では、Amazon SageMaker を使って異常検知のサンプルアーキテクチャをご紹介しました。
AWSにはSageMakerの他にも異常検知に便利なサービスがあるので、本記事にて代表的なものをいくつかご紹介いたします。

#Amazon Monitron

Amazon Monitron は、機械学習を使用して産業機械の異常な動作を検出し、予知保全によってダウンタイムを低減することを可能にすることができます。
産業機械にMonitronセンサーを取り付け 振動や熱を計測し、そのデータをクラウド上に転送して機械学習によって異常な動作を検知します。

__※2021/05/10時点で米国、英国、およびEUのみでデバイス購入可能、利用できるリージョンは米国東部 (バージニア北部) および欧州 （アイルランド）のみです。__

https://aws.amazon.com/jp/monitron/


## Amazon Monitron に含まれるもの

- 振動と温度のデータを取得する Amazon Monitron センサー
- AWS にデータを安全に転送する Amazon Monitron ゲートウェイ
- 機械学習を使用して機械の異常パターンのデータを分析する Amazon Monitron サービス
- およびデバイスをセットアップし、機械の潜在的な障害を追跡するためのコンパニオンモバイルアプリ

![スクリーンショット 2021-05-07 15.50.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/57ccd8e5-166f-497a-1470-8ab0f0b87f43.png)

#Amazon Lookout for Equipment

Amazon Lookout for Equipment は、機器のセンサーで得られたデータを自動で分析して、機器の異常検知や予知保全を実現します。
リアルタイムでセンサーデータを分析して、機械障害につながる可能性のある早期警告の兆候を正確に特定します。

https://aws.amazon.com/jp/lookout-for-equipment/

![スクリーンショット 2021-05-07 17.46.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/b8508f18-bc34-a3c3-c6df-b4f7b0d235d5.png)



#Amazon Lookout for Vision

Amazon Lookout for Vision は、コンピュータービジョン を使用して視覚表現の欠陥や異常を発見する機械学習サービスです。
正常な製品と欠陥のある製品を示す画像をアップロードしてタグ付けをすることで、欠陥を検出するモデルを自動で作成することができます。

https://aws.amazon.com/jp/lookout-for-vision/


![スクリーンショット 2021-05-07 17.19.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/742e8187-7859-6910-eea4-83933fe9ede4.png)





#AWS IoT

>AWS IoT を使用すれば、機器の状態、正常性、性能を継続的にモニタリングおよび推測して、問題をリアルタイムで検知できます。

引用元：https://aws.amazon.com/jp/iot/solutions/industrial-iot/?c=i&sec=uc1

![スクリーンショット 2021-05-07 17.53.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/1f856459-037e-57b2-efbc-b0eaeebc30ed.png)

## AWS IoT Analytics

>AWS IoT Analytics に事前に定義されているテンプレートを使用して、強力な予知保全モデルを簡単に構築し、フリートに適用できます。
例えば、AWS IoT Analytics を使用して、接続された貨物車で冷暖房装置が故障するタイミングを予測できるため、適切な補修を行って輸送上の損傷を防ぐことができます。

引用元：https://aws.amazon.com/jp/iot-analytics/?c=i&sec=srv

## AWS IoT Events
>AWS IoT Events は、複数の IoT センサーやアプリケーションのデータを継続的に監視し、AWS IoT Core や AWS IoT Analytics といった他のサービスと統合してイベントの早期検出と固有の分析を可能にします。

引用元：https://aws.amazon.com/jp/iot-events/?c=i&sec=srv

##AWS IoT Core
>AWS IoT Core を使用すれば、IoT デバイスを AWS クラウドに接続できます。

引用元：https://aws.amazon.com/jp/iot-core/

AWS Lambda、Amazon Kinesis、Amazon S3、Amazon SageMaker、などといった Amazon のサービスを簡単に使用して、接続されたデバイスで生成されたデータを収集、処理、分析し、そのデータに基づいてアクションを起こす IoT アプリケーションを構築できます。

#まとめ
このように、AWSには異常検知をする上でたくさんのサービスが用意されています。
やりたいことに合わせて使うサービスを検討することができるのも、AWSなどのクラウドサービスを使うメリットだと思いました。
PowerBIサービス convert  to type Binary更新エラーの解決ヒント

#前置き
Power BI サービスの自動更新で
We cannot convert the value "[Binary]" to type Binary.　
のエラーが出ており困っておりました。
Power BI 勉強会 GW合宿 第参夜　に参加し、大変貴重な助言をいただき、
問題が無事解消したので、もし同様に悩んでいる方の参考になればと記録を残しておきます。

#環境
Power BI データフロー上のマスタデータとSharePointOnline上のcsvファイルを、PowerQuery上でマージし
レポートを作成。Power BIサービスに発行、自動更新を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296997/5510cb34-c7b4-c787-e632-1ef5818cf381.png)

#発生していた現象
Power BI DeskTopからPower BIサービスへ発行して運用していたレポートが
ある時期からPower BIサービスの更新が毎回失敗するようになった（自動実行・手動実行ともに）

エラーメッセージはこんな感じ。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296997/0bc9da10-0770-9404-02ff-1f8c0f5d1f71.png)


#いきなり解決策
Power BI サービスの更新スケジュールの設定からオンプレミスデータゲートウエイをオフにしたところ無事解消
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296997/ed9f8c9d-5a8c-ffca-87d0-7a66ed9e3c81.png)


データソースはすべてクラウド上にあるため、そもそもゲートウエイは不要なはずだが、
「ゲートウエイを使用して接続状態をより良くすることができます」の一文に惑わされて
「オンプレミスまたはVNETデータゲートウエイを使用する」をオンにしたことが原因。

#ゲートウエイ接続オン時にエラーになる条件

データソースがすべてクラウド上の場合

DataFlow(マスタデータ)とSharePoint(csvファイル)とのマージ有り　　　　　**更新失敗！**

DataFlow(マスタデータ)とSharePoint(csvファイル)とのマージ無し　　　　　　**更新成功！**

DataFlow上の２つのデータをマージ　　　　　**更新失敗！**

DataFlow上の２つデータを結合　　**更新失敗！**



どうやらクラウドデータソースどうしでクエリのマージや結合を行った場合、更新が失敗する場合がある


#得た知見
クラウドデータソースどうしでクエリのマージや結合を行った場合、
On Premise Data GateWayを適用しないこと
Chart.js version3 複数Y軸

```html
<script src="chart.js"></script>

<canvas id="myChart" ></canvas>

<script>
var ctx = document.getElementById('myChart').getContext('2d');
var myChart = new Chart(ctx, {
    type: 'line',
    data: {
        labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
        datasets: [
        	{
        	    label: '# of Votes',
        	    data: [12, 19, 3, 5, 2, 3],
           		borderWidth: 1,
           		yAxisID: 'y1'
        	},{
        	    label: '# of like',
        	    data: [90, 70, 80, 60, 70, 90],
        		borderWidth: 2,
        		yAxisID: 'y2'
        	}
        ]
    },
    options: {
        scales: {
            y1: {
                beginAtZero: true,
                position: 'left'
            },
            y2: {
            	position: 'right'
            }
        }
    }
});
</script>

</pre>
```


参考 multi axis line chart
https://www.chartjs.org/docs/latest/samples/line/multi-axis.html
マインドマップでAWSのデータ分析サービスを勉強【データ保存編】第１回 − S3

AWSのデータ分析系のサービスを体系的に学ぶため、UdemyのAWS Certified Data Analytics Specialty 2021 - Hands onコースを受けました。

一般的なデータ分析流れに含まれるステップ、データ収集、データ保存、データ処理、データ分析、データ可視化に、それぞれが利用するサービスを学び、マインドマップに整理しました。
今回はデータ保存編のS３です。

※ こちらの記事は、AWSのホワイトペーパー、クラウドサービス活用資料集とUdemyにあるAWS Certified Data Analytics Specialty 2021 - Hands onというコースを参照しております。

![AWS Storage Services S3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544279/843940d8-47ca-6214-b464-5c48c09ecbfe.png)
もし事業責任者がデータ分析のために『SQL』を学んだら（第二章）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280581/90426328-ec3f-6a05-05f3-5690386d6045.png)

## これはなに
* SQLを学ぶ過程で、知識として定着したいことをQiitaにまとめて行こうと思います
* 僕と同じようにSQLをこれから学ぼうとしている人、学び始めた人にとって有益な情報になれば幸いです

## 過去の記事
https://qiita.com/tanaka_shoya/items/88bc9ae867985f4f34ce

## データを数える
* データを数えるには、`COUNT関数` を用いる

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

* `DISTINCT カラム名` で重複を省くことが可能のなので、`COUNT（DISTINCT カラム名) ` で使われることが多い

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

## データをまとめる
* データをまとめるには、`GROUP BY` 句を用いる
* 計算するための関数には、COUNT、AVG、MAX、MINなどがある

```
SELECT
    まとめたいカラム名,
    計算する関数
FROM
    テーブル名
GROUP BY
    まとめたいカラム名
;
```

## データを並び替える
* データを並び替えるには、`ORDER BY` 句を用いる
* 何も指定しない場合、昇順で抽出される
    * 降順にするには、カラム名の後に`DESC` をつける


```
SELECT
    カラム名
FROM
    テーブル名
ORDER BY
    並び替えたいカラム名
;

```

## おまけ
* `AS` を使うことで、テーブル名やカラム名を変更したり、演算を行ったカラムに対して名前をつけることが可能

### 具体例

```
SELECT
    COUNT(id) AS count
FROM
    テーブル名
GROUP BY
    user_id
ORDER BY
    count DESC
LIMIT 10
;
```
Play Frameworkで作成したWebアプリをHerokuにデプロイするときに詰まった話。

##経緯
Play Frameworkで作成したWebアプリを作成しました。
せっかく作成したのでHerokuにデプロイしてみようとしたのですが
エラーでデプロイができませんでした。
ログを見ると"App crashed"と書かれており
ログだけでは何が原因なのかがちょっとわからなかったです。
ちなみに言語はJavaです。
##対応
ログに書かれている"App crashed"を頼りに
調べてみて下記のこと実施してみました。

###1.不要なファイルの削除
　　ローカルではSQLiteを利用していたため
　　データベースのファイル(拡張子が「.sqlite3」の奴)や
　　クエリが記載されたファイルがありました。
　　HerokuではPostgreSQLを利用するため、いらないので削除しました。

###2.PostgreSQLのJDBCドライバの追加
　　DBはPostgreSQLを利用するので
　　JDBCドライバ(拡張子が「jar」のファイル)を追加しました。

###3.build.sbtの修正
　　「name：=」のところがアプリ名になっていなかったので
　　　アプリ名になるよう修正。
　　　また、PostgreSQLのドライバーライブラリを記載しました。

```
name:=""""アプリケーション名"""
　　　　　　　　・
　　　　　　　　・
　　　　　　　　・
libraryDependencies+="org.postgresql"%"postgresql"%"jarファイルのバージョン"
```

###4.Procfileの追加
　　Procfileがなかったので追加しました。
　　記載内容は以下になります。
　　※＄{DATABASE_URL}は後で説明。
　　　${APPLICATION_SECRET}はシークレットキーの環境変数

```
web: target/universal/stage/bin/アプリケーション名 -Dhttp.port=${PORT} -DapplyEvolutions.default=true -Ddb.default.driver=org.postgresql.Driver -Ddb.default.url=${DATABASE_URL}
-Dplay.cypto.secret=${APPLICATION_SECRET}
```

###5.application.confの修正
　　PostgreSQLを利用するため、driver,url,user,passwordを追加。
　　シークレットキーを設定しないと怒られたので、それも設定。
　　また、現状だとアクセスが許可されているのはローカルのみなので
　　一旦は全許可とするように設定。
　　※url,user,passwordの環境変数について
　　　HerokuではDBの情報を環境変数に設定します。
　　　デフォルトで環境変数「DATABASE_・・」にDBの情報を保持する。

```
db.default.driver=org.postgresql.Driver
db.default.url=${?DATABASE_URL}
db.default.user=${?DATABASE_USER}
db.default.password=${?DATABASE_PASSWORD}
play.http.secret.key="生成したシークレットキー"
play.filters.hosts.allowd+="."
```

##感想
上記のことを行い無事デプロイできました。
デプロイで詰まってから解決するまで2~3週間ほど時間が
かかってしまい大変でした。
Ruby on Railsは簡単でしたので大丈夫かなーと思っていましたが
全然大丈夫ではありませんでした。
シークレットキーをapplication.confとProcfileに記載したりと
ところどころあってるのかなーと思うところはありますが
とりあえずデプロイできてよかったです。
あと、説明が間違ってたらごめんなさい。
【Prometheus】GCPのインスタンスをAWSから監視する(stackdriver_exporter)

# はじめに
先日からGCPを触っているが、その際にPrometheusからGCPの監視データを取得してくれる[stackdriver_exporter](https://github.com/prometheus-community/stackdriver_exporter)を見つけた。
今回はこの[stackdriver_exporter](https://github.com/prometheus-community/stackdriver_exporter)をAWS(EC2)上に構築してそこからGCPのデータを取得してみようと思う。
なお、大きく使う予定がないのでAWS-GCP間の連携に[Workload Identity](https://cloud.google.com/iam/docs/access-resources-aws?hl=ja)は使用しない。


# 前提
GCP上のIAMで「閲覧者」のサービスアカウントとキーを作成しておくこと。
\([github](https://github.com/prometheus-community/stackdriver_exporter)上では「roles/monitoring.viewer」でいいと書いてあるが動かなかったので\)

# GCP設定ファイル設置
作成したキーファイルを配置して参照用の環境変数ファイルを設置しておく。
暫定で今回は/root/.gcp.jsonに設置した前提とする。

```ruby:/root/gcpenv
GOOGLE_APPLICATION_CREDENTIALS=/root/.gcp.json
```

# バイナリ取得
```ruby:バイナリ取得
wget https://github.com/prometheus-community/stackdriver_exporter/releases/download/v0.11.0/stackdriver_exporter-0.11.0.linux-amd64.tar.gz
tar -zxf stackdriver_exporter-0.11.0.linux-amd64.tar.gz
mv stackdriver_exporter-0.11.0.linux-amd64/stackdriver_exporter /usr/local
```

# サービス化とコンフィグファイル作成
stackdriver_exporterはコマンド実行時に監視項目などOptionを指定する作りになっているのでこのままサービス化しても使いづらい。
他のPrometheus系のRPMのようにOptionを/etc/default/stackdriver_exporterから参照できるよう設定を少しいじっている。
※併せてGOOGLE_APPLICATION_CREDENTIALSも参照設定も入れている。

#### サービス用コンフィグ
```ruby:/usr/lib/systemd/system/stackdriver_exporter.service
[Unit]
Description=stackdriver-exporter
After=network.target

[Service]
EnvironmentFile=-/etc/default/stackdriver_exporter
EnvironmentFile=/root/gcpenv
Type=simple
User=root
ExecStart=/usr/local/stackdriver_exporter $STACKDRIVER_EXPORTER_OPTS

[Install]
WantedBy=multi-user.target
```

#### stackdriver_exporterコンフィグ
ここにコマンドオプションを切り出しているので監視項目を変更する際はここを変更する。
この例ではGCPインスタンスcpu,memory,disk,network全てを取得する設定としている。

```ruby:/etc/default/stackdriver_exporter
STACKDRIVER_EXPORTER_OPTS='--monitoring.metrics-type-prefixes "compute.googleapis.com/instance/cpu,compute.googleapis.com/instance/disk,compute.googleapis.com/instance/memory,compute.googleapis.com/instance/network"'
```

# サービス登録&起動
```ruby:サービス登録&起動
systemctl enable stackdriver_exporter
systemctl start stackdriver_exporter
```

# Prometheus設定追加
prometheusに参照設定を入れてreloadする。

```ruby:/etc/prometheus/prometheus.yml
  - job_name: stackdriver-exporter
    static_configs:
      - targets: ['localhost:9255']
```

以下のような感じでGCPのインスタンスの情報が取得できる。
![stackdriber.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092362/4ecee2d9-254c-1a33-bf37-4a8557141311.png)



# あとがき
クラウドサービスはそれぞれで監視機能を持っているのでマルチクラウドなところだと各環境毎に監視サーバを持ってしまっているケースってよくみる。
それ自体は悪いことではないのだけどやっぱり本末転倒な気がするので、今回新たに専用のインスタンスを増やさずGCPを監視させる形を作れたのはよかった。
~~なんかできそうな感じがするので次回はこれまで作ってきたprometheusをGCPに複製してAWS-GCP間で冗長化する、という記事を書こうかと思っている。~~
※最終型がしょぼい感じになりそうなので再検討
なお、なんでもかんでもAWS・Prometheus前提になっているが私はそのあたりからの回し者ではない。全然別の記事も書きたい。
DOMイベントごと変数で渡す



特別な $event変数を使うことでメソッドにDOMイベントを渡すことができます。

```vuejs
<body>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
  <div id="example">
    <p>{{ message }}</p>
    <button @click="say('こんちわ', $event)">こんにちは</button>
  </div>
<script>
let app = new Vue({
  el: '#example',
  data: {
    message: '挨拶'
  },
  methods: {
    say:function(message, event){
      console.log(event)
      this.message = message
    }
  }
})
</script>
</body>
```
![20210505-154331.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/a07616d1-7049-0c1f-c339-cdc85086afe3.png)

ボタンを押すと
![20210505-154344.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/0814c810-98e7-66bd-5cbf-5dc848add0f9.png)

上を使って前の回のクリックカウントを２の倍数で表示させます。

```vuejs
<body>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
  <div id="app">
      <p>現在{{ number }}回クリックされています</p>
      <button v-on:click="countUp(2)">カウントアップ</button>
</div>
<script>
  new Vue({
    el: '#app',
      data: { 
          number: 0
        },
      methods: {
        countUp: function(times) {
          this.number += 1 *times
        }
      }
  })
</script>
</body>
```

![20210505-155837.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/1c15974f-2084-e6fe-a15c-5eb85f535347.png)


上を使って前の回のXY座標のコードを１０で割って表示させます。

```vuejs
<body>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
  <div id="app">
      <p v-on:mousemove="mousePosition(10, $event)">マウスを乗せてください</p>
      <p>X:{{x}}、Y:{{y}}</p>
</div>
<script>
  new Vue({
    el: '#app',
      data: { 
          number: 0,
          x:0,
          y:0
        },
      methods: {
        mousePosition: function(divideNumber, event) {
          this.x = event.clientX / divideNumber;
          this.y = event.clientY / divideNumber;
        }
      }
  })
</script>
</body>
```
![20210505-154715.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/693ec3ab-d4c9-bd4e-5ee7-f4c2b01cac2c.png)

座標が１０で割った値となりました。
【C# From】タイトルバーの無いフォームに自作タイトルバーを作る

#### 環境

C# - Winodws Form Application (Visual Studio 2017 , .NET Framework 4.5)

# タイトルバーの無いフォームに自作タイトルバーを作る

こういうオサレアプリを作るとします。
![header.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1443439/fef447e0-c3c0-d448-0486-f4ca0692e3e4.png)

これが果たしておしゃれかどうかはおいといて、こういったタイトルバーのないフォームを作った場合、最大化・最小化は不要、終了は`this.Close();`でいいとして、地味に面倒くさいのが 掴んで移動ができないこと です。

実装方法はいろいろあるとは思いますが、ここでは、Win32APIを使って、上側にあるピクチャボックスをタイトルバーとして認識させたいと思います。

‥‥といっても、この手法自体は.NETの前のVisualBasicの時代から通用するものであって、軽く調べても、[dobon.net](https://dobon.net/vb/dotnet/form/moveform.html)さんを始め、いくらでも記載が見つかります。

この記事では、昔調べた手法が今も使えるという意味合いで記しておきます。
（というか.NET内でやる方法がご存知でしたら教えてください）

## 実装方針

使うWin32APIは、`ReleaseCapture`と`SendMessage`です。

- まずピクチャボックスへのマウス押下に対して、押下状態を解除(`ReleaseCapture`)し、マウスの入力をキャンセルします。
- 次に、ウインドウメッセージを送信（`SendMessage`）し、タイトルバーにマウスが押されたことを通知します。

これにより、「ピクチャボックスを掴む」＝「タイトルバーを掴んだ扱い」として扱われます。

## サンプル

ピクチャボックスpicHeaderを貼りつけ、`MouseDown`イベントを作ります。

```csharp
//using System.Runtime.InteropServices;

        private void picHeader_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                Win32Api.MouseLeftDownOnFormTitleBar(this);
            }
        }

        private static class Win32Api
        {

            #region SendMessage

            [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
            private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

            #endregion

            #region ReleaseCapture

            [DllImport("user32.dll", SetLastError = true)]
            [return: MarshalAs(UnmanagedType.Bool)]
            private static extern bool ReleaseCapture();

            #endregion

            #region MouseLeftDownOnFormTitleBar
            /// <summary>
            /// タイトルバーを左クリックする
            /// </summary>
            /// <param name="frm">対象のフォーム</param>
            public static void MouseLeftDownOnFormTitleBar(System.Windows.Forms.Form frm)
            {
                ReleaseCapture();
                SendMessage(frm.Handle, (int)0x00A1, new IntPtr(0x0002), IntPtr.Zero);
            }
            #endregion
            
        }
```

`SendMessage`の引数である`0x00A1`と`0x0002`が、それぞれ`WM_NCLBUTTONDOWN`＝マウス左ボタン押下、`HT_CAPTION` ＝タイトルバー部分を意味しています。定数にしておくのが正しいとは思います。

## 余談

趣味でやってると、オリジナルの見た目のフォームを作りたい時ってあると思います。そういう時に任意のコントロールをタイトルバーに出来ると表現の幅が広がります。

これ自体は結構有用なコードだと思うのですが、最近じゃFrameworkの方も優秀で、あえてWin32APIを使うべきケースも少ないもので、そんなことでAPIをわざわざ勉強するのもなぁって感じですね。
実際、`SendMessage`の他の引数とかを使ってやりたいことなどはなかなか思いつかないし、そんなわけでこのロジックそのものをタイトルバー処理専用と割り切って私は使っています。

----
独学のため正確でない可能性があります。
（っ・ｘ・）っ きゅ

#### 参考
- https://dobon.net/vb/dotnet/form/preventmaximize.html
【Rails】新規アプリケーション作成の手順

# はじめに
新規でアプリケーションを立ち上げ、データベースを作成するまでの手順をまとめようと思います。
# 手順
まずはディレクトリを移動します。

```
% cd ~/アプリケーションを作成するディレクトリ
```
次に新規アプリケーションを作成します。

```
% rails new アプリケーション名
```
アプリケーションを作成する際にバージョンやオプションを指定することも可能です。
以下の例ではバージョンを6.0.0、オプションをMySQLに指定しています。

```
% rails _6.0.0_ new アプリケーション名 -d mysql
```
その次に作成したアプリケーションのディレクトリへ移動し、データベースを作成します。

```
% cd アプリケーション名
% rails db:create
```

データベース作成までの手順は以上になります。
WPF覚え書き～ControlTemplate～

#はじめに
WPF学習中のため自分用に記載していきます。
間違い、不足などありましたらコメントをよろしくお願いします。

#ControlTemplateプロパティ
ControlTemplateプロパティを設定することで、外見をすべてカスタマイズすることが可能になる。

***

#例：Buttonコントロールをカスタマイズ
ButtonコントロールをControlTemplate（コントロールテンプレート）を利用してボタンを丸くしたものを作成する。

```C#
~省略~
<Button Content="Button" Margin="30" Background="LightSeaGreen">
    <Button.Template>
        <ControlTemplate TargetType="Button">
            <Border Name="border"
                BorderThickness="1"
                BorderBrush="OrangeRed"
                Background="{TemplateBinding Background}"
                CornerRadius="1000">
                <ContentPresenter VerticalAlignment="Center"
                                HorizontalAlignment="Center" />
            </Border>
        </ControlTemplate>
    </Button.Template>
</Button>
```
★「Background="{TemplateBinding Background}"」
　親コントロールのプロパティをバインドすることが可能

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454547/c8202505-2b5f-0f00-884c-b9ac026bb298.png">



***

#例：トリガーを追加する
テンプレートが適用されたコントロールにトリガーを追加することも可能

```C#
~省略~
<Button Content="Button" Margin="30" Background="LightSeaGreen" >
    <Button.Template>
        <ControlTemplate TargetType="Button">
            <Border Name="border"
                    BorderThickness="10"
                    BorderBrush="OrangeRed"
                    Background="{TemplateBinding Background}"
                    CornerRadius="1000">
                    <ContentPresenter VerticalAlignment="Center"
                        HorizontalAlignment="Center" />
            </Border>

            <!--  マウスオーバー時に背景色を変更する  -->
            <ControlTemplate.Triggers>
                <Trigger Property="IsMouseOver" Value="true">
                    <Setter TargetName="border"
                    Property="Background"
                    Value="Yellow">
                    </Setter>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Button.Template>
</Button>

```


<img width="300"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454547/f3671a74-9a9b-b42b-3c64-9bddafb17001.png">


#参照
[コントロールのためのテンプレートを作成する方法 (WPF.NET)](https://docs.microsoft.com/ja-jp/dotnet/desktop/wpf/controls/how-to-create-apply-template?view=netdesktop-5.0)
Typescriptについて　その1

# Typescript概要
マイクロソフトが開発しているプログラミング言語。2017年には、Googleが社内の標準言語に採用した。現在、フロントエンドでは、Typescriptの採用が高まっている。

# Typescriptの特徴
##①Javascriptを拡張した言語
```
1.　コンパイルを経てJavascriptに
２.　Javascriptを書いても解釈される
```

## ②データの型
```
1.　javascriptへのコンパイル時にエラーがわかるので、安全で効率的な開発が行える。
2.　実行前のコンパイルエラーで音大を早期発見できる
3.　エディタのコード補完をサポート
```
##　③Javascript仕様の先行実装
```
1.　コードの記述量が減り、簡潔に書ける
2.　開発体験(Developer Exerience)の向上
3.　コンパイル結果は、javascriptでの実装コードに変換される　　
```

# 型を理解する
##TypescriptのTypeは「型」を指している。
名前の通り、ちゃんと型を使う言語であることがわかる。

```
変数には指定した型のデータしか入れられない。一般的に静的型付けと言われる。
var data: string = 'Hello';
    変数名: 型名

//文字列型ではないためエラー
data = {text: 'Hello'};
型の違うデータを変数に代入しようとすると、コンパイラがエラーを発生させる。

```

#型の使い方

```
//文字列型
var title: string = 'Angular';
title = 'Angular!';
⚠︎titleには、違う文字列を代入することが可能

//数値型
var n: number = 9;

//真偽値型
var isOpen: boolean = true;

//配列型
var keywords: string[] = ['name','email', 'body'];
文字列のみで数値を入れると、エラーが起きる。
他のデータ型も指定したい場合
var keywords: (string|number)[] = ['name','email', 'body', 0];

//タブル型
var payment: [number, string, number] = [1, 'apple', '100']
配列のデータ型を柔軟に指定できる。

//オブジェクト型
var object: { [key: string]: string } = {
  name: 'hogeta hogeo'
  id: 'hoge'
}
var post: object = [{ id: 12, content: 'lorem ipsum'}];

//共用型(Union型)
var sample: string|number|bloolean;
sample = `hugesaka hugeo`;
sample = 100;
sample = true;

//enum型    ⚠︎定数を複数定義し、グルーピングするための型
enum KeyCode{
  Backspace = 8,
  tab = 9,
  Enter = 13,
}

console.log(Keycode.Backspace); // = 8

enum ErrorCode{
  OK = 200,
  BAD_RESPONSE = 400,
  UNAUTHORIZED = 401,
}

console.log(ErrorCode.OK);

enum Character {    ⚠︎インデックスで管理したい場合は、省略が可能
  Bob, // 0
  Dad, // 1
  Mom, // 2
}

console.log(Character.Bob)

//any型(anyとkeywordを指定しておくと全てのデータ型を許容してくれる)
var something: any = 'foo';
something = 100
something = true;
something = {id: 1}

//null, undefined型(htmlの要素を取得する際、ページの読み込み前にnull値になってしまう場合に許容型でElementとnullを指定できる)
var el: Element | null = document.querySelector('#app')
var foo: undefined = undefined;

//型推論(自動で型が割り当てられる）
var unknown = 'string';
unknown = 10

```
rails g kaminari:views bootstrap4でNo such file or directoryと怒られた時の対処法

# 経緯
タイトルの件について、調べると`/kaminari-core-1.2.1/lib/generators/kaminari/views_generator.rb`に`require 'open-uri'`を追加する記事がすぐ見つかるが解決しなかった

# 結論
こちらのissue (https://github.com/kaminari/kaminari/issues/911) の言う通りにgemfileに以下のようにして`bundle install`しなおすと解決した

```
gem 'kaminari', :git => 'https://github.com/kaminari/kaminari'
```

# 補足
## 実行環境
```
# cat /etc/issue
Debian GNU/Linux 10 \n \l
# rails --version
Rails 6.1.3.1
# ruby --version
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux]
```
v-on:mousemuveで検証してみる


```vuejs
<body>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
  <div id="app">
      <p v-on:mousemove="mousePosition">マウスを乗せてください</p>
      <p>X:{{x}}、Y:{{y}}</p>
</div>
<script>
  new Vue({
    el: '#app',
      data: { 
          number: 0,
          x:0,
          y:0
        },
      methods: {
        mousePosition: function(event){
          console.log(event);
        }
      }
  })
</script>
</body>
```

option+command+jで検証画面を開きます。

```javascript
MouseEvent {isTrusted: true, screenX: 962, screenY: 215, clientX: 121, clientY: 35, …}
altKey: false
bubbles: true
button: 0
buttons: 0
cancelBubble: false
cancelable: true
clientX: 121
clientY: 35
composed: true
ctrlKey: false
currentTarget: null
defaultPrevented: false
detail: 0
eventPhase: 0
fromElement: null
isTrusted: true
layerX: 121
layerY: 35
metaKey: false
movementX: -3
movementY: 5
offsetX: 114
offsetY: 20
pageX: 121
pageY: 35
path: (6) [p, div#app, body, html, document, Window]
relatedTarget: null
returnValue: true
screenX: 962
screenY: 215
shiftKey: false
sourceCapabilities: InputDeviceCapabilities {firesTouchEvents: false}
srcElement: p
target: p
timeStamp: 158322.96499999939
toElement: p
type: "mousemove"
view: Window {window: Window, self: Window, document: document, name: "", location: Location, …}
which: 0
x: 121
y: 35
__proto__: MouseEvent
```
*console.logで取得しています。

今回注目すべきものは
clientX: 121
clientY: 35
になります。

ですのでこうコードを変更してください。

```vuejs
<body>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
  <div id="app">
      <p v-on:mousemove="mousePosition">マウスを乗せてください</p>
      <p>X:{{x}}、Y:{{y}}</p>
</div>
<script>
  new Vue({
    el: '#app',
      data: { 
          number: 0,
          x:0,
          y:0
        },
      methods: {
        mousePosition: function(event) {
          this.x = event.clientX;
          this.y = event.clientY;
        }
      }
  })
</script>
</body>
```

![20210505-152615.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/f8c1fdb5-4c77-1052-3f24-32bd6820aa2c.png)
デザイナー向けWeb/UIのギャラリーサイトと素材サイトまとめ+厳選便利ツールの紹介

オンラインブックマークサービス [RainDrop](https://raindrop.io/) を用いてブックマーク管理をしていますが、一部をQiitaで紹介させてもらいます。
目を肥やすという意味でデザイン系のギャラリーサイトは沢山ストックしておいたほうが良いので参考になれば嬉しいです。
特に解説等はいたしませんのでOGPの説明や遷移先のサイトで把握してください。

リストアップに集中しすぎて、つい脱線してフロントエンド系やディレクション支援系も載せましたが、他にもこんなのがあるよと共有してくださる奇特な方がいらっしゃいましたらコメントいただけると幸甚です。
※本リストは適宜追加/更新予定です

#デザイン系

## ギャラリー

### デザイン全般

https://www.pinterest.jp/

https://dribbble.com/

https://www.behance.net/

https://www.awwwards.com/

https://collectui.com/

https://sankoudesign.com/

https://muuuuu.org/

https://io3000.com/

https://www.ikesai.com/

https://screenlane.com/

###  スマホ特化

http://design.web-hon.com/

https://sankoudesign.com/sp/

http://agtsmartphonedesign.com/

### その他、LP、パーツ

https://partsdesign.net/

https://headers.netlify.app/

https://rdlp.jp/lp-archive

https://lookup.design/

https://re-designgallery.com/


### UI

https://yui.design/

https://mobbin.design/

https://consim.design/

### ロゴ

https://logostock.jp/

https://www.dailywebdesign.com/logo/

http://glaim.tkmweb.info/


## 素材

### 写真

https://pixta.jp/

https://o-dan.net/ja/

### イラスト

https://soco-st.com/

https://undraw.co/illustrations

https://iradesign.io/

https://loosedrawing.com/

https://tyoudoii-illust.com/

https://storyset.com/

https://www.ac-illust.com/

https://www.humaaans.com/

https://www.freepik.com/home

https://icons8.com/illustrations

### アイコン

https://www.flaticon.com/

https://beta.shape.so/

https://icons8.com/icons

https://fontawesome.com/icons

https://fonts.google.com/icons?selected=Material+Icons

https://experience-japan.info/

https://feathericons.com/

### その他

https://www.mockupworld.co/

http://www.ncd-ri.co.jp/about/image_system/


## アニメーション

https://codepen.io/trending

## ツール

https://color.adobe.com/ja/create/color-wheel

https://coolors.co/

https://contrastchecker.com/

https://whocanuse.com/

https://developers.facebook.com/tools/debug/

http://ogimage.tsmallfield.com/

https://cards-dev.twitter.com/validator

https://saruwakakun.com/font-family

https://voidism.net/metallicratio/

https://ocadweb.com/aspectratiotools

# フロントエンド系

## ツール

https://cssgradient.io/

https://realfavicongenerator.net/

https://yoshikawaweb.com/element/

https://grid.layoutit.com/

https://cssgrid-generator.netlify.app/

https://bennettfeely.com/csspiechart/

https://9elements.github.io/fancy-border-radius/#30.30.77.20--.



# ディレクション支援系

https://mogyura.com/

https://visualsitemaps.com/

https://www.fullstory.com/

https://developers.google.com/speed/pagespeed/insights/?hl=ja



# 参考にさせていただいた記事

* https://note.com/taqno/n/n27882b7ab9e4#BZjay
*
Python初心者　学習ノート　~基本文法~

◯ print ('文字列’）　→　（）内の文字列を出力.文字列または数式を表示したい場合は「''」または「""」で括る。数値の場合は「''」「""」は不要。

◯ # コメント →　行頭に「#」を記載するとコメントアウトができる

◯ 数式

```ruby:qiita.rb
・足し算
  print(1 + 1) = 2
・引き算
  print(2 - 1) = 1
・掛け算
  print(2 * 5) = 10
・割り算
  print(4 / 2) = 2
・余り
  print(3 % 2) = 1
```
◯ 変数
・変数の定義
　name = '名前'
　number = 24
・変数の出力
　name = 'Ken'
  print(name)
・変数の値の更新

```ruby:qiita.rb
#下記のように記述した場合、変数が上書きされる。
 x = 1
 print(x)
 x = 2
 print(x)
#出力結果　→　２
```
```ruby:qiita.rb
#下記のよう記述した場合、式であっても後述の変数が反映される。
 x = 1
 print(x)
 x = x + 2
 print(x)
#出力結果　→　3
```

・変数の式の基本形と省略形

```ruby:qiita.rb
 /   基本形　　　　省略形    /
   x = x + 5  → x += 5
   x = x - 5  → x -= 5
   x = x * 5  → x *= 5
   x = x / 5  → x /= 5
   x = x % 5  → x %= 5
```
◯ データ
・データ型

```ruby:qiita.rb
  'hello' = 文字列型
        7 = 数値型
```

・型変換str
データ型の異なる文字列型と数値型を連結すると、エラーが起きるので
「str」で数値型を文字列型に変換する。　

```ruby:qiita.rb
price = 1000
print('その本の値段は' + str(price) + 'です')
                     文字列型へ変換
```
・型変換int
文字列型を数値型に変換したい場合には「int」を用いる。

```ruby:qiita.rb
count = '5'
price = 100
total_price = price * int(count)
                      数列型へ変換
print(total_price)
```
◯ if文

```ruby:qiita.rb
score = 100
if score == 100: ← 行末にコロン
   print('完璧です')
 ↑
if文の条件式が成立した時の処理を書くときには、インデント（字下げ）をする。
```
・真偽値
比較演算子を用いた条件式の部分が、成り立つときは「True」、成り立たないときは「False」となる。

```ruby:qiita.rb
print(1 == 1) → True
print(1 == 2) → False
```
・比較演算子

```ruby:qiita.rb
x == y ← xとyが等しい時True
x ！= y ← xとyが等しくないTrue
x < y ← xがyより小さい時True
x <= y ← xがyと等しい時またはxがyより小さい時True
x > y ← xがyより大きい時True
x >= y ← xがyと等しい時またはxがyより大きい時True
```
・else
Flaseの場合の設定ができる

```ruby:qiita.rb
score = 50
if score >= 70: 
   print('合格です')
else: ← 行末にコロン
   print('不合格です')
↑　
elseは条件外なのでインデント（字下げ）はしない。
```
・elseif
もし○○ならばxxを行う、△△ならば▲▲を行う、そうでなければ□□を行う」という処理ができるようになる。

```ruby:qiita.rb
score = 50
if score >= 70: 
   print('A判定です')
elif score >= 60: ← 行末にコロン
   print('B判定です')
else:
   print('C判定です')
↑
elseは条件外なのでインデント（字下げ）はしない。
```
・and
「条件1も条件2も成り立つ」というような場合の条件式は「and」を用いる。

```ruby:qiita.rb
weight = 55
if 50 < weight and weight < 60:
    print('標準体重です')

# andを省略する書き方
if 50 < weight < 60:
    print('標準体重です')
```
・or
「条件1か条件2が成り立つ」というような場合の条件式は「or」を用いる。

```ruby:qiita.rb
day = '土曜日'
if day == '土曜日' or day == '日曜日':
    print('休日です')
```
・not
「not」を用いると、条件の否定をすることができる。
条件式が「True」であれば全体が「False」に、「False」であれば「True」になる。

```ruby:qiita.rb
time = 10
if not time == 12:
   print('お昼ではありません')
```
・input

```ruby:qiita.rb
price = 100
input_count = input('購入するみかんの数を入力してください: ')
                       inputで受け取った値は文字列型
count = int(input_count)
           数列に変換
total_price = price * count
print('購入金額は' + str(total_price) + '円です')
```

【参考文献】
・Progate
https://prog-8.com/lessons/python/study/1
【AWS】IAMまとめ

#はじめに

こんにちはrattsl([@rattsl](https://github.com/rattsl))です。
今回はAWS IAMについてハンズオンで色々いじったのでメモとして残します。
間違って認識しているところがあったらご指摘ください。

## やっていくこと
- IAMの仕組み理解
- IAM設計
- IAMグループへのポリシー適応
- IAMロールへのポリシー適応
- IAMロールの権限移譲
- IAMアクセスアナライザの設定
- AWS Organizationsの設定

### IAMとは
IAMとはユーザの権限を設定してAWSリソースへのアクセスを制限する仕組み。個人にポリシーをアタッチ、またグループにポリシーをアタッチすることで実現する。

### IAMの種類
利用者は権限を付与されたIAMエンティティ（ユーザ、グループ、ロール）として設定される。

|ユーザー|詳細|
|:-:|:-:|
| ルートユーザー  | アカウント生成時に付与されるユーザー |
|  IAMユーザー|管理者権限の許可がおりたユーザー|　
|  パワーユーザー(IAMユーザー) |  IAM以外の全てのサービスにフルアクセスできるユーザー |

ルートユーザで日常的なタスクはせず、管理者権限を付与されたIAMユーザで操作することが推奨されているが、ルートユーザにしかできない設定もあるので随時切り替えて管理する。

### IAMロールとは
AWSリソース（エンティティ）に対してポリシーをアタッチすること。
ex）EC2からS3にのみアクセスを許可する
狭義にはサービスだけではなくユーザに対してや別のSNSアカウントに一時的に権限を付与する役割も持つ。

**IAMロールの信頼ポリシーとしてIAMロールは監査人などに一時的な権限を委譲する際も利用する。**


### IAM設計
IAM設計する際はAWSを利用するユーザの役割や会社のセキュリティポリシーと兼ね合わせて設計する必要がある。新しいIAMユーザを登録する際は必要最低限のパーミッションを付与する。

数人程度のAWS利用を今後続けていくようだったらIAMユーザーを個々で設定していくのでもいいが今後人数が増えていくことを想定しているケースだったら初めからグループで設定していく方が運用が楽になる。

### IAMアクセスアナライザーの設定
AWSリソースへのアクセスをモニタリングするサービス。

### AWS Organizations
AWS Organizationsとは複数のアカウント自体を管理するサービス。
IAMとの違いはアカウント内のユーザーを管理するのに対してOrganizatiopnsはアカウント自体を管理するためレイヤーが違う。

管理者ルートにマスターアカウントを設定し、既存のアカウントをメンバーアカウントとして組織内に追加するという流れ。
組織単位でOUを設定し管理することも可能。
Organizationsのサービスコントロールポリシー（SCP）でリソースの境界を決める。

### Access Adviser
IAMエンティティが最後にAWSサービスにアクセスした日付と時刻を表示する機能を有する。

### インラインポリシーとは
自身で作成、及び管理できるポリシーのこと。1つのプリンシパルエンティティ（グループ、ユーザ、ロール）にアタッチすることが可能。

### EC2インスタンスへのIAMロールのアタッチ方法
EC2マネジメントコンソールからアクション操作でアタッチする。

### パワーユーザーのアクセス権限について
パワーユーザーはIAMユーザーやグループ管理以外のAWSリソースへのフルアクセス権限を持っている。
ユーザー管理以外できるとイメージする。

### IAMユーザーのデフォルト設定
IAMユーザーが作られた時点ではそのユーザー自体はどのリソースにもアクセス権限を持っていない。
Puppet boltを使用して複数サーバに接続したら、Authentication failed for～のようなエラーが出たため、解消メモ

こんにちは、tanzoです。

本日もPuppetBoltについてのお話です。
と言っても備忘録程度の内容なので、同じエラーで詰まっている人がいたら、
少しでも役に立てば、、、、と思います。


#複数サーバにアクセスする際の鍵作成の注意点

* 例えば、以下のコマンドでは、２つのサーバからkernelのバージョンを取得しようとしています。

`コマンド`

```
[yuta@localhost bin]$ ./bolt command run "uname -r" --targets ユーザ名1@IP,ユーザ名2@IP
```

ここで、もしサーバごとに認証する鍵を分けていた場合、上記コマンド実行した際に、以下のようなエラーが出力されます。
※この場合の認証する鍵を分けるというのは、ssh-keygenコマンドで作成したid_rsa.pubファイルの名前をid_rsa_centos.pubのように改名して、接続サーバごとに鍵を一つずつ作っておくことを言います。

`コマンド`

```
Started on ユーザ名1@IP...
Started on ユーザ名2@IP...
all authorization methods failed (tried none, publickey, password, keyboard-interactive)
Failed on ユーザ名1@IP:
  Authentication failed for user ユーザ名1@IP　→　なんか権限エラーって怒られている。。。
Finished on ユーザ名2@IP:
  xxxxxxxxxxxxxxxxx　　→　　これは上手く取れている(実際のバージョンは省略)
Successful on 1 target: ユーザ名2@IP
Failed on 1 target: ユーザ名1@IP
Ran on 2 targets in 1.41 sec
```
上記では、１つのサーバからはうまくkernelのバージョンが取れていますが、もう一つはAuthentication failed forのようなエラーが出て、取れていないですよね。。。

なので、___id_rsa.pubの名前は変えてはいけない___というのが、分かりました笑

###結論として、クライアント側で作成した公開鍵で複数のサーバに接続する場合にも、使用する公開鍵は1つにすると覚えておきましょう。(自分に対する言い聞かせ笑)

→　とは言っても、鍵を使いまわせるようにするのは、セキュリティ上あまりよくなかったりする気もするので、この辺の知見がある方、コメントを下さると幸いです、、、

#参考文献
* https://knowledge.sakura.ad.jp/22188/
* https://qiita.com/hana_shin/items/2003698873a5782b7efd