OmniAICreator/Qiita-1.07M huggingface dataset:
[SystemVerilog]svlibでCPUオペコードっぽいものを定義しようと試みた。

##はじめに
svlibのドキュメントを眺めていたら、使えそうなものがあったので試しにやってみた。
svlibに関してのこれまでの投稿記事はこちら。

* [svlibの紹介](http://qiita.com/tethys_seesaa/items/f4d10976677cdc8a63c0)
* [svlibがバージョンアップしてた。](http://qiita.com/tethys_seesaa/items/c0ebee313e61aed17a3f)

今回は列挙型を拡張するクラスを使ってみる。

##Utilities for enumeration types
クラスはこんな感じで定義されている。

```sv
class EnumUtils #(type ENUM = int);
  typedef ENUM qe[$];
  typedef logic [$bits(ENUM)-1:0] BASE;

  static function ENUM fromName     (string s);
  static function int  pos          (BASE   b);
  static function bit  hasName      (string s);
  static function int  maxNameLength();
  static function bit  hasValue     (BASE   b);
  static function qe   allValues    ();
  static function ENUM match        (BASE   b, bit requireUnique = 0);
endclass: EnumUtils
```

ドキュメントは、メソッド名がソースコードと微妙に **違っている。** 要注意。
メソッドの機能の説明はここではドキュメントに譲る…といいたいが、まだまだドキュメントの説明は **荒っぽい。**

##CPUオペコードっぽいものを定義
このクラスを使うと、列挙型の変数にいろいろ便利なユーティリティをつけることができる。
そこで、ドキュメントの例を参考に、某AVRのオペコードを模してみる。

オペコードは全ビット使い切って定義することはあまりないので、連想配列でもできるものの、このクラスを使った方が便利そう。

##コード
こんな感じで書いてみた。

```sv
// # r = source register id
// # d = destination register id

// #mnemonic opcode      desc
// NOP     0000:0000:0000:0000 # no operation
// MOVW    0000:0001:dddd:rrrr # copy register word (pair to pair)
// MULS    0000:0010:dddd:rrrr # multiply signed, R1:R0 = Rd * Rr
// MULSU   0000:0011:0ddd:0rrr # multiply, s16 = s8 * u8
// FMUL    0000:0011:0ddd:1rrr # fractional multiply, unsigned
// FMULS   0000:0011:1ddd:0rrr # fractional multiply, signed
// FMULSU  0000:0011:1ddd:1rrr # fractional multiply, s16 = s8 * u8

`include "svlib_macros.svh"

module tb ();

  import svlib_pkg::*;

  typedef enum logic[15:0] {
    NOP     = 16'b0000_0000_0000_0000,
    MOVW    = 16'b0000_0001_xxxx_xxxx,
    MULS    = 16'b0000_0010_xxxx_xxxx,
    MULSU   = 16'b0000_0011_0xxx_0xxx,
    FMUL    = 16'b0000_0011_0xxx_1xxx,
    FMULS   = 16'b0000_0011_1xxx_0xxx,
    FMULSU  = 16'b0000_0011_1xxx_1xxx
  } op_t;

  typedef EnumUtils#(op_t) op_util;

  task exists (string c);
    if(op_util::hasName(c))
      $display("%s op exists this model.", c);
    else
      $display("%s op DON'T exist in this model.", c);
  endtask

  task print_all_op();
    op_t  opq[$];
    opq = op_util::allValues();

    foreach(opq[i]) $display("%s", opq[i].name);
  endtask

  initial begin

    exists("MOV");
    exists("MOVW");
    print_all_op();

    $finish(1);

  end

endmodule
```

ここでは、入力された文字列が存在するかどうかを行うタスク(extists)と定義されているオペコードを全部出力させるタスク(print_all_op)を書いてみた。

実行されると、「MOV」は定義されていないのでDON'Tが出力され、「MOVW」は逆の出力が出てくる。
その後、定義したオペコード一覧が出力される。

##今後に期待
毎回書いているような気もするが…。

今回は応用の利きそうなクラスに出会えたので、個人的にはもうちょっと他もみていこうかと思う。
PhotoshopでPDFから画像抜き出し


PDFからPhotoshopで画像を書き出すスクリプト。
実行して、フォルダ選択ダイアログでPDFのあるフォルダを指定します。
MacではCS4〜CC2014までで動くのを確認。Windowsは分かりません。

```javascript:pdfから画像抜き出し.jsx
#target "Photoshop"

(function(){
    //画像が5000px以上ならば書き出し、全部出すなら0
    var minPx = 5000;
    var pdfOpt = new PDFOpenOptions();
    //ページ数か、画像の番号か
    pdfOpt.usePageNumber = false;

    var psdOpt = new PhotoshopSaveOptions();
    psdOpt.alphaChannels = false;
    psdOpt.annotations = false;
    psdOpt.embedColorProfile = false;
    psdOpt.layers = true;
    psdOpt.spotColors = false;

    var folderObj=Folder.selectDialog("PDFのあるフォルダを選択してください");
    if(!folderObj) return;
    var fileObjs = folderObj.getFiles(/[^\.]+.pdf/i);
    if(fileObjs.length){
        for(var i=fileObjs.length-1;i>=0;i--){
            main(fileObjs[i],pdfOpt,psdOpt,minPx);
        };
        alert("埋め込み画像を書き出しました。");
    }
})();

function main(fileObj,pdfOpt,psdOpt,minPx){
    //page 開くページ番号
    pdfOpt.page = 1;
    app.displayDialogs = DialogModes.NO;
    for(;;){
        try{
            var doc=open(fileObj, pdfOpt, false);
            if(doc.width*doc.height>=minPx){
                  var imgFilePath=fileObj.parent+"/"+doc.name+".psd";
                  var imgFile=new File(imgFilePath);
                  doc.saveAs(imgFile, psdOpt, false, Extension.LOWERCASE);
            }
            doc.close(SaveOptions.DONOTSAVECHANGES);
            pdfOpt.page++;
        }catch(e){
            //$.writeln(e);
            app.displayDialogs = DialogModes.ALL;
            break;
        };
    };
};
```
BrowserSyncでレスポンシブデザイン対応のアプリ開発効率化

Google Web Starter Kitを利用していて、とても気持ちよかったので[BrowserSync](http://www.browsersync.io/)について調べてみました。

## 何するもの？

レスポンシブデザインのWebサイトを作成する場合、たくさんのデバイスを使ってテストする必要があります。  
BrowserSyncを使うと、ブラウザで行った操作、及びコード変更を複数デバイスに対して同期させることができます。  

## 具体的にできること

* __スクロールやクリック、リロード、フォームでの操作を複数デバイスにミラーさせる（！）__
* HTML、CSS、イメージなどソースコードの変更があった際に、自動でブラウザアップロード
* GruntやGulpとかと連携できる
* __Desktop, tablet, Mobileでブラウザの同期ができる（！）__
* Back-endに依存しないので、PHPでもASPでもRailsでもなんでも使える
* Node.jsで作っているので実行環境はWindowsでもMacでもLinuxでもOK

つまり、PCのモニタ、タブレット、スマホでブラウザ開いて、確認用URLを表示しておけば、コード変更時に勝手にブラウザをリロードしてくれます。  
さらにそれだけではなく、PCで行った操作がタブレット上でもスマホ上でも勝手に行われるのです！

実際動かしてみるとかなり楽しいです。

以下のエントリにgulpと連携して導入する方法をまとめてあるので、興味のある方は見てみてください。
[BrowserSyncでうきうきレスポンシブ対応アプリ開発 - ぶるーすくりーん](http://mid0111.hatenablog.com/entry/2014/07/03/214329)
Toastのタッチイベントを検出する

【お詫び】(2014/7/3 22:11追記)
これが使えるのはGalaxyだけのようでした…

タイトル通りです。Toast#setViewやToast#getViewがあるように、Toastというのはただ単にViewを表示しているだけなので、タッチイベントも検出可能です。
その気になればボタンをつけてクリックとかも検出できますが割愛させていただきます。
以下サンプルコードです。

```java
import android.app.Activity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity{
    private Toast mToast;
    private int count = 0;
    protected void onCreate(android.os.Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mToast = Toast.makeText(this, "0", Toast.LENGTH_LONG);
        
        mToast.getView().setOnTouchListener(new View.OnTouchListener() {
            
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                case MotionEvent.ACTION_UP:
                    mToast.cancel();
                    mToast = Toast.makeText(MainActivity.this, String.valueOf(++count), Toast.LENGTH_LONG);
                    mToast.getView().setOnTouchListener(this);
                    mToast.show();
                    break;

                default:
                    break;
                }
                return true;
            }
        });
        mToast.show();
    };
}
```
取り急ぎの記事なので何も解説していませんがここらで失礼します。
コールバック地獄とasync.js

サーバ側でnode.js、クライアント側ではjQueryはじめknockout.jsとか使ってますが、どうしてもDB周り（サーバはもちろん、クライアント側もIndexedDBなんか使ってるときとか）は

* Connectして
* クエリ投げてカーソル受け取って
* そのカーソルからデータをフェッチして何かしらのコレクションに突っ込んで
* 全部突っ込んだらコレクションを返す

みたいな処理を書くのはよくあること
似非コードで書くと

```js
foo.connect(function(err, connection){
	connection.open('bar', 'user', 'password', function(err, db){
		db.query('something query', function(err, cursor){
			var result = [];
			cursor.forEach(function(err, row){
				result.push(row);	
			});
			return result;
		});
	});
});

```
エラー処理全く書いてないのにコレとか、どんだけインデント深くなるねん・・・と今後加わるであろう処理を考えて戦慄したり、結果が空で？となったり。
結果が空は、今でもちょっとしたサンプル的なものをPHPでPDO使ってるときの感覚で書いてると、今でもたまにやらかします

ということで、少し前から[async.js](https://github.com/caolan/async)を愛用しております
ESの新しいバージョンだとPromiseとかも使えるらしいので今後どうなるかはわかりませんが(´･ω･｀)

さて、async.jsですがnode.jsで使う場合はnpmで入れればいいし、ブラウザサイドで使う場合もasync.jsを scriptタグで読み込めばいいだけというお手軽さ。

ドキュメント読むと、いっぱいあって何を使えばいいのやら・・・というのが最初の感想でしたが、今のところよく使っているのは

* async.waterfall()
* async.each()
* async.eachSeries()
* async.map()
* async.mapSeries()

ぐらいです。async.parallell()とかも使い方によっては面白いです。
each()とeachSeries()、map()とmapSeries()の違いは順番を保持したまま実行するのか、順不同かもしれないけど全部やることはやるよっていうスタンスの違い

さっきの処理をasync.waterfall()で書きなおすと

```js
async.waterfall([
	function(nextProcess){
		foo.connect(nextProcess);	
	},
	function(connection, nextProcess){
		connection.open('bar', 'user', 'password', nextProcess);
	},
	function(db, nextProcess){
		db.query('something query', nextProcess);
	},
	function(cursor, nextProcess){
		cursor.toArray(nextProcess);
	}
], function(err, result){
	//	途中でエラーがあってもなくても最後はここにたどり着く
	return err ? [] : result;
});

```
となります

waterfallの名の通り、前の関数でやった処理結果を受けて次の処理→その結果を受けて・・・というパイプライン的な処理をするならこれが一番しっくりきました
MongoDBのNativeドライバのように、コールバックがfunction(err, something)で、エラーがなかった場合はerrにnullが入ってくるようなものあれば、そのままnextProcessというコールバック関数に丸投げできます

コールバック関数はそれ以外のときでも

* nextProcess(null, 次の, 関数へ, 渡す, 引数, リスト);
* nextProcess(非null値);

のように呼びます

nextProcess()は第1引数がnullの場合、第2引数以降と最後にコールバック関数をくっつけたものを配列で定義された次の関数に渡してくれます
もしnextProcess()の第1引数に非nullが入ると、配列で定義された関数のパイプラインを抜け出し、配列の外で定義されているfunction(err, result)に飛びます
配列に定義されたパイプラインの最後の関数のnextProcess()もそこに飛んできます

これで、配列の外に定義してある関数function(err, result)はerrがnullならパイプラインに定義されてる処理がつつがなく完了した、非nullなら途中で何かしらエラーがあった、ということがわかるという寸法
SSHトンネルで他のサーバに繋ぐために

#概要
LinuxMintで、MySQLクライアントであるWindows用のHeidiSQLをWine上で動作させます。

で、他のサーバ上のMySQLにSSHトンネル経由で接続する際には、初回のみコマンドラインからSSHトンネルを張らなければなりません。
なぜかというと、初回にSSH接続する際に、「Are you sure you want to continue connecting (yes/no)?」っていうあれが聞かれてしまうからです。

おそらくcofnigとかでその質問を無視できるようにできると思うのですが、今回はそれに気づく前に対処してしまったのでメモします。

#どうやって？
まずは普通にHeidiSQLのSSHトンネルを設定します。
なお、HeidiSQLのSSH接続には、plink.exeとPutty用の秘密鍵が必要です。
両方heidisql.exeと同じディレクトリに放り込んでおけばわざわざパスを書かなくていいので楽です。
上記のファイルの配置とHeidiSQLの接続先などの設定が済んだら、普通に接続します。
すると、ダイアログでエラーメッセージが表示されます。
そのエラーメッセージに実行しようとしたplink.exeとオプションが書かれているので、そのコマンドをコマンドラインで　`wine cmd`を実行してWindowsのコマンドプロンプトもどきの状態で実行する必要があります。


#その他
ちなみに、HeidiSQLを終了させてもSSHトンネルは張られっぱなしになります。
そのため、再度HeidiSQLを実行して同じサーバに接続しようとしてもエラーになってしまいます。（すでにSSHトンネルが張られているのに同じポートにまたSSHトンネルを張ろうとしているため）
対策としてポート番号をその時だけ変えるのが楽ちんです。
もちろんOSを再起動してもOK
RuboCop | Style/GlobalVars

# RuboCop | Style/GlobalVars

## 概要

RuboCopの「Style/GlobalVars」警告について。

組み込み以外の自分で定義したグローバル変数に対して警告を出します。
例外として警告対象外にする変数名を配列で指定することが可能です。
デフォルトは除外対象なしです。

## GlobalVars

各設定値での検証結果をまとめます。

### 検証プログラム

global_vars.rb

~~~ruby
print $HOGE
print $HIGE
print $HAGE
print $ARGV # => 組み込みは警告対象外
~~~

### 実行結果 デフォルト の場合



※明示的に設定しているが、デフォルト値なので何も設定しなくてもよい

~~~yaml:.rubocop.yml
GlobalVars:
  AllowedVariables: []
~~~

~~~bash
$ rubocop global_vars.rb
Inspecting 1 file
C

Offenses:

global_vars.rb:1:7: C: Do not introduce global variables.
print $HOGE
      ^^^^^
global_vars.rb:2:7: C: Do not introduce global variables.
print $HIGE
      ^^^^^
global_vars.rb:3:7: C: Do not introduce global variables.
print $HAGE
      ^^^^^

1 file inspected, 3 offenses detected
~~~

### 実行結果 $HOGE , $HAGE を警告対象外にする場合 の場合

~~~yaml:.rubocop.yml
GlobalVars:
  AllowedVariables: [$HOGE, $HAGE]
~~~

~~~bash
$ rubocop global_vars.rb
Inspecting 1 file
C

Offenses:

global_vars.rb:2:7: C: Do not introduce global variables.
print $HIGE
      ^^^^^

1 file inspected, 1 offense detected
~~~
iPhoneのSafariから定型文をツイートするブックマークレット

iPhoneのSafariで気になったページをツイートするとき、iOSの標準機能やブックマークレットが使えますが、引用符やハッシュタグなどフォーマットを自分好みに変えたいことがありますよね。

そんなときは自分でブックマークレットを作ることで対応することができるので、その方法を紹介します。

## 1. ブックマークレットの元となるJavaScriptの作成

Twitterアプリを使いたい場合は、URLに ``twitter:`` スキームを使うことで起動できるところがポイントです。

WebのTwitterでツイートする場合

```js
var text = '"' + document.title + '" ' + location.href + ' #読んだ';
location = 'https://twitter.com/intent/tweet?text=' + encodeURIComponent(text);
```

Twitterアプリでツイートする場合

```js
var text = '"' + document.title + '" ' + location.href + ' #読んだ';
location = 'twitter://post?message=' + encodeURIComponent(text);
```

## 2. ブックマークレットに変換

[Bookmarklet Crunchinator](http://ted.mielczarek.org/code/mozilla/bookmarklet.html) などのサービスを使って、1. で作ったJavaScriptをブックマークレットURLに変換します。

```
javascript:(function(){var text='"'+document.title+'" '+location.href+' #%E8%AA%AD%E3%82%93%E3%81%A0';location='twitter://post?message='+encodeURIComponent(text);})();
```

## 3. iPhone のブックマークに追加

最後に、2. で作ったURLをSafariのブックマークに追加します。ブックマークレットの登録方法がちょっと面倒ですが、説明も面倒なので（ry

## 4. 気に入ったページをブックマーク

あとはツイートしたいページで 3. のブックマークを選択すれば、カスタマイズしたメッセージが入力された状態でTwitterアプリが開きます。

## 補足

カスタムURLスキームを使うことで、標準アプリを含めて様々なアプリを起動できるようです。連携できそうなアプリを考えてみると、面白いかもしれません。

* [Apple URL Scheme Reference: About Apple URL Schemes](https://developer.apple.com/library/ios/featuredarticles/iPhoneURLScheme_Reference/Introduction/Introduction.html)
jQuery BlockUI Pluginと$.ajax()を使って通信中を演出する

[jQuery BlockUI Plugin](https://github.com/malsup/blockui/)という、それっぽく通信中などのブロック演出をしてくれるプラグインがあって愛用しています。
これとjqueryの$.ajax()でDeferredな書き方が非常に相性が良いのでメモ。

```js
$.blockUI({
	//	メッセージとかのBlockUIの設定
});
/**
	↑でブロック画面を出してから
*/
$.ajax({
	//	Request MethodやURLなどの設定
}).success(function(result){
	//	正常終了
}).error(function(jqHXR){
	//	エラー処理(404とか色々)
}).always(function(){
	//	常に行う処理の一環としてブロック画面解除
	$.unblockUI();
});
TortoiseSVN パッチ(patch)の概要


# はじめに

TortoiseSVNを使っていて、絆創膏のマーク（青とか緑の :x: ）が気になったので、これがなんなのかを調べたメモです。

※表記は英語版です。参考文献[1]に日本語版での説明があります。

# パッチとは

パッチとは、端的に言うと差分（diff）のファイルです。以下に示す方法で生成したパッチは、その差分を別のブランチや他の人のワーキングコピーにマージするのに使うことができます（これは「パッチの適用」と表現されます）。

パッチはその目的で2種類に分けることができます[2]。

**(1) 未コミットの差分を示すパッチ**
　　- まだコミットしたくない変更を、誰かに見てほしいとき
**(2) リビジョン間の差分を示すパッチ**
　　- コミット権がなく、コミットまたはマージを誰かに依頼したいとき

次節で具体的な生成の方法を説明します。

# パッチの生成

パッチは .diff または .patch という拡張子で保存します。

## (1)未コミットの差分を示すパッチを生成

1. 赤いアイコンが表示されているフォルダの上で[TortoiseSVN] > [Create Patch...]
2. 小窓に差分のあるファイルが表示されているのを確認してOK
3. パッチの名前を指定して保存

## (2) リビジョン間の差分を示すパッチを生成

1. フォルダの上で[TortoiseSVN] > [Show log]
2. 差分を取りたいリビジョン範囲をCtrlで選んで右クリック
3. [Show differences as unified diff] を選択
4. 差分が表示されるので、メニューの [File] > [Save as...] で保存

# パッチの適用

1. パッチを作った時と同じ構造のフォルダの上で [TortoiseSVN] > [Apply patch...]
2. 生成したパッチを選択
3. 小窓のファイルをダブルクリックして差分を確認した後、下のボタンで実行
4. （そのままマージしたい場合）パッチの当たったファイルはアイコンが赤になっているので、これをコミットする

# 感想

ファイルを丸ごと送って差分を見てもらうよりもパッチのファイル１つを送る方がコミュニケーションが円滑になりそうです。

# 参考文献
[1] [いつか役に立つ パッチの作成と適用について （Subversion + TortoiseSVN）](http://miso-soup3.hateblo.jp/entry/2013/10/12/022737)
[2] [What are patches used for in SVN? (Stackoverflow) ](http://stackoverflow.com/questions/597739/what-are-patches-used-for-in-svn/597745)
覚書（逐次更新）：ブートローダー，/sbin/init，ランレベルとか

サーバー構築で少し触れる機会があったので・・・

##ブートローダーとは
ブートローダー：カーネルを起動するためのソフトウェアのこと
カーネル：OSの中核部分のこと

Linuxでは **LILO** (Linux Loader)と **GRUB** (Grand Unified Bootloader)が使われています。

##LILO
```text:参考URL1から引用
LILOは古くからLinuxで利用されてきたブートローダです。特徴としてはカーネルの位置情報をLILO自身内部に情報として持ち、その情報からカーネルをロードするというものです。LILOは後述するファイルシステムを認識しないため、カーネルの位置をHDDの物理的な位置情報で判断しています。この物理的な位置情報をブロックリストといいます。
LILOはこのブロックリストを自身の内部に保持しており、ブロックリストを参照してカーネルをロードします。そのためLILOは「ブロックリスト参照型」のブートローダといわれます。
```

##GRUB
```text:参考URL1から引用
GRUBは高性能ブートローダでLILOとはことなる仕組みをもちます。GRUBの特徴の1つにファイルシステムを認識できることがあげられますが、これはLILOとはことなりカーネルの位置をファイルパスで指定することができることを意味しています。このようなタイプを「ファイルシステム認識型」といいます。

こういったLILOやGRUBの動作を経て、カーネルがロードされることになるわけですが、このカーネルがロードされてからがOS自身の起動シーケンスであり、カーネルの制御下でOSとして機能するための様々な処理が行われます。
```

##/sbin/initプロセス
/sbin/initプロセス：Linuxカーネルが一番最初に起動するプロセスのこと(プロセスIDは1)

また、プロセスには親子関係が存在し、/sbin/initプロセスがルートになります。

##ランレベル
/sbin/initプロセスが起動するプロセスはLinuxの実行形態を変化させます。
この実行形態を **ランレベル** といいます。

| ランレベル | 説明 |
|:--|:--|
| 0 | 停止 |
| 1 | シングルユーザーモード |
| 2 | マルチユーザーモード（テキストログイン、NFSサーバーは停止） |
| 3 | マルチユーザーモード（テキストログイン） |
| 4 | 未使用 |
| 5 | マルチユーザーモード（グラフィカルログイン） |
| 6 | 再起動 |

シングルユーザーモード： システム管理者のみログインができる。
テキストログイン：CUI
グラフィカルログイン：GUI


##ランレベルを表示する。
```
# runlevel
```

##ランレベルを変更する。
```
# init $lunlevel
```

##参考URL
1. http://www.lpi.or.jp/column/linux/linux5.shtml
pythonでcsv-jsonの変換ツールを作るときに困ったこと

日本語を含むcsvファイルをjsonファイルに変換する際、文字コード変換で悩みました。
 > UnicodeDecodeError: 'ascii' codec can't decode byte...

読込むcsvファイルの文字コードがutf-8nに変換してある事を前提に次のコードで解決しました。

```lang:csvToJson.py
# -*- coding: utf-8 -*-
#モジュール
import codecs
import csv
import json

#CSVファイルを開く
f = open('読込むcsvファイル指定', 'r')
reader = csv.DictReader(f, fieldnames = ("フィールド名1", "フィールド名2", ...,"フィールド名N"))
print "CSV loaded."

#JSON形式に変換
out = json.dumps( [row for row in reader], sort_keys=False, ensure_ascii=False, encoding='utf_8' )
print "JSON parserd."

#JSONファイルに保存
f=codecs.open('書き出すjsonファイル指定','w', 'utf_8')
f.write(out)
print "JSON saved."
```
#考察
python初心者でわからないことだらけですが、次のような内部処理で文字化けを防いでいる？
openでファイルを読込むときに文字コードを指定せず、csv.DictReaderでunicodeオブジェクトの
dictionary を作成。
json.dumpsでensure_ascii=Falseにすることでunicodeオブジェクトを扱えるようにし、encodingでutf-8を指定する事でoutオブジェクトの中身をutf-8にする事で、日本語を文字化けせずに出力する事が出来ている？
Sensu Community Plugins を使って Mackerel にユーザ定義メトリックを投稿する


[Mackerel](https://mackerel.io/) にはユーザ定義のメトリックが簡単に投稿できるようだから何かプラグインでも書いてみようかなと思ったのだけど、そういえば Sensu 互換の出力だったなと思い出し楽をするために [Sensu Community Plugins](https://github.com/sensu/sensu-community-plugins) を使ってみた。今回は nginx の wainting や active_connections の値を投稿してみることにする。

まず github から clone して bundle install する。

```console
git clone https://github.com/sensu/sensu-community-plugins
cd sensu-community-plugins
bundle install --path=vendor/bundle
```

次に、使いたいプラグインに必要な引数を見てみる。今回だったら[このあたり](https://github.com/sensu/sensu-community-plugins/blob/master/plugins/nginx/nginx-metrics.rb#L19)。`--url` で nginx_status の URL を直接指定するか `--host` `--port` `--statspath` をそれぞれ指定する。

[Mackerel エージェントの設定ファイル](http://help-ja.mackerel.io/entry/spec/agent#config-file)に登録するための簡単なシェルスクリプトを書く。rbenv とか bundler の流儀がよくわかってないけどこんなのでいいはず。

```bash:mackerel-nginx.sh
#!/bin/bash

PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

cd path/to/sensu-community-plugins

bundle exec plugins/nginx/nginx-metrics.rb -u http://127.0.0.1/nginx_status
```

これを実行するとメトリックが出力される。

```
localhost.nginx.active_connections  20      1404382449
localhost.nginx.accepted    677130  1404382449
localhost.nginx.handled     677130  1404382449
localhost.nginx.handles     1965703 1404382449
localhost.nginx.reading     0       1404382449
localhost.nginx.writing     6       1404382449
localhost.nginx.waiting     14      1404382449
```

ちなみに上記の `--url` 等の他に `--schema` というオプションもあってこれを指定すると出力するメトリックの `localhost.nginx` の部分を指定できるのでグラフに表示されるラベルをいじることができる。

最後に Mackerel エージェントの設定ファイルに設定を追加する。

```/etc/mackerel-agent/mackerel-agent.conf
[plugin.metrics.nginx]
command = "/path/to/mackerel-nginx.sh"
type = "metric"
```

しばらく待つとめでたく Mackerel にグラフが表示される。

### 感想

特にはまることもなくとても簡単にメトリックが追加できて便利だった。まだまだ[たくさんプラグインがある](https://github.com/sensu/sensu-community-plugins/tree/master/plugins)ようなので色々ためしてみようと思う。
vagrant + serfでjoinが出来ない


serfをvagrantでVMを2台立ち上げて試した所
`private_network`によりを複数指定した時に何故かjoin出来ずハマった

* VM1...eth1 192.168.33.10
* VM2...eth1 192.168.33.11


##原因

両VMともに、同じIPであるeth0にバインドしてserfが立ち上がっていた

```
[root@localhost vagrant]# ip -4 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    inet 192.168.33.11/24 brd 192.168.33.255 scope global eth1
```

このeth0のアドレスは複数台のnodeが全て同じ`10.0.2.15`になっている

そこで特に何も考えずに`serf agent`を実行すると・・・

```
==> Log data will now stream in as it occurs:

    2014/07/03 10:06:44 [INFO] agent: Serf agent starting
    2014/07/03 10:06:44 [INFO] serf: EventMemberJoin: localhost.localdomain 10.0.2.15
    2014/07/03 10:06:45 [INFO] agent: Received event: member-join

[root@localhost ~]# serf members
    2014/07/03 10:06:49 [INFO] agent.ipc: Accepted client: 127.0.0.1:14419
localhost.localdomain  10.0.2.15:7946  alive
[root@localhost ~]#
```

##join失敗

```
[root@vagrant-web01 vagrant]# ping 192.168.33.11
PING 192.168.33.11 (192.168.33.11) 56(84) bytes of data.
64 bytes from 192.168.33.11: icmp_seq=1 ttl=64 time=2.10 ms
^C
--- 192.168.33.11 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 641ms
rtt min/avg/max/mdev = 2.109/2.109/2.109/0.000 ms


[root@vagrant-web01 vagrant]# serf join 192.168.33.11
    2014/07/03 10:09:52 [INFO] agent.ipc: Accepted client: 127.0.0.1:36688
    2014/07/03 10:09:52 [INFO] agent: joining: [192.168.33.11] replay: false
    2014/07/03 10:09:52 [INFO] serf: EventMemberJoin: localhost.localdomain 10.0.2.15
    2014/07/03 10:09:52 [INFO] agent: joined: 1 nodes
Successfully joined cluster by contacting 1 nodes.
[root@vagrant-web01 vagrant]#     2014/07/03 10:09:53 [WARN] memberlist: Got ping for unexpected node 'localhost.localdomain'
    2014/07/03 10:09:53 [INFO] agent: Received event: member-join
    2014/07/03 10:09:55 [WARN] memberlist: Got ping for unexpected node 'localhost.localdomain'
    2014/07/03 10:09:57 [WARN] memberlist: Got ping for unexpected node 'localhost.localdomain'
    2014/07/03 10:09:58 [WARN] memberlist: Got ping for unexpected node 'localhost.localdomain'
    2014/07/03 10:09:59 [INFO] serf: EventMemberFailed: localhost.localdomain 10.0.2.15
    2014/07/03 10:10:00 [INFO] agent: Received event: member-failed
```

自動的にeth0が指定され
他のVMもeth0が10.0.2.15になっており
そのIPにserfさんがバインドしてるため上手くjoin出来ず。
一応通信は出来てるっぽいんだけどな

eth0とeth1を取り替えようとしたりeth0に違うipを持たせようとしたり
eth1でルーティングの設定しようか考えていた所・・・・

##解決

[公式サイト](http://www.serfdom.io/docs/agent/options.html)にオプション一覧があった
`serf help`なんて飾りだった

```
serf agent -iface eth1 $
```

両VMともに上記コマンドで指定してる違うIPをバインドして立ち上がり、無事にjoin
SwiftでURLエンコードする


※追記コメントで知りました。iOS7以降なら下記もOKとのことシンプル！

iOS7以降OK
====

~~~swift
let encodedString = targetString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())
let decodedString = encodedString.stringByRemovingPercentEncoding;
~~~

iOS7未満対応？
====
APIに日本語を投げ込むときなどこんな感じで。
デフォルトの関数で用意して欲しい…。

~~~swift
extension String {
    
    func escapeStr() -> String {
        var raw: NSString = self
        var str = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,raw,"[].",":/?&=;+!@#$()',*",CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding))
        return str
    }
}

class ViewController: UIViewController { 
    
    let defaultRadius = 300
    
    @IBOutlet var searchBar: UISearchBar
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        var query = searchBar.text
        var encoded = query.escapeStr()
    }
    
}
WEBベースのファイルエクスプローラー(Pydio)をインストールする

#公式サイト
[Pydio](http://pyd.io/download/)
[File Download](http://sourceforge.net/projects/ajaxplorer/files/pydio/)

#環境
Debian Wheezy 64bit
Pydio 5.2.3

#インストール
debパッケージからインストール

1. [ダウンロードサイト](http://sourceforge.net/projects/ajaxplorer/files/pydio/)のstable-channelから、debパッケージをダウンロード

2. ```dpkg -i pydio_all.deb```でインストール
3. 依存パッケージがないと怒られるので解決して再試行
```aptitude install libapache2-mod-php5
aptitude install php5-gd php5-mcrypt```

4. /usr/share/pydioにインストールされるので、apacheの公開ディレクトリにシンボリックリンクを張る
  ```ln -s /usr/share/pydio /var/www/pydio```
5. http://(IPアドレス)/pydio/へアクセス
6. セットアップウィザードで管理者パスワードを指定してインストール完了
ap_log_rerror()の第5引数＝NULLの時はAPLOG_NOTICE以上しか出ない

apacheのmoduleを作る時に、ログ出力の為に **ap_log_rerror()** 関数を使いますが、
引数が多くてメンドクサイので以下のようなマクロを作って使っている例が良くあります。

```c:hogehoge_module.c
#define DEBUGLOG(...) ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, NULL, MODULE_NAME ": " __VA_ARGS__)


    ～何かの処理～
    DEBUGLOG("Log output : %s", messages);
    ～処理続き～

```

これはこれで便利なんですが、
「このマクロで出すlogはデバッグでよい」
って事で、

```c:hogehoge_module.c
#define DEBUGLOG(...) ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, NULL, MODULE_NAME ": " __VA_ARGS__)
```

と、APLOG_DEBUGレベルにすると、httpd.confで「LogLevel debug」を指定しても一向にログファイルに出てこない…なんて経験ありませんか？

これ、実はソースを読んで行くと、 **ap_log_error()** 関数の第5引数って、本当だったら **server_rec*** を入れるべきなんですね。
でも、server_rec* ってhandlerとかに来るので、config関係の中とかには出てこないし、
handler内でもちょっとしたロジックサブルーチンの中にまでserver_rec*を引き回すのは面倒だったりしますよね。
(かといってmodule globalの変数に入れるとオチるし…(当たり前))

この第5引数が0の時の挙動って、「stderrエラーログへ出力する」って言うロジックに落ちてまして、
その中でログレベルがNOTICE以上か？って判定入ってたりします。

なので、第5引数に0を入れた場合は第3引数にAPLOG_NOTICE以上を設定しないと永久に吐かれないLOGを実装していることになります。

なので、デバッグログを出したい時は、server_rec*、request_rec*が来ている所でap_log_error()、ap_log_rerror()を使わないとダメなようです。

若しくは、マクロで

```c:hogehoge_module.c
#define DEBUGLOG(...) ap_log_error(APLOG_MARK, APLOG_DEBUG, s, NULL, MODULE_NAME ": " __VA_ARGS__)
```

みたいに決め打ちしてしまって、実際の関数の中で「server_rec* の名前は必ずr」とルール決めて書くしかないですね。
(他に良い手段あったら教えてほしいです…。)

そんなわけで、「module内でどこでも気軽にlog出したい！」と考えている人はAPLOG_NOTICE以上を設定するようにしてください…。

※ ちなみに、文中で「0は第5引数」と書いてありますがこれは間違いではありません。第一引数に指定されているAPLOG_MARKは「__file__,__line__」と定義されているマクロなので、これ1個で2つ分の引数になります。
覚書（逐一更新）：メソッドチェーン

この前会社でメソッドチェーンについて少し触れることがあったのでメモメモφ(ﾟ-ﾟ=)ｶﾘｶﾘ

##メソッドチェーンとは
メソッドチェーン：メソッドを連続的に呼び出す記法のこと

呼び出し側のオブジェクトを返却するメソッドで繋ぎます。
jQueryのコードで多用されているやつですね。分かります。

こんなやつ

```
A(a).B(b).C(c). ... .N(n);
```

呼び出し側のオブジェクトを返すことが約束されているため、
返却値に対して次のメソッドを生やすことができます。

##メリット
* 複数の処理をまとめて記述できる。
* 不要な一時変数を減らせる。

##デメリット
* あまり使い過ぎると何が何だか分からない・・・
MAMP htmlでphpを動かす

MAMPを導入し、htmlにphpを埋め込んだけど、
phpが効いていないのか、echoで表示されなかった。

色々調べたら、これだった。
http://www.9142.net/blog/2013/03/13/mamp-cgi/

/Application/MAMP/conf/apache/httpd.conf の138行目付近にある以下の部分を修正する。

<pre>
AddType application/x-httpd-php .php .phtml
</pre>

上記を下記に修正。

<pre>
AddType application/x-httpd-php .php .phtml .html .htm
</pre>

MAMP再起動で完了
Adobe AIR アプリで TFL テキストを使った際のエラーの回避

##現象

Adobe AIR アプリ内で「TFLテキスト」を使うと、パブリッシュ時に次のエラーが出る

```
Warning: Ignoring 'secure' attribute in policy file from http://fpdownload.adobe.com/pub/swz/crossdomain.xml.  The 'secure' attribute is only permitted in HTTPS and socket policy files.  See http://www.adobe.com/go/strict_policy_files for details.
```

##回避方法

Flash のメニューから［ファイル］→［ActionScript 設定］を開き、下部にある「デフォルトリンケージ」を「コードにマージ」に変更する。

![スクリーンショット 2014-07-03 18.30.19.png](https://qiita-image-store.s3.amazonaws.com/0/24420/e22a906c-0ca5-30a2-8c73-3a765c71fc85.png)
※ 画像はデフォルトから変更後です。
スマートフォンのブラウザで、スクロールの開始・終了のタイミングで何かする

以下のようにscrollイベントをハンドリングしようとしても、iOSだと期待した動作にならない。

```js
$(window).scroll(function() {

});
```

これは、scrollイベントはスクロールが終了したタイミングで1度だけ呼ばれるため。
このため、スクロール中に何かしようとしても、スクロールが終わった後に実行されて悲しいことになる。

対処としては、タッチイベントをハンドリングしてそれっぽく実装する。

```js
var scrollTop;
var scrollCheckTimer;
$(document).ready(function() {
  $(window).bind('touchmove', function() {
    if (!scrollCheckTimer) {
      // start scroll
      startScroll();

      scrollCheckTimer = setInterval(function() {
        var __scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
        if (scrollTop == __scrollTop) {
          // stop scroll
          stopScroll();

          clearTimeout(scrollCheckTimer);
          scrollCheckTimer = false;
          return;
        }

        scrollTop = __scrollTop;
      }, 100);
    }
  });
});
```
.rubocop.yml設定例

## 概要
うちのチームで使っている.rubocop.ymlの設定内容を公開します。

## 設定内容

```.rubocop.yml
inherit_from: rubocop-todo.yml

# 日本語でのコメントを許可
AsciiComments:
  Enabled: false

# 複数行での「lambda」で「->」による省略記法を許可
Lambda:
  Enabled: false

# モジュール名::クラス名の定義を許可
ClassAndModuleChildren:
  Enabled: false

# メソッド名のprefixに「set_」「get_」を許可
AccessorMethodName:
  Enabled: false

# クラスにコメントを残さない
Documentation:
  Enabled: false

# 「and」「or」の使用を許可
AndOr:
  Enabled: false

AllCops:
  Exclude:
    - db/schema.rb
    - config/unicorn.rb
    - config/unicorn_staging.rb
    - tmp/**/*
```

AndOrを無効にしているのは、「redirect_to xxxx and return」という風に1行に纏めたかったからです。
通常のif文ではand,orは使っていません。

ちなみにrubocop-todo.ymlはこのような感じになっています。
少しずつ直していっていますが、対応が難しいものは.rubocop.ymlに移動すると思います。

```rubocop-todo.yml
# ネストが深すぎる
BlockNesting:
  Max: 5

# クラスの行数が多すぎる
ClassLength:
  Enabled: false

# 循環的複雑度が高すぎる(ifやforなどを1メソッド内で使いすぎている)
CyclomaticComplexity:
  Enabled: false

# 例外を抑制している
HandleExceptions:
  Enabled: false

# 行が長すぎる
LineLength:
  Enabled: false

# メソッドの行数が多すぎる
MethodLength:
  Enabled: false

# 引数の数が多すぎる
ParameterLists:
  Max: 12
```

## おまけ
### Jenkinsへの表示
Jenkinsにrubocopの実行結果を表示したかったので'rubocop-checkstyle_formatter'というGemを使っています。

シェルの実行で、
`bundle exec rubocop --require rubocop/formatter/checkstyle_formatter --format RuboCop::Formatter::CheckstyleFormatter --out test/reports/checkstyle.xml`

とし、Checkstyle警告の集計で`test/reports/checkstyle.xml`を指定すれば、
rubocopの指摘がJenkinsに表示されるようになります。

### 長文のリテラルを分割して1行を短くする
`\改行`を使えば、文字列中に改行を含めずに改行することができます。

```rb
hoge='1111111111111111111111111111111111111'\
  '2222222222222222222222222222222222222222'\
  '3333333333333333333333333333333333333333'
```

未検証ですが<<や+を使って文字列の連結を行うよりも早く動作するはずです。
体で覚えたいvimコマンド

## テキスト編集
`ci[囲み文字]` 囲み文字の中を消して、編集モードになる。
囲み文字は
`t`タグ
`"`ダブルクォーテーション
`'`シングルクォーテーション
`(`カッコ
なども使える。
カッコの場合はカッコにカーソルをあわせる必要がある。
`c`を`d`にすると削除のみ。
`c`を`y`にするとコピー。

## 検索
`*` カーソルのある位置の単語を昇順検索（/xxxと同じ動き）
`#` カーソルのある位置の単語を逆順検索（?xxxと同じ動き）
`:noh` 検索結果のハイライトを消去

## 空行削除

    :g/^$/d

## 貼り付け時のインデントずれの対処
vimに貼り付けたときにインデントがずれるのは、自動インデントが有効なためによる。
無効にしてから、貼り付ければよい。

`:set autoindent`　自動インデント有効
`:set noautoindent`　自動インデント無効

## 入力補完
長い名前を持つ変数等を入力するときに積極的に使いたい。

`ctrl + n`　ファイル後方に向けて補完候補を探す
`ctrl + p`　ファイル先頭に向けて補完候補を探す

## ^M(CR)の入力
たまにしか出てこないから、忘れがち。

    ctrl+v ctrl+m


## netrw.vim（vimモードでエクスプローラ）
ディレクトリを`vi`すると、viモードでディレクトリ、ファイル操作ができる。
`-` １コ上の階層へ移動
`enter` 選択中のディレクトリへ移動、またはファイルを開く
`t` 別ウィンドウでファイルまたはディレクトリを開く
`D` 削除
`R` 名前変更
`s` ソート順変更
`x` ファイル実行

ディレクトリを`-``enter`で移動して、ファイルを`t`で開くと快適

## 行内検索
`f[文字]` カーソルから行末に向かって`文字`を検索。
`;`直前の` f[文字]`の繰り返し
`,`直前の` f[文字]`の繰り返し（逆方向）

`c`や`d`と組み合わせると便利
`cf[文字]`カーソルから文字までを編集
`cd[文字]`カーソルから文字までを削除

## インデント
`=` インデント整形
`ggVG`で全選択できるので、全選択状態からの`=`で整形一発。

## 変換
`ctrl + a` 数字に+1
`ctrl + x` 数字に-1
`~` 大文字小文字変換

## ビジュアルモード、矩形選択`ctrl + v`からのコマンド
`d` 削除
`I` 選択範囲の冒頭から挿入
`A` 選択範囲の末尾から挿入
`s` 選択範囲を削除して挿入
`u` 小文字変換
`U` 大文字変換
`~` 大文字小文字変換
`:` 置換（:'<,'>s/[置換前文字]/[置換後文字]/）

## 挿入
`I` 行頭から挿入
`A` 行末から挿入
`O` 一行上から挿入

## カーソル移動
`H` 画面一番上にカーソル移動
`M` 画面中央にカーソル移動
`L` 画面一番下にカーソル移動

## 文字コード変換

`:e ++enc=[文字コード]`
金額入力フィールド

金額入力フィールドを作成について。
フォーマットは日本円（例: ¥100,000）
桁数は10桁まで制限しています。


```objc:VuewController.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>{
}

@property (nonatomic, weak) IBOutlet UITextField* priceField;

@end
```

```objc:VuewController.m
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    
    _priceField.delegate = self;
    
    [_priceField addTarget:self action:@selector(priceEditingStart:) forControlEvents:UIControlEventEditingDidBegin];
    
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


// 金額入力スタート
-(void)priceEditingStart:(UITextField*)textField
{
    
    if([textField.text isEqualToString:@""]){
        [self textField:_priceField shouldChangeCharactersInRange:NSMakeRange(0,0) replacementString:@"0"];
    }
    
}


// 金額フォーマット
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString *text             = _priceField.text;
    NSCharacterSet *charSet    = nil;
    NSString *numberChars      = @"0123456789";
    
    
    static NSNumberFormatter *numberFormatter;
    if (!numberFormatter)
    {
        numberFormatter = [[NSNumberFormatter alloc] init];
        numberFormatter.numberStyle             = NSNumberFormatterCurrencyStyle;
        numberFormatter.currencyCode            = @"JPY";
    }
    
    charSet = [NSCharacterSet characterSetWithCharactersInString:numberChars];
    NSCharacterSet *invertedCharSet = [charSet invertedSet];
    NSString *trimmedString = [string stringByTrimmingCharactersInSet:invertedCharSet];
    text = [text stringByReplacingCharactersInRange:range withString:trimmedString];
    
    text = [self deleteComma:text];
    
    if([text length] < 10){
        
        NSNumber *number = [numberFormatter numberFromString:text];
        
        if (number == nil)
        {
            number = [NSNumber numberWithInt:0];
        }
        
        textField.text = [numberFormatter stringFromNumber:number];
        
    }
    
    return NO;
    
}


// カンマの削除
- (NSString *)deleteComma:(NSString *)targetString;
{
    NSString *_mysetString = [NSString stringWithFormat:@"%@",targetString];
    NSString *_mysetString2= [_mysetString stringByReplacingOccurrencesOfString:@"," withString:@""];
    return _mysetString2;
}

@end
```
Git cmd


##Update Index
``` bash
git update-index --no-assume-unchanged path/to/file.txt
```

##List files
``` bash
git ls-tree -r --name-only master

git ls-tree --full-tree -r HEAD

```

##Create a global .gitignore
``` bash
git config --global core.excludesfile ~/.gitignore_global
```

###Git force a pull to overwrite
``` bash
git fetch origin master
git reset --hard FETCH_HEAD
git clean -df
```

###Git ignore to remove cache
``` bash
git rm -rf --cached .
git add .
```


###Reset to previous origin head
```bash
git reset --hard ORIG_HEAD
```
inject 文の返り値はシャローコピーじゃなくてディープコピーされているくさい

ソースを読んでいないが、あ…ありのまま 今 起こった事を話すぜ！


```rb
office_map = { '東京' => { '銀座' => { '歌舞伎座タワー' => 'ドワンゴ' }, '渋谷' => { 'マークシティ' => 'サイバーエージェント' } } }
shibuya_office_map = office_map['東京']['渋谷']
shibuya_office_map['ヒカリエ'] = 'LINE'
p shibuya_office_map
# { 'マークシティ' => 'サイバーエージェント', 'ヒカリエ' => 'LINE'}
p office_map
# { '東京' => { '銀座' => { '歌舞伎座タワー' => 'ドワンゴ' }, '渋谷' => { 'マークシティ' => 'サイバーエージェント', 'ヒカリエ' => 'LINE' } } }

```

```rb

office_map = { '東京' => { '銀座' => { '歌舞伎座タワー' => 'ドワンゴ' }, '渋谷' => { 'マークシティ' => 'サイバーエージェント' } } }
shibuya_office_map = ['東京', '渋谷'].inject(office_map) { |map, point|
  map[point] ||= {}
}
shibuya_office_map['ヒカリエ'] = 'LINE'
p shibuya_office_map
# { 'マークシティ' => 'サイバーエージェント', 'ヒカリエ' => 'LINE'}
p office_map
# { '東京' => { '東京' => { '銀座' => { '歌舞伎座タワー' => 'ドワンゴ' }, '渋谷' => { 'マークシティ' => 'サイバーエージェント' } } }
# ※'ヒカリエ' => 'LINE' が反映されていない
```
Rails4で論理削除を手軽に実現する。

RailsのO/RマッパーことActiveRecordの削除(delete)は、通常、物理削除の仕様となっています。
これってビジネス利用では結構辛い仕様ですよね？

もちろん、そんな人向けに論理削除に切り替えられるようなgemがいくつも存在しています。

その中で、個人的なお勧めは`kakurenbo`というgemです。

ちなみに他の似たようなgemとの比較は、このgemの作者自身が[やっている](http://alfa.hatenablog.jp/entry/2014/01/26/225852)のがお勧めです。

# インストール

```rb:Gemfile
gem 'kakurenbo'
```

後はいつも通り`bundle update`でインストールされます。

# 設定方法

論理削除対象としたいテーブルに`deleted_at`カラムを追加するだけです。

```bash:Modelsはモデル名に書き換えてください。
$ rails generate migration AddDeletedAtToModels deleted_at:datetime
$ rake db:migrate
```

こうしておくと、モデル側で何も宣言することなく、勝手に論理削除の適用テーブルとなります。

お察しの通り、注意事項があります。

- これ以外の用途で`deleted_at`というカラム名が使えなくなります。
- `deleted_at`カラムにIndexを貼る事をお勧めします・・・
- 全テーブルで自動的に実施されるわけではないので、テーブルごとに手動でmigrationファイルを作ってあげる必要があります。

# 使い方

後は普通にRailsのソースコードを書くだけです。

```rb
Model.find           # 論理削除されていないデータのみが検索される
model.destroy        # 物理削除ではなく、論理削除される
model.destroyed?     # 論理削除されているかどうかをチェックする
```

また、このgemをインストールする事によって、以下のメソッドが使えるようになります。

```rb
Model.with_deleted     # 論理削除済みデータも含めて検索する
Model.only_deleted     # 論理削除されたデータのみを検索する
Model.without_deleted  # 論理削除されてないデータを検索する(findと同じ)

model.destroy(hard: true) # 物理削除する
model.restore!            # 論理削除されたデータを復旧する
```

お手軽ですね。
PHP、mb_convert_encoding()、文字エンコーディングを変換する

PHP、mb_convert_encoding()、文字エンコーディングを変換する
==========


■about
----------

PHP、mb_convert_encoding()、文字エンコーディングを変換する




■code
----------

```php:php
//excel、CSV書き込み
//UTF-8からsjis-winに変換
mb_convert_encoding($a,"sjis-win", "UTF-8")

```




■reference
----------

PHP: mb_convert_encoding - Manual
http://www.php.net/manual/ja/function.mb-convert-encoding.php

[PHP]文字化けせずにCSVファイルを読み込み、配列に変換する | PHP Archive
http://php-archive.net/php/csv-tsv-array/
PHP、fputcsv()、配列をCSVファイルに書き込む

PHP、fputcsv()、配列をCSVファイルに書き込む
==========


■about
----------

PHP、fputcsv()、配列をCSVファイルに書き込む




■code
----------

```php:php
<?php
/* 配列の作成 */
$array = array("Windows", "Mac", "Linux");
 
/* ファイルポインタをオープン */
$file = fopen("test.csv", "a");
 
/* CSVファイルを配列へ */
if( $file ){
  var_dump( fputcsv($file, $array) );
}
 
/* ファイルポインタをクローズ */
fclose($file);
?>

```




■reference
----------

PHP関数 - 配列をCSVファイルに書き込む - fputcsv() - PHP入門 - Webkaru
http://webkaru.net/php/function-fputcsv/

PHP: fopen - Manual
http://www.php.net/manual/ja/function.fopen.php

PHP: fputcsv - Manual
http://jp2.php.net/manual/ja/function.fputcsv.php
SwiftでCoreDataのNSManagedObjectサブクラスを作る


Xcode6-β2でCoreDataのエンティティクラスを作ってみると
なぜかObjective-Cのクラス定義が作られてしまいます。
(Swiftが選べません。)

そのまま使ってしまえばいいんですが、なんとなく気になったので
これをSwiftのクラス定義に置き換える方法を調べてみました。

### 事前準備
1. プロジェクト作成時に"Use Core Data"にチェック
1. Entityを作る

今回は例として、idとnameを持つHogeEntityというエンティティを作ってみました。


### Objective-Cの場合
Xcodeで何も考えないで作るとObjective-Cのクラス定義が自動生成されます。
Xcode > New File... > iOS/OSX - Core Data > NSManagedObject subclass > エンティティを選択

```objc:HogeEntity.h
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>


@interface HogeEntity : NSManagedObject

@property (nonatomic, retain) NSNumber * id;
@property (nonatomic, retain) NSString * name;

@end
```

```objc:HogeEntity.m
@implementation HogeEntity

@dynamic id;
@dynamic name;

@end

```

### Swiftの場合
普通にSwiftファイルを作ります。
Xcode > New File... > iOS/OSX - Source > Cocoa Class > subclass of: NSManagedObject > 略

```swift:HogeEntity.swift
import Cocoa

@objc(HogeEntity)
class HogeEntity: NSManagedObject {
    @NSManaged var id:   NSNumber
    @NSManaged var name: String
}
```

どうやら @NSManaged が @dynamic の代わりみたいです。

次に、エンティティとクラス名を関連づけます。
Objective-Cの場合(Xcodeで自動生成した場合)は不要です。

1. projectname.xcdatamodeldを選択
1. CONFIGURATIONSでEntityを選ぶ。(今回はHogeEntity)
1. Classにクラス名を入力。(今回はHogeEntity)

### まとめ
いろいろ手作業になってしまうので、割り切ってしまうのがいいと思います。
製品版Xcode6ではSwiftのクラス定義を自動で生成できるようになることを信じて。

### 参考
[Generating Swift models from Core Data entities - stackoverflow](http://stackoverflow.com/questions/24015185/generating-swift-models-from-core-data-entities)
KVM ゲストが断続的に遅くなるときの対処法

おためしください。

## 切り分け時にはっきりさせておく事

- ネットワークの問題ではない。
    - ホストとゲストでPingの時間差を調べて著しい差がある。
    - dateコマンドを1秒間隔で吐いているのにも関わらず、断続的に時間が飛ぶ場合は怪しい。

## 操作する所

### ホスト側

KSM(Kernel Samepage Merging)を停止します。

実行中は次のコマンドを実行します。反映まで少々時間がかかる場合があります。また、既存VMの実行にも影響があるかもしれないので、留意してください。

```bash
sudo su -
echo 2 > /sys/kernel/mm/ksm/run
```

また、設定ファイルでも停止させておきます。

```diff:/etc/default/qemu-kvm
- KSM_ENABLED=1
+ KSM_ENABLED=0
```

尚、KSMを切るとホストのメモリ使用量は増加します。オーバーコミットさせている人は留意して下さい。

※ @[meke_meke](https://twitter.com/meke_meke/status/490125979197526016) さんにアドバイスいただきました。ありがとうございました。

### ゲスト側

ホスト側だけで改善しない場合に行います。

ゲストのXMLファイルを書き換えます。ゲストをシャットダウンし、`virsh edit VM_NAME`して編集しましょう。

```diff
 (前略)

   <devices>
     <emulator>/usr/bin/kvm-spice</emulator>
     <disk type='file' device='disk'>
-      <driver name='qemu' type='qcow2' cache='none'/>
+      <driver name='qemu' type='qcow2' cache='none' io='native'/>
       <source file='/var/lib/libvirt/images/YOUR_VM.img'/>
       <target dev='vda' bus='virtio'/>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
     </disk>

 (後略)
```

## 参考資料

- [linux - KVM guest io is much slower than host io: is that normal? - Server Fault](http://serverfault.com/questions/425607/kvm-guest-io-is-much-slower-than-host-io-is-that-normal)
- [Linux カーネル共有メモリーの徹底調査](http://www.ibm.com/developerworks/jp/linux/library/l-kernel-shared-memory/)
- [How to use the Kernel Samepage Merging feature](https://www.kernel.org/doc/Documentation/vm/ksm.txt)
- [Bug #578930 “qemu-kvm: ksmd should have a less CPU-hogging defau...” : Bugs : “qemu-kvm” package : Ubuntu:](https://bugs.launchpad.net/ubuntu/+source/qemu-kvm/+bug/578930) … バグじゃない
Oracle SQL Developer のインストールとOracle + α（Windows編）

## JDKのインストール
1. jdk-7u60-windows-i586.exeを実行してjdkをインストール
2. 特に変更箇所はないので、順次「次へ」で進める。
3. JDKのインストールが終わると、続いてJREのインストールが始まる。
4. こちらも特に変更せず、「次へ」

## Oracle SQL Developerのインストール
1. sqldeveloper-4.0.2.15.21-no-jre.zipを解凍する。
2. 解凍してできたsqldeveloperディレクトリをCドライブ直下に配置する。
3. C:\sqldeveloper\sqldeveloper.exeを実行する。
4. JDKのパスを聞かれるので、「C:\Program Files\Java\jdk1.7.0_60」を指定する。

## Oracle SQL DeveloperでSQL Serverのデータベースを開く方法
1. jtds-1.3.1-dist.zipを解凍する。
2. 解凍してできた「jtds-1.3.1-dist」ディレクトリをCドライブ直下に配置する。
3. Oracle SQL Developer->ツール->プリファレンス->データベース->サード・パーティJDBCドライバ画面の「エントリの追加」から2のディレクトリを指定する。
4. データベース接続の作成画面にSQLServerのタブが表示されていることを確認する。  
※Oracle SQL DeveloperでSQL Serverに接続できるだけで、Oracleのデータベースと連携しているわけではない。

## Oracle と SQL Serverを連携する方法
1. %ORACLE_HOME%\hs\initdg4odbc.oraを下記の内容に編集する。
2. %ORACLE_HOME%\NETWORK\listner.oraを下記の内容に編集する。
3. %ORACLE_HOME%\NETWORK\transname.oraを下記の内容に編集する。
4. 管理->ツール->サービスよりOracleリスナーを再起動
5. Oracle SQL Developerより任意のデータベースに接続し、「データベースリンク」で右クリックして、「新規データベース・リンク」を開く。
6. 名前、ユーザー名、パスワード、サービス名（dg4odbc）を入力してOKをクリックする。
7. 作成されたデータベースリンクを選択し、右クリックし、データベース・リンクのテストをクリックする。
8. 適用ボタンをクリックし、正常にテストされた旨のメッセージが表示されることを確認する。
9. データベースを右クリックし、SQLワークシートを開く。
10. select * from <テーブル名>@<データベースリンク名>を実行して結果が取得できることを確認する。  
※%ORACLE_HOME%はオラクルのルートディレクトリ  
※データベースリンクを作成するにはCREATE DATABASE LINK権限が必要。  
※リンク先は基本参照用なので、リンク先に対して追加や編集はできない。参照した結果をOracleのテーブルに追加するselect insert文を利用するのが一般的なよう。

```ini
#initdg4odbc.ora

...
#
# HS init parameters
#
HS_FDS_CONNECT_INFO = sqlserver　\#任意の文字列
HS_FDS_TRACE_LEVEL = OFF
...
```


```ini
# listner.ora

...
SID_LIST_LISTENER =
  (SID_LIST =
    ...
    (SID_DESC =
      (SID_NAME = dg4odbc)
      (ORACLE_HOME = %ORACLE_HOME%)
      (PROGRAM = dg4odbc)
    )
  )
...
```

```ini
# transname.ora

...  
DG4ODBC =  
  (DESCRIPTION =  
    (ADDRESS_LIST =  
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))  
    )  
    (CONNECT_DATA =  
      (SID = dg4odbc)  
    )  
    (HS = OK)  
  )  
...
```

## マテリアライズドビューについて
1. 名前はビューだが実体はテーブル（SQLの結果をキャッシュしておくテーブル）。
2. テーブル同様、表領域に格納され、インデックスも作成できる。
3. 元のテーブルとの同期が必要で、リフレッシュのタイミングを設定できる。
4. 8iまで？はスナップショットという呼び名だった。
5. create snapshot も create materiarized view も11gではマテリアライズドビューが作成される。
6. Oracle SQL Developer のマテリアライズド・ビューで右クリックして新規作成できる。
7. 通常のビューを使用するよりもパフォーマンスが向上するため、使用が推奨されている。
8. この機能はSQL Serverにはない。

## ストアドプロシージャ（PL/SQL）について
1. 基本知識や文法はhttp://www.shift-the-oracle.com/plsql/を参照
2. Transact-SQL（SQL Serverのプロシージャー言語）との違いは下記参照
 - http://el.jibun.atmarkit.co.jp/g1sys/2010/05/sqlserver-oracl.html
 - http://plaza.rakuten.co.jp/jamshid/diary/201005050002/
[node.js] expressでjsonp

別サーバのデータをとるのにjsonpを使ったときのメモ。
expressのAPIにjsonpがあるのでそれですぐできる。

domainBからdomainAのデータをとる。
domainAはexpressつかっているnode.jsのサーバー。

http://expressjs.com/api.html#res.jsonp

``` javascript:app.js(domainA)
res.jsonp({ message: 'jsonp' })
```

``` html:sample.html(domainB)
<script src="http://domainA/hoge?callback=getJson"></script>
<script>
  function getJson(json) {
    console.log(json);
  }
</script>
```

callbackのところはexpressの設定でrenameできる。

``` javascript:app.js
app.set('jsonp callback name', 'changed');
res.jsonp({ message: 'changed' })
```

``` html:sample.html
<script src="http://xxx.xxx.xxx.xxx/hoge?changed=getJson"></script>
<script>
  function getJson(json) {
    console.log(json);
  }
</script>
```

changedでとれるようになる。
でも使いどころがわからん。。。queryがすでにあるものとかぶったとき？

そういえば受けての処理を即時関数に囲ってたのに気がつかず、
データとれねーって一瞬焦った。
非同期なんだから即時でとれる分けがないじゃーん＞俺
ExcelVBAのバージョン管理方法

# 目的
この記事ではExcelVBAでバージョン管理を行う方法について説明する。
以下のようにWinMergeの差分機能を用いることで、VBAの差分を表示することが可能である。
![b0232065_21525328.png](https://qiita-image-store.s3.amazonaws.com/0/47856/d7098654-2d42-05ac-863c-4ae61f493979.png)


# 手順
## WinMergeの準備

1. [WinMerge](http://www.geocities.co.jp/SiliconValley-SanJose/8165/winmerge.html "WinMerge")のダウンロードを行う

2. ダウンロードページより「Excelからテキストへの変換プラグイン」のExcelToText.sctをWinMergeのMergePluginsフォルダにコピーする。
例："C:\Program Files\WinMerge\MergePlugins"
3. WinMergeを起動してプラグインの自動展開を選択する
![b0232065_21443344.png](https://qiita-image-store.s3.amazonaws.com/0/47856/8b34a3c6-1464-f828-1b71-7c4e588dfc53.png)

##Excelの準備
###Excel 2003の場合
1. Excelを起動
2. [ツール]→[マクロ]→[セキュリティ]
3. [信頼できる発行元タブ]を選択する。
4. [Visual Basic プロジェクトへのアクセスを信頼する]にチェックを付与する。 
![b0232065_21472719.png](https://qiita-image-store.s3.amazonaws.com/0/47856/1437da5a-e5ad-e138-be42-3bbbb1586913.png)

###Excel 2010の場合
1. Excelを起動
2. 開発タブを選択して「マクロのセキュリティ」をクリックする
![b0232065_21482034.png](https://qiita-image-store.s3.amazonaws.com/0/47856/5dca0fea-3aa2-25f8-346f-b431716677aa.png)
3. 「VBAプロジェクトオブジェクトモデルへのアクセスを信頼する」をONにする。
![b0232065_21504100.png](https://qiita-image-store.s3.amazonaws.com/0/47856/43420a03-d6da-e2be-678e-1bc71e1c7eba.png)

## 構成管理ソフトの準備
差分を外部プログラムを用いて行うようにする。

### TrotoiseSVNの準備
1. [TrotoiseSVN]→[設定]を表示する
2. 差分ビュワーを選択してWinMergeを選択する。
![b0232065_2155966.png](https://qiita-image-store.s3.amazonaws.com/0/47856/69a2c992-390b-36b8-577e-9553eec3ce02.png)
設定例：
<code>
C:\Program Files\WinMerge\WinMergeU.exe -e -x -ub -dl %bname -dr %yname %base %mine
</code>

#別解
Ariawaseを用いてファイルをテキストファイルに変更する。
https://github.com/vbaidiot/Ariawase
http://igeta-diary.blogspot.jp/2014/03/what-is-vbac.html

build.batはsrcフォルダの内容をインポートしてXLSファイルを更新する。

以下のコマンドでXLSの内容をエクスポートしてソースをテキストとして出力作成する

```
cscript //nologo vbac.wsf decombine
```

構成管理にテキストとしてソースコードを格納できることと、複数人が同時に１ファイルのソースを修正することができるのは強み。
フォームのデータを取得する関数

jQueryで `$.ajax` `$.post` `$.get` を使う際、
毎回作っているformのデータを抽出する関数です。

## 関数
```js:getPostData.js
function getPostData(selector) {
    var postData = {};
    $(selector).find(':input').each(function(){
        if ($(this).attr("type") == 'checkbox' || $(this).attr("type") == 'radio') {
            if ($(this).is(":checked")) {
                postData[$(this).attr('name')] = $(this).val();
            }
        }
        else {
            postData[$(this).attr('name')] = $(this).val();
        }
    });
    return postData;
}
```

## 使い方
```js:functions.js
$(document).ready(function() {
	$('.submit').click(function() {
		var postData = getPostData('.test_form');
		$.post('/target/url', postData, function() {
			// TODO 処理
		});
	});
});
```
R でクリップボードのデータを手早く可視化する

今日は R でできる、ちょっとした小技を紹介します。

## クリップボードからのデータ取り込み

### R プロンプトの準備

R のプロンプトで次のように文字を入力します。 (エンターキーは押しません)

```r
x = scan("clipboard")
```

なお上記は GNU/Linux または Windows の場合で、 Mac の場合は次のようにします。

```r
x = scan(pipe("pbpaste"))
```

### データをクリップボードに格納する

この状態で Excel などのスプレッドシートや、あるいはターミナルやウェブページなどから、取り込みたい数字の集合を選択してコピーし、クリップボードに格納します。

### クリップボードから R にデータを読み込む

ここで R プロンプトから上記コマンドを入力すると、クリップボードからデータを取り込むことができます。

```r
x = scan("clipboard")
# => Read 15 items
# (15 件のデータが取り込まれた)

x
# => [1] 9640 9211 9006 9066 8747 8326 7702 7358 6871 6352 5744 5155 4914 4863 4612

# 標準偏差を求める
sd(x)
# => [1] 1796.451

# プロッティングする
plot(x)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38501/828965d3-b16e-a2ee-7cd0-0b7373082ead.png)

この技を覚えておけば、ちょっとしたデータをすぐに R に取り込んで統計関数を使ったりデータ可視化をすることができます。

### 画像ファイルに保存する

```r
# 画像ファイルに保存する
png("image.png", width = 480, height = 480, pointsize = 12, bg = "white", res = NA)
```

### データをファイルに保存する

クリップボードから取り込んだデータは write または write.table (データフレームの場合) でファイルに保存することができます。

```r
write(x, "hoge.txt")
```


## 参考

R の初歩
http://oku.edu.mie-u.ac.jp/~okumura/stat/first.html

奥村先生のページには他にも R や統計に関する情報が実に豊富にあるので適宜参照すると良いでしょう。
http://oku.edu.mie-u.ac.jp/~okumura/stat/
赤外線画像の取得を試す

Kinectは通常のColorカメラのほかに赤外線センサーが搭載されており、本体から赤外線の画像を取得することが可能です。

カメラを有効にする際に、ColorImageFormatで赤外線データを選択することができます。

```
kinect.ColorStream.Enable(ColorImageFormat.InfraredResolution640x480Fps30);
```

なお、モードは以下の通り存在しており、解像度、フレームレート、データタイプが数パターン用意されています。

・InfraredResolution640x480Fps30　　赤外線データ（今回使ったもの）
・RawBayerResolution1280x960Fps12　　ベイヤーRAWデータ
・RawBayerResolution640x480Fps30　　ベイヤーRAWデータ
・RawYuvResolution640x480Fps15　　YUVカラーRAWデータ
・RgbResolution1280x960Fps12　　RGBカラーデータ
・RgbResolution640x480Fps30　　RGBカラーデータ（前回使ったもの）
・YuvResolution640x480Fps15　　YUVカラーデータ

RAWデータとは未加工のデジタルデータという意味で、これに様々なアルゴリズムを適用することで画像のカラー変換やフォーマット変換等を行うことができます。
デジタル一眼カメラを趣味にしている人だと比較的詳しい用語ですね。

その他の処理の流れはColor画像取得とほとんど変わりません。
ただし、Bitmap変換において、Color画像取得で使用した Coding4Fun の ToBitmapSource() は使用できませんでした。
今回は BitmapSource.Create() を使用します。

```
using (ColorImageFrame cFrame = e.OpenColorImageFrame()) 
{
    if(cFrame != null)
    {
        byte[] colorData = new byte[Frame.PixelDataLength];
        Frame.CopyPixelDataTo(colorData);

        Color.Source = BitmapSource.Create(
            cFrame.Width, cFrame.Height, 96, 96, PixelFormats.Gray16, 
            null, colorData, cFrame.Width * cFrame.BytesPerPixel);
    }
}
```

赤外線データは16bitのグレースケールとなるため、引数内のPixcelFormatsでは、Gray16 を指定します。
ToBitmapSource()では、これが使用できなかった模様。

前回のようなColor画像を変換する場合は、ここに Bgr32 を指定します。