OmniAICreator/Qiita-1.07M huggingface dataset:
MySQLクエリパフォーマンス改善簡易まとめ


数年やってないと記憶の彼方に飛んでいきそうだったので、MySQLのクエリ改善方法のテンプレを自分用に明記。

# スロークエリを除去する事。
 - 初めはとにかく観察。スロークエリを出力させて、観察する。
 - indexが効かないクエリを排除する。
 - indexが予期できない条件分岐によるクエリを廃止する。
 - 場合によってはソートをさせない。コード側でソートさせる。
 - JOINをわざとさせないのも一つの手。後にDB分離レベルのシャーディング等が発生する可能性のあるようなシステムでは、JOIN禁止にする事は決して間違ってはいない。

# indexを必ず効かせる
 - レコード数に応じて、割当たるindexが異なることがあるので、必ず同じデータ数か実際の運用環境で検証すること。
 - 但し、indexを増やし過ぎると、挿入時に更新対象が増えるため、必要最低限にすること。

# explain してindexを確認する
 - 特に注目しなければいけないのはtype。
 - typeがallや indexだと問題。全スキャン相当が走る。 refやrangeなどに最低でも抑えこむこと。もっともよいのはconst。
 - 他、Extraに、「Using filesort」など出てるかを確認。複合indexなどで対処する。

# LIMITの罠に注意
 - LIMITがあろうと、全スキャンになったら意味は無い。絞り込んだサブテーブルを使うなどする。
 - 高速化するために1000ごとに取得を分けるようなアホな事をするなら、一括で取得したほうがマシ。

# 大量の更新処理に注意
 - Masterで非常に時間のかかる更新処理を行うと、場合によってはクエリを詰まらせることになる。

# 大量のdelete処理に注意
 - deleteはupdate以上に重い。
 - 該当レコードを全て洗い出してから、indexも含めて削除する処理を行うので、適当なupdateクエリよりも重い。
 - 百万以上のレコードを削除するときは、余裕で超スロークエリ化するので注意。

# Select For Update に注意
 - SelectしたデータをいじってUpdateする時、他と衝突させないためにSelectした段階でロックをするために Select For Updateをする　というテクがあるが、MySQL的には共有ロックがかかる
 - 共有ロックを解除しないとクエリのロック待ちが発生するので当然詰まる。
   - 共有ロックの後に、Where文が無い全更新クエリが走ったりすると最悪
 - 量が多いなら何らかのキューイングで順番に処理をさせるなど、MySQL以外の機構でロックを回避してもいいと思われ。

# トランザクションを貼ってから解除するまでの間に余計な処理をコードに書かない
 - クエリの生成処理はトランザクションを貼る前にやりましょう。
 - Redisへのアクセス、memcachedへのアクセス、コード上（PHP等）での処理は、トランザクションの外でやりましょう。
 - よくある例
   1. トランザクション貼る
   2. 配列や変数から文字列クエリを作る（余計な処理）
   3. insert
   4. トランザクション解除
   - 文字列クエリを作ってる間もトランザクションは貼られているため、ロック待ちが増えるとクエリが詰まりやすくなる。
   - 文字列クエリを作る時間が顕著にDBに影響する。コードの書き方でクエリ処理の時間が変わる
   - どっちも一瞬だろと思うけど、PHPの文字列結合の遅さをあまりなめないほうがいい。クエリが多いと塵も積もれば山となる。

# データがメモリ上にのるなら全部乗せる
  - 当たり前なので略

# パーティショニングする
 - 100万以上のレコードを入れる可能性があるテーブルは、パーティショニング。
 - 目安として100万といってますが、レコード数が増えれば増えるほど、クエリは重くなる。
 - 1テーブルでなんとかなるならパーティショニングで。

# シャーディング（水平分割）する
 - 1テーブルどころか1DBでもなんとかならなければシャーディング。
 - 複数マシンのパワーを使えばきっと怖くない。
 - あと、MySQL5.0とか使ってる場合はパーティショニング出来ないので同様にシャーディングをorz

# 垂直分割する
 - いわゆる正規化の話。
 - データ量を削減できるが、HDD容量の問題というよりかは、ネットワークのデータ転送量を削減できる方がメリットとしては大きい。
 - ただし、やりすぎると大量のJOINが必須となる。レコード数が100万を超えるシステムでは逆にデメリットの方が大きくなる可能性が高い。

# InnoDBだけじゃなくMyIsamも検討する
 - 場合によってはInnoDBよりもMyIsamの方が高速なパターンもある。
 - 同じクエリを同じ頻度で流して要検証すること。
   - 大量のUpdate処理でテーブルロックがかかるパターンでもレコード数が少なければMyIsamの方が高速というのはあった。
 - 但し、行ロック・テーブル・ロックの違い、その他の違いが多数あるので、当然注意は必要。

# クラステーブル継承をやめる。（正規化とJOINを極力使わなくする）
 - 代わりに、具象テーブル継承を使う。
 - スループットを下げずにJOINが可能なのは、せいぜい1万レコードまで。
 - 10万レコード超える事が想定されるテーブルは、具象テーブル継承で設計すべき。 
 - そもそも100万を超えるレコードの時は、
   - パーティショニングが必須だが、パーティション間をまたぐ検索はスループットを悪化させるので防ぐべき。
   - JOINは全パーティション間をまたいだ検索が必要になるため、不向き
単語のID化

#####
よく前処理に使う単語のID化を例にとって、collectionsの話
###単語のID化
`Is this a pen ? This is a pen . `と文字列(文)があったとすると、`0 1 2 3 4 1 0 2 3 5`みたいにそれぞれの単語ごとにIDを振っていきます。
今回は大文字小文字の区別をしていません。
`0`=`is`, `1`=`this`...とこんな感じの対応になります。
プログラムにおこすと下記のような感じになります。
####サンプルコード(python3)
```word2id.py
#usr/bin/python
#python3(3.5)
import collections

word2id = collections.defaultdict(lambda: len(word2id) )
sentence = "Is this a pen ? This is a pen ."

def convert_word(sentence):
    return [word2id[word.lower()] for word in sentence.split()]

print("sentence    :", sentence)
print("id_sentence :", *convert_word(sentence) )
print("dict        :", dict(word2id) )
```
####出力
>sentence    : Is this a pen ? This is a pen .
id_sentence : 0 1 2 3 4 1 0 2 3 5
dict        : {'.': 5, '?': 4, 'is': 0, 'this': 1, 'pen': 3, 'a': 2}

今回は、`.lower()`をつかって全て小文字にしてから辞書に登録しています。
辞書は`collections`モジュールの中にある`defaultdict`を使用しています。
`defaultdict`は、`key`を入れた時、その`key`が存在しなかった場合に自分で決めたものを入れといてくれるものです。
今回は、`lambda: len(word2id)`とすることで、新しく入ってきた`key`に対して新しい番号を振ることができます。
他の使い方としては、`collections.defaultdict(list)`とすると未知のkeyが入ってきた場合に自動で`list()`を作っといてくれます。

`collections`にはCounter, OrderedDict, deque, namedtupleが入っており、どれも便利なものです。

コードはpython3用なので、python2でやる場合は最後から２行目のところを`*convert_word(sentence)`から`' '.join(convert_word(sentence)`にすると動きます。
python3ではprintは関数なので、`*`をつかって引数として渡せますが、pythonn2ではこれでは渡せないようです。
Perl6 スカラー

# 最初に

正式リリースの前にPerl6の予習をしようというものです。
今回はスカラー変数について。

Perl6の環境構築についてはこちら。
[Perl6導入とHello, world!](http://qiita.com/B73W56H84/items/2153e6211ed617b4605d)

# スカラー

### スカラーとは

スカラーは１個の単純な値を持つ変数で、先頭に半角ダラー($)をつけて表します。

```pl
use v6;

my $camelCase;
my $snake_case;
my $chain-case; # 変数名にハイフン(-)も使えます。
my #`(use utf8;が無くても) $変数名に日本語も使えます;
```

### 初期化、代入と型

動的型付けされます。

```pl
use v6;

my $a;        # Any型
my $b = 1;    # Int型
my $c = 3.14; # Rat型
my $d = True; # Bool型
my $e = '愛'; # Str型

$b.^name.say; #=> Int
$b = $e;        # Int型だった $b にStr型の $e を代入
$b.WHAT.say;  #=> (Str)
```

宣言時に型指定もできます。

```pl
use v6;

my Str $文字列;

$文字列 = 'やぁ！';
$文字列.say; #=> やぁ！

# Int型を代入しようとすると…
$文字列 = 1; # エラー！
#=> Type check failed in assignment to '$文字列'; expected 'Str' but got 'Int'

# Str型にキャストして代入しましょう。
$文字列 = ~1;
$文字列.perl.say; #=> "1"
```

# 参考や注釈

* [Perl 6 Programming/Variables and Data](https://en.wikibooks.org/wiki/Perl_6_Programming/Variables_and_Data#Scalars)
* [Perl 6 Types](http://doc.perl6.org/type.html)
* [Variable Declarators and Scope](http://doc.perl6.org/language/variables#Variable_Declarators_and_Scope)
* [prefix ~](http://doc.perl6.org/language/operators#prefix_~)
OpenCV3.0.0 for AndroidStudio

# OpenCV3.0.0 for AndroidStudio

## 環境
- Windows10,Yosemite
- AndroidStudio 1.2.2
- JDK 1.8.0u51
- OpenCV 3.0.0

## OpenCVを用意
[ここ](http://opencv.org/downloads.html)から「OpenCV-3.0.0-android-sdk-1.zip」を落とし、適当な場所に展開。

## AndroidStudioでプロジェクト作成
適当にプロジェクトを作成。
この時Minimum SDKのAPI Levelを14(ICS)にした方が良さげ。

## モジュールを突っ込む
プロジェクトの作成が終わったら、[File]->[New]->[Import Module...]を開く。
Source directoryには、「(落としたOpenCVのSDK)\sdk\java」を指定。
例として、ホームディレクトリにOpenCVを展開した時のパスを示す。
> C:\Users\mizofumi0411\OpenCV-3.0.0-android-sdk\sdk\java

Module nameは適当な名前でOK。
最後にFinishを押すとプロジェクトにモジュールが取り込まれる。

## 共有ライブラリをプロジェクトに取り込む
OpenSDKの中にある「libs」を「jniLibs」にリネームしてプロジェクトに入れる。具体的には以下の通り。
> C:\Users\mizofumi0411\OpenCV-3.0.0-android-sdk\sdk\native\libs

このディレクトリをコピーする。そして、以下のプロジェクトのディレクトリの中にコピー
> C:\Users\mizofumi0411\AndroidStudioProjects\AndroidCV\app\src\main

そして、「libs」を「jniLibs」にリネーム。
最終的には、次のようなパスになる。
> C:\Users\mizofumi0411\AndroidStudioProjects\AndroidCV\app\src\main\jniLibs

## appがモジュールを読めるようにする
AndroidStudioを開き、[File]->[Project Structure]を開く。
左カラムにある「app」を選択し、右カラムの「Dependencies」タブを開く。
右側にある「＋」をクリックして、「Module dependency」を選択。
そうすると、さっき取り込んだモジュールが表示されるのでそれを選択して「OK」。

## おわり
これで、AndroidStudioでOpenCVが使えるようになった。

## 注意
OpenCVをロードする時、OpenCVLoader.initAsync()メソッドを使用するとOpenCV ManagerをGooglePlayでインストールするように言われるが、インストールしても端末によっては動作しなかった。

そこで、OpenCVLoader.initDebug()メソッドを使用するとOpenCV Manager無しでも動いた。
SMARTのそれっぽい値を監視するcronとかに入れておくやつ


S.M.A.R.Tとか見ても仕方ないだろうと思ってんたんですがBackblazeさんによると故障率と相関がはっきりしている値も存在するらしい

https://www.backblaze.com/blog/hard-drive-smart-stats/

ということでSMART 5, 187, 188, 197 ,198をチェックして0以外だったらmailが飛んでくるようにスクリプトを書いてcronに登録した。
効果があるかは不明でおまじないというやつ。

```sh
sudo ruby -e '["sda", "sdb", "sdc", "sdd"].each{|d| print `smartctl -A /dev/#{d}`}' | ruby -ne 'r = $_.split; [5, 187, 188, 197, 198].each{|n| puts "smart error: #{$_}" if r.first.to_i == n && r.last.to_i != 0 }'
```


Rubyのコードを整形するとこう

```ruby
# 1個目
["sda", "sdb", "sdc", "sdd"].each{|d|
  print `smartctl -A /dev/#{d}`
}

# 2個目 (nオプション付きで行単位処理)
$_.split;
[5, 187, 188, 197, 198].each{|n|
  if r.first.to_i == n && r.last.to_i != 0
    puts "smart error: #{$_}"
  end
}
```
SlackでOAuth2を利用したときのメモ

## 注意点
* `Authorization Code Flow` のみサポート
	* Authorization Flowの詳細は [RFC6749](https://tools.ietf.org/html/rfc6749#section-1.3) を参照
* `access_token` のexpiresは無制限
   * 現在のアクセストークンを無効にしたい場合は以下のいずれかの方法を取る
        * `access_token` を再発行する
        * https://api.slack.com/tokens で該当するアプリケーション情報を削除する
* `refresh_token` はサポートしていない
* `Scope` は以下の値を取りうる。
    * デフォルトは、`identify, read, post` が指定される。
    * scopeは最小限に指定するのが望ましい

| scope　　 | 権限 |
|----------|-------------------|
| identify | identityの確認権限。例えば、[Auth Test API](https://api.slack.com/methods/auth.test)で利用する。 |
| read | チャットやユーザ情報の読み取り権限。 |
| post | チャットやユーザ情報の書き込み権限。 |
| client | クライアントとしてSlackに接続する権限。readとpostの権限も持つ。<br> 例えば、[Real Time Messaging API](https://api.slack.com/methods/rtm.start)で利用する。 |
| admin | 管理者権限。もともと管理者であるユーザにのみ指定できる。 |

* `Team` パラメータを指定すると認可の確認画面に表示される
	* 指定しない場合、ユーザが自身でteamを入力することになる

## 自身のアプリを登録する
* https://api.slack.com/applications の 「Create a new applicaiton」を押下
* 各種情報を入力して、「Create Application」ボタンを押下すると登録できる
	* AppName, Team, Description, Redirect URIが必須
	* RedirectURIは、トークン取得時のリクエストに含める値と同じにする
* 登録が完了すると、`client_id` と `client_secret` が発行される
    * SlackのOAuthを利用するアプリケーションが、正規のアプリケーションであることを確認するためのパラメータ
    * **漏洩しないように注意**

## OAuthの仕組みを用いてSlackへの認可を得る
以下の2ステップで認可を取得する

1. 認可コードの取得
2. アクセストークンの取得

詳細は、 [Slackのドキュメント](https://api.slack.com/docs/oauth) を参照。

### 認可コードの取得
1. https://slack.com/oauth/authorize にクエリパラメータを付与してリクエストを送信する
	* client_id
	* state
	* team
	* scope
	* redirect_uri
2. Slackの認可画面が表示されるので、team, ログインID, パスワードを入力して認可を得る。
3. 2のレスポンスに含まれるState値を検証する。一致しない場合は処理を終了する
4. 2のレスポンスに含まれるcode値を取り出し、以下の方法でリクエストを送信してアクセストークンを取得する

### アクセストークンの取得
4. https://slack.com/api/oauth.access にクエリパラメータを付与してリクエストを送信する
	* client_id
	* client_secret
	* code
	* redirect_uri
5. 4のレスポンスに含まれるScope値とteam値が意図したものであることを確認する
6. 4のレスポンスに含まれるaccess_token値を取り出す

## [UserInfo](https://api.slack.com/methods/users.info)の取得
1. https://slack.com/api/auth.test にアクセストークンを付与してリクエストを送信する
	* token: ユーザ情報を取得したユーザに紐付いたアクセストークン
	* テストページ(https://api.slack.com/methods/auth.test/test )で確認することもできる。
2. https://slack.com/api/users.info にクエリパラメータを付与してリクエストを送信する
	* token: 取得したアクセストークン
	* user: ユーザ名でもアカウントのIDでもなく、1で取得したuser_idを指す
OkHttpを初めて使ってみた話

この記事は私がOkHttpを初めて使った時の話をつらつらと書いていきます。
これを読んで「OkHttpを使ってみよう！」という気持ちになってくれたら幸いです。

# OkHttpとは?
Square社(ゲーム会社ではありません)が管理しているオープンソースのライブラリです。
HTTP通信とSPDY通信をするためのクライアント用ライブラリです。
執筆時点での最新版は2.5.0かな。
ライセンスはApache License2.0です。

http://square.github.io/okhttp/

# OkHttpを使おうと思った背景
ここ最近AndroidでHTTP通信をするアプリケーションを書いていたのですが、HTTP通信の部分の実装がめんどくさくて手間だったんです。この手間をなんとか軽減できるようなライブラリないかなー？って思って探して見つけたのがこれなんです。
(クックパッドさんなど他のサービスでもOkHttpを使って作業効率を上げている？みたいですし、気になっていたというのはあります。)

# OkHttpを使うと得られる恩恵
http://square.github.io/okhttp/
のサイトを見る限りだと、
>・HTTP/2 and SPDY support allows all requests to the same host to share a socket.
>・Connection pooling reduces request latency (if SPDY isn’t available).
>・Transparent GZIP shrinks download sizes.
>・Response caching avoids the network completely for repeat requests.

と書いてありますが…私が思う一番のメリットは
**「HttpURLConnectionを使うやり方と比べて、スマートにコーディングすることができる」**
ということです。

実際、HttpURLConnectionの場合・OkHttpの場合とで比較するとソースコードの短さ・ネストの深さ的にOkHttpの方がスマートだと言えますよね。

```java:HttpURLConnectionの場合
    private String getHttpUrlConnection() throws IOException{
        String xml = null;
        HttpURLConnection conn = null;
        try {
            URL url = new URL("http://zip.cgis.biz/xml/zip.php?zn=1700011");
            conn = (HttpURLConnection) url.openConnection();
            conn.setDoInput(true);

            conn.connect();

            if (conn.getResponseCode() == 200) {
                InputStream is = conn.getInputStream();
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                byte[] bytes = new byte[256];
                int len = 0;
                while ((len = is.read(bytes, 0, 256)) != -1) {
                    baos.write(bytes, 0, len);
                }
                xml = new String(baos.toByteArray(), "UTF-8");
            }
        } finally {
            if (conn != null)
                conn.disconnect();
        }
        return xml;
    }
```

```java:OkHttpの場合
    private String getByOkHttp() throws IOException {
        Request request = new Request.Builder()
                .url("http://zip.cgis.biz/xml/zip.php?zn=1700011")
                .get()
                .build();

        OkHttpClient client = new OkHttpClient();

        Response response = client.newCall(request).execute();
        return response.body().string();
    }
```

※このコードで使っているURLは「郵便番号検索API」を参照しました。

# 導入手順
私がAndroidStudioを使って導入した手順を記載いたします。
(Eclipse・jarを使ってやることもできますので安心してくだい。)

1. AndroidStudioのプロジェクトを開き、[app]フォルダ内のbuild.gradleを開きます。

2. build.gradleのdependenciesブロック内に以下のコードを追記します。(2.5.0でないバージョンを使いたい場合は、2.5.0のところを別のバージョンに置き換えてください)
` compile 'com.squareup.okhttp:okhttp:2.5.0'` 

3.「Sync Now」をクリック。

この手順を踏めばあとは上記「OkHttpの場合」のようなコードを書くことができます。
具体的な書き方については、
http://qiita.com/ryugoo/items/478ba23cda0f57bd21e8
を参考にしてください。

# 使ってみてどうでした？
だいぶスマートに楽にかけるようになりました。（それが上記のコード）
これにつきます！

上記コードではレスポンスコードによる処理の分岐とかきちんと書いていないのですが、Response#code()メソッドで取れるみたいなのでこれをうまく使えばエラー処理も込みでスマートに書くことができそうです。

# デメリットってないの？
調べて見る限り特記すべきデメリットはなかったように思えます。
強いて言うなら、アプリのサイズがでかくなるとかそんなものでしょうか。


# まとめ
OkHttpを使えば従来のHttpURLConnectionによるやり方よりずっとスマートに素早くコードを書くことができます！
もし「おお！使ってみたい！」と思ってみたらすぐに試してみましょう。
あなたが抱えているプロジェクトに使えそうならみんなに提案してみましょう。
El Capitan で動かなくなった Redmine を動かす

http://qiita.com/janus_wel/items/06dae0dec1ff1a886d54

これでインストールしたものが動かない !!!
El Capitan アップグレード直後はもろもろ動かなくなっているのでひとつずつ見ていく。

HomeBrew
--------

権限がないと怒られるのでユーザーのものに変更する。

```
sudo chown -R username:admin /usr/local
```

XCode
-----

一度起動してライセンスに同意。
その後コマンドラインツールを入れるために次のコマンドを打つ。

```sh
xcode-select --install
```

Apache
------

httpd.conf がデフォルトに戻っているので必要なモジュールをロードするように直す。

```sh
sudo vim /etc/apache2/httpd.conf
```

次のコメントアウトはずす

- mod_ssl
- mod_rewrite

他にも何かあるなら <kbd>apachectl configtest</kbd> しながら直す。

```sh
sudo apachectl restart
```

MySQL
-----

ログファイルのパーミッションがアレなので直す。

```sh
sudo chown username:admin /usr/local/var/mysql/username.local.err
```

my.cnf もなくなっている。デフォルトのものを使う。

```sh
sudo cp /usr/local/opt/mysql/support-files/my-default.cnf /etc/my.cnf
```

<kbd>mysql.server restart</kbd> してもうまく立ち上がらない場合、すでにプロセスがいる可能性があるので <kbd>ps aux | grep mysql</kbd> とかしてそれっぽいのを <kbd>kill</kbd> する。
/usr/local/var/mysql/username.local.err に全部出てくるので見ながら対処。


OpenSSL
-------

<kbd>brew install openssl</kbd> しても /usr/local/opt/openssl 以下にもろもろ入ってしまってヘッダーファイルがないとか言われるので .zshrc や .bashrc あたりに次を書いておく。

```sh
# openssl
OPENSSL_HOME=/usr/local/opt/openssl
if [ -d ${OPENSSL_HOME} ]; then
    export PATH=${OPENSSL_HOME}/bin${PATH:+:}${PATH}
    export LD_LIBRARY_PATH=${OPENSSL_HOME}/lib${LD_LIBRARY_PATH:+:}${LD_LIBRARY_PATH}
    export CPATH=${OPENSSL_HOME}/include:${CPATH:+:}${CPATH}
fi
```

passenger
---------

再インストール。

```sh
passenger-install-apache2-module
```

出てくる Apache 用設定を /etc/apache2/other/passenger.conf あたりに突っ込んでおく
NeoBundle 'slim-template/vim-slim' のsyntaxが効かない件

RailsのViewでHTML書くの面倒だから、最近は基本的に**slim**使っています。
しかし、現環境でvimのslimソースを色付けしてくれるsyntax用プラグインがなんだかうまく機能しません。

```vim:~/.vimrc
NeoBundle 'slim-template/vim-slim'
```

![スクリーンショット 2015-10-19 0.35.03.png](https://qiita-image-store.s3.amazonaws.com/0/52535/731737ce-d59e-07dc-1d5e-c1de5b41d0a1.png)


`:NeoBundleClean` からの `:NeoBundleInstall`
また `:NeoBundleUpdate` しても動かないので困った。
そして、Google先生で調べていたらこのような記事を発見。

[vim-slim のシンタックスハイライトが機能しない](http://karur4n.hatenablog.com/entry/2014/09/24/180358)
>もしあなたが Yggdroot/indentLine を使ってて
>なおかつ
>let g:indentLine_faster = 1 を設定している
>なら
>それをオフにしましょう

もしかしてインデントとか他のPluginとか設定と何か競合する可能性があるのか…？
良くわからないけどインデント系とかの記述を順番に無効にしてみる。
結果、

```vim:.vimrc
"シンタックスハイライト有効
syntax on
filetype plugin indent on
filetype indent on
```
▼コメントアウト▼

```vim:.vimrc
"シンタックスハイライト有効
"syntax on
"filetype plugin indent on
"filetype indent on
```

上記を３つともコメントアウトしたら動いた！

![スクリーンショット 2015-10-19 0.34.55.png](https://qiita-image-store.s3.amazonaws.com/0/52535/1c9138e5-0951-8c33-6f19-08b4a3cd233a.png)


うん…。原因よくわからんな(´・ω・`)

VimScriptはよく知りませんが、やっぱりVimの他のプラグインとかの設定が競合してるのかな？
取り敢えずRailsで使う基本的なファイルはコレで綺麗に見えるのでそのまま使ってみます。
Ubuntu上のVimでIME制御する

# やりたいこと
Vimでインサートモード時にIMEをONにし日本語入力を行ったあとで、 `ESC` などでノーマルモードに入ったときに、自動でIMEをOFFにする

# 前提条件
* `IME` を `Fcitx` を使用
* ターミナルで `fcitx-remote` コマンドが使用できること

```zsh:IMEをONにする
$ fcitx-remote -o
```

```zsh:IMEをOFFにする
$ fcitx-remote -c
```

# Vimの設定
```vim:.vimrc
function! ImInActivate()
  call system('fcitx-remote -c')
endfunction
inoremap <silent> <C-[> <ESC>:call ImInActivate()<CR>
```
これでインサートモードからノーマルモードに切り替わるタイミング（つまり `ESC` キーや `Ctrl+[` の入力時）と同時IMEもOFFになる

# おまけ
私は日本語の入力に `mozc` を使っているが、日本語入力時に（IMEがONの状態のとき）に `Shift` を押しながらキー入力を行うとローマ字入力に自動で切り替わる機能があります。この機能使用時に全角のローマ字が入力されてしまうことがあります。デフォルトで半角英語を入力したい場合は `~/.config/fcitx/profile` を下記のように編集したあとに、 `fcitx` を再起動すると意図どおりに動作するようになります。

```conf:~/.config/fcitx/profile
[Profile]
# FullWidth=True
FullWidth=False
```
iOS 9の広告ブロックの仕組みと対策について

「広告ブロック」と書きましたが本来広告のみをブロックする用途ではないので、本文中では「コンテンツブロック」という言い方をしております。iOS9でのコンテンツブロックがどのように行われるのかの検証とその対策をまとめます。
#コンテンツブロックの仕組み
iOS 9から搭載されたコンテンツブロック機能は標準では使えません。対応しているアプリをインストールし、「設定 > Safari > コンテンツブロッカー」からONにすることで機能します。

![IMG_0003.jpg](https://qiita-image-store.s3.amazonaws.com/0/95865/c6bfcbbb-6cc1-83de-2974-621304b8cbc4.jpeg)

**アプリによってブロック出来る広告・ソーシャルボタン・解析タグは異なり**ます。

[Safari 9.0の公式ページ](https://developer.apple.com/library/prerelease/ios/releasenotes/General/WhatsNewInSafari/Articles/Safari_9.html#//apple_ref/doc/uid/TP40014305-CH9-SW9)を見ると分かるように仕組みは単純で、アプリ毎のJSONファイルがSafariに適用されているだけです。

````json
[
    {
        "action": {
            "type": "block"
        },
        "trigger": {
            "url-filter": "webkit.org/images/icon-gold.png"
        }
    },
    {
        "action": {
            "selector": "a[href^=\"http://nightly.webkit.org/\"]",
            "type": "css-display-none"
        },
        "trigger": {
            "url-filter": ".*"
        }
    }
]
````
上記の例では`webkit.org/images/icon-gold.png`の画像を読み込ませない、ページ内全ての「`http://nightly.webkit.org/`」へのリンクは非表示とする、ということです。

#実際調べてみて分かったこと
##「Crystal」で読み込まれないJavaScriptのファイル名
「Crystal」では「**analytics.js**」というファイル名のJavaScriptは同一サーバであろうが、中身を問わず（！）動作しない。このブロックによって**Googleアナリティクスが動作しない**。
なお、「**plusone.js**」もブロックされ、**Google+の「+1ボタン」「共有ボタン」も表示されない**。
##「Crystal」で表示されないclass名
「Crystal」にて、class名「**ads-ad**」「**img_ad**」「**ad_image**」「**adsbygoogle**」（など）を持つ要素が消える。これらのclass名を持っている要素は、広告でなくても（！）表示されない。このブロックによって**スマホ用Google検索結果に広告が表示されない**。

![IMG_0001.jpg](https://qiita-image-store.s3.amazonaws.com/0/95865/9489de69-3dee-455b-71a1-15955b3375cd.jpeg)

#どう対策するか？
##1.何もしない
運営者側的には何もせず、Googleなどの対応を待つ。
「Crystal」では前述の通りAdwordsが表示されない（インプレッションはプラスされる）が、2015年9月30日、Googleは表示されなかった広告を課金対象としない旨を発表した。
>Googleは、米AppleがiOS 9で追加した「コンテンツブロッカー」とそれを利用する広告ブロックアプリについては触れていないが、少なくともブロックされた広告について課金される懸念はなさそうだ。

[Google AdWords、表示されたディスプレイ広告のみを課金対象に - ITmedia ニュース]
(http://www.itmedia.co.jp/news/articles/1510/01/news078.html)

また、Google AdSenceなど審査の厳しい広告をブロックされるのは理不尽であるという声も上がって来ている。ユーザーの為にならない有害な広告のみがブロックされるような動きが出てくるのが一番良いように思う。

[iOS 9の人気有料広告ブロックアプリ「Crystal」、“ホワイトリスト化”でEyeoから報酬受け取りへ - ITmedia ニュース]
(http://www.itmedia.co.jp/news/articles/1509/25/news066.html)

[ネット広告業界団体IAB、“容認できる広告”の指針「L.E.A.N. Ads」プログラム立ち上げ - ITmedia ニュース]
(http://www.itmedia.co.jp/news/articles/1510/16/news054.html)

##2.広告ブロックするユーザーをブロックする
「**広告ブロックするユーザーはユーザーでは無い**」という考え方の元に、ページ自体を見せない。広告収益のお陰で運営が可能なサイト・ブログもあるだろう。タダで閲覧しようとするユーザーは運営者にとって無益なのである。広告ブロックユーザーをブロックする手法は下記などに記述がある。

[コピペでOK。iOS9のAdBlockが有効な場合にページの表示を無効にするサンプル:phpspot開発日誌]
(http://phpspot.org/blog/archives/2015/09/okios9adblock.html)

[How to Display Alternate Content to AdBlock Users [Google AdSense]]
(http://www.labnol.org/internet/alternate-content-for-adblock/28602/)

##3.ブロックされない広告に変更する
調整が可能な自身のページであれば、現在ブロックされていない・されにくい広告に変更するという手もある。アプリのローカライズやバージョンアップによってはいつの間にかブロックされているかも…というリスクはつきまとう。

#広告ブロックアプリのこれからと今後
大体下記のようなことを考えました。

- 開発が容易なため**同様のアプリが乱立**する
- **ローカライズされたアプリ**が各国で出てくる
- ホワイトリストの導入で、Google広告OKになる（アナリティクス含む）

大切なことは、自身のページについてアナリティクス等でiPhoneのユーザーの割合などから影響を推測して動くのが一番かなあと感じます。
Perl6 コメントアウト

# 最初に

正式リリースの前にPerl6の予習をしようというものです。
今回はコメントアウト[^without]について記載します。

Perl6の環境構築についてはこちら。

[Perl6導入とHello, world!](http://qiita.com/B73W56H84/items/2153e6211ed617b4605d)


# コメント

### 一行コメント

```pl
use v6;

# ←半角シャープが1行コメントです。

' Hello, world! '.say; # 1行の、半角シャープ以降が無視される。
#=> Hello, world!
```

### 複数行コメント [^Multi]

```
use v6;

#`{
シャープとバッククォートのあとにカッコを書くと
綴じカッコまでがコメントになるのです。
}

#`(
↑
複数行コメント。
↓
)

#`({
  カッコは複数にすることが可能。
  重ねておけば、コメント文中の綴じカッコの所為で
  意図せずエラーになったりすることが減ります
})

#`[カッコだったら]
#`<なんでもいい>
#`「です」
#`『。』
#`【】

say my Str $複数行コメントは = #`《
  文の途中に
  入れても
  大丈夫で
》 'べんり';
#=> べんり
```

# 参考や注釈

* [Perl 6 Tablet 2 - Basic Syntax](http://tablets.perl6.org/tablet-2-basic-syntax.html#comments)
* [Perl6 Syntax](https://docs.perl6.org/language/syntax#Single-line_comments)
* [Perl 6を語る（第1回）コメントとアンスペース](http://cabonera.hateblo.jp/entry/2015/03/08/150528)
* [Learn X in Y minutes](https://learnxinyminutes.com/docs/perl6/)

[^without]: そしてドキュメント化するためのコメント記法は別途
[^Multi]: Perl6 からの新機能
puttyでadbを繋ぐと便利

adbにshell命令が含まれているので、puttyからつなげば使える

- Turn off line discipline in settings
- Use RAW mode to connect to localhost:5037
- Enter "0012transport-usb" (without quotes)
- Enter "0006shell:" (without quotes)

puttyを改造した人もいる

http://github.com/sztupy/adbputty/downloads
- Select Adb from the connection type list
- Enter "transport-usb" in the host (or any other connection string, check the adb socket interface documentation if you need something else than connecting via usb)
- Enter 5037 as port, if it's not already set there.
- Connect and enjoy (you might also save this connection, so next time you only have to double-click on the settings)
Ubuntu Server 14.04 に ZFS on Linux をインストールする

[続き](http://qiita.com/flny/items/0a838878473f321c4db1)

[こちら](http://l-w-i.net/t/ubuntu/zfs_001.txt)を参考にZFS on Linuxをインストールします
まずppaを追加

```
$ sudo apt-add-repository --yes ppa:zfs-native/stable
gpg: keyring `/tmp/tmpq5j6clzd/secring.gpg' created
gpg: keyring `/tmp/tmpq5j6clzd/pubring.gpg' created
gpg: requesting key F6B0FC61 from hkp server keyserver.ubuntu.com
gpg: /tmp/tmpq5j6clzd/trustdb.gpg: trustdb created
gpg: key F6B0FC61: public key "Launchpad PPA for Native ZFS for Linux" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
OK

```
リポジトリ更新、インストール、起動

```
$ sudo apt-get update
$ sudo apt-get install debootstrap spl-dkms zfs-dkms ubuntu-zfs
$ sudo modprobe zfs
```
起動に成功すればメッセージバッファに表示されます。

```
[ 1644.992971] SPL: Loaded module v0.6.5.3-1~trusty
[ 1645.017279] ZFS: Loaded module v0.6.5.3-1~trusty, ZFS pool version 5000, ZFS filesystem version 5
```

ご覧の通りppaのおかげでインストールは簡単に終わります。
[続く](http://qiita.com/flny/items/861e37bddf69bddffae9)
Ubuntu, ZFS, docker で作る家庭内サーバ

# 動機
xubuntu 10.04 で稼働している家庭内サーバが さすがに手狭になってきたため、移行しようと思い立ちました。当初はESXi 5.5 を試したのですが いかんせんiSCSI経由のZFSをうまく扱えず、この際ZFSはnativeで、他のサービス類はdockerで立ち上げることにチャレンジしてみます。
# 構成
||||
|:---|:----|:--|
|サーバ|[富士通 PRIMERGY TX100 S3p](http://wiki.nothing.sh/page/%C9%D9%BB%CE%C4%CC%20PRIMERGY%20TX100%20S3p)|IvyBridge世代の安鯖|
|CPU | Xeon E3 1245v2|4C/8T
|メモリ|18GB|8+4+4+2 <br> 1333と1600が混在(ﾟ∀ﾟ)|
|SSD|(1):16GB <br>(2):120GB|(1)は160GBのtypoではなく16GBです。たしか2008年ごろ購入|
|HDD|(1):1TB <br>(2):2TB <br> (3):1TB <br> (4):500GB|どうしても4台構成にしたかったので余ってるのをかき集めました|
|OS|Ubuntu Server 14.04(Trusty) AMD64|最近コレばっかり
# サーバでやりたいこと
- ZFS
- docker
- Xfceデスクトップ
- CIFSサーバ
- DLNAサーバ
- DNS
- PT3によるテレビ録画
- 録画した.tsファイルのH.264エンコード
- Windows7 or Windows10の仮想デスクトップ

[続く](http://qiita.com/flny/items/340c41b8406dc699b99a)
L6470を用いたステッピングモーターのドライバ回路作成

# はじめに
秋月電子のステッピングモータードライバモジュール販売終了により、L6470を用いたドライバ回路を周辺機器から自作することにしました。
以下ではその方法と注意点を列挙します。

# 用いた素子・ICチップ
- マイクロコントローラー（Arduino UNO）
- L6470
    - 巷のネット記事では、この基盤を含むモジュールをL6470と呼んでいる場合があるので注意してください。
- L6470の説明書に載っている各回路素子
- ステッピングモーター（ST=428YH1004-5013）

# ドライバ回路
基本的には説明書の回路図通りに作ればよいのですが、何点か説明書からだと分かりにくい注意点があるので、列挙します。

- VDDの電圧はArduinoのHIGHの電圧と等しくする。（default: 5V）
- VREGの電圧は3.3Vとする。
- 電源に直接繋がるコンデンサ（bbPOL, DD, VS, VSPOL）の位置は実はどうでも良い。
- SW端子に入れる電圧ははVDDの電圧と等しくする。
- PGND,VSA,VSB端子は二つずつあるので注意。
- ADCINの電圧は適当で構わない。
    - 説明書においては約1.5V程度だったが約0.5Vでの動作を確認


# Arduinoとの接続
動いているソースコードでは、
「Code内マクロ名」→「端子」の書き方で
PIN_SPI_SS   ( default: 10 ) → CS
PIN_SPI_MOSI ( default: 11 ) → SDI
PIN_SPI_MISO ( default: 12 ) → SDO
PIN_SPI_SCK  ( default: 13 ) → CK
と繋いでいます

# ステッピングモーターとの接続
接続端子と色の関係は
- 黒 → OUT1A
- 赤 → OUT1B
- 緑 → OUT2A
- 青 → OUT2B
と接続して動作を確認しました

# 今後の改善点・注意点
・回路を長時間回すと、L6470が熱を持ってしまいます。
コマンドラインでのgitの色設定

MacのTerminalで、gitを実行したときの色設定を複数のMacで統一したかったので、設定内容をちょっとぐぐってみた。

## 自動的に色を設定する

何も考えずに設定するなら以下を実行すればOK

```
git config --global color.ui true
```

.gitconfigに直接記述するなら以下。

```
[color]
  ui = auto
```


## 各コマンドで色分けする

自分が困ってたケースだと、`git status`を実行したときの色設定に差異があったこと。
以下のように.gitconfigに記述することで明示的に色を設定することができる。

```
[color "status"]
    added = yellow
    changed = green
    untracked = cyan
```

## 参考

Git - Git の設定
https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%81%AE%E8%A8%AD%E5%AE%9A

How to color the Git console in Ubuntu? - Stack Overflow
http://stackoverflow.com/questions/10998792/how-to-color-the-git-console-in-ubuntu
Viewにselectorを設定のアレコレ


忘備録に。
selectorの設定というと、viewのlayoutのxmlの中でbackgroundに指定する方法がよく出てくるが、textColorにも設定できる。
backgroundに設定するかtextColorに設定するかでselectorのcolorの指定の仕方が違うので注意する。

```xml
 <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/selector_initial_footer_button"/>
```
これがbackgroundに設定するパターン

backgroundに設定したselectorは

```
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true">
		<color android:color="@color/white"/>
    </item>
    <item android:state_checked="false">
    	<color android:color="@color/black"/>
    </item>
</selector>

```
このcolorはbackgroundの色が変わる


```xml
 <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@drawable/selector_initial_footer_button"/>
```
これがtextColorに設定するパターン

textColorに設定したselectorは

```drawable

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:color="@color/white"/>
    <item android:state_checked="false" android:color="@color/black"/>
</selector>

```

colorの属性は補完で出てこないのは何故なんだろう・・・。

これで文字色が変わる


[参考]
http://teik.in/?p=103

http://y-anz-m.blogspot.jp/2010/11/androidselector-item-color.html


一つのbackgroundに設定したdrawableでtextColorも一緒に設定できたら便利だなぁ…。
GithubリポジトリのStargazersから、それぞれのLocationを抽出する


自分がOSSとして公開しているChefのプラグイン、[knife-zero](https://github.com/higanworks/)っていうのには76のスターが付いている。
取り立てて多いというほどの数でもないのだろうが、Stargazersのほとんどがまるで縁もゆかりもないのだ。しかも最近国外が多い気もしている。

この、お互いどこの馬の骨ともわからん状態というのがわりと面白く感じたので、せっかくだからとロケーションを確認したくなった。

## Pythonで書いてみる

使ったモジュールは`github3.py`, Pythonは2.7.10。


```sg.py
import os
from github3 import login

## トークン使わないとAPI上限にすぐ引っかかる。
gh = login(token=os.environ['GH_TOKEN'])
repo = gh.repository('higanworks', 'knife-zero')

## iter_stargazers()がUserをイテレータの形で返してくれる。
for x in repo.iter_stargazers():
    print x, gh.user(x).location

```

## 実行してロケーションを抽出してみた

結局表記バラバラでつらいｗ

```
$ python ./sg.py 
tkuchiki None
libero18 Japan
DQNEO Japan
mohitsethi None
marcy-terui Sapporo City, Hokkaido, Japan
kimikimi714 None
tkak Tokyo
MasahiroSakoda Kanagawa Pref. Japan
takus Japan
kwilczynski Tokyo, Japan
nabeken Tokyo, Japan
deeeki Japan
bageljp Tokyo, Japan
shigeya Tokyo, Japan
blp1526 Tokyo
cl-lab-k Japan
knakayama Japan
wslash Japan
linyows FuckOka, Japan
SlyDen Lviv, Ukraine
eigo-s None
threetreeslight Tokyo
y13i Tokyo, Japan
bangbangshoot None
fprg None
sanemat Tokyo, Japan
fumikony None
dataferret Halifax, Canada
ikuwow Japan
rmoriz Munich, Germany
arosenhagen Darmstadt
sakazuki Tokyo, Japan
9gel None
teragino None
ispern Kagoshima
torounit Matsumoto, Nagano, Japan
Gascar-ShunT Tokyo
imura81gt None
cblunt Devon, UK
yukimamire None
gregf Maine
Azulinho Bristol
paulmoon None
inokappa None
ChrisLundquist Seattle, Wa
takeharu Tokyo
antage Russia
Chirul0 None
mitto Yokohama
runningman84 None
ssdns None
kyle-johnson Seattle, WA
ryandjurovich Melbourne, Australia
rollbrettler Berlin
adampats None
hirak Tokyo
patcon Waffles
k-nii0211 Tokyo
sawanoboly Kobe, Japan
ghempton Seattle, WA
mrjcleaver Toronto, ON, Canada
yukihariguchi None
hsbt Tokyo, Japan
azet *
k-yamada japan
daften Gent
pwelch Silver Spring, MD
dalpo Italy
h4ck3rm1k3 Hopewell, NJ
gretel Hamburg, Germany
expvictordamian None
guiferrpereira Porto
andrefreitas Porto and Madeira, Portugal
ruimashita None
caleb Rochester, NY
4148 Berkeley, CA
```

確定で日本じゃない(Japan,Tokyo,Noneを除く)のは1/3ってとこでしたね。アフリカと南極以外は一通りでてくる。

そんななか、一番驚いたのは **FuckOka**, Japan からお越しの方。
eslintで、怒られないコードを書く

##はじめに
仕事でjshintを使っていましたが、使い方を間違っていたり、
設定をなんとなくの理解で使っている状態でした。

JSおじさんの勉強会でeslintの話がでたので、
自分なりに使い方をまとめて見たいと思います。
><a href="https://drive.google.com/file/d/0Bwz0REXLtGT2X1l5MEF6WTcteGc/view" target="_blank">JSオジサン as a Service</a>

##eslintのメリット
* ルール単位でON/OFFができる
* 拡張性が高い
* JSXに対応している
* ECMAScript6にも対応している

##準備

◎eslintをインストール

```
sudo npm install -g eslint
```



◎設定ファイル(eslingrc)を作成

```
eslint --init
```
① What style of indentation do you use?
 インデントをタブにするかスペースにするか

② What quotes do you use for strings?
 文字列はシングルクオートにするか、ダブルクオートにするか

③ What line endings do you use?
windowsを使うかUnix（Mac)を使うか

④Do you require semicolons?
セミコロンは必須にするか

⑤Are you using ECMAScript 6 features?
ECMAScriptの6の機能を使用する、しないか

⑥Where will your code run?
実行環境（複数選択可）

⑦Do you use JSX?
JSX(React）を使うか

⑧What format do you want your config file to be in?
設定ファイルの形式

上記の各問いを選択していくと設定ファイルが作成される。

```
{
    "rules": {
        "indent": [
            2,
            "tab"
        ],
        "quotes": [
            2,
            "double"
        ],
        "linebreak-style": [
            2,
            "unix"
        ],
        "semi": [
            2,
            "always"
        ]
    },
    "env": {
        "node": true,
        "browser": true
    },
    "extends": "eslint:recommended",
    "ecmaFeatures": {
        "jsx": true,
        "experimentalObjectRestSpread": true
    },
    "plugins": [
        "react"
    ]
}

```

◎検査を実行

```
eslint hogehoge.js
```


##ルールの有効、無効の設定

設定ファイルのルールIDを変更することでルールを適応するかを変更できる。
* 2 ・・・　有効（エラー）
* 1 ・・・　有効（警告）
* 0 ・・・　無効

```
 "rules": {
     "indent": [
         0,//無効
         "tab"
     ],
```

##グローバルオブジェクトの許可

下記のように、グローバルオブジェクトとして許可する変数名を定義できる。

```
{
    "globals": {
        "v1": true,
        "v2": true
    }
}
```
##設定ファイル

◎```"extends": "eslint:recommended"```
<a href="http://eslint.org/docs/rules/"> List of available rules</a>内の(recommended)とついてるものが有効になります。
最低限のチェックの場合はこれだけでもいいみたいです。

><a href="https://gist.github.com/mysticatea/df40f5e3cdbf0e9ae618">eslint-recommended.md(日本語訳)</a>

◎他のrules
下記が参考になりました。
><a href="http://qiita.com/armorik83/items/228b97bee25aa33c9850">ESLint 1.0.0新ルールまとめ</a>

公式のドキュメントはこちら
>http://eslint.org/docs/rules/

##package.jsonにも定義できる

設定ファイルではなく、package.jsonに定義することもできる。

```
{
  "name": "eslint",
  "version": "1.0.0",
  "description": "Sample",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "MIT",
  "eslintConfig": {
    "rules": {
      "curly": 2,
      "no-multi-spaces": false,
      "no-underscore-dangle": false,
      "quotes": [2, "single"],
      "strict" : false
    }
  }
}
 ```

##gulpで利用する

gulpのタスクでチェックするには下記のプラグインを使用します。

><a href="https://www.npmjs.com/package/gulp-eslint/">gulp-eslint</a>



以上eslintの簡単な説明でした。
eslintを使って、周りのメンバーに怒られないコードを書くように心がけたいと思います。
Windows にて Atom の proxy 設定ハマリポイント

[ATOMエディタのproxy設定](http://qiita.com/tsukamoto/items/cef0f2d7e2b33a26a9e5) を参考に proxy の設定を行っていましたが、何点かハマリポイントあったのでメモしておきます。

## ハマリポイント

### apm コマンドが使えない？

コマンドプロンプトより apm コマンドが使えない旨をググると、 proxy が設定されていないとインストールができないなどの記事があったが、そんなことはなくインストールされていた。

問題はパスが通っていないだけの話だったので、 `%LOCALAPPDATA%\atom\bin` にパスを通してやるか、 cd すれば実行できます。

## https-proxy には http のURLを設定すること

https-proxy, http-proxy とそれぞれ設定できるが、 https-proxy に https のURLを設定するとなぜかエラーは解消されない。

**https-proxy に http のURLを設定すると解消される** ようで、私の環境でも同様だったので試す価値はあります。ちなみに、 `apm config rm https-proxy` で設定項目を削除することができます。

## 別の設定方法 - .apmrc に記載して設定する方法

[apm - Atom Package Manager](https://github.com/atom/apm) より、

> If you are using a proxy you can configure apm to use it by setting the https-proxy config in your `~/.atom/.apmrc` file like so:
>
```
https-proxy = https://9.0.2.1:0
```

`~/.atom/.apm/.apmrc` も存在するが、こいつを上書きして保存しても、変更が反映されないので注意。 `~/.atom/.apmrc` は新規作成で。
GenymotionをLubuntu15.10で動かす

## 参考

* [Sukohi's tech blog!!: GenymotionをUbuntu13.10にインストールする方法](http://sukohi.blogspot.jp/2014/03/genymotionubuntu1310.html)
* [14.04 - Cannot mix incompatible Qt library - Ask Ubuntu](http://askubuntu.com/questions/534415/cannot-mix-incompatible-qt-library)

## download

* [Genymotion](https://www.genymotion.com/#!/download)
    * 要ユーザ登録

## インストール

```bash:一般ユーザで実行
chmod +x genymotion-2.5.2_x64_debian.bin
./genymotion-2.5.2_x64_debian.bin
```

> ./genymotion: error while loading shared libraries: libgstapp-0.10.so.0: cannot open shared object file: No such file or directory

と出た場合は以下

```bash:
sudo apt-get install -y libgstreamer-plugins-base0.10-0
```

> [Fatal] Cannot mix incompatible Qt library (version 0x40806) with this library (version 0x40802)

```bash:
mkdir QtLibs && mv *Qt*.so* QtLibs
apt-get install -y libxi-dev libxmu-dev
apt-get install -y qt5-default libqtwebkit4 libqtsvg4-perl
```

![android.png](https://qiita-image-store.s3.amazonaws.com/0/25728/4030df88-6349-ae82-afc3-c5e536a2fcde.png)
rvmでruby をインストール出来なかったので色々やってみた。

起きた問題

```bash

$ rvm install 2.2
Searching for binary rubies, this might take some time.
No binary rubies available for: centos/6/x86_64/ruby-2.2.3.
Continuing with compilation. Please read 'rvm help mount' to get more information on binary rubies.
Checking requirements for centos.
Requirements installation successful.
Installing Ruby from source to: /usr/local/rvm/rubies/ruby-2.2.3, this may take a while depending on your cpu(s)...
ruby-2.2.3 - #downloading ruby-2.2.3, this may take a while depending on your connection...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:05 --:--:--     0Warning: Failed to create the file ruby-2.2.3.tar.bz2.part
  0 12.7M    0  1402    0     0    270      0 13:43:04  0:00:05 13:42:59 17974
curl: (23) Failed writing body (0 != 1402)
There was an error(23).
Checking fallback: http://ftp.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.bz2
Checking fallback: http://www.mirrorservice.org/sites/ftp.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.bz2

```

curlで書き込めないみたいなエラー。

やったこと

sudo suでRootユーザーになってやってみる。→インストールできた。

ってことで権限の問題なのかなと思ったんですが、よくわからなかったので、一度rvmを再インストールしてみると

```bash

$ sudo curl -sSL https://get.rvm.io | sudo bash
Downloading https://github.com/rvm/rvm/archive/master.tar.gz

Installing RVM to /usr/local/rvm/
test -f /etc/profile.d/rvm.sh && source /etc/profile.d/rvm.sh
Installation of RVM in /usr/local/rvm/ is almost complete:

  * First you need to add all users that will be using rvm to 'rvm' group,
    and logout - login again, anyone using rvm will be operating with `umask u=rwx,g=rwx,o=rx`.

  * To start using RVM you need to run `source /etc/profile.d/rvm.sh`
    in all your open shell windows, in rare cases you need to reopen all shell windows.

# User,
#
#   Thank you for using RVM!
#   We sincerely hope that RVM helps to make your life easier and more enjoyable!!!
#
# ~Wayne, Michal & team.

```

注意書きに

全てのユーザーをrvmグループに追加して再ログインすること
source /etc/profile.d/rvm.sh を実行すること

> 参考
http://stackoverflow.com/questions/26242712/installing-rvm-getting-error-there-was-an-error23

ってかいてあったのでこちらを実行してみたら無事インストールできました。
Bitbucketでリポジトリの設定が表示されないときの対処法

チームのリポジトリで後からWikiを追加しようとしたら歯車（Setting）が無くて困惑しました。
リポジトリの管理者にならないと歯車は表示されないです。

![BitbucketのSetting画面](https://qiita-image-store.s3.amazonaws.com/0/99609/738201e0-7dec-5157-0837-aba3606e413e.jpeg)

チームリポジトリの管理者が、自分のユーザーをアクセス管理で追加するか、管理者に昇格させてもらうと、歯車が出現します。
![Bitbucketのアクセス管理](https://qiita-image-store.s3.amazonaws.com/0/99609/122eeb4b-3d3d-bb43-fe5f-a77bc7715390.jpeg)

そもそも管理者が設定変更すればいいんですが。
Ubuntu に cmake を install する。 

# apt-get でうまくいかない

apt-get で cmake を install したけど、うまく動かなかった。

```
$ sudo apt-get install cmake -y
$ cmake
```

`Inconsistency detected by ld.so: dl-version.c: 224: _dl_check_map_versions: Assertion ``needed != ((void *)0)' failed!`

# しようがないから手動でインストール

ソースコード落として、自分でコンパイルしたらできました。

https://cmake.org/download/ ここから最新を落とす

```
$ wget https://cmake.org/files/v3.4/cmake-3.4.0-rc3.tar.gz
$ tar xvf cmake-3.4.0-rc3.tar.gz 
$ cd cmake-3.4.0-rc3/
$ ./configure
$ make
$ sudo make install
$ export PATH="/usr/local/bin:$PATH"
$ cmake
```

```
Usage

  cmake [options] <path-to-source>
  cmake [options] <path-to-existing-build>

Specify a source directory to (re-)generate a build system for it in the
current working directory.  Specify an existing build directory to
re-generate its build system.

Run 'cmake --help' for more information.
```

うごいた。
EvernoteAPIをnode.jsでいじる


環境はCentOS6.6です。
デベロッパートークンはすでに取得済みであることを前提とします。
##node.jsのインストール

```
$ sudo yum groupinstall 'Development tools'
$ wget http://nodejs.org/dist/v0.12.0/node-v0.12.0.tar.gz
$ tar xvf node-v0.12.0.tar.gz
$ cd node-v0.12.0/
$ ./configure --prefix=/usr/local
$ make
$ sudo make install
```

バージョン確認。

```
$ node -v
v0.12.0
$ npm -v
2.5.1
```


##プロジェクトを作成
ディレクトリを作成&移動して、jsファイルを作成します。

```
$ mkdir EvernoteSampleApp
$ cd EvernoteSampleApp
$ touch index.js
```

###モジュールのインストール

```
$ npm install evernote
$ npm install enml-js
$ npm install --save node-note
$ npm install async
```

###コード
index.jsをエディタで開いてカタカタ。ちなみに私は[Atom](https://atom.io/)で。
ここでやってるのは、新規ノートの作成と、最初のノートの情報を取得→ENML→HTML変換。

```javascript:index.js
var Evernote = require('evernote').Evernote;
var ENML = require('enml-js');                  //ENMLをHTMLにしてくれたり。
var nodeNote = require('node-note');            //ノートを簡単に作成してくれたり。
var async = require('async');                   //非同期処理を楽にしてくれたり。

var DEVELOPER_TOKEN = "<YOUR_DEVELOPER_TOKEN>";  //デベロッパートークン

var client = new Evernote.Client({ token: DEVELOPER_TOKEN });
var noteStore = client.getNoteStore();
var noteFilter = new Evernote.NoteFilter();
var notesMetadataResultSpec;

// 新規ノート作成
/*--------------------------------------------------------------------*/
var evernote = new nodeNote({token: DEVELOPER_TOKEN, sandbox: true});

var options = {
  title: 'hoge',
  body: 'Create new note'
};

evernote.createNote(options, function (err,createdNote) {
  console.log('Create new note : complete' );
});


// ノートの各情報を取得
/*--------------------------------------------------------------------*/

notesMetadataResultSpec = new Evernote.NotesMetadataResultSpec({
    includeTitle: true,
    includeAttributes: true
});

// 非同期処理
async.waterfall([

    // ノート検索？
    function(callback){
        noteStore.findNotesMetadata(noteFilter, 0, 100, notesMetadataResultSpec, function(err, notes) {
            console.log(err || notes);
            if(notes){
                callback( null, JSON.stringify(notes) );
            }
        });
    },

],function(err, result){

    // ひとつ目のノートそ取得してHTML形式で表示
    var getMetaData = JSON.parse(result);
    noteStore.getNote(getMetaData.notes[0].guid, true, true, true, true, function(err, note) {
        console.log(err || ENML.HTMLOfENML(note.content, note.resources));
    });

});

```

>ENMLは、Evernoteノートの記述に使用されるマークアップ言語。
>HTMLタグもサポートされてるけど、idとかclassとかは使えない。

###実行
```
$ node index.js
```

##参考サイト


[1].[npmの基本的な使い方まとめ - うなの日記](http://unageanu.hatenablog.com/entry/20150308/1425779692)
[2].[Node.js error in noteStore.findNotes and noteStore.findNotesMetadata - Evernote for Developers - Evernote User Forum](https://discussion.evernote.com/topic/53202-nodejs-error-in-notestorefindnotes-and-notestorefindnotesmetadata/)
[3].[node.jsのいろいろなモジュール17 – asyncで非同期処理のフロー制御](http://dev.classmethod.jp/server-side/asyn/)
Prefix.pchに書く便利な内容

#概要
<アプリ名>-Prefix.pchに色々と定義しておくとアプリを作る上でデバックがしやすくなったりコードが書きやすくなったりします。
今回は自分が便利だなーと思う内容を書きます。

#実際のPrefix.pchの中身
```Prefix.pch
#ifndef hogehoge_pch
#define hogehoge_pch

#ifdef __OBJC__

// importしておきたいものは入れる
#import <Foundation/Foundation.h> 
#import <UIKit/UIkit.h>
#import <ObjectiveSugar>

#endif

#ifdef DEBUG
    #define LogFunction NSLog(@"%s", __func__); // 実行された関数が表示されるので便利！
#else // リリースでは出さないように
    #define LogFunction
#endif

// 色指定系もよく使うので書いてあります。
#define RGB(r,g,b)      [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0]
#define RGBA(r,g,b,a)   [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:(a)]

#endif
```


#importを毎回するものは書く
新しくプロジェクトを始める時や新規クラスを作る時にCGFloatのような当たり前に使うものを
定義しようとするだけで怒られるのはあれなので、
大体使うようなものはpchファイルにあらかじめ書いた方が楽です。
UIKitなんてまさにそうですねー。個人的にはObjectiveSugarが好きなので毎回入れてます。

あとよくimportするのは以下のようなクラスです。
- アプリ全体で使う定数をまとめたクラス
- NSUserDefalutをラップしたクラス
- ログ系をまとめたクラス
- UIViewのプロパティを簡単に参照できるようなクラス

などなど。いちいちimport忘れで起こられて悩む時間が少なくなるので便利です。

#ログはリリース時に出さないように
NSLogをそのまま使ってリリースするとログがconsoleから見れてしまうので
ifdefを使いリリース時には吐き出さないようにしましょう。
ログのだしっぱは怖いので必ず書くようにしています、、

#最後に
Xcode6からは自動でpchファイルが生成されないので注意です。
以下を参考にすれば出来るので1からプロジェクトを始めるぞーという方は是非ご参考にしていただければと思います！
http://qiita.com/Yuta/items/acddd70f9ac3b3912d2a
LaravelのFacadeをLaravel以外から使う

基本的には[Laravel コードで見るファサードクラスの仕組み - Shin x blog](http://www.1x1.jp/blog/2014/03/laravel-facade-class.html)
を見ればよいのだけれど、[How Laravel Facades Work and How to Use Them Elsewhere](http://www.sitepoint.com/how-laravel-facades-work-and-how-to-use-them-elsewhere/)という記事があったので、試しにSilexからFacadeを使ってみる。

## ざっくりおさらい

*  Facadeは、PimpleのようなIocコンテナに格納されたサービスを簡単に使うための方法。
* `App::make('some_service')->methodName()`や`app()->make('some_service')->methodName()`のかわりに、`SomeService::methodName()`と書くことができる。
* Facadeという名前については色々議論がある。
* LaravelのFacadeを使うこと自体についても色々議論はある。個人的にはケースバイケースではないかと思う。

ではまずSilexとMonolog、そしてFacadeを使うためにilluminate/supportをインストールしよう。

```
$ composer require silex/silex monolog/monolog illuminate/support
```

適当にログを出力するアプリを作る。

```php:web/index.php
<?php
require __DIR__.'/../vendor/autoload.php';

$app = new Silex\Application();
$app->register(new Silex\Provider\MonologServiceProvider(), [
    'monolog.logfile' => 'php://stderr'
]);

$app['monolog']->addInfo("Hello");
```

このように、Monologを`"monolog"`という文字列をキーに呼び出している。これの代わりとなるFacadeクラスを作ろう。

```php:app\Facades\Log.php
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class Log extends Facade
{
    protected static function getFacadeAccessor() {
        return 'monolog';
    }
}
```

composer.jsonにautoloaderの設定をしてcomposer dump-autoloadしておこう。

```json:composer.json
{
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        }
    },
...
```

Facade::setFacadeApplication()にコンテナを渡す。これだけで取りあえずはFacadeを使えるようになる

```php:web/index.php
<?php
require __DIR__.'/../vendor/autoload.php';

$app = new Silex\Application();
$app->register(new Silex\Provider\MonologServiceProvider(), [
    'monolog.logfile' => 'php://stderr'
]);

Illuminate\Support\Facades\Facade::setFacadeApplication($app);

$app['monolog']->addInfo("Hello");
App\Facades\Log::addInfo("World");
```

これでも悪くないが、使う場合はnamespaceを書くかuseする必要がある。LaravelのAliasLoaderを使えばこれを省略することができる。なんだけれどもAliasLoaderを使うにはlaravel/frameworkが必要なようだ。さすがにちょっとやり過ぎ感があるのでここでやめておこう。
Amazon Linux上でPacemakerをインストール


なんか微妙にはまったので記録としてメモしておく。

AMIバージョンは 2015.09.1。

```
curl -O http://iij.dl.osdn.jp/linux-ha/63919/pacemaker-repo-1.1.13-1.1.el6.x86_64.rpm
sudo rpm -iUvh pacemaker-repo-1.1.13-1.1.el6.x86_64.rpm
sudo yum -c /etc/yum.repos.d/pacemaker.repo install corosync pacemaker pcs
sudo service corosync start
sudo service pacemaker start
```

何も設定入れてない状態だけど、これで起動はすることは確認。

## 参考

- https://osdn.jp/projects/linux-ha/releases/p12469
- http://lab.adn-mobasia.net/?p=4296
- http://aws.clouddesignpattern.org/index.php/CDP:High_Availability_NATパターン
オープンソースメッセンジャー「Spika」を試してみた。

オープンソースメッセンジャーの「Spika」というものがおもしろそうだったので試してみました。

事前に調べていた情報だとPHPやCouchDBで動いていると書いてありましたが、情報が古かったためか、蓋を開けてみるとNode.jsとMongoDBで動作するようで、当然、構築手順も全然違ったので、備忘録を残しておきます。

ちなみにライセンスはMITライセンスを使用しているようなので、他のアプリへの組み込みやカスタマイズもしやすそうですね。GitHubで公開されています。

>2015/11/07 追記
2015/08に旧バージョンから新バージョンへ言語ごと移行しているようですね。下記のSpika-Serverが旧版。今回試したのは、下記のSpikaの方です。となると、クライアントも旧版の可能性があります。

https://github.com/cloverstudio/Spika
https://github.com/cloverstudio/Spika-Server
→ 2015/08にhttps://github.com/cloverstudio/Spika へ統合

https://github.com/cloverstudio/Spika-Android
https://github.com/cloverstudio/Spika-iOS

今回試したのはサーバーサイドのみ。環境はCentOS6です。GitHubのページにUbuntuの場合の構築手順が解説してあるので、それを参考に進めてみました。

まずは、GitHubからソースを入手します。クローンを作成するディレクトリに移動して、`git clone`コマンドを実行します。

```console
$ git clone https://github.com/cloverstudio/Spika.git
```

次に、Spkiaを動作させるのに必要なパッケージのインストールをします。CentOSの標準パッケージだででは足りないようでしたので、先にEPELリポジトリを追加しました。

```console
# yum install epel-release
```
Node.jsをインストールします。

```console
# yum install nodejs npm nodejs-mongodb
```

データベースをインストールして起動します。

```console
# yum install mongodb mongodb-server 
# /etc/init.d/mongod start
```

ImageMagickって何か知らないけど必要らしいのでインストールします。私の環境ではインストール済みでした。

```console
# yum install ImageMagick
```

当然ですが、Webアプリなので`/etc/sysconfig/iptables`を編集してポートを開放してやってください。編集したら`/etc/init.d/iptables restart`でファイアーウォールを再起動しておきます。

準備が終わったら、「Spika」の構築です。まず、`package.json`のあるディレクトリに移動してから、`npm`コマンドを使用します。

```console
$ cd Spika/web
$ npm install 
$ npm install gulp -g
```

公式の手順には上記のように書いてあるのですが、私の環境だとエラーが発生してしまいました。どうやら`gulp`のインストールには管理者権限がいるようで再実行しました。

```console
# npm install gulp -g
```

次に、`init.js`にホスト名やポート番号が書いてあるので設定値を変更します。ローカルで試すだけなら`localhost`のままでも構いません。ネットワーク越しの場合は、この他に、DNSまたはクライアントの`host`ファイルを設定してやってください。

```js:web/src/server/init.js
Config.host = "localhost";
Config.port = 8080;
Config.urlPrefix = '/spika';
Config.socketNameSpace = '/spika';
```
`web/src/server/init.js.sample`を参考。

```js:web/src/client/js/init.js 
Config.apiBaseUrl = "http://localhost:8080/spika/v1";
Config.socketUrl = "http://localhost:8080/spika";
```
`web/src/client/init.js.sample`を参考。
 
設定値の変更がすんだら、ビルドとサーバーの起動です。

```console:bash
$ gulp build-dist
$ node src/server/main.js
```

無事、サーバーが起動したらブラウザから次のURLにアクセスします。

```URL
http://localhost:8080/spika/#login
```

すると、ログイン画面が表示され、サービスが起動していることを確認できます。（なぜかテキストボックスの枠が表示されなかった。）

![7e8f10e2-08e7-4360-9720-d224ebda2ae2.png](https://qiita-image-store.s3.amazonaws.com/0/97818/67744f91-8ebb-3cb0-cfb0-6a64ba69339b.png)

ログインして使用するとこんな感じ。何故か同じメッセージが複数表示される。何の不具合だろう？

![5bdb0b17-4552-429c-a9b3-6f60a30ac8f2.png](https://qiita-image-store.s3.amazonaws.com/0/97818/86ba32da-0599-4a22-eec9-40e648c07cd3.png)

今回試したのはここまで。機会があればスマホアプリとの連携も試したいです。（iPhone持ってない（＞＿＜）Androidしか試せないかも。）

>2015/11/07 追記
スマホアプリは旧バージョン用かもしれない。試してみないとわからんぞ。→誰か試してください。
Rustでunixtime

## はじめに
この記事は、`rustc 1.4.0 (8ab8581f6 2015-10-27)` で動作確認しています。


## rust で unixtimeを取得する
[unixtime](https://ja.wikipedia.org/wiki/UNIX%E6%99%82%E9%96%93) とは 

```
協定世界時 (UTC) での1970年1月1日真夜中（午前0時0分0秒）の時刻からの形式的な経過秒数（すなわち、実質的な経過秒数から、その間に挿入された閏秒を引き、削除された閏秒を加えたもの）
```
-- 出典: [wikipedia](https://ja.wikipedia.org/wiki/UNIX%E6%99%82%E9%96%93)
 です。

rustでこのunixtimeを取得する方法の紹介です。
## code

```rust:Cargo.toml
[dependencies]
time = "*"
```

```rust:main.rs
extern crate time;
let now_unixtime: i64 = time::now().to_timespec().sec;
```


# 参考
[Rust forum - Parsing a time string into a Unix timestamp](https://users.rust-lang.org/t/parsing-a-time-string-into-a-unix-timestamp/362)
JavaScript



#0.JavaScriptとは
JavaScriptは、ブラウザ上で動くスクリプト言語。他のプログラム言語に比べてシンプルな仕様になっている。「クライアントサイド」というプログラムの種類。他によく使われるプログラム言語としてPHPが挙げられるが、これは「サーバーサイド」プログラムと言い、Webサーバ上で動くプログラム。JavaScriptとPHPは、ブラウザに表示する、ということ以外、プログラムの記述方法も仕組みも異なるプログラム言語である。
ECMAScriptという標準化されたルールがある。
「クライアントサイド」である主要なブラウザで直接実行できる数少ないプログラムの１つ。スマートフォンやタブレットでもPC同様に動作することから、Webサイトを開発する際には、HTML5+CSS3+JavaScriptの３つを組み合わせて造られる場合がほとんど。


#1.JavaScriptを使う意味
HTMLは文書構造、CSSは見た目、JavaScriptは振る舞いを制御するもの。つまり、主役のHTMLとCSSに対しての「演出」のようなもの。アニメーションやデータ取得して画面に表示・動作させるものなど様々だが、必要以上に多用するとかえって見づらい画面になってしまうし、画面の処理速度を落とす直接的な原因にもなるので必要最低限にしたい。


#2.JavaScriptでできること
画面に文字列を表示する
アニメーション処理
webアプリケーション
データを読み取って画面の必要な部分を書き換える
など

#3.プログラムの基本的な仕組み

HTMLへの記述
<script>
alert('Hello! World');
</script>


文法

var a = 3;
function square(x) {
return x * x;
};

square(a);

aという変数を定義し、squareという関数を定義、
その関数を変数aを使って実行するという例


オブジェクト

プロパティの集まりがオブジェクト
名前と値のペア

オブジェクトを利用するとデータを１つの構造として扱うことができる。
片手落ちNTP設定

【システムクロックだけntpで設定していい気になっていた】

サーバにはシステムクロックとハードウェアクロックがある

システムクロック→OSが管理しているクロック。電源が落ちると消えてしまう。（OSのメモリ上に存在する）

ハードウェアクロック→マザーボード上にあるクロック。ボード上の電池で動いており、OSが落ちても時刻が保持される。

それぞれ独立して動いているのだが、
OSはシャットダウンすると当然システムクロックの時刻を失うため、次回起動時にはハードウェアクロックを読みに行き、そこから時刻をもらって起動する。

なので、システムクロックとハードウェアクロックは同期させる必要がある。特にシステムクロックだけ設定して、やったぜ！みたいな気になっていると後で痛い目を見る。

まず、時刻を確認する。

```
date
```

システムクロックだけ設定するならこう

```
date -s "yyyy/mm/dd hh:mm:ss"
```

これでシステムクロックが設定された。

続けて、ntp同期しているかどうか見てみる。

```
ntpq -p
```

|項目|説明|
|:--|:--|
|remote|サーバ名 ✳︎がついているのが同期中のサーバ。+がついているのが同期はしていないが参照可能なサーバ。何もついていないサーバとは同期してない。×はfalseticker検査で対象から除外されたサーバー（NTPのアルゴリズム自体が信頼できないと判断された）|
|refid|remoteで表示されたサーバの１つ上のstratum。remoteのサーバの参照先。不明なら0.0.0.0|
|st|stratum。大きいほど階層が下。信頼性の意味では、小さいほうがいい|
|t|階層の種類|l: local, u: unicast, m: multicast, b:broadcast|
|when|remote から最後にパケットを受け取ってからの時間|
|poll|ポーリング間隔。サーバと同期している間隔のこと（秒）|
|reach|到達可能レジスタデータ（８進数）|
|delay|時間の遅延見積もり（ミリ秒）|
|offset|remote との時刻のずれ（ミリ秒)|
|jitter|remote の分散(ミリ秒)ntpの時刻ズレを統計的に現したもの。小さいほどよい。|


システムクロックが合ってなれば、

```
ntpdate サーバ名
```

で時刻同期させる。サーバどうこうの話は他のサイトを参照ください。

####ハードウェアクロック

ハードウェアクロックが合っているかどうか見る

```
hwclock
```

合っていなければ、

```
hwclock --systohc
```

で同期させる。

####UTCとローカルタイム
hwclockは、自分が世界標準時刻を使用しているか、ローカルタイムを使用しているか分かるらしい