OmniAICreator/Qiita-1.07M huggingface dataset:
aptコマンドでインストールしたMercurial-git(hg-git)を有効化する

自宅作業（という名の趣味）で2回も躓いたので書いておく。
「ドキュメントとログちゃんと見ろよ」という話なのだが。

# aptのログを見よう

インストールし終わった最後の方に以下のメッセージが出る。

> You can follow the instructions in /usr/share/doc/mercurial-git/README.Debian to enable it.

この通りなのである。
中身を見てみよう。

> hg-git for Debian
> -----------------

> To enable the extension, add the following lines to your hgrc::

>   [extensions]
>   hgext.bookmarks =
>   hgext.git =

> Hg-git uses bookmarks [1]_ (rather than branches) to track git branches.

> .. [1] http://mercurial.selenic.com/wiki/BookmarksExtension

つまりお手元のhgrcの[extensions]セクションに`hgext.git =`と入れるだけである。

# どうしてハマるの？

公式ページを見てみよう。
[Hg-Git Mercurial Plugin](https://hg-git.github.io/)

>  Lastly, make sure the following is in your ~/.hgrc:

> ```
> [extensions]
> hgext.bookmarks =
> hggit = 
> ```

easy_installで入れた場合には`hggit`なのかもしれないが、今回はdebパッケージで配布されている物を使ったので、そりゃあパッケージの付属ドキュメント通りにしないとね。

# 余談
他にもつまづきそうなポイントはこちらが思いつく。
[hg-git で github に push するときに忘れるな hg bookmark -f master - Qiita](http://qiita.com/apribase@github/items/1f1b1dbc6686fcb5402a)

ただし、複数人で作業しているときはmasterにいきなり上げたくは無いと思うので、その際はhg-gitを入れた後にgitのブランチの感覚でmaster以外のbookmarkをつけて、そのbookmarkを指定してpushすればいいのかな。*（要調査）*

```[bash]
# 予めhgrcの[path]セクションに「github」というアドレスを指定したと想定。

hg bookmark -r default fix_XYZ
hg push -B fix_XYZ github
```
技術英語 > I thought [I went far enough].

@ Code Complete (No. 4399 / 36077)

> I thought I <font color=red>went far enough</font>.

http://eigozuki.com/html/reibun/far-go-far.shtml
> Their preparation didn't go far enough.
彼らの準備は十分とはいえなかった。

go far enoughで「十分に準備した」ということらしい。

Code Completeの関連例文の前後まで載せると

> The biggest design errors arise from cases in which I thought I went far enough, but it later turns out that I didn't go far enough to realize there were additional design challenges.

意訳 「一番大きな設計エラーは次の場合に生じる。十分に準備したつもりが実際のところは準備不足で、追加のdesign challengesに気づかなかった場合」。
Realmのブラウザ兼エディタ作った

Realmを使っていて中を見たりいじったりしたいことが結構あるので、そういうの作りました。
[Pod](https://cocoapods.org/pods/DebugMenuRealmBrowser)
![スクリーンショット 2016-07-19 4.21.22.png](https://github.com/malt03/DebugMenuRealmBrowser/blob/master/Screenshot.gif?raw=true)

##使い方
[ここ](http://qiita.com/malt/items/9ca22e0df67e764427d6)で紹介している`DebugHead`の上で動かします。

###インストール
```ruby:Podfile
pod 'DebugHead'
pod 'DebugMenuRealmBrowser'
````

###初期化
```swift:AppDelegate.swift
import DebugHead
import DebugMenuRealmBrowser

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
  DebugMenuRealmBrowserViewController.prepare(moduleName: "<module name>")
  DebugHead.sharedInstance.prepare(menuClasses: [DebugMenuRealmBrowserViewController.self])
  return true
}
```

##DebugHead通したくない場合
###インストール
```ruby:Podfile
pod 'RealmBrowser'
````

###初期化
```swift:ViewController.swift
import RealmBrowser

presentViewController(RealmBrowser.instantiate(moduleName: "<module name>"), animated: true, completion: nil)
```
choose-pane つくった

単なる宣伝用のエントリです。

[choose-pane](https://atom.io/packages/choose-pane) をつくった。

![](https://raw.githubusercontent.com/t9md/t9md/5ca8d2ad710ce24e1ecbc3777b5bf03432dc3ef9/img/atom-choose-pane.gif)

以前 vim 用の [vim-choosewin](https://github.com/t9md/vim-choosewin) をつくったが、それの Atom 版。
実装は vim 版に比べて超楽。むしろ Vim 版は不可能をゴリゴリの力技でやりきっているから当然。

## モチベーション

広いディスプレイ買って、作業領域が広くなってきた。縦に３つのPaneを開くことも増えた。
左端から、右端のPaneまで移動するのを一発でやりたい。
ラベルをタイプして一発で選べるようにしたい！
できた。やった！
明示的に初期化しなくても自動的にデフォルト値が入るのはどんなときか

明示的に初期化をしなかった場合、勝手に初期値を入れてくれるのか、不定値が入ったままなのか、言語や宣言場所による違いのまとめ。

#Java#

##インスタンス変数##

インスタンス変数には自動でデフォルト値が入る。

```java
public class Sample{
    int x;    //インスタンス変数

    void show(){
        int tmp;    //ローカル変数
        System.out.println("x = " + x);
    }
}
```

| 変数の型                   | デフォルト値 |
|:--------------------------|-----------:|
| int , short , byte , long |          0 |
| float , double            |        0.0 |
| char                      |   '\u0000' |
| boolean                   |      false |
| オブジェクト参照            |       null |

配列の場合でも全ての要素にデフォルト値が入る。

##ローカル変数##

ローカル変数では自動的に初期化はされない。
自分で明示的に初期化しないとコンパイルエラーが出る。

しかし、ローカル変数であっても**配列だけは自動で初期化**される。

参考サイト
http://www.booran.com/menu/java/format.html

#C/C++#

##グローバル変数##

グローバル変数はデフォルト値で初期化される。

```cpp
#include <stdio.h>

int g_hoge;    //グローバル変数

int main(){
    int a;    //ローカル変数

    return 0;
}
```

| 変数の型            | デフォルト値 |
|:-------------------|-----------:|
| int , short , long |          0 |
| float , double     |        0.0 |
| char               |       '\0' |
| bool               |      false |
| オブジェクト参照     |       NULL |

配列の場合でも全ての要素にデフォルト値が入る。

##ローカル変数##

ローカル変数では自動的に初期化はされない。

Javaとは違い、ローカル変数の配列も初期化されない。

`static`が付いている変数の場合、ローカル変数であっても初期化される。

参考サイト
http://edu.clipper.co.jp/pg-2-33.html

クラスや構造体の変数については、宣言場所やインスタンスの作り方によって挙動が変わるのでよくわからない。

勝手に初期化してくれるとはいえ、他人が見るプログラムでは自分で明示的に初期化するようにした方がよさげ。
AGAL入門 #6 : if分岐の書き方と考察

AGAL1では条件でフロー分岐するプログラムは書けません。(AGAL2ではできます。）レジスタの値を比較して、０か1の値を得る事はできるので、そこをうまく利用して、if分岐したように動くコードを書く事になります。

#AGAL1のif分岐 具体例

例として、ft0レジスタとft1レジスタのx値が等しかった場合にft1.xにft0.yの値をコピー、等しく無い場合にft0.zの値をコピーするコードは下記のようになります。

```sample.agal
seq ft0.z ft0.x ft1.x // 等しければ ft0.z=1
sne ft0.w ft0.x ft1.x // 等しくなければft0.w=1
mul ft0.y ft0.y ft0.z // ft0.yの値がそのままキープされるかもしくは0に変化
mul ft0.z ft0.z ft0.w // ft0.zの値がそのままキープされるかもしくは0に変化
add ft1.x ft0.y ft0.z // ft0.yかft0.zどちらかの値をft1.xに代入
```

初見では頭がこんがらがりますね。他にも色々な書き方があると思いますが、どうであれ、その後演算したい値に比較結果のフラグを掛け合わせるとフラグが偽の場合0になって値が打ち消され、フラグが真の場合、×1となって値が変化しない事を利用します。
真偽両者の処理は片側が意味的に無意味だけれど、実行はされているのがポイントです。

この系統の命令は４つあります。
`sge` : `setIfGreaterEqual`の略、source1 >= source2 の場合1を返す、さもなくば０を返す 
`slt` : `setIfLessThan`の略、source1 < source2 の場合1を返す、さもなくば０を返す 
`seq` : `setIfEqual`の略、source1 == source2 の場合1を返す、さもなくば０を返す 
`sne` : `setIfNotEqual`の略、source1 != source2 の場合1を返す、さもなくば０を返す 

AGALのifで検索してみると、だいたい似たような例がヒットするのですが、実際にいくつかフィルタを作ってみて思ったのは、コード例ででてくるほど分岐後の処理が単純でない場合も多く、気をつけないと複雑怪奇なコードがすぐに出来上がる、という事です。かかった工数の半分ぐらいはif分岐処理のパズルを解いていたように思います。

#AGAL2のif分岐命令

`ife` : 等しい場合のifブロック開始 source1 == source2
`ine` : 等しくない場合のifブロック開始 source1 != source2
`ifg` : 値が等しいか大きい場合のifブロック開始 source1 >= source2
`ifl` : 値が小さい場合のifブロック開始 source1 < source2
`els` : elseブロック
`eif` : ifブロックの終わり

実際に分岐が書けるのと(AGAL1の場合、0を足すなど、無効な命令を実行しているだけで実際に分岐はしていない)、余計な掛け算も必要ないので、見通しのよいコードをクイックに記述する事ができそうです。

#まとめ
そもそもAGALはGLSLやUnityのシェーダなどと比べてそもそもの生産性が低いので、ifの分岐記述で苦労して工数を取られるような時間の浪費を避けたく思うわけで。
StarlingではAGAL2は利用されておらず、すべてAGAL1記述であるようですが、これはフレームワークという立ち位置上、なるべく多くの環境をサポートしたいという所からでしょう。積極的にAGAL2を使っても現状のスマホ大枠はカバーできるので、実質的に問題はないと思われます。

#おまけ
という事で、自分は次回のAGALコーディングからはAGAL2のif分岐命令を積極的に使っていこうと思います。
もともとは[pixelbender3D](http://blogs.adobe.com/pixel-bender/tag/pixelbender3d/)という Stage3D用の高級シェーダー言語が作られていたはずなのですが、開発途中でお亡くなりになってしまったようですね。そちらがあればif分岐など楽に記述できたのではないだろうかと思うのですが、現在ダウンロードはできないようです。（どこかで手に入らないものだろうか。）Stage3Dリリース当時はそこまで利用できるスキルをもったユーザも少なかったのではなかろうかとか思ったり。
世界でAGALと戯れてる人たちは、自前のユーティリティやサブツールなどを使って生産性を上げていたりするみたいですね。具体的には忘れましたが、過去にチラホラみました。自分もそのような便利クラスを用意してAGALコードを書き出してみています。
validates_xxx_ofとvalidatesとvalidates_withとvalidateの関係が分からかったので追ってみた

# 結論
何れもvalidateの呼び出しに還元され、set_callbackで登録される。

# 準備
```app/models/user.rb
class User < ActiveRecord::Base
  validates :name, my: {hoge: :fuga}, if: :name_present?

  private
    def name_present?
      true
    end
end
```
```app/validators/my_validator.rb
class MyValidator < ActiveModel::Validator
  def initialize(options)
    Rails.logger.debug 'in MyValidator#options'
    Rails.logger.debug options
  end

  def validate(user)
  end

  private
end
```

# 呼び出し関係

```/active_model/validations/validates.rb
module ActiveModel
  module Validations
    module ClassMethods
      ...
      def validates(*attributes)
      ...
        # validates_withが次の形で呼ばれる
        # シンボル :my から MyValidator クラスへ変換される事に注意
        # 
        #   validates_with(
        #     MyValidator,
        #     {:if=>:name_present?, :attributes=>[:name], :hoge=>:fuga}
        #   )
```

```active_model/validations/with.rb
module ActiveModel
  module Validations
    module ClassMethods
      ...
      def validates_with(*args, &block)
        ...
        # validateが次の形で呼ばれる
        # 
        #   validate(
        #     #<MyValidator:0x007fb1535f2c40>,
        #     {:if=>:name_present?, :hoge=>:fuga, :class=>User}
        #   )
        #   
        # MyValidatorはインスタンスで呼ばれる事に注意
        #   newの引数にオプションとブロックが渡される。バリデータのinitializeで利用できる
        #     klass.new(options, &block)
        # 
        # アトリビュート指定はどこへ行った？
        #  メソッドの途中で _validators[attribute.to_sym] << validator
```

```/active_model/validations.rb
module ActiveModel
  module Validations
    module ClassMethods
      ...
      def validate(*args, &block)
         ...
         # set_callbackが次の形で呼ばれる
         #
         #   set_callback(
         #    [
         #      #<MyValidator:0x007fb1535f2c40>, 
         #      {:if=>:name_present?, :attributes=>[:name], :hoge=>:fuga, :class=>User}
         #    ]
```

# 他
validates_xxx_of は 単にvalidates_withへのラッパー
クリックした任意の要素を取得したい。(クリックイベントは発火させない)

Webアプリのデバッグモードみたいな感じで、
HTML要素をクリックで選択したい。
でもその時、ページ遷移が発生したりボタンをおした時のイベントが発火してしまうのは困る。

##パターン1 全ての要素にイベント付与しておく
```js

//jqueryを使った例
var debugMode = true;

$('*').on('click',function(){
  if(debugMode){
    console.log(this);
    return false;
  }
});

//上でつけたイベントを先頭に持っていく
var handlers = $._data('*').events.click;
handlers.unshift(handlers.pop());
```

こんな感じで取れそう。
####良い点
- 実装楽

####困りそうな点
- 全要素につけるの無駄っぽい
- 動的生成した要素に対しても同じ処理をかけないといけない

困りそうな点特に後者が結構辛そう。なので別実装を考えてみる。

##パターン２最前面レイヤでイベントだけ拾う

```html
<div id='surface-panel'></div>
```

```css
#surface-panel {
  z-index: 99999;
  position:fixed;
  top:0;
  left:0;
  width:100%;
  height:100%;
  background-color: rgba(0,0,0,0.1);
  }
```

 #surface-panelが最前面にきてクリックイベントを拾うようにしておく。

```js
$('#surface-panel').on('click',function(e){
  $(this).hide()
  console.log document.elementFromPoint(e.clientX,e.clientY)
  $(this).show()
});
```

あとはdebugModeのon/offに合わせて#surface-panelの表示非表示を切り替えるだけ。

当然各要素に対してのhoverやらのイベントが発火しないのだけれど今回の利用想定としては問題なし。

![スクリーンショット 2016-07-19 1.56.07.png](https://qiita-image-store.s3.amazonaws.com/0/22392/0c053ab1-9d51-1e12-3977-363a4e08d356.png)



よさそう。
AndroidのアイコンをGimpで作る

# ドロイド君のアイコンも悪くはないけど、、、

- せっかく形になったアプリがあるので、アイコンを作ることにしました。
- さっき使ったプラグインのただの紹介メモ

## 環境構築


1. Gimpをインストール

    HPからドーン！
    [https://www.gimp.org/](https://www.gimp.org/)

1. プラグインを導入
    - 作成した画像をandroidのアイコンに合わせた大きさによしなにして頂くプラグインを使いました
        - ncornetteさんの"gimp-android-xdpi"です。
        - [https://github.com/ncornette/gimp-android-xdpi](https://github.com/ncornette/gimp-android-xdpi)
    - READMEにプラグインの置く場所が書いてありますが、GIMPさんから確認したほうが確実です。
        - 設定 -> フォルダー -> プラグイン　に、プラグインを置く場所が書いてあるので、そちらに置きます。
    - Gimpの再起動をお忘れなく


## 絵を描く

![スクリーンショット 2016-07-19 1.13.45.png](https://qiita-image-store.s3.amazonaws.com/0/55826/dcfafedb-f843-4f2d-5a65-4ed7a4499f19.png)

実際にお絵かきで使ったアプリはKeynote,,,,


## 出力

- フィルター -> android -> Write android ... で、アイコン画像の出力設定が行えます。
- 必要な大きさのものをYESで選んで、OK!

![スクリーンショット 2016-07-19 1.16.29.png](https://qiita-image-store.s3.amazonaws.com/0/55826/9937ddf3-047e-1b8f-1ce5-d99d4aadb3e7.png)



## やったー！

![Screenshot_20160719-013825.png](https://qiita-image-store.s3.amazonaws.com/0/55826/63e2e27c-4676-6ff2-a684-7122bfe02f4f.png)


スクショの画像でけぇ
iOS / AndroidにてVideo再生機能を使うと苦労する、という話

（以下、AIR SDK21での挙動の話です。）

StageVideoはStage3Dレイヤー(不透明です)の下に完全に隠れて見えないからとか使いにくいとかそういう話ではなく。( `Starling.current.stage3D.visible = false;` みたいな感じで一時的にstage3Dを非表示にはできます。)
どうもスマホ上での挙動がいろいろ不安定なのです。デスクトップでStageVideoがうまく動いたとてしても、基本的な挙動がiOS/Androidでかなり違います。

#隠れ不具合
不具合ではなく画面描画の仕組みによる仕様との事ですが、ここの[バグベース](https://bugbase.adobe.com/index.cfm?event=bug&id=3186454)にある、そして数年放置されているように再生終了後、Stage3D部分がどうやっても見えないままとなってしまう挙動が存在します。（リンク先には、NetStreamを破棄しない事で、Stage3D表示を継続させる事ができるというワークアラウンドについても記載されています。）

さらにおかしな挙動があって、ビデオを再生せずとも、関連したイベントのリスナ登録を行っただけで、内部処理的にはビデオを使った事になってしまうようです。つまりビデオがらみの不具合がビデオを再生する前に起こる事があります。自分の手元で動画周りをいじっていた際、おそらくこのあたりが関連して、スマホ実機で謎のランタイムエラーが起きてしまう事がありました。

#VideoTextureを使おう
StageVideoはStage3Dの中でも古めのテクノロジーで(一般のwebサイトのビデオプレイヤーでも使われていた模様)、Stage3D描画と同時に使えないという痛い制限があります。これを解決するためにVideo映像をテクスチャとして使える仕組みがiOS先行で作られ、最近やっとデスクトップ上やAndroidでも使えるようになったのです。AdobeとしてはStageVideoについてはもう使わないで、これからはVideoTextureを使ってね、というスタンスでいるように見えます。VideoTextureのデモは立方体の各面にビデオを貼り付けた派手目のものとなっていますが、そのデモのように個性的なビジュアル表現に挑む場合だけでなく、単にビデオ再生を行う際にもVideoTexture機能を使いましょうという事です。

#でも、やっぱり不安定
どうやらStageVideoで起きていた不安定な挙動はそのままVideoTextureでも起こりえるようです。特にAndroidでのVideoTexture機能はまだリリース後時間が経っていないので、より不安定に感じます。

なお、AIR SDK22ではAndroidのビデオコーデック周りに大幅な修正が入ったようです。いくつかの不具合が直っていたりするでしょうか。。
https://helpx.adobe.com/flash-player/release-note/fp_22_air_22_release_notes.html

#現状でのベスト対策や不具合のワークアラウンド

* StageVideoよりVideoTextureを使う。VideoTextureが使えない端末はサポートをあきらめる。
* 直接VideoTextureを扱わず、StarlingおよびFeathersUIのビデオ再生機能を使う。記述も楽になるし、細かい不具合や再生環境の差異をある程度吸収してくれるはず。
* FeathersUIのVideoPlayerはスキンなしで使えるのでデザイン素材は必要ない。積極的に使う。
* Video再生後Stage3Dが見えなくなったままになる不具合は、そのままスマホ＋ビデオテクスチャ利用時にも起こり得る。NetStreamを破棄しないことでこれを回避できる。
* FeathersUIのビデオ再生機能(=VideoPlayer)を使っている場合は直接NetStreamにアクセスできないので、VideoPlayer自体を破棄しないような方法をとる。
* iOSだとビデオ再生時の音量調整がActionScriptだけではできない(Androidは可能)。必要ならANEを使ってネイティブ制御する。
* Androidの特定機種でビデオ映像が縦に割れたように崩れることがあった。これはAIR SDKの修正対応待ちしかなさそう。(SDK22で直っているといいな。)
* ビデオ再生周りのイベントのタイミングや回数などiOS/Android/デスクトップで少しづつ異なるので、複雑な制御をする場合は動作チェックを入念にする。

および

* 一度ビデオ再生を終え、アプリの別シーンなどに行ってまたビデオ再生シーンに戻って来た２度目の再生時は、さらに挙動が不安定になっている、、、ような気がする。(NetStreamを破棄しないで保持しているのが原因かも？) 仕様として２度目の再生を避けられるなら避けた方がいい。

以上、こんな感じです。ビデオテクスチャがどの環境でも使えるようになったのは大変良いことですが、現状スマートフォンデバイスで扱う際はかなり苦戦しますので注意しましょう。
Linux上のNodeJSサーバをローカルからリモートデバッグする方法

Linux上のNodeJSサーバを実運用に使ってて
環境依存などあって、ローカルではなく
どうしてもサーバを直接デバッグしたいという場合に使える方法です。
(デバッガでブレークポイントかけると他の人のアクセスをブロックしちゃうのでチームで使う場合は注意です。)

説明のため、Mac OSXからAWS EC2上(Linux)のNodeJSサーバをデバッグすると仮定します。
ローカルからssh経由でリモート上にあるnode-inspectorデバッガー（サーバ）に
sshポートフォワーディングという方法でアクセスします。

参考：[sshポートフォワーディング](http://qiita.com/mechamogera/items/b1bb9130273deb9426f5)

サーバ上のdebug_webservice.shでnode-inspectorを起動し、
ローカルからsshポートフォワーディングでリモートサーバのnode-inspectorにアクセスします。
ついでにshellコマンドでChromeを開きます。
サーバ側にnode-inspectorのインストールとNodeJSは当然--debugモードで起動しておく必要があります。

ローカル側：
user、ip、keyは適宜書き換えてください

```debug.sh
#!/bin/sh

user="ec2-user"
# サーバIPアドレス
ip="(ipアドレス)"
# ec2のログインssh key(pem)、カレントディレクトリに存在する想定
key="amazonEC2.pem"
account="${user}@${ip}"

# カレントディレクトリに移動
cwd=`dirname "${0}"`
expr "${0}" : "/.*" > /dev/null || cwd=`(cd "${cwd}" && pwd)`
cd $cwd


command="cd ./shell;./debug_webservice.sh > /dev/null ; exit "


remote_command ()
{
expect -c "
# timeoutをセット
set timeout -1
# sshコマンド
spawn ssh -i $key $account
# 期待されるserverからの応答メッセージ(一部が一致すればOK)
expect \"\$\"
# 以下，ログイン後のお決まりコマンドを列記した例
send \"$command\n\"
# 最後にinteract
interact
"
}

remote_command 


local_command ()
{
kill `lsof -t -i:8080`
ssh -f -N -L 8080:127.0.0.1:8080 -i $key $account
open -a "/Applications/Google Chrome.app" http://127.0.0.1:8080/?ws=127.0.0.1:8080&port=5858
}

local_command
```

サーバ側：

```debug_webservice.sh
#!/bin/sh
T=$(pgrep -f node-inspector)
kill -9 $T
node-inspector &
```

使い方

```
$./debug.sh
```

自分の場合、コマンドたたくのもめんどくさいのでdebug.commandファイルにしちゃってます。
Homebrewでbrew updateに失敗する(解決済み)


nodebrewのインストールのために、
Homebrewをupdateしようとすると下記のエラーが出た。

## 問題
	% brew update

実行すると、エラーが出た。
update-report should not be called directly!

## 解決
brew updateの前に、brew upgradeを実行する。

	% brew upgrade	

この後に、brew updateする。

	% brew update

うまく動きました。
下記URLが参考になりました。

以前にも、同じようなことがあった気がする。。。

## 参考
http://stackoverflow.com/questions/38410020/homebrew-error-update-report-should-not-be-called-directly
UnityでVRを触ってみた 〜視点の検知編〜

## はじめに
VR作りたくて、Unityで試行錯誤して何とか動いたのでそのまとめ２です。
今回はオブジェクトに視点を合わせると色が変わるようにしてみます。

前回の記事
- [UnityでVRを触ってみた 〜導入編〜](http://qiita.com/yukatou/items/103e382484e5792988c2)

## 環境
- Mac OSX v10.11
- Google VR SDK v0.8
- Unity v5.3.5

## いざ開発！
[〜導入編〜](http://qiita.com/yukatou/items/103e382484e5792988c2)が終わっていることを前提に進めたいと思います。

### 1. 視点を表示する
前回にImportしたGoogle VR SDKの中にGvrReticleというPrefabがありますので、それをMain Cameraの中に置きます。

![GvrReticle.png](https://qiita-image-store.s3.amazonaws.com/0/13703/d8b906c4-d6be-ea5e-2ca8-2204d49560c4.png)

再生ボタンを押して白い点が表示されていればOKです。

![スクリーンショット 2016-07-18 23.02.46.png](https://qiita-image-store.s3.amazonaws.com/0/13703/bd2c9c4d-4669-7c81-9110-3ee11d86620f.png)

### 2. オブジェクトに視点が入ったことを検知する

検知させるために色々準備が必要ですので順を追って説明します。
まず、Main Camera に `Physics Raycaster` をAdd Componentします。

![PhysicsRaycaster.png](https://qiita-image-store.s3.amazonaws.com/0/13703/94302953-67bc-c97c-dbe2-0cfdec67b443.png)

次に、`EventSystem` をSceneに追加します。メニューの [GameObject] -> [UI] -> [EventSystem] で追加。そして、`EventSystem` に `Gaze Input Module` を追加します。
この時、優先度を上げるために１つ上にMove Upしておきます。

![GazeInputModule.png](https://qiita-image-store.s3.amazonaws.com/0/13703/d5c1e6f9-88f9-c3c0-9047-750085f17c37.png)

次に、視点が入ったことを検知したいオブジェクトに `Event Trigger` を追加します。ここでは赤いCubeに追加しました。

![EventTrigger.png](https://qiita-image-store.s3.amazonaws.com/0/13703/359bebe1-e06c-e606-01bd-007cfccf1389.png)

再生ボタンを押して実際に視点を赤いCubeに合わせると、視点のマークが反応することが分かるかと思います。


### 3. 視点を合わせると色を変える

最後に視点が合わせると色が変わる様にしたいので、赤いCubeに視点が合わさると緑色に変わるようにしたいと思います。
まず、Cube に New Script を Add Component します。
スクリプトの中身は以下のような感じです。

```csharp

using UnityEngine;
using System.Collections;

public class CubeScript : MonoBehaviour  {

	void Start () {
		SetGazedAt(false);
	}

	void Update () {

	}

	public void SetGazedAt(bool gazedAt) {
		GetComponent<Renderer>().material.color = gazedAt ? Color.green : Color.red;
	}

	public void OnGazeEnter() {
		Debug.Log ("OnGazeEnter");
		SetGazedAt(true);
	}

	public void OnGazeExit() {
		Debug.Log ("OnGazeExit");
		SetGazedAt(false);
	}

}
```

Cubeの `Event Trigger` の Add New Event Type を押して Pointer Enter と Pointer Exit を追加します。そして、各々のイベントを先ほどのスクリプトと関連付けを行います。

![eventtrigger2.png](https://qiita-image-store.s3.amazonaws.com/0/13703/5ccf7dc8-494c-2fa0-d347-e83c0d83c577.png)

完成です！
再生して確認してみると視点が合わさると色が変わっていることが分かります！

![スクリーンショット 2016-07-19 0.39.08.png](https://qiita-image-store.s3.amazonaws.com/0/13703/6a0df318-1b7a-2904-87c4-dff75767ed50.png)
ruby+rbenv+sinatraの環境構築

今回は rubyのフレームワークの一つであるsinatraの環境構築の手順について説明していきます。
[sinatara](http://www.sinatrarb.com/)とは、rubyで作成された軽量フレームワークです。
環境構築手順は以下の通りです。

# 事前準備

* rbenvとrubyのインストール
こちらの[ページ](http://qiita.com/ksugawara61/items/e3bb87d5e0dd49d20c8f)をもとに事前にrbenvとrubyをインストールしておきます。

* bundlerのインストール
自分の環境にbundlerが入っていない場合、以下のコマンドでbundlerをインストールしておきます。

```
$ gem install bundler
```

# 1. sinatraのファイルを作成

sinataraのファイルを以下の構成で作成していきます。

> /hello-world
　├ Gemfile
　├ config.ru
　├ my_app.rb


* Gemfileを作成

```rb:Gemfile
source "https://rubygems.org"
gem 'sinatra'
```

* config.ru

```rb:config.ru
require './my_app'
run MyApp
```

* my_app.rb

```rb:my_app.rb
require 'bundler'
require 'sinatra'
Bundler.require

class MyApp < Sinatra::Base
  get '/' do
    "Hello World!\n"
  end
end
```

# 2. Gemをインストール

ファイルを作成したら以下のコマンドで gemをインストールします。

```bash
$ bundle install --path=vendor/bundle
Fetching gem metadata from https://rubygems.org/
Fetching version metadata from https://rubygems.org/
Resolving dependencies...
Installing rack 1.6.4
Installing tilt 2.0.5
Using bundler 1.12.5
Installing rack-protection 1.5.3
Installing sinatra 1.4.7
Bundle complete! 1 Gemfile dependency, 5 gems now installed.
Bundled gems are installed into ./vendor/bundle.
```

# 3. WEBrickの起動
bundle exec rackupコマンドで[WEBrick](https://thinkit.co.jp/article/117/1)を起動させます。

```bash
$ bundle exec rackup -o 0.0.0.0 -p 8080
[2016-07-18 16:13:17] INFO  WEBrick 1.3.1
[2016-07-18 16:13:17] INFO  ruby 2.3.1 (2016-04-26) [x86_64-linux]
[2016-07-18 16:13:17] INFO  WEBrick::HTTPServer#start: pid=5106 port=8080
```

# 4. 動作確認

curlあるいブラウザで指定したURL：ポートを参照して、**Hello World!**が出力されていればsinatraの環境構築は完了です。

```bash
$ curl localhost:8080/
Hello World!
```

# 参考文献
1. Sinatra, http://www.sinatrarb.com/, Online; accessed 19-July-2016.
2. WEBrickを使ってみよう！ _ Think IT（シンクイット）, https://thinkit.co.jp/article/117/1, Online; accessed 19-July-2016.
オンメモリのファイルシステムJimfs

NIO2のFileSystemを使ってメモリ上にFileSystemを作るJimfsの紹介。
通常のファイルシステムとは別にファイルシステムを持てる。ただNIO2で全部処理しなくてはならないようで`Path#toFile`なんかを使うと例外を飛ばしてくる。一時ファイルを使ってごちゃごちゃやるような処理に使えば使用後にまとめてゴミ捨てできるので便利かなあとも思ったが使い勝手はどうなんだろう。

```java
package example.misc;

import com.google.common.jimfs.Configuration;
import com.google.common.jimfs.Jimfs;

import java.nio.charset.StandardCharsets;
import java.nio.file.FileSystem;
import java.nio.file.Files;
import java.nio.file.Path;

public class JimFsDemo {

    public static void main(final String[] args) throws Exception {
        try (final FileSystem fs = Jimfs.newFileSystem(Configuration.unix())) {
            final Path tmp = fs.getPath("/tmp");
            Files.createDirectories(tmp);
            final Path tmpFile = Files.createTempFile(tmp, "jimfs", "tmp");
            Files.write(tmpFile, "abcdef".getBytes(StandardCharsets.UTF_8));

            // System.out.println(tmpFile.toFile().getAbsolutePath()); // toFileで例外が出るのでダメ
            System.out.println(tmpFile.getParent().getFileName());
            System.out.println(tmpFile.getFileName());

            final byte[] read = Files.readAllBytes(tmpFile);
            System.out.println(new String(read, StandardCharsets.UTF_8));
        }
    }

}
```

* https://github.com/google/jimfs
WindowsでQuTiPを使う

## WindowsでQuTiPを使うためのTips

### [QuTiP](http://qutip.org/)とは

 - 量子状態をシミュレート、量子トモグラフィーなどに特化したpython用パッケージ
 - Python2.7+で動く。

qutip.orgより引用

>QuTiP is open-source software for simulating the dynamics of open quantum systems. The QuTiP library depends on the excellent Numpy, Scipy, and Cython numerical packages. In addition, graphical output is provided by Matplotlib. QuTiP aims to provide user-friendly and efficient numerical simulations of a wide variety of Hamiltonians, including those with arbitrary time-dependence, commonly found in a wide range of physics applications such as quantum optics, trapped ions, superconducting circuits, and quantum nanomechanical resonators. QuTiP is freely available for use and/or modification on all major platforms such as Linux, Mac OSX, and Windows*. Being free of any licensing fees, QuTiP is ideal for exploring quantum mechanics and dynamics in the classroom.

>QuTiPはオープン量子系のダイナミクスをシミュレートするためのオープンソースソフトウェアです。QuTiPライブラリーは、優れた数値計算ライブラリであるNumpy, Scipy, Cythonに依存しています。また、描画出力はMatplotlibにより提供されます。QuTiPは、量子光学、イオントラップ、超電導回路、量子名の共振器といった物理応用の広範囲によくみられる、任意の時間依存を含む多種多様なハミルトニアンを使いやすく効率的に数値シミュレーションを提供すること目的としている。QuTiPは、Linux、Mac OS X、Windows*など、すべての主要なプラットフォーム上での使用および/​​または変更に対して自由に利用可能です。任意のライセンス料を含まないQuTiPは、講義などにおいて量子力学とダイナミクスを探索するのに理想的です。

### Anacondaのインストール

 - python3を使おうとしたが、うまくいかないのでpython2を使う必要がある
 - 理由: condaでサポートしているQuTiPのバージョンはpython2のみ

### QuTiPのインストール

 - Anaconda Promptを開き以下のコマンドでQuTiPをインストールするための情報を得る


```bash
$ anaconda search -t conda qutip
$ conda install -c https://conda.anaconda.org/ajgpitch qutip
```

### mayaviのインストール

 - Bloch3d()を使うために必要

```bash
$ conda install -c https://conda.anaconda.org/menpo mayavi
```

### PyCharmのインストール

 - IPythonを使えば、プロンプト上で計算を行うことも可能だが、毎回関数を定義するのは面倒。
 - scriptを書いて実行するためのIDEとしてPyCharmがおすすめ。
 - 学生なら無料で使えるので、学生の方にもおすすめ。

### さいごに

 - サンプルコード

```py
from mayavi import mlab
import numpy as np
from qutip import *
import matplotlib.pyplot as plt

mlab.test_contour3d()
b = Bloch()
b3d = Bloch3d()
vec = [0, 1, 0]
pnt = [1/np.sqrt(3), 1/np.sqrt(3), 1/np.sqrt(3)]
up = basis(2, 0)
b.add_vectors(vec)
b.add_points(pnt)
b.add_states(up)
b.show()

# state generation
N = 20
rho_coherent = coherent_dm(N, np.sqrt(2))
rho_thermal = thermal_dm(N, 2)
rho_fock = fock_dm(N, 2)
xvec = np.linspace(-5,5,200)
W_coherent = wigner(rho_coherent, xvec, xvec)
W_thermal = wigner(rho_thermal, xvec, xvec)
W_fock = wigner(rho_fock, xvec, xvec)

# fig config
fig, axes = plt.subplots(1, 3, figsize=(12, 3))
cont0 = axes[0].contourf(xvec, xvec, W_coherent, 100)
lbl0 = axes[0].set_title("Coherent state")
cont1 = axes[1].contourf(xvec, xvec, W_thermal, 100)
lbl1 = axes[1].set_title("Thermal state")
cont2 = axes[2].contourf(xvec, xvec, W_fock, 100)
lbl2 = axes[2].set_title("Fock state")
plt.show()
```

無事プロットできました:sushi:
![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/51134/bd855049-cec6-da23-54d6-ffbcb134e4a7.png)
StoryboardやxibでUIViewの枠線・角丸設定をする（Objective-C）

## やること

UIViewの枠線・角丸設定ってよくあると思います。
いちいちコードで書くの面倒くさいですよね。
こちらをStoryboardやxibといったInterface Builder側で設定できるようにしたいと思います。

本記事はObjective-C版です。
Swift版は[こちら]です。

## 対応方針

UIViewのカテゴリを作成して、UIViewのサブクラスにおいてIB側での枠線・角丸設定を可能にします。

## サンプルコード

IB上で設定したいプロパティを記載していきます。
今回は枠線・角丸に関する下記プロパティを追加しました。

```objc:UIView+Border.h
#import <UIKit/UIKit.h>
 
@interface UIView (Border)
@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;
@end
```

```objc:UIView+Border.m
#import "UIView+Border.h"
  
@implementation UIView (Border)
  
// 枠線の色
- (UIColor *)borderColor
{
    return [UIColor colorWithCGColor:self.layer.borderColor];
}
- (void)setBorderColor:(UIColor *)borderColor
{
    self.layer.borderColor = borderColor.CGColor;
}
  
// 枠線のWidth
-(CGFloat)borderWidth
{
    return self.layer.borderWidth;
}
- (void)setBorderWidth:(CGFloat)borderWidth
{
    self.layer.borderWidth = borderWidth;
}
  
// 角丸設定
-(CGFloat)cornerRadius
{
    return self.layer.cornerRadius;
}
- (void)setCornerRadius:(CGFloat)cornerRadius
{
    self.layer.cornerRadius = cornerRadius;
    self.layer.masksToBounds = cornerRadius > 0;
}
  
@end
```

枠線の色については、CGColorですのでご注意ください。
IB側ではUIColorが設定されるため、setterでCGColorにしています。

あとは使いたいクラスでインポートするだけです。

## IBInspectable

上記コードのようにプロパティにIBInspectableを付与すると、
Xcodeのユーティリティーエリア(右ペイン)のAttributes Inspectorで上記プロパティが追加されます。

<img width="440" alt="View1.png" src="https://qiita-image-store.s3.amazonaws.com/0/102583/771d0914-ddb4-5b3b-52dc-93392becaa06.png">

あとはIB上で設定していくだけです。
枠線・角丸設定のコードはいらなくなりますし、その設定のためだけのIBOutletも不要になります。

<img width="440" alt="View2.png" src="https://qiita-image-store.s3.amazonaws.com/0/102583/423deb70-5fc7-0bf5-193b-72121a606c76.png">


## 最後に

これまでは上記設定をコードで行っていました。
でも、その設定のためだけにIBOutletでの紐付けをしたり、同じようなコードを何回も書くのは非効率的だと思うように。
どうにかならない？と同僚に相談したところ、本記事のようなことができることを教わりました。
それを実際に試してみたのがきっかけです。

UIViewを継承しているクラスであれば、部品を追加しただけで汎用的に使えるのがいいところだと思います。

本記事のSwift版は[こちら]です。

[こちら]:http://qiita.com/ktaguchi/items/c95821b6b1c53a79c5c2
Python3でFileMaker11ServerAdvancedへODBC接続

#環境
###サーバ
FileMaker 11 server Advanced
###クライアント
Visual Studio Community 2015　（Python toolsインストール済）
Anaconda 32bit(odbcドライバの関係で必ず32bitでなければならない。インストール時に工夫すれば32bitと64bitは併存出来る)
>https://www.continuum.io/downloads

>こちらの方を参考にしました。
>http://qiita.com/kyo-bad/items/75d88ce77660e3fa158c

#設定
##FileMakerServer
・FileMaker Serverはadvancedバージョンであること（通常版はODBC接続が出来ない）
・ODBCの設定や対象のファイルに共有設定等も行っているものとする

##Python3
・Anaconda 32bitを使用（FileMaker11ではODBCドライバが32bitしかなかったので)

・もしAnacondaの64bitがメインとしてインストールされている場合、
　　ツール(T) -> オプション(O)...
　　Python Tools->Environment Options
　で新しく32bitの設定を作って、
　　プロジェクト(P) -> (プロジェクト名)のプロパティ(E)...
　　General -> Interpreter:
　を作った設定にする。

##ODBC
・FileMakerに同封のODBCインストーラでインストール
>http://filemaker-jp.custhelp.com/app/answers/detail/a_id/9170/~/filemaker-11-での-odbc-および-jdbc-クライアントドライバのインストール

・DSNを設定する場合は、64bitではなく32bitで設定すること「C:\Windows\SysWOW64\odbcad32.exe」で設定が可能。（必ずしも必要な作業ではない）
>http://filemaker-jp.custhelp.com/app/answers/detail/a_id/9974/~/64-ビット版-windows-環境での-odbc-接続について

#コード
##成功
事前準備としてpypyodbcをインストールしておくこと。

```bat:コマンドプロンプト
%windir%\system32\cmd.exe "/K" "C:\Anacondaインストール先\Scripts\activate.bat" "C:\Anacondaインストール先"
pip install pypyodbc
```

```py3:Python3
#!/usr/bin/env python
# -*- coding: utf-8 -*-
###coding: utf-8 の部分は、書類のコーディングに依存する
###ファイル(F)->保存オプションの詳細設定(V)...
###で書類のコーディングが変更可能
###この場合「Unicode(UTF-8シグネチャなし)-コードページ65001」
###SHIFT-JISの場合はcp932
import pypyodbc

def pypy():
    cnn = pypyodbc.connect('DRIVER={FileMaker ODBC};SERVER=192.168.XXX.XXX:2399;UID=USER_NAME;PWD=PASSWORD;DATABASE=ファイルメーカー.fp7')
    cur = cnn.cursor()
    #日本語フィールドの場合、かならずダブルクォーテーションで囲む必要があります。
    cur.execute("SELECT \"ID\",\"名前\" from \"テーブル名\" WHERE \"ID\" = 番号")
    rows = cur.fetchall()
    for row in rows:
        print(row[1])
    cur.close()
    cnn.close()

if __name__ == "__main__":
    pypy()
```

・文字コードはutf-8でもcp932でも良いが、# -*- coding: utf-8 -*-の部分を合わせること。

##失敗
もしかしたら、自分の設定が間違っていただけなのかもしれないが、下記設定ではプログラムが通らなかった。特に日本語が絡むと通りにくくなる。
###pyodbc
```py3:Python3
import pyodbc
```
pyodbc.connect(接続)で、接続は出来たが、
cursor.execute(クエリ)で日本語フィールドが含まれる場合、どうしても
'utf-8' codec can't decode byte 0x8e in position 0: invalid start byte
といったエラーが発生して取得ができなかった（.encode('utf-8')等でエンコード、デコードしたり、書類のコーディングを変えても同じ）
###ADO
```py3:Python
import win32com.client
#DBConnection=win32com.client.Dispatch('ADODB.Connection')        
#DBConnection.Open(ConnectionString) 
```
コードは通るが、XXX.Fields.Item(i).Valueで文字列の値が全く拾えない

###PyFileMaker
Python3未対応
vimのチートシート（自分用）

とりあえず自分がよく使うやつをまとめておきます。
なんか追加で知っとくと良いコマンドがあれば教えてください。

# 基本移動

|キー|動作|
|:---|:---|
|hjkl|←↓↑→|

# よく使うカーソル移動

|キー|動作|
|:---|:---|
|0   |行の先頭|
|$   |行の末尾|
|^   |行の最初の文字|
|gg  |文書の先頭行|
|G   |文書の最終行|
|%   |括弧間の移動|
|w   |単語の先頭へ進む|
|e   |単語の末尾へ進む|
|b   |単語の先頭へ戻る|

# insertモード

|キー |動作 |
|:----|:----|
|i    |カーソル位置で開始|
|I    |行の先頭で開始|
|a    |カーソル位置の直後で開始|
|A    |行の末尾で開始|
|o    |現在の行の下に空白行を追加して開始|
|O    |現在の行の上に空白行を追加して開始|
|ea   |単語の末尾で開始|
|cc   |現在の行を削除して開始|
|cw   |カーソル位置の単語を削除して開始|
|c$   |カーソル位置から行末までを削除して開始|
|s    |カーソル位置の文字を削除して開始|
|ESC  |終了|
|C-[  |終了|
|C-c  |終了|

# 編集

|キー|動作|
|:---|:---|
|u   |元に戻す|
|C-r|やり直し|
|.    |最後に行ったコマンドを行う|

# おまけ

## ヤンクした内容が消えないようにする
ヤンクした後に `d`や`x`するとヤンクした内容が直前で消した内容で上書きされます。
そこで`"0p`とするとヤンクした内容が復活する。

## 間違えて`C-s`を押したら動かなくなった
`C-q`で解除

# 小言
今後もぼちぼち追加していきます
【Mac】vagrant upでエラー

```vagrant up``` ですげーつまずいた。
[こちら](http://qiita.com/tatataiki/items/5f630550013eaf209ee4)はWindows版ですが、自分はMac版ということで。

20160719: 追記あり

# 発生事象
* 開発環境構築のためvirtual box(5.1.0)とvagrant(1.8.4)を導入
* ```box add```, ```vagrant init```も実行
* ```vagrant up``` を実行
* エラーは以下のとおり  

> No usable default provider could be found for your system.
>
> Vagrant relies on interactions with 3rd party systems, known as
> "providers", to provide Vagrant with resources to run development
> environments. Examples are VirtualBox, VMware, Hyper-V.
> 
> The easiest solution to this message is to install VirtualBox, which
> is available for free on all major platforms.
> 
> If you believe you already have a provider available, make sure it
> is properly installed and configured. You can see more details about
> why a particular provider isn't working by forcing usage with
> `vagrant up --provider=PROVIDER`, which should give you a more specific
> error message for that particular provider.

# 原因
* ~~不明~~
* エラーメッセージ中で推奨されてるように、プロバイダを陽に指定した場合は、同じエラーメッセージがでる
* はじめ、Home brew でインストールしてたので、パスとかおかしいんじゃないかと思い（そんなことはないなと思いながらも）、手動でDL&インストールしても結果は変わらず
* virtualboxのバージョンが新しすぎて、vagrantが対応していなかった(追記)


# 対応
* 上記Windows版と同じく、virtualboxのバージョンを5.0.24にしたら解消。

# 所感
* vagrantがproviderをどのように見つけているのか、ちゃんと調べてないけど、この２つ依存関係あってアレだなと思いました。
* 多分、vagrantのほうがvirtualboxよりもバージョン新しくないといけない気がする
* 問題の切り分けがうまくいかなくてだいぶ時間を無駄にしてしまった。。。(もっかい環境綺麗にするためにOSの再インストールからやり直した）

# おまけ
上記対応を終えて、無事に上がったぞーと思ったら今度はmountエラーでコケた。。。こっちはすぐに治せたからいいけど、散々な一日であった
console.logの本気

# 自己紹介

じゅんじゅんというニックネームで、関西を拠点に活動しているフロントエンドエンジニアです。

HAL大阪の新2回生です👍 (2016.7.18現在)

よくstart up系イベントに行くので、大阪らへんの方は会いましょう！

Twitter [@konojunya](http://twitter.com/konojunya)

では、早速。

# console.log知ってる？

はい。ふざけるんじゃねぇと。

よく使いますよと言いたげなそこのフロントエンドエンジニア。

え、サーバーも使いますよと言いたげなバックエンドエンジニア。

しかし、今回は前者、フロントエンドの方向けな記事である。


`console.log`言わずとしれた、魔法の呪文。

この魔法の呪文を使うときは、そう変数の値確認や動作のチェック、デバッグに使ったりしますね。

一応使い方。

```js
console.log("Hello world");
```

まぁわかりますよ。やったことない人はいますぐこのブラウザの開発者ツールを開いてコピペ&エンター！

そして、事件は起こりました。

# ある日のこと

僕は、ある日お腹を空かせていてcookpadさんを眺めていました。

「あぁ〜うまそう〜〜」

美味しそうなレシピを眺めている時、僕は癖のように開発者ツールを開いていました。（嘘）

するとこれ。

![スクリーンショット 2016-07-18 22.45.38.png](https://qiita-image-store.s3.amazonaws.com/0/90347/1f865e79-e97b-e036-ba90-b6c60b0e9b65.png)


__いやまじで？__


consoleにcssらしきものをつけられるの！？


はい。つけれます。


# console.logにスタイルを適用する

スタイルを適用するのはとても簡単です。

例えば、hello worldを赤文字で出力したいとします。

普段のコードなら

```js
console.log("Hello world");
```

ですが、赤文字にするには

```js
console.log("%cHello world","color:red;");
```

%cを文字列中に入れて、第二引数にcssを指定すればいいだけです！

はい簡単！

他にも`font-size`などで大きくしていたり、`background-color`も使えるようです。

これからはコンソールも装飾する時代！使いこなしましょう！
OSv と Seastar

[OSv](http://osv.io/) は仮想環境専用のゲスト OS で

1. 物理デバイス用のデバイスドライバーが無く
2. Java と POSIX アプリに必要な部分のみで構成されており
3. カーネルとユーザープロセスが分離されてなく
4. 1 個のアプリしか動かせない
5. FreeBSD ベースで
6. AWS とか GCE でも使える

有望な技術だけど最近[リリースが減ってきてる](https://github.com/cloudius-systems/osv/releases)と思ったら
1. 以前はフルタイム開発者が 6 人以上居たけど
2. 2016-04 時点で Seastar の方に[集中しているらしい](https://groups.google.com/forum/#!topic/osv-dev/TgNCBegunPA)
3. ただ OSv も維持していくとのこと

[Seastar](http://www.seastar-project.org/) は
1. Linux と OSv で動作する C++ ネットワークスタック
2. NIC を制御して高速なパケット処理を実現する [DPDK](http://dpdk.org/) を使える
3. [4 コア (Xeon 2.30GHz) で秒間130万 HTTP リクエスト、32コアで686万リクエスト](https://github.com/scylladb/seastar/wiki/HTTPD-benchmark)
4. Netty みたいに [Future](https://en.wikipedia.org/wiki/Futures_and_promises) を使ってプログラミングするらしい
5. 最近の話題「[なんで僕らは Linux の TCP スタックを使ってるんだっけ?](https://news.ycombinator.com/item?id=12021195)」で言及されてた（[CloudFlare の関連記事](https://blog.cloudflare.com/why-we-use-the-linux-kernels-tcp-stack/)）

OSv はカーネルスペースで、Seastar はユーザースペースで全ての処理を行うことにより、データコピーを回避している、って感じかな。
rbenvを用いたruby環境構築手順（CentOS7.1）

今回はrbenvを利用してCentOS7上にrubyの環境を構築する手順をまとめていきます。

# 環境

|OS/ミドルウェア|バージョン|
|:------------|:-------|
|CentOS|7.1|
|rbenv|1.0.0|
|ruby|2.3.1|

# 1. rbenvとは

rbenvとは、rubyのバージョンを簡単に変更できるコマンドです。
これを利用することによって、プロジェクトごとにrubyのバージョンが異なる場合でも簡単にバージョンを切り替えて開発作業を行うことができます。
rbenvの詳細については、このあたりの[ページ](http://qiita.com/yunzeroin/items/33a51c805e60ed5eca0e)に書いていました。

# 2. 必要なパッケージのインストール
まず、rbenvを利用するために必要なパッケージを以下のコマンドでインストールしていきます。

```bash
$ sudo yum install -y git gcc gcc-c++ openssl-devel readline-devel
```

# 3. rbenvのインストール
続いてホームディレクトリ配下にrbenvのリポジトリをクローンして、rbenvを利用できるようにしていきます。

* rbenvリポジトリのクローン

```bash
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

* bash_profileにrbenvのパスを追加

```bash
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile  # 設定内容を反映させるため.bash_profileを再読み込み
```

* rbenvのバージョンを確認

```bash
$ rbenv --version
rbenv 1.0.0-21-g9fdce5d
```

# 4. rubyのインストール
次にインストールしたrbenvを用いて、rubyのインストールを行っていきます。

* ruby-buildプラグインの追加<br>
rbenvコマンドを使って、rubyをインストールできるようにruby-buildプラグインを追加します。

```bash
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

* インストール可能なrubyのバージョンを確認し、rubyをインストール<br>
※ 今回は**ruby2.3.1**をインストールします。

```bash
$ rbenv install -l  # インストール可能なrubyを確認
$ rbenv install 2.3.1  # ruby 2.3.1をインストール
$ rbenv versions  # インストールされたか確認
  2.3.1
$ rbenv global 2.3.1  # 環境全体でのrubyバージョン指定
$ # プロジェクト単位でrubyのバージョンを指定したい場合は、 rbenv local を利用します。
$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]
```

* **rbenv rehash**でgemコマンドなどを利用できるようにします<br>
※ rbenv rehashの処理内容については、このあたりの[ページ](http://dqn.sakusakutto.jp/2014/02/rbenv_rehash_what_it_does.html)に載っていました。

```bash
$ rbenv rehash
```

以上でrbenvを用いたrubyの環境構築の作業は終了です。

# 参考文献
1. rbenvとは？（rbenvを利用したRubyのインストール） - Qiita, http://qiita.com/yunzeroin/items/33a51c805e60ed5eca0e, Online; accessed 18-July-2016.
2. CentOSにrbenvをインストールする方法 - TASK NOTES, http://www.task-notes.com/entry/20150624/1435114800, Online; accessed 18-July-2016.
3. rbenv を使って ruby をインストールする(CentOS編) - Qiita, http://qiita.com/inouet/items/478f4228dbbcd442bfe8, Online; accessed 18-July-2016.
4. ruby-build _ rbenv日本語リファレンス _ Ruby STUDIO, http://ruby.studio-kingdom.com/rbenv/ruby_build/, Online; accessed 18-July-2016.
5. rbenv rehashは何をやっているのか？ · DQNEO起業日記, http://dqn.sakusakutto.jp/2014/02/rbenv_rehash_what_it_does.html, Online; accessed 18-July-2016.
Xcodeの開発環境のエディタ設定

XcodeをつかってiOSアプリを開発する前に、エディタの設定を行う。

#Xcodeの便利な設定
Xcodeを起動して、メニューバーから[Xcode]→[Preferences]を開いて、エディタの設定を行う。

##[Fonts & Colors]タブ
![スクリーンショット 2016-07-18 22.47.39.png](https://qiita-image-store.s3.amazonaws.com/0/95377/60ed16ca-fd39-4b0b-3a70-60d919159627.png)
エディタのフォントやフォントの色、サイズを変更できる。
テンプレートが用意されているので、それを使ったりカスタマイズをして設定する。

##[Text Editing]タブ
エディタの設定をするタブ。行番号やガイドを細かく設定できる。
![スクリーンショット 2016-07-18 23.03.25.png](https://qiita-image-store.s3.amazonaws.com/0/95377/1ea2d196-86cf-dd0b-a4b9-7377050d8640.png)

①Line numbers
チェックを入れると、行番号が表示されるようになる。
デフォルトでは「OFF」になっているので、「ON」がおすすめ

②Code folding ribbon
クラスやメソッドなどのまとまりをエディタの左側に黒と白のリボンの濃淡で表現してくれるようになる。

③Focus code blocks on hover
マウスを乗せた時に、ifやforなどまとまりを強調して表示する

④Page guide at column
コーディング規約で1行何文字までなどのルールがある場合に役立つ。
指定した文字数目で色がかわるガイドが表示されるようになる。

⑤Suggest completions while typing
コード入力時にコード補完をしてくれるようになる。
Pythonのunicodedataライブラリを使って、全角文字も半角文字も揃えて表示する



# 目的
pythonで、ちょっと文字列を揃えて表示しようとした時
全角と半角をごちゃ混ぜにすると・・・

``` 
# サンプル
print("%-10s : %s" % ("タコライス", "おいしい"))
print("%-10s : %s" % ("Curry", "Spicy!"))
print("%-10s : %s" % ("ﾀｺﾜｻ将軍", "食べられない・・・"))

# 結果
タコライス      : おいしい
Curry      : Spicy!
ﾀｺﾜｻ将軍     : 食べられない・・・
```

10文字ごとに「：」で分けたいのに、こんな感じでうまく揃わないことがある。
unicodedataライブラリを使うと、この辺りをサクッと解決できた。

unicodedata参考リンク
<http://docs.python.jp/3.5/library/unicodedata.html>


# 環境
python のバージョンは 3.5.1
OS は CentOS 7.1

試した時期は 2016年の7月


# 全角半角を判定する
unicodedata.east_asian_width 関数を使うと、east asian width の値を返してくれるので、文字が半角なのか全角なのかを調べることができる。
east asian width は「F, H, W, Na, A, N」の6種類が定められていて、
F, W, A の3つが全角文字とされている。

east asian width参考リンク
<https://ja.wikipedia.org/wiki/%E6%9D%B1%E3%82%A2%E3%82%B8%E3%82%A2%E3%81%AE%E6%96%87%E5%AD%97%E5%B9%85>

使ってみると、こんな感じだ。

``` 
# サンプル
import unicodedata
unicodedata.east_asian_width('a')
unicodedata.east_asian_width('あ')

# 結果
'Na'
'W'
```


# 全角半角どちらも整列できるようにする
上記の関数を利用して、「指定した文字列が半角何文字分なのか」を調べれば、
全角/半角のどちらでも文字列を整列させることができる。

左寄せ用の、こんな関数を作ってみた。

``` 
import unicodedata
def left(digit, msg):
    for c in msg:
        if unicodedata.east_asian_width(c) in ('F', 'W', 'A'):
            digit -= 2
        else:
            digit -= 1
    return　msg + ' '*digit
```

使ってみる。

``` 
# サンプル
print("%s : %s" % (left(10, "タコライス"), "おいしい"))
print("%s : %s" % (left(10, "Curry"), "Spicy!"))
print("%s : %s" % (left(10, "ﾀｺﾜｻ将軍"), "食べられない・・・"))

# 結果
タコライス : おいしい
Curry      : Spicy!
ﾀｺﾜｻ将軍   : 食べられない・・・
```

・・・・。
web上だとわかりづらいね、画像も載せておきます。
![20160718_qiita用.png](https://qiita-image-store.s3.amazonaws.com/0/118101/989d491e-97fb-3f1c-ac17-d91678b66586.png "20160718_qiita用.png")


これで、全角文字も半角文字も揃えて表示することができるようになった。


・・・右寄せするには、
「return　msg + ' '*digit」を「return　' '*digit + msg」
に変えれば対応できる。



以上
MYSQLでのいろいろなこと


MYSQLを利用していて主に文字コードの問題が出ることがあって、それを解決、もしくは文字化けなどが起きなようにするためのメモ。

# サーバの文字コード設定を見る
サーバの文字コードの状態を見るには以下のコマンドを実行する。

```
show variables like "chara%";
```

何も設定していないと以下のような状態みたい。

```
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
```

これで、`character_set_database`と`character_set_server`がともにlatin1になっている。このため日本語などを使うと文字化けを起こす。

# サーバでの設定
my.cnfで設定する。

``` my.cnf
[mysqld_safe]
default-character-set = utf8
　　:
[mysqld]
　　:
character-set-server = utf8
```

これでサーバを再起動する。

ただ、`[mysqld]`に `default-character-set = utf8` を設定するとサーバが起動したない。

# DATABASEやTABLEの文字コードを変更する場合。

サーバ設定を変更する前にDATABASEやTABLEを作成すると文字コード設定がlatin1のままだったりする。`drop`して設定し直すということもできるが、DATABASEやTABLEだけ変更することができる。

DATABASEを変更する場合は以下のようにする。

```DATABASE
alter database sampledb character set utf8;
```

TABLEの文字コードを変更する場合は以下のようにする。

```alter
alter table character set utf8;
```

DATABASEやTABLEの文字コードを確認するには以下のコマンドを実行する。

```DATABASE
show create database sampledb;
```

```TABLE
show create table sampletable;
```

# OpenOffice/LibreOfficeと接続する場合

Connecterを利用すれば良いのだけれど、文字コードはやはり注意する必要があるようだ。特にWindowsでOpenOfficeを使用した場合utf8ではうまくいかなかった。正確にはサーバ側はutf8で統一して問題はないのだけれと、Windows側でutf8をセットしても表示はできても、入力時に文字化けを起こしたりした。解決方法は以下の通り。


 ODBC設定側のConnecterタブにあるCharacter setにcp932をセット。ついで、OpenOffice側のデータベースプロパティで文字コードにShift-JISをセットする。以上で回避できた。
これをどちらにもutf8をセットしてもうまく動作はしてくれなかった。
Automatorで（Finder含む）ホットキーを登録する(for Mac)

#経緯
以下理由から、作成

- 開発時、ブラウザとターミナルとエディタの切替に「cmd + tab」が煩わしく感じたので
- Automatorですぐにできそうだと思ったので

### 蛇足
作成してから知ったが、macのホットキーの登録アプリとして「Snap」「CLCL」というのがあるらしい。
それを利用した方がよかったかもしれないと思いつつ手順を記載

#参考サイト

[[Mac] 特定のアプリケーションをショートカット一発でアクティブにする方法](http://blog.odoruinu.net/2015/03/26/mac-how-to-launch-app-with-shortcut-key/)

#Finder以外のホットキー登録

1. Automatorを起動（※起動にはSpotlightを利用)
- 新規作成で「サービス」を選択
- 「ユーティリティ」 > 「アプリケーションの起動」を選択し、となりの領域にドラッグ&ドロップ
- ドラッグ＆ドロップした領域の上部にある「"サービス"は、次の選択項目を受け取る：」を「入力なし」に変更
- ドラッグ＆ドロップした項目から起動するアプリケーションを選択し、保存
- システム環境設定画面を開き、「キーボード」 > 「ショートカット」 > 「サービス」を選択
- Automatorで保存したサービスを選択し、適当にキーの割当

#Finderのホットキー登録
Automatorにある「アプリケーションの起動」はFinderが選択できなかった。
なので、AppleScriptでFinder起動アプリを作成してから登録

1. Script Editorを起動（※起動にはSpotlightを利用)
- 以下コードを記載  
```activate of application "Finder"```
- ファイルフォーマットにて、「アプリケーション」を選択して保存
- 保存したファイルを/Applications配下に移動
- 上記 「Finder以外のホットキー登録」と同様の手順を実施


#補足
#### Automatorの項目に「AppleScriptを実行」はあるけども、、、
Automatorの項目に「AppleScriptを実行」という項目はあるけどもそれを利用した場合、動作が遅い
AppleScriptをコンパイルせずに実行していることが原因みたい。実際にスクリプトを上記みたくコンパイル済みにした形で登録した方が0.07秒程速かった

#### キー割当
以下を考慮して、「cmd + F9 ~ F12」で起動したいアプリを割当

- 他アプリとの競合の可能性が少なさそうなこと
- cmdキーを修飾キーとして使用すること<br>※各アプリ共通のショートカットキーは基本的にcmdキーを使用
- 片手で押せること

即起動が欲しいのは2,3つなので、現状はこれで十分。他に欲しくなったら、押すのに両手が必要になるが他修飾キー「Shift」「Option」を使用する予定
Macでansible-playbookを実行する時に~/.ssh/configの設定が参照されずUNREACHABLEとなる場合の対処法

MacでAnsibleを使うときに
```
$ ansible-playbook -i development site.yml --ask-pass
```
のようにパスワード認証のssh接続でplaybookを実行しようとすると、```~/.ssh/config```に設定を書いているホストへの接続が上手く行かず、以下のようなエラーが出たので対策を調べました。

```
fatal: [dev-test-server]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh.", "unreachable": true}
```

#### 環境
ansible: 2.2.0
OS:      OSX Yosemite

設定ファイル例

```yml:playbook実行ディレクトリ/development
[test-server]
dev-test-server

[development:children]
test-server

```

```~/.ssh/config
Host dev-test-server
  HostName xxx.xxx.xxx.xxx
  Port 22
  User root

```


#### 対処法
Macでは```openssh```を使ってssh接続することになるので、```-c ssh```オプションを使って接続するようです。さらに、パスワードを使う場合は```sshpass```を入れておく必要があるようです。
ただ、```brew install sshpass```でインストールしようとすると、セキュリティの問題でやめとけと言われるので、以下のコマンドでインストールします。

```
brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb
```

上記コマンドで```sshpass```が入ったら、以下のようにplaybookを実行します。　

```
$ ansible-playbook -i development site.yml -c ssh --ask-pass
```

これで```~/.ssh/config```の設定を反映してパスワード認証でplaybookが実行できました！
RSQLiteを使ってRとSQLiteの連携

Rはすでにインストールされているものとします。

##インストール
まずは[**RSQLite**](https://cran.r-project.org/web/packages/RSQLite/index.html)パッケージをインストールします。

```r
install.packages("RSQLite")
```

この時、依存パッケージである[**DBI** (R Database Interface)](https://cran.r-project.org/web/packages/DBI/index.html)も同時にインストールされます。

##接続・接続解除
DBIパッケージに含まれる**dbConnect**を使ってデータベースに接続します。SQLiteの場合はデータベースは単一のファイルですので、第２引数でそのファイルのパス(ここではDATA_PATHとする)を指定します。データベースへの接続を解除する時は**dbDisconnect**を使います。

```r
con <- dbConnect(RSQLite::SQLite(), "DATA_PATH")

dbDisconnect(con)
```

##SQL文の実行
SQL文を実行するには**dbGetQuery**を使います。SELECT文を実行する際はその結果をRのデータフレームとして受け取ります。例えば「顧客リスト」テーブルにSELECT文を実行してその結果を変数dataで受け取るには次のようにします。

```r
data <- dbGetQuery(con, "SELECT * FROM 顧客リスト")
```
zeppelinでjdbc経由でmysql(infinidb)に接続する。


jdbc interpreterで
下記を設定

```
mysql.driver 	com.mysql.jdbc.Driver
mysql.password 	なんかぱすわーど
mysql.url 	jdbc:mysql://[ほすと]:3307
mysql.user 	なんかゆーざ名
```

dependencies, artifactで

- mysql:mysql-connector-java:5.1.38 

を設定

zeppelinで使うときは

```
%jdbc(mysql) 

select
 dt,
 sum(measure)
from fact_table
group by dt
order by dt
```

みたいな感じで、

jdbc(prefix)なので、
hiveとかを使うときは、

%jdbc(hive)みたいな
Cloud9でFuelPHP1.8の環境を5分でつくる

### 最初 ###
* Workspace name : お好みで
* Template : PHP,Apache&...

### 余計なファイルの削除 ###

```bash
$ cd ~/workspace
$ rm README.md hello-world.php
```

### oilコマンドのインストール ###
これぞFuelPHPの醍醐味。後から役に立つ（多分）。

```bash
#/usr/local/bin/oilがインストールされる
$ curl https://get.fuelphp.com/oil | sh
```


### プロジェクトディレクトリの作成 ###
ディレクトリ名はお好みで。

```bash
$ cd ~/workspace
$ mkdir project_a
```

### プロジェクトproject_aに対するFuelPHP1.8のインストール ###
```bash
$ sudo composer self-update

# プロジェクトディレクトリの指定が必要
$ composer create-project fuel/fuel:dev-1.8/master --prefer-dist project_a
```

### ApacheのDocumentRoot設定変更 ###
安全のために、publicディレクトリをDocumentRootにする。

```bash
$ cd /etc/apache2/sites-enabled
$ sudo vi 001-cloud9.conf

#    DocumentRoot /home/ubuntu/workspace
     DocumentRoot /home/ubuntu/workspace/project_a/public

$ sudo service apache2 restart
```

### MySQLデータベースの作成 ###

```bash
$ mysql -u root
mysql> create database project_a
```

以上
WP-CLIを使ってWordPressサイトをリストアする

# はじめに
 - ローカル環境で行ったWordPressのカスタマイズ作業を、そのまま別環境へ移動させたい人に役に立つかも。
 - あと、WordPressサイトをどうやってソース管理しているか、の一例になれば。

# 環境
 - Vagrant環境で開発　→　検証環境へ適用　のサイクルで開発していました。
 - git管理にWordPressサイトのDBdumpを含めています。 

# WP-CLIの用意
ここから[wp-cli](https://wp-cli.org/)をダウンロードしておきます。
ダウンロードしたら、プロジェクト直下にwp-cli.pharのままgit管理に含めてしまいます。
wp-cli.pharはphpコマンドで実行するので、リストアしたい環境でphpコマンドが使えるかチェックしておいてください。

# envファイルの用意
git管理外のファイルとして、検証環境のプロジェクト直下に「env」という名前でファイルを1つ用意しました。
これには下記のように「検証環境のサイトURL」と「Dumpファイル内に記録されているURL」情報を記載しておきます。

```bash:env
export SITE_URL="http://example.com"
export DB_SITE_URL="http://192.168.33.10"
```

# シェルスクリプトの用意
　DBダンプからリストアする手順は毎回一緒なのでスクリプト化しておきます。
今回は wp-setup.sh という名前で作りました。
この中で先ほど用意した envファイル と wp-cli.phar を使います。

```bash:wp-setup.sh
#!/bin/sh

echo "start"
source ./env

echo "DB reset"
php wp-cli.phar db reset --yes

echo "DB import"
php wp-cli.phar db import db/wordpress_db.sql

if [ ${DB_SITE_URL} = ${SITE_URL} ]; then
  echo "NO DB replace"
else
  echo "DB replace ${DB_SITE_URL} >> ${SITE_URL}"
  php wp-cli.phar search-replace ${DB_SITE_URL} ${SITE_URL}
fi

echo "finish"
```

あとはこのwp-setup.shを ```bash wp-setup.sh``` で実行してあげるだけです。
実行時の動作を簡単に説明すると、

 - 一旦、検証環境のDBを削除
 - dumpファイルからDBをリストア
 - 全テーブルを対象に、DB_SITE_URL指定の文字列を、SITE_URL指定の文字列へ置換

してくれます。

# おわりに
WP-CLIはシリアライズされたデータの置換にも対応しているので、
サイトの引っ越し自体はこのスクリプト一発で完了します。

あとはメディアファイルをS3などにアップするようにしておくか、
メディアファイルもgit管理に含めてしまえば、面倒な環境移動も一瞬で終わるようになります。
ec-cube3系向けnginxの設定

ec-cube3系のwebサーバとしてnginxを利用する場合のnginxのサーバ設定で
参考になりそうな記事が見つからなくて苦労したので備忘の為にメモしておきます。
（以下設定はCentOS7、事前にphp-fpmはインストールしてある前提のものです）

## 環境

- CentOS7
- nginx 1.6.3
- php-fpm 7.0.8
- php 7.0.8

## confファイルの内容

```
vi /etc/nginx/conf.d/eccube.conf
```


```
server {
    server_name eccube.xxx.com; # 任意の値に変更
    root        /path_to_eccube/html; #ec-cubeの配置ディレクトリを指定
    index       index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php?u=$uri&$args;
    }

    location ~ \.php {
        fastcgi_pass  127.0.0.1:9000; # php-fpmのlistenポートを指定
        fastcgi_index /index.php;

        include fastcgi_params;
        fastcgi_split_path_info       ^(.+\.php)(/.+)$;
        fastcgi_param PATH_INFO       $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

    }

    location ~ /\.ht {
        deny all;
    }

    error_log /var/log/nginx/eccube_error.log; # エラーログファイル名を変更する場合に指定
    access_log /var/log/nginx/eccube_access.log; # アクセスログファイルを変更する場合に指定
}

```