OmniAICreator/Qiita-1.07M huggingface dataset:
Xamarin.iOSで納得のいくカメラ座標値を得る

某位置情報プログラミング技術本に、磁気センサ＋加速度センサの値から、カメラの向きの極座標を得るサンプルが載ってたのですが、
カメラを特定の方向、特定の仰角に向けたまま、カメラの軸を中心に回転させると、本来ならAzimuth(Yah)、Pitchは固定でRollだけ変わって欲しいのに、回転の結果デバイスの上端が異なる方角を向くとAzimuthも変化してしまったりと全然納得のいく結果を得られませんでした。

そこで自前計算して、納得の行く結果の出るロジックを自作しましたので、共有します。
元の本のコードをかなり参考にしてますが、Objective-C => c#への変更をしてますし、また納得の行く動きをするようかなり手を入れてますので、著作権的には大丈夫…だと思います…。
また、このコードを導くためにかなりゴリゴリ座標計算しましたが、最後の最後でどうしても位相が半分ズレてしまったり、回転の向きが逆になってしまうところが出てしまい、いくら考えても判らないので半位相を加えたり回転の向きを負の値にしてよし、としてしまったので、計算式の共有は省略します…。

なお、カメラはiPhoneと同じ位置についているものとし、カメラ座標系での上面方向（Z軸正方向）は縦持ちの時のデバイス上面方向とします。
カメラを回転させてもAzimuth/Pitchは変化しないような計算結果にしてますので、もし横持ちカメラで利用したい時は、Rollだけ1/4位相ズレで読んでもらえば大丈夫です。
Xamarin.iOSと書きましたが、Androidでも、磁気センサや加速度センサの座標系が同じならば、そのまま使えるはず。
角度の値は、全てラジアンです。

```csharp:カメラ座標系計算
public void CalcurateOrientation () {
    //クラスのプロパティとして、以下が定義済みとします。
    //MagnetX, MagnetY, MagnetZ: 磁気センサの値
    //AccelX, AccelY, AccelZ: 加速度センサの値
    //AzimuthOffset: 磁北と真方位での北の間の角度差
    //AzimuthOffset = (heading.TrueHeading - heading.MagneticHeading) * Math.PI / 180.0;

    double a, b, c, d, e, f, g, h, i;

    //磁気センサ、加速度センサの絶対値を出す
    double accelAbsolute  = GetAbsoluteValue3D (AccelX,  AccelY,  AccelZ);
    double magnetAbsolute = GetAbsoluteValue3D (MagnetX, MagnetY, MagnetZ);

    //世界座標系<=>デバイス座標系間の回転行列の値を出す。詳細は省略。
    a = -(MagnetY * AccelZ - MagnetZ * AccelY) / (accelAbsolute * magnetAbsolute);
    b = -(MagnetZ * AccelX - MagnetX * AccelZ) / (accelAbsolute * magnetAbsolute);
    c = -(MagnetX * AccelY - MagnetY * AccelX) / (accelAbsolute * magnetAbsolute);

    d = (MagnetX * (AccelY * AccelY + AccelZ * AccelZ) -
        MagnetY * AccelX * AccelY - MagnetZ * AccelZ * AccelX)
        / (accelAbsolute * accelAbsolute * magnetAbsolute);
    e = (MagnetY * (AccelZ * AccelZ + AccelX * AccelX) -
        MagnetZ * AccelY * AccelZ - MagnetX * AccelX * AccelY)
        / (accelAbsolute * accelAbsolute * magnetAbsolute);
    f = (MagnetZ * (AccelX * AccelX + AccelY * AccelY) -
        MagnetX * AccelZ * AccelX - MagnetY * AccelY * AccelZ)
        / (accelAbsolute * accelAbsolute * magnetAbsolute);

    g = -AccelX / accelAbsolute;
    h = -AccelY / accelAbsolute;
    i = -AccelZ / accelAbsolute;

    //もしカメラ座標ではなく、デバイス座標での極座標値を取りたい場合は、
    //ここのコメントアウトされてる部分のロジックを使う
    /*Azimuth = Math.Atan2 (b, e) + AzimuthOffset;
    while (Azimuth < 0)
        Azimuth += Math.PI * 2.0;
    Pitch = Math.Asin (h);
    Roll = Math.Atan2 (-g, i);*/

    //ここはカメラ座標(縦持ち)
    //どうしても半位相ズレたのでPI引いている
    Azimuth = Math.Atan2 (c, f) - Math.PI + AzimuthOffset;
    while (Azimuth < 0)
        Azimuth += Math.PI * 2.0;
    Pitch = Math.Asin (-i);
    Roll = Math.Atan2 (-g, h);

}
```
heroku + railsでgmailを使ってメールを送る時のパスワードの扱い

add-on使えばいいんだろうけどadd-on使うためにはカードの登録が必要。でもカードは登録したくない。
そんなゴミ虫の俺はgmailを使うことにしました。

* でもパスワードとかの機密情報ってどうすんの？ 

って話

## パスワードの扱い(機密情報の扱い)

リポジトリの設定ファイル中に馬鹿正直にパスワードを書くわけにはいきません。男らしく平文で書いて全pushしてやるぜ！って人は別にいいです。

男らしくない皆さんのためにちゃんとherokuは方法を用意してくれています。

## 概要
1. `heroku config:add　KEY=VALUE`でherokuに設定値を追加
2. railsの設定ファイル中に置換設定を書いておきheroku設定を置換

- - -

## 実際の手順

### herokuにユーザ名とパスワードを設定

~~~sh
$ heroku config:add MAIL_USER_NAME="hoge"
$ heroku config:add MAIL_PASSWORD="password"
~~~

- - -
### railsのメール設定

railsのメール設定を追加する。user_name,passwordの扱いがポイントになる。
`ENV['MAIL_USER_NAME']`って感じに書いてやると先ほど設定された値が設定される。
ここではパスワードとユーザ名をconfigから読むようにした。

`config/environments/production.rb`

~~~ruby
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
      address:        "smtp.gmail.com",
      port:           587,
      authentication: "plain",
      user_name:      ENV['MAIL_USER_NAME'],
      password:       ENV['MAIL_PASSWORD'],
      domain:         'heroku.com',
      enable_starttls_auto: true
  }
~~~


うん、でもなんかheroku経由でgmailからmail送ってるとアカウントロックされたとかいう人結構いるし
基本的に無料でメール送れるし　すげぇいっぱいメール送ったら金取られるんだからカード登録だるいとか言わないで登録してadd-on使えばいいんじゃないかな！
Light Tableでマルチカーソルの位置を取得する

ついにLight Table 0.6.6でマルチカーソルに対応しました。
他にも右クリックで実行結果のコピーができるようになったし、複数フォント設定もできるようですね～

それはさておき、Light Tableのプラグインを作るときなど、どうやってカーソル位置を取るかについてメモしておきます

以下の.listSelectionsのとこで、anchorやheadのプロパティを持つJSオブジェクトの配列が取得できます。

anchorやheadは、lineとchをプロパティに持ちます

```clj:sample.cljs
(ns sample.core
  (:require  [lt.objs.editor :as editor]
             [lt.objs.editor.pool :as pool]))

(do (range 2) (range 4)
  (map - (range 6)))

(def select (.listSelections (editor/->cm-ed (pool/last-active))))

(.. (first select) -anchor -line)

(for [s select
      ah ["anchor" "head"]
      lc ["line" "ch"]]
  (aget s ah lc))

```

以下3箇所を選択して実行したときの`for`の結果が以下になります

* `(range 2)`の部分を左から右に選択
* `-`の部分を右から左に選択
* `(def select...`の部分を左から右に選択

```
(4 4 4 13 5 8 5 7 7 0 7 66)
```

anchorは左から右に選択したときの左端の部分で、headは右端の部分（カーソルがある部分）になります。
lineとchはその名のとおり、行数列数ですね

なお、.listSelectionsの結果の配列は（行数列数で）必ずソートされた状態で格納されてるようです。
また、マウスやキーボードの矢印で選択したときと、Pareditのショートカットキーで選択したときでは、格納されているオブジェクトの形式が少し違うようなので注意が必要です。
シェルで簡易計算機

# 簡易計算機

## 環境
* CentOS release 6.5 (Final)
* bash 4.1.2


## つうか ? を関数名に使えるの ?

関数定義して

```bash
? () { echo "$*" | bc -l; }
````

使う

```bash
? "1+2+3+4+5*10"
#=> 60
```

## 他にも色々
? が使えるのなら 他にも +-@_[]=!^#<>なども使えるのかなと試したら結構使える...恐るべし

```bash
+ () { echo "$*" | bc -l; }
- () { echo "$*" | bc -l; }
@ () { echo "$*" | bc -l; }
[ () { echo "$*" | bc -l; }
] () { echo "$*" | bc -l; }
_ () { echo "$*" | bc -l; }

for x in "@" "-" "+" "_" "[" "]"
do
  echo -n "${x}: "; eval $x "8*5"
done

# こんな結果で
#    @: 40
#    -: 40
#    +: 40
#    _: 40
#    [: 40
#    ]: 40
```

これとか [ 再定義できるのも恐ろしい。(/usr/bin/[)

```bash
$ which [
/usr/bin/[
$ ls -l /usr/bin/[
-rwxr-xr-x 1 root root 33408 Mar 12 20:12 /usr/bin/[

# "[" はコマンドなので普通のbashスクリプトが動かなくなっちゃう
$ [ -f /etc/hosts ] && echo "ok"
(standard_in) 1: syntax error
ok
```

## 無理なものは無理だよね
無理強いは良くないです。

```
$ ! () { echo "$*" | bc -l; }
-bash: syntax error near unexpected token `)'

$ ^ () { echo "$*" | bc -l; }
-bash: :s^ () { echo "$*" | bc -l; }: substitution failed

$ | () { echo "$*" | bc -l; }
-bash: syntax error near unexpected token `|'

$ % () { echo "$*" | bc -l; }
$ % "1+2+3"
-bash: fg: %: no such job
```

使い処によっては分かりやすいかも

```bash
$ is_linux? () { [ `uname` = "Linux" ] && true || false; }
$ is_linux? && echo ok
ok
```

## 参考
Commandlinefu
http://www.commandlinefu.com/commands/view/2520/define-a-quick-calculator-function
Chromecastに負けない！知られざるAirPlayの活用法！AirPlayでTVサイズの馬鹿でかい画面のiOSアプリを作ってみよう！

by @mixiappwchr

chromecastが日本でも発売になって、chromecastにはSDKがあるため、色々と触ると楽しいですが、AirPlayも負けてはいません。

通常画面のミラーリングとかの用途に使われがちですが、実は、AirPlayでTVサイズのアプリを作成することができます。


#

今回は下記のようなiPhoneサイズの画面よりもっと大きいサイズのViewを作成します。
![スクリーンショット 2014-06-04 0.57.00.png](https://qiita-image-store.s3.amazonaws.com/0/37731/5c74bb3b-e7df-4d02-7ccf-6d237e9548b0.png)


#環境準備(シミュレータの場合)
シミュレータでも,今回の実装は行うことができ、
iOSシミュレーターのメニュー→ハードウェア→外部ディスプレイ→1280x720を選びます。
残念ながらiOSだと1280x720までが最大なようです。


#環境準備(実機の場合)
実機の場合は,Apple TVなどを用意して,Airplayでなおかつミラーリングオプションを選択しましょう。



#実装
実装を説明していきます。

AirPlayディスプレイに異なる表示をする手順は次の通りです。

1. アプリケーションの起動時に外付けディスプレイの有無を確認し、画面の接続/切断時に通知が届
くよう登録する。
2. 外付けディスプレイがある場合（起動時、実行中とも）、これに対応するウインドウを生成、設
定する。
3. ウインドウを適切な画面オブジェクトに関連づけ、第2のウインドウを表示し、通常どおり更新
する

となります。

```objc

-(void)registerConnectSecondScreenNotification{
    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
    
    [center addObserver:self
               selector:@selector(setupSecondView)
                   name:UIScreenDidConnectNotification
                 object:nil
     ];
    
    [center addObserver:self
               selector:@selector(removeSecondView)
                   name:UIScreenDidDisconnectNotification
                 object:nil
     ];
}

```
画面の存在の有無はUIScreenDidConnectNotification/UIScreenDidDisconnectNotification
を監視して検知が可能です。このイベントを元にViewの生成、削除を行います。

```objc
-(BOOL)hasSecondScreen{
    if([[UIScreen screens] count] > 1){
        return YES;
    }
    return NO;
    
}
```
接続後外部デバイスがあるかどうかは UIScreen screensの数を数えて、1個以上なら外部ディスプレイが存在します。

```objc

-(void)createSecondScreen{
    if([self hasSecondScreen] && !self.window){
        UIScreen *screen  = [[UIScreen screens] objectAtIndex:1];
        self.window = [[UIWindow alloc] initWithFrame:screen.bounds];
        self.window.frame  = screen.bounds;
        self.window.screen = screen;
        self.window.hidden = NO;
    }
}
```

スクリーンがあった場合は新しいUIWindowを作成し、プロパティに２つ目のUIScreenをセットします。



```objc
-(void)setupSecondView{
    if([self hasSecondScreen]){
        [self  createSecondScreen];
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
        UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"AirPlayView"];
        viewController.view.frame = self.window.bounds;
        [self.window addSubview:viewController.view];
    }
    
    // Do any additional setup after loading the view.
}

-(void)removeSecondView{
    
    if(self.window){
        self.window.hidden = YES;
        self.window = nil;
    }
    
}

```
あとはViewをいつものように作成するだけです。


するとこのように

![スクリーンショット 2014-06-04 1.16.57.png](https://qiita-image-store.s3.amazonaws.com/0/37731/c04dc156-0cf4-f8aa-9db1-04df4f421321.png)

大きいディスプレイに別のViewが表示できました。

技術詳細は下記を閲覧するとよいでしょう

[iOSマルチディスプレイプログラミングガイド](https://developer.apple.com/jp/devcenter/ios/library/documentation/WindowAndScreenGuide.pdf)

使い道としてはあまりないのですが、
いくらかこの方式を対応しているゲームなどもちらほらあります。

より大きい画面でプレイさせることでユーザー体験を向上させたり、
デモ用にでかいViewのアプリを作成したり、
TV画面と手元のiPhone両方の画面を使用して、なんちゃってWii Uみたいな物を作れそうですね！
Arduino二台をシリアルでRubyを使い通信させることに関して

Arduinoを二台つなげる方法にはシリアル通信以外にもあるのだが、Xbeeなどを使いたい時には二台Arduinoを使うのが一番楽だと思う。今回は間にRubyのscriptを挟む方法を使った。

##serial-Ruby

二台のArduinoを同時に操作する時のサンプルを載せる。

```rb
require 'rubygems'
require 'serialport'
 
@serial_port_1 = "/dev/ttyACM0" #シリアルを送信する方のArduinoのポート
@serial_port_2 = "/dev/ttyACM1" #シリアルを受信する方のArduinoのポート
@serial_bps = 9600 
 
sp1 = SerialPort.new(@serial_port_1,@serial_bps) #送信用
sp2 = SerialPort.new(@serial_port_2,@serial_bps) #受信用

loop do
  read = sp1.read #送信用から送られてきた値をreadに格納
  sp2.write(read) #readを受信用Arduinoにそのまま転送。
  sleep(1) #時間調整
end
```

##Arduino送信側
```cpp
char ch = 'R'; //送受信の時に使う文字列。
void setup()
{
  Serial.begin(9600);
  pinMode(13,INPUT); //ボタン用
}
 
void loop(){
 if(digitalRead(13) == 0){ //ボタンが押されていなければ'0'を送信
   Serial.println('0'); 
 }else if(digitalRead(13) == 1){  //ボタンが押されていれば'1'を送信
   Serial.println('1');
 }
 delay(1000);
}
```
ボタンが押されていれば1を、そうでなければ2を送信するプログラム。
こちらは送信側のArduinoなので、portを/dev/ttyACM1に設定する。

##Arduino受信側

```cpp
char ch = 'R'; //受信の時に使う文字列。
void setup()
{
  Serial.begin(9600);
  pinMode(13,OUTPUT);
}
 
void loop()
{
  while(Serial.available()){
    ch = Serial.read();
    if(ch == '0'){
	  digitalWrite(13,HIGH);
	}
    if(ch == '1'){
	  digitalWrite(13,LOW);
    }	  
  }
}
```
こちらは受信側のものなので、Portを/dev/ttyACM01/の方にする。  
Arduinoでシリアル通信を行うときにハマりやすい点として、「一文字ずつしかシリアルを受け取れない」というものがある。その点にさえ注意がむけば、そこまで難しくはないはずである。 

##Portに関して
このようにArduino二台をシリアル通信させることは比較的簡単だが、Portのことを考えるのが多少面倒になっている。正しいポートに接続できているかどうか一発で分かる方法は多分ないので(あったら教えてください!!!)、一台ずつつなげるしか方法はなさそうである。
誤記の指摘はコメント欄じゃなく「編集リクエスト」を使いましょう

#「編集リクエスト」知ってますか
GitHub的に言えばPull Requestになるんでしょうか。
##編集リクエスト作成手順
1. タイトル直下と、最下部の「この投稿をストックする」横にある、どちらかの「編集リクエストを作成する」をクリックすれば編集エディタが立ち上がります。
1. 誤記を修正しましょう。
1. 編集を終えれば「編集内容の概要」にはひとこと入れなきゃいけない（Gitのコメントと同じです）ので、「誤記修正」とでも書いておきましょう。
1. 著者がコミットしてくれれば通知が返ってきますから、見に行かなくても「ああ、直してくれたんだ」と安心できる。

編集リクエストを受けた作者は、誤記の指摘を明確に且つ **内密に** 受けるので、ひっそりと、しかも確実に誤記修正を行うことが出来ます（もちろん編集履歴には残りますが、そこまで見るひとも居ないでしょう）。

#誤記指摘だけのためにコメント欄を使うのはどうかと思う
1. 指摘する側はいちいち「参考になりました」とか時候の挨拶的な文を付けなきゃいけない（付記：挨拶文を付けずに指摘だけのひとも居るみたい）。
2. 作者もいちいち「ご指摘ありがとうございます」と返答しなきゃいけない上に、どこを指摘してるのか探さなきゃいけない、そしてもちろんコメント欄で公開指摘されているので、修正しなきゃいけないというプレッシャーがかかる。
1. コメント欄を読む側も、誤記指摘という、あまり情報が含まれていない余分なコメント行をいちいち飛ばしながら読まなきゃいけなくなる。

みんなに面倒。三方損。
誤記指摘コメントするのは、誤記が気になったので直してほしい、からですよね。ならば、作者が直しやすいように、指摘する側がわずかの労力をかけても良いんじゃないでしょうか。GitHubのPull Requestだって、誤記訂正依頼だけのときもあるし、「指摘ではなくプルリクして」という方針のかたも居る気がする。
個人的には「編集リクエスト」だとコメント欄と違って **内密に** 伝えられるのが良いと思っています。ケアレスミス指摘とかね。
#なので「編集リクエスト」使いましょう
Qiitaも率先して使い方案内をしてほしいね。
いつでもどこでも Hubot から :help する


[Vim Advent Calendar 2013](http://atnd.org/events/45072) 186日目の記事です。


### いつでもどこでも `:help` する

Vim では、`:help <word>` でヘルプを参照することが出来ます。

この間、Web から `:help` できるサイトが作られていました。
[いつでもどこでも :help する - Vim :help](http://vim-help-jp.herokuapp.com/)

Emacsからも `:help` できるようになりました。
[いつでもどこでも Emacsから :help する - Life is very short ](http://d.hatena.ne.jp/syohex/20140527/1401188929)

Emacsからできるのですから、Vim からも `:help` できるべきでした。
[いつでもどこでも Vim から :help する](http://mattn.kaoriya.net/software/vim/20140527210100.htm)

というわけで、Hubot からでも、`:help` できるように作りました。

### Hubot から :help

今のところかなりざっくり作っただけなので、ゆくゆくは「もしかして〇〇？」な機能をつけたい気もします。

どうにも CoffeeScript 読むのも書くのも苦手。

### インストール

`$ npm install -S hubot-vimhelpjp`

あとは、 external-scripts.json に追加するだけ。

`["hubot-vimhelpjp"]`


### 使い方

```
:vimhelp CTRL-]
```

### リポジトリ
https://github.com/tgfjt/hubot-vimhelpjp
ZIP,LHAの圧縮の仕組み

ZIPのdeflate圧縮やLHAのlhXシリーズ圧縮は、 **ハフマン法** と **辞書式** という二つのアルゴリズムで構成されています。
二つのアルゴリズムを使っているのは、脈絡なしに組み合わせてみたものではありません。辞書式の難点をハフマン法がうまく吸収しているうまい組み合わせです。

辞書式
==
記号列の規則性を利用した圧縮法です。
記号列を読んでいて出てきたフレーズが以前にも出てきたものであるとき、「○○個前から××個」と書き換えてしまうことで省略します。
例えば

```
お前のものは俺のもの、俺のものも俺のもの
```

という文字列なら

```
お前のものは俺⑤③、④④も③④
```

と書き換えるという具合。ここで"⑤③"は5文字前から3文字（"のもの"）という意味です。
ちなみに

```
あたたたたたたたたたたたたたたたた
```

なら

```
あた①⑮
```

に書き換えられるのです。こういうのもありなんですね（コピー元とコピー先が重なっているのです）。

辞書式には、前方から一致するフレーズを探すための工夫と前方参照の表現の仕方でいろいろ流派があり、ZIPも採用している人気の手法がLZSSと呼ばれるものです。

ハフマン法
==
記号の出現頻度を利用した最適ビット列化手法です。
多く出現する記号は短い符号で、出現の少ない記号は長い符号で、と符号化します。直観的には、よく使う英単語"a", "the", "it"とかが少ない文字数に、日常的に使わない単語、たとえば"unexpectedly"なんかが長い文字数になっているのを想像してもらうと理解しやすいでしょうか。

```
晴晴晴晴曇曇晴雨晴晴曇晴晴晴雪晴晴晴晴晴
```

という記号列をビットで表すとき、`晴`,`曇`,`雨`,`雪`という記号に平等に2ビットずつ`00`,`01`,`10`,`11`という符号を割り当ててしまうと40ビット必要です。

```
0000000001010010000001000000110000000000
```

出現頻度の多い`晴`,`曇`,の順に短い符号を割り当てて`0`,`10`,`110`,`111`などとすれば

```
000001010110000100011100000
```

27ビット。短くなりました。そして、こうなるように最適な符号長を割り当てる手法がハフマン法です。

ごく簡単に説明すると、記号全種類を葉に持つような二分木を組み上げます。このとき、最初はすべての葉が独立したノードである状態から始めて、頻度の小さい方から二つを組んで木にします。この二つのノードの頻度の合計が新しい木の頻度になります。これを、すべてが一つに木にまとまるまで繰り返すというもの。二分木内でのアドレスがそのまま符号です。

辞書式をハフマン法で補完する
==
辞書式にはちょっとした難点があります。
例えばバイト列に辞書式を適用する場合、元のファイルの記号の種類は256種類だったのですが辞書式を適用すると「○○文字前から」「××文字」を意味するコピー命令の記号が加わって256種類よりも増えてしまいます。
256種類ならちょうど8ビットであらわせていたのですが、種類が増えると1記号あたりのビット数が長くなってしまうだけでなく、種類が2のべき乗個でなくなることでビット効率も落ちてしまいます。

そこでハフマン法。先ほどの例では4種類の記号をハフマン符号化していましたが、ハフマン符号は記号の種類が2のべき乗個でなくても作れます。偶数個である必要さえありません。

そこで
1. 元ファイルを辞書式で圧縮する
2. その結果は半端な種類数の記号集合で表されているので、ハフマン法で最適にビット列化する
の2段階を踏むことで規則性と文字頻度の偏りを排除した短いバイト列に変換できる、これがZIPやLHAの圧縮過程です。
Chocolateyでmingwを入れてみよう

Chocolateyとは、NuGetのラッパーだとかで、Windowsでパッケージ管理するためのツールです。

因みに、NuGetは、MS謹製のパッケージ管理ツールです。

Chocolateyのインストールは、公式サイト( http://chocolatey.org )のトップページに記載されているコマンド(スクリプト)を、コマンドプロンプトに入力するだけ。

そして、MinGWのインストール。
コマンドプロンプトで、以下を実行。

cinst mingw-get

何故、mingwではなく、mingw-getかと言うと、mingw-getの方が、mingw内のパッケージ管理が出来るから。
mingw-get installとか出来ると楽です。

MinGWの64bitを使いたい場合は、cinst mingwとする。
Groongaドキュメント読書会2で学んだ事のメモ

# はじめに
この文章は、[Groongaドキュメント読書会2](http://groonga.doorkeeper.jp/events/11834)で学んだ事のメモです。
元のテキストで分からなかった事を中心に書きました。
が、ついて行くのに精一杯だったので、書き漏れがあるかもしれません。。。

# 2.インストール
テキスト: http://groonga.org/ja/docs/install.html

## 2.3.1. wheezy
- Muninプラグインは、ディスク使用量やCPU使用量、スループットなど、8種類のメトリクスを監視可能。

## 2.4.1. PPA（Personal Package Archive）

### ノーマライザとは
- アルファベットの大文字小文字の違いなどを吸収することを正規化と言う。
- ノーマライザは、正規化を行ってくれるモジュール。
- インストールして有効化しないと使えない。

## 2.5.1. CentOS 5
- ipadicの読み方は「あいぴーえー・でぃく」、jumandicは「じゅまん・でぃく」が一般的。

## 2.5.2 CentOS 6
- Cent6.5 x64環境で試したところ、groonga-tokenizer-mecabをインストールすると、mecab-ipadicもインストールされた。

## 2.6 Fedora
- groonga-normalizer-mysqlは既にFedora公式のyumリポジトリに追加済み。

## 2.8. その他
- zlibとLZOはメモリリークの元になっているので、今は使わない方がよい。
- ここで紹介されているライブラリは、各プラットフォームのパッケージには基本的に入っている。
  - groonga-tokenizer-mecab等のように別途インストールするパッケージもの以外。

### サジェスト機能とは
  - googleの「もしかして:」機能のようなもの。
  - リアルタイムにユーザーの入力を学習していくことも可能。
  - しかし、あまり使われていない。
    - イベント等でスパイクするような検索ワードは、そのイベント後は意味がなかったりするため。
    - ふさわしくないキーワードを学習されたりする可能性があるため。
  - サジェスト機能は通信量が非常に増えるため、libeventやZeroMQといったライブラリが使われる。
    - Proxy的に作用し、Groongaへ直接アクセスされる通信量を制禦するイメージ。

## 2.8.2.1.5. --with-match-escalation-threshold=NUMBER
- マッチ演算エスカレーションとは、検索でヒットしなかった時にゆるく検索しなおす機能。
- この設定値は検索結果が何件以下の場合にエスカレーションするかを設定する。
  - 検索の緩め方は、全文一致から、前方一致に変えるなど。その内出てくる。

# 4.1. チュートリアル - 基本的な操作
テキスト: http://groonga.org/ja/docs/tutorial/introduction.html

## 4.1.10. 全文検索用の語彙表の作成
- パトリシア木の読み方は「ーき」。
- KEY_NORMALIZEフラグは現在は非推奨。代わりにNORMALIZERを指定する。

## 4.1.12. 全文検索
- 語彙表やインデックスを明示的に指定しなくても、作成されていれば自動的に全文検索時に参照される。
- ただ、1カラムに複数インデックスを貼れるので、そのような場合には、どのインデックスを使うかを指定したりする事も可能。
- 例えば、違うトークナイザでインデックスを作成して、それらに重み付けをした検索を行いたい場合など。

# 後で試す/確認するリスト
- 語彙表とインデックスの使われ方が直感的に理解できなかったので、色々試してみる。
  - 語彙表をselectしようとするとどうなるのか。
  - 1つの語彙表に複数のテーブルのインデックスを追加していいのか。
- Munin連携は試してみたい。
世界で戦うプログラミング5-3

bit演算は難しい，，，
ましてやプログラミングで書くとなるとなおさら，，，

```py3:bit.py
#-*- coding:utf-8 -*-

class Bitutils():
        
    def getNextArith(self,n):
        c = n
        c0 = 0
        c1 = 0
        while c & 1 == 0 and c != 0:
            c0 += 1
            c >>= 1
        
        while c & 1 == 1:
            c1 += 1
            c >>= 1
        if (c0 + c1 == 31 or c0 + c1 == 0):
            return -1
        return n + (1 << c0) + (1 << (c1 -1)) -1
    
    def getPrevArith(self,n):
        temp = n
        c0 = 0
        c1 = 0
        while temp & 1 == 1:
            c1 += 1
            temp >>= 1
            
        if temp == 0:
            return -1
        
        while temp & 1 == 0 and temp != 0:
            c0 += 1
            temp >>= 1
        
        
        return n - (1 << c1) - (1<<(c0 - 1)) + 1

```

お風呂に入った後にまた考え直してみようと思います．
WindowsでGVM

WindowsでGVMを使って、groovyのバージョン管理をする場合、Cygwinか、GVMを使う必要がある。(仮想マシン使って、LinuxやBSD系OSを入れてとかは別)

今回は、MinGWを使ってみた。
MinGWのインストール手順は割愛することにして、ハマったことを書いておく。

環境変数HOMEを設定してはならない(設定しても、/c/Users/hogeなど、/cから始まるパスにしてはならない)

ただこれだけ。
何故、/cから始まるパスにしてはならないかと言うと、インストールスクリプトの中で、mkdir -p $HOME/.gvmなどで、/c file is already existsとか、-p付いてるのに何故！？な動きをしてくれる(もしかして、-pって、中身を書き換えずに、ディレクトリのinode的なものを上書きしようとして、/cは特殊だから上書き出来ずにコケてるってことかな？)

というわけで、HOME=%USERPROFILE%とか、ユーザー環境変数に切ってあると、アンハッピーになれます。
anyenvとか、rbenvとかも同じ
入力例を表示させる「ah-placeholder.js」、自動入力スクリプトと併用時にIE9以下で文字色が変わらない問題を解決



タイトル長くてすみません。

# やりたかったこと

以前、表示例を入力フォーム内に表示させるjQueryプラグイン「ah-placeholder」を紹介しました。placeholder属性に対応していないIE9以下でも、placeholderに記述すれば入力例が表示される、便利なプラグインでした。

参考
[フォーム内に入力例を表示させるには、どの方法がいいの？](
http://qiita.com/seihowlow24/items/9bf6557fb33cba698b71)


しかし、いざ実装すると問題が発覚しました。
それは、エントリーフォームによくある「郵便番号から住所を自動入力する」「フリガナを自動入力する」という機能と組み合わせると、 **入力例が灰色のまま残ってしまう** という現象です。

# 解決方法
はじめに、こんなスクリプトを書いておきます。
このファンクションを、onblur または　onfocus で使います。
id は適宜変更してください。

```
<script>
function add_change(){
document.getElementById('address').style.color="#000000";
}
function kana_change(){
document.getElementById('kana').style.color="#000000";
}
</script>
```

## onblur
とある入力フォームからカーソルが外れた時点で、該当する文字列の文字色を、IDで指定して変えるという方法。郵便番号から住所の自動入力をする時に使います。

```html
<input id="zip" type="text" name="zip" value="" onblur="add_change()" placeholder="ex) 439-0005">

<input id="address" type="text" name="address" value="" placeholder="ex) Shibuya">

```

## onfocus

onbluerの逆で、そのフォームにカーソルが置かれた時点で、文字色を変えるという方法。名前からフリガナを自動入力するときに使います。

```html
<input id="kanji" type="text" name="kanji" value="" onfocus="kana_change()" placeholder="ex) 山田">

<input id="kana" type="text" name="kana" value="" placeholder="ex) やまだ">
```

# まとめ
自動入力に使っているスクリプトによって、対処方法が変わってくるかもしれません。

なんか無理矢理な感じなので、もっとスマートなやり方はないのかな。

無理してplaceholder 指定しなくても、欄外に入力例を書けばいいじゃん、という指摘もありますが、そうもゆかないのですよ。
コピペで動く bootstrap-datetimepicker

rails-bootstrap-formsを使っていてbootstrap-datetimepickerを使ったメモ書きです。
cdn経由でcssとjsを指定するのでコピペで動きます。

Bootstrap datetimepicker Date/time picker widget for Twitter Bootstrap v3
http://eonasdan.github.io/bootstrap-datetimepicker/

Moment.js
http://momentjs.com/

cssとjavascriptの読み込み。

```html
 <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/3.0.0/css/bootstrap-datetimepicker.min.css" />
 <script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.6.0/moment.min.js"></script>
 <script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.6.0/lang/ja.js"></script>
 <script src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/3.0.0/js/bootstrap-datetimepicker.min.js"></script>
```

フィールドはこんな感じ。

```irb
<%= f.date_field :date %>
<%= f.time_field :start_time %>
```

date-pickerとtime-pickerを別々に。

```js
$(document).ready(function() {
  $.fn.datetimepicker.dates = {
      ja: {
        days: ["日曜", "月曜", "火曜", "水曜", "木曜", "金曜", "土曜", "日曜"],
        daysShort: ["日", "月", "火", "水", "木", "金", "土", "日"],
        daysMin: ["日", "月", "火", "水", "木", "金", "土", "日"],
        months: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"],
        monthsShort: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"]
      }
  };
  $('input[type=date]').datetimepicker({
    format: 'YYYY-MM-DD',
    language: 'ja',
    autoclose: 'true',
    pickTime: false,
  });
  $('input[type=time]').datetimepicker({
    format: "HH:mm",
    language: 'ja',
    autoclose: 'true',
    minuteStepping:10,
    pickDate: false,
  });
});
```
rails-bootstrap-formsはこれ。
https://github.com/bootstrap-ruby/rails-bootstrap-forms
Mac OS XでVagrantを入れようとした時に出たエラー



```
$ vagrant box add centos64box https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
==> box: Adding box 'centos64box' (v0) for provider: 
    box: Downloading: https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
The box you're attempting to add already exists. Remove it before
adding it again or add it with the `--force` flag.
Name: centos64box
Provider: virtualbox
Version: 0
```

Googleで検索したらVagrant日本語ドキュメントのhttp://lab.raqda.com/vagrant/installation/uninstallation.htmlに
すべてのプラットフォームにおいて、ユーザデータを削除するには~/.vagrant.dディレクトリを削除します。 
という部分があったので、


```
$rm -r ~/.vagrant.d/
```

と打ち込んでもう一度

```
vagrant box add centos64 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
```
とすると

```
box: Successfully added box 'centos64box' (v0) for 'virtualbox'!
```

と出てくれた。
PHPフレームワークのphalconをeclipseで使ってみる


## phalconとは

<I>Phalcon は、ハイパフォーマンス で少ないリソース消費のC拡張として実装されたWebフレームワークを提供します</I>
http://phalconphp.com/ja/


公式サイトを見ると、とにかく速そうな感じですね。
今日はちょっとphalconをeclipseで使えるようにするところまで書いてみます。

## vagrant

phalconphpのサイトにvagrantの記述がありました。
http://phalconphp.com/ja/download/vagrant

これに沿った手順でvagrantに構築してみます。

### vagrant init

```
vagrant init phalconbox https://s3-eu-west-1.amazonaws.com/phalcon/phalcon125-apache2-php54-mysql55.box
```

### Vagrantfileの編集

```
# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # Every Vagrant virtual environment requires a box to build off of.
  config.vm.box = "phalconbox"

  # The url from where the 'config.vm.box' box will be fetched if it
  # doesn't already exist on the user's system.
  config.vm.box_url = "https://s3-eu-west-1.amazonaws.com/phalcon/phalcon125-apache2-php54-mysql55.box"

  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  config.vm.network :private_network, ip: "192.168.100.20"

end
```

### vagrantを起動

```
vagrant up
```

起動後、以下のURLで確認することが出来ます。

http://192.168.100.20/website
http://192.168.100.20/invo


## デベロッパーツール

ディベロッパーツールが用意されているので、以下のURLの手順に従います。
http://phalconphp.com/ja/download/tools


作った環境にログインします。

```
vagrant up
```

### composerのインストール

```
curl -s http://getcomposer.org/installer | php
```

### composer.jsonの編集

```
{
    "require": {
        "phalcon/devtools": "dev-master"
    }
}
```

### composerでインストールを実行

```
php composer.phar install
```

### phalcon.phpスクリプトへのシンボリックリンクを作成

```
sudo ln -s ~/phalcon-devtools/phalcon.php /usr/bin/phalcon
sudo chmod ugo+x /usr/bin/phalcon
```

vendor/phalcon/devtools/ が出来ている状態になっていると思います。

## eclipseで利用する

phalconで開発をする際に、eclipseでphalconのClassとかのコメントがみたいことがあると思うので設定します。

### PHP Include Pathを通す

vendor/phalcon/devtools/ideにバージョン毎のディレクトリがあるので、eclipseにpathを通します。

* PHPプロジェクトを選択し、『Properties』をクリック
* PHP Include Path > Libraries > Add External Source Folder をクリック
* ポップアップが表示されるので、vendor/phalcon/devtools/ide/1.3.1など最新のバージョンを選択
* OKをクリックしてPropertiesを閉じる


## チュートリアルをこなしてみる

eclipseを利用してチュートリアルを試してみました。
http://docs.phalconphp.com/ja/latest/reference/tutorial.html

```$application = new \Phalcon\Mvc\Application($di);``` とか書いて、フォーカスを合わせると以下のような表示が出るので捗りますね。

```
Phalcon\Mvc\Application::__construct(\Phalcon\DI $dependencyInjector) 
\Phalcon\Mvc\Application

Parameters:
 
\Phalcon\DI $dependencyInjector
```

--


とりあえず、今日はこんな感じで。
【Swift】公式ドキュメントをお昼休みにまとめてみた【第一回】

![Swift](http://cdn-ak.f.st-hatena.com/images/fotolife/m/matekiki/20140603/20140603203636.png)

# 概要
今日の２時から４時まで行われたWWDC、リアルタイムで見られていた方お疲れ様でした。
私もストリーミングを見ながら、[テンション高めで色々つぶやいていました。](https://twitter.com/kousuke_sima)

さて、今回のWWDCは原点回帰というかなんというか、エンジニアのエンジニアによるエンジニアのためのキーノートだったように思います。

デバイスの発表一個もなかったしw

ということで、そんなエンジニア得な発表で一番目を引いたのが掲題の[Swift](https://developer.apple.com/swift/)でしょう。

今回はそのSwiftについて、[公式ドキュメント](https://itunes.apple.com/gb/book/swift-programming-language/id881256329?mt=11)の中の*A Swift Tour*をざっくり通勤電車の中で読んでみたので、そこで気になった点をお昼休みに適当にまとめてみましたという内容です。

![WWDC2014](http://cdn-ak.f.st-hatena.com/images/fotolife/m/matekiki/20140603/20140603203651.png)


# ちな、iOS歴
iPhone SDKだったころからいじってます。アプリも何個か出してます
（最近はもっぱら[Titanium](http://www.appcelerator.com/titanium/)でJSでしか書いてないですが）

# A Swift Tour
それでは旅にでましょう、ガリバーっぽく、[スイフト](http://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%A7%E3%83%8A%E3%82%B5%E3%83%B3%E3%83%BB%E3%82%B9%E3%82%A6%E3%82%A3%E3%83%95%E3%83%88)だけに

## 論理行末は改行なのかな？
よく分からんが見た感じ

## 型宣言が後置修飾
Scalaｽｷｰにはお馴染みですね。動的型付けやるのには後置修飾の方が省略とかしたときに直感的です。

```swift
let impInt = 70
let implDouble = 70.0
let expDouble: Double = 70
```

（一応マークダウンのコード引用で書いたんですが、swiftのシンタックスハイライトは当然ないですよね、分かります）

## Swiftの関数は[第一級関数](http://ja.wikipedia.org/wiki/%E7%AC%AC%E4%B8%80%E7%B4%9A%E9%96%A2%E6%95%B0)
これもScalaとかモダンな言語やってると大変当たり前ですね。
何て説明してるかというと、

>Functions are a first-class type. This means that a function can return another function as its value.

つまり、関数が値返すんで変数に詰めたり、関数の引数に関数入れたりできます。まあ、改めて言うまでもないですね。

## structとかいうキーワード
こんな感じで、classキーワードと同じように使うようです

```swift
struct Card {
    var rank: Rank
    var suit: Suit
    func simpleDescription() -> String {
        return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
    }
}
```

classキーワードとの差異は、
>One of the most important differences between structures and classes is that structures are always copied when they are passed around in your code, but classes are passed by reference.

とのこと。参照と値で異なる感じで

## コンストラクタとデストラクタ
それぞれ、initとdeinit。

## classの例
ざっくりこんな感じになるよう

```swift
class Square: NamedShape {
    var sideLength: Double
    
    init(sideLength: Double, name: String) {
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSides = 4
    }
    
    func area() ->  Double {
        return sideLength * sideLength
    }
    
    deinit() {
        // do something
    }
}
```

まあ、違和感はほとんどないシンタックスになってます。
普通のPG（フルスタック？）なら、上の公式ドキュメントちょろちょろ眺めながら、今日からでもすんなり書けるのではないですかね、よく分かんないですけど。

あえて言えば、下記の仕組みがまだ詳細に*A Swift Tour*以降のドキュメントを読まないとよく分かりません。

* willsetキーワード
* mutingキーワード

お昼休み終わっちゃったんで、あとはまあおいおいやる気が出たときにでもノシ
Node.jsのBDDフレームワーク Vows

http://vowsjs.org/

[passport](https://github.com/jaredhanson/passport)のstrategyを書いてみようと
他のフレームワークを眺めていたら、いくつかのstrategyで使われてたので、メモ。

# 例

```js:division-by-zero-test.js
var vows = require('vows')
  , assert = require('assert');

vows.describe('Division by Zero').addBatch({
  'when dividing a number by zero': {
    topic: function () {
      return 42 / 0;
    },
    'we get Infinity': function (topic) {
      assert.equal(topic, Infinity);
    }
  },
  'but when dividing zero by zero': {
    topic: function () {
      return 0 / 0;
    },
    'is not a number': function (topic) {
      assert.isNaN(topic);
    },
    'is not equal to itself': function(topic) {
      assert.notEqual(topic, topic)
    }
  }
}).run();
```

# 詳細

振る舞いを記述する場合

```js
var suite = vows.describe('subject');
```

`addBatch()` 内にテスト項目となるContextを記述する。

```js
suite.addBatch({
   'A context': {},
   'Another context': {}
});
```

順番に記載したい場合は、連続して呼び出せる。

```js
suite.addBatch({/* run 1st */})
     .addBatch({/* 2nd */})
     .addBatch({/* 3rd */});
```

## topic

`vows`は`topic`に設定した関数の結果を`assert`でチェックする。

```js
suite.addBatch({
  'A context': {
    topic: function () {/* Do something async */},
    'I am a vow': function (topic) {
      /* Test the result of the topic */
    },
    'A sub-context': {
      /* Executed when the tests above finish running */
    }
  }
});
```

ちなみにContextはネスト出来る。

## 実行

`run()` で実行。

```
vows.describe('subject').addBatch({/* ... */}).run();
```

# 所感

`topic` の使い方さえ把握すれば、内容も把握しやすく
`vows`をinstallするだけで、簡単にBDDができるので手軽。

# リンク

[Vows公式](http://vowsjs.org/)
「egitがなんかおかしい」という方々、情報交換したいです。

開発でEclipseを使用しています。
egitプラグインでGitを使っているのですが、なんかおかしいです。
同じような方いませんか？情報交換したいです。

#症状
###変更していないファイルが変更したことになっている
チーム同期化で同期化すると、変更していないファイルも変更したことになってしまいます。ファイル同士をエディタで比較すると変更はないです。
発生頻度は5回に1回程度です(前より多くなりました)。

#考えられる原因
###不明
環境を構築しなおすなどしていますが良くなりません。
正しく動作している人の環境と比べても違いは特にないです。

###上書きコミットが要因という説も。。。
上書きコミットをしていると上記のようなことが起こるみたいなのですが、上書きコミットはしていないです。

#対処法
###コマンドを使用する
コマンドを使用して作業を行っています。egitはビジュアル的な部分(ヒストリー等)を見るために使っています。

###あるコマンドを使うと一時的になおった
チーム同期化でおかしいときに、git　status　コマンドを打ちます。
このとき、コマンドベースではちゃんと変更が加わったファイルのみが表示されます。その状態でももう一度チーム同期化を行うと、変更が加わったファイルのみが表示されます。
branchを指定して同期化するときは、git　diff　<branch名>　を打つと、同様に変更が加わったファイルのみが表示されるようになります。
cp

```py
#!/opt/local/bin/python2.7 
import os 
import shutil 
f = open('cp.sh', 'r') 
for line in f: 
        f = line.rstrip("\n") 
        d = "2014060302/" + os.path.dirname(line) 
        print f 
        #print d 
        shutil.copy(f, d) 
```
http://docs.python.jp/2.6/library/os.html 
http://docs.python.jp/2/tutorial/inputoutput.html 
http://docs.python.jp/2/library/os.path.html 
http://docs.python.jp/2/library/shutil.html
Git初心者に役立つ「よく使うコマンド集」


Git歴4ヶ月の初心者です。
業務で初めてGit、GitHubに触りました。Eclipseのegitを使っていたのですが、egitのバグ(なのかな?)で開発が進まない!!ということでコマンドを使い始めました。
このページの目的は「このページ開いておけばコマンド困らない」とGit初心者が思えることです。
つまり、頻繁に使用するコマンドを集めていこうと思います。


##ブランチを作成する
>git　branch　<新しいbranch名>

##ブランチを切り替える
>git　checkout　<切り替えたいbranch名>

##現在のブランチの状態を確かめる(変更したファイルないかな？等)
>git　status

##索引に追加する
>git　add　<ファイル名>

もしくは
>git　add　.(ピリオド)

ですべてのファイルを索引に追加できます

##コミットする
>git　commit

これだとコミットメッセージがつかないです
なので
>git　commit　-m　”コミットメッセージ”

でコミットメッセージまで決められます

##(コミットや索引に追加する前に)変更したファイルをもとに戻したい
>git　checkout　<戻したいファイル名>

もしくは
>git　checkout　.(ピリオド)

で変更したすべてのファイルを元に戻すことできます

##ブランチ一覧を見る
>git　branch

チェックアウトしているブランチには星マークがつきます

##コミットログを見る
>git　log　-5

で、直近から5つ前までのコミットログ(ID、コミットメッセージなど)を見れます
mkdir

```py
#!/opt/local/bin/python2.7 
import os 
f = open('cp.sh', 'r') 
for line in f: 
        path = os.path.dirname(line) 
        if not os.path.exists(path): 
                os.makedirs(path) 
```

http://docs.python.jp/2.6/library/os.html 
http://docs.python.jp/2/tutorial/inputoutput.html 
http://docs.python.jp/2/library/os.path.html 
http://docs.python.jp/2/library/shutil.html
プロセスの多重起動をアドバイザリロックで防止する for PHP

これ↓の PHP 版です。

 - [Bash - プロセスの多重起動をアドバイザリロックで防止する・改 - Qiita](http://qiita.com/ngyuki/items/cc4f6aeaa9b53baa3b68 "Bash - プロセスの多重起動をアドバイザリロックで防止する・改 - Qiita")

```php
<?php
function single()
{
    static $fp;
    $fp = fopen(__FILE__, "r");

    if (is_resource($fp) == false)
    {
        throw new \RuntimeException("unable open self");
    }

    $wouldBlock = false;

    if (flock($fp, LOCK_EX|LOCK_NB, $wouldBlock) == false)
    {
        if ($wouldBlock)
        {
            return false;
        }

        throw new \RuntimeException("unable lock self");
    }

    return true;
}

if (single() == false)
{
    echo "process is running.\n";
    exit();
}

$pid = getmypid();
echo "pid $pid\n";
echo "wait 10 sec ";

for ($i=0; $i<10; $i++)
{
    sleep(1);
    echo ".";
}

echo "\n";
```

この方法なら後処理のことはなにも考えなくてもカーネルがよきに計らってくれます。`kill -KILL $pid` で殺されても大丈夫です。
Jena-Ontologyの利用方法

覚書ついでにQiita投稿のテスト
http://jena.apache.org/documentation/ontology/#creating-ontology-models
から抜粋．

Ontologyモデルの用意
` OntModel m = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM );` 
この際，
`OntModelSpec.`
で適用するOWLを決定できる．
SourceKitService Terminated Editor functionality temporarily limited.


Xcode 6 beta をインストールして、新規でプロジェクトを作成したらシンタックスハイライトが効かず「SourceKitService Terminated Editor functionality temporarily limited.」とエラーアラートが出続けました。

![sourcekitserviceterminated.png](https://qiita-image-store.s3.amazonaws.com/0/33505/8092ffa7-dae0-88a8-8406-fa6cf831b75b.png "sourcekitserviceterminated.png")

原因はプロジェクト名を `swift` にしたこと。
なぜなら、モジュール名の予約語に `Swift` があるからですね。

新規で作成する場合はプロジェクト名を `SwiftTest` とか `SwiftSample` にするとよいです。


あーハマった...
Qiita おしらせ Chrome 機能拡張 作りました。

http://ja.ngs.io/2014/06/03/qiita-notifications-crx/

表題のとおりです。以下で公開してます。

https://chrome.google.com/webstore/detail/qiita-notifications/lfaggijcindkbihlopcogjlihmpdpdaa

GitHub Repo はこちら

https://github.com/ngs/qiita-notifications-crx

必要だから着手して勢いで作りきってしまいましたが、既に qiita-notifications という機能拡張があることに、リリースしてから気づきましたw

違いは、

* Qiita 本体とデザインが同じ
* 通知しか機能がない
* Event Pages を使っているからリソース消費が少ない
* Grunt + CoffeeScript + Sass を使っているので、書いてて楽しい

みたいな感じです。

通知しか機能がいらない人はよかったら使ってみてくださいー。

![](https://github.com/ngs/qiita-notifications-crx/raw/master/doc/screen1.png)

![](https://github.com/ngs/qiita-notifications-crx/raw/master/doc/screen2.png)
The Swift Programming Language（Swift言語） をまとめる


[The Swift Programming Language](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/index.html#//apple_ref/doc/uid/TP40014097-CH3-XID_0) 

ぼちぼちアップデートして行く予定
内容もぼちぼちあつくしていきたい

## [About Swift（Swiftって）](http://qiita.com/kiyotaman/items/fc4496e99e504c5da162)

## [Swift Tour（Swift ツアー）](http://qiita.com/kiyotaman/items/dab98d5a0466d628a14a)

## [The Basics（基本）](http://qiita.com/kiyotaman/items/d539070063ed4260f948)
## [Basic Operators（基本演算子）](http://qiita.com/kiyotaman/items/2da61dfd511a10d7dbe1)
## [Strings and Characters（文字列型、文字型）](http://qiita.com/kiyotaman/items/323967e0b52fc4fdc6a0)
## [Collection Types（集合型、Array とか Dictionary）](http://qiita.com/kiyotaman/items/4d41a8081a3c64878f75)
##Control Flow
## [Function（関数）](http://qiita.com/kiyotaman/items/45a62bd8502df8e872ae)
## [Closures（クロージャー）](http://qiita.com/kiyotaman/items/55966cc10ef2ed44c4fd)
## [Enumerations（enum列挙型）](http://qiita.com/kiyotaman/items/33b6fb7556d37dba2bbc)
## [Classes and Structures（クラスと構造体）](http://qiita.com/kiyotaman/items/7743798b102432c98c8a)
## [Properties（プロパティ）](http://qiita.com/kiyotaman/items/54fe453498513fe92164)
## [Methods（メソッド）](http://qiita.com/kiyotaman/items/c5d5e9e0084cf14ad0f6)
## [Subscripts（サブスクリプト）](http://qiita.com/kiyotaman/items/c0289008810187d02b52)
## [Inheritance（継承）](http://qiita.com/kiyotaman/items/8117a83fca30ce304acd)
## [Initialization（初期化）](http://qiita.com/kiyotaman/items/abc4d2854963c57d2335)
## [Deinitialization（デイニシャライゼーション）](http://qiita.com/kiyotaman/items/37959ac3270bc4cf66ea)
##Automatic Reference Counting
##Optional Chaining
##Type Casting
## [Nested Types（ネストされた型）](http://qiita.com/kiyotaman/items/773f6b12149ac47f026b)
##Extensions
##Protocols
##Generics
##Advanced Operators
Fedora に Redisインストール

前準備
tcl8.5 以上をインストール
`wget http://prdownloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz
tar xzvf tcl8.6.1-src.tar.gz
cd tcl8.6.1/unix/
./configure
make
make install
`
これで /usr/local/bin/ に tclsh がはいるので準備完了
redis をインストール
`wget http://download.redis.io/releases/redis-2.8.9.tar.gz
tar zxvf redis-2.8.9.tar.gz
cd redis-2.8.9
make
make install
`
redis-server でサーバーが起動する

tcl を入れるのに時間かかったけどよくわからない…

参考
http://www.seeds-std.co.jp/seedsblog/792.html
http://www.geocities.co.jp/SiliconValley/4137/dir1/tinstall.html
http://k-mats.github.io/blog/2013/03/15/install-redis/
PHPにおける真偽値について

###PHPにおける真偽値について

|値|if($var)|isset|empty|is_null|
|--:|:--:|:--:|:--:|:--:|
|$var=1|**TRUE**|**TRUE**|FALSE|FALSE|
|$var=""|FALSE|**TRUE**|**TRUE**|FALSE|
|$var="0"|FALSE|**TRUE**|**TRUE**|FALSE|
|$var=0|FALSE|**TRUE**|**TRUE**|FALSE|
|$var=NULL|FALSE|FALSE|**TRUE**|**TRUE**|
|$var|FALSE|FALSE|**TRUE**|**TRUE**|
|$var=array()|FALSE|**TRUE**|**TRUE**|FALSE|
|$var=array(1)|**TRUE**|**TRUE**|FALSE|FALSE|

引用元
http://d.hatena.ne.jp/sngmr/20080209/1202520832
Swift の変数やプロパティの値監視について


変数でもプロパティでも書き方は変わらない

``` C:Sample


var piyo: String = "hoge" {
willSet{
    NSLog("now:%@", piyo) // set 前の値
    NSLog("new:%@", newValue) // set 予定の値
}
didSet{
    NSLog("now:%@", piyo) // set 後の値
    NSLog("old:%@", oldValue) // set 前の値
}
}

piyo = "fuga" // piyo を書き換える


```

``` C:実行結果

// willSet
now:hoge
new:fuga

// didSet
now:fuga
old:hoge

```

### willSet
```willSet``` は実際に値が set される前に呼ばれる、```willSet``` 内では変数名（プロパティ名）で現在の値に、```newValue```で新しくセットされる予定の値にアクセスする事が出来る。

### didSet
```didSet``` は値が set された後に呼ばれる、```didSet``` 内では変数名（プロパティ名）で set 後の値に、```oldValue```で set される前の値にアクセスする事が出来る。
Debug.Log用にEclipseのLogcatの行数増やす

メモリの調査はいつもながら大変！
LogCatに出力してひたすら追うしかない

Debug.LogErrorだとLogCatに表示されなかったなあ、
Debug.Logだと表示されるんやけど
んん～なんでやろー　そんなに違いはないと思うけど!

LogCatの行数たりなくなったので、
EclipseのPreferenceから行数を増やす。

多分しばらくしたら忘れるので
スクリーンショットを貼ってメモっておこう

[LogCat_LineCount.png](https://qiita-image-store.s3.amazonaws.com/0/17904/cb36c959-4124-d659-470a-d2e2709b64bf.png)
Swift Extension memo


Extension が気になったので、それを試しにやってみてのメモ書き

クラスで試す

## クラス作成

```swift
class Car {
	var name : String?
	var campany : String = "N/A"

	init (name: String) {
		self.name = name
	}
}

```

## 継承

```swift
class Beatle : Car {
	init(name: String) {
		super.init(name: name)
		super.campany = "Volkswagen"
	}
}
```


## Extension

```swift
extension Car {
	func drive () -> Bool {
		println("\(name) do running.")
		return true;
	}
}
```

## 実行

```swift
 25> let b = Beatle(name: "My \U+FFF0My \U+FFF0\U+FFEF\U+FFBC")
b: Beatle = {
  lldb_expr_0.Car = {
    name = "My My "
    campany = "Wergen"
  }
}
 26> b.drive
$R1: () -> Bool =
 27> 
 28> b.drive()
My My  do running.
$R2: Bool = true
```

シェルでは?を書いたら何か壊れた。けど、 Extension して追加したメソッドは、子クラスでも使えた。


## Double 型の Extension

型に Extension ができるっぽい。

```swift
  1> 
  2> extension Double {
  3.         var byte: Double { return self }
  4.         var kb:  Double { return self * 1_000.0 }
  5.         var kbi: Double { return self * 1_024.0 }
  6.         var mb:  Double { return self * (1_000.0 * 1_000.0) }
  7.         var mbi: Double { return self * (1_024.0 * 1_024.0) }
  8.         var gb:  Double { return self * (1_000.0 * 1_000.0 * 1_000.0) }
  9.         var gbi: Double { return self * (1_024.0 * 1_024.0 * 1_024.0) }
 10. }   
 11> 
 12> ( 1000.mb + 1.gb + 24.mb ) / 1.mb
$R1: Double = 2024
```

定数でやってたことを、Extension でできるようになった。

## 感想

1. わりとさくっと使えるのと、型に Extension ができるようになったのは面白い
2. extension などでクラスのプロパティには self.name ではなく name だけでいいってのにハマッタ。
@EmbeddedIdによって埋め込まれた@Embeddableな複合PKのうち一つのフィールドを@GenereatedValueしたい(暫定対応)。


表題が長いですが...。

やりたい事は、表題のままです。
例えば、こんなテーブル構造になっていたとします。

![kobito.1401795133.583506.png](https://qiita-image-store.s3.amazonaws.com/0/11214/e177b720-53c0-48e8-adba-fbcb6e2ddf37.png "kobito.1401795133.583506.png")



NetBeansの自動生成機能を利用するとこのようなオブジェクトになります。

```Java
@Entity
@Table(name = "SAMPLE_USER", catalog = "")
@Data
public class SampleUser implements Serializable {
    private static final long serialVersionUID = 1L;
    @EmbeddedId
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected SampleUserPK sampleUserPK;
    @Column(name = "UPDATE_DATE")
    @Temporal(TemporalType.TIMESTAMP)
    private Date updateDate;
}

@Embeddable
@Data
public class SampleUserPK implements Serializable {
    @Basic(optional = false)
    @Column(name = "ID", nullable = false)
    private int id;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 100)
    @Column(name = "NAME", nullable = false, length = 100)
    private String name;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 300)
    @Column(name = "MAIL_ADDRESS", nullable = false, length = 300)
    private String mailAddress;
}
```

この`SampleUserPK#id`はPostgreSQLのSerial型なので、`@GeneratedValue`を付与したくなります。

しかし残念ながら答えは、分かりませんでしたorz...

なので、`@EmbeddedId`を外して`@IdClass`で対応しました。
正解が知りたいです...。

```diff
@Entity
@Table(name = "SAMPLE_USER", catalog = "", schema = "main")
+@IdClass(SampleUserPK.class)
+@Data
 public class SampleUser implements Serializable {
     private static final long serialVersionUID = 1L;
-    @EmbeddedId
+
+    @Id
+    @Basic(optional = false)
+    @Column(name = "ID", nullable = false)
     @GeneratedValue(strategy = GenerationType.IDENTITY)
-    protected SampleUserPK sampleUserPK;
+    private int id;
+    @Id
+    @Basic(optional = false)
+    @NotNull
+    @Size(min = 1, max = 100)
+    @Column(name = "NAME", nullable = false, length = 100)
+    private String name;
+    @Id
+    @Basic(optional = false)
+    @NotNull
+    @Size(min = 1, max = 300)
+    @Column(name = "MAIL_ADDRESS", nullable = false, length = 300)
+    private String mailAddress;
+
     @Column(name = "UPDATE_DATE")
     @Temporal(TemporalType.TIMESTAMP)
     private Date updateDate;

     public SampleUser() {
     }
}

 @Embeddable
 @Data
 public class SampleUserPK implements Serializable {
-    @Basic(optional = false)
-    @Column(name = "ID", nullable = false)
     private int id;
-    @Basic(optional = false)
-    @NotNull
-    @Size(min = 1, max = 100)
-    @Column(name = "NAME", nullable = false, length = 100)
+
     private String name;
-    @Basic(optional = false)
-    @NotNull
-    @Size(min = 1, max = 300)
-    @Column(name = "MAIL_ADDRESS", nullable = false, length = 300)
+
     private String mailAddress;

     public SampleUserPK() {
     }
}

```
VMware vCenter ConverterでP2Vする

物理マシンを仮想化する事をP2V (Physical to Virtual)というらしい。
古い物理のLinuxサーバーを仮想化してVMware ESXiに集約したい。

![vc07.png](https://qiita-image-store.s3.amazonaws.com/0/42887/697caa70-c3ca-99e7-92ea-876a44df1d62.png)


## イメージ

ネットワーク的に接続が可能か確認しておく

![vc06.png](https://qiita-image-store.s3.amazonaws.com/0/42887/815d9a68-5a92-d6f9-7090-fcf228155dcb.png)

また物理サーバーへはrootでログインできる必要があると思います。



## VMware vCenter Converter をインストール

ダウンロード
http://www.vmware.com/jp/products/converter

サーバーを操作しているWindows機にvCenter Converterをインストールします

## VMware vCenter Converter でP2V

特に意識せず設定すれば問題なくいけました。

* VMware vCenter Converterを起動
* Convert machine を選択
* [Source System] Source typeをPowerd-on machineにして remote machine 
* [Destination System] VMware ESXiの情報を入れる
* [Destination Virtual Machine] VMWare ESXiのインスタンスリストが見れる。仮想サーバー名等を設定
* [Destination Location] 仮想ディスクの保存先のdatastoreなどを選択

最後まで設定したらConvertが開始される。
Statusが完了になったらESXi側に変換した仮想マシンができてる。

変換中物理サーバーのプロセスを確認すると

```tar --one-file-system --sparse -C /usr -cf - .```

というコマンドが走っていたので、実際の移行では整合性や負荷について考慮する必要があると思います。(極力サービスを停止して行う、など)

ここで「一般的なシステム エラーが発生しました」となる場合、クライアントからESXiサーバーにSSHできなかったり、ESXiのサーバーから物理マシンにSSHできなかったりの可能性があるので確認する。

また、LVSボリュームの場合はConvert時の設定でターゲットレイアウトを基本に変換する必要がある。

(参考)
http://www.umasugi.com/~h070017/201205060001_ja.html

基本的にはこれでできた仮想マシンが起動すれば終わり。

## Kernel Panicで起動しない場合はinitrd.imgを再作成

LVSの変換を忘れたり、それ以外でもなぜかKernel Panicが起きて起動しない時があった。
エラー時のメッセージは

```bash
* Mounting /dev/sda5 on /sysroot
mount: mounting /dev/sda5 on /sysroot failed: No such file or directory
mkmod: /sysroot/dev/console : No such file or directory
mkmod: /sysroot/dev/null : No such file or directory
mkmod: /sysroot/dev/zero : No such file or directory
* Switching / to /sysroot
switch_root: bad newroot /sysroot
Kernel panic - not syncing: Attempted to kill init!
```

こういうときはinitrd.imgを再作成する必要があるらしい。
以下を参考に作業を行う
https://www.centos.org/forums/viewtopic.php?t=24563

現在のディスクではKernel Panicで操作できないのでLinux系LiveCDで仮想マシンを起動してディスクを操作します。

* vSphere Clientで作られた仮想マシンのプロパティを表示。
* オプション -> 起動オプション -> 強制的にBIOSセットアップ にチェック
* Linux系LiveCDをデバイスから選択する
* 再起動。
* BIOS画面が立ち上がったらbootの設定をCDにして起動。
* Ubuntuが起動したらターミナルを起動して操作。

今回はUbuntuのLive CDでブートしました。
ちなみに今回の移行対象物理サーバーはこんな感じのパーティション

```
/dev/sda5 /
/dev/sda1 /boot
/dev/sda7 /home
/dev/sda2 /usr
/dev/sda3 /var
```

マウントポイントを作成

```
mkdir /mnt/root
```

hddデータをマウント

```
mount /dev/sda5 /mnt/root
mount /dev/sda7 /mnt/root/home
mount /dev/sda2 /mnt/root/usr
mount /dev/sda3 /mnt/root/var
mount --bind /dev /mnt/root/dev
mount -t proc proc /mnt/root/proc
mount -t sysfs sysfs /mnt/root/sys
```

chrootしてlabelが張り直しフラグをたてる

```
chroot /mnt/root
touch .autorelabel
```

initrdの再作成。こんなコマンドです。
mkinitramfs -o [出力パス] [カーネルバージョン]

```
(例)
mkinitramfs -o /boot/initrd.img-2.6.26-2-686 2.6.26-2-686
```

第2引数がなければ uname -rの結果を入り、Live CDのカーネルバージョンになってしまうので注意。

無事にinitrd.imgが再作成できたら再起動で正常にブートできる。（はず）

## これでもカーネルパニックする場合

* fstab grub.confの内容は見る
* hdaでsdaになってたりしないか
* 仮想マシンのHDDの設定をSCSIからIDEに変更してみたりする

似たエントリ
VMware vCenter Converterで5.5環境にP2Vしてみた
http://qiita.com/mnagaku/items/3f0b3285328b5072493d
Gmailで大量のメールアドレスを作成する

テストで大量のユーザ情報を必要な時にGmailを使えば実際に存在するメールアドレスを作る事が出来る。
hoge@gmail.com が実際に存在するメールアドレスだとして
hoge+0001@gmail.com +と任意の文字列を組み合わせればhoge@gmail.comのエイリアスになる。
hoge+0001@gmail.com hoge+0002@gmail.com ... と作って行けば簡単に大量のメールアドレスが作成出来ます。
mavenでオレオレ証明書を付けてるリポジトリを使う

社内環境などで保証のない証明書を使ってる場合のオプション

こちらから
[オレオレ証明書のmavenリポジトリからゲッツする - Muddy River](http://fujiriko59.hatenablog.com/entry/2013/11/11/191830 "オレオレ証明書のmavenリポジトリからゲッツする - Muddy River")
元ドキュメント
[Apache Maven Wagon :: Providers :: HTTP Provider - Maven Wagon HTTP](http://maven.apache.org/wagon/wagon-providers/wagon-http/ "Apache Maven Wagon :: Providers :: HTTP Provider - Maven Wagon HTTP")

----

まず、認証局やらの確認を全て許可する
`-Dmaven.wagon.http.ssl.insecure=true
-Dmaven.wagon.http.ssl.allowall=true`


こいつでダメなら証明書の有効期限かもだ。こいつはコトだぜ！
次のオプションで有効期限を無視
`-Dmaven.wagon.http.ssl.ignore.validity.dates=true`

まとめるとこういう形。長い……
`mvn clean compile -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true -Dmaven.wagon.http.ssl.ignore.validity.dates=true`
Booleanは`true`と`false`のみ

Boolean以外で条件判断しようとするとエラーになる。

```
let i = 1
if i {
    // this example will not compile, and will report an error
}
```
比較演算子を使って条件判断するとコンパイルできる。

```
let i = 1
if i == 1 {
    // this example will compile successfully
}
```

参考資料
* [Booleans | The Swift Programming Language: The Basics](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-XID_425)
* [The Swift Programming Language: Basic Operators](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/BasicOperators.html#//apple_ref/doc/uid/TP40014097-CH6-XID_88)
SwiftでUIViewController+UITableView

こちらの記事がTLに流れてきました。

* [SwiftでUIViewController](http://qiita.com/bellx2/items/226ea6122d8be4ade879)

同じようなことを自分もやったのでメモを残します。
`UITableView`の実装をSwiftでやってみた話です。

## ViewController.swift

StoryboardにUITableViewを貼り付けて、`datasource`と`delegate`を繋いだ状態。

配列 texts の中身の文字列をセルに表示するところまで。

``` ViewController.swift
import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
                            
    @IBOutlet var tableView : UITableView
    
    var texts = ["hello", "world", "hello", "Swift"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int  {
        return texts.count
    }

    func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath:NSIndexPath!) -> UITableViewCell! {
        let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell")
        cell.text = texts[indexPath.row]
        return cell
    }
    
    func tableView(tableView: UITableView?, didSelectRowAtIndexPath indexPath:NSIndexPath!) {
        var text: String = texts[indexPath.row]
        println(text)
    }
    
}
```


こんな感じで書けます。

補完がなんか気持ち悪い感じで気持ち悪かった…