OmniAICreator/Qiita-1.07M huggingface dataset:
複数のRailsプロジェクトの共通機能をgemに書き出す

## はじめに

プロジェクト間の重複を無くしたい。
gemに切り出すのが良いと考えられる。
ただし、プロジェクトに依存しているのでRubyGemsには公開しない。

## jewelerは使うのか

> Jeweler: Craft the perfect RubyGem
> https://github.com/technicalpickles/jeweler

なのでおそらく不要

## どうやって作るのか

以下を読めば作れる。

> The Basics of Creating Rails Plugins
> http://guides.rubyonrails.org/plugins.html

よく使う、gemを落としてきて中を見て参考にするの効果的と思われる。

## --mountablオプションは何なのか

> 使いやすくなった Rails 3.1 の Engine
> http://d.hatena.ne.jp/passingloop/20110801/p1

たぶん、Rails Engine作るやつ

> Getting Started with Engines
> http://guides.rubyonrails.org/engines.html

気になったら読んで下さい。

## Rspecでテストする

```
bundle gem sideci_api -t
```

で作るとrspecでテストできるtemplateが出来るらしい。
ボックスを左右に分けたいとき。


１，leftとrightのclassを作成して、それぞれにfloatをかけて調整する。

１，がうまく行かない時。
画像、文章をセットでlistタグに入れて、listにdisplay:block; float:left;のナビゲーションを作成するときのような形にする。
clearfixの仕様の仕方


(div).(floatなどを解除したいclass要素):after{
content: ".";
    display: block;
    height: 0;
    clear: both;
    visibility: hidden;
}

中々使い方を覚えられずにいたclaerfixですが、一度覚えると非常に簡単でした。
解除したいクラスのあとに:afterを使って、解除内容を記述すると、
floatの影響が会ったclassが解除されて通常どおりになります。

参照:http://www.css-lecture.com/log/css/013.html
Symbol#to_procに引数を指定できるようにしてみる

アイデアとしては以前からあるけど、とにかく簡潔に書きたかったので、以下のようにしてみた。

```rb
class Symbol
  def to_proc(*args)
    -> receiver { receiver.send(self, *args) }
  end
  alias_method :[], :to_proc
end
```

Symbol#[] はもともとあって String#[] と同じだけど、普通使わないし上書きして良いよね？


```rb
puts (0..5).map(&:*[10])
```

だから何という感じだけど、応用でwhenで比較演算子がかける。

```rb
[1, 10, 100].each do |number|

  puts "#{number} is"

  case number
  when :<[5]   then puts "less than 5."
  when :<[50]  then puts "less than 50."
  when :<[500] then puts "less than 500."
  end

  case number
  when :>[50] then puts "more than 50."
  when :>[5]  then puts "more than 5."
  when :>[0]  then puts "more than 0."
  end

end
```

そもそも何がしたかったかというと、これがやりたかった。

```rb
module Kernel
  def less(boundary)
    :<[boundary]
  end

  def more(boundary)
    :>[boundary]
  end
end

[1, 10, 100].each do |number|

  puts "#{number} is"

  case number
  when less(5)   then puts "less than 5."
  when less(50)  then puts "less than 50."
  when less(500) then puts "less than 500."
  end

  case number
  when more(50) then puts "more than 50."
  when more(5)  then puts "more than 5."
  when more(0)  then puts "more than 0."
  end

end
```

#### ところで

[Repro株式会社](https://repro.io/) では一緒に切磋琢磨できる仲間を募集しています！ ぜひ[こちら](https://www.wantedly.com/companies/repro/projects)をごらんください！
初心者にお勧め　javaのmathクラスまとめ

package sample1;

public class MathAllSample {
	public static void main(String[] args){
		
		int a = 100, b = 99, c;//大小判定（大）の場合
		
		c = Math.max(a, b);
		System.out.println(a +"と"+ b +"では"+ c +"の方が大きい");
		
		double d = 14.5,e = 4.56, f;//大小判定（小の場合）
		
		f = Math.min(d, e);
		
		System.out.println(d +"と"+ e +"では"+ f +"の方が大きい");
		
		double g = 3.14, h;//小数点以下を切り上げ
		h = Math.ceil(g);
		 
		System.out.println(g +"の小数点以下を切り上げると"+ h +"になります");
		 
		double i = 3.14, j;//小数点以下切り捨て
		j = Math.floor(i);
		
		System.out.println(i +"の小数点以下を切り捨てると"+ j +"になります");
		
		double k = 3.14, l = 49.6, m,n;//四捨五入
		m = Math.round(k);
		n = Math.round(l);
		
		System.out.println(k +"を四捨五入すると"+ m +"になります");
		System.out.println(l +"を四捨五入すると"+ n +"になります");
		
		double o = 2, p = 2, q;//累乗
		q = Math.pow(o, p);
		
		System.out.println(o +"を"+ p +"乗した値は"+ q +"です");
		
		
		double r = 2,s, t = 2, u;
		s = Math.sqrt(r);//平方根
		u = Math.cbrt(t);//立方根
		
		System.out.println(r +"の平方根は"+ s +"です");
		System.out.println(t +"の平方根は"+ u +"です");
		
		double v = Math.random();
		
		System.out.println(v);//0~1.0未満の乱数
		
		double w = Math.random()*7;//0~7までの乱数
		System.out.println(w);
		
	}

}
さくらVPSにtomcatをインストールする


##1.JDKのインストール
**インストール**
$yum install java-1.7.0-openjdk-devel.x86_64

**パスの設定**
$vi /etc/profile

最終行に追加

```/etc/profile
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.51.x86_64
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
```

**設定を反映する**
$source /etc/profile


##2.tomcatのインストール
**インストール**

```
$cd /usr/local/tmp
wget http://ftp.tsukuba.wide.ad.jp/software/apache/tomcat/tomcat-7/v7.0.50/bin/apache-tomcat-7.0.50.tar.gz
tar -xvf apache-tomcat-7.0.50.tar.gz
mv ./apache-tomcat-7.0.50 /usr/local/tomcat
```


**パスの設定**
$vi /etc/profile

```/etc/profile
export TOMCAT_HOME=/usr/local/tomcat
export CATALINA_HOME=/usr/local/tomcat
export CLASSPATH=$CLASSPATH:$CATALINA_HOME/common/lib
```

**設定を反映する**
$source /etc/profile

##3.接続確認
http://IPアドレス:8080/
に接続してtomcatのページが表示されればOK

ファイヤーウォールの設定で8080ポートに接続できない場合
curl http://localhost:8080/
でも確認できるっぽい。


##4.自動起動設定

**tomcat用の環境設定ファイルを作る**
$vi /etc/profile.d/tomcat.sh

```
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.51.x86_64
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
export TOMCAT_HOME=/usr/local/tomcat
export CATALINA_HOME=/usr/local/tomcat
export CLASSPATH=$CLASSPATH:$CATALINA_HOME/common/lib
```
1と2で/etc/profileに記述したexport部分要らなくなる？


**起動シェル作成**
$vi /etc/rc.d/init.d/tomcat

```
#!/bin/bash
#
# Startup script for the tomcat
#
# chkconfig: 345 80 15
# description: Tomcat is a Servlet+JSP Engine.

# Source function library.
. /etc/rc.d/init.d/functions
source /etc/profile.d/tomcat.sh

start(){
    if [ -z $(/sbin/pidof java) ]; then
        echo "Starting tomcat"
        /usr/local/tomcat/bin/startup.sh
        touch /var/lock/subsys/tomcat
    else
        echo "tomcat allready running"
    fi
}

stop(){
    if [ ! -z $(/sbin/pidof java) ]; then
        echo "Shutting down tomcat"
        /usr/local/tomcat/bin/shutdown.sh
        until [ -z $(/sbin/pidof java) ]; do :; done
        rm -f /var/lock/subsys/tomcat
    else
        echo "tomcat not running"
    fi
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    status)
        /usr/local/tomcat/bin/catalina.sh version
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|status}"
esac

exit 0

```

**実行権限追加**
$chmod +x /etc/rc.d/init.d/tomcat

**自動起動設定**
$chkconfig \--add tomcat
$chkconfig tomact on

**tomcat起動**
$/etc/rc.d/init.d/tomcat start

##参考サイト
http://centossrv.com/tomcat6.shtml
http://javatechnology.net/service/vps-java-tomcat/
ForgeGradleのbuild時に, アーカイブにソースコードをコピーする.

以下のコードをbuild.gradleに追加してbuildする.

```build.gradle
processResources {
    from(sourceSets.main.java.srcDirs) {
        into sourceSets.main.java.srcDirs
    }
}
```

生成されるjarファイルにsrc/main/java/~がコピーされます.
数字６桁パスワードの総当たり JavaScript(node.js)編

[JavaScriptで学ぶ関数型プログラミング](http://www.oreilly.co.jp/books/9784873116600/ "JavaScriptで学ぶ関数型プログラミング")を読書中に、某所で盛り上がってた6桁の数値のmd5値を作成するコードを、練習がてらに書いたよ。

forとかeach書いたら負けだと思って書いた。
性能は残念ながらでてない。

```js
var _ = require('underscore');
_.mixin(require('underscore.string').exports());
var crypto = require('crypto');

// log output function
var log = (function(msg){
  var base = new Date().getTime(); // start time
  return function(msg){
    var now = new Date().getTime();
    console.log([msg, ':', now - base, 'msec'].join(''));
    base = now;
  };
})();

// master data
var salt = 'hoge$';
var hash = '4b364677946ccf79f841114e73ccaf4f';
log("inited");

// create input data '000000'-'999999'
var passes = _.map(_.range(0,1000000), function(n){return _.pad(n,6,'0');});
log("created data");

// passes -> hashes(md5)
var hashes = _.map(
        passes, function(src){
          var md5 = crypto.createHash('md5');
          md5.update(salt + src, 'utf8');
          return md5.digest('hex');
        });
log("hashed alldata");

// key:hash value:pass
var dict = _.object(hashes,passes);
log("dicted, pass is " + dict[hash]);
```

実行結果

```
$ node md5.js
inited:0msec
created data:707msec
hashed alldata:3835msec
dicted, pass is 567890:679msec
```

まぁ性能出すための戦いじゃないけどおそい。
入力データの作成だけで700msec、
MD5の計算で4000msec、
それをオブジェクトへ詰めるだけで700msec…
関数型に慣れるための習作だしもうこれでいいよね。
AppCodeのカラースキームをSolarizedにする

# 環境
AppCode v2.5.4

# 事前準備
GitHubより、カラースキームを入手する。

> [jkaving/intellij-colors-solarized](https://github.com/jkaving/intellij-colors-solarized)

必要なのは下記のファイル。

* Solarized Light.icls
* Solarized Dark.icls

### 手順

.iclsファイルを下記のフォルダに置く。

```
$HOME/Library/Preferences/appCode20/colors
```

コピーが完了すると、AppCodeにて、  
メニュー「Preferense＞Editor＞Colors & Fonts」でSolarizedのテーマが選択できるようになる。
drone.io で Dart のプロジェクトを CI する

Dart のプロジェクトを CI のホスティングサービスである [drone.io](https://drone.io/) でホストしてみる.

![drone.io.1.png](https://qiita-image-store.s3.amazonaws.com/0/18658/91091854-de27-cc4e-14f5-ae4805e535ea.png)

プロジェクトは [Github](https://github.com/) で管理しているので Github のアカウントで登録する.

![drone.io.2.png](https://qiita-image-store.s3.amazonaws.com/0/18658/77f8532a-85ff-eb1f-0339-d266c6692253.png)

公開プロジェクトは無制限に, プライベートプロジェクトは最初の 50 ビルドまで無料で行えるらしい.

![drone.io.3.png](https://qiita-image-store.s3.amazonaws.com/0/18658/a08c6164-c972-f997-ca40-7ac13a45584b.png)

リポジトリのホスティングサービスを Github, [Bitbucket](https://bitbucket.org/), [Google Code](https://code.google.com/) から選択する. ここでは Github を選択.

![drone.io.4.png](https://qiita-image-store.s3.amazonaws.com/0/18658/d8ef07a1-462a-a299-9899-bacc79525074.png)

Github で管理しているリポジトリの一覧が表示されるので, 目的のリポジトリを選択する.

![drone.io.5.png](https://qiita-image-store.s3.amazonaws.com/0/18658/97959dc1-c58c-d71f-fab0-f724d22e126a.png)

ビルドシステムを選択する. ここでは Dart.

![drone.io.6.png](https://qiita-image-store.s3.amazonaws.com/0/18658/b531a1ca-a56e-daac-4c1d-d4650123a467.png)

ビルドスクリプトを記述する. ビルドタスクの作成には [Hop](https://pub.dartlang.org/packages/hop) を利用している.

![drone.io.7.png](https://qiita-image-store.s3.amazonaws.com/0/18658/75fc453b-1525-2c32-2e98-cb63b469cd46.png)

細かい設定を行う画面が表示される. ここでは特に追加の設定は行わないでビルドしてみる.

![drone.io.8.png](https://qiita-image-store.s3.amazonaws.com/0/18658/d25d4106-1ce2-edd3-dee7-1f858cd3778f.png)

ビルド成功.

![drone.io.9.png](https://qiita-image-store.s3.amazonaws.com/0/18658/54b143f4-77cd-e128-83b4-adec4fb04b5e.png)

次に, リポジトリの `README.md` に追加するビルドステータスのバッジを取得する.

![drone.io.10.png](https://qiita-image-store.s3.amazonaws.com/0/18658/8eff0d4e-83d1-9654-befd-c46afa5f7602.png)

こんな感じに表示される.

[![Build Status](https://drone.io/github.com/kohtaka/echo/status.png)](https://drone.io/github.com/kohtaka/echo/latest)

![drone.io.11.png](https://qiita-image-store.s3.amazonaws.com/0/18658/266ec83e-16ad-d1d3-85d8-0d55fc8ff3d1.png)
特定のcellの上に載せたViewが載せていないcell上で表示されてしまう問題の解決策

あまり詳しくないのですが、 色々調べながら試してみると以下の対策が、実装の詳細がよくわかっていない段階の応急処置としては良さそうです。

応急処置：最初にcell.contentViewとcellのimageやlabel等のプロパティを全て削除する。

コード的には

```objc
for (UIView *subview in [cell.contentView subviews]) {
        [subview removeFromSuperview];
}
```

でcell.contentView上のViewを削除して、

```objc
cell.imageView.image = nil;
```

等でcellのプロパティで画面上のViewとして表示されるものを削除します。

私の場合はとりあえずこれで問題が解決しました。
ただ、処理的には無駄が多く、多くのセルを使う場合はメモリを食うのかなと思います。
詳しい方等いらっしゃいましたらご指摘・アドバイス等頂けましたら幸いです。
Photoshopで畳み込みフィルタ

# はじめに

Photoshopにも実は畳み込み行列を使ったフィルタが備わっている。
フィルタの開発中に効果をすぐに得たいときに使えるかもしれない。

`メニューバー` > `フィルター` > `その他` > `カスタム…`
![menu.jpg](https://qiita-image-store.s3.amazonaws.com/0/3603/b9b44598-f838-3b53-6dac-7b3795a26040.jpeg)

行列は5×5まで対応。

## 先鋭化

| | | |
|---|---|---|
|0|-1|0|
|-1|5|-1|
|0|-1|0|

スケール:1
オフセット:0
![sharp.jpg](https://qiita-image-store.s3.amazonaws.com/0/3603/4447dee9-016b-aff8-ad96-9e1c40a80c78.jpeg)

## ソーベルフィルタ（境界検出）

| | | |
|---|---|---|
|1|0|-1|
|2|0|-2|
|1|0|-1|

スケール:1
オフセット:0
![sobel.jpg](https://qiita-image-store.s3.amazonaws.com/0/3603/a25f21d1-1a57-f6e3-26bf-09257efe9669.jpeg)

## ラプラシアンフィルタ（境界検出）

| | | |
|---|---|---|
|0|-1|0|
|-1|4|-1|
|0|-1|0|

スケール:1
オフセット:0
![laplacian.jpg](https://qiita-image-store.s3.amazonaws.com/0/3603/cfe51b3f-832a-898b-85c2-0ddc3f96ebe2.jpeg)

## エンボスフィルタ

| | | |
|---|---|---|
|1|0|-1|
|1|0|-1|
|1|0|-1|

スケール:1
オフセット:128
![emboss.jpg](https://qiita-image-store.s3.amazonaws.com/0/3603/bc65c8c0-72f6-9bd9-049f-6e3e40063a1e.jpeg)

# その他

GIMPではコンボリューション行列という日本語訳で解説されている。
http://docs.gimp.org/2.6/ja/plug-in-convmatrix.html
PascalCase, camelCase, snake_case を一括して揃える

# 正規表現

*PascalCase*, *camelCase*, *snake_case* とかいろいろあるけど一括してどれかに揃えたいなーってときに使える正規表現です。

```ruby
/[A-Z0-9][^A-Z0-9_]*+|(?:\A|(?<=_))[^A-Z0-9_]++|\A\z/
```

# 実装サンプル

## クラス定義

```php
class CaseUtil {
 
    public static function pascalize($string) {
        return implode('', array_map('ucfirst', self::parse($string)));
    }
 
    public static function camelize($string) {
        return lcfirst(self::pascalize($string));
    }
 
    public static function snakify($string) {
        return implode('_', array_map('lcfirst', self::parse($string)));
    }
 
    private static function parse($string) {
        preg_match_all(
            '/[A-Z0-9][^A-Z0-9_]*+|(?:\A|(?<=_))[^A-Z0-9_]++|\A\z/',
            $string,
            $matches
        );
        return $matches[0];
    }
 
}
```

## テスト

普段テスト書かないクズプログラマだけどPHPネイティブの `assert` 関数を初めて使ってみました。<del>PHPUnit導入めんどくさくて</del>

```php
$tests = array(
    'pascalize' => array(
        'SampleMethodTest'          => 'SampleMethodTest',
        'sampleMethodTest'          => 'SampleMethodTest',
        'sample_method_test'        => 'SampleMethodTest',
        'Sample_Method_Test'        => 'SampleMethodTest',
        'SampleMethod_Test'         => 'SampleMethodTest',
        '_sampleMethod_____Test___' => 'SampleMethodTest',
        'AあIいUうEえOお'            => 'AあIいUうEえOお',
        'あいうえお'                 => 'あいうえお',
        '_'                         => '',
        ''                          => '',
    ),
    'camelize' => array(
        'SampleMethodTest'          => 'sampleMethodTest',
        'sampleMethodTest'          => 'sampleMethodTest',
        'sample_method_test'        => 'sampleMethodTest',
        'Sample_Method_Test'        => 'sampleMethodTest',
        'SampleMethod_Test'         => 'sampleMethodTest',
        '_sampleMethod_____Test___' => 'sampleMethodTest',
        'AあIいUうEえOお'            => 'aあIいUうEえOお',
        'あいうえお'                 => 'あいうえお',
        '_'                         => '',
        ''                          => '',
    ),
    'snakify' => array(
        'SampleMethodTest'          => 'sample_method_test',
        'sampleMethodTest'          => 'sample_method_test',
        'sample_method_test'        => 'sample_method_test',
        'Sample_Method_Test'        => 'sample_method_test',
        'SampleMethod_Test'         => 'sample_method_test',
        '_sampleMethod_____Test___' => 'sample_method_test',
        'AあIいUうEえOお'            => 'aあ_iい_uう_eえ_oお',
        'あいうえお'                 => 'あいうえお',
        '_'                         => '',
        ''                          => '',
    ),
);
 
foreach ($tests as $func => $group) {
    foreach ($group as $from => $to) {
        assert("CaseUtil::$func('$from') === '$to'");
    }
}
```

アサーションに失敗した場所が分かりやすいように変数展開させてみました。失敗しないけど。
[Objective-C] UIViewとCALayerの階層についてメモ


まだまだ勉強不足で、UIViewとCALayerの兼ね合いが曖昧なのでメモ。
最初、UIViewとCALayerは独立して存在しているのかと思っていたのだけど、どうやら階層構造はUIView、CALayerともに同じになる？
（あるいは`addSubview:`を実行した時点で、そのUIViewのCALayerを追加してるのかも。まだリファレンスしっかり追えてません）

とりあえず動作を確認するために簡単にコードを書いてみた。

```objc
// Viewの重なりテスト
self.view.backgroundColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.5];

UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 160, 200)];
view1.backgroundColor = [UIColor redColor];

UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 160, 200)];
view2.backgroundColor = [UIColor blueColor];

UIView *view3 = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 160, 200)];
view3.backgroundColor = [UIColor greenColor];

// UIViewを入れ子に
[view1 addSubview:view2];
[view2 addSubview:view3];

CALayer *layer1 = [CALayer layer];
layer1.backgroundColor = [UIColor grayColor].CGColor;
layer1.frame = CGRectMake(20, 20, 100, 100);

CALayer *layer2 = [CALayer layer];
layer2.backgroundColor = [UIColor blackColor].CGColor;
layer2.frame = CGRectMake(40, 40, 100, 100);

CALayer *layer3 = [CALayer layer];
layer3.backgroundColor = [UIColor whiteColor].CGColor;
layer3.frame = CGRectMake(60, 60, 100, 100);

// それぞれのUIViewにCALayerを新たに追加
[view1.layer addSublayer:layer1];
[view2.layer addSublayer:layer2];
[view3.layer addSublayer:layer3];

[self.view addSubview:view1];

NSLog(@"%@", self.view.layer.sublayers);
```

上記コードを実行すると以下のイメージになります。

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/5616/a840508d-3d83-bb92-efa1-47df7a1dc17c.png "sample.png")

それぞれの色と関係は明記した通り。
UIViewを先に入れ子にして、その後でそれぞれCALayerを追加したけど、UIView1にあとから追加したGrayのCALayerがUIViewそれぞれよりも前面に来ているので、入れ子構造はUIViewもCALayerも追加した順に反映されるみたい。
サブシェルを使用し、ワンライナーで実行するコマンドを並列実行


# サブシェル(子シェル)

()でコマンドを括ると、親シェルからサブシェルとしてコマンドを実行することが可能となる。
サブシェルは、親のシェルの環境変数等を汚したくない時によく使う。

## よく使うパターン(1)

一時的に環境変数LANGを英語に変更し、英語でmanpageを見たいとき

```
$ (LANG=C; man 3 printf)
```


## よく使うパターン(2)

親シェルで一時的にディレクトリを変更して作業したいとき

```sh:script
# シェル・スクリプト内で
cd topdir

(cd builddir; make)

# カレントディレクトリは、topdir
```

## よく使うパターン(3)

遅延コマンド実行

```sh:script
# シェル・スクリプト内で
(sleep 60; command)&
```

# ワンライナーで実行するコマンドを並列実行

よく使うパターン(3)の振る舞いを応用して、for in do done, while do doneの構文に当てはめれば、ワンライナーで実行するコマンドの並列実行が可能となる。

## よく使うパターン[1]: コマンドの応答を待たずに、定期的にコマンドを実行

```
$ while true; do (sleep 10; program)& done
```

## よく使うパターン[2]: 重い処理のコマンドが成功したらログを保存

```
$ for i in `seq 1 10`; do ( 重い処理のコマンド && 結果を保存するコマンド )&; done
```

### 例.ネットワーク内の機器を検索
```
$ for i in `seq 1 254`; do (ping -c 1 192.168.1.$i && echo "192.168.1.$i is alive" >> log)&; done
$ cat log
192.168.1.1 is alive
192.168.1.13 is alive
192.168.1.101 is alive
192.168.1.251 is alive
192.168.1.254 is alive
```

## 別の方法での並列実行

- xargs -P 
- parallelコマンド

上記コマンドを使用することで並列でコマンド実行することが可能です。
OS X marvericks(over OS X 10.9)でmosh(mobile-shell)を使えるようにする方法（brew環境）

充分に待ってmarvericksにしたというのに、
moshが使えなくて発狂したかけたので全国のmosh使いが発狂しないようにメモしておきます。

```bash
brew update
brew rm protobuf
brew install protobuf
brew rm mobile-shell
brew install mobile-shell
```

参考：https://github.com/Homebrew/homebrew/issues/23992
コマンドラインから Ubuntu Unity のワークスペースの数を変更する

```shell-session
# 横方向の数を3に
gsettings set org.compiz.core:/org/compiz/profiles/unity/plugins/core/ hsize 3

# 縦方向の数を2に
gsettings set org.compiz.core:/org/compiz/profiles/unity/plugins/core/ vsize 2
```
整数区間のほぼ均等分割

半開区間`[0, N)` を 整数`m` で均等分割（＋端数分散）

```c
for (int i = 0; i < m; i++) {
  int r0 = N/m *  i    + std::min(N%m, i);
  int r1 = N/m * (i+1) + std::min(N%m, i+1);
  // i番目の半開区間[r0, r1)
}
```

計算例

 * N=10/m=2: [0,5), [5,10)
 * N=10/m=3: [0,4), [4,7), [7,10)
 * N=10/m=4: [0,3), [3,6), [6,8), [8,10)
 * N=3/m=5: [0,1), [1,2), [2,3), [3,3), [3,3)
EditText を継承するときに気をつけること

EditText を拡張し、独自のアトリビュートを宣言し、それを読み取って使うときに注意する点。

## onTextChanged コールバックはコンストラクタから呼ばれる

EditText の親の TextView には、`TextView#onTextChanged(CharSequence, int, int, int)`というコールバックがあり、これを継承することで、`TextWatcher`を使わなくても、セットしている文字列の変更をモニタできます。

このコールバックは、通常`TextView#setText()`のような文字列の変更を行うメソッドの中で呼ばれますが、もう一つ、TextView を初期化するコンストラクタでも呼び出されています(Android 4.4.2 のコードベースではL3817あたり)。

オーバライドすることを許されたメソッドをコンストラクタで呼び出す危険性は EffectiveJava が説明している通りですが、もし継承によって拡張した独自の EditText が、`TextView#onTextChanged(CharSequence, int, int, int)`をオーバライドして、コンストラクタで初期化している(と思っている)はずのオブジェクトを使用していた場合、容易に NullPointerException なり何かしらの実行時例外が起こってしまいます。

```java
// super のコンストラクタで onTextChanged が呼ばれてしまう
public class MyEditText extends EditText {
    private Something mSomething;

    public MyEditText(Context context) {
        super(context);

        init(context, null, 0);
    }

    public MyEditText(Context context, AttributeSet attrs) {
        super(context, attrs);

        init(context, attrs, 0);
    }

    public MyEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        init(context, attrs, defStyle);
    }

    private void init(Context context, AttributeSet attrs, int defStyle) {
        mSomething = new Something();
    }

    @Override
    protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
        super.onTextChanged(text, start, lengthBefore, lengthAfter);

        mSomething.doSomething(); // コンストラクタで呼ばれてしまうので、mSomething が null のまま
    }
}
```
正規表現を体系的に学ぶつもりがない人のためのプチ講座

「正規表現をきちんと学ぶ気はない、でも仕事では使いたい！」とかお思いの欲張りなあなたのための記事です。

## 正規表現の定義
パターンとターゲットとなる文字列（以下 *対象*）をマッチさせます。
（ホントのところはウィキペディアとかで調べてね！）

## パターンの構成
【文字＋文字の数（以下 *量化子*）】×n

## 覚えるべき記号（メタ文字）
たったの **6つ**です。

- ^ => 対象の始まり
- $ => 対象の終わり
- . => どんな文字でもいいから、1文字

以下は量化子です。

- \* => 直前の文字がいくつあっても、なくてもいい
- \+ => 直前の文字がいくつあってもいいけど、ないとダメ
- ? => 直前の文字はないか、1つだけ

なお、これらの文字を記号としてではなく文字としてそのまま扱いたい場合、`\`でエスケープできます。

## 文字クラス
文字は普通に`a`とかけば`a`にマッチします。が、複雑なマッチをしたいときは文字クラスを使います。

- `[aiueo]` => `a``i``u``e``o`の **どれか**の文字
- `[^aiueo]` => `a``i``u``e``o` **以外**の文字
- `[0-9]` => 数字1文字

## 単語単位でマッチさせたい場合
`()`の中に単語を入れます。例えば、`hacker`の前に`super`が最低1つついた文字列（例えば`supersupersuperhacker`）にマッチさせたい場合、
`(super)+hacker`
というパターンが使えます。
また、単語は`|`を使うことで「または」マッチができます。`(super|great)+hacker`とすると、`greatsupergreathacker`のような文字列にマッチします。

## 使ってみる
拡張子が`rb`で、かつファイル名に`python`または`perl`が含まれているファイルだけを探したいとします。この場合、ファイル名が対象です。パターンは、
`^.*(python|perl)+.*\.rb$`
となります。左から読み下すと、
「対象が始まり、どんな文字列があってもなくてもよく、pythonまたはperlという文字列が最低1つはあり、どんな文字列があってもなくてもよく、.rbという文字列が1つあり、対象が終わる」
ような対象にマッチするわけです。
http://rubular.com/r/loDT0sefmq
上記URLに結果があるので確認してみてください。

## まとめ
正規表現は難しい(´・ω・｀)
jQuery Mobileの複数ページ作成と戻るボタン

# 複数ページ作成と戻るボタン

jQuery Mobileで複数ページは一つのhtml内で、
data-role="page" のdivを複数用意してあげます。
別のページに遷移するのは 

```html
<div data-role="page" id="id2">
//contents
</div>
```

のページに飛びたい場合は、

```html
<a href="#id2">
```

で指定してあげればそのページに遷移できます。

あとは元のページはブラウザの場合backボタンでいいのですが、
PhoneGapのiOSアプリなどは戻るボタンがなかったりするので、
戻るボタンを定義してあげなければいけません。
そのときは、

```js
$(document).bind("bobileinit", function() {
    $.mobile.page.prototype.options.addBackBtn = true;
});
```

とaddBackBtnオプションをtrueにしてあげれば、ページを遷移したときにbackボタンが表示されるようになります。

以下がサンプルです。

```hello.html
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.4.2/jquery.mobile-1.4.2.min.css" />
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="http://code.jquery.com/mobile/1.4.2/jquery.mobile-1.4.2.min.js"></script>
<script>
$(document).bind("bobileinit", function() {
    $.mobile.page.prototype.options.addBackBtn = true;
});
</script>
</head>
<body>
<div data-role="page" id="id1">
  <div data-role="header" data-add-back-btn="true">
    <h1>test page 1</h1>
  </div>
  <div role="main" class="ui-content">
    test page 1
    <a href="#id2">go to page2</a>
  </div>
</div>

<div data-role="page" id="id2">
  <div data-role="header" data-add-back-btn="true">
    <h1>test page 2</h1>
  </div>
  <div role="main" class="ui-content">
    test page2
  </div>
</div>
</body>
</html>
```

結果は1ページ目
![jquerymobile-1.png](https://qiita-image-store.s3.amazonaws.com/0/4044/9476a89c-a095-0dbc-ae01-09d84971712f.png "jquerymobile-1.png")

遷移後の2ページ目
![jquerymobile-2.png](https://qiita-image-store.s3.amazonaws.com/0/4044/18ec09f3-8e22-737d-422c-4ba5328efe1c.png "jquerymobile-2.png")

# 追記
あとで発見したのですが、戻るボタンは
http://qiita.com/jazzsasori/items/76cd0ac0dce6d666e6cc
にあるとおり、

```html
<div data-role="header"> 
    <a href="" data-rel="back">戻る</a>
</div>
```

でも追加できるようです。
IntelliJ IDEAでAndroid開発できるようにする


##経緯
そろそろ本格的にAndroidの開発をAndroid Studioでやろうかなと思ってた。(後々Android Studioのほうが標準になるらしい)
↓
Android StudioはIntelliJ IDEAをベースに作られてる。
↓
IntelliJ IDEAは他の言語でも使える。(RubyとかPythonとか)
↓
もうIntelliJ IDEAでやってたほうがいいんじゃ？←イマココ

##環境
Mac(10.9.2)
IntelliJ IDEA 13 Ultimate Edition
(Androidだけで使うならCommunity Editionでも可。でもそれならAndroid Studioでいいよね)

##最新のJava SDKのダウンロードとインストール
[Oracle](http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html)から[jdk-7u51-macosx-x64.dmg]をダウンロードして、インストール。

##Android SDKのダウンロードとインストール
1. [Android Developers](http://developer.android.com/sdk/index.html)からAndroid SDKをインストールする。
必要なのはSDKだけなので、ページ下部の[USE AN EXISTING IDE]からSDKのみダウンロード。
2. Zipファイルを解凍する。
3. ターミナルで次のコマンドを打ってSDK Managerを起動する。
`<SDKルート>$tools/android update sdk`
4. 必要なパッケージを選択してインストールする。

##IntelliJ IDEAのインストール

1. [ここ](http://www.jetbrains.com/idea/download/)からIntelliJ IDEA 13のUltimate Editionをダウンロード。
2. [ideaIU-13.x.x.dmg]をクリックしてインストール。
3. 以前の設定をインポートするか聞かれるが、設定はないので下のインポートしないを選択。
4. ライセンス入力画面が出るので一番下の30日間試用を選択。
5. 規約が表示されるので同意する。
6. 初期設定ウィザードで設定していく。
 1. バージョン管理システムの初期設定を聞かれるので、使い慣れてるものを選択する。(例:Git) ※
 2. Web/JavaEE Technology Pluginsの初期設定をする。すぐ必要そうなものはないので、全て選択解除して進む。※
 3. HTML/JavaScript Develpment Pluginsの初期設定。(2.)と同様に設定。
 4. その他のPluginの設定。(Android Designer, Android, Ant, Gradle, Groovy, JUnit, Properties, Terminal, UI Designer(Core)など)
 5. finishで初期設定を終了する。

※ IDEの起動スピードが早くなるので不必要なプラグインは外す。プラグインの設定は後から変更可能。

##プロジェクトの作成と実行
1. IntelliJ IDEAのWelcomeページから[Create New Project]を選択。
2. Javaの項目でProject SDKの隣の[New]からJava SDKを設定する。
3. Android#Application Moduleの項目でプロジェクト名を入力し、Project SDKの隣の[New]からAndroid SDKを設定する。
4. Projectの詳細設定のページに進むがそのまま[Finish]で終了する。(Target Deviceの設定は好みで) 
5. Projectの画面が開くのでMenu→Runでアプリを実行する。

##その他
個人的にエディタは黒背景の方が好みなのでテーマ設定する。
menu→IntelliJ IDEA→Preferences→IDE Settings→Editor→Colors & Fonts
Scheme nameを[Darcula]に設定して再起動。
第19回オフラインリアルタイムどう書くの問題


オフラインでリアルタイムに「どう書く」をやるイベント( http://atnd.org/events/47670 )を行っています。

問題は「不良セクタの隣」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/ord19nebasec/
です。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、上記の atnd に過去問リンク集がありますので、そちらをご覧になると良いと思います。

【宣伝】
CodeIQ に出している問題
https://codeiq.jp/ace/nabetani_takenori/q766
もよろしく。
※ CodeIQ の方は締め切るまで解答を公開しないようお願いします。
検索条件を指定して一覧を取得するには

#概要

GETメソッドを用いて一覧を取得する方法をご紹介します。
まずは完成形から。

```html:/table_name/list.html
<html>
  <head>
    <title>一覧取得サンプル</title>
  </head>
  <body>
    <form method="get">
      <h3>価格</h3>
      <input name="price__ge">円以上
      <input name="price__le">円以下
      <h3>色</h3>
      <input type="checkbox" name="or__color" value="black">黒
      <input type="checkbox" name="or__color" value="white">白
      <input type="submit" value="検索">
    </form>
  </body>
</html>
```

ここに、特定条件を指定して[検索]ボタンを押したと仮定します。ここでの検索条件は1000円以上、5000円以下、色が黒または白です。
すると遷移先のURLは以下のとおりになります。

```
http://FQDN/table_name/list/?price__ge=1000&price__le=5000&or__color=black&or__color=white
```

この時、サーバー側で処理されるSQLは以下のとおりです。

```sql:list.sql
--発行されるSQL
SELECT *
  FROM table_name
 WHERE price >= 1000
   AND price <= 5000
   AND (color = 'black'
    OR  color = 'white');
```

#解説

##書式
パラメタ名は次のルールで指定することができます。

[or[_ *{group_name}* ]__] *{column_name}* [__ *{operand}* ]

##OR条件
各パラメタは通常AND条件として処理されますが、ORプリフィックスを利用することで
OR条件として処理することが可能です。
OR条件判定の指定方法は以下の２パターンがあります。

* 同じ名称のカラムをORで連結する
* 違う名称のカラムをグループ化してORで連結する

###同じ名称のカラムをORで連結する
同じカラムに対してOR条件を指定するにはORプリフィックスを含むパラメタを使用します。
宿泊数が２泊、または５泊以上のデータを抽出するためのパラメタは以下の通りです。

```
?or__stay_day=2&or__stay_day__ge=5
```

###違う名称のカラムをグループ化してORで連結する
別々のカラムに対してOR条件を指定することもできます。その場合は任意のグループ名称を付与して、どの条件群がOR連結となるかを指定します。
施設のうち、トイレ・更衣室・駐車場のいずれかが有るデータを抽出するためのパラメタは以下の通りです。

```
?or_g1__flg_toilet=true&or_g1__flg_dressingroom=true&or_g1__flg_parking=true
```


##オペランド
各パラメタがどのような比較演算子で条件判定されるのかは、
パラメタのサフィックスによって決定されます。
サフィックス用のデリミタはアンダースコア２つ `__` です。

|値|内容|指定例|展開例|
|:--|:--|:--|:--|
|オペランドなし|等しい|col=1|col=1|
|ne|等しくない|col__ne=1|col<>1|
|gt|より大きい|col__gt=1|col>1|
|ge|以上|col__ge=1|col>=1|
|lt|より小さい|col__lt=1|col<1|
|le|以下|col__le=1|col<=1|
|likel|前方一致|col__likel=abc|col like 'abc%'|
|liker|後方一致|col__liker=abc|col like '%abc'|
|like|部分一致|col__like=abc|col like '%abc%'|
|nlikel|前方一致しない|col__nlikel=abc|col not like 'abc%'|
|nliker|後方一致しない|col__nliker=abc|col not like '%abc'|
|nlike|部分一致しない|col__nlike=abc|col not like '%abc%'|
|isnull|比較対象はNULL値|col__isnull=|col is null|
|isnotnull|比較対象はNULL値ではない|col__isnotnull=|col is not null|
|in|要素のいずれかに等しい|col__in=1&col__in=2|col in (1,2)|
|nin|要素のいずれにも等しくない|col__nin=1&col__nin=2|col not in (1,2)|

#セキュリティ
製作者の意図しない任意のパラメタが指定されないように、GENERATORはURLごとに指定可能なパラメタ名のリストを管理します。最初の例であれば、次のようなリストがサーバーに保持されます。

|URLパターン|許可するGETパラメタ|
|:--|:--|
|/table_name/list|prige__ge|
||price__le|
||or__color|

このリストにないパラメタが検索条件として指定されたとしても、それはSQL生成には関係しません。単純に無視されます。

---
##注意事項

* テーブル定義を行う際、 `or_` から始まるカラム名を定義することはできません。
* table_nameをURLパターンに含めるルールは暫定です。今後変更になる可能性があります。

##関連項目

* [複雑な条件で一覧を取得するには](http://www.headwaters.co.jp/)
* [テーブルに別名（エイリアス）を付けるには](http://www.headwaters.co.jp/)
* [画面から変更できない規定の検索条件を指定するには](http://www.headwaters.co.jp/)
【Play】distしたときに、カスタムlogger.xmlが効かない【Scala】


お疲れ様です。

[心の叫び](https://twitter.com/takudo_dev/status/441831235413741568)
Play2.2.1にて確認しています。

あまりにも気にくわなかったので、
重い腰を上げてgithubのissueを検索し始めました。

そしたら見つけました。

__[[2.1] Logging levels configuration in application.conf is ignored in production mode (dist)](https://github.com/playframework/playframework/issues/1186)__

##雰囲気の要約

* なんかみんなできない（おなじ悩み）
* 「俺はフレームワークの中身をハックしてるぜ」という人が現れる
* みんな直して欲しいなーと思ってる
* 数ヶ月経ってるけどやっぱり直ってない←いまここ

といっても最後の投稿が4ヶ月前ですけどね。

##適用されるlogger.xml

どうも、組み込みのこのlogger.xmlが適用されているようです。

https://github.com/playframework/playframework/blob/master/framework/src/play/src/main/resources/logger.xml

ERRORレベルが標準出力&application.logに出力されるようです。
試しに人為的にExecution Errorを起こしたら、無事（？）ファイル出力されたので、そういうことのようです。

…なかなか厳しいですな…
MySQLで日本語を扱うときの注意点

MySQLで日本語、というよりUTF-8を扱いたいときは、データベース作るときにutf-8を文字コードに指定しないと大変という話。
日本語を突っ込もうとすると、以下のように怒られる。
```
Incorrect string value: '\xE3....
```

なので、mysqldで

```sql
create database db_name character set utf8;
```

と言った感じでutf8を使ってくださいとお願いしないといけない。
Railsでオートリンクを有効にしつつサニタイズ

本文をサニタイズしつつ、オートリンクを有効化したいので以下のように設定した。オートリンクは`rails_autolink`というgemが必要。

```rb:application.rb
config.after_initialize do
  ActionView::Base.sanitized_allowed_tags.clear
  ActionView::Base.sanitized_allowed_tags = ["a"]
  ActionView::Base.sanitized_allowed_attributes = ["rel", "target"]
end
```

許可するtagをクリアしたあとにホワイトリスト方式で許可するタグを指定した。あと、デフォルトでは`rel="nofollow"`とか`target="_blank"`がサニタイズされてしまうので、許可したい属性を追加した。
データ解析プログラミングのおすすめ本・情報源（PythonまたはR）


あるデータ解析ワークショップのために、初めてデータ解析でプログラミングをする人のための本を紹介します。

## Python編
Python自体が初めての人は、これを片手にサンプルを動かしてみるとよいかもしれません。

* <a href="http://www.amazon.co.jp/gp/product/4797371595/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4797371595&linkCode=as2&tag=skyy0079-22">みんなのPython 第3版</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=skyy0079-22&l=as2&o=9&a=4797371595" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />


データ解析に必要なライブラリ(NumPy, matplotlib, pandasなど)は、以下の本1冊にまとまっています。

* <a href="http://www.amazon.co.jp/gp/product/4873116554/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4873116554&linkCode=as2&tag=skyy0079-22">Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=skyy0079-22&l=as2&o=9&a=4873116554" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

この本は、東京なら八重洲ブックセンター、大阪なら茶屋町の丸善ジュンク堂に置いているのを確認しました。

## R編

本でもWebでも、R-Tipsというのがとりあえずおすすめです。

* Web: [R-Tips](http://cse.naro.affrc.go.jp/takezawa/r-tips/r.html)
* 書籍: <a href="http://www.amazon.co.jp/gp/product/4274067831/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4274067831&linkCode=as2&tag=skyy0079-22">The R Tips―データ解析環境Rの基本技・グラフィックス活用集</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=skyy0079-22&l=as2&o=9&a=4274067831" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

最近はグラフ描画にggplot2を使うのが流行っているらしいので、それ関連も探してみるとよいかもしれません。
以下のサイトにggplot2関連の情報源がまとまっています：

* [ggplot2 に入門するための情報源 - holidayworking.github.com](http://holidayworking.github.io/blog/2012/07/11/ggplot2/)
Git 特定のフォルダのみcloneする

リポジトリのここのフォルダだけcloneしたいんだ、Subversionでいうところのcheckoutだ、という場合は`sparsecheckout`の機能を使用する。

特定のフォルダだけclone、という以外に絶対にcommitしたくないファイルを外したりできるので、覚えておくと便利(設定ファイルを個人ごとに書き換えなければならない場合など)。

1. `git clone xxx `
2. `git config core.sparsecheckout true`
3. `echo I_want/this_folder/ > .git/info/sparse-checkout`
4. `git read-tree -m -u HEAD`

5. `echo I_forget/this_folder/ >> .git/info/sparse-checkout`

まずは普通にcloneをしてきて、そのあとsparsecheckoutを有効にする。

次に、`.git/info/sparse-checkout`というファイルに残しておきたいフォルダ(`I_want/this_folder/`)を書き込む。

そして、`git read-tree -m -u HEAD`という呪文を唱えると先程記載しておいたフォルダ以外は姿を消すことになる。

上記5では、指定するのを忘れたフォルダを追記している。この場合、既存ファイルへの追記なので>>となる点に注意。もちろん普通にファイルを編集してもOK。

これで不要なファイルは除外できるが、フォルダ階層は調整できない(aaa/bbbをd/にcloneする、といったことができずd/aaa/bbbになる)。
ここはうまい方法はなさそうな気配。

＜参考＞
http://blog.quilitz.de/2010/03/checkout-sub-directories-in-git-sparse-checkouts/
http://jasonkarns.com/blog/subdirectory-checkouts-with-git-sparse-checkout/
adbでAndroidが認識しない時にそもそもUSB接続されてるか確認するコマンド

android繋いで認識されない時（adb devicesして出てこない時）は

* USBデバッグになってるか確認する
* 端末を再起動してみる
* adb kill-serverしてみる

してみる。が結構一般的、そんなかそれでも出てこない時は
usb driverがそもそもMac側に入ってないので認識されてない可能性もある。

そんな時はUSB接続でそもそも繋がっているのか確認、ってことで以下。

> system_profiler SPUSBDataType

コレ打つとUSB認識されてる端末とか機材が全部出る。便利。
これに出てるけど、adbが認識しない時は

>  vim ~/.android/adb_usb.ini
ここにVenderIdを記載する。

これでいけるハズ
サーバプロセスを起動するためのツール


gunicornのプロセス立ち上げるのってどうやったらイイの？という話題が上がったのでメモ。

| | URL | 通知 |
|:--|:--|:--|
| monit | http://mmonit.com/monit/ | ◯ |
| daemontools | http://cr.yp.to/daemontools.html | ☓ |
| supervisord | http://supervisord.org/ | ? |
| upstart | http://upstart.ubuntu.com/ | ? |

# monit

monitがデーモンとして起動して、コンフィグファイルに記載されたデーモンを立ち上げたり落としたり出来る。立ち上げなおしたり通知する、などもできる。

# daemontools

initから起動するのでdaemontools自体が落ちても立ち上げ直してくれて安心感ある。特定のディレクトリに置かれたrunスクリプトを実行するだけで、通知とかはしてくれない。

# supervisord

Python製ってことだけしか知らない。

# upstart

Ubuntuのシステム起動のフレームワーク（？）。詳しく知らない。Ubuntu使ってるなら選択肢としてありかも。

----

そのうち更新するかも。
jQuery `'#'` がセレクターになる場合気をつける。


## エラーにならない

```javascript
$('#');
```

## エラーになる

```javascript
$(document).find('#');
$(document).filter('#');
$(document).not('#');
```

```
Error: Syntax error, unrecognized expression: #
```

## 変数に空文字が入るケースなど気をつける。

```javascript
$(document).find('#' + id); // => エラーになる
```

```javascript
if (id) {
	$(document).find('#' + id);
}
```
3/7日のJavaScript学習内容

-内容-
P174-P183６章オブジェクト指向プログラミング


新章に入りました。
今までの内容を用いればなんてことないと思うのですが、
ここにきてオブジェクトの定義のしかたや、プロパティの使い方などが複雑になってきたため
ごちゃごちゃしてわからない所が出てきてしまったので、
これからは今までの復習も並行してやっていこうと思います。

テキストに書いてあるプログラムを見てずっと読んでいても理解できない時があるので、
読んでわりとすぐに構文を捉えられるように勉強を進めたいと思います。

JavaScriptを習得していく上で勉強のアドバイスなどがあればいただきたいです。
よろしくお願いいたします。

次は、オブジェクト指向のプロパティ属性の続きからから学習していく予定です。
プロパティディスクリプタを使ってプロパティ属性を操作するという項目が難しいです。
nginxのログをLTSV形式で出力して、fluentd経由でMongoDBに保存する


nginxのlog_formatを忘れないところにメモっておきたかったのでメモ。

#nginx設定
`nginx.conf`のhttpコンテキスト内にLTSV形式のログフォーマット定義を行う。`$time_iso8601`などの変数は[nginx http_core_moduleのEmbedded Variables](http://nginx.org/en/docs/http/ngx_http_core_module.html#variables)を参照して適当に設定しています。

`/etc/nginx/conf.d/log_format.conf`として分離したファイルで設定して、`nginx.conf`内で`conf.d/*.conf`を読み込むようにする。

```nginx:/etc/nginx/conf.d/log_format.conf
log_format ltsv 'time:$time_iso8601\t'
                'remote_addr:$remote_addr\t'
                'request_method:$request_method\t'
                'request_length:$request_length\t'
                'request_uri:$request_uri\t'
                'https:$https\t'
                'uri:$uri\t'
                'query_string:$query_string\t'
                'status:$status\t'
                'bytes_sent:$bytes_sent\t'
                'body_bytes_sent:$body_bytes_sent\t'
                'referer:$http_referer\t'
                'useragent:$http_user_agent\t'
                'forwardedfor:$http_x_forwarded_for\t'
                'request_time:$request_time\t'
                'upstream_response_time:$upstream_response_time';
```

serverコンテキストでアクセスログを設定。フォーマットに先に定義した`ltsv`を指定する。

```nginx:/etc/nginx/sites-enabled/server.conf
access_log /var/log/nginx/access.log ltsv;
```

#fluentd(td-agent)設定

nginxのログファイルを`format`を`ltsv`として読み込む。

```ruby:/etc/td-agent/td-agent.conf
<source>
  type tail
  format ltsv  # ←これがキモ
  tag nginx.access
  path /var/log/nginx/access.log
  pos_file /var/log/td-agent/buffer/access.log.pos
</source>
```

アクセスログをMongoDBの **server-logデータベース** 、 **nginx_access_logコレクション** に保存する。

```ruby:/etc/td-agent/td-agent.conf
<match nginx.access>
  type copy

  <store>
    type mongo
    host 127.0.0.1
    database server-log
    collection nginx_access_log
  </store>
</match>
```

#MongoDB上で確認

インタラクティブシェルでMongoDBの中身を見てみる。

```bash
$ mongo server-log
```

上記設定のデータとちょっと違うんですが、コレクションを参照するとこんな感じになります。

```
> db.nginx_access_log.find()
{ "_id" : ObjectId("53183789d604801cab000017"), "hostname" : "redmine", "method" : "GET", "uri" : "/ajax/i18n/en_f09b74e1e85282d6b2633c350cc58f43.js", "status" : 200, "size" : 1157, "reqtime" : 0.008, "upsttime" : 0.008, "time" : ISODate("2014-03-06T08:53:02Z") }
```

以上！
OSXのChromeでダウンロードしたPDFをChrome PDF Viewerを使わせない


Chrome PDF Viewer を無効にすればいい。

環境設定＞設定＞プライバシー＞コンテンツの設定＞プラグイン＞プラグインを個別に無効にする＞Chrome PDF Viewer を無効にする
【Play!】PlayFramework2.2.1→2.2.2へ移行【Scala】


Mac環境にて

# playframework2.2.2を入れる。

↓DL URL
http://downloads.typesafe.com/play/2.2.2/play-2.2.2.zip

ダウンロードしてパスを通して下さい。

```
$ play help
```
でそれっぽく出てくればＯＫですよ（ちょい時間かかります）

# ソースコード修正

ここからが重要。

## [application_top]/project/plugins.sbt修正

```
$ vi [application_top]/project/plugins.sbt
```

```sbt:[application_top]/project/plugins.sbt

addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.1")
↓
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.2")

```

#動かしてみよう

```
$ cd [application_top]
$ play
```
![1_____scala-development_kanaloco__sh__と_Installing-8.jpg](https://qiita-image-store.s3.amazonaws.com/0/34165/f5c4ea7d-356e-4d22-e02c-7f9076dc7aff.jpeg "1_____scala-development_kanaloco__sh__と_Installing-8.jpg")

入りましたか？

で、play console でどきどきしながらrunを叩きます

```
> run
```

全パッケージのダウンロードに成功して、
画面のリロードして大量のコンパイルに成功して、
ほっとしたらひとまず完了です。

## IntelliJ用にリロード

play consoleで下記実行しましょう。
scalaのバージョンが2.10.2→2.10.3になっていますので。

```
> idea
```
tmux自分用メモ

＊概要
・SSHでバックグラウンドで処理を実行したり画面分割できる。

＊名称
・ウインドウ＝画面、セッション
・ペイン＝画面分割の単位

＊コマンド

| 操作 | キー |
|:------------:|:------------:|
| 起動 | tmux |
| アタッチ | tmux attach (tmux a)|
| 起動中のセッションを表示 | tmux ls |
| セッションを指定して削除 | tmux kill-session -t 0 |
| 全てのセッションを削除 | tmux kill-server |


＊ショートカット

| 操作 | キー |
|:------------:|:------------:|
| ウインドウ閉じる | (exitする) |
| ペイン切替 | C-b o |
| ペイン入替 | C-b { |
| ペイン閉じる | C-b x |
| 終了（デタッチ） | C-b d |
| ウインドウ強制終了 | C-b & |
JavaからMongoDBに入っているJSスクリプトを実行する備忘録


今日、MongoDBを始めて触ったのでMongoDBについてはまだよくわかっていませんが、javaからMongoDBに登録してあるJavaScriptのfunctionを実行する時の備忘録。MongoDBのインストール方法は割愛。

## MongoDBのjavaドライバーをGet!!
[こちら](http://central.maven.org/maven2/org/mongodb/mongo-java-driver/ "java driver")からMongoDB javaドライバーをインストール

## サンプル
MongoDB側に例えば以下のデータ構造をしていたとする。

```ststem.js
 "_id" : "xxxxxx", "value" : function (val) {return val; }

```

以下、java側

```sample.java

 DBCollection collection = db.getCollection("system.js");
 DBObject result = collection.findOne();

 // javaScriptのfunctionの部分を取得
 Object js = result.get("value");

 // javaからJavaScriptのfunctionを実行！引数はそのfunction分引数にできるよ
 CommandResult r = db.doEval(js.toString(), "Hello");

```

ふーん。
リリース向け Xcode 5 でのプロビジョニング・ファイルの追加方法



Xcode 5 でアプリリリース用にプロビジョニングファイルを指定する方法


## 設定手順

* Xcode のTarget を選択
* Build Settings タブをクリック
* Code Signing の項目を開く
* Provisioning Profile を探す
* Provisioning Profileが、なかったら 上の方にあるフィルター Basic All のAllをクリック
* Provisioning Profile が表示されるので、該当するプロビジョニングプロファイルを選ぶ


## 参考URL

[Xcode 5の Provisioning Profile指定方法 - Dolice Lab](http://lab.dolice.net/blog/2014/01/03/xcode5-select-provisioning-profile/ "Xcode 5の Provisioning Profile指定方法 - Dolice Lab")

## 感想

* ググっても情報ないので書いた。
* Xcode 5 わかりづらい。
Waiting for Upload なのに Ready to Upload Binary が消えた問題



iTunes Connect でのアプリのアップロード方法が変わったようだ。

## 結論

Application Loader をダウンロードしてそこからバイナリをアップロードする

## 手順

* "Manage Your Apps" のリンクをクリック
* フッターの "Deliver Your Apps" の項目の下にある "Download Application Loader" をクリックする
* Application Loader をダウンロードしてインストール
* Application Loader を起動して、その中でバイナリを指定してアップロード


## 参考URL

スクリーンショット付きでとてもわかりやすい。

[App Storeでの配布 - Monacaドキュメント](http://docs.monaca.mobi/ja/_images/appstore_detail.png "App Storeでの配布 - Monacaドキュメント")


## 公式ドキュメントでのステータスの意味の解説

[iTunes Connect Developer Guide: Viewing and Changing Your App’s Status and Availability](https://developer.apple.com/library/ios/documentation/LanguagesUtilities/Conceptual/iTunesConnect_Guide/Chapters/ChangingAppStatus.html "iTunes Connect Developer Guide: Viewing and Changing Your App’s Status and Availability")
npm install -d と -D


`-d`は`--loglevel info`の略
`-D`は`--save-dev`の略

```bash
# ログの出力レベル変更
npm install -d grunt-contrib
npm install --loglevel info grunt-contrib

# package.jsonに書き込み
npm install --save-dev grunt-contrib
npm install -D grunt-contrib
```

ややこしい
iOSで選択できる言語


iOSで選択できる言語を調べました。
NSLocaleのpreferredLanguagesを使うと、iOSの言語の設定(設定 -> 一般 -> 言語環境 -> 言語)に表示される選択肢の言語が同じ並び順で取得できます。iPhone5s(iOS7.0.6)では36種類あります。設定で選べるこの36種類が、ユーザがiOSで指定しうる言語といえるでしょう。
（OSのバージョンアップ等で今後増える可能性はある）

```objectivec
for (NSString *localeId in [NSLocale preferredLanguages]) {
    NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:localeId];
    NSLocale *jaLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"ja"];
    NSString *displayName = [locale displayNameForKey:NSLocaleIdentifier value:localeId];
    NSString *jsDisplayName = [jaLocale displayNameForKey:NSLocaleIdentifier value:localeId];
    NSLog(@"%@ - %@ - %@", localeId, displayName, jsDisplayName);
}
```

| idntifier | display name | 日本語の表記 |
|:-----------|:------------|:-------------|
| ja | 日本語 | 日本語 |
| en | English | 英語 |
| fr | français | フランス語 |
| de | Deutsch | ドイツ語 |
| zh-Hans | 中文（简体中文） | 中国語(簡体字) |
| zh-Hant | 中文（繁體中文） | 中国語(繁体字) |
| nl | Nederlands | オランダ語 |
| it | italiano | イタリア語 |
| es | español | スペイン語 |
| es-MX | español (México) | スペイン語(メキシコ) |
| ko | 한국어 | 韓国語 |
| pt | português | ポルトガル語 |
| pt-PT | português (Portugal) | ポルトガル語(ポルトガル) |
| da | dansk | デンマーク語 |
| fi | suomi | フィンランド語 |
| nb | norsk bokmål | ノルウェー語[ブークモール] |
| sv | svenska | スウェーデン語 |
| ru | русский | ロシア語 |
| pl | polski | ポーランド語 |
| tr | Türkçe | トルコ語 |
| uk | українська | ウクライナ語 |
| ar | العربية | アラビア語 |
| hr | hrvatski | クロアチア語 |
| cs | čeština | チェコ語 |
| el | Ελληνικά | ギリシャ語 |
| he | עברית | ヘブライ語 |
| ro | română | ルーマニア語 |
| sk | slovenčina | スロバキア語 |
| th | ไทย | タイ語 |
| id | Bahasa Indonesia | インドネシア語 |
| ms | Bahasa Melayu | マレー語 |
| en-GB | English (United Kingdom) | 英語(イギリス) |
| en-AU | English (Australia) | 英語(オーストラリア) |
| ca | català | カタロニア語 |
| hu | magyar | ハンガリー語 |
| vi | Tiếng Việt | ベトナム語 |



補足：日付の書式（設定 -> 一般 -> 言語環境 -> 書式）は36種類どころか数百種類の選択肢があります。また現在のSiriの言語は18種類です。

参考：
- [iPhoneの言語設定関連の情報取得についての解説 - 強火で進め](http://d.hatena.ne.jp/nakamura001/20090511/1242061301)
- [[iOS] 設定されている言語や書式を知る - iOS 開発ブログ Natsu's note](http://blog.natsuapps.com/2010/08/ios_127.html)
fabricで高速なファイル転送


追記: http://qiita.com/NPoi/items/46364461f0ab76e986c3 のやり方の方がスマートですね！

fabricの`put`は遅くないですか？rsyncを使っちゃいましょう。画像やHTML、JSなど静的なファイルがたくさんあるディレクトリをまるごと転送するようなケースではfabricの実行時間が劇的に違うテクニックですのでご紹介します。(fabricをある程度使ってる人を想定させていただいております)

## rootじゃないユーザでrsync

これはfabricから公式機能で提供されてるので簡単に使っちゃえます。

```python
from fabric.contrib.project import rsync_project

@task
def hoge():
	rsync_project(
		local_dir='./mydir',
		remote_dir='/usr/local/destination/mydir',
		exclude=['.DS_Tore', '*.tmp'],
		delete=True
	)
```

## rootユーザでrsync

rootじゃないユーザでrsyncしたあと, `mv`や`cp -r`してもいいんですが、差分だけ転送できるのが、rsyncのいいところですので、こんな関数を作ってみました。引数は`rsync_project`にあわせてあります。

動作としては, /tmp/(ディレクトリ名のハッシュ値)/ に一度rsyncしてから、サーバ上で`sudo rsync`しています。

fabtoolsのis_dir関数に依存してるので、`pip install fabtools`が必要です

```python
import hashlib
from fabric.api import local, run, sudo
from fabric.contrib.project import rsync_project
from fabtools.files import is_dir

def root_rsync(local_dir, remote_dir, exclude=[], delete=False):
	def _end_with_slash(dir_path):
    	if dir_path[-1] == '/':
    	    return dir_path
    	else:
    	    return dir_path + '/'
    local_dir = _end_with_slash(local_dir)
    remote_dir = _end_with_slash(remote_dir)
    m = hashlib.md5()
    m.update(remote_dir)
    me = local('whoami', capture=True)
    remote_tmp_dir = '/tmp/%s/%s/' % (me, m.hexdigest())
    run('mkdir -p %s' % remote_tmp_dir)
    if is_dir(remote_dir):
        run('rsync -a %s %s' % (remote_dir, remote_tmp_dir))  # already exists
    rsync_project(
        remote_dir=remote_tmp_dir,
        local_dir=local_dir,
        exclude=exclude,
        delete=delete
    )
    sudo('rsync -a %s %s' % (remote_tmp_dir, remote_dir))
```
整列しなさいな

```shell-session
brenhilt@pc[dir]$ cat sample.txt
ECDHE-RSA-AES256-GCM-SHA384 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384 Kx=ECDH Au=ECDSA Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES256-SHA Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA1
ECDH-ECDSA-AES256-GCM-SHA384 Kx=ECDH/ECDSA Au=ECDH Enc=AESGCM(256) Mac=AEAD
ECDH-RSA-AES128-GCM-SHA256 Kx=ECDH/RSA Au=ECDH Enc=AESGCM(128) Mac=AEAD
ECDH-ECDSA-AES128-GCM-SHA256 Kx=ECDH/ECDSA Au=ECDH Enc=AESGCM(128) Mac=AEAD
ECDH-RSA-AES128-SHA256 Kx=ECDH/RSA Au=ECDH Enc=AES(128) Mac=SHA256
ECDH-ECDSA-AES128-SHA256 Kx=ECDH/ECDSA Au=ECDH Enc=AES(128) Mac=SHA256
AES128-SHA256 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA256
CAMELLIA128-SHA Kx=RSA Au=RSA Enc=Camellia(128) Mac=SHA1
brenhilt@pc[dir]$
```

「よーしパパあまりに見辛いから仕事サボって帰っちゃうぞー（怒」などという怒号が聞こえるかもしれません．
<del>ギターソロ</del> column かもーん♪

```shell-session
brenhilt@pc[dir]$ cat sample.txt | column -t
ECDHE-RSA-AES256-GCM-SHA384    Kx=ECDH        Au=RSA    Enc=AESGCM(256)    Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384  Kx=ECDH        Au=ECDSA  Enc=AESGCM(256)    Mac=AEAD
ECDHE-RSA-AES256-SHA           Kx=ECDH        Au=RSA    Enc=AES(256)       Mac=SHA1
ECDH-ECDSA-AES256-GCM-SHA384   Kx=ECDH/ECDSA  Au=ECDH   Enc=AESGCM(256)    Mac=AEAD
ECDH-RSA-AES128-GCM-SHA256     Kx=ECDH/RSA    Au=ECDH   Enc=AESGCM(128)    Mac=AEAD
ECDH-ECDSA-AES128-GCM-SHA256   Kx=ECDH/ECDSA  Au=ECDH   Enc=AESGCM(128)    Mac=AEAD
ECDH-RSA-AES128-SHA256         Kx=ECDH/RSA    Au=ECDH   Enc=AES(128)       Mac=SHA256
ECDH-ECDSA-AES128-SHA256       Kx=ECDH/ECDSA  Au=ECDH   Enc=AES(128)       Mac=SHA256
AES128-SHA256                  Kx=RSA         Au=RSA    Enc=AES(128)       Mac=SHA256
CAMELLIA128-SHA                Kx=RSA         Au=RSA    Enc=Camellia(128)  Mac=SHA1
brenhilt@pc[dir]$
```

-tの後ろに-s"字"とかつけてdelimiter指定できますので，logとかを眺めるときに便利かもしれません．
mysqladmin コマンド

# DB作成
```bash
mysqladmin -uroot -p create databasename
```

# DB削除
```bash
mysqladmin -uroot -p drop databasename
```

# 権限更新
```bash
mysqladmin -uroot -p flush-privileges
```

# パスワード変更
```bash
mysqladmin -uroot -p password <new-password>
```

# プロセス情報
```bash
mysqladmin -uroot -p proc stat
```
たまにしか使わないのでいつも忘れるVimコマンド


- diffを取る。

```
vertical diffsplit ファイル名
```


- 改行コード一括置換

```
%s/^M//g
```

^Mは、[Ctrl] ＋ [V] キーを押してから、[Ctrl] ＋ [M] キーを押す


- 全空行削除

```
g/^$/d
```

- euc−jpで開き直す。ファイルを開いた状態で、

```
e ++enc=euc-jp
```

- JSONを整形する。jqをインストールしておく。（brewでもportでもいい）
- [jq Tutorial](https://stedolan.github.io/jq/tutorial/)

```
%!jq '.'
```
モダンなプログレスバーを実装するプラグインまとめ

----------------------------------------

順次追加

![Progress.js – 読み込み中のストレス軽減のためのプログレスバー|オープンソース・ソフトウェア、ITニュースを毎日紹介するエンジニア、デザイナー向けブログ](http://images.moongift.jp/2014/02/Screenshot%202014-02-19%2017.21.51_thumb.1d29c3fc5e58b343aea3bccf8acf95c2.png "Progress.js – 読み込み中のストレス軽減のためのプログレスバー|オープンソース・ソフトウェア、ITニュースを毎日紹介するエンジニア、デザイナー向けブログ")
*via [Progress.js – 読み込み中のストレス軽減のためのプログレスバー|オープンソース・ソフトウェア、ITニュースを毎日紹介するエンジニア、デザイナー向けブログ](http://images.moongift.jp/2014/02/Screenshot%202014-02-19%2017.21.51_thumb.1d29c3fc5e58b343aea3bccf8acf95c2.png)*

![モダンなプログレスバーを表示できるJSライブラリ「nanobar.js」:phpspot開発日誌](http://phpspot.net/php/webimager/admin3/data/6efcc200bc4ee88a350499a126f0a1e6.png "モダンなプログレスバーを表示できるJSライブラリ「nanobar.js」:phpspot開発日誌")
*via [モダンなプログレスバーを表示できるJSライブラリ「nanobar.js」:phpspot開発日誌](http://phpspot.net/php/webimager/admin3/data/6efcc200bc4ee88a350499a126f0a1e6.png)*

![フラットな円形のプログレスバーを実装できるjQueryプラグイン「Circliful」:phpspot開発日誌](http://phpspot.net/php/webimager/admin3/data/7675d72684b88cc421a05c5728d31cc0.png "フラットな円形のプログレスバーを実装できるjQueryプラグイン「Circliful」:phpspot開発日誌")
*via [フラットな円形のプログレスバーを実装できるjQueryプラグイン「Circliful」:phpspot開発日誌](http://phpspot.net/php/webimager/admin3/data/7675d72684b88cc421a05c5728d31cc0.png)*