OmniAICreator/Qiita-1.07M huggingface dataset:
slf4j+logbackの設定でlogback.groovyが使えました

Javaでのコードでslf4j+logbackをロガーとして採用する際、Groovyで設定を書きたくてlogback.groovyを作ったのですが、そこに指定したログファイルにログが書き出されない現象に遭遇しました。

## logback.groovyが設定ファイルであることを明示しました

画面にはログが表示されるので、ファイルに書き出されない理由は設定にあると思い込んでいたのですが、JVM引数としてlogback.groovyが設定ファイルである旨指定すると、わんさかメッセージが表示されるようになり見当違いであることが判りました。

```text:実行時引数
-Dlogback.configurationFile=logback.groovy
```

## Groovyクラスが無いと初期化エラー

最初のbuild.gradleでは、以降に示す初期化エラーになっているようでした。

```groovy:最初のbuild.gradle
apply plugin: 'java'

repositories {
    jcenter()
}

dependencies {
    compile 'org.slf4j:slf4j-api:1.7.12'
    compile 'ch.qos.logback:logback-classic:1.1.3'
    compile 'ch.qos.logback:logback-core:1.1.3'
    
    testCompile 'junit:junit:4.12'
}

```

```text:エラー抜粋
 Groovy classes are not available on the class path.  ABORTING INITIALIZION. 
```


どうやらエラーメッセージの通り、実行時にGroovyライブラリが必要なようで、依存ファイルにgroovy-allを追加したら期待通りログファイルに出力されるようになりました。

```groovy:修正後のbuild.gradle
apply plugin: 'java'

repositories {
    jcenter()
}

dependencies {
    compile 'org.slf4j:slf4j-api:1.7.12'
    compile 'ch.qos.logback:logback-classic:1.1.3'
    compile 'ch.qos.logback:logback-core:1.1.3'
    runtime 'org.codehaus.groovy:groovy-all:2.4.4' // 追加
    
    testCompile 'junit:junit:4.12'
}
```

##参考

* http://logback.10977.n7.nabble.com/What-support-is-needed-to-run-with-logback-groovy-configuration-td2445.html
Reactでゲームつくったよ

Reactというか、最近のフロントエンド開発の勉強ってことで、簡単なゲームを作ったので公開します。オープンソース。

# バトルゲーム

文字通りバトルするゲーム。

攻撃力、防御力、すばやさ、最大HPの４つの値に１００ポイントを振り分け、バトルするゲームだ。

今後進化するかもしれないし、しないかもしれない。

https://dl.dropboxusercontent.com/u/6065713/react-battlegame/index.html

## Github

こちらです

https://github.com/m-kai/react-battlegame
expressで簡単お問い合わせフォーム

# 概要
簡単なお問い合わせフォームが必要だったのでつくりました。
今回はさくらサーバのメールを使ってメールを送っています。

まずロジック側はこんな感じ。

```contact.js
var express = require('express');
var router = express.Router();

// 下の２つはnpm installで新たに入れるもの
var nodemailer = require("nodemailer");
var smtpTransport = require('nodemailer-smtp-transport');

router.get('/', function(req, res, next) {
	var types = [
	{value:'--選択してください--'},	
	{value:'がっこうについて'},
	{value:'ぶかつについて'},
	{value:'その他'}
	];
	res.render('contact', {
		title: 'お問い合わせ',
		types: types,
	});
});

router.post('/', function(req, res, next) {
// メール内容の取得
var types = req.body.type;  
var name = req.body.name;  
var email = req.body.mail;
var message = req.body.message;

// SMTPサーバーの設定
var transporter = nodemailer.createTransport(smtpTransport({
	host: "XXXXX.sakura.ne.jp",
	port: 587,
	tls: true,
// webメールのログインアカウント
	auth: {
		user: "info@XXXXX.sakura.ne.jp",
		pass: "passwd"
	}
}));

transporter.sendMail({
	from: 'お問い合わせ <info@example.com>',
	// お問い合わせ受け取り先のメールアドレス
	to: 'contact@example.com',
	subject: types,
	text: message + "/" + name + "/" + email,
	html: message + "<br>" + name + "<br>" + email
	}, function(err){
		if(err) return next(err);
		console.log("お問い合わせメール送信完了");
	//　完了ページへリダイレクト
	res.redirect('/done');
	});
});

router.get('/done', function(req, res, next) {
	res.render('contact_done', {
		title: 'お問い合わせを受け付けました',
	});
});

module.exports = router;

```

テンプレート側はこんな感じ。swigで書いてます。

```contact.html
<section class="section">
	<h1><span class="content">お問い合わせ</span></h1>

	<form method="POST" class="content form contactForm">
		<dl>
			<dt>お問い合わせの種類 (必須)</dt>
			<dd>
				<div class="selectWrap">
					<select name="type">
{% for t in types %}
						<option value="{{t.value}}">{{t.value}}</option>
{% endfor %}
					</select>
				</div>
			</dd>
			<dt>お名前 (必須)</dt>
			<dd><input type="text" name="name" required></dd>
			<dt>メールアドレス (必須)</dt>
			<dd><input type="email" name="mail" required></dd>
			<dt>お問い合わせ内容</dt>
			<dd><textarea name="message" required></textarea></dd>
		</dl>
		<div class="btnWrap">
			<button type="submit" class="button">送信する</button>
		</div>
	</form>
</section>
```

それでは良きお問い合わせライフを！

## 環境
express4.9 / io.js v2.3.3
ProductFlavor使用時のAndroidManifestのバリエーションの作り方まとめ


ProductFlavorでアプリ名や画像などリソースファイルを切り替えるようなアプリを作った際、いくつか切り替え方法があったのでまとめた。今回自分が調べただけで、大きく3種類あった。
用途に応じてそれぞれ使い分けられそうなのでまとめた。

* build.gradleのflavor定義のところに書く。
* stringsなどのリソースファイルに書く
* flavorフォルダにManifestを作って上書き

ここでいうflavorフォルダは、main/と同列に並んで作る、flavor名のついたフォルダのこと。res/とかAndroidManifest.xmlとか作れば、そのflavorを選択した時に読みに行ってくれる。

以下、それぞれ詳細。

# build.gradleに書くパターン
applicationIdやversionCodeなど、一部の要素はここで記述可能。対応してればAndroidStudioが補完してくれる。

```groovy:build.gradle
flavor_1 {
	applicationId = 'app.id.1'
	versionCode = '2'
	versionName = '1.1'
}
flavor_2 {
	applicationId = 'app.id.2'
	versionCode = '12'
	versionName = '2.3'
}
```

# strings.xmlなどのリソースファイルに書くパターン
全てのflavorで必要だが、それぞれで値が異なるような場合は、この方法を使うと良さそう。例えば外部ライブラリのアプリIDやAPI keyといったものが該当しそう。

要素の記述自体はmain/AndroidManifest.xmlにしておく

```xml:main/AndroidManifest.xml
<meta-data android:name="some_name" android:value="@string/some_value">
```

次に、{flavor}/res/にxmlファイルを作り、`@string/some_value `を定義する。

```xml
<string name="some_value">hogefuga</string>
```

# flavorフォルダに作るManifestをパターン
特定のflavorにしかない要素を作りたいときにはこの方法。

{flavor}/AndroidManifest.xmlを定義すると、ビルド時にmain/AndroidManifest.xmlとマージされたファイルができるようだ。
(/build/intermediates/manifests/full/{flavor}/{buildType}/AndroidManifest.xmlにできるので確認できる。）

例えば今回はappliction内で宣言されるmeta dataを宣言したときにはこんな感じ。

```xml:{flavor}/AndroidManifest.xml
<!-- package名は親と合わせておく -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="{main/AndroidManifext.xmlで定義したpackage}">
    <!-- 宣言したいmeta dataがapplicationタグ内のものであることを教える -->
    <!-- applicationの属性とかは指定しなくていい -->
    <application>
        <meta-data android:name="some_flavor_name" android:value="some_flavor_value"/>
    </application>
</manifest>
```

# まとめ
* 対応してれば簡単なのでbuild.graldeに書き、flavor毎に値が変わるのは{flavor}/res/に、flavorによって定義したりしなかったりするやつはマニフェストに書く。
* 試してないけど、多分build typeにも応用できる。
Objective-Cのブロックの書き方一覧

# Objective-Cのブロックの書き方整理
何回書いても忘れてしまうものの一つにObjective-Cのブロックオブジェクトがあります。何回書いても忘れ、その度に検索したり昔書いたコードを見直してたり。

そんな生活に疲れたのでまとめました。スニペットとかに登録しておくといいかもしれないですね。グダグダ書いてもしょうがないので、書き方のパターンをまとめました。


### ブロックリテラル
```objc
^( /* 引数列 */ ) { /* 本体 */ };
```

### 宣言
```objc
// 戻り値の型 (^ブロック変数名)(引数リスト)
void (^myFunction)(int);
```

### ブロックの型を定義してブロックオブジェクトに代入
```objc
// typedef 戻り値の型 (^ブロックの型名)(引数リスト)
typedef void (^MyFunction)(int);
```

### Objective-Cのメソッドの引数にブロックオブジェクトを使用
```objc
// 戻り値の型 (^)(引数リスト)ブロック名
- (void)checkWithBlock:(BOOL (^)(int i, int j))block;
```

### typedefしたものをObjective-Cのメソッドの引数にする
```objc
// 戻り値の型 (^)(引数リスト)ブロック名
typedef BOOL (^MyFunction2)(int, int);
- (void)checkWithBlock:(MyFunction2)block;
```

## ブロックの文法
上記のものをまとめました。

### リテラル

先頭に`^`(ハット)を書き、`()`で囲み、処理は`{}`に書きます。`;`を忘れずに！

```objc
^( /* 引数列 */ ) { /* 本体 */ };
```

ブロックオブジェクトはオブジェクトなので、引数として渡したり、変数に代入したり、プロパティとして保持させたりもできます。

### 宣言

`myFunction`という変数のブロックオブジェクトの宣言は以下のようになります。

```objc
// 宣言
void (^myFunction)(int);
/* 戻り値 (^変数名)(引数リスト)*/
```

で、この変数`myFunction`に対してブロックリテラルを代入するとこうです。

```objc
void (^myFunction)(int) = ^(int i){ printf("%d\n",i); };
```

このブロックを呼び出すときはこのように書きます。

```objc
myFunction(3); // 3
```

### typdef

`typdef`を使ってブロックオブジェクトの型を定義することができます。

```objc
// ブロックの型宣言
typedef void (^MyFunction)(int);
/* typedef 戻り値の型 (^ブロックの型名)(引数リスト);  */
```
戻り値なしでint型の引数を取る`myFunction`型のブロックオブジェクトの変数の定義となります。

```objc
typedef void (^MyFunction)(int);

MyFunction myFunc = ^(int i){
    NSLog(@"%d",i);
};

myFunc(5); //5が出力される
```

型として定義しておくことで再利用がしやすくなりますね。

### Objective-Cのメソッドの引数にブロックオブジェクトを渡す

```objc
// 引数にブロックオブジェクト
- (void)setBlock:(BOOL (^)(int i, int j))block;
// 戻り値の型 (^)(引数リスト)ブロック名

// hogeメソッドの戻り値として"BOOLを戻り値とするブロックオブジェクト"を返す
- (BOOL (^)(int, int)) hoge;
- // 戻り値の型 (^)(引数リスト)
```
おそらくこの書き方と前述の型宣言やブロックリテラルの書き方が異なるため混乱してしまう人が多いように感じます。ややこしいですよね。

## ブロックに関する注意事項など

以下は注意事項です。メモ書き程度なのであまりまとまっていないです。

### クロージャとして振る舞うブロックオブジェクト
ブロックオブジェクトで覚えておくべきことはコレです。

> 「ブロックリテラルは記述された位置での自動変数の値を保存している」
> 詳解 Objective-C 2.0 第3版 p345より

ブロックオブジェクトは記述が行われた時点のアクセス可能な変数を丸ごと囲んでしまう（クローズな状態にしてしまう＝クロージャ）。パッキング、キャプチャとか言います。

### キャプチャ
ただし、**キャプチャされた自動変数は書き換えができない**ので注意してください。
たとえば以下の例では、`value`変数の値を書き換えて想定した値になることを期待しますが、

```objc
typedef void (^MyFunction)(int);

int value = 1;

MyFunction myFunc = ^(int i){
    NSLog(@"%d", i*value);
};

value = 5; // "25"と出力されることを期待

myFunc(5); // value変数は1でキャプチャされているので"5"と出力される

```

`myFunc`が作られた時点で変数`i`がキャプチャされているため、想定した通りになりません。

#### 注意点
1.外部変数、static変数 → 外部から変数自体を直接参照できて書き換えも可能
2.自動変数 → ブロックリテラルが記述された時点の値が保存されていて、それを参照する。このキャプチャされた変数の書き換えはできない

**キャプチャされた自動変数は変更はできません**。実行時はconst修飾子を付けた変数と同じ扱いになります。

## まとめ
Swiftだとクロージャが簡単にかけるので、なおさらObjective-Cのブロックが分かりづらく感じてしまいますね。

Swiftに移行しているところもチラホラあると思いますが、まだまだObjective-Cのコードを見ることは多いと思います。

とはいえ書き方さえわかればかなり便利なものなので、しっかりと覚えておきたいですね。

覚えられないからまとめたんだけど。
ジェネレートしたコードを整形する

Goのコードをジェネレートするツールを作ってて、でっち上げたGoのコードを整形したい、ついでにimportも自動挿入したいみたいなケース。

## フォーマットしたい

gofmtした状態のコードを吐きたい。標準パッケージ[go/format](https://golang.org/pkg/go/format/)を使う。

<!--[src/cmd/gofmt/gofmt.go#238](https://golang.org/src/cmd/gofmt/gofmt.go#L238)と同じコードが[src/go/format/format.go#127](https://golang.org/src/go/format/format.go#L127)にも実装されている。-->

- テンプレートなどからジェネレートされたコードに無駄な空行・空白文字のあっても綺麗にフォーマットされる。

### コード

```go
package main

import (
	"fmt"
	"go/format"
)

func main() {
	code := `package foo

func Bar() {
var a int
  var b    bool
    var c        string
}`
	formatted, err := format.Source([]byte(code))
	if err != nil {
		panic(err)
	}
	fmt.Println(string(formatted))
}
```

### 結果

フォーマットされたコードが得られる。

```text
package foo

func Bar() {
	var a int
	var b bool
	var c string
}
```

## importも自動挿入したい

goimportsした状態のコードを吐きたい。[golang.org/x/tools/imports](https://godoc.org/golang.org/x/tools/imports)パッケージを使う。

- ジェネレートしたコードが条件によってパッケージが必要だったり不要だったりする場合に便利。
- ただし、実行環境に対象のパッケージが存在しなかったら解決できない。

### 準備

go get しておく。

```bash
go get "golang.org/x/tools/imports"
```

### コード

```go
package main

import (
	"fmt"

	"golang.org/x/tools/imports"
)

func main() {
	code := `package foo

func Bar() {
var a int
  var b    bool
    var c        time.Time
}`
	imported, err := imports.Process("", []byte(code), nil)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(imported))
}
```

[`imports.Process()`](https://github.com/golang/tools/blob/4f8578d2c095328e9192e9d0b0ea335c6ea3e9a5/imports/imports.go#L38)の第三引数には整形の為のオプション[`&imports.Options{}`](https://github.com/golang/tools/blob/4f8578d2c095328e9192e9d0b0ea335c6ea3e9a5/imports/imports.go#L26-L34)を渡すことができる。

### 結果

import自動挿入とフォーマットされたコードが得られる。

```text
package foo

import "time"

func Bar() {
	var a int
	var b bool
	var c time.Time
}
```
printf debugしてドツボにはまった話


標準出力に値を出しながらデバッグをする、いわゆるprintf debugしてた時の話です。
こんなソースが有りました。

```cpp
void move(){
	std::cout << player.move() << std::endl;
}
```

move()はプレイヤの座標を移動させる関数です。
普段は0を返しますが、壁にあたったりしてmove()が失敗すると1を返すわけです。
で、壁にあたってないのに1を返したり、移動してないのに0を返したりと
move()の動作がどうもおかしいので、返り値を表示するようにしています。
また、移動後の座標も一緒に表示するようにしました。

```cpp
void move(){
	std::cout << player.move() << "(" << player.getx() << "," player.gety() << ")" << std::endl;
}
```

予想通り座標もおかしい。
で、調べていましたが、何故か違和感が…。

先ほどのコードはmove()を実行した後の座標がほしいわけなのですが、
何故かmove()を実行する前の座標が表示されているようです。

気がついた人はいると思いますが、この書き方は未定義動作を含みます。
具体的には、move(),getx(),gety()はどの順序で呼び出されるかわかりません。
言語仕様としては、実装依存、ということですね。

副作用のある関数(内部状態を変更する関数)は単独で使うようにしましょう。
よって、こういう風に書き換えると想定通りに動きました。

```cpp
void move(){
	auto moveresult = player.move();
	std::cout << moveresult << "(" << player.getx() << "," player.gety() << ")" << std::endl;
}
```

move()のバグはまだとれてません。
Sassの基礎


[Rails勉強会](http://qiita.com/CyberMergina/items/068a8fde170f1c0daf0d)で作成したscssファイルをサンプルとします。

```scss

$incontent-width: 80%;

@mixin flexRowBox {
    display: inline-flex;
    flex-direction: row;
}

#taskIndexArea {
    width: $incontent-width;
    margin: 0 auto;

    #taskAddArea {
        display: flex;

        #taskInputArea {
            @include flexRowBox;

            width: 90%;

            input {
                width: 100%;
            }
        }

        #taskAddBtnArea {
            @include flexRowBox;

            width: 10%;
        }
    }

    #taskListArea {
        ul {
            padding: 0;
        }

        li {
            word-break: break-word;
            list-style: none;
        }
    }
}

```

# Sassの変数 ($incontent-width: 80%)
定義するときは「$変数名: 値」となります。
変数名には半角英数字と「-」「_」が使用できます。
先頭に半角数字がくるのはNGです。

# ネスト
Sassの特徴としてネストが良く挙げられ(てる気がし)ます。

```scss:xxx.scss
div {
  border: solid 1px #34F4AB
  &#hoge {
    text-decoration: none;
  }
  .target {
    color: red;
  }
}
```

これが変換されると・・・

```css:xxx.css
div {
  border: solid 1px #34F4AB
}
div#hoge {
  border: solid 1px #34F4AB
}
div .target{
    text-decoration: none;
}
```

といった形になります。
**&**が付くと、上階層とのアンド条件になります。

# ミックスイン(@mixin flexRowBox )
デザイン定義をまとめたものです。

```scss:
@mixin flexRowBox {
    display: inline-flex;
    flex-direction: row;
}

#taskAddArea {
    display: flex;

    #taskInputArea {
         @include flexRowBox;
         width: 90%;
    }

    #taskAddBtnArea {
         @include flexRowBox;
         width: 10%;
    }
}

```

これが変換されると・・・

```css
#taskAddArea {
    display: flex;
}
#taskAddArea #taskInputArea {
    display: inline-flex;
    flex-direction: row;
     width: 90%;
}

#taskAddArea #taskAddBtnArea {
    display: inline-flex;
    flex-direction: row;
     width: 10%;
}
```

他は随時更新します～
キーイベントを発行する話


いろいろやっていると、ハードキーを使わずに
任意のタイミングでキーイベントを発行したくなることがあると思います。

手段はいくつかありますが、状況によって可否が変わります。
セキュリティ的な観点も含めて、
できること、できないことをメモしていこうと思います。

##目次

>1.adbコマンドから発行する
1-1.inputコマンド
1-2.sendeventコマンド
2.プログラムコードから発行する
2-1.大前提（セキュリティ的な話）
2-2.dispatchKeyEvent
2-3.inputコマンドを使って発生させる
3.おわりに

##参考
キーコード：[ソース（KeyEvent.java）](http://tools.oesf.biz/android-5.1.1_r1.0/xref/frameworks/base/core/java/android/view/KeyEvent.java)・[AndroidDeveloper](http://developer.android.com/intl/ja/reference/android/view/KeyEvent.html)
スキャンコード：[ソース（input.h）](http://tools.oesf.biz/android-5.1.1_r1.0/xref/bionic/libc/kernel/uapi/linux/input.h)

##1.adbコマンドから発行する
USB経由でイベントを発生させる場合がこれにあたります。
ある程度スクリプトを組めば、放置テストする際に便利ですね。

###1-1.inputコマンド
> $ adb shell input keyevent [key code]

キーコードは10進数でもいいですし、KEYCODE_VOLUME_UPなどの定数名でもOKです。
定義名やキーコードは参考からどうぞ。

なお、蛇足ですがinputコマンドはタッチイベントやマウスなど、
様々なイベントを発生させることが可能です。

###1-2.sendeventコマンド

これはデバイスに入力される情報を擬似的に発生させるので、ちょっと面倒です。
まず、実際にデバイスに入力されるイベントを見てみましょう。

> $ adb shell getevent
add device 1: /dev/input/event5
  name:     "msm8974-taiko-mtp-snd-card Headset Jack"
add device 2: /dev/input/event4
  name:     "msm8974-taiko-mtp-snd-card Button Jack"
add device 3: /dev/input/event3
  name:     "hs_detect"
add device 4: /dev/input/event1
  name:     "touch_dev"
add device 5: /dev/input/event0
  name:     "qpnp_pon"
add device 6: /dev/input/event2
  name:     "gpio-keys"
/dev/input/event2: 0001 0073 00000001
/dev/input/event2: 0000 0000 00000000
/dev/input/event2: 0001 0073 00000000
/dev/input/event2: 0000 0000 00000000

これはgetevent後に音量下キーを押して離したときのログです。
/dev/input/event2 というデバイス（gpio-keys）に対して、
音量下キーを押した、離した、というイベントが送られているログです。

>音量下が「押された」
/dev/input/event2: 0001 0073 00000001
/dev/input/event2: 0000 0000 00000000
>音量下が「離された」
/dev/input/event2: 0001 0073 00000000
/dev/input/event2: 0000 0000 00000000

詳しくは、ここでは解説しません。

この「押された」「離された」のイベントを偽装するのがsendeventになります。
> $ adb shell sendevent [device] [cmd] [scancode] [value]

[device] : ここでいうと /dev/input/event2 になります
[cmd]、[scancode]、[value]はログに表示されている３つの数字を **16進数** にしたものです。
キーコードは10進数でもいいですし、KEYCODE_VOLUME_UPなどの定数名でもOKです。

scancodeはキーコードとはまた違ったもので、
参考のスキャンコードを参照して何を入れればよいか選んでください。

あとはログにあるように、４回sendeventを実行すればOKです。
inputコマンドで十分ですね。w

##2.プログラムコードから発行する
これはアプリ側からキーコードを発行する場合がこれにあたります。
###2-1.大前提（セキュリティ的な話）
私はこれでやろうとしたことを諦めたのですが…
**基本的に、自分のアプリが全面に出てる場合しか使えません。**

例えば、サービス上で使ってみたり、
ステータスバーを下に引っ張った状態だったり、
パネルセーブした状態だと利用できません。

おそらく、勝手にバックグラウンドで動かれると
セキュリティ的に問題があるからでしょう。（そりゃそうだ）

###2-2.dispatchKeyEvent
例えば、音量下イベントを発生させる場合はこうなります。
>dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_VOLUME_UP));
dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_VOLUME_UP));

###2-3.コマンドを発行して発生させる
例えば、inputコマンドを発行する場合はこうなります。
>Runtime.getRuntime().exec("input keyevent " + keyCode);



##3.おわりに
イヤホンジャックを挿したら音楽が再生される。。。
ようなアプリを作ろうと思って調べていたんですが、
セキュリティ的な話でダメでした。

rootをとってinjectKeyEventなどを使えば使えるのかもしれませんが、
市場への公開を目標にする人にとっては意味がありません。
self(式)


selfはもう少しやろう＾＾

self(式)は呼び出される場所によって意味が変わります。
class定義の直下で使用 = そのクラス名を指し示します
そのため「self.クラスメソッド」のようにクラスメソッドを定義します。

つまりクラスメソッドは2通りの定義が出来ます
・クラス名.クラスメソッド
・self.クラスメソッド

 ```
    class Car
      attr_accessor :name, :color
      def initialize(name, color)
        @name = name
        @color = color
      end
      
      def self.date
        puts "nameとcolorを設定できます"
      end
    end      

  ```
link_toやrenderを含むActiveDecoratorを使ったメソッドのRSpecの書き方


はじめに
---

ActiveDecoratorとは、Railsアプリ上で「View上に書かれているロジックを無くしたり、Viewでしか使わないロジックによるModelの肥大化を防ぐことができる」gemです。


[参考 ActiveDecoratorでビューからロジックを切り離せ(要約版) - Qiita](http://qiita.com/kon_yu/items/7b7354b85efa95bad7c7)

本エントリーではActiveDecoratorで生やしたメソッドをテストする記述方法の一例を書きます。


RSpecでActionView::HelpersのメソッドがNoMethodErrorになる
---

``` app/decorators/user_decorator.rb
module UserDecorator
  def link_to_qiita_profile
    link_to "qiita_profile","http://qiita.com/#{qiita_id}"
  end
end
```

作成したDecoratorのメソッドをRSpecでテストすると、link_to, renderなどのActionView::Helpersメソッドがundefiend methodと怒られます。

``` spec/decorators/user_decorator.rb
require "rails_helper"

describe UserDecorator do
  context "extend UserDecorator" do
    let!(:user) { User.create(name: "hiromitsu ito", qiita_id: "umeyuki@github").extend(UserDecorator)}
    subject {  user.extend(UserDecorator).link_to_qiita_profile }
    it { is_expected.to eq "http://qiita.com/umeyuki@github" }
  end
end

```


``` rspec
 $ rspec spec/decorators/user_decorator.rb
F.

Failures:

  1) UserDecorator extend UserDecorator
     Failure/Error: subject {  user.extend(UserDecorator).link_to_qiita_profile }
     NoMethodError:
       undefined method `link_to' for #<User:0x007ff0cc1de380>
     # ./app/decorators/user_decorator.rb:3:in `link_to_qiita_profile'
```



active_decorator-rspecを使う
---

[mizoR/active_decorator-rspec](https://github.com/mizoR/active_decorator-rspec)

active_decorator-rspecを使えば、この問題を解決することができます

``` Gemfile
group :test do
  gem 'rspec'
  gem 'rspec-rails'
  gem 'active_decorator-rspec'
end

```


サンプル
---



``` spec/decorators/user_decorator.rb
require "rails_helper"

describe UserDecorator do

  context "extend UserDecorator" do
    let!(:user) { User.create(name: "hiromitsu ito", qiita_id: "umeyuki@github").extend(UserDecorator)}
    skip "ActionView::Helpersのメソッドが使えないため失敗する" do
      subject {  user.extend(UserDecorator).link_to_qiita_profile }
      it { is_expected.to eq "http://qiita.com/umeyuki@github" }
    end
  end

  # 成功
  context "active_decorator-rspec" do
    let!(:user) { User.create(name: "hiromitsu ito", qiita_id: "umeyuki@github")}
    subject { decorate( user ).link_to_qiita_profile }
    it { is_expected.to eq "http://qiita.com/umeyuki@github" }
  end
end

```

デモのrailsアプリは以下です。

[umeyuki/demo-active_decorator-rspec](https://github.com/umeyuki/demo-active_decorator-rspec)
KotlinでAndroid Test Case書くときのテンプレート

ただのメモ。

テンプレートの記述方法とかは [KotlinでFragment書くときのテンプレート](http://qiita.com/mattak@github/items/0979b87f33e8a158a1a7) を参照

![android_test_case.png](https://qiita-image-store.s3.amazonaws.com/0/15000/8ce93552-0efc-9e8c-4ac0-88e210be626a.png)

下記を File and Code Templates にコピペする。

```kotlin:AndroidTestCase.kt
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME}

import android.content.Context
import android.support.test.InstrumentationRegistry
import android.support.test.runner.AndroidJUnit4
import android.test.AndroidTestCase
import org.junit
import org.junit.runner.RunWith
import kotlin.test.*

#end
#parse("File Header.java")
RunWith(AndroidJUnit4::class)
public class ${NAME} {
    junit.Before
    fun setup() {}
    
    junit.After
    fun teardown() {}
    
    junit.Test
    fun example() {
        assertEquals("TODO: write test", "")
    }
    
    fun getContext() : Context {
        return InstrumentationRegistry.getTargetContext()
    }
}
```
AutoScalingで落ちないWEBサイト構成を試してみる


## 前提
サーバの稼働に関して、そんなにシビアでは無いが知らない間にサーバが落ちていたりしない、ある程度自動で稼働する状態に回復する。小規模な構成なのでサーバは基本は出来るだけ一台で稼働している。

そんなゆるふわなサイトで最低限の運用を手間なしで実現するためELBとAutoScalingを使った構成です。
ちなみにテレビ紹介などの急激なトラフィック増に対しても事前にAutoScalingの設定を変え、ELBの申請をしておけば大丈夫とおもいます。

## ELB、AutoScalingを使った構成への移行する

### 0.スタート時の構成 Route53、EC2一台、RDS一台
### 1.ELBをRoute53とEC2の間にはさむ
* ロードバランサを作成する
* セキュリティグループを作成する。IN HTTP OUT ALL
* ヘルスチェックを追加。今回はHTTPにて_common_img/logo.pngとしました。
* インスタンスを追加。これはあとで入れ替えますが一応。
* 他はデフォルトでとりあえず作成

### 2.ELB作成後の設定項目
* 作成されたELBを選択後、説明
* アクセスログを有効にしS3にアクセスログを残すようにします。バケットを作っていない場合はロケーションを作成にチェック。
* 説明>ポート構成>維持設定の編集をクリック。「ロードバランサーによって生成された Cookie による維持を有効化」を選択し保存する。これは複数インスタンスが立ち上がった時のセッションをインスタンスに固定するための設定です。

### 3.Route53の設定
* 現在AレコードにてEC2に紐づけられているものを、Aレコードのエイリアスレコードを利用してELBのDNSに変更します。これでsugoroku.osakaがELBにつばがるようになります。
* またEC2のセキュリティグループをIN HTTPは今ALLになっているので、ELB限定に変更します。

### 4.AutoScalingを作成
* 現在稼働しているEC2のイメージを作成する
* AutoScaling起動設定を作成
* ここの設定で先ほどのAMIを指定する
* セキュリティグループは既存のEC2のSGを利用
* AutoScalingグループを設定
* VPCとSubnetは現在のEC2と同じになる用に注意
* 高度な詳細でELBからのトラフィックを受け取るにチェック
* ヘルスチェックのタイプをELBに変更
* 通知を設定する（トピックを作っていない場合作成する必要があります）
* タグの設定は任意でOK、ひとまず完了

### 5.AutoScalingの詳細設定をおこないます。
* まずAutoScalingグループの詳細>編集ボタンからインスタンス数の設定を「希望」1「最小」1「最大」2に設定
* スケーリングポリシーを追加します。今回はインスタンスのCPUUtilizationのしきい値を70％を超えた場合インスタンスを1台追加する設定にしています。

__補足__
>これにより基本的にはEC2は一台で稼働するように調整され、CPUの使用率が70％を超えた場合追加でもう一台インスタンスがELB配下に追加されます。CPUが70％を下回るとまた一台に戻るようAutoScalingが働きます。
またELBのヘルスチェックが失敗した場合も新しいインスタンスが立ち上げられ、ヘルスチェックに失敗したインスタンスはターミネートされます。インスタンスはターミネートされますがEBSは残っているのでデータの同期、ログの検証などはこのEBSを利用して可能です。
また各タイミングで設定したトピックによりメールアドレスへ通知メールが送信されます。

__注意点__
>AutoScalingで作成されるインスタンスは最初のグループ作成時に指定したマシンイメージから作成されるため、ストレージ内のデータの同期、更新に対する処理が必要です。基本的には別途S3などに保管されているデータから取得する等をEC2の起動設定に入れておく必要があります。

### 6.EC2インスタンスの設定
* ここまででAutoScalingグループ内のインスタンスがELB配下に追加される形になっていると思うので、以前のインスタンスを削除します。
* あたらしく作成されたインスタンスはEIPが設定されていないので、設定します。AutoScalingで変動があった場合はまた設定しないといけませんが仕方ありません。
 
## 最後に
EC2インスタンス単体でもデフォルトで備えられているステータスチェックに関して、アラートが発生した場合に自動でインスタンスの復元を行う設定が出来るようになりました。
設定の方法はマネジメントコンソールのモニタリングからCloudWatchアラーム「アラームの作成」で設定が出来ます。

あくまでステータスチェックのみですが基本的にインスタンスには設定しておいたほうが安心です。
<mt:EntryBody>で<mt:EntryExcerpt>のように○文字より多くなったら、末尾に「…」をつける

# 本文の文字数をカウントして比較

```lang:MTML
<$mt:EntryBody count_characters="1" setVar="cntWord"$>

<p><$mt:EntryBody words="150" convert_breaks="0" remove_html="1"$><mt:If name="cntWord" gt="150">…</mt:If></p>
```

本文の文字数をcntWordに格納。
本文出力の末尾にmt:ifをつかって、cntWordの文字数を比較。
gtモディファイアは「～より大きい場合」となります。


# 本文以外は「words」が使えなかったので「trim_to」で代用

```lang:MTML
<mt:If tag="EntryTitle">
<$mt:EntryTitle count_characters="1" setVar="cntWord"$>
<$mt:EntryTitle escape="html" trim_to="85"$><mt:If name="cntWord" gt="85">…</mt:If>
</mt:If>
```
Day06


（三方库 sqlite3） sqlite 语法见 Sqlite.rtf  
 (导入libsqlite3.bylib )    

 //找到应用程序的沙箱目录
 
    NSString * path = NSHomeDirectory();
    //指定沙箱下数据库文件的路径
    path = [path stringByAppendingPathComponent:@"Documents/hello.db"];
    // 创建数据库对象
    self.db = [FMDatabase databaseWithPath:path];
    if ([self.db open]) {
        [self createTable];
    }else{
        NSLog(@"创建或打开数据库失败");
    }

// 创建二维表

-(void) createTable{
    //如果表存在就什么都不做 （if not exists）
    
    NSString * sql = @"create table if not exists tb_student(stuid integer primary key,stuname varchar(20) not null,stubirth date,stuaddress varchar(50));";
    if ([self.db executeUpdate:sql]) {
        //  [self insertData];
    }else{
        NSLog(@"创建表失败");
    }
}


/**插入数据*/  （对方法的注释  是有方法时会有提示）
-(void) insertData{

    static NSArray * lastNames = nil;
    static NSArray * firstNames = nil;
    static NSArray * address = nil;
    
    lastNames = @[@"趙",@"钱",@"孙",@"李",@"上官",@"东方"];
    firstNames = @[@"莫愁",@"飘雪",@"霸",@"千锋",@"浩南",@"大神",@"苟且"];
    address = @[@"四川成都",@"北京海淀",@"重庆渝北",@"上海浦东"];
    
    NSString * sql = @"insert into tb_student (stuname,stuaddress,stubirth) values (?,?,'1990-1-1')";
    int lIndex = arc4random() % lastNames.count;
    int fIndex = arc4random() % firstNames.count;
    int aIndex = arc4random() % address.count;
    
    NSString * fullName = [NSString stringWithFormat:@"%@%@",lastNames[lIndex],firstNames[fIndex]];
    
    if ([self.db executeUpdate:sql,fullName,address[aIndex]]) {
    //    [self showData:self.db];
    }else{
        NSLog(@"插入失败");
    }
}

/**查询数据*/
-(void) showData{

    NSString * sql = @"select * from tb_student;";
    //结果集  游标
    FMResultSet * rs = [self.db executeQuery:sql];
    //[rs next]  取到一行 就返回
    while ([rs next]) {
        printf("学号:%d  ",[rs intForColumn:@"stuid"]);
        printf("姓名:%s  ",[[rs stringForColumn:@"stuname"] cStringUsingEncoding:NSUTF8StringEncoding]);
        printf("生日:%s  ",[[rs stringForColumn:@"stubirth"] cStringUsingEncoding:NSUTF8StringEncoding]);
        printf("家庭住址:%s\n",[[rs stringForColumn:@"stuaddress"] cStringUsingEncoding:NSUTF8StringEncoding]);
    }
}
Day07  (网络第05天)

==============================
注意 ：  (hrApp工程中)

     FMResultSet * rs = [self.db executeQuery:sql,dept.no];//注意要传对象

        
//用NsNumber  null 值会自动转成0

    dept.total = [NSNumber numberWithInt:[rs intForColumn:@"total"]];


coreDataApp
===================

    注意：勾选use core data
    在下面创建模型直接生成

    系统的   (CoreDataApp工程中)

    三方库  MagicalRecord-master  和 ObjectiveRecord-master（更简单）
RDSのバックアップ取得中に操作しても安全か

お世話になります。
[AWSキッチン](http://aws.lepra.jp/)のシェフです。

定期的にとるようにしている方が多いのではないかとは思うのですが、
バックアップ取得中に操作しても安全か気になったことはないでしょうか？

サポートの方に確認したところ、RDSのバックアップは瞬間的に I/O を停止し、整合性のあるスナップショットを取得したのち、I/O を再開し、その後当該スナップショットは自動でS3 へ保存される動作のようです。

I/O が停止されている最中に操作をされていも、その操作はロストするわけではなく再開後に適切に処理されますので、表面上は遅延として実行されるそうです。

AWSのサービスはよく考えられていると感心してしまいますね。
みようみまねでARアプリをつくってみる※unityで


#【ARとは】
拡張現実（かくちょうげんじつ、英: Augmented Reality、AR）とは、人が知覚する現実環境をコンピュータにより拡張する技術、およびコンピュータにより拡張された現実環境そのものを指す言葉。
#【今回の目標】
* 下記の画像をかざすと3DキャラクタがAR上に表示するアプリを作成する
（ほぼ参考サイトのぱくりです

![Light_Silhouette.png](https://qiita-image-store.s3.amazonaws.com/0/87607/8e6b727e-84c9-e8bc-f2fb-2fc68d28e50f.png)


#【実際に作ってみる】
##Vuforia（ビューフォリア）の導入
* [Download Unity Extension をダウンロードします※要会員登録（無料）](https://developer.vuforia.com/downloads/sdk)
![スクリーンショット 2015-07-29 午後4.28.20.png](https://qiita-image-store.s3.amazonaws.com/0/87607/261b3915-695e-76b0-aaee-8c5cfeff31fb.png)

####ここでやること
* ライセンスキーの取得
* 画像認識する画像の設定からassetのダウンロード
![スクリーンショット 2015-07-30 午後4.04.11.png](https://qiita-image-store.s3.amazonaws.com/0/87607/8d8aadd2-bbf1-44a9-6596-06401e42a624.png)

#####
※詳細については下記サイトなどを参考にしてください
* 参考URL (http://taka-say.hateblo.jp/entry/2014/05/21/194605)

##unity側でやること
1、 新規シーンの作成
2、 パッケージを3つインポート
 ・ vuforia-unity-mobile-android-ios-4-2-3.unitypackage
　　　↑ビューフォリアでゲット
 ・ datasetのunitypackage、※下記からダウンロードできる
![スクリーンショット 2015-07-30 午後4.41.57.png](https://qiita-image-store.s3.amazonaws.com/0/87607/8addeb45-abbb-1a2c-20bc-3be805de6a1a.png)
 ・3Dモデルのインポート今回はunitychanなので、[unitychanのofficalサイトからダウンロード](http://unity-chan.com/)
![スクリーンショット 2015-07-30 午後4.49.30.png](https://qiita-image-store.s3.amazonaws.com/0/87607/ed2232e8-d66e-d9a3-47bb-a02ac20c0d6d.png)
UnityChan_1_2.unitypackage
↑表示する3Dモデル、unitychanサイトでゲット

３、ヒエラルキーに４つ配置する
　・Qualcomm Augmented Reality/Prefabs/ARCamera
　・Qualcomm Augmented Reality/Prefabs/ImageTarget
　・UnityChan/Prefabs/unitychan ←これは「ImageTarget」の配下に置く
　・UnityChan/Prefabs/Directional light for UnityChan
こんな感じ
![スクリーンショット 2015-07-30 午後5.06.54.png](https://qiita-image-store.s3.amazonaws.com/0/87607/666d27f1-1c6d-2d6d-de20-bec2fe289e5b.png)

４、ライセンスの設定とデータロード設定
ライセンスとロードデータを設定する
![スクリーンショット 2015-07-30 午後5.11.00.png](https://qiita-image-store.s3.amazonaws.com/0/87607/ca1a1d6a-0e6a-af92-bced-643c455b10f0.png)

##完成、動かしてみる
<iframe width="420" height="315" src="https://www.youtube.com/embed/CSVSBCKxlO0" frameborder="0" allowfullscreen></iframe>
[![ビデオが開けなかった場合に表示されるテキスト](http://img.youtube.com/vi/CSVSBCKxlO0/0.jpg)](https://www.youtube.com/embed/CSVSBCKxlO0)
クラスメソッド


クラス名.クラスメソッドのように定義します。

```
   class Car
   
     def Car.name
       puts "nameとcolorを設定できます"
     end  
   end 

```

クラス変数
クラスから作成された全てのインスタンスで共有したい変数に用います。

```
  class Car
  
    @@count = 0
    
    def initialize(name, color)
      @name = name 
      @color = color
      @@count += 1 # Car.newする度に@@countを1増やす
    end
    
    def Car.count
      @@count
    end  
    
    def Car.puts_count
      puts"#{@@count}台生産されました"
    end    
  end  
  
  car1 = Car.new("プリウス", "白")
  Car.puts_count
  
  puts "合計#{Car.count}台の車が生成されました"
```
Google App Engine LauncherでNameError: name 'execfile' is not definedが表示される

Google App Engine(GAE)をアップデートすると設定がクリアされ、Runができなくなる場合があります。GAE Launcherを使用し、うまくいかない場合はまずLogを見るようにします。Logはメニュー[Control] > [Log Console]で見ることができます。

NameError: name 'execfile' is not defined

今回Log画面にはこのように表示され、Runができませんでした。どうやらPythonの実行ファイルが見つからないためのエラーのようです。実行ファイルの設定はメニューの[Edit] > [Preferences]を選択します。

![gae.jpg](https://qiita-image-store.s3.amazonaws.com/0/70925/70315d56-b63a-7955-fb76-dba64cf33867.jpeg)

Python Pathの欄にPythonの実行ファイルのパスを入力し、[OK]を押すと無事Runができるようになりました。
【メモ】modelからURLのパスを取得したい。【Rails tips】


#概要

RailsのモデルでURLを取得したい。だからrequestオブジェクトを使いたい。
でも、既に実装したメソッドの拡張で、使用範囲も広い。ので引数を与えるのは良くない。

#解決

そんな時に出会った記事がこちら。

[railsでrequest変数をmodelで使う方法](http://rails.clickyourstyle.com/articles/29)



```applicationController
before_filter :set_request_filter

  def set_request_filter
     Thread.current[:request] = request
  end  
```

```model
request = Thread.current[:request]
```

アプリケーションコントローラーのbeforefillterで毎回変数に入れてあげることで
modelで受け取ることが出来るという感じです！


...でもコレだと使わない部分でもいちいち変数入れちゃうような動作になるなぁ。

もっときれいなやり方ないかな。

募集中です＞＜
Railsのsession_storeをredis_storeにする場合の設定メモ


```
  config.session_store :redis_store, servers: { host: "localhost",
                                                port: 6379,
                                                db: 0,
                                                namespace: "sessions"
                                              },
                                              expires_in: 1.hours

```

expires_inはserversのハッシュの後に書くこと。cache_storeの書き方とは違うので注意。
WordPressのアドレス(ドメイン)が変わった時の対応関連情報

1が1番良さそう

1.さくらのレンタルサーバで簡単にwordpressを独自ドメイン直下にインストールする方法
http://webconsulting1.com/archives/585

2.[WordPress]サイトアドレス(URL)を変更する方法！ | tomaty blog
http://tomaty.jp/blog/archives/4520

3.さくらサーバーで独自ドメインにwordpressをインストールする方法(クイックインストール) | 【P】パンクローのWEB備忘録
http://www.pankuro-affiliate.com/not-forget/server-domain/sakura-wordpress/
Concrete5 での画像の取得方法

ファイルマネージャーで管理している画像をHTMLから取得する場合のURLの指定方法についてです。
大した内容ではありませんが、備忘録も兼ねて。

## 前提
concrete 5.7.3.1

## 取得方法
/index.php/download_file/view_inline/[対象のファイルID]
またはプリティーURLを使用している場合は
/download_file/view_inline/[対象のファイルID]
としてしてあげると取得できます。

```
例）ファイルID：100の画像をimgタグで指定する場合

<img src="/index.php/download_file/view_inline/100" alt="ほげほげ">

```

ファイルIDはファイルマネージャーから対象の画像をクリックし設定を選択すると見ることができます。
Cocos2d-x 3.7 で Sceneをnewしたときの挙動が怪しい場合

# 発生時の環境
OS X 10.10.3
Xcode 6.4
iOS SDK 8.4
iOSシミュレータ iPhone6 8.4, iPhone6 8.2
cocos2d-x 3.7

# 現象

_Scene_の_new_辺りを契機にして、不特定多数の箇所でSIGABRTなどでクラッシュする。

毎回発生するわけではなく頻度はまちまち、一番面倒くさいパターン。

# 再現方法

下記のように書くと再現できる。

_CREATE_FUNC_及び_createScene_と同じことを外でやってるだけ。

特にXcodeのブレイクポイントを使ってると起こりやすい。

```AppDelegate.cpp
bool AppDelegate::applicationDidFinishLaunching()
{
    ...
    
    Scene* scene = new Scene();
    scene->init();
    scene->autorelease();
    
    HelloWorld* layer = new HelloWorld();
    layer->init();
    layer->autorelease();
    
    scene->addChild(layer);
    
    director->runWithScene(scene);
    
    return true;
}
```

なお、頻度は低いがnew Scene()のみでも発生する。

```AppDelegate.cpp
bool AppDelegate::applicationDidFinishLaunching()
{
    ...
    
    Scene* scene = new Scene();
    director->runWithScene(scene);
    
    return true;
}

```

# 解消方法(暫定)

1. _ccConfig.h_で定義されている_CC_ENABLE_BULLET_INTEGRATION_フラグを切る
2. もしくはアプリ側のBuild Settings のPreprocessor Macros で_CC_ENABLE_BULLET_INTEGRATION=1_にする。

[本家githubでissue](https://github.com/cocos2d/cocos2d-x/issues/12906)が上がってました。

3.7はしょうがないけど、3.7.1か3.8あたりで本修正入るのを待ちましょう。

# 原因

[本家githubのissueのPR](https://github.com/cocos2d/cocos2d-x/pull/12949)に詳細が書いてありました。

> The reason is when compile CCScene.cpp, the CC_ENABLE_BULLIET_INTERATION=1 effect the CCScene.h, but when compile the custom scene derived from scene in new game project, the CC_ENABLE_BULLIET_INTERATION not defined. This cause the Scene class layout in cocos2dlib and in derived class is different.
内部通信でのSSHのチューニング


# 内部の大量のサーバにforとかansibleとかでsshしまくる時のチューニング

## 環境
* CentOS6
* OpenSSH 6.6

|オプション||
|---|---|
|-c arcfour256|ファイル転送などで倍くらい早くなる|
|ControlMaster=auto  <br> ControlPersist=24h <br> ControlPath ~/.ssh/mux-%r@%h:%p|コネクション使いまわす？<br>2回め以降は10倍以上早くなる|
|UserKnownHostsFile=/dev/null<br>StrictHostKeyChecking=no|内部通信なのでフィッシングとかには合わないので無効|
|LogLevel=ERROR|好みに合わせて|

```bash:bashrc
alias ssh='ssh -c arcfour256 -o ControlMaster=auto -o ControlPersist=24h -o "ControlPath ~/.ssh/mux-%r@%h:%p" -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o LogLevel=ERROR -o ForwardAgent=yes'
```
MKMapView

##创建地图

```导入头文件
#import <MapKit/MapKit.h>
```
1.创建地图对象，设为属性，方便使用

`@property (nonatomic,strong) MKMapView *mapView;
`

```
	self.mapView =[[MKMapViewalloc]
	initWithFrame:self.view.bounds];
    self.mapView.delegate = self;
    [self.view addSubview:self.mapView];
```
2.设置经纬度坐标，地图区域

```
	//设置经纬度坐标
	CLLocationCoordinate2D coordinate2D = CLLocationCoordinate2DMake(30.662221, 104.041367);
	//设置地图范围
    MKCoordinateSpan span = MKCoordinateSpanMake(0.01, 0.01);
    //设置整个显示的区域
    MKCoordinateRegion region = MKCoordinateRegionMake(coordinate2D, span);
    [self.mapView setRegion:region];
```
做完以上操作便能出现地图了。

##实时的更新地图

1.创建位置管理器，设为属性
`@property (nonatomic,strong) CLLocationManager *manager;
`

```
  self.manager = [[CLLocationManager alloc] init];
    //设置代理
    self.manager.delegate = self;
    //更新事件的最小距离
    self.manager.distanceFilter = 10.0;
    //在plist文件中添加一个价值对NSLocationAlwaysUsageDescription : YES
    //授权
    [self.manager requestAlwaysAuthorization];
    [self.manager startUpdatingLocation];
```
```实现协议方法
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
    //获取更新后的位置信息
    CLLocation *loc = [locations firstObject];
    
    [UIView animateWithDuration:1.0 animations:^{
        //重新设置地图区域
        [self.mapView setRegion:MKCoordinateRegionMake(loc.coordinate, MKCoordinateSpanMake(0.01, 0.01))];
    }];
}

```
python環境構築

## 必要パッケージ取得
```yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel git```

## pyenvを入れる
### Linux
```
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
```

### Mac
```
brew install pyenv
```

## Anacondaを入れる
```
pyenv install -l | grep ana #表示後，最新版を入れる
pyenv install anaconda2-2.5.0
pyenv global anaconda2-2.5.0 #anacondaをpythonに設定
pyenv local * #カレントディレクトリでのみ
```
## 入ってないパッケージ
```
conda install ipyparallel #ipcluster使用
pip install vispy #OpenGLによる，GPUを使った高速動的ビジュアライズ
pip install mpld3 #matplotlibを自動で対話的ビジュアライズ．中では，データをjsonにして，javascriptを呼ぶ．
conda install statsmodels
conda install 
```

## PyCUDA
https://pypi.python.org/pypi/pycudaで最新版を確認．
wget *
./configure --cuda-root=/usr/local/cuda/**version**/cuda
make -j 4
python setup.py install
KVM→Docker移行時のメモ

# KVM→Docker移行

## 今回やったイメージ

* qemu-kvmのrawのイメージファイルをDockerに移行までのメモ（NWは気にしない）
* LVMで /（LogVol00） と /var（LogVol02） を切っているイメージ
* OSはCentOS6.2で昔作ったいろいろインストールしてあるやつ（KVMで現役）
* 余計なものもついてくるが気にしない（動けばいい）

## memo

```bash
$ qemu-img info node.img 
image: node.img
file format: raw
virtual size: 20G (21474836480 bytes)
disk size: 20G 
```

* イメージをマウント（適当なツールでもいい）

```bash
$ losetup /dev/loop0 node.img
$ kpartx -a /dev/loop0
$ vgchange -ay
$ lvscan
Active 'hogehoge'
$ mkdir -p LogVol00 LogVol02
$ mount /dev/VolGroup00/LogVol00 LogVol00
$ mount /dev/VolGroup00/LogVol02 LogVol02
```

* マウントしたファイルを全コピ

```bash
$ mkdir images
$ rsync -a LogVol00/* images/
$ rsync -a LogVol02/* images/var/
$ cd images/dev
$ mknod -m 666 null c 1 3
$ mknod -m 666 zero c 1 5
$ mknod -m 666 random c 1 8
$ mknod -m 666 urandom c 1 9
$ mkdir -m 755 pts
$ mkdir -m 1777 shm
$ mknod -m 666 tty c 5 0
$ mknod -m 666 tty0 c 4 0
$ mknod -m 666 tty1 c 4 1
$ mknod -m 666 tty2 c 4 2
$ mknod -m 666 tty3 c 4 3
$ mknod -m 666 tty4 c 4 4
$ mknod -m 600 console c 5 1
$ mknod -m 666 full c 1 7
$ mknod -m 600 initctl p
$ mknod -m 666 ptmx c 5 2
```

* tar に固める

```bash
$ tar --numeric-owner -Jcpf centos_base.tar.xz -C images .
```

* Dokcer Import

```bash
$ cat centos_base.tar.xz | docker import - mycentos:1
```

* 確認
 
```bash
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
mycentos            1                   47bd9b4521ba        About a minute ago   788.2 MB
$ docker run -it mycentos:1 /bin/bash 
```
CentOSでJAVAのバージョン切り替え

忘備録

現在のJDKの確認
"# alternatives --config java"
<pre>
2 プログラムがあり 'java' を提供します。

  選択       コマンド
-----------------------------------------------
*+ 1           /usr/java/jdk1.8.0_45/jre/bin/java
   2           /usr/java/jdk1.6.0_45/jre/bin/java

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:
</pre>


JDKを登録
"#alternatives --install /usr/bin/java java /usr/java/default/bin/java 16024"
各パラメータの概要は下記になります。

第1パラメータ	「/usr/bin/java」	実行するリンクを指定します。
第2パラメータ	「java」	登録対象のグループを指定します。
第3パラメータ	「/usr/java/default/bin/java」	実際に実行するコマンドのパスを指定します。
第4パラメータ	「16021」	優先度を指定します。

Javaのバージョンの確認
"#java -version"
Rails4 + Vagrantでファイルを更新後、ブラウザをリロードしても変更が反映されない

# 原因

原因はVagrantで起動しているサーバのシステム時刻がずれていることでした。

* [Rails3で、developmentモードなのにファイルを更新してブラウザリロードしても反映されなかった](http://eienshinjin.hatenablog.com/entry/2014/05/13/110606)

> Railsがファイル更新を確認するのは、ファイルの更新日時が
初回の読み込み時より新しいときのみ。

# 対処法

chef-zeroでサーバにntpをインストールして、自動的に時刻合わせをさせるようにしたら解決しました。
chef-zeroでのntpの導入方法は以下を参考にしてください。

* [chef-zero + knife-zero + vagrantで開発環境と本番環境を構築](http://qiita.com/k-yamada@github/items/d5add5cf86062e5cba19)
* [Chefでopscode-cookbooksのntpレシピを使う](http://qiita.com/tt_yamaguchi/items/37d58922e6356061df6c)
jQueryによるDOMのサイズ取得と計算


jQueryのDOMのサイズ取得は横と高さとで4種類ずつ用意されている。
考えるの面倒なときの覚え書き。

- width() / height()
- innerWidth() / innerHeight()
- outerWidth() / outerHeight()
- outerWidth(true) outerHeight(true)

# width() / height()

コンテンツサイズを取得する。
つまり、padding, border, margin全部無視！

# innerWidth() / innerHeight()

コンテンツサイズとpaddingを合わせた値

# outerWidth() / outerHeight()

コンテンツサイズとpaddingとborderを合わせた値

# outerWidth(true) / outerHeight(true)

コンテンツサイズとpaddingとborderとmarginを合わせた値。
つまり、全部載せ。

# 応用編？

注意事項として、左右、上下、それぞれの合算値しか取得できない。
同じ値なら半分にするだけだが、違う値の場合にそれぞれの値を取得するのは無理。

## marginサイズ

```
var marginWidth = $dom.outerWidth(true) - $dom.outerWidth();
var marginHeight = $dom.outerHeight(true) - $dom.outerHeight();
```

## paddingサイズ

```
var paddingWidth = $dom.innerWidth() - $dom.width();
var paddingHeight = $dom.innerHeight() - $dom.height();
```

## borderサイズ

```
var borderWidth = $dom.outerWidth() - $dom.innerWidth();
var borderHeight = $dom.outerHeight() - $dom.innerHeight();
```

## otherサイズ(margin + padding + border)

```
var otherWidth = $dom.outerWidth(true) - $dom.width();
var otherHeight = $dom.outerHeight(true) - $dom.height();
```

# 用途(何に使ったか)
基本的にjQueryでゴリゴリDOM操作をするときに使います。

material design ligntとjQuery UIを入れた時に、material design ligntのlayoutを利用しているとjQuery UIのWidgetがabsoluteなのにfixedの様な動きになる。

原因はWidgetのappend先がdefaultでbodyであることと、material design ligntでスクロールしているのはmainタグで、bodyのスクロールがoffになっているから。

jQuery UIのWidgetの追加先をappendToオプションでmain以下にして、Widgetのpositionをrelativeにすることで、コンテンツのスクロールに連動して動く様になる。

その代わりとして、jQuery UIが計算して配置しているサイズ等がずれるので、表示のタイミングで再計算させるとかってやりました。
usermodでグループを追加するのは危険

## usermodでグループを追加するのは危険
Ubuntuを立ち上げて、ユーザーにグループを追加しようと
```usermod -G group user```
と実行したところ、sudoが効かなくなりました。

## 原因
```usermod -G```
は既存のグループを上書きするので、このコマンドでグループを追加する場合は既に追加してあるグループも全て指定しないといけません。(面倒だし危険！)

## 解決方法
``` gpasswd -a user group```
これで思い通りになりました！

##追記
コメントいただきました。
-aオプションを付与すると、usermodコマンドでも同様の事ができる様です。  
gpasswdだと引数の取り方が逆になるのでこちらの方が賢明かもしれません。
```usermod -aG group user```
MapのkeySetを回していたら、entrySetの方が適切かを考えてみよう

実に恥ずかしいお話です・・・
つぎのようなコードを書いていたらfindbugsから指摘を受けました。

```
Map<String,String> map = ....;
for(String key: map.keySet()) {
    String value = map.get(key);
    Hoge hoge = new Hoge(key, value);  
　　hoge.save();　  
}


```

findbugs曰く、

```
WMI_WRONG_MAP_ITERATOR

このメソッドは、keySet イテレータから取り出されたキーを使用して、マップエントリの値にアクセスしています。 Map の entrySet イテレータを使用した方が Map.get(key) ルックアップを回避するのでより効率的です。

```

つまり、「keyとvalueの両方使うのなら、entrySetでfor文を回しなさい」ということ...

```
Map<String,String> map = ....;
for(Entry<String,String> entry: map.entrySet()) {
    Hoge hoge = new Hoge(entry.getKey(), entry.getValue())
    hoge.save()
}
```

上のようにしたら怒られなくなりましたw 
（この場合、Hogeのコンストラクタの引数をEntry<String,String>にする方がよいでしょうけど）

## まとめ

MapのkeySetを回して処理しているときに、map#getでvalueを取得しているなら、entrySetを回した方が効率も良いし、読みやすい、ということでした。なんかいけてないと思っていったのがようやく解消できました。。。
translate3dでtransitionさせるとAndroidの標準ブラウザでアニメーション前の要素が残る



表題のとおりAndorid4.4の標準ブラウザにて起こった現象です。
ハンバーガーメニューでのアニメーションなのですが、以下のようにtranslate3dを使うと、

```
.humbarger {
  background-color: $white;
  &.humbarger__1 {
    transform: rotate(-45deg) translate3d(-7px, 6px, 0);
  }
  &.humbarger__2 {
    opacity: 0;
    transform: translate3d(20px, 0, 0);
  }
  &.humbarger__3 {
     transform: rotate(45deg) translate3d(-8px, -7px, 0);
  }
}
```

このように、closeに変形するが、変形前の３本線も残る。。
<img src="http://gyazo.com/d02c47a9c4a8c333c3e0ebf8c6db06b9.png">


以下のようにtranslateだとアニメーションしました

```
.humbarger {
  background-color: $white;
  &.humbarger__1 {
    transform: rotate(-45deg) translate(-7px, 6px);
  }
  &.humbarger__2 {
    opacity: 0;
    transform: translate(20px, 0);
  }
  &.humbarger__3 {
     transform: rotate(45deg) translate(-8px, -7px);
  }
}
```
【メモ】Unix関連私的によく使うコマンドまとめ

#完全に自分用のメモです
完全に自分用のメモです！！！！！

#tmux

##ウィンドウとペインについて
ウィンドウを分割したものがペイン。

##ウィンドウ操作

###裏に隠れたウィンドウへの移動

前の画面へ：C-b p
次の画面へ：C-b n

(補足)
ペイン分割解除すると裏に隠れるので、その隠れたペインへ移動する際のコマンド。
裏に隠れたというよりtmuxでいうウィンドウとはスマホのタブや最小化と最大化しか存在しないWindowsの
ウィンドウみたいなもので裏に隠れるという表現はおかしいんだけど慣れないのでこの表現で記載しておく。

###ウィンドウ一覧表示
C-b w

###ウィンドウを閉じる
exit

###ウィンドウをペインとして分割表示させる
多分無理。諦めてペインとして再度開きなおすしかない。

##ペイン操作

###ペイン分割
縦方向：C-b %
横方向：C-b "

###分割されたペインへの移動
C-b o

###ペイン分割解除
C-b !

(補足)
解除すると裏に隠れる、裏に隠れたペインを表示する場合上記「裏に隠れたペインへの移動」を利用する。

###ペインを閉じる
exit

(補足)
ウィンドウを閉じるコマンドと同じ

##便利系

###スクロール
C-b [

(補足)
スクロールモードで上下スクロールできる。
マウスホイールでもスクロールできるが画面分割している場合はこの方法でしかスクロールできない。
Gollum で commit せずにファイルの内容を直接表示する


内部ドキュメント管理に Gollum を使用していると、編集については clone したリポジトリを Atom で Markdown Preview を使いながら行うのが便利ですが、実際に local の gollum でプレビューしたいことがあります。

> mathjax を有効にしていたり、mermaid 等を追加で組み込んでいたり等

gollum は基本的に commit しないとページが反映されないため、add -> amend を繰り返すことになります。
これはあまりにも面倒なので、なんとか working directory の内容を直接表示できないかとあれこれ試行錯誤したところ、比較的簡単なコードの overwrite で対応できました。

gollum の本来の目的から外れていますが、あくまで local での暫定確認用ということで。

## config.ru へのコード追加

rackup 用の設定ファイル config.ru に、以下の module を追加します。

> config.ru の設定方法は、[Gollum via Rack](https://github.com/gollum/gollum/wiki/Gollum-via-Rack) を参照ください。

```config.ru
module Gollum
  class DirectPage < Gollum::Page
    include Pagination

    def find(name, version, dir = nil, exact = false)
      unless exact
        arr = ::Dir.glob("#{@wiki.path}/**/#{name}.md")
        raise Gollum::Git::NoSuchShaFound if arr.size == 0
        file = arr.first
        dir = ::File.dirname(arr.first).split(@wiki.path)[1]
      else
        file = "#{@wiki.path}/#{dir}/#{name}.md"
        raise Gollum::Git::NoSuchShaFound unless ::File.exist?(file)
      end

      blob = ::OpenStruct.new
      blob.data = ::File.readlines(file).join()
      blob.name = "#{name}.md"
      page = DirectPage.new(@wiki).populate(blob, dir)
      page.version = @wiki.commit_for(version)
      page.historical = true
      page
    rescue Gollum::Git::NoSuchShaFound
    end
  end
end
```

あとは、`:wiki_options` に `:page_class` を追加します。

> ドキュメントには記載がありませんが、コードを読むと、ページ生成時に用いるクラスを option で変更できるようになっていることがわかります。
カスタマイズしたクラスを指定することで、git repo から取得せずに working directory からファイルを読み込むように挙動を変更しています。

```config.ru
...
Precious::App.set(:wiki_options, {
...
  :page_class => Gollum::DirectPage,
...
})
run Precious::App
```

書き換えが完了したら、rackup して確認してみましょう。

```commandline
% bundle exec rackup
```

直接ファイルを書き換えた後、ブラウザをリロードしてページが反映されていれば成功です。

これでローカル環境でのドキュメント記述がより一層はかどります。

## 注意

無理やり page_class を差し替えて対応しているので、当然 gollum 上での編集や rename 等は想定していませんし、どんな挙動をするかも未確認です。

これをやる場合は、基本的に編集作業はテキストエディタで行い git を使う前提ですので、想定外の事故を防ぐためにも、config.ru の `:wiki_options` に `:allow_editing => false` をつけておくほうがいいかもしれません。

----
2017-01-04: gollum-lib 4.2.2 に対応。
今すぐWindows 10の最新版を使う方法

2018年4月30日よりWindows 10 April 2018 Updateがリリースされ、旧Windowsユーザーは無償でアップグレードできるようになりました。しかし、アップグレードは順番に行われることになっており、すぐに最新版が使えるようになるわけではありません。

しかし、Microsoftが配布しているディスクイメージを使用すると、即座に最新版のWindows 10にアップグレードすることができます。Window 10がなかなかアップデートしない場合もこの手法が利用可能です。

[Windows 10 ISO](http://www.microsoft.com/ja-jp/software-download/windows10ISO)

筆者の環境もすぐにWindow10にアップグレードできました。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/1a63ef00-c8ea-6e8f-86c5-d1235e538631.jpeg)
macでscheme(racket)コンパイル環境を構築する


「 **計算機プログラムの構造と解釈 第二版** 」(通称 SICP)を読むにあたって、schemeの実行環境を準備する必要があったので、macのvimでプログラムが実行できるまでの手順を残します

有名なので本自体の説明は省きますが、SICP自体は以下の通りオンラインでも公開されています. -> [非公式PDF版SICPの全訳を公開しました](http://d.hatena.ne.jp/minghai/20140402/p1)


SICPはLISPの方言であるschemeを使った本ですが、macでは[racket](http://racket-lang.org)を使った方が楽そうだったのでそちらでsetupをします(scheme互換なのでSICPをやる上では問題無し)

## 前提

以下がインストールされており利用できる前提です.

* homebrew : racketインストールに利用
* vim + NeoBundle : vimでracketのソースを弄るのに利用

## racketインストール

macではracketは既にbrew caskに入ってるのでコマンド一発

```bash
$ brew cask install racket
==> Downloading http://mirror.racket-lang.org/installers/6.2/racket-6.2-x86_64-macosx.dmg
######################################################################## 100.0%
==> Symlinking App Suite 'Racket v6.2' to '/Applications/Racket v6.2'
==> Symlinking Binary 'drracket' to '/usr/local/bin/drracket'
==> Symlinking Binary 'gracket' to '/usr/local/bin/gracket'
==> Symlinking Binary 'gracket-text' to '/usr/local/bin/gracket-text'
==> Symlinking Binary 'mred' to '/usr/local/bin/mred'
==> Symlinking Binary 'mred-text' to '/usr/local/bin/mred-text'
==> Symlinking Binary 'mzc' to '/usr/local/bin/mzc'
==> Symlinking Binary 'mzpp' to '/usr/local/bin/mzpp'
==> Symlinking Binary 'mzscheme' to '/usr/local/bin/mzscheme'
==> Symlinking Binary 'mztext' to '/usr/local/bin/mztext'
==> Symlinking Binary 'pdf-slatex' to '/usr/local/bin/pdf-slatex'
==> Symlinking Binary 'plt-games' to '/usr/local/bin/plt-games'
==> Symlinking Binary 'plt-help' to '/usr/local/bin/plt-help'
==> Symlinking Binary 'plt-r5rs' to '/usr/local/bin/plt-r5rs'
==> Symlinking Binary 'plt-r6rs' to '/usr/local/bin/plt-r6rs'
==> Symlinking Binary 'plt-web-server' to '/usr/local/bin/plt-web-server'
==> Symlinking Binary 'racket' to '/usr/local/bin/racket'
==> Symlinking Binary 'raco' to '/usr/local/bin/raco'
==> Symlinking Binary 'scribble' to '/usr/local/bin/scribble'
==> Symlinking Binary 'setup-plt' to '/usr/local/bin/setup-plt'
==> Symlinking Binary 'slatex' to '/usr/local/bin/slatex'
==> Symlinking Binary 'slideshow' to '/usr/local/bin/slideshow'
==> Symlinking Binary 'swindle' to '/usr/local/bin/swindle'
🍺 racket staged at '/opt/homebrew-cask/Caskroom/racket/6.2' (22396 files, 477M)
```

* macOS BigSurの場合

```bash
brew install --cask racket
```

各種racketのコマンド類は上記の通り`/usr/local/bin`にsymlinkが張られるので、PATHを通してあげれば後は通常通り使える.

## 動作確認

```bash
$ racket -v
Welcome to Racket v6.2.
```

## 実行

**アプリケーション** -> **Racket v6.2** -> **DrRacket.app** で起動

![スクリーンショット 2015-07-30 15.33.48.png](https://qiita-image-store.s3.amazonaws.com/0/31824/064c46f4-07c6-30fd-2e07-3059bbc569d1.png "スクリーンショット 2015-07-30 15.33.48.png")

コード部分に以下のコマンド貼り付けて、下のプロンプトにメッセージが表示されればOK.

```Lisp
#lang racket
;; Print the Greek alphabet
(for ([i (in-range 26)])
  (display
   (integer->char
    (+ i (char->integer #\a)))))
```

## vim

GUIだと面倒なので、いつも使ってるvimでracketのシンタックスハイライト等されるように、NeoBundleでvimrcに以下を追加する.

```.vimrc
NeoBundle 'wlangstroth/vim-racket'
```

後はvim上で`NeoBundleInstall`してinstallして終了.

```bash
$ vim test.rkt
(vimで上記ソースを追加)
$ racket test.rkt
abcdefghijklmnopqrstuvwxyz
ActiveRecord :: Pending Migratioin Error直し方

![Screen Shot 2015-07-30 at 9.53.14 AM.png](https://qiita-image-store.s3.amazonaws.com/0/76304/a3d44782-645e-60ed-6622-a496a16f360a.png)
症状：ドットインストールRuby on Rails入門編で、
Migrations are pending. To resolve this issue, run: bin/rake db:migrate RAILS_ENV=development ＞＞とあったので、実行したところ、
Daisukes-MacBook-Air:~ daisukeishii$ bin/rake db:migrate RAILS_ENV=development
-bash: bin/rake: No such file or directory
そんなファイルはないと言われてしまいました。
rake db:migrate RAILS_ENV=development を試したのですが状況改善せず、
師匠に言われてdbフォルダ配下のdevelopment.sqlite3みたいなファイルを削除、それから再度rake db:migrate、直りました！
![Screen Shot 2015-07-30 at 1.12.42 PM.png](https://qiita-image-store.s3.amazonaws.com/0/76304/7d6d2293-ac56-0e70-49c1-8e9ff006f018.png)
疑問；言われた通りにやったので、なぜバグが発生していたのか、なぜバグが直ったのかはわかっておりません。