OmniAICreator/Qiita-1.07M huggingface dataset:
GASで作ったグラフをSlackに投稿する

# GoogleAppScriptで作ったグラフをSlackに投稿する

毎日自動で更新されるgasのグラフを、トリガーを指定してSlackにPOSTします。


```js

var slack = {
  postUrl: 'https://slack.com/api/files.upload',
  token: // Slackのtoken
  channelId: // SlackのチャネルのID
  fileName: "グラフ.jpeg" //ファイルの名前
}

var uploadFile = function(data){
  UrlFetchApp.fetch(slack["postUrl"], {
    "method" : "post",
    "payload" : {
      token: slack["token"],
      file: data,
      filename: slack["fileName"],
      channels: slack["channelId"]
    }
  });
}

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var chart = sheet.getCharts()[0];
  uploadFile(chart.getAs("image/jpeg"));
}
```

botは画像の投稿を行うことができないみたいなので、Slack側からはSlackのトークンを取得したユーザが投稿しているように見えます。

GAS上ではマウスオーバーでグリグリに動くグラフですが、ここではjpegで取得して投稿するので、その機能はなくなります。
Raspberry Pi 2で照度センサーTSL2561をシンプルに使うメモ

照度センサーTSL2561のI2C対応モジュールを使おうと思って調べると、いろいろ面倒くさかったりします。いくつものPythonモジュールに依存していたり、サンプルプログラムがなぜか何百行にもなってたりして。

http://qiita.com/masato/items/1dd5bed82b19477b45d8
http://shimobayashi.hatenablog.com/entry/2015/07/27/001708

I2C対応のセンサーなら、smbusモジュールだけでシンプルに書けるはず、と思って書いてみました。

https://github.com/aike/SimpleTSL2561.py

```py:SimpleTSL2561.py
#!/usr/bin/python
#
# SimpleTSL2561.py by aike
# licenced under MIT License. 
#

import smbus
import time

class SimpleTSL2561:

    def __init__(self, address=0x39):
	self.bus = smbus.SMBus(1)
	self.address = address
        self.write8(0x80, 0x03)     # 0x03=PowerON 0x00=PowerOFF

    def write8(self, reg, value):
        try:
            self.bus.write_byte_data(self.address, reg, value)
        except IOError, err:
            print "IO Error"

    def readU16(self, reg):
        try:
            result = self.bus.read_word_data(self.address,reg)
            return result
        except IOError, err:
            print "IO Error"
            return 0

    def setParam(self, param):
	#  param   gain   integral
	#    0      x 1   13.7 ms
	#    1      x 1    101 ms
	#    2      x 1    402 ms  (default)
	#    3     x 16   13.7 ms
	#    4     x 16    101 ms
	#    5     x 16    402 ms
	if param >= 3:
	    param = param - 3 + 16
	self.write8(0x81, param)

    def readData(self):
        return self.readU16(0xAC)

if __name__ == "__main__":
	tsl = SimpleTSL2561()
	while True:
		print tsl.readData()
		time.sleep(1)
```


# 複雑になる原因
なぜサンプルプログラムが複雑になるのか、データシートを読んだりして調べてみました。

## TSL2561が多機能
・可視光と赤外線の両方を検知することができる
・感度を1倍と16倍の２種類選ぶことができる
・積分時間を13.7ms/101ms/402msから選ぶことができる

## TSL2561のデータ仕様が特殊
・取得データの値がルクスの値と比例しておらず、場合分けした変換係数が必要
・TSL2561には大別してT、FN、CLの系列とCSの系列の２種類あって両者の係数が異なる

そんなわけで、すべてのTSL2561に対して正確なルクス値を取得できるプログラムは、それなりの行数になります。手持ちのハードウェアに対応するだけなら2種類の変換処理は不要で1種類だけで大丈夫です。
そもそも、よくある「暗くなったら電気をつける」といった用途であれば、可視光のみとして、ルクス値の変換処理も省略可能なので、上記のプログラムのように短く書けます。

あと、Adafruit_I2C.pyはsmbusの薄いラッパーなので、なくてもなんとかなります。
DogStatsD(Datadog)でUTF-8文字列を送る場合


APIやfluendで[こちら](https://github.com/ryotarai/fluent-plugin-dogstatsd)のPluginを使ってローカルのDogStatsDに対してEvent形式で送信する場合、デフォルトだと以下の様なエラーが発生する

```
2016-02-17 22:14:54 JST | ERROR | dd.dogstatsd | dogstatsd(dogstatsd.py:174) | Error flushing metrics
Traceback (most recent call last):
  File "/opt/datadog-agent/agent/dogstatsd.py", line 144, in flush
    self.submit_events(events)
  File "/opt/datadog-agent/agent/dogstatsd.py", line 202, in submit_events
    self.submit_http(url, json.dumps(payload), headers)
  File "/opt/datadog-agent/embedded/lib/python2.7/site-packages/simplejson/__init__.py", line 370, in dumps
    return _default_encoder.encode(obj)
  File "/opt/datadog-agent/embedded/lib/python2.7/site-packages/simplejson/encoder.py", line 269, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/opt/datadog-agent/embedded/lib/python2.7/site-packages/simplejson/encoder.py", line 348, in iterencode
    return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe5 in position 105: unexpected end of data
```

デフォルトではパフォーマンスの問題で、UTF-8のデコードを行わない設定となっている模様

https://github.com/DataDog/dd-agent/pull/1279

設定変更はよく見ればわかるが、以下の様な所を変更する必要がある

```/etc/dd-agent/datadog.conf
# 大体131行目

# By default, dogstatsd supports only plain ASCII packets. However, most
# (dog)statsd client support UTF8 by encoding packets before sending them
# this option enables UTF8 decoding in case you need it.
# However, it comes with a performance overhead of ~10% in the dogstatsd
# server. This will be taken care of properly in the new gen agent core.
# utf8_decoding: false
utf8_decoding: true <-- # これでUTF-8デコード有効化
```

# 備考

上記で送信可能なようになるが、
もし `type: event` でログをペイロードとして載せている場合、
送信可能なペイロードに4000bytesの上限がある模様。
\# dd-agentのどこかにマジックナンバー的に制限が記載されてたはず

受付時にその辺のチェックをして切り落としてくれたりしないので、
fluentdを使う時はこんな感じにして切り落としてからDogstatsdに送ってる。

```
<match dd.event.error>
  type record_reformer
  tag reformed.dd.event.error
  renew_record false
  enable_ruby true

  <record>
    type event
    key production
    title production
    text ${message[0, 4000].gsub(/(\n)/, '')}
  </record>
</match>

<match reformed.dd.event.error>
  type dogstatsd

  host localhost
  port 8125

  use_tag_as_key false

  flat_tags true
</match>
```
Google Apps ScriptからTrello APIを使ってCardを作成する

前回に引き続き、Trello APIを使ってみようと思います！
Bordの情報を取得するところまで出来ましたので、今回はそのBordにListを追加、さらにそのListにCardを作成してみます。

# API KeyとAPI Tokenの取得する
前回の記事で取得したAPI KeyとAPI Tokenを使います。
[Google Apps ScriptからTrello APIを使ってみる](http://qiita.com/Andysumi/items/1608cefcb6daa672b49e)

プロジェクトの「スクリプトのプロパティ」に保存しておいて、コードを実行するときに取得するようにしてます。
![property.png](https://qiita-image-store.s3.amazonaws.com/0/53215/31e1800d-4e83-1ad4-ea29-544880df8185.png)

```lang:コード.gs
// スクリプトのプロパティからAPI KeyとAPI Tokenを取得
var scriptProp =  PropertiesService.getScriptProperties().getProperties();
var trelloKey = scriptProp.TRELLO_API_KEY;
var trelloToken = scriptProp.TRELLO_TOKEN;
var username = scriptProp.TRELLO_USERNAME;
```

# BordのIDを取得する
まず、Bordの一覧を取得します。

```lang:コード.gs
function getBoardList(){
  var url = 'https://api.trello.com/1/members/' + username + '/boards?key=' + trelloKey + '&token=' + trelloToken + '&fields=name';
  var options = {
    'method' : 'get',
    'muteHttpExceptions' : true
  }
  Logger.log(UrlFetchApp.fetch(url, options));
}
```

「id」を後ほど使うので控えておいてください。

```lang:ログ
{
    "id": "56a4a687a4e7ec9ab91da1d2", 
    "name": "Sandbox"
}
```

# Listを作成する
次に、BordにListを作成します。
APIの詳細は[API Reference](https://developers.trello.com/advanced-reference/board#post-1-boards-board-id-lists)を参照してください。

```lang:コード.gs
function addList(){
  var boardId = 'Listを作成するBordのID';
  var url = 'https://api.trello.com/1/boards/' + boardId + '/lists/?key=' + trelloKey + '&token=' + trelloToken;
  var options = {
    'method' : 'post',
    'muteHttpExceptions' : true,
    'payload' : {
      'name' : 'Test List',
      'pos' : 'top'
    }
  }
  Logger.log(UrlFetchApp.fetch(url, options));
```

ログを見てみると・・・うん、無事成功してますね。
Listの「id」を控えておきましょう！

```lang:ログ
{
    "closed": false, 
    "id": "56b89fad09c2dca2ee0abb74", 
    "idBoard": "56a4a687a4e7ec9ab91da1d2", 
    "name": "Test List", 
    "pos": 16384
}
```

# Cardを作成する
いよいよ最後に先ほど作成したListにCardを作成しましょう！
APIの詳細は[API Reference](https://developers.trello.com/advanced-reference/card#post-1-cards)を参照してください。

```lang:コード.gs
function addCard(){
  var listId = 'Cardを作成するListのID';
  var url = 'https://api.trello.com/1/cards/?key=' + trelloKey + '&token=' + trelloToken;
  var options = {
    'method' : 'post',
    'muteHttpExceptions' : true,
    'payload' : {
      'name'      : 'Test',
      'desc'      : 'This is test.',
      'due'       : '',
      'idList'    : listId,
      'urlSource' : ''
    }
  }
  Logger.log(UrlFetchApp.fetch(url, options));
```

実行！ポチッとな。
どうでしょう？

![card.png](https://qiita-image-store.s3.amazonaws.com/0/53215/ae8939a9-a36b-2b1d-c79f-094c4666352c.png)

無事にCardの作成が出来ました。
CentOS6系でglibc脆弱性(GHOST)対策やった

# はじめに

## glibc脆弱性(GHOST)の概要
> 遠隔の第三者によって、任意のコードを実行されたりサービス運用妨害 (DoS) 攻撃が行われたりするなどの可能性があります。
http://jvn.jp/vu/JVNVU99234709/ より引用

## とりあえず
怖いので対応しました。
とあるサービスでCentOS6系使っていたので今回はその手順メモです。

# 対応方法

#### ①yum のキャッシュを削除

```
yum clean all
```

#### ②glibcのUPDATE

```
yum update glibc
```

#### Tips
自分の場合、このタイミングで以下のエラーが出ました。

```
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
```

解決策として、epelの証明書のアップデートが必要だったのでアップデートしました。

```
yum upgrade ca-certificates --disablerepo=epel
```

#### ③サーバー再起動

```
reboot
```

おわり
glibc CVE-2015-7547 dnsmasqで何とかできるか？ 


# 参考
Googleの記事
https://googleonlinesecurity.blogspot.jp/2016/02/cve-2015-7547-glibc-getaddrinfo-stack.html

PoC
https://github.com/fjserna/CVE-2015-7547

iptableで
http://qiita.com/kawaz/items/1b07429b28851f997dba

>
Google has found some mitigations that may help prevent exploitation if you are not able to immediately patch your instance of glibc. The vulnerability relies on an oversized (2048+ bytes) UDP or TCP response, which is followed by another response that will overwrite the stack. Our suggested mitigation is to limit the response (i.e., via DNSMasq or similar programs) sizes accepted by the DNS resolver locally as well as to ensure that DNS queries are sent only to DNS servers which limit the response size for UDP responses with the truncation bit set.


# dnsmasqでどうやんのか？
dnsmasqに2048byte以上のレスポンスを叩き切る機能は多分ない(俺の調べが足らんかも)。じゃあどうやってやんのか、試してみたら `ただ単にdnsmasqをかましてやればそれだけでOK` ポイことが分かった。たぶん

# 検証方法
1. 上記のPoCを `git clone` そんで　make
2. そのまんまの状態で、サーバサイド(.py) と クライアントサイドを動かして、セグメンテーションフォールト出るのを確認 (詳細は他の人の見て！)
3. dnsmasqをインストールして設定追加
4. サーバサイドが port:53 決め打ちなので、 1053とかにずらす
5. dnsmasq経由で突っついて試してみる

## dnsmasqの設定
```dnsmasq.conf
server=/google.com/127.0.0.1#1053
```
どっかにぶち込む

## CVE-2015-7547-poc.py 変更
ポートを 53->1053へ置換

## CVE-2015-7547-client.c 変更
```c:
int
main(void)
{
        struct addrinfo hints, *res;
        int r;

        memset(&hints, 0, sizeof(hints));
        hints.ai_socktype = SOCK_STREAM;

        if ((r = getaddrinfo("google.com", "80",
            &hints, &res)) != 0)
                errx(1, "getaddrinfo: %s", gai_strerror(r));

        return 0;
}

```
## 結果
とりあえず digで叩く。ちなみにdigは getaddrinfo()はコールしてない、ちゃんとソース読んだ、`マジ俺真面目`。 nslookup も host も同じ、ぜんぶ bind-utilsのお仲間

```bash:
# dig google.com
[UDP] Total Data len recv 39
00 00 0d 00 04 44 44 44 44 c0 0c 00 01 00 01 00          .....DDDD.......
00 00 0d 00 04 44 44 44 44 c0 0c 00 01 00 01 00          .....DDDD.......
00 00 0d 00 04 44 44 44 44 c0 0c 00 01 00 01 00          .....DDDD.......
00 00 0d 00 04 44 44 44 44                               .....DDDD
```
セグフォは出ないが、バイナリがまんま出る。これ見る限り、2048以下にカットしてるわけではなさ気。

つづいて、クライアントアプリで叩く

```bash:
# ./CVE-2015-7547-client
[UDP] Total Data len recv 28
[UDP] Total Data len recv 28
Connected with 127.0.0.1:40195
[TCP] Total Data len recv 30
[TCP] Request1 len recv 28
... 待たされる
```
セグフォは出ない！が、待たされる。これはどうなんだろうか。まあ、クラックされるよりはいいかと。

# なぜダイジョブなのかは正直わからない
パケットキャプチャ、だれかやって。
各社CDN料金まとめ（国内向け）

自分用のメモ。

料金を公開しているところのみです。AkamaiさんとかCDNetworksさんとかは、料金非公開というか、契約次第であってないようなものなので対象外です。定額制のところも対象外。あと、社内の稟議とか決済通せそうなところだけにしています。

**※全てGB単価です**

|データ量|[Amazon<br>CloudFront<br>日本](https://aws.amazon.com/jp/cloudfront/pricing/)|[Azure<br>Content Delivery Network<br>Standard ゾーン2](https://azure.microsoft.com/ja-jp/pricing/details/cdn/)|[NTT Com<br>Cloudn CDN](http://www.ntt.com/business/services/cloud/iaas/cloudn/price.html#price_cdn)|[IIJ GIO<br>コンテンツアクセラレーション](http://www.iij.ad.jp/biz/acceleration/price.html)|[KeyCDN<br>Asia](https://www.keycdn.com/pricing)|[fastly<br>Asia-Pacific](https://www.fastly.com/pricing)|[IDC Frontier<br>コンテンツキャッシュ](https://www.idcf.jp/cloud/cache/)|
|---|---|---|---|---|---|---|---|
|200GBまで|0.114USD|0.129USD|1,500円<br>※定額|15円|0.10USD|0.19USD|9円|
|200GB超えた分|0.114USD|0.129USD|12円|15円|0.10USD|0.19USD|9円|
|10TBまで|0.114USD|0.129USD|12円|15円|0.10USD|0.19USD|9円|
|50TBまで|0.089USD|0.121USD|12円|15円|0.08USD|0.14USD|9円|
|100TBまで|0.086USD|0.112USD|12円|15円|0.05USD|0.14USD|9円|
|150TBまで|0.086USD|0.112USD|12円|15円|0.05USD|0.14USD|6円|
|500TBまで|0.084USD|0.093USD|12円|15円|0.03USD|0.14USD|6円|
|1PBまで|0.080USD|0.075USD|12円|15円|要問合せ|0.14USD|6円|
|5PBまで|0.070USD|0.065USD|12円|15円|要問合せ|0.14USD|6円|
|5PB超えた分|0.060USD|要問合せ|12円|15円|要問合せ|0.14USD|6円|
|最終更新|2018/09|2018/12|2016/2|2014/5|2020/6|2015/5|2015/7|
Unity初心者勉強サイトまとめ

## はじめてのUnity 玉転しゲーム
https://github.com/unity3d-jp/FirstTutorial/wiki

Unityの公式チュートリアル1
Unityダウンロードしたらまずこれ．

## 2Dシューティングゲーム
https://github.com/unity3d-jp-tutorials/2d-shooting-game/wiki

Unityの公式チュートリアル2
ゲームの構造，スクリプトの勉強になります．

## TEMPRUN
https://github.com/unity3d-jp/TEMPRUN

アニメーションが学べます．

## 動画で学べるチュートリアル
http://unity3d.com/jp/learn/tutorials

英語ですが，字幕がついているので大丈夫．
多すぎてどれをやっていいのか分からないと思います．

**トピック**
「Scripting」->「Beginner Gameplay Scripting」の項目を見て
Unityのスクリプトの書き方を学び，それをノートにまとめるといいでしょう．

動画はサッと倍速で見てからあとで1.25倍ぐらいでやることをお勧め．
<img width="2460" alt="速度変更Image.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/113504/a7e16d34-2fe9-adb3-f0b5-0c9eac5bda13.jpeg">
Arduino > delayMicroseconds() > 16383マイクロ秒以内の値を指定したとき、正確に動作します

http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2595
> 現在の仕様では、16383マイクロ秒以内の値を指定したとき、正確に動作します

https://www.arduino.cc/en/Reference/DelayMicroseconds
> Currently, the largest value that will produce an accurate delay is 16383. This could change in future Arduino releases. 

本家でも16383までとなっている。

16msec程度まではdelayMicroseconds()でもいけそうだ。
200msecの待ちは別処理が必要。　


関連　https://www.arduino.cc/en/Reference/Delay
Xcode7でテストカバレッジを表示する

タイトルままです。
Xcode6ぐらいまではいっぱい記事ありましたがXcode7のがぐぐっても出てこなかったので備忘録。

https://developer.apple.com/jp/documentation/ToolsLanguages/Conceptual/Xcode_Overview/CheckingCodeCoverage/CheckingCodeCoverage.html

公式はしっかり見ないと駄目ですね…。
HTTPoisonでプロキシを使用する

HTTPoisonライブラリでプロキシを通して使用する方法を調べたのでまとめます。

なお、HTTPoisonを試してみるにあたり、こちらの記事を参考にさせていただきました。
[naoya@githubさんの記事を試すには](http://qiita.com/HirofumiTamori/items/403b26d59f91c49a255b)
[ElixirのHTTPoisonライブラリの使い方](http://qiita.com/ColdFreak/items/4beb6cacfbb39baa955f)

# 事前準備
事前準備としてプロジェクトの作成～mix.exsの編集、依存モジュールの取得を行います。

```
> mix new httpoison_sample
* creating README.md
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/httpoison_sample.ex
* creating test
* creating test/test_helper.exs
* creating test/httpoison_sample_test.exs

Your Mix project was created successfully.
You can use "mix" to compile it, test it, and more:

    cd httpoison_sample
    mix test

Run "mix help" for more commands.

```
mix.exsは次の通りです。

```
def application do
  [applications: [:logger, :httpoison]]                                                                                                end

def deps do
  [{:httpoison, "~> 0.8"},
   {:poison, "~> 1.5"}
  ]
end
```

依存モジュールを取得して準備完了です。

```
> mix deps.get
[33mA new Hex version is available (0.10.4), please update with `mix local.hex`
[0m
Running dependency resolution
Dependency resolution completed
  certifi: 0.3.0
  hackney: 1.4.8
  httpoison: 0.8.1
  idna: 1.0.3
  mimerl: 1.0.2
  poison: 1.5.2
  ssl_verify_hostname: 1.0.5
* Getting httpoison (Hex package)
...

Using locally cached package
```

# 実装
lib/httpoison_sample.ex を次の通り編集します。

```
defmodule HttpoisonSample do
	def get_sample do
		url="http://api.openweathermap.org/data/2.5/weather?q=Tokyo.jp&appid=44db6a862fba0b067b1930da0d769e98"
		
		HTTPoison.start
		res = HTTPoison.get!(url ,[], [{:proxy,"http://proxyserver:8090"}])
		
		%{"weather" => weather} = Poison.decode!(res.body)
		%{"main" => main} = Enum.at(weather, 0)
		
		IO.puts main
	end
end

HttpoisonSample.get_sample

```

#実行結果
```
>mix run
Clouds
Compiled lib/httpoison_sample.ex
```

#補足
ポイントは[HTTPoison.get!/3](https://hexdocs.pm/httpoison/HTTPoison.html#get!/3)メソッドの
引数optionsにてプロキシサーバーやポート番号、プロキシ認証のユーザID/パスワードを指定することです。
ここは、キーワードリストで指定します。書式は、次の通り。
[{:proxy, "http://プロキシサーバー:ポート番号"},{:proxy_auth, {ユーザーID,パスワード}}]
Bootstrapで日付選択を行う




#bootstrap-datepicker
http://eternicode.github.io/bootstrap-datepicker/


![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/49910/407dca18-2ff4-0f2b-b030-1b9582b86db4.jpeg)


#js
```js
    $scope.inputDate = Date.now();
```


#html
```html
<script src="~/Scripts/bootstrap-datepicker-1.5.1/locales/bootstrap-datepicker.ja.min.js"></script>
<script src="~/Scripts/bootstrap-datepicker-1.5.1/js/bootstrap-datepicker.min.js"></script>

<input type="text" class="form-inline datepicker" placeholder="入力日" value="{{inputDate | date:'yyyy/MM/dd'}}" />

    <script type="text/javascript">
        $('.datepicker').datepicker({
            language: 'ja'
        })

    </script>

```
PHPでElasticSearch x kuromojiの形態素解析を行うサンプル


#概要
ElasticSearchとkuromojiプラグインの導入方法は[こちら](http://qiita.com/monhan/items/2926c0b1e50366b7cf49)をご参照ください。

要は、curlコマンドのコレをphpでやりたい。

```bash
$ curl -XGET "localhost:9200/_analyze?analyzer=kuromoji&pretty" -d "お寿司食べたい"
{
  "tokens" : [ {
    "token" : "寿司",
    "start_offset" : 1,
    "end_offset" : 3,
    "type" : "word",
    "position" : 2
  }, {
    "token" : "食べる",
    "start_offset" : 3,
    "end_offset" : 5,
    "type" : "word",
    "position" : 3
  } ]
}
```

#サンプルコード

だいぶ適当ですが。
ご参考までに。

```analyze_word_by_elasticsearch.php
<?php

/**
 * ElasticSearchとのやり取りをするクラス
 */
class ElasticSearchService
{
    /** 接続先のElasticSearchのURL & ポート */
    const BASE_URL = 'localhost';
    const PORT     = '9200';

    /**
     * リクエスト用のオプションを設定
     */
    protected function create_options($url, $body)
    {
        return array(
            CURLOPT_URL            => $url,
            CURLOPT_POST           => true,
            CURLOPT_POSTFIELDS     => $body,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HEADER         => true,
        );
    }

    /**
     * リクエストURLを生成
     */
    protected function create_request_url()
    {
        return self::BASE_URL.':'.self::PORT.'/_analyze?'.http_build_query(array(
            'analyzer' => 'kuromoji', // 形態素解析にkuromojiプラグインを利用する
            'pretty'   => true,
        ));
    }

    /**
     * リクエストを実行
     */
    protected function request($options)
    {
        $ch = curl_init();
        curl_setopt_array($ch, $options);
        $result      = curl_exec($ch);
        $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
        $header      = substr($result, 0, $header_size);
        $result      = substr($result, $header_size);
        curl_close($ch);

        return array(
            'Header' => $header,
            'Result' => $result,
        );
    }

    /**
     * 指定した文字列を形態素解析し、結果を返却する
     */
    public function analyze_word($text)
    {
        return $this->request($this->create_options($this->create_request_url(), $text));
    }
}

// 引数チェック
if ($argc < 2) {
    exit('引数に解析対象の文字列を指定してください');
}
$text = $argv[1];
$service = new ElasticSearchService();
// 実行 & 結果出力
print_r($service->analyze_word($text));
```

#実行
```
$ php analyze_word_by_elasticsearch.php お寿司食べたい
Array
(
    [Header] => HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: 257


    [Result] => {
  "tokens" : [ {
    "token" : "寿司",
    "start_offset" : 1,
    "end_offset" : 3,
    "type" : "word",
    "position" : 2
  }, {
    "token" : "食べる",
    "start_offset" : 3,
    "end_offset" : 5,
    "type" : "word",
    "position" : 3
  } ]
}

)
```
一応、[gist](https://gist.github.com/otajisan/2b5f82bd778e04e0fc23)にもあげときました。
私の現場での試行錯誤後のiOS開発方針

# はじめに
発表用メモです。

~~発表後、しばらくして消すかもしれません！~~
※ 追記:
誰かの参考になるかもしれませんので残しておきます。
また「これがベストプラクティス！」と考えている訳ではないですよー
あくまで現場での方針のいちサンプルとして見てください。


決断の積み重ね。
それはBad Know-how？それとも最適化した結果？

# 前提:
　iOSアプリプログラマ4人。
　iPadアプリのプロダクト3個。
　MRC(メモリマニュアル管理)の頃から継続開発。

# 本題:
チームでの方針:
1. 画面生成、コントロール生成、画面遷移はコードで行う
2. Storyboard使用しない
3. SizeClass使用しない
4. AutoLayout使用
~~5. オープンソース使用は控えめで、直接プロジェクトに追加~~
6. 基本的にviewDidLoadで画面レイアウト生成
7. 表示更新用メソッドを用意しそれを使用
~~8. 重い画面はviewDidAppearで(初回時のみ)レイアウト生成~~

※ 追記
発表後アドバイス受けました！
あらためて整理し考えなおしたら、8はやる必要なくてviewDidLoadで遅延実行の方が良いですね。
改善していきます！ありがとうございます。

※ 追記
オープンソース使用時はCocoaPods等パッケージマネージャを使うべきです。


# 某大手iOS開発会社のデザイナ兼エンジニアにヒアリング
・Storyboard、Xib使用
・SizeClass 使用していない
・AutoLayout ヘビーに使用している
・StoryBoardは1〜3画面につき1ファイル　厳密に決めていない
・コードでの画面系制御は本当に必要最低限にする

# 蛇足:
・正直に言うとdidReceiveMemoryWarningをきっちり実装した試しがない
・個人で作る場合、Storyboard使用するが"画面の器の置き場"
・個人で作る場合、CocoaPods経由でオープンソース使い倒し
・コードで画面コントロール生成することに対して全面賛成ではない
・SVProgressでロード中操作制御
・NSNotificationは使わない
・UIView、UIViewControllerの継承は控えめに

現在アプリ1つで40画面ほど。
継承している画面もあるが、手を入れる時に気が重くなる。
react-routerでcreateElementを使ってRouteのcomponentにpropsをねじ込む


```javascript
  const createElement = (Component, props) => {
    console.log(Component);
    return <Component hoge={'hoge'} {...props} />
  }
/// ...................
  <Router history={browserHistory} createElement={createElement}>
/// ...................
```

みたいにすると、Router以下のRouteが指定しているcomponentにpropsをねじ込めるっぽい。
できれば普通に参照したい。
Kotlinとlambda式とインターフェースとSAM変換

Kotlin 1.0 がリリースされましたね。
[Kotlin 1.0 リリース: JVMとAndroid向けの実用的(Pragmatic)言語 | JetBrains ブログ](http://blog.jetbrains.com/jp/2016/02/17/578)

Kotlin初心者が色々いじってたらlambda式がそのまま渡せない場所がいくつかあって、思ったようにいかない事があったのでそのときのメモです。


## SAM変換でインターフェイス名を書かなくていいのはJavaのメソッド呼出のときだけ

以下のようにJavaのメソッドを呼び出すときにlambda式がSAM変換されるのはよく紹介されています:

```kotlin
Optional.of("").orElseGet { "" }
```

ですが変数への代入の場合、以下はコンパイルエラーになります:

```kotlin
val sup: Supplier = { "" }
```

この場合は以下のように書く必要があります:

```kotlin
val sup: Supplier = Supplier { "" }
```

インターフェイス名を書く書式は https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions で紹介されています。


## KotlinのメソッドにJavaのインターフェイスを渡す場合は型を指定しないSAM変換がかからない

こんなメソッドがあるとします:

```kotlin
fun useJavaInterface(sup: Supplier<String>) = sup.get()
```

これは以下で呼ぶことができます:

```kotlin
useJavaInterface(Supplier { "" })
```

以下のように書く事はできません:

```kotlin
useJavaInterface { "" }
```

以下でもコンパイルエラーになります:

```kotlin
useJavaInterface({ "" })
```

変数への代入と同じ扱いという事なんでしょう。Javaのメソッド呼出だけが特別扱いされてるようです。


## KotlinのインターフェイスにはSAM変換がかからない

以下の一つだけメソッドを持ったインターフェースがあるとします:

```kotlin
interface I {
    fun x(): String
}
```

このインターフェイスを名前を付けずに実装するには以下のように書く必要があります:

```kotlin
val i: I = object: I {
    override fun x() = ""
}
```

以下のように書くことはできません:

```kotlin
val i: I = I { "" }
```

当然以下もコンパイルエラーになります:

```kotlin
val i: I = { "" }
```

どうしてもlambda式が使いたい場合は以下のようなヘルパーメソッドを書けばそれっぽく使えるようになります:

```kotlin
fun I(i: () -> String) = object: I {
    override fun x(): String = i()
}

val i: I = I { "" }
```

以下のような事も書いてますし関数型使えばいいじゃんって事なんでしょうが、このくらいは特別扱いしてくれもいいのにとも思います。

https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions
> Also note that this feature works only for Java interop; since Kotlin has proper function types, automatic conversion of functions into implementations of Kotlin interfaces is unnecessary and therefore unsupported.


## おわりに

KotlinかわいいよKotlin。
現在のブランチと同名のリモートブランチを除いたローカルブランチを削除するワンライナー

```bash
LIST=`git branch -r |cut -d/ -f2 | grep -v HEAD`; for b in `git branch -l | grep -v "*"`; do [[ $LIST =~ $b ]] && echo $b 'is exists in remote' || echo git branch -D $b ;done
```

リモートブランチはプルリをマージしたあとに消すようにしているが、
ローカルは放置してしまいがちなので楽に消す方法ないかなと思って作成したみた。

ちなみに動作確認はしてません。。

もっといい方法ありましたらご教授お願いいたします。
古いバージョンのRealSense SDKが最新版Visual Studioに対応していなくて困った時の話


Visual Studio 2015で開発中にlibを読み込まないエラーが発生
---

最近[Intel RealSense](http://www.intel.co.jp/content/www/jp/ja/architecture-and-technology/realsense-overview.html)を使ったアプリケーション開発をする機会があり、[SDK](https://software.intel.com/en-us/intel-realsense-sdk/download)と[最新版のVisual Studio (2015)](https://www.visualstudio.com/ja-jp/products/visual-studio-express-vs.aspx)をダウンロードしました。

SDKのバージョンは4.0.0.52526。

![rsinfo.png](https://qiita-image-store.s3.amazonaws.com/0/17214/3464f8b9-cc8d-dd29-964c-96d075d20385.png)
(この画面は`RSSDK/bin/x64/sdk_info.exe`から確認できます。)

手始めに、2016年初め現在では最も著名なハウツー本であろう、<a rel="nofollow" href="http://www.amazon.co.jp/gp/product/B00XHQWIHM/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B00XHQWIHM&linkCode=as2&tag=imaizume-22">Intel RealSense SDKセンサープログラミング</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=imaizume-22&l=as2&o=9&a=B00XHQWIHM" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />を片手に、付属の[C++用サンプルプログラム](https://github.com/RealSense-Book/RealSense-Book-CPP)を動かそうとしました。

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00XHQWIHM/imaizume-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51LfYiREevL._SL160_.jpg" alt="Intel RealSense SDKセンサープログラミング" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00XHQWIHM/imaizume-22/ref=nosim/" name="amazletlink" target="_blank">Intel RealSense SDKセンサープログラミング</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/" title="amazlet" target="_blank">amazlet</a> at 16.02.17</div></div><div class="amazlet-detail">翔泳社 (2015-05-11)<br />売り上げランキング: 26,600<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00XHQWIHM/imaizume-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jpで詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>

すると**ビルド時に"libpxcutilsmd_d.lib not found"**というエラーが出てビルドに失敗してしまいました。

バグの原因
---

このlibファイル、実は`RSSDK/sample/common/lib`以下に、CPU及びVisual Studio(ターゲットフレームワーク)のバージョン毎に分けられたディレクトリに入っています。
自分のSDKでは、後者が「v100」「v110」「v120」の3つ存在することを確認しました。

しかし、**Visual Studio 2015のバージョンはv140**、つまり**最新のターゲットフレームワークに対応したSDKが入っていなかった**のが原因でした。

対処方法
---

### 1. v100, v110, v120のいずれかをインストール

自分はVisual Studio 2013 (v120)を入れること問題なくビルドできました。
VS2013のダウンロードは[こちら](https://www.microsoft.com/ja-jp/download/details.aspx?id=48131)から。

### 2. 最新版のSDKをダウンロード

未確認ですが、最新版であればv140にも対応しているかもしれません。
log4rに日付でローリングしてほしかった話

# Log4r::DateFileOutputter

https://github.com/colbygk/log4r/blob/master/lib/log4r/outputter/datefileoutputter.rb

日付でファイルを分けることができるが、.changeの中で古いものを消していない

# Log4r::RollingFileOutputter

https://github.com/colbygk/log4r/blob/master/lib/log4r/outputter/rollingfileoutputter.rb

古いものを消してくれるがsequence numberベースでしか名づけられそうにない

# そこで

```rb
require 'fileutils'

module Log4r

  class RollingDateFileOutputter < Log4r::DateFileOutputter

    def initialize(_name, hash={})
      super(_name, hash)
      @max_files = hash['max_files'] || 5
      @pattern = File.join(File.dirname(@filename),  @filebase.sub(/(.+)\.\w*$/, '\1')) + "*.log"
    end

    def change
      super
      delete_old_logs
    end

    def delete_old_logs
      files = Dir[@pattern].sort_by{ |file|
        File.ctime(file)
      }.reverse.drop(@max_files)
      if files.any?
        FileUtils.rm(files)
      end
    end
  end

end
```

こんな感じのを書いて、日付ベースで名付けつつ古いものを消すようにしました

設定ファイルは

```yaml
  outputters:
  - type: RollingDateFileOutputter
    name: file
    level: DEBUG
    date_pattern: '%Y%m%d'
    max_files: 2
    trunc: false
    dirname: "/path/to/log/directory"
```

こんな感じです。

既存のoutputterの設定次第で同じことできるんですかね？
powershell でwordをpdfに一括変換まとめ

１、まずはpowershell のインストール
https://www.microsoft.com/ja-jp/download/details.aspx?id=40855
※インストール時には再起動が必要になるので注意

２、スクリプトファイルからの実行を有効にする
管理者権限で以下のコマンドを実行
Set-ExecutionPolicy RemoteSigned
（参考：http://qiita.com/tadnakam/items/f51e03021b95eb39f34b 内の「実行ポリシーの変更」）

３、実行ファイルの作成・実行
（参考：http://yomon.hatenablog.com/entry/2014/02/02/WORD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB(docx)%E3%82%92%E4%B8%80%E6%8B%ACPDF%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8BPowerShell%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88）
このソースコード内の
Get-ChildItem の後ろに -Recurse を追加するとディレクトリを再帰してくれる（サブディレクトリも取得）
AngularJS　Checkbox群から選択したものを取得


AngularJSで、Checkbox群の中から選択したものだけを保持するオブジェクトを提供する。

http://vitalets.github.io/checklist-model/


##使い方
モジュール「"checklist-model"」を読み込む


#js
```javascript
var app = angular.module("app", ["checklist-model"]);
app.controller('Ctrl1', function($scope) {

//Checkbox表示用リストの作成
  $scope.roles = [
    'guest', 
    'user', 
    'customer', 
    'admin'
  ];
  
  //状態保存用オブジェクト作成
  $scope.user = {
    roles: ['user']
  };
 
});


```

#html
```html

<label ng-repeat="role in roles">
  <input type="checkbox" checklist-model="user.roles" checklist-value="role"> {{role}}
</label>



選択項目の確認用リスト表示
<div class="col-lg-2">
    <ul class="list-group">
        <li class="list-group-item" ng-repeat="item in user.roles">{{item.Text}}</li>
    </ul>
</div>

```


##拡張
Jsonをそのまま格納も可能
その際にはchecklist-value → data-checklist-valueに変更する

```html
<label ng-repeat="role in roles">
  <input type="checkbox" checklist-model="user.roles" checklist-value="role"> {{role}}
</label>
```
Visual Studioを立ち上げてプロジェクトを開くとき、毎回"ConnectedServicesPackageが正しくロードされませんでした"というエラーが発生する人のための備忘録

この記事はVisual Studioを立ち上げてプロジェクトを開くとき、毎回 __"ConnectedServicesPackageが正しくロードされませんでした"__ というエラーが発生する人のための備忘録である。

私の環境ではAzureクラウドサービス(.ccproj)の含むソリューションで発生した。他のプロジェクトの種類については検証しなかったため詳細な再現条件は特定していない。

## 背景

Visual Studio 2015のUpdate 1とAzure SDK 2.8.2.1、ならびにASP.NET Web Toolsのセットアップを済ませた後、上記の警告が出るようになった。まとめて導入したため元凶の特定には至っていない。

この症状は発生頻度があまり高くないのか、日本語の質問サイトでもstackoverflowに投稿された"完全にアンインストールしてディレクトリを削除してから入れ直せ"という回答が引用されているような状態である。

言うまでもなくVisual Studioは巨大、かつ多数の拡張機能やSDKと連動するソフトウェアであり、"ゼロからインストールをやり直せば幸せになれるかも"などという回答は事実上の初心者煽りである。本当に他の手段がない時を除けばインストーラーの修復コマンドで対処すべきだ。


## 手順

__1.__ IDEの起動ログ_(VS2015なら 自分のユーザーディレクトリの AppData/Roaming/VisualStudio/14.0/ActivityLog.xml にある)_を読んで、拡張パッケージのDLLの読み込みに失敗していないかどうか確認する。ConnectedServicesPackageで検索して少し読み進めるとロードに失敗したDLLのフルパスが確認できるはずである。見当たらなかったらこのTipsでは対処できない可能性がある。

__2.__ 次いで問題のDLLが存在するはずのフォルダに移動する。これはVS2015ならProgram Files(x86)の中の Microsoft Visual Studio 14.0/Common7/IDE/Extensionsの下にある大量のフォルダの一つである。それを開いたとき君は知るだろう。なぜかDLLファイルだけが消滅していること、そのせいで__普通の修復インストールではこの不具合が復元されない__ことを。
フォルダ自体が存在しない場合、君はそのまま次の手順に行っても良いし、別の症状だと見切りをつけて他のTipsを検索しても良い。

__3.__ いま開いているフォルダを削除する。消すのが怖ければ切り取ってデスクトップなどに移動させても良い。リネームで済ませた場合にどうなるかは検証していないが、後述する理由から恐らく修復に失敗するのではないかと思われる。

__4.__ Visual Studioのインストーラーを起動し、修復を実行する。完了するとC++の再頒布可能パッケージのバージョンが衝突しているという警告が出る場合があるが、これは今回の問題とは関係しない。

__5.__ 修復が完了したらもう一度プロジェクトを開き、再現しなくなったことを確認する。


## 備考

最初はこの問題を引き起こしている"Microsoft 接続済みサービス"パッケージを拡張機能の管理画面から再セットアップできるかと考えていたが、このパッケージの拡張機能インストーラーはオンラインで発見することができなかった。

一連の処理を済ませた後、Visual Studioの拡張機能のディレクトリを見ると、削除したフォルダと同じ名前のフォルダは存在しなかった。このフォルダ名は何らかのハッシュ値であると思われるが、パッケージのユニークIDに対して単一の名前が生成されているわけではないらしい。結果として修復結果の確認のためにタイムスタンプの新しいフォルダを片っ端から検索することを強いられた。
Microsoft Edge 13 について調べてみた

##前提
検証機とシェアの話をしていて、
「Edge 13 ていつの間に出たんだろう？」ということで調べてみた。

（参照）Chromeがさらに増加、1月ブラウザシェア | マイナビニュース
http://news.mynavi.jp/news/2016/02/02/137/
※12位に「Microsoft Edge 13」が新登場。


##調べてみた
####調べ物の定番 ウィキペディア先生
https://ja.wikipedia.org/wiki/Microsoft_Edge
バージョン情報は特に記載なし。

####Microsoft Edge 公式
http://www.browserfordoing.com/ja-jp/
https://twitter.com/MSEdgeJapan
情報特になし。


##結果
###2015年11月05日だった模様
（参照）Microsoft Edge 用の累積的なセキュリティ更新プログラム (3124904) [MS16-002] :: ソフトウェア更新情報 - 出張所 (softinfo)
http://softinfo.seesaa.net/article/416569470.html



##おまけ
####「Internet Explorerで開く」というメニューがあるｗ
（参照）【Microsoft Edge】リリースから半年、改めてシェアや使用感など考察 | ナギサものおき
http://nagished.com/report/20160208-microsoft-edge/
12の時からあったっけ？
（Edge、がんばって…！）
超便利なjQuery Simple Sliderを使って簡単に値を変更する

#開発環境
- Mac OS X Yosemite 10.10.5
- Google Chrome 48.0.2564.103 (64-bit)
- [jQuery Simple Slider](http://loopj.com/jquery-simple-slider/)

#sliderって何？
こんな感じのつまみで左右に動かせるやつ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/110261/6e37654a-ab2f-fbe6-ea2c-2b11914dfda5.png)

#目的
スライダーを探すのに苦労したので共有まで。
シンプルなツールなので以下は見ずとも公式サイト見れば使い方はわかると思います。

#インストール方法
1. ダウンロードして`simple-slider.js`と`simple-slider.css`を適切なフォルダに配置、読み込みする
2. 配置したい場所に`<input type="text" data-slider="true">`と書く

以上。
簡単すぎますね。

#使い方
```
$( "#slider" ).bind( "slider:changed", function ( event, data ) {
  #ここに処理を書く
  #例えば　setXX(data.value)　等
});
```
Basic Metal 2D

# はじめに

iPad Pro と Apple Pencil が発表されてから、何かお絵描きのようなプロダクティビティのアプリを開発したいとおもい、Metal に目をつけて勉強してきました。やはり最高のパフォーマンスを出すには METAL かなと勝手に思い WWDC を見たりと秋頃から勉強を続けてまいりましたが、ずっと陸サーファーならぬ陸METALの状態が続いていたので、２０１５年の年末頃から練習がてらに、2D METAL のボイラープレートになるようなサンプルを書いてみましたので、その解説をしてみたいと思います。

# Basic Metal 2D の入手

https://github.com/codelynx/BasicMetal2D

より入手してください。ライセンスは MIT になっています。Xcodeでプロジェクトを開くと Mac用 と iOS用のターゲットが入っています。iOS版 はシミュレーターでは動かないのでご了承ください。ホスト側のコードは Swift になっています。Mac も iOS も世界地図が表示され、パンやズームができるようになっています。

![Screen-Shot-2016-02-17-at-5.02.02-PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/65634/d95141e2-65b9-a1e4-299a-d2baf9333964.jpeg)


# Basic Metal 2D の狙い

世の中に Metal Base のサンプルコードは Open GL のそれと比べると圧倒的に少ないです。お絵描きアプリなどを想定してサンプルコードの検索の旅に出かけても、それなりに幾つか出てきても、スクロールやズームといった操作を前提にしていないものが多く。あくまで、METAL やその他の目的の為の検証の為のもので、ボイラープレート化するのに適さないものが多いと感じたからです。

また、個人的には Core Graphics のモデルが結構に気に入っていて、`CGContextRef` に Pen や Brush のステートを与えて、Stroke や Fill すると言ったモデルに近い所を狙ってみました。

今回のサンプルは、2D でパン、ズームが可能な、しかも独自のシェーダーを追加しやすいモデルを目標にサンプルを書いてみました。


# METAL

METAL の作法はやっぱりめんどく臭いです。こんなモデルを頭に描きながらプログラミングをしていると、本来のクライアントコードの目的を忘れていっぱいいっぱいになってしまいそうです。

![Cmd-Model-threads_2x.png](https://qiita-image-store.s3.amazonaws.com/0/65634/64232741-2a43-a242-1e63-8f3851724138.png)


そこで、最も面倒な `Render Pipeline Descriptor` や その `State` をうまく抽象化してクライアントコードから分離できないかと考えました。そこで、以下のようなモデルを考案しました。

- Shader
- Renderer
- Renderable
- RenderContext

### Shader

Metal の GPU 側で動作する Vertex Shader または Fragment Shader のコード。Renderer と頂点情報など密接に設計されている必要がある。

### Renderer
`RenderPipelineDescriptor` 及び `RenderPipelineState` を抽象化したものです。そのサブクラスは実際に`RenderPipelineDescriptor` を生成し、そのクライアントコードはその細かい作法を知らなくて良いものとし、APIを介して利用するものとします。サンプル内の `ImageRenderer` は Texture を表示する実装になっています。

### Renderable
`Renderer` のサブクラスと対をなし、表示されるオブジェクトモデルを表現します。`Renderable` オブジェクトは自分がどの `Renderer` で表示されるかを知っているものとし、その為に必要なモデルの情報を管理します。

### RenderContext
実際の表示までには頂点情報がシェーダーに渡されるまでの間には、様々な中間的な情報をおまじないのように必要になります。`RenderContext` は、こうした二次、三次的な情報を集約し、かつ親モデル→子モデルの中間的な変換行列の保存復帰などを管理します。

# 独自シェーダーを追加したい場合

いろいろ改善が必要な点も認識していますが、いろいろなシェーダーを追加したい場合は、`Image Shader` に習い、
Shader, `Renderer`, `Renderable` を設計してください。その際、shader には、必ず `modelViewProjectionMatrix` を渡してシェーダー全体で行列の変換を行ってください。これをしないと、パン、スクロールしても何も起きない表示物が生まれてしまいますが、`HUD` などそれを狙ったものであれば、その限りではありません。

# 今後の改善点

- Touch の軌跡を表示する、 Stroke Renderer などシェーダーなどの追加
- 構造像的なオブジェクト表示時の Uniform情報 の改善
- ScrollView っぽいスクロール
- ネーミング？
Microsoftさんに紹介されたクロスプラットフォーム開発ツール


Microsoftに行ったときにこれからのモバイル開発を支えるツールとして紹介された２つのツールについての備忘録です。


**Xamarin**
最近Microsoftが買収したXamarin社が提供しているクロスプラットフォーム開発用のツール。
特徴はなんといってもC#だけ知っていればAndroid,iOS,Windowsアプリが開発できてしまうこと。
実態は各プラットフォームで提供されているAPIをラッピングしたようなもの。

以前仕事で利用したことがあるのですが、モバイル開発は基本MVCモデルで開発しますが、Xamarinを使えばMVCのうちMを共通コードで書けてしまうので書く量が減ります。
さらにMVVM Pluginとかを利用するとMとVMを共通で書けるので更に書く量が減ります。最近はViewの共通化も進んできているので各プラットフォーム固有処理とかを書かなくて済むようにもなってきている模様。
というメリットをあげておりますが、デメリットはライセンスが高い、SDKの更新とXamarinのSDK対応とのタイムラグ発生、バグなどもありますので、使うときは案件と応相談ですかね。

**Monaca**
HTML5とJavascriptを利用します。既存のWebサイトをアプリ化するときに便利ですね。
Webのスキルセットで開発できるところが魅力といったところでしょうか。
HTML5とJavascriptの利用ということなのでWebViewを利用したアプリになります。自分の感覚的には通信とかが入るとモッサリした動作になりそうであまり使う勇気がないです。
サポート付きの年額利用料はシルバーで300万円、ゴールドで1000万円らしいです。
そんなお金私にはありません！


個人目線で見たときはどちらも使う気が起きませんが、企業として見た場合は、該当スキルを持つ人材確保や人件費などを考慮するとライセンス料のほうが安上がりで早く作れるメリットがありそうです。


ご利用は計画的に。
scope内でhas_manyを使おうとしたら"Undefined method"として怒られたのでまとめてみた。


## 失敗パターン

まず、ダメだったパターンから。

```user_controller.rb
# ユーザーが作成したコンテンツの購入数を取得しようとしてる
user.bought_contents(user.id).length
```

```user.rb
# providerはコンテンツの作成者
# Userのidをcontentsテーブルのprovider_idと紐付けている
has_many: sell_contents, class_name: :Content, foreign_key: :provider_id

# 上記のsell_contentsを更に派生させて、
# 購入したコンテンツをまとめているpurchasesテーブルとinner joinし、
# provider_idがUserのidとして合致するものを探そうとしている
scope :bought_contents, ->(provider_id) { sell_contents.joins(:purchases).where(provider_id: provider_id) }
```

## 成功パターン1

で、色々と試行錯誤して正答を３パターン発見しました。
まずは一つ目。

これは単純にscopeでやっていることをそのままcontrollerに書きました。

```user_controller.rb
user.sell_contents.joins(:purchases).where(provider_id: user.id).length
```

これだと動くには動きましたが、正直なんのこっちゃ分かりません。
最悪の可読性です。

という訳で新たなパターンを模索しました。

## 成功パターン２

次はhas_manyのsell_contentsを派生させました。
sell_contents内にクラスメソッドを作成するというやり方です。

```user_controller.rb
user.sell_contents.bought(user.id).length
```

```user.rb
has_many: sell_contents, class_name: :Content, foreign_key: :provider_id do
  def bought(provider_id)
    joins(:purchases).where(provider_id: provider_id)
  end
end
```

成功パターン１よりかは可読性が大幅アップしましたが、これでもまだ冗長的な書き方のような気がします。
もっと改良しましょう。

参考：[Scope with join on :has_many :through association](http://stackoverflow.com/questions/5856838/scope-with-join-on-has-many-through-association)

## 成功パターン３

新しくhas_manyとしてbought_contentsを作成させる形で１行に収まる書き方を発見しました。

```user_controller.rb
user.bought_contents(user.id).length
```

```user.rb
has_many: bought_contents, ->(provider_id) { joins(:purchases).where(provider_id: provider_id) }, class_name: :Content, foreign_key: :provider_id
```

sell_contentsの書き方に、scopeをくっつけたような書き方ですね。
これが可読性や冗長性を考えた時に一番ベターな書き方のような気がします。

## 何故失敗したのか？

では何故scopeでhas_manyが呼べなかったのか？

それは __has_many__ がインスタンスメソッドだからです。

scopeはクラスメソッドであるため、以下のように書き直せます。

```user.rb
def self.bought_contents(provider_id) do
  sell_contents.joins(:purchases).where(provider_id: provider_id)
end
```

上述のようにhas_manyはインスタンスメソッドであるので、
この場合クラスメソッド内からインスタンスメソッドを呼ぶため怒られます。


以上、考えてみればhas_manyにscopeオプションもある時点で気付けよというお話なのですが、
何故失敗したのか？も含めて良い勉強になりました。
AndroidManifest.xmlの中身を拝見させて頂く


APK内のAndroidManifest.xmlは普通に開いても読めないので、`AXMLPrinter2.jar` を使う。

```
Prints XML document from binary XML file (with correct namespace handing & attribute formatting).
```

下記からダウソする
https://code.google.com/archive/p/android4me/downloads

`$ java -jar AXMLPrinter2.jar AndroidManifest.xml > hoge.txt`

これで読めるレベルになるよ！

## 関連リンク
[Android端末からapkファイルを取り出す
](http://qiita.com/toguri/items/d879cd0ef3642508a7d0)
[classes.dexファイルをjarファイルに変換する](http://qiita.com/toguri/items/fb1e3133ac3d556e2100)
Go言語でプリント文デバッグするときのTips


Go言語でどのファイルのどの行を通っているのか確認する簡単な方法です。
次のようにlogのインスタンスを作成して、空のPrintln()を呼ぶだけで、ファイル名と行番号が表示できます。

```lang:g.go
package main

import "log"
import "os"

var tracer = log.New(os.Stdout, "", log.Lshortfile)

func main() {
  tracer.Println()
  tracer.Println()
  os.Exit(1)
  tracer.Println()
  tracer.Println()
}
```

実行するとこんな感じ。

    $ go run g.go
    g.go:9: 
    g.go:10: 
    exit status 1

結果をファイルに落として、vimのQuickFixに渡すことも可能です。

    $ vim -q result.txt

C言語みたいに `__FILE__` や `__LINE__` を使わなくてよいので楽ですね。
【Unityエディター拡張】シェーダーを使ってInspectorのプレビュー領域に円を描画させてみた

※この記事で使っているUnityのバージョンは Unity5.2.1p3 です。

![image](https://qiita-image-store.s3.amazonaws.com/0/44288/aded1577-dad6-c341-7173-56a20deebdf8.png)

#はじめに
OnPreviewGUIを利用することでプレビュー領域の描画処理を自分で作ることができます.
そこで円を描画させるカスタムシェーダを作成し、これをプレビュー領域に適用して円を描画させてみました。

#空のMonoBehaviourスクリプトを作成
以下のスクリプトを作成してプロジェクト内に入れます.
作成したスクリプトはシーン内の適当なオブジェクトにアタッチします.

```NewBehaviourScript.cs
using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour
{

}
```


#プレビュー領域の描画処理を実装する
以下のスクリプトを作成してEditorフォルダ内へ入れます.

```NewBehaviourScriptEditor.cs
using UnityEngine;
using UnityEditor;
using System.Collections;

[CustomEditor(typeof(NewBehaviourScript))]
public class NewBehaviourScriptEditor : Editor
{
    private Material material = null;
    public override bool HasPreviewGUI()
    {
        return true;
    }

    public override GUIContent GetPreviewTitle()
    {
        return new GUIContent("ほげ");
    }
    
    public override void OnPreviewGUI(Rect r, GUIStyle background)
    {
        if (material == null)
        {
            // カスタムシェーダからMaterialを作成
            Shader shader = Resources.Load<Shader>("Shader/Ring");
            this.material = new Material(shader);
        }

        base.OnPreviewGUI(r, background);
        Graphics.DrawTexture(r, Texture2D.whiteTexture, this.material);
    }
}
```

# 円を描画するカスタムシェーダの作成
以下のシェーダを作成して
ファイルパスが```Assets/Resources/Shader/Ring.shader```となるように
配置します.

```Ring.shader
Shader "Unlit/Ring"
{
	Properties
	{
		_MainTex("Texture", 2D) = "white" {}
	}

		SubShader
	{
		Tags{ "RenderType" = "Opaque" }

		Pass
	{
		CGPROGRAM
#pragma vertex vert
#pragma fragment frag

#include "UnityCG.cginc"

	struct appdata
	{
		float4 vertex : POSITION;
		float2 uv : TEXCOORD0;
	};

	struct v2f
	{
		float2 uv : TEXCOORD0;
		float4 vertex : SV_POSITION;
	};

	sampler2D _MainTex;
	float4 _MainTex_ST;

	v2f vert(appdata v)
	{
		v2f o;
		o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
		o.uv = TRANSFORM_TEX(v.uv, _MainTex);
		return o;
	}

	fixed4 frag(v2f i) : SV_Target
	{
		// 円の半径
		fixed r = 0.3;

	    // 円の中心
   	    fixed2 center = fixed2(0.5, 0.5);

	    return step(r, length(i.uv - center));
	}
		ENDCG
	}
	}
}
```


#完成
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/50df1b7d-131b-7f96-7163-8697f47e494e.png)
NewBehaviourScriptアタッチしたオブジェクトを選択するとプレビュー領域に円が表示されます.


#参考
Editor.OnPreviewGUI - Unity - スクリプトリファレンス
http://docs.unity3d.com/ja/current/ScriptReference/Editor.OnPreviewGUI.html
MyScriptをソースからビルドしてiOSシミュレータで動作させた時

MyScriptをソースからビルドしてiOSシミュレータで動作させた時のメモです。

## MyScriptアカウントを登録する

氏名とメールアドレスを入力して、90日間のトライアルライセンスを入手します。
（詳しく見ていないせいだと思いますが、個人ユーザには「Free」というキーワードがあるのに90日間のトライアルライセンスになってしまうのがよくわかりませんでした）

メールアドレスにアクティベート用のURLが来るので、メールが来たらURLをクリックしてアカウントを有効化します。メールもアカウントの有効化もすぐに終わりました。

アカウントが有効になったらMyScriptのポータルサイトにログインします。
Then, you can receive email for confirmation. You can click the URL in the message then, your account will be enabled shortly.
Then, you can login to the MyScript portal.

## ATKをダウンロードする

MyScriptのポータルサイトからATKをダウンロードします。
https://dev.myscript.com/atk-resources/

## MyCertificate.hを取得する

以下の手順でポータルサイトからMyCertificate.hをダウンロードします。
1. MyScriptのポータルサイトにログインします。
2. ATK Samplesにある [Open] ボタンをクリックします。（Applicationsタブにあります）
1. 「.h」ボタンをクリックしてMyCertificate.hをダウンロードします。iOS用のは「ATK certificate for iOS」の行にあります。Android版をダウンロードしないように注意してください。iOS版は80MB強でした。

## サンプルプロジェクトを開く

Finderでzipファイルを開き、サンプルフォルダを見つけます。
Interactive Text Componentのサンプルがありますので、それを開きます。Xcodeで開くはずです。

プロジェクト名：InteractiveTextComponentSample.xcodeproj

## ビルドする

Xcodeで開いたら、左上付近にある右三角のアイコンをクリックしてビルドを開始させる。
しかし、Certificate関連のエラーになるので次のステップに進む。

## Certificateエラーへの対処

ダウンロードしたMyCertificate.hを開き、内容をクリップボードにコピーする。
先ほどのビルドでエラーになったサンプルフォルダ内にあるMyCertificate.hを開き、
ダウンロードしたMyCertificate.hを開き、クリップボードの内容をペーストする。

## Rebuild the source code.

再度ビルドしたら今度はビルドが通るはずなので、そのままiOSシミュレータで起動させる。

## あとは

あとはiOSシミュレータ上でMyScriptをいじりましょう。


#　Tips
iOSシミュレータのデバイスを変更したい場合（例えばiPad ProからiPhone 6Sに変更する）は、三角ボタンの右にあるアイコンをクリックして変更できます。
d3.jsでa要素のリンクを無効化する

jQuery風の return false では無効化できない。

```html
<a href="#" id="test">test</a>

<script>
d3.select("#test").on("click", function(){
    return false; //これでは無効化できない。
});    
</script>
```



preventDefaultを利用する。

```js
d3.select("#test").on("click", function(){
    d3.event.preventDefault();
});    
```
CVE-2015-7547 POCを動かす

とりあえず、Googleから出されてる概念実証コード(POC)を実行してみる。

https://github.com/fjserna/CVE-2015-7547

事前準備: /etc/resolv.confでネームサーバを自分に設定

    nameserver 127.0.0.1

term1:

    # ./CVE-2015-7547-poc.py

term2:

    $ make
    gcc -o CVE-2015-7547-client CVE-2015-7547-client.c
    $ ./CVE-2015-7547-client
    セグメンテーション違反です
    $ wget http://www.google.com
    --2016-02-17 16:45:49--  http://www.google.com/
    www.google.com をDNSに問いあわせています... セグメンテーション違反です

あちゃー・・・ということで速めにglibcアップデートしましょう。
resolv.confを戻しておくのを忘れずに。
keynav を使ったキーボードによる、マウスカーソルの移動

# 概要

Linux のデスクトップで、キーボードを使ってマウスカーソルを動かしたい

# 結論

keynav というソフトを使うといろいろ解決できる可能性がある。

キーバインドもここにかいてある。

[﻿Control Your Graphical Desktop from the Keyboa... » Linux Magazine](http://www.linux-magazine.com/Online/Blogs/Productivity-Sauce/Control-Your-Graphical-Desktop-from-the-Keyboard-Using-keynav)

# どうやった

keynav のインストール

```
apt-get install keynav
```

keynav の起動

```
keynav
```

# どうなったか

結局そのまま使うにはいたらなかった。
画面が広大すぎるのか、そもそも自分の望みがたかすぎたか、、、
なにかよい方法を考えたいところではある。
Vagrantのubuntu/trusty64にRuby2.2.4とRailsとMySQLを入れる

※最低限のものの他に自分が必要なものが入ってます

```
$ vagrant init ubuntu/trusty64
$ vagrant up --provider virtualbox
$ vagrant ssh

$ sudo apt-get update
$ sudo apt-get install -y git
$ sudo apt-get install -y libssl-dev
$ sudo apt-get install -y libsqlite3-dev
$ sudo apt-get install -y nodejs
$ sudo apt-get install -y libreadline-dev

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

$ source ~/.bash_profile

$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

$ rbenv install 2.2.4
$ rbenv rehash
$ rbenv global 2.2.4

$ gem install bundler
$ gem install rails --no-ri --no-rdoc

$ sudo apt-get install mysql-server
```
何も考えずMac上のGit diffでExcelの差分を見れるようにする

エクセルをgit管理する際に困るのが、差分が見れない点。
本当はエクセル使いたくないけど、
誰でも使えて必要な機能が揃うエクセル最強説。
代替がなく辛い。

ということで、少しでも事故を減らしたり、
調査を素早くする第一歩として、
自分のMacだけでも差分を見れるようにしようという試みです。

## 手順
とにかく環境設定の手間を最小限にするため、
何も考えずグローバルに設定します。
一度設定すればリポジトリごとの設定等は不要です。

### goをインストール

```
~$ brew install go
```

### GOPATHの設定
パッケージをインストールするディレクトリを作成して設定

```
~$ mkdir .go
```

```:~/.bash_profile 
export GOPATH=$HOME/.go
```

```
~$ source .bash_profile
```

### goのパッケージ取得
```
~$ go get github.com/tokuhirom/git-xlsx-textconv
```

### gitconfigの設定
グローバルのgitconfigに以下を追加

```:~/.gitconfig
[diff "xlsx"]
    binary = true
    textconv = $GOPATH/bin/git-xlsx-textconv
```

### gitattributesの設定
.gitattributesを新規作成

```:~/.gitattributes
*.xlsx  diff=xlsx
*.XLSX  diff=xlsx
```

gitconfigに設定を追加

```
~$ git config --global core.attributesfile ~/.gitattributes
```

## 参考
* [Gitで管理しているExcelファイルの差分を見る](http://qiita.com/takedakn/items/660d17fe10ede8441ee6)
* [GOPATH は適当に決めて問題ない](http://qiita.com/yuku_t/items/c7ab1b1519825cc2c06f)
* [Where should I place my global 'gitattributes' file?](http://stackoverflow.com/questions/28026767/where-should-i-place-my-global-gitattributes-file)
【Arduino IDE使いやすくしよう】行番号を表示してエラーを追いやすく

新しいテキストエディターをインストールしたらまずはじめにやることの一つといっても過言ではない「行番号の表示」。Arduino IDEでは標準で非表示なのでデバッグしづらい、、、

# コンパイル時にエラーが発生しました。
コンパイル時にエラーを検出してくれます。
が、行番号がないとどこのことやら、、、と(キャプチャはBlinkのスケッチなのでわかりやすいですが)。
![img_01.png](https://qiita-image-store.s3.amazonaws.com/0/55103/e769a3cd-c741-c044-02ba-7add78234379.png)

# 行番号を表示する
Arduino IDEのメニューから[ファイル]→[環境設定]で環境設定画面を開きます。行番号のチェックボックスがあるのでチェックを入れます。
![img_02.png](https://qiita-image-store.s3.amazonaws.com/0/55103/38e6a90d-60f4-51ed-8050-002d668625a0.png)

# エラーも一目瞭然！
かなり追いやすくなりますね。ledPinという変数が無いですよと。
![img_03.png](https://qiita-image-store.s3.amazonaws.com/0/55103/ec96a24d-5a27-814a-afcf-672fd4ce83b1.png)

# すでにみなさんやってますよね、、、
この記事で取り上げることもなかったかもしれませんが、きっと誰かの役になってくれるはず！

- [プログラミングに適したフォントに変更](http://qiita.com/umi_kappa/items/e053f66ffd9238d30b37)
- [起動時のウィンドウサイズを大きくはじめる](http://qiita.com/umi_kappa/items/15d8788f1fa83d50b8f4)
Khronos Vulkanがリリースされたようなのでメモ

# Vulkan とは

 * 新しいGraphics API
 * OpenGLが登場から20年以上経ってAPI設計的にも古くなってきて時代にそぐわなくなってきたので作られた

ざっくりとしたGLとVulkanの違い

|  | OpenGL | Vulkan |
|---|---|---|
| 歴史 | 古い | 新しい |
| スレッド | シングルスレッド前提 | マルチスレッド前提 |
| メモリ管理 | ドライバが頑張る | プログラマが死ぬ気で頑張る |
| GPUとの仲良し度 | ドライバが程よく仲介する | プログラマが死ぬ気でGPUとお友達になる |
| プログラミングの大変さ | そこそこ簡単 | GPUのアーキテクチャをある程度理解しよう。話はそれからだ。 |

# Windows PCでとりあえず実行してみる

## ドライバを入れる

 * Windows10 64bit proで動作確認
 * Vulkan対応ドライバをインストールする
 * NVIDIAで普通にDLできる
    * https://developer.nvidia.com/vulkan-driver
    * Kepler世代以降が対応してる模様
    * GPU名は直接的に書かれていないが、Maxwell世代も普通に使える
        * Quadro M1000M（モバイルワークステーション向けのGPU）ではインストール可能
 * インストールするとOpenGLからもVulkan系の拡張が使えるようになる
    * GL_NV_draw_vulkan_image が使える

## SDKを入れる
 * 最新はWindowsの場合 Vulkan 1.0.3
    * サイトの登録（無料）が必要
    * https://vulkan.lunarg.com
    * Vulkanサイトからリンクされているので、多分間違いないと思う
    * デフォルトだと C:\VulkanSDK にインストールされる

## バンドルされているデモを実行する

 * SDKと一緒にvulkaninfoというアプリがインストールされるので、実行するとPCのVulkan API情報を表示できる
   * デバイス名とか拡張機能とか一覧が表示される
   * <img src="https://qiita-image-store.s3.amazonaws.com/0/15670/634a6477-3da9-9a21-0af8-aa4b9f634af9.png" width="450">
 * cube.exeとかtri.exeとかも
 * それっぽいサンプルが実行される模様
   * <img src="https://qiita-image-store.s3.amazonaws.com/0/15670/7327b9b5-fe9b-579f-de83-dcb72f60950c.png" width="450">

## ドキュメントが読みたい
 * Khronosがgithubで用意している
    * https://github.com/KhronosGroup/Vulkan-Docs


## サンプルコードを見たい
 * Khronosがgithubで用意している
    * https://github.com/KhronosGroup/Vulkan-Samples
        * アクセスしたかい？悲しみに暮れよう！！
    * https://github.com/KhronosGroup
        * 他にもいろいろある
    * コメントにもありましたが、Windows版SDKを入れるとサンプルも入るようです

# Androidで実行したい

 * NVIDIAがVulkanをimplしたOSイメージを用意している
    * SHIELD TABLET / SHIELD TABLET K1(バッテリー問題解消後のバージョン) / SHIELD TVが対応
    * https://developer.nvidia.com/vulkan-android
        * 必要事項をメールで送ったら、数時間でSHIELD TABLETに対して直接OTAが降ってきます
        * インストールすれば、Android 6.0.1(Vulkan対応版)を導入できます
 * Android NDKにも組み込まれる模様
    * https://developer.android.com/intl/ja/ndk/guides/graphics/index.html