OmniAICreator/Qiita-1.07M huggingface dataset:
はじめてのC++【23日目】

#はじめに
今日はロベールとブラックジャックをやります。
##BlackJack【1日目】

ここはクラスで作ったほうがいいの？とかここは構造体使ったほうがいいの？とか関数作ったほうが便利じゃない？とか、考えてもよくわからなかったので、main関数だけで処理を作った。しかし、まだ完成していなく、自分がカードを引いて21になったら負けというだけの段階。
まだ、マークとかj~kはないのもとして扱っているのでマークとかも取り入れたい。

**コード**

```BlackJack.cpp
#include <iostream>
#include <array>
#include <vector>
#include <numeric>
#include <random>
int main(){
  constexpr char* hart = "♥";
  constexpr char* spade = "♠";
  constexpr char* clover = "♣";
  constexpr char* dia = "◆";
  char choose = 'd';//dで初期化
  int count = 0;//動的配列の要素数
  int card = 0;//自分で引いた数を格納する場所
  int sum = 0;//引いたカードの合計値を格納する
  std::vector<int> dealer = {0};//ディーラーの持ち札を入れる
  std::vector<int> myself = {0};//自分の持ち札を入れる
  std::uniform_int_distribution<int> dist(1,10);//i~10のランダム生成
  std::mt19937 mt{ std::random_device{}() };//ランダム作るときに必要

  std::cout << "BrackJackを始めます" << std::endl;

  while(1) {
  //myself[count] =

  card = dist(mt);//引いたカードの数を決定
  myself[count] = card;//動的配列の前から順番に引いたカードの値を代入
  sum += card;//引いたカードの数字を合計値に足す
  std::cout << "カードを一枚引きました。" << std::endl
            << "数字は" << card<< "です" <<std::endl
            << "合計値は" << sum <<"です" << std::endl;//std::accumulate(myself.begin(), myself.end(), 0)は使えなかった
  if(sum > 21){//合計値が21より大きくなると負け
    std::cout << "21より大きくなりました。あなたの負けです。" << std::endl;
    break;
  }
  else if(sum == 21)break;//合計値が21丁度になると強制的に終了
  std::cout << "引き続きカードを引きますか？(y/n)" << std::endl;//カードを引くかどうかの意思決定
  std::cin >> choose;//y/nをchoooseに代入させる
  if(choose == 'n') break;//もしnならカードを引くことを終了
  count++;//配列の要素数を1つ上げる。
  }

}
```
実行結果
<img width="486" alt="スクリーンショット 2019-03-21 22.32.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/298612/ca9a7eb8-99d4-210f-84e6-8bd7b84a1072.png">

**一日目を終えて**
今日やってみた感想。
実際に自分の書いたコードを見ることでクラスをどのように作ればいいか見えてきた。
カードを引く動作はディーラと自分で同じなので基底クラスにvirtualつけることでなんとかできそう。

動的配列で、格納した値を```std::accumulate(myself.begin(), myself.end(), 0)```で出力しようとしたが、出力結果がおかしくなったので、sumを使った。

クラスを作るって難しい。てか、使い所がいまいちわからない。関数でよくない？と思いがちになる。明日は、実際に関数とかクラスを作ってみようと思う。

##ロベールのC++
###07-06　純粋仮想関数
いままでStreamクラス（基底クラス）に仮想関数を使用するためだけに実装内容を書いてきた。しかし、これは無駄である。なので、純粋仮想関数を使うことで、このムダを省くことができる。

```Stream.h
#ifndef STREAM_H_
#define STREAM_H_

//0以上の値を順次取得していく処理行うための基底クラス
class Stream {
public:
  double Get() const;//設定された値を取得
  bool Set();
public:
  double m_n; //現在の値
protected:
  virtual void SetBase() = 0;//純粋仮想関数
};

#endif
```
```Stream.cpp
#include "Stream.h"
#include <iostream>
//設定された値を取得
double Stream::Get() const {
  return m_n;
}
//値を設定
bool Stream::Set() {
  SetBase();
  return m_n >= 0;
}
```
```Pure1.cpp
#include "InputStream.h"
#include <iostream>

int main(){
  InputStream istream;

  std::cout << "> " << std::flush;
  istream.Set();
  std::cout << istream.Get() << std::endl;
}
```
同じように実行された。

**基底クラスで実体がなくても派生クラスでオーバーライドしていればなにの問題もない。**
しかし、純粋仮想関数があるとそのクラスのオブジェクトは作れない!

```cpp
Stream stream;
```
こんなことができなくなるのか。
このようなクラスを「抽象クラス」という。
また、純粋仮想関数が一つでもオーバーライドされていなければ派生クラスも抽象クラスになる。
抽象クラスでは、「このクラス群はこんなかんじ」とクラスの抽象的な形を定義し、具体的な動作は定義しない。
そして、具体的な動作は、派生クラスで定義する。（has-a関係っぽい）

constやアクセス指定子、純粋仮想関数はコンパイル時にエラーを出してくれるので、積極的に使う。

#終わりに
明日は「継承とコンストラクタ」が３節あるので一気に終わらせる。
おやすみなさい。
Python 製のインフラテストツール Testinfra を使ってみる

Testinfra は Python 製のインフラテストツールです。サーバの構成やサービスの稼働状況などが正しいかテストするのに便利です。

デプロイ時や、定期的にテストを実行して健全性をチェックしたりなど、自動化、省力化の様々な局面で使えるかと思います。

この記事ではサクッと要点を紹介しようと思います。実のところ、公式ドキュメントが必要なことを分かりやすく簡潔に書いてくれているので、この記事を読まずにいきなり公式ドキュメントでもいいかとは思います。

[公式ドキュメントはこちら]
https://testinfra.readthedocs.io/en/latest/index.html


### インストール

testinfra パッケージをインストールします。ここでは、仮想環境を作ってその中にパッケージをインストールする手順を示します。

```
$ python -m venv testinfra
$ source testinfra/bin/activate
$ pip install testinfra
```

### 早速、使ってみる

公式ドキュメントのサンプルをそのまま動かしてみます。

https://testinfra.readthedocs.io/en/latest/

何をテストしているかは、コードから直感的に理解できるかと思います。

```python
def test_passwd_file(host):
    passwd = host.file("/etc/passwd")
    assert passwd.contains("root")
    assert passwd.user == "root"
    assert passwd.group == "root"
    assert passwd.mode == 0o644


def test_nginx_is_installed(host):
    nginx = host.package("nginx")
    assert nginx.is_installed
    assert nginx.version.startswith("1.2")


def test_nginx_running_and_enabled(host):
    nginx = host.service("nginx")
    assert nginx.is_running
    assert nginx.is_enabled
```

次のコマンドを実行します。戻り値は成功時に「0」、失敗時に「1」となります。

```python
$ py.test -v test_myinfra.py

...(略)
test_myinfra.py::test_passwd_file[local] PASSED          [ 33%]
test_myinfra.py::test_nginx_is_installed[local] FAILED   [ 66%]
test_myinfra.py::test_nginx_running_and_enabled[local] FAILED [100%]

...(略)

============== 2 failed, 1 passed in 0.14 seconds ==============

# 今回はテストに通らなかったので、戻り値が「1」になっています。
$ echo $?
1
```


### パラメータ化

複数のパッケージについてインストールされているか、バージョンは正しいかをテストしたい場合があると思います。そういう場合は、パラメータ化することで、パラメータ化した項目を一括でテストできます。

以下は、インストールされているパッケージ、サービスの設定と稼働状況、カーネルパラメータについて、それぞれパラメータ化してテストするコードになります。

```python
import pytest

@pytest.mark.parametrize("name, version", [
    ("python36", "3.6.6"),
    ("chrony", ""),
])

def test_packages(host, name, version):
    pkg = host.package(name)
    assert pkg.is_installed
    assert pkg.version.startswith(version)

@pytest.mark.parametrize("service", [
    ("chronyd"),
    ("crond"),
])

def test_services(host, service):
    assert host.service(service).is_running
    assert host.service(service).is_enabled

@pytest.mark.parametrize("param, value", [
    ("/proc/sys/vm/overcommit_memory", "0"),
    ("/proc/sys/vm/overcommit_ratio", "50"),
    ("/proc/sys/vm/dirty_ratio", "30")
])

def test_parameters(host, param, value):
    assert host.file(param).contains(value)
```

### リモートのホストに対する実行

paramiko パッケージが必要になります。

```python
$ pip install paramiko
```

--host オプションでホスト名を指定してください。

```python
$ py.test --host ホスト名 -v ./test_myinfra.py 
```

### 最後に

上述の通り、セットアップが簡単で覚えることも少なく利用できます。私は普段遣いの言語が Python ということもあり、仕事でも testinfra を利用させてもらって作業が楽になっています。便利なツールなので、こうして紹介させていただきました。
Ruby基礎 変数と定数

# Rubyの変数と定数に関して

* ローカル変数
* インスタンス変数
* クラス変数
* グローバル変数
* 定数

## ローカル変数

* スコープは、宣言した位置からその変数が宣言されたブロック・メソッド定義・クラス/モジュール定義の終わりまで
* 寿命は、上記のスコープ間
* **例外：ブロックが手続きオブジェクトされた場合は、そのオブジェクトが消滅するまで存在**
* **同じスコープを参照する手続きオブジェクト間ではローカル変数は共有**
* 識別方法は、小文字・_で始まる識別子

```ruby:ローカル変数
foobar
_foobar
```

## インスタンス変数

* 特定のオブジェクトに所属している変数
* 所属しているクラス・サブクラスのメソッドから参照が可能
* 初期化されていない場合nil
* 識別方法は、@で始まること

```ruby:インスタンス変数
@foobar
```

## クラス変数

* クラス定義の中で定義
* クラスの特異メソッド、インスタンスメソッドから参照・代入が可能
* 識別方法は、@@で始まること

```ruby:クラス変数
@@foobar
```
## グローバル変数

* プログラムのどこからでも参照が可能
* 宣言の必要なし
* 識別方法は、$で始まること

```ruby:グローバル変数
$foobar
```

## 定数

* メソッドの中では定義できない
* 一度定義(初期化)した定数に代入を行うとすると警告メッセージが表示される
* 定義されていない定数にアクセスすると例外**NameError**が発生
* クラス外で定義された定数はObjectに所属することになる
* 識別方法は大文字で始まること

```ruby:定数
FOOBAR
Foobar

# アクセス
class Foo
    FOOBAR = "FOOBAR"
end

> puts Foo::FOOBAR
# => FOOBAR
```

## クラス変数と定数の違い

クラス変数は
* 再代入可能
* クラス外からの参照は不可(継承されたクラスからの参照・代入は可能)

## クラス変数とインスタンス変数の違い

クラス変数は
* サブクラスからの参照・代入が可能
* インスタンスメソッドからの参照・代入が可能
nuxt上でvueを書く際の注意点

# nuxt上でvueを書く際の注意点

本来vueは

* new vueを宣言
* componentの名前をelで指定してその中で処理

するものだがnuxtはpageフォルダ以下のtemplateがcomponentなので宣言する必要はない

```pages/index.vue
<template>
 <div>
  <input v-model="message" placeholder="edit me">
  <p>Message is: {{ message }}</p>
 </div>
</template>
<script>
export default {
  data: () => ({
    message: ''
  })
}
</script>
```
カラー・ホイールのRGB値を調べた

## きっかけ
[ノンデザイナーズ・デザインブック第4版](https://www.amazon.co.jp/gp/product/B01LW1BC2L/ref=ppx_yo_dt_b_d_asin_title_o01?ie=UTF8&psc=1)
を読んでいたところ、
色と色の関係にカラーホイールというものが、
大いに絡んでくることが分かりました。

カラーホイールとは、
「<font color="#fdd902">***黄色***</font>」「<font color="#e4012e">***赤***</font>」「<font color="#006ab5">***青***</font>」を基準とした、
12色をサークル上に配置したものです。

あるとき仕事で、
簡単なWeb画面のデザインをすることになったのですが、
RGB値とその色が頭の中で紐づけられず、
色抽出ツールを使って抜き出した調べました。

## 注意
- このRGB値は私が私の為に私の環境で調べたものです
- 環境によって微調整は必要かと思います
- その為このRGB値はあくまで調査した際に得られた結果という位置づけです
- とはいえ私はすごく使うので、個人的には調べてよかったと思っています

## カラー・ホイールについて、かるく
図:ノンデザイナーズ・デザインブック第4版
素晴らしいカラー・ホイールより引用
![image.png](https://qiita-image-store.s3.amazonaws.com/0/380290/9bebe7e0-5fd1-31e8-94fc-2fcd85fe2fc4.png)

先ほどもすこし触れましたが、
基準となる隣通しを混ぜ合わせ、12色作られたものです。

向かい合わせの色が「補色」の関係で片方をメインにできます。
<font color="#006ab5">■</font><font color="#f19601">■</font> Blue,orange
<font color="#e4012e">■</font><font color="#00a93c">■</font> Red,green
<font color="#00a93c">■</font><font color="#a50082">■</font> Lime-green,violet
etc..

黄、赤、青の組み合わせを「プライマリー・トライアド」と言います。
この関係を崩さずに回転した組み合わせの色はうまく調和します。
<font color="#fdd902">■</font><font color="#e4012e">■</font><font color="#006ab5">■</font>プライマリー(Yellow,red,blue)
<font color="#abcd06">■</font><font color="#ec6c01">■</font><font color="#034fa4">■</font>その他(Lime-green,red-orange,bluish-purple)
<font color="#f19601">■</font><font color="#00a93c">■</font><font color="#561b85">■</font>その他(Orange,green,purple)
<font color="#f9be01">■</font><font color="#a50082">■</font><font color="#00a3ad">■</font>その他(Yello-orange,violet,aqua)
etc..

これはあくまで基準となる12色「ヒュー」というもので、
黒を加えていくと「シェード」、
白を加えていくと「チント」と呼ばれるグラデーションになります。

## カラー・ホイールのRGB値

番号はサークルに時計の数字を振ってます。(12,1,2..10,11)
種別は下記です。
　P：原色(Primary color)
　S：2次色(Secondary color)-原色の合色
　T：3次色(Tretiary color)-2次色と原色の合色

| |色 |R|G|B|hex|種別|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|①|<font color="#f9be01">■</font>|249|190|1|#f9be01|T|
|②|<font color="#f19601">■</font>|241|150|1|#f19601|**`S`**|
|③|<font color="#ec6c01">■</font>|236|108|1|#ec6c01|T|
|④|<font color="#e4012e">■</font>|228|1|46|#e4012e|**P**|
|⑤|<font color="#a50082">■</font>|165|0|130|#a50082|T|
|⑥|<font color="#561b85">■</font>|86|27|133|#561b85|**`S`**|
|⑦|<font color="#034fa4">■</font>|3|79|164|#034fa4|T|
|⑧|<font color="#006ab5">■</font>|0|106|181|#006ab5|**P**|
|⑨|<font color="#00a3ad">■</font>|0|163|173|#00a3ad|T|
|⑩|<font color="#00a93c">■</font>|0|169|60|#00a93c|**`S`**|
|⑪|<font color="#abcd06">■</font>|171|205|6|#abcd06|T|
|⑫|<font color="#fdd902">■</font>|253|217|2|#fdd902|**P**|

## 使用ツール
Adbe XD

## 参考資料
[ノンデザイナーズ・デザインブック第4版](https://www.amazon.co.jp/gp/product/B01LW1BC2L/ref=ppx_yo_dt_b_d_asin_title_o01?ie=UTF8&psc=1)
Macでシンボリックリンクを作る

シンボリックリンクの作成方法を調べたので、メモしました。


##設定のゴール
・シンボリックリンクを作る


##使用するツール
・ターミナル


##手順
1. ターミナルを起動する
2. コマンドを入力をする


##入力するコマンド
ターミナルに下記のコマンドを入力します。

```terminal
ln -s 「シンボリックリンク元のパス」 「シンボリックリンクを作成する場所のパス」
```


###シンボリックリンクを削除する時
シンボリックリンクを削除したい時は、フォルダをゴミ箱に移すのではなく、
下記のコマンドを入力するようにしましょう。

```terminal
unlink 「シンボリックリンクのパス」
```
>シンボリックリンクは、リンク自体は削除しても元ファイルは消えませんが、シンボリックリンクの中にあるファイルを削除すると、元ファイルも削除されてしまうので注意が必要です。



##アプリを使って作成する
今回はターミナルを使ってシンボリックリンクを作成しましたが、
アプリを使って作成することもできるそうです。
使い方などの説明は省きますが、ターミナル操作が不安な方には良さそうです。

▼シンボリックリンク作成アプリ（Mac）
[SymbolicLinker](https://github.com/nickzman/symboliclinker/releases)
[SymbolicLinkerの使い方](http://macwin.org/mac/symboliclinker/)

▼シンボリックリンク作成アプリ（Windows）
[Link Shell Extension](http://schinagl.priv.at/nt/hardlinkshellext/hardlinkshellext.html#download)
[Link Shell Extensionの使い方](https://fmoga.com/link-shell-extension)



最後までお読みいただき、ありがとうございました。
gin gormでデータベース接続

[前回](https://qiita.com/ogurasousui/items/f672ac867fd7d6f3c2ea)とりあえずginが動く環境を作成したが、今回も雑にデータベース接続してテーブルを作成してみる

## 準備

1.docker-compose.yml

```docker-compose.yml
services:
  app:
    container_name: gin_app
    image: golang:1.12.0-alpine
    volumes:
      - .:/go/src/app
    command: >
      sh -c "cd /go/src/app &&
      apk update &&
      apk add --no-cache git &&
      go get -u github.com/codegangsta/gin &&
      go get -u github.com/golang/dep/cmd/dep &&
      dep init ||
      dep ensure &&
      gin -i run"
    ports:
      - 3001:3001
    links:
      - db
  db:
    container_name: gin_db
    image: mysql:8.0.15
    volumes:
      - ./tmp/mysql:/var/lib/mysql
    environment:
      MYSQL_DATABASE: gin_app
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
    command: mysqld
```

DBコンテナの追加とアプリケーションコンテナへのリンクの追加
`environment` の追加はお好みで

2.main.go

```main.go
package main

import (
	"github.com/gin-gonic/gin"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

type Product struct {
	gorm.Model
	Code  string
	Price uint
}

func main() {
	db, err := gorm.Open("mysql", "root:@tcp(db:3306)/gin_app?charset=utf8&parseTime=True&loc=Local")
	if err != nil {
		panic("failed to connect database")
	}
	defer db.Close()

	db.AutoMigrate(&Product{})

	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run()
}
```

前回の `main.go` に追記。DB接続してテーブル作成するだけ
`gorm` まわりの記述は公式のサンプルそのまま

## 起動

```
$ docker-compose up
```

## 確認

```
$ docker exec -it gin_db mysql -u root -e "use gin_app; show tables;"
+-------------------+
| Tables_in_gin_app |
+-------------------+
| products          |
+-------------------+
```

おわり
jarファイルとは

java初学者です。
今回はjarファイルの概要を書きます。

#Q1: jarファイルとは？
jarファイルは複数のjavaのクラスやパッケージを１つのファイルにまとめた便利グッズです。
#Q2: jarファイルの中身はどうなってんの？
上記で書いた通りクラスやパッケージを１つのファイルにまとめているので中身は開発で使える便利な機能が入っています。
基本的にjarファイルは自分で作るそうです。
だから、中身は自分が必要だと思う機能を詰めることになると思います。
**[jarファイル作り方](https://www.sejuku.net/blog/64490)**
#Q3: jarファイルはどこに配置するの？
基本的にjavaのプロジェクト作成時に自動生成される,
[WebContent/WEB-INF/**lib**]の中に作ると思います。
#jarファイルに関するオススメ記事
**[オススメ記事](https://qiita.com/hiwm0126/items/1b3c008c21463d78337a)**

間違っているがありましたらコメントから教えていただけると幸いです。
内容は随時更新していきたいと思います。
和暦年が1桁で来ることを想定していないバグ

# TL;DR
改元対応は、新元号だけじゃなくて、和暦が1桁で来ることへの対応も必要・・・かもしれない

# 要約
- 改元時に顕現するバグがあった
- 和暦年が1桁で来たら発現するバグだった

#本文

## バグの下地

### 「全銀フォーマット」の日付項目の仕様
- 年月日をYYMMDDの6桁の「数値」と定義している。「6桁の数値」である。
- 年は和暦年である。
- 元号を識別する情報はない。

## バグの内容
- 年月日を、6桁の「文字列」として扱い、年は1～2桁、月は3～4桁、日は5～6桁、として取得している。例：「010502]は、年=01、月＝05、日＝02、となる。
- 実はその前に、「数値型」に対する処理として先頭のゼロがtrimされていた。
- 和暦年が1桁だと、6桁であるはずの文字列が5桁で入ってきてしまい、おかしなことになる。例：「010502」は、先頭のゼロがtrimされて「10502」となり、年＝10、月＝50、日＝2、となる。

## テストしたら検出されるはずだけどね
適切なテストをしてれば摘出されているはずです。でもゴミコーダーがやっつけ実装したなら・・・？前任者がゴミコーダーだったなら・・・？
私は・・・前任者がゴミコーダーだったようです・・・

# 補足的なもの

## 全銀フォーマットはXML版が登場していて、そっちは和暦が廃止されている
諸悪の根源である、数値6桁での和暦年月日は、旧フォーマットに成り下がっている。
これから作るシステムは、XML版を採用すべき。
https://www.zenginkyo.or.jp/abstract/efforts/smooth/xml/
Tailsはシャットダウン時にRAMを消去する

プライバシーとセキュリティに配慮したLinuxディストリビューションに、Tailsがあります。
Tailsは、[コールドブート攻撃](https://en.wikipedia.org/wiki/Cold_boot_attack)に対応するために、シャットダウン時にDRAM（メインメモリ）の内容を消去する機構が存在します。

# コールドブート攻撃とは

通常、Linuxで暗号化されたディスクを使用する場合、鍵ファイルやパスフレーズが必要となります。
この情報は、一旦入力されるとディスクの読み書きのため、終了時までメモリに保管されることになります。

コールドブート攻撃は上記のようなメモリ上にある機密情報を盗む攻撃です。
メインメモリに使われているDRAMは、電力の供給が切れると、しばらくした後（数十秒から数分）データを失います。

しかし、液体窒素などで急激に冷却することで、内容を保管したままにすることができます。

その状態で、別のマシンのメモリスロットに差し込まれメモリダンプをすることで、メモリ内容を取り出せしまいます。

# Tailsが利用する対処法

冒頭で示したとおり、Tailsは、この攻撃に対処するため、シャットダウン時にメモリの内容をすべて消去する機構が存在します。

この記事ではその機構がどう動作しているかを追っていきます。

# 仕組み

## 1. /run/initramfsの生成

まず、systemdのフックによって、起動時に以下のsystemd serviceが呼び出されます。

https://git-tails.immerda.ch/tails/plain/config/chroot_local-includes/lib/systemd/system/initramfs-shutdown.service

```ini:/lib/systemd/system/initramfs-shutdown.service
[Unit]
Description=Prepare /run/initramfs for shutdown
Documentation=https://tails.boum.org/contribute/design/memory_erasure/
ConditionPathExists=!/run/initramfs/bin/sh

[Service]
RemainAfterExit=yes
Type=oneshot
ExecStart=/usr/local/lib/initramfs-restore

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

このサービスは、`/usr/local/lib/initramfs-restore`を実行します。
その内容は以下のとおりです。

https://git-tails.immerda.ch/tails/plain/config/chroot_local-includes/usr/local/lib/initramfs-restore

```sh:/usr/local/lib/initramfs-restore
#!/bin/sh

set -e
set -u

WORKDIR=$(/bin/mktemp -d)

/usr/bin/unmkinitramfs \
    "$(/usr/local/bin/tails-get-bootinfo initrd)" \
    "$WORKDIR"

# We should not need any kernel modules in there at shutdown time,
# and they take 66% of the entire uncompressed initramfs size, so
# let's save some RAM.
/bin/rm -rf "$WORKDIR"/main/lib/modules

/bin/mv "$WORKDIR"/main/* /run/initramfs/

/bin/rm -rf "$WORKDIR"
```

`unmkinitramfs`で現在使用しているinitramfsの中身をtmpに展開し、カーネルモジュールを削除、その後中身を`/run/initramfs`に移動しています。

## 2. 通常シャットダウンの場合

正常にシャットダウンされる場合、Linuxカーネルのメモリ解放が実行されます。
Tailsのカーネルはオプションが追加しており、メモリを解法する際にメモリにゼロを書き込むようになっています(`slub_debug=P`)

## 2'. 異常シャットダウンの場合

正規の手段でシャットダウンされた場合はもちろんですが、OSが入ったディスクやメディアが抜かれた際も、udevで検知してシャットダウンに移行します。

シャットダウンが検知されると、メモリ消去の準備をします。

まず、シャットダウン時にメディア、つまりブートパーティションが消えている可能性があります。そのため、memlockdがファイルをページングに保管し開放されないようにすることで、メモリ消去に必要なバイナリ/ツールを確保します。

その後、通常シャットダウンが実行されます。

参考: https://tails.boum.org/contribute/design/memory_erasure/
Viterbi アルゴリズム（オンライン版）

こんにちは
「[Viterbi アルゴリズム（最適経路解法）](https://qiita.com/kkdd/items/6cbd949d03bc56e33e8e)」（オフライン版）を少し修正し、1ステップ毎（観測値が入力される毎）にオンライン的に最適経路解 ```path``` を求めました[^1]。

逐次的に（枝刈りが行われ）、解の確定部の長さも次第に伸びていきます。前提などの説明は[元記事](https://qiita.com/kkdd/items/6cbd949d03bc56e33e8e)の方にあります（今回実行例の状態数系列も同じく ```1 2 4 4 2 1``` を与えています）。

[^1]: Rastislav Srámek, [The On-line Viterbi algorithm](http://www.dcs.fmph.uniba.sk/diplomovky/obhajene/getfile.php/main.pdf?id=143&fid=289&type=application%2Fpdf) (2007) にも、同様のオンライン版 Viterbi アルゴリズムが議論されていました。

```console
$ ./viterbi.py 1 2 4 4 2 1
0. transition: [0]
 path = [0]
1. transition: [0, 0]
 path = [0]
2. transition: [1, 1, 1, 1]
 path = [0, 1]
3. transition: [1, 1, 2, 1]
 path = [0, 1]
4. transition: [0, 3]
 path = [0, 1, 1]
5. transition: [1]
 path = [0, 1, 1, 3, 1, 0]
```


```viterbi.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
import random

nstates = [int(n) for n in sys.argv[1::]]
COST, STATE = range(2)
INITIAL = (0, 0)  # (cost, state)

def transition(m, n):
    return [[random.random() for _ in range(m)] for _ in range(n)]

def emission(n):
    return [random.random() for _ in range(n)]

def update(cost, trans, emiss):
    costs = [c[COST]+t for c, t in zip(cost, trans)]
    min_cost = min(costs)
    return min_cost + emiss, costs.index(min_cost)

def single_element(states):
    return list(states) if len(states) == 1 else []

def decodePath(trellis, lastState=None):
    if lastState is not None:
        states = set([lastState])
    else:
        if trellis == []:
            return []
        states = set(range(len(trellis[-1])))
    path_reversed = single_element(states)
    for rtr in reversed(trellis):
        states = {rtr[i][STATE] for i in states}
        path_reversed += single_element(states)
    return list(reversed(path_reversed))

### main ###
n_prev = 1
path = []
trellis = []
cost = [INITIAL]
for i, n in enumerate(nstates):
    e = emission(n)
    m = transition(n_prev, n)
    n_prev = n
    cost = [update(cost, t, f) for t, f in zip(m, e)]
    trellis.append(cost)
    path += decodePath(trellis[len(path)::])
    print(f'{i}. transition:', [c[STATE] for c in cost])
    print(f' path = {path[1:]}')

if nstates[-1] > 1:
    cost_last = [w[COST] for w in trellis[-1]]
    print("last costs =", [round(c,2) for c in cost_last])
    state_last = cost_last.index(min(cost_last))
    path += decodePath(trellis[len(path)::], state_last)
    print("minimum_cost_path:")
    print(f' path = {path[1:]}')

exit(0)
```
[WIP]Electronつかってみた

いまさらElectronつかってみた。

# quick-start

[公式サイト](https://electronjs.org/)に従って、quick-startする。

```bash
git clone https://github.com/electron/electron-quick-start
cd electron-quick-start
npm install && npm start
```

画面が表示された。

![quick-start](https://qiita-image-store.s3.amazonaws.com/0/114392/a170d2d0-44bc-ea76-d4cc-cbbc4f9a5ad7.png)

# アーキテクチャ

Electronアプリケーションは2種類のプロセスで構成される。

|                            | メインプロセス | レンダラープロセス |
| -------------------------- | -------------- | ------------------ |
| 同時プロセス数             | 1個            | n個                |
| 呼び出し元                 | Electron       | メインプロセス     |
| ネイティブリソースアクセス | できる         | できない           |

# パッケージング

以下の3種類のツールがある。

- electron-packager
    - platform別の実行ファイルを生成できる。electron-forgeに移行する予定のようだ。
- electron-builder
    - インストーラを生成できる。
- electron-forge
    - packagerとbuilderの両方の機能があるが、まだ開発中らしい。

## electron-packager

```bash
npx electron-packager . --platform=win32 --arch=x64 --ignore=\".git(ignore)\" --overwrite --icon=icon.icns
```

# テスティング

## spectron

```javascript:test/spec.js
const Application = require('spectron').Application
const assert = require('assert')
const electronPath = require('electron')
const path = require('path')

describe('Application launch', function() {
  this.timeout(10000)

  beforeEach(function() {
    this.app = new Application({
      path: electronPath,
      args: [path.join(__dirname, '..')]
    })
    return this.app.start()
  })

  afterEach(function() {
    if (this.app && this.app.isRunning()) {
      return this.app.stop()
    }
  })

  it('shows an initial window', function() {
    return this.app.client.getWindowCount().then(function(count) {
      assert.equal(count, 1)
    })
  })
})
```

```javascript:package.json
{
...
  "main": "main.js",
  "scripts": {
    "test": "mocha"
  },
  "devDependencies": {
...
    "mocha": "^6.0.2",
    "spectron": "^5.0.0"
...
  }
...
}
```
[Android] [Espresso] Viewの表示チェック、Buttonクリック

忘れそうなのでメモしておきます。

#Textの表示をチェック
```java:Test.java
//Textの内容をチェックしたい場合
onView(withText(CHECK_TEXT)).check(matches(isDisplayed()));
//viewの存在をチェックしたい場合
onView(allOf(withId(viewId), isDisplayed())).check(matches(isDisplayed()));
```

#選択したSpinnerのTextをチェック
```java:Test.java
onView(withId(spinnerId)).perform(click());
onData(allOf(is(instanceOf(String.class)), is(selectionText))).perform(click());
onView(withId(spinnerId)).check(matches(withSpinnerText(containsString(selectionText))));
```

#Buttonをクリック
```java:Test.java
onView(withId(buttonId)).perform(click());
```

#ListView要素の表示チェック
```java:Test.java
onData(anything())
                .inAdapterView(withId(R.id.listView1))
                .atPosition(INDEX)
                .onChildView(withText(CHECK_TEXT))
                .check(matches(isDisplayed()))
                .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
                .perform(click());
```
flexbox part1

#flexboxとは
flexible box layout module の略です。名前通りフレキシブルで。これがかなり便利。
##flex-direction
・row(デフォルト）：横並び。左から。
・row-reverse：その逆。右から。
・column：縦並び。上から
・column-reverse：その逆。下から。
###html
![html_flex_direction_row.png](https://qiita-image-store.s3.amazonaws.com/0/380575/f2ccba03-9f33-935e-24b1-a8b259f80f1f.png)
###css
![css_flex_direction_row.png](https://qiita-image-store.s3.amazonaws.com/0/380575/a16920ed-5349-0ddc-d915-ba01dff87469.png)
###結果
![result_flex_direction_row.png](https://qiita-image-store.s3.amazonaws.com/0/380575/c8df08f7-db2e-d452-5e16-246c4b262934.png)
##flex-wrap
・no-wrap：初期値。
・wrap：枠を超えたら、折りたたむ。
・wrap-reverse：右下から始まる。
###html
![html_flex_wrap.png](https://qiita-image-store.s3.amazonaws.com/0/380575/0d288d83-e8ee-0993-bcff-9fae7e44e3ff.png)

###css
![css_flex_wrap.png](https://qiita-image-store.s3.amazonaws.com/0/380575/a5cc1454-c87f-8257-3de1-e5bd9463ec80.png)

###結果
![result_flex_wrap.png](https://qiita-image-store.s3.amazonaws.com/0/380575/8c9de387-5702-563a-5fce-ada044c2fa9c.png)
今回は、wrap-reverseを使ってみました。
import文を書く意味

Java初学者です。
今回はimport〜を書く意味についてアウトプットさせていただきます。

#Q: importとは?
和訳すると「持ち込む」,「輸入する」など。
外から何かを持ってくるみたいなニュアンス。

実際にjavaでも、パッケージの中のクラスや[インターフェース](https://www.internetacademy.jp/it/programming/java/difference-between-interface-and-abstract.html)を作業中のファイルで利用したい時に使います。
#import文の書き方
簡単です。(下記の写真は例です)
![2019-03-21 22.28のイメージ.jpg](https://qiita-image-store.s3.amazonaws.com/0/305584/91c14182-9e51-ab71-d6b7-f0dc3bbd4c8d.jpeg)
#最後に
プログラミングの基本原則として「1つのクラスは1つの役割を担う」というのがあるそうです。
ということは、開発を進めていく上で多くのクラスができると思います。
import文はかなり使うと思います。必要なところで書き忘れるともちろんエラーがおきますので忘れずに、書い間違えないようにしましょう。

内容としては薄いですがご容赦ください。
また、何か間違っている点やjavaに関する知識などはご教授いただきたいのでぜひコメント欄からよろしくお願いします。
electron-quick-start が始まらない

# electron-quick-start の npm install が '... and 1 more' で止まる

electron-quick-start を[公式doc](https://github.com/electron/electron-quick-start)に従って始めようとしたら、`npm install` が `... and 1 more` から動かなくなった

## 解決策

管理者権限で（powershell を開き） `npm install` を実行

## 環境

* windows10
* node version 10.15.2
* npm version 6.4.1
* vscode version 1.32.3

## 事象

[公式doc](https://github.com/electron/electron-quick-start#to-use)に従ってコマンドを叩いたら以下の状態から動かなくなった。

```powershell
# Clone this repository
git clone https://github.com/electron/electron-quick-start
~~
# Go into the repository
cd electron-quick-start
# Install dependencies
npm install

> electron@4.0.7 postinstall E:\workspace\VSCode\electron-quick-start\node_modules\electron
> node install.js


... and 1 more
```

`--verbose` を使ってみたが

```powershell
npm install --verbose
~~
npm info lifecycle extract-zip@1.6.7~postinstall: extract-zip@1.6.7
npm info lifecycle electron@4.0.7~postinstall: electron@4.0.7

> electron@4.0.7 postinstall E:\workspace\VSCode\electron-quick-start\node_modules\electron
> node install.js


... and 1 more
```

## 参考

https://github.com/electron/electron-quick-start/issues/127
mbedのオンラインコンパイラで作成したバイナリが動作しない（Nucreo F303K8 ）

以前は問題なく動いていた、Nucreo F303K8のサーボモータ制御プログラムが動かなくなった。

プログラム（main.cpp）は変えていない。

以前コンパイルした動くバイナリと今コンパイルした動かないバイナリを確認するとそれぞれ２４k、２８kと大きさが異なっていた。

revisionボタンを押し、mbed libraryのバージョンを確認すると、anna bridgeさんというユーザーが更新した165であった。

少しづつバージョンを古いものにしてコンパイルしていった（バージョンを選択して切り替えボタンを押して変更）

だんだん作成されるバイナリの大きさが小さくなって行ったが動作しなかった。

バージョン１５７で２４kになり、macのcmpコマンドで比較すると以前コンパイルしたものと同じ内容のバイナリができ、動作した。

バージョン１５７を登録したユーザーはmbed official。やはり安定して動作するのであろうか。ただ、２０１７年１２月とちょっと古いが。

同じような現象で悩んでいる方は、mbed libraryのバージョンを戻してみると良いかもしれません。
RPA実践　各スキル攻略

基本処理
☑ 処理の繰返し
　　「繰り返し（各行）」内で繰返したいアクティビティを設定
□ 条件分岐
☑ ポップアップ表示（静的）
　　「メッセージボックス」に固定値を設定
☑ ファイルのコピー
　　「ファイルをコピー」でコピー元/コピー先のフルパス指定（ファイルリネーム可）
☑ アプリケーションを閉じる
　　「アプリケーションを閉じる」で対象アプリを指定

応用処理
☑ データソート
　　「データテーブルを並べ替え」でソート対象列と昇順/降順を指定
☑ データフィルタ
　　「データテーブルをフィルタリング」でフィルタウィザード内で各種設定
□ データ比較
☑ 現在日時取得
　　VB関数：Now.ToString(“yyyyMMdd hh:mm :ss”)
□ ポップアップ表示（動的）

データ取得
☑ csvデータ取得
　　「csvを読み込む」でcsvのパス指定
☑ Excelデータ取得
　　「アプリケーションスコープ」内で「範囲を読み込み」
□ txtデータ取得
☑ Webデータ取得
　　値：「アンカーベース」内で「要素を探す」（項目）と「テキストを取得」
□ PDFデータ取得
□ Accessデータ取得

データ操作・書出し
☑ Excelに書出し
　　行追加：「アプリケーションスコープ」内で「範囲を追加」
　　値入力：「アプリケーションスコープ」内で「セルに書き込み」
□ PowerPointに書出し

Web操作
□ ログイン操作
☑ Web画面入力
　　テキストボックス：「テキストを設定」で、Row(n).toString
　　リスト：「項目を選択」で、Row(n).toString
　　ボタン：「クリック」
☑ Web検索処理
　　同上
□ 検索処理（検査）

メール操作
☑ メール送信（静的）
　　「Outlookメールメッセージを送信」で各種設定
□ メール送信（動的）
☑ メール送信（画像挿入）
　　「スクリーンショットを撮る」「画像を保存」し、「~送信」で添付
MySQL超入門【ファイルダウンロード編】

#はじめに
今回SQLが全く分からない私が、ある程度困らなくなるまでを書いていきます。
注）まだ勉強中なのでゆったりとしたペースで行きたいと思います。

##SQL導入方法
今回は私のPCがWINDOWS端末のためWINDOWSのみの方法となります。

■用意するもの
（必須ではなく、個人的に使いやすいものも含む）

・MySQL
ダウンロードは<a href="https://dev.mysql.com/downloads/installer/"　target="_blank">こちら</a>
WINDOWSの32bit版か64bit版を各自選択してください。

・A5M2
ダウンロードは<a href="https://www.vector.co.jp/soft/dl/winnt/business/se422726.html"　target="_blank">こちら</a>
SQLのエディター兼データベースを見やすく表示してくれるツール。
MAC用は正攻法での導入は難しいみたいです。

######インストール方法は別途記載します。
######次回に続く。
ABC083 C - Not so Diverse(300点)

#問題
[問題へのリンク](https://atcoder.jp/contests/abc081/tasks/arc086_a)
整数$A_i$が書かれたボールが$N$個ある。
$N$個のボールに書かれている整数が$K$種類以下になるように書き換える時、必要な処理回数の最小値を求めよ。

#制約条件
- $1 \leqq K \leqq N \leqq 200000$
- $1 \leqq A_i \leqq N$
- 与えられる数値はすべて整数

#考えたこと
最小限の処理回数で$K$種類以下になるようにしたいので、同じ数でくくった時に個数が少ない数から消していく必要がある。(例えば$1,1,2,2,5$のときは$5$)
よってこの問題では書かれている数字が何かはどうでもよく、その数字が数列$A$の中にいくつ含まれているかが重要になる。

なので要素数$N$の配列を作り、各数字($1$~$N$)の個数を配列にいれていく。
配列を昇順にsortして、先頭から$K-1$番目までの値の和をとれば答えになる。

この時計算量は$O(N)$なので問題なくACできる。

#解答

```.cs
using System;
using System.Linq;

class Program
{
    static void Main(string[] args) {
        int[] s = Console.ReadLine().Split().Select(int.Parse).ToArray();
        int[] a = Console.ReadLine().Split().Select(int.Parse).ToArray();
        Console.WriteLine(solve(s[0], s[1], a));
    }
    static int solve(int n, int k, int[] a) {
        int[] list = new int[n];
        for (int i = 0; i < n; i ++) list[a[i]-1] ++;
        Array.Sort(list);
        return list.Where((x,y) => y < n-k).Sum();
    }
}
```

#ミスったこと
基本の方針はわりとすぐに立てることができたが、実装で謎の迷走をかました。

はじめ以下のように実装しようとしてTLEした。
0ではないかつ、最小の値のインデックスをとる。
値の和をとっていく。
そのインデックスの値を0にする。
次の値へ。
0ではない数が$K$個になったら処理をやめる。

これだとCount()が要素全体をたどるため、$0(N^2)$になってしまうのでTLEする。


```.cs
static int solve(int n, int k, int[] a) {
        int[] list = new int[n];
        for (int i = 0; i < n; i ++) list[a[i]-1] ++;
        Array.Sort(list);
        int count = 0;
        int min = list.Where(x => x != 0).Min();
        int index = Array.IndexOf(list, min);
        while(true) {
            if (list.Count(x => x != 0) <= k) break;
            count += list[index];
            list[index] = 0;
            index ++;
        }
        return count;
    }
```
vimの標準ファイラnetrwは普通に良さそうな話し

こんにちわ
[ゴリラ.vim](https://gorillavim.connpass.com/)を運営しているゴリラです。

みなさんvimでファイラを使っていますか？
多分vim入門したての方は[nerdtree](https://github.com/scrooloose/nerdtree)というプラグインを入れることが多いかと思います。
ぼくも実際IDEからのvimへ移行しましたが、ファイルツリーがないと落ち着かなくて入れていました。

実は、vimには標準でnetrwというファイラがあります。
そちらについてすこし紹介していきます。

# netrwについて
netrwはvim標準で用意されているプラグインになります。
netrwを使用することでファイラのように、画像のようにディレクトリをブラウジングできます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/59adb3c6-9e2d-909e-a36f-626876a63e0c.png)

いろんなオプションが用意されていて、それらをカスタマイズすることで更に使いやすくなります。

# netrwを有効にする
netrwはプラグインなので、以下の設定がされていない方は`~/.vimrc`に設定してください。

```vimscript
filetype plugin on
```

# netrwの基本操作
vim起動時に使用したい場合は`vim .`でnetrwが立ち上がります。
vim起動済みの場合は`:Ex`でカレントバッファ、`:Ve`で水平分割で開きます。

以下が基本操作になります。

| 1 | 2 |
|:--|:--|
| j  |  下に移動 |
| k  |  上に移動 |
| Enter  |  ディレクトリの場合は移動、ファイルの場合はカレントバッファに開く |
| o  | 水平分割で開く  |
| v  | 垂直分割で開く  |
| -  | 一つ上のディレクトリに移動 |
| u | undo、１つ前のディレクトリに戻る |
| U | redo、uで戻る前のディレクトリに戻る |
| d | ディレクトリを作成する |
| D | ディレクトリ・ファイルを削除する |
| mf| ファイルをマークする |
| mt| コピー・移動先のディレクトリをマークする |
| mc| mfしたファイルをmtしたディレクトリにコピーする|
| mm| mfしたファイルをmtしたディレクトリに移動する|
| I | ヘッダの表示トグル |
| i | ファイルツリーの表示形式を変更 |
| p | ファイルをプレビューする |

ファイルのコピーと移動以外は普通に便利ですね。

# リモート編集
netrwの目玉機能の一つとも言えるリモート編集ですが、
以下の[プロトコル](https://vim-jp.org/vimdoc-ja/pi_netrw.html#netrw-ref)に対応しています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/7d579647-f92f-fcee-be5e-1cf16e5d996e.png)

sshでサーバー上のファイルをちょこっと編集・確認したいときなどに使用できるので便利ですね。
ちなみに、以下のようにするとファイルを編集・保存（してからアップロード）できます。

```shell-session
vim scp://remote-server//home/gorilla/.vimrc
```

これはvim内部でscpコマンドを実行している様なので、scpコマンドは必要と思います。

# カスタマイズ
標準のnetrwのファイルツリーでは、若干見づらいので、見た目を`ls -la`コマンドに近づけます。

```vimscript
" ファイルツリーの表示形式、1にするとls -laのような表示になります
let g:netrw_liststyle=1
" ヘッダを非表示にする
let g:netrw_banner=0
" サイズを(K,M,G)で表示する
let g:netrw_sizestyle="H"
" 日付フォーマットを yyyy/mm/dd(曜日) hh:mm:ss で表示する
let g:netrw_timefmt="%Y/%m/%d(%a) %H:%M:%S"
" プレビューウィンドウを垂直分割で表示する
let g:netrw_preview=1
```

上記の設定をvimrcに追加すれば、冒頭のスクショの表示になります。
個人的に上記設定が一番見やすいのですが、もっと良い設定があるかも知れないのでぜひイジって見ください。

# まとめ
公式マニュアルを見ればもっといろんな事が書かれています。
個人的に、これくらいの機能を知れば困ることはないので、これ以上深掘りはしていません。

興味ある方はぜひ深く掘ってみて、これいいぞってのがあれば教えて頂けると幸いです。
Raspberry PI 3にseleinumを入れた時のメモ


結構はまったので忘れないようにメモする。

# インストール

バリバリとパッケージをインストール

```
root@raspberrypi:~# sudo apt-get install chromium-browser -y
root@raspberrypi:~# sudo apt-get install fonts-ipafont-gothic fonts-ipafont-mincho -y
root@raspberrypi:~# sudo apt-get install dirmngr -y
root@raspberrypi:~# gpg --keyserver pgp.mit.edu --recv-keys 9D6D8F6BC857C906
root@raspberrypi:~# gpg --armor --export 9D6D8F6BC857C906 | apt-key add -
root@raspberrypi:~# echo "deb http://security.debian.org/debian-security stretch/updates main" > /etc/apt/sources.list.d/security.debian.list
root@raspberrypi:~# apt-get update
root@raspberrypi:~# apt-get install chromium-driver -y                                                                                                                                                                          
root@raspberrypi:~# chromedriver --version
root@raspberrypi:~# pip install -U pip
root@raspberrypi:~# pip install selenium
```

# 動作確認

下記のコードを試してみる。うまくいけばtest.pngというファイルができてるはず。

```
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
  
CHROME_BIN = "/usr/bin/chromium-browser"
CHROME_DRIVER = '/usr/bin/chromedriver'
   
options = Options()
options.binary_location = CHROME_BIN
options.add_argument('--headless')
options.add_argument('--window-size=1280,1080')
    
driver = webdriver.Chrome(CHROME_DRIVER, chrome_options=options)
     
driver.get("https://www.google.co.jp")
driver.save_screenshot("./test.png")
driver.quit()
```


# はまりどころ

* Firefox使おうとしたらいろいろとダメだった。
* Googleのchrome driver公式ページにおいてあるドライバはarmじゃ動かない
* dirmngrってなんだよ・・・
* chromium-driverを入れても実行ファイル名はchromedriver
スキルアップの技術

# スキルアップの技術

対象が何であれ、スキルアップするために大切なことがあります。

 * (1) 対象を技術であると認識すること
 * (2) 要素技術に分解すること
 * (3) 要素技術を一つずつ順番に上手くなること

# 対象を技術として認識しよう

誰しも「○○ができるようになりたい」「○○がもっと上手くなりたい」と思う対象があると思います。

 * 仕事力を高めたい
 * 将棋が上手くなりたい
 * 論理的思考力を高めたい
 * 競泳で勝てるようになりたい
 * プログラミングできるようになりたい
 * 大規模システムを設計できるようになりたい
 * プロジェクトマネジメントできるようになりたい
 * etc..

人によって対象は様々だと思いますが、それが何であれ "対象を技術として認識すること" が大切です。生まれ持った才能ではなく、偶然獲得される特殊能力でもなく、トレーニングによって高めることができる "技術" として認識することが大切です。

# 要素技術に分解しよう

例として水泳を取り上げます。

先述の通り、水泳を技術として認識することが大切です。ただし、「水泳の技術が向上すれば、水泳が上手くなります」と言われても、具体的に取るべき行動が見えてきません。

そこで、「水泳の技術」を要素技術に分解します。

 * 飛び込みの技術
 * ターンの技術
 * 息継ぎの技術
 * 手で水をかく技術
 * 足で水をかく技術
 * etc..

要素技術に分解することで、「飛び込みが上手くなれば、水泳が上手くなるのだな」、「ターンが上手くなれば、水泳が上手くなるのだな」という具合に、「水泳の技術」をより明確に理解することができます。

「水泳の技術を向上しましょう」よりも「飛び込みの技術、ターンの技術、息継ぎの技術、・・・、を向上しましょう」と言われた方が、具体性があります。

# 要素技術を一つずつ順番に上手くなろう

水泳が上手くなるために、飛込みでは○○○に注意して、ターンでは○○○に注意して、息継ぎでは○○○に注意して、手で水をかくときには○○○に注意して、足で水をかく時には○○○に注意して、...ヨーイドン!!　結果はどうなるでしょうか。

なんかバタバタして終わると思います。

人には限界があるので、全ての要素技術を同時に上手くなろうとすることは、とても難易度の高い取り組み方です。あれやこれやと同時に複数のことを意識しようとして、結局一つも上手くできなかったという経験は誰しもあるのではないでしょうか。

要素技術を一つずつ順番に習得することが大切です。

一つの要素技術を選び、それだけを意識して練習しましょう。しばらく繰り返すと、強く意識しなくても当たり前のこととしてできるようになるはずです。そこまで上達したら次に進むタイミングです。次の要素技術を一つ選び、それだけを意識して練習しましょう。

# まとめ

対象が何であれ、スキルアップするために大切なことがあります。

 * (1) 対象を技術であると認識すること
 * (2) 要素技術に分解すること
 * (3) 要素技術を一つずつ順番に上手くなること
【iOS】Firebase Cloud Messaging を使って Silent Notification 受信する

Firebase Cloud Messaging を使って、iOS の Silent Notification（サイレント通知）を実装してみました。

今回は、Firebase の機能のひとつである、Firebase Cloud Messagingを使って実装してみました。

# Firebase Cloud Messaging の設定
基本的には、Firebaseの公式ドキュメントの通りやるのが、なんだかんだで一番てっとり早いです。
[iOS に Firebase Cloud Messaging クライアント アプリを設定する](https://firebase.google.com/docs/cloud-messaging/ios/client?hl=ja)

こちらの記事も参考になります。
[【iOS10】Firebaseでサイレント通知を行う
](https://qiita.com/shiba1014/items/099f8e7aa37d5e2540da)

# プロジェクトの設定
上記のFirebase公式ドキュメントに付随して、さらに設定を行います。

まず、**Topicへ登録**を行います。
Topic機能を使うことで、通知を受ける端末をグループ管理することができます。
今回は全て同じトピックに登録するので、決め打ちとします。

以下の内容を、AppDelegateに追加します。

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        Messaging.messaging().subscribe(toTopic: "ios")
    }


続いて、**アプリプロジェクトのCapability設定**を行います。
アプリのCapability設定で「Background Modes」をONに。
さらに、「Background fetch」と「Remote notifications」にチェックをいれます。
![スクリーンショット 2019-03-21 18.52.21.png](https://qiita-image-store.s3.amazonaws.com/0/181439/b965e264-d57b-a9f6-a4b2-fdbc9e30baff.png)

続いて、「Push Notifications」をONにするのも忘れずに。
![スクリーンショット 2019-03-21 18.52.28.png](https://qiita-image-store.s3.amazonaws.com/0/181439/688d66a0-1534-d840-7f24-95237f758746.png)

# Curl から Silent Notification リクエストを送る
Curl を使ってHTTP POSTをFirebaseに送信することで、指定したTopicにSilent Notificationを送ることができます。

    $ curl --header "Authorization: key=API_KEY" --header Content-Type:"application/json" https://fcm.googleapis.com/fcm/send -d "{\"to\": \"/topics/ios\",\"content_available\":true}"

API_KEY の部分は、Firebaseの設定画面からAPI KEYを調べてそれを入れてやります。
Firebaseのコンソール画面の「設定」→「クラウドメッセージング」から「サーバーキー」とあるものが、API_KEYとなります。
![スクリーンショット 2019-03-21 19.02.56.png](https://qiita-image-store.s3.amazonaws.com/0/181439/30744f07-e266-cd6e-d24f-01c27bda137b.png)

これでうまく Silent Notification が送信できていれば、アプリがバックグラウンドにいたとしても、AppDelegateにある以下の関数が呼ばれます。

    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        print(#function)
    }

Silent Notification ですので、当然通知バーにはなんの通知もきません。
PHPのビルトインウェブサーバーを使って、Laravelの環境構築とアプリケーション実行をしてみた 

# 概要

LaravelではPHPのもつ[ビルトインウェブサーバー機能](http://php.net/manual/ja/features.commandline.webserver.php)を使って、簡単にアプリケーションを実行できます。  
必要な環境構築とアプリケーション実行をまとめました。

---

# 前提条件

- バージョン
    - OS: MacOS 10.14.2
    - PHP: 7.1.19
- 更新日
    - 2019/03/21

---

# 実際の手順

### 1. composerのインストール
- [composer](https://getcomposer.org/)をインストールします
- ここではcurlでインストールします。brewなどでもできます 
- `composer --version`でバージョン情報が出てこれば成功です

```
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
chmod a+x /usr/local/bin/composer
composer --version
```

### 2. laravelインストーラのインストール
- composerを使ってlaravelインストーラをインストールします

```
composer global require "laravel/installer=~1.1"
```

### 3. 環境変数PATHの変更
- 環境変数PATHを変更し、`source`コマンドで反映します

```
echo "export PATH=~/.composer/vendor/bin:$PATH" >> ~/.bash_profile
source ~/.bash_profile
```

### 4. ディレクトリの作成、移動
- プロジェクトを置きたい場所にディレクトリを作成します
- ここではホームディレクトリ直下にlaravelディレクトリを作成し、laravelディレクトリへ移動します

```
cd ~
mkdir laravel
cd laravel
```

### 5. laravelコマンドを使ってプロジェクトの作成
- ここではプロジェクト名をstartlaravelとします

```
laravel new startlaravel
```

- あるいはこちらでも可能です(上か下、どちらかのコマンドを実行してください)

```
composer create-project --prefer-dist laravel/laravel startlaravel
```

### 6. サーバの実行
- 先ほど作ったプロジェクト内に移動し、artisanコマンドでサーバを実行します
- `--port=` でポート番号を指定できます。つけない場合は8000に繋がります

```
cd startlaravel
php artisan serve --port=8101
```

### 7. 確認
- `http://localhost:8101/` を開きます
- (`8101`は上記で指定したポート番号を設定してください)
- 以下の図のように表示すれば成功です
- 停止させる場合は、ターミナルで`control` + `c`を押してください

![実行図.png](https://qiita-image-store.s3.amazonaws.com/0/195687/57f98d47-0283-93a1-1c94-b83b3f3097a9.png)


# 注意事項

- ビルトインウェブサーバーは、テストや動作確認用に用意されているものなので、決して本番環境での利用は行わないでください。

# 参照

以下の本やサイトを参考にしました。

[PHPフレームワーク Laravel入門](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF-Laravel%E5%85%A5%E9%96%80-%E6%8E%8C%E7%94%B0%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798052582)
[PHPのビルトインサーバで動かしたい](http://recipes.laravel.jp/recipe/51)
Lambdaのローカル開発環境を構築

## はじめに

最近、AWS Lambdaを使用する機会が増えました。
serverless frameworkやaws cliを使用して、修正のたびにデプロイを行い、awslogsにてcloudwatch logsのログを確認しながら、ソースの修正を行うというような非効率な実装を行っていました。

googleにて検索している際に、下記のdocker imageを発見しました。

https://github.com/lambci/docker-lambda

docker-lambdaを使用方法などを記載していきます。

## 環境

- macOS Mojave バージョン 10.14
- docker version: 18.06.1-ce
- node v8.11.2
- npm 5.6.0

## テスト用のプロジェクトを作成

プロジェクトディレクトリを作成

`mkdir test-docker-lambda`

test-docker-lambdaディレクトリに移動

`cd test-docker-lambda`

node の初期設定

`npm init`

AWSのSDKのモジュールをインスール
`npm install aws-sdk`

index.jsを作成

`touch index.js`

テキストエディタにてindex.jsを開きます。

下記のテスト用スクリプトをコピー&ペーストして保存してください。

```
const aws = require("aws-sdk");

exports.handler = async (event, context) => {
  console.log(JSON.stringify(event));

  context.succeed({
    statusCode: 200,
    body: `{"result": "completed"}`
  });
};
```

eventのjsonファイルを作成

`touch event.json`

下記のJSON文字列をコピー&ペーストして保存してください。

```
{"test": "test"}
```

## docker-lambdaのdocker imageをダウンロード

下記のコマンドを実行し、docker-lambdaをpull

`docker pull docker-lambda`

## dockerを実行

dockerを実行

`docker run --rm -v "$PWD":/var/task lambci/lambda:nodejs8.10 index.handler $(printf '%s' $(cat event.json))`

下記のように表示されれば、成功です。

```
$ docker run --rm -v "$PWD":/var/task lambci/lambda:nodejs8.10 index.handler $(printf '%s' $(cat event.json))
START RequestId: 3c0438a2-df52-14f8-fba8-2fb5dd8581bc Version: $LATEST
2019-03-21T12:38:54.328Z	3c0438a2-df52-14f8-fba8-2fb5dd8581bc	{"test":"test"}
END RequestId: 3c0438a2-df52-14f8-fba8-2fb5dd8581bc
REPORT RequestId: 3c0438a2-df52-14f8-fba8-2fb5dd8581bc	Duration: 1253.10 ms	Billed Duration: 1300 ms	Memory Size: 1536 MB	Max Memory Used: 39 MB

{"statusCode":200,"body":"{\"result\": \"completed\"}"}
kusunokBookpuro:test-docker-lambda ry_kusunoki$
```

## awsのサービスにアクセス
環境変数を読み込み、ローカル環境からAWSのサービスにアクセスすることも可能みたいです。
下記がコマンド例です。

```
docker run -e AWS_ACCESS_KEY_ID=[:AWS_ACCESS_KEY_ID] -e AWS_SECRET_ACCESS_KEY=[:AWS_SECRET_ACCESS_KEY] -e AWS_DEFAULT_REGION=[:AWS_DEFAULT_REGION] --rm -v "$PWD":/var/task lambci/lambda:nodejs8.10 index.handler $(printf '%s' $(cat event.json))
```
AWS 認定ビッグデータ 専門知識 学習記録 - IoT

[AWS 認定ビッグデータ 専門知識 学習記録 - 本編](https://qiita.com/wwalpha/items/b8cea79ae87a9baf92e0)

## IoT(Internet of Things)

### Service List
* Amazon FreeRTOS
* AWS IoT Greengrass
* AWS IoT Core
* AWS IoT Device Management
* AWS IoT Device Defender
* AWS IoT Things Graph
* AWS IoT Analytics
* AWS IoT SiteWise
* AWS IoT Events

### [Consists of the components](https://docs.aws.amazon.com/iot/latest/developerguide/what-is-aws-iot.html)
* **Device gateway**
  * Enables devices to securely and efficiently communicate with AWS IoT
* **Message broker**
  * Provides a secure mechanism for devices and AWS IoT Applcations to publish and receive messages from <br >each other
  * Use either the MQTT protocol directly or MQTT over WebSocket to publish and subscribe
  * Use the HTTP REST interface to publish.
* **Rules engine**
  * Provides message processing and integration with other AWS services
  * Use an SQL-based language to select data from message payloads, and then process and send the data to other service(S3, Lambda, DynamoDB)
  * Use the message broker to republish messages to other subscribers
* **Security and Identity service**
  * Provides shared responsibility for security in the AWS Cloud
* **Registry**
  * Organizes the resources associated with each device in the AWS Cloud.
  * Associate certificates and MQTT client IDs with each device to improve your ability to manage and troubleshoot them.
* **Group registry**
  * Groups allow you to manage several devices at once by categorizing them into groups
  * Groups can contain groups
  * Any action you perform on a parent group will apply to its child groups, and to all the devices
* **Device shadow**
  * A JSON document used to store and retrieve current state information for a device.
* **Device Shadow service**
  * Provides persistent representations of your devices in the AWS Cloud
* **Device Provisioning service**
  * Allows you to provision devices using a template that describes the resources required for your device: a thing, a certificate, and one or more policies. 
* **Custom Authentication service**
  * You can define custom authorizers that allow you to manage your own authentication and authorization strategy using a custom authentication service and a Lambda function.
* **Jobs service**
  * Allows you to define a set of remote operations that are sent to and executed on one or more devices connected to AWS IoT.
* 編集中

### Iot Rules Engine
Rules give your devices the ability to interact with AWS services. Rules are analyzed and actions are performed base on the MQTT topic stream. You can use rules to support tasks like these:

* Augment or filter data received from a device
* Write data received from a device to an Amazon DynamoDB database
* Save a file to Amazon S3
* Send a push notification to all users using Amazon SNS
* Publish data to an Amazon SQS queue
* Invoke a Lambda function to extract data
* Process messages from a large number of devices using Amazon Kinesis
* Send data to the Amazon Elasticsearch Service.
SSLメモ

##### SSLの流れ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/301697/ca226dcf-3699-d1f8-05ab-a51b29e1a9ca.png)

1. クライアントがサーバに対して接続要求を行う。
2. サーバはクライアントに対して公開鍵付きSSLサーバ証明書を送信する。
3. クライアントはSSL証明書内の認証局が作成したデジタル署名部（※１）をルート証明書（※２）を用いて検証する（※３）。これによりサーバが認証局公認の信頼できる機関であることを確認することができる。
4. クライアントは共通鍵を作成する。
5. クライアントはSSL証明書内の公開鍵を用いて作成した共通鍵を暗号化し、サーバへ送信する。
6. サーバは秘密鍵を用いて送られてきた情報を復号し共通鍵を取得する。
7. それ以降は共通鍵を用いて双方間で暗号化通信を行う。

※１　デジタル署名は認証局が自身の秘密鍵にて証明書のハッシュ値を暗号化したもの。
※２　ルート証明書には認証局の公開鍵が格納されている。
※３　検証では下記のことを確認している。

- デジタル署名がルート証明書内の公開鍵で復号できること。これにより認証局が発行したものであることを確認できる。
- 復号後に得たハッシュ値が実際の証明書のハッシュ値と一致していること。これにより認証局が発行した時点のものと内容に差がないことを確認できる。
ページの印刷で覚えとくこと

#単位㎝、㎜、inch、pt
#リンクの対応
印刷されたものはリンクを飛ぶことができなくなる。
→URLを出力して、確認できるように。
##サンプルcss
![link_page.png](https://qiita-image-store.s3.amazonaws.com/0/380575/a4937d9d-7dbb-9de4-e1f6-b5f756ef97b5.png)
これで、リンクの後ろにURLが現れる。
#印刷ページ毎の指定
![margin_page.png](https://qiita-image-store.s3.amazonaws.com/0/380575/0546f733-5811-6724-e4da-9b9470366947.png)
周りに空白ができる。
![first_margin_page.png](https://qiita-image-store.s3.amazonaws.com/0/380575/df496e27-ffad-0fad-546b-471d3a9c659f.png)
特定のページを指定できる。
#改ページの位置をコントロール
###page-break-after/page-break-inside/page-break-before
＝それぞれの位置での改ページをどのようにするか
##サンプルcss
![position_page.png](https://qiita-image-store.s3.amazonaws.com/0/380575/d5e4bcae-a49b-3cff-26a3-a4d74e852e05.png)
これを指定した要素の直後での改ページを避ける。
#orphans/widows
英語でorphans=孤児、widows=未亡人。
改ページされる際の前ページ/後ページに最低あってほしい行数。
Laravelのサービスコンテナについて簡単に書いてみた#1

## ◆サービスコンテナ
<b>クラスのインスタンスを一括管理</b>し、シングルトンなら、内部にキャッシュしているものを返す
サービスコンテナの実体は<b>Illuminate\Foundation\Application</b>

[サービスコンテナ主なメソッド]https://qiita.com/mikakane/items/21ad883f2d83fdd76463

## ◆サービスコンテナのバインド処理
バインド = インスタンスの生成方法をサービスコンテナに登録(結合)すること

登録することで実際に呼び出せるようになる。

```:例
引数(名前, インスタンスの生成処理)　　　名前に決まりはない
app()->bind('Sample::class', function() {
    return new Sample();
});

$sample = app()->make('Sample::class');//サービスコンテナに要求してインスタンスゲット(laravelでは解決という)
```

どこのクラスでバインドしても大丈夫だが、登録系をまとめているのが、サービスプロバイダーなので、そこでバインドするのがいい

(別名バインド)
bindメソッドの第一引数をkeyとvalueの配列で指定してもOK

[その他のバインドメソッド]https://www.wakuwakubank.com/posts/456-laravel-container-provider/

## ◆解決(サービスコンテナからの取り出し方)
解決とは、サービスコンテナからクラスのインスタンスをもらうことらしい
方法は、どちらでもよい(個人的には短いほうが好み)
・app(名前)
・app()->make(名前)
・\$app = app();の後に\$app['名前']でも取り出せる。

## ◆バインドしていない文字列の解決

```
$app = app(Sample::class);
```

と呼ぶと、

```
app()->bind(Sample::class,function(){
    return new Sample();
});
```

とバインドする記述をしなくても使える場合がある。
bindの第一引数をよく見てほしい。上の例では、解決するときに''で囲っていたが、今回はクラス自体を指定している。
つまり、解決するときにクラス自体を指定すると、バインドしていなくても勝手に解決してくれる。(もちろんuse文は必要だが)

## ◆使いどころ
学習していて、bindっていつ使うのと正直思った。(new クラス()でいいじゃん)
laravelでは、標準装備(サービスコンテナに登録された)のものはどこでも利用できるようになっている。
サービスコンテナに登録することは、そのアプリ全体で使いたい・標準装備にする必要のある機能をまとめて、またそれを機能ごとにサービスプロバイダーファイルを分けて、登録処理を書いて、まとめておけるのが、メリットなのかなぁと感じた。(新しくこのプロジェクトの作成に加わった人は、共通機能(例：認証)を使うのは、このサービスプロバイダーファイルを見ればいい的な感じで)

調べてはみたもののこれなら、使わなくてもいいんじゃと思ったがもっといいことがあった。(調べ不足だっただけ)

## [もっと大きなメリットを見つけた]
ちょっと長くなるので、次回の記事に書かせていただく。
[次回記事リンク]https://qiita.com/hekizi/items/a7ba61ef59c1093ee835
GASでXMLをpayloadしてみた

# 経緯
GAS(Google Apps Script)でXMLをパラメーターに設定してあるAPIを実行したかったので、備忘録として記載します。

# 仕様
XMLに引数を設定します。
下記関数はBasic認証を例にしています。

# 実装
```javascript:main.gs
function execApi(arg) {

  var url = 'API_URL';
  
  // ヘッダーの準備（Basic認証）
  var headers = {
    'Authorization' : 'Basic ' + Utilities.base64Encode('user' + ':' + 'password'),
  };
  
  // payload（xml形式）
  // 引数をxmlに埋め込む
  var xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><element1>\t<element2>\t\t<element3>" + arg + "</element3>\t</element2></element3>";
  
  // PUTを利用
  var options = {
    'method' : 'put',
    'contentType' : 'application/xml',
    'headers' : headers,
    'payload' : xml
  };
  
  try {
    UrlFetchApp.fetch(url, options);
  } catch(e) {
    Logger.log("エラーが発生しました。\n" + e);
  }
  
}
```

以上です。
vimiumでタブそのものを移動する方法

vimのキーバインドがchromeで使えるvimiumを愛用しているのですが、現在開いているタブそのものの位置を左右に移動させる操作がわからなかったので、そのメモ。
環境はmacになります。

|操作|内容|
|---|---|
|shift+<<|現在のタブを左に移動|
|shift+>>|現在のタブを右に移動|

ちなみにこのショートカットがchromeのものなのか、vimiumによるものなのかは不明です。
vimiumを無効にすると、このショートカットも無効になるので、vimiumによるものだとは思うのですが・・・
~~公式サイトにもhelpにも載っておらず謎です。~~
helpに載ってました・・・
意味のない記事になってしまいましたが、チートシート的なものにもこの記載がほとんどないので、残しておきます。
環境に合わせる指定

#フィットとは
ブラウザには、画面の解像度をページに合わせる機能がある。それをフィットという。スマートフォンには、「フィット」機能がある。フィットが作動すると、メディアクエリがうまく機能しない。そこでhtmlにmetaタグを記述する。
##metaタグを書く
![html_fit.png](https://qiita-image-store.s3.amazonaws.com/0/380575/d11e31b7-4c48-232c-2dcd-84ec8407dbee.png)
#Retinaディスプレイ
Retinaディスプレイは、1pxの表示に対して2px分使用する。半分の大きさで表示される。
###-webkit-device-pixel:1
＝通常のディスプレイ
###-webkit-device-pixel:2
＝Retina
Chrome拡張機能「Simple URL Copy」のコピー形式に Org mode を追加してみた

# はじめに

 - [【Chrome Extension】簡単にURLとタイトルをコピーできる「simple-url-copy」作りました - フリーランチ食べたい](https://blog.ikedaosushi.com/entry/2019/02/25/012319)
 - [1クリックでページタイトルとURLをコピーできるChrome拡張機能「Simple URL Copy」 - GIGAZINE](https://gigazine.net/news/1urlchromesimple_url_copy/)
 - [ikedaosushi/simple-url-copy: A Chrome extension that help you to copy URL](https://github.com/ikedaosushi/simple-url-copy)

上記のChrome拡張機能「Simple URL Copy」はとても便利。この記事を作成する際もMarkdown形式にコピーするのに使っています。これにコピー形式として Org mode を追加してみました。

# つくったもの

 - [wurly200a/simple-url-copy: A Chrome extension that help you to copy URL](https://github.com/wurly200a/simple-url-copy)

これを機にGitHubにアカウントを追加して、プロジェクトをForkしてPull Requestを出す、という一連の流れが体験できました。
デバッグ方法がわからないので、慎重に間違っていないことを確認してCommit&Push。
simple-url-copyは既に、Backlog のコピー形式に対応したPull Requestが出されていたので、これを参考にしました。

# 試してみる

せっかく作ったのに、作者の方に取り込んでもらうまで自分が使えないというのはいまいち。
拡張機能の使い方を調べてみたところ、Chromeで"デベロッパーモード"をONにすればローカルPCから読み込みができることが分かりました。

[【chrome extensions】Google Chrome拡張機能の作り方① - 導入編からのひな形も置いておく - tweeeetyのぶろぐ的めも](http://tweeeety.hateblo.jp/entry/2015/03/04/223825)

読み込んでみます。
うむ。想定通り動作しました。(ホッ)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201153/9936dab9-2868-51b3-f3fd-48f9707d0f5b.png)

# 感想

Org modeのヘビーユーザーの自分としてはもう最高。天国のようです。(←おおげさ)
早く本家に取り込んでもらえるといいなあ。