OmniAICreator/Qiita-1.07M huggingface dataset:
配列の要素を条件を指定して並び替える

```php
#PHP 5.4.9
<?php

$ary = array(
  array('name'=>'aaa','age'=>111,'id'=>1),
  array('name'=>'bbb','age'=>555,'id'=>2),
  array('name'=>'ccc','age'=>222,'id'=>3)
);

function cmp_by_key($k){
  $cmp = function($a,$b)use($k) {
    if($a[$k] == $b[$k]){
      return 0;
    }elseif($a[$k] < $b[$k]){
      return -1;
    }else{
      return 1;
    }
  };
  return $cmp;
}

#order by age
echo 'order by age'.PHP_EOL;
$by_age = cmp_by_key('age');
usort($ary,$by_age);
foreach($ary as $k => $v ){
  echo str_replace(PHP_EOL,'',var_export($v,true)).PHP_EOL;
}

#order by id
echo 'order by id'.PHP_EOL;
$by_id = cmp_by_key('id');
usort($ary,$by_id);
foreach($ary as $k => $v ){
  echo str_replace(PHP_EOL,'',var_export($v,true)).PHP_EOL;
}

/* output 

order by age
array (  'name' => 'aaa',  'age' => 111,  'id' => 1,)
array (  'name' => 'ccc',  'age' => 222,  'id' => 3,)
array (  'name' => 'bbb',  'age' => 555,  'id' => 2,)
order by id
array (  'name' => 'aaa',  'age' => 111,  'id' => 1,)
array (  'name' => 'bbb',  'age' => 555,  'id' => 2,)
array (  'name' => 'ccc',  'age' => 222,  'id' => 3,)

*/

```


```py
#Python 2.7.1
data =[
  {'name':'aaa','age':111,'id':1},
  {'name':'bbb','age':555,'id':2},
  {'name':'ccc','age':222,'id':3}]

print "order by age"
for row in sorted(data,key=lambda x:x['age']):
  print row

print "order by id"
for row in sorted(data,key=lambda x:x['id']):
  print row
order by age

""" output 
{'age': 111, 'name': 'aaa', 'id': 1}
{'age': 222, 'name': 'ccc', 'id': 3}
{'age': 555, 'name': 'bbb', 'id': 2}
order by id
{'age': 111, 'name': 'aaa', 'id': 1}
{'age': 555, 'name': 'bbb', 'id': 2}
{'age': 222, 'name': 'ccc', 'id': 3}
"""
```



```scala
//scala 2.10.1
var data = List(
  Map("name"->"aaa","age"->"111","id"->"1"),
  Map("name"->"bbb","age"->"555","id"->"2"),
  Map("name"->"ccc","age"->"222","id"->"3"))

//order by age
var by_age = data.sortBy( a=>a("age").toInt )
println("order by age")
by_age.foreach(println)

//order by id
var by_id = data.sortBy( a=>a("id").toInt )
println("order by id")
by_id.foreach(println)

/* output
order by age
Map(name -> aaa, age -> 111, id -> 1)
Map(name -> ccc, age -> 222, id -> 3)
Map(name -> bbb, age -> 555, id -> 2)
order by id
Map(name -> aaa, age -> 111, id -> 1)
Map(name -> bbb, age -> 555, id -> 2)
Map(name -> ccc, age -> 222, id -> 3)
*/
```
rbenvでsystem wideに入れるときに気をつけたいこと


## 前提
1. エンジニアで共用しているサーバにrbenvでバージョンを切り替えたい
2. rbenvの知識は殆ど無い人が新規のバージョンのrubyを入れる

## 基本方針
- /usr/local以下にrbenvを導入し、groupでwrite権限を付与
- bundlerやpryなど、必ず入れておいたほうがいいものはrbenv-default-gemsを使う
- rehashも面倒なので、rbenv-rehashを使う

## 手順

### rbenvの導入
基本ここを参考に/usr/local以下にrbenvを入れて、グループを指定する。
http://qiita.com/items/8e973a544b592376a07e

グループはstaffとします。自分のグループにadduserとかでstaffを追加しておくこと。

```sh
cd /usr/local
sudo git clone git://github.com/sstephenson/rbenv.git rbenv
sudo chgrp -R staff rbenv
sudo chmod -R g+rwxXs rbenv
``` 

~/.profileなどに環境変数の設定をする。
最初から皆に読ませたいなら/etc/profileか。

```sh
export RBENV_ROOT=/usr/local/rbenv
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"
```

書いたら、sourceして有効にする

```sh
source ~/.profile
```

### ruby-buildをインストール

これも基本ですね。

```sh
mkdir /usr/local/rbenv/plugins
cd /usr/local/rbenv/plugins
git clone git://github.com/sstephenson/ruby-build.git
chgrp -R staff ruby-build
chmod -R g+rwxs ruby-build
```

### rbenv-default-gemsを入れる

[rbenv-default-gems](https://github.com/sstephenson/rbenv-default-gems)というプラグインを使うと、ruby-buildでインストールした時にデフォルトで入れてくれるgemを設定できる。

これで、bundler,pry,rbenv-rehashを入れると完璧。

```sh
cd /usr/local/rbenv/plugins
git clone git://github.com/sstephenson/rbenv-default-gems.git
```

default-gemsをこんなかんじで作成する。

```sh:/usr/local/rbenv/default-gems
bundler
pry
rbenv-rehash
```

###  rubyをインストール

```sh
rbenv install 2.0.0-p195
```

これで、bundlerもpryも入り、rbenv-rehashも入るからいちいちrehashする必要がなくなるという。

rbenv-default-gemsとrbenv-rehashの組み合わせが最強だと信じている。
Gollum で bare リポジトリを wiki に使う

[Gollim][] で bare リポジトリを wiki に使おうとしたところ・・・

```console
$ vi Gemfile
source "https://rubygems.org"
gem "gollum"
$ bundle install --path=vendor/bundle
$ git init --bare /tmp/wiki
$ bundle exec gollum /tmp/wiki
```

[http://localhost:4567](http://localhost:4567) を開くと `Grit::InvalidGitRepositoryError` というエラーになりました。

bare リポジトリは使えへんのかーと思ってソースを眺めていたら `repo_is_bare` というオプションを発見しました。

次のように `config.ru` を作って rackup すると上手くいきました。

```ruby
require 'gollum/app'

gollum_path = '/tmp/wiki'

Precious::App.set(:gollum_path, gollum_path)
Precious::App.set(:default_markup, :markdown)
Precious::App.set(:wiki_options, {
    :repo_is_bare  => true,
})

run Precious::App
```

コマンドラインからこのオプションを指定する方法は無さそうです。
gollum コマンドはサーバじゃなくローカルでの利用を想定しているので bare リポジトリは使えないのでしょう。

-----

という勘違いをしていました。

ディレクトリ名に `.git` を含めれば bare リポジトリでも大丈夫でした。

```console
$ git init --bare /tmp/wiki.git
$ bundle exec gollum /tmp/wiki.git
```

普通 bare リポジトリは `REPO.git` のようなディレクトリ名にするとは思いますが、自動で判断してくれても良いのでは？ と思わなくもないです。


[Gollim]: https://github.com/gollum/gollum
PHP Warning:  The use statement with non-compound nameがでるのはグローバル脳

定義されてないインターフェイスやclassでもuseステートメントでの宣言の部分では実際の存在チェックが働かないというのは当たり前なんですが、

```php
<?php
use JsonSerializable;

require 'tests/_autoload.php';
var_dump(new \stdClass instanceof JsonSerializable);
```
などど書くと、PHP Warning:  The use statement with non-compound name 'JsonSerializable' has no effect となってあれれーとなりますけれど、これグローバル名前空間内のためなので、

```php
<?php
namespace Userland {
    require 'tests/_autoload.php';
    use JsonSerializable;

    var_dump(new \stdClass instanceof JsonSerializable);
}
```

と適当な名前空間内に押し込めれば良い。

まあ、
```php
<?php
require 'tests/_autoload.php';
var_dump(new stdClass instanceof \JsonSerializable);
```
とuse使わなければ、上記エラーはでませんが
SublimeText2のsublimeREPLパッケージでのRubyは・・

ネットのあちらこちらにSublimeText2のsublimeREPLパッケージでErrorを出してる方を見掛けたのでここに書いておこうと思います。

通常のビルドは[ctrl + b]です。
「Tools」→「sublimeREPL」→「Ruby」→「Ruby-IRB(deprecated)」は対話的Rubyです。
「Tools」→「sublimeREPL」→「Ruby」→「Ruby」はpryを起動します。

コマンドで「gem install pry」と入力しインストールして使うことができます。

pryはすでに有名なRubyGemsですので、詳細については検索して下さい。


![SnapCrab_No-0010.png](https://qiita-image-store.s3.amazonaws.com/0/24595/2ea54cad-92a7-c591-4832-059924980e49.png)
ustreamをffmpegで録画する

メモ

[ここ](http://looooooooop.blog35.fc2.com/blog-entry-1107.html)の記事を参考に

まずffmpegをインストール。僕はmacなのでhomebrewで

```sh
brew install ffmpeg
```

以下のjsでcidを抜き出せる

```javascript 
var url = $('meta[property="og:video"]').attr("content");
var parser = document.createElement('a');
parser.href = url;
var cid = parser.search.match(/cid=([0-9a-zA-Z]+)/)[1];
alert("ffmpeg -re -i http://iphone-streaming.ustream.tv/uhls/" + cid + "/streams/live/iphone/playlist.m3u8 -c copy out.ts")
```

[ここ](http://ted.mielczarek.org/code/mozilla/bookmarklet.html)とかでbookmarkletにしてみたりするとよい

bookmarkletを実行すると、コマンドが出てくるのでそれをterminalにはりつけて、
おしまい。

![スクリーンショット 2013-05-24 21.45.54.png](https://qiita-image-store.s3.amazonaws.com/0/6025/cda0cb5a-5b74-0133-0a9d-35e4897495a6.png)
HTML5 D&Dによるファイルアップロード

```javascript
(function ($) {
    $.fn.upload = function(options) {
        var defer = $.Deferred();
        var settings = {
            url: null,
            urlBase: null
        };
        if (options) {
            $.extend(settings, options);
        }

        var $this = $(this);

        $this.on('dragenter dragover', function() {
            return false;
        });
        $this.on('drop', function(e) {
            e.preventDefault();

            var file = e.originalEvent.dataTransfer.files[0];
            var reader = new FileReader();

            reader.onload = function(e) {
                var xhr = new XMLHttpRequest();
                var url = settings.url;

                xhr.open('POST', url, true);

                var filetype = file.type;

                if (_.isEmpty(filetype)) {
                    filetype = 'application/octet-stream';
                }

                xhr.setRequestHeader('Content-Type', filetype);

                xhr.onload = function(e) {
                    if (this.status === 200) {
                        return defer.resolve();
                    } else {
                        return defer.reject();
                    }
                };

                xhr.send(file);
            };

            reader.readAsBinaryString(file);
        });

        return defer.promise();
    };
})(jQuery);
```
Gollum で目次（TOC）が文字化けするのをどうにかする

git がバックエンドな wiki エンジン [Gollim][] を試してみたところ、目次（`[[_TOC_]]`）が日本語を含むと盛大に文字化けしたので、やっつけで修正してみました。

-----

[gollum-lib][] をクローン。

```console
$ git clone https://github.com/gollum/gollum-lib.git
```

Gemfile を作成して bundle install。gollum-lib はクローンしたやつを使う。

```console
$ cat <<EOS > Gemfile
source 'https://rubygems.org'
gem 'gollum'
gem 'gollum-lib', :path => 'gollum-lib'
EOS

$ bundle install --path=vendor/bundle
```

gollum-lib/markup.rb の Nokogiri::HTML を Nokogiri::XML に変更。

```console
$ cat <<'EOS' | patch gollum-lib/lib/gollum-lib/markup.rb
@@ -93,7 +93,7 @@
       data = process_tags(data)
       data = process_code(data, encoding)
 
-      doc = Nokogiri::HTML::DocumentFragment.parse(data)
+      doc = Nokogiri::XML::DocumentFragment.parse(data)
       doc = sanitize.clean_node!(doc) if sanitize
       doc,toc = process_headers(doc)
       @toc = @sub_page ? ( @parent_page ? @parent_page.toc_data : "[[_TOC_]]" ) : toc
EOS
```

home.md を作ってみる。

```console
$ cat <<EOS > home.md
[[_TOC_]]

# あいうえお

## かきくけこ

### さしすせそ
EOS

$ git init
$ git add home.md
$ git commit -m first
```

Gollum を開始。

```console
$ bundle exec gollum
```

ブラウザで [http://localhost:4567/](http://localhost:4567/) を開く。

-----

<del>修正したものはこのへん [ngyuki/gollum-lib] に置いていますが、この記事を書いた人は ruby を知らないただの PHPer なのできっと見当違いなことをしています。</del>


[Gollim]: https://github.com/gollum/gollum
[gollum-lib]: https://github.com/gollum/gollum-lib
[ngyuki/gollum-lib]: https://github.com/ngyuki/gollum-lib/commit/eb14a7bc754472d9b7cd3ed82871be8dc5c1dfa1
ことえりショートカットを無効化する方法

タイトルは少し盛った。

* 環境

MBPR early2013
MacOSX 10.8.3
ことえり version 4.4.0

* 方法

[ことえりショートカットを変更する方法/Qiita](http://qiita.com/items/da3f577073ef204ac638)
を試してみたがやはり ^+Shift+N で単語登録が出るので

[効かないキーコマンドがある？](http://www.naoxlogic.com/archives7/Drawer/Tips/T009.html)
に従って英語入力ソースをことえり英字からU.S.モードに替えた。

ことえり切るのが最高なんだけどATOK高いしなー
linux コマンドのメモメモ

linux超初心者ですが、ちょっとずつlinuxが楽しくなって来ました。

今日、お勉強したコマンドを会社から帰って復習するために書きます


##1.touchコマンド##

$ touch (オプション) [ファイル名]

機能
 指定したファイルの最終アクセス日時と最終更新時刻を変更できる。
 指定したファイル名が無いと、新規作成を行い、サイズが0の空ファイルを作成する。

(オプションは省略)


##2.sedコマンド##

$ sed (オプション) [ファイル名]

機能
 文字列の置換、削除ができる

オプション
 -e 指定した条件で'いろいろ'出来る
    (このいろいろがすごく幅広い。)

例えば、test.txt の2行から4行を消したい。

コマンドは下記となる
$ sed -e "2,4d" test.txt


##3.最後に##
もっと詳しく知りたい人は、すみませんぐぐってください。
ってか、こんな情報を読みに来る人はQiitaとかしないですね 笑
Qiitaの最下層の人ですが、メモなのでスルーして下さいね(^_^;)
SourceTreeのコミットログに書いてあるRedmineのチケット番号をクリックできるようにする

`refs #1234`みたいなのをクリックするとそのチケットに飛ぶようなやつ。

  * メニューから「リポジトリ」＞「リポジトリ設定...」を選ぶ
  * 「高度な設定」タブにある「コミット文字列の置換」欄の「追加」ボタンを押す
  * 以下のように設定
      * 置換タイプ: 「その他」
      * 正規表現パターン: 「`(fixes|refs)\s+#(\d+)`」
      * と置き換えます: 「`$1 <a href="http://redmine.example.com/issues/$2">#$2</a>`」 (ドメインは適宜置き換えて)
吹き出しの矢印を簡単につけるミックスインをつくってみた

@mixin balloon-arrow($aspect: top, $position: 50%, $color: #fff, $size: 10px){

	@if $color == #fff{
		$color : $color - #333;
	}

	border: 1px solid $color;

	&:after{
		content:'';
		position: absolute;
		border: $size solid transparent;

		@if $aspect == top {
			border-bottom-color: $color;
			border-top-width: 0;
			margin-left: - $size;
			top: - $size;
			left: $position;
		} @else if $aspect == bottom {
			border-top-color: $color;
			border-bottom-width: 0;
			margin-left: - $size;
			bottom: - $size;
			left: $position;
		} @else if $aspect == right{
			border-left-color: $color;
			border-right-width: 0;
			margin-top: - $size;
			right: - $size;
			top: $position;
			left: auto;
		} @else if $aspect == left{
			border-right-color: $color;
			border-left-width: 0;
			margin-top: - $size;
			left: - $size;
			top: $position;
		}
	}
}
Ubuntu 12.04 LTS のOpenLDAPをSSLに対応する際の注意 Rev.2

[Ubuntu 12.04 LTS のOpenLDAPをSSLに対応する際の注意] (http://qiita.com/items/e9430de56209a98bc722)

すみません。__根本的に間違ってました__。OpenSSLとgnutlsの差自体はまぁったく関係ありません。

# 何が原因だったん？

(Ubuntu 12.04 LTSの) slapd は AppArmor によって課された制約により、一部のディレクトリに置かれた証明書・秘密鍵しか読めません。

    slapd[18359]: main: TLS init def ctx failed: -1

syslogのこのエラーメッセージの前後に、こういうエラーメッセージが実は出力されています。こちらがエラーの本体でした。

    ns2 kernel: [343639.327432] type=1400 audit(1369380545.782:39): apparmor="DENIED" operation="open" parent=18335 profile="/usr/sbin/slapd" name="/home/dmiyakawa/test2.crt" pid=18359 comm="slapd" requested_mask="r" denied_mask="r" fsuid=113 ouid=1002

[AppArmor のWikipediaエントリ](http://en.wikipedia.org/wiki/AppArmor)

というわけでslapdに関する設定を見て見ると (/etc/apparmor.d/usr.sbin.slapd )

      #include <abstractions/ssl_certs>
      /etc/ssl/private/ r,
      /etc/ssl/private/* r,

…… :-(

検証のため、自分のホームディレクトリを追加します

      /home/dmiyakawa/* r,

apparmor_parser -r /etc/apparmor.d/usr.sbin.slapd をして、slapd をリブートすると、問題が解消しました。opensslの一連のコマンドで作ったsha1の自己署名証明書と秘密鍵で、です

[本家のドキュメント](https://help.ubuntu.com/12.10/serverguide/openldap-server.html) の中で、本当に重要なのは certutil を使うことでもなんでもなく、実は正しいディレクトリに証明書と秘密鍵を置くことなのでありました。オリジナルの記事ではその部分に問題の根があるとまでは想定出来なかったので、違う探索木を延々たどっていたことになります。
Backbone.jsをCoffeeで書いた時のEventsの継承の仕方

## ModelやViewなどの場合

Backbone.jsをCoffeeScriptで書く時、`Backbone.Model`や`Backbone.View`の継承はたとえばこんな書き方ができる。

```coffeescript
# model
class Hoge extends Backbone.Model
	constuctor: ->
		super
		@set fuga: 'fuga'

# View
class HogeView extends Backbone.View
	constuctor: ->
		@model = new Hoge
		super
	fuga: ->
		@model.get 'fuga'
```

`Backbone.Model`や`Backbone.View`がコンストラクタで`prototype`にプロパティをちゃんと持っているから。

## Eventsの場合

これでできると思ってた。

```coffeescript
class EventDispatcher extends Backbone.Events

# でもインスタンスを作ってみると
dispatcher = new EventDispatcher
console.log dispatcher.on # -> undefined
```

メソッドが定義されていない。

* * *

これは当然で、`Backbone.Events`はただの`Object`であって`prototype`にプロパティやメソッドをもつコンストラクタでもなければ`Function`でもないから。

[公式ドキュメント](http://backbonejs.org/#Events)を参考に、継承の方法をみてみると

```coffeescript
# これが公式の方法
dispatcher = _.extend {}, Backbone.Events

# もしくは別の方法でこんなのとか
dispatcher = _.clone Backbone.Events
```

でもあくまでこれは`Backbone.Events`のプロパティやメソッドをコピーしたオブジェクトであって、クラスから生成されたインスタンスではない。

もっと機能をつけたクラスを作りたい場合はどうしたらよいか。

```coffeescript
class EventDispatcher
	# ここでprototypeに無理やり継承させる
	_.extend @::, Backbone.Events
	fuga: null
	piyo: null
	constructor: ->
		@fuga = {}
		@piyo = []

# これで継承できてる
dispatcher = new EventDispatcher
console.log dispatcher.on # -> function (...) {...}
```

他にいい方法があると思うのですが、ご存知の方がいらっしゃったらご教授ください。

* * *

## 参考

http://adamjspooner.github.io/coffeescript-meet-backbonejs/
GitHub 上の自分のリポジトリ名一覧取得

```bash:get-github-repository-names
curl https://api.github.com/users/kaosf/repos?per_page=100 2> /dev/null | ruby -rjson -e 'JSON.parse(STDIN.read).each{|r|puts r["name"]}'
```

curl と Ruby を使います．

curl で GitHub の API を叩いて JSON 形式の出力を受け取り，それを Ruby に渡して JSON ライブラリにパースしてもらって出力する，というワンライナーです．

試す場合は `kaosf` の部分を自分の GitHub アカウントのユーザ名に変更しましょう．

デフォルトだと 30 件ずつしか取得出来ないので `per_page` オプションで無理矢理拡大してます．

なおこれでは public なリポジトリしか取れません (当然)．private リポジトリも取得したいなら認証をアレコレするといいんじゃないかと (よく知らない)．

## ShellScript Tips

`2> /dev/null` はリダイレクションと「Linux は何でもファイルだよ文化」の組み合わせ技です．

curl コマンドを使うと，標準エラー出力に通信に関する情報が出力されます．今はそんな情報は不要で見たくないので何処かに捨てたいですね．ではどうやって捨てるかというと，「何もない」を「0 個ある」と表現する感覚で，「出力を捨てる」には「null デバイスに出力する」と良いのです．

Linux ではデバイスもファイルとして扱われるので `/dev/null` なんてのがファイルとしてあるように見えるわけです．`/dev/null` の場所とか名前とかはディストリビューションによって違うとか聞いたような気もしますけど Ubuntu ではここです．

## Ruby Tips

Ruby の引数 `-rjson` は `require 'json'` と同じ効果をもたらします．

`-e 'unkunk'` は `unkunk` と書かれたファイルを引数に与えているのと同じ効果をもたらします．

なので `ruby -rjson -e 'unkunk'` は

```Ruby:sample.rb
require 'json'
unkunk
```

というファイルを用意してそれを使って

```bash
ruby sample.rb
```

としてるのと一緒です！今回程度の短いスクリプトならそもそもファイルを作って管理する方が面倒くさいですからね＞＜

## References

* http://developer.github.com/v3/
* http://developer.github.com/v3/repos/

## 余談

ていうかこのくらいのことデフォルトで出来る CLI ツールないですか＞＜
ChromeのDeveloper Toolのマウスイベントでブレイクポイント設定の場所をいつも忘れるのでメモ



[Sources] → 右ペインの [Event Listener Breakpoints] → [Mouse]

![~9joui_unr7~.png](https://qiita-image-store.s3.amazonaws.com/0/2631/72df4075-8518-ffe3-ebe9-265ada93ff36.png)
ページキャッシュのクリア


```
[root@local-mgt01 ~]# free 
             total       used       free     shared    buffers     cached
Mem:       1026888     187800     839088          0       3768      26868
-/+ buffers/cache:     157164     869724
Swap:      2097144          0    2097144

[root@local-mgt01 ~]# time find /

real    2m17.450s
user    0m0.172s
sys     0m13.328s

[root@local-mgt01 ~]# free 
             total       used       free     shared    buffers     cached
Mem:       1026888     278308     748580          0      80016      27140
-/+ buffers/cache:     171152     855736
Swap:      2097144          0    2097144

[root@local-mgt01 ~]# time find /

real    0m21.500s
user    0m0.105s
sys     0m2.889s

キャッシュクリア
[root@local-mgt01 ~]# echo 3 > /proc/sys/vm/drop_caches 

[root@local-mgt01 ~]# free 
             total       used       free     shared    buffers     cached
Mem:       1026888     196088     830800          0       2852      26864
-/+ buffers/cache:     166372     860516
Swap:      2097144          0    2097144
```
inode

パーミッション、owner、group、サイズ等を管理する領域
後から増やす事はできない

```
OSインストール時の設定
part /boot --asprimary --bytes-per-inode=4096 --fstype="ext3" --size=512
part / --bytes-per-inode=4096 --fstype="ext3" --grow --size=1
part swap --asprimary --bytes-per-inode=4096 --fstype="swap" --size=2048

inode確認
[root@local-vm03 ~]# df -i 
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda3            1442880   41827 1401053    3% /
/dev/sda1             130560      35  130525    1% /boot
tmpfs                  96041       1   96040    1% /dev/shm
```

```
OSインストール時の設定
part /boot --asprimary --bytes-per-inode=8192 --fstype="ext3" --size=512
part / --bytes-per-inode=8192 --fstype="ext3" --grow --size=1
part swap --asprimary --bytes-per-inode=8192 --fstype="swap" --size=2048

inode確認
[root@local-vm03 ~]# df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda3             722304   42025  680279    6% /
/dev/sda1              65536      35   65501    1% /boot
tmpfs                  96041       1   96040    1% /dev/shm
```
git add したあと、commit するの忘れてて reset --hard しちゃったけど、取り戻したい


やっちまった〜
commit してたら最強の味方 reflog 使えるけど add しかしてないしなぁ……
でも、git は objectdb だし、add している時点で 何処かに保存されているはず！！

と思って調べたら `git fsck` を発見！！
どこにも属してないものが見れる！！ やった！！

これで `hash` とれるので `git unpack-file` で内容だけは復元できる！！

つまり

```sh
$ git fsck | grep blob | cut -d ' ' -f3 | xargs git unpack-file
```

ってやるとどこにも管理されてないファイルがとりあえず復元します。

```
.merge_file_KhsjP3
```
みたいな名前になっているので、ファイル開いて中身はなんとか救出できた！！

もっと良い方法あったら教えて下さい＞＜ って社内ブログに書いたら

> 上のワンライナーと同じことが実現できる `git fsck --lost-found` というのがあります。 参考: http://git-scm.com/docs/git-fsck

って教えてもらった！！

超便利〜

git 奥が深い……
Pythonでリフレクション

Pythonでリフレクションを使うには、下記の組み込み関数を覚えておくと良いです。

```py
#objectにnameの属性があるかを返す
hasattr(object, name)

#object中のname属性を返す。defaultはname属性がない場合に返す値を指定できる
getattr(object, name[, default])

#objectが呼び出し可能であればTrueを返す。Trueの場合、object()で実行できる。
callable(object)

#objectから有効な属性のリストを返そうと試みる
dir([object])
```

使い方はこういう感じになります。
例えば、ある属性の値を取得して返すかメソッド実行して返すかのいずれかを行う場合。

```py
if hasattr(object, name):
    attr = getattr(object, name)
    if callable(attr):
        return attr()
    else:
        return attr
```
ssh越しにバックグラウンドプロセスの実行

    ssh localhost "nohup sleep 10 > /dev/null 2>&1 &" > /dev/null 2>&1

nohupして出力が返ってこないようにすれば良い。
ssh先のサーバーにスクリプト作っておいてそのスクリプト叩くとかがいいですかね
IRCにtelnetコマンドで入るめも

# めもができた理由
* IRCへの接続テストでterminalからなんかできないかなー
* 調べたらあった : http://oreilly.com/pub/h/1963
* 英語嫌いだからやり方だけめもしておこうそうしよう

# 接続してみる
## 接続情報
* IRCサーバ：（サンプルです）irc.example.com
* ポート：6667
* チャンネル：#testch
* 自分の名前（ニックネーム同）：yuri
* 自分のサーバ：localhost

## コマンドメモ

>telnet irc.example.com 6667
USER yuri localhost * : yuri
NICK yuri
JOIN #testch
PRIVMSG #testch :hello ! this is test message
QUIT byebye ;-)

### 注意すること
* 全部コピペでばばーっと貼ると早すぎてメッセージ書き込む前に退出しちゃいます
* 逆にtelnetのあと間があきすぎると接続切れちゃったりも
AWS OpsWorksでELBを使いたい時のIAM Role設定

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。


先日リリースされたAWS OpsWorksでもELBが使える機能ですが、利用するためには事前に設定の調整が必要です※。

※新規利用なら必要ないかもしれません。


## IAM設定を促される

いざレイヤにELBを構成しようとすると『パーミッションが無いからELBがリストアップできない』と言われてしまいます。

解説はこちらにありました。

[http://docs.aws.amazon.com/opsworks/latest/userguide/opsworks-security-servicerole.html](http://docs.aws.amazon.com/opsworks/latest/userguide/opsworks-security-servicerole.html)

## Q. 結局どうすればよいの？

**A1.** Stack作成時に新規IAMロールの作成を選びましょう
**A2.** Stackで使われるデフォルトのロール、`Role: aws-opsworks-ec2-role`に下記のポリシーを適用しましょう。

![Role for OpsWorks](http://farm8.staticflickr.com/7424/8799140443_00fd60b062_z.jpg)


これでレイヤにELBを関連付けることができ、配下のインスタンスが自動的にAttach＆Removeされるようになります。
※OpsWorksで利用できるようになるまで若干のタイムラグがあります。
AndroidのGeofenceを試してみました

Androidのgoogle mapでGeofenceが使えるようになったとのことで、早速試してみました。
googleのサンプルを見ると、そんなに難しいことはしていませんでした。

参考
[Creating and Monitoring Geofences](https://developer.android.com/training/location/geofencing.html)

[Google Play servicesの新機能 - LocationRequest(fused provider) と Geofence](http://sos.hatenablog.jp/entry/2013/05/19/020659)

googleのサンプルを参考にしつつ、google mapと組み合わせたものを作ってみましたので、何かの参考にしていただければと思います。

[AndroidGeoFenceSample](https://github.com/myaaaaa-chan/AndroidGeoFenceSample)
＊AndroidManifest.xmlのgoogle mapのAPIキーはご自分のキーに変えてください。

地図上でタップした位置から半径1000mがジオフェンスの範囲になります。
範囲に出入りすると通知バーにその情報が通知されます。

![map_sample.png](https://qiita-image-store.s3.amazonaws.com/0/18052/9e8944f3-9ce9-2c89-2e74-aedf7db828e5.png)

位置情報は[Location Spoofer](https://play.google.com/store/apps/details?id=org.ajeje.fakelocation&hl=ja)とかで設定すればよいと思います。

＊フェンスは1個しか置けませんし、タップした位置のピンは消えませんので。。
MyBatisのMapper XMLでlt, gtは予約語

```xml:Data.xml
<select id="get" resultType="foo.baa.Data">
	SELECT * FROM Data WHERE id < #{paging.lt} AND id > #{paging.gt} LIMIT 100
</select>
```

などとするとエラーになる。これはltやgtがOGNLの予約語であるため。
Subversionでコミットログを変更できるようにする

Subversionのコミットログ変更で、下記のエラーとなる場合。


>DAVリクエストに失敗しました。リポジトリのpre-revprop-change フックが機能不全であるか存在しない可能性があります
> 
>Repository has not been enabled to accept revision propchanges;

下記の手順で、リポジトリルート/hooks配下にpre-revprop-changeを作成する。

```
# cd pathToSubversionRepositoryRoot/hooks
# cp pre-revprop-change.tmpl pre-revprop-change
# chown apache:apache pre-revprop-change
# chmod 744 pre-revprop-change
```

上記の変更後、TotoiseSVN等からコミットログに変更が可能となる。
weak 参照してはいけない Cocoa のクラス一覧

[Transitioning to ARC Release Notes](https://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html) によれば、 OS X 10.8 において以下のクラスが weak 参照に対応していない：

- `NSATSTypesetter`
- `NSColorSpace`
- `NSFont`
- `NSMenuView`
- `NSParagraphStyle`
- `NSSimpleHorizontalTypesetter`
- `NSTextView`

OS X 10.7 では、上記に加えてこれらのクラスも weak 参照してはならない：

- `NSFontManager`
- `NSFontPanel`
- `NSImage`
- `NSTableCellView`
- `NSViewController`
- `NSWindow`
- `NSWindowController`
- AV Foundation のすべてのクラス

weak 参照した場合 "cannot form weak reference to instance (&lt;address&gt;) of class &lt;ClassName&gt;" とランタイムエラーが発生する。

これらのクラスを弱参照したい場合は、変数を `__unsafe_unretained` で修飾するか、プロパティ属性を `unsafe_unretained` （または `assign`）にすること。参照はゼロ化されないことに注意。
select結果の出力を見やすくする

シェルでMySQLのselectを出力するとき、

```sql
select * from tblname \G
```

のようにして出力を見やすくすることがあるわけですが、PostgreSQLの場合は以下のようにすると良い（拡張表示）。

```sql
\x
select * from tblname;
```
フィールド変数の初期化式にインスタンスメソッドを使えるようにする

# モチベーション

次のプログラムはコンパイル時エラーになる。
staticでないフィールド変数の初期化には定数式、staticメソッド、staticフィールド等しか使えない。この制限は Boo ではない他の C#や Java 言語などにもある。

```py
# pythonじゃないよ！Booだよ！
class Hoge:
	v = init(5)   # フィールド変数の初期化にインスタンスメソッド使っちゃだめだよ！
	def init( n as int ):
		return n
```

どうしてもやりたければ、次のように書けばいいが、たかが初期化式程度のためにこれはメンドクサイ。

```py
class Hoge:
	private cache = null   # v の値を保持する。最初は null。

	v:  # v へのアクセスはメソッド経由(プロパティ)にする
		get:
			if cache is null:
				cache = init(5)  # こんなところに初期化式が...
			return cache
		set
			cache = value
```

これをマクロで自動化する。

# ネタ元

Boo コンパイラソースのtests/testcases/macros/type-member-macro-yielding-member-with-member-generating-attribute.boo に同じようなサンプルがあるが次の理由でもう少し修正がしやすくて、見通しのいいものにしてみた。

* サンプルは属性を使うので、修正には属性プログラムのコンパイル→目的プログラムのコンパイル、と２段階必要。
* サンプルは、getter しかなくて setter がなかった（上記変数 v への代入ができない）。

# 解決方法

次のマクロ deferred を使う。

```py
# pythonじゃないよ！Booだよ！

# フィールド宣言の前につけて使用します。
macro deferred:
	# "deferred '変数名' = 式" という記述にマッチするパターンマッチングブロック。
	# 変形は上記の property を使った例とほぼ同じ。
	case [| deferred $(ReferenceExpression(Name: name)) = $initializer |]:
		# Context.GetUniqueName() は一時変数名等を作るのに使用出来る、
		# freshな名前を生成するメソッド。
		cachevar = ReferenceExpression( Context.GetUniqueName( 'tmp' ) )
		g = Method()
		g.Body = [|
			if $(cachevar) is null:
				$(cachevar) = $(initializer)
			return $(cachevar)
		|]
		s = Method()
		s.Body.Add( [| $(cachevar) = value |] )
		yield Property( Name: name, Getter: g, Setter: s )
		yield [|
			private $(cachevar) = null
		|]
```

このマクロは次のように使う。

```py
class Hoge:
	deferred v = init(5)  # init() メソッドつかえまーす

	def init( n as int ):
		return n
```

## 注意点

変数に null を代入(設定)すると、次の取得時に再度初期化値が代入されてしまう（解決はできるけどもう一つフラグが必要です）。null を代入したら初期化式で初期化されるというのはある意味おもしろい機能ですけどね...。


# 結論

Context は macro 定義内部で使える変数で、コンパイラの動作状況を保持しています（型は CompilerContext）。

Context.GetUniqueName() は大掛かりな構文木追加/修正をするのに便利です。
androidのpsコマンドについてのメモ

使えるオプションをソースコードを見て調べてみました。
(※意味は適当に検索して調べたので間違っているかもしれません)

 -t : show thread. プロセスの次の行にthreadを表示

 -x: show time. utime-ユーザモードでのCPU使用時間 stime-カーネルモードでのCPU使用時間をプロセス名の後ろに表示

 -P: show policy. bg-BACKGROUND か、 fg-FORGROUNDかを表示。判別不能の場合はun、bgでもfgでもなかった場合はerと表示される

 -p: show priority. prio-動的優先度 nice-静的優先度 rtprio-リアルタイム優先度 sched-スケジューリングポリシーを表示

 -c: show cpu. 使われているCPUの番号を表示

 数字: PIDフィルター

 その他: Nameフィルター


複数のオプションを使いたい場合は、例えば、

```
ps -t -x -P -p -c
```

と一つ一つ指定します。
EclipseでCloudFormationのテンプレートを編集する

 * AWSのCloudFormationのテンプレート作成が[CloudFormationはガチ - サーバーワークス エンジニアブログ](http://blog.serverworks.co.jp/tech/2012/07/27/cf/)にもある通り大変
 * なので、なんとか楽に作れないかと[AWS Toolkit for Eclipse](http://aws.amazon.com/jp/eclipse/)(1.0.0.v201305021159)を使って編集してみた
  * 新しいバージョンになると内容が異なる可能性あり
  * 公式ドキュメント読んでなくて実際に使ってみて書いた記事なので抜け漏れある可能性あり

## 前準備
 * Eclipseをインストールする
 *  [AWS Toolkit for Eclipse](http://aws.amazon.com/jp/eclipse/)をインストールする(手順はリンク先の通り)
 * AWS Toolkit for Ecllipseの設定をする
  * AWS Toolkitの設定でAccess KeyとSecret Access Keyを設定しておく(作成するリソースの権限があるものを設定する必要がある)
 * 空プロジェクトでも作ってみて、XXX.templateファイルを作成する

## Eclipseでテンプレートを作るにあたってできること

### 実行
 * 右クリックメニューのRun on AWSから実行出来る

### 補完
 * 入れるべき値の候補は出してくれる
  * ただ精度が低くいのであまり利用してない
  * リソースの候補一覧出せるのは便利

### テンプレートの構造化
 * Outline Viewに構造化されたテンプレートが表示される
 * 編集画面でテンプレートが色分けされる
  * 編集画面でフォールディング(折りたたみ)できないのかなあ...

![cloudformation_eclipse.jpg](https://qiita-image-store.s3.amazonaws.com/0/16768/4ae3fcc9-2645-e98b-bac5-aa1a4fa33459.jpeg)

### テンプレートのValidate
 * JSONの構文レベルのValidateは編集画面で行われる
  * ペケ印の上にマウスカーソルを重ねるとエラー内容が表示される(下記の例では{がない)

![cloudformation_format_invalid_error.jpg](https://qiita-image-store.s3.amazonaws.com/0/16768/24b0ed57-2e54-41ce-db25-baf3979c5727.jpeg)

 * テンプレートの構文レベルのValidateは実行前のテンプレート読み込み時に行われる

![cloudformation_invalid_err.jpg](https://qiita-image-store.s3.amazonaws.com/0/16768/ee5a557f-4ad1-e9aa-a7e7-163dbd1e72a8.jpeg)

 * 各サービスレベルのValidate(S3のポリシーで指定してるバケットがないとか)は実行時にCloudFormationで行われる
  * AWS Ecplorer viewやManagement Consoleから確認する必要がある
  * CloudFormationのEventのReasonあたりにエラーが表示される

## Eclipseで編集してみた感想
 * エディタで作成 => Management Consoleで読み込みよりは楽にテンプレート作れると思う
 * それでもJSONの構文エラー時にはまることが
 * AWS Ecplorer viewからStackの削除がしたい
【メモ】【AngularJSのススメ】URLに応じて部分的に更新を行う方法（ルーティング）に関して


※出来る限り早い内に、清書しなおします。。

### AngularJSのルーティングはhashありとなしのどちらでも対応できる。

#### あり
http/xxxxxxxxxx.jp/#/top
http/xxxxxxxxxx.jp/#/sub

#### なし
http/xxxxxxxxxx.jp/top
http/xxxxxxxxxx.jp/sub

今回は、なしversion(html5対応browser限定）に関してメモを残します、、

```index.html
<html ng-app="app">
<head>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.1.4/angular.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.1.4/angular-resource.min.js"></script>
<script>
angular.module("app", []).
      config(["$routeProvider", '$locationProvider', function($routeProvider,$locationProvider) {
       //$locationProvider.hashPrefix('!');
		$locationProvider.html5Mode(true);
        $routeProvider.
          when("", {
            // テンプレート文字列を指定
            templateUrl: '/template/teacher/index.html',
            // テンプレートにバインドするコントロールの名前を指定
            controller: MainCtrl
          }).
          when("/:id", { //任意の文字列の場合
　　　　　　　　　/* 省略 */
          })
          .otherwise({redirectTo: '/'});
      }]);
</script>
</head>
<body>
<div ng-view>ここにテンプレートが挿入されるよ。</div>
</body>
</html>
```

これだけで、http://xxxxxと、http://xxxxx/123に対応！！( ｰ`дｰ´)ｷﾘｯ

ただし、http://xxxxx/hogeとhttp://xxxxx/hoge/123に対応したい場合は、この通りやっても動かない。
その場合は

```html
when("/hoge", {
when("/hoge/:id", {
```

にする必要がある、大元からのパスが必要になるということです。

そして、折角routing対応したのだから、クリック時に画面更新ではなく、部分更新したい！とか出てきますよね
それも簡単です。
今回の例では

```
angular.module("app", []).
```
とappを指定しているので、appグループ配下で
http://xxxxx/hogeもしくは、http://xxxxx/hoge/123に対してのリンクを貼れば
勝手に部分的なテンプレート入れ替えだけやってくれます。
テンプレートの中のリンクも有効です。

でも仮にappの外にリンクを置いていた場合は、

```html
<div ng-app="app">
<a href="http://xxxxx/hoge/123">有効リンク</a>
<div ng-view></div>
<a href="http://xxxxx/hoge/1234567">有効リンク</a>
</div>

<a href="http://xxxxx/hoge/123">無効リンク</a>
```

画面全体が更新してしまいますので、気をつけましょう。

そして残念なことですが、IE9以下のバージョンでは
http://xxxxx/hoge/123をクリックしたら
http://xxxxx/#/hoge/123と解釈されてしまいます。。。
トップいっちゃったよ。。。。

これは、html5の機能のhistoryが使えてないからです。（色々はしょりました）

```
<!-- 相対パスをbaseで指定した場所から始める -->
<base href="/hoge/" /> 

when("/", {
when("/:id", {
```

この様にすれば、html5対応browserでは
http://xxxxx/hoge/123
非対応browserでは
http://xxxxx/hoge/#/123
とする事ができます。

それでも、管理がし辛いので、おすすめはできません。。

最初から素直に、/#/の構成だけでOKというのであれば

```
$locationProvider.html5Mode(true);
```
をコメントアウトするなり、falseにするなりすればOKです。

手探り調査＋英語のドキュメントとの格闘の結果ですので
間違い、最適な方法とうなにかありましたら、コメント下さい＞＜

AngularJS使い同士の交流がほしいところ。
メモリリークの対処

VC++でメモリーリークが発生しますね。
便利な物で 何番目にどのポインタで何バイトとデータの内容を教えてくれます。

```cpp:こんなかんじ
Detected memory leaks!
Dumping objects ->
{867} normal block at 0x07A61250, 32 bytes long.
 Data: <XMq             > 58 4D 71 10 00 00 00 00 00 00 00 00 00 00 00 00 
Object dump complete.
```

でも、一体どこで new したのが原因だかわからないことがあります。
そんなときは、だいたいの場所を推測して
new char[1];
と
new char[2];
で ソースを挟みます。
推測があっていれば

```cpp:リーク
Detected memory leaks!
Dumping objects ->
c:\tt.cpp(669) : {3958} normal block at 0x082B9E50, 2 bytes long.
 Data: <  > CD CD 
{867} normal block at 0x07A61250, 32 bytes long.
 Data: <XMq             > 58 4D 71 10 00 00 00 00 00 00 00 00 00 00 00 00 
c:\tt.cpp(668) : {3957} normal block at 0x082B70D8, 1 bytes long.
 Data: < > CD 
Object dump complete.
```

このように 挟まれて表示されますから、どんどん範囲を狭くしていくと、その場所が特定できます。
原因が特定できないときなどはこのようにやっています。
カレンダーの練習プログラム

```php:calendar.php
<!doctype html>
<html lang="ja">
<head>
	<meta charset="UTF-8" />
	<title>Calendar</title>
	
	<link rel="stylesheet" href="css/normalize.css" />
	<link rel="stylesheet" href="css/style.css" />

</head>
<body>
	<h1>May 2013</h1>
	<table>
		<tr>
			<th>S</th>
			<th>M</th>
			<th>T</th>
			<th>W</th>
			<th>T</th>
			<th>F</th>
			<th>S</th>
		</tr>
		
		<tr>
			<td></td>
			<td></td>
			<td></td>
			<?php for ($day=1; $day<=31; $day++): ?>
				<td><?php echo $day; ?></td>
				<?php if (($day - 4) % 7 === 0): ?>
					</tr><tr>
				<?php endif; ?>
			<?php endfor; ?>
			<td></td>
		</tr>
	</table>
</body>
</html>
```
関数の引数名を取得する

AngularJSのDIとかで利用されているやつです。

関数オブジェクトの`toString()`メソッドがソースコードを返すので、それを利用します。

```javascript
function getParams(func) {
    var source = func.toString()
        .replace(/\/\/.*$|\/\*[\s\S]*?\*\/|\s/gm, ''); // strip comments
    var params = source.match(/\((.*?)\)/)[1].split(',');
    if (params.length === 1 && params[0] === '')
        return [];
    return params;
}
```

関数のソースコードを正規表現使ってゴリゴリと処理します。

```javascript
getParams(function() {}); // => []
getParams(function(a) {}); // => ['a']
getParams(function(a, b) {}); // => ['a', 'b']
getParams(function(a, /* 途中に改行があっても、、、 */
b) {}); // => ['a', 'b']
```

こんな感じで使えるはずです。

バグとかあったら教えて下さい。
LangExtの紹介 - シーケンスの長さに関する関数

[前回はシーケンスの生成について紹介](http://qiita.com/items/af1c64c9ed754fbaa3a4)しました。

今回はシーケンスの長さに関する関数を紹介します。

using
-----
例に出すLangExtを使ったコードは、System名前空間とLangExt名前空間がusingされているものとします。

シーケンスの長さを取得する方法
------------------------------
シーケンスの長さを取得するためには、Len / LongLen関数を使います。
そのほか、似たような関数として、条件を満たす要素の個数を取得するCount / LongCount
関数があります。

### Len / LongLen関数
Len関数は、標準クエリ演算子のCount関数に対応します。

```csharp
// 拡張メソッドとして提供している
var n = Create.Seq(10, 20, 30).Len();
```

LongLen関数は標準クエリ演算子のLongCount関数に対応しており、`int`の範囲に収まらない場合でも長さが取得できます。

「シーケンスを受け取って`int`を返す関数」を受け取る高階関数があったとします。
このとき、そのシーケンスの長さを返すだけでいい場合は、ラムダ式を使わずに書けます。

```csharp
// void Something(Func<ISeq<string>, int> f); という関数があったとして
Something(Seq.Len);
```

LangExtは拡張メソッドを格納するクラスに「Ext」や「Extension」などの接尾辞を付けていませんが、これは上のように関数をそのまま他の関数に渡すときのことを考えてそうしています。もし`Something(SeqExtension.Len)`のように書く必要があるならば、`Something(xs => xs.Len())`のようにラムダ式で書いた方がまだましです。
`Enumerable`の場合もやはり、長ったらしいのでラムダ式を書いてしまいます。

### Count / LongCount関数
Count / LongCount関数は、標準クエリ演算子の述語を取るバージョンのCount / LongCount関数に対応します。

```csharp
var n = Create.Seq(1, 2, 3, 4).Count(i => i % 2 == 0);
```

なぜLenとCountに名前を分けたのか
--------------------------------
標準クエリ演算子ではシーケンスの長さを取得する関数も、指定した述語に一致する要素を数え上げる関数も、Countという名前が付けられています。
C#はメソッドのオーバーロードを許しているため仕様上問題はありませんが、単に長さを取得する関数にCountという語は、少々大げさな感じがします。

そのため、LangExtでは(Scalaにならって)別々の名前を付けました。
LengthではなくLenなのは、単純により短く、この業界ではLenがLengthの省略形だと通じやすいという理由からそうしています。

次回
----
次回は、Sum系メソッドについてです。
ローカルGitコマンド基礎の基礎

初めてだと、説明を読んでもコマンドの順番がわからず迷う。
最低限これだけの操作をできるようになってから、学習をすすめるべきではないか。

初期化
git init

ファイルを更新したら
git add (filename)
git commit   

状態を見る。
git log
git status

ファイルを戻す。logから、commit Numberをひろう。
git reset hard (commit Number7桁)
Milkode 1.0.0 リリース！


![milkode 1.0.0](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20130523/20130523221520.png?1369314932)

行指向のソースコード検索エンジン、初のメジャーバージョンリリースとなります。

大量のソースコードを高速にまとめて検索してみたいと思った方、是非一度お試し下さい。

[[続きを読む]](http://ongaeshi.hatenablog.com/entry/milkode-1.0.0)
引数またはパイプライン入力を受け付けるスクリプトの練習です。

```EchoFunc.ps1
# Windows PowerShell
# 引数またはパイプライン入力を受け付けるスクリプトの練習です。

function U-Echo() {
    [CmdletBinding()]
    param(
        #パイプライン入力を受け取る。必須。
        [Parameter(ValueFromPipeline=$true, Mandatory=$true)]
        #NULL不可
        [ValidateNotNull()]
        #
        [string[]]$InputString
    )
    process {
        $InputString | %{
            "Echo:[$_]"
        }
    }
}
```
TeXでソースコードを埋め込む


参考になったサイト
[mytexpert Listing](http://ie.u-ryukyu.ac.jp/e075729/2009/08/02/jlistingsty%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)
[jlisting.styのインストール](http://ie.u-ryukyu.ac.jp/e075729/2009/08/02/jlistingsty%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)
[texにCのソースコードを埋め込む](http://adcyuyo.wordpress.com/2011/12/29/tex%E3%81%ABc%E3%81%AE%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%9F%8B%E3%82%81%E8%BE%BC%E3%82%80/)

OSはUbuntu12.04です

TeXのレポートなどにソースコードを埋め込むときには，listing.styやjlisting.styというのを使うと良いみたいです．

以下のディレクトリを確認して，なかったらダウンロードして放り込みます．ディレクトリは適当に読み替えてください．

```
/usr/local/texlive/2012/texmf-dist/tex/latex/listings/
```

僕の場合はlisting.styは入ってたけど，jlisting.styはなかったので，ダウンロードして入れました．

ダウンロード元
[jlisting.sty](http://sourceforge.jp/projects/mytexpert/downloads/26068/jlisting.sty.bz2/)

jlisting.styを放り込んだら，

```sh:Zsh
cd /usr/local/texlive/2012/texmf-dist/tex/latex/listings/
sudo mktexlsr
```

これで使えるはずです．

使うときには

```tex
\usepackage{listings,jlisting}

\lstset{%
  language={C},
  basicstyle={\small},%
  identifierstyle={\small},%
  commentstyle={\small\itshape},%
  keywordstyle={\small\bfseries},%
  ndkeywordstyle={\small},%
  stringstyle={\small\ttfamily},
  frame={tb},
  breaklines=true,
  columns=[l]{fullflexible},%
  numbers=left,%
  xrightmargin=0zw,%
  xleftmargin=3zw,%
  numberstyle={\scriptsize},%
  stepnumber=1,
  numbersep=1zw,%
  lineskip=-0.5ex%
}

```

これをプリアンブルに書いて設定します
設定は個人の好きな感じに直せます．
設定の詳細は[\lstsetのオプション](http://www.biwako.shiga-u.ac.jp/sensei/kumazawa/tex/listings.html)を参照してください．

ソースを挿入する箇所で

```tex
\lstinputlisting[caption=ほげほげ,label=ほげ]{ファイル名}
```

でいけます．挿入したいソースコードのファイルはtexのファイルと同じディレクトリに入れてください．

直接ソースを書く場合は

```tex
\begin{lstlisting}[caption=ほげほげ,label=ほげ]
   ソースコード
\end{lstlisting}
```

とやるようです．

レポートなどで困ってる人の参考になれば幸いです．
[ZF2] ServiceとManagerの違い

ZF2で「SessionManagerをServiceとしてServiceManagerに登録する」みたいな処理をしている内に、ServiceとManagerの違いが分からなくなってきたので、ちょっと整理。

# Service
何らかの機能を提供する、複雑な状態を持たないオブジェクト。
何らか、の部分は何でもいい。
たとえばログの出力だったり各種設定の管理だったりする。

複雑な状態を持たないため、Entityのようにいちいち生成すると資源の無駄遣い。
なのでServiceManagerに登録することで、アプリケーション中で使い回せるようになっている。


# Manager
読んで字のごとく、何かの管理を担当するオブジェクト。
何か、の部分にはServiceやModule、セッション、プラグイン（Helper）などが該当する。

ソフトウェアアーキテクチャ上でManagerという何か特殊な役割を持ったコンポーネントが存在するわけではない。

- ServiceManager
	- Serviceを管理する。
	- 必要に応じてServiceを生成し、生成したServiceを使い回せるように保存しておいたりする。
- ModuleManager
	- Moduleを管理する。
	- Moduleをロードし、各種Moduleイベントを発生させる。
- SessionManager
	- セッションを管理する。
	- セッションの開始や破棄など、セッションを操作するための機能を提供する。

上記の例においてServiceManagerは「Serviceを管理する、という機能を提供するService」ではあるが、その役割上、他のServiceとは異なりアプリケーション中に単一のインスタンスしか存在し得ない。

一方、ModuleManagerやSessionManagerは「何かを管理する機能を提供するService」としてServiceManagerに登録し、アプリケーション中で単一のインスタンスを使い回す、ということがありえる ※。

※ 別にServiceManagerに登録しなくてもいいけど、全く同じManagerを複数箇所で利用する場合はいちいちnewするよりも登録しといたほうが効率がいい。
MongoDB簡易メモ


個人用の簡易メモです。

 起動
=====
## シェル
mongo

コマンド
=====
## ヘルプ
help

## DBの切り替え
use \<db_name>

CRUD
=====
## Create
db.mycoll.insert(\<document>)

## Read
db.mycoll.find(\<query>, \<projection>)

query - 条件
projection - 取得したいフィールド

{field1: value1, field2: value2} - AND条件の検索

|演算子	|意味			|
|:-----		|-----			|
|$lt		|より小さい	|
|$lte		|以下			|
|$gt		|より大きい	|
|$gte		|以上			|
|$ne		|等しくない	|
|$exists	|存在有無		|
|$or		|OR条件		|

db.mycoll.find({filed1: {$ne: 'val1'}, fileld2: {$gte: 100}) 
db.mycoll.find({field1: {$exists: false}})
db.mycoll.find({field1: 'val1', $or: [{field2: 'val2'}, {field2: 'val3'}, {ield3: 'val4'}]})

## Update
db.mycoll.update(\<query>, \<object>, \<options>)

query - 条件
object - 設定値
options - upsert, multi

条件にマッチしたドキュメントを置き換える。

|更新修飾子	|意味				|
|:-----		|----					|
|$set		|フィールドの一部を更新	|
|$inc		|フィールドの値を増やす	|
|$push		|フィールドに値を追加	|

db.mycoll.update({field1: 'val1'}, {$set: {field2: 'val2'}})
db.mycoll.update({field1: 'val1'}, {$inc: {field2: -2}})
db.mycoll.update({field1: 'val1'}, {$push: {field2: 'val2'}})
db.mycoll.update({field1: 'val1'}, {$inc {field2: 1}}, {upsert: true})

## Delete
db.mycoll.remove(\<query>, \<justOne>)
TypeScriptでのAbstract factory pattern

# 暇すぎるから

書いてみた。が、
interfaceについてTypeScript (0.8.3)だと
public static〜という感じでプロパティ指定ができないので、
(new Slime).create();という感じになってしまう。

あとclass内でのプロパティとして持たせるのがだるいので
moduleを使ってしまった。

ES5で定義されているgetアクセサを利用しているので、

```sh
tsc hoge.tsc -target ES5 
```

という感じで対象を指定してコンパイルしてあげよう...

```javascript
interface EnemyStatus {
  name: string;
  hitPoint: number;
  magicPoint: number;
  experiencePoint: number;
  gold: number;
}

interface Enemy {
  status: EnemyStatus;
  name: string;
  attaked: (attackPoint: number)=> void;
  isAlive: ()=> boolean;
}

interface EnemyFactory {
  create(): Enemy;
}

class BaseEnemy {
  myStatus: EnemyStatus;

  constructor(status: EnemyStatus) { 
    this.myStatus = status;
  };

  public get status() { return this.myStatus; }
  public get name(){ return this.myStatus.name; }
  public get hitPoint(){ return this.myStatus.hitPoint; }
  public get magicPoint(){ return this.myStatus.magicPoint; }
  public get experiencePoint(){ return this.myStatus.experiencePoint; }
  public get gold(){ return this.myStatus.gold; }

  public attaked(attackPoint: number): void {
    this.myStatus.hitPoint -= attackPoint;
  }

  public isAlive(): boolean {
    return this.myStatus.hitPoint > 0;
  } 
}

class SlimeFactory implements EnemyFactory {
  create(): Slime {
    return new Slime;
  }
}

class SlimeKnightFactory implements EnemyFactory {
  create(): SlimeKnight {
    return new SlimeKnight;
  }
}

class DrakeeFactory implements EnemyFactory {
  create(): Drakee {
    return new Drakee;
  }
}

class Slime extends BaseEnemy implements Enemy {
  constructor() {
    super({
      name: "Slime", 
      hitPoint: 6, 
      magicPoint: 2, 
      experiencePoint: 1,
      gold: 1
    });
  }
}

class SlimeKnight extends BaseEnemy implements Enemy {
  constructor() {
    super({
      name: "SlimeKnight",
      hitPoint: 194,
      magicPoint: 7,
      experiencePoint: 119,
      gold: 7
    });
  }
}

class Drakee extends BaseEnemy implements Enemy {
  constructor() {
    super({
      name: "Drakee",
      hitPoint: 13,
      magicPoint: 4,
      experiencePoint: 3,
      gold: 2
    });
  }
}

module BuildEnemy {
  var enemies: any[] = [
    (new SlimeFactory).create(), 
    (new SlimeKnightFactory).create(), 
    (new DrakeeFactory).create()
  ];

  export function singleSubstanceEnemy(): BaseEnemy {
    return enemies[randIndex()];
  }

  function randIndex(): number {
    return (parseInt(String(Math.random() * 10 % (enemies.length)), 10));
  }
}

module Runner {
  export function singleSubstanceEnemyScenario(): void {
    var enemy: BaseEnemy = BuildEnemy.singleSubstanceEnemy();
    console.log("Enemy name is: " + enemy.name);
    console.log("Enemy hit point is: " + enemy.hitPoint);
    enemy.attaked(1);
    console.log("Attacked! Damage is: " + 1);
    console.log("Enemy hit point is: " + enemy.hitPoint);
    console.log("Enemy is alived?: " + enemy.isAlive());
  }
}

Runner.singleSubstanceEnemyScenario();
```

# 実行した結果

こんな感じになる。

![スクリーンショット 2013-05-23 23.20.14.png](https://qiita-image-store.s3.amazonaws.com/0/3985/fb8b8122-b9fb-001e-095b-0449f11b91d9.png)

いいよね？
JavaScript でメールアドレスをバリデーション

入力フォームなどで有効なメールアドレス書式となっているかを確認する関数

```javascript
//引数にテキストをいれる
//正しいメアド書式なら true、間違っていれば false を返す
function checkEmailAddress(str){
	if(str.match(/.+@.+\..+/)==null){
		return false;
	}else{
		return true;
	}
}
```
Java の .getClass().getResource(path) を Clojure で書くと、。。。

`this.getClass().getResource(path)` の `this` が Clojure には無いので面倒です。 `.getContextClassLoader` で問題なのですが、もっと簡単に、

```clj
(clojure.java.io/resource path)
```

と書きます。`(require '[clojure.java.io :as io])` していれば、

```clj
(io/resource path)
```

となります。
AS3 で AS2 の Shared Object を読み書きする

AS3 では、AS2（AS1）で作成した Shared Object データをそのままでは読めない。
というか互換性がない。
下記のコードで読み書きできるようになる。（＝互換性をもたせることができる）

```as
import flash.net.SharedObject;
import flash.net.ObjectEncoding;
SharedObject.defaultObjectEncoding = ObjectEncoding.AMF0;
```
テキストボックスを選択したら全選択状態にする

URLやコードをコピーさせたいときなど、テキストボックスを選択した瞬間に、テキストを全選択状態にする。

```javascript
$(document).ready(function(){
	$("#textid").click(function(){
		$(this).select();
	});
});
```

```html
<input type="text" id="textid" value="Copy this text please." />
```
hjklマスターに薦める意外と便利な機能

本記事は [Vim Advent Calendar 2012](http://atnd.org/events/33746) の177日目です。
176日目は@manga\_osyoさんによる、[lingr で動作する reading\_vimrc-bot をつくった](http://d.hatena.ne.jp/osyo-manga/20130525/1369476448)でした。

本記事は簡単なTips集のようなものです。`h``j``k``l`での移動が難なく出来るようになった程度のVim練度の方を対象に、かつ意外と気づきにくい便利な機能をおすすめしていきます。

# 行選択する

キーバインド:`V`(Visual lineモード)

Windows系の操作だと基本はShiftを押しながらそのまま縦に選択していくしか行選択できないので、行選択という概念が頭になくなかなか気づきませんでした。それまでは普通にVisualモードで縦に選択していたのですが、行末の改行が選択できずもどかしい思いをしていました。
ちなみに矩形選択は`<C-v>`です。こっちは調べるとすぐ出るので知ってる方も多いかもしれません。

# ちょっと簡単にヘルプを引く

例えば上記の矩形選択についてhelpを引くとしましょう。恐らくこうなるはずです。

`:help ctrl-v`

ちょっとめんどくさがればこんなかんじでしょうか。

`:h ctrl-v`

ですが、ctrl系のキーバインドに関するヘルプは、下記でも引くことができます。

`:h ^v`

恐らく文字コードの関係だと思いますが、詳細はわかりません。気になった方は調べてみてください。とにかくタイプ数が減るので楽ちんです。

# ちょっと簡単にタブを開く

タブを開くコマンドは`:tabnew`ですが、`:tabedit`でも開くことができます。`:tabedit`には省略形`:tabe`があるので、若干ではありますが楽にタブを開くことができます。

# 副ファイルを開く

キーバインド:`C-^`

複数のファイルを開いた際に、直前のファイルを開くコマンドです。ファイルの切り替えがぱっとできるので、ファイルを交互に行き来するのに便利。連打すると2つのファイルを行き来しますが、countを与えることで更に前のファイルと切り替えることも可能です。

# バッファを選択する際に、同時にリストを表示する

副ファイルとしてバッファを開けない場合は`:b[uffer]`でバッファを選択するかと思います。素のままでも最短で`:b4`などして切り替えることができるのでわざわざmapする必要もないように感じますが、もしmapするのであれば一工夫してmapしてみるのも良いでしょう。

```vim:.vimrc
nnoremap B :ls<CR>:b 
```

これでバッファを選択する際に同時にバッファリストも表示させることができます。初めて見たときとても感動しました。

# カーソル位置をジャンプする

キーバインド:`<C-o>`

例えば検索したあと元の位置に戻りたい、例えば間違って`gg`/`G`してしまった、そんな時があると思います。そんな時に役に立つのがこの機能です。前回のカーソル位置にジャンプします。行き過ぎた際はお隣のキー`C-i`(もしくは`<TAB>`)で戻ることができます。タグジャンプした際は本来は`<C-t>`でタグスタックを使って戻るのですが、一応この`<C-o>`も使えます。覚えておくと便利。

…とこれだけでも素敵なのですが、ちょっとした裏技があります。このジャンプリスト、ファイルに記録されるのでVimを閉じたあとでも履歴が残ります。そしてたいていのファイルで何らかのジャンプをしていることが多いので、`<C-o>`を連打すると最近編集したファイルが開けることがあるのです。使いどころは多くないですが、閉じたあとに編集漏れを思い出した際など、適当に連打すると開くことがあって便利だったりします。
ちなみにこれを知ったのは、どなたかVimmerの方がファイルをどこに保存したかわからないと言っていた際に、`<C-o>`で開かないかなーと言われていたのを見たためだったと思うのですが…どこで見たか忘れました。

# 最後に

機能やmapの単発モノをちょっとまとめて記事にしてみました。ご覧になられている方でこんなものもあるよ！という方がいらっしゃったらコメントで教えていただいたりしたいのですが、もっといい方法があります。それは、Vim Advent Calendar 2012として記事を書くことです。

Vim Advent Calendar 2012では、まだまだ執筆者を募集しています。こんな雑多な記事でも大丈夫ですし、最近の流行りはgifアニメやyoutubeのようです。twitterでも大丈夫だと聞いたこともあります(要出典)。なんと[Emacsの記事](http://kozo2.hatenablog.com/entry/2013/03/23/030603)まであります。１つのキーや機能、mapについてでも構いません。是非この機会に執筆してみてはいかがでしょうか。

以上VAC 177日目の記事でした、次回のAdvent Calendar 178日目は前回に引き続き？@manga_osyoさんです。

# 参考

> vimのバッファ操作
> http://kaworu.jpn.org/kaworu/2007-07-26-1.php

## hjklマスターとは

<blockquote class="twitter-tweet" data-conversation="none" lang="ja"><p>@<a href="https://twitter.com/sinsoku_listy">sinsoku_listy</a> つまり hjkl とは H な JK Love ってことですか。</p>&mdash; こはまさん (@c0hama) <a href="https://twitter.com/c0hama/status/336860675878051840">2013年5月21日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
ShellからIPMessengerへ送信

ShellからIPMessengerへ送信したいのですが、
IPMessengerへ送信出来ません。

どこか間違ってたら教えて下さい。

```bash
MESSAGE="HELLO WORLD"
USER="username"
HOST=`hostname -s` 
PACKET_NUMBER=`date +%s`
BODY="1:${PACKET_NUMBER}:${USER}:${HOST}:32:${MESSAGE}"

RECEIVER=192.168.0.1

# Open Socket
exec 5<>/dev/tcp/${RECEIVER}/2425 && echo "OK"
# Send message
echo -e ${BODY}>&5
```
Rubyで使えるGoogle API一覧


Googleのサービス使って色々やりたいですよね！Rubyで何ができるのかちょっと調べてみました。

まずAPIクライアントとして、

https://github.com/google/google-api-ruby-client

というのがあります。

これは、

https://developers.google.com/apis-explorer/#p/

に書いているAPIに対応しているgemみたいです。

ただ、

```
client.discovered_api('plus')
client.discovered_api('calendar', 'v3')
```

とすれば、目的のapiが使えると書いてあるけれど、実際どういう名前で叩けばいいのか全然書いてない不親切ドキュメントです。

ソースコードみてみると、

```
client.discovered_apis
```

と打てば、使えるの全部出てくるということがわかりました。

出てきた結果を表にまとめて書いておくと以下のようになります。(2013/05/23現在)

| servise name | version |
|:-----------|:-----------|
| adexchangebuyer | v1 |
| adexchangebuyer | v1.1 |
| adexchangebuyer | v1.2 |
| adexchangeseller | v1 |
| admin | directory_v1 |
| admin | reports_v1 |
| adsense | v1 |
| adsense | v1.1 |
| adsense | v1.2 |
| adsensehost | v4.1 |
| analytics | v2.4 |
| analytics | v3 |
| androidpublisher | v1 |
| audit | v1 |
| bigquery | v2 |
| blogger | v2 |
| blogger | v3 |
| books | v1 |
| calendar | v3 |
| civicinfo | us_v1 |
| compute | v1beta13 |
| compute | v1beta14 |
| compute | v1beta15 |
| coordinate | v1 |
| customsearch | v1 |
| datastore | v1beta1 |
| dfareporting | v1 |
| dfareporting | v1.1 |
| discovery | v1 |
| drive | v1 |
| drive | v2 |
| freebase | v1sandbox |
| freebase | v1 |
| fusiontables | v1 |
| gan | v1beta1 |
| groupsmigration | v1 |
| groupssettings | v1 |
| latitude | v1 |
| licensing | v1 |
| mirror | v1 |
| oauth2 | v1 |
| oauth2 | v2 |
| orkut | v2 |
| pagespeedonline | v1 |
| plus | v1 |
| prediction | v1.2 |
| prediction | v1.3 |
| prediction | v1.4 |
| prediction | v1.5 |
| reseller | v1sandbox |
| reseller | v1 |
| shopping | v1 |
| siteVerification | v1 |
| storage | v1beta1 |
| storage | v1beta2 |
| taskqueue | v1beta1 |
| taskqueue | v1beta2 |
| tasks | v1 |
| translate | v2 |
| urlshortener | v1 |
| webfonts | v1 |
| youtube | v3 |
| youtubeAnalytics | v1 |
| youtubeAnalytics | v1beta1 |

ただ、これが全部なのかとおもいきや、これでは叩けないAPIも存在するみたいです・・・。

例えば、Google Contactsの情報をいじるものがあります。
https://developers.google.com/google-apps/contacts/v3/

`contacts`なんて文字上には全く出てこないですよね。なんかGDataを使ってアクセスするみたいで、探してみたら以下のgdata gemが見つかりました。

- https://github.com/dwaite/gdata
- https://code.google.com/p/gdata-ruby-util/

これは、以下のサービスが使えるようです。

| servise name |
|:-----------|
| base |
| apps |
| blogger |
| booksearch |
| calendar |
| contacts |
| doclist |
| finance |
| gbase |
| gmail |
| health |
| notebook |
| photos |
| spreadsheets |
| webmaster_tools |
| youtube |

が、4年間ぐらいメンテされて無くて、ちゃんと使えるのか不安です・・・。誰か検証して下さい。

追記：
やっぱり、Ruby1.9以降なくなった`jcode`を使ったりしていて、使えなかった。まぁ大して難しいRequest送らなくていいので、自分でHTTPリクエスト送って書けばいいのかもしれない・・・。
上記の、Contactsに関しては、https://github.com/Placester/google-contacts があったので、それぞれ固有のgemを探せば見つかるのかもしれない。
MFCアプリでgoogle-gflagsを使用する

google-gflagsのビルド、ヘッダの配置、ライブラリのリンクは説明を割愛。

コマンドラインの解析処理にargc, argvを渡す必要があるが、MFCの場合main関数がないため受け取ることができない。
CWinAppクラスのm_lpCmdLineメンバに引数の文字列があるが、この形式ではgoogle-gflagsに渡すことはできない。

ところが、実はargc/argvの前にアンダーバーを2つつけたグローバル変数が存在し、プログラム内から参照することができる。したがって下記の1行をInitInstanceの中にいれておけば、プログラム中の好きな個所でオプション引数を参照できるようになる。

```cpp
// コマンドラインオプションの解析
google::ParseCommandLineFlags(&__argc, &__argv, true);
```
話題騒然のgithubignore.io表記のコマンドがzshで動かない

http://qiita.com/items/f8c27d37052e2e573504

上の投稿で知りましたが、[githubignore.io](http://gitignore.io/)便利ですね。

[こちら](http://gitignore.io/cli)のコマンドを入れてみたんですが、zshのコマンドが
表記の通りにリダイレクトしても上手く動かなかったんで、メモ。

```sh:Zsh
$ echo "function gi() { curl http://gitignore.io/api/\$@ ;}"  >> ~/.zshrc && . ~/.zshrc
```

このようにエスケープしたら上手く動きました。