OmniAICreator/Qiita-1.07M huggingface dataset:
XAMLデザイナーがエラーで開けなくなったら、Visual StudioのCacheをクリアしてみる。

SP3にバージョンアップしたらXAMLデザイナーがエラーで起動しなくなったのでCacheをクリアしたらなおりました。

## 環境

以下の環境で、Winストアアプリを開発しています。

- Visual Studio for Windows 2013 Express
- Windows 8.1（Mac mini でBootcampで使用）

## きっかけ

VS SP3を当てたら、既存のプログラムのXAMLデザイナーが開けなくなりました。

エラーの内容は以下です。

- [3552] デザイナー プロセスが予期せず終了しました
- System.Runtime.Remoting.RemotingException

## 調査

いろいろと調べたところ、Visual StudioがCacheをもっていて、そいつが原因ではないかと。

参照したサイトは以下です。

-  http://connect.microsoft.com/VisualStudio/feedbackdetail/view/797072/designer-crashes-in-visual-studio-2013-with-system-runtime-remoting-remotingexception

## 解決

以下のパスにある、ShadowCache配下にごにょごにょとたくさんフォルダが入っていたので、それをすべて削除してみたところ、改善しました。

- C:\Users\（ユーザ名）\AppData\Local\Microsoft\VisualStudio\12.0\Designer\ShadowCache


以上です。
対となるモデルを透過的にアクセスする

```rb:parent_model.rb
def method_missing(name, *args, &block)
  # 
  begin
    super # ActiveRecord 自身で method_missing を使っているのでそちら優先
  rescue => e
    if self.child_model
      self.child_model.send(name, *args, &block)
    else
      raise e
    end
  end
end
```
SQLAlchemy+MySQLdbで1000件以上のデータを取得する方法


# あるプログラムにて
とあるテーブルにある1500件程度のデータをSELECTしようと以下のようなコードを書いたが、何故か1000件しか取得できなかった。

```python:sample_before.py
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base

schema = 'mysql://user_id:password@localhost/sample'
engine = create_engine(schema, echo=False, encoding='utf-8')
Base = declarative_base(engine)

class Model(Base):
    __tablename__ = 'sample'
    __table_args__ = {'autoload': True}

    def __repr__(self):
        return "<sample class>"

Session = sessionmaker(bind=engine)()
records = Session.query(Model)

print "RECORDS: %d" % records.count()
for record in records:
    print 'ID: %d, NAME:%s, ADDRESS:%s, BIRTHDAY:%s'
```
上記のコードを実行すると、```records.count()```が1000となる。
今まで1000件以上のデータを操作したことがなかったので、調査してみた。

まずは、使っている環境は以下の通り。
## ミドルウェア関連
+ MariaDB 5.5.37

## Python関連
+ Python 2.7.x
+ MySQLdb 1.2.5
+ SQLAlchemy 0.9.4

# 原因
調査の結果、MySQLdbのデフォルトカーソルがローカルのプログラム側にあることで制限がかかってしまうことがわかった。

# 対策
サーバー側にカーソルを持たせてしまえばいけそうだということで、以下のようにコードを修正。

```python:sample_after.py
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base

import MySQLdb.cursors

schema = 'mysql://user_id:password@localhost/sample'
engine = create_engine(schema, echo=False, encoding='utf-8', 
                       connect_args={'cursorclass': MySQLdb.cursors.SSCursor})
Base = declarative_base(engine)

class Model(Base):
    __tablename__ = 'sample'
    __table_args__ = {'autoload': True}

    def __repr__(self):
        return "<sample class>"

conn = engine.connect()
Session = sessionmaker(bind=conn)()
records = Session.query(Model)

print "RECORDS: %d" % records.count()
for record in records:
    print 'ID: %d, NAME:%s, ADDRESS:%s, BIRTHDAY:%s'
```

## 対策のポイント
+ 5行目にMySQLdb.cursorsを追加
+ 9行目でcreate_engineを作成する際に、カーソルをサーバ側へ持たせるようにconnect_argsへMySQLdb.cursors.SSCursorを設定
+ 19、20行目を追加&修正

# おわりに
MySQL(MariaDB)の別のドライバを使った場合はどうなるのか?　については調査してないので分からないけども、多分connect_argsで設定してやれば動くのではないかと思われる。

他に良いやり方知ってる人がいたら教えて欲しいです。
angular-ui/bootstrapのcarouselが動かない

ngAnimateと干渉するという既知の問題がある。carousel要素のところだけngAnimateを無効にすれば動くようになる。

https://github.com/angular-ui/bootstrap/issues/1273#issuecomment-38119693

上のリンクの通りだけど、CSの場合はこういう感じ。

``` coffee
  .directive 'setNgAnimate', [
    '$animate',
    ($animate) ->
      ($scope, $element, $attrs) ->
        $scope.$watch ->
          $scope.$eval($attrs.setNgAnimate, $scope)
        , (newValue, oldValue) ->
          $animate.enabled(!!newValue, $element)
  ]
```

``` slim
carousel set-ng-animate="false"
  slide ng-repeat="slide in slides"
    / slide
```
カレント以下のフォルダ/ファイルのパーミッションを変更したい

# カレント以下のフォルダ/ファイルのパーミッションを変更したい
###（ただし基本的に既存の設定は保持したい）

対象ディレクトリに移動後、

* カレント以下のディレクトリに対してグループの読み書き権を付与
` find . -type d -print | xargs chmod  g+rw ` 


* カレント以下のファイルに対してグループの読み書き権を付与
` find . -type f -print | xargs chmod  g+rw `

※chmod 664などと決め打ちではないので、既存パーミッションの意図せぬ変更をなるべく防げる
JavaScipt 初心者が ファ！？ となること３つ


他の言語と比べて特殊な仕様？であるわりに、入門的な書籍やサイトでも説明がなく、そのうえ既存のJavaScriptソースを読む際に頻出して分かりづらかった点です。

※ まだまだ初心者で学習中なので、補足や指摘があればコメントおねがいします！

## 即時関数

```javascript:例
(function() {
  console.log('hoge');
})();
```

- `(function(){..})()` の書き方は **即時関数** と呼ばれるので、この記述をブラウザが読んだ時点で、実行される。
- こういう書きかたをするメリット(いまの私の理解)
	- 即時関数の内部で定義したローカル変数や関数を、即時関数の外部から隠蔽できる(グローバル汚染がされない)。

## 関数の書き方が２つある

```javascript:パターン①
function hoge(){
  console.log('hoge');
}
```

```javascript:パターン②
var hoge = function(){
  console.log('hoge');
};
```

- どちらも `hoge();` で実行できる。
- パターン②の方は **無名関数** 。つまり関数名が定義されていない。
	- こういう書きかたをするメリット(いまの私の理解)
		- そもそも関数名を定義していないので、その関数名でのグローバル汚染がされない(関数名も変数)
	- 一度しか使わない処理向け。なぜそれなのに関数化するのか、という疑問もあるかもしれないが、関数化すればまとまった処理が書け、且つ、内部で定義したローカル変数等をグローバルから隠蔽できる。

## 関数自体がオブジェクトである

例えば次のような関数の定義があるとします。

```javascript:
function hoge(){ return "hoge"; }
```

<del>`{..}` で囲ってる、つまり、オブジェクトである(いまの私の理解)。</del> 違うらしい

なので、上記は 変数 `hoge` というオブジェクトを定義している、と言い換えることができるかと思います。

なので、他の関数の引数としてオブジェクトを渡したり、また、次のように別の変数へ代入したりできます。

```javascript:
function hoge(){ return "hoge"; }

var hoge2 = hoge; 
console.log(hoge2());
```

## 補足

↓ 下にコメントをくださってる内容の方が、正しい理解です^^;
スリープ時にもBroadcastを処理する方法

# スリープとBroadcast
端末がスリープ状態の場合でも`BroadcastReceiver.onReceive()`の呼び出しは通常どおり行われる。
ただし、`onReceive()`から`Service`を呼び出して処理させる場合、その処理が中断されてしまう可能性がある。
確実にバックグラウンド処理を行うためには、`Wakelock`によってスリープ状態を制御する必要がある。

この処理は通常、`Service`で`Wakelock`を扱う場合、`PowerManager`を使って以下の様に記述する。

````AndroidManifest.xml
<uses-permission android:name="android.permission.WAKE_LOCK" />
````

````java
PowerManager powerManager =  (PowerManager)getSystemService(POWER_SERVICE); 
Wakelock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK , "MyWakelockTag"); 
// wakeLock開始
wakeLock.acquire();

// 処理

// wakeLock解除
wakeLock.release();
````

これでも問題なく動くのだが、Androidではスリープ時にBroadcastを扱うための便利な仕組みが用意されている。

# WakefulBroadcastReceiver
`WakefulBroadcastReceiver`はSupport Libraryに含まれる`BroadcastReceiver`のサブクラスである。
スリープ状態で`Service`を扱うためのメソッドが二つ追加されている。
https://developer.android.com/reference/android/support/v4/content/WakefulBroadcastReceiver.html

Manifest記述は通常の`BroadcastReceiver`と変わらない。
当然、Manifestへの`uses-permission`記述も必要となる。

````AndroidManifest.xml
<uses-permission android:name="android.permission.WAKE_LOCK" />
<receiver android:name=".MyBroadcastReceiver">
...
</receiver>
<service android:name=".MyService" />
````

サービスの起動には`startService`ではなく`startWakefulService`を使用する。
このメソッドは内部で`startService`を呼んだあと`Wakelock.acquire()`でスリープ制御を行っている。

````MyBroadcastReceiver.java
public class MyBroadcastReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent serviceIntent = new Intent(context,MyService.class);
        // サービス起動
        startWakefulService(context,serviceIntent);
    }
}
````

サービス側では処理の終了時に**必ず**`WakefulBroadcastReceiver.completeWakefulIntent()`を呼ぶ。
また、`startWakefulService()`では`Intent.putExtra()`でwakelock制御IDを`Intent`に追記しているため、`Service`起動時の`Intent`を引数に入れること。


````MyService.java
public class MyService extends IntentService {

    public MyService() {
        super("MyService");
    }

    @Override
    protected void onHandleIntent(final Intent intent) {
        try {
             // サービス内部の処理
        } finally {
            // Wakelockの解除処理が必ず呼ばれるようにしておく
            WakefulBroadcastReceiver.completeWakefulIntent(intent);                    
        }
    }
}
````

# まとめ
コード量を大幅に削減できてID管理とかも裏でやってくれるのは楽だ。
スリープ時にBroadcastを処理することはよくあるので、ぜひ覚えておきたい。
ぎゃー！変更を破棄しちゃったー！でもstashしてた！の件

↓スーパー便利

http://shirusu-ni-tarazu.hatenablog.jp/entry/2012/04/19/011848



〜復活手順〜
①行目：候補のsha1(commit id)がいくつか出てきます（stashだけじゃないのかも？）
②行目:それらのsha1の内容を確認していき、復活させたい変更を見つけ出します（多いと大変…）
③行目：取り込みたい変更が見つかったら、cherry-pickでブランチに反映させます


```
 git fsck | awk '/dangling commit/ {print $3}'
 git show --summary 候補のsha1
 git cherry-pick -n -m1 取り込みたい履歴のsha1
```
Scala で PhantomJS を使う

<del>Selenium と</del> PhantomJS ドライバーを入れるだけ。

```:build.sbt
name := "HogeHoge"

version := "0.1"

scalaVersion := "2.10.3"

libraryDependencies += ("com.github.detro.ghostdriver" % "phantomjsdriver" % "1.1.0").
						exclude("org.seleniumhq.selenium", "jetty-repacked")
```

あとは FirefoxDriver と同じように扱える。

```scala:main.scala
def main(args: Array[String]) {
    implicit val driver = new PhantomJSDriver()

    driver.get("http://google.com")
    val file = driver.getScreenshotAs(OutputType.FILE)
    Files.copy(Paths.get(file.toURI), Paths.get(file.getName))

    driver.quit()
}
```

結果

![screenshot1875077328556248451.png](https://qiita-image-store.s3.amazonaws.com/0/2570/43f0416b-cad2-f4f3-67a3-92c540e998d3.png)

ちょうかんたん！
[Android]リリースに必須だけど面倒！アプリのウェブサイトを手軽に作る。

AndroidアプリをPlayストアに掲載するときにウェブサイトかメールアドレスが必須です。
![掲載情報](https://qiita-image-store.s3.amazonaws.com/0/40758/72f4eab5-f114-ed57-f839-c90dc2b68233.png)


全然用意してなかったーという人は、無料のサービスを使ってとりあえずなんとなくそれっぽいランディングページを作って載せておきましょう！！

[完成イメージ]
[耳年齢チェック](https://www.smore.com/t6dsb)

# 手順
1. アプリのスクショをはめ込んだ画像を作る。（無料のサービスで←大事）
1. 1ページだけのサイトをドラッグ＆ドロップで作る。（無料のサービスで←大事）

# スクショを埋め込んだ画像を作る。

![こんなん](https://d1zqayhc1yz6oo.cloudfront.net/thumbs/thumb-12fd06f2f1db7ef40c500497948163b5.png)

なんとなくシャレオツに見えるこれを作りましょう。

*[iPhone Screenshot Maker](http://iphone-screenshot.com/)*
こちらのサービスへいってらっしゃいませ。
あ、アプリのスクショは用意しておいてくださいねー。
サイト名はiPhoneですが、上の画像のようにAndroid端末風のフレームも用意されています。
フレームを選ぶところでauto detectを選びましょう。

# スクショを埋め込んだ画像を作る。その2

![こんなん](https://d1zqayhc1yz6oo.cloudfront.net/59d2f4c9b5ffdf5e05366090746f7f0f.jpg)

使ってるところの写真があるとダウンロードに対する心理的障壁が下がるとか下がらないとか（適当）。

*[Placeit](https://placeit.net/)*
こちらのサービスへいってらっしゃいませ。
こちらもいろんな写真にスクショを埋め込んでくれます。
無料ですがお金を払うと大きいサイズの写真をダウンロードできるようです。無料版で充分です。

# スクショを埋め込んだ画像を作る。その3

Google先生からも直々にこんなツールが提供されています。@ryokosuge さんに教えていただきました！
[Device Art Generator](http://developer.android.com/distribute/tools/promote/device-art.html)

![1460270d-040d-4b54-80e7-46974abcf74d.png](https://qiita-image-store.s3.amazonaws.com/0/40758/237ed1b0-4d62-1071-8458-d28db894758c.png)


スクショのサイズを規定のサイズ（Nexus5用なら1080×19201。など）に合わせて、端末の絵の上にドロップするだけです。
オフィシャルの安心感があります。




# サイト（ランディングページ）を作る。

*[Smore](https://www.smore.com/)*
こちらのサービスへいってらっしゃいませ。
フライヤーを作るサービスです。これをランディングページにしちゃいましょう。
ドラッグ＆ドロップでさくさく作れます。さきほど作ったスクショ埋め込み画像を適当に配置して、なんとなくそれっぽい文言を入力しましょう。

↓こういうのを手軽に作るためのサービス。
![smore](https://d1zqayhc1yz6oo.cloudfront.net/s/images/landing-page/screenshot-3.jpg?_v=1387137222)

Google Playストアの公式ボタン↓を置きたいところですが、画像リンクを置く機能は有料みたいです...Smore標準のボタンで我慢しましょう。んー残念。
![Playストア公式ボタン](http://developer.android.com/images/brand/ja_app_rgb_wo_60.png)

# 最後に
ブログでもなんでもいいのですが、「できればそれっぽく作りたい」というときにはよいのではないでしょうか？
サクッと作ってアプリをリリースしちゃいましょう！
MacOS X 10.9 MavericksにHaskell環境を整えた時のメモ


### 準備物
Haskell Platform
http://www.haskell.org/platform/mac.html

clang-xcode5-wrapper
https://gist.github.com/mzero/7245290

### 1.Haskell Platformをインストール
省略

### 2.clang-xcode5-wrapperを/usr/local/binにコピー

```
$ sudo cp clang-xcode5-wrapper /usr/local/bin
$ sudo chown root /usr/local/bin/clang-xcode5-wrapper
$ sudo chmod +x /usr/local/bin/clang-xcode5-wrapper
```

### 3.設定の書き換え

```
sudo sed -i -e "s:C compiler command.*$:C compiler command\",\"/usr/local/bin/clang-xcode5-wrapper\"):g" /Library/Frameworks/GHC.framework/Versions/Current/usr/lib/ghc-7.6.3/settings
```

### 4.パスの設定

シェルの設定ファイルに追加

```
export PATH=$HOME/Library/Haskell/bin:$PATH
```

### 5.cabalをアップデート

```
git clone https://github.com/haskell/cabal.git
cd cabal/cabal-install
cabal update
git checkout cabal-install-v1.20.0.3
cabal install
```
InDesign のテキストフレームに独自機能を追加してみる

　今日は Javascript の prototype という仕組みを使って InDesign のテキストフレームに独自の機能を追加してみます。追加するのは以下の３つ。

①width
　引数無しで呼び出すとテキストフレームの幅を返します。引数を指定している場合はテキストフレームの幅を変更します
②height
　引数無しで呼び出すとテキストフレームの高さを返します。引数を指定している場合はテキストフレームの高さを変更します
③toRightSide
　引数で指定されたオブジェクトの右側に自身（テキストフレーム）を移動させます

　prototype を使用すると InDesign の既存クラスであっても独自の機能を追加できるので、いろいろと捗ることがあるやもしれません。

　今回のサンプルスクリプトを実行すると、
![mae.png](https://qiita-image-store.s3.amazonaws.com/0/4000/4cf6605f-e9f4-5227-3ae3-4d0767de0925.png)
↑これが
↓こうなるよー ※実行するときはテキストフレームを選択してね
![ato.png](https://qiita-image-store.s3.amazonaws.com/0/4000/9324ddd0-3465-03fe-3d66-f05fd22f76f6.png)

以下サンプルコードの注意点
・エラー処理とかはいつもどおり省略しております
・toRightSide の処理は右側に移動しているだけ、X方向の座標を変更しているだけなので、縦位置は変わりません。サンプル画像はたまたま縦が揃ってるだけです

```javascript:
//ソート用の関数X座標昇順に並べる
function mySort(a,b) {
	return(a.visibleBounds[1]-b.visibleBounds[1]);
}

// mmに単位を変更する
function tomm(document) {
  var back_x = document.viewPreferences.horizontalMeasurementUnits;
  var back_y = document.viewPreferences.verticalMeasurementUnits;
  document.viewPreferences.horizontalMeasurementUnits = MeasurementUnits.millimeters;
  document.viewPreferences.verticalMeasurementUnits = MeasurementUnits.millimeters;
  return [ back_x, back_y ];
}

// mmから単位を元に戻す
function tounit(document, unit) {
  document.viewPreferences.horizontalMeasurementUnits = unit[0];
  document.viewPreferences.verticalMeasurementUnits = unit[1];
}

//=========================================================
//prototype を使用してテキストフレームへ機能を追加してみる
//=========================================================

//対象のオブジェクトの右側に移動する
TextFrame.prototype.toRightSide = function(targetObj,distance) {
	var leftPostion = targetObj.visibleBounds[3] + distance;
	this.move([leftPostion,this.visibleBounds[0]]);
}

//自身の幅を返す。引数がある場合は幅を変更する
TextFrame.prototype.width = function(value) {
	if (value == null) {
		return this.visibleBounds[3] - this.visibleBounds[1];
	} else {
		this.visibleBounds = [
			this.visibleBounds[0] ,
			this.visibleBounds[1]  ,
			this.visibleBounds[2] ,
			this.visibleBounds[1] + value
		];
	}
}

//自身の高さを返す。引数がある場合は高さを変更する
TextFrame.prototype.height = function(value) {
	if (value == null) {
		return this.visibleBounds[2] - this.visibleBounds[0];
	} else {
		this.visibleBounds = [
			this.visibleBounds[0] ,
			this.visibleBounds[1]  ,
			this.visibleBounds[0] + value ,
			this.visibleBounds[3]
		];
	}
}

//処理はここからよー
myDoc = app.activeDocument;
var myBackUnit = tomm(myDoc);
var myObj = new Array();
myObj = myDoc.selection;
myObj.sort(mySort);

var nowObj = null;
var i = 0;
for (i=1;i<myObj.length;i++) {
	myObj[i].height(myObj[0].height());
	myObj[i].width(myObj[0].width());
	myObj[i].toRightSide(myObj[i-1],3);
}
tounit(myDoc,myBackUnit);
```
HTML5の参考サイト

【参考用備忘録】
HTML5について

* 詳しい参考サイト
　　https://w3g.jp/blog/studies/html5report


* コンテンツモデルや実際の書き方などに関しては、こっち(↓)が参考になる
　　http://www.mdn.co.jp/di/articles/2605/?page=2


* HTML5リファレンス
　　http://www.tagindex.com/html5/index.html


* コンテンツ・モデル自体についての説明
　　http://www.html5-memo.com/basic/rule-002/
iPhoneシミュレーターの使い方 (Mac)

昔書いた記事から。

* [iPhone向けサイト開発に便利なiOSシミューレーターのインストール方法。あと使い方やTipsとか。 | Ginpen.com](http://ginpen.com/2013/05/20/iphone-simulator/)

# インストール

XCodeをインストールしてください。それに含まれます。

# エミュレーター起動

XCodeから起動してもいいけど、アプリを直接実行してもいい。

1. Finderで アプリケーション→Xcode.app を右クリック→パッケージの内容を表示
  * Xcode.app内が表示される
2. Contents→Applications→iPhone Simulator.app（エイリアス）

起動したらDocに固定しとくと吉。

# エミュレーターの使い方

## 操作

* クリック = タップ
* ドラッグ = スワイプ類
* option+ドラッグ = ピンチ、ロール
* option+shiftでピンチ位置変更
* command+shift+Hでホームボタン
* （ホストOSのブラウザー等から）リンクやURLをドロップするとSafariでそれを開く
* command+shif+Vで、ホストOSのクリップボードから貼付け
* たまにキーボードが反応しないときは、アプリ再起動

## メニュー

* ハードウェア→デバイス で端末種類、OSバージョンを切り替え
* ウィンドウ→表示サイズ で表示サイズ変更（Retina端末は50%にするとか）
* デバッグ→ブレンドレイヤー（カラー） で「[GPU合成レイヤー](http://ginpen.com/2013/12/06/hardware-acceleration/)」の確認（高度な開発用）
* デバッグ→最前面のAppでスローアニメーションを切り替える でアニメーションをゆっくりにしたり戻したり（よくショートカット⌘Tを誤爆する……）

# エミュレーターの注意点等

* 一般に実機より高速に動作してしまうので、体感確認は実機で
* App Storeありません
* Charles有効（やったぜ）
子ビューのタッチイベントをインターセプトしてGestureDetectorでフリックを感知するViewGroup

#子ビューのタッチイベントをインターセプト
結局使わなかったのだけれども、せっかくなので。
子ビューへAtachされるイベントを間でViewGroupにインターセプトさせて、
親側のOnGestureDetectorListenerへイベントをハンドリングしているが、
return falseなので子ViewのOnClickEventListnerも動きます。

```FlickRelativeLayout.java
package jp.sample.app.lib.ViewGroup;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.RelativeLayout;

/**
 * Created by yusukehoshi on 2014/08/12.
 */
public class FlickRelativeLayout extends RelativeLayout implements GestureDetector.OnGestureListener {
    protected GestureDetector gd;

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

    public FlickRelativeLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public FlickRelativeLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public void init(){
        gd = new GestureDetector(getContext(),this);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev){
        super.onInterceptTouchEvent(ev);
        gd.onTouchEvent(ev);
        return false;
    }

    @Override
    public boolean onDown(MotionEvent e) {
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e) {

    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        return false;
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        return false;
    }

    @Override
    public void onLongPress(MotionEvent e) {

    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        Log.d("test", "vx:" + velocityX + " vy:" + velocityY);
        return false;
   }
}

```

普通にRelativeLayoutを置き換えて使えます。
ほかのLayoutでやりたい場合は継承元を変えてください。
[Objective-C] CAKeyframeAnimationでイージング


iOS（Objective-C）には標準で色々アニメーションするようにできています。
簡単なアニメーションなら組み込みのものを組み合わせるだけである程度動きのあるものが作れますね。

ただ、やはり味のある演出をしようとするとどうしても独自のアニメーションを実装する必要が出てきます。
JavaScriptの場合は`requestAnimationFrame`などを使ってタイマーを回しつつ、独自で計算した結果をDOMに反映する、というのが一般的です。（というかそういう方法しかない）

ただ、低レベルAPIで動作を作るがゆえに、細かい制御は比較的簡単にできました。
巷にあるイージング関数とかをさくっと利用することもそれほどむずかしくありません。

Objective-Cでそれをやろうとしたときに、どうしたらいいのかなーと探していたら、`CAKeyframeAnimation`を使うことで、同様のことができるみたいです。

ということで、前置きが長くなりましたが、`CAKeyframeAnimation`を使って独自のイージング関数を利用するサンプルのメモです。

##イージング関数を用意

まず最初に、なにがしかのイージングをする関数を用意します。
どういう関数を作るかというと、以下のように与えられた情報を元に、配列として先に計算結果を返す関数を作ります。

```objc
// 与えられた情報から、イージングの計算をする関数
double easing(double t, double b, double c, double d)
{
	return c * t / d + b;
}

// 与えられた情報から、イージングの結果の配列を返す関数
NSArray * anyEasing(double startValue, double endValue, double duration)
{
	NSMutableArray *values = [NSMutableArray arrayWithCapacity:duration);
	double t = 1 / duration;
	double distance = endValue - startValue;

	for (int i = 0; i <= duration; i++) {
		double currentTime = (t * i) * duration;
		double value = easing(currentTime, startValue, distance, duration);
		[values addObject:[NSNumber numberWithDouble:value]];
	}

	return values;
}
```


##イージングを適用する

```objc
double duration = 5;

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position.y"];
animation.values = anyEasing(0, 100, duration);
animation.duration = duration;
animation.removeOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;

[aView.layer addAnimation:animation forKey:nil];
```

上記の関数で生成したイージングの結果の配列を`CAKeyframeAnimation.values`に設定し、各種設定を行ったら、最後にレイヤーの`addAnimation:forKey:`メソッドに生成したアニメーションを設定すれば完了です。
CrashlyticsのdSYM送信スクリプトをRelease時のみ実行したい


CrashlyticsではdSYMファイルをCrashlyticsのサーバーに送信するようになっていますが、これをReleaseビルド時のみとしたい場合があると思います。

Xcodeの[Build Phases]->[Run Script]で下記のように条件を追加することで、Releaseビルドの際にはCrashlyticsのスクリプトを実行しないようにできます。

![runscript.png](https://qiita-image-store.s3.amazonaws.com/0/16400/3d0eb792-2830-fcc5-00d2-031f21d76620.png "runscript.png")

条件として利用している"$CONFIGURATION"などについては[Appleのリファレンスに書いてありました](https://developer.apple.com/library/mac/documentation/DeveloperTools/Reference/XcodeBuildSettingRef/1-Build_Setting_Reference/build_setting_ref.html)。

Debug, Releaseはもちろんカスタムで用意したConfiguration名が取得できます。

ただ、Crashlyticsのスクリプトは実行時に最新のバージョンを取得もして置き換えてくれているようで、debug時に実行しなくなると最新版に気づきにくくなるというデメリットが有ります。

## 参考

$(SRCROOT) や $(BUILD_DIR) 等の Xcode で使用しているマクロの置換内容の一覧を調べる方法
http://d.hatena.ne.jp/shu223/20120804/1344155002

[iOS][Xcode] Crashlytics を導入したプロジェクトで複数人開発する場合
http://tamotamago.com/?p=570
[Objective-C] weak self パターン



うちで使っているweak selfパターンのマクロ。

```objc
typedef id self;

#define weak_target_push __weak self
#define weak_target_pull __typeof(self)
```

typedef id self;
により、selfを再定義している。


使い方

```objc
// `self`を引数に取るブロックを定義
typedef void (^someBlock)(weak_target_pull);

// マクロで置換されるweak selfの引数を指定
- (void)someMethod:(weak_target_push)target usingBlock:(someBlock)block;

////////////////////////////////////////////////////////////////////////////

// ブロックの引数に`__typeof(self) self`を指定して内部で`self`を使用する。
[anyClass someMethod:self usingBlock:^(__typeof(self) self) {
	[self do];
}];
```
[Objective-C] 現在開いているキーボードなどのフォーカスを外す


`UITextField`などにフォーカスを当てるとキーボードが表示されますが、それを閉じたい場合は以下のようにします。

```objc
[aTextField resignFirstResponder];
```

テキストフィールドをFirst Responder（最初に応答するもの）から外すことでキーボードが消える仕組みです。

ちなみに、以下のようにするとFirst Responderかどうか確認できます。

```objc
BOOL isFirstResponder = aTextField.isFirstResponder;
```

## windowの編集状態を解除する

```objc
[aView.window endEditing:YES];
```

こうすることでもキーボードを非表示にすることが出来ます。

※windowは以下のようにも取得できます。

```objc
UIWindow *window = [UIApplication sharedApplication].keyWindow;
if (!window) {
	window = [[UIApplication sharedApplication].windows objectAtIndex:0];
}
```
macのEclipse(Luna)でScalaの環境を作ってみた。

###Java6の環境がいらないなら、
http://blog.irgaly.net/2014/03/23/uninstall-apple-java6/
を参考に削除。

##JDKのダウンロード
http://www.oracle.com/technetwork/java/javase/downloads/index.html
jdk-8u11-macosx-x64.dmg       217,918,294バイト

##Eclipseのダウンロード
http://www.eclipse.org/downloads/
eclipse-jee-luna-R-macosx-cocoa-x86_64.tar
を解凍してアプリケーションフォルダーに移動

##Scalaのダウンロード
http://www.scala-lang.org/download/
scala-2.11.2.tarを解凍して適当なフォルダーに移動

##環境変数を設定（.bash_profile）
export SCALA_HOME=/path/to/scala
export PATH=$PATH:$SCALA_HOME/bin


##EclipseにScala IDE for Eclipseをインストール
Help→Install New Software...
addで
http://download.scala-ide.org/nightly-scala-ide-luna-211x
を追加

出てきたものすべてをインストール

Eclipseを再起動

もしかしたら、EclipseのJREとかの設定が必要かも。


##HelloWorld

Scalaプロジェクトを作成して
srcにScalaObjectでファイル作成

```scala:Main.scala
object Main {
  def main(args: Array[String]) = {
    println("Hello World")
  }
}
```

コンソールに出力されればOK。
[java]spring framework xmlbeanfactory非推奨

javaのspring frameworkを試してみた。
bean定義ファイルを読み込もうとしたらところでエラーが発生する。。

エラーの内容は、「xmlbeanfactoryが非推奨」とのこと

それじゃ推奨されているやり方でやればいいんだと思って
簡単に考えたらハマったのでメモしておく。

# 構成
+ src/SpringTestMain.java
+ src/Target.java
+ src/applicationContext.xml

簡単な構成です。はい。

```java:SpringTestMain.java
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;

public class SpringTestMain {
	public static void main(String[] args) {
		// Beanファイルの読み込み
		Resource resource = new ClassPathResource("applicationContext.xml");
		// ファイル読み込み成否ステータス
		System.out.println("res" + resource.exists());
		
		DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
		XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
		
		// bean定義読み込み
		reader.loadBeanDefinitions(resource);
		Target target = (Target)beanFactory.getBean("target");
		System.out.println("target" + target);
	}
}
```

```java:Target.java

public class Target {

}
```

```xml:applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
  <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-3.1.xsd">
	<bean id="target" class="Target"</bean>
  </beans>
```

必要最低限の内容のみです…！
以上で実行したらBean定義ファイルの読み込みに成功し、
Beanの反映にも成功しました。

DefaultListableBeanFactory
XmlBeanDefinitionReader
↑こいつらのいい説明が思い浮かばなかったので、
教えて頂けると嬉しいです><

spring初心者なので色々ツッコミ所がありましたら、
宜しくお願い致します！
eclipse が起動しなくなった

eclipse が起動しなくなって workspace/.metadata/.log を参照した時に下記ログが出ていたときの対処方法
`
!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2014-01-14 05:14:08.100
!MESSAGE Plug-in "org.eclipse.equinox.p2.ui.sdk.scheduler" was unable to instantiate class "org.eclipse.equinox.internal.p2.ui.sdk.scheduler.AutomaticUpdateScheduler".
!STACK 0
java.lang.NullPointerException
...
`

workspace/.metadata/.plugins 以下の下記フォルダを削除する
* org.eclipse.e4.workbench
* org.eclipse.equinox.p2.ui.sdk
qmail+vpopmail環境でバーチャルドメイン作成するが配送させたくないとき

### メールサーバの移行等でメールアカウント環境だけ新サーバ上に構築したいが、実際の配送はさせたくないときの手順
-
□ vadddomainでバーチャルドメイン作成
□ qmailのcontrol以下のファイルに追加したドメインが記載されているので削除する

* rcpthosts
* virtualdomains

□ qmail再起動

□ 追加したバーチャルドメインのメールアカウント追加等実施

-
有効にしたい場合は上記ファイルへの記述を有効にしてqmail再起動
Markdown で表(テーブル)を描く

Markdown で表(テーブル)を描くには [Tables Generator](http://www.tablesgenerator.com/markdown_tables) が便利
<http://www.tablesgenerator.com/markdown_tables>

Excel の表を貼り付けてテーブル生成も可能です。

Markdown の他、 LaTeX 、 HTML 、 MediaWiki などにも対応。

### Emacs の場合

`markdown-mode` で `orgtbl-mode` 使うようにして、ちょっと手を加えるととても快適になります。

```el
(defun cleanup-org-tables ()
  (save-excursion
    (goto-char (point-min))
    (while (search-forward "-+-" nil t) (replace-match "-|-"))))
(add-hook 'markdown-mode-hook 'orgtbl-mode)
(add-hook 'markdown-mode-hook
          #'(lambda()
	      (add-hook 'after-save-hook 'cleanup-org-tables  nil 'make-it-local)))

```


参考
----
- http://stackoverflow.com/questions/14275122/editing-markdown-pipe-tables-in-emacs
Ebean - Lazy load to check resource existence

Ref:
[1]: [Stack Overflow - Ebean lazy load to see if resource exists](http://stackoverflow.com/questions/16936563/ebean-lazy-load-to-see-if-resource-exists)

When you delete, check count or check existence of one resource, fetch the "resource body" may cause an extra cost. This cost may potentially influence the performance.

In case of that, when you do some query that does not actually need load all data of resource, you might need concept of **lazy load**.

In ***Ebean***, you could do:

```java
boolean itemExists 
        = (YourModel.find.where().eq("id", id).findRowCount() == 1) ? true : false;
```
vim-rails よく使いそうなやつ


https://github.com/tpope/vim-rails.git

### Rails

#### Rails new {name}

rails new コマンド作成するだけ

#### :Rgenerate, :Rdestroy

rails generate / rails destroy を実行する
:Rgenerate! で最初のファイルに移動しない

#### :Rserver, :Rserver!

バックグラウンドでのサーバの起動 / サーバの停止

#### Rake

現在編集中のファイルを元に Rakeタスクを実行する

| File | Task |
|--------|--------|
| model   |  test:units      |
| controller | test:functionals |
| view | test:functionals |
| config/routes | routes |

### ファイル操作

#### gf

カーソル下の文字列から適切なファイルをオープンする

例）

```
Post.first #=> app/models/post.rb
  ^
has_many :comments #=> app/models/comment.rb
             ^
```

#### :E*****

引数で指定した名前のファイルを編集する。
省略時は現バッファのファイル名から推測する。
(app/models/book.rb 編集中のとき :Econtoller を指定すると app/controllers/books_contoller.rbが開く) 

|command|file|
|--------|--------|
|:Econtroller|app/contollers/xxx_controller.rb |
|:Eenvironment|config/application.rb |
|:Efixture | test/fixture/xxx.yml|
|:Efunctionaltest | test/controllers/xxxx_controller_test.rb|
|:Ehelper |app/helpers/xxx_helper.rb|
|:Einitializer|config/routes.rb|
|:Ejavascript|app/assets/javascripts/books.js.coffee|
|:Elayout|app/views/layouts/application.html.erb|
|:Elib|Gemfile|
|:Elocale|config/locales/en.yml|
|:Emailer||
|:Emigration|db/migrate/*****_create_xxxx.rb|
|:Eschema|db/schema.rb|
|:Etask|spec/spec_helper.rb|
|:Estylesheet|app/assets/stylesheets/xxxx.css.scss|
|:Etask|Rakefile|
|:Eunittest|test/models/test_xxx.rb または spec/models/xxx_spec.rb|
|:Eview|app/views/xxxx/yyy.html.erb|

#### :A,:AE,:AS,:AV,:AT,:AD

Alternate file を開く。

(:A/:AE 同じウィンドウ :AS 分割 :AV 縦分割 :AT タブ :AD 現在のバッファ)

|current|alternate|
|---|---|
|model |unittest|
|controller | functional test|
|template |functional test|
|migration | previous migration|
|database.yml | database.example.yml|

#### :R,:RE,:RS,:RV,:RT,:RD

Related file を開く。

(:R/:RE 同じウィンドウ :RS 分割 :RV 縦分割 :RT タブ :RD 現在のバッファ)

|current|related|
|---|---|
|model | schema definition|
|controller | template|
|template | controller|
|migration | next migration|
|database.yml | environments/*.rb|

### 省略入力 

挿入モードで AR:: などと入力すると展開してくれる。
デフォルトでいくつか用意されている。

| abbr | result |
|--------|--------|
| AR:: |  ActiveRecord:: |
| AC:: | ActionContoller:: |
| AV:: | ActionView:: |
| AM:: | ActiveMailer:: |
| AO:: | Foo |
| bt( | belongs_to( |
| ho( | has_one( |
| hm( | has_many( |
| habtm( | has_and_belongs_to_many( |

#### :Rabbr

利用可能な省略入力を表示する

#### :Rabbr [abbr], :Rabbr!

省略入力を定義する。長い名前空間に使うと便利

|command|abbr|result|
|----|----|----|
|:Rabbr SA:: SampleApp | SA:: | SampleApp:: |

:Rabbr! は省略入力の定義を削除

### misc

その他

#### Ctags
タグの作成
g:rails_ctags_arguments で ctags へのオプション指定
注意：jQueryの挿入系メソッドでコメントアウトを含めてはいけない

jQueryの挿入系メソッドでコメントアウトを含めてはいけません。

`$('<p>hoge</p><!-- (^ω^) -->').appendTo('body');`
このようにするひとはいないと思いますが、
handlebars.jsなどテンプレートエンジンを使ってHTMLを挿入している場合などではコメントアウトの含有は往々にしてありえます。

これで何が起きるかというと、例えば

```js

var $o = $('<p>hoge</p><!-- (^ω^) -->').appendTo('body');
		
$o.draggable();//ERROR

```
`Uncaught TypeError: Cannot set property 'position' of undefined
- jquery-ui.min.js:8`

こうなります。
ASP.NETのエラーページが表示されてしまうときの対策

URLに「.」が混ざると、ASP.NET でエラーページがでてしまう問題の解決法。

#エラーページ

1. 独自のエラーページ(自分でリダイレクトするように設定する)
2. IISのエラーページ
3. ASP.NETのエラーページ


#ASP.NETのエラーページが出てしまうパターンと対策

##URLの最後に「.」が付いている場合

* 下記のようなページが出る

![error-page-1.png](https://qiita-image-store.s3.amazonaws.com/0/31862/fc5e8fd8-af14-8668-407d-80609dbc0e66.png)

* 対策1

relaxedUrlToFileSystemMapping=”true”に設定するこの場合、「URLが有効な Windows ファイル パスであるかの検証」が無効になるため、推奨できない（と思われる）。
URLに指定されるパラメータに様々な文字列が含まれる可能性があり、その文字列がWindowsファイルシステムと同じ規則でバリデートされると困る場合は、これを設定すると解決できるようだ。
([参考](http://stackoverflow.com/questions/3541426/how-to-get-asp-net-mvc-to-match-dot-character-at-the-end-in-a-route))


* 対策2

Web.configを下記の通り変更する

変更前：`<httpErrors errorMode=”Custom” existingResponse=”Auto”>`
変更後：`<httpErrors errorMode=”Custom” existingResponse=”Replace”>`

IISが用意したレスポンスが存在した場合に
2.IISのエラーページが返されてしまうが、この対策によって必ずカスタムエラーページを返すように設定できる。


* 対策3

`relaxedUrlToFileSystemMapping=”true”` と、
`existingResponse=”Auto”` を設定する。
（これがベストみたい。）


ちなみに、[MSDN](http://msdn.microsoft.com/ja-jp/library/3ewxz6et.aspx)のページも、URLの最後に「.」がついていると、ASP.NETのエラーページが出でしまっている。
また、URLの最後に「%」が付く場合、400(Bad Request)エラーとなり、下記のページが表示される。

![error-page-2.png](https://qiita-image-store.s3.amazonaws.com/0/31862/7623b5a5-2b74-dbb2-1a78-09ca02712d29.png)

[Configuring HTTP Error Responses in IIS 7](http://technet.microsoft.com/en-us/library/cc731570(v=WS.10).aspx)　によると、カスタムエラーページを表示させることはできないようだ。
このケースは、ASP.NETに到達する前段階でのエラーのため対策ができない。
APIビルダー「Apigility」

https://apigility.org/
https://github.com/zfcampus/zf-apigility
http://sourceforge.jp/magazine/13/10/09/150000
http://www.zimuel.it/oauth2-apigility/
http://akrabat.com/zend-framework-2/investigating-apigility/
https://github.com/akrabat/zf2-tutorial-apigility
CloudWatch Logs Agent を入れたインスタンスをAMI化する時に忘れがちなこと

CloudWatch Logs AgentをインストールしたインスタンスをAMI化する際のメモです。

何度もAMIを取り直したりしないようにまとめました。

## 状態系ファイルの削除

CloudWatch Logs Agentは`/var/awslogs/state`ディレクトリ以下に、状態管理ファイル(設定次第)やら、pidファイルやら、lockファイルを出力します。

初期設定で何も考えずにそのまま使っていると、state_fileが`/var/awslogs/state/agent-state`にあったりするので注意が必要です。

```ini
[general]
# Path to the CloudWatch Logs agent's state file. The agent uses this file to maintain
# client side state across its executions.
state_file = /var/awslogs/state/agent-state
```

念のためpidファイル等も残ってないか`/var/awslogs/state`以下を確認しておくといいですね。

## awslogs.logファイルの削除

awslogs 自体が出力するログファイルですね。
`/var/log/awslogs.log`にあります。

## awslogs-agent-setup.logファイルの削除

Agentのインストール時のログです。後から追いかけることはなさそうですが、不安であれば残すのも手ですね。
`/var/log/awslogs-agent-setup.log`にあります。

## CloudWatch Logs で取得しているファイル内容のクリア(または削除)

CloudWatch Logs は複数のログを取得する用途で使われることが多いと思うのですが、
「Apacheのログは削除したけど、 zabbix-agentのログが残ってたー(泣)」ってことがないように、
設定ファイル`/var/awslogs/etc/awslogs.conf`を確認し、AMI化した時に不要なログはクリアしておきましょう。

また、ログファイルを削除してしまった場合にありがちですが、ログファイルが無い状態でCloudWatch Logs Agentを起動すると、以下のようにawslogs.logファイルにWARNINGが出力され続けます。

知らない間にawslogs.logの容量がどんどん増えてたなんてことが起こらないようにご注意ください。

```
2014-08-11 19:29:56,839 - cwlogs.push - WARNING - Thread-1 - No file is found with given path '/var/log/yum.log'.
```

## サービスの自動起動設定

CloudWatch Logs Agentをインストールしただけだと、自動起動の設定はされていません。

```shell-session
[ec2-user@ip-172-20-17-66 ~]$ chkconfig --list | grep awslogs
awslogs         0:off   1:off   2:off   3:off   4:off   5:off   6:off
```

用途に応じて、ランレベルを変更したり、cloud-initスクリプトもしくはuser-dataでの起動指定が必要になりそうです。

## まとめ

CloudWatch Logs Agentをインストールし、AMI化する際に忘れがちなことについてまとめました。

_※ AMI化する際に消しておいたほうが良いと思われるファイルは、CloudWatch Logs Agentのインストールに限らず多々ありますが今回は触れていません。_

ただの削除対象ファイルの列挙みたいになってしまいましたが、`/var/log`以下には結構意識が向くけど、他にも考慮するべき点があるかもよってことで。

ざっくりまとめると、

1. Cloudwatch Logs Agent自体に関するファイルは削除する
2. 取得するログはクリア(or 削除)する
3. サービスの自動起動は、デフォルトでoffになっている


他にもございましたら、教えてください。
Ansibleの踏み台を経由した実行について

## 踏み台経由でSSHを通して実行する

[mydev01] --> [mydev02]  --> [mydev03]

| サーバ | ユーザ | 役割 |
|:-----:|:-------:|:-------:|
| mydev01(192.168.33.31) | vagrant01 | Ansible実行サーバ |
| mydev02(192.168.33.32) | vagrant02 | 踏み台サーバ |
| mydev03(192.168.33.33) | vagrant03 | Ansible実行対象サーバ |

便宜上ホスト名の番号をユーザ名の後ろにつけます。
### ssh鍵が設定できていない状態で踏み台経由ログイン

mydev01から踏み台(mydev02)を経由してmydev03にアクセス

```
[vagrant01@mydev01]

$ vi sshconfig.vagrant01.mydev01_vagrant02.mydev02
=======================
Host *
	IdentityFile /home/vagrant01/.ssh/id_rsa
	ProxyCommand ssh -W %h:%p -w 120 vagrant02@192.168.33.32
=======================
```
* Host * で、全てのホストに対して適用
->「HOST 192.*」のようにアドレスで実行先ホストを限定できる。
-> 逆引きできない環境の場合は/etc/hostsファイルなどで別名をつけ、その別名を使ってアクセスしようとしてもProxyは使われない。
例) `$ ssh -F sshconfig.vagrant01.mydev01_vagrant02.mydev02 vagrant03@mydev03`

* IdentityFileで、mydev01のvagrant01ユーザの秘密鍵を指定
* ProxyCommandで、vagrant02ユーザで192.168.33.32(mydev02)の踏み台サーバを経由する
 
```
[vagrant01@mydev01]

$ ssh -F sshconfig.vagrant01.mydev01_vagrant02.mydev02 vagrant03@192.168.33.33
vagrant02@192.168.33.32's password:   
vagrant03@192.168.33.33's password:    
```
* mydev01からユーザvagrant03で192.168.33.33(mydev03)にssh
* 最初に192.168.33.32(mydev02)でvagrant02のパスワードを求められる
* 次に192.168.33.33(mydev03)でvagrant03のパスワードを求められる

この場合、パスワードを聞かれずに開発サーバにログインするには

* mydev01のvagrant01ユーザの公開鍵を踏み台サーバ(mydev02)のvagrant02ユーザの.sshに置く
* mydev01のvagrant01ユーザの公開鍵をAnsible実行サーバ(mydev03)のvagrant03ユーザの.sshに置く

踏み台サーバ(mydev02)の秘密鍵、公開鍵は使っていない。

## ansibleでProxy経由
```
[vagrant01@mydev01]

export ANSIBLE_SSH_ARGS=' -F sshconfig.vagrant01.mydev01_vagrant02.mydev02'
```
上記環境変数を設定。フルパスでファイルを指定する方が都合良いかも。

```
$ ansible-playbook -i hosts ansible_test.yml -c ssh
```
Cent6.5現在、デフォルトのSSHが若干古いので `-c ssh` を指定しないと接続にparamikoが使われてProxy経由接続ができない。
node.jsで標準入力

# 概要
atcoderで標準入力に対応した時の話

# 対象者
 - windowsでやっている

# コード
`type a.txt | node a.js`で実行します。

パイプを使わないと、`end`イベントが発生しません。

```js
process.stdin.resume();
process.stdin.setEncoding('utf8');

var g_input = '';
process.stdin.on('data', function(chunk) {
	g_input += chunk;
});
process.stdin.on('end', function() {
	main(g_input.split(/\r?\n/));
});
function main(inputs){
// todo
}
```

# 備考
windowではない場合は、次が簡単です。

```js
var stdin = require("fs").readFileSync("/dev/stdin", "utf8");
```
[AutoLayout] Visual Format Languageが生成するNSLayoutConstraintを全手動で再現

constraintsWithVisualFormat:～とconstraintWithItem:～の関係がよくわからなかったので確認。

Visual Format Languageを使わずに、Visual Format Languageと同じConstraintを再現する方法のメモ。たぶんこれで同じ制約がかけれているはず。


例題は[Autolayout に対応した画面で UIScrollView を使う時のコツ](http://d.hatena.ne.jp/glass-_-onion/20131008/1381240961)からお借りしました。

Visual Format Languageを使った書き方

```
    // Constraint(制約)を追加
    [self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-40-[view1(==240)]-20-[view2(==240)]-40-|"
                                                                            options:0
                                                                            metrics:0
                                                                              views:NSDictionaryOfVariableBindings(view1, view2)]];
```

Visual Format Languageを使わない書き方

```
    [self.scrollView addConstraint:
     [NSLayoutConstraint constraintWithItem:view1
                                  attribute:NSLayoutAttributeLeft
                                  relatedBy:NSLayoutRelationEqual
                                     toItem:self.scrollView
                                  attribute:NSLayoutAttributeLeft
                                 multiplier:1.0
                                   constant:40]];

    [self.scrollView addConstraint:
     [NSLayoutConstraint constraintWithItem:view1
                                  attribute:NSLayoutAttributeWidth
                                  relatedBy:NSLayoutRelationEqual
                                     toItem:nil
                                  attribute:NSLayoutAttributeWidth
                                 multiplier:1.0
                                   constant:240]];

    [self.scrollView addConstraint:
     [NSLayoutConstraint constraintWithItem:view2
                                  attribute:NSLayoutAttributeLeft
                                  relatedBy:NSLayoutRelationEqual
                                     toItem:view1
                                  attribute:NSLayoutAttributeRight
                                 multiplier:1.0
                                   constant:20]];

    [self.scrollView addConstraint:
     [NSLayoutConstraint constraintWithItem:view2
                                  attribute:NSLayoutAttributeWidth
                                  relatedBy:NSLayoutRelationEqual
                                     toItem:nil
                                  attribute:NSLayoutAttributeWidth
                                 multiplier:1.0
                                   constant:240]];

    [self.scrollView addConstraint:
     [NSLayoutConstraint constraintWithItem:view2
                                  attribute:NSLayoutAttributeRight
                                  relatedBy:NSLayoutRelationEqual
                                     toItem:self.scrollView
                                  attribute:NSLayoutAttributeRight
                                 multiplier:1.0
                                   constant:40]];
```

Visual Format Languageを使うと、変数名とかを文字列で書き込むことになって微妙だなーと思ったけど、
使わないのは使わないで、記述量が多すぎる。。。
5分で作るNode.js開発環境


## 開発環境
vagantでCentOS ver6.5に開発環境をセットアップします。

### vagrantのセットアップ

```bash:bash
$ vagrant box add centos65 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
$ mkdir nodejs
$ cd nodejs
$ vagrant init
$ vagrant up
$ vagrant ssh
```
これでひとまずCentOS6.5の環境が出来ました。
あとはCentOS上にログインしてyum upgradeとかvimとかopensslとかインストールしておきましょう。

### NodeJSインストール
NodeJSとjshintをインストール jshintはJSの構文チェッカーなので必須ではないです。

```bash:bash
$ sudo rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo yum install nodejs npm --enablerepo=epel
$ sudo npm install -g jshint
```

### HelloWorld
毎度おなじみHelloWorldを出力します。
まずどこでも良いので、HelloWorld.jsを作成します。

```javascript:HelloWorld.js
// HTTPパッケージを読み込み
var http = require('http');

// WebServerObjectを作成 
var server = http.createServer();
// HTTP RequestがあったらdoRequestで処理
server.on('request', doRequest);
// リクエストを受け取るポートを指定
server.listen(1234);
console.log('Server running!');

// リクエストの処理
function doRequest(req, res) {
	// ヘッダー
	res.writeHead(200, {'Content-Type': 'text/plain'});
	// 出力
	res.write('Hello World\n');
	// 終了
	res.end();
}
```

さて準備が整ったので、いざ動かしてみましょう。

```bash:bash
$ node HelloWorld.js
```

これでブラウザでvagrant上の「ipアドレス:1234」にアクセスすればHelloWorldが表示されます。

以上！
複数のファイル内の文字列をまとめて置換するLinuxコマンド

sedコマンドのiオプションの後ろに指定の文字列を追加すると、元のファイル名 + iオプションに指定した文字列 として残っているので、保険として指定しておくと良い。

## バッシュの場合

### 一つのファイルを対象にする場合
``` bash:bash
$ grep -l '置換対象の文字列' 置換対象のファイル | xargs sed -i.bak -e 's/置換対象の文字列/置換後の文字列/g'
```

### カレントディレクトリのファイル全てを対象にする場合
``` bash:bash
grep -l '置換対象の文字列' ./* | xargs sed -i.bak -e 's/置換対象の文字列/置換後の文字列/g'
```

### ファイル名に正規表現を使う場合
``` bash:bash
grep -l '置換対象の文字列' ./hoge* | xargs sed -i.bak -e 's/置換対象の文字列/置換後の文字列/g'
```
hoge1やhoge2などが対象になる。

完璧に頭に入ってないとgrep調べてsed調べてxargs調べて組み合わせてと手間かかるんでメモしとかないとめんどくさいんですよね。
テキストファイルに埋め込んだ環境変数を展開する

ご利用は自己責任で。

こんなテキストファイルがあります。

```bash
$ cat test.txt
LANG is $LANG
LANG is "$LANG"
LANG is '$LANG'
```

普通にcatすれば上記の通りですが、これをこうすればヒアドキュメント形式になって……

```bash
$ printf "cat <<++EOS\n`cat test.txt`\n++EOS\n"
cat <<++EOS
LANG is $LANG
LANG is "$LANG"
LANG is '$LANG'
++EOS
```

shに渡せば展開されます。

```bash
$ printf "cat <<++EOS\n`cat test.txt`\n++EOS\n" | sh
LANG is ja_JP.UTF-8
LANG is "ja_JP.UTF-8"
LANG is 'ja_JP.UTF-8'
```

以上。
JenkinsでObjective-Cの静的解析を実行できるようにする

# はじめに
コード品質を保つためにも、静的解析は大事です。
ただ、毎回手作業で解析するのも面倒なので、Jenkinsを使って自動化しましょう！

## 説明すること
* Jankinsのインストールから、scan-buildを実行するジョブの作成まで

## 説明しないこと
* JenkinsのSCM関連の設定方法
* xcodebuild等のコマンド

## 環境
* MacOS X (10.9.4)
* homebrew 0.9.5

# インストールするもの
* Command Line Tools for Xcode
* Java for OS X 2014-001
* [scan-build](http://clang-analyzer.llvm.org/scan-build.html)
* [Jenkins](http://jenkins-ci.org/)

# Command Line Tools for Xcodeのインストール
[ここ](http://qiita.com/3yatsu/items/47470091277d46f3fde2)等を参考にインストールしてください。

# Javaのインストール
OracleのJDKでも良いですが、今回はAppleの[Java for OS X 2014-001](http://support.apple.com/kb/DL1572?viewlocale=en_US)をインストールします。

# scan-buildのインストール
次に、Objective-Cの静的解析を実行するため、scan-buildをインストールします。

[公式サイトのダウンロードページ](http://clang-analyzer.llvm.org/installation.html)から、最新のリソースをダウンロードしてください。ダウンロード後、適当なディレクトリに解凍するだけでインストール完了です。

単体で動かしてみたい場合はこんな感じで。

```
$ scan-build xcodebuild -target <your_target> -configuration debug -sdk iphonesimulator clean build -scheme <your_scheme>
```

# Jenkinsのインストール
今回はhomebrewでインストールします。

```
$ brew install jenkins
```

インストール後、以下のコマンドで起動してみる。

```
$ java -jar /usr/local/opt/jenkins/libexec/jenkins.war
```
ポートを変えたい場合は``` --httpPort=[port]```で指定。

起動に成功したらアクセスして動作確認。

```
http://127.0.0.1
```

# Jenkins scan-buildプラグインの導入
ここからJenkins側の設定を弄っていきます。

## プラグインのインストール
「Jenkinsの管理」 -> 「プラグインの管理」 で以下のプラグインをインストールします。

* Clang Scan-Build Plugin	
* Token Macro Plugin
* Xcode Integration

## Clang Static Analyzerの有効化
「Jenkinsの管理」 -> 「システムの設定」 で"Clang Static Analyzer"セクションの「Clang Static Analyzer追加」ボタンをクリックして、scan-buildを使える状態にします。

* 名前: Analyzer（自分の好きな名前でOK）
* インストールディレクトリ: scan-buildを解凍したディレクトリを指定

## 静的解析ジョブの作成
ここまでできればあと一歩です。
「新規ジョブ作成」で「フリースタイル・プロジェクトの作成」を選択し、新しいジョブを作成します。
ジョブが作成された後、
* 「ビルド手順」にscan-buildの処理を追加
* 「ビルド後処理」にscan-buildの実行結果を判断する処理を追加

### scan-buildの追加
ジョブの設定画面で、「ビルド手順の追加」から"Clang Scam-Build"を選択します。
![add_build_procedure.png](https://qiita-image-store.s3.amazonaws.com/0/30970/7519f17d-bc05-a638-d13f-5310946f8c63.png)

追加された"Clang Scam-Build"では、以下の項目を設定します。
![configure_scan-build.png](https://qiita-image-store.s3.amazonaws.com/0/30970/bf2493fe-b5c2-ec03-6499-ff2d1db32e36.png)

### 実行結果の解析を追加
同じように設定画面で、「ビルド後の処理の追加」で"Publish Clang Scan-Build Result"を選択します。
![add_build_prpcedure_after.png](https://qiita-image-store.s3.amazonaws.com/0/30970/9906694d-cf36-ad1d-9438-f20e01c1e27e.png)

ここでは何個以上の警告をバグと見なすか指定することができますが、よほどのことがない限り **0** を設定しておきましょう。
![configure_threshold.png](https://qiita-image-store.s3.amazonaws.com/0/30970/72dead5a-928e-f781-4cc1-a9b6c9bd0edc.png)

## ジョブの実行
ここまで設定した後にビルドを実行すると、scan-buildが自動的に実行されます。
AngularJSで拡張ポイントを持つServiceを作成する.

## はじめに

このエントリは「"利用者側が設定を変更可能な"AngularのServiceの作成方法について」である.

以下のようなAngularJSのServiceがあったとしよう.

```js:myModule.js
var module = angular.module('myModule', []);
module.factory('myService', function(){
  var message = 'Hello, world';
  return {
    hello: function(){
      return message;
    }
  };
});
```

↓のようにインジェクションすれば、 `hello()` が利用できる(何の面白みもない)Serviceだ

```js:app.js
var app = angular.module('myApp', ['myModule']);

app.controller('MainCtrl', ['$scope', 'myService', function($scope, myService){
  $scope.message = myService.hello();
}]);
```

ここで、 `hello()` が返すメッセージをアプリケーションのモジュール毎に設定出来る用にしたいとする.


## サービスプロバイダの利用.

モジュールの利用者側から設定可能なServiceとしたい時は、 `$provide.provider` を利用する.
なんぞそれ、という人もいるかもであるが、先ほどのコードで `factory` であったところを少しイジる程度だ.

```js:myModule.js
var module = angular.module('myModule', []);
module.provider('myService', function(){
  var opt = {message: 'Hello, world'};
  this.configure = function(options){
    opt = angular.extend(opt, options);
  };
  this.$get = function(){
    return {
      hello: function(){
        return opt.message;
      }
    };
  };
});
```

ポイントは `provider` を利用しているところと、 `this...`の辺り.

`provider` の使い方はおもに下記である：
 
 + `provider` はサービスプロバイダのコンストラクタを引数としてセットする.
 + サービスプロバイダのコンストラクタは、 `$get` メソッドを実装しなくてはならない(こいつが無い場合、Angularがエラーを吐く).
 + `$get` メソッドは関数であり、AngularのDI(`$inject`)経由でインジェクションされる際に呼び出される関数を実装する(`factory(...)` でセットしていた関数と同様の位置づけ)

moduleの `provider` はAngularのService登録において、最もプリミティブな関数である.
`$provide.factory` や `$provide.value`, `$provide.service` は、全て `$provide.provider` のラッパに過ぎない.

さて、利用側は↓のように、ポイントは、`config["(サービス名)+Provider"]` とすることで、モジュール側で作成したサービスプロバイダのコンストラクタにアクセスすることが出来る.

```js:app.js
var app = angular.module('myApp', ['myModule']);

app.config(['myServiceProvider', function(myServiceProvider){
  myServiceProvider.configure({
    message: 'My name is Quramy!'
  });
}]);

app.controller('MainCtrl', ['$scope', 'myService', function($scope, myService){
  $scope.message = myService.hello();
}]);
```

AngularJS本体でも、サービスプロバイダ経由で、利用者にServiceの設定を行う口を提供するパターンは多いため、下記等で目にしたこともあるのではないだろうか.

+ Ajax($http) と `$httpProvider.interceptor`
* ngRoute における `$routeProvider.when` 
+ etc...


## 補足・豆知識

+ サービスプロバイダにアクセス可能なのは、 `module.config` のみである.
 + AnguarJSのアプリケーションが開始されてからは、サービスプロバイダにアクセスすることは出来ない.
 + 逆に、アプリケーションを開始してからのServiceの挙動変更を許したいのであれば、`module.value` と `module.run` の組み合わせを考慮した方がよい.
+ `module.config` には、サービスプロバイダと `module.constant` で定義した定数のみがインジェクション可能.
 + `$injector` と `$provide` は例外的にインジェクション可能.
 + Service自体のインスタンス生成が実行されていないタイミングで、`module.config` が走る、という意味.
+ `module.config` の設定は、`module._invokeQueue` に登録されていき、この順序に従って実行される.
 + (やる価値があるかは別として)`angular.module('ng')._invokeQueueをイジると、AngularJS本体の組み込みモジュールのプロバイダ登録より早いタイミングで処理を挟み込むことも出来る.


## 参考

+ https://docs.angularjs.org/guide/providers#providers_provider-recipe
Scala で trait のファクトリを生成してくれるマクロ

を書きました。

##たとえば

こんな trait があるときに

```scala
trait Sample{
  def value1: Int
  def value2: String
  def value3: List[String]
}
```

こんなふうに書けるようになります

```scala
def Sample = TypeFactory[Sample]
val x = Sample(
  value1 = 123,
  value2 = "hello",
  value3 = List("abc")
)
x.value2//hello
```

##継承していても

こんな trait に対して

```scala
trait SubSample extends Sample with SampleTrait{
  def value4: Double
}
trait SampleTrait {
  def value5: Int
}
```

同じように書けます

```scala
def SubSample = TypeFactory[SubSample]
val x = SubSample(
  value1 = 345,
  value2 = "world",
  value3 = List("def"),
  value4 = 1.23,
  value5 = 567
)
x.value5//567
```

ベンリですね

##やってること

[github : TypeFactory.scala](https://github.com/x7c1/Salad/blob/365d4be05abbf16cf324de67deb38a44011662f9/salad-lib/src/main/scala/x7c1/salad/factory/TypeFactory.scala)

```scala
package x7c1.salad.factory

import scala.language.experimental.macros
import scala.reflect.macros.whitebox

object TypeFactory {
  def apply[A]: Any = macro TypeFactoryImpl.factory[A]
}
object TypeFactoryImpl {
  def factory[A: c.WeakTypeTag](c: whitebox.Context) = {
    import c.universe._

    val klass = weakTypeOf[A]
    val pairs = klass.members.
      filter(_.isMethod).filter(_.isAbstract).map(_.asMethod).
      map {
        method => method.name -> method.typeSignatureIn(klass)
      } collect {
        case (term, NullaryMethodType(resultType)) => term -> resultType
      }

    val inner = {
      val tuples = pairs.zipWithIndex.map{ case ((term, _), index) =>
        term -> TermName("$x" + index)
      }
      val values = tuples.map{ case (term, tmp) =>
        q"val $tmp = $term"
      }
      val methods = tuples.map{ case (term, tmp) =>
        q"def $term = $tmp"
      }
      q"{ ..$values; new $klass { ..$methods } }"
    }
    val parameters = pairs.map{ case (term, resultType) =>
      q"$term:$resultType"
    }
    val code = q"new { def apply(..$parameters) = $inner }"
    /*
    println(showRaw(code))
    println(showCode(code))
    // */
    code
  }
}
```

##注意点

* まだ whitebox macro はしばらく experimental 扱い
    * [Blackbox and whitebox macros](http://docs.scala-lang.org/overviews/macros/blackbox-whitebox.html)
        * 仕様が変わって将来つかえなくなる可能性アリ
* Intellij さんも真っ赤
    * マクロ展開してくれないから引数名の補完とか効かない

ｶﾅｼｽ

##参考

* [Def Macros](http://docs.scala-lang.org/overviews/macros/overview.html)
* [Quasiquotes](http://docs.scala-lang.org/overviews/quasiquotes/intro.html)