OmniAICreator/Qiita-1.07M huggingface dataset:
Windows10でSSHサーバーを立ててデフォルトシェルをBashにする

LinuxっぽくWindowsにSSH接続する方法です。
OpenSSHだとデフォルトシェルがコマンドプロンプトになってしまうので、Bashに変更する方法です。

## 手順

* OpenSSHをインストール
* デフォルトシェルを変更
* sshdサービスを自動起動

## OpenSSHをインストール

* Windows10 1803からOpenSSHサーバーが正式につかえるようになった
* スタートメニューの[アプリと機能]-[オプション機能の管理]-[機能の追加]でOpenSSH サーバーを選択して[インストール]をクリック

## デフォルトシェルをBashに変更

* デフォルトではデフォルトシェルがコマンドプロンプトになってる涙
* powershellを起動して以下を実行。ここでは、Git for Windowsのbashを指定。

```powershell
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Program Files\Git\bin\bash.exe" -PropertyType String -Force 
```

## sshdサービスを自動起動

* `Start-Service sshd`でsshdが起動
* サービス(services.msc)を起動して、"OpenSSH SSH Server"のスタートアップの種類を「手動」から「自動」へ変更

## Q＆A

* Q: わざわざSSHで入らなくてもリモートデスクトップでアクセスすればいいじゃん。
    * A: Homeエディションなのでリモデが使えません。。（非公式リモデだといつ使えなくなるか怖いし。）あと、Chromeのリモデは解像度が調整できないので×。
* Q: WSL使わないの？
    * A: WSLだとGPUが使えないので×。
* Q: Ubuntu入れればいいじゃん。
    * A: 事務用にも使ってるPCなので、Officeが使いたいんですよ。

## リファレンス

* [OpenSSHサーバーがWindows10に正式にやってきた](https://www.websec-room.com/2018/05/12/2933)
* [Windows10でOpenSSHサーバーを動かす](https://wave.hatenablog.com/entry/2019/02/23/080800)
* [OpenSSH : デフォルトシェルを変更する](https://www.server-world.info/query?os=Windows_Server_2019&p=ssh&f=5)
* [Windows10でBashのSSHサーバーを自動起動してみた](https://blog.fileshelfplus.com/windows/157)
EC2のLaravel6.0環境で記事投稿時にメールMailgunを使いメール送信する　AWS/Laravel連載(15)

# はじめに

前回までの記事で作ってきたアプリケーションで、投稿した場合にメールが届くようにしてみましょう。
[EC2のLaravel6.0環境でMailgunを使いメール送信する　AWS/Laravel連載(14)](https://qiita.com/rf_p/items/bcf4f4c24332abde1265)

![mail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/dd6bf61e-41eb-2df2-160e-cba718646b59.png)

# Mailableクラスを作る

基本的にいつもどおり公式ドキュメントに沿っていきます。
[メール 6.0 Laravel](https://readouble.com/laravel/6.0/ja/mail.html)

```powershell
$ php artisan make:mail PostSent --markdown=emails.posts.sent
```

Mailableクラスのapp/Mail/PostSent.phpと、メール本文resources/views/emails/posts/sent.blade.phpの２ファイルが生成されます。

```php:app/Mail/PostSent.php
<?php

namespace App\Mail;

use App\Post;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class PostSent extends Mailable implements ShouldQueue
{
    use Queueable, SerializesModels;

    protected $post;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct(Post $post)
    {
        $this->post = $post;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->from('rfdnxbro@gmail.com')
                    ->subject('新しく投稿しました')
                    ->markdown('emails.posts.sent')
                    ->with(['postTitle' => $this->post->title]);
    }
}

```

implements ShouldQueueしているので、送信時に自動的にキューが有効になります。
比較的処理が重いメール送信処理が完了しないと投稿時APIのレスポンスが来ないのはイマイチなためです。

```php:resources/views/emails/posts/sent.blade.php
@component('mail::message')
# 投稿がありました

{{ $postTitle }}

@component('mail::button', ['url' => route('home')])
投稿を見る
@endcomponent

{{ config('app.name') }}
@endcomponent
```

投稿時のクラスにメール送信部分を実装します。

```php:app/Http/Controllers/PostController.php
<?php

namespace App\Http\Controllers;

use App\Post;
use Illuminate\Http\Request;
use App\Mail\PostSent;
use Illuminate\Support\Facades\Mail;
...
    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $validatedData = $request->validate([
            'title' => 'required|max:255',
            'content' => 'required',
        ]);
        $post = $request->user()->posts()->create($request->all());
        Mail::to($request->user())->send(new PostSent($post));
        return $post;
    }
```

![mail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/dd6bf61e-41eb-2df2-160e-cba718646b59.png)

本日は以上です。
手元の yml データを Firestore に入れる

例えば、手元の複数の yml ファイルを、Document として Firestore に入れたいとする。

## yml
こういうのが data ディレクトリ以下に複数あるとする

```foo.yml
- id: "hoge"
  name: "Hoge"
  age: "123"
- id: "fuga"
  name: "aaaa"
  age: "1"
```

## script

こんな感じに書いて、 `yarn run build && node lib/sample_yml_uploader.js` みたいに叩く。

```sample_yml_uploader.ts
import * as admin from 'firebase-admin'
import * as fs from 'fs'
import * as yaml from 'js-yaml'

// adminsdk_key の json を読み込む
const serviceAccount = require('./sample-adminsdk')

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "https://XXX.firebaseio.com",
})

// 特定のディレクトリ以下の yaml を全て読み込む
const loadResult = fs.readdirSync('./data').map(file => {
    const data = fs.readFileSync(`./data/${file}`, 'utf-8')
    return yaml.safeLoad(data);
}).filter(el => el != null);
const dataList =  Array.prototype.concat.apply([], loadResult) // flat な配列にする

// Firestore に Document を set/update する
dataList.forEach( data => {
    data['updatedAt'] = admin.firestore.FieldValue.serverTimestamp()
    const docRef = admin.firestore().collection('version/1/foo').doc(data['id'])
    admin.firestore().runTransaction( async tx  => {
         const doc = await tx.get(docRef)
         if (doc.exists) {
            doc.ref.update(data)
         } else {
            data['createdAt'] = admin.firestore.FieldValue.serverTimestamp()
            doc.ref.set(data)
         }
    }).catch(err => console.error('Error: ', err))
})
```

件数多いなら batch で書いた方がいい。
Kaggle でインターネットを使わずにライブラリをインストールする方法

この文書はChris Deotteの[How to Install Without Internet](https://www.kaggle.com/c/severstal-steel-defect-detection/discussion/113195)の翻訳です。

以前の[投稿](https://www.kaggle.com/c/severstal-steel-defect-detection/discussion/103367)で、セグメンテーションや分類モデルを実装するために利用できる多くの素晴らしいGitHubリポジトリとライブラリご紹介しました。以下に、これらのライブラリをインターネットなしでインストールする方法を示します。

### インターネットなしでインストールする方法
1. まず、Kaggle ノートブックでインターネットをオンにして、`pip install [package_name]`と入力します。

2. マウスポインターをすべての青いリンクの上に移動してクリックし、関連ファイルをダウンロードします。
![how1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59574/c6f6b3c8-edbd-5848-41f6-38dc4ebaed70.png)

3. ダウンロードしたファイルをKaggleデータセットにアップロードします
![how2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59574/1251aa34-c839-6a5d-903f-fcc6918fb047.png)

4. 新しいデータセットをカーネルに追加します

5. インターネットをオフにして、すべてのファイルに対して`pip install [filename]`を記述します。上述の青いリンクと逆の順序でインストールします。
![how3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59574/636fb6c5-ed52-8d79-4593-e64a6cb5e3ed.png)
crontabの設定方法メモ

### 概要

cronの使い方をよく忘れるのでメモとして残しておく。

- 参考リンク
  - https://mahimahironron.hateblo.jp/entry/2019/10/22/crontab%E3%81%AE%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95%E3%83%A1%E3%83%A2

---

### cronとは？
クーロンではなくクロンが正しい呼び方のようです。
クロンとは自動実行をするためのデーモンのことです。
LinuxやmacなどのUnix系の環境で定期実行したいコマンドがある場合はcronに登録しておくことで指定した時刻にコマンドが実行されます。

--- 

### 設定方法

- まずはcrontabを開きます

```
# crontab -e
```

これで編集モードでcrontabが開かれます。設定によりますが通常エディタはvimとなります。

- そして以下のように書きます。

```
分 時 日 月 曜日 実行したいコマンド
```
曜日は0(または7)を日曜日として番号で指定します。  
「*」を入れるとワイルドカード扱いになり、全ての分や時間、曜日で設定したコマンドが事項されます。  
以下の例の場合、毎月の火曜日の毎時15分に/tmp/testというファイルにHelloと上書きすることになります。

```
15 * * * 2 echo "Hello" >> /tmp/test
```
bash_completionをユーザー個別に設定

##環境
OS: 18.04.1-Ubuntu
bash-completion: Version: 1:2.8-1ubuntu1

## 経緯
- ユーザー個別のcliアプリケーションをinstallした
- ので、ユーザー個別のbash_completionを設定したくなった
- sourceで読めばどうとでもなるが、どこに配置すべきかなやんだので調べてみた

## 結論

配置場所は```~/.config/bash_completion*```が正しい。

よって私は以下のようにする

```console
~/.config/
└── bash_completion
└── bash_completion.d/
    ├ aaa
    └ bbb
```

```sh:~/.config/bash_completion
# 本家のコードのマネ
# https://github.com/scop/bash-completion/blob/aa3652b6b7de9aabfafa79f52c70825f23f967ab/bash_completion#L2143
compat_dir="${XDG_CONFIG_HOME:-$HOME/.config}/bash_completion.d"
if [[ -d $compat_dir && -r $compat_dir && -x $compat_dir ]]; then
    for i in "$compat_dir"/*; do
        [[ ${i##*/} != @($_backup_glob|Makefile*|$_blacklist_glob) \
            && -f $i && -r $i ]] && . "$i"
    done
fi
```

## 詳細
- bash_completionは [bash-completion(apt package)](https://packages.ubuntu.com/disco/bash-completion)を利用している
- [bash-completion(apt package)](https://packages.ubuntu.com/disco/bash-completion)のhomepageは[bash-completion homepage]( https://github.com/scop/bash-completion)である
- [bash-completion homepage]( https://github.com/scop/bash-completion)にしきりに```$XDG_XXX_XXX```という変数が登場するので調べると、[XDG Base Directory Specification](https://wiki.archlinux.jp/index.php/XDG_Base_Directory_%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88)という規格のようだ
- [XDG Base Directory Specification](https://wiki.archlinux.jp/index.php/XDG_Base_Directory_%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88)によると、ユーザー個別の設定が書き込まれるディレクトリが定められており、そのデフォルトは ```$HOME/.config```である
- [bash-completion(apt package)](https://packages.ubuntu.com/disco/bash-completion)は[XDG Base Directory Specification](https://wiki.archlinux.jp/index.php/XDG_Base_Directory_%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88)に対応しており、[~/.config/bash_completion* がconfiguration fileとして扱われると書いてある](https://github.com/scop/bash-completion/blob/6009de8534cd24b71d0bfda479823abcc640e4b1/doc/bash_completion.txt#L13)
- よって```~/.config/bash_completion```までは正しくて、```.d```ディレクトリで個別に読み込むのはオリジナル(.config/下に置くのは多分よろしくないが、遠いところに置くのも嫌だ)
Ruby 入門＃１（出力、出力）

Rubyの勉強アウトプット
今回は、標準出力、標準入力について記載します。

## 標準出力
コンソールに文字列を表示するメソッド。
標準出力は複数メソッドが存在しますが、
今回は以下の２点を紹介します。

**print**
●改行されない。
●引数が文字列に変換され、出力されます。
【入力】

```
print "Hello"
print "World!"
```

【出力】

```
HelloWorld!
```
**puts**
●改行される。
●引数が文字列に変換され、出力されます。
【入力】

```
puts "Hello"
puts "World!"
```

【出力】

```
Hello
World!
```

**出力値**
計算結果、条件式の結果も表示することができます。
【入力】

```
#計算結果
puts 1 + 1
#条件式結果
math = 1
puts math == 0
```

【出力】

```
2
false
```

## 標準入力
キーボードから値を入力する。
変数名 = gets.chomp

【入力】

```
puts "お名前は?"
name = gets.chomp
puts "こんにちは、" + name + "さん"
```

【出力】

```
#入力値は田中
お名前は?
田中
こんにちは、田中さん
```
【駆け出しWEBエンジニアのためのメモ】サーバー立ち上げ時のエラー対処（Ruby on Rails）

Rails 6.0.0を使ってます。
サーバー立ち上げ時にエラーが出たため、以下の通り対処しました。
時系列で記載します。


↓↓↓


アプリケーションのあるディレクトリ内で

```
$ rails s 
```
を実行すると

```
~ Webpacker configuration file not found /Users/xxxxxxx/projects/my_first_app/config/webpacker.yml. Please run rails webpacker:install Error: No such file or directory @ rb_sysopen - /Users/xxxxxxx/projects/my_first_app/config/webpacker.yml (RuntimeError)
```

というエラーが出ました。

```
~ Please run rails webpacker:install ~
```
とありますので、

```
$ rails webpacker:install 
```

を実行し、webpacker.yml をインストール！

　

再度、アプリケーションのあるディレクトリ内で

```
$ rails s 
```
を実行すると

```
=> Booting Puma
=> Rails 6.0.0 application starting in development 
=> Run `rails server --help` for more startup options
Puma starting in single mode...
* Version 3.12.1 (ruby 2.5.3-p105), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:3000
Use Ctrl-C to stop
```
と、正しくサーバーを立ち上げることができました。
Rustで、初めてのLチカ

![LED.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452335/6b624854-7fb6-77cc-53d1-cee6ea43deef.jpeg)

### Rustを勉強中のiOSエンジニアです。今回はRustでGPIOについて調べて、Lチカを試しました。Raspberry Pi Zero WHとJetson Nanoは、両方ともにLinuxベースなのでLチカできました。
LEDの割り当てはGPIOの12番です。基板上のピンアサインはGPIO表を参照してください。

# Rustをインストールする
`curl -sSf https://sh.rustup.rs | sh`
インストール済みの場合は飛ばしてください。

# ledプロジェクトを作成する
`cargo new led`

# ledプロジェクトフォルダへ切り替える
`cd led`

# Cargo.tomlにGPIOを追記する。
```
[dependencies]
sysfs_gpio = "0.5"
```
GPIO制御のため、Cargo.tomlに追記してファイル保存して終了します。

# Lチカ・ソースコード(src/main.rs)
```
extern crate sysfs_gpio;

use std::thread::sleep;
use std::time::Duration;
use sysfs_gpio::Pin;
use sysfs_gpio::Direction;

const GPIO_PIN_NUM : u64 = 12;

fn main() {
    let pin = Pin::new( GPIO_PIN_NUM );

    println!("Lチカ");
    pin.with_exported( || {
        pin.set_direction( Direction::Out ).unwrap();
        loop {
            pin.set_value(0).unwrap();
            sleep(Duration::from_millis(200));
            pin.set_value(1).unwrap();
            sleep(Duration::from_millis(200));
        }
    }).unwrap();
}
```
srcディレクトリ下のmain.rsファイルをLチカに上書きします。

# ビルド
`cargo build`

# 実行
`sudo ./target/debug/led`
GPIO制御は、root権限が必要なので、上記の通りです。


# Raspberry pi Zero WH GPIO表
| sysfs GPIO | name | Pin | Pin | name | sysfs GPIO |
|:----------:|:----:|:---:|:---:|:----:|:----------:|
| | 3.3V | 1 | 2 | 5.0V | |
| 2 | GPIO2 | 3 | 4 | 5.0V | |
| 3 | GPIO3 | 5 | 6 | GND | |
| 4 | GPIO4 | 7 | 8 | GPIO14 | |
| | GND | 9 | 10 | GPIO15 | |
| 17 | GPIO17 | 11 | 12 | GPIO18 | 18 |
| 27 | GPIO27 | 13 | 14 | GND | |
| 22 | GPIO22 | 15 | 16 | GPIO23 | 23 |
| | 3.3V | 17 | 18 | GPIO24 | 24 |
| 10 | GPIO10 | 19 | 20 | GND | |
| 9 | GPIO9 | 21 | 22 | GPIO25 | 25 |
| 11 | GPIO11 | 23 | 24 | GPIO8 | 8 |
| | GND | 25 | 26 | GPIO7 | 7 |
| | DNC | 27 | 28 | DNC | |
| 5 | GPIO5 | 29 | 30 | GND | |
| 6 | GPIO6 | 31 | 32 | GPIO12 | 12 |
| 13 | GPIO13 | 33 | 34 | GND | |
| 19 | GPIO19 | 35 | 36 | GPIO16 | 16 |
| 26 | GPIO26 | 37 | 38 | GPIO20 | 20 |
| | GND | 39 | 40 | GPIO21 | 21 |


# Jetson Nano GPIO表
| sysfs GPIO | name | Pin | Pin | name | sysfs GPIO |
|:----------:|:----:|:---:|:---:|:----:|:----------:|
| | 3.3V | 1 | 2 | 5.0V | |
| | D2/SDA | 3 | 4 | 5.0V | |
| | D3/SCL | 5 | 6 | GND | |
| 216 | D4 | 7 | 8 | D14/TXD | |
|  | GND | 9 | 10 | D15/RXD | |
| 50 | D17 | 11 | 12 | D18 | 79 |
| 14 | D27 | 13 | 14 | GND | |
| 194 | D22 | 15 | 16 | D23 | 232 |
| | 3.3V | 17 | 18 | D24 | 15 |
| 16 | D10 | 19 | 20 | GND | |
| 17 | D9 | 21 | 22 | D25 | 13 |
| 18 | D11 | 23 | 24 | D8 | 19 |
|  | GND | 25 | 26 | D7 | 20 |
| | D0/ID_SD | 27 | 28 | D1/ID_SC | |
| 149 | D5 | 29 | 30 | GND | |
| 200 | D6 | 31 | 32 | D12 | 168 |
| 38 | D13 | 33 | 34 | GND | |
| 76 | D19 | 35 | 36 | D16 | 51 |
| 12 | D26 | 37 | 38 | D20 | 77 |
| | GND | 39 | 40 | D21 | 78 |
colabで12時間実行 (学習などで放置用)

初投稿します。お手柔らか(?)にお願いします🙏

Firefox(ブラウザ) + auto reload tab(アドオン)
で、30分程度起きにリロード設定すればできる。

https://addons.mozilla.org/ja/firefox/addon/auto-reload-tab/

1度目のリロード時には、画面遷移してよいかポップアップが出て遷移できず、
2回目のリロージにポップアップを無視してリロードしてくれる。

colab上で12時間実行するには90分以内のリロードが必要なので、
自動リロード設定は45分以内にしておく必要がある。

chromeでも同様のアドオンを使用して行うことを試みたが、
ポップアップが出ると何度トライしてもリロードできないので、Firefoxを使うのが無難。
[Unity 2019.3]きたるべきUniversalRP時代にピンクマテリアルと戦う

Unity 2019.3 以降、ユニバーサルレンダーパイプライン(Universal RP) が[描画のスタンダードになってきます](https://blogs.unity3d.com/jp/2019/09/20/how-the-lightweight-render-pipeline-is-evolving/)。

ユニバーサルレンダーパイプラインはこれまでの**スタンダードシェーダーやレガシーなシェーダーと互換性がない**ので、Universal RPのプロジェクトに以前のアセットを放り込むとこうなります。
![2019-10-22_125243.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/95604261-8e83-22a2-13c9-188bcbbc5504.png)

数個なら手動でマテリアルのプロパティからシェーダーをUniversalに変更すればよいでしょうが、
![2019-10-22_185313.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/77992839-6a83-9a7e-8745-78ac838bf65e.png)
![2019-10-22_125049.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/07fc020b-34ed-c284-cf36-f58ded2d9461.png)
こんなアセットだと絶望的ですよね・・・。

**安心してください**
Unityはちゃんとコンバーターを用意してくれています。
まず、コンバートしたいマテリアルをすべて選択した状態にして、
Edit > Render Pipeline > Universal Render Pipeline > Upgrade Selected Materials to UniversalRP Materials
を選択します。
![2019-10-22_125314.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/ed47a3fa-8d85-cba8-b360-2abc14fd15c2.png)

プロンプトが表示されるので Proceed ボタンを押します。
![2019-10-22_125347.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/b4ee3b6d-9786-562b-ef3a-d9a72d12b71d.png)

するとこのとおり
![2019-10-22_125412.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/00c6527a-9622-e61d-61ff-80af7e855533.png)

コンバートできるマテリアルの種類は[以下の通りです](https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@7.0/manual/upgrading-your-shaders.html)
![2019-10-22_190458.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/6c6312ad-219e-edda-ca29-382358efb9aa.png)

![gif_animation_004.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/e3b8acec-919c-b34f-fa91-60bc0094b3bf.gif)
RailsプロジェクトをAWS ECS（ALBあり）で動的ポートマッピングした上で、IP制限をかけたい

# やりたいこと
そのままではあるが

- Dockerでアプリケーションを起動するのだが、複数のタスクを起動するため、動的ポートマッピングを導入したかったので、その設定
- ただし、社内のアプリケーションのため、IP制限をコストかけずにかけたい

## 前提
- ECSで、railsアプリケーション、リバースプロキシのnginxをデプロイしている
- ALBで、リバースプロキシのnginxをターゲットグループに登録している
- nginxからrailsアプリケーションのpumaソケットにupstreamディレクティブを定義

## やりたくないこと
以下は、docker化しており、GitHub上のデータを変更してしまうので、事情により却下

- nginx.confやpuma.rbなどのファイルを変更すること
- 新たにosへパッケージをインストールすること

# 動的ポートマッピングの設定
タスクの該当設定部分のjsonを抜き出した。

複数のタスクが存在するので、そのどちらにもその設定をする。


```.json
{
  "containerDefinitions": [
    {
      "portMappings": [
        {
          "hostPort": 0,
          "protocol": "tcp",
          "containerPort": 80
        }
      ],
    }
  ],
  "networkMode": "bridge"
}
```

|プロパティ1|プロパティ2|プロパティ3|値|
|:--:|:--:|:--:|:--:|
|containerDefinitions|portMappings|hostPort|0|
|containerDefinitions|portMappings| protocol | tcp |
|containerDefinitions|portMappings| containerPort | 80 |
|networkMode|||bridge|

>bridge ネットワークモードでタスク内のコンテナを使用する場合、予約されていないホストポートをコンテナポートマッピングに指定できます。または、containerPort の指定時に hostPort を省略 (または 0 に設定) することもできます。後者の場合、コンテナインスタンスのオペレーティングシステムと Docker バージョンに、一時ポート範囲のポートが自動的に割り当てられます。
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinitions-portmappings.html

こちらのHostPortにあるようにタスクの設定をしてやる。

## 動的ポートマッピングによる挙動の変化
- 自動的にhost portが決定する
- 決定したportをALBのターゲットグループに登録する
- ALB自体がおかしくなった場合、dockerプロセスが再起動し、host portが変わり、そのportがALBに登録される（↓実際にポートが入れ替わったらこんな感じで自動的に変更される）
<img width="1444" alt="スクリーンショット 2019-10-22 19.05.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451035/e818e378-b3c6-5540-44be-0bfb74ab2ae3.png">

# IP制限をコストをかけずかける
- AWS WAFを利用すれば、簡単にできるのだが、１ACLに付き１ドルかかるということで、そこをケチることにした

## ALB自体に設定を加える
### 前提
ALBのリスナーには、既に80ポートへの設定がある

1. ルールの表示/編集をクリック
2. １つ目
    3. IFに送信元IPを設定する。ここには、複数のIPを設定可能（これが単数だったら要件外だった）
    3. THENに転送先でターゲットグループを指定する
4. ２つ目
    5. IFに全てに一致（要は、指定IP以外のことになる）
    6. THENに固定レスポンスを返す
        7. レスポンスコードを`404`とか`403`とかにする
        8. Content-Typeを`text/html`にする
        9. レスポンス本文を`<h1>Not Founct</h1>`にする

## セキュリティグループの設定
最後に、動的ポートマッピングの設定をセキュリティグループに加えてやる。

- これは、エファメラルポートを設定する形 Linuxは 32768-61000がデフォルトの範囲

>Also note that the Linux 2.4 kernel will default the range of 32768 through 61000 if adequate kernel memory is available, so changing the range may not be necessary on newer Linux systems.
https://www.ncftp.com/ncftpd/doc/misc/ephemeral_ports.html#Linux

# 最後に
Railsはあまり関係なかった。
AWS ECS（ALBあり）で動的ポートマッピングした上で、IP制限をかけたかったが、まとまった記事がなかったので、まとめた。
ラズパイメモ

ラズパイ３を使用する際に忘れがちになるコマンドや設定のメモのまとめ。
逐次更新

# OS関連

###現在のOSのバージョンの確認

```bash
lsb_release -a
```

###Kernelのバージョンの確認
```bash
uname -a
```

###アップデートの注意

やらないで！！　rpi-update
https://www.yukkuriikouze.com/2019/02/05/1608/

変にファームウェアはいじらない方がいいでしょう。
GoogleMy Mapsの調査

Googleのマイマップ
意外と便利なんだが、ブラウザ操作における解説しか日本語で見当たらない。

そして公式を読んでもよくわからなかった。
ということで、調査とまとめをしたい。が途中

# マップ上の制限
1つの地図の最大レイヤは、10個
1レイヤにつき2000か所まではプロットできる
　（Pointならできた、線も2000だっけ・・・・・？
　　合計は何だっけ…？）

# インポート

[マイマップヘルプ（地図上の対象物をファイルからインポートする）](https://support.google.com/mymaps/answer/3024836?hl=ja&ref_topic=3024924)より

```
ファイルのインポート
次のいずれかの形式で情報が保存されていることを確認します。

CSV
TSV
KML
KMZ
GPX
XLSX
Google スプレッドシート
Google ドライブまたは Google フォトに保存された写真

KML（KMZ を zip 解凍したファイル）の最大サイズは 5 MB です。

その他のファイルの最大サイズは 40 MB です。

インポートするデータが写真ではない場合、ファイルの先頭行にタイトルが含まれている必要があります。データを適切にインポートするため、次のいずれかの列が存在することを確認してください。

緯度と経度情報
住所
場所の名前
行数が 2,000 を超えるファイルはインポートしないでください。一度にインポートできる写真は最大 100 枚です。
```

CSVは1レイヤにインポートされる。2000個までの箇所はプロットされる。
KML（KMZ）であれば、レイヤを区切れば複数レイヤを同時にインポートできる。
ただし、すでにその地図にレイヤが存在する場合、うまくインポートはできない。
（上限までインポートして、あとは無視？）

KMZであっても、中に含まれるKMLファイルは5MB以下である必要がありそう。

## CSV / TSV / XLSX
![xlsx.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459648/99ee1714-a7a5-25f3-2267-12e0f27c3114.jpeg)

point の名前と 緯度・経度（latitude / longitude）の列名があればよさげ。
レイヤ名は、設定されていないときは、読み込んだファイル名になる。
インポート画面で、「緯度・経度の列名」→「位置の名前」の順で選択するので、その通りに設定される。
その他の列は、バルーンクリック時に表示される。

![xlsx2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459648/1cf96ec5-2058-eab7-a6a9-fa66d62f5ca9.jpeg)
![xlsx_file.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459648/984c8c64-c957-2867-5251-e123b460272e.jpeg)
↑の時は、col1を名前に設定。

## GPX
GPXデータは、[GPSデータ記録形式 KMLとGPX](http://www.ic.daito.ac.jp/~mizutani/gps/gpsdata_formats.html)より借用
![gpx.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459648/04ed6d29-1b30-438a-8425-1d67fc8b9363.jpeg)

- 要素の名前(track-7)は、`<name>`タグより
- `<time>`タグの時間(UTC)は、`<mytracks:timezone offset="○○"/>`で変更する（分単位)。<br />
e.g.)日本の場合は540

![track_start.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459648/27e76915-6cc5-9cdd-7734-342799ce5df6.jpeg)

- 出発地と目的地のバルーンは自動追加される。(されないことあった気がするけど気のせい……？)
- バルーン内項目は、最初/最後の点の`<ele>`タグの標高と、`<time>`タグの時間をoffsetしたもの。
- `<desc>`タグ内の情報は無視されてそう。

## KML / KMZ
- `<Folder>`タグで囲まれた範囲で1レイヤになる。(Max 10レイヤ)
- 線、ポイントの組み合わせができる。

# 参考
- [GPSデータ記録形式 KMLとGPX](http://www.ic.daito.ac.jp/~mizutani/gps/gpsdata_formats.html)
rsyslogでログのタイムスタンプの変更


ログのタイムスタンプを```yyyy-mm-dd HH:MM:SS```形式に変更する。

/etc/rsyslog.confに下記の設定を記載。

```bash
# 2017-12-15 19:17:01 854150 cron info CRON[12235]:  (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
$template template_name, "%timestamp:::date-year%-%timestamp:::date-month%-%timestamp:::date-day% %timestamp:::date-hour%:%timestamp:::date-minute%:%timestamp:::date-second% %timestamp:::date-subseconds% %syslogfacility-text% %syslogseverity-text% %syslogtag% %msg:::drop-last-lf%\n"

*.*;          -/var/log/syslog;template_name
```

---

# 参考

* https://qiita.com/11ohina017/items/087b1b7c4411c3b3195a
Raspberry Pi 3B+ でタクトスイッチからの入力

# はじめに
タクトスイッチを押したことを感知して Raspberry Pi にプログラムを実行させたい。
ということで、まずは基本的にタクトスイッチからの入力したことを感知するプログラムを作る。

だいたいPythonが多いのだけど、Rubyが慣れているので Ruby でできないかを探していると Pi-Piper とかいうものがあったのでこれを利用する。

#用意するもの
- Raspberry Pi 一式
- LED（何色でもよい）
- 抵抗（300Ω～1kΩ）
- ジャンパーワイヤー（オスメス型4本）

# 回路を組む
まずは以下のような回路を組む。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/c0ed4a88-443b-f777-e4e5-e87856bf1351.png)

タクトボタンを押すと、LEDがぴかーと光る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/48df8311-f308-8dc5-3a1a-eae9a7605cad.png)


タクトボタンを離すと、LEDが消灯する


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/2abea27c-3147-2718-68ff-965462286ec0.png)


ここまで出来たら準備完了


# Pi-Piper のインストール
インストールしようとすると以下のエラーが発生。

```bash
# gem install pi_piper
Building native extensions. This could take a while...
ERROR:  Error installing pi_piper:
        ERROR: Failed to build gem native extension.

    current directory: /var/lib/gems/2.5.0/gems/eventmachine-1.0.9/ext
/usr/bin/ruby2.5 -r ./siteconf20191022-2598-a6y1mo.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in /var/lib/gems/2.5.0/gems/eventmachine-1.0.9 for inspection.
Results logged to /var/lib/gems/2.5.0/extensions/arm-linux/2.5.0/eventmachine-1.0.9/gem_make.out
``` 

どうやら Rubyのヘッダーとかないとか言われたので、おそらく開発ツールがないと思ってインストールすると正解。
あと、libssl-dev も必要だったんで、一緒にインストール。

```bash
# apt-get install ruby-dev libssl-dev
# gem install pi_piper
```

# Pi_Piper でプログラム

さて、GPIO18 につないだ線だが、こいつに信号を入力したことを感知してほしい。
GPIOとは「汎用入出力」と言われて、ユーザが実行時に入出力を制御できるもの。
これを使ってボタン押したよっていうことを感知してほしい。

いちいちドキュメントまでたどり着いて見に行くのが面倒なので、Raspberry Pi 3B+ のピンの配列は以下に書いといた。
https://qiita.com/bakachou/items/6ddd08105f94185cbb4e

いざRubyでプログラムをしてみる。

```ruby
require 'pi_piper'
include PiPiper


# Pin オブジェクト生成
# GPIO18
# Pin への入力
# ボタンを押したときのイベント
pin = Pin.new pin: 18, direction: :in, pull: :down

# 入力待ちで入力検知して、以前の状態と変わったら変更内容を出力
loop do
    pin.read
    if pin.changed? then
        puts "以前の状態：#{pin.last_value}   =====> 今の状態： #{pin.value}"
        if pin.on? then
            puts "押"
        elsif pin.off? thenRas
            puts "離"
        end
    end
    sleep 0.5
end
```

実行して、タクトスイッチを押したり話したりすると以下のような感じで出力される

```
# ruby button_senser.rb
以前の状態：0   =====> 今の状態： 1
押
以前の状態：1   =====> 今の状態： 0
離
以前の状態：0   =====> 今の状態： 1
押
以前の状態：1   =====> 今の状態： 0
離
以前の状態：0   =====> 今の状態： 1
押
以前の状態：1   =====> 今の状態： 0
離
```
【Cassandra】テーブル構造 

# Cassandraのテーブル構造

Cassandra バージョン3以降前提

( 説明用ポンチ絵 )
![2019-10-22_180418.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497751/3bd842e4-b9d9-2417-2bff-24b596ccead1.png)

***
① table ( columnfamily )
・row(行)の集まり、RDBで言うところのテーブルに相当
・keyspaceに属する
※もともと古いバージョンでは「columnfamily」の呼称だったが、「table」の呼称に変更され、コマンド名やドキュメントの呼称に反映されている。ただし、実装上はcolumnfamilyが残っている(使用されてる)し、この呼称も使用される。

② row
・同じprimary keyを持つcolumnの集合

③ column
・Cassandraの最小のデータ構造 - 名前、値、timestampから構成

④ primary key ( row key )
・row(行)の一意の識別子、物理的なデータ配置を制御
・partition keyとclustering key(オプション)で構成 

⑤ partition key
・そのrow(行)を物理的に格納するデータの配置場所を識別
・データがクラスターから読み書きされるとき、partitionerがpartition keyのハッシュ値を計算し、格納場所を決定

⑥ clustering key
・partition内のディスク上のソート順を決定する。
・結果を昇順( ASC )または降順( DESC )に並べることが可能
***
partition key, clustering keyは、それぞれDynamodbのpartition key, sort keyに似ているが、複数columnで構成できるところが、Dynamodbと異なると思う。
FlutterのサンプルプロジェクトをiOSで動かせない場合の対処

Flutterを始めたのですが、プロジェクトを作ったばかりのシンプルな状態で、プロビジョニングも設定出来ているものの、実機で実行しようとすると以下のエラーが出ました。

```
/xxxxxxxxx/flutter/my_app/ios/Runner/AppDelegate.swift:8:65: error:
** **
'LaunchOptionsKey' is not a member type of 'UIApplication'

    didFinishLaunchingWithOptions launchOptions:

    [UIApplication.LaunchOptionsKey: Any]?
```

ググると、こちらが引っかかりました。
[Error running on iOS simulator with flutter](https://stackoverflow.com/questions/58158130/error-running-on-ios-simulator-with-flutter)

結論から言うと、返信に書かれているとおり、`UIApplication.LaunchOptionsKey`を `UIApplicationLaunchOptionsKey`に書き換えることでビルドが通り、実行できるようになります。

```AppDelegate.swift
didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?
```

swiftを有効にしたときのコードが古いまま？なんでしょうかね。
最近iOSは全く見てないので不慣れですが・・・

AndroidStudioからiOSアプリが動くのを見るのは何とも面白いので、みんなもっとFlutterしよう(笑)
Python 機械学習　入門#1 説明とanacondaのインストール

# 説明
最近Pythonの基礎を終わらせ次にPythonの機械学習をやっていこうと考え今回ブログを書こうということに至りました。ですので初心者の記録用に記載していきます。もし間違っている解釈などがありましたら、ぜひ教えてください！また自分の学習状況が悪く更新が遅れてしまう状態があるかもしれませんがご了承ください。

# anacondaのインストール
AnacondaはPythonの機械学習ををする上で必要なライブラリがたくさんあります。ですのでAnacondaを入れることを勧めます。
１　https://www.anaconda.com/download このサイトにアクセス
２　こだわりがない限りPython3.7をダウンロードしてください。
＊注意しなければいけないこと＊
私はAnacondaなしでPythonの環境を設定しようとしていました。その中でPythonのデフォルトを3.7に設定しようとした時にエラーが出てしまい、NumPyなどが機能しませんでした。そのような方がいましたらデフォルトをPython２になっている状態でAnacondaをインストールしてください
## 追記 Anacondaをアップグレードしたい時

```py
conda update lxml
```

# Jupyter-Notebookについて
Jupyter-Notebookはブラウザ上でコードを実行するためのインタラクティブな環境です。これはいわばターミナルでPythonを起動させてタイプしているのと変わらないと思ってください。またJupyter-Notebookは複数行を一気に打てるので間違いがあっても簡単にコードを直すことができます。
## 使い方
ターミナルで下記にあるようにコードをタイプしてください

```
jupyter-notebook
```
このようにすればJupyter-notebookを起動することができます。
以下のスクリーンショットのNewというボタンをクリックしてください。
<img width="582" alt="スクリーンショット 2019-10-22 18.39.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406024/8ec0f422-6e5c-b9f3-c2b6-eb40f99f2895.png">
そしてPythonをクリックしてください。
<img width="582" alt="スクリーンショット 2019-10-22 18.40.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406024/73ecdda3-cd1f-3d71-e847-d787267e02f2.png">
詳しく説明していきます。
・再生ボタンマークは実行する
・停止マークは実行を中止する
・半円矢印は再起動するということでこれをやってしまうと一回実行が止まってしまうので注意してください
・ハサミマークはコードの左にあるスペースをタップしてハサミマークを押すとそのコードは削除されます。
他にも色々とあるのでぜひチェックして見てください。
ECS(Fargate)でコンテナを起動してみた

# はじめに
この記事はコンテナ勉強用として試したことまとめたものです。
今回はECSのFargateでWebアプリをデプロイしてみました。

# 起動までの流れ
1. Dockerイメージを作成
2. ECRにイメージをプッシュ
3. ALBを作成
4. タスク定義を登録
5. クラスターを作成
6. サービスの作成

# Dockerイメージを作成
* Dockerfile配下のように設定

```dockerfile
# Base Image
FROM centos:centos7

# Install Apache
RUN ["yum", "-y", "install", "httpd"]

# Start httpd
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

# Copy Html
COPY index.html /var/www/html
```

* index.html

```html
<html lang="ja">
<head>
    <meta charset="UTF-8" />
    <title>ECS HTML TEST</title>
</head>
    <body>
        <center>
            <div>
                <h3>サンダース</h3>
                <h3>シャワーズ</h3>
                <h3>ブースター</h3>
            </div>
        </center>
    </body>
</html>
```

* イメージを作成する。

```shell
docker build -t test-ecr-repo .
```


# ECRにイメージをプッシュ
* 以下コマンドを実行してECRにログインする。
 
```
$(aws ecr get-login --no-include-email --region ap-northeast-1)
```

* 作成したイメージのタグ付けとECRへプッシュする。

```
# タグ付け
docker tag test-ecr-repo:latest 111111111111.dkr.ecr.ap-northeast-1.amazonaws.com/test-ecr-repo:latest
# ECRプッシュ
docker push 111111111111.dkr.ecr.ap-northeast-1.amazonaws.com/test-ecr-repo:latest
```

# ALBを作成
* サービスが停止しても自動起動させるためALBを配置する。
<img width="640" alt="ALB作成.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/677b4027-4438-59d3-1657-03e78920bf9b.png">
<br>【用語】<br>
リスナー：受信プロトコルやポートを指定する。<br>
ターゲットグループ：リクエストを送る先を設定する。

# ECSタスク定義を作成
* 以下のような形でECSのタスクを作成する。
<img width="640" alt="ECSタスク作成.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/57a1f5f8-3211-66be-727c-a3d867b8009c.png">

# ECSクラスターを作成
* 以下のような形でクラスターを作成する。
<br>クラスターテンプレートは「ネットワーキングのみ」を指定する。
<img width="960" alt="ECSクラスター作成.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/08cb08a1-cc23-a8ba-74bb-1e2dbace1781.png">

# ECSサービスを作成
* 以下のような形でサービスを設定する。
<img width="640" alt="ECSサービス作成.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/34d75311-eb59-2f62-b325-a27f17659ddf.png">
* サービス完了を確認する。
<img width="960" alt="ECSサービス作成完了.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/241f9209-fb0a-361b-0b64-0702d7a807a2.png">
* サービスがRUNNING状態になっていることを確認する。
<img width="960" alt="ECSサービス起動確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/8502e141-abb3-94c6-3309-50e8b2de7adc.png">

# 接続確認
* ALBのDNS名を確認する。
<img width="640" alt="ALB_DNS確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/cd4bab8e-dd04-c8f0-6db5-61cbd74e2f42.png">
* 確認したDNSでアクセスしてWebページが表示されることを確認する。
<img width="550" alt="アクセス確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/a6cb31ba-78e4-ce11-2382-f5b5069e8541.png">

# まとめ
* Fargateを使ってアプリの接続確認をすることができた。
* 手動だと設定項目が多いのでCloudformationで構築できるようにしたい。

# 参考
* https://qiita.com/NaokiIshimura/items/bf4c21500a5f542dff9a
Native Javascript for Bootstrapで折りたたみをつくる（脱jQuery）


題名の通り、Native Javascript for Bootstrapで折りたたみ(collapse)をつくってみます。

LinkとButtonをそれぞれ押下すると、メッセージが出てきて、もう１回押下するとメッセージが消えるというものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88533/b233ec21-5dd4-d4e3-7a01-9fa046742938.png)


どうしてNative JavaScript for Bootstrapを使用したかというと、jQueryなしにBootstrap使いたかったからです。（BootstrapはjQueryに依存しています。）
jQueryを使う場合と、Native javascriptを使う場合で、どれくらいコードの違いがあるのかも気になったので比べてみようと思います。


## Native Javascript for Bootstrapで実装


少しルールがあるので説明をします。

- clickされる要素がaタグだったらhref内に```#collapseExample（変更可）```を追加。（buttonだったら```data-target="#collapseExample（変更可）"```を追加。）
- clickされる要素に```data-toggle="collapse"```を追加。
- clickされたら出てくる要素に```class="collapse" id="collapseExample"```を追加。※idはclickされる要素に追加したidと同様にすること。

上記が守られていれば、javascriptは不要です！


<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="html,result" data-user="maaaaaiiiisan" data-slug-hash="rNNjpGy" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Native JavaScript for Bootstrap_1022">
  <span>See the Pen <a href="https://codepen.io/maaaaaiiiisan/pen/rNNjpGy">
  Native JavaScript for Bootstrap_1022</a> by Mai3ta (<a href="https://codepen.io/maaaaaiiiisan">@maaaaaiiiisan</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


## jQueryで実装

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="maaaaaiiiisan" data-slug-hash="vYYgjqM" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="vYYgjqM">
  <span>See the Pen <a href="https://codepen.io/maaaaaiiiisan/pen/vYYgjqM">
  vYYgjqM</a> by Mai3ta (<a href="https://codepen.io/maaaaaiiiisan">@maaaaaiiiisan</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


## まとめ

うーん、慣れているjQueryの方が楽だけれど、jsなしに書けるのもなかなか便利ですね！

jQueryは重かったり、SPAに向いていなかったりするので、最近のトレンドからは廃れてきているんですよね。
私の現場もjQueryは使っておらずこれからNative Javascriptで書くことが増えそうなので、書き方に慣れるようにします・・・w

### 参考文献

[Native JavaScript for Bootstrap](http://thednp.github.io/bootstrap.native/)
ストアドプロシージャの使い方（PostgreSQL）

#ストアドプロシージャとは
　データベースに自分で定義して（データベースサーバに貯めて（stored））、後で使うことができる手続き（procedure、戻り値のない関数）です。使用することで、何回も同じSQL文を打つ必要がなくなったり、クライアントとサーバの間の通信量を減らしたりできます。

#実行例
　あるテーブルの数値を取り出して（SELECT文を実行して）計算し、結果を別のテーブルに格納（INSERT文を実行）する例を見てみましょう。
　以下の2つのテーブル（operandテーブルとanswerテーブル）を使用します。operandテーブルのoperand1をoperand2で割った商を、answerテーブルのquotient列に入れて、余りを、answerテーブルのremainder列に入れるストアドプロシージャを作成してみましょう。

operandテーブル

 id | operand1 | operand2
----+----------+----------
  1 |        1 |        5
  2 |        2 |        5
  3 |        3 |        5
  4 |        4 |        5
  5 |        5 |        5

answerテーブル

 id | quotient | remainder
----+----------+-----------

##ストアドプロシージャの定義
　まずストアドプロシージャを作成します。PL/pgSQLの文法に関してはPostgreSQLのマニュアルを見てください。

```
CREATE PROCEDURE div_proc(int) AS $$     --引数に計算したい行のidを入れる
DECLARE             --変数の宣言
ope1  int;           --operandテーブルのopernd1を入れるための変数
ope2  int;           --operandテーブルのopernd1を入れるための変数
BEGIN               --手続き内容を以下に書く
SELECT operand1 INTO ope1 FROM operand WHERE id = $1;    --operand1をope1に入れる
SELECT operand2 INTO ope2 FROM operand WHERE id = $1;    --operand2をope2に入れる
INSERT INTO answer VALUES ($1, div(ope1, ope2), mod(ope1, ope2));   --計算結果をanswerテーブルに入れる
END;               --手続き内容終わり
$$
LANGUAGE plpgsql;　--言語を指定

CREATE PROCEDURE
```

##ストアドプロシージャの利用
　作成したストアドプロシージャを利用します。関数を使う時は、SELECTを使用しますが、ストアドプロシージャの場合は**CALL**を使用します。

**書き方：CALL ストアドプロシージャ名;**

```
postgres=# CALL div_proc(1);
CALL
postgres=# CALL div_proc(2);
CALL
postgres=# CALL div_proc(3);
CALL
postgres=# CALL div_proc(4);
CALL
postgres=# CALL div_proc(5);
CALL
``` 
answerテーブル

id | quotient | remainder
----+----------+-----------
  1 |        0 |         1
  2 |        0 |         2
  3 |        0 |         3
  4 |        0 |         4
  5 |        1 |         0

#今回のストアドプロシージャの利点
・長いSQL文を何回も書く必要がなくなりました。
・SELECT文の実行とINSERT文の実行を1回にまとめて行え、通信回数を減らせました（idを知っていることが前提ですが・・・）。

#まとめ
　ストアドプロシージャを使用することで実行が楽にできるようになり、クライアントとサーバー間の通信回数を減らすことができました。
読んでくださり、ありがとうございました！

#参考
PostgreSQL11のPL/pgSQLのマニュアル
https://www.postgresql.jp/document/11/html/plpgsql.html
自律的な開発チーム作りのためにやっていること

突然ですが、皆さんの役職はなんでしょうか？
１つの物作りに関わる人たちだけでも実に様々な役職があり、エンジニアにフォーカスしても様々な役割・スキルがあります。

この記事では、エンジニアでも下記のような役割を担う方々に向けて、自身がやっているチーム作りで得た知見を共有できればと思います。
 
* マネージャー
* チームリーダー
* テックリード

## 目指した開発チーム

自律的な開発チーム

* 自分でやりたいことを宣言できる
* 自分で決めて自分でやり切れる
* 開発ではなく案件を任せられる
* 楽しく元気に働ける

## 自分のチームが置かれていた状況

リーダーがタスクを整理して、各メンバーに割り当てる。タスクの進捗をリーダーが取りまとめて必要なチームに共有する。

### チーム構成

![Bitmap2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82592/215d7718-852b-7a7c-5ec0-af0b8e56e3b0.png)

### トップダウン型のメリット

- チーム全体を把握しやすい
  - ほとんどのことを自分が指示するので誰が何をやってるか見通しやすい
- 窓口が明確
  - 他チームからみたときに誰に話をすればいいかわかりやすい

### トップダウン型のデメリット

- メンバーが指示を待つようになる or 指示を求めるようになる
- メンバー同士の連携が希薄
  - 自分以外の人が何をやっているか知る必要がない

### 筆者の立ち位置と役割

リーダーの移動に伴って、その席に座ることになった

![Bitmap3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82592/26401c01-069c-4f64-3258-8e56d0995777.png)

## 提示したチームの方針

- やりたいタスクは自分で決める
  - やりたいタスクをタスク一覧から拾ってチーム内に宣言する
- チームのためになるタスクを6ヶ月のうち1つやる

### 目指したチームの構成

![Bitmap4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82592/b9bf1998-424e-ff3b-9616-f9fb54ef050f.png)

相互コミュニケーションが取れる構成にして、自分が全て支持しなくてもみんなで問題解決できるようにしたい。

## やってよかったこと

### メンバー全員との定期的な1on1

社員・パートナー含め、何を目的として会社にいてどうなりたいのかを聞く。
明確な目標を持っているケースの方が少ないので、どんなことが楽しくてどんなことが辛いのか、そのメンバーの嗜好やスタンスを理解する。
それを元に、可能な限りメンバーの目標に近いタスクが選択できるよう調整する。
定期開催であることを明示すると、そこに合わせて話題を持ってきてくれるようになる、自分から話すのではなく相手が話したいことを、なんでも話せる雰囲気を普段から作ることが重要。

### チーム方針を示す

自分のチームはどのようなものか全員に理解してもらう。
理解を得るまでには時間がかかるが、自分の描くチーム像を伝えることで、その方針に沿った判断ができるようになる。
また、メンバーの評価軸を明文化して、何をすれば評価されるのか伝える。

### だるいが言えるような雰囲気作り

個人的には「やりたいことが言えること」と同じくらい「やりたくないことが言えること」は重要だと思う。
日々のミーティングでは可能な限り発言しやすい雰囲気作りに努め、なんとなくいや、なんとなくいい感じが気軽に表現できるようにする。
そうやって、自分らしくいれるチームこそがメンバーの居たい場所になって結果的には業務効率に繋がっていく。。。と思っている。

### 社内・社外に評価されやすい仕組み作り

パートナースタッフが多いという特徴から、自社に提出しやすく、かつ自分のチームにメリットのあるタスクを自分で選定してやってもらうようにしている。
支持されたタスクではなく、主体的に選択して達成したという事実を積み重ねて、メンバーのやりがいに繋がるようにしている。

## やってダメだったこと

### 危機感を煽る

今のチームの問題点をあげて、改善しないとまずいことを説明する。
しかし、リーダーとメンバーでは持っている情報に差異があり、同じ結論にたどり着くことは難しい場合もある。
正確に自身の考えを伝えられればいいが、コミュニケーションは出し手と受け手の両者がいて成立するものなので100%伝わるとは思わない方がいい。
言われた側としては、そんなことは知らないし、この人は急に何を言ってるんだろうとなる。
これをやるくらいなら、「自分のチームの方針がいかに素晴らしいと思ってもらえるか」を考えた方がいい。

### 困ってたらすぐ助ける

これをやってるといつまで経っても育たない。
何かあっても助けてくれるだろうという甘えは安心感とは似て非なる物なので注意が必要。
致命的な事態にならないものであれば失敗してみた方が早いと思うが、そうでない場合は解決するためにどうやって動くべきか伝える方がいい。

## 今後チーム作りをする人へ

チームのことを考えるのは開発することとは違った気付きや苦しみがあると思います。
ただ、ソロで開発し続けるのはいつか限界が来ると私は考えています。自分で作るのが一番楽しいけど、もっと大きな物をみんなで作っても楽しいよねという気持ちでチャレンジしてみるといいかなと思います。

（そして、できればそういう人と情報交換したいなと思ってこの記事を書きました。）
【FileMaker】続々々・カテゴリごとに管理番号を振る　名称を表示しつつコードの方を管理番号に採用

タイトル、長いですね。
4記事目となりました、「カテゴリごとに管理番号を振る」シリーズ。（シリーズなのか？）
[最初の記事](https://qiita.com/tyuma/items/9afe39bb9575e7b3a244)に割とコメントが着くので、そこから派生してシリーズになった感じですが、今回は、カテゴリ名称とコードを管理しているバージョンになります。
ただ、管理番号を振るところまで書いてしまうと、今までの記事と被ってしまうので、ここでは名称とコードを管理している場合の実装方法について記事に起こしました。

#考え方
考え方は、マスタテーブル化して、そのマスタデータを値一覧に設定して活用していく方法になります。
値一覧は選択するようなレイアウトで簡単にプルダウンなどで活用できますので、使用方法は割と多くの方がご存知だと思います。
元々の記事では、単純にカテゴリを値一覧でベタに設定していました。
<img width="658" alt="カテゴリ値一覧" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/b312681d-a068-188f-8d71-ddbdc5c3c2d3.png">

これを、マスタ化します。

#実装
では、実装方法です。
まず、マスタテーブルを作ります。
<img width="863" alt="マスタテーブル" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/62bee919-d953-2b6b-d92a-19ea9371d43a.png">

データを追加します。
<img width="332" alt="マスタデータ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/1913d4ee-224f-c522-0be3-65b6ef9d254f.png">


値一覧を作ります。
<img width="780" alt="値一覧" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/33152124-3da3-bff2-03e6-dc0e15fd52c1.png">

この時、管理番号にしたいカテゴリとは別に、表示するフィールドにカテゴリ名称を指定します。
名称は表示で使うのみなので、レイアウトで選択して実際に取得されるのはカテゴリになります。

ここまでが、下準備になります。

この値一覧を、使います。
<img width="738" alt="レイアウト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/29385b8d-5207-a3e6-c2d5-d735c4ad77e2.png">

#表示
では、この値一覧を使ってみましょう。
<img width="523" alt="表示" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/cc9d3b5c-5fbf-5c74-5253-4997efc5f95c.png">

いいですね。
これで名称と実際に使用するコードの分離ができています。
スクリプトは最初の記事にあるそのままで使用できます。

#管理番号を振るという様々なケース
っていうのが結構あるな、と思いました。
事件は現場で起こってるってところでしょうかね。（古い）
プログラミングにおいて安全ってなに？

# 結局型安全ってなんだ？
プログラミングしていても、人のために書いたことがないからなのか、安全性についてクリティカルな出来事がないためよくありがたみがわかっていない。
型安全について書いてある本の部分をまとめます。

# 安全でない状態
C言語は未定義動作(undefined behavior)をする場合がある。
例えば配列の終端より後ろを参照した場合。

C言語の標準(通称C99)では未定義動作に対してペナルティを課さない方針である。
すべてはプログラマーが安全なコードを書くように務める責任を負うことで、この問題の解決を図っている。

しかし、一般的に良いコードと呼ばれるコード群を解析すると、未定義動作をするコードを含むものがほとんどらしい。

# 未定義動作を放置するとどうなるか
未定義動作はプログラムが任意の動作ができるという意味である。

よって、良からぬ考えを持つ人間はそれを利用する。

# 用語
プログラムが未定義動作を行わないとき、そのプログラムは完全に定義されているといえる。

それをプログラミング言語側が保証するときそのプログラミング言語は**型安全(type safe)**である。

# Python等はどうなのか
Pythonは型安全である。

範囲外参照などを検出し処理するということのプロセッサ時間をさくことをいとわない。

PythonはC/C++から何倍も遅いのも納得する。

# Rust
RustはMozillaが開発支援する言語で、安全性、並列処理機能がありながら、C/C++と同等の速度が出る言語である。

（追記）Rustはグレイドン・ホアレが個人で開発を始め、後にMozillaが開発支援へ参画したオープンソースプロジェクトのプログラミング言語である。


# 引用元
O'Reilly プログラミングRust
SE／システムエンジニアとしての成功は小さな習慣の積み重ねではないか

# 概要

就職して一番何が変わったかと聞かれると「本を読むことが多くなった」／「読書が趣味になった」と答えるほど最近は本を読んでいる私が参考書籍に記載の本に感化されて投稿を思い立った。【小ネタ】シリーズです。

今までの投稿は少し気合を入れないと書く気になれないのでこの【小ネタ】シリーズは、ずっとライトなアウトプットをしたいと思って作ったシリーズです。
アウトプットが重要という本を読んで感化された結果でもあります。
（Twitterでいいじゃんと聞こえてきそうですが、私はQiitaの方が好きなのです）

シリーズの１つ目は、SE／システムエンジニアとしての習慣です。

## 習慣でできるようになること

* 習慣１つで理想の自分が手に入る
* 習慣１つで仕事がうまくいく

と、いきなり胡散臭いことを書きますが、10年の超える仕事人生の中で半分は真実であると思っています。
仕事／人間関係ともに重要なのは長い時間の中でコツコツと積み上げた小さな成功／信頼の積み重ね、つまり小さな習慣の積み重ねと思っています。
長い時間、例えば10年という時間の積み重ねはどんなに小さなことでも簡単に取って代われるものではないはずです。

という理想に向かって、じゃあどうやって習慣を続けるかというのが今回の主題です。

## 習慣を続けるには

* 習慣とは、自分で決めたことを自分との約束として守ること、少しずつでも続けること
    * あくまでも自分です。他人は関係ありません。他人に何を言われようが10年を続けるとそれは確かに大きな結果につながります。
* 脳が好きなことだけ続く、いかにやることにプラスの要素を入れられるかが重要
    * 意思の強い／弱いに関係なく誰でもつらいことは続きません。やるべきと義務化するのではなく、続けた結果、こういう成果が得られるや、続けた結果、節目節目で自分へのご褒美を用意するのも続けるための手です。
* まずは超超簡単なことから、例えば朝早く起きるではなく、朝目を開けるところから
    * 続けるためにはまず成功体験が重要。無理にやることのレベルを上げて挫折するよりまずは無意識に続けられることを選択する

## 参考書籍

<a target="_blank"  href="https://www.amazon.co.jp/gp/product/B07HQ41FSN/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B07HQ41FSN&linkCode=as2&tag=se_note_002-22&linkId=458eddcf3d9738bb46cd26c2f45d5713"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=B07HQ41FSN&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL110_&tag=se_note_002-22" ></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=se_note_002-22&l=am2&o=9&a=B07HQ41FSN" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
[習慣が10割](https://amzn.to/3l9597f "習慣が10割")
PycharmでDjangoプロジェクトのBootstrapコード補完を有効にする

DjangoでWebサイトの開発をしていたのですが、プロジェクトにpipでbootstrap4をインストールするだけではbootstrapのコード補完が有効になりませんでした。
長らく無視してコードを書いていたのですが、いい加減効率悪いと思いコード補完できるようにしました。

# 結果BootstrapのDLページでDLするだけでした
とは書いたのですが、実際には「Compiled CSS and JS」からDLし、CSSデータが入っているフォルダを自身のプロジェクト下に置く作業が必要です。

Compiled CSS and JSのDLは以下から
[Bootstrap ダウンロードページ](https://getbootstrap.com/docs/4.3/getting-started/download/)

私自身はDjangoプロジェクトを始める際に作成したプロジェクトのvirtualenvが管理されているvenvというディレクトリ下に入れています。
これでgithubにpushする際にも混ざらずに管理することができると思います。（フォルダの名前はcssからcss_bootstrapに変更しています。）
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400162/2246fd57-8f87-a2a0-9f54-19cf00791e91.png)
PostgreSQLにて複数のSQLファイルを一括実行する

# 概要
sqlplusではSQLファイルを指定してを実行する際、SQLファイル内に記載したSQLファイルを呼び出して実行することができる。
`> sqlplus user/pass@sid @xxx.sql`

```xxx.sql 
@a.sql
@b.sql
@c.sql
・
・
・
```

PostgreSQLでのＤＢ構築を行うためにデータベースに複数のテーブルを一括作成する必要があり、
上記の対応をPostgreSQLでも実行できるか検証する。

＜実行環境＞

| 環境 | バージョン |
|:---|:--:|
| CentOS | 7.6.1810 |
| PostgreSQL | 9.2.24 |

# 検討内容

psqlコマンドでは/fオプションで実行するファイル名を指定できる。
またpsqlでのログイン後に\iオプションで実行するファイル名を指定できる。
この２つのオプションを利用してみる。

[参考にしたサイト](http://mrcds.blog.fc2.com/blog-entry-3.html)

# 構成

```
/opt
　/postgresql
　　├all.sql　　　  ←/fオプションで指定するSQLファイル
　　├allexecute.sh　←一括実行用シェル
　　├result.log　　 ←一括実行結果
　　└tables
　　　├table1.sql 　←all.sqlから呼び出されるSQLファイル
　　　└table2.sql 　←同上
```

```allexecute.sh
#!/bin/sh

echo `date '+%y/%m/%d %H:%M:%S'`
echo "一括SQLを実行します。"

# SQLを実行する
psql -U sandbox -h 127.0.0.1 -d db_sandbox -f ./all.sql > ./result.log

echo `date '+%y/%m/%d %H:%M:%S'`
echo "一括SQLの実行が終了しました。"
```

```all.sql
\i /opt/postgresql/tables/table1.sql
\i /opt/postgresql/tables/table2.sql
```

```table1.sql
DROP TABLE staff1;
CREATE TABLE staff1(
id integer, name character varying(10)
);
```

# 対応結果

```result.log
DROP TABLE
CREATE TABLE
DROP TABLE
CREATE TABLE
```

# まとめ
PostgreSQLでも複数のSQLを一括実行することはできる。
今回は試作段階なので改善点は多々あり。

* psqlでログインするユーザー名やデータベース名やホスト名はシェルの引数で指定できるようにすべし
* 作成したテーブルの定義も一括で確認できるようにすべし
* result.logに実行した日時とどのDBオブジェクトを適用したのか出力にすべし。
TARGET を追加したら Pod が読み込まれなくて死ぬほどハマったので備忘録

# 追加したTARGETのSchemeでビルドしたら失敗する

## その１ No such module ~~~
```
No such module 'FirebaseFirestore'
```

これは余裕。キャッシュ残ってるんでしょ？
`rm -rf ~/Library/Developer/Xcode/DerivedData` （ターン！）
`Cmd + Shift + K（クリーンビルド）`(ターン！)

解決せず。。。

### 解決方法
1. 追加したTARGET > General > Linked Frameworks and Libraries がなぜか空になっているので `Pods_appName.framework`を追加
2. Project > Info > Configuration > 追加したTARGET が None になっているので修正

**ここが空なので追加する**
![スクリーンショット 2019-10-22 午後5.51.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/f932bbb2-9bae-6741-3329-797f74238b6c.png)

**ここの None を修正**
![スクリーンショット 2019-10-22 午後5.53.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/431b3ffb-e2dd-e721-10d3-979708f8b171.png)

よっしゃ！！！ビルドできた！！！


## その2 dyld: Library not loaded: @rpath/

```
dyld: Library not loaded: @rpath/name.framework/name
Referenced from:

/Users/xyz_xyz/Library/Developer/CoreSimulator/Devices/xxxxxxx/data/Containers/Bundle/Application/xxxxxxx/appname.app/appname
Reason: image not found
```

なんでやねん。。。

### 解決方法

TARGET > Build Phases > Run Scripts で Pods を読み込む設定を入れる。
こんな感じ↓↓↓

```
"${PODS_ROOT}/Target Support Files/Pods-Oshidori/Pods-Oshidori-frameworks.sh"
```
**複製した方の [CP] Embed Pods Frameworks に書いてあるものを、追加したTAEGETの Run Scripts に入れる**
![スクリーンショット 2019-10-22 午後5.55.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/5a25beee-6fdd-431c-7aa9-bd3e0fc94ad4.png)

**この空っぽのところにコピーして入れる**
![スクリーンショット 2019-10-22 午後5.55.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/a3250142-c317-331f-5f6a-0154183a3b8b.png)
素人がDeep Learningお勉強用環境をつくる#1

## はじめに（背景）
昨今、巷では、AIやDeep Learningが何かと話題になっているかと思います。なぜかAIと言えば、それだけで良くも悪くも注目される雰囲気ですよね。

以前の、Web系（LAMP）や、iphone/Androidアプリの流行の時と近い雰囲気を感じますが、まずはどういった技術なのか理解したいと思い、機械設計者である私が、自主研鑽のため、手を出し始めました。

この記事以降では、勉強する中で、集めた情報を、記録として残したいと思います。
ただ、私は専門家ではありませんので、間違いや不正確な表現が混入する可能性大です。予め、ご了承いただければ幸いです。


## PC仕様を考える
まずはPCが必要。PC購入にあたって、下記のようなこと考えました。

1. Cuda・TensorRT（Deep Learning推論最適化・実行ライブラリ）を使用したい
2. 自己研鑽＆趣味なので、お金はかけれない
3. 外でも使いたい。持ち運びたい
4. ある程度コーディング作業もしたい
5. ライブラリの充実度や自由度でUbuntu環境がよい
6. でも書類作業とかもあるのでWindows環境も必要
7. 物体検出とかしてみたいから画像を取り扱える転送速度が出て、ストレージ容量がある程度欲しい
8. 物体検出とかしてみたいから画像を取り扱えるメモリ容量欲しい


で、それを個人的な感覚も入れて、ハード仕様に落とすと

① ミドルクラスNvidia GPUを搭載（Intelの統合チップ、AMDのGPUは不可）
② 10万円以下
③ ノートPCで15.6インチ以下で2.5kgくらいまで
④ 解像度がFull HD以上
⑤ 同士がいないようなマイナーなメーカーや、ドライバが見つからなさそうな特殊なハードはNG
⑥ Windowもデュアルブートで残す -> ストレージ先頭のセクターで、ブートローダーの競合が嫌なので、ストレージは2つ積みたい
⑦ SSD 500GB以上
⑧ メモリ 16GB以上


##PCを探す
もちろん全てに該当するスペックのPCは見つかりませんでした。まぁ、10万円以下では、まず無理ですよね。

逆にいうと、お金の制約を外せば、いくつか見つかる。その中でも、Thinkpad X1 Extremeあたりをおすすめします。20万円くらいのようです。Ubuntu公式で、ある程度の動作確認がなされているようです。OSが入らないと、高価な文鎮になりますからね。。。ちなみに、GPUから判断して、たぶん2018年モデルのことを指してます。
https://certification.ubuntu.com/hardware/201809-26479
https://www.lenovo.com/jp/ja/notebooks/thinkpad/x-series/ThinkPad-X1-Extreme/p/22TP2TXX1E1

ただ、しがないサラリーマンの私は、趣味に20万円は出せないので、却下。
ハイリスクですが、ポテンシャルの高そうなノートPCを購入して、部品を換装する方向で検討しました。一番のネックはGPUなので、そこを起点に、メジャーメーカーのラインナップから、1～6を満たすものを探すと、1つだけ見つかりました！

↓これです。HP Pavilion Gaming 15の一番安いモデル。2019/10現在 NTT-Xストアモデルが8万円くらいで、驚きのスペック。
https://jp.ext.hp.com/gaming/personal/pavilion_gaming_15/
https://kakaku.com/item/K0001097821/


__スペック__

|OS |Windows 10 Home 64bit |
|---|---|
|CPU|Core ™ i5+ 8300H プロセッサー|
|メモリ|8GB×1(スロット空き1)[DDR4-2666MHz]|
|ストレージ1|HDD 1TB(SATA)|
|ストレージ2|インテル® Optane™ メモリー (16GB / NVMe M.2)|
|GPU|NVIDIA® GeForce® GTX 1050(GDDR5 4GB)|
|質量|約2.3kg|
|その他|HDMI/USB3.1Type-C出力とか、Gigabit Etherとか|

これに、メモリを追加、ストレージ2を換装すれば、とりあえず、前述の①～⑧すべてを満たせます！

追加購入したメモリとSSDはこちら
__CFD Selection D4N2400CM-8G(4000円くらい)__
https://kakaku.com/item/K0000905145/
__Crutial P1 CT500P1SSD8JP(7500円くらい)__
https://kakaku.com/item/K0001101037/


⇒素人がDeep Learningお勉強用環境をつくる#2に続く
https://qiita.com/minarai-engineer/items/63459eb8387970e50646
上下のスクロールでふわっとコンテンツを登場させる

# はじめに
### 使うもの
- [Waypoints.js](http://imakewebthings.com/waypoints/)
- [Animate.css](https://daneden.github.io/animate.css/)

### したいこと
- 下へのスクロール時に、該当コンテンツが画面内に登場したらそれをふわっと表示させたい
- 上へのスクロール時に、該当コンテンツが画面内に登場したらそれをふわっと表示させたい

→ 下スクロールの直後に上へのスクロールが行われても、また逆の場合にもふわっとさせるのを連続で行いたい
[![Image from Gyazo](https://i.gyazo.com/57fb4185ea33f53b16ad12f377323072.gif)](https://gyazo.com/57fb4185ea33f53b16ad12f377323072)

### 前提
- ふわっとさせる処理そのものは、Animate.cssのを用いる
- 該当コンテンツにいつAnimate.cssのクラスを付与するかをWaypoints.jsおよび自身のjsファイルに記述していく

# 考え方
- 上下のスクロール
    - ifで条件分岐させる
- 下スクロールの直後に上へのスクロールが行われても、また逆の場合にもふわっとさせるのを連続で行いたい
    - cssの追加や削除が必要
    - 既に付与されているcssのクラスがある場合、それを削除してからでないと起動させたいクラスは動かない
    → ここの順番間違えると絶対うまくいかないと思われるので気をつけて下さい。記事主もここにハマりました。初歩的なことに躓き、悔しい限りでした。

# 表題の処理において学んだこと
今回は、上記「考え方」の二つ目に詰まりました。

- cssのクラスを付与する場所は同じ(同一の場所に相反するクラスを起動させると画面からコンテンツが消える)
- では、スクロールが感知された時点で付与されているcssのクラスは何か

検証にて確認したところで、クラスの削除が各分岐内で先に行わなければならないのか、と気づきました。
やりたいことと実際に動いているものの確認と、発動させるものの順序、これら基本的なところを忘れずにしようと思いました。

# コード
[こちら](https://github.com/exchange-wata/waypoints)です。