OmniAICreator/Qiita-1.07M huggingface dataset:
[Ruby] Hashの同じキーの値を足し合わせる

`Hash#merge` を使うと、すっきりかける！素晴らしい！

```ruby
a = {"2015/11"=>10, "2015/12"=>20, "2016/01"=>30}
b = {"2015/11"=>1, "2015/12"=>2, "2016/01"=>3}

a.merge(b){|k, v1, v2| v1 + v2}
=> {"2015/11"=>11, "2015/12"=>22, "2016/01"=>33}
```

今回は足しあわせたかったけど、別の用途でもいいですね。

ちなみにブロックを記述しないとmerge引数のHashで上書きマージされます。

```
a.merge(b)
=> {"2015/11"=>1, "2015/12"=>2, "2016/01"=>3}
```

もっとかっこよくかけるぜ！ってのお待ちしています！
Androidで使える日付処理系のライブラリーを試してみた


## TL;DR
- java.util.Dateとjava.util.Calendarは死んだ
- 今から日付処理が必要なアプリを作るなら[JakeWharton/ThreeTenABP](https://github.com/JakeWharton/ThreeTenABP)
- Joda-Timeとdate4jの違い[Date4j- 日付を扱う最小限のライブラリ -InfoQ](http://www.infoq.com/jp/news/2011/12/date4j-vs-joda-time)


## はじめに
現状Androidで使える`java.util.Date`と`java.util.Calendar`を使った日付処理は色々つらいので、ライブラリを使うことになると思います。いざ導入しようと思ったら色々あたので、簡単に試してみました。


## 各ライブラリ導入方法とか
### [joda-time-android](https://github.com/dlew/joda-time-android)
JavaではデファクトスタンダードとなっているJoda-TimeをAndroidに最適化したライブラリ

1.build.gradleのdependenciesに下記を追加

```java:build.gradle
dependencies {
    compile 'net.danlew:android.joda:2.9.2'
}
```

2.Applicationクラスをextendsして初期化を追加

```java:MyApp.java
public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        JodaTimeAndroid.init(this);
    }
}
```

２つの日付の間が何日間か求める

```java:
DateTime from = new DateTime("2012-04-18T20:00:00");
DateTime to = new DateTime("2014-5-18T10:00:00");
Duration duration = new Duration(from, to);
duration.getStandardDays()
System.out.println(duration.getStandardDays() + "日");
```

### [date4j](http://www.date4j.net/)
Joda-Timeはtoo fatなので必要な部分だけ残したライブラリ（Androidに最適化されているわけではない）

1.build.gradleのdependenciesに下記を追加（Applicationクラスでの初期化はいらない

```java:build.gradle
dependencies {
    compile 'net.danlew:android.joda:2.9.2'
}
```

２つの日付の間が何日間か求める

```java:
DateTime from = new DateTime(2012, 4, 18, 20, 0, 0, null);
DateTime to = new DateTime(2014, 5, 18, 10, 0, 0, null);
System.out.println(from.numDaysFrom(to) + "日");
```

### [ThreeTenABP](https://github.com/JakeWharton/ThreeTenABP)
まだAndroidではサポートされてないJavaの日付処理APIをバックポートしたThreeTenBPをAndroid向けに最適化したライブラリ

1.build.gradleのdependenciesに下記を追加

```java:build.gradle
dependencies {
    compile 'com.jakewharton.threetenabp:threetenabp:1.0.3'
}
```

2.Applicationクラスをextendsして初期化を追加

```java:MyApp.java
public class MyApp extends Application {

   @Override
   public void onCreate() {
       super.onCreate();
       AndroidThreeTen.init(this);
   }
}
```

２つの日付の間が何日間か求める

```java:
ZonedDateTime from = ZonedDateTime.parse("2012-04-18T20:00:00+09:00[Asia/Tokyo]");
ZonedDateTime to = ZonedDateTime.parse("2014-05-18T10:00:00+09:00[Asia/Tokyo]");
System.out.println(Duration.between(from, to).toDays() + "日");

```

## おわりに
どれも導入は簡単だし、クラスやメソッドもだいぶ直感的でした。
しかしこれから使うのだとすればThreeTenABPになるだろうなと思います。
今後AndroidがJava8をサポートした場合に改めて使い方を学ぶ必要がなさそうですし。
Protocol Extension で ViewController のインスタンス化を簡単にする

[This Week in Swift](https://swiftnews.curated.co/) で紹介されていた `NibLoadableView` と `ReusableView` が便利です。

> iOS Cell Registration & Reusing with Swift Protocol Extensions and Generics
> https://gist.github.com/gonzalezreal/92507b53d2b1e267d49a

この protocol を使うと `nibName` や `reuseIdentifier` をハードコーディングせずに済みます:

```
    @IBOutlet weak var collectionView: UICollectionView! {
        didSet {
        //..
        collectionView.registerNib(
            UINib(nibName: MyCell.nibName, bundle: nil),
            forCellWithReuseIdentifier: MyCell.reuseIdentifier )
        }
    }
```

`NibLoadableView` にインパイアされて ViewController をインスタンス化するのに使う`StoryboardInstantiatableViewController` を作ってみました。

# 使いかた

Storyboard からインスタンスをつくる ViewController を StoryboardInstantiatableViewController のプロトコルに適合させるだけです:

```
extension SignupViewController: StoryboardInstantiatableViewController {}

```

ViewController のインスタンス化はこんな感じです: 

```
        let viewController = UIStoryboard(name: SignupViewController.defaultStoryboardName, bundle: nil)
            .instantiateViewControllerWithIdentifier(SignupViewController.defaultStoryboardIdentifier)
        presentViewController(viewController, animated: true, completion: nil)
```

# ソースコード

```
//StoryboardInstantiatableViewController.swift

import UIKit

public protocol StoryboardInstantiatableViewController: class {
    static var defaultStoryboardName: String { get }
    static var defaultStoryboardIdentifier: String { get }

}

public extension StoryboardInstantiatableViewController where Self: UIViewController {
    static var defaultStoryboardName: String {
        return NSStringFromClass(self).componentsSeparatedByString(".").last!
            .componentsSeparatedByString("ViewController").first!
    }
    static var defaultStoryboardIdentifier: String {
        return NSStringFromClass(self).componentsSeparatedByString(".").last!
    }
}
```
【AWS】Auto Scaling スケジュール登録


#### はじめに
AWSでEC2を利用する際、ほとんどの場合Auto Scaling を利用してスケールアウト・インを行い、無駄なコストを抑えつつ可用性を担保させるかと思います。
自分も例に漏れずAuto Scaling を利用しているのですが、最初の方はどういった内容でScaling Policy を作成すればいいかわからなかったので、これまでのアクセス数の推移から、一旦スケジューリングによってScalingさせることにしました。
~~Auto Scaling のスケジュールはコンソール画面からは変更ができず、CLIやAPIからしか変更できません。~~[^1]
メモ程度ですが、CLIからスケジュールを登録・更新する方法を記載します。

#### 前提
* `PutScheduledUpdateGroupAction`の権限をユーザが保持していること。
* Auto Scaling Group が既に作成されていること。
* 今回は以下のようにinstance数を増減させる想定とします。  
2:00～6:30　⇒　2つ  
6:30～17:30　⇒　4つ  
17:30～2:00　⇒　6つ  

#### 変更手順
* 深夜2時にinstance数を2つに設定  
```aws autoscaling put-scheduled-update-group-action --auto-scaling-group-name [対象のオートスケーリンググループ名] --scheduled-action-name [任意のアクション名] --recurrence "0 17 * * *" --min-size 2 --max-size 6 --desired-capacity 2
```  
スケジュール登録するときに注意することは時刻がUTCであるということです。

* 6時30分頃にinstance数を4つに増加  
```aws autoscaling put-scheduled-update-group-action --auto-scaling-group-name [対象のオートスケーリンググループ名] --scheduled-action-name [任意のアクション名] --recurrence "15 21 * * *" --min-size 4 --max-size 6 --desired-capacity 4
```  
ここで6時15分(JST)にして設定しているのはinstanceの起動には時間を要するため、6時30分に4つinstanceが欲しい場合は、それより10分～15分程度前にinstance起動を開始させる必要があるためです。

* 17時30分頃にinstance数を6つに設定  
```aws autoscaling put-scheduled-update-group-action --auto-scaling-group-name [対象のオートスケーリンググループ名] --scheduled-action-name [任意のアクション名] --recurrence "15 8 * * *" --min-size 6 --max-size 6 --desired-capacity 6
```  
ここで17時15分(JST)にして設定しているのは先ほどと同じ理由です。

* 設定の確認  
最後にちゃんと設定されているか確認します。  
```aws autoscaling describe-scheduled-actions --auto-scaling-group-name [対象のオートスケーリンググループ名]
```

スケジュールの更新も同じ`aws autoscaling put-scheduled-update-group-action`コマンドで行います。

以上

[^1]: 数日前にコンソールから登録・更新が可能となりました。[【新機能】スケジュールベースのAuto ScalingをAWS Management Consoleから操作できるようになりました](http://dev.classmethod.jp/cloud/aws/schedule-based-autoscaling-from-amc/)
Mysql 5.7 note ＼(^o^)／


# validate-password = off

https://github.com/rails/rails/issues/21107

To avoid strict passwd policy, we can select `validate-password = off` @ my.cnf.
But we must start mysqld (or initdb) via `No validate-pass.. = on` at first time.

My Proc

1) Start mysqld normaly. ___DO NOT___ edit my.cnf!
2) Find root@localhost password at `mysqld.log or messages` 

 ```
 2016-01-31T07:13:42.126160Z 1 [Note] A temporary password is generated for  root@localhost: UT,=Xs7l,%Cl
 ```
3) Edit my.conf  add `validate-password = off`
4) Reboot mysqld
5) Login root via step 2. password.


# No secure-install already secure !

```sql:
mysql> select user,host from mysql.user;
+-----------+-----------+
| user      | host      |
+-----------+-----------+
| mysql.sys | localhost |
| root      | localhost |
+-----------+-----------+
2 rows in set (0.00 sec)
```
And root password expired.

# Trap default values..
Ref http://www.slideshare.net/yoku0825/mysql-57-51945745

## default_password_lifetime = 0
Changed(fixed) 5.7.11, default = 0

## log_timestamps = SYSTEM
Reccomend! That is nonsense. In spite of `messages` written by JST, `mysqld.log`  written by UTC.

## Delete `log_warnings`
```:my.cnf
# DO NOT set log_warnings !!
log_error_verbosity = 3
```

## internal_tmp_disk_storage_engine = MYISAM
Default INNODB. Why temoprary table via InnoDB ???


## binlog_format = MIXED
`STATEMENT` is out of date.
DUBに自作パッケージを登録する

まずはDUBにユーザ情報を登録しましょう。 http://code.dlang.org/ で 左上のほうにある register から登録することができます。

自作Packageの登録は My Packages 内の Register New Package から行うことができます。

登録するパッケージは Github Project か BitBucket Project のからレポジトリを指定する形になります。

このときパッケージ名としてASCII範囲外の文字を使っていると、 `Packages may only contain ASCII letters and numbers..` と表示され、パッケージの登録ができません、現状登録できるパッケージ名に制限があることに注意してください。

また、登録できるパッケージは最低一つはタグを設定しなければならないことにも注意してください。

実際に登録してみたパッケージがこちらになります。

http://code.dlang.org/packages/syscall-d

Descriptionなどは勝手に dub.json から持ってきてくれているみたいです。便利ですね！
UIStackViewを使ってみました

#はじめに
iOS9から追加されたUIStackViewをStoryboard上で触ってみました。

#環境
Xcode7以降
iOS9以降（残念ながらiOS7とか8とかでは使えません(T^T)）

#UIStackViewって何ができるのさ
縦（もしくは横）に等間隔にコンポーネントを配置できます!!
AndroidのLinearLayoutに近いものですね（多分、、）


UIStackViewにaddした子viewたちをグループ化するので、
AutoLayoutでハマったから制約を全部消してやり直そうなんてこと
が解消できるのではないでしょうか

え？制約全部消してやり直すなんて経験私だけ(-ω-;)？笑
まあ、何はともあれUIStackView使ってみましょう。

#縦に並べてみる
1.Storyboard上でボタンを3つ縦に並べます
（ざっくりと縦に並んでいればokです）
<img width="788" alt="2016-01-31 14.20.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/04986e37-683f-a1fc-a850-be3382c73504.png">
各ボタンに制約は指定しません。

2.UIStackViewの子viewにするボタンたちを選択して、AutoLayoutのツールバー1番左のStackViewを押します
<img width="112" alt="2016-01-31 13.50.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/6da405ff-7dab-e756-dfc6-c3bd443b9ad0.png">

すると、
<img width="748" alt="2016-01-31 14.20.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/84ab6885-6ca1-2fb7-ad1d-476da4d57d4e.png">
指定した各ボタンの親viewにStackViewができてボタンが縦に並びます。

3.StackViewに制約を設定する
今回はとりあえずStackViewを中央に設定します。
<img width="1065" alt="2016-01-31 14.44.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/4723392c-6575-b7d3-d8f0-628bdf07a018.png">
はい。こんな感じ。
<img width="623" alt="2016-01-31 14.47.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/8812b460-36a2-c4ae-2aa6-59a2720383a5.png">
ボタンを3つ縦に並べることができました。

#間隔を設定する
StackViewでまとまったけれども、間隔がないじゃないか!!
ということで続いてスペースを設定しましょう。
StackViewを選択すると、その設定をする項目が表示されます。
<img width="1079" alt="2016-01-31 14.52.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/5e2dddfe-8555-03eb-0778-d49d54727d6d.png">

今回は間隔を設定するのでSpacingの数値を変更します。
Spacingの初期値は0なので間隔がありません。
<img width="545" alt="2016-01-31 14.59.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/3c3cc63f-b72d-7449-af78-a66f902d4d7e.png">

Spacingの値を10にしてみると、
<img width="451" alt="2016-01-31 15.30.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/72eae520-c48d-7fec-c1b5-24b081a0dd65.png">
子view間にスペースができます(^o^)/

部分的に間隔を変えたいなーという時は、
StackViewの中にStackViewを入れればできることにはできますが
<img width="359" alt="2016-01-31 15.17.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/946ecaeb-4ad6-3b07-da0d-7b56a63ea20c.png">

あまり美しくないような。。
（こうしたら良いという方法があればご教授ください。）

#横に並べてみる
これまで縦に並べていましたが、横に並べる場合も同様です。
違う部分は一番はじめに横に並べるというところのみです。
（こちらも、ざっくりと横に並んでいればokです）
<img width="753" alt="2016-01-31 15.35.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/aa69f49d-3824-1d3b-1f7b-0dac732bb6e0.png">
縦に並べる場合と同様にUIStackViewの子viewにするコンポーネントを選択してAutoLayoutのツールバー1番左のStackViewを押すと、
<img width="585" alt="2016-01-31 15.43.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/e05749e3-adc5-f368-cc2d-5273e9e154be.png">
StackViewができて横に並びます。
StackViewに制約や間隔を設定する部分は縦に並べた場合と変わりません。

AutoLayoutが縦に並べるか横に並べるか判断してくれるようですね。

#最後に
今回は、Storyboard上でUIStackViewを作ってSpacingの設定をしてみました。
まだ触れていない設定に関しても、今後使用してまとめたいと思います。

ご意見ございましたら、コメントを宜しくお願いいたします。
AssetBundleのラベルをスクリプトから設定する

Unity5から導入されたAssetBundleのラベル、便利ですよね。
でも、AssetBundleが増えてくると手動で設定するのも億劫になってきて、ラベルを自動設定したくなってくると思います。

以下のコードで設定することが出来ますので、保存されているファイルパスをそのままラベルに設定する、というようなことも可能です。
（Unity5.2.2で動作確認済み）

```
AssetImporter.GetAtPath(filePath).assetBundleName = label;
```

改行も認識されてしまうので、事前に改行コードは除去するようにしておきましょう。
AnimatorControllerをスクリプトから編集するアレコレ

以下のコードは `using UnityEditor.Animations` していることを前提としています。また、Unity5.2.2で動作を確認しています。


# AnimationControllerを開く

エディタの場合、AssetDatabaseを使って .controller ファイルを読み込み、AnimatorController にキャストします。
ランタイムの時は Resources.Load などの各種ロード手段で代替して下さい。

```
RuntimeAnimatorController asset = AssetDatabase.LoadAssetAtPath<RuntimeAnimatorController>(path);
AnimatorController controller = asset as AnimatorController;
```

# レイヤーを取得する

controller.layers.Length でレイヤー総数を、controller.layers の配列からレイヤーを取得出来ます。

```
for (int i=0; i<controller.layers.Length; ++i) {
	AnimatorControllerLayer	layer = controller.layers[i];
	// レイヤーに対して処理する
}
```

# ステートを取得する

レイヤーから AnimatorStateMachine を取得し、stateMachine.states でステートの一覧を取得出来ます。

```
AnimatorStateMachine stateMachine = layer.stateMachine;
foreach (var state in stateMachine.states) {
	AnimatorState animState = state.state;
	Debug.Log("ステート名＝" + animState.name);
	// ステートに対して処理する
}
```

# アニメーションクリップの参照

ステートのアニメーションクリップを参照出来ます。
別途読み込んだクリップをセットすることも可能です。

```
AnimationClip animationClip = AssetDatabase.LoadAssetAtPath<AnimationClip>(clipPath);
animState.motion = animationClip;
```

# 変更を保存する

metaファイルを書き換えずに上書き保存したいところですが、AnimatorControllerは構造が複雑なため、なかなかうまく行きません。最終的には以下の方法でうまく行くようになりました。

```
EditorApplication.SaveAssets();		// 変更を保存する
FileUtil.ReplaceFile(srcControllerPath, dstControllerPath);	// コントローラを上書きする
AssetDatabase.Refresh();		// 変更を反映する
```

ただし、Unity5.1以前ではこの方法は使えないようです。
Swiftはじめたい...その１３ Extension


# その１２でクラスを試したので今回は拡張をやってみます。

+ Objective-Cでいうところのカテゴリかな？
+ 既存のというか基本的なクラスでも拡張できるのっていいですよね？

## Extension

+ 一番基本的な整数を拡張してみます。こういうのJavaにはできましたっけ？

```swift:Extension
extension Int {
    func toWaon()->String {
        var ret = "";

        if self < 0 {
            return "赤字"
        }
        
        switch self  {
        case 0:
            ret = "なし"
        case 1:
            ret = "ひとつ"
        case 2:
            ret = "ふたつ"
        case 3:
            ret = "みっつ"
        default:
            ret = "たくさん"
        }

        return ret
    }
}

print(0.toWaon())
print(1.toWaon())
print(2.toWaon())
print(3.toWaon())
print(4.toWaon())
print(100.toWaon())
```

```shell:結果
なし
ひとつ
ふたつ
みっつ
たくさん
たくさん
```

+ 素敵です！

## あれ？
+ -1.toWaon()を試そうとしたらエラーになっちゃいました。

```shell:エラーになりました。
Playground execution failed: /var/folders/~/playground61.swift:27:7: error: ambiguous reference to member '-'
print(-1.toWaon())
      ^
Swift.-:2:20: note: found this candidate
prefix public func -(x: Float) -> Float
                   ^
Swift.-:2:20: note: found this candidate
prefix public func -(x: Double) -> Double
                   ^
Swift.-:2:20: note: found this candidate
prefix public func -(x: Float80) -> Float80
                   ^
Swift.-:1:20: note: found this candidate
prefix public func -<T : SignedNumberType>(x: T) -> T
                   ^
Swift.SignedNumberType:12:24: note: found this candidate
    prefix public func -(x: Self) -> Self

```

+ -1がIntと思われてないみたい。

```swift:これならうまくいきます。
print((-1).toWaon())
```

+ ちゃんと```赤字```ってでました。

## まとめ

+ プリミティブな型すら拡張できるのは素晴らしいですが、ちょっと危ないかもしれませんね。
+ 今回は基本的な使い方を試しただけですが他と組わせることでいろいろできそうです。

# 今日はここまで

+ 次こそはプロトコルとかstructあたりを試します。
【Mac】Homebrewが突然動かなくなったとき一度アンインストールを試してみよう

ある日、Homebrewが動かなくなってしまいました。
そのとき、どのように対処したか記載します。

(1)brewコマンドを打ったら以下の様なエラーが出た
```
$brew
/usr/local/bin/brew: /usr/local/Library/brew.rb: /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby: bad interpreter: No such file or directory
/usr/local/bin/brew: line 21: /usr/local/Library/brew.rb: Undefined error: 0
```

updateも使えなくなっている。
よって、アンインストールしてから再インストールを試してみる

(2)アンインストールする

```
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
```  

(3)再インストール
```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

(4)動作確認
```
$ brew -v
Homebrew 0.9.5 (git revision a8aa; last commit 2016-01-30)
```

以上です。
Windows2016TP4のIISでPowerShellをCGIとして動かす。

# Windows2016TP4でCGI

Windows環境で手頃なシステムを作るための試行錯誤をメモ。

|ソフト等|バージョン|備考|
|:------|:--------|:---|
|Windows Server 2016|Technical Preview 4(Build 10586)|2012R2のHyper-V上で動作|
|PowerShell|5.0|2016TP4標準のまま|

## IISにCGIを設定する。

「PowerShell CGI」とかで検索すれば色々出てきますが、忘れやすいところを中心にメモ。

### 役割にCGIを追加しておくこと。

普通にIISを設定してもCGIは有効にならないので、以下のようにチェックして役割を追加するのを忘れないこと。

![IIS-CGI.png](https://qiita-image-store.s3.amazonaws.com/0/111541/d1708c01-2757-8f42-7466-44627ddfc881.png)

### スクリプトマップの追加。

-File以降は無くても動くっぽいけど、付けておいたほうが安全なはず。

![script_Map.png](https://qiita-image-store.s3.amazonaws.com/0/111541/7a8c8241-8138-0f37-77e8-c89e562c0687.png)

### CGIを開き「起動ごとに新しいコンソールを使用する」をTrueにする。

![CGI.png](https://qiita-image-store.s3.amazonaws.com/0/111541/22fc1b56-4932-e5c4-ab0c-f622a850c622.png)

## ソースを配置。

IISがデフォルトなら、「C:\inetpub\wwwroot\」がルートなので、そこにcgiフォルダを作り、以下のソースを配置。
ここでは手っ取り早く、$PSVersionTableをJSONで返すだけ。
（効率優先するなら、ConvertTo-jsonには-Compress付ける。）

```ps1:hello.ps1
"Conten-type:application/json"
""
$PSVersionTable | ConvertTo-json;
```

## アクセスしてみる。

他のマシンから、「http://**マシン名**/cgi/hello.ps1」でアクセスできた。

![JSON.png](https://qiita-image-store.s3.amazonaws.com/0/111541/97869c26-4571-4df4-1066-aa4dc2a3f822.png)
iOS9でABNewPersonViewControllerが動かないぞっと


ドキュメントを追えきれてない自分が行けないので、これから書くことは俺もめんどくさがり屋だぜ、という人以外は関係ありません。

## iOS9での症状
アドレス帳に追加するために表示したABNewPersonViewControllerが何故か閉じない

まあ、バグだなと思ってデバッグするときは、大概自分のコードがどこかおかしいと思いますよね（結論：先にドキュメント見ろ！）。

で、いつものとおり自分のコードを疑い始めたわけです（結論：自分のコードが悪かった）。アドレス帳が閉じないのでまっさきに見たのはdelegateの

	- (void)newPersonViewController:(ABNewPersonViewController *)newPersonView
       didCompleteWithNewPerson:(ABRecordRef)person


の中で、閉じるところ

	    [self dismissViewControllerAnimated:YES completion:nil];

を確認したり、ダイアログを表示するところ、

	ABRecordRef newPerson = ABPersonCreate();
        〜略〜
        
	ABNewPersonViewController *newPersonViewController = [[ABNewPersonViewController alloc] init];
	newPersonViewController.newPersonViewDelegate = self;
	newPersonViewController.displayedPerson = newPerson;
	CFRelease(newPerson);
        
	UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:newPersonViewController];
        [self presentViewController:navigation animated:YES completion:nil];
        
はこうしてた。うーむ、普通だ。

なんてことはない、iOS9では、AddressBook.frameworkではなく、Contacts.frameworkやContactsUI.frameworkを使うのだそうだ。

https://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS9.html

Appleのリリースノートは見たけど、その時はいつかはなくなるけどバイナリとしてはまあ動くのかなあくらいにしか思ってなかった。まさか、使わないほうが良いとは思わなかった。

今までもだいたい動いていたしね。
今後はそんな考えはやめて、ちゃんとコードはメンテナンスしておこうと誓いました。

同じような人が出ないためにもiOS9の場合は、ごっそり、

	CNContactStore *store = [[CNContactStore alloc] init];
        
	CNMutableContact *contact = [[CNMutableContact alloc] init];
        
	CNLabeledValue *homePhone = [CNLabeledValue labeledValueWithLabel:CNLabelHome value:[CNPhoneNumber phoneNumberWithStringValue:phoneNumber ]];
	contact.phoneNumbers = @[homePhone];
        
	CNContactViewController *contactViewController = [CNContactViewController viewControllerForNewContact:contact];
	contactViewController.contactStore = store;
	contactViewController.delegate = self;

	UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:contactViewController];
	navigationController.modalPresentationStyle = UIModalPresentationPageSheet;
        
	[self presentViewController: navigationController animated:YES completion: nil];


としてください。もちろんdelegateでdismissするのをお忘れなく。
冒頭に書いたUIのバグは解決したのは言うまでもありません。
Cocoaの機能を使ってアプリケーションを強制終了するAppleScriptハンドラ



* 反応しなくなったアプリケーションを強制的に閉じるときに使える
* background onlyのアプリケーションも対象にできる


```AppleScript
use scripting additions
use framework "AppKit"

my forceQuitApplication("SystemUIServer")

on forceQuitApplication(anApplication)
	--require Framework: AppKit
	tell application "System Events"
		set bundleIdentifier to bundle identifier of my getProcess(anApplication)
	end tell
	return (current application's NSRunningApplication's runningApplicationsWithBundleIdentifier:bundleIdentifier)'s forceTerminate as boolean
end forceQuitApplication

on getProcess(args)
	tell application "System Events"
		if class of args = application then
			return application process (name of args)
		else if class of args = application process then
			return args
		else
			return application process (args as text)
		end if
	end tell
end getProcess
```


## 更新履歴

* 2016-01-31: AppKitフレームワークのNSRunningApplicationクラスを使って作成
Hugoでカスタムフィールド

# Hugoでカスタムフィールドを出力する方法

Qiitaで探してみたがそれっぽい記事がなかったので簡単にまとめます。

一応ドキュメントにも記載あるようですが、WordpressやMovableTypeとかを触っていた人にしてみるとカスタムフィールドの方が馴染みがあると思いますが、下の方法で設定できるみたいです。

### 例）英語タイトルのフィールド `title_english` を作りたい場合

#### default.mdの設定

```:architypes/default.md
+++
date = "now()"
draft = true
tags = ["life","design","front-end","development","cycling"]
title = "記事タイトル"
title_english = "Entry Title"
slug = ""

+++
```

#### 記事の設定

好きなようにtitle_englishに記入します。

```:content/post/任意ファイル名.md
+++
date = "now()"
draft = true
tags = ["life"]
title = "妖怪川柳攻略方法！"
title_english = "Specter poem capture method!"
slug = "specter_poem_capture_method"

+++
```

#### テンプレートの設定

```:layouts/_default/single.html
<html>
<head>
<title>{{.Params.title_english}}</title>
<body>

...

</body>
</html>
```


### 参考

- [Template Variables #Page Params](http://gohugo.io/templates/variables/#page-params)
- [How to display a custome page variable](https://discuss.gohugo.io/t/how-to-display-a-custome-page-variable/1557/7)
Vagrantで仮想マシン作成・管理


# 前提

* vagrant, VirtualBoxはあらかじめインストール済み

# 仮想マシンのインストール

## 用語

* box

> Vagrantでは、OSのインストーラを使って仮想マシンにOSをインストールするのではなく、あらかじめOSがインストールされたディスクイメージを使用して仮想マシンを作成する。VagrantではディスクイメージやVirtualBoxの設定ファイル、メタデータなどを「box」（複数形は「boxes」）という形式のファイルにまとめて取り扱う
> http://knowledge.sakura.ad.jp/tech/1552/2/

* Vagrantfile

> 「Vagrantfile」というファイルに作成する仮想マシンの設定情報を記述する
> http://knowledge.sakura.ad.jp/tech/1552/2/

## 手順

* boxファイルを選定する。公開されているサイト例は下記<br>
Puppet Labs Vagrant Boxes http://puppet-vagrant-boxes.puppetlabs.com/<br>
Chef社の「Bento」プロジェクト https://github.com/opscode/bento
* Vagrantfileを生成するディレクトリを作成
* 「vagrant init box名 boxのURL」コマンドでVagrantfileを生成する<br>
例： $ vagrant init centos-6-x64 http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210.box<br>
box名は任意の名前を付与することができる（ただし仮想マシン名自体がboxのメタデータとして定義されてるものもあるっぽい。その場合はvagrant upの際にエラーになるっぽい）
* 「vagrant up」コマンドでboxファイルをダウンロード（初回のみ）し、起動する

## Guest Additions

Guest Additions とは、VirtualBoxのプラグイン。このプラグインを使うと、共有フォルダのマウントができる。
ただ、GuestAdditionsはカーネルのバージョンが変わると新たにビルドしなきゃいけなくなるので注意。

その時の対応としては vagrant vbguest コマンドを打つ。
これやるとGuest Additionsをアップデートしてくれるみたい。
cf. http://qiita.com/isaoshimizu/items/e217008b8f6e79eccc85

## 備考

「vagrant init box名 boxのURL」の代わりに下記手順でもOK

* vagrant box add box名（管理用っぽい） boxのURL<br>
→　ローカルにboxファイルをダウンロードする<br>
コマンド詳細は http://lab.raqda.com/vagrant/cli/box.html
* vagrant init box名
→　ダウンロードしたboxをもとにVagrantfileを生成

# その他よく使うコマンド

## boxの操作系
* vagrant box list<br>ローカルに保存されたboxの一覧を表示
* vagrant box remove<br>ローカルに保存されたboxを削除

## 仮想マシンの操作系
* vagrant up<br>仮想マシンを起動
* vagrant ssh<br>仮想マシンにログインする。アイパスは vagrant/vagrant
* vagrant halt<br>仮想マシンの停止
* vagrant destory<br>仮想マシンの破棄
* vagrant status<br>仮想マシンの稼働状況を確認

# 参考

* Vagrant日本語ドキュメント http://lab.raqda.com/vagrant/index.html
Wordpressの環境をさくっと作るならvccw


## VCCW 

Wordpress向けの環境構築をVagrantとChefでさくっと済ませてくれるツール

http://vccw.cc/

## 構築

Host変更のためにVagrantプラグインを入れる。Windows環境では動作しないようなので自分で書き換える必要がアリそう。

````
$ vagrant plugin install vagrant-hostsupdater
````

追記するべきHostの記述は下記の通り

````
vccw.dev 192.168.33.10
````

プロジェクトのファイルを
[Github](https://github.com/vccw-team/vccw)からクローンしてくるか、
[公式サイト](http://vccw.cc/)のzip、tar形式でダウンロードしてくるかで入手し、展開して`vagrant up`コマンドを叩く。

````
$ git clone https://github.com/vccw-team/vccw
$ vagrant up
````

`http://vccw.dev`を起動して完了

## 環境のメモ

トップページURL : http://vccw.cc/

### Wordpress 管理画面

URL: http://vccw.cc/admin/

Username: admin
Password: admin

### データベース

Host : 127.0.0.1
Username : wordpress 
Password : wordpress
Port : 3306

### SSH 

Host : 127.0.0.1
Username : vagrant
Password : vagrant
Port : 2222


## トラブルシュート

### 画像のアップロードが出来ない

デフォルトのIP`192.168.30.10` とかでアクセスすると、
アップロード周りでエラーが起こる。

hostの書き換えは極力行ったほうが良さそう。
vagrantの基本的な使い方


## 準備する

Virtual Boxをインストール
https://www.virtualbox.org/

Vagrant をインストール
http://www.vagrantup.com/

## Vagrantとは何か

簡単にわかりにくく言うと、「パソコンの中にパソコンを作る」的な感じです。

パソコンの中のパソコン、いわゆる仮想マシンは、VirtualBoxなどの専用のソフトを使って、実現される技術ですが、

そのVirtualBoxなどの操作をコマンドラインから便利に行ってくれるのがVagrantです。

## 用意する

`Vagrantfile`を用意。

もっともこれは大抵ドコかしらのプロジェクトから用意されているものを利用する事が多い。

次のセクションで説明するvagrant コマンドは、このVagrantfileの存在するフォルダで使用する。

## Vagrantfileのあるフォルダに移動

Windows ならコマンドプロンプトにVagrantfileのあるパス名を打ち込む

````
C:¥Users¥user> cd {移動したい場所} 
````
Macでもターミナル.appを使って同様に。

````
$ cd {移動したい場所} 
````


## Vagrantを利用する

vagrant コマンドはコマンドプロンプトからも叩けるよう。

Vagrant による仮想環境の起動

````
$ vagrant up
```` 

起動中の仮想マシンにログイン

````
$ vagrant ssh
````

仮想環境の停止

````
$ vagrant halt
````

仮想環境の削除

````
$ vagrant destroy
````

現在起動中の仮想マシン一覧を確認するにはglobal-status コマンドが便利


````
$ vagrant global-status
````
[ethereum]Ubuntu 15.10で出来ていたGPUプール採掘が出来なくなるパターン


# 2016.02.06 追記
* 今朝唐突に動かなくなった……

# 前提
[[ethereum]Ubuntu 15.10でGPUプール採掘 - Qiita](http://qiita.com/ngsw/items/f0ea4eafb171140610c5 "[ethereum]Ubuntu 15.10でGPUプール採掘") のエントリの手順で構築するも、
最初は採掘できているが再起動をトリガーとして採掘できなくなる。

# つまり？
* 再起動するならば液晶モニタを接続した状態で再起動するべし
* 以下は解説

# 症状
僕のグラボの状態だと
採掘不可時には ```clinfo | grep 'Global memory size'``` で確認できる値が50MBほど減少している

* 採掘可能時 1990197248
* 採掘不可時 1940914176

通常この値は2GB必須と言われていて、2GBないとDAGが展開できない？ためかworkLoopに入れない(ので採掘できない)

# よくあるケース

1. Ubuntu Desktopで採掘環境構築直後は採掘できる
2. ふとしたはずみで再起動する
3. 再起動後には採掘できなくなる
4. グラボ壊れたのかなと思いながらも願いを託して1のように初期化するとまた採掘可能となる[^1]
5. 2→3と同じ過ちを複数回繰り返す

[^1]: なのでなんで???となる

# 根本原因

* 起動時に液晶モニタ接続を外しているから

と思われる。
僕はまったく知らなかった。
1. 液晶モニタアダプタを抜いた状態で起動したときのメモリ量は 採掘不可時 1940914176
2. その状態から ```watch -d -n 10 'clinfo | grep "Global memory size"'``` をしつつメモリ状態を表示させ続ける
3. 液晶モニタアダプタを挿すと 197XXXXXXX くらいまでメモリ量上昇を確認(1990197248 は行かない)
オレオレ認証局クライアント証明書の作り方(sha256)


オレオレ認証局でのクライアント証明書の作り方です。
備忘録的に…。なので雑な情報ですが…。

+ CentOS 6で実施

#事前準備

認証局のディレクトリを作成

```
mkdir /etc/pki/caCrt
```

##設定ファイルの準備

###共通

/etc/pki/tls/openssl.cnfをコピー
以下の3ファイルを作成し、「/etc/pki/caCrt」に配置する

+ openssl-ca.cnf
+ openssl-server.cnf
+ openssl-client.cnf

すべてのファイルに以下の修正を加える

```
[ CA_default ]
dir　= /etc/pki/caCrt
default_days = 3650
[ req ]
default_bits = 2048
default_md = sha256
```

それぞれのファイルを修正する

```openssl-ca.cnf
[ usr_cert ]
basicConstraints = CA:TRUE
nsCertType = client, email
```
```openssl-server.cnf
[ usr_cert ]
basicConstraints = CA:FALSE
nsCertType =  server
```
```openssl-client.cnf
[ usr_cert ]
basicConstraints = CA:FALSE
nsCertType =  client, email, objsign
```

#認証局の作成

ディレクトリ整備

```
$ cd /etc/pki/caCrt
$ mkdir certs
$ mkdir crl
$ mkdir newcerts
$ mkdir private
$ touch index.txt
$ touch serial
$ echo "01" > serial
```

以下を実行し、認証局の秘密鍵を生成する。

```
$ openssl req -new -config ./openssl-ca.cnf -x509 -keyout cakey.pem -out cacert.pem -days 3650 -sha256
```

+ 認証局の秘密鍵
 + cakey.pem
+ 認証局の証明書
 + cacert.pem　(ブラウザに「信頼されたルート証明書」としてインストールしたりします。)

#サーバ証明書の作成
```
$ openssl req -new -config ./openssl-server.cnf -sha256 -keyout ./serverkey.key -out servercareq.csr
$ openssl rsa -in ./serverkey.key -out ./serverkey_withpass.key
$ openssl ca -config ./openssl-server.cnf -md sha256 -cert cacert.pem -keyfile cakey.pem -out servercert.crt -infiles servercareq.csr
```
+ サーバ秘密鍵
 + serverkey.key
+ サーバ証明書
 + servercert.crt

#クライアント証明書の作成
```
$ openssl req -new -config ./openssl-client.cnf -sha256 -keyout clientkey.key -out clientreq.csr
$ openssl ca -config openssl-client.cnf -md sha256 -cert cacert.pem -keyfile cakey.pem -out clientcert.crt -infiles clientreq.csr
$ openssl pkcs12 -export -in clientcert.crt -inkey clientkey.key -out clientcertinbrowser.pfx -name "ssltest.test.jp"
```

+ クライアント秘密鍵
 + clientkey.key
+ クライアント証明書
 + clientcert.crt
+ クライアント証明書（クライアント端末にインストールする必要がある） 
 + clientcertinbrowser.pfx

#Apacheの設定
```/etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/pki/caCrt/servercert.crt
SSLCertificateKeyFile /etc/pki/caCrt/serverkey.key
SSLCACertificateFile /etc/pki/caCrt/cacert.pem
SSLVerifyClient require
SSLVerifyDepth  10
```


完了
R言語 - Oracle R Enterprise (ORE) 1.5 がリリースされました

#ハイライト
Oracle R Enterprise (ORE) 1.5 がリリースされました。ハイライトは次の通りです。
##R バージョンの互換性
- オープンソースと Oracle R Distribution の両方(3.2.0)においてサーティファイ
- 新たなパッケージ「randomForest」を含む、以下のパッケージをアップグレード

```
arules 1.1-9, cairo 1.5-8, DBI 0.3-1, png 0.1-7, ROracle 1.2-1, statmod 1.4.21, randomForest 4.6-10
```

##並列分散アルゴリズム
- ランダムフォレストの機能強化(メモリー要件の削減、ore.frame オブジェクトによる In-DB処理)
- 特異値分解と主成分分析の ore.frame オブジェクトによる並列実行のサポート

##パフォーマンス強化
- ore.summary のパフォーマ強化(以前のリリースより30倍程度高速化)

##機能強化
- ore.grant および ore.revoke による権限管理
- 組み込み R 実行時の CLOB/BLOB のサポート
- ore.groupApply 実行時のINDEX 引数の追加

#リファレンス
[Oracle R Enterprise Documentation Media Library Release 1.5](http://docs.oracle.com/cd/E67822_01/)
[Oracle R Enterprise 1.5 Released (Dec 24, 2015)]
(https://blogs.oracle.com/R/)

# 注意点
完全な新機能のリストは、[Oracle R Enterprise User's Guide](http://docs.oracle.com/cd/E67822_01/OREUG/toc.htm) を参照して下さい。
Heroku + MySQL + Rails + Mac とりあえず構築まで


タイトルの通り、構築までをざっくりと。

ドットインストールとかで見たのはPostgresだったので、MySQLで試してみました。
http://dotinstall.com/lessons/basic_heroku




#herokuの準備

まず当然アカウントを作成している必要がある。
https://dashboard.heroku.com/

そしてheroku toolbeltをインストールします。
https://toolbelt.heroku.com/

これがないとherokuコマンドが使えない。

インストールしたらログインできるのか試す。

```bash:terminal
$ heroku login
```

アカウントを求められるのでログインする。
ログインできればherokuの準備は完了。

#MySQLをインストールする

インストールしてください。
参考：http://qiita.com/hkusu/items/cda3e8461e7a46ecf25d

#Railsのアプリを作成する

MySQLで使える様に作成する。
参考：http://qiita.com/itkrt2y/items/4ea5bfe90ca65e4a9ebd

```terminal
$ rails new testapp -d mysql
$ cd testapp //ディレクトリを移動
```

よくわからないけどみんなやってるのtherubyracerのコメントアウトを外す。
あと、herokuでrailsを動かすために「rails_12factor」が必要なので追加する

```Gemfile(編集前)
#gem 'therubyracer', platforms: :ruby
```

```Gemfile(編集後)
gem 'therubyracer', platforms: :ruby

#追加
gem 'rails_12factor', group: :production
```

Gemfileを更新したらbundle install

```terminal
bundle install
```


#Procfileを作成する

heroku上で実行されるコマンドを書いておくファイルらしいです。
Railsのディレクトリ内でやってください。

```terminal
$ vi Procfile
```

```Procfile
web: bundle exec rails server -p $PORT
```

#gitとして初期化

Railsのディレクトリ内でやってください。

```terminal
$ git init
$ git add .
$ git commit -m "initial commit."
```

#Herokuにアプリを登録
　
コマンドラインでできます。
これでherokuのサーバ上にgitリポジトリが作られます。
同時に、公開URLとgitリポジトリのURLが生成されます。

``` terminal
$ heroku create
Creating app... done, stack is cedar-14
[herokuの公開URL] | [herokuのgitリポジトリ]
```

#herokuにMySQLアドオンを追加

``` terminal
$ heroku addons:add cleardb:ignite
```

MySQLの設定（パスワードとか）を調べる

```terminal
$ heroku config | grep CLEARDB_DATABASE_URL
CLEARDB_DATABASE_URL: mysql://[ユーザ名]:[パスワード]@[ホスト名]/[スキーマ名]?reconnect=true
```

##herokuの環境変数を設定

```terminal
heroku config:set DATABASE_URL='mysql2://[ユーザ名]:[パスワード]@[ホスト名]/[スキーマ名]?reconnect=true'
heroku config:set DATABASE_PASSWORD ='[パスワード]'
```


##Scaffoldでもしましょう

```terminal
$ rails g scaffold Text title:string body:text
$ rake db:create
$ rake db:migrate
```

##RailsのDB接続設定を変えます。

```config/database.yml(変更前)
production:
  <<: *default
  database: testapp_production
  username: testapp
  password: <%= ENV['TESTAPP_DATABASE_PASSWORD'] %>
```

さっき追加した環境変数の値を設定しましょう

```config/database.yml(変更後)
production:
  <<: *default
  database: [スキーマ名]
  username: [ユーザ名]
  password: <%= ENV['DATABASE_PASSWORD'] %>
```

そしたらまたコミット

```terminal
$ git add .
$ git commit -m "initial commit."
```


#herokuにデプロイ

```terminal
$ git push heroku master
$ heroku open
```

##herokuにスキーマを作成する

http://xxxxxxxx.com/texts

```terminal
$ heroku run rake db:create
$ heroku run rake db:migrate
```



#ログを見たい時はこう

```terminal
$ heroku logs --tail
```



あとはProcfileにどんなことを書けるのか調べてみたいです。
まだよくわかってないので…。
PDOでMySQLに接続し、fetch(PDO::FETCH_ASSOC)を使って、すべての行を取り出し表示する



```test.php
<?php
try {
	//MySQLのtest2というデータベースに接続。文字エンコーディングの指定。これがないと文字化けする
	$PDO = new PDO('mysql:host=localhost;dbname=test2;charset=utf8','root','root');

	//PDOのエラーレポートを表示
	$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

	$rows = "";	//変数のセット
	//PDOクラスのqueryメソッドを使ってplan_tableテーブルのplan列をすべて抽出、$plansに格納
	$plans = $PDO->query("SELECT plan FROM plan_table");

	//$plansの中のPDOクラスのfetchメソッドを実行
	//引数のPDO::FETCH_ASSOCは、列名を記述し配列で取り出す設定をしている。配列の最後まで下記を実行し続ける
	//fetch:取り出す。Assoc:Associationで、連想する
	//この例は1列だけだが、今後複数になるため連想配列を使う
	while($result = $plans->fetch(PDO::FETCH_ASSOC)){
		//$resultに格納した連想配列のplanを抽出し、$rowsに格納。planがある限り、$rowsに追加していく
		$rows .= $result['plan']."</br>";	
	}
} catch (PDOException $e) {
	exit('データベースに接続できませんでした。' . $e->getMessage());
}

//htmlspecialchars関数で特殊文字を文字に変換。不正アクセスを防ぐ
function h($str) {
    return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}
?>
```

HTML部に下記を記述します。

```test.php
<?php echo $rows; ?>
```


こちらのサイトが参考になりました。
http://qiita.com/tabo_purify/items/d1166236f3b03c7be60d
案 > NeuralNetworkで係数を圧縮する

色々参考にしているmacsbugさんのページ

https://macsbug.wordpress.com/2015/11/29/esp8266bme280ir-ledthigspeak/

> 問題点：
１.　ESP8266の容量不足：リモコンデータは、かなりメモリーを使用します。
＿　　２つの変数を使用していますが３つ使用すると動作せず多数のリモコンボタン機能は実現できません。

acon[]とacoff[]にあるたくさんの定数のことのようだ。


Neural Networkを使えばどうだろうか。

- 入力層 : 1ノード
  - 配列のインデックス
- 中間層 : 要検討
- 出力層 : 1ノード
  - acon[]の値

教師データでNNを学習させて(backpropagation法)、それぞれの層をつなぐ係数だけ保存すれば、データとしては圧縮できると思う。

教師データをそのまま使うので未学習データよりは精度はよさそう。

上記を実行する上での問題点

- 近い値は出るが、まったく同一ではない
- backpropagationのコードは15年ほど前のHDDのどこかにある
  - ないかもしれない
  - HDDが動かないかもしれない

NNを使わなくても圧縮する式は別途あるかもしれない。圧縮アルゴリズムを勉強すればいいのだろうか。
AndroidでPOSTリクエストを送付する（HttpURLConnection利用）

以前、GETリクエストの記事を書きましたが
POSTリクエストも追記します。

送付するJSON文字列イメージ

```json
{
    "user":{
    "name": "post",
    "password": "password",
    "password_confirmation": "password"
    }
}
```

```java

final String json =
  "{\"user\":{" +
  "\"name\":\"name1\","+
  "\"password\":\"password\","+
  "\"password_confirmation\":\"password\""+
  "}}";

try {

   String buffer = "";
   HttpURLConnection con = null;
   URL url = new URL("URL");
   con = (HttpURLConnection) url.openConnection();
   con.setRequestMethod("POST");
   con.setInstanceFollowRedirects(false);
   con.setRequestProperty("Accept-Language", "jp");
   con.setDoOutput(true);
   con.setRequestProperty("Content-Type", "application/json; charset=utf-8");
   OutputStream os = con.getOutputStream();
   PrintStream ps = new PrintStream(os);
   ps.print(json);
   ps.close();

   BufferedReader reader =
   new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
   buffer = reader.readLine();

   JSONArray jsonArray = new JSONArray(buffer);
   for (int i = 0; i < jsonArray.length(); i++) {
       JSONObject jsonObject = jsonArray.getJSONObject(i);
       Log.d("HTTP REQ", jsonObject.getString("name"));
   }
   con.disconnect();
   } catch (MalformedURLException e) {
       e.printStackTrace();
   } catch (ProtocolException e) {
       e.printStackTrace();
   } catch (IOException e) {
       e.printStackTrace();
   } catch (Exception e) {
       e.printStackTrace();
   }
}

```

（参考）
JavaでHTTPリクエスト
→http://www.magata.net/memo/index.php?Java%A4%C7HTTP%A5%EA%A5%AF%A5%A8%A5%B9%A5%C8

JavaでJSON文字列を扱うライブラリはたくさんありますが
それを入れるまでもない程度なので、文字列をJSONの書式にそって
作成してPOSTで投げています。


サーバサイドはrailsなんですが、JSONの書式に沿った文字列を
作るときちんと取得できません。。
たとえば、文字列の最外を角かっこにすると([])、うまく取得できない。
railsの動きを別途追ってみる予定です。

Java側では、JSON文字列に角かっこがないとnew JSONArray(文字列)で
JSONオブジェクトに変換失敗します。今はこれを基準にして統一しています。

（参考）
JavaScript Object Notation
https://ja.wikipedia.org/wiki/JavaScript_Object_Notation
今後、Javaの標準APIにJSONを扱う機能が追加されるようです。
WebGLのテクスチャについて備忘録

# テクスチャのサイズが2^Nでないといけない条件
テクスチャのサイズの一辺あたりが2,4,8,16,32,64,128,256,512,1024,2048...でないとエラーが出ることがある。
ただし、2*1024などはOK、縦横の大きさが揃っている必要はない。

## Mipmapを必要とするとき
Mipmapが必要なときは、当然ながらMipmapを作らなければならない。
Mipmapを作るテクスチャが2^Nのサイズを満たしていないときこれに失敗する。

つまり、縮小フィルタに対して、

* WebGLRenderingContext.LINEAR_MIPMAP_LINEAR
* WebGLRenderingContext.LINEAR_MIPMAP_NEAREST
* WebGLRenderingContext.NEAREST_MIPMAP_LINEAR
* WebGLRenderingContext.NEAREST_MIPMAP_NEAREST

のいずれかが指定されているとき。
なお、自分でgl.generateMipmapを呼ぶ必要があるが、もしもこのテクスチャが更新されるもの(FBOにバインドされて書き換わるもの)ならば、更新してから次に使うまでの間に毎回generateMipmapの必要がある。

## gl.REPEATもしくはgl.MIRRORED_REPEATがWrapSもしくはWrapTに対して指定されているとき

このときは、同じように2^Nである必要性がある。
UIWebView: ダイアログ(っぽいView)のアンカーをクリックしたら閉じる



## WebContentView

~~~csharp
using Foundation;
using System;
using System.CodeDom.Compiler;
using UIKit;
using ObjCRuntime;


namespace PhonePop
{
	partial class WebContentView : UIView
	{
		const string NibName = "WebContentView";

		public UIWebView Html {get { return ContentHtml; }}

		public WebContentView (IntPtr handle) : base (handle)
		{
		}

		public static WebContentView Factory()
		{
			var arr = NSBundle.MainBundle.LoadNib (NibName, null, null);
			return Runtime.GetNSObject<WebContentView> (arr.ValueAt(0));
		}
	}
}
~~~

## WebContentViewController

~~~csharp
using System;

using UIKit;

using Foundation;
using ObjCRuntime;

namespace PhonePop
{
	public partial class WebContentViewController : UIViewController
	{
		WebContentView HtmlView { get;set; }

		public WebContentViewController () : base ("WebContentViewController", null)
		{
		}

		public override void ViewDidLoad ()
		{
			base.ViewDidLoad ();
			// Perform any additional setup after loading the view, typically from a nib.

			HtmlView = WebContentView.Factory();
			HtmlView.Frame = View.Frame;
			View.AddSubview (HtmlView);

			SetupHtml ();

		}

		void SetupHtml()
		{
			var dialog_delegete  = new MyWebView ();
			dialog_delegete.OnNavigating += (
				object sender,
				NSUrlRequest request,
				UIWebViewNavigationType naviType) => {
				if (request.Url.AbsoluteString.IndexOf ("close") >= 0) {
					this.DismissViewController (true, () => {});
				}
			};

			HtmlView.Html.Delegate = dialog_delegete;

			string contentDirectoryPath =
				System.IO.Path.Combine (NSBundle.MainBundle.BundlePath, "");

			string htmml = @"<html><body><a href=""#close"">Close</a></body></html>";

			HtmlView.Html.LoadHtmlString(htmml,
				new NSUrl(contentDirectoryPath, true));
		}

		public  class MyWebView : UIWebViewDelegate
		{
			public delegate void OnNavigatingEvent(
				object sender, NSUrlRequest request,UIWebViewNavigationType naviType );
			public event OnNavigatingEvent OnNavigating;
			public bool ForceLoading {get;set; } = true;

			public override bool ShouldStartLoad (
					UIWebView webView, NSUrlRequest request,
					UIWebViewNavigationType navigationType)
			{
				if (OnNavigating != null) {
					OnNavigating (webView, request, navigationType);
				}

				return ForceLoading;
			}
		}
	}
}
~~~
MacでPATH設定間違えたとき

# PATHの設定間違えた

- .zshrcなどでパスの設定を書き間違えて保存
- ```source ~/.zshrc```しちゃった
- lsもmvもrmも使えなくなって詰んだ＼(^o^)／

# 焦らずにPATHを再設定

```
$ export PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin"
```

# 間違えた箇所を修正する

```
$ vi .zshrc
```

PATHの書き間違えには気をつけましょう…
PostgreSQLのjsonb型とActiveRecord

postgresql9.4で組み込まれたjsonb型をActiveRecordから扱う実験


## 準備

とりあえずテーブルを作る。(migrationはつかわない)

```
=# create table tests (id serial primary key, body jsonb);
=# insert into tests (body) values ('{"attrs":[2,3,5],"is_hoge":true,"text":"aaaa bbb"}');
```

## ARから

json演算子`->`をつかってjsonbデータ内の一部をとってくるテスト

```rb
require "active_record"
require "pp"

ActiveRecord::Base.establish_connection(
  adapter: "postgresql",
  encoding: "unicode",
  host:     "localhost",
  database: "sandbox",
)

class Test < ActiveRecord::Base
end


b =  Test.select("body->'attrs'->2  as foo").first

p b.foo #=> 5
```
DialogFragment: WebView でダイアログボックスを作ってアンカークリックしたら閉じる


~~~csharp

using Android.App;
using Android.OS;
using Android.Views;

namespace DroidPop
{
	public class WebPopFragment : DialogFragment
	{
		public override void OnCreate (Bundle savedInstanceState)
		{
			base.OnCreate (savedInstanceState);
			// Create your fragment here
		}

		MyWebViewClient WebClient {get;set ; } = new MyWebViewClient ();

		public override View OnCreateView (
			LayoutInflater inflater,
			ViewGroup container,
			Bundle savedInstanceState
		)
		{
			// Use this to return your custom view for this Fragment
			// return inflater.Inflate(Resource.Layout.YourFragment, container, false);

			base.OnCreateView (inflater, container, savedInstanceState);

			var view = inflater.Inflate(Resource.Layout.WebPop, container, false);

			var webview = view.WebView (Resource.Id.WebContent);

			webview.LoadData (
				@"<html><body><a href=""/close"">Close</a></body></html>",
				"text/html", "utf-u");

			webview.SetWebViewClient (WebClient);

			WebClient.OnNavigating += (object sender, string url) => {
				if(url.IndexOf("close") >= 0 ){
					Dismiss();
				}
			};

			return view;

		}
	}

	public class MyWebViewClient : Android.Webkit.WebViewClient
	{
		public delegate void OnNavigatingEvent(object sender, string url);
		public event OnNavigatingEvent OnNavigating;

		public override bool ShouldOverrideUrlLoading (
			Android.Webkit.WebView view,
			string url
		)
		{
			if (OnNavigating != null) {
				OnNavigating (view, url);
			}
			return false;
		}
	}
}

~~~
Hapi.jsで開発するときにはGlueをつかうとよさそう

どうも僕です。
Node.jsのフレームワークでExpressとはまた別なHapi.jsというものをいま試しています。

このHapi.jsですが、先日アプリを作る用のボイラープレートを準備しているときにバグに遭遇してGlueというライブラリを知ったのでこの知見を共有しておきます。

リポジトリはこちら
https://github.com/boilerplate-garage/hapi-mongo-boilerplate

## Glue
https://github.com/hapijs/glue

ググラビリティの低い名前ですが、hapi.jsのサーバーの設定、起動、プラグインの登録などをワンストップサービスでやるためのライブラリです。

基本的にはHapi.jsも下のコードのように、他のNode.jsフレームワーク同様手続き的にサーバの設定やルーティングのメソッドを順番に呼び出して、最後に`start()`みたいな起動のメソッドを呼び出すかたちです。

```JavaScript
var Mongo = require("hapi-mongodb");

var server = new Hapi.Server();

server.connection({
  host: "localhost",
  port: 8000
});

server.register({ 
  register: Mongo,
  options: {
    ...
  }
});

server.route({
  ...
});

server.start(function(err) {
  ...
});
```

hapi.jsではプラグインをの読み込みをしたい時には必ず`server.start()`の前で`server.register()`というメソッドを使わないといけないのですが、内部処理のタイミングがずれてregisterメソッドが呼ばれる前にstartメソッドが走ってしまうみたいなことがあるらしいです。(https://github.com/hapijs/hapi/issues/2516)

まだfixされてないバグらしいので無理やりコールバックなどを使って解決するのもまあありですが、、、複数のプラグインをよみこむときにダルいので、ここはおとなしくGlueを使って以下のように書きましょう。

```JavaScript
var Glue   = require('glue');

var manifest = {
  connections: [
    {
      host: "localhost",
      port: 8000
    }
  ],
  registrations: [
    {
      plugin: {
        register: 'hapi-mongodb',
        options: {
          ...
        }
      }
    }
  ]
};

Glue.compose(manifest, {}, function(err, server) {
  if (err) throw err;
  server.start(function(err) {
    if (err) throw err;
    console.log("Server running at: " + server.info.uri);
  });
});
```

ルーティングは別に`Glue.compose(...)`のコールバックのなかでやるとよさそうです。
これでGlueが内部的にregistrationsに設定されたプラグインを読み込んでくれるので安心。
Apache 2.4でPOSTの内容をログに出力するときは"LogLevel debug"だけじゃ出てこない

# tl;dr

* dumpioモジュールを有効化し、InputとOutputを有効化
  * 場合に依ってはOutputは要らないかも

```
LoadModule dumpio_module modules/mod_dumpio.so
DumpIOInput On
DumpIOOutput On
```

* LogLevelに `dumpio:trace7` を追加（**重要!!**）

```
LogLevel debug dumpio:trace7
```

# 検証環境

* さくらのクラウド
* CentOS7.2 テンプレート
* yumでインストールしたApache 

```
[root@web01 httpd]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
[root@web01 httpd]# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Nov 19 2015 21:43:13
```

# 経緯

今までは`dumpio`モジュールを有効化した後、`LogLevel`をdebugにしておくと、各モジュールのデバッグ情報も出力されておりましたが、仕様が変わったようです。

* 今までの記法

```
LogLevel debug
```

* これからの記法

```
LogLevel debug dumpio:trace7
```

通常のログメッセージが`debug`相当を必要としないなら、`warn`などにしても問題無いです。

```
※問題無し！
LogLevel warn dumpio:trace7
```

# ログ

こういうHTMLを用意

```
[root@web01 html]# cat -n index.html
     1  <!DOCTYPE HTML>
     2  <html>
     3          <head>
     4                  <meta charset="utf-8" />
     5          </head>
     6          <body>
     7
     8            <form method="POST">
     9                  <input type="text" name="name" >
    10                  <input type="email" name="email">
    11                  <textarea name="messeage" ></textarea>
    12                  <input type="submit" name="submit" value="Send Message">
    13            </form>
    14
    15    </body>
    16  </html>
```

手元から実行

```
whywaita% curl -X POST -F "name=hoge" -F "email=cat@example.com" -F "messe=test" http://example.com
```

エラーログにこういうログが出るようになります

```
[Sun Jan 31 11:46:25.379210 2016] [dumpio:trace7] [pid 3989] mod_dumpio.c(103): [client example.com:61852] mod_dumpio:  dumpio_in (data-HEAP): --------------------------b0d1a574a83c2f55\r\nContent-Disposition: form-data; name="name"\r\n\r\nhoge\r\n--------------------------b0d1a574a83c2f55\r\nContent-Disposition: form-data; name="email"\r\n\r\ncat@example.com\r\n--------------------------b0d1a574a83c2f5
5\r\nContent-Disposition: form-data; name="messe"\r\n\r\ntest\r\n--------------------------b0d1a574a83c2f55--\r\n
```

# ドキュメント

* [mod_dumpio - Apache 2.4 ドキュメント 英語版](http://httpd.apache.org/docs/2.4/en/mod/mod_dumpio.html)
  * 英語版だけにこの情報書いてありました…
* [mod_dumpio - Apache 2.4 ドキュメント 日本語版](http://httpd.apache.org/docs/2.4/ja/mod/mod_dumpio.html)
  * このドキュメントには書いてないです…

# 結論

分からなくなったら翻訳ドキュメントを信じずに本家ドキュメント読もう
iOS > link > iOS Developper Library

Xcode? で使うAPIのリファレンス

https://developer.apple.com/library/ios/navigation/#section=Resource%20Types&topic=Reference

もしくは上記のようなページに行き、左メニューのResource Types > Reference を選択する

メソッドの確認は

1. XXX Class Reference を選択する
2. Propertyと記載以外のものがおそらく関数
dotnet > Link > API一覧 > クラスライブラリ

.NET Frameworkのクラスライブラリ

https://msdn.microsoft.com/ja-jp/library/ms229335(v=vs.80).aspx

1. 名前空間のいずれかを選択
2. クラスのいずれかを選択
3. 参照 > 関連項目 > XXX メンバを選択
4. パブリック メソッドが表示される
Qiita > "*"が消える症状と対策 > Markdownのイタリックになっていた

## 症状

1. てすと funcTest(/* test=*/"");
2. てすと funcTest(/*test=*/"");

上記２つの違いはtestの左側に空白があるかないか。

　　`てすと funcTest(/*test=*/"");`
という書き方をすると(空白がない場合)
　　てすと funcTest(/*test=*/"");
になるようです。

## 対策

"`"で前後を囲えばコードとして処理され上記の症状は出ません。

1. `てすと funcTest(/* test=*/"");`
2. `てすと funcTest(/*test=*/"");`
naming > 引数を増やした新しい関数を追加 > 古い関数も使う

```txt:動作環境
C++
```

ある関数があるとする。

- funcFileMake(TDateTime dt);

ここでファイル保存時にファイル名の前後にprefix, suffixをつけたくなったとする。

- 新しい関数(TDateTime dt, String prefix, String suffix);

問題は、こういう時に<font color=red>新しい関数の関数名をどうするか。</font>
元の関数の処理(prefix, suffix未指定)も継続して処理するとする。

選択肢はいくつかありそうだ。

1. 元の関数と同じ名前にする + 元の関数を消す
  - funcFileMake()という関数は１つだけ
  - 元の関数をコールしていたところは `funcFileMake(dt, /* prefix=*/"", /* suffix=*/"");`として実装
2. 元の関数と同じ名前にする + 元の関数を消さない
  - funcFileMake()という関数は2つ以上ある
  - 関数のオーバライド(オーバーロード?)を使う
  - デフォルト引数を使うと混乱を招く。どちらの関数が呼ばれているのか不明になる
3. 元の関数と少し違う名前にする
  - fucnFileMakeExt()
  - Extをつけた関数の拡張時にはどうするか問題が生じる。funcFileMakeExtExt()
  - Extをつける具体例がどこにあったか思い出せない
4. 元の関数をそのまま使う + 引数を構造体にする
  - 構造体のメンバ変数のいくつかを代入忘れて失敗する（実際にした)

1,4の場合は、<font color=red>関数をコールしているソフトすべてのソース書き直しが必要</font>。

こういうときの傾向と対策はまだ自分の中では未完成。
RaspbianでWelcome to emergency mode!

# Welcome to emergency mode!
久しぶりに普段使っていない方のRaspberry Piにsshしようとしたが繋がらない。
電源入れ直し、直接確認してみたら起動時に以下のメッセージが。

```
Welcome to emergency mode! After logging in, type "journalctl -xb" to view
system logs, "systemctl reboot" to reboot, "systemctl default" to try again
to boot into default mode.
Give root password for maintenance
(or type Control-D to continue):
```

`systemctl reboot`や`systemctl default`では解決しない模様。
どうもファイルシステムが原因ぽい。

# 修復
まずはfstabを確認。

```:/etc/fstab
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1
```

`/dev/mmcblk0p2`に対してfsckしたいので、

```
umount /dev/mmcblk0p2
fsck /dev/mmcblk0p2
reboot
```

これでとりあえず普通に起動できるようになった。