OmniAICreator/Qiita-1.07M huggingface dataset:
Unityで、自作Assetをdllファイルにコンパイルする

# 自作Assetをdllにコンパイルしたい

Unity Asset Store で自作Assetを販売してみたいと思うのだが、
ソースコードをそのままの形で配布したくない。
販売されているAssetの中には、dllにコンパイルされているものもあるので、
コンパイルは可能のようだ。

で、どうやるか探ってみた。

# コンソールで普通にコンパイルしてみた

[http://docs-jp.unity3d.com/Documentation/Manual/UsingDLL.html](http://docs-jp.unity3d.com/Documentation/Manual/UsingDLL.html)

をみると、mono c#コンパイラを使ってコンパイルするといいらしい。

```bash:
$ mcs -r:/Applications/Unity/Unity.app/Contents/Frameworks/Managed/Un\
ityEngine.dll -r:/Applications/Unity/Unity.app/Contents/Frameworks/Managed/UnityEditor.dll -target:library -out:Foo.dll *.cs
```

作成されたdllファイルを、ためしに作ったプロジェクトのAssete/Foo/Pluginsディレクトリに、
ファインダー上でコピーして、Unityに戻ると自動でインポートしてくれる。。。が、エラーがでた。

エラーメッセージは、こんな感じ↓

```text:
Method not found: 'System.Reflection.MethodInfo.op_Inequality'
```

# コンソールであがいてみた

調べてみると、このエラーは.NETのバージョンの違いで起きるようだ。
[http://stackoverflow.com/questions/14194195/litjson-through-exception-on-centos-using-mono](http://stackoverflow.com/questions/14194195/litjson-through-exception-on-centos-using-mono)

Monoプロジェクトからとってきたコンパイラの問題かと思い、Unityに同梱されているコンパイラに変更してみる。ついでに、シェルスクリプトを書いてみた。（dmcsの位置は、Macでの場合です。）

```sh:compile.sh
#!/bin/bash                                                                                                                                          
/Applications/Unity/MonoDevelop.app/Contents/Frameworks/Mono.framework/Commands/dmcs -r:/Applications/Unity/Unity.app/Contents/Frameworks/Managed/Un\
ityEngine.dll -r:/Applications/Unity/Unity.app/Contents/Frameworks/Managed/UnityEditor.dll -target:library -out:$1 *.cs
```

これを、コンソール上で呼び出す。

```bash:
$ chmod +x compile.sh
$ ./compile.sh foo.dll
```

が、作成されたdllを前述のフォルダに突っ込んでやると、またも同じエラー。

# Mono Developでコンパイル

あきらめて、Mono-Developでコンパイルしたら、うまくいった。

## 参考URL
[[Unity3D]UnityのスクリプトをDLL化する](http://terasur.blog.fc2.com/blog-entry-312.html)

ここで気をつけたいのは、Mono Developで新規にライブラリ(DLL)用のプロジェクトを作成すること。
Unity上で*.csファイルをダブルクリックするとMono Developに飛び、あらかじめ作成されているらしきプロジェクトが表示されるが、このプロジェクト上でDLLを作成しようとするとハマる。新規プロジェクトを作って、そこで作業するのが良いようです。

一応、手順をメモ。
１．Mono Developでライブラリ(DLL)用のプロジェクトを新規作成
２．プロジェクトにAssetに含めたいソースを追加する。
３．メニューバーの「ビルド」から「（プロジェクト名）をビルド」を選択

以上。

# 補足

コンソール上でも、フレームワーク関連のオプションをうまく与えてやればなんとかなるのかな、と思わなくもない…。
時間があったら、やってみよう。

# コンソール上でうまくいった

どうやら、monoのコンパイラを間違えていたようです。
MonoDevelop.appに含まれているものではなく、Unity.appに含まれているほうを使うとうまくいきました。
書き直したシェルスクリプトが以下。

```sh:compile.sh
#!/bin/bash                                                                                                                                          
/Applications/Unity/Unity.app/Contents/Frameworks/Mono/bin/smcs -r:/Applications/Unity/Unity.app/Contents/Frameworks/Managed/UnityEngine.dll -r:/App\
lications/Unity/Unity.app/Contents/Frameworks/Managed/UnityEditor.dll -target:library -out:$1 *.cs
```

これで、

```bash:
$ chmod +x compile.sh
$ ./compile.sh foo.dll
```

としてやったら、動きました。
eventsからの検索が遅いのでDOMへ固定するdelegateEventsを書いた

view.events からの走査が、モバイル端末だと #id を使っても遅いので、
Viewを破壊しない場合はDOMへ固定してしまうことにしました。

その際に events の設定をそのまま使えるようにするためのメソッド。

ほとんど Backbone.View.delegateEvents (v1.0.0) のコピィです。
Coffee である必要はありません。

```coffeescript:
delegateEventsFixedly: (events) ->
  return `(function(){
    if (!(events || (events = _.result(this, 'events')))) return this;
    this.undelegateEvents();
    for (var key in events) {
      var method = events[key];
      if (!_.isFunction(method)) method = this[events[key]];
      if (!method) continue;
    
      // Changed
      var match = key.match(/^(\S+)\s*(.*)$/);
      // /Changed
      var eventName = match[1], selector = match[2];
      method = _.bind(method, this);
      eventName += '.delegateEvents' + this.cid;
      if (selector === '') {
        this.$el.on(eventName, method);
      } else {
        // Changed
        this.$(selector).on(eventName, method);
        // /Changed
      }
    }
    return this;
  }).call(this);`
```

`view.initialize` で元の `delegateEvents` が実行されるのは仕方ないので、
その後にどこかで実行します。
もちろん `undelegateEvents` で消すことは可能です。
RailsにjQuery-uiを導入するときの注意

注意: ここに記載されている作業は、アセットパイプラインを使用しない場合でもなければ通常は不要です。追記を参照ください。

わかってしまえば簡単だけど、ネットにほとんど見当たらなかったのでメモ。Rails 4.0 + Ruby 2.0環境。

* Gemfileに以下を追加して `bundle update` と `bundle install` を実行。

```ruby
gem 'jquery-ui-rails'
```

ちなみに以下も含まれている。

```ruby
gem 'sass-rails'
gem 'bootstrap-sass'
gem 'coffee-rails'
gem 'jquery-rails', '~> 3.0.0'
gem 'turbolinks'
gem 'jquery-turbolinks'
```

* 以下を実行して jquery-uiのファイルをgenerateする。これがわからなくてはまった。これに限らず、jquery関連でgemを追加したときはおそらくこういう作業が必要になるのだろう。

```ruby
rails generate jquery:install --ui
```
以下は実行結果。

```
      remove  public/javascripts/prototype.js
      remove  public/javascripts/effects.js
      remove  public/javascripts/dragdrop.js
      remove  public/javascripts/controls.js
     copying  jQuery (1.10.2)
   identical  public/javascripts/jquery.js
   identical  public/javascripts/jquery.min.js
     copying  jQuery UJS adapter (e9e8b8)
      remove  public/javascripts/rails.js
   identical  public/javascripts/jquery_ujs.js
```

ちなみに、`rails generate` とだけ実行すれば多くのヘルプが表示され、 `rails generate jquery:install --help` と打てばjquery関連のヘルプが表示される。 `-p` オプション (シミュレーションのみ行う) がとても便利。

* これでめでたく以下を追加できる。generateに気付かなかったばかりにここでエラーを出しまくった。


```app/assets/javascripts/application.js
//= require jquery.ui.all
```

```app/assets/stylesheets/application.css
/*
 *= require jquery.ui.all
```

なお、jqueryそのものは html.erbにも書けるけど、assets/javascripts以下の *.js.coffeeファイルに書く方が行儀がよいと思われる(CoffeeScriptを導入している場合)。coffeeScriptなので出だしをうんとシンプルに書ける。

```coffeescript
$ ->
    $('div').css('color', 'red')
```

# 追記
その後調べた結果、アセットパイプラインの設定に不備があったのが原因であることがわかりました。アセットパイプラインが正常に動作していればこの記述を適用する必要はありません。以上訂正いたします。
redis操作メモ


* String型

```
追加
set key value

削除
del key

取得
get key

複数追加
mset key value key value

複数取得
mget key key
```

* List型

```
末尾追加
rpush key value

先頭追加
lpush key value

末尾削除
rpop key

先頭削除
lpop key

全部取得
lrange key 0 -1

指定したintのindexの範囲内取得
lrange key int int

指定したintのindexの値を取得
lindex key int

listの長さ
llen key

指定した範囲にリストをトリミング
ltrim key 0 2
```

* Set型

```
追加
sadd key value

削除
srem key value

一覧取得
smembers key

和集合
sunion key key

積集合
sinter key key

差集合
sdiff key key

集合演算の末尾にstore -> 新しい集合
sunionstore new_key key key
```

* Sorted Set型

```
追加
zadd key weight value

削除
zrem key value

一覧(昇順)
zrange key 0 -1

一覧(降順)
zrevrange key 0 -1

ランク(下から)
zrank key value

ランク(上から)
zrevrank key value
```

* Hash型

```
追加
hset key hkey hvalue

複数追加
hmset key hkey hvalue hkey hvalue

取得
hget key hkey

複数取得
hmget key hkey hkey

ハッシュの長さ
hlen key

ハッシュのkey
hkeys key

ハッシュのvalue
hvals key

全部取得
hgetall key
```

* Sortコマンド
List,Set,Sorted Setに利用可能

```
昇順
sort key

降順
sort key desc

数制限あり
sort key desc limit 0 3

アルファベット昇順
sort key alpha

アルファベット降順
sort key alpha desc
```

* multi exec/discard
Transactionっぽいもの

```
multi
処理
処理
処理
exec/discard
```

ただしrollbackはない
ZabbixサーバのPHPを高速化する

ZabbixサーバのPHPを高速化する
====

はじめに
----
[Bounscale](https://github.com/bounscale/bounscale/)というオートスケールするHeroku Addonを作っています。
Bounscaleはオートスケーリングの実施をするバックエンド部分にオープンソースの監視ソフトZabbixを利用しています。

サービスとしてZabbixサーバにどれだけのテナントを集積できるのかは、価格競争力向上・利益向上、あるいはフリーミアムなどのビジネス展開戦略上、非常に重要となってきます。
なので、継続的に様々にチューニングを実施しているのですが、その中でそれなりに分かりやすく効果があったのがPHPのアクセラレータの適用だったので、軽く記録しておきたいと思います。

なぜPHP？
----
ZabbixサーバとエージェントそのものはCで組まれています。PHPはZabbix APIと呼ばれるWebAPIの提供に使われています。

PHPアクセラレータAPC
----
APC(Alternative PHP Cache)はPHPを高速化します。
PHPはインタプリタ言語なので原則的にアクセスがあるたびに都度コンパイルされて動作するのですが、APCはあらかじめ事前コンパイルしておいてメモリに格納し、負荷を下げるというものです。

導入前の状態
----
topで見た感じロードアベレージは8～9位あります。
5以上は重いサーバ、10を超えるとサーバ毎落ちてもおかしくないと言われているので、これはかなりまずいです。

````
top - 05:41:15 up 21 days,  4:38,  1 user,  load average: 8.84, 9.01, 8.96
Tasks: 119 total,  10 running, 109 sleeping,   0 stopped,   0 zombie
Cpu(s): 37.2%us,  8.1%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si, 54.7%st
Mem:   1696964k total,  1328256k used,   368708k free,   159752k buffers
Swap:   917500k total,        0k used,   917500k free,   637228k cached
````

導入手順
----
apcを導入します。導入はとても簡単で普通にyumで入りました。

````
yum install php-pecl-apc
service httpd restart
````

再起動すると勝手に有効になっています。
一応下記のコマンドでapc.enabledがONになっているか確認します。

````
$ php -i | grep apc
Additional .ini files parsed => /etc/php.d/apc.ini,
apc
MMAP File Mask => /tmp/apc.XXXXXX
apc.cache_by_default => On => On
apc.canonicalize => On => On
apc.coredump_unmap => Off => Off
apc.enable_cli => Off => Off
apc.enable_opcode_cache => On => On
apc.enabled => On => On
apc.file_md5 => Off => Off
apc.file_update_protection => 2 => 2
apc.filters => no value => no value
apc.gc_ttl => 3600 => 3600
apc.include_once_override => Off => Off
apc.lazy_classes => Off => Off
apc.lazy_functions => Off => Off
apc.max_file_size => 1M => 1M
apc.mmap_file_mask => /tmp/apc.XXXXXX => /tmp/apc.XXXXXX
apc.num_files_hint => 1000 => 1000
apc.preload_path => no value => no value
apc.report_autofilter => Off => Off
apc.rfc1867 => Off => Off
apc.rfc1867_freq => 0 => 0
apc.rfc1867_name => APC_UPLOAD_PROGRESS => APC_UPLOAD_PROGRESS
apc.rfc1867_prefix => upload_ => upload_
apc.rfc1867_ttl => 3600 => 3600
apc.serializer => default => default
apc.shm_segments => 1 => 1
apc.shm_size => 64M => 64M
apc.slam_defense => On => On
apc.stat => On => On
apc.stat_ctime => Off => Off
apc.ttl => 0 => 0
apc.use_request_time => On => On
apc.user_entries_hint => 4096 => 4096
apc.user_ttl => 0 => 0
apc.write_lock => On => On
````

導入後の状態
----
下記の感じでロードアベレージが3～4位に下がりました。
依然としてidleは0なのでこれでもまだ重いという見方もありますが、効果はありました。

````
top - 05:55:50 up 21 days,  4:52,  1 user,  load average: 3.70, 4.21, 6.01
Tasks: 110 total,   5 running, 105 sleeping,   0 stopped,   0 zombie
Cpu(s): 31.1%us, 12.9%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.6%si, 55.3%st
Mem:   1696964k total,  1212980k used,   483984k free,   159764k buffers
Swap:   917500k total,        0k used,   917500k free,   653836k cached
````

おわりに
----
Zabbixそのものもオープンソースですが、Zabbixの周辺技術もPHPやApacheなどオープンソースプロダクトを利用しています。
結果として、各々のオープンソースプロダクトに関する技術の恩恵をダイレクトに得られるというのは素晴らしい事ですね。
Ubuntu 12.04.2 に最新のLXCをインストール

Ubuntu 12.04.2 標準のLXCが 0.7.5 のため、最新の0.9を入れる。

インストール
====

```bash:
$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:ubuntu-lxc/daily
$ sudo apt-get update
$ sudo apt-get install lxc
```

必要な設定追加
====

/etc/default/lxc に bridge設定が記載されていない場合、動作しないため追記する。

bridge設定
----

```bash:/etc/default/lxc
USE_LXC_BRIDGE="true"
LXC_BRIDGE="lxcbr0"
LXC_ADDR="10.0.3.1"
LXC_NETMASK="255.255.255.0"
LXC_NETWORK="10.0.3.0/24"
LXC_DHCP_RANGE="10.0.3.2,10.0.3.254"
LXC_DHCP_MAX="253"
```

MIRROR設定
----

```bash:/etc/default/lxc
MIRROR="http://jp.archive.ubuntu.com/ubuntu/"
```

コンテナ作成の状況確認
====

```bash:
$ watch "ps -ef | grep lx[c]"
```

* コンテナは手動で作ったほうが状況がわかり良いかと思います。
  `$ sudo lxc-create -n ubuntu-test1 -t ubuntu`
OS起動時、eth0とeth1が入れ替わる件の対処

macアドレス確認
----

```bash:
$ ifconfig |grep eth
eth0      Link encap:イーサネット  ハードウェアアドレス 6c:62:6d:6c:07:fd  
eth1      Link encap:イーサネット  ハードウェアアドレス 00:0e:0c:80:b3:c1
```

LANケーブルを抜き差ししてethの番号を確認
----

```bash:
$ dmesg -T | tail
[火  8月 13 02:30:48 2013] atl1c 0000:02:00.0: atl1c: eth0 NIC Link is Down
[火  8月 13 02:30:50 2013] atl1c 0000:02:00.0: atl1c: eth0 NIC Link is Up<100 Mbps Full Duplex>
```

MACアドレスに対するインターフェース名を指定
----

```bash:/etc/udev/rules.d/70-persistent-net.rules
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="6c:62:6d:6c:07:fd", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0e:0c:80:b3:c1", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
```

OS再起動後、反映されます。
マルチスレッドの評価プログラムの検証ひな形。

似たようなコード書き過ぎなので未来の自分がコピペ出来るようにマルチスレッドの性能を評価したい場合に書くコードの雛形を抜き出した。

```cpp:
#include <pthread.h>  // pthread_create/join
#include <sys/time.h>  // gettimeofday
#include <stdio.h>  // printf, perror
#include <stdlib.h>  // exit
#define _GNU_SOURCE 1
#include <sched.h>  // sched_setaffinity

struct working_set {
  int tid;
  pthread_barrier_t* bar;
  // 各スレッドで共有したいものはこの構造体に足す
};

void* work(void* w) {
  workingset* ws = (working_set*)w;

  // スレッドアフィニティの設定。tid番目のコアにこのスレッドを貼り付ける
  cpu_set_t mask;
  CPU_ZERO(&mask);
  CPU_SET(ws->tid, &mask);
  if (sched_setaffinity(0, sizeof(mask), &mask) == -1) {
    perror("setaffinity:");
    exit(1);
  }

  // 測定開始待ち
  pthread_barrier_wait(ws->bar);
  // この位置に測定したい処理の本体を書く。
  // 構造体wsに入れた物を使うのが一般的
  pthread_barrier_wait(ws->bar);
}

// 現在時刻をそれなりの精度で求める関数
double now(){
  struct timeval t;
  gettimeofday(&t, NULL);
  return (double)t.tv_sec + (double)t.tv_usec * 1e-6;
}


int main(int argc, char** argv) {
  if (argc < 2) {  // ./a.out 4 って書くと4スレッドになる
    printf("set thread num\n");
    return 1;  // 指定漏れがあった場合は自殺
  }
  const int threads = atoi(argv[1]);

  // 各スレッドやデータ構造の初期化
  pthread_t th[threads];
  pthread_barrier_t barrier;
  working_set ws[threads];
  pthread_barrier_init( &barrier, 0, threads + 1);

  for (int i = 0; i < threads; ++i) {
    ws[i].tid = i;
    ws[i].bar = &barrier;
    ws[i].size = (work_size / threads) + 1;
    pthread_create(&th[i], NULL, work, &ws[i]);
  }

  // 測定開始
  const double start = now();
  pthread_barrier_wait(&barrier);

  // 測定終了
  pthread_barrier_wait(&barrier);
  const double finish = now();

  for (int i = 0; i < threads; ++i) {
    pthread_join(th[i], NULL);
  }

  // 経過時間を表示
  printf("thread[%d] time: %lf sec\n", threads, finish - start);
  return 0;
}
```
非エンジニア向けのMercurial入門


##Mercuralとは？

###非エンジニアにとってのお役立ち度/知名度が最も高いツールだと思う。

版管理ツールと呼ばれるもののひとつで、ファイルに対して、Windowsにおける復元ポイントみたいなものをつくってくれるツール。プレステにおけるメモリーカード的なツールとも言える。ファイルの状態をセーブ・ロード・コピーできる。下記では、プレステのメモリーカードに例えて話をすすめる。版管理を言葉で説明するのは難しいので、実際に動かしてみることを激しく勧める。インストールして動く状態になっていれば、基礎は20分くらいで習得できると思う。

##Mercurialのインストール方法は？

 [ここ](http://mercurial.selenic.com/)から最新版のMercurialをダウンロードしてインストール

\#たぶんあってるけど、ちがったらごめん


##空のメモリーカードを作成する

```sh
hg init

```

Mercurialは、フォルダごとに管理を行うため、監視したいフォルダごとにメモリーカードが必要になる。
Windows7なら、windows key->cmd->enterを押すとコマンドプロンプトが出る。入力して監視したいフォルダまで移動し、上記のコマンドを打つことで空のメモリカードを作成する。成功すると、該当のフォルダに.hgという名前のフォルダが作成される。この.hgフォルダがメモリカードに相当する。
移動の意味がわからなかったら、そのへんのエンジニアに聞けば5秒くらいで回答してくれるはず。

##該当のディレクトリ配下にあるファイルをメモリーカードの保存監視対象にする

```sh
hg add

```

このコマンドで該当のフォルダ内のファイルがすべて監視対象になる。新たにファイルを追加するたびに実行する必要がある。

##該当ディレクトリの監視状態を確認する

```sh
hg st
#M tinko.txt
#A hage.txt
#! unko.txt
#? fugu.txt

```

このコマンドで監視状態を確認することができる。
上記のMが最後にセーブデータに記録されてから編集されたファイル。Aが監視対象に新たに加えられたファイル。!が監視対象だったが削除されたファイル。?が監視対象にないファイル。Rは監視対象から外され、かつ削除されたファイル。

##メモリーカードに現在のフォルダの中の状態をセーブする

```sh
hg ci -m "セーブに関するメモをここに残す"

```

このコマンドにより、セーブデータ(=復元ポイント)を作成できる。.hgフォルダをいじらない限り、セーブデータは消えないと思っていていい。

##メモリーカードのセーブのログを見る

```sh
hg log

```

いままで作成したセーブデータの履歴をみることができる。セーブデータごとに番号がついている。

##メモリーカードのセーブデータからロードする

```sh
hg up -C セーブの番号
#例　hg up -C 3
#上記の例は、3番のセーブを復元するという意味

```

上記を実行すると、該当のセーブデータの状態にファイルが書き換わる。過去のセーブデータからロードを行っても、一度セーブしたデータは消えないので、安心していい。

##最後にロードしたセーブデータをみる

```sh
hg par

```

このコマンドで、最後にロードを行ったセーブデータの概要を見ることができる。
ロードを一度も行っていなければ、最後にセーブしたデータの概要が表示される。

##セーブデータをコピーする

```sh
hg clone パス名
#例　hg clone c:¥MercurialTest
#c:¥MercurialTestにメモリーカードがあれば、そのフォルダごとコピーしてカレントディレクトリにコピーする
#カレントディレクトリがわからなければ、そのへんのエンジニアに聞いてください

```

##想定FAQ

###Q.なんでgitじゃないの？
むずかしいから。

###Q.セーブデータの正式名称は？
リポジトリ。

###Q.Windows環境で日本語設定がうまくいかないんだけど、解決策ある？
ある。ぐぐれ。たぶん簡単。7は手元にないからわからん。XPの設定は要望があれば載せる。
ヒント:c:¥program files¥Mercurial¥Mercurial.ini

###Q.説明の意味がよくわからないのでもっと詳しく教えてください
どのサイトの説明見てもたぶんあまりピンとこない。インストールさえ終われば動かすのは簡単だし、20分くらいでそれぞれのコマンドの意味はわかるんじゃないかと思う。

###Q.出力結果例示したりチュートリアルっぽくして教えてください
眠たい。達人は編集リクエストください。
rm コマンドのエイリアスを晒す

rm コマンドにおいて、『やってはいけない』とされているのが以下の2つ
####$ rm -rf /
####$ rm .*
不図とした拍子のタイプミスや勘違いによる実行など、考えただけでもゾッとします。
逆に、rm コマンドの安全対策としては以下の3つが挙げられます。

```bash:.bashrc
alias rm='rm -i'
```

```bash:.bashrc
set rmstar
```

```bash:.bashrc
alias rm='mv -i ~/Trash'
```

しかし、私としては

1. ファイル毎に`y[Enter]`をタタくのは面倒だ

2. *を用いて、ファイルを安全かつ効率的に削除したい

ので、rm コマンドに以下のエイリアスを被せています。

```bash:.bashrc
alias rm='set -f; rmrm'
function rmrm() {
    local ch
    echo $@ | grep -Gq "^/$\| /$\|^/ \| / "
    if [ $? -eq 0 ]; then
        set +f
        echo "DONOT execute 'rm /'"
        return 1
    fi

    echo $@ | grep -q "*"
    if [ $? -eq 0 ]; then
        set +f
        ls $@
        if [ $? -ne 0 ]; then
            return 0
        fi
        echo -n "Are you sure? [Y/n] "
        while : ; do
            read ch
            if [ "${ch}" = "Y" ]; then
                command rm $@
                return 0
            elif [ "${ch}" = "n" ] || [ "${ch}" = "N" ]; then
                return 1
            else
                echo -n "[Y/n]"
            fi
        done
    else
        command rm $@
        return 0
    fi
}
```

上記のエイリアスによって

>$ ls
>hoge.aux  hoge.dvi  hoge.log  hoge.pdf  hoge.tex  piyo.eps
>
>$ rm hoge*
>hoge.aux  hoge.dvi  hoge.log  hoge.pdf  hoge.tex
>Are you sure? [Y/n] Y
>
>$ ls
>piyo.eps

となります。
関数にsetTimeout機能を追加する

functionのprototypeを使ってコーディングしているときに、定義したfunctionのprototypeメンバとして登録した関数をsetTimeoutしたときに、関数内でthisが元の定義したfunctionになるようにする方法


<pre>
Function.prototype.doTimeout = function (duration, self, args){
	var func = this;
	return setTimeout(
	function() {
		func.apply(self, args);
	},
	duration);
};
</pre>

Functionにこんな関数を定義しておくと、以下のような使い方ができる

<pre>
function NewClass(){
	this.prop = 666;
};
NewClass.prototype.do_after_timeout = function(arg){
	alert(arg + ':' + this.prop);
};
NewClass.prototype.disp = function(){
	this.do_after_timeout.doTimeout(3000, this, ['this.prop']);
};
var nf = new NewClass();
nf.disp();
</pre>

scriptタグ内にこれを埋めれば３秒後に「this.prop:666」というメッセージがアラートに表示される。

setIntervalも同じ形で可能
第12回オフラインリアルタイムどう書くの問題をRubyで解きました

１ヶ月前の問題を今更ですが、解きました。
よく言えば、素直な、
悪く言えば、面白みのない回答です。

問題：http://nabetani.sakura.ne.jp/hena/ord12rotdice/
回答例：http://qiita.com/Nabetani/items/f3cca410428f90333e28



```ruby:dice.rb
#coding:utf-8

def calc src
  c = {e:4, n:2, c:1}
  dst = [c[:c]]
  src.chars.each do |dir|
    c = {"E"=>{e:c[:c], n:c[:n], c:7-c[:e]},
         "W"=>{e:7-c[:c], n:c[:n], c:c[:e]},
         "S"=>{e:c[:e], n:7-c[:c], c:c[:n]},
         "N"=>{e:c[:e], n:c[:c], c:7-c[:n]}}[dir]
    dst.push c[:c]
  end
  dst.join
end

DATA.each do |d|
  n,src,dst = d.split
  r = calc src
  puts "[#{n}] #{dst} != #{r}" if r!=dst
end

__END__
0       NNESWWS 15635624
1       EEEE    13641
2       WWWW    14631
3       SSSS    12651
4       NNNN    15621
5       EENN    13651
6       WWNN    14651
7       SSNN    12621
8       NENNN   153641
9       NWNNN   154631
10      SWWWSNEEEN      12453635421
11      SENWSWSNSWE     123123656545
12      SSSWNNNE        126546315
13      SWNWSSSWWE      12415423646
14      ENNWWS          1354135
15      ESWNNW          1321365
16      NWSSE           154135
17      SWNWEWSEEN      12415154135
18      EWNWEEEEWN      13154532426
19      WNEWEWWWSNW     145151562421
20      NNEE            15631
21      EEEEWNWSW       1364145642
22      SENNWWES        123142321
23      SWWWSNSNESWW    1245363635631
```
サーバーコントロール非対応の属性を出力する

　コードビハインドで追加してもいいけど、もっと楽な方法があった。
　サーバーコントロールに存在しないプロパティは直接 HTML タグの属性として出力してくれるらしい。

```aspx-vb:
<asp:Label ID="lblTest" runat="server" aaa="bbb">テスト</asp:Label>
```

```html:
<label id="lblTest" aaa="bbb">テスト</label>
```

　これを利用して非対応の HTML5 の属性などを埋め込める（最新版は対応してるのかな？）。

```aspx-vb:
<asp:TextBox ID="lblNumberPlate" runat="server" placeholder="4649"></asp:Label>
```

```html:
<input type="text" placeholder="4649"></input>
```
Middleman で link_to_if っぽいことをやる

[ブログ](http://d.hatena.ne.jp/ken_c_lo/20130811/1376216598)にも書いたのだけど、qiita デビューしてみたかったのでこっちにも書いてみようそうしよう。

```html:
<!-- こういうナビゲーションを作りたい時 --> 
<nav class="nav">
  <ul>
    <li class="current">ホーム</li>
    <li><a href="concept.html">コンセプト</a></li>
    <li><a href="products.html">製品情報</a></li>
    <li><a href="contact.html">お問い合わせ</a></li>
  </ul>
</nav>
```
ナビゲーションで、現在地を表すナビだけリンクをつけないみたいなことをやる時、Railsだと、```link_to_if``` とか ```link_to_unless``` とかを使うと便利だが、Middlemanのヘルパーにはそういうのは特にないっぽかったので、どうにかして似たような事をやろうと思ったらこんな感じになった。

```haml:source/partials/_nav.html.haml
-# source/partials/_nav.html.haml
%nav.nav
  %ul
    - data.nav.pages.each do |page|
      %li{ class: "#{'current' if page_classes == page.name}" }
        = page_classes == page.name ? page.label : (link_to page.label, "#{page.name}.html")
```

```yaml:
# data/nav.yml
pages:
  - name: 'index'
    label: 'ホーム'
  - name: 'concept'
    label: 'コンセプト'
  - name: 'products'
    label: '製品情報'
  - name: 'contact'
    label: 'お問い合わせ'
```

index, concept, product, contact みたいな4つのページが仮にあったとして、それぞれ同じナビゲーション用のパーシャル ```source/partials/_nav.html.haml``` を呼び出すとする。

Middlemanのデフォルトのレイアウトは、ページごとにファイル名と同じ名前（index.html だったら "index" という名前）の class が外側の body につくようになってて 、これが ```"#{page_classes}"``` という 変数で呼び出されるようになってるので、これを利用して、この ```page_classes``` が、データで指定した ```page.name``` と一緒だったら、current ページを表すナビゲーションとして処理するという感じにした。三項演算子のところは、もっとシンプルに書けるんでは？という気もするのだけど、これ以外に思いつかなかった。

ナビゲーションの内容は、マークアップとは別の YAML ファイルに ```data/nav.yml``` みたいにして置いておく。Frontmatter でもいいんだけど、複数ページで共通の要素なので、外部に置いた方がキレイに共通化できる。コンテンツを外出しするとマークアップがこれだけで済むのがステキですね。Middlemanステキですね。

Rails とまんま一緒のヘルパーを使いたければ、自分で ```config.rb``` に追加するという方法もあるらしいが、今回はそれほどという感じでもなく。またこれそういえば、ページが階層構造になったらどうするんだろうなー。まだ考えてない。もっと汎用的ないい方法がありそうな気もする :bird:
Oracleのセッション数を確認するシェルスクリプト


```bash
#!/bin/bash
# set environment
export ORACLE_SID=xxx
export ORACLE_HOME=/path/to/oracle/home
export PATH=$ORACLE_HOME/bin:$PATH
export NLS_LANG=American_America.AL32UTF8

CONN=user/password@$ORACLE_SID
LOG_FILE=/var/www/html/ora_sessions/print_ora_sessions.`date +%Y%m%d%H%M%S`.log


sqlplus -s $CONN >> $LOG_FILE <<EOF
  set pages 10000
  set lines 150
  COLUMN sid FORMAT 99999
  COLUMN machine FORMAT a20
  COLUMN username FORMAT a20
  COLUMN status FORMAT a10
  COLUMN program FORMAT a50

  ALTER SESSION SET nls_date_format='yyyy/mm/dd hh24:mi:ss';

  SELECT sid,serial#,machine,program,username,logon_time,status
    FROM v\$session
    ORDER BY logon_time;

  quit
EOF
```
OracleでセッションIDからOSのプロセスを調べる方法


```sql
SELECT
  proc.spid, 
  ses.sid, 
  ses.serial#, 
  ses.username, 
  ses.program, 
  ses.machine, 
  ses.osuser
FROM v$session ses, v$process proc
WHERE ses.paddr = proc.addr;
```
linkタグのhref属性にアプリケーションのルートパスからの相対パスを指定する

　ASP.NET Web Form の link タグなどはサーバーコントロールではないので、通常はアプリケーションのルートパスからの相対パスを記述不可能。
　代替策としては以下の方法がある。

```aspx-vb:
<link href="<%= Me.ResolveClientUrl("~/css/bootstrap.min.css") %> rel="stylesheet" />
```

　ただし、これだと VisualStudio で HTML の class 属性などを編集する際にインテリセンスが働かない。
　以下のように runat="server" を付与して HTML コントロール化してあげれば、アプリケーションのルートからの相対パスを解釈してくれるようになり、インテリセンスも働いてくれる。

```aspx-vb:
<link href="~/css/bootstrap.min.css" rel="stylesheet" runat="server" />
```
3つのUIViewをくるくる入れ替える

説明不足なお遊びソース。
mainView, subView1,2 を設定して、subView1,2をタップしたらmainViewと入れ替えます。

```objective-c:ViewController

@interface UIView(Swap)
-(void)removeAllGestures;
@end
@implementation UIView(Swap)
-(void)removeAllGestures
{
    for (UITapGestureRecognizer *gesture in self.gestureRecognizers) {
        [self removeGestureRecognizer:gesture];
    }
}
@end


@implementation PAMTripleViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view.
    
    [self setupGesture];

}

-(void)setupGesture
{
    [self.mainView removeAllGestures];
    [self.subView1 removeAllGestures];
    [self.subView2 removeAllGestures];
    UITapGestureRecognizer *tapView1 =
    [[UITapGestureRecognizer alloc]initWithTarget:self
                                           action:@selector(swapMainToSub:)];
    [self.subView1 addGestureRecognizer:tapView1];
    
    UITapGestureRecognizer *tapView2 =
    [[UITapGestureRecognizer alloc]initWithTarget:self
                                           action:@selector(swapMainToSub:)];
    [self.subView2 addGestureRecognizer:tapView2];
}

-(void)swapMainToSub:(id)sender
{
    UITapGestureRecognizer *gesture = (UITapGestureRecognizer *)sender;
    [self swapAnimationView:self.mainView toView:gesture.view];
    if( self.subView1 == gesture.view ){
        UIView *subView = self.subView1;
        self.subView1 = self.mainView;
        self.mainView = subView;
    }else if( self.subView2 == gesture.view ){
        UIView *subView = self.subView2;
        self.subView2 = self.mainView;
        self.mainView = subView;
    }
    [self setupGesture];
}
-(void)swapAnimationView:(UIView *)view1 toView:(UIView *)view2
{
    [UIView animateWithDuration:0.5
                     animations:^{
                         CGRect view1Frame = view1.frame;
                         view1.frame = view2.frame;
                         view2.frame = view1Frame;
                         // autolayoutの影響か、↓したら元の場所に戻る。
                         // 制約が効いてるから当然ちゃあ当然。
                         // autolayoutの制約を動かしたりするのまでは大変なのでやらない。
//                         [view1 layoutIfNeeded];
//                         [view2 layoutIfNeeded];
                     }];
}

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

@end

```
OSXのChrome/Safariにて、全角幅=2半角幅で等幅表示するためのCSS


OSXのChromeにて、pre要素のfont-familyにmonospaceを指定したのですが、全角と半角それぞれは等幅になっているものの、いわゆる全角文字が半角2つ分で表示されていませんでした。あれれと、以前はそうなっていたのにと色々試していたところ、font-sizeが関係していました。

## 等幅で全角文字=半角2つ分となる条件
font-familyで等幅フォントを指定し、かつfont-sizeはpxかemで指定しつつ、以下の条件を満たしていればOKのようでした。

* pxで指定する場合は、偶数であること
* emで指定する場合は、自然数であること

## CSSの例

例えばこんな感じで。

```
font-family: Osaka-mono, "Osaka-等幅", "ＭＳ ゴシック", monospace;
font-size: 14px;
```

ちなみにCourier NewやCourierは全角文字=半角2つ分となりませんのでご注意を。
grunt-releaseでversionを上げられる男になろう


弊社の大先輩、[mashさん](http://twitter.com/maaash)がpull-req送っていたのを偶然見て、
grunt-releaseというプラグインの存在を知りました。

- [dry run support by mash · Pull Request #29 · geddski/grunt-release](https://twitter.com/maaash/status/364639857882038275)


これが、npmやbowerにがんがんライブラリを置いている自分には、
めちゃくちゃべんりでした!

bowerでライブラリ公開するハードルを下げることにもなる、
と思うのでちょっと紹介してみます。

## grunt-releaseとは
- [geddski/grunt-release](https://github.com/geddski/grunt-release)

grunt-releaseは、git管理しているライブラリの
**versionアップ時の作業を自動化してくれる** gruntプラグインです。

具体的には、

- 設定ファイルから、現在のversionを取得
- 次に使うべきversionを計算 (semver形式)
- そのversion名をgitのtagとして適用
- versionを指定している設定ファイルを書き換え
- 設定ファイルへの変更をコミット
- tagおよび設定ファイルの変更をpush
- 必要ならnpm publishを実行

という、雑務としか言い様のない部分を、まるっとやってくれます。

レジストリは、npmにもbowerにも対応しており、
他にもgitのtagを使っているものならば、うまく使えるのではないでしょうか。
(jquery pluginsとか。未検証だけど。)

## 導入方法
まずはプロジェクトにインストール。

```bash
npm install --save-dev grunt-release
```

続いてGruntfileの編集。

### npmの場合
```javascript
module.exports = function(grunt) {
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        release: {
            // おおむね、デフォルトの設定で問題ないです
            options: { } 
        }
    });

    grunt.loadNpmTasks('grunt-release');
    grunt.registerTask('default', ['release:patch']);
};
```

### bowerの場合
```javascript
module.exports = function(grunt) {
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        release: {
            options: {
                // 設定ファイルとしてbower.jsonを指定
                file: 'bower.json', 
                // npm publishは実行しない
                npm: false
            }
        }
    });

    grunt.loadNpmTasks('grunt-release');
    grunt.registerTask('default', ['release:patch']);
};
```

こんな感じです。
bowerの設定ファイルは、bowerのversionが古いと、
```bower.json``` ではなく ```component.json``` となってるかもしれないので、そこは気をつけてください。

## いざ、version up
設定ができたら、task実行で実際にversion upができます。

relaseタスクには、4つの環境が用意されています。
それぞれで、アップデートする先のversionが変わります。

### メジャーリリース (0.0.0 → 1.0.0)
```
grunt release:major
```
### マイナーリリース (0.0.0 → 0.1.0)
```
grunt release:minor
```
### パッチリリース (0.0.0 → 0.0.1)
```
grunt release:patch
```
### プレリリース (0.0.0 → 0.0.0-0)
```
grunt release:prerelease
```

*MAJOR.MINOR.PATCH* って形なんですね。知らなかった……。

## 動作を確かめてからリリースする

また、いきなり実際のアップデートをするのが怖い場合は、 ```--no-write``` オプションを使いましょう。

```-v``` オプションと組み合わせることで、
実際のgit tagやnpm publishは行わずに、何が起きるかだけを先に確認することができます。

以下、実際にやってみたときの出力例です。

```
% grunt release:prerelease -v --no-write

Running tasks: release:prerelease

Running "release:prerelease" (release) task
Reading bower.json...OK
Parsing bower.json...OK
Not actually writing bower.json...OK
>> Version bumped to 0.0.2-0
Not actually running: git add bower.json
Not actually running: git commit bower.json -m "release 0.0.2-0"
>> bower.json committed
Not actually running: git tag 0.0.2-0 -m "version 0.0.2-0"
>> New git tag created: 0.0.2-0
Not actually running: git push
>> pushed to remote
Not actually running: git push --tags
>> pushed new tag 0.0.2-0 to remote
```

## まとめ
grunt-releaseは、
**Web開発で自動化できる部分を自動化して、もっと大事なことに集中する**
という目的に適った、いいプラグインですねぇ。

JSプログラマの方、手元のライブラリ管理がぐっと楽になるので、
ぜひぜひ使ってみてくださいー。
bashの設定ファイル

　ややこしい。いっつも忘れる。優先順位のおはなし

1./etc/profile
2.~/.bash_profile
3.~/.bash_login
4. ~/.profile

せめて、このbash_loginが無ければまだわかりやすいんだけどね。何だろね、この階層化。

まぁ厳密にはなんか色々違うみたいだけどさ。

##よく使う設定とか

### プロンプトの設定
~~~~うちはこんな感じ
PS1="\[\e[1;33m\][\u \w]\[\e[00m\]\$ "
~~~~

フォーマットには色々あるけど、[こちら](http://babyp.blog55.fc2.com/blog-entry-663.html)がいろいろ綺麗にまとまっててステキ。

###環境変数の設定
~~~~PATHとかFUEL_ENVとか
export KEY=VALUE
~~~~

###エイリアスの設定
~~~~例えば
alias sublime='open -a Sublime\ Text\ 2 $1'
alias php5='/usr/local/php5/bin/php'
alias bashedit='sublime ~/.bash_login;'
alias bashload='source ~/.bash_login'
~~~~
UIButtonにアクションを設定するとき引数も渡す


　`UIButton` へ `addTarget:action:forControlEvents:` を送るとき、セレクタの他に引数としてオブジェクトを渡したいときがあるらしいです。動的なメソッド追加を利用すれば再現できそう。

```objective-c
#import <Foundation/Foundation.h>
#import <objc/message.h>
#import <objc/runtime.h>

@interface UIButton (WithObject)

- (void)addTarget:(id)target action:(SEL)action withObject:(id)object forControlEvents:(UIControlEvents)controlEvents;
- (void)removeTarget:(id)target action:(SEL)action withObject:(id)object forControlEvents:(UIControlEvents)controlEvents;

@end

@implementation UIButton (WithObject)

- (void)addTarget:(id)target action:(SEL)action withObject:(id)object forControlEvents:(UIControlEvents)controlEvents {
    // 渡されたセレクタとオブジェクトから新しいセレクタを作成
    NSString* replaced = [NSStringFromSelector(action) stringByReplacingOccurrencesOfString:@":" withString:@"_"];
    SEL selector = NSSelectorFromString([NSString stringWithFormat:@"%@%tu", replaced, [object hash]]);

    // 渡されたセレクタとオブジェクトでメッセージを送るだけのメソッドを追加
    IMP impl = imp_implementationWithBlock(^(id self_) {
        objc_msgSend(self_, action, self, [object copy]);
    });
    class_replaceMethod([target class], selector, impl, "v@:@");

    // 追加したメソッドをターゲットに登録
    [self addTarget:target action:selector forControlEvents:controlEvents];
}

- (void)removeTarget:(id)target action:(SEL)action withObject:(id)object forControlEvents:(UIControlEvents)controlEvents {
    // 渡されたセレクタとオブジェクトから追加したセレクタを作成
    NSString* replaced = [NSStringFromSelector(action) stringByReplacingOccurrencesOfString:@":" withString:@"_"];
    SEL selector = NSSelectorFromString([NSString stringWithFormat:@"%@%tu", replaced, [object hash]]);

    // 追加したメソッドをターゲットから削除
    [self removeTarget:target action:selector forControlEvents:controlEvents];
}

@end
```

```objective-c
@interface ViewController ()

@property (readwrite, nonatomic, weak) IBOutlet UIButton* effect_button;
@property (readwrite, nonatomic, weak) IBOutlet UIButton* remind_button;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self.effect_button addTarget:self action:@selector(call:withMessage:) withObject:@"Amnesia effect!" forControlEvents:UIControlEventTouchUpInside];
    [self.remind_button addTarget:self action:@selector(call:withMessage:) withObject:@"Amnesia remind!" forControlEvents:UIControlEventTouchUpInside];
}

- (IBAction)call:(id)sender withMessage:(NSString*)message {
    NSLog(@"%@", message);
}

@end
```
`objc_msgSend`関数が可変長引数なので、やろうと思えばいくつでも引数を増やせる。と思う。

> [BlockからSelector(メソッド)を作る - Qiita](http://qiita.com/items/a0184fdbb9794f741f08)

> [Objective-C Runtime Reference - Mac Developer Library](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html)

　追記。CocoaPods に登録しました。どうぞ、可愛がってやってください。

> [woxtu/UIButton-WithObject - GitHub](https://github.com/woxtu/UIButton-WithObject)
UnityでAssetを販売するための覚書（リンクのみ）

Unityで自作Assetを作って販売するときに役立ちそうなリンクをまとめたサイト

[http://masa795.hatenablog.jp/entry/2013/05/03/091223](http://masa795.hatenablog.jp/entry/2013/05/03/091223)
色々なport forwarding方法

http://192.168.11.13:8080/ にアクセスすると http://10.0.3.2/ の画面を出す設定例


## redirを使う方法

```sh
# lport : 転送先ポート、cport : 転送元ポート
redir --lport=8080 --cport=80
```

```bash:
# IPアドレスを指定する場合
redir --lport=8080 --cport=80 --caddr=10.0.3.2
```

```sh
# バックグラウンドで動かす場合
nohup redir --lport=8080 --cport=80 &
```

## stoneを使う方法

```bash:80->8080
$ stone 10.0.3.2:80 8080
```

```bash:22->443
$ sudo stone 10.0.3.2:22 443
```

## iptables

設定初期化
----

```bash:
$ sudo iptables -F
```


設定
--------

```bash:forwarding.sh
# 変数
PUBLIC_IP=192.168.11.13
LXC_IP=10.0.3.2
HOST_PORT=8080
GUEST_PORT=80

# ルーティング
sudo iptables -t nat -A PREROUTING -p tcp -d $PUBLIC_IP --dport $HOST_PORT \
    -j DNAT --to-destination ${LXC_IP}:${GUEST_PORT}

# 通信許可設定（なくてもよい）
# sudo iptables -A FORWARD -p tcp -d $LXC_IP --dport $GUEST_PORT -j ACCEPT

# 必須
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
```

* iptablesの場合、localhost:8080 にアクセスしても 10.0.3.2:80に転送されません。


## iptablesメモ

変更する番号を確認
-------------------
`iptables -nL --line-numbers`

変更する場合
-------------------
`iptables -R INPUT [変更する番号] -s [変更するIP] -p tcp --dport 22 -j ACCEPT`

削除
-------------------
`iptables -D INPUT [削除する番号]`

port forwarding
-------------------
`iptables -A INPUT -p [tcp|udp] -s [送信元IP] --sport [送信元ポート] -d [送信先IP] --dport [送信先ポート] -j [ACCEPT|DROP|REJECT]`
LXCをブラウザで操作できるLXC Web Panelが素晴らしかった件

* LXC1.0以前
[LXC Web Panel](http://lxc-webpanel.github.io/) 

* LXC1.0以降[claudyus.github.io/LXC-Web-Panel/](http://claudyus.github.io/LXC-Web-Panel/)

Flask+twitter_bootstrapで作られています。
[claudyus/LXC-Web-Panel](https://github.com/claudyus/LXC-Web-Panel)

インストール
====

```bash:
$ sudo apt-get install python-dev
$ sudo sh -c "wget http://lxc-webpanel.github.io/tools/install.sh -O - | bash"
```

ファイル構成
====

/srv/lwp/
----

|ファイル|説明|
|:----------|:--------------|
| ./lwp.py  |  (python) 本体 |
| ./lwp.conf  |  (lwp.py用コンフィグ) webサーバ設定、dbファイル名、セッション期限 |
| ./lwp.db  |  (sqlite3のdb) ログイン認証に使われる。usersテーブルのみ存在。 |
| ./lwp/  |  (python)  /etc/lxc/以下の設定を見たり、サーバーの負荷を取得します。 |
| ./lxclite/  |  (python) lxcコマンドを実行して結果を取得します。 |
| ./static/  |  cssとかjsとか |
| ./templates/  |  html。テンプレート |

/etc/
----

* /etc/init.d/lwp
* /etc/rc0.d/K20lwp
* /etc/rc1.d/K20lwp
* /etc/rc2.d/S20lwp
* /etc/rc3.d/S20lwp
* /etc/rc4.d/S20lwp
* /etc/rc5.d/S20lwp
* /etc/rc6.d/K20lwp

アクセス
====

デフォルトでは http://localhost:5000 、admin/admin

推奨設定
----

* lwp.conf で debug出力はあったほうがいいです。

起動・終了
====

```bash:
$ sudo /etc/init.d/lwp start
$ sudo /etc/init.d/lwp stop
$ sudo /etc/init.d/lwp restart
```

スクリーンショット
====

![](http://lxc-webpanel.github.io/img/screenshots/screenshot01.png)
![](http://lxc-webpanel.github.io/img/screenshots/screenshot02.png)
![](http://lxc-webpanel.github.io/img/screenshots/screenshot03.png)
CentOS 6.4 minimal の環境に　Chef-solo を入れる。（必然的にRubyもインストール）


# 注意
現在は、ChefDKのrpmで簡単にChef及びknifeをインストール可能です。
以下の手順は、昔のやり方ですので参考にしないでください。

#想定環境
	CentOS release 6.4 (Final) （minimumインストール）


#コンパイル等に必要なmoduleのインストール
	yum groupinstall "Development Tools"

	yum install libffi-devel openssl-devel readline-devel zlib-devel git subversion gdbm-devel httpd-devel libcurl-devel ncurses-devel openssl-devel readline-devel sqlite-devel zlib-devel 

#libyaml-devel を 導入するために、epel レポジトリを導入。（通常epelを使わない設定に変更）
    rpm -Uvh http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
	sed -i "s%enabled=1%enabled=0%g" /etc/yum.repos.d/epel.repo
	yum --enablerepo=epel install libyaml-devel

#Rubyインストール
	cd
	wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p327.tar.gz
	tar xvzf ruby-1.9.3-p327.tar.gz
	cd ruby-1.9.3-p327
	./configure --prefix /opt/ruby
	make;make install

#Chefのインストール
	/opt/ruby/bin/gem install chef
	/opt/ruby/bin/gem install knife-solo

#Chefで使うオペレーションアカウントの作成
	useradd chef-ope

	sudo su  - chef-ope

#/opt/ruby/bin に Pathを通す。

	echo "PATH=\"$PATH\":/opt/ruby/bin/" >> ~chef-ope/.bashrc

	source ~chef-ope/.bashrc


#Knife 設定
	knife configure


#Chefのレポジトリ作成
	knife solo init chef-repo


#Chefレシピを作成して、うまくツールが動かなかったら、
~/.chef/knife.rb に対して、下記のように追記してパスを通す。
	
	cookbook_path [
	  "/home/chef-ope/chef-repo/cookbooks",
	  "/home/chef-ope/chef-repo/site-cookbooks"
	]
	role_path		'/home/chef-ope/chef-repo/roles'
	data_bag_path		'/home/chef-ope/chef-repo/data_bags'
procmailで迷惑メール対策 (一ユーザとして)

* [PROCMAIL](http://www.jaist.ac.jp/~fjt/procmail.html)
* [メールアドレスの区切り文字を使いprocmailの処理を変えると便利 - Qiita](http://qiita.com/tukiyo3/items/545196648a199ab2fa9f)

```bash:
$ sudo apt-get install -y procmail
$ touch ~/procmail.log
```

```bash:~/.forward
"| IFS=' ' && exec /usr/bin/procmail -f- || exit 75 "
```

```bash:~/.procmailrc
MAILDIR=$HOME/Maildir/
DEFAULT=$MAILDIR
LOGFILE=$HOME/procmail.log

# 迷惑メールとして受信しない(ここでは、spamフォルダに移動させてます。)
:0
*^From:.*(@bbilovers.info|store-news@amazon.co.jp)
$MAILDIR/spam/.

# 件名でも振り分けられます。
:0
* ^Subject:.*test.*
$MAILDIR/spam/.

# 日本語の件名はnkfで変換してgrep
:0
*^From:.*@(docomo.ne.jp|ezweb.ne.jp|softbank.ne.jp)
* ? nkf -w | egrep -i 'テスト'
/dev/null

# 重要なメールはgmailにも転送
:0 c
*^From:.*nagios@.*
! myaddr+nagios@gmail.com

# 本文中に含まれる文字でマッチ
:0 B
* ? grep " SALE2017 "
/dev/null
```

`:0 c`は、自分のメールボックスにもコピーを保存。
iOS クラスにメソッドが定義されているか調べる


例えば Deployment Target が3.0で Base SDK が5.0の場合、iOS3の端末で[[UIScreen mainScreen] scale]を実行すると落ちてしまいます。
scaleメソッドはiOS4以上対応のメソッドだからです。

メソッドを実行する前に存在チェックしましょう。

```objectivec
// メソッドの存在チェック
if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
	// ここで実行すると安全
	[[UIScreen mainScreen] scale];
}
```
ImportError: No module named と言われた時の対応方法

```py:
import pyramid.config
```

をすると、`ImportError: No module named interface`と言われるようになった。
`easy_install zope.interface`しても解決しないので原因を調査してみた。

```py:
In [1]: import zope.interface
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-4-bc61dfc4e3ea> in <module>()
----> 1 import zope.interface

ImportError: No module named interface
```

path確認
----

```py:ipython
In [1]: import sys
In [2]: sys.path
Out[2]: 
['',
 '/usr/bin',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-x86_64-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/PILcompat',
 '/usr/lib/python2.7/dist-packages/gtk-2.0',
 '/usr/lib/pymodules/python2.7',
 '/usr/lib/python2.7/dist-packages/ubuntu-sso-client',
 '/usr/lib/python2.7/dist-packages/IPython/extensions']
```

* importは上から順に探して、発見したらそこで終了。

zopeパッケージの格納場所を探す
----

```bash:
$ locate zope | more
...
/usr/local/lib/python2.7/dist-packages/zope
...
/usr/lib/python2.7/dist-packages/zope.interface-4.0.5.egg-info
...
/usr/share/pyshared/zope.interface-4.0.5.egg-info
...
```

```bash:
$ ls /usr/local/lib/python2.7/dist-packages/zope
deprecation
```

このパッケージが邪魔してるので削除。

```bash:
$ sudo rm -r /usr/local/lib/python2.7/dist-packages/zope*
```

```bash:
$ sudo easy_install zope.interface
$ sudo easy_install zope.deprecation
```

```py:
import pyramid.config
```

成功しました。

* どのファイルがimportに使われたかは、helpを使うとわかります。

```py:
import zope.interface
help(zope.interface)
...
FILE
    /usr/lib/python2.7/dist-packages/zope/interface/__init__.py
```
ActionMailerのテスト

## delivery_methodを :test に設定する

Rails 4 ではデフォでなってた。確認するだけ？

```ruby:config/environments/test.rb
  # Tell Action Mailer not to deliver emails to the real world.                                                                                                                   
  # The :test delivery method accumulates sent emails in the                                                                                                                      
  # ActionMailer::Base.deliveries array.  
  config.action_mailer.delivery_method = :test
```

## ActionMailer::Base.deliveriesで送信したMail::Messageにアクセスする

```ruby:spec/some_spec.rb
describe "sample" do 
  #  グローバルな変数みたいなので毎回クリアする。
  after { ActionMailer::Base.deliveries.clear }

  it "sample" do 
    # メール送る処理
    ActionMailer::Base.deliveries.last #=> #<Mail::Message>
    ActionMailer::Base.deliveries.last.body #=> #<Mail::Body>

    expect(ActionMailer::Base.deliveries.last.body).to match(/wellcom/)
  end
end
```
Oculus Rift 初心者よ。スタート地点はココ！

#Oculus Rift初心者だけど開発キット買っちゃった・・・
英文ドキュメントが有志により非公式翻訳されてるので読むべし。それが面倒ならこのQiita投稿の引用箇所だけでも読んでおこう。

##関連リンク
[ゲームは初心者にやさしく: Oculus Rift ドキュメント（非公式翻訳）] (http://gamesonytablet.blogspot.jp/2013/08/oculus-rift.html?spref=tw)

#1. Oculus Riftで眼鏡使っていい？
##アジャスター
>眼鏡を着用をした場合、レンズと画面の距離を調整するためにヘッドセットの左右についているアジャスターをコインで回すことが出来ます。変更後に両側の調整設定が揃っていることを確認して下さい。

##キズのおそれ
>注意：ヘッドセットを使用しているときに眼鏡をつけると視界が狭まります。また眼鏡が傷つくおそれもあります。近視の方の場合、同梱されている視覚キャップを使用いただくか、コンタクトレンズを使用することを推奨します。

##3種類のレンズ
>開発キットには3種類のレンズが含まれています。もっとも高さのあるレンズ（A）は両目2.0または遠視の方向けです。中間の高さのレンズ（B）はやや近視の方向けに設計されています。低い高さのレンズ（C）は強い近視の方向けです。レンズは交換する際、その場にはめて固定する仕組みになっています。もし、Oculus Riftを使用する際に修正用のレンズを着用した場合、高さのあるレンズセットA、を使用して、左右のアジャスターを調整して頭に合わせて下さい。

#2. 必要な要件は何を見たらいい？
>Oculus SDK ドキュメントの要件を確認して Rift とインタフェースをとれる準備が完了していることを確認して下さい。

> Unity Pro 4.0.1 以上がマシンにインストールされていないと Unity デモをビルドできません。

> 同梱されてるデモシーンにより互換ゲームパッドコントローラ（Windows 上の XBox, Mac 上のHID 互換機）があると動き回ることが容易になるのでひとつは利用可能なものを準備すると便利です。一方で、動作はキーボードで代替可能であるため、必須ではありません。

>・Oculus SDK ドキュメントを初めに読んで頂き、同梱されてるデモを先に実行していただくことを推奨します。

#3. まず動かしたいんだけど・・どうすれば？
## Oculus Unity統合の使い方
>使用いただける Unity パッケージを 二つ用意しました。OculusUnityIntegration は Oculus Rift を統合するプロジェクトにインポートするのに使用する最小限のパッケージです。しかし、Tuscany デモを歩き回っていただき、統合の動作を実感していただくことを推奨します。

> 次に再生したばかりのデモをビルドします。このために、OculusUnityIntegrationTuscanyDemo の Unity パッケージを新しい Unity プロジェクトにインポートします。

## インストール方法
> Unity をすでに開いている場合、最初に作業を保存します。

> 新規の空プロジェクトを作成して、Oculus アセットをインポートする先として使用します。標準または Pro 版の Unity アセットパッケージをインポートする必要はまったくなく、Oculus Unity 統合は完全に自己完結しています。

> OculusUnityIntegrationTuscanyDemo.unitypackage ファイルをダブルクリックします。これにより空のプロジェクトにアセットをインポートします。インポートのプロセスが完了するのに数分かかるかもしれません。


#4. なんか動かないけど・・・既知の問題？
##全画面モードできないの？
>ディスプレイを全画面モードでターゲットにすることは将来の Unity リリースで含まれる予定です。（注：ドキュメントは2013年8月現在）

##Skyboxがうまく動かないけど？
>Unity Skybox はカメラで行われるパース マトリクス計算には影響されません。このため Skybox が必要である場合、カスタムの Skybox を提供する必要があります。

>例えばカスタムの Skybox を実装する例については、Tuscany デモのレベルに含まれる Skybox を参照して下さい。

##公式の問い合わせ先は？
ここから先は・・・英語に自信ある方だけがチャレンジ!!

>開発者サポートフォーム
https://developer.oculusvr.com

>に投稿、または support@oculusvr.com にメール送信下さい。
webpayでstripe.jsを使う

##stripe.jsとは

> Stripe.js makes it easy to collect credit card (and other similarly sensitive) details without having the information touch your server.
from https://stripe.com/docs/stripe.js

>>日本語訳:Stripe.jsは、情報がサーバーに触れることなく、簡単にクレジットカード（および他の同様に小文字が区別されます）詳細情報を収集できるようになります。

##使い方(主にstripe.js)
※詳細はURLを参照してください。

###stripe.jsを読み込む

```html:payment.html
<script type="text/javascript" src="https://js.stripe.com/v2/"></script>
```
パブリッシュキーをセット

```js:xxxx.js
Stripe.setPublishableKey('YOUR_PUBLISHABLE_KEY');

Stripe.card.createToken({
    number: $('.card-number').val(),
    cvc: $('.card-cvc').val(),
    exp_month: $('.card-expiry-month').val(),
    exp_year: $('.card-expiry-year').val()
}, stripeResponseHandler);

function stripeResponseHandler(status, response) {
    if (response.error) {
        ...
        // show the errors on the form
        $(".payment-errors").text(response.error.message);
    } else {
        var form$ = $("#payment-form");
        // token contains id, last4, and card type
        var token = response['id'];
        // insert the token into the form so it gets submitted to the server
        form$.append("<input type='hidden' name='stripeToken' value='" + token + "'/>");
        // and submit
        form$.get(0).submit();
    }
}
```

#stripeではなくwebpayを使う設定

```js:xxxx.js
Stripe.endpoint = "https://api.webpay.jp/v1";
```

上記の設定をする事により、webpayへのリクエストを生成する事ができる。stripeとレスポンスはほぼ同じため同じ様に実装が行える。responseでtokenが取得できるためコレを元にWebPay::Customerを作成する事が可能となる。

```rb:xxxx_controller.rb
WebPay.api_key = "test_secret_xxxxxxxxxxxxxxx"
customer = WebPay::Customer.create :card => "tok_XXXXXXXXXXX" , :email => "xxxxxx@xxxxx.com"
```
Rangeは、Timeでも使えた！

1から6までの数値が含まれているかいないかというのを書く場合
おそらく多くの人が

```rb:
(1..6).include?(3)
#=> true
(1..6).include?(9)
#=>false
```

というように書くと思います。

でこの範囲オブジェクトがなんと日付でも使えたという！
恥ずかしながら私、最近初めて知りました。

例えば・・・

```rb:
time = (Time.now - 10.days)..(Time.now)
#=> Fri Aug 02 13:54:51 +0900 2013..Mon Aug 12 13:54:51 +0900 2013
```

とすると

```rb:
time.end
#=> Mon Aug 12 13:54:51 +0900 2013
time.begin
#=> Fri Aug 02 13:54:51 +0900 2013
```

さらに・・・

```rb:
time.include?(Time.now)
#=> false 
time.include?(Time.now - 3.days)
#=> true 
```

時間単位でもできちゃう！

```rb:
hours = (1.hour)..(3.hour)
#=> 3600 seconds..10800 seconds 
hours.include?(1.hour)
#=> true 
hours.include?(4.hour)
#=> false 
```

おらおら日付でもできちゃうぜ！！

```rb:
days = (1.days)..(5.days)
#=> 1 day..5 days 
days.include?(2.days)
#=> true 
days.include?(6.days)
#=> false 
```
おおおお！スゴイです！！
こんなことができるのを知らないでいたなんで！！！
無限の可能性を感じてきたぞ・・・
Socket.IO覚え書き（Room、joinまわり）

ちょっと改めて調べ直したので記録を残しておく。

Socket.IOには所謂チャットを作りやすくなるようなRoomという概念があって、これに入れる事で部屋の中の人にだけ通知をするようなことが可能になる。発言が部屋の中の人にだけ見えるようにするような場合には重宝する機能だと思う。

ざっくり下記を見ると雰囲気が掴める。
http://d.hatena.ne.jp/hekyou/20111222/p1

その上で一次情報の下記を確認すると良いだろう。
使っているメソッドの名前が少々違うけれどもそれ程問題なく読めた。
https://github.com/LearnBoost/socket.io/wiki/Rooms

自分の所では下記のような雰囲気のコードを書いてチェックしてみた。

```js:
    var server = http.createServer(app);
    server.listen(app.get('port'), function () {
        console.log("Express server listening on port " + app.get('port'));
    });

    var io = require('socket.io').listen(server);
    var chat = io.sockets.on('connection', function (socket) {

        socket.emit('news', { hello: 'world' });

        socket.on('my other event', function (data) {
            console.log(data);

            //試しに存在しないルームへemitしても何も起こらなかった
            chat.to('dummy1344').emit('これはテストです');

            console.log('rooms:', io.sockets.manager.rooms);
            socket.join('testroom');
            console.log('rooms(after join):', io.sockets.manager.rooms);
            socket.join('testroom2');
            console.log('rooms(after join2):', io.sockets.manager.rooms);
            console.log(io.sockets.manager.roomClients[socket.id]);
        });

        socket.on('disconnect', function () {
            console.log('切断');
        });
    });

```

ログには下記のように出る。io.sockets.manager.roomsの「''」キーに全てのクライアント、その下にそれぞれのルームが繋がるようになるようだ。ルートとルームの両方に属する事が出来る様子。複数のルームに属する事も可能な様子だ。

```bash
{ my: 'data' }
rooms: { '': [ '9EoaNBJ-vUF1ykx8524a' ] }
rooms(after join): { '': [ '9EoaNBJ-vUF1ykx8524a' ],
  '/testroom': [ '9EoaNBJ-vUF1ykx8524a' ] }
rooms(after join2): { '': [ '9EoaNBJ-vUF1ykx8524a' ],
  '/testroom': [ '9EoaNBJ-vUF1ykx8524a' ],
  '/testroom2': [ '9EoaNBJ-vUF1ykx8524a' ] }
{ '': true, '/testroom': true, '/testroom2': true }
```

単純にタグ付けを行っているような雰囲気になっていて、関連付けをするような仕組みではない様子。例えば「今属している全てのルームへemitする」というような上位レベルのメソッドは用意されていないようだ。io.sockets.manager.roomClients[socket.id]で全ての所属しているルームを得ることができる。
rc.localでスタートアップ設定やtty1に自動ログインなど

CUI派向け。

スタートアップ設定方法
====

OS起動後に実行したいプログラムを記載するには

```bash:/etc/rc.local
chvt 1  # tty1に切り替え
exit 0
```

自動ログイン
====

```bash:/etc/init/tty1.conf
respawn
#exec /sbin/getty -8 38400 tty1
exec /sbin/agetty -a <username> tty1
```

ログインとともにfbtermを実行
====

[参考](http://ja.softuses.com/88384)

```bash:
CURRENT_TTY=$(tty)
if [ ${CURRENT_TTY/0-9/} = /dev/tty ]; then
    fbterm
fi
```

[fbterm]can’t change kernel keymap table, ...
====

* can’t change kernel keymap table, all shortcuts will NOT work, see SECURITY NOTES section of man page for solution. と表示された時の対応

```bash:
$ chmod u+s /usr/bin/fbterm
```

[topやtailを流すにはこちらを参考](http://www.linuxfromscratch.org/hints/downloads/files/PREVIOUS_FORMAT/inittab.txt)

dircolors
====

```bash:
$ dircolors -p > $HOME/.dir_colors
$ sed -i -e 's/DIR 01;34/DIR 01;33/'  $HOME/.dir_colors 
$ eval $($HOME/.dir_colors)
$ ls -al
```

ログインとともにXを起動
====

```bash:.bashrc
if [ -z "$DISPLAY" ] && [ $(tty) == /dev/tty1 ]; then
    startx
fi
```