OmniAICreator/Qiita-1.07M huggingface dataset:
IntelliJ IDEA でプロジェクト作成し、Bitbucketにpushするまで


新規プロジェクトを作成して、Bitbucketで管理できるようにするまでを簡単にメモ

## 前提
- IntelliJ IDEA : 2016.2
- Bitbucket のアカウントは作成済み
	
## 新規プロジェクトの作成

「Create New Project」(またはメニューの[File]-[New]-[Project])を選択するして、「New Project」ウィンドウを表示する。

![IntelliJ_IDEA_1.png](https://qiita-image-store.s3.amazonaws.com/0/35098/6a5e5cda-53e7-d5e2-6197-547349a89541.png "IntelliJ_IDEA_1.png")

![IntelliJ_IDEA_2.png](https://qiita-image-store.s3.amazonaws.com/0/35098/366ead5c-16e2-80f1-c2a4-394712916137.png "IntelliJ_IDEA_2.png")


Project SDKでjava1.8を選択し、GradleでJavaを選択して、[Next]を押す。


次は以下を入力して、[Next]を押す。

|項目|値|メモ|
|:---|:--|:----|
|GroupId|com.example|プロジェクトのルートパッケージ名|
|ArtifactId|sample|プロジェクト|

![IntelliJ_IDEA_3.png](https://qiita-image-store.s3.amazonaws.com/0/35098/ded0c7c3-30e8-b5b7-7ba2-badfe08160b1.png "IntelliJ_IDEA_3.png")

下記をチェックする。
Create directories for empty content root automatically
Create separate module per soruce set

Gradleは「Use default gradle wrapper」を選択し、GradleJVMはProject SDKと同じにする。 

![IntelliJ_IDEA_4.png](https://qiita-image-store.s3.amazonaws.com/0/35098/9c54ffbc-1791-888a-ae2c-c605ad9b885a.png "IntelliJ_IDEA_4.png")

内容を確認して、[Finish]を押す。

![IntelliJ_IDEA_5.png](https://qiita-image-store.s3.amazonaws.com/0/35098/a20a4be7-48d9-ed13-3cdf-0f851292957c.png "IntelliJ_IDEA_5.png")

moduleのディレクトリなどを作成するため、しばらく待つ。
テンプレートのディレクトリの初期作成が終わると下の画面のような構成になる。

![IntelliJ_IDEA_6.png](https://qiita-image-store.s3.amazonaws.com/0/35098/12bcb8bb-97db-d35c-6dd4-4a9b49ca4d91.png "IntelliJ_IDEA_6.png")

.gitignoreファイルを作成する

```
.idea
*.iml
.gradle
build
```

## bitbucket にリポジトリを作成

ブラウザより、bitbucketに新しいリポジトリを作成する。
例では、intellij_sample で作成

![IntelliJ_IDEA_7.png](https://qiita-image-store.s3.amazonaws.com/0/35098/2ab90648-ff24-9711-509d-e41321d246f5.png "IntelliJ_IDEA_7.png")


## プロジェクトの内容をリポジトリにpush

プロジェクトのメニューからVCS - Import into Version Control - Create Git Repository... を選択して、「Select directory for git init」ウィンドウを表示する。

プロジェクトのディレクトリを選択して、[OK]を押す。

![IntelliJ_IDEA_8.png](https://qiita-image-store.s3.amazonaws.com/0/35098/157ce72a-d0b4-58b5-231a-3d58682425d8.png "IntelliJ_IDEA_8.png")

プロジェクトのGit - Addを選択して、プロジェクトの内容を追加する。

![IntelliJ_IDEA_9.png](https://qiita-image-store.s3.amazonaws.com/0/35098/543246d0-7cd2-b63d-4c70-93239525d1f1.png "IntelliJ_IDEA_9.png")

次に、Git - Commit Directory... を選択して、「Commit Changes」ウインドウを表示する。

Commit Message を入力して、Commit 

![IntelliJ_IDEA_10.png](https://qiita-image-store.s3.amazonaws.com/0/35098/0a945b3b-72ce-58e5-9406-0df03b4086b4.png "IntelliJ_IDEA_10.png")

Git - Repository - Push を選択して、「Push Commits」ウィンドウを表示する。

Define remote を選択して URLに bitbucket の URL を入力する。

URLはリポジトリの「既にプロジェクトがあります」の git remote add origin xxxx の内容を参照。

```
git@bitbucket.org:username/intellij_sample.git
```

![IntelliJ_IDEA_11.png](https://qiita-image-store.s3.amazonaws.com/0/35098/a9fa106c-d985-801c-39b5-02a4051b225d.png "IntelliJ_IDEA_11.png")


そして、Pushを押す。
Bitbucketでソースがpushされたことを確認。

![IntelliJ_IDEA_12.png](https://qiita-image-store.s3.amazonaws.com/0/35098/4174a7f5-d1b4-7c9b-dd34-6c702c4417b8.png "IntelliJ_IDEA_12.png")
書いて覚えるJava8のStreamAPI

去年作ったものがいつの間にか社内で新人研修のカリキュラムに入っていた。きっと他の人にも役立つと思ったので紹介します。

## 書いて覚える、とは？
Java8の新機能の紹介ページを見ていても**ピンと来ない**。理由は**手を動かしてないから**です。

この投稿で紹介するのは**JUnit形式で問題を出題し、問題の説明に従って解いていくことでJava8の文法を学習していけるという教材**です。
簡単な例題を見てみます。

```java
@Test
public void simpleAddition() {
    /**
     * Get an addition result of 1 and 2 by using an operator "+".
     */
    Integer added = null;

    assertThat(added, is(3));
}
```

問題の説明いわく、`1`と`2`の加算結果を`+`演算子を使って求めよ、とのこと。以下のように回答すればいいです。

```java
@Test
public void simpleAddition() {
    /**
     * Get an addition result of 1 and 2 by using an operator "+".
     */
    Integer added = 1 + 2;

    assertThat(added, is(3));
}
```

テストを実行してみると、テストが成功するようになります。これでJavaでの足し算のやり方を覚えられました。
そして実際に手を動かしましたので忘れにくいのではないでしょうか。

**同じようしてにJava8の文法も勉強しよう！**というのが今回紹介するものの戦略です。

## さっそく手を動かそう
まずは自分のIDEを立ち上げ、以下を`git clone`します。

```
$ git clone https://github.com/konohiroaki/java8-code-kata.git
```

依存するライブラリをダウンロードします。（IDEによっては自動で依存解決されるので必要ないかもしれません）

```
$ /path/to/java8-code-kata/mvnw install -Dmaven.test.skip=true
```

依存解決できたら、テストを解いていきましょう！
MSC-MOD20 > ALFAT 2 / ALFAT SoC / ALFAT 2 SoC > 全部同じです

http://qiita.com/7of9/items/51459b084eb97bbf602d
にて混乱した表記の問題。

forumにポストしたら10分後にGHIの人から回答が来た。
https://www.ghielectronics.com/community/forum/topic?id=23527&page=1#msg218641

> They are all exactly the same thing. The names came about for historical reasons but mean nothing today.

これで資料を気にせず読める。

頑張って読んだ資料が別のchip向けだった、という落とし穴は回避できそうだ。
PHPでcURL POSTするときは、ちゃんとエンコードしましょう（しなくても動くからこそ！！）

# まちがいさがし
```php:bad.php
$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL => 'http://hoge.com/fuga',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => ['hoge' => 'fuga'],
]);

$response = curl_exec($ch);
curl_close($ch);
```
どこにでもあるPHPコードに見えるけど、間違いがあります。

```php:good.php
$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL => 'http://hoge.com/fuga',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => http_build_query(['hoge' => 'fuga']),
]);

$response = curl_exec($ch);
curl_close($ch);
```
正解は、`http_build_query` するだけ！

# なんで？
一番の問題は、どちらのコードも動いてしまうこと。**ただ、 `bad.php` はすごく時間がかかる**ので、やっちゃだめ。

headerを見てみると、`good.php` は　`Content-Type: application/x-www-form-urlencoded` なのに対して、`bad.php` は `Content-Type: multipart/form-data; boundary=------------------------ffe0ce1791e44a80` みたいになっているはず。

要するに、（別に `http_build_query` じゃなくてもいいけど）ちゃんとエンコードしてあげないと `multipart/form-data` で通信してしまう。これはファイルの転送とかに使うプロトコルで、オーバーヘッドが大きい。

実際、

```php
echo curl_getinfo($ch, CURLINFO_STARTTRANSFER_TIME);
```
とかやってみてほしい。`good.php` は数ミリ秒とかなのに、　`bad.php` は1秒以上かかっているのがわかると思う。

# もう一度言う
そんな初心者みたいなこと。と思うかもしれない。ただ、これは案外発見が難しいことだと思う。

なぜなら、**どちらもPHPとしては正常に動くし、アプリケーションとしても仕様通りの動作をするから。**

ただ、**少しばかり転送に時間がかかる。**

一番厄介なのが、動作はしているということ。cURLの部分なのでUnitTestでは検査しにくいし、開発環境では多少の遅延はあまり気にならない。このミスにQA環境なりにあげるまでに気づけるタイミングがあるとしたらコードレビューだけど、いつもの馴染みのcURLだと思ってレビューすると、`http_build_query` してるかどうかなんてほとんど気にしない。

で、QA環境なりに入れて、結合試験のフェーズになって、「あれ？HTTPタイムアウトしてんぞ」と気づく。

そうなると、ミドルウェアとかRTTとか、低レイヤーなところを疑ってしまって、あまりコードに目がいかない。（なんたって、開発環境で動いているし、UnitTestもちゃんと書いているし、コードレビューも通っているんだから！！）

ということで、cURLのオプションはちゃんと気にして実装しよう＆ちゃんと気にしてレビューしよう（あるいは生のcURLを書くのはもうやめよう）。
RailsのMigrationでさくっとパフォーマンスアップ

csvをめちゃくちゃMySQLに突っ込む必要があって、Migrationしていたんだけど普通にやってたら500万件もあるのでめちゃ時間かかってたので高速化してみた。

```rb

require "csv"

Dir.glob("/home/jumbo/BuildingHeights/*").each{ |val|
  CSV.foreach(val) do |row|
    BuildingInfo.create(:latitude => row[0], :longitude => row[1], :altitude => row[2], :groundaltitude => row[3])
  end
  BuildingInfo.import models
}

```

便利なactiverecord-importというものがある。
その結果以下のようなコードになった。

```rb
require "csv"

Dir.glob("/home/jumbo/BuildingHeights/*").each{ |val|
  models = []
  CSV.foreach(val) do |row|
    models << BuildingInfo.new(:latitude => row[0], :longitude => row[1], :altitude => row[2], :groundaltitude => row[3])
  end
  BuildingInfo.import models
}
p "done"

```

ActiveRecort時
開始時間："2016/07/31 12:23:39.781"
終了時間："2016/07/31 12:27:01.391"

BulkInsert時 - 100000件
開始時間："2016/07/31 12:21:31.347"
終了時間："2016/07/31 12:21:55.142"

うん、めちゃめちゃ早くなった。笑う。
CSVをちょくでMySQLに突っ込めばいいのでは？？という案もふっと浮かんだけど満足した
brew で android sdk を入れたときの ANDROID_HOME 設定

理由とかいまいち分からなかったのですが、解決したのでメモ

# 課題

参戦しようと思った Android のプロジェクトで

```
./gradelew
```
をしたら、

```
java.lang.RuntimeException: SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID_HOME environment variable.
```
が出てしまった。

sdk のディレクトリ指定が足りないのかと思い、適当に

```
export ANDROID_HOME=$(pwd)
```
とかするが、今度は

```
failed to find target with hash string 'android-24'
```
と出てしまう


# とりあえず解決した方法

```
export ANDROID_HOME=$( brew --prefix android-sdk )
```
をしたら解消しました。
Arch Linux でプリンタを使えるようにする

# プリンタの設定

CUPS をインストールして起動．

```
$ yaourt -S cups ghostscript gsfonts 
$ sudo systemctl enable org.cups.cupsd.service  
$ sudo systemctl start org.cups.cupsd.service  
```

http://localhost:631 にアクセス．
root でログイン．

# OKI C610dn2
[ここ](http://www.okidata.co.jp/solution/unix/ppd.html) から PPD を入手し，CUPS の Web インタフェースからプリンタを追加．

# EPSON LP-9100
[ここ](http://openprinting.org/driver/eplaser-jp) から PPD を入手し，CUPS の Web インタフェースからプリンタを追加．

# NEC MultiWriter 5750C
[ここ](http://jpn.nec.com/printer/laser/support/os/linux/download/mw5750c.html) から RPM もしくは DEB を入手し，その中身を適当な位置に移動，PPD を使って CUPS の Web インタフェースからプリンタを追加．
コンパイル時に1のみのビット数を定数化させる関数

ゲームエンジンのkernel部分を作る上で思いついたので書き留めようかと思います。

### **※追記**

**rinse_ さん と kazatsuyu さん がコメントにて、条件もループも排除した定数化関数の実装例を挙げています。
下記のアルゴリズムを使用するより、遥かにスマートな方法なので、コメントの実装内容を真似した方が良いと思います。
<br>
今回の記事はconstexprの下手な使い方という認識で良いと思います。**

### **必要になった経緯**
ある変数で2進数の1になっているビット数が欲しい状況が発生しました。

なので、VC++の組み込み関数 __popcnt を使おうと思ったのですが、使用する箇所が何度も呼ばれる場所だったので何とも定数化したいなと考えました。（コンパイラによる最適化によって定数化するかもしれませんが、そこらへんは検証していないので分かりません）

***

### **実装方法**

テンプレートで定数化しようかと思いましたが、C++11からコンパイル時にconstexpr(コンパイル時による計算で定数化できる機能)が使えるということで、これを関数に適用させてみました。

結果をまずお見せしますと、以下のようなコードになりました。

```cpp:constexpr_test.cpp
constexpr u32 recursivelyScanStandBit(u32 value)
{
	return (value & 0x01) ? recursivelyScanStandBit(value >> 1) + 1 : (value == 0 ? 0 : recursivelyScanStandBit(value >> 1));
}

constexpr u32 constStandBits(u32 value)
{
	return recursivelyScanStandBit(value);
}
```

実際に使う関数は constStandBits で、引数には2進数で1になっているビット数を調べたい変数または数値を入れます。

内部では、recursivelyScanStandBit という関数が再帰的に入力された数値を、1か0かのビットとして調べ、1だけのビット数を算出しています。
***

### **処理内容**

必要ないとは思いますが、再帰処理を念のため説明しますと、手前1ビットが1 or 0なのかを調べ、1だったら右にシフトして次のビットを調べる用意をしつつ、1のビット数をカウント。(再帰関数なので、関数から戻る際に全て加算される)

手前1ビットが0の場合、数値自体が0の場合は0を返して再帰処理を終了させる。数値自体が0でなければ、まだ1のビットが存在するので、右にシフトして次のビットを調べます。(当たり前ですが、手前1ビットは0だったので1のビット数はカウントしないため+1しません)

何故if文やfor分を使用していないかというと、constexprを指定した関数などは内部でreturn文一つのみで実装しなければならない制限があるからです。（コンパイルエラーになります）

なので、唯一使用できる条件分岐が3項演算子なので、これを利用して再帰関数によってループ処理を実現しています。

***

<br>

ここでは、具体的な使用用途を簡単に説明しただけですので、さらに細かい仕様などを知りたい場合はググってください。


### **※追記**
**rinse_ さん と kazatsuyu さん がコメントにて、条件もループも排除した定数化関数の実装例を挙げています。
上記のアルゴリズムを使用するより、遥かにスマートな方法なので、コメントの実装内容を真似した方が良いと思います。（自分も真似します）**

<br>

以上です。お疲れ様でした。
MSC-MOD20 > Link > チップのページ  / forum / ALFAT2という記載

MSC-MOD20に使われているALFAT SoCのページ。
https://www.ghielectronics.com/catalog/product/340

MSC-MOD20のサポートはチップページのフォーラム（以下）などを参考にする、とのこと。
https://www.ghielectronics.com/community/forum/board?id=27

## ALFAT2という記載

~~フォーラムの書込みにALFAT2なるものも見かけるが別ものなのか未消化。~~

http://www.microtechnica.tv/support/manual/warranty_guide.pdf
を見るとMSC-MOD20は「ALFAT2 Chipset」ということらしい。しかしながら、起動メッセージは「ALFAT SoC」だ。

GHIのページには「ALFAT SoC」という記載があり、それが「ALFAT2」なのかわからない。記載は統一して欲しいものだ。

<hr>
(追記 2016/07/31)
3つある表記はどれも同じものを指すとのこと。

http://qiita.com/7of9/items/4f6993ec2b4d6b96624c
Arch Linux に日本語 LaTeX 環境を整える

# TeX Live

TeX Live をインストール．

```bash
yaourt -S texlive-langjapanese texlive-core texlive-localmanager-git
```

# パッケージのインストール

お好みのパッケージ `$PACKAGE_NAME` を `tllocalmgr` でインストール．

```bash
tllocalmgr install $PACKAGE_NAME
sudo texhash
```

# ヒラギノフォントを埋め込む

`/usr/share/fonts/OTF/` にヒラギノフォントがインストールされていると仮定します．

以下のようにシンボリックリンクを作成し，

```bash
sudo ln -s '/usr/share/fonts/OTF/ヒラギノ角ゴ ProN W3.otf' /usr/share/texmf-dist/fonts/opentype/public/hiragino/HiraKakuProN-W3.otf
sudo ln -s '/usr/share/fonts/OTF/ヒラギノ角ゴ ProN W6.otf' /usr/share/texmf-dist/fonts/opentype/public/hiragino/HiraKakuProN-W6.otf
sudo ln -s '/usr/share/fonts/OTF/ヒラギノ角ゴ Pro W3.otf'  /usr/share/texmf-dist/fonts/opentype/public/hiragino/HiraKakuPro-W3.otf
sudo ln -s '/usr/share/fonts/OTF/ヒラギノ角ゴ Pro W6.otf'  /usr/share/texmf-dist/fonts/opentype/public/hiragino/HiraKakuPro-W6.otf
sudo ln -s '/usr/share/fonts/OTF/ヒラギノ角ゴ StdN W8.otf' /usr/share/texmf-dist/fonts/opentype/public/hiragino/HiraKakuStdN-W8.otf
sudo ln -s '/usr/share/fonts/OTF/ヒラギノ丸ゴ ProN W4.otf' /usr/share/texmf-dist/fonts/opentype/public/hiragino/HiraMaruProN-W4.otf
sudo ln -s '/usr/share/fonts/OTF/ヒラギノ丸ゴ Pro W4.otf'  /usr/share/texmf-dist/fonts/opentype/public/hiragino/HiraMaruPro-W4.otf
sudo ln -s '/usr/share/fonts/OTF/ヒラギノ明朝 ProN W3.otf' /usr/share/texmf-dist/fonts/opentype/public/hiragino/HiraMinProN-W3.otf
sudo ln -s '/usr/share/fonts/OTF/ヒラギノ明朝 ProN W6.otf' /usr/share/texmf-dist/fonts/opentype/public/hiragino/HiraMinProN-W6.otf
sudo ln -s '/usr/share/fonts/OTF/ヒラギノ明朝 Pro W3.otf'  /usr/share/texmf-dist/fonts/opentype/public/hiragino/HiraMinPro-W3.otf
sudo ln -s '/usr/share/fonts/OTF/ヒラギノ明朝 Pro W6.otf'  /usr/share/texmf-dist/fonts/opentype/public/hiragino/HiraMinPro-W6.otf
```

それらを以下のコマンドで読み込む．

```bash
sudo mktexlsr
```

現在の設定を確認し，

```shell-session
$ kanji-config-updmap-sys status
CURRENT family : ipaex
Standby family : hiragino
Standby family : hiragino-pron
Standby family : ipa
```

ヒラギノフォントの埋め込み設定を行う．

```bash
sudo kanji-config-updmap-sys hiragino-pron
```

設定できたことを確認．

```shell-session
$ kanji-config-updmap-sys status
CURRENT family : hiragino-pron
Standby family : hiragino
Standby family : ipa
Standby family : ipaex
```
古いLinuxマシンで最近のHDDを使ってみた

2010年以前発売のマザボで最近の大容量HDDを使おう、という話題を紹介します。

# 古いマシン＋新しいHDDって何が怖いんだっけ？

自作PC知識が10年くらい止まっている人（私です）は初耳かもしれませんが、マザーボードのブート用ファームウェアは2010年頃から「UEFI」という規格が採用されており、昔から使われていた「BIOS」はほぼ死滅している状況です。

また、HDD市場に3TB超えの製品が投入されはじめたのも同時期で、当時は大容量HDDとBIOSの相性問題が話題になっていました。具体的には、古いマザーボードで3TB超えのHDDを起動ディスクに使うと起動に失敗するトラブルのことです。

というのも、BIOSの提供するインターフェースではHDDの2.2TBより後ろの領域が読めません。そのため、起動時に必要なデータがブートローダから読めない領域に置かれてしまうと起動が不可能になってしまうのです。

念のため補足しておくと、BIOS採用のマシンで3TB超のHDDを買うのが無駄かというとそうではありません。BIOS経由でディスクを読むのはブートローダだけなので、無事起動してしまえば2.2TBより先も普通に使えます。

そもそもUEFI採用のマザボであれば何もトラブルが起きないので、昨今ではこの話題自体が昔話ということになりますが、古いマザーボードを再利用して3TB超のHDDと組み合わせるような場合は同様のトラブルが起こる可能性があります（この記事を書いた時点の私がまさに該当します）。

要するに、2010年当時の自作erが悩んでいたであろう状況を追体験してみたよ、というのが本稿の内容です。

# 環境

* マザーボード：ASUS P6T（2009年頃のマザーボード、UEFI未対応）
* HDD：TOSHIBA DT01ACA300（3TB、4Kセクタ、AFT、起動ディスクとして利用）

# OS選定

2.2TB超のHDDを使う場合、OS選定も重要です。2010年当時のOSは2.2TB超HDDに対応していないものもありました（後述するようにGPT対応している必要があります）。

とはいえ、昨今のOSを使う分には問題ないでしょう。私はUbuntu 14.04 LTSを使いましたが、問題なく使えています。

# 最初のトラブル：BIOSが2.2TBより大きいHDDを誤認識

今回利用したマザーボードはBIOSが2009年当時のままで、BIOSからHDDを確認すると3TBのはずが800GBと表示されていました。このマザーボードの場合はBIOSアップデートで解決しました。

# BIOSモードではパーティション分割が必須

BIOSモードを利用する場合、ブートローダがアクセスする情報は全て2.2TBより前の領域に置く必要があります。

Linuxの場合であれば、`/boot`を別パーティションとして切り分けた上で2.2TBより前の領域に配置するのが良いでしょう。initrdはブートローダが読み出す対象なので、これにBIOS経由でアクセスできないようだと起動ができません。

マルチブートさせるような場合も同様に考える必要があります。

# パーティションサイズとMBR/GPT

そもそもBIOSから読み出せるパーティション形式はMBRのみですが、MBRでは2.2TB以上のパーティションが管理できません。

UEFIが導入されたタイミングでパーティション形式もGPTという新たな形式が導入されており、こちらは2.2TB以上のパーティションも管理できるようになっています。

以上から考えると、BIOS起動のマシンでは結局2.2TB以下の領域しか使えないように思えますが、実際には2.2TBより先の領域も普通に利用できます。これはUbuntuのインストーラがMBR/GPTのハイブリッド形式でパーティション情報を書き込んでいるためです。

つまり、ブートローダまではMBRの情報を元に動作し、OS起動後はGPTの情報を読むため、どうにか矛盾無く動作するというわけです。アクロバティックですね。

ディストリビューションによってはこんなに親切じゃないのかもしれません。MBR/GPTハイブリッド形式を作れなかったり認識できなかったりするとアウトです。

# 工夫してパーティションを切らないと性能が出ない

最近のHDDは性能上の理由から物理セクタサイズが4KBになっています。これはAFTなどと呼ばれます。

AFTのHDDをLinuxで利用する場合、第2パーティション以降の開始セクタを調整してやらないと性能面で悲しいことになるかもしれません。これはBIOSかUEFIかとは無関係な話題ですね。

参考：「[4096 バイトセクタの HDD と Linux - daily dayflower](http://d.hatena.ne.jp/dayflower/20100310/1268208064)」

# おわりに

自作erの人ならキーワードさえ分かればどうにか調べられると思いますが、浦島太郎状態だとキーワードすら分からん、みたいなことってありますよね…。そんなわけで、キーワードだけでも参考になれば。
JavaScriptライブラリ Underscore.js

ドットインストール　Underscore.js入門
http://dotinstall.com/lessons/basic_underscorejs


http://dotinstall.com/lessons

レッスン一覧
* Underscore.js

* 概要

* 公式サイト underscore.org -> GitHub Repository
https://github.com/jashkenas/underscore

* 知識

* 準備


--------

#2 はじめてのUnderscore.js

var x;
x = _.shuffle([2, 8, 10, 3]);
console.log(x);


--------
オブジェクト指向的に書く方法
var x;
x = _([2, 8, 10, 3]).shuffle();
console.log(x); 

--------

#3 each mapを使ってみる

* _.each([2, 5, 8], function(){
  console.log(num * 2);
});

--------

* map 

--------
#4 find, filter, contain

var a = [2, 5, 8, 42, 12];
var x;
x = _.find(a, function(num)  {  // 条件に合うものを探して最初に見つかったものを返す
  return num > 5;
}) ; 

console.log(x); 

------
filter
var a = [2, 5, 8, 42, 12];
var x;
x = _.filter(a, function(num){ // 条件に合うものを探して見つかったものを全部返す
    return num > 5;
})

console.log(x);

------
contains　　集合要素にたいして存在するかしないかがかえる
var a = [2, 5, 8, 42, 12];
var x;
x = _.contains(a, 10);

console.log(x);  //  true か false が返る　



--------------------------------
#05 groupBy, countByなど

var a = [1, 2, 3, 5, 8, 42, 12];
var x;

x = _.groupBy(a, function(num){　　//  割ったときのあまりで自動的にグループする
  return num % 3; 
});

console.log(x); 　


----
countBy

var a = [1, 2, 3, 5, 8, 42, 12];
var x;

x = _.countBy(a, function(num){  //  数をかぞえてくれる
   return num % 2 == 0 ? 'even' : 'odd';  
});
console.log(x);

----
sortBy
var a = [1, 2, 3, 5, 8, 42, 12];

var x;
x = _.sortBy(a, function(num) {
  return Math.sin(num); 
});
console.log(x);

オブジェクトのプロパティでそーと

x = _.sortBy(["I", "me", "and"], 'length');







-------------
#6 union   uniq　などを使ってみる

(function() {

  var a = [1, 2, 5];
  var b = [5, 2, 8];
  var x = _.union(a, b);
  
  
  console.log(x); 
})();

* intersection （共通部分を探す）

var a = [1, 2, 5];
var b = [5, 2, 8];
var x =  _.intersection(a, b);

console.log(x);


* difference(a, b)  // b にはない a の要素

var a = [1, 2, 5];
var b = [5, 2, 8];
var x = _.difference(a, b);

console.log(x);


* unique()


----------
Underscore.js
http://qiita.com/hp0me/items/72d80dc166aace2759dc#chaining

*Collections
each, map などjQuery でもあるようなアルゴリズム系、ループ系、シャッフル系　などのコア機能
つまり for文を関数で実行

_.each([2, 5, 10], alert);

_.where([arr], {key: "value"})  で検索できる

_.groupByでは、共通項をくくりだしてグループ


* Arrays
_.last([5, 4, 3, 2, 1]);



* Functions 
通常の便利系ではなく、高階関数（関数を引数に取る関数）を指す

_.bind

コード例
var func = function(greeting){return greeting + ': ' + this.name};
func = _.bind(func, {name: 'moe'}, 'hi'); 
func(); 

* Objects

_.values({one: 1, two: 2, three: 3});

* Utility

_.random(0, 100); 

* Chaining 
_([1, 2, 3, 4, 5]).shuffle().shuffle();
ATtiny85 > Link > SD書込み > Arduino IDE使用時 / MOSI/MISOの信号線が反対

http://harizanov.com/2012/05/toying-with-attiny84-and-sd-card-in-arduino-ide/
にてArduino IDEを使ってATTiny84からSD書込みをしている。

ライブラリは Petit Fat FSを使用している。

ひっかかった点というのが

> The SD card pins labeled MISO and MOSI don’t go to ATTiny84’s pins labeled MISO and MOSI.. they need to be swapped. 

信号線を反対にすれば動いたという記載がある。
JQueryライブラリ MixItUp.js

MixItUp.js
ホームサイト
https://mixitup.kunkalabs.com/

* コンテンツ表示にアニメーション効果を追加
* 並列要素をソートなど

＊MixItUpの使い方
http://on-ze.com/archives/931


デモページ
http://on-ze.com/demo/jquery-mixitup/


＊要素をアニメーションで並び替える　
基本の使い方
http://ascii.jp/elem/000/000/877/877188/


----------
Underscore.js
Python データ分析学びメモ

はじめて触ってみる　
＊Pythonでのデータ操作 - Pandas_plyrを使ってみる
http://qiita.com/hik0107/items/3dd260d9939a5e61c4f6


pythonで美しいグラフ描画 -seabornを使えばデータ分析と可視化が捗る
http://archive.fo/mH1Fg
テキストから線表(ガントチャート）を作成するツールを作った

ガントチャートを表示するツール・サービスは結構あるのだけど、タスク管理がメインで、ちょっとした線表を作るにはオーバースペック気味でした。

ということで、テキスト(yaml)からガントチャートを作成するツールを作りました。

https://github.com/ihgs/yaml2gantt

## yaml2gantt

以下の記事とソースを参考にさせてもらっています。

http://qiita.com/hashrock/items/acdafe72ab6414d0f3b7

nodejs v6以上で動作します

### インストール
```
npm install -g yaml2gantt
```

### 使い方

以下のコマンドを実行するとsvg が埋め込まれたhtmlが、カレントディレクトリに`task.html`として生成されます。
eventの文字がかぶってますが、気にしないでください。。。  
html以外に、`PNG`, `SVG`をサポートしています。

githubの[README](https://github.com/ihgs/yaml2gantt/blob/master/README.md)にもう少しだけ詳しく書いてます。


```
yaml2gantt task.yaml
```


task.yaml

```
Range:
  start: 2016/06/01
  end: 2016/07/31
Resources:
  frontend:
    name: フロントエンド
    type: section
  bd:
    name: 仕様書作成
    type: task
    start: 2016/06/20
    end: 2016/06/30
    events:
      - name: 内部レビュー
        date: 2016/06/25
      - name: 外部レビュー
        date: 2016/06/30
  coding:
    name: コーディング
    type: task
    start: 2016/07/01
    end: 2016/07/10
    events:
      - name: 内部レビュー
        date: 2016/07/08
      - name: 外部レビュー
        date: 2016/07/10
  test:
    name: テスト
    type: task
    start: 2016/07/11
    end: 2016/07/18
```

![gantt.png](https://qiita-image-store.s3.amazonaws.com/0/51316/aaf74271-0077-324e-cec9-ac09e5643b10.png)


ガントチャートのサイズを変えたい時は、config.yamlを作成し、実行場所と同じ場所に置くか、-c オプションで指定できます。ちなみに、祝日の設定もconfig.yamlに設定できます。

config.yaml

```
canvas:
  width: 1000
  height: 500
dateLabelType: every_day
holidays:
  - 2016/01/01
  - 2016/01/11
  - 2016/02/11
  - 2016/03/20
  - 2016/03/21
  - 2016/04/29
  - 2016/05/03
  - 2016/05/04
  - 2016/05/05
  - 2016/07/18
  - 2016/08/11
  - 2016/09/19
  - 2016/09/22
  - 2016/10/10
  - 2016/11/03
  - 2016/11/23
  - 2016/12/23
```

## スケジュール比較

`compare`,`compare-git`オプションを利用することで、スケジュールの変更具合がわかります。
resource名が一致するtaskが存在する場合、スケジュールバーの直上に 指定されたtaskのスケジュールバー(黄色)を表示します。


```
yaml2gantt --compare sample/old/tasks.yaml sample/tasks.yaml
```

```
yaml2gantt --compare-git 9a0cc18c sample/tasks.yaml
```

注意：compare-gitを使う場合、Gitリポジトリのルートディレクトリにいないとエラーになりました。時間ができた時に直したいと思います。

以下のように出力されます。projectAのスケジュールが変わっているのが丸わかりですね。

![tasks.png](https://qiita-image-store.s3.amazonaws.com/0/51316/a1de8696-9cee-c2e8-a13a-b3a83f78789c.png)


## テキストで線表を管理できてよかったこと

* 修正が楽  
  エディタで開いてさらっと編集できる。
* バージョン管理ができる  
  git で管理しやすく、ある時点と現在との差分をすぐに出せる。昔のガントチャートもすぐに出力できるので、ちょっとずつこっそりずらしてたとしても一目了然に
なってしまう
   
  また、予定をずらしたときに、コミットメッセージにその理由を書いていると、git logですぐに確認できる。



## 今後

自分が欲しかった最低限の機能ができたので更新頻度は遅くなりますが、ちょこちょこと機能追加・修正はしていく予定です。

こういう機能が欲しいなどあればコメントお願いします。

## 追記

2018/5/6 

いくつか機能を追加していたので、本文を更新・修正しています。(v.0.6.0)
仕様も変わっている部分もあるので、ご注意ください。

* node v5 だと動かなくなります。
* -o オプションを指定しない場合の仕様変更
  * 標準出力からカレントディレクトリにファイルを作成するように修正
* PNG出力サポート
* 比較機能追加
Rust1.10でレジスタ割り付け

## 動機

- レジスタ割り付けの本格的なサンプルが欲しい
- Min-Camlにはレジスタ割り付けがある
- OCamlは文法が結構特殊なので慣れないと辛い
- C++に移植したけど、あまり美しくない
- C++のmoveセマンティックスは実行時エラーが起きて辛い
- Rustならきっと綺麗に書けるはず

----

## Rustでのコンパイラ開発の問題

- Rustはまだ開発中では？
- GCがなくて不便では？
- パーサジェネレータはあるのか？
- immutableなグローバル変数は？

---

## Rustはまだ開発中では？

- だいぶ安定してきました

## GCがなくて不便では？

- GCがないけどインクリメンタルにメモリ管理する分高速なのでトレードオフです
- C++のunique_ptrで書くより楽です
- パターンマッチもあるし便利です

---

## パーサジェネレータはあるのか？

- lalrpopというパーサジェネレータがあります
- インストール面倒くさいのでは?
    - cargoを使えば簡単にインストール可能です

---

## lalrpop 

- Rust製のパーサジェネレータ
- %% など見た目微妙な区切りはgrammer;と書く
- lexerも1ファイル内に一緒に書ける
- Rustの文法に近い文法で記述できる
- とてもいい感じ

---

## immutableなグローバル変数は？

- コンパイラはIDを振りたいので、immutableなグローバル変数が欲しい
- 基本的には使わないでください
- じゃあどうしろと？
    - オブジェクト作ってメンバを書き換えてください

---

- なんで、こんなまどろっこしいの？
    - マルチスレッドで安全に高速に動作させるため
    - 横から書き換えられると困る
- Rustで安全に書けるの？
    - かけます
- どうやって？
    - たとえば、Cellを使えばできます

---

## 実装

---

## 構文木を書く

- ast.rsに、enumを使って書いた
- 非常に短く書けるし、deriveを使えばcloneも簡単

---

## 構文木を印字

- ast_print.rsに印字プログラムを作ってみる
- パターンマッチを使って書けばよい

---

## アセンブラ出力部分を作成

- オブジェクトにコンテキストとして、fileやmap,vector,カウンタを持たせて書く
- Rustのお行儀さえわかれば書けた

---

## 自由変数の計算を書く

- レジスタ割り付けや、即値最適化には生きている変数の計算(fv)が必要なので移植した
- ツリーをトラバースする小さい例としてよかった

---

## 即値最適化を書いてみる

- メモリをコピラない方法も出来る
- だけど、パターンマッチすると所有権が移動してしまうので、何も変えてないのに再構成するのが面倒
- 借用ポインタをトラバースして全部コピーすることにした
- それなりのサイズの変換プログラムが書けた

---

## レジスタ割り付け

- 一番長い処理で結構、気力が萎える
- 最初は関数の型だけ合わせる。適当にコメント内で移植を進める
- 例外を使っている箇所が問題
- Either的なResultを使うことにした。Ok,Errを使う
- C++版とOCaml版を参考にして効率的に移植

---

## パーサを作る

- とりあえず、lalrpopを見つけた
- lalrpopのチュートリアルをやってみた
- cargo便利じゃん！
- lalrpopを自分なりに書き換えて使ってみた
- 最後に、プロジェクトに組み込み、OCaml版のものを移植した

---

## グローバル変数の書き換え

- とりあえず、"tmp"を返すようなスタブを置いておいた
- 次にunsafeを使って動くようにした
- 最後にCellを使って安全にした
- オブジェクト内の生成部分も共通処理を使うようにした

---

## 完成！

- 目標だった、fibonattiのプログラムがコンパイルできたので完成！

---

## TODO

- コマンドライン引数はまだ対応してないので対応する
- テストをきっちり書く
- レジスタ割り付けの説明を書く

---

## まとめ

- Rustでコンパイラを開発してみた
- Rustは安定してる
- Rustのパーサジェネレータは実用的だった
- RustはC++より綺麗にGCレスで書けた
- 型合わせは苦労したけど、ほとんど実行時バグに悩まずに済んだ
- Rustいいよ！
topは z x c b キー押すと見やすい。ubuntuならさらに t m V 0

* ubuntu 16.04の画面。` z x b t m V 0 u1000`を押した状態

![スクリーンショット_2016-07-31_10-33-50.png](https://qiita-image-store.s3.amazonaws.com/0/25728/53a07d94-5639-c6b9-024e-178d599a381b.png)

* [topコマンドで覚えておきたい使い方14個 | 俺的備忘録 〜なんかいろいろ〜](https://orebibou.com/2015/07/top%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E8%A6%9A%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E4%BD%BF%E3%81%84%E6%96%B914%E5%80%8B/)

| キー |  機能 |
|:--|:--|
| z| カラー表示 |
| x| ソートフィールドを着色 |
| c | 実行されているコマンドの内容をフルパスにする |
| b| 実行中のタスクを「太字」/反転 |
| W| 現在の表示設定を保存 (~/.toprc) |
| t | CPU状況がバー表示 |
| 1 | CPUごとに表示 |
| m | メモリ状況がバー表示 |
| L | 検索 |
| 1 | CPUごとの状況 |
| P | %CPUソート |
| M | %MEMソート |
| T | TIMEソート |
| V | プロセスツリー表示 |
| u | ユーザ名で絞り込み |
| i | アイドル中のプロセス |
| A | 5つに分割表示。a, wで表示切替 |
| < | 左の項目でソート |
| > | 右の項目でソート |
| PgDown | 1ページ下にスクロール |
| PgUp | 1ページ上にスクロール |
| Down | 下にスクロール |
| Up | 上にスクロール |
| k | 一番上のコマンドを終了 |
| q | topコマンドの終了 |

* `S` : R = running

centos4やcentos6でもzxbキーの反応あった。
archLinuxなら最初っから見やすい。

## 起動オプション

```bash:
top -u `whoami` # 自分のプロセスのみ表示
top -c # フルパスで表示
top -n 10 # 10秒毎
top -b # バッチモード
```
【Unity】タグが付いたオブジェクト数を数える

```csharp:TagScript.cs
using UnityEngine;
using System.Collections;

public class TagScript : MonoBehaviour {

	GameObject[] tagObjects;

	float timer = 0.0f;
	float interval = 2.0f;

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		timer += Time.deltaTime;
		if(timer > interval){
			Check("HogeTag");
			timer = 0;
		}
	}

	//シーン上のBlockタグが付いたオブジェクトを数える
	void Check(string tagname){
		tagObjects = GameObject.FindGameObjectsWithTag(tagname);
		Debug.Log(tagObjects.Length); //tagObjects.Lengthはオブジェクトの数
		if(tagObjects.Length == 0){
			Debug.Log(tagname + "タグがついたオブジェクトはありません");
		}
	}
}

```
SNI環境でSSL証明書の期限を確認する

以下のcommandでSSL証明書の期限を取得できることは見つけられたのですが、SNI環境で取得出来なかったのでtipsです。

非SNI環境での取得command

```bash
$ openssl s_client -connect nosni.example.jp:443 < /dev/null 2> /dev/null | openssl x509 -text | grep Not
  Not Before: Jul 27 00:00:00 2016 GMT
  Not After : Aug 27 12:00:00 2017 GMT
```

SNI環境での取得command

```bash
$ openssl s_client -connect sni.example.jp:443 -servername sni.example.jp < /dev/null 2> /dev/null | openssl x509 -text | grep Not
  Not Before: Jul 27 00:00:00 2016 GMT
  Not After : Aug 27 12:00:00 2017 GMT
```

該当SSL証明書を名前指定する必要があるという話でした。
cloudfront上のAmazon Certificateで動作確認済みです。
自動更新されるのになぜ期限を取得する必要があるかはツッコまないで下さい。
MSC-MOD20 > MSC-MOD10とのピン比較 > データレディがなくなった

関連
http://qiita.com/7of9/items/1a4ceb8d32ddff8a6070

SDカードモジュールMSC-MOD20。
http://www.microtechnica-shop.jp/shopdetail/000000000026/

SDカードモジュールMSC-MOD10。
http://www.microtechnica.tv/support/manual/msc-mod10_man.pdf

同じSDカードモジュールMSC-MOD10とのピン比較 (I2C使用時)

| ピン | MSC-MOD10 | MSC-MOD20 |
|:-:|:-:|:-:|
| 1  | データレディ  |   |
| 2  | ビジー  | BUSY |
| 3  | SCL | SCL |
| 4  | SDA | SDA |
| 5  | Mode1  | Mode1 |
| 6  |   |   |
| 7  |   |   |
| 8  | Mode2  | Mode2 |
| 9  | Reset(負論理) | Reset(負論理) |
| 10  | GND  | GND |
| 11  | Vcc  | Vcc |
| 12  | WAKE  | WAKE |
| 13  | Vbat  | Vbat |

1番ピンのデータレディがなくなっている。
受信方法はソフト側で変更対応が必要。
Perlモジュールtarボールからspecファイルを生成するコマンドcpanspec

こんなかんじで使う

```bash
# yum install epel-release
# yum install rpm-build
# yum install cpanspec

# cpanspec --packager ymko XXXX-x.xx.tar.gz
# yum-builddep xxxx.spec

$ rpmbuild -ba xxxx.spec
```
メモ 久しぶりにDocker-Compose でRailsプロジェクトを立ち上げようとしたらエラー

## パターン１ すでにサーバーが起動してるよってエラーの場合

```
A server is already running. Check /Users/<username>/Dropbox/<applicationName>/tmp/pids/server.pid.
Exiting
```

対処策として プロジェクトファイルの中の、tmp/pid/server.pid　を削除すればOK

なぜ残ってたのか・・・？


## パターン２ 何か出るエラー

だいたいgemエラー
docker-compose build し直す。


これはやらなくてもいいですが、ごみファイルがたくさん残るので

docker images で <non> となってるのは消す

docker ps -a で複数立ち上がってる　_run_とかなってるのは確認で消す事を推奨
ATTiny85のプログラム > Link > ESP8266:AVRISP over WiFi / RPi: AVRdude

```txt:動作環境
ESP-WROOM-02 (以下ESP8266)
ATTiny85
```

小型のモジュール制作の上でATTiny85というのが興味が出て衝動買いしてきた。

しかしながら、ATTiny85を動かすにはArduino ISPやAVR ISPというのが必要そうだ。Arduino UNOなどのシリーズは持っていなく、書込みだけのために買うのも躊躇する。

調べたらESP8266用のAVRISPコードは見つけた。https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266AVRISP

まだ使い方はよくわからない。

こちらの記事も参考になるかもしれない (Qiitaの記事も色々参考になる）。
http://make.kosakalab.com/make/electronic-work/arduino-ide-arduinoisp/

Arduino IDE使用時はSPI通信でATTiny85にSTK500プロトコルで書き込むようだ。
https://github.com/adafruit/ArduinoISP
のピンだけ変更してESP8266で使えるかどうか。

UDOO Neoで使えそうなら、こちらを買うというのもありだろうか？ しかし他の強い理由がないうちはまだ購入をしない方がいい気もする。

Raspberry Piを使う場合は、AVRdudeだろうか。
https://synapse.kyoto/tips/ArduinoISP_AVRWriter/page002.html
技術英語 > As [counter-intuitive] as it may seem, / Counter clock wise (CCW)

@ LOE > July 11, 2003
http://www.loe.org/shows/shows.html?programID=03-P13-00028
> As <font color=red>counter-intuitive</font> as it may seem, 

http://eow.alc.co.jp/search?q=counterintuitive
> 直観で分かるものではない、直観に反した

http://eow.alc.co.jp/search?q=counter
> `2. 反論、反対意見［行動］

counterについては、ボクシングのクロスカウンタと関係あるかも。ボクシングは詳しくないが。

<hr>
counter関連で思い出したのは

http://ejje.weblio.jp/content/counterclockwise
> 時計の針と反対回りの、左回りの

[CCW](https://ja.wikipedia.org/wiki/CCW)と略される時がある。

時計回りはCWと略されることがあるので、CWで検索したらCCWも検索されるというbad naming。変数名でCWとCCWにするとソースリーディングに苦労する。
CentOS7.2にRSpecをinstallしてみたが、CapybaraのClick系コマンドが動作しない模様


# 最初に
yum update

# VNC

* 先にuseradd

`useradd <user_name>`

* desktop install
http://zero-config.com/centos/gnome-0001.html

* firewalldを起動
http://hikaku-server.com/linux/entry461.html

* VNC設定
http://qiita.com/tanuki-project/items/2496339d204b9646f36c
http://qiita.com/msakamoto_sf/items/32b5e69bf237bf789b58

* VNCに接続
	* winからだと、UltraVNC Viewer　など
	* MACからだと
	https://auxin01.wordpress.com/2013/04/20/control_from_mac_to_windows_on_vnc/

# 各種install
## git

* default version

```
# git --version
git version 1.8.3.1
```

* 最新をinstallしたければ、、、
http://www.task-notes.com/entry/20150622/1434942000

## rbenv via anyenv
http://qiita.com/tkmiya34/items/71293fc83024fbcb459d

## bundler

`gem install bundler`

http://tomoyamkung.net/2014/09/08/ruby-bundler/

## capybara-webkit
* CentsOSではcapybara-webkitにすると動作する模様。
 + Gemfileにcapybara-webkitを追記して、bundle installしたら、Rspecのコード変更なしで、正常動作確認できた

* capybara-webkit installにはqmakeが必要。
https://github.com/thoughtbot/capybara-webkit/wiki/Installing-Qt-and-compiling-capybara-webkit

* g++も必要
http://d.hatena.ne.jp/plasticscafe/20080930/1222778825


## RSpec

http://ruby-rails.hatenadiary.com/entry/20150420/1429462755

* Gemfileの最後に下記を追加

`gem "capybara-webkit"`

* 環境毎にinstallするgemsを指定したい場合

`bundle install --path vendor/bundle`


* 実行

`bundle exec rspec` もしくは
`bundle exec rspec ***_spec.rb`

* 出力をわかりやすく
http://easyramble.com/serverspec-rspec-color-format.html

## まとめ

* MacOS, Winで動作していたSPecがCentOSでは動作しない。
* CentOS7.2の環境だと、capybaraのclick_link, click_button_ click_onが動作しない模様。
「抜粋」表示から「第一段落」表示に変更するカスタマイズ

こんにちは。ハンドルネーム「Javaを復習する初心者」です。私はwordpressでブログをやっているのですが、そこで行ったカスタマイズのひとつとして、「抜粋」表示から「第一段落」表示に変更する方法を紹介します。

以下、説明のための仮定として「直近5件の記事について、第一段落を取得する」というのを目標にします。処理の流れは以下になります。

<ol>
	<li>get_postsで記事を5件取得
	<li>foreachでループ。
		<ol>
			<li>第一段落取得
		</ol>
</ol>

ソースが以下になります。

```php:第一段落の抜粋例
    $postslist = get_posts(
        array(
            'post_type' => 'post',
            'posts_per_page' => 5,
        ));

    $str = "";
    foreach ($postslist as $p) :
        // 第一段落を取得
        $newLIneFirstPos = mb_strpos($p->post_content, "\n");
        if ($newLIneFirstPos) {
            $str .= mb_substr($p->post_content, 0, $newLIneFirstPos);
        }
        $str .= "<hr>";
    endforeach;

    wp_reset_postdata();
```

$p->post_contentには本文の情報が格納されてます。最初の「\n」の位置をmb_strposで取得し、最初から取得した位置までをmb_substrで取りだすということをしています。これで第一段落の取得ができました。表示例が気になる方は[私のブログ](http://java-beginner.com/)を見てください。トップページに直近5件の第一段落を表示しています。

#simplicity2のカスタマイズ例

simplicity2ではトップページに記事の一覧が表示され、設定した文字数で抜粋を表示します。以下のキャプチャように抜粋表示されます。文字数で抜粋し、末尾に「...」が表示されます。

![simplicity2デフォルト抜粋表示.png](https://qiita-image-store.s3.amazonaws.com/0/133921/703dd5d8-c498-aaf0-4313-611a99861631.png)


これを段落表示にカスタマイズする方法を記載します。

子テーマを使って表示していると仮定します。子テーマのフォルダsimplicity2-childにentry-card-content.phpを親テーマからコピーします。以下の部分が抜粋表示の箇所です。

```php:entry-card-content.phpの41行目付近
  <p class="entry-snippet"><?php echo get_the_custom_excerpt( get_the_content(''), get_excerpt_length() ); //カスタマイズで指定した文字の長さだけ本文抜粋?></p>
```

これを以下のように書き換えます。元の記述は念のためコメントアウトすることにし、残しておきます。。

```php:entry-card-content.phpの41行目付近
  <p class="entry-snippet">
  <?php
        $str = "";
        $newLIneFirstPos = mb_strpos($post->post_content, "\n");
        if ($newLIneFirstPos) {
            $str .= mb_substr($post->post_content, 0, $newLIneFirstPos);
        }

   echo $str;
   // echo get_the_custom_excerpt( get_the_content(''), get_excerpt_length() );
   //カスタマイズで指定した文字の長さだけ本文抜粋
   ?></p>
```

以下のように第一段落が表示されます。

![simplicity2デフォルト段落表示.png](https://qiita-image-store.s3.amazonaws.com/0/133921/779be523-97ca-3cd0-9834-6ba4f373c260.png)

個人的な好みですが、末尾に「...」がないのが良いです。

#編集履歴

20160811

* simplicity2のカスタマイズ例を追加。
Microsoft Office 2016 を選択インストールする

# Microsoft Office Professional Plus 2016
Microsoft Office Professional Plus 2016 のセットアップを起動すると、何の確認もなくすべてインストールされてしまう。

不要なアプリケーションをインストールしたくない場合、以下の手順でインストールする。

## Office 2016 Deployment Tool
### ダウンロード
以下のページから Office 2016 Deployment Tool をダウンロードして実行する。
https://www.microsoft.com/en-us/download/details.aspx?id=49117

実行すると setup.exe と configuration.xml が展開される。

### XMLファイルの編集
展開された configuration.xml を以下の内容に差し替える。
インストールしたくないアプリケーションを以下のXMLに記述しておく。インストールしたいものを削除すればよいだろう。

```xml:configuration.xml
<Configuration>
  <Add OfficeClientEdition="64" SourcePath="E:\">
    <Product ID="ProPlusRetail">
      <Language ID="ja-jp" />
      <ExcludeApp ID="Access" />
      <ExcludeApp ID="Excel" />
      <ExcludeApp ID="Groove" />
      <ExcludeApp ID="Lync" />
      <ExcludeApp ID="OneDrive" />
      <ExcludeApp ID="OneNote" />
      <ExcludeApp ID="Outlook" />
      <ExcludeApp ID="PowerPoint" />
      <ExcludeApp ID="Publisher" />
      <ExcludeApp ID="Word" />
    </Product>
  </Add>
</Configuration>
```

E ドライブにインストールメディア（iso ファイルまたは DVD-ROM）がマウントされている想定。マウント先が違う場合は `SourcePath` の値を書き換える。
Microsoft Office Professional Plus 2016 の想定だが、 Microsoft Office Professional 2016 の場合は `<Product>` の `ID` の値を `ProfessionalRetail` に書き換える。


`Groove` は OneDrive for Business を除外する場合に使用する。
`OneDrive` は個人のオンラインストレージサービスである OneDrive を除外する場合に使用される。
`Lync` は Skype for Business を除外する場合に使用する。

https://technet.microsoft.com/ja-jp/library/jj219426.aspx
https://support.microsoft.com/ja-jp/kb/2842297

### setup.exe の実行
```
C:\>setup.exe /configure configuration.xml
```
setup.exe と configuration.xml が C:\ に配置されている想定。

これでインストーラーが起動し、 `<ExcludeApp>` で指定したアプリケーションはインストールされずに済む。
OpenCVで動画をリアルタイムに変換してみる

# はじめに

OpenCV(Open Source Computer Vision Library)はBSDライセンスの映像/画像処理ライブラリ集です。画像のフィルタ処理、テンプレートマッチング、物体認識、映像解析、機械学習などのアルゴリズムが多数用意されています。

OpenCVを使った動体追跡の例 (OpenCV Google Summer of Code 2015)
[https://www.youtube.com/watch?v=OUbUFn71S4s](https://www.youtube.com/watch?v=OUbUFn71S4s)

インストールと簡単な使い方はこちら
[http://qiita.com/olympic2020/items/d5d475a446ec9c73261e](http://qiita.com/olympic2020/items/d5d475a446ec9c73261e)

静止画像のフィルター処理についてはこちら
[OpenCVでエッジ検出してみる](http://qiita.com/olympic2020/items/2c3a2bfefe73ab5c86a4)

今回は、動画をリアルタイムに変換してみます。

# プログラム
while文のループの中で以下を行っています。

1. 元のカラー動画を１フレーム読み込みます
2. カラーのフレームをグレースケールのフレームに変換します
3. フレームをウィンドウに表示します
4. フレームをファイルに書き込みます

```movie.py
# -*- coding: utf-8 -*-
import cv2


# 定数定義
ESC_KEY = 27     # Escキー
INTERVAL= 33     # 待ち時間
FRAME_RATE = 30  # fps

ORG_WINDOW_NAME = "org"
GRAY_WINDOW_NAME = "gray"

ORG_FILE_NAME = "org_768x576.avi"
GRAY_FILE_NAME = "gray_768x576.avi"

# 元ビデオファイル読み込み
org = cv2.VideoCapture(ORG_FILE_NAME)

# 保存ビデオファイルの準備
end_flag, c_frame = org.read()
height, width, channels = c_frame.shape
rec = cv2.VideoWriter(GRAY_FILE_NAME, \
                      cv2.VideoWriter_fourcc(*'XVID'), \
                      FRAME_RATE, \
                      (width, height), \
                      False)
# ウィンドウの準備
cv2.namedWindow(ORG_WINDOW_NAME)
cv2.namedWindow(GRAY_WINDOW_NAME)

# 変換処理ループ
while end_flag == True:
    # グレースケール変換
    g_frame = cv2.cvtColor(c_frame, cv2.COLOR_BGR2GRAY)

    # フレーム表示
    cv2.imshow(ORG_WINDOW_NAME, c_frame)
    cv2.imshow(GRAY_WINDOW_NAME, g_frame)

    # フレーム書き込み
    rec.write(g_frame)

    # Escキーで終了
    key = cv2.waitKey(INTERVAL)
    if key == ESC_KEY:
        break

    # 次のフレーム読み込み
    end_flag, c_frame = org.read()

# 終了処理
cv2.destroyAllWindows()
org.release()
rec.release()
```

動画のサンプルはこちらから。
（[ダウンロード](https://github.com/shirmung/opencv-tests/blob/master/testdata/gpu/video/768x576.avi)）
「768x576.avi」を「org_768x576.avi」にリネームしてスクリプトと同じディレクトリに置いて実行してください。

# 実行結果

カラー動画とグレースケールの動画が同時に表示され、グレースケールの動画はファイルにも保存されました。

![window.png](https://qiita-image-store.s3.amazonaws.com/0/107056/42ade95b-a96d-4ddd-ad7f-20497fb11c2f.png)

# コーデックの指定方法
OpenCV3.1には、OpenCV2.4まで存在していた、`cv2.cv.CV_FOURCC`がありません。
下記のように自作メソッドで対応する方法もあるので紹介しておきます。

```CV_FOURCC.py
# cv2.cv.CV_FOURCC
def cv_fourcc(c1, c2, c3, c4):
    return (ord(c1) & 255) + ((ord(c2) & 255) << 8) + \
        ((ord(c3) & 255) << 16) + ((ord(c4) & 255) << 24)
```

プログラム内で決まったコーデックで動作すればよいのであれば、定数定義のところでこのように定義する方法もあります。

```opencv3.1.py
XVID = 0x44495658
````

よく使うコーデックについてまとめておきます。

|コーデック|文字列  |定数      |
|:--------|:-----:|:--------:|
|MPEG-1   |PIM1|0x314D4950|
|MPEG-4   |MPG4|0x3447504D|
|MPEG-4.2 |MP42|0x3234504D|
|MPEG-4.3 |DIV3|0x33564944|
|DivX     |DIVX|0x58564944|
|DivX 5.0 |DX50|0x30355844|
|Xvid     |XVID|0x44495658|
|H.263    |U263|0x33363255|
|H.263I   |I263|0x33363249|
|H.264    |H264|0x34363248|
|FLV1     |FLV1|0x31564C46|
|Motion JPEG|MJPG|0x47504A4D|
|非圧縮   |零(0)|0x00000000|

コーデック一覧はこちら（[リンク](http://www.fourcc.org/codecs.php)）

# つづく
次は、OpenCVでWebカメラ/ビデオカメラの動画をリアルタイムに変換してみます。
[OpenCVでWebカメラ/ビデオカメラの動画をリアルタイムに変換してみる](http://qiita.com/olympic2020/items/12a2eceaf65f142ec3df)
AWSでドメイン、SSL証明書の取得、設定

サーバからドメイン取得、SSL証明書の作成まで、全てAWSで行ってみた
設定時にスクリーンショットを取らずにやってしまったので、公式サイトや先人達の知恵を拝借して

ザックリとした設定手順は以下の通り

- EC2インスタンス作成
- Route 53でドメイン取得
- AWS Certificate Manager(ACM)でSSL証明書作成
- EC2 Elastic Load Balancing(ELB)でSSL証明書を使用する設定
- Route 53でDNS設定

## 前提
EC2でインスタンス作成済み

## 前もっての注意事項
EC2と以下の作業は全て同じリージョンで設定する
リージョンが異なると、作成したSSL証明書が選択できないなど困ったことになる
少し前まで東京ではSSL証明書が作成出来なかったようだが、現在は東京でも出来る

## ドメイン取得
`Route 53`でドメインを取得する
ドメイン取得費用は、`.jp`ドメインだとAWS以外で取得するのに比べてかなり高め、`.com`ドメインは他と比べてもそこまで大きな差はない

以下の公式サイトの設定手順を参考にドメインを取得する
以下の中で必要なのは`EC2`の`Elastic IP`の取得と`Route 53`でのドメインの取得までで、ステップ3のDNSの設定はまだ行わない（後のELBの設定後に行うため）
https://aws.amazon.com/jp/getting-started/get-a-domain/

## SSL証明書作成
`AWS Certificate Manager(ACM)`でSSL証明書を作成する
SSL証明書の作成は無料だが、作成したSSL証明書のダウンロードは出来ないので、`ELB`か`CloudFront`を使用する必要がある

良くまとまっているサイトがあったので参考にさせていただいた
http://blog.serverworks.co.jp/tech/2016/04/07/acm_beginner/

## ロードバランサー設定
先に作成したSSL証明書を使用するため、`Elastic Load Balancing(ELB)`を設定する

以下の公式サイトの設定手順を参考にロードバランサーを設定する
http://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/elb-getting-started.html

上記ではSSLの設定が載っていないので補足

「リスナーの設定」では、`HTTP(80)`に加え`HTTPS(443)`を設定する
![スクリーンショット 2016-07-31 1.52.58.png](https://qiita-image-store.s3.amazonaws.com/0/128475/d688d53b-daf5-cc3c-865f-56c39c5cef37.png)

「セキュリティの設定」で「AWS 証明書マネージャ (ACM) から、既存の証明書を選択する」を選択し、先に作成したSSL証明書を選択する
![スクリーンショット 2016-07-31 1.58.32.png](https://qiita-image-store.s3.amazonaws.com/0/128475/eca7409a-cc5a-9b3f-b068-fe00ac819fd6.png)

## DNS設定
`Route 53`でAレコードのエイリアス設定を行う

ドメイン取得で参考にしたページのステップ3のDNS設定から再開し、`静的 IP アドレス`ではなく、`全修飾ドメイン名 (FQDN)`の手順に従って設定する
https://aws.amazon.com/jp/getting-started/get-a-domain/

これで一通り設定終了
Linux(Steam)版Saints Row: The Thirdの日本語化

![](https://pbs.twimg.com/media/CoJD8ZfUMAE5dNl.jpg:large)

# 概要
Arch LinuxでSteam版Saints Row: The Thirdの[韓国語化パッチ](http://www.sectiong.net/115)を当てるためいろいろ探してみたところ、なぜか日本語化ができちゃいましたのでここに書いておきます。

# 必要なもの
* Steam版Saints Row: The ThirdがインストールされているLinux PC
* 日本語化されている`misc.vpp_pc` 
* [Okteta](https://utils.kde.org/projects/okteta/)などのバイナリエディタ

# 手順

良い子のみんなはデータの変更を行う前にちゃんとバックアップしておきましょうね。

1. ゲームデータが保存されているパスに移動します。
  (大概の場合、`$HOME/.steam/steam/steamapps/common/Saints Row the Third/`に保存されているはずです）
2. `packfiles/pc/cache/misc.vpp_pc`を日本語化されたファイルで上書きします。
3. Oktetaなどのバイナリエディタで`saintsrow3.vpfs`を開き、下記のオフセット（アドレス）に移動します。(`Ctrl+G`キーを押せば一気に移動できます)
    * オフセット: `00F29011`
4. データ(`50 4C`)を `4A 50`に変更します。多分こんな風になるはずです。
    * `00F29010 | 20 4A 50 20 52 55 00 00 |  JP RU..`
5. 変更されたファイルを保存します。
6. Steamを開き、ゲームの言語を日本語に変更し、ゲームを起動します。
7. やったぜ。

# 追記
![](https://pbs.twimg.com/media/CoI_KLVUMAAH5M0.jpg:large)

* なんとか無事に韓国語化もできました。
RubyのEnumerableをstream風に処理する

# TL;DR

`Enumerable#lazy` (`#force`)を使えばよかった。

http://ruby-doc.org/core-2.3.1/Enumerable.html#method-i-lazy

# つらいと思っていたところ

Rubyの`Enumerable#map`みたいな処理はついついチェインして書きたくなってしまうんだけど、毎回オブジェクトが作成されていて非効率で辛いと思っていた。

```rb
p 5.times.map { |n|
  (n * 10).tap(&method(:puts))
}.select { |n|
  (n > 20).tap(&method(:puts))
}.map { |n|
  (n + 2).tap(&method(:puts))
}

=>
# 0
# 10
# 20
# 30
# 40
# false
# false
# false
# true
# true
# 32
# 42
# [32, 42]
```

# そしたら

`#lazy`というのがあった。

```diff
-p 5.times.map { |n|
+p 5.times.lazy.map { |n|
   (n * 10).tap(&method(:puts))
 }.select { |n|
   (n > 20).tap(&method(:puts))
 }.map { |n|
   (n + 2).tap(&method(:puts))
-}
+}.force
```

いい感じに遅延実行してくれる。

```rb
p 5.times.lazy.map { |n|
  (n * 10).tap(&method(:puts))
}.select { |n|
  (n > 20).tap(&method(:puts))
}.map { |n|
  (n + 2).tap(&method(:puts))
}.force

=>
# 0
# false
# 10
# false
# 20
# false
# 30
# true
# 32
# 40
# true
# 42
# [32, 42]
```

バッチとか書くときにいいかも。
自分が情弱なだけだったけど知らない人もいそう。
Swift　基本構文

Swift　基本構文
仕事など今までの開発はPHPが主だったので、Swiftならではの基本構文についてまとめる。


##定数「let」
###定数の書式
```
let 定数名 = 値
let 定数名:　型 = 値
let 定数名 = 値, 定数名 = 値, 定数名 = 値
let 定数名: 型
let 定数名: 型, 定数名: 型, 定数名: 型
```

##変数「var」
###変数の書式
```
var 変数名 = 値
var 変数名:　型 = 値
var 変数名 = 値, 変数名 = 値, 変数名 = 値
var 変数名: 型
var 変数名: 型, 変数名: 型, 変数名: 型
```
##タプルの定義
「タプル」は複数の値を一組にしたもの。複数の型をまとめることができる

```
var hoge:(String,Int) = ("apple", 100)
let hoge:(String,Int) = ("orange", 100)
```

##範囲演算子
終端を含む演算子と含まない演算子がある。
for-in文などで利用する

```
//終端の3を含む
1 ... 3 
//終端の3を含まない
1 ..< 3 
```

##if文
```
if hoge < 1{
	//hogeが1以下
} else if hoge > 1 && hoge < 5以下{
	//hogeが1以上かつ5以下
} else {
	//上記の条件以外
}
```

##for文
```
for i in 0 ... 4 {
	//処理内容
}
```
配列を使った例

```
let values = [1, 2, 3]
var result = 0
for val in values {
	result += val
}
print(result) //結果は6となる
```
Qiitaとかでブックマークレットをなるべく楽に登録してもらう方法

例えばあなたが、

```js:
javascript:alert("hoge");
```

というブックマークレットを紹介したいとします。そのためにあなたは、

> <pre>
> ```js
> javascript:alert("hoge");
> ```
> </pre>
>  
> ```js:
> javascript:alert("hoge");
> ```

みたいにコードを置きます。すると登録したい人は、

- コードをコピーする
- ページをブックマークに登録
- ブックマーク設定画面を開く
- 登録したブックマークのURLのところに、コピーしたコードをペーストする。

という手順を踏まなければなりません。ちょっとめんどくさいです。というわけで、もう少し楽に登録してもらえないかと考えた結果が以下のようなリンクを張る方法です。

> ```
> [ほげほげブックマークレット](#javascript:alert("hoge");)
> ```
> 
> [ほげほげブックマークレット](#javascript:alert("hoge");)

このリンクを張ったページが `qiita.com/liburari/items/e808344e472ce716363d` なら、リンク先は `qiita.com/liburari/items/e808344e472ce716363d#javascript:alert(%22hoge%22);` になっているはずです。こうすることで、登録したい人は

- リンクをクリック
- ページをブックマークに登録
- ブックマーク設定画面を開く
- 登録したブックマークのURLの、「#」以前を削除

……あれ？　手順数変わってなくね？ :scream: 

でも、コードをコピーするって動作、結構めんどくさくないですか？　コードの先頭までマウス持ってって、末尾まで引っ張り、Ctrl+C押して……　クリップボードにコードが残るのも、なんというか……

少なくとも自分は後者のほうが楽だなーと思います。
rails actioncable

https://ruby-china.org/topics/29558

https://blog.bocchi.tokyo/2016/06/05/20160605/

http://qiita.com/togana/items/bc75aa9d0bd1f7de357b

http://morizyun.github.io/blog/action-cable-introduction-reading/

https://github.com/search?p=1&q=App.cable.subscriptions.create+roomid&type=Code&utf8=%E2%9C%93

http://stackoverflow.com/questions/36926816/actioncable-how-to-use-dynamic-channels/36964252?noredirect=1#comment64180916_36964252

https://www.driftingruby.com/episodes?tag=websockets
グローバル汚染を見つける

JavaScriptにおいて忌み嫌われるグローバル汚染ですが、そんなグローバル汚染を起こしている変数・プロパティを列挙するスクリプトを書きました。
[ここ](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1456252034)のやつが使えなくなっていたので……

## ソースコード

```js
(function() {
  var r = '',
      w = open('', '', 'width=300,height=500');
  for (var p in window)
    if (!(p in w)) r += p + '<br>';
  w.document.write(r);
})();
```

## ブックマークレット

[このリンク先](#javascript:!function(r,w,p){for(p in window)p in w||(r+=p+'<br>');w.document.write(r)}('',open('','','width=300,height=500'));)をブックマークに登録し、設定を開き、URLの「#」とその前の部分を消してください。
Ecto.Modelをシリアライズする方法


## 状況

DBから取得したModelをRedisにキャッシュするためにシリアライズしたかった。

## 環境

Elixir 1.3.1

## 解決方法

シリアライズには`:erlang.binary_to_term/1`を使う。

```
model = App.Repo.get(App.Post, id)
:erlang.binary_to_term(model)
```

デシリアライズには`:erlang.term_to_binary/1`を使う。

```
model = :erlang.term_to_binary(serialized_data)
```

やっていることは、erlangで利用されている[ETF](http://erlang.org/doc/apps/erts/erl_ext_dist.html)に変換している模様。これについてはしっかり理解できていないので、どこかのタイミングで理解したい。
LaravelElixir使ったらSassをコンパイルしてベンダープレフィックス対応するのが簡単過ぎてもう笑うしかなかった


以前書いた記事[LaravelElixir使ったらTypescriptをBrowserifyするのが簡単過ぎてもう笑うしかなかった](http://qiita.com/shitake/items/3d946233485a2033d79c)のSass編。

## Sassのコンパイルを追加してみる

`gulpfile.js`に追加するのはたったこれだけ。えっ
なんと内部でえっ`autoprefixer()`してくれていた。えっ

[autoprefixerとは。](https://github.com/postcss/autoprefixer)

```
.sass('app.sass')
```

追加後

```
var elixir = require('laravel-elixir');

// デフォルトが`resources/assets/js`なため`ts`に変更
elixir.config.js.folder = 'ts'
// pluginにtsifyを指定
elixir.config.js.browserify.plugins = [ { name: 'tsify' } ]
// 実行
elixir(function (mix) {
    mix.browserify('app.ts')
       // .sass()を追加
       .sass('app.sass')
       .version(['js/app.js'])
})
```

あとは[この](http://qiita.com/shitake/items/3d946233485a2033d79c#gulp実行)続きと一緒

ちゃんとprefixもついてた。この瞬間私は笑うしかなくなった。

```
.flex-rowdiv, .box-birthday {
  display: -ms-flexbox;
  display: flex;
  -ms-flex-direction: row;
  flex-direction: row; }
```

だがしかし`node_modules`の量がものすっごい。
こんな感じでモジュール化されるとより嬉しい。

```
laravel-elixir
 ├─laravel-elixir-ts
 ├─laravel-elixir-sass
 │
```
KUSANAGIでLet's Encryptの更新ができず焦った話

# 結論
80番ポート接続を許可してなかった...。
なので、80番ポート接続を許可したのち、手動で証明書更新して解決。

# 補足
* Let's Encryptの認証サーバーからドメイン検証するための通信が必要となるため、[80番ポートおよび443番ポートは接続できるようにしておかなければいけない](https://letsencrypt.jp/usage/#GetCertificate)
* なお、[80番ポートを開放していないWebサーバでも証明書を発行できる](https://letsencrypt.jp/faq/#Port443)らしい
* KUSANAGIでは`# kusanagi update cert kusanagi_html`で証明書の手動更新ができる
* さらに`# kusanagi autorenewal on`で証明書の自動更新を有効化できる
* `# kusanagi https redirect`でHTTPSへの301恒久的リダイレクトもできる（リスタートを忘れずに）
* その他KUSANAGIの便利なコマンドは[ここを参照](https://kusanagi.tokyo/document/command/)
OpenCVでエッジ検出してみる

# はじめに

OpenCV(Open Source Computer Vision Library)はBSDライセンスの映像/画像処理ライブラリ集です。画像のフィルタ処理、テンプレートマッチング、物体認識、映像解析、機械学習などのアルゴリズムが多数用意されています。

OpenCVを使った動体追跡の例 (OpenCV Google Summer of Code 2015)
[https://www.youtube.com/watch?v=OUbUFn71S4s](https://www.youtube.com/watch?v=OUbUFn71S4s)

インストールと簡単な使い方はこちら
[http://qiita.com/olympic2020/items/d5d475a446ec9c73261e](http://qiita.com/olympic2020/items/d5d475a446ec9c73261e)

動体追跡をしたりするためには、最初に画像のフィルター処理をする必要がでてきます。
今回は、OpenCVを使ってエッジ検出をしてみます。

# プログラム
以下のような流れになります。

1. カラー画像を読み込む
2. グレースケールに変換する
3. エッジ検出

```sample.py
import cv2

# 定数定義
ORG_WINDOW_NAME = "org"
GRAY_WINDOW_NAME = "gray"
CANNY_WINDOW_NAME = "canny"

ORG_FILE_NAME = "org.jpg"
GRAY_FILE_NAME = "gray.png"
CANNY_FILE_NAME = "canny.png"

# 元の画像を読み込む
org_img = cv2.imread(ORG_FILE_NAME, cv2.IMREAD_UNCHANGED)
# グレースケールに変換
gray_img = cv2.imread(ORG_FILE_NAME, cv2.IMREAD_GRAYSCALE)
# エッジ抽出
canny_img = cv2.Canny(gray_img, 50, 110)

# ウィンドウに表示
cv2.namedWindow(ORG_WINDOW_NAME)
cv2.namedWindow(GRAY_WINDOW_NAME)
cv2.namedWindow(CANNY_WINDOW_NAME)

cv2.imshow(ORG_WINDOW_NAME, org_img)
cv2.imshow(GRAY_WINDOW_NAME, gray_img)
cv2.imshow(CANNY_WINDOW_NAME, canny_img)

# ファイルに保存
cv2.imwrite(GRAY_FILE_NAME, gray_img)
cv2.imwrite(CANNY_FILE_NAME, canny_img)

# 終了処理
cv2.waitKey(0)
cv2.destroyAllWindows()
```

# 実行結果
手前の森、中ほどのビル、奥の空がそれなりにエッジ抽出されました。

![org.jpg](https://qiita-image-store.s3.amazonaws.com/0/107056/b11f2a62-907b-cdc4-d5db-0ff9289c88a7.jpeg)
　　　　　　　　　　　　　　　**元画像**

![gray.png](https://qiita-image-store.s3.amazonaws.com/0/107056/8fa2b502-3e58-a36b-36e0-7582ededc748.png)
　　　　　　　　　　　　　　　**グレースケール**

![canny.png](https://qiita-image-store.s3.amazonaws.com/0/107056/e7fcca7a-2fc4-b3f9-4069-970e5098ec12.png)
　　　　　　　　　　　　　　　**エッジ検出**

# つづく
次は、動画を扱ってみます。
[OpenCVで動画をリアルタイムに変換してみる](http://qiita.com/olympic2020/items/ce00fab38d829965db3b)