OmniAICreator/Qiita-1.07M huggingface dataset:
CompassでBootstrapを使う覚え書き

## 1.Compassのインストール
[Compass公式サイト](http://compass-style.org/)

Rubyがインストールされている状態で以下のコマンドを実行
`$ gem install compass`

Compassがインストールされたか確認
`$ compass -v`

## 2.Bootstrap for Sassのインストール
[Bootstrap公式サイト]()
[GitHub:twbs/bootstrap-sass](https://github.com/twbs/bootstrap-sass)

bootstrap-sassのインストール
`$ gem install bootstrap-sass`

#### A.既存のCompassプロジェクトに適用する場合
config.rbに以下を追記

```rb:config.rb
require 'bootstrap-sass'
```

プロジェクトにBootstrapのインストール
`$ compass install bootstrap`

※先にconfig.rbに追記しないでインストールすると以下のエラーが表示される
`No such framework: "bootstrap"`

#### B.新規にCompassプロジェクトを作成する場合
通常のプロジェクト作成に以下のようにパラメータを追加して実行
`$ compass create my-new-project -r bootstrap-sass --using bootstrap`

## 3.BootstrapのSass用ファイル
Compassプロジェクトのsassディレクトリに以下のファイルが作成される

* styles.scss - Bootstrapをimportしているファイル
* _bootstrap-variables.scss - Bootstrapの変数一覧（ここ編集すると上書きされる）

## 4.Basic templateを書き換え
Bootstrap公式サイトにあるBasic templateは以下の部分を書き換える

```html:
<link href="css/bootstrap.min.css" rel="stylesheet">
<script src="js/bootstrap.min.js"></script>
↓
<link href="css/styles.css" rel="stylesheet">
<script src="js/bootstrap.js"></script>
```
（css、jsのディレクトリ名はプロジェクトの設定による）
[tmlib.js] スプライトのテクスチャをプログラムで生成する

tm.display.Spriteのテクスチャに、プログラムで動的に生成した画像を利用する方法を紹介します。

やり方は至って簡単。
tm.graphics.Canvasオブジェクトを画像アセット名の代わりにコンストラクタに渡すだけです。

~~~js
// キャンバスを用意
var t = tm.graphics.Canvas();

... // いろいろ描く

// スプライトに利用する
tm.display.Sprite(t);
~~~

コード例
-------

~~~js:Canvasに画像を描く

// 100x100を横に12個並べたテクスチャを生成します
var texture = tm.graphics.Canvas().resize(100 * 12, 100);

for (var i = 0; i < 12; i++) {
    // 初期位置を保存しておきます
    texture.save();

    // 右に100ずつずらします
    texture.translate(100 * i, 0);

    // 放射状グラデーションを作成します
    var h = parseInt(360 * i / 12); // 色相
    var gradient = tm.graphics.RadialGradient(50, 50, 0, 50, 50, 50)
        .addColorStopList([
            { offset: 0.0, color: "hsla({0}, 100%,  80%, 1.0)".format(h) },
            { offset: 0.5, color: "hsla({0}, 100%,  80%, 1.0)".format(h) },
            { offset: 1.0, color: "hsla({0}, 100%,  50%, 1.0)".format(h) },
        ])
        .toStyle();

    // ハートを描画します♥
    texture
        .setFillStyle(gradient)
        .fillHeart(50, 50, 50);

    // 描画位置をリセットします
    texture.restore();
}
~~~

以上で、色が微妙に変化しつつ横に12個並んだハートの画像が出来ました。

参考までに、出力してみた結果がこちら。

![hearts.png](https://qiita-image-store.s3.amazonaws.com/0/30568/fbb247c8-21eb-2b28-aa1e-8f63782e56b1.png)

あとはこれを使ってスプライトを生成すればOKです。

~~~js:スプライト生成
var heart = tm.display.Sprite(texture, 100, 100)
    .setFrameIndex(0)
    .setPosition(200, 200)
    .addChildTo(this);

// frameIndexを変更すると色が変わります
heart.frameIndex = 4; // 緑に
heart.frameIndex = 7; // 青に
~~~

動作サンプル
----------

http://jsdo.it/daishi.hmr/6Zkd
iOS ネットワークプログラミング

## やりたいこと

* iPadアプリ作ります
* WiFi接続でとある機器（仮にWebカメラとする）と接続
* 奴はアクセスポイント（ルーター機能なし）としてアドホック接続を要求してくる
* iPadに固定IPと指定のSSID付けて奴の子機として繋いでやると画像・動画を取得できるのでこれをアプリに表示
* 保存した静止画をサーバにアップロードする必要がある（奴のネットワークのせいでネットに出られないんだけども。。。）
* なんと奴らは複数存在していちいち繋ぎ換えて動画取得せねばならない（さらに別ネットワーク）

このなんとも”とほほ”な環境で果たしてアプリ開発は完了するのか？

## 調査項目・メモ

* 3G+iPadだとWiFiと3Gネット接続同時にいけるの？（動作検証する）
* 無線LANルーターの簡単接続アプリみると、どうやらプロファイルを書き換えてやれば、いろいろなWiFi環境を即時切り替えられそう（構成プロファイル「Wi-Fi」ペイロード）
* でも「構成を変更しますか？」みたいなメッセージがいちいち出てしまうからユーザ面喰らうかも
* WiFIのSSIDスキャニングする実装方法ないの？
* アプリから直接WiFi設定変更できないの？

## この投稿は？

現在進行形PJのものです。解決編まで書ける保証はありません。タイトルの意図はiOSに関してググってもあまり有効なネットワークプログラミングねたが見つからなかったので助けて欲しくてつけました。Objective-CだからC言語のネットワークプログラミング使って何でも出来るよーみたいな回答は厳しいなと。あの時代に戻りたくないので（一応私もそこからスタートしてます。ピアソンエデュケーションのUNIXネットワークプログラミングは手放せなかった１０年前。。。）用意されたライブラリ使わないでいろいろやるとアプリ審査も怪しくなるみたいですね。

分かったことから更新予定です。もちろんコメント・アドバイス大募集です

## 2014.07.16 追記

3G+WiFi同時接続ってアプリが変われば出来るみたいですけど、1アプリ内でプログラムから使い分けるなんて出来るのか？手元に3G端末ないので検証出来ないのですが、Noインターネッツなアドホックに繋いだ状態でWebサービスにPOSTするプログラムが動けばいいのかも

何も有用なネタ提供できないのもストックしてくれた方に申し訳ないので、本流から逸れますが今日ハマった小ネタを

* Supporting Files配下に追加したローカルリソース内のJSを書き換えたのに反映されない現象

> 何てことはない、書き換えたらいきなり「Run」しないで「Build」するか「Clean」してから「Run」しないと反映されないみたいですね

※ UIWebViewにローカルHTMLはめ込んでてデバッグに苦戦しました。。。XCode使いの常識なのかもしれませんが知らなかったし、こういうのでいつもIDE使った開発が嫌いになる

## 2014.07.30 追記

ネットワークに問題を抱える当アプリなので、ローカルHTMLをUIWebViewで表示して出来るだけネット接続しないスタンドアロンな処理が必要になりました。

ローカルHTMLをUIWebViewで表示する方法はいくらでもあるのですが、じゃあローカルDB（SQLite）のデータバインドしてHTML作成する方法ないの？と思って調べても出てこない。。。どなたかERBみたいに簡単にデータバインド出来る方法教えて下さい。

SQLite -> Model(FMDB) -> ControllerでごりごりHTML文字列作成。stringByEvaluatingJavaScriptFromStringでUIWebViewのDOMを変更と力技で動きましたがカコワルイ
CoffeeScript 始め方

インストールする。

```
npm install -g coffee-script
```

PATHが通ってなかったら環境変数にセット。

CoffeeLintもインストールする。

```
npm install -g coffeelint
```

vimrcに追加する。

```
NeoBundle 'kchmck/vim-coffee-script'

" coffee-script
autocmd BufNewFile,BufReadPost *.coffee setl shiftwidth=2 expandtab
```

チェックするときは、Vimのコマンドで、

```
:CoffeeLint | vertical cw
```
Emacs で複数行の行頭にスペースを一括挿入する操作について

Emacs 使い始めてもう 10 年以上になるのに未だに初心者を脱することができない子です。

# 参考文献

最初に参考リンクを挙げておきます。

- [Emacs - 複数行の先頭にスペース挿入/削除コマンド - Qiita](http://qiita.com/shimomai@github/items/97bf729f4a4b8f04d0ce)
- [行頭にスペースを挿入，指定した文字を挿入 - 睡眠不足？！](http://d.hatena.ne.jp/sleepy_yoshi/20080118/p2)

# 僕的な結論

とりあえず「覚えやすさ」を重視して、単純に

- ``C-u 回数``
- ``C-x C-i``

のコンビネーションで ``C-u 回数 C-x C-i`` でいいや。

もっといい方法 (覚えやすい・応用が効くなど) があるようでしたらぜひコメントをお願いします Emacs のえろい人 m(_ _)m。
CentOS7でIPを固定する

## IPを固定する

```diff:/etc/sysconfig/network-scripts/ifcfg-enp3s0
 DEVICE="enp3s0"
 ONBOOT=yes
 NETBOOT=yes
 UUID="0ebc2621-6086-4d9a-a15d-c52cdf6ade01"
 IPV6INIT=no
-BOOTPROTO=dhcp
 HWADDR="08:00:27:bf:e6:ec"
 TYPE=Ethernet
 NAME="enp3s0"

+BOOTPROTO=static
+DNS1="8.8.8.8"
+DNS2="8.8.4.4"
+DOMAIN=mydomain.com
+IPADDR=192.168.100.11
+NETMASK=255.255.255.0
+GATEWAY=192.168.100.1
```

## IPを自動取得する場合

```diff:/etc/sysconfig/network-scripts/ifcfg-enp3s0
 DEVICE="enp3s0"
 ONBOOT=yes
 NETBOOT=yes
 UUID="0ebc2621-6086-4d9a-a15d-c52cdf6ade01"
 IPV6INIT=no
 BOOTPROTO=dhcp
 HWADDR="08:00:27:bf:e6:ec"
 TYPE=Ethernet
 NAME="enp3s0"
+DNS1="8.8.8.8"
+DNS2="8.8.4.4"
```

## IPを固定しつつ自動取得もする

* BOOTPROTO=dhcpがミソ

```diff:/etc/sysconfig/network-scripts/ifcfg-enp3s0
 DEVICE="enp3s0"
 ONBOOT=yes
 NETBOOT=yes
 UUID="0ebc2621-6086-4d9a-a15d-c52cdf6ade01"
 IPV6INIT=no
 BOOTPROTO=dhcp
 HWADDR="08:00:27:bf:e6:ec"
 TYPE=Ethernet
 NAME="enp3s0"

+DNS1="8.8.8.8"
+DNS2="8.8.4.4"
+DOMAIN=mydomain.com
+IPADDR=192.168.100.11
+NETMASK=255.255.255.0
+GATEWAY=192.168.100.1
```

## /etc/sysconfig/network

```bash:
NETWORKING="yes"
GATEWAYDEV="enp3s0"
NETWORKING_IPV6="no"
IPV6_DEFAULTDEV="enp3s0"
GATEWAY=192.168.100.1
```

## /etc/hostname

```bash:
dell.mydomain.com
```

# 設定反映

```bash:
systemctl daemon-reload
systemctl restart network
```



## IPv6を無効

* [How do i disable IPv6 on CentOS 7](http://www.itzgeek.com/how-tos/linux/centos-how-tos/how-do-i-disable-ipv6-on-centos-7-rhel-7.html#axzz3JUYVAfHe)

```bash:/etc/sysctl.d/98-disableipv6.conf
net.ipv6.conf.all.disable_ipv6 = 1
```

```diff:/etc/sysconfig/network-scripts/ifcfg-enp3s0
- IPV6INIT=yes
+ IPV6INIT=no
```

reboot

```bash:確認
sysctl -a | grep disable_ipv6
```
Xcode6 betaインストール後にXcode4.6.3が動作しない

## 原因

`MobileDevice.framework` が競合していて、4.6.3と6 betaで互換性がない？
参考：[Xcode 4.6.3 crashing after installing xcode 6 beta](http://stackoverflow.com/questions/24035694/xcode-4-6-3-crashing-after-installing-xcode-6-beta)

## 対処

```bash:MobileDeviceをバックアップ
sudo mv /System/Library/PrivateFrameworks/MobileDevice.framework /System/Library/PrivateFrameworks/MobileDevice.framework-saved
```

上記コマンドを実行した後、Xcode4.6.3を起動すると **Device Support** を入れてくれという旨のダイアログが表示されます。
はいはいと指示に従い、インストールすると無事にXcode4.6.3は起動します。

が、もちろんXcode6 betaを起動しようとすると、
必要なコンポーネントがないよ、とダイアログでインストールを促されます。

インストールした場合、Xcode6 betaは起動します、が。
Xcode4.6.3は起動しなくなります。

ふむふむ、ここまでは予想通りです。
上で `MobileDevice.framework` はバックアップ取ってるので、
今度は削除してみます。

```bash:MobileDeviceを削除
sudo rm -rf /System/Library/PrivateFrameworks/MobileDevice.framework
```

これを試してる間、自分は「Xcode4.6.3と6 betaの共存は無理なのかなあ」と考えながら、
コマンド実行後、Xcode4.6.3を起動すると、先ほどのダイアログが表示され、再度インストール後、Xcode4.6.3が起動しました。

少々面倒くさいですけど、使うタイミングでこうやってスイッチしないとダメかあ。
と、なんとなくXcode6 betaを起動してみたら、なぜか起動できました。

現在、何回か試してみていますが、Xcode4.6.3とXcode6 betaは起動するようです。

ただ、どうせXcode6 betaの方は安定しない（ `MobileDevice.framework` が4.6.3のを利用している）ので、Xcode6 betaを使う際はおとなしくコンポネントを入れ替えようとは思います。
AngularJS で controller, service 等を遅延ロード(定義)する


AngularJS で controller, service などが定義された JavaScript ファイルを遅延ロードした場合、通常のような書き方では Injector から対象のオブジェクトが取得できない。なので、以下のようにする。

※公式的にこれでいいのかどうかは不明だけどメソッドが生えてるってことはこれでいいのかしら。ちなみにソースは[これ](http://www.slideshare.net/nirkaufman/angularjs-lazy-loading-techniques)

##### メインのファイル

```javascript:main.js
var app = angular.module('sample', []);

// Config で、遅延ロード(定義)する対象のプロバイダーを config 内で app へ alias をはっておく
app.config(['$provide', '$controllerProvider', '$animateProvider', '$filterProvider', '$compileProvider',
    function($provide,   $controllerProvider,   $animateProvider,   $filterProvider,   $compileProvider) {

        // Service 系 (service, factory, value, constant) は $provide
        app.$provide = $provide;

        // あとは名前の通り
        app.$controllerProvider = $controllerProvider;
        app.$animateProvider = $animateProvider;
        app.$filterProvider = $filterProvider;
        app.compileProvider = $compileProvider;
}]);

app.controller('mainController', ['$injector', function($injector) {
    // 以下の lazy.js を読み込むとして
    loadScript().then(function() {
        // ここで読み込んだファイル内に定義した各オブジェクトを $injector から取得できる
        var lazyService = $injector.get('lazyService');
    });
}]);
```

##### 遅延ロードされるファイル

```javascript:lazy.js
var app = angular.module('sample');

//////// service を定義
// $provide にはその他、.factory(), .value(), .constant() というメソッドが生えてるので、以下と同様に使用できる
app.$provide.service('lazyService', function() {
     
});

//////// controller を定義
// ${hoge}Provider というプロバイダーは、 .register() メソッドで定義を行うので注意
app.$controllerProvider.register('lazyController', function() {
        
});
```

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

ちなみに angular-loader とか非同期でスクリプトを読み込む系のプラグインも、上記と同じようなことを行って実現しているっぽい(流し見した)

僕は FlashCC からはき出した CreateJS の中に API として AngularJS のオブジェクトを定義した時に通常の記法だと $injector から取得できず、どうしていいのか分からなかったので上記のような方法をとりました。
subversion でディレクトリ削除がコミットできないとき

# 問題
例えば、下記のような構成でコミットされているとします。

```
parent
 - hoge
   - a.html
   - b.html
```

この状態でhoge を削除したいのですが、うまくいきませんでした。
```Directory 'hoge' is out of date'``` とか言われます。

# 解決方法
ググったところ、[stackoverflowの記事](http://stackoverflow.com/questions/3298384/svn-commit-failed-directory-out-of-date) を見つけました。
んーなんかよくわかんないけど、下記手順でできました。

1. a.html b.html の削除をコミット
2. ```svn up hoge``` 
3. hoge の削除をコミット

ファイルを削除するとそのディレクトリのリビジョンが上がるから、一回update しないとだめ、みたいな話みたいです。
CreateJSでcanvasに読み込んだ画像にマウスイベントを設定する方法

CreateJSを用いてcanvasに読み込んだ画像にマウスイベントを設定する方法です。
※今回はロールオーバーとロールアウト

```js:javascript
window.onload = function(){

	var stage = new createjs.Stage('canvas');
	// マウスイベントを発生させる頻度を指定
	stage.enableMouseOver();
	
	var queue = new createjs.LoadQueue();
	
	queue.addEventListener('complete', function(e){
		
		var bitmap = new createjs.Bitmap(queue.getResult('image_1'));
		stage.addChild(bitmap);
		
		// カーソルをpointerに設定
		bitmap.cursor = 'pointer';
		
		// ロールオーバーイベントの設定
		bitmap.addEventListener('rollover', function(e){
			e.currentTarget.alpha = 0.5;
		});
		
		// ロールアウトイベントの設定
		bitmap.addEventListener('rollout', function(e){
			e.currentTarget.alpha = 1;
		});
		
	});
	
	queue.loadManifest([
		{id: 'image_1', src: 'images/image_1.png'}
	]);
	
	createjs.Ticker.setFPS(30);
	createjs.Ticker.addEventListener('tick', function(){
		stage.update();
	});

}
```

* StageオブジェクトのenableMouseOverメソッドでマウスイベントを有効にする必要がある。また、マウスイベントを検知する頻度を引数に設定出来る。(初期値は20)
* マウスイベントのターゲットとなるオブジェクトにはcursorプロパティでカーソルの種類を設定しておく。(設定出来る種類はcssのcursorと同じ)

* * *

どうやらパフォーマンスを考えてか、デフォルトだとStageのマウスイベント検知は無効になっているようです。
マウスイベントのターゲットにはcursorを設定するクセを付けておきたいです。
※FlashでいうところのbuttonModeみたいな感覚で。
CentOS7について簡単にまとめ


centos7がリリースされました。
検証とかまだ全然手をつけてないけどとりあえずメモ的な

## 大きな変更点

RHEL7のリリースからずいぶん早い印象。適当に大きそうな変更点まとめ

* カーネルが3系になった
* デフォルトのFSがxfsになった
* sysvinitからsystemdになった
* mysqlのパッケージがmariaDBになった
* 6系からのアップグレードがサポートされてる


## 懸念点

全然検証してないけど懸念点

* systemdになってるから起動スクリプト作り直し
* kickstartファイルも作り直し

## 所感

コンテナサポートでデフォルトでdocker入ってるのは便利かも
xfsになるとどうなるかとかは調べないと分からない・・・
enumの書き方


# Objective-C

```objc
typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
  UITableViewCellStyleDefault,
  UITableViewCellStyleValue1,
  UITableViewCellStyleValue2,
  UITableViewCellStyleSubtitle
};
```

- `NS_ENUM`を使う
- 各要素に`prefix`として、定義した`enum`の名前をつけておく

ただ、個人的には実装ファイル(`.m`)内でしか使わないような`enum`は`prefix`つけない事が多い。

# Swift

```swift
enum UITableViewCellStyle: Int {
    case Default
    case Value1
    case Value2
    case Subtitle
}
```

となるらしい。
RspecのJSON ExpressionsでNullableなマッチャー (若しくはORマッチャー) を作る

RspecにJSON Expressions ( https://github.com/chancancode/json_expressions ) を使ってゐる。便利かと云ふと便利ではない気がするが、変へる余裕も無いので使ってゐる。
其れなりにJSONの構造をマッチできるのだが、ORができない気がする。できるのかもしれないが、できない気がする。「文字列 若しくは nil」なんてのができない気がする。wildcard_matcherなんて云ふあらゆるものに無条件にマッチするものを、ほいほいとは使ひたくない。とても困る。
JSON Expressionsはマッチに === を使ってゐるので、手製のマッチャーを作ってやる。以下をRSpecのhelperに書く。

```rb
class OrMatcher
  def initialize *vs; @vs = vs; end
  def === target; @vs.any?{|v| v === target }; end
end
def or_matcher *vs; OrMatcher.new *vs; end
```
然し面倒なので、<code>or_matcher(/.*/, nil)</code>なんてcodeを書いてゐたりする。
JSV (JSON Schema Validator) を使おう。

-> http://c4se.hatenablog.com/entry/2014/07/08/220848
homebrew-caskでよくあること


homebrew-caskあるあるというか、
トラブルシューティングというか...

##GitHub API rate limit exceeded って怒られた
**[現象]**
GitHub API rate limit exceeded for xxx.xxx.xxx.xxx. (以下省略)
というメッセージが出る。
homebrew-caskじゃなくて、homebrewが原因なんだけど、
githubは認証なしだと1時間に60回しかAPIアクセスできないから

**[対応]**
[Github](https://github.com/settings/tokens/new?scopes=&description=Homebrew)でToken作って、下記のものを.bashrc（.bash_profile）で認識させるかCLIで叩いてあげる。
Tokenありだとアクセス制限が1時間に5000回になる。

```bash
export HOMEBREW_GITHUB_API_TOKEN=作ったトークン
```

##/Applicationsにインストールしたい##
**[現象]**
デフォルトだと~/Applicationsにインストールされてしまう

**[対応]**
環境変数を追加する

```
export HOMEBREW_CASK_OPTS="--appdir=/Applications"
```

##homebrewでインストールしたアプリもAlfredで検索できるようにする##
**[現象]**
通常はalfredの検索範囲にhomebrewのディレクトリが含まれないため、Alfredで検索しようとしても引っかからない

**[対応]**
homebrew-caskでコマンドが用意されているので実行する

```
$ brew cask alfred link
```

##Alfred linkが失敗する(Alfred起動済み)##
**[現象]**
Alfred linkに失敗する

**[対応]**
Alfredを終了(quit)してからAlfred linkを実行する

**[備考]**
Alfred側の問題で起きるみたい

##Alfred linkが失敗する(Alfred起動してない)##
**[現象]**
Alfred linkに失敗する

**[対応]**
Alfredを起動してからAlfred linkを実行する

**[備考]**
Alfred側の問題で起きるみたい

##Alfred linkが失敗する(最終手段)##
**[現象]**
Alfred linkに失敗する

**[対応]**
手動で設定する
http://qiita.com/u1tnk/items/98175c5f8377f01c3da9

**[備考]**
Alfred側の問題で起きるみたい

##brew cask uninstallできない##
**[現象]**
brew cask uninstallしようとすると下記のようなメッセージが出る

```
Error: xxxxx is not installed
```

**[対応]**
手動で消す。

例) coteditorの場合

```
$ ls -la /Applications
...
lrwxr-xr-x   1 xxxxx  admin     57  6  9 03:18 CotEditor.app -> /opt/homebrew-cask/Caskroom/coteditor/1.5.3/CotEditor.app
...
$ rm /Applications/CotEditor.app
$ rm -rf /opt/homebrew-cask/Caskroom/coteditor
```

**[備考]**
よくわからないが、homebrew-caskのupgradeしたあととかで前のバージョンでインストールしたものとかが起きる場合がある。

##brew caskでアプリのバージョンをあげたい(公式推奨)##
**[現象]**
brew caskで管理したままバージョンアップする

**[対応]**
強制インストールする

```
$ brew cask install --force xxxxx
```

**[備考]**
"--force"をつけるとappを上書き処理になる(...はず)

##brew caskでアプリのバージョンをあげたい(個人的に推奨)##
**[現象]**
brew caskで管理したままバージョンアップする

**[対応]**
一度アンインストールしてからインストール

```
$ brew cask uninstall xxxxx && brew cask install xxxxx
```

**[備考]**
homebrew-caskでインストールするアプリはappファイル以外のものもインストールされる場合もあるので、特にバージョンがlatestになっているものは、一旦アンインストールしてからインストールしたほうがいいかと思います。
バージョンが違うものはディレクトリが別になるので強制インストールでもいいかも
アルファベットからランダムで1文字取得

```irb
$ irb                                                                                                                                                                      1.8.7 :001 > ('A'..'Z').to_a.shuffle[0]
 => "Y"
1.8.7 :002 > ('A'..'Z').to_a.shuffle[0]
 => "P"
1.8.7 :003 > ('A'..'Z').to_a.shuffle[0]
 => "W"
1.8.7 :004 > ('A'..'Z').to_a.shuffle[0]
 => "A"
1.8.7 :005 > ('A'..'Z').to_a.shuffle[0]
```

でいいのかしら。
Docker imageの名前だけを一覧する

持ち歩きのPCをWindows7からUbuntuに入れ替へました。

問題
==
入れてるDockerのimage名が長く成って覚えてないし、コピペしやうにもdocker ps -aの出力は長い。名前だけ一覧したい。

解決
==
AWKを使ふ。.bashrcに書く。

```bash
function docker-ps-names() {
  docker ps -a | awk -F"  +" 'NR>1{print $(NF-1)}'
}
```
空白区切りで、ヘッダである一行目を飛ばし、最後の列を出力する。
peco ( https://github.com/peco/peco ) と一緒に使ふ。

```bash
docker start -a $(docker-ps-names | peco)
```
Unite.vimみたいでpecoしゅごい (pecoの宣伝)。

-> http://c4se.hatenablog.com/entry/2014/07/07/192616
[YConnect]user_idの一意となる単位について

YConnectのUserInfo APIで取得できるuser_idについて質問です。

UserInfoAPIのレスポンスとして取得できるuser_idについて
「ユーザー識別子を返却します。」とあります。

http://developer.yahoo.co.jp/yconnect/userinfo.html

この値が払い出される単位は

①Yahoo! JAPAN IDに登録されているユーザ単位
②Yconnect等の認証機能を利用したサービス内のユーザ単位

のいずれでしょうか？

気にしているところとして、認証機能を利用している
別々のサイトで同じYahoo! JAPAN IDで認証した場合、
user_idは同じ値となるのか？
それともそれぞれのサイトで別々の値となるのか？
が確認したい点となります。

以上、恐れ入りますが、ご教示いただけますでしょうか？
SauceLabsの実行結果をバッジ表示で一目で分かるようにする

# はじめに
* [SauceLabs](https://saucelabs.com/)でCIするときに[github](https://github.com)のREADMEに最新の実行結果を表示する手順をご紹介
 * [SauceLabs](https://saucelabs.com/)とはクラウド上でSeleniumを使ったテストができるサービス
* 私は少し苦戦しましたが、[公式サイト](https://docs.saucelabs.com/reference/status-images/)を見るだけでもバッジの導入はすごく簡単にできます

# バッジの表示方法
* 表示は2タイプあります
 * 個人的にはどのヴラウザが失敗したかまで一目で分かるのがよいから後者の方がよいのかなと

## 1. 成功/失敗だけをシンプルに表示
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/19778/8aa5af4b-afad-d619-54a3-d0864d24eced.png)
### 導入手順
* README.mdに以下を追加する

```:README.md
[![Sauce Test Status](https://saucelabs.com/buildstatus/[USERNAME]?auth=XXXXXXXXXXXX)](https://saucelabs.com/u/[USERNAME])
```

## 2. ブラウザ/OSの組み合わせ毎に表形式で結果を表示
![image2.png](https://qiita-image-store.s3.amazonaws.com/0/19778/10ae3a38-43e8-07ac-0ed5-ec557939c55f.png)
### 導入手順
* README.mdに以下を追加する

```:README.md
[![Sauce Test Status](https://saucelabs.com/browser-matrix/[USERNAME].svg?auth=XXXXXXXXXXXX)](https://saucelabs.com/u/[USERNAME])
```

# 自分がはまったところ
* [公式サイト](https://docs.saucelabs.com/reference/status-images/)の一番下に大切なことがかいてあったのに見落としてた
 * ```$ python auth.py```したものをURLにクエリをして付けなければならなかった
 * これを実行しないとunknownバッジが表示される

```py:auth.py
from hashlib import md5
import hmac
print ( "?auth=" + hmac.new("[USERNAME]:[ACCESSKEY]", None, md5).hexdigest())
```

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
LaravelのBladeテンプレートを拡張する方法

smartyの{$smarty.now}みたいな形で現在日時を表示する方法はbladeには無いのかなーと思って、
調べてみるとなかったので作ってみましたー！



# やり方

とりあえずプロジェクトディレクトリ内のどこかにファイルを作ります。
今回はblade_extensions.phpというファイル名で、appの直下に作成しましたー。


で、このファイルの中に拡張したい機能を書いていきます。
今回は和暦年・月・日をそれぞれ出力する機能が欲しかったので、それらについてツラツラ記述していきます。


## 拡張機能の実装

```php
<?php
                           
/*
 * 現在日付の和暦を表示
 */                        
Blade::extend(function($view, $compiler)
{
    $pattern = $compiler->createMatcher('now_y');

    $now_year = date('Y');          
    $japanese_calender_year = $now_year - 1988;
  
    return preg_replace($pattern, '<?php echo date("'.$japanese_calender_year.'") ?>', $view);
});
    
/* 
 * 現在日付の月を表示
 */
Blade::extend(function($view, $compiler)
{
    $pattern = $compiler->createMatcher('now_m');
    return preg_replace($pattern, '<?php echo date("n") ?>', $view);
});

/* 
 * 現在日付の日を表示
 */
Blade::extend(function($view, $compiler)
{
    $pattern = $compiler->createMatcher('now_d');
    return preg_replace($pattern, '<?php echo date("j") ?>', $view);
});
```

これで大まかな実装は終わりです！
実装自体はLaravelの公式にも書いてある通りで、createMatcherを使い拡張機能名を設定。
その後、その名前をどのようなPHPコードに置き換えるかを書いていってます。

なので、実装のテンプレートとしては以下の様な形になります。

```php
Blade::extend(function($view, $compiler)
{
    $pattern = $compiler->createMatcher('拡張機能名');
    return preg_replace($pattern, '置き換えるPHPコード', $view);
});
```

## blade_extensions.phpのパス指定


次に、app/start/global.phpを編集します。
単純に先ほど作成したblade_extensions.phpのパスを指定するだけです。
以下のコードをglobal.phpの好きなとこに追記してください。

```php
require app_path().'/library/blade_extensions.php';
```


## 実際の使い方

これで使えるまでの基本的な設定類は終わりました！
あとは使うだけです。

使い方は使いたいbladeファイル内で以下のように書くだけです。


    @now_y()
    @now_m()
    @now_d()

これで和暦年・月・日がそれぞれ表示されます。

他にもbladeテンプレートには無い機能で追加したいって機能がある場合は、
どんどん追加していってみてください！
dockerのサービス起動をmonitでしてみた

# 設定ファイル作成

```bash:/etc/monit.d/httpd.conf
check process httpd with pidfile /var/run/httpd/httpd.pid
    start program = "/usr/sbin/httpd -k start"
    stop  program = "/usr/sbin/httpd -k stop"
```

# monit起動方法

```bash:monitを/.bashrcで起動させる場合
docker run -i -p 80:80 -p 2812:2812 -t tukiyo3/centos7-ja:monit /bin/bash
```

```bash:monitをdockerのコンテナ起動時に起動させる場合
docker run -i -p 80:80 -p 2812:2812 -t tukiyo3/centos7-ja:monit /usr/bin/monit -I
```

/etc/monit.d/*.confの設定を書き換えたらmonitの再起動

```bash:
monit reload
```

# ログ

* /var/log/monit.log

# web管理画面

```diff:/etc/monitrc
set httpd port 2812 and
-   use address localhost  # only accept connection from localhost
+   use address 0.0.0.0  # only accept connection from localhost
    allow localhost        # allow localhost to connect to the server and
    allow admin:monit      # require user 'admin' with password 'monit'
    allow @monit           # allow users of group 'monit' to connect (rw)
    allow @users readonly  # allow users of group 'users' to connect readonly
```

http://172.17.0.42:2812/ にアクセスするとmonitの管理画面が見れると思う
Androidでタッチフォーカスを実装する

## ！注意！
現在推奨されているCamera2 APIではなく、少し古いCamera APIを使用した方法です

## やりたいこと
Androidのカメラアプリで、タッチした箇所にフォーカスを合わせたい
(注：使用するAPIの都合上、以下の方法はAndroid 4.0以降でのみ可能)

## やること
1. タッチした座標を特定する
2. フォーカスをタッチした箇所に合わせる

## タッチした座標の特定
### onTouchListenerの利用
カメラプレビューをタッチした時に呼ばれるリスナー内でタッチした座標が分かる
以下のコード参照

```java
// --変数宣言--
SurfaceView mSurfaceView;  // カメラプレビューを表示するビュー
Camera mCamera;            // カメラ

// --onCreate内--
// 初期化
mSurfaceView = (SurfaceView)findViewById(/* 人による */);
// タッチリスナーを登録
mSurfaceView.setOnTouchListener(new OnTouchSurfaceListener());

// onTouchSurfaceListenerの定義
class OnTouchSurfaceListener implements OnTouchListener {
	public boolean onTouch(View v, MotionEvent event) {
		// このメソッドは、ビューを押した時、ドラッグした時、離した時など、色々な時に呼ばれる
		// 今回は押した時にだけ処理するように下のif文を付ける
		if( event.getAction == MotionEvent.ACTION_DOWN ) {
			// このブロックを(A)と命名する。後で使う
			// event.getX() でタッチしたx座標が分かる
			// event.getY() でタッチしたy座標が分かる
		}
		return false;
	}
}
```

## フォーカスをタッチした座標に合わせる
### 使用するAPI
Android 4.0からフォーカスを合わせるのに使用する領域を決められるようになったらしい
この領域としてタッチした座標付近を指定すればタッチフォーカスが実装できる。やったぜ。

まず、大前提として、端末の方がフォーカス合わせの領域指定に対応している必要がある
対応しているかどうかは、`getMaxNumFocusAreas()`の **戻り値が0より大きいかどうか**で判断できる
0以下だったら諦める

対応しているなら、`setFocusAreas( List<Camera.Area> )`で領域を設定する
**この引数として渡される矩形領域がフォーカスを合わせるのに使われる領域**となる
Listなので複数渡せるが、今回は1つだけに限ったので2つ以上の時は正直よく分かってない

Camera.Areaは、矩形領域を表す`Rect rect`と`int weight`からなる
rectにフォーカスを合わせたい矩形領域をセットする。値域が[-1000, 1000]となっており、カメラ中央を(0,0)、左上を(-1000,-1000)、右下を(1000,1000)としている
**ここでいう上下左右は横置きを基準としているので、端末を縦置きにしてカメラを扱う場合は注意**
weightは2つ以上の領域がある時に強弱を付けるために使う…？ とりあえず固定値にしてある

ちなみに、現在セットされてる領域が知りたいなら`getFocusAreas()`でList\<Camera.Area\>が取得できる

### サンプルコード
```java
// --上のサンプルコードで(A)と命名した所に書く--
Parameters params = mCamera.getParameters();
// 対応しているかチェック
if( params.getMaxNumFocusAreas() > 0 ) {
	int x, y;
	// 画面縦置きの場合
	x = (int)event.getY();
	y = (mSurfaceView.getWidth()-(int)event.getX());
	// 画面横置きの場合はこうなる…？(未検証)
//	x = (int)event.getX();
//	y = (int)event.getY();

	// タッチした座標を[-1000,1000]の範囲に落としこむ
	int fx = x * 2000 / params.getPreviewSize().width - 1000;
	int fy = y * 2000 / params.getPreviewSize().width - 1000;

	// 上記の(x,y)を中央とした100x100の矩形領域を設定することにする
	// 矩形の端が[-1000,1000]を出ないように調整
	if( fx < -950 ) fx = -950;
	if( fx > 950  ) fx =  950;
	if( fy < -950 ) fy = -950;
	if( fy > 950  ) fy =  950;

	// 矩形領域をセット
	List<Camera.Area> area = new ArrayList<Camera.Area>();
	area.add(new Camera.Area(new Rect(fx-50, fy-50, fx+50, fy+50), 1));
	params.setFocusAreas(area);
	mCamera.setParameters(params);

	// 最後にオートフォーカス呼び出し
	mCamera.autoFocus(/* 2度押し禁止とかしなきゃならんので何かしらのリスナーを入れることになると思うが割愛 */);
}
```

## 最後に
サンプルコードの最後にも書いたが、2連続でタッチするとオートフォーカス中にオートフォーカスが呼ばれ、 **アプリが落ちる原因となる**
これに関する対策は色々な所に書かれてるので省略 (例えば[ここ](http://wada811.blogspot.com/2013/08/android-camera-autofocus-tips.html)とか)

## 参考
[Android Developers](http://developer.android.com/reference/android/hardware/Camera.Parameters.html)
[Y.A.Mの雑記帳: Android 4.0 Platform](http://y-anz-m.blogspot.jp/2011/10/android-40-paltform.html)

## 追記
(2014/7/10) 2つ目のサンプルコードの「int x = ・・・」の式の右辺に-1を掛けました。
これにより、端末が横向きでも縦向きでも左上が(-1000,-1000)になります。
(2014/7/12) 2つ目のサンプルコードを修正しました。よく考えたら間違ってました
dockerコンテナ起動とともにサービス開始(/.bashrc)

[monit](http://inokara.hateblo.jp/entry/2013/12/29/215322)とかよくわからない人向け。

# docker側のスタートアップ指定

```bash:/.bashrc
/usr/sbin/httpd
```

と書いて以下のようにdocker起動時にバインド指定すればよい。

もうちょい頑張りたい場合は以下のようにすればいいんじゃないかな

```bash:/.bashrc
if [ $SHLVL -eq 1 ]; then
    /usr/sbin/httpd -k start
fi
```

# 起動

```bash:
docker run \
 -i \
 -p 80:80 \
 -v $HOME/logs:/var/log/httpd \
 -v $HOME/docroot:/var/www/html \
 -t tukiyo3/centos7-ja:httpd_startup \
 /bin/bash
```

*  -p 80:80 は、-p ホスト側のポート:docker側のport
* -p 8080:80 だと以下方法でアクセスが出来る。
  * ホスト側から http://localhost:8080/
  * docker側から http://localhost/

# dockerのプロンプトから抜ける方法

抜けるにはctrl-p, ctrl-q。
ctrl-dをするとコンテナが終了してしまうので注意
Dockerでninix-ayaを動かそうとしている中での気付き（その１）

# Xなクライアント動かすならssh(sshd)は入れるべき

X11なクライアントを動かすとき、Ubuntuなどは結構前から、Xサーバーのtcpのリッスンをデフォルト無効にしており、この設定を変える位なら、.ssh配下の設定でXのポート転送を有効にして、コンテナ側にsshd入れてコチラもXのポート転送有効にしてsshにXプロトコルの転送をお願いするのが今どきな模様。

# 昔覚えたxhost +でやりたい場合

以下が多分参考になりそう。

- [How to enable remote access to Xserver on Ubuntu 11.04 and Ubuntu 11.10](http://pzuk.wordpress.com/2011/10/21/how-to-enable-remote-access-to-xserver-on-ubuntu-11-04-and-ubuntu-11-10/)

# 関連投稿

- [Dockerでninix-ayaを動かそうとしている中での気付き（その2）](https://qiita.com/kjunichi/items/706939134ad95672781a)
- [Dockerでninix-ayaを動かそうとしている中での気付き（その3）](https://qiita.com/kjunichi/items/8f426dd0081b19ef1ea7)

# 関連記事

- [EC-CUBEをh2oと連携させてdocker for macで動かしてosxfsが大変遅いことを体感した件](https://abrakatabura.hatenablog.com/entry/2017/03/11/094319)
- [DockerでIPython Notebookを動かして、数え上げおねえさんを救う](https://abrakatabura.hatenablog.com/entry/2014/11/30/214133)
- [Dockerで音を鳴らす](https://abrakatabura.hatenablog.com/entry/2014/08/21/062305)
- [JavaScriptをDockerを使って黒い画面に表示する](https://abrakatabura.hatenablog.com/entry/2014/08/09/224138)
- [Dockerやって知ったmoshの残念な点](https://abrakatabura.hatenablog.com/entry/2014/07/26/043530)
- [OSXでDocker入れるとTimeMachineが遅くなるかも #solved](https://abrakatabura.hatenablog.com/entry/2014/07/19/075732)
- [Dockerやって色々勉強になってる件](https://abrakatabura.hatenablog.com/entry/2014/07/15/065931)
- [Dockerの画面をiPhoneに表示する](https://abrakatabura.hatenablog.com/entry/2014/09/10/205608)
- [Docker入れてからのVirtualBoxのアップデート](https://abrakatabura.hatenablog.com/entry/2014/03/30/080156)
- [DockerのAlpine Linuxでタイムゾーンでハマった](https://abrakatabura.hatenablog.com/entry/2017/07/16/081952)
peco-itunes

```
_itunes_list_tracks() {
  osascript <<EOF
tell application "iTunes"
  set accumulator to ""
  repeat with t in every track
    set output to "" & (id of t) & tab & "\"" & (name of t) & "\"" & tab & "\"" & (artist of t) & "\""
    set trackInfo to do shell script "echo " & quoted form of output without altering line endings
    set accumulator to accumulator & trackInfo
  end repeat
end tell
EOF
}

_itunes_delete_playlist() {
  osascript <<EOF
tell application "iTunes"
  try
    delete user playlist "$1"
  end try
end tell
EOF
}

_itunes_add_track_to_playlist() {
  osascript <<EOF
set myPlaylistName to "$2"
tell application "iTunes"
  try
    set myPlaylist to user playlist myPlaylistName
  on error
    set myPlaylist to (make new user playlist with properties {name:myPlaylistName})
  end try
  
  duplicate (every track whose id is "$1") to myPlaylist
end tell
EOF
}

_itunes_play_playlist() {
  osascript <<EOF
tell application "iTunes"
  play user playlist "$1"
end tell
EOF
}

peco-itunes() {
  local playlistName="Peco-iTunes"

  local tracks=$(_itunes_list_tracks | peco --prompt "${playlistName}>" | awk '{print $1}')

  if [ -z "$tracks" ] ; then
    return
  fi

  _itunes_delete_playlist $playlistName

  local IFS=$'\n'
  for track in $tracks ; do
    IFS=" "; _itunes_add_track_to_playlist "$track" "$playlistName"
  done

  _itunes_play_playlist "$playlistName"
}
```
Xcode Botsトラブルシューティング

#はじめに
プロビジョニングファイルや証明書はDeveloper Programに紐づけても同期されないようなので、手作業でコピーしてあげる必要がある模様。

#Provisioning fileのUUIDが食い違う
プロビジョニングファイルが見つからないエラーが出るとき、ローカルとサーバのプロビジョニングファイルのUUIDが食い違っているためによる事がある。
ローカルのプロビジョニングファイルを全て消したあと、Developer Programと同期したものを使う。
サーバにはDeveloper Programからダウンロードして、/Library/Server/Xcode/Data/ProvisioningFilesにコピーする。
権限がない場合は、権限を変更して構わない。

***プロビジョニングファイルの位置がOSX Server4.0では/Libray/Developer/XcodeServer/ProvisioningFilesに変更されています。***

#証明書がない
証明書と秘密鍵をKeyChainのシステムにコピーする。
正しい証明書と秘密鍵がコピーされていないと、ビルドができずエラーとなる。
Application なんちゃら iOS7.0みたいなエラーが出る場合、これが原因だったりする。

#リモートリポジトリをクローンできない
Botsを作成する際にリポジトリと通信できるか確認されるが、公開鍵を用いて通信している際にUIが対応していないので先に進めなくなる。
その時はGuestで通信するようにし、その後OSX Serverのアプリケーションからリポジトリの認証方式を変更する。
その際、SSH Keyで認証するように設定すると公開鍵と秘密鍵が、その都度生成される。
Githubやその他のホスティングサービスに登録しているキーを使うには、毎回編集する必要が模様。

#実機テストに失敗する
実機テストする場合はマシンに接続していないと次のようなエラーメッセージとともにビルドに失敗する。

xcodebuild: error: Failed to build project with ** scheme **.
Reason: Xcode cannot run using the selected device.

#ライブラリが見つからずビルドに失敗する
ライブラリサーチパス等が絶対パスになっていないか確認する。
テストのBuild Phasesにライブラリが追加されているか確認する。

その他
・たまにエラーになる
Test target *** encountered an error (App をインストールできませんでした。)
といったエラーによって失敗することがあるが、もう一度Integrateすると治ったりする

#OTAがうまくいかない
iOS7.1から、httpsで暗号化された通信ができない端末にはOTAでアプリをインストールすることができなくなった。
SSLサーバ/クライアント証明書をサーバとiOSデバイスにインストールしなければならない模様。
自己証明書でも行けるらしいが、OSX Serverアプリケーションから証明書を追加しようとしてもうまく行かなかった。
Qiitaの指定したタグ新着50件をpecoで全文検索絞込してブラウザで開く

![スクリーンショット 2014-07-09 4.58.37.png](https://qiita-image-store.s3.amazonaws.com/0/5391/b3ca6d71-0235-4152-18e8-c5a824319fc0.png)


タイトルのとおりです
QiitaのAPIを叩き、jqでパースしてpecoを立ち上げます
行を指定するとそのURLをブラウザで開きます

全文検索できるとこがいいかなと思います

#環境
- Mac
- zsh
- [peco](https://github.com/peco/peco) `brew install peco`
- [jq](http://stedolan.github.io/jq/) `brew install jq`


#設定
```zsh:.zshrc
function qiita () {
  TAG=$1
  QIITA="https://qiita.com/api/v1/tags/${TAG:l}/items?per_page=50"
  URL=$(curl -s $QIITA | jq '.[] | "\(.created_at)«\(.stock_count)«\(.url)«\(.title)«\(.raw_body)"' | sed 's/\"//g' | awk -F '«' '{printf "%s %3s %-60s %-70s %s\n", substr($1,6,11), $2, $3, $4, $5}    ' | peco --query "$LBUFFER" | awk '{print $4}')
  if [ -n $URL ]; then
    open $URL
  fi
}
```
※デリミタに`«`使ってますがテキトーなのでご指摘あればお願いします

# 使い方
```zsh
$ qiita zsh
```
Spring JPA でSELECT時はSlaveサーバへアクセスする


## やりたいこと
Spring JPAを使ってMaster-Slave構成の時にSELECTはSlave,その他はMasterサーバへアクセスする

## ミドルウェア,フレームワーク
- ReplicationDriver
- MySQL 5.6
- Spring 3.2.8
- hibernate

## テストの構成

- Customer.java エンティティクラス
- CustomerRepository.java JpaRepositoryを継承したクラス. findなどを行います
- CustomerService.java CustomerRepositoryを呼び出します
- Testクラス CustomerServiceを呼び出します

コードは下記に
https://github.com/hachi-eiji/spring-jpa-practice/

## 実現方法

ReplicationDriverはautoCommit=false, readOnly=trueのときにselectを発行するとslaveへアクセスします
よって、find処理を実行する前にインターセプターで設定を行います
(autoCommit=trueでも動きました。ここをfalseにする理由をご存じの方は教えてください)

また、CustomerService.javaのメソッドで ``` @Transactional ``` をつけます
つけない場合は下記のエラーが発生します。これはインターセプターの中で ```  entityManager.unwrap(SessionImpl.class); ``` を使うときはトランザクションが必須だからです。
-> PersistenceContextアノテーションがEXTENDEDの時は ```@Transactinal```はなくてもいけました

```@Transacitonalをつけない時のエラー
java.lang.IllegalStateException: No transactional EntityManager available
at org.springframework.orm.jpa.SharedEntityManagerCreator
$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:224)
```

## 最後に

実際に組み込むときは、エンティティクラスにマーカーアノテーションをつけたほうが、おそらく効率はいいはずです。

## 参考資料
[ReplicationDriver](http://dev.mysql.com/doc/connector-j/en/connector-j-master-slave-replication-connection.html)
[MySQL Master/Slave Load Balancing with JPA and Spring](http://www.dragishak.com/?p=307)

## コード
https://github.com/hachi-eiji/spring-jpa-practice/

```java:インターセプターのコード
@Aspect
@Component
public class SlaveConnectionInterceptor {
    private static final Logger LOGGER = LoggerFactory.getLogger(SlaveConnectionInterceptor.class);

    private EntityManager entityManager;

    @PersistenceContext
    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    @Around("execution(public * com.hachiyae.jpa..*.find*(..)) || execution(public * com.hachiyae.jpa..*.count*(..))")
    public Object proceed(ProceedingJoinPoint pjp) throws Throwable {
        LOGGER.info("call SlaveConnectionInterceptor from {}", pjp.getSignature().toShortString());
        SessionImpl session = entityManager.unwrap(SessionImpl.class);
        Connection connection = session.connection();
        boolean autoCommit = connection.getAutoCommit();
        boolean readOnly = connection.isReadOnly();
        connection.setAutoCommit(false);
        connection.setReadOnly(true);
        try {
            return pjp.proceed();
        } finally {
            connection.setAutoCommit(autoCommit);
            connection.setReadOnly(readOnly);
        }
    }
}
```
ライブラリ プロジェクトJar化 再配布手順等メモ

■ライブラリ プロジェクト to Jar
　・res配下は、jarに入らない。
　・再配布の際には、res配下は直に提供するしかない。

　・・・う～む。
----

■再配布 方法 手順メモ
　・ライブラリプロジェクトのソースをjar化
　・提供用プロジェクトに、jar追加。
　・提供用プロジェクトに、共通のres配下も追加。
　・提供用プロジェクト内のsrc配下は何も無し。
　・提供用プロジェクトを、アーカイブファイル(.zip)としてエクスポートして再配布。

----

■再配布取り込み ～ リリース 方法 手順メモ
　・再配布アーカイブファイル(.zip)をインポートで取り込む
　・マニフェストファイルのパッケージ名のみを変えてもらう。
　・apkファイルを作成してもらい。
　・リリース。

　※リリース時に面倒な、
　　説明文や
　　スクリーンショットなどもこちらで用意しておくと便利（リリースし易い）かも。
　
----

■ProGuard GUI
　http://hiromem.blogspot.jp/2012/08/proguardjar1.html
　http://hiromem.blogspot.jp/2012/08/proguardjar2.html
centos7.0のvagrant boxを作るpacker templates.jsonを作った

centos7.0出ましたね！！！！！！１１１１１
ということで、勢いに任せてcentos7.0用のvagrant boxが作れるpackerテンプレートを書いた。
社内向けでpackerは使っていてcentos5.[5-6]と、scientific linux 6.5とかのは作っていたのだけれど、完全に趣味っぽい感じで作るのは初めてだった。
流れ的には、
-> centos7.0のisoを落としてくる
-> virtualbox で手動インストールして、anaconda-ks.cfgの構成を把握する
-> RHEL5,6系のpacker templatesのshellで実行するところと差分があるかどうかをちょろっと調べる
-> ざっと書いてみて、packer buildしてみて、こけるかどうか試す
-> こけたら何が駄目だったのか調べる
-> それでも駄目だったら最後の手段的に、Box-Cutter(https://github.com/box-cutter  )を参考にする
という感じでなんとかできた。
作ったものはここにあげた
https://github.com/eigo-s/packer_templates/tree/master/centos7.0/x86_64

とりあげずvagrant add -> init -> up -> sshまではできたのでだけれど、VBoxGuestAdditionsのインストールがうまくいかず、共有フォルダのところでvagrant upがこけるので、今後の課題としたい。
こちらからは以上です。
CentOS7.0 yum外部リポジトリまとめ(2015/03/04版)

##yumリポジトリのインストール
###RPMforge
######インストール

```bash
rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm
```

######インストール確認

```bash
rpm -q rpmforge-release
```

######ミラーサイトが404エラーを返す場合
現状、fastestmirror が有効の場合 RPMforge でミラーサイトが404エラー返すことがあるので、
RPMforgeを導入したい場合、ミラーサイトが出揃うまではfastestmirror を無効にしておいたほうがよさげです。

```ini:/etc/yum/pluginconf.d/fastestmirror.conf
[main]
#enabled=1
enabled=0
```

###EPEL
######インストール

```bash
rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7
rpm -ivh http://ftp-srv2.kddilabs.jp/Linux/packages/fedora/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
```

######インストール確認
```bash
rpm -q epel-release
```

###ELRepo
######インストール

```bash
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -ivh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
```

######インストール確認
```bash
rpm -q elrepo-release
```

###Remi
######インストール

```bash
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

######インストール確認

```bash
rpm -q remi-release
```

######PHPのインストールバージョンの選択
PHP 5.4.x をインストールするには、remi リポジトリ指定します。
PHP 5.5.x をインストールするには、remi-php55 リポジトリ指定します。
PHP 5.6 をインストールするには、remi-php56 リポジトリ指定します。
※2014/07/09現在 PHP5.6は開発版で、安定版は5.5.14 になります。
http://jp2.php.net/manual/en/migration56.php

```bash
yum --enablerepo=remi-php55 install php
```
iTunes ConnectでIDFAに詰んだ話

最近広告を入れてるアプリを開発されている方はちょくちょくコイツに頭を悩ませていることでしょう。私もです。

そして急いでいる時、またはリリース申請処理などが久しい時に、必ず広告まわりでこんな警告文にぶつかります。

Improper Advertising Identifier[IDFA] Usage.Your app contains the Advertising Identifier [IDFA] API but you have not indicated its usage on Prepare for Upload page in iTunes Connect

詳しい原因や解決策は以下のサイトで詳しく書かれていましたのでこちらをご覧ください。

▼ 【iTunes Connect】アップロード時に「improper advertising identifier [IDFA] usage.～」
http://kforce-ueda.hatenablog.com/entry/2014/04/28/234257

問題は対応法です。
焦っていたり、一発で簡単に直す方法は無いかと模索しているあなた。やることは１つです。広告類をすべて抜いた形でリリースまでやっちゃってください。広告類をすべて抜くというのがポイントです。

えぇ、ものすごく手間です。広告を追加した画面が多いほど手間です。

しかし貴方(そして私も)は過ちを犯したのです。
英語だからといって、いつもと同じ警告チェックだからといって、大事な警告の確認を怠り安易にNOとつけてしまったのです。

こうなったら腹をくくりましょう。

そして広告の無い偽リリース申請を行い。無事申請処理が終わったところで最新バージョンアプリのView Detailsを開き、Binary Detailsから右上にあるRejectボタンを押しましょう。

これで晴れて修正を許可されます。やっと元に戻して、改めて警告文を確認できるのです。

ここまでを苦行と思うかもしれませんが、裏を返せば「ちゃんと人の大事なことを聞かないとバチがあたりますよ」というAppleの親心なのかもしれません、かーちゃん。。。。

そして無事アプリを作り直し、警告文をきちんと読み(その上でチェック処理をきちんと行い)、無事リリース申請を改めて終えたところでつぶやきましょう。


く○ばれ林檎野郎
ローカルリポジトリのmasterブランチは別に無くても良い？

喧嘩を売るつもりはございません。

## 理由
[Gitでブランチを作るのを忘れてmasterにコミットしてしまったときの対処法](http://qiita.com/atskimura/items/a90dfa8bfc72e3657ef9)というQiita記事のコメント欄で

> ローカルの`master`ブランチは別に持たなくても良い(むしろローカルにmasterがあるから表題のミスが起こる。)

というコメントがあり、確かにな〜と共感したのが始まり。
masterで作業していることに気づかず、プッシュするときに「あぁ…」となる人も多いはず。
[こういう悲しみ](https://twitter.com/search?src=typd&q=#rootbp)が生まれること無く、皆が幸せになれるのではないでしょうか？

## とりあえずmasterブランチを消そう
`git branch -D master`で削除。さよなら。

## git fetchしましょう
`git pull`を主に使用している人にはあまり馴染みのないコマンド（私もつい最近知った）。

[git fetchの理解からgit mergeとpullの役割](http://qiita.com/osamu1203/items/cb94ef9da02e1ec3e921)

ここに非常にわかりやすく、`git fetch`や`git pull`について解説されています。
つまり、`git fetch`することでリモートリポジトリの最新情報をローカルリポジトリに持ってこられるわけですね。

## 最新のコミットを各ブランチに反映させるには
masterブランチが無いので、`git merge master`とか`git rebase master`でブランチを最新状態に更新できなくなりました。
しかし、`git branch -a`を実行してみてください。`remotes/origin/master`というリモートブランチを確認できるかと思われます。
これこそが、リモートリポジトリのmasterブランチになります。
つまり、`git merge origin/master`なり`git rebase origin/master`なりを実行すれば、最新の状態に更新が可能になるというわけですね。

## リモートリポジトリの今の状態を確認したい
`git checkout origin/master`する。

```
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:  

git checkout -b new_branch_name

HEAD is now at 4939890...
```
こんな感じの警告文が表れると思います。要約すると

> 直接コミットを参照してるから、変更をコミットしてもどこにも反映されないよ

って言ってるのかな？
[gitのHEADがブランチから外れてしまう現象とその直し方](http://d.hatena.ne.jp/nishiohirokazu/20110513/1305290792)

ここの記事に詳しい解説が記載されているようですね。

## まとめ
- リモートリポジトリの最新状態を持ってくる→`git fetch`
- ブランチに最新状態を反映させたい→`git merge(rebase) origin/master`
- 最新のファイル情報が見たい→`git checkout origin/master`（但し、編集不可）

## 最後に
問題ありまくりな内容だと思われますので、補足や指摘お待ちしております。
はじめての MySQL

**環境**
- macOS Sierra (10.12.3)


## インストール
**OSX インストールパッケージ**（推奨）

[MySQL install](http://dev.mysql.com/doc/mysql-getting-started/en/#mysql-getting-started-installing)

**Homebrew**

```bash
$ brew install mysql
```

## その他

### ログインする方法

```bash
$ mysql
```

### パスワードを指定してログインする方法

```bash
$ mysql -u root -pPASSWORD
```

### DB を指定してログインする方法

```bash
$ mysql -u root -pPASSWORD TABLE_NAME
```


## トラブルシューティング :construction_worker:

### ERROR! The server quit without updating PID file 

```
$ mysql.server start                                                                                                                                                          
Starting MySQL
ERROR! The server quit without updating PID file (/usr/local/var/mysql/<Computer Name>.local.pid).
```

なんかの原因で MySQL を立ち上げることができないので `/usr/local/var/mysql` に移動してログファイルを見つける。おそらく `<Computer Name>.local.err` みたいなファイルがあるので `tail` コマンドなどでエラーを確認する。

### パスワードリセット

無事にログインできると思ったら次の問題。
パスワードが分からない。

```bash
$ mysql -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
```

MySQLを止める：

```bash
$ mysql.service stop
```


--skip-grant-tablesをつけてセーフモードでmysqlをスタート：

```bash
$ mysqld_safe --skip-grant-tables --skip-networking
```


別のターミナルでMySQLを開く：

```bash
$ mysql
mysql>
```


`mysql`というDBに移動して、ユーザー情報が入っている`user`テーブルのパスワードを変更：

```bash
mysql> use mysql; Database changed 
mysql> UPDATE user SET Password=PASSWORD('PASSWORD') WHERE User='root'; 
Query OK, 1 rows affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
```

```
ERROR 1054 (42S22): Unknown column 'Password' in 'field list'
mysql> update user set authentication_string=password('PASSWORD') where user='root'
Query OK, 0 rows affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 1

Warning (Code 1681): 'PASSWORD' is deprecated and will be removed in a future release.

mysql> update user set authentication_string='PASSWORD' where user='root'
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
```


改めてログイン：

```
$ mysql -u root -pPASSWORD
```

注意：`-p`と`PASSWORD`の間にスペースは必要ない


## 参照

- [公式トラブルシューティング](http://dev.mysql.com/doc/mysql-getting-started/en/#mysql-getting-started-troubleshooting)
playframework 国際化

例えば日本語、英語に対応したい時。
# application.conf
application.confにjaを追加する。

```scala:application.conf
application.langs="en,ja"
```
# messages.ja
conf配下に messages.ja という名前のファイルを用意する。

```scala:messages.ja
# --- Application
application.description=国際化(≧∇≦)/
```

# xxx.scala.html
あとは国際化したい場所で使うだけ。

```scala:xxx.scala.html
@import play.api.i18n.Messages
@main("Welcome to XXX") {

    <div class="well">
        <h1>XXX</h1>
        @Messages("application.description")
    </div>
        
}

```
Androidにおいてなぜzipalignをやる必要があるのか

配布するapkファイルはzipalignコマンドで最適化する事が推奨されており、
最適化されていないapkファイルをgoogleのディベロッパーコンソールでアップしようとすると警告が出る。

zipalignとは何をしているのか。実施しないと何が悪いのかをまとめる。

# 何をしているのか

apk内のリソースファイルなどの未圧縮データを4バイトバウンダリに整列している。

# 実施しないと何が悪いのか
Androidでは、データが4バイトバウンダリに整列されている時に効率良くそのデータにアクセスする事が出来る。

逆に整列されていない場合、その整理されていないデータを正しく読むために遅くなり、また多くのメモリを消費するようになる。

apkファイル内のデータは複数のプロセスによってアクセスされる。
（インストーラがマニフェストを読んでアプリケーションに関連する許可をハンドリングする、ホームアプリケーションがリソースを読んでアプリケーションの名前やアイコンを取り出す、システムサーバがリソースを読んで通知などを行う、アプリケーション自身がapkファイルを読む）
zipalgn未実施のアプリがいくつかあると、その複数プロセスが多くのメモリを消費する結果として、メモリの圧迫が増加し、プロセスの強制終了&開始が頻繁に行われるようになる。
最悪の場合、デバイスのバッテリー寿命が短くなってしまう。

zipalignを実施して、プロセスがapkファイル内のデータに効率良くアクセス出来るようにしましょう。

# おまけ
以下のコマンドでzipalignを実施する事が出来る。

```shell-session:
zipalign -f -v 4 example.apk example_release.apk
```

以下のコマンドでzipalign実施済みかどうかの確認が出来る。

```shell-session:
zipalign -c -v 4 example_release.apk
```

zipalignは署名の後で実施する。
zipalign実施後に署名をすると、署名の過程で整形が無効になってしまう。
同様の理由で、zipalign実施後にパッケージの変更を行ってはいけない。
hubot-ircを使ってchannel topicを取得する

例えば


``` test.coffee
robot.hear /(\ topic|^topic)$/i, (msg) ->
   room = msg.envelope.room
   msg.send robot.adapter.bot.chans[room].topic
```

ただ、入室時に取得したtopicから更新されないようなので、以下を追加した。良い方法はないかな。

```node_modules/hubot-irc/src/irc.coffee
bot.addListener 'topic', (channel, topic, nick) ->
   bot.chans[channel].topic = topic
```
声に出して読みたいObjective-Cのライブラリ8種(2014.7)

Swiftに浮かれているiOS開発者のみなさんこんにちは。Objective-Cの記事を書きます。

----

手になじんでるものから、良さそうなので使ってみたいものまで、
個人的に筋がいいと思っているObjective-Cのライブラリを紹介します。

# YLMoment
https://github.com/YannickL/YLMoment

日付や時間と文字列を扱いやすくしてくれるライブラリ。
タイムラインでよくある"19 hours ago"みたいな文字列をNSDateから作ったり。
日本語対応。


# MTDates
https://github.com/mysterioustrousers/MTDates

NSDateの便利カテゴリ。
何日から何日までのNSDateの配列を取得したり、その日・週・月の頭のNSDate、先週の頭のNSDateなど。
欲しいと思った機能はだいたいあります。

# JLRoutes
https://github.com/joeldev/JLRoutes

開発の初期にはURLSchemeから自前で処理を振り分けたりしますが、当然のように辛くなるのでJLRoutes。
sinatraっぽく書けます。sinatra使ったことないけど。

# Bolts
https://github.com/BoltsFramework/Bolts-iOS

FaceBookとFaceBookに買収されたParse.comが公開しているBolts。Boltsに含まれるBFTaskの使い勝手がよい。
JavaScriptのPromisesと同じで、今はないが将来値が返されるというような状態をオブジェクトとして表現できるので、APIクライアントやローカルのDBにアクセスする場合なんかに使うと、呼び出し側の非同期処理を簡潔に記述できます。

PromiseKitなんてのもあるみたいですが、黒魔術っぽかったり、カテゴリにprefixがなかったりで、Bolts使ってます。
http://promisekit.org

# BugshotKit

https://github.com/marcoarment/BugshotKit

関係者に向けた開発版で、サーバーの切り替えや、ログの表示送信をアプリ内で行えるようにしている会社がけっこうあるみたいです。
ログの送信だけでも手軽にできるとdogfoodingが捗るので、BugshotKitよさそうだなと。

# ReactiveCocoa

https://github.com/ReactiveCocoa/ReactiveCocoa

もう1年近く検討していて、いつも実戦では難しいなという結論に達するReactiveCocoa。
Swiftなんかより新しい世界が待っています。

振る舞いを宣言的に書けるので、変化する値を上手く扱うことができて、
今、Objective-C&MVVMで書こうと思ったら必須じゃないでしょうか。

問題はアニメーションとの相性の悪さ、UITableViewとの相性の悪さ。
特にUITableViewは再利用の問題があってセルとエンティティが1:1ではないので、辛いものがある。
原理的に難しいんじゃないかという気がしなくもないです。

とはいえ、新しいパラダイムを触ってみるのはよいことです。
定期的にReactiveCocoaを触っていて、その度にKVOを使う機会が増えるという現象がおきています。

# MTMigration

https://github.com/mysterioustrousers/MTMigration

バージョンを上げたタイミングで一度だけ行う処理を定義できる。以上。

# KeepLayout

https://github.com/iMartinKiss/KeepLayout

AutoLayoutをいい感じのAPIで(比較的)簡潔に実装することができるKeepLayout
IBを使っているコードと使っていないコードの境界で活躍します。

本当はすべてAutoLayoutに移行できればいいんですが、長く運用しているアプリにはいろいろあるんです。

# おまけ

全く関係ないんですが、以下ViewControllerを軽量にするための指針に関する良記事。
http://www.objc.io/issue-1/lighter-view-controllers.html

# 広告

株式会社グルコースでは本物のObjective-Cエンジニアを募集しています。よろしくお願いします。
https://www.wantedly.com/projects/6619?u=5600011
Vagrant入門 on Mac OS X


今更感が否めないけど備忘録としてメモ。

# Vagrantとは?
- 仮想マシンのフロントエンド
- Boxと呼ばれる仮想マシンを複数個起動が可能
- VirtualBox/AWS等に対応
- コマンドライン一発で仮想マシンの作成/破棄が可能
	- VagrantXというGUIもある
- Chefにも対応

# Boxとは?
- 仮想マシンのイメージファイル
- 自分で作成するのもあり、第三者が作成して公開してあるものを流用するのも可
- http://www.vagrantbox.es/ で各OSのBoxが公開されている

# 準備
## VirtualBoxのインストール
https://www.virtualbox.org/wiki/Downloads

- Mac用ものをDL&インストール

## Vagrantのインストール
http://www.vagrantup.com/downloads.html 

- 同様にMac用のものをDL&インストール

# Box
## Box一覧の確認
- 追加されているBoxの一覧が確認できる

```
$ vagrant box list
```

## Boxを追加

- `BOX_NAME`には極力わかりやすい名前がいいかも
- `BOX_URL`はhttp://www.vagrantbox.es 等からイメージのURLをコピーする

```
$ vagrant box add BOX_NAME BOX_URL
```

## Boxの削除
```
$ vagrant box remove BOX_NAME
```

# 仮想マシンの操作
ここでは下記のBoxが追加されていることを前提にします

- Box name: centos-6.5.3
	- https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box

## Vagrantの初期化(Vagrantfileの作成)
- 最初にVagrant用のディレクトリをきっておくこと

```
$ mkdir -p ~/Vagrant/CentOS-6.5.3
$ cd ~/Vagrant/CentOS-6.5.3
$ vagrant init centos-6.5.3
```

## 仮想マシンの起動
- sshdが走るのを待っているため少し時間がかかるかも
- 生成されたVagrantfileと同じディレクトリで叩くこと

```
$ vagrant up
```

## 仮想マシンの停止
- 再度`vagrant up`で起動できる
- `vagrant up`と同様に生成されたVagrantfileと同じディレクトリで叩くこと

```
$ vagrant halt
```

## 仮想マシンの削除
- 削除しても何度でも作成が可能なので気にせず削除

```
$ vagrant destroy
```
[PHP] echo などの標準出力が含まれるメソッドをテストする

例えば、テストをしたいコードが下記のようにメソッドを実行した時点で標準出力されるコードを含んでしまっていたとします。

```Japan.php
<?php

class Japan{
  public function getCapital(){
    echo '<div id="capital">';
    echo '埼玉県';
    echo '</div>';
  }
}
```

`getCapital()` は何も return してくれませんので、代わりに標準出力された内容をテストします。標準出力される内容を取得できる `ob_start()` と `ob_get_clean()` を使います。これにより、標準出力される内容を変数に格納できますのでテストを行えるようになります。

```JapanTest.php
<?php

require_once 'Japan.php';

class JapanTest extends PHPUnit_Framework_TestCase{
  public function testGetCapitalOutputsExpectedHtml(){
    $japan = new Japan();
    ob_start();
    $japan->getCapital();
    $actual = ob_get_clean();
    $expected = '<div id="capital">埼玉県</div>';
    $this->assertEquals($expected, $actual);
  }
}
```

下記を参考にしました。ありがとうございます。
https://github.com/cakephp/cakephp/blob/3.0-stacktrace/tests/TestCase/BasicsTest.php#L838-L851
Navigation Controller の "戻る/back" ボタンをカスタマイズする


# NavigationItem の BarButtonItem をカスタマイズする

Navigation Controller は画面遷移をコードを書かずにサポートしてくれるのでよく使います。

戻る際のボタンも NavgitationItem の title プロパティの値を自動で設定してくれたり便利ではありますが、
title プロパティを設定しない場合、下記のように "Back" と表示されてしまいます。

![Screen Shot 2014-07-08 at 23.17.40.png](https://qiita-image-store.s3.amazonaws.com/0/27210/0c905816-300a-869f-38ba-92543384c094.png "Screen Shot 2014-07-08 at 23.17.40.png")

ここのテキストの内容を変更したい場合、新たに UIBarButtonItem を生成する必要があります。

```
    UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
    barButton.title = @"戻る";
    self.navigationItem.backBarButtonItem = barButton;
```

ポイントは 遷移元（"Back" ボタンが表示される前）の ViewController に書くことです。戻るボタンを設定しているので言われてみるとそうだなーと思いますが。

![Screen Shot 2014-07-08 at 23.47.26.png](https://qiita-image-store.s3.amazonaws.com/0/27210/677aa6d9-ed73-f08f-3627-1aa1d4d9ec79.png "Screen Shot 2014-07-08 at 23.47.26.png")

これで自由にテキストを設定できるようになりました。