OmniAICreator/Qiita-1.07M huggingface dataset:
Sublime Text3 > コメントの列を変更する > 面倒な設定はある

```txt:対象
Sublime Text3
```

Ctrl+/にてコメントをつける場合、関数の先頭なのか、関数内なのかでコメントの列が異なる。

```
// void someFunc1() {
// 	doSomeThing();
// }

void someFunc2() {
	// doSomeThing();
}
```

以下のようにできないだろうか。

```
// void someFunc1() {
// 	doSomeThing();
// }

void someFunc2() {
//	doSomeThing();
}
```


以下のリンクを見つけた。設定が面倒そうだということが分かった。
http://superuser.com/questions/994183/how-to-toggle-comments-in-column-1-in-sublime-text-3
xUnit.net の使い方（Context）

# TestSuite

* 複数の `Assert` を1つのテストメソッドにまとめる。
* それらのテストメソッドを1つのクラスにまとめる。（`TestSuite`）
* このテストの間で共通に使いまわしたいリソースの管理方法を紹介する。


# Constructor と Dispose

* テストクラスのコンストラクタで前処理を行う。（`SetUp` に相当）
* `IDisposable` インターフェースの `Dispose` メソッドで後始末を行う（`TreatDown` に相当）
* テストクラス内で使いまわしたいリソースは、メンバーとして宣言し、コンストラクタで初期化し、 `Dispose` で破棄する

```csharp
public class Tests : IDisposable
{
    public Tests()
    {
        // テスト前の処理
    }

    public void Dispose()
    {
        // テスト後の処理
    }
}
```

# Class Fixtures

* 一つのデータを複数のテストクラスで共有する方法
* 全てのテストの前に前準備 (`SetUp`) を行い、全てのテストが終わったら後始末 (`TreatDown`) したい場合に使用する。

## 手順

1. データを保持するクラスを作成する
    * コンストラクタで初期化して、 `IDisposable` の `Dispose` で破棄処理を行う
2. データを利用するテストクラスを作成する
    *  `IClassFixture<T>` を継承する
    *  `IClassFixture<T>` の型引数に、さっき作ったデータクラスを入れる
    *  さっき作ったデータクラスを一つ受け取るコンストラクタを作成する
    *  コンストラクタで受け取ったデータをメンバーに格納して、各テストメソッドから利用する
        *  コンストラクタで渡される値が、テストクラス間で共通に利用できるシングルトンになっている

```csharp
/// <summary>
/// テスト用のデータを格納するクラス
/// </summary>
public class TestFixture : IDisposable
{
    public TestFixture()
    {
        // Context の初期化処理
    }

    public void Dispose()
    {
        // Context の終了処理
    }
}


/// <summary>
/// テスト用のデータを実際に利用する側のクラス
/// </summary>
public class Tests : IClassFixture<TestFixture>
{
    TestFixture fixture;

    public Tests(TestFixture fixture)
    {
        // テスト用 Context のシングルトンがここの引数で渡される。
        this.fixture = fixture;
    }

    // テストをいつも通り書く
}
```


# 参考資料

* [Shared Context between Tests](http://xunit.github.io/docs/shared-context.html)
JAX-RSでJSONを返す

JAX-RSでJSONを返すのは簡単。JSONをサポートする拡張モジュールを導入してアノテーションで返却するメディアタイプを`application/json`を指定すれば良い。拡張モジュールがJSONに変換できるオブジェクトだったら面倒見てくれる。

```build.gradle
dependencies {
    compile group: 'org.glassfish.jersey.media', name: 'jersey-media-json-jackson', version: '2.23.1'

}
```
JerseyにはいくつかのJSON変換モジュールが用意されているがこれはJacksonを使ったモジュール。


リソースクラスのメソッドに`@Produces`を使ってメディアタイプを指定する。


```JsonResource.java
package example.jaxrs;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Path("/")
public class JsonResource {
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public String index() {
        return "Hello World";
    }

    @GET
    @Path("list")
    @Produces(MediaType.APPLICATION_JSON)
    public List<String> list() {
        return Arrays.asList("a","b");
    }

    @GET
    @Path("map")
    @Produces(MediaType.APPLICATION_JSON)
    public Map<String, String> map() {
        Map<String, String> map = new HashMap<>();
        map.put("a", "000");
        map.put("b", "111");
        return map;
    }

    static public class Person{
        public String name;
        public int age;
    };
    @GET
    @Path("pojo")
    @Produces(MediaType.APPLICATION_JSON)
    public Person pojo() {
        Person person = new Person();
        person.name = "Foo Bar";
        person.age = 30;
        return person;
    }
}
```

プリミティブ・リスト・マップ・POJOなら適当に面倒見てくれる。テストコードを見てどのように変換されるか確認。JSONの確認にはGroovy側のJsonSlurperを使った。

```JsonResourceTest.groovy
package example.jaxrs

import groovy.json.JsonSlurper
import org.glassfish.jersey.server.ResourceConfig
import org.glassfish.jersey.test.JerseyTest
import spock.lang.Shared
import spock.lang.Specification

import javax.ws.rs.core.Application

class JsonResourceTest extends Specification {

    def jsonslurper = new JsonSlurper()

    @Shared
    def jerseyTest = new JerseyTest() {
        @Override
        protected Application configure() {
            return new ResourceConfig(JsonResource.class)
        }
    }

    def setupSpec() {
        jerseyTest.setUp()
    }

    def cleanupSpec() {
        jerseyTest.tearDown()
    }

    def "test index"() {
        when:
        def response = jerseyTest.target("/").request().get(String.class)
        then:
        response == "Hello World"
    }

    def "test list"() {
        when:
        def response = jerseyTest.target("/list").request().get(String.class)
        then:
        jsonslurper.parseText(response) == jsonslurper.parseText('''["a", "b"]''')

    }

    def "test map"() {
        when:
        def response = jerseyTest.target("/map").request().get(String.class)
        then:
        jsonslurper.parseText(response) == jsonslurper.parseText('''{"b": "111", "a": "000" }''')
    }

    def "test pojo"() {
        when:
        def response = jerseyTest.target("/pojo").request().get(String.class)
        then:
        jsonslurper.parseText(response) == jsonslurper.parseText('''{"name": "Foo Bar", "age": 30 }''')
    }
}
```
Railsでform２重送信でハマる

#２重送信防止
formなどで２重送信防止のため、送信中はボタンを押せなくして、"送信中..."なども文言を表示したいです。そういうときに、submit tagにdiabled_withオプションをつけると、簡単にその機能を実装できます。


#環境
Rails 4.2.4
ruby 2.2.0

#正解
```<%= submit_tag "送信", "data-disable-with" => "送信中..."%>```
または
```<%= submit_tag "送信", data: {disable_with: '送信...'} %>```


#間違い
```<%= submit_tag "送信", disable_with: '送信...' %>```

#ハマりポイント
data:をつけましょう。
あとはjqueryを内部的に使っているので、jquery-rails gemをいれて、

```
//= require jquery
//= require jquery-ujs
```

が必要です。
node.jsを使ってNCMBでユーザ管理

node.jsを使ってNCMBでユーザ管理しようと考え、とりあえず、ユーザ登録、ログイン、sessionTokenを使ってのデータ取得が出来るか試してみました。
とりあえず動いたので、備忘録として.....

1.ユーザ登録
 Javascript SDKを使ってのユーザ登録と同じです。
 ユーザ名とパスワードの登録例です。

```node.js:addUser.js
// 1. ncmbモジュールの読み込み
var NCMB = require("ncmb");

// 2. mobile backendアプリとの連携
var ncmb = new NCMB("<APPLICATION_KEY>","<CLIENT_KEY>");

//Userのインスタンスを作成
var user = new ncmb.User();

//ユーザー名・パスワードを設定
user.set("userName", "Koba")
    .set("password", "12345"); 

// 新規登録
user.signUpByAccount()
    .then(function(){
      // 登録後処理
      console.log("OK");
    })
    .catch(function(err){
      // エラー処理
      console.log("NG"+err);
    });
```

 2.ログイン処理
 　便宜的にユーザ登録とは別ファイルにしてみました。

```node.js:login.js
// 1. ncmbモジュールの読み込み
var NCMB = require("ncmb");

// 2. mobile backendアプリとの連携
var ncmb = new NCMB("<APPLICATION_KEY>","<CLIENT_KEY>");

//Userのインスタンスを作成
var user = new ncmb.User();

//ログイン
ncmb.User.login("Yoshio", "12345")
    .then(function(data){
      // ログイン後処理
      console.log("Login OK " + data.get("userName") +　" " + ncmb.sessionToken); *1
    })
    .catch(function(err){
      // エラー処理
      console.log("Login Error " + err);
    });

  *1:ncmb.sessionTokenでセッショントークンを取得

```

3.セッションを使って権限管理されたデータを取得
　『Data』Classに3つデータを入れておき、そのうち1つを'Yoshio'ユーザのみ見られるようにACLを設定、1つを全員が見られるように、もう1つを別のユーザで権限制限する。

```node.js:session.js
// 1. ncmbモジュールの読み込み
var NCMB = require("ncmb");

// 2. mobile backendアプリとの連携
var ncmb = new NCMB("<APPLICATION_KEY>","<CLIENT_KEY>");

// 3.sessionTokenにログイン時に取得したsessionTokeを設定
ncmb.sessionToken = "<sessionToken>";

    var Item = ncmb.DataStore("Data");
    Item.fetchAll()
      .then(function(results){
         for (var i = 0; i < results.length; i++) {
              var object = results[i];
              console.log("Date is " + object.get("Date"));
            }
      })
      .catch(function(err){
        console.log("Error " + err);
      });
```

ちゃんと動けば、ユーザ'Yoshio'のデータと全員が見られるデータが表示されます。


【参照】
スクリプトで権限管理されたデータを取得する(http://blog.mb.cloud.nifty.com/?p=7853)
会員管理(http://mb.cloud.nifty.com/doc/current/user/basic_usage_javascript.html)
機械学習のコースを修了したのでオススメしてみます

Stanford大学のオンライン授業で機械学習の[コース](https://www.coursera.org/learn/machine-learning/home/welcome)を受講していましたが、この度めでたく修了しました。

機械学習をお勉強したい人には強くお勧めできる内容だったのでアウトラインだけ共有しようと思います。

ちなみに受講自体は無料です。
終了証明を取得したい場合はお金かかりますが、完全に自己満なのでどっちでもいいかと思います。

# 概要
機械学習の世界では知らない人はいない(？)というくらい著名な先生がわかりやすく機械学習の面白いところを教えてくれる動画授業です。

各動画には小テストがあり、自身の理解度を確認しながら進めることができます。

週に1トピックスの内容を学ぶスケジュールでコースは設計されており、1週間分の動画を全て見た後にはoctaveという言語を用いて実際に学んだ内容を実装してみるプログラミング課題を解きます。

動画授業を受けるだけではなく実際に手を動かしてみるので、理解度が上がります。

# 学習できる内容
毎週のトピックはざっくり以下の通りです。

## 線形回帰について
コース全体を通して使われる基礎的な考え方が説明されます。
コスト関数とか最急勾配法とかの説明がされます。

## ロジスティック回帰について
線形回帰から派生してロジスティック回帰についてです。
線形回帰で扱えない問題の説明と、それを扱うためのロジスティック回帰の説明です。

## ニューラルネットワークについて
今はやりのDeepLearningにつながるニューラルネットについてです。
ニューラルネットのアイディアの説明と、ロジスティック回帰との関連性についてわかりやすく説明されています。

## 機械学習を用いたシステムを開発していく時の注意点について
機械学習を用いたシステム開発を行う上で身につけておくべき考え方や評価指標についてです。
これを知らないでシステム開発を行うのは時間の浪費だとはっきり理解できる構成になっています。

具体的には学習曲線を用いたアルゴリズムの評価方法を学びます。

自身の構築しているシステムについて、アルゴリズムが適切なのか？学習モデルは適切なのか？学習サンプルを増やすことで性能改善が見込めそうか？それとも学習サンプルを増やしても別の問題が起きているので性能改善が見込めないのか？といった知見を得られるようになり、次に試すべきことが判断できるようになります。

## SVMについて
ロジスティック回帰から派生してSVMについてです。
SVMの利点とかが説明されます。

## 教師なし学習(クラスタリング)について
教師なしデータに対する機械学習の例についてです。
得られたデータをクラス分けする方法を学びます。

具体的にはk-meansアルゴリズムを使ったクラスタリングを学びます。

## 異常検知学習について
こちらも教師なしデータについての機械学習です。
「いつもとなんか違う！」を検出する方法を学びます。

具体的には得られているデータから事象の確率を求め、
異常に低い確率でしか発生しないデータが得られたら「いつもと違う！」と判定するようなアルゴリズムについて学びます

## 大規模機械学習について
大量データを扱う上での注意点とかそこらへんのトピックスが説明されます。この内容についてはプログラミンング演習はありません。

## Photo OCRを例とした機械学習ワークフローについて
複数の機械学習のコンポーネントを組み合わせて開発を行う上でいかに全体最適を満たすために開発リソースを割り振っていくか？というないようです。

大きくて複雑なシステムを効率良く開発していくために必要な知見が得られます。

# まとめ
以上長くなりましたが、こんな内容を学ぶことができます。

高度な数学的な背景は知らなくても理解できる講義になっているので興味のある方は是非受講してみてください！

ちなみに最後まで受けると有料ですが、受講証明書をもらうことができます。
完全に自己満ですが、かなり良いコースだったのでお礼の意味も込めて取得しました。
RVMとは？(RVMを利用したRubyのインストール)

<h1>RVMとは？</h1>
RVMはRuby Version Managerとも言います。
その名前通り、複数のRuby実行環境の管理を簡単にするbashスクリプトツールです。
UNIX系の環境で、複数のRuby処理系をインストール、共存させることができます。

<b>詳しくは、一つの環境に対してRVMを使わずに複数のRubyをインストールする場合、それぞれのRubyでコマンドやインストール方法が違ったりと面倒なことがありました。</b>(例えば、1.8系と1.9系を共存させるには、コンパイル際に実行ファイルをruby1.9にする必要がある。)
でもRVMを導入することでその問題を解決するのができます。

RVMを導入することでできること
<font color="green">
○ Rubyのインストール
○ 使用するRuby処理系の切り替え
○ 複数のRubyでスクリプトを一済に実行
○ gemの管理
○ 違いを意識することではなく同じの手順でインストールできる
○ すぐじ最新のRubyを入手できる
○ それぞれのRubyをrubyで実行できる
</font>
Rubyのインストールはgemを利用するのが一番簡単だと言われ、、そうしたらgemとはなんだ？

<h1>gemとは？</h1>
A gem is a packaged Ruby application or library.
gemはRuby applicationやライブラリーのパッケージです。

○　Rubyに本体に付属して標準で入っている
○　ライブラリ・モジュール　（perlのCPAN,phpのpearと似てるかな？）
○　gemコマンドを使って簡単にinstallやremoveなどができる。(例　yum,atp,MacPorts)

gemを使ってrvmをインストールする

```shell-session
$ gem install rvm
``` 
上のコマンドでインストールができます。

```shell-session
$ rvm-install
```
シェルを起動した時にRVMのスクリプトを読み込むために.bashrcや.zshrcに以下を記録します。

```shell-session
if [[ -s $HOME/.rvm/scripts/rvm ]] ; then source $HOME/.rvm/scripts/rvm ; fi
```

記録後、シェルを開き直すとRVMが使用できるようになります。

RVMはrvmコマンドと、そのサブコマンドで構成されています。
主な使い方は

```shell-session
$ rvm help
```
を利用してください。
<h1>RVMを利用してRubyをインストール</h1>
rvm install Rubyの種類

```shell-session
$ rvm list known
```
を使って指定できるRubyの種類を確認できます。

RVMでRubyをインストールするには

```shell-session
$ rvm install ruby-head
```
コマンドを使用します。

それで rubyのインストールが終りました。

RVMでインストールされた実行ファイルは、環境変数rvm_bin_pathで参照されるディレクトリー以下に配置されます。（デフォルトでは${HOME}/.rvm/bin）

インストール時に使用したソースは環境変数rvm_src_pathで参照されるディレクトリー以下に保存されています。（デフォルトでは${HOME}/.rvm/src）

参考サイト
http://gihyo.jp/dev/serial/01/ruby/0039
http://mukaer.com/archives/2012/03/09/rubyrvmgemrbenv/
c++ builder XE4, 10.2 Tokyo > TButton, TEdit, TxxxのNameを取得する > TComponent *型にしてName取得

```txt:動作確認
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

色々な処理ではSenderという引数を持つ。

```
void __fastcall TForm1::Button1Click(TObject *Sender)
{

}
```

TButton, TEdit, TMemoなどの処理においてそのコンポーネント名を取得するにはSender.Nameではできなかった。

どうするか。

http://docwiki.embarcadero.com/Libraries/XE4/ja/Vcl.StdCtrls.TButton
によると、TButtonの継承関係は以下となる。

TObject > TPersistent > TComponent > ... > TCustomButton > TButton

Nameというプロパティで検索するとTComponentが出てくる。
http://docwiki.embarcadero.com/Libraries/XE4/ja/System.Classes.TComponent.Name

以上より、以下の実装でNameを取得できる。

```cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	TComponent *cmpPtr = (TComponent *)Sender;
	ShowMessage(cmpPtr->Name);
}
void __fastcall TForm1::Edit1Click(TObject *Sender)
{
	TComponent *cmpPtr = (TComponent *)Sender;
	ShowMessage(cmpPtr->Name);
}
```

異なるコンポーネントの共通処理を実装する場合は、上記のようにTComponent*型にすればいい。
Realm/RLMArray.h file not foundとCould not build Objective-C module 'Realm' でハマった

# きっかけ
cocoapodsのバージョンを1.0.0にしたら、「Realm/RLMArray.h file not found」と「Could not build Objective-C module 'Realm'」のエラーが出てハマりました。
cocoapodsのバージョンを0.39.0にすれば直るそうなのですが、自分の場合、以下の方法で解決しました。

# バージョン情報
- RealmSwift: 1.0.1
- Xcode: 7.3.1
- Cocoaods: 1.0.1
- Swift: 2.2

# 対策方法
まず、ターミナルを開き、プロジェクトのあるフォルダまでいきます。

```bash:ターミナル
$pod cache clean Realm
$pod cache clean RealmSwift
$pod deintegrate || rm -rf Pods
```
してから

```bash:ターミナル
$pod install
```
次に、Xcodeを開き、メニューバーをoptionキーを押しながら[Product]->[Clean Build Folder...]とするとエラーが消えました。

# 最後に
Swift駆け出しの未熟者です。
指摘等があればご教授くださいm(__)m


# 参考
[Realm/RLMArray.h file not found and Could not build Objective-C module 'Realm'](https://github.com/realm/realm-cocoa/issues/3551)
[CocoaPods 1.0.0.beta.X can't integrate Realm as a dynamic framework](https://github.com/realm/realm-cocoa/issues/3052)
java オブジェクト指向型プログラミング

##オブジェクトとは、(めちゃめちゃ簡単に)
####この世に存在する物、物の集まり全般
例: 人、犬、ボール、家族、サッカーチーム、etc

##早速サンプルコード
サッカーチームクラス(チーム名.コーチ名)

```SoccerTeam.java
Public class SoccerTeam{
  final public String teamName;
  final public String coachName;

  public SoccerTeam(String teamName , String coachName){
    this.teamName = teamName;
    this.coachName = coachName;
  }
}
```
サッカー選手クラス(名前,性別,所属チーム)

```SoccerPlayer.java
public class SoccerPlayer{
  final public String name;
  final public String sex;
  final public SoccerTeam soccerTeam;

  public SoccerPlayer(String name , String sex , SoccerTeam soccerTeam){
    this.name = name;
    this.sex = sex;
    this.soccerTeam = soccerTeam;
  }
}
```
サンプルコード(山田二郎の所属チームのコーチの名前を取得する処理)

```CreateSampleDate.java
//サンプルデータ
SoccerTeam team = new SoccerTeam("FC東京","山田太郎");

//１人の「人」としてのオブジェクト作成
SoccerPlayer yamadaJirou = new SoccerPlayer("山田二郎","男",team);
//さらにもう１人の「人」としてのオブジェクト作成
SoccerPlayer yamadaSaburou = new SoccerPlayer("山田三郎","男",team);

//山田二郎の所属チームのコーチの名前を取得する処理
String coachName = yamadaJirou.soccerTeam.coachName;

System.out.println(coachName); // 出力 : 山田太郎
```

オブジェクト指向プログラミングとは、「サッカーチームのコーチ名」、「サッカー選手の所属チーム」など
「~の~」といった感じでメソッドチェーン(メソッドを連結させる)を行うことがメインになってきます。
例えば、

```
//山田二郎のチーム
yamadaJirou.soccerTeam;

//山田二郎のチームのチーム名
yamadaJirou.soccerTeam.teamName;
```
「〜〜の〜〜」形式で書くことができます。
いわゆる「の」の部分に当たるのが「~.(ドット)~」です。
ドットを用いることで対象のオブジェクトにアクセスし、アクセスした
オブジェクト内に持つフィールドやメソッドを呼び出すことができます。

オブジェクト指向型プログラミングを意識することで非常に可読性が良くなります。
常に意識して実装しましょう

一応メモ用ですが、要望あれば情報追加します。

少しでもお役に立てたらストック等お願いいたします。
Railsでカラム名を付け間違えていて手こずりました

Railsでparams[:test]からデータを受け取る際、testの名前を自分の意図とはかけ離れている名前を付けていた為、ずっとエラーでした！！

なのでmodelを削除しよう！

```:command
$ rails destroy Note
Running via Spring preloader in process 50174
      invoke  active_record
      remove    db/migrate/20160629015837_create_notes.rb
      remove    app/models/note.rb
      invoke    test_unit
      remove      test/models/note_test.rb
      remove      test/fixtures/notes.yml
```
 modelが削除されました！

正しい名前で作り直します

```:command
$ rails g model Note title:string content:text
Running via Spring preloader in process 50574
      invoke  active_record
      create    db/migrate/20160706005650_create_notes.rb
      create    app/models/note.rb
      invoke    test_unit
      create      test/models/note_test.rb
      create      test/fixtures/notes.yml

```

完了！

localhostで更新したら...
```rake db:migrate RAILS_ENV=development```して下さいっと言われたので..
言われるがまま...

しかし

```:command
$ rake db:migrate RAILS_ENV=development
== 20160706005650 CreateNotes: migrating ======================================
-- create_table(:notes)
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: table "notes" already exists: CREATE TABLE "notes" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "title" varchar, "content" text, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL) 
```

一旦DBを削除してから試みます

```:command
$ rake db:migrate:reset 
```

無事に通りました！！！
[Embulk] DBの接続情報とクエリを環境変数とLiquidを使って上手に分割する方法


## まとめ

* Liquidと環境変数を使って開発環境・本番環境のデータベース接続情報を分ける。
* テーブル情報(クエリ設定)とデータベースコネクション情報を別ファイルで管理する

## はじめに

* 開発環境、本番環境によって接続するデータベースコネクション情報を変えたい。
* 何個もテーブルを読み込みするが認証情報は同じなので、共通化したい。

```yaml
in:
  #
  # 開発環境と本番環境で分けたいところ
  #
  type: postgresql
  host: 127.0.0.1
  user: user
  password: pass
  database: embulk_test
  # 
  # 読み出すテーブルの情報によって設定が変わるところ
  query: "select * from table_name"
```

## 設定例

```
.
|-- config1.yml.liquid
|-- config2.yml.liquid
|-- db
|   |-- _dev.yml.liquid
|   `-- _prod.yml.liquid
`-- query
    |-- _query1.yml.liquid
    `-- _query2.yml.liquid
```

config1.yml.liquid

```yaml
in: 
{% if env.EMBULK_ENV == 'production' %}
  {% include 'db/prod' %}
{% else %}
  {% include 'db/dev' %}
{% endif %}
{% include 'query/query' %}
out:
  type: stdout
  
```

この設定で環境変数EMBULK_ENVにproductionが設定されている場合は、db/_prod.yml.liquidを、設定されていない場合はdb/_dev.yml.liquidを読み込むようになります。


コネクション情報(db/_prod.yml.liquid)

```yaml
#
  type: postgresql
  host: 127.0.0.1
  user: username
  password: password
  database: embulk_prod
```

**先頭は#または、改行を入れる必要があります。これを抜くと正常に動きません。**


テーブル情報(クエリ設定)、(db/_query1.yml.liquid)

```yaml

  query: "select * from table1"
```

**先頭は#または、改行を入れる必要があります。これを抜くと正常に動きません。**

## 今後の課題

どなたか例を知っていたら教えてください。

* データベースのパスワード情報は環境変数を利用する方法。

## 別例

* [アンカーとエイリアスを使う](https://gist.github.com/hiroyuki-sato/ddc5f291e9cfb2e6bb7c0825739fe0a5)

## その他参考

* [Embulkの設定ファイルをincludeで共有化する方法](http://qiita.com/hiroysato/items/e7987e71a8112584b748) Liquid全般の使い方の話

## お礼

* [@toyama0919](https://twitter.com/toyama0919/status/750295036139417600)さん 
* [@wing_007](https://twitter.com/wing_007/status/750353423770333184)さん
Rails で *.scss じゃなく *.sass を生成してほしい

Rails でスタイルシートに **SCSS じゃないほうの Sass**（これを簡潔に何と呼ぶべき？） が使いたい。

Gemfile に sass-rails が入っていれば（デフォルトでは入っている），拡張子 `.sass` のファイルを作るだけのことなので，とくに何も設定しなくても大丈夫。

ただ，scaffold などで自動的に生成されるスタイルシートが，デフォルトでは `.scss` になってしまう。

これを `.sass` にするには，以下のように書けばよいようだ。

```rb:config/application.rb
module NantokaKantoka
  class Application < Rails::Application
    config.sass.preferred_syntax = :sass
  end
end
```

# 追記（2022-02-10）

「SCSS じゃないほうの Sass」は，文法（構文）の名称としては「インデント構文（the indent syntax）」でした。
公式のドキュメント
https://sass-lang.com/documentation/syntax#the-indented-syntax
に

> インデント構文は Sass の最初の構文（original syntax）です

というようなことが書かれています。
OSX(El Capitan)で.aなライブラリから.dylibなライブラリを作るには

# 背景

Python、Julia、Rustなどでは、共有ライブラリは使えるが、
.aなアーカイブ形式のライブラリだとそのままでは利用できない。

アーカイブ形式なライブラリを共有ライブラリに変換できれば、これらの
言語から利用可能となる。

# .dylib化する

/usr/bin/libtoolコマンド、GNUのじゃない、純正のコマンドでの
やり方は以下

```
libtool -dynamic -multiply_defined suppress -o libmruby.dylib mruby/build/host/lib/libmruby.a -undefined dynamic_lookup -macosx_version_min 10.11
```

この例ではmrubyをアーカイブ形式(.a)から共有ライブラリ(.dylib)にした。

## rpathがついてるライブラリをリンクしてる場合

他の依存ライブラリをリンクに加えることも可能。しかし、加えてライブラリが
rpath指定を含んでいる場合、どうするのが一番いいのか不明だったが、install_name_toolでrpathを上書きして、絶対パスでの指定にできた。

# 注意

あんまり、バイナリアンじゃないので、この辺り明るくないので、
たまたま、動いたるだけかも。
距離計 > 3.3V駆動 / 5V駆動 > LV-EZ1 / SRF01 / HC-SR04

ポータブル3Dスキャナとして使うために必要な距離計用モジュール。

## 3.3V駆動

3.3V駆動のものは以下が見つかっている。

- [Maxbotix LV-EZ1](https://www.switch-science.com/catalog/139/)
  - 3,761円
- [SRF01](http://www.dfrobot.com/index.php?route=product/product&keyword=SEN0004&category_id=0&description=1&model=1&product_id=291#.V3wxK_mLQZA)
  - 29USD

値段が高い。

## 5V駆動

### 昇圧回路 (3V -> 5V)

5V駆動で良ければHC-SR04が使えるが、CR-123A(3V)から5Vに昇圧する回路が必要になってくる。回路が複雑になるのが欠点。

3Vから5Vに昇圧
http://akizukidenshi.com/catalog/g/gM-08619/

- 出力電流 100mAは少ないだろうか?
- HC-SR04の動作電流は15mAとなっているが、ラッシュカレントなどはどうなのだろうか
- 250円

http://akizukidenshi.com/catalog/g/gM-03451/

- 3Vに対して150mAの出力電流
- 500円

回路の勉強上は昇圧回路を使ってみるというのがいいかもしれない。

### HC-SR04

http://akizukidenshi.com/catalog/g/gM-08762/

- 超音波
- 2-180cm
- 400円
- 距離についてはtrigger, echoの間の時間から計算が必要


### GP2Y0A710K

5V駆動で見ると以下のものも候補として考えられる
http://akizukidenshi.com/catalog/g/gI-03157/

- 赤外線とPSD
- 1m-5.5m
- アナログ出力
- 1200円
- 専用ケーブル(50円)を使用。VCCが黒色, GNDが赤色という間違いやすい色となっている
- AD取込み電圧値から距離に変換するがリニアではない
  - [pdf](http://akizukidenshi.com/download/ds/sharp/GP2Y0A710K0F.pdf)のpage5 上のグラフ
  - グラフの数値はどこから入手するのだろうか? (web? 紙?)
  - 関連: http://arduinomega.blogspot.jp/2011/05/infrared-long-range-sensor-gift-of.html
  - 関連: http://sfukuda.at.webry.info/201112/article_6.html

### SRF02

http://akizukidenshi.com/catalog/g/gM-06685/

- 超音波測距ユニット
- 16cm-6m
- I2C / シリアルバス接続
- 2,400円
Python で DDD するなら Inject がオススメ

# 概要

やや古い記事だけど、InfoQ の[ドメイン駆動設計・開発の実践](https://www.infoq.com/jp/articles/ddd-in-practice)には次のように書かれています。

> ドメイン・クラスがData Access Object(DAO：データ・アクセス・オブジェクト)クラスに依存し、サービス・クラスがドメイン・クラスに依存するという設計上の依存関係がDDDによる実装に際してDIを"なくてはならない"ものにしています。

Python の場合、DI（依存性の注入）の実現には [Inject](https://github.com/ivankorobkov/python-inject) が便利です。

# 利用例

ざっと100行程度でサンプルを書くと、このような形になります。

``` python
# -*- coding: utf-8 -*-
import uuid
from abc import ABCMeta, abstractmethod

import inject


def config(binder):
    binder.bind(UserRepository, UserMemoryRepository())


class User(object):

    def __init__(self, identity, name):
        self.identity = identity
        self.name = name


class UserRepository(object):
    u""" Base class of User Repository"""
    __metaclass__ = ABCMeta

    @abstractmethod
    def store(self, user):
        raise NotImplementedError

    @abstractmethod
    def find_by_identity(self, identity):
        raise NotImplementedError


class UserMemoryRepository(UserRepository):
    u""" User Repository on memory"""

    def __init__(self):
        self._users = {}

    def store(self, user):
        if not isinstance(user, User):
            raise TypeError
        self._users[user.identity] = user

    def find_by_identity(self, identity):
        return self._users[identity]


class UserRedisRepository(UserRepository):
    u""" User Repository on Redis """

    def store(self, user):
        # TODO: write code here
        pass

    def find_by_identity(self, identity):
        # TODO: write code here
        pass


class UserService(object):
    u""" User Service on Application Layer"""
    repo = inject.attr(UserRepository)

    def create_user(self, name):
        user = User(uuid.uuid4(), name)
        self.repo.store(user)
        return user

    def find_by_identity(self, identity):
        return self.repo.find_by_identity(identity)


if __name__ == "__main__":
    # Call once on application start
    inject.configure(config)

    user_service = UserService()
    created_user = user_service.create_user('foo')
    stored_user = user_service.find_by_identity(created_user.identity)

    assert created_user == stored_user
```

`inject` を使わずに同様のことを実現するためには、`UserService` の引数に `repo` を渡す必要があり、依存関係が増えるたびに `UserService` のコンストラクタが肥大化してしまいますが、`inject` を利用するとスッキリと書けます。`@inject.params` デコレータを利用すれば、コンストラクタのデフォルト引数に依存性を注入することもできます。

わずか300行程度の小さなライブラリですが、とても便利です。
C > LSBを0にする実装 > & ~0x01

http://qiita.com/7of9/items/d3c765912b435815cfdf
で見つかったLSBを0にしないといけない処理。

65/8などの計算結果そのものに対してLSBを0にしたい(偶数値にしたい)。

以下のように実装した。

http://ideone.com/IqouaF

```c
#include <stdio.h>
#include <stdint.h>

int16_t getEvenNumber(int16_t src) {
	return (src & ~0x01);	
}

int main(void) {
	int16_t val = 32765;
	
	val = getEvenNumber(val);
	printf("%d\n", val);
	
	return 0;
}
```

```txt:結果
Success	time: 0 memory: 2112 signal:0
32764
```

境界値で問題がないだろうか。

`~0x01`というのが何ビットになるのかも気にはなる。上記の例だと16bitはあるようだ。
int型と同じで、使用している環境(OSやIDEなど)に依存するのだろう。
ESP8266の場合は`Integrated low power 32-bit MCU`のため32bitになるだろうか。
( http://download.arduino.org/products/UNOWIFI/0A-ESP8266-Datasheet-EN-v4.3.pdf のpage7 )

## v0.2

0を起点に正負の対象性が悪かったため、以下の実装に変更した。

http://ideone.com/F29qVU

```c
#include <stdio.h>
#include <stdint.h>

int16_t getEvenNumber(int16_t src) {
	if (src & 0x01 > 0) {
		if (src < 0) {
			return src + 1;
		} else {
			return src - 1;
		}
	}
	return src;
}

int main(void) {
	int16_t val[] = {3,2,1,0,-1,-2,-3};
	
	for (int i = 0 ; i <(sizeof(val)/sizeof(val[0])); i++)
	{
	printf("%d => %d\n", val[i], getEvenNumber(val[i]));
	}	
	return 0;
}
```

```txt:結果
Success	time: 0 memory: 2160 signal:0
3 => 2
2 => 2
1 => 0
0 => 0
-1 => 0
-2 => -2
-3 => -2
```
傾斜計 > Link > MPU-6050 > 10-15分間のYawのドリフト

```txt:動作環境
ESP-WROOM-02
MPU-9250 https://strawberry-linux.com/catalog/items?code=12250
ライブラリ https://github.com/jrowberg/i2cdevlib/
```

以下で電源投入後のYaw値のドリフトについて記載がある。
https://reprapdad.wordpress.com/2014/11/10/mpu-6050-warm-up-and-dmp-yaw-drift/
> The MPU-6050  needs to warm up for 10-15 minutes before the gyro/accelerometer outputs really settle down.  This can be a right pain if you’ve spend time carefully calibrating your EDTracker only for it to drift for 10 minutes when you first plug it in, like this (temperature in red, yaw drift in blue):

10-15分間にYaw値で5度も変わっている。

補正をしている図があるが、どのように補正をしたのかは不明。

暖機が必要になるのだろうか。
技術英語 > The resulting selected clock [is termed] sel_clk in the following description. / coin the term

@ ug585-Zynq-7000-TRM.pdf
p573

> The resulting selected clock <font color=red>is termed</font> sel_clk in the following description.

http://eow.alc.co.jp/search?q=termed
> commonly termed
一般に呼ばれる

<hr>
関連して思い出したのは

coin the term

http://www.thefreedictionary.com/Coin+the+term
> neologism (redirected from <font color=red>Coin the term</font>)
`2. The creation or use of new words or senses.

http://eow.alc.co.jp/search?q=coin+the+term
> <font color=red>term coined by</font> the travel industry
旅行業界が創り出した用語

http://eow.alc.co.jp/search?q=coin
> `2〔新しい言葉を〕作る
下にスクロールすると消えて、上にスクロールすると表示されるメニューをつくる方法


## サンプル

<p data-height="265" data-theme-id="light" data-slug-hash="dXRAYa" data-default-tab="css,result" data-user="DesignChips" data-embed-version="2" class="codepen">See the Pen <a href="https://codepen.io/DesignChips/pen/dXRAYa/">ScrollingMenu(height)</a> by DesignChips (<a href="http://codepen.io/DesignChips">@DesignChips</a>) on <a href="http://codepen.io">CodePen</a>.</p>
<script async src="//assets.codepen.io/assets/embed/ei.js"></script>

<p data-height="265" data-theme-id="light" data-slug-hash="XKgGRY" data-default-tab="css,result" data-user="DesignChips" data-embed-version="2" class="codepen">See the Pen <a href="http://codepen.io/DesignChips/pen/XKgGRY/">ScrollingMenu(outerHeight)</a> by DesignChips (<a href="http://codepen.io/DesignChips">@DesignChips</a>) on <a href="http://codepen.io">CodePen</a>.</p>
<script async src="//assets.codepen.io/assets/embed/ei.js"></script>

## コード
```HTML
<body>
  <nav class="menu-wrap">
  <ul class="menu">
    <li><a href="#">menu1</a></li>
    <li><a href="#">menu2</a></li>
    <li><a href="#">menu3</a></li>
    <li><a href="#">menu4</a></li>
    <li><a href="#">menu5</a></li>
  </ul>
</nav>
    <img src="http://lorempixel.com/image_output/nature-q-c-1920-1280-2.jpg" alt="" />
</body>
```

```CSS
.menu-wrap {
  padding: 10px 0;
  position: fixed;
  z-index: 9999;
  top: 0;
  left: 0;
  width: 100%;
  background: rgba(0,0,0,.5);
  transition: .3s;
  opacity: 0.8;
}
.menu {
  list-style-type: none;
  width: 960px;
  margin: 0px auto;
  padding: 0;
}
.menu li {
  width: 20%;
  float: left;
  margin: 0;
  padding: 0;
  text-align: center;
}
.menu li a {
  display: block;
  width : 100%;
  padding: 20px 0;
  color: #fff;
  font-size: 14px;
  line-height: 1;
  text-decoration: none;
  transition: .3s;
}
.menu li a:hover {  background: rgba(0,0,0,.3) }

img {
  width: 100%;
}
```

heught.js

```javascript
var menuHeight = $(".menu-wrap").height();
var startPos = 0;
$(window).scroll(function(){
  var currentPos = $(this).scrollTop();
  if (currentPos > startPos) {
    if($(window).scrollTop() >= 200) {
      $(".menu-wrap").css("top", "-" + menuHeight + "px");
    }
  } else {
    $(".menu-wrap").css("top", 0 + "px");
  }
  startPos = currentPos;
});
```

outerHeight.js

```javascript
// var menuHeight = $(".menu-wrap").height();
var menuHeight = $("#menu-wrap").outerHeight();
var startPos = 0;
$(window).scroll(function(){
  var currentPos = $(this).scrollTop();
  if (currentPos > startPos) {
    if($(window).scrollTop() >= 200) {
      $(".menu-wrap").css("top", "-" + menuHeight + "px");
    }
  } else {
    $(".menu-wrap").css("top", 0 + "px");
  }
  startPos = currentPos;
});
```


## jQuery の height と outerHeight の違い

それぞれ取得できる高さが異なるので注意です。.menu-wrapにpaddingを設定している場合、height()ではメニューが途中までしか隠れず、下の方が表示されてしまいます。

```javascript
var $('.menu-wrap').height(); // padding, marginを含まない高さ
var $('.menu-wrap').outerHeight(); // paddingを含む高さ
var $('.menu-wrap').outerHeight({margin: true}); // padding, marginを含む高さ
```
WMIを使って繋がっているHDDがUSB接続かSATA接続か区別する方法のメモ

```ps1
Get-WmiObject -query "SELECT * FROM Win32_LogicalDisk" | ConvertTo-Json 
Get-WmiObject -query "SELECT * FROM Win32_DiskDrive" | ConvertTo-Json 
```

Win32_LogicalDiskで"DeviceID"の値がドライブレター。
Win32_DiskDriveで"InterfaceType"の値が接続方法
後は"\\\\.\\PHYSICALDRIVE7"とかそんなんでひも付けすればオッケー

[[WMI Class] Win32_DiskDrive クラス - WMI Library](http://www.wmifun.net/library/win32_diskdrive.html)
chrome.storageを同期的に扱う(ES7 async/await)

Chrome 53以上の環境で、起動オプションに下記のパラメータを追加することによって、async/awaitが使用可能となります。(2016/07/06現在)

```
--js-flags="--harmony-async-await"
```

以下、シンプルな実装例。

```JavaScript:
(async() => {
    await setLocalStorage({ aaa: 1, bbb: 2 });

    let aaa = await getLocalStorage("aaa");
    let bbb = await getLocalStorage("bbb");
    let all = await getLocalStorage();

    console.log(aaa);// 1
    console.log(bbb);// 2
    console.log(all);// {aaa: 1, bbb: 2}
})();

function setLocalStorage(obj) {
    return new Promise( (resolve) => {
        chrome.storage.local.set( obj, () => resolve() );
    });
}

function getLocalStorage(key = null) {
    return new Promise( (resolve) => {
        chrome.storage.local.get(key, (item) => {
            key ? resolve(item[key]) : resolve(item);
        });
    });
}
```
WordPressのCSVインポートを実装したときにQueryMonitorがメモリを食い過ぎて大変なことになったのでメモ

QueryMonitorはWordPressのデバッグには欠かせない超便利なプラグインで、開発には欠かせない。
参考：[QueryMonitor](https://ja.wordpress.org/plugins/query-monitor/)

具体的には、

* サーバー環境などの情報を一覧で確認できる
* WP_DEBUGがOFFでもPHPエラーを拾って通知してくれる
* 現在のテンプレートを表示するまでに発行したデータベースクエリの一覧が見られる
* 現在のテンプレートを表示するためのリライトルールなどを事細かに表示してくれる
* ページ表示にかかった実行時間を表示してくれる

など、ある程度のサイトを作るならば絶対に入れておいて損はないプラグインなのだが、どうやら**内部的に独自のキャッシュ機構を使ってデータを保存している**ようで、CSVインポートなどの仕組みと致命的に相性が悪い。

CSVインポートなど内部でループを使い行を処理するような仕組みの場合、内部で wp_insert_post や wp_update_post, wp_insert_term　など**データベースに関わるようなクエリを発行するたびに全クエリをQueryMonitorが記録してしまうため、100件程度登録しただけでメモリエラーが発生する**ことになる。

この独自のキャッシュ？は wp_cache_flush や wpdb::flush などのキャッシュクリア系の関数･メソッドを利用してもクリアできないため、ループで大量の投稿（やタクソノミー）を追加・変更するような場合にメモリエラーが起きた場合には、まずQueryMonitorプラグインを疑ってみた方が良い。
Python 3でのファイルのimportのしかたまとめ

## 同じディレクトリにあるファイル
```
.
├── brother.py
└── main.py
```

```brother.py
def hi():
    print("Hi! I'm your brother.")
```

```main.py
import brother
brother.hi()
```


## ひとつ下のディレクトリにある個別のファイル
```
.
├── children
│   └── tom.py
└── main.py
```

```tom.py
def hi():
    print("Hi! I'm Tom.")
```

**いい例 1**:

```main.py
from children import tom
tom.hi()
```

**いい例 2**:

```main.py
import children.tom
children.tom.hi()
```

**だめな例**: →パッケージにする必要がある（後述）

```main.py
import children
children.tom.hi() # >> AttributeError: module 'children' has no attribute 'tom'
```

## ひとつ下のディレクトリにある複数のファイル
`__init__.py`を作り、そのディレクトリをパッケージとして扱う。`__init__.py`の中でそこで同じディレクトリに含まれるモジュールを読み込む。

```
.
├── children
│   ├── __init__.py
│   ├── sushi.py
│   └── tom.py
└── main.py
```
```sushi.py
def hi():
    print("Hi! I'm Sushi.")
```


**いい例**：
モジュールの中では、`.`を使って相対パスで読み込むモジュールを指定する。（[公式リリースノート](https://docs.python.org/2.5/whatsnew/pep-328.html)、[参考](http://stackoverflow.com/questions/22942650/relative-import-from-init-py-file-throws-error))

```__init__.py
from . import tom
from . import sushi
```
```main.py
import children
children.sushi.hi()
```

**△な例**: こうすることもできる

```__init__.py
from .tom import hi as tom_hi
from .sushi import hi as sushi_hi
```
```main.py
from children import *
sushi_hi()
```

**だめな例**

```__init__.py
import tom # >> ImportError: No module named 'tom'
import sushi
```

毎回モジュールを書き足すのが面倒な場合は[ここ](http://flame-blaze.net/archives/4963)などを参考に、同じディレクトリにあるファイルをすべて読み込むようにする。

## ひとつ上のディレクトリにあるファイル
そもそもこういうことはあまりすべきではないかもしれないが、やりたいときもある。

```
.
├── children
│   └── main.py
└── mother.py
```

```mother.py
def hi():
    print("Hi! I'm your mother.")
```

**いい例** : 
親ディレクトリをパスに含めた上でモジュールである`mother.py`を読み込む。

参考: [Import From Parent Folder / Python Cook Book](https://xxx-cook-book.gitbooks.io/python-cook-book/content/Import/import-from-parent-folder.html)
```main.py
from pathlib import Path
import sys
sys.path.append(str(Path(__file__).resolve().parent.parent))
import mother

mother.hi()
```

**悪い例** : 

```main.py
from .. import mother # >> ImportError: attempted relative import with no known parent package

mother.hi()
```
Git のリモートのブランチを確認する

# クイックリファレンス

```shell:Shell
git fetch
git branch -a
```


# リモートのブランチを確認したい
GitHub や Bitbucket を使って数人で開発するとき、たくさんのブランチを切ってコミットすることが多いと思います。

そういうときに自分で切ったブランチや他の人が切ったブランチをすべて確認したいときがあります。

単に `git branch` だけだと自分がローカルで切ったブランチしか表示されません。


# `-a` オプション
そんなときは `-a` オプションを使います。

まずは最新のリモートのブランチの情報をローカルに反映させるために、fetchを行います。

```shell:Shell
git fetch
```

次に `-a` オプションをつけてブランチを確認します。

```shell:Shell
git branch -a
```

すると、リモートにある他の人が切ったブランチも含め、すべてのブランチを確認することができます。

Git を使う上では基本的なオプションかもしれませんが、今まで知らなかったのでちょっとしたメモです。