OmniAICreator/Qiita-1.07M huggingface dataset:
Vim 8.0 Advent Calendar 24 日目 内部的な変更

この記事は [Vim 8.0 Advent Calendar](http://qiita.com/advent-calendar/2016/vim8) の 24 日目の記事です。

今回は、利用者にはあまり影響がない Vim の開発側の変更についてです。

## GitHub へ移行

移行当時、割と大きく取り上げられていたので、ご存知の方も多いでしょう。
それまで Vim は、Google Code で Mercurial を使って開発されていました。しかし Google Code のサービス終了に伴い、2015 年 8 月に Vim のリポジトリは GitHub へ移行、リポジトリも Git に変更されました。

https://github.com/vim/vim

また、以前は Vim へのパッチの投稿は vim_dev のメーリングリスト上でのみ行われていましたが、現在では GitHub 上の Pull Request でも受け付けています。貢献への敷居がかなり下がったと言えます。

## 大規模なソースコードの分割

Vim は長い歴史もあり、かなり巨大なプログラムです。ソースコードもかなりの量があり、`eval.c` などは 2 万行を超えていました。
Vim の開発が GitHub に移ったりなどさまざまな変化がある中で、コードのテストカバレッジを [Coveralls で計測](https://coveralls.io/github/vim/vim?branch=master)するようになりました。
しかし、この時にこの巨大なソースコードが問題になったようで、これを回避するためにソースコードの分割が行われました。
概ね、以下のような分割が行われました。

- `eval.c`
  - → `eval.c`
  - → `list.c`
  - → `dict.c`
  - → `evalfunc.c`
  - → `userfunc.c`
- `spell.c`
  - → `spell.c`
  - → `spellfile.c`

## ANSI-C スタイルの関数定義

Vim 本体のソースコードは、以前までは K&R と呼ばれるスタイルで関数定義を行っていました。以下のような形式です。

```c
/*
 * Add a watcher to a list.
 */
    void
list_add_watch(l, lw)
    list_T	*l;
    listwatch_T	*lw;
{
    lw->lw_next = l->lv_watch;
    l->lv_watch = lw;
}
```

関数の引数部分の、型の宣言が括弧の外に書かれています。C 言語を知っている人の中でも、そもそもこのような書き方ができること自体知らない人もいるのではないでしょうか。
Vim の歴史は古く、そのためこの古い書き方がずっと使われてきました。
しかしこの度、現代で広く使われている ANSI-C スタイルの関数定義に書き換えられました。以下のような形式です。

```c
/*
 * Add a watcher to a list.
 */
    void
list_add_watch(list_T *l, listwatch_T *lw)
{
    lw->lw_next = l->lv_watch;
    l->lv_watch = lw;
}
```

## ビジュアルモードが常に有効

Vim には大きく分けて、Tiny、Small、Normal、Big、Huge の 5 つのビルドがあり、後になるほど多くの機能が含まれるようになっています。
ビジュアルモード(`+visual` 機能)は、以前までは Small 以上の Vim に含まれる機能でしたが、7.4.200 からは Tiny も含む全ての Vim で有効になるようになりました。
MFIにむけてRettyの取り組み

この記事は Retty Advent Calendar 24日目です。
昨日は @r4-keisuke の Elasticsearchのスコアリングを眺めてみる でした。

ハッピーホリデーズ！
おもにウェブサイトのSEOを担当しているエンジニアの @ttakeoka です。

# モバイルファーストインデックス

先日、とある記事がウェブマスターブログ日本版に投稿されました。
以前よりたびたび話題にあがっていたインデックスをモバイル基準に切り替えていくとのこと。
モバイルファーストインデックスに対する今後の取り組みをお話させていただこうと思います。

モバイル ファースト インデックスに向けて
https://webmaster-ja.googleblog.com/2016/11/mobile-first-indexing.html

> 最近では、Google 検索を使用しているほとんどのユーザーは、モバイル端末から検索を行うようになりました。

事実、RettyのWebページを訪れるユーザーさんもスマートフォンからの検索流入が大部分をしめています。
とうぜん検索窓から来訪するユーザーさんはお店を探してRettyに来訪します。
いままでは私たちもPCページのコンテンツを充実させ、お店を見つけたいという期待に答えようとしてきました。

> Google ではモバイル ファーストのインデックス登録に向けた実験を開始しています。

RettyではサーバーへのアクセスログからスマートフォンGooglebotのクロールを確認しています。
具体的な数字は控えさせていただきますが、Googleがいかにモバイルファーストインデックスを進めているかが、
ログ分析からもわかります。

# 構造化データマークアップ

構造化データマークアップはモバイルに特化した仕組みではありませんが、
そのWebページが何について情報が載っているかをGoogleに伝えることができます。

デスクトップPCページはモニタサイズ・解像度の進歩で、これまで比較的容易にコンテンツ量を増やすことができました。
ですがスマートフォンページはユーザーさんに快適に閲覧してもらうには限界があります。
だとすれば今後は表示すべき文字・画像はよりユーザーさんに価値ある情報に厳選していかなければなりません。
より少ない情報量で的確にインデックス登録してもらうには構造化データマークアップが重要になります。

コンテンツを作る側としては文字にこだわらない表現でユーザーさんの期待に答えたい。
そのために、構造化データを使ってインデックス登録を最適化し、
ユーザーさんには写真やイラストで直感的なインターフェースを実装することで、
UXとインデックス登録の両立をはかることができるのです。

# Rettyというデータベース

Rettyは多くのユーザーさんの口コミ投稿から、これまでサービスを大きく成長させることができましたが、
実はサイト内のお店情報もまた、ユーサーさんから多く寄せられる情報によって日々更新されるデータベースです。
Rettyのエンジニアチームはこの素晴らしいデータベースを活用して、機械学習やAIなどの技術にチャレンジしてきました。
機械学習やAIについては機会を譲るとして、
われわれエンジニアチームはユーザーさんからお寄せいただいた情報を、行きたいお店が見つかるハッピーな体験に還元したいと考えています。
そしてRettyのSEOはひとりでも多くのユーザーさんに価値を届けるためにモバイルファーストインデックスに取り組んでいきます。


# おわりに

SEOはその性質上あまり具体的なお話はできませんでしたが、個人的にはエンジニアリングでアプローチできる課題が盛り沢山でおもしろい分野です。
（ここには書けないデータ分析まわりとか）RettyのSEOエンジニアリングにご関心がありましたら、ぜひお声がけください。
会いたくて会いたくて震えてもらった

本日はクリスマス・イブですね。みなさんは大切な人と幸せな夜を過ごせておりますでしょうか。
意中の人はいるけれど今年はその人と過ごせそうにないなー。。。って方は、是非「会いたい」という気持ちを言葉に出してみてはいかがでしょうか。

#Androidに「会いたい」気持ちを聞いてもらう
Androidに聞いてもらう場合、まずパーミッションの追加が必要です。

```AndroidManifest.xml 
<uses-permission android:name="android.permission.RECORD_AUDIO" />
```

ただ聞いてもらうのではなく、きちんと「会いたくて」と認識してほしいから音声認識を入れます。

```java
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, this.getPackageName());
SpeechRecognizer recognizer = SpeechRecognizer.createSpeechRecognizer(this);
recognizer.setRecognitionListener(new RecognitionListener() {
  @Override
  public void onResults(Bundle results) {
    //取得時の処理
  }

  @Override
  public void onEndOfSpeech() {
    //終了時の処理
  }
});
recognizer.startListening(intent);
```

#Androidに震えてもらう
ある歌で「会いたくて会いたくて震える」とありますが、おそらく「会いたくて」も震えはしないと思いますので、代わりにAndroidに震えて頂きます。

Androidに震えてもらう場合、まずパーミッションの追加が必要です。

```AndroidManifest.xml 
<uses-permission android:name="android.permission.VIBRATE"/>
```
Androidが音声を聞いてくれるとsetRecognitionListenerのonResultsが呼び出されますので、音声認識の結果が「会いたくて会いたくて」の場合のみ震えるようにします。

```java
@Override
public void onResults(Bundle results) {
  List<String> recData = results.getStringArrayList(android.speech.SpeechRecognizer.RESULTS_RECOGNITION);
  if (recData.get(0).equals("会いたくて会いたくて")) {
    Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
    vibrator.vibrate(1500);
  }
}
```

vibrator.vibrate(1500);
で1.5秒の震えになります。

#もう少し運要素を入れたい
ただ震えるのでは楽しくないので、花占い的な占い機能をつけてみます

```java
List<String> recData = results.getStringArrayList(android.speech.SpeechRecognizer.RESULTS_RECOGNITION);
if (recData.get(0).equals("会いたくて会いたくて")) {
  int rand = (int) (Math.random() * 10 + 1);
  Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);

  if (rand % 10 == 0) {
    long[] pattern = { 0, 400, 50, 400, 100, 200, 100, 200 };
    vibrator.vibrate(pattern, -1);
  }else{
    vibrator.vibrate(1500);
  }
}
```
これで10分の1の確率で特別な震えが起こるようになります。
相手のことを考えながら「会いたくて会いたくて」と言ったら特別な震えがくるなんて・・・
このアプリを使用してクリスマス・イブの一時を楽しい妄想に変えてみませんか？

#反省
ネタでやっているつもりが、自分でも引くぐらい気持ち悪い内容になってしまったこと。
ソーシャルアプリのDLCダウンロード小ネタ

# DLCダウンロード状況について

### <font color="red">概要</font>

ダウンロードする際に、現在どのくらいダウンロードするしているか進捗をわかるようにバーなどを出すと思いますが、比較的にここの処理は

* 端末に負荷がかかりやすい
* なぜかよく止まり現在が不明になりがち
* ユーザが暇でいつ終わるかとか思う。時間がかかりそうな場合やめるかもしれない。

etc...

とかいろいろあるので、出来る限り情報をたくさん出力する画面にしたほうが開発、デバック効率が格段に上がる気がします。
UIの都合上、本番ビルドではそれらの情報を出せないとした場合、開発ビルドではでるようにしておきたいです。

### <font color="red">出力情報</font>

##### <font color="blue">進捗バー</font>
視覚的に一番わかりやすいので必須でしょう。
1本だけでなく複数本にするとよりよいです。
全体の進捗で1本、ファイル単位などでもう1本など。

#### <font color="blue">進捗率</font>
* 33%
* 333MB/1000MB

など。
進捗バーが複数本あるなら、1本ごとに対応させてだしてもいいかもしれません。

かなり古い記事で、修正したいことがあるのに、更新もしてませんが(汗)
http://qiita.com/okuhiiro/items/8f4c6280574fed2f7bca
「www.progress」ら辺で進捗が取得できます。

#### <font color="blue">現在ダウンロードしているもの</font>
現在ダウンロードしているファイル名を出力するだけです。
非同期的な感じで、複数同時にダウンロードしている場合はちょっと工夫する必要があるかもしれません。

#### <font color="blue">Wifiなどにつながっているか通信可能な状態か</font>
スマートフォンの通信強度みたいな表記でだすといいでしょう。
地味にこれが切れているのに、ダウンロードできないとか言われるとハマります。

#### <font color="blue">Not Fond</font>
サーバにダウンロードしたいファイルがないケースです。
存在しない旨の出力をして

* 次のファイルをダウンロード開始するか
* そこでストップ

させるか考える必要があります。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/fec682d0-1520-d86c-b2c4-c61a96220c76.png)

# DLCダウンロード方法、クリア、切り替えなどについて

### <font color="red">概要</font>

* ダウンロード方法とは、一括ダウンロード、分割ダウンロードなどです。

* いやゆる「キャッシュクリア」、「ファイル修復」などというのがクリアというやつです。

この処理は時間がかかる処理なので、高速化や一工夫しないと運用・開発効率に関わります。

* 切り替えとは、開発環境のみですが...

端末はどこかのサーバに接続しているわけですが、デバック機能として下図のように切り替えることです。

![Untitled (1).png](https://qiita-image-store.s3.amazonaws.com/0/17192/6722c5f9-3cb8-9634-895e-2fc3f4ac98be.png)

↓   ↓    ↓

![Untitled (2).png](https://qiita-image-store.s3.amazonaws.com/0/17192/a0efb276-f27a-fa44-8151-c0629f99c7ae.png)

### <font color="red">どうするべきか</font>

#### <font color="blue">分割ダウンロードがいい</font>
使う時、都度その分だけをダウンロードする方法です。
メリットとしては

* アプリ容量が少なくる可能性が高い(ライトユーザなどに限る)
* 待ち時間がないように少ないように**感じる**

デメリットとしては

* 一括でダウンロードするよりも総待ち時間が多くなる可能性がある。

リリースときから設計していないと導入は難しいですが、いれるメリットのほうが大きいでしょう。

#### <font color="blue">ファイル修復で壊れているファイルのみをダウンロードするのがいい</font>

一つの方法として、端末でファイルのハッシュ値を計算して、サーバ側であらかじめ保存してあるファイルのハッシュ値と比較する方法です。
そして、それが異なっていた場合、すなわち壊れたファイルのみをダウンロードするようにするのです。
ハッシュ値の計算時間はかかりますが、全てを再ダウンロードよりは早いでしょう。
対応するファイルのサーバにハッシュ値がそもそも存在しない場合は、不必要なファイルと判断して消すことも忘れずに行いましょう。これをやらないと**アプリ容量がいつの間にか肥大化**してしまします。

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/17192/b940e61c-c264-187a-43ee-f2fbaad2bf30.png)


ちなみに自分が携わっている案件では、**全てを再ダウンロード** 機能しかないのです。。。
**全てを再ダウンロード** するのは言わずもがな時間がかかるので、極力さけるべきでしょう。
通信量も多くなるのであまりいいことがありません。
しかし、機能としては確実にリフレッシュしたいときもあるのであったほうがよいです。

#### <font color="blue">切り替えられたほうがいい</font>

このビルドで接続先サーバだけを切り替えたい!ということはよくありそうなケースなので、あったほうがいいでしょう。

言わずもがな自分が携わっている案件では、下記のようにビルド時で決まるため、**接続先変える場合は、再ビルドするしかない**のです。

```csharp
#if DEVELOP1
    SERVER_URL = "http://develop1";
#elif DEVELOP2
    SERVER_URL = "http://develop2";
.
.
. 
```
あなたのiOSアプリにmrubyを簡単に組み込めるMRuby.frameworkを作った

[RubyPico](http://rubypico.ongaeshi.me)というiOSで動くRuby開発環境を開発しています。iOSでmrubyをビルドするのは少しだけ手間がかかるのでビルド環境を別途作りました。(もともと[carsonmcdonald](https://github.com/carsonmcdonald)さんが作ったもののforkです)

https://github.com/ongaeshi/ios-ruby-embedded

[fork元](https://github.com/carsonmcdonald/ios-ruby-embedded)との違いは

- mruby 1.2
- 正規表現、ファイルとディレクトリ操作、httpなどの便利なmgemが追加
- requireが使える

です。

## 使い方
[README#Build](https://github.com/ongaeshi/ios-ruby-embedded)の手順を実行してください。

```
$ git clone git://github.com/carsonmcdonald/ios-ruby-embedded.git
$ cd ios-ruby-embedded
$ git submodule init
$ git submodule update
$ rake
```

できたMRuby.framworkをプロジェクトに追加すればOKです。

## mgemを追加したい
`Rakefile`にmgemを追記してリビルドします。

最近、[mruby-method](https://github.com/ongaeshi/ios-ruby-embedded/commit/951c54a7f1b4006acd74f8a3426ffb4f9aabdc8c)を追加したので参考にしてください。
GWT を使ってみて感じたこと

※この記事は「AltPlus Advent Calendar 2016」の24日目の記事です。

こんにちは、オルトプラスのミーです。
日本語を勉強中です。わかりにくいところがあるかもしれませんが、よろしくお願いします。

今日は「Google Web Toolkit （以下、GWT）」というフレームワークについて書こうと思います。

大学時代にGWTを半年ほど使っていました。詳しくはわかりませんが、使ってみた感想を書きます。

![gwt.jpg](https://qiita-image-store.s3.amazonaws.com/0/147307/e0cce5df-4655-7377-e24e-c4648170e244.jpeg)

#GWTとは
http://www.gwtproject.org/overview.html
>GWT is a development toolkit for building and optimizing complex browser-based applications. Its goal is to enable productive development of high-performance web applications without the developer having to be an expert in browser quirks, XMLHttpRequest, and JavaScript. GWT is used by many products at Google, including AdWords, AdSense, Flights, Hotel Finder, Offers, Wallet, Blogger. It’s open source, completely free, and used by thousands of developers around the world.

詳細は上記ページを参考にしていただければわかると思いますが、簡単に言うとJavaを使って、あまりウェブサイトの開発知識がなくても（Javascriptとか）、ウェブサイトを作れるようにサポートしてくれるフレームワークです。

#GWTを使う理由は何ですか？
自分の考えですが、以下の理由があります。
##1. Javaでウェブ開発してみたい。

自分のイメージですが、簡単なウェブページを開発する場合、PHPのようなオブジェクト指向的でない書き方のできる言語を使っても大丈夫です。リクエストを受けてページを返すのに十分で、オブジェクトをあまり導入しなくてもいいかもしれません。

私は大学時代にはウェブ開発より、ミニゲームの開発をする機会が多くありました。ミニゲームの世界では、何でもオブジェクトなので、オブジェクト指向言語のJavaを使っていました。それを基にしてウェブ開発する時にもJavaでしてみたかったのです。ウェブはミニゲームのように、なんでもオブジェクト化できれば面白いなと思いました。

##2. Googleのプロダクトと連携しやすい。
![GAE.jpg](https://qiita-image-store.s3.amazonaws.com/0/147307/69980abf-12e1-267f-8051-f1b7a3b73e97.jpeg)

https://cloud.google.com/appengine/docs?hl=ja

GWTの開発言語はJavaなので、開発アプリはJavaを使ういろいろなGoogleのプロダクトを導入しやすいと思います。
大学時代の自分のプロジェクトではGoogle App Engineを使いました。
Googleのプロダクトを使ってアプリを開発したい場合、Google Mapsによる地図アプリ開発などはGWTを使うといいかもしれません。


次に、GWTを使ってみたいと思っている方は、以下のところに気をつけてください

##1. プログラマー入門の人にとってちょっと学びにくい
一つ目の理由は、GWTはJavaを使っています。Javaのsyntaxルールは少なくなくて、GWTもそのルールを守らないといけません。サーバーとクライアントでやり取りするデータのタイプを定義しないといけません。具体的にタイプ定義するとコードがわかりやすくなりますが、プログラマー入門の人にとって、ページを表示できるようになるまで普通より手間がかかるかもしれません。

2つ目の理由は、開発ツールが複雑ということです。Javaの開発では、重い開発環境のEclipseなどを使わないといけないでしょう。LaravelとPHPなら、エディタのsublime, atomなら軽くてよいと思います。入門者にとって、普通より開発環境を理解する時間がかかると思います。

##2. サポートコミュニティーがまだ多くない
開発していた時に、デバッグや困る時にGoogleで検索してみましたが、結果の件数がまだちょっと少ないと思いました。

#おわりに
GWTを使ってみて感じたことは以上になります。
次回は大学時代にミニゲーム開発で使っていたフレームワークの「Libgdx」を紹介したいと思います。
ビアバッシュのお供に「Pizza Beer計算機」

クリスマスイブなのでビアバッシュ系ツールの紹介です :pizza: :beers: 

* https://sue445.github.io/pizza-beer/
* https://github.com/sue445/pizza-beer

![20160708013451.png](https://qiita-image-store.s3.amazonaws.com/0/8059/aa129662-e981-1d7d-ac10-7a2712ba155b.png)

# 作った理由
この手のツールとしては [Party](http://beer-party.candycane.jp/) が有名で便利なのですが、ピザやビールの単価を微調整できなくて個人的に直したいと思いがありました。

かといって修正してPullRequestを送ろうにもどこに送ればいいか分からない（そもそもOSSなのか？）というのもあって [Mithril.js](http://mithril.js.org/) の勉強も兼ねて自分で作りました

masterブランチの代わりにgh-pagesブランチを使うことで、修正したものが即サイトに反映されるようにしています。デプロイいらずで便利。[^gh-pages]

[^gh-pages]: これ作った当時は任意のブランチをGithub Pagesにするのはできなかったと思います。

# Partyと比べてのPizza Beer計算機のメリット
* 計算時にサーバにPOSTしない
  * フォーム入力時に自動計算されて表示される（サーバへの通信無し）
* ピザやビールの単価を調整できる
* 1人辺りのビールの本数も調整できる（例：1人ビール1.5本とか）
* スマホ対応

![20160708013738.png](https://qiita-image-store.s3.amazonaws.com/0/8059/d2ee6bf3-40cd-f97e-a972-aef45f2fca45.png)

便利だと思うので是非ご利用ください
iPhoneアプリを作った話

# はじめに

みなさんは仕事以外でどんな開発をしているのでしょうか？気になります。
自分は仕事でPHPを実装することが多いので、それ以外の言語の習得を兼ねて空き時間でコツコツっとiPhoneアプリを作ってました。
今回はそんなswiftでアプリをつくった話です。（技術的要素はありません。）

# つくったアプリ

どんなアプリを作ったかというと日本語をしゃべるアプリです。
簡単にいえば「あ」「い」「う」「え」「お」... とそれぞれボタンにして「こんにちは」とか「おやすみなさい」とか押された文字の音が発音させ、選択した言葉をしゃべらせることができるアプリです。
それにもう少し機能をいれて、自分で録音した音を元にその音でしゃべらせるようにしてみました。

なんか学生の課題みたいですね。
学校でこんな課題が出たらみんなどんな実装をするのだろうか。気になります。

# どんなアプローチで作ったか

そもそもswiftで音声ファイル再生したことはあります！（コピペで!）ってレベルからなので
ちょっとした冒険みたいな気持ちで開発していました。

プロトタイプを作って、検証し、時にはあきらめて別の方法を考え
そんなこんなで以下のプロトタイプをつくりました。

1.「あ～ん」の結合された音声ファイルをseekして1音づつ発音させる
2.「あ～ん」の結合された音声ファイルを1音づつ分割して発音させる
3.「あ～ん」を1音ずつ録音して1音づつ発音させる

# プロトタイプの結果

> 1.「あ～ん」の結合された音声ファイルをseekして1音づつ発音させる

この実装、録音は簡単なのですが、seekさせる言葉のタイミングが難しい
1秒間隔で1音1音録音していけばそれっぽく機能するのですが、無音のタイミングが微妙に出て
それを調整したり、録音しくじって取り直しとかめんどくさいので却下。

「めんどくさい」をフーリエ変換などで判定できたら良いのですがプロトでは無理っぽいので断念。

これを作って、再生はどうにかなるが、録音する方が大変だぞと気づきました。

> 2.「あ～ん」の結合された音声ファイルを1音づつ分割して発音させる

音声の分割はffmpegでできそう＆声紋分析はjavaのコードがあったのでそれを利用
[Hatada's Home Page](http://home.a00.itscom.net/hatada/asp/wav.html)

波形を表示するアルゴリズムから無音状態を検知し、その秒数から次の無音までの時間を算出して、ffmpegでスライスしていく方法です。(ある意味 ChangeFinder)

なんか行けそうな気がする！
iPhoneのボイスメモで録音しアプリケーション拡張機能でアップロード！
サーバー側で解析＆分割！
そしてアプリでダウンロードォ！

勢いよく動くところまで作ったのですが、ちょっと雑音が入ると正しく判定できずチューニングに苦戦。
音がずれた時の調整がめんどくさいので却下。

あと、音を解析する際にスピーカーから音が出ていたのですが、サーバー側でバッチ処理を動かす際にサウンドボードがなくjavaxのexceptionが発生。
必要なインターフェースだけスタブ作って回避したのですが、もしサウンドボードが刺さっていたら誰もいないさくらのサーバールームから「あいうえお。。。」って人の声が聞こえてくるというホラーな状態になっていたかも。

> 3.「あ～ん」をそれぞれ別々に録音して1音づつ発音させる

当初、マイクからリアルタイムで波形を分析するところと、UIでよいのが思い浮かばなかったため最後になってました。
が、1,2を踏んでなんとなく勘所もできていたこともあり、波形の開始と終了が判断できれば細かな制御は人間の力を使いカバーすることで完成。

UIと合わせてこれが一番しっくり来たので採用。

それでできたアプリがこちらです。
https://itunes.apple.com/us/app/bokatsuku/id1158648715?mt=8

siriと会話させようと思ったのですが、このアプリで出した音声はsiriではうまく解析できないようです。

# 苦戦したこと＆やり残したこと

swift2.x～3のバージョンが変わるなかコードが動かないことがちょくちょくあり、そこに結構コストがかかった。
後半はswift2～3 のマイグレーションの情報が増えたのでだいぶ楽になりました。

普段業務で行っている開発は多かれ少なかれ近しい課題にぶつかっている人たちがいて、情報もある程度ありますが、こういった類の情報は知識を持っている一部の人が情報を残しているため躓くとハードルが急に高くなるきがしました。

あと、フーリエ変換とかで解析もやってみたかった。
無音のトリムと雑音除去フィルターを入れたかった。

# かんそう

そのうち音声もAIとかで本人の再現とかできるようになっちゃうと思いますがもしかしたらベースの50音があると、リアリティーが上がるかもという思いで作りました。

ちなみに姪っ子に使ってもらったときは、あ行は言ってくれたのですが、か行の途中で「パズドラやりたい」と超序盤で敗北。
50音言ってもらうって結構むずかしいもんです。

ぜひ @yamamotojunta さんにはアイカツのキャラボイスを作ってもらいたいですね。

# さいごに
UIの相談に乗ってくれた渡辺yさん、吉井hさんキャラを使わせてくれたいのまたさんに感謝。

明日はいよいよラストの @sugat1679 さん。クリスマスにタイガーアッパーカットだぁ！
datastore使ってみてハマったこと

# はじめに

GAE/Go 1年生です。APIサーバーのコードを書いている中で、ハマったことを
まとめようと思います。

今回はdatastoreです。
トランザクション機能の使い方も覚えて快適になってきたこの頃です。

※GAE/Go前提の書き方になってしまうこと、ご容赦ください。

# stringのプロパティは、デフォルトで1500byteまでしか保存できない

今年、最初にハマったのがこれでした。
datastoreではstructがそのままschemaになるので、なんとなくstringの上限を意識してなかったのがよくなかったです。

以下が、ドキュメントです。(筆者がGAE/Goを使っているので、Goより

```
Fields (except for []byte) are indexed by default. Strings longer than 1500 bytes cannot be indexed; fields used to store long strings should be tagged with "noindex". Similarly, ByteStrings longer than 1500 bytes cannot be indexed.
```
引用元: https://cloud.google.com/appengine/docs/go/datastore/reference#hdr-Properties

noindexタグをつけると、保存できるようになりました。
説明文とかブログとか、長文をDBに保持したいときには必須ですね。

# GAE/GoだけIN句が使えない

複数Keyを使ってGetするのはできるのですが、特定のプロパティの値で `SELECT * FROM TABLE WHERE Property IN (A, B, C)` みたいなQueryを投げることができません。
でも、Javaだとできるようです。

Goのドキュメントだと

```
Operator	Meaning
=	Equal to
<	Less than
<=	Less than or equal to
>	Greater than
>=	Greater than or equal to
```
引用元: https://cloud.google.com/appengine/docs/go/datastore/queries#filters

となっているのですが、Javaだと

```
Operator	Meaning
EQUAL	Equal to
LESS_THAN	Less than
LESS_THAN_OR_EQUAL	Less than or equal to
GREATER_THAN	Greater than
GREATER_THAN_OR_EQUAL	Greater than or equal to
NOT_EQUAL	Not equal to
IN	Member of (equal to any of the values in a specified list)
```
引用元: https://cloud.google.com/appengine/docs/java/datastore/queries#filters

となっていて、INがあるのです:cry:

# Transaction機能を使っているつもりがつかえてなかった

以下のようなコードを書いていました。

```go

type (
    SampleRepository struct {
        c context.Context
    }
    Sample struct {
        ID    int `datastore:"Id"`
        Count int `datastore:"Count"`
    }
)

func (r *SampleRepository) Save(sample *Sample) error {
    key := datastore.NewKey(r.c, "Sample", "", sample.ID, nil)
    if _, err := datastore.Put(ctx, key, sample); err != nil {
        return err
    }
    return nil
}

func handle(w http.ResponseWriter, r *http.Request) {
    ctx := appengine.NewContext(r)
    sr := SampleRepository{c: ctx}
    s := Sample{ID: 1}
    err := datastore.RunInTransaction(ctx, func(ctx context.Context) error {
        s.Count++
        return sr.Save(s)
    }, nil)
    if err != nil {
        //エラーレスポンスを返す
        return
    }
    w.Header().Set("Content-Type", "text/plain; charset=utf-8")
    fmt.Fprintf(w, "Count=%d", s.Count)
}
```

`func(ctx context.Context) error` の引数には、transactionを埋め込んだcontextが指定されるようになっていて、
transactionを埋め込んだcontextじゃないとトランザクションは当然効かないのでした。
(参考: https://godoc.org/google.golang.org/appengine/internal#RunTransactionOnce)

Repository構造体を作るときにプロパティとしてcontextを投入するようにしていたせいで、
問題に気づくのに時間がかかりました。

# おわりに

他にも、schema変更してマイグレーションしたりするのが大変だったり、といった苦労もありますが、MySQLのときに当たり前にやっていたshardingのことを考えなくて良くなったり、
カラム追加は簡単だったりと、よいところもいっぱいあるな、という感想です。

まだAncestor Queryを使えてないので、どこかでチャレンジしたいです。
本とサンプルまとめ

クリエイティブ ビジュアライゼーションに関する本で、参考になったものと、サンプルをまとめです。
（随時更新）
あと著者の方のサイトもわかる限り。（敬称略）

##Beyond Interaction
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/96807/25d10f24-3b1e-39ab-7fdb-9031aa95f690.jpeg)

- [HP](http://www.bnn.co.jp/books/3746/)
- [サンプルコード](https://github.com/tado/BeyondInteraction)
- [PDF](http://download.bnn.co.jp/download/beyond_interaction/BNN_BeyondInteraction.pdf)
- [前書き](http://yoppa.org/blog/4299.html)
- [田所 淳](http://yoppa.org/)
- [比嘉 了](http://www.satoruhiga.com/)
- [久保田 晃弘](http://www.ntticc.or.jp/ja/archive/participants/kubota-akihiro/)

##Generative Design
![51JdWtC96TL._SX356_BO1,204,203,200_.jpg](https://qiita-image-store.s3.amazonaws.com/0/96807/53584221-392a-1059-a57a-f7e12880880c.jpeg)

- [HP（英語）](http://www.generative-gestaltung.de/)
- [HP（日本語）](http://www.bnn.co.jp/support/generativedesign/)
- [サンプルコード](http://www.generative-gestaltung.de/code)
- [Hartmut Bohnacker](http://hartmut-bohnacker.de/index_e.htm)
- [Benedikt Gross](http://benedikt-gross.de/log/)
##Visualizing Data
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/96807/4af6ddce-9fd4-87f8-95c3-dfd1ba21bd8a.jpeg)

- [HP](http://shop.oreilly.com/product/9780596514556.do)
- [サンプルコード](http://benfry.com/writing/archives/3)

## ジェネラティブ・アート
![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/96807/244e7922-62d3-5183-64ff-75bbc1e5e207.jpeg)

- [サンプルコード1]( http://abandonedart.org/)
- [サンプルコード2](https://www.manning.com/books/generative-art#downloads)   
下の方にFREE DOWNLOADSがあります。日本語版を購入すれば、すべてついてきます。
- [matt pearson](http://zenbullets.com/images.php)

 

##Visual complexity
![10.jpg](https://qiita-image-store.s3.amazonaws.com/0/96807/a5f5acad-999d-7da0-6003-47a5be49bfae.jpeg)

- [参考](http://www.visualcomplexity.com/vc/)
- [WIRED 5回連続講義：『ビジュアル・コンプレキシティ』を読む](http://wired.jp/2012/05/21/visual-complexity-1/)


##FORM + CODE
![9.jpg](https://qiita-image-store.s3.amazonaws.com/0/96807/fdd8e2d0-84f5-7f00-075c-f577415a8813.jpeg)


- [参考](http://www.bnn.co.jp/support/formandcode/)
- [HP](http://formandcode.com/)


##Nature of Code
![8.jpg](https://qiita-image-store.s3.amazonaws.com/0/96807/169ff0db-44fd-3a1e-9866-dfb8a742f88b.jpeg)

- [HP](http://natureofcode.com/)
- [サンプルコード](https://github.com/shiffman/The-Nature-of-Code-Examples)
COBOLでGUIプログラミングもどき

# いろいろ勉強不足でした、またまたウンコードしか書けませんでした。
そうそうたる面々の中でネタ記事すら書くことができなくてごめんなさい。
FUN Advent Calendar 23日目担当のnRiokiです。
（ちなみに先日はmashaさんでした。http://mashaencount.hatenablog.jp/entry/2016/12/22/164606)
んで、やろうとしたことはタイトルの通りでCOBOLでウィンドウ表示してチョメチョメしたかったんです。
結果は全然でした。ちーん。
でもまぁ一応""COBOLから""ウィンドウを生成することに成功（？）したので備忘録の如く書いてみます。
ちなみにOpen COBOL 1.1.0を用いてます。
### COBOLでウィンドウを表示してみよう
できました。
![af.png](https://qiita-image-store.s3.amazonaws.com/0/104817/451b7dd5-69e3-77fa-c686-2351cf924351.png)

```COBOL
       identification division.
       program-id. CALL-TEST.
       data division.
       working-storage section.
       01 numeri PIC 9(4). 
       procedure division.
           move 0721 to numeri.
           call 'sub1' using by value numeri.
           display "Hello After C".
           stop run.
```
```C
//http://7ujm.net/X/XSTEP1.html　いなば様より拝借　一部改変
#include<X11/Xlib.h>
#include<X1C1/Xutil.h>
#include<math.h>
//描画
void paint(Display*d,Window w,int screen,GC gc){
	XClearWindow(d,w);
	XDrawString( d, w, gc, 1, 10, "Hello", 5);
	XFlush( d );
}

void sub1(int numeri){
	Display	*d;
	Window	w;
	int screen;
	XSetWindowAttributes attr;
	GC gc;
	int width = 2;
	int height = 10;
	printf("%04d\n", numeri);
	
	d = XOpenDisplay( NULL );//Xサーバーに接続する
	screen=DefaultScreen(d);
	//ウインドウの作成
	w = XCreateSimpleWindow( d, RootWindow(d,screen),
						0, 0, 100, 100,//ウインドウのサイズ
						1,BlackPixel(d,screen),//枠の設定
						WhitePixel(d,screen));//背景色の色番号

	//ウィンドウの内容を記憶
	attr.backing_store = WhenMapped;
	XChangeWindowAttributes( d, w, CWBackingStore, &attr); 

	//ウインドウ名の設定
	XStoreName(d, w, "test Window");
	XSetIconName(d, w, "test Window");
	
	//グラフィックコンテキストを取得
	gc = XCreateGC( d, RootWindow( d,screen ), 0, 0); 
	
	XEvent event;
	//イベントマスクを登録
	XSelectInput( d, w,ButtonPressMask | ExposureMask ); 

	//マップして表示
	XMapWindow( d, w );
	XFlush( d );

	while(1){
		XNextEvent( d, &event );
		switch(event.type){
			case ButtonPress://画面上でマウスのボタンが押された時
				XDestroyWindow( d, w);//終了処理
				XCloseDisplay( d );
				exit(0);			
				break;
			case Expose://再描画要求				
				paint(d,w,screen,gc);//再描画	
				break;
			default:
				break;
		}
	}
}
```
はい、誰がなんというとCOBOLからウィンドウが生成されましたね。

### まとめ
あまりの出来に酒でも飲まないとこんな記事書いてられません。
やってみたかったことではありますが、記事にして公開するには大分中身のないものになってしまいました。
ライブラリの場所の指定さえ間違わなければGUIに限らずCで使えるものであればなんでもできそうです。
今回はそれがわかっただけでも良しとします。させてください…
正直時間までに間に合わなかった感は否めない(warningでたままとか)ので今後の課題とさせてください。
来年こそはCOBOLでゲームやらGUIツールてきなものを作ります。
明日はクリスマスイブですね、shield-9様
http://www.adventar.org/calendars/1350#list-2016-12-24
よろしくお願いします。

### 参考元
COBOL2002　使用の手引　手引編，http://itdoc.hitachi.co.jp/manuals/3000/30003D0800/GD080001.HTM ，日立製作所様
プログラミング色々，http://7ujm.net/ ，いなば様
OS以外での端末制限について


この記事は[iOS その3 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/ios3)の23日目の記事となります。

昨日は[ushichops](http://qiita.com/sushichop)さんで[「今こそgoogle/EarlGreyを使って自動UIテストに入門しよう」](http://qiita.com/sushichop/items/41afac1dcfbd0b8c9d40)でした。

余談ですが、ASTの対応がちょっと先の伸ばしになりましたね。
やっぱりみんな対応に苦戦しているのでしょうか？
https://developer.apple.com/news/?id=12212016b


この記事では、普段は意識しているiOSの以外に対応端末に制限がかかるDevice Compatibilityのお話です。
Tipsですので、カジュアルな感じよんでいただければと思います。

## Device Compatibilityについて

参照先は[こちら](https://developer.apple.com/library/content/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/DeviceCompatibilityMatrix/DeviceCompatibilityMatrix.html)です。

Info.plistにはアプリに関する、さまざまな情報が記述されていますが、```UIRequiredDeviceCapabilities```キーを使用すると、必要なハードウェア条件を宣言できるという事です。

以下の様な設定項目があり、iPhone6以上の端末ではすべて対応しています。

![Kobito.RzahAf.png](https://qiita-image-store.s3.amazonaws.com/0/25250/ac541695-7da8-69be-2eb3-94219f1fef90.png "Kobito.RzahAf.png")

iOSによる対応端末は皆さん気にしているとは思いますが、こういったハードウェア制限もありますので、アプリの企画をする際に気にしてみてはいかがでしょうか。

リファレンスには、これ以外の端末の情報や詳しい説明が書かれていますので、是非ご覧になって見てください。

## Refs🔗

[Device Compatibility](https://developer.apple.com/library/content/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/DeviceCompatibilityMatrix/DeviceCompatibilityMatrix.html)

## 最後に🔚

明日は[YKEI_mrn](http://qiita.com/YKEI_mrn)さんで、[「[Fastlane] 性の6時間ではなく、2日間で100個のアプリ申請を実例を交えてご紹介（通称:祭り）」]です。

最後までお読みいただき、ありがとうございました。
mysqlレプリケーションの概要

皆さんこんにちは。ニジボックス Advent Calendar23日目の記事です。


今回は、レプリケーションについて勉強する機会が有ったので、そのまとめを書いていきます。
概要をさらっと書くだけなので張り方については他の記事を参照してね。
#はじめに
レプリケーションとは、mysqlの標準機能の一つで、あるDBに変更を加えたクエリをそのまま実行することでレプリカDBを作成、維持する機能のこと。
用途としては、**バックアップ**、**書き込み用読み込み用で分けて負荷分散**など。
また、張り方は以下の様に自由がききます。
・[マスタ]→[スレーブ]
・[マスタ]→[スレーブ]→[スレーブ2]
・[マスタ]→[スレーブ]
　　↓
　[スレーブ2]


#役割
###レプリケーションユーザ
マスタDBに住むREPLICATION SLAVE 権限を持ったユーザ。
パスワードはプレーンテキストで保持されるので専用ユーザを作るべき。
マスタDBでの実行クエリログ(log_bin)を作成し、スレーブDBに伝えてくれる。
###マスタDB
コピー元になるDBのこと。
###スレーブDB
レプリケーションユーザのログをコピーし自DBにクエリを流していく。
（スレーブ側の処理能力が著しく低いとマスターのクエリを捌けず最新の状態を保てないので、処理能力はある程度近くする必要がある。あとバージョンも。）


#ステータスの見方
こちら実際に動いているレプリケーションのステータスの見方です。（行数が多いので、最小限の行だけだしています。）
mysql> show slave status\G
*************************** 1. row ***************************
Master_Host: 127.0.0.1   **#マスタのIP**
Master_User: replica   **#マスタのレプリケーションユーザ名**
Master_Port: 3306   **#マスタのポート番号**
Master_Log_File: mysql-bin.000003　   **#最新logファイル名**
Read_Master_Log_Pos: 31122248   **#マスタの最新クエリ番号**
Relay_Log_Pos: 30512168
   **#最後に実行したクエリ番号。**
**#Read_Master_Log_Posと差が有ると同期が追い付いてない！**
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
 **#始めに見るべき項目。マスタの実行ログを取得しているか**
Slave_SQL_Running: Yes
 **#始めに見るべき項目その２。クエリを実行しているか**
**#noの場合Last_Errorにエラー内容が図れている**
**#同期を図っているか**
Last_Errno: 0
Last_Error:　**#エラー内容**
カラー絵文字〜OpenTypeフォントの仕様を中心に〜

# カラー絵文字とは
ここでカラー絵文字と言っているのは、🗻や🗾などのように、**環境によっては**プレーンテキストであるにもかかわらずカラフルに表示される文字のことです。

# カラー絵文字が表示される二つの方法

## 画像が表示されている
サイトやアプリケーションによっては定義された文字列が対応する画像に差し替えられて、さも文字であるかのように表示されるものがあります。
こちらの話には全く興味がないので、これ以上は省きます。

## フォントがカラフルな文字を持っている
数年前まではプレーンテキストには色という概念が存在しませんでした。
そこに色の概念が入り込みました。
これは、フォントの中にそうした情報を含めることができるようになったためです。

もちろん、カラー絵文字が表示されるからと言って、プレーンテキストの方が大きく変わったわけではありません。
なのでそうしたフォントがない環境では絵文字はこれまで通りモノクロで表示されますし、カラー絵文字に対応していないアプリケーションも白黒のままです。
（もちろん互換性という単語を知らないAppleの世界では対応アプリケーションという概念がそもそもありません）

# カラー絵文字フォントのための4つの仕様
フォントファイルには仕様があります。
簡単なお話はOpenTypeの仕様入門 ([前編](http://qiita.com/496_/items/f6efb650dcf7e9d2dfe4)・[中編](http://qiita.com/496_/items/4f8327fe741cf0c87736)・[後編](http://qiita.com/496_/items/02f2d63fe4bd5603e4dc)) で少し話しました。
カラー絵文字フォントも私が把握している範囲は全てOpenTypeフォントになっています。

もちろん、カラー絵文字のための仕様は昔からあったわけではなく、最近追加されたものとなります。
そして、大きく分けて4つの仕様があります。

## `CBDT`/`CBLC`: Androidのやつ
Noto Color Emojiなどで使われている仕様です。
画像です。
「ＭＳ 明朝」「ＭＳ ゴシック」などにはビットマップフォントが埋め込まれていますが、あれのカラー版です。
`CBDT`にはPNG画像とそのグリフの送り幅などの情報が入っています。
`CBLC`には各グリフのデータが`CBDT`のどこにあるかの情報が書かれています。
基本的には昔からあるビットマップフォント用のテーブルである`EBDT`/`EBLC`と同様の構造です。

- FreeTypeで読み込むためには
    - `FT_CONFIG_OPTION_USE_PNG`を有効にしてビルドしましょう
    - PNG画像を内部に埋め込んでいる関係でlibpngが必要です
    - `FT_Load_Glyph`で`FT_LOAD_COLOR`を使います

## `COLR`/`CPAL`: Windowsのやつ
Segoe UI Emojiなどで使われている仕様です。
アウトライングリフです。
`CPAL`には色情報が羅列されていて、その色番号が`COLR`から参照されます。
`COLR`はカラー絵文字を描画するための情報が書かれています。
カラー絵文字は色のついたグリフを同じ場所に重ねていくことで表現されます。
色にはアルファチャンネルを設定することもできます。
つまり`COLR`はGIDから(GID,色番号)の順序付きリストへの写像です。

- FreeTypeで描画するためには
    - `COLR`/`CPAL`テーブルを取得してパースしましょう
    - 指定された順番で指定されたグリフを指定された色で重ねていくだけ
        - 簡単ですね

## `sbix`: Appleのやつ
Apple Color Emojiなどで使われている仕様です。邪悪なやつです。
**仕様上は**画像です。
仕様は[ここ](https://www.microsoft.com/typography/otspec/sbix.htm)にあります。
`仕様のようなもの`は[ここ](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6sbix.html)にあります。

基本的にはただのPNG画像を突っ込んだよっていう雑なやつです。
仕様上はJPEGとTIFFも使えます。
`仕様のようなもの`上ではPDFも使えます（楽しそう💀）。さらに、`仕様のようなもの`上は、画像の上に通常のグリフを描画させることもできます（graphicType: `mask`）。`mask`を使うとグリフによって画像の表示位置が変わった記憶があります（楽しい💀）。今見たらPDFと`mask`は未来の拡張のためにって書かれてたので安心しました。

- FreeTypeで読み込むためには（PNG画像）
    - `FT_CONFIG_OPTION_USE_PNG`を有効にしてビルドしましょう
    - PNG画像を内部に埋め込んでいる関係でlibpngが必要です
    - `FT_Load_Glyph`で`FT_LOAD_COLOR`を使います

## `SVG␣`
源ノ角ゴシック Code JPなどで使われている仕様です。
SVGです。
Scalable Vector Graphicsです。
[仕様](https://www.microsoft.com/typography/otspec/svg.htm)を見ると次のように説明されています。

> OpenType fonts with either TrueType or CFF outlines may also contain an optional 'SVG ' table, which allows some or all glyphs in the font to be defined with color, gradients, or animation.

おや？　**animation**という単語が見えますね？
見えてしまいましたね。
つまり、そういうことです。
Firefoxが対応しています（表示例：https://people-mozilla.org/~jkew/opentype-svg/soccer.html）。

静止画に関して言えばDirectWriteとPhotoshopも描画してくれるらしいです。
TATEditorでの対応は1年以上先の話になると思います。
（こっちよりはVariable Font対応を優先します）

# フォント描画の実装
伝え聞くところによると、まともにカラー絵文字混じりのテキストを描画してくれそうなのはWindowsのDirectWriteだけのような気がします。
TATEditorではグリフの置換を含まないSVG以外のカラー絵文字に対応しています。
SVG対応にはしばらくかかりそうですが、👨‍👩‍👧‍👦などのカラー絵文字にはアプリ版を作ったら手をつけたいです。
有名な話ですが👨‍👩‍👧‍👦はコードポイント7つで構成されています。

# おわりに
今日はカラー絵文字フォントの仕様の話を簡単にまとめました。

ところで複数のカラー絵文字が収録されている場合の正しい挙動を私は知らないのですが、どこかに書かれてるのでしょうか？
windowsでvagrantのansible_localをする時はssh接続しなくてもOK

# windowsでvagrant+ansible_localをする時はssh接続しなくてもOK

windwosでvagrantのansible_localで環境を構築している時に
vagrant provisionの実行中に下記のエラーが発生

```
fatal: [192.168.43.51]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname =: Name or service not known\r\n", "unreachable": true}
        to retry, use: --limit @/vagrant/ansible/playbook.retry
```

ssh接続できませーんと。。。

ローカル環境なので、ssh接続しない方法で接続するように修正した。
ansibleのプレイブックに
connection:localと記述する。

```playbook.yml
---
- hosts: 192.168.43.51
  connection: local
  become: yes
  user: vagrant
  tasks:
  - name: install the latest version of Apache
    yum: name=httpd state=latest

```

公式
http://docs.ansible.com/ansible/playbooks_delegation.html#local-playbooks

ssh接続の方法は別途調べまーす
RethinkDBをCentOS7にインストールする

# 前提

[STF (Smartphone Test Farm)](http://openstf.io)を構築したので、RethinkDBのセットアップを改めてやり直して、整理してみました。

# インストール

以下に公式のインストール方法があります。

- https://rethinkdb.com/docs/install/

CentOSの場合はyumでインストール可能です。

```
wget https://download.rethinkdb.com/centos/7/`uname -m`/rethinkdb.repo -O /etc/yum.repos.d/rethinkdb.repo
yum install rethinkdb
```

# 起動

基本的に`rethinkdb`というコマンドを発行するとカレントディレクトリに、`rethinkdb_data`というディレクトリが作成されて、プロセスが立ち上がります。

## 自動起動設定

それだと、OS再起動のたびに手動でコマンド打たないといけないので、運用しづらくなります。
RethinkDBにはデーモンで起動するモードもあるので、それで起動します。

基本的には以下の公式ドキュメントに書いている内容です。

- [Start RethinkDB at system startup](https://rethinkdb.com/docs/start-on-startup/)

公式ドキュメントでは「__Startup with systemd__」となっているところの手順です。
`/usr/lib/systemd/system/rethinkdb@.service`を作成して以下を記述します。

```config:/usr/lib/systemd/system/rethinkdb@.service
[Unit]
Description=RethinkDB database server for instance '%i'

[Service]
User=rethinkdb
Group=rethinkdb
ExecStart=/usr/bin/rethinkdb serve --config-file /etc/rethinkdb/instances.d/%i.conf
KillMode=process
PrivateTmp=true

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

次にインスタンスの設定ファイルを作成します。
`/etc/rethinkdb/default.conf.sample`にサンプルの設定ファイルがあるので、これを`/etc/rethinkdb/instances.d`以下にコピーして設定をカスタマイズしていきますが、設定項目もそんなに多くないので、基本的に以下で十分です。
`/etc/rethinkdb/instances.d/default.conf`を作成して以下のようにします。

```config:/etc/rethinkdb/instances.d/default.conf
runuser=rethinkdb
rungroup=rethinkdb
pid-file=/var/run/rethinkdb/rethinkdb.pid
directory=/var/lib/rethinkdb/default
bind=all
driver-port=28015
cluster-port=29015
http-port=8080
server-name=server1
```

## systemdに登録して起動

```
systemctl enable rethinkdb@default
systemctl start rethinkdb@default
```

# 操作

RethinkDBにはWeb UIが用意されています。
上記の設定でWeb UIが使えるようになっています。
ブラウザで`http://{IPアドレス}:8080`でアクセスできます。

# ポイント

ポイントは設定ファイルに`bind=all`と記述することです。こうしておかないと`localhost`からしかWeb UIにアクセス出来なかったりします。
静的なWebページ-Web入門②-

#はじめに
Web通信とサーバーについて、とても初歩的なところからまとめた覚書です。
[入門①はこちら](http://qiita.com/awannavuamaaan/items/d57830769a4856c1ff13)

##ブラウザとサーバーのやりとり
TCP接続が成功したのち、ブラウザとサーバーは以下のやりとりを行います。

- ブラウザ：HTTPリクエストをサーバーへ送信
- サーバー：HTTPレスポンスをブラウザへ返す

リクエストとレスポンス。とてもシンプルです。

##HTTPメソッド
HTTPメソッドとは、ブラウザがリクエストを送信する際にどういった方法で送信するかという手段（？）のことです。
いくつかありますが、POSTとGETがメイン、と言うか基本のようです。

`POST`:
ブラウザからサーバーへ情報を渡すこと。例えば、掲示板に投稿する時や、データをアップロードする時などです。

`GET`:
Webサーバーから情報を取り出すためのメソッドです。例えば、サーバーに保存してあるコンテンツを取得して、ブラウザに表示するなどです。

##静的なWebページ
静的なページは、サーバーの、あるディレクトリに保存されているファイルを表示するだけのものです。
例えば、`www.example.com`と言う名前で運用されているサーバーがあった時、ブラウザから`http://www.example.com/index.html`というリクエストを出した場合、サーバーはそのドキュメントルートに存在する`index.html`というファイルを返します。

##ステータスコード
HTTPレスポンスの中にはステータスコードというのがあります。ブラウザ側でよく目にするのは`404 NOT FOUND`とかですね。

- 400番台：クライアント側のエラーで、アクセス権がなかったり（403）、リクエストされたURLが発見できなかったり（404）です。
- 500番台：サーバー側のエラー。

HTTPレスポンスメッセージには、ステータスコードの他にもブラウザで表示する内容や、動的なページで欠かせないクッキー情報も含まれます。


動的なページについては、[別記事](http://qiita.com/awannavuamaaan/items/c9570735d246000a6425)でまとめます。
カンバンってなぁに

こんにちは。

今日はカンバンについて、かるく触れていきたいと思います。

## カンバンってなぁに

カンバンは以下の本を拝読しました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/150624/bbba2385-596b-d25e-06fe-732e4706e466.jpeg" alt="カンバン仕事術" width=300 >

[書籍：カンバン仕事術](https://www.amazon.co.jp/%E3%82%AB%E3%83%B3%E3%83%90%E3%83%B3%E4%BB%95%E4%BA%8B%E8%A1%93-Marcus-Hammarberg/dp/487311764X)


## カンバンの役割

カンバンの役割は大きく分けて３つある。
・作業の見える化
・WIPの制限
・流れの管理

### 見える化
タスクを付箋に書き出していき、
ワークフローにそって、はりつけていく。
それぞれのタスク、TODOを見える化し、どう進めていくのがいいのかを共有できやすくする。

### WIPの制限
WIPとは、Work In Progressや、Work In Processの略であり、仕掛り作業を意味している。
仕掛り作業とは、着手中の作業のことで、それを少なくすることに重きをおく。
カンバンのおはなしを聞く際によく出てくる、「終わらせることを始めよう」
がまさにこのことを指している。

### 流れの管理
カンバンによって作り上げたワークフローが邪魔されないように、
管理すること。この管理は改善をし続ける前提となっている。
迅速に仕事ができるように、ムダの排除等、方法はいくつもある。


## かんばん方式
トヨタのかんばん方式（こちらはひらがな）
トヨタ生産方式「ジャスト・イン・タイム」も有名。
カンバンのコンセプトとしては、こちらが起源となっている。

「ジャスト・イン・タイム」とは、「必要なものを、必要なときに、必要なだけ」という意味です。
自動車のように3万点にものぼる部品から造られている製品を、大量にしかも効率良く生産するためには、部品の調達などのために、ち密な生産計画を立てる必要があります。
その、生産計画に応じて「必要なものを、必要なときに、必要なだけ」供給できれば、「ムダ、ムラ、ムリ」がなくなり、生産効率が向上します。

[引用元：ジャスト・イン・タイムについて](http://www.toyota.co.jp/jpn/company/vision/production_system/just.html)

カンバンは手法や捉え方、進め方等、答えがあるわけではなく、それぞれにあったプロジェクトに沿って
改善を行いながらすすめていく。それが醍醐味のようで、是非体感してみたいと思っています。

アウトプットして、ちしき固めていくぞ〜。
Ruby FFI bindings for the OSX Cocoa API を使うと楽にMacアプリが書ける

[Ruby FFI bindings for the OSX Cocoa API](https://github.com/patrickhno/cocoa) というものがあったので使ってみました。

## インストール

```activesupport requires Ruby version >= 2.2.2.```とあるので、まず独自にRubyをインストール。Homebrewを使ってみました。

```
brew install ruby
```

最新バージョンのRubyが使えるのを確認後、cocoa gem をインストール。

```
gem install cocoa
```

準備は以上です。

## サンプルコード

```ruby
require 'cocoa'

Cocoa::NSAutoreleasePool.new

app = Cocoa::NSApplication.sharedApplication
app.setActivationPolicy Cocoa::NSApplicationActivationPolicyRegular
app.activateIgnoringOtherApps true

alert = Cocoa::NSAlert.alloc.init.autorelease
alert.setMessageText "Hello world!"
alert.runModal
```

![Hello Alert Box](https://raw.githubusercontent.com/patrickhno/cocoa/gh-pages/hello_world.png)

メモリ管理は NSAutoreleasePool を使用した半自動管理なコードになるようです。

もう少しMacアプリっぽくウィンドウアプリを書いてみました。

```ruby:hello.cocoa.rb
#!/usr/local/bin/ruby

require "cocoa"
Cocoa::NSAutoreleasePool.new

class UserInterface < Cocoa::NSObject
  attr_accessor :window, :btnHello, :btnGoodbye
  def init
    @window = NSWindow.alloc.initWithContentRect(NSRect.new(x: 0, y: 0, width: 250, height: 100), 
      styleMask: NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask, 
      backing: NSBackingStoreBuffered, 
      defer: false).autorelease
    @window.setTitle "Welcome to Ruby"
    @window.setReleasedWhenClosed true
    @window.center
    
    @btnHello = NSButton.alloc.initWithFrame(NSRect.new x: 10, y: 10, width: 110, height: 80).autorelease
    @btnHello.setTitle "Hello!"
    @btnHello.setBezelStyle NSRegularSquareBezelStyle
    @btnHello.setSound NSSound.alloc.initWithContentsOfFile("/System/Library/Sounds/Tink.aiff", byReference:true).autorelease
    @window.contentView.addSubview btnHello
    
    @btnGoodbye = NSButton.alloc.initWithFrame(NSRect.new x: 130, y: 10, width: 110, height: 80).autorelease
    @btnGoodbye.setTitle "Goodbye!"
    @btnGoodbye.setBezelStyle NSRegularSquareBezelStyle
    @btnGoodbye.setSound NSSound.alloc.initWithContentsOfFile("/System/Library/Sounds/Basso.aiff", byReference:true).autorelease
    @window.contentView.addSubview btnGoodbye
    
    return self
  end
end

class AppDelegate < Cocoa::NSObject
  def init
    @ui = UserInterface.alloc.init.autorelease
    @ui.btnHello.setAction :hello
    @ui.btnGoodbye.setAction :goodbye
    return self
  end
  
  def hello sender
    puts "hello"
  end
  
  def goodbye sender
    puts "goodbye"
    $application.terminate nil
  end
  
  def applicationDidFinishLaunching notification
    @ui.window.makeKeyAndOrderFront self
  end
  
  def applicationShouldTerminateAfterLastWindowClosed sender
    return true
  end
  
end

$application = Cocoa::NSApplication.sharedApplication
$application.setActivationPolicy Cocoa::NSApplicationActivationPolicyRegular
$application.setDelegate AppDelegate.alloc.init.autorelease
$application.activateIgnoringOtherApps true
$application.run
```

![ruby.cocoa.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/4feebfde-0d84-74f5-cd7c-4bf4d91ac16f.jpeg)

コツはサブクラス定義で```Cocoa::NSObject```由来のクラスを継承する、サブクラスのイニシャライザーで```self```を返す、```autorelease```を忘れずに、と言ったところでしょうか。

RubyでMacアプリを書けるのは楽しいです。
ownCloud/NextcloudでAutoconfig！

ownCloud/Nextcloud Japan Advent Calendar 2016 - Qiita
http://qiita.com/advent-calendar/2016/owncloudjp
の24日目です。

Stylez Advent Calendar 2016 - Qiita
http://qiita.com/advent-calendar/2016/stylez

株式会社スタイルズの Adventカレンダー 24日目も兼ねてます。

ownCloud/Nextcloud のセットアップ自動化なんて必要としている人はまあ、ほとんどいないよね、とか思いつつ書いてみます。
＃ネタがないんですよ。。

# 1. 通常の動作

普通は、ownCloud/(Nextcloudも同様、以下略) のRPMをインストールしてブラウザーでURLを叩くと一番最初に以下のような画面がでてきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/15176/7117f4d1-8ba0-f7f8-cb95-910ce8151754.png)

上記は、DBを指定している画面。

管理者IDとパスワードを入力して、データフォルダーを指定して、データベースを指定しないと次に進むことはできません。

さらに、データベース接続IDとかパスワードを間違えると大変面倒なことになります。

# 2. ぶっちゃけ面倒ですよね。

どうせ、セットアップしたときに

- データフォルダー
- データベースのIPアドレス
- データベースの接続ID
- データベースの接続パスワード

は決まっているんですから、入力しなくてもいいですよね。

# 3. autoconfig.php で自動化！

まず、以下のようなファイルを用意します。

```lang:autoconfig.php
<?php
$AUTOCONFIG = array(
  "dbtype"        => "mysql",
  "dbname"        => "<データベース名を指定>",
  "dbuser"        => "<データベースの接続ID>",
  "dbpass"        => "<データベースの接続パスワード>",
  "dbhost"        => "<データベースのIPアドレス>",
  'dbtableprefix' => 'oc_',
  /* date format to be used while writing to the owncloud logfile */
  'logdateformat' => 'Y-m-d H:i:s',
  /* timezone used while writing to the owncloud logfile (default: UTC) */
  'logtimezone' => 'Asia/Tokyo',
#  "adminlogin"    => "<管理者ID>",
#  "adminpass"     => "<管理者パスワード>",
);
```

このファイルを
ownCloudのconfig ディレクトリに設置します。
パーミッションは、Webサーバーの実行権限に合わせてください。


# 4. ブラウザーをリロードします。

opcacheを使っている場合は、Webサーバー(or php-fpm)をリスタートした方が良いかもしれません。

![image](https://qiita-image-store.s3.amazonaws.com/0/15176/b12555e0-9910-d2b6-e8aa-847b464292ee.png)
ほら！こんなにスッキリ！

※注：スクリーンショットがNextcloudになっていますが、autoconfig.phpを入れたらNextcloudになるわけではありません。
Enable curtain mode of the Chrome remote desktop in the MacOS


MacでChrome remote desktopをサーバーとして実行するときに、カーテンモード(サーバーの実画面をログイン画面にする)方法。

# 設定
ターミナルで以下を実行

```
$ defaults write com.google.Chrome RemoteAccessHostRequireCurtain -bool true
```

# 確認

```
$ defaults read com.google.Chrome
```

# 解除

```
$ defaults delete com.google.Chrome RemoteAccessHostRequireCurtain 
```


# 動機
はじめ

```
$ defaults write com.google.Chrome RemoteAccessHostRequireCurtain -string YES
```

とやると、うまく起動しなかった。
/var/log/syslogを見ると

```
Invalid policy contents:　RemoteAccessHostRequireCurtain: The value type doesn't match the schema type.
```
のようなエラーが出ていたので。
バージョンの問題なのか、深追いはしていない。


# 参考

- https://support.google.com/chrome/a/answer/2799701?hl=ja
MauticとWordPress連携Plugin (設計編）

[Mautic Advent Calendar 2016　](http://www.adventar.org/calendars/1402)の23日目です。

#はじめに
　こんにちは、竹中です。
　WordPressコミュニティでは「ちくちゅう」と呼ばれています。

　以前は、WordPressをEcCubeと連携させたり、スマフォアプリのAPIにしたり、自分でいろいろ開発していたのですが、最近は開発からはなれてExcel方眼紙ばかり弄っています。
　年明けから働き方が変わって、マーケティング関連領域の会社で開発マネジメントの仕事をすることになったので、リハビリがてら＆実用も兼ねてMauticと連携するWordPressプラグインを作ってみようと思っています。

　当初は今日までにプラグインを完成させるつもりだったのですが、仕事が変わる云々で時間があまりとれなかったので、今回は構想段階のものを書こうと思います。
　
#何を作るか
　現在あるMautic関連のWordPressプラグインは、12/17の岡本さんの記事
　https://www.mau.tips/how-to/connect-cms/wordpress-and-mautic/
　にあるように、
　　・Mautic公式が出してるMauticのトラッキングタグ埋め込むプラグイン
　　・WordPressのフォームとの統合
　といった、「リードを取得するまで」のものが多いようです。
　これからMauticのWordPressプラグインを作るとしたら、リードを取得した後の連携ができるものがよさそうです。
　（Mauticのよいところは、WordPressのプラグインがまだあまりないので、作るネタがたくさん見つかるところですね）

　Mauticはここ最近かなり早いペースでバージョンアップしていてだいぶこなれて来ましたが、その機能の中でもキャンペーンビルダーは直感的なUIで使いやすいです。

**Mauticのキャンペーンビルダー**
![campaign.png](https://qiita-image-store.s3.amazonaws.com/0/18583/f70cd0f0-7b25-eec0-a676-b5e19565c022.png)

　ということでキャンペーンビルダーで作ったキャンペーン情報や、セグメントやステージの情報をWordPress側に取り込んで、WordPress側で何かしらアクションさせるプラグインを作ろうと思います。


#要件
ざっくりこのプラグインでやることはこんな感じ。

###１、Mauticからデータ取得する
　　　Mauticの開発情報　https://developer.mautic.org/　
　　　にあるRest APIを使います。
　　　[キャンペーン](https://developer.mautic.org/#get-campaign)
　　　[セグメント](https://developer.mautic.org/#get-segment)
　　　で必要なデータは取得できそうです。
　　　
　　　このへんでどのコンタクトがどのセグメントやキャンペーンにいるかはわかりそう。
　　　　https://developer.mautic.org/#get-segment-memberships
　　　　https://developer.mautic.org/?json#get-campaign-memberships

　　　コンタクトの情報が更新されるたびにAPI叩くと大変なことになりそうなので、
　　　WordPress側からプルで取得するか、１日一回バッチで取得する程度にしたいです。
　　　[Webhook](https://developer.mautic.org/#webhooks)で細かい更新とれたらいいかな。

###2、アクセスしてきたユーザーがだれか判別する
　　　これはCookieのストレージにContactのIDを保存して判別するとかだろうか。
　　　ここはMauticがどうやってユーザーを識別しているかの調査も含めて検討の余地あり。

###3、アクセスしてきたユーザーによって、コンテンツを出し分ける。
　　　最初はウィジェットの出し分けからやってみる。


１〜３までできれば、Mauticで作ったキャンペーンビルダーのシナリオに沿って、アクセスしてきたユーザーを次のステップに誘導する」ことができそうな気がする。
そうするとマーケ担当はキャンペーンビルダーをいじるだけで、あとは勝手にキャンペーンのシナリオに従って、ユーザーをゴールまで導いてくれるようになる・・・といいな。


#次回予告

続きはたぶん１月末か２月ごろ。
（もちろん誰かが先に作ったら使わせてもらいますw）


それではみなさんよいお年をー。
Quaternion.slerp で回転

### Quaternion.slerp 
第一引数に qb(目標とする姿勢)
第二引数に t(0 から1までの割合) 
をとり、現在の姿勢からどの程度目標とする姿勢に近いかを割合として表現するメソッドです.

[three.js Reference/Quaternion](https://threejs.org/docs/?q=quaternion#Reference/Math/Quaternion)

二つデモを作ってみました

矢印オブジェクトの姿勢を開始座標から目標座標に向ける[デモ (gist)](https://gist.github.com/kessokujp/dc97b751e12f8a5d327dcadc0e8740a1)

Quaternion.inverse メソッドを使って
コンテナとしているキューブ側の姿勢を、指定座標を始点として 矢印オブジェクト(vTarget) に向けさせる[デモ (gist)](https://gist.github.com/kessokujp/2bc267231214c53d7d672ce4226dd4e5)

よいクリスマスを
Scala関数型デザイン&プログラミングを読み直した

Scalaを使わない1年が過ぎた。しかしFPとKotlinとSwiftを鍛えた今ならFPinScalaの資産を使い回せるはずだ。
(前にもScala→Swiftしようとしたけど不足しているものが多すぎてちからつきた。)

FPinScalaのコードは省略。Scalaの記事だけど著作権怖いから手元でみてください。
代表して10章モノイドをトライ。

# ここ最近の私の周辺のScala事情

大学生です。

* コップ本の存在は(一部には)知られているらしい。生協にも置いてある。FPinScalaはわからない。
* PHPerサークルの後輩達の何人かがScalaに浮気したり異動したりしているらしい。Javaライクな書き方に留まっているのか深淵を覗く勢いなのかまでは聞いてない。
* 大学のグループ課題でわざわざScalaを選ぶ奴はいない。共通語はJava、あとは学習コストが少なくて済むRailsに飛びつく。よしみんなで1からScalaやろうぜとはならない。ダメ絶対。

すっかりFPを勉強するためだけのScalaになってしまった。Haskell書かないのにすごいHaskell読んでる感じ。

以下本題。

# 第10章モノイド

## trait Monoid[A]

* Kotlin
  * `trait` は廃止
* Swift
  * `protocol Monoid<A>` という書き方はできない。
  * なぜ `static` かは後述

```kotlin
interface Monoid<A> {
    fun op(a1: A, a2: A): A
    val zero: A
}
```

```swift
protocol Monoid {
    associatedtype A
    static func op(a1: A, a2: A) -> A
    static var zero: A { get }
}
```

## Monoidインスタンス

* Kotlin
  * 関数を引数に使用する時は `::hoge` とすればよいが、メソッドを引数に使用することはできない(らしい)。→[Kotlin: how to pass a function as parameter to another? - Stack Overflow](http://stackoverflow.com/questions/16120697/kotlin-how-to-pass-a-function-as-parameter-to-another)
  * Scalaでいう `foldLeft` と `foldRight` はKotlinでは `fold` と `foldRight` 。
* Swift
  * `struct` にするのが正解なのかは謎。でも呼ぶにはそうせざるを得ない気がする。
  * 相変わらず `foldLeft` を `reduce` と呼ぶ謎。 `foldRight` は存在しないはず。
  

```kotlin
val stringMonoid = object: Monoid<String> {
    override fun op(a1: String, a2: String): String = a1 + a2
    override val zero = ""
}

class ListMonoid<A>: Monoid<List<A>> {
    override fun op(a1: List<A>, a2: List<A>) = a1.plus(a2)
    override val zero = listOf<A>()
}    
```

```swift
struct StringMonoid: Monoid {
    typealias A = String

    static func op(a1: String, a2: String) -> String {
        return a1 + a2
    }

    static var zero: String {
        return ""
    }
}

struct ArrayMonoid<T>: Monoid {

    typealias A = [T]

    static func op(a1: [T], a2: [T]) -> [T] {
        return a1 + a2
    }

    static var zero: Array<T> {
        return []
    }
}
```

実際にはこんなことしないで

```kotlin
let s = words.fold("") { a, b -> a + b }
```

とか

```swift
let s = words.reduce("", +)
```

とか書くんだろうけど。
珍しくSwiftが1番短い。でもreduceかっこ悪い。

## sealed trait WC

* Kotlin
  * data classは他から継承できないので、Scala版のようにはいかない。まあ何とかなるかな？

```kotlin
sealed class WC {
    class Stub(val chars: String): WC()
    class Part(val lStub: String, val words: Int, val rStub: String): WC()
}
```

```swift
enum WC {
    case stub(chars: String)
    case part(lStub: String, words: Int, rStub: String)
}
```

調べてる過程でこういうの見つけた。
[Scala vs Kotlin &#8211; Agilewombat](https://agilewombat.com/2016/02/01/scala-vs-kotlin/)

## mapMergeMonoid

* Kotlin
  * `class MapMergeMonoid<K, V>(val monoidV: Monoid<V>): Monoid<Map<K, V>>` などと書き出せばいけないこともないけど、結局staticメソッドを持ってこれない問題が残る。
* Swift
  * Scala/KotlinみたいにProtocolが総称型を扱えないので `class AnyMonoid<V>: Monoid` をかませないと大変なことになりそう。

こいつはしんどい。Scalaのかち。

# まとめ

最近はいろんな言語が関数型を扱えるようになって、いろいろ遊ぶのに必要な関数 ( `map` とか) も増えてきた。しかし型の表現ではやはり制約がついて、Scalaみたいに直感的に書くほどには至らず、概念を各言語に落とし込むには手間がかかる。やっぱりクラスやインターフェースに落とさずに直接操作するのが無難そう。

Scala先輩はやっぱりすごい！
lumen にはzipエクステンションが必要

```
$ lumen new site

The Zip PHP extension is not installed
```
phpにzipエクステンション入れてとな。
peclで取ってきます

```
sudo yum install php-pear --disablerepo=* --enablerepo=remi,remi-php70
```
```
エラー: パッケージ: php-xml-7.0.14-1.el7.remi.x86_64 (remi-php70)
             要求: libxslt.so.1(LIBXML2_1.0.18)(64bit)
エラー: パッケージ: php-xml-7.0.14-1.el7.remi.x86_64 (remi-php70)
             要求: libxslt.so.1(LIBXML2_1.0.24)(64bit)
エラー: パッケージ: php-xml-7.0.14-1.el7.remi.x86_64 (remi-php70)
             要求: libxslt.so.1(LIBXML2_1.0.22)(64bit)
エラー: パッケージ: php-xml-7.0.14-1.el7.remi.x86_64 (remi-php70)
             要求: libexslt.so.0()(64bit)
エラー: パッケージ: php-xml-7.0.14-1.el7.remi.x86_64 (remi-php70)
             要求: libxslt.so.1()(64bit)
エラー: パッケージ: php-xml-7.0.14-1.el7.remi.x86_64 (remi-php70)
             要求: libxslt.so.1(LIBXML2_1.0.13)(64bit)
エラー: パッケージ: php-xml-7.0.14-1.el7.remi.x86_64 (remi-php70)
             要求: libxslt.so.1(LIBXML2_1.0.11)(64bit)
問題を回避するために --skip-broken を用いることができます。
```
だめでした。。。
結局この方のブログを参考にしました。感謝です。
https://www.lancork.net/2016/05/yum-centos67-php7-install/

```
$ sudo yum -y update
$ sudo yum -y install yum-plugin-priorities
$ sudo rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
$ sudo yum --enablerepo=remi-php70 -y install php-pear
$ pecl install zip
$ sudo vim /etc/php.ini
```
```php.ini
extension=zip.so
```

```
$ lumen new site
```

完了！
ちなみにzipエクステンション入れるとき、gccをインストールしてないといけませんでした。

```
downloading zip-1.13.5.tgz ...
Starting to download zip-1.13.5.tgz (316,993 bytes)
..........done: 316,993 bytes
119 source files, building
running: phpize
Configuring for:
PHP Api Version:         20151012
Zend Module Api No:      20151012
Zend Extension Api No:   320151012
building in /var/tmp/pear-build-rootA9WaYX/zip-1.13.5
running: /var/tmp/zip/configure --with-php-config=/usr/bin/php-config
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for a sed that does not truncate output... /usr/bin/sed
checking for cc... no
checking for gcc... no
configure: error: in `/var/tmp/pear-build-rootA9WaYX/zip-1.13.5':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
ERROR: `/var/tmp/zip/configure --with-php-config=/usr/bin/php-config' failed
```

```
yum install -y gcc
```
再実行で無事に入りました。
Web通信の仕組み-Web入門①-

#はじめに
Web通信とサーバーについて、とても初歩的なところからまとめた覚書です。
#WEB通信の仕組み
ブラウザは、インターネットに接続されたWebサーバーに「情報が欲しい」というリクエストを投げる。サーバーはレスポンス（リクエストに基づいた情報）をブラウザに返す。

###サーバーはたくさんある
当たり前のことですが、世界中には星の数ほどWebサーバーが存在します。仮に「A」という情報が欲しいとした時、それがどこのどのサーバーにあるかはわかりません。そこで、URLという住所を利用します。
##URL
URLとは、例えば `http://www.example.com/index.html`といったもの。このURLを分解すると、

- スキーム：`http`
- ホスト：`www.example.com`
- パス：`index.html`

という3つに分けられる。

####スキーム
`http`は「これはWeb通信ですよ」ということを表す。
####ホスト
>サーバーは星の数ほどある

と言いましたが、その星の数ほどあるサーバーの中で自分の欲しい情報がどのサーバーにあるのかを知るために、ブラウザはホストに対応したIPアドレスを調べることができます。つまりサーバーはIPアドレスを所持していて、ブラウザはホストをもとにそれを探します。

####パス
サーバーを特定することができたら、そのサーバーにあるどの情報にアクセスしたいのかを知らせる必要があります。そのために必要なのが、パスです。

##つまり
ブラウザは、URLという住所をもとにサーバーというグリンゴッツ銀行を探します。そのグリンゴッツの管理人（ゴブリン）に「index.htmlください」って言います。
でもここで疑問が。
「index.html」ってどこにあったっけ？

##TCP接続
>TCP接続はバーチャルサーキットと呼ばれる仮想的な論理回線

なのですが、詳しいことは割愛します。
Webサーバーに通信したい場合には、一般にTCPの80番ポートを使っています。メールサーバーであれば25番ポートです。これは先ほどの例で言うと、部屋番号にあたります。

##まとめ
普段何気なく行なっているWeb通信では、ブラウザがWebサーバーにリクエストを送り、情報を得ています。どのサーバーに接続すればいいかは、URLと言う住所、TCP80番ポートと言う情報を使って判断しています。
以上が、ブラウザがWebサーバーにどうやって通信しているかのまとめです。

[次回](http://qiita.com/awannavuamaaan/items/2579c0fcc3658fe5abdc)は、サーバーに接続した後、どうやってWebページが表示されるのかをまとめます。