OmniAICreator/Qiita-1.07M huggingface dataset:
Androidの登録IDについて


登録IDの扱いに関する注意事項などで気になった点をオフィシャルサイトから拾い上げてみました。

# 登録IDに関して気になった記述

- 登録IDの発行は未登録の場合に限り行う
- 登録及び登録解除に失敗した場合、exponential back-off(失敗するたびに待ち時間を２倍)でリトライすべき
- バックアップ(GoogleのBackup and Restore機能を使っている場合)の際に、登録IDをバックアップすべきではない
- GCMサーバからのレスポンスに含まれる登録IDを確認し、異なっていればレスポンスに含まれるIDで既存のデバイスの登録 IDを置き換えるべき(Canonical IDという仕組み)

以下はマニュアルを翻訳したらしきサイトには書かれているが、Officialのサイトでは記述が見当たらなかった。どっちが本当？

- Google は登録 ID を定期的にリフレッシュする可能性がある
- 登録 ID は Android アプリケーション自体が明示的に登録を解除するまで、または、Google が Android アプリケーション用に登録 ID をリフレッシュするまで存続

# 登録ID解除

登録IDを自ら解除するのは稀。考えられるケースとしては以下。

- メッセージを受け取るのを停止したい場合
- 登録IDが漏洩した場合

但し、アプリケーションのバージョンアップ時には既存の登録IDを無効化するべき

- 登録IDを取得した際にアプリケーションのバージョンと共に保存
- 起動時にアプリケーションのバージョンを比較し、異なればUnregisterした後に再度登録すべき

自動的に解除されるケースはアプリケーションがアンインストールされた後

- ユーザがアプリケーションをアンインストールしたとき、登録 ID は GCM で自動的に登録解除されないが、GCMサーバがメッセージを送った際にアンインストールという通知を受けると登録が解除される
- NotRegisteredのエラーメッセージがGCMサーバから返される

#参考URL

http://www.techdoctranslator.com/android/guide/google/gcm/gcm

http://developer.android.com/google/gcm/adv.html#unreg
自分が良く使うyumコマンドまとめ

### インストール済みのパッケージから特定のパッケージを探す

```
yum list installed | grep パッケージ名

とか

yum list installed | ag パッケージ名

grep遅いんで、ag使ってます！
```

### 特定のリポジトリを有効にしてインストールできるパッケージを検索

```
yum search nodejs --enablerepo="epel"
```

### 指定したパッケージの詳細情報を見る

```
yum info nginx
```

### 特定のリポジトリを無効にしてパッケージをインストール

```
yum install --disablerepo="epel" haproxy
```

### 使用できるリポジトリ一覧を出す

```
yum repolist

yum repolist all
```

### パッケージのURLを直接していしてインストールする

```
yum install http://repo.zabbix.com/zabbix/2.0/rhel/6/i386/zabbix-release-2.0-1.el6.noarch.rpm
```
Xamarin.Android で Intent を受けとるには？


例えば、他のアプリからテキストを「送る」して、自作の Xamarin アプリでそれを受け取りたい時。

普通の Android アプリ開発だと ``AndroidManifest.xml`` にこう書く。

```xml:AndroidManifest.xml
<activity
  android:name="com.example.intenttest.MainActivity"
  android:label="@string/app_name" >
  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>

  <intent-filter>
    <action android:name="android.intent.action.SEND" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="text/plain" />
  </intent-filter>
</activity>
```

Xamarin.Android では、Activity のソースファイルの属性として、以下のように書く。

```csharp:MainActivity.cs
[Activity(Label = "MainActivity", MainLauncher = true)]
[IntentFilter (new []{ Intent.ActionSend }, 
  Categories = new []{ Intent.CategoryDefault },
  DataMimeType = "text/plain" )]
public class MainActivity : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
```

テキストでない場合は、mimetype を適宜変更する。省略したら動作しなかった。
JSXでUnderscore.jsとかjson2.jsを使う


## 1.jsファイルをダウンロードしてくる

**Underscore.js**
http://underscorejs.org/underscore-min.js

**JSON.js**
https://github.com/douglascrockford/JSON-js

## 2.好きな場所に置く

どこでもいいのだけどESTのデフォルトの置き場が~/Documents/Adobe Scripts/だからその下にlibというフォルダを作って置いた。

- ~
	- Documents
		- Adobe Scripts/
			- lib/
				- json2.js
				- underscore-min.js

## 3.JSXで読み込む

普通に。

```javascript:test.jsx
(function(){
   var scriptdir = "~/Documents/Adobe Scripts";
   $.evalFile(scriptdir+"/lib/underscore-min.js");
   $.evalFile(scriptdir+"/lib/json2.js");
   $.writeln(_.isArray([])); // -> treu
   $.writeln(_.isObject(JSON.parse("{}"))); // -> true
}).call(this);
```

無名関数で書くときはきちんと.call(this)しないとJSXのグローバルオブジェクトである$.globalがスコープのthisに代入されないのでexportが上手くいかないことに注意。

## 4.まとめ

どうせできないだろと思っていたら思いの外簡単に外部jsを使うことができた。
これでPhotoshopの自動化が捗ると思う。
RadioButtonList/CheckBoxListで、コントロール本体に属性を設定する

ASP.NETをやったことがある人は、必ず一度はRadioButtonListかCheckBoxListで困ったことがあるはず。

特に理解できないのが、ラジオボタン/チェックボックス本体に属性がつけられない点だ。

```
<asp:RadioButtonList ID="rblList" runat="server">
  <asp:ListItem Value="A" Text="A" class="hoge" />
  <asp:ListItem Value="B" Text="B" />
</asp:RadioButtonList>
```

こうやって書くと誰もが`<input type="radio" value="A" class="class"/>`というような出力を期待するが、そうは問屋が卸さない。レンダリングされた結果は、下記のようになる。

```
<span id="rblList" >
  <span class="hoge">
    <input id="rblList_0" type="radio" name="ctl00$rblList" value="A">
    <label for="rblList_0">A</label>
  </span>
  <input id="rblList_1" type="radio" name="ctl00$rblList" value="B">
  <label for="rblList_1">B</label>
</span>
```

まず指定した属性は直接inputにはつかず、外側のspanに付与される。また、IDは改変されnameは推定できない値となり、もうjQueryとかで値を取ろうとすると大変な騒ぎなのであります。

また、inputに属性がつけられないためJavaScriptフレームワークの活用も道が遠のく。

そんな絶望感あふれるこれらのコントロールだが、レンダリング方法をカスタマイズする方法がある。

`WebControlAdapter`を継承したクラスを作成し、App_Browsers/setting.browser (ファイル名は何でも可)でそのクラスを特定コントロールのレンダリング時に使用する、としておけばこの問題は回避可能だ。

詳細はこちらご参考。古い記事だがあまり知られていないと思う。
[How To: Control Adapters](
http://www.singingeels.com/Articles/How_To_Control_Adapters.aspx)

各Itemの処理時に下記のような感じでやっておけば。。。(※実際は、AddAttributeは固定値ではなくコントロール上の属性を設定)

```vbnet
For i As Integer = 0 To targetControl.Items.Count - 1
    writer.WriteFullBeginTag("div")
    writer.AddAttribute("class", "hoge")
    repeaterInfo.RenderItem(ListItemType.Item, i, New RepeatInfo(), writer)
    writer.WriteEndTag("div")
Next
```

レンダリング結果はこんな感じになるはず。

```
<div>
    <input id="rblList_0" type="radio" name="ctl00$rblList" value="A" class="hoge">
    <label for="rblList_0">A</label>
  </span>
```

これでだいぶ使いやすくなります。
etcd で 20 行くらいで continuous integration 的なものを構築する


漢なら通知系は etcd ですね!

https://coreos.com/using-coreos/etcd/

etcd を使って continuous integration 的なものも容易に構築できます.

まず, worker(build)ノードで以下のような node.js + shelljs でスクリプトを作ります.
curl をインストールしておくのを忘れずに.

etcd 自体は REST + JSON なので言語を選ばず利用できますが, 簡単に Mac/Linux/Windows でクロスプラットフォームを実現できるので node.js + shelljs をオススメします.

サーバ(remote)側に etcd を入れて port 4001 で動作させ, worker ノードからは ssh でログインできるものとします.

```
require('shelljs/global')


function worker() {
	console.log("wait notify");
	exec("ssh remote curl -s -L http://127.0.0.1:4001/v2/keys/build_notify?wait=true", function(code, output) {

      // Describe your build instruction here.
	  exec('git pull');
      …
 

  	  setTimeout(function() {
		  worker();
	  }, 0);
    });
}

worker();
``` 

wait=true にすると build_notify キーに変更があるまでブロックします. exec() をコールバック付きで記述しないと待っている間 CPU リソースを使うので注意ください.

あとはサーバ側なり git repo 側で, なにかしらイベント(git commit など)があったときに以下のように build_notify キーをアップデートするようにします.

```
curl -s -L http://127.0.0.1:4001/v2/keys/build_notify -XPUT -d value="notify"
```

キーにアップデートがあると, wait=true で待っているクライアントに通知が行きます. etcd 内部でキーには atomic なインデックスが付いていますので, wait=true のあとでキーが変更されたときのみ通知が行きます. 便利ですね!

# まとめ

etcd に対して, worker は複数登録して待つことができます. etcd は分散キーバリュー的なものなので, ビルドサーバが 1,000 ノードくらいあっても余裕かもしれませんね!


# todo

認証周りを SSL クライアント証明書ベースにする.
JSXで外部JSXファイルを読み込む


```javascript:ef.jsx
var external = $.evalFile("~/Documents/Adobe Scripts/External.jsx");
```

$.evalFileメソッドを使うと外部js/jsxファイルをモジュール的に読み込むことができる。
Underscore.jsとか自作のライブラリも使えるかもしれない。

これに気がつかずにFileとevalを使ったローダを作ってしまったことはヒミツである。

## 参照
https://wwwimages2.adobe.com/content/dam/Adobe/en/products/indesign/pdfs/JavaScriptToolsGuide_CS5.pdf
開発用ローカルサーバを立ち上げる方法

## はじめに

Webアプリケーション開発の動作確認用にファイルシステムの一部をローカルサーバに立ち上げてブラウザからアクセスするにはどうしたらよいか、できるだけ初歩的に説明します。

## Pythonの場合

Pythonが動作する環境であればこれが簡単です。Pythonの標準ライブラリには専用モジュールがありコマンドラインから直接起動できます。Python2と3でモジュール名が異なりますのでそれぞれ説明します。

Python2ではSimpleHTTPServerを使います。ポート番号を省略すると8000が用いられます。

    $ python -m SimpleHTTPServer [ポート番号(デフォルトは8000)]

Python3ではhttp.serverを使います。

    $ python3 -m http.server [ポート番号(デフォルトは8000)]

これでブラウザから`http://localhost:8000`(または単に`localhost:8000`)にアクセスすれば起動したディレクトリをルートとしてサーバを起動します。ディレクトリに対するアクセスには次のように応答します(Apacheサーバのデフォルト動作と同じ)。

* index.htmlがある場合はindex.htmlで応答
* index.htmlがない場合はディレクトリスティングを表示

サーバの終了はCtrl-Cです。

## Rubyの場合

Ruby 1.9.3以上にはKernelモジュールにhttpd関数があり、コマンドラインから次のように起動できます。機能はPythonと同じです。

    $ ruby -run -e httpd . -p 8000

> 実は今までこれを知らず、初稿をアップした直後に表示された関連投稿の中から発見しました(その直後にudzuraさんからコメントも頂きました。ありがとうございます)。でもRubyプログラマならやはり次の方法をおすすめします。

私はRubyプログラマで、いつも [Rack](http://rack.github.io/ "Rack: a Ruby Webserver Interface") gemを使っています(1.9.3より前のRubyも可)。まずRackをインストールします。

> Rackは多くのRubyフレームワークで用いられています。特にRuby on Railsをインストールしている方はすでに入っていますのでこの操作は不要です。

    $ [sudo] gem install rack

> sudoはシステムディレクトリにRubyをインストールしている場合に必要です。(私が使っている)[rbenv](https://github.com/sstephenson/rbenv "rbenv")や[RVM](https://rvm.io/ "Ruby Version Manager (RVM)")などのバージョン切り替えツールを使っている場合は不要です。

次にサーバを立ち上げるディレクトリに`config.ru`という名前の小さなファイルを作成します。中身は次の一行だけです。

``` ruby:config.ru
run Rack::Directory.new '.'

```

これで準備完了です。最後に`rackup`コマンドで立ち上げます(以下は起動例)。デフォルトポート番号は9292で、指定する場合は`rackup -p 8000`(例)です。

```
$ rackup
[2014-04-01 14:18:53] INFO  WEBrick 1.3.1
[2014-04-01 14:18:53] INFO  ruby 1.9.3 (2013-06-27) [i686-linux]
[2014-04-01 14:18:53] INFO  WEBrick::HTTPServer#start: pid=5814 port=9292
```

なおディレクトリに対するアクセスには常にディレクトリリスティングを返します(index.htmlがあってもファイルの一つとしてリスト表示)。開発用にはこれで十分でしょう。一度設定してしまえば後は`rackup`だけで起動します。

Rackの利点はいくらでもカスタマイズできることで、`config.ru`にRubyコードを記述してサーバサイドプログラミングをフレキシブルに行うことができます。ただしこれ以上は本稿の趣旨から外れますので詳しい説明は割愛します。

> 私の最新作「[天気データマップ](https://github.com/higuma/tenki-data-map)」のサーバサイドもRackで作られています。Rackについては後で別途説明する機会を持ちたいと思います。

## Node.jsの場合

私はNode.jsはあまり詳しくないのですが、Node.js版ローカルサーバを作っている方を知っていますので紹介します(私も動作確認しました)。詳しくは下記サイトの説明をお読み下さい。

<https://github.com/shimizu/SimpleWebServer>

> 投稿後すぐにka_さんからコメント頂きました。nodeモジュールがいくつかあるそうです。
> 
> * <https://www.npmjs.org/package/http-server>
> * <https://www.npmjs.org/package/simple-server>
> * <https://www.npmjs.org/package/simple-http-server>
> 
> ka_さんのコメントがよくまとめられていますので詳しくはそちらをご覧ください。

## PHPの場合

kimama1997さんからPHP版のコメントを頂きましたので追加します(PHP 5.4+)。詳しくはコメント欄をご覧ください。

    $ php -S localhost:3000

> ちなみに私はPHPの経験はありますが現在使っておらず、今の開発環境にはインストールしていません。
CSSを全部切るブックマークレット

```js
(function(a,b,i){a=document.querySelectorAll('[rel="stylesheet"],style');for(i=0;i<a.length;i++){b=a[i];b.parentNode.removeChild(b)}a=document.querySelectorAll('[style]');for(i=0;i<a.length;i++){a[i].removeAttribute('style')}})();void 0
```

探せばどこかにあるだろうし自分でもどこかで書いた記憶があるけれど、今さっき書いたのでage。

1. 外部CSS読み込みの`<link>`と埋め込みCSSの`<style>`を削除
2. 個別指定の`style`属性を持つ要素からそれを削除

削除するので復元は出来ません。（リロードしてね。）
Railsのcarrierwaveでアップロード済みの画像をコピーする方法


すでに、アップロード済みのorg_imageのavatarをnew_imageのavatarにコピーする場合。

``` org_image.rb
class OrgImage < ActiveRecord::Base
	mount_uploader :avatar, ImageUploader

	xxxxx
	xxxxx

end

````

``` new_image.rb
class NewImage < ActiveRecord::Base
	mount_uploader :avatar, ImageUploader

	xxxxx
	xxxxx

end

````



``` controller.rb


def image_copy
	org_image = OrgImage.find(id)
	new_image = NewImage.new
	new_image.avatar = org_image.avatar.file
	new_image.save
end

```
jshint でケツカンマを見つける

vim で syntastic プラグインを使っています。
とても便利。JavaScript の文法チェックもOK。
だけど、最近、ケツカンマを見つけてくれなくなったので、その解決策

jshint のオプションを設定してやります。
ユーザーのホームディレクトリに .jshintrc を作ってその中に JSON でオプションを書きます。

[JSHintのoption一覧](http://qiita.com/HieroglypH/items/3cb16ecff43b8e5f62e1)

というとても便利な記事があります。

ケツカンマを見つけるには es3 オプションを true にします。

    {
        "es3": true
    }

以上です。
Xcode5環境でKiwiを導入する

#CocoaPodsを導入

```bash
$ gem install cocoapods
$ pod setup
```

#テストターゲットの追加
プロジェクトにテストターゲットがあればそのまま、
![イメージ001.jpg](https://qiita-image-store.s3.amazonaws.com/0/8748/8f9af969-991a-40ff-fc6e-d96b4eeebfa4.jpeg)

なければ、左下の+を押して追加する。
![イメージ002.jpg](https://qiita-image-store.s3.amazonaws.com/0/8748/5e7db8dc-07c4-1003-8bbd-75f42962e4da.jpeg)

#Podfileの作成
プロジェクト直下にPodfileを作成する。

```rb:Podfile
# Podfile
platform :ios, '7.0'
target :KiwiSampleTests, :exclusive => true do
    pod 'Kiwi/XCTest'
end
```

#kiwiのインストール
Xcodeを終了してから、

```bash
$ pod install
Analyzing dependencies
Downloading dependencies
Installing Kiwi (2.2.4)
Generating Pods project
Integrating client project

[!] From now on use `KiwiSample.xcworkspace`.
```

プロジェクト名.xcworkspaceが作成されるので、そちらを開く。

#テスト作成
KiwiSampleTestフォルダ以下に、SampleSpec.mというファイルを作成する。

```objc:SampleSpec.m
#import "Kiwi.h"

SPEC_BEGIN(MathSpec)

describe(@"Math", ^{
    it(@"is pretty cool", ^{
        NSUInteger a = 16;
        NSUInteger b = 26;
        [[theValue(a + b) should] equal:theValue(42)];
    });
});

SPEC_END
```
cmd+Uでテストが実行される。

ソースコードの左側のボタン的なものを押すと、SPEC_BEGIN単位で実行できる。
（itやdescribe単位で実行できないのがいまいち）
![イメージ003.jpg](https://qiita-image-store.s3.amazonaws.com/0/8748/99af02fd-56fd-42d5-d2f1-fcbe4dd3807f.jpeg)

#非同期テスト

```objc
SPEC_BEGIN(AsyncTest)
context(@"Fetching service data", ^{
    it(@"should receive data within one second", ^{
        NSURL *url = [NSURL URLWithString:@"http://mixi.jp"];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];

        __block NSString *fetchedData = nil;
        NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request
                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                                if (error) {
                                                    return;
                                                }
                                                fetchedData = [[NSString alloc] initWithData:data encoding:NSJapaneseEUCStringEncoding];  //mixiはEUC-JP
                                            }];
        [task resume];

        [[expectFutureValue(fetchedData) shouldEventually] beNonNil];  //ここで最長1秒待ってから評価する（デフォルト）
    });  
});

SPEC_END
```

#サンプルコード
https://github.com/kinukawa/kiwiSample
ビットコインのブロックチェーンの技術的な説明 まとめ

以下に移行しました<br><a href="http://block-chain.jp/tech/bitcoin-blockchain/" title="ビットコインのブロックチェーンの技術的な説明 まとめ">ビットコインのブロックチェーンの技術的な説明 まとめ</a>
予期せずignoreされてしまい悲しみの淵にあるファイルに手をさしのべるには


`git ignore 原因` で検索するならば下記が役立つかも。

# 何がおきた
`images/icons/file.png` みたいなファイルをプロジェクトに追加しようとしたのに、`$ git status`に表示されない。
ファイルは存在するが、下記のような状況

```
$ git add images/icons/file.png
The following paths are ignored by one of your .gitignore files: 
images/icons                          
Use -f if you really want to add them.                           
fatal: no files added
```

`.gitignore`ファイルの仕業だということはわかったが、プロジェクトのもグローバルのも該当しそうな記述がみつからない。

とりあえず`$ git add -f` すれば解決だが、今後同様のことが起きないとも限らない。

# どうする
```
% git check-ignore -v images/icons                            
/Users/marutanm/.gitignore_global:33:Icon?       images/icons
```

`$ git-check-ignore`で、原因判明。
[gitignoreリポジトリ](https://github.com/github/gitignore/blob/master/Global/OSX.gitignore)からコピペしていた記述が古かったため、iconsディレクトリが丸ごとignore対象になっていた。

# 参考
- [git - which gitignore rule is ignoring my file - Stack Overflow](http://stackoverflow.com/questions/12144633/which-gitignore-rule-is-ignoring-my-file)
- [git-check-ignore(1) Manual Page
](http://git-scm.com/docs/git-check-ignore.html)
- [git 1.8.2 リリースノートを眺めて、新機能把握と設定を追加 | Act as Professional - hiroki.jp](http://hiroki.jp/2013/03/14/6836/)
技術者向けビットコイン、ブロックチェーンの基礎用語 まとめ

以下に移行しました<br><a href="http://block-chain.jp/tech/bitcoin-blockchain-basic-terms/" title="技術者向けビットコイン、ブロックチェーンの基礎用語 まとめ">技術者向けビットコイン、ブロックチェーンの基礎用語 まとめ</a>
Macアプリを開いている間はスリープさせない２行。


サイネージ用アプリ、VJアプリなんかを作るときに、
いちいちMacの省エネルギー、スクリーンセーバーを変えるのはイケてないので。
アプリが開いている間はスリープしないようにする設定。

## 使い方

```objectivec:SampleAppDelegate.m

#import "LittleCaffeine.h"

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{    
    LittleCaffeineEnable();
}


- (void) applicationWillTerminate:(NSNotification *)notification
{
    LittleCaffeineDisable();
}


```


## ソース

```objectivec:LittleCaffeine.h
//
//  LittleCaffeine.h
//
//  This is tiny utility inspired by Caffeine http://lightheadsw.com/caffeine/
//
//  Created by Koki Ibukuro on 2014/04/01.
//  Copyright (c) 2014年 Koki Ibukuro. All rights reserved.
//

#pragma once

#ifndef Little_Caffeine_h
#define Little_Caffeine_h

#import <Foundation/Foundation.h>
#import <IOKit/pwr_mgt/IOPMLib.h>

static IOPMAssertionID assertionID;

static BOOL LittleCaffeineEnable() {
    
    // https://developer.apple.com/library/mac/qa/qa1340/_index.html
    
    CFStringRef reasonForActivity= CFSTR("Little Caffeine for Wake Up");
    IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep,
                                                   kIOPMAssertionLevelOn, reasonForActivity, &assertionID);

    if (success == kIOReturnSuccess) {
        return YES;
    }
    else {
        assertionID = -1;
        return NO;
    }
}

static BOOL LittleCaffeineDisable() {
    IOReturn success = NO;
    if(assertionID > 0) {
        success = IOPMAssertionRelease(assertionID);
    }
    
    if(success == kIOReturnSuccess) {
        return YES;
    }
    else {
        return NO;
    }
}

#endif


```
Redisのデータをダンプしてリストア（インポート）するツールrdd


複数のredisのデータを統合したい等、rdbファイルでのバックアップだけでは困る場合に。

https://github.com/r043v/rdd

## インストール

```
# hiredisが必要
yum install gcc
git clone https://github.com/redis/hiredis.git
cd hiredis/

make
make install

# hiredisのdirにrdd.cをダウンロードするのが一番簡単
wget https://raw.githubusercontent.com/r043v/rdd/master/rdd.c --no-check-certificate

gcc -std=c99 rdd.c libhiredis.a -o /usr/local/bin/rdd
```

## 使い方

基本はreadme
https://github.com/r043v/rdd


```
# 特定のkeyをsave1.rddにdumpする
rdd "keyname*" -o save1.rdd -s localhost -p 6379 -a masterpass

# ダンプファイルからデータをimportする
rdd save1.rdd -o insert -s localhost -p 6379

# ダンプファイルから特定のキーを除外する
rdd save1.rdd -f "*20140331*" -o save2.rdd

```


使ってみたところdumpfileが2G以上のものをimportしようとするとsegvで落ちるようです。
カジュアルに使ってみる分には便利かも。
GroovyのClosureを途中で止める

たまに途中で止めたくなるClosureの止め方。
Javaのループ感覚でbreakしても止まらない。

↓ 1,000までのリストを888で止める場合

```groovy
(1..1000).each {
    if (it > 888) return true
    println it
}
```

## 追記（2014/4/5）
ただ、この方法だと1000までは評価しているから厳密には止まってなくて、処理をしていないだけ。ホントの意味で止める方法はあるんだろうか？

ちなみに、continueするのも同じような方法でできる。

↓888の時は処理しないで次に飛ぶ。

```groovy
(1..1000).each {
    if (it == 888) return true
    println it
}
```
scikit-learn によるナイーブベイズ分類器

## ナイーブベイズの概要

ナイーブベイズ分類器は特徴ベクトル間に条件付き独立性を仮定したベイズ定理に基づく分類器です。現実の問題では特徴を表す素性同士に何らかの相関が見られるケースが多々ありますが、独立性仮定によって計算量を簡素化・削減し、高速でそこそこの精度を誇る分類器を実装することができます。

### ベイジアンとヒューリスティクス

これらを鑑みるとそもそも元より高精度を期待できる分類器ではないですし、諸々の論文等では比較対象として負けるための分類器とまで言う声も聞かれるほどです。多くは独立性を仮定するべきではない問題に適用しているからで当たり前なのですが、筆者の私見としてはナイーブベイズはヒューリスティックな問題に高い実用性を発揮すると思います。例えばテキストマイニングといった完全性を追い求めるのがなかなか難しい分野において、高速である程度の正解率を叩きだす分類器として実用性能が高いでしょう。

### ナイーブベイズの亜種

ある程度の独立性を緩和した Semi Naive Bayes といった亜種も多く研究されています。たとえば [AODE (Averaged One-Dependence Estimators)](http://ja.wikipedia.org/wiki/AODE) などはその代表例です。とはいえ今回はそのような亜種に関する話は他所に置いておきます。

## 分類器の実装と確率分布

[scikit-learn](http://scikit-learn.org/stable/modules/classes.html) には執筆時点で主に [3 種類のベイズ分類器](http://scikit-learn.org/stable/modules/naive_bayes.html#naive-bayes)が実装されています。

ベイズ分類器が仮定する確率分布については[前回](http://qiita.com/ynakayama/items/1d450dad701e343a5a5f)や[前々回](http://qiita.com/ynakayama/items/436210e27524b4b0686e)に書きました。

テストとして 3 つのラベルについてそれぞれ次のような特徴ベクトルを得られたとしましょう。

| ラベル        |特徴ベクトル   |
|:-----------|:------------|
|1|[1,2,3,4,5,6,7,8]|
|2|[1,1,3,4,5,6,6,7]|
|3|[2,1,2,4,5,8,8,8]|

これを教師データとして学習し、テストとして次の特徴ベクトルをラベルに分類します。

|テストデータ   |
|:------------|
|[2,2,4,5,6,8,8,8]|


### 正規分布を仮定する

連続変数 x に正規分布 (ガウシアン分布) を仮定する場合、平均を μ 分散を σ^2 とすると分布は次のようになります。

```math
p(x; \mu, \sigma^{2}) = \frac{1}{\sqrt{2\pi\sigma^{2}}}\exp^{\Bigl\{-\frac{(x-\mu)^{2}}{2\sigma^{2}}\Bigr\}}
```

[sklearn.naive_bayes](http://scikit-learn.org/stable/modules/naive_bayes.html) に実装された分類器を利用します。

```py3
import numpy as np
from sklearn.naive_bayes import GaussianNB # ガウシアン
X = np.array([[1,2,3,4,5,6,7,8],
              [1,1,3,4,5,6,6,7],
              [2,1,2,4,5,8,8,8]]) # 特徴ベクトル
y = np.array([1, 2, 3]) # そのラベル
t = np.array([2,2,4,5,6,8,8,8]) # テストデータ

clf = GaussianNB() # 正規分布を仮定したベイズ分類
clf.fit(X, y) # 学習をする
clf.predict(t) # => [3]
```

テストデータは 3 番のラベルに分類されました。

### ベルヌーイ分布を仮定する

特徴が 0 と 1 で表されるようなベクトルについてはベルヌーイ分布を仮定します。観測変数が二値であることが前提というわけですね。

```math
p(x;q) = q^{x}(1-q)^{1-x}
```

実験用のデータはベルヌーイ分布を仮定するのはおかしいですが、あえてコードを書いて動かしてみましょう。

```py3
from sklearn.naive_bayes import BernoulliNB
clf = BernoulliNB()
clf.fit(X, y)
clf.predict(t) #=> [1]
```

### 多項分布を仮定する

ベルヌーイをコイントスの表と裏に例えるなら、多項分布は複数の面があるダイス (サイコロ) です。すなわち 1, ..., k の数だけ値を取りうるという事になります。ベルヌーイ分布は k=2 の多項分布ととらえても等価です。

```py3
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)
clf.fit(X, y)
clf.predict([t]) #=> [2]
```

## まとめ

いかがでしたでしょうか。
実際のデータ分析においては、分類器そのものを実装して動かすのは容易であり、実データにフィットする確率分布のモデルを仮定するのが決め手となることがおわかりになったかと思います。

現実的にはうまく確率分布をフィットさせるのはなかなか難しく、特に変化のあるデータについては持続的に観察し分析を継続することが大切です。
middlemanのasset_hashをscssやjsで使う方法


http://middlemanapp.com/jp/advanced/configuration/

asset_hashとはキャッシュを回避するために、file名にMD5のハッシュ値を付けるもの。
内容が変わる時のみMD5の結果が変わる。



```:config.rb

	configure :build do
	~~~
  	activate :asset_hash
	~~~
	end

```



## assetのpathをscssやjsで展開する

railsのやり方とほぼ同様の模様らしいので、参考URLはrailsのもの。

###scssの場合

http://edgeguides.rubyonrails.org/asset_pipeline.html#css-and-sass

####scssで使う時、

```
#hoge{
	background-image: image-url("../images/fuga.png");
	background-image: url(image-path("../images/fuga.png") );
}

```

####middleman serverの時

```
#hoge {
  background-image: url("../images/fuga.png");
  background-image: url("../images/fuga.png"); }
```

####middleman buildすると

```
#hoge{
  background-image:url("../images/fuga-b76b5a81.png");
  background-image:url("../images/fuga-b76b5a81.png")
}
```

###javascriptの場合
http://edgeguides.rubyonrails.org/asset_pipeline.html#javascript-coffeescript-and-erb

jsファイルで使う場合は、拡張子に.erbをつけてhoge.js.erbのようにする。
railsのページでは`asset_path`を使っているが、middlemanだとerrorが起きたので、`asset_url`を使う。

####hoge.js.erb

```
{src:"<%= asset_url 'logo.png', 'images/' %>"},
{src:"<%= asset_url 'map@2x.png', 'images/' %>"},
{src:"<%= asset_url 'mrt.png', 'images/' %>"},
```

####middleman serverの時

```

{src:"../images/logo.png"},
{src:"../images/map@2x.png"},
{src:"../images/mrt.png"},
```

####middleman buildの時

```
{src:"../images/logo-bb0b7bcf.png"},
{src:"../images/map@2x-49797249.png"},
{src:"../images/mrt-8dc0fac1.png"}

```

-------------------------

asset_hostを設定するとasseteが読み込むhostを設定できる。
クラウドフロント等CDNを使う時に役立ちそう。

https://github.com/middleman/middleman/search?q=asset_host&ref=cmdform

```:config.rb
activate :asset_host
      set :asset_host, "http://assets1.example.com"

```

```
<%= javascript_include_tag "app" %>
```

```
    <script src="http://assets1.example.com/javascripts/app-5c110269.js" type="text/javascript"></script>

```
【初めてのRails4】 インストール編


[Ruby on Rails](http://rubyonrails.org/)を触ることになったので、[Ruby on Rails チュートリアル](http://railstutorial.jp/)を参考にしながら作成記録のメモ

## 環境

* CentOS6.4
* Rails 4.0.4

## 参考にしたサイト

* [Ruby on Rails チュートリアル
](http://railstutorial.jp/)
* [Rails Girls ガイド](http://railsgirls.jp/)

## Rubyのインストール

Ruby 2.x ~系を入れましょう。

## [rbenv](https://github.com/sstephenson/rbenv)のインストール

rbenvはRubyのバージョンを簡単に切り替えることができるものです。
Rubyのバージョンを追随するために色々便利ですので入れましょう。

システムワイド(どのユーザーでも共通のrbenv)に入れます。

```shell:/usr/local
git clone https://github.com/sstephenson/rbenv.git
mkdir /usr/local/rbenv/plugins
chmod -R g+rwxXs /usr/local/rbenv/
```

## [ruby-build](https://github.com/sstephenson/ruby-build) のインストール

Rubyのビルドを簡単に行えます。
[rbenv](https://github.com/sstephenson/rbenv)のpluginとして導入します


```shell:/usr/local/rbenv/plugins
git clone https://github.com/sstephenson/ruby-build.git
```


## [ruby-binstubs](it://github.com/ianheggie/rbenv-binstubs.git)のインストール

```bundle exec {command}```から開放されましょう。面倒でダルいです　

```shell:/usr/local/rbenv/plugins
cd /usr/local/plugin
git clone https://github.com/ianheggie/rbenv-binstubs.git
```

## [rbenv-gem-rehash](https://github.com/sstephenson/rbenv-gem-rehash)のインストール

rbenvを使用してgemをインストールした場合はrbenvのシンボリックリンクを更新するために```rbenv rehash```をtypoしなくてはなりませんが、打ち忘れで「あれ。。。。gemインストールしたのにgemがない。。。。」ってのはよくある事です。そんな煩わしい事したくないので自動でgemをインストールしたらrehashできるようにします。

```shell:/usr/local/rbenv/plugins
git clone https://github.com/sstephenson/rbenv-gem-rehash.git
```


## rbenv.shを作る

bash profileを作成します

```shell:/etc/profile.d/rbenv.sh
export RBENV_ROOT="/usr/local/rbenv"
export PATH="/usr/local/rbenv/bin:$PATH"
eval "$(rbenv init -)"
```

* sourceコマンドでrbenvを反映

```
source /etc/profile.d/rbenv.sh
```

## rbenv動作確認

```
which rbenv
/usr/local/rbenv/bin/rbenv
```

## Rubyのインストール

```shell
#入れたいRubyのバージョンを調べるにはrbenv install -lで一覧ができます
rbenv install 2.0.0-p451
rbenv global 2.0.0p247 
rbenv rehash
```

## Rubyのインストール確認

インストールされたかどうか確認しましょう

```
ruby -v


ruby 2.0.0p451 (2013-11-22 revision 43784) [x86_64-linux]
```

## Rails4のインストール

gemでサクッと

```shell
gem install rails --no-ri --no-rdoc
```

これでRuby on Railsと戯れる環境出来上がりです。
エイプリルフールだし押さえておきたいGitHubのジョークリポジトリ7選


#1.git-jokes

https://github.com/EugeneKay/git-jokes
Gitに関わるジョーク集です。

#2.Spoon-Knife

https://github.com/octocat/Spoon-Knife
スプーン、ナイフと来たら？
そう、フォークですよね。forkしましょう。

#3.エンタープライズFizzBuzz

https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition
もしも、エンタープライズなプログラマがFizzBuzzを書いたら。。

#4.libpenis

https://github.com/Cubox-/libpenis
このライブラリを使えば、すべての条件式をpennisに。
ライセンスにも注目。

#5.job_interview

https://github.com/ruby-jokes/job_interview
プログラマの面接でありがちな問題を一瞬で解くことのできる
すばらしいライブラリ。

#6.彼氏に求めるもの
https://github.com/norinori2222/boyfriend_require
ジョークなのかわからないけど、彼氏に求める条件を列挙してある。

#7.ハッカーっぽくタイピングできる
https://github.com/duiker101/Hacker-Typer
誰でもハッカーっぽくタイピングできるツール。

他にもあったら、コメントか修正リクエストください。
PadrinoでWheneverをつかってみる


## Wheneverとは

wheneverはcrontab管理用ライブラリ。

要はRubyでcronの設定が書けるライブラリ。

## インストール
```Gemfile
gem 'whenever', :require => false
```

```
$ bundle install
```

## 基本的な使いかた

### schedule.rb作成

```
$ cd padrino_project
$ wheneverize .
```

これで、`padrino_project/config/`以下にschedule.rbが作成される。

### 設定

例えば、3時間毎にrakeタスクを動かしたいときは以下のように設定する。

```schedule.rb
# ３時間毎に
every 3.hours do
  rake "my:rake:task"
end
```

job typeは`rake`以外にも`command`, `runner`, `script`が設定できる。

詳しくは[README](https://github.com/javan/whenever 'javan / whenever')に書いてある。

### crontabに書き出す

```
$ whenever -w
```

### 確認

crontabに正しく書きだされているか確認する場合は

```
$ crontab -l
```

## 応用的な使い方

### job typeの作成

デフォルトで設定されているjob typeは`rake`, `command`, `runner`, `script`だが、自分で新しいjob typeを作成できる。

`padrino_rake`というjob typeを作成してみる。
`export PATH=\"$HOME/.rbenv/bin:$PATH\"; eval \"$(rbenv init -)\";`の部分はrbenvを利用してる場合。

```schedule.rb
job_type :padrino_rake, "export PATH=\"$HOME/.rbenv/bin:$PATH\"; eval \"$(rbenv init -)\"; cd :path && :environment_variable=:environment bundle exec padrino rake :task --silent :output"
```

`:path`, `:environment_variable`, `:environment`, `:task`, `:output`は変数。

### 変数に値をセット
上で出てきた変数に値をセットしてみる。

```schedule.rb
job_type :padrino_rake, "export PATH=\"$HOME/.rbenv/bin:$PATH\"; eval \"$(rbenv init -)\"; cd :path && :environment_variable=:environment bundle exec padrino rake :task --silent :output"

# setで変数に値をセットできる。
set :output, "/path/to/cron_log.log"

# 引数を追加することでも変数に値をセットできる。
# 第一引数は:taskにセットされる。
every 3.hours do
  padrino_rake "myrake:task", :environment_variable => "RACK_ENV", :environment => "development"
end
```

`:task`以外の変数への値のセットは省略可能で省略した場合はデフォルト値が設定される。

各変数のデフォルト値は

```
:path                 => wheneverが実行されたディレクトリ
:environment_variable => 'RAILS_ENV'
:environment          => 'production'
```

### 環境ごとに設定を変える場合

設定ファイルを環境ごとに分ける。

```schedule_development.rb
job_type :padrino_rake, "export PATH=\"$HOME/.rbenv/bin:$PATH\"; eval \"$(rbenv init -)\"; cd :path && :environment_variable=:environment bundle exec padrino rake :task --silent :output"

set :output, "/path/to/cron_log.log"
set :environment_variable, "RACK_ENV"
set :environment, "development"

every 3.hours do
  padrino_rake "myrake:task"
end
```

```schedule_production.rb
job_type :padrino_rake, "export PATH=\"$HOME/.rbenv/bin:$PATH\"; eval \"$(rbenv init -)\"; cd :path && :environment_variable=:environment bundle exec padrino rake :task --silent :output"

set :output, "/val/log/cron"
set :environment_variable, "RACK_ENV"
set :environment, "production"

every 3.hours do
  padrino_rake "myrake:task"
end
```


crontabに書き出す

```
$ whenever -w -f config/schedule_development.rb
```

## 参照
* [酒と泪とRubyとRailsと - Wheneverは導入が超簡単なcrontab管理ライブラリGemです！[Rails]](http://morizyun.github.io/blog/whenever-gem-rails-ruby-capistrano/ '酒と泪とRubyとRailsと
')
* [平凡なエンジニアの独り言 -  Whenever gemを使ってRubyで簡単にcronを設定してみた](http://akasata.com/articles/304 '平凡なエンジニアの独り言')
postfixでmaillogを追う

最近はサーバとかの設定や  
エラー、障害対応やってます。  
　　
postfixでエラーにはまったのでメモ。  
  
まず
```
find / -name log  
```
これでログ場所の確認。  
linuxを触っているのでコマンドのメモもふまえます。   
  

status=  
ここでステータスの確認ができるらしい。  
  
status=deferred どうやらこれがエラーログっぽい。  
一時的に配送できなかったらしい。  
  
というより、  
Service unavailableとでているので利用不可ということかな。  

blocked usingとの記載もあった。  
何らかの形でブロックされている形になってしまったらしい。  
  
これは問い合わせの流れ。  
  
status=sent  
これで送信確認。  
  
因みに
```
tail -f test
```
これがすごい。  
リアルタイムで、最新のログが表示されます。  
感動しました。
  
ログとstatusの確認を念頭に。  
それでは今後ともよろしくお願いいたします。
shell : catコマンド 最後に改行を入れて表示

catコマンドで最後の改行が無くなるのがいやなので、こういう関数を定義する。

```bash
catln() { echo "$(cat $@)"; }
```

引数にファイル名を与えると最後の改行も表示される。

```bash
catln hoge.txt
AAA
BBB
CCC
```

catと同じオプションが使えます。全部確認してません。

```bash
catln -n hoge.txt
   1 AAA
   2 BBB
   3 CCC
```
[Ruby] YAML形式の設定ファイルをシンボルで書かない理由？


Rails依存しないgemなんか書いてると、設定ファイル上のキーをシンボルにで扱いたい時に悩む。わざわざ自力で再帰的に`symbolized_keys`的なものを書くのナンだし、何より設定内の「値」としてハッシュを書いてもらう場合なんかに、ちょっと嫌な感じになる（あまり良い例じゃないですが）。

```yaml
name: 'test'
servers:
  192.168.10.1: 'primary'
  192.168.10.2: 'secondary'
```

```ruby
config = YAML.load_file(path).my_recursive_symbolize_keys
# => {:name=>"test", :servers=>{:"192.168.10.1"=>"primary", :"192.168.10.2"=>"secondary"}}
```

どうしようかと軽く調べたら、YAMLファイル側でシンボルキーを書くシンタックスがあったことを今更知る。

```yaml
:name: 'test'
:servers:
  192.168.10.1: 'primary'
  192.168.10.2: 'secondary'
```

これなら、予約語的なものだけをシンボルにできるし、余計な処理を読み込み時に書かなくていいし、色々解決。

```ruby
config = YAML.load_file(path)
# => {:name=>"test", :servers=>{"192.168.10.1"=>"primary", "192.168.10.2"=>"secondary"}}
```

...なんだけど、自分ちのプロジェクト内ならとにかく、gemを使う人にこの記述を強いるのは少し抵抗がある。あまり見かけないから。

システム側で定義しているキーは「シンボルで書いて」とするのが幸せのような感じがするのですが、そうなってない理由があるのかな？と考えてみる。

1. 他の言語との互換性
2. この記法を扱えないyamlライブラリもあるから
3. 書く人が混乱しないように

どれも理由としては弱い感じが。どうなんでしょ。
Railsで特定のアクションだけlayoutを指定する方法


/view/layoutsは以下のapplication.html.erbを特定のアクションのみに指定する場合は以下のように指定する。

下記の例では/view/layouts/layout_1.html.erbを適用する場合

```controller
def new

	XXXXXXXX

	render layout: 'layout_1'
end

```
GroovyでDateの計算を楽にする

TimeCategoryを使うと、Dateの計算が簡単にできる。
全て別のオブジェクトになるので、テストとかに使いやすい。

```groovy
import groovy.time.*

use(TimeCategory) {
    def a = new Date("2014/4/1")
    12.times {
        println a + it.months    // 月を加算
    }
}
```

日や年、時間を計算することも可能

```groovy
// 日を加算する場合
date + it.days
// 年を減算する場合
date - it.years
// 時を加算する場合
date + it.hours
```
filter_input( INPUT_SERVER, $key ) で取得できない変数

REQUEST_TIME_FLOAT, REQUEST_TIME は $_SERVER を直接参照しないと取得できない。

```php:
<?php

var_dump(
  $_SERVER["REQUEST_TIME_FLOAT"],
  $_SERVER["REQUEST_TIME"],
  filter_input( INPUT_SERVER, "REQUEST_TIME_FLOAT" ),
  filter_input( INPUT_SERVER, "REQUEST_TIME" )
);
// float(1396327090.6449)
// int(1396327090)
// NULL
// NULL
```

あと、PHPでHTTP認証している場合に定義される PHP_AUTH_USER, PHP_AUTH_PW なども $_SERVER を直接参照しないと取得できない。

```php:
<?php

$user = filter_input( INPUT_SERVER, 'PHP_AUTH_USER');
$pw = filter_input( INPUT_SERVER, 'PHP_AUTH_PW');
if ( ! isset( $user, $pw ) ) {
  header( "WWW-Authenticate: Basic realm=\"?\"" );
  header( "HTTP/1.0 401 Unauthorized" );
  echo "401 Unauthorized";
  exit;
} else {
  echo "ok"; // 一生こっちのブロックにはこない
}
```
jsでシーン管理するライブラリつくったよ

================================
内容薄いですがとりあえず共有


元Flasherには馴染みのある、シーン管理の概念をjavascriptに導入する。
まだ低機能ですが、既にHTMLコンテンツや他のJSゲーム系アプリで利用してます。

[github](https://github.com/bobbysmv/Scene.js)
ソース

[HTMLサンプル](http://bobbysmv.github.io/Scene.js/test/test.html)
※Chromeのみ確認済

機能
---

urlライクな"シーンパス"と、それに紐づく"シーン"の組み合わせと、遷移を管理する。

使い方
-----

```
// "/"シーンの定義
Scene.add("/").set({
	onShow: function(){ console.log("/ 表示処理"); },
	onHide: function(){ console.log("/ 非表示処理"); }
});
// "/scene1"シーンの定義
Scene.add("/scene1").set({
	onEnter: function(){ console.log("/scene1以下に影響する処理"); },
});
// "/scene1/child"シーンの定義
Scene.add("/scene1/child").set({
	onShow: function(){ console.log("/scene1 表示処理"); },
	onHide: function(){ console.log("/scene1 非表示処理"); }
});

// "/"へ遷移
Scene.goto("/");

// １秒後に"/scene1/child"へ遷移
setTimeout( function(){ Scene.goto("/scene1/child"); }, 1000 );

```
シングルトンの初期化をテストするには

テストは増えてくると実行順が変わるので、シングルトンの初期化がうまくいっているかをテストするには、いったんシングルトンを棄てなければならない。

そこで、シングルトンに以下のメソッドを生やす。

```objc:Location.m
+ (void)resetSharedInstance {
    _instance = nil;
}
```

あとはテストする。

```objc:LocationTest.m
- (void)testInit
{
    [Location resetSharedInstance]; // これでシングルトンをリセットする
    GHAssertEquals([Location sharedManager].coodinate.latitude, 35.681382, @"位置情報の初期値は東京駅の座標である（緯度）");
    GHAssertEquals([Location sharedManager].coodinate.longitude, 139.766084, @"位置情報の初期値は東京駅の座標である（経度）");
}
```
Simple CPU Simulator with Excel VBA

新人研修最初の解説で、コンピュータの基礎を解説する。
「メモリの感覚を身につけられるように」=>「それならExcelでいいんじゃ?」
ということで即席で作った。

Worksheet(1)を以下のように用意する。

| Memory Address | Command Part | Address Part | Program Counter | Command Register | Address Register | Accumulator A | Accumulator B |
|----------------|--------------|--------------|-----------------|------------------|------------------|---------------|---------------|
|            100 | 読み込む     | 104          | 100             |                  |                  |               |               |
|            101 | 加算する     | 105          |                 |                  |                  |               |               |
|            102 | 書き込み     | 106          |                 |                  |                  |               |               |
|            103 | 終了         |              |                 |                  |                  |               |               |
|            104 | 7            |              |                 |                  |                  |               |               |
|            105 | 5            |              |                 |                  |                  |               |               |
|            106 |              |              |                 |                  |                  |               |               |
|                |              |              |                 |                  |                  |               |               |



`ExecuteStep'を実行するごとに、Program Counterで指定されたメモリの
命令を実行していく。


```vb:MicroComputer
Option Explicit
Private cPC As Range ' ProgramCounter
Private cCR As Range ' CommandRegister
Private cAR As Range ' AddressRegister
Private cAA As Range ' AccumulatorA
Private cAB As Range ' AccumulatorB

Sub Init()
    Set cPC = Worksheets(1).Cells(2, 4)
    Set cCR = Worksheets(1).Cells(2, 5)
    Set cAR = Worksheets(1).Cells(2, 6)
    Set cAA = Worksheets(1).Cells(2, 7)
    Set cAB = Worksheets(1).Cells(2, 8)
End Sub

Sub ExecuteStep()
    Call Init
    Call ReadOneCommand
    Call IncrementProgramCounter
    Call ExecuteOneCommand
End Sub

Sub ReadOneCommand()
    cCR.Value2 = GetCP
    cAR.Value2 = GetAP
End Sub

Function GetCP()
    GetCP = Worksheets(1).Cells(cPC.Value2 - 98, 2)
End Function

Function GetAP()
    GetAP = Worksheets(1).Cells(cPC.Value2 - 98, 3)
End Function

Sub IncrementProgramCounter()
    cPC.Value2 = cPC.Value2 + 1
End Sub

Sub ExecuteOneCommand()
    Select Case cCR.Value2
        Case "読み込む"
            Call CmdLoad
        Case "加算する"
            Call CmdAdd
        Case "書き込み"
            Call CmdStore
        Case "終了"
            Call CmdExit
    End Select
End Sub

Sub CmdLoad()
    cAA.Value2 = Worksheets(1).Cells(cAR.Value2 - 98, 2)
End Sub

Sub CmdAdd()
    cAB.Value2 = Worksheets(1).Cells(cAR.Value2 - 98, 2)
    cAA.Value2 = cAA.Value2 + cAB.Value2
End Sub

Sub CmdStore()
    Worksheets(1).Cells(cAR.Value2 - 98, 2).Value2 = cAA.Value2
End Sub

Sub CmdExit()
    MsgBox ("Exit")
End Sub

```

マルチコアのシミュレータにならんかな。
1時間毎に保存されてるログを効率よく漁る

## 実現したいこと
- その月に該当のケースにアクセスがあったかを知りたい
- ユーザーとか対象のページとかなんでもいいが、ログに吐き出してるもの

## 前提条件
- Apacheのログが1時間に1回保存されてる
- 24時間分保存されているので、2週間全部grepで調べようと思うと24時間×14日になり結構時間がかかる

## というわけで
- 1時間にログがあれば終了
- なければ終了して次の時間に移動
- というかなり変なケースに絞ったシェルスクリプト

```bash
#!/bin/bash

GREEN=$(tput setaf 2; tput bold)
RED=$(tput setaf 1)

month='03'

if [ $# -ne 1 ]; then
    echo "実行するには引数(検索対象文字)が必要です。" 1>&2
    exit;
fi

for day in `seq -w 1 16`
do
    for hour in `seq -w 0 23`
    do
        bzgrep $1 /var/log/apache/archive/2014-${month}-${day}/2014-${month}-${day}_${hour}.bz2 >> $1_${day}.tmp
        tmp=`wc -l $1_${day}.tmp | cut -f 1 -d ' '`
        if [ "$tmp" -gt 1 ]; then
            echo "$GREEN hit: $month/$day"
            break;
        else
            echo "$RED nothing : $month/$day ${hour}h"
        fi
    done
done

# tmp file削除
rm *.tmp

```

もっと効率よくやるやり方ありそうだが、思いつかなかった
make for Windows

・Make for Windows
http://gnuwin32.sourceforge.net/packages/make.htm
http://gnuwin32.sourceforge.net/packages/libintl.htm
「Binaries」をダウンロード。
binディレクトリ内の libintl3.dll を C:\Windows\System32 の中にコピー。

・LibIntl for Windows
http://gnuwin32.sourceforge.net/packages/libintl.htm
「Binaries」をダウンロード。
binディレクトリ内の libintl3.dll を C:\Windows\System32 の中にコピー。
(64bitの場合は C:\Windows\SysWOW64 へ )

・LibIconv for Windows
http://gnuwin32.sourceforge.net/packages/libiconv.htm
「Binaries」をダウンロード。
binディレクトリ内の libiconv2.dll を C:\Windows\System32 の中にコピー。
(64bitの場合は C:\Windows\SysWOW64 へ )
[Ruby]消費税計算にはBigDecimalを使いましょう


## 消費税計算でありがちな浮動小数点問題

ちょっと電卓で **1800 x 1.08** を計算してみてください。いくつになりましたか？

はい、 **1944** ですね。

ではターミナルからirbを開いて、 `1800 * 1.08` と打ち込んでください。

````
> 1800 * 1.08
=> 1944.0000000000002
````

あれ？1944にならない！？

はい、これはコンピュータを使った計算でよくありがちな、 **浮動小数点問題** というやつです。
つまり、ざっくりいえばコンピュータは小数点を人間が行う計算と同じように扱えない、というわけです。

もし、「消費税計算は端数切り上げとする」という仕様だった場合、この浮動小数点問題はバグの原因となります。

````
> (1800 * 1.08).ceil
=> 1945
````

お金の計算は一円でもズレると致命的です。
どのように回避すれば良いでしょうか？

## 小数を含む金額の計算はBigDecimalを使いましょう

この問題を解決する方法には選択肢がいくつかあると思いますが、ここではRuby標準の`BigDecimal`クラスを使った計算方法を紹介します。

先ほどの計算はこうすれば期待する結果が得られます。

````
> require 'bigdecimal'
=> true
> (BigDecimal("1800") * BigDecimal("1.08")).ceil
=> 1944
````

ちなみに数値リテラル(`Float`型)をそのまま`BigDecimal`に渡すと、`ArgumentError: can't omit precision for a Float.`というエラーが出ます。

````
> (BigDecimal(1800) * BigDecimal(1.08)).ceil
ArgumentError: can't omit precision for a Float.
````

これは、

* もし小数がそのまま渡せてしまう場合、`1.08`という小数リテラルが評価された段階で、Floatクラスのインスタンスができる
* しかしFloatクラスなので、その時点で `1.08` との誤差が生じてしまい、意図した結果にならない

ためです。なので、上で書いたように文字列として渡してください。

### RSpecで検証
ついでにRSpecで実行結果を確認しておきましょう。

````ruby
require 'bigdecimal'

describe 'tax calculation' do
  describe 'with Float' do
    it 'cannot get valid result' do
      expect((1800 * 1.08).ceil).to_not eq 1944
    end
  end
  describe 'with BigDecimal' do
    it 'gets valid result' do
      expect((BigDecimal("1800") * BigDecimal("1.08")).ceil).to eq 1944
    end
  end
end
````

### 余談: 消費税が5%のときはバグにならない

ちなみに上の計算は消費税が5%だと運良く(?)端数が出ないので、不具合になりません。

````
> 1800 * 1.05
=> 1890.0
````

なので、もしかすると「今まで問題なかったのに、なぜか8%になったら不具合が出始めた！」なんていうケースもあるんじゃないでしょうか？

**2023-08-10追記**
2023年現在の消費税は10%ですが、こんな計算式だと10%でも端数は発生します。

```ruby 
100000000000000 * 1.1
#=> 110000000000000.02
```

まあこんなに大きな金額を計算することは滅多にないと思いますが😅

## まとめ
「プログラマだったら浮動小数点問題なんて常識だよ！」という方も多いと思いますが、常識だとわかっていても意外とうっかり間違えたりしてしまうものです。

はい、何を隠そう、僕自身がうっかりこの不具合を出してしまいました・・・。

僕のうっかりミスを他山の石として、みなさんも消費税計算や小数が絡む計算をする場合には浮動小数点の扱いを間違えないように注意してくださいね～。

### 参考
- http://www.ruby-doc.org/stdlib-2.1.1/libdoc/bigdecimal/rdoc/BigDecimal.html
- http://www.ruby-doc.org/core-2.1.1/Float.html
Google Chrome を誤って終了させてしまったときに、開いていたタブをすべて復元する方法

## 環境
Mac OS X: 10.9.2
Google Chrome: 33.x

## やり方

メニューバーの履歴から「最近閉じたタブ」の下に「タブ: n」という項目 (nは数字) があると思うので、クリックするとすべてのタブが復元されます。新しいウィンドウに復元されるのがやや不満(笑)ですが、今まで知りませんでした。便利。

## 追記
Mac の場合は shift + command + T でも、すべて復元できるみたいです。
Windows の場合 (Win8.1で確認) は Ctrl + Shift + T で OK でした。

また Windows, Mac ともに右上の設定アイコンから「最近使ったタブ」にポインタを合わせると「タブ: n」が出てきました。
香り屋gvimでマークダウンのファイルをシンタックスハイライトする方法@Win

## syntax 定義ファイルを持ってくる
* [PlasticBoy](https://github.com/plasticboy/vim-markdown)の
https://github.com/plasticboy/vim-markdown/tree/master/syntax/mkd.vim
が今の所無難そう

* [jtratner](https://github.com/jtratner/vim-flavored-markdown) とかもある


## syntax 定義ファイルを配置する
* vim73-kaoriya-win32\vim73\syntax\ 配下に配置する

## 配置したsyntax定義ファイルを読み込むようにする
* vim73-kaoriya-win32\vim73\filetype.vim を編集   

1. Modula 2から*.mdを消す

  ```vim:filetype.vim
" Modula 2
au BufNewFile,BufRead *.m2,*.DEF,*.MOD,*.mi setf modula2
```

1. Markdownに*.mdを追加

  ```vim:filetype.vim
" Markdown
au BufNewFile,BufRead *.markdown,*.mdown,*.mkd,*.mkdn,README.md,*.md  setf mkd
```

以上でmd形式のファイルを開いたときにハイライトされるようになる

## その他
* 無名ファイルにmkdを適用する  
`set ft=mkd`


************************************************************
# Markdown Viewer @Web

* [Markdown Previewer](http://playground.k11i.biz/mp/)
    > ローカルのファイルをドラッグしておけば、ローカルの修正内容が即時反映される

* [Markdown Edit](http://georgeosddev.github.io/markdown-edit/)
    > Auto Reloadにチェックを付ければいい感じ

* [wri.pe#Webエディタ](https://wri.pe/)
    > 使ってないけど気になる

# Markdown Viewer ＠local
* [MarkDown#Editor＠Windows](http://hibara.org/software/markdownsharpeditor/#download)
    > デザインがダサけど動きはそこそこ

* [MarkdownPad＠Windows](http://markdownpad.com/)
    > 定番らしい

* [Kobito＠Mac](http://kobito.qiita.com/)
    > インストールはしたが使っていない


# 参考リンク
* [香り屋Vim](http://www.kaoriya.net/software/vim/)

************************************************************
* [Previm](https://github.com/kannokanno/previm/blob/master/README.mkd)

* [VimでMarkdownをプレビューする環境を整えてみた](http://mba-hack.blogspot.jp/2013/11/vimmarkdown.html)

* [MarkdownのプレビューをVimで見る2つの方法](http://note103.hateblo.jp/entry/2014/02/11/005326)

* [VimでのMarkdown環境を整える](http://rcmdnk.github.io/blog/2013/11/17/computer-vim/)

### マークダウン記法チートシート
* [Markdown記法 チートシート](http://qiita.com/Qiita/items/c686397e4a0f4f11683d)

* [Markdown Cheatsheet](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet)
jQuery#onを便利に使う

今まで

```js
$(selector).on('click', function(event) { });
```

くらいしか使ってこなかったのだけど、調べてみたらもっと便利に使える事を知ったのでメモ。多分`on()`だけじゃなく`one()`も同じかな。

## イベントにネームスペースを付けられる

```js
$(selector).on('click.add-button', function(event) {
});

$(selector).on('click.remove-button', function(event) {
});

// click.remove-buttonだけ削除される
$(selector).off('click.remove-button');
```

## データをバインドできる

```js
$(selector).on('click', {message: 'Hello!'}, function(event) {
  // event.dataからmessageにアクセスできる
  alert(event.data.message);
});
```

## 後から追加した要素に対してハンドラをアタッチできる

```js
// ボタンのハンドラをdocumentにセットする
$(document).on('click', 'button', function(event) {
  alert('Hello, World!');
});

// 後から要素を追加する際、第二引数のセレクタに一致する場合ハンドラがアタッチされる
$('body').append('<button>button</button>');
```

---

## 上記すべて

```js
$(document).on('click.button', 'button', {message: 'Hello!'}, function(event) {
  alert(event.data.message);
});
```

便利かもー。

---

## ネームスペース、ねえ

https://api.jquery.com/on/

にも確かに`namespace`うんぬんとか書いてあるんだけど。

```js
$('body').on('click.aaa.bbb', {eventName: 'click.aaa.bbb'}, function(event) {
  console.log(event.data.eventName);
});
$('body').on('click.aaa.ccc', {eventName: 'click.aaa.ccc'}, function(event) {
  console.log(event.data.eventName);
});
$('body').on('click.bbb.aaa', {eventName: 'click.bbb.aaa'}, function(event) {
  console.log(event.data.eventName);
});
$('body').on('click.bbb.ccc', {eventName: 'click.bbb.ccc'}, function(event) {
  console.log(event.data.eventName);
});

// 'click.aaa.ccc'以外のイベントが削除される
$('body').off('click.bbb');
```

ネームスペースとは動作のイメージが違うような気がするよ……　クラスっぽいイメージ。
MonitでGmailをSMTPサーバとして使う

initスクリプトがはいたPIDファイルをもとに監視してくれたり、直接プロセスやらリソースをモニタしてくれたりと、割とお手軽なサーバ監視に使える[Monit](http://mmonit.com/monit/)ですが、アラートの受け取り先がどうせGmailになってるんだし、SMTPサーバにGmail指定すりゃいいじゃんってときのメモ

set mailserver のところを

```
set mailserver smtp.gmail.com port 587 username "Gmailアカウント" password "Gmailパスワード" using tlsv1 with timeout 30 seconds

```
みたいに書けばいいっぽいです
using～のところがないと、Googleさんに「TLS使えよボケ」と怒られて送れないので注意
JScriptからODBC ドライバ経由でのデータベース接続 その１

## 接続
JScriptからデータベースへ接続してみます。
※：環境については、文末に記述しています。

接続の為に、以下の情報を設定します。

|キーワード|説明|
|:-----------|:------------|
|Provider|OLE DB Provider for ODBC|
|DRIVER|"SQL Server" などの ODBC ドライバ|
|SERVER|サーバー名|
|DATABASE|データベース名 |
|UID|ユーザー アカウント名|
|PWD|ユーザー アカウント用のパスワード|


接続のサンプルコードです。

```js
var driver = "{SQL Server}";          // ODBCドライバ
var server = "localhost\\SQLEXPRESS"; // サーバ
var database = "testdb";              // データベース
var user = "sa";                      // ユーザ
var pass = "*****";                   // パスワード
```

```js:adodbtest.js
var con = null;
try {
    // 「ADODB.Connection」オブジェクト生成
    con = new ActiveXObject("ADODB.Connection");
    // ステータス確認
    WScript.Echo("Version:" + con.Version);
    WScript.Echo("State:" + con.State);
    // 接続文字列設定
    con.ConnectionString = "Provider=MSDASQL" // プロバイダ
        + ";DRIVER=" + driver                 // ODBCドライバ
        + ";SERVER=" + server                 // サーバ
        + ";DATABASE=" + database             // データベース
        + ";UID=" + user                      // ユーザ
        + ";PWD=" + pass;                     // パスワード
    // 接続
    con.Open();
    // ステータス確認
    WScript.Echo("State:" + con.State);
} catch (e) {
    // エラーの場合
    WScript.Echo("Error(" + (e.number & 0xFFFF) + "):" + e.message);
} finally {
    try {
        // ステータスチェック
        if (con && con.State == 1) {
            // 切断
            con.Close();
        }
    } catch (e) {
        // エラーの場合
        WScript.Echo("Error(" + (e.number & 0xFFFF) + "):" + e.message);
    }
}

```

実行してみます。

```bat
cscript.exe //Nologo adodbtest.js
```

結果が以下のようになります。

```
Version:6.1
State:0
State:1
```

## 環境
|名称|バージョン|その他|
|:-----------|:------------|:------------|
|OS|Windows7|64bit|
|SQL|Microsoft SQL Server 2012 Express Edition|64bit|
ASP.NET WebForm JavaScriptでPostBackイベントを発生させる

JavaScriptでPostBackイベントを発生させたい、という場合は結構あると思います。

この場合`__doPostBack('btnSubmit','')`という風にやるのが常道だったのですが、これはいわば隠し関数で天下のマイクロソフトの都合で今後どうなるのかわからないので、オフィシャルには以下のように行います。

```js
function invokeSubmit(){
    <%= Page.ClientScript.GetPostBackEventReference(btnSubmit,String.Empty)  %>
}
```

で、これでOKかと思いきやそうではなく、このままだと「無効なポストバックまたはコールバック・・」というようなエラーが出ると思います。

これは、想定された場所以外からポストバックが起きているから駄目よ、という余計なお世・・・でなく、セキュアな.NET Frameworkが発生させているありがたい例外になります。Pageの`EnableEventValidation`をfalseにしてしまうという手もあるのですが、それだと脆弱性につながる危険性があるため、以下のようにします。

```vbnet
Protected Overrides Sub Render(writer As System.Web.UI.HtmlTextWriter)

    Page.ClientScript.RegisterForEventValidation(btnSubmit.UniqueID, String.Empty)
    MyBase.Render(writer)

End Sub
```

Renderイベントで、RegisterForEventValidationを使用し検証対象処理として登録を行っておきます。

これで晴れてセキュアな状態を保ちつつ呼び出しが可能になります。

＜参考＞
[ClientScriptManager.GetPostBackEventReference メソッド (Control, String)](http://msdn.microsoft.com/ja-jp/library/ms153112(v=vs.110).aspx)
[__doPostBack を使ってはいけません](http://surferonwww.info/BlogEngine/post/2012/4/21/How-to-use-GetPostBackEventReference-and-RaisePostBackEvent-methods.aspx)
[ASP.NET Event Validation and “Invalid Callback Or Postback Argument” : Part II](
http://odetocode.com/blogs/scott/archive/2006/03/22/asp-net-event-validation-and-invalid-callback-or-postback-argument-again.aspx)

公式ドキュメントを見る限り、サーバーサイドでonclick属性に設定したりするのに使っているようだ。
その意味では、イベントを発生させるエレメントが決まっているなら公式サンプルどおり`Attributes.Add("onclick", cs.GetPostBackEventReference(mycontrol, b.ID.ToString()));`というような感じでやるのが良いと思う。
Generatorでthisを束縛する


# Generatorとthis


Generatorがnode.jsではharmonyオプション付きですがバージョン11から使用できるようになりました。

generetorの説明は各所で行われているので省略します、今回はthisとの関係を調査しました。

# 調査

thisの束縛はbind,call,applyを使用します。
さらに今回はkoaフレームワークでお世話になるcoモジュールを使用した場合はどのようになるかを確認します

コードは`node --harmony this.js`で実行します 

```javascript:this.js

// 束縛対象
var self = {x: 1};

// ジェネレータ関数
// yieldが存在しないため、nextを一回実施しただけで処理が完了する意味ないものですが、
// thisの調査だけなので意味なくジェネレータ関数にしています
var generator = function * () {
	'use strict';
	if (this === global) console.log('this === global');
	else if (this === self) console.log('this === self');
	else if (this === void 0) console.log('this === undefined');
	else console.log('this === ???');
};

var co = require('co');
var gn, g;

console.log('(1)');
g = generator();
g.next(); // this === undefined

console.log('(2)');
gn = generator.bind(self);
g = gn();
g.next(); // this === self

console.log('(3)');
g = generator.call(self);
g.next(); // this === self

console.log('(4)');
g = generator.apply(self);
g.next(); // this === self

console.log('(5)');
g = generator();
// g.next.call(self);  // 例外発生
// g.next.apply(self);  // 例外発生

console.log('(6)');
co(generator)(); // this === global

console.log('(7)');
gn = generator.bind(self);
// co(gn)(); // 例外発生

console.log('(8)');
co(generator).bind(self)(); // this === self

console.log('(9)');
co(generator).call(self);  // this === self

console.log('(10)');
co(generator).apply(self);  // this === self


```


#まとめ

koaフレームワークのミドルウェアによってはthisの束縛を強要するものがありました。
試験的に動作させるにはどうしたら良いと思って確認してみたところ、面白いことが発見できました

5で確認できるように一度作成されたジェネレータ・イテレータのthisを途中で変更する事はできません

6のようにcoを普通に使用すると`use strict`にも関わらずglobalが設定されている点は注意が必要です。

7ではbindされたジェネレータ関数は普通の関数になってしまうのでcoの引数にする事はできなくなります