OmniAICreator/Qiita-1.07M huggingface dataset:
logback+MDCでWebアプリのリクエスト内容を簡単にログに出力する方法


logbackにはMapped Diagnostic Contexts (MDC)というログに追加情報を付与する機能があります。
この機能は、Webアプリでログ出力を行う時にはとても便利です。

[Chapter 8: Mapped Diagnostic Context] (http://logback.qos.ch/manual/mdc.html)

## 説明

簡単な例を以下に記述します。

```java
class MyAppController {
  org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger("myapp");

  public void indexAction()  {
    MDC.put("action", "index");

    logger.debug("logging in indexAction");
    func();

    MDC.remove("action");
  }

  private void func() {
    logger.debug("logging in func");
  }
}
```

```logback.xml
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%date %level %logger{64} [%X{action}] %msg%n</pattern>
    </encoder>
</appender>
```

`MDC.put()`で任意のキー名に対して出力したい文字列を指定します(ここでは"action"がキー)。
出力するにはlogback.xmlのログ出力フォーマットに「%X{キー名}」という表記で出力箇所を指定します。
これでログ出力を行うと、ログに`MDC.put()`で指定した文字列が毎回出力されるようになります。


上記の処理結果として以下のようなログが出力されます。
```
2014-08-10 19:00:00,000 DEBUG myapp [index] logging in indexAction
2014-08-10 19:00:01,000 DEBUG myapp [index] logging in func
```

`MDC.put()`で指定した内容はスレッドローカルな値で、そのスレッド内のすべてのログ出力箇所に影響します。
出力が不要になったキーは`MDC.remove()`で削除します。
removeしなければそのスレッドに対して設定され続けることになります（勝手に消えたりしません）。スレッドプールを使っているときは、明示的に削除するなどした方が良いです。ある処理で使ったスレッドがそのまま別の処理でも再利用された時に、設定されたMDCの内容が残ったままになるので、ログに誤った情報が出力されることになります。


## Webアプリケーションでの利用

この機能は、Webアプリケーションのログにはかなり有効です。
logbackには、[ch.qos.logback.classic.helpers.MDCInsertingServletFilter](http://logback.qos.ch/manual/mdc.html#mis)というServletFilterが用意されています。
このフィルタを、web.xmlですべてのパスに適応しておくだけでHTTPのリクエスト内容をMDCに設定してくれます。

このフィルタの実装は以下で参照できますが、かなりシンプルでわかりやすいものです。
  http://logback.qos.ch/xref/ch/qos/logback/classic/helpers/MDCInsertingServletFilter.html

これを参考にすることで、例えば「ログインが必要なWebサイトで、すべてのログ出力にアクセスしたユーザIDを一緒に出力する」といったことが簡単に実現できます。


## MDCの出力先

このMDCの機能は便利ですが、１行のログに様々な内容を出力しても読みづらくなってしまいます。
そういう場合には[Sentry] (https://getsentry.com/)のようなログ集約ツールが便利です。
Sentryは総合的なログの集約Webアプリで、１件ごとのログ出力内容をWeb画面で表示でき、MDCで指定したすべての内容を見やすく表形式で表示してくれます。

logbackでの出力の設定方法は、[raven-logback](https://github.com/getsentry/raven-java/tree/master/raven-logback) という公式のクライアントを使うことでを使うことで以下のようにAppenderとして指定するだけで簡単に利用できます。



``` logback.xml
<configuration>
    <appender name="Sentry" class="net.kencochrane.raven.logback.SentryAppender">
        <dsn>https://publicKey:secretKey@host:port/1?options</dsn>
        <tags>tag1:value1,tag2:value2</tags>
        <!-- Optional, allows to select the ravenFactory -->
        <!--<ravenFactory>net.kencochrane.raven.DefaultRavenFactory</ravenFactory>-->
    </appender>

    <root level="warn">
        <appender-ref ref="Sentry"/>
    </root>
</configuration>
```


## 補足

Sentryに関しては、MDCInsertingServletFilterを使うよりもSentryのクライアントライブラリに含まれるnet.kencochrane.raven.servlet.RavenServletRequestListenerを使った方が、Sentryに沿ったログ出力ができるようです。

使い方は、web.xmlでこのクラスをlistenerに追加するだけです。

```web.xml
    <listener>
        <listener-class>net.kencochrane.raven.servlet.RavenServletRequestListener</listener-class>
    </listener>
```
Unity C# リロード（初期状態にもどる）的な処理


シーンを初期状態に戻したい（読み込んだ状態に戻したい）時は、
以下のように、自身のシーン名を指定した <code>Application.LoadLevel()</code> を利用するとよさそう。

```C#
using UnityEngine;

public class Sample : MonoBehaviour {

    void OnGUI() {

        if( GUILayout.Button("Reload") ) {

            Application.LoadLevel("Main"); // シーンの名前かインデックスを指定
        }
    }
}
```

ただし、シーンの再読み込みだと、
GameObjectはリセットされるけど、スクリプトは残ってしまいます。

僕がよくやる方法としては、

* インスタンスが複数になると困る部分は[シングルトンパターン](/calmbooks/items/9cf32c6dd36b724b155e)を使う
* リセットされたくないGameObjectには以下を指定

```C#
using UnityEngine;

public class Sample : MonoBehaviour {

    void Awake () {

        DontDestroyOnLoad(this); // シーン読み込みの際に破棄されなくなる
    }
}
```

という感じで、プログラム全体を設計しておく。
GASまわりのお勉強メモ

===================================================================================

setSandboxMode
-----------------------------------------------------------------------------------

cajsの処理を省いて高速化する実験的オプション
createTemplateFromFileではつかえないみたい。

HtmlService.createTemplateFromFile
-----------------------------------------------------------------------------------

html側でgasを実行する仕組みテンプレート処理
テンプレ上ではUtilitiesがつかえなかったりするかも

テンプレートからのGASリクエスト（関数）
-----------------------------------------------------------------------------------

        google.script.run.withSuccessHandler(function(msg, element) {
            showError("正常終了", $('#button-bar'));
            element.disabled = false;
        }).withFailureHandler(function(msg, element) {
            showError(msg, $('#button-bar'));
            element.disabled = false;
        }).withUserObject(this).test();

返値はstringなので、配列などの受け渡しが必要なら、

	JSON.parse(msg);

とかつかうことになる。

ボタンにスクリプトを割り振る
-----------------------------------------------------------------------------------

ボタンを設置して右クリックとかで関数を割り当てられる

開発手法についての記事
-----------------------------------------------------------------------------------

coffee scriptつかってるみたい
coffee consoleとかgas-managerも便利かな

http://qiita.com/soundTricker/items/4d04c97c499b22886dfd

ライブラリの活用
-----------------------------------------------------------------------------------

standard script
これにクラスとしてスクリプトをつくっていく。。
メニューやアイテムとしての呼び出しができないっぽい？
addmenuとかadditemにグローバルの冠数詞か指定できないのかな。

ドキュメントが前より充実してるみたい
-----------------------------------------------------------------------------------

https://developers.google.com/apps-script/

アプリケーションとして公開
-----------------------------------------------------------------------------------

DBがかなり弱かったりデバッグが厳しかったりするらしい。
うーん。ちょっとしたビューの作成くらいかな。

Google I/O で発表された GAS の新機能で Web アプリを作ってみた - WebOS Goodies
http://goo.gl/Xk6zZ

deployの方法
-----------------------------------------------------------------------------------

シートのスクリプトには対応していないのですぐには実践できないけど試してみた。
おお、動いたー。本当は、こういうの（gas-manager）を使った方法にした方がいいな。

「gas init -P」でプロジェクト設定できるけど、
srcとかtestとか環境をつくる場合には手動で設定ファイルをいじるのかな。

加えて、フォーラムにあるようにするといいのだろう。

> Libraryプロジェクトをdev modeで読み込めば、
> Libraryプロジェクトを更新すれば自動で
> webアプリケーションが更新されるという形は可能です。

> トリガーの外部化などのテクニックを使えばかなりライブラリ側にコードを寄せられるはずです。


参考

Google I/O で発表された GAS の新機能で Web アプリを作ってみた - WebOS Goodies
http://goo.gl/Xk6zZ

Google Apps Scriptのソースコードの構成管理について - Google グループ
https://goo.gl/UH7xhS

joestump/python-gas-cli
https://goo.gl/0vDPMD

soundTricker/ScriptManager
https://goo.gl/wzHKmW

soundTricker/gas-manager
https://goo.gl/NsB4ja
Swiftでmap関数の引数を増やしてしまおう．


配列を`map`するとき，`map`に与えるクロージャで配列のインデックス値を使いたくなる時がある．
例えばこんなクロージャ．
`{(v:Int, i:Int) in v << (24 - (i * 8))}`
そして，`array.map(f, 0)` などと使いたくなる気分．ですが，これってなんだか`map`の伝統を壊してるような気がしていやなんですよね．パッと見，なんだこれ？ってなりそうで．

APIとしてよさそうなのは，Schemeのように複数のリストを引数にとれるmap関数でしょうか．
というわけで，早速，extensionしてみました．

```swift
extension Array {
    func map<U>(other: [T], transform: (T, T) -> U) -> [U] {
        assert(self.count == other.count)
        var v = [U]()
        for i in 0 ..< self.count {
            v.append(transform(self[i], other[i]))
        }
        return v
    }
}
```
この例では，自分ともう一個の配列に対してクロージャを適用します．両配列サイズは同じと仮定．

```swift
[1,2,3,4].map([5,6,7,8]){$0 + $1}
// ==> [6,8,10,12]
```
そして，当初の配列のインデックス値を使いたいときはこんな感じ．

```swift
let array   = [1,2,3,4]
let indices = [0,1,2,3]

array.map(indices) {$0 << (24 - ($1 * 8))}

```

2つ以上の配列を使いたいときは，上記を元にどんどん定義していけばよさそうです．
個人的にExtensionにハマっているのと，Trailing Closureを使いたいがために上のようなことやりましたが，別に配列に組み込まなくても独立なmap関数として定義したほうがいいかもしれません．
人によっては，
`map(function, array0, array1,...)`
のほうが見慣れてるかも．しかも可変引数で定義できそうだし．

配列のサイズが異なる場合はどうするのがいいのかなぁ．．
Rubyのテンプレートエンジンをerbからslimに変更する際に変えた事


新しくrailsでサービスを作る事になったので、どうせなら今後の開発効率化も兼ねてslimにしてみようと変更してみた。
まぁ今さらslimの説明なんて不要だと思うけど、簡単な説明/メリットと変えるにあたって変更した点をまとめておきます。

##slimとは？
[本家のサイト](http://slim-lang.com/)を引用すると

```
可読性を保ちつつも、本質的な部分のsyntaxを減らす事を目的とする
```
[パフォーマンステスト](https://gist.github.com/NSError/4033005)を見る限り、erb/hamlより優秀w

まとめると、
・可読性は失わない & コード量は減る
・パフォーマンスの面でも他より優秀

良い事だらけだ・・・ww

##インストール

```Gemfile
gem 'slim-rails'
```

bundle installを実行。
デフォルトのテンプレートエンジンをslimに変更。

```config/application.rb
class Application < Rails::Application
  config.generators.template_engine = :slim  
end
```
これでrails g した際にはデフォルトでslimになります。

##既存のものをslimに変更

[html2slim](https://github.com/slim-template/html2slim)を使えば既存のhtml/erbもslimに変換してくれます。
最初知らずに、勉強がてら自分で変えていた。。。orz

```
$ gem install html2slim
```
インストールすると、

```
$ html2slim -h
$ erb2slim -h
```

コマンドが実行できるように。
※rbenvでrubyを管理している人はrbenv rehash実行して下さいねw

[How To: Create Haml and Slim Views](https://github.com/plataformatec/devise/wiki/How-To:-Create-Haml-and-Slim-Views)を参考にすると既存のものをワンライナーで変更できるよう。

```
$ for file in app/views/devise/**/*.erb; do erb2slim $file ${file%erb}slim && rm $file; done
```

実行すると既存のerbは全てslimに変わりましたね。素晴らしいw

##vimにvim-slimのプラグイン追加

最後にslimに変更するとシンタックスのハイライトが効かなくなったので効くようにプラグインを追加する。

[vim-slimのgithub](https://github.com/slim-template/vim-slim)のREADMEをみてもらえれば、方法は書いてます。
ただ僕の場合はREADMEに載っているInstall with pathogenを参考にするとエラーになったので、一応自分の方法を記載。

####pathogenってなんぞや？
知らない人のために一応説明。

```
pathogenはvimプラグインの読み込みパスを変更するプラグイン。
従来だと.vim/plugin、.vim/autoload等のディレクトリを読み込むようになっていたところを、pathogenを導入すると、.vim/bundle/<プラグイン名>/で管理できるので、プラグイン別にそれぞれディレクトリを切って管理できるようにしてくれます。
```

早速インストールしていきます。
[vim-pathogen](https://github.com/tpope/vim-pathogen)のREADMEを参考に、

```
$ mkdir -p ~/.vim/autoload ~/.vim/bundle && \
$ curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
```

インストールをしたら下記を実行。

```~/.vimrc
execute pathogen#infect()
syntax on
filetype plugin indent on
```

そしてvim-slimをインストール。

```
$ pushd ~/.vim/bundle; \
$ git clone git://github.com/slim-template/vim-slim.git; \
$ popd
```

一応vimrcをreloadしておけば、問題なくslimの場合でもvim上でハイライトが効いているかと。

これでslimの環境okです。
Vagrant+ChefでPostgreSQLに初期データ登録を実行する

※vagrantの設定とかpostgresqlのインストールとかはすっとばしてます

# chef-soloのインストール

クックブックを作成するにあたって`knife`コマンドを使いたいので、
ホスト側にchefをインストールします。

```bash
curl -L https://www.opscode.com/chef/install.sh | sudo bash
```

# セットアップ用cookbookの作成
PostgreSQLのインストールや設定は別のcookbookでやるとして、今回は初期データ登録用のcookbookを別途作成することにします。

PostgreSQLセットアップ用のcookbookの作成

```bash
$ knife cookbook create setup-postgresql -o site-cookbooks
```
-o でcookbookの出力先を指定します。
site-cookbooksディレクトリの下に作成するのが慣例みたいなので、そこに従って作成しておきます。

すると、`site-cookbooks/setup-postgresql/`ディレクトリが作成されさらにその下になんかいろいろあります。

# スクリプトを書く
ファイルを開く

```bash
$ vi site-cookbooks/setup-postgresql/recipes/default.rb
```

下記の用に編集

```rb
bash 'create_database' do
        user "postgres"
        code "initdb -D /var/lig/pgsql9/data --encoding=EUC_JP --locale=C"
        code "create role <必要なロール名>"
        code "create user <必要なユーザー>"
        code "createdb -E EUC-JP <データベース名> --template=template0 --locale=C"
        code "psql <データベース名> < /vagrant/<初期データ>"
end
```

自分が扱っているサービスが古いサービスで文字コードがEUCだったりするので、データベース作成時とかにオプションつけてます。これやらないとエラーになる・・・

後はVagrantfile内に今回作成したcookbookを実行するようにすればデータベースが作成され初期データが登録されます。
Unity C# シングルトンパターンの実装


## C#でのシングルトンパターン

C#でのシングルトンの一例です。
以下のように書く。

```C#
using UnityEngine;

public class SampleSingleton {

    private static SampleSingleton mInstance;

    private SampleSingleton () { // Private Constructor

        Debug.Log("Create SampleSingleton instance.");
    }

    public static SampleSingleton Instance {

        get {

            if( mInstance == null ) mInstance = new SampleSingleton();

            return mInstance;
        }
    }

    public int testNum = 10;

    public void setNum ( int num ) {

        testNum = num;
    }
}
```

### 使う側

適当なGameObjectに貼り付けておきます。

```C#
using UnityEngine;

public class Sample : MonoBehaviour {

    SampleSingleton sample1;
    SampleSingleton sample2;

    void Start () {

        sample1 = SampleSingleton.Instance;
        sample2 = SampleSingleton.Instance;

        if( sample1 == sample2 ) {

            Debug.Log("sample1 == sample2");
        }

        Debug.Log( sample2.testNum ); // 10

        sample1.setNum(100);

        Debug.Log( sample2.testNum ); // 100
    }
}

```

## MonoBehaviourを使いたい（GameObjectにしたい）場合

便利な機能いっぱいのMonoBehaviourを継承したい場合がありますよね。

```C#
using UnityEngine;
using System.Collections;

public class SampleSingleton : MonoBehaviour {

    private static SampleSingleton mInstance;

    private SampleSingleton () { // Private Constructor

        Debug.Log("Create SampleSingleton GameObject instance.");
    }

    public static SampleSingleton Instance {

        get {

            if( mInstance == null ) {

                GameObject go = new GameObject("SampleSingleton");
                mInstance = go.AddComponent<SampleSingleton>();
            }

            return mInstance;
        }
    }

    void Start () {

        Debug.Log("Start");
    }

    void Update () {

        Debug.Log("Update");
    }
}
```

インスタンス化の時に、GameObjectを生成し自身をコンポーネントに追加する。
RubyMineのキーバインドをVimに変更する

Vimキーバインドに変換してくれる「ideaVim」をインストールするまで

**※ 検証環境**
MacOS 10.9.4
RubyMine 6.3.3

### 1. RubyMineの設定画面へ移動する
RubyMine > Preferences...
![スクリーンショット 2014-08-10 21.10.13.png](https://qiita-image-store.s3.amazonaws.com/0/2813/c0acba55-94ff-9828-cf45-5a985fc8226c.png "スクリーンショット 2014-08-10 21.10.13.png")

### 2. Plugin設定画面へ移動する
左サイドバーのメニューから「Plugins」を選択
![スクリーンショット 2014-08-10 21.14.43.png](https://qiita-image-store.s3.amazonaws.com/0/2813/ea472a4a-4bf1-6f0e-a85f-6864a7ef86ec.png "スクリーンショット 2014-08-10 21.14.43.png")

次に、「Browse repositories...」ボタンをクリック。新規ウィンドウが立ち上がる。
![スクリーンショット 2014-08-10 21.09.53.png](https://qiita-image-store.s3.amazonaws.com/0/2813/b79ea19f-f94a-39ae-f402-fb5c399125aa.png "スクリーンショット 2014-08-10 21.09.53.png")


### 3. 「ideaVim」を検索する
新しく立ち上がったウィンドウの検索窓に「ideaVim」と入力する。するとideaVimがヒットするので、「Install plugin」ボタンを押す。
![スクリーンショット 2014-08-10 21.15.07.png](https://qiita-image-store.s3.amazonaws.com/0/2813/5537b56f-fe41-4505-dafc-2901f7147a60.png "スクリーンショット 2014-08-10 21.15.07.png")


### 4. RubyMineを再起動する
インストールは終わったので、あとはRubyMineを再起動するだけ。

### 【番外編】
１．INSERTモードで「Ctrl+f」での移動ができるようにする
２．「Ctrl+r」でRunが動かせるようにする
#### 1. Vim Emulation設定画面へ移動する
RubyMine > Preferences... > Vim Emulation
![スクリーンショット 2014-08-10 21.33.01.png](https://qiita-image-store.s3.amazonaws.com/0/2813/69ca4a55-48f4-41e1-ec86-0db0df8d7b78.png "スクリーンショット 2014-08-10 21.33.01.png")

#### 2. IDE Actionのうち、「Left」と「Run」のHandlerを「Vim」から「IDE」にする
これにより、コマンドを実行した際にVimではなくIDEへ制御が移るようになる
![スクリーンショット 2014-08-10 21.33.01.png](https://qiita-image-store.s3.amazonaws.com/0/2813/741c11ba-dc7e-d37e-f3ac-b3426ad25472.png "スクリーンショット 2014-08-10 21.33.01.png")
ゲストOSで実行するphpunitのテストコードをPhpStormでブレークポイント設定する


本投稿で対象となる環境は、ホストOSのPhpStormでテストコードを書き、それらのコードをVagrantのvm.synced_folderでマウントして、ゲストOSでphpunitを実行しているような環境です。

テストコードでError、Faultになったとき、デバッグの一手段としてブレークポイント設定ができると作業が捗ります。

本投稿のIPアドレスとポートは以下の通り。

ホストOSのIPアドレス **192.168.33.1**
ゲストOSのIPアドレス **192.168.33.30**
xdebugのポート **9000**

# PhpStormのPHP Servers設定

PhpStorm PreferenceのServersを追加します。

## 設定画面

![kobito.1407665573.276452.png](https://qiita-image-store.s3.amazonaws.com/0/18212/a4361ba2-1f75-cf74-1058-1b41f461b9f0.png "kobito.1407665573.276452.png")


設定値は

Name **laravel_server_name (任意)** ← phpunitを実行するときに利用する
Host **192.168.33.30**
Port **9000**
Debugger **Xdebug**
Use path mappings **チェックする**

## パスのマッピング

また、上記設定画面でテストコードのパスマッピングを設定します。ホストOSのファイル毎にゲストOSの絶対パスを設定できます。ブレークポイントを設定したいコードはゲストOSの絶対パスを設定してください。

上記画面ではPhpStormプロジェクト(ホストOS)の **app/tests/ExampleTest.php** をゲストOSの絶対パス **/vagrant/laravel/app/tests/ExampleTest.php** に設定しています。
ExampleTest.phpはlaravelに含まれているサンプルのテストコードです。

# PhpStormのPHP Debug設定

PhpStorm PreferenceのDebugでxdebugの設定を行います。

## 設定画面

![kobito.1407668027.932548.png](https://qiita-image-store.s3.amazonaws.com/0/18212/79df1ee3-b37c-73b5-e0c7-7e94677d36a2.png "kobito.1407668027.932548.png")

### Xdebugの設定値

Debug port **9000**
Can accept external connections **チェックする**
Force break at the first line when no path mapping spceified **任意**
Force break at the first line when a script is outside the project **任意**

## PhpStormのブレークポイント設定

メニュー「Run」「Toggle Line Breakpoint」でブレークポイント設定をできます。またエディタの左端をクリックすることで切り替えることも可能です。ブレークポイントを設定するファイルは必ずパスのマッピングを行っておいてください。

![kobito.1407671470.163906.png](https://qiita-image-store.s3.amazonaws.com/0/18212/bfca8ee0-9440-0bd4-1e0c-0db8844f99e3.png "kobito.1407671470.163906.png")


## phpunitの実行

### PhpStormを接続待ち状態に変更する

メニュー「Run」「Start Listen for PHP Debug Connections」でxdebugの接続待ち状態になります。

### ゲストOSのターミナルでphpunitを実行する

```
$ XDEBUG_CONFIG="on" PHP_IDE_CONFIG="serverName=laravel_server_name" phpunit
```

XDEBUG_CONFIGは何でも良いので値をセットするとxdebugの接続を行うようです。
PHP_IDE_CONFIGが重要で、本投稿ではserverName=laravel_server_nameと設定していますが、このlaravel_server_nameは先ほどPhpStormのPHP Serversで設定したNameの値です。

xdebugの接続が正常に行われ、ブレークポイントを設定したパスのマッピングが問題なければ、次の画面のようにPhpStormでブレークしているはずです。
ステップ実行やスーパーグローバル・ローカル変数の書換が可能です。

![kobito.1407671409.530058.png](https://qiita-image-store.s3.amazonaws.com/0/18212/b93aea55-37b8-67b1-1549-bac13920ddba.png "kobito.1407671409.530058.png")

# ゲストOSのxdebug設定

おまけです。
php.iniに設定しているxdebugの設定値です。

```
xdebug.collect_params = 4
xdebug.dump.GET = "*"
xdebug.dump.POST = "*"
xdebug.remote_enable = 1
xdebug.remote_host = "192.168.33.1"
```
sbtで「~」の継続実行モードをEnterキー入力で終了させない方法

sbtで「~」のコマンド継続実行モードは、Enterキー入力で停止するようになっています。
ところが、コンソールでEnterキーはそれなりに入力することがあると思います。（例えば、出力され続けるログに空白行で区切りをつけたいときなど）

このEnterキーでの停止機能を防止するには、以下のようにするとできました。

```bash
$ cat /dev/null | sbt ~test
```
VBA/VBScriptのクラスのコンストラクタに引数を渡したい

# 概要
VBA / VBScriptのコンストラクタといえば *Class_Initialize* ですが、
モダンな言語とは異なり、コンストラクタに引数を渡すことができません。
そこで似非ではありますが、こんな感じで引数を渡せるようにしました。

```vbnet:Sample.vbs
Dim arg1 : arg1 = "foo"
Dim arg2 : arg2 = 1234

Dim objSample
Set objSample = (New clsSample)(arg1, arg2)
```

# 作成ポイント
- Defaultキーワードの付いたGetterプロパティを作成する
    - ※値が返せればいいので、Functionでも可能
- Getterプロパティはクラス自身(Me)を返す

## 実際のコード
```vbnet:SampleClass.vbs
Class clsSample
    Private PriStrArg1, PriStrArg2

    ' VBScriptの標準コンストラクタ
    Private Sub Class_Initialize()
        ' do stuff
    End Sub
    
    'コンストラクタの引数を受け取り、クラス自身を返すプロパティを作成
    Public Default Property Get Constructor(StrArg1, StrArg2)
        PriStrArg1 = StrArg1
        PriStrArg2 = StrArg2
        
        Set Constructor = Me
    End Property
End Class
```

# 動作概要
- プロパティ(もしくはメソッド)に付与されている `Default` キーワードによって、プロパティを省略してクラスにアクセスした際にConstructorが呼び出される
- Constructorプロパティ内で自身を返すことで、クラスの変数への代入を行う
    - メソッドチェーンを実現するための書き方と同じです

## 処理としては以下と等価です
```vbnet:Sample.vbs
Dim arg1 : arg1 = "foo"
Dim arg2 : arg2 = 1234

Dim objSample
Set objSample = New clsSample
Call ObjSample.Constructor(arg1, arg2)
```

# おわりに
- これをやったところでコンストラクタの引数を必須にはできません。
    - 普通に引数なしで `New clsSample` できてしまいます
- こんな意味わからないことしてコード読みにくくするくらいなら手続き的に書きましょう
- こんなのよりPowerShellを覚えましょう
ボクが Mac に入れたソフトいろいろ

* Mac をクリーンインストールしてから 2 日かけてセットアップしたんで覚書

# パッケージマネージャ
## Homebrew
* Java がインストールされている必要あり
* Xcode の Command Line Tools がインストールされている必要あり
* ターミナルに下記コマンドを入力

```bash
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

$ brew doctor
Your system is ready to brew.
```

# プログラミング
## Java
* [ここ](http://www.oracle.com/technetwork/java/javase/downloads/index.html) から JDK をダウンロードし、インストール
* インストール確認

```bash
$ java -version
java version "1.8.0_11"
Java(TM) SE Runtime Environment (build 1.8.0_11-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.11-b03, mixed mode)
```

## rbenv + ruby + rails
```bash
$ brew update
# rbenv インストール
$ brew install rbenv ruby-build
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
# インストール可能なバージョンをチェック
$ rbenv install -l
# バージョンを指定して ruby をインストール
$ rbenv install 2.1.2
# インストールしたバージョンに切り替え
$ rbenv global 2.1.2
# rails のインストール
$ (sudo) gem install rails
```

# エディタ
## MacVim
* [macvim-kaoriya](https://code.google.com/p/macvim-kaoriya/downloads/list) からダウンロード

## Atom
* [atom.io](https://atom.io/) からダウンロード

## Kobito
* [ここ](http://kobito.qiita.com/ja) からダウンロード

# バージョン管理ツール
## Git
* デフォルトで入っている
* SSH key の作り方は [こちら](https://help.github.com/articles/generating-ssh-keys)

## hub
* 下記コマンドを入力してインストール

```bash
$ brew install hub
```



# IDE
## Xcode
* AppStore からインストール
### Command Line Tools のインストール
* [Downloads for Apple Developers](https://developer.apple.com/downloads/index.action) からダウンロード


* Xcodeを起動
* "Preferences" -> "Downloads" を選択
* "Downloads」ウィンドウで「Components」タブを選択。
* "Command Line Tools」の横の「Install」ボタンをクリックします。

## Android Studio
* [ここ](http://developer.android.com/sdk/installing/studio.html) からダウンロード

# 仮想マシン
## VirtualBox
* [ここ](https://www.virtualbox.org/wiki/Downloads) からダウンロード

## Vagrant
* [ここ](http://www.vagrantup.com/downloads.html) からダウンロード


# Database
## MySQL
* 下記コマンドを実行

```bash
$ brew install mysql
```


## PostgreSQL
* 下記コマンドを実行

```bash
$ brew install postgresql
```

# ブラウザ
## Google Chrome
* [ここ](https://www.google.co.jp/chrome/browser/) からインストール


# Configuration Tool
## Chef, knife-solo, berkshelf
* 下記コマンドでインストール

```bash
$ (sudo) gem install chef
$ (sudo) gem install knife-solo
$ (sudo) gem install berkshelf
```

# その他
## tree
* 下記コマンドでインストール

```bash
$ brew install tree
```

# その他
## TotalTerminal
* [ここ](http://totalterminal.binaryage.com/) からダウンロード

## google 日本語入力
* [ここ](http://www.google.co.jp/ime/index-mac.html) からインストール
awesomeのmodkeyを変更する

awesomeのコマンドには

    modkey + l：ウィンドウを右方向へ伸縮させる

があるが、Windowsホストの仮想マシンでawesomeを使うとWindowsのスクリーンロックが実行されてしまった。

awesomeのデフォルトではmodkeyはWindowsキーで、かつ、Windowsのスクリーンロックのショートカットキーも"Windowsキー + L"なので起きているらしい。でもWindowsキーを使う他のショートカットではこの現象は起きなかったので、スクリーンロックのショートカットだけ起きるようだ。

レジストリの設定を変更するとWindowsのスクリーンロックを無効にできるが、家以外ではロックしたいこともあるので、awesomeのmodkeyを変更することにした。

#環境
* Windows7：ホスト
* Ubuntu14.04：ゲスト
* VirtualBox

#設定方法
このページを参考にした。
[awesome (日本語) - ArchWiki](https://wiki.archlinux.org/index.php/Awesome_(%E6%97%A5%E6%9C%AC%E8%AA%9E))

##awesomeの設定ファイルを準備する
まだ設定ファイルを作ってなかったので、"設定ファイルを作成"の通りに作成する。

    $ mkdir -p ~/.config/awesome/
    $ cp /etc/xdg/awesome/rc.lua ~/.config/awesome/

##modkeyを変更する
rc.luaを開いて"Mod4 キー vs. IBM ThinkPad"の通りに、modkeyをWindowsキーからAltキーに変更する。

    modkey = "Mod4"
    ↓
    modkey = "Mod1"

これでスクリーンロックしなくなった。
Hexoで画像の設定する


# はじめに

こんにちは。インフラエンジニアレベル１の[f_prg](http://twitter.com/f_prg "f_prg")です。
Hexoで画像を使いたいので、設定をしてみます。

# 設定を変更する
## configを変更する
configの参考はコチラを。
[http://hexo.io/docs/configuration.html](http://hexo.io/docs/configuration.html "http://hexo.io/docs/configuration.html")


```_config.yml
# Writing
new_post_name: :title.md # File name of new posts
default_layout: post
titlecase: false # Transform title into titlecase
external_link: true # Open external links in new tab
filename_case: 0
render_drafts: false
post_asset_folder: false
relative_link: false
highlight:
  enable: true
  line_number: true
  tab_replace:
```

の

```_config.yml
post_asset_folder: true
```

とします。

## 記事を追加する
次のプラグインの記事用を追加してみます。

```bash
[19:54:00][f_prg@mba:blog]# hexo new hexo_plugin
[info] File created at /Users/f_prg/Documents/project/node-hexo-blog/blog/source/_posts/hexo_plugin.md
[19:54:42][f_prg@mba:blog]# ls -al source/_posts/
total 104
drwxr-xr-x  10 f_prg  staff    340  8 10 19:54 .
drwxr-xr-x   3 f_prg  staff    102  8 10 11:59 ..
-rw-r--r--@  1 f_prg  staff   6148  8 10 19:45 .DS_Store
-rw-r--r--   1 f_prg  staff    814  8 10 11:59 hello-world.md
drwxr-xr-x   4 f_prg  staff    136  8 10 19:43 hexo_install
-rw-r--r--   1 f_prg  staff  22155  8 10 19:48 hexo_install.md
drwxr-xr-x   2 f_prg  staff     68  8 10 19:54 hexo_plugin
-rw-r--r--   1 f_prg  staff     55  8 10 19:54 hexo_plugin.md
-rw-r--r--   1 f_prg  staff   1419  8 10 19:50 hexo_site_setup.md
-rw-r--r--   1 f_prg  staff   6338  8 10 18:08 mac_ruby_rbenv.md
[19:54:53][f_prg@mba:blog]# 
```

記事のmarkdownファイルとディレクトリが作成されてます。

## 記事に画像を追加するには

こちらは、Hexoインストール時の記事で使った際のものですが、下記のように使います。

```markdown
![キャプチャです](/2014/08/10/hexo_install/hexo_install_001.png "キャプチャです")
```

専用のフォルダがあるのですが、
まだまだ使いづらいですね。都度あげるのは辛い作業になりますね。
適当にアップしても、いい感じようなのが否めません。

## 補足
専用のタグもあるのですが、Markdownをそのままコピペできないので私は使ってません。
[http://hexo.io/docs/tag-plugins.html#Image](http://hexo.io/docs/tag-plugins.html#Image "http://hexo.io/docs/tag-plugins.html#Image")

# まとめ
ブログとすると、画像のアップロードの楽にしたい希望はありますね。
プラグインがあるようなので期待してみます。

# 参考資料・リンク
[http://hexo.io/](http://hexo.io/ "http://hexo.io/")
Hexoのサイト設定を行う


# はじめに

こんにちは。インフラエンジニアレベル１の[f_prg](http://twitter.com/f_prg "f_prg")です。
前回のHexoのインストールの続きです。サイトをセットアップします。

# 設定を変更する
## _config.ymlを編集する
設定の値は
[http://hexo.io/docs/configuration.html](http://hexo.io/docs/configuration.html "http://hexo.io/docs/configuration.html")
を参考にしてください。

```yml
# Site
title: Hexo
subtitle:
description:
author: John Doe
email:
language:
```

とデフォルトではなっているので、下記のように編集します。

```
# Site
title: f_prgのブログです。
subtitle: いろいろ書いていきます。よろしくお願いします。
description: 人生はテキトーに。まったりと。
author: f_prg
email:
language:
```

## 反映させます

ページアクセスの度に、読み込むことはないようですので
サーバを再起動しましょう。

# まとめ
yamlで簡単に設定できるのは、楽ですね。
データベースも用意しなくてよいので。
次回はプラグインでも使いたいと思います。

# 参考資料・リンク
[http://hexo.io/docs/configuration.html](http://hexo.io/docs/configuration.html "http://hexo.io/docs/configuration.html")
ajaxでクロスドメイン通信を実現するphp

#概要
ajaxでのクロスドメイン通信をする簡単な方法です。
phpを使用して実現します。

ネットを探していると、なんだか複雑に実装しているサンプルが多かったので、簡単・汎用なものをつくりました。
テキスト形式で取得しているので、あとから、JSONなりXMLなりレスポンスのデータ形式にあわせてパースすれば良いかと。

#コード

html は以下のとおり。

```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
<script>
$(document).ready(function(){
	$('#getbtn').click(function(){
		var url = encodeURIComponent($('#url').val());
		$('#restxt').val('通信中...');
		$.ajax({
			type: "GET",
			url: "ajax.php?url="+url,
			dataType: "text",
			success: function(res){
				$('#restxt').val(res);
			}
		});
	});
});
</script>
</head>
<body>
<p>取得先URL</p>
<input type="text" id="url"></input>
<button id="getbtn">GET</button>
<p>結果領域</p>
<textarea id="restxt" style="width:100%;height:300px;"></textarea>
</body>
</html>
```

~~以下、汎用phpファイル~~　**下の改良版を推奨**

```ajax.php
<?php
if(isset($_GET["url"])) echo file_get_contents($_GET["url"]);
```

【更新】
以下、@suin さんからのご指摘を受けての改良版です。
http: あるいは、 https: から始まるパス以外はエラーとなるようにしました。

@sounisi5011 さんからのご指摘をうけてさらに改良しました。

```ajax.php
<?php
if(isset($_GET["url"]) && preg_match("/^https?:/",$_GET["url"])){

	echo file_get_contents($_GET["url"]);
}else{
	echo "error";
}
```
##設置サンプル

http://dev.elephancube.jp/qiita/ajax.html

設置サンプルおきました。
試しに以下のURLコピペして試してみてください。

```
郵便番号
http://zip.cgis.biz/xml/zip.php?zn=1120014
ニコニコ動画
http://ext.nicovideo.jp/api/getthumbinfo/sm500873
天気
http://weather.livedoor.com/forecast/webservice/json/v1?city=200010
Googleジオコーディング
https://maps.googleapis.com/maps/api/geocode/xml?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=true
```
特定のsubviewを取得する


公式リファレンスのviewのページには ```[view addSubView:];``` でビューを追加できることまでは書いてあるが、追加したやつを一発で指定する方法が書いていないようだった。たぶん。

# - (UIView *)viewWithTag:(NSInteger)tag を使う。
こんな感じ。

```objective-c
	UITableView *view = [[UITableView alloc] init];
	view.tag = 1;
	[superView addSubview: view];

	UIView *subView = [superView viewWithTag: 1];
```

tagはenumとかで管理するといいって書いてあった。

#参考
http://tomorrow4u.wiki2.jp/archives/376
<heroku ☓ node.js>redisを導入する

### ＜やりたいこと＞
* herokuサーバにredisを導入する。（※node.jsのアプリケーションと接続する）



* * *
### ＜解決方法＞
参考：https://devcenter.heroku.com/articles/redistogo#using-with-node-js
（本家のドキュメントより）


※※やることは2つ※※
1. Addonを導入（redistogo　※nanoまでは無料）
2. node.jsから接続する
※※※※※※※※※※※※※※※

１. Addonを導入（redistogo　※nanoまでは無料）

```lang:terminal
$ heroku addons:add redistogo
```

２. node.jsから接続する
　接続するとなるとredisのURL, portなどなど知りたい情報が山のようだが、
　そのあたりもheroku configで確認すればOK

```lang:terminal
$ heroku config
=== hogeApp Config Vars
REDISTOGO_URL: redis://redistogo:--------/
```
　こんな感じで確認できる。


　いよいよ接続する。

```lang:node-sample.js
var redis = require("redis"),
    url   = require("url")


// REDISTOGO_URLをheroku上でしか設定してないことを想定した分岐
if (process.env.REDISTOGO_URL) {
    var rtg    = url.parse(process.env.REDISTOGO_URL);
    var client = redis.createClient(rtg.port, rtg.hostname);

    client.auth(rtg.auth.split(":")[1]);
} else {
    var client = redis.createClient();
}

    // redis setver 接続するよ
    client.on("error", function (err) {
        console.log("Error " + err);
    });
    // ここからはnode-redisをガシガシ駆使してください。
```

とても簡単にredis環境ができました♪
VirtualBoxの共有フォルダのマウントに失敗する

なんか自動マウントされなくなった。
手動でマウントしようとすると、こんなエラー出た

```bash
$ sudo mount -t vboxsf HOGE hoge
/sbin/mount.vboxsf: mounting failed with the error: No such device
```

ここみるとアドイン入れなおせとのことなので入れなおす
http://slashdot.jp/journal/509239/VirtualBox%E5%85%B1%E6%9C%89%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E8%A6%9A%E6%9B%B8


入れ直したけど、まだエラー出る

```bash
$ sudo mount -t vboxsf HOGE hoge
mount: 間違ったファイルシステムタイプ、不正なオプション、
       vmshare のスーパーブロックが不正、コードページまたは
       ヘルパープログラムの未指定、或いは他のエラー
       (for several filesystems (e.g. nfs, cifs) you might
       need a /sbin/mount.<type> helper program)
       In some cases useful info is found in syslog - try
       dmesg | tail  or so
$ dmesg | tail -n 1
[  221.398880] sf_read_super_aux err=-22
```


エラーでググルと[こんな](https://forums.virtualbox.org/viewtopic.php?f=9&t=25295)情報ある

> I solved the problem (at lease for my machine)!

> Despite installing the GuestAddons for 64 Bit OS (Fedora 11 in my case) the link in > /sbin/mount.vboxsf points to /usr/lib/... where it should be /usr/lib64/

見てみるとビンゴっぽかったのでsymlink作りなおす

```bash
$ ll /sbin/mount.vboxsf
lrwxrwxrwx 1 root root 42  8月 10 18:25 /sbin/mount.vboxsf -> /usr/lib64/VBoxGuestAdditions/mount.vboxsf
$ sudo rm /sbin/mount.vboxsf
$ sudo ln -s /usr/lib/VBoxGuestAdditions/mount.vboxsf /sbin/mount.vboxsf
$ sudo mount -t vboxsf HOGE hoge
# 成功
```

やったー
Macvimのフォントを変更する方法


Edit > Font > Show Fontsからフォント選択ウィンドウを表示して、使いたいフォントを選択する。
Macvim > Preferences...を探してもありませんよ。

![スクリーンショット 2014-08-10 18.43.03.png](https://qiita-image-store.s3.amazonaws.com/0/2813/89b36ce2-457a-fb98-776b-4a0f1f241d08.png "スクリーンショット 2014-08-10 18.43.03.png")
GO言語で文字コードを扱うライブラリの使用例

Go言語でSJISの文字列を扱う機会があったので，文字コードを扱うライブラリをいくつか使ってみました．

# 今回使用したライブラリ
- [iconv-go](https://github.com/djimenez/iconv-go "iconv-go")
- [go-charset](https://code.google.com/p/go-charset/ "go-charset")
- [mahonia](https://code.google.com/p/mahonia/ "mahonia")

# iconv-go
cgoが必要です．

```go
import (
	"fmt"
	iconv "github.com/djimenez/iconv-go"
)

func main() {
	// sjis string
	data := []byte{0x47, 0x4f, 0x8c, 0xbe, 0x8c, 0xea}
	in := string(data[:])

	// iconv-go
	result, err := iconv.ConvertString(in, "sjis", "utf-8")
	if err != nil {
		panic(err)
	}

	fmt.Printf("%v\n", result)
}
```
# go-charset
内部でGNU iconvを使用してます．

```go
import (
	charset "code.google.com/p/go-charset/charset"
	_ "code.google.com/p/go-charset/data"
	"fmt"
	"io/ioutil"
	"strings"
)

func main() {
	// sjis string
	data := []byte{0x47, 0x4f, 0x8c, 0xbe, 0x8c, 0xea}
	in := string(data[:])

	// go-charset
	out, err := charset.NewReader("cp932", strings.NewReader(in))
	if err != nil {
		panic(err)
	}
	result, err := ioutil.ReadAll(out)
	if err != nil {
		panic(err)
	}

	fmt.Printf("%v\n", string(result[:]))
}
```
# mahonia
iconv-goやgo-charsetと違い，iconvを使ってないのでクロスコンパイルが容易です．

```go
import (
	mahonia "code.google.com/p/mahonia"
	"fmt"
)

func main() {
	// sjis string
	data := []byte{0x47, 0x4f, 0x8c, 0xbe, 0x8c, 0xea}
	in := string(data[:])

	// mahonia
	result := mahonia.NewDecoder("cp932").ConvertString(in)

	fmt.Printf("%v\n", result)
}
```
Everything と Paper Plane xUI の連携

# Everything と Paper Plane xUI の連携

[Everything](http://www.voidtools.com/) Version 1.3.4.686 から [Paper Plane xUI](http://homepage1.nifty.com/toro/index.html) (PPx) の PPc で検索したファイルへカーソルを合わせることができなくなっていたので設定を修正。
% を $% へ書き換えた。以前は % はそのまま使えたはずだけど、エスケープしないといけなくなったのかな？　確かにヘルプには記載されている [Customizing](http://www.voidtools.com/support/everything/customizing/#external_file_manager)

一体化ウィンドウの左側の pane で、新しくタブを開くように設定変更。

```
open_folder_command2=$exec("C:\PPx\PPCW.EXE" -pane:0 "%1")
open_file_command2=$exec("C:\PPx\PPCW.EXE" -pane:0 -k $%J"%1")
```
Android 4.4r1をVirtualBoxにインストールしてみた


# 準備

* [ReleaseNote 4.4-r1 - Android-x86 - Porting Android to x86](http://www.android-x86.org/releases/releasenote-4-4-r1)で公開されている。

* [sourceforge](http://jaist.dl.sourceforge.net/project/android-x86/Release%204.4/)から`android-x86-4.4-r1.iso`をダウンロード

* 画面の回転は F9〜F12 の長押し


# インストール手順

![スクリーンショット 2014-08-10 17.10.40.png](https://qiita-image-store.s3.amazonaws.com/0/25728/38010d3e-75bc-85c6-3fcb-59f4e0acf517.png "スクリーンショット 2014-08-10 17.10.40.png")

![スクリーンショット 2014-08-10 17.11.30.png](https://qiita-image-store.s3.amazonaws.com/0/25728/26f44537-0cdd-e971-335d-7b9e5629b982.png "スクリーンショット 2014-08-10 17.11.30.png")

* ポインティングデバイスを`PS/2マウス`にすること。

![スクリーンショット 2014-08-10 17.12.10.png](https://qiita-image-store.s3.amazonaws.com/0/25728/d193de0b-5d1c-0ba8-63c8-2de51d8162f6.png "スクリーンショット 2014-08-10 17.12.10.png")

![スクリーンショット 2014-08-10 17.12.25.png](https://qiita-image-store.s3.amazonaws.com/0/25728/942a84b8-dd81-819e-1228-a24127cfe6e4.png "スクリーンショット 2014-08-10 17.12.25.png")

![スクリーンショット 2014-08-10 17.12.38.png](https://qiita-image-store.s3.amazonaws.com/0/25728/dc79a144-32b4-d4f4-1269-51c1042417b1.png "スクリーンショット 2014-08-10 17.12.38.png")

* パーティションは1つで大丈夫だった。ext3でフォーマットし、Grubがインストールされてbootできた。


# 動作確認

* youtubeで動画の再生は普通にできたのに驚いた。ちょっと重たいけど。

![スクリーンショット 2014-08-10 17.29.30.png](https://qiita-image-store.s3.amazonaws.com/0/25728/514489c3-89a2-97ea-3156-9190c1377eee.png "スクリーンショット 2014-08-10 17.29.30.png")

* TempleRun2のような3Dゲームは動かなかった。
* `Command`キーが`Home`

# 解像度設定

* 参考: [VirtualBoxのAndroid 4.0 x86を縦置きにする。 : 時々、失業SEの開発日誌](http://www.kotemaru.org/2013/02/virtualboxandroid-40-x86.html)

* Grubの起動オプションにて`vga=ask`を追加し起動。
  * もしくは`vga=791`を入力し起動。

![スクリーンショット 2014-08-10 17.37.28.png](https://qiita-image-store.s3.amazonaws.com/0/25728/623224af-981b-374b-ad69-a0d7f1ff7862.png)

![スクリーンショット 2014-08-10 17.37.51.png](https://qiita-image-store.s3.amazonaws.com/0/25728/611e5247-af54-bc7e-615e-68a6e2d200ba.png)

* この一覧は16進数のため、vga=で指定するときは10進数に変換し指定すること。

* `Switch to Scaled Mode`がおすすめ

![スクリーンショット 2014-08-10 17.48.04.png](https://qiita-image-store.s3.amazonaws.com/0/25728/dc4e527d-0ab9-db5e-2529-924be9b47c53.png)
8/10 本日の共有

### コード
こういうことがしたかった
[OS - CoreDataでatomicにsaveする - Qiita](http://qiita.com/kenmaz/items/89e50f94262a4d0547c5)

### ライブラリ
Localized Stringや色コード、画像名を指定するときに文字列ではなくてメソッドを使うようにするライブラリ。
メソッドなのでスペルミスでコンパイルエラーが出てくれる。
[Go - iOSアプリ開発でもAndroidのR.javaのような仕組みでリソースに安全にアクセスする - Qiita](http://qiita.com/ksoichiro/items/4befb2695b1efdff72dd)

UICollectionViewCellを円上に配置できる
[mpospese/CircleLayout](https://github.com/mpospese/CircleLayout)

[iOS FLAnimatedImagegif を使ってgifを再生 - Qiita](http://qiita.com/ryusukefuda/items/2b03e9469b33494aefd0)

### 技術
iPhoneのタッチスクリーンが空間ジェスチャのつなぎになったように、3Dプリンタがナノマシンとのつなぎになるのかな
[グニャグニャしたレゴのようなブロックで、未来のロボットを作る - TechCrunch](http://jp.techcrunch.com/2014/08/08/20140807squishy-lego-like-blocks-could-build-the-robots-of-the-future/)
【まとめ】インスタンス変数、クラス変数、クラスインスタンス変数

すっかりPHP脳になっていたため、Ruby脳に切り替えるべくクラスに関わる変数まわりをおさらいした。

## 1. インスタンス変数
インスタンスごとに独立して持つ変数。

- インスタンス変数にアクセスできるのは、initializeメソッドとオブジェクトのインスタンスメソッドだけ
- initializeメソッドで初期化されて、その後各インスタンスメソッドから参照・変更される使い方が多い（と思う）
- PHPやJavaみたいに事前にクラス定義内で定義する必要がない

### 1-1. 定義
変数名の前に「@」をつけて定義する

```ruby
@instance_var = 'instance_var'
```

### 1-2. 使い方

```ruby
class Foo
  # 明示的にインスタンス変数を宣言しなくて良い
  # => 宣言した場合、それは「クラスインスタンス変数」と見なされる

  # (o) initializeメソッドからアクセス
  def initialize
    @instance_var = 'instance_var'
    p "#{@instance_var} at initialize"
  end

  # (o) インスタンスメソッドからアクセス
  def xxx
    p "#{@instance_var} at xxx"
  end

  # (x) クラスメソッドからアクセス
  def self.yyy
    p @instance_var
  end
end

# initializeメソッドからはアクセスできる
foo = Foo.new # => 'instance_var at initialize'

# インスタンスメソッドからもアクセスできる
foo.xxx # => 'instance_var at xxx'

# クラスメソッドからはアクセスできない
Foo.yyy # => nil
```

## 2. クラス変数
そのクラスの全てのインスタンスで共有される変数

- クラスとそのインスタンスがスコープになる
- 定数と似ているがクラス変数は何度でも値を変更できる点で異なる
- クラスメソッド、インスタンスメソッド、クラス定義式内でアクセス可能

### 2-1. 定義
変数名の前に「@@」をつけて定義する

```ruby
@@class_var = 'class_var'
```

### 2-2. 使い方
```ruby
class Foo
  @@class_var = 0

  def xxx
    @@class_var += 1
    p @@class_var
  end

  def self.yyy
    @@class_var += 1
    p @@class_var
  end
end

foo = Foo.new

# 同一インスタンス内で値は共有される
foo.xxx # => 1
foo.xxx # => 2

# インスタンスが異なっても、値は共有されている
foo2 = Foo.new
foo2.xxx # => 3

# クラスメソッドからもアクセスできるし、値も共有されている
Foo.yyy # => 4
```

## 3. クラスインスタンス変数
クラスオブジェクトのインスタンス変数
個人的に非常にややこしい。見た目はインスタンス変数なのに、機能的にはクラス変数に近いため。

-  一見するとクラス変数とほぼ同じように使えるが、そのクラスのみでしか参照できない。例えば、そのクラスを継承したクラスではその変数にアクセスできない。
- クラスメソッドからはアクセスできる
- インスタンスメソッドからアクセスすることはできない（クラスオブジェクトのインスタンス変数であるため）
- クラス定義式内で定義される（メソッド内で初期化されない）
- 見た目は通常のインスタンス変数と同じため、混同されやすい

### 3-1. 定義
変数名の前に「@」をつけて定義する
**※ 見た目はインスタンス変数と同じだが、定義する場所がクラス定義式内になる**

```ruby
@class_instance_var = 'class_instance_var'
```

### 3-2. 使い方
```ruby
class Foo
  # クラス定義式内で定義される
  @class_instance_var = 'class_instance_var'

  # クラスメソッド内でクラスインスタンス変数を出力
  def self.xxx
    p @class_instance_var
  end

  # インスタンスメソッド内でクラスインスタンス変数を出力
  # => これはインスタンス変数扱いとなり、参照できない 
  def yyy
    p @class_instance_var
  end
end

# Fooを継承したBarクラスを作成
class Bar < Foo
end

# クラスメソッドからクラスインスタンス変数は参照できる
Foo.xxx # => 'class_instance_var'

# インスタンスメソッドからクラスインスタンス変数は参照できない
# => インスタンス変数とみなされるため
foo = Foo.new
foo.yyy # => nil

# 継承されたクラスからクラスインスタンス変数は参照できない
Bar.xxx # => nil
```
【個人メモ】SprayベースのS4テンプレートを試す - Scala -

# Scalaを学びたい

Scala、学びたいなあ、どうせ来年になったら必要な気がしまくるし(大規模になったRoR製サービスの分割、扱いの代替とか)...と思い、
[Spray](http://spray.io/)というものを知った。けどテンプレートエンジンが使われてるテンプレートがほしい、と思って探したら[S4](https://github.com/jacobus/s4)というものを見つけた。

# Sprayテンプレート

Sprayを使ってアプリを書くために
テンプレートがgithubリポジトリにあがってて、
そのサンプルを元にアプリケーションを書けるようになっている。

たとえば、これ。

[spray-template](https://github.com/spray/spray-template)

# でも物足りないから、S4を使いたい...

spray-templateでも良いのだけど、
テンプレートエンジンが無い、のとDBOもない。
揃ってるテンプレート無いのかなと思って探して、
[S4(Spray Slick Starter Stack)テンプレート](https://github.com/jacobus/s4)を見つけた。

# 試しに使ってみる

Mac OS X上で試しに使っていく。

## 事前に必要なアプリ、ソフトウェア

- homebrew
- sbt
- scala
- postgresql

以上。

## sbt, scalaのインストール

```
> brew install scala
> brew install sbt
```

## postresqlのインストール・セットアップ

S4テンプレートではpostgresqlを利用しているので、
セットアップを行う。とりあえず動かしたいので。

```
> brew install postgresql
```

### postgresqlサーバの立ち上げ

```
> postgres -D /usr/local/var/postgre
```

### databaseの作成

```
> createdb s4
```

### ユーザーの作成

- パスワードはs4とする

```
> createuser s4 -P
```

### 接続確認

```
> psql -U s4
```

### アプリ側の準備

作成したDBに接続するため、
DBConfig.scalaの内容を変更する

```scala:DBConfig.scala
trait ProductionDB extends DBConfig {
  val m = new Model("PostgreSQL", new DAL(PostgresDriver),
    Database.forURL("jdbc:postgresql://localhost/s4",
                           driver="org.postgresql.Driver",
                           user="s4",
                           password="s4"))
  m.createDB
}
```

# s4テンプレートアプリの立ち上げ

s4のRootディレクトリで
sbtコマンドを実行し、runコマンドを実行する。

```
> git clone git@github.com:jacobus/s4.git
> cd ~/s4
> sbt
> run
```

# サンプル動作テスト

## 画像アップロードを試す

curlコマンドで適当な画像をs4テンプレートアプリに対して
POSTする。

```
> curl -i -F "imageupload=@yuruyuri.jpg" http://127.0.0.1:8080/upload
```

すると、s4テンプレートのRootディレクトリにtest.pngファイルが作成される。

## personを追加する

Personを追加するテストをする。
...といってもcurlで叩くだけだけど。

```
curl --user bob:123 -X POST -H 'Content-Type: application/json' http://localhost:8080/person -d '{"fname": "hoge", "lname": "fuga"}'
```

Basic認証のユーザ名、パスワードは
[ここ](https://github.com/jacobus/s4/blob/master/src/main/scala/s4/rest/S4Service.scala#L51)に書かれてる。

## personを取得する

先ほど追加したpersonを取得してみる。

```
> curl http://localhost:8080/persons
[{
  "fname": "hoge",
  "lname": "fuga",
  "id": 1
}]
```

# Playframeworkのがいいのかもしれないが...

興味を持ったものなので、触っていく。
Goのimport宣言での.(ピリオド)の意味は？


最近 Go を始めました。[Go Tour](http://tour.golang.org/#1) も終わり、さっそくコードを書いてみようとしたところでのツマヅキ。

```
import (
    . "github.com/onsi/ginkgo"
    . "github.com/onsi/gomega"

    "testing"
)
```

こんな感じで、import宣言には .(ピリオド) があったりなかったりしてますが、.(ピリオド)の意味ってなんなのか調べてみました。


# Go のリファレンスを見てみる

http://golang.org/ref/spec#Import_declarations

```
Import declaration          Local name of Sin

import   "lib/math"         math.Sin
import M "lib/math"         M.Sin
import . "lib/math"         Sin
```

import と ファイルパス の間にはソースコード内で使用する識別子を指定することができるようです。

- 指定なしの場合: インポートされているパッケージで指定された識別子が使用される
- 指定した場合: 指定した識別子が使用される
- .(ピリオド)の場合: インポートされているパッケージでエクスポートされている識別子をソースコードのファイルブロックで宣言される
Ruby | 単位分数の合計を確認する Ruby スクリプト

# Ruby | 単位分数の合計を確認する Ruby スクリプト

## 概要
文系出身プログラマで、昔の数学をすっかり忘れているので
中高の数学の復習本で学習中。

単位分数の数列の合計に関する問題があったので
プログラムを作ってみました。

※これって何か名前の付いている定義とかあるんでしょうか？

## お題
1/2, 1/4, 1/8... と分母を自乗した分数の数列の合計を計算する

## サンプルコード

単位分数を 1/base_denominator から順に列挙する Enumrator を返却するメソッドを実装し、
単位数列1個～4個までの数列を合計をそれぞれ標準出力して結果を確認します。

例では、基準となる分母が2から5までの場合の出力を行います。

~~~ruby
require 'test_toolbox'

class UnitFractions
  def each(base_denominator)
    return to_enum(:each, base_denominator) unless block_given?
    denominator = 1
    loop do
      denominator = denominator * base_denominator
      unit_fraction = Rational(1, denominator)
      yield(unit_fraction)
    end
  end
end

uf = UnitFractions.new


base_denominators = [*2..5]
base_denominators.each do |base_denominator|
  dp_line __LINE__
  print "base_denominator = #{base_denominator}", "\n"
  [*1..4].each do |limit|
    first_ten_ufs = uf.each(base_denominator).take(limit)
    print first_ten_ufs, "\n"
    print first_ten_ufs.reduce(&:+), "\n"
  end
  dp_line __LINE__
end

__END__
下記はTbpgrUtils gemの機能
__LINE__は

https://rubygems.org/gems/tbpgr_utils
https://github.com/tbpgr/tbpgr_utils
~~~

## 出力

~~~
--------------------|filename=|line=20|--------------------
base_denominator = 2
[(1/2)]
1/2
[(1/2), (1/4)]
3/4
[(1/2), (1/4), (1/8)]
7/8
[(1/2), (1/4), (1/8), (1/16)]
15/16
--------------------|filename=|line=27|--------------------
--------------------|filename=|line=20|--------------------
base_denominator = 3
[(1/3)]
1/3
[(1/3), (1/9)]
4/9
[(1/3), (1/9), (1/27)]
13/27
[(1/3), (1/9), (1/27), (1/81)]
40/81
--------------------|filename=|line=27|--------------------
--------------------|filename=|line=20|--------------------
base_denominator = 4
[(1/4)]
1/4
[(1/4), (1/16)]
5/16
[(1/4), (1/16), (1/64)]
21/64
[(1/4), (1/16), (1/64), (1/256)]
85/256
--------------------|filename=|line=27|--------------------
--------------------|filename=|line=20|--------------------
base_denominator = 5
[(1/5)]
1/5
[(1/5), (1/25)]
6/25
[(1/5), (1/25), (1/125)]
31/125
[(1/5), (1/25), (1/125), (1/625)]
156/625
--------------------|filename=|line=27|--------------------
~~~

## 参照
* TbpgrUtils Gem
https://rubygems.org/gems/tbpgr_utils

* TbpgrUtils GitHub
https://github.com/tbpgr/tbpgr_utils

* 分数 Wikipedia
http://ja.wikipedia.org/wiki/%E5%88%86%E6%95%B0
Dockerコンテナの中に入る方法


**(注意)1.3からはdocker execというコマンドが標準であるので、標準のコマンドでシェルを起動してあげれば同じような事ができるはずです。この投稿は1.2以前の環境について書いてます**

ちょっとした設定変更をして動くのを試すのにいちいちイメージをビルドし直すのが少し面倒。
sshサーバ立てるしかないのなかーと思ってたらnsenterなるものを発見[1][2]。

インストール方法が変わっていてツールをビルドするため？のDockerイメージをダウンロードして、その中でビルドしたものをマウントしたホストのディレクトリ上にコピーしてくれるって流れらしい。

手順としては以下のコマンドを叩くだけでいい(boot2dockerを使ってる場合は引数が少し違うらしい)。

```
docker run -v /usr/local/bin:/target jpetazzo/nsenter
              ^^^^^^^^^^^^^^^
              ここがインストール先のホストディレクトリ
```

mac上でboot2dockerを使ってる場合は以下。

```
docker run -v /var/lib/boot2docker:/target jpetazzo/nsenter
```

mac上の~/.bash_profileに以下を追加[3].

```bash:~/.bash_profile
docker-enter() {
  boot2docker ssh '[ -f /var/lib/boot2docker/nsenter ] || docker run --rm -v /var/lib/boot2docker/:/target jpetazzo/nsenter'
  boot2docker ssh -t sudo /var/lib/boot2docker/docker-enter "$@"
}
```

上記の修正をした後にsourceで読み込んでおいて

```
$source ~/.bash_profile
```

以下のコマンドでシェルが起動しコンテナ内に入れる.

```
$ docker-enter <container-id>
```

[1]If you run SSHD in your Docker containers, you're doing it wrong! - ~jpetazzo/index
http://jpetazzo.github.io/2014/06/23/docker-ssh-considered-evil/

[2]jpetazzo/nsenter - github
https://github.com/jpetazzo/nsenter

[3]Docker debug with nsenter on boot2docker - sequenceiq
http://blog.sequenceiq.com/blog/2014/07/05/docker-debug-with-nsenter-on-boot2docker/
ユニティちゃんにAssetStoreで販売しているモーションをアタッチしよう！

みなさんこんにちは。やまだ @tty_yamada　ともうします。
Unity アセット真夏のアドベントカレンダー 2014 Summer！
８月１３日の担当記事を執筆させていただきます。

みなさん、８月１３日が何の日かご存知でしょうか。
そう！　ユニティちゃんこと大鳥こはくちゃんの誕生日です！

![スクリーンショット 2014-08-03 20.41.36.png](https://qiita-image-store.s3.amazonaws.com/0/49946/b88a1115-5137-6f0f-ff28-26b7373cf73d.png)

というわけで今日はユニティちゃんの振る舞いをさらに魅力的にするアセットを紹介致します！

# メカニムモーション変更方法

Animatorウィンドウから変更したいモーションを選択し、Motionの部分を変更したいモーションにするだけです
新たにモーションのステート作るのも可

![スクリーンショット 2014-08-10 14.58.25.png](https://qiita-image-store.s3.amazonaws.com/0/49946/64751027-7efa-2f67-e77e-2e13235673d5.png)


# Aoi Character Pack　〜＄３５〜

https://www.assetstore.unity3d.com/jp/#!/content/12495

ハイクオリティモデルとして有名なあおいちゃんです。
こちらのアセット、メカニム対応と通常のFBXが両方入っているのがうれしいところ。

メカニムモーションはもちろんユニティちゃんに使い回せます。

![スクリーンショット 2014-08-10 14.05.44.png](https://qiita-image-store.s3.amazonaws.com/0/49946/f923ee4f-f702-494f-6c54-a319d97a0334.png)

動作サンプルはこちら
http://unityroom.com/games/play/234

# HQ fighting animation package01　〜＄４５〜

https://www.assetstore.unity3d.com/en/#!/content/17089

格闘に特化したアニメーションセットです。

01とついているということは02、03も期待できます。

![スクリーンショット 2014-08-10 14.02.26.png](https://qiita-image-store.s3.amazonaws.com/0/49946/c013c194-a884-1041-ef40-8cd3eebd1035.png)



動作サンプルはこちら
http://unityroom.com/games/play/235

# Unity Mask Man 〜無料〜

https://www.assetstore.unity3d.com/jp/#!/content/16383

毎度おなじみのUnity仮面。４コマにも登場しているので完全なユニティちゃんファミリーです。

こちらの特徴は、ユニティちゃんのモーションとの互換をもっているということ。
いちいち１つずつモーションを差し替えなくても、
AnimatorのコントローラをUnity仮面のものに差し替え、BackをPrevに変えるだけで動きます。

![スクリーンショット 2014-08-10 14.02.04.png](https://qiita-image-store.s3.amazonaws.com/0/49946/882f446b-7c9b-f6ec-cc65-ae6f12e67c3a.png)

![スクリーンショット 2014-08-10 15.06.49.png](https://qiita-image-store.s3.amazonaws.com/0/49946/9478781c-3058-653d-c45b-57a7cf8bc0b2.png)

動作サンプルはこちら

http://unityroom.com/games/play/236

#　終わりに

メカニムはこの通りアニメーションの差し替えが簡単にできます。
AssetStoreでメカニムモーション付きモデルを購入したらとりあえずUnityちゃんにアタッチしてみましょう！
異体字セレクタを扱う

Python(2.7)で異体字セレクタ(IVS)を扱う方法.

文字列リテラルで異体字セレクタを利用する場合, 基底文字に続けてセレクタを続ける. セレクタは16bit以上なので32bitのユニコードリテラルで表記する必要がある( https://docs.python.org/2/reference/lexical_analysis.html ).

邉の異体字(U+9089U+E0102 http://ivd.dicey.org/21549 )を扱う例. 標準出力とファイルに文字を出力する.

```py
# -*- coding: utf-8


import codecs


z = u'\u9089\U000E0102'
print z
x = codecs.open('ivs_char.txt', 'w', 'utf-8')
x.write(z)
x.close()
```

実際に表示できるかは環境に依存する. Windows7以降, OSX SnowLeopard以降の主要なWebブラウザで表示可能.
Emacs24.3でmatlab-mode


ここに書かれていたやりかたでできた。
http://comments.gmane.org/gmane.emacs.matlab-mode.user/9

~/.emacs/init.el の中に

```
(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t)
```

と書いておき、emacs を立ち上げる。そして 

```
M-x package-install
```
を呼び出し、matlab-mode を選べば melpa のアーカイブから自動的に matlab-mode がインストールされる。

（このさい、とくにmatlab-mode用に`init.el` を書き換えなくてもよい。 emacs を立ち上げて .m ファイルを開けば matlab-mode が自動的に立ち上がる。）

（冒頭URLでは `M-x install-package` と書いてあったが、`M-x package-install` が正しい
簡単なスクリプトで Twitter gem を使うときの定型文

環境変数にセットしたアクセストークン他を使って Twitter のクライアントオブジェクトを初期化するとき、よくこのように書く。

```ruby
require 'twitter'

# 環境変数から必要な値を全部読み込んで辞書にする
TWITTER_CONFIG = {
  consumer_key: ENV['TWITTER_CONSUMER_KEY'],
  consumer_secret: ENV['TWITTER_CONSUMER_SECRET'],
  access_token: ENV['TWITTER_ACCESS_TOKEN'],
  access_token_secret: ENV['TWITTER_ACCESS_TOKEN_SECRET']
}

# 値が足りなかったらエラーメッセージを出して終了
TWITTER_CONFIG.select {|_, v| v.nil? }.keys.each do |missing_key|
  warn "Please set the TWITTER_#{missing_key.upcase} environment variable."
end.empty? or abort

# 辞書を使ってクライアントを作る
twitter = Twitter::REST::Client.new(TWITTER_CONFIG)
```
Rails 4 で Haml を利用する手順


Rails 4 で作るアプリケーションで、Viewのテンプレートで [Haml](http://haml.info/) を使えるようにしたのでメモ。

# 前提

- 今回はローカルの Mac に 構築した Rails 環境に導入しています。
	- OS のバージョン： `Mac OS X 10.9.4 (Mavericks)`
	- Ruby のバージョン： `2.1.2`
	- Railsのバージョン： `4.1.1`

# 手順

- `Gemfile` に追記

	```Gemfile
	gem 'haml-rails'
	gem 'erb2haml'
	```

- それらを `bundle install` します。

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

	※ 私の場合は、`vendor/bundle` に gem を配置しています。適宜、読み替えてください。

- 次のようにインストールされました。

	![スクリーンショット 2014-08-10 14.14.39.png](https://qiita-image-store.s3.amazonaws.com/0/35733/316a7b3e-77d6-94d8-d12c-dfa7c22d25e4.png "スクリーンショット 2014-08-10 14.14.39.png")

- 次のように、既存の `.erb` ファイルを Haml へ変換します。

	```shell
	$ ./bin/rake haml:replace_erbs
	```
	
	- 初期状態では View のファイルは `application.html.erb` １つだけなのですが、次のように変換されました。

		![スクリーンショット 2014-08-10 14.20.18.png](https://qiita-image-store.s3.amazonaws.com/0/35733/27b9380d-4e33-4ea5-1b6c-7a6b8ee9c5a4.png "スクリーンショット 2014-08-10 14.20.18.png")

- 新しく scaffold してみます。

	```shell
	$ ./bin/rails g scaffold Hoge name:string age:integer
	```

- ちゃんと Haml で生成されているようです^^

	![スクリーンショット 2014-08-10 14.25.21.png](https://qiita-image-store.s3.amazonaws.com/0/35733/594a58bc-8655-6c55-1661-89c8431222c6.png "スクリーンショット 2014-08-10 14.25.21.png")