OmniAICreator/Qiita-1.07M huggingface dataset:
Emscriptenでファイルを読み込むソースをJavaScriptに変換するには

# 背景
OpenGLなソースをEmscriptenでJavaScriptに変換できることは分かったのだが、
OpenGLなソースだとテクスチャーをファイルとして読み込むようなケースが多々ある、
Emscriptenでこういったファイルの読み込みも可能なような記述があるが、
具体的な方法が英語力の低さから分からずにいた。

そんな折、[はてなの人力検索ですばらしい質問と回答](http://q.hatena.ne.jp/1367064416)を発見して、これを手がかりに
C++でファイルを読み込むプログラムをEmscriptenでJavaScriptに変換することが出来た。

# 前提
EmscriptenでJavaScriptに変換された本体のプログラムのファイルアクセスは仮想ファイルシステムを介して行われる。

この為、本体のプログラムを実行する前に、この仮想ファイルシステムに必要なファイルやフォルダの登録が必要となる模様。

[emscriptenのページ](https://github.com/kripken/emscripten/wiki/Filesystem-Guide)では自動でやってくれるやり方もあるようだが、このやり方だと、ファイルの内容がコンパイル時に埋め込まれてします。（まぁ、別ファイルにできるので、こちらを後から変更できそうだが。。）

C/C++のソース中でファイル名を指定して読んでいる場合、
FS.createPreloadedFileを使うと対応できる。

また、前処理内で、動的にデータを作成してしまうAPIも用意されている模様。

対象のファイルはemccを実行するディレクトリを
/としてJavaScript側では扱われる模様
（絶対パス指定ならそのままのパスで扱われる模様）

# 同名ファイルでフォルダが違うファイルを読み込むサンプル

## C++のソース
```c++
#include <fstream>
#include <iostream>

using namespace std;

int
main (int argc, char **argv)
{
  string line;
  ifstream fin ("./input.txt");
  while (getline (fin, line))
    {
      cout << line << endl;
    }
  fin.close ();
  fin.open ("data/input.txt");
  while (getline (fin, line))
    {
      cout << line << endl;
    }
  fin.close ();

  return 0;
}
```

## 前処理用のJavaScriptソースの準備
前処理のJavaScriptでやり事は以下

- 仮想ファイルシステムにフォルダを登録
- 仮想ファイルシステムにファイルを登録

### 前処理用のJavaScript

```javascript:pre.js
Module['preRun'] = function () {
    FS.createFolder(
        '/', // 親フォルダの指定
        'data', // フォルダ名
        true, // 読み込み許可
        true // 書き込み許可(今回の例はfalseでもよさげ)
    );
    FS.createPreloadedFile(
        '/', // 親フォルダの指定
        'input.txt', // ソース中でのファイル名
        '/input.txt', // httpでアクセスする際のURLを指定
        true, // 読み込み許可
        false // 書き込み許可
    );
    FS.createPreloadedFile(
        '/data',
        'input.txt',
        '/data/input.txt',  // httpでアクセスする際のURLを指定
        true,
        false
    );
};
```

## --pre-jsを指定してhtmlファイルを作成
```bash
emcc target.cpp -o target.html --pre-js pre.js
```

## 読み込まれるファイルの用意

```bash
echo "hogehoge" > input.txt
mkdir data
echo "foobar">data/input.txt
```

## HTTPサーバを立てる

```bash
python -m SimpleHTTPServer 8000
```

## ブラウザでアクセスしてみる
http://localhost:8000/target.html

# まとめ
仮想フォルダを準備するというのにちょっと躓きましたが、
思ったより、やってみると簡単だった。はてな人力質問の質問者様、回答者様に感謝です。


以上、ファイルの読み込みのあるCやC++をEmscriptenでJavaScriptに変換する方法でした。

# 関連記事

- [libiconvをemscriptenでjs化し、node.jsで使った](http://abrakatabura.hatenablog.com/entry/2015/04/18/115323)
- [jsdo.itでEmscriptenを動かすときのメモ](http://abrakatabura.hatenablog.com/entry/2014/04/17/072514)
- [slコマンドのWebGL版を作ろうとしたら](http://abrakatabura.hatenablog.com/entry/2014/04/09/071724)
- [Emscriptenでファイルを読み込む](http://abrakatabura.hatenablog.com/entry/2013/10/03/120831)
- [emscriptenでOpenGL](http://abrakatabura.hatenablog.com/entry/2013/07/20/081301)
- [SLコマンドをEmscriptenでWeb化する 2014年秋編](http://abrakatabura.hatenablog.com/entry/2014/11/01/170855)

# Link

- [kripken/emscripten](https://github.com/kripken/emscripten)
- [ファイルを読み込むC言語のプログラムをemscriptenでjavascriptに変換して](http://q.hatena.ne.jp/1367064416)
 - ファイルの扱いが解説されており、勉強になった。
○行目だけ表示

```bash:
$ sed -n '1020p' huge.log
$ sed -n '1020,1030p' huge.log
```

該当行の表示が終わったら`control+c`で終了させる。

うっかりviで開いたが読み込み中の場合、`control+c`を押すと読み込みを途中でキャンセルし、読み込めた箇所までを表示してくれます。
インテントでカスタムオブジェクトを渡す

Intentでカスタムクラスのインスタンスを渡したいときは、[Parcelable](https://developer.android.com/reference/android/os/Parcelable.html)インターフェイスを実装する。

```java
//User.java


import android.os.Parcel;
import android.os.Parcelable;

public class User implements Parcelable{

    protected String mName;
    protected int mAge;
    protected List<User> mFriends;
    protected Car mCar;

    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeString(mName);
        out.writeInt(mAge);
        out.writeList(mFriends);
        out.writeParcelable(mCar);
    }

    public static final Parcelable.Creator<User> CREATOR
            = new Parcelable.Creator<User>() {
        public User createFromParcel(Parcel in) {
            return new User(in);
        }

        public User[] newArray(int size) {
            return new User[size];
        }
    };
    public User(){
        super();
    }

    private User(Parcel in) {
        mName = in.readString();
        mAge = in.readInt();
        in.readList(mFriends, User.class.getClassLoader());
        mCar = in.readParcelable(Car.class.getClassLoader());
    }

}
```

等としておけば、

```java

//SomeActivity.java
User user = new User();

...
//Configure user
...

Intent intent = new Intent(this, AnotherActivity.class);
intent.putExtra("user", user);
startActivity(intent);

```

としておいて、


```java

//AnotherActivity.java

public void onCreate(...
...
   User user = getIntent().getParcelableExtra("user");
...

```

のように使える。
gitでディレクトリツリーの比較・一貫性チェック

自分のはてなダイアリーから転載

gitでディレクトリツリー同士の一貫性チェックをしてみます。
2つのディレクトリツリーが同じものかどうかを調べます。
よく使われるのは、diffとか、findとmd5を使ったりするやり方だと思います。
が、今回使ってみたのはgit。

やってみたことは、

```
git init
git add .
git write-tree
```

これだけ。

これで、そのディレクトリツリーを表すハッシュ値が手に入る。
あとは、これを比較するだけ。
比較とか一貫性チェックって言ってるけど、単純に違うか同じかを確認するだけです。
あと、.gitがあるところではやらないほうがいいと思います。
全ファイルをステージングすることになるので、あとから面倒かと。
比較した後は、

```
rm -rf .git
```

とかで、gitのディレクトリを消しといたほうがいいと思います。
見慣れないgit write-treeコマンドについては、
[Git - Gitオブジェクト](http://git-scm.com/book/ja/Git%E3%81%AE%E5%86%85%E5%81%B4-Git%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88 "Git - Gitオブジェクト")
あたりを参考にしました。
メリットは、速い、確実、簡単、というところでしょうか。
もともと、異なるサーバーのディレクトリツリーを比較したいという用途だったので、
ハッシュ値の比較だけでできるのは便利です。

gitのバージョン管理じゃない使い方でした。

PS:なんか間違ってる気もするので、もうちょっと検証してみます。
JGitで.gitattributeはできないが、どのあたりにフックできるか検討

JGitの3.0では.gitattributeは対応していない。
つまり、clean/smudgeフィルターも対応していない。

仕込むことができるかをソースを読んでいた結果、

org.eclipse.jgit.treewalk.WorkingTreeIterator
の
private InputStream filterClean(InputStream in)
このへんにcleanフィルター相当を仕込むことが出来そう。

org.eclipse.jgit.dircache.DirCacheCheckout
の
checkoutEntry(Repository repo, File f, DirCacheEntry entry, ObjectReader or)
ここにsmudgeフィルター相当を仕込むことが出来そう。
Disposed

誰もが作るであろう何か

##Disposed
```csharp
abstract class Disposable : IDisposable
{
    ~Disposable()
    {
        Dispose( false);
    }
    public void Dispose()
    {
        Dispose( true);
        GC.SuppressFinalize(this );
    }

    public bool Disposed
    {
        get
        {
            return disposed;
        }
    }

    private bool disposed = false;

    private void Dispose(bool disposing)
    {
        if (disposed)
        {
            return;
        }

        if (disposing)
        {
            OnDisposeManaged();
        }

        OnDisposeUnmanaged();

        disposed = true;
    }

    virtual protected void OnDisposeManaged()
    {
        if (DisposeManagedAction != null )
        {
            DisposeManagedAction();
        }
    }

    virtual protected void OnDisposeUnmanaged()
    {
        if (DisposeUnmanagedAction != null )
        {
            DisposeUnmanagedAction();
        }
    }

    Action DisposeManagedAction { get ; set; }
    Action DisposeUnmanagedAction { get ; set; }
}
```

####使用例 1

普通に継承して使う

```csharp
class HeapPtr : Disposable
{
    protected override void OnDisposeUnmanaged()
    {
        if (ptr != IntPtr .Zero)
        {
            Marshal.FreeCoTaskMem(ptr);
            ptr = IntPtr.Zero;
        }
    }

    IntPtr ptr;
    public static implicit operator IntPtr (HeapPtr p)
    {
        if (p.Disposed)
            throw new ObjectDisposedException( "p");

        return p.ptr;
    }

    public HeapPtr(int cb)
    {
        ptr = Marshal.AllocCoTaskMem(cb);
        Length = cb;
    }

    public HeapPtr(byte [] buf)
    {
        if (buf == null )
        {
            Length = 0;
            ptr = IntPtr.Zero;
        }
        else
        {
            Length = buf.Length;
            ptr = Marshal.AllocCoTaskMem(Length);
        }

        Marshal.Copy(buf, 0, ptr, Length);
    }

    public int Length { get; private set ; }
}
```

####使用例 2
ラムダ式

```csharp
using (var d = new Disposed {
    DisposeManagedAction = () => { ... }    
    DisposeUnmanagedAction = () => { ... }    
}) {
    ....
}
```

こっちのは、記述してみたってだけの未テストなのであしからず。
nginxソースコードリーディング その0〜まえがき〜

[mruby_nginx_module](https://github.com/cubicdaiya/ngx_small_light)や[ngx_small_light](https://github.com/cubicdaiya/mruby_nginx_module)を開発していることもあってnginxのソースコードを読むことはよくあるんだけど、これまではほとんどの場合とある機能のバグっぽい挙動を追っかけたり、拡張モジュールを書くのに行き詰ってコアAPIの実装や公式のモジュールのソースコードを参照したりと必要に応じてその都度断片的に読んでいた。


逆にnginxの全体像やアーキテクチャについてはまぁ、マルチプロセスで動くとかイベント駆動アーキテクチャでノンブロッキング・非同期I/Oを駆使してるとかは知ってるし、実際にある程度読んだこともあるけど、がっつり読んだことがあるわけではないのでnginx内部でこれらの仕組みがどのように実現されているのかはざっくりとしか理解していなかった。なので今回はそのあたりを理解するためによりコアな部分のコードを読んでいこうと思う。

# nginxソースコードリーディングをはじめるまえに

まずリーディング対象のnginxのバージョンだがこれは公式リポジトリのdefaultブランチ(Gitでいうmaster)を対象とする。日々ソースコードが更新されていくので、各エントリはそれを書いた時点のソースコードを元にする。なのでエントリを書くタイミングによって言及しているnginxのバージョンが更新されている場合がある。また、リーディング対象のnginxのコードはLinux用のものを利用する。

# nginxのソースコードをダウンロード

nginxのソースコードは公式のMercurialリポジトリからcloneする。

```sh
hg clone http://hg.nginx.org/nginx/
```

# リビジョン

5411:5483d9e77b32

# 使用するツール

Cで書かれた大規模なソースコードを読む上では最早必須とも言える[GNU GLOBAL](http://www.gnu.org/software/global/)を使う。

```sh
cd nginx
gtags -v
```

# nginxのソースコードレイアウト

nginxのソースコードにおける各コンポーネントのディレクトリ配置はこんな感じ。ほかにもあるけどここではWebサーバーとして重要な部分のみを取り上げる。

 * core
  * nginxのコア
   * エントリポイント
   * 文字列、メモリプール等の内部API
 * event
  * イベント駆動エンジン
 * http
  * HTTPサーバーエンジンおよび拡張モジュール群
 * os
  * クロスプラットフォームレイヤー

というわけでいつもみたいに必要な部分をボトムアップ的に読むのではなく、main関数からトップダウン的に読んでいこうと思う。

# 次回

[nginxソースコードリーディング その1〜nginx起動〜](http://qiita.com/cubicdaiya/items/65d7cb967024958e82d2)

# 参考文献・URL

 * [nginx Internals](http://www.slideshare.net/joshzhu/nginx-internals)
Rails4でscopeにlambdaを付け忘るとチェインが外れる

Rails4では`scope`に`lambda`を付けないと、チェインが外れる。

```rb

class User < ActiveRecord::Base

scope :active, where("active IS TRUE")

scope :from_latest, order("created_at DESC")

end

```

等としていると、

```rb

User.active.from_latest

```

等としたときに`active`のスコープが適用されない(と思う)。

```rb

class User < ActiveRecord::Base

scope :active, lambda{where("active IS TRUE")}

scope :from_latest, lambda{order("created_at DESC")}

end

```

としなければならない。
ワーニングが出なかったように思うので、Rails 3からの移行時はお気をつけを。

実際に付け忘れて、OUTER JOINで数万と数万のテーブルWHERE句なしにをつなげて全件取得し、酷いことになった。
RubyとPythonとPerlで正規表現の速さを比べてみた（2013年版）


ちょっと業務で大量のテキスト処理をしないといけない案件がありましてRubyで作ってたんですが、それがどうにも遅い…。コード的にチューニングする余地はあるのですが、そもそも遅いヤツを使っているんじゃ話にならんなということで、主要なLLでの速度の差を測ってみることにしました。

## まずは測定結果
ちょっとしたテキスト（6MB）の場合はPerl圧勝、大きなテキストの場合はPython勝利となりました。Rubyはいずれの場合も僅差で最下位を免れていますが遅めですね。PerlとPythonが得意・不得意が大きく分かれたのとは対照的です。

![???_2.png](https://qiita-image-store.s3.amazonaws.com/0/15830/817a682f-0c32-5e5a-ae6c-922f713efd41.png "???_2.png")

## ちなみに測定条件
- Nginxのアクセスログから正規表現でIPアドレスを抽出
- 抽出結果をファイルに書く
- 使用マシンはFDなCore i5のiMacさんです
- 全て3回ずつ計測
- 異常値（極端に外れた値）は出ていなかった


## 今更ながらの出場選手紹介
まずはRuby選手から

```bash:show_ruby_version
$ ruby -v
ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-darwin12.3.0]
```

使用するコードは次の通り

```ruby:regex_test.rb
#!/usr/bin/env ruby

re_addr = /((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))/

fh2 = open("./result_rb.txt", "w")
open("./access.log.1") { |fh|
  while line = fh.gets
    if m = re_addr.match(line)
      fh2.puts m[1]
    end
  end
}
fh2.close
```

----

次にPython選手

```bash:show_python_version
$ python --version
Python 2.7.2
```

使用するコードは次の通り

```python:regex_test.py
#!/usr/bin/env python

import re
re_addr = re.compile("((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))")

fh2 = open('./result_py.txt', 'w')
fh = open('./access.log.1')
for line in fh.readlines():
    m = re_addr.search(line)
    if m is not None:
        fh2.write(m.group(1))
        fh2.write("\n")
fh.close()
fh2.close()
```

----

最後に大ベテランのPerl選手

```bash:show_perl_version
$ perl -v

This is perl 5, version 12, subversion 4 (v5.12.4) built for darwin-thread-multi-2level
#（長いので以下省略）
```

使用するコードは次の通り

```perl:regex_test.pl
#!/usr/bin/env perl

open(FH2, ">", "./result_pl.txt");
open(FH, "<", "./access.log.1");
while($line = readline FH) {
  if ($line =~ /((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))/) {
    print FH2 $1."\n";
  }
}
close(FH);
close(FH2);
```

----

こんな感じで、各言語共にロジックはほぼほぼ一緒で、また、たいしたことはしていません。

## あとがき
正規表現＋ファイル書き込みなので、純粋な正規表現能力の比較ではありません。とはいえ、このベンチマークをするきっかけが大量テキストの処理（正規表現で特定のデータを抜き出し、ファイルに書き出す）なので、そこはご容赦ください…。

各言語のメモリ解放などをちゃんと考慮できていないので、そういったあたりをちゃんとするとまた結果は変わるかもしれません。あくまで参考程度にどうぞ。
[GroovyとProcessing] 線と図形を描く

線と箱を描くだけ

動画リスト：[LWJGLのチュートリアル](http://www.youtube.com/playlist?list=PL19F2453814E0E315)
動画は[ココ](http://www.youtube.com/watch?v=cQAYMkzy9rQ)

```groovy:DisplayTest.groovy
package episode003

import groovy.swing.SwingBuilder
import processing.core.PApplet

import javax.swing.*

class DisplayTest extends PApplet {

    def void setup() {
        frameRate(60)
    }

    def void draw() {
        background(0, 0, 0)

        stroke(255, 255, 255)
        fill(255, 255, 255)
        rect(400, 300, 50, 50)
        line(100, 100, 200, 200)
    }

    def static void main(args) {
        def display = new DisplayTest()
        new SwingBuilder().frame(
                title: 'Episode 3',
                defaultCloseOperation: JFrame.EXIT_ON_CLOSE,
                size: [640, 480], show: true) {
            widget(display)
        }
        display.init()
    }
}
```

![grocessingGL003.png](https://qiita-image-store.s3.amazonaws.com/0/17179/1cec933d-bb2b-c01b-a054-0a00a4b70008.png)
AngularJSでロード中に評価前のマークアップを表示させない方法

AngularJSを使ったWebアプリケーションで、ページの読込途中や初期化までの間にテンプレートのマークアップ（下記の図の{{name}}のような記述）が一瞬見えてしまうのを何とかしたい時があります。

![ng-cloak1.png](https://qiita-image-store.s3.amazonaws.com/0/30144/818c152e-dc0d-c1f8-fd68-fcecb768911e.png "マークアップが見えている例")

特にページの表示開始を早くするためにAngularJSのコード読み込みをhead要素に置かずに非同期で読み込んでいる場合は、AngularJSの読み込み完了まで見えてしまうので特に目立ってしまいます。これを解決するためにngCloakというdirectiveがあるのでこれを使います。（headセクションでAngularJSのコード読み込みのscriptタグを配置している場合はそんなに気にならないかもしれません。公式ドキュメントではこの方法を推奨しているようです）

## 使い方

連携するCSSをアプリケーションのCSSに追加します

```css:連携用CSS
[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
  display: none !important;
}
```

隠したい要素の属性にng-cloakを付けます

```html:ng-cloak使用例
<div id="content" ng-cloak>
<h1>{{hogehoge}}</h1>
...
</div>
```

これだけです。

ng-cloakはbodyに付けると一箇所だけで済むので楽が出来ますが、プログレッシブレンダリングを可能にしてユーザにストレスを与えないようにするためにも、影響のある場所にのみ複数に分けて設定するほうが好ましいようです。また、IE7などの属性セレクタをサポートしないレガシーブラウザに対応したい場合は上記のディレクティブのみでは不足するため、`class="ng-cloak"`を追加して以下のようにすると良いようです。

```html:レガシーブラウザ対応例
<div id="content" class="ng-cloak" ng-cloak>
<h1>{{hogehoge}}</h1>
...
</div>
```

## 動作の比較

ng-cloakの有無による違いを確かめるためのサンプルページは[こちら](http://everglades-ng-cloak-demo.herokuapp.com/ "ng-cloak-demo")です。サンプルとして3つのページを用意しています。これらはHello, world!を表示するサンプルとなっており、それぞれ以下のことを行っています。

- 変数nameにworldをセット
- $httpで非同期に取得したjsonを使って変数nameを上書き（設定されたのを分かりやすくするために上書きを500ms遅らせています）

また、３つのページの違いは以下の通りです。

| no | 名称 | ng-cloak有無 | angular.js読込方法 |
|:-----------:|:-----------|:------------:|:------------:|
| 1 | ng-cloak | 有 | 500ms遅延非同期 |
| 2 | no-ng-cloak(async) | 無 | 500ms遅延非同期 |
| 3 | no-ng-cloak(sync) | 無 | 遅延なし同期 |

非同期のngCloak無しバージョンではマークアップが見えてしまっているのが確認できます。また、AngularJSの同期と非同期では、AngularJSの読み込み完了前にページがレンダリングされるか、読み込み完了後にレンダリングされるかの違いが確認できます。

## サンプルコード

上記のサンプルコードは[こちら](https://github.com/emalock3/ngCloak-demo "ngCloak-demo")にあります。

## 公式ドキュメント

[AngularJS ngCloak](http://docs.angularjs.org/api/ng.directive:ngCloak)
インラインコード記法が化ける

本文は https://gist.github.com/zonuexe/6793690 にあります。

Kobitoの場合
--------------

![Kobitoの場合](https://qiita-image-store.s3.amazonaws.com/0/4121/549d1f4d-c281-7013-228e-b1fa063e92dc.png)

Qiitaのプレビュー
-----------------

![Qiitaのプレビュー](https://qiita-image-store.s3.amazonaws.com/0/4121/185bd0d5-1db2-72f3-f429-aea403463358.png)

blockcode
---------

```markdown
はじめに、このような場合に `\"` と表示されるのは文字列リテラル `"…"` の中に含まれる文字 `\` を区別して表示してゐるだけなので、 `\` といふ文字が文字列中に含まれるわけではありません。

本当に `hoge = "hoge\\\""` (これは`'hoge\"'`と同じ意味です) といふ文字列があったとして、ここから`String#gsub`を使って`\`を除去するのは`hoge.gsub(/\\/,'')` でできます。

次にRubyからJSON文字列を手で作るケース。これは本当に厄介で、JSONで `"\"ho\\ge\""` (`'"ho\ge"'`) と解釈される文字列をRubyの`"`を使って作るには`"\"\\\"ho\\\\ge\\\"\""`と書く必要があります。例によって`'`を使って書くと`'"\\"ho\\\\ge\\""'`です。
```

blockquote
----------

> はじめに、このような場合に `\"` と表示されるのは文字列リテラル `"…"` の中に含まれる文字 `\` を区別して表示してゐるだけなので、 `\` といふ文字が文字列中に含まれるわけではありません。
> 
> 本当に `hoge = "hoge\\\""` (これは`'hoge\"'`と同じ意味です) といふ文字列があったとして、ここから`String#gsub`を使って`\`を除去するのは`hoge.gsub(/\\/,'')` でできます。
> 
> 次にRubyからJSON文字列を手で作るケース。これは本当に厄介で、JSONで `"\"ho\\ge\""` (`'"ho\ge"'`) と解釈される文字列をRubyの`"`を使って作るには`"\"\\\"ho\\\\ge\\\"\""`と書く必要があります。例によって`'`を使って書くと`'"\\"ho\\\\ge\\""'`です。

直接
----

はじめに、このような場合に `\"` と表示されるのは文字列リテラル `"…"` の中に含まれる文字 `\` を区別して表示してゐるだけなので、 `\` といふ文字が文字列中に含まれるわけではありません。

本当に `hoge = "hoge\\\""` (これは`'hoge\"'`と同じ意味です) といふ文字列があったとして、ここから`String#gsub`を使って`\`を除去するのは`hoge.gsub(/\\/,'')` でできます。

次にRubyからJSON文字列を手で作るケース。これは本当に厄介で、JSONで `"\"ho\\ge\""` (`'"ho\ge"'`) と解釈される文字列をRubyの`"`を使って作るには`"\"\\\"ho\\\\ge\\\"\""`と書く必要があります。例によって`'`を使って書くと`'"\\"ho\\\\ge\\""'`です。
STLのコンテナからEigen::Matrixへ変換する

結論：Eigen::Map を使えばいい。適当にラッパー書いた。

### 使い方
```cpp:nnmn.cpp
Eigen::VectorXf v = eigen_vector(vector); // from std::vector<float> vector;
Eigen::MatrixXf m = eigen_matrix(matrix); // from std::vector<std::vector<float> > matrix;
```

コンパイルは、`g++ nnmn.cpp -std=c++0x` 的な感じで。unique_ptr使ってるので、c++0xなり何なり付ける。

以下実装。書いてから思ったけど、固有ベクトルと間違えそうだし関数名変えたほうがいいかも

### 実装
```cpp:matix_util.h
#pragma once

#include <Eigen/Core>
#include <iterator>
#include <memory>

namespace internal {

/**
   @brief Serialize Matrix to 1D array
   @param matrix
   @param array1d: pointer of 1D array
 */
template <class Matrix, class T>
inline void matrix_to_array1d(Matrix& matrix, T* array1d)
{
  const int cols = matrix.size();
  const int rows = matrix[0].size();

  for (int i = 0 ; i < cols; ++i) {
    std::copy(matrix[i].begin(), matrix[i].end(), array1d);
    array1d += rows;
  }
}

} // end namespace internal

/**
   @brief Eigen::Matrix from matrix
   @param matrix
   @return Eigen::Matrix
 */
template <class ValueType=float, class Matrix>
Eigen::Matrix<ValueType, Eigen::Dynamic, Eigen::Dynamic>
eigen_matrix(Matrix& matrix)
{
  const int cols = matrix.size();
  const int rows = matrix[0].size();

  // copy to 1d array
  std::unique_ptr<ValueType[]> array1d(new ValueType [rows*cols]);
  internal::matrix_to_array1d(matrix, array1d.get());

  // eigen matrix from 1darray
  return Eigen::Map<Eigen::Matrix<ValueType, Eigen::Dynamic, Eigen::Dynamic> >(array1d.get(), rows, cols);
}

/**
   @brief Eigen::Vector from vector
   @param vector
   @return Eigen::Vector
 */
template <class Vector>
Eigen::Matrix<typename Vector::value_type, Eigen::Dynamic, 1>
eigen_vector(Vector& vector)
{
  typedef typename Vector::value_type value_type;
  return Eigen::Map<Eigen::Matrix<value_type, Eigen::Dynamic, 1> >(&vector[0], vector.size(), 1);
}
```
ニコニコ動画QをJavaScriptから操作する

[ニコニコ動画のプレーヤーをJavaScriptから操作するAPI一覧 - kiyohoge](http://d.hatena.ne.jp/kiyo_hoge/20100819/1282240857)

ここの

```javascript:
var player = document.getElementById("flvplayer"); 
```
が

```javascript:
var player = document.getElementById('external_nicoplayer');
```

に変わっただけです。

もっとたくさん上記URLに書いていますが、いくつかこちらにも記載しておきます。

##再生・停止

```javascript:
player.ext_play(boolean) -> void 
//=> true なら再生、falseなら停止
```

##シーク

```javascript:
player.ext_setPlayheadTime(number) -> void
//=> number秒後にシーク
```

##ミュート

```javascript:
player.exsetMute(boolean) -> void
//=> trueならミュート、falseならミュート解除
```

##動画の状態の取得

```javascript:
player.ext_getStatus() -> String
//=> 'seeking' : シーク中、 'stopped' : 準備中、'playing' : 再生中、 'paused' : 停止中、'end' : 再生終了
```

##動画の現在の再生時間を取得

```javascript:
player.ext_getPlayheadTime() -> Number
//=> 現在の再生時間を取得
```

##動画の長さを取得

```javascript:
player.ext_getTotalTime() -> Number
//=> 動画全部で何秒か
```
スレッドセーフな Singleton クラスを作成する

有名な話であると思っていたが、つい最近嵌った同僚がいたのでメモすることにした。

**注)下記内容は Visual C++ / C++11 未対応の g++ を使用している場合の話です**

## Singleton パターン
デザインパターンの一つ。あるクラスが一つのインスタンスしか持たないことを確実にしたい時に使用する。C++ での Singleton パターンの実装例は下記の通り。

```cpp
// Singleton.h
#pragma once

class Singleton
{
    public:
        static Singleton &getInstance();
    private:
        Singleton(){}
        Singleton(const Singleton &other){}
        Singleton &operator=(const Singleton &other){}
};
```

```cpp
// Singleton.cpp
#include "Singleton.h"

Singleton &Singleton::getInstance() {
    static Singleton instance;
    return instance;
}
```
```cpp
// main.cpp
#include <iostream>
#include "Singleton.h"

int main()
{
    Singleton &singleton = Singleton::getInstance();
    // do something...
    return 0;
}
```

## 上記実装の問題点
**Visual C++ / C++11 未対応の g++ を使用している場合、** 上で示した実装にはスレッドセーフでないという問題がある。
例えば二つのスレッドが同時に Singleton::getInstance() を呼び出した場合、

* Singleton インスタンスが二回作成される
* 一方のスレッドで完全に初期化される前にもう片方のスレッドで Singleton インスタンスが使用される

のいずれかの問題が発生する可能性がある。

## 解決策 1 : 静的な初期化を行う
プログラムがまだシングルスレッドであると想定できる main() の前で Singleton クラスのインスタンスを作成すれば良い。静的な初期化を行うためには、下記コードを Singleton.cpp に追加すれば良い。

```cpp
// Singleton.cpp
// 上で示した部分は省略
static Singleton &singleton = Singleton::getInstance();
```

## 解決策 2 : Singleton クラスの初期化ルーチンを追加する
例えば下記 init() の様な、Singleton クラス用に初期化ルーチンを追加する。
なお下記コードは C++11 のものであり、 C++11 以前の C++ を使用している場合、ミューテックスロックを行う処理は自作 (または他のライブラリを利用) する必要がある。

```cpp
#include <mutex>

static std::mutex s_mutex;
void init() {
    std::lock_guard<std::mutex> lock(s_mutex);
    Singleton::getInstance();
}

```

## 解決策 3 : コンパイルオプション -fthreadsafe-statics を明示する

```
$ g++ -fthreadsafe-statics main.cpp Singleton.cpp
```


## まとめ

スレッドセーフな Singleton クラスを作成するには

* 静的な初期化
* 初期化ルーチンの追加
* コンパイルオプション  -fthreadsafe-statics を明示する

などの方法が有効である。
なお、本問題を解決する方法を調べると DCLP (ダブルチェックロッキングパターン) という方法に出くわすと思う。
しかし DCLP は全てのコンパイラで確実に機能する保証は無いらしく、使用しない方が良いと思う。
ハッシュの配列にアクセスしやすくする簡単gemを作った

夜中の暇潰しにちょっと作ってみた。

例えばこういうデータ構造があったとする。

```ruby
hash_array = [
  {id: 1, name: "name_c", created_at: Time.local(2013, 10, 1, 0, 0, 0)},
  {id: 2, name: "name_a", created_at: Time.local(2013, 10, 3, 0, 0, 0)},
  {id: 3, name: "name_z", created_at: Time.local(2013, 10, 1, 12, 0, 0)},
  {id: 4, name: "name_b", created_at: Time.local(2013, 10, 2, 0, 0, 0)},
]
```

この中で最も最近作られたものの作成時間が知りたいとする。

```ruby
hash_array.max_by {|h| h[:created_at]}[:created_at] # =>  Time.local(2013, 10, 3, 0, 0, 0)
```

何か超ダセェ。何か良い書き方は無いものか。
ActiveRecordであれば、`maximum(:created_at)`って感じで書ける。
で、ちょっと考えたのだが思い付かなかったのでメソッドを生やす作戦を取って、最終的にこう書けるようにした。

```ruby
hash_array.max_value(:created_at) # => Time.local(2013, 10, 3, 0, 0, 0)
```

他にもこんな感じで書ける

```ruby
# 最も前に作られたデータの名前を得る
hash_array.min_value(:name, &:created_at) # => "name_c"

# idが大きい順に名前をソートした配列を得る
hash_array.sort_value(:name) {|h| -(h[:id])} # => ["name_b", "name_z", "name_a", "name_c"] 
```

絶対、こういうの作ってる人居ると思うのだが、とりあえず自分のやりたいようにしてみた。
作ったはいいが、自分でも使うのか分からんけど、とりあえず最初の書き方は何か嫌だ。

[joker1007/max_value](https://github.com/joker1007/max_value "joker1007/max_value")

本当の所、この名前を使いたかったのでわざわざgemにしただけなのだが。
とりあえずgithubに置いてあるだけ。
Unity3Dで影生成するときだけローポリのモデルを使用する

Unityの影生成は便利ですが、デフォルトでは描画用と影生成用に同じモデルを使用するため、単純に考えて2倍の描画コストがかかってしまいます。
そこで、影生成専用のローポリモデルを使用することを考えます。

![スクリーンショット 2013-10-02 20.19.50.png](https://qiita-image-store.s3.amazonaws.com/0/2547/aecf6bb0-473d-c1e3-ca37-10be4b35e698.png)

Mayaの削減機能を利用して、頂点数をおよそ1/3にしたモデルを用意しました。
このモデルにオリジナルと同じ骨を入れて、Unityにインポートします。

![スクリーンショット 2013-10-02 20.27.21.png](https://qiita-image-store.s3.amazonaws.com/0/2547/22d08312-3286-4748-62f3-e1107bee61fc.png)

描画用のモデルの階層の中から、MeshRendererを探し、Cast Shadowsのチェックを外しておきます。
このMeshRenderがアタッチされたGameObjectを複製します。

![スクリーンショット 2013-10-02 20.28.49.png](https://qiita-image-store.s3.amazonaws.com/0/2547/59231c0a-9321-fefa-43be-637d6c446a95.png)

複製されたSkinnedMeshRendererに、先ほどインポートしたモデルを設定します。
Cast Shadowsにチェックを入れ、Receive Shadowsのチェックを外します。
これで、描画用と影生成用、二つのオブジェクトが重なった状態になりました。

このままでは通常のレンダリングパスにおいても、影生成用モデルが描画されてしまいます。
そこで、通常時にレンダリングしないようにシェーダを定義します。

```ShaderLab:ShadowCaster.shader
Shader "Custom/ShadowCaster" {
	SubShader {
		UsePass "VertexLit/SHADOWCASTER"
	} 
	FallBack off
}
```

このシェーダを元にマテリアルを作成し、影生成用モデルに設定します。
これで作業は終わりです。

![スクリーンショット 2013-10-02 20.10.46.png](https://qiita-image-store.s3.amazonaws.com/0/2547/24e82978-7cbf-1473-34a0-e26b1b048ec7.png)

![スクリーンショット 2013-10-02 20.10.31.png](https://qiita-image-store.s3.amazonaws.com/0/2547/19b30a54-006a-0a57-f853-5526bd3e5ff5.png)

Statsを見ると、頂点数が減っていることが確認できますね。
ディレクトリを再帰的にたどってファイル一覧を出力する


[@_shimizu](https://twitter.com/_shimizu) さんの

* [[node.js]ディレクトリを再帰的にたどってファイル一覧をJSONとして出力する | GUNMA GIS GEEK](http://shimz.me/blog/node-js/2944)

の派生品です。ファイルパスを出力するだけにしました。

```js:enumFilesRecursive.js
var fs = require("fs")
    , path = require("path")
    , dir = process.argv[2] || '.'; //引数が無いときはカレントディレクトリを対象とする

var walk = function(p, fileCallback, errCallback) {

	fs.readdir(p, function(err, files) {
		if (err) {
			errCallback(err);
			return;
		}

		files.forEach(function(f) {
			var fp = path.join(p, f); // to full-path
			if(fs.statSync(fp).isDirectory()) {
				walk(fp, fileCallback); // ディレクトリなら再帰
			} else {
				fileCallback(fp); // ファイルならコールバックで通知
			}
		});
	});
};


// 使う方
walk(dir, function(path) {
	console.log(path); // ファイル１つ受信	
}, function(err) {
	console.log("Receive err:" + err); // エラー受信
});
```
IIR 20章: ウェブのクローリングとインデックス付け


## 20.1 ウェブクローリング

ウェブの世界からページを集め，それらをインデックス付し検索エンジンの手助けをするプロセス

* できるだけ有用なページを集める
* それらを結んで切るリンク情報を共に収集する
* 高速に，効率的に集める

## 20.1.1 クローラが提供すべき機能

### 頑健性 (robustness)

##### スパイダートラップ

=> クローラをだましてある特定のドメインから無数のページを取り出させるように仕向けるウェブページ

クローラはこのようなわなに対して体制を持たなければならない

### 礼儀正しさ (politeness)

Webサーバはクローラがウェブサイトを訪問する比率を制御する暗示的，明示的なポリシーをもっており，これらは尊重されなければならない

## 20.1.2 クローラが提供すべき機能

### 分散性

クローラは複数の機会をまたがって分散された形で実行できるべきである

### スケーラビリティ

クローラはマシンや帯域幅の追加によりスケールアップ可能であるべきである

### 性能と効率

クローラはプロセッサ、ストレージ、ネットワークなど様々なシステム資源を効率的に使うべきである

### 新鮮さ

クローラは連続性を保証する，つまり以前に獲得したページを更新することで最新の状態を保たなければならない．
クローラはページの更新頻度に近い形でページをクロールできるべきである

### 拡張性

新しいデータ形式や新しいプロトコルにも対応できなくてはならない．

## 20.2 クローリング

1. あるホストに対してはただひとつのコネクションが開かれるべきである
2. 一つのホストへの連続したリクエストは何秒か間を置くべきである
3. 20.2.1に示す礼儀正しさには従うべきである

## 20.2.1 クローラのアーキテクチャ

![kobito.1380645178.529919.png](https://qiita-image-store.s3.amazonaws.com/0/2238/5856ed72-0060-be33-c326-e7e152f81b81.png "kobito.1380645178.529919.png")

### URL Frontier
クロール対象のリンクが格納されている


1. URL FrontierからひとつのURLと取り出す
2. httpプロトコルを用いてウェブページを取ってくる
3. 言語解析により，テキストとリンクを取り出す
4. 各リンクをURL Frontierに格納するかをきめる

#### URL Frontierに格納するかの決定
* すでにクローラによって確認されたページか？
* URLフィルター
	* 特定ドメインの排除
	* robots.txt の確認
* すでにURL Frontierに存在しないか？

### クローラを分散する

どのように分散クローラはURLを共有するか？

![kobito.1380646241.260123.png](https://qiita-image-store.s3.amazonaws.com/0/2238/4c87ffda-523c-6b90-2415-ce94f7e546b3.png "kobito.1380646241.260123.png")

### 20.2.2 DNS解決

まぁいまの時代ほとんど必要ないよね…

### 20.2.3 URL Frontier

### URLにどのように優先順位をつけるか？
* 頻繁に更新される高品質のページはよくクロールされるべき
* 礼儀正しさ

![kobito.1380646484.018069.png](https://qiita-image-store.s3.amazonaws.com/0/2238/32ba6421-a231-6ce4-78f3-788266fb0d19.png "kobito.1380646484.018069.png")

### 目的
* どのホストに対してもコネクションはひとつだけ
* コネクションから引き継いだ次のリクエストには待ち時間がある
* 優先順位の高いページは選択的にクロールされる

フロントキューで優先順位を，バックキューで礼儀正しさを実装する

###フロントキュー
F個ある
URLに1-Fの優先順位をこれまでの経過にもとづいて割り当て
i番目の優先順位を得た場合はi番目のキューに格納する

![kobito.1380646820.926955.png](https://qiita-image-store.s3.amazonaws.com/0/2238/263eb862-2211-73d7-1527-a5a6e12b4c2d.png "kobito.1380646820.926955.png")

###バックキュ−

* 空ではない
* 一つのホストからのURLだけを含む
* ヒープを用いて待ち時間を管理する

## 20.3 インデックスの分散化

### 用語での分割で大域的インデックス構造をとる

辞書が部分集合に分割され、各々の部分集合がノードに配置される．
クエリはそのクエリ用語に相当するノードに回される．
大きな並列性が可能になる．

実際には難しい．
複数の語からなるクエリでは大きなマージを行わなければならない可能性がある．
共起性をもとにどの語をどのノードに分割するかが重要になる．

### 文書での分割で局所的インデックス構造をとる

一般的な実装
各ノードは全文書の部分集合に対するインデックスをもつ
各クエリはいろいろなノードにおくられ、その結果をマージしてユーザに返す

どのように分割するべきか．
ひとつの考え方として同一のホスト由来の文書を同一のノードに振り分ける

## 20.4 接続サーバ

* どのURLがどのURLにリンクしているか
* どのURLがどのURLからリンクされているか

をウェブグラフを構築するために保存・運用する必要がある

ウェブの世界に40億のページがあり，その各々が10個のリンクをもつと仮定する．
各リンクの両端点を表すのに32ビット必要になると考える．

4 * 10^9 * 10 * 8 = 3.2 * 10^11 バイトのメモリが必要になる

### リスト感の類似性

表の中野多くの行は，多くの共通の要素を持っているためにいくつかの行をつかって簡潔に表現できる

### 局所性

すぐ近くのページをしているので，小さい整数を用いてコード化できおる

### ソートされたリストのなかでギャップのコード化を行う

その前の要素からのオフセットをもつ
ブルーオーシャン戦略とメディチ・インパクト のメモ

# ブルーオーシャン戦略の注意点

ただ安くするだけではダメ！
安いけど、顧客にとっての価値も上げる

> 増減除付

# どうやってブルーオーシャン戦略を打ち立てるのか。

1. 代替産業に学ぶ
2. 業界内の他の戦略グループから学ぶ
3. 買手グループを定義し直す
4. 補完剤や補完サービスを見渡す
5. 機能志向と感性志向をを切り替える
6. トレンドの先行きを見渡す

# メディチインパクト

## 方向的イノベーション
ざっくり言うと、想像がつくようなイノベーション

## 交差的イノベーション
ざっくり言うと、異なる文化が交差して想像がつかないようなイノベーション

## 手法

### 思い込みの逆転方法
「レストランにはメニューがある」 → 「レストランにはメニューが **ない** 」

### ブレスト
チームでブレストをしても他のメンバーの意見に引きづられることがある。
**独りブレストを先にやって、付きあわせする方が効率的。**
ポモドーロタイマーのワンライナーで学ぶデスクトップ通知システム

普段[ポモドーロテクニック](http://d.hatena.ne.jp/keyword/ポモドーロテクニック)を使って作業をしていることが多いが，専用のツールとか使わずにコマンドラインからポモドーロタイマーを使いたいと思った．そこでデスクトップ通知システムを使ってワンライナーでタイマーを実装．


### Mac OSX : terminal-notifier
```bash
alias pomodoro='i=-1;while :;do echo $((i+=1));if [ $i -ge 25 ];then;terminal-notifier -message "job finished";fi;sleep 60;done'
```

### Linux : notify-send
```bash
alias pomodoro='i=1;while :;do echo $i;sleep 60;if [ $i -gt 25 ];then (notify-send job finished;sleep 1;killall notify-osd)&;fi;i=$(($i+1));done'
```
notify-sendはgnomeでは持続時間を10秒から変えられないというバグがあるので， (notify-send;sleep 1;killall notify-osd)& とすることで1秒(任意の秒数)で消せる．


このエイリアスを.bashrcに突っ込んで快適ポモドーロテクニック生活！
openXをcentOSで動かす


##必要なソフトウェアをインストール

yumで必要なソフトをインストールする。
nginxはyumでインストールする

```
sudo yum install mysql-server php php-mysql php-fpm php-gd
sudo rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
sudo yum list nginx
sudo yum install -y nginx
```

##openXをインストール

下記のページからopenXをダウンロードする。
http://www.openx.com/products/source-download

ダウンロードしたファイルを展開し配置する。

```
tar xf openx-2.8.11.tar.bz2
sudo mv openx-2.8.11 /var/lib/openx-2.8.11
cd /var/lib
sudo ln -s openx-2.8.11 /var/lib/openx
sudo chmod -R a+w /var/lib/openx-2.8.11/var
sudo chmod -R a+w /var/lib/openx-2.8.11/var/cache
sudo chmod -R a+w /var/lib/openx-2.8.11/var/plugins
sudo chmod -R a+w /var/lib/openx-2.8.11/var/templates_compiled
sudo chmod -R a+w /var/lib/openx-2.8.11/plugins
sudo chmod -R a+w /var/lib/openx-2.8.11/www/admin/plugins
sudo chmod -R a+w /var/lib/openx-2.8.11/www/images

```

##nginxの設定
```
sudo vi /etc/nginx/nginx.conf
```

```nginx.conf
    server {
        listen       80 default;

        location / {
            root   /var/lib/openx;
            index  index.html index.htm index.php;
        }

        location ~ \.php$ {
            root           html;
            fastcgi_pass   192.168.33.10:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /var/lib/openx$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
```

##起動・確認

PHPとMYSQLとnginxを起動する。


```
sudo service php-fpm start
sudo service mysqld start
sudo service nginx start
```

ブラウザでサーバーにアクセスしてopenXの画面が表示されれば完了。
http://XXX.XXX.XXX.XXX

##おまけ
ブラウザでアクセスして表示されなかったとき。
ファイアウォールが原因なら外す。

```
sudo /etc/rc.d/init.d/iptables stop
```
F#でBinary Indexed Tree

[こちら](http://d.hatena.ne.jp/naoya/20090606/1244284915)のコードをF#に直して書いてみた。
ジェネリックにしたいのに型制約がうまくかけなくて悲しかった

```fsharp

type BIT(size) =
    let size = size
    let data : int array = Array.zeroCreate size
    
    member x.Item
        with get(i) =
            match i < size with
            |true ->
                let idx = ref i
                seq{
                    while !idx > 0 do
                        yield data.[!idx]
                        idx := !idx &&& (!idx - 1)
                }
                |> Seq.sum 
            |false ->
                failwith "index overflow"
                
    member x.update(i, value) =
        let idx = ref i
        while !idx < size do
            data.[!idx] <- data.[!idx] + value 
            idx := !idx + (!idx &&& (- !idx))
        ()
            

[<EntryPoint>]
let main argv = 
    let k = BIT(16)
    k.update(1, 10)
    k.update(2, 1)
    k.update(5, 1)
    printfn "%A" (k.[1], k.[2], k.[5])
    0

```
Socket.IOクライアントのフォールバック間隔を短くする．

ネットワーク経路上にWebSocketが使えないProxyやFirewallがある環境で，Socket.IO (0.9.16)のデフォルト設定のクライアントの挙動をChrome DevToolsで見ていると，websocketからxhr-pollingへフォールバックし，接続が確立するまでに約10秒もかかる．

そこでクライアント側で設定変更(1行追加)することで，フォールバックして接続するまでの間隔を短くする．下記のサンプルコードは2秒後にフォールバックするようにしてみた．

```js
var start = new Date();
var socket = io.connect();
socket.socket.options['connect timeout'] = 2000; // デフォルト値の10秒から2秒に変更．

socket.on('connect', function() {
  console.log(start - new Date() + 'msec');
});
```

https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO#client
PythonでRubyのObjectSpace._id2refと同等のことを行うためには

# オブジェクトID -> 実体へ...

オブジェクトIDからリファレンスを取り出す
[ObjectSpace._id2ref](http://doc.ruby-lang.org/ja/2.0.0/class/ObjectSpace.html#M__ID2REF)というものがRubyにはあるのだけれど、

```rb
class Hoge
  attr_accessor :uhihi
end

h = Hoge.new
h.uhihi = 300
h.__id__ # 70211856425920
ObjectSpace._id2ref(70211856425920).uhihi # = 300
```

Pythonだとid(variable)で取得したオブジェクトIDから
リファレンスとしてオブジェクトそのものを取るにはどうしたらいいんだっけ、
って思ってぐぐったらすぐに[StackOverflowの投稿](http://stackoverflow.com/a/1396690)がでてきた。

```py
import gc

class Hoge(object):
  pass

h = Hoge()
h.uhihi = 300
id(h) # 4342077776

reference = None
for obj in gc.get_objects():
  if id(h) == id(obj):
    reference = obj

reference.uhihi # = 300
```

[gc.get_objects](http://docs.python.org/3.3/library/gc.html#gc.get_objects)か。
fruitstrapで「Unable to locate DeviceSupport directory containing DeveloperDiskImage.dmg」エラーがでたときの対処法

## はじめに
* fruitstrapでiOSアプリを実機上に起動しようとしたら上記のエラーがでたので対処法を書く
 * ちなみに半日ほどはまったm(_ _)m

## 対応
* 現象としてはエラーのとおりDeveloperDiskImage.dmgが見つからないと言われている
* シンボリックリンクを張ってあげる

```shell-session
## 使用するデバイスのiOSバージョンが6.1.3の場合

## 参照先が/Applications/Xcode.app/Contents/...以下にある場合
$ cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport
$ sudo ln -s 6.1\ \(10B141\)/DeveloperDiskImage.dmg 6.1.3\ \(10B329\)/DeveloperDiskImage.dmg
$ sudo ln -s 6.1\ \(10B141\)/DeveloperDiskImage.dmg.signature 6.1.3\ \(10B329\)/DeveloperDiskImage.dmg.signature

## 参照先が /Users/<USER>/Library/...以下にある場合
$ cd /Users/<USER>/Library/Developer/Xcode/iOS DeviceSupport/6.1.3\ \(10B329\)
$ ln -s  /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/6.1\ \(10B141\)/DeveloperDiskImage.dmg DeveloperDiskImage.dmg
$ ln -s  /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/6.1\ \(10B141\)/DeveloperDiskImage.dmg.signature DeveloperDiskImage.dmg.signature
```

## 対応後のログ
* 無事に起動するようになった

```
〜〜〜
[100%] Installed package
------ Debug phase ------
Device support path: /Users/<USER>/Library/Developer/Xcode/iOS DeviceSupport/6.1.3 (10B329)
Developer disk image: /Users/<USER>/Library/Developer/Xcode/iOS DeviceSupport/6.1.3 (10B329)/DeveloperDiskImage.dmg
〜〜〜
```

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
viで文字数をカウントする

# viで文字数カウント

テキストエディタとしても大活躍のviなんだけども、
文字数カウントできないのは不便だなーとか思ったので投下。

```vim:viで文字数カウント
:%s/./&/g
```

上記のコマンドで「○○箇所置換しました」的なメッセージが出てくると思います。
出てきた数字が文字数。

## コメントから抜粋

外部コマンドも使えるとのコメントを頂きましたので追記します。

```vim:Linuxの外部コマンドが使える場合
:!wc {ファイル名}
or
:!wc %
```
[Go言語] database/sqlパッケージを使ってみた


## ドライバを入れる

MySQLのドライバをいれてみる。

```
go get "github.com/go-sql-driver/mysql"
```

使うときは、`init`関数を呼び出せばよいみたいなので、`_`でインポートする。

```
import _ "github.com/go-sql-driver/mysql"
```

## データベースを開く

ドライバの名前を指定して、データベースに接続する。

```
cnn := sql.Open("mysql", "user:password@tcp(host:port)/dbname")
```

## 1レコードをSELECTしてみる

`QueryRow`メソッドを使えば、1レコード分を取得できる。
Go言語得意のポイントを渡して、出力引数で受け取る。

```
id := 100
var name string

if err := cnn.QueryRow("SELECT name FROM person WHERE id = ?LIMIT 1", id).Scan(&name); err != nil {
	log.Fatal(err)
}

fmt.Println(id, name)
```

## 複数レコードをSELECTしてみる

`Query`メソッドを使えば、複数のレコードを取得できる。

```
rows, err := cnn.Query("SELECT id, name FROM person")
if err != nil {
	log.Fatal(err)
}
defer rows.Close()

for rows.Next() {
	var id int
	var name string	
	if err := rows.Scan(&id, &name); err != nil {
		log.Fatal(err)
	}
	fmt.Println(id, name)
}

if err := rows.Err(); err != nil {
	log.Fatal(err)
}
```

## UPDATEしてみる

レコードを取得する必要のない、クエリは`Exec`メソッドを使う。

```
result, err := cnn.Exec("UPDATE person SET name = ? WHERE id = ?", "Hogera", 100)
if err != nil {
	log.Fatal(err)
}
```

`Result`インタフェースを使うと、最後に挿入したレコードのキーや影響の合ったレコード数を取得できる。

```
type Result interface {
        LastInsertId() (int64, error)
        RowsAffected() (int64, error)
}
```

## トランザクションを使ってみる

### トランザクションの開始とコミット

`Begin`メソッドを呼び出すと、`Tx`型のポインタとエラー値が返ってくる。
`Tx`型は`DB`型と似たようなメソッドを持っているため、`Query`や`QueryRow`、`Exec`などが使える。

```
tx, err := cnn.Begin()
if err != nil {
	log.Fatal(err)
}
```

`Commit`メソッドを使えばコミットできる。

```
tx.Commit()
```

### ロールバック

`Rollback`メソッドでロールバックできる。
以下の例は、パニックが起きたら、ロールバックする例である。

```
func hoge(tx *sql.Tx) {
	defer func() {
		// panicがおきたらロールバック
		if err := recover(); err != nil {
			tx.Rollback()
		}
	}()
	// …
	tx.Exec(…)
}
```

## 感想

[ドキュメント](http://golang.org/pkg/database/sql/#DB)を見ると、コネクションプールとかよしなにやってくれるらしい。
最初は以下のようにやってたけど、不要のようだ。

```
var cnnPool chan *sql.DB

func main() {
	cnnPool = make(chan *sql.DB, 10)
	for i := 0; i < cap(cnnPool); i++ {
		cnnPool <- sql.Open("mysql", "user:password@tpc(host:port)/dbname")
	}
}

func getFromDB() { 
	cnn := <-cnnPool
	defer func() {
		cnnPool <- cnn
	}()
	// cnnを使った処理
}
```

まだまだ、使い始めたばっかなので、基本的な使い方だけまとめた。
vagrantメモ


## boxes の管理

### box一覧表示

```
$ vagrant box list
```

### box追加

```
$ vagrant box add 
```

### VM起動して接続

```
$ vagrant up
$ vagrant ssh
```

## Tips

### VMが使用するCPUコア数を設定

Vagrantfile で以下のように `"--cpus", "2"` を設定

```
    # Use VBoxManage to customize the VM. For example to change memory:
    vb.customize ["modifyvm", :id, "--memory", "2048", "--cpus", "2"]
```


### sandbox モードを活用する

プラグインのインストール

```
vagrant plugin install sahara
```

使い方は、[jedi4ever/sahara](https://github.com/jedi4ever/sahara) を参照。

### Guest Additions を自動的に更新

- [[Vagrant] VirtualBoxのバージョンとGuest additionsのバージョンが合わない場合の対処法 - Code Life](http://blog.code-life.net/blog/2013/06/10/the-guest-additions-on-this-vm-do-not-match-the-installed-version-of-virtualbox-on-vagrant/)

- [dotless-de/vagrant-vbguest](https://github.com/dotless-de/vagrant-vbguest)

プラグインのインストール

```
$ vagrant plugin install vagrant-vbguest
```

### ssh コマンドで接続する

`vagrant ssh-config` コマンドで接続情報を確認する。

[[Vagrant] VirtualBoxのバージョンとGuest additionsのバージョンが合わない場合の対処法 - Code Life](http://blog.code-life.net/blog/2013/06/10/the-guest-additions-on-this-vm-do-not-match-the-installed-version-of-virtualbox-on-vagrant/)


### bundler が異常に遅い

/etc/resolv.conf に以下を追加

```
options single-request-reopen
```

参考：

* [bundle installが遅すぎたのでsourceを変えた | 1000g](http://1000g.5qk.jp/2013/08/27/bundler-install%E3%81%8C%E9%81%85%E3%81%99%E3%81%8E%E3%81%9F%E3%81%AE%E3%81%A7source%E3%82%92%E5%A4%89%E3%81%88%E3%81%9F/)
* [Vagrant+VirtualBox（CentOS6）で「gem install rails」がすっごい遅い時の対処法 | IDEA*IDEA](http://www.ideaxidea.com/archives/2013/08/resolv.html)

### 同期フォルダをNFSマウント

Vagrantfile の修正、:private_network での固定IPアドレスの設定と、 synced_folder での :nfs => true の設定。

```
  config.vm.network :private_network, ip: "192.168.33.10"
  config.vm.synced_folder "./working", "/share", :nfs => true
```

参考：

* [Vagrant + VirtualBox で nfs を使って、synced_folder を速くする - Shin x blog](http://www.1x1.jp/blog/2013/08/vagrant_synced_folder_with_nfs.html)
自分でソフトウェアをビルド・インストールするときに/usrや/usr/localへインストールしない

Linux系OSやcygwinに、自分でソフトウェアのソースコードを入手してきてをビルド・イ
ンストールするときに、/usrや/usr/localへインストールしないようにしている。

  *  `apt-get/apt-cache` 等のパッケージ管理用のが使っている領域に自分で手を入れ
     て問題が起きたとき、原因の切り分けが面倒になる

  *  自分ひとり、ユーザアカウントひとつの端末にソフトを導入するために、root所有
     の領域を使う不自然さ

などの理由から。

`./configure && make && make install` でインストールする、といった手順がよく紹
介されているが、ほとんどの場合は `make install` でroot権限を要求され、 `/usr`
や `/usr/local` 配下にコンパイルされたソフトやファイルがコピーされることになる
が、この行き先をホームディレクトリ配下にする。


# 前提

どこかから入手してビルド・インストールするソフトのインストール先を、
`$HOME/usr` としておく。

ヘッダファイルは `$HOME/usr/include`, 共有ライブラリは `$HOME/usr/lib`, 実行ファ
イルは `$HOME/usr/bin` に置かれることになる。

ちなみに自分で作ったスクリプトやソフトの置き場は `$HOME/bin` としている。

# 準備

bashやzshなどのシェルの設定ファイル (たいていは `~/.bashrc`, `~/.bash_profile`,
`~/.profile` というファイル名) を編集する。

次の1行を追加する。

```bash
export PATH=$PATH:$HOME/usr/bin
```


# configureスクリプトが用意されたソフトウェアのビルド

ほとんどの場合、 `prefix` でインストール先を指定できる。

```bash
$ ./configure --prefix=$HOME/usr
```

これで `make install` によるインストール先を `$HOME/usr` 配下にできる。


# Makefileしかないソフトウェアの場合

どうするのが正解なんでしょうね。Makefileの中身を見なければわからないと思うけど……。

たとえば、[youtube-dl](https://github.com/rg3/youtube-dl) という動画サイトの動
画データを抽出するためのソフトの場合、Makefileに次のような設定箇所がある。

```makefile
PREFIX=/usr/local
BINDIR=$(PREFIX)/bin
MANDIR=$(PREFIX)/man
PYTHON=/usr/bin/env python
```

この場合、`PREFIX=/usr/local` を `PREFIX=$(HOME)/usr` に置き換えてやればよい。
phpmyAdmin

phpmyAdminをweb上で使うにはどうゆうすればいいんでしょうか？
ローカルではきちんと動作していますが、ブラウザでデータベースがみたいです。
初歩的な事だとは思いますが、どうも理解できません。
教えていただけると幸いです。
vimのちょっとしたプラグイン拡張をgist管理する


vimのちょっとしたプラグイン拡張とかgist管理したらすっきりしたのでおすすめです。

```
NeoBundle 'gist:soramugi/6775207', { 'script_type' : 'plugin' }
```

<https://gist.github.com/soramugi/6775207>

```vim
" octopressの記事追加したらgit commitのやつ"
function! s:octopress_git(message)
  if a:message == ''
    exe "!cd " . g:octopress_path . " && git add -A && git ci -m \"`date`\" && git push "
  else
    exe "!cd " . g:octopress_path . " && git add -A && git ci -m " a:message "&& git push "
  endif
endfunction
 
command! -nargs=? OctopressGit :call s:octopress_git(<q-args>)
```

本家プラグインの使い方から外れてそうな拡張とかする時とか?
プラグインにするの面倒くさいけど`vimrc`からは分けておきたいとか?
ActiveDirectory環境内のNTPを探す

Fedora入れたはいいものの、時刻が同期されない。Windowsは同期されているようだ。何でやのん。僕だけイギリス勤務な感じで辛い。

つまり、ActiveDirectory環境内のNTPでWindows達は時刻が同期できるが、Fedoraは外部のNTPに時刻を同期しに行こうとしてProxyではねられている、というのが真相のようだ。

ActiveDirectoryとかproxyとか、「適切なセキュリティポリシーの適用」ということに危機管理部署は興味が無いのだろうか、と思うのは、どこでも同じなのでしょうか。

まぁ、とりあえず直しましょう。
コマンドプロンプトで

```ps1
w32tm /query /status
```

ソース、という項目があると思うが、これがWindowsが見ているNTP。これをFedoraでも使えばOK。
Fedora 16あたりからはntpdじゃなくてchronyとかいうのが使われているらしい。たぶん/etc辺りに設定ファイルがあると思うので、

```
server hogehoge.host iburst
```

と書く。iburstすると初期同期が高速化される。

ntpdの再起動を忘れずに。
レコードがあればUPDATE, なければINSERTしたい

したい。

SQLServer 2005 で。
ちなみにストアドプロシージャとかではなく ASP.NET から SQL 文投げる形で。
ついでに 「更新する場合は変更があった場合のみ更新」 とかにしたい。

SQLServer 2008 だと MERGE というのが使えるらしいのだけど、2005 なので使えなかった…

----

```sql

-- テスト用テーブル
CREATE TABLE [dbo].[Hoge] (
    [HogeID] [bigint] NOT NULL,
    [HogeCD] [char](3) NOT NULL,
    [HogeName] [nvarchar](10) COLLATE Japanese_CI_AS NULL,

    CONSTRAINT [PK_Hoge] PRIMARY KEY CLUSTERED (
        [HogeID] ASC
    ) WITH (STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF)
)
GO

-- テスト用レコード
INSERT INTO Hoge(HogeID, HogeCD, HogeName) VALUES (10000, '001', 'yamada');
INSERT INTO Hoge(HogeID, HogeCD, HogeName) VALUES (20000, '002', 'tanaka');

```

※以前色々書いてたんだけど、もっとシンプルで良いのを見つけたので書き直し。

```sql
-- あれば更新、なければ登録
UPDATE Hoge SET
  HogeCD='001', HogeName='suzuki'
WHERE
  HogeID = 10000
  AND (HogeCD <> '001' OR HogeName <> 'suzuki')  -- 何か変更があった場合のみ更新したい

IF @@ROWCOUNT = 0

INSERT INTO Hoge (
  HogeID, HogeCD, HogeName
)
SELECT
  10000, '001', 'suzuki'
WHERE
  NOT EXISTS (    -- 同じキーが存在しない場合のみ登録する
    SELECT TOP 1 1 FROM Hoge WHERE HogeID = 10000
  )
```

UPDATE 文と INSERT 文を IF @@ROWCOUNT = 0 で繋いでやれば良いのか。
なんだー。

<br><br>
↓ ここみた
http://www.ilovex.co.jp/blog/system/cat820/sqlserversql.html

<br>
【追記】更に「UPDATEしたのかINSERTしたのか知りたい」ケースが出てきたので修正版。

```sql
-- あれば更新、なければ登録
UPDATE Hoge SET
  HogeCD='001', HogeName='suzuki'
WHERE
  HogeID = 10000
  AND (HogeCD <> '001' OR HogeName <> 'suzuki')

IF @@ROWCOUNT = 0
BEGIN

  INSERT INTO Hoge (
    HogeID, HogeCD, HogeName
  )
  SELECT
    10000, '001', 'suzuki'
  WHERE
    NOT EXISTS (
      SELECT TOP 1 1 FROM Hoge WHERE HogeID = 10000
    )

  IF @@ROWCOUNT > 0
    SELECT 'inserted'
  ELSE
    SELECT ''
END
ELSE
  SELECT 'updated'
```
insertedが返ってきたら登録、updated が返ってきたら更新、
空なら更新なし（変更箇所がなかったとか）

↓ テンプレ

```sql
/*
  ここに UPDATE 文
*/
IF @@ROWCOUNT = 0
BEGIN
  /*
    ここに INSERT 文
  */
  IF @@ROWCOUNT > 0
    SELECT 'inserted'
  ELSE
    SELECT ''
END
ELSE
  SELECT 'updated'
```
jQuery.fn.cssはChromeとFirefoxで微妙に挙動が異なる

以下のようなHTML要素があるとします

```html
<div id="sample" style="padding: 1px 2px 3px 4px;"></div>
```

これに対して、以下のようなJavaScriptを実行してみると返される値がChromeとFirefoxで微妙に異なります。

```js
$('#sample').css('padding');
```

```js:Chrome
"1px 2px 3px 4px"
```

```js:Firefox
""
```

これは `padding` だけじゃなく、 `margin` や `background` などのように `-` をまたいで複数のCSSを一行で設定するやつ（おそらく）全てに共通する挙動です。

## 回避方法

純粋に全て列挙します。

```js
$('#sample').css(['padding-top', 'padding-bottom', 'padding-left', 'padding-right']);
```

この場合はChromeとFirefoxで挙動が一致します。

### 合わせて読みたい

- [jQuery.fn.cssで複数のプロパティに取得する場合1.9からは配列指定した方がいい](http://qiita.com/yuku_t/items/5aa7d91bc27096748f74)
jQuery.fn.cssで複数のプロパティに取得する場合1.9からは配列指定した方がいい

`jQuery.fn.css` はHTML要素の任意のCSSプロパティの値を取得します。

```js
$('#sample').css('padding-left');  // => #sample 要素の padding-left の値が返される
```

1.以前は `jQuery.fn.css` は一度に1つのプロパティしか取得できませんでしたが、1.9からは配列を渡すことで一度に取得することができます。

```js
var props = $('#sample').css(['padding-left', 'padding-right']);
props['padding-left'];  // => #sample の padding-left
props['padding-right'];  // => #sample の padding-right
```

## パフォーマンス

`jQuery.fn.css` は内部的に `window.getComputedStyle` を使っています。配列を使った指定の場合 `jQuery` のメソッド呼び出しの回数が抑制されることに加えて、内部関数の実行回数も抑制されるのでパフォーマンスが良いようです。

- [Add utility function named getStyles by ykzts · Pull Request #7 · yuku-t/jquery-textcomplete](https://github.com/yuku-t/jquery-textcomplete/pull/7#issuecomment-24409630)
Linuxをドメイン(AD)に参加させる

# LinuxをWindowsドメイン(AD)に参加させる

「ADでユーザーやらなんやら管理してるけどLinuxだけ管理できてねーぞくそが」
ってとき。

```:環境
ドメイン：hoge.local
DC：dc1.hoge.local
Linuxマシン：bksv.hoge.local
```

```:sambaのインストール
# yum install samba
# yum install samba-winbind
```

```:sambaの設定変更
# vi /etc/samba/smb.conf

[global]
workgroup = HOGE
realm = HOGE.LOCAL
security = ads
idmap uid = 16777216-33554431
idmap gid = 16777216-33554431
template shell = /bin/false
winbind use default domain = false
winbind offline logon = yes
```

```:DNSサーバの設定
# vi /etc/resolv.conf

search hoge.local
nameserver dc1.hoge.local
```

```:ケルベロス認証設定
# vi /etc/krb5.conf

[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log

[libdefaults]
default_realm = HOGE.LOCAL
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true

[realms]
HOGE.LOCAL = {
kdc = dc1.hoge.local
admin_server = bksv.hoge.local
}

hoge.local = {
}

[domain_realm]
.hoge.local = HOGE.LOCAL
hoge.local = HOGE.LOCAL
```

```:ADへの参加
# net ads join -U hoge_admin ←ドメイン管理者
Enter hoge_admin's password: ←パスワード入力
Using short domain name -- HOGE
Joined 'BKSV' to realm 'hoge.local'
No DNS domain configured for bksv. Unable to perform DNS Update.
DNS update failed!
```

```:sambaとwinbindサービスを起動
# service smb start
# service winbind start
```

```:PC起動時に自動的に起動するように設定
# chkconfig smb on
# chkconfig winbind on
```

```:ドメインに参加できているかの確認
# wbinfo -t
checking the trust secret for domain HNS via RPC calls succeeded

# wbinfo -u
HOGE\guest
HOGE\administrator
HOGE\krbtgt
HOGE\hoge_admin
```
サービス監視スクリプト

# サービス監視スクリプト
サーバー運用中に
「あれ、なんか調子悪い。ちょっと調べるか。」
「サービス落ちてんじゃん」

イラっとしたので作った。
特定のサービスを監視して、落ちたらメールを投げる。

```bash
#!/bin/bash

#gmailのパラメータ設定
user="*****@******.jp" 
pass="********" 
to="********@******jp" 
authorize="`perl -MMIME::Base64 -e 'print encode_base64("\000[Name]\@[domain]\000[pass]")'`" 
services_array=(nfsd rpcbind snmpd ntpd sshd crond)

#echo ${authorize}

#プロセスをカウントし、プロセス数が0であればダウンしていると判断
#ダウンしたらメールを送信

for i in `seq 1 ${#services_array[@]}`
  do
    isAliveServices=`ps -ef | grep ${services_array[$i-1]} | grep -v grep| wc -l`
    if [ ${isAliveServices} -eq 0 ]; then
      (
        sleep 1
        echo "EHLO `hostname`" 
        sleep 1
        echo "AUTH PLAIN" ${authorize}
        sleep 1
        echo "MAIL FROM: <${user}>" 
        sleep 1
        echo "rCPT TO: <${to}>" 
        sleep 1
        echo "DATA" 
        sleep 1
        (
          echo "Subject: ${services_array[$i-1]} is down" 
          echo "From: ${user}" 
          echo "To: ${to}" 
          echo "" 
          echo ${services_array[$i-1]} "is down" 
          echo "hostname: `hostname`" 
          echo "." 
        ) | perl -pe's/(?<!\r)\n/\r\n/'
        sleep 1
        echo "QUIT" 
      ) | openssl s_client -connect smtp.gmail.com:465
    fi
  done
exit 0
```
Socket.IOのtransportを判別する

Socket.IO(0.9.16)で使っているtransportを判別する方法．

```js
// client side
var socket = io.connect();
console.log(socket.socket.transport.name);
```

```js
// server side
io.sockets.on('connection', function(socket) {
    console.log(io.transports[socket.id].name);
});
```

あとで検索してみたらありました．

* https://groups.google.com/forum/#!topic/socket_io/yx_9wJiiAg0
* http://stackoverflow.com/questions/6280818/socket-io-how-to-get-the-client-transport-type-on-the-serverside