OmniAICreator/Qiita-1.07M huggingface dataset:
Sencha Touch のスクロールインジケーターをコントロールする

## スクロールインジケーターが自動的に非表示になるのをコントロールする

Sencha Touch にはスクローラーがあり、すべてのプラットフォーム上で同じように動作します。
X軸にもY軸にもつけられますが、デフォルトでは非表示になっています。
スクロールインジケータを常に表示したい場合には、Sencha Touch 2.3.0 以降であれば、
autoHide コンフィグを設定する事でコントロールできます。
`Ext.Containar` クラスの `scrollable` コンフィグの中の `indicators` コンフィグに、x/y それぞれの `autoHide` コンフィグをセットします。

            scrollable : {
                direction  : 'both',
                indicators : {
                    y : {
                        autoHide : false
                    }
                }
            }


* [この記事の元ネタはこちらTips](http://goo.gl/HBXT6T)
* [Sencha Fiddle で実験してみる](https://fiddle.sencha.com/#fiddle/1u9)
initializeクラスメソッドの記述例


initializeクラスメソッドは、クラスを初めて使用するときに呼ばれる。
ただし、継承しているとサブクラスから呼ばれることもあるので、2回呼ばれてもいいようにしておく。

```objectivec:initializeサンプル
+ (void) initialize
{
	static BOOL bInitialized = NO;
	if (bInitialized) {
		return;
	}
	// do anything.
	bInitialized = YES;
}
```
OpenSSL脆弱性対応後に発生する問題

## Problem

```
yum update openssl
```

をした後に

```
crond[17982]: PAM unable to dlopen(/lib64/security/pam_access.so): /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /lib64/libnsl.so.1)
```
や

```
crond[30767]: (root) FAILED to authorize user with PAM (Module is unknown)
```
のようなログが残る事があります。

## Solution
/etc/init.d/crond restart

## Note
openssl version ではなく、yum list installed | grep openssl でバージョンを確認しないと誤解を招きそうです。
Git 歴史改変奥義

Git のバージョン 1.9.1 で確かめていますが 1.7.12 より新しいなら大丈夫だと思います (根拠: https://raw.github.com/git/git/master/Documentation/RelNotes/1.7.12.txt )．

Git は `git rebase` で世界線を弄って歴史改変が出来ることで有名ですが (個人の感想です)，Initial commit の CommitDate だけは，どうにもしがたいですよね．

そこで環境変数の指定で無理矢理 `--committer-date-is-author-date` 相当のことを実現する方法です．

```bash
git rebase -i --root
```

まずこれで interactive mode の rebase を始めて，Initial commit を `e` (もしくは `edit`) にします．

すると「さぁ `git add` なり何なりして `git rebase --continue` して下さいね〜」状態になりますね．ここで

```bash
GIT_COMMITTER_DATE='Thu Apr 10 03:21:56 2014 +0900' git commit --amend
```

としてやります．指定する時間は予め元の Initial commit を見て調べておきましょう．そして `git rebase --continue` すれば無事 Initial commit を書き換えたのにハッシュが変わっただけで時刻は CommitDate も AuthorDate も変わっていないという状態になります．

そして仕上げに

```
git rebase <Initial commit のハッシュ値とか master^^^^^... とか指定する> --committer-date-is-author-date
```

すれば，なんと，ミス修正の痕跡 (CommitDate と AuthorDate のズレ) を一切残さずに修正が完了します．

だから何やねんて言われたら困るんですけど，`git push` をする前なら自分は一度もミスしてないんだぜ凄いだろと言い張ることが出来ます．

その昔は `git rebase` では Initial commit だけは操作することが出来なかったので，空の `.gitignore` を作成しただけの Initial commit を作っておくとかいう姑息なことを自分はやってました．全ては綺麗な歴史のためです．しかし今はもう `--root` オプションがあるため不要です．Initial commit のミスですらミスしてなかった風に修正することが出来ます．

だから何やねん．

## 補足のような何か

`--root` オプションは参考リンク見て貰っても分かる通り引数 (コミット，例えば `master` とかハッシュ値とか) が取れます．引数があれば Initial commit からそこまでを書き換える…という動作をします (何のために使うのかよく分からん)．

## 参考

* http://stackoverflow.com/questions/2246208/change-first-commit-of-project-with-git
* https://raw.github.com/git/git/master/Documentation/RelNotes/1.7.12.txt
* http://qiita.com/dataich/items/35148bd8bd6a5b707282
CoffeeScript関連ツール


## Webサイト

- js2coffee

http://js2coffee.org/

## npmパッケージ

- coffee-script
- js2coffee

## SublimeTextプラグイン

- Better CoffeeScript

## Chromeアプリ

- amCoffee

chromeのコンソールでCoffeeScriptを実行できる

https://chrome.google.com/webstore/detail/amcoffee/eohnbihebhopoapemdbbodaiaagpogik?utm_source=chrome-ntp-icon
Perl + Viralheatのサンプル

ViralheatのSentiment Analysis APIを使ってセンチメント分析（感情分析）を行う簡単なPerlスクリプトのサンプルを書きました。

"YOUR API KEY HERE"にViralheatのSentiment Analysis APIのAPIキーを入れてください。

Perlモジュールは

JSON

URI::Escape

LWP::Simple

を使っています。

＊JSONモジュールはJSON::XSでも大丈夫です。

標準入力から分析したい文章を入れてください。

他にsleepが必要ですが、Viralheatに問い合わせてセンチメント分析をするためのサンプルです。

```pl

use JSON;
use URI::Escape;
use LWP::Simple;

my $apikey="YOUR API KEY HERE";

my $input = <>; #標準入力からのテキスト (英語のみ入力してください。)

my $text = uri_escape($input);#標準入力からのテキストをURI エスケープする

my $url = "http://www.viralheat.com/api/sentiment/review.json?text=$text&api_key=$apikey";#ViralheatのSentiment Analysis JSON APIのURL

my $content = get $url;
die "Couldn't get $url" unless defined $content; #エラー処理

$results = decode_json($content);  #JSONをデコード

chomp($results->{text});#chompする
print "======\n";
print $results->{text}, "	", $results->{prob} , "	", $results->{mood}, "\n"; #出力する

```

入力した文章、確率、ムード（positiveかnegative)が出力されます。

このスクリプトを少し改造すればファイルから一行ずつ感情分析ができるようになります。

Twitterなどの感情分析頑張ってみてください。

重要：ViralheatのSentiment Analysis APIは英語の文章でないと分析できないので注意してください。
__new__と__init__とメタクラスと

(2016/10/04追記) 以下はPython3.5で確認。Python2.xではsuperを引数なしで呼べないためそのままでは実行できず、かつ実行結果も同等のものになるかは不明。

## `__new__`と`__init__`

Pythonでは、`__new__`メソッド、`__init__`メソッドの2つのメソッドを実装したクラスを生成することで、そのクラスのインスタンス作成時に行う処理を定義することができる。

```python3:__new__と__init__
class A(object):
    def __new__(cls):
        print('new')
        return super().__new__(cls)

    def __init__(self):
        print('init')
        super().__init__()

>>> A()
new
init
<__main__.A object at 0x10da40050>
```

上記の例を見るに、`__new__`と`__init__`はどちらもインスタンス生成時に呼ばれるため、初期化処理などはどちらに書いてもよいように思える。
では、この2つのメソッドの違いは何か?

実はインスタンス生成時に「必ず」呼ばれる`__new__`と違い、`__init__`はクラスの実装次第では呼ばれないことがある。
呼ばれない例を以下に示す。

```python3:__init__がインスタンス生成時に呼ばれない例
# 1. __new__でインスタンスをreturnしない場合
# ref. https://docs.python.org/2/reference/datamodel.html#object.__new__
class A(object):
    def __new__(cls):
        print('new')
        # return super().__new__(cls)

    def __init__(self):
        print('init')
        super().__init__()

>>> A()
new # __new__は呼ばれ、__init__は呼ばれない

# 2. サブクラスで親クラスの__init__を明示的に呼び出さない場合
class B(A):
    pass
...
>>> B()
new # クラスAの__new__は呼ばれ、__init__は呼ばれない
```

特に2のケースは、クラスが継承して使用することを想定している場合に発生しうる。その場合は、`__init__`ではなく、`__new__`で必要な初期化処理を行うべき。

### 追記(2014/04/13)

コメントで指摘されたとおり、1のケースは実用的には起こりえない。
`__new__`は引数として与えたクラスのインスタンスをreturnするべきであり、そうしていないインスタンスは使いものにならないからだ。

(ref) https://docs.python.org/2/reference/datamodel.html#object.__new__

## メタクラス

インスタンス生成時に行う処理を追加できる`__init__`, `__new__`に対し、メタクラスを使うことでクラス定義時(=クラスを表すオブジェクトの生成時?)に行う処理を追加できる。

メタクラスを定義するには、typeクラスを継承したクラスを生成するのが一番簡単である。
継承したクラスで、クラスメソッド`__new__`(クラス名、親クラス、クラス属性を定義する辞書)を実装する。
(なお、この`__new__`は、インスタンス生成で呼ばれる`__new__`とは異なることに注意。
メタクラスの`__new__`はtypeクラスのメソッドを、インスタンス生成時の`__new__`はobjectクラスのメソッドを、それぞれオーバーライドしている)

```python3:メタクラスの定義
class MetaClass(type):
    def __new__(cls, cls_name, cls_bases, cls_dict):
        print('meta')
        return super().__new__(cls, cls_name, cls_bases, cls_dict)

```

メタクラスは以下のように指定する。Python2とPython3で指定の仕方が異なることに注意。

```python:メタクラスの指定

# メタクラスのクラス名はMetaClassとする。

# python2
class C(object):
    __metaclass__ = MetaClass
    ...

# python3
class D(object, metaclass=MetaClass):
    pass


# インタープリタで逐次実行すると
# クラス定義が完了した時点でメタクラスで定義した処理が実行されることが分かる。
>>> class D(object, metaclass=MetaClass):
...     pass
...
meta
```

以下の例では、クラス名(の表示)を変更するメタクラスを定義している。

```python3:クラス名を変更するメタクラス
class ChangeNameMeta(type):
    def __new__(cls, cls_name, cls_bases, cls_dict):
        return super().__new__(cls, 'change_name', cls_bases, cls_dict)

class E(object, metaclass=ChangeNameMeta):
    pass

# インタープリタでの実行結果
>>> print(E().__str__)
<method-wrapper '__str__' of change_name object at 0x10da45fd0>
```

上記の例は実用的ではないが、上手く使うといろいろ面白いことができそう。
(ref)
http://coreblog.org/ats/lerning-metaclass-by-reading-javascript-like-prototype-in-python/
http://momijiame.tumblr.com/post/50722263621/python
リソースを含むaneを組み込んだAIRアプリのビルド


## 症状

複数のaneを組み合わせてapkをビルドしようとしたところaaptのエラーでビルドに失敗する

```
アプリケーションのパッケージ化中にエラーが発生しました :


aapt tool failed:/private/var/folders/7d/4kjgk5650jx_kpnwz2s34gm00000gn/T/ff7da53a-b9e8-4c0c-a2e4-d57794574dbe/res/layout/com_facebook_placepickerfragment_list_row.xml:33: error: Error: No resource found that matches the given name (at 'layout_width' with value '@dimen/com_facebook_picker_place_image_size').
/private/var/folders/7d/4kjgk5650jx_kpnwz2s34gm00000gn/T/ff7da53a-b9e8-4c0c-a2e4-d57794574dbe/res/layout/com_facebook_placepickerfragment_list_row.xml:33: error: Error: No resource found that matches the given name (at 'layout_height' with value '@dimen/com_facebook_picker_place_image_size').
/private/var/folders/7d/4kjgk5650jx_kpnwz2s34gm00000gn/T/ff7da53a-b9e8-4c0c-a2e4-d57794574dbe/res/layout/com_facebook_search_bar_layout.xml:3: error: Error: No resource found that matches the given name (at 'background' with value '@color/com_facebook_picker_search_bar_background').
/private/var/folders/7d/4kjgk5650jx_kpnwz2s34gm00000gn/T/ff7da53a-b9e8-4c0c-a2e4-d57794574dbe/res/layout/com_facebook_search_bar_layout.xml:15: error: Error: No resource found that matches the given name (at 'textColorHint' with value '@color/com_facebook_picker_search_bar_text').
/private/var/folders/7d/4kjgk5650jx_kpnwz2s34gm00000gn/T/ff7da53a-b9e8-4c0c-a2e4-d57794574dbe/res/layout/com_facebook_search_bar_layout.xml:15: error: Error: No resource found that matches the given name (at 'background' with value '@color/com_facebook_picker_search_bar_background').

```

エラー内容を見るとリソースファイル周りでうまく行ってない模様
組み込むaneが1つだけだとビルドできるが複数組み込むとビルドできない

## やったこと

* AIR 13 SDKに変更 → ×
* AIRに同梱されているaaptを最新(Android SDKのbuild-tools 19.0.3)に置き換える → ×
* AIR 4.0から使えるようになった&lt;packagedResources&gt;を設定したaneを使う → ○

```:platform.xml
<platform xmlns="http://ns.adobe.com/air/extension/4.0">
	<packagedResources>
		<packagedResource>
			<packageName>com.example.ane</packageName>
			<folderName>res</folderName>
		</packagedResource>
	</packagedResources>
</platform>
```

参考: Including resources in your native extension package
http://help.adobe.com/en_US/air/extensions/WSf268776665d7970d-2e74ffb4130044f3619-7ff8.html

## 注意点

* ANEのAndroidプロジェクトは必ずライブラリプロジェクトにする. プロジェクトのProperties, Androidで"Is Library"をチェックする. (Rクラスのstatic変数の属性からfinalが削除されます)
* aneとapkを作る際にAIR SDK 4.0以上が必要
* adtでaneを作成する際は-platformoptionsオプションでplatform.xmlを指定しないといけない

## その他

AIR 4.0から&lt;packagedDependencies&gt;タグも使えるようになったのでaneを作る際にjarファイルを1つにまとめる作業をしなくて良くなった
QiitaはTwitterのツイートを埋め込める

Twitterの「ツイートをサイトに埋め込む」を利用するだけです。例えば次のようなHTMLが生成されます。

```html
<blockquote class="twitter-tweet" lang="ja"><p>QiitaってTwitterのツイートを埋め込む機能に対応していたんだ。プレビューだと上手く表示されないけど、実際にはきちんと表示されるらしい。これはいいね。（プレビューでもきちんと表示されればなおよいね）</p>&mdash; 吉村　優 (@_yyu_) <a href="https://twitter.com/_yyu_/statuses/453933629266087937">2014, 4月 9</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
```

@kimama1997 さんによると、`<script>`タグ部分は無視されるので必要ないということです。また、下記のコメントにてどうして引用がカードになるのか解説していただきました。ありがとうございます。

> [http://qiita.com/yyu/items/d7483b63f701ae1d1c50#comment-5ed99947370e052749f1](#comment-5ed99947370e052749f1)

これをQiitaに貼ると、Qiitaのプレビュー画面では次のようになります。

![スクリーンショット 2014-04-10 1.39.36.png](https://qiita-image-store.s3.amazonaws.com/0/10815/2b3e0413-e250-7599-9eec-37fa2e9cd1ee.png)

でも実際は、

<blockquote class="twitter-tweet" lang="ja"><p>QiitaってTwitterのツイートを埋め込む機能に対応していたんだ。プレビューだと上手く表示されないけど、実際にはきちんと表示されるらしい。これはいいね。（プレビューでもきちんと表示されればなおよいね）</p>&mdash; 吉村　優 (@_yyu_) <a href="https://twitter.com/_yyu_/statuses/453933629266087937">2014, 4月 9</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

という感じできちんと動いています。例えば会話も表示されます。

<blockquote class="twitter-tweet" lang="ja"><p><a href="https://twitter.com/_yyu_">@_yyu_</a> 次のプリキュアの放送まであと3日と6時間48分11秒だよ！楽しみだね！</p>&mdash; キュア人工無脳 (@cure_muno) <a href="https://twitter.com/cure_muno/statuses/453935829828657152">2014, 4月 9</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

これは便利！
（もしかして皆知っていた？）

さらに、@asahina_dev さんによると、コメントでもツイートを引用できるようです。試してみました。

> [http://qiita.com/yyu/items/d7483b63f701ae1d1c50#comment-c86824d0fb712ce10b22](#comment-c86824d0fb712ce10b22)

次のようになります。

![スクリーンショット 2014-04-10 14.40.52.png](https://qiita-image-store.s3.amazonaws.com/0/10815/accb8fc2-489a-8d72-4266-a8f93ea36a46.png)

とてもよいですね。
grepに-rオプションができたのはversion 2.3

まあどうでもよいことなんですが、

**grepに-rオプションができたのはversion 2.3です**

[grepのリリースノート](http://cvs.savannah.gnu.org/viewvc/grep/grep/ChangeLog?view=markup)に以下の記載があります。

> 1998-08-18  Paul Eggert
> 
> Add support for new -r or --recursive (or -d recurse or ...

CVSのリビジョンでいうと、1.4で導入されています。

[http://cvs.savannah.gnu.org/viewvc/grep/grep/src/grep.c?r1=1.3&r2=1.4](http://cvs.savannah.gnu.org/viewvc/grep/grep/src/grep.c?r1=1.3&r2=1.4)

ここでにcase 'r'というコードがあり、オプションが追加されているのがわかります。

**そもそもなぜこんなことを調べようと思ったのか**

とあるブログに「grepでディレクトリを再帰検索する方法」が紹介されていたのですが、
その方法がfindのxargなんかを使ってやるものでした。

「こんなの -r オプションで一発じゃないか」と思ったのですが、
そこで思い出したのが、以前昔古いUNIXを使っていた時に「-r」オプションがなかったことがあったのです。

そこで、grepのソースコードを調べていると、やっぱ最初から「-r」オプションがあるわけではないんですよね。


普段当たり前に使っているコマンドのソースとかChange Log見るのは結構楽しいもんです。
AWS Elastic BeanstalkへGitでデプロイする方法

#初回のみの作業

##ダウンロード

まずはAWS Elastic Beanstalk Command Line Tool（AWS-ElasticBeanstalk-CLI-2.6.0 .zip）を

http://aws.amazon.com/code/AWS-Elastic-Beanstalk/6752709412171743

からダウンロードする。
バージョンはこれとは違うかもしれないけどたぶん最新版がダウンロードされる。
ダウンロードが完了したら、解凍する。
解凍すると、中には

* AWSDevTools
* LICENSE.txt
* NOTICE.txt
* README.txt
* api
* eb

が入ってる。

##インストール

解凍したファイルをどこかのディレクトリに配置するだけ。
理由は分からないけど、~/.aws/というディレクトリを作ってそこに配置するのが一般的みたい。

##PATHを通す

```bash
vim ~/.bash_profile
```
を実行して~/.bash_profileを開く（無ければ作られる）。
そしてその中に、

```bash
export PATH=$PATH:~/.aws/AWS-ElasticBeanstalk-CLI-2.6.0/eb/macosx/python2.7/
```

と記述。
既に別の値が設定されている場合は:で右に繋げて書けば良い。
変更して保存したら、設定を反映させるために

```bash
source ~/.bash_profile
```

を実行。
任意のディレクトリで

```bash
eb --version
```

を実行して、

```bash
AWS Elastic Beanstalk Command Line Interface v2.6.0
```

のようにバージョン情報が表示されれば成功。


##GitからElasticBeanstalkを使えるようにする

.gitディレクトリがあるディレクトリに移動して、

```bash
sh ~/.aws/AWS-ElasticBeanstalk-CLI-2.6.0/AWSDevTools/Linux/AWSDevTools-RepositorySetup.sh
```

を実行する。
何も変化は起きないけど、特にエラーが起こらなければたぶん大丈夫。
これで何かがセットアップされてるっぽい。
そのまま続けて、

```bash
git aws.config
```

を実行すると、

AWS Access Key
AWS Secret Key
AWS Region
AWS Elastic Beanstalk Application
AWS Elastic Beanstalk Environment

を順番に聞いてくるので、それぞれ答えていく。
ただし、２回目以降はAWS Access KeyとAWS Secret Keyは聞かれない。
ここでAWS Access KeyはAWSアカウント毎に発行されるもので、

https://console.aws.amazon.com/iam/home?#security_credential

から確認できる（または新しいく発行することもできる）。
ただし、AWS Secret Keyはパスワードと同じで確認する手段がない。
たぶん忘れた場合はAWS Access Keyと一緒に新しく発行するしかない。
AWS RegionはElastic Beanstalkの管理画面のURLから確認できる。
たとえば

https://console.aws.amazon.com/elasticbeanstalk/home?region=ap-northeast-1

のようになっていた場合はap-northeast-1がAWS Regionになる。
AWS Elastic Beanstalk ApplicationとAWS Elastic Beanstalk Environmentは、
まぁ自分が作ったApplicationの名前とEnvironmentの名前をそのまま入力するだけ。
全て入力すると、カレントディレクトリとホームディレクトリにそれぞれ、
.elasticbeanstalkというディレクトリが作られる。
カレントディレクトリに出来た.elasticbeanstalkの配下にはconfigというファイルが作られる：

```bash:.elasticbeanstalk/config 
[global]
ApplicationName=アプリ名
DevToolsEndpoint=git.elasticbeanstalk.リジョン名.amazonaws.com
EnvironmentName=環境名
Region=リジョン名
AwsCredentialFile=aws_credential_fileへのフルパス
```

ホームディレクトリに出来た.elasticbeanstalkの配下にはaws_credential_fileというファイルが作られる：

```bash:~/.elasticbeanstalk/aws_credential_file 
AWSAccessKeyId=アクセスキー
AWSSecretKey=シークレットキー
```

#デプロイの度にやる作業

##デプロイ

.gitのあるディレクトリで

```bash
git aws.push
```

を実行するだけ。
Haxeのimportは関数や変数のインポートや、別名でのimportもできるよ

#importの構文

##importを使わない書き方

```hx:Main.hx
class Main {
	static function main() {
		neko.Lib.println( "hello world" ); 
	}
}
```

##importを使った書き方

```hx:Main.hx
import neko.Lib;

class Main {
	static function main() {
		Lib.println( "hello world" ); 
	}
}
```

##関数をインポート

```hx:Main.hx
import neko.Lib.println;

class Main {
	static function main() {
		println( "hello world" ); 
	}
}
```

##ワイルドカードでまとめてインポート

```hx:Main.hx
import neko.*;

class Main {
	static function main() {
		Lib.println( "hello world" ); 
	}
}
```

```hx:Main.hx
import neko.Lib.*;

class Main {
	static function main() {
		print( "hello" ); 
		println( " world" ); 
	}
}
```

##別名でインポート

```hx:Main.hx
import neko.Lib in NekoLib;

class Main {
	static function main() {
		NekoLib.println( "hello world" ); 
	}
}
```

---
 
関数をimportできるのとか、別名でimportできるのとかわりと見落としがち

#実用
##Haxe/JavaScript
Haxe/JSを書いてると、いちいち ```Browser.document```とか、```Browser.window```とか書くのがめんどくさいので、以下のようなインポート文を記述しておくと便利です。

```hx:Main.hx
import js.Browser.*;
import js.Lib.*;

class Main {
	static function main() {
		alert( "hoge" ); // Lib.alert
		document.getElementById( "nav" ); // Browser.document
		location.hash; // Browser.location
	}
}
```

これで、素のJavaScriptを書くのと同じような感覚でdocumentやwindowにアクセスできるようになります。

#参考
http://haxe.org/manual/modules
https://github.com/HaxeFoundation/HaxeManual/blob/master/md/manual/type-system-import.md
renderってなんぞや？

Ruby on Railsでなにかしら機能を構築し、よし！いざviewに落とし込むぞ！ってなったときに、いちいちcontrollerで定義した変数や、htmlを書くのはけっこう大変。。。！

そんな問題を解決してくれるのがrenderです。

プログラミング初心者かつ映像製作をする自分にとってrenderと言われたらエフェクト書けて重くなった映像を各フレームごと処理しなめらかな映像してくれる方のrenderしか思い浮かばず、プログラミングでのrenderってなんだ？！とドツボにハマってしまいました。

ということで調べてみると・・・
"画像や画面の内容を指示するデータの集まり(数値や数式のパラメータ、描画ルールを記述したものなど)をコンピュータプログラムで処理して、具体的な画素の集合を得ること。"

つまり、わざわざviewで一度定義した変数や、テンプレートを書かず、render ＋　そのページに表示したい数式やhtmlの場所を指定するだけで、ポンとそのviewを返してくれるわけです。

便利！

例）app/view/user/show.html.erb

```ruby:qiita.rb
puts '
　　・
　　・
　　・
　　<div class="span8">
 +    <%= render 'follow_form' if signed_in? %>
      <% if @user.microposts.any? %>
        <h3>Microposts (<%= @user.microposts.count %>)</h3>
 -       <ol class="microposts">
 +        <%= render @microposts %>
 +       </ol>
        <%= will_paginate @microposts %>
      <% end %>
    </div>
　　・
　　・
　　・
'
```


app/view/user/show_html.erbにmicropostsを投稿順に表示させたい！
となったときに、render @micropostsを使用することことで、その値（この場合は@micropostsにひもづけられているcontentとuser idなどの値）が<ol></ol>に従って順番に番号付きで表示されるということです。

便利！

これで、すっきりとしたhtmlを書くことが出来ます。
SublimeText3のEmmetでの宣言文を最適化する

Windows版のEmmetプラグインの設定ファイルのパス

```
C:\Users\<ユーザ名>\AppData\Roaming\Sublime Text 2\Packages\Emmet\emmet\snippet.json
```

```js:snippet.json
{
     "variables": {
          "lang": "ja",
          "locale": "ja-JP",
          "charset": "UTF-8",
          "indentation": "\t",
          "newline": "\n"
     },
    
//...
    
     "html": {
          "filters": "html",
          "profile": "html",
          "snippets": {
               "!!!":    "<!DOCTYPE html>",
               "!!!4t":  "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">",
               "!!!4s":  "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">",
               "!!!xt":  "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">",
               "!!!xs":  "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">",
               "!!!xxs": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">",
 
               "c": "<!-- |${child} -->",
               "cc:ie6": "<!--[if lte IE 6]>\n\t${child}|\n<![endif]-->",
               "cc:ie": "<!--[if IE]>\n\t${child}|\n<![endif]-->",
               "cc:noie": "<!--[if !IE]><!-->\n\t${child}|\n<!--<![endif]-->"
          },
         
//...
}
```
実行中プロセスの ulimit/rlimit を変更する

（bash のコマンドだと ulimit だけどシステムコールだと get/setrlimit だし、ulimit？ rlimit？ どっち？）

## はじめに

ここ↓にある通りですが、カーネル 2.6.36 以降なら prlimit(1) で簡単にできます（prlimit が使える環境が手元になかったので試していませんが）。
それ以前のカーネル（あるいは Linux 以外）なら gdb でアタッチして対象プロセスで setrlimit を無理やり呼び出します。

 - [debug - setting ulimit on a running process - Super User](http://superuser.com/questions/404239/setting-ulimit-on-a-running-process "debug - setting ulimit on a running process - Super User")

手元に prlimit が使える環境がなかったので gdb を使います。

## バッチを作成

gdb でアタッチした瞬間にプロセスが停止してしまうため gdb のコマンドは手打ちせず、停止時間を短くするために gdb のコマンドをバッチにしておく方が良いでしょう。

```gdb:rlimit.gdb
set pagination off
set width 0
set height 0

set $rlim = &{0ll, 0ll}
print getrlimit(4, $rlim)
print *$rlim

set $rlim = &{-1ll, -1ll}
print setrlimit(4, $rlim)

detach
quit
```

先頭 3 行は gcore からコピりました、意味は知りません。

6 行目や 10 行目の `4` は `RLIMIT_CORE` です。具体的な値は `/usr/include/bits/resource.h` で定義されています。

9 行目の `-1ll` は long long の -1 で `RLIM_INFINITY` です。1つ目がソフトで2つ目がハードです。どちらも無制限に設定します。

## gdb でプロセスにアタッチ

バッチを作成した後、対象プロセスの PID を調べて gdb を次のように実行します。

```console
$ gdb -x rlimit.gdb -batch -p 12345
[Thread debugging using libthread_db enabled]
 :
$1 = 0
$2 = {0, -1}
$3 = 0
```

 - `$1` は getrlimit の戻り値です（0 なら成功）
 - `$2` は getrlimit で得られた現在のリミットです（ソフト、ハード）
 - `$3` は setrlimit の戻り値です（0 なら成功）

## コアダンプさせてみる

この後、このプロセスをセグらせるとコアダンプします。

```console:セグらせる
$ kill -SIGSEGV 12345
```

```console:対象プロセス
Segmentation fault (core dumped)
```

## 注意点

prlimit は試せる環境が無かったので判りませんが、gdb で setrlimit を呼ぶ方法はあくまでも対象プロセスのプロセス空間内で setrlimit を呼んでいるだけなので、ハードリミットを上げるためには対象プロセスが root で実行されているか `CAP_SYS_RESOURCE` ケーパビリティを持っている必要があります。

gdb を root で実行しようがなにしようが対象プロセスに特権が無いならハードリミットは上げられません。

ソフトリミットをハードリミットの範囲内で設定したり、ハードリミットを下げる分には問題ありません。

## 追記

[id:hiboma](http://b.hatena.ne.jp/hiboma/20140412#bookmark-190106318) から次のブコメをもらいました。

> getrlimit, setrlimit 実行後にコケてしまうと errno を書きかえるので副作用がでます。errno を一旦退避しておいて元に戻しておくとより安全

実際に確認してみます。

まずは次のように errno が非 0 になるまでループさせます。
もちろんループの中で errno が非 0 になる可能性が無いので無限ループするはずです。

```c:a.c
#include <stdio.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <errno.h>

pid_t gettid()
{
    return syscall(SYS_gettid);
}

int main()
{
    pid_t pid = getpid();
    pid_t tid = gettid();

    printf("%ld %ld\n", pid, tid);
    while(!errno);
    printf("errno: %d\n", errno);

    return 0;
}
```

ハードリミットを 0 に設定して実行します。


```console
$ gcc a.c
$ ulimit -H -c 0
$ ./a.out
12345 12345
```

gdb でアタッチします。

```console
$ gdb -p 12345
```

setrlimit で -1 を設定してみます。が、非特権ユーザーなので失敗します。

```txt:(gdb)
set $rlim = &{-1ll, -1ll}
print setrlimit(4, $rlim)
```

デタッチすると・・・

```txt:(gdb)
detach
```

実行していたプロセスが終了します。

```console
$ ./a.out
12345 12345
errno: 1
```

確かに setrlimit の失敗によって errno が書き換えられてしまってますね・・・
なので次のように errno を退避しておくほうが良いようです。

```txt:rlimit.gdb
set pagination off
set width 0
set height 0
set $errno = errno

set $rlim = &{0ll, 0ll}
print getrlimit(4, $rlim)
print *$rlim

set $rlim = &{-1ll, -1ll}
print setrlimit(4, $rlim)

set errno = $errno
detach
quit
```
非同期関数のcallbackのテストを行う


最近ハマっているcoffeescriptを使って説明します。

## 非同期な関数
google maps apiにはGeocoderなど、座標から地名を取得するような関数でサーバからの応答を待つ非同期関数が存在する。例えば下記のgeocode()関数が非同期な関数である。

```coffeescript:geocode.coffee
class @Geocoder
  constructor: ->
	@geocoder = new google.maps.Geocoder()
    @results

  getPlaceName: (point) ->
	request = {
      language : "en"
      latLng : point
    }

	geocoder.geocode(
	  request
	  (results, status) =>
        # ここがサーバからの応答があってから実行されるcallback
        @results = results
	
```

上記のcallback関数の実行後のテストをjsTestDriverを使って行いたい場合どうすればいいか？
[sinon.js](http://sinonjs.org)を使って、擬似サーバによりテストを行う方法もあるが、今回の場合googleの応答結果を使ってテストしたいのでやり方を考えてみた。

## jQuery Deferredを利用する
最初にsetTimeoutで少し待ってからテストを行えばいいと考えていたが、その方法ではうまく行かなかった。うまく行ったのは、AsyncTestCaseとjQuery Deferredを用いてテストする方法。
AsyncTestCaseについては先日の投稿にも書いた通りである。

> [CoffeeScriptでAsyncTestCaseを書く](http://qiita.com/mm-git/items/4aed467fd52513f29167)

また、jQuery Deferredについては下記を参考にした。

> [jQuery.Deferredを使って楽しい非同期生活を送る方法](http://qiita.com/yuku_t/items/3d1cf51d7ae91305eaaa)

## GeocoderクラスをDeferredを使って書き換える
というわけで、最初に書いたクラスをDeferredを用いて書き換えてみる。

```coffeescript:geocode.coffee
class @Geocoder
  constructor: ->
	@geocoder = new google.maps.Geocoder()
    @results

  getPlaceName: (point) ->
	defer = new $.Deferred()  #追加

	request = {
      language : "en"
      latLng : point
    }

	geocoder.geocode(
	  request
	  (results, status) =>
        # ここがサーバからの応答があってから実行されるcallback
        @results = results
		defer.resolve()       #追加

    return defer.promise()   #追加
	
```

## テストケースを書いてみる

```coffeescript:geocode_test.coffee
  AsyncTestCase "Geocoder Test",
    setUp: (queue)->
      queue.call(
        "prepare google map"
        (callbacks) ->
          onReadyGoogleMap = callbacks.add(
            =>
              @geocoder = new Geocoder()
          )

          $.when(
            loadGoogleMaps(3, null, "en", false)
          )
          .done(
              ->
                onReadyGoogleMap()
          )
      )

    "test getPlaceName": (queue) ->
      queue.call(
        "wait function callback"
        (callbacks) ->
          success = callbacks.add(
            =>
              assertNotEquals(0, @geocoder.results.length) #ここにテストケースを書く
          )

          $.when(
            @geocoder.getPlaceName(new google.maps.LatLng(37.4815, -122.2287))
          )
          .done(
            ->
              success()
          )
      )
```

- setUp部分は、上にも書いたが先日書いた投稿の通り。こうしないとgoogleのapiのテストができない。

> [CoffeeScriptでAsyncTestCaseを書く](http://qiita.com/mm-git/items/4aed467fd52513f29167)

- "test getPlaceName"のテスト部分も、google apiのロードとやっていることは同じ。
- callbacks.addでcallback実行後のテストケースを予め登録しておく。こうしておくと、success()が実行されるまで、次のテストの実行を待機するようになる。
- getPlaceName()をjQuery deferred.promise()を返すように書き換えたので、$.whenで待つようにすることができる。
- geocode()のcallback内でdeferred.resolve()が実行されると、上記テストケースの.done()が実行される。
- success()のテストが実行される。
jade で IE の Conditional Comments(条件付きコメント)を効かせる


**追記あり**



以前はこのように書けば

```jade
// if lt IE 9
      script(src="/javascripts/html5shiv.js")
```

↓こうなった

```html
<!--[if lt IE 9]>
<script src="/javascripts/html5shiv.js"></script>
<![endif]-->
```

jade 1.0　からはこの記法が使えない。

ここを見ると...
https://github.com/visionmedia/jade/issues/1345


以下のように書けと書いてある

```html
<!--[if lt IE 9]>
script(src="/javascripts/html5shiv.js")
<![endif]-->
```

たしかにコンパイルはされるけど↓のように先頭が前の行のうしろにくっついてしまった
（こうなりませんか？）

```html
<link rel="stylesheet" href="stylesheets/styles.css"><!--[if lt IE 9]>
<script src="/javascripts/html5shiv.js"></script><![endif]-->
```

不細工なうえに、これだと conditinal comments だと解釈されない（みたい）。

なので、これで強引に解決

```html
//[if lt IE 9]><script src="/javascripts/html5shiv.js"></script><![endif]
```

↓

```html
<!--[if lt IE 9]><script src="/javascripts/html5shiv.js"></script><![endif]-->
```

-
**2014/4/10追記**

上記の方法でも conditinal comments が読めていないようでした
いろいろ試した結果、以下の書き方なら問題ない様子です


```jade
!= '\n<!--[if lt IE 9]>'
script(src="./javascripts/html5shiv.js")
!= '\n<![endif]-->\n'
```
Emmet / ZencodingでHTMLを展開

公式サイト

http://emmet.io/

公式ドキュメント

http://docs.emmet.io/

チートシート

http://docs.emmet.io/cheat-sheet/

ドットインストール

Emmet/Zen-coding入門

非公式Emmet/ZenCoding

秀丸マクロ
http://exoego.net/archives/zencoding-in-hidemaru
 
Edge Code拡張
https://github.com/emmetio/emmet/downloads
 
Vidual Studio 2012プラグイン
http://visualstudiogallery.msdn.microsoft.com/175f4e5a-bcc4-4931-b3e6-164cb1e60277
ショートカットキー
 
Expand Abbreviation
Sublime Text （Tab）
 
Wrap with Abbreviation
Sublime Text （Ctrl + Alt + Enter）（control + option + return）
 
 
省略形の展開
 
body
 
 
クラス属性の展開
 
p.honbun
 
 
複数のクラスの展開
 
article.news.left
 
 
ID属性の展開
 
section#about
 
 
属性の展開
 
table[border]
 
 
属性値の展開
 
abbr[title=zen coding]
 
 
親子関係の展開
 
article<p
 
 
1つ上の階層に戻る
>
2つ上の階層に戻る
>>
 
 
兄弟関係の展開
 
dt+dd
 
 
要素内テキスト
{}
 
 
可能性の高い子要素の展開
 
ul+
table+
dl+
 
 
同じ要素の複数展開
 
p*3
 
 
グループの同時展開
 
(div<p)*3
 
連番の見出しの同時展開
 
h$*3
 
連番の属性の同時展開
p#topic-$*3
 
 
2桁の連番の同時展開
 
p#topic-$$*3
 
 
基本構造の展開
 
html:5
 
 
エスケープして展開
 
html:5|e
 
 
2重にエスケープして展開
 
html:5|e|e
 
 
IDにコメントを追加して展開
 
section#news|c
 
 
タグで包む
 
ul<li*<a
 
 
cssの展開
 
bgc
 
cssの値を同時に展開
d:b
 
:の後にスペースを空けて展開
 
fl:l|fc
 
 
cssの特殊構文
@i
ReactiveCocoa RACSubject で SVProgressHUD の dismiss を管理

アプリ内課金の処理でグルグルを表示させている場合など、エラーのハンドリングが複数箇所になって、グルグルを消すのが漏れたりしそうですが、 RACSubject を作って、 subscribeError:completed: で dismiss させると、 SVProgressHUD を使う箇所もここにまとめられるので便利。

~~~objc
+ (RACSubject *)createProgressHUDSubject
{
    [SVProgressHUD showWithMaskType:SVProgressHUDMaskTypeBlack];
    RACSubject *subject = [RACReplaySubject replaySubjectWithCapacity:1];
    [subject subscribeError:^(NSError *error) {
        [SVProgressHUD dismiss];
    } completed:^{
        [SVProgressHUD dismiss];
    }];
    return subject;
}
~~~
Exception Notificationでエラー時にMailやHipChatに通知を送る

[https://github.com/smartinez87/exception_notification](https://github.com/smartinez87/exception_notification)

これ、便利ですね。

## 設定

```diff:Gemfile
+ gem 'exception_notification'
+ gem 'hipchat' # HipChatを使う場合だけ
```

Railsの場合は以下のようにすると設定ファイルが作成されます。

```
$ rails g exception_notification:install
```

自分は以下のようにしました。

ignored_exceptionsを空でデフォルトで無視されている例外でも補足させてます。

詳細は[こちら](http://smartinez87.github.io/exception_notification/#ignore-exceptions/ignore_exceptions)を参照してください。

またproduction環境のみで実行できるようにしました。

```ruby:config/initializers/exception_notification.rb
require 'exception_notification/rails'
ExceptionNotification.configure do |config|
  # Ignore additional exception types.
  # ActiveRecord::RecordNotFound, AbstractController::ActionNotFound and ActionController::RoutingError are already added.
  # config.ignored_exceptions += %w{ActionView::TemplateError CustomError}
  config.ignored_exceptions = %w{} # 効いてるかな？

  # Adds a condition to decide when an exception must be ignored or not.
  # The ignore_if method can be invoked multiple times to add extra conditions.
  config.ignore_if do |exception, options|
    not Rails.env.production?
  end

  # Notifiers =================================================================

  # Email notifier sends notifications by email.
  config.add_notifier :email, {
    email_prefix:         "[ERROR_MODE] ",
    sender_address:       %{"Error Notification" <dev@example.com>},
    exception_recipients: %w{dev-ml@example.com}
  }

  # HipChat notifier sends notifications to your HipChat room. Requires 'hipchat' gem.
  config.add_notifier :hipchat, {
    :api_token => 'YOUR_API_KEY',
    :room_name => 'YOUR_ROOM_ID_OR_NAME'
  }

end

```

これだけ。

```
$ rails s -e=production
```

とかやって、わざとExceptionを起こすとメールやHipChatの部屋にアラートが届くと思います。

また例外を補足することをトリガーとしているだけかとおもいきや、

```rb
begin
  some code...
rescue => e
  ExceptionNotifier.notify_exception(e)
end
```

みたいな感じでメソッドとして呼べるみたいです。バックグラウンドで処理されるように設定する必要があるみたいですが、以下のようにすると先ほどの設定ファイルに設定が追加されるみたいです。


```
rails g exception_notification:install --resque
or
rails g exception_notification:install --sidekiq
```

超簡単便利！
[システム環境設定]

環境設定は全て終わりました。　

Iterm2の設定を済ませました

#Iterm2
  * Generalタブ
    * Services
      * Add Bonjour hosts to Profiles にチェックいれる
    * Window
      * Closing Hotkey...以外チェック入れる
  * Appearanceタブ
    * Window & Tab Titles すべてチェックはずす
    * Dimming すべてチェックはずす
  * Profilesタブ
    * Generalタブ
      * ＋でNewProfile作成
      * Other Actions -> Set as Default で作成したProfileをデフォルトに設定
    * Colorタブ
      * SmartCursorColor チェックはずす
      * Basic Colors
      * Foreground 000000
      * Background 000000
      * Bold ffffff
      * Section 999999
      * Selected Text 000000
      * Cursor 33cc66
      * Cursor Text cccccc
    * ANSI Colors
      * Normal
          * Black 333333
          * Red 993300
          * Green 339933
          * Yellow ff9900
          *  Blue 669999
          * Magenta 663366
          * Cyan 006699
          * White cccccc
      * Bright
          * Black 333333
          * Red 993300
          * Green 339900
          * Yellow ff9900
          * Blue 003333
          * Magenta 663366
          * Cyan 006699
          * White cccccc           
          * Minimum contrast 真ん中よりやや左

    * Textタブ
      * TextRendering　すべてチェックはずす
    * Windowタブ
      * Transparency　真ん中やや左まであげる
      * Columns　200
      * Rows　70
    * Terminalタブ
      * Scrollback Lines 10000
      * SilenceBell チェック入れる
    * Keysタブ
      * ProfileShortcutKeys すべて消す
      * left option -> +esc on
      * right option -> +esc on
    * Keysタブ
    　* GlobalShortsutKeys すべて消す
    　* hotkey -> ^+command+o
Goのinterface使い方勉強

　サーバーサイドプログラムを作成しようと思い。ベンチマークでよい値が出ているGo言語を勉強したのでそのメモです。ご指摘等があればよろしくお願いいたします。
　Objective-C等はいじったことがあるのと、昔C++をいじったことがあったので取っ付きやすいかと思ったのですが結構癖があったのでメモします。
　Go言語はClassの概念がないので、property等を公開しないようにするにはinterfaceを使って隠す必要があります。

```go:sample.go
ackage main

import (
	"fmt"
)

// Human interface
type Human interface {
	setName(string)
	getName() string

	setAge(int)
	getAge() int
}
```
　まず、interfaceを使ってPublicのMethodを定義します。小文字で始まる関数名がよいのかはよくわかっていません・・・。Objective-C風にしてしまいました・・・。
　次にprivate部分を実装です。

```go:sample.go
// human private
type human struct {
	name string
	age  int
}
```
　次にinterface部分で定義したmethodを記述していきます。ここで私がはまったのはHumanで実装するのではなくinterfaceを採用する構造体に実装することです。つまりここでいうhumanに所属させて実装することです。当たり前ですよね〜。だってhumanのname,ageにアクセスできないですものね。

```go:sample.go

// human methods
// name setter
func (h *human) setName(yourname string) {
	h.name = yourname
}

// name getter
func (h *human) getName() (yourname string) {
	return h.name
}

// age setter
func (h *human) setAge(yourage int) {
	h.age = yourage
}

// age getter
func (h *human) getAge() (yourage int) {
	return h.age
}
```
　こんな感じです。
　次に、humanを作って返す関数を実装します。サンプルとして単純に作成するものと、初期値を与えて作成するものを作りました。

```go:sample.go
// Human initializer
func InitHuman() Human {
	return new(human)
}

func setInitHuman(name string, age int) Human {
	return &human{name: name, age: age}
}
```
　実際に呼び出して使ってみましょう。　

```go:sample.go
// Main
func main() {
	yuta := InitHuman()
	yuta.setName("hogehoge")
	yuta.setAge(5)

	fmt.Println("Name is", yuta.getName(), "Age is", yuta.getAge())

	kazu := setInitHuman("ageage", 15)
	fmt.Println("Name is", kazu.getName(), "Age is", kazu.getAge())

	kazu.setName("tegetege")
	kazu.setAge(25)
	fmt.Println("Name is", kazu.getName(), "Age is", kazu.getAge())
}
```
以上です。
もっとこう書いたらCoolというのがあったら教えてください。
TreasureDataでカラム名に大文字が入ってしまった場合のメモ

Treasure Dataで、テーブルへのスキーマ設定の際に、カラム名に大文字が入っていると現状では設定できない。
> Schemas currently support column names consisting of lowercase alphabets, numbers, and "_" only.
http://docs.treasuredata.com/articles/schema#setting-custom-schema

現状は、データの入れ直しをする必要があるので、全データの入れ直しの手順をメモする。

まず、該当するテーブルに対して、クエリを発行する。

```lang:sql
SELECT
*
FROM
(TABLE)
LIMIT 1
```
上記を実行すると、vカラムの全データとtimeが１行出力される。
v:map<string,string>　time:int

クエリの実行結果をjson形式でダウンロードし、エディタで開く。

```lang:sql
["v","time"]
[{"id":"hi","time":"1334102460"},1334102460]
```

上記からスクリプト用にいらんとこを消しておく。

```lang:sql
{"id":"hi","time":"1334102460"}
```

スクリプトの(jobid)とtablenameを環境に合わせて書き換えて、スクリプトを実行し、標準出力をWebコンソールにコピペする。

```lang:ruby
# encoding: utf-8
require 'json'

header = JSON.parse(File.read("~.json", :encoding=>"UTF-8"))
db = "dbname"
table = "tablename"
cnt = 0
puts "-- #{db}.#{table}"
puts "SELECT "
header.each_key do |key|
  cnt += 1
  puts "v['#{key}'] AS #{key.downcase},"  if key != 'time' and cnt != header.length
  puts "v['#{key}'] AS #{key.downcase}"   if key != 'time' and cnt == header.length
  puts "#{key} AS #{key.downcase},"       if key == 'time' and cnt != header.length
  puts "#{key} AS #{key.downcase}"        if key == 'time' and cnt == header.length
end
puts "FROM #{table}"


```

実行時の結果出力先にTreasureDataを選び、空のテーブルに出力する。

最後にローカルのtdコマンドのswapを実行するとテーブル名の入れ替えができる。

```
$ td table:swap <db> <スキーマに大文字があるテーブル> <先ほどの結果を出力したテーブル>
```

Treasure DataについてにRelease Notesが見れるようになりましたね。
http://help.treasuredata.com/customer/portal/topics/624353-release-notes/articles

以上。
Windows環境でのmysql2 gemのインストール

Windows環境でのmysql2 gemのインストール方法に何度も悩まされたので。

### 事前準備

1. Rubyをインストールしておく
2. DevKitをインストールしておく

[Rumix](http://ruby.morphball.net/rumix/)を使うとインストーラーで完結できるので楽チン。

### mysql2 gemのインストール

3. [MySQL C/Connector](http://dev.mysql.com/downloads/connector/c/)をダウンロードする。インストーラーではなく、Zip版を選ぶこと。
4. ダウンロードしたMySQL C/Connectorを```C:\mysql-connector```に解凍しておく
5. コマンドプロンプトから下記のコマンドを打ち込み、インストールする。

```bat
% gem install mysql2 -- '--with-mysql-dir="C:\mysql-connector"'
```

### Bundlerで使う場合

```%HOME%\.bundle\config``` をエディタで開き、下記のように入力されているかを確認する。アンダーバーは最初が1つ、次が2つ。コピペしないと間違えやすいので要注意。

```
BUNDLE_BUILD__MYSQL2: '--with-mysql-dir="C:\mysql-connector"'
```

```.bundle\config``` が見つからない場合、下記のコマンドを打ち込めばできるはず。ただしシングルクオーテーションが正しくconfigファイルに反映されないのでコマンド実行後に手動の書き換えが必要になる。コマンドラインから正しくパラメータを設定する方法を見つけた方はぜひ教えてください。

```bat
bundle config build.mysql2 '--with-mysql-dir="c:\mysql-connector"'
```

### 仕上げ

```C:\mysql-connector\lib\libmysql.dll``` をruby.exeがあるフォルダにコピーして終わり。


### 参考
下記のStackOverflow解答を参考にした。

  * [Ruby MYSQL2 gem installation on windows 7](http://stackoverflow.com/questions/19014117/ruby-mysql2-gem-installation-on-windows-7)
Rails 4.1.0をインストールしてみた

# 「Ruby on Rails チュートリアル」を読みながら、Rails 4.1.0をインストールしてみる

http://railstutorial.jp/chapters/beginning?version=4.0

## さっそくRailsをインストール
`$ gem install rails --version 4.0.2`
しかし、うまくインストールされない。

なのでバージョンなしで試してみる。
`$ gem install rails`
うまくいかない。

## どうやらanyenvの設定がまだ完了していないらしい
```lang:結果
$ anyenv versions
rbenv:
* system (set by /Users/kenji/.anyenv/envs/rbenv/version)
  2.1.1
```
`* system`になっていて、anyenvの設定が完了していなかった。

これを実行してみる
`$ anyenv install rbenv
$ rbenv install 2.1.0`

すると、、、

```lang:結果
$ anyenv versions
rbenv:
  system
* 2.1.0 (set by /Users/kenji/.anyenv/envs/rbenv/version)
```
`* system`から`* 2.1.0`に変更された！

## 再度railsをインストール、、、
再度railsをインストールを試みるが、まだされない。
原因は、インストール直後にパスが通っていないらしい。

`$ eval "$(anyenv init -)"`を実行。

そして再度確認。

`$ rails -v
Rails 4.1.0`

無事インストールされました！！！！
sensu api を利用する

# 背景
・いろんなダッシュボードがある。
・ちょっと自分でも作って見るか
・API取得出来るみたい
・[Document](http://sensuapp.org/docs/0.11/api)読んだ。
・需要あるのか？とも思いつつ自分の備忘録用にまとめる。

# 前提
・ sensu-api host : localhost
・ sensu-api port : 4567
・ 大文字のところは任意環境に合わせて変更
・ 認識違いがあれば申し訳ございません。

# 処理をcurlで書いて見る

###checks
-----
#### 全体確認
```bash
curl -v -X GET http://localhost:4567/checks
```
#### 個別確認
```bash
curl -v -X GET http://localhost:4567/check/CHECK_NAME
```

###info
-----
#### 確認
```bash
curl -v -X GET http://localhost:4567/info
```

###client
-----
#### 全体確認
```bash
curl -v -X GET http://localhost:4567/clients
```
#### 個別確認
```bash
curl -v -X GET http://localhost:4567/clients/NODE_NAME
```
#### 削除
```bash
curl -v -X DELETE http://localhost:4567/clients/NODE_NAME
```

#### 直近の履歴
```bash
curl -v -X GET http://localhost:4567/clients/NODE_NAME/history
```  

### events
-----
#### 全体確認
```bash
curl -v -X GET http://localhost:4567/events
```

#### 個別確認
```bash
curl -v -X GET http://localhost:4567/events/NODE_NAME
```

#### 削除
```bash
curl -v -X DELETE http://localhost:4567/events/NODE_NAME/CHECK_NAME
```  
### stashes
------
 ※ ここでは silence/ 下に放り込む事を想定
#### 確認
```bash
curl -v -X GET http://localhost:4567/stashes
``` 
#### 個別確認
```bash
curl -v -X GET http://localhost:4567/stashes/silence/NODE_NAME/CHECK_NAME
```
#### 作成
```bash
curl -v -H "Content-type: application/json" -X POST -d "{\"path\":\"silence/NODE_NAME/CHECK_NAME\",\"content\":{\"timestamp\":TIME}}" http://localhost:4567/stashes
``` 
#### 削除
```bash
curl -v -X DELETE http://localhost:4567/stashes/silence/NODE_NAME/CHECK_NAME
```

# それから
ここ迄取得方法が分かれば net/http とかにぶち込めば取得可能。
あとは煮るなり焼くなり

出力はJSONだから読みやすいし JSON.parse(str) とかでお好みに

# やってみて思った事
多分色々ツールはあるんだけど自分で一からやる事でSensuの理解はちょっとはあがるかな？
情報が少ないので手探りでーす。

JSON見すぎてもう自分もJSON
知らなかったGitコマンドまとめ

「[GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)](http://www.amazon.co.jp/dp/477416366X/ref=cm_sw_r_tw_dp_wrkrtb1KZ7HPE)」という本がとても評判良いみたいなので買いました。まだ読んでる途中ですが、評判通りの本です。

知らなかったgitコマンドもいくつかあったのでメモしておきます。

## log系

### コミットメッセージの1行目のみを表示する

```
git log --pretty=short
```

### ファイルの差分も一緒に表示する

```
git log -p
```

### ブランチを視覚的に確認する

```
$ git log --graph


* commit c1a9b606b28bc3e163925b60f0f7f1b4676f0726
| Author: koogawa <koogawa.app@hoge.com>
| Date:   Sun Mar 16 01:21:15 2014 +0900
|
|     Add image files.
|
*   commit fe8f161580326f764ebecf3d63e1ea24850d662d
|\  Merge: 9ed9d13 0260e16
| | Author: koogawa <koogawa.app@hoge.com>
| | Date:   Sun Mar 16 01:16:29 2014 +0900
| |
| |     Merge branch 'line'
| |
| * commit 0260e16d215835f0e32191e2b1af21f7057d9576
| | Author: koogawa <koogawa.app@hogel.com>
| | Date:   Sat Mar 15 13:56:53 2014 +0900
| |
| |     update ignore
| |
| * commit bebb60ed276de1e75afe6ddb3728d42a0f2aba1c
| | Author: koogawa <koogawa.app@hoge.com>
| | Date:   Sat Mar 15 10:27:43 2014 +0900

| |
| |     Add send to LINE feature
| |
* | commit 9ed9d13715811c14557131e4917ee2352714da29
|/  Author: koogawa <koogawa.app@gmail.com>
|   Date:   Sat Mar 15 11:51:51 2014 +0900
|
```

これは面白い！

## ブランチ系

### 一つ前のブランチに切り替える

```
$ git checkout -
```

`$ cd -` みたいな感じで切り替えられるらしい。

## コミット系

### 直前のコミットメッセージを修正する

```
git commit --amend
```

### git add と git commit を同時に

```
git commit -am "Add files"
```

## Issue系

### 関連するIssueにコミットを表示する

コミットする際、

```
git commit -m "Add feature #24"
```

のように Issue 番号を含めると、対象の Issue にこのコミット情報が表示される。

### IssueをCloseする


コミットする際、

```
git commit -m "close #24"
```

のように記述すれば、該当する Issue が Close される。`close` の他、

* fix
* fixes
* fixed
* close
* closes
* closed
* resolve
* resolves
* resolved

でもいける。
本番環境のモニタリング・エラー通知などをできるだけ無料のツールでやりたい。

## 前置き

アプリを書くことに専念したいときにできるだけ手間をかけたくない。サーバーに設置するのもめんどくさい。できるだけクラウドサービスにやらせたい。しかも無料で。

ということで、そんなツールがないか調査してみました。

## エラー通知

![http://errbit.github.io/errbit/images/error_backtrace.png](http://errbit.github.io/errbit/images/error_backtrace.png)

以前rebuildfmのkenさんの回で自動でエラーを通知してくれるサービスがあると聞いて試そう試そうと思っていたが、結局その後忘れて時間が経ってしまっていた。

有名ドコロは以下やつみたい。

[Airbrake](https://airbrake.io/)
[Bugsnag](https://bugsnag.com/)
[Exceptional](http://www.exceptional.io/)

ただ、これは全部有料だった。

OSSでもあった。

[errbit](http://errbit.github.io/errbit/)

クラウドサービスの導入コストと自分たちでサーバー用意して設置するコストを考えて導入したいですね。

## モニタリング

### サーバーリソースのモニタリング

![https://amon.cx/static/images/pages/servers.png](https://amon.cx/static/images/pages/servers.png)

Beta版の間は無料みたいです！セットアップもサーバーでcurlを叩くだけ。

Disc、Memory、CPUなどの使用率は◯分間80%超えたらアラートをメールに通知できるなどできて便利。
でもパフォーマンス監視はあるけど、死活監視は工夫しないとできない？

[amon](https://amon.cx/)

### ミドルウェア〜フロントエンドまでのモニタリング

![http://newrelic.com/assets/product_features/rum/chart_browserload-bf96f188fa5ec78b5b451a4cf892f632.png](http://newrelic.com/assets/product_features/rum/chart_browserload-bf96f188fa5ec78b5b451a4cf892f632.png)

1週間分のログだけで良ければ無料。
導入も3分くらいで終わりました。

[NewRelic](http://newrelic.com/)

他にもあったら教えてほしいですm(_ _)m

## 雑記

qiitaの編集用のWeb UIがめっちゃ使いやすくなってる…
boost.date_time.now

boost ver: 1.55.0

```cpp:
#include <iostream>
#include "boost/date_time/posix_time/posix_time.hpp"

int main()
{
  using namespace boost::posix_time;

  time_facet *f = new time_facet("%Y-%m-%d %H:%M:%S");

  std::ostringstream oss;
  oss.imbue(std::locale(oss.getloc(), f));

  ptime now = second_clock::local_time();
  oss << now;

  std::cout << oss.str() << std::endl;
}
```
Perlでタイムアウトを設定して外部コマンドを実行する


fork + exec + alarm で、以下のようにやった。

```perl:sample.pl
use strict;
use warnings;
use POSIX qw( SIGKILL );

my $TIMEOUT = 10;
my $cmd = "sleep 15";

my $pid = fork();
if (!defined($pid)) { die "failed to fork"; }
if ($pid == 0) {
    exec($cmd);
    exit;
}
elsif ($pid) {
    my $timeout = 0;
    eval {
        local $SIG{ALRM} = sub {
            $timeout = 1;
        };
        alarm($TIMEOUT);
        while(!$timeout) {
            last if waitpid($pid, POSIX::WNOHANG);
            sleep(1);
        }
    };
    if ($@) {
        warn "Error:".$@;
    }
    if ($timeout) {
        kill(SIGKILL, $pid);
        warn "TIMEOUT";
    }
}
```
LightTableにParedit-Plusを導入する

さらに[前回](http://qiita.com/kurogelee/items/6275273d9b86343e9e24)のつづき。

LightTableのプラグインマネージャからParedit-Plusを導入するともっとショートカットが便利になりそうです。

```clj:user.keymap
{:+ {:app {"ctrl-q" [:workspace.show]
           "alt-c" [:toggle-console :clear-console]}

     :editor {"ctrl-w" [:editor.watch.watch-selection]
              "ctrl-shift-w" [:editor.watch.remove-all]
              "ctrl-alt-w" [:editor.watch.unwatch]
              "ctrl-/" [:toggle-comment-selection]
              "ctrl-i" [:smart-indent-selection]
              "alt-left" [:editor.line-start-smart]
              "alt-right" [:editor.line-end]
              "alt-shift-left" [:editor.line-start-smart]
              "alt-shift-right" [:editor.line-end]
              "f3" [:find.next]
              "shift-f3" [:find.prev]
              "esc" [:find.clear :find.hide]
              "ctrl-pageup" [:window.zoom-in]
              "ctrl-pagedown" [:window.zoom-out]
              "f11" [:window.fullscreen]

              "ins left"  [:paredit.grow.left]
              "ins right"  [:paredit.grow.right]
              "ins ins left" [:paredit.shrink.left]
              "ins ins right" [:paredit.shrink.right]
              "home" [:paredit.move.up.backward]
              "end" [:paredit.move.down.forward]
              "ctrl-home" [:paredit.move.down.backward]
              "ctrl-end" [:paredit.move.up.forward]
              "f4" [:paredit.select.parent]
              "f5" [:paredit.unwrap.parent]

              "f6" [:paredit-plus.delete-pair-contents]
              "ctrl-[" [:paredit-plus.wrap-square]
              "ctrl-]" [:paredit-plus.wrap-square]
              "ctrl-shift-[" [:paredit-plus.wrap-curly]
              "ctrl-shift-]" [:paredit-plus.wrap-curly]
              "ctrl-shift-8" [:paredit-plus.wrap-round]
              "ctrl-shift-9" [:paredit-plus.wrap-round]
              "ctrl-shift-2" [:paredit-plus.wrap-quote]
              "ctrl-del" [:paredit-plus.kill]
              }
     }
 :- {:tabs {"pmeta-w" [:tabs.close]
            "pmeta-shift-[" [:tabs.prev]
            "pmeta-shift-]" [:tabs.next]}}}
```

| キー | 適用コマンド | 概要 |
|:---|:---|:---|
|f6|:paredit-plus.delete-pair-contents|現在のリストの中身をすべて削除|
|ctrl-[|:paredit-plus.wrap-square|現在の要素を[ ]で囲む|
|ctrl-]|:paredit-plus.wrap-square|現在の要素を[ ]で囲む|
|ctrl-shift-[|:paredit-plus.wrap-curly|現在の要素を{ }で囲む|
|ctrl-shift-]|:paredit-plus.wrap-curly|現在の要素を{ }で囲む|
|ctrl-shift-8|:paredit-plus.wrap-round|現在の要素を( )で囲む|
|ctrl-shift-9|:paredit-plus.wrap-round|現在の要素を( )で囲む|
|ctrl-shift-2|:paredit-plus.wrap-quote|現在の要素を" "で囲む|
|ctrl-del|:paredit-plus.kill|現在のリスト内の右側をすべて削除|

:paredit-plus.killは便利そうです。
OnlineSSL のRapidSSLで作ったサーバ証明書を再発行した

https://products.geotrust.com/orders/orderinformation/authentication.do

再発行無料とのことですので。

* 上記に必要な情報を入れます。
* 新しい秘密鍵でCSRを作り、送信します
* 確認のメールが来るので、ＯＫと言います
* 完成じゃ

https://mowa-net.jp/ のサーバ証明書が今日発行されたものになっている……はず
Vagrantとchefを使ってCentOS6.4にCI(Jenkins)サーバを構築


## 前提環境
* Mac(OS X Mountain Lion)
* Ruby (2.1.1p76)
* VirtualBox(4.3.6)

## インストール

### chefの導入
gemでchefを入れる。

~~~sh
$ gem install chef knife-solo
~~~

### Vagrantの導入

http://www.vagrantup.com/

上記公式サイトからインストール

## 仮想OS立ち上げまで

### boxの登録とVagrantfileの作成

~~~sh
$ vagrant box add CentOS64 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box
$ mkdir JenkinsVag && cd JenkinsVag
$ vagrant init CentOS64
~~~

### Vagrantfileのコメントアウトを外す

~~~Vagrantfile
$ config.vm.network "private_network", ip: "192.168.33.10"
~~~

### 仮想マシンの立ち上げ

~~~sh
$ vagrant up
~~~

### vagrantコマンド経由でsshログイン

~~~sh
$ vagrant ssh
~~~
※Vagrantコマンド効くディレクトリでないとアクセスできません。

### 仮想マシンのssh情報を.ssh/configに登録

~~~sh
$ vagrant ssh-config --host jenkins >> ~/.ssh/config
$ ssh jenkins
~~~
これで、どこのディレクトリでも仮想マシンにアクセスできます。

## chefの準備
### chefのリポジトリ作成
~~~sh
#JenkinsVagディレクトリ上でやりましたが、どこでも構わないです。
$ knife solo init chef-repo
$ tree chef-repo
chef-repo
├── cookbooks
├── data_bags
├── environments
├── nodes
├── roles
└── site-cookbooks
~~~

## レシピの作成
~~~sh
$ cd chef-repo
$ knife cookbook create jenkins -o site-cookbooks
$ tree site-cookbooks
jenkins
├── CHANGELOG.md
├── README.md
├── attributes
├── definitions
├── files
│   └── default
├── libraries
├── metadata.rb
├── providers
├── recipes
│   └── default.rb
├── resources
└── templates
    └── default
~~~

### レシピの中身を書いていく

~~~chef-repo/jenkins/recipes/default.rb

package 'java-1.7.0-openjdk' do
  action :install
end

remote_file '/tmp/' + node['jenkins']['rpm'] do
  source node['jenkins']['rpm_url']
  owner "root"
  group "root"
  mode "0755"
  not_if "test -e " + '/tmp/' + node['jenkins']['rpm']
end

package "jenkins" do
  action :install
  source '/tmp/' + node['jenkins']['rpm']
  provider Chef::Provider::Package::Rpm
  not_if "rpm -q jenkins"
end

service "jenkins" do
  action [:enable, :start]
end

service 'iptables' do
    action [:disable, :stop]
end
~~~

## Jenkinsの公式サイトから最新のURLを登録しておく

http://pkg.jenkins-ci.org/redhat/
上記公式サイトからURLをコピーしてくる。

~~~chef-repo/jenkins/attributes/default.rb
default['jenkins']['rpm'] = "jenkins-1.558-1.1.noarch.rpm"
default['jenkins']['rpm_url'] = "http://pkg.jenkins-ci.org/redhat/jenkins-1.558-1.1.noarch.rpm"
~~~

## レシピを仮想マシンに適用する

### 仮想マシンをchef対応にする

~~~sh
$ knife solo prepare jenkins
~~~

### レシピ適用の実行

~~~sh
$ knife solo cook jenkins
~~~

## 確認してみる

http://192.168.33.10:8080/

Jenkinsおじさんと出会えたらOK