OmniAICreator/Qiita-1.07M huggingface dataset:
クラスにメソッド呼び出しカウント機能を自動で追加する。

# モチベーション

* なんとなく、呼び出した回数をプログラム自身が確認したくなったり。
* クラスのメソッド全てに一律にデバッグ用の機能を入れたい。

等の例として。

# 解決方法

例えば、次のクラス定義を考える。

```py
# pythonじゃないよ！Booだよ！
class A:
	def foo(): # ... foo()メソッド本体 ...
	def bar(): # ... bar()メソッド本体 ...
```

このクラスのメソッド foo() と bar() の呼び出し回数を記録する機能を手作業で追加するなら次のようになる。

```py
# pythonじゃないよ！Booだよ！
class A:
	count_foo as int
	count_bar as int
	def foo(): ++count_foo; # ... foo()メソッド本体 ...
	def bar(): ++count_bar; # ... bar()メソッド本体 ...
```

C# 等であればカスタム属性等でも実装することはできるが、Booらしく構文木書き換えで攻めるのが王道（？）ということで、上記の手作業をマクロで自動化する。

# ソース

```py
# python じゃないよ！Booだよ！
import Boo.Lang.Compiler.Ast

# 'invocation_counter' とクラス定義の中に書くと、
# 全メソッドに対応する '_count_メソッド名' という整数フィールドを追加し、
# 各メソッド本体の先頭でフィールドをインクリメントするコードを追加する。
macro invocation_counter:
	# c = このマクロを書いた一番内側のクラス定義
	c = invocation_counter.GetAncestor[of ClassDefinition]()
	assert c != null

	# 全メソッド定義構文木について処理をする。
	for m in array(c.Members):
		method = m as Method
		continue if method is null or method.IsStatic # static メソッドは対応しない。

		# メソッド本体先頭にはカウンタインクリメントを追加
		counterName = '_count_' + method.Name
		method.Body.Insert( 0, [|
		  ++$(ReferenceExpression(counterName))
		|] )

		# クラスにカウンタフィールドを追加
		field = Field( )
		field.Name = counterName
		field.Visibility = TypeMemberModifiers.Public
		field.Type = SimpleTypeReference( 'int' )
		c.Members.Add( field )
```

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

```py
class A:
	invocation_counter
	def foo():
		pass
	def bar():
		pass
	def zoo():
		pass

a = A()
a.foo(); a.foo(); a.foo()  # 3回
a.bar() # 1回
print "foo:" + a._count_foo + " bar:" + a._count_bar + " zoo:" + a._count_zoo
# foo:3 bar:1 zoo:0 と表示される。
```

## 注意点

* staticメソッドに対応してません。対応修正は簡単です。
* 'count_メソッド名' という名前がプログラム中で定義されていると名前衝突でコンパイルエラーになります。

# 結論

[関連プロパティを追加する例](http://qiita.com/items/d448937eba504fe54d25 "link")に似ているが、属性ではなくマクロでやってみた。マクロなので属性を使うためのコンパイルは不要でメンテナンスが楽だと思う。

もっと複雑な次のようなケースでも今回のメソッド内部の構文木書き換えは使えると思う。個人的には、昨今の言語に、C/C++ 言語のプリプロセッサのようなプログラムを好き勝手書き換え生成し放題の世界が還ってきた！とか思っていたりする。

### 本来はメソッドにわけて書かなければならない関連する処理を、１つのメソッドとして書きたい場合。

メソッドの本体を適当なルールで分割して、個別にメソッド構文木として吐き出す。分割前のメソッドは抹殺するなり、分割後のメソッドを呼び出すなど。
ステートマシンなプログラムで、各状態の初期化、本体処理、脱出処理、とか。

### 定義済みのメソッドを置き換えたい場合。

Unity の MonoBehaviour なシングルトンを実装するなら、

* クラスにシングルトンコードを入れる（インスタンス用の変数とか生成メソッドとか）
* 既存のAwake()やStart()は名前変更＋新しいAwake()でシングルトンコード処理と改名したメソッド呼び出しを入れる。

とか。Awake()やStart()はマクロで書き換えれば、実コードの方では使っちゃダメ、とか、このメソッドをオーバーライドしなきゃダメ、みたいな制限が取っ払える。上手に作れば、プレハブsingletonとか後続のシーンにも同じものがある、とかいう場合も上手く処理できる。

# おまけ

今回のサンプルみたいなことを本当にしたいなら、むしろ [S2Container.net](http://s2container.net.seasar.org/ja/index.html "link")みたいな AOP をやればいいと思う。
vimでuncrustifyをいい感じに適用する

C/C++やObjective-Cのコードをいい感じに整形してくれる[Uncrustify](http://uncrustify.sourceforge.net/)、最近気に入ってて使ってます。

んでこれをvimで使おうと思って設定したんだけどなんかいい感じにならない。

例えば外部コマンドを使ってフォーマットするformatprgを使って

```vim
:set formatprg=uncrustify\ -c\ ~/misc/uncrustify.cfg\ -l\ CPP\ --no-backup\ 2>/dev/null
```
こんな感じで設定して、gqで現在の行をフォーマット、ggVGで全選択してからgqで全体をフォーマットできます。
だけどuncrustifyは前後関係を見てうまいこと整形してくれるから1行だけフォーマットなんてしないし、ggVGで全選択するとさっきいた行まで戻るのがめんどい。

もっといい感じにできないかなーと思って探してたら、ありました。
[Using Uncrustify with VIM - Stack Overflow](http://stackoverflow.com/questions/12374200/using-uncrustify-with-vim/15513829#15513829)
このAnswerのコード。フォーマットしたあと位置を復元してくれるので、めっちゃ便利。
これだ！と思ってちょろっと改変して、言語を自動検出して自動的に言語毎の設定でフォーマットするようにしました。
以下のコード

```vim
"----------------------------------------
" uncrustify
"----------------------------------------
" see http://stackoverflow.com/questions/12374200/using-uncrustify-with-vim/15513829#15513829

" 例: Shift-Fでコードのフォーマットを行う．
nnoremap <S-f> :call UncrustifyAuto()<CR>

" 例: 保存時に自動フォーマット
" autocmd BufWritePre <buffer> :call UncrustifyAuto()

" uncrustifyの設定ファイル
let g:uncrustify_cfg_file_path = '~/.uncrustifyconfig'

" uncrustifyでフォーマットする言語
let g:uncrustify_lang = ""
autocmd FileType c let g:uncrustify_lang = "c"
autocmd FileType cpp let g:uncrustify_lang = "cpp"
autocmd FileType java let g:uncrustify_lang = "java"
autocmd FileType objc let g:uncrustify_lang = "oc"
autocmd FileType cs let g:uncrustify_lang = "cs"

" Restore cursor position, window position, and last search after running a
" command.
function! Preserve(command)
    " Save the last search.
    let search = @/
    " Save the current cursor position.
    let cursor_position = getpos('.')
    " Save the current window position.
    normal! H
    let window_position = getpos('.')
    call setpos('.', cursor_position)
    " Execute the command.
    execute a:command
    " Restore the last search.
    let @/ = search
    " Restore the previous window position.
    call setpos('.', window_position)
    normal! zt
    " Restore the previous cursor position.
    call setpos('.', cursor_position)
endfunction

" Don't forget to add Uncrustify executable to $PATH (on Unix) or
" %PATH% (on Windows) for this command to work.
function! Uncrustify(language)
    call Preserve(':silent %!uncrustify'.' -q '.' -l '.a:language.' -c '.
                \shellescape(fnamemodify(g:uncrustify_cfg_file_path, ':p')))
endfunction

function! UncrustifyAuto()
    if g:uncrustify_lang != ""
        call Uncrustify(g:uncrustify_lang)
    endif
endfunction
```

うまいことでけた！満足
他にもっと良い感じにできるよーて人がいれば教えて下さい
AngularJSとMeteorの比較

AngularJSとMeteorを組み合わせて使うことを検討いたので、比較のためそれぞれを使って簡単なアプリを作ってみた後の感想。

* [AngularJSで作るYouTube検索 (全6回) - プログラミングならドットインストール](http://dotinstall.com/lessons/youtube_search_angularjs "AngularJSで作るYouTube検索 (全6回) - プログラミングならドットインストール")
* [Meteor YouTube Search](http://youtube-search.snize.meteor.com/? "Meteor YouTube Search")

## 共通
* データバインディングは新感覚だった、楽しい

## AngularJS

* 静的なHTMLをほぼそのままアプリに作り変える事ができる
* DB以外のすべてをクライアントサイドで解決する
* フィルタが手軽でかつ優秀
* バックエンドの事は別途考える必要あり
* Meteorより情報が多い
* AngularJSはプロトタイプや小中規模のアプリを作るのに向いていると思う
* 既存の静的なHTMLがあれば何も考えずに作り始めていける所は気持ちいい
* Meteorもかなり近いけど、Angularほどの感じはない


## Meteor

* フレームワーク自体がMVCを意識してるわけではない
	* BackboneJSなどを組み合わせると良いのかも
* DBをキャッシュするのでユーザはオンライン/オフラインを気にせずに済む
* フロントエンドからバックエンドまで(サーバも)
* 現時点でベータが取れない(2013-05-29)
* Meteorはフルスタックと言うこともあって守備範囲は広い
* 何からなにまでMeteorに乗っかれる安心(不安)はある
* Angularのテンプレートフィルタみたいなのは無いのでAngularが眩しく見える

## まとめ

AngularJSとMeteor組み合わせる事自体にメリットはあまり感じられない。むしろ競合する機能が多くて書き方を統一する事がコストになりそう。AngularJSでできることはほとんどそれほど手間なくMeteorでもできそうなのでどちらか選ぶならMeteor。


## リンク
* [Documentation - Meteor](http://docs.meteor.com/#sevenprinciples "Documentation - Meteor")
* [AngularJS: API Reference](http://docs.angularjs.org/api/ "AngularJS: API Reference")
EC2 InstanceのTerminate時にEBSボリュームも削除するオプション

EC2のインスタンスをTerminateする時、以下のように、

![スクリーンショット 2013-05-29 20.03.10.png](https://qiita-image-store.s3.amazonaws.com/0/4700/fd285be4-9c10-3102-9b7c-02fb515e447c.png "")

「Delete on Termination」の値がfalseの設定になっていると、attachされていたEBSのボリュームはdeleteされずに「available」の状態になり削除されずに残ってしまいます。
このような状態を回避するには、[ec2-run-instances](http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ApiReference-cmd-RunInstances.html)や[ec2-request-spot-instances](http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ApiReference-cmd-RequestSpotInstances.html)コマンドの引数に bオプションを指定してあげるとTerminateと共にEBSも削除してくれるようになります。

```
$ ec2-run-instances -b "/dev/sda1=::true" (後のオプションは省略)
```

以上
symfony2でS3からローカルに画像を保存しないで表示する方法

```php
<?php

namespace ~~~~~~\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

use Aws\Common\Aws;
use Aws\S3\Enum\CannedAcl;
use Aws\S3\Exception\S3Exception;
use Guzzle\Http\EntityBody;
use Symfony\Component\HttpFoundation\Response;

class S3Controller extends Controller
{

	public function imageAction($fileName) {

		$bucketName = $this->container->getParameter("bucketName");
		$aws = $this->container->get('aws');
		$s3 = $aws->get('s3');
		$fileName = '/'.$fileName;

		$object = $s3->getObject(array(
				'Bucket'	=> $bucketName,
				'Key'		=> $fileName
		));
		
		$imgStr = $object["Body"]->__toString();

		return new Response($imgStr,200,array('Content-Type' => $object["ContentType"]));
	}
}
```
Deviseでon:update属性のvalidationがあるときパスワード再発行ができない


## やりたいこと
認証システムにDeviseを利用。
初回登録はメールアドレスとパスワードのみでメール認証後の本登録で名前などその他の項目を取得したい。(on:updateにてvalidationを設定)

``` ruby:app/model/user.rb
validates :name, presence: true, on: update
```

この時、初回登録のみ済ませた状態でパスワードの再発行をしようとすると上記のnameのバリデーションが引っかかってパスワードが再発行できない。これを解決したい。

※on:updateじゃないvalidationの場合にはinvalidなデータは存在しないはずなのでこのような事は起こりません。

## validateの条件の追加
パスワードを変更する時on:updateのvalidationは無効になるよう修正。

```ruby:app/model/user.rb
validates :name, presence: true, on: update, unless: :encrypted_password_changed?
```

これを忘れてると初回登録だけをやったユーザさんがパスワード忘れたときに何もできなくなるので要注意。
やべえ、root権限じゃないのにVimで保存したいファイルあるわ…

ってことありますよね？例えば`/etc/hosts`とかを編集しよーっていうことでVimを立ち上げて
編集後に保存しようとしてVimに怒られた経験ありません？

そんなときは、

```vim
:w !sudo tee % > /dev/null
```

とすると、何もなかったかのように保存できます。

原理としては英語ですが[こちら](http://stackoverflow.com/questions/2600783/how-does-the-vim-write-with-sudo-trick-work)が詳しいかも。

他にはプラグインとして[Sudo.vim](http://www.vim.org/scripts/script.php?script_id=729)とか[SudoEdit.vim](https://github.com/chrisbra/SudoEdit.vim)とか使うほうが
ラクちんですけども。
モジュール内に入れたモデルの階層構造にコントローラーのパスが引きずられないようにする

モジュールの特異メソッドとして use_relative_model_naming? を定義して true を返せばいいようです。

デフォルトだと

```ruby
module Foo
  class User < ActiveRecord::Base
  end
end

Foo::User.model_name.singular_route_key # => "foo_user"
Foo::User.model_name.route_key          # => "foo_users"
Foo::User.model_name.param_key          # => "foo_user"
polymorphic_path(Foo::User.create)      # => "/foo/users/1"
polymorphic_path(Foo::User.new)         # => "/foo/users"
```

use_relative_model_naming? を定義しておくと

```ruby
module Foo
  def self.use_relative_model_naming?
    true
  end
  class User < ActiveRecord::Base
  end
end

Foo::User.model_name.singular_route_key # => "user"
Foo::User.model_name.route_key          # => "users"
Foo::User.model_name.param_key          # => "user"
polymorphic_path(Foo::User.create)      # => "/users/1"
polymorphic_path(Foo::User.new)         # => "/users"
```
npm install したときにpeerinvailedと怒られたときの対応

自分の場合は具体的には[generator-angular](https://npmjs.org/package/generator-angular)を入れようとしたときに怒られたんですが。

ログを取り忘れたんですが、雰囲気ログだとこんな感じ…。

```sh:Zsh
npm ERR! peerinvalid The package generator-karma does not satisfy its siblings' peerDependencies requirements!
npm ERR! peerinvalid Peer generator-angular@0.2.2 wants generator-karma@~0.2.0
```

これ状況的には既に[generator-karma](https://npmjs.org/package/generator-karma)を入れていたんですが、こちらはバージョンが0.3になっており
devendenciesがズレてるから…だったようです。あんまりないケースかもしれないんですが、解決策としては

```sh:Zsh
npm rm generator-karma -g
npm install generator-angular -g
```

としました。

ほかにも[Grunt.jsなんかでも起こる](http://stackoverflow.com/questions/14885084/npm-peerdependency-issue-with-grunt-and-flatiron-peer)ようです。
dependenciesが多いものは結構こういうのが起る可能性あるかもしれないですね。
誰も得しない千反田える.php

単に書いてみたかっただけや...

chitandaeru.php

```php
<?php

$x = ['', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
$y = ['', '十', '百', '千'];
$yy = ['', '万', '億', '兆'];
$z = ['えー', 'びー', 'しー', 'でー', 'いー', 'えふ', 'じー', 'えいち', 'あい', 'じぇい', 'けー', 'える', 'えむ', 'えぬ', 'おー', 'ぴー', 'きゅー', 'あーる', 'えす', 'てぃー', 'ゆー', 'ぶい', 'だぶりゅー', 'えっくす', 'わい', 'ぜっと'];

foreach (range(1, 1000) as $l) {
    $ln = '';
    foreach (array_map('strrev', str_split(strrev($l), 4)) as $m => $i) {
        $tl = '';
        foreach (str_split($i) as $j => $c) {
            $k = strlen($i) - $j - 1;
            if ($c >= 2 || ($c == 1 && $k == 0)) {
                $tl .= $x[$c];
            }
            if ($c > 0) {
                $tl .= $y[$k];
            }
        }
        if ($m > 0) {
            $tl .= $yy[$m];
        }
        $ln = $tl . $ln;
    }

    $fn = $z[($l - 1) % 26];

    echo $ln, '反田', $fn, PHP_EOL;
}
```

ほんとだすごい。

    % php chitandaeru.php | tail
    九百九十一反田しー
    九百九十二反田でー
    九百九十三反田いー
    九百九十四反田えふ
    九百九十五反田じー
    九百九十六反田えいち
    九百九十七反田あい
    九百九十八反田じぇい
    九百九十九反田けー
    千反田える

(ちなみに無駄に 1000 over にも対応してます)
Rails3 でプロファイル

こういうの慣れてなくてすぐ忘れる。

* 参考: https://gist.github.com/somebee/627957

```ruby:Gemfile
gem 'rack-contrib', :git => "https://github.com/mirakui/rack-contrib.git"
gem 'ruby-prof'
```

```ruby:config/application.rb
    config.middleware.use 'Rack::Profiler'
```

```
$ brew install qcachegrind
```

プロファイル取りたいURLのクエリストリングに`?profile=process_time`とか付けてリクエストしたら、tree ファイルがダウンロードされるので、それを `qcachegrind` に読み込ませる。
Terminalでhtpasswdを生成


そう頻繁に使わないからオプションを毎度忘れるのでメモ。  
Terminalの画面に生成し、それをコピペして使うという手順です。

```Terminal
htpasswd -nb ID password
```

```結果
ID:$apr1$mI3LULln$Fby3E8nblz8giXVM7wNgX1
```


ちなみにオプションの内訳はこちら。

- `b` コマンドラインで使う時に。
- `n` ファイルに書き込んだりせず、結果を表示させる時に。

他にも色々あるけど、helpで見ればいいと思うよ。
簡易掲示版

##概要
- シンプルな掲示板です
- ログイン不要
- DBを使わずにファイルにデータを保存します
- 投稿者の名前を自由に付けられます


##サンプルコード
- https://gist.github.com/c-taka/5433754

##ファイルを読み込む
###処理概要

- $dataFileにデータファイルのファイルパスを代入
- $postsに$dataFileを配列に変換して代入する
	- 配列の各要素の最後から改行文字を取り除く

###言語リファレンス
- [file](http://jp1.php.net/manual/ja/function.file.php)
	- ファイル全体を読み込んで配列に格納する


~~~index.php
<?php
// ファイルの内容を配列に取り込みます。
// この例ではHTTPを通してURL上のHTMLソースを取得します。
$lines = file('http://www.example.com/');

// 配列をループしてHTMLをHTMLソースとして表示し、行番号もつけます。
foreach ($lines as $line_num => $line) {
    echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";
}

// 他の例として、Webページを文字列に取り込みます。file_get_contents()も参照してください。
$html = implode('', file('http://www.example.com/'));

// オプションのパラメータは PHP 5 以降で使用できます
$trimmed = file('somefile.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
?>
~~~

##投稿データを表示する

###処理概要
- 配列$postsがあれば、表示処理、無ければ、「まだ投稿はありません。」を表示
- 表示処理
	- $postsを反復処理。$postに代入
	- HTML エンティティに変換して表示


###言語リファレンス
- [if](http://jp2.php.net/manual/ja/control-structures.if.php)
- [echo](http://jp2.php.net/manual/ja/function.echo.php)
 - 1 つ以上の文字列を出力する
- [count](http://jp1.php.net/manual/ja/function.count.php)
 - 変数に含まれるすべての要素、 あるいはオブジェクトに含まれる何かの数を数える
- [foreach](http://jp1.php.net/manual/ja/control-structures.foreach.php)
 - 配列及びオブジェクトの反復処理
- [htmlspecialchars](http://jp1.php.net/manual/ja/function.htmlspecialchars.php)
 - 特殊文字を HTML エンティティに変換する
 - 文字の中には HTML において特殊な意味を持つものがあり、 それらの本来の値を表示したければ HTML の表現形式に変換してやらなければなりません。 この関数は、これらの変換を行った結果の文字列を返します。

~~~index.php
        <?php if () : ?>
        <?php foreach () : ?>
        <?php endforeach; ?>
        <?php else : ?>
        <?php endif; ?>
~~~

##投稿データを追加、データを書き込む
###処理概要
- 投稿されたかどうかをREQUEST_METHODとmessageが空かどうかで判別します。
- 投稿されたデータを書き込み用配列にunshiftで格納します。
- $fpに書き込みモードでファイルを代入
- $fpに$posts配列を改行コードを区切り文字にテキスト化して書き込み

###言語リファレンス
- [$_SERVER](http://php.net/manual/ja/reserved.variables.server.php)
- [empty](http://jp2.php.net/manual/en/function.empty.php)
- [$_POST](http://php.net/manual/en/reserved.variables.post.php)
- [array_unshift](http://jp2.php.net/manual/ja/function.array-unshift.php)
- [fopen](http://jp1.php.net/manual/ja/function.fopen.php)
- [fwrite](http://jp1.php.net/manual/ja/function.fwrite.php)
- [implode](http://jp1.php.net/manual/ja/function.implode.php)


##投稿件数を表示する
###処理概要
- 投稿一覧の末尾にcountを使って投稿件数も表示します。


##ユーザー名も投稿させる
###処理概要
- "user"という名前で名前用の入力フィールドを用意します。
- 名前もデータに追加します。
- データの区切り文字は"|"で$newDataに代入
- 名前が入力されなかったときの処理「名無しさん」も書きます。

###言語リファレンス
- [list](http://jp2.php.net/manual/ja/function.list.php)
- [explode](http://jp2.php.net/manual/ja/function.explode.php)




##日付も表示させる
###概要
- 投稿された日付をdateで取得して、文字列の末尾に追加する。
- フォーマットは"Y-m-d H:i:s"
- 投稿日時をHTMLに表示します。変数は$posted

###言語リファレンス
- [date](http://jp2.php.net/manual/ja/function.date.php)
Notification.Builderを使って通知する

最近Notificationを出す仕組みで、新しいNotification.Builderってのがあるので、ラッピングしてみる。

[Notification.Builder](http://developer.android.com/intl/ja/reference/android/app/Notification.Builder.html)

純正だとAPI Levelが11なので、互換性のあるsupprotLibraryの方を使う。

[NotificationCompat.Builder](http://developer.android.com/intl/ja/reference/android/support/v4/app/NotificationCompat.Builder.html)

```java:Utils.java

public static void createMessageNotification(Context context, int id, String title, String text, String tickerText,
		int smallIconResId, Bitmap largeBitmap, PendingIntent pendingIntent, Uri soundUri) {

	android.support.v4.app.NotificationCompat.Builder builder = new android.support.v4.app.NotificationCompat.Builder(
			context);

	if (title != null) {
		builder.setContentTitle(title);
	}
	if (text != null) {
		builder.setContentText(text);
	}
	if (tickerText != null) {
		builder.setTicker(tickerText);
	}
	if (pendingIntent != null) {
		builder.setContentIntent(pendingIntent);
	} else {
		/** 空でも入れないと、clickしてもdismissされない */
		builder.setContentIntent(PendingIntent.getActivity(context, 0, new Intent(), 0));
	}
	if (largeBitmap != null) {
		builder.setLargeIcon(largeBitmap);
	}
	if (soundUri != null) {
		builder.setSound(soundUri);
	}

	/** icon */
	builder.setSmallIcon(smallIconResId);

	/** autoCancel */
	builder.setAutoCancel(true);

	/** 通知 */
	NotificationManager notificationManager = (NotificationManager) context
			.getSystemService(Context.NOTIFICATION_SERVICE);
	notificationManager.notify(id, builder.build());
}

```
連番で終わっている URL の前後に移動するブックマークレット

URL の最後が連番になっていて、その前後の URL に素早く移動したいときに使えるブックマークレットを書いて公開しました。
例えば、以下のような URL で、その前後の番号に移動することが出来ます。

- http://www.example.com/hoge/fuga123.html
- http://www.example.com/fuga/00456.html
- http://www.example.com/789
- http://www.example.com/20130529/?p=1

自ブログにソースコード解説付きで置いてます。

[連番で終わっている URL の前後に移動するブックマークレット](http://www.otchy.net/20130523/move-ordered-url-bookmarklet/)
jQueryでテーブルの行と列を入れ替える

HTMLのテーブルの行と列を入れ替えるスクリプトです。
需要がどこにあるかは別として…（笑）

+ jQueryが必要です。
+ テーブルのIDを指定して実行するだけ（トグル動作します）。

```javascript
	function matrix_transform(tableid){
		tid = "#"+tableid;
		//後で削除するため、既存の行にtemptrクラスをつける
		$(tid+" tr").addClass("temptr");
		//thead,tbodyは行列変換で意味をなさなくなるのでタグを除去する
		$(tid+" thead,"+tid+" tbody").children().unwrap();
		$(tid+" tr:first td,"+tid+" tr:first th").each(function(){
			tds = $(this).index()+1;
			$(tid).append("<tr />");
			$(tid+" tr.temptr").each(function(){
				$(tid+" tr:eq("+$(this).index()+") > :nth-child("+tds+")").clone(true).appendTo(tid+"tr:last");
			});//tr.temptr each
		});
		$(tid+" tr.temptr").remove();
		}
```

プラグイン化したもの、動作デモは下記URLで
Markdown: [プラグイン、デモ](http://azurs.web.fc2.com/)
MySQLでロックしたときの確認用SQL

```sql
select t_b.trx_mysql_thread_id blocking_id,
       t_w.trx_mysql_thread_id requesting_id,
       p_b.HOST blocking_host,
       p_w.HOST requesting_host,
       l.lock_table lock_table,
       l.lock_index lock_index,
       l.lock_mode lock_mode,
       p_w.TIME seconds,
       p_b.INFO blocking_info,
       p_w.INFO requesting_info
from information_schema.INNODB_LOCK_WAITS w,
     information_schema.INNODB_LOCKS l,
     information_schema.INNODB_TRX t_b,
     information_schema.INNODB_TRX t_w,
     information_schema.PROCESSLIST p_b,
     information_schema.PROCESSLIST p_w
where w.blocking_lock_id = l.lock_id
  and w.blocking_trx_id = t_b.trx_id
  and w.requesting_trx_id = t_w.trx_id
  and t_b.trx_mysql_thread_id = p_b.ID
  and t_w.trx_mysql_thread_id = p_w.ID
order by requesting_id,
         blocking_id
\G
```

詳しくは下記のページを御覧ください
http://d.hatena.ne.jp/sh2/20090618
WindowsファイルサーバにGitリモートリポジトリを設定する

何度かやってるのに覚えないので自分用メモ
Git Bash & Git Guiでの方法

1. ローカルにプロジェクトを作成する

2. ローカルGitを作成する
2.1 エクスプローラでプロジェクトフォルダを右クリック－Git Init Here
2.2 同じく右クリック－Git Gui
2.3 「変更をコミット予定に入れる」、コメント記入、コミット

3. ファイルサーバの任意のリポジトリフォルダを作成し、ドライブ文字を割り当てる
例)z:\repo

4. ファイルサーバ上のリポジトリフォルダを右クリック－Git Bash

5. git init --bare --shared=true

6. ローカルGitフォルダに戻って、Git Guiを起動

7. メニューの「リモート」－追加
8. 名前は任意、場所に3.のフォルダパスをセット

9. メニューの「リモート」－取得元－8.で付けた名前
(何もしないにチェック)

10. プッシュ

※ファイルサーバーじゃなくても、ローカルディレクトリでも出来る
macでテスト用のpostfixを使う


Mountatin Lionでのmacの内蔵postfixを使ってローカルからGmailを使う方法を記述します。

## postfixの起動
```Bash
sudo postfix start
```

## postfixの設定ファイルの編集
```Bash
sudo cp -p /etc/postfix/main.cf /etc/postfix/main.cf.org
sudo vi /etc/postfix/main.cf
```

ファイルの最後に以下のものを追加します。

```Bash
# Added by wada 2013/05/27
#Gmail SMTP
relayhost=smtp.gmail.com:587
# Enable SASL authentication in the Postfix SMTP client.
smtp_sasl_auth_enable=yes
smtp_sasl_password_maps=hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options=noanonymous
# Enable Transport Layer Security (TLS), i.e. SSL.
smtp_use_tls=yes
smtp_tls_security_level=encrypt
tls_random_source=dev:/dev/urandom
```

## 認証IDとパスワードの編集
```Bash
sudo vi /etc/postfix/sasl_passwd
```

以下のように内容を編集します。
xxxはユーザ名、yyyはパスワードです。

```Bash
[smtp.gmail.com]:587 xxx@gmail.com:yyy
```


## postfixへの設定の反映
```Bash
sudo postmap /etc/postfix/sasl_passwd
sudo postfix check
sudo postfix reload
```
CentOS 6 系のインストール直後にする作業


Qiita への久々の投稿ですが、これも blog からの転載です。

最近は CentOS の導入~初期設定の機会が多いので、 CentOS 6系サーバの導入時に必ず行っている初期環境設定作業をメモしてみます。

インストール作業は CentOS の DVD から起動して行います。
CentOS 6 からはテキストベースのインストーラの場合、パーティションの設定やファイルシステムの指定、 初期インストールされるパッケージの追加・削除などが指定できない様ですので GUI を利用した通常のインストールを実行します。
インストール完了後に再起動したら以下の初期環境設定を行います。

## 自分のユーザを作製する
通常の作業は root ではなく一般のユーザで行いましょう。

```sh:
# adduser アカウント
# passwd アカウント
```

## 自分のアカウントを wheel グループに追加する
*sudo(1)* 可能な様に自分のアカウントを wheel グループに追加します。

```sh:
# (rm /etc/group; sed 's/^wheel.*/&,アカウント/g' > /etc/group) < /etc/group
```           

## sudo(1) の設定を変更する
root の権限で作業する場合 *su(1)* よりも *sudo(1)* の方がお勧めです。

好みの問題ですが *sudo(1)* しても元の環境変数を保持する様以下の設定をします。
また、wheel グループに属するメンバーは *sudo(1)* 可能とします。

    Defaults !env_reset に変更
    Defaults env_keep += "HOME" を追加
    %wheel  ALL=(ALL)   ALL を追加

## selinux を無効にする
正しく設定すれば便利だとは思うのですが、未だに使いこなせておらず、トラブルの原因となる事が多いので無効にしています。

```sh:
# ex -s /etc/syconfig/selinux << EOF
> /^SELINUX=/s/.*/SELINUX=disabled
> wq
> EOF
```                

## システム更新
システムを最新の状態に更新します。

```sh:
# yum update
```                

## 最低限必要なソフトウェアのインストール
システムを運用する上でこれだけは必要だとうソフトウェアを導入します。

```sh:
# yum install openssh-clients libtermcap-devel tcpdump
# yum install ntpdate telnet wget tcpdump unzip mlocate rsync bind-utils
```                

## 開発環境のインストール
ソフトウェアを開発する場合は導入します。
（通常はサーバでは開発しないので導入は不要な筈ですが…）

```sh:
# yum install make gcc bison flex
```

### sshサーバの設定
パスワード認証、root でのアクセスを拒否するために **/etc/ssh/sshd_config** に以下の設定を行います。

    PasswordAuthentication no に変更
    PermitRootLogin no に変更

###ファイアウォールの設定

グローバル環境に晒されるサーバであれば 最低限のファイアウォールは設定する必要があります。
基本的には以下のポリシーで必要に応じて追加・削除する様にしています。

```sh:
#!/bin/sh
iptables=/sbin/iptables

# 全て初期化
${iptables} -F

# デフォルトルール
${iptables} -P INPUT DROP
${iptables} -P OUTPUT ACCEPT
${iptables} -P FORWARD DROP

# ループバックを有効にする 
${iptables} -A INPUT -i lo -p all -j ACCEPT

# 接続済みのパケットを受け付ける
${iptables} -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

# http, httpsはどこからでもアクセス可
${iptables} -A INPUT -p tcp --dport 80 -j ACCEPT
${iptables} -A INPUT -p tcp --dport 443 -j ACCEPT

# sshはどこからでもアクセス可
${iptables} -A INPUT -p tcp --dport 22 -j ACCEPT

# dns パケットを許可
${iptables} -A INPUT -p tcp --sport 53 -j ACCEPT
${iptables} -A INPUT -p udp --sport 53 -j ACCEPT
${iptables} -A INPUT -p tcp --dport 53 -j ACCEPT
${iptables} -A INPUT -p udp --dport 53 -j ACCEPT

# ntp パケットを許可
${iptables} -A INPUT -p tcp --dport 123 -j ACCEPT
${iptables} -A INPUT -p udp --dport 123 -j ACCEPT

# そのほか必要なルールを記載
        :
        :
```        

上記設定を /tmp/firewall.sh に格納した場合、 ファイアウォールを有効にして設定をセーブする。

```sh:
# sh /tmp/firewall.sh
# /etc/init.d/iptables save
iptables: ファイアウォールのルールを /etc/sysconfig/iptableに保存中: [  OK  ]
```                

### 起動サービスの設定
起動サービスを設定する。
基本的には atd crond iptables network ntpd rsyslog sshd のみを有効にしていますが、提供するサービスなど必要に応じて変更します。

```sh:
# for i in `chkconfig --list | awk '/:on/{ print $1 }'`
> do
>  case $i in
>      atd|crond|iptables|network|ntpd|rsyslog|sshd )
>          ;;
>      * )
>          chkconfig $i off
>          chkconfig --del $i
>          ;;
>  esac
> done
```                    

ここまで設定して再起動した後で MTA や httpd など個別のサービスについて設定します。
ubuntu for phone で HelloWorld

ubuntu for phone の開発環境をインストールする方法。

# 参考サイト：（こちらを見るとすべて解決）
http://developer.ubuntu.com/get-started/gomobile/
http://developer.ubuntu.com/resources/app-developer-cookbook/mobile/currency-converter-phone-app/
http://blog.fenrir-inc.com/jp/2013/03/ubuntu-for-phones.html

# 必要なもの：
Ubuntu 12.04 or later

# インストール方法：
ターミナルから以下のコマンドを打つだけ。（Ubuntu 12.04 LTSの場合）

```bash
sudo add-apt-repository ppa:canonical-qt5-edgers/qt5-proper && sudo add-apt-repository ppa:ubuntu-sdk-team/ppa && sudo apt-get update && sudo apt-get install ubuntu-sdk notepad-qml
```

でもコケた。
ので、１つずつやってみた。

```bash
sudo add-apt-repository ppa:canonical-qt5-edgers/qt5-proper
sudo add-apt-repository ppa:ubuntu-sdk-team/ppa
sudo apt-get update
sudo apt-get install ubuntu-sdk notepad-qml
```

今度はうまくいった。
sudo apt-get update で、昔インストールした何かがリンク切れでupdateできなかったぽい。

# 動かす方法：
ダッシュボードにQTって打つと「QT Creator」が出てくるので、クリック。

1. Ctrl+Nでプロジェクト新規作成。
2. Projects > Ubuntu Touch > Simple UI を選んで、Chooseボタン。
3. 「Introduction and Project Location」でName（プロジェクト名）とCreate in（保管場所）を入れて、Nextボタン。
4. 次の画面でFinishボタン。

ソースが自動生成されました？

5. Ctrl+R で自動ビルド→実行。

画面でたー
![ubuntuPhoneSimple.PNG](https://qiita-image-store.s3.amazonaws.com/0/12298/2e777860-083b-acc1-c353-77b67d005547.png)
「Tap me!」をタップ（ていうかクリック）すると、左の「Hello..」が「..world!」になるよ！


# 終わらせ方：
Alt+Tabでソース画面に戻って、Application Outputの赤い■ボタン(Stop)をクリック。
raise_errorで発生したエラーの内容を確認する


```ruby:user_spec.rb   
   expect{@user.save!}.to raise_error {|ex| p ex.inspect}
```

としてやる。

```bash
All examples were filtered out; ignoring {:focus=>true}
......."#<ActiveRecord::RecordInvalid: translation missing: ja.activerecord.errors.messages.record_invalid>"
...............

Finished in 2.03 seconds
22 examples, 0 failures
```

のように表示されます。
mysqlでALTER TABLEもCREATE TABLEも動かないし何もかもがおかしくなった時の対処

CREATE TBLEしようとするとalready existsとか言われるし、じゃあ、居るんだったらとDROP TABLEしようとするとdoesn't existsとか言われるし、もうどうしようもない時の藻掻き方

1. とりあえずバックアップはとっておく
2. 該当テーブルをREPAIR TABLEしてみる
3. mysqlの再起動をしてみる
4. どうせダメなので言われた通りALTER TABLE hoge DISCARD TABLESPACE;
5. どうせダメなので言われた通りALTER TABLE hoge IMPORT TABLESPACE;
6. どうにもならないの分かりながらDROP TABLEを試してみる。
7. どうにもならないの分かりながらCREATE TABLEを流してみる
8. どうせダメなので、もういっそDROP DATABASEにトライする
9. でも、よくわからないエラーが出てそれすら出来ないのを確認して mysqlをアンインストール => インストール
10. 入れ直しても状況が変わらないのを確認して該当スキーマのdatadirを物理的に削除
11. それでもどうせダメなので rm -fr datadirそのものを削除する

大体、11までやって真っ新になれば大体問題は解決します。なんとかなったら、create database してバックアップから復元してみましょう。色々原因を調べてみたんですが明確な理由は分かりませんでした。なんらかの原因でスキーマ情報に不整合が起きているのでしょうが、それが起きるタイミングも直し方も分からずじまい。ここまでやれば大体問題が解決するという経験則をメモしておきます。
IE8 でjQueryのslideToggleを使うとmarginが消える

IE8でブロック要素に対してjQueryのslideToggleを使うと、処理対象となる要素のmarginが無効化されるというバグがある。

回避するには対象となるブロック要素に以下のCSSを追加してやるとよい。

`{ overflow: hidden; }`
ランダムなカラーコードを生成


```javascript
function colorGen(){ 
	return '#'+Math.floor(Math.random()*16777215).toString(16); 
}

colorGen()
->"#d781f7"
colorGen()
->"#c68c69"
colorGen()
->"#559acf"
colorGen()
->"#d557a3"


```
CentOSの要らないサービスを無効にするレシピ

CentOSでインストールされるサービスの中で、頻繁に不要とされるサービスをまとめて無効にするレシピです。よく使うレシピに忍ばせておけば便利ですよ。

パッケージは適宜カスタマイズしてください。

```ruby:default.rb
%w[acpid auditd autofs avahi-daemon avahi-dnsconfd bluetooth conman cpuspeed cups dnsmasq dund gpm hidd ip6tables irda lvm2-monitor mcstrans mdmonitor multipathd pand pcscd psacct rawdevices readahead_early readahead_later restorecond saslauthd smartd wpa_supplicant ypbind yum-updatesd].each { |name|
  service name do
    ignore_failure true
    action [:disable, :stop]
  end
}
```

`ignore_failure`をつけないと、パッケージが見つからない時点でエラーで止まってしまいます。と言っても見栄えが悪いのでいい方法あったら教えてください。

****
(2013-6-17 追記)
上記のレシピをCookbook`centos5::stop-services`にまとめました

> https://github.com/tumf/centos5-cookbook

Berkshellf使っている方はいかのようにすることで簡単に利用できます。

```bash:
echo "cookbook 'centos5', github: 'tumf/centos5-cookbook'" >> Berksfile
berks berks install --path cookbooks
```
Google Maps Android API v2 を使ってみた

[GoogleのLocationClientを使ってみた](http://qiita.com/items/c6340a51600122033853)の続き。Google Play services library を使ってみたのでついでにGoogle Mapsも。

[Getting Started](https://developers.google.com/maps/documentation/android/start) 通りにやればとりあえずできるけど、時間がかかるのでメモ。

* API keyのために必要なSHA1 fingerprintは以下のコマンドで得る

```sh
# for debug certificate fingerprint
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android

# for release cerficate fingerprint
keytool -list -v -keystore $your_keystore_name -alias $your_alias_name
```

* プロジェクトは Google Play services をライブラリとして参照する
* [Google apis](https://code.google.com/apis/console/) で設定をする
  * "API Access" で fingerprint を登録して API key を得る
  * "Services" の Google Maps Android API v2 を ON にする

* Android 2.3 もサポートする場合、`MapFragment`ではなく`SupportMapFragment`を使うこと
  * その他のFragment関係の箇所もサポートライブラリのものにする

これで動いた。
実際のコードは [gfx/GoogleMapV2Example](https://github.com/gfx/GoogleMapV2Example) を参照のこと。Android 2.3.4 と Android 4.2.2 で動作確認した。

# SEE ALSO

* https://developers.google.com/maps/documentation/android/
Pow + rbenvでlocalの.ruby-versionが無視される場合

## 問題
Pow + rbenvでRailsを開発している場合、通常Powはプロジェクトのルートディレクトリにある.ruby-versionを参照します。

````
[your-app] cat .ruby-version 
1.9.3-p392
[your-app] rbenv local 1.9.3-p429 
[your-app] cat .ruby-version 
1.9.3-p429
````

しかしPowを再起動しても、なぜかRailsが以前のバージョンで動きつづけたりする場合があります。

## 原因
プロジェクトの上位ディレクトリに別の.ruby-versionがあると、Powがそのバージョンを参照してしまうようです。

## 解決策
プロジェクトの上位ディレクトリに一つずつ移動して、.ruby-versionがないか確認します。
上位ディレクトリに不要な.ruby-versionがあった場合は削除します。

````
[your-app] cd ..
[projects] cat .ruby-version 
1.9.3-p392
[projects] rm .ruby-version
````

### 確認時のPowのバージョン
- 0.4.0

### Railsで使用中のRubyのバージョンを確認する
Railsの内部から使用中のRubyのバージョンを確認する場合は以下の定数が使えます。
怪しい場合はlogger等で確認してみましょう。

````ruby
RUBY_VERSION # => "1.9.3"
RUBY_PATCHLEVEL # => 429
````

### 参考にしたWebページ
- この現象はPowの[Issue](https://github.com/37signals/pow/issues/363)に挙げられています。
今更だけど、JavaScriptのthisを判断する時の自分の脳内の処理を文字化する

http://qiita.com/items/9935ce476a17d6258e27
を見て理解できる人はそれで良いし、それと違う事書かないです。

__基本は「だれに、どう呼び出されているか？」を見ます。__

# コンストラクタ
newで呼んでいるか見て、newされていたらオブジェクト扱い。その時点で一般的な関数として扱わない頭の切り換えが行われている（うまく表現できませんが、見た瞬間にthisの判断対象から外れています。直感的だからかもしれません）。

# どのオブジェクトに属しているか？を見る
これが基本。ここで言う「属している」の意味は
__xxx.func()で呼んでいるなら、「funcはxxxに属している」__
と考える。

```javascript
obj.func();  // これは属しているobjがfuncのthis。一番直感的

func(); //これはglobalをグローバルへの参照と考えた下記と同じだと脳内変換される
global.func();  //つまり属しているのはglobalオブジェクト（ブラウザならwindow）だからfuncのthisはグローバル。

// 混乱する人が多いらしい下記は、オブジェクトに属していない無垢な関数が返る
function test(){
  return function(){
    // この関数はこの時点でどのオブジェクトにも属していない。
  };
}

var func = test();
// 「だれに、どう呼び出されているか」を見る。
func(); //これが属しているのはglobalオブジェクトなのでfuncのthisはグローバル

obj.func = func;
obj.func(); //これは属しているobjがfuncのthis。
```

# apply、callで呼ばれているかを見る

これらはthisを「強制」する仕組みだと考える。

```javascript
 //thisをobjにして強制呼び出し
func.apply(obj, args);
func.call(obj)
```

globalのオブジェクトをイメージできるようになるとルールが整理されてスッキリするというのが個人的な感覚でした。
JavaScriptでのObejctの作成方法おさらい


知らないことが多くて悲しくなってきた

```js:define_object
// オブジェクトを作成する方法
var newObject = {};

var newObject = new Object();

// オブジェクトにキーを割り当てる方法
// ドット構文
newObject.someKey = "Hello World";

// 角括弧構文
newObject["someKey"] = "Hello World";


// ES5に準拠した書き方(まだサポートしていないブラウザも)
// data propertyの定義
Object.defineProperty( newObject, "someKey", {
	value: "hoge hoge",
	writable: true,
	enumerable: true,
	configurable: true
});


// writable : false で書き換え不可
// emutable : false でfor in ループ中に値が現れない
// configuable : false でdelete不可、value以外の属性変更不可


// 簡略化
var defineProp = function(obj, key, value){
	config.value = value;
	Object.defineProperty(obj, key, config);
}

// 使うには
var person = Object.create(null);

// プロパティーでオブジェクトを追加
defineProp(person, "car", "Delorean");
defineProp(person, "dateOfBirth", "1981");

// definePropertiesを使えば複数登録も可能
Object.defineProperties(newObject, {
	someKey: {
		value: "hoge",
		writable: true
	},
	anotherKey: {
		value: "piyo",
		writable: true
	}
});

// 継承できる
var driver = Object.create(person);

defineProp(driver, "topSpeed", "100mph");

console.log(driver.dateOfBirth); // 1981

```
Railsで簡単にパラメータを受け取る方法


##Controller 修正
Controller の元ページにパラメータを受け取るための記述をする

```project.controller.rb
def index
	@projects = Project .order(params[:sort])
...
end
```

##View 修正	
以下のリンクを追加してパラメータを渡す。
（リンクでなくても良い）

```index.html.erb
<%= link_to "Name", sort: "name" %>
<%= link_to "Price", sort: "price" %>
<%= link_to "Created", sort: "created_at" %>
…
```

ここまで終わったらブラウザで確認する。

> $ bundle exec rails server


以上でroutes.rbをいじったり、特にメソッドを追加することなくパラメータを渡すことができるようになる。

##参考
・[Rails3 のビューでテーブルの題名クリックするとソートするメモ](http://d.hatena.ne.jp/CortYuming/20130317/p1)
HerokuでDeviseのメール通知を利用するまでの手順


HerokuでRails3.2.2、Devise2.1.2を使った時に、パスワード忘れた時にメール送信が必要だったので、その時のメモ。

まずherokuにはSMTPサービスが無いので、外部サービスを使う。
今回使ったのはこれ。月に200回まで送信無料。他にもGmailもできて、月500通いけるらしいのですが、そんなに使わないので、こっちを試しました。
[heroku add-on SendGrid](https://addons.heroku.com/sendgrid)


## サービス登録
まずは[SendGrid](http://sendgrid.com/)に登録します。
まずFreeでSign upします。なんかいろいろ入力して登録します。
するとメールが届くので、Active Your Accountから登録画面に移動します。
AccoutSettingとProfileSettingをいじいじすれば、利用できるようになります。


## Railsアプリの設定
設定するところは２つ。
1.`environment.rb`に下記を追記。SMTPサーバについての記述。

```config/environment.rb
ActionMailer::Base.smtp_settings = {
  :address        => 'smtp.sendgrid.net',
  :port           => '587',
  :authentication => :plain,
  :user_name      => ENV['SENDGRID_USERNAME'],
  :password       => ENV['SENDGRID_PASSWORD'],
  :domain         => 'heroku.com',
  :enable_starttls_auto => true
}
```

2.`config/environments/production.rb`のconfigureのブロック内に、下記を追記。メールでサーバーが自身のアプリのURLを作成するとき、下記のホスト名を利用してアドレスを作成します。

```config/environments/production.rb
config.action_mailer.default_url_options = { :host => 'herokuアプリのホスト名' }
```

あとはデプロイしましょう。
deviseのログイン画面で`Forgot your password?`からメールを入力して送信すると、`please-change-me-at-config-initializers-devise@example.com`からメールが来ます。
アドレスをちゃんとしたい奴に変えたい場合は、自分で調べてくださいなー
気分が向いたら自分も変えます。
webapi.vim の、webapi#json#encode での真偽値の扱い

Vimscrpit にはBoolean型がないが、JSONではBooleanを扱えるのでその変換をどうするか。

webapi#json#encode に渡す辞書に、webapi#json 内でnull, true, falseを扱うための関数の参照を突っ込んでおくと、適宜null, true, falseに置き換えられたJSON文字列を生成してくれる。

<pre>
:let json = webapi#json#encode({'flag':function('webapi#json#true')})
:echo json #=> {"flag":true}
</pre>

webapi.vim のjson.vimを読めば分かるけど、備忘録として。

[2013-05-28 23:55]
AngularJS&&Gruntで開発時はminifyに注意

AngularJS初心者で動かなくて焦ったのでメモ。

Yeoman + AngularJS とかで開発すると、$Grunt build とかでソースをminify（圧縮）する機会があると思うのですが、localhost上で動くのに、minify後に動かなくなったらAngularJSの書き方を疑うと幸せになれそうです。

詳しくは[こちら](http://qiita.com/items/363f430d21ec729f1b7d)のQiita内記事がものすごく参考になりました！
パターン1の書き方だったものを、パターン2になおしたところ、minify後も無事動くようになりました。
本当に助かりました、ありがとうございました！！

特別な解決策とかは無いのですが、minifyが原因でAngularJSが動かなくなっているという事象を把握するまでにだいぶかかってしまいましたので、自戒まで。

以下トラブルケース
- - -
（自分の場合）
Yeoman入れてbower経由でAngularJSも導入
↓
AngularJSのcontrollerで仮にローカルに置いたJSONファイルを読み込みこませる
（単純に相対パスで ./test.json とかで呼んだだけ）
↓
$grunt server
やったーうごいたぞー(localhost:9000)
↓
$grunt build
アプリルート/dist にminifyされたjsとかcssとか出てくる。
↓
/dist/index.html を閲覧して動作確認
ちゃんと間違いなくローカルに置いたはずのJSONを読み取ってくれない...。
（unknown provider がどうのこうのというjsのエラーがでている）
↓
なまじJSONファイルが噛んでいたのでapplication/jsonの設定とか色々疑った挙句、上記解決策に辿りつき事無きを得た（イマココ）
参考記事のパターン1の書き方からパターン2に修正

あとついでに変数が2つ以上のときはこうする様子

```html:HTML(引用)
<div ng-app="myApp">
  <div ng-controller="HogeCtrl">（略）</div>
</div>
```

```javascript
var myApp = angular.module('myApp', []);
myApp.controller('HogeCtrl', ['$scope', '$http', function($scope, $http) {
  //略
}]);
```

- - -

とりあえずAngularJSをGruntでminifyして訳が分からなくて泣いてる似たような初心者の人が助かると嬉しいなーと思いました！

（Qiita登録したばっかりなので使い方分かってなくてブログっぽくなったけどこれでいいのだろうか）
（おこられたら消したりなおしたりします）
ゆるふわ GitLab インストール

1. BitNami から[GitLabのインストーラ](http://bitnami.com/stack/gitlab)をダウンロードします
2. インストーラに実行権限をつけます
3. 実行します

Ubuntu 12.04 と、CentOS 6.3 で成功しました。MySQL とか httpd とかどっさり入ってくるので、まっさらな OS に入れたほうがいいです。

なお、インストール後はすぐ起動するのですが、OS を再起動したりした後は同梱のコマンドで操作するようです。使い方は以下のコマンドを打ってみて確認してください。

```
sudo /opt/gitlab-5.2.0-0/ctlscript.sh status
```
[覚書] 残像


ゲーム制作しつつC++の勉強中
VisualStudio2010を使ってるけどほんともうやだ

残像処理がそれなりに綺麗にかけたのでメモ
dequeにはtupleを入れるほうがいいんだろうか…

自分のゲームのソースから抜き出してるのでところどころ変なところがあるかもしれません。

```cpp
class Hoge{
public:
	void Move();
	void Draw();
private:
	///残像描画関数
	void _spectrum_draw(const b2Vec2 v, const float r, const float ex );
	///関数を入れていく
	std::deque< std::function< void() > > _spectrum;
};

int Hoge::Move(){
	//座標情報
	const b2Vec2 v = GetPosition(); //<自身の座標を取得
	//角度
	const float  r = GetRadian();   //<自身の角度を...
	//拡大率
	const float  ex = 2.2f;         //<描画したいサイズを...
	//キューのサイズを決めている
	const int max = 10;
	//キューが10を超えたら削る
	if( _spectrum.size() > max )
		_spectrum.pop_back();
	//残像を引数束縛してキューへ
	_spectrum.push_front( std::bind( &Hoge::_spectrum_draw, this , v,r,ex) );
	return 0;
}

void Hoge::Draw(){
	//残像描画（AlphaBlendとかいれるといい)
 	BOOST_FOREACH( auto f, _spectrum ){f();}
	//このあとに普通の描画とか…
	return 0;
}

Hoge::_spectrum_draw( const b2Vec2 v, const float r, const float ex ){
	//自身を描画する
	draw(v,ex,r);
}

```

---


##追記
コメントで

>std::dequeの代わりにboost::circular_bufferを使っても良いかもしれませんね。

と教わったため、変更。
dequeから削除するための処理がなくなって綺麗になりました。
ありがとうございます。

```cpp:
class Hoge{
public:
        Hoge(): _spectrum(10){}
	void Move();
	void Draw();
private:
	///残像描画関数
	void _spectrum_draw(const b2Vec2 v, const float r, const float ex );
	///関数を入れていく
	boost::circular_buffer< std::function< void() > > _spectrum;
};

int Hoge::Move(){
	//座標情報
	const b2Vec2 v = GetPosition(); //<自身の座標を取得
	//角度
	const float  r = GetRadian();   //<自身の角度を...
	//拡大率
	const float  ex = 2.2f;         //<描画したいサイズを...
	//残像を引数束縛してキューへ
	_spectrum.push_back( std::bind( &Hoge::_spectrum_draw, this , v,r,ex) );
	return 0;
}

void Hoge::Draw(){
	//残像描画（AlphaBlendとかいれるといい)
 	BOOST_FOREACH( auto f, _spectrum ){f();}
	//このあとに普通の描画とか…
	return 0;
}

Hoge::_spectrum_draw( const b2Vec2 v, const float r, const float ex ){
	//自身を描画する
	draw(v,ex,r);
}
nginxでproxy_cache_pathに指定するkey_zoneのサイズはどのくらいにすれば良いのか

nginxでproxy_cache_pathにしているkey_zoneのサイズはどのくらいにすれば良いのか。

nginxでプロキシキャッシュを使う場合はnginx_cache_pathにパスや容量などを指定する事になる。

```nginx
proxy_cache_path /var/lib/nginx/cache levels=1:2 keys_zone=CACHE:512m inactive=1d  max_size=60g;
```

このときkeys_zoneには共有メモリの名前と容量を指定するのだが、この容量は結局の所幾らにすればよいのか。引用すると次のようになるらしい。

> Zone size should be set proportional to number of pages to cache. The size of the metadata for one page (file) depends on the OS; currently it is 64 bytes for FreeBSD/i386, and 128 bytes for FreeBSD/amd64.
> -- [HttpProxyModule](http://wiki.nginx.org/HttpProxyModule#proxy_cache_path)

つまり64bitのFreeBSD環境の場合、キャッシュするオブジェクト1つにつき、128バイト消費される事になる。
なので、上の例のように60GBキャッシュするときは、1つのファイルが100KBであると仮定すると、

```
(60[GB]*1024*1024*1024) / (100*1024) * 128[B] /1024/1024 = 76.8 [MB]
```
となる。なので、76.8MB以上を指定しておけばいいということになる。
unique idの生成

一行で書けた。暗号みたいだが。

```coffeescript
uniqueId = ((i) -> -> i++)(0)

console.log uniqueId()
console.log uniqueId()
console.log uniqueId()
console.log uniqueId()
console.log uniqueId()
```

もちろん、TypeScriptでも可。

```javascript:typescript
var uniqueId = (i => () => i++)(0);
```
クソ実装した人を殴りたい？ならばこれ！PHPのsecret-blame拡張でいつでもお手軽blame!

PHP用の拡張、secret_blameは

```text
 　　　　 　＿＿＿＿＿＿
　　　 ／　　　　　　　　　 ）））
　　　/　　　／// /―――-ミ
　　 / 彡彡　// /　　　　　 ヽ)）
　　 / 彡彡　iiiiiiiiiiiiiii　　iiiiiiiiii|
　　 / 彡彡　＜　･ >　、<･ >l
　　/ 　　　|　 　　　　　ヽ　　 〉
　　/ 　（ | |　 　　 　＿＿)　 |　　　 ／￣￣￣￣￣￣￣￣￣
　　/ 　 | ≡ 　／, ―――　 |ゝ　＜　この　クソ実装したのは誰じゃ！
　 /　　 |　　　|　 L ＿＿_」　l ヾ　　＼＿＿＿＿＿＿＿＿＿
＿ミ　　ｌ　　　＿＿＿＿＿_ﾉ　ゞ＿
　 |　　l　ヾ　　　　ー　 　／ |　　ｌ
　 |　　| 　 ＼ｰ　　　 ‐／　　|　　| 
```

というあなたのための拡張です。
https://github.com/willhf/secret_blame
から入手できます。

試しに、下記のようなスクリプトを実行すると、

```php
<?php

class SuperUtil
{
    public static function doMagic()
    {  
        fopen('/magicians_note', 'r');
    }
}

SuperUtil::doMagic();
```

<pre>
 PHP Warning:  Guilty: sasezaki: fopen(/magicians_note): failed to open stream: No such file or directory in /home/sasezaki/var/www/sample.php on line 7
</pre>

と誰が実装したのか分かります。
こんな拡張、チームメンバの開発環境に入れてもらえない？大丈夫！secret_blameはphpinfo()やphp -m では表示されません。こっそり入れられます。あと、たまたまですがxdebugと同時には動かせません（なので試す方はxdebugを一度オフに）。なので本番環境でこけたときにより表示する機会が増えるということですね！燃え上がりたい方におすすめ！


……というネタを通してPHP拡張の仕組みを学べるのがsecret_blameです。（上記リポジトリにスライドが付属）
Chefでopscode-cookbooksのselinuxレシピを使う

opscodeのpublic cookbooksを使ってselinuxを無効化するサンプルです。

このサンプルでは、chef-soloを使ってローカルホストに対してレシピを実行します。
レシピ管理にはBerkshelfを使い、serverspecでテストします。

## 使用するレシピ
Opscode Cookbook selinux
https://github.com/opscode-cookbooks/selinux

## レシピのダウンロード
```ruby:Berksfile
site :opscode
cookbook 'selinux'
```

```
bundle exec berks install --path vendor/cookbooks
```

## レシピを読む
```ruby:vendor/cookbooks/selinux/recipes/disabled.rb

# setenforce 0で一時的にSELinuxを無効化し、
# /etc/selinux/configの作成を通知する
# selinuxenabledコマンドの終了ステータスが0(selinuxが有効)の場合だけ実行される
execute "disable selinux enforcement" do
  only_if "which selinuxenabled && selinuxenabled"
  command "setenforce 0"
  action :run
  notifies :create, "template[/etc/selinux/config]"
end

# 再起動の際もSELinuxの無効状態を維持するために、
# /etc/selinux/configに、設定を記述する
template "/etc/selinux/config" do
  source "sysconfig/selinux.erb"
  variables(
    :selinux => "disabled",
    :selinuxtype => "targeted"
  )
  action :nothing
end
```

## レシピの実行
```js:nodes/localhost.json
{
    "run_list":[
        "recipe[selinux::disabled]"
    ]
}
```

```
sudo bundle exec chef-solo -c solo.rb -j nodes/localhost.json
```

## serverspecでテスト
```ruby:spec/localhost/selinux_disabled_spec.rb
require 'spec_helper'

describe selinux do
  it { should be_disabled }
end

describe file('/etc/selinux/config') do
  it { should be_file }
  it { should contain "SELINUX=disabled" }
end
```

```
bundle exec rake spec
```

```
SELinux
  should be disabled

File "/etc/selinux/config"
  should be file
  should contain "SELINUX=disabled"

Finished in 0.19807 seconds
3 examples, 0 failures
```
アプリ内でブロードキャストする場合は LocalBroadcastManager を使うと良いらしい


サポートパッケージに``LocalBroadcastManager`` というクラスがあるのを今頃知りまして。

* [LocalBroadcastManager | Android Developers](http://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html)

ブロードキャストは使い方を誤るとデータを(アプリの)外部に流出させる可能性があるわけですが([Android アプリのセキュア設計・セキュアコーディングガイド](http://www.jssec.org/report/securecoding.html) 参照)、このクラスを使うと「他のアプリにデータを漏らさない」「意図しないブロードキャストを受信しない」「効率がよい」だそうです。

## いつ使うんですか？

たとえば GPS を使うアプリで、GPS の受信は ``IntentService`` にやらせて、受信した位置を地図に表示するために、IntentService からブロードキャスト投げて、``Activity`` に仕掛けたレシーバで受信する、なんてケースでしょうか。(いやそれは IntentService じゃなくて普通のサービスで aidl 使ってやれよ、とかいろいろあるわけですが。ん？PendingIntent でサービスを起動する方法だと、クライアントから bind するタイミングが無いからダメかな？)

## 使い方

stackoverflow に良い使い方が載ってました

* [android - how to use LocalBroadcastManager? - Stack Overflow](http://stackoverflow.com/a/8875292)

## 使ってみた

状態認識の結果も秘匿情報でしょう、ということで[以前](http://amay077.github.io/blog/2013/05/18/getting-started-activity-recognition/)作った ``ActivityRecognitionClient`` のサンプルを修正してみました。

* [amay077/androidactivityrecognizingsample · GitHub](https://github.com/amay077/androidactivityrecognizingsample/commit/a041b300d3e9fdfe6227c05c3f21fb1e3876bbad)

## まとめ

* ブロードキャストする時は、まず LocalBroadcastManager を使ってみよう。
* stackoverflow の回答へのダイレクトリンクとか、github の changeset へのダイレクトリンク便利すぎる！
Antのプロパティの指定方法（タスク、プロパティファイル、コマンドライン引数）

Antでのプロパティの指定方法とその優先順位について。

1. プロパティタスクで`<property name="xxx" value="yyy" />`と書く
2. プロパティタスクで`<property file="xxx.properties" />`と書き、プロパティファイルに`name=value`の形式で書く
3. 実行時のコマンドライン引数で指定する

```xml:build.xml
<?xml version="1.0"?>
<project name="SimpleAnt" default="compile">
	<property file="file.properties" />
	<property name="msg" value="Hello world" />
    <target name="compile">
        <echo>${msg}</echo>
    </target>
    <target name="test" depends="compile">
        <echo>testだけど表示するだけで何もしない</echo>
    </target>
</project>
```

file.propertiesがないとき

```bash
> ant compile

compile:
     [echo] hello world
```

file.propertiesを以下の内容で作成したとき

```text:file.properties
msg=hello from properties file
```

プロパティファイルが先に読まれるので、ファイルの内容が反映される

```bash
> ant compile

compile:
     [echo] hello from properties file
```

コマンドライン引数で指定したとき、一番最初に評価されるので、引数の内容が反映される

```bash
> ant compile -Dmsg="hello from argument"

compile:
     [echo] hello from argument
```
RubyMotion rakeで起動したiPhone SimulatorでUIWebViewをCommand+クリックしたつもりがUIWebBrowserView

RubyMotionで開発しているときiPhone(iPad) Simulator上をCommand＋クリックするとコンソールのREPLにクリックしたViewクラスがselfになってインスタンスの状態を見たいときに便利ですね。

ところがUIWebViewを表示してるときにクリックするとUIWebBrowserViewクラスのインスタンスがselfになってしまう。

```ruby
self
=> #<UIWebBrowserView:0xa8f0e00>
self.delegate
=> nil
```

delegateしているUIViewControllerのサブクラスにアクセスしたい（・ω・）

AppDelegateから辿るという手もありますが構成によっては遠いのでめんどくさい。

self.methodsをチェックしていくと`mpAncestorViewController`というのを発見。
アクセスしてみると…

```ruby
self.mpAncestorViewController
=> #<WebViewController:0x7d90030>
```

(σ・∀・)σｹﾞｯﾂ!!
RubyのSTDIN.getsとMySQL2ではまってた話。



```ruby
server_address = STDIN.gets
user_name = STDIN.gets
#hogehoge
client = Mysql2::Client.new(:host => "#{server_address.chomp}", :username => "#{user_name.chomp}", :password => "#{user_password.chomp}" , :database => "#{database_name.chomp}")
````

最後のchompがないと　STDIN.getsで\nも入力されて死ぬ。
Chef で aws の t1.micro に swap を作るレシピ

t1.micro はスワップファイルがないので最初に作りましょう。
これなしで chef 流してるとメモリのエラーが出たりすることあります。

```ruby
bash 'create swapfile' do
  user 'root'
  code <<-EOC
    dd if=/dev/zero of=/swap.img bs=1M count=2048 &&
    chmod 600 /swap.img
    mkswap /swap.img
  EOC
  only_if { not node[:ec2].nil? and node[:ec2][:instance_type] == 't1.micro' }
  only_if "test ! -f /swap.img -a `cat /proc/swaps | wc -l` -eq 1"
end

mount '/dev/null' do # swap file entry for fstab
  action :enable # cannot mount; only add to fstab
  device '/swap.img'
  fstype 'swap'
end

bash 'activate swap' do
  code 'swapon -ae'
  only_if "test `cat /proc/swaps | wc -l` -eq 1"
end
```
リプ爆撃

コードを見れば、わかる人はわかると思うので、何やってるかは聞かないでください。
中二みたいなことやってごめんなさい。正直反省してない。

```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tweepy
import re
import time

KEYFILE='keys'
TARGET='@???' # 爆撃相手

def getAuth():
    keys={}
    for l in open(KEYFILE):
        ll=re.sub('#.*','',l)
        a=ll.split(':')
        if len(a)>=2:
            keys[a[0].strip().lower()]=a[1].strip()
    auth=tweepy.OAuthHandler(keys['consumer_key'],keys['consumer_secret'])
    auth.set_access_token(keys['access_token'],keys['access_token_secret'])
    return auth

def tweet(api,x):
    api.update_status(TARGET+' '+x)

def tweetmain(api):
    for _ in xrange(1):
        for i in xrange(20):
            s=' '*i+u'⊂二二二（ ＾ω＾）二⊃'+(u'ﾌﾞｰﾝ' if i==0 else '')
            print s
            tweet(api,s)
            time.sleep(2)
        for i in xrange(20,0,-1):
            s=' '*i+u'⊂二（ ＾ω＾）二二二⊃'+(u'ﾌﾞｰﾝ' if i==20 else '')
            print s
            tweet(api,s)
            time.sleep(2)

def main():
    auth=getAuth()
    api=tweepy.API(auth)
    tweetmain(api)

if __name__=='__main__':
    main()
```
ActionBarの設定変更をするとメニューが表示されなくなる

## イマイチよく分かってないんだけど・・・

ActionBarをController上でカスタマイズ（変更）してしまうと、ViewXMLとTSSで定義されたActionBar上のメニューが表示されない・・・っぽい。

```xml
<Alloy>
	<Window id="window">
		<Menu platform="android">
			<MenuItem id="menu1" />
			<MenuItem id="menu2" />
		</Menu>
		<Label text="hogehgoe" />
	</Window>
</Alloy>
```

```js:JSON
"#window": {
	backgroundColor: '#ccc',
	fullscreen: false
},
"MenuItem": {
	showAsAction: Ti.Android.SHOW_AS_ACTION_IF_ROOM,
},
'#menu1': {
	icon: Ti.Android.R.drawable.ic_menu_send,
	title: 'About'
},
'#menu2': {
	icon: Ti.Android.R.drawable.ic_menu_send,
	title: 'Settings'
},
```

この状態で、何もしなければちゃんとActionBarとメニューは表示される。
でも以下のControllerのようにイジってしまうと、メニューが表示されなくなる。

```javascript
$.window.addEventListener('open', function() {
	var actionBar = $.window.activity.actionBar;
	actionBar.title = 'My App';
	actionBar.displayHomeAsUp = true;
	actionBar.onHomeIconItemSelected = function() {
	 	Ti.API.info("Home icon clicked!");
	};
});
```

## 色々試してみての現時点での結論

ViewXMLとTSSでActionBar上のメニューを実装するのを諦めた。Controller上でコードによる実装を行えば、ActionBarの設定変更とメニューの表示が両立できる。

```javascript
// ViewXMLとTSSからメニューに関する記述を全部消した上で・・・
$.window.activity.onCreateOptionsMenu = function(e) { 
	var menu = e.menu; 
	var menuItem1 = menu.add({ 
		title : "Compose", 
		icon : Ti.Android.R.drawable.ic_menu_send,
		showAsAction : Ti.Android.SHOW_AS_ACTION_IF_ROOM 
	}); 
	menuItem1.addEventListener("click", function(e) { 
		Ti.API.info("Action Item1 Clicked!"); 
	}); 
	var menuItem2 = menu.add({ 
		title : "Update", 
		icon : Ti.Android.R.drawable.ic_menu_send,
		showAsAction : Ti.Android.SHOW_AS_ACTION_IF_ROOM 
	}); 
	menuItem2.addEventListener("click", function(e) { 
		Ti.API.info("Action Item2 Clicked!"); 
	}); 
	
	$.window.activity.actionBar.displayHomeAsUp = true;
	$.window.activity.actionBar.title = 'My App';
};
```

これならOKだった。よく分からん。

参考：http://developer.appcelerator.com/question/148137/menu-items-are-not-displayed-initially-in-an-action-bar-if-you-have-other-logic-with-action-bar
Facebookのアカウントロック条件調べてみた

Facebookのアカウントロック間際に良くなる人が身近にいたので条件を調べてみた

-----

* [facebookのアカウントロックについてのまとめ](http://facebook.bex.jp/1209)

>・facebook側が本人ではないと判断した場合
>・普段とは違う所や端末でFacebookを確認した場合
>・1日にたくさん友達申請している場合
>・著作権や軽く犯罪にひっかかりそうな投稿をした場合
>・利用違反として報告された場合
>・URLをつけた投稿を短時間で複数回投稿した場合
>・facebookからの忠告を無視して同じ行動を行った場合
>・お店の名前や偽名を使ってアカウントを作成していた場合

* なんで？！Facebookアカウント停止理由と対処法

>(1)Facebookから警告(複数回を含む)を受けたにもかかわらず、禁止されている行為が続いた場合
>(2)嫌がらせ、広告、宣伝、出会い、その他の不適切な行為を目的として、他のユーザーに一方的に接触した場合
>(3)虚偽の名前を使用した場合
>(4)人物や団体などになりすました場合
>(5)Facebook利用規約に違反するコンテンツを投稿した場合(これには、猥せつまたは性的に露骨な写真や、過度に暴力的な写真が含まれます。個人やグループを脅す、怖がらせる、嫌がらせをする、不要な注意を引きつける、または辱めるようなコンテンツ、写真、記述も削除されます)