OmniAICreator/Qiita-1.07M huggingface dataset:
RHEL7とAWSでEBSのディスク増やしてをroot（ルート、”/”）を拡張する

RHEL7とAWSでEBSのディスク増やしてをroot（ルート、”/”）を拡張する。
なぜ初期サイズは6GBなんでしょうか。
しかも、AWSの画面で増やしても一向に反映されない。。。
→かなりハマり、一度起動しなくなりました。
　多分同じ事になりそうなのでメモ。

補足！！
EBSを拡張したときのみの手順です。
EBSを追加した時は、別の手順となります。

■NGだった手順
cloud-init と growpart を利用して、起動時に拡張する
手順通りにgrowpartをインストールし、再起動を２回以上しても無理。
理由はわかりませんでした。。。

■OKだった手順
１，自分の環境の確認。
`# lsblk`
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  150G  0 disk
  xvda1 202:1    0    1M  0 part
  xvda2 202:2    0    6G  0 part /

※自分の環境は上記で`xvda2`となっているという部分でハマりました。。。

２，# fdisk /dev/xvdaにてパーティションの変更！
`# fdisk /dev/xvda
Command (m for help):p
Command (m for help):d
Selected partition 2`
※個々が間違えたらえらいことになった。。。
`Command (m for help):n
Select (default p):p
Partition number (1-4, default 2):2
First sector　空えんたー
Last sector　空えんたー
Command (m for help):p
Command (m for help):w`
※ここで間違えたりしてて不安なら、qで辞めれました。

この後リブートで無事増えてました。

参考URL
https://aftercore.net/2014/07/15/aws%E4%B8%8A%E3%81%AEred-hat-7-%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E6%8B%A1%E5%BC%B5-2/
配列のindexが範囲外であることをtry-catchで判定してはいけないパフォーマンス上の理由

例外投げる言語でcatchで判定できてもLengthで見てくださいねというだけの話なんですが、
パフォーマンスが想像よりずっとひどかったです。

# コード
```C#
using System;

namespace PlayGround
{
	class Program
	{
		static void Main(string[] args)
		{
			var c = 100;
			var sw = new System.Diagnostics.Stopwatch();

			var res = 0;
			var arr = new int[] { 0, 1, 2 };

			// try-catch
			sw.Start();
			for (int i = 0; i < c; i++)
			{
				try
				{
					res = arr[i];
				}
				catch
				{
					res = 0;
				}
			}
			sw.Stop();
			Console.WriteLine(sw.Elapsed.ToString());

			// if
			sw.Restart();
			for (int i = 0; i < c; i++)
			{
				if (arr.Length > i)
				{
					res = arr[i];
				}
				else
				{
					res = 0;
				}
			}
			sw.Stop();
			Console.WriteLine(sw.Elapsed.ToString());
		}
	}
}
```

# 出力
```
00:00:20.4056930
00:00:00.0000030
```
オオウ。
100回中97回例外投げるだけで20sとは…。変に横着してはいけませんね。

# 追記
上記がDebugビルドだったのでReleaseビルドで計測。

```
// c=100
00:00:00.0038820
00:00:00.0000010

// c=1000000
00:00:23.8697330
00:00:00.0007260
```
100万で20sに。やはり無視できないサイズですね。
AWS 　初心者向け勉強しかた

## 背景

* インフラチームで AWS を購入して S3 や Athena とかを使い始まります。それはなに？知りたい
* 最近「AWS について勉強したい、自分で使ってみたい」「仕事で AWS の知識が必要になった」という初心者の方から、「AWS がどんなものかよくわからないので知りたい」と聞かれることがよくあります。

## アジェンダ

* AWS とは
* AWS を使い始めの設定
* おすすめコース

## AWS とは

* AWS とは「Amazon Web Service」の略で、簡単に言うと、Amazon が提供しているさまざまなクラウドサービス(クラウドコンピューティング)です。
* AWS の履歴
  * 2002 開始 -> 2006 公開
  * 1/3 クラウドコンビューティング(Salesforce CRM, Google Cloud Platform)
* AWS を使うと、
  * 自分でサーバ用コンピュータ等を用意する必要がなく、サーバやデータベースなど用途に合った仮想マシンがすぐに使える
  * シンプルな Web サーバから、機械学習・ビッグデータの分析など、目的に合わせたサービスや性能が選べる
  * 料金は使った分だけ支払う従量課金制（月 720 時間以内であれば 12 カ月まで無償利用できるため、学習目的であれば無料の範囲でも充分使える）といったメリットがあります。

## AWS、何から勉強したらいい？

* 必修科目(これを知らないと始まらない)　 AWS を本番運用するにあたって絶対に避けては通れないサービス
  * CloundWatch
  * IAM
  * VPC
  * Security Group
  * EC2
  * AMI
* 重要科目(知らなかったでは済まされない ww)
  * EBS
  * S3
  * DynamoDB
  * RDS
* 選択科目
  * ELD
  * CloundFront
  * Router53
  * ElastiCache
  * SQS
    ...

## AWS を使い始めの注意

* 安いと言ってもお金ですね。気をつけないとすごいお金がかかる
* Free Tier: AWS 無料利用枠を使用すると、AWS のプラットフォーム、製品、およびサービスを無料で体験できます。
  https://aws.amazon.com/jp/free/?nc1=h_ls
* AWSのregion
    * リージョンAのEC2はリージョンBに無い

## おすすめコース

* Amazon Web Services - Web Hosting & Cloud Computing With AWS
  https://www.udemy.com/share/10079W/
* AWS MasterClass: Storage & CDN - AWS S3 & AWS CloudFront
  https://www.udemy.com/share/10079Y/
* AWS Certified Solutions Architect - Associate 2018
  https://www.udemy.com/share/10009i/

##　最後に

* 勉強しましょう。何ごとも最後まで続けることが大事です。
Dockerコンテナ上のDatadogからコンテナ上のRoR（rails）をAPMする


# 概要

* DockerコンテナをDatadogのコンテナから監視する <- 記事があった
* DatadogでAPMを使う <- 記事があった
* Dockerコンテナ上のDatadogからコンテナ上のサービスをAPMで見る <- なかった

ので書き残してみる。公式ドキュメント以上のことは書いてないので、もうできちゃったよ！　って人の場合は、特に追加の知見はないかと思います。

# やること

1. Dockerコンテナ上のDatadogから監視する
2. そこからさらにAPMでサービスを見る

# Dockerコンテナ上のDatadogから監視する

これについては日本語でも解説記事が結構あったので、大まかに。

基本はホストマシンで見るのと変わらなく、ホストマシン上で見ていたところを、Datadogコンテナから見れれば良い（多分）。  
以下のようなdocker-compose.ymlを書く。

```yml:docker-compose.yml
  guest:
    build:
###### 省略 #####
    links:
     - datadog:datadog
  datadog:
    image: datadog/docker-dd-agent
    environment:
     - API_KEY=xxxyourxapixkeyxxx
     - SD_BACKEND=docker
    volumes:
     - /var/run/docker.sock:/var/run/docker.sock:ro
     - /proc/:/host/proc/:ro
     - /sys/fs/cgroup:/host/sys/fs/cgroup:ro

```

docker.sockやproc、cgroupが見れればいいっぽい。docker上のファイルパスは、設定ファイルを修正することによって変えられるが、特に修正する理由もないのでデフォルトのまま。

これだけでコンテナの監視は行える（はず）。

# APMをつかう

guest上にRoR（以下rails）のサービスが乗っかっている前提。

まずはdocker-compose.ymlに追記。

```yml:docker-compose.yml
  guest:
    build:
###### 省略 #####
    links:
     - datadog:datadog
  datadog:
    image: datadog/docker-dd-agent
    environment:
     - API_KEY=xxxyourxapixkeyxxx
     - DD_APM_ENABLED=true
     - SD_BACKEND=docker
    volumes:
     - /var/run/docker.sock:/var/run/docker.sock:ro
     - /proc/:/host/proc/:ro
     - /sys/fs/cgroup:/host/sys/fs/cgroup:ro 
```

名称の通りだが、DD_APM_ENABLEDをtrueにすることでapmが有効化される（特に何かを追加でインストールする必要はない）。

次にguestのrailsのGemfileにddtraceを追加してbundle install。

```ruby
gem 'ddtrace'
```

次にddtraceのコンフィグファイルを追加する。

```ruby:config/initializers/datadog-tracer.rb
Datadog.configure do |c|
  c.use :rails, service_name: 'my-rails-app'
  c.tracer hostname: 'datadog',
           port: 8126
end
```

ここでのhostnameはdockerのバーチャルネットワーク上での名前を指定すればいい。ポートもデフォルトから変えていないのなら8126でよい。  


上記で基本的な設定は以上。これでAPMが利用可能になるはずです。

Enjoy!

# 参考

* [Tracing Docker Applications](https://docs.datadoghq.com/tracing/setup/docker/)
monorepoにprecommitを追加したとき覚え書き

##　結論
- rootにhusky定義しておくとよし。各パッケージではhuskyを定義しない => https://github.com/typicode/husky/blob/dev/docs.md

## 覚え書き
- husky追加前にprecommit系のモジュール追加しちゃうといろいろおかしくなる
- packageにyarn add huskyしたあとにrootにyarn add huskyしてもおかしくなる
- monorepo環境にhusky以外のprecommitを仕込むとうまくいかないときがある
uwscでサクッとプログラム

uwscを使うと直感的にwindowsを操作できて便利。
例えば、僕は F1 キーを押すと chrome の一番左のタブを 更新する。
というショートカットを作り使っています。


・マウス座標の位置を計測
https://www.vector.co.jp/download/file/winnt/util/fh677994.html

sckeyの仮想キー一覧
http://canal22.org/vkey/

# 今回は、サクッと作るために簡単なプログラムをまとめます。


## chrome が立ち上がっていない状態で、 chorme を立ち上げる

```

exec("cmd /c start=http://yahoo.co.jp")

```

## chrome にキーを送る


```


//現在開いているchrome を選択、アクティブに。
id = GETID("Google Chrome","Chrome_WidgetWin_1",-1)

//ショートカットキーを送り 一番左のタブを選択
sckey(id, VK_CTRL,1) // shift + tab

//F5キーで更新
SCKEY(id,VK_F5)


```

## 待機

```

sleep(1)

```


## 立ち上がっていない chrome を起動。yahooを一瞬開いた後、googleに移動

```

//chromeを起動。yahooを開く
exec("cmd /c start=http://yahoo.co.jp")
id = GETID("Google Chrome","Chrome_WidgetWin_1",-1)


//URL入力欄へカーソルを移動
sckey(id, vk_alt,vk_d)

//URLを削除
sckey(id, vk_delete)

//googleへの移動文字列を入力
sendstr(id,"http://google.co.jp")

//enterを送信し、移動
sckey(id, vk_enter)


```

## 繰り返し

マウス座標 -777 から 横に 3回、 170ずつ座標をずらす

```

i = 0;
x = -777

while true

	mmv(x, 455)
	sleep(1)
	//btn(left,click)

	x = x+170

	ifb i = 3 then
        	break
    	endif

i = i+1

wend

```


## ランダムでスリープ

```


//指定した秒数までランダムでスリープ
//最低でも0.5秒はスリープ
//randSleep(5)
function randSleep(max_rand)
	rand = random(max_rand)

ifb rand < 1 then
        rand = 0.5
    endif

	sleep(rand)
	result = true
fend

```


## 指定した画像をクリック

```

ifb CHKIMG( "dlbtn.bmp") //画像はbmpで。パスはuwscファイルの場所から。
x=G_IMG_X // 画像の座標をxへ代入
y=G_IMG_Y // 画像の座標をyへ代入
BTN(LEFT, CLICK, x+2, y+2, 80)// 画像の場所を左クリック
else 
PRINT "画像を探しても見つかりませんでした。"
endif

```
【Unity】Live2D Cubism 3 SDKのサンプルを解説する（AsyncBenchmark 編）

Cubism SDK for Unityにあるサンプルプロジェクトを適当に見つめていきます。Cubism SDK for Unityのダウンロードはこちらから。
https://live2d.github.io/
　
　
【ちゅうい】 

- Live2Dのバージョンは3.x系統です。

- 解説していくのは主にLive2Dに関わる部分のみとします。Unity標準の機能や操作の解説は割愛します。

- 用語などは厳密には間違っているかもしれないです。

- プロジェクト内のスクリプトなどその他もろもろ、さーっと目を通して「こんな処理してそうだな」って感じで書いてます。

# AsyncBenchmark
![mov (0-00-06-14).png](https://qiita-image-store.s3.amazonaws.com/0/140686/e9224b0e-da99-c0a4-f9e8-c0045dec7d56.png)

（Assets\Live2D\Cubism\Samples\AsyncBenchmark\AsyncBenchmark.unity）
★モデルイラスト：れもたろ様
https://twitter.com/remotaro

ざっくり説明すると、とりあえず画面上にLive2Dモデルを表示させまくって、どのくらいで処理が重くなるかを検証できるプロジェクト。直訳で「非同期ベンチマーク」

非同期というのはここでは「Live2Dモデルを適当にいっぱい配置させて動かしておく」くらいでいいと思います。


＋ボタンを押すとモデルが画面に増えていって、－で減っていく。fpsの表示が60fpsから下がり始めたあたりで、パフォーマンスが落ちてますよということがわかる。

以下、特筆するゲームオブジェクトを解説。
（このサンプルプロジェクトはSpawnerの1つだけだった…）

## ○[Spawner]ゲームオブジェクト
・ModelSpawner.cs
直訳で「モデルを産む者」。このスクリプトでモデルを画面上に表示させるっぽい。

「Model Prefab」に指定したLive2DモデルのPrefabを画面上のランダムな場所に生成します。表示させたいLive2Dモデルを変更したい場合は「Model Prefab」を変更すればOKみたいです。

　
　
　
以上

（個人的に）Live2DというよりはUnityのいろんなことに慣れるための勉強として始めてみた的な解説コーナーでした。続けていくつもり（）


せっかくなので次回はベンチマークのテスト的なことをこのサンプルを使ってやってみたい。
【MYSQL】データをエクスポートしようとしたらsecure-file-privがどうのこうのって言われたときの対処法

ローカルのMYSQLからデータをCSVでエクスポートしようとしたら

```
The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
```

って怒られたのです。

```
mysql> SELECT @@global.secure_file_priv;
+---------------------------+
| @@global.secure_file_priv |
+---------------------------+
| NULL                      |
+---------------------------+

```
ここがNULLなのがダメらしい。


## 対処法

### my.cnfの配置
`sudo cp /usr/local/opt/mysql@5.6/support-files/my-default.cnf /etc/my.cnf`

`my-default.cnf`へのパスはmysqlのバージョンによって変わってくるのでよしなに。

### my.cnfの編集
`sudo vim /etc/my.cnf`

```
[mysqld]
secure-file-priv = ""
```

を追記

### mysqlの再起動
`mysql.server restart`

```
mysql> SELECT @@global.secure_file_priv;
+---------------------------+
| @@global.secure_file_priv |
+---------------------------+
|                           |
+---------------------------+
1 row in set (0.00 sec)

```

カラです。（my.cnfで設定したとおり）

これでいけるはずです。


詳しい原因は調べれば簡単にでてきます。
webpack4とbabel7の最小構成テンプレート

イチから設定してみました。

> [webpack4_babel7_simple_template](https://github.com/pokkur/webpack4_babel7_simple_template)

なるべく設定ファイルをまとめたかったけど、
postcss.config.jsだけは設定がゴチャつくので別にした。
.editorconfigはまだpackage.jsonに書けないの？
webpack4から、`extract-text-webpack-plugin`の代わりに
`mini-css-extract-plugin` を使用する。
また、一番やっかいだったのはprettierの設定だった。
プラグインを利用してprettier式の設定をeslint側が取り込むようする。
eslintだけで済むように早くなれ～。

## branch

|      branch      |                  description                  |
| ---------------- | --------------------------------------------- |
| master           | no preprocessor                               |
| feature/extended | pug,scss,postcss,autoprefixer,eslint,prettier |

## command

|    command    |         script         |
| ------------- | ---------------------- |
| yarn dev      | 開発ビルド             |
| yarn build    | リリースビルド         |
| yarn start    | webpack-dev-server     |
| yarn lint     | eslint                 |
| yarn nibble   | eslint結果の概要を表示 |
| yarn prettier | prettier               |
カプセル化

#カプセル化...
カプセル化とは、オブジェクトの持つ任意のメンバーを隠ぺいすることです。
オブジェクトを利用する側は、オブジェクトの詳細な処理の内容を意識することなく、
オブジェクトのインターフェイスだけを利用することができるようになる。

#カプセル化の例
```C#
    class Years
    {
        private short _item;
        public short Item
        {
          中略
        }

        private short[] _items;
        public short[] Items
        {
           中略
        }
        private short[] CreateItems()
        {
          中略
    }
}
```
カプセル化を実現するための修飾子である「public」「private」というキーワードを指定しています。
「public」は公開という意味で「private」は非公開という意味です。

#カプセル化の目的
オブジェクトを使用する側はそのオブジェクトを使用するためのインターフェイスとなるメンバーのみを意識するだけでよい。それによって、オブジェクトの直感的に理解することができたり本来アクセスしてはいけないメンバーを間違って使用するなどを防止することができます。
オブジェクトの状態を正常に保ち続けたり処理の内容を変更したとき、その影響を受ける範囲を特定することができたりします。


#公開レベル

|private|最小の公開レベル自身のメンバーからアクセスできる|
|:---|:---|:---|
|protected|プライベートのアクセスに加えこの方を継承したクラスからアクセスできる|
|intemal|privateのアクセスに加えこの型と同じアセンブリに属するクラスからのみアクセスすることができる|
|public|最大の公開レベルこの型のメンバーはすべてに対して公開されています|
Swift4のKVOに感動した。 

#KVOについて
まずKVO自体の説明を少し。
KVO(Key Value Observing)とはオブジェクトの値の変更の監視をする技術です。
後付けできる`setter`,`getter`をイメージしてもいいかもしれませんし、
`delegate`パターンもKVOと似た働きをすることがあります。

ただ`setter`,`getter`だとオブジェクトそのものに組み込むぶん依存性が上がりやすいですし。
`delegate`パターンでは`delegate`に設定できるオブジェクトは一つのみで、`protocol`でデリゲートを作って行かなくてはなりません。

ここで活躍するのがKVOです。

簡単な例だとこんな感じ

```swift:KVO
class KVOSample: NSObject{
    @objc dynamic var value:Int = 0
}
```

こうすると後から`value`の値の変更を監視することができます。

#Swift3.0のKVO

SwiftにはObjC時代から続くKVOの機能があります。
Swift3.0までを例に、`WKWebView`の`estimatedProgress`の値を監視しようとすると
こんな感じ

```swift:swift3.0まで
class ViewController: UIViewController{

    var webView: WKWebView
    //中略
    override func viewDidLoad(){
        //webViewにObserverを追加
        webView.addObserver(self, forKeyPath:"estimatedProgress", options:.new, context:nil)
    }
    //NSObjectのもつメソッドを継承
    override func observeValueForKeyPath(keyPath:String, ofObject object:Any, change:[NSObject:Any], context:UnsafeMutablePointer<Void>) {
        switch keyPath {
            case "estimatedProgress":
                if let progress = change[.newKey] as? Float {
                    print("Progress: \(progress)")
                }
            default: break
        }
    }
}


```

ただなんかやっている事に比べてコードが複雑過ぎますよね。
まず、KeyPathがString指定なので、
ミスタイプを起こしやすいですし、型も明示的にAnyから変換する必要があります。
特にViewControllerで`observeValueForKeyPath`なんて言う長ったらしいコードを継承するのもKVOが好きになれなかった理由です。

#Swift 4.0 のKVO！

Swift4.0になってKVOの実装は非常にシンプルかつ
Swiftらしいものになりました!

KeyPath生成用の独自演算子まで用意してかなりAppleも本気で取り組んでいる感じです。

これを見てください。


```swift
class ViewController: UIViewController{
    var webView: WKWebView
    private var _observers = [NSKeyValueObservation]()
    //中略
    override func viewDidLoad(){
        _observers.append(webview.observe(\.estimatedProgress, options: .new){_,change in
            print("Progress: \(change.newValue)")
        })
    }
}

```

なかなかスッキリしているでしょう！
それぞれ説明していきます。

###NSObject::observe(keyPath:,options:,changeHandler:)

Swift4.0でNSObjectに以下のメソッドが追加されました。

```swift
public func observe<Value>(
        _ keyPath: KeyPath<NSObject, Value>, options: NSKeyValueObservingOptions,
        changeHandler: @escaping (NSObject, NSKeyValueObservedChange<Value>) -> Void
    ) -> NSKeyValueObservation

```

このメソッドの何がすごいかと言うと値の変更をclosureで受け取れるようになるだけでなく
`KeyPath`に監視する対象の型を渡せるのです！
なので上記のように明示的型変換をすることなく`value`を受け取ることができます。

###新演算子 "\" 

コレについてまとめている情報が少なかったので演算子と定義していいか微妙なところではあるのですが


```swift
webview.observe(\.estimatedProgress, options: .new)
```

この`estimatedProgress`の前についているバックスラッシュがKeyPathを生成する演算子です。
省略をしないで書くとこんな感じ

```swift
webview.observe(\WKWebView.estimatedProgress, options: .new)
```

`selector`に近い見た目ですがずっとシンプルですよね。

追記:
`\`は演算子ではなく式`expression`であると
教えていただきました。
こちら
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Expressions.html#//apple_ref/doc/uid/TP40014097-CH32-ID383
に詳しい情報が乗っているそうです。

#まとめ

Swift4.0で大きく変わったKVOですが
あまりまとめた記事がない印象だったのでまとめてみました。

今までKVOは記述の冗長さからあまり積極的に使ってこなかったのですが
コレからはガンガン使っていこうと思っています（｀・ω・´）

ではでは
dockerコンテナのログの実体ファイルを取得する方法

# Dockerコンテナのログをファイルで取得する方法(ただしjson形式)

## 手順

### 対象のコンテナのコンテナIDを確認する

Nginxを例として説明します。

```shell
$ sudo docker ps | grep nginx
844a92cb5647        quay.io/kubernetes-ingress-controller/nginx-ingress-controller@sha256:46523a0b8b35b082211caa2bebb95c43578f85a51c03a28599b39a13b27965cb   "/usr/bin/dumb-ini..."   6 weeks ago         Up 6 weeks                              k8s_ingress-nginx_ingress-nginx-79f5476fdc-b7jlc_production_f6c71e4b-3360-11e8-9f95-0ace71965bbc_0
```

コンテナID = 844a92cb5647

### Dockerのログの設定を確認する

```
$ sudo docker info | grep Log
Logging Driver: json-file
```

デフォルトではドライバが `json-file` になっているはず。
ファイルであれば、 `inspect` で確認可能。

### 実ファイルのPathを確認

```
$ sudo docker inspect 844a92cb5647 | grep LogPath
        "LogPath": "/var/lib/docker/containers/844a92cb5547b61ed2534f6ff87e81057ae290edd55fe761041205cfc472080c/844a92cb5547b61ed2534f6ff87e81057ae290edd55fe761041205cfc472080c-json.log",
```
WebStorm x ESLint 設定の覚書 (ES6, babel-eslint, Switch文インデントルール変更)

node.jsの開発は主にWebStormで開発をしていますが、ESLintを導入時にやったことを備忘します。

### 環境系

- WebStorm 2016.3.2
- eslint 4.19.3
- babel-eslint 8.2.3

# やったこと①: `eslint --init`で初期設定、解析不可だったので`babel-eslint`を導入

`eslint --init`で適当に答えて、npm scriptsを以下のように指定。

```package.json
..(略)..

  "scripts": {
    "lint": "eslint ./*.js ./lib/*.js"
  },


```

いざ、`npm run lint`でかけたら、ES6の構文で書いていたため`Parsing error: Unexpected token =`とエラーが出てしまい、構文解析ができなかったので、以下を参考に`babel-eslint`の設定をしました。

[ESLintで Parsing error: Unexpected token = となる場合の対処法](https://qiita.com/kurkuru/items/d4eebd34f0898c6a2d5a)

### 変更後の`.eslintrc.yml`

```.eslintrc.yml
env:
  es6: true
  node: true
extends: 'eslint:recommended'
parserOptions:
  sourceType: module
rules:
  indent:
    - error
    - 4
  linebreak-style:
    - error
    - unix
  quotes:
    - error
    - single
  semi:
    - error
    - always
parser: babel-eslint
```

# やったこと②: WebStormの設定

WebStorm上にESLintの解析結果が出るように設定。
設定画面のESLintページでEnableにしておく。
<img width="600" alt="スクリーンショット 2018-05-16 18.05.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/51734/4a64f568-2f6d-3698-91dc-09de17ba9f4d.png">


# やったこと③

>Expected indentation of 4 spaces but found 8

<img width="600" alt="スクリーンショット 2018-05-16 17.40.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/51734/f3d388a3-eb1a-53a5-5384-eca326325531.png">


的なSwitch文のところでインデント合わねーぞというエラーが出たので、
WebStorm側のインデントルールを調整しました。
Switch文1行直後のcase文1行の間にスペースを入れないように指定。

>参考:[JETBRAINS - JSLint and switch statements](https://intellij-support.jetbrains.com/hc/en-us/community/posts/206367039-JSLint-and-switch-statements)
>Will unchecking Settings | Code Style | JavaScript | Wrapping and Braces | 'switch' statement | Indent 'case' branches option help?

デフォルトではスペース入れることになっているので、チェックを外します。

switchの行直後にインデントスペース入れるか入れないかの設定は以下で実施。

◆BEFORE
<img width="600" alt="スクリーンショット 2018-05-16 17.33.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/51734/cd4e50dc-4784-c757-abf5-c0fcf489e837.png">

◆AFTER
<img width="６00" alt="スクリーンショット 2018-05-16 17.33.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/51734/3c5761ad-17ab-20ac-e582-73067cb366a2.png">

これで、「Command+A」で全体選択してから、「option＋Command＋L」 で整形したらESLint側のルールとピタッとなります。簡単ですが以上です。
dockerで起動しているPostgreSQLのタイムゾーンを設定する

`TZ`環境変数を設定して変更します。

```
docker run -e TZ="Asia/Tokyo" postgres:alpine
```

## Docker Composeの場合

```yaml
postgres:
    image: postgres:alpine
    environment:
        TZ: "Asia/Tokyo"
```

## 確認方法

```sql
show timezone;
```
BAMとSAMについて知ったこと

# 概要

BAMとSAMの関係がどうなっているのかを知りたかった。
理由は、いずれ書く予定

# 仕様

* [Sequence Alignment/Map Format Specification](https://samtools.github.io/hts-specs/SAMv1.pdf)

The SAM/BAM Format Specification Working Group

2 May 2018

最近も更新されているようなので、仕様を調べるときには確認したほうがよい。

# まとめ

https://samtools.github.io/hts-specs/SAMv1.pdf

```
4 The BAM Format Specification
4.1 The BGZF compression format
BGZF is block compression implemented on top of the standard gzip file format.14 The goal of BGZF is to
provide good compression while allowing efficient random access to the BAM file for indexed queries. The
BGZF format is ‘gunzip compatible’, in the sense that a compliant gunzip utility can decompress a BGZF
compressed file.1
```



# TODO

* ヘッダ部分に書かれている情報を出力してみる。
* 理由を追記する
KubernetesのPodのログをすべてsyslogに送り付ける

Elasticsearchがいくら盛り上がったところで既存の監視システムとの兼ね合いでアプリのログはsyslogに来ないと困っちゃうという事は良くある話でして。
filebeat使えれば良かったんですが、あれでsyslogに出力するのが結構難儀。
基本的には、Kubernetes上で動作するPodのコンテナ出力ログは、kubeletが「/var/log/containers/」ディレクトリ下に「pod名_namespace名_コンテナ名っぽい何か.log」のファイル名でリンクを張ってくれるので、それをtail -Fしてloggerコマンドでsyslogに送り付ければ良い。

```bash:/root/logsys
#! /bin/bash
MYNAME=logsys
LOGDIR=/var/log/containers
ACTIVE=/dev/shm/$MYNAME

mkdir -p $ACTIVE

watch () {
  logger -t $MYNAME -- $MYNAME::start watching $l
  echo $BASHPID > $ACTIVE/$1
#  tail -F -c +0 $LOGDIR/$1 | while read m; do
  tail -F $LOGDIR/$1 | while read m; do
    logger -t $MYNAME -- $1::$m
  done
  rm $ACTIVE/$1
}

ls $LOGDIR | while read l; do
  if [ ! -e $ACTIVE/$l ]; then
    watch $l &
  fi
done
```

上記はスクリプトを実行した後に出力されたログをsyslogに転送しますが、tailに-c +0オプションが付いたほうの行に変えればスクリプト実行時点で存在するログもすべてsyslogに送ります。まあ、気を付けて使用ください。
chmod +x /root/logsys してですね、新しいPodが作成された時も勝手にsyslogにも出力してくれるよう、それを crontab -e で１分に１回実行するように仕込みます。

```bash:crontab
* * * * * /root/logsys
```

停止したい場合は、crontab -eで上記行をコメントアウトして定期実行を止めたのち、以下のコマンドを実行してスクリプトのtailプロセスを全部止めます。

```
for i in $(ls /dev/shm/logsys); do kill $(ps --ppid $(cat /dev/shm/logsys/$i) -o pid=); done
```

場合によっては大量のログが出力されることになるので、「ls $LOGDIR | while read l; do」の直後ぐらいに、ファイル名からnamespace名等でsyslog転送するログをフィルタする処理を追加したほうが良いでしょう。ちなみにwhile文でそのループの処理を途中でスキップするにはcontinueを使います。
[entity framework]DBへのmigrationやアノテーションに関するまとめ

##コメント
既存のmigrationに関する記事なんて大量にあるしそれに比べると陳腐になりそうではあるけども自分なりにまとめる機会があったのでせっかくだからQiitaにも投稿してみる。
※間違ってる箇所等ありましたらコメントいただけると幸いです。

##テーブルの作成、変更の手順について
####1,visual studio上で変更する対象のテーブルを開く又は、新規作成するテーブルのファイルを開きます。

####2,対象のテーブルに必要なカラムを記述します。
例)
public int ID { get; set; }
※intやdoubleなど、通常null非許容の型に対してnull許容型を指定する場合は以下のようにします。
int?,double?

####3,各カラムに必要であればアトリビュートを追加します。
例)
[Key]
public int ID { get; set; }

※よく用いるアノテーションについて
`[Key]`
このアノテーションを付けたカラムはそのテーブルにおいて主キーであることを示します。

`[Required]`
このアノテーションを付けたカラムはそのテーブルにおいて必須項目であることを示します。

`[StringLength(〇〇)]`
対象のカラムの最長文字数を設定します。〇〇部分に指定の最長文字数を入力します。

`[DatabaseGenerated(DatabaseGeneratedOption.〇〇)]`
テーブルにレコードが作成されたときに、自動的に値を生成するかどうかを設定することができます。
〇〇部分
・None
値の生成を行いません。
・Identity
行が挿入された場合に自動で値を生成します。
・Computed
行が挿入または変更された場合に自動で値を生成します。

`[Column]`
テーブルに表示される列の順序の指定やカラム名のオーバーライドを行うことができます。
`[Column(“string”)]`
 上記のアノテーションを付けた場合、元の名前から”string”にオーバーライドされてDBへ登録されます。
`[Column(Order=int)]`
 上記のアノテーションを付けた場合、もともと記述されている順序からint番目へと順番の修正が行われます。
`[Column(TypeName=”string”)]`
 上記のアノテーションを付けた場合、もともと記述されている型から”string”型へとオーバーライドされて登録されます。

※上記[Column]アノテーションのプロパティを一つのカラムに対して複数同時に用いたい場合は以下のように記述します。
例)[Column(“string”,Order=int,TypeName=”string”)]
   [Column(Order=int,TypeName=”string”)]

*※テーブルを新規作成する場合*
####4,テーブルの新規作成時のみ、DbConextを継承しているファイルに新規作成するテーブルの記述を行います。
記述例)
public virtual DbSet<NewTables> NewTable { get; set; }

##Database migrationの手順について
1,visual studio上で、表示→パッケージマネージャーコントロールを開く。

2,パッケージマネージャーコントロールの「既定のプロジェクト」がテーブルのモデル等が存在しているプロジェクトになっていることを確認する。
(なっていない場合は対象のプロジェクトに変更する。)
 
3,パッケージマネージャーコントロール上において、`Add-Migration 〇〇`と入力し、実行します。
(○○に入力した名前が作成されたMigrationファイルの名前になります。〇〇には変更箇所名などわかりやすい名前を記入するのがいいでしょう。)

4,実行後、Migrationファイルが生成されます。
生成されたMigrationファイルのUpメソッド内に更新後の内容が表示されます。
生成されたMigrationファイルのDownメソッド内に更新前の内容が表示されます。

5,パッケージマネージャーコントロール上において`update-database`と入力し、実行します。
MigrationファイルのUpメソッド内に記述してある変更がDBへ反映されます。

##SQLのみ発行し、その場ではDBへ反映させないようにする場合
ローカルの環境から本番環境に向けて手動で更新するときなど

※1~4については`Database migrationの手順について`と同様

1,パッケージマネージャーコントロール上において`update-database -script`と入力し、実行します。
MigrationファイルのUpメソッド内に記述してある変更がscript化されて出力されます。
あとはSSMS等で直接scriptを実行すればOK
wxPythonを使ってみる (3)

こんにちは．これからwxPythonを使ってみる(3)について始めたいと思います．
対象や動作環境などのはじめに必要な情報は[wxPythonを使ってみる(1)](https://qiita.com/Kenta-Han/items/5ac4f38d518e3262905f) と同じになります．
また，今回の内容は[wxPythonを使ってみる(2)](https://qiita.com/Kenta-Han/items/dfd9764aedd64f9f92be) の続きとなります．是非読んで見てください．



## 特徴
前回では，wx.Frameの基礎的な知識について学んだが，今回はSizerを使ったレイアウトについて学んで行きたいと思います．
wx.Sizerのサブクラスである各種Sizerを利用したレイアウトが一般的に行われています．
まず，Sizerの中のBoxSizerについて学びましょう．
BoxSizerは，垂直BoxSizerと水平BoxSizerの組み合わせでできています．これを使っていろんな複雑なレイアウトを作ることができます．

### item引数

```python3:window_display06.py
import wx
class CustomFrame(wx.Frame):
	def __init__(self,title):
		wx.Frame.__init__(self,None,-1,title,size=(400,400))
		
		panel = wx.Panel(self)
		
		layout = wx.BoxSizer(wx.VERTICAL)
# 		layout = wx.BoxSizer(wx.HORIZONTAL)
		layout.Add(wx.Button(panel,wx.ID_ANY,"B01"))
		layout.Add(wx.Button(panel,wx.ID_ANY,"B02"))
		layout.Add(wx.Size(0,50))
		layout.Add(wx.Button(panel,wx.ID_ANY,"B03"))
		layout.Add(wx.Button(panel,wx.ID_ANY,"B04"))
		
		panel.SetSizer(layout)
		self.Show()

app = wx.App(False)
CustomFrame("BoxSizer")
app.MainLoop()
```

Add関数は，item引数として渡すことができる帯ジェクトは次の3つです．
1. wx.Windowを継承しているオブジェクトはwx.Button
2. wx.Sizerを継承しているオブジェクトはwx.BoxSizer
3. wx.Sizeオブジェクト

wx.Sizeで指定した(0,50)の高さ分のスペースが確保されます．
また，サンプルコードの6行と7行のwx.VERTICALとwx.HORIZONTALそれぞれ垂直方向への配置と水平方向の配置となっています．サンプルコードを実行しますと，下の図となります．

<img width="400" alt="スクリーンショット 2018-05-01 11.36.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/179248/aa7a1afe-ca57-1b35-08d4-aeedf7811b61.png">

### proportion引数
proportionは，配置されたアイテムのコンテナー領域内に占める割合を制御しています．proportionは1以上の数値が指定されたアイテムは，コンテナーの残領域を占有するように配置されます．
また，複数のアイテムで1以上の数値が指定された場合は，それぞれの数値によって占有率が変化します．

```python3:window_display07.py
import wx
class CustomFrame(wx.Frame):
	def __init__(self,title):
		wx.Frame.__init__(self,None,-1,title,size=(400,400))
		
		panel = wx.Panel(self)
		
		layout = wx.BoxSizer(wx.VERTICAL)
		layout.Add(wx.Button(panel,wx.ID_ANY,"B01"))
		layout.Add(wx.Button(panel,wx.ID_ANY,"B02"),proportion=1)
		layout.Add(wx.Button(panel,wx.ID_ANY,"B03"))
		layout.Add(wx.Button(panel,wx.ID_ANY,"B04"))
		
		panel.SetSizer(layout)
		self.Show()

app = wx.App(False)
CustomFrame("BoxSizer")
app.MainLoop()
```

proportionへ1以上を指定されると下の図のようになります．矢印で示した範囲はB02の範囲となります．

<img width="400" alt="スクリーンショット 2018-05-01 11.43.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/179248/6067aadd-4a78-5de5-d8f0-58d66bf7309e.png">

また，B01~B04のB03を4，B04を1に変更してみます．

```python3
・・・
layout.Add(wx.Button(panel,wx.ID_ANY,"B01"))
layout.Add(wx.Button(panel,wx.ID_ANY,"B02"))
layout.Add(wx.Button(panel,wx.ID_ANY,"B03"),proportion=4)
layout.Add(wx.Button(panel,wx.ID_ANY,"B04"),proportion=1)
・・・
```

実行した結果は，下の図となります．B03とB04の比例は4対1となります．
<img width="400" alt="スクリーンショット 2018-05-01 11.49.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/179248/ecd76f60-f9c2-0a40-9c5b-369dbd8f7e7b.png">



今回のwxPythonを使ってみる(3)は以上で終わります．
読んでいただいてありがとうございます．
また今度で会いましょ！

---
### 「wxpythonを使ってみる」目次
* [wxPythonを使ってみる(1)](https://qiita.com/Kenta-Han/items/5ac4f38d518e3262905f)
* [wxPythonを使ってみる(2)](https://qiita.com/Kenta-Han/items/dfd9764aedd64f9f92be)
AWS の サービスを利用する前に決めておくこと

はじめに
=======

AWS で 例えば、EC2 等のインスタンスを作成するまでに、やらなければならない／決めなければならないことをメモ形式で書き残しておきます。

手順
====

１．リージョン の 決定
========================

世界中にあるリージョン[^1]から、どのリージョンにサーバーを置きたいか決める。
選ぶ時のポイントは、ユーザーからの近さ、サービスの種類、利用料金、グローバルな可用性が必要か、などを考えると良いでしょう。

※中の数字はAZ[^2]の数
![リージョン](https://d1.awsstatic.com/about-aws/regions/global-infra_3.30.18.b559f46825615c1ae40f319d0c4d9139fea9c492.png)
引用：[グローバルインフラストラクチャ](https://aws.amazon.com/jp/about-aws/global-infrastructure/) の 世界地図

例えば、東京を選んだとします。
![リージョン.png](https://qiita-image-store.s3.amazonaws.com/0/45117/ec826115-ca7a-6340-15e2-ef3ce868d142.png)


２．VPC を 用意
==============

VPC を 作成し、CIDR[^3] を とりあえず/16[^4]で設定しておきます。後々のために、少し大きめに取っておきましょう。

![VPC.png](https://qiita-image-store.s3.amazonaws.com/0/45117/d2b90420-9afd-a313-f339-5d5b13760804.png)

３．AZ を 選択
=============

AWS は、1 つの VPC に対して、必ず *2つの AZ を選択*することを推奨[^5]しています。

![AZ.png](https://qiita-image-store.s3.amazonaws.com/0/45117/624f7b12-2cd6-a957-272f-c23af19b77c9.png)

４．サブネット の 設定
====================

Public と Private の サブネット 作成し、インターネットと疎通できるエリアを分離しておきます。(Public エリア ＝ DMZ)

![Subnet.png](https://qiita-image-store.s3.amazonaws.com/0/45117/563e0105-5121-528e-c353-c0ec5cb28ad2.png)

５．ルートテーブル の 設定
========================

![RouteTable.png](https://qiita-image-store.s3.amazonaws.com/0/45117/f2f81027-f052-3a5a-307c-9d2719ec1e43.png)


６．EC2 の 配置
===============

EC2 を 配置する場合は必ず、然るべきセキュリティグループ[^6]を先に作成してください。

![SecurityGroup.png](https://qiita-image-store.s3.amazonaws.com/0/45117/b2b60235-1cdb-cf85-a86f-06fb239a3d86.png)

７．ストレージの配置
=================

![Storage.png](https://qiita-image-store.s3.amazonaws.com/0/45117/ae7f4aed-eeb0-c3df-19bd-88e3e5ea81ee.png)

８．データベースの選択
===================

データベースは慎重に選択しなければなりません。具体的には RDB にするか、KV 型にするかです。データを扱う上で、トランザクション管理が重要な場合は RDB を選択してください。データ構造が複雑な場合も同様です。それ以外は、KV 型にするかの検討が必要になります。

最後に
======

AWS の アイコンが一新[^7]するみたいです。新しいアイコンが公開されたら、イメージを作り替えようかなと思っています。


[^1]: リージョンとは、地域くらいに思っておけば良いです。詳しくは「[グローバルインフラストラクチャ](https://aws.amazon.com/jp/about-aws/global-infrastructure/)」 を 参照してください。

[^2]: AZ とは アベイラビリティゾーンの略で、データセンターが複数存在する集合体です。詳しくは「[リージョンとアベイラビリティーゾーン](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html)」 を 参照してください。

[^3]: Classless Inter Domain Routing の 略で、詳しくは、[Wikipedia](https://ja.wikipedia.org/wiki/Classless_Inter-Domain_Routing) を 参照してください。

[^4]: ホスト数として 65,536－α 個 割り当てできる。＋１増えると割り当て数が半分になる。（/16＝65,536個、/17＝32,768個……）正確には、IPを2進数で表記して、頭16桁まで固定すること。

[^5]: 各アベイラビリティーゾーンは、障害が発生しても他のゾーンに影響を与えないように設計されています。代表的な都市のリージョン内で物理的に区切られており、洪水のリスクが低い場所にあります。個別の無停電電源やオンサイトのバックアップ発電施設に加え、単一障害点をさらに減らすために、別々の電力供給施設から異なる配電網を経由して、個別に電力供給を行っています。

[^6]: セキュリティグループはステートフル（インとアウトが同時に許可される）な、仮想的ファイアウォールです。詳しくは「[VPC のセキュリティグループ](https://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_SecurityGroups.html)」 を 参照してください。

[^7]: AWS では既に、新規ドキュメントに対して、旧アイコンの利用は禁止になっているようです。
osX keyDownメソッド実行時にBeep音が鳴るようになった話

#状況
osX(macOS)向けアプリ開発でキーボード入力を受け付ける際、`keyDown()`などを用いると思います。

```swift:sample1.swift
import Cocoa

class ViewController: NSViewController {

	override func viewDidLoad() {
		super.viewDidLoad()
	}

	override var representedObject: Any? {
		didSet {
		}
	}

	override var acceptsFirstResponder: Bool {
		return true
	}

	override func keyDown(with event: NSEvent) {
		Swift.print(event.keyCode)
	}

}
```

今まではこんな感じで`NSViewController`のサブクラスで`keyDown()`を実装すればよかったのですが、なぜか最近作ったプロジェクトだとBeep音が鳴るようになってしまいました。

#~~とりあえずの解決策~~
Beep音を鳴らさないためには、`NSView`のサブクラスで`keyDown()`を実装すれば良いようです。

```swift:sample2.swift
class MyView: NSView {

	override func keyDown(with event: NSEvent) {
		Swift.print(event.keyCode)
	}

}
```

#~~ぼやき~~
なぜ`NSViewController`のサブクラスで実装するとダメなのか、わからないのですが、解決策を知っている方いましたら教えていただきたいです。

#追記：解決策
テキストボックスやテキストエリアではないところにフォーカスが当たっている状態でのキー入力をする際、そのフォーカスが当たっているオブジェクトで`acceptsFirstResponder`をtrueにしないとBeep音がなってしまうようです．
なので、Beep音を鳴らさないためには、フォーカスをコントロールするか、デフォルトでフォーカスが当たるオブジェクトで

```swift:
override var acceptsFirstResponder: Bool {
	return true
}
```

と記述しておけばいいようです。
Material Icon Font で必要なアイコンだけ読み込む

http://google.github.io/material-design-icons/#icon-font-for-the-web

```html
<link href="https://fonts.googleapis.com/icon?family=Material+Icons"
      rel="stylesheet">
```

この CSS の URL は [Google Fonts の text パラメータ](https://developers.google.com/fonts/docs/getting_started#optimizing_your_font_requests) に対応しているので、

```html
<link href="https://fonts.googleapis.com/icon?family=Material+Icons&text=face"
      rel="stylesheet">
```

こう書くと `<i class="material-icons">face</i>` だけに対応したフォントファイルが読み込まれる。
……が、このやり方だと、例えば下記のように書くと

```html
<link href="https://fonts.googleapis.com/icon?family=Material+Icons&text=block"
      rel="stylesheet">
```

block と lock 、 2 つのアイコンが読み込まれてしまい、ちょっと容量が増える。
しかもこれ、 `text=kcolb` とか書いても、 block と lock が有効になる。つまり、使うアイコンが増えてきて、ほぼ a-z 指定してる状況になると、全部のアイコン読み込んでるのと結局変わらん話になる。

そこで、コードポイントの方で指定することを考える。
face アイコンのコードポイントは `E87C` なので、 `encodeURI('\uE87C')` で UTF-8 エンコードした結果を text パラメータに渡してやる。

```html
<link href="https://fonts.googleapis.com/icon?family=Material+Icons&text=%EE%A1%BC"
      rel="stylesheet">
```

これで `<i class="material-icons">&#xE87C;</i>` (face アイコン) のみが有効になるのだが、こちらのやり方だとリガチャでの指定 (face という文字列での指定) はできない。

## まとめ

- 全部読み込んでも 50kB いかないので、 semantics のほうが大事よって人は全部読み込んだほうが楽
- 容量をちょっとでも減らしたいならコードポイントで指定して削ることができる
Emacs上でpep8に準拠しているか手動チェックする

まず，pep8用のPython環境を，例えば以下のように作る（pep8をグローバルインストールしている記事ばかり見かけるが，それが普通なのだろうか？）．

```bash
mkdir for_pep8
cd for_pep8
pyenv virtualenv 3.6.1 for_pep8
pyenv local for_pep8
pip install pep8
```

以下から`python-pep8`をダウンロードしてロードパスが通った場所に配置する．

- https://gist.github.com/ieure/302847

`init.el`に以下を追加

```elisp
(defcustom python-pep8-command "~/.pyenv/versions/for_pep8/bin/pep8"
  "PEP8 command."
  :type '(file)
  :group 'python-pep8)

(load "python-pep8")
(setq python-mode-hook
  (function (lambda ()
    (local-set-key "\C-c\ p" 'python-pep8))))
(setq auto-mode-alist (cons '("\\.py$" . python-mode) auto-mode-alist))
(setq interpreter-mode-alist (cons '("python" . python-mode)
                                   interpreter-mode-alist))
```

これで済むはずが，エラーが出ると思う．`python-pep8.el`の先頭に，

```elisp
(require 'compile)
```

をつけると直る．エラーについては，例えば以下に質問がある．

- https://stackoverflow.com/questions/15896998/pylint-and-pep8-not-work-with-emacs24-2

あとは適当なPythonファイルを開いて，`C-c p`すればチェックが走る．
もはやこのやり方は古いのかもしれない．
curl のような wget のようなウェブクライアントの代替としてのStreamRelay.jar

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar`
⇔
`StreamRelay.bat`

-LocalInputUrlFile/-RemoteInputUrlFile オプションを使う事で、入力源をネットワーク上の Webサーバにする事ができる

ver8.2から
-LocalOutputUrlFile/-RemoteOutputUrlFile オプションを使う事で、出力先をネットワーク上の Webサーバ(WebDAVサーバ)にする事ができる

---
### [Local|Remote][Input|Output]UrlFile オプション

ローカルと呼称されている側のストリームの入力源にしたい場合は、「-LocalInputURLFile [URL]」
リモートと呼称されている側のストリームの入力源にしたい場合は、「-RemoteInputFile [URL]」
を使えばよい。

出力先(WebDAVサーバ)として使いたい場合は、それぞれ「-LocalOutputFile [URL]」または「-RemoteOutputFile [URL]」を使えばよい

[URL] の書式は、

http[s]://user:pass@host:port/path?query#option&option...

という感じ

以下はoption
- header=name:value → HTTP ヘッダの名前と値を追加する
- post=[postedFile] → ボディとなるファイル(ボディが必要なら、既定のメソッドはGET→POSTになる)(Downloadのみ)
- ProxyHost=[host]
- ProxyPort=[port]
- ProxySocks → プロキシのタイプをSOCKSにしたい時は指定する
- ProxyHttp → プロキシのタイプをHttpProxyにしたい時は指定する
- UseSSL2 → SSLv2 を許可したい時
- UseSSL3 → SSLv2,3 を許可したい時
- UseTLS10 → SSLv2,3/TLS1.0 を許可したい時
- UseTLS11 → SSLv2,3/TLS1.0,1.1 を許可したい時
- UseTLS12 → SSLv2,3/TLS1.0,1.1,1.2 を許可したい時
- UseWeakAlgorithm → JDK7で禁止された弱い暗号を有効化する
- DisableTlsSni → JDK8で有効化されたTLS SNI を無効化する
- CheckCert → サーバの証明書を確認する(既定は確認しない)
- AutoRedirect → java.net.URLConnectionオブジェクトの(get|set)FollowRedirects()の値をTrueにする
- Method=[POST|GET|HEAD|OPTIONS|PUT|DELETE|TRACE] → HTTPメソッドを明示する(Download時の既定は「GET」、Upload時の既定は「PUT」)

---
### WebDAVサーバへのアップロード

ver8.2より出力にも対応した。
WebDAVサーバへは、Translateヘッダが必要なので、
こんな感じのオプションにすればいい。

- -RemoteOutputUrlFile http://www.example.com/index.html#header=Translate:f
- -LocalOutputUrlFile http://www.example.com/index.html#header=Translate:f

---
### file スキーム

usage に表示されていないけど、fileスキーム(-[Local|Remote][Input|Output]UrlFile オプション)も対応していたりする

fileスキームは、出力も可
-[Local|Remote]OutputUrlFile [URL]
な引数にも対応している

URL は
file:///ドライブ:/パス/ファイル名
な感じ。

ただ、絶対パスなるので、別途、-LocalOutputFile とか -RemoteOutputFile オプションに比べると、利点は特にない。

---
### webGetter.jar

もっと高機能なものは別途、作った。↓

[curl のような wget のような httping のようなウェブクライアント webGetter.jar](https://qiita.com/tomoki0sanaki/items/d4cc32059fac3bb9c12b)

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
Vimが勝手に「挿入(ビジュアルモード)」になるのを防ぐには(~/.vimrc)

- CentOS7&Ubuntu16以降のマウスカーソルからコピペしようとすると勝手に「挿入(ビジュアルモード)」になってコピペしにくい状態になったりする。その場合、~/.vimrcもしくは/etc/vimrcの設定を追記ないし、以下のパラメータを設定する

```
syntax on
colorscheme pablo
set mouse=
```

※カラースキーマ(colorscheme)は好みでどうぞ。
Strong ParametersでネストしたHashのvaluesだけを許可する方法

> `Hash` is deprecated and will be removed in Rails 5.1

[実コードはこちら](https://github.com/rails/rails/blob/1a2f1c48bdeda5df88e8031fe51943527ebc381e/actionpack/lib/action_controller/metal/strong_parameters.rb#L147)

を見てわかる通り、Rails5.1からHashがActionParametersのメソッドとして使えなくなったので、to_hしてね！っていう内容。

対応していく中でStrongParameters対応してない実装があったので、それについてのメモ。


```
{
  "name": "Foo Bar",
  "users": {
    "1": { 
      "name": "Jack",
      "email": "a@gmail.com"
    },
    "3": { 
      "name": "Mary",
      "email": "b@gmail.com"
    },
    "2": { 
      "name": "Jacob",
      "email": "c@gmail.com"
    },
  }
}
```

こういう特定のHashのvaluesだけを許可したい時ってなかなか思いつかなくて、
試行錯誤した結果が下記。
usersもrequireして書くって考えるとちょっと難しかったのでメモ。

```
params.require(:users).permit(
  params[:users].keys.map do |key|
    {
        "#{key}": ["name", "email"]
    }
  end
)
```

実行結果は下記みたいな感じでvaluesの指定したパラメータだけを許可することができる。

```
=> 
<ActionController::Parameters {
  "1"=><ActionController::Parameters {
    {
        "name"=>"Jack",
        "email"=>"a@gmail.com"
    } permitted: true>, 
  },
  "2"=><ActionController::Parameters {
    {
        "name"=>"Mary",
        "email"=>"b@gmail.com"
    } permitted: true>, 
  },
  "3"=><ActionController::Parameters {
    {
        "name"=>"Jacob",
        "email"=>"c@gmail.com"
    } permitted: true>, 
  },
permitted: true>
```
SSH(パスワード認証)の接続先で複数コマンド実行の自動化

# SSH(パスワード認証)の接続先で複数コマンド実行の自動化してみた
## 目的
リリース時に毎回手作業でおこなっていたためJenkinsのジョブに組み込みたかった

**1. sshpassのインストール**

- パスワード認証をコマンドで実行できるように`sshpass`をインストール
- 環境がUbuntuのため`apt install`でおこないました
 
```
$ sudo apt install sshpass
```

コマンドだけでSSH接続できるようになりました

```
$ sshpass -p [password] ssh -o StrictHostKeyChecking=no user@host
```

**2. コマンド実行**
対象のディレクトリへ移動してコマンドを実行するのみなので、`"command1 && command2"`でコマンドを囲ってつなげました

```
$ sshpass -p [password] ssh -o StrictHostKeyChecking=no user@host "cd /path/to/directory && command" 
```

実行できたので、Jenkinsのジョブに追記して組み込み完了
めでたしめでたし。

※パスワードの管理は気をつけてください。
dotfilesの管理/運用方法をまとめる


# 注意事項
現在ではこの運用方法ではなく、ansibleで管理しています。こちらも参照なさってください。
https://hiramekun.hatenablog.com/entry/2019/01/26/004229

# 目標
様々な設定ファイルをgithubで管理運用するのは、以下のような目標があります。  

 1. 他のpcに乗り換えた時に環境構築を簡単に行いたい
 1. 設定ファイルのバックアップを取っておきたい
 1. 他の人に自分の設定ファイルを共有したい

しかし、普通に管理しようとすると、github上に設定ファイル分のレポジトリを作成することになります。そこで、今回はdotfilesというレポジトリ一個で全ての設定ファイルを管理する方法をまとめておきます。

# dotfilesをレポジトリ管理
## 管理用ディレクトリ作成
ルートディレクトリに、管理したいファイルをまとめておくディレクトリを作成します。  

```console
$ mkdir dotfiles
```

そこに、管理したいファイルを全て入れます。私の場合は、zsh/bash/fish, vim, karabiner, bettertouchtool, ide用のideavimrcなどを管理しています。

```console
$ mv ~/.config/fish ~/dotfiles/fish
$ mv ~/.bashrc ~/dotfiles/.bashrc
$ mv ~/.zshrc ~/dotfiles/.zshrc
etc...
```

## シンボリックリンクを貼る
このままでは、本来ファイルがあるべき場所に設定ファイルがないので、mvしたファイルの設定が読み込まれないことになります。  
なので、シンボリックリンクを貼って、本来ファイルがあるべき場所にaliasを設定します。  

```console
$ ln -sf ~/dotfiles/fish ~/.config/fish
$ ln -sf ~/dotfiles/.bashrc ~/.bashrc
$ ln -sf ~/dotfiles/.zshrc ~/.zshrc
```

## githubにpush
こちらの記事などを参考にして、githubにdotfilesという名前のレポジトリを作成→commit→pushという流れでgithubに登録します。
https://qiita.com/ay3/items/8d758ebde41d256a32dc

自分のdotfilesはこちらにあります。
https://github.com/hiramekun/dotfiles
カプセル化、オブジェクト指向

<h1>そもそもカプセル化とは何か？</h1>

オブジェクト指向の特徴の１つに、カプセル化があります。カプセル化によって、利用者は、中身の詳しい作りを知らなくても、その振る舞いだけを知っていれば、クラスを利用することができます。

カプセル化によって、クラスの仕様と実装は、まったく別物となります。振る舞いの仕様を満たしていれば、中身をどのように実装しようとも自由です。そのため、時には仕様と実装が大きくかけ離れたクラスができることもあるそうです。

<h1>オブジェクト指向</h1>


オブジェクト指向は、ひとことでいうと「いかに効率よく開発を行うか」を突き詰めた考え方です。

大規模なシステムやアプリケーションの開発では、大量のプログラムを扱っていきます。

大量のプログラムを扱ううえでは、「わかりやすさ」が重要になってきます。

そのわかりやすさを実現しているのは、オブジェクト指向の名前にもなっている「オブジェクト ＝ モノ」という概念が重要です。

そしてこの「オブジェクト = モノ」という概念において、「モノ同士の関係性を作っていく考え方」も重要になってきます。

「モノ」と「モノ同士の関係性」を考え作っていくプロセスを「設計」と呼びます。

設計するときには、オブジェクト指向の3大要素と言われる「カプセル化」、「継承」、「ポリモーフィズム」という考え方が必要になってきます。

これから先は、「設計」、「カプセル化」、「継承」、「ポリモーフィズム」について説明していきます！

なおこちらの記事で、オブジェクト指向の概念を解説していますので、ざっくりつかむことができるでしょう。
オブジェクト指向メモ（初心者）

#オブジェクト指向とは
オブジェクトとはさまざまな値や処理などをひとまとめにしたものです。
いろいろあるパーツを組み合わせてプログラミングをより効率的にしていく・・・みたいな？
#クラスとインスタンスの関係
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249333/67b5e5dc-f128-411f-2caa-042c4b5a407c.png)
#キャスト（型変換）とは
キャストはあるタイプの値を別の値に変換することです。
例えば
``double m = 10;
int n = m;``
というのをデバックしようとするとこんなエラーがでました。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249333/a56bf172-eca9-2b43-08ac-00ea33ed800f.png)
これは代入しようとしているdoubleの値をintに入れられないために起こります。
そこで<strong>キャスト</strong>の登場です。
intに代入したいdoubleの値をこんな感じに書き直します。
```double m = 10.0;
int n = (int)m```
これで問題なく代入することができます。
このことをキャストの中でも特に<strong>明示的キャスト</strong>といいます。
当たり前ですが文字列で指定したものをキャストで数値タイプの型に代入することはできません。
これはコンピュータからしてみれば人間を犬にしてみろ（物理）って言ってるようなものですからね。
<strong>無理です</strong>
##暗黙のキャスト
キャストには二種類あって、さっきの明示的キャストと勝手にC#がキャストをしてくれる暗黙のキャストと呼ばれるものがあります。
暗黙のキャストはより幅広い範囲の値が扱えるタイプにキャストされるときに起こります。
授業学習　オブジェクト指向

#オブジェクト指向について勉強したことをメモします

#オブジェクト指向とは
アプリケーションで用いられる関連性の高いデータや処理をオブジェクトという単位に分けて、それぞれのオブジェクトの相互作用によってアプリケーション全体の振る舞い方を考えます。

#オブジェクト指向の3大要素

###1★カプセル化（隠ぺい）

###2★継承（インヘリタンス）

###3★多態性（ポリモーフィズム）

#カプセル化とは
オブジェクトの持つ任意のメンバーを隠ぺいすることです。
これによって、オブジェクトを利用する側は、オブジェクトの詳細な処理の内容を意識することなく、
そのオブジェクトのインターフェイスだけを利用することができるようになります。


#継承とは
既に存在するクラス（基本クラス）を継承して、新しいクラス（派生クラス）を作成
できる機能です。
これによって、派生クラスは基本クラスの持つ機能を継承することができます。


#多態性とは
オブジェクトを複数のデータ型として表現できる概念です。
多態性は、（多様性）や（ポリモーフィズム）と呼ばれることもあります。


#まとめ
それぞれ便利な機能があり、使いこなせると技術が上がると思うので扱えるようになりたいと思います。
オブジェクト指向の３大要素

授業でした内容を自分のメモとして書き残します。

---

2018/05/16（水）の授業内容

■ 学校に関するもの

・ 今授業で使用している教室PCの追加メモリが届かない
・ sambaサーバからのコピーが異常に遅い
・就活での公欠は2ページ分カウント宣言

---

#オブジェクト指向の３大要素
オブジェクト指向の３大要素とは、以下の３つである

1. カプセル化（隠ぺい）
2. 継承（インヘリタンス）
3. 多態性（ポリモーフィズム）

##1. カプセル化（隠ぺい）
⇒ オブジェクトの持つ任意のメンバーを隠ぺいすること

```c#:ex1
    class Years
    {
        private short _item;
        public short Item
        {
                (中略)
        }
        private short[] _items;
        public short[] Items
        {
                (中略)
        }

        private short[] CreateItems()
        {
                (中略)
        }
    }

```

〇 YearsインスタンスのメンバーにYearsクラス以外からアクセス
⇒ ItemプロパティとItemsプロパティのみアクセスできる
※ その他のメンバーは、Yearsクラス内からのみアクセスできる

**アクセス修飾子**
カプセル化を実現するためのキーワード
ex) public（公開）, private（非公開）...

■ 公開レベル
⇒ アクセス修飾子を必要に応じて使い分ける
※ いくつかを以下にあげる

+ **private**<br>
最小の公開レベル、自身のメンバーからのみアクセスできる
+ **protected**<br>
privateのアクセスに加え、この型を継承したクラスからアクセスできる
+ **public**<br>
最大の公開レベル、この型のメンバーはすべてに対し公開されている

##2. 継承（インヘリタンス）
⇒ 基本クラスを継承し、新しいクラス（派生クラス）を作成できる機能

〇 継承の規則
**単一継承**
派生クラスは複数の基本クラスを持つことができない

■ Objectクラス ？
.NET Frameworkのクラス階層の基本クラスであり、型階層のルートである

```c#
class Section : object
{
        ...クラスの実装
}
```

すべてのクラスは例外なく、Objectクラスを継承している


##3. 多態性（ポリモーフィズム）
⇒ 型変換という、オブジェクトのデータ型を変換する機能(?)

〇 型変換には、二つのものがある

1. 暗黙のうちに実行できるもの
⇒ 代入演算子を使用


2. 明示的に実行しなければならないもの
⇒ キャスト演算子かas演算子を使用し、変換した結果を代入

■ as演算子とキャスト演算子

**as演算子**

+ 参照型の変数のみ使用可能
+ 型変換に失敗するとNULLを返す

**キャスト演算子**

+ 値型、参照型どちらにも使用可能
+ 型変換に失敗すると例外エラーが発生する

**！！ 例外エラーは処理コストがかかるとともに、処理の流れに大きく影響する ！！**
⇒ 可能ならas演算子を使用する

■ ボックス化 ？
値型を参照型にすること
ボックス化 ⇔ **ボックス化解除**

```c#:ex
int i = 1;
Object o = i;
int j = (int)o;
```

※ 高速に処理をさせたい場合、使用を避けると良い

---

最後までお読みいただきありがとうございました。
sublime text3でpugのカラー表示が崩れたので直した

sublime textを3.1.1にアップデートしたら、pugファイルのカラーリングが以下のように崩れた。（以前は正常に表示されていた）

<img width="289" alt="スクリーンショット 2018-05-16 16.18.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/255971/a0c33027-90c2-872e-363d-9b5fa5dca3f6.png">

２行目の - varで崩れているので、以降の記述が全てjavascriptの認識になっているのだろう。


javascriptの記述行の末尾にセミコロンをつけたら直った。

<img width="417" alt="スクリーンショット 2018-05-16 16.24.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/255971/52483bfb-d3e6-5563-074a-425f99383a84.png">

詳しい理由わかる方がいらっしゃったら教えてください。
Ubunts設定

#本日やった事
今回授業でやった事はubuntuで一通りのコマンドと設定をした。
##開発環境
OS  : Microsoft Windows10 (64bit)
IDE : Ubuntu_16_04_LTS

ubuntuでコマンドを入力をするときはターミナルを起動させておき入力をします。
#設定していった内容と使ったコマンド
まず初めに下記のコマンドでパッケージのアップデートをする事

~$ sudo apt-get update

次に初期状態だとVimの動作がおかしいので、
下記コマンドを使って最新にしておきます。

~$ sudo apt-get -y install vim

次に下記コマンドでインストールを行い、SSH接続が出来るようになります。

~$ sudo apt-get -y install ssh

次に下記コマンドでApacheのインストールを行います。

~$ sudo apt-get -y install apache2

Apacheのインストールが終わると次にバージョンの確認を下記コマンドで行います。

~$ apache2 -v

今回最新だったバージョンが下記になります。

Server version: Apache/2.4.18 (Ubuntu)
Server built:   2016-07-14T12:32:26

次にバージョンの確認が終わるとapacheの再起動を下記コマンドで行います。

~$ sudo /etc/init.d/apache2 restart

apacheのインストールが終わると次にMySQLサーバーを下記コマンドでインストールを行います。
インストール中にrootパスワードの設定を求められるので、設定します。

~$ sudo apt-get -y install mysql-server

インストールが終わるとバージョンの確認を行います。
~$ mysqld -V

mysqld  Ver 5.7.13-0ubuntu0.16.04.2 for Linux on x86_64 ((Ubuntu))

MySQLにログイン
~$ mysql -u root -p
Enter password:     ← インストール中に設定したパスワードを入力

データベース作成
WordPressで使用するデータベース(今回は「wordpress」とするが任意で変更可)を作成する。
mysql> create database wordpress;

MySQLから切断
mysql> exit;

外部から接続させるための設定編集

~$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

下記をコメントアウトする

bind-address = 127.0.0.1
↓
bind-address = 127.0.0.1

MySQLの再起動

~$ sudo /etc/init.d/mysql restart
~$ sudo /etc/init.d/mysql start ←起動
~$ sudo /etc/init.d/mysql stop ←停止

次はSambaサーバーのインストールを行います。

~$ sudo apt-get -y install samba

次にSambaで共有するフォルダのパーミッションを変更
~$ sudo chmod 777 /var/www/html/

Sambaの設定を下記コマンドで行います。
~$ sudo vi /etc/samba/smb.conf

25行目付近の[global]の下に下記を追加する。
unix charset = UTF-8
dos charset = CP932

50行目付近：コメント解除しアクセス許可IP追記
interfaces = 127.0.0.0/8 192.168.0.0/24 192.168.11.0/24 192.168.23.0/24 eth0

57行目：コメント解除
bind interfaces only = yes

最終行に下記を追加する。
[html]
path = /var/www/html
writable = yes
browseable = yes
guest ok = yes
guest only = yes
create mode = 0777
directory mode = 0777

Sambaの再起動
~$ sudo service smbd restart

SambaをGUI画面から設定する場合は、下記コマンド
~$ sudo apt-get install system-config-samba
~$ sudo system-config-samba

SystemError: could not open configuration file `/etc/libuser.conf’: そのようなファイルやディレクトリはありません」と表示される場合は、下記をコマンドを実行する

~$ sudo touch /etc/libuser.conf
~$ sudo chmod 777 /etc/libuser.conf
~$ sudo system-config-samba

最後に行ったのがphpmyadminのインストールです。

ターミナル端末より下記コマンドを実行する
~$ sudo apt-get -y install phpmyadmin

※途中「phpMyAdminを動作させるために自動再設定を行うwebサーバを選んでください。」
と出るので、「apache2」にチェックして<了解>を選択する。
また、MySQLのパスワードを聞かれるので入力する。
「データベースサーバにphpmyadminが登録するパスワードを入力してください。」が出てくるのでこちらもパスワードの設定を行います。

インストールが終わると次にやる事がアクセス制御を下記コマンドを入力して行います。

~$ sudo vi /etc/phpmyadmin/apache.conf
8行目あたりにアクセス許可するIPに以下追記

Require ip 127.0.0.1 10.0.0.0/24 192.168.0.0/24 192.168.23.0/24

シンボリックリンクの作成

ApacheからphpMyAdminにアクセスできるように、設定ファイルのシンボリックリンクを作成します。

~$ sudo ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf-available/phpmyadmin.conf
~$ sudo a2enconf phpmyadmin

Apacheのリロード
~$ sudo service apache2 reload

Apacheの再起動
~$ sudo /etc/init.d/apache2 restart

phpMyAdminを使う
ブラウザより下記にアクセスする

http://(サーバーのホスト名またはIPアドレス)/phpmyadmin/

例) http://192.000.0.0/phpmyadmin/

#一部使ったコマンド
:q = セーブせず終了
:q! = 変更した行もセーブせずに終了
:w = セーブするが終了しない
:wq = セーブして終了

＃最後に
Ubuntuを使うのに全然慣れてなかったので戸惑う事もありましたが無事出来てよかったです。
EDN(Embarcadero Developer Network)アカウントのパスワードリセット手順

この記事は、Embarcadero の[サポートサイトに投稿した記事](http://support.embarcadero.com/article/44776)の転記です

Embarcadero 製品のライセンスの登録や、ダウンロード、コミュニティサイトの投稿を行なうためには EDN アカウントが必要です。
このアカウントのパスワードは、アカウントの登録の際に自身で設定するのですが、もしも設定したパスワードを忘れてしまった時は、次の手順でパスワードをリセットすることができます。

## リセット手順

1. https://www.embarcadero.com/jp/recover-password にアクセスします
2. アカウントの Emailアドレスを入力します
3. [Submit >] のボタンをクリックします
4. Change Password の画面に変わります。また、同時に入力した Emailアドレス宛に Embarcadero Website (info@embarcadero.com) より「Your Embarcadero password reset request」という件名のメールが届きます
5. 届いたメール内の The verification code is の後にあるコード（桁数が長いのでご注意ください）をコピーします
6. Change Password の画面で、Email アドレス、コピーしたコード(The verification code)、新しいパスワード、新しいパスワード（確認のため）を入力します
7. [Submit >] のボタンをクリックします
8. リセットが完了すると画面が切り替わります (空白の画面の可能性があります)

もし、手順 8 の箇所で「タイムアウト」となってしまった場合は、届いた Emailアドレス内に記載されている URL をクリックしてパスワードのリセットを行ないます。
（URL には  The verification code が含まれていますので、URLをクリックした際に表示される Change Password の画面には予め The verification code が入力されています）
pipを10に上げたら、うまく動かない


困った。

`csvkit`を入れようとしたら、

`pip`でインストールできない。

~~~
$ pip install csvkit --user

Traceback (most recent call last):
  File "/home/hogehoge/.pyenv/versions/2.7.14/bin/pip", line 7, in <module>
    from pip import main
ImportError: cannot import name main
~~~

pythonのバージョンは、

~~~
$ python -V
Python 2.7.14
~~~

`pip`は`--user`でユーザ側に入っている。

---

参考サイトはこちら

+ pip install --upgrade pip (10.0.0) 後の奇妙な挙動について
http://icchy.hatenablog.jp/entry/2018/04/17/064443

`pip`の前に、`python -m`をつければ良いらしい。

~~~
$ python -m pip install csvkit --user
~~~

一応動きそうです。

---

ついでに見つけたもの。

+ *pip-review*
	+ pipでいれたパッケージを一括アップデート

http://dragstar.hatenablog.com/entry/2016/09/02/113243

---

もう少しパッケージ管理が楽になると良いですな。

特に借りてるHPC環境などで。
C プログラミング

※自分のメモ用に書いています

環境:Windows10 VisualStudio2012

今回は前に作ったのに追加をしていく
まずはクラスを新しく追加する
ソリューションの上で右クリックして追加を選択してクラスを選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/7cbb5e2a-1a99-e396-0621-e9dd6cd513a1.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/a9312d26-2468-5e0c-1777-c65983b93f98.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/e1428867-b3ac-e18e-568b-b9ca6cc8be1a.png)
このクラスにはハッシュコードを取得するためのものと、
自身オブジェクトと指定オブジェクトが等しいかの判断と、
文字列を取得するのメソッドを作成。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/1d0f4343-bc6b-a08c-d7cc-9b6997b557b6.png)
その後に変数を宣言し、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/f8e02f65-ea6d-4d04-5e78-52f8f2fc74d5.png)
値の設定と取得プロパティと自動プロパティを追加。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/5808b45f-ef37-bfd4-6619-326ae61a6d6d.png)
2つの演算子(==と!==)のオーバーロードを追加
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/3231d2e3-98ed-cb65-01ce-c9a91686b252.png)
次に新しいクラスを追加して、
インスタンスを作成していく。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/e12c44cc-f059-c766-35cf-8eced33a43fd.png)
レコードを取得するメソッドとそのレコードを利用して配列を生成するメソッドを追加。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/26f980b3-ee43-91f0-ee1e-c33fedb2a145.png)
最後に仕上げとして変数とifによる判定を追加。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/ceea89e0-8b4a-748f-1e5f-27c9a6acca6b.png)
次にカプセル化のために新しいクラスを作成し、
必要なものを追加していく。
まず最低値を取得する変数と今の日付を取得する変数を用意して、
その二つを利用して件数を算出する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/b77f3d9e-1205-78d0-af70-11f7297baa8e.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/c4946766-039e-f3f0-2ea1-010fbeddc9e9.png)
最後にインターフェイスを作成するためにもう一度新しくクラスを作成する。
エラーインターフェイスを作るため継承をしておき、
プロパティごとのデータを保存する変数を用意し再設定されないようにreadonlyで修飾する。
エラーがあるかどうかの判定と情報を更新するメソッドも追加する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/9b2b315b-73bb-8366-1dfe-91474c241a3e.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/986ddc6f-4105-1ceb-fdc2-8cdb92b00591.png)