OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel5.x+Vue.jsを動画で学ぶ

動画便利ですよね。
公式サイトではカバーしきれていないチュートリアルとかを学ぶのに、＋αして動画を見るようにしています。
ちょっとしたコマンドなど、実は文字では書かれていない操作方法などを知るのにもとても良いです。
ただ、時間がかかるので、ちょっと休憩のときに眺める、とかスキマ時間を利用してみています。

今回は、Laravel+Vue.jsです。

**これから勉強しようとして、リンクを集めただけなので、進めていくうちに追記や修正が入る可能性がありますので、ご了承ください。**


# 動画編

## [Josh Larson \- YouTube](https://www.youtube.com/channel/UC2QvDAVVEz_4FT-0tSB8hag)

<img width="1389" alt="Josh Larson" src="https://qiita-image-store.s3.amazonaws.com/0/32215/15b76352-ecc2-e8e6-9805-9217087998df.png">

Laravel5.4での解説がされています
英語が聞き取りやすい


## [Amitav Roy \- YouTube](https://www.youtube.com/channel/UC4gijXR8cM4gmEt9Olse-TQ)

<img width="1390" alt="Amitav Roy" src="https://qiita-image-store.s3.amazonaws.com/0/32215/2f437e58-c321-83b4-ce96-bffccc258059.png">

様々なチュートリアルがあります


## [Hero Sony \- YouTube](https://www.youtube.com/channel/UCgpLotftGfAxGh9yg2CveCg)

<img width="1441" alt="Hero Sony" src="https://qiita-image-store.s3.amazonaws.com/0/32215/ca7d2ca4-babb-1e43-7823-a2259033589f.png">


解説はありません。ひたすら音楽が流れて画面を見る感じです

ソースコードはgitHubに上がっています。
[HeroSony/crud\-vuejs: Insert, update, delete by Vue JS](https://github.com/HeroSony/crud-vuejs)


## [Laravel Video Tutorial \- YouTube](https://www.youtube.com/channel/UCQD4lsZb6FEG0YKDUBRkNfw)

<img width="1352" alt="Laravel Video Tutorial" src="https://qiita-image-store.s3.amazonaws.com/0/32215/bd83e489-010f-4450-6b73-e84bbe2c35c8.png">



基本的に音声はない模様。ひたすら静かに画面を見る感じです
ブログで記事がまとまっています。
[SCode](http://www.hc-kr.com/)



## [Erik Campobadal \- YouTube](https://www.youtube.com/channel/UCPzIhUKtYP0hnOXSNBrGtvw)

<img width="1410" alt="Erik Campobadal" src="https://qiita-image-store.s3.amazonaws.com/0/32215/9c99edef-60c3-c75b-2c20-4cf4f329deb1.png">

英語が聞き取りやすい

しかし、コメントがw

> This is the first tutorial using Vue.js , sorry for a couple of problems during the execution of the tutorial, I'm still learning Vue.js!

今後に期待しましょう。
しかし、それでもどんどん動画で公開してしまうあたりすごいなと思いました。



# 記事編

[Implement a Favoriting Feature Using Laravel and Vue\.js ― Scotch](https://scotch.io/tutorials/implement-a-favoriting-feature-using-laravel-and-vue-js)

Scotchの他の記事も重宝しています。丁寧なチュートリアルです。

[Laravel VueJS \| Learning Laravel](https://learninglaravel.net/topics/vuejs)
[Introduction to vue\.js in Laravel \- Just Laravel](http://justlaravel.com/introduction-vue-js-in-laravel/?utm_source=learninglaravel.net)

[Laravel 5\.4で Vue\.js開発環境を手軽に作る : アシアルブログ](http://blog.asial.co.jp/1496)


# Vue.jsについて

日本語が充実していますね

[はじめに \- Vue\.js](https://jp.vuejs.org/v2/guide/)



また追記編集します。
Github | ラベルの付け外しを間接的に Slack で通知する

# まとめ

- Waffleというサービスを使う。(Slack通知のためのサービスではないが、間接的に通知が実現できる)
- Githubで **「ラベルAを外してラベルBを付ける」** というアクションをおこなった時に、Slackに通知できる。
- その他のアクションは通知できない。
  - (「両方のラベルを付ける」「両方のラベルを外す」「ラベル1個だけの付け外し」など)

# 手順

- [waffle.io](https://waffle.io/) に登録する
- Github のラベルと Waffle のカラムを関連付ける
- Waffle から Slack に通知する

# Github でラベルを2個以上作る

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/e1f6aeed-a916-b5a5-868a-be9eed2051a6.png)



# Waffle と Github レポジトリを連携させる

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/9b6de757-b82b-f996-7702-a61e0c25c8e6.png)

# Waffle と Slackを連携させる

**ProjectSettings** > **Integrations** 

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/ea4cae95-1f11-7644-b0a7-49660c32d0c2.png)

# Waffle で新しいカラムを２個以上作り、それぞれ Githubのラベルと関連付ける

**ProjectSettings** > **Columns** 

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/3f49b941-4702-81d3-3358-c47bfb618add.png)

# Github で ラベルを付け外ししてみる

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/4d883faa-3af0-bac6-f9a1-fb1b758ce9e2.png)


# Slack に通知される

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/8fa2a178-e790-7471-bfd9-c8ae68666f9b.png)

# 参考

- [What kind of information will I see in each Slack notification? | Waffle.io Help Center](https://help.waffle.io/slack-integration/what-kind-of-information-will-i-see-in-each-slack-notification)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
.gitignore が反映されないとき


```
$ git rm -r --cached .
$ git add .
$ git commit -m ".gitignore is now working"
$ git push origin master
```

上記で反映可能。
インデックスが残っているので、全て削除する必要がある。

git push した時に大量なremoveログが出るので焦るが、大丈夫。
MacのRubyのバージョン古い


## MacのRubyのバージョンが古かったので更新します。
###前提条件
 - MacOSSierra
 - Xcode導入済み
 - MacPortが入っていない
 - rvmが入っていない

### インストール
```
xcode-select --install
```
 - インストールボタンを押す
 - Xcodeのコマンドラインツールのダウンロード＆インストール

```
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
 - Homebrewのダウンロード
 - パスワードとか(y/n)とか求められたら、どんどん入力

```
brew doctor
```
 - "Your system is ready to brew."と出ることを願う！

```
brew update
brew -v
```
 - 
```
Homebrew X.X.X (git revision XXXX; last commit XXXX-XX-XX)
Homebrew/homebrew-core (git revision XXXX; last commit XXXX-XX-XX)
```
みたいなことが出てくることを確認

```
brew install rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi' >> ~/.bash_profile
brew install ruby-build
brew install rbenv-gemset
brew install rbenv-gem-rehash
```
 - パスワード、(y,n)とか求められたら、じゃんじゃん入力。

#### ターミナルの再起動
```
rbenv install 2.3.1
rbenv global 2.3.1
```

#### ターミナルの再起動

```
ruby --version
```
UIStackViewを利用して、DropMenuを作る

# はじめに
今更ながら、UIStackView(iOS9〜)を使い始めました。
isHiddenのプロパティを使うと、良い感じにアニメーションできることがわかりましたので、共有します。

# 完成イメージ
![to.gif](https://qiita-image-store.s3.amazonaws.com/0/71694/27e19ef3-6b3c-3400-6718-1dffdbbee37e.gif)

# 実装方針
①StackViewのAxisをVerticalにし、メニューを縦に配置する
②StackViewのDestributonをFill Equallyにし、高さを均一にする
③ボタンの選択に合わせて、メニューのViewのisHiddenをtrue or falseで切り替える

# サンプル
## デザインのイメージ
StackView内にUIViewを縦に配置します。
また、そのUIView内にUIButtonを配置します。

![スクリーンショット 2017-05-15 12.50.07.png](https://qiita-image-store.s3.amazonaws.com/0/71694/70902e04-b170-ec9e-c1e4-160d2fe500c5.png)

## ソースコード
ポイントは、isHiddenをtrue or falseに変える点です。

```swift:ViewController.swift
import UIKit

final class ViewController: UIViewController {

    @IBOutlet weak var selectMenuLabel: UILabel!
    @IBOutlet var menuView: [UIView]! {

        didSet {
            menuView.forEach {
                $0.isHidden = true
            }
        }
    }

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

    /// メニューボタンが選択されたとき
    @IBAction func didTapMenu(_ sender: UIButton) {
        toggleMenu()
        selectMenuLabel.text = ""
    }

    /// 各メニューが選択されたとき
    @IBAction func didSelectedMenu(_ sender: UIButton) {
        toggleMenu()
        selectMenuLabel.text = sender.titleLabel?.text
    }

    func toggleMenu() {
        UIView.animate(withDuration: 0.3) {
            self.menuView.forEach {
                $0.isHidden = !$0.isHidden
            }
        }
    }
}
```
# まとめ
UIStackViewは、レイアウト以外にも色々メリットがありそうですね。
入力画面のバリデーションチェックで、
エラーだった場合に各フォームの付近にエラーメッセージを使う等で
活用しているという事例も聞きました。

完成版のソースコードは、[こちら](https://github.com/stv-ekushida/ios-animating-stackview-demo)です。
TangoでOcclusionを有効にする

Gankino (Version 1.52, April 2017)

## 1. Enable Depth を ONにする 
Tango Manager で Enable Depth のチェックボックスを ON にする．
![スクリーンショット 2017-05-15 18.27.40.png](https://qiita-image-store.s3.amazonaws.com/0/178486/0d1b7c12-5f99-9aa3-7583-691e857640fa.png)


## 2. Enable Occlusion を ON にする
Tango Camera の Enable Occlusion を ON にする．
![スクリーンショット 2017-05-15 18.27.58.png](https://qiita-image-store.s3.amazonaws.com/0/178486/7a0efa62-21f5-25c6-aa18-ebe36849130d.png)

Gankino から `Tango AR Camera` が `Tango Camera` に統一されているので，  `Tango AR Screen` が貼られてなかったら貼る．

## 3. Tango Point Cloud を置く
設定は以下のように．
重要なのは **Update Points Mesh** を ON にすること．  

画像は， Exsiting ADF を Loading するようにしているので， **Use Area Descriptio Pose** が有効になっている．

![スクリーンショット 2017-05-15 18.20.30.png](https://qiita-image-store.s3.amazonaws.com/0/178486/43524eae-6eeb-8dc2-ef7f-55f838a935d0.png)

## 4. できる

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">オクルージョン．<br>HADOはフィールドが広いし，相手チームのプレイヤーまで距離があるので，検出なしが結構出る．出なくても3mくらいからは結構怪しい．<a href="https://twitter.com/hashtag/Tango?src=hash">#Tango</a> <a href="https://t.co/CmlPpjws4Q">pic.twitter.com/CmlPpjws4Q</a></p>&mdash; Izumi Shirosaki (@izugch4423) <a href="https://twitter.com/izugch4423/status/864043899903397888">2017年5月15日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

あまり何もなくだだっ広い空間だとPointCloudがよしなに取得できず，

取得できないだけならいいが
アラートが表示される．

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">腕の長さの距離に敵は居ないなぁ〜． <a href="https://t.co/BDvRA5t90d">pic.twitter.com/BDvRA5t90d</a></p>&mdash; Izumi Shirosaki (@izugch4423) <a href="https://twitter.com/izugch4423/status/864045204076019712">2017年5月15日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

仕様．

> Current devices are designed to work best indoors at moderate distances **(0.5 to 4 meters)**. This configuration gives good depth at a distance while balancing power requirements for IR illumination and depth processing. It may not be ideal for close-range object scanning or gesture detection.
> https://developers.google.com/tango/overview/depth-perception

0.5ｍ〜4ｍ程度が適正範囲．
PHP ファイル 


##**file**
###**file_exists(ファイル名)**
<font color="red">**ファイルorディレクトリが
存在するかどうか調べる**</font>
指定したファイルが存在する場合にはTRUE、
存在しない場合にはFALSEを返す。

###**file_get_contents(ファイル名)**
<font color="red">**ファイルの全体を読み込み、
内容を文字列として返す**</font>

###**file_put_contents(ファイル名, 文字列)**
<font color="red">**文字列をファイルに書き込む**</font>
指定した文字列を、指定したファイルに書き込む。
書き込みを行うファイルが存在しない場合は、新規にファイルを作成する。存在する場合には既存のファイルを上書きする。
基本的に
file_put_contents(ファイル名, json_encode(文字列))
のように使う。
ファイルに書き込む場合は
json_encodeでPHP型の文字列をJSON形式に変換しないといけない。
なぜかというと、
ファイル(なんとか.txt)は
JSON形式だから。

###**json_decode(文字列)**
<font color="red">**JSON文字列を読み解く。
JSON文字列をデコードする。
JSONでエンコードされたデータを、適切なPHPの型として返す。**</font>
decode → 暗号を解く、平文に直す、解読する

###**json_encode(値)**
<font color="red">**値をJSON形式にして返す。**</font>



###**ファイルの読み込み(解説)**
読み込むファイル(.txt)は元々JSON形式で保存されている。
↓
PHPで扱いたい。
↓
PHPで扱える形式に変換する必要ある。
↓
そこで
<font color = "red">json_decode(文字列)</font>
を使う。
↓
<font color = "red">json_decode関数</font>は、JSON形式の文字列を解釈して、
PHPの文字列や配列といったデータに変換する。

###**ファイルの書き込み**
読み込むファイル(.txt)は
元々JSON形式で保存されているため、
メッセージの配列をJSON形式にする。
↓
そこで
<font color = "red">json_encode(値)</font>
を使う。
↓
<font color = "red">json_encode(値)関数</font>は、
値をJSON形式にして返す。

###**ファイル内の文字を表示**

```php
// foreach (配列 as ループ内変数)
foreach ($hitokoto as $value) {
	echo '<p>', $value, '</p><hr>';
}
```

###**投稿されたメッセージをサーバに保存する①**

```php:board-input.php
<p>投稿するメッセージを入力してください。</p>
<form action="board-output.php" method="post">
<input type="text" name="message">
<input type="submit" value="投稿">
</form>
```

```php:board-output.php
<?php
$file = 'memo53.txt';
// ファイルが存在する時だけファイルを読み込む
if (file_exists($file)) {
// file_get_contents(ファイル名)→ファイルの全体を読み込み、内容を文字列として返す
	$board = json_decode(file_get_contents($file));
}
$board[] = $_POST['message'];
file_put_contents($file, json_encode($board));
foreach ($board as $message){
	echo '<p>',$message,'</p><hr>';
}
?>
<button onclick="history.back()">戻る</button>
```



###**投稿されたメッセージをサーバに保存する②**

```php:test53-input.php
</br>How are you feeling today？
</br>Please select one from these four.
</br>・happy ・normal ・lonely ・sick
<form action="test53.php" method="post">
<input type="text" name="mood">
<input type="submit" value="投稿">
</form>
```


```php:test53.php
<?php
$file1 = 'memo54.txt';
if(file_exists($file1)){
// json_decode()→JSON形式をPHPの型で返す
	$hitokoto = json_decode(file_get_contents($file1));
}
$hitokoto[] = $_POST['mood'];
if($_POST['mood'] == 'happy'){
	$hitokoto[] = 'good!';
}else if($_POST['mood'] == 'normal'){
	$hitokoto[] = 'ok';
}elseif ($_POST['mood'] == 'lonely'){
	$hitokoto[] = 'Are you ok?';
}elseif ($_POST['mood'] == 'sick'){
	$hitokoto[] = 'Cheer up!';
}

// file_put_contents(ファイル名, 文字列)
// 指定した文字列を指定したファイルに書き込む
// json_encode()→JSON形式にして返す
file_put_contents($file1, json_encode($hitokoto));
// foreach (配列 as ループ内変数)
foreach ($hitokoto as $value) {
	echo '<p>', $value, '</p><hr>';
}
?>
<button onclick="history.back()">戻る</button>
```

![20170519.png](https://qiita-image-store.s3.amazonaws.com/0/95187/d34e9a04-cc60-7658-1ee6-a0cad00d0f5e.png)
そもそもfigure要素ってなんだ？　～画像・図版表示をしよう～

#figure要素とはなんぞや

HTML4.01からHTML5へバージョンアップする際に追加された新要素。
画像・図版であることを示す際に使用する。

今までは画像を表示するときにこうやって書いていました。

```HTML:HTML4.01以前
<div class="article">
  <div class="img">
    <img src="nori.jpg" alt="フエキ">
    <p id="capition">フエキでんぷんのり</p>
  </div>
    <p>主原材料とうもろこしでんぷん100％、きいろは安心のいろ<br>
    グリーン購入法適合品</p>
</div>
```

##HTML5から採用された「figure要素」を使ってみる

```HTML:HTML5
<article>
  <figure>
    <img src="nori.jpg" alt="フエキ">
    <figcapition>フエキでんぷんのり</figcaption>
  </figure>
    <p>主原材料とうもろこしでんぷん100％、きいろは安心のいろ<br>
    グリーン購入法適合品</p>
</article>
```



とりあえず全部divで囲っておけ精神があったのですが
そろそろ、そうもいかない感じのようです。

HTML5は、より要素自体の細かい情報も加えていこうよ！という印象を感じました。
この辺りはセクションの話につながるのでそっちは後からまとめていこう…
CentOS7.3にPostgreSQL9.6.3をインストールしてみた

## 環境

- OS：CentOS 7.3-1611 64bit Minimal
- PostgreSQL：9.6.3

## インストール

### PostgreSQLのインストール

yumでbaseリポジトリからインストールできないか確認したところ、バージョンが `9.2` と古かったです。

```shell-session
$ yum list | grep postgresql-server
postgresql-server.x86_64                    9.2.18-1.el7               base
```

そのため、[公式サイト](https://www.postgresql.org/download/linux/redhat/)にある通り、リポジトリを追加してからインストールします。

```bash
# pgdg96リポジトリを追加する
$ sudo yum install -y https://yum.postgresql.org/9.6/redhat/rhel-7-x86_64/pgdg-redhat96-9.6-3.noarch.rpm

# PostgreSQLサーバーをインストールする
$ sudo yum install -y postgresql96-server postgresql96-contrib
```

### バージョンの確認

インストールできたかどうか、バージョンを確認してみます。

```shell-session
$ psql --version
psql (PostgreSQL) 9.6.3
```

`9.6.3` と表示されているため、インストールに成功しています。

### 初期化

DBを初期化します。
初期化時にデータベースクラスタというDBの集合体を作成します。

```shell-session
$ sudo /usr/pgsql-9.6/bin/postgresql96-setup initdb
Initializing database ... OK
```

## 操作方法

### サービスの起動

```shell-session
$ systemctl start postgresql-9.6.service
```

### サービスの自動起動

OSの起動時にPostgreSQLが自動で起動するように設定します。

```shell-session
$ systemctl enable postgresql-9.6.service
```

### ユーザーの作成

`psql -l` を実行したところ、ロールが存在しないと怒られてしまいました。

```shell-session
$ psql -l
psql: FATAL: ロール"{ログインユーザー名}"は存在しません
```

DBの初期化時に `postgres` というユーザーが作成されるので、パスワードを設定してログインし、先ほどまでログインしていたユーザーと同名のロールを作成します。

```bash
# `postgres` ユーザーにパスワードを設定する
$ sudo passwd postgres

# `postgres` ユーザーでログインする
$ su - postgres

# `postgres` へ接続する
$ psql
psql (9.6.3)
"help" でヘルプを表示します.

# ロールを作成する
postgres=# create role {ユーザー名} login createdb password '{パスワード}';
CREATE ROLE
```

ロールを作成したら、先程までログインしていたユーザーへ戻し、DBを操作できるようになったか確認します。

```bash
# DBを切断する
postgres=# \q

# `postgres` ユーザーをログアウトする
$ exit
ログアウト

# DBの一覧を出力する
$ psql -l
                                         データベース一覧
   名前    |  所有者  | エンコーディング |  照合順序   | Ctype(変換演算子) |      アクセス権       
-----------+----------+------------------+-------------+-------------------+-----------------------
 postgres  | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | 
 template0 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres
 template1 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres
(3 行)
```

無事操作できるようになりました。

### サービスの停止

```shell-session
$ systemctl stop postgresql-9.6.service
```

### その他の操作方法

DBの作成・接続、テーブルの作成や基本コマンドについてはMac版と同様のため、[こちら](http://qiita.com/uhooi/items/cd6256a72c6a03621c09#dbの作成)をご参照ください。

## 参考リンク

- [PostgreSQL: Linux downloads (Red Hat family)](https://www.postgresql.org/download/linux/redhat/)
- [CentOS 7にPostgreSQL最新版をインストール - 働きたくないゆとりの備忘録](http://www.hack-log.net/entry/2015/04/26/100000)
- [PostgreSQL初期設定 in EC2 - 珈琲駆動開発](http://totutotu.hatenablog.com/entry/2016/04/30/210624)
- [UbuntuでPostgreSQLをインストールからリモートアクセスまでの手順 - Qiita](http://qiita.com/ibara1454/items/40ce2d82926f48cf02bc)
hamlのまとめ

```haml

!!!
%html{:lang => "ja"}
  %head
    %meta(charset="UTF-8")
  %body

    / フィルター
    :css
      .myStyle {
        color: red;
      }
    :javascript
      alert(1);
      if (1) {
        alert(2)
      }

    / 実体参照
    %div
      :escaped
        <html>
        </html>

    / rubyの式評価
    %p total is #{5 * 3}
    %p= Time.now
    - x = 5
    %p= x

    - (1..10).each do |i|
      -# %p= i
      %p{:id => "item_#{i}"} #{i}

    / divの色々な書き方
    %div{:id => "main", :class => "myClass"}
    %div(id="main" class="myClass")
    %div#main.myClass
    #main.myClass

    #main
      .subMenu

    / %を付けると開始・終了タグが付く
    %p
      hello
    %p hello(字下げされない)
    %ul
      %li
        item
      / 小要素の改行を無視する「<」
      %li<
        item
  / bodyの終わり(htmlにも反映される)
  /
    複数行
    複数行
    複数行
  -# コメント(htmlには反映されない)
  -#
    コメント
    コメント
    コメント

```

```html

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
  </head>
  <body>
    <!-- フィルター -->
    <style>
      .myStyle {
        color: red;
      }
    </style>
    <script>
      alert(1);
      if (1) {
        alert(2)
      }
    </script>
    <!-- 実体参照 -->
    <div>
      &lt;html&gt;
      &lt;/html&gt;
    </div>
    <!-- rubyの式評価 -->
    <p>total is 15</p>
    <p>2017-05-12 12:59:59 +0900</p>
    <p>5</p>
    <p id="item_1">1</p>
    <p id="item_2">2</p>
    <p id="item_3">3</p>
    <p id="item_4">4</p>
    <p id="item_5">5</p>
    <p id="item_6">6</p>
    <p id="item_7">7</p>
    <p id="item_8">8</p>
    <p id="item_9">9</p>
    <p id="item_10">10</p>
    <!-- divの色々な書き方 -->
    <div class="myClass" id="main"></div>
    <div class="myClass" id="main"></div>
    <div class="myClass" id="main"></div>
    <div class="myClass" id="main"></div>
    <div id="main">
      <div class="subMenu"></div>
    </div>
    <!-- %を付けると開始・終了タグが付く -->
    <p>
      hello
    </p>
    <p>hello(字下げされない)</p>
    <ul>
      <li>
        item
      </li>
      <!-- 小要素の改行を無視する「<」 -->
      <li>item</li>
    </ul>
  </body>
  <!-- bodyの終わり(htmlにも反映される) -->
  <!--
    複数行
    複数行
    複数行
  -->
</html>
```
そもそもDOCTYPE宣言ってなんだ

#DOCTYPE宣言ってなんだ？
HTMLやXHTMLの文書の一番初めに書かれているDOCTYPE宣言。
\<head>や\<html>の前に書かれているには理由があります。
ブラウザは、まず第一にその文書がどんな言語で書かれているのかを把握する必要があります。
**今からこの仕様で書き始めるよ！**と先に宣言する必要があるわけですね。

#DOCTYPE宣言とは
DOCTYPE宣言とは、
1. この文書がHTMLだよ！
2. このHTMLのバージョンだよ！
3. このDTD（Document Type Definition／文章の構成要素バージョン）に従った記述をするよ！

ブラウザはこの宣言の内容に従って、文書を表示します。
大文字で書いても小文字で書いてもOKです。

#バージョンあれこれ

##HTML4.01
HTML4.01には、3種類の文書型宣言があります。

###HTML4.01 Strict DTD
`<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">`
厳密なDTDです。非推奨の要素・属性が使えません。

###HTML4.01 Transitional DTD
`<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">`
Strictほど厳密ではないDTDです。
非推奨の要素・属性の仕様が可能ですが、フレームは使えません。

###HTML4.01 Frameset DTD
`<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">`
Transitionalにフレームが使えるようになったものです。
個人サイトとかでよく見たアレですね。


##XHTML1.0
HTML4.0と同じようにXHTML1.0にも3種類の文書型宣言があります。

###XHTML1.0 Strict DTD
`<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">`
厳密なDTDです。非推奨の要素・属性が使えません。

###XHTML1.0 Transitional DTD
`<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">`
非推奨の要素・属性の仕様が可能ですが、フレームは使えません。

###XHTML1.0 Frameset DTD
`<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">`
Transitionalにフレームが使えるようになったものです。


##HTML5(2014年10月29日)
`<!DOCTYPE html>`
たったのこれだけ。
HTML5のあっさり感に未だに慣れないですね。


#どうでもいい話ですが
HTMLとXHTMLの違いも知らなかった時代に作った自分のサイトのDOCTYPEがhtmlファイルのはずなのにXHTMLの指定になっていました……
確かDreamWeaverのドキュメント作成でXHTMLという文字列がカッコよくてみたいな感覚で選んだような……
`<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">`
Laravel5のページネーションにBulmaを使用する方法

[UIKitならばライブラリを用いてちょっと楽ができました](http://qiita.com/qwe001/items/dc349b64e2e7c2ff3adb)が、Bulmaはそんなものないので、
自前でゴリゴリ書いてBulma仕様にしなくてはいけません。
その自前で書く時間が惜しい人用に私の書いたソースコードを公開します。
転載自由ですが使用は自己責任でお願いします。

### 実装

### 
ターミナルで以下のコマンドを実行し、必要ファイルを生成します

```terminal
php artisan vendor:publish --tag=laravel-pagination
vim resources/views/vendor/pagination/default.blade.php
```

以下の内容を丸ごとコピペでおｋ

```php:resources/views/vendor/pagination/default.blade.php
@if ($paginator->hasPages())
    <ul class="pagination-list">
        {{-- Previous Page Link --}}
        @if ($paginator->onFirstPage())
            <li><span class="pagination-previous" disabled="disabled">&laquo;</span></li>
        @else
            <li><a href="{{ $paginator->previousPageUrl() }}" rel="prev" class="pagination-previous">&laquo;</a></li>
        @endif

        {{-- Pagination Elements --}}
        @foreach ($elements as $element)
            {{-- "Three Dots" Separator --}}
            @if (is_string($element))
                <li><span class="pagination-ellipsis">{{ $element }}</span></li>
            @endif

            {{-- Array Of Links --}}
            @if (is_array($element))
                @foreach ($element as $page => $url)
                    @if ($page == $paginator->currentPage())
                        <li><span class="pagination-link is-current">{{ $page }}</span></li>
                    @else
                        <li><a href="{{ $url }}" class="pagination-link">{{ $page }}</a></li>
                    @endif
                @endforeach
            @endif
        @endforeach

        {{-- Next Page Link --}}
        @if ($paginator->hasMorePages())
            <li><a href="{{ $paginator->nextPageUrl() }}" rel="next" class="pagination-next">&raquo;</a></li>
        @else
            <li><span class="pagination-next" disabled="disabled">&raquo;</span></li>
        @endif
    </ul>
@endif
```

### デモ

https://codepen.io/qwe001/pen/OmEgKg
ffmpegでMP4ファイルをHLS AES-128ストリーミング用のファイルに変換する

ffmpegでMP4 -> HLSのエンコーディングを行うには、次のようにコマンドを実行します。

```
ffmpeg -i video.mp4 -c:v copy -c:a copy video.m3u8
```

`-i` に指定するのは入力ビデオファイルです。元のMP4を指定します。
`-c:v copy -c:a copy` の部分は、動画・音声のコーデックを元のソースからコピーする設定です。これを指定すると再エンコードされないため、画質や音質は劣化せず処理も高速になります。
うまく再生できない場合や、ビットレートを変更したい場合は`-c:v libx264 -c:a aac`,`-b:v 9000k`などを指定してください。（詳細は[公式ドキュメント](http://ffmpeg.org/ffmpeg-all.html)を参照）

これで各 video{index}.ts ファイルに動画が分割され、.m3u8ファイルをVLCプレイヤー等で開けば再生できます。

## AES-128で暗号化する

HLS用に変換する際に `-hls_key_info_file` というパラメーターを使用することでストリームを暗号化できます。
このパラメーターには **キー情報ファイル** を指定します。キー情報ファイルとは、以下の情報が含まれたテキストファイルです。

* 1行目: m3u8に含まれる、キーファイルへのURL
* 2行目: 暗号化および復号化時に使用するキーファイル
* 3行目: 暗号化の初期化ベクトル（任意）

キー情報ファイルの1行目にはキーファイルのURLを指定します。フルURLでも良いし、m3u8ファイルからの相対パスでも良いです。以下のような値が設定可能です。

```:キーURLの例
http://server/file.key
/path/to/file.key
file.key
```

これは生成される.m3u8ファイルの `#EXT-X-KEY:METHOD=AES-128,URI="{この部分}"` の指定になります。なので、エンコードを行う段階ではURLからキーファイルが取得できるようになっている必要はありません。

キー情報ファイルの2行目にはキーファイルそのものへのパスを指定します。相対参照、絶対参照どちらでも設定可能です。

```:キーファイルのパスの例
file.key
/path/to/file.key
```

こちらはエンコード時にキーファイルを読み込むために使用するので、キーファイルが存在するパスを参照していなければいけません。この値は.m3u8ファイルには現れません。

キー情報ファイルの3行目には[初期化ベクトル](https://ja.wikipedia.org/wiki/%E5%88%9D%E6%9C%9F%E5%8C%96%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB)を指定します。この行は任意なので指定しなくても構いません。指定する場合は暗号化を行うたびにランダムで生成するのかな？（あまりよくわかっていない）

```:初期化ベクトルの例
0123456789ABCDEF0123456789ABCDEF
```

まとめると、キー情報ファイルの中身はこのようになります。例です。拡張子やファイル名はなんでも構いません。

```:キー情報ファイルの例
http://server/video.key
/path/to/video.key
0123456789ABCDEF0123456789ABCDEF
```

動画の出力先と同じフォルダにキーファイルを作成するとして、とりあえずローカルですぐに再生確認したい場合はこのように指定するのが良いかもしれません（初期化ベクトルは省略してみました）。

```:キー情報ファイルの例
video.key
video.key
```

次に、キーファイルを作成します。キーを作成するのは以下のコマンドを実行します。

```
openssl rand -out video.key 16
```

やっていることはランダムな16バイトのデータを作成してvideo.keyファイルに書き込んでいるだけです。なので必ずしもこの方法で作成しなければいけないということではありません。ただし**ファイルサイズは確実に16バイトである必要があります。**

※WindowsのPowershell環境で`openssl rand 16 > video.key`のようにしてファイル書き出しをすると、**正しく書き込まれません**ので注意してください。~~クソが!!!~~
VLCなどのプレイヤーではこれでも再生できたりしますが、再生できない環境もあります。AES-128は128bit(16バイト)の鍵を使用するアルゴリズムなので、キーファイルは必ず16バイトにするようにしてください。`openssl rand -out video.key 16`ならPowershellでも大丈夫です。

これで準備ができたので、エンコードをします。キー情報ファイルが video.keyinfo だとすると、以下のようなコマンドになります。

```
ffmpeg -i video.mp4 -c:v copy -c:a copy -hls_key_info_file video.keyinfo video.m3u8
```

生成された video.m3u8 ファイルをVLCプレイヤー等で読み込めば、再生されます。個々の.tsファイルは暗号化されているため、直接プレイヤーで開いても再生されません。
うまく再生されない場合は、.m3u8ファイルをテキストエディタで開き、キーのURLや個々の.tsファイルを正しく参照できているかを確認してください。一部のファイルだけを違うフォルダに移動してしまったりすると動きません。

その他のさまざまなオプション設定については、[公式ドキュメント](http://ffmpeg.org/ffmpeg-all.html#Options-38)を参照してください。
npm-scripts でpugのコンパイルがしたかったことだなあ。

あーwebpack便利だなあと思い、pugでHTML出力する案件でも使いたいなということで、

* gulp-webpackを使う
* npm-scriptsでやっちゃう

の二択になるとは思うんですが、後者にしたいなと思いつつ情報があんまり出てこなかったのでメモ書き。

## 必要なもの

* yarn(僕がyarn使ってるだけなので、npmでも大丈夫だとは思います)
* pug
* pug-cli(ちょっとトラブるので後述参照)
* あとはwebpackなりbrowser-syncなりbabelなりお好みで。

`$ yarn add pug pug-cli`して待つだけ。未来ずらー。

## package.json記載例
package.json のscripts部分抜粋。
下記のような感じ。

```
  "scripts": {
    "pug": "pug src/pug/ --hierarchy -o public -P",
    "watch:pug": "pug src/pug/ --hierarchy -o public -P -w",
    "webpack": "webpack",
    "watch:webpack": "webpack -w",
    "server": "lite-server",
    "watch": "yarn run watch:webpack & yarn run watch:pug",
    "start": "yarn run server & yarn run watch"
  },
```
上で入れたパッケージ以外のものがあったり、yarn runになってるので、
そのあたりは必要に応じて書き換えるなりしてくださいまし。

あとは`$yarn start`でwatchされるようになるはず。。
単純にcompileしたいだけなら`$yarn run pug`ですね。

## includeファイルも出力されてしまう
共通部品をまとめてincludeする、というのが定番の流れだと思いますが、
ファイル名先頭にアンダーバーを入れておけば出力されない…
という動作を期待していたのですが、見事に出力先に出てきている。

まあそもそもそういう動作が正しい物ではあるのですが(gulpではexcludeを設定して投げているので)、邪魔だし出さないようにしたいですネ。

設定でどうにかできないのかと思ったのですが、
現在（2017/05/15）npmに上がっているpug-cli 1.0.0-alpha6では、
こういったファイルを無視するようになっていないようで。
調べてみたら、[GitHubでissueが上がっており](https://github.com/pugjs/pug-cli/pull/44)mergeもされている（のだけどnpmへは全然反映されていない）。

ひとまず逃げではあるけど`$ yarn add https://github.com/pugjs/pug-cli.git`
として解決。
TwitterデータをCSVで抽出

Found a good library "Tweepy (# https://github.com/tweepy/tweepy )"

SampleコードをPython3に対応しました。

Step 1: Install Tweepy

```tcsh
pip install tweepy

Collecting tweepy
  Downloading tweepy-3.5.0-py2.py3-none-any.whl
Requirement already satisfied: requests-oauthlib>=0.4.1 in /Users/aws/Documents/Anaconda/anaconda/lib/python3.6/site-packages (from tweepy)
Requirement already satisfied: requests>=2.4.3 in /Users/aws/Documents/Anaconda/anaconda/lib/python3.6/site-packages (from tweepy)
Requirement already satisfied: six>=1.7.3 in /Users/aws/Documents/Anaconda/anaconda/lib/python3.6/site-packages (from tweepy)
Requirement already satisfied: oauthlib>=0.6.2 in /Users/aws/Documents/Anaconda/anaconda/lib/python3.6/site-packages (from requests-oauthlib>=0.4.1->tweepy)
Installing collected packages: tweepy
Successfully installed tweepy-3.5.0
```

```py
# !/usr/bin/env python
# encoding: utf-8

import tweepy  
import csv

# Twitter API credentials
consumer_key = ""
consumer_secret = ""
access_key = ""
access_secret = ""


def get_all_tweets(screen_name):
    # Twitter only allows access to a users most recent 3240 tweets with this method

    # authorize twitter, initialize tweepy
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_key, access_secret)
    api = tweepy.API(auth)

    # initialize a list to hold all the tweepy Tweets
    alltweets = []

    # make initial request for most recent tweets (200 is the maximum allowed count)
    new_tweets = api.user_timeline(screen_name=screen_name, count=200)

    # save most recent tweets
    alltweets.extend(new_tweets)

    # save the id of the oldest tweet less one
    oldest = alltweets[-1].id - 1

    # keep grabbing tweets until there are no tweets left to grab
    while len(new_tweets) > 0:
        print("getting tweets before %s" % (oldest))

        # all subsiquent requests use the max_id param to prevent duplicates
        new_tweets = api.user_timeline(screen_name=screen_name, count=200, max_id=oldest)

        # save most recent tweets
        alltweets.extend(new_tweets)

        # update the id of the oldest tweet less one
        oldest = alltweets[-1].id - 1

        print("...%s tweets downloaded so far" % (len(alltweets)))

    # transform the tweepy tweets into a 2D array that will populate the csv
    outtweets = [[tweet.id_str, tweet.created_at, tweet.text.encode("utf-8")] for tweet in alltweets]

    # write the csv
    with open('%s_tweets.csv' % screen_name, 'w') as f:
        writer = csv.writer(f)
        writer.writerow(["id", "created_at", "text"])
        writer.writerows(outtweets)

    pass


if __name__ == '__main__':
    get_all_tweets("twitter Username")
```

参考：　https://gist.github.com/yanofsky/5436496
Ansibleで必須でないパラメータ未定義時のエラーを回避する


#はじめに

Ansibleのモジュールには、必須パラメータと必須でないパラメータがあります。

同じモジュールを利用する場合でも、要件により必須でないパラメータを定義あるいは省略したいケースがありますが、playbookで定義したパラメータにはなんらかの値を渡してやらないと下記のようなエラーが出てfailしてしまいます。

```bash:エラー
"msg": "the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: 'dict object' has no attribute 'version'
```

#Example

pipモジュールでpythonモジュールをインストールする場合を考えてみます。

pipモジュールには下記のようなパラメータがあります（一部のみ抜粋）。

- name（必須）
- version（任意）

ここで、以下のような変数とplaybookで複数のpythonモジュールをインストールしてみます。

##vars
```
---
my_vars:
  middlewares:
    python:
      modules:
        - name: ansible
          version: 2.2.0.0
        - name: awscli     #バージョン指定なし
```


##playbook
```
---
- name: install python modules
  pip:
    name: "{{ item.name }}"
    version: "{{ item.version }}"
    state: present
  with_items: "{{ my_vars.middlewares.python.modules }}"
```

しかし、バージョンを定義しているAnsibleは正常にインストールされますが、バージョン未定義のawscliは下記のようにエラーになってしまいます。

```bash:エラー
"msg": "the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: 'dict object' has no attribute 'version'
```

#Solution

- **`| default(omit)`を使う**

必須でないパラメータに`| default(omit)`をつけることで、値が未定義の際のエラーを抑止できます。

##playbook(new)

```
---
- name: install python modules
  pip:
    name: "{{ item.name }}"
    version: "{{ item.version | default(omit) }}"
    state: present
  with_items: "{{ my_vars.middlewares.python.modules }}"
```

これでエラーになることなくインストールが成功します。
Android Studioを最近アップデートしたらエミュレータが動かなくなった→解決した話[Mac]


最近のAndroid Studioアップデート(2.3.2)をすると、Android Emulatorで使われているIntel Accelelatorのプラグインのバグで起動した瞬間落ちるという問題が起きました。これが原因なのかどうか突き止める方法と、そうであればの解決策（ただのreinstall）を細かく紹介します。

まず、解決するのに２つ条件があります
・Mac
・プロセッサは、Intelハイッテル

これなら私の紹介する方法で解決するはずです。

私はAndroid Studio 2.3.2にアップデートしたとき、"We think this is the most stable version"　一番安定してるバージョンだと思います。と書いてあったのでアプデ

ふむふむと思って自分の作ってる途中のアプリを起動したら




・・・・・・・・・・・・


動かねぇ（涙）（初心者の涙）となりました

１．まず原因を探る
-Terminalからエミュレータ起動。細かいログが表示されるので診断が出来るんです。ちなみにMacのterminalでお願いします。Android Studioの中のやつではなく。

やりかた：

まず、Terminal でエミュレータのディレクトリに移動
cd /Users/自分のホームディレクトリの名前/Library/Android/sdk

で、エミュレータを起動しましょう
./emulator -avd avd_name

"avd_name"はあなたがインストールしたエミュレータの名前です。わからない場合は、
./emulator -list-avds
と打つとわかります。

ちなみに、"./"をつけるのを忘れないでください。公式docには、emulator -avd avd_nameと書いてありますが、これ打つと"command not found"　訳: しらねーよなんだよそれ　となります。これも探すのに時間かかった。

-起動した瞬間に落ちると同時に、Terminalにこんな感じで怒られると、次に紹介する解決策で治るはずです。
Warning: requested RAM 1536M too high for your system. Reducing to maximum supported size 0M
Hax is enabled
Hax ram_size 0x0
HAX is working and emulator runs in fast virt mode.
違ったらしりません。ごめんなさい

２．解決する
このIntelのプラグインが「エミュレータさんには0MBのメモリをあげましょう」というもちろん無理な条件を押し付けているのが原因なので、そんなひねくれたプラグインは上書き（再インストール）しましょうという解決策です。

- https://software.intel.com/en-us/android/articles/intel-hardware-accelerated-execution-manager-end-user-license-agreement-macosx

このリンクに行って、利用規約を頭に叩き込んでから激しく同意してダウンロード。テストに出ます。

→インストール。Android Studio 再起動。


終わり。

ありがとうございました。
Githubの作業をSSHで行う

httpsで作業したほうが楽な時もあるかと思いますが、2段階認証（two factor authentication（略して2FA））などを設定するとSSHのほうが楽になると思ったので、設定方法を備忘録的に書きます。

複数のアカウントを使う場合の設定となります。１個だけの設定なら簡単なはずです。
（cloneするときに、自動でサイトごとの暗号化キーが使われるようにします。）

今回は、githubとgitlab的な感じで、サーバーが違って、アカウントも違うという、シンプルな複数アカウント設定の場合を想定します。

### 鍵の作り方と公開キーの設定の仕方
---

[Github help](https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/#platform-linux)

英語だけど、↑を見てください。（見ればコピペでいけるはず。。。）
（手順には書いてないですが、暗号キーの権限設定を変えておいたほうが良いです。）

```bash
chmod 600 id_rsa
```

### 作成後

```
id_rsa
id_rsa.pub
```

ができるので、分かりやすいように別名をつけます。

### 変更後

```
cd ~/.ssh/config
mv id_rsa      id_rsa_github
mv id_rsa.pub  id_rsa_github.pub
```

### ~/.ssh/configを作成する
---

~/.ssh/config

```
Host host-hoge
    HostName github.com
    User hoge
    IdentityFile ~/.ssh/id_rsa_github
    Port 22
    IdentitiesOnly yes

Host 自由入力
    HostName remote先のhost名
    User ユーザ名
    IdentityFile 暗号キー
    Port サーバー側のポート
    IdentitiesOnly（キャッシュを使わずにキーを都度ファイルから読み取る）
```

```
chomd 600 ~/.ssh/config
```

### cloneする場合
---

```
git clone git@host-hoge:hoge/hoge-repo.git

git clone git@[Host]:リポジトリ名.git
```

Host名は、なんでもよいのですが、今回の想定の場合、HostNameと合わせておくとGithubの画面からcloneコマンドをコピーした時と同じになるので楽です。
PHPとJavaScriptのswitch文の違い

アプリケーション作成は、複数言語でおこなわれることが多いと思いますが、同じ名称の構文だからと言って、安易に何も考えずに利用するのは危険だなぁと思いました。

# PHPのswitch()
```php:str.php
$str = "1";
switch ($str) {
    case "1":
        echo "1ですよ。";
        break;
    case "2":
        echo "2ですよ。";
        break;
    case "3":
        echo "3ですよ。";
        break;
    default :
        echo "defaultですよ。";
        break;
}

```
出力
「1ですよ。」

```php:int.php
$int = 1;
switch ($int) {
    case "1":
        echo "1ですよ。";
        break;
    case "2":
        echo "2ですよ。";
        break;
    case "3":
        echo "3ですよ。";
        break;
    default :
        echo "defaultですよ。";
        break;
}

```
出力
「1ですよ。」

と、こんな感じで特に違和感もなく、switch(式)は型を見ずに評価してるので、式は「==」だということがわかります。

# JavaScriptのswitch()
```JavaScript:str.js
var str = "1";
switch (str) {
    case "1":
        console.log("1ですよ。");
        break;
    case "2":
        console.log("2ですよ。");
        break;
    case "3":
        console.log("3ですよ。");
        break;
    default :
        console.log("defaultですよ。");
        break;
}

```
出力
「1ですよ。」

```JavaScript:int.js
var int = 1;
switch (int) {
    case "1":
        console.log("1ですよ。");
        break;
    case "2":
        console.log("2ですよ。");
        break;
    case "3":
        console.log("3ですよ。");
        break;
    default :
        console.log("defaultですよ。");
        break;
}

```
出力
「defaultですよ。」

JavaScriptのswitch(式)では、ちゃんと型まで見られている為、式評価(「===」)が厳密なので、caseに一致せずdefaultを通過しています。



当然MDNにも載っているけど、そこをしっかり意識してというかわかって使ってなかったんだなぁと。

# 参考
- [JavaScript本格入門](https://www.amazon.co.jp/JavaScript%E6%9C%AC%E6%A0%BC%E5%85%A5%E9%96%80-%EF%BD%9E%E3%83%A2%E3%83%80%E3%83%B3%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%81%AB%E3%82%88%E3%82%8B%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89Ajax%E3%83%BB%EF%BD%8AQuery%E3%81%BE%E3%81%A7-%E5%B1%B1%E7%94%B0-%E7%A5%A5%E5%AF%9B/dp/4774144665/ref=cm_cr_arp_d_product_top?ie=UTF8)
Polymer templateのstrip-whitespaceについて

`<template strip-whitespace>`を使ってますか？

なぜかPolymer 2.0の公式ドキュメントに載っていないようですが、ライブラリのソースコードを確認しても生きています。Polymer 1.0のドキュメントの[Local DOM#Remove empty text nodes](https://www.polymer-project.org/1.0/docs/devguide/local-dom#strip-whitespace)にある説明を参照しながら`strip-whitespace`について考えます。

## stip-whitespaceとは？

Polymer 1.0のドキュメントによれば、

> Add the strip-whitespace boolean attribute to a template to remove any empty text nodes from the template's contents. This can result in a minor performance improvement.

要は、テンプレートにstrip-whitespaceを指定することで、テンプレート内のコンテンツから空のテキストノードを削除するということです。

空のテキストノードとは何のことでしょうか？なぜパフォーマンスが向上するのでしょうか？

## 空のテキストノードとは？

既にご存知の方も多いと思いますが、これはPolymerの問題ではなくDOMにつきまとう一般的な問題です。「DOMの操作で隣のノードにアクセスしようとしたら、なぜか幽霊（空のノード）に遭遇し思いの外DOM操作が複雑になった」おそらく多くの方が経験のあることだと思います。なぜこんなものが存在するのでしょうか？

実は、エディタがドキュメントのフォーマットを適切に扱えるようにしたり、CSSの`white-space: pre`が適切に機能するようにするために内部的に必要とされるブラウザの実装上の都合です。

この問題について詳しい解説は[MDN](https://developer.mozilla.org/ja/docs/Web/Guide/DOM/Whitespace_in_the_DOM)を参照してください。

## なぜパフォーマンスが向上するのか？

パフォーマンスが向上するのは、DOMがシンプルになるため内部的なDOMアクセスがシンプルになるためです。ドキュメントのサンプルコードをみてもわかる通り、無用なwhitespaceを削除することで、内部的に走査するDOMの数が減ります。これがパフォーマンス向上の秘密です。

ところで、ドキュメントの終わりにこんな説明があります。

> Starting in release 1.8.0, strip-whitespace is recursive, affecting any nested dom-if and dom-repeat instances inside the template.

dom-repeatやdom-ifといったテンプレート要素については、1.8.0よりテンプレート内にネストされた全てのインスタインスに対して再帰的に削除してくれるようになったということです。

ドキュメントをお読みになった方は、[Shadow DOM & styling/DOM template#Automatic node finding](https://www.polymer-project.org/2.0/docs/devguide/dom-template#dom-template-overview)の説明の中で、dom-repeatやdom-ifから動的に生成されたインスタンスは`this.$.id`でアクセスできなかったことを思い出してください。この場合、標準のDOMの`querySelector`メソッドに頼らざるを得ません。パフォーマンス上の理由以外からもstrip-whitespaceを効果的に使うべきですね。

## まとめ
DOMへアクセスする必要がある場合、空のテキストノードが特別に必要とされる理由がなければ`<template>`に`strip-whitespace`を指定して管理するDOMをシンプルに保ちましょう。
ansible-report を試す

Ansible のメーリングリストにこんなの作ったよと投稿があったのでさっそく試してみた。

**Emmanuel B. 氏より**
>
I wrote a script to generate a report (web)  from individual ansible run. The script is especially useful for individual run on a large number of servers.
No dependency, no database, no web server are necessary. 

>https://github.com/manuBocquet/ansible-report  

>Maybe some of you could find it usefull....

やり方はREADMEに書いてあるとおりで、自分の環境ではbabelモジュールが別途必要でした。

```shell-session
# git clone https://github.com/manuBocquet/ansible-report.git
```

 **ansible.cfg**をセット

```shell-session
callback_plugins    = ~/ansible-report/callbackplugin
callback_whitelist  = ansible-report
stdout_callback     = ansible-report
```

**環境変数**をセット

```shell-session:.bash_profile
# Ansible Report
export ANSIBLE_REPORT_PORT=8180
export ANSIBLE_REPORT_FILE=~/Test/ansible_report.json
```

セットが終わったら、適当なホストに大してansible-playbookを実行してみる。

```
# ansible-playbook -i hosts hoge.yml
 ****** ANSIBLE NEW PLAY ******

Task []
                     188.166.222.0 | Ok

Task [Fetch files]
                     188.166.222.0 | Ok
```

いつもと違うSTDOUTが出ていればよい。完了後に***~/Test/ansible_report.json***にはかれるので、その後、

```shell-session
$ ansible-report/ansible-report
Load file : /home/vagrant/Test/ansible_report.json

Open browser and load : http://XXX.XXX.XXX.XXX:8180
```

という感じ。
アクセスすると

![2017-05-15 16-35-26.jpg](https://qiita-image-store.s3.amazonaws.com/0/75458/a85ea7ae-5a59-339b-8040-b2f805df7624.jpeg)

## 所感

用途としては、作者も言っているが大量なサーバに対してやる場合、runしておいて結果を見る時にこのUIを使って見るのはありかもしれない。というのも、いろいろフィルタできたりするので、何が成功でまずかったのはでどれかなどがすぐにわかるようになってる。また、簡単ではあるがCSVで結果をエクスポートできるのもよさげ。ただ、右ペイン側はJSONでTASK毎に吐かれて出力されているので読みづらさはある。ともあれ、全体を俯瞰してすぐにまずいターゲットのみ対処できるのはメリットになりそう。
riot.jsで、任意の個数づつをブロッキングしてループさせる方法

riot.jsを利用して、ずらーっと続くデータをx個ごと区切って表示したく、それにハマったので、解決策をメモ。

#完成させたい構造
```ruby:html
<ul>
  <li><p>data-01</p></li>
  <li><p>data-02</p></li>
  <li><p>data-03</p></li>
</ul>
<ul>
  <li><p>data-04</p></li>
  <li><p>data-05</p></li>
  <li><p>data-06</p></li>
</ul>
<ul>
  <li><p>data-07</p></li>
  <li><p>data-08</p></li>
  <li><p>data-09</p></li>
</ul>

```



#実際書いたもの

```ruby:tag.tag-データ部分
 this.data= [
      {title: data-01},
      {title: data-02},
      {title: data-03},
      {title: data-04},
      {title: data-05},
      ...
      {title: data-09}
]
```

```ruby:tag.tag-表示部分※３毎に区切る場合
  <ul class="wp" each={block, j in list} if={j < data.length/3}>
    <li each={item, i in data.slice(j*3, data.length)} if={i < 3}>
       <p>{item.title}</p>
    </li>
  </ul>
```
##なにをしてるの？

```ruby:tag.tag-表示部分※３毎に区切る場合
  <ul class="wp" each={block, j in list} if={j < data.length/3}>
  </ul>
```
まず、ループ用の変数jを使って、データをループ取り出し。
ただし、データの数をひとかたまりで表示したい数で割って、かたまりを何回ループさせるかをifに指定。

で、

```ruby:tag.tag-表示部分※３毎に区切る場合
    <li each={item, i in data.slice(j*3, data.length)} if={i < 3}>
    </li>
```
表示するデータを、sliceを使って、jによるループで表示済みのものを切り落としつつ、iを使って取り出す。
ifを使って、ひとかたまりに表示させたいデータの個数を指定。



#参考
http://qiita.com/snjssk/items/ea1a56f482e86219f055
全称セレクタ（アスタリスク）は継承を殺す

###前置き
lightbox.js使っていて、キャプション設定しても出なかったんですが、文字が黒くて見えなかっただけでした。
なんで見えなくなっていたか調べたら、自前CSSの全称セレクタ（*）が悪さをしていたという話です。

##検証
こういうdivの構造で

```html
<div class="a">
  a
  <div class="b">
    b
  </div>
</div>
```

CSSをこう

```css:1.css
.a {
  color: red;
}
```

結果：aもbも赤くなる。
子要素は親のスタイルを継承します。想定内の動きです。

でもこうすると

```css:2.css
*{
  color: #000;
}
.a {
  color: red;
}
```

結果：aだけ赤くなる。
継承より*の方が強くなるようです。

##まとめ
全称セレクタ（ユニバーサルセレクタともいう）は継承を上書きするみたいです。
※もちろん子要素に文字色が指定されていたらそちらが優先されます。
JavaScriptプラグイン用のCSSが正しく動作しないこともあるので、継承ありのプロパティはbodyとかに指定したほうがいいですね！
[MDN](https://developer.mozilla.org/ja/docs/Web/CSS/Universal_selectors)でも全称セレクタの使用は推奨されてないです。
優先度や詳細度の問題かと思っていたけど違ったようで、無駄に悩んでしまった…。
ACF Proの管理画面でのGoogle MapにApi Keyを指定したい

SSLだとでないので、ちゃんとキーを取得して設定しましょう

```php5
add_filter('acf/fields/google_map/api', function ($value) {
    $value["key"] = "Your API KEY";
    return $value;
});
```

ACF Pro5系ね
WordPressのACF Pro でのOptionsの表記を変更する

functions.phpとかに下を書く

```php5
if ( function_exists( 'acf_add_options_page' ) ) {

    acf_add_options_page(array(
        'page_title'     =>__( '好きな名前' ),
        'menu_title'    =>__( '好きな名前' ),
        'menu_slug'     => 'acf-options',
    ));

}
```

普通のACF + ACF-Optionsの場合はこんな感じでいけるはず
※ちょっと手抜きなんでサブメニュー使う場合は引数ちゃんとみてね


```php5
if(is_admin()) {
    add_filter( 'acf/options_page/settings', 'my_options_page_settings' );
    function my_options_page_settings( $options ) {
        $options['title'] = __( '好きな名前' );
        $options['menu'] = __( '好きな名前 );
        return $options;
    }
}
```
Wordpressでメディアアップロードのサイズ選択

image_size_names_chooseにhookしてあげると、選べるsizes群が配列でもらえる

```php5
Array
    (
    [thumbnail] => サムネイル
    [medium] => 中
    [large] => 大サイズ
    [full] => フルサイズ
    )
```
こんな配列が引数でもらえるから、いらないやつを消したり、増やしたりご自由に


```php5
add_filter("image_size_names_choose" , function($sizes) {
    return array("full" => "フルサイズ");
});
```
bash 書くとき先頭に設定する options

`set -o errexit`

0 以外のステータスで終了したら即終了

`set -o nounset`

未定義の変数を参照するとエラーメッセージが出る。

`set -o pipefail`

errexit だと pipe の左側がエラーじゃなくても pipe 先の処理が走ってしまう。pipe で処理が失敗したら確実にエラーにする。

error はこちらの trap を用意した方が便利だと思う

http://qiita.com/kobake@github/items/8d14f42ef5f36d4b80e4
[Visual Studio]gitでバージョン管理しているファイルをリビジョン毎に比較する

## やりたいこと

Gitでバージョン管理しているとあるファイルを「リビジョン毎で」「VisualStudio上で」比較したい。

## やり方

1. ソリューションエクスプローラーで対象のファイルを右クリック
2. メニューから「履歴を表示」を選択する
3. 比較したいリビジョンを選択する
4. 選択した状態で右クリック
5. メニューから「比較」を選択する

以上。
GitHub PagesにValue Domainを使って独自ドメインを割りあてる


JekyllをつかってMarkdownで書いていくか、なにかCMSで静的なページを吐きだしていくか、は今後考えるところなんだけど、とりあえずいい加減自分のポートフォリオサイトというかネットの住所不定状態から脱却する為に GitHub Pagesをつかってサイトを立てることにした。

# やったこと
1. Github Pagesの設定 (アカウントに対して作った)
2. value-domainでのaレコードとcnameの設定
3. Github pagesでのCNAMEファイルの設置

## Github Pagesの設定
これについてはいろいろググれば出てくると思うんですが、レポジトリ名を \<usernam\>.github.io にして新規レポジトリをつくって、ローカルにクローンして、index.htmlをcommitすれば、\<username\>.github.io でアクセスしたときにその内容が見れます。なので、MTをローカルに立てて静的なファイルをローカルのレポジトリに吐きだしていけばそれで充分なんじゃないか、、、と思ってます。

## value-domainでのaレコードとcnameの設定

```
a @ 185.199.108.153
a @ 185.199.109.153
a @ 185.199.110.153
a @ 185.199.111.153
cname www @
```

といった感じです。メールの運用はしないのでspfとかmxとかは消しました。いつか必要になったら復活させよう、、、。

## Github pagesでのCNAMEファイルの設置
先程クローンしたローカルのレポジトリにCNAMEというファイルをつくって、ドメイン名を入れればオッケ。僕の場合は hiroshiyamato.com とだけ書いておいたら www.hiroshiyamato.com でアクセスした場合でも hiroshiyamato.com で表示されています。

以上。
MAC Address

# MAC Address(Media Access Control Address)
各NIC(Network Interface Card)に付与される世界で区別できるキー
総6バイト(48ビット)として構想される
- 例 : 00-00-00-11-11-11
- 前から3バイトは各ベンダー社に付与される固有コード
- 後3バイトは各ベンダー社がNICに付与するコード
NICを交換すると変わるが、最近はマザーボードに一体型のパタンがあるため
マザーボードが変わるとMACアドレスが変わる場合が多い


参照URL : http://www.geekpage.jp/practical/macaddress/
scroll値の取得　基本メモ

スクロールされたpx値をスタイルにあてる方法です。

```js
$(window).scroll(function(){
	container_style();
});

var container_style = function(){
	 let top = $(window).scrollTop();
	 let _content = $("要素");
	 _content.css("top",top+"px");
};
```
とても、基本的な、取得方法かと思います。

ポイントは、
１、$(window).scrollTop();のscrollTop（）
（ページをどれくらいスクロールしたかのスクロール量を測ることができます。）と
２、$(window).scroll(function(){
（スクロール量に応じてイベントを発火）の箇所です。

２は、扱いには注意してください。
延々に発火します！！！


では、参考までに
Arduinoでお手軽にクロージャ作ってみた

[前記事](http://qiita.com/ttatsf/items/0f1b7d03636b7752c517#comment-0a749f51d3608bdc0a32)の続き。

Arduinoでクロージャ、もっと簡単に書けないかな?
いろいろ試してたら、いけそうなのができた!

```C++:
auto func = [] () {
  int x = 0;
  return [ = ]()mutable -> int {return x++;};
};
```
呼ぶたびに1だけ大きい数を返す関数です。
intを返すラムダ式を返すラムダ式を変数にauto型推論で保持してみました。
内側のラムダ式はコピーキャプチャでmutableです。

ちなみに今までは関数オブジェクトでこんなしてました。

```C++:
class F {
  private:
    int i = 0;
  public:
   int operator()();
};
int F::operator()(){
  return i++;
} ;
```

うちのArduinoではちゃんと動いてます。
![スクリーンショット 2017-05-15 14.52.51.png](https://qiita-image-store.s3.amazonaws.com/0/61597/f97f34cc-d93d-49e8-7e72-948e6c8d4aa1.png "スクリーンショット 2017-05-15 14.52.51.png")

何か間違いやら問題点があればコメントおねがいします。
[iOS] UITextViewの高さを内容によって動的に変更する

## 今回のやりたいこと
UITextViewの内容は、Web経由で取得する。
内容の長さは様々である。
それに合わせて、UITextViewの高さを動的に変更したい。

## 方法
まずはUITextViewDelegateのtextViewDidChange()でtextの内容が変わったら呼び出されるので、その時に高さの設定する方法を試した。

``` swift
extension ViewController: UITextViewDelegate {
    func textViewDidChange(_ textView: UITextView) {
        var frame = textView.frame
        frame.size.height = textView.contentSize.height
        textView.frame = frame
    }
}
```

これだと、UITextView.textに文章を設定しても呼び出されなかった。
（本来なら、呼び出されるはずなんだけど。。。）

次にUITextView.sizeThatFits()で高さを動的に取得する方法で試した。

``` swift
let height = textView.sizeThatFits(CGSize(width: textView.frame.size.width, height: CGFloat.greatestFiniteMagnitude)).height
textView.heightAnchor.constraint(equalToConstant: height).isActive = true
```

これでうまく動的に高さの変更ができた。

めでたし、めでたし。
Python 3 から MySQL を触る

Python 3 から MySQL を操作する方法を調べると Python 2 の情報や古い情報が多くヒットしてわかりづらかったのでまとめる。

環境は Python 3.6 を利用している。

## パッケージ
[mysqlclient](https://pypi.python.org/pypi/mysqlclient) というパッケージもあるが、MySQL 公式の [mysql-connector-python-rf](https://pypi.python.org/pypi/mysql-connector-python-rf) というパッケージがあるので今回はこちらを使う。

**[2018-12-03 追記]** `mysql-connector-python-rf` は更新が止まっており、同じく MySQL 公式の `mysql-connector-python` というパッケージがあるらしいので注意。詳しくはコメント欄を参照。

ふたつのパッケージのメリデメはあまりわかっていないが、mysqlclient でクエリの結果をディクショナリとして扱う方法を見つけられなかったので個人的には mysql-connector-python-rf の方が使い勝手が良さそう。

普通に pip からインストールできる。

```
$ pip install mysql-connector-python-rf
```

## 接続
PostgreSQL のコネクタ (psycopg2) は URL 文字列を投げるだけで接続できたが、mysql-connector-python-rf ではできない模様。仕方がないので urllib でパースする。

``` python
from urllib.parse import urlparse
import mysql.connector

url = urlparse('mysql://user:pass@localhost:3306/dbname')

conn = mysql.connector.connect(
    host = url.hostname or 'localhost',
    port = url.port or 3306,
    user = url.username or 'root',
    password = url.password or '',
    database = url.path[1:],
)
```

接続できているか確認したい場合は `is_connected()` を使う。

``` python
conn.is_connected()  #=> Bool
```

コネクションを張りっぱなしにしていると、いつの間にか接続が切れてしまうことがある。
これを回避するためには定期的に ping を送り、接続できていなければ再接続するようにしておく。

``` python
conn.ping(reconnect=True)
```

## クエリ実行
[標準の SQLite コネクタ](https://docs.python.jp/3/library/sqlite3.html) などと同様に、カーソルオブジェクトを作成し `execute` メソッドでクエリを実行する。

``` python
cur = conn.cursor()
```

### 取得 (SELECT)
クエリを実行した後に `fetchone` / `fetchmany` / `fetchall` メソッドでレコードを取得できる。

``` python
cur.execute('SELECT * FROM users')

cur.fetchall()  #=> [(1, 'foo'), (2, 'bar')]
```

プリペアードステートメントも利用できる。

``` python
cur.execute('SELECT * FROM users WHERE id = %s', [1])

cur.statement  #=> 'SELECT * FROM users WHERE id = 1'

cur.fetchone()  #=> (1, 'foo')
```

### 更新 (INSERT / UPDATE / DELETE)
クエリ実行後に `conn.commit()` でコミットされる。

``` python
try:
    cur.execute('INSERT INTO users (name) VALUES (%s)', ['foo'])
    conn.commit()
except:
    conn.rollback()
    raise
```

## 結果をディクショナリとして取得
カーソルオブジェクト作成時に `dictionary` オプションを渡すとクエリ実行結果をディクショナリとして取得できる。

``` python
cur = conn.cursor(dictionary=True)

cur.fetchall()  #=> [{'id': 1, 'name': 'foo'}, {'id': 2, 'name': 'bar'}]
```

その他のカーソルオブジェクトに渡せるオプションは以下を参照。

[MySQL :: MySQL Connector/Python Developer Guide :: 10.6 Subclasses cursor.MySQLCursor](https://dev.mysql.com/doc/connector-python/en/connector-python-api-cursor-subclasses.html)
RailsのDEVISEでsign_up後の遷移先を変更する。

## sign_up後の遷移先をログイン画面に変更する

```companies/registrations_controller.rb
class Companies::RegistrationsController < Devise::RegistrationsController

  def after_sign_up_path_for(resource)
    new_company_session_path
  end

  def after_inactive_sign_up_path_for(resource)
    new_company_session_path
  end

end
```