OmniAICreator/Qiita-1.07M huggingface dataset:
ディレクトリやファイルの構造を表示させる tree コマンド

# tree コマンド

ファイルやディレクトリの構成をグラフィカルに見たい場合に使えるコマンドがあります。
実用的じゃない感じだけど、ツリー構造をテキストでサクッと書きたいときには使えるかも...

# オプション

|オプション|内容|
|:---|:---|
|-a|ドットファイルも出力対象とする|
|-d|ディレクトリのみ出力対象とする|
|-s|ファイル・ディレクトリのサイズを表示|
|-L|何階層目までディレクトリを降りるかを指定|

# 使い方例

## -L [number]

-L [number] をつけると現在の位置から表示させる階層の数を指定できる。
今回は2階層。

```shell-session:tree
[mugyuu@fuga mugyuu]$ tree -L 2
.
|-- mugyuu
|   |-- doc
|   |-- etc
|   |-- htdocs
|   |-- lib
|   |-- t
|   `-- view
`-- ios
    `--version

9 directories, 0 files
```

## -s

-sをつけるとファイル・ディレクトリのサイズが表示される

```shell-session:tree
[mugyuu@fuga mugyuu]$ tree -s -L 2
.
|-- [     4096]  mugyuu
|   |-- [     4096]  doc
|   |-- [     4096]  etc
|   |-- [     4096]  htdocs
|   |-- [     4096]  htdocs-admin
|   |-- [     4096]  lib
|   |-- [     4096]  t
|   |-- [     4096]  view-admin
|   `-- [     4096]  view
`-- [     4096]  ios
    `-- [     4096]  version
```

## [Filepath]

ファイルパスをつけると、そのパスを起点としてツリー構造が表示される

```shell-session:tree
[mugyuu@fuga mugyuu]$ tree -s ./mugyuu/lib/Mugyuu/Module/
./mugyuu/lib/Mugyuu/Module/
|-- [     4096]  Amenbo
|   `-- [     8722]  Pukapuka.pm
|-- [    20827]  Closet.pm
|-- [     4096]  Obaachan
|   `-- [     4096]  Ireba.pm
|   |   `-- [     5882]  Egao.pm
|   `-- [     2578]  Halloween.pm
|-- [     4096]  Event
|   `-- [     2779]  DeathMarch.pm
|-- [     4096]  Ojiichan
|   `-- [     6428]  NaitemoIidesuka.pm
|-- [     4906]  NotUtil
|   `-- [     4906]  NeverUtil
|   |   `-- [     5882]  Tsukaenee.pm

16 directories, 77 files
```

## -d

-dをつけるとディレクトリだけ表示することになる

```shell-session:tree
[mugyuu@fuga mugyuu]$ tree -s ./mugyuu/lib/Mugyuu/Module/ -d
./mugyuu/lib/Mugyuu/Module/
|-- [     4096]  Amenbo
|-- [     4096]  Obaachan
|-- [     4096]  Event
|-- [     4096]  Ojiichan
`-- [     4096]  NotUtil
    `-- [     4096]  NeverUtil

16 directories
```
サードパーティのCookbookの管理をBundlerみたいに管理する


berkshelfというツールを使う。

# 公式ドキュメント

http://berkshelf.com/

# install

```bash:
$ gem install berkshelf
```

# 使い方

Berksfileを作成（Bundlerで言うGemfile）

```Berksfile

site :opscode

cookbook 'yum'
```

インストールを実行（Bunlderで言う```bundle install```）

```bash:
$ berks install --path cookbooks
```

# berkshelfで管理しているCookbookを確認

```bash:
$ berks list
Cookbooks installed by your Berksfile:
  * yum (2.4.2)
```
DNSゾーン転送をslave側から強制実施

#DNSゾーン転送をslave側から強制実施

スレーブ側からゾーン転送を実施したい場合、以下のコマンドで実現可能。
(bind9環境にて)

```shell-session
rndc retransfer example.com
```

DNSサーバのIPアドレスの変更により、転送が失敗して即時再取得したいときとかに活用する。


*※rndc refreshでも行けるみたいだけど...未確認*
既存のモジュールを拡張する

Node.jsでオレオレUtilを作成したが、既存のnodeのUtilも使用している。
けれどこんな風には書きたくない。

```js
var util      = require('util');
var util_orig = require('./util'); // なんかいや
```

そんなとき、以下のように書けば既存のモジュールを拡張しひとまとめにできる。

```js:expand_util.js
var util = require('util');

var isJSON = function(str) {
  try {
    if (!str) {
      return false;
    }

    JSON.parse(str);
    return true;
  } catch (e) {
    return false;
  }
}

if (!('isJSON' in util)) // 既存APIを上書きしない
  util.isJSON = isJSON;

module.exports = util;
```

こんな風に使える。

```js
var util = require('./expand_util.js');

console.log(util.format("%s", "hogehoe"));           // 既存API
console.log(util.isJSON('{"hogehoge":"fugafuga"}')); // 拡張したAPI
```

ソースは以下で公開しています。
https://github.com/Peranikov/expand-util
Android 2系でテキスト入力時に上下に激しくスクロールされるバグ

# Androidのテキスト入力のバグ
スマートフォンサイトで、オーバレイしたモーダル上にログインフォームを設置したところ、
メールアドレス・パスワードの文字入力時に、一文字打つごとに画面が上下に激しくスクロールされて、
打っている文字がとても視認できないという問題が発生した。

```html
<div id="mask"></div>
<div id="Login">
   <input type="email">
   <input type="password">
</div>
<section class="content">
   //メインのコンテンツ
</section>
```

```css
/* 半透明の陰 */
#mask {
   position: fixed;
   z-index: 3000;
   opacity: 0.7;
   top: 0;
   left: 0;
   width: 100%;
   height: 100%;
   background: #000;
}
/* ログインフォーム */
#Login {
   position: absolute;
   z-index: 4000;
   width: 100%;
}
```

## bodyをスクロール不能にする
検索してもあまり出てこなかったのだけど、
（だいたい検索ワードがよく分からない。「上下に揺れる」とかで検索したら・・・）
少ないながらも言及していた記事ではAndroid 2系に対応するならばモーダル上でテキスト入力させるのは諦めろという感じの論調だった。

そんな中でも参考になりそうな記事がこれ。
https://github.com/scottjehl/Device-Bugs/issues/32
この中に書いてある以下の対処で、異常なスクロールが発生する問題は直りました。
> ### outline: none/overflow:hidden seen here
> When working with dialogs, setting this on the <body> when opening and removing it again when closing a dialog seemed to help.
> 訳：ダイアログ（モーダル）が開く時にこれ（outline:none と overflow: hidden）を&lt;body&gt;タグにセットして、閉じる時に削除してやれば、うまくいくっぽい。


異常にスクロールしまくるのが問題なら、そもそもスクロールしない状態にすればいいじゃないか、ということのようだ。

ただし、bodyがスクロールしなくなるってことは、
\#Login要素も position:absoluteではなくて、position:fixedにしないといけないだろう。
モーダルがページの中程に出現する仕様ならば。

##モーダル要素が画面より大きい場合
ところがモーダルの中身が多くて、どうしてもスクロールを発生させなければならない場合は、上記の方法は使えない。
そこで、モーダル展開時に以下のような処理を追加した。

```js
if(window.navigator.userAgent.toLowerCase().indexOf('android 2') != -1){
   $("#mask").css({'position':'absolute','height':$('body').height()+'px'});
}
```

先の記事でも書かれているが、position:fixedが鬼門らしい。

##所感
かなり以前にも同じバグにつまづいた経験があるが、
どう対処したのか忘れてしまっていたので、解決に戸惑った。
記事にしてしまうとかなりあっけないが、実際にこのおかげで数時間も足止めを食らった。

Android 2はいつまでシェアを食っているのだろうか。
#elasticsearch #fluentd　本番環境でリリースするときのネットワークの設定

基本的なことですが、自分のために残しておきますレベルです。

本番環境ではiptableの設定やら、firewallの設定やらがあるので、

WEBサーバ
↓
fluentdサーバ（aggregate＋解析サーバ）
↓
ログ蓄積サーバ（elasticsearch、redis）

なんて構成にして、設定して、いざ！
とか思ったら、さっぱり動かないことがあるので、
事前にネットワークの疎通はみておいたほうが、yak shavingだと思うことがなくていいかもしれません。

## WEBサーバ(fowarder)
fluent-agent-liteをいれました。

設定ファイルで指定したポート番号、ここでは「24200」ですが
> 
PRIMARY_SERVER="192.168.1.6:24200"

これをfluentdサーバ（aggregate＋解析サーバ）のFirewall、iptablesで許可してあげなくてはいけません。



## fluentdサーバ（aggregate＋解析サーバ）

上記のWEBサーバ（fowarder）からの通信ポートをFirewall、iptablesで許可してあげなくてはいけません。
> 
iptables
-A INPUT -p tcp -m state --state NEW -m tcp --dport 24200 -j ACCEPT


## ログ蓄積サーバ（elasticsearch、redis、MySQL）

elasticsearchであれば9200を許可
redisであれば6379
MySQLであれば3306を許可
※上記はデフォルトなので、動作させているポートにあわせてくださいね。

>
iptables
-A INPUT -p tcp -m state --state NEW -m tcp --dport 9200 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 6379 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3308 -j ACCEPT


ごっつ基本的なことですが、わりとうまくいかない！なんで！とかなると萎えるので最初に疎通しておくと吉。

## ディレクトリのパーミッションなども気をつけて

fluentdが動作しているユーザーが書き込みできるかとかも確認しましょう。
#elasticsearch　CentOSでインストール、データとインデックスをみよう

elasticsearchはじめました。
とても初心者的なステップバイステップをかいているので、達人さんには不要な情報です。

Macでやる場合も、CentOSでやる場合もtar.gzを解凍して、ディレクトリに配置して起動するのみです。
CentOSでやる場合は、デーモン化して起動する方法があったのでそうしています。

## CentOSのバージョン
CentOS release 6.3 (Final)

## elaticsearchのインストール
0.90.6でした。

```

wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.90.6.tar.gz

tar -xf elasticsearch.tar.gz
rm elasticsearch.tar.gz
mv elasticsearch-* elasticsearch
sudo mv elasticsearch /usr/local/share
```
##  デーモン化して起動する 

```

curl -L http://github.com/elasticsearch/elasticsearch-servicewrapper/tarball/master | tar -xz
mv *servicewrapper*/service /usr/local/share/elasticsearch/bin/
rm -Rf *servicewrapper*
sudo /usr/local/share/elasticsearch/bin/service/elasticsearch install

sudo /etc/init.d/elasticsearch start
```

* デーモン化して起動する方法
https://gist.github.com/rajraj/1556657

## elasticsearchのプラグインもインストールしておきましょう

```
/usr/local/share/elasticsearch/bin/plugin -install mobz/elasticsearch-head
```

以下をアクセスすると、状態がみれます。

http://hostname:9200/_plugin/head/

## データをいれてみる

```
 curl -XPUT http://localhost:9200/bohebohe/test/1 -d '
  {
  "title":"bohebohe",
  "contents":"Hello World"
  }'

{"ok":true,"_index":"bohebohe","_type":"test","_id":"1","_version":1}

```
#### データのなかみ

logstash-2013.11.14はfluentdからアクセスログをいれてみました。

```
$ tree -d
.
└── elasticsearch
    └── nodes
        └── 0
            ├── _state
            └── indices
                ├── bohebohe
                │   ├── 0
                │   │   ├── _state
                │   │   ├── index
                │   │   └── translog
                │   ├── 1
                │   │   ├── _state
                │   │   ├── index
                │   │   └── translog
                │   ├── 2
                │   │   ├── _state
                │   │   ├── index
                │   │   └── translog
                │   ├── 3
                │   │   ├── _state
                │   │   ├── index
                │   │   └── translog
                │   ├── 4
                │   │   ├── _state
                │   │   ├── index
                │   │   └── translog
                │   └── _state
                └── logstash-2013.11.14
                    ├── 0
                    │   ├── _state
                    │   ├── index
                    │   └── translog
                    ├── 1
                    │   ├── _state
                    │   ├── index
                    │   └── translog
                    ├── 2
                    │   ├── _state
                    │   ├── index
                    │   └── translog
                    ├── 3
                    │   ├── _state
                    │   ├── index
                    │   └── translog
                    ├── 4
                    │   ├── _state
                    │   ├── index
                    │   └── translog
                    └── _state

49 directories
```

## TODO

* デーモンで9200で起動しているのですが、複数起動させたいのでその方法について
* スキーマフリーといえども、スキーマの設定はしたほうがいいというので、その設定方法について


ステップ1くらいですかね。とりあえず残しておきます。
deployする版と本番環境の版の差分をチェックする（git diff ワンライナー）

# やりたいこと

本番環境へdeployする際に「何が変るのか」はもちろん把握しているはずなのですが、意図していない commit が本当に混じっていないよね、という確認したくなりませんか？
また、アプリケーションコードをdeployする前にDBのmigrationを済ませておく必要がある場合、そのmigrationファイルを漏れなく列挙したい時もあると思います。そんな時のワンライナー。

## 前提環境

* gitで版数管理している
* capistrano で deploy している
* 本番環境にssh接続できる

> REVISIONファイルをチェックするためです。他のdeployツールでも同じようなファイルが配置されるのであれば、読み替えて応用できるはずです。

## 手順

#### 変更コードをじっくり確認する

```zsh
$ git diff `ssh user@app.server cat /app_path/current/REVISION`
```

#### 変更されるファイルを列挙する

```zsh
$ git diff --name-only `ssh user@app.server cat /path/of/app/current/REVISION`
```

#### migration ファイルを列挙する

```zsh
$ git diff --name-only `ssh user@app.server cat /app_path/current/REVISION` db/migrate/
```

migrationファイルだけ先に up したい場合はこんな感じです。

```zsh
$ git diff --name-only `ssh user@app.server cat /app_path/current/REVISION` db/migrate/ | xargs -I migrate_files scp migrate_files user@app.server:/app_path/current/db/migrate/
```
BeagleBoneBlackでsshログインが出来ない時の解決法

BeagleBoneBlackでどうもsshログインが出来る個体と出来ないものがある模様。
解決するには、シリアルケーブルが必要ですが解決しとけば楽にsshからでも繋がるので。
以下
rm /etc/dropbear/dropbear_rsa_host_key
rm /etc/dropbear/dropbear_dss_host_key
dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key
dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key
dropbear restart

で入れました。一度作ればあとは何度でも入れますね。

AngstromはVersion2012.12 -Kernel 3.8.13
u-boot は2013.04-dirty (Jun 19 2013 - 09:57:14)

でした。
Qiitaのトップページ(ログアウト状態)って何で中身見せないの？

タイトルの通りなんですが、Qiitaを人に紹介する際、ログアウト状態だとトップページから中身が推察できないことから、説明に苦労しています。トップページのURLを紹介しても「なんじゃこりゃ？」という反応を受けます。

```
Qiitaは、プログラマのための
技術情報共有サービスです。
```

だけだとわかりにくいのではないでしょうか。

- 最近話題の投稿一覧
- 新着投稿一覧
- 検索フォーム

あたりは、ログアウト状態のユーザーに対しても見せてよいと思うのですが、何か意図があってこうしているのでしょうか。
rauthでTwitterAPIにアクセスするのが簡単すぎて、僕にも彼女が…


TwitterAPIにアクセスする必要がでたため、試しに自前で実装してみたところ、まあ…なんというか…面倒だった。
で、ライブラリを探したところ、[rauth](https://github.com/litl/rauth)というライブラリが見つかったので試してみた。

OAuthライブラリ(not Twitterライブラリ)なので、Twitter以外のAPIでもOAuth認証であれば使える。
また、[Requests](http://www.python-requests.org/en/latest/)に依存しており、HTTPリクエスト部のコードが綺麗に書けるのもいい感じ。

自分のタイムラインに'rauth'と呟くサンプルは以下。「ね、簡単でしょう?」

```python:rauth_sample
import rauth

# access_token/access_token_secretを取得している前提
session = rauth.OAuth1Session(
    "consumer_key",
    "consumer_secret",
    "access_token",
    "access_token_secret")

# baseURLについてはsessionにセットする方法があるが省略
session.post(
    'https://api.twitter.com/1.1/statuses/update.json',
    data={'status': 'rauth'})
```

上記のサンプルでは、事前にaccess_token/access_token_secretを取得している前提だが、READMEを見る限り、取得するのもそれほど難しくなさそう。これもそのうち試してみよう。

ちなみに彼女はできなかった。

# 追記

OAuth1ServiceをOAuth1SessionにセットすることでAPIのbaseURLは省略可能。

```python:rauth_sample_set_service
twitter = rauth.OAuth1Service(
    name='twitter',
    consumer_key='consumer_key',
    consumer_secret='consumer_secret',
    request_token_url='https://api.twitter.com/oauth/request_token',
    access_token_url='https://api.twitter.com/oauth/access_token',
    authorize_url='https://api.twitter.com/oauth/authorize',
    base_url='https://api.twitter.com/1.1/')

session = rauth.OAuth1Session(
    consumer_key='consumer_key',
    consumer_secret='consumer_secret',
    access_token='access_token',
    access_token_secret='access_token_secret',
    service=twitter)

# ServiceにセットしたbaseURLは省略可能
res = session.get(
    url='statuses/home_timeline.json',
    params={'count': 10})
print(res.json())
```
Python3.4からpipが標準インストーラに！？


Rubyにはgem、Node.jsにはnpmがあるが、元々Pythonにはパッケージマネージャは無かった。

それがいつの頃からか、easy_installなるものが現れ、さらにpipが作られた。今ではpipがほぼデファクトとなりつつあるけど、後付でインストールするパッケージの一つという位置づけは変わらない。箱を開けたら直ぐに使えるという意味で "Batteries included" を標榜しているPythonとしてはちょっと寂しい。

その状況をなんとかしようということで[PEP-453 Explicit bootstrapping of pip in Python installations](http://www.python.org/dev/peps/pep-0453/)が提案されている。「pipをPython 2.7, 3.3 及び3.4の公式推奨デフォルトインストーラとしよう」という提案で、3.4から実際に標準搭載されるらしい。Pythonをインストールするとpipコマンドが同時にインストールされるのかと思いきやちょっと違うっぽいのでここにメモ。

まず、3.4で追加されるのが "ensurepip"というモジュール。でこれが何をするかというと、まぁ名前のとおりなのだが「pipが入っている事を確実にする」（変な日本語だな...）。

具体的には

```
$ python3.4 -m ensurepip
```

とすると

 - pipがインストールされていない場合はpipをインストール
 - 既にインストールされている場合はなにもしない

という挙動らしい。そして既にインストールされていてもpython3.4に付いてくるものの方が新しくてそれに置き換えたい場合は

```
$ python3.4 -m ensurepip --upgrade
```

とする。ちなみにこのpipのインストールの時にネットワークアクセスはない。つまり、Pythonの標準パッケージにpipを同梱して配る。でもデフォルトではインストールせずに上記のコマンドを叩くと必要に応じてインストールすると。なんという奥ゆかしさwww

せっかくなので試してみようと思って最新の3.4.0a4で確認してみたが、"No module named ensurepip"とのこと orz..

[PEP-429 Python 3.4 Release Schedule](http://www.python.org/dev/peps/pep-0429/)によるとbeta1が11/24。そこにはきっと入るだろうが、そこまではお預けってことかな。
Javaでラウンドロビン・スケジューリング


今回はラウンドロビン・スケジューリングについてです。
Wikipedia様によるとプロセスに関する単純なスケジューリングアルゴリズムの一種だそうです。

正直この分野はまともに勉強したことがないので良くわかりません。。。

ラウンドロビンと聞くとLoadbalancerの分散方式しか思い出しません。
そういえばAWSのELBはラウンドロビン＋コネクション数を監視しているようです。
[[AWSマイスターシリーズ]Amazon Elastic Load Balancing (ELB)](http://www.slideshare.net/AmazonWebServicesJapan/20130612-aws-meisterregenerateelbpublic)
※なんか順番に振られないなーと思ったら上記事情ですね。

話それましたが、

#ラウンドロビン・スケジューリング

について書いていきます。
正直、悩むものでもなかったため、今回もコードとコメントで書いていきます。
[問題見た方が早いかも](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_3_B)

#解法
```java

package aoj;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;

public class RoundRobinScheduling {

	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] firstRow = br.readLine().split("\\s");

		// 要素数
		int elementNum = Integer.parseInt(firstRow[0]);
		// 減算する値
		int quantum = Integer.parseInt(firstRow[1]);

		// 先に入れた物を先に抜き出す（いわゆるFIFO
		// ※前回stack,dequeueでやったので今回はqueueで（一番適切そうってのもありますが）
		Queue<Process> que = new LinkedList<Process>();
		for (int i = 0; i < elementNum; i++) {
			String[] stringArray = br.readLine().split("\\s");
			// （p1 150）のような形式でstringArrayに渡されるため、
			// p1（プロセス名）,150（処理に掛かる時間）をインスタンスとして管理する
			// ※もっとスマートな方法あるかも。。。
			Process process = new Process(stringArray[0],
					Integer.parseInt(stringArray[1]));
			que.offer(process);
		}

		// 処理合計時間
		int resultTime = 0;
		while (que.size() > 0) {
			Process process = que.poll();
			// 合計処理時間として加算
			resultTime += quantum;
			// 処理時間を減算する
			if ((process.processTime = process.processTime - quantum) > 0) {
				// 減算した結果、処理に必要な時間に満たない場合は
				// 最後尾に待ちタスクとして保管する
				que.offer(process);
				continue; // else嫌いなので
			}
			// processTimeが(-20)などになっていれば、その分の時間を
			// 処理合計時間へ加算する
			resultTime += process.processTime;
			// 処理に必要な時間を満たした場合はプロセス名と、ここまでにかかっている
			// 全体の時間を出力する
			System.out.println(process.name + " " + resultTime);
		}

	}

	/**
	 * Process管理クラス
	 */
	private final static class Process {
		// めんどいからpublicに。。。
		public String name = null;
		public int processTime = 0;

		public Process(String name, int processTime) {
			this.name = name;
			this.processTime = processTime;
		}
	}
}

```
モジュールほげほげ補足

本日の社内勉強会のモジュールほげほげの内容補足、というか真面目バージョン。

微妙に修正した資料はこちら。

<a href='https://speakerdeck.com/mamoida/shobon-kun-no-module-hogehoge' target='_blank'>shobon-kun-no-module-hogehoge // Speaker Deck</a>


## 対象を絞ったエクスポート

もし対象が特定の環境に依存しているものだったら、素直に記述したほうが可読性はますかもしれない。

```js
(function(root,CS){
  var foo = 'x';

  CS.Util = {
    some: function(){
      console.log(foo);
    }
  };

})(this,this.CS = this.CS || {});
```

```js
(function(win,CS){
  var foo = 'x';

  CS.Util = {
    some: function(){
      console.log(foo);
    }
  };

})(window,window.CS = window.CS || {});

CS.Util.some();
```

## umd

ユニバーサルなモジュールパターンは、<a href='https://github.com/umdjs/umd' target='_blank'>umd</a>プロジェクトで発表されていて、とても参考になる。

## underscore.js

資料のなかではunderscoreを読み込んでいるけど、本家のunderscoreはAMDの対応は削除されてしまっている。<a href='https://github.com/amdjs/underscore' target='_blank'>こちら</a>のバージョンはAMDに対応していたり、<a href='https://github.com/lodash/lodash/blob/master/dist/lodash.js' target='_blank'>lodash</a>も対応しているので、AMDの対応させたい場合はこれらを使うといいかも。

## ユニバーサルなモジュールにするべきか

個人的には、最近ではJavaScriptにやさしいビルドツールなどもでてきたので、必ずしも1ファイルですべてに対応しなくても、環境に合わせてビルドするとかでもいい時もあると思う。

## reveal.js

<a href='https://github.com/hakimel/reveal.js' target='_blank'>reveal.js</a>を使わせて頂いて、すごく便利だったけど、PDFにプリントするときの調整が大変だった。(てか、ほとんどデフォルトだけど)
有線接続でも AirDrop したい

AirDrop [対応機種](http://support.apple.com/kb/HT4783?viewlocale=ja_JP)でなくても AirDrop を使えるようにするというコマンドがありますが、これは有線接続でも AirDrop が可能になるコマンドでもあります。というかそっちが目的みたいです。

```bash
$ defaults write com.apple.NetworkBrowser BrowseAllInterfaces 1
```

OSの再起動後に有効になります。
【Android】SearchViewの中に含まれているViewをカスタマイズする方法

今回SearchViewを使用して検索ボックスを実装することにしたんだけど、いざアイコンやEditTextの入力時の色を変更しようとした時に色々試したので紹介する。

# 試したこと
- SearchViewにViewを取得できるメソッド or 変更を加えるメソッドがないかどうか
  - そんなもんなかった
- Themeを上書きしてSearchViewのとこ書き換えられないかどうか
  - アクセスできるプロパティじゃなかった悲しい

# 最終的にやったこと
結局色々検索した結果、SearchViewを拡張して直接Viewを取ってこれるようにする方法にした

## 実装
```SearchView.java
public class SearchView extends android.widget.SearchView {
	private ImageView searchButton;
	private AutoCompleteTextView queryText;
	private ImageView closeButton;
	private ImageView searchGoButton;
	private ImageView voiceButton;
	private ImageView searchHintIcon;

	public SearchView(Context context) {
		super(context);
		init();
	}

	public SearchView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}
	
	private void init() {
		searchButton = (ImageView) findViewById(getIdentifier("android:id/search_button"));
		queryText = (AutoCompleteTextView) findViewById(getIdentifier("android:id/search_src_text"));
		closeButton = (ImageView) findViewById(getIdentifier("android:id/search_close_btn"));
		searchGoButton = (ImageView) findViewById(getIdentifier("android:id/search_go_btn"));
		voiceButton = (ImageView) findViewById(getIdentifier("android:id/voiceButton"));
		searchHintIcon = (ImageView) findViewById(getIdentifier("android:id/search_mag_icon"));
	}
	
	private int getIdentifier(String resourceId) {
		return getContext().getResources().getIdentifier(resourceId, null, null);
	}
	
	public ImageView getSearchButton() {
		return searchButton;
	}
	
	public AutoCompleteTextView getQueryText() {
		return queryText;
	}
	
	public ImageView getCloseButton() {
		return closeButton;
	}
	
	public ImageView getSearchGoButton() {
		return searchGoButton;
	}
	
	public ImageView getVoiceButton() {
		return voiceButton;
	}
	
	public ImageView getSearchHintIcon() {
		return searchHintIcon;
	}
}
```

んでもってこんな感じにセットする

```MainActivity.java
public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		SearchView search = (SearchView) findViewById(R.id.main_search);
		search.getQueryText().setTextColor(getResources().getColor(android.R.color.holo_orange_dark));
		search.getCloseButton().setImageResource(android.R.drawable.ic_delete);
		search.getSearchHintIcon().setImageResource(android.R.drawable.ic_menu_camera);
	}
}
```

結果はこんな感じ

通常
![device-2013-11-12-004154.png](https://qiita-image-store.s3.amazonaws.com/0/20629/e00fb9ed-3c89-cd2f-f2ad-848f18a07a48.png)

上のSearchViewを実装した後
![device-2013-11-12-235257.png](https://qiita-image-store.s3.amazonaws.com/0/20629/cbb76609-af8e-4baa-e6a4-60c1d4a75f5e.png)

これに加えてXML経由からTextSizeをセットできるようにしたけど今回は割愛。

SearchViewクラスの`private AutoCompleteTextView queryText`の行の型はSearchAutoCompleteなんだけど、アクセスできない型だったのでEditTextにした。
GitHub で https で clone しようとしても ssh にする

GitHub を見ていて clone したいなーと思って、 url をコピーしてそのまま clone しようとしたけれど
よく見たら private なので認証を求められてしまったことが。

@uasi さんの [Git ライフを快適にする知られざるコマンドたち](http://sssslide.com/speakerdeck.com/uasi/git-raihuwokuai-shi-nisuruzhi-rarezarukomandotati)
で pushInsteadOf を知りましたが、 clone でもできないかなーと思ったらできたのでメモ。

```
[url "git@github.com:"]
  insteadOf = https://github.com/
```

 pushInstedOf を insteadOf にしただけ。
railsでGoogle Analyticsを使う方法

## Gemfileに'google-analytics-rails'を追加
``` ruby
gem 'google-analytics-rails'
```

## GA.trackerを初期化
google analyticsに登録して"UA-xxxxxx-x"みたいなのが見れたら、以下のように初期化する。

``` ruby 
# config/initializers/google_analytics.rb
GA.tracker = "UA-xxxxxx-x"
```

## headでanalytics_init
``` haml
%head
  = analytics_init if GA.tracker != GoogleAnalytics::PLACEHOLDER_TRACKER
```
初期化されてる場合だけ有効にできる。

なんとこれだけで使えるようになる。
SublimeText2にPackageControlをインストールする


一度やってしまうとやらないし、必要になる度に調べている気がするので書いておく。

## インストール方法
SublimeText2を起動してコンソールを表示する。
出し方は以下のとおり。

* `View` > `Show Console`
* `Ctrl` + `` ` ``

コンソールが表示されたら以下のコードをコピペして`Enter`する。

```
import urllib2,os; pf='Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler( ))); open( os.path.join( ipp, pf), 'wb' ).write( urllib2.urlopen( 'http://sublime.wbond.net/' +pf.replace( ' ','%20' )).read()); print( 'Please restart Sublime Text to finish installation')
```
![スクリーンショット 2013-11-12 20.51.50.png](https://qiita-image-store.s3.amazonaws.com/0/8496/a089f0c7-c96e-9e7b-8868-3256a061ca6f.png "スクリーンショット 2013-11-12 20.51.50.png")

再起動後に `Sublime Text 2` > `Preference` > `Package Control` が表示されていればインストール完了。

## Package Controlを使う

`Ctrl` + `Shift` + `p`でパレットを起動して`install`と入力して絞り込み、`Package Control:Install Package`を選択して`Enter`する。

![スクリーンショット 2013-11-12 21.18.19.png](https://qiita-image-store.s3.amazonaws.com/0/8496/c9779a1c-add0-4d99-3d3b-0e641402560c.png "スクリーンショット 2013-11-12 21.18.19.png")

パッケージ一覧が表示されるので同様に絞り込みを行い、任意のパッケージのインストールをすることができる。

例えば`rails`に関するパッケージをインストールしたかったら以下のようにすればOK。

![スクリーンショット 2013-11-12 21.21.02.png](https://qiita-image-store.s3.amazonaws.com/0/8496/c28608e3-03aa-a0df-beb4-0082ba353b50.png "スクリーンショット 2013-11-12 21.21.02.png")

以上
標準インストールのnginxでconfigファイルだけでrandomっぽい事をする方法

## nginxでrandom使いたい事って無いですか？
僕の場合は、表面上のURLはそのままにrewriteでAB testしたいという要件があり、nginxでrandomを使えないか調べてみました。

## 標準じゃないModuleならある
標準じゃないModuleなら、randomを使う方法があります。
http://wiki.nginx.org/HttpSetMiscModule#set_random

素直にこれを使えばいいのですが、できればyumとかのパッケージ管理から外れるのが嫌で標準のnginxでconfigで頑張れないか試してみました

## 標準インストールのnginxでrandomっぽい事をするconfig
いろいろ調べてみましたが、どうしても発見できず。
標準のModuleだと、randomって無いんですよね。（「おぃおぃ！あるよ！」という突っ込み歓迎）

そこで発想を変えて「configで取得できる値でrandomっぽい値を取得できるものをベースにしたら行けるんじゃないか」と思い、探してみたところ。。。

ありました。クライアント側のIPアドレス。

これをうまく使ってゴニョゴニョすればrandomっぽい感じに出来る（はず）。しかも、クライアントのIPが変わらない間は同じ値を生成できる。まさに僕の要件（AB test）にはピッタリでした。

```nginx
set $ab "a";
if ($http_remote_addr ~* [0|2|4|6|8]$) {
    set $ab "b";
}
```

これで50%の確率でaとbに振り分ける事が出来ます。
if文の所を工夫すればもう少し幅広い用途に使えそうです。

＊もっとうまい方法を知ってるor思いついた方いたらぜひ教えて下さい（＞＜）
Emacs LispのRainbow Delimitersで,対応する括弧を虹色で示そう.

Googleで,
ゆゆ式 lisp S式
みたいなワードで検索してたら,こんな記事を見つけた.
[Scheme書くためにVimの環境を整えたメモ](http://pastak.hatenablog.com/entry/2013/10/30/235525)
えー,何々,

> Vimにはオプションでlisp_rainbowというのがあって、これを有効化すると、
> Lispを書く時に大量に出てくる( )の色を対応する物毎に変えてくれるから、対応関係の見分けが付きやすくなる。

初めて知った.これは便利そう.
でもVimなどいらない.EvilすらあるEmacs,VimにできてEmacsに出来ないことなどない!
というわけで探しました.10秒で見つかりました.

[Rainbow Delimiters](http://www.emacswiki.org/emacs/RainbowDelimiters)
package.elで普通に導入出来ます.

スクリーンショット.
![lisp-mode.png](https://qiita-image-store.s3.amazonaws.com/0/15080/1de352e5-3d08-a5a7-c3a9-0bdc45ad311a.png)
![d-mode.png](https://qiita-image-store.s3.amazonaws.com/0/15080/bf68deaa-3a3a-0f87-d298-e317f9eb7851.png)


なお,私のEmacsの設定ファイルの集合体は,githubに上げてあります.
[github](https://github.com/ncaq/.emacs.d)
tarball を展開しつつ scp したい

tarball が大きすぎると，とりあえず scp して展開するみたいなフローが使えません（2 倍の容量が必要になるため）

展開しながら scp みたいなことができると便利そうです

    cat hoge.tar | ssh -c arcfour256 example.com "tar xv -C /tmp/hoge/fuga"

みたいにすると良い感じです

便利！！
nodeの関数をbashシェルで使えるようにする。

# Nodeの関数をbashターミナルから使いたい

いちいち、nodeの対話環境を使うのも面倒な話なので、直接呼べると便利
node の関数とモジュールは幸い2階層なので、以下のようにすることでシェルスクリプトでパイプ経由で使えるようになる。

##前準備
node関数をコマンドして使う

```bash:sample1
bash> git clone https://gist.github.com/f5a6fb560dc357835122.git
bash> chmod +x node2bash.js
bash>  ln -s node2bash.js /usr/local/bin/encodeURIComponent
bash>  ln -s node2bash.js /usr/local/bin/decodeURIComponent
bash>  ln -s node2bash.js /usr/local/bin/querystring.parse
```

## 使用例
bash から uri エンコードする

```bash:sample2
bash>  encodeURIComponent 'aaa=1&bb=あああ'
aaa%3D1%26bb%3D%E3%81%82%E3%81%82%E3%81%82
```

###パイプ経由でも

```bash:sample3
bash > encodeURIComponent 'aaa=1&bb=あああ' | decodeURIComponent
aaa=1&bb=あああ
```

### 標準入出力を使ってパイプパイプ
bash から uri エンコードしたのをデコードしたのをQueryString分割して、JSONにする。

```bash
bash> echo  'aaa=1&bb=あああ'  | encodeURIComponent| decodeURIComponent | querystring.parse
{ aaa: '1', bb: 'あああ' } 
```

##以下のコードをベースに使います。
```js:node2bash.js
#!/usr/bin/env node
/***
 * author takuya_1st
 * Released under  GPL Licenses.
 * Date: 2013-11-21 2:06
 */
var fs   = require('fs')
var path = require('path');
var name = process.argv[1];
var str  = process.argv[2];

//モジュールの処理
if( name.match(/\./) ){
	module_name = path.basename( name.split(/\./).shift()) ;
	name = name.split(/\./).pop();
	if( global[module_name] ){
	  module = global[module_name];
	}else{
	  module = require(module_name);
	}
}else {
	name =  path.basename(name);
	module = global;
}
//コマンドシェルで実行したい関数
var func = module[name];



if(str) {
    if(fs.existsSync(str)){
		str = fs.readFileSync(str);
	}
	str  = func(str);
	console.log(str);
}else{
	process.stdin.resume();
	process.stdin.setEncoding('utf8');

	var lines = []
		// 標準入力がくると発生するイベント
		process.stdin.on('data', function (chunk) {

				lines.push(chunk.trim())
				});
	// EOFがくると発生するイベント
	process.stdin.on('end', function () {
			lines = lines.join("\n")
			console.log( func(lines)  )
			});

}
```

ぶっちゃけた話、nodeコマンドの対話シェルやnodeでスクリプト書くよりbashでコマンドで組み合わせたほうがすごく便利

## 以前書いた以下の改良版
http://takuya-1st.hatenablog.jp/entry/2013/05/28/033545
HDDのパーティションを変更してマウントする

パーティションを変更したいときは parted を使いましょう

fdisk は 2TB を超える HDD をうまく扱えないらしいので最近は parted を使うのが流行りらしいです

一覧を見る

    sudo parted -l

シェルに入る

    sudo parted /dev/sdX

    (parted) help # helpを表示
    (parted) print # 一覧を表示
    (parted) mklabel gpt # 既にGPTなら必要なし
    (parted) mkpart primary 0% 100%

    sudo mkfs.ext4 -j -m 1 /dev/sdX1
    # デフォルトは後でゆっくり初期化をするので一気にやりたいときはこれ
    sudo mkfs.ext4 -E lazy_itable_init=0,lazy_journal_init=0 -j -m 1 /dev/sdX1

    # 定期実行されるfsckを止める（異常終了からの起動時など実行されることもある）
    sudo tune2fs -i 0 -c 0 /dev/sdX1

`/etc/fstab` にブート時にマウントするものを書いておく

UUID は `sudo tune2fs -l /dev/sdX1` で確認可能

    sudo mount -t ext4 /dev/sdX1 /mnt/hdd1
    sudo mount -a # fstab の設定を適用
    sudo umount /mnt/hdd1 # アンマウント
JavaのListの一部分だけをソート

JavaのListの一部分（例えば３番目から６番目まで）だけをソートしたいときはこのようにします。
（部分ソートとは意味が異なります。）

```java
List<Integer> list = new ArrayList<Integer>();
for(int i = 9; i != -1; --i)
  list.add(i);
Collections.sort(list.subList(3, 7));
System.out.println(list);
// [9, 8, 7, 3, 4, 5, 6, 2, 1, 0]
```
自分が入れてるXcode Pluginまとめ

## xcode5対応
FuzzyAutocomplete
https://github.com/chendo/FuzzyAutocompletePlugin
http://safx-dev.blogspot.jp/2013/11/xcodefuzzy-autocomplete-for-xcode.html

KSImageNamed
https://github.com/ksuther/KSImageNamed-Xcode

XVim
https://github.com/JugglerShu/XVim

XcodeColors
https://github.com/robbiehanson/XcodeColors

XLog5
https://github.com/Maxwin-z/XLog5

cocoapods-xcode-plugin
https://github.com/kattrali/cocoapods-xcode-plugin

Dash-Plugin-for-Xcode
https://github.com/omz/Dash-Plugin-for-Xcode

## xcode5未対応
Alcatraz
https://github.com/mneorr/Alcatraz

Xcode-4-Fixins
https://github.com/davekeck/Xcode-4-Fixins
Unity 4.3で追加された2D Sprite系の拡張についてのメモ

Unity 4.3で追加された2D Sprite系の拡張はとても便利。もうcocos-2d(x)も2D Toolkitもいらないんじゃない？

Texture TypeにSpriteが追加されて、Sprite ModeをMultipleにするとSprite Editerでテクスチャアトラスをオートスライスできる。（テクスチャアトラス自体はBasic版では作れない？）
スライスしたAtlasはそのままSpriteとして使用できる。

RigidbodyもColliderも2D用のクラスが用意された。

追加された2D系クラスを主にあげると、
Collider2D
　BoxCollider2D
　CircleCollider2D
　EdgeCollider2D
　PolygonCollider2D

Joint2D
　DistanceJoint2D
　HingeJoint2D
　SliderJoint2D
　SpringJoint2D

Collision2D
Rigidbody2D
Physics2D
PhysicsMaterial2D
RaycastHit2D

といった具合。

2D系のColliderは3D系のColliderとはぶつからないようで、RayCastもヒットしない。

マウスで特定のオブジェクトを操作したい場合、下記のようにPhysics2D.OverlapPointを使えば、あたり判定ができるようだ。

Vector2 worldPoint2d = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Collider2D collider2D = Physics2D.OverlapPoint(worldPoint2d);
if(collider2D) {
	MyDebug.Log("Hit!");
	MyDebug.Log(collider2D);
}

その他、矩形と円でもあたり判定ができ、
OverlapArea
OverlapCircle
OverlapPoint

それぞれはAll系とNonAlloc系のメソッドもある。
OverlapPointAll
OverlapPointNonAlloc
Mongodbのコネクション数の設定とlimits.confの関係

あとでかく


supervisor配下で動かしているmongodbのプロセスのlimitsがプロセスを再起動しても変わらなかったので、調査メモ。


```bash
$ ulimit -u
1024
```

```bash:/etc/security/limits.d/90-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

*          soft    nproc     1024
```

mongodb.confのmaxConnsのデフォルト値は20000

現状は設定されていない。但しサーバの設定（ulimit）により制限される

20000以上は無理っぽい
http://docs.mongodb.org/manual/reference/configuration-options/#maxConns
らくらくディレクトリ移動


開発中に前開いていたディレクトリに戻ったり, 毎回指定したディレクトリ名をうつのがめんどくさいので, 調べてみた.

## 直前に開いていたディレクトリに移動する
```
$ cd  -	
```

## 特定のディレクトリ間を移動する
popd, pushdコマンドを利用する.

```
$ pwd
/
# ルートにいたとして...

$ pushd /hoge
$ pwd
/hoge
# pushdで /hoge に移動.

$ dirs
/hoge /
# /hogeが登録されている

$ popd
$ pwd
/
# 戻ってきた！！！
```

Windowsのコマンドプロンプトでも利用できるらしい.


## 参考
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/012easycd.html
Mojoliciousの基本的なルーティングがよくわからなくて

2013.12.18 書き直しました。

Perlでフレームワークを使用するときはMojoliciousを使用することにしています。
とはいってもあまりちゃんと使ったことがないので、悩む点がちょこちょこありました。
[Mojoliciousドキュメント 日本語訳](https://github.com/yuki-kimoto/mojolicious-guides-japanese/wiki)をただ読んでみても理解が進まないので、とりあえず書いてみて確かめながら勉強中です。

## 何がわからなかったのか？
URLが多階層になった場合の記述がよくわかりませんでした。
たとえば、
http://localhost/test/
とかの場合だと、

```perl:Test.pm
$r->get('/test')->to('test#test');
```

で問題なく動きますし、

```perl:Test.pm
$r->get('/test/lowpage')->to('lowpage#test');
```

でも動くのですが、lib内のアプリ本体直下のファイル数がやたら増えるので嫌だし、何でもかんでもプレースホルダー使って取得してしまうのも間違っていると思うし、ぐちゃぐちゃして嫌なのでした。
もっと具体的に言えば、
$r->get('/hoge') を Test::Hoge->hoge()
$r->get('/hoge/piyo') を Test::Hoge->piyo()
にしたい、って感じです。
調べても全然出てこなくて。というか、文書を読んでも理解できなかっただけなんですけれど。

## 結論
試行錯誤の過程を書いても仕方がないので、結果を。

```perl
$r->get('/foo')->to('foo#foo');
$r->get('/foo/bar')->to('foo-bar#bar');
$r->get('/baz/qux')->to('baz-qux_quux#foo_bar');
```

と記述した場合、呼び出されるファイルは以下でした。


`$r->get('/foo')->to('foo#foo');`
コントローラ：`lib/MyAPP/Foo.pm`　の　`sub foo`
テンプレート：`template/foo/foo.html.ep`


`$r->get('/foo/bar')->to('foo-bar#bar');`
コントローラ：`lib/MyAPP/Foo/Bar.pm`　の　`sub bar`
テンプレート：`template/foo/bar/bar.html.ep`


`$r->get('/baz/qux')->to('baz-qux_quux#foo_bar');`
コントローラ：`lib/MyAPP/Baz/QuxQuux.pm`　の　`sub foo_bar`
テンプレート：`template/baz/qux_quux/foo_bar.html.ep`
表示範囲 (CropBox) を考慮して PDF のサムネイルをつくる


Automator や ImageMagick でも PDF を画像に変換することはできるが、表示範囲 (CropBox) が考慮されず、トンボや余白が画像に含まれてしまう場合がある。

[Poppler](http://poppler.freedesktop.org/) という PDF レンダリングライブラリに含まれる `pdftoppm` コマンドなら `-cropbox` オプションで表示範囲のみを画像にすることができる。

# Poppler のインストール

Homebrew を使っているなら、下記コマンドで完了。

```bash
$ brew install poppler
```

XQuartz のインストールを要求されたら、下記からダウンロード、インストールする。

https://xquartz.macosforge.org/landing/

# pdftoppm の使い方

ヘルプは `-h` オプションで。

```bash
$ pdftoppm -h
```

下記コマンドで foo.pdf の 1 ページ目の表示範囲が foo.jpg に保存される。

```bash
# -cropsize  表示範囲を考慮
# -f 1       1 ページ目
# -jpeg      jpeg で出力
$ pdftoppm -cropbox -f 1 -jpeg foo.pdf > foo.jpg
```

# サムネイルに

`pdftoppm` の `-scale-to` オプションでもサイズの変更は可能だが、あまり綺麗でなかったので ImageMagick の `convert` でリサイズする。

```bash
# jpeg:-         標準入力のデータを JPEG として読み込む
# -resize 96x96  96x96px に収まるサイズに縦横比を変えずリサイズ
$ pdftoppm -cropbox -f 1 -jpeg foo.pdf | convert jpeg:- -resize 96x96 foo.jpg
```

# 例

下記は、pdf ディレクトリにある PDF のサムネイルを作成し、thumbnail ディレクトリに保存する Ruby スクリプト。

```ruby
require "shellwords"
Dir.glob("pdf/*.pdf") do |pdf|
  puts pdf
  dest = "thumbnail/" + File.basename(pdf).gsub(/\.pdf$/, ".jpg")
  `pdftoppm -cropbox -f 1 -jpeg #{pdf.shellescape} | convert jpeg:- -resize 96x96 #{dest.shellescape}`
end
```
【Github時代のgit hook】issue番号を勝手にcommit commentに入れてくれるやつ

#$ git commit -m "#0001 mendokusai"

コミットメッセージに#[issue num]やんの面倒ですよね、
たまに何のブランチだか、なんのissueのコミットだかわからなくなって
思わずオクトキャットに涙するなんてことよくあるはず。

おもわずenter押しちゃってうっかりコメント入れなかったりして

```bash:amend
$ git commit --amend -m "#1507 やべ、間違えた"
```

と打ち込む事も少なくないはず

そんな時のために自動化しましょう。
やるべきことは簡単。

1, prepare-commit-msgの用意
2, issue番号付きbranchの作成

##prepare-commit-msgの用意

作業フォルダに.git/hooks/prepare-commit-msgを用意

prepare-commit-msgの中身は以下

```bash:prepare-commit-msg
#!/bin/sh
#

if [ "$2" == "" ] ; then
mv $1 $1.tmp
echo "issue #`git branch | grep "*" | awk '{print $2}' | sed -e "s/^\([0-9]*\).*/\1/g"`" > $1
cat $1.tmp >> $1
fi
```

` $ chmod +x prepare-commit-msg`

##issue番号付きbranchの作成

` $ git checkout -b 1234_branch`

これで大丈夫。

##使う
` $ git commit `

コミットすると

```bash:commitMessage

issue  #1234

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch 1_test_branch
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
# modified:   index.html
#          
                                                                
```

こんな感じでできている。
やってることは、コミット前にブランチ名内の数字を読み出して
付与して上げているだけ、下記を参考にさせていただきました。

[git branch名に、チケット番号仕込むと、良い事あった。 - 鼻メガネ会長](http://riskrisk.hatenablog.com/entry/2012/01/19/011406)
ElasticsearchをPerlから使う下準備

どうもはじめまして。otakaと申します。
かなり大したことないPerlプログラマ（？）ですが、今後、自分の経験から得たことを書いていきたいと思います。
ほとんど備忘録でしかないのですが。

今回はElasticsearchをPerlから使う下準備をします。

## 環境

* OS: Debian7.2 wheezy 64bit(VirtualBox)
* Perl: Perl5.18.1(Plenv)


## なんでElasticsearch?
元ネタは[こちらの記事](http://qiita.com/amay077/items/9fb99ab9e6801033977d)です。
仕事の都合上、どうしてもリバースジオコーディングしたかったのです。
外部API使用したほうが早いし正確・確実なのですが、根拠なく内部に持ったほうがいいような気がしたのでやってみることにしました。
（どちらにしても、商用で閉じた空間で使用するのでGoogleのAPIは候補から外れてました。）

## Elasticsearch本体のインストール

```shell-session
apt-get install Elasticsearch
```

とかやっても入りません。
[Elasticsearch Download](http://www.elasticsearch.org/download/)
にdebがあるので、ダウンロードしてきて、

```shell-session
dpkg -i elasticsearch-0.90.6.deb
```

とかで入ります。
何か依存があったかも、、、忘れたので、思い出し次第書き足します。


## 公式モジュール
[ Perl Elasticsearch ]とかそんなキーワードで検索しても、日本語ではあまり情報がないんですね。
[公式モジュール](http://www.elasticsearch.org/blog/unleash-the-clients-ruby-python-php-perl/#perl)があるようなので、そちらを使用します。使用方法については日本語のドキュメントはやはりありません（見つからないだけ？）。

## モジュールインストール
とりあえず、単純に

```shell-session
cpanm Elasticsearch
```

とかやってもコケます。
どうやらNet::SSLeayがない（入らない）と怒られているようです。

今回はDebianなので、下記を入れておけば大丈夫。

```shell-session
apt-get install libssl-dev
```

その後、cpanmからふつうにモジュールが入りましたとさ。

あれ、Perlに直接関係あることが全く書いていない。。。
この続きでちゃんと書きます。
herokuのメンテナンス画面はiframeで表示しているだけ


```
heroku maintenance:on
```

したサイトのhtmlソースを見てみると、

```
<!DOCTYPE html>
    <html>
    <head>
      <style type="text/css">
        html, body, iframe { margin: 0; padding: 0; height: 100%; }
        iframe { display: block; width: 100%; border: none; }
      </style>
    <title>Offline for Maintenance</title>
    </head>
    <body>
      <iframe src="https://s3-ap-northeast-1.amazonaws.com/pplog-static/503.html">
        <p>Application Error</p>
      </iframe>
    </body>
    </html>
```

おお！ということで、s3はユーザーが近いところのregionにすると良さそうです。

このことは[herokai](https://www.facebook.com/groups/171846576268309/permalink/477302002389430/)で教えていただきました。
AngularJS $timeout を Jasmine から実行した際にコールバックが実行されない問題

下のコードだと$timeoutサービスのコールバックが実行さずにタイムアウトしてしまう。

```js:appSpec.js
it('$timeout test', function () {
	var value = null;
	$timeout(function () {
		value = 'hoge';
	}, 100);

	expect(value).toBeNull();

	waitsFor(function () {
		return value !== null;
	}, 'timeout', 200);

	runs(function () {
		expect(value).toEqual('hoge');
	});
});
```

どうやら```$timeout.flush(delay)```をコールしてタイマーを進めると実行されるようになる模様。

```js:appSpec.js

it('$timeout test', function () {
	var value = null;
	$timeout(function () {
		value = 'hoge';
	}, 100);

	expect(value).toBeNull();
	
	$timeout.flush();

	expect(value).toEqual('hoge');
});
```
Cocoaアプリケーションに dylibをバンドルする

# 解決したい課題
あるdylibを使用するCocoaアプリケーションを開発する際、ユーザーがそのdylibをインストールしているか分からないのでアプリケーション中にバンドルして提供したい

この例では libusb-1.0.0.dylibをバンドルした時の方法について解説する

# 手順
1. dylibをコピー
1. Build Phase(Copy Files)を追加
1. Build Phase(Run Script)を追加
1. Link Binary with Librariesの変更

## dylibをコピー
xcodeに libusb-1.0.0.dylibを追加する
![スクリーンショット 2013-11-13 12.05.20.png](https://qiita-image-store.s3.amazonaws.com/0/3847/9059fb34-76dd-8df7-c461-da2b1d97f3f7.png)

## Build Phase(Copy Files)を追加
Targetの Build Phaseを修正する。 Editor → Add Build Phase → Add Copy Files Build Phase
このPhaseはLink Binary with Librariesの上に置く。
* Destination: Shared Support
* Subpath: 空白
* Copy only when installing: チェックなし
リストに libusb-1.0.0.dylibを追加。
![スクリーンショット 2013-11-13 12.05.42.png](https://qiita-image-store.s3.amazonaws.com/0/3847/1af9617c-bcb4-f583-6caa-320939b9540e.png)

## Build Phase(Run Script)を追加
Editor → Add Build Phase → Add  Run Script Build Phase
このPhaseは上述の Copy Files Build Phaseの下に置く。

スクリプトは以下のとおり。これは参考にしたサイトからそのまま。

```bash 
#!/bin/bash
# In Xcode you actually enter the path for the shell
# you want to use in a text field about the shell source.
# So, !/bin/bash might not be necessary.

# Space separated list of libraries.
# Enter any dylibs you have in your Copy File Phase.
TARGETS=(libusb-1.0.0.dylib)

EXECFILE=${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}
LIBPATH=${BUILT_PRODUCTS_DIR}/${SHARED_SUPPORT_FOLDER_PATH}
NEWLIBPATH=@executable_path/../SharedSupport

for TARGET in ${TARGETS[@]} ; do
LIBFILE=${LIBPATH}/${TARGET}
TARGETID=`otool -DX "${LIBPATH}/$TARGET"`
NEWTARGETID=${NEWLIBPATH}/${TARGET}
install_name_tool -id "${NEWTARGETID}" "${LIBFILE}"
install_name_tool -change ${TARGETID} ${NEWTARGETID} "${EXECFILE}"
done
```

## Link Binary with Librariesの変更
libusb-1.0.0.dylibを追加する。今回はlibusbが依存している IOKITも追加している。
![スクリーンショット 2013-11-13 12.20.12.png](https://qiita-image-store.s3.amazonaws.com/0/3847/60e6079e-81b4-96cf-7af8-a5e9613af126.png)

最終的な Build Phaseの順番はこんな感じに。
![スクリーンショット 2013-11-13 12.21.08.png](https://qiita-image-store.s3.amazonaws.com/0/3847/97a18364-b553-ea4a-86c1-9aed39322b42.png)

# 完成
これでバンドルとリンクの作業は完成。libusbのexampleを AppDelegateに入れて動かしてみたがちゃんと動いている。
![スクリーンショット 2013-11-13 12.07.06.png](https://qiita-image-store.s3.amazonaws.com/0/3847/b4b80a3c-74b2-72ea-8d5c-2d3e2e74557a.png)

# 注意
リリース時にはライセンス表示を忘れずに。

# 参考
http://chasingtrons.com/notes-to-self/2012/10/17/embedding-a-dynamic-library-in-a-cocoa-application.html
1個前に実行したコマンドを文字列としてクリップボードにコピーするエイリアス

```
alias prevcopy='history | tail -n 2 | head -n 1 | perl -pe "s/^ *\d+ *//g" | xclip -selection clipboard'
```

Ubuntu 12.0 で動作確認。.bash_aliases とかに書いておくと、あ、このコマンド VM 上でもまた叩きたい、てな時に便利。
Model で取ってきたデータを id => name の形に整形する



例えば下記のようなデータを拾ってきたとする。

```
array (size=4)
  0 => 
    array (size=1)
      'Group' => 
        array (size=4)
          'id' => string '1' (length=1)
          'name' => string 'Admin' (length=5)
          'created' => string '2013-11-07 13:29:16' (length=19)
          'modified' => string '2013-11-07 13:29:16' (length=19)
  1 => 
    array (size=1)
      'Group' => 
        array (size=4)
          'id' => string '2' (length=1)
          'name' => string 'BookStore' (length=9)
          'created' => string '2013-11-07 13:29:16' (length=19)
          'modified' => string '2013-11-07 13:29:16' (length=19)
  2 => 
    array (size=1)
      'Group' => 
        array (size=4)
          'id' => string '3' (length=1)
          'name' => string 'Publisher' (length=9)
          'created' => string '2013-11-07 13:29:16' (length=19)
          'modified' => string '2013-11-07 13:29:16' (length=19)
  3 => 
    array (size=1)
      'Group' => 
        array (size=4)
          'id' => string '4' (length=1)
          'name' => string 'Distribution' (length=12)
          'created' => string '2013-11-07 13:29:16' (length=19)
          'modified' => string '2013-11-07 13:29:16' (length=19)
```

このデータを、id=>name のようなデータ構造して select box にしたい。

```
array (size=4)
  1 => string 'Admin' (length=5)
  2 => string 'BookStore' (length=9)
  3 => string 'Publisher' (length=9)
  4 => string 'Distribution' (length=12)
```

foreach で回すのもありだけど、簡単に成形する方法がある。

```php
<?php
	Hash::combine($this->Group->find("all"), "{n}.Group.id", "{n}.Group.name");
```
をすれば簡単ですよっと。第二引数および第三引数の文法とかは下記を参考

http://book.cakephp.org/2.0/en/core-utility-libraries/hash.html

なお、同等のことが Set クラスでもできるけど、2.2以降は Set クラスが非推奨っぽい。
http://book.cakephp.org/2.0/en/core-utility-libraries/set.html#Set::combine
XOOPS Cubeモジュール開発中にブロックの処理が重いのがガマンできずについカッとなってやった。後悔はしてない


XOOPS_ROOT_PATH/modules/legacy/kernel/Legacy_PublicControllerStrategy.class.php 28行目より

```php
	function setupBlock()
	{
		return; // ついカッとなって足した1行
		$showFlag =0;
		$mid=0;
```


いやぁサクサク画面表示されるようになったわー。
RoboVMからネイティブコードを呼び出す。

#はじめに
RoboVMからネイティブコードを呼び出す方法をまとめました。
私もまだ勉強中ですので不完全ですが検証出来た所から徐々に書いて行こうと思います。

#JNIを使う。
Javaの標準の方法です。
だいたいJavaのJNIと同じですが、NewWeakGlobalRefがサポートされていません。

#Broを使う。
RoboVMにはBroと呼ばれる、Javaから直接CやObjective Cのメソッドを呼び出す仕組みがあります。
JNIのようにCやC++のコードを書かなくても使えるため便利です。
https://github.com/robovm/robovm/wiki/The-Bro-Java-to-native-bridge

##ObjectiveC
このようなObjectiveCのクラスがあるとします。

```objc
@interface Test : NSObject
- (void) hello;
@end
```

これはJava側でこのようなクラスを作って呼び出す事が出来ます。

```java
@Library(Library.INTERNAL)
@NativeClass
public class Test extends NSObject {
    static {
        ObjCRuntime.bind(Test.class);
    }
    private static final Selector hello = Selector.register("hello");
    @Bridge private native static void objc_hello(Person __self__, Selector __cmd__);
    public void hello() {
        objc_hello(this, hello);
    }
}
```

objc_helloメソッドの名前は任意で構いません。大事なのはSelectorです。今回は引数無しですのでhelloという名前になっています。もし引数が１個の場合はこのようになります。

```java
    private static final Selector foo = Selector.register("foo:");
    @Bridge private native static void objc_foo(Person __self__, Selector __cmd__, int arg1);
```
引数が複数ある場合はこのようになります。

```java
    private static final Selector foo = Selector.register("foo:arg2:");
    @Bridge private native static void objc_foo(Person __self__, Selector __cmd__, int arg1, int arg2);
```
CentOS の Timezone 変更


変更前：

```
$ date
2013年 11月 13日 水曜日 00:43:47 UTC
```

変更する

```
$ sudo timedatectl set-timezone Asia/Tokyo
```

変更後：

```
$ date
2013年 11月 13日 水曜日 09:49:46 JST
```

## 参考

[CentOS 7 のタイムゾーンを変更する手順](http://weblabo.oscasierra.net/centos7-timezone-1/)
[BUG] Qiita markdown でリストの階層が深くなるとレンダリングできない

Qiita markdown でレンダリングのバグがありました。

 * 1
   * 2
     * 3
       * 4
         * 5.0
	     * 5.1
	       * 6.0
	       * 6.1
           * 6.2
               * 7.0
               * 7.1
                 * 8.0
                 * 8.1
                 * 8.2
                 * 8.3

何故か 7.1 以降がレンダリングされない。

タブインデントとスペースインデントが混合すると再現するっぽいです。  
![Screen Shot 2013-11-13 at 9.57.57 AM.png](https://qiita-image-store.s3.amazonaws.com/0/833/043f3ca4-9c26-4a37-6fb8-23f68b54055f.png)

2スペースインデントに統一すると、消えないが、5と6が同階層になっている

 * 1
   * 2
     * 3
       * 4
         * 5.0
         * 5.1
           * 6.0
           * 6.1
           * 6.2
             * 7.0
             * 7.1
               * 8.0
               * 8.1
               * 8.2
               * 8.3

さらに2スペースと4スペースを混合させると8が消える。

 * 1
   * 2
     * 3
       * 4
         * 5.0
         * 5.1
           * 6.0
           * 6.1
           * 6.2
             * 7.0
             * 7.1
                 * 8.0
                 * 8.1
                 * 8.2
                 * 8.3

ソースはこちら

https://gist.github.com/ngs/7441804/raw/9123bfda005026d97ed91cc284f594bff894aaa0/QiitaMarkdownBug.md
レジスターの簡単な利用

個人的に便利に使っている方法。

ときどき使うので、操作を忘れてしまうことが多く、レジスターを利用して操作を簡略化しています。
みんな知っていることかもしれないので、恥ずかしいのですが。

@ｐのマクロに、次の内容を登録する。
"+gP　のテキストをブロック指定をしてから、"ｐｙの操作をして、レジスターに登録する。
動作　他のWindowでコピーした内容を＠ｐでコピーする。　（コマンドラインからではなく、直接ノーマルモードの上で操作する。）

同様にレジスターに登録していく。

マクロ　　コピー操作　　内容　　　　動作
@p        "py         "+gP      ペースト
＠c   　　"cy 　　　　　"+y　　　　コピー
＠a   　　"ay　　 　　　ggVG　　　全指定
@s   　　"sy 　　　　　:g/^\s*$/d　　スペース行の削除
@t   　　"ty 　　　　　　:%s/aaa/\t/g 　タブへの変換
@h   　　"hy   　　　　　:let g:vimwiki_list = [{'path':'~/Dropbox/vimwiki/','path_html':'~/Dropbox/vimwiki_html/'},{'path':'~/vimwiki','path_html':'~/vimwiki_html/'}]　vimwikiのdropboxへの環境変更

終了してもレジスターに残っていますから、一度登録すれば続けて使えます。
コードスニペット共有Webサービスまとめ

スニペット等、ソースコード共有系のWebサービス。

※2018/09/25時点

# おすすめ

* [Gists](https://gist.github.com/)
Chromeアプリ「GistBox」との連携が良い感じ。

* [Pastebin.com](http://pastebin.com/)
動作が軽い。言語が豊富。（PL/SQLとかT-SQLもある！）

# サービス終了？　※利用不可
* codr.cc
* ShareSRC
* Snipt.org
* sourcepod.com
* Pastie
PHPで直積計算

# 非再帰版

Pythonの実装を参考に非再帰版で書き直しました。なかなかこんな書き方思いつかないよ…

```php
<?php

function direct_product(array ...$arrays)
{
    $result = [[]];
    foreach ($arrays as $array) {
        $tmp = [];
        foreach ($result as $x) {
            foreach ($array as $y) {
                $tmp[] = array_merge($x, [$y]);
            }
        }
        $result = $tmp;
    }
    return $result;
}

var_export(direct_product(['A', 'B', 'C'], ['a'], [1, 2]));
/*
array (
  0 => 
  array (
    0 => 'A',
    1 => 'a',
    2 => 1,
  ),
  1 => 
  array (
    0 => 'A',
    1 => 'a',
    2 => 2,
  ),
  2 => 
  array (
    0 => 'B',
    1 => 'a',
    2 => 1,
  ),
  3 => 
  array (
    0 => 'B',
    1 => 'a',
    2 => 2,
  ),
  4 => 
  array (
    0 => 'C',
    1 => 'a',
    2 => 1,
  ),
  5 => 
  array (
    0 => 'C',
    1 => 'a',
    2 => 2,
  ),
)
*/

var_export(direct_product(['A', 'B', 'C'], [], [1, 2]));
/*
array (
)
*/

var_export(direct_product());
/*
array (
  0 => 
  array (
  ),
)
*/
```

↑最後のやつって数学的に正しいのだろうか？

# 再帰ジェネレータ版

一応こちらのほうが省メモリです。

```php
<?php

function direct_product(array ...$arrays)
{
    if (!$arrays) {
        yield [];
    } elseif ($tails = array_pop($arrays)) {
        foreach (direct_product(...$arrays) as $body) {
            foreach ($tails as $tail) {
                yield array_merge($body, [$tail]);
            }
        }
    }
}

var_export(iterator_to_array(direct_product(['A', 'B', 'C'], ['a'], [1, 2])));
/*
array (
  0 => 
  array (
    0 => 'A',
    1 => 'a',
    2 => 1,
  ),
  1 => 
  array (
    0 => 'A',
    1 => 'a',
    2 => 2,
  ),
  2 => 
  array (
    0 => 'B',
    1 => 'a',
    2 => 1,
  ),
  3 => 
  array (
    0 => 'B',
    1 => 'a',
    2 => 2,
  ),
  4 => 
  array (
    0 => 'C',
    1 => 'a',
    2 => 1,
  ),
  5 => 
  array (
    0 => 'C',
    1 => 'a',
    2 => 2,
  ),
)
*/

var_export(iterator_to_array(direct_product(['A', 'B', 'C'], [], [1, 2])));
/*
array (
)
*/

var_export(iterator_to_array(direct_product()));
/*
array (
  0 => 
  array (
  ),
)
*/
```