OmniAICreator/Qiita-1.07M huggingface dataset:
HPE 製の一部製品における SAS SSD ファームウェア不具合について

プログラミングとは関係ありませんが、影響範囲が非常に大きいと思われる情報なので、備忘も兼ねて記事を投稿します。

# はじめに

<font color="Red">**本稿はあくまで備忘であり、この内容により受けた問題に対して責任は負いかねますのであらかじめご了承ください。**</font>

最初は「PC Watch」というサイトで情報を見つけたもので、HPE から出された、SAS SSD のファームウェアに関する重大な修正情報でした。

[HPEのサーバー向けSAS SSD、稼働32,768時間超えでデータ喪失。復旧も不可](https://pc.watch.impress.co.jp/docs/news/1222207.html)
⇒ページ内に HPE (Hewlett Packard Enterprise) から出されている以下の文書へのリンクがあります。
　[HPEサポート文書](https://support.hpe.com/hpsc/doc/public/display?docId=emr_na-a00092491en_us)

# 問題の内容

**HPE 製**のサーバやストレージ製品に使用されている特定の SAS SSD において、**稼働時間が 32,768 時間 (おおよそ3年270日8時間) を超える**と、その SSD に障害が発生して **SSD 上のデータが復旧できなくなる**というものです。

具体的には、**「HPD8」より前のファームウェア**を使用している SSD で発生するとのことです。

つまり、普通に使って稼働時間が 32,768 時間を超えると、自動的にデータが吹っ飛んでしまうというものです。

# 原因

「HPD8」より前のファームウェアの不具合に起因します。

具体的な原因は PC Watch に以下のように記載されていたものの、HPE のサポート文書には記載がなかったため、100% 確実な情報かは判断できませんでした。

```(抜粋)
32,768は16bitの整数型で負から正まで扱える範囲の最大値を1つ超える数値であり、これに関連した不具合と見られる。
```

この内容だと、連続 32,768 時間稼動で問題が発生するようにも見えますが、HPEサポート文書には「連続」か「累積」かは明確に書かれていないので、実際にサポートに問い合わせた方が良いかもしれません。

ただ、内容的に OS の 497 日問題等と同じように見えるので、「連続稼働 32,768 時間」が条件となるような気がしています。

[Microsoft サポート：497 日問題](https://support.microsoft.com/ja-jp/help/2553549/all-the-tcp-ip-ports-that-are-in-a-time-wait-status-are-not-closed-aft)

# 影響範囲

上述の HPE サポート文書の「影響のあるハードウェア プラットフォーム」に記載があります。
通常の ProLiant サーバや BL660c といったブレードサーバ等、物理サーバだけでなく仮想化ソフトを動かすことが可能なサーバも含まれるため、影響範囲は小さくはないと思われます。

非常にまずい影響の具体例としては、以下があるかと思われます。

- シングル構成のサーバの場合
⇒データが吹っ飛んで、OS からの再構築になるかと思います。

- 同一サーバやストレージで RAID 構成を組んでいる場合
⇒起動が同タイミングであるため、RAID 構成の意味をなさないものとなります。

- HA 構成等で両ノードを同時に起動していた場合
⇒両ノードが同時に停止する可能性があります。
　
- 問題の SAS SSD がバックアップデータの格納先の場合
⇒バックアップデータがすべて吹き飛びます。

# 回避策

**「連続稼働 32,768 時間」**という条件が正しい場合、サーバに限って言えば以下のようにしてシステム全停止を回避できるのではと考えていますが、サポートへの確認が必要になるかと思います。

- シングル構成の場合、1 年に 1 回等、定期的に OS を再起動します。

- HA 構成の場合、1ヶ月に 1 回交代で OS を再起動します。
⇒例えば、1 号機を奇数月、2 号機を偶数月に再起動する、といった具合です。

- Oracle の RAC 環境の場合は、1 ノードの OS を順番に再起動します。
⇒3 ノード RAC の場合は ノード 1 を 1,4,7,10 月、ノード 2 を 2,5,8,11 月、ノード 3 を 3,6,9,12 月 に再起動する、といった具合です。

これらはメンテナンス日を設けるか、システムへのアクセスを営業時間外に止めることができるのが前提となります。

なお、ストレージ製品を定期的に再起動するというのはあまり聞いたことがないので、HA や Oracle の RAC 環境で問題の SSD を使用した共有ディスクを使用している場合の回避策は、思いつきませんでした。

# 最後に

ある意味時限爆弾のようなものなので、思い当たる場合は該当するのかを確認をした方がよいと考えます。

見れば見るほど、恐ろしい影響内容の不具合です。。
[python]色が変わっていく時計（アニメーション）

#はじめに
1秒毎に回転し、60秒で1周する秒針（時計）を作成します。
ただ秒針を描くだけではつまらないので、時計の色が0~60[s]の範囲で、青色から赤色へ次第に変化するようにします。最後にgifとして保存して完成です。

pythonの、アニメーションを作成するライブラリを用います。

#完成したアニメーション
![20191204second_hand.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503979/657fdc29-d941-337f-dcdc-4e83e1364658.gif)

#コード
```second_hand.py
%matplotlib nbagg

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import matplotlib.patches as pat

fig = plt.figure()
ax = plt.subplot()

def clock(i):
    circle = [ax.add_patch(pat.Wedge(center=(0, 0), r=1, color=[0+i/60,0,1-i/60], theta1 = 95-i*(360/60), theta2 = 85-i*(360/60)))]
    #center：中心のxy座標,r：ウェッジの半径,color：RGBでの色指定(各色0~1),theta：ウェッジの角度を指定
    #circleをリストにすることに注意してください。あとでimgsに追加できるようにするためです。
    return circle

#リストimgsに、各秒ごとのclockを追加していきます。
imgs=[]
for i in range(60):
    imgs.append(clock(i))
    
ani = animation.ArtistAnimation(fig, imgs, interval=1000, repeat=True)
plt.axis("scaled")
plt.show()

ani.save("second_hand.gif", writer="imagemagick")#gifとして保存

```

#環境
macOS Catalina
jupyter-notebook
Go言語でHello World

#Go言語をやってみた

最近Fintechという言葉を多く耳にするんですが、Fintechって何？
あぁ金融系と技術を併せてFintechねぇ。。。

###ふ〜ん。かっこいいじゃん。

じゃあ何を使えばできるのかな〜？って
Udemyで探したら、酒井潤先生の講座でGo言語とFintechアプリの開発というのを見つけました！
この講座を受講しながら、自分の為のoutputを書いていきたいと思います。

[現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発](https://www.udemy.com/course/go-fintech/)
書いてる内容はここからの情報ばかりになると思います。

####初期設定は飛ばします。。。詳しくはwebへ。。。
（そのうち書くかも・・・。）


##いつも最初にやるやつ・・・Hello World
早速いつものやつをやっていきたいと思います。
どんな参考書にも書いてある「Hello World」、Udemyの講座でもこの法則は不変でした。

VBA出身の僕は直感的にこう書いちゃう（真似しないでください）

```golang:lesson.go
print("Hello World")
>>> syntax error: non-declaration statement outside function body
```

直感的に書いてもダメなことがわかりました。

###Go言語として実行するために準備をしましょう！

1.パッケージを宣言する

```golang:lesson.go
package ***
```

2.パッケージの中にmain関数を定義する

```golang:lesson.go
package main

func main() {
}
```

このmain関数で実行していくのがGoの基本ですね！
###Hello Worldを表示しよう！

1.fmtのパッケージをインポートする

```golang:lesson.go
package main

import "fmt"

func main() {
}
```

2.fmtパッケージのPrintlnで表示する

```golang:lesson.go
package main

import "fmt"

func main() {
	fmt.Println("Hello World")
}
>>> Hello World
```

はい！！表示できました！！
VBAからpythonを勉強した僕からすると、すごく遠回しな書き方だな。。。って印象です。
でも天下のグーグルが作っているのと、これから注目されている言語なので
Go言語を理解しつつ有益なoutputができるようになりたいと思います！

以上です！ありがとうございました！
グループ毎に最大値や最小値を持つレコードを抽出する

# 一人アドカレ

| 日 | ポスト |
|---:|:------|
|  1 | [一時テーブルが存在していたら削除する](https://qiita.com/sotoattanito/items/10e65399caf34fae3017) |
|  2 | [何度も使う中間テーブルに名前をつけてクエリを見やすくする](https://qiita.com/sotoattanito/items/673fb0ceb543fdd391e2) |
|  3 | [共通テーブル式と一時テーブルの参照可能な範囲の違い](https://qiita.com/sotoattanito/items/9fa81e9acc9af915600f) |
|  4 | [グループ毎に最大値や最小値を持つレコードを抽出する](https://qiita.com/sotoattanito/items/efa8296039b182ccb85b)  |
|  5 |       |
|  6 |       |
|  7 |       |
|  8 |       |
|  9 |       |
| 10 |       |
| 11 |       |
| 12 |       |
| 13 |       |
| 14 |       |
| 15 |       |
| 16 |       |
| 17 |       |
| 18 |       |
| 19 |       |
| 20 |       |
| 21 |       |
| 22 |       |
| 23 |       |
| 24 |       |
| 25 |       |

# グループ毎に最大値や最小値を持つレコードを抽出する
この記事は自身のブログを書き直したものです。

## 課題
グループ毎に最大値や最小値を持つレコードを抽出する。
最大値や最小値を得るのではなく、最大値や最小値を持つレコードを抽出したい。つまり、集計前のレコードがほしい。

## 準備
### 実行環境
 * SQL Server 2017 Standard
   * SQL Server 2008 R2 Express, 2012 Standardでも確認済
 * SQL Server Management Studio 2017

### サンプルデータ
fruitsテーブル

| id | name | price |
|---:|:----:|------:|
|   1|apple |    100|
|   2|apple |    120|
|   3|orange|     50|
|   4|orange|     40|
|   5|apple |     80|
|   6|orange|     60|
|   7|banana|    120|
|   8|banana|    150|

## 解法
fruitsテーブルから、[name]ごとに最低の[price]をもつレコードを抽出する。

### ROW_NUMBERを使った例
```sql
SELECT [id]
     , [name]
     , [price]
  FROM ( SELECT *
              , ROW_NUMBER() OVER ( PARTITION BY [name]
                                        ORDER BY [price] ) AS [seq]
           FROM [fruits] ) AS [fr]
 WHERE [seq] = 1
 ORDER BY [id];
```

### not existsを使った例
```sql
SELECT [id]
     , [name]
     , [price]
  FROM [fruits] AS [base]
 WHERE not exists ( SELECT *
                      FROM [fruits]
                     WHERE [fruits].[name] = [base].[name]
                           AND [fruits].[price] < [base].[price] )
 ORDER BY [id];
```

### JOINを使った例
```sql
SELECT [main].[id]
     , [main].[name]
     , [main].[price]
  FROM [fruits] AS [main]
 INNER JOIN ( SELECT [name]
                   , MIN( [price] ) AS [Price]
                FROM [fruits]
               GROUP BY [name] ) AS [sub]
         ON ( [sub].[name] = [main].[name]
              AND [sub].[price] = [main].[price] )
 ORDER BY [main].[ID];
```

## 感想
同じ目的でも複数の方法で実現できることもある。
実行プランを確認し、使い分けを考えたい。

## 参考
[SQL緊急救命室 第1回　サブクエリ・パラノイア～副問い合わせ乱用による性能劣化を治療せよ！](http://gihyo.jp/dev/serial/01/sql_lifesaving/0001)
【4日目】シンプルデータベース実装②

# まえがき
本日はデータを更新、削除する部分の実装について記載していきます。

* テーブルを作成する
* データを挿入する(Done)
* データを取得する(Done)
* データを更新する(←今回)
* データを削除する(←今回)
* テーブルを削除する

## 本題に入る前に
昨日、説明不足だった部分を補足します。
まず、シンプルデータベースは射影演算は実装しません。射影演算とは、SQLでいう SELECT Column1, Column2,・・・ のようにSELECTする列を指定する演算です。とりあえず指定されたレコードは全カラムの値返すから、必要に応じてDBの外側でいじってね、という思想です。
また、オブジェクトIDのみでしか、データにアクセスできないような構造にしたのは、選択演算(SQLでいうWHERE句でSELECTするレコードを特定する演算)をオブジェクトIDの論理演算に置き換えられるだろうなーという予想からです。
例えば、値段が100円以上、かつ頭文字が'e'から始まるフルーツは？という条件は

* それぞれの条件に合致するオブジェクトIDを求める
    * 値段が100円以上 → [0001, 0002, 0003, 0004]
    * 頭文字が'e'から始まるフルーツ → [0002, 0006]
* そして、オブジェクトID同士の論理演算をする
    * [0001, 0002, 0003, 0004] && [0002, 0006] = [0002]

というようにオブジェクトIDの論理演算に落とし込めます。
テーブル結合はどうすんねん、と思う方がいると思いますが、結合演算はシンプルデータベースでは実装しません。。

さらに、うすうすお気づきの方も多いかもしれませんが、オブジェクトIDのみでしかデータにアクセスできない実装にしたのは、後ほど性能問題などを引き起こします。。
（それでもKVストアにしておけば、スケールさせられるんじゃないか、という淡い期待。）

### データを更新する
データの更新は下記の手順で行う。

1. 更新対象のオブジェクトIDのリストを取得する
2. 各オブジェクトIDごとに3,4の操作を繰り返す
3. 更新後値を計算して、キーバリューストアを更新する
4. 更新対象カラムごとにカラムインデックスを更新前値から更新後値に更新する

例として下記のテーブルのりんごの値段を150円に値上げする。更新された部分は緑色塗り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201287/89d0445d-8bdc-4b43-a47d-a8ea378c2e00.png)

#### 更新前の状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201287/9298be19-b038-800c-3a42-4f20514e3c8a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201287/f28c03d8-6d3b-1313-7749-fca367b67134.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201287/8a4ffce8-20d2-8aed-d1e8-8bad533597b1.png)

#### 更新後の状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201287/c92bffe4-aba4-f65c-732c-f6f16ff1a2eb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201287/5b352531-21a7-efbf-a81a-0de62d3ea4b0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201287/94bc2e15-471f-5be5-a964-ad758e0b14ce.png)

データの更新であっても、カラムインデックスにレコードが追加されたり、削除されたりすることに注意。
ちなみに、実装としては、特定カラムの値を定数値に更新することしかできない。（price = price * 1.1などは無理。）

## データを削除する
データの削除は下記の手順で行う。
1. 削除対象のオブジェクトIDのリストを取得する
2. 各オブジェクトIDごとに3,4の操作を繰り返す
3. キーバリューストアからレコードを削除する
4. 削除対象カラムごとにカラムインデックスからオブジェクトIDを削除する

例として下記のテーブルからりんごのレコードを削除する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201287/89d0445d-8bdc-4b43-a47d-a8ea378c2e00.png)

#### 削除後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201287/ed2accab-f345-817b-0f59-91d1cf632e36.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201287/077592d4-815d-3479-b099-ed93f3984297.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201287/a9f59057-18bc-7002-405f-32720f3de8db.png)

データを削除し、そのデータへの参照も削除するだけ。カラムインデックスにおいては、削除対象のオブジェクトIDをフィルタリングして落とす操作になる。

# まとめ
オブジェクトIDのみでしかアクセスできないというデータ構造にすると、やはり更新・削除の操作はめんどくさいです。カラムインデックスもいじらないといけないので。
ただ、各データレコードをオブジェクトIDで抽象化するという思想は良いはずと思って、先に進みます。
テストカバレッジの読み方

以下はJestのカバレッジレポートの内容です。
各箇所がどんな内容であるかをまとめました。

```
-------------|----------|----------|----------|----------|-------------------|
File         |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
-------------|----------|----------|----------|----------|-------------------|
All files    |       50 |        0 |       20 |       50 |                   |
 handler.ts  |       50 |        0 |       25 |       50 |... 39,41,44,47,55 |
 slackBot.ts |       50 |      100 |        0 |       50 |            6,7,13 |
-------------|----------|----------|----------|----------|-------------------|
Test Suites: 1 failed, 1 passed, 2 total
Tests:       1 failed, 2 passed, 3 total
Snapshots:   0 total
Time:        1.952s, estimated 2s
```

- File
    - テスト対象のファイル
- Stmts
    - Statement coverage
    - プログラム内の各命令が実行されたかの網羅率（命令網羅率）
- Branch
    - Branch coverage
    - ifやcaseなどの全ての分岐の処理が実行されたかの網羅率
- Funcs
    - Function coverage
    - プログラム内の各関数が呼び出されたかの網羅率
- Lines
    - ソースファイルの各実行可能行が実行されたかの網羅率
- Uncoverd Line
    - 実行されてない行
- Test Suites
    - テストファイルごとの結果
- Tests
    - テストケースごとの結果
- Snapshots
    - 取ったSnapshotの数
- Time
    - 実行にかかった時間

### 参考URL
- https://en.wikipedia.org/wiki/Code_coverage
- https://app.codegrid.net/entry/2018-jest-1
- http://kinachan0725.hatenablog.com/entry/2017/07/26/173738
Kotlinで@Deprecatedと@Experimentalを使って無言で意思疎通をとる

チームでコードを書いている途中、こっちの方がいいんじゃないか？という新しい関数を作って乗り換えてみたり、もっといい変数名を思いついたのでリネームしたら予想以上に影響範囲が広かったり、新しいロジックを思いついてみたがまだ本格導入するほど自信がないといった経験はありませんか？
個人プロジェクトでは自分の好きなタイミングでリファクタや導入タイミングを決められますが、チームで開発しているときはこれらは注意事項としてチームメンバーに周知する必要があります。

- より便利な関数ができたのでそちらを使ってほしい
- よりわかりやすい名前にリネームしてほしい
- セキュリティやメンテナンス性の観点からこれ以上使って欲しくない
- まだ実装が固まってないので利用を限定するか、破壊的変更があることを分かった上で使ってほしい

Slackや口頭でも説明ができますが、時間が経つと忘れてしまうものです。できればそういった関数や変数を使おうとしている時にお知らせしてくれると嬉しいですよね。
IDEの力を借りてそれらを伝えることができるのが`@Deprecated`と`@Experimantal`というアノテーションです。

# 環境
- Kotlin 1.3.61
- Android Studio 3.5.2(base IntelliJ IDEA 2019.1)

# Deprecated
Deprecatedアノテーションは開発者に「これを使うのはオススメしない」と通知することができます。

```kotlin
val path: String
    get() = a + b + c
```

上の例ではもともと`path`プロパティを使っていましたが、これを「これからは使って欲しくない」としたいとします。
使って欲しくない理由として`path`では絶対パスが取得できるのか相対パスが取得できるのかが名前から推測できないという理由です。`path`は元々相対パスが取得できる仕様だったとして、よりわかりやすく`relativePath`を作り今後はそちらを使って欲しいとあなたは考えました。

そこで`path`にDeprecatedアノテーションをつけてみます。
KotlinではDeprecatedアノテーションに2つの引数をとります。
1つめは理由です。どうしてこれを使って欲しくないのかを書きます。
2つめは移行先です。ReplaceWithを使って乗り換え先を示します。ReplaceWithは省略できませんが内容は省略が可能です。

```kotlin
@Deprecated("Misleading name. Replace `relativePath`", ReplaceWith("relativePath"))
val path: String
    get() = relativePath

val relativePath: String 
    get() = a + b + c
```

このように書くとIDEで`path`を呼び出そうとした時に取り消し線が引かれて表示されます。
![スクリーンショット 2019-12-04 23.03.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/04c50e36-7470-3681-75ab-e4cdb958f2b1.png)
またカーソルを合わせると先ほど入力した使ってほしくない理由が表示されます。
![スクリーンショット 2019-12-04 23.04.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/c83ce140-699a-5fd1-0eff-cfb1484fd805.png)

これを見れば使おうと思った時に表示されるので忘れずに済みそうです。

またReplaceWithを書いていればIDEが自動で置換もおこなってくれます。
![スクリーンショット 2019-12-04 23.12.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/de5e3c68-2d44-b082-5036-a504d5c10e42.png)
ReplaceWithは正規表現も使えますのでうまくいけばどんな名前でもリネームが1発でできるようになります。が、結構難しいのでまずは空文字でも良いと思います。使われる頻度をゆっくり減らしていく作戦がいいでしょう。

# Experimental
こちらはKotlin1.3から使えるようになったアノテーションです。頻繁に破壊的変更が発生する可能性が高いものにつけておくことで、利用者はそれを知った上で使うといった運用ができます。

Experimentalアノテーションを使うには、まずどういう試験的なものなのかを示すためにオリジナルのアノテーションを作成し、そのアノテーションにExperimentalという属性を付与します。

```kotlin
@Experimental
annotation class WeatherExperimental
```

次に実際に試験的に作っている変数や関数に先ほど作ったアノテーションを付与します。

```kotlin
@WeatherExperimental
fun getWeather(city: String): Weather {
}
```

このように書くとIDEで`getWeather`関数を呼び出した時にエラーが表示されます。
![スクリーンショット 2019-12-04 23.28.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/88ce15f1-ca14-0f12-213c-8999c4e8444e.png)
Experimentalアノテーションを使っている場合は呼び出し元もそれを使っていると承知の上ということを示すため呼び出す関数に`@UseExperimental`アノテーションをつけます。

```kotlin
@UseExperimental(WeatherExperimental::class)
fun weather() {
    val api = Api()
    val weather = api.getWeather("Tokyo")
}
```

これらのアノテーションはライブラリによく使われますが、プロダクションコード内でも使ってみることで言葉を交わさずとも意思疎通がとれるかもしれません。

参考
https://aakira.app/blog/2018/10/whatsnew-kotlin13/
CiscoでOSPFのルーティング設定

#OSPFのルーティング概要と設定

## OSPF
### OSPFの特徴
- 様々なメーカーのルータで使用できる
- リンクステート型のプロトコルである
- コンバージェンスが速い
- VLSMに対応している
- ネットワークを階層化できる
- メトリックとしてコストを使用する
- ルーティング認証をサポートしている

### OSPFの動作
- Helloパケットを交換してネイバーを検出する
- ネイバーテーブルにネイバーを登録する
- 相互を認識し、LSDBの交換の準備をする
- ルーター間でDBDパケットを交換する
- 詳細なLSA情報を交換する

### OSPFの設定
#### 構成
下記のような構成です。
![OSPF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230465/3ab4d250-dfc4-85cb-17d1-076e10cb44e2.png)

#### 設定
物理インターフェースの設定は省略します。

```:Router1
Router1(config)#interface Loopback 0
Router1(config-if)#ip address 10.10.10.1 255.255.255.255
Router1(config-if)#exit
Router1(config)#router ospf 10
Router1(config-network)#network 172.16.10.1 0.0.0.0 area 0
Router1(config-network)#network 192.168.100.0 0.0.0.0 area 0
```

```:Router2
Router2(config)#interface Loopback0
Router2(config-if)#ip address 10.10.2 255.255.255.255
Router2(config-if)#exit
Router2(config)#router ospf 10
Router2(config-router)#network 192.168.100.0 0.0.0.255 area 0
Router2(config-router)#network 192.168.150.0 0.0.0.255 area 0
```

```:Router3
Router3(config)#interface Loopback 0
Router3(config-if)#ip address 10.10.10.3 255.255.255.255
Router3(config-if)#exit
Router3(config)#router ospf 10
Router3(config-router)#network 172.16.0.0 0.0.0.255 area 0
Router3(config-router)#network 192.168.150.0 0.0.0.255 area 0
```
### ネイバーの確認
OSPFでは、ネイバーとして隣のルータを認識していないと、LSDBの同期を始めません。ネイバーテーブルを確認します。

```
#show ip ospf neighbor
```

### OSPFのトラブルシューティング系コマンド
ルーティングテーブルの確認

```
#show ip route
```
隣接関係の確認

```
#show ip ospf neighbor
```

OSPFの動作状況の確認

```
#show ip ospf interface FastEthernet 0/0
```
プロキシ祭りだ☆ワッショイ！

## プロローグ

デバッグをしていると PKIX path building failed ～ 
あり～？
昨日まで普通に動いていたのに。
しかし、これは前にも起きたことがあるのでサクっと解決できる。
いま思えば、これが不幸の始まりでした。（所要時間12時間）

## 1.証明書エラーの解決（プロキシなし）

![aws.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63018/e2937731-31f4-497e-48c5-1a5387570613.png)


AWS環境では、EC2 with 似非SSLからインターネットに接続しようとして、 PKIX path building failed ～ が発生していたので、javaに似非SSL証明書を登録して解決。

[PKIX path building failed:javaにSSL証明書を追加する](https://qiita.com/ckoshien/items/6072e01760e8e2a0d21c)

## 2.証明書エラーの解決（プロキシあり）⇒ 失敗！

![local2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63018/67a3153b-29c0-0fb7-b1b4-fcf3e4cbb18f.png)

ローカルPCから繋がらなくなり、PKIX path building failed ～ が出ていたので、**何の疑いもなく**似非SSL証明書を登録した。
これが不幸の始まり。

### 2.1 証明書を登録、登録＆登録

eclipseを使ってウン10年、jdk、jre 以外にeclipseのjreがあるとは知りませんでした。

[Eclipseでgradleプロジェクト作成時、証明書エラーで失敗した場合](https://qiita.com/miz21358/items/3f14133961744447875b)

jdkのcacerts に証明書を登録してもダメ、jreのcacerts に証明書を登録してもダメ。
これを見つけたときは、tomcatでデバッグしていることもあり、手ごたえありでしたが、ダメ。

### 2.2 証明書をexp&imp

コンパネの証明書の管理から、臭そうな証明書をexp&imp、exp&imp、、、泥沼
※このときjavaのcacertsが復旧不能な状態になったと思います。

## 3.不変的なエラーの解決方法

いくつかありますが、ここでは確実に解決する方法を取り上げます。

### 3.1 事象が再現する最小構成を構築する

今回の件なら、以下の2点を確認できれば泥沼にハマることはなかったでしょう。

- インターネットに繋がらないのは特定のサイトか？

- java以外で繋がるか？

・インターネットに繋がらないのは特定のサイトか？
最初のアクセスがgoogle apiのため、またセキュリティが強化されたと思い込んだのが間違いでした。yahooでも繋がりませんでした。
spring bootでしたが、URLConnectionで繋ぐところだけ抜き出して素のjavaで確認しました。

・java以外で繋がるか？
最初のアクセスがGETなので、ブラウザでアクセスしたら繋がりました。いちおうnodeでも繋がることを確認しました。

### だいたいプロキシを通してるんだから、「似非SSL証明書」をjavaに登録する事自体が奇妙だったんだ
![そもそも](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63018/d4e3e370-51bb-9abc-18f7-5b70c90de1f9.gif)


## 4.証明書エラーの解決（プロキシあり）⇒ 解決

### 隣人のjdkのcacertsをもらって上書きしたら直りました(^^;

cacertsに登録されているリストも見ましたが、長いし、どれを直したらいいか分からないし、、、
3.1 事象が再現する最小構成を構築する で、jdkのcacertsがおかしいことは確信したので、迷わず上書きしました。

## エピローグ

原因が分からないまま解決を優先してしまいました。
javaのcaについては分からないままです。
心残りはありますが、ここは

#### javaめんどくせー

#### proxyうざー

で締めたいと思います。
（ちなみに、本来の改修は30分で終わりました）

「似非SSL」口に出すと言いづらいですね。エセエスエスエル
もうセッセッセでいいんじゃないでしょうか、ワッショイ！
vscodeでleetcodeに入門しようと思ってハマった話（と回避策）

# 背景

趣味でプログラミングをやっていたりはしましたが、今年に入ってからは業務でもプロダクト開発に関わるようになってきました。その過程で、アルゴリズムやTDDなどの一通りの勉強はしましたが、まだまだ修行が足りないと感じていました。そんな時に、下記TweetとBlog記事を読んでleetcodeの問題をTDDを使いながら解いていけばいいじゃんと安易に考え実践することにしました。

- https://twitter.com/sugyan/status/1200605848591982592?s=20
- https://panda-program.com/posts/test-driven-development

# TL;DR

- leetcode+vscode+node.js+jestの環境を構築したが
- vscode-leetcodeのプラグインでSignInができず
- 苦戦したけどGitHubのIssueをみてmanualで設定したらなんとかなった

# 環境

**2019年12月4日時点の情報なので、その後修正されれば同じ問題は起こらないと思います**

- vscode 1.40.2
- node.js 12.4.0
- vscode-leetcode 0.15.7
- leetcode-cli 2.6.2
- npm 6.11.3

# 環境構築

JavaScript+Jestを考えていたので下記を利用しました

- https://github.com/ifmos/leetcode-javascript-jest

手順に従ってSetupを行います

# vscode-leetcodeのSignIn

vscode-leetcodeをログインすると左側のペインにleetcodeのアイコンが現れるのでそれをクリックすることで「Sign in to LeetCode」を実行できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545717/4632d29e-c443-7f69-6aff-04adda1e3d42.png)

現れた入力画面にユーザー名（またはメールアドレス）とパスワードを入力することでSignInできるようです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545717/b465c76e-18b9-b3b5-8a13-576c65a18aa0.png)

しかしながら、下記のようなエラーが表示されてSignInができません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545717/c0e9237b-ab67-aad1-db58-8832cfdd219b.png)

```
v12.4.0
 Active  Name               Version         Desc
----------------------------------------------------------------------------------------------------
   ✔     solution.discuss   2019.02.03      Plugin to fetch most voted solution in discussions.
   ✔     company            2017.12.18      Plugin to query by company for free user.
   ✔     cache              default         Plugin to provide local cache.
   ✔     retry              default         Plugin to retry last failed request if autologin.enable is on.
   ✘     leetcode.cn        2018.11.25      Plugin to talk with leetcode-cn APIs.
   ✔     leetcode           default         Plugin to talk with leetcode APIs.
[ERROR] You are not login yet?
login: pass: - Signing in leetcode.com
[ERROR] invalid password?
```

# 原因

その後再度アカウント作成を行ったり色々してましたが、最終的には依存ライブラリが壊れていることが原因でした

- vscode-leetcodeはleetcode-cliに依存している
  - https://github.com/jdneo/vscode-leetcode/blame/237e56fcc998e3ee73987c7fc7da2160c94d8d9d/README.md#L142
  - https://www.npmjs.com/package/vsc-leetcode-cli
- leetcode-cliのIssueを確認すると二週間以内の日付で複数の同様の事象が報告されている
  - https://github.com/skygragon/leetcode-cli/issues/195

# 回避策

ChromeブラウザでLeetCodeにログインし、開発者ツールのApplicationタブからCookieの下記NameのValueをメモする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545717/b2f2f33c-85a3-f174-7baf-191dee66f51c.png)

下記リンク先に従って、~/.lc/leetcode/user.jsonにメモした値を入力する

- https://github.com/skygragon/leetcode-cli/issues/194#issuecomment-559839631

```
{
  "login": "[username]",
  "loginCSRF": "",
  "sessionCSRF": "[copied from csrftoken]",
  "sessionId": "[copied from LEETCODE_SESSION]"
}
```

その後再度vscodeを開くと下記のようにログイン済みの状態となります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545717/7cff0f87-0859-abf9-2ff1-41fc5edd2cba.png)

# まとめ

これでやっとleetcodeに入門できるぞっ
[Rails] undefined method `' はself.メソッド名で解決する時がある。

### エラー内容

RailsでModelに定義したメソッドがControllerで呼び出すと、"undefined method `メソッド名'"になるエラー。（ControllerとModelで同じメソッド名を定義している場合）

### 解決方法

モデルのメソッド名の前に **"self."** を付けたらエラー解消され、
コントローラーで呼び出せた！！
要は、以下のようにクラスメソッドになり使える範囲広がる的な。
selfなし → インスタンスメソッド
selfあり → クラスメソッド

```models/モデル名.rb
def self.メソッド名
end
```

### コード詳細

controllerもmodelも両方、"import_csv"という名前で定義したため、エラーが発生した可能性あり。（追加検証は省略）
modelで定義したメソッドに"self."をつけることでエラー解消。


```controllers/import.rb
#コントローラー
class ImportController < ApplicationController
 def import_csv   
   if Information.import_csv(params[:csv_file])
     xxxx
   end
 end
end
```

```models/information.rb
#モデル
class Information < ApplicationRecord
 def self.import_csv(csv_file)
   xxxx
 end
end
```

##### あとがき
self.の効果はplz google!

### 参考
https://teratail.com/questions/102215
https://qiita.com/suzuki-koya/items/1553c405beeb73f83bbc
Pythonらしいコードを書く（辞書編）

# はじめに
Pythonを学習するにあたって、せっかくなので、Pythonらしい書き方というものを調べてみました。
Pythonらしさは、Pythonの効率の良いコードと同意だからです。

参考にしたスライド
https://speakerdeck.com/pyconslides/transforming-code-into-beautiful-idiomatic-python-by-raymond-hettinger-1
http://kesin.hatenablog.com/entry/2013/05/12/004541

## 辞書の使い方
これぞ`Python`らしさというもので、辞書の使い方は非常に重要かつ基本的なテクニックです。
何かとお世話になる辞書には、うまいやり方がありそうです。

### キーでループ

辞書を指定しても、辞書オブジェクトの`keys`メソッドを使っても、キーでのループが可能です。

```
d = {'kaijo': 'red', 'shinmei': 'blue', 'ooiwa': 'yellow', 'pegie': 'pink', 'asuka': 'green'}
for k in d:
    print(k)
    
for k in d.keys():
    print(k)
```

### キー、バリューのループ

キーと値とをループさせる方法としては、上段のキーによるループをして、キーから値を取得する方法が考えられます。
Pythonの辞書には`items`メソッドがあり、これを利用することで、辞書からキーを用いて値を取得することが必要なくなります。また、値の変数が自由に決められるため、読みやすいコードになります。

```
d = {'kaijo': 'red', 'shinmei': 'blue', 'ooiwa': 'yellow', 'pegie': 'pink', 'asuka': 'green'}
for k in d:
    print(k, '->', d[k])

for k, v in d.items():
    print(k, '->', v)
```
### 辞書を２つのリストから作成する

キーのリストと値のリストが既にあるような場合では、これらを合成することで辞書を作成することができます。
`for`文を使わずにできます。

```
from itertools import izip

keys = ['kaijo', 'shinmei', 'ooiwa', 'pegie', 'asuka']
values = ['red', 'blue', 'yellow', 'pink', 'green']

d = dict(izip(keys, values))
```

インデックス的な連番をつけた辞書にしたい場合は`enumerate`を使うと作成できます。

```
values = ['red', 'blue', 'yellow', 'pink', 'green']

d = dict(enumerate(values))
```

### 辞書を使ったカウント

英語の文章に同じ単語がいくつ出現するか、などの処理をするときには、以下のような処理が想像しやすいです。

```
colors = ['red', 'green', 'red', 'blue', 'green', 'red']

d = {}
for color in colors:
    if not color in d:
        d[color] = 0
    d[color] += 1
```

辞書の`get`メソッドは指定したキーがいくつあるかを返しますが、キーがない場合は、引数で与えた値を返します。
それを利用して以下のように書けます。

```
colors = ['red', 'green', 'red', 'blue', 'green', 'red']

d = {}
for color in colors:
    d[color] = d.get(color, 0) + 1
```

`collections`モジュールの`defaultdict`は、キーがない場合に追加する機能を持っています。
それを利用して以下のようにも書けます。
`get`を使うより読みやすくなります。

```
from collections import defaultdict

colors = ['red', 'green', 'red', 'blue', 'green', 'red']

d = defaultdict(int)
for color in colors:
    d[color] += 1
```

### 辞書を使ったグルーピング

例えば単語のリストがあったとして、単語の文字数でグルーピングしたいといったような場合には、わかりやすいコードとして、キーがないときにデフォルト値（この場合は名前を格納するリスト）を設定する方法があります。
デフォルト値を格納するところは`setdefault`メソッドが使えます。

```
names = ['raymond', 'rachel', 'matthew', 'ronger', 'betty', 'melissa', 'judith', 'charlie']

d = {}
for name in names:
    key = len(name)
    if not key in d:
        d[key] = []
    d[key].append(name)

d2 = {}
for name in names:
    key = len(name)
    d2.setdefault(key, []).append(name)
```

これを先程の`defaultdict`を使うと以下のように書けます。
`if`文がなくなってエレガントになりました。

```
from collections import defaultdict

names = ['raymond', 'rachel', 'matthew', 'ronger', 'betty', 'melissa', 'judith', 'charlie']

d = defaultdict(list)
for name in names:
    key = len(name)
    d[key].append(name)
```
[UE4]カラーピッカーのパレットを共有する方法

きっと皆様、自分好みのカラーパレットを自作しているかと思うのですが、
![color.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463796/95054161-d599-39e7-1574-9f83b8001f01.gif)
せっかく最高のパレットを作ったのだから、他の人にも使ってほしい……！
ということがあると思います。
<img width="460" alt="2019-12-04_22h48_04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463796/19bee221-00c1-7a76-e1ec-270bca8b584a.png">

実は、作成したカラーパレットの情報は、
Savedフォルダ以下の、「EditorPerProjectUserSettings.ini」に、
<img width="196" alt="2019-12-04_23h07_59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463796/bdcf6eff-e09a-d767-b5a3-73cf82c510cb.png">
[ColorThemes]というくくりで保存されております。
<img width="370" alt="2019-12-04_23h08_08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463796/727b1043-9355-8350-24a1-c86a3bb4e8ab.png">

こいつをペロリとコピペして、
Config以下に、「DefaultEditorPerProjectUserSettings.ini」として置いてあげましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463796/22af234d-6d4b-83b6-a86c-7028c1dcbc9b.png)

皆で同じカラーパレットを使うことができて幸せです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463796/b099e520-5e7d-6a5c-3f2f-d6cb6bb27139.png)
WordPressを移転するときの注意事項

自分向けの備忘録。

### これだけは覚えていってね！
新規Wordpressを作成しなくてもいいです🙅‍♀️
Search-Replace-DBというツールは絶対に必要だよ🙆‍♂️

# 基本手順
契約するホスティングサービスの解説をみるといいです。上の大事なことが書いてない！！

- [XServer](https://www.xserver.ne.jp/manual/man_install_transfer_wordpress.php)
- https://mayubou.net/local-server-wordpress/
- https://outswan.com/wordpress/how-to-move-wordpress-from-local-to-production/#i-3
- https://fantastech.net/wordpress-local-honban

### 「サーバーのIPアドレスが見つかりませんでした」というエラーが出た場合
>「サーバーのIPアドレスが見つかりませんでした」

おそらくconfigが間違っている。データベースのパスワードやサーバ情報が正しいか見てみよう。

### WordPressインストール
WordPressを移転するのに、新規インストールなんてしませんよ。
WordPressの本体はパッケージなので。FTPソフトでファイル移転したらそれでOK.

WordPressは大きく分けてファイル+データベースという構成でプログラムが成り立っている。
1. FTPソフト使ってファイルを移転
2. バックアップしておいた `.sql` ファイルを新しいデータサーバーにインポート

2.について次で詳しく説明する。

# データベースの移行
上の記事、どれもSQLのとこ雑に書いてあるのでここから注意。
`.sql` はキレイにしてからインポートしないと、いろいろ失敗する。
失敗したら、サーバーのテーブル全削除（リセット）すればOK.
その後、またリトライしよう。

## SearchReplaceDB
手順がわかりやすい
https://digitalnavi.net/wordpress/5096/
https://wheelchair-coder.com/281/

[ダウンロードリンク](https://interconnectit.com/products/search-and-replace-for-wordpress-databases/)


### ポイント
dry runを実行して確かめて
live run を実行して置換する

詳しくわかりやすい
https://b-risk.jp/blog/2016/12/moving-tool-of-wordpress

### 「The table “ほにゃらら” has no primary key. Changes will have to be made manually.」というエラーが出た場合
> The table “ほにゃらら” has no primary key. Changes will have to be made manually.

**普通にPrimary Key設定しよ。**
やり方
1. コマンドで打つ

```
ALTER TABLE テーブル名 ADD PRIMARY KEY(列名);
```

2. GUIで操作する→こっちのほうが早い

## 最後に、パーマリンク設定

個別記事や個別ページがエラーになるとき
サイトを移動して、個別記事や個別ページなどがエラーになるときは、管理画面の設定 ＞ パーマリンク設定へ行き、一度「変更を保存」ボタンを押すと表示される。
画像処理？のためにPythonを始めた話

Pythonを始めました。目的は、アートのために動画から画像を生成するプログラムを作りたいから。

Pythonは、[Anaconda](https://www.anaconda.com/)でインストールしました。Anacondaというのは、Pythonとその他もろもろを一発で入れてくれる便利パッケージのようです。

バージョンはPython3です。なんでもPython2は業務上の理由がなければ入れる必要がないとか。要は移行期間であって、2はやがて廃れる運命のようです。

AnacondaでPythonをインストールした後は、処理を楽ちんにするためのサブ武器的なやつを入れていったとおもいます（試行錯誤しまくっていたので、他にも何かしてたかも）。正確には何という名称なのかわかりませんが…

入れる方法は二つ。
- pip
- conda
pipはすべてのPythonで利用可能なサブ武器インストールツール。condaは名前の通りAnaconda専用のようです。pipでしか入れられないサブ武器もあれば、condaでしか入れられないサブ武器もあるようですね。
今回は画像を扱いたいので、opencvを入れました（[【Python】Anaconda上にOpenCVをインストールする方法【Windows】](https://qiita.com/osakasho/items/c9d87b70e8f043569ca7)）。

最後に一つ、Qiita等読むうえで、知らなくて困ったこと。冒頭の`$`マークについて。

```
$ pip install opencv-python
```

このような記述があった場合、冒頭の`$`はコマンドプロンプトに打ち込むことを示している。Mac等のUnix系では権限の弱い通常ユーザーの場合に、入力待ちであること示すため行頭に`$`が表示されることから、このような表記をするらしい。

今回はここまで。
会社でGit導入で詰まったところ

私を含めあまりGitに慣れていないメンバーばかりのPJにてGitを導入することになった
その時詰まった点をメモしておきたい

## Gitflowの考え方が理解できなかった
### Gitflowとは
このサイト参照
https://www.atmarkit.co.jp/ait/articles/1311/18/news017_2.html

我々下請けは悲しいかなこのうちdevelopブランチとfeatureブランチしか使わない
しかし、初学者にはこれらすら難しかった。

developブランチからfeatureブランチが作成され、実装完了後developブランチにマージするということも難しかった

featureブランチは機能単位で作成するということも理解できなかった

## どのブランチがdevelopブランチでどれがfeatureブランチか、わからなかった
Gitflowを理解しても実際そこそこたくさんあるブランチのうち、どれをdevelopブランチとして起点にfeatureブランチを作成するのかがわからなかった。

このあたりを共有する会や資料は必要かなと

## 今後の課題
「featureブランチは機能単位で作成する」
これがあるため、どのようにすれば競合を防げるのか、あまり個人的にはわかってないです。
Heroku + SendGridでテキストメールを送る際に気をつける事

## 概要
Heroku + Laravel + SendGridの環境でハマったので記事として残しておきます(2019年12月時点)

## 目次
- SendGrid設定画面へ行き方
- HTMLメールに変換されてしまう
- メールに貼ったURLが勝手に置換されてしまう

## SendGrid設定画面への行き方
Herokuのアプリケーションメニューから「Configure Add-ons」「SendGrid」」を選択
<img width="612" alt="sendgrid_00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23306/fe41edbd-c3c8-830a-900d-b2589a3ce420.png">

<img width="856" alt="sendgrid_01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23306/f4b08113-f38a-9b4b-72f3-41ffd5e10541.png">


## HTMLメールに変換されてしまう
デフォルト設定だとtextメールをHTMLメールに変換する仕様になっているため、改行がされたりされなかったりする問題が発生する。
「Settings」「Mail Settings」の「Plain Content」の設定を「ON」にする
<img width="1254" alt="sendgrid_02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23306/2be0e508-6b52-2748-44cc-10bd933f33ac.png">

## メールに貼ったURLが勝手に置換されてしまう
トラッキング設定が入っていると、URLを勝手に置換してしまう時がある。
「Settings」「Tracking」の「Click Tracking」の設定を「OFF」にする
[公式のヘルプ](https://support.sendgrid.kke.co.jp/hc/ja/articles/206253421-%E3%83%A1%E3%83%BC%E3%83%AB%E6%9C%AC%E6%96%87%E5%86%85%E3%81%AEURL%E3%81%8C%E5%8B%9D%E6%89%8B%E3%81%AB%E7%BD%AE%E6%8F%9B%E3%81%95%E3%82%8C%E3%81%A6%E3%81%97%E3%81%BE%E3%81%84%E3%81%BE%E3%81%99-%E8%A7%A3%E9%99%A4%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B-)

<img width="1244" alt="sendgrid_03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23306/d06eacc5-8f24-6e8d-ec6f-ecf2bf36bcc3.png">

## まとめ
運用の仕方次第ではその他の問題も出てくるかもしれませんが、テキストメールを送る際に困った事をまとめました。
C - Buy an Integer

#問題
https://atcoder.jp/contests/abc146/tasks/abc146_c
<img width="1105" alt="スクリーンショット 2019-12-04 23.08.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307024/9492a582-2b51-628d-737d-20fb75d5e33b.png">

#回答
```ruby
A,B,X = gets.chomp.split.map(&:to_i)
result = 0
max = 1000000000
if A + B > X
elsif X >= A * max + B * ( max.to_s.length )
  result = max
else
  N = X.to_s.length
  N.step( 1, -1 ) do |n|
    p =  A * ( 10 ** ( n - 1 ) ) + B * n
    if p <= X
      result = ( X - B * n ) / A
      if result.to_s.length != n
        result -= 1
      end
      break
    end
  end
end
p result
```
#結果
<img width="1090" alt="スクリーンショット 2019-12-04 23.09.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307024/c86a468f-b639-9f08-659d-15a8023eb35e.png">

#感想
```result = ( X - B * ( n + 1 ) ) / A```で割り切れちゃって、桁が1つ多くなってしまった場合がわからなくて一生悩んでしまった・・・
[Swift] Connectionの概要・使い方まとめ

##自己紹介的な
Swift歴2日目の超初級者。
本記事では学習したことをアウトプットして、自分の中で定着させることを目的としています。
初学者のスタートダッシュの手助けになれば幸いです。

##Connectionについて
UI部品とコードを関連付ける際に、コード上でUI部品にどのような役割を持たせるか指定することができる。
具体的には、ConnectionにOutletかActionを設定することで指定できる。

##OutletとActionって何ぞや？
OutletとActionはどのように使い分ける？
色々調べたことをまとめると、
・Outlet　→　そのUI部品をどこかで参照したいとき
・Action　→　そのUI部品の動作内容を決めたいとき

例えば、buttonを押したらlabelに"Hello World"が出力される場合を考える。
buttonはlabelを参照して"Hello World"を代入する、つまりUI部品の動作内容を決めているのでAction。
labelは、buttonから参照されているのでOutlet。

##おわりに
もし間違っていたらご指摘頂けると助かります。。。
Vue.jsでちょっとおしゃんてぃなimport

# はじめに

[いなたつアドカレ](https://qiita.com/advent-calendar/2019/allinatatsu)の四日目の記事です。

今回はVue.jsで使えるちょっとかっこつけたおしゃんてぃなimport方法について書いてくぜ

## じっそー

```router.js
const loadView = view => () => import(`./views/${view}.vue`)

export default new Router({
  
  mode: 'history',
  base: process.env.BASE_URL,
  routes: [
    {
      path: '/',
      name: 'home',
      component: loadView('Home')
    },
    {
      path: '/about',
      name: 'about',
      component: loadView('About')
    }
  ]
})
```

こんなかんじですね、前提として、viewに関するファイルがviewsディレクトリにまとまっているとおもってください。

loadViewで引数viewを受けて無名関数を高階的にimportする関数を返却しています。
これで、import文を別に何度も書く必要がなく、importすることができ、すこしおしゃんてぃな感じが醸し出せます。
AWS Well-Architected 5本の柱を要約する（信頼性）

5本の柱ごとに自分なりの解釈を書いていきたいと思います。
※誤りがあればコメント頂けると嬉しいです。
今回は信頼性についてです。


## 信頼性とは
> インフラストラクチャやサービスの中断から復旧し、需要に適したコンピューティングリソースを動的に獲得し、誤設定や⼀時的なネットワークの問題といった中断の影響を緩和する能⼒

信頼性の柱は壊れにくく、復旧が容易な状態であることが目標となります。
信頼性に不可⽋なAWS のサービスは Amazon CloudWatchです。


* 信頼性の指標(RASIS)

| 項目|概要|算出式   |
|:-----------------|:-----------------|:-----------------|
| Reliability（信頼性） |故障が回復してから次に故障するまでの平均時間。長いほど信頼性が高い。作業ミスがシステムの故障となりえる。 |MTBF(Mean Time Between Failures) = 累積使用時間 / 故障件数  |
| Availability（可用性） |稼働率 |稼働率 = MTBF / (MTBF + MTTR)|
| Serviceability（保守性)| 故障が発生したときに復旧に要する平均時間。短いほど信頼性が高い。 |MTTR(Mean Time To Repair) = 累積修理時間 / 故障件数 |
|Integrity(保守性、完全性)|データに誤りがない状態を保つ能力|-|
|Security（機密性)|セキュリティ|-|


参考ページ
[障害対策の基礎知識 RASIS] (http://blog.father.gedow.net/2012/08/14/system-reliability-indicator-rasis/)

## 設計の原則
信頼性には、5 つの設計の原則があります。

・復旧⼿順をテストする
　⇒障害試験は行っても復旧手順の試験までは行っていないことが多い。
　　オートメーションで疑似障害を発生させることができ、
　　以前の障害のシミュレートができる。
　　これによりテストしたことがないコンポーネントに対して障害が発生するリスクを低減できる。

・障害から⾃動的に復旧する
　⇒障害の検知とオートメーションを組み合わせることで自動復旧を実現する。

・⽔平⽅向にスケールしてシステム全体の可⽤性を⾼める
　⇒１つの大規模なリソースを複数に分割し、障害の影響を軽減。

・キャパシティーを推測しない
　⇒実測値を元にキャパシティを設定

・オートメーションで変更を管理する
　⇒変更作業をドキュメント化（⇒手作業を認めない）することでミスがなくなる。
　　オートメーションに対する変更を管理する。

## ベストプラクティス
> ⾼い信頼性を達成するため、システムの基盤について⼗分に計画し、モニタリングを実施する必要があります。需要や要件の変更に対応するためのメカニズムも必要です。障害を検出し、⾃動的に修復できるシステムを設計することが必要です。

基盤、変更管理、障害の管理に分けて対応方針を記載している。

### 基盤
> お客様はストレージデバイスのサイズといったリソースのサイズ
と割り当てを需要に応じて⾃由に変更できます。

オンプレと違い設計不要。基本的には制限がない。（制限の意識が必要なサービスもある）
DDOSなどの攻撃からシステムを守るサービスなども利用可能。

・関連するAWSサービス
　AWS IAM、Amazon VPC、AWS Trusted Advisor、AWS Shield

### 変更管理
> AWS を使⽤すると、システムの動作をモニタリングし、KPI への応答を⾃動化できます。

※KPI（Key Performance Indicator）：重要業績評価指標

長期的にリソース状況の傾向を見ることが簡単に行える。
リソース状況によって、サーバ台数の増減が自動で行える。
変更作業はCloudFormationなどを利用して、原則は自動化する。

・関連するAWSサービス
　AWS CloudTrail、AWS Config、Amazon Auto Scaling、Amazon CloudWatch

### 障害の管理
> どのようなシステムでも、ある程度複雑になると障害が発⽣することが予想されます。そのため、それらの障害をどのように検出して対応し、再発を防⽌するかが問題です。

問題検知と復旧の自動化。
テストプロセスも自動化する。
（どうやってどこまで自動テストやるのか調査中⇒CDKでPythonのunittest検証中）

・関連するAWSサービス
　Amazon CloudWatch、AWS CloudFormation、Amazon S3、AWS KMS

## レビューシート実践
信頼性 障害管理 データをどのようにバックアップしていますか？

□ バックアップが必要なデータを特定し、手動でバックアップを実施している
□ バックアップを自動化している(RDSとEBSのスナップショットなど)
⇒自動バックアップできている部分もあるが、手動バックアップの部分もある。
□ 定期的なリカバリテストでバックアップがRTO、RPOを満たすことを確認している
⇒リカバリテストはやったことがない
□ バックアップはセキュリティ保護され、暗号化されている
⇒権限制御は行われているが、基本的には暗号化していない

## 参考ドキュメント
〇AWS Well-Architected 
(日本語 201907)
https://d1.awsstatic.com/whitepapers/ja_JP/architecture/AWS_Well-Architected_Framework.pdf?sc_icampaign=aware_well_architected_jp_wa_framework&sc_ichannel=ha&sc_icontent=awssm-3366&sc_iplace=content&trk=awssm-3366_aware_well_architected_jp_wa_framework


〇Well-Architected_review_sheet
https://d1.awsstatic.com/webinars/jp/pdf/services/Well-Architected%E3%83%92%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%B7%E3%83%BC%E3%83%88%E6%97%A5%E6%9C%AC%E8%AA%9E%E7%89%88.77c25d2afd0a69894be16b95aae6a423011f5a1f.xlsx
WordpressでCSSにbackground-imageに指定した画像が表示されない問題

物凄くくだらないことだったが意外と答えにたどり着くまでに時間がかかってしまったので自分みたいな人はいないと思うがメモ

前提としてディレクトリ構成と表示したいsample.jpgのパスは以下の通り。

wp-content/themes/sample_theme

sample_theme
   　-index.php
   　-style.css
   　-images
     　　sample.jpg

表示したいimgタグのsrc属性を指定する際はこんなwordpressのタグをつけると、テンプレートディレクトリを出力してくれる。
※階層がテーマフォルダ/img/画像ファイルの場合

```index.php

<img src="<?php bloginfo('template_directory'); ?>/images/sample.jpg" alt="sample">
```

しかし、CSSファイルにて純粋なフォルダパスを指定しても画像を読み込んでくれない。
上記に倣って下のようにwordpressタグの<?php bloginfo('template_directory'); ?>を使用してもこれまたうまくいかない。
初歩的すぎるが故に情報も見つからず地味に悩んだ。

```style.css
/*ダメ*/
background-image: url("<?php bloginfo('template_directory'); ?>/images/sample.jpg");
```
wordpress上でstyle.css以外のCSSを読み込むために使う<?php echo get_template_directory_uri(); ?>でもダメ。


```style.css
/*ダメ*/
background-image: url("<?php echo get_template_directory_uri(); ?>/images/sample.jpg");
```

結論：wordpressの特殊なタグは必要なく、テンプレートフォルダの直下にあるimageフォルダを直接指定するだけで読み込んでくれた。(簡単過ぎて恥ずかしい...)

```style.css
/*OK!!*/
background-image: url("images/sample.jpg");
```
Vimいいよってお話

[何か布教したいエンジニア AdventCalendar 2019](https://qiita.com/advent-calendar/2019/engineer_tail)の5日目の記事です。

# はじめに
普段はサーバーに接続して直接ファイルを編集するときにvimを使っています。
使っていく中でいいなと思った点、微妙だと思った点を挙げていきます。
具体的な操作方法はそんなに詳しく書いていません。

# vimの良いところ

###1. キーボードだけですべての操作が可能
個人的にはこれが何よりの利点です。
何をするにしてもマウス操作がいらないので無駄に手を動かすことなく、タイピングに集中できます。
h,j,k,lのカーソル移動に慣れてしまうと、ほかのエディタ使うと少しイライラします…

###2. 気軽に編集ができる
ほかのエディタでは編集したいファイルをクリックして開いてから編集しますが、vimの場合`vim <編集したいファイル名>`と打つだけですぐに編集ができます。
またサーバーにあるファイルを編集する際、ほかのエディタではSFTPなどの設定をしたり、サーバーからファイルを落として編集、アップロードしなければいけませんが、vimを使う場合基本的にサーバーに接続しているのでそのような設定や操作がいらないのも手軽でいいです。

# いまいちなところ
###1. 設定のわかりにくさ
設定を`.vimrc`というファイルに書く必要があり、ほかのエディタと比べるとわかりやすいとは言えません。
またプラグインを入れることもできますが、やはり他と比べると少し面倒に感じます。

###2. 補完が弱い
Ctrl+n/Ctrl+pで一度書いた単語を補完することはできますが、一度も出ていない単語は補完してくれません。
プラグインで解消することはできますが、やはりIDE等の補完や予測変換には負けると思います。

###3. 慣れるまでに(ほかのエディタより)時間がかかる
正直これが一番大きい点だと感じます。
ノーマルモード、インサートモードなどのモードの概念や各コマンドなど覚えることが多く、初めて触ったときは拒絶感がありました。
ですが、基本的には

- ノーマルモードからインサートモード(ノーマルモードでiキー)
- インサートモードからノーマルモード(インサートモードでESCキー)
- ファイルの保存(ノーマルモードで:w)
- 編集終了(ノーマルモードで:q)

ができれば十分で、さらに便利にしたいと思った時にコマンドを調べればいいので、1日もあれば上記の操作はできるようになると思います。

# 最後に
vimは少し癖があって扱いにくい印象がありますが、慣れてしまえばどうということはなく、シンプルな分、自分好みのエディタにすることが可能です。
この記事を読んで少しでもvimに興味を持ってもらえたらいいなと思います。

# おまけ
これだけは絶対に設定ファイルに書いたほうがいいです。

```..vimrc
inoremap <silent> jj <Esc>
```

通常インサートモードからノーマルモードに戻る際、ESCキーを押す必要がありますが、この設定ではjを2回押すことでインサートモードからノーマルモードに戻ることができます。
押すキーは1つ増えますが、少し離れたESCキーを押すよりも効率よくモード切替ができます。
開発手法と開発工程

#開発工程
開発の現場では、プロジェクトの特性などに応じて様々な開発手法が取られる。
##ウォーターフォール型開発
各工程を順番に完了していくもので一つの工程にOKがでたら次の工程に移る。このモデルは問題や漏れがあった場合には一つ前の工程に戻り再スタート、見直しをすることが提唱されている。
**メリット**
・最もポピュラーな手法なため経験豊富な人が多い。
・計画通りに進めやすい。
・スケジュール管理がしやすい。
**デメリット**
・ミスがあったら時間をロスする。
##アジャイル開発
アジャイルとは素早いという意味がある。言葉通り素早いリリースが可能であり、開発チーム一丸となって働くことが大切である。
**メリット**
・動くものを早い段階で触れる。
・柔軟性が高い。
**デメリット**
・スケジュール管理が難しい。
・計画性が重視されているものには不向き。
#進捗管理ツール
よく使用するものとして、ZENHUB, Trelloなどがある。このようなツールを使うことで、計画通りに進んでるか確認することでき、遅れがあれば修正することができる。
Qiita API で投稿を自動化する

この記事は[tomowarkar ひとりAdvent Calendar 2019](https://qiita.com/advent-calendar/2019/tomowarkar)の6日目の記事です。

# はじめに
今日は軽めにQiita APIを叩いてローカルの`Markdownファイル`をQiitaに投稿したいと思います。

完成したファイルツリーはこんな感じ。

```
.
├── article
│   ├── config.json
│   └── item.md
└── main.py
```
- `item.md`に投稿する内容をそのままMarkdown形式で記載。
- `config.json`にQiitaAPIの諸設定を保存して管理

といった感じになります。

Qiitaに投稿する記事をそのままローカルで管理でき、新規投稿、更新をできてしまいます。

それではいってみよう

# コード全文

### main.py
QiitaAPIを叩くメインプログラムです。
`submit_article`に投稿する記事のdirectoryを指定してあげることでdirectory内の`config.json`と`item.md`を読み込んで投稿するという感じにしてみました。

```main.py
import requests
import json
import datetime

BASE_URL = "https://qiita.com/api/v2/items"
TOKEN = "{your_token}"

def submit_article(path):
    with open(f"{path}/config.json") as f:
        conf = f.read()
    with open(f"{path}/item.md") as f:
        body = f.read()
    headers = {"Authorization": f"Bearer {TOKEN}"}
    item = json.loads(conf)
    item["body"] = body

    if item["id"] == "":
        res = requests.post(BASE_URL, headers=headers, json=item)
        with open(f"{path}/config.json", "w") as f:
            item["id"] = res.json()["id"]
            item["body"] = ""
            f.write(json.dumps(item))
        return res

    else:
        now = datetime.datetime.now()
        item["title"] += now.strftime("【%Y/%m/%d %H時更新】")
        item_id = item["id"]
        res = requests.patch(BASE_URL + f"/{item_id}", headers=headers, json=item)
        return res


if __name__ == "__main__":
    res = submit_article("article", conf, body).json()
    print(res["title"], res["url"])
```
### config.json
QiitaAPIのための諸設定

```config.json
{
  "title": "Qiita API テスト",
  "id": "",
  "tags": [
    {
      "name": "qiita"
    },
    {
      "name": "test"
    }
  ],
  "private": true,
  "coediting": false,
  "tweet": false,
  "body": ""
}
```
### item.md
投稿する記事内容をそのままMarkdown形式で書いていきます。

```item.md
# Qiita Api テスト
### これはテストです
Hello world
```
# 解説
今回使用するアクセストークンの発行はこちらからできます。
[アクセストークンの発行
](https://qiita.com/settings/tokens/new)

`main.py:submit_article`では該当`config.json`内の`id`の有無に応じて
新規投稿と記事更新を分岐させています。

また新規投稿の場合はレスポンスとして帰ってきた記事idを`config.json`内に上書きするという仕様です。

今回は特に問題ないのですが`submit_article`の機能をもりもりにしてしまいました💦

# 結果
以下のようになっていれば🙆‍♀️です
### 新規投稿時(id無し)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235435/f42b1a3c-2a2b-9540-5eb8-6a1d33a41d5f.png)
### 再投稿時(id有り)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235435/a90ef11b-ebd5-229c-29cd-1a15e2c7f808.png)

# 参考サイト
https://qiita.com/api/v2/docs
https://qiita.com/tag1216/items/b0b90e30c7e581aa2b00

# まとめ
QiitaAPIを叩いてサクッと記事をローカル管理するコードを書いていきました。
もう少し拡張させればconfig.jsonを自動で書き出したり、タグ設定をできるようにしたりということもできそうです。

以上明日も頑張ります！！
[tomowarkar ひとりAdvent Calendar Advent Calendar 2019](https://qiita.com/advent-calendar/2019/tomowarkar)
Raspberry Pi を遠隔操作する　TeamViewer編

対象はRaspberry Pi全般
mkdir ~/downloads && cd ~/downloads
wget https://download.teamviewer.com/download/linux/teamviewer-host_armhf.deb
apt install ./teamviewer-host_armhf.deb
後は歯車の所からセキュリティからパスワード入力して追加してもらえればおｋです。
後はスプレッドシートやone
なんかでチームビュアーのIDとPSをリスト管理すれば楽にできると思います
後はアカウント作ると簡単にPiにアクセス出来るようになります
運用タイトルQAのスケジュール管理でつらかったこと

#はじめに
私はゲーム業界でQAに関する仕事をしています。
中でも主に運用タイトルのQA管理や障害削減、効率化などを行っています。

モバイルゲームの運用に関わったことがある方はご存知かもしれませんが
リリース直前での仕様調整や不具合への対応により
きつきつの開発/検証スケジュールに直面したご経験はないでしょうか？

一時的ならまだしも、運用が続いていく中で
こうした事例が慢性化すると、品質も安定せずにきついスケジュールが常態化する可能性もあります。

この記事では、こうした**リスクを軽減するために気をつけた方が良い**と思った点を経験ベースでまとめてみました。
#テスト設計、検証工数の確保について
スケジュールを圧迫する要因で、大きく以下2点について振り返りをおこないました。

1. **イベント、新規実装の集中**
2. **全体的な開発遅延**

それぞれについて、QAの立場からにはなりますが、問題点とアプローチ案をまとめてみます。
##1. イベント、新規実装の集中
###事例
 - 開発状況や、何らかの事情により、**特定の日/週にイベントや新規実装が集中し、テスト量が増大する**ことがあった

###問題点
 - テスト量が増えることで、急な増員が必要になりテスト精度が落ちる(ナレッジ不足)
 - QAだけでなく、開発チーム全体の負荷が高いのでミスしやすくなる

###アプローチ案
 - 上記懸念に伴う品質リスクを開発側へ提示し、**極力検証工数をならせるように**、開発/QAスケジュールを見ながら、検証工数が密集しているところや薄いところを開発担当者と一緒にMTGなどで調整できるとよいと思います

##2. 全体的な開発遅延
ここでは2つの事例をあげてみます。
###事例1
 - 企画の確定/QAへの仕様書共有が、QA開始の前々日の夜などに来て、QA開始日の前日1日しかテストケース作成工数が確保されてないことがあった

###問題点
 - 開発側のレビュー時間やフィードバックをもらった後のテスト設計者の修正時間が見込まれてないため、レビューの形骸化やテストケースが不十分になる可能性が高い

###アプローチ案
 - **無理のないテストケース作成工数と作成期間を明示し**、それを確保できなかった場合のリスクについて、開発側と共通認識を持ったうえで、企画スケジュールを相談することが重要と考えます

###事例2
 - 実装遅延が定常化し、QA開始日になっても未実装箇所がある
 - 機能面の仕様が固まっておらず、正とする挙動が不明(設定値の仕様未確定を除く)

###問題点
 - 十分に品質を担保できなくなる
  - QA開始が遅延するとQA期間がひっ迫し、検証が荒くなる
  - 残業による対応が発生し、検証者に負荷がかかる
 - スケジュールを組みづらく、適正工数が不明確になるため、工数管理もしづらくなる
 - 一度負荷をかけてなんとかしてしまうと、開発側は何とかなるんだと受け取り、その結果再発しやすく、いずれそれが文化になる可能性がある

###アプローチ案
 - 無理のない企画期間/実装期間の確保をQA側から促し、相談することが重要だと思います
  - スケジュール策定後に開発側へ依頼しても動かしづらいはずなので、**次回スケジュール策定タイミングの前に相談**できるとよいと思います
 - QA開始までに実装が整わなかった場合、しわ寄せを全面的に請け負うのではなく、**ルールを開発稼働前に合意**しておくことも大事です
   - 例えばQA開始までに実装が整わなかった場合、検証範囲を絞る/開発側に巻取ってもらうなどのルールを決めておけば、ある程度は進捗を想定しやすくなります

#QAのスケジュール管理について
スケジュール圧迫の要因は上述しましたが、スケジュールの管理方法も重要です。
こちらについても事例をまとめました。
##QAのスケジュールと開発スケジュールが、それぞれ別ファイルで管理されており、連動していない
###事例
 - QAのスケジュールと開発のスケジュールが**連動していない状態で**それぞれ別管理されていた

###課題
 - ファイルが二重管理になることで、更新コストが二重でかかる
 - 通常開発スケジュールは開発側、QAスケジュールはQA側で管理されることが多いと思うが、開発スケジュール変更時に万が一QAへの共有が漏れると、検知が遅れ、QA期間が十分確保できなくなる可能性もある

###アプローチ案
 - 開発スケジュールにQAスケジュールも含めてもらい、**1つのファイルやツールに一元管理できるとベスト**です
 - もしくは最低限施策名、企画確定日、実装完了日、リリース日だけは開発/QAスケジュールで連動させておいた方がよいと思います
  - そうすれば施策の追加や開発期間が変動しても自動で反映されるため、開発から共有漏れがあっても、検知しやすくなります

#さいごに
上記のような状況に陥らないために、あるいは陥っているときは、極力開発と密にコミュニケーションをとり、QA側の懸念を理解してもらえるまで相談し、開発/QA双方のスケジュールが無理のない形にできると、みんなハッピーになれるのではないでしょうか。
AWS で NAT ゲートウェイ設置数の上限に達した

ansible で VPC を作成・削除して実験していたら、以下のエラーとなりました。

`"msg": "An error occurred (AddressLimitExceeded) when calling the AllocateAddress operation: The maximum number of addresses has been reached.",`

どうやら、NAT ゲートウェイの設置数の上限値に達したらしい。
いちいち削除していたんだけど、時間的なものがあるのかなぁ。

確認してみると、上限値に達していた。

約 1時間後...

再度確認すると、半減していた。

NAT ゲートウェイを削除しても、その確認には時間がかかるので、上限値に達した場合は、1時間程待ってみるとよいようです。

上限に達しているのは、あるリージョンの問題なので、別のリージョンでは、実験を続けられました（ここでも、上限に達すると同じ事が起きますが）。

（参考）
https://docs.aws.amazon.com/vpc/latest/userguide/amazon-vpc-limits.html
【動画解説付き】Raspberry Pi(ラズパイ)の開封からYouTubeを見るまでの方法[OSインストール、日本語化、初期設定など]

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538330/6ef7204f-cdd4-a193-958c-dfbafe69f005.png)

どうも、プログラミングの鬼シヨツ鬼です。
この記事では「Raspberry Pi(ラズパイ)でYouTubeを見てみたいぜ」って人に向けてラズパイの開封からYouTubeを見るまでの流れを説明します。
「YouTubeは見ないけどラズパイのOSインストールや日本語化について知りたいぜ」って人にとっても参考になると思うので、ぜひ読んでみてください。
ちなみに、この記事は次の動画と同じ内容ですので、記事だけだと分かりづらい部分は、そちらもご活用ください。
**(ボタンの位置や操作方法などがわかるので、初心者の方は動画のほうが分かりやすいかも)**
[YouTube:ラズパイの初期設定を完了させてYouTubeを見る方法](https://youtu.be/25TkSVtcfYQ)

#準備するもの
・Raspberry Pi 3 model B
・microSDカード
・HDMIが接続できるモニター
・USBで接続できるキーボード
・USBで接続できるマウス
・microUSB形式の電源ケーブル
・インターネット環境
・ゆとりある時間

#開封
箱から出します。中身を傷つけないように注意してください。
中には次の三つのものが入っていました。
・ラズパイ本体
・販売元からの説明書
・英語の説明書

#OSのインストール
ラズパイを使うためにはOSを入れる必要があります。
ラズパイではOSをmicroSDに入れるので、流れとしては、次の手順を踏むことになります。
###１、自前のPCでOSのインストーラをダウンロードする
ラズパイ用のOSをインストールするためにNOOBSというインストーラをダウンロードします。
ダウンロードサイトに行き、NOOBSのDownload ZIPからダウンロードすることができます。
[NOOBSのダウンロードはこちら](https://www.raspberrypi.org/downloads/noobs/)
###２、ダウンロードしたファイルをmicroSDカードに展開する
１でダウンロードしたZIPファイルをmicroSDに解凍してください。
###３、そのmicroSDカードをラズパイに差し込む
NOOBSが入ったSDカードをラズパイに差し込んでください。
裏表には注意してください。
###４、ラズパイの電源を入れる
電源ケーブルつなぐと自動で電源が入ります。
###５、自動でOSのインストールが始まる
インストール対象をチェックする画面が現れたら、インストール対象にチェックを入れてインストールを開始する。インストールの最中に、画面の下のほうに言語を選択するボタンがあるので、そこから日本語を選択しておいてください。
30分ぐらいかかるので、ごはんでも食べててください。

#初期設定
インストールが完了すると自動でOSが起動し、デスクトップ画面が立ち上がります。
また初回の起動時にはセットアップ画面が出てくるので、設定を行います。
ここでWi-Fiの設定もできます。
詳しくは動画見てください。
[YouTube:ラズパイの初期設定を完了させてYouTubeを見る方法](https://youtu.be/25TkSVtcfYQ)

#日本語入力を可能にする
実は、初期の状態ではラズパイに日本語を入力することができません。
次の手順で日本語入力を可能にします。
###１、プロンプトを開く
画面の右上にあるアイコンからプロンプトを開いてください。
###２、ソフトウェアをアップデートする
プロンプトより「sudo apt-get update」コマンドを実行してください。
###３、Mozcをインストールする
プロンプトより「sudo apt-get install fcitx-mozc」コマンドを実行してください。
###４、再起動する
###５、「半角/全角キー」で入力を切り替えられるようにする
１、設定＞Fcitxを選択
２、全体の設定タブに切り替える＞入力メソッドのオンオフの「空」となっている部分をクリック
３、「半角/全角キー」を押す

#YouTubeにアクセスする
１、右上の地球儀のアイコンよりブラウザを開く
２、「YouTube」と検索する
３、YouTubeが開いたら「シヨツ鬼」と検索する
４、「【プログラミングの鬼】シヨツ鬼」のチャンネルを見つけたらチャンネル登録をする**（重要）**

#まとめ
ラズパイは5000円程度で買えるのに、YouTubeを見たり、プログラミングができたり、楽しさ無限大ですので、ぜひ、チャレンジしてみてください。
最後まで、読んでくれてありがとう。
参考になったら「:thumbsup_tone2:」押してね
vue-paginateのボタンにクリックイベントを設定する

# vue-paginateのボタンにクリックイベントを設定する

## vue-paginate
https://github.com/TahaSh/vue-paginate

<img width="980" alt="スクリーンショット 2019-12-04 22.56.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287122/4de87c71-18e8-d145-da71-b13c7291e2b4.png">

paginate-linksの要素内に、

`@change="関数"`

と指定するだけ。

```js
<paginate-links for="paginate-resource" id="paginate-button" class="pagination" @change="scrollToTop" :show-step-links="true" v-if="tasks.length !== 0" :limit="3"></paginate-links>
```