OmniAICreator/Qiita-1.07M huggingface dataset:
[ReactiveCocoa] Optimization fastest で死ぬパターン

開発時は上手く動くのに、リリースモード（Optimization Fastest)で死ぬパターンにハマりました。

```swift

class MyViewController : UIViewController {
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var button: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()

        RAC(self.label, "alpha") <~ RACObserve(self.button, "enabled").map { ($0 as Bool) ? 1.0 : 0 }

    ....
```

開発中は `map` が実行されて、`subscribeNext` 前に `map` の処理が走りますが、Optimization Fastest でコンパイルするとあら不思議、`map` を素通りして `subscribeNext` が実行されます。

この場合だと、`map` が実行されずに、最初の処理で `nil` が `subscribeNext` されて、alpha には nil は設定できないよっていう例外が発生します。

### 対応方法

Build Option で Optimization Level が Release のときに Fastest(-O) になっていると、参照が外れた瞬間に GC されるようで、map 処理がまるごと GC されているようです。

そこで、`map` が開放されないように `weakSelf` 節を入れてやります。

```swift
RACObserve(self.button, "enabled").map { [weak self] in
    if let weakSelf = self {
        return ($0 as Bool) ? 1.0 : 0
    } else {
        return 0
    }
}
```

他にやり方ないものでしょうか。。。

参考ソース： [source](http://hamasyou.com/assets/sample/reactdemo.zip)

このソース、Optimization Fastest で動かすと、画面1 (ViewController）を表示しているのに、画面2（SecondViewController）の filter, map, subscribeNext が表示されるという意味の分からない挙動をします。
Nagios version 4 Introduction

Nagios version 4 関連の日本語記事が少なかったので、以前のバージョンとの差異をまとめてみました。version 4 では v3 以前と比べパフォーマンス改善がされているなど魅力的なところがあります。

以下のドキュメントを参照しました。

* [What's New in Nagios Core 4.x](http://nagios.sourceforge.net/docs/nagioscore/4/en/whatsnew.html)
* [Nagios Conference 2013 - Eric Stanley - Whats New Core 4](http://www.slideshare.net/nagiosinc/eric-stanley-whats-new-core-4)

## History of Nagios4

[Nagios Core 4.x Version History](http://www.nagios.org/projects/nagioscore/history/nagios-4-version-history)によると 4.0.0 が 2013年9月にリリース、2014年11月現在 4.0.8 が最新版。3.x 系が 3.5.1 まで進んでいるので、4.x 系の歴史は浅いようです。

### パフォーマンス改善

* **Core workers** の導入
  * Core workersはチェックのみ行う軽量プロセス
  * nagios core 全体をforkしていた以前のやり方よりも小さくforkできる
  * nagios core process と in-memory でやり取りする。これまで重い原因だったディスクI/Oのレイテンシが無くせる
* **Configuration Verification** の改善。以前は O(n2) のコストがかかっていたがこれを改善
* **Event Queue** のinsertコストを改善
* **Macro Resolution**(マクロのコンパイルといった訳でしょうか..)。バイナリサーチにより以前より早くなった

### Object関連

* host定義の `address` アトリビュートは optionalへ
* `hourly_value` アトリビュート, contactsへの `minimum_value` アトリビュートのサポート。integerのバリューで監視項目を重み付けできる。重みにより contact毎に通知するかしないかを制御できる
* service定義に `parents` アトリビュートをサポート。サービス間の依存関係を定義可能になる
* `obess_over_host` と `obsess_over_service` アトリビュートの外、より短い `obsess` アトリビュートをサポート
 

### 設定ファイル

* `object_cache_file` と `status_file` に `/dev/null` を指定可能に。`/dev/null` を指定することで disk I/Oを無くせる。これは他の方法でもobjectやstatusに関する情報を取得できるようになったから(?)
* `log_current_states` ログローテーションの後に監視の current status をログに書き込むかどうか。大規模環境ではこれをoffにすることでdisk spaceを節約できる
* `check_workers` 起動時の worker 数。指定しない場合はCPUコア数により決められる
* `query_socket` query handler socket のパス。デフォルトは `/usr/local/nagios/var/rw/nagios.qh`
* nagios.cfg 内のファイルパスやディレクトリパスは相対パスが利用可能に。相対パスの場合、nagios.cfg の位置が基準に。

### マクロ

* `enable_environment_macros` マクロの値を環境変数として外部スクリプトに渡すかどうかの設定。offにすることでCPU負荷を下げるとのこと。
* `$CHECKSOURCE$` checkするworkerの名前が入る
* `use_large_installation_tweaks`が有効の時、`$HOSTGROUPMEMBERS$`と`$SERVICEGROUPMEMBERS$`は環境変数としてセットされなくなった

### Query Handler

Unix Domain Socketを通じて Nagios Core プロセスとのコミュニケーションが可能になる。現在は5つの種類がある。

* **core** Nagios Coreプロセス管理、また情報取得ができる
* **wproc** workerプロセスの登録、管理、情報取得
* **nerd**  Nerdという pub/sub の仕組みを提供
* **help** help message

## まとめ

core worker の導入により、checkのパフォーマンスが改善されました。効果は要検証ではありますが、[Nagios Conference 2013 - Eric Stanley - Whats New Core 4](http://www.slideshare.net/nagiosinc/eric-stanley-whats-new-core-4) の中の実例 before/after によるとかなり改善しているようです。

Query Handler、nerd などはよく分かってないので今度試してみます。
[Windows] 小ネタ：便利なショートカット

Windowsではシステムフォルダなど、デフォルトでパスが通っている箇所あります。
それを利用して、幾つか便利なショートカットを照会します。

## ファイル名を指定して実行(Windowsキー＋R)から起動できるもの
* コマンドプロンプトを起動　`cmd`
* 電卓を起動　`calc`
* サービス画面を起動　`services.msc`
* コントロールパネルを起動　`control`
* コントロールパネルのプログラムと機能を起動　`appwiz.cpl`
* デバイスマネージャを起動　`devmgmt.msc`
* OSを再起動　`shoutdown -r -t 0`
* エクスプローラでホームを起動　`.`
* エクスプローラで.sshフォルダを起動　`.ssh`
* Excelを起動　`excel`

と、単にパスが通っているフォルダのexeを叩いているだけではありますが、
地味に便利だったりします。
休止状態を無効にしてc:\hiberfil.sysを消す

## 参考

[Win7 TIPS 休止状態（hiberfil.sys）を無効化 - カチュアの館](http://kachua.s151.xrea.com/win7/tips/hiberfil/)

## 手順

コマンドプロンプトを管理者権限で実行

```bash:
powercfg /h off
```

再起動し`c:\hiberfil.sys`が消えていることを確認。

windows 8.1でもこの方法が使えることを確認。

----

## 休止状態をONにするには

```
powercfg /h on
```
vimでvで選択して、pで貼付けが出来なくなっていたのを直した



## トリガ
最新のvimにした時に発生。

```
$ vim --version                                         

VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 12 2014 07:32:18)
MacOS X (unix) version
Included patches: 1-488
Compiled by Homebrew
```

brewから入れたやつ。

## 症状
1. 何かしらヤンクしておく
2. 貼り付けたい部分をvで選択
3. pを押す
4. ヤンクしたものが貼り付けられるはずだが、何も変わらず。。。


## 原因
`.vimrc`でクリップボードに入れるために以下のように設定していた。

```
set clipboard=unnamed,autoselect
```

`unnamed`→クリップボードに入れる
`autoselect`→マウスで選択した部分が自動的にクリップボードに入る

- 参考
 - http://d.hatena.ne.jp/hyuki/20130803/vim

`,autoselect`が悪さをしていた！！！

以下のような流れ。

1. 貼り付けたい部分をvで選択
2. この時、クリップボードに入っていた。
3. pを押す（1で選択した時にコピーされるから、
4. 1で選択したものがコピーされおり、それが貼り付けられるから、結果的に何も変わらない状態にｗ


## 対応
マウスで選択した時にクリップボードに入れるというのは全く使ってないので、
これを設定から外した。


```
set clipboard=unnamed
```

さくっと解決！！やったー！
EventStoreの概念図


[![](https://qiita-image-store.s3.amazonaws.com/0/889/ad4960df-6b18-f0ba-5c47-783f69bba562.png)](https://qiita-image-store.s3.amazonaws.com/0/889/ad4960df-6b18-f0ba-5c47-783f69bba562.png)

EventStoreは、append-only databaseの一種で、ドメインイベントを保存するためのストレージ。一度追加したEventは変更や削除をすることができない。追加したEventは古いものから順にevent idが連番で付与される。EventStoreには複数のEventStreamが保存される。EventStreamは、ドメイン駆動設計のAggregateの1インスタンスに対応する。EventStreamは複数のEventを持つ。stream versionはひとつのEventStreamが何度更新されたか、つまりいくつEventを持っているかを表現する。
　
Eventはその型であるtypeを持つ。typeの名前には、ドメインイベントのクラス名と同じで、過去分詞形の名前を使われる。bodyはドメインイベントをシリアライズした文字列データが入る。

EventStoreのインターフェイスは、追加(append)とストリーム単位での取り出し(stream)、ストアにある全イベントの取り出し(events)を提供する。streamとeventsは、sinceを指定することである時点からのイベントを取り出すこともできる。
mongoidでpolymorphicを実装する

そもそもポリモーフィックってなんじゃ？
簡単に言うとオブジェクト指向の継承です。

わからない人はこちらを参照ください。
http://d.hatena.ne.jp/hichiriki/20100620#12770149270

MySQLなどでActiveRecordを使っている場合は、has_maryだとかpolymorphicだとか、ごにょごにょする必要があるが、mongoの場合は親modelを継承するだけでpolymorphicを実現出来る。

ただこのやり方だと子テーブルと親テーブルに同じカラムが追加されるっぽい？
この辺り調べる必要あり。

○モデル
Parent
ChildrenOne ChildrenTwo
![スクリーンショット 2014-11-17 6.12.45.png](https://qiita-image-store.s3.amazonaws.com/0/35451/e0f2eecb-e795-f8d6-0dab-19b16dd731ba.png)

```ruby:Parent
class Parent
  include Mongoid::Document
  field :hoge, type: String
end
```

```ruby:Children
class ChildrenOne < Parent
  include Mongoid::Document
  field :fuga, type: String
end

class ChildrenOne < Parent
  include Mongoid::Document
  field :fuge, type: String
end
```

参照する時や更新も特にいつもと同じ感じ

```pry:railsc
# ChildrenOneのみ取得
ChildrenOne.first

# ChildrenOneにsave
one = ChildrenOne.create({hoge: "hoge", fuga: "fuga"})
one.save
```
Ruby で Contracts を使って動的型チェック


[[妄想] Rubyに欲しい文法](http://qiita.com/irxground/items/0ff425c555cca55041a3) の記事を読んでいて、ここに書いてあるような動的型チェックであれば [Contracts](http://egonschiele.github.io/contracts.ruby/) を使えばいいんじゃないのかな、と思いました。

## Contracts とは

Contracts という gem は、メソッドにコードコントラクトを設定する機構を追加するものです。

コードコントラクトというのは、あるコード(主にメソッド)に対して「事前条件(pre condition)」や「事後条件(post condition)」などを追加するもので、C++ や .NET Framework ではよく使われている(ような気がする)ものです。

ただ、この Contracts gem においては、もっと単純に、「メソッドの引数と戻り値がある条件を満たしているかをチェックするもの」と考えて良いと思います。そこに条件を設定できるなら、当然型チェックだって可能ですし、想定している用途としてもそれが主であるようです。

大きな特徴はその記述方法で、以下のように書きます。

```ruby
Contract Num, Num => Num
def add(a, b)
   a + b
end
```

普通想定する型チェックのやり方は、メソッド内でassertion的に書いて例外を投げるものになるかと思いますが、Contracts ではこのようにメソッドの外に書きます。

この書き方は結構イカしてると感じます。Rubyっぽいかどうかは置いといて、メソッドのドメインロジックと条件記述が分離しているので、今までのドメインロジックコードのあり方を変えることなくチェックを追加できます。


## 使い方

ちゃんと[ドキュメント](http://egonschiele.github.io/contracts.ruby/)があって、もし英語が読めなくてもコード見れば大体分かる作りになっているので、それを読めばわかると思いますが、2,3 簡単な例を示します。

### インストール方法

```text
gem install contracts
```

Contracts を使いたいコード内で require して、モジュールを mix-in します。

```ruby
require 'contracts'
include Contracts

...
```

### 引数の型チェック

#### 例1

- 2つの引数がいずれも Numeric であること
- 戻り値が Numeric であること

```ruby
Contract Num, Num => Num
def add(a, b)
   a + b
end

puts add(1, "foo")
```

これを実行すると例外が発生する。(コールバックを変更することで例外を投げる以外の対応にすることもできる)。

```text
./contracts.rb:60:in `failure_callback': Contract violation: (RuntimeError)
    Expected: Contracts::Num,
    Actual: "foo"
    Value guarded in: Object::add
    With Contract: Contracts::Num, Contracts::Num
    At: foo.rb:6 
```

#### 例2

- 引数が String であること
- 戻り値が nil であること

```ruby
Contract String => nil
def hello(name)
  puts "hello, #{name}!"
end
```

#### 例3

複数の条件のいずれか、という指定も可能

- 引数が Fixnum か Float であること
- 戻り値が Fixnum か Float であること

```ruby
Contract Or[Fixnum, Float] => Or[Fixnum, Float]
def double(x)
  2 * x
end
```

#### その他

その他、配列やハッシュ、可変長引数に対する Contracts も用意されています。詳しくはドキュメントを参照してください。

### 組み込みの Contracts

以下が組み込みで用意されています。

```text
Num, Pos, Neg, Any, None, Or, Xor, And, Not, RespondTo, Send, Exactly, ArrayOf, HashOf, Bool, Maybe
```

### Contract の自作

クラスメソッドに `valid?` を持ったクラスや、インスタンスメソッドに `valid?` を持ったクラスを定義することで自作の Contract が作れます。

例えば、最初の例で示した組み込み Contract の Num は以下のように実装されています。

```ruby
class Num
  def self.valid? val
    val.is_a? Numeric
  end
end
```

このように Contract を自作することで、先の記事にあった正規表現のチェックも可能です。

```ruby
class StrRepresentHttp
  def self.valid? val
    /^https?:/.match val
  end
end

Contract StrRepresentHttp => String 
def foo(s)
  s
end

foo("https://...")
foo("http://...")
foo("ftp://...")
```

結果

```text
./contracts.rb:132:in `failure_callback': Contract violation for argument 1 of 1: (ContractError)
    Expected: StrRepresentHttp,
    Actual: "ftp://..."
    Value guarded in: Object::foo
    With Contract: StrRepresentHttp => String
    At: aaa.rb:17
```

## 感想

Ruby でこうした型チェックを行うことに対しての是非を問う声は色々あるでしょうが、個人的にはやれることが増えるのは単純に歓迎です。こういうのがあるのは嬉しい。
centosにlinuxbrewを入れるplaybookを書いてみた

久々の投稿！

今日はcentos6.5のvm(vagrant x virtualbox)にlinuxbrewをインストールするansibleのplaybook書いたのでさらしてみようと思います。
試してないですがFedoraとかでもいけるはず。
※centos7,Ubuntuでも動作確認済みです

```yaml:linuxbrew.yml
---
- hosts: "{{ host }}"
  remote_user: "{{ user }}"
  vars:
    - host: 127.0.0.1
    - user: vagrant
    - user_home: /home/{{ user }}
    - brew_home: "{{ user_home }}/.linuxbrew"
  tasks:
    - name: Install the dependency libraries "Development tools" of linuxbrew(Redhat)
      yum: name="@Development Tools" state=present
      when: ansible_os_family == 'RedHat'
      sudo: yes
    - name: Install the dependency libraries "with_items" of linuxbrew(Redhat)
      yum: name={{ item }} state=present
      with_items:
        - curl
        - git
        - m4
        - ruby
        - texinfo
        - bzip2-devel
        - curl-devel
        - expat-devel
        - ncurses-devel
        - zlib-devel
      when: ansible_os_family == 'RedHat'
      sudo: yes
    - name: Install the dependency libraries "with_items" of linuxbrew(Debian)
      apt: name={{ item }} state=present
      with_items:
        - build-essential
        - curl
        - git
        - m4
        - ruby
        - texinfo
        - libbz2-dev
        - libcurl4-openssl-dev
        - libexpat-dev
        - libncurses-dev
        - zlib1g-dev
      when: ansible_os_family == 'Debian'
      sudo: yes
    - name: Add configuration file loading of linuxbrew in bashrc
      lineinfile: dest="{{ user_home }}/.bashrc" state=present regexp="source .linuxbrewrc" line="source .linuxbrewrc"
    - name: Copy .linuxbrewrc
      template: src=linuxbrewrc.j2 dest={{ user_home }}/.linuxbrewrc mode=0644
    - name: Install linuxbrew
      shell: echo -ne '\n' | ruby -e "$(wget -O- https://raw.github.com/Homebrew/linuxbrew/go/install --no-check-certificate)" creates={{ brew_home }}
      register: linuxbrew
    - name: link gcc
      shell: ln -s `which gcc` {{ brew_home }}/bin/gcc-`gcc -dumpversion | cut -d. -f1,2`
      when: linuxbrew.changed
    - name: link g++
      shell: ln -s `which g++` {{ brew_home }}/bin/g++-`g++ -dumpversion | cut -d. -f1,2`
      when: linuxbrew.changed
```

```bash:linuxbrewrc.j2
export LINUXBREWHOME="$HOME/.linuxbrew"
export PATH="$LINUXBREWHOME/bin:$PATH"
export MANPATH="$LINUXBREWHOME/share/man:$MANPATH"
export INFOPATH="$LINUXBREWHOME/share/info:$INFOPATH"
export LD_LIBRARY_PATH="$LINUXBREWHOME/lib:$LD_LIBRARY_PATH"
```

yamlとtemplateはこんな感じで

```shell-session
$ ansible-playbook -i hosts linuxbrew.yml -k
```

呼び出しはこんな感じ
デフォルトでvagrantで立ち上げたvmでextra-vars指定しないでできるようになっています
違うuserとかhostに入れる場合は`--extra-vars "host=x.x.x.x user=hoge"`としてください

これで指定ユーザの$HOMEにlinuxbrewがインストールされます。
gccはシステムのやつを使うようにしています。

参考: http://log.saqihel.net/141018-linuxbrew/

これで新規vm立ち上げても簡単にlinuxbrew環境を構築できますね！

追記:

lxcで立ち上げたcentosとかだとwget,tar,which,rubyがなかったりするので実行前に適宜インストールしてください。
FirefoxDeveloperEdition-jaのhomebrew-cask作った

## [Firefox Developer Edition — Mozilla](https://www.mozilla.org/ja/firefox/developer/)

最近FirefoxのDeveloper Edition出たけど、最近過ぎてCaskがまだ無いようなので作りました。

* [homebrew-starhoshicask/firefoxdeveloperedition-ja](https://github.com/starhoshi/homebrew-starhoshicask/blob/master/Casks/firefoxdeveloperedition-ja.rb)

## 使い方

    brew tap starhoshi/starhoshicask
    brew cask install firefoxdeveloperedition-ja
    # brew tap homebrew-versions してるひとはこっち
    # brew cask install starhoshi/starhoshicask/firefoxdeveloperedition-ja

上記コマンドを打てば日本語のFirefox Developer Editionがイントールされます。
良かったらどうぞ！

## 追記

* [homebrew-versions/firefoxdeveloperedition-ja.rb](https://github.com/caskroom/homebrew-versions/blob/master/Casks/firefoxdeveloperedition-ja.rb)

ここにもあったけど、`Error: SHA2 mismatch`が起きててインストール出来ないかった(2014/11/17現在)。
starhoshicaskなら問題なくできます。
Androidマーケットでアプリケーションを公開する

# Androidマーケットでの公開方法
①アプリケーションに署名を付ける
②デベロッパーアカウントを登録する(25ドルの登録料が必要)
③Androidマーケットへのアプリケーションを登録する

## アプリケーションに署名を付ける
### AndroidManifest.xmlに公開設定を設定する
android:icon → アイコン
android:label → ラベル
android:minSdkVersion → 最低限必要なSDKのAPIレベル

## デベロッパーアカウントを登録する
①以下のアドレスにアクセスし、Googleアカウントでログインする
　http://market.android.com/publish/signup
②以下の搭載情報を入力する
・デベロッパー名
・メールアドレス
・ウェブサイトのURL
・電話番号
・最新情報をメールで受信する
③Google Checkoutを利用して、登録料25ドルを支払う
④GoogleアカウントからGooglebCheckoutの注文内容のメールを受信する
⑤以下のアドレスにアクセスし、デベロッパー販売/配布契約書に同意する
　https://market.android.com/publish/Home

## Androidマーケットへアプリケーションを登録する
①以下のアドレスにアクセスする
　https://market.android.com/publish/Home
②「アプリケーションをアップロード」をクリックする
③署名付きアプリのファイルを選択して、APIKファイルをアップロードする。
④「APKファイル」のタブで、アップロードしたAPKファイルが表示されるので、「有効にする」をクリック
⑤商品の詳細情報を入力する
⑥マーケットでアプリを確認する
unityでswipeさせる

#背景
シューティングゲームを作っていて、スワイプで自機を移動させたかったので実現方法をメモ

#前提
物体を移動させるには下記の2種類の方法があるが、今回はrigidbodyを使うやり方でやってみた。

* transform.position(座標)を上書きする方法
* rigidbodyを使ってrigidbody.velocityに速度ベクトルを代入する方法

#コード

```PlayerController.cs
    void Update()
    {
        if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved) {
            deltaPosition = Input.GetTouch(0).deltaPosition / 100; // 100で割ってるのは割らないと移動距離が長くなりすぎるので小さくするため
            rigidbody.velocity = new Vector3(deltaPosition.x, 0f, deltaPosition.y) * speed;
        }
```

#備考
unity超初心者なので変な箇所あったら教えてほしいです。
Vagrant Tips#2’ Oracleのjdkをインストールさせる(jdk8系)

##[Vagrant Tipsのサマリページはこちら](http://qiita.com/yukimura1227/items/7e34bb12d36e8aa2e6c3)

[Vagrant Tips#2 Oracleのjdkをインストールさせる](http://qiita.com/drafts/4c30ceef01ddc6ac2da4/edit)
のjava8版です。2015年の4月でjdk7のサポートが終了になるとのことなので、そろそろjava8をまじめに勉強しようと思います。

```ruby:Vagrantfile
Vagrant::Config.run do |config|
  config.vm.box = "centos64_6_5"
  config.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box"

  config.vm.provision "shell", path: "setup_jdk.sh"

end
```

```bash:setup_jdk.sh
#!/bin/bash

BASE_DIR="/vagrant"
RPM_DIR="${BASE_DIR}/rpm"
JDK_VERSION=8u73
BUILD_NO=b02
JAVA_RPM_NAME="jdk-${JDK_VERSION}-linux-x64.rpm"
JDK_DOWNLOAD_URL="http://download.oracle.com/otn-pub/java/jdk/${JDK_VERSION}-${BUILD_NO}/${JAVA_RPM_NAME}"

# create dir
if [ ! -d ${RPM_DIR} ]
then
  mkdir -p ${RPM_DIR}
else
  echo "${RPM_DIR} Is Already Exists So Need Not Create"
fi

# if "rpm for jdk file" is noting
if [ ! -f ${RPM_DIR}/${JAVA_RPM_NAME} ]
then
  wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" ${JDK_DOWNLOAD_URL}  -O /tmp/${JAVA_RPM_NAME}
  mv /tmp/${JAVA_RPM_NAME} ${RPM_DIR}/
else
  echo "${JAVA_RPM_NAME} Is Already Exists So Need Not Wget"
fi

# install jdk
sudo rpm -ivh ${RPM_DIR}/${JAVA_RPM_NAME}
```
画像形式が拡張子と一致しないため iOS の実機で表示されない

画像の形式と画像の拡張子が一致していないと、iOS シミュレータだと表示されるが、実機では表示されません。

iOS デバイスで実行しようとする際に Xcode に

```
CopyPNGFile Error
```

というエラーが表示されることから、デバイスに PNG 画像をコピーする際の処理でエラーしてしまうようです。（iOS シミュレータではこの処理が入らないものと思われます）。

プログラム自体はそのまま動いてしまうので見逃しやすいです。

ファイルの拡張子とファイル形式が一致するようにしましょう。

## ファイル形式の確認方法

ファインダーでは画像形式は拡張子のものを表示するので **本当の** ファイル形式は分かりません。

そんなときに個人的にオススメなのは `file` コマンドです。様々なファイル形式を判定することが可能で、他の *nix 系 OS でも使えます。

```bash
$ file hontou_ha_jpg.png
hontou_ha_jpg.png: JPEG image data, JFIF standard 1.01
```

この場合は本当は JPEG ということが分かり、ウソを見破ることができます。

iOS の画像を使うような API であれば、PNG も JPEG も処理できるものがほとんどなので、単純に拡張子を直してあげることが一番早いです。


## 画像形式の変更方法

画像をたくさん直さないといけない場合には [ImageMagick](http://www.imagemagick.org/) の convert コマンドを使うのがオススメです。

### MacOS X でのインストール

インストール方法は [MacPorts](http://www.macports.org/) か [Homebrew](http://brew.sh/) を使うのがオススメです。

MacPorts の場合

```bash:
$ sudo port install ImageMagick
```

Homebrew の場合

```bash:
$ brew install imagemagick
```

### Windows でのインストール

iOS 開発の話をしているので、Windows はあまり関係ありませんが、ImageMagick は Windows 版もあります。
[公式サイト](http://www.imagemagick.org/script/binary-releases.php#windows) からダウンロードしてインストールできます。


### コマンドを使った画像形式変更方法

上が終わると `convert` という画像形式変換ツールが使えるようになります。

```bash:ターミナルで
$ convert hontou_ha_jpg.png hontou_ha_jpg.jpg
```

のように打てば `hontou_ha_jpg.jpg` が **本当に** JPEG 形式になります。
Java備忘録：NetBeansの出力ウィンドウの日本語が文字化けしてしまった場合の対処法

ネットビーンズ（Java）で日本語入力を受け取って出力ウィンドウに表示した所
文字化けしてしまった場合の対処法。



ちなみにコードはこんな感じです。

```java:java
package tes;
import java.io.*;
public class Tes {

    public static void main(String[] args) {
        // TODO code application logic here
        
        
	    //プレイヤー打ち込んだ文字を受け取る
	    try{
	        System.out.println("文字を入力して下さい　⇒　");
	        //入力ストリームの生成
	        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	        String player = br.readLine();
	        System.out.println("あなたが出したのは「" + player + "」です。");

	    }catch(IOException e){
	        System.out.println("Exception :" + e);
	    }
	}
    
}
```





出力結果
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/58653/b2d1ca34-e698-5b31-de51-ec1ee0517929.jpeg)


半角数字は受け取れるのに**日本語は文字化け**してしまう。
調べてみたところ文字コードが原因らしい。

プロジェクトを右クリックでプロパティを選択

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/58653/5466b23f-751e-9e8f-668f-d83f06061e19.jpeg)


プロジェクトプロパティのカテゴリ⇒ソースの下の方
「エンコーディング」を「UTF-8」から「Shift_JIS」へ変更。

![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/58653/cecf6d92-dec0-277b-8158-0e100873c39e.jpeg)


もう一度試してみると・・・


![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/58653/15544a49-66d0-a9bd-4bcb-47f92154acac.jpeg)



**文字化けがなおった！！**
itamaeでConoHaのVPSの初期設定を自動化する

# 目標

以下の作業をitamaeレシピにして自動化することを目標とする。

- 一般ユーザーの作成
- 鍵認証の設定
- sudo有効化
- sshとiptablesの設定

# 下準備

## パスワード準備

レシピにはパスワードをSHA512で暗号化したものをいれなければならないが、例えば以下のように生成できる。

```bash
$ gem install unix-crypt
$ mkunixcrypt -s "salt"
Enter password:
Verify password:
$6$salt$...
```

## rootでsshできるか確認
「サーバーリスト > コンソール」から秘密鍵をダウンロードし、パーミッションを600にしておく。
rootで「サーバーリスト > DNS逆引き設定」のIPアドレスにその鍵でsshできることを確かめておく。

秘密鍵を仮に`~/.ssh/id_rsa.conoha`においたとすると、以降、一般ユーザーでsshできるようにするまでは以下のようにレシピを実行する前提で書く。

```bash
$ gem install itamae
$ itamae ssh recipe.rb -h [IPアドレス] -u root -i ~/.ssh/id_rsa.conoha
```

最初は1つのレシピに全部書いて、後で分割すればいいと思う。

# 一般ユーザーの作成

## templates/sudoers

元々/etc/sudoers にあるやつを以下のように変更したものを、templatesディレクトリとかを作って配置しておく

```diff
## Allows people in group wheel to run all commands
-# %wheel	ALL=(ALL)	ALL
+%wheel	ALL=(ALL)	ALL
```

## レシピ

```ruby
USER_NAME = "k0kubun"     # 変更する
SSH_KEY   = "ssh-rsa ..." # 変更する
WHEEL_GID = 10

user USER_NAME do
  password "$6$...$..." # 前の節でmkunixcryptで生成したやつ
  gid WHEEL_GID
end

directory "/home/#{USER_NAME}/.ssh" do
  owner USER_NAME
  group USER_NAME
  mode  "700"
end

# 公開鍵でssh可能にする
file "/home/#{USER_NAME}/.ssh/authorized_keys" do
  content SSH_KEY
  owner USER_NAME
  group USER_NAME
  mode  "600"
end

# sudo可能にする
template "/etc/sudoers" do
  source "templates/sudoers"
  mode   "440"
  owner  "root"
  group  "root"
end
```

これで一般ユーザーに公開鍵でssh可能かつsudo可能になった。

# sshとiptablesの設定

以下のような変更を加えたsshd\_configとiptablesを用意しておく。

## templates/sshd\_config

- rootログイン無効化
- パスワードログイン無効化
- ssh用ポートを22番から変更

## templates/iplables

- ssh用に開いている22番を別のポートに変更
- HTTP 80番のポートを開ける
- HTTPS 443番のポートを開ける

## レシピ

```ruby
template "sshd_config" do
  path   "/etc/ssh/sshd_config"
  source "templates/sshd_config"
  mode   "600"
end

# sshd_configに変更があったら再起動
service "sshd" do
  subscribes :restart, "template[sshd_config]"
end

template "iptables" do
  path   "/etc/sysconfig/iptables"
  source "templates/iptables"
  mode   "600"
end

# iptablesに変更があったら再起動
service "iptables" do
  subscribes :restart, "template[iptables]"
end
```

これで最低限のセキュリティ対策ができた。

# おわり

このようにitamaeを使うと簡単にVPSの初期設定を自動化することができる。
Wercker を利用したデプロイの際の SSH 鍵設定

[Wercker](https://wercker.com/) という Continuous Integration（CI、継続インテグレーション）を提供する SaaS があります。

なんとベータ版で無料！使わない理由がありません。

CI というとコードのビルドやテストを行うものを思い浮かべる方が多いかと思いますが、デプロイにも使えて、非常に便利です！

ただ、GitHub にプッシュ→Wercker でビルド＆テスト実行→テストが通ったらデプロイ、という流れを考えると、GitHub、Wercker、デプロイ先と3つのサーバを経由しており、お互いにどうやって認証しているのか非常にややこしくなります（少なくとも自分は最初混乱しました）。

## GitHub → Wercker
これは Wercker のウェブサイトから簡単に設定できるので、割愛します。

## Wercker サーバ → デプロイ先サーバ

### 1. ssh-keygen で新しい暗号鍵を生成する。
まずは、Wercker のサーバで実行しているプロセスがデプロイ先のサーバにログインできるようにする必要があります。そのための公開鍵と暗号鍵の鍵ペアを ssh-keygen で作ります。

```bash:
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/id/.ssh/id_rsa): wercker_key
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in wercker_key.
Your public key has been saved in wercker_key.pub.
```

↑の3行目では必ず新しいファイル名を指定しましょう！でないとデフォルトで使っているキーを上書きしてしまう可能性があります！ここでは wercker_key という名前にしました。

実行後に、

* wercker_key      : 秘密鍵（Private Key）
* wercker_key.pub  : 公開鍵（Public Key）

という2つのファイルが `~/.ssh` ディレクトリの中にできているはずです。


### 2. Wercker に秘密鍵を設定する。
次に Wercker 側に __秘密鍵__ を設定します。
個人的にはここが少しややこしかったです（ __秘密__ 鍵なのに外に置くの？みたいな）。
今回の場合、Wercker がデプロイ先に対して認証をしないといけないので、「Wercker の秘密鍵」を設定してるんだ、と理解すれば大丈夫です。

とは言え秘密鍵なのでレポジトリにチェックインする、などは言語道断です。

[Wercker の解説ページ](http://devcenter.wercker.com/articles/deployment/capistrano.html)で紹介されている方法は環境変数を使う方法です。

Wercker に登録しているアプリケーションのページにある Settings をクリックし、Deploy Targets の下に各デプロイ先（テスト環境、本番環境など）があります。その中に ENVIRONMENT VARIABLE というのがあり、その中に秘密鍵を設定します。

![wercker_private_key.png](https://qiita-image-store.s3.amazonaws.com/0/29305/fc3406be-3f7c-a2b5-d460-c228f59a614e.png "wercker_private_key.png")

この際、 __Protected__ と書いてあるチェックを必ず入れましょう。これを入れないと中身がログに出てしまいます。


### 3. デプロイ先サーバの公開鍵を設定する。
最後に接続を受け入れる側であるデプロイ先サーバには公開鍵を設定します。
デプロイを行うユーザのデプロイ先サーバの deploy ユーザの ~/.ssh/authorized_keys に Public Key を加える。


## デプロイ先サーバ → GitHub サーバ

デプロイ先サーバの deploy ユーザの公開鍵を GitHub レポジトリの設定（Settings）にある Deploy Keys に加える。


![github_deploy_key2.png](https://qiita-image-store.s3.amazonaws.com/0/29305/3668848c-a761-3548-54b1-0ffe26d1c0cd.png "github_deploy_key2.png")
bxsliderメモ

# bxsliderのコールバックについて

bxSliderというプラグインの改修がありました。
要件としては、スライドのカウント処理を行うということでした。

こんな要件でした。 
* http://w3q.jp/t/4268
* http://www.antimath.info/demos/bxslider-count/

で、複数設置する際は問題なかったりするのですがCallbackする際などにSyntax errorになるようですね。

色々調べたのでメモ。

たぶん、このへんが正解コードに近かった。

```
jQuery( function($) { 
 $( '.bxslider' ).each( function() {
    slideFunc( $( this ) );
 } );
} );
function slideFunc( $elm ) {
    var slider = $elm.bxSlider( {
        auto: true,
        onSlideAfter: function() {
            slider.startAuto();
        }
    } );
}
```

要件にあったものを自作したほうが早かったかもしれない。。。

# 参考記事

* [BXSLIDERを複数設置する時のメモ](http://blog.fukuike.net/archives/1106)
* [【jQuery】要素の数によってbxSliderの挙動を変更する](http://www.tam-tam.co.jp/tipsnote/javascript/post4363.html)
* [bxsliderの使い方(コールバックを使う)](http://mynotekk.tumblr.com/post/66648072745/bxslider)
xcode複数人開発(1)

今後xcodeで複数人開発をする可能性があるので、チーム開発の際の注意点みたいなモノをメモっておきます。
本番環境で試したわけではないので、もっといい方法とかあったら教えて下さい。

##ざっくりした環境
github
xcode
iOSアプリ開発

##Storyboardについて
iOSアプリのチーム開発においてStoryboardの干渉をよく耳にします。
GUI上でパーツを操作する事が前提のStoryboardで＊行目をマージする…と言った操作を人間が行うのは非常に危険かと思います。
複数人で開発する際は**開発者ごとにStoryboardを用意して、ViewControllerごとに開発を行う**と良いと思いました。
Storyboardを複数に分ける上で問題になるのは画面の遷移かと思います。
元々Storyboardはxibのview画面構築をUIViewControllerに拡張子、画面遷移をプラスした機能なのでやや旨味がなくなってしまいますが、少し複雑なアプリになるだけでStoryboardは矢印だらけになってすぐカオスになるのでいっその事Stoyboard上での画面遷移はやめてしまったほうが得策かと思います。

##コード上での画面遷移

以下の例は
Main.storyboardにDetailというidentifierのついたVCが登録されている場合の例です。

```objc
    UIStoryboard*storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController*vc = [storyboard instantiateViewControllerWithIdentifier:@"Detail"];
    [self presentViewController:vc animated:true completion:nil];
    //pushの時
    //[self.navigationController pushViewController:vc animated:true];
```

それぞれ分割して説明すると、

```objc
    UIStoryboard*storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
```
でStoryboardのインスタンスを生成します。
ここはだいたいのチュートリアルでは

```objc
    [self.storyboard ~
```
と書かれている部分です。
self.storyboardで自分のViewControllerのstoryboardインスタンスを取得しますが、今回の場合他の開発者が管理しているViewControllerを取得する可能性があるのでselfではなくしっかりとStoryboardのファイルを指定してあげます。

```objc
    UIViewController*vc = [storyboard instantiateViewControllerWithIdentifier:@"Detail"];
```

ここでStoryboardのインスタンスからViewControllerを取得します。
`UIViewController*vc`としていますが、delegateやpropertyへのアクセスが有る場合（がほとんどだと思いますが）は`DetailViewController*vc`等クラスで宣言してあげてください。
因みに@"Detail"の部分はStoryboardでViewContollerを選択し、Identity>Storyboard IDで指定出来ます。（指定しないと落ちます。注意！）

```objc
    [self presentViewController:vc animated:true completion:nil];
```

Storyboardで言う画面遷移がこの部分にあたります。
ガベージコレクション（GC）10分ハック

JavaのGCについてカジュアルにまとめました

### [SlideShare](http://www.slideshare.net/yusukewada37/10-41615701)


# ゴール

* Javaを起動するとき
* Javaを書くとき

GCと仲良くなる

# 内容

* GCの仕組み
* GCとJava仮想マシン起動オプション
* GCとJavaプログラム

# ちなみに・・・

スライドは[DeckSet](https://itunes.apple.com/us/app/deckset-turn-your-notes-into/id847496013?ls=1&mt=12)でつくりました。楽ちん

<iframe src="//www.slideshare.net/slideshow/embed_code/41615701" width="476" height="400" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
iPhoneアプリのTableView表示で「unrecognized selector sent to instance」のエラーが発生する

これはmain.storyboardでdataSourceとdelegateの接続先をViewにしてしまうと発生するエラー。
接続先をViewControllerにすることで解決。

一番左側のリストのViewController.swiftに対してではなく、画面デザインからリスト表示になっているところの上の方にあるView Controller Sceneの下のView Controllerに対してControl+ドラッグ＆ドロップで接続する。
Win 8/8.1 のアップデートを行った際の .sln 再ターゲット方法

Visual Studio 2012 Express で作ったソリューションファイル（.sln）を Visual Studio 2013 Express で開くときに、Windows 8 から Windows 8.1 への再ターゲットが必要になります。

(1) 具体的にはソリューションファイルを開こうとすると、以下のようなダイアログが表示されます。

![再ターゲット](https://qiita-image-store.s3.amazonaws.com/0/29305/b610d5f3-d822-1430-aa87-23e48c8fff98.png "retargetting_dialog.png")


(2) [OK] を押すと、Visual Studio が開きますが、下のようにプロジェクト名の横に「再ターゲットが必要です」と表示されます。

![vs_retarget_solution.png](https://qiita-image-store.s3.amazonaws.com/0/29305/f680326a-cb2e-bbe5-0a7d-701eb6f5bc94.png "vs_retarget_solution.png")


(3) プロジェクト名を右クリックして、メニューから「Windows 8.1 に再ターゲット (R)」をクリックします。

![vs_retarget_menu.png](https://qiita-image-store.s3.amazonaws.com/0/29305/cbc9e36e-24fa-c914-4a68-c317dcaa050d.png "vs_retarget_menu.png")


(4) 下のようなダイアログが表示されたら、[OK] ボタンを押します。

![スクリーンショット 2014-08-21 11.39.24.png](https://qiita-image-store.s3.amazonaws.com/0/29305/068a9886-5a8a-3390-46bd-f6732382c942.png "スクリーンショット 2014-08-21 11.39.24.png")

(5) 処理が終わると通常通りプロジェクトが開きます。

![vs_retarget_done.png](https://qiita-image-store.s3.amazonaws.com/0/29305/118f3d1e-57b0-ae52-f19f-611dbe215104.png "vs_retarget_done.png")
Metro アプリでフォントが使えない場合の対処法

## フォントの埋め込み情報

Metro アプリでは下のように書けば

```css
@font-face {
    font-family: "88ttf";
    src: url("/fonts/88ttf.ttf") format('truetype');
}
```

CSS の他のところで、

```css
body {
    font-family: 88ttf;
}
```

のような形でフォントを使えます。

ここまでは普通の Web でやっているのと変わりません。

が、

フォントに埋め込まれた設定で PC へのインストールを許可していない場合は上のように書いただけでは反映されません。

権利うんぬんを抜かして、解決策としてはフォントに埋め込まれた設定を上書きする必要があります。

## embed を使う

その際に使えるツールが[ここ](http://carnage-melon.tom7.org/embed/)からダウンロードできます。

ホームページにある .exe は Windows 95/98/NT のみとなりますが、[C で書かれたソースコードも公開](http://carnage-melon.tom7.org/embed/embed.c)しており、gcc などでコンパイルすれば、Mac や Linux でも実行できます。

```bash
gcc embed.c -o embed
```

コンパイルしたら

```bash
embed 88ttf.ttf
```

と実行するだけです。
ひとりgit手順


###最初の1回
1.リモートにリポジトリ作成
　→githubサイトで「ほにゃらら」作成
2.リモートリポジトリをローカルにクローン
　→$ git clone git@github.com:ユーザー名/「ほにゃらら」.git
3.ローカルで空ファイル作成＆コミット
　→$ cd 「ほにゃらら」
　→$ touch README
　→$ git add .
　→$ git commit -m "最初の空ファイル"
4.ローカルからリモートにプッシュ
　→$ git push origin master
5.developブランチを作成&チェックアウト
　→$ git branch develop
　→$ git checkout develop
6.初期状態を設置した後コミットしてプッシュ
　→$ cd 「ほにゃらら」
　→$ touch README
　→$ git add .
　→$ git commit -m "developの最初"
　→$ git push origin develop
　
2回目以降繰り返し
1.リモートのdevelopブランチをプル
　→$ git pull origin develop
2.ローカルでworkブランチを作成して作業開始
　→$ git checkout -b work
3.作業終わったらコミットしてdevelopにチェックアウト
　→$ git add .
　→$ git commit -a -m "ごにょごにょごにょ"
　→$ git checkout develop
4.ファストフォワードしないでマージ&リモートにプッシュ
　→$ git merge --no-ff work
　→$ git commit -m "ごにょごにょ”
　→$ git push origin develop
5.ブランチが増えるので削除
　→$ git branch -d work
キモいstd::functionalのテンプレート引数の渡し方を使う

std::functionalのテンプレートの渡し方は慣れるまでキモいですね
テンプレートメタプログラミングをしているとこんなテンプレートの渡し方が便利な時があります

```
#include <tuple>

template < class >
struct hoge
{ // 特殊化を前提としますので、空のクラスです
};// 宣言だけでも結構です


//
// こっちが本体
template < class Ty, class... Args >
struct hoge < Ty ( Args... ) >
{
  using ret = Ty;
  using args = std::tuple < Args... >;
};

int main()
{
  hoge < void( int, int ) > h; // キモい
}
```
Markdownをpdfに変換する


Kobitoと連携するツールあるじゃないですか！ 超便利！！

##Kobito cli tools
https://github.com/suin/kobito-cli

##インストール

```
brew tap suin/suin
brew install kobito-cli
```

##使い方

Kobitoの記事一覧を取得。これでタイトルとIDが表示されるので変換対象のIDを控える。

```
kobito ls
```

pdfに変換。

```
kobito pdf ID
```

カレントディレクトリにpdfが保存されます。便利。感謝。
Python のヒアドキュメントを見やすくする小技

Python では通常、ヒアドキュメントを次のように書きます。

```py:Python
message = """Humpty Dumpty sat on a wall,
Humpty Dumpty had a great fall.
All the king's horses and all the king's men
Couldn't put Humpty together again."""
```

しかし、ちょっと見にくいと思いませんか？
こうすれば見やすくなります。

```py:Python
message = """
Humpty Dumpty sat on a wall,
Humpty Dumpty had a great fall.
All the king's horses and all the king's men
Couldn't put Humpty together again.
"""[1:-1]
```

ちょっとした小技でした。
FlameをFirefoxOS2.0にして日本語入力可能にする@Ubuntu１2.04

#元ネタ
http://mobilelaby.com/blog-entry-flame-japanese-input-app-iwnn.html
https://github.com/mozilla-japan/iwnn-ime-sample

詳細な手順は元ネタのページヘ
しかし、MacとWindowsに偏っているのでそのままの手順では目的は達成できない。


#前提
* Firefoxの開発者ツールを使うため最新版が入っていること。（この時点でv33.0）
* FirefoxOSの端末Flameがあること。多分OSのアップデート以降は他の端末も同じはず。
* Android SDKがUbuntuに入っていてadbコマンドのパスが通っていること。

#手順
##ダウンロード
以下のファイルをダウンロードしてどこか（以下~/firefoxosとする）にまとめておく。ダウンロードはFirefox経由で行う。

* Firefox OS を開発元が提供する最新の ベースイメージ (v188版) を取得
http://cds.w5v8t3u9.hwcdn.net/v188.zip
* iWnn IME for Firefox OS 試用版をzipアーカイブ取得からダウンロード
https://github.com/mozilla-japan/iwnn-ime-sample
* nightlyビルドを取得
http://ftp.mozilla.org/pub/mozilla.org/b2g/nightly/latest-mozilla-b2g32_v2_0-flame-kk/
* * 取得するファイルはb2g-32.0.en-US.android-arm.tar.gzとgaia.zip
* * 現時点での最新版
* shallow_flash.sh スクリプトを取得（Rawボタンから名前をつけて保存）
https://github.com/Mozilla-TWQA/B2G-flash-tool/blob/master/shallow_flash.sh

##ベースイメージ (v188版)の反映
v188.zipを解凍する。
`cd firefoxos`
`unzip v118.zip`
`cd 188`
ここでflash.shを実行する。ubuntuのdashでは動かないし権限振るのも面倒なので
`bash ./flash.sh`
ここは簡単に済む。
もし、デバイスがerror: device not foundなどと出る場合は、設定画面→開発者モード→ADB有効としてから再度USBをつなぐと認識してくれる。

###終わったらFlameの開発者モードをONにする。
* Englishを選択後、OKOKでメニュー画面まで行けるように初期セットアップを済ます。
* Settings→Device information→More Information→一番したまで行って→Developer MenuのチェックボックスをONにする。
* Settingsまで戻り、Developer→Debugging via USBをADB and DevToolsに設定する。

##Nightlyビルドへ更新
* Flameが寝ていたら起こしてロックを解除する。
* 以下のコマンドをながす。

`cd ~/fierfoxos`
`./shallow_flash.sh -ggaia.zip -Gb2g-32.0.en-US.android-arm.tar.gz`
※-gと-Gのオプションの後にスペースを入れてはいけない。

###終わったら日本語で初期セットアップを行う。
これ以後OSのアップデートは無いので普段使うつもりでセットアップする。

* 日本語が言語選択できるので、日本語を選ぶ。
* タイムゾーンなどあわせて初期セットアップを完了させる。心持ち画像が綺麗になった。
* 開発者ツールをONにする。環境設定→端末情報→その他の情報→開発者メニューのチェックボックスをONにする。
* 開発者メニューからADBと開発ツールを有効にする。環境設定→開発者→USB経由のデバッグ

##iWnnServerをインストールする
ディレクトリに戻って、解凍、解凍してできてディレクトリに入る。
`cd ~/fierfoxos`
`unzip iwnn-ime-sample-master.zip`
`cd iwnn-ime-sample-master`

ここでこのままでは動かないinstall.shの編集を行う。
`nano install.sh`
9行目の`$(pwd)/`を削除する。(同梱のadbは動かないためAndroidSDKのadbを用いる。)
98,99行目のMac用をコメントアウトしLinux用の96行目をコメント解除する。

実行する。
`bash ./install.sh`
この際Flameが寝ていたらロック解除する。

再起動したらWnnServerインストールは終了。
##iWnn IME キーボードのインストール
###FirefoxのWebIDEを有効化する。
* Firefoxのアドレスバーにabout:configを打ち込みdevtools.webide.enabledの項目をtrueにする。
* Firefoxのメニューからツール→Web開発→WebIDEを選択するとWebIDEが開く。
* 左上のSelect Runtimeを押すと、現在刺さっているデバイス情報がデバイス情報がUSB DEVICEに出現する。なにか出ていなければFlameを接続し直す。あと一度繋いだ後切り離した場合はFirefoxの再起動を行うとつながる。
* この行を押すとFlame側に「リモートデバッグの接続許可を求められています。接続を許可しますか？」と出るので許可する。

###iWnn IME キーボードパッケージアプリのインストール
* OpenApp→Open Package Appよりiwnn-ime-sample-master/keyboard-iwnnを開く。
* 再生マークのinstall and run　ボタンを押す。
* 「iWnn IMEのインストールが完了しました」とFlameに出るのでセットアップを押す。
* キーボードを追加で日本語にチェック、確認を押すと日本語入力が可能に成る。


おしまい。

##使用感
* まあ速度はWebアプリそのものなので若干遅い気もするがフルキーボードは速い。
* 日本語キーボードへの切り替えに一瞬キーボードが真っ黒に成るのが残念。
* nyuが「にゅ」ではなく「んゆ」なのが辛い・・・
macでAndroid(sol24)のroot化手順

* Xperia Z Ultra (au sol24, Android 4.4.2)にて実施
* virtualbox上のwindowsでは1時間頑張ったがusb接続がうまく認識されなかったのでmacでやることにした。

# 参考

* [ケータイ・スマートフォン・モバイル: root root化 Xperia 2012/2013/2014モデル ワンクリック Z1 Z2 Ultra 更新 SO-02E](http://b00111.blogspot.jp/2014/06/root-root-xperia-442-20132014-z1-z2.html)

# adbコマンドの準備

[Android SDK | Android Developers](https://developer.android.com/sdk/index.html?hl=i#download)から`GET THE SDK FOR AN EXISTING IDE`を選択してダウンロードできる`android-sdk-macosx.zip`を解凍。
tools/android を実行しUSBドライバをインストール。
platform-tools/adb があることを確認。

```bash:adbコマンド
$ export PATH=$PATH:$HOME/android-sdk/platform-tools
$ adb devices
List of devices attached
EP7351UWGV	unauthorized
```

Xperia Z Ultraにて「このパソコンを信頼する」を選択。

```bash:
List of devices attached
EP7351UWGV	device
```

unauthorizedが消えていることを確認。

## rootkitXperia_20140719の準備

* [rootkitXperia_20140719.zip](https://www.dropbox.com/s/aeb28snfq2vmf15/rootkitXperia_20140719.zip)

## インストールスクリプト修正

```bash:
sed -e 's/^@//' -e 's@\\@/@/' install.bat > install.sh
```

adbコマンドを`install.sh`の上から順にコピペで実行。
`adb shell`で直に実行。

```bash:adb&nbsp;shell
/data/local/tmp/getroot /data/local/tmp/install_tool.sh
```

自動で再起動される。

注意: 以下ではダメだった。

```bash:失敗例
cd /data/local/tmp
./getroot install_tool.sh
```

# インストール後

* SuperSU をインストール、起動しsuが使えることを確認。

## root化して使いたいアプリ

* DriveDroid : USB経由でLinuxのISO起動
* oneclick scroll
* titanium backup
* buker pxe
* Debian Kit
* terminal関連
Octokit | octokit によって API 経由で GitHub を利用する #octokit

# Octokit | octokit によって API 経由で GitHub を利用する #octokit

## 概要
GitHub の Ruby 向け API ラッパー octokit gem によって API 経由で GitHub を利用します。

## インストール

~~~
$ gem install octokit
~~~

## 疎通確認
GitHub でアクセストークンを作成して、疎通確認してみます。

~~~
require 'octokit'
client = Octokit::Client.new(:access_token => "<your 40 char token>")
print client.user["login"]
~~~

* 出力

~~~bash
tbpgr
~~~

## 参照
* [octkit.rb GitHub](https://github.com/octokit/octokit.rb)
Nginxインストールメモ

Nginxを使うことになりまして。
とりあえずインストールしてみた次第です。

yumでいいだろうとは思ってますが、ついでなのでソースビルドでもインストールしてみました。

環境は以下のとおりです。
OS : CentOS 6.5 64-bit

NginxはStable versionとMainline verionがありますが、Mainlineのほうがバグ修正などが頻繁に取り込まれているようなので、そちらを利用します。

## yumでインストール
### リポジトリ登録
[公式ページ](http://nginx.org/en/linux_packages.html)から、使用するOSに該当するリポジトリのURLを探します。
今回はCentOS 6.x系となるので
http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
を使用します。

```
# rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
```

### Mainline Versionの参照
先程入れたリポジトリの状態はStable versionをインストールするようになっているため、
手作業で`/etc/yum.repos.d/nginx.repo `を修正します。

```/etc/yum.repos.d/nginx.repo(修正後）
# nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/6/$basearch/
gpgcheck=0
enabled=1
```

### インストール

yumでインストールします。

```
# yum install nginx
```

インストールが完了すれば、serviceで起動/停止できます。

```
# service nginx start 
nginx を起動中:                                            [  OK  ]
```

自動起動も設定しておきましょうか。

```
# chkconfig nginx on
```

## ソースビルドでインストール
### 必要となるライブラリのインストール
もともと入っているものもあると思いますので、適宜端折ってください。
#### GCC
説明の必要ないと思いますが、入ってない場合は入れましょう。
`yum install gcc`

#### PCRE
perl互換の正規表現ライブラリだそうです。
`yum install pcre pcre-devel`

#### zlib
gzip圧縮をするために必要になります。
`yum install zlib zlib-devel`

#### OpenSSL
SSLライブラリも必要になります。
`yum install openssl openssl-devel`

### Nginx用ユーザ作成
手動で作成する必要があります。

`useradd --shell /sbin/nologin nginx`

※ yumでインストールすると自動で作成されます。

### Nginxのダウンロード
[公式ページ](http://nginx.org/en/download.html)から、使用したいもののURLを取得します。
今回は、Mainlineの1.7.7を使用することにしました。

```
# wget http://nginx.org/download/nginx-1.7.7.tar.gz
...中略
# tar xvzf nginx-1.7.7.tar.gz
...中略
# cd nginx-1.7.7
```

### ビルド・インストール
configureのオプションは色々あるようでしたが、HTTPサーバとして使用するだけであれば、
SSLとReal IPのモジュールだけ有効化しておけばよさそうでした。

```
# ./configure --user=www-data --group=www-data --with-http_ssl_module --with-http_realip_module
```

make installします。

```
# make
...中略
# make install
...中略
```

` /usr/local/nginx/`にインストールされます。

`/usr/local/nginx/conf/nginx.conf`のuserディレクティブが
コメントアウトされた状態になっているのですが、このままだとworkerプロセスの起動でコケました。
そのため、手作業で以下のようにuser指定をしています。

```/usr/local/nginx/conf/nginx.conf(修正後)
user  nginx nginx;
...後略
```

### initスクリプト作成
http://wiki.nginx.org/RedHatNginxInitScript
にスクリプトがあるので、`/etc/init.d/nginx`を作成して、上記スクリプトの内容を貼り付けます。
※ 2017/3/23追記
上記はリンク切れを起こしてました。
現在はこっちに移行したようです。
https://www.nginx.com/resources/wiki/start/topics/examples/redhatnginxinit/

Nginx本体と設定ファイルの配置先が、デフォルトインストールだとスクリプトに記載されているパスと異なるため、手作業で修正します。

```/etc/init.d/nginx(修正後)
...中略
nginx="/usr/local/nginx/sbin/nginx"
...中略
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
...後略
```

`/etc/init.d/nginx`に実行権限を付与します。

```
# chmod +x /etc/init.d/nginx
```

これで、serviceで起動/停止できます。

```
# service nginx start 
nginx を起動中:                                            [  OK  ]
```

自動起動も設定しておきましょうか。

```
# chkconfig nginx on
```

## 参考
以下を参考にさせていただきました。
ありがとうございました。

http://www.atmarkit.co.jp/ait/articles/1407/24/news003.html
[iOS] iOS8.0で、スリープタイマーが disable にならない


#問題
```Objective-C
[UIApplication sharedApplication].idleTimerDisabled = YES;
```
したにも関わらず、スリープタイマーが作動してしまう。

#原因
iOS8.0において、キーボードの表示・非表示を行うと、idleTimerDisabled が NO になってしまう。

iOS8.1で修正されている模様。

#解決方法
キーボードの非表示後、再度設定し直す。

```Objective-C

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
...

- (void)keyboardDidHide:(NSNotification *)notification
{
    if (!SystemVersionLessThan(@"8.0")) {
        //reset it again.
        [[UIApplication sharedApplication] setIdleTimerDisabled:YES];
    }
}
```

#参考
* [idleTimerDisabled not working under iOS8 Gold Master](http://stackoverflow.com/questions/25869843/idletimerdisabled-not-working-under-ios8-gold-master)
Google Cardboard用コンテンツを作ってみよう(Mac)　その1 開発環境準備編


<a href="http://qiita.com/youukkari/items/d2e578c982c454606d7e">8月に頑張って段ボール切って作った</a>CardBordですが、Unityを利用すればコンテンツ作成できそう！ってことで試してみました。

Unity触ったことなかったので、いろいろ四苦八苦しつつ・・・でもこの画像みたらテンション上がったｗ

![Unityちゃん](https://www.evernote.com/shard/s20/sh/4a2f7c67-9b2a-412a-a016-21dd7b872c95/97682c2cd82e503e7ecba05296adec25/deep/0/UNITY-CHAN!.png)



##必要なツール

###・Unity 無料版
下記よりダウンロードしてインストール
http://japan.unity3d.com/unity/download/

###・ Dive Unity Plugin Package 2.0 for Android/ iOS
スマホ差し込み型のVRキットで、Unity用のプラグインが用意されています。
これでコンテンツつくるとcardbordでもコンテンツ見ることができます。
Unityにインポートして利用するので、ここではダウンロードのみ。

ファイル名：Dive_Plugin_2-0-r498.unitypackage

https://www.durovis.com/sdk.html

![Dive Unity Plugin Package 2.0 for Android/ iOS](https://www.evernote.com/shard/s20/sh/e09606dc-5ec0-4a4f-b0c4-ec6575485cb7/fe8b716d6f2faa25e34fece8c0902c24/deep/0/Durovis-Dive-SDK---creating-games-for-Dive-and-OpenDive-と-Kobito-と-Nexus-5.png)

###・Android SDKのダウンロードとセットアップ

　
 1. 下記URLからダウンロードして、できたフォルダをアプリケーションへ
　http://developer.android.com/sdk/index.html
 2. [sdk]-[tool]-[android]をクリックしてAndroid-SDK-managerを起動

　![](https://www.evernote.com/shard/s20/sh/7d5be11a-fbeb-4171-96e4-5532cd7702fd/e6fab18abfdc0904dadb67f807c79384/deep/0/adt-bundle.png)
 3.  9 以上の高さのAPI(Android 2.3以上)で、ひとつの Android プラットフォーム 、 Platform Toolsを選択してインストール


###・Unityちゃん ３Dモデルデータ
下記URLより、【ユニティちゃんデータ】をダウンロード。
ハロウィン仕様にしたい場合は追加で【ハロウィンユニティちゃん　追加データ】をダウンロード。

http://unity-chan.com/

![](https://www.evernote.com/shard/s20/sh/12cccddc-adcd-485f-9cc1-4f17526c5412/08a4fdc99784d4beac283e972e7dabf2/deep/0/UNITY-CHAN!.png)
![](https://www.evernote.com/shard/s20/sh/ac717a36-6b17-4242-925f-7d22957a3e32/124d65f1d801b18a301d374c5f1701bc/deep/0/UNITY-CHAN!.png)

<br>

<b>これで下準備の下準備が完了！</b>



<br><br><br><br><br>
<br>
<div><img src="http://unity-chan.com/images/imageLicenseLogo.png" alt="ユニティちゃんライセンス"><p>このコンテンツは、『<a href="http://unity-chan.com/download/license.html" target="_blank">ユニティちゃんライセンス</a>』で提供されています</p></div>
[PHP, Ruby] ハッシュに対するいろいろなMap

# はじめに

PHPとRubyにはおおまかに以下のような用語の対応関係があります。

<table>
<tr><th>PHP</th><th>Ruby</th></tr>
<tr><td>関数</td><td rowspan="2">メソッド</td></tr>
<tr><td>メソッド</td></tr>
<tr><td>数字添字配列</td><td>配列</td></tr>
<tr><td>連想配列</td><td rowspan="2">ハッシュ</td></tr>
<tr><td><code>stdClass</code></td></tr>
<tr><td rowspan="3">無名関数</td><td>ブロック</td></tr>
<tr><td><code>proc</code></td></tr>
<tr><td><code>lambda</code></td></tr>
</table>

# 実装

それぞれの言語で、以下の関数・メソッドを書いてみることにします。用語はRuby側に統一します。

- ハッシュの各要素の **値** に対してブロックを適用し、それらの返り値を集めた新しいハッシュを返す
- ハッシュの各要素の **キー** に対してブロックを適用し、それらの返り値を集めた新しいハッシュを返す
- ハッシュの各要素の **値とキー** に対してブロックを適用し、それらの返り値を集めた新しいハッシュを返す

なお、Rubyは初心者です。

## PHP

```php:コード
<?php

function array_kmap(callable $func, array $arr) {
    return array_combine(array_map($func, array_keys($arr)), $arr);
}
function array_kvmap(callable $func, array $arr) {
    $new = array_map($func, array_keys($arr), $arr);
    return $new ? call_user_func_array('array_merge', $new) : $new;
}

$arr = [
    'k1' => 10,
    'k2' => 15,
    'k3' => 20,
];

print_r(array_map(function ($v) { return $v / 100.0; }, $arr));
print_r(array_kmap(function ($k) { return $k . 'a'; }, $arr));
print_r(array_kvmap(function ($k, $v) { return [$k . 'a' => $v / 100.0]; }, $arr));
```

```php:結果
Array
(
    [k1] => 0.1
    [k2] => 0.15
    [k3] => 0.2
)
Array
(
    [k1a] => 10
    [k2a] => 15
    [k3a] => 20
)
Array
(
    [k1a] => 0.1
    [k2a] => 0.15
    [k3a] => 0.2
)
```

`array_merge` を引数なしでコールするとエラーが発生するために、空配列のチェックが必要になってしまうところが惜しいです。

## Ruby

```rb:コード
class Hash
    def vmap
        map{|k, v| [k, (yield v)]}.to_h
    end
    def kmap
        map{|k, v| [(yield k), v]}.to_h
    end
    def kvmap
        map{|k, v| yield k, v}.to_h
    end
end
 
h = {
    'k1' => 10,
    'k2' => 15,
    'k3' => 20,
}
 
p h.vmap{|v| v / 100.0}
p h.kmap{|k| k + 'a'}
p h.kvmap{|k, v| [k + 'a', v / 100.0]}
```

```rb:結果
{"k1"=>0.1, "k2"=>0.15, "k3"=>0.2}
{"k1a"=>10, "k2a"=>15, "k3a"=>20}
{"k1a"=>0.1, "k2a"=>0.15, "k3a"=>0.2}
```

やはりRubyは美しいですね。コードが短い。標準クラスをすんなり拡張出来ちゃうあたりも優秀。

なお、Ruby2.0以前だと `array.to_h` が使えないので `Hash[array]` で代用します。ぶっちゃけ `kvmap` に関しては `to_h` 生やすだけなのでメソッド要らないかも…

# あとがき

キーと値を両方使うとき、返り値を `[k, v]` とするか `{k => v}` とするかが共通の問題になりそうです。

- Rubyは言語実装が `[k, v]` 型を想定しているのでこちらの方が優位です。<br />(編集前は `{k => v}` 型だったので `inject` メソッド使ってました…)
- PHPは `[k, v]` 型で実装すると…ちょっと無理矢理感出てしまいます。

```php:あくまで関数型コーディングだ！(但しPHP5.5以降に限る)
function array_kvmap(callable $func, array $arr) {
    $new = array_map($func, array_keys($arr), $arr);
    return array_combine(array_column($new, 0), array_column($new, 1));
}
```

```php:手続き型で妥協しました(でも多分一番速い)
function array_kvmap(callable $func, array $arr) {
    $new = [];
    foreach ($arr as $k => $v) {
        list($k, $v) = $func($k, $v);
        $new[$k] = $v; 
    }
    return $new;
}
```

コメント欄にてPythonのコードも投げつけてくれると多分喜びます。
LinuxにApacheとOpenSSLをソースからビルドしてインストールする

こちらの記事がとても良記事だったので、ビルドの勉強のために自分でやってみました。

[Apache HTTP Serverのビルドを始めよう](http://www.atmarkit.co.jp/ait/articles/1107/15/news124.html)

自分でソールからビルドしてみると、共有ライブラリ(=ダイナミックリンクライブラリ,シェアードライブラリ)や`.so`ファイルの仕組みがよくわかるようになります。

## 環境
CentOS 6.5
httpd 2.2.29
openssl 1.0.1j

他のディストリビューションでもやり方はほとんど同じだと思います。


## ターゲット構成
/opt/openssl/ にopensslをインストール
/opt/httpd/ にApacheをインストール


## 準備
ビルドに必要なパッケージを入れます。

```
# コンパイルするのに必要
$ sudo yum install -y gcc make
# opensslをビルドするのに必要
$ sudo yum install perl zlib-devel
```

## opensslをソースからビルドしてインストール
```
$ wget https://www.openssl.org/source/openssl-1.0.1j.tar.gz
$ tar xvfz openssl-1.0.1j.tar.gz
$ cd openssl-1.0.1j
$ ./config --prefix=/opt/openssl shared zlib
$ make
$ sudo make install
```

確認

```
$ /opt/openssl/bin/openssl version
OpenSSL 1.0.1j 15 Oct 2014
$ ldd /opt/openssl/bin/openssl
        linux-vdso.so.1 =>  (0x00007fff236db000)
        libssl.so.1.0.0 => /opt/openssl/lib/libssl.so.1.0.0 (0x00007f5237454000)
        libcrypto.so.1.0.0 => /opt/openssl/lib/libcrypto.so.1.0.0 (0x00007f5237076000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f5236e6e000)
        libz.so.1 => /lib64/libz.so.1 (0x00007f5236c58000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f52368c3000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f52376bf000)
```
libssl.soとlibcrypto.soが、自分で入れた/opt/opensslにリンクされていることを確認します。

## Apacheをソースからビルドしてインストール

```
$ wget http://ftp.jaist.ac.jp/pub/apache//httpd/httpd-2.2.29.tar.gz
$ tar xvfz httpd-2.2.29.tar.gz
$ cd httpd-2.2.29
$ ./configure --prefix=/opt/httpd --enable-mods-shared=all --enable-ssl --with-ssl=/opt/openssl
$ make
$ sudo make install
```

`./configure --with-ssl=/opt/openssl`と、自前でいれたopensslにリンクするように指示するのがポイントです。

### mod_ssl.soの動的リンクを確認
mod_ssl.soがちゃんとopensslライブラリにリンクしているか確認します。

```
$ ldd /opt/httpd/modules/mod_ssl.so
    linux-vdso.so.1 =>  (0x00007fff04d4e000)
    libssl.so.1.0.0 => not found
    libcrypto.so.1.0.0 => not found
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ffc9b03b000)
    libc.so.6 => /lib64/libc.so.6 (0x00007ffc9aca7000)
    /lib64/ld-linux-x86-64.so.2 (0x00007ffc9b48c000)
```

はい、リンクされていません。
このままではmod_sslが動きません。

### opensslのライブラリパスを通す

```
$ export LD_LIBRARY_PATH=/opt/openssl/lib
```

または

```
$ sudo sh -c 'echo /opt/openssl/lib > /etc/ld.so.conf.d/openssl.conf'
$ sudo ldconfig
```

確認

```
$ ldd /opt/httpd/modules/mod_ssl.so
    linux-vdso.so.1 =>  (0x00007fff94dff000)
    libssl.so.1.0.0 => /opt/openssl/lib/libssl.so.1.0.0 (0x00007f830f748000)
    libcrypto.so.1.0.0 => /opt/openssl/lib/libcrypto.so.1.0.0 (0x00007f830f36a000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f830f14d000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f830edb9000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f830ebb5000)
    libz.so.1 => /lib64/libz.so.1 (0x00007f830e99e000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f830fbe5000)
```

できました！

これでApacheを起動すれば、自前ビルドしたopensslを使ってSSL通信ができるようになります。
Android WebView にJavascriptのイベントハンドラを追加する

ちょっと困ったのでメモ

androidのWebViewに読み込んだページにイベントハンドラをInjectして実行したい時があった。

`WebView#onPageFinished`でjavascriptを読み込んだところうまくいきました。


```java:android_Inject_keydown_event_handler_to_WebView_from_native_code
@InjectView(R.id.profile_registration_webView)
WebView mWebView;

mWebView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
　　　　　　　　　　　　　　　　　// url to filter target page
        if (url.startsWith("http://target/page/url")) { 
　　　　　　　　 　　　　　　　//something to do in javascript
            view.loadUrl("javascript:$('#target_element_id').keydown( function () {" +
                         "　　$('html, body').animate({ scrollTop: 10000}, 300);" +
　　　　　　　　　　　　　　　"} );");
        }
    }
});
```