OmniAICreator/Qiita-1.07M huggingface dataset:
AspectMockでsingletonなクラスを呼び出してるメソッドをテストする

最近テストで使ってるCodeceptionとAspectMockの組み合わせがいいので
CodeceptionとAspectMockを使ったテストについて書いてみたいと思います。

インストール方法や使い方に関しては[Codeception.com(公式)](http://codeception.com)や[AspectMock(GitHub)](https://github.com/Codeception/AspectMock)を参考にして頂ければと思います。

Qiitaにも参考になる記事がありますのでcodeceptionで検索してみてください。

## 実行環境

* CentOS 6.5
* PHP 5.4.26
* Codeception 1.8.3
* AspeckMock 0.4.1

※ CodeceptionとAspectMockはcomposer経由でinstallしてる前提です。

## レガシーなコードと戦う

singletonなクラスを呼び出してるメソッドをよく目にすると思うのですが(俺だけ？)メソッドの中で呼び出してると、とてもテストしずらいですよね。

Mockery等でも一応静的メソッドのモックはできますがクラスが読み込まれてると使えない等制限がありますね。

そこでCodeceptionとAspectMockの組み合わせです。

さっそくコード見てみましょう。

```php:DateTimeManager.php
<?php

class DateTimeManager
{
  static private $instance = null;
  protected $timestamp;

  public static function singleton()
  {
    if (! empty(self::$instance)) {
      return self::$instance;
    }

    return self::$instance = new self();
  }

  private function __construct()
  {
    $this->timestamp = time();
  }

  public function getTimestamp()
  {
    return $this->timestamp;
  }

  public function getDateTime()
  {
    return date('Y/m/d H:i:s', $this->timestamp);
  }
}
```

こんな時間を扱うクラスがあったとしてそれを呼び出すHogeクラスのgetFugaメソッドをテストするとします。
※適当でごめんなさい

```php:Hoge.php
<?php

class Hoge
{
  public function getFuga()
  {
    $dateTime = DateTimeManager::singleton()->getDateTime();
    return $dateTime;
  }
}
```

テストクラスはこうなります。

```php:HogeTest.php
<?php

use AspectMock\Test as test;

class HogeTest extends \Codeception\TestCase\Test
{
  public function testGetFuga()
  {
    $dateTimeManagerInstance = test::double('DateTimeManager')->make();
    $dateTimeManagerInstanceProxy = test::double($dateTimeManagerInstance, ['getDateTime' => '2014/04/02 23:00:00']);
    $dateTimeManagerClassProxy = test::double('DateTimeManager', ['singleton' => $dateTimeManagerInstance]);

     $hoge = new Hoge();
     $this->assertSame('2014/04/02 23:00:00', $hoge->getFuga());

     $dateTimeManagerClassProxy->verifyInvokedOnce('singleton');
     $dateTimeManagerInstanceProxy->verifyInvokedOnce('getDateTime');
  }
}
```

テストメソッドの中でやってることは以下です。

* 一個目のtest::doubleでコンストラクタを呼ばずにDateTimeManagerのインスタンスを取得
* 二個目のtest::doubleでそのインスタンスのgetDateTimeメソッドの返り値として時刻を設定
* 三個目のtest::doubleでsingletonメソッドの返り値として上記のインスタンスを設定
* テストメソッドを呼んでassertion
* モックメソッドの呼び出し確認
  ※verifyInvokedOnceの部分

でいざテストするとちゃんとテストが成功します。

```shell-session
$ ./vendor/bin/codecept run unit
Codeception PHP Testing Framework v1.8.3
Powered by PHPUnit 3.7.34 by Sebastian Bergmann.

Unit Tests (1) --------------------------------------------
Trying to test get fuga (HogeTest::testGetFuga)       Ok
-----------------------------------------------------------

Time: 2.73 seconds, Memory: 70.50Mb

OK (1 test, 1 assertion)
```

すごいですね。
こんな感じでレガシーコードと戦えます。

みなさん、CodeceptionとAspeckMockに移行しましょうw
ではでは。
Yeomanでサクッと雛形からWEBアプリを作り始めるメモ


開発環境は Mac OS が前提です。

### Yeomanがインストールされてなければ、まずYeomanをインストール

```
# npm install -g yo grunt-cli bower
```

### Yeomanのサイトからジェネレータを探す

- ここから(公式)
	- http://yeoman.io/official-generators.html
- こっちはコミュニティ(非公式？)
	- http://yeoman.io/community-generators.html

### 目的のジェネレータをインストール

例えば公式の「webapp」の場合は、

```
# npm install -g generator-webapp
```

### ジェネレータを起動

```
$ yo webapp
```

![スクリーンショット 2014-04-03 0.07.47.png](https://qiita-image-store.s3.amazonaws.com/0/35733/60d09686-7449-bce7-3d21-2a743bae93f5.png "スクリーンショット 2014-04-03 0.07.47.png")

画面に従って適当にモジュールを選択する。これで雛形が生成される。
追加したいライブラリは Bower等でインストールする。

### 動作確認

プログラムを書いたら、ドキュメントルートぽいディレクトリに移動して、

```
$ grunt serve
```

そうするとブラウザが起動する。

# ほか

- こっちはAnugularJSの環境を構築した際のメモです。
	- [Yeoman で AngularJS ＆ UI Bootstrap の開発環境構築](http://qiita.com/hkusu/items/7d748b55ba73cc8a3675)
floatしたときの親要素の高さを復活させる方法(clearfix)

___



```style.css
#child1 {
	fload: left;
}
#child2 {
	fload: right;
}

.clearfix {
	zoom: 1;
}
.clearfix:after {
	content: ".";
	display: block;
	clear:both;
	visibility: hidden;
}
```

```index.html
<div class="clearfix">
	<p id="child1">子要素１</p>
	<p id="child2">子要素2</p>
</div>
```
[D言語] Derelict3のGLFWでglfwSet(Key|Char|CursorEnter)Callbackで勝手にハマった

#まず、Derelictとはなにか
OpenGLとかGLFW,SDL,OpenALかのD言語向けバインディングライブラリのこと  
  
#免責事項
α改はD言語を学習中でありまだ良くわかってないので以下のことが間違ってるかもしれません・・・  
ご了承ください  
間違っていた場合は指摘してくださると幸いです  
  
  
##使い方
当たり前だけど、D言語のコンパイラ(dmdとかldcとかが入りますので入れておいてください)  
まず  
```zsh
% git clone https://github.com/aldacron/Derelict3
% cd Derelict3/build
% dmd build.d
% ./build
```
これでDerelict3/lib/使っているDコンパイラ(dmd/ldcとか)に*.a(Windowsならlib)と出力されます  
そして  
作業ディレクトリを作ってそこにlibというディレクトリを作りそこにすべての.aを移動して  
Derelict3/import/derelictを作業ディレクトリに設置(別にコンパイラの参照するパスにおいても構いませんけど)  
これでOk  
  
  
##とりあえず、使ってみる  
って書こうと思ったけどすでにQiitaに投稿されてる方がいたのでそちらへのリンクを貼ります  
[D言語によるマルチプラットフォームなゲームライブラリバインダ Derelict3の使い方](http://qiita.com/yasei_no_otoko/items/ae23b681a47d9a16f4c6)  
  
##で、今回どこでハマったか
まず、Callbackを書いて登録しようとしました  
実際のコードはこんな感じ  

```d
mixin template Callbacks(){
  void keyCallbackFunction(GLFWwindow* window, int key, int scancode, int action, int mods){
    // コード
  }
}
class TestGl{
  mixin Callbacks;
  static GLFWwindow* window;

  this(){
    // loadとか初期化とか
    glfwSetKeyCallback(window, cast(GLFWwindow)&keyCallbackFunction);
  }
}
```

こんな感じで色々試行錯誤したんですけど 関数リテラル(functionへのポインタ)渡すところ(というかキャスト)がコンパイルエラー吐かれたり(上の例だとどうなるか忘れてしまいましたが・・・)  
とりあえず、試した結果をリストにすると 
 
* キャストのとことかでコンパイルエラー  
* なんとかエラー回避してコンパイル通してもコールバックが呼ばれるようなことするとCoreDump  

とかこうなります 

```
[追記:2014/04/03]  
repeatedly氏のコメントにより僕の間違いがわかりました  
詳しくは下のコメントを見てください  
簡潔に説明しますと、Callbackというclassのメンバ関数はdelegateとして扱われるそうです
ですからメンバ関数である`keyCallbackFunction`はdelegateとして扱われていたためfunctionが要求されている場面では使えなかったというわけです  
下に解決したコードを書きます  
```
  
##解決方法
で、解決方法はですね  
ズバリ直接書いちゃえば解決しましたはい  
実際のコードがこちら  

```d
class TestGl{
  static GLFWwindow* window;

  this(){
    glfwSetKeyCallback(window, cast(GLFWkeyfun)
        function void (GLFWwindow* window, int key, int scancode, int action, int mods){
          // コード
        });
  }
}
```
  
うん、これならちゃんと行くんですよね  
直接書くという方法も行けます  

###追記:2014/04/03
それから、delegateをstatic修飾子によりfunctionとすることにより、mixin templateを用いて使うことができるようになります  

```d
mixin template Callbacks(){
  static void keyCallbackFunction(GLFWwindow* window, int key, int scancode, int action, int mods){
    // コード
  };
}
class TestGl{
  mixin Callbacks;
  static GLFWwindow* window;

  this(){
    // loadとか初期化とか
    glfwSetKeyCallback(window, cast(GLFWwindow)&keyCallbackFunction);
  }
}
```

こうやったほうがスマートですね(?)  
とりあえず、僕的にはcallbackは別のクラスとして扱いたかったので、`mixin template Callback()`としました  
とりあえず、結論は
####static修飾子をつければスマートに解決する
はいこんな感じで今回は以上です〜
  
  
α改
AngularJSで絵文字を表示するメモ


![スクリーンショット 2014-04-02 23.14.25.png](https://qiita-image-store.s3.amazonaws.com/0/35733/9b0237c6-bf19-dd8b-1226-e72cd1133040.png "スクリーンショット 2014-04-02 23.14.25.png")

- こちらの[EMOJI CHEAT SHEET](http://www.emoji-cheat-sheet.com)で定義された絵文字をAngularJSのアプリケーションを表示してみたメモです。
- このような記述 `:smile:` で絵文字を表示します。
	- 最終的には画像(CSSスプライト)で表示されます。

# デモ

デモはこちら。

- http://hkusu.github.io/AngularJS_emoji_demo/

# 利用するライブラリ

この「AngularJS Emoji Filter」というライブラリを使います。

- http://globaldev.co.uk/angular-emoji-filter/
	- GitHubはこちら:https://github.com/globaldev/angular-emoji-filter

# 導入手順メモ

- [上記のサイト](https://github.com/globaldev/angular-emoji-filter)からライブラリをダウンロードして、任意の場所に配置します。
	- 下記のように Bower でも出来るみたいなんですが、うまくスプライト画像がビルドできず断念..
		- `bower install angular-emoji-filter`

### HTMLファイルでCSSファイルとJSファイルをインクルード

```
<link rel="stylesheet" href="emoji/emoji.min.css">
```

```
<script src="emoji/emoji.min.js"></script>
```

### AngularJSに組み込む

```app.js
'use strict';

angular.module('emojiApp', [
  'ngCookies',
  'ngResource',
  'ngSanitize',
  'ngRoute',
  'ui.bootstrap',
  'emoji' ←追記
])
  .config(['$routeProvider', function ($routeProvider) {
    $routeProvider
      .when('/', {
        templateUrl: 'views/main.html',
        controller: 'MainCtrl'
      })
      .otherwise({
        redirectTo: '/'
      });
  }]);
```

### 試してみる

```html:モデル側の例
angular.module('hogeApp')
  .controller('HogeCtrl', ['$scope', function ($scope) {
        $scope.message = "これは:smile:絵文字です。";
  }]);
```

↑ :smile: になってるところは本当は `:smile:` です。

```html:VIEW側の例
<div ng-controller="HogeCtrl">
    <span ng-bind-html="message | emoji"></span>
</div>
```

- AngularJSのフィルタ機能で動作します。
- ライブラリのサイトの例では `ng-bind-html-unsafe` となっていますが、AngularJS1.2以降では `ng-bind-html` で良いみたいです。

ブラウザで表示するとこんな感じ。

![スクリーンショット 2014-04-02 23.00.51.png](https://qiita-image-store.s3.amazonaws.com/0/35733/b880f976-65e2-6aae-b9ed-ddff79adb19c.png "スクリーンショット 2014-04-02 23.00.51.png")

# ほか

デモのソースはこちらに置いておきます。

- https://github.com/hkusu/AngularJS_emoji_demo
Android 通知メッセージ(GCM)の受信に関するまとめ


Androidの通知メッセージ(GCM)の受信に関して公式サイトから気になった部分をピックアップ.
一応公式サイトの文章を基に書いていますが、訳し間違ったり勘違いしてることもあるかもしれません.
間違いがあったら指摘してください.

## GCM メッセージ受信の流れ

1. アプリケーションサーバからGCMサーバへメッセージが送信
2. デバイスがofflineならGCMサーバへ保存
3. デバイスがonlineならGCMからデバイスへメッセージを送信
4. システムはメッセージをIntent broadcastでアプリケーションに送信
  - メッセージ受信時にアプリケーションは動いている必要はない
5. アプリケーションがメッセージを処理する

## GCM メッセージの基本的性質

- メッセージ長は最大4Kバイト
- デフォルトで4週間保存される

GCMのメッセージは以下のどちらかに分類される
- send-to-syncメッセージかmessage with payload

## send-to-syncメッセージ

- サーバ上にあるデータをクライアント(デバイス上のアプリ)と同期させる目的に使われるメッセージ
- 同じデータに対する同期メッセージが複数ある場合は一つにまとめる(collapse, 折り畳む)ことができる

-> これをcollapsed message(折り畳みメッセージって訳されてますね)と呼ぶらしい

### collapsed message (折り畳みメッセージ)

- メッセージのcollapse key属性に基づき、まとめることが可能なメッセージ
- 送信先のデバイスがオフラインの場合、collapese keyが同じ複数のメッセージはGCMサーバ上で？まとめらる(最新のメッセージのみが届けられる)
- GCMはデバイス毎に同時に最大で４つの異なるcollapse keyを処理できる

## message with payload

- サーバ上のデータとの同期を目的とするメッセージではなく、データを送る事自体が目的なメッセージ
- collapse_keyを指定しない = message with paylod
- GCMは100個のメッセージまで保存可能(これはデバイス毎？)
- 配送順序は保証されていない

## メッセージ配信不可能状態にあるデバイスへのメッセージの配信

- デバイスが利用不可能な状態(電源off, オフライン等)ではアプリケーションへのメッセージの配信はデバイスが利用可能な状態になるまで遅延される
- delay_while_idleフラグを使う事でデバイスがアクティブな状態になるまで送信されないように指定可能
  - 逆に言うと指定しなければアクティブな状態でなくても送信される？
  - アクティブな状態の定義って何?

## 参考URL

Google Cloud Messaging for Android - Android Developers
http://developer.android.com/google/gcm/index.html

Google Cloud Messaging for Android - ソフトウェア技術ドキュメントを勝手に翻訳
http://www.techdoctranslator.com/android/guide/google/gcm
LaunchRocketを使ってHomebrewでインストールしたサービスを起動/停止する

CaskはGUIアプリをHomebrewでインストールするためのツールで、今回はこれを利用します。

```
# brew tap phinze/cask
# brew install brew-cask
```

LaunchRocketをインストールします。

```
brew tap jimbojsb/launchrocket
brew cask install launchrocket
```

システム環境設定に "LaunchRocket"のアイコンが表示されるので、ここから起動します。最初は何も表示されていないので、"Scan Homebrew"ボタンを押してスキャンをします。brewの実行プログラムが見つからない場合はパスを教えて上げる必要があります。スキャンが終わると、あとは「Start」/「Stop」ボタンで起動・停止を制御することができます。

![スクリーンショット 2014-04-02 21.44.58.png](https://qiita-image-store.s3.amazonaws.com/0/27497/739544ef-a6d9-0a19-5ed5-e51fbaa6e6ff.png)
Karma + Jasmine でフィクスチャを使う

次のようなディレクトリ構造だとします。

```
package.json
bower.json
karma.conf.js
test/
  fixture/
    hoge.txt
  unit/
    HogeSpec.js
```

まずは karma をインストールします。

```console
$ npm install -g karma-cli
$ npm install --save-dev karma
```

jasmine でフィクスチャを使うために jquery と jasmine-jquery をインストールするのですが、karma-jasmine の jasmine が 1 系なので、jasmine-jquery も 1 系にしないと動作しません。

```console
$ bower install --save-dev jquery
$ bower install --save-dev jasmine-jquery#~1
```

次に karma.conf.js を作成します。

ポイントは jquery と jasmine-jquery を files に指定することと、フィクスチャを下記のように files で pattern と included を付けて指定することです。

pattern に指定するものは普通に files に指定するものと同じですが、`included: false` が無いとテストの開始時にフィクスチャを JavaScript として読み込もうとしてしまいます。

```js:karma.conf.js
module.exports = function(config) {
    config.set({
        basePath: '',
        frameworks: ['jasmine'],
        files: [
            'bower_components/jquery/dist/jquery.min.js',
            'bower_components/jasmine-jquery/lib/jasmine-jquery.js',
            'test/unit/**/*.js',
            { pattern: 'test/fixture/**', included: false }
        ],
        exclude: [],
        preprocessors: {},
        reporters: ['progress'],
        port: 9876,
        colors: true,
        logLevel: config.LOG_INFO,
        autoWatch: true,
        browsers: ['Chrome'],
        singleRun: false
    });
};
```

テストコードを作成します。

```js:HogeSpec.js
describe("HogeSpec", function(){

    beforeEach(function(){
        jasmine.getFixtures().fixturesPath = 'base/test/fixture';
    });

    it("hogehoge", function(CalendarConverter){
        var fixture = readFixtures('hoge.txt');
        expect(fixture).toBe("hogehoge\n");
    });
});
```

`jasmine.getFixtures().fixturesPath` でフィクスチャのパスを指定するのですが、karma.conf.js の files で指定したファイルは、basePath からの相対パスの先頭に base を付けたパスで公開されます。なので、今回のケースでは `test/fixture` ではなく `base/test/fixture` と指定します。

あとは readFixtures でフィクスチャを読むことができます。

## 参考

- [jasmine-jquery matchers don't working when jasmine-jquery is loaded using require · Issue #173 · velesin/jasmine-jquery](https://github.com/velesin/jasmine-jquery/issues/173 "jasmine-jquery matchers don't working when jasmine-jquery is loaded using require · Issue #173 · velesin/jasmine-jquery")
- [Loading a mock JSON file within Karma+AngularJS test - Stack Overflow](http://stackoverflow.com/questions/17370427/loading-a-mock-json-file-within-karmaangularjs-test "Loading a mock JSON file within Karma+AngularJS test - Stack Overflow")
sshで複数の接続先に対して公開鍵で接続する設定

例えばgithub.comとport forwardingで接続するgitサーバにそれぞれ異なる秘密鍵で接続する場合。

cygwinの場合は以下のように設定する

path_to_cygwin\home\username\.ssh\config
ファイルを作成し、以下の内容を記載


Host github.com
 HostName github.com
 User git
 IdentityFile ~/.ssh/name_of_the_private_key_file
 

Host localhost
 HostName localhost
 User git
 IdentityFile /cygdrive/c/Users/username/.ssh/name_of_the_private_key_file
Octopress インストールがうまくいかなかったのでメモ


`bundle install` で以下のように怒られる。

```bash
$ sudo bundle install
Fetching gem metadata from https://rubygems.org/.......
Fetching additional metadata from https://rubygems.org/..
Using rake 0.9.2.2

Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby extconf.rb
checking for main() in -lc... yes
creating Makefile

make "DESTDIR="
compiling redcloth_attributes.c
compiling redcloth_inline.c
compiling redcloth_scan.c
linking shared-object redcloth_scan.bundle
clang: error: unknown argument: '-multiply_definedsuppress' [-Wunused-command-line-argument-hard-error-in-future]
clang: note: this will be a hard error (cannot be downgraded to a warning) in the future
make: *** [redcloth_scan.bundle] Error 1


Gem files will remain installed in /Library/Ruby/Gems/2.0.0/gems/RedCloth-4.2.9 for inspection.
Results logged to /Library/Ruby/Gems/2.0.0/gems/RedCloth-4.2.9/ext/redcloth_scan/gem_make.out
An error occurred while installing RedCloth (4.2.9), and Bundler cannot continue.
Make sure that `gem install RedCloth -v '4.2.9'` succeeds before bundling.
```

どうやら Xcode 5.1 へのアップデートによって clang が更新された事が原因だそうで。知らんがな。

```bash
$ sudo ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future bundle install
```

でいけました。

https://developer.apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/Introduction/Introduction.html

ここに詳細が載っています。`-Wno-error` は将来的にはサポートされなくなるっぽいですが。
vagrantコマンドの捗(はかど)るエイリアス


```bash
alias vahds="vagrant halt; vagrant destroy --force; vagrant status"
```

VMを停止 ```halt``` して、
VMを破棄 ```destroy``` ```--force``` (y/N確認なし) して、
VMの状態 ```status``` を確認するのを１つのコマンドで。
これだけ。

(VMが起動している状態で) 実行すると...

```bash
$ vahds
==> default: Attempting graceful shutdown of VM...
==> default: Destroying VM and associated drives...
==> default: Running cleanup tasks for 'shell' provisioner...
Current machine states:

default                   not created (virtualbox)

The environment has not yet been created. Run `vagrant up` to
create the environment. If a machine is not created, only the
default provider will be shown. So if a provider is not listed,
then the machine is not created for that environment.
```
Pythonで二重起動を防止する(改良版)

以前、ロックファイルだけを使ったバージョンを書いたのですが、不評だった（？）ので、pidファイルを使ったバージョンを作りました。デコレータとして定義したので使うのは簡単。以下のようにするだけです。

```py3
@singleprocess
def main();
    pass
```
動作的には、以下のようになっています。

1. メインの処理を始める前に、pidファイルにpidを書き込む。処理が終わったらpidファイルを消す。
2. すでに、このpidファイルに書き込まれたpidのプロセスが、自プロセスと同じシグネチャを持っている（同じプログラムであると認められる）ときは、すでに同じプログラムが動作していると判断して起動しない。
3. プロセスの同一性を判断するためのシグネチャとしては、コマンドラインの第１パラメータ(python)と第２パラメータ(pythonファイル名)からディレクトリ名を除いた部分を使う。
4. これだけだと、pidファイルの読み書きのタイミングが重なったときに整合性に問題が起きるため、pidファイルの読み書き時にはロッキング機構を入れている。これは通常のflockを使っている。
5. このため、pidファイルの読み書き中に異常終了した場合は、手動でpidファイルを削除しないと起動しなくなる可能性があるが、メイン処理の異常終了の影響は受けない。pidファイルの読み書き中の異常終了はそうそう起きないので、実用上はこれで問題ない。

pidファイルは/tmp以下に置かれる仕様で、セキュリティは考慮されていません。実運用で使うためには、用途に応じて、getSignatureのアルゴリズムとpidファイルの置き場所を変更する必要があるかもしれません。

```py3
def singleprocess(func):
    def basenameWithoutExt(path):
        return os.path.splitext(os.path.basename(path))[0]

    def getSignature(pid):
        processDirectory = '/proc/%d/' % (pid,)
        if os.path.isdir(processDirectory):
            args = open(processDirectory + 'cmdline').read().split("\x00")
            return [os.path.basename(args[0]), os.path.basename(args[1])]
        return None

    @contextmanager
    def filelockingcontext(path):
        open(path, "a").close() #ensure file to exist for locking
        with open(path) as lockFd:
            fcntl.flock(lockFd, fcntl.LOCK_EX)
            yield
            fcntl.flock(lockFd, fcntl.LOCK_UN)

    def wrapper(*args, **kwargs):
        pidFilePath = tempfile.gettempdir() + '/' + basenameWithoutExt(sys.argv[0]) + '.pid'
        with filelockingcontext(pidFilePath):
            runningPid = ""
            with open(pidFilePath) as readFd:
                runningPid = readFd.read()
            if runningPid != "" and getSignature(int(runningPid)) == getSignature(os.getpid()) is not None:
                print("process already exists", file=sys.stderr)
                exit()
            with open(pidFilePath, "w") as writeFd:
                writeFd.write(str(os.getpid()))
        try:
            func(*args, **kwargs)
        finally:
            with filelockingcontext(pidFilePath):
                os.remove(pidFilePath)
    return wrapper
ログイン状態とかで最初の画面を変えたりするやつ

例えば、UserDefaultsとかに何かしらの情報を持っているかいないかでアプリを立ち上げた時に表示する画面を変えたい。そんな時のやつ。
これよりもっと良いやり方もあるのかもしれないけど覚えたてのコードを備忘録として記録しておく。

## Storyboardの設定（ざっくり）
![test_—_Main_storyboard_—_Edited.png](https://qiita-image-store.s3.amazonaws.com/0/4683/4c3577ae-55ce-9f9d-ab62-73fc465bc1c1.png)


## まずAppDelegateでゴニョゴニョする

tokenってのが保存されているかで画面を変えるって場合。
これを書いておけば多分切り替わる。

### AppDelegate.h

```
#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>
// ここはこれがいいのかどうなのかはわからない（写経しただけ
@property (strong, nonatomic) UIWindow *window;

@end
```
### AppDelegate.m
ストーリーボードの名前が「Main」だったとして。

```
#import "AppDelegate.h"

@implementation AppDelegate

@synthesize window = _window;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
		UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
		
		UIViewController *viewController = [[UIViewController alloc] init];

		// ここでtokenとかを取ってくる
		// UserDefaultsの場合
		NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
		NSString *token = [userDefaults objectForKey:@"token"];

		if (token == nil) {
				viewController = [storyBoard instantiateViewControllerWithIdentifier:@"NG"];
		} else {
				viewController = [storyBoard instantiateViewControllerWithIdentifier:@"OK"];
		}
		
		// ここも写経しただけ
		self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

		self.window.rootViewController = viewController;
		[self.window makeKeyAndVisible];

		return YES;
}
```

## ログインした時
APIか何かを使って認証に成功したらログイン後の画面を表示したい。

ログインに成功したらこう！

```
LogoutView *logoutView =  [self.storyboard instantiateViewControllerWithIdentifier:@"OK"];
[self presentViewController:logoutView animated:YES completion:nil];
```

## ログアウトしたいとき
ログアウトのボタンをタップした時はこう！！

```
LoginView *loginView = [self.storyboard instantiateViewControllerWithIdentifier:@"NG"];
[self presentViewController:loginView animated:YES completion:nil];
```

（編集履歴消せないのかな）
DokuWiki+Markdowkuの感想

* [公式サイト](https://www.dokuwiki.org/start?id=ja:dokuwiki)
* [機能紹介](https://www.dokuwiki.org/ja:features)
* [syntax](https://www.dokuwiki.org/ja:syntax)

まとめ
======

DokuWiki自体は記法はともかく結構使いやすいと思う。特に目次自動生成が非常に楽。

Markdowkuはパーサのバグだと思うんだけど、アンスコ入れると変になるので様子見。
とりあえずWYSIWYG編集が高機能になるプラグインを入れたのでちょっと楽かな。

Pros
====

* 導入は楽
* DBいらない
* ファイル添付がD&Dでできる
* 最初から日本語化されている。翻訳ページを用意するための仕組みもある
* 目次を自動生成してくれる。これは楽。
* [ダウンロードページ](http://download.dokuwiki.org/)がインストールオプションを指定してパッケージングしてくれるようになっている
* ACL内蔵
* 見た目まあまあ。テーマ（DokuWiki用語ではテンプレート）が使えるので問題ないか。
* プラグインたくさん。インストールも管理画面からアーカイブのURLを指定するだけなので楽。

Cons
====

* 記法が好きじゃない（ぶっちゃけreStructured TextかMarkdownで書きたい）
* 標準の編集アシスト機能がイマイチ。
* 同時編集させないようにロックしていると思う。diff出してマージのほうが楽な気が。

[DokuWikiの導入設定](http://havelog.ayumusatを使った感想o.com/computer/software/e151-dokuwiki-install.html)を参考にMarkdownのプラグインを導入するTODO。

[Markdowkuプラグイン](https://www.dokuwiki.org/plugin:markdowku)を導入した。Markdown記法が普通に使えるようになるらしい。かなり楽になった。
管理画面から導入できるし楽すぎる。

追記：アンスコで変になる。get_hogehogeとか書けない。つらい。

* タグ不要。楽。
* なんかWikiシンタックスとMarkdownの間の子になる。すごい。
* Markdownで書いてもTOC更新してくれるっぽい。
* しかし仕様がないのでは…？
ブラウザのjsを一時的に無効にする

忘れそうなのでメモ。Macだけ。

#Firefox
検索窓に```about:config```と入力してEnter。
検索に```javascript.enabled```を入力して、
javascript.enabledを右クリックして、```切り替え```を押す。
※値がfalseならjsが無効、trueなら有効

参考：
http://mozilla-remix.seesaa.net/article/370744386.html

#Safari
開発＞JavaScriptを無効を選択

#Chrome
Chrome＞環境設定（検索窓に```chrome://settings```）＞プライバシー＞コンテンツの設定＞すべてのサイトに対して Javascript の実行を許可しないにチェック
submoduleを含むリポジトリのclone

参考サイト:
http://ka-zoo.net/2013/04/git-submodule/

submoduleとは
------
サブディレクトリをgitの外部リポジトリの参照として登録する。
参照先についてはサブディレクトリ内に記録されている。

submoduleを含むリポジトリをcloneする
--------------
submoduleを含むリポジトリは、cloneするとsubmodule内のファイルは空の状態で作成される。
内容を反映させるためには以下の操作が必要。

1. .gitmodules ファイルを作る

```bash
$ git submodule init
```

2. submoduleディレクトリの中身を追加

```bash
$ git submodule update
```

以上でサブディレクトリにsubmoduleのファイルがダウンロードされる。
<br />
※ githubにSSH keysを登録していないとこのときに以下の様なエラーになる。

```bash
Please make sure you have the correct access rights
```

SSH keys登録はここを参考に行った。
https://help.github.com/articles/generating-ssh-keys
【初めてのRails4】 gemライブラリを吟味する


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

## 環境

* CentOS6.4
* Rails 4.0.4

## 事前準備に必要なもの

* Ruby 2.x
 * インストールされていない場合は[【Rails4】 インストール編
](http://qiita.com/ryurock/items/77542e00cbca5268e323)を参考してください。
 * プロジェクトの作成をしていない場合は[【Rails4】 プロジェクトの作成 rails new](http://qiita.com/ryurock/items/79bc39a7bb473f140546)を参考にしてください。
* MYSQL
 * インストールされていない場合は[virtualbox(centos)でMYSQLインストールメモ(mysqld_multiで複数インスタンス起動まで)](http://qiita.com/ryurock/items/73df4ab45c96092b63b8)を参考してください。

## 参考にしたサイト

* [Ruby on Rails チュートリアル](http://railstutorial.jp/)
* [Rails Girls ガイド](http://railsgirls.jp/)
* [Railsドキュメント(railsコマンド(rails))](http://railsdoc.com/rails)


## rails new デフォルトでのプロジェクトオプション

* Javascript
 * JQuery
* Database
 * sqlite
* Unittest
 * Unit::test


うーーーーん。。。。。微妙。。。。。。
最初はとりあえず入れて、後で除外してもいいのですが、無駄なディレクトリとか設定とか吐出されると後でお掃除面倒です。

[【Rails4】 プロジェクトの作成 rails new](http://qiita.com/ryurock/items/79bc39a7bb473f140546)ではjavascript,DB等のライブラリは除外していますのでこれに変わるgemを追加しましょう。


```Gemfile
source "https://rubygems.org"

gem 'rails', '4.2.0'


gem 'sass-rails', '~> 5.0'
gem 'bootstrap-sass', '~> 2.3.1.0'
gem 'uglifier', '>= 1.3.0'
gem 'therubyracer', platforms: :ruby
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'bcrypt', '~> 3.1.10'
gem 'devise'
gem 'rails_admin'
gem 'libv8'

group :development, :test do
  gem 'rspec-rails', '3.3.3'
  gem 'guard-rspec', '4.6.4'
  gem 'spork-rails', '4.0.0'
  gem 'guard-rails', '0.7.2'
  gem 'childprocess', '0.5.6'
  gem 'capistrano'
end

group :test do
  gem 'selenium-webdriver', '2.47.1'
  gem 'capybara', '2.5.0'
end

group :production do
  gem 'rails_12factor', '0.0.2'
end

group :doc do
  # bundle exec rake doc:rails generates the API under doc/api.
  gem 'sdoc', require: false
end

# Use mysql as the database for Active Record
gem 'mysql2'
gem 'twitter-bootstrap-rails'
gem 'coffee-rails'
gem 'slim-rails'
gem 'react-rails', '~> 1.0'

# Use ActiveModel has_secure_password
gem 'bcrypt-ruby', '3.1.2'

# Use unicorn as the app server
gem 'unicorn'
```

自分はこういう構成にしました。

* seleniumとかがはいってるのは[Ruby on Rails チュートリアル](http://railstutorial.jp/)に書いてあったのを参考に追加しています。
 * [Ruby on Rails チュートリアル](http://railstutorial.jp/)にはgitのリポジトリの公開からherokuへのデプロイまで書いてあるので始めての人にはそちらをおすすめしております。

自分好みのgemを探して追加しましょう。

## 今一度インストール


```shell
bundle install --path vendor/bundle

Resolving dependencies...
Using rake (10.2.2)
Using i18n (0.6.9)
Using minitest (4.7.5)
Using multi_json (1.9.2)
Using angular-gem (1.2.15)
   .
   .
   .
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.
```

自分好みのオレオレプロジェクトを脳内シュミレートしてお楽しみください！！！
Pythonで数値計算を始める（with Homebrew and pip）

MacOSX 10.8.5（Mountain Lion）
上にPythonで数値計算ができる環境を構築します．

今回はHomebrewとpipを使ってやってみます．
Homebrewはversion 0.9.5です．

まず以下のコマンドでいろいろインストール．

```
$ brew install python
$ sudo easy_install pip
$ sudo pip install ipython
$ sudo pip install scipy
$ sudo pip install ipython
```

当環境ではpython 2.7.6，pip 1.5.4がインストールされました．

ScipyのインストールにFortranコンパイラが必要なのでgfortranをインストールします．

```
$ brew install gfortran
```

```
$ sudo pip install scipy
```

Scipyのインストールには結構時間がかかりました．

ここからはmatplotlibをインストールするための準備です．

```
$ brew install freetype
```

これがないとmatplotlibのインストールでコケます．
さらに以下のシンボリックリンク作成も必要でした．
（[こちら](http://stackoverflow.com/questions/20572366/sudo-pip-install-matplotlib-fails-to-find-freetype-headers-os-x-mavericks)を参考にしました）

```
$ ln -s /usr/local/opt/freetype/include/freetype2 /usr/local/include/freetype
```

そしてmatplotlibをインストール

```
sudo pip install matplotlib
```

使うかわかりませんがpandasもインストールします

```
$ sudo pip install pandas
```

以下`pip freeze`で各バーションを確認した結果です．

```
ipython==1.2.1
matplotlib==1.3.1
numpy==1.6.1
pandas==0.13.1
scipy==0.13.3
```
Passing argument into Angular Controller via HTML data attributes

Just learned a proper way to pass arguments via `data` attribute. It's very easy but I didn't found this on Google / StackOverflow.

Here is the scenario:

* There are some variables generated from server-side.
* They have to be sent into an Angular Controller as a model.

Some StackOverflow answers say that you have to embed JavaScript literals into the code of Angular Controllers, which makes it hard to extract controllers to standalone JavaScript files. Others say that you can assign variables via `ng-init` expressions, which I don't like because [eval is evil](http://www.nczonline.net/blog/2013/06/25/eval-isnt-evil-just-misunderstood/).

I think it's better to pass variables via `data-` attribute, but I didn't know how to do until I found there are some *hidden* providers in Controller.

## Use `$attrs`

It's simple and clean. You can pass variables via `data-something="123"`.

```html
<div ng-app="MyApp">
  <div ng-controller="MyController" data-something="hello">
    {{ modifiedSomething }}
  </div>
</div>
```

```js
var app = angular.module('MyApp', []);

app.controller('MyCtrl', [
  '$scope', '$attrs',
  function($scope, $attrs) {
    $scope.modifiedSomething = $attrs.something + " world";
  }
]);
```

You can see demo here: http://plnkr.co/edit/njwpOFYYgs90XXumUMBX

Besides `$attrs`, there is also an `$element` provider for you to access the element of the controller.

## Missing Document :(

However, I didn't find these providers on [the official API reference of Angular.js](http://docs.angularjs.org/api). Yes I did searched `attrs` and `element` but nothing was found.

It seems that the document of Angular.js is still not good enough.
[SyncStitch]仕様と実装の比較

[masaterukの日記](http://d.hatena.ne.jp/masateruk/20130816/1376633172)
より。

こんな感じですかね。

```scm:Definitions
(define-event send.0)
(define-event send.1)
(define-event recv.0)
(define-event recv.1)

(define-channel rch (x) '((0) (1)))
(define-channel sch (x) '((0) (1)))
```

```scm:SPEC
(define-process SPEC
  (! send.0 (! recv.0 (! send.1 (! recv.1 SPEC)))))
```

```scm:Sender
(define-process S0
  (! send.0
	 (! rch (0)
		(? sch (x) (= x 0)
		   (! send.1
			  (! rch (1)
				 (? sch (x) (= x 1) S0)))))))
```

```scm:Receiver
(define-process R0
  (? rch (x) (= x 0)
	 (! recv.0
		(! sch (0)
		   (? rch (x) (= x 1)
			  (! recv.1
				 (! sch (1) R0)))))))
```

```scm:SYS
(define-process SYS
  (hpar (list sch rch) S0 R0))
```

```scm:Assertions
(deadlock SYS)
(trace SPEC SYS)
(failure SPEC SYS)
```
意外と知られてないっぽいMarkdownのリンクの書き方

~~[ブログに書いた][10]~~ けどやっぱりこっちの方が書きやすいしこっちに書くべき事なのでこっちにも。


----

## 一般的な記法

Qiitalistの皆さんなら次のようなMarkdownが一般的では無いでしょうか。

```md
[たいとる](url)
```

先に文章を書いて囲ってやればいいだけで楽ですね。

## 問題点

しかし、

- **本文中にURLが大量に含まれ** たり、
- **同じリンクを何回も貼っ** たり

する時にはこれは結構煩わしいことになるかと思います。

## 解決策(今回のメイン)

実はMarkdownではこんな記法が使えます。

```md
[タイトル][1]

[1]:url
```

とてもスマートになりました！

本文中に`[hoge][1]`でマーク、本文の後にでも`[1]:http://~`のように定義してやればちゃんとリンクになります。
もちろん一度指定した名前は使い回し可能。

これは使うしか無いでしょ！


----

## 追記

### タイトル(htmlの`title`属性)も付けられる

```md
[1]: url "タイトル"
```

```md
[foo]: http://example.com/  "Optional Title Here"
[foo]: http://example.com/  'Optional Title Here'
[foo]: http://example.com/  (Optional Title Here)
```

### idは省略出来る

```md
[google][]

[google]: url "タイトル"
```

### 画像にも使える

```md
![image][]

[image]: 画像URL "画像タイトル"
```

多分IDでも。

```md
![がぞー][5]

[5]: 画像URL "画像タイトル"
```

詳しくはコメント欄で。@ngyukiさん、ありがとうございます。

http://daringfireball.net/projects/markdown/syntax
↑ここに書いてるマークアップ全てが使えるわけでは無いけど(Qiitaの独自仕様等)分かりやすい！


----

~~なお、例で引用を使ってるのはエスケープがうまくいかなかった為。 この提案をしてくれた@asahina_devさんナイス！
  ちなみに引用内で使用してるidを定義しちゃうとやっぱりこれは普通の引用内のリンクになっちゃいます。~~ <sub>パーサの変更によりコードブロックに戻しています</sub>

他の方法がもしなんかあったり日本語おかしい所とかも編集リクエスト、コメント大歓迎です。()

:::note info
この投稿の記載内容は現在でもおそらく汎用的に利用可能な記法ですが、現在のQiitaで利用可能なリンクのマークアップは [QiitaのMarkdownパーサー変更にともなう「リンク」「オートリンク」「Qiita リンクカード」の記載方法について #redcarpet - Qiita](https://qiita.com/mziyut/items/bc00ed7396bd60a717b8) にくわしく記載されているので併せてご確認ください。
:::


[10]: null
【備忘録】MySQL始めてデータベースに日本語いれようとしたらハマった


これ、たぶん既にすげー数の人がハマった問題だと思うんです、そしてQiita上にも大量に情報があると思いますが、念のため、メモ。

<h1>my.conf(my.ini)の設定をいじる</h1>
MySQLの入れ方(Macports/Homebrew/純正)によってこやつの場所は結構かわるかもしれません。
んで、このmy.confに次の項目を追加してください。(自分は/usr/local/mysql/に居ました)

```:my.conf
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8

[mysqld]
character-set-server=utf8
#if you use mysql<5.5 use this
#default-character-set=utf8

```

<h3>
ポイントは、mysqld<font color="red">だけ</font>default-character-set<font color="red">ではない</font></h3>

てことです。

<font color="red">character-set-server=utf8</font>

です。気をつけましょう。

さて、これで一度mysql.serverをrestartしていただきましたら、mysqlを立ち上げて

```:
mysql>status

```

と打ってみましょう。

```terminal:
Server characterset:	utf8
Db     characterset:	utf8
Client characterset:	utf8
Conn.  characterset:	utf8
```

ってなれいればおk！

さて、ここで問題。
あらかじめ作っておいたDBに以下のSQLを実行したらどうなりましょう。

```SQL:
INSERT INTO table1 
set title = "おっぱい"
,created = now();
```

<font color="red">Incorrect String ...</font>

とでました。確かにおっぱいは不適切かもしれませんが...

 <h3>ちょっとまてよcharsetがlatin1(デフォルト)の状態で作ったDBだから日本語だめなんじゃ....</h3>


とおもってもう一度DBをDropしたあと、もういちどつくりなおしたらとおりました。
御気をつけて！
[SyncStitch]電車の遮断機制御

だんだん複雑になってきた・・・。
電車が通過中に遮断機が下りてしまわないことを確認したい。

```scm:Definitions
(define-channel t-f (x) '((0) (1)))
(define-channel t-b (x) '((0) (1)))

(define-channel f-c (x) '((0) (1)))
(define-channel b-c (x) '((0) (1)))
(define-channel g-c (x) '((0) (1)))

(define-event gate-open)
(define-event gate-close)
```

```scm:SYS
(define-process Train
  (! t-f (0) (! t-f (1) (! t-b (0) (! t-b (1) STOP)))))

(define-process Front-Censor
  (? t-f (x)
	 (if (= x 0)
		 (! f-c (0) SKIP)
         (! f-c (1) SKIP))))

(define-process Back-Censor
  (? t-b (x)
	 (if (= x 0)
		 (! b-c (0) SKIP)
		 (! b-c (0) SKIP))))

(define-process Gate-Controller
  (alt
	(? f-c (x) (= x 0) (! gate-open Gate-Controller))
	(? b-c (x) (= x 1) (! gate-close Gate-Controller))))

(define-process SYS
  (par (list t-f t-b)
	Train
	Front-Censor
	Back-Censor
	Gate-Controller)) 
```
Mac OS X で well-known port を port forwarding

mac os x で well-known ポートをポートフォワードする。
（docker で、boot2docker ないのVMに80通したかったので。）

```shell-session
sudo ssh -p 8080 -gNfL 80:localhost:80 docker@localhost -p 2022 -i ~hoge/.ssh/id_rsa
```

VirtualBox ではできなかったので。。。

pfctl や ipfw でもできそうだけど、よくわからなかった。誰かおしえてください。
Laravel Learning


1,安装

*  `laravel new project_name`
*  `composer create-project laravel/laravel --prefer-dist`

2,配置数据库
	在app/config/database.php中配置。将`host=>127.0.0.1`
    database=>数据库的名字
	在项目根目录下`php artisan migrate:make --table="table_name" CreateUserTable`
在app/database/migrations/文件夹下生成相应的文件
在`public function up()`中`Schema::table('table_name',function(Blueprint $table){})`写入建表query。在`public function down()`中写入删表语句 `Schema:dropIfExists("table_name")`
详细语句资料http://laravel.com/docs/schema#adding-columns

table的名字和app/models/中的文件名对应 models文件夹中的model文件需要自己创建，通过相同的名字框架可以找到对应表的类，也可以在类中指定表名
	 
添加操作model对象：

	$game = new Game;
    $game->name = 'Assassins Creed';
    $game->description = 'Assassins VS templars.';
    $game->save();

通过在model中将`public $timestamps = false;` 关闭自动添加时间戳的功能
Scala: その警告、気付いてる? パターンマッチングの漏れをちゃんと検出する方法


# 課題

パターンマッチに使うクラスにsealedを付加しておくと、パターンの記述漏れをコンパイル時に検出できると言うが…

```scala
object MyApp extends App {
  sealed trait Color
  case object Red extends Color
  case object Green extends Color
  case object Blue extends Color

  def printColor(color: Color) = color match {
    case Red   => println("red")
    case Green => println("green")
    // ここにBlueのケースが無いことに注意
  }
}
```

warningが出るだけ。コンパイルは通ってしまう。

```
% scalac MyApp.scala

MyApp.scala:7: warning: match may not be exhaustive.
It would fail on the following input: Blue
  def printColor(color: Color) = color match {
                                 ^
one warning found
```

warningを見過ごすとパターンマッチングの漏れに気付けない。

# 解決策

`-Xfatal-warnings` をつける

```
% scalac MyApp.scala -Xfatal-warnings

MyApp.scala:7: error: match may not be exhaustive.
It would fail on the following input: Blue
  def printColor(color: Color) = color match {
                                 ^
one error found
```

sbtの場合は build.sbt にオプションを設定する

```scala:build.sbt
scalacOptions ++= Seq("-Xfatal-warnings")
```

warning が error に代わりコンパイルが失敗する。これでパターンマッチングの漏れに気付けるようになる。
[SyncStitch]deadlock検査の実験

状態遷移図をSchemeに手作業変換。

```scm:deadlock
; [masaterukの日記](http://d.hatena.ne.jp/masateruk/20130813/1376398968)

; Definitions
(define-channel sch (x) '((0) (1)))
(define-channel rch (x) '((0) (1)))

; SYS
(define-process Sender
  (! rch (0)
    (? sch (x) (= x 0)
      (! rch (1)
        (? sch (x) (= x 1) Sender)))))

(define-process Receiver
  (? rch (x) (= x 0)
    (! sch (0)
      (? rch (x) (= x 1)
        (! sch (1) Receiver)))))

(define-process SYS
  (par (list sch rch) Sender Receiver))

```
bashでgitのブランチ名を表示

# bashでgitのブランチ名を表示
参考サイト:
http://blog.ruedap.com/2011/07/06/mac-terminal-git-branch-name

# gitcomprication.bash を配置

配置する場所はここ: `/usr/local/git/contrib/completion/`

`gitcomprication.bash`はここ:
(Homebrewでgitを入れた場合) `usr/local/Cellar/git/<gitのversionの数字>/etc/bash_completion.d/git-completion.bash`

配置するためのディレクトリ作成とファイルの移動は以下の操作で行った。

```bash
mkdir -p /usr/local/git/contrib/completion/
mv git-completion.bash /usr/local/git/contrib/completion/
```

# .bashrcの作成と記述
`.bashrc`はホームディレクトリに作成する。
以下の内容を記述。

```bash
# git settings
source /usr/local/git/contrib/completion/git-completion.bash
GIT_PS1_SHOWDIRTYSTATE=true
export PS1='\[\033[32m\]\u@\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\$ '
```

記述したら反映のために以下を実行。

```bash
 source ~/.bashrc
```

.bashrcを読みに行く設定をしてない場合、.bash_profileに足しておく必要がある。

```bash
$ vi ~/.bash_profile

if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi
```

#  __git_ps1: command not found
僕の場合はブランチ名が表示されず、このメッセージが表示されるようになった。
` __git_ps1: command not found`

git-completion.bashの前にgit-prompt.shを読みこませることで対処できるようなので、`.bashrc`の一行目に、以下のように書き加えた。

```bash
source /usr/local/etc/bash_completion.d/git-prompt.sh
source /usr/local/etc/bash_completion.d/git-completion.bash
GIT_PS1_SHOWDIRTYSTATE=true
export PS1='\[\033[32m\]\u@\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\$ '
```

# 追記
横長になりすぎているように感じたので、ブランチ名の後ろで改行するように変更した。

```bash
export PS1='\[\033[32m\]\u@\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\n\$ '
```
Yammerの新着メッセージを自動表示するbookmarklet


需要ないだろうなーとは思いつつ、メモとして。

Enterprise SNSであるYammer。MicrosoftのOffice365とも連携するようになり、社内のインフォーマルコミュニケーションが活性化するため、非常に便利です。

社内の全体会議や勉強会において、サブプロジェクタでYammerを表示しておくと、リアルタイムで意見や質問が書き込まれて面白いのですが、Web版もiOS版も新着メッセージを自動表示する機能が見当たらなかったため、Web版用の簡易Bookmarkletを作りました。

```javascript:bookmarklet
javascript:setInterval(function(){"none"!==document.getElementsByClassName("yj-new-messages-notice")[0].style.display&&document.getElementsByClassName("yj-new-messages-link")[0].dispatchEvent(document.createEvent("MouseEvents").initEvent("click",!0,!0))},500);
```

新着メッセージ通知枠が表示されるのを500ミリ秒間隔でチェック、発見したらクリックイベント発動というシンプルなものです。Chromeで動作確認済です。

ブックマークにこのコードを貼り付けておいて、Yammerの該当グループを表示後、呼び出せばOKです。
> PCのChromeやSafariで登録しておけば、ブックマークをマルチデバイス共有できるので、スマホやタブレットでも使えて便利です。

注: Yammerの表示仕様が変わったら動作しなくなります。エラーチェック等一切してないですが、動けばOKということで。
PHP上でtarアーカイブファイルを作成

Pharを使えばPHP上でシステムのコマンド叩いたりしなくてもtarアーカイブファイルを作成できる。

`data.txt` をアーカイブするサンプル。中身はLorem Ipsumを71KB分。gzip圧縮を用いる。

```php
<?php

$tarPath = __DIR__ . '/data.tar';

$phar = new PharData($tarPath);

// -rw-r--r-- 1 fivestar fivestar  71K Apr  2 17:16 data.txt
$phar->addFile('data.txt');

$phar->compress(Phar::GZ, '.tgz');

// *.tar と *.tgz ができるので、 .tar は消す
unlink($tarPath);
```

アーカイブファイルを展開した結果。

```
% tar xvf data.tgz
data.txt

% ls -l
total 96K
-rw-r--r-- 1 fivestar fivestar 20K Apr  2 17:25 data.tgz
-rw-r--r-- 1 fivestar fivestar 71K Apr  2 17:25 data.txt
```

* 参考:
    * http://php.net/PharData
    * http://stackoverflow.com/questions/7004989/creating-zip-or-tar-gz-archive-without-exec
Git でマージ済みのブランチを対話式に削除する

ひとつひとつ確認しながらマージ済みブランチを消したい時に。

```~/.gitconfig
[alias]
  delmerged = "!f() {\
    IFS=$'\n';\
    for b in `git branch --merged | grep -v '*' | grep -v 'master' | sed -e s/' '/''/g`;\
    do\
      /bin/echo -n \"[ $b ] remove this branch ? [y/n] \";\
      read ANSWOR;\
      if [[ ${ANSWOR} == 'y' ]]; then\
        git branch -D $b;\
      fi\
    done;\
    git branch;\
  }; f"
```
もっと綺麗に書けそう。

関連記事: [Git でマージ済みのブランチを一括削除する #git - Qiita](http://qiita.com/kyanny/items/10a57a4f1d2806e3a3b8)
Array、List、Dictionaryの速度比較

ORM的な何かで取得した`IEnumerable<T>`のデータがあったとき、Array、List、Dictionaryへの変換速度と1件取得の速度を比較してみた。


```csharp
IEnumerable<T> datas;
// 何かデータ取得処理
･･･

var sw = new Stopwatch();
sw.Start();
var array = datas.ToArray();
sw.Stop();
Console.WriteLine("Array変換：{0}", sw.Elapsed);

sw.Reset();
sw.Start();
var list = datas.ToList();
sw.Stop();
Console.WriteLine("List変換：{0}", sw.Elapsed);

sw.Reset();
sw.Start();
var dictionary = datas.ToDictionary(x => x.Id);
sw.Stop();
Console.WriteLine("Dictionary変換：{0}", sw.Elapsed);

// 検索キー取得
var Id = datas.OrderBy(x => Guid.NewGuid()).First().Id;

Console.WriteLine("Id：{0}", Id);

sw.Reset();
sw.Start();
var data1 = array.First(x => x.Id == Id);
sw.Stop();
Console.WriteLine("Array検索：{0}", sw.Elapsed);

sw.Reset();
sw.Start();
var data2 = list.First(x => x.Id == Id);
sw.Stop();
Console.WriteLine("List検索：{0}", sw.Elapsed);

sw.Reset();
sw.Start();
var data3 = dictionary[Id];
sw.Stop();
Console.WriteLine("Dictionary検索：{0}", sw.Elapsed);
```

①変換速度

|回数|Array|List|Dictionary|
|:--|:--|:--|:--|
|1回目|0.0017449|0.0016148|0.0053250|
|2回目|0.0017138|0.0015178|0.0054479|
|3回目|0.0017235|0.0016059|0.0053376|

②検索速度

|回数|Array|List|Dictionary|
|:--|:--|:--|:--|
|1回目|0.0007101|0.0006819|0.0000109|
|2回目|0.0003431|0.0002906|0.0000105|
|3回目|0.0009737|0.0009600|0.0000109|

変換速度はList < Array <<<<< Dictionayだったが、
検索速度はDictionary <<<<<<<<<< List < Arrayだった。

Dictionaryの結果は予想通りだったけど、ArrayとListが意外だった感。
githubの任意のリポジトリをcloneする

# githubからclone
githubのサイトを見ると、`clone URL`が右下のあたりに見つかるはず。![cloneurl.png](https://qiita-image-store.s3.amazonaws.com/0/40921/b4d67efa-abdf-e4c2-e015-713cd60f50c9.png)
テキストエリア内のURLをコピーしておく。

その後ターミナルで以下を入力。
`$ git clone <さっきコピーした内容>`

カレントディレクトリにリポジトリのcloneが作られる。
Atomの痛エディタの設定方法

こいつを追加するだけ。

```css:.atom/styles.less
.overlayer {
  background-image: url("ファイルパス");
  opacity: 0.20;
  background-repeat: no-repeat;
  -moz-background-size:auto 100%;
  background-size:auto 100%;
}
```

opacityとかrepeatとかsizeとかはお好みで。

こんな感じになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40887/9b00891d-cf5e-c96a-2275-f3e7ec6064e3.png)

***※2014/04/05追記***

コメントにも書きましたが、overlayerはカーソル棒位置の点滅で使ってるので、opacityを指定するとエディタとしてかなり使いにくくなります。。。

カーソル棒を消してカーソル位置を大きくする方法もあるので、これを組み合わせる手があります。

参考URL:
http://discuss.atom.io/t/block-cursor-possible/3222/3

他にいい方法あれば教えて下さいーm(_ _)m
1slide で理解するGit

## 1slide

![gitslide.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/aeeb3ab8-d01a-3c7e-c9e3-783f2847c8b2.png)


## setting
git diff/git mergeはツールの使用を推奨。ツールの設定を行い、下記のコマンドで実行する。

diff : `git difftool -y --dir-diff`
merge : `git mergetool -y`

[difftool/mergetoolの設定](http://git-scm.com/book/ja/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-%E6%9C%80%E5%88%9D%E3%81%AEGit%E3%81%AE%E6%A7%8B%E6%88%90)
`git config --global merge.tool vimdiff`
標準ではkdiff3、tkdiff、meld、xxdiff、emerge、vimdiff、gvimdiff、ecmerge、opendiffが使用可能。
WinMergeはないのか、という場合[こちら](http://orangeclover.hatenablog.com/entries/2012/08/13)参照。
推奨されているP4Mergeの設定は[こちら](http://git-scm.com/book/ja/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%81%AE%E8%A8%AD%E5%AE%9A#外部のマージツールおよび-Diff-ツール)

WinMerge2.14.0.37では下記の設定で意図通り動作することを確認。

```
[diff]
    tool = WinMerge
    guitool = WinMerge
[difftool]
    keepBackup = false
[difftool "WinMerge"]
    cmd = \"C:/Program Files/WinMerge/WinMergeU.exe\" -e -u -x -wl -dl "base" -dr "mine" \"$LOCAL\" \"$REMOTE\"
[merge]
    tool = WinMerge
[mergetool]
    keepBackup = false
[mergetool "WinMerge"]
    cmd = \"C:/Program Files/WinMerge/WinMergeU.exe\" -r -e -u -wl -wm -dl "mine" -dm "branch" -dr "merged" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"
```
railroadyを利用してAASMの状態遷移図をGraphvizで出力する

AASMでコーディングされた以下のコードをGraphvizでPNG出力してみます

```rb:cpu_state.rb
require 'aasm'
class CPUState
  include AASM
  aasm do
    state :new, :initial => true
    state :ready
    state :waiting
    state :running
    state :terminated

    event :wake_up do
      transitions :from => :new,     :to => :ready
      transitions :from => :waiting, :to => :ready
    end
    event :schedule do
      transitions :from => :ready, :to => :running
    end
    event :preempt do
      transitions :from => :running, :to => :ready
    end
    event :yield do
      transitions :from => :running, :to => :waiting
    end
    event :terminate do
      transitions :from => :running, :to => :terminated
    end
  end
end
```

### 準備 ###


```rb:Gemfile
gem "railroady"
```

```rb:Rakefile
namespace "doc" do
  desc "print dot eg) | dot -Tpng -o aasm.png"
  task "dot" do
    require 'railroady/options_struct'
    require 'railroady/aasm_diagram'
    a = AasmDiagram.new
    require "./cpu_state"
    a.send(:process_aasm_class, CPUState)
    puts a.instance_variable_get(:@graph).to_dot
  end
end
```

### 実行 ###

```bash
$ bundle exec rake doc:dot | dot -Tpng -o cpu_state.png
```

※AASM 4.0以降の場合deprecatedが多発しますが、railroadyが悪いのです。:-p)

![cpu_state.png](https://qiita-image-store.s3.amazonaws.com/0/22754/59e43411-b735-d515-3d6b-5ed0ef0ef3a1.png)



あとがき
--------

railroadyはRailsプロジェクトを対象にしており、単純にAASMで組まれたコードを出力するのが難しいです。

この方法で一応出力はできます。private methodですので、こういう呼び出し方はいかがなものかと思いますが。というか、もっと汎用的に使えるようにrailroadyの作者に提案はしてみたいと思います。
NewtonSoft.Json: 型に定義されていない任意のフィールドを辞書に追加する(インデクサ)



受け取ったJSONのパースではなく、任意のフィールドを追加してJSONにして渡す。
ExtendsをDictionary<string,JToken> でつくって、JTokenでset/getするインデクサを用意する。
        

```csharp

        public class MyToken 
        {
            [JsonIgnore]
            public int? id {get;set;}
            public int Number { get; set; }
            public string Name { get; set; }

            [JsonExtensionData]
            protected IDictionary<string, JToken> Extends = new Dictionary<string, JToken>();                   
  
            public JToken this[string name]
            {
                get { return this.Extends[name]; }
                set {this.Extends[name] = value;}
            }
        }
```
        
テスト:

```csharp
        
        [TestMethod]
        public void TestSerializerExtensible()
        {

            var token_str = @"
            { ""Number"": 432143, ""Name"" : ""Hoge Hoge"", ""http://hoge.com/"" : true, ""id"":35 }
            ";

            var token =  JsonConvert.DeserializeObject<MyToken>(token_str);

            Assert.AreEqual(token.Name, "Hoge Hoge");
            Assert.AreEqual(token.Number, 432143);
            Assert.IsNull(token.id);

            token.id = 1;
            Assert.IsTrue(token.Extends["http://hoge.com/"].ToObject<bool>());
            Assert.AreEqual(token.Extends["id"].ToObject<int>(), 35);
            Assert.AreEqual(token.id, 1);
            
            // 新規作成
            var token2 = new MyToken();

            token2["My name is"] = "Prince";
            token2["My age is"] = 9;
            var str2 = JsonConvert.SerializeObject(token2);
            Console.WriteLine(str2);    

            // 復元
            var token3 = JsonConvert.DeserializeObject<MyToken>(str2);
            Assert.AreEqual(token3["My age is"], 9);
            Assert.AreEqual(token3["My name is"], "Prince");


        }
```
SQLで開店時間と閉店時間などを条件とする際、日付をまたぐケースがある場合

とりあえずメモ。
時間が空いたときに書き直して整理する。

SQLで開店時間と閉店時間などを条件とする際、日付をまたぐケースがある場合、単純に大小比較やBETWEENでは比較できないので、少しややこしくなる。

多分、こんな感じになるとおもう。

```sql
-- お店が18:00:00に開いているかを調べる場合
SELECT
	shop.shop_id,
	shop.shop_name
	shop.open_time,
	shop.close_time
FROM
	shop
WHERE
	(
		(shop.open_time < shop.close_time -- exp: 10:00 - 22:00
			AND '18:00:00' BETWEEN shop.open_time AND shop.close_time
		)
		OR (shop.open_time > shop.close_time -- exp: 17:00 - 02:00
			AND (
				'18:00:00' BETWEEN shop.open_time AND '23:59:59'
				OR '18:00:00' BETWEEN '00:00:00' AND shop.close_time
			)
		)
	)
```
UIPrgogressViewのアニメーションスピード


### 全部進みきるまでに1[sec]
```
progressView.progress = 0.0;
[progressView setProgress:1.0 animated:YES];
```
としたとき、アニメーションが完了するまでの時間は *1.0[sec]*


### 調べ方
UIProgressViewをサブクラスした上で `layoutSubViews`をオーバーライド

```
@implementation CustomProgressView

- (void)layoutSubviews {

    [super layoutSubviews];

    UIView *v = self.subviews[1];
    for (NSString *key in v.layer.animationKeys) {
        CAAnimation *a = [v.layer animationForKey:key];
        NSLog(@"%lf", a.duration);
    }

}

@end
```

とした上で `– setProgress:animated:`を呼ぶとアニメーションのdurationがコンソールに表示されます。
homebrewでgitをインストール(OS X)

# homebrewをインストール

参考サイト:
http://tools4hack.santalab.me/howto-mountainlion-install-homebrew.html

1. Javaのインストール
2. Xcode Command Line Toolsをインストール
3. homebrewをインストール<br/>
コマンドラインで以下を実行。
`$ ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"`

# gitをインストール

`$ brew install git`

# ※補足
ホームディレクトリに`.bash_profile`を作成し以下の記述をする必要があると紹介するサイト(http://www.e2esound.com/wp/2013/07/03/git-kai_how_to_install_git_with_homebrew/)
もあったが、自分の場合は無くても大丈夫そうだった。
```bash
PATH=/usr/local/bin:$PATH
export PATH
if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi
```
JScriptでのScripting.FileSystemObjectオブジェクト TIPS

## はじめに

「FileSystemObject」を使う時によく使うコードをつらつらと

## スクリプトフォルダ

スクリプトのカレントパスを取得するコードです。
「WScript」オブジェクトから実行中のスクリプトパスの親フォルダを取得しています。
末尾に「/」が無いので、文字列連結するときは注意して下さい。

```js
// 「FileSystemObject」オブジェクト生成
var fso = new ActiveXObject("Scripting.FileSystemObject");
// Scriptのカレントパス取得
var folderName = fso.GetParentFolderName(WScript.ScriptFullName);
```

## フォルダ生成

存在するフォルダ上にフォルダを生成するメソッドはあるのだが、
存在しないフォルダが２つ以上ある場合、エラーとなってしまうので
そういう場合にも対応したメソッドです。


```js
// 「FileSystemObject」オブジェクト生成
var fso = new ActiveXObject("Scripting.FileSystemObject");

function createFolder(folderpath) {
    // フォルダ存在チェック
    if (!fso.FolderExists(folderpath)) {
        if (fso.GetParentFolderName(folderpath)) {
            // フォルダが存在しなかったので、親フォルダ生成
            createFolder(fso.GetParentFolderName(folderpath));
            // フォルダ生成
            fso.CreateFolder(folderpath);
        }
    }
}
```

## ファイル読込

ファイル全体を読み込む場合、「TextStream」オブジェクトの「ReadAll」メソッドを使えばいいのだが
この「ReadAll」メソッドは、不具合があってファイル内にNULL文字(0x00)がある場合、正常に動作しない。
ちなみに、「ReadLine」も同じ不具合を持っています。

```js
// 「FileSystemObject」オブジェクト生成
var fso = new ActiveXObject("Scripting.FileSystemObject");


function readAll(ts, close) {
    // テキスト初期化
    var text = "";
    // ファイルの末尾までループ
    while (!ts.AtEndOfStream) {
        // ファイル読込
        text += ts.Read(1024);
    }
    // クローズ判定
    if (close) {
        // クローズ
        ts.Close();
    }
    return text;
}
```

使用例

```js
var ts = fso.OpenTextFile("c:\\text.txt", 1);
var text = readAll(ts, true);
```

なんて、「ReadAll」はダメで、「Read(1024)」とかは大丈夫なんだろ・・・不思議
Nginxで使える変数一覧

NginxのCoreModuleに定義されている変数一覧。

http://wiki.nginx.org/HttpCoreModule#Variables


ココには違う書き方がされていますが、

`$host`と`$http_host`の違いは、ポート番号を持っているか否かです。
$http_hostはポート番号がついています。