OmniAICreator/Qiita-1.07M huggingface dataset:
S2PLと永続化

トランザクションのACID特性とはいうものの、これまではIsolationに関わる話しかしてこなかった。
しかしDurability（記録したデータが永続化される）という特性はDBを使う上で魅力的であり欠かすことができないものである。

## Strict Two Phase Lock

**2PL**というプロトコルは「ロックを使うときは成長相と縮退相の2フェーズで扱え」というルールだったが、このプロトコルに愚直に従うだけではDurabilityを達成することはできない。
そこで「縮退相より前にコミット（データの永続化）を行え」という追加ルールを加える事でDurabilityを達成できる。
この追加ルールが加わった2PLを**Strict Two Phase Lock**(**S2PL**)と言う。

この説明ではピンと来ないと思うので図で説明すると

![non-s2pl.png](https://qiita-image-store.s3.amazonaws.com/0/1716/de40b8aa-b055-e116-87db-e89a6edb1c85.png)

こんな感じに、縮退相が終わった**後**でディスクに永続化する場合、もちろんT1が終わった後でしかユーザにトランザクションの完了を報告しないので、アンロック後にクラッシュしても問題ないと考えるかも知れない。しかし例えば以下のように

![non-s2pl-fail.png](https://qiita-image-store.s3.amazonaws.com/0/1716/bb14edde-1ade-716c-94cd-310ac394cb5c.png)

赤線の場所でDBの電源が落ちた場合、先に完了したT1の結果は失われ、T1の結果書き換えられたxの内容を読んで走ったT2の結果が永続化されてしまい大変な事になる

なので「アンロックは必ずコミット後」というルールを敷く事で

![s2pl_safe.png](https://qiita-image-store.s3.amazonaws.com/0/1716/c2542e21-93b3-2736-2556-ac1692cfa975.png)

どこでクラッシュしても「ディスクに書かれていない値に基づいたトランザクションが永続化されない」という保証は守られる。これが**S2PL**である。技法としては古典的であるが、新しいトランザクションアルゴリズムの正しさを議論する際にも「この手法はS2PLと等価である」などという形に証明として寄せる為に使ったり非常に便利なアルゴリズムである。
なお、この手法を愚直に使うとパフォーマンスを出すのに苦労することになるため、様々な改善手法が提案されており、それはこのアドベントカレンダーでも随時取り扱っていく。

少し理論面に立ち戻った話をすると、**S2PL**は*Strict*な実行結果を生成し、**SS2PL**は*Rigorous*な実行結果を生成する(StrictもRigorousも辞書で英和探すと「厳格な」と出てややこしいので英語のまま)。
*Strict*とは「あるトランザクションによる、ある値への**書き込み**が他のトランザクションの読み込み・書き込みより先なら、他のトランザクションの読み書きは最初のトランザクションのコミットかアボートより後になる」というルールである。平たく言い換えると、書かれた値はそのトランザクションが終わるまで触っちゃダメ、となる。ロックの挙動と良く一致しているが、2PLに必ずしも従わなくてもこの条件を満たすことはできる、具体的にはReadするだけの要素にはロックを取らない、とか。
*Rigorous*とは*Strict*の条件を守った上で「あるトランザクションによる、ある値への**読み込み**が他のトランザクションの読み込みより先なら、他のトランザクションの読み込みは最初のトランザクションのコミットかアボートより後になる」というルールである。
*Rigorous*なルールに従ったスケジュールはCSRを満たす。

このあたりの詳細は後日の記事で改めて整理する。全部まとめると割と巨大な図になる。
明日はディスクに書く際の詳細について書く。
Fess 管理>全般のログイン設定

Fess 10.3
Fessの利用目的に応じたログインの設定を確認してみます。

### 管理>全般の設定

- [x] ログインが必要

チェックを入れることでFessへのアクセスにログインが必須になります。
Fessの利用者をFessが管理するユーザやLDAP、AD連携したユーザのみとする際にチェックを入れます。

- [ ] ログインリンク表示

チェックを外すことで検索画面のヘッダにあるログインリンクを非表示にします。
ログイン不要な一般ユーザに検索機能を提供する場合にチェックを外します。
また、「ログインが必要」のチェックは外しておきます。

#### JSON APIの利用がメインの場合
Fessの検索画面は利用せずJSON APIを利用する場合には
以下の設定にしておきましょう。

- [x] JSONレスポンス
- [x] ログインが必要
- [ ] ログインリンク表示
iOS（Swift）初心者に向けてのまとめ

HAL名古屋15卒の加藤智紀です。
現在は株式会社LITALICOで
ITものづくり教室LITALICOワンダーを運営しております。

FBでアドイベントカレンダーの招待が来ていたので
参加致しましたー。
 [HAL Advent Calendar 2016](http://qiita.com/advent-calendar/2016/hal "HAL")

今回はHAL時代ではあまり触れなかったiOS(Swift)を学習するための
おすすめサイトやポイントをご紹介致します。

# そもそもiOSアプリを開発するには何が必要か？
【Mac PC】
※HAL生はMACルームなどを貸して貰えればできるかも。　
※MacPCは学割対象なので通常よりお安くかえますよー。
[Apple 学割ストア](http://www.apple.com/jp_edu_1460/shop?afid=p238%7CsOivGGOyy-dc_mtid_18707vxu38484_pcrid_161784015745_&cid=aos-jp-kwgo-edu--slid-)

【Apple Developer Programへの年間登録　有料：年間 11,800円】
[Apple Developer Program](https://developer.apple.com/programs/jp/)
できるようになること
・実機での動作確認（最近は年間登録なくても実機動作確認はできる）
・最新のiOSのBeta版のインストールや最新の開発ツールのインストール
・アプリのApp storeの申請
などなど

【Xcode】
iOSアプリ開発の際必要になるソフトです。

【やる気】
大事ですよねー。

#公式サイト
[Swift](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/index.html#//apple_ref/doc/uid/TP40014097-CH3-ID0)
[Swift日本語ドキュメント※更新日注意](https://developer.apple.com/jp/documentation/)
#おすすめのサイト
- 王道のドットインストール
[ドットインストール](http://dotinstall.com/lessons/basic_iphoneapp_v3)
- Progate
[progate](https://prog-8.com/languages/swift)
- schoo
[schoo](https://schoo.jp/search?q=swift)
- slideshare
[slideshare](http://www.slideshare.net/search/slideshow?searchfrom=header&q=swift)

#勉強会の探し方
- [dots](https://eventdots.jp/)
開催日、場所、キーワードで検索する。

- [connpas](https://connpass.com/)
開催日、場所、キーワードで検索する。

#コミュニティ
- [Swift _developers japan](https://www.facebook.com/groups/758657577499091/?fref=ts)

- [Swiftビギナーズ倶楽部](https://www.facebook.com/groups/swiftbg/?fref=ts)

#Swiftの注意点
Swiftは出たてという事もあり、メジャーアップデートが
今後も起こる言語です。最近はSwift3.0へのアップデートがあり
Swift2.0で書いていたコードがアップデートされたことにより
書き直しが必要になったりしております。
今後の展望はQiitaにまとめてくれている物があったのでこちらへ…

[Swift 3の開発の振り返りとSwift 4の計画が記されたメールの紹介](http://qiita.com/mono0926/items/c51b74fae679e1e39d2b)

※特に本を買うときなど Swift2.0の本を買うとサンプルコードが
動かなかったり、学習する中で困惑が起こるので、気をつけてください。
Google Analyticsのデータとたわむれる 1

legato(とsignet)とinfluxdb-rubyというgemを使って
Google Analyticsのデータをinfluxdbに入れてみます。

## Legatoのクラスを生成
普通のRubyのクラスへLegato::Modelをextendして、
metricsとdimensionsを設定します。

```ruby
class DailyPageView
  extend Legato::Model

  metrics :pageviews, :sessions
  dimensions :date

  filter :organic_searches, &lambda { matches(:medium, 'organic') }
end
```

metricsはpageviewsと設定すると
`ga:pageviews`というパラメータに変換してくれます。
mcf(Multi-Channel Funnels)やrt(Real Time)の場合にも対応しています。

```ruby:lib/legato.rb
  def self.to_ga_string(str, tracking_scope = "ga")
    "#{$1}#{tracking_scope}:#{$2}" if str.to_s.camelize(:lower) =~ /^(-)?(.*)$/
  end
```

次にこのクラスを使って、ページビュー数とセッション数を取得します。

## 取得
[signet](https://github.com/google/signet)というgemで取得したtokenを
Legato::Userのクラスに渡して、profileの情報を取得します。
(ここは割愛します。後で書くかも)
その後、influxdbに入れます。

```ruby
  profile = oauth ## OAuth2の認証でtoken取得後にga_profiles = Legato::User.new(token).profiles.first
  response = DailyPageView.results(profile, start_date: start_date, end_date: end_date, limit: 3000).organic_searches

  response.each do |ga_value|
    influxdb = InfluxDB::Client.new ENV['INFLUXDB_DATABASE'], ['INFLUXDB_USERNAME'], ['INFLUXDB_PASSWORD']
    ga_data = []
    ga_data.push(
      series: 'pv_' + ga_value.date.to_date.strftime('%Y-%m'),
      tags: { day: ga_value.date.to_date.strftime('%Y-%m-%d') },
      values: ga_value.to_h
    )
    influxdb.write_points(ga_data)
  end

```

seriesはなければ、作ってくれますが、
事前にENV['INFLUXDB_DATABASE']で設定しているデータベースは作っておきましょう。

上記のコードを実行したら、
influxdbに接続して、SQL(InfluxQL)を打ちます。

`> select * from /pv_/`

```
name: pv_2016-11
----------------
time			date		day		pageviews	sessions
1481111505000000000	20161127	2016-11-27	2		1
1481111505000000000	20161129	2016-11-29	2		1
1481111505000000000	20161128	2016-11-28	2		1
1481111505000000000	20161130	2016-11-30	5		2

name: pv_2016-12
----------------
time			date		day		pageviews	sessions
1481111505000000000	20161203	2016-12-03	6		2
1481111505000000000	20161202	2016-12-02	7		3
1481111505000000000	20161201	2016-12-01	5		3
```

今回はdate(value)とday(tag)があって、変ですが、
いちおう入っているようです。

## 終わりに
とりあえず、RubyのHashをvaluesに渡せば、
keyをカラムとしたテーブル(series)に
データ(value)を格納することができます。
この辺りが便利なところだと思います。
e が押せないのは誰のせい？

# 本題

モーションの e が押せないんです。いつも whh とやってしまってから、ちくしょうしまったまたやってしまった、って思ってしまうんです。

## 原因を考える

困った時はやはり基礎に帰らねばということで、超久々に vimtutor をやってみました。

## わかった（わかったとは言ってない）

> レッスン 2.1: 削除コマンド
> ** 単語の単語の末尾までを削除するには dw とタイプしましょう **

ここで w が実習できます。

> レッスン 2.2: その他の削除コマンド
> ** 行の末尾までを削除するには d$ とタイプしましょう **

ここで $ が実習できます

> レッスン 2.3: オペレータとモーション
>
>  オペレータの一部一覧:
>    w - カーソル位置から空白を含む単語の末尾まで。
>    e - カーソル位置から空白を含まない単語の末尾まで。
>    $ - カーソル位置から行末まで。

実習なしで e が出てきます。ひどい！

## でも実は

次のレッスン 2.4 で、e を実習できるようになっています。やっぱり vimtutor が悪いわけなじゃなかった？

## じゃあ何故？

0 も $ も w も b も使っているんですが、e が使えない。使いたい。でもすぐ w 押しちゃう。どうしたらいいんでしょうか・・・。

# おまけ

## 真面目なおまけ

この記事を書くにあたって、vimtutor を久しぶりにやり直したのですが、レッスン 1.6 の 5. で typo らしきものを見つけました。

>ステップ 1 で **vimtutuor** を終了した場合は

version 7.4.1689 (Xubuntu 16.04) で確認しました。

## どうでもいいおまけ

そういえば昔秀丸ユーザーだったころ、サルネン風[^1]は全く使ってなかったことをふと思いだしました。三つ子の魂百までとはこのことか。（全然違う）

[^1]: 秀丸における「サルネン風」とは、単語の末尾に移動するコマンドのことで、サルネンさんという方が要望されたのがきっかけで実装されたためそのような名前になっているそうです。
日付の歯抜けをチェックする「date_discreter」

date_discreterは日付など歯抜けをチェックするためのgemです

* https://github.com/sue445/date_discreter
* https://rubygems.org/gems/date_discreter

# 作った経緯
社内で作ってる課金ライブラリが

* 1時間に1回：課金系の実レコードの集計してhourlyレポートを作成
* 1日1回：hourlyレポートを積み上げてdailyレポートを作成
* 1ヶ月に1回：dailyレポートを積み上げてmonthlyレポートを作成

のような積み上げ方式（キングスライム方式）になっているのですが、レポートを積み上げる時に途中のレポートが1つでも欠けていると正しく売上レポートが出ないのでhourlyやdailyの歯抜けを調べるための処理をgemにしました。

詳しくはこちらを読んで下さい

[ドリコムを支える中間ポイントシステム - くりにっき](http://sue445.hatenablog.com/entry/2014/12/01/000000)

丁度2年前のアドベントカレンダーでOSSにしたということで個人的には思い入れがあります

# 使い方
* `discrete_months`, `discrete_days`, `discrete_hours` : 引数に渡した `Date` や `Time` の配列の歯抜けを返す
* `continuous_months?`, `continuous_days?`, `continuous_hours?` : 引数に渡した `Date` や `Time` の配列が全部連続している（歯抜けがない）なら `true` を返す、1つでも歯抜けがあると `false` を返す
 
## 月の歯抜けを調べる
```ruby
continuous_months = [
  Date.parse("2014-10-01"), 
  Date.parse("2014-11-01"), 
  Date.parse("2014-12-01"),
]

DateDiscreter.discrete_months(continuous_months)
#=> []

DateDiscreter.continuous_months?(continuous_months)
#=> true

discrete_months = [
  Date.parse("2014-10-01"), 
  Date.parse("2014-12-01")
]

DateDiscreter.discrete_months(discrete_months)
#=> [#<Date: 2014-11-01 ((2456963j,0s,0n),+0s,2299161j)>]

DateDiscreter.continuous_months?(discrete_months)
#=> false
```

## 日の歯抜けを調べる
```ruby
continuous_days = [
  Date.parse("2014-12-01"), 
  Date.parse("2014-12-02"), 
  Date.parse("2014-12-03"),
]

DateDiscreter.discrete_days(continuous_days)
#=> []

DateDiscreter.continuous_days?(continuous_days)
#=> true

discrete_days = [
  Date.parse("2014-12-01"), 
  Date.parse("2014-12-03"),
]

DateDiscreter.discrete_days(discrete_days)
#=> [#<Date: 2014-12-02 ((2456994j,0s,0n),+0s,2299161j)>]

DateDiscreter.continuous_days?(discrete_days)
#=> false
```

## 時間の歯抜けを調べる
```ruby
continuous_hours = [
  Time.parse("2014-12-01 00:00:00"), 
  Time.parse("2014-12-01 01:00:00"), 
  Time.parse("2014-12-01 02:00:00"),
]

DateDiscreter.discrete_hours(continuous_hours)
#=> []

DateDiscreter.continuous_hours?(continuous_hours)
#=> true

discrete_hours = [
  Time.parse("2014-12-01 00:00:00"), 
  Time.parse("2014-12-01 02:00:00"),
]

DateDiscreter.discrete_hours(discrete_hours)
#=> [2014-12-01 01:00:00 +0900]

DateDiscreter.continuous_hours?(discrete_hours)
#=> false
```

ニッチな用途のためのニッチなgemですがぜひご利用ください
普段の投稿では見かけない面白そうなテーマのカレンダー

[Advent Calendar 紹介 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/advent-calendar)の8日目の記事です。

今年の Qiita Advent Calendar はカレンダー数が500を突破しました。すごい数です。

でもテーマの一覧を見ていると普段から日常的に投稿があるタグをそのままテーマにしているものが多く、これでは普段の投稿を見るのと変わらないですよね。

せっかくイベントでやってるんだから普段とはちょっと違うものを見たいですよね？

というわけで、ここでは今年のカレンダーの中から普段の投稿では見かけない面白そうなテーマのものをピックアップしてみました。

## [錯視](http://qiita.com/advent-calendar/2016/illusion)
> 錯視を紹介します。
錯視を作成するプログラムコードもできるかぎり紹介します。

最近テレビでよく見かけるような[こういうの](https://www.google.co.jp/search?q=%E9%8C%AF%E8%A6%96&tbm=isch)をコード付きで紹介しています。

## [クリエイティブコーディング](http://qiita.com/advent-calendar/2016/creative-coding)
> openFrameworks、Processing、Max、visualization、センサー系、など何でも大歓迎です！

聞きなれない言葉ですが[こういうのみたいです](https://www.google.co.jp/search?q=Creative+Coding&tbm=isch)。
プロジェクションマッピングにも関連する技術のようです。

## [Java Puzzlers](http://qiita.com/advent-calendar/2016/java_puzzlers)
> Java PuzzlersとはJavaにある罠・落とし穴的な部分をクイズにし、面白く解説したものです。

## [GetWild](http://qiita.com/advent-calendar/2016/getwild)
> 大事なのはハートです。

## [クソアプリ](http://qiita.com/advent-calendar/2016/kusoapp)
> 役に立たない、世の中に貢献しないアプリとかサービスを出しあって遊ぼうぜ！
出す対象は自作であることが条件です。

テーマ名だけ見ると他人が作ったものを貶す内容かと誤解しそうですが、自分で作った失敗作などを紹介するカレンダーです。

## [儀式](http://qiita.com/advent-calendar/2016/rite)
> やる気スイッチをいれるとき、集中力がたかまった状態にまで持っていくまでの過程、リラックスの仕方など
プログラミング中や、その前後における儀式を教えてください。

## [1分で実現できる有用な技術](http://qiita.com/advent-calendar/2016/one-minute)
> 1分（目安）で実現できる有用な技術を紹介するAdvent Calendarです。

## [機械学習に必要な高校数学やり直しアドベントカレンダー](http://qiita.com/advent-calendar/2016/math_for_ml)
> 機械学習の本を理解するための高校数学のおさらいをしようよ！で、作りました。

機械学習関連はQiitaでも普段から投稿が多いのでいまさら「機械学習」や「Deep Learning」というテーマでカレンダー作るのってどうなの？って思ってしまいますが、こういう目的を絞り込んだカレンダーはとてもいいですね。

## [Esolang(難解プログラミング言語)](http://qiita.com/advent-calendar/2016/esolang)
> Esolang/難解プログラミング言語 にまつわる話なんでも歓迎です

なんか難しそう。。。

## [Advent Calendar 紹介](http://qiita.com/advent-calendar/2016/advent-calendar)
> このカレンダーは、 自分がいま注目しているアドベントカレンダーを紹介していくアドベントカレンダー です！
Illustratorで簡単！イラストのカラバリ作り

Illustratorで作ったイラストのカラバリ（カラーバリエーション・色違い）を
「オブジェクトの再配置」機能を使って簡単に作る方法です。

# <i class="fa fa-product-hunt"></i> オブジェクトの再配置とは？

オブジェクトを選択状態のとき、グルーブバーの中に表示されるアイコン（赤枠）から使えます。
![0-2.png](https://qiita-image-store.s3.amazonaws.com/0/54478/e0684983-7449-67e5-7f6e-a9545bd50312.png)


キャプチャのようなダイアログが表示されます。
現在のカラーのところに、選択したオブジェクトで使用されているカラーが表示されます。
ここから色違いを作っていきます。
![0-3.png](https://qiita-image-store.s3.amazonaws.com/0/54478/6bcf7cf3-1701-a1c5-95b6-b61695e69278.png)



# <i class="fa fa-paint-brush"></i> カラバリを作ってみる

イラストを用意し、実際にカラバリを作ってみます。
![0-1.png](https://qiita-image-store.s3.amazonaws.com/0/54478/6e1d21a6-79cc-6e16-71e7-3b6e88fc7c6e.png)


**１． [現在のカラー]から変更したい色を選び、矢印の右側のエリアをダブルクリック**
カラーピッカーから色を変更します。（今回は紫色の帽子を紅色に変更）
![1-1.png](https://qiita-image-store.s3.amazonaws.com/0/54478/d7c1bd3a-70fb-642a-f0d5-04438ee2f0cf.png)


**2． [OK]を押すと帽子の色と矢印の右側のエリアの色が変わります**
![1-2.png](https://qiita-image-store.s3.amazonaws.com/0/54478/db730104-2467-7028-f26e-6e1fcb91aadb.png)

**<i class="fa fa-smile-o"></i> カラバリの完成です！**
![2-1.png](https://qiita-image-store.s3.amazonaws.com/0/54478/e76ce93f-73b5-d579-2ae5-fa6dfc227cd0.png)
エンジニアとして生きる

この記事は [freee Engineers Advent Calendar 2016](http://qiita.com/advent-calendar/2016/freee) の 8 日目です。

こんにちは、freee 株式会社で事業開発エンジニアをしている [@takatm](https://twitter.com/takatm0103) です。
今年の 7 月から freee で働いています。
6月までは大手と呼ばれるSI会社で長らく働いておりました。

今回はそこからfreeeで働くことになったきっかけや
実際の経験について書いてみようと思います。

#さまざまな経験の中で

前職では大きな会社だったことから、時にはセールスエンジニア、最終的には海外での仕事から特許発明、サービス開発まで本当にあらゆることにチャレンジしてやらせてもらっていました。

またプライベートでは友人と[クラウド課題管理](https://www.flabtools.com/)というサービスも作っていまして、面白く感じる中で、
自分の手を動かして価値を出し続けたいという思いが強くなり
今後のエンジニアとしてのキャリアについて悩んでいました。

#生きる

そのなかで、毎年参加しているDevelopers Summitにて
[@hiragiri](http://qiita.com/hiraguri)さんの[生きる](http://event.shoeisha.jp/devsumi/20160218/session/1057/)という講演を聞くことになりました。

講演は、身を挺して限界まで、さらには限界を超えて
コミットすることで、得るものも大きいし本当の意味で
生きているという実感が得られている、といった内容でした。

迷った時は「モチベーションの源泉を探る」というお話があり、
自身の源泉となっているモチベーションはなにか？
本当にエンジニアとして毎日生きている実感があるか？を考えるきっかけになりました。

そしていまは雰囲気づくりから含めてfreeeの開発組織を作っていると聞き、
この方の元で働いてみたいと思ったのが縁あって、今に至っています。

#働いてみて違ったところ

SIな大企業とwebメインなベンチャー、とまったく正反対と言えることもあり
話す言語が違う、というのはわかっていたのですが
まさに得意とするベースドメインや重要とするポイントなど、
まさしく言葉の違いを実感しました。

これまでは全体のコンセンサスをいかにとるかが大事だったところ、
いまはミーティングやレビューなどのコンセンサスはサポート的なものでしかなく
すべて自分の責任でコード書き、サービスをリリースして
その後は運用まですべて責任をもつことがメインで、
その代わり成果もわかりやすいのかなと思っています。

#とにかく無駄がなくなった

これまでは企画から開発、プロダクトマネジメントから事業につなげていく
ところまで広くやっていました。

いまは役割がはっきりしていて、プロダクトマネージャーの方が
プロダクトのビジョンとそれを実現するための１歩まで考えてくれて、
それを形にするのがエンジニア、といった感じです。
作ってしまえばあとはマーケティング・セールスの方が責任を持って
売っていってくれるので役割がはっきりしています。

すべての成果はコードなので、プレゼンテーション資料をつくることがなくなり、
その分すべてアーキテクチャを設計して、コードにしていくことに
注力している感じです。

#チャレンジできたか

まだ半年といったところですが、バックエンドのコアエンジンから、androidのコードを書いたり、Windows、連携サービスの開発リリースなどしてきました。
いまはテストの大事さを実感して、PageObjectによるE2Eテストにも取り組んでいます。

#毎日0.1%ずつ成長する
その中で、毎日0.1%ずつだけでも成長できるようにしようと心がけています。

読んだコードを次触った時はすぐ書けるようにロジックを整理しておく、
書いたコードの技術体系を理解する、自動化、aliasなどで徹底的に効率化したりなど、
今日の自分の0.1％となるとほんの少しだけですが、
それでも1年で1.5倍、2年続ければ
100 * 1.001 ^(365 * 2) ≒ 2 と今の自分の2倍以上にも成長できることになるとかなと。

10倍の仕事量があっても、それを成長していくことで
普通にこなせるようになっていく、
いわゆるスーパーエンジニアな人との違いはそんなところに
ある気がしています。

#エンジニアとして生きる
毎日成長があり、周りにスーパーエンジニアなすごい人もたくさんいて
まだ全然底が見えない環境にもあり、
エンジニアとして生きている実感を得られています。

そんなfreeeに興味のある方は[こちら](https://jobs.freee.co.jp/)まで。

明日は、皆が怖くて慎重になるインフラにどんどん切り込んで超高速化をなしとげていく、
インフラ神[@sugitak](http://qiita.com/sugitak)さんです！
docker-composeでWordPress開発環境を疾風のように用意する

[ディップ Advent Calendar 2016 - Qiita](http://qiita.com/advent-calendar/2016/dip-dev)に書くぞ、ということで、最近のネタを。

MacBook Pro Touch Bar 15インチモデル(late 2016)を買いました。
11月27日に受け取ったばかりですが、思っていたよりも、よいかも…ʕ•ᴥ•ʔ

さてわたしは、新しいPCのセットアップが大好きです。
TimeMachineでイッパツ、とかはやらずに、開発環境を見直しつつコツコツとやっていきたい！

今回、とある事情があってWordPress環境を作ってゴリゴリやる必要が出てきました。
今まではダラダラとVirtualBox + Vagrant、ひどいときはローカルを汚しながらのらりくらりと過ごしてきましたが、そろそろちゃんとしたかったのでDockerで。

## Docker for Macをインストールする
[Get started with Docker for Mac - Docker](https://docs.docker.com/docker-for-mac/)の手順通りにインストールをします。

```
$ docker --version
Docker version 1.12.3, build 6b644ec
$ docker-compose --version
docker-compose version 1.8.1, build 878cff1
$ docker-machine --version
docker-machine version 0.8.2, build e18a919
```

バージョンはこんな感じ。	

## WordPressの環境をつくる
[Quickstart: Compose and WordPress - Docker](https://docs.docker.com/compose/wordpress/)という便利なチュートリアルがすでにあるのです。
これを元に、少しだけ変更して自分の開発環境を作りました。

ディレクトリをつくって移動する。
作成したディレクトリの中に、`docker-compose.yml`を作成する。

```
$ mkdir ~/wordpress-project
$ cd ~/wordpress-project
```

中身はこんな感じ。

```docker-compose.yml
version: '2'
services:
  db:
    image: mysql:5.7
    volumes:
      - "$PWD/.data/db:/var/lib/mysql"
    ports:
      - "3306:3306"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: wordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - "$PWD:/var/www/html"
    links:
      - db
    ports:
      - "1010:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_PASSWORD: wordpress
```

WordPressとDBを別々のコンテナとして作成しています。
ローカルで開発をしたいので、`volumes`でローカルとコンテナをマウントします。

```
{ローカル}:{コンテナ}
```

そして、ビルドします。

```
$ docker-compose up -d
```

確認すると、こんな感じ。

```
$ docker-compose ps
           Name                         Command               State           Ports
--------------------------------------------------------------------------------------------
wordpressproject_db_1          docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp
wordpressproject_wordpress_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:1010->80/tcp
```

`http://localhost:1010/`にアクセスすると、WordPressのセッティングをはじめることができました。(言語を選んだり管理ユーザを作成したり)

ʕ•ᴥ•ʔ＜めでたし！
nodeもgoも今度からはDockerで！

## よく使うコマンド
今のところよく使うコマンドたち。
エイリアスを設定すると、ʕ•ᴥ•ʔ＜らくちん！

コンテナの作成と開始。ymlファイルを書き換えたときも。

```
$ docker-compose up -d
```

コンテナの停止。

```
$ docker-compose stop
```

コンテナの開始。

```
$ docker-compose start
```

全体で立ち上がっているコンテナを見る。

```
$ docker ps -a
```

## おまけ
IntelliJでデータベースのコンテナに接続するときの設定。

ʕ•ᴥ•ʔ＜気持ちE

<img width="727" alt="intellij-db-setting.png" src="https://qiita-image-store.s3.amazonaws.com/0/41774/91068e4e-596e-2360-efb6-8d079c50cefd.png">

あ！上記の例だとUserはRootじゃないかも...失礼！ʕ•ᴥ•ʔ＜貼り替えない！
Kotlinをあえて難読化する

この記事は[Kotlin Advent Calendar2016](http://qiita.com/advent-calendar/2016/kotlin)の8日目の記事です。


難読化
---

Kotlinでは`で囲うことで半角スペースなどの特殊文字を名前に含めることができます。
残念ながらAndroidプロジェクトではエラーになり使用できませんが、テストメソッド名などでは重宝するでしょう。

```kotlin
@Test fun `4 + 2 = 6`() {
  assertEquals(6, 4 + 2)
}
```

変数名、関数名、パラメーター名に使用できます。

```kotlin
val `f o o` = 1
fun `b a r`(`b a z`: Int) {}
```

半角スペースのみの命名も可能です。

```kotlin
val ` ` = 1
```

`infix` にも使用できるので、以下のような難読コードを書くこともできます。

```kotlin
class ExampleUnitTest {
    val Int.` `: Int get() = this + 1
    infix fun Int.` `(` `: Int) = this + ` `
    @Test fun ` `() {
        val ` ` = 1
        assertEquals(3, ` `.` ` ` ` ` `)
    }
}
```
OpenTypeの仕様入門 (後編)

# OpenTypeレイアウトテーブル
これは文字を適切なものに置き換えたり、正しい位置に配置したりといったTypographyの情報を含むテーブル群を指します。
これには5つのテーブルがあります。
これらのテーブルはOpenTypeフォントではOptionalなデータですが、日本語フォントの場合には縦書きグリフを用意する都合上、`GSUB`テーブルが備わっていることがほとんどです。

- `GSUB`
    - 下記で詳しく説明します。
- `GPOS`
    - 下記で詳しく説明します。
- `BASE`: ベースラインに関する情報です
    - ベースライン……ムズカシイ。
- `JSTF`: 文字間隔を広げたり狭めたりするときの情報です
    - 見たことありませんね。
- `GDEF`: グリフが通常の文字かマークかリガチャか部品かといった情報です
    - マークを配置する基準位置の情報
    - リガチャの中でキャレットをどこに表示するべきかという情報

## `GSUB`と`GPOS`に共通のデータ構造
OpenTypeレイアウトで中心的な役割を果たす`GSUB`テーブルと`GPOS`テーブルは共通したデータ構造を持っている。
それが以下のような、Script／Feature／Lookupのリストである。

- Script List（文字体系）
    - Language Systems（言語体系）
        - ここで適用される下記FeatureのIDs
        - どのScriptのどのLanguageを使うかによって適用される機能が変わってくる
- Feature List（機能リスト）
    - `vert`や`liga`といったタグがつく
    - ここで適用される下記LookupのIDs
- Lookup List（実際の情報）
    - 適用するべきグリフ置換やグリフ移動の情報
    - それぞれのテーブルごとに中身は違う

実際のグリフの置換や移動を行うための情報は各Lookupにあります。
このほかに、最近OpenType 1.8で導入されたバリアブルフォント（Variable Fonts）用の情報もあるが、今回はスキップする。

文字列描画系では、まず適切なScriptとLanguageを選択します（存在しない場合はデフォルトのものを選択）。
次にそのScriptとLanguageに対するFeature Listから、現在描画するテキストに適用するべきFeatureを選び出します。
そこで得られたLookup Listを適用して文字列を描画します。

## `GSUB`テーブル
`GSUB`テーブルをGID列に適用すると、描画されるべきGID列を得ることができます。
横書きの日本語ではGIDの置換が必要になることは少ないのですが、縦書きではこの処理が必須になります。
つまり、「っ」「ー」「㌍」といったグリフは縦書き用のものに変えないといけません。

例えば、「。→︒」「、→︑」というように異なるグリフを使う必要があります。
（ここではUnicodeのVertical Formsというコードブロックの文字を表示させています）

こうした縦書きグリフへの変換を行うのが、

- `vert`
- `vrt2`
- `vtrt`

といったタグを持つFeatureです。
縦書き字形への変換は基本的にひとつのGIDからひとつのGIDへの単純なマップになっています。

もちろんGSUBにはこうした単純な変換だけではなく、

- 複数のGIDをひとつのGIDに集約したり
    - 例えばfiがﬁのように1文字になる
        - fi: fとiを並べたもの
        - ﬁ: fとiが一緒になった文字
    - このようなことがコードポイントの世界ではなく、グリフ描画の世界で行われる
- 前後の文字（GID）に応じてGIDを変換したり
- 特定の文字列（GID列）を別のGID列に変換したり

といったことができます。

## `GPOS`テーブル
こちらは与えられたGID列がどのように配置されていくべきかといったことを教えてくれます。

これは例えば、

- 「か」と濁点「゙」の配置
- アルファベットの文字間隔の調整

といったことに使われます。
こちらも前後の文字に応じて適用したり、特定の文字列でのみ適用したりといったことが可能です。

# `morx`テーブル
Apple由来のフォントで使用されています。
これは`GSUB`テーブルと`GPOS`テーブルの機能を持つAppleの闇の技術です。
私は2度ほど仕様を読んだのですが、まだ正確に理解できていません。
（ドキュメントというより実装が少なくて正しさを把握できない）

# おわりに
3日に渡ってお届けしたOpenType仕様入門ですが、実際のデータがどういうものになっているのかというよりは、どういうデータがどういう目的でフォントに含まれているかということを書いてみた感じになりました。
フォントを理解するというよりはむしろ、フォントってこんなこともやってるのか、と面白く読んでもらえると良いのですが、推敲する時間もなかったのでなかなか難しい気がします。

OpenType仕様（実践編）は要望があれば書きます。
Phoenixについて勉強した #1


Phoenix本を買ったのでまとめつつ読んでいく。

Phoenixは、生産性が高く、処理速度も圧倒的に速いフレームワークである。また、コードが美しい。

### 単純な関数

PhoenixはElixirで動く。Elixirには、次のような関数がある。

```
def inc(x), do: x + 1
def dec(x), do: x - 1
```

次のようにチェインさせて呼び出すことができる。

```
2 |> inc |> inc |> dec
```

``|>``（パイプ演算子）は左辺の値を第一引数として右辺の関数に渡す。このような構成をパイプ、またはパイプラインと呼ぶ。このとき呼び出される各関数をセグメント、またはパイプセグメントと呼ぶ。

パイプラインもまた関数なので、パイプラインのパイプラインを作ることもできる。Phoenixのプログラムはパイプを使うと次のように表現できる。

```
connection |> phoenix
```

Phoenixでは、connectionがユーザーのリクエストに関する全ての情報を含んでいる構造体である。そしてPhoenixの各層がconnectionに対して変化を加えていく。Phoenixが終了するときにはconnectionはresponseを保持している。

#### Phoenixの層

Phoenixを簡単化して、あるHTTPのリクエストをどのように処理するか見てみよう。

```
connection
|> endpoint
|> router
|> pipelines
|> controller
```

各リクエストはまずendpointへ届く。そして次にrouterへと行き、適切なcontrollerに導く。controllerの前に、いくつかのpipelinesを通過する。いくつかはブラウザのリクエストに対するもので、いくつかはJSONのリクエストによるパイプラインである。

#### コントローラの内部での処理

PhoenixはModel-View-Controller(MVC)パターンで実装される。モデルはデータへアクセスし、ビューはデータを表示する。そしてコントローラはその中間に位置していて、次のようなパイプラインになっている。

```
connection
|> controller
|> common_services
|> action
```

controllerでcommon_servicesが呼び出されている。Phoenixにおいてこれらのcommon_servicesはPlugによって定義されている。いったん、PlugはWebアプリやライブラリを簡単に構築するためのものだと思ってもらって良い。

actionsには他のWebサイトへのアクセスから、ユーザーの認証まで、様々な種類のものがある。多くの場合はactionsはデータベースにアクセスし、ビューを描画する。例えばユーザーを表示するactionは次のようなものになる。

```
connection
|> find_user
|> view
|> template
```

### 最初のプロジェクトの作成

Phoenixのインストールはここでは扱わないが、インストールを終えたら、Hello Worldに相当するプロジェクトを作ってみよう。mixコマンドを使う。

```
mix phoenix.new hello
cd hello
mix ecto.create
mix phoenix.server
```

localhost:4000にアクセスするとページが表示される。

### 機能の追加

特定のURLを叩いたらある文字列が表示されるように機能を追加していこう。まずは特定のURLに対してリクエストが届いたら、望ましい処理が行えるようにマッピングをしたい。これには、``web/router.ex``を編集する。

```
scope "/", Hello do
  pipe_through :browser
  get "/hello", HelloController, :world
  get "/", PageController, :index
end
```

追加した行によって、"/hello"から始まるURLへのリクエストがHelloControllerの:world関数によって処理されるようにマッピングされる。

ではそのHelloControllerを作成しよう。

```
defmodule Hello.HelloController do
  use Hello.Web, :controller
  
  def world(conn, _params) do
    render conn, "world.html"
  end
end
```

``use Hello.Web, :controller``によってPhoenixのController APIが使えるようになる。ここではviewを描画しようとしている。続いてviewを作成しよう。

```
defmodule Hello.HelloView do
  use Hello.Web, :view
end
```

同じくworld.htmlテンプレートが必要だ。

```
<h1>From template: Hello world!</h1>
```

これでlocalhost:4000/helloにアクセスした際にHello worldが表示されるようになった。暗黙的に``web/views/layout_view.ex``のビューと``web/templates/layout/app.html.eex``が使われていることに注意してほしい。

---

（#2に続く）
フォルダ内のファイルをランダムに10個コピーする

#動機

ファイル数が膨大なフォルダ内から10個ランダムにサンプリングして取得しようと思った．

#環境

cygwin

#コマンド

find ./target/ | grep txt | sort -R | tail -n 10 | xargs -n 1 sh -c 'cp -v $0 ./temp/'

#解説

- find ./target/
    - ./target/フォルダ以下にあるファイル・フォルダをすべて列挙する
- grep txt
    - 文字列の列からtxtが入った文字列のみ表示
- sort -R 
    - 文字列の列をランダムに並び替え表示する
- tail -n 10
    - 文字列の列から先頭10個を取得
- xargs -n 1 sh -c 'cp -v $0 ./temp/'
    - 文字列の列から文字列一つずつ取ってきて\$0に置き換えて，'cp -v $0 ./temp/'を実行する．

#感想
できました．
Sparkジョブ実行時にクラスローダーのトレースを有効にする

[Distributed computing (Apache Hadoop, Spark, ...) Advent Calendar 2016](http://qiita.com/advent-calendar/2016/distributed-computing)の七日目です。

障害のトラブルシューティングをしていると、「このプログラム、なんか変なライブラリ呼んでるんちゃうか」、と疑いをもつことがあります。たとえば、Sparkにおいてはドライバやエグゼキューターが変なクラスをロードして挙動がおかしくなっているようなケースです。

そんなときは、実行時に下記オプションを渡してあげましょう。

```
--conf "spark.executor.extraJavaOptions=-verbose:class" \
--conf "spark.driver.extraJavaOptions=-verbose:class"
```

すると、標準出力にクラスローダーのトレースが書き出されます。```spark.driver.extraJavaOptions```は、クライアントモードで実行すればクライアントコンソールに、YARNのクラスタモードで実行すればApplicationMasterの標準出力が書き出し先となります。下記は、エグゼキューターの標準出力ログの一例です。

```
Log Type: stdout
Log Upload Time: Wed Dec 07 06:27:40 -0800 2016
Log Length: 1514211
[Opened /usr/java/jdk1.8.0_60/jre/lib/rt.jar]
[Loaded java.lang.Object from /usr/java/jdk1.8.0_60/jre/lib/rt.jar]
[Loaded java.io.Serializable from /usr/java/jdk1.8.0_60/jre/lib/rt.jar]
[Loaded java.lang.Comparable from /usr/java/jdk1.8.0_60/jre/lib/rt.jar]
[Loaded java.lang.CharSequence from /usr/java/jdk1.8.0_60/jre/lib/rt.jar]
[Loaded java.lang.String from /usr/java/jdk1.8.0_60/jre/lib/rt.jar]
...
```

普段はまず（そして願わくば）使うことのないであろう機能の紹介でした。

参考
Apache Spark 1.6の公式設定ドキュメント
https://spark.apache.org/docs/1.6.1/configuration.html
Apache Spark 最新版の公式設定ドキュメント
http://spark.apache.org/docs/latest/configuration.html
SparkをYARN上で動かす際に参考にするClouderaのドキュメント
http://www.cloudera.com/documentation/enterprise/latest/topics/cdh_ig_running_spark_on_yarn.html
macOS Sierraでアイコンを作成

#Xcode8ではIcon Composerが廃止されたらしいよ
macOS SierraでXcode7.2のGraphic ToolsにあるIcon ComposerはSierraでは使えない。
んじゃってんで
https://developer.apple.com/download/more/
ここにAddtional Tools for Xcode 8.2というのがあるんだけど、
These tools include:Icon Composerって書いてあるのに、
ダウンロードしてみるとIcon Composerが何処にもない。

#なぜか
https://forums.developer.apple.com/thread/65215
"Icon Composer was apparently deprecated because it was unable to deal with 1024x1024 icons needed for Mac Retina resolution. Instead, Apple recommends using icon sets - see: "

Icon Composerでは512x512までのアイコンしか作成できない。
Appleでは1024x1024のRetina対応のアイコンを作るにはiconutilコマンドをたたけという。

#やりかたはこちら
こちらに詳しく書いてあるし、シェルスクリプトを書いた人もおられる。
http://qiita.com/Jacminik/items/a4c8fe20a4cba62f428b

#気をつけること
元となるpngにアルファチャンネルが含まれている必要があります。
iconutilコマンドで
「Unsuported image format」と出る場合
pngファイルを右クリックして「情報を見る」で
「アルファチャンネル」の項目が無い可能性があります。
「アルファチャンネル：はい」になっていないと正しく変換されません。
↓こちらが詳しい。
https://notes.underscorediscovery.com/el-capitan-iconutil-unsuported-image-format/
Swiftの配列操作(map,reduce,filter)

今回ご紹介するのは、配列操作のメソッドについてです。
今更感はありますが、お付き合いください。

##map
配列の全ての要素に対して、順に処理を行い新しい配列として返します。
※$0の引数には配列の要素が入ります。

```
 let list = [1, 2, 3, 4, 5]

 let result = list.map({ $0 * 2 })

 print(result) // [2, 4, 6, 8, 10]
 
```

##reduce
配列の要素の集計を行いたい時に使用します
クロージャには合計式を書き、第一引数に初期値をいれます。

```
let list = [1, 2, 3, 4, 5]

let total1 = list.reduce(0){ $0 + $1 }
let total2 = list.reduce(1, combine: { $0 * $1 })

print(total1) // 15
print(total2) // 120

```

##filter
配列をクロージャ部分の条件によってフィルタリングし、新しい配列として返します。

```
let list = [1, 2, 3, 4, 5]

let result = list.filter({ $0 % 2 == 0 })

print(result) // [2,4]

```

条件をメソッドに分けてフィルタリングすることもできます。

```
func calc(x: Int) -> Bool {
    if x % 2 == 0 {
        return true
    } else {
        return false
    }
}

let list = [1, 2, 3, 4, 5]

let result = list.filter({ calc($0) })

print(result) // [2,4]

```



ざっと簡潔に書きましたが、使いこなせるとより良いコードが掛けそうですね。
Unityでポリゴンの直線を引く

# 前置き

直線を普通に引きたい場合は[LineRenderer](https://docs.unity3d.com/ja/current/Manual/class-LineRenderer.html)を使えば良い.
勉強のために、自分でMeshを作り直線をポリゴンで引いてみた.
(GL_LINEで引く方法もあるけれど、今回はあくまでポリゴンで)

# 線分とポリゴン

![split_small.png](https://qiita-image-store.s3.amazonaws.com/0/15000/a8a5d70a-69b4-ca5f-a40a-65dfa24721bb.png)

１つの線分は、上記のような感じで2つのポリゴンを描けば良い.
Meshは各頂点(verticies)とポリゴン描画時の頂点順序(triangles)を指定することで生成できる.

```csharp
Vector3[] verts; // ポリゴンの頂点を入れる
int[] triangles; // 三角形を描く際に、頂点の描画順を指定する

Mesh mesh = new Mesh();
mesh.vertices = verts
mesh.triangles = triangles;
mesh.RecalculateBounds();
mesh.RecalculateNormals();
```

Meshさえできてしまえば、MeshFilterとMeshRendererを設定することでポリゴンの描画ができる.

```csharp
Material material; // 直線描画用のマテリアル
Mesh mesh; // 生成できたMesh

var _object = new GameObject("PolygonLine");
var meshFilter = _object.AddComponent<MeshFilter>();
var meshRenderer = _object.AddComponent<MeshRenderer>();

meshFilter.sharedMesh = mesh;
meshRenderer.material = material;
```

# ポリゴンと頂点順序

![triangle_small.png](https://qiita-image-store.s3.amazonaws.com/0/15000/806f09ca-2a54-1f5a-4d6b-763b11a2dbf2.png)

ポリゴンを描画する際に頂点順序を指定する必要がある.
x-z 平面で頂点順序を指定する場合,
時計回りだと、表向きになる. (index: 0 -> 1 -> 2)
逆向きだと、裏向きになる. (index: 2 -> 1 -> 0)

線分を書く際には、この頂点の指定順序をきっちり設定する必要がある.

![line_order_small.png](https://qiita-image-store.s3.amazonaws.com/0/15000/4470489a-cdd3-fec5-be7e-cb9b7af190bc.png)

上記のような線分であれば、頂点indexの順序は以下のような感じ.

```csharp
int[] triangles = new [] { 0,1,2, 2,1,3 };
```

# 連続する線分の描画

連続する線分を綺麗に描画するには,各頂点を線分の太さの半分だけ上下にずらした点を作るだけでなく、中点の位置をきちんと計算する必要がある.

![line_divide_small.png](https://qiita-image-store.s3.amazonaws.com/0/15000/9e79d5fc-8d71-7e0e-5ba1-98980af9ef78.png)![line_polygon_small.png](https://qiita-image-store.s3.amazonaws.com/0/15000/07a0db77-a1eb-0998-0375-1e8f5238d58c.png)

中点の計算は説明省略, 普通に中学数学で交点を求めればいい.

# 実行例

実際に[プログラムを組んで](https://github.com/mattak/LineSample)実行してみた.
中点が綺麗に描画できている

<img width="320" alt="smile.png" src="https://qiita-image-store.s3.amazonaws.com/0/15000/3c4e8f51-b971-7f01-58c7-686d70684a4d.png">

上記で説明した実装の詳細は以下のような感じ.

- https://github.com/mattak/LineSample/blob/master/Assets/LinePolygon.cs
GoogleAppScriptでGoogleAnalyticsの訪問数/PV数を取得自動化

この記事は[Speee Advent Calendar 2016](http://qiita.com/advent-calendar/2016/speee) の7日目の記事です。

前日の記事は
@iida-hayatoの[Testable Swift、あるいは僕らがテストを書かない理由 - Qiita](http://qiita.com/iida-hayato/items/c0009ce0bd1a3bd15956)

です。

ディレクターの[@cultiva](https://github.com/cultiva)です。
普段の仕事では海外向けのサービスのプロダクトマネジメントをしています。

## 経緯と概要
僕達のチームでは毎週月曜日に訪問数とPVを報告しています。
そのためのデータを毎回GoogleAnalyticsの画面から手動でダウンロードするのが面倒なので、
GoogleSpreadSheetとGoogleAppScriptを用いて自動化しました。

## 事前準備
- GoogleSpreadsheetのスクリプトエディターを展開
ツール>スクリプトエディター>新しいプロジェクトを作成  

- Googleアナリティクスからの連携承認
リソース＞GoogleAPIを使用」からGoogle Analytics APIを有効
Google APIs ConsoleでGoogle Analytics APIを [ON] に設定
ツール>スクリプトギャラリー>Google Analytics Data Fetch Functionsをインストールして連携承認

- ビュー（プロファイル）IDの確認
「アナリティクス管理画面＞アナリティクス設定＞ビュー設定」から確認可能な8桁の数字  

## GoogleAppScriptのコード
下記の通り。
（参考URLを少し改変しただけですが。。。）

```
//スプレッドシート立ち上げ時に自動的に"処理メニュー"を追加
function onOpen(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menu = [
    {name: "週次処理", functionName: "runDemo"}
    ];
  ss.addMenu("処理メニュー", menu);
}

//GoogleAnalyticsからデータ取得

function runDemo() {
  var profileId = 'secret';           //ビューID
  var tableId = 'ga:' + profileId;
  var startDate = getLastNdays(7);   // 1週間前（7日間）
  var endDate = getLastNdays(1);
   
  var optArgs = {
    'dimensions': 'ga:date',
  };
   
  var results = Analytics.Data.Ga.get(
      tableId,                  // Table id (format ga:xxxxxx).
      startDate,                // Start-date (format yyyy-MM-dd).
      endDate,                  // End-date (format yyyy-MM-dd).
      'ga:visits,ga:pageviews', // Comma seperated list of metrics.
      optArgs);
 
  outputToSpreadsheet(results);
}
 
function getLastNdays(nDaysAgo) {
  var today = new Date();
  var before = new Date();
  before.setDate(today.getDate() - nDaysAgo);
  return Utilities.formatDate(before, 'GMT', 'yyyy-MM-dd');
}
 
//スプレッドシートへの出力
function outputToSpreadsheet(results) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  
  // ヘッダー出力
  var headerNames = [];
  for (var i = 0, header; header = results.getColumnHeaders()[i]; ++i) {
    headerNames.push(header.getName());
  }
  sheet.getRange(1, 1, 1, headerNames.length)
      .setValues([headerNames]);
  
  // データの各行を出力
  sheet.getRange(2, 1, results.getRows().length, headerNames.length)
      .setValues(results.getRows());
}
```
## トリガーの設定
この設定でスプレッドシート起動時に
上記のコードを実行し、
直近1週間のデータを取得を行います。

![trigger.PNG](https://speee.qiita.com/files/32504d06-799b-30dd-dc0e-c2414e8acc96.png)

## 結果
![u30adu30e3u30d7u30c1u30e3.png](https://qiita-image-store.s3.amazonaws.com/0/85902/2fe67716-26e9-8a4b-652f-997762b03648.png)
→後はコピーして、別のExcelのフォーマットにデータを貼り付けすれば完成。

## その他
トリガーは毎週月曜日の朝に時限作動する仕組みにしてもよかったのですが、
そうするとなぜかうまくいかなかったので、やめました。
（getActiveSpreadsheet()とgetActiveSheet()が上手く動作しないから？）

仮に時限作動だとしても、データの確認のために結局spreadsheetを一度開かないといけないので、
それならばspreadsheet起動時にプログラムを実行するのでもいい、との判断で
起動時に実行させることにしました。

## 参考URL
http://www.find-job.net/startup/ga_spreadsheet_auto
写真、動画ファイル名を撮影日時に変換するシェルスクリプト

初Qiita投稿。昔作ったモノでも晒しておく。

デジカメで写真撮影すると、IMG_0010.JPGのようなイミフなファイルができます。
IMG_0010.JPGとか、ファイル名だけだといつ撮影したものなのか分かりません。

そこで、写真ファイル名を撮影日時のものに変換するシェルスクリプトを作成しました。
[converttodate.sh](https://github.com/Maeno/shellscript-examples/blob/master/filename_converter/converttodate.sh "converttodate.sh")
(※ 要brew install exitfool)
IMG_0010.JPGを2013_01_27--16_11_32.jpgのように変換します。変換後のファイル名フォーマットはyyyy_mm_dd--hh_mm_ss.jpgです。

これからQiita使って情報発信していきますので、よろしくお願いします。
Rails Girls NAGOYA 3rdのオーガナイザーをやった

Rails Girls Japan Advent Calendar 2016 の７日目の記事です。
前の記事は 5日目:spring_aki さんの[みんなで記者会見(自己紹介ワークショップ)](https://springaki.github.io/blog/2016/12/04/press-interview-workshop/)でした。

こんばんは！

初めてQiitaに投稿するのに何がいいかな…と考えて、
もう１ヶ月以上も前の話になってしまいますが、Rails Girls NAGOYA 3rdのオーガナイザーをやって思ったことを書こうと思います。

#####と、その前に
少し自己紹介ときっかけ。
普段は普通の会社員として、暮らしています。事務職です。
仕事ではエクセルを使う業務が大半で、VBAでバンバン何か作るとかもあまりしていないです。
（自分で完結する業務に少しVBAを組込むとか、ほんとにそれぐらいです。）

私が、初めてRails Girls のことを知ったのは、２日に投稿されているkatorieさんのツイートとブログがきっかけでした。
その時は「さすが東京！いろんなイベントがあるんだな〜」と眺めていたのですが、その次の年に入って、なんと名古屋での開催がシャウトされたのです。
すぐに申し込み、参加、その後のmore！にも参加し、あれれ？と言う間に3rdのオーガナイザーをyadaitaさんと一緒にやることを決めました。

私は他のオーガナイザーさんたちに比べると、「え、なんでやってるんですか？」と言われそうなぐらい、RubyのこともRailsのこともわかっていないのですが。

#####そんな私だから思う、Rails Girls のすごさ
**１．Rubyist のみなさんがほんとにすごい**（ざっくり）
ざっくりしすぎていてごめんなさい。でもほんとにすごいんです。知識はもちろんのこと、そのフットワークの軽さ、誰かが「私もやりたい！」と声をあげれば「コーチにいくよ！」とすぐ言ってもらえる。本当に熱心に親切に親身になって教えてくれる。
こんな素敵な人たちがたくさんいるコミュニティを私は他に知りません。yadaitaさんとよく話しているのですが、全国各地のコーチのみなさんに力になっていただいているので、どこにも足を向けて寝られない！

**２．なんだか居心地がいい**
１st参加後の私は、がっつりプログラミングをしているわけではないのですが、moreに参加しています。もちろん、作りたいものがあれば全力で一緒にやってもらったり、自分の仕事のこと（エクセル）の相談にのってもらったり。
会社と自宅以外に、もう1つの場所ができたようですごく嬉しかったです。家族、友人、会社以外の世界で、未経験者の私も受け入れてくれる。そんなRubyistのみなさんが（１に戻る）。感謝以外の言葉がありません。

**３．どんどん広がっていく！**
最初、girlsで参加した方がコーチ/オーガナイザーになったり、「地元でも開催したい！」と参加されるgirlsの多さ！そしてその輪がどんどんどんどん広がっていく…こんな場所や人たちが集まっているところを私は他に知りません。（２回目！）
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿

イベントを終えて、改めてコーチ、スタッフ、スポンサーの皆様への感謝と、
４回目５回目と名古屋でのイベントが続くように、私ももっとがんばらなくては。と気持ちを新たにしました。

以上、技術的な話は何もありませんが、私のRails Girls Japan Advent Calendar 2016とさせていただきます。
各種Javaのversion対応状況

#JavaのFwやTool等のversion対応状況

|Fw |Fw Tool version |Java version |備考 |
|---|----------------|-------------|---|
|Akka|2.4.14|8+|並列/分散処理Fw<br>Scala 2.11, 2.12も必要|
|clojure|1.8.0|6+|JVM上のLisp|
|Hadoop|3.0.0|8 (推奨)|2.7まではJava7<br>3.0よりJava8推奨|
|PlayFramework|2.5.10|8+|Web App Fw|
|Scala|2.12.1|8|JVM上の関数型オブジェクト指向言語|
|Spring|4.3.4|6+|Web App Fw|
|Tomcat|9.0.0|8+|App Server|
CentOS7で無料SSL証明書 Let's Encrypt メールサーバ編

前項　CentOS7で無料SSL証明書 Let's Encrypt
http://qiita.com/sin_w/items/931d0ce08c2e275ef650
でwebサービスに証明書を設定しましたが、ついでにメールサーバ機能へも組み込んでみます。

前提条件として
webサーバとmailサーバがおなじホストで動いていること
smtpはpostfix
pop3、imapサーバとしてdovecot
を使用し、オレオレ証明書を使って既に環境は構築済みで動作中とします。

postfixは
smtpd_tls_cert_file
smtpd_tls_key_file
をLet's Encryptで取得した鍵に置き換えます。

```/etc/postfix/main.cf

smtpd_tls_cert_file = /etc/letsencrypt/live/www.hoge.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/www.hoge.com/privkey.pem

```

postfixを再起動します。
systemctl restart postfix

dovecotは
ssl_cert
ssl_key

をLet's Encryptで取得した鍵に置き換えます。

```/etc/dovecot/conf.d/10-ssl.conf

ssl_cert = </etc/letsencrypt/live/www.hoge.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/www.hoge.com/privkey.pem

```

dovecotを再起動します。
systemctl restart dovecot
HPC依存の悪循環: HPCは今…

# HPC依存の悪循環

## 第一段階
かつて、前職にいたとき、「○○依存の悪循環」というコラ画像が投稿されていた時期に悪ノリで作成したものです。正確な日程を覚えておりませんが、2014年の1月くらいに作成したはずです。
![12096441_915610731807542_4440237118858613445_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/147319/f723903c-2c09-faad-8948-01ffc4ebb574.jpeg)

1: 「大規模計算もできるようになるよ」と、HPC業界の悪い人(Tとしておきます)が、計算を必要な善良な人(A先生としておきましょう)にHPC導入をそそのかします。
2: A先生も最初は研究に使える予算も少ないため、1ノード(おそらくタワー型ワークステーションか、2Uサーバー)からの導入を検討してしまいます。
3: A先生の研究が進み、卒論や修論の発表間近になり、所属している学生さんが計算機をよく使うようになります。そこで計算量が足りなくなります。
4: 大規模計算を検討しているはずのA先生は、この研究室の有様を見てノード数不足を訴えます。学会発表のために自分の計算もしたいのにできない！イライラしながら「早く計算したい！」「苦しい」とA先生は訴えます。
5: Tによるそそのかしを思い出したか、A先生が申請していた科研費が使えるようになり、Tの所属する会社から計算ノードを購入し、増設していきます。耐性ができて次第に計算ノードが増え、やがてはクラスターとなりノード間並列処理もできるようになって一時的にA先生の欲求は満たされます。
6: でも、A先生の研究室で研究成果が出るようになり、いくら増設しても計算機資源が足りない状況が続くようになり、Tのそそのかしのせいで、いつのまにか42Uラック何本分の大規模なクラスターになってしまいました。(実際、そこまで大げさにはならないでしょうが…)

あえて細かいことはふれなかったのですが、架空である理論系の研究室で起こっている出来事を紹介しました。(あくまでもフィクション。フィクションです。)

## 今年1月に思い出したあと
筆者を取り巻くHPC業界の動向も少しずつ変わり、ノード間通信としてInfiniBandなどの高速通信が普及するようになったり、プロセッサーだけではなく、GPGPUやXeon Phiなどのアクセラレーターが身近になったこと。そして、HPCの世界でもクラウドコンピューティングの需要が出てくるようになりました。思い出したかのようにFacebookに投稿した結果、

https://www.facebook.com/photo.php?fbid=915610731807542&set=a.258463924188896.55589.100000758704301&type=3&theater

当然のことながら、多数の愛のあるツッコミが入ってきました。投稿とコメントをご覧ください。

## 最近の動向

クラウドコンピューティングを利用して、必要な一定期間だけサーバー貸しをして大規模計算ができるようになってきましたが、あくまでもOSをインストールしたサーバー(インスタンスと呼ばれることが多いです)を貸すだけであって、プログラムを動かす環境にはなっていません。

そこで、プログラムを動かす環境を構築していく作業が必要となります。この作業は、ワークステーションやラックマウントサーバーを販売している(Tの所属する)今のHPC業界であっても必要なことですが、その経験を活かして、クラウドコンピューティングに応用しているといっても良いでしょう。

サーバー貸しだけではなく、SaaS (Software as a Service)といった、必要な機能を必要な分だけサービスとして利用できるようにしたサービスも生まれてきています。そうなりますと、画面の向こう側に構えている膨大な規模の計算機の存在をあまり考えずに研究や開発に打ち込めるようになるはずです。

そのときはまた、別のHPC依存の悪循環を考えましょう。
仕事の効率化について

社内で仕事の効率化についてプレゼンした内容のメモ

# 効率化 IS 何
突然ですが、仕事を効率化しよう！となったとき、何をしていますか？

効率化というと1つの作業時間を短縮しようとを考えがちですよね
よーしExcelマクロ作っちゃうぞーとか、きれいなマニュアル作っちゃうぞーとか…
ただ、それで「業務効率化＝時間の短縮」ができているかというと、
そういう意味では大きな効果が出ない場合もあります。

ではこういう考え方はどうでしょう

# 効率化＝PDCA早く回すこと
はい、みんな大好きPDCAです。
PDCAの回転率をあげることで、効率的に仕事をこなせるというわけです。

今回はPDCAそれぞれにテーマを持ち、
私が普段意識していることを紹介します。

* Plan：未来の自分に苦労を掛けるな
* Do：何も考えずに手を動かせ
* Check：同じ過ちを犯すな
* Action：発信しよう


#Plan：未来の自分に苦労を掛けるな
セルフマネジメントしよう！というおはなしです。
ポイントは以下の3点あります。
* 自分の負荷・予定を把握する
* 正確に見積もる
* 負荷調整する

## 自分の負荷・予定を把握する
わかっていても難しいタスク管理。工夫しないとできないです。

* 与えられた仕事をちゃんと記録する
* 優先度をつけて仕事に取り組む
* 進捗・納期を定期的に確認する

私は自作のタスク管理ツール＋メールでタスク管理しています

## 見積を正確にする
作業見積が正しくできないと予定が組めません。

* 細かい単位で作業項目を洗い出す（自分で予定時間が見積もれるレベルにする）
* 実際にかかった時間を計測しておき、今後に活かす

こういう作業をやっておくことで、より見積が正確になります

## 負荷調整する
弊社は抱え込み体質の若い人が多いのですが、自分から言わないと負荷調整してもらえません。

* 抱え込まない
* ちょっときついくらいでも報告する（できないとは言っていない）
* 気にせず頼る
* 相手が動いてくれないときは、自分の上司や相手の上司を巻き込む（ちくる）

プロジェクトに対して責任が発生するのは、あくまで上司やマネージャーです。
自分が背負ってた結果できませんでした、でお客さんに謝るのは誰でしょうか。

無理なものは無理と言わないと誰も守ってくれません。
病んで一番損するのは自分です。

報告したところで誰も助けてくれないのであれば…
逃げたほうがいいかもしれません。。

# Do：何も考えずに手を動かせ
いわゆる悩む時間というのははっきり言って無駄です。
ポイントは以下の2点あります
* 作業をパターン化する
* 手を動かす

## 作業をパターン化する
よく行う作業はメモレベルでもマニュアルを作っておくのが良いです
考えずに手を動かせると効率化できますよね

## 手を動かす
何かに悩んだら、ひとりで悩まないで手を動かしましょう
* とりあえず調べてみる
* 試しに入り口だけでもやってみる
* 有識者に聞く

うちは社内SNSを導入しているので、そこで質問を投げると誰かしら助けてくれます。
勇気をもって投げましょう

# Check：同じ過ちを犯すな
諸悪の根源は何だったのか、ちゃんと原因追求しましょう

設計段階やテストで漏れがあり、障害や遅延が発生してしまった…などというとき、
単なる「漏れ」で終わらせてはいけません。

* 今後気を付けるべきポイント
* はまりポイント

を把握して今後に活かしましょう

# Action：発信しよう
Checkで気づいた知見は、積極的に発信すべきです。
（社外秘をQiitaで発信するとかはだめだけど）

* 今後に活かせる形で資料を残して展開
* はまり事例を社内で共有して被害者を減らす

ここでも、恥ずかしがらないことが大切です。

例えば他の人の失敗事例って貴重ですし、知りたいですよね？
ならまずは自分が第一発信者になりましょう！
そうしたら他の人も発信してくれるはずです。たぶん。
環境とか空気を作るって、大事です。

# まとめ
長くなりましたが、私が普段意識していることをまとめてみました。
当たり前のことが多いですが、全部やろうとすると意外と大変です。
まずは意識から初めてみましょう。
【就活】【転職】上場企業から社員5名のどスタートアップに入った理由とか入ってからの事とか

# 技術内容少なめです…

## 前の会社ではどんなことをしていたのか？
前の会社では元々、自社サービスをRailsで作られておりその自社サービスの新規機能の追加であったり、
ネイティブでは自社で初となるiOSアプリの開発やそのアプリのグロースハックなどをやっていました。
キーワードを上げるといかのような感じです。(雑多ですみません。。。)

- Ruby on Rails 2.2.2-4.2.5 
- Ruby 1.8.5 - 2.1.8 
- Nginx 
- Unicorn
- Redis
- MySQL
- Swift 1.x - Swift 2.2 
- Git
- Github
- Hip Chat
- Slack

## なぜ転職したのか

エンジニアとして自分で手を動かし、自分で企画をしながらアプリ開発や新規機能の開発が出来、裁量などもある状態でやらせて貰えていたのは本当にありがたかったのですが
以下の理由で転職をしようと思いました。

### 頼られたい

30歳にもなる良い大人がお子ちゃまのような理由ですが僕はエンジニアとしてもっと頼られたい、
あなたがいないとにっちもさっちもいかないと言われるぐらいの状態(会社としてはそれってどうなのというのは一旦、置いといて)で仕事をしたことが無かったので、
もっと周りや色んな人に頼られるような状態で働いてみたいと思いました。

### 今後のキャリアは「Mobile(スマホ)」をメインにしていきたい

もともとRailsがWeb系でのキャリアのスタートになったのですがSwiftという言語や
iOSのアプリ開発が楽しく、またAndroidでKotlinが出たタイミングで
iOSだけでなくAndroid開発も出来るエンジニアになりたいと思いました。

### 少人数のチームで働く方が性に合ってる

幾つか転職した経験で分かったことは自分が大企業の安心、安全が揃ってる大企業よりも、
いつ潰れるか分からないながらもお互いのことを話し合い、すぐに議論が出来る少人数制のチームの方が性に合ってるということに気づきました。

### 年齢的に無理出来るタイミングが今しかない

僕も30歳になってこれから体力がどんどん無くなって徹夜が出来ない、体に無理が出来ない年齢になってくる中でスタートアップというどベンチャーの会社でバリバリ働くことが出来るタイミングは今逃してしまうとこれからのキャリアの中でスタートアップで働くという選択肢を削ってしまうことになりかねないなーと考えていた。


ずらずらっと並べましたが
上記のような理由から転職を決めました。

## 転職中にやったこと

転職中は特に変わったことはしておらず、

 - 転職エージェントに登録して情報収集
 - Wantedlyで良さそうなスタートアップを探す
 - 会社を絞らず時間を作ってその会社の中の人と話す。ご飯食べに行く。

ということを粛々とやって約1ヶ月程度で

**社員が5名ほどしかいない、創業2年程度のどスタートアップ**

に内定が貰えました。
(資金調達済(ステルスのためプレスリリースはなし)で急成長をしようとしているため、スタートアップの定義に入るはず。)

## 今の会社に決めた理由

色んなスタートアップのCEOや人事の方とお話をさせて貰った中でも特に

**社長が少数精鋭でやると言い切ってる**

**社長が相当タフで信頼出来る**

**CTOのエンジニアスキルがやばい**

**アプリメインというかアプリでしか出来ないことをやろうとしてる**

**モダンな開発環境**

**すでにiOSとAndroidを合わせると述べ150万DL以上の実績がある**

**ユーザーファースト**

**B2Cアプリをやってる**

という理由で決めました。


## 入社して1ヶ月を振り返って

入社してからは自社アプリ(Android)に対してプレスリリースに載るレベルの
機能を二回ほどリリースしました。
キーワードを上げるといかのような感じです。(雑多ですみません。。。)

- Kotlin 1.0.3
- Retrofit 2.0.2
- Android Studio 2.2.2
- google-service 3.0.0
- Git
- Bitbucket
- Slack

コードと関係ない所では

**机や椅子を自分でセッティング**

**引っ越しの手伝い**

**チームメンバーと良く飲みに行く**

**エンジニアの採用面接の立会**

といったこともしてます。
職場で自分で机や椅子のセッティング(IKEAの机を自分でセッティングする)というのは自分でしたことが無いので新鮮でした。

その他にも棚からぼたもち的にではありますが

**給料が前より年収ベースで100万程度上がった**

**ストックオプションが貰えた**

**リモートワークもOKなので雪や雨の時には自宅から作業が出来る**

といったことも付いてきて

改めて転職をしてよかったなと思います。


## ちなみに

今はSIerにいるんだけどもどっかのタイミングでWeb系の企業に行きたいなーという人はぜひ、こちらを見て頂けると参考になるかも知れません。


## [「SIer→Web」〜本音で語るキャリアチェンジ〜](http://www.slideshare.net/g08m11/sierweb)


![sierweb-1-638.jpg](https://qiita-image-store.s3.amazonaws.com/0/15812/4d49ed55-a0cc-b85b-d3a1-c854b6a48ddb.jpeg "sierweb-1-638.jpg")
create-react-app をつかって、2分でReactアプリを開発・Heroku にデプロイする

[Heroku Advent Calendar 2016](http://qiita.com/advent-calendar/2016/heroku) の第８日目の記事です。

10分はかかったぞ！ とまあ誰の役にもたたない小ネタ。

![image](https://qiita-image-store.s3.amazonaws.com/0/7046/dba30c05-fcb5-29cb-1550-1c3871d8bdd6.png)

react （に限らずと思うけど）って、ツールやプラグインが多すぎてわけわからんよね、[create-react-app](https://github.com/facebookincubator/create-react-app) と、[↓のビルドパック](https://github.com/mars/create-react-app-buildpack)を使えば、設定なしで react アプリを heroku にすぐ（2分で！）デプロイできるよ、と[書いてあった](https://blog.heroku.com/deploying-react-with-zero-configuration)のでやってみた。

![image](https://qiita-image-store.s3.amazonaws.com/0/7046/772c83f5-f983-740c-ab77-1c30704ffce2.png)


```
$npm install -g create-react-app
$create-react-app my-app
$cd my-app
〜この間でちょっと修正して npm run build したりしてる〜
$git init
$heroku create heroku-2016-12-08 -b https://github.com/mars/create-react-app-buildpack.git
$git add .
$git commit -m "とりあえずリリース"
$git push heroku master
$heroku open
```

で、push した先がこれです。
https://heroku-2016-12-08.herokuapp.com/

![image](https://qiita-image-store.s3.amazonaws.com/0/7046/16b5b85f-6aed-a395-9bc7-5ac7672fd9dc.png)

JS の App は、前述の通り環境周りが辛すぎて、正直わたくし全然追いつけていなかったのですが、確かにこれは楽。これなら続けられる気がします！
実際にガリガリ SPA on Heroku やってるひとの話を聞いてみたい。 
お粗末様でした。。。
困ったときのpartial

Pythonの隠れ便利モジュール、[functools](http://docs.python.jp/2/library/functools.html)

特にfunctools.partial関数めちゃくちゃ使います。

一部の引数を固定した関数を返す、といえばいいのか説明が難しいんですが。

```py:sample.py
from functools import partial


def sayhello(message=u"hello", to=u"ryo"):
    print(u"{1}さん、{0}".format(message, to))


def main():
    sayhello()

    konnnichiwa = partial(sayhello, u"こんにちわ")

    konnnichiwa("nishizawa")
    konnnichiwa("takahashi")


if __name__ == "__main__":
    main()
```

を実行すると

```
> python sample.py
ryoさん、hello
nishizawaさん、こんにちわ
takahashiさん、こんにちわ
```

となります。

PySideのコールバック関数などをやっつけるときに活躍します
apkのビルドができません

apkビルドで詰まっています

ビルド時にこんなエラーがでます

Error:UNEXPECTED TOP-LEVEL ERROR:
Error:java.lang.OutOfMemoryError: GC overhead limit exceeded

Error:Execution failed for task ':app:transformClassesWithDexForRelease'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home/bin/java'' finished with non-zero exit value 3
Information:BUILD FAILED
Pythonのyieldについて

## yieldを使ったジェネレータ
Pythonにはジェネレータを簡単に作るためのyieldという命令が有ります。
あまり挙動を理解できていなかったので、下記にメモを残します。

## 基本動作
```test.py
def yield_test():
    list0to4 = [0, 1, 2, 3, 4]
    for i in list0to4:
        yield i

for j in yield_test()
    print j
```

上のコードを走らせると、出力は下記となります。

```
0
1
2
3
4
```
[0, 1, 2, 3, 4]の要素が順番に全て読み出せています。

## ジェネレータを組み合わせる
ここで、別のジェネレータを組み合わせて使う場合を考えます。

```test.py
def yield_test1():
    list0to4 = [0, 1, 2, 3, 4]
    for i in list0to4:
        yield i

def yield_test2():
    list0to2 = [0, 1, 2]
    for i in list0to2:
        yield i

iter0to2 = yield_test2()
for j in yield_test1()
    print j + iter0to2.next()
```

この場合、出力は下記となります。

```
0
2
4
```
yield_test1よりもyield_test2の方が要素数が少ないですが、特にエラーも出ません。

## ジェネレータの動作
ジェネレータは次の要素が無い状態で、次を読み込みにいくと例外[StopIteration]をraiseします。
for文などでは、この[StopIteration]をexceptしてループを止めているようです。
そのため、上の例ではiter0to2.next()で[StopIteration]がraiseされるため、
yield_test1()側に要素が残っていてもfor文を抜けてしまいます。

ジェネレータを組み合わせて使う場合は、どちらが原因でループを抜けたのか
分かり辛い場合があるので注意が必要です。
サクラエディタのすゝめ


#はじめに
皆様お疲れ様です。今年の4月に入社いたしました、川野です。
まだまだエンジニアとしてはひよっこなので今回はエンジニアにはきってもきれないテキストエディタの
**サクラエディタ**について書こうと思います。
すでに使っている方には耳タコかもしれませんが、まだ使っていない方はぜひこれを機に使ってみてください。


#サクラエディタとは

サクラエディタは、日本製のWindows用テキストエディタである。フリーウェアとして配布されている。
標準でクリーム色の背景。プログラムのソースコードを編集するのに向いており、キーワードの強調表示・アウトライン解析・補完入力などが使用できる。また、基本的な機能として複数エンコード・Grep・マクロ等も完備する。etc
[(Wikipediaより引用)]
(https://ja.wikipedia.org/wiki/%E3%82%B5%E3%82%AF%E3%83%A9%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF)

とにかく便利な、特にエンジニア向けのエディタってことらしいです。


#覚えておくと便利なショートカット
###Ctrl+f : 検索
 Excel等でも使うことがあると思いますが、サクラエディタでも使うことができます。
 単語単位でも検索できるうえに正規表現を使うこともできます。

###Ctrl+r : 置換
特定の文字等を置き換えることができます。
こちらも正規表現が使えるのでタブや改行コード等も変更することができます。
(例:CRLF→LF)
これでWindowsからLinuxにテキストを送る時にも困りませんね！

###Ctrl+Altx : 自動改行を解除
長いデータを入力、貼り付けをすると自動で折り返されてしまいますがこれを解除することができます。

###Ctrl+g : Grep
とても便利な機能、ファイル単位だけでなくフォルダ単位で使えるのがポイント。
大量のログや、ソースから特定の行を探したいときに使います。
グレップ使いの人のことをGreperと呼ぶとか呼ばないとか。 

###Alt+矢印キーorマウスでドラッグ : 矩形選択(調べるまではボックス選択って呼んでました)
かなり自由な範囲で選択でき使いこなせるようになると効率アップ間違いなしです。

#サクラエディタはフリ―ソフト
表題のとおりサクラエディタはフリーソフトです。
つまり現場だけでなく自宅でも使えるということです。
日頃から使うことによって現場でも使いこなせるようになりましょう！


#最後に
自分もまだまだサクラエディタの機能を使いこなせていないのでどんどん使って覚えていきたいと思います。
今回書いた機能も基本的なことなのでマクロ等の機能を使ってみたいと思います。
ぜひサクラエディタを使ってみてくださいね。
LD_PRELOAD

http://hackerboss.com/overriding-system-functions-for-fun-and-profit/

http://www.rapidtables.com/code/linux/gcc/gcc-fpic.htm

https://gcc.gnu.org/ml/gcc-help/2006-10/msg00147.html

http://stackoverflow.com/questions/2410976/how-to-define-a-string-literal-in-gcc-command-line
[Qiitaのバグ] 他人の書いた限定共有の記事を公開できる(?)


## 自分以外の書いた限定共有を全体に公開するためのリンクがありました

![58f09177-3e7d-8c58-8fa7-b85dc47a6ad8.png](https://qiita-image-store.s3.amazonaws.com/0/74551/13d4c806-d240-792a-2ef9-f10126183a2b.png "58f09177-3e7d-8c58-8fa7-b85dc47a6ad8.png")


##ちなみに、クリックすると、権限がないというエラーになります。

![スクリーンショット 2016-12-06 22.08.50.png](https://qiita-image-store.s3.amazonaws.com/0/74551/f4d834dd-da11-4fba-5f4e-34354a98b2f3.png "スクリーンショット 2016-12-06 22.08.50.png")

これは、バグですね。
この「全体に公開する」リンクはその記事の著者以外には表示させてはいけないものです。

この挙動を見てみたい人は、以下の限定共有の投稿からお試しください。
http://qiita.com/shiozaki/private/4af55cda9573e38ff324
http://qiita.com/shiozaki/private/554ca0434a0f17d33168
C++でOpenCVを使ってK-meansクラスタリング

C++でOpenCVを使ってK-Meansクラスタリングを行うサンプル。

### OpenCVのインストール

* CentOSの場合

```bash
yum install -y opencv-devel
```

### サンプルソース

```c++
#include <iostream>

#include <opencv2/core/core.hpp>
#include <opencv2/flann/flann.hpp>

int main() {
  cv::Mat samples = cv::Mat::zeros(5, 5, CV_32FC1);
  samples.at<float>(0, 0) = 100.0;
  samples.at<float>(1, 0) = 100.0;
  samples.at<float>(2, 0) = 80.0;
  samples.at<float>(3, 0) = 70.0;
  samples.at<float>(4, 0) = 50.0;
  std::cout << "samples=\n" << samples << std::endl;

  int n_clusters = 3;
  cv::Mat clusters = cv::Mat::zeros(samples.rows, 1, CV_32SC1);

  cv::Mat centers;
  cv::theRNG() = 19771228; //クラスタリングの結果を固定する場合
  cv::kmeans(samples,
             n_clusters,
             clusters,
             cvTermCriteria(CV_TERMCRIT_EPS|CV_TERMCRIT_ITER, 10, 1.0),
             1,
             cv::KMEANS_PP_CENTERS,
             centers);

  //std::cout << clusters << std::endl;
  printf("clusters=\n");
  for (int i = 0; i < clusters.rows; i++) {
    printf("%d ", clusters.at<int>(i));
  }
  printf("\n");

  //std::cout << centers << std::endl;
  printf("centers=\n");
  for (int i = 0; i < centers.rows; i++) {
    for (int j = 0; j < centers.cols; j++) {
      printf("%f ", centers.at<float>(i, j));
    }
    printf("\n");
  }
  return 0;
}
```
## コンパイル

```bash
g++ -I /usr/include/opencv2 -lopencv_core -lopencv_flann kmeans.cpp -o kmeans
```

## 実行結果

```bash
 ./kmeans
samples=
[100, 0, 0, 0, 0;
  100, 0, 0, 0, 0;
  80, 0, 0, 0, 0;
  70, 0, 0, 0, 0;
  50, 0, 0, 0, 0]
clusters=
0 0 1 1 2
centers=
100.000000 0.000000 0.000000 0.000000 0.000000
75.000000 0.000000 0.000000 0.000000 0.000000
50.000000 0.000000 0.000000 0.000000 0.000000
```

## 参考
http://opencv.jp/opencv-2svn/cpp/clustering_and_search_in_multi-dimensional_spaces.html

http://opencv.jp/cookbook/opencv_mat.html