OmniAICreator/Qiita-1.07M huggingface dataset:
MySQL　文字コード

テーブルにレコードを登録した際に、文字化けをしてしまったので、対処法です。
#データベースの文字コード
##確認
`mysql> show create database db_name;`

##変更
`mysql> alter database db_name character set utf8;`

#テーブルの文字コード
##確認
`mysql> show table status from db_name like 'table_name';`

##変更
`mysql> alter table table_name convert to character set utf8;`
(Git)行末にスペースを追加・削除したコミットを探す


秀丸のオプションとかで勝手に消された行末スペースをGitリポジトリから探す方法。

結論
---------

以下のonelinerで表形式の結果が取得できる。


``` sh
git log -S" $" --pickaxe-regex --name-only --pretty="__NEWLINE__%h%x09%an%x09%ae%x09%s" | tr "\n" "\t" | sed 's/__NEWLINE__/\n/g'
```

注意：Mac OSのsedではうまく動きません。回避策は後述。


解説
---

### step 1: git-logでログ検索

```sh
git log -S" $" --pickaxe-regex --name-only --pretty="__NEWLINE__%h%x09%an%x09%ae%x09%s"
```

- `-S`と`--pickaxe-regex`: 文末スペースが追加・削除されたコミットを探しています。
- `--name-only`: 該当ファイルのパスを出力します。
- `--pretty`: 出力形式を指定します。後述。

#### 出力形式の補足

`__NEWLINE__`: 後で改行するための印。
`%x09`: タブ文字

### step 2: ひとまず１行にまとめる

```sh
tr "\n" "\t"
```

### step 3: 印の付いたところで改行

```sh
sed 's/__NEWLINE__/\n/g'
```

注意：Mac OSのsedでは改行文字がうまく動きません。homebrew等でGNU sed(`gsed`)を入れて使うか、`\`の後に実際に改行を入力してください。

事例
----

githubのgithubtraining/hellogitworldで試してみる。

```sh
git clone https://github.com/githubtraining/hellogitworld
git log -S" $" --pickaxe-regex --name-only --pretty="__NEWLINE__%h%x09%an%x09%ae%x09%s" | tr "\n" "\t" | sed 's/__NEWLINE__/\n/g'

ebbbf77	Jordan McCullough	jordan@github.com	Update package name, directory		src/test/java/com/ambientideas/AppTest.java	src/test/java/com/github/AppTest.java	
45a30ea	Jordan McCullough	jordan@github.com	Update package name, directory		src/main/java/com/ambientideas/App.java	src/main/java/com/gith![kobito.1446274215.865095.png](https://qiita-image-store.s3.amazonaws.com/0/98701/9de8bef4-7ab8-c7f6-244a-20efd679ed9f.png "kobito.1446274215.865095.png")
ub/App.java
d2280d0	Matthew McCullough	matthew@github.com	Adding maven build script		src/main/java/com/ambientideas/App.java	src/test/java/com/ambientideas/AppTest.java	

```

TSVファイルとかに吐いてスプレッドシートとして開けば、こんな感じで見られる。
![kobito.1446274319.454548.png](https://qiita-image-store.s3.amazonaws.com/0/98701/e5fc3332-abad-9955-d137-550a3263a8ca.png "kobito.1446274319.454548.png")
ロジカルシンキング確認問題を作ってみた

JSONを見たこともない人が対象だとしたら、こんななぞなぞは面白いんではないだろうか。
ただ見落としや間違いもきっとあるからコメント欄で修正アドバイスくれたりすると助かる。

# 前置き

理論上は以下の内容のみで完全にJSONの書式は説明されている。
「理論上は」ということはロジカルシンキングによって最悪でも実際のサンプルなしで完璧にJSONを記述する方法を知り得ることができると主張しているものとする。（ただし言葉の意味は先に説明されるとは限らない。）

# 説明

- 原則

    - 特に注意がない場合、改行、空白は含んで良い。
    - 3種類のオブジェクトしかない。

    - 配列と辞書を用いれば、入れ子状にデータを格納できる。これによって繰り返し包括的に定義されたデータ構造を階層構造と呼ぶことにする。
    - JSON全体としては、たった一つの辞書が宣言されたものである必要がある。（つまり最も短いJSONは{}である。）

- オブジェクトについて

    - 値

        - 文字列

            - 例: "Japanese", "json text"

            - 文字列は必ず「"」で囲われる。

            - 文字列中に「"」を含む場合、「\"」と記述する。

            - 文字列中に「\」を含む場合、「\\\」と記述する。

        - 数値

            - 例: 0, -5, 1.2345
            - 0を含む整数値、または小数値

        - 真偽値
            - true, falseのみ

        - 空
            - nullのみ

        - これら値に改行を含んではならない。

    - 配列:array

        - オブジェクトのみを含み、0個以上で構成される。

        - 辞書内に2個以上のオブジェクトが存在する場合、それらは「,」で区切られる。

        - オブジェクトとして配列は{と}で囲われる。

        - 辞書をオブジェクトとして複数個含む場合、それらが含む階層構造やKeyは同じであるのが望ましい。

    - 辞書:hash
        - KeyとValueのペアのみを含み、0個以上で構成される。
        - Keyは必ず文字列でありValueはオブジェクトのいずれかである。(文字列は値としての文字列に準ずる。)
        - KeyとValueは「:」で区切られ、"key-name":"value-string"という形式で表される。

        - 辞書内に2個以上のペアが存在する場合、それらは「,」で区切られる。

        - オブジェクトとして辞書は[と]で囲われる。

# 問題

上記の構造化された説明文をJSON形式で記述せよ。答えは正しい解釈と工夫が感じられれば、回答と一字一句同じである必要はない。

# 回答例

```json
{
  "説明": [
    "特に注意がない場合、改行、空白は含んで良い。",
    "3種類のオブジェクトしかない。",
    "配列と辞書を用いれば、入れ子状にデータを格納できる。これによって繰り返し包括的に定義されたデータ構造を階層構造と呼ぶことにする。",
    "JSON全体としては、たった一つの辞書が宣言されたものである必要がある。（つまり最も短いJSONは{}である。)"
  ],
  "オブジェクトについて": {
    "値": {
      "文字列": {
        "例": [
          "Japanese",
          "json text"
        ],
        "説明": [
          "文字列は必ず「\"」で囲われる。",
          "- 文字列中に「\"」を含む場合、「\\\"」と記述する。",
          "文字列中に「\\」を含む場合、「\\\\」と記述する。"
        ]
      },
      "数値": {
        "例": [
          0,
          -5,
          1.2345
        ],
        "説明": [
          "0を含む整数値、または小数値"
        ]
      },
      "真偽値": {
        "例": [
          true,
          false
        ],
        "説明": [
          "true, falseのみ"
        ]
      },
      "空": {
        "例": [
          null
        ],
        "説明": [
          "nullのみ"
        ]
      }
    },
    "辞書": [
      "KeyとValueのペアのみを含み、0個以上で構成される。",
      "Keyは必ず文字列でありValueはオブジェクトのいずれかである。(文字列は値としての文字列に準ずる。)",
      "KeyとValueは「:」で区切られ、\"key-name\":\"value-string\"という形式で表される。",
      "辞書内に2個以上のペアが存在する場合、それらは「,」で区切られる。",
      "オブジェクトとして辞書は[と]で囲われる。"
    ],
    "配列": [
      "オブジェクトのみを含み、0個以上で構成される。",
      "辞書内に2個以上のオブジェクトが存在する場合、それらは「,」で区切られる。",
      "オブジェクトとして配列は{と}で囲われる。"
    ]
  }
}
```
RPi2 > ブラウザの日本語文字化けの対応

```txt:動作確認
Raspberry Pi2
```

ブラウザでQiitaのページを投稿しようとしたら日本語文字表示が化けている。

以下を参考に対応した。

http://www.mztn.org/rpi/rpi34.html

「フォントと日本語入力のインストール」まで実施してからRPi2をリブートしたらブラウザにて日本語が表示されるようになった。

Qiitaのトップページで"Loading Qiita..."の処理がやたら重いが表示はできた。
Perl で相対 URL から絶対 URL を作成する


[URI](http://search.cpan.org/~ether/URI-1.69/lib/URI.pm) モジュールの `abs` を使うのが一番簡単そうだった。

http://perldoc.jp/docs/modules/URI-1.35/URI.pod#COMMON32METHODS 
> 絶対 URI リファレンスを返します。 もし `$uri` がすでに絶対であれば、それへのリファレンスが単に返されます。 `$uri` が相対であれば、`$uri` と `$base_uri` をつなげることにより新しい 絶対 URI が組み立てられ、返されます。

```perl
use strict;
use warnings;
use utf8;

use URI;

print URI->new("index.html")->abs("http://example.com") ,"\n";
#=> http://example.com/index.html

print URI->new("/path/to/index.html")->abs("http://example.com") ,"\n";
#=> http://example.com/path/to/index.html

print URI->new("index.html")->abs("http://example.com/path/to/") ,"\n";
#=> http://example.com/path/to/index.html

print URI->new("index.html")->abs("http://example.com/path/to/example.jpg") ,"\n";
#=> http://example.com/path/to/index.html

print URI->new("http://www.example.com/foo/bar/index.html")->abs("http://example.com/path/to/example.jpg") ,"\n";
#=> http://www.example.com/foo/bar/index.html

print URI->new("index.html")->abs("http://example.com/path/to") ,"\n";
#=> http://example.com/path/index.html

print URI->new("../index.html")->abs("http://example.com/path/to/") ,"\n";
#=> http://example.com/path/index.html
```

`new_abs` というショートカットもある。

```perl
use strict;
use warnings;
use utf8;

use URI;

print URI->new_abs("index.html", "http://example.com") ,"\n";
#=> http://example.com/index.html

print URI->new_abs("/path/to/index.html", "http://example.com") ,"\n";
#=> http://example.com/path/to/index.html

print URI->new_abs("index.html", "http://example.com/path/to/") ,"\n";
#=> http://example.com/path/to/index.html

print URI->new_abs("index.html", "http://example.com/path/to/example.jpg") ,"\n";
#=> http://example.com/path/to/index.html

print URI->new_abs("http://www.example.com/foo/bar/index.html", "http://example.com/path/to/example.jpg") ,"\n";
#=> http://www.example.com/foo/bar/index.html

print URI->new_abs("index.html", "http://example.com/path/to") ,"\n";
#=> http://example.com/path/index.html

print URI->new_abs("../index.html", "http://example.com/path/to/") ,"\n";
#=> http://example.com/path/index.html
```

## 参考

How do I create an absolute URL from two components, in Perl? - Stack Overflow 
http://stackoverflow.com/questions/1813678/how-do-i-create-an-absolute-url-from-two-components-in-perl
Xcodeで表示されるフォルダ階層とfinderで表示されるフォルダ階層を一致させる

# 概要
* Xcode左の "Project navigater" で 右クリック > "New Group" で黄色いフォルダアイコンの「グループ」を作成　→　Finder上で青いフォルダアイコンの「フォルダ」は作成されない😱
* Xcode上の「グループ」階層とFinder上の「フォルダ」階層がズレて不便
* [synx](https://github.com/venmo/synx) というツールを使うと、Xcode上の「グループ」階層の通りにFinder上の「フォルダ」階層を自動で整理してくれる。便利👼

# [synx](https://github.com/venmo/synx)の使い方
## synx をインストール

### El Capitan の場合
```
$ gem install -n /usr/local/bin synx
```

### Yosemite 以前は以下でもOK
```
$ gem install synx
```

* El Capitan だとrootでも/usr/配下の書き込み権限がなくなったため、`-n /usr/local/bin`でインストールディレクトリを指定しないと以下のエラーが起きる

```
ERROR:  While executing gem ... (Errno::EPERM)
    Operation not permitted - /usr/bin/xcodeproj
```

## synxを使ってフォルダ整理
```
$ synx プロジェクト名.xcodeproj
```
* finderで見てみるとXcode上で見たのと同じフォルダ階層になってる! スッキリ👼

# その他
* 階層の一致としては、finderで先に青いフォルダを作成し、「Add files to "プロジェクト名"...」で「Create folder references」を選択しXcodeグループではなく青いフォルダを追加してしまう手もあるが、少し手間。
* (Xcode上の黄色いフォルダアイコン(グループ)と青いフォルダアイコンの差は、たしか.ipaファイル内の画像のパスで重要になってくる。)
git revertでmerge commitを取り消す

# はじめに
以前、「m1でrevertしといて！」と言われて、「へ？」となったことがあったので、メモしておきます。

# git revert

まず、revertのシンプルな使い方から。

```
$ git revert HEAD
```

でHEADのコミットを取り消すようなコミットを作成してくます。
コミットメッセージを変更する画面が出てくるので変更する場合は変更して、後は勝手にコミットまでやってくれます。

[git 履歴を変えるコマンドたち git revert](http://qiita.com/shizuma/items/dafc601f977185cede69#git-revert)

# merge commitをrevertする 

revertしようとしたコミットがmerge commitだった場合、エラーが出てしまいます。

```
$ git revert aaaaaa
error: Commit aaaaaa is a merge but no -m option was given.
```

こんなときにはm(mainlineオプション)を使います。
mオプションには1または2を基本的に使います。

1のときは「マージされた側のブランチ」、2のときは「マージする側のブランチ」になります。マージしたコミットそのものをrevertするときは1になります。なので、基本的に1を使うといいと思います。

```
$ git revert -m 1 aaaaaa
```

```
$ git revert -m 2 aaaaaa
```

# 参考
[Gitのrevertの-m(mainline)オプションについて](http://blog.toshimaru.net/git-revert-mainline/)

[GitでMerge CommitをRevertする方法](http://qiita.com/awakia/items/5fad0c454ddc7b478ff1)

[git docs git-revert](http://git-scm.com/docs/git-revert)
RPi + androidスマホ(Unity) > シリアルラインモニタ [2016年2月完成予定]

実費が安くつくRS-232Cラインモニタを作ろうとしてたけど、AndroidスマホでのFT232RLの使用や、その2系統(inとout)の扱いがいまいち手間がかかりそうなので方針を変更した。

以下の構成とする。

- RaspberryPi2
  - RS-232C (in)
  - RS-232C (out)
  - Ethernet (cmdポート / monitorポート)
- Androidスマホ (Unityで実装)
  - Ethernet (cmdポート / monitorポート)

RPi2がシリアルの受信と送信を担当。送受信した文字列をEthernetで出力。
またEthernetにより通信設定の変更を受け付ける。

Androidスマホ側はcmd(RPi2のシリアル通信設定変更コマンド)とmonitor(シリアル通信の送受信文字列モニタ)を担当。monitor値の表示もこちらで行う。

こうするとUIはUnityの実装が使えて楽。RPiはまだほとんど使ってないが、linux関連で上記の処理ならなんとかなりそう。

pythonのプログラムはほとんど実装してないが、elfsharpでコードを読んだりはした程度。これから勉強。

空き時間での作業なので来年2月末までに完成すればよしとする。
ちょっとずつ進めるつもり。
Javaの短絡評価されない論理演算子

Javaで論理演算を行うとき、もっぱら `&&` と `||` を利用すると思います。`if (isHoge() && isFoo()) { ... }` 的な感じで。

これらは短絡評価されるので、たとえば `false && true` という式があったとして、前者を評価した時点でこの式全体は `false` が返ることは明らかなので、後者の `true` は評価されません。

こんなコードは読みたくないのですが、もし `boolean` を返すメソッドが副作用を持っていて、短絡評価された場合当たり前ですが、動作に影響がでます。たとえば以下のような最悪な感じのメソッドを考えてみましょう。

```java

private static boolean isTrueWithSideEffect() {
    System.out.println("hoge");
    return true;
}

private static boolean isFalseWithSideEffect() {
    System.out.println("foo");
    return false;
}
```

これらを `isTrueWithSideEffect() && isFalseWithSideEffect()` と呼び出したときは、`hoge` と `foo` が出力されます。しかし `isFalseWithSideEffect() && isTrueWithSideEffect()` と呼び出したときは `foo` としか出力されません。

そもそも参照透過にしろよという話ではありますが、Javaにも短絡評価をしない論理演算子が存在することを初めて知った（そもそも、そんな演算子使おうと考えたことがなかった）ので記事にしています。

短絡評価されない論理演算子は `&` と `|` です。これビット演算子だとずっと思っていたので `boolean` に対して使おうという気持ちが一切湧いてこなかった。


これらを用いるとたとえば、 `isTrueWithSideEffect() & isFalseWithSideEffect()` と呼び出したときも、 `isFalseWithSideEffect() & isTrueWithSideEffect()` と呼び出したときも、`hoge` と `foo` が出力されます。

こんなこと知っても全然うれしくないので、副作用を伴う `boolean` を返すメソッドを書くのをまずやめましょう。
Unreal Engine 4 のインストール


## 参考にしたサイト
[UnityユーザーのためのUnreal Engine入門（1）](http://www.atmarkit.co.jp/ait/articles/1505/28/news023_1.html)

## 環境
- Mac OS Yosemite 10.10.5
- UE4.9.2

## インストール
下記サイトより"Download"を押し、必要事項を記入しサインアップ。

- https://www.unrealengine.com/ja/what-is-unreal-engine-4

ダウンロードしたらインストールして実行。

実行するとサインイン画面がでるので入力。このとき「お待ちください」が表示が出てしばらく待ちました。

続いて選択画面が出てくるので、一番右の UNREAL ENGINE 4 を選択。

ランチャーが起動するので、左上の黄色いボタンを押してダウンロード開始。またしばらく待機。

インストール完了したら起動。

## 新規プロジェクトの作成
プロジェクトブラウザの新規プロジェクトタブを選択。

下の方のプロジェクトの保存場所を入力して、「デスクトップ/コンソール」、「スターターコンテンツ無し」を選択。

「ブループリント」、「空のプロジェクト」を選択していることを確認して「プロジェクトを作成」。

新規プロジェクトが作成されて、エディタ画面が表示されます。
Raspberry Piでbleaconを使ってiBeaconする

#はじめに
過去に[RASPBERRY PIをIBEACON化する(1)](http://barbarossa.no-ip.org/wp/?p=56)というのを書いたが、大分時間が経過してbluezもビルド不要で導入できるようになったみたい。
Debianの[Package: bluez (4.99-2)](https://packages.debian.org/ja/wheezy/bluez)を参照。

この記事は基本的にBLE対応のアダプタ接続済み、bluez導入済みで、node.jsの[bleacon](https://github.com/sandeepmistry/node-bleacon)を使うところからスタートします。
bleaconではアドバタイジングにblenoをセントラルにnobleを利用しているみたい。

[Raspberry PiでiBeaconを受信する（Node.js + bleacon）](http://qiita.com/yuyakato/items/739443960fac2668f4a3)がよくまとまっているので、こちらを参照するといいかも。

#ためしてみる

とりあえずbluezが動いているかhciconfigを利用して確認する。
UP RUNNINGになっていればOK。

```bash
pi@raspberrypi2 ~/bleacon $ hciconfig
hci0:   Type: BR/EDR  Bus: USB
        BD Address: <MAC_ADDRESS>  ACL MTU: 310:10  SCO MTU: 64:8
        UP RUNNING PSCAN
        RX bytes:2757 acl:6 sco:0 events:201 errors:0
        TX bytes:2565 acl:1 sco:0 commands:185 errors:0
```

ある筋では有名な一行でiBeaconできるコードを利用する。
measurePowerの値を調整することでキャリブレーションできるようなので、少しいじってみる。

```bleacon.js
bleacon = require('bleacon');

var uuid = 'E86367B8D8A84BE082DE4653A7333113';
var major = 0;
var minor = 0;
var measuredPower = -59;

bleacon.startAdvertising(uuid, major, minor, measuredPower);
```

##Androidから探してみる
iPhoneでもいいのですが、今回はAndroidでチェックしてみた。
アプリは[Bluetooth LE Scanner](https://play.google.com/store/apps/details?id=uk.co.alt236.btlescan&hl=ja)を使用した。なんでもいいと思う。

基本いい感じなんだが少し不安定な気もする。
「部屋に入ってきたら」というトリガにするためにはもう少し精度が高くないとダメかな？という印象だった。
今後詰めてゆく。

###IMMEDIATE
Raspberry Piが設置してある部屋のPCテーブルにAndroid端末を置いた時。

![Screenshot_2015-11-08-18-00-03.png](https://qiita-image-store.s3.amazonaws.com/0/95484/1cb1d64f-0776-1713-3536-0068b9b3e8d5.png)

###NEAR
Raspberry Piが設置してある部屋の出口付近。

![Screenshot_2015-11-08-18-12-57.png](https://qiita-image-store.s3.amazonaws.com/0/95484/de7b1e95-d060-00d6-29f1-6316d9d4bc89.png)

###FAR
Raspberry Piが設置してある部屋から出て離れた時。

![Screenshot_2015-11-08-17-59-52.png](https://qiita-image-store.s3.amazonaws.com/0/95484/0747460a-0ef4-814a-a72f-4894d071fb40.png)

#さいごに
bleaconは一行でiBeacon化できるのが本当にすごい。
あと、自分自身がBLEで使うUUIDをあまり理解していないので、追記ではbleaconの使い方を補強してゆく予定。
UITableViewのUX改善(今すぐ出来る！)


## はじめに
`deselectRowAtIndexPath(indexPath: NSIndexPath, animated: Bool)`

UITableView上にあるセルの選択状態を解除するときに使うメソッドですが、
呼び場所を替えるだけでUXを大幅に改善することが出来ます。

## 経緯
アプリによってはセル押下後に画面遷移するにもかかわらず、
押下直後に`deselectRowAtIndexPath`を呼ぶような挙動になっていたりします。

これは悪いことではないですが、画面遷移から戻ってきた時に
セルの選択状態を解除してあげたほうがどのセルを押したのか
ユーザーに視覚的に伝えることが出来るのでUX的に良いと思ったからです。

## 例
### セル押下直後に解除
![deselect_in_deselected.gif](https://qiita-image-store.s3.amazonaws.com/0/75257/71b4f5a0-23d1-8853-7aa7-4a4095c2f721.gif "deselect_in_deselected.gif")

この方法だとどのセルを押したのかをユーザーは思い出さなければいけません。

### 遷移から戻ってきた時に解除
![deselect_in_willAppear.gif](https://qiita-image-store.s3.amazonaws.com/0/75257/3f8d962a-cefc-6e60-0c37-da8267432100.gif "deselect_in_willAppear.gif")

こちらはどのセルを押したのか視覚からはっきりと分かります。

### ネイティブの設定アプリ
![setting_deselect.gif](https://qiita-image-store.s3.amazonaws.com/0/75257/508b1e65-3a6a-b4b0-f1df-a97be09d628a.gif "setting_deselect.gif")

ちなみにネイティブの設定アプリも遷移後にセルの選択状態を解除しています。

## 実装方法
```Swift:BadDeselect.swift
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
    
    // 画面遷移など
}
```
`didSelectRowAtIndexPath`内などでやっていた処理を、

```Swift:GoodDeselect.swift
override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    
    if let indexPathForSelectedRow = tableView.indexPathForSelectedRow {
        tableView.deselectRowAtIndexPath(indexPathForSelectedRow, animated: true)
    }
}
```
`viewWillAppear`でやることで実現しています。

ちなみに選択状態のセルは`UITableView#indexPathForSelectedRow`で取得できます。

## 終わりに
細かい見た目ですが、「神は細部に宿る」と言います。
今すぐ出来る改善なので、是非やってみてください。
ご指摘、ご質問がありましたらコメント欄へどうぞ。

サンプルコードをGithubに置いておきました。
ご自由にお使いください。
https://github.com/AcaiBowl/CellUX-Sample
railsプロジェクト内でpdfファイルを表示する方法

## 前提
- 既存のpdfファイルをrailsプロジェクト内で表示したいとき

## 方法
- objectタグ
- embedタグ
- iframeタグ
- link_to

## objectタグ

### 使用方法

```html.erb
<object data="pdfファイルのURL" type="application/pdf" width="" height=""></object>
```

### 属性
- data : pdfファイルのURLを入力する必要がある。例えばassets以下にいれた場合、image_url("")などを使って、ファイルの位置をURL化し挿入する。参考: http://api.rubyonrails.org/classes/ActionView/Helpers/AssetUrlHelper.html
- type : ソースのMIMEタイプを定義する。しかし、dataとtype両方書く必要はなく、dataだけあれば、とりあえず表示される。
- width : ファイルの横幅を定義する
- height : ファイルの縦幅を定義する

その他の属性はこちらを見てください。
http://www.htmq.com/html5/object.shtml

### 注意点
- PC上ではこの方法でうまく表示されますが、スマホ（iPhone/Android）で見る場合は、最初の1ページのみにしか表示されないようです。筆者が調べたところによると、これはどうしようもないみたいです。

## embedタグ

### 使用方法
```html.erb
<embed src="" type="application/pdf" width="" height=""></embed>
```

### 属性
- src : pdfファイルの位置を定義
- type : ソースのMIMEタイプを定義
- width : ファイルの横幅を定義する
- height : ファイルの縦幅を定義する

その他の属性はこちらを見てください。
http://www.htmq.com/html5/embed.shtml

### 注意点
- objectタグとの異なる点としては、objectタグはIEで表示されないが、embedではIEでも表示することが可能
- またobjectタグ同様PC上でのみpdfファイルの参照が可能となる。

## iframeタグ
### 使用方法
```html.erb
<iframe src="" width="" height="" ></iframe>
```

### 属性
- src : pdfファイルの位置を定義
- width : ファイルの横幅を定義する
- height : ファイルの縦幅を定義する

### 注意点
- こちらもPCのみ。理由は同じです。

## link_to
### 使用方法
あまりに有名なので割愛。
もしわからない方がいらっしゃったら以下のページを参照してください。
http://railsdoc.com/references/link_to

### 唯一スマホでもpdfファイルを見ることができる！
- ただし、内部への埋め込み表示ではなく、pdfファイルの中身に飛んでいるだけなので、どうしても内部表示じゃないといけない方にとっては使えないが、railsアプリ内で既存のpdfファイルを開ければ良いという人にとっては、これで満たされるとおもいます。
Macbook 12でUbuntu15.10の近況しらべ

## 参考

* [MacBookPro12-1/Wily - Community Help Wiki](https://help.ubuntu.com/community/MacBookPro12-1/Wily)

## 感想

* いつの間にかトラックパッド対応していて感動。
* Bluetoothとカメラ、明るさ自動調節は未対応。
    * [MacBook - ArchWiki](https://wiki.archlinux.org/index.php/MacBook#Bluetooth_2)から想像するに、kernel4.4でBluetooth対応するかも。

## Remaining issues and optimization potential

> Battery Life and power management tuning
> Automatic background light / brightness management
> 
> Bluetooth not working at all (see http://www.spinics.net/lists/linux-bluetooth/msg64098.html)
> SPDIF port red light (old methods to turn it off seem not work) - It looks weird when the red light remains on
> 
> Camera not yet working (see https://github.com/patjak/bcwc_pcie for the WiP driver)
ArchlinuxにGNS3-1.3.11を入れる

#GNS3がAURとかにないのでSourceから入れたときのメモ
基本的に下記ページを参考に。
でも、スムースに行かなかったので、自分用のメモとして残します。
https://community.gns3.com/thread/5471

##やったこと
1. GNS3のソースを落とす
2. 細かいもののインストール
3. dinamipsとgns3-serverとgns3-guiのインストール

***
###1. GNS3のソースを落とす
とりあえず、下記にログインして、Downloadからソースのリンクを探す
http://www.gns3.com/

落としたらzipだったんだけど、zipとか使わないと思ってたので・・・
\# pacman -S zip unzip

ちなみに、GNS3のソースがZip形式だったんだけど、unzip以外でzipって解凍できるのかな？
ってかなんでzipなんだ・・・
ちなみに、zipの中にzipがいっぱい入っているので、HOGEdirの中に解凍させる。
% unzip -d HOGEdir GNS3-1.3.11.source.zip

###2. 細かいもののインストール
GNS3を入れようとしたPCの状態は、Archを入れてXorgとxfce4、lightdmとかでGUI、日本語、Wifiの環境を整えたところなので、ほとんどなんも入ってなかったため、下記をInstall。
もしかしたら1つずつ順序良く入れないとうまくInstallできないかもしれない・・・

\# pacman -S cmake python-setuptools sip pyqt unzip

###3. dinamipsとgns3-serverとgns3-guiのインストール
- Dynamips
$ unzip dynamips-0.2.14.zip
$ cd  dynamips-0.2.14
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
$ sudo setcap cap_net_admin,cap_net_raw=ep /usr/local/bin/dynamips

- GNS3 Server
$ unzip gns3-server-1.3.11.zip
$ cd gns3-server-1.3.11
$ sudo python3 setup.py install

- GNS3 GUI
$ unzip gns3-gui-1.3.11.zip
$ cd gns3-gui-1.3.11
$ sudo python3 setup.py install

とりあえず、ここまでやればIOSのシミュはできるはずなので、
\# sudo gns3 &
で動かしてみる。動かなかったら、適当になんとかする。
Elixirでナップサック問題を書いてみた



勉強で書いてみました。
関数型プログラミングを意識して・・・
もっとこここうした方がいいようとかあれば、意見ください！！


```Elixir:knapsack.ex

defmodule Sack do
    defstruct weight: 0, worth: 0
    def convert(map) when is_map(map) do
        %Sack{:weight => map["weight"], :worth => map["worth"]}
    end
end
defmodule Knapsack do
	def solve(list, index, capa) when capa < 0, do: :over
	def solve(list, index, capa) when length(list) == index, do: []
	def solve(list, index, capa) do
		sum? = fn
			resultList when resultList == :over -> -1
			resultList when resultList == [] -> 0
	    	resultList ->
	    		Enum.map(resultList, fn x -> x.worth end)
                |> Enum.sum
	    end
	    [
	    	solve(list, index+1, capa),
	    	solve(list, index+1, capa-Enum.at(list, index).weight)
	    	  |> case do
	    	    :over -> :over
			    x -> Enum.concat(x, [Enum.at(list, index)])
	    	  end
	    ] |> Enum.max_by(fn x -> sum?.(x) end)
	end
end
defmodule Main do
	def main(args) do
		{:ok, %{
                "goods" => list,
                "sack" => %{
                            "capa" => size
                            }}} = List.first(args)
                                |> File.read!
                                |> JSX.decode
		Enum.map(list, fn x -> Sack.convert(x) end)
            |> Knapsack.solve(0, size)
		    |> Enum.map(fn x -> x.worth end)
            |> Enum.sum |> IO.puts
	end
end
```

github :
https://github.com/monoquro/elixir-knapsack
gist : 
https://gist.github.com/0de161a9dac3c4cb7d58.git
Atom editorを使ってみたメモ

## 参考

* [ATOMをMacにインストールしてやったこと - Milk+ea](http://totora0155.hatenablog.jp/entry/after-having-installed-the-atom-into-mac)
* [ATOMおすすめパッケージ 2015年末版 - Qiita](http://qiita.com/saison/items/e241cb538ff23d1bf386)

## 日本語メニュー

* [今注目のテキストエディタ「Atom」の使い方と便利機能まとめ | Code部](http://blog.codecamp.jp/atom_utility/)
* Install > japanese-menu

# 設定

## File Encoding

* `alt u`
* `ctrl ,` > settings > File Encoding


## Tab Length

* `ctrl ,` > settings > Tab Length > 4 (2)

----

## emmit : htmlタグ入力中、`ctrl e`

* `#header>h1` で `ctrl e`押すと展開される。
* [HTML/CSSを爆速コーディング Emmet入門 第2回 Emmetの省略記法を使って、HTMLを素早く入力する | Adobe Creative Station](https://blogs.adobe.com/creativestation/web-learning-emmet-abbreviations-for-html)

## キーバインド

* ctrl-shift-p
    * commandline表示
* markdownのプレビュー
    * `ctrl shift m`

## 感動した点

* zip内の画像を表示できた
* atom . でディレクトリごと開く

## パッケージ追加

* https://atom.io/packages/

```
apm install パッケージ名
```

* navigate
    * 'CTRL-F1': google検索
* file-icons
    * ファイルのアイコン表示
* pdf-view
    * pdf表示
* open-recent
    * 最近編集したファイル
* pigments
    * カラーコードから色表示
* minimap
    * 右側に全体表示
* minimap-git-diff
    * minimapにgit diff表示
* markdown-preview-opener
    * .mdを開くと自動でプレビューも開く
* vim-mode
    * 微妙にvimキーバインドっぽくなる
* tablr
    * csv編集

## theme

* slack-ui
UbuntuのキーバインドをEmacs風にする

Ubuntu使うの初めてでよくわからなかったので備忘録に

```bash
$ uname -a
Linux vm-wamei 4.2.0-17-generic #21-Ubuntu SMP Fri Oct 23 19:56:16 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=15.10
DISTRIB_CODENAME=wily
DISTRIB_DESCRIPTION="Ubuntu 15.10"
```

### gnome-tweak-toolをインストールする
apt-getでポンと

```bash
$ sudo apt-get install gnome-tweak-tool
```

### 設定を行う
起動して

```bash
$ gnome-tweak-tool
```

「キーボードとマウス」の「キーテーマ」をEmacsにする！

![Screenshot from 2015-11-08 17-25-32.png](https://qiita-image-store.s3.amazonaws.com/0/90613/874e9e56-8faa-7bc9-c647-c10def49be71.png)

他にもなんか色々GUIから楽に設定変えられて便利だった
「IoT事例紹介に関する勉強会」に参加した

# 勉強会の基本情報

* 【日　時】2015年11月05日 19:00~22:00
* 【会　場】レバレジーズ本社（ 渋谷ヒカリエ 17F ）（東京都渋谷区渋谷2-21-1）
* 【参加費】無料
* 【主　催】レバレジーズ株式会社
* 【申し込み】https://atnd.org/events/70708

# 概要

* IoTソリューションを提供するベンチャー企業が集まり、実践的なIoTの事例や今後の取り組みについて紹介される
    * 詳しい講演内容と講演者プロフィールを、https://atnd.org/events/70708に参照してください
* いろいろなIoT事例が紹介されたが、以下にまとめた
    * IoTサービス導入事例より、効果が紹介された
    * IoTゲートウェイ
    * Beacon(位置測定)


# 内容

## IoTサービス導入事例より、効果が紹介された

### [NetLED会社](http://netled.co.jp/)のシステム

![topimg1.jpg](https://qiita-image-store.s3.amazonaws.com/0/13451/bfb0c9ef-9a18-9648-b168-0f9868b40973.jpeg)

* インタネットとNetLEDゲートウェイより、照明のON/OFFなどをコントロールできるようにした

### システム構成

* NetLEDエンジン
    * NetLEDシステムから制御される小型モジュール。NetLEDゲートウェイと繋がって、照明をコントロールできる

* NetLEDゲートウエイ
    * ゲートウエイ照明やセンサー等の制御機器に組み込まれたNetLEDエンジンと直接通信を行う親機の役割を持っている

* NetLEDコントロール
    * スマホやWebから、照明をコントロールできるUI画面

### 効果

* 導入事例より、照明費が削減された


## IoTゲートウェイ

### ぷらっとホーム株式会社の[OpenBlocks IoT Family](http://openblocks.plathome.co.jp/products/obs_iot/)

* 概要
    * OpenBlocks IoTゲートウェイが、TCP/IPでは、センサーや制御機器とインターネットのつながるデバイス

* IoTゲートウェイとして必要な機能
    * センサーや機器類とのインターフェイス
    * インターネットへ繋がれる
    * 通信手段変更機能
    * データ処理のために、必要なパーフォマンス

* OpenBlocks IoT Web-UI
    * ゲートウェイから、センサーやサーバーへ繋がるために、簡単なWeb-UIで可能

## Beacon

### Tangerineのビーコン製品ご紹介

* Beaconとは
    * Beaconは、一つひとつのBeaconを識別するIDや、電波強度を示す識別子などを発信する端子
    * Beaconで、クーポン発行や位置測定ができる

* Tangerineビーコンの主な機能
    * ビーコンの監視運用
    * ビーコンアクション管理
    * マルチベンタービーコン対応
    * 分析レポート

* 事例
    * TSUTAYA店舗に、クーポン発行
    * 飲食店に、情報通信
    * 外国人に、位置測定

# 感想

* IoTサービス導入事例より、効果が紹介された
    * IoT知識勉強から、１ヶ月ぐらいが、実際に各IoTサービスの効果があるかどうかことを知りたい
    * 今日は、事例より、IoTサービスの効果があることがわかった
    
* IoTゲートウェイ
    * raspberryなどのデバイスがよく知っているが、IoTゲートウェイの物が今日からわかった
    * 最近は、googleのbrilloがリリースされたが、実際に何かできるかことがよくわからない。今後に関する勉強会参加して、勉強したい
    * 上記の事例より、一つのサービスが一つのゲートウェイで対応することが、一つの店舗に、いろいろなサービスが利用される場合は、複数なゲートウェイが必要ある、高い〜〜
    * 何かゲートウェイOSは、以上の問題を解決できるか？ brilloか。今後にどんどん調査しよう

* Beacon(位置測定)
    * 位置測定できることが素晴らしい
    * 試したい
Windowsでシンボリックリンク作成@非管理者権限環境

Windowsでは、シンボリックリンクの作成に`mklink`コマンドを使います。

```bat:ファイルの場合
>mklink LINK_NAME TARGET
```

```bat:ディレクトリの場合
>mklink /D LINK_NAME TARGET
```

ただし、セキュリティ上の配慮から、無制限には実行できず、以下のいずれかの対応が必要です。
1. 管理者権限で起動したコマンドプロンプトの上で実行する
2. 事前にポリシーを変更しておく(20160313コメント反映 @asm さんありがとうございます)[^1]
3. 事前に開発者モードを有効にしておく[^2]
グローバルな設定に触りたくない場合、リンクを貼る際に毎度管理者権限でコマンドプロンプトを起動せねばならず面倒です。

# 管理者権限でmklinkを実行する
powershellを使います。
powershellでは、`Start-Process`コマンドに`-Verb Runas`オプションを指定することで、指定したコマンドを管理者権限で実行できます(実行時にUACの画面が出ます)。
そこで、以下のコマンドを用いることで、管理者権限でコマンドプロンプトを起動し直すことなくmklinkを実行することが出来ます。

```bat
powershell.exe -Command Start-Process -FilePath "cmd" -ArgumentList "/c","mklink","LINK_NAME","TARGET" -Verb Runas
```
# 処理をbatファイルにまとめる
上記のコマンドは、とても毎度タイプ出来る長さではないので、前処理などを含めてbatファイルにまとめ、パスの通ったディレクトリに設置します。[Gist](https://gist.github.com/0x60df/0f8f76bd24ce0b054a06)に一例置いておきました。

20190326追記
@cat2151 さんが、上記例を[よりロバストに改良してくださいました](https://gist.github.com/cat2151/56d5aa1e54f719bdc5efc0ed676ebb29)。ありがとうございます。

## batファイルの例

**前処理の内容**

- `LINK_NAME`と`TARGET`の順番を入れ替え(UNIX系の`ln`コマンドの順番にあわせた)
- 渡された引数がファイルかディレクトリかを判別して`/D`オプションを自動で付加

**使い方**

```bat
> ln-s TARGET LINK_NAME
```

[^1]: http://schinagl.priv.at/nt/hardlinkshellext/hardlinkshellext.html#changesymboliclinkprivilege
[^2]: https://docs.microsoft.com/ja-jp/windows/uwp/get-started/enable-your-device-for-development
.phpで始まるすべてのファイルを一括でシンタックスチェックする

# コマンド
`.php`のPHPスクリプトをまとめてシンタックスチェックするには以下のようにする。

```
$ find ./ -name "*.php" | xargs -n1 php -l
```

# 説明

`find ./ -name "*.php"` 
./ のカレントディレクトリで、末尾が .phpのファイルをリストアップする

`| xargs -n1 php -l`
パイプ `|` で `xargs -n1`をつなぐ。

*xargs [オプション] [コマンド [初期引数]]*

コマンドを渡すとそれを実行してくれる便利な`xargs`に、
`php -l`というシンタックスチェックのコマンドを渡す。

`-n` オプションは、引数をいくつ渡すか、つまり、`php -l`というコマンドに
いくつの引数を渡すかということ。

指定しないと
`$ php -l index.php index2.php`
と実行しているのと同じことになるが、これだと`php -l` の特性上、はじめの index.phpしかチェックしてくれない。

`-n1` として引数の最大値を1にすると、
1つ目のindex.phpをチェックする。
1つ以上、引数があった場合は、引数の分だけ複数回実行する。

結果的に`find`で見つかった複数ファイルの分だけ、シンタックスチェックを繰り返し実行してくれるという事になる。

#　参考
http://itpro.nikkeibp.co.jp/article/COLUMN/20140331/547143/
https://hydrocul.github.io/wiki/commands/xargs.html
Neo4jで使用するクエリ言語Cypherのメモ

随時追記予定。


### すべてのノード取得
```sql
MATCH (n) RETURN n
MATCH (n -[r]-> m) RETURN n,r,m;
```

### すべてのノードとrelashonship取得
```sql
MATCH (n -[r]-> m) RETURN n,r,m;
```

### すべてのノードとrelashonshipを削除
```sql
 MATCH (n -[r]-> m) DELETE n,r,m;
 MATCH n DELETE n;
```


### 検索
```sql
MATCH (n:{name:"value"}) RETURN n
```

### ノードの作成
```sql
CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'})
```

//間違い・指摘などありましたらコメントいただけると幸いです。
Deleyed Jobのソースコードを読む


# 概要

Rubyで非同期処理を行うためのgemのdelayed_jobのソースコードを読む中で学んだことをまとめていきます（週1回ずつ更新予定）。
https://github.com/collectiveidea/delayed_job


# delayed_jobについて

* delayed jobについて

以下のQiitaの記事が凄くわかりやすいです。
http://qiita.com/azusanakano/items/1d2629763f35b5466286

* capistranoでのdelayed jobの設定

デプロイするときの設定。
https://github.com/collectiveidea/delayed_job/wiki/Delayed-Job-tasks-for-Capistrano-3


# 内容

## 第1回: SignalとThread

### ソースコード

DelayedJobは、アプリケーションと別のプロセスを走らせて、そのプロセスが一部の処理を担当することで、非同期処理を実現する。そのプロセスを走らせるコマンドが以下。

```bash
rake jobs:work
```

第1回はここから順にコードを読んでいくことに。

このrakeタスクは以下に実装されている。
https://github.com/collectiveidea/delayed_job/blob/master/lib/delayed/tasks.rb#L7-L10

```ruby
namespace :jobs do
  desc 'Start a delayed_job worker.'
  task :work => :environment_options do
    Delayed::Worker.new(@worker_options).start
  end
```

Workerクラスがプロセスの起動を担っているとわかる。Workerクラスのstartメソッドは以下に実装されている。
https://github.com/collectiveidea/delayed_job/blob/master/lib/delayed/worker.rb#L150-L190

```ruby
module Delayed
  class Worker

    def start # rubocop:disable CyclomaticComplexity, PerceivedComplexity
      trap('TERM') do
        Thread.new { say 'Exiting...' }
        stop
        raise SignalException, 'TERM' if self.class.raise_signal_exceptions
      end
      # ...
    end

  end
end
```

いきなり'trap'とか'Thread'とか出てきて何も分からなかったので、まずはこの辺のことをググって勉強。

### Signalクラス

まず最初の'tarp'は、'Signal'クラスのメソッド。

シグナルは、例えばプログラムの実行中にCtrl-Cを押すとプログラムを強制終了することができますが、そういったプログラムとは別の外部からの入力(この例だとCtrl-C)を受け付ける。

Signalクラスを使ったサンプルコード。

```ruby
While true
  puts 'Chris'
  sleep(2) # 2秒ごとに'Chris'と表示される
  Signal.trap(:INT){
    puts "Stop" # Ctrl-Cを押すと'Stop'と表示される
    exit
  }
end
```

これを実行すると、

```bash
Chris # 無限ループでChrisと表示される
Chris
...
Chris # ここでCtrl-Cを押す
Stop # プログラムが終了する
```

こんな挙動になる。delayed_jobでworkerを動かしているときもCtrl-Cでプロセスを終了できるが、これはこういった具合に実装されている。

### Threadクラス

次にThreadクラスのインスタンスを生成している。スレッドはメモリを共有するが、実行を並列化するための仕組み。

以下サンプルコード。

```ruby
def thread_sample
  threads = []
  3.times do |i|
    threads << Thread.new do
      sleep(3-i)
      puts "#{i+1}番目の処理"
    end
  end
end
```

やっていることとしては、1回目の処理は3秒経ってから実行され、2回目の処理は2秒経ってから実行され、3回目の処理は1秒経ってから実行されるというもの。実行結果は以下。

```bash
3番目の処理
2番目の処理
1番目の処理
```

非同期に実行されていることが分かると思います。
この辺の非同期な実行の部分にdelayed_jobの実装の本質があるのかなと思ったところで第1回は終了です。


### 分かったことまとめ

* delayed_jobのプロセスはWorkerクラスに実装されている
* Signalクラスを使って、workerを終了させられる
* Threadクラスによって並列処理を行っている(かも) > 次回以降


### 参考にしたページ

シグナル
http://docs.ruby-lang.org/ja/2.0.0/class/Signal.html
http://www.oki-osk.jp/esc/linux/signal.html
http://dark7110.blog.fc2.com/blog-entry-17.html
http://unageanu.hatenablog.com/entry/20080127/1201423758

スレッド
http://docs.ruby-lang.org/ja/2.1.0/class/Thread.html
http://shirusu-ni-tarazu.hatenablog.jp/entry/2013/07/02/042448
https://recompile.net/posts/active_record_in_a_multi-threaded.html


## 第2回

To Be Continued...
CentOS7 Jenkinsインストール 2/2 (VirtualHost + mod_proxy + Basic認証)


[CentOS7 Jenkinsインストール 1/2](http://qiita.com/m1takahashi/items/ac7f28259d8ac3e74ec8)の状態だと、ビルドの実行などはできませんが、タッシュボードなどは、他人に見られてしまいます。
Jenkins自体に、Basic認証など、サイトそのものへのアクセス制限をする機能はありませんので、Apacheのプロキシー機能とBasic認証を利用して、アクセス制限をしてみたいと思います。
なお、Jenkins(Port:8080)と、Apache(Port:80)は、同一サーバー内にあり、80番ポートにアクセスされた場合に、localhost:8080に中継します。
ファイアーウォールで、外部からの8080ポートへのアクセスは禁止します。

## 環境
* CentOS 7.1
* Jenkins 1.636
* Apache 2.4

## 手順
* SELinuxの無効化
 * localhostの中継ができないので無効にする

```bash:
setenforce 0
```
```bash:
vi /etc/sysconfig/selinux

SELINUX=disabled
```

* Apacheインストール 

```bash:
yum install httpd
```

* Apache VirtualHost + Basic認証の設定

```bash:httpd.conf
<VirtualHost *:80>
   ServerName jenkins.sample.com
   <IfModule mod_proxy.c>
      ProxyRequests Off
      ProxyPreserveHost On
      
      <Proxy *>
         AuthName "Jenkins Login"
         AuthUserFile /etc/httpd/conf/.htpasswd
         AuthType Basic
         Require valid-user
      </Proxy>
      
      ProxyPass / http://localhost:8080/
      ProxyPassReverse / http://localhost:8080/
   </IfModule>
</VirtualHost>
```

* htpasswdの生成

```bash:
htpasswd -c .htpasswd {ユーザー名}
```

* httpdの起動
 
```bash:
systemctl start httpd.service
```

* Firewallの設定

```bash:
# ”Jankins インストール 1/2”で開けた8080ポートへのアクセスを禁止
firewall-cmd --zone=public --remove-port=8080/tcp --permanent
# httpのアクセスを許可
firewall-cmd --permanent --zone=public --add-service=http
# 設定の再読み込み
firewall-cmd --reload
```

## Tips
* Firewallの状態確認

```bash:
firewall-cmd --list-all
```
Arrow function を使いまくっても大丈夫なのか？

[`function`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function) と [`=>`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/arrow_functions) の違いは、 `this` の bind と generator が使えるかどうかくらいという認識なので、タイプ量が減る分だけ基本的には `=>` を使いたいと思っているのですが、パフォーマンス的な問題が気になったのでベンチ [^1]


試したバージョンは `v4.1.1` から `v5.0.0` までの5つ

|Version|Function                    |Arrow function               |
|------:|---------------------------:|----------------------------:|
|v4.1.1 |1,436,822,617 ops/sec ±0.73%|1,427,013,220 ops/sec ±0.83% |
|v4.2.0 |1,444,479,245 ops/sec ±0.82%|1,435,019,562 ops/sec ±0.85% |
|v4.2.1 |1,434,709,532 ops/sec ±0.87%|1,426,388,902 ops/sec ±1.03% |
|v4.2.2 |1,444,670,434 ops/sec ±0.81%|1,430,149,639 ops/sec ±0.87% |
|v5.0.0 |1,440,937,194 ops/sec ±0.74%|1,428,273,914 ops/sec ±1.02% |

あんまり差はないので、自分が使うコードであれば気にしないでガンガン使ってしまいましょう！

* `=>` では `this` はレキシカルになるんだぞ！

[^1]: もちろん `npm publish` するときのことを考えると下位互換を考えれば使うべきではない、という問題はあるかと思いますが一旦それはそれでおいておきます。
Sublime Text3の利用のため、有用なTips,Shortcuts

##Tap設定
ST3のタブのデフォルトは４キャラクターなので、以下の通りタブの設定を行う。
設定の箇所：[Preferences] => Settings - User

 ```sublime
{
   "draw_white_space": "all",
   "rulers": [80],
   "tab_size": 2,
   "translate_tabs_to_spaces": true
}
```
##Shortcuts
以下のキーはWindowsの基盤です。

1.Search/Find
>- `Ctrl + F`　　　　　　　　　　　　　find
- `F3`　　　　　　　　　　　　　　　　find next
- `shift + F3`　　　　　　　　　　　　find previous
- `Ctrl + G + line number入力`　　   　　search code line
- `Ctrl + R + Definition入力`　　 　　 search code Definition


2.Edit Text
>- `Ctrl + /`　　　　　　　　　　　　　comment code（単一行）
- `Ctrl + Shift + /`　　　　　　　　　comment code（範囲）
- `Ctrl + L`　　　　　　　　　　　　　code lineの範囲選択
- `Ctrl + Shift + ↑ or ↓`　　　　　　  code lineの移動
- `Ctrl + D`　　　　　　　　　　　　　単語選択
- `Ctrl + Shift + K`　　　　　　　　　code line削除
- `Ctrl + H`　　　　　　　　　　　　　replace
- `Ctrl + Enter`　　　　　　　　　　　insert line after
- `Ctrl + Shift + Enter`　　　　　　　insert line before
Ubuntu 15.10のUnityのショートカット"Alt+`(grave)"を無効にする

# Alt + Grave ?

英語キーボードでWindowsを利用しているとき、日本語入力モードを切り替える場合には一般的に Alt + `(grave) を利用します。このショートカットは体に染み付いて抜けないので、UbuntuなどのLinuxでも同様に利用したいと考えました。

しかし、このショートカットはUnityのウィンドウ切り替えのショートカットが割り振られているため、先に奪われてしまい、入力メソッドの設定画面に設定できませんでした。そのため無効にする方法を調べてみました。

# Install
今回、設定には「CompizConfig Settings Manager」を利用します。
```
$ sudo apt install compizconfig-settings-manager
```

#設定
インストールしたCompizConfig Settings Managerを起動します。
起動時に警告が表示されるので、内容を確認後、ＯＫを押してください。

起動後、左のカテゴリから「デスクトップ」を選択します
Ubuntu Unity Pluginアイコンをクリック.
Switcher タブを選択します

表示されたページの"Key to flip through windows in the Switcher"が該当する設定項目です。私の環境では無効になっていますが、何故か動作しているため、別のショートカットを割り振りました。

#その他

Ubuntu 15.10 付属のUnityでは、Alt > Grave を押すタイミングが悪いと、Dashが誤爆してしまいます。
Switcherと同様の問題だと思いますが、時間があるときに調べてみることにします。


#参考

http://askubuntu.com/questions/132304/how-to-disable-alt
Amazon SNS で、iOS・Androidにpush通知する方法

ios,android向けアプリのpush通知に、amazon sns利用してみたので、使い方のメモ。


まずは最初の壁。用語についての私なりの解釈。

##用語の整理
### Arn（Amazon Resource Name）
登録データのamazon用ID。このIDを元にデータを参照したり、配信先として呼び出したりする
###Endpoint Arn
端末のトークン（android ならregistration ID）を登録すると、このEndpoint Arnが作られる。１台だけに配信する場合には、このEndpoint Arnを指定する。
コンソール画面から配信する場合は、Applications -> publish to Endpoint
###Topic
複数のEndpoint Arn を登録できる機能。Topicを作成するとTopic Arnができるので、これに対して配信すると、そのTopicに登録されているEndpointすべてに配信される。
###Applications
これが一番分かりにくかった。
Endpointを作成時に、どの端末の種類かを区別するもの。

* iOSなら"Apple Production"か"Apple Deveolpment"
* Androidなら"Google Cloud Messaging(GCM)"

###Subscriptions
Topicの登録リスト。Topicに登録することをSubscribeとも言う。

###Publish
配信すること。１台ならEndpoidt Arn、複数配信するならTopic Arnを指定する。

##配信準備、コンソール編
おおまかな流れは、

* ApplicationsからCreate Platform ApplicationでEndpoint Arn作成
![AWS_SNS.png](https://qiita-image-store.s3.amazonaws.com/0/1533/4ff43fd6-90f0-1746-d109-1b14ee23864a.png "AWS_SNS.png")

* Application Nameは、このApplicationの名前なので分かりやすい適当な名前にする。
* Push Notification Platform で配信先の端末の種類を選択。iOSかandroidなら画像の囲ったいずれかを選択
![AWS_SNS_create_app.png](https://qiita-image-store.s3.amazonaws.com/0/1533/19634841-3f8e-e56e-a444-18d9aafca0c8.png "AWS_SNS_create_app.png")



* Topic 作成（複数端末に同時に配信したい場合）
![AWS_SNS_create_topic.png](https://qiita-image-store.s3.amazonaws.com/0/1533/00a08d5f-f330-ca7a-a752-e2078f256ecb.png "AWS_SNS_create_topic.png")

- Topic NameがAPIなどから呼び出す際も利用する名前。Display Nameは任意で表示用の分かりやすい名前をつける。無くてもOK。
![AWS_SNS_create_topic_new.png](https://qiita-image-store.s3.amazonaws.com/0/1533/168de663-5ca3-954e-18cd-1a1416b94e3c.png "AWS_SNS_create_topic_new.png")


- Topic ができたらCreate Subscription して、ProtocolにApplicationを選択し、Endpointに先ほど生成されたEndpoint Arnを入力
![AWS_SNS_create_sub.png](https://qiita-image-store.s3.amazonaws.com/0/1533/cdd35d7d-2d1c-3c4b-6a4c-3f2d296046e2.png "AWS_SNS_create_sub.png")
![AWS_SNS_create_sb2.png](https://qiita-image-store.s3.amazonaws.com/0/1533/23fd1571-f15a-69a0-acf8-26333800d65f.png "AWS_SNS_create_sb2.png")


- なお、Endpoint Arnの確認方法は、Applications から該当EndpointをチェックしてPublish to Endpoint。でキャプチャのとこをコピペ。なぜかちょっと手間。
![AWS_SNS_conf_endpoint_arn.png](https://qiita-image-store.s3.amazonaws.com/0/1533/9c7ab6b3-98d1-4aaf-2e63-cbe09f89e54f.png "AWS_SNS_conf_endpoint_arn.png")



## Publish
準備ができたので、配信です。

### １台だけの配信の場合
  1. Applications -> 該当端末のARNをクリック
  1. 該当端末をチェック -> Publish to Endpoint
  1. JSON message generator から、配信メッセージ入力。すると、対象のapplicationに合わせてjsonを生成し入力済みになる
![AWS_SNS_create_message.png](https://qiita-image-store.s3.amazonaws.com/0/1533/57c0435c-d07d-6871-197f-dbc8db1d798c.png "AWS_SNS_create_message.png")


![AWS_SNS_create_message_input.png](https://qiita-image-store.s3.amazonaws.com/0/1533/7d4f199e-fc18-6541-0472-6450d3eba842.png "AWS_SNS_create_message_input.png")


4.Publish message

### 複数配信（topic配信）の場合
  1. Topics -> 該当topicをチェック -> Publish to topic
  1. JSON message generator から、配信メッセージ入力。対象のapplicationに合わせてjsonを生成してくれる。複数のapplication（iOSとandroid等）が含まれていればそれも考慮した複合jsonを生成してくれます。便利！
  1. Publish message

##使い方、API編
と行きたかったですが、長くなったので一旦終わり。
処理の手順は、基本上記コンソールと同じです。
Unity C#のコレクションってなんぞや  〜もっと自由に配列扱いたくて〜


UnityでC#書いてて
普段主にjsを書いている私はC#の配列操作が謎で困りました。
(サイズの決まってない配列の扱いとか、、json受け取るとき何で受け取ればいいんだとか)
そんな時出会ったのが噂の「コレクション」です。


壮大なイメージでしたが、
「用途によって使い分けてね、便利なオブジェクトの管理用の拡張配列クラスこれくしょんしたよ」
って感じでした。


> C#では、多数のオブジェクトをまとめて扱う場合、
配列の他に「コレクション」と呼ばれるクラスを利用することができます。
コレクションは、 System.Collection.Genericsというパッケージにまとめられています。

▫️参考
http://libro.tuyano.com/index3?id=2656003


ArrayList
List
Hashtable
Dictionary
Queue (怖いので今回触れない)
Stack (怖いので今回触れない)
などがあるそうです。


# ArrayList

オブジェクトを順番付けして管理するためのコレクションです。
平たくいえば、「配列とだいたい同じような扱い方ができるコレクション」


```csharp:hoge
using System;
using System.Collection.Generics; // これ忘れず

ArrayList list = new ArrayList();
list.Add("hoge");
list.Remove("hoge");
list[0] =  "hoge";
int num = list.Count;   // 要素数
```



# List

ArrayListとだいたい同じ
決まった種類のオブジェクトだけを保管しておくような場合
ArrayListと同じメソッドが用意されてる


```csharp:hoge
using System;
using System.Collections.Generic; // さっきと変わりました、ジェネリックです

List<string> list = new List<string>();
list.Add("One");  // とか一緒

// おまけのforeach
foreach(String str in list){
	Debug.Log(str);
}
```



# Hashtable

一般に「連想配列」とか「ハッシュ」とかいわれるもの。
インデックス番号を使わずにキーでオブジェクトを管理。


```csharp:hoge
using System;
using System.Collection.Generics;

Hashtable table = new Hashtable();
table.Add("tom","tom@hogehoge.com");
table["tom"] = "tom@hogehoge.com";
table.Remove("tom");
```





# Dictionary

 ArrayListに決まった種類のオブジェクト版のListがあるように、
 このHashtableにもあり、それがDictionary。
 Dictionary < クラス名 , クラス名> 変数 = new Dictionary < クラス名 , クラス名 >();
 使い方は基本的にHashtableと同じ


```csharp:hoge

using System;
using System.Collections.Generic;

Dictionary<string,string> dict = new Dictionary<string, string>();
dict.Add("tom","tom@hogehoge.com");
dict["tom"] = "tom@hogehoge.com";
dict.Remove("tom");
```
[メモ]WebKitをWatchする

最新のブラウザ事情を知るためのメモ

## WebKitプロジェクトのML登録

様々なMLがあるためその説明を行う。
公式の説明として下記リンクになる。
http://www.webkit.org/contact.html

webkit-dev@lists.webkit.org
開発者用ML

webkit-help@lists.webkit.org
WebKitのAPIや構築する方法などを質問するためのML

webkit-unassigned@lists.webkit.org
Bugzilaに起票された新しいバグの通知がされるML

﻿﻿webkit-reviews@lists.webkit.org
Bugzilaに起票されているレビュー待ちのものが通知されるML

webkit-changes@lists.webkit.org
コミットされた変更点を通知するML

MLの登録は下記で行える。
http://www.webkit.org/contact.html

## 公式ページについて

### 今後の状態確認
https://www.webkit.org/status.html
今後の対応であったり、対応が完了されているか確認することができる。

http://planet.webkit.org/
現状動いている仕様の確認ができる。

https://www.webkit.org/coding/coding-style.html
WebKitのコーディング規約

## Bugzila
https://bugs.webkit.org/
アカウントはNew Accountより登録できる。

登録しなくてもBrowseより起票されているものを見ることができる。
New Bugsと書かれているのを開くと新しいバグの内容を確認できる。

## WebKit のソース
公式
https://www.webkit.org/building/checkout.html
より
ミラーとしてGitHubにも公開されている。

ソースチェックアウト後のビルドは下記参照
https://www.webkit.org/building/build.html
CSVの文字化け対策


# 概要

RubyでCSVを扱うとき、文字化けなど種々の問題にしばしば遭遇するので、その都度行った対策のまとめ。


# 項目

* 日本語が文字化けする
* 改行コードがおかしい
* セル内の改行がおかしい
* 特殊な文字によるエラー


# 内容

## 日本語が文字化けする

エクセルで作ったcsvは文字コードがShiftJSになっている。
そのCSVをRubyでそのまま読み込むと文字化けしているので、文字コードをUTF-8にする。

逆に、Rubyで生成したCSVをエクセルで開こうとすると文字化けするので、ShiftJSに変換する。

具体的には、nkfコマンドでUTF-8に変換する。

```bash
$ nkf -g sample.csv
# 当該ファイルの文字コードを見る
# Shift JS

$ nkf -w --overwrite sample.csv
# UTF-8に変換する

$ nkf -g sample.csv
# UTF-8
```

nkfコマンドが使えない場合は、

```bash
$ brew install nkf
```

でインストールできる(homebrewを使っている場合)。

* 参考

http://kawatama.net/others/mac/1754
http://linuxserver.jp/linux/nkfでファイルの文字コードと改行コードを変更
http://www.uetyi.com/server-const/command/entry-312.html
http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230849/


## 改行コードがおかしい

Rubyやvimで開くと改行コードの

```vim
^M
```

がそのまま文字として出ていることがある。
そういうときはこれを置換する。

具体的には当該csvをvimで開いて、

```
:%s/^M/^M/g
```

として置換する。^Mは、

* 参考

http://qiita.com/gecko655/items/17d3f6b272e1c4548a6f


## セル内に改行がある

ふつうにエクセルで改行を消す関数があるのでそれで消す。

http://officetanaka.net/excel/function/tips/tips09.htm


## 特定の行だけエラーが出る

どれだけ対策しても、対策しきれない特殊な文字もある（キリル文字とか）。
そういうときは思い切って、エラーが出ている行だけ直接、CSVを編集しみる。
そうすると、それで他の行は問題なく通るということがある。
gulpfileをES2015(ES6)で書く

今までも`gulpfile.js`経由で`gulpfile.es6`を呼ぶ方法で書けたようですが、
gulp 3.9.0以降、ES2015で書いたgulpfileが直接使えるようになったそうなので検証してみた。

[ES6 In Your Gulp Tasks](https://stephensauceda.com/es6-in-your-gulp-tasks/)

# gulpのアップデート

```
$ npm upgrade gulp 
$ npm upgrade -g gulp
$ gulp -v
[15:37:36] CLI version 3.9.0
```

# babelのインストール

```
$ npm install -D babel
```

# gulpfileをES2015で書く

ファイル名を`gulpfile.babel.js`にするのがポイント

```js:gulpfile.babel.js
import gulp from 'gulp';
import browserify from "browserify";
import source from "vinyl-source-stream";

gulp.task("default", () => {
  browserify({
      entries: ["./src/app.es6"]
    })
    .bundle()
    .pipe(source("app.js"))
    .pipe(gulp.dest("./build"));
});
```

実行するとimportでコケる

```
./gulpfile.babel.js:1
(function (exports, require, module, __filename, __dirname) { import gulp from 'gulp';
                                                              ^^^^^^

SyntaxError: Unexpected reserved word
...
```

# ES2015のPresetが必要

[Babelを6系にアップデートしたらgulpでこける - Qiita](http://qiita.com/sawapi/items/e11d0cfbbacd078b2c3a)

importを使うには下記のpresetが必要なのでインストールする。
[ES2015 preset · Babel](http://babeljs.io/docs/plugins/preset-es2015/)

```
$ npm install --save-dev babel-preset-es2015
```

presetsの設定を`.babelrc`もしくは`package.json`に記述(どちらか一方でOK)

```.babelrc
{
  "presets": ["es2015"]
}
```

```package.json
{
...
  "babel": {
    "presets": ["es2015"]
  }
}
```

# 再度実行
```
$ gulp
[15:34:28] Requiring external module babel-core/register
[15:34:31] Using gulpfile ./gulpfile.babel.js
[15:34:31] Starting 'default'...
[15:34:31] Finished 'default' after 17 ms
```

# 所感

今のところgulpfileをES2015で書くメリットはあまりないし、
coffeeで書いたほうが直感的に書けるものの、
せっかくES2015を書くんだし揃えておきたいので、
しばらくは`gulpfile.babel.js`で運用してみることにする。
Xcode 9で気がついたPlaygroundの変更点

# はじめに

Xcode 9(Swift 4)でPlaygroundの一部の記述方法が変わっていたようなので覚書

# 作成したViewをタイムラインに表示する

PlaygroundでUIViewを表示したい場合に使用します。

```swift
XCPlaygroundPage.currentPage.liveView = view
```
新しい書き方は以下のとおりです。

```swift
PlaygroundPage.current.liveView = view
```

# 非同期処理の許可

Playgroundで通信処理などを実行したい場合に使用します。

```swift
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
```
新しい書き方は以下のとおりです。

```swift
PlaygroundPage.current.needsIndefiniteExecution = true
```

# 上記のPlaygroundPageを使用するためのインポート

```swift
import XCPlayground
```

新しい書き方は以下のとおりです。

```swift
import PlaygroundSupport
```
Spreeに静的ページの管理機能を追加する

Spreeの管理画面から静的なページを作成、編集する機能を追加しましょう。

デフォルトのSpreeは管理画面から静的ページを編集できる機能を搭載していないため、もしサイト内に静的ページを設けたい場合にはRailsの`public`ディレクトリ内にページを作成するなど、少々不便なところがあります。

そんなときに役立つのがこのエクステンションです。

[spree-contrib/spree_static_content](https://github.com/spree-contrib/spree_static_content)

これをインストールすることで、Spreeの管理画面からページを簡単に編集することができるようになります。

## エクステンションのインストール

インストールは簡単です。まずは以下をGemfileに記載しましょう。branchの部分は、Spreeのバージョンにあわせて書き換えてください。

    gem 'spree_static_content', github: 'spree-contrib/spree_static_content', branch: '3-0-stable'

次にこちらのコマンドを実行。

    bundle && bundle exec rails g spree_static_content:install

これで完了です。`rails s`すると、管理画面のメニューから静的ページが管理できるようになります。便利ですね。

## エクステンションの日本語化

エクステンション内に日本語のロケールファイルが存在しないので、`translation missing`が発生します。とりあえず私のロケールファイルをGistにアップしていますので、もしよければご利用ください。

[spree_static_content_ja.yml](https://gist.github.com/kamiya54/690a64ec63fdbe11ad35)

## HowTo (Github READMEの日本語訳です)

管理者タブで「ページ」オプションを使用でき、静的ページをSpreeに追加することができます。ページ内容は直接データベースより引き出され、レイアウトファイル、部分ファイルとを分けて管理できます。

管理者タブで、「新しいページ」から新しい静的ページを作成できます。

ロードされるタイトル、スラグ(URL)、本文とメタフィールドをそれぞれ書き換えることができます。タイトル、スラグ、本文は必須項目です。

layout、partialが指定されていないものは、データベースから読み込まれた後にSpreeアプリケーションのレイアウトの中に読み出されます。

### レイアウト、パーシャルレンダリング

Spreeアプリケーションのレイアウトを使わずにページを返すなら、レイアウトファイルを相対パスで指定してください（例:`spree/layouts/layout_file_name`）このファイルにはアンダースコアによるプリフィックスは不要です。

パーシャルとして返すならば、レイアウトファイル名にパスを指定して、「部分レイアウトとして表示」オプションをチェックしてください。レイアウトエリアで指定されるパスにはアンダースコアは含まれませんが、ファイル名には必須です。

また、`render_snippet`ヘルパーが使えることも覚えておくてください。スラグによってページを見つけ、そのページボディをあなたのビューの任意の場所にレンダリングします。

### オプション

「〜に表示」チェックボックスで、ヘッダー、フッター、サイドバーにそのページへのリンクを表示するかどうかを指定することができます。「位置」でそれらの表示される順番を設定できます。

最後に、「公開」チェックボックスで公開/非公開を切り替えます。もしチェックされていないならば、そのページは開くことができません。

## 使い方

### 基本的な使い方

BODYにはHTMLが使えます。

「公開」チェックボックスにチェックを入れて、STOREチェックボックスの該当ストアにもチェックを入れて保存するとページが公開されます。

「サイドバーに表示」「ヘッダーに表示」等にチェックを入れると、いわゆるグローバルナビゲーション部にページへのリンクが表示されます。

### 一歩進んだ使い方

`spree/layouts/layout.html.erb`にようなレイアウトファイルをSpreeアプリケーション内に用意しておき、それを管理画面で指定してあげることでそのレイアウトファイルを使用してページを表示することができます。

また、erbファイル内で`render_snippet`メソッドを用いてスラグを指定することで、ページを引用して表示することができます。

こんな感じで使います。

```erb
<%= render_snippet('/footer_links') %>
```

### よくわからない点

「部分レイアウトとして表示」の使い方が不明です。`render_snippet`メソッドがあるのに何に使うのでしょう。色々試してみましたが結局用途も使い方もわかりませんでした。


## 不具合？

原因不明ですし、私だけなのかもしれませんが、3-0-stableで`render_snippet`を使うと`NoMethodError in Spree::StaticContent#show`が表示されます。`undefined method 'render_snippet'`と表示されているので、なんらかの影響でエクステンション内のヘルパーが読み込まれていない模様です。

根本的な解決ではありませんが、Spreeアプリケーション内に以下のファイルを設置したところ治りました。エクステンション内にも同一のファイルはあるはずなのですが、、一体なんででしょうね？

```rb:app/helpers/spree/pages_helper.rb
module Spree
  module PagesHelper
    def render_snippet(slug)
      page = Spree::Page.find_by_slug(slug)
      raw page.body if page
    end
  end
end
```
新言語を学ぶ時の３つのポイント～見習いPGのメモ～

#新言語を学ぶ時の３つのポイント
##勉強苦手なんですよ。
私、勉強苦手なんですよ。
大学受験サボったし、大学はFランク(自称)だし。
そんな私が、常に新しい知識を勉強し続けなければいけない、
この業界に入ったのは些かミスマッチ。

ただ、勉強する時には受験と同じで、必ずポイントがある。
今回は、「新言語を学ぶ時の3つのポイント」についてまとめました。

##3つのポイント
私が、新しい言語を学ぶ時に必ず意識するのが、次の3つのポイント。
実際に新人研修でJavaを学んだ後、PHPにRubyと頭が追いつかなかったけど、
次の3つのポイント意識するだけで全然違いました。

###1.参考書読む
まずは、基本をおさえる。
私の場合は、「初めての◯◯」系の本買いました。
変数宣言や分岐(if)、繰り返し(for、while)などの基礎を身につけるためです。
そもそも基礎を身につけなきゃ、
プログラムが上手な人のソースを見てもちんぷんかんぷん。

最低でも３回くらい読み返せば良いんじゃないでしょうか。
これをやるだけで、ソースの読解力全然違います。


###2.配列の扱いと、繰り返し文は必須で身につける
私がWebアプリケーションを作ることが多いだけなのですが、
基本的にWebアプリケーションのシステムって、以下の動きですよね。

1.DBから値を配列で取得する。
2.配列の値を繰り返して、ぐるぐるしながら画面に描写。

ほとんど、やっていることはこんなもん(なイメージ)
あとは、GetやPostで渡される値もだいたい配列ですし。
これが基本で、後は画面ごとの仕様だとかDB上の制約だとかがつくくらい。

どんなに業務が忙しくても、仕事として必要であれば、
言い渡された翌日には最低限、配列の扱いと繰り返しは身につけておきたいです。


###3.他言語との比較
これが、けっこう効く。
私の時は、Rubyだったのですが、
Javaとくらべて文字列の扱いが圧倒的に楽じゃないですか。

Javaだったら文字列を連結するためには、
StringBuilderのなんちゃらメソッド使ってほにゃららだけど、
Rubyなら、+ だけで文字列連結が可能。

最初にこの違いを発見した時の「驚き」を大事にすることがポイント。

後は、メモリとか裏で実際にどう動いているとかまで、
言語ごとに手を出せるようになれば、
また一歩成長できると思います。

##まとめ
以下が、今回言いたい3つのポイント。
1.参考書読む
2.配列の扱いと、繰り返し文は必須で身につける
3.他言語との比較

以上、私が新言語を学ぶ時に教えていただいた３つのポイントでした。
ぶっちゃけ、ここに書いたことって「当たり前」なのかもしれません。
ただ、右も左も分からなかった私にとって、「目から鱗」なポイントでした。
もちろん人によって勉強手法は合う合わないはあるので、
参考程度にしてもらえれば幸いです。
Laravel5やLumen でartisanが "Cannot redeclare class Event" で起動できないときの対応


# 事象
Laravel5|Lumenで、

```shell
% laravel new testapp
```

または、

```shell
% lumen new testapp
```

として、まっさらなプロジェクトを作成して、さて既定のWelcomeな画面確認すっかという時に、

```shell
% cd testapp
% php artisan serve


                                
  [ErrorException]              
  Cannot redeclare class Event  


```

とエラーが出て怒られた。Event クラスを再宣言するな、と。
ローカル環境のMacで発生し、そのゲストOSのFedora 23 上で再現しなかった。

# 原因
同志を探したところ、原因は、こういうことらしい。
http://laravel.io/forum/05-14-2015-cant-run-artisan-in-lumen
> You have the php_event pecl extension installed

なるほど、php_event のエクステンションと、Laravel|Lumen でクラス名が衝突している、と。
考え無しに使うかどうかわからんモジュールを何でもかんでもワイルドカードで入れるからこうなる。

# 対応
以下で対応。
あらためて、環境は、
OS  : Mac OS X 10.10.5(Yosemite)
PHP : 5.6.15 (brew install php56 でインストール。phpenv未使用)

```shell
brew remove php56-event
rm /usr/local/etc/php/5.6/conf.d/ext-event.ini
```

再度、artisanの動作確認。

```shell
% php artisan serve
Lumen development server started on http://localhost:8000/
```

動いた。

# 教訓
- 名前空間重点
- エクステンションだのモジュールだのライブラリだのは必要であることを確認してから入れろ
- ローカル環境の管理しっかりしろ