OmniAICreator/Qiita-1.07M huggingface dataset:
/tmp/ansible/hoge ディレクトリが作れない件について


```yaml
- name: Create /tmp/ansible/hoge
  file:
    path: /tmp/ansible/hoge
    state: directory
```
を実行すると次のようなエラーが発生...

> failed: [192.168.50.4] => {"failed": true, "parsed": false}
BECOME-SUCCESS-pfibjofoelcvdlyyfhfffnxfporngkun
Traceback (most recent call last):
  File "/home/hoge/.ansible/tmp/ansible-tmp-1441687830.74-230638678367351/file", line 2005, in <module>
    main()
  File "/home/hoge/.ansible/tmp/ansible-tmp-1441687830.74-230638678367351/file", line 279, in main
    os.mkdir(curpath)

もしかして`mkdir -p`がfileモジュールだと出来ないのかと思ったが、実は/tmp/ansibleというファイルをansibleが自動的に作っているために失敗していた...他のパスを使えば解決。
Kibana側でダッシュボードを保存したら外部に埋め込んでいるiframeにも反映させる方法

## やりたかったこと

Kibanaで作ったダッシュボードを自社サービスの管理画面に埋め込んで、他のスタッフにも見てもらおうと思いました。こういうときに便利なのはKibanaのShare機能で、iframeを使った埋め込みが可能です。

ダッシュボードを保存するときに、時間フィルタの設定も一緒に保存するオプションを有効にすることで、常に直近２４時間の統計を表示することができます。

![kibana-share](https://qiita-image-store.s3.amazonaws.com/0/69860/6f149927-c342-2875-e5d2-0954dc7f493d.png)


## できなかったこと

さて、iframeによるKibanaダッシュボードの埋め込みはうまくいきました。実際に他のスタッフに見てもらって、いくつか変更したい箇所が出てきたとします。
Kibanaのダッシュボードを開いて、グラフのレイアウトといじったり、時間フィルタの設定を直近７日間に変更したりして上書き保存します。

**ところがiframeで埋め込んだダッシュボードは変更が反映されません。**


## 落とし穴

Share機能で表示されるコードにはダッシュボードを構成するための設定情報が含まれています。したがって、Kibanaの方でダッシュボードを変更しても、iframeで埋め込んだ方に反映されないというのは当然といえば当然です。

とはいえ、初めて使った時、更新させるものと思い込んでいてハマりました。


## 解決方法

よくよく見てみるとKibanaで保存してあるダッシュボードを呼び出すとき、リンクのURLはダッシュボード名だけになっています。

`http://your.domain.com/#/dashboard/<ダッシュボード名>`

このURLを呼び出した後、ダッシュボード名から設定を読み込んでURLを書き換えて、ダッシュボードが構築されます。さらにiframe埋め込みの場合はGETパラメータにembedを指定するだけで枠が消えるので以下のようなフォーマットで指定すると設定が反映されます。

`http://your.domain.com/#/dashboard/<ダッシュボード名>?embed`
80MBのウェブサイト

ネットワーク環境が整備され、ウェブサイトの１ページあたりのサイズは大きくなってきています。
ティザーサイトのような画像をバンバン使うものでは特にそうですね。
いまどき1ページで5MB近い通信を行うサイトもそう珍しくはないと思います。

ところで、私の大好きなアトリエシリーズを作っているガストの「よるのないくに」というゲーム（未発売）がありまして
この公式サイトがやけに遅いなぁと思っていたわけです。

ここです。
http://social.gust.co.jp/yorukuni/

なんで遅いのかなぁと調べてみた結果がタイトルです。
（正確には79.7MBでしたが）

すごいですね。こんなのが許容される時代がきたんですね。。。
いや、批判してるんじゃないです。ただ単に時代の移り変わりを感じたんです。
ティザーサイトとはいえ、1PVに80MB使っていい時代。すごい。
OSXのC言語でsha1の計算をしようしたらコンパイルエラーが出た時の対処法

`#include <openssl/sha.h>`を使ってsha1の計算をしようとしたらコンパイルエラーが出ました。

```
Undefined symbols for architecture x86_64:
  "_SHA1_Final", referenced from:
      _calc_sha1 in sha1-8b90d3.o
  "_SHA1_Init", referenced from:
      _calc_sha1 in sha1-8b90d3.o
  "_SHA1_Update", referenced from:
      _calc_sha1 in sha1-8b90d3.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

# 対処法
コンパイルするときに`-lcrypto`を指定したら解決しました。

```
gcc -lssl -lcrypto sha1.c
```

(Linuxだと-lsslだけでいけた気がするんだけど、なんでだろう...)
constなNSStringでdiscards qualifiers警告が出る


## 元の解説はこちら

[objective c - "sending 'const NSString *' to parameter of type 'NSString *' discards qualifiers" warning - Stack Overflow](http://stackoverflow.com/questions/6828831/sending-const-nsstring-to-parameter-of-type-nsstring-discards-qualifier)
# 起こったこと

以下のようにconstantな文字列を定義したとき、discards qulifiersという警告が出た

```objectivec
const NSString * CONSTANT_STRING = @"";
```

# 結論

constantな文字列を定義するときは以下のように書きましょう

```objectivec
NSString * const CONSTANT_STRING = @"";
```

この書き方で初めて、`CONSTANT_STRING`が別のNSStringオブジェクトへのポインターへ再割当てされるのを防ぐことになる。
つまり、constantなポインタがNSStringオブジェクトを指している状態となっている。

# だめな書き方

以下のいずれかの書き方だと上の警告が出る

```objectivec
const NSString * CONSTANT_STRING = @"";
NSString const * CONSTANT_STRING = @"";
```

これらはconstantなNSStringオブジェクトに対するポインタを指すことになってしまっている。
もともとimmutableなNSStringをさらにconstantにしたオブジェクトを指しているので、`NSString *`と全く同じこととなる。
`NSString const *`なら一見良さそうに見えるが、だめだった。
npmに登録されたモジュール数伸びすぎ


Hacker Newsで見つけた「Lisp is still a secret weapon」という記事
http://kep.io/is-lisp-still-a-secret-weapon/

この記事の主題はさておき、ここにパッケージ管理システムのモジュール登録数のグラフが掲載されている。
npmの伸びが凄すぎです。
現在のモジュール数もトップですが、伸び方の傾斜も凄い。
GitHubなどで検索するとJavaScriptの登録が非常に多いのでいまさらかもしれませんが、改めてJavaScriptの勢いを感じました。

それにしても国内におけるNodeJSの採用事例があまり増えた気がしないのはなぜでしょう。
node.js/io.js問題も片付いたし利用が広がって欲しいですね。
skype for windows 設定と操作

# 設定

menu -> 会話 -> 通知設定

で新しく message が来たときに task bar の button に表示するかどうかを選べる。ただし会話ごとなので、会話が多いと設定に手間がかかる。どうにかならないか。

# 操作

Alt + (1|2) で左の pane に行ける。

Alt + 2 で左の pane に会話一覧を表示したあと、会話を選んで enter を押すと、 message 入力欄に focus が移る。ここから backtab (shift + tab) を数回押すと発言に focus が移る。この状態で ↑↓ を押すと会話のなかを時間軸に沿って移動できる。
virtual boxにcentosを入れたらエラー

virtual boxにcentosをインストールしようとしたら、

```
Unable to boot - please use a kernel appropriate for your CPU.
```

となって進めなくなった。

![error](http://i.imgur.com/sawcv7r.png?1)

「VM  VirtualBox マネージャー」ウインドウの
仮想マシン→設定→システム→プロセッサー→PAE/NXを有効化
にチェックを入れると先に進めるようになりました。


![setting](http://i.imgur.com/Qhz73Ww.png?1)


ちなみに仮想マシンがパワーオフの状態でないと変更できないです。
tmuxでSSH時に変更したwindow-nameを自動でもとに戻す（vagrant ssh編）

* [tmuxでSSH時に変更したwindow-nameを自動でもとに戻す - Qiita](http://qiita.com/yuku_t/items/4ffaa516914e7426419a)

こちらの記事参考にしていたのですが、なぜかwindow名が元に戻らないなと思っていたところ、`vagrant ssh`で接続すると、この関数が使われないためwindow名が元に戻らないことに気づきました。

```:.zshrc
function vssh() {
    local window_name=$(tmux display -p '#{window_name}')
    command vagrant ssh $@
    tmux rename-window $window_name

```

`vagrant ssh`するときは、`vssh`することにしました。
embulkでElasticsearchにOutputするときのTimezone指定


### 背景
お仕事で貯まったcsvデータ（日付と時刻情報）をElasticsearchにoutputするときに、日付情報の列がUTCでしか入らないのでハマった

### 結論
- default_timezone: 'Asia/Tokyo' を設定する
- 表記は、JSTじゃなく、 **UTCのまま** なので注意

### embulk version.
```
$ embulk -v
Embulk v0.7.7
```

### embulk-output-elasticsearchのインストール
- 2016/2/15 時点で 0.2.1がダウンロードできた。ES2.X系に対応してくれている。

```
$ embulk gem install embulk-output-elasticsearch
Fetching: embulk-output-elasticsearch-0.2.1.gem (100%)
Successfully installed embulk-output-elasticsearch-0.2.1
1 gem installed
```

### データ：sample.csv
- 業務で使うデータは以下のような時刻フォーマットが多い。

```
user,time
sato,2015/5/1 0:00
suzuki,2015/5/2 12:00
yoshida,2015/5/3 23:00
```

### embulkのconfig.yml
- guessコマンドで生成したやつの一例
	- default_timezone: 'Asia/Tokyo'は下記のように入れる

```
in:
  type: file
  path_prefix: sample.csv
  parser:
    charset: UTF-8
    newline: CRLF
    type: csv
    delimiter: ','
    quote: '"'
    escape: '"'
    trim_if_not_quoted: false
    skip_header_lines: 1
    allow_extra_columns: false
    allow_optional_columns: false
    default_timezone: 'Asia/Tokyo'
    columns:
    - {name: user, type: string}
    - {name: time, type: timestamp, format: '%Y/%m/%d %H:%M'}
out:
  type: elasticsearch
  index: sample
  index_type: sample
  cluster_name: sample
  nodes:
  - {host: example.ne.jp, port: XXXX}
```

### default_timezone: 'Asia/Tokyo'がないとき
- そのまま、UTC表記になってしまう。

```
$ embulk preview config.yml
2015-09-08 03:19:45.928 +0000: Embulk v0.7.4
2015-09-08 03:19:48.325 +0000 [INFO] (preview): Listing local files at directory '.' filtering filename by prefix 'sample.csv'
2015-09-08 03:19:48.338 +0000 [INFO] (preview): Loading files [sample.csv]
+-------------+-------------------------+
| user:string |          time:timestamp |
+-------------+-------------------------+
|        sato | 2015-05-01 00:00:00 UTC |
|      suzuki | 2015-05-02 12:00:00 UTC |
|     yoshida | 2015-05-03 23:00:00 UTC |
+-------------+-------------------------+
```

### default_timezone: 'Asia/Tokyo'があるとき
- 時刻が、-9:00されてる

```
$ embulk preview config.yml
2015-09-08 03:23:26.862 +0000: Embulk v0.7.4
2015-09-08 03:23:29.504 +0000 [INFO] (preview): Listing local files at directory '.' filtering filename by prefix 'sample.csv'
2015-09-08 03:23:29.518 +0000 [INFO] (preview): Loading files [sample.csv]
+-------------+-------------------------+
| user:string |          time:timestamp |
+-------------+-------------------------+
|        sato | 2015-04-30 15:00:00 UTC |
|      suzuki | 2015-05-02 03:00:00 UTC |
|     yoshida | 2015-05-03 14:00:00 UTC |
+-------------+-------------------------+
```

### その他
- UTCじゃなくて、JSTに表記できないのかな。
Vagrantの共有フォルダにゲストOSのapacheが書き込めない件

    ホストがOSX,ゲストがCentOS7でやっています。

### 
Vagrantの共有フォルダ（Synced Folders）はこれが無かったらVagrant使ってねーよってぐらい便利です。
`Vagrantfile`に下記の感じで書くだけですし。

```
config.vm.synced_folder "/var/www/hogehoge", "/var/www/hogehoge", create:true
```

apacheの設定で`EnableSendfile`をoffにしていないとファイルを更新しても反映されないので注意。apacheのhttpd.confにネットワーク越しにマウントしているときはoffにしてねと書いてあります。

さて、これで共有フォルダをapache経由で表示できる様になりましたが、上記設定だと共有ファイルのownerが全部vagrantになってしまいます。その為、apacheから共有フォルダに書き込めません。パーミッションを0777に変更しようとしても変更出来ません。そこでファイルに書き込めるように以下の設定をします。

```
config.vm.synced_folder "/var/www/hogehoge", "/var/www/hogehoge", create:true,owner:"apache",group:"apache"
```

こうすると、共有フォルダ内のownerが全てapacheになって書き込めるようになります。

さて、そうすると今度は別の問題が出てきてしまいました。バッチ処理でファイルを書き込むときにapacheユーザーでないと書き込めません。なので、結局nfsでつなぐことに。macだとnfsでつなぐのちょこっと設定するだけなので簡単です。

```
config.vm.synced_folder "/var/www/hogehoge", "/var/www/hogehoge", :nfs => true
```

こんな感じでファイルは全てuid 501になります。

```
cat /etc/exports
# VAGRANT-BEGIN: 501 c44222be-6460-4c1a-a320-b3423ef74144
"/private/var/www/hogehoge" 192.168.12.12 -alldirs -mapall=501:20
# VAGRANT-END: 501 c44222be-6460-4c1a-a320-b3423ef74144
```

これで色々OKだったのですが、PHPのセッションファイルがファイルを600で作るので作った後に書き込めないというｗ
最終手段でゲスト上のapacheユーザーのuidを`/etc/passwd`を書き換えて501にしちゃいました。



**パーミッションだけを変えるなんかいい方法あるんだろうか・・・。**
「Android 4.4だとちゃんと文字選択できるのに、4.2だとできない」というときはClickableSpanを疑う

大した話ではありません。

http://stackoverflow.com/questions/23363484/how-can-i-have-edittext-with-clickable-spannables-and-still-selectable-by-longcl
Stack Overflowでもちょいちょい話は上がっているみたいですが、
TextViewで **リンクを含むテキスト** を作ると、Selectableじゃなくなってしまう（※古い端末だけ）　という問題についてのお話です。

## 原因

```diff:LinkMovementMethod.java
diff --git a/core/java/android/text/method/LinkMovementMethod.java b/core/java/android/text/method/LinkMovementMethod.java
index aff233d..3855ff3 100644
--- a/core/java/android/text/method/LinkMovementMethod.java
+++ b/core/java/android/text/method/LinkMovementMethod.java
@@ -36,6 +36,11 @@
     private static final int DOWN = 3;
 
     @Override
+    public boolean canSelectArbitrarily() {
+        return true;
+    }
+
+    @Override
     protected boolean handleMovementKey(TextView widget, Spannable buffer, int keyCode,
             int movementMetaState, KeyEvent event) {
         switch (keyCode) {

```
https://github.com/android/platform_frameworks_base/commit/cd0b01327bd80dc3306ffb28a4cefd5ca20c50b4

こいつがJB以前のAndroidには取り込まれていない。


## 回避策

```java:LinkMovementMethodCompat

class LinkMovementMethodCompat extends LinkMovementMethod {
    @Override
    public boolean canSelectArbitrarily() {
        return true;
    }

    public static MovementMethod getInstance() {
        if (sInstance == null)
            sInstance = new LinkMovementMethodCompat();

        return sInstance;
    }

    private static LinkMovementMethodCompat sInstance;
}
```

こんな感じのクラスを用意して

`linktext.setMovementMethod(LinkMovementMethod.getInstance());`
と呼ぶ代わりに
`linktext.setMovementMethod(LinkMovementMethodCompat.getInstance());`
としてやる。


## 結果

![Screenshot_2015-09-08-12-46-49.png](https://qiita-image-store.s3.amazonaws.com/0/74571/afe7e872-1d2a-0ff8-e066-33f30424feaf.png)

ｷﾀ━━━━(ﾟ∀ﾟ)━━━━!!　となります。


## あとがき

おそらく、ArrowKeyMovementMethod はJellyBean以前でもテキスト選択できるからという理由で、ArrowKeyMovementMethodをベースにしているソースも見受けられますが、原因と対策がかみあっていないです。
原因に対して素直に対策をするのが最善かなと思って、シンプルな回避策を載せてみました。
vagrant を sudo でインストールしてたのを修復した話

sudo なしで vagrant up するとおこられちゃう。

```
The VirtualBox VM was created with a user that doesn't match the
current user running Vagrant. VirtualBox requires that the same user
be used to manage the VM that was created. Please re-run Vagrant with
that user. This is not a Vagrant issue.

The UID used to create the VM was: 0
Your UID is: 501
```

そこで・・・ググった結果と実行結果

### １） ~/.vagrant.d/data/lock.fpcollision.lock　の権限を自分にする

http://www.msng.info/archives/2014/06/permission-denied-when-vagrant-up.php

でもこれで解決するのは、vagrant自体をちゃんと自分の権限でインストールしてた場合の話。
今回はうまくいかず。


### ２）/usr/bin の権限を自分にする

これはとりあえずやっておく。
それでもそのまま vagrant up しても同じエラーがでるのでしかたなく・・・・

### ３）vagrant を再インストール
http://qiita.com/nak0323/items/045983385d2944740d66

今までたいして使ってなかったしw
うまくいった。
再インストール時にsudo使うことはありませんでした。

さて、いよいよ

```
vagrant up
```

すると、質問された。

```
sudo: effective uid is not 0, is sudo installed setuid root?
```

これで解決。
「`sudo: effective uid is not 0, is sudo installed setuid root?`」と表示され、sudoコマンドが使えない場合は、ディスクユーティリティを使え (Mac)
http://qiita.com/dogwood008/items/50a13760c11f8a9b45a1


sudoでvagrant起動してると、VirtualBoxも起動中のマシンとして出してくれなかったんだけど、
これでちゃんと出してくれるようになった。
Force.COM IDEでログインできなくなった時の対策

Force.com IDEでログイン使用した時、「ユーザー名、パスワード、セキュリティトークンが無効か、ユーザーがロックされています」というエラーが出てログインできなくなった時、以下を参考にすることで解決。

[force.COM IDE何度やってもログインに失敗する](https://developer.salesforce.com/forums/?id=906F0000000BC8KIAW)

Macの場合に読み替え。

- Eclipse -> 環境設定
- General -> Security -> Secure Storage をクリック
- Contents タブをクリック
- Force Projectsを選択し、削除ボタン押下
- Eclipse再起動
【virtualbox】仮想サーバの削除

VirtualBoxから仮想サーバを削除する際にやらなきゃいけないこと。

virtualboxマネージャから削除対象の仮想サーバを右クリック→「除去」
「全てのファイルを削除」
を選択。

仮想サーバを配置していたwindowsディレクトリから`.vagrant`フォルダと`Vagrantfile`を削除。

windows上のユーザフォルダから仮想サーバの実体ファイルを削除
`C:\Users\033024003\.vagrant.d\boxes`
`C:\Users\033024003\VirtualBox VMs`
StoryBoardを使わない方法


#手順

1. `Info.plist`内の`Main storyboard file base name`の値を空白にする
2. General - Deployment Info 内の`Main Interface`の値を空白にする
3. `AppDelegate.m`に以下のコードを記述する

```ObjC:AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
	
	// UIWindowの生成
	self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
	self.window.backgroundColor = [UIColor whiteColor];
	
	// 最初に表示されるViewControllerを生成
	FirstViewController *fvc = [[FirstViewController alloc] init];
	self.window.rootViewController = fvc;
	[self.window makeKeyAndVisible];
	
	return YES;
	
}
```


#NavigationControllerを使う場合
上記と同様に、`AppDelegate.m`に以下のコードを記述します。

```ObjC:AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
	
	self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
	self.window.backgroundColor = [UIColor whiteColor];
	
	FirstViewController *fvc = [[UIViewController alloc] init];
	
	// 最初に表示したいViewControllerを指定してインスタンス生成する
	UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:fvc];
	self.window.rootViewController = nc;
	[self.window makeKeyAndVisible];
	
	return YES;
}
```

画面遷移する際には以下のようにします。
FirstViewController内に配置したボタンを押した際に画面遷移することを想定しています。
`self`はFirstViewControllerです。

```ObjC:FirstViewController.m
- (IBAction)pushButtonPressed:(UIButton *)sender {
	
	SecondViewController *svc = [[SecondViewController alloc] init];
	[self.navigationController pushViewController:svc animated:YES];
	
}
```
Sublime Textで特定の拡張子にデフォルトのシンタックスを紐付ける


最近 .eslintrc とか .jscsrc とかの設定ファイルが増えてきたけどSTはそんな新しい拡張子のファイルはシンタックスハイライトしてくれないから自分で設定する。

## 設定方法

+ 該当拡張子ファイルを開く
+ ```View -> Syntax -> Open All with current extension as...``` で好きなシンタックスを選択
	+ ※ ```Open All with current extension as...```を選ぶこと
+ ```Preferences -> Settings More -> Syntax Specific - User```を選択
+ ```XXXX(選んだシンタックス名).sublime-settings``` のファイルが出来てるので、extensions の値の配列に他にも追加したい拡張子があれば足す

## 設定ファイルの置き場
```~/Library/Application Suport/Sublime Text 3/Packages/User/XXXX.sublime-settings```
サーバ証明書をaws-cliでインストール

# サーバ証明書をaws-cliでインストール
## はじめに
ELBでSSLTerminationを行い、CloudFrontは独自ドメインSSLを使用する。
という場合があったので、忘れないようにここに書いておきます。

## 用意する証明書
| 名前 | 用途 |
|:-----------:|:------------:|
| hoge.com    | Webサイト（ELB）用 | 
| cdn.hoge.com      | CloudFront用 |

## 事前準備
awscliにて、plofile「demo」としてクレデンシャル登録済みの前提です。
以下のコマンドで作成。

```
aws configure --profile demo
```
## ELB用
```
$ aws --profile demo iam upload-server-certificate --server-certificate-name hoge.com --certificate-body file://HOGE_CERT.crt --private-key file://hoge_web.pem --certificate-chain file://HOGE_INTER.crt
```

## CloudFront用
```
$ aws --profile demo iam upload-server-certificate --path /cloudfront/ --server-certificate-name cdn.hoge.com --certificate-body file://HOGE_CERT.crt --private-key file://hoge_cloudfront.pem --certificate-chain file://HOGE_INTER.crt
```

## 参考リンク
- [http://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/ssl-server-cert.html](http://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/ssl-server-cert.html)
- [http://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/elb-update-ssl-cert.html](http://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/elb-update-ssl-cert.html)
- [http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-trusted-signers.html#private-content-creating-cloudfront-key-pairs](http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-trusted-signers.html#private-content-creating-cloudfront-key-pairs)
[memo] HHKB Pro 2 の dip switches

取扱説明： https://www.pfu.fujitsu.com/hhkeyboard/leaflet/hhkb_backview.html 

現在、私は、

- 3, 5 : on
- 他 : off

としている。ここ数年間

- 3, 4, 5 : on
- 他 : off

としてきたが、 Fn はひとつで良いと気づいて、変えた。
Android - DateFormatメモ

# 経緯
- よく使用するが、ややこしいのでメモ

# Pattern A
- 現在のロケールに対応する書式（short）
- 特記事項 `android.text.format.DateFormat.getDateFormat(context)`は、 `java.text.DateFormat`を返す。 （`android.text.format.DateFormat`ではない）

```java
public class Crime {
    private Date mDate;
    // ...

    /**
     * @param c context
     * @return formatted date string
     */
    public String getDateString(Context c) {
        java.text.DateFormat df = android.text.format.DateFormat.getDateFormat(c);
        return df.format(mDate);
    }
    // ...
}
```

- E.g. あるfragmentから呼ばれた例

```java
    mDateButton.setText(mCrime.getDateString(getActivity()));
```

# Pattern B
- 現在のロケールに対応する書式（long）
- 特記事項 Pattern Aと同じ

```java
public class Crime {
    private Date mDate;
    // ...

    /**
     * @param c context
     * @return formatted date string
     */
    public String getDateString(Context c) {
        java.text.DateFormat df = android.text.format.DateFormat.getLongDateFormat(c);
        return df.format(mDate);
    }
    // ...
}
```

- E.g. あるfragmentから呼ばれた例

```java
    mDateButton.setText(mCrime.getDateString(getActivity()));
```


# Pattern C

- 書式を指定する
- どうしても特定の書式でなければならない場合を除き、このパターンは避けるべき
- 特記事項 `android.text.format.DateFormat.format(CharSequence inFormat, Date inDate)`は、`CharSequence`を返す 。 （`String`ではない）

- [書式の指定方法](http://developer.android.com/reference/java/text/SimpleDateFormat.html)

```java
public class Crime {
    private Date mDate;
    // ...

    /**
     * @return formatted date string
     */
    public String getDateString() {
        return ((String)DateFormat.format("EEE, MMM d, ''yy", mDate)).toString();
    }
    // ...
}
```

- E.g. あるfragmentから呼ばれた例

```java
    mDateButton.setText(mCrime.getDateString());
```

# 参考資料

- http://developer.android.com/reference/android/text/format/DateFormat.html
- http://developer.android.com/reference/java/text/DateFormat.html
- http://developer.android.com/reference/java/text/SimpleDateFormat.html
- http://blog.cindypotvin.com/formatting-dates-with-java-in-android-applications/
iosでテキストフィールドがキーボードの下に隠れないようにする

# Problem

* テキストフィールドがキーボードの下に隠れる。
* UIScrollViewを使った解決方法を選択したくない。


# Solution

CocoaPodsで[IQKeyboardManager](https://github.com/hackiftekhar/IQKeyboardManager)をインストールすれば、1行もコードを書かずに上記の問題が解決します。

プロジェクトの「Minimum iOS Target」が「iOS 8.0以上」の場合は「IQKeyboardManagerSwift」を、「iOS 8.0未満」の場合は「IQKeyboardManager」をCocoaPodでインストールします


```
# Podfile:

pod 'IQKeyboardManager'
```

これだけで完了です。
【vagrant】boxファイルの作成

そのままPackageしてもよいが、多少でもboxファイルを圧縮する。

```
# du -sh /var/cache/yum
# yum clean all
---
# dd if=/dev/zero of=/EMPTY bs=1M
# rm -f /EMPTY
```

package化する前に仮想マシンはshutdownしておく。
（packageコマンド実行時に立ち上がってても自動でshutdownしてくれるけど。）

BOXファイル作成は`>vagrant package --base <仮想マシン名>`を実行する。

```
C:\cms>vagrant package --base cms
==> cms: Exporting VM...
==> cms: Compressing package to: C:/cms/package.box
```

圧縮前後でだいたい10%くらい削減できる。
td-agent(fluend)からelasticsearchをつなぎこむ際のデバッグ方法


独立したアプリケーションをつなぎこむのは、大変です。それは、エラーが出た時にどっちのアプリケーションの設定が間違っているのか？を判断するのも大変だからです。
ということで、td-agent(fluentd)とelasticsearchをつなぎこむ際に打ったコマンドを掲載しておきます。
前提として、elasticsearchにはlogstashのフォーマットで、logstash_prefixをtest、2015年9月8日に行っていると仮定します。


## elasticsearchのdebug

### 1. elasticsearchのログをtailする

```
tail -f /var/log/elasticsearch/elasticsearch.log
```


### 2. elasticsearchにレコードが登録されたか確認する

まずはindex（データベースでいうテーブル）ができたか確認

```
curl 'localhost:9200/_cat/indices?v'
```

レコードが入っているか確認

```
curl 'localhost:9200/test-2015.09.08/_search?q=*&pretty'
```

## td-agentのdebug

### 1. td-agentをデバッグモードで立ち上げておく

```
sudo td-agent -vv
```

/var/log/td-agent/td-agent.logにもログは出るんですが、もっと詳細なログを出したい時は、一旦daemonを止めて、上記コマンドで起動するのがよいみたいです。

## 自分がはまったところ

td-agentにおいて、matchを```**nginx**```としてたら、ltsv.nginxもこれに引っかかってしまい、```ltsv**```が実行されなかった。
解決方法としては、```**nginx**```を```ltsv**```の下に持っていくか、もっと限定的なmatchにするか？ですが、自分は後者を採用しました。

```:td-agent.conf
<match **nginx**>
  type copy
  <store>
    type parser
    format ltsv
    time_format %d/%b/%Y:%H:%M:%S %z
    add_prefix ltsv
    key_name message
  </store>
  <store>
    type file
    path /tmp/fluent.log
  </store>
</match>

<match ltsv**>
  type elasticsearch
  host localhost
  port 9200
  index_name fluentd
  type_name fluentd
  logstash_format true
  logstash_prefix test
</match>
```
evm を使って最新版のEmacsをUbuntu 12.04にインストールしてみる

# あらまし

どうやらdiredのフックが足りないようで`dired-k`が24.1では思うように動かないぽいので、
どうせだからEmacs 24.4をインストールしようと思った次第。

ただ、Ubuntu 12.04環境でEmacs 24.4のPPA等パッケージはなく、tarballからインストールしなければいけないようだ。
なるべくならパッケージと同じくremoveできるようにしたいが、いちいちパッケージ作るのはとても面倒だ。

幸い、[evm](https://github.com/rejeep/evm)というEmacs のバージョンマネージャがあるのでこちらを使ってみる。

# インストール

## evmのインストール

```
curl -fsSkL https://raw.github.com/rejeep/evm/master/go | bash
```

`.bashrc`に以下を追記。

```
export PATH="$HOME/.evm/bin:$PATH"
```

/usr/local/evmを作成

```
sudo mkdir /usr/local/evm
```

## Emacsのインストール

以下でインストールできるEmacsのリストが取得できる。

```
evm list
```

以下でインストール（Ex. Emacs 24.4）
```
evm install emacs-24.4
```

# あうあう

…が、どーやらProxyに対応してない感じが。
https://github.com/rejeep/evm/issues/56

というわけで、Proxy環境対応を待ちましょう(ToT)。
Cordovaの環境構築をしてみる

#はじめに
ハイブリッドアプリを作成するために[Cordova](https://cordova.apache.org/)の環境構築手順をまとめていきます。

利用環境は以下の通り
- Mac Yosemite(10.10.5)
- Node.js(0.10.26)
- Xcode(6.4)

#Cordovaってなに？
[「Apache Cordova」](https://cordova.apache.org/)はOSSのフレームワークで、ハイブリッドアプリを作成することができます。

ハイブリッドアプリでは、HTMLやCSS、Javascriptを用いてUIやロジックを作るため、iOSやAndroid、WindowsPhoneといった複数のOSでも個別に作り込む必要がなくなります。また、既存のWeb技術がそのまま使える点も大きな魅力となります。


カメラ操作やファイル操作などネイティブの制御を行う際は、Javascriptからプラグインを経由してネイティブのロジックを呼び出し、実現しています。よく利用する機能はプラグインとして公開されているため、基本的にはプラグインを利用するのみで済みます。

既存のプラグインで対応できない場合は既存のプラグインをカスタマイズするか、独自にプラグインを作成することでネイティブでできることはほぼ実現できます。

#事前準備
##Node.jsのインストール
[Node.js](http://nodejs.jp/nodejs.org_ja/docs/v0.10/#download)ここからダウンロードし、インストールします。

##Xcodeのインストール
AppStoreから「Xcode」を検索し、インストールします。

#Cordovaのインストール
Node.jsのnpmを用いて、Cordovaをインストールします。
「ターミナル」から以下のコマンドを実行します。

```
$ sudo npm install -g cordova
```

上記コマンドで最新のCordovaがインストールされます。
パラメータ```-v```でインストールされたバージョンを確認します。

```
$ cordova -v
5.2.0
```
（2015/09/08時点では5.2.0がインストールされています。）

#Cordovaプロジェクトの作成
Cordovaのプロジェクトを作成します。

プロジェクトを作成するフォルダに移動します。
ここでは/Users/[ユーザー名]/Documents/srcフォルダ内に作成します。
作成するフォルダに移動後、以下のコマンドを実行します。

```
$ cordova create SampleCordova com.example.SampleCordova SampleCordova
```
これでSampleCordovaのプロジェクトが作成されます。


```cordova create```以降の引数は以下の内容となります。

- 第１引数-SampleCordova:プロジェクトフォルダ名
- 第２引数-com.example.SampleCordova:アプリ識別名(iOSのBundle Identifier)
- 第３引数-SampleCordova:プロジェクト名(Xcodeのプロジェクト名)


プロジェクトのフォルダに移動します。

```
$ cd SampleCordova
```

#プラットフォームの追加
作成したSampleCordovaで使用するプラットフォーム(iOSやAndroid、WindowsPhoneなど)を追加します。ここではiOSのみを追加します。

```
$ cordova platform add ios
```

lsコマンドで追加されたプラットフォームの種類を確認することができます。

```
$ cordova platform ls
Installed platforms: ios 3.9.1
Available platforms: amazon-fireos, android, blackberry10, browser, firefoxos, webos
```
iOSのプラットフォームが追加され、プラットフォームのバージョンは3.9.1がインストールされていることがわかります。

#iOS Simulatorのインストール
実行させるためのSimulatorをインストールします。

```
$ sudo npm install -g ios-sim
```


#プロジェクトのビルド
Simulatorで実行できるようにプロジェクトのビルドをします。

```
$ cordova build
```

# Simulatorの実行
Simulatorを実行します。

```
$ cordova emulate ios
```

Simulatorが起動し、Cordovaのアプリが表示されます。

![スクリーンショット 2015-09-08 10.58.13.png](https://qiita-image-store.s3.amazonaws.com/0/92510/bc52df41-8ea8-df76-96bf-5f3037aa9182.png)

#Xcodeプロジェクト
プラットフォームにiOSを追加するとXcodeのプロジェクトファイルが生成されます。```/Users/[ユーザー名]/Documents/src/SampleCordova/platforms/ios```のフォルダに格納されているため、Xcodeを用いてビルド、Simulatorの起動等も行えます。

#おわりに
Cordovaの環境構築は特につまづくことなく終わりました。
プラグインの追加手順や構成などは徐々にまとめていきます。
Android SDK for linuxを64bit環境なCentOSにインストールする時詰まるところ。aaptが動きません編


# これは何？
aaptはAndroid SDKのAsset Packaging Toolです。
aapt自体は32bitのアプリケーションなので、64it環境のOSではそのままでは動きません。
動かすには32bit版のlibstdc++とzlibをインストールしてあげましょう。



# CentOSの場合

## 32bit版libstdc++, zlibのインストール
32bit版と64bit版のlibstdc++, zlibは共存可能ですが、バージョンを合わせてあげる必要があります。
特に問題なければ、最新版にupdateしてから32bit版のライブラリをインストールします。

```bash
sudo yum update libstdc++ zlib++
sudo yum install libstdc++.i686 zlib++.i686
```


## 動作確認

aaptコマンドが使えるようになっているはず。

```bash
$ ./aapt
Android Asset Packaging Tool

Usage:
 aapt l[ist] [-v] [-a] file.{zip,jar,apk}
   List contents of Zip-compatible archive.

 aapt d[ump] [--values] [--include-meta-data] WHAT file.{apk} [asset [asset ...]]

(略)
```

## それでも動かない場合は

64bit版が優先して読み込まれていないか確認しましょう。

```bash
echo $LD_LIBRARY_PATH
```

32bit版ライブラリは /usr/lib にインストールされているはずなので、
32bit版を優先させたい場合は、下記のようにしてあげればOK。

```bash
export LD_LIBRARY_PATH=/usr/lib:${LD_LIBRARY_PATH}
```
ServerをNode.js、ClientをJavaでSocket.IO

### やりたいこと
サーバー側をNode.jsで書いて、
クライアント側ではJavaを使ってSocket.IOで通信したい

### サーバー側

```js:server.js
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.get('/', function(req, res){
  res.sendfile('index.html');
});

http.listen(3000, function(){
  console.log('listening on *:3000');
});

io.sockets.on('connection', function (socket){
  // hello, worldはクライアントが接続するとすぐに1度だけ送信されます
  socket.emit('message_from_server', 'hello, world');

  //　クライアントからmessage_from_clientがemitされた時
  socket.on('message_from_client', function (msg){
    console.log('message:', msg);
  });
});
```


expressとsocket.ioを使っているので、以下のコマンドでインストールしてください

```sh
$ npm install express
$ npm install socket.io
```

### クライアント側

以下のコードではこのライブラリを使ってます
https://github.com/socketio/socket.io-client-java

```java:Main.java
import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;
import java.net.URISyntaxException;

public class Main {
    public static void main(String[] args) throws URISyntaxException {

        final Socket socket = IO.socket("http://localhost:3000");

        // サーバーからのmessage_from_serverがemitされた時
        socket.on("message_from_server", new Emitter.Listener() {
            @Override
            public void call(Object... objects) {
                // 最初の引数を表示
                System.out.println(objects[0]);
                //サーバー側にmessage_from_clientで送信
                socket.emit("message_from_client", "This is Java");

            }
        });

        socket.connect();
    }
}

```

### 動作
以下のコマンドでサーバーを起動します

```sh
$ node server.js
```

Main.javaを実行するとすぐに「hello, world」とJavaのコンソールに表示されます。その後サーバー側のコンソールには「This is Java」と表示されます。

#### Node.js
![スクリーンショット 2015-09-08 午前10.31.07.png](https://qiita-image-store.s3.amazonaws.com/0/84451/7b04c56e-5a69-7675-a4ae-251191f389d3.png)

#### Java
![スクリーンショット 2015-09-08 午前10.32.51.png](https://qiita-image-store.s3.amazonaws.com/0/84451/f4b1c7d4-5489-25fa-1ecc-160bccd7badd.png)




### 参考
- http://socket.io/get-started/chat/
- https://github.com/socketio/socket.io-client-java
在 Rails 專案加入 Bootstrap 套件


<img src="https://farm6.staticflickr.com/5642/21205765206_ef484e9f41_o.png">

[Bootstrap](http://getbootstrap.com/) 是網站前端非常有名的框架之一，原始專案是由 twitter 內部的工程師， [Mark Otto](https://twitter.com/mdo) and [Jacob Thornton](https://twitter.com/fat)，所發起。可以讓工程師在短時間內，幫網站的套上漂漂亮亮的外觀。

## 使用工具

- rails 4.2.2
- [bootstrap-sass](https://github.com/twbs/bootstrap-sass) 3.3.5

這篇是以 4.2.2 產生出來的 rails 專案為例，使用 gem 安裝 bootstrap 3 的主題。

bootstrap-sass 的 [官方 repo](https://github.com/twbs/bootstrap-sass) 有各種不同使用方式的教學，這篇是就只清楚的寫出 rails 專案該怎麼使用，比較方便參考。

## 加入 Gem

第一步當然是要加入 bootstrap 的 gem 囉

``` ruby:Gemfile
(前略)
...
gem 'bootstrap-sass', '~> 3.3.5'
gem 'sass-rails', '>= 3.2'
...
(後略)
```

打開 Gemfile, 加的地方要確保這個 gem 在 development, production 的環境內都可以取用到。

sass-rails 這個 gem 在 `rails new` 產生的全新專案就會預先載入了，通常不需要再加一次，就已經在 Gemfile 的某處了。

``` bash
bundle install
```

執行 install, 安裝這一段所加上的 gems 。

安裝新的 gem 之後，重啟 `rails s` 。

## 加入 Stylesheet 相關資源

為了要在專案裡全域都可以使用，接下來這段必須加在 `app/assets/stylesheets/application.scss` 中。

### 修改副檔名

因為 rails 生出來的副檔名是 `application.css` ，必須要改成 `.scss` 這個副檔名才可以使用 sass 的檔案內容。

這時候在專案的根目錄執行以下指令，更換副檔名

``` bash
mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss
```

### 引入 Bootstrap

打開這個檔案之後，在所有註解的最末端空白的地方，加上以下的程式碼


``` scss:app/assets/stylesheets/application.scss
@import "bootstrap-sprockets"; // 這行一定要在 "bootstrap 前面
@import "bootstrap";
```

這裡的行末要記得 <strong style="color:red">加上分號</strong>

## 加入 JavaScript 相關資源

最後一步就是加入 JavaScript 的檔案了，因為這是網站的全域要使用的，就要加在 `app/assets/javascripts/application.js` 裡面

``` js:app/assets/javascripts/application.js
//= require jquery
//= require bootstrap-sprockets
```

第一行 jquery 在新產生的 rails 專案就已經存在了，所以通常是加第二行的 bootstrap-sprockets 即可

## 其他資源

- [Bootstrap CSS (官方資源)](http://getbootstrap.com/css/)

## 同步發布

- [熊屋](http://blog.kumaya.co/2015/09/08/rails-with-bootstrap/)
端末に落としたAndroidアプリのAPKファイルを抽出する


* 他の方が作ったアプリの中身がどうなってるか気になって色々調べました
* その最初のステップであるAPKファイルの抽出についてメモリます

# 前提
* adbを使える前提

# 端末を確認
* 接続された端末を確認します

```
[Hoge@Mac] ~
% adb devices        
List of devices attached
192.168.57.101:5555    device
```

# 対象アプリの置き場
* 抽出対象のアプリが置かれたディレクトリを見つけます
* 今回はContacts.apkファイルを対象にしています
* いちいち出たり入ったりするのはメンドイので、シェル経由でコマンドをぶっこんであげましょう

```
[Hoge@Mac] ~
% adb -s 192.168.57.101:5555 shell pm list packages -f | grep -i Contacts
package:/system/priv-app/Contacts/Contacts.apk=com.android.contacts
package:/system/priv-app/ContactsProvider/ContactsProvider.apk=com.android.providers.contacts
```

* /system/priv-app/Contacts/配下にあることがわかりました
* ちなみにGoogle Playなどから落としたアプリはだいたい/data/app配下にいます

# 対象アプリを抽出(おしまい)
* pullで抽出します

```
[Hoge@Mac] ~/workspace/android_security
% adb -s 192.168.57.101:5555 pull /system/priv-app/Contacts/Contacts.apk
6676 KB/s (3373448 bytes in 0.493s)
% ls -l
total 6592
-rw-r--r--  1 Hoge  staff  3373448  9  8 00:10 Contacts.apk
```

# おまけ - AndroidManifestの抽出
* 下記のリンクからapktoolをダウンロードします
	* http://ibotpeaches.github.io/Apktool/install/
* ダウンロードできたら後は抽出

```
[Hoge@Mac] ~/workspace/android_security
% /usr/local/bin/apktool d -f -s Contacts.apk 
[Hoge@Mac] ~/workspace/android_security
% ls -l
total 6592
drwxr-xr-x  7 Hoge  staff      238  9  8 00:18 Contacts/
-rw-r--r--  1 Hoge  staff  3373448  9  8 00:10 Contacts.apk
[Hoge@Mac] ~/workspace/android_security
% cd Contacts 
[Hoge@Mac] ~/workspace/android_security/Contacts
% ls -l
total 168
-rw-r--r--    1 Hoge  staff  20313  9  8 00:18 AndroidManifest.xml
-rw-r--r--    1 Hoge  staff  64960  9  8 00:18 apktool.yml
drwxr-xr-x    4 Hoge  staff    136  9  8 00:18 original/
drwxr-xr-x  105 Hoge  staff   3570  9  8 00:18 res/
drwxr-xr-x    3 Hoge  staff    102  9  8 00:18 unknown/
```
後で試してみたい、RecyclerViewの区切り線をViewTypeで指定できるライブラリ

おはようございます。

[bowyer-app](https://github.com/bowyer-app)です。

そろそろ技術的な記事を書こうと思います。

ListViewやGridViewのいいとこ取りをしたAndroidで主流になってきたRecyclerView

自由度が高く、カスタマイズできるのですが、区切り線は自分で実装しないといけないですね。
すごいめんどくさい。

# 解決方法
[RecyclerView.ItemDecoration](https://developer.android.com/intl/ja/reference/android/support/v7/widget/RecyclerView.ItemDecoration.html)を使う
>Adapterでセットする特定ビューへの描画やレイアウトの追加ができるものです

できればライブラリでやりたい。
positionを指定して区切り線をつけるライブラリは存在していた。

ただ、今後実装したいのはViewTypeを複数持ったRecyclerView

できればもっと自由度の高いのが欲しい。

見つけたライブラリはこちら

[RecyclerItemDecoration](https://github.com/magiepooh/RecyclerItemDecoration)

>・RecyclerViewのItemDecorationのライブラリ
・positionではなくViewTypeで指定できる
・表示順を変更したときにViewTypeで指定してるから修正がラク

こちらに詳しく実装方法が書かれてました。
[RecyclerViewのItemDecorationをViewTypeで指定できるライブラリ(RecyclerItemDecoration)を作ってみた。](http://qiita.com/magie-pooh/items/04e2700f5468f171073a)
>PositionではなくViewTypeで区切り線を指定すると、１行１行の順番や数が変わっても区切り線の実装部分には何も変更が起ません。
例えば、「４個表示しているものを８個にしてほしい」「表示位置を変えて欲しい」という要望があった場合にPositionで指定しているとその条件を書き換える必要がでてきます。(←サービス運用中の経験談ｗ)
このライブラリではそこは考慮せずに使用することができます。


あとで試してみようと思います。
実装したら[Github](https://github.com/bowyer-app)にアップします！
Eclipseをうまく設定しておくと、アプリアップデート時に証明書が変わってるって怒られないし、Facebookにもログインできる

何かというと、署名についてです。
Eclipseに署名をうまく設定すると、便利になります。

## 署名
Androidアプリ(apkファイル)を端末にインストールする場合、keystoreによる署名が必要になります。
マーケットへの公開も、署名がされたアプリでないとできません。

## インストールできない問題

「同一のアプリである」とみなされる条件はいくつかあります。
そのうちの一つが「署名が同じであること」です。
署名が違うと、同じアプリであってもアップデートインストールができません。

それぞれのマシンでビルドする場合(Eclipse等)、keystoreによる署名は自動的に行われます。
このkeystoreはそれぞれのマシンによって違います。

複数人で開発をしていると、自分のマシン以外でビルドしたアプリが端末に入ってたりすると思いますが、そのときは一度アンインストールして、インストールするという作業が必要になります。

## Facebookログインができない問題
Facebookログインを使用しているアプリの場合にかぎります。

Facebookログイン機能をFacebookSDKを使用して実現する場合、FacebookアプリにFacebookログインを使用するアプリのkeystoreのハッシュを登録する必要があります。
ここに登録されたハッシュを持つkeystoreによる署名が行われたアプリだけが、ログイン機能を使用することが可能になります。

個々のマシンで自動生成されるkeystoreのハッシュ全てを登録するのは、管理の面から考えても難しいと思われます。
ですが、ログインできないと機能が使えない、テストできない、等開発がなかなか進みません。

## 共有のkeystoreを作って、それでビルドできるようにすれば解決！
共有のkeystoreを作成し、それでビルドするようにそれぞれのマシンを設定すれば解決です。

・インストールできない問題
開発メンバーで使用するkeystoreが同じため、アップデートインストールできるようになります。

・Facebookログインができない問題
共有のkeystoreのハッシュ1つをFacebookアプリに登録することで、個々のマシンからビルドしたアプリでもログイン可能になります。

## Eclipseの設定方法
ウィンドウ > 設定 > Android > ビルド 
「カスタム・デバッグ・キーストア」に共有のkeystoreのパスを保存します。

これだけでOKです。

## そもそも
公式のIDEはAndroid Studioなので、そちらに移行するのもよいですね。
http://developer.android.com/intl/ja/tools/publishing/app-signing.html
にいろいろ載っています。
DjangoにおけるURLスキームの設計とテンプレートの作成


DjangoにおけるURLスキームの設計からテンプレートで表示する部分までをまとめた。

## URLスキームを正規表現で指定
```urls.py
from django.template import Context, loader
from polls.models import Test
from django.http import HttpResponse

def index(request):
    latest_test_list = Test.objects.all().order_by('-pub_date')[:5]
    t = loader.get_template('test/index.html')
    c = Context({
        'latest_test_list': latest_test_list,
    })
    return HttpResponse(t.render(c))
```
urls.pyにて正規表現を用いて、urlの設計を行う。

考え方として
Django は先頭のタプルから順に、リクエストされた URL とタプル内の正規表現が マッチするまでテスト行う。

マッチする正規表現が見つかると、Django は該当するタプルに指定されているコールバック関数を呼す。
コールバック関数には HttpRequest オブジェクトを第一引数として渡します。
さらに、正規表現内で「キャプチャした (captured)値をキーワード引数として渡す。
(タプルの三番目の要素である)オプションの辞書オブジェクトが指定されていれば、その内容も追加のキーワード引数として渡します。

## Templateを探してくるディレクトリの指定
上記URLスキームを指定するディレクトリをsetting.pyにて設定を行う

```setting.py
TEMPLATE_DIRS = (
    '/templateがあるディレクトリまでのパス/', # 自分の環境に合わせる必要あり。
)
```

## viewにてテンプレートと受け渡すコンテキストの設定を行う
上まででURLの設定は完了したが、URLに対応するメソッドが定義されていない。
それをview.pyにて設定を行う。

```
from django.shortcuts import render_to_response
from polls.models import Test

def index(request):
    latest_test_list = Test.objects.all().order_by('-pub_date')[:5]
    return render_to_response('test/index.html',
                              {'latest_test_list': latest_test_list})
```

## 最後にテンプレートの設定
最後にフロントエンド、デザインをテンプレートに指定して、
受け渡されたコンテキストを表示する。

```templete.html
{% if latest_test_list %}
    <ul>
    {% for test in latest_test_list %}
        <li><a href="/test/{{ test.id }}/">{{ test.text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>There is no test.</p>
{% endif %}
```
シェルスクリプトを試してみた



### シェルスクリプトとは
シェルスクリプトとは人間の仕事をシェルに代行させるための手順を書いたテキストファイル


### 例:hoge.sh
特定の作業ディレクトリに移動してnodeのサーバー起動まで行う

```sh:hoge.sh
cd /Users/Kento/work/practice/hoge
node app.js

```


### 実行方法
```
#シェルに引数として渡す
$ sh script

#実行権限付与
$ chmod +x script
#自身自体で実行
$ . script
unity > time > 分情報をfloat型に変換 > System.DateTime型変数の .Minutesと .Hourから計算

```txt:動作確認
Unity 5.1.2-f1 on MacOS X 10.8.5
```

1日の時刻を[0,1]の範囲におさめたい。

参考
http://nirasan.hatenablog.com/entry/2014/04/12/124239


```csharp
	public void ButtonClick() {
		System.DateTime dt = System.DateTime.Now;
		Debug.Log (dt.ToString ());

		float minutes = dt.Minute;
		float hours = dt.Hour;
		float totalMinutes = dt.Hour * 60f + minutes;
		float minOfTheday = (totalMinutes / (60f * 24f));

		Debug.Log (minutes.ToString ());
		Debug.Log (minOfTheday.ToString ());
	}
```

結果

```
9/8/2015 8:26:14 AM
26
0.1513889
```
Chrome Custom Tabsの実装を追ったときのメモ

## Chrome Custom Tabsとは？
* Google I/O 2015で発表されたChrome機能
* 2015/09/02のChrome 45バージョンアップから、Custom Tabsを用いてWebページの表示が可能になった。
    * [Android版「Chrome 45」、WebViewに代わる「Custom Tabs」でアプリからのページ読み込みが高速化](http://www.itmedia.co.jp/news/articles/1509/07/news054.html)

## 対象環境
* Android 4.0以降
 * (Google I/O 2015で発表があった)Android M以降である必要はない。
 * Android 5.0まで/Android 5.1以降でプロセス管理方法が異なるようなので注意。
* Chrome 45以降にアップデートすると使える

## ブラウジング方式比較
* 3が追加になった。
 1. WebViewを組み込む。
 2. 標準ブラウザ or Chromeを起動する。
 3. Chrome Custom Tabsにより連携する。
* 簡単にいえば、1,2のいいとこ取りをしようとしている。
  * 1はアプリ内コンポーネントなので、シームレスなページ遷移が実現できる。だがWebView特有の脆弱性が懸念。
  * 2のChromeのユーザビリティ/セキュリティを引き継ぐことが可能。ただアプリが分離されるため、元のアプリへ遷移を戻したい場合の使い勝手はよくない。

### 活用シーン
* 2,3は要調査。
 1. Webアプリのネイティブアプリ化
 2. Webフィルタリング
 3. ポイント・課金システム構築

## コード調査
### ライブラリ・サンプルコード
* [GoogleChrome/custom-tabs-client](https://github.com/GoogleChrome/custom-tabs-client)

### 連携方法
* AIDL連携によりChromeのActivityを呼び出す。
 * [CustomTabsConnectionService](https://chromium.googlesource.com/chromium/src.git/+/45.0.2454.87/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionService.java)がbind対象となる。
 * タブは[CustomTabActivity](https://chromium.googlesource.com/chromium/src.git/+/45.0.2454.87/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java)が起動対象となる。
* 以下のパッケージ名が連携対象となる。
 * com.android.chrome(Google Play版)
 * com.google.android.apps.chrome(プリイン版)
 * com.chrome.beta(Beta版)
 * com.chrome.dev(Developer版)

### セキュリティ検討事項
* 呼び出し元のチェック(偽のChromeでないか)はきちんとチェックしたほうがよさそう。
 * [KeepAliveService](https://github.com/GoogleChrome/custom-tabs-client/blob/master/shared/src/main/java/org/chromium/customtabsclient/shared/KeepAliveService.java)がBinderの検証を行わず素通ししているので、不正にKeepAliveの延長などが行われる可能性があるかもしれない。

## 参考
* [Chrome Custom Tabsを使ってWebViewを置き換える - TechBooster](http://techbooster.org/android/application/17097/)
* [Chrome Custom Tabsを使いこなす - TechBooster](http://techbooster.org/android/application/17119/)
技術英語 > This is what I've heard at second hand. (これは間接的に聞いたことです)

引用: 冠詞マスター教本 by 石井隆之さん

> This is what I've heard at second hand. (これは間接的に聞いたことです)

<hr>
http://ejje.weblio.jp/content/second+hand

> 1. 中古の
2. 間接の, また聞きの、受け売りの

<hr>

まったく関係ないのにふと思い出したもの

love at first sight (一目惚れ)

at XXX XXX
から思い出したのかも。
Spring+Gradleの開発環境を構築する（Mac）


Spring+Gradleの開発環境の構築手順をまとめました。

# インストールの流れ

- Javaがインストールされていない場合は先にインストールしておきます。
- STS（Spring Tool Suite)をインストールし、日本語化を行います。
- MavenではなくGradleを使用したいため、Gradleをインストールします。
- STSにGradleプラグインをインストールします。

# STSのインストール

STSはEclipseをSpring開発用にカスタマイズしたものです。

1. 以下のサイトよりSTSをダウンロードします。tar.gz形式のファイルがダウンロードされます（執筆時のバージョンは3.7.0）。
https://spring.io/tools/sts

1. ダウンロードしたファイルを解凍し、解凍したフォルダ内のSTSをアプリケーションフォルダへ移動します。


# 日本語化

Pleiadesプラグインを使用します。

1. 以下のサイトよりPleiadesプラグインをダウンロードします。zip形式のファイルがダウンロードされます（執筆時のバージョンは1.6.0）。
http://mergedoc.osdn.jp/

1. zip内のflugin,fueturesをSTSパッケージ内の「/Contents/Eclipse/」配下にコピーします。

1. STSパッケージ内の「/Contents/Eclipse/STS.ini」の最終行に以下の記述を追加します。

```text:STS.ini
-javaagent:../Eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
```

# Gradleのインストール

## GVMのインストール

Groovy系のインストール、バージョン管理ツールであるGVMをインストールします。

1. 以下のコマンドを実行します。

```console
curl -s get.gvmtool.net | bash
source "/Users/tasukujp/.gvm/bin/gvm-init.sh" 
```
## Gradleのインストール

Gradleをインストールします。

1. 以下のコマンドを実行します。

```console
gvm install gradle
```

# Gradle Pluginのインストール

1. STSのヘルプから[Eclipseマーケットプレイス]を開き、Gradleで検索、[Gradle IDE Pack]を選択してインストールします（執筆時のバージョンは3.6.x+0.17）。

## 9/17追記
Gradle IDE PackにはGradleが含まれるようです。
インストールしたGradleを使用するためには STSの[環境設定]を開き、[Gradle]の[Gradle ディストリビューション]に"/Users/*ユーザ名*/.gvm/gradle/current"を設定する必要があります。
スクリプト言語のプログラム(ruby, pythonなど)をコマンド(sh)として実行する

スクリプト言語のプログラム(ruby, pythonなど)を、shスクリプトから`exec ruby hoge.rb "$@"`として呼び出す場合に考慮すべき点をまとめました。 
(rubyコードの先頭行に`#!/usr/bin/ruby`書いて、インタプリタ起動するのとは違います)
shスクリプトがシンボリックリンクでも動作するように、スクリプト言語のあるパスを取得する必要があります。

## サンプル
コマンドラインで渡された引数を標準出力に表示するrubyプログラム(echo_args.rb)を、shスクリプト(echo_args)から実行します。
### ファイル構成
```
echo_args
|- bin/
 |  echo_args    # rubyプログラム実行スクリプト
|- lib/
 |  echo_args.rb # rubyスクリプト

```
### ソース
```ruby:echo_args.rb
ARGV.each {|s| puts s}
```

```shell-session:echo_args
#!/bin/sh

# 自身の絶対パスを取得する
ECHO_ARGS_FILE_DIRECTORY=$(cd ${0%/*} && pwd -P)

# 実行しているのはリンク？
## リンクの場合、readlinkの戻り値が変数に入る
ECHO_ARGS_SYMLINK=$(readlink "$0")
if [ -n "$ECHO_ARGS_SYMLINK" ]
then
  ECHO_ARGS_SYMLINK_DIRECTORY=$(dirname "$ECHO_ARGS_SYMLINK")
  ECHO_ARGS_FILE_DIRECTORY=$(cd $ECHO_ARGS_FILE_DIRECTORY &&
    cd $ECHO_ARGS_SYMLINK_DIRECTORY && pwd -P)
fi

# rubyプログラムのパスを取得
ECHO_ARGS_LIBRARY_DIRECTORY=$(cd $ECHO_ARGS_FILE_DIRECTORY/../lib && pwd -P)

# rubyプログラムを実行する
exec ruby "${ECHO_ARGS_LIBRARY_DIRECTORY}/echo_args.rb" "$@"

```
## ポイント
* 自身がリンクかどうかはreadlinkコマンドで判断する
* 実行されたリンクが相対パスだった場合を考慮、
自身のパスを取得して、そこを基点とする

### 実行例
shスクリプトが、非リンク、絶対/相対パス指定のリンク、いずれの場合も意図したとおりに動作しました。

```
% pwd
/Users/yampro/Dropbox/src/ruby/echo_args/bin
% ll
total 8
-rwxr-xr-x@ 1  echo_args*
★非リンクの場合(スクリプト実体)
% ./echo_args taniguchi marui
taniguchi
marui

% pwd
/Users/yampro/bin
% ll
lrwxr-xr-x   1 linka@ -> /Users/yampro/Dropbox/src/ruby/echo_args/bin/echo_args
lrwxr-xr-x   1 linkb@ -> ../Dropbox/src/ruby/echo_args/bin/echo_args
★linkaが絶対パス、linkbが相対パスのシンボリックリンク

★絶対パス指定したリンクの場合
% ./linka igarashi iguchi
igarashi
iguchi

★相対パス指定したリンクの場合
% ./linkb kondo makino
kondo
makino
```

## 参考にしたもの
* Homebrewの実行スクリプト

## メモ
* GNU版のreadlinkは`-f`でリンク元のフルパスは取得できるが、
  BSD版(Mac)にはないので使わなかった  
  (使えば、分岐なしにシンプルに書ける)
* `$0`: 実行しているコマンドの実行パス(相対)
* `$@`: シェルスクリプトに渡されたすべての引数
* `exec`: 子プロセスを生成せずに、コマンドを実行する
Homebrewで入れたMacVimで日本語インライン入力する


小ネタ。言及が見付からなかったので。

現在、MacVimはHomebrew Formulaが提供されており、簡単にインストールできます。

（以前はCaskしかなかった気がするが）

```bash
$ brew install MacVim
```

しかし、初期設定では日本語のインライン入力ができません。（変換前の文字列が表示されない）

これは、デフォルトで提供されている設定メニューから簡単に対策できます。

![img](https://i.imgur.com/LiRyPJM.png)

'Draw marked text inline'にチェックを入れると、インライン入力ができるようになりました。
Android - Fragmentメモ

## Fragment

- シンプルなアプリであっても、常にFragmentを使用した方がよい場合が多い。
- 後からActivityをFragmentに変更するのはややこしい。

### Support library vs built-in implementation

- あえてSupport libraryを使用すると後にアップデートが簡単。

### Support libraryを使用する利点
- 例えばfragment APIに新機能が追加された場合、support libraryのバージョンアップによりアプリのアップデートが可能。
- Support libraryの他の機能も利用可能。

### Support libraryを使用する欠点
- Support libraryを追加しなければならないこと。しかしながら、１MB以下なので気にする程ではない。

### Support libraryのFragment関連のクラス
- Fragment (android.support.v4.app.Fragment)
- FragmentActivity (android.support.v4.app.FragmentActivity)

## Android Studioで依存性を追加
- Support libraryを使用するためには、プロジェクトの依存性リストに登録されている必要がある。

1. `app/build.gradle`を開き、現在の依存性を確認する。
    注意:　`build.gradle`ファイルが２つある: プロジェクト全体用とアプリモジュール用。
2. File -> Project structure
![Screenshot 2015-09-07 11.19.48.png](https://qiita-image-store.s3.amazonaws.com/0/82804/fbef2831-8bd4-6063-6f93-a8a177f77d97.png)

3. 左側にあるApp moduleを選択
4. Dependenciesタブを選択
![Screenshot 2015-09-07 11.20.52.png](https://qiita-image-store.s3.amazonaws.com/0/82804/5ce888b0-3adb-4278-f924-f0c597e27c10.png)

5. +ボタンを押し、Library dependencyを選択
![Screenshot 2015-09-07 11.21.35.png](https://qiita-image-store.s3.amazonaws.com/0/82804/d94dd5f8-bf5e-e508-9db3-1de2d12cef89.png)

6. 依存性として追加したいものを選択し、OKをクリック
![Screenshot 2015-09-07 11.22.41.png](https://qiita-image-store.s3.amazonaws.com/0/82804/fe150e5f-fc96-bb23-60b5-97ce33d3c6d0.png)

# Github

- https://github.com/mnishiguchi/CriminalIntent2

# 参考資料

- https://www.bignerdranch.com/we-write/android-programming/
logrotate設定ファイルを書きだすためのpm2 logrotateコマンドの説明

#参考サイト
[pm2-logrotate](https://github.com/pm2-hive/pm2-logrotate)
[Displaying logs in real-time](http://pm2.keymetrics.io/docs/usage/log-management/)


##PM2のプラグインを使って設定ファイルを書き出してみる

```
pm2 install pm2-logrotate
```

root権限じゃないと実行できないので sudo で実行

```
sudo pm2 logrotate -u user
```

/etc/logrotate.d/pm2-user

といファイルが書き出される

最初フォルダが、root 以下になっていたのでユーザーのhomeフォルダに変更しておく
※rootで実行しているならそのままでいいと思う

```
/home/user/.pm2/pm2.log /home/user/.pm2/logs/*.log {
  rotate 12
  daily
  notifempty
  compress
  delaycompress
  create 0640 user user
}
```

多分これで出来てるはず…
SeleniumとPythonで定期実行処理を作ってみた


アニメネタ満載のブログしか書いたことがない僕が、
備忘録も兼ねて投稿します。

そもそも定期実行処理を作ろうとしたきっかけは、
とあるWebサイトで毎週、毎週、同じことをやってるけど、自動でやってくれない？
というお願いからです。

ということで

##目的
+ とあるWebサイト上で同じことを定期的に行う

##定期実行処理に利用するもの
+ CentOS release 6.7 (さくらのVPS)
+ Selenium IDE
+ Python
+ Python用Selenium
+ Firefox
+ Xvfb
+ crontab

##Selenium IDEでPython用テストケース作成(WindowsもしくはMac等)
1. Selenium IDEをFirefoxにインストール
2. Selenium IDEでWebサイト上の自動で行いたい手順を記録
3. テストケースをエクスポート => Python 2 / unittest / WebDriver
4. 保存したテストケースをCentOSにアップロード

##定期実行処理の環境構築(CentOS)

```bash:Pythonのパッケージ管理システムインストール
yum install python-pip
```

```bash:PythonのSeleniumインストール
pip install selenium
```

```bash:Firefoxインストール
yum install firefox
```

```bash:Xvfbインストール
yum install xorg-x11-server-Xvfb
```

```bash:Xvfb自動起動サービス作成
vi /etc/init.d/xvfb
```

```bash:/etc/init.d/xvfb
#!/bin/bash
#
# chkconfig: - 91 35
# description: Xvfb

# Source function library.
. /etc/init.d/functions

# Xvfb define
readonly XVFB=/usr/bin/Xvfb
readonly XVFB_STATUS=":1 -screen 0 1366x768x24"
readonly XVFB_PID_FILE=/var/run/xvfb.pid
readonly XVFB_SERVICE=$"Xvfb"

retval=0

start() {
    if [ -e ${XVFB_PID_FILE} ]; then
        action $"Starting ${XVFB_SERVICE}: " /bin/false
        echo "${XVFB_SERVICE} は既に起動しています。"
    else
        action $"Starting ${XVFB_SERVICE}: " /bin/true
        ${XVFB} ${XVFB_STATUS} > /dev/null 2>&1 &
        echo $! > ${XVFB_PID_FILE}
    fi
}

stop() {
    if [ -e ${XVFB_PID_FILE} ]; then
        action $"Stopping ${XVFB_SERVICE}: " /bin/true
        pid=`cat ${XVFB_PID_FILE}`
        test ! -z $pid && kill $pid && rm -f ${XVFB_PID_FILE}
    else
        action $"Stopping ${XVFB_SERVICE}: " /bin/false
        echo "${XVFB_SERVICE} は起動していません。"
    fi
}

status() {
    if [ -e ${XVFB_PID_FILE} ]; then
        echo "${XVFB_SERVICE} (pid `cat ${XVFB_PID_FILE}`) を実行中..."
    else
        echo "${XVFB_SERVICE} は起動していません。"
    fi
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        sleep 1
        start
        ;;
    status)
        status
        ;;
    *)
        echo $"Usage: $0 {start|stop|restart|status}"
        retval=1
esac

exit ${retval}
```

```bash:Xvfb自動起動サービス設定
chmod 755 /etc/init.d/xvfb
chkconfig --add xvfb
chkconfig --level 3 xvfb on
```

```bash:Xvfb再起動
/etc/init.d/xvfb restart
```

```bash:定期実行処理作成
crontab -e
```

```bash:cron
# cron実行結果確認用メールアドレス指定
MAILTO=xxxxx@gmail.com
# /home/kotanbo/test.py 部分はアップロードしたテストケースを指定
# 下記は日曜9時に定期実行
0 9 * * 0 export DISPLAY=localhost:1.0; python /home/kotanbo/test.py
```

```bash:cron再起動
/etc/init.d/crond restart
```

##参考
[Linux CUI環境でruby + selenium-webdriver](http://qiita.com/kamekichi0527/items/70ef040544e65faa4fe0)
[Xvfb 起動スクリプト](http://qiita.com/oggy8021/items/4e13944c8eea0743c6c0)
[centosでseleniumサーバー自動起動](http://hironoki.com/blog/2011/10/28/centos%E3%81%A7selenium%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E8%87%AA%E5%8B%95%E8%B5%B7%E5%8B%95/)

##追記

###2017/04/27

最新のfirefoxやseleniumでは恐らく上記内容で動作しません。
新しく環境構築した内容を記載したので、こちらもどうぞ。
　=> [CentOS7とSeleniumとPythonとChromeで定期実行処理を作ってみた](http://qiita.com/kotanbo/items/093fc71b71ee5f20baf0)
ぼくが（一部を）考えた最強のガチャシステム

**これは普通に一回のガチャにかかる時間を長くしたのとかわりなかったです！　もっとよい方法を考えてみたいと思います。**

> 新しい手法を開発しました。
> [僕が（ほとんどを考えた）公平なガチャシステム](http://qiita.com/yyu/items/90db09c57514758bd68c)

# はじめに

最近のソーシャルゲームは、インストールしたボーナスとして有料のガチャを限定で引くことができる機能を実装していることが多いが、これを逆手にとって、自分の欲しいカードなどが出るまでアプリケーションをインストールしてはアンインストールし、再びインストールするという、いわゆる「リセットマラソン（リセマラ）」が横行している。これを防ぐ方法として、チュートリアルを異常に長くするとか、一般のユーザーにとっての快いプレイを妨げるような対策が取られることもあるらしい。この文章では、この問題を解決する（たぶん）新しい方法について述べる。

# プロトコル

次のような方法で、ユーザーは初回のガチャなど無料のガチャを実行する。この計算量を利用したアクセスのコントロールはどこかのCTFで出題されたと友人から聞いて、それを使っている。

1. ユーザーがガチャを引こうとすると、アプリケーションがサーバーへそのことを通知する
2. サーバーは、無作為な文字列**A**と$n$バイトのデータ**B**と現在時刻$T_1$をデータベースへ書き込み、**A**と**B**をアプリケーションへ送信する
3. アプリケーションは**A**に任意の文字列を追加して、文字列**C**を生成する
4. アプリケーションは文字列**C**のハッシュ値を計算し、末尾の$n$バイトが**B**と一致するか判定する
    - 一致しなかった場合は（3）からやり直す
5. アプリケーションは**A**と**B**と**C**をサーバーへ送信する
6. サーバーは次のことを検証する
    - サーバー側のデータベースに**A**と**B**が記録されているか
    - 文字列**C**の中に**A**が含まれているか
    - 文字列**C**のハッシュ値を計算すると、末尾の$n$バイトが**B**と一致するか
7. サーバーは次の値を計算する
    - 現在時刻$T_2$を取得する
    - （1）から（6）までに掛った時間を計算する（$T = T_2 - T_1$）
    - あらかじめサーバー側に保存してある、他のユーザー達が（1）から（6）までにかかった平均時間$A$を取得する
    - $k = floor(T \div A)$
8. サーバーに保存してある平均時間$A$を$T$を使って更新
9. ユーザーは$k$回ガチャを引くことができる

このように、掛った時間を使うことで、高性能なコンピューターやハッシュ値を計算する専用のハードウェアによる攻撃を回避している。

# FAQ

## ハッシュ値のかわりにビットコインを使ったらどうか

運営は儲かりそうだが、バレたら叩かれるかもしれない。

## はじめから、ガチャを引くのにかかる時間を長くする処理をサーバーに実装すればいいのではないか

まったくその通りでした。でも、この計算量を利用したプロトコルは何かの役には立つんじゃないかと思っています。

# 質問など

1時間くらいで考えたやつなので、容易に問題がみつかると思う。何か弱点をみつけた場合は、気軽にコメントで指摘して欲しい。