OmniAICreator/Qiita-1.07M huggingface dataset:
怎么设置 mysql 主从复制


###关于 mysql 的复制

mysql 复制也就是能够让你容易的维护数据的多个拷贝.它很有用的. 如备份数据啊. 在不用主数据库的情况下分析数据, 还有就是扩展.
本文主要介绍 mysql 一个主服务器备份数据到一个备库. 涉及到两个 IP 和机器,可以使用 vagrant 来轻松搞定.

假如我们使用 vagrant 来作本 demo. 两个服务器就是:

- 192.168.0.100 master
- 192.168.0.200 slave

###安装

> sudo apt-get install mysql-sever mysql-client vim

###第一步配置主服务器

编辑 mysql 默认配置文件, 主要修改的地方就是修改服务器默认的 IP 地址配置.

> sudo vim /etc/mysql/my.cnf

找到 `bind-address`这个配置项,然后把默认的本地的地址改为当前机器实际在局域网中的地址, 如

> bind-address    = 192.168.0.1000



接着就是本服务器的标示, `server-id`, 默认是`1`,但是是注释了的,放开注释. 还有就是` log-bin` 配置项, 这个文件就是用来作为复制的依据,表明它的位置., 还有一个` binlog_do_db`, 它用来指定需要复制那些数据库的.如我们复制这个数据库,

> binlog_do_db = example

最后,重启数据库.

之后,我们需要登录客户端,给一个假定要复制我们数据的用户给复制权限:

> GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password';

> FLUSH PRIVILEGES;

为了避免此时有人写数据,确保当前要复制的库表没有差异, 我们锁住它,我们这样:

> use example;
> flush tables with read lock;
> show master status;

会得到这样的结果:

```
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      107 | newdatabase  |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
```

这里会有一个位置,来告诉从哪里进行复制. 注意,如果你在同一个终端下有其他的操作的话,这样会释放这个锁的.所以你需要新开一个窗口. 然后因为有锁,你可以导出数据,

> mysqldump -u root -p --opt example > example.sql

你可以释放锁了,现在,

>unlock tables;
> \q



###第二步,配置备服务器

接着我们要搞定备机, 安装 mysql 等都和第一步是一样的.  我们用客户端登录 mysql. 然后创建一个要复制的数据库, 然后导入刚才我们 dump 出来的表结构.

接着,我们同样需要修改 mysql 的配置文件,

```
server-id               = 2
relay-log              = /var/log/mysql/mysql-relay-bin.log
log_bin                 = /var/log/mysql/mysql-bin.log
binlog_do_db    = example
```

这个地方,其实我们已经熟悉了他们的意思,但是` relay-log` 有点陌生. 你需要这样写. 保存, 重启 mysql

接下来,就是给这个服务器注册主服务器了.:

> CHANGE MASTER TO MASTER_HOST='192.168.0.100',MASTER_USER='slave_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=  107;


它干了几点事情呢?

1. 指定了当前服务器是那台机器的备机
2. 登录信息
3. 告诉服务器从哪里开始复制,

然后,开启复制

> start slave

我们看一下当前备机的状态:

> show slave status\G


\G 参数可以让输出更加易读, 如果你在了解备机的时候遇到问题,可以通过下面的命令来搞定:

> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; SLAVE START; 

see more:

1. [怎么设置 mysql 多主复制](http://qiita.com/xiangzhuyuan/items/b366eb5463d7b56e1aaa)
AngularJsでモバイルWebアプリのデザインをする


# 概要

AngularJsでモバイルWebをつくるためのデザインライブラリまとめです。`デザイン`、`動き`を独断で評価しています。


# <a href="https://material.angularjs.org/#/" target="_blank">Angular Material Design</a>

**`Github Star`** 7506
**`デザイン`** ★★★★☆
**`動き`** ★★★☆☆

<a href="https://www.google.co.jp/search?q=Material+Design&oq=Material+Design&aqs=chrome..69i57j69i60l2j69i61j0l2.1033j0j7&sourceid=chrome&es_sm=119&ie=UTF-8" target="_blank">Material Design</a>をAngularJsで使用できる。

* まだベータ版である。
* 普通にMaterial Designを動き含め実装できる。


# <a href="http://mobileangularui.com/" target="_blank">Mobile Angular UI</a>

**`Github Star`** 1566
**`デザイン`** ★★☆☆☆
**`動き`** ★☆☆☆☆

Bootstrap 3 CssでつくられたAngular JS Mobile UI framework。

* これ使うくらいならbootstrapの方がマシ
* なんかサイトがダサい
* 要はBootstrap
* 中途半端な動きのテンプレくらいなら自分で作ったほうが綺麗に作れる
* 導入コストが低いので楽に悪くないものを実装したいときは良さそう

# <a href="http://ionicframework.com/" target="_blank">Ionic</a>

**`Github Star`** 14995
**`デザイン`** ★★★★☆
**`動き`** ★★★★☆

HTML5ハイブリッドアプリのためのFramework。

* ionicは、Webアプリというよりも、ハイブリッドアプリをつくるもの。向いてはいない。
    * Ionic Documentation Overview - Ionic Framework http://ionicframework.com/docs/overview/
    * Welcome to Ionic - Ionic Framework http://ionicframework.com/docs/guide/preface.html
x10でJSON文字列をパースする

x10でJSONをパースする手法について。Managed版のx10を想定。
Javaのjsonライブラリはいくつかあるが、今回は依存ライブラリの少ないjson-simpleを使うことにした。

参考記事: 

- [x10でJavaのメソッドを呼ぶ](http://qiita.com/yohm13/items/66c88136dce96470e9c5)
- [json-simple](https://code.google.com/p/json-simple/)

## 手順

### json-simpleの準備

https://code.google.com/p/json-simple/downloads/list から json-simple-1.1.1.jar をダウンロード。
json-simple ライブラリでjsonのパースをするサンプルコードは以下の場所にある。
https://code.google.com/p/json-simple/wiki/DecodingExamples

### x10からjson-simpleのAPIを呼ぶ

ミニマムなx10のコードは以下のとおり。

```
import x10.io.Console;
import x10.compiler.Native;

import x10.interop.Java;             // Javaのオブジェクトを利用するために x10.interop.Java をimport
import org.json.simple.*;            // json-simpleライブラリのクラスをimport

public class JsonTest {

  public static def main(args:Rail[String]) {
    val s = "[0,{\"1\":{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}}]";
    Console.OUT.println(s);

    val o = JSONValue.parse(s);      // 文字列をJSONとしてパース。返り値はJSONValue型。
    Console.OUT.println(o);
    val a= o as JSONArray;           // 配列にcast。JSONArray型になる。 JavaのArrayListを継承しているクラス。
    Console.OUT.println(a);

    val l = a.get(0n) as Long;       // ０番目の要素を取得。引数には `0n` と書く必要がある。0と書くとLongになり、x10のコンパイルエラーが発生。
    Console.OUT.println(l);
    Console.OUT.println(a.get(1n));
  }
}
```

### ビルドと実行

x10コンパイル時にjarファイルをクラスパスおよびソースパスに含める必要がある。

```shell-session
x10c -sourcepath json-simple-1.1.1.jar -cp json-simple-1.1.1.jar JsonTest.x10
x10 -cp json-simple-1.1.1.jar JsonTest
```
Unityで通信対戦ゲームの通信を考える


## これは何？
ユーザ間の頻繁な交信を目的にコネクションを繋いだ状態でデータを転送したい

# Unityで実装するには何がいいの？

## P2P(相互接続)

### WiFi Direct
* Android Wi-Fi Peer-to-Peer(接続のみ、ローカルでのデータやりとりはBlueToothを使う必要がある)
* iOS MultipeerConnectivity

個別にAPIを実装するのでめんどくさい

### Unity NetWorkViews
ローカルネットワークで可能？(プロトコルの紹介が見つかりません)
Unity間での相互接続でいいよね？

### 特徴
* Android iOS関係なく繋がるはず
* WiFi DirectではないのでWiFiを同一セグメントに設定して繋ぐので使えない予感しかしない

## グローバルで接続
遅延はあるけど、用途によっては問題ない
### node.js
SocketIOでWebSocketで繋げるのが定番
### Photon Unity Networking
Unityでやるには一番無難なのでは
### Google Play Games plugin for Unity
Android,iOSで動作、マッチング機能がGoogle Plusのアカウントだったりと微妙

## ServiceやAssetStore
* [photon](http://blog.photoncloud.jp/photon-sdk-vs-pun/)
* [U3DXT](http://u3dxt.com/)
Berkshelfで必要なdep-selector-libgecodeを入れる

---

CentOS6.6で、Berkshelfをいれようとしたら詰まったので個人メモ

Gemfile

~~~
source "https://rubygems.org"

gem "serverspec"
gem "rake"
gem 'knife-solo'
gem 'berkshelf'
~~~

実行

~~~
$ bundle install --path vendor/bundler
~~~

エラー発生

~~~
・・・
An error occurred while installing dep-selector-libgecode (1.0.2), and Bundler cannot continue.
Make sure that `gem install dep-selector-libgecode -v '1.0.2'` succeeds before bundling.
~~~

ああ、これ実行すればいいのね（安直）

~~~
gem install dep-selector-libgecode -v '1.0.2'
~~~

### 結果、こけまくる。異常に重い

色々な方の記事を読んだ結果、dep-selector-libgecodeのコンパイルはメモリを馬鹿食いするらしい。
そして、一番効果ありそうなmake詐称の記事を参考にさせていただく。

http://qiita.com/ymmtmdk/items/94e610388f8a217fef35

必要そうなパッケージをインストール

~~~
$ sudo yum install -y gcc-c++ autoconf clang clang-devel
~~~

make詐称の準備

~~~
$ mkdir ~/bin/
$ vi ~/bin/make
~~~

下記を追加

~~~
#!/bin/env ruby

puts "---this is ikasama make---"
arg = ARGV
arg = [] if arg == ["-j", "5"]
system("/usr/bin/make #{arg.join(' ')}")
~~~

実行権限を付与

~~~
$ chmod 755 ~/bin/make
~~~

気を取り直して、bundle install

~~~
$ PATH=~/bin/:$PATH CC=clang CXX=clang++ bundle install -V
~~~

結果、すごい時間がかかりましたが、入った模様！

~~~
Bundle complete! 4 Gemfile dependencies, 74 gems now installed.
~~~
Devise 3.x, Rails4.x  で create時に、ActionController::UnknownFormat in Devise::RegistrationsController#new　が出るとき

Deviseを使ってユーザー登録を使用としたら、Devise::RegistrationsControllerの方のrespond_withのあたりでActionController::UnknownFormatエラーが吐かれました。

コントローラーはそれぞれoverrideしたりなんかして使っているのですが、どうやら原因はformの方にあるようでした。

```slim
= simple_form_for(resource, as: resource_name, url: user_registration_path(resource_name)) do |f|

↓↓

= simple_form_for(resource, as: resource_name, url: user_registration_path) do |f|
```

これで通りました。

# References

- http://stackoverflow.com/questions/19193222/rails-4-devise-3-1-1-actioncontrollerunknownformat-in-deviseregistrationscon
YAMLにyes: "はい"って書いたら表示がYesになってしまった

「はい」「いいえ」ボタンを作ろうと思ってymlを書いたけど、viewの表示はなぜか「Yes」「No」ボタン・・・

```
yes: "はい"
no: "いいえ"
```

調べてみたら、予約語があるみたい。
で、予約語は「'」で括ることで使えるんだって。

```
'yes': "はい"
'no': "いいえ"
```

無事解決！


詳しく教えてもらったので追記
http://magazine.rubyist.net/?0009-YAML#l8
ここに書かれているルールが適用されるみたい。

んで、さっきの記述は

```
true: "はい"
```

って書いてるのと同じってことになるので、
それでymlに見つからなかったから「t('yes')」って書いたのが「Yes」って判定されたってことみたいです！

# 参考サイト

* [YAML: Keys like "yes" or "no" evaluate to true and false](http://makandracards.com/makandra/24809-yaml-keys-like-yes-or-no-evaluate-to-true-and-false)
SoftLayerでDNSレコードを一括登録してみた

SoftLayer上の物理サーバー/仮想サーバーの一覧を取得して、プライベートIPアドレスとホスト名に基づくDNSレコードを一括登録するPythonプログラム。

# 実行方法
``$python recordDNS.py``

# プログラム
```lang:recordDNS.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
from prettytable import PrettyTable
import SoftLayer

SL_USERNAME = '<User Name>'
SL_API_KEY = '<API Key>'

_maskVirtualGuest = '''
    hostname,
    primaryBackendIpAddress
    '''

_maskHardware = '''
    hostname,
    primaryBackendIpAddress
    '''

_tableHeader = [
    'hostname',
    'backend_ip'
    ]

def lookup(dic, key, *keys):
    """A generic dictionary access helper.

    This helps simplify code that uses heavily nested dictionaries. It will
    return None if any of the keys in *keys do not exist.
    """
    if keys:
        return lookup(dic.get(key, {}), *keys)
    return dic.get(key)

client = SoftLayer.Client(username=SL_USERNAME, api_key=SL_API_KEY)

virtualGuests = client['Account'].getVirtualGuests(mask=_maskVirtualGuest)
hardwares = client['Account'].getHardware(mask=_maskHardware)

instances = hardwares + virtualGuests

# Table definition
table = PrettyTable(_tableHeader)
table.padding_width = 1

# Get virtualGuests
count = 0
for inst in instances:
    table.add_row(
        [
            inst['hostname'],
            inst['primaryBackendIpAddress'],
        ]
    )
    count = count + 1

print(table)

# Register DNS
count = 0
for inst in instances:
    manDNS = SoftLayer.managers.dns.DNSManager(client)
    zone_id = manDNS.list_zones()[0]['id']
    manDNS.create_record(zone_id, inst['hostname'], 'A', inst['primaryBackendIpAddress'], ttl=900)
    record_id = manDNS.get_records(zone_id, ttl=900)[0]['id']
#   manDNS.delete_record(record_id)
    print inst['hostname'] + " - " + inst['primaryBackendIpAddress']
    count = count + 1
exit()
```
AWS Lambda使ってCloudWatchのAlertをSlackに飛ばしてみた

## 追記(2015/06/18)
この記事はLambdaのトリガーにSNSを使えなかった時の記事です。
現在は可能ですので他の記事を参考にしてください。

## Github
https://github.com/a4t/lambda-cloudwatch-monitaring

## やりたかったこと
- CloudWatchのアラートをSlackに飛ばしたかったので作った

## やりたくなかったこと
- 既存のやり方だとCloudWatch → 中継サーバ → Slackだった
  - 中継サーバの管理面倒くさい
  - そのためだけにサーバ立てるのも勿体無い

## 簡単なロジック説明
- LambdaでCron的なことをするために、自分自身でLambdaのトリガーを発生させる
- CloudWatchのalertを監視する
- アラートあったらSlackに通知
- 何度も飛ぶとうるさいのでファイルロック的なことをS3上でやる

## ポイント
- Lambdaは60秒以上の処理はタイムアウトになるので60秒以内で処理は終わらせる
- 日本はまだLambda対応してないのでS3も海外に置く必要がある
- 全部のアラート監視してしまうとAutoScalingとかも反応してしまうのでSNSのActionでフィルタリングした
  - これでCloudWatchのNotificationに指定したSNSのものしか飛ばない
- プレビューなので動かなくなっても自己責任で！

## 設定項目
```js:config.js
module.exports = {
  bucket              : '', // S3バケット
  s3_region           : '', // S3のリージョン
  cloudwatch_region   : '', // cloudwatchのリージョン
  sns_arn             : '', // Slack通知用のsns

  alert_key_prefix    : '', // alert用ファイルの置き場所
  alert_trigger_file  : '', // Lambdaループ用のファイル

  trigger_write_delay : 30000, // Cronっぽいことのループ間隔、目安時間なので状況によって +5秒前後する 

  slack_url           : '', // Incoming WebHooksのURL
  slack_username      : '', // Slackの通知ユーザー名
  slack_icon_url      : ''  // SlackのアイコンURL
}
```

## 作ってみて思ったこと
node.js書いたことないので結構辛かった。
callback地獄になってpromise使ってみたけど結局汚くなってしまった。
あとエラー処理結構適当なので途中で止まっちゃうかも？(再帰処理してるけどテストしてない)

## Github
https://github.com/a4t/lambda-cloudwatch-monitaring
CodeIQ感謝祭：トップエンジニア伊藤直也のキャリアチェンジ

#イベント概要
* [CodeIQ感謝祭](https://codeiq.jp/magazine/2015/03/22659/)
* 2015/3/26 19:00-
* 株式会社リクルートキャリア　33Fセミナールーム

￼![kobito.1427373168.025922.png](https://qiita-image-store.s3.amazonaws.com/1251/65435/3c142a97-bbf7-6110-fd75-f505374e1aaa.png "kobito.1427373168.025922.png")

[伊藤直也](https://codeiq.jp/magazine/2014/07/12459/)さんによるキャリアのお話でした。

若い時は、「あのサービスを作った人」と呼ばれるようになりたいと思った。
それで作ったのが、はてなブックマーク。
ここまでは順風満帆で進んでいた。

転機は、マネージメント問題。
いろいろ辛いことがあった。一番つらかったのはコードを書く時間が減った。

マネージメントは、会社としては重要だからやる。
でも、やればやるほど、「あのサービスを作った人」と呼ばれる人から遠ざかるジレンマ。
マネージメントの問題が出るのは、大きな組織だから。
小さな組織であれば、コードを書いてられる。

起業家でもするかと思ったが、うっかりドラクエ廃人になっていたことが最大の失敗…。
2000時間ぐらいやってた。

起業をしよう！と思った時の問題は、何を事業にしたらいいのかがわからない。
サービス作ったりしたがリリースまでの気力がわかない。
リリースまで漕ぎ着けるには、周囲の後押しとかが重要なんだと気がついた。

社長ってすごいな。

自分の力を過信し、調子に乗り、現状から逃げていた。
これは、よくなかった。
そんな時に技術顧問の依頼を受けたのではじめてみた。
顧問ってなんだろ？
よくわかんないからボランティアみたいな感覚でやってみたら、**あっさり結果**が出た。

マネージメントてどうなの？と思ってやめたけど、結局マネージメントをやってる。
当初のジレンマは解消していなかった。
そんな時に[任天堂の岩田さんのインタビュー](http://www.4gamer.net/games/999/G999905/20141226033/index_3.html)を受けて納得感があった。

>岩田氏：
　要するに，
「 **自分の好きなことと嫌いなこと**
――もっと言えば，自分がやりたいこととやりたくないこと――を，
**自分が得意なことと得意じゃないことと**イコールだ」
　と思い込んでる人が多いです。本当は，それってかなりズレてるのに。

自分が嫌いと思っていても、 **人から感謝される仕事が結局は自分の得意なこと** なんだなと思った。

マネージメントとしてはやりたいことをマッチングさせること。
快適な仕事が生産性が上がるという保障はない。
本人がやりたいと言ってることと、実際になりたいことが一致しないことがある。
実際にそうなると嬉しいとは限らないことがある。

SIerさんだとわかると思うが、顧客が言っていることと、顧客が本当にしたいことは
ずれていることが多い。
自分で適切に言葉として表現するのは難しい。
だからエンジニアがこうしたい！と言っても、それが本当にやりたいことじゃなくて、
本当にしたいことは別だったりすることもある。

例えば、自宅ワークしたい！て言って、始めたら意外と快適じゃないってことがある。
机があわないとか、だらけちゃうとかがあるので。

**エンジニアのやりたいと表現すること**が、必ずしも本人が不満に思っていることの**解決にならないこと**が多い。
本当に問題なのはなにかを見て、解決してあげることが重要。

自分の希望に合わないことをやった結果、それが高い評価を受けることになっている。
自分の希望を貫き通すと、今の高い評価を受けられる立場にいられなかった。

本人がやりたいと言ってることだけをやってるのが良いとは限らない。
嫌がっていることをやらせることで化けることがある。
でも、それをやりすぎると辞めちゃう。
辞めた先で大活躍する。

キャリアて結構、運に左右されるから難しい。

#マグロ解体ショー

[鮪の匠](http://www.maguronotakumi.com/)によるマグロ解体ショー！！

￼![kobito.1427373116.210890.png](https://qiita-image-store.s3.amazonaws.com/1251/65435/06f97ef5-f8d0-d795-d438-fd01ce90c039.png "kobito.1427373116.210890.png")
【AngularJS】テキストフォームの任意の位置にテキストを挿入するボタン


ブログのリッチエディタなどによくある、テキストフォームの任意の位置にテキスト(リンクタグなど)を挿入するボタンをAngualrJSで実装する方法です。

## 利用ライブラリ

こちらを利用しています。
[angular-caret](https://github.com/eirikb/angular-caret)

## input(type="text")の場合

```html
<input type="text" ng-model="textHoge" eb-caret="caretHoge">
<button ng-click="addHoge()">hoge</button>
```

```coffeescript
$scope.textHoge = 'Lorem Ipsum'

$scope.addHoge = ->
  caret =  $scope.caretHoge.get
  text = $scope.textHoge
  if caret
    former = text.slice(0,caret)
    latter = text.slice(caret)
    $scope.textHoge = former + 'hoge' + latter
  else
    $scope.textHoge += 'hoge'
  return

```

## textareaの場合

```html
<textarea ng-model="textFuga" eb-caret="caretFuga"></textarea>
<button ng-click="addFuga()">fuga</button>
```

```coffeescript
$scope.textFuga = 'Lorem Ipsum'

$scope.addFuga = ->
  caret =  $scope.caretFuga.get
  text = $scope.textFuga
  if caret
    former = text.slice(0,caret)
    latter = text.slice(caret)
    $scope.textFuga = former + '\n' + 'hoge' + '\n' + latter
  else
    $scope.textFuga += '\n' + 'hoge'
  return

```

## 実際のコードはこちら

http://plnkr.co/edit/i5Jqof2IBi5HZDqfZSNa?p=preview


## 簡単な解説

`input(type="text)`あるいは`textarea`に`eb-caret`を設定し、それをコントローラー側で`.get`とすることで、キャレット(カーソルの位置)を取得できるようです。

あとは、それを使って、バインドしているテキストの指定の位置に入れたいテキストを追加するだけですね。

`eb.caret`モジュールを依存性注入することを忘れないようにしてくだい。

```coffeescript
angular
  .module 'app',['eb.caret']
  .controller 'appCtrl',appCtrl
```
チーム開発において、commit直前にESLintを自動実行する

Github(Enterprise)を利用してチーム開発を行っており、開発メンバー全員の環境でpre-commitにてESLintを自動実行したくなった。

けど、.git/hooksにpre-commitを作成してもGithub上で管理できない。。

以下、workaroundをメモとして残す。

# 目的
チーム開発において、commit直前にESLintを自動実行したい。

# 方針
チームメンバー全員の.git/hooks配下にpre-commitを配置するシェルスクリプトを用意する。

# 前提
ディレクトリ構成は以下の通りとする。

├ bin
├ node_modules
└ .git/hooks

# 手順

## package.jsonにESLintを追加する
ESLintが無いと何も始まらないね。

```shell-session
$ npm install eslint --save-dev
```

## コピー元となるpre-commitを作成する
binディレクトリに作成する。
次項のshを実行することにより、このpre-commitが.git/hooks配下にコピーされる。
i.e. 各開発メンバーの.git/hooks配下にコピーされる。

```shell-session:bin/pre-commit
#!/bin/sh

echo "\nValidating·JavaScript:\n"

files=$(git diff --cached --name-only --diff-filter=ACM | grep ".js$")
if [ "$files" = "" ]; then
  echo "\n\033[42mNO FILE MATCHED\033[0m\n"
  exit 0
fi

pass=true

for file in ${files}; do
  result=$(node node_modules/eslint/bin/eslint.js ${file} -f compact | grep "Error")
  if [ "$result" = "" ]; then
    echo "\t\033[32mESLint Passed: ${file}\033[0m"
  else
    echo "\t\033[31mESLint Failed: ${file}\033[0m"
    pass=false
  fi
done

echo "\nJavaScript validation complete\n"

if ! $pass; then
  echo "\033[41mCOMMIT FAILED:\033[0m Your commit contains files that should pass ESLint but do not. Plead fix the ESLint errors and try again.\n"
  exit 1
else
  echo "\033[42mCOMMIT SUCCEEDED\033[0m\n"
  exit 0
fi
```

## bin/pre-commitを.git/hooks配下にコピーするスクリプトを作成する
.git/hooks配下にコピーするスクリプト。
各開発メンバーにこのスクリプトを実行してもらう。

```shell-session:bin/pre-commit.sh
#/!bin/bash

__chmod=`which chmod`

# 起動スクリプトの絶対パスを取得
pushd `dirname $0` >/dev/null 2>&1
[ $? -eq 1 ] && exit 1
__script_dir=`pwd`
popd >/dev/null 2>&1

# 起動スクリプトの絶対パス
__base_dir=`dirname ${__script_dir}`

GIT_HOOKS_DIR=".git/hooks"

__hooks_dir=${__base_dir}/${GIT_HOOKS_DIR}
# make hooks directory
if [ ! -d $__hooks_dir ]; then
    echo "[INFO] make hooks directory"
    mkdir $__hooks_dir
fi

# make pre-commit
__pre_commit_path=${__base_dir}/${GIT_HOOKS_DIR}/pre-commit

if [ -f $__pre_commit_path ]; then
  echo "[INFO] already pre-commit: ${__pre_commit_path}"
  exit 0
fi

echo "[copy pre-commit] ${__pre_commit_path}"
cp ${__base_dir}/bin/pre-commit ${__pre_commit_path}

echo "${__chmod} +x ${__pre_commit_path}"
${__chmod} +x ${__pre_commit_path}

```

# 開発メンバーに共有する
各開発メンバーに

```shell-session
$ bin/pre-commit.sh
```
してもらえばOK。
(ちゃんと実行権限を与えること)

もしくは、

```shell-session
$ npm run setup
```

で環境構築できるようにするとスマート。
トレロカードの作成ルール

#トレロカードの作成ルール
#


##下記のことを心がけながらカードの作成をしてください。
- 読み手の気持ち・状況を考えて書く
- 簡潔に書く
- タイトルを見て内容が想像できる
- 再現手順が正確
- 修正方針が明確
- 複数のエラーが混在せず、問題の切り分けができている
- 投稿前に読み返す  
 
#

##カードのタイトルの作成ルール（カードの一覧画面に出ている部分）##
**【種類】概要**   
*
種類が三つがあって   
・バグ：システムが動作していないか、明らかな欠陥がある。  
・修正:システムの動きは成立するが、期待通りの仕様になっていない。あるいは、バグかどうかは判別できない。  
・改善:今まで存在しない機能を新規開発する。　　　　

## カードの中身(バグ)（カードを開いた時のコンテンツ部分）##
=============以下テンプレート================  
- 機能：機能名称を明記する  
- 環境：(例：本番, staging)  
- URL：- 上記「環境」が「本番のみ」の場合は、skets.jp/、fumu2.skets.jp/ からのURLを記述する  
　　　- 上記「環境」が「本番のみ」以外の場合は、staging.skets.jp/、fumu2.staging.skets.jp/ からのURLを記述する   
- スクリーンショット  
- 再現方法と条件：バグが出るまでのアクション  
- あるべき姿：あるべき姿を教えてください、読み手がsketsの知識があまりない前提で、具体的書いてください。    
- 要求理由：（選択項目）(例：来週から大規模な集客プロモーションが始まるので、今週中のバグ対応をお願いします。)  
- 補足事項：（選択項目）代替手段等、解決を目指して検討した内容があれば、簡単な一言を入れてください。作業者が早目に行動に移すことにつながる。  
=============以上テンプレート================  
#  
#  
##カードの中身（変更/改善）##
- 機能：【バグ】の場合と同じ
- URL：【バグ】の場合と同じ
- スクリーンショット：【バグ】の場合と同じ
[Heroku] HerokuのPostgreSQLにPosticoでアクセスする


## Posticoのインストール
PostgreSQLをGUIで操作しようと思って、[PG Commander](https://eggerapps.at/pgcommander/)をインストールしようとしたところ、どうやら[Postico](https://eggerapps.at/postico/)という名前に変わったようですね。
Free版での制限は以下のようです。
> What are the limitations of the free trial?
> At most 5 connection favorites
> Only a single window per connection
> Table filters are disabled
> There is no time limit — use the trial as long as you want!

ダウンロードして、展開して「Postico.app」をアプリケーションかどこかにおいておきます。

## HerokuにPostgreSQLのAddonをインストール

AddonとしてPostgreSQLがインストールされているかどうか念のため確認します。

```
$ heroku addons | grep POSTGRES
$ heroku addons
<your app name> has no add-ons.
```


PostgreSQLをインストール
検証するためだけなので、今回は```hobby-dev```を利用します。

```
$ heroku addons:add heroku-postgresql:hobby-dev
Adding heroku-postgresql:hobby-dev on <your app name>... done, v5 (free)
Attached as HEROKU_POSTGRESQL_ONYX_URL
Database has been created and is available
 ! This database is empty. If upgrading, you can transfer
 ! data from another database with pgbackups:restore.
```

## PostgreSQLの接続情報確認

以下のコマンドで、PostgreSQLの接続情報を確認しておきます。

```
$ heroku config | grep HEROKU_POSTGRESQL
HEROKU_POSTGRESQL_ONYX_URL: postgres://[ user ]:[ password ]@[ host ]:[ port ]/[ database ]
```

## Posticoでの接続

Posticoを起動し以下を入力後、「connect」をクリックします。
![スクリーンショット 2015-03-27 13.04.07.png](https://qiita-image-store.s3.amazonaws.com/0/31540/08ec4502-31e9-1941-812b-54b6a7b6b756.png "スクリーンショット 2015-03-27 13.04.07.png")
* NickName：適当に設定
* Host：[ host ]
* Port：[ port ]
* User：[ user ]
* Password：[ password ]
* Database：[ database ]

接続に成功すると以下の用になると思います。
![スクリーンショット 2015-03-27 13.20.59.png](https://qiita-image-store.s3.amazonaws.com/0/31540/7cfcc415-4691-9e0e-db9a-e1a4074e72fb.png "スクリーンショット 2015-03-27 13.20.59.png")

## Posticoでのテーブルをみる
シンプルで使いやすそうな気がします。
![スクリーンショット 2015-03-27 14.01.24.png](https://qiita-image-store.s3.amazonaws.com/0/31540/bb3957a7-5dc5-8e6a-66b7-38733246ac3d.png "スクリーンショット 2015-03-27 14.01.24.png")

これから少し使い込んでみたいと思います。
dockerコンテナを動かすにはAtomicHostがチューニング済みで良い

## 検証された記事

* [ベアメタル環境とDockerコンテナ環境の性能比較 | Think IT（シンクイット）](http://thinkit.co.jp/story/2015/03/27/5775)

> 1000件/60秒というアクセス頻度は、通常のWebサーバでCore i7程度のCPU性能があればそれほど高負荷とは言えない状況である。この結果からは、Docker環境を本番環境として利用することは厳しく、何らかの対策が必要だと考えられる。

## 検証された記事に対する対処法

<blockquote class="twitter-tweet" lang="ja"><p>CentOSにデフォ設定でDocker入れたら、**スパースファイルをloopbackマウントしたデバイス**の上にdm-thinが乗るので、性能出ないですよ。ちゃんと物理デバイス（LV）をバックエンドにするように設定変更しないと。<a href="http://t.co/HA4EbSDKqc">http://t.co/HA4EbSDKqc</a></p>&mdash; E. Nakai (@enakai00) <a href="https://twitter.com/enakai00/status/581608675422285825">2015, 3月 28</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


<blockquote class="twitter-tweet" lang="ja"><p>ちなみに、Atomic Hostはデフォ設定で物理デバイス（LV）がバックエンドになるようになってます。<a href="http://t.co/2DNkFkph5G">http://t.co/2DNkFkph5G</a></p>&mdash; E. Nakai (@enakai00) <a href="https://twitter.com/enakai00/status/581609598810857474">2015, 3月 28</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


## 追記

* [Dockerコンテナのパフォーマンス劣化とチューニング | Think IT（シンクイット）](http://thinkit.co.jp/story/2015/05/26/6037)
javaとかのプロセスをとりあえず簡単にデーモン化する

下記のようなシェルスクリプトを作成して実行する。
標準出力はout.log、エラー出力はerr.logに吐かれる。

```bash:run.sh
#!/bin/bash
sudo -u app-user nohup java -cp app.jar com.example.Main > out.log 2> err.log &
```

止めたりするときはkillコマンドで何かのシグナル送るしかない。。。
Django charFieldでmin_lengthを設定する方法


min_lengthはvalidatorを設定することによって使用できる。
ちなみに、validatorはFormとModelどちらにも設定できる。

###Modelでの使用

```Python
from django.db import models
from django.core.validators import MinLengthValidator

class MyModel(models.Model):
    name = models.CharField(max_length=20, blank=True, null=True,validators=[MinLengthValidator(6)])

```

###Formでの使用
```Python
from django import forms
from django.core.validators import MinLengthValidator

class MyModelForm(forms.Form):
	name = forms.CharField(validators=[MinLengthValidator(6)], max_length=20)
```

6文字以上になるように設定してます。


他にもvalidatorはいろいろ機能があったり、自分で作成したりもできるのようです。

参考

[公式ドキュメント](https://docs.djangoproject.com/en/dev/ref/validators/)
knockout.js ObservableもViewModelも使わないHello World

knockout.jsを導入した案件のレビュー時にobservableが大量に定義されたコードをみました。

もしかして、単純に変数を表示できることをわかっていない人が結構いるのではないかと思いました。

一番簡単な例としてHello Worldから書いてみました。

# 最もシンプルなHello World

単純に変数を表示したい場合は、ObservableもviewModelも使いません。

```html
<p data-bind="text:hoge"></p>
```

```js
window.hoge = "hello world"
ko.applyBindings(); //knockoutを実行
```

これを実行するとHello worldが表示されます。

knockoutさえ実行していればdata-bindからJSの変数を参照できます。

実行例

http://jsfiddle.net/4273g42d/

# ViewModelをつかったサンプル

次はviewModelを使ってみます。

viewModelを指定するとhtmlから参照するthisがwindowからviewModelにかわります。
window下のhogeはwindow.を付けくわえます。

```html
<h1 data-bind="text:window.hoge"></h1>
<h1 data-bind="text:hoge"></h1>
```

```js
window.hoge = "hello world";

var viewModel = function(){
    this.hoge = "hello world view model";
};

ko.applyBindings(new viewModel()); //knockoutを実行
```

http://jsfiddle.net/zusrgzo7/

# 変更に追随して変わるサンプル

次に変更にあわせて表示がかわるサンプルです。
observableという関数を定義しておくとHTMLを書いたあとに
observableを実行すると結果にあわせてHTMLの書き換え処理が走ります。


```html
<h1 data-bind="text:window.hoge"></h1>

<h1 data-bind="text:$root.hoge1"></h1>

<h1 data-bind="text:$root.hoge2"></h1>
```

```js

window.hoge = "hello world";

var viewModel = function(){
    this.hoge1 = "hello world view model";
    this.hoge2 = ko.observable("hello world view model");
};
var vm = new viewModel();

ko.applyBindings(vm); //knockoutを実行

vm.hoge1 = "Goodbye!!";//HTMLが変化しない。
vm.hoge2("Goodbye!!");//HTMLが変化する。

```
http://jsfiddle.net/u0o90e5L/1/

observableで定義しないと書き換え処理は走らないので、
書き換えたいところはobservableで定義します。

observableは便利なのですがけっこう重たいので、
なんでもobservableで書くというのはひかえたほうがいいです。

量が増えるととても重くなります。

わかっている人に説明すると
だからなに？なのかもしれないですが。

tutorialでいきなりviewModelとobservableがでてくるのでなくては動かないものと
誤解されているのかなぁーと思ったので書いてみました。
git fetch する度に"Auto packing the repository in background for optimum performance." が出る

1年ぐらい毎日コミットし続けているディレクトリの話

```
Auto packing the repository in background for optimum performance.
See "git help gc" for manual housekeeping.
```

`git gc` しても出続けていた。

[Why does git keep telling me it's "Auto packing the repository in the background for optimum performance" - Stack Overflow](http://stackoverflow.com/questions/28633956/why-does-git-keep-telling-me-its-auto-packing-the-repository-in-the-background) を参考に

```
git fsck
```

をしたらどのコミットからも参照されていないdanglingオブジェクトが大量にあった。
rebaseやaddした時に結局コミットしない、とかの状況で溜ってゆくようだ。
通常`git gc`で排除されそうなんだけど消えていないっぽい。

```
git gc --prune=now
```

したらこの警告は出なくなった

`--prune`はデフォルト2 weeksなので2週間以内のオブジェクトも対象にするために`now`を指定している。

```
$ git count-objects -v
count: 0
size: 0
in-pack: 65065
packs: 1
size-pack: 304391
prune-packable: 0
garbage: 0
size-garbage: 0
```
SVNから他サーバのSVNに移動する

# SVNから他サーバのSVNに移動する

バージョン管理サーバを１つにまとめるため、SVNを別のサーバへ移動しました。
意外とほしい情報が見つからなかったためまとめます。

## 環境
移動元:

種類 | 内容
----- | -------
マシン | Linuxサーバ
SVNバージョン | 1.6.21
リポジトリ | /export/svn/ripoA/javaprj

移動先：

種類 | 内容
----- | -------
マシン | WindowsFoundationサーバ
SVNバージョン | 1.8.5
リポジトリ | C:\Repositries\\ripoB\\javaprj


## 1. 移動元データのダンプ
1. Linuxサーバにログインします。
2. 移動元データのダンプしたいディレクトリまで移動します。
3. 下記コマンドを実行します

```shell-session:csh
svnadmin dump /export/svnroot/shitenjukyu/document > /var/tmp/docproject.dat
```

## 2. ダンプの移動
WinSCPなどを使用してPCのローカルにdatファイルを保存します。

## 3. 移動先SVNにリポジトリを作成
1. VisualSVNServerを起動します
2. 左のウインドウの「Repositries」の上で右クリックをし、「CreateNewRepository」を選択します
    1. リポジトリ名「ripoB」を入力して「次へ」を選択します
    2. 「Empty repository(recommended option)  」を選択されているのを確認して「次へ」を選択します
    3.  ユーザの参照権限のうち適当なものを選択します。特に制約を設けないSVNでしたので「All Subversion users have Read / Write access」を選択し「Create」を選択します。
    4.  「Finish」を選択します
3. 左のウインドウに「ripoB」が作成されていることを確認します

　　　　「ripoB」の中に何も作成されていないことを確認します。


## 4. 移動先SVNにロード
1. コマンドプロンプトを起動
2. 移動したダンプファイルのあるディレクトリに移動
3. SVNダンプファイルをロードする。

```shell-session:cmd
svnadmin load --parent-dir project C:\Repositories\winripo\ < project.dat`
```

載せ替え終わり。

これで新しいサーバからチェックアウトできるようになります。

[svnadmin load]で検索をすれば上記の情報はすぐに手に入るのですが、そこにたどり着くまでにだいぶかかってしまいました。。
東方Projectみたいなゲーム画面分割表示

#概要
東方Project風画面レイアウト再現サンプル。DXライブラリでの作成。一応、サンプルプログラム実行用フォルダのtest.cppに貼り付けられる形で作った。

#ソース
```c++:main.cpp
#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    int TestHandle , handle, BackHandle ;

    if( DxLib_Init() == -1 )    // ＤＸライブラリ初期化処理
    {
         return -1;    // エラーが起きたら直ちに終了
    }

	// test1.bmpの読み込み
	TestHandle = LoadGraph( "test1.bmp" ) ;

	// back.bmpの読み込み
	BackHandle = LoadGraph( "back.bmp" ) ;

	// 384x448サイズのアルファチャンネルなしの描画可能画像を作成する
    handle = MakeScreen( 384, 448, FALSE ) ;

    // 作成した画像を描画対象にする
    SetDrawScreen( handle ) ;

    // 上に載せるグラフィックを描画
    DrawGraph( 255 , 0 , TestHandle , TRUE ) ;

	// 画面中央100奥に表示
	DrawBillboard3D( VGet(384.0f/2, 448.0f/2, 100.0f), 0.5f, 0.5f, 120.0f, 0.0f, TestHandle, TRUE);

    // 描画対象を表画面にする
    SetDrawScreen( DX_SCREEN_FRONT ) ;

    // 背景を描画
    DrawGraph( 0 , 0 , BackHandle , FALSE ) ;

	// 画像を描画
	DrawGraph( 32 , 16 , handle , FALSE ) ;

    WaitKey() ;            // キーの入力待ち(『WaitKey』を使用)

    DxLib_End() ;            // ＤＸライブラリ使用の終了処理

    return 0 ;            // ソフトの終了
}
```
#結果
![th.png](https://qiita-image-store.s3.amazonaws.com/0/64298/c0dacaf5-5143-58c9-34a4-b9eb3443f36e.png)

#編集履歴
2017/02/17 なぜか末尾の}が脱字していたので修正
x10でJavaのメソッドを呼ぶ

Managed版(Java backend))のx10から、Javaで実装されたクラスを使う方法です。
並列化の部分をx10にまかせつつ、既存のJavaの資産を使うことができます。
**Java interoperability** feature とよばれています。

参考資料:
- http://x10.sourceforge.net/documentation/languagespec/x10-latest.pdf の18章2節

まずJavaのクラスを用意します。

```java:MyClass.java
class MyClass {

  int i;

  MyClass() {
    System.out.println("Constructed.");
    i = 5;
  }

  public int GetI() {
    return i;
  }
}
```

Javaのコードをビルドします。 `javac MyClass.java`

次にx10側のコードです。

```MyNativeClass.x10
import x10.io.Console;
import x10.interop.Java;               // x10.interop.Java をimportする

public class MyNativeClass {

  public static def main( args:Rail[String] ) {
    val o = new MyClass();             // Javaのオブジェクトをnewする
    Console.OUT.println( o.GetI() );   // インスタンスメソッドを呼ぶ
  }
}

```

重要な点は `import x10.interop.Java` を書くことです。すると普通にJavaのオブジェクトが呼べます。
コンパイルするときは、クラスファイルがあるパスを `-cp`オプションで指定します。
**事前にjavacでjavaのコードをコンパイルしておく必要があります。**

コンパイルと実行のコマンドは以下のようになります。

```
x10c -cp . MyNativeClass.x10     # カレントディレクトリでも -cp で指定する必要あり
x10 MyNativeClass                # カレントディレクトリであれば-cpはいらない
```
Sequelでmysql2アダプタを使っていて「too many connections」とエラーが出た時の対処


## 「Too many connection」エラーが出た
```sh
Sequel::DatabaseConnectionError - Mysql2::Error: Too many connections:
```

## mysqlの接続数確認。
```sh
$ mysqladmin -u root -proot extended-status | grep -E "Max|Threads"
| Max_used_connections                          | 152         |
| Threads_cached                                | 0           |
| Threads_connected                             | 10          |
| Threads_created                               | 505         |
| Threads_running                               | 1           |

$ mysqladmin processlist -u root -p
+-----+------+-----------+-------------+---------+------+-------+------------------+----------+
| Id  | User | Host      | db          | Command | Time | State | Info             | Progress |
+-----+------+-----------+-------------+---------+------+-------+------------------+----------+
| 19  | user | localhost | db1         | Sleep   | 7856 |       |                  | 0.000    |
| 497 | user | localhost | db1         | Sleep   | 182  |       |                  | 0.000    |
| 498 | user | localhost | db1         | Sleep   | 182  |       |                  | 0.000    |
| 499 | user | localhost | db1         | Sleep   | 164  |       |                  | 0.000    |
| 501 | user | localhost | db1         | Sleep   | 155  |       |                  | 0.000    |
| 502 | user | localhost | db1         | Sleep   | 155  |       |                  | 0.000    |
| 504 | user | localhost | db1         | Sleep   | 155  |       |                  | 0.000    |
| 507 | root | localhost |             | Query   | 0    | init  | show processlist | 0.000    |
+-----+------+-----------+-------------+---------+------+-------+------------------+----------+
```
以前使ったプロセスがずっと残ってる……

## sequelでmysql2アダプタで接続した時のデフォルトのtimeout値は1ヶ月
[マニュアル](http://sequel.jeremyevans.net/rdoc/files/doc/opening_databases_rdoc.html#label-mysql+ "opening_databases.rdoc")によると、```timeout```オプションのデフォルト値は1monthとなっている。

## 対処法：接続の際に```timeout```オプションを設定する
```ruby
require 'sequel'
require 'mysql2'
db=Sequel.mysql2(user:"user",password:"pw",database:"db1",charaset:"utf8",timeout:"60")
```

timeoutオプションを設定する。
引数は秒数。
上記の設定だと、```Sleep```状態のプロセスは60秒で終了する。

但し、過去に生成したプロセスには効果が無いので、一旦Mysql（Mariadb）サーバを再起動すること。
複数のリモートデスクトップ接続を一元管理できるRemote Desktop Connection Manager（RDCMan）


## Remote Desktop Connection Manager（RDCMan）とは？

* 複数のリモートデスクトップ接続を一元管理できるツール（Microsoft社製）
* 英語版のみ
* http://www.microsoft.com/en-us/download/details.aspx?id=44989

## 特徴
* ホストをグループ化・階層化できる（例：開発環境グループ・評価環境グループ）
![RDCMan.jpg](https://qiita-image-store.s3.amazonaws.com/0/10862/b7b6f611-e7fe-f2f9-f73e-ed8e873112ae.jpeg)

* ダブルクリック一発でログインできる

* 階層化することで、共通の設定（ユーザ・パスワード）を継承できる
![RDCMan_properties.jpg](https://qiita-image-store.s3.amazonaws.com/0/10862/4da3897e-ce09-c454-1578-83ad146a42b2.jpeg)

## 他のメリット
* 同じホストでも複数ユーザを使い分けたい場合、それぞれのユーザごとに設定を作っておけば、ユーザ切り替え簡単
* グループで一括で接続・切断できる（使うかな。。。）
* 設定をXMLで持っているので、インポート・エクスポートが可能

## 注意点

* 設定を継承する場合、ユーザ・ドメインだけ継承してパスワードだけ個別に設定、みたいなことはできない
  * ユーザ・パスワード・ドメイン一括で継承 or 全て個別に設定
* 設定をエクスポート -> インポートした場合、パスワードはインポートできない？
puppetserverのログ出力をデバッグにする

!!!!XML!!!! を以下の感じにする。

```xml
<configuration scan="true">
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d %-5p [%c{2}] %m%n</pattern>
        </encoder>
    </appender>

    <appender name="F1" class="ch.qos.logback.core.FileAppender">
        <!-- TODO: this path should not be hard-coded -->
        <file>/var/log/puppetserver/puppetserver.log</file>
        <append>true</append>
        <encoder>
            <pattern>%d %-5p [%c{2}] %m%n</pattern>
        </encoder>
    </appender>

    <!-- ここをDEBUGにする -->
    <logger name="org.eclipse.jetty" level="DEBUG"/>

    <!-- ここもdebugにする -->
    <root level="debug">
        <!--<appender-ref ref="STDOUT"/>-->
        <appender-ref ref="${logappender:-DUMMY}" />
        <appender-ref ref="F1"/>
    </root>
</configuration>
```

* http://docs.puppetlabs.com/puppetserver/latest/configuration.html#logging
WANとLANの間に入るキャッシュが欲しい

![xx.png](https://qiita-image-store.s3.amazonaws.com/0/5222/7ccc7408-a2f4-6990-2347-80ab9f5bf68e.png "xx.png")

みんなが幸せになれるような気がする
何をキャッシュするか予測してくれたらなおいい

https://www.google.co.jp/search?client=safari&rls=en&q=wan+%E9%AB%98%E9%80%9F%E5%8C%96&ie=UTF-8&oe=UTF-8&gfe_rd=cr&ei=HNgUVZX0B7T98wex4oGwBQ#rls=en&q=wan%E9%AB%98%E9%80%9F%E5%8C%96%E8%A3%85%E7%BD%AE

自分が知らなかっただけでWAN高速化装置っていっぱいあんのね
Google driveがちょっぱやになってくれればいいんだけど。。
TextViewのmaxLengthのサロゲートペア対応(絵文字に対応した文字数制限)

AndroidのTextViewやEditTextはレイアウトXMLでmaxLengthを指定することで入力文字数を制限することができます。
しかし、Unicodeのサロゲートペアで表現される絵文字などは、２文字分として判定されてしまうため、正確な制限ができません。
maxLengthはandroid.text.InputFilter.LengthFilterで実現されています。
これを改造してサロゲートペアに対応することで、正確な入力文字数制限を実現しました。

```java

import android.text.InputFilter;
import android.text.Spanned;
 
/**
 * サロゲートペア対応版のLengthFilter
 */
public class InputLengthFilter implements InputFilter {
    private final int mMax;
 
    public InputLengthFilter(int max) {
        mMax = max;
    }
 
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest,
                               int dstart, int dend) {
        int realLen = dest.toString().codePointCount(0, dest.length());
        int keep = mMax - (realLen - (dend - dstart));
        if (keep <= 0) {
            return "";
        } else if (keep >= end - start) {
            return null; // keep original
        } else {
            keep += start;
            if (Character.isHighSurrogate(source.charAt(keep - 1))) {
                return source.subSequence(start, keep + 1);
            }
            return source.subSequence(start, keep);
        }
    }
    
    public int getMax() {
        return mMax;
    }
}
```

TextField#setFilters()に上記のクラスのインスタンスを渡すことで文字数を制限できます。
composer updateがPHPのメモリ制限に引っかかってできない時

新規にプロジェクトを設置してcomposer updateしたら以下のエラーがでて行えなかった。

PHP Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 32 bytes) in phar:///usr/local/src/composer.phar/src/Composer/DependencyResolver/Solver.php on line 707

# 対処方法
## php.iniの設定を変える

1.php.ini開く
vim /etc/php.ini

2.php.ini内で検索
/memory_limit

memory_limit = 128M

3.適宜変更
memory_limit = 1024M

4.apacheリスタート
/etc/init.d/httpd restart
composer update時に指定する

## 実行時のオプションで頑張る
php -d memory_limit=768M /usr/local/src/composer.phar update

基本的にphp.iniを設定すると他のプログラムにも影響があるから、実行時のオプションで頑張ったほうがよい。
Fragment in FragmentはgetChildFragmentManager()

FragmentPagerAdapter内のFragmentの管理というか、動作が上手くいかず、ハマった。
公式リファレンスちゃんと読めよという事だと思うが、反省もかねて備忘録

Fragmentのネスト（入れ子）構造は、FragmentManagerとかでやるやつで、よく見ると思うのですが、
いつも、Activity内でFragmentを使っていた為、Fragment内でFragmentを使う時も同様だろうと思っていた。
しかし、上手く作動しない。
Fragment内でFragmentを使う場合、つまりFragment in Fragmentは
```getChildFragmentManager()```
を使うとの事。
React Nativeを実機で動かす方法


ひと通り[チュートリアル](http://facebook.github.io/react-native/docs/tutorial.html#content)をやってみていざ実機転送してみようとするとこんなエラーが出てきた。
![IMG_3321.PNG](https://qiita-image-store.s3.amazonaws.com/0/2569/f67f29fd-ad65-7201-895f-0e378c3d14ef.png "IMG_3321.PNG")



ドキュメントになかったのでしばらく悩んだけど普通に```AppDelegate.m```にコメントで書かれてました。

どうやらReact Nativeは処理自体はサーバで実行されているみたい。実機で動かす方法は、PCで立ち上げたサーバにアクセスする方法と、そのサーバごとアプリ内にバンドルする２つの方法が用意されているみたいです。PCで立ち上げたサーバにアクセスするのはデバッグするとき用でしょうね。

もちろんこれだと実機単体で動かせないので、その場合は OPTION 2 のサーバをアプリ内にバンドルする方法を使います。curlコマンドで出力した ```main.jsbundle``` をXcodeプロジェクトに追加してあげるとアプリ内で読み込めるようになり、実機単体で動くようになりました。

```Objective-C
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  NSURL *jsCodeLocation;

  // Loading JavaScript code - uncomment the one you want.

  // OPTION 1
  // Load from development server. Start the server from the repository root:
  //
  // $ npm start
  //
  // To run on device, change `localhost` to the IP address of your computer, and make sure your computer and
  // iOS device are on the same Wi-Fi network.
//  jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle"];

  // OPTION 2
  // Load from pre-bundled file on disk. To re-generate the static bundle, run
  //
  // $ curl http://localhost:8081/index.ios.bundle -o main.jsbundle
  //
  // and uncomment the next following line
  jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];

  RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
                                                      moduleName:@"AwesomeProject"
                                                   launchOptions:launchOptions];

  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  UIViewController *rootViewController = [[UIViewController alloc] init];
  rootViewController.view = rootView;
  self.window.rootViewController = rootViewController;
  [self.window makeKeyAndVisible];
  return YES;
}
```

![IMG_3322.PNG](https://qiita-image-store.s3.amazonaws.com/0/2569/75291eaa-18ca-8cbd-c4f0-349a72574bce.png "IMG_3322.PNG")
Rails4のマイグレーション時で発生するtimestampのDEPRECATION WARNINGの消し方

Rail 4を使っている人で、マイグレーション中に以下のメッセージが見たことがある人がいるかあると思います。

```
$ bin/rake db:migrate
```

```
DEPRECATION WARNING: `#timestamp` was called without specifying an option for `null`. In Rails 5, this behavior will change to `null: false`. You should manually specify `null: true` to prevent the behavior of your existing migrations from changing. 
```

これは、Rails5からtimestampsのデフォルトが`null: true`から、`null: false`に変わるため`null`が設定されてない場合に、WARNINGエラーが発生するようになっています。

例えば、activeadminを使っていて自動生成されるマイグレーションコードには、`timestamps`に`null: false`がないため、エラーがでます。

```
def self.up
  create_table :active_admin_comments do |t|
    t.timestamps
  end
end
```

ということで、対策する場合は`null: false`を入れておけばWARNINGエラーを消すことができます。

```
def self.up
  create_table :active_admin_comments do |t|
    t.timestamps null: false
  end
end
```


# 参考
[rails commit log流し読み(2014/08/18)](http://y-yagi.hatenablog.com/entry/2014/08/19/071430)

該当ソースコード：
[Merge pull request #16481 from sgrif/sg-change-default-timestamps](https://github.com/rails/rails/commit/7ee055076ec2c5b2e9c110f821c10fe06bf38a1c)
React Nativeのメモ


React Native(http://facebook.github.io/react-native/) を触ってみたときのメモ。
似たような記事はあると思うが、あくまでも自分用。
随時更新。

# React Native
* JavaScriptとReactでNativeアプリの開発・ビルドができるフレームワーク
* learn once, write anywhere.
 * 要するにReact知っていればどのプラットフォームでの開発も効率的にできるようになるよーってこと(だと思う)

# はじめ方

http://facebook.github.io/react-native/docs/getting-started.html　
を参照してね

必要なものはMacでXcodeが動いている必要があること(iOSの開発だから当然)
あとhomebrew とかで Node.jsとflowをいれておく
あとは

```shell-session:
$ npm install -g react-native-cli
$ react-native init hello
```

みたいにやってXcodeのプロジェクトを生成し、
XCodeを開いてcmd+R で実行。
index.io.jsを編集したら Cmd+Rでリロードできる

# Native iOS Components
UITabBarのようなiOSのNativeコンポーネントも使える

例えばTabBarを使ったときはこんな感じ

```javascript:
var hello = React.createClass({
  getInitialState: function() {
      return {
          selectedTab: 'hello'
      };
  },
  render: function() {
    return (
      <TabBarIOS selectedTab={this.state.selectedTab}>
        <TabBarIOS.Item 
          name="Hello" 
          selected={this.state.selectedTab === 'hello'} 
          icon={{uri:'favorites'}} 
          onPress={() => {
              this.setState({
                  selectedTab: 'hello',
              });
          }}>
          <View style={styles.container}>
            <Text style={styles.welcome}>
              Hello World.
            </Text>
          </View>
        </TabBarIOS.Item>
        <TabBarIOS.Item 
          name="top" 
          selected={this.state.selectedTab === 'top'}  
          icon={{uri:'favorites'}}
            onPress={() => {
                this.setState({
                    selectedTab: 'top',
                });
            }}>
          <View style={styles.container}>
            <Text style={styles.welcome}>
               Welcome to React Native!
            </Text>
            <Text style={styles.instructions}>
               To get started, edit index.ios.js{'\n'}
               Press Cmd+R to reload
            </Text>
          </View>
        </TabBarIOS.Item>
      </TabBarIOS>
    );
  }
});
```

![screenshot_react.png](https://qiita-image-store.s3.amazonaws.com/0/4044/222da302-79ee-1c0a-2e92-5fea2061c066.png "screenshot_react.png")

# 合わせて読みたい
https://code.facebook.com/posts/1014532261909640/react-native-bringing-modern-web-techniques-to-mobile/
YosemiteでRubyCocoaを使う

RubyからMacのスクリーンショットを撮るためにCocoaを使いたかったので、
["RubyからMac OS Xのスクリーンショットを撮る"](http://d.hatena.ne.jp/kaityo/20120802/1343903393)を参考にしてやろうと思ったのだけど、

```
require 'osx/cocoa'
```
でつまづいた。

["Yosemite用のRubyCocoa 1.2.0インストーラを公開"](http://d.hatena.ne.jp/kimuraw/20141030/p1)を参考にRuby2.0用のRubyCocoaをインストールしたのだけど、システム標準ではなくrbenvでRuby2.1.2を入れて使っていたため、まだうまく動かない。

いろいろ調べてみたけど、["MacOSXでwkpdfを使ってみた"](http://www.nishimiyahara.net/2013/08/28/154900) にも書いてあるように、rbenvでいれたRubyを使うのは良くなくて、そのプロジェクトだけシステム標準のRubyを使うのが良いっぽい。

```
$ mkdir foo_project
$ cd foo_project
$ rbenv local system
```
ってすれば、`foo_project`のディレクトリ内で問題なく

```
require 'osx/cocoa'
```
ができた。
QUnitのメモ

# 概要
JQueryのテストツールを調べたみる ※逐次更新

## 最小環境

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>QUnit Example</title>
    <link rel="stylesheet" href="https://code.jquery.com/qunit/qunit-1.17.1.css">
  </head>
  <body>
    <div id="qunit"></div>
    <div id="qunit-fixture"></div>
    <script src="https://code.jquery.com/qunit/qunit-1.17.1.js"></script>
    <script>
      QUnit.test( "hello test", function( assert ) {
        assert.ok( 1 == "1", "通ったよ" );
        assert.ok( 1 == "2", "通らないよ" );
      } );
    </script>
  </body>
</html>
```
デモ
http://codepen.io/YamasakiKenta/pen/OPqPgV

参考
http://blog.mwsoft.jp/article/115089548.html



## 非同期
参考
http://dev.classmethod.jp/etc/javascript_testing_framework_qunit-3/
Processing.jsを使ってみる （４）

## はじめに
[前回](http://qiita.com/Souj/items/cc4037995ec77d043bed)、Fx0（Firefox OS）でProcessing.jsが動作することが確認できたので、今回は公式ページのサンプルをいくつか動かしてできることを確認してみます。

## サンプルを動かす
サンプルは以下３つの環境で動かします。

- Processing実行環境
- PC上のFirefoxブラウザ
- Fx0上のアプリ

### Recursion
静的な円の描画の[サンプル](https://processing.org/examples/recursion.html)です。３つの環境で同じように表示されました。
![Recursion.png](https://qiita-image-store.s3.amazonaws.com/0/72852/e9894a2a-e4aa-4881-ead5-aa3435ecc3ae.png)

### clock

時計の[サンプル](https://processing.org/examples/clock.html)です。長針が1秒毎に動きます。３つの環境で同じように動作しました。
![clock.png](https://qiita-image-store.s3.amazonaws.com/0/72852/867d4011-87bd-d63f-e57f-606468ff5282.png)

### Flocking
複数の三角の図形が移動する[サンプル](https://processing.org/examples/flocking.html)です。
PC(Firefox)は滑らかに動きましたが、Fx0(Firefox OS)は動作が非常に遅くなりました。
![flocking.png](https://qiita-image-store.s3.amazonaws.com/0/72852/79195517-654a-d0bd-c3c2-a00d112ae5eb.png)

## まとめ
Processing.jsを使用することで、Processing実行環境と同じ動作をすることが確認できました。

ただし、他にもサンプルを実行してみた結果、Fx0の場合以下の問題が見られました。

- マウスの動きに追従する動作が正しく動かない場合があった。
- サンプルにより動作が非常に遅い現象がみられた。

Fx0の場合、静的なものは問題ありませんが、複雑な動きを伴うものは難しいかなという印象ですので、Processing.jsを使う場合はプログラムの作りを工夫する必要がありそうです。

[Processing.jsを使ってみる](http://qiita.com/Souj/items/6729925a0145372e3e51)
[Processing.jsを使ってみる （２）](http://qiita.com/Souj/items/fe8aa34f1b1339a94427)
[Processing.jsを使ってみる （３）](http://qiita.com/Souj/items/cc4037995ec77d043bed)
Tmuxinatorをbundlerから使ったらハマった


自分の環境以外ではなかなか起こりそうにないレアなハマり方っぽいですがメモとして残しておきます。

## 背景
Tmuxでセッションを再現するためのRubyで実装されたラッパーのTmuxinatorですが、 `gem install` で使われる事が想定されています。
自分はgemでインストールするソフトウェアもHomebrewにおけるBrewfileのようにdotfilesで管理したいと思っているので、dotfilesにGemfileを置いて、そこでbundlerを使ってインストールするようにしています。
更にグローバルな環境を汚染したくないため、 `bundle install --path=vendor/bundle --binstubs=vendor/bin` を実行した上（毎回書くの面倒だからRakeタスクに書いてる）で `~/dotfiles/vendor/bin` にパスを通してそこに置いてあるファイルを実行するという方式でアプリケーションを起動していました。

## 起こったこと
Tmuxinatorで起動したtmux上でgemやbundleが正常に動作しない。
具体的には

- gemコマンドが何をしてもエラーになる
- bundle結果がそのディレクトリのGemfileを使ってくれない
- `gem uninstall`を実行するとエラーを吐いてgemが一切動かなくなる

などといった症状が出ました。
辛い

## 解決
検索してみると「tmuxinator rbenv」が候補として出てくるのでこのあたりが怪しいなと思って見ていると、環境変数の汚染が発生しているIssueが見つかりました。
[auto setting RBENV_VERSION · Issue #99 · tmuxinator/tmuxinator](https://github.com/tmuxinator/tmuxinator/issues/99)

この問題は既に解決しており、tmux起動時に環境変数が初期化されるようになっているようなのですが、bundlerを経由していることでこれに近い現象が発生しているのではないかと思い、起動前と起動後で環境変数のdiffを取ってみました。

結果として

```
BUNDLE_BIN_PATH
BUNDLE_GEMFILE
GEM_HOME
GEM_PATH
RUBYLIB
RUBYOPT 
```
が上書きされていました。

なので、tmux起動時にその辺の環境変数を一旦初期化する処理を挟めば正常にbundlerが動作するようになりました。

```
set-environment -gu BUNDLE_BIN_PATH
set-environment -gu BUNDLE_GEMFILE
set-environment -gu GEM_HOME
set-environment -gu GEM_PATH
set-environment -gu RUBYLIB
set-environment -gu RUBYOPT 
```
homebrewでngx_small_lightがバンドルされたnginxをインストール

https://github.com/Homebrew/homebrew-nginx/pull/83

homebrew/nginxをtapするとngx_small_lightがインストールできるようになったらしいので試してみました。

```console
$ brew tap homebrew/nginx
$brew info nginx-full | grep small-light
--with-small-light-module
$
```

nginx-fullの方に`--with-small-light-module`オプションが追加されているので、これを利用すればよさそうです。

```console
$ brew install nginx-full --with-small-light-module
==> Installing nginx-full from homebrew/homebrew-nginx
==> Installing nginx-full dependency: small-light-nginx-module
==> Downloading https://github.com/cubicdaiya/ngx_small_light/archive/v0.6.6.tar.gz
Already downloaded: /Library/Caches/Homebrew/small-light-nginx-module-0.6.6.tar.gz
�  /usr/local/Cellar/small-light-nginx-module/0.6.6: 33 files, 232K, built in 2 seconds
==> Installing nginx-full
==> Downloading http://nginx.org/download/nginx-1.6.2.tar.gz
######################################################################## 100.0%
==> ./setup
==> ./configure --prefix=/usr/local/Cellar/nginx-full/1.6.2 --with-http_ssl_module --with-pcre --with-ipv6 --sbin-path=/usr/local/Cellar/nginx-full/1.6.2/bi
==> make
==> make install
==> Caveats
Docroot is: /usr/local/var/www

The default port has been set in /usr/local/etc/nginx/nginx.conf to 8080 so that
nginx can run without sudo.

- Tips -
Run port 80:
 $ sudo chown root:wheel /usr/local/Cellar/nginx-full/1.6.2/sbin/nginx
 $ sudo chmod u+s /usr/local/Cellar/nginx-full/1.6.2/sbin/nginx
Reload config:
 $ nginx -s reload
Reopen Logfile:
 $ nginx -s reopen
Stop process:
 $ nginx -s stop
Waiting on exit process
 $ nginx -s quit

To have launchd start nginx-full at login:
    ln -sfv /usr/local/opt/nginx-full/*.plist ~/Library/LaunchAgents
Then to load nginx-full now:
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.nginx-full.plist
==> Summary
�  /usr/local/Cellar/nginx-full/1.6.2: 7 files, 940K, built in 20 seconds
$ /usr/local/bin/nginx -V
nginx version: nginx/1.6.2
built by clang 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
TLS SNI support enabled
configure arguments: --prefix=/usr/local/Cellar/nginx-full/1.6.2 --with-http_ssl_module --with-pcre --with-ipv6 --sbin-path=/usr/local/Cellar/nginx-full/1.6.2/bin/nginx --with-cc-opt='-I/usr/local/include -I/usr/local/opt/pcre/include -I/usr/local/opt/openssl/include' --with-ld-opt='-L/usr/local/lib -L/usr/local/opt/pcre/lib -L/usr/local/opt/openssl/lib' --conf-path=/usr/local/etc/nginx/nginx.conf --pid-path=/usr/local/var/run/nginx.pid --lock-path=/usr/local/var/run/nginx.lock --http-client-body-temp-path=/usr/local/var/run/nginx/client_body_temp --http-proxy-temp-path=/usr/local/var/run/nginx/proxy_temp --http-fastcgi-temp-path=/usr/local/var/run/nginx/fastcgi_temp --http-uwsgi-temp-path=/usr/local/var/run/nginx/uwsgi_temp --http-scgi-temp-path=/usr/local/var/run/nginx/scgi_temp --http-log-path=/usr/local/var/log/nginx/access.log --error-log-path=/usr/local/var/log/nginx/error.log --add-module=/usr/local/share/small-light-nginx-module
```

ちゃんとngx_small_lightが`--add-module`されています。追加するPRを投げてくれた@Tei1988 さん、ありがとうございます。
iOS8+SwiftでperformSelectorが使えない

##iOS8+Swiftでのメモ
performSelector関連メソッドが使えないです。
どうやらメモリーリークを起こすことがあるとかで廃止になっているようです。
Objective-C時代は、よく使用していたので困っていたところ、
やはりstackoverflowにありました。
http://stackoverflow.com/questions/24170282/swift-performselector-withobject-afterdelay
dispatch_afterを使って遅延実行を行うやり方が良いようです。

引数付きの場合もありました。
http://stackoverflow.com/questions/24158427/alternative-to-performselector-in-swift

さすがは、stackoverflow
色付きファイル横断検索　grep メモ

find . -name "*.pl" | xargs grep --color=auto "subroutin"

この場合、同階層にある拡張子plのファイルを串刺し検索
"subroutin"を含む行を色付きで表示（ファイル名も）
ファイル名に"subroutin"を含む場合も拾ってくれる。

ubuntuで確認