OmniAICreator/Qiita-1.07M huggingface dataset:
vimへのqfixhomwの導入・使い方

# qfixhomwの導入・使い方

今更かもしれませんが最近qfixhomwをvimに入れてみました。
せっかくなので導入方法、基本的な使い方やvimrcの設定など書き留めておきます。

## 導入方法

QFixHowmのHPで本体をダウンロードします。
[QFixHowm インストールページ](https://sites.google.com/site/fudist/Home/qfixhowm/install)

ダウンロードした "qfixhowm-master.zip" を解凍し、
出来た "qfixhowm-master" ディレクトリを適当な場所に移動させます。

vimrcに以下のように追記し、vimに読み込ませます。

```sh
set runtimepath+=<qfixhomw-masterまでのパス>
```


## vimrcの設定

その他、普段使う上で便利な設定を書いておきます。

```sh
" キーマップリーダー
let QFixHowm_Key = 'g'

" howm_dirはファイルを保存したいディレクトリを設定
let howm_dir             = '<qfixhowmのホームパス(任意に設定)>'
let howm_filename        = '%Y/%m/%Y-%m-%d-%H%M%S.md'
let howm_fileencoding    = 'utf-8'
let howm_fileformat      = 'dos'

" キーコードやマッピングされたキー列が完了するのを待つ時間(ミリ秒)
set timeout timeoutlen=3000 ttimeoutlen=100
" " プレビューや絞り込みをQuickFix/ロケーションリストの両方で有効化(デフォル
" ト:2)
let QFixWin_EnableMode = 1

" QFixHowmのファイルタイプ
" 私がよくmarkdown使うので以下のように設定
let QFixHowm_FileType = 'markdown'

" タイトル記号を # に変更する(markdown使用の都合上)
let QFixHowm_Title = '#'

" QuickFixウィンドウでもプレビューや絞り込みを有効化
let QFixWin_EnableMode = 1

" QFixHowm/QFixGrepの結果表示にロケーションリストを使用する/しない
let QFix_UseLocationList = 1

set shellslash

" textwidthの再設定
au Filetype qfix_memo setlocal textwidth=0

" 休日定義ファイル
" 休日定義ファイルは qfixhowm-master 内にあります
let QFixHowm_HolidayFile = '<休日定義ファイル Sche-Hd-0000-00-00-000000.utf8 までのパス>'

" オートリンクでファイルを開く
let QFixHowm_Wiki = 1
```


## 基本的な使い方

私が普段よく使っているコマンドを挙げます。

- g,i：サイドメニューを表示する

- g,u：一時的なメモを開く

- g,<space>：その日に紐付いたメモを開く

- g,q：カレンダーを確認する

- g,s：これまでに作成したメモから指定キーワードで横断検索

## 具体的な使い方

上記コマンドを使った具体的な使用方法を以下に挙げておきます。

- Wikiのサイドバーっぽく作ったサイドメニューを g,i で開き、
  プロジェクトやメモのリンクを開く

- g,\<space> でメモを開き、その日の業務記録を書く

- 一時的にメモしたいことがあるので g,u で一時メモを開く

- g,q で開いたカレンダーから参照したい日を選択し、その日の業務記録を付ける/確認する

- 過去にメモしたTipsを掘り起こすために g,s で横断検索する

などですね。
私は専ら個人的な業務用のWikiを作って利用しています。

この他にも

- g,d：TODO作成

- g,t：TODO閲覧

- g,y：予定確認

などの機能もありますが、私はTrelloなどでタスク管理しているので
余り使わないです。

以上、qfixhowmについてざっと書いてみました。
まずはメモを書き溜める基本的な使い方から入門してみて、
徐々に幅を広げていくといいですね。
Tree tagger 導入メモ


Tree taggerの導入を行おうと思って色々調べたが、少し詰まったのでメモ

 - http://www.cis.uni-muenchen.de/~schmid/tools/TreeTagger/
より

**Download**項目の

1. Download the tagger package for your system (PC-Linux, Mac OS-X (Intel-CPU), PC-Linux (version for older kernels)).
2. Download the tagging scripts into the same directory.
3. Download the installation script install-tagger.sh.
4. Download the parameter files for the languages you want to process.
5. Open a terminal window and run the installation script in the directory where you have downloaded the files:sh install-tagger.sh
6. Make a test, e.g.
echo 'Hello world!' | cmd/tree-tagger-english 
or 
echo 'Das ist ein Test.' | cmd/tagger-chunker-german

以上を参考に、上記4ファイルをダウンロード（解凍は不必要）

Macでターミナルを起動し、以下を実行
	
	> cd 
	> mkdir tree_tagger
	> open .

ダウンロードした4項目を、tree_taggerフォルダに移動、その後、以下のコマンドを実行

	> sh install-tagger.sh
	
	
最初はめんどくさがってDownloadフォルダ内で行っていたらうまく動作しなかったが、Home直下で実行したら動いた。

	> echo 'Hello world!' | cmd/tree-tagger-english
		reading parameters ...
		tagging ...
		finished.
	Hello	UH	Hello
	world	NN	world

環境変数は特にいじらなくても問題無し（自分の場合は）

　
　
　
###：追記(20161124)
Tree taggerをPythonに導入したので追記。

	pip3 install treetaggerwrapper
	
自分は3系に入れたかったので、pip→pip3

Pythonコード内で

	import treetaggerwrapper as ttw

	tagger = ttw.TreeTagger(TAGLANG='en')
	tags = tagger.TagText('hello world')
	
で動作。

自分は指定しなかったが、動作しない場合は```TAGDIR=```に導入ディレクトリを指定すればいいみたい。

	import treetaggerwrapper as ttw

	tagger = ttw.TreeTagger(TAGLANG='en',TAGDIR='…/hogehoge')
	tags = tagger.TagText('hello world')
　
　
参考：	
http://otani0083.hatenablog.com/entry/2013/10/01/195037
	http://treetaggerwrapper.readthedocs.io/en/latest/
ADDA > iterative.c > method_in > index of the iterative solver

```txt:My_Environment
Ubuntu 14.04 LTS Japanese Remix
on VMWare Fusion v8.5.2 (4635224)
on OS X El Captian v10.11.4

GNU bash, version 4.3.11(1)-release

gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 
(also for g++)
ADDA v.1.3b6
```

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

In the source files, I found `itertive.c`.
https://github.com/adda-team/adda/blob/master/src/iterative.c

I was wondering what is the index of iterative solvers among those defined such as BCGS2, BiCG_CS, etc.

It seems that the `method_in` is the index of iterative solver.

In IterativeSolver():

```iterative.c
int IterativeSolver(const enum iter method_in,const enum incpol which)
...
	/* determine index of the iterative solver, which is further used to get its parameters from list 'params'. This way
	 * it should be resistant to inconsistencies in orders of iterative solvers inside the list of identifiers in
	 * const.h and in the list 'params' above.
	 */
	ind_m=0;
	while (params[ind_m].meth!=method_in) {
		ind_m++;
		if (ind_m>=LENGTH(params))
			LogError(ONE_POS,"Parameters for the given iterative solver are not found in list 'params'");
	}
```

The `IterativeSolver()` is called from `int CalculateE() of CalculateE.c`.

```CalculateE.c
int CalculateE(const enum incpol which,const enum Eftype type)
{
    ...
    D("Iterative solver started");
    exit_status=IterativeSolver(IterMethod,which);

```
緯度経度を入力値に、2地点間の距離計測をしてくれるAPI(国土地理院提供)をRubyで叩いてみた

### 背景

「GPSで取得した緯度・経度情報から、2点間の距離を割り出したい……」
こんなこと考えたことありませんか？  

2点間の距離を計算するための計算式は、検索すれば色々と出てくるのですが、
正直、それを1から実装するのは骨が折れるものです。もっと簡単にできないものでしょうか？  

色々調べてみたところ、測量に関する様々なAPIが国土地理院から提供されていることがわかりました。
http://vldb.gsi.go.jp/sokuchi/surveycalc/main.html

> 引用：提供されているAPI  
> ①緯度・経度と地心直交座標の相互換算  
> ②距離と方位角の計算  
> ③距離と方向角の計算  
> ④平面直角座標への換算  
> ⑤緯度・経度への換算  
> ⑥世界測地系座標変換(TKY2JGD)  
> ⑦PatchJGD  
> ⑧PatchJGD(標高版)  
> ⑨SemiDynaEXE  
> ⑩ジオイド高  

今回は、「2地点の緯度経度情報」から「2点間の距離」を割り出したいので、**②距離と方位角の計算**を使ってみました。

API説明：
http://vldb.gsi.go.jp/sokuchi/surveycalc/api_help.html

### 書いてみた

Rubyで以下のようなコードを書きました。
レスポンスは、xmlも選択できるのですが、今回はjsonを採用しています。
新宿駅と、渋谷駅の座標を入力値に実験してみましょう。

```ruby
require 'json'
require 'open-uri'

DISTANCE_API = "http://vldb.gsi.go.jp/sokuchi/surveycalc/surveycalc/bl2st_calc.pl?"

def distance(lat1, lng1, lat2, lng2)
  req_params = {
    outputType: "json",    # 出力タイプ
    ellipsoid:  "bessel",  # 楕円体
    latitude1:  lat1,      # 出発点緯度
    longitude1: lng1,      # 出発点経度
    latitude2:  lat2,      # 到着点緯度
    longitude2: lng2       # 到着点経度
  }
  req_param = req_params.map { |k, v| "#{k}=#{v}" }.join("&")
  result = JSON.parse(open(DISTANCE_API + req_param).read)
  result["OutputData"]["geoLength"]
end

p distance(35.689166, 139.704444, 35.654444, 139.706666)
```

### 結果
```
$ ruby dist.rb
"3857.347"
```

単位はメートルで返ってきます。以上です！
link_toでページ内リンクとclass指定を共存させる方法

やろうとして、ちょっと詰まったので忘れないうちにメモ。

```html
<a class="button" href="#about">LEARN MORE</a>
```

こんな感じのHTMLをlink_toで生成したいとする。

```ruby
<%= link_to("LEARN MORE", anchor: "about", class: "button") %>
```

これだと駄目。

```ruby
<%= link_to("LEARN MORE", { anchor: "about" }, class: "button") %>
```

こうやって、明示的に二番目のパラメータをHashにすることで、うまくいった。  
こうすることで、`class: "button"` をHTMLパラメータ(三つ目のパラメータ)として認識させることができるんだと思う。  
  
と考えると、上記であげた駄目な例は、以下の書き方と同義かな？

```ruby
<%= link_to("LEARN MORE", { anchor: "about", class: "button" } ) %>
```
Sassにもfunction-existsやmixin-existsといったものがあった

本格的にCSSフレームワークを使ってみようと思ったときの話。
CSSフレームワークにはいろんなmixinが予め用意されてはいるんですが、これまで自分が作ったmixinも追加して引き続き使いたい。
名前が被ってたら嫌だなぁと思いつつも、同じ名前のmixinが存在するかいちいち検索するのも面倒。

PHPだと `function_exists` という「指定した関数が定義されている場合に TRUE を返す」ものがありますが、さすがにSassにはそういったものは無いだろうと思いながら検索してみたら、ありました。

```scss:scss
@mixin clearfix() {
    // 省略
}
@debug mixin-exists(clearfix); // true
```

詳しくは公式ドキュメントを。
http://sass-lang.com/documentation/Sass/Script/Functions.html#introspection_functions

変数が存在するかチェックできるものもあるみたいですが、全然知りませんでした。

* `variable-exists($name)`
* `global-variable-exists($name)`


## 使いみち

なかなか思いつかない。
こんな感じで使うことってあるのかなぁ…と疑問です。

```scss:scss
@if mixin-exists(clearfix) {
    .hoge {
        @include clearfix;
    }
}
```

できれば以下のように使いたいんですが `@if` 内で `@mixin` を書いてもエラーになります。

```scss:scss
@if mixin-exists(clearfix) == false {
    @mixin clearfix {
        // Error: Mixins may not be defined within control directives or other mixins.
    }
}
```

便利な使い方をご存じの方がいたら教えていただきたい…。
Zabbix の通知を「LINE」に送る

投稿日：2016-11-19

# やりたいこと
LINE で Zabbix の通知を受け取りたい
[LINE Notify](https://notify-bot.line.me/ja/) を使って通知を送ります


# 環境
- Amazon Linux AMI 2016.09-release
- Zabbix 2.4

# LINE Notify

1. LINE Notify トップページでログイン
  - LINEに登録したメールアドレスと、LINEのパスワードでログイン
2. 右上のプルダウンメニュー「ID名」 > 「マイページ」を選択
3. 「トークンを発行する」をクリック
  - 「トークン名」
  - 通知を送信するLINEグループ（もしくはユーザー）を選択
  - 「発行する」
     - アクセストークンが発行されるのでメモしておく（再発行できません）
4. 「LINE Notify」ユーザーからメッセージが届くので、このユーザーを「通知を送信するLINEグループ」に招待

# Zabbix

## コンソールでの設定

### アラートスクリプトの作成

#### Zabbixサーバーの設定ファイルの AlertScriptsPathを確認
  - パッケージインストールなら「/usr/lib/zabbix/alertscripts」

```
$ sudo grep AlertScriptsPath /etc/zabbix/zabbix_server.conf
（略）
AlertScriptsPath=/usr/lib/zabbix/alertscripts
```

#### LINE Notify アラートスクリプトを作成
    - LINE Notify で取得した＜アクセストークン＞を記載します

```LINE_Notify.sh
#!/bin/sh
export PATH="/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin"
export LANG=C

access_token="＜アクセストークン＞"
subject=$1
body=$2

# LINE Notify 実行
curl -X POST -H "Authorization: Bearer ${access_token}" \
-F "message=${subject}: ${body}" \
https://notify-api.line.me/api/notify

exit 0
```

[LINE Notify API Document](https://notify-bot.line.me/static/pdf/line-notify-api_ja.pdf)
[5 Custom alertscripts [Zabbix Documentation 2.4]](https://www.zabbix.com/documentation/2.4/manual/config/notifications/media/script)


#### アラートスクリプトのオーナーを zabbix に変更

```
$ sudo chown zabbix /usr/lib/zabbix/alertscripts/LINE_Notify.sh
$ sudo chmod 700 /usr/lib/zabbix/alertscripts/LINE_Notify.sh
```


## Webフロントエンドからの設定
Zabbix 管理画面での設定

### メディアタイプ(通知先)の登録

- 「管理」 > 「メディアタイプ」 > 「メディアタイプの作成」

![Screenshot_15.png](https://qiita-image-store.s3.amazonaws.com/0/21749/3833045b-b27b-0d76-ba2a-b32042a38ee4.png)

  - 名前：適当な名称
  - タイプ：スクリプト
  - スクリプト名：LINE_Notify.sh

![Screenshot_16.png](https://qiita-image-store.s3.amazonaws.com/0/21749/f7d387dd-0139-9514-8678-aac8f70b822f.png)

  - メディアタイプに「LINE_Notify」が追加されていることを確認

![Screenshot_17.png](https://qiita-image-store.s3.amazonaws.com/0/21749/a1d6ccd6-cff1-489b-cfdc-4adb08fde471.png)

### ユーザーのメディア(通知先)設定

- 「管理」 > 「ユーザー」 > メンバー「Admin」
  - 「メディア」タブ
  - メディア枠の「追加」
     - タイプ:「LINE Notify」
     - 送信先:適当な名称

![Screenshot_18.png](https://qiita-image-store.s3.amazonaws.com/0/21749/7428e58f-61db-4f74-612b-24018b36cd9b.png)

  - 「更新」

### アクションの有効化

- 「設定」 > 「アクション」 > 「Report problems to Zabbix administrators」のステータスを「有効」にする

![Screenshot_19.png](https://qiita-image-store.s3.amazonaws.com/0/21749/2228178e-9277-7b45-5df9-a4d4f02eb000.png)


# 確認
zabbix にテスト送信などが無いので、適当な監視対象を再起動したりしてアラート通知が飛ぶことを確認します。

![Screenshot_20.png](https://qiita-image-store.s3.amazonaws.com/0/21749/aa58d60b-11fb-8bf5-64c1-aa92b667bf26.png)

# 参考リンク
[Zabbix から「LINE Notify」にアラート通知する方法](https://blog.apar.jp/zabbix/5892/)
Elastic BeanstalkへのDjangoアプリケーションのデプロイをやって詰まったこと

「[AmazonAWSの公式](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create-deploy-python-django.html#python-django-setup-venv)に載っているチュートリアルを見ながら、デフォルトのDjangoウェブサイトを、Python2.7を実行しているElastic Beanstalk環境にデプロイしてみた。基本的には手順通りやっていけばわかるが、いくつか調べる必要がある箇所があったので備忘録的にまとめる。

#awsebcliのインストール

```
pip install --upgrade --user awsebcli
```
で出来る。一応公式にページは存在するが、(前提条件のため)先のページには載ってなかったので[リンク](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3-install.html)を張っておく。


#eb initが実行できない
ユーザーの権限設定が原因。具体的なエラーメッセージは以下。

```
ERROR: Elastic Beanstalk could not find any platforms. Ensure you have the necessary permissions to access Elastic Beanstalk.
```

AWS管理ポリシーの
・AWSElasticBeanstalkFullAccess
・AWSElasticBeanstalkService
を追加したら実行できた。
新型Mac発売時に、Mac2014年版を買ってしまった人のまとめ（初心者）

#Xcodeインストール

入っているOSが、「OS X Yosemite バージョン10.10.5」であるため、
最新のXcodeを入れようとすると、入手不可と返される。

では、「OS X Yosemite バージョン10.10.5」に対応できる
旧バージョンのXcodeはどこで手に入るのか？

###Xcode入手場所

https://developer.apple.com/download/more/

###Xcode 対応OS掲載場所

https://support.apple.com/ja-jp/HT201222


###Xcode 対応OS

「OS X Yosemite バージョン10.10.5」に対応できるXcodeバージョンは、以下でした。
<img width="829" alt="スクリーンショット 2016-11-23 18.29.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/150228/8e93c1f4-7830-0914-7885-8d3647061d1a.png">



#####※当方、Macもプログラムも初心者につき、また気がついた点があったらアップデートしていく予定です。
1行のコピーライティング術

1行のコピーライティング術
------------------------------

１．コンプレックスを刺激する
　　・人は誰でも自分に対して、何かしらのコンプレックスを持っています。そして、それを解決したいと心から願っている。
　　「あなたが痩せない理由」「ブログのアクセスの伸びない原因とは？」

２．How to
　「料理を上達させる方法」「どうすれば、売上が上がるのか？」

３．具体的な数字
　　・数字を効果的に使うことで、かなり具体性のあるコピーを書くことができる。
　　「痩せるための10の法則」「5分でわかるブログの書き方」

４．もうひと押し
　　・人は誰でも、自分の悩みを解決したいと願っています。そういったネガティブな人の背中を押す。
　　「会話上手になれる。たとえ、人見知りだとしても」

５．強調表現
　　・アピールしたい部分を少し強調するだけで、印象がガラッと変わります。
　　「驚くほど上達できる！ゴルフ練習法」

６．条件付き
　　・現実味を帯びることが出来るテクニック。
　　「もし、１日10分の時間が取れるなら、モデルのような体型になれます」

７．呼びかけ
　　・注意を引くためにも、すごく有効なテクニック
　　「マーケティング担当者必見」「今年の夏までに痩せたいと思っているあなたへ」

８．即効性
　　・人は誰でも、すぐに問題を解決したいと思っている。即効性をアピールして、興味を引く。
　　「コレが、すぐに歌が上手くなる方法です。」「今すぐ仕事の効率を上げたいならコレ！」

９．矛盾
　　・意外性のある文言を使うことで、強烈に興味を掻き立てる
　　「大食いでも太らない人の秘密」「仕事しないで金持ちになる方法」

10．不安
　　・不安を煽る表現を用いることで、反応が取れるコピー
　　「あなたのビジネスマナーは、間違っている！？」「英語の勉強、こんな間違いしていませんか？」

コピーライティングに使える心理学
------------------------------
１．アンカリング効果
　　・人は一番最初に見た数字やデータをよく記憶しており、何かしらの意思決定を行う際、最初に見たデータを重要視する傾向にある。
　　「「数量限定」「期間限定」というふうにプレミア感をアピールすることが有効」

２．バンドワゴン効果
　　・「これが流行っている」と聞くと、人はその流行している物事を好意的に捉える傾向にある。
　　「大流行」「大人気」という言葉を含むキャッチコピーを付けられた商品やサービスは不思議とよいものに見えてしまうアレです。

３．同調効果
　　・周囲の人間と同じ行動をしていると安心し、逆に自分1人だけが違う行動をしていると不安を覚えること。
　　「30代男性の8割が使用」「◯◯地区の主婦は皆使っている」というように、商品のマジョリティ性がある場合はそこを最大限アピールすると効果的です。

４．フレーミング効果
　　・見方や基準を変えることで、同じ物事でも全く違う印象を持ってしまうこと。

５．カリギュラ効果
　　・禁止されると、人はかえって禁止された行為をしたくなってしまいます。
　　「本が大好きな方以外はこの本を買わないでください」

６．損失回避の法則
　　・人は利益を獲得することよりも、損失を出さない方を重要視します。
　　「この育毛剤を使わなければ頭髪は薄くなっていく一方」
Android NDK OpenCVでFileStorageを扱う

Android+NDK+OpenCVのFileStorageでエラーとなりつまったので備忘録を書いておきます。

下のURLを参考に、manifestにREAD_EXTERNAL_STORAGEのpermissionを追加すれば直りました。

http://stackoverflow.com/questions/28441321/how-to-read-opencv-mat-object-from-file-in-android
vagrant upできなかった

#環境
Macbook-Airのバージョン : 10.12.1
VirtualBoxのバージョン : 5.1.10 r112026 (Qt5.6.2)
Vagrantのバージョン : 1.8.7

#起きたこと
```
MacBook-Air:vagrant mac$ vagrant init ubuntu/trusty64; vagrant up --provider virtualbox
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'ubuntu/trusty64' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
The box 'ubuntu/trusty64' could not be found or
could not be accessed in the remote catalog. If this is a private
box on HashiCorp's Atlas, please verify you're logged in via
`vagrant login`. Also, please double-check the name. The expanded
URL and error message are shown below:

URL: ["https://atlas.hashicorp.com/ubuntu/trusty64"]
Error: 
MacBook-Air:vagrant mac$ （・ω・｀）
```

#やったこと
```
sudo mv /opt/vagrant/embedded/bin/curl /*どこか遠いところ*/
```

Macでも起きるんですね
アルゴリズムとデータ構造1の回答


回答例1

```ruby
arrs = [5, 3, 1, 3, 4, 3, 7, 8, 15]
cal_i = 0
arr_size = arrs.size
max_diff_val = arrs[1] - arrs[0]
arrs.each_with_index do |val, index|
  max_diff_val2 = 0
  idx = index + 1
  arrs[idx...arr_size].each do |val2|
    cal_i += 1
    if val2 > max_diff_val2
       max_diff_val2 = val2
    end
  end
  max_diff_val = max_diff_val2 - val if index == 0
  max_diff_val = max_diff_val2 - val if (max_diff_val2 - val) > max_diff_val
end

puts max_diff_val
puts cal_i
```

14と36が表示される。
計算量はO(n^2)

回答例2

```ruby
arrs = [5, 3, 1, 3, 4, 3, 7, 8, 15] #14
cal_i = 0
arr_size = arrs.size
max_diff_val = arrs[1] - arrs[0]
min_val = arrs.first
arrs[1...arr_size].each do |val|
  max_diff_val = val - min_val if (val - min_val) > max_diff_val
  min_val = val if val < min_val
  cal_i += 1
end

puts max_diff_val
puts cal_i
```

14と8が表示される。
2番目の方がいい。
計算量はO(n)

計算量の比較
![スクリーンショット 2016-12-17 23.06.01.png](https://qiita-image-store.s3.amazonaws.com/0/39073/e0e17e85-04c3-4fbb-b75a-e08b8e5af58a.png "スクリーンショット 2016-12-17 23.06.01.png")
アルゴリズムとデータ構造1の質問

配列の要素の差が、最大値になる値を探す問題です。
ただし、配列の値が、「後から先」へは計算できるが「先から後」へは計算できない。

x = array[i]
y = array[j]
x - y が最大になる値を求める。だたし、「i > j」でなければならない

実際のコード例

```ruby
arrs = [4, 3, 2] #回答は-1
```

こういった計算は、「j < i」になるので認められない。

```ruby
4 - 2
```

例えば、こういったケースの場合　

```ruby
arrs = [5, 3, 1, 3, 4, 3] #回答は3
```

5 - 1は正解ではない。arrs[0] - arrs[2]で「i < j」になっている。
4 - 1が正解。arrs[4] - arrs[2]で「i > j」になっている。

```:ruby
4 - 1 = 3
```

These are all example.

```ruby
arrs = [5, 3, 1, 3, 4, 3, 7, 8, 15] #15 - 1。回答は14
arrs = [5, 3, 1, 3, 4, 3]  #4 - 1。回答は3
arrs = [4, 3, 2] #2 - 3。回答は-1
arrs = [8, 6, 3] #6 - 8。回答は-2
```
LINE Messaging APIでgroupIdを取得してPush APIでグループにメッセージを送る

# 概要
　Push APIを使ってユーザ単位でメッセージ送信はできたものの、グループでのやり方がわからず結論難しく考えていたため備忘録。

# 前提
 - Messaging APIのDeveloper Trialのアカウントを作成している(もしくはプロアカウント)

# アカウント設定
## Bot設定
　アカウント作成後は、LINE@ MANAGERのBot設定を見るとAPIが無効になっているので有効化します。その後、設定項目が並ぶので**Webhook送信**と**Botのグループトーク参加**は`利用する`を選択して保存します。
![bot_settings.png](https://qiita-image-store.s3.amazonaws.com/0/110768/b2c6b824-666a-91c3-b9a7-7aa22faff86e.png)

## Webhookの設定、トークンの生成
　LINE DevelopersのBasic information画面下部の`EDIT`で編集画面で**Webhook URL**を設定します。これは、ユーザが友達に追加したりグループに参加した場合のId情報などがJSON形式でPOST送信されてきます。`VERIFY`押下でサンプルのJSONが確認できます。
　Channel Access TokenはPush APIでメッセージ送信の際に利用します。アカウント作成時は空なので`ISSUE`押下でトークンを生成します。

![push.png](https://qiita-image-store.s3.amazonaws.com/0/110768/1a0a94e0-7c07-2250-81ed-9bfa89e7b1a7.png)

# アプリ設定
## アプリ側の準備
　LINEアプリ側でプッシュメッセージを受信するグループを作成します。

<img width="414" alt="IMG_0554.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/110768/03020fda-8772-f147-9c03-f75d43ea71ad.png">

　また、LINE DevelopersのBasic information画面のQR Codeを読み取ってPush API用アカウントを友達追加します。

<img width="414" alt="IMG_0555.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/110768/65f1b96a-115a-677b-bae0-b1ba708fced4.png">

## グループにPush API用アカウントを招待
　そして、作成したグループにAPIアカウントを招待してください。このタイミングでグループへの参加がイベントとしてWebhookに設定したURLにJSON情報が送信されます。
<img width="414" alt="IMG_0558.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/110768/ab878d9a-42f1-288d-c8e7-6d2920c1d660.png">

<img width="414" alt="IMG_0559.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/110768/7aabd621-6cda-5fe3-c0f5-ac3b34d8e590.png">

```json:Token・Idは修正済
{
  "events": [
    {
      "type": "join",
      "replyToken": "8f94c14575e04ea3a99d9d79ae3daa3a",
      "source": {
        "groupId": "C23fcbe8d92b0e428298ae1e32585fb36",
        "type": "group"
      },
      "timestamp": 1479886261509
    }
  ]
}
```

# curlでメッセージ送信のテスト
　言語での実装は時間がかかるのでひとまずcurlで実験しましょう。下記の**Authorizationの**部分に`Channel Access Token`が入ります。**to**の部分にはWebhookで取得したJSONの`groupId`を指定します。

```bash:Token・Idは修正済
curl -X POST \
-H 'Content-Type:application/json' \
-H 'Authorization: Bearer 0Sw81tcX82eGuKkMPYRgbvDUeAIbgPC+wKR8T1aKaWy4+7dpUzR2t9XpVDQw1cKivU1AVBD6tE/DIWSz60QTW9UCyC7lJgE+u74XvEceuoMqmZkZdAxw/DMybh6hffSwUhDg74qcrlRZLPRIcahC/wdB04t89/1O/w1cDnyilFU=' \
-d '{
    "to": "C23fcbe8d92b0e428298ae1e32585fb36",
    "messages":[
        {
            "type":"text",
            "text":"Hello, world1"
        },
        {
            "type":"text",
            "text":"Hello, world2"
        }
    ]
}' https://api.line.me/v2/bot/message/push
```

# 結果
<img width="414" alt="IMG_0560.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/110768/63608c65-81db-06fd-847f-97f2efc59213.png">

# 終わりに
 - IdとかDBでの管理がやっぱり必要？
 - そもそも一斉送信には一つ一つのuserIdでPush APIを叩かないといけない？

# 参考文献
 - [LINE Messaging API を試してみた / Push Message](http://ukkey3.blog33.fc2.com/blog-entry-682.html)
DjangoでIN演算子を使ったクエリを生成する方法

Django:1.10

結論から言うと、以下に記載されていました。

QuerySet API reference | Django documentation | Django
https://docs.djangoproject.com/ja/1.10/ref/models/querysets/#in

クエリに関しては、このページを見たらよさそう。

例えば、選択した著者の出版した本一覧を取得するクエリを生成する場合は、以下のように書きます。

```python:views.py
def search(request):

    form = SearchForm(request.POST)

    books = None

    if form.is_valid():
        books = Book.objects.filter(author_id__in = form.cleaned_data['author'])

    return render(request, 'books/search.html', {'form': form, 'books': books})
```

著者、本、ジャンルのモデル。

```python:models.py
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=128)

    def __str__(self):
        return self.name

class Genre(models.Model):
    name = models.CharField(max_length=128)

    def __str__(self):
        return self.name

class Book(models.Model):
    name = models.CharField(max_length=512)
    author =  models.ForeignKey(Author, on_delete=models.CASCADE)
    genres = models.ManyToManyField(Genre)

    def __str__(self):
        return self.name
```

著者を選択するフォーム。

```python:forms.py
from django import forms

from books.models import Author

class SearchForm(forms.Form):

    authors = [(author.id, author.name) for author in Author.objects.all()]

    author = forms.MultipleChoiceField(label='著者', widget=forms.CheckboxSelectMultiple,
            choices=authors, required=False)
```

テンプレートは以下のようにすると、

```html:searth.html
<form method="post" action="">
    {% csrf_token %}
    <h1>{{ form.author.label }}</h1>
    {{ form.author }}
    <input type="submit" value="検索" />
    <hr />
    <table border="1">
        <tr>
            <th>タイトル</th>
            <th>著者</th>
            <th>ジャンル</th>
        </tr>
        {% for b in books %}
            <tr>
                <td>{{ b.name }}</td>
                <td>{{ b.author.name }}</td>
                <td>{% for g in b.genres.all %}{{ g.name }}{% endfor %}</td>
            </tr>
        {% endfor %}
    </table>
</form>
```

こんな感じで表示されます。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/147868/0eee91f4-57ab-12ec-361a-eb1c055060f0.png)

<hr />

# 追記　2016/11/26
著者追加を実装していたのですが、1点問題がでてきました。
上記のforms.pyで著者を選択するためにauthorsをテーブルから取得していますが、この方法ではアプリケーションスコープになるらしく、著者を追加してもサーバ再起動しないと画面に反映されません。
トランザクションデータをchoicesに代入する場合はどうするべきか、別途考えます。

# 追記　2017/01/05
上記問題を解決しました。

DjangoのMultipleChoiceFieldでchoicesが更新されない
http://qiita.com/nakkun/items/26598a7bf1f80b215ff2

多分、これで大丈夫なはず。。。
MacでLaravelの開発環境を構築

ローカルで手軽に実行できる開発用環境を構築することを目的とする。
Webサーバは、PHP組込のサーバを利用する。

以下の流れで実施する。

* MySQLのインストール
* phpbrewのインストール
* PHPのインストール
* composerのインストール
* laravel環境構築

# MySQL

MySQLの公式サイトからdmgファイルをダウンロードしてインストールする。
  http://dev.mysql.com/downloads/installer/

# phpbrew

公式サイト：https://github.com/phpbrew/phpbrew/blob/master/README.ja.md

```
% curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
% chmod +x phpbrew
% sudo mv phpbrew /usr/local/bin/phpbrew
% phpbrew init
% vi ~/.zshrc
source ~/.phpbrew/bashrc
```

バージョンの一覧

```
% phpbrew known
```

# PHPインストール

ビルドに必要な依存関係を解決

```
% sudo port -v selfupdate
% sudo port -v sync
% sudo port install curl automake autoconf icu depof:php70 depof:php70-gd mcrypt bison re2c gettext openssl
```

最も一般的な構成でインストールしてくれるdefaultバリアントを指定するのが良い。
mysqlを使用するならmysqlも付与すること。

```
% phpbrew install 7.0 +default+mysql
```

## phpbrewのtips

use (一時的なバージョンの切り替え):

```
% phpbrew use php-7.0.13
```

switch (デフォルトで使用するバージョンを切り替える):

```
% phpbrew switch php-7.0.13
```

phpbrewを使用するのをやめる:

```
% phpbrew off
```

インストール一覧

```
% phpbrew list
```
# composer

公式サイト：https://getcomposer.org/

```
% mkdir composer
% cd composer
% curl -s http://getcomposer.org/installer | php
% sudo mv composer.phar /usr/local/bin/composer
```

# laravel環境構築

公式サイト：https://readouble.com/laravel/4.2/ja/quick.html

```
% composer global require "laravel/installer=~1.1"
```

`~/.composer/vendor/bin`にパスを通す。
これでlaravelプロジェクトを作成可能になる。

```
% laravel new プロジェクト名
```

## PHP組込サーバでアプリケーションを起動する。

```
% php artisan serve [--port=8000]
```

プライベートIPでアクセスできるように起動するには、下記で実行する。

```
% php artisan serve --host 0.0.0.0 [--port=8000]
```

## 組込の認証機能

Laravel 5.3だと、下記コマンドを実行するだけで認証機能を付与できる。

```
% php artisan make:auth
```

## APP_KEYの設定

.envにAPP_KEYが設定されていないときには、以下のコマンドを実行する。

```
% php artisan key:generate
```

## REPL起動

rails consoleのような感じでREPL起動

```
% php artisan tinker
```

## ブレイクポイント

対象箇所に以下のコードを入れる。

``` php
eval(\Psy\sh());
```

# 番外

今使用しているphp.iniの場所を確認する方法は、いくつかあるようだ。

```
% php -i | grep php.ini
% php --ini
```

phpbrewを使用しているなら下記で開ける

```
% phpbrew config
```

# 参考にさせて頂いたサイト

* http://www.karakaram.com/mac-install-phpbrew
* http://qiita.com/hikarut/items/026e7087326ea0861bd6
懐かしすぎて憤死するWIN32API（古の趣味ゲーム開発編）

# おっさん注意報
古のWindowsで趣味ゲームを開発していた人間が見たら懐かしすぎて憤死すること間違いなしのWIN32APIを集めてみた。
DirectX(もしくはWinG)を使わないアナクロな開発モデルのやつ。
なんとなく書きたくなって完全に記憶だけで書いているので、勘違いもあるかもしれない。

# BitBlt
hDC間で画像の部分転送できるやつ。フラグを指定すればANDやOR演算ができるので、白黒のマスク画像を作ることでスプライト（キャラチップの背景透過処理）もできた。
DirectDraw(DirectX7まであったやつ)は、カラーキー転送ができたのでマスク画像は不要だったのが少しうれしかった。
あとDirectDrawの用語として、透過処理する色のことをカラーキーとMSDNに書いてあったので（私の周囲は）みんな徐々にカラーキーと言うようになったが、それ以前は抜き色って言ってた気がする。
BitBltは等倍転送だけど、拡縮できるStretchBltもあった。ただし汚い。98SEからハーフトーンで転送できるオプションフラグが加わって、見られる画質になったように思う。

# sndPlaySound
wavファイルを再生するやつ。ASYNCフラグで非同期再生できるので、効果音（SE）の再生に使っていた。
通常は再生ファイル名をNULL終端文字列で渡すのだが、ポインタを渡してメモリに展開しておいたサウンドファイルを再生することもできた。
ただしVBでの開発の場合はポインタを扱えなかったので（アドレスを取得する隠し関数はあったが）ファイル名を渡すしかなかった。

# mciSendString
BGM再生用。MIDIファイルとかCDDAの再生・停止ができた。ループ再生はできないのでメインループでちょいちょいstatusを確認してやる必要があった。
あと、9X系のOS(Windows 95, 98, Meとか)は呼び出した直後に再生が開始されたが、NT系(NT, 2000, XPとか)だとAPIをコールしてから再生開始まで数秒のラグがあった。
また機能的に同じことができるAPIにmciSendCommandがあったが、世の中のホームページ（重要）に掲載されていたサンプルコードの多くはsendstringであった。
関係はほぼないがCDDAは再生にCPUパワーをほぼ消費しないので重宝したし、大人向け商用ゲームでも2トラック目からCDDAでBGMを入れた構成になっているものもあった。

# getTickCount, timeGetTime
いずれもWindowsが起動してからの経過時間をミリ秒で返すAPI。たしかgetTickCountのほうが軽かったが、分解能はtimeGetTimeのほうが良かったので(たしかgetTickCountは5～10msぐらいだった)、大体timeGetTimeを使っていた気がする。
ちなみに、timeGetTimeの分解能はtimeBeginPeriodというAPIで変更可能で、1msに変更する必要があった。
9X系のOSはデフォルトで1msだったが、NT系のOSはデフォルトが5msだったから。
これらを何に使っていたかといえば、当然メインループでのFPS調整処理である。
メインループといえば、WIN32APIのsetTimerは分解能としての保証値は確か55msだったのでゲームには使いものにならなかった。

# sleep
メインループで余った時間をつぶすときに使うAPI。ms単位でsleepさせることができた。
空ループを回すという荒業もあったがCPU使用率が100％に常時張り付くのでお勧めできなかった。
一方でsleepはOSに処理を返してくれるのでCPU使用率を下げることができた。
ただしゲームの処理が完全にその間止まるので、3ms止めたいならsleep(3)ではなく、timeGetTimeなどで経過時間を見ながらsleep(1)を呼んでいた。

# GetAsyncKeyState
キーボードの入力状態を非同期に取得するAPI。同時押下数に制限があった気がするが、キーボード側の問題だったかもしれない。
DirectInputだと全キーの状態を一気に取得できるので高速とか書いてあった気がするが、そもそもキーボード全体を使うゲームなんてそんなにないわけで、必要なキーだけこのAPIで状態拾った方が早かったように思う。

# TextOut
文字を出力するやつ。デバッグ用。
矩形内に文字を折り返して収めてくれるDrawTextとかいうのもあった気がするが使った覚えはない。
昔はフォントにアンチエイリアシングがかかってなかったので、サウンドのベルとかを作る場合は自前でアンチエイジングの処理とかを作ってた(倍のサイズで文字を打ち出し、平均画素法で縮小するなど)。

# おわりに
だいたいぱっと思い出せる、よく使っていたAPIだとこんなところ。
思い出話は腐るほどあるけど、同時代にゲーム作ってた人ならあったあった的なリアクションをしてしまうラインナップをとりあえず出せたのではないかと思います。
・・懐かしでいえばDirect3D RMモードとかね。
WP-CLIのインストール方法いろいろ


WP-CLI はいろいろな方法でみなさんの環境にインストールすることができます。

それぞれユースケースがいろいろありますので、それらを紹介します。

## Homebrewでインストール

Mac の人にとってはこれが一番簡単な方法かもですね。

```
$ brew install homebrew/php/wp-cli
```

一見簡単ですが、Homebrew が Xcode に依存しているので、ハンズオンとかの際にXcodeをダウンロードして。。。っていうのはなかなか大変なことになります。

あと、最新版がリリースされた後に、その最新版がダウンロードできるようになるまでにややタイムラグがあります。

アップデートを行うには `brew update && brew upgrade` ですね。

他のものとまとめてアップデートできるので、メンドくさがりな人にはおすすめ。

## Phar アーカイブをダウンロードする

WP-CLI は Phar アーカイブで配布されているので、それをダウンロードする方法もやや手数は必要ですが簡単です。

この方法は Homebrew などに依存しないので、多くの環境で動作させることができます。また最新版がリリースされれると同時にそれにアップデートすることも可能です。

```
$ curl https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
```

または

```
$ wget https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
```

つぎに実行権限をつけてください。

```
$ chmod 755 wp-cli.phar
```

以上でとりあえず動作します。試しに以下のコマンドを実行してみましょう。

```
$ ./wp-cli.phar --info
```

環境によって内容は変わりますが以下のような出力があればおっけー。

```
PHP binary:	/usr/bin/php
PHP version:	5.6.25
php.ini used:	
WP-CLI root dir:	phar://wp-cli.phar
WP-CLI packages dir:	/Users/xxxx/.wp-cli/packages/
WP-CLI global config:	/Users/xxxx/.wp-cli/config.yml
WP-CLI project config:	
WP-CLI version:	0.25.0
```

次にこれを `wp` というファイル名で `$PATH` が通っているディレクトリに移動します。

```
$ mv wp-cli.phar /usr/local/bin/wp
```

このインストール方法を使用した場合に最新のWP-CLIにアップデートを行うには、以下のコマンドを実行してください。

```
$ wp cli update
```

パーミッションがなんたらかんたらって怒られた場合は以下のコマンドで。

```
$ sudo wp cli update --allow-root
```

そうそう、WP-CLI は `sudo` とか `root` とかでコマンドを実行することは推奨していません。`update` 以外のコマンドも `sudo` が必要な場合は環境を見直しましょう。

## Nightly バージョンをインストール

WP-CLI のリリースサイクルは現時点で約3ヶ月サイクルになっていますが、開発はとても活発にされており毎日のように改善が行われています。

これらの様々な修正は GitHub の `master` ブランチに `push` されるたびに4000通り以上のテストケースでテストされ、自動的に Nightly バージョンとしてリリースされています。

開発チームではこの Nightly バージョンを本番環境で使うことは推奨していませんが、開発環境で使うには十分な品質が保証されていると考えていますので、みなさんの環境にこれをインストールすれば、いち早く最新の機能をつかったり、バグが修正された WP-CLI を使うことができます。

インストール方法は上述の Phar アーカイブによるインストール方法とほぼ同じですが、アーカイブのURLが変わります。

```
$ curl https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli-nightly.phar
$ chmod 755 wp-cli-nightly.phar
$ mv wp-cli-nightly.phar /usr/local/bin/wp
```

アップデートを行うには以下のコマンドで。

```
$ wp cli update --nightly
```

ドキュメントが整備される前のバージョンがインストールされますので、ドキュメントにないコマンドがあったり、コマンドの仕様がドキュメントとやや違う場合もありますのでご注意ください。

## GitHub から clone してインストール

たとえば WP-CLI に頻繁にプルリクエストを送ったりするなど、開発に参加するには以下の方法でインストールしてください。

```
$ git clone git@github.com:wp-cli/wp-cli.git
```

リポジトリをフォークしてる場合は、`clone` する URL は適当に置き換えてください。

次に clone してできたディレクトリに移動して、依存関係があるライブラリをインストールします。

```
$ cd wp-cli
$ composer install
```

`bin/` 以下に `wp` というファイルがあります。これが実行用のファイルです。

`~/.bash_profile` 等に以下のように記述することで、`wp` コマンドとして利用可能になります。

```
export PATH=/path/to/wp-cli/bin:$PATH
```

`/path/to/wp-cli` の部分はみなさんが `clone` したディレクトリへのパスです。
#define assert(expression) ((void)0) でハマりました

Visual studio 2015を使っていて、リリースモードでビルドしたときどうも挙動がおかしいなあと思ったら、 `assert`マクロの実態が `#define assert(expression) ((void)0)` のようになっていました。expressionは評価されないんですね、、、しらんかった、、、

```c++
//
// assert.h
//
//      Copyright (c) Microsoft Corporation. All rights reserved.
//
// Defines the assert macro and related functionality.
//
#if defined _VCRT_BUILD && !defined _ASSERT_OK
    #error assert.h not for CRT internal use
#endif

#include <corecrt.h>

_CRT_BEGIN_C_HEADER



#undef assert

#ifdef NDEBUG

    #define assert(expression) ((void)0)

#else

    _ACRTIMP void __cdecl _wassert(
        _In_z_ wchar_t const* _Message,
        _In_z_ wchar_t const* _File,
        _In_   unsigned       _Line
        );

    #define assert(expression) (void)(                                                       \
            (!!(expression)) ||                                                              \
            (_wassert(_CRT_WIDE(#expression), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)), 0) \
        )

#endif



_CRT_END_C_HEADER
```

他のプラットフォームでassertの実装がどうなっているか調べていませんので、あしからず
[Elixir] Nervesを試してみる

「Elixirで組み込み向けの強靭なソフトウェアを作ろう」を謳う[Nerves](http://nerves-project.org/)を試してみた。

実機はRaspberry Pi2、デスクトップ環境はDebianを使用し、手順は[Getting Started](https://hexdocs.pm/nerves/getting-started.html)にあるとおり進めてみた。

## インストール

インストール周りは[ここ](https://hexdocs.pm/nerves/installation.html)に記載されているとおり。

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

```bash
$ sudo aptitude install ssh-askpass
$ sudo aptitude install squashfs-tools
```

あと`fwup`も必要だがdebianにはパッケージが用意されていないので、[ここ](https://github.com/fhunleth/fwup#installing)からdebianパッケージを拾ってきてインストールする。

```bash
$ sudo dpkg -i fwup_0.11.0_amd64.deb
```

### Nervesのインストール

以下のコマンドを実行してNervesをインストールする。

```bash
$ mix archive.install https://github.com/nerves-project/archives/raw/master/nerves_bootstrap.ez
```

## プロジェクト作成から起動まで

`mix nerves.new`でプロジェクトを作成する。Raspberry Pi2なのでターゲットには`rpi2`を指定

```bash
$ mix nerves.new hello_nerves --target rpi2
$ cd hello_nerves
$ mix deps.get
$ mix compile
```

あとはマイクロSDカードに焼くだけ

```bash
$ mix firmware
$ mix firmware.burn
Use 7.4 GiB memory card found at /dev/sdf? [Yn] Y
100%
Elapsed time: 9.452s
```

HDMIケーブルをディスプレイに繋いで電源を入れれば、`iex`が立ち上がってくる

なお、`_images/rpi2/hello_nerves.fw`にあるイメージは20MB弱とかなり小さい。

### シリアルポート接続

HDMI接続だとなにかと不便なのでシリアルポート接続にしてみる。手順は[ここ](https://hexdocs.pm/nerves/faq.html)。

hello_nervesの直下に`rootfs-additions/etc`ディレクトリを掘り、`deps/rpi2/nerves_system_rpi2/rootfs-additions/etc/erlinit.config`をコピーしコンソール設定部分を以下のように変更する

```:rootfs-additions/etc/erlinit.config
#-c tty1
-c ttyAMA0
```

(2016/11/26: `ttyS0`から`ttyAMA0`に修正)
そして上記ファイルを使用するよう設定ファイルに追記する

```exs:config/config.exs
config :nerves, :firmware,
  rootfs_additions: "rootfs-additions"
```

ビルドしてSDカードに焼く

```bash
$ mix compile
$ mix firmware
$ mix firmware.burn
```

TTL to USBケーブルでホストに接続し、以下のコマンドで接続できる

```bash
$ screen /dev/ttyUSB0 115200
```
VS for MAC and Xamarin

# 1. はじめに
VisualStudio for MACがリリースされたので早速新機能を使ってみたいと思います。
[参考](http://www.buildinsider.net/mobile/xamarinvisualstudio/02)

[Xamarinコンポーネントストア](https://components.xamarin.com/)からコンポーネントをダウンロードして利用できます！
[アカウント作成](https://store.xamarin.com/account/my/subscription/downloads)だけとりまやってみたので、あとでいろいろやってみましょう！！！！

# 2. 下準備
ダウンロード
[VistualStudioForMac](
https://www.visualstudio.com/vs/visual-studio-mac)

https://components.xamarin.com/

# 3. 開発
とりあえず、動かしたいので、新しいプロジェクトの画面で、AndroidAPPを選択しましょう！

![スクリーンショット 2016-11-23 14.46.16.png](https://qiita-image-store.s3.amazonaws.com/0/89997/e20982b0-f46f-d0ca-3418-344065fca141.png)

Getting Startedの画面は表示したままにしておきましょう。
その中から、BuildYourAppの中にある、OpenAdnroidをクリックすると下記のデザイナーが開きます。
やばい使いやすい！！！！！！

![スクリーンショット 2016-11-23 15.48.10.png](https://qiita-image-store.s3.amazonaws.com/0/89997/76652ba2-c773-060a-1633-2a090b182fe1.png)

ソリューションペインを見てみましょう。
Resources > values > Strings.xml内にいつものようにリソースを書き込めます。
そして、デザイナー側でtext@stringと入れると勝手に補完してくれます！

![スクリーンショット 2016-11-23 15.48.10.png](https://qiita-image-store.s3.amazonaws.com/0/89997/c0b9cfd7-2f86-86db-bea9-8484d2ea24b6.png)
さあ、右上の再生ボタンを押して実行してみよう！
Android_Accelerated_86が起動します！爆速wwwww!!!!
クラウドインフラエンジニア採用のための面談時質問シート

# はじめに

* クラウドインフラエンジニアの採用面談時に質問すると、その人のレベルが測れそうなことのリストを作ってみる試み
* 履歴書や職務経歴書は基本的に盛ってあるので信用しない
* 本質的にはクラウドだろうとオンプレだろうとインフラエンジニアに求められるスキルには大差ないと思う
* これらに答えられるから優秀とは限らないが、答えられない人の多くは優秀とは言えない可能性が高い
    * あくまで、本人なりの理解があって、その説明とか説明力があって、自社とのギャップが明確になればいいと思う
* Web系に偏っていることは認める。あとネットワークエンジニアも考慮外になっている
* 混ぜるとわかりにくくなると思うので AWS に寄せてある。

# なにはともあれできることを確認

* 使える、使ったことがある、使いこなすことができるOS
* 同上で言語
* 同上でミドルウエア（DBMS, Cache, KVS, その他）
* 環境構築で使用するツールは何が使えるか
* エディタ、IDEは何を使っているか
* 公開リポジトリ（github,bitbucketなど）があれば教えてもらう
* CIツール（TravisCI, CircleCI, Jenkinsなど）の使用履歴
* デプロイについて話してもらう（capistrano, BG Deploy, 自前でシェル書いていたとか）

# AWS で全体的に

* [コンソリデーティッドビリング](http://docs.aws.amazon.com/ja_jp/AWSConsolidatedBilling/latest/AWSConsolidatedBillingGuide.html)を理解しているか
    * 請求とコストページを見ているかどうか、コスト意識がわかる
* ルートアカウント、IAMユーザ、グループ、ロールの役割の違いを説明できるか
    * 主体的にアカウント管理をしてきたのか他の誰かがやったことに乗ってきただけなのかがわかる
    * セキュリティに関する意識がわかる
* リージョンとアベイラビリティゾーンの関係を説明できるか。使用箇所の選定基準を持っているか
    * ちゃんと使っていたのかどうかがわかる
    * コスト意識がわかる
* VPC でパブリックサブネットとプライベートサブネットの違いを説明できるか
    * ネットワークがなんとなくでもわかるレベルなのかがわかる
    * 特定の要件によってオールパブリックでしかやっていないケースは許容範囲（理由が説明できること）
    * subnet をどう区切るかを説明できるか
* 使ったことのある（管理可能な）AWSのサービス名を列挙してもらう
    * 自社で必要のないサービスは挙がらなくても構わない
        * Workspaces とか Snowball とかちょっと特殊な用途ですし
    * 逆に必要なサービスが挙がってこない場合は聞いてみること
        * EC2 や ELB はもちろん ElastiCache,RDS,R53,CloudFront,ACM,WAF,S3,Glacier くらいは Web 系なら使っていて欲しい
        * 実際自前でテストでこれらを使っても数百円から数千円未満で十分勉強できます
        * Lambda や API Gateway とかである程度遊んでいます、な人については、本当に写経で遊んだだけのタイプと自分の作業に組み込んでる人の二系統あると思うので注意
        * ここ数年 docker に対する注目度が高いので必要なら確認
* AWSに関する情報の仕入先
    * <a href="https://aws.amazon.com/jp/documentation/">本家ドキュメント</a>や<a href="https://aws.amazon.com/jp/blogs/news/">AWSブログ</a>, <a href="http://aws.typepad.com/sajp/">ソリューションアーキテクトブログ</a>は当然として、APN企業のテックブログ、海外ブログなど

# 具体的なシステム構成について

* これまでの経験から、もっとも理解できているシステム構成についてAWSで実現するとどのような構成になるか
* 自社で必要なサービス形態に合わせたシステム構成の場合はどうか
    * Webサービス企業なら、3Tier, LAMPなどの構成図をその場で書いてもらう
* あなたが考える理想的なサービスのシステム構成図を書いてもらう
    * 注目すべき要件を考えておく
        * 今後は（iOSの）ATS のおかげで https が必須になるので、ACM を理解しているかどうか
        * CloudFront （CDN）の導入パターンをどのくらい理解しているか
        * RDS や ElastiCache をどのくらい理解しているか
        * ログをどのように扱うか
        * CI （Jenkinsやcapistranoなど）をどのように組み込むか
        * SPOF が残らないか
        * オートスケーリングをどのように扱うか
        * セキュリティはどうか
        * バックアップはどうか
        * マイクロサービスやサーバーレスについて

# あとがき

* 実際、人材派遣会社から紹介されるインフラエンジニア（笑）の８割は図面がまともに引けない（個人的な主観です）
* もちろんこれらに完全に答えられる人材はそうそう市場に出回らない（と思う）
* 大事なことは完璧に答えられるかどうかよりも人となりだし、自社に合うか合わないか、が優先されないとお互い不幸になることに注意する
* このリストはあくまでクラウドインフラエンジニアとしての経験値や勉強量を測るためのものさしに過ぎない
* もっとこういうこと聞くといいとか、こんな聞き方があるとかを教えてもらえるとうれしいです
Markdownでtable作ってもうまく表示できない時

# Atomでは表示できたのに
Atomはtableを以下のように書いてもMarkdown Previewで表をうまく表示できます。

```markdown:README.md
|Title|Type|Description|
|:-|:-|:-|
|table|string|テーブルを表示したい|
```

しかしこれだと、GitHubではうまく表を表示してくれません。Qiitaでも表示してくれないみたいですね。
[Markdown Cheatsheet](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#tables)によれば、
tableを書きたいときはヘッダーのそれぞれのセルに最低3つダッシュが必要だそうです。

```markdown:README.md
|Title|Type|Description|
|:---|:---|:---|
|table|string|テーブルを表示したい|
```
これでGitHubやQiitaでも表を表示できるようになります！

|Title|Type|Description|
|:---|:---|:---|
|table|string|テーブルを表示したい|

# 参考サイト
[Markdown Cheatsheet · adam-p/markdown-here Wiki](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#tables)
Pythonのバージョンを切り替える


インストールできるバージョンの確認
`pyenv install --list`

バージョンのインストール
`pyenv install 3.5.0`

切り替えれられるバージョンの確認
`pyenv versions`

現在のバージョンの確認
`python --version`

バージョンの切り替え
>globalにすると全体に、localにするとそのディレクトリに指定したバージョンが反映される

`pyenv global 3.5.0`
`pyenv local 2.7.10`
Pythonのリスト操作

#### リストの結合 => extend()
|書き方|内容|
|---|---|
|s.extend(t)|オブジェクトsにtの内容を追加する|
|s += others|s.extend(others)と同じ結果になる|

#### 指定した位置に要素を追加 => insert()
|書き方|内容|
|---|---|
|s.insert(i,x)|オブジェクトsのi(インデックス)で指定した位置にxを挿入する|

#### インデックスで指定した要素を削除する => del
|書き方|内容|
|---|---|
|del s[i:j]|インデックスiからjまでの要素を削除する|

#### 位置がわからない要素を削除する => remove()
|書き方|内容|
|---|---|
|s.remove(x)|sからxに合致する最初の要素を取り除く|

#### 要素のインデックスを知る => index()
|書き方|内容|
|---|---|
|s.index(x)|sの中でxが最初に出現するインデックスを返す|

#### その値はあるか => in
|書き方|内容|
|---|---|
|x in s|オブジェクトsの要素にxがあればTrue、なければFalseを返す|

#### その値はリストにいくつあるか => count()
|書き方|内容|
|---|---|
|s.count(x)|sの中にxが出現する回数を返す|

#### 要素の並び替え => sort()
リスト(list)オブジェクト専用のメソッドで要素の並び替えを行う

|書き方|内容|
|---|---|
|s.sort()|sの要素を昇順で並び替える|
|s.sort(reverse=True)|sの要素を降順で並び替える|

#### リストのコピー
```
a = [1,2,3]
b = a
print(b)
a[0] = 'ほげほげ'
print(a)
print(b)
```
結果

```
[1,2,3]
['ほげほげ',2,3]
['ほげほげ',2,3]
```
リストaに対する操作はリストbにも反映されている　→　"参照の代入"

"リストの本物のコピー"を作成するには

* copy()メソッドを使う
* list()関数を使う
* リストをスライスして新しいリストを作る

```
a = [1,2,3]
b = a.copy()
c = list(a)
d = a[:]
a[0] = 'ほげほげ'
print(a)
print(b)
print(c)
print(d)
```
結果

```
['ほげほげ',2,3]
[1,2,3]
[1,2,3]
[1,2,3]
```
[Ruby + Heroku]LINE Message API 天気予報Bot 

# はじめに
Ruby勉強中で、何かを作りたかった。
そこで、流行りのLINE Message APIを使い、簡単なWebアプリを作る事にした。

# 1.概要
公式リファレンスに記載されている、天気予報を表示するBotを作成してみました。

# 2.環境
Ruby 2.3.0
Heroku 
Amazon S3　※画像ファイル配置
Weather Hacks API

# 3.成果物
(1)都道府県名を入力した場合
<img src="https://s3-ap-northeast-1.amazonaws.com/qiita-private/S__36372576.jpg" width=30%>

(2)都市を選択した場合
<img src="https://s3-ap-northeast-1.amazonaws.com/qiita-private/S__36372577.jpg" width=30%> <img src="https://s3-ap-northeast-1.amazonaws.com/qiita-private/S__36372586.jpg" width=30%>

(3)スタンプを送った場合
<img src="https://s3-ap-northeast-1.amazonaws.com/qiita-private/S__36372578.jpg" width=30%>

動かしてみたい方用
<img src="https://s3-ap-northeast-1.amazonaws.com/qiita-private/plw0185s.png" width=15%>

# 4.ソースコード
GitHub ifufhrjeijg/line-weather-botで公開しています。

(1)postback判定

```ruby:main.rb
  events.each { |event|
    case event
    when Line::Bot::Event::Message # Messageの場合
      case event.type
      when Line::Bot::Event::MessageType::Text # Textの場合
        message = get_city_list(event.message['text'])
      else # Text以外の場合
        message = get_desc_message
      end
    when Line::Bot::Event::Postback # Postbackの場合
      city = event['postback']['data'].split("=")[1]
      message = get_wheather_forecast(city)
    else # Message, Postback以外の場合
      message = get_desc_message
    end
```
Messageイベント判定と同階層で、Postbackイベントの判定を入れている。

# 参考
公式リファレンス：https://devdocs.line.me/ja/
公式ライブラリ：https://github.com/line/line-bot-sdk-ruby
フリー素材：http://www.irasutoya.com

# 最後に
初投稿で、何を書くべきかよく分かりませんでした。
ただ、この記事が何かしら参考になったら幸いです。
マルチモジュールのプロジェクトで指定したサブモジュールだけビルド

忘れがちなのでメモ。
親プロジェクトのディレクトリに移動してから以下のコマンドを実行する。

```
mvn install -pl ${sub_module_name} -am
```

##### オプション説明
|short option|long option|description|
|:--|:--|:--|
|-pl|--projects|プロジェクト名を指定してビルドする|
|-am|--also-make|依存するモジュールも一緒にビルドするオプション|

##### 参考リンク
http://stackoverflow.com/questions/1114026/maven-modules-building-a-single-specific-module
[BigQuery]メタデータ更新も割当ポリシあるよ

https://cloud.google.com/bigquery/quota-policy

BigQueryでは、テーブルやデーターセットの属性（詳細、ラベル、スキーマなど)を変更するためのAPIを公開している。
現在のBigQueryの日本語版ドキュメントには、そのようなメタデータ更新については、1秒に100APIリクエスト制限以外はなさそうに見える。
しかし、英語に切り替えると以下の表記がある。

---

Metadata operations

The following limits apply to metadata operations:

- Maximum rate of metadata operations on datasets: 1 operation every 2 seconds (insert, patch, update).
- Maximum rate of metadata operations on tables: 1 operation every 2 seconds (insert, patch, update, jobs output).

---

メタデータ操作に関する上限は以下です:

- データセットに対して、2秒間の間に1操作 (挿入、パッチ、更新)
- テーブルに対して、2秒間の間に1操作 (挿入、パッチ、更新)

メタデータでバンバン更新がかかるということはないとは思いますが、メタデータ更新のAPIを何度も呼ぶような状態になっていたら、直したほうが良いですね。私は、これに引っかかりました。
あと、今回の教訓として英語版のドキュメントから読もうと思いました。。。ブラウザの言語を英語に変えよう。。
Mac,Windows環境でのGamePad環境構築

＜環境＞
・windows10 / Mac OSX Yosemite
・XBoxコントローラー

①AssetStoreから"Gamepad Input"を入れる
https://www.assetstore.unity3d.com/jp/#!/content/10242
→Windowsの人はこれだけでいけます。

②【MacOSのみ】こちらのサイトから"360Controller"をダウンロード/インストール
https://github.com/360Controller/360Controller/releases

③【MacOSのみ】
Gamepad InputのGamePad.cs:GetKeycode(Button button, Index controlIndex)のreturn値をMac用に設定するか用意する
※以下XBoxコントローラーのデフォルト設定値を見ながらソースを変更していく

```ruby:GamePad.cs
#if UNITY_STANDALONE_OSX
// OSX
case Button.A: return KeyCode.Joystick1Button16;
#else
// Windows&Any
case Button.A: return KeyCode.Joystick1Button0;
#endif
```

＜XBoxコントローラー＞
X axis: 左スティック・左右
Y axis: 左スティック・上下
3rd axis: 右スティック・左右
4th axis: 右スティック・上下
5th axis: 左トリガー
6th axis: 右トリガー

joystick button 5: 十字キー上
joystick button 6: 十字キー下
joystick button 7: 十字キー左
joystick button 8: 十字キー右
joystick button 9: STARTボタン
joystick button 10: BACKボタン
joystick button 11: 左スティック押し込み
joystick button 12: 右スティック押し込み
joystick button 13: ショルダー左
joystick button 14: ショルダー右
joystick button 15: Xboxボタン
joystick button 16: Aボタン
joystick button 17: Bボタン
joystick button 18: Xボタン
joystick button 19: Yボタン
【C#】Where(it => it is Xxx).Select(it => it as Xxx)って書かず、OfType使おう！【LINQ】

```csharp
UnityEngine.Object[] selectingObjects = Selection.objects;
Texture2D[] textures = selectingObjects
    .Where(it => it is Texture2D)
    .Select(it => it as Texture2D)
    .ToArray();
```

　このコードでは、`Where`でTexture2Dなインスタンスだけになるよう選択して、`Select`の中で要素をキャストして射影していますね。

　実は`Where`と`Select`二つのメソッドを書かずとも、C#では`OfType`メソッド一つを使って次のように簡潔に書くことが可能です。

```
UnityEngine.Object[] selectingObjects = Selection.objects;
Texture2D[] textures = selectingObjects
    .OfType<Texture2D>() // WhereとSelect二つもいらない、OfTypeでOK
    .ToArray();
```

　このように、`OfType`メソッド使えば、もとのシーケンス(`IEnumerable<UnityEngine.Object>`)に型引数を指定して、Texture2Dのインスタンスのみのシーケンス、`IEnumerablet<Texture2D>`にすることができます。

　`Where(it => it is Xxx).Select(it => it as Xxx)`って書かずに、`OfType`使いましょう！！！
Atomのkeymap重複の解消


## Atom
[Atom](https://atom.io)はGitHubの創業者Chris Wanstrath氏が「Web技術を用いて、Emacsのように自由にカスタマイズできる新世代のエディターを開発する」という思いから始まったオープンソースのエディターです。
AtomにはさまざまなPackage(拡張機能)がコミュニティによって、660種類のテーマ、2090種類のパッケージが作られているとのこと。

そんな便利なエディターであるAtomですが、好き勝手入れてしまうとキーマップが重複してしまい、せっかくのショートカットキーが利かなくなってしまいます。

自分は、GitをAtom上で操作できる[Git-Plus](https://github.com/akonwi/git-plus)とAtomでMarkdownのpreviewができる[markdown-preview-plus](https://atom.io/packages/markdown-preview-plus)のキーマップが重複してしまい最初はしかたなくショートカットキーなしでやっていたのですが、やはりめんどうだったのでキーマップの重複を解消する（別のキーマップに割り当てる）方法を調べたのでメモしておきます。

## Keymapの重複を解消

まず、`Ctr+.` でKey Binding Resolver というものを開きます。
これは現在どのショートカットキーが使われているか調べることができます。

例えば、デフォルトではGit-Plusのコミットも、markdown-preview-plusのLaTeXレンダリングも`Ctrl+Shift+X` が割り当てられているので、Key Binding Resolverが開いている状態で、`Ctrl+Shit+X`を押すと

> markdown-preview-plus:toggle-render-latex ・・・ \packages\markdown-preview-plus\keymaps\markdown-preview.cson
> git-plus:commit ・・・ \packages\git-plus\keymaps\git-plus.cson

というような表示が出てきます。
これは現在 `Ctrl+Shit+X`のショートカットキーにmarkdown-preview-plusのtoggle-render-latexと、git-plusのcommitが割り当てられていることを意味しており、最後の`〇〇.cson`というファイルに割り当てられたkeymapが書かれています。
緑色がアクティブなショートカットで、グレーがアクティブでないものです（たぶん）。

なので、このcsonファイルを編集してしまえばオールオッケーです。

といっても多くのPackageを入れていると空いてるキーマップが何なのかすらわからないですよね。
そんなときはSettingsのKeybindingsで目的のショートカットキーを打つと重複しているか調べられます。

基本的にはkeymap.sconを編集してオーバライドすれば良いのですが、書式が良くわからない場合はパッケージごとのkeymapsファイルのショートカットキーを編集します。
たとえば重複していらない場合はコメントアウトするか値を`unset!`とします。

キーマップの編集が終わったら保存して再起動し、ショートカットキーが利いていれば完了です。
Advent Calendarってなに？

# Advent Calendarってなに？

### Advent Calendar（アドベント カレンダー）ってなに？
* [「Qiita Advent Calendar 2016」の募集が始まりました](http://blog.qiita.com/post/152366526084/adventcalendar2016)
* 12月1日～12月24日までの間、テーマに沿った記事を投稿したり投稿を予約したりする
* 元々はアメリカの風習で、クリスマスまでの日を数えるのに使ったんだとか
* ようはみんなで記事を書いてテーマを盛り上げようっていうイベント

### 何故今更こんな記事を書いているのか
* 知らなかったから
* 記事にしようとしていたアイデアが空振ったけど、何か記事が書きたかったから

### どんなテーマがあるの？
* [Advent Calendar 2016](http://qiita.com/advent-calendar/2016)
* 今あるテーマだけでなく、自分でテーマの登録もできる
  * 当たり前だけどQiitaのAdvent Calendarだからプログラミング関係だけだよ
  * 「筋肉」とか「ポエム」とか「初老丸」とかあるけど多分気のせい
* 気になる言語や技術のカレンダーを購読しておくと通知が来るよ

### どう使うべきか（投稿・閲覧）
* メインとする（もしくはメインとせざるを得ない）言語・技術について
* 使ったことはないけど興味がある言語・技術について
* メインとする言語・技術を他の言語・技術と比較した結果について
* 先に投稿されている記事に対する感想・補足・ツッコミについて
* よく使うツールやサービスについて
* 作ったツールやサービスについて
* 変な名前の言語・技術・ツール・サービスについて
* その他

### 自分は何をするつもりか
* 何か記事が書けそうなテーマがないか探してみる
* 書くとしても基本休日がメインなのでそれを踏まえたスケジュールにする
* 年末の忙しさが怖いので出来る限り予約投稿するのを目指す

---

### あとがき
* たまに名前は見てたけど何のことだったか分からなかったので書いてみた
* 自分は思いついたらガーっと書いて投稿がメインなので、ちょっと噛み合ってないかも
* 全然関係ないけどこの間LoFt行ったらAdvent Calendarの実物があった
Unity&WindowsでEditor使用時ボタンが押せなくなる不具合

※初投稿テストも兼ねて

発生環境
・Unity5.3.2
・Windows7

Editor起動後、uGUIのボタンが押せなくなる不具合が発生
起動後1回目は通常で動作し
2回目以降に発生

原因がよく分からない
数列の和を計算するアルゴリズム

数列の和の計算にアルゴリズムなんて考える余地はあるのか？と思ったが、誤差についても考える場合、単純な方法以外にも複数のアルゴリズムが存在し使われているということを教えてもらった。

- [https://en.wikipedia.org/wiki/Kahan_summation_algorithm:title]
- [https://en.wikipedia.org/wiki/Pairwise_summation:title]

Kahan summation はより高い精度を達成できるが、pairwise summation のほうが高速である。NumPy の sum では pairwise summation algorithm が使われているようだ。

- [https://github.com/numpy/numpy/blob/88a66d8d0464caf57f40cf85a24156042e7ff0d7/numpy/core/src/umath/loops.c.src#L1524:title]

ちなみに、分散を計算する際には専用のアルゴリズムもある。

- [https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Online_algorithm:title]
複数の検索結果の差集合を取得する


レコードの引き算を行なう場合は MINUS を使用します。こちらも構文の形式は UNION と同じです。

複数の検索結果の差集合を取得するにはEXCEPT句もしくはMINUS句を使用します．どちらの構文を使用するかはお使いのDBMSによって異なります。また残念ながらAccessとMySQLには対応する構文はサポートされていません。以下に各DBMSごとに使用可能なSQLを示します。

|DBMS|SQL|
|:-----:|:-----:|
|Access|対応していない|
|SQLServer|EXCEPT|
|Oracle|MINUS|
|MySQL|対応していない|
|PostgreSQL|EXCEPT|


### サンプル

従業員

|従業員コード|従業員名|
|:-----:|:-----:|
|A0001|チャーリー|
|A0002|ペパーミント|

受給者

|受給者コード|受給者名|
|:-----:|:-----:|
|A0001|チャーリー|
|B0001|スヌーピー|
|B0002|ウッドストック|

SQL

```SQL
SELECT * FROM 従業員
MINUS
SELECT * FROM 受給者
```

結果

|従業員コード|従業員名|
|:-----:|:-----:|
|A0002|ペパーミント|
複数の検索結果の共通するデータを取得する（積集合）


2 つのレコード集合の共通部分を選択する場合は、INTERSECT を使用します。構文の形式は、UNION と同じです。


```sql
SELECT 列名1, 列名2, ... FROM テーブル名
INTERSECT
SELECT 列名1, 列名2, ... FROM テーブル名
```


### サンプル


従業員

|従業員コード|従業員名|
|:-----:|:-----:|
|A0001|チャーリー|
|A0002|ペパーミント|

受給者

|受給者コード|受給者名|
|:-----:|:-----:|
|A0001|チャーリー|
|B0001|スヌーピー|
|B0002|ウッドストック|

SQL

```SQL
SELECT * FROM 従業員
INTERSECT
SELECT * FROM 受給者
```

結果

|受給者コード|受給者名|
|:-----:|:-----:|
|A0001|チャーリー|
ThriftでPython3にコンパイルするまでの道のり

Thriftがpython3に対応してなくね?と思ったので調べてみました。

https://issues.apache.org/jira/browse/THRIFT-1857
あれ? Issueは fixed, closed になっているがこれは…。

よくて見てみるとver 0.10.0では対応していますが、最新版のリリースが現状(2016/11/23現在)では0.9.3なので、python3にコンパイルできないと。
最新版をチェックアウトするしかなさそうですね…。

###チェックアウト

    git clone https://github.com/apache/thrift.git
    git branch -a  //存在するbranchの確認
    git checkout -b 0.10.0 remotes/origin/0.10.0

###makeする時に必要になるものをInstall
ここの"Requirements for building from source"ってとこ全部
http://thrift.apache.org/docs/install/

    sudo apt-get update
    sudo apt-get install libboost-dev libboost-test-dev libboost-program-options-dev libboost-filesystem-dev libboost-thread-dev libevent-dev automake libtool flex bison pkg-config g++ libssl-dev

###あとはREADME通りに
https://github.com/apache/thrift/tree/0.10.0

    ./bootstrap.sh
    ./configure
    sudo make
    sudo make install

###動作確認
####Thriftインストールの確認
    
    thrift -version
"Thrift version 0.10.0"とプリントされたらインストールは成功です。


    thrift -r --gen py test.thrift

無事"py-gen"のディレクトリが作成されました!
python3.5からimportもできました。

なんというか…python3への道はまだまだ遠いなと感じました。

補足
------------------------------
thriftpyというものを使ってもpython 3系に対応できるみたいです。
https://github.com/eleme/thriftpy

0.10.0のリリース版がいつ出るかは分かりませんが、python3にコンパイルすることだけが目的なら
使わなくてもいい気がするかなーとは個人的には思います。