OmniAICreator/Qiita-1.07M huggingface dataset:
Android Runtime Permission のデバッグ方法について

# Overview
現在開発している Android アプリで Runtime Permission を実装しています。
Runtime Permission は一度許可してしまうと、再現しなくなるのでアプリを再インストールしなくてはいけなく面倒だったのですが、adb コマンドで指定した Permission だけを削除する方法が [公式](http://developer.android.com/training/permissions/best-practices.html) で紹介されてたので備忘録。

## Permission を操作したいアプリのパッケージ名を確認
確認というほどでもないですが(自分の作成したパッケージ名です)、adb コマンドでも確認できます。

```
$ adb shell pm list packages
WARNING: linker: /system/lib/libhoudini.so has text relocations. This is wasting memory and prevents security hardening. Please fix.
package:com.example.android.livecubes
package:com.android.providers.telephony
package:com.google.android.googlequicksearchbox
package:com.android.providers.calendar
・
・
・
```

## アプリが所有している Permission を確認
```
$ adb shell pm list permissions -d -g
WARNING: linker: /system/lib/libhoudini.so has text relocations. This is wasting memory and prevents security hardening. Please fix.
Dangerous Permissions:

group:com.google.android.gms.permission.CAR_INFORMATION
  permission:com.google.android.gms.permission.CAR_VENDOR_EXTENSION
  permission:com.google.android.gms.permission.CAR_MILEAGE
  permission:com.google.android.gms.permission.CAR_FUEL

group:android.permission-group.CONTACTS
  permission:android.permission.WRITE_CONTACTS
  permission:android.permission.GET_ACCOUNTS
  permission:android.permission.READ_CONTACTS

group:android.permission-group.PHONE
  permission:android.permission.READ_CALL_LOG
  permission:android.permission.READ_PHONE_STATE
  permission:android.permission.CALL_PHONE
  permission:android.permission.WRITE_CALL_LOG
  permission:android.permission.USE_SIP
  permission:android.permission.PROCESS_OUTGOING_CALLS
  permission:com.android.voicemail.permission.ADD_VOICEMAIL

group:android.permission-group.CALENDAR
  permission:android.permission.READ_CALENDAR
  permission:android.permission.WRITE_CALENDAR

group:android.permission-group.CAMERA
  permission:android.permission.CAMERA

group:android.permission-group.SENSORS
  permission:android.permission.BODY_SENSORS

group:android.permission-group.LOCATION
  permission:android.permission.ACCESS_FINE_LOCATION
  permission:com.google.android.gms.permission.CAR_SPEED
  permission:android.permission.ACCESS_COARSE_LOCATION

group:android.permission-group.STORAGE
  permission:android.permission.READ_EXTERNAL_STORAGE
  permission:android.permission.WRITE_EXTERNAL_STORAGE

group:android.permission-group.MICROPHONE
  permission:android.permission.RECORD_AUDIO

group:android.permission-group.SMS
  permission:android.permission.READ_SMS
  permission:android.permission.RECEIVE_WAP_PUSH
  permission:android.permission.RECEIVE_MMS
  permission:android.permission.RECEIVE_SMS
  permission:android.permission.SEND_SMS
  permission:android.permission.READ_CELL_BROADCASTS
```

## 指定した Permission を削除
```
adb shell pm revoke <PackageName> <PermissionName>
```
以下は `com.sampo02.libsearch` に対して電話をかける Permission を削除する例です。

```
adb shell pm revoke com.sampo02.libsearch android.permission.CALL_PHONE
```

## 全ての Permission を削除
全ての Permission を削除するコマンドは以下です、アプリインストール時の Runtime Permission の動作を確認したい時などに。

```
adb shell pm reset-permissions
```
Messenger Platform（Bot）開発は利用規約が重要！

FacebookのMessenger Platform上でBotを開発している方は、まずは[利用規約](https://developers.facebook.com/policy/#messengerplatform)をしっかり読んだ方が良さそうです。気づいたら違反していてフェイスブックにブロックされるなんていうことにもなりかねない内容がたくさあるので、気をつけましょう。

その中でも5,6章の項目が重要そうだったので、適当に訳してみました。

## 5. Messages and Data（メッセージとデータ）

> a. After we approve your initial intended use cases for Messenger, don't add additional use cases without submitting them to us for our review and approval. Responding to a customer inquiry is permitted without our prior approval, but ensure your response adheres to our policies (i.e., it must not include ads).

a. あなたたちが最初に指し示したメッセンジャーのユースケースを私たちが承認した後に、レビューと承認なしで追加のユースケースを加えてはいけない。カスタマーの問い合わせに対して私たちの承認なしに返答することは許可されているが、その返答は私たちのポリシーに従っていなければならない。（つまり広告を含んではいけない）

> b. Don't use Messenger for advertising, marketing, or for sending promotional content of any kind, even if a person opts-in to receiving this content, without our prior written permission.  

b. たとえそのコンテンツをユーザーが受け取ることを許可したとしても、私たちが事前に書いた許可なしで、広告、マーケティング、あらゆるタイプのプロモーションコンテンツのためにメッセンジャーを使ってはならない

> c. If you have permission to offer or complete sales of goods or services within Messenger, adhere to the Facebook Commerce Product Merchant Agreement.

c. もしあなたがメッセンジャーの中で商品やサービスを提供したり販売を完了させるための許可を取っているのであれば、[Facebook Commerce Product Merchant Agreement](https://www.facebook.com/legal/commerce_product_merchant_agreement)に従ってください

> d. Don't request or share individual payment card, financial account numbers or other cardholder data within Messenger.

d. メッセンジャーの中では、個人の支払いカード、口座番号やその他のカード情報を要求したり共有してはいけない

> e. Don't include links to sites off Messenger where payment information is collected, without our prior permission.

e. 支払い情報が収集される箇所で、私たちの事前の許可なく、メッセンジャーから離脱するリンクを含めてはならない

> f. Don't use any data obtained from us about the people you reach in Messenger, other than the content of message threads, for any purpose other than as reasonably necessary to support the message types you elect to use.

f. メッセンジャーの中であなたたちが接するユーザーについて、あなたが使うことに決めたメッセージの種類をサポートするために当然必須であること以外の目的で、メッセージスレッドの中以外では私たちから取得するあらゆるデータを使ってはいけない。

> g. Games: Don't use Messenger Platform if your game accepts payment (i.e., games must be free to play and offer no paid content).

g. あなたのゲームが支払いを受け取るなら、メッセンジャープラットフォームを使用してはいけない。（つまり、ゲームは無料でプレーできなければならず、有料コンテンツを提供してはいけない）

## 6. Things You Should Know（知っておくべきこと）

> a. We may limit or remove your access to Messenger if you receive large amounts of negative feedback or violate our policies, as determined by us in our sole discretion.

a. あなたが大量のネガティブなフィードバックを受けっとたり、私たちのポリシーに違反した場合、私たちの独断によって、メッセンジャーへのアクセスを制限したり排除するかもしれない。
CentOS7でglibc(2.17-106.el7_2.6)のアップデートが来てた件

個人サーバーで何気なくyumのアップデートをかけてみたところ、
`glibc-2.17-106.el7_2.6.x86_64`を発見。おや、バージョンが上がっている！

glibcといえば今年のはじめに脆弱性が見つかったとしてアップデートの注意喚起がかかったパッケージですな。
(詳しくは http://qiita.com/maru3/items/43fab4669c87b4ddac59 などを参照してください)

早速
`yum info glibc`
`rpm -q --changelog glibc > rpm.log`からの
`vi rpm.log` (ただrpmコマンド叩くだけだと長過ぎて最新までたどるのが面倒)

```
* Mon Apr 04 2016 Carlos O'Donell <carlos@redhat.com> - 2.17-106.6
- Fix NULL pointer dereference in stub resolver with unconnectable name
  server addresses (#1323839).

* Mon Apr 04 2016 Carlos O'Donell <carlos@redhat.com> - 2.17-106.5
- Fix memory leak in ftell for wide-oriented streams (#1323781).
- Avoid race condition in _int_free involving fastbins (#1313308).
```

バグ修正のようですな。
RedHatのサイトにも、5月12日付けで以下の投稿がありましたので共有しておきます。
http://rhn.redhat.com/errata/RHBA-2016-1030.html

(脆弱性の番号もないし)自社サーバーでの対応は早急ではなさそうなので、
とりあえず個人鯖はさくっとあげつつ様子見でいきます。
Rubyでビッグエンディアン64bit整数をunpackする

# 背景

Rubyでバイナリ列をパースするにはString#unpackメソッドを使う。
この際には、変数の型（32bit符号付き整数、倍精度浮動小数点数など）と、エンディアンを指定する。

例えば、ファイルからビッグエンディアンの倍精度浮動小数点数を読み込みたい場合、以下のようにする。

```rb:read_double.rb
io = File.open(ARGV[0], 'rb')
b = io.read(8)    # 8 byte読む
p b.unpack("G")   # バイト列を 64bit double big-endian として解釈する
```

上の例の "G" というのがpackテンプレート文字列と呼ばれるもので、エンディアンと型を指定するもの。
[パックテンプレート文字列の一覧](http://docs.ruby-lang.org/ja/2.2.0/doc/pack_template.html)

~~上記のページを見てもらうとわかるように、ビッグエンディアンの64bit符号付き整数については方法が提供されていない。(16,32bitについては方法が提供されている。）
そのため、64bit整数については自前で実装する必要がある。~~

（2022/8/12 追記）コメントで方法を教えていただきました。（@Nabetaniさんありがとうございます）
以下のようにすることでビッグエンディアンを指定できます。

```ruby
b.unpack("q>")
```

公式のドキュメントにも
「強制的にエンディアンを指定したいときは、 リトルエンディアンなら< ビッグエンディアンなら> を後ろにつけます」と書いてありました。
以下の自前で実装する方法は不要になりました。
（追記おわり）

# 64bit signed integerに対して自前で実装する方法

以下のようなメソッドを用意する。

```rb:read_signed64int.rb
def read_signed64int(b)
  big_endian = [1].pack("s") == [1].pack("n")
  # s: system-dependent int16_t, n: big-endian 16bit integer
  big_endian ? b.unpack("q") : b.reverse.unpack("q")
  # q: long long (符号付き整数, エンディアンと long long のサイズに依存)
end
```

`[1].pack("s") == [1].pack("n")` で実行しているシステムのエンディアンを確認。
システムがリトルエンディアンの場合は、バイト列を`reverse`でリトルエンディアンに変更してから `unpack("q")` でlong longとして解釈する。

# 参考

- http://docs.ruby-lang.org/ja/2.2.0/method/String/i/unpack.html
- http://docs.ruby-lang.org/ja/2.2.0/doc/pack_template.html
- https://www.ruby-forum.com/topic/82241
アプリを起動した時に表示される画面の作り方(LaunchScreen)


###ローンチスクリーン(Launch Screen)とは
>アプリを起動した時に最初に一定時間表示される画面のことです。他にもスプラッシュ（Splash）画面とも言います。
>有名なアプリで言うと、TwitterやLINEを起動した時にロゴが出てくる画面です。

##作成方法
プロジェクトを作成時に、デフォルトで表示されている「LaunchScreen.storyboard」に表示したい画像や文字を入れると簡単に表示されるようです。ただし、動きなどを付け加えたい場合は、アニメーションなどの処理を書く必要があります。


##リンク
5種類くらいのスプラッシュ画面のパターンが解説してあるので自分が作りたいイメージを探す時のご参考に
[UIとしてのスプラッシュ画面](http://www.standardinc.jp/reflection/article/splash-screen-as-the-ui/)


アニメーションを付けてやりたい方は他の方が書いてますのでご参考に
[[iOS] Twitterのようなアプリ起動アニメーション【動作イメージ追加】](http://qiita.com/okmr-d/items/07731aa1ede2998d823d)
appear.in roomのClaimになるためには

#appear.in roomのClaimになるためには

##Claimをクリック
![02.jpg](https://qiita-image-store.s3.amazonaws.com/0/123581/8cf030b3-e20b-d4bd-5708-e3ea3acb1f3b.jpeg)

##Sign up
![03.jpg](https://qiita-image-store.s3.amazonaws.com/0/123581/a1760bc1-00b3-0edd-aff6-b338a7c238f3.jpeg)

##携帯番号入力
![04.jpg](https://qiita-image-store.s3.amazonaws.com/0/123581/e3565819-89e1-8492-5b8d-e376a9c3981b.jpeg)


##コードが携帯に送信されてくるので入力
![06_.jpg](https://qiita-image-store.s3.amazonaws.com/0/123581/76c3a1e6-6847-16dd-1cab-09e6c902e6eb.jpeg)

##完了
![07.jpg](https://qiita-image-store.s3.amazonaws.com/0/123581/99fce44f-591f-b543-2938-2b1acd008e83.jpeg)


##設定画面
![08.jpg](https://qiita-image-store.s3.amazonaws.com/0/123581/cde9e2e9-d3e8-500f-f9d6-86c474dcc266.jpeg)


##アカウント設定
右上のプロフィール画像表示枠をクリック
![09.jpg](https://qiita-image-store.s3.amazonaws.com/0/123581/d5889fe2-cbd6-24bf-4368-464f1a4968f4.jpeg)

自分が所有する部屋が表示される
![10.jpg](https://qiita-image-store.s3.amazonaws.com/0/123581/8da13c56-3605-dac3-ff85-261109423b9f.jpeg)
cronを使ってCakePhp3で定期処理

#cronとは
cronはlinuxでコマンドを定期的に実行するためのデーモンプロセス。

#CakePhp3でShell
cronを使って定期処理を行う場合には、まず実行対象となるプログラムが必要になる。
CakePhp3では、コマンドから実行できるプログラムを作成する場合、Shellクラスを継承するプログラムを作る。

とりあえず、メールを送信するSendMailShell.phpを以下に示す。
なお、メール送信に関してはconfig/app.phpの編集も必要なため、そちらの詳細は
[こちらの記事(CakePhp3でGmailからメールを送る)](http://qiita.com/frost_star/items/4a56cec1f5de5eccbd09)を参照していただきたい。

```php:SendMailShell.php
<?php
namespace App\Shell;

use Cake\Console\Shell;
use Cake\Mailer\Email;

class SendMailShell extends Shell
{
	public function main(){
		$email = new Email('default');
		$email->to('送信先メールアドレス') //送信したいメールアドレスで書き直すこと 
			  ->subject('タイトル')
			  ->send('本文');
	}
}

```
このプログラムをsrc/Sehll以下に配置し、コマンドから実行する。
binフォルダに移動し、

```
cake send_mail
```

というように、`cake shell名`で対応するShellプログラムのmain関数が実行されていく。
shell名はSendMailShell.phpだとsend_mailのようにファイル名のSehll以前をスネークケースに直したような形になる。

これにより、コマンドから起動できるCakePhp3のプログラムができたので、次にcronを使って定期的にこのプログラムを実行する。

#cronで定期実行
##crondの起動
cronを使うためにはcrondが起動していないといけない。
crondが起動しているかどうかは以下のコマンドで確認

```
# /etc/rc.d/init.d/crond status
```
`crond (pid XXX)を実行中...`と表示されれば、実行されている。
実行されていない場合

```
# /etc/rc.d/init.d/crond start
```
これで実行開始。

##crontabでコマンド編集
```
crontab -e
```
のコマンドを実行すると、エディタが起動するので、これにcronコマンドを記述して保存することでそのコマンドが定期的に実行される。

###cronコマンド
cronコマンドは次のような形。

```
 分　時　日　月　曜日　コマンド
```
|要素|範囲|
|:--|:---|
|分 |0~59|
|時 |0~23|
|日 |1~31|
|月 |1~12|
|曜日|0~7(0,7:日曜)|

`*`(アスタリスク)を指定すると毎回実行される。
`5-10`のように範囲指定もできる。
`*/5`とすると5分ごとのように指定できる。
`5,10,15`のように列記もできる。

時間の部分の記述の例

```
* * * * * 毎分実行
*/5 * * * * 5分ごとに実行
0 * * * * * 毎時0分に実行
10,30 * * * * 毎時10分と30分になったら実行
10-30 * * * * 毎時10分から30分まで毎分実行
10-30/5 * * * * 毎時10分から30分まで5分ごとに実行
```

コマンドは実行されるコマンドでありパスを通してないとフルパスで指定する必要があるので、`/プロジェクトのbinファイルのパス/cake send_mail`となる。

最終的に毎日0時0分にメールを送信するコマンドは

```
0 0 * * * /プロジェクトのbinファイルのパス/cake send_mail
```

#多重実行防止
毎日0時0分にメール送信するだけであれば大した処理時間ではないが、毎分それなりに重い処理を行う場合は、コマンド実行中に再度コマンドが実行されるということがあり得る。
そのためには、`flock`コマンドを使ってコマンドにロックをかける。

```
* * * * * flock -n /tmp/sendmail.lock php /プロジェクトのbinファイルのパス/cake send_mail
```
技術英語 > causing the glass to [cloud up] / can't see through the glass

http://www.scientificamerican.com/podcast/episode/smart-glass-goes-from-clear-to-cloudy-in-a-jolt/
Smart Glass Goes from Clear to Cloudy in a Jolt


But apply voltage, and the nanowires are attracted to each other ever so slightly across the glass—which deforms those rubbery sheets just enough to scatter light, causing the glass to <font color=red>cloud up</font>. 

http://eow.alc.co.jp/search?q=cloud+up&ref=sa
> 曇る、曇らせる

電圧をかけることでnanowiresが引っ張り合って、ゴム製のシートが光を散乱するようになり、ガラスを曇らせることができる。

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

> can't see through

http://www.revitforum.org/architecture-general-revit-questions/152-transparent-glass-not-transparent-section-view.html

> I can't see through the glass.

100%透明に設定したglassが透明にならないバグ。
Monacaを使った初歩的な開発

【質問のためそのうち投稿削除】
HTML5＆CSS

<B>Monacaを使った開発</B>

まだ、右も左もわからずに製造しています。
どなたかご教授願いたいです。

MAPを全国表示し
現在地から都道府県を特定し、
GoogleMapみたいにフラグを立てたい。（県庁所在地とかで）

何かあればコメントください。
どなたかよろしくお願いいたします。
プログラミング学習している中で学んだ用語


<h1>プログラミング学習で学んだ用語・ポイント</h1>
<body>
①text-align
要素の項目位置を設定できる。例えば、中央揃えしたい場合は、「center;」を付け加えれば良い。


</body>
チームワークに向け絶対にインストールされるツール

# 開発者の悩み
- どうやって作っている機能また修正しているバグを早くテスターに見せるかな。。
- ローカルのデータを他の人が使いたい場合どうすればいいかな。

# 提案１
- 開発サーバーを準備する。
- でも開発者のフローがこうになる
- ローカルで: commit, push
- サーバで: pull, restart

# 提案２
- ngrokを使う
- ngrokを起動する: `ngrok http 3333`　=> output : `xxxx.ngrok.com`
- 普通に開発する
- 他の人に見せたい時: `xxx.ngrok.com`を渡する。
windowsにfluentdをインストールする手順

# 概要

- windowsにfluentdをインストールする手順です。
- rubyがバンドルされたtd-agentという形で提供されてるlinuxに入れる場合と比べて面倒です。

# 参考

- [fluentd for WindowsをRuby 2.2で動かす](http://qiita.com/nurse/items/b38a7f2c084cf2b56631)
- [fluentd Windows版をWindowsサービスとして動かす](http://qiita.com/okahashi117/items/9b55418e770f1f5ce4b7)


# 環境

- Windows10 Proエディション(64bit)
- Ruby 2.2.4 (x64)
- fluentd v12


# インストール手順

## Rubyをインストール

- ダウンロードURL  http://rubyinstaller.org/downloads/
      - rubyinstaller-2.2.4-x64.exe
      - DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe


- rubyinstaller-2.2.4-x64.exeを実行
  - 「Rubyの実行ファイルへ環境変数PATHを追加する」にチェック

- DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exeを実行
   - 解凍先は、`C:\rubydevkit`を指定
   - コマンドプロンプトを起動してコマンドを実行

```
cd C:\rubydevkit
ruby dk.rb init
ruby dk.rb install
```

## gitをインストール

- 既に入っていれば不要。(gitのインストール手順は省略)
 
## fluentdをインストール

```
cd C:\Temp
git clone https://github.com/fluent/fluentd.git
cd fluentd
git checkout windows
gem install bundler
bundle
bundle exec rake build
# fluentd 0.12.15 built to pkg/fluentd-0.12.15.gem.
# pkg配下にgemが作られるのでそれを指定してインストール
gem install pkg\fluentd-0.12.15.gem --no-ri --no-rdoc
```

## その他

```
# fluentdの実行ファイル
C:\Ruby23-x64\bin\td-agent
```

# 動作確認

## 内容
- 入力(Input Plugin)として、in_exec(HOSTNAMEコマンド実行）  
  - [exec Input Plugin](http://docs.fluentd.org/articles/in_exec)
- 出力(Output Plugin)として、out_stdout(ログファイルに出力されます) 

## 手順
- `C:\Temp\fluentd\fluent.conf`を編集
  - keysは
  - タグ名は、なんでも良いがここでは、info.win
  - コマンドの実行間隔は10秒

```
<source>
  @type exec
  format tsv
  command HOSTNAME
  keys hostName
  tag info.win
  run_interval 10s
</source>

<match>
  @type stdout
</match>
```

- fluentdの起動

```
cd C:\Temp\fluentd
fluentd -c ./fluent.conf
```

- ログ確認(stdoutの内容が見れる）

```
2016-05-15 02:16:11 +0900 info.win: {"hostName":"game-PC"}
2016-05-15 02:16:21 +0900 info.win: {"hostName":"game-PC"}
2016-05-15 02:16:31 +0900 info.win: {"hostName":"game-PC"}
```
Async.js v2の過去非互換変更について

[async.js](https://github.com/caolan/async)のバージョンをあげたら今まで動いていたコードが動かなくなった。調べてみたらversion 2.0になって過去非互換な変更が入っていたのでここで簡単にまとめておきます。

なお、確認に使ったのは 2.0.0-rc4なのでまだ変わる可能性はゼロではないと思います。

変更は、以下の関数に影響がありそう。

 - `filter`, `filterSeries`, `filterLimit`
 - `detect`, `detectSeries`, `detectLimit`
 - `some`, `someSeries`, `someLimit`
 - `every`, `everySeries`, `everyLimit`
 - `auto`
 - `retry`

数が多いように見えるが、最初の4種類(`filter`, `detect`, `some`, `every`)はほぼ同じ変更で、Callback関数の引数の変更。例えば`filter`を例に取ってみると、これまでは

```
var async = require('async');

async.filter([1, 2, 3], function(item, callback) {
  callback(item > 1);
}, function (results) {
  console.log(results);
});
```

と書けていたものが、

```
var async = require('async');

async.filter([1, 2, 3], function(item, callback) {
  callback(null, item > 1);
}, function (err, results) {
  console.log(results);
});
```
と書かなければならなくなる。変更点は以下の二点。

 - iteratee (与えられたリストの要素一つ一つに適用される関数)の中で呼ばれるコールバック関数の引数が`callback(truthValue)`から`callback(error, truthValue)`となった。iterateeの中でエラーが起きた時に第一引数にエラーの値を渡せるようになったのだが、逆に言うと、エラーじゃない時にはnullなどif文でfalse判定されるものを入れて置かなければならない。
 - async.filterの第三引数に設定するコールバック関数の引数が`callback(results)`から`callback(error, results)`となった。このコールバックは通常は全てのiterateeの処理が終わった後に呼び出されるのだが、iterateeから一つでもerrorが上った時には直ちにこのコールバックが呼ばれる。

`detect`, `some`, `every`もiterateeで真偽判定を行ってその結果をコールバックで返す形式なので、同じようにコールバックでのエラー指定とその結果受け取りの引数が増えている。

それから、`auto`はコールバックの引数の順番変更。

v1ではこう書けていたのが

```
var async = require('async')

async.auto({
    a: function(callback){
        console.log('in a');
        callback(null, 'a1');
    },
    b: function(callback){
        console.log('in b');
        callback(null, 'b1');
    },
    c: ['a', 'b', function(callback, results){
        console.log('in c', JSON.stringify(results));
        callback(null, 'c1');
    }]
}, function(err, results) {
    console.log('err = ', err);
    console.log('results = ', results);
});
```

v2でこうなる。

```
var async = require('async')

async.auto({
    a: function(callback){
        console.log('in a');
        callback(null, 'a1');
    },
    b: function(callback){
        console.log('in b');
        callback(null, 'b1');
    },
    c: ['a', 'b', function(results, callback){
        console.log('in c', JSON.stringify(results));
        callback(null, 'c1');
    }]
}, function(err, results) {
    console.log('err = ', err);
    console.log('results = ', results);
});
```

どこが違うのか、もはや間違い探しのレベルだが、正解は c: のタスクとして呼び出している関数の引数の順番。従来は`task(callback, results)`だったのが`task(results, callback)`となった。

そして残った`retry`だがこれはどう変わるのかが今ひとつ判らなかった。「コールバックは2.0でオプショナルになった。そして、v1の`retry`は`retryable`として残してあるよ」と書いてあるのだが、retryの説明はv1とv2で変わっていないし、もしかしてこれからドキュメントの更新とかあるのかな。なにか判ればあとからでもここに追記しよう。
Use Swift class In objc


1. bridging file. eg. "test-bridging-header.h".
2. In objc class `.m` file, `#import "test-Swift.h"`.（Project name + -Swift.h）.
3. then I can use swift class in my objective-c class.

**ps. Can only #import "test-Swift.h" in `.m` file. In `.h` file, I can do only that `@class SwiftModule`.**
word2vec のオプション一覧

今更ながら [米googleの研究者が開発したWord2Vecで自然言語処理(独自データ)](http://qiita.com/okappy/items/e16639178ba85edfee72) を見ながら word2vec へ入門した。
色々と学習を進めるとトレーニングコマンドのオプションがまとまっているページがなかったのでまとめてみた。

が、入門したての私にはわからないものがほとんど。そして意味がわかってもどういった使い方をすればいいのかがわからないという結果に。。

# word2vec のオプション

|オプション|内容|備考|
|:--|:--|:--|
|-train|学習に使用するファイル|分かち書きが必要|
|-output|学習結果を出力するファイル名||
|-size|ベクトルの次元数||
|-window|文脈の最大単語数||
|-sample|単語を無視する頻度||
|-hs|学習に階層化ソフトマックスを使用するかどうか||
|-negative|ネガティブサンプリングに用いる単語数||
|-threads|学習に使用するスレッド数||
|-iter|トレーニング反復回数||
|-min-count|n回未満登場する単語を破棄||
|-alpha|学習係数||
|-classes|（ベクトルよりもワードクラスを優先させるらしいがどういうことだ？）||
|-debug|デバッグモード||
|-binary|バイナリ形式で出力するかどうか||
|-save-vocab|語彙をファイル保存||
|-read-vocab|語彙をファイルから使用||
|-cbow|学習モデル CBOW を使うか、Skip-gram を使うか||

# help

```
Options:
Parameters for training:
	-train <file>
		Use text data from <file> to train the model
	-output <file>
		Use <file> to save the resulting word vectors / word clusters
	-size <int>
		Set size of word vectors; default is 100
	-window <int>
		Set max skip length between words; default is 5
	-sample <float>
		Set threshold for occurrence of words. Those that appear with higher frequency in the training data
		will be randomly down-sampled; default is 1e-3, useful range is (0, 1e-5)
	-hs <int>
		Use Hierarchical Softmax; default is 0 (not used)
	-negative <int>
		Number of negative examples; default is 5, common values are 3 - 10 (0 = not used)
	-threads <int>
		Use <int> threads (default 12)
	-iter <int>
		Run more training iterations (default 5)
	-min-count <int>
		This will discard words that appear less than <int> times; default is 5
	-alpha <float>
		Set the starting learning rate; default is 0.025 for skip-gram and 0.05 for CBOW
	-classes <int>
		Output word classes rather than word vectors; default number of classes is 0 (vectors are written)
	-debug <int>
		Set the debug mode (default = 2 = more info during training)
	-binary <int>
		Save the resulting vectors in binary moded; default is 0 (off)
	-save-vocab <file>
		The vocabulary will be saved to <file>
	-read-vocab <file>
		The vocabulary will be read from <file>, not constructed from the training data
	-cbow <int>
		Use the continuous bag of words model; default is 1 (use 0 for skip-gram model)
```

## さいごに

私のような入門者の助けになる記事になればいいなと思っています。
不明部分についてご存知の方いれば教えていただけると助かります。

## 参考

* [gensimとword2vec](http://blog.daionet.gr.jp/knok/2015/04/22/gensim-word2vec/)
* [O'Reilly word2vecによる自然言語処理](https://www.oreilly.co.jp/books/9784873116839/)
* [【機械学習】ニューラルネットワークにおける効率的なパラメータ調整方法についてまとめてみた](https://qiita.com/To_Murakami/items/e8b7bfe66750fb3f2050)
* [文章をベクトル化して類似文章の検索](https://qiita.com/akira_/items/f9bb46cad6834da32367)
* [ディープラーニングにおける学習のコツとハイパーパラメータのガイドライン](https://qiita.com/akimach/items/88356ef46e98f045b035)
Longest common prefix


Given array as:

```
[

  "abcdefgh",

  "aefghijk",

  "abcefgh"
]

```

Solution

```cpp
string getPrefix(string a, string b){
    int l = min(a.size(), b.size());
    string r="";
    for (int i; i < l; i++){
        if (a[i] == b[i]){
            string t{a[i]};
            r = r + t;
        }
    }
    return r;
}

string longestCommonPrefix(vector<string> &A) {
    string r = A[0];
    for (int i = 1; i < A.size(); i++){
        r = getPrefix(r, A[i]);
    }
    return r;
}
```
animetick.net用のtampermonkey Script

[Animetick / アニメティック - アニメ視聴管理サービス](http://animetick.net/) って名前の通り、アニメ視聴管理をするサイトがあるんだけど、このサイト用のuserScriptを作った

[Tampermonkey](http://tampermonkey.net/) というuserScript用。とはいえ特別な事なんか全然してないから移植は簡単だと思う

これが
![imgTemp-2016-05-15-00-10-35.png](https://qiita-image-store.s3.amazonaws.com/0/5825/56964820-9dad-9f97-2dc8-fffc5323369f.png)
こうなる
![imgTemp-2016-05-15-00-11-02.png](https://qiita-image-store.s3.amazonaws.com/0/5825/f2e8543d-edeb-0849-077b-88466e098a8a.png)

ソース

```js
// ==UserScript==
// @name       animetickの各ユーザー画面に色々追加
// @namespace  http://use.i.E.your.homepage/
// @version    0.1
// @description  enter something useful
// @match      http://animetick.net/users/*
// @copyright  2012+, You
// @grant GM_addStyle
// ==/UserScript==

//プログレスバーを見やすく変更
GM_addStyle([
"ul.animations li.animation div.icon div.progress{  -webkit-border-radius: 0;  opacity: 1;  width: 85px;  height: 10px;  top: 48px;  left: 7px;  background: #0FF;}",
"ul.animations li.animation div.icon div.progress div.progress-bar{height: 10px;  -webkit-border-radius: 0;background: #F00;  opacity: 1;}",
"div#body{width:100%;}",
"ul.animations li.animation{float:left;  margin-left: 0px;padding:0;}",
".user_info{display: none;}",
"div.user_anime{overflow: hidden;}",
"#body>h2{display: none;}",
"div.beforeCool>ul.animations>li.animation.fullWatch{display: none;}",
"li.animation div.icon div.number{position:absolute;width:85px;height:10px;top:35px;right:-11px;color:#000;font-weight:bold;text-shadow:0px 2px 1px white,0px 1px 1px white,1px 1px 1px white,1px 0px 1px white,2px 0px 1px white,1px -1px 1px white,1px -2px 1px white,0px -2px 1px white,-1px -2px 1px white,-2px -2px 1px white,-2px -1px 1px white,-2px 0px 1px white,-2px 1px 1px white,-1px 1px 1px white;}",
].join("\n"));
window.addEventListener("DOMContentLoaded", function(){
    var f=false;
    jQuery("#body>div.user_anime").each(function(){
        var target=$(this);
        if(f){
            target.addClass("beforeCool");
        }else{
            f=true;
        }
    });
    jQuery(".animation").each(updateOneAnimationNode);
}, false);
function updateOneAnimationNode(){
    var styleString=$(this).find(".progress-bar").attr("style");
    if(styleString=="width: 0.0%;"){
        $(this).css({ opacity: 0.3 });
    }else if(styleString=="width: 100.0%;"){
        $(this).css({ opacity: 0.3 ,backgroundColor: "rgba(0, 0, 0, 0.05)"});
    }
    var rate=$(this).attr("data-watched-rate");
    $(this).find(".progress").before($("<div>").text(rate).attr("class","number"));
    //非表示にするかもクラスを追加する
    if( styleString=="width: 100.0%;" /*&& rate.match(/\d\d/)*/){
        $(this).addClass("fullWatch");
    }
}
```

以上
MSYS2 + ConEmu で Cygwin からの脱却を図る

## 経緯

普段の開発ではMacやLinux(Ubuntu/CentOS)を使っているのですが、
Windows で育った身としては Windows でもちょっとしたことができるといいなーと思い、 Cygwin を入れていました。
しかし以下のような理由があり結局ほぼ使っていませんでした。

* 動作が極端に重くなるときがある
  * 原因はよくわからない
  * パッケージのインストールも異常に遅かったりする 
* Cygwin のデフォルトの端末である mintty だと zsh が自環境で文字化けする
  * 設定からロケールを日本語/SJISに変更する、といったアプローチだけでは完全に解決しなかった
* `/cygdrive/c/` とかいうパス
* 各所で `apt-cyg` の代わりに勧められている `cyg-fast` がバグったりしていてなんとなく信用ならない (http://gametricks.blog40.fc2.com/blog-entry-101.html)

これらは単に僕の勉強不足なだけで cygwin でも解決できたりするかもですが、
一から組み直したら解決するかもと思い、 MSYS2 + ConEmu で環境を整えなおしてみました。
以下メモ書き。

## MSYS2のインストール

https://sourceforge.net/p/msys2/wiki/MSYS2%20installation/ にしたがってやります。

### MSYS2 のダウンロードとインストール

上記ページから 32bit版あるいは64bit版を選択してダウンロードします。
今回は `msys2-x86_64-20160205.exe` をダウンロードしました。
インストールは適当にNextを押していれば終了すると思います。
インストールが終了したら MSYS2 Shell を起動します。

### パッケージマネージャのアップデート

以下のコマンドで パッケージマネージャ(pacman) のバージョンを確認します。
pacman は ArchLinux 由来のパッケージマネージャらしいです。

```
$ pacman -V
```

バージョンが 5.0.1.6403 以上の場合:

```
pacman -Syuu
```

バージョンが 4.2.1.6187 以上の場合:

```
$ update-core
$ pacman -Suu
```

を実行します。（途中端末の再起動が必要です）

MSYS2 のインストールは以上です。

## zsh のインストール

```
$ pacman -S zsh
```

で入ります。

## ConEmu のインストール

ConEmu を入れるのに Chocolatey で入れる必要はないのですが、この方法で入れたので書いておきます。

## Chocolatey のインストール

cmd.exe か PowerShell を管理者権限で立ち上げて、以下のコマンドを入力:

cmd.exe の場合:

```cmd.exe:cmd.exe
@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin
PS:\>
```

PowerShell の場合:

```ps1:Powershell
iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))
```

その後端末を再起動すると、`chocolatey` コマンドが実行できるようになっているはずですが、駄目な場合は Chocolatey のインストールを解説している記事をあたってください。

### ConEmu のインストール

以下を実行するだけ:

```ps1:Powershell
PS> choco inst conemu
```

### zsh を ConEmu のデフォルトに設定

ここを参考にしました(http://zarari.hatenablog.com/entry/2016/05/04/173634)

ConEmu を起動して、 Settings の Startup → Tasks に zsh 起動コマンドを追加します。

* `set CHERE_INVOKING=1 & %ConEmuDrive%\msys64\usr\bin\zsh.exe --login -i -new_console:C:"%ConEmuDrive%\msys64\msys2.ico"`
* "Default Shell" にチェックを入れる

以上です。

## インストールしてみたものの

無事 cygwin ではない環境が Windows に入り、文字化けの問題やパッケージマネージャの不具合はなさそうですが、
結局いつも使っている zsh や vim の設定ファイルを読み込ませたらうまくいかず、
しばらくは Mac や Linux で頑張るかな…という感じになってしまいました。
Windows Subsystem for Linux もそろそろ公開予定とのことなので、おとなしく待つことにします。
Windows エクスプローラからBashのコマンドウインドウを開く

![fish.png](https://qiita-image-store.s3.amazonaws.com/0/125538/51937052-a919-3dbe-6c5a-19d41dc7ffc1.png)
## はじめに
ターミナル使っているときに
CDコマンドでカレントディレクトリを移動するのが地味に面倒ですね。
本記事では、Windowsのエクスプローラで表示しているディレクトリで
bashを開くことでこの問題を解決します。

## 前提
<b>[TIPS] Windowsエクスプローラからコマンドプロンプトを開く</b>
> アドレスバーに「cmd」と入力して [Enter]

![cmd.gif](https://qiita-image-store.s3.amazonaws.com/0/125538/8a50ed74-4acc-77b1-889b-b5f7901f221a.gif)

<b>現在開いているフォルダのパス</b>から使えるのが便利。
⇒ Windowsエクスプローラから <b>Git-bash</b> , <b>Bash on Ubuntu on Windows</b>を開けると更に捗る。

## 0. 2016/05/14(初稿)時点の方法(<b>Git-bash</b>)
### 0-1. 以下のバッチファイルを作り、パスを通したディレクトリに配置

```bat:bash.bat
@echo off
if "%CD%" == "C:\WINDOWS\system32" (
cd %HOMEDRIVE%%HOMEPATH%
)
start "" "C:\Program Files\Git\git-bash.exe"
```

### 0-2. アドレスバーに<b>「bash」</b>と入力して [Enter]

## <b>2017/10/13追記</b>
<b>windows10</b>では、アドレスバーに <b>「bash」</b> と入力すると
 <b>Bash on Ubuntu on Windows</b> が起動する。
というか、<b>BoW</b> あれば特に <b>Git-bash</b> 要らない気も。。。

というわけで、

# <b>ConEmu</b>使用の<b>fish shell</b>を開く
## 1. Windows10で快適なfishシェル環境構築
以下に従い、ConEmuでfishシェルを使用できるようにする。
> [Windows10で快適なfishシェル環境構築](https://qiita.com/ysks/items/6c9d751d9a3b3b1b8020)

## 2. ConEmuのtasks設定を編集
[1.の記事](https://qiita.com/ysks/items/6c9d751d9a3b3b1b8020)の
<b>6.ConEmuの設定</b> のtasksの設定で <b>HOMEDIR</b>に移動させている <b>~</b> を削除する

```diff:ConEmuのtasks設定
-%windir%¥system32¥bash.exe ~ -new_console:t:"Fish" -cur_console:p -c fish
+%windir%¥system32¥bash.exe -new_console:t:"Fish" -cur_console:p -c fish
```

## 3. バッチファイルを作り、パスを通したディレクトリに配置

※ [*1](https://qiita.com/bamchoh/items/431b9c7a8d8e9143016b) を参考に作成。
本記事では、task名は ```Fish::Bash on Ubuntu on Windows``` としています。

```bat:fish.bat
@echo off

rem
rem fish shellをエクスプローラから開くためのバッチ
rem

setlocal

rem CONEMU_PATHは自身の環境に合わせて変更してください。
set CONEMU_PATH=C:\Program Files\ConEmu\
set CONEMU_EXE=ConEmu.exe

if "%PROCESSOR_ARCHITECTURE%" NEQ "x86" (
  set CONEMU_EXE=ConEmu64.exe
)

set CONEMU=%CONEMU_PATH%%CONEMU_EXE%

rem /cmd { } は ConEmuに設定した task名 を入力してください。
start "" "%CONEMU%" /dir "%CD%" /cmd "{Fish::Bash on Ubuntu on Windows}" -new_console

endlocal
```
## 3. アドレスバーに<b>「fish」</b>と入力して <b>[Enter]</b>
![fish.gif](https://qiita-image-store.s3.amazonaws.com/0/125538/aaabb729-9305-ab20-9bd8-b2053a54332b.gif)

## 参考
>*1) エクスプローラで開いているフォルダをConEmu上のnyagosで開く
 https://qiita.com/bamchoh/items/431b9c7a8d8e9143016b
Google Analyticsによると、土日・祝日はやはり休んでいる人が多い

[QiitaでGoogleアナリティクスを利用する手順](http://qiita.com/Qiita/items/c7f704e3786df3aa7a11)で、しばらくやってみて、少し気づいたことを。

自分のこれまでの記事についてのページビュー数をおっています。
ぼくの場合、1週間でトータル1500~2000くらい、多い記事は200~300くらいです。

# 土日・祝日でページビュー数が減る

平日に比べて、はっきりと落ちます。だいたい、1/3から1/4になります。この間のGWのときもそのくらい減っていました。ただ、谷間の平日のところは、普段と同じくらいになっていました。実にカレンダー通りです。

# 結局、大抵の人は仕事中に調べたりしている?

ググって何かを調べるという行為は、仕事中にやっている人が多数派なんでしょう。qiitaへの新規投稿は、土日。祝日でも結構あるように思いますが、それらを調べて見る人は減っているということでしょう。

# 休日でも勉強すれば差がつけられる?

エンジニアはプライベートの時間でも勉強しよう、とよく言われていますが、google analyticsによると、休日はやはり休んでいる人が多いのではという気もします。非常に当たり前のような気もしますが。

# 参考サイト

http://qiita.com/advent-calendar/2015/ga
onclick()とonblur()の順序

最初以下の例を見てみます。

    <input id="Text1" type="text" onblur="alert('onblur')"/>
    <input id="Button1" type="button" value="button" onclick="alert('onclick')"  />

デモ：https://jsfiddle.net/thanh1992/8eej3m91/
テキストを入力した後、ボタンをクリックしてみると、onblurイベントは発動しますが、**onclickイベントは発動しません。**
#１．onclickイベントを動かないことの修正
onclickイベントの代わりに、onmousedownイベントを使います。

    <input id="Text1" type="text" onblur="alert('onblur')"/>
    <input id="Button1" type="button" value="button" onmousedown="alert('onclick')"  />

デモ：https://jsfiddle.net/thanh1992/z0cmuoeq/
結果は、onmousedownイベントが発動した後、onblurイベントが発動します。[^1]

#２．イベントの順序
以下はイベントのタイミング（早->遅）
   

     mousedown
     blur
     mouseup
     click 
        
コード：

    <input id="Text1" type="text" onblur="console.log('blur');"/>
    <input id="Button1" type="button" value="button" onclick="console.log('click');"  onmousedown="console.log('mousedown');" onmouseup="console.log('mouseup');"/>

デモ：https://jsfiddle.net/thanh1992/uep6n2x9/

#３．結論
イベントのタイミングが違いますから、コードがうまく動くように、イベントの順序に注意してください。

[^1]: Firefoxの場合。Google Chromeの場合はonmousedownのみ発動します。
名前を指定してssh鍵を作り、githubでssh接続する(Mac)

###1)キーを作成する

```
ssh-keygen -t rsa -f file_name
```

###2)キーをクリップボードにコピーする

```
$ pbcopy < ~/.ssh/file_name.pub (Mac)
```

###3)GitHubのリポジトリのSettingsのDeploy Keysのkeyにコピーしたのものを設定する。

###4)同上のtitleにコピーしたファイル名を設定する。

[関連記事:OpsWorks で GitHub のプライベートリポジトリを利用するときのSSH鍵の設定](http://qiita.com/tak74/items/be6be18f0f30107c626d)
Macでキーボードから右クリック

Windowsだとメニューキーがあるけど
Macだとトラックパッドに手を動かさないといけないから何とかしてみる

## [Karabiner](https://pqrs.org/osx/karabiner/index.html.ja)

これを使って全然使わないcapsを右クリックに割り当てよう

![スクリーンショット 2016-05-14 22.44.42.png](https://qiita-image-store.s3.amazonaws.com/0/110859/0e65e009-0a9e-585c-4273-99e06dc50b4c.png)

と思ったら[Seil](https://pqrs.org/osx/karabiner/seil.html.ja)っていう追加アプリがいるらしい
Seilからcapsのkeycodeを110に変更
Karabinerで "For PC Users > Change PC Application Key > Application Key to RightCick"にチェックしてReload XML

**できた！**
けどちょっとイメージしたのと違う
Windowsのメニューキーとは違い、アクティブな場所ではなくマウスポインタがある場所での右クリックになる

BetterTouchToolとか使うと上手くいくのかな？
知ってる人がいたら教えてください
Unity 座標／サイズ周りに関してのメモ


# まえおき
unity5初心者です。
デザイナに大切（？）なのは素材のサイズ。デザインサイズにも関わってきます。
なので、ワールド座標とローカル座標周りに関してのメモ。これからアニメーションウィンドウを使ってトゥイーンアニメーションやエフェクトウィンドウでエフェクト追加するためにも押さえておきたいところ。なお、2Dでの話となります。

# 検証する内容
- ワールド座標とローカル座標の変換や素材のサイズの変わりに関して理解できるようにカメラのサイズ違いをキャプチャを通して確認。
- ワールド座標とローカル座標で親要素が変わってものレイアウトで、素材の大きさが変わらないようにするためにどうしたら良いのかの検証。

# 検証の設定
## メインカメラ
|項目|設定内容|
|:------:|:---:|
|画面比率|16:9|
|スクリーンサイズ|1920*1080|
|画面向き|縦型|
|カメラサイズ|8（または10）|
## canvas
|項目|設定内容|説明|
|:------:|:---:|:---|
|Render Mode|Screen Space-Camera|UI をスクリーンに描画するか、3D 空間のオブジェクトとして存在させるかの方式。|
|PixelPerfect|true|精度維持のために UI をアンチエイリアス無しで描画するか。|
|RenderCamera|MainCamera|UI を描画するカメラ（詳細は下記）。|
|PlaneDistance|100|UI の平面が描画担当のカメラの前からどのくらい離れて配置されるか。|
|SortingLayer|Default|レイヤーの重なり|
|OrderinLayer|9|レイヤーの深度設定|
## 素材に関して
|canvas内|canvas外|
|:------:|:---:|:---:|
|RecTransform(x,y,0)|Transform(x,y,0)説明|
|180*180のpng画像|180*180のpng画像|
|scaleは１|scaleは１|
|Sprite Renderer|Image(UI)|

# 検証結果
- ワールド座標のspriteの大きさはカメラに依存しないのでカメラサイズが変わっても変わらない。
- ローカル座標のImageの大きさはカメラに依存するcanvasに含まれるのでカメラサイズが変わると大きさが変わる。
- 位置に関しては画面比率と同じにするとマス目＝比率そのままなので分かりやすい。
・ 9:16 = 1080:1920

- 画像のサイズはカメラサイズを10にすると素材の大きさが揃う。
・ １マスのサイズが１辺96pxとして計算できる。
・ カメラサイズ８だと、１マスのサイズが１辺120pxとして計算になるので素材が小さくなる。
・ 同じ大きさを割る数が変わるので、カメラサイズ８の方がカメラサイズ10よりもワールド座標では1.25倍大きくなる。ローカル座標ではピクセルサイズは変わらないので反対に小さくなる。ややこしい。
- unityの1unitのサイズ
・ peference Pixels per Uniで設定できるサイズが素材のサイズに大きく関与しているみたい。
・ peference Pixels per Uniの数値が100の時はカメラサイズが１０だと等倍になります。

## 画面キャプチャ
それぞれのカメラサイズのピンクのグー画像を確認するとよくわかります。
なお、アプリにパッケージ化しても当たり前ですが同じです。
### カメラサイズ 8
![スクリーンショット-2016-05-14-14.49.31.png](https://qiita-image-store.s3.amazonaws.com/0/70116/2b78cae5-b1e5-141e-b01b-96cc35db7d46.png)
※カメラサイズ８にしているのは縦のアスペクト比が16なので、中心０として上下８マスずつとなるためカメラサイズ８なのです

### カメラサイズ 10
![スクリーンショット-2016-05-14-14.49.05.png](https://qiita-image-store.s3.amazonaws.com/0/70116/63acb293-b7f0-964f-720f-be314176f572.png)

# まとめ
アスペクト比含め、peference Pixels per Uniでの設定でカメラサイズを決めるのがいいと思いました。ワールド座標とローカル座標の関連が反対のようで反対でなく比例もしているややこしい関係ということがわかった。デザインサイズはアスペクト比カメラサイズ現在の端末の解像度含め総合して判断が必要になってくる。
3D空間においてシェードにより画像のピクセルを再描画するから、意図としない画像の劣化が起こらないようにするためにも必要十分な画像データを用意するために検討する材料になると思いました。
サイトの速度改善するときのAjaxの使い方

## はじめに
サービスの速度改善のために先月読んだ[ハイパフォーマンスWebサイト](http://www.amazon.co.jp/dp/487311361X/ref=pd_lpo_sbs_dp_ss_1?pf_rd_p=187205609&pf_rd_s=lpo-top-stripe&pf_rd_t=201&pf_rd_i=4873114462&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=121D1AN5Y7FT5N8AVJP9)がとても良かったので、[続](http://www.amazon.co.jp/%E7%B6%9A%E3%83%BB%E3%83%8F%E3%82%A4%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9Web%E3%82%B5%E3%82%A4%E3%83%88-%E2%80%95%E3%82%A6%E3%82%A7%E3%83%96%E9%AB%98%E9%80%9F%E5%8C%96%E3%81%AE%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9-Steve-Souders/dp/4873114462)の方も買って読んでいます。
そのまとめというかメモを。今回は第1章のメモです。

## トレードオフ
- コードに手を加えるときはいつでも、バグの混入の危険性の代わりにコード改善の可能性を取っていることを忘れない  
→最適化をするときは、実行にあまり時間がかからない部分を高速化しようとはせず、計測した上で、効果が得られないものには手を出さない

## 最適化の原則
- アルゴリズムがパフォーマンスに大きく影響
- もっとも時間がかかるのはループ部分
- 多重ループの一番内側のループを最適化すると大きな効果あり
- 「欠陥の3軸」という3つの線

1. 非効率ライン：ユーザの集中力の低下
2. プラスとレーションライン：ユーザが待たされていると感じる
3. 欠陥ライン：フリーズしたように見え、ユーザがリロードしたり、離脱したりする

<img width="660" alt="figure1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/74581/77878e12-ad80-c290-5559-51fb29b86e40.jpeg">

- これらを回避するためには

1. ループ一回あたりの時間を減らす
2. ループの回数を減らす
3. 再設計のアルゴリズムを変える


- ループがネストしている場合は、上の2,3の回避方法しかない  
→ループのコストが*O(nlogn)*や*O(n^2)*、それ以上の場合、n(=処理)が増えるにつれてかかる時間が大幅に増えるため、ループ一回あたりの時間を減らしても大した効果はない

<img width="668" alt="figure2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/74581/5f4045de-df04-eb2f-176d-19d730b3a7ba.jpeg">


## Ajax
- サーバと(通常JSON形式の)データパケットをやり取りし、取得したデータをJavaScriptで書いたプログラムがブラウザの表示を更新する  
→ 送受信するデータ量が大幅に減り、視覚的フィードバックを返す時間を大幅に減らすが、実装するコストがかかる
- Ajaxアプリケーションは２つのシステムに完全に分離されている
- Ajax技術を性能向上に生かすには、適切な「分業」が不可欠で、パケットは限りなく小さくする  
→ 必要なときに必要な分のデータを送信することで、ブラウザ側の処理を抑え、ループの実行が速くなる
- すべてのデータをブラウザに送信するのは間違い  
→ ・Ajax化によって回避したはずの応答に遅延がまた出る  
・ブラウザが処理するデータが増えるため、パフォーマンスの低下に繋がる
- Ajax技術をうまく使えば、アプリケーションの高速化ができる  
→ポイントは、サーバとブラウザの間をとること

## ブラウザとJavaScript
- ブラウザはJavaScriptの実行にはほとんど時間を使わない  
→スクリプトの改善はせず、正しく分かりやすく書くべき
- DOMに時間がかかる  
※DOMとは、「Document Object Model」の略で、HTMLやXML文書を取り扱うためのAPIである。現在はすべてのブラウザがDOMを扱うことができる
dockerでpuppet実行エラー (invalid byte sequence in US-ASCII)

ロケール設定をちゃんとやってなかったdockerコンテナ上で、２バイト文字でつまったとき用のメモです。普通の環境であればインストール時にロケール設定されているはずですが、dockerでちょっと試したい時の暫定対処用。

# 症状

既存ファイルがないときやdiffが表示されない場合などはエラーにならないけど、ファイルを置き換えるなどで2バイト文字を含むdiffが表示される場合(--testオプションあり)で次のようなエラーになる。

```
Error: invalid byte sequence in US-ASCII
Error: /Stage[main]/Main/File[/tmp/puppet_erb_sample.txt]/content: change from {md5}5bf1f316d6eebb76edac121be636451c to {md5}f1995f537d52ea45d62b5858778f4368 failed: invalid byte sequence in US-ASCII
```

# 原因

RubyがUS-ASCIIになっている。

```
# /opt/puppetlabs/puppet/bin/ruby -e 'puts Encoding.default_external'
US-ASCII
```

# 暫定対策

試すだけであれば、一時的にRUBYOPTをUTF-8に設定。
実行するコマンドの前に、RUBYOPT=-EUTF-8をつける。

```
# RUBYOPT=-EUTF-8 /opt/puppetlabs/puppet/bin/ruby -e 'puts Encoding.default_external'
UTF-8
```

puppet applyするときも。

```
# RUBYOPT=-EUTF-8 /opt/puppetlabs/bin/puppet apply erb01.pp --modulepath=modules -t --noop
```

きちんとするなら、docker run時に言語設定。

```
docker run -it -e RUBYOPT=-EUTF-8 centos /bin/bash
```

さらにきちんとする場合は、Dockerfileでビルドするときにロケール設定をする。

# バージョンとか

```
# cat /etc/centos-release
CentOS Linux release 7.2.1511 (Core)

# rpm -qa | grep puppet
puppetlabs-release-pc1-1.0.0-1.el7.noarch
puppet-agent-1.4.1-1.el7.x86_64
```
AnsibleでソースからPythonをインストールする


Ansibleを使ってCentOSにPython2.7.10をソースからインストールしてみたいと思います。今回はPythonですが、流用すれば他のライブラリのインストールにも使えると思います。

## やりたいこと（コマンド）

大体やりたいことは下記の通りです。インストール先に`/usr/local/`、ソースの一時保存先に`/var/tmp/`を指定しています。

```sh
yum install gcc
wget https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz -P /var/tmp/
tar xvzf /var/tmp/Python-2.7.10.tgz -C /var/tmp/
cd /var/tmp/Python-2.7.10/
./configure CFLAGS=-fPIC --enable-shared --prefix=/usr/local/
make
make install
ln /usr/local/lib/libpython2.7.so.1.0 /lib64/libpython2.7.so.1.0
```

`configure`を実行した際にエラーになるかもしれないので`gcc`のインストールも行っています。`make install`を実行した時点でインストールはできていますが、インストールしたPythonを実行した時にエラーになったので最後にシンボリックリンクを貼っています。

参考：[Python エラー対処：error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory](http://kenzo0107.hatenablog.com/entry/2015/02/17/114506)

## playbook

### ソース

```yml
- hosts: all
  become: yes
  tasks:

    - name: Install gcc
      yum: name=gcc state=latest

    - name: Create tmp directory
      file: path=/var/tmp/Python-2.7.10 state=directory

    - name: Download Python
      get_url: >
        url=https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz
        dest=/var/tmp/Python-2.7.10.tgz
        creates=/usr/local/bin/python
      environment:
        LANG: C
        LC_ALL: C
        LC_MESSAGES: C

    - name: Unarchive Python
      unarchive: src=/var/tmp/Python-2.7.10.tgz dest=/var/tmp/ copy=no

    - name: Install Python
      command: >
        {{ item }}
        chdir=/var/tmp/Python-2.7.10/
        creates=/usr/local/bin/python
      with_items:
        - './configure CFLAGS=-fPIC --enable-shared --prefix=/usr/local/'
        - make
        - make install

    - name: Link Python lib
      file: src=/usr/local/lib/libpython2.7.so.1.0 dest=/lib64/libpython2.7.so.1.0 state=link
```

### 説明

#### `Install gcc`

前述したとおり、`gcc`が無ければエラーになるので`yum`でインストールしています。

#### `Create tmp directory`

この後に`Unarchive Python`を実行した際に保存先のディレクトリが必要だったのでここで予め作っています。

#### `Download Python`

Pythonのソースをダウンロードします。すでに存在する場合はダウンロードしません。

#### `Unarchive Python`

tgzを解凍します。`copy=yes`の場合はAnsibleを実行しているホストのファイルを参照します。今回はサーバー上のファイルを参照したいため`copy=no`としています。これを実行した際、ファイルが存在するはずなのに'No such file or directory'というエラーに遭遇したため、`environment`を追加しました。

参考：[Ansible の unarchive で No such file or directory](http://qiita.com/TakaakiOno/items/10271e56816862508fb3)

#### `Install Python`

ここでは`command`を使って`configure`・`make`・`make install`を実行しているだけです。その際、`chdir`でソースの置かれているディレクトリに移動しています。これらのコマンドはよく使うのでAnsibleのデフォルトの機能であるのかと思っていましたが、調べた時はちょっとわからなかったです。`creates`を指定していて、すでに`/usr/local/bin/python`が存在している場合はスキップされます。

#### `Link Python lib`

冒頭に書いたエラーの対策としてシンボリックリンクを貼っています。
python(matplotlib,pandas,sphinx)+wkhtmltopdfによるレポート環境構築

#目的

以下仕様で動くレポート作成ツールを作ったので動作環境をメモしておく。
後日汎用的な部分を公開する予定。

1. pandasでデータ解析した結果をmatplotlibを用いて図表する。
2. 1の結果を利用してsphinxでhtmlを生成する。
3. 作成したhtmlをwkhtmltopdfを利用してpdf化する。

#環境
-　windows7,32bit
-　python2.7.10
-　module(ipython,numpy,pandas,matplotlib,scipy,sphinx)類
-　wkhtmltopdfもインストールします。


#インストール作業

##python本体
windowにはpythonがデフォルトで入っていないため、
以下からをインストール。

https://www.python.org/downloads/
2.7.11 Windows x86 MSI installer

PATHへ以下を追加すればpython,pipがコマンドプロンプトから叩けるようになります。
```C:\Python27;C:\Python27\Scripts;
```

python2.7.9以降はpipがパッケージに付随されているされているそうです。

##module類

まずはpipを最新版にしておきます。

```powershell
pip install —upgrade pip
```

続いてpipで各種moduleを追加します。

```powershell
pip install ipython
pip install numpy　
pip install pandas
pip install sphinx
```
※pipでインストールする場合、numpyが64bit環境に対応しておらずエラーが場合があるようです。その場合は公式サイトから行いましょう。
http://sourceforge.net/projects/numpy/

scipyは公式サイトからインストールしました。
https://sourceforge.net/projects/scipy/files/scipy/0.16.1/

あとはmatplotlibをインストールします。

```powershell
pip install matplotlib
```

最後に確認コマンドでインストールされた一覧を
確認しておきます。上記モジュール類（依存するモジュールも入ってます）

```powershell
pip list
```

##wkhtmltopdf
下記サイトから環境に合わせたstable（安定版）を取得し、インストールします。
http://wkhtmltopdf.org/downloads.html

ちなみに今回は以下バージョンをインストールしました。
Windows	0.12.3.2　32-bit 

最後にPATHへ以下を追加すればOKです。
　C:\Program Files\wkhtmltopdf\bin

#まとめ
それぞれの役割は以下のようにしてます。

*pandas+matplotlib:* データ解析＋グラフ表示
*sphinx:* データをhtmlとして生成
*wkhtmltopdf:* htmlをpdf化

最近pandasを利用してデータ解析をはじめたんですが、
レポート（pdf形式）を自動で生成する方法を検討した結果、
このような環境でやるのが良さそうだと思います。

他にいい感じのやり方があれば教えていただけると嬉しいです。

#参考サイト
Pythonの機械学習・数値計算環境 (NumPy, SciPy, matplotlib, scikit-learn) をWindowsにインストール
http://www.terabo.net/blog/python-on-windows/
Sphinxで素早く簡単に綺麗な日本語のPDFを作成する方法
http://dxd8.com/archives/225/
[Monaca] CordovaプラグインとOnsen UIの利用について

Monacaでは、CordovaプラグインとOnsen UIを使用することができます。

Monacaで開発しているアプリでCordovaプラグインやOnsen UIを利用する場合は、アプリ内でCordovaの準備およびOnsen UIの準備を確認する必要があります。Cordovaの準備およびOnsen UIの準備が完了する前に機能にアクセスしても、正しい結果を得ることはできません。

# Cordovaの準備完了を確認する

Cordovaの準備の完了を確認するには、「deviceready」イベントで確認することができます。
index.html内での例です。

```
<script>
    document.addEventListener("deviceready", onDeviceReady, false);
    function onDeviceReady() {
        alert("onDeviceReady");
    }
</script>
```

document.addEventListenerに「deviceready」を設定することで、Cordovaの準備が完了したことを確認することができます。

# Onsen UIの準備完了を確認する

Onsen UIの準備の完了を確認するには、「ons.ready()」で確認することができます。
index.html内での例です。

```
<script>
    ons.ready(function() {
        alert(“ons.ready”);
    });
</script>
```

# アプリでプッシュ通知を利用している場合

プッシュ通知を利用しているアプリでは、プッシュ通知のsetHandler()内で、CordovaプラグインやOnsen UIの機能を利用する場合、

```
<script>
    monaca.cloud.Push.setHandler(function(data) {
        alert(“Cordovaプラグインの処理を記述します。”);
        alert(“Onsen UIの処理を記述します。”);
    });
</script>
```

と記述した場合、CordovaプラグインやOnsen UIの準備ができていない場合は、処理が失敗してしまいます。CordovaプラグインやOnsen UIを利用している場合は、

```
<script>
    document.addEventListener("deviceready", onDeviceReady, false);
    function onDeviceReady() {
        monaca.cloud.Push.setHandler(function(data) {
            alert(“Cordovaプラグインの処理を記述します。”);
        });
    }
</script>

<script>
    ons.ready(function() {
        monaca.cloud.Push.setHandler(function(data) {
            alert(“Onsen UIの処理を記述します。”);
        });
    });
</script>
```

のように、CordovaプラグインやOnsen UIの準備が整った後に処理を記述する必要があります。

ons.ready()は、Onsen UIコンポーネントの読み込みが完了し、devicereadyイベントの後に起動しますので、CordovaプラグインとOnsen UIを両方利用している場合は、下記のようにons.ready()内で処理をまとめることが可能です。

```
<script>
    ons.ready(function() {
        monaca.cloud.Push.setHandler(function(data) {
            alert(“Cordovaプラグインの処理を記述します。”);
            alert(“Onsen UIの処理を記述します。”);
        });
    });
</script>
```

処理のタイミングを正しく把握することにより、Monacaでの効率の良いアプリ開発に役立ててください。

Monacaのイベントの発生順序につきましては、下記も参考にしてください。
[[Monaca] イベントの発生順序について](http://qiita.com/keeey/items/ad06afeae0c40b52d9bd)
CentOSのディレクトリについて(MacOS10.9環境下)

VirtualBoxとVagrant、そしてCentOSをMacOS10.9、ターミナルでインストール。
作業ディレクトリはDropBox上に設定。

Node.jsファイルを開くため、作業ディレクトリにjsファイルをペーストしてからターミナルで開こうとしても開かず。
lsコマンドで調べてみても
```lang:js
node_modules
```
とだけ出て、jsファイルがありません。

pwdコマンドだと...
```lang:js
/home/vagrant
```
となります。
作業フォルダ＝仮想マシン上のディレクトリという訳ではないのでしょうか？
Macで特殊文字を入力。　きっかけは[ ` ]の入力

MacでQiitaの投稿記事を書いている時、投稿記事入力画面で[?]を押してMarkdownの書き方を表示できますが
コードのインライン表示などで[ \` ]を使用したいと思った時
普段使わない文字って「あれ？どこにあるんだっけ？？」と迷います。　他にあまり見かけない文字もそうですが
コピペでその場を凌ぐことは可能です。しかし毎回それではバカバカしいので調べると
[ \` ]は`shift + option + _`
で入力できます。

2016年5月15日追記：
なんで気づかなったのか。もっと簡単`Shift+@`で入力可能。

それはそれとして他にも色々入力できる文字があります。
どのように配置されているかはキーボードビューアを表示させるとわかります。

**1.メニューバーの 入力メニュー から、表示するキーボードの言語の入力ソースを選択します。**
**2.入力メニューから「キーボードビューアを表示」を選択します。**

そこでshiftなど押すとキーマップが表示されるので、どこにどの文字が対応しているかわかるかと思います。

また、本文を書いている時に
何も考えず[ \` ]を入力しても[ \` ]が表示されません
[ \` ]で始まり[ \` ]で終わると
`こうなります`
バックスペース[ \\ ]を使うことにより[ \\\` ]と入力すると[ \` ]として表示されます。
バックスペースも[ \\\\ ]で[ \\ ]と表示されます。
VisualStudioCodeでHaskell開発環境を整える


最新情報

___[Haskell Language Server](https://marketplace.visualstudio.com/items?itemName=alanz.vscode-hie-server)を使え___

以下古い内容

<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />



# VisualStduioCodeでHaskell開発環境を整える

* [vscode-ghc-mod](https://marketplace.visualstudio.com/items?itemName=hoovercj.vscode-ghc-mod)
* [haskell-linter](https://marketplace.visualstudio.com/items?itemName=hoovercj.haskell-linter)
* [language-haskell](https://marketplace.visualstudio.com/items?itemName=justusadam.language-haskell)

を入れる。

## 手順

1. VisualStudioCodeを起動
    1. `Ctrl+P` でコンソールを出す
    2. `ext install vscode-ghc-mod`
    3. `ext install haskell-linter`
    4. `ext install language-haskell`
    5. `File > Preferences > Workspace Settings`
    5. `.vscode/settings.json` に以下のように記述。<pre>
       {
           "haskell.hlint.executablePath": "/path/to/hlint",
           "haskell.ghcMod.maxNumberOfProblems": 100,
           "haskell.ghcMod.executablePath": "/path/to/ghc-mod",
           "haskell.ghcMod.onHover": "fallback",
           "haskell.ghcMod.check": true,
           "haskell.ghcMod.logLevel": "error" 
       }
       </pre>
       詳細は以下のページで
       * [vscode-ghc-mod](https://marketplace.visualstudio.com/items?itemName=hoovercj.vscode-ghc-mod)
       * [haskell-linter](https://marketplace.visualstudio.com/items?itemName=hoovercj.haskell-linter)
3. ターミナルを起動
    1. `stack install hlint`
    2. 「[stackでghc-modを使う試行錯誤のメモ - Qiita](http://qiita.com/hiratara/items/15aba2534b16c2af8a02)」「[stackとghc-modを一緒に使う時の手順 - Qiita](http://qiita.com/siphilia_rn/items/bba4519710bb0513d6f9)」あたりを読む
    3. ライブラリの補完が効かない。わからん

## 参考

* [VS CodeでHaskellの簡単な環境を作る - クソザコの進捗ガレージ](http://azaika.hateblo.jp/entry/2015/12/19/151554)
Ethernetインターフェース(eth0, eth1)を指定してソケットを作成する (Linux, C, Raspberry Pi)

#背景
Raspberry Pi+C言語で、2つのEthernetインターフェースで通信したいことがあり、その時に学んだことのメモです。
Ethernetのソケットの作成方法と、Ethernetのソケットの指定方法を記載します。
以下の環境で動作確認しました。
[ハードウェア]Raspberry Pi2 Model B
[OS]Raspbian GNU/Linux8.0(jessie)


#Ethernetのソケット作成
LinuxでEthernetインターフェースを使ってソケット通信する場合、以下のようなコードを書くことでソケット通信の準備ができます.

```C:eth_com.c
     deststr = IP_ADDRESS; //接続先のIPアドレス #define IP_ADRESS ("192.168.0.12")
     /* ソケットを生成 */
     if((*sock = socket (PF_INET, SOCK_STREAM, 0)) < 0)
     {
          printf("fail to create socket\n");
          return -1;
     }

     /* 接続先サーバのアドレス構造体の作成 */
     memset(&server, 0, sizeof(server));
     server.sin_family = PF_INET;
     server.sin_addr.s_addr = inet_addr(deststr);
     server.sin_port = htons(PORT);

     /* 接続処理 */
     if(connect (*sock, (struct sockaddr *)&server, sizeof(server)) < 0)
     {
          printf("fail to connect\n");
          return -1;
     }

```

ただ、このコードだと、複数のEthernetインターフェースある場合、自動で1つのEthernetインターフェースが使われることになります.**例えば、"eth0", "eth1"と二つのEthernetインターフェースがあったとき、自動で"eth0"のインターフェースを使ったsokcetが作成されてしまいます.**

#"eth1"のsokectを作成したい
ここで、"eth1"のインターフェースを使ったsokcet通信がしたい場合は、<span style="color: #d32f2f">setsockopt関数でインターフェースを指定します</span>.setsockopt()はソケットの生成```socket()```と接続処理```connect()```の間で呼び出す.

```C:eth_com.c
    deststr = IP_ADDRESS; //Set IP address
     /* ソケットを生成 */
     if((*sock = socket (PF_INET, SOCK_STREAM, 0)) < 0)
     {
          printf("fail to create socket\n");
          return -1;
     }

     /** For usb-ehternet converter **/
     char *opt;
     opt = "eth1";
     setsockopt(*sock, SOL_SOCKET, SO_BINDTODEVICE, opt, 4);

     /* 接続先サーバのアドレス構造体の作成 */
     memset(&server, 0, sizeof(server));
     server.sin_family = PF_INET;
     server.sin_addr.s_addr = inet_addr(deststr);
     server.sin_port = htons(PORT);

     /* 接続処理 */
     if(connect (*sock, (struct sockaddr *)&server, sizeof(server)) < 0)
     {
          printf("fail to connect\n");
          return -1;
     }
```
参考 : http://stackoverflow.com/questions/3998569/how-to-bind-raw-socket-to-specific-interface

#ルートで実行しないとダメ
しかし、**上記のコードでも"eth1"のインターフェースで通信できませんでした.**
参考に挙げたweb pageをよくよく読んでみると、

```
SO_BINDTODEVICE only works if you run as root, right? (on Linux at least) –  sep332 Nov 27 '12 at 21:29
```
とコメントされている.
<span style="color: #d32f2f">つまりroot権限で実行しないといけないようです.</span>
sudoで実行することで、無事に"eth1"のインターフェースで通信できるようになりました.