OmniAICreator/Qiita-1.07M huggingface dataset:
Hedera Hashgraphの概要について解説してみる

*※2018年6月19日公開*
*※2018年6月20日追記*
*※2019年7月8日更新*

N-Village CTOの林田です。　
**「ブロックチェーンを超える技術」**と話題の**Hedera Hashgraph**について学ぶ機会があったので、公開されている[ホワイトペーパー](https://s3.amazonaws.com/hedera-hashgraph/hh-whitepaper-v1.1-180518.pdf)を元に複数の記事にしてみます。

# Hedera Hashgraphとは
　Hedera Hashgraph（ヘデラ　ハッシュグラフ）とは、新しいコンセンサスアルゴリズムを採用した分散台帳技術（DLT）です。既存の分散台帳技術とは、次の点が異なるとされています。

1. **性能**
　1つのシャードで1秒あたり数十万回のトランザクションを捌くことができます。コンセンサスの待ち時間は数秒程度です。

2. **セキュリティ**
　aBFT＝非同期ビザンチンフォルトトラレントであり、コンセンサスアルゴリズムにおいて数学的にセキュリティ上の脆弱性が無いことが証明されています。ただし、他の分散台帳技術と同様、悪意を持ったメンバーがコミュニティの1/3を超えないことが前提です。

3. **ガバナンスと安定性**
　世界中から各業界の専門知識を持つ企業が集まり、Hedera Hashgraphを統制するための委員会を組織しています。2019年7月8日の時点では、「ドイツテレコム（Deutsche Telekom）」、「DLA Piper」、「マガジネ・ルイーザ社（Magazine Luiza）」、「野村ホールディングス株式会社」、「Swisscom Blockchain AG」の5社が公表されています。この強力なガバナンスによって、安定したプラットフォーム運営が可能です。

4. **公平性**
　PoWなど、他のコンセンサスアルゴリズムと異なり、特定のトランザクションの処理順を優先する余地がありません。いずれのトランザクションも発生順（厳密には、ネットワーク全体のノードの2/3が取引を受け取ったタイムスタンプの中央値）で処理されるため、公平性のある取引が可能です。

5. **規制の遵守**
　多くの政府が求める、KYCやマネーロンダリング防止（AML）のチェックが可能です。

　次回以降の記事で各内容について詳細を見ていきたいと思います。

# Hashgraphのコンセンサスアルゴリズム
　では、Hashgraphのコンセンサスアルゴリズムについて理解したいと思います。コンセンサスアルゴリズムとは、メンバーが互いに信頼し合っていないコミュニティにおいて、システマティックに信頼を生み出すための仕組みです。**Hashgraphは通常のブロックチェーンと異なり「分岐」がない**ので、理解しやすいかと思います。


### ゴシップ（噂）プロトコルの動作
　まずは、Hashgraphが採用しているゴシップ（噂）プロトコルの基本的な動作を見ていきましょう。コミュニティ内でトランザクションのゴシップ（噂）が広がっていくイメージに近いです。

1. A〜Eのメンバーで構成されるコミュニティでお金をやりとりするとします。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/16023/4729972c-5e5e-9ed9-7065-05ed296c1f63.png)

2. AがBに100円送金したい場合、Aは「AがBに100円送った」というトランザクションのイベント（コンテナ）生成をBに依頼します。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/16023/0bf901eb-1de7-0ba1-c588-c51140bd68f3.png)

3. Bは生成したイベントを他のメンバーに送ります。イベントを受け取ったメンバーは、イベントをまだ受け取っていない他のメンバーに、次から次へと送っていきます。しばらくこれを繰り返すと、メンバー全員が「AがBに100円送った」という情報を知ることとなります。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/16023/1fac1787-c33f-6bb7-2c1f-93afac3e6e9d.png)

4. このように、各メンバーが任意のタイミングで生成したトランザクションを全員で共有することで、Hashgraphは台帳を更新していきます。
![04.png](https://qiita-image-store.s3.amazonaws.com/0/16023/80e958ca-e4d1-eea3-ea85-6d22beed0086.png)

　ブロックチェーンとHashgraph、どちらもすべてのメンバーがトランザクションを生成できて、最終的に「ブロック」ないし「イベント」というコンテナに入れられてコミュニティ全体に広がります。
　ブロックチェーンでは、これらすべてのコンテナが単一のチェーンを形成するように動作します。2人のメンバーが同時に2つのコンテナを生成してしまった場合、ブロックチェーンは「分岐」します。コミュニティは最終的に1つを選択してもう一方のコンテナを破棄します。こういった事態を避けるために、ブロックチェーンではコンテナの生成にある程度の時間がかかるよう、PoW等のメカニズムが必要です。
　一方、Hashgraphでは、生成されたすべてのコンテナが使用され、破棄されることがありません。これはブロックチェーンと比較して効率的だといえます。「分岐」が発生しないために、コンテナの生成に時間をかける必要がありません。そのため、PoW等のメカニズムが不要であり、コンセンサスがより単純で、高速に処理することが可能です。

### トランザクションの妥当性検証方法

　Hashgraphにおけるトランザクションの妥当性は、どのように検証されるのでしょうか。それを知るために、イベントの中身を見てみたいと思います。

![05.png](https://qiita-image-store.s3.amazonaws.com/0/16023/326602fa-ee04-ad88-d3a2-492652d730a6.png)

　ポイントは、1つのイベントに2つのハッシュが含まれている点です。これらのハッシュによって、送られてきたイベントの出処を辿ることができ、妥当性の検証が可能となるのです。

### hashgraphアルゴリズムを調べてみた所感
　ブロックチェーンと比較した時のビザンチン問題対応コストの低さ、その結果としての高速性や、誰もが公平にトランザクションを生成できる公平性を両立している点が非常に魅力的だと感じています。細かな仕様などまだ不明点も多いので、継続的に調査していきたいと思います。

　コンセンサスアルゴリズムについてもっと詳細を知りたい方は[こちら](https://qiita.com/rinrin0108/items/ecd7399ea19bb03b1135)の記事をご参照ください。

---
内容に間違いがあればご指摘いただけますと幸いです。よろしくお願いいたします。
全文検索サービスのOSS「FESS」をAPIを使って操作

[FESS](https://fess.codelibs.org/)は全文検索のエンジン、クローラ、検索ダッシュボード等一式を取り揃えたOSSです。
Googleライクな検索システムが簡単につくれるので便利です。今回はそのFESSに対して、APIベースで操作する方法のメモです。


# 検索処理をAPIを用いて実行する場合

まずは検索をAPIを用いて実行する場合の呼び出し方です。
APIのURLは、以下のフォーマットで呼び出し可能です。

```
$ curl -XGET "http://FESSサーバIP:8080/json?q=キーワード
```

q以外のその他検索オプションは[こちら](https://fess.codelibs.org/12.1/api/api-search.html)を参考にしてください。


# クローリング設定等管理設定をAPIを用いて実行する場合

次に、管理設定系の操作です。FESSは管理設定系の操作もAPIベースで実行できるようになっています。
検索系とは異なるので少し注意が必要です。

管理設定系は/api/adminというパスで行うことが可能です。
手順としては以下の通り。

## アクセストークンの発行

FESSの管理画面にログイン後、アクセストークンを発行します。
「管理→システム→アクセストークン」　の新規作成から実行できます。
作成時、パーミッションに***{role}admin-api***を設定してAdmin APIへの権限を付与します。

![fess_1.png](https://qiita-image-store.s3.amazonaws.com/0/45851/c4328ad3-2b17-5f6a-3512-37a4a90d1bf4.png)


保存すると自動的にトークンが払い出されるのでこの内容をメモしておきます。

## curlを用いてAPI呼び出し

例として、クローラ設定を1件追加してみます。
パラメータの詳細は
https://fess.codelibs.org/11.4/lastadoc-fess.html#.api.admin.fileconfig.setting::put_d_setting
この辺りを参考にしました。

```shell-session:Request
$ curl -H "Authorization: 払い出されたアクセストークン" -XPUT "http://FESSサーバIP:8080/api/admin/fileconfig/setting" -d '{"name":"test crawler","paths":"file:/tmp/data/","num_of_thread":5,"interval_time":1000,"boost":1.0,"permissions":"{role}guest","available":1,"sort_order":1}'
```

```json:Response
{"response":
  {
    "id":"AWQWxxxxxxxxxxx",
    "created":true,
    "version":"11.3",
    "status":0
  }
}
```


ポイントはリクエストヘッダーにAuthorizationを指定して先程払い出したアクセストークンを指定することです。
あと、新規作成系はPUTリクエストになるようです。

最低限必須とされている上記のパラメータの指定が必要となります。

これで管理設定も自動化できます。
【初心者向けシリーズ】htmlとcss初心者がずっこける備忘録

# 初心を忘れがちな自分に捧ぐ、ここで詰んだな備忘録
技術力が雑なくせに年数だけ稼いでしまった私なので初心はもうだいぶ昔に消えて行きました。
そもそも何につまづいていたかをまとめましょう。

## リンク色が効かないんだけど
リンク色を変えたくてどんなに`color`を変更しても変わらない・・・。
リンクの色を変えているつもりでも、ただ文字色を変えてるだけってのが昔はよくありました。リンクの色を変えたい場合はちゃんとaタグに指定してあげないといけないんだぞい

```html
//html
<div class="sample">はろはろ<a href="#">えぶりでぃ</a></div>
```

```css
//css

//ダメな例
.sample{
 color: red;
}

//正解
.sample　a{
 color: red;
}
```

## 横に並ばないんだけど
勉強初心者は大抵divタグを用いて形を作ったりしてタグと戯れることが多いと思うのですが、divタグはblockといわれるdisplay設定になってるよ。
「見えている部分だけじゃなくて横のエリアぜーーーーんぶ俺のやで」っていうのがblock。
対処法は複数あるけど、今一番楽なやり方だなーと思うのは、displayを`inline-block`にすること。横幅さえオーバーしていなければちゃんと横に並ぶよ。

```html
//html
<div class="left"></div>
<div class="right"></div>
```

```css
//css

.left,.right{
 width: 500px;
 height: 500px;
 display: inline-block;
}
```

#　まとめ

一気に何記事も書いたら、初心に帰れなくなったのでまたあとで書く。
初心者なりにわからないhtml、cssの謎があればコメントにガシガシ書いてください。わかりそうなやつはここでざっくり書きますわーーーー
独自のタグを作ってそのタグで囲まれたものだけを取得したい

HTMLで独自タグを試した時の備忘録です。HTMLやJavaScriptには明るくないので今後ちゃんと勉強していきたい。
まず、独自タグについて調べるとWeb Componentsとかがたくさんヒットしました。
その中にCustom Elementsという仕様があるみたいで、ここで独自タグを定義できるらしい。

とりあえずやってみる
今回のコードはgithubに上げておきます。
https://github.com/raibito/WebCodeBowl/blob/master/HtmlCustomTagTest/html/index.html

#独自タグを定義してみる
templateタグとscriptを使用する。
template内では独自タグのスタイルやプレフィックスを付ける等ができる。
scriptでは独自タグのクラスを作って`customElements.define("custom-tag",CustomTag);`で定義する。

```html
    <template id="custom-temp">
        <style>
            .col{
                color: red;
            }
        </style>
        <div class="col"><content></content></div>

    </template>
    <script>
// ここでタグを定義
        class CustomTag extends HTMLElement{
            constructor(){
                super();
                const template = document.querySelector("#custom-temp");
                const node = document.importNode(template.content,true);
                this.createShadowRoot();
                this.shadowRoot.appendChild(node);
            }
        }
        customElements.define("custom-tag",CustomTag);
    </script>

```
これでタグが定義され使用できるはずだと思い、タイトル通り作ったタグで囲まれたものだけを取得してみます。

#作ったタグで囲まれたものだけを取得してみる
使ったbodyは以下の通り。小学生かよってくらい適当ですまぬ。

```html
<body>
    <h1>Custom Tag Test</h1>
    <p>test</p>
    <p>ああああ</p>
    <custom-tag data-url="https://...">ここがカスタムタグ</custom-tag>
    <p>ああああ</p>
    <custom-tag data-url="http://...">これもカスタムタグ</custom-tag>

    <script>
        console.log(document.getElementsByTagName("custom-tag"));
    </script>
</body>
```
scriptでブラウザ(Chrome)のコンソールに出力してみると、

HTMLCollection(2) [custom-tag.testCustom, custom-tag.testCustom]
0:custom-tag.testCustom
1:custom-tag.testCustom
length:2

まあ取れてるらしい。一応タグ名を取得してみたらCUSTOM-TAGとなったので大丈夫そうです。

ここで疑問が浮かびました。定義してないタグを使ったら取得できないのか？

#定義していないタグで試してみる
bodyに定義していないタグを入れてみて同様に試してみました。

```html
<body>
    <h1>Custom Tag Test</h1>
    <p>test</p>
    <p>ああああ</p>
    <custom-tag data-url="https://...">ここがカスタムタグ</custom-tag>
    <p>ああああ</p>
    <custom-tag data-url="http://...">これもカスタムタグ</custom-tag>
    <undefine-custom-tag>定義していないカスタムタグ</undefine-custom-tag><!--追加 -->
    <script>
        console.log(document.getElementsByTagName("custom-tag"));
        console.log(document.getElementsByTagName("undefine-custom-tag"));//追加
    </script>
</body>
```
bodyに`<undefine-custom-tag>`を入れて、scriptで取得できるか試してみると、

HTMLCollection(1)
0:undefine-custom-tag
length:1

あ、取れちゃうんだ。タグ名を取れるかも試してみたら取れました。

#何故だ
取れるんなら独自タグいらないじゃんって思い調べたのですが、おそらくHTMLUnknownElementという奴が関わっているっぽい？
でもこれを使っているとHTMLに新しいタグができた時に名前がかぶると面倒らしい?
定義するとこの辺りが解消されるのだろうか。

また、styleなどの定義ができるのが独自タグを定義する理由の一つな気がする。
タグで囲まれたものだけを取得するくらいだったら独自タグを定義する必要はないのかも。

#まとめ
・独自タグが使えるらしいCustom Elementsを試してみた
・作ったタグで囲まれたものを取得してみた
・UnknownElementが適応されているらしいがあまり使うべきではない

・早くフロントエンドも勉強しろという声が聞こえる
・備忘録という言葉の便利さ


#参考
Web Componentsとは何か？
https://qiita.com/jtakiguchi/items/b1315f53b3726ff11b61
CakePHP3.x ORMでFrom句に仮想テーブルを追加する方法

# 結論から言えば

```php
// サブクエリー
$sub_query = $this->Hoges->find();

// ネストしたクエリー
$main_query = $this->Moges->find()->from(['SubTable' => $sub_query]);
```

これで

```sql
SELECT * FROM(SELECT * FROM hoge Hoges) SubTable
```
といったクエリーがCakePHPから吐き出され、

```php
$main_query->toArray();
```
などを行う事でEntity型の状態で結果を取得できます。

# この機能の肝心なところ
from関数の引数を連想配列にし、テーブルやカラムにエイリアスを設定することです。

## from関数に$sub_queryのみを渡した場合
```php
$this->Moges->find()->from($sub_query);
```
この場合、CakePHPから吐き出されるSQLは

```sql
SELECT Moges.* FROM(SELECT * FROM hoge Hoges)
```
となり、Moges.idがありませんなどのエラーが出力されます。

## from関数に連想配列を渡した場合

```php
// サブクエリー
$sub_query = $this->Hoges->find();

// ネストしたクエリー
$main_query = $this->Moges->find()->from(['SubTable' => $sub_query]);
```

```sql
SELECT * FROM(SELECT * FROM hoge Hoges) SubTable
```

結論で書いたようなSQLが出力されます。

# このままではEntityでの取得に苦労する
CakePHPではカラム名のエイリアスとして「テーブルエイリアス__カラム名」といった形で自動的に設定されます。

```sql
SELECT id AS 'Hoges__id' FROM hoge Hoges
```

先ほどのようなコードで取得すると、

```php
// サブクエリー
$sub_query = $this->Hoges->find();

// ネストしたクエリー
$main_query = $this->Moges->find()->from(['SubTable' => $sub_query]);

$result = $main_query->toArray();

foreach($result as $row){
  $id = $row->Hoges__id;
}

```

このようにデータを引き出す必要があります。
テーブルを連結していた場合は、テーブル毎にエイリアスが変わってしまうので不便ですね。
また、上記コードでは1回のみのネストですが、

```sql
SELECT *
FROM(
  SELECT *
  FROM(
    SELECT * FROM hoge Hoges
  )OriginTable
)SubTable
```
2回以上のネストが存在する場合、SubTableを使ったクエリーを発行する場合に「OriginTable.Hoges__id」で取得できません。

```php
// サブクエリー
$sub_query = $this->Hoges->find()->select(['id' => 'Hoges.id']);

// ネストしたクエリー
$main_query = $this->Moges->find()->from(['SubTable' => $sub_query]);
```
少し手間がかかりますがselect関数からカラムのエイリアスを設定しましょう。

```php
// エイリアスを設定することでサブクエリーが入っていてもこのようにアクセスが可能になります
$moges = $main_query->toArray();

foreach($moges as $row){
  $id = $row->id;
}
```

# 最後に
こんな複雑なクエリーを組む必要はそうそうないと思いますが、誰かのお役に立てれば幸いです。
動的methodを全てstaticで使用できるようにする方法

composerで落としたライブラリを見てると動的methodを静的に変換する処理が多数実装されていたのでTraitにしてみました。

```
trait Dynamic2static
{
	public static function getInstance() : self
	{
		static $instance = null;
		if ($instance === null) {
			$instance = new self();
		}
		return $instance;
	}

	public static function __callStatic($method, $args)
	{
		$instance = static::getInstance();
		if (!is_callable([$instance, $method])) {
			// ここは変えたほうが良いです
			throw new Exception();
		}
		switch (count($args)) {
			case 0:
				return $instance->{$method}();

			case 1:
				return $instance->{$method}($args[0]);

			case 2:
				return $instance->{$method}($args[0], $args[1]);

			case 3:
				return $instance->{$method}($args[0], $args[1], $args[2]);

			case 4:
				return $instance->{$method}($args[0], $args[1], $args[2], $args[3]);

			default:
				return call_user_func_array([$instance, $method], $args);
		}
	}
}

```

Gitに上げようかとも思ったんですが、需要がなさそうだなって思ったので...
細かい条件を元に判定結果を返す簡易 Validation 的な Judgment Gem を作ってみた

## 作ったもの

とりあえず、名前は仮で [judgment](https://github.com/hazi/judgment) として、github に置いてあります。

できる事としては下記のような感じ。

```ruby
class SampleModel
  include Judgment

  judge_for :publishable do
    judge -> { saved? }, '保存されていません'
    judge -> { using? }, '利用者がいません'
    judge -> { reservation_date.future? }, '予約投稿日が未来です'
    judge_not -> { deleted? }, 'すでに削除されています'
  end
end

sample_model = SampleModel.new
sample_model.publishable? #=> false
sample_model.judgment_message(:publishable) #=> ['予約投稿日が未来です']
```

## 作ったきっかけ

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Rails の Validation を Validation 以外の目的で使いたいんだけどいい方法ないかな…。<br><br>細かい色々なチェック項目があるんだけど、メソッドにするには長くなりすぎるし、Validationみたいにして書きたい。<br>error_messages 的なのも欲しい</p>&mdash; HAZI@合法改造車 (@HAZI) <a href="https://twitter.com/HAZI/status/1007920570489397248?ref_src=twsrc%5Etfw">2018年6月16日</a></blockquote>


Rails で、あるオブジェクトが色々な条件に一致するかどうかを調べるメソッドを作っていたら1つのメソッドがやたら長くなってしまい辛い場所が多数あった。

```ruby
def publishable?
  !deleted? &&
    saved? &&
    using? &&
    !reservation_date.future? &&
    ...
end
```

また、条件に一致しなかった場合に、どうして一致しなかったのかが知りたい時があり、その場合はさらにメソッドを追加して

```ruby
def why_not_publishable
  result = []
  result << '削除済み' if !deleted?
  result << '保存されてません' if saved? &&
  result << '利用者がいません' if using? &&
  result << '予約投稿日が未来です' if !reservation_date.future? &&
  ...
end
```

みたいな感じにする必要があって、`publishable?` を変更した時、`why_not_publishable` のメンテナンスを忘れるとさらに辛い。

何かいいものはないかと探してみたけど、考えてみると簡単に実装できそうだったので、とりあえず作ってみることにしました。

## ToDo

- 正直ネーミングセンスはどうかと思っているので、なんかいいのがあったら変えたい。
- DSL もあれなので、メソッドを Symbol で受け取れるようにしたり、`:if` オプション入れたり、Validation っぽくしてもいいかも。
GNU Wget > ファイル既存時の".1"ファイル生成をやめる > -ncオプション

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
GeForce GT 730 1GB GDDR5
CentOS 6.9 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
GNU Wget 1.12
```

### 状況

- wgetでファイルを取得時、既存のファイルがある場合に".1"のようなファイルができる
- ".1"のようなファイルを作らないようにする

### -ncオプション


https://explainshell.com/explain?cmd=wget+-nc

>  When running Wget without -N, -nc, -r, or -p, downloading the same file in the same directory will result in the original copy of file being preserved and the second copy being named file.1. 

上記記載の通り、-ncオプション付きでwgetを実行すると、ファイル既存時に".1"付きファイルは生成されなくなった。


### 注意点

既存のファイルがサイズの小さい不完全なファイルの場合であっても、取得済となり取得は行われない。

ファイルが不完全な場合は別途検討が必要。
Visual Studio AngularJSでビルドが遅い

Web開発をしていてビルドがだんだん重くなってしまい、一回のビルドで１分ぐらいかかっていた。

改善した内容
１．Lessをコンパイルしていた。
前

```
<link rel="stylesheet/less" type="text/css" href="Content/bootstrap-theme.less">'
```
↓
後

```
<link rel="stylesheet" type="text/css" href="Content/bootstrap-theme.min.css">
```

ビルド時にすべてのlessファイルをコンパイルするので当然cssで指定しておく。


２．Watch数
Web上でExcelのようなTable形式を扱う場合、どうしてもWatch数が多くなる。これを
VirtualScrollを使ってWatch数を固定化した。Watch数500以内に抑えるとサクサク動く。
使ったのはコレ
http://kekeh.github.io/vsscrollbar/
![image.png](https://qiita-image-store.s3.amazonaws.com/0/118025/6f436ed8-b842-d276-6695-25f300074399.png)

３．TortoiseSVNを使っていたのだが、これはそこまで原因ではなかった。
VisualStudio上で
Tool→Options→SourceControl→でNoneに設定すると少しだけ早くなった。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/118025/281a9c31-b2bf-5ac7-1eba-1f60cea6ce45.png)
【初心者向けシリーズ】html隙間問題の確認箇所

# htmlなぜか隙間が埋まらない時に確認したい備忘録
疲れ過ぎている時、眠い時、そもそも技術がない時期。必ずぶち当たる壁をぶち壊すための備忘録

## その１.「cssリセットしてる？」
htmlはタグがものすごく個性的なので、サクッとそのまま使うことはなかなかできない。
基本装備でmarginやpaddingが入っていることが多いにあるのでそいつらを取ってあげることが、彼らと仲良くなる第一歩。でもタグの個性がちょっとまだよくわからないうちは下のように、使うタグ全てのmarginとpadding、ついでにbox-sizingも指定しとくととりあえずよくわからない隙間は開かない。



```css

*,html,body,ul,li {
 margin: 0;
 padding: 0;
 box-sizing: border-box;
}
```

## その２.「改行してない？」
改行も１文字分の隙間が空くんですねー。もしよくわからない隙間が空いている場合は改行を無くしてみよう。

```html
//before
<ul>
 <li>hoihoi</li>
 <li>hoihoi</li>
 <li>hoihoi</li>
</ul>

//after
<ul>
 <li>hoihoi</li><li>hoihoi</li><li>hoihoi</li>
</ul>
```

## その3.「その画像、ちょっと上にあるんじゃない？」
画像あるあるです。いくつもの画像を縦に並べてると下に隙間が空いて「あれ、ちょっとまってmargin聞かせてないんだけど」と、なりがち。そういうときは大抵`verticlal-align`が邪魔をしてるぞい。
基本が確かbaselineになってるから、bottomまでの隙間が見えてしまってるんだよね（あとで参考画像をはるよ）。だから、bottomに指定し直せばok。画像にかかわらずなんか下に隙間空いてるなってときは一旦試してみるべき。

```html
//html
<img class="sample" src="haha.png">
```

```css
//css
.sample {
 vertical-align: bottom;
}
```
#まとめ
昔は隙間のせいであうあう言っていたなーと思いつつ。質問も多いなーと思いつつ。
modalPresentationStyleにoverCurrentContext を指定してもステータスバーの色を変える方法


よくわからない題名になりました。

```swift
 modalPresentationStyle = .overCurrentContext
```

```swift
 modalTransitionStyle = .crossDissolve
```

などを指定して、 **元の画面を見せながら透過のUIViewController(viewのbackgroundColorのalphaを1未満に指定など)を表示させるケース** はUIによってはあると思うのですが、上記を指定した状態でステータスバーの色を変えようと思っても変わらないのではまらないようにしましょうという話です。(20分くらいplistの設定とか色々見てしまった。。)


親のViewControllerのステータスバーが例えば `UIStatusBarStyle` に `lightContent` などを指定している際に、

```swift
    open func present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Swift.Void)? = nil)
```

で表示したいUIViewControllerなどに

```swift
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .default
    }
```

を指定するだけではステータスバーの色は変わりません。

```swift
 UIApplication.shared.statusBarStyle = .lightContent
```

などを `viewWillAppear` でコールしても勿論変わりません。

**.overCurrentContext** を指定しているわけですから。

そういう時には、

```swift
modalPresentationCapturesStatusBarAppearance = true
```

を指定してあげれば解決します！
何気に長い間iOS開発をしてきてこのプロパティ初めて使いました・・・。

```swift
    // This controls whether this view controller takes over control of the status bar's appearance when presented non-full screen on another view controller. Defaults to NO.
    @available(iOS 7.0, *)
    open var modalPresentationCapturesStatusBarAppearance: Bool
```

久々の投稿でした。

[約2年のiOSアプリ開発で実際に使ったライブラリとそこから得られた知見](https://qiita.com/Kyam28/items/4653cadef7e196ae221c)

これを書いてから２年ほど経ったので、また同じようなものをSwift版でがっつり書こうと思います！
Kubernetes Tips: kubectl でマニフェストの雛形を作る

kubectl run のドライラン(`--dry-run`)と yaml 表示(`-o yaml`)を組み合わせると生成されたマニフェストを標準出力に表示することができます。シェルの履歴等を使えば簡単に実行できるので、Kubernetes で yaml のマニフェストを素早く作成したい場合に便利です。

```
$ kubectl run mydeploy --image nginx -o yaml --dry-run
```
```yaml
# 若干ゴミ(creationTimestamp など)が残るで削除する
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    run: mydeploy
  name: mydeploy
spec:
  replicas: 1
  selector:
    matchLabels:
      run: mydeploy
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        run: mydeploy
    spec:
      containers:
      - image: nginx
        name: mydeploy
        resources: {}
status: {}
```

なお各リソースの細かい設定値を調べたいときは [kubectl explain](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#explain) が便利です。

```
$ kubectl explain deployment.spec.template.spec
```
```
KIND:     Deployment
VERSION:  extensions/v1beta1

RESOURCE: spec <Object>

DESCRIPTION:
     Specification of the desired behavior of the pod. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status

     PodSpec is a description of a pod.

FIELDS:
   activeDeadlineSeconds        <integer>
     Optional duration in seconds the pod may be active on the node relative to
     StartTime before the system will actively try to mark it failed and kill
     associated containers. Value must be a positive integer.
...
```

## 各リソースの雛形用コマンド

**Deployment**

```bash
kubectl run mydeploy --image nginx -o yaml --dry-run
```

**Pod** 


```bash
# --restart=Never を付けると Pod になる
kubectl run mypod --restart=Never --image nginx -o yaml --dry-run
```

**Job**

```bash
# --restart=OnFailure を付けると Job になる
kubectl run myjob --restart=OnFailure --image ubuntu -o yaml --dry-run -- echo hello
```

**CronJob**

```bash
# --schedule を付けると CronJob になる
kubectl run mycron --schedule "1 * * * *" --image nginx -o yaml --dry-run  
```

**Service**

```bash
kubectl create svc clusterip myapp --tcp 80 -o yaml --dry-run
```

**ConfigMap**

```bash
kubectl create cm mycm --from-literal mykey=myval -o yaml --dry-run

# --from-file でファイルを指定した場合ちゃんとインデントしてくれる
kubectl create cm mycm --from-file myfile.yaml -o yaml --dry-run
```

**Secret**

```bash
# 値は base64 エンコードされているので編集に注意
kubectl create secret generic mysecret --from-literal mykey=myval -o yaml --dry-run
```

**ServiceAccount**

```bash
kubectl create serviceaccount mysc -o yaml --dry-run
```

**ClusterRoleBinding**

```bash
kubectl create clusterrolebinding myclusterrolebinding --clusterrole=edit --serviceaccount default:mysc -o yaml --dry-run
```

**RoleBinding**

```bash
kubectl create rolebinding cluster-admin-binding --role=edit --serviceaccount default:mysc -o yaml --dry-run
```

**PodDisruptionBudget**

```bash
kubectl create pdb my-pdb --selector=app=nginx --min-available=1 -o yaml --dry-run
```
RaspberryPiでopenFrameworksを使う～第２章

------

* [インストール編](https://qiita.com/felis_silv/items/2da88d3d7e9e4f3868f3)
* 簡単なアプリを作ってみる ←いまここ
* RaspberryPiのGPIOも使ってみる（次回執筆予定）

------
#簡単なアプリを作ってみる
前章でインストールしたopenFrameworksを使って、早速、簡単なアプリを作って見ましょう。

##プロジェクトを作る
openFrameworksのプロジェクトを生成するために、projectGeneratorというツールが作られたのですが、残念ながらRaspberryPiの環境ではうまく動かないようなので、レガシーな方法でいきます。

プロジェクトは、openFrameworksの中のapps/myApps/に置きます。

```sh
cd ~/openFrameworks/apps/myApps
cp -r emptyExample hello_of
cd hello_of
```

これで、hello_ofという名前のプロジェクトができました。早速、プロジェクトディレクトリの中身を見てみましょう。

```
config.make ・・・・ビルドに必要な諸々の追加設定
emptyExample.png・・不要
Makefile・・・・・・所謂makeファイル
README.md ・・・・・不要
src ・・・・・・・・ソースファイルを置く場所
┣ main.cpp ・・・・main関数
┣ ofApp.cpp・・・・アプリの実装
┗ ofApp.h・・・・・ヘッダファイル
```

ソースファイルの類はすべてsrcディレクトリに入れれば、自動的に、コンパイル、リンクが行われます。

## openFrameworksの基本
基本となるのはofApp.cppの中にあるたった三つのメソッドです。
![flow.png](https://qiita-image-store.s3.amazonaws.com/0/105792/20315137-d57a-8982-7bf7-2a90b4d72951.png)
アプリ起動直後にofApp::setupが呼び出され、その後、ofApp::updateとofApp::drawが、画面の垂直同期のタイミングに合わせて繰り返し呼び出されます。

## 丸を描いてみる
src/ofApp.cppの中には、空のメソッドがすべて用意されているので、ここに書き足して、画面に丸を描いてみます。

```c++:src/ofApp.cpp
void ofApp::draw(){
    // 画面全体を黒く塗りつぶす
    ofClear(0, 0, 0);
    // 水色
    ofSetColor(0, 255, 255);
    // 塗りつぶし
    ofFill();
    // 円を描く
    ofDrawCircle(300, 300, 100);
}
```

ビルドして実行してみます。

```sh
make
cd bin
./hello_of
```

はい、できました。終了するにはCtrl+Cを押します。

![IMAG3718.png](https://qiita-image-store.s3.amazonaws.com/0/105792/d733d1fb-62d0-73c7-49c5-61da6f96be0f.png)

## インタラクションな感じにしてみる

丸を描いただけではつまらないので、ちょっとインタラクションな感じにしてみましょう。

マウスやキーボードのイベントは、それぞれのコールバック関数で受け取ります。

```
ofApp::keyPressed ・・・キーボードが押された時
ofApp::keyReleased・・・キーボードが離された時
ofApp::mouseMoved ・・・マウスが動いた時
ofApp::mouseDragged ・・マウスがドラッグされた時
ofApp::mousePressed ・・マウスのボタンが押された時
ofApp::mouseReleased・・マウスのボタンが離された時
```

では実際にちょっと書いてみましょう。

```C++:src/ofApp.h
    private:
        float v, y;
```

```c++:src/ofApp.cpp
void ofApp::setup(){
    // 初期位置
    y = 100;
    v = 0;
}

void ofApp::update(){
    // 座標を更新
    v += 1;
    y += v;
    // 着地したら止まる
    int bottom = ofGetHeight()-100;
    if (y > bottom) {
        y = bottom;
        v = 0;
    }
}

void ofApp::draw(){
    ofClear(0, 0, 0);
    // 円を描く
    ofSetColor(0, 255, 255);
    ofFill();
    ofDrawCircle(300, y, 100);
}

void ofApp::keyPressed(int key){
    // スペースキーが押されたら跳ねる
    if (key == ' ') {
        v -= 50;
    }
}
```

スペースキーを押すと水色の丸がぴょんぴょんします。
Postman Test Script で HTMLをDOM検査

```javascript
pm.test("FORMタグのaction属性確認", function () {
    // ライブラリ読み込み
    const cheerio = require('cheerio')

    // HTML読み込み
    const $ = cheerio.load(pm.response.text());

    // Consoleログに出してみる
    console.log($('form').attr('action'));

    // form.actionの値を確認
    pm.expect($('form').attr('action')).to.equal("/post/edit");
});
```

参考： https://www.getpostman.com/docs/v6/postman/scripts/postman_sandbox_api_reference

`pm.expect` のAPIについては、下記のドキュメントを参考に
http://www.chaijs.com/api/bdd/
Amazon Elastic File System（Amazon EFS）に触ってみた

# Amazon Elastic File System とは

- AWS上で利用可能な共有ファイルストレージ
- 東京リージョン（ap-northeast-1）では、2018年07月リリース予定

# 今回やること

- EFSの作成
- EFSのマウント
- EFSのアンマウント

# 前提条件

- 東京リージョンリリース前のため、バージニア北部（us-east-1）リージョンを使用。
- EFSを作成するVPCは作成済み。
- EFSをマウントするEC2は作成済み。

# 手順

## EFSの作成

### EFSの接続設定（Step 1: Configure file system access）
1. 作成先のVPCを選択します。
1. 作成するマウントターゲットを選択します。
  - IPアドレス、セキュリティグループの指定が可能ですが、今回はデフォルトで作成します。

### オプション設定（Step 2: Configure optional settings）
1. Nameタグを設定します。
1. パフォーマンスモード（General Purpose、Maz I/O）を選択します。  
※[パフォーマンスモードの詳細についてはAWSドキュメントを参照してください。](https://docs.aws.amazon.com/ja_jp/efs/latest/ug/performance.html#performancemodes)
1. データを暗号化する場合は[Enable encryption of data at rest]をチェックし、暗号化設定をします。

### 設定確認（Step 3: Review and create）
1. 設定内容を確認し、[Create File System]をクリックして作成を実行します。
1. 次画面で[Mount targets]の[Life cycle state]が "Available" になったら使用可能です。

## EFSのマウント

### EFSのセキュリティグループ設定
EFSに設定するセキュリティグループは、マウントするEC2からの2049番ポートを開放する必要があります。
<img width="560" alt="2018-06-19_15h39_39.png" src="https://qiita-image-store.s3.amazonaws.com/0/131204/845d8e82-152c-bdfd-588b-9cf902444fd7.png">

### EC2でマウント

基本的にはマネジメントコンソール内の[Amazon EC2 mount instructions]に従って進めることで簡単にマウントができます。
<img width="855" alt="2018-06-19_16h31_51.png" src="https://qiita-image-store.s3.amazonaws.com/0/131204/cc3e406b-5253-a6ea-aeb2-de47e45c684d.png">


1. amazon-efs-utilsをインストール  
```
sudo yum install -y amazon-efs-utils
```  
※ある程度新しいAmazon Linuxであれば最初からインストールされているようです。
1. マウントポイントを作成  
※今回は/mnt/efsをマウントポイントとします。  
```
sudo mkdir -p /mnt/efs
```
1. マウントポイントにEFSをマウント  
```
sudo mount -t efs -o tls [File System ID]:/ [マウントポイント]
```  
※[File System ID]は、マネジメントコンソールから確認してください。  
<img width="404" alt="2018-06-19_16h24_24.png" src="https://qiita-image-store.s3.amazonaws.com/0/131204/9fb72b42-591f-678c-29b0-58e8ba927f18.png">  
ここでエラーになる場合は、セキュリティグループの設定が漏れている可能性があります。    
1. dfコマンドでマウント確認  
```
df -h
```  
Sizeが異常に大きい（8.0E=8エクサバイト！）ディスクがマウントされていれば、マウント成功です。 
<img width="494" alt="2018-06-19_16h27_57.png" src="https://qiita-image-store.s3.amazonaws.com/0/131204/30161d54-5809-cb9f-57e7-68861625925b.png">

### 常時マウント設定

これだけだとEC2を再起動した時にマウントされないので、自動でマウントされるように設定します。

1. マウント設定ファイル（/etc/fstab）に追記する  
```   
[アベイラビリティゾーン].[EFSのDNS Name]:/ [マウントポイント] nfs4 defaults 0 0
```  
※[EFSのDNS Name]は、マネジメントコンソールから確認してください。
<img width="854" alt="2018-06-19_17h08_49.png" src="https://qiita-image-store.s3.amazonaws.com/0/131204/8af3c1b8-050b-67ee-1c24-dda7860be4c7.png">  
1. マウント  
```
sudo mount -a
```
1. dfコマンドでマウント確認  
```
df -h
```  

## EFSのアンマウント

- 以下のコマンドを実行します。  
```
sudo umount -l [マウントポイント]  
```  

# 参考

- [
AWS ドキュメント：Amazon Elastic File System (EFS)ユーザーガイド](https://docs.aws.amazon.com/ja_jp/efs/latest/ug/whatisefs.html)
- [AWS ドキュメント：DNS 名を使用して Amazon EC2 にマウントする](https://docs.aws.amazon.com/ja_jp/efs/latest/ug/mounting-fs-mount-cmd-dns-name.html)
- [
AWS ドキュメント：ファイルシステムを自動的にマウントする](https://docs.aws.amazon.com/ja_jp/efs/latest/ug/mount-fs-auto-mount-onreboot.html)
Elixirで一千万行のJSONデータで遊んでみた

この記事は「[fukuoka.ex x ザキ研 Advent Calendar 2017](https://adventar.org/calendars/2873)」の3日目です。

昨日は @Takeshi-Kogu さんの[「ElixirでExcelと同様のデータ処理をしてみた」](https://qiita.com/Takeshi-Kogu/items/b615bc807a02eee19d7a)でしたね。

## はじめに
季節外れのアドベントカレンダーということで，「fukuoka.ex x ザキ研 Advent Calendar 2017」が6月18日から行われています。
今回は，その3日目の記事をElixir初心者の@zuminが書いていきたいと思います。

先日，6/16に開催された [Erlang & Elixir Fest 2018](https://elixir-fest.jp) に参加してきました。
そこで，初心者向けハンズオンが開催され[資料](https://github.com/ohr486/ErlangElixirFestHandsOn)が公開されています。

ハンズオンの内容は，Elixirで並行プログラミングをやってみようというもので，一千万行のJSONデータが用意されていました。(一千万行もあると`457.9 MB`にもなるんですね...)
そこで，最後の応用問題に

- 3種類の実装方法について「CPU，メモリ使用量，処理時間」を比較してみましょう。

とあるので，やってみようと思います。

## 動作環境
- macOS High Sierra 10.13.5
- MacBook Pro Retina 13-inch Mid 2014
- CPU 2.6 GHz Intel Core i5
- メモリ 16GB
- Elixir 1.6.4 (compiled with OTP 20)

## ソースコード
実装方法については，[ハンズオン資料](https://github.com/ohr486/ErlangElixirFestHandsOn/wiki)にあります。
JSONファイルも同様に[ハンズオン資料内](https://github.com/ohr486/ErlangElixirFestHandsOn/wiki/1_1.基本問題概要)で提供されています。

```Elixir:lib/basic.ex
defmodule Basic do
  def q1 do
    "data.json"
    |> File.stream!
    |> Enum.map(fn d -> Poison.decode!(d) end)
    |> Enum.filter(fn d -> d["age"] <= 20 end)
    |> Enum.count
  end

  def q2_1 do
    "data.json"
    |> File.stream!
    |> Stream.map(fn d -> Poison.decode!(d) end)
    |> Stream.filter(fn d -> d["age"] <= 20 end)
    |> Enum.count
  end

  def q2_2 do
    "data.json"
    |> File.stream!
    |> Flow.from_enumerable
    |> Flow.map(fn d -> Poison.decode!(d) end)
    |> Flow.partition
    |> Flow.filter(fn d -> d["age"] <= 20 end)
    |> Enum.count
  end
end
```

## 実行結果
まずはコンパイル。

```zsh
$ mix compile
```

そして，以下のように実行しました。

```zsh
$ /usr/bin/time mix run -e "Basic.q1"
$ /usr/bin/time mix run -e "Basic.q2_1"
$ /usr/bin/time mix run -e "Basic.q2_2"
```

||real|user|sys|消費メモリ
|---|---|---|---|---
|q1|78.10 s|68.34 s|9.75 s|2.6 GB
|q2_1|69.23 s|64.12 s|1.62 s|28 MB
|q2_2|45.60 s|116.39 s|6.49 s|45 MB

遅延処理を行うか行わないかによる消費メモリの差がとても大きいものとなりましたね。

## 終わり
Elixirで一千万行のJSONファイルをパースしてfilterするとこんな結果となりました。
2コア4スレッド CPUでも，実行速度には結構な差がでる結果となりました。
また，遅延処理を行うことによるメモリ消費量についても大きな差がでることが分かりました。

||real|user|sys|消費メモリ
|---|---|---|---|---
|通常|78.10 s|68.34 s|9.75 s|2.6 GB
|遅延処理|69.23 s|64.12 s|1.62 s|28 MB
|並行処理|45.60 s|116.39 s|6.49 s|45 MB

Elixirで関数型言語に初挑戦しましたが，オブジェクト指向言語とはまた違った面白さを少しずつ感じながらやっていっています。
これからどんどん踏み込んだ内容をやっていきたいですね。


## おまけ
もとのJSONファイルだと`JSON.parse`ができなかったので，配列の形にしてパースできるようにしています。

- ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]

```Ruby
require 'json'

data = File.read('data.json')
results = JSON.parse(data)
under_twenty = results.select{ |result| result['age'] <= 20 }
under_twenty.count
```

|real|user|sys|消費メモリ
|---|---|---|---
|65.66 s|60.05 s|3.66 s|4.0 GB

メモリは，遅延処理を行っていない場合のElixirよりもだいぶん消費していますが，実行時間に関しては結構いい勝負をしていますね。
Rubyでの遅延処理や並行処理は，そのうち...

明日は @zacky1972 さんの「ZEAM開発ログ v.0.2.0 Node.js と同じ原理の軽量コールバックスレッドを Elixir に実装してみた (背景編)」です。お楽しみに。
Swiftでplistを読み込む

# Swiftでplistを読み込む

iOSのアプリ開発していて、定数どこに書こうか迷ったというはなし。

## 結論
この記事を書いている時点（2018年6月19日現在　xcode 9.4.1, swift 4, ios 11.4）
色々考えたけどとりあえずリテラルな定数についてはplistでやる。

## 理由
- plistってproperty listの略だからプロパティはなんでもそこに書いておけばいい気がした

## 方針
1. プロジェクト直下にpropertiesグループを作成
1. グループないにplist作成（ただしinfo.plistは他人が見たときにどこいったかわからなくなるので移動しない）
1. カテゴリーごとにplist作ったほうがいい気がする

##方法
- ↓のようなPlist作成する（APIアクセスに関するプロパティリスト）
<img width="672" alt="スクリーンショット 2018-06-19 17.40.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/265224/916d7932-c39e-c91d-c336-3a7d06b02043.png">
- ↓みたいなコードでplistを読み込む

```swift
if let urls = Bundle.main.path(forResource: "ApiURL", ofType:"plist" ) {
  let plist = NSDictionary(contentsOfFile: urls) as! Dictionary<String, Any>
}
```

NSDictionaryを介さないでやる方法を調べたのだけど、パッと出てこなかったのでとりあえずこれで。
Googleスプレッドシートのシート移動のショートカット（Mac,HHKB）

HHKB使っててスプレッドシートのシート移動の仕方がよくわからなかったのでメモ。

次のシートへ、
`cmd + shift + PgDn(Fn + >)`

前のシートへ、
`cmd + shift + PgUp(Fn + L)`


## 困ったらヘルプを見る

`cmd + /`

でヘルプが見れるのでヘルプみてがんばりましょう。

（シート移動のショートカットを手当たり次第試してたらヘルプがでてきたのです）

公式のサイトでは、
`cmd + shift + Fn + ↑`

とか書かれてたんだけど、
↑や↓ってページダウンのことなのかしら・・・

プンプンですよ。

https://support.google.com/docs/answer/181110?hl=ja&co=GENIE.Platform%3DDesktop


![スクリーンショット 2018-06-19 17.48.33.png](https://qiita-image-store.s3.amazonaws.com/0/186346/fac214f7-1c8d-3158-f146-bc23aee48baf.png)
【Docs】Windows Subsyetem for Linux の Ubuntu （Bash on Ubuntu on Windows）導入から Ruby on Rails 開発環境導入までの流れ

# 【概要】
　Windows10にUbuntuを導入しRailsおよびそれに付随する環境を整えるときに参考に**した**文書のリンク集です。これらの文書を参考にすることで不足なく（過不足なくではない）環境を構築することに成功しました。
　半分自分用。
　なお、環境構築を実際に行った時期は**2018年1月**のことなので現在では手続きが変わっている可能性があります。

# 【手順】
　基本的に上から順に書いてある通りにやればできました。

## 1. Bash on Ubuntu on Windows
-  [Windows Subsystem for Linuxとは？ そのインストールと使い方](https://www.buildinsider.net/enterprise/wsl/01#wslinstall)
- storeからUbuntuをダウンロード
- [リポジトリの変更](https://qiita.com/Aruneko/items/c79810b0b015bebf30bb)

## 2. rvbenv / Ruby
- [windowsのbashでRails環境を構築してみる。（Windows 10 Anniversary Update版）](https://qiita.com/chimame/items/8130aa2c07a152a865b1)

## 3. rails
- 先に以下のコマンドを実行

```sh
sudo apt install nodejs
sudo apt install libsqlite3-dev
```
- [Bash on Ubuntu on Windows で Rails/PostgreSQL の開発環境を構築する [Creators Update 編]](https://qiita.com/yusuke_konishi/items/bb99faceada542ce2017)

## 4. 各種gem
- rmagick
    * [Cloud9でRMagickのインストールにつまづいたのでメモ](https://qiita.com/a-ta/items/5905b9e97d801597f889)

## 5. mysql
- [BashOnUbuntuOnWindowsでMySQLを起動させる。](https://qiita.com/akahirout2641/items/047a0f01a051691637dc)
- [Ubuntu で MySQL](https://qiita.com/kojionilk/items/bdace886c3664d75c5f7)

## 6. Node.js
- [Ubuntuに最新のNode.jsを難なくインストールする](https://qiita.com/seibe/items/36cef7df85fe2cefa3ea)

## 7. redis
- [UbuntuにRedisをインストールしてCLIで基本的なコマンドを実行する](http://linuxserver.jp/%E3%82%B5%E3%83%BC%E3%83%90%E6%A7%8B%E7%AF%89/db/nosql/redis/redis-server-on-ubuntu)

# 【補足】
　Node.jsを入れるならnodenvを使えばバージョン管理が可能になり、rbenvとnodenvを両方使うならanyenvを入れたほうが手間がかからない。
EKSで作成されたロードバランサにACMで発行した証明書を当てる


# 概要
EKSによって作成されるロードバランサにACMで発行した証明書を適用して、HTTPSなアプリ（サイト）にする

EKS : Amazon Elastic Container Service for Kubernetes
ACM : AWS Certificate Manager


# EKSがロードバランサを作成？

EKSというかKubernetesというか、あいつらが裏側でいろんなAWSリソースを作成するような仕組みになってます。

ロードバランサやらENIやら、いろいろと作られるっぽい。

その作成権限を与えるために、クラスタ作成時にIAMロールを選択しますよね。

> Select the IAM Role to allow Amazon EKS and the Kubernetes control plane to manage AWS resources on your behalf.
> 
> あなたの代わりにEKSやKubernetesがAWSリソースを管理できるようにするために、IAMロールを選んでね。

<img width="827" alt="スクリーンショット 2018-06-19 16.03.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/213486/d9911c25-7580-e750-a025-d8aa35709a40.png">


# 作成された時点でのロードバランサ

こんな感じでマニフェストからserviceを作るとする。

```
$ kubectl create -f service.yml
```

```yaml:service.yml
kind: Service
apiVersion: v1
metadata:
  name: eks-service
spec:
  type: LoadBalancer
  selector:
    app: rails-api
  ports:
  - protocol: TCP
    port: 80
    targetPort: 3000
```

serviceが作成された時点で、EKSによりロードバランサが作られる。

それを確認すべく、以下のコマンドを打つ。

```
$ kubectl describe services
```


こんな項目を見つける

```yaml
LoadBalancer Ingress: xxxxxxxxxx.us-east-1.elb.amazonaws.com
```




`xxxxxxxxxx.us-east-1.elb.amazonaws.com` がアプリのエンドポイント。

ブラウザに貼り付けてEnterしてみると

```
http://xxxxxxxxxx.us-east-1.elb.amazonaws.com
```

で繋がっていることが確認できると思う。

# http が許されるのは小学生までだよね

って言われそうなので `https` を使うことにします。

serviceのマニフェストを変更する。

```yaml:service.yml
kind: Service
apiVersion: v1
metadata:
  name: eks-service
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: <ACMで作成した証明書のARN>
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443"
spec:
  type: LoadBalancer
  selector:
    app: rails-api
  ports:
  - protocol: TCP
    port: 443
    targetPort: 3000
```



- ACMで作成した証明書をロードバランサに適用
    - あらかじめ作成しておいてください
- ロードバランサより内側での通信はhttpで行う
    - プライベートサブネットにインスタンスを置いている場合などはこんな感じの設定でOK
- 443ポートでhttpsな通信を受け付ける



# 感想

- kubernetesの公式サイトをちゃんと見ていない僕「手動で証明書適用しないとだめなのかな...」
- kubernetesの公式サイトをちゃんと見たあとの僕「全部書いてるやん！！！」


手動で頑張らなくて良い証明書の当て方は[kubernetesの公式](https://kubernetes.io/docs/concepts/services-networking/service/)にありましたとさ。

"**SSL support on AWS**" って見出しところ。


マニフェストに記述するだけで済んで楽でした。

まだベータ版なのかな？ というところがちょっと気になりポイント。


# 最後に

なんだかんだ公式が最強なので英語だけど頑張って読みましょう。
~~僕はGoogle翻訳使いまくってるけど~~
000webhost 502 Bad Gatewayが出る問題

##502 Bad Gatewayとはなにか調べよう

英語での検索方法としては、

>502 Bad Gateway 000webhost

で良いでしょう。
ここらへんがよい案でしょうね。
https://www.000webhost.com/blog/fix-502-bad-gateway-error

>Not to worry though, the 502 Bad Gateway error affects a large portion of the internet including big services such as Google, Twitter and so on. Free web hosting by 000webhost isn’t an exception.
Most times, this error usually resolves itself in a few minutes, but if it doesn’t go away, we show you exactly how to troubleshoot and fix it.
That out of the way, grab yourself a hot mug of coffee and let’s get this over and done with.

ここらへんが答えになるでしょうね。
これは、これは、まずは問題ではないよと、ちょっと待っておけばなおるとのことですね。

##たしかにちょっとまっていると回復して通常通り動いた
５分もしなかったかな　待っていたら、サーバーがまた動き出しました。
これが無料のだとこうだのあーだのって差のなんだとわかりました。
【iOSアプリ開発本の決定版】iOSアプリ開発デザインパターン入門発売しました

こんにちわ。今日行きつけの整体師に君は日本の宝だと言われました、宝系エンジニアのばーちーです。ついに今日私自身の初著作「iOSアプリ開発デザインパターン入門」をインプレスR&Dさんから出版しました。
https://www.amazon.co.jp/dp/4844398326

## 本書の目的
本書の目的はMVC やMVVM などと呼ばれるiOS アプリケーション開発をするために必要な設計を学ぶことです。 私は前職などで、インターン生などの教育を担当していて、プログラミングのプの字も知らない人に対して、iOSを教えていました。そこで問題意識を持っていたのは、初心者から中級者への壁が高いこと、そしてそれらを橋渡しする良書が日本には存在しないことです。海外の本だと何冊かありますが、日本にはありません。最近では、iOSが初めてのプログラミング経験という方が多く、当然オブジェクト指向などの言葉も知らない人が多いです。コンピューターサイエンス出身であれば授業で学び、JavaやCではこう書くけど、Swiftではどうなんだろうという発想ができますが、iOSが初めてであればオブジェクト思考などは別個で勉強しなければいけません。しかし、本屋に並んでいるオブジェクト思考の本は、CやJavaで書かれた本で、iOSではありません。しかし、オブジェクト思考が理解できることは中級者になるために非常に大事なステップですし、これが理解できて初めて、Appleが提唱したProtocol指向が理解できると考えています。さらにそこの理解なくしては、MVCやMVVMなどの設計も理解できません。

そのような理由から、某Webサービスや、某プロフラミングキャンプでなどでiOS学んでも、プロダクトを作れるようにならずその先がありません。なので、iOS初心者の方が、スムースに、企業で働くことなく、中級者になる為に必要な知識を体系的にまとめた本を作りました。

## 目次
第1章　前準備 ～おすすめ書籍
第2章　前準備 ～オブジェクト指向とは
第3章　前準備 ～プロトコル指向とは
第4章　前準備 ～入門書には書かれていないが重要なiOS開発Tips
第5章　Model View Controllerデザインパターン
第6章　MVCでタスク管理アプリを作ろう
第7章　Model View ViewModelデザインパターン
第8章　MVVMでGitHubクライアントアプリを作ってみよう

## 想定している読者

 想定している読者は以下のような方々です。

- iPhoneアプリの入門書を一通り読んだが、具体的にどう作っていいかわからない。

- iOS歴6ヶ月未満の方

- iOSエンジニア教育担当の方

## 工夫した事

また、この本の特徴としては、本当に初心者に伝わる文章なのかということに重点をおいたことです。

実際にプログラミングをやったことがない人に対して、iPhoneアプリの入門書を読ませ、その状態でこの本が本当に理解できるかというテストをし、校正を重ねました。

第２冊目に読むべき入門書として最適だと考えています。

ぜひよろしくお願いします。　Amazonから購入可能です！！

https://www.amazon.co.jp/dp/4844398326

## この本をもっとよくする為に

- わかりにくい箇所や間違っている箇所があれば教えてください！

- 私の経験上の話も入っているので、マサカリポイントが多数あります。ぜひマサカリお願いします。事前にここがマサカリにあうだろうなあという点に関して、まず私自身の意見を述べさせていただきます。

[マサカリポイント]

① Storyboardとコードでレイアウトどちらがいいのか。

著者の意見はどちらでも構わない。どちらにもメリットデメリットがあり、大切なことはデメリットに対する自分なりの解決策を持つことです。好きな方を選びましょう。そして郷に入ったら郷に従いましょう。

② frame レイアウト vs Auto  レイアウト

本書の中では、Auto レイアウトの欠点として描画速度が遅いことをあげています。しかしよっぽど凝ったsubViewの多いアプリでなければそこまで違いを感じることはないと思います。しかし描画速度が遅いという事実を認識することは重要です。詳細な情報はAuto Layout絶対殺すマンの星野さんがレクチャーしてくれます。
（[https://twitter.com/lovee](https://twitter.com/lovee)）

著者の意見としては、基本Auto Layout で、subViewの多い画面ではframe レイアウトを検討してもいいんじゃないかということです。



③ 強い攻撃的な言葉でマサカリされると凹みます。優しい言葉でマサカリしてあげてください。



本書がみなさんのiOS力向上に寄与することを強く信じています。

ぜひ買ってね！！



最後にこの本を作るに当たって協力してくれたすべての人に感謝します。

## スペシャルサンクス

- 執筆を手伝ってくれた横田健太

- 編集を手伝ってくれた小松 尚平

- 出版に協力していただいたインプレスR&D様

- イラストを担当してくれたコットリンク（[https://twitter.com/TsumariGracias](https://twitter.com/TsumariGracias)）

ありがとう！！
【ビギナー向け】javascript(DOM)よく使う記述備忘録

# javascriptこれだけは押さえておきたい備忘録
みなさんこんにちは、yuchulです。
今回は、javascriptの『よく使うけど忘れがち』系をまとめました。



## 取得系

### デバックの時に結果を確認する方法
javascriptを使う上で必ず使うのに、時間が空くと時々出てこないことがあるので書いておきます。

```js
//文字列の場合は''又は""で囲う。
console.log('見たいもの');

//変数の場合はそのままでOK。
console.log(sample);

//文字列と変数を混合で扱う場合は+で繋ぐ。
console.log('見たいもの' + sample);

//ES2015(ES6)の場合はこのように書くこともできる
console.log('見たいもの${sample}');
```

### ID取得
DOMを使う上で最もよく使う記述です。

```html
<div id="sample">hogehoge</div>

<script>
 var sample = document.getElementById('sample');
 console.log(sample);
</script>
```

```text:結果
<div id="sample">hogehoge</div>
```

### Class取得
疲れているとsを忘れたり、配列だということをすっかり忘れたりします。

```html
<div class="sample">hogehoge</div>
<div class="sample">hugahuga</div>

<script>
　//IDを取得する突起とは違い、Elementsはsを忘れないようにしましよう。
　var sample = document.getElementsByClassName('sample');

　//classはIDと違い自動的に配列になるので、下のように『何番か』を指定してあげる必要があります。
　console.log(sample[0]);
</sctipt>
```

```text:結果
<div class="sample">hogehoge</div>
```

### 中身取得
タグで囲まれた中身の取得を行います。

```html
<div id="sample">hogehoge</div>

<script>
//一旦IDを取得します（勿論Classでもtagでもいい）
 var sample = document.getElementById('sample');
//IDを取得したら、.で区切りinnerHTMLと記述します
 var sampleInner = sample.innerHTML;

 console.log(sampleInner);
</script>
```

```text:結果
hogehoge
```

### 個数取得
ループ（forなど）を書く時によく用います。

```html
<div class="sample">hogehoge</div>
<div class="sample">hugahuga</div>

<script>
//一旦classを取得します（tagとかでもいい）
var sample = document.getElementsByClassName('sample');
//classを取得したら、.で区切りlengthと記述します
var sampleLength = sample.length;

console.log(sampleLength);
```

```text:結果
2
```

## 条件分岐

###演算子
if文の条件を書く時によく使うので記録

```text
=  //置き換え
== //等しい
!= //等しくない
|| //もしくは
&& //アンド
>  //不等号は省略
```

### if文
初心者が最初に踏み出すイメージがあるif文です。

```js
if(条件式){
    //条件が合っていたらこっちが実行される
}eise{
    //違うとこっちが実行される
}
```

## 回す系

### for文
系っていうか主にこれです


```js
for (var i = 0; i < sample.length; i++){
    //条件が満たされるまで実行
}
```

##置換

###replace
文字の置換をするときに使うやつ。
まずは基本形

```js
var sample = 置換するものがある文章テキストetc.replace(/置換したいもの/g,'置換するもの');
```
もし置換したいものに対して変数を使いたい場合は下のように一旦正規表現に置き換えてから置換処理します。
置換するものに関しては変数を使っても大丈夫です。
(私はつい先ほど置換するものも正規表現に変えてしまってどん詰まりしてました＾＾w)

```js
var ahaha = 'あはは';
var reg = new RegExp(ahaha,'g');
var htmlRep = htmlRep.replace(reg,'おほほ');
```

# まとめ
毎日使ってると忘れないんだけど、どうしてもそういうわけにいかないので書きました。この記事は常に更新していく予定です（今日はもう書くの飽きたよー）
PythonのBeautifulSoupで取得した要素（タグ）の属性値を抽出

# ざっくりと説明
BeautifulSoupを使用していてある得意のinputタグのvalueを抽出する場面が合ったので、備忘録として掲載。

```html:xxx.html
<html>
    <head>
    ・・・
    </head>
    <body>
        選択してください。
         ・・・  
           <input id="data" value="value01">
         ・・・
    <body>
</html>
```

```python:xxx.py
import logging
import requests
from bs4 import BeautifulSoup

url = 'http://hoge/xxx.html'
res = requests.get(url)
soup = BeautifulSoup(res.content, 'html5lib')

# ID「data」を持っているinputタグを抽出
js = soup.find('input',id='data')
# valueの値を抽出
jsonData = js['value']
logging.info(jsonData)
```

## 参考サイト
[取得した要素（タグ）の属性にアクセスする - Rails etc... Memo](http://d.hatena.ne.jp/noazoh/20091212/1260606550)
I/Oと割り込みに関するメモ

http://www.cs.gunma-u.ac.jp/~nakano/OS16/io.html

ちょうどいい説明文を見つけたので、完全にメモです。

>9.2  I/O 機器
>
>I/O機器は機能も速度も多様である。しかし本質的に異なる概念はさほど多くない。
>(つまり幾つかのグループしかない。)
>
>  記憶装置   (disk, MT,..) 
>  送受信装置 (network, modem,..)
>  入力装置   (keyboard, mouse, joystick, pedal,...)
>  出力装置   (screen, printer,..)
>  バス(common bus) 伝送路の集合+プロトコル(例 PCI bus, 90年代まではISA bus, SCSI)
>                   (一度にひとつの機器がバスを使用して通信できる)
>                   USB = Universal serial bus
>                   PCI bus,  PCI Express(PCI=Peripheral Component Interconnect)
>
>各I/O機器は、それぞれデバイスコントローラを持つ。
>(ただし、例外的に、幾つかの機器が、ひとつのデバイスコントローラを共用するものもある。例 SCSI)
>各デバイスコントローラが、計算機本体に物理的に接続する。
>
>デバイスコントローラは、データ用と制御用の幾つかのレジスタ(もしくはバッファ)を持つ。
>各デバイスコントローラに対応して、OSはそのI/O機器用のデバイスドライバを持つ。
>デバイスドライバは、デバイスコントローラのレジスタの読み書きを通して機器を利用する。
>  data-in  register   CPUが機器のデータを得る
>  data-out register   CPUが機器にデータを送る
>  status   register   CPUが機器の状態を得る
>  control  register   CPUが機器に命令を出す/機器のモードを変える。
>
>
>
>例 メモリからI/O機器へのデータ転送の例
>   あるプロセスが大量のデータをI/O機器に書きこみたいとする。
>   プロセスは転送用システムコールを呼ぶ。
>   (カーネルモードに移行し)システムコール中でデバイスドライバを開始する。 
>
>   デバイスドライバはメモリ中の送信用メモリに転送データを書き、
>   デバイスコントローラのコントロールレジスタにI/O機器への転送開始命令を書き込む。
>   システムコール終了。(カーネルモード終了。)
>
>   I/O機器のデバイスコントローラは(計算機本体のCPUを使わずに)バスの利用権を獲得し
>   メモリからデバイスのバッファにデータを取り込む。
>   終了後、デバイスドライバを(割り込みにて)起動。(カーネルモードに移行。)
>
>   デバイスドライバは次のデータを送信用のメモリに上書きし、
>   コントロールレジスタにI/O機器への転送命令を書き込む。
>   システムコール終了。(カーネルモード終了。)
>
>   デバイスコントローラは計算機本体のCPUを使わずに。。。
>   (以下繰り返し。。) 
>
>上記のように、転送するデータが多いときは、CPUを使うことなく、
>I/O機器のデバイスコントローラとメモリ間でデータを転送するしくみであるDMA 
>(ダイレクト メモリ アクセス)を利用する。
>
>Direct Memory Access(DMA)  <==>  programmed I/O(PIO)  
>(CPUを使わずにデータ転送)        (CPUを使ってデータ転送)
>
>I/Oの終了のチェック法には2つの手法がある 
>割り込み (interrupt)                    <=>    **ポーリング (polling) (polling loop)**      
>**I/O機器が終了を割り込みでCPUに知らせる。      (CPUがI/O機器の状態を定期的にチェッ>クする)**       
>(割り込み処理プログラムが起動)                (I/Oの状態bitをチェックする)
>(終了報告がある)                              (終了を問い合わせる)
よく使うVBA関数まとめ

# はじめに
しょっちゅう使いまわすVBA関数をまとめておく
気まぐれに増えます。たぶん。

#シート関連
## シート有無確認

```
' シートの有無を確認
Function IsExistSheet(targetName As String) As Boolean
    Dim ws As Worksheet
    IsExistSheet = False
    
    For Each ws In Worksheets
        If ws.Name = targetName Then
            IsExistSheet = True
        End If
    Next
End Function
```

## 指定したシートを削除
```
' シートを削除
Function DeleteSheet(targetName As String)
    Application.DisplayAlerts = False
    Worksheets(targetName).Delete
    Application.DisplayAlerts = True
End Function
```

#図形関係
## アクティブシートの図形をすべて削除
```
' 図形をすべて削除
Function DeleteAllShapes()
    ActiveSheet.Shapes.SelectAll
    Selection.Delete
End Function
```

#ファイル関係
##フォルダ選択
```
Function GetFolderPath() As String
    'フォルダ選択のダイアログボックスを開く
    Set dlg = Application.FileDialog(msoFileDialogFolderPicker)
    If dlg.Show = False Then Exit Function
    '選択したフォルダのパス名を取得
     GetFolderPath = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1)
End Function
```
## ファイル選択
```
Function GetFilePath() As String
    'ファイル選択のダイアログボックスを開く
    Set dlg = Application.FileDialog(msoFileDialogFolderPicker)
    If dlg.Show = False Then Exit Function
    '選択したファイルのパス名を取得
     GetFolderPath = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1)
End Function
```
yahoo.comで言語を変更する方法

##言語設定を変更する
まずは検索する方法としては、次が好ましいでしょう。

>how to change a language in yahoo.com

この問題が発生したのは、言語選択を行えない状況が起きたためである。

ここのサイトが、step by step でわかりやすく伝えてくれていますね。

https://www.techwalla.com/articles/how-to-change-my-yahoo-account-to-english

なぜか選べないですね。
とりあえず、現地の言語を学ぶ機会ということでOKにしておきましょう。
CSSでfont-sizeの単位はremを積極的に使いたい

#CSSでのフォントサイズ指定
pxを使うと、ブラウザを拡大したときとかにどうやら反映されないらしい。

##じゃあどうする？
- emを使う
    - 親要素のフォントサイズを基準に倍率を指定するため親要素によってはフォントサイズが統一されない。
- remを使う
    - Root要素のフォントサイズを基準に倍率を指定するから使いやすい！

#remってバグがちらほらあるらしい…
remという単位自体が問題というか、ブラウザが悪い。
表示バグは下記

##IEでremが反映されない
IE9以上？（IE8はそもそも対応してない）で :after や :before の疑似要素のline-heightをrem指定すると反映されないらしい。

line-heightはそもそも単位を指定しなければ倍率指定できる。
line-height: 1 とすれば指定した要素のフォントサイズになる。
remを使う必要がないため、問題ない！

##Chromeでhtmlに指定したフォントサイズが反映されない
これはChromeで下記のように指定されたものが反映されないらしい。

```css:sample.css
html {
  font-size: 62.5%;
}

body {
  font-size: 1.4rem;
}
```

こうすると、通常htmlに指定したパーセント指定font-sizeでブラウザのデフォルトサイズから62.5%された値が設定され、bodyではその1.4倍を使うという指定になっている。

しかし、ChromeだとbodyもRoot要素だと判断されるためか、htmlのfont-sizeが無効になり、デフォルトフォントサイズから1.4倍されるらしい。

###回避策

```css:sample.css
html {
  font-size: 62.5%;
}

body {
  font-size: 1.4em;
}
```

bodyのfont-sizeの単位をemに変更することで回避できる。
この場合だけ、remではなくemを使う。

#さいごに
みなさんもこの機会にremを使ってみてみればいかがでしょう？
（IE8対応はしらない）

結構適当に書いたので明らかに間違ってる所があればご指摘おねがいします…
Node.jsでcsvtojsonを使って、csvをJSON形式に変更する

Node.jsでcsvファイルのデータをJSONに変える。

csvtojsonのページにあるようにコードを書く。
[csvtojson](https://www.npmjs.com/package/csvtojson)

```
const csvFilePath='<path to csv file>'
const csv=require('csvtojson')
csv()
.fromFile(csvFilePath)
.then((jsonObj)=>{
    //console.log(jsonObj);
// Async / await usage
const jsonArray=await csv().fromFile(csvFilePath);
```

これで<path to csv file>の部分を自分のファイル名で実行しても、asyncが必要だとかいうエラーが出る。
Node.jsは非同期処理だから、そうしないとダメみたいなことを先輩に言われた。

Node.jsはバージョン7以降で、await/asyncがサポートされているので、そっちに変更する。

必要な部分をすべて書く。

```
var express = require('express');
var router = express.Router();

//csvファイルの読み込み
const csvFilePath='<path to csv file>'
const csv=require('csvtojson')
csv()
.fromFile(csvFilePath)
.then((jsonObj)=>{
    //console.log(jsonObj);
})

const asyncFunc = async function() {
  const jsonArray=await csv().fromFile(csvFilePath);

　　/*
    実際に処理したい内容。
   */

}

asyncFunc();

module.exports = router;
console.log("start server");

```

これでjsonArrayの中にcsvファイルのデータがJSON形式の状態で保存される。
asyncFuncの処理は非同期処理となり、まっさきにconsole.log("start server")が処理される。
その後、非同期で処理が終わればめでたくayncFuncの内容が呼び戻される。
重要なのは、asyncFunkのファンクションの中に処理を書くことだと思う。勉強したばかりでイメージがわかないが、多分それでOK.
pug(jade)とphpの共存備忘録

# pugの中に無理矢理phpを入れないといけなくなったので。
現在開発しているシステムがphpなんですが、なかなか良いプリプロセッサーがなかったことと、普段からpugに慣れ親しんでいるので、今回は思い切ってpugに無理矢理phpをぶち込むことにしました。
(gulp-pugでコンパイルしています)

## まずは基本形
### pug内にphpを書く01
文字を書くときのように縦棒を使ってphpを書く。私はこっちの書き方を先に知ってしまったので、こっちを使っています。

```pug
div.sample
 | <?php echo 'haha!'; ?>
```
↓

```html
<div class="sample">haha!</div>
```

### pug内にphpを書く02
タグの後に.(ドット)を入れることによって以下にphpを記入することができる。
※インデントは中に入れないとエラーになる

```pug
div.sample.
 <?php echo 'haha!'; ?>
```
↓

```html
<div class="sample">haha!</div>
```
## ちょっと積んだ系
### タグ内に入れるとき01
イコールの前に！(ビックリマーク)を入れて、=(イコール)の後と"(ダブルクォーテーション)の前に１つスペースを空ける。そうしないと<>がエスケープされてしまうらしい。

```pug
img(src!= "<?php echo 'hey.jpg' ?>")
```
↓

```html
<img src="hey.jpg">
```
### タグ内に入れるとき02
イコールの後の記述じゃない場合の入れ方がどこをググってもなかったんですが、ノリでこう記述したら行けた。シンプルに"(ダブルクォーテーション)で囲えばOK。
ググっても出てこなかったのでなんかこれ悩んでる人がちゃんとググって出るようにしたいからそれっぽいこと書いておきたいな。
”php pug タグ内に記述　できない”
こんな感じか（独り言）

```pug
img(src!="./hey.jpg" "<?php echo 'heyhey!' ?>")
```
↓

```html
<img src="./hey.jpg" heyhey!>
```

## まとめ
すごい疲れてる時にコーディングしていると、大抵はphp自体の記述ミスだったり、"がコンフリクト起こしていたりしました。そういうミスが起きるときは凄まじく疲れているので寝ましょうー
Javascriptでselenium-webdriverを使ったテスト(メモ)

#はじめに
自分がnode.js環境でwebdriverを使ってテスト書きたいなあと思って調べてみると、意外とJSの記事が少なくて、また触る機会がありそうなのでとりあえずメモ的な形でいくつか残そうかと思い、記事を作りました。
まず、selenium-webdriverをimportしました。

```
webdriver = require('selenium-webdriver')
{By} = webdriver
```


###要素を見つける
classとかテキストから見つけるのが一般的な感じがします。

```
elems ={
 hoge: By.css('.hogeClass') #hogeClassというクラスを見つける
 hogehoge: By.xpath("//div[text()='hogehoge']") #hogehogeというテキストを持つdivを見つける
}
```

###要素の確認
```
@driver.findElement(elems.hoge)
```

###要素をクリックする
```
@driver.findElement(elems.hoge).click()
```

###Inputに書き込んでENTER
```
@driver.findElement(elems.hoge).sendKeys('name', webdriver.Key.ENTER)
```

###マウスを要素の上まで動かす
```
@driver.actions().mouseMove(elems.hoge).perform()
```

###ドラッグアンドドロップ
```
@driver.actions().dragAndDrop(elems.hoge, {x: 150, y: 0}).perform()
```

###要素を数える
(これはあまり自信がない)

```
@driver.findElements(elems.hoge).then (els) => {
  @driver.findElement(By.xpath("//a[text()='hogehoge']")).findElement(By.tagName('hoge')).getText().then (text) => {
    return els.length.toString()
  }
}
```