OmniAICreator/Qiita-1.07M huggingface dataset:
GitHubにpush済みのpythonコードをCIしてみる。

[DIY太陽光発電システム](http://blog.rinka-blossom.com/how_to_make_diy_offgrid/)の発電状況をグラフ化してチェックできるようにしていますが、背後では、Pythonというプログラミング言語で記述したソフトウェアが動いています。

[PyPIに公開している](https://pypi.python.org/pypi/tsmppt60-driver)ので、ぜひ使ってやってください。こんな感じ↓で見つかります。

```bash
$ pip search tsmppt60-driver
tsmppt60-driver           - Python module to get status of your solar charge controller TS-MPPT-60.
```

…事前に[TS-MPPT-60](http://blog.rinka-blossom.com/tai-yang-guang-fa-dian-sisutemunoyao-tiyazikontororawoxuan-bu/)を入手する必要はありますが…。

PyPIで公開するに当たって、さすがにテストは真面目に書かないとまずかろうと思い、unittestやdoctest、nose、MiniMockを使ってみました。

個別の詳細はまた今度に回して、今回はCI（Continuous Integration）、継続的インテグレーションネタです。

有名なCIツールにJenkinsがありますが、今回作ったtsmppt60-driverはgithubにOSSとしてpushしてあるので、流行りの[TravisCI](https://travis-ci.org)を使わせて頂きました。

TravisCIを使うに当たって、全体の流れは以下のような感じでになります。

1. TravisCIアカウント登録（GitHubアカウントとの連携可能）
2. TravisCIのWeb設定画面上で、CI対象のGitHubリポジトリを選択
3. TravisCIのヘルプに従って設定した.travis.ymlファイルをGitHubリポジトリに追加

githubアカウントを持っていれば、ブラウザ上で簡単なGUI操作のみで、githubへのpushをhookして自動ビルド＆テストしてくれる上、[![Build Status](https://travis-ci.org/dodo5522/tsmppt60_driver.svg)](https://travis-ci.org/dodo5522/tsmppt60_driver)のようなバッジをREADMEに表示することもできます。

その設定は、以下のようにとても簡単です。

まずは[TravisCI](https://travis-ci.org)に飛び、Sign In With GitHubでログインします。

![](https://farm2.staticflickr.com/1683/24018710732_dd04f20cd2_z_d.jpg)

すると、すでにGitHubとの連携が完了しているので、CIしたいリポジトリのスイッチをONにします。

以下の例ではhome-automationリポジトリのCIをONしています。

![](https://farm6.staticflickr.com/5804/23498590394_75ab8d395d_z_d.jpg)

上の画像のギアマークをクリックすると、詳細な設定やビルド履歴を参照することができます。

多分、デフォルトでpushをトリガーにビルドする設定になっていると思います。

![](https://farm6.staticflickr.com/5634/23759022829_dfae5a669a_z_d.jpg)

あとは[TravisCIのヘルプ](https://docs.travis-ci.com/user/languages/python)に従って設定した.travis.ymlファイルをGitHubリポジトリに追加、pushするだけです。

tsmppt60-driverはpythonパッケージなので、以下のようにpython向けの設定になります。

```ruby
language: python
python:
  - "2.7"
  - "3.2"
  - "3.3"
  - "3.4"
  - "3.5"
  # does not have headers provided, please ask https://launchpad.net/~pypy/+archive/ppa
  # maintainers to fix their pypy-dev package.
  - "pypy"
# command to install dependencies
install:
  - pip install .
  - pip install -r requirements.txt -r test-requirements.txt
# command to run tests
script: nosetests
```

Pythonの主要バージョン、最新バージョンは一通り押さえておき、ビルド、テスト前に必要なパッケージをpip installするようにしています。

requirements.txtはtsmppt60-driverが動作するのに必要な依存パッケージが、test-requirements.txtにはテスト実行するのに必要な依存パッケージが記載されています。

```bash
$ cat requirements.txt
requests>=2.8.0
$ cat test-requirements.txt
MiniMock>=1.2.8
nose
coverage
```

これらの.travis.yml, requirements.txt, test-requirements.txtをtsmppt60-driverリポジトリのルートに置いてgit add/commit/pushすると、以下のように結果が表示されます。

![](https://farm2.staticflickr.com/1678/24127272595_9b76e39601_z_d.jpg)

ビルドやテストに成功し続けている間は何も通知してくれませんが、一旦失敗するとJenkinsのようにFailした旨をメールで通知してくれます。

GitHubのREADMEにビルドステータスのバッジを表示する方法も[TravisCIのヘルプ](https://docs.travis-ci.com/user/status-images/)に載っています。

privateリポジトリのビルドステータス表示には、バッジへのURLにセキュリティトークンが含まれるので注意、とありますが、今回のリポジトリはpublic扱いなので問題ありません。

これでテスト環境は整ったので、次は[テストコードのカバレッジ計測](http://blog.rinka-blossom.com/githubnipushji-minopythonkodowo/)に続きます。
JavaScript(ECMA Script 2015)のクラスでのPromiseの書き方

JavaScript(ECMA Script 2015 / ECMA Script 6)ではクラス機能や非同期処理を扱う`Promise`クラスが使えます。`Promise`はスコープがとち狂ってしまうことがあるので、対処方法をまとめました。

## `then()`でアロー関数を使え

結論からいうと、`Promise`インスタンスの`then()`メソッドでスコープが変わるので、ここにアロー関数を使うと良いです。

```js
// プロミスの書き方
new Promise((resolve) => {
    // 一秒待って
    setTimeout(()=>{
      // プロミス終わり
      resolve();
    }, 1000);
  })
  .then(() => {
    // スコープは、ずれないよ！
    console.log(this);
  });
```


## サンプルで理解しよう

スコープをクラスに閉じ込めた場合で検証します。

```html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <script>
    "use strict";
    
    /** Promise 内包クラス */
    class Hoge {
      constructor(){
        this.piyo = "ぴよ";
      }
      getPromise(){
        // 非同期処理を挟む
        return new Promise((resolve) => {
          // 一秒待って
          setTimeout(()=>{
            // プロパティーに代入
            this.piyo = "もじゃ";
            // プロミス終わり
            resolve();
          }, 1000);
        });
      }
    }

    /** Promise 利用クラス */
    class Main {
      constructor(){
        var hoge = new Hoge();
        // プロミスの書き方
        hoge.getPromise()
          // 一秒後に
          .then(() => {
            // スコープは、ずれないよ！
            console.log(hoge.piyo);
            console.log(this);
          });
      }
    }

    // 実行
    new Main();

  </script>
</head>
<body>

</body>
</html>
```

実行結果は次の結果となりました。`this.piyo`は`もじゃ`となり、`console.log(this)`では`Main`となりました。想定通りですね！

```
もじゃ
Main {}
```
[Java] foreachのコロンの右側

#なにこれ
Javaのforeach文（拡張for文）の、コロンの右側
すなわち
`for( String s : list )`
の`list`の部分
これが何回実行されるのか、疑問に思ったわけです。


`for( String s : getList() )`
な～んて、メソッドを書いちゃった時。
まさかループするたびに`getList()`するなんてないよね？
そんなことしてたらおかしいよね？

実験してみました。

#実験
```java:Java
public static void main( String[] args ) {
	for( String s : getList() ) {
		System.out.println( s );
	}
}

public static List<String> getList() {
	System.out.println( "getList()" );
	List<String> l = new ArrayList<>();
	l.add( "a" );
	l.add( "b" );
	l.add( "c" );
	return l;
}
```

```text:出力
getList()
a
b
c
```

#結論
納得の結果だった。
CakePHPのsaveメソッドとcreateメソッドの基礎


昔触っていたCakePHPを最近仕事でまたメインで使うようになったので色々思い出すために基礎的なことを振り返っていこうと思う。

# 保存するデータの形式
CakePHPではモデルを保存する時、以下の形式の配列で保存する。

```php
$test = array(
	[ModelName] => array(
		[fieldname1] => 'value',
		[fieldname2] => 'value2',
	)
);
```

ほとんどの場合、この形式を意識する必要は無い。CakePHPのFormHelperやモデルのfindメソッドは全てこの形式に従っているため。FormHelperを使っていれば、`$this->request->data`で簡単にこの形式のデータにアクセスできる

# 保存するメソッド
通常は`save`メソッドを利用する。このメソッドは配列の形式のデータを受け取り、保存する。新規・更新両方に利用できる。

`Model::save(array $data = null, boolean $validate = true, array $fieldList = array())`

デフォルトではsaveを実行するとバリデージョンが実行され、データの内容がチェックされる。第二引数にfalseを渡すことで、バリデーションを実行しないことも出来る。第三引数のフィールドのリストはセキュリティ向上のため、保存する対象のフィールドを制限することが出来る。

$fieldListを渡さない場合、変更する予定が無かった場合でも悪意のあるユーザーがフォームデータに任意のフォームのデータを追加できていしまう。(FormHelperを使ってフォームを生成していると自動でCakePHPのデータの形式で渡されるため)

ただし、SecurityComponentを利用すれば、上記の問題は回避出来る。

# save完了後の挙動
saveが完了すると、モデルオブジェクトの`$id`に保存されたデータのIDが自動でセットされる。

```php
$this->Test->save($newData);
// 保存したID
$saveId = $this->Test->id;
```

# 新規作成・更新の判断
$this->Model->idがセットされていれば、このIDをプライマリーキーにもつ、レコードが更新される。それ以外は新しくレコードが作られる。

```php
// 新規作成: IDがセットされていない
$this->Test->create();
$this->Test->save($this->request->data);

// 更新: IDに整数値がセットされている
$this->Test->id = 2;
$this->Test->save($this->request->data);
```

更新する時は、もう一つ方法があり保存する配列にIDを含めているとそのまま保存することが出来る。IDをプライマリーキーにもつレコードが更新される。

```php
$data = array(
	'Test' => array(
		'id' => 1,
		'name' => 'masaru',
		'age' => 25,
	);
);

$this->Test->save($data);
```

# createメソッド
モデルの状態を初期化する。`Model::$id`フィールドは初期化され、データベースのフィールドのデフォルト値を元にデータの配列の値をセットする。

`Model::create(array $data = array())`

第一引数にdataパラメータが渡された場合、データベースのフィールドのデフォルト値とマージされ、モデルのインスタンスはデータを保存する準備が完了する(データは`$this->data`でアクセスできる)

createメソッドではデータベースフィールドの初期値がセットされるため、必ずInsert処理が行われる時のみ実行するようにする。

参考URL:【CakePHP】Model::create() の使い方と注意点 | バシャログ。 | 横浜でWeb制作を行うシーブレインスタッフによる技術情報ブログ http://bashalog.c-brains.jp/13/12/12-162507.php
怪しげなJava講習を見つけたのでとりあえず読んでみました

# 概要
　**[Javaの基礎文法と開発ツールの使い方を同時に覚える講習](http://www.searchman.info/java_eclipse/moushi_java_eclipse.html)**なるものがTLで流れてきたので。色使いからして**明らかに怪しい**のですが、内容がなかなか凄まじいものでした。以下、ポイントを纏めて紹介します。

# 「意味不明な横文字が多い！」
　ここで言うところの横文字とは、**「J2SE」「J2EE」「サーブレット」「tomcat」**などを指します。なんだかこの時点で色々と古いのですが、このページでは**「それらは全部無視してとりあえずJDKを入れろ(要約)」**と宣います。まあ正論ですね。正論ですが、同サイトでの別ページに、「こちらからダウンロードしてくださいね」と[メアドを入力させるリンクが貼られている](http://www.searchman.info/java_eclipse/1010.html)のが**最高にロック**です。
　また、オブジェクト指向については、「オブジェクト指向、サーブレット、Tomcatは今回の講習で扱いません」とのこと。**基礎文法と開発ツール(Eclipse)の使い方をまず徹底させる**といった理屈は分かりますが、後述の理由でそれらが**若干怪しく思えてきて**しまいます。

# 「開発ツールだってボタンが多すぎ！」
![引用](http://www.searchman.info/lesson/img/080801.gif)
(当該サイトより引用)
　これで多いのでしょうか？　MS Officeのリボンにあるボタンの方が**遥かに膨大**な気がしますが……。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/29802/e677e92c-aa91-3801-7e17-a24eadcbc100.png)
　もっともこの講習では、Eclipseの様々な機能(入力補完・ステップ実行・警告表示など)について教えてくれるとのことなので恐らく問題無いでしょう。不安があるとしたら、この次の項目です。

# 「同時に基礎文法も学んでいただきます」
　ページを読んでいくと分かりますが、**最大の不安要素がこれです**。あからさまにヤバイことが平気で書いてあるからです。

- 「Eclipseの場合、Javaの文法用語は紫になります」……**「文法用語」とありますが、もしかしてそれは「キーワード」では？**
- 複数行のコメントアウトを「//」で行っている……**なぜ/\*～\*/を使わないのでしょうか？**
- 「sum += i」や「i++」を「正しい文法ではない」と宣う……**インクリメントは文法違反らしいですよ(棒)**

　揚げ足取りに見えるかもしれませんが、サイトの表紙からしてこれでは**信用しろという方が無理**です。オブジェクト指向等については別の講習で扱うらしいですが、同様の理由で御免被りたいです。

# その他気になったところ
　最初の方にもありましたが、ちょくちょく個人情報を求めてくるのが中々に怪しいです。[サーブレットで陥りやすい箇所についての説明](http://www.searchman.info/java_eclipse/repo.html)では何と**2箇所も姓とメアドの入力欄が**あります。また、上記ページの「受講者の声」欄には様々な人物の体験談が書いてあるわけですが、ちょくちょく**誤字脱字がある**というのも笑いを誘います。これで1件あたり2000円だそうなので、**安いと思うべきかボロい商売だなと思うべきか**……。
　なお、[別のページ](http://www.searchman.info/java_eclipse/new.html)には「多少誤差があってもわかりやすい説明をしたほうがいい」とありますが、**誤差……？**
cocos2d-xにおけるAudioEngineの問題

cocos2d-xでSimpleAudioEngineでできないことがあったとき、AudioEngineを使う事が多いでしょう。そこで、ちょっとした問題に遭遇したため備忘録として書いておきます。
今回、AudioEngineを使おうとして、
https://korosame.wordpress.com/2014/10/28/【cocos2d-x】simpleaudioengineではなくaudioengineを使う/
を参考にしたけれど音声が再生されなかったため原因を探すためcocosのAudioEngineのコードを見たところ、

```c++:AudioEngine-inl.mm
bool AudioEngineImpl::init()
{
    bool ret = false;
#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS
        s_AudioEngineSessionHandler = [[AudioEngineSessionHandler alloc] init];
#endif
    do{
        s_ALDevice = alcOpenDevice(NULL);        
if (s_ALDevice) {
            auto alError = alGetError();
            s_ALContext = alcCreateContext(s_ALDevice, nullptr);
            alcMakeContextCurrent(s_ALContext);
        
            alGenSources(MAX_AUDIOINSTANCES, _alSources);
            alError = alGetError();
            if(alError != AL_NO_ERROR)
            {
                printf("%s:generating sources fail! error = %x\n", __PRETTY_FUNCTION__, alError);
                break;
            }
            
            for (int i = 0; i < MAX_AUDIOINSTANCES; ++i) {
                _alSourceUsed[_alSources[i]] = false;
            }
            
            _threadPool = new (std::nothrow) AudioEngineThreadPool();
            ret = true;
        }
    }while (false);
    
    return ret;
}
```
のところでalcOpenDevice(NULL)でNULLを返しているのが原因と分かったためOpenALで問題になっていました。
http://stackoverflow.com/questions/24067201/getting-an-audio-device-with-openal
を調べたところOpenALとAppleのAPIにちょっと問題があるらしく、alcOpenDeviceを使う前に、何かAPIを使って呼び出しているとNULLを返すらしい。
コードを見返したところSimpleAudioEngineを前のシーンで使っていてそれで問題があったみたいです。
SimpleAudioEngineで書いてたところをすべてAudioEngineにしたらうまくいくため、今後同じ事があったら気を付けてください。
Visual Studio 2015からAzureへのテストページのアップロードに失敗する

#想定するシナリオ
せっかくAzureを使うのだから、Microsoftプロダクトフル装備で開発したい、そんな時に使う開発環境はもちろんVisual Studio 2015です。Visual Studio Community 2015なら無料でダウンロードできますよ。
[Visual Studio 2015 - Visual Studio - Microsoft](https://www.visualstudio.com/downloads/download-visual-studio-vs)

ダウンロードして、さあAzureに接続！と行ったときに私はちょっと躓きました。日本語で解説している人がいなそうなので、ここで紹介します。

#大方針：Azure SDKは最新にしよう
SDKはAzureのサービスの更新に伴ってアップデートされます。そのため今Visual Studioをダウンロードしてインストールしたからと言ってSDKは最新でない場合があります。ウィンドウのタイトルバーの旗マークの通知に更新の情報が出ていないか確認しましょう。
![image](https://qiita-image-store.s3.amazonaws.com/0/109681/acafa4d3-ed93-fdf0-b08c-93a3df0192a1.png)

#うまくいかない①　Azureのサブスクリプョンがないと言われてしまう
古いSDKだとAzureへの接続を試みたとき、サブスクリプションしているにもかかわらず認識されません。最新に更新しましょう。なお無料試用版サブスクリプションでもVisual Studioからの接続は可能です！

#うまくいかない②　Azure SDKのアップデート時にエラーが出て先に進まない
このエラーが出ちゃった場合。
`Azure Storage Emulator requires LocalDb to be installed. You must enable the Microsoft SQL Server Data Tools feature in Visual Studio 2015 to install Local Db before proceeding`

ここに書いてある通りです（下は適当日本語訳）。
[Error Installing 2.7 Azure SDK in Visual Studio 2015 Community Ed.](https://social.technet.microsoft.com/Forums/en-US/758688c7-f6d4-4241-ae37-a9023ae3306e/error-installing-27-azure-sdk-in-visual-studio-2015-community-ed?forum=websitesvirtualmachinesonwinserver)

> 質問したけど自分で答えを見つけました。SQL Server Data Toolはデフォルトではインストールされないので、それをインストールしました。そのときにLocalDbも導入されます。

プログラムと機能からMicrosoft Visual Studio Community 2015 with update 1の変更を選択して、以下を追加インストールしてやり直してましょう。
![image](https://qiita-image-store.s3.amazonaws.com/0/109681/0ce0f88c-547b-e006-949e-09304874b036.png)

#うまくいかない③　テストページをAzureにアップロードできない
Visual StudioからAzureをつかってHello Worldしたいとき、まず参考にするのは下記サイトです。
[Welcome to Visual Studio 2015 with Azure!](https://blogs.msdn.microsoft.com/microsoft_student_developer_blog/2015/07/20/welcome-to-visual-studio-2015-with-azure/)
英語がわからなくてもキャプチャがあるのでわかりやすく進めることができますが、同じように操作すると最後のPublish Your Web Appのエリアで以下のようなエラーでAzureへの送信に失敗します。
![image](https://qiita-image-store.s3.amazonaws.com/0/109681/b2194632-b6f0-c5d6-3c6e-b805243d0e3a.png)

この場合、ソリューション エクスプローラーのウェブサイトを右クリック→Web Appの発行ではなく、Azure App Serviceのアクティビティウィンドウ（上の図のウィンドウ）の地球の下から右上に矢印が出ているマークを押すことで発行ができる、とフォーラムではコメントされています。今後のSDKの更新で直っていてほしいですね。
underscoreコードリーディング（range）


underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##rangeとは


###[underscorejs.orgのrange](http://underscorejs.org/#range)

こんな説明。
>####_.range([start], stop, [step]) 
>A function to create flexibly-numbered lists of integers, handy for each and map loops.
>start, if omitted, defaults to 0; step defaults to 1. 
>Returns a list of integers from start (inclusive) to stop (exclusive), incremented (or decremented) by step, exclusive.
>Note that ranges that stop before they start are considered to be zero-length instead of negative — if you'd like a negative range, use a negative step.


```javascript
_.range(10);
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
_.range(1, 11);
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
_.range(0, 30, 5);
=> [0, 5, 10, 15, 20, 25]
_.range(0, -10, -1);
=> [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
_.range(0);
=> []
```
------------- 
eachやmapのために便利な、整数のフレキシブルな番号のリストを作る関数です。
startが省略された場合、デフォルトは0から始まって、同じようにstepのデフォルトは1です。
startからstopまで、stepによって増加/減少しながら生成された配列が返されます。
note
もし負の値のrangeや負の値のstepを利用する場合、負の値の代わりに？配列の長さが0なことを考慮する必要がある？


###[underscore.range](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L675)
コード的にはこのあたり。

```javascript
  // Generate an integer Array containing an arithmetic progression. A port of
  // the native Python `range()` function. See
  // [the Python documentation](http://docs.python.org/library/functions.html#range).
  _.range = function(start, stop, step) {
    if (stop == null) {
      stop = start || 0;
      start = 0;
    }
    step = step || 1;

    var length = Math.max(Math.ceil((stop - start) / step), 0);
    var range = Array(length);

    for (var idx = 0; idx < length; idx++, start += step) {
      range[idx] = start;
    }

    return range;
  };
  
```

stopがnullの場合はstopをstart（startがundefinedな場合は0）にし、startを0にする。
stepはstep（stepが存在しない場合は1)にする。

stop-startをstepで割った値の切り上げの値と、0の大きい方の値分だけlengthに代入する。
そのlengthを元にrangeを配列を生成する。

あとはlengthの長さまで0から1ずつ増加しながらfor文を回して、range[idx]にstartを代入していく。
startはstep分だけ増加する。

その後、rangeを返却する。
uGUIのScroll ViewでGrid

Unity5.3.1fで検証します。
[uGUIのScroll Viewをはじめてみる](http://qiita.com/okuhiiro/items/14b829778d226bc2f2ed)
の拡張になります。
Scroll ViewとGridを組み合わせることが多いと思われるのあわせて知っておくといい感じです。

#実装
##Contentの設定
Grid Layout Groupをアタッチします。
![ScrollGrid.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/d0106fa5-a653-8597-c578-434c71e5032d.png)
![ScrollGrid1.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/89624950-e82a-645f-089e-1361b737d11e.png)

Contentの子にImageを複数いれました。設定どおり綺麗に整列されているのがわかります。
![ScrollGrid2.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/6cebeb50-f8c1-ad29-4f42-57946fa417c9.png)
Rails-API で生成するファイルのまとめ

##メモ内容
Rails-API を使ってるけどgenerateコマンドがいつもrails g と違って何か色々あるので、
一つづつ動かしてみて確かめてみました。

##結果
```text:railsコマンド
$ rails version
Rails 4.2.5
$ rails g △ test
(△の部分を色々と変えてみました。)
```

|コマンド  |生成ファイル名|
|:--------|:--------|
|api_resource_route |無し|
|assets |app/assets/javascripts/test.js|
|controller |app/controllers/test_controller.rb　<br> test/controllers/test_controller_test.rb|
|generator |lib/generators/test/test_generator.rb <br> lib/generators/test/USAGE <br> lib/generators/test/templates <br> test/lib/generators/test_generator_test.rb |
|helper |app/helpers/test_helper.rb|
|integration_test |
|job |app/jobs/test_job.rb <br> test/jobs/test_job_test.rb |
|mailer |
|migration |
|model | db/migrate/20160117100146_create_tests.rb <br> app/models/test.rb <br> test/models/test_test.rb <br> test/fixtures/tests.yml |
|resource |db/migrate/20160117100451_create_tests.rb <br> app/models/test.rb <br> test/models/test_test.rb <br> test/fixtures/tests.yml <br> app/controllers/tests_controller.rb <br> test/controllers/tests_controller_test.rb |
|scaffold |db/migrate/20160117100656_create_tests.rb <br> app/models/test.rb <br> test/models/test_test.rb <br> test/fixtures/tests.yml <br> app/controllers/tests_controller.rb <br> test/controllers/tests_controller_test.rb |
|scaffold_controller |app/controllers/tests_controller.rb <br> test/controllers/tests_controller_test.rb |
|task | lib/tasks/test.rake |

##DBのタイプ
integer
primary_key
decimal
float
boolean
binary
string
text
date
time
datetime
よく忘れるlink_toにパラメータを付与する方法

```
<%= link_to edit_fugafuga_path(@foo, bar), class: 'btn btn-primary' do -%>
  リンクなのだ
<% end -%>
```
このようになっているソースにパラメータを付与したいときは、`class:`の**後ではなく**  **`xxx_path()`の最後の引数**として作り出す。

```
<%= link_to edit_fugafuga_path(@foo, bar, hoge: 'hoge'), class: 'btn btn-primary' do -%>
  リンクなのだ
<% end -%>
```

パラメーター（クエリー）の付与はlink_toの機能じゃなくてパスヘルパーの機能。
[Oracle]DBAのパスワードを変更する

DBAのパスワードを忘れてしまうことがたまにあります。

その場合、以下のコマンドでパスワードを変更できます。
（接続識別子：xxxxx、パスワード：test）

```lang:command
$ export ORACLE_SID=xxxxx
$ sqlplus / as sysdba
SQL> ALTER USER SYS IDENTIFIED BY 'test';
```
[Qiita] 巨大な画像のような重い画像を記事に載せたいときにサムネイル画像を使う方法

# 問題
重い画像を記事に載せたいときがある。
[Qiitaに付属している画像アップロード機能は1MiBの画像までアップロードでき](http://help.qiita.com/ja/articles/qiita-team-upload-image)、外部のURIを使えるのならばこの1MiB制限も無くなる。
このようなMiB級の重い画像を記事に載せたいとき、普通に

```
![代替テキスト](重い画像.png)
```

のように書くと、

```html
<a href="重い画像.png" target="_blank"><img src="重い画像.png" alt="代替テキスト" style="max-width:100%"></a>
```

に相当するHTMLが生成され、重い画像を意図せず読者にダウンロードさせることになり忍びない。
一方で、単に画像へのリンクを貼るだけというのも味気ないので、記事には容量が軽いサムネイル画像を載せておいて、クリックで元画像を開けるようにしたい。

# 解決策

自前で軽いサムネイル画像を作成しておき、サムネイル画像をQiitaにアップロードしたら次のようなMarkdownを書く。

```
[![代替テキスト](サムネイル画像.png)](重い画像.png)
```

これは以下に相当するHTMLを生成するので、

```html
<a href="重い画像.png" target="_blank"><img src="サムネイル画像.png" alt="代替テキスト" style="max-width:100%"></a>
```

読者は意図せず重い画像をダウンロードせずに済む。

# 使用例

[拙記事](http://qiita.com/anqooqie/items/e51d29356ddaca6ca228)で使ったもの。

```
[![状態遷移図](https://qiita-image-store.s3.amazonaws.com/0/106760/d46f5420-8ffa-0e82-fdd4-f2250c5230d5.png)](https://qiita-image-store.s3.amazonaws.com/0/106760/6ff8132d-04f3-1a92-668f-c0367f4f1d2e.png)
```

[![状態遷移図](https://qiita-image-store.s3.amazonaws.com/0/106760/d46f5420-8ffa-0e82-fdd4-f2250c5230d5.png)](https://qiita-image-store.s3.amazonaws.com/0/106760/6ff8132d-04f3-1a92-668f-c0367f4f1d2e.png)

この画像の元画像は431KiBなのでサムネイル画像を使う意味はあまり無いのだが、MiB級でなくても、この規模の画像が何枚も連続するような記事ならばサムネイル画像を使うのは一考の余地があるかと思う。
ずぼらなGitHub ブランチ利用メモ

GitHubのブランチについて、忘れない様にメモ


## ローカルに Clone したディレクトリで、新しいブランチを作る

```
$ git checkout -b [your_branch_name]
```

あとは、編集して、add, commit, push の順番でリポジトリに、ブランチとして登録できる。


## 作成したブランチを clone する

```
$ git clone -b [your_branch_name] https://github.com/takara9/[my repo name]
```

## リモートのブランチのリスト

```
$ git branch -r
  origin/HEAD -> origin/master
  origin/master
  origin/ms
```

## 現在のブランチ

```
$ git branch -l
* ms
```
vvvv基礎操作　ショートカットについて

#vvvvの基礎操作について
このページを開く人がどんな人なのかちょっと想像してみたいと思います。

「vvvv.exeをダブルクリックしたらバツボタンのない灰色のウィンドウが出てきたんだけど！？」

となっている人が思い浮かびました。
**それは仕様です。お使いのvvvvはひとまず正常に動作しています。**

ひとまず基礎的な操作はgif動画で上がっている記事がありますので、まずはそちらをご覧ください。
http://qiita.com/Junky_Inc/items/1cb095d189b183a87d63


#ショートカット多すぎィ
フォトショやAeなどのボタンを4つ以上押すようなショートカットから比べれば大したことないですが、ほどほどショートカットには量があります。
しなしながら、だいたいのショートカットは**マウスのスクロールボタン押し込み**で出てくるウィンドウにだいたいあるので、ここから解決できます。
「スクロールボタンないんだけど？」そういう場合は**スペースキーと右クリックを同時押し**すると出てきます。
![menyu.png](https://qiita-image-store.s3.amazonaws.com/0/100231/202d4198-8c64-a68f-3277-77ae5170cc87.png)

#それでもやっぱり、ショートカット集がほしい
そんな時がやってくるかもしれません。
下記のページから「Don't Panic」というショートカット集がPDFでダウンロードできます。
もちろん英語ですが、理解するには支障ないくらいの優しい英語でできてる（気がします）ので、見てみてください。
https://vvvv.org/contribution/dont-panic-the-noobs-guide-to-vvvv

![dontpanic.png](https://qiita-image-store.s3.amazonaws.com/0/100231/986e9f38-0006-4e3e-3a1e-ff56496f12cd.png)

#私のお気に入りのショートカット

余計ですが、便利だけどあまり知られていないショートカットを紹介して終わりたいと思います。
ノードをこねくりまわすあまり、なにがなにやらになってしまうことがありますよね。

ノードをリセットしたい。そんな時は**ノードをAtl+右クリック**しましょう。
これでノードをリセットすることができます。
ノードブラウザから新しいノードを出すことなく、すばやく初期化することができます。
**ノードピンからひもを伸ばしているときはリセットできませんので、ひもが切れた状態でトライしてください**


よきvvvvLifeを。
[JavaプログラマのためのHaskell]五日目・パターンマッチの話

[前回](http://qiita.com/noco/items/2b93de4fa45f71d7b4b5)の続き.

<h1>expand.hsその3</h1>
タブ文字を空白８文字に展開する.

```expand.hs
tabStop = 8

main = do cs <- getContents
          putStr $ expand cs

expand :: String -> String
expand cs = concatMap expandTab cs

expandTab :: Char -> String
expandTab '\t' = replicate tabStop ' '
expandTab c = [c]
```
・パターンマッチ：　関数の引数に値のパターンを指定し、それによって場合分けする手法.上記の例では、expandTabは引数が'\t'の時だけ,replicate tabStop ' 'という定義を使用する.expandTabをパターンマッチを使わずに書くと以下.

```
expandTab c = if c == '\t' then replicate tabStop ' '
                           else [c]
```

・concatMap関数：　concat関数とmap関数を一つにまとめた関数.分けて書くと、
concat $ mapとなる.

```
concatMap :: (a -> [b]) -> [a] -> [b]
```

・replicate関数：　replicate n xとした時、xをn個だけ含むリストを返す.nが0以下の時は空のリストを返す.

```
replicate :: Int -> a -> [a]
```

```
replicate 3 True　　→ [True, True True]
replicate 3 77　　　→ [77, 77, 77]
replicate 3 a　　　 → "aaa"
replicate 0 True　 → []
```

<h1>map関数</h1>
定義は以下.

```
map :: (a -> b) -> [a] -> [b]
map f []　　　　→ []
map f (x:xs)　 → f x : map f xs
```

リストに対するパターンマッチです.第二引数が空リストであれば[]を返し、それ以外であればリストの全要素にfを適用する.


今回はここまで！
[第四回](http://qiita.com/noco/items/2b93de4fa45f71d7b4b5)
出典
青木峰郎.ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門.ソフトバンク クリエイティブ株式会社,2006,372p.
PhoenixでmodelのListからselectタグを生成する

# 概要
PhoenixでmodelのListからselectタグを生成する。
selectの基本的な説明は以下を参照。
http://hexdocs.pm/phoenix_html/Phoenix.HTML.Form.html#select/4

# Example
## model
```ex:role.ex
schema "roles" do
  field :uid, :string
  field :name, :string
end
```

## modelのList
```json:roles
[
  { uid: "admin", name: "Admin" },
  { uid: "user", name: "User" },
]
```

## select
```ex:select.eex
<%= select f, :role, Enum.map(@roles, fn(x) -> {x.name, x.uid} end), value: @role.uid %>
```

## 生成されるHTML
```html:select.html
<select id="xxx_role" name="xxx[role]">
  <option selected="selected" value="admin">Admin</option>
  <option value="user">User</option>
</select>
```
BaasBoxの環境構築でつまづいたこと

BaasBoxの環境構築で少しつまづいたお話。
# BaasBoxって？
アプリに必要なユーザ登録、データストア、PUSH通知などのAPIを提供してくれるサービスがBaas。BaasBoxはBaasをオープンソース化しているサービスの1つ。
BaasBoxを使うと自社サーバ等にBaaSをぶっこめて、自分の管理下にユーザデータを置ける。
また、XXX万APIコールを超えたらYYYY円、みたいなこともないのでコストを抑えられる可能性もある。
でもバグとか脆弱性とかあったら自分で対処する必要があるので、そこは肝に銘じておく。
[BaasBox公式](http://www.baasbox.com/)
[BaasBox@github](https://github.com/baasbox/baasbox)

まだ、BaasBoxの1.0は出てないけど2016年に出るみたい。
<blockquote class="twitter-tweet" lang="ja"><p lang="en" dir="ltr"><a href="https://twitter.com/Soukron">@Soukron</a> early 2016 :-)</p>&mdash; BaasBox (@baasbox) <a href="https://twitter.com/baasbox/status/677757036994654208">2015, 12月 18</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

その他、詳しい内容はこの記事にあった
[BaaSBox ~まだ有料BaaSで消耗してるの？~](http://qiita.com/kurohune538/items/f05c61d9f1571afa2473)

# 今回の環境構築に使用したサーバ
[さくらVPS（CentOS 6）](http://vps.sakura.ad.jp/)

# BaasBoxの起動まで
```
yum update
yum install java-1.8.0-openjdk
yum install unzip
wget --content-disposition http://www.baasbox.com/download/baasbox-1.0.0-M2.zip
unzip baasbox-1.0.0-M2.zip
cd baasbox-1.0.0-M2/
chmod +x ./start
./start
```
これは正しく動くパターン。単にJDK、unzipをインストール->baasboxダウンロード->解凍->起動の流れ
http://IPアドレス:9000/console
にアクセスするとBaasBoxの画面が表示される

#つまづきポイント
## JDK7を指定してないか
賢明な人であれば公式サイトの[チュートリアル](http://www.baasbox.com/installing-baasbox-on-linux/)からやったはず
そこではjava1.7を指定しているので
`yum install java-1.7.0-openjdk`
以下に直す
`yum install java-1.8.0-openjdk`

## ユーザが作成できない
[チュートリアル](http://www.baasbox.com/installing-baasbox-on-linux/)の記述通りやると0.9.4がダウンロードされる（2016年1月16日時点）
`wget --content-disposition http://www.baasbox.com/download/baasbox-stable.zip`
環境依存の可能性もあるが、コンソール画面やcurlで新規ユーザを作成するとエラーが表示される
![001.png](https://qiita-image-store.s3.amazonaws.com/0/109724/56812d2f-686f-e562-b678-219af97289fb.png)

これは詳しく見てないけど1.0.0-M2を指定すると直った
`wget --content-disposition http://www.baasbox.com/download/baasbox-1.0.0-M2.zip`

## BaasBoxの停止方法は？
RUNNING_PIDファイルの中にプロセスIDが記述されているので、そのプロセスを殺せばいい（のかな？）

```
cat RUNNING_PID
kill -KILL XXXX
```

シェル書いたら次回からが楽

```
touch stop.sh
vi stop.sh
```

```stop.sh
#!/bin/sh
read pid < RUNNING_PID
kill -KILL $pid
echo killed $pid  
```
`bash stop.sh`
で実行する

## BaasBoxを2つ以上起動したい
ポート番号分ければ複数起動できた
`./start -Dhttp.port=XXXX`

## アプリコードを変えたい（設定を読み込ませたい）
[起動時にしか変えられない設定](http://www.baasbox.com/documentation/#baasbox-settings)とかあるのでそういうのに使う

1.設定ファイルを作成して編集

```
touch baasbox.conf
vi basbox.conf
```

2.設定ファイルに記述

```baasbox.conf
include classpath("application.conf")
application.code = "1234-56789"
```

3.BaasBoxを起動

```
./start -Dconfig.file=baasbox.conf
```

# 終わりに
とはいえそこまで詰まったわけではなかった。
まだ日本語の記事も少ないのでこれからガッツリ使ってみて本当に使えるのか検証してみる
UnityのSDKがないのでUnityで触ってみたい（Android,iOSのSDKはあるんだけどなぁ…）
音楽再生する簡単な方法


最近、AVAudioPlayerを使ってみたのでまとめておきます。
AVAudioPlayerは純粋にiphoneアプリで曲再生する方法として最も簡単に使える公式ライブラリです。
環境はswift2.1.1, xcode7です。
AVAudioPlayerを使った音楽再生をするためにやることは以下の3つです。

1. 音楽ファイルの準備
2. 再生準備
3. 再生・停止

## 音楽ファイルの準備

MP3などの音楽ファイルを用意しましょう。
以下の様な感じにプロジェクト内に音楽ファイルを配置します。
![スクリーンショット 2016-01-17 19.32.15.png](https://qiita-image-store.s3.amazonaws.com/0/12413/c9abab86-4530-ec71-d785-5214c2178bb8.png "スクリーンショット 2016-01-17 19.32.15.png")


## 再生準備

曲を再生すつ前に、`AVFoundation`をimportした上で以下のプログラムを実行しておきましょう。
曲再生用の画面があるならば、画面のUIViewControllerのviewDidLoadとかで実行するのがいいかと思います。

```swift
do {
  // 音楽ファイルが"sample.mp3"の場合
  let filePath = NSBundle.mainBundle().pathForResource("sample", ofType: "mp3")
  let audioPath = NSURL(fileURLWithPath: filePath!)
  audioPlayer = try AVAudioPlayer(contentsOfURL: audioPath)
  audioPlayer.prepareToPlay()
} catch {
  print("Error")
}
```

## 再生・停止

再生準備の時に生成された`audioPlayer`を用いて曲の制御ができます。

```swift
audioPlayer.play() // 音楽の再生
audioPlayer.stop() // 音楽の停止
audioPlayer.playing // 再生しているか？
```
svgのurlにハッシュ付けてターゲット擬似クラスを利用してスタイルを切り替える

2016.01.17現在

safariで上手くいかない。
backgroundはSafariとChromeで上手くいかない。
objectタグはどの環境でも上手くいったが、重いし、objectタグのdataにハッシュ付けたURL入れるとスクロールが反応しちゃう。

[デモ http://jsdo.it/ksk1015/gAoi](http://jsdo.it/ksk1015/gAoi)


```lang:svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200">
	<style id="red">#red:target ~ * {fill: red;}</style>
	<style id="blue">#blue:target ~ * {fill: blue;}</style>
	<style id="green">#green:target ~ * {fill: green;}</style>
	<circle cx="100" cy="100" r="100"></circle>
</svg>
```

```lang:html
<h2>imgタグ</h2>
<p><img src="http://jsrun.it/assets/a/L/3/B/aL3BS"> デフォルト</p>
<p><img src="http://jsrun.it/assets/a/L/3/B/aL3BS#red"> #red</p>
<p><img src="http://jsrun.it/assets/a/L/3/B/aL3BS#blue"> #blue</p>
<p><img src="http://jsrun.it/assets/a/L/3/B/aL3BS#green"> #green</p>

<h2>objectタグ</h2>
<p><object type="image/svg+xml" data="http://jsrun.it/assets/a/L/3/B/aL3BS"></object> デフォルト</p>
<p><object type="image/svg+xml" data="http://jsrun.it/assets/a/L/3/B/aL3BS#red"></object> #red</p>
<p><object type="image/svg+xml" data="http://jsrun.it/assets/a/L/3/B/aL3BS#blue"></object> #blue</p>
<p><object type="image/svg+xml" data="http://jsrun.it/assets/a/L/3/B/aL3BS#green"></object> #green</p>

<h2>css background</h2>
<p><span class="svg"></span> デフォルト</p>
<p><span class="svg svg-red"></span> #red</p>
<p><span class="svg svg-blue"></span> #blue</p>
<p><span class="svg svg-green"></span> #green</p>
```
以下、検証詳細

OS X El Capitan
Safari 9.01 : objectのみok.
Chrome 47.0 : img, objectはOK. backgroundはNG.
Firefox 43.0.4 : img, object, backgroundともに全部OK.

Windows 10
Edge : img, object, backgroundともに全部OK.

Windows7
IE11 : img, object, backgroundともに全部OK.

Android 6
Chrome 47.0 : img, objectはOK. backgroundはNG.

iOS 9.2
Safari : objectのみok.
アロー関数の個人的なハマりどころまとめ

# アロー関数

* いくつかハマりどころがあったのでメモっておく
* 便利だけどスコープ関連ではまるのでes5の構文と混ぜるな危険というのがわかった
* アロー関数使うときはes5を忘れましょう

## 構文例

```:es5
var f0 = function(x){ return x * 2 }
```

```:es6
const f1 = (x) => { return x * 2 }
const f2 = (x) => x * 2
const f3 = x => x * 2
```

## thisスコープ

* クロージャではthisが呼び出し先のthisに切り替わる仕様だったが呼び出し元のthisであることが保証された

```:es5
var C = function(){
    this.flag = false
}
C.prototype.asyncGet = function(callback){
    var self = this
    setTimeout(function(){
      callback(self)
    }, 1000)
}
new C().asyncGet(console.log);
```

```:es6
var C = function(){
    this.flag = false
};
C.prototype.asyncGet = function(callback){
    setTimeout(()=>callback(this), 1000)
}
new C().asyncGet(console.log)
```

### 混ぜるな危険パターン

* プロトタイプベースのクラス定義のときにアロー関数使うとthisがグローバルを指します

```:es6
var C = function(){
    this.flag = false
};
C.prototype.asyncGet = (callback) => {
    setTimeout(()=>callback(this), 1000)
}
new C().asyncGet(console.log)

```

## 可変引数

```:es5
var f = function(){ return [].slice.call(arguments) }
f(1,2,3,4,5,6,7,8,9)
```

```
[1,2,3,4,5,6,7,8,9]
```

```:es6
const f = (...args) => args
f(1,2,3,4,5,6,7,8,9)
```

```
[1,2,3,4,5,6,7,8,9]
```

### 混ぜるな危険パターン

* argumentsがグローバルスコープを指しているため、かならず意図しない配列が返ってきます
* es5からes6へ書き換えるときにおきます

```:es6
const f = () => [].slice.call(arguments)
f(1,2,3,4,5,6,7,8,9)
```

```
[{},
{ [Function: require]
    resolve: [Function],
    main: 
  ....
]
```
AndroidアプリでGoogleマップを表示するまでの手順 

　モバイル系のアプリに地図の表示は必須だと思いGoogle Mapsの利用手順について調べました。私は初めて開発に取り組んでいるので、同じように初めて取り組んでいる方の参考になればいいなと思って書いています。事前準備にけっこう時間がかかります。

　開発環境はAndroid Studio1.5.1です。やり方はいくつかあると思いますが、この手順でGoogle Mapsを表示することができます。

#手順
1. 「Google APIs (ARM System Image)」、「Google Play services」、「Google repository」をAndroidStudioにインストール
2. SHA1フィンガープリントを調べる
3. Google Maps 用のプロジェクトを作成する（地図用テンプレートあり）
4. Maps API Key を取得（この時にSHA1フィンガープリントとパッケージ名が必要）
5. Maps API Key の記載とマニフェストへの権限の追加

##３つのコンポーネントのインストール
①の３つのコンポーネントのインストールは「SDK Manager」で実行します。「Google Play services」と「Google repository」はExtrasにあります。

##SHA1フィンガープリントの調べ方
　SHA1フィンガープリントの調べ方です。Maps API Keyを取得するために必要です。
＜Macの場合＞
ターミナルでフィンガープリントSHA1を調べます。
”keytool -v -list -keystore ~/.android/debug.keystore”のコマンドを打てば調べられます。

＜Windowsの場合＞
コマンドプロンプトでフィンガープリントSHA1を調べられるようです。

##プロジェクトについて
　新たにプロジェクトを作成するときにプロジェクトのタイプを選択できますが、Google Maps Activityは地図用のアプリなので、Google Maps Activityで作成すると少ない作業で地図を表示できます。

##Maps API Key を取得
　下記リンク先で取得できます。取得するには手順②と③のフィンガープリントとパッケージ名が必要になります。

https://developers.google.com/maps/documentation/android-api/

##Maps API Key の記載とマニフェストへの権限の追加
　google_maps_api.xml または manifest.xml のどちらかにMaps API Keyを記載します。記載する場所は”YOUR_KEY_HERE”のところです。また、manifest.xmlに以下の権限を記載します。

```
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
```

##その他
　参考ですが、MapsActivity.javaで、デフォルトで記載されているコードを次のように書き換えるとマーカー付きで東京駅が表示されます。

```
@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    LatLng TokyoStation = new LatLng(35.681661, 139.766063);
    CameraUpdate cu = CameraUpdateFactory.newLatLngZoom(
            TokyoStation, 15
    );
    mMap.moveCamera(cu);
    mMap.addMarker(new MarkerOptions().position(TokyoStation).title("東京駅"));
}
```
awsにおけるセキュリティ関連の認証、及び金融機関導入事例

さて、セキュリティ的な立ち位置としての活動も開始したことだし、awsが取得しているセキュリティ関連の認証とか金融機関における導入事例をまとめてみるか。
詳細はawsのサイトにあるので、詳しく見たい方はawsのサイトを見たほうがいいですが、ざっくりと2016/01/17時点の情報を知りたい方に有用です。

# サマリ
国内でも海外でも金融機関の導入事例がある(ただし、基幹システム含まず)。
セキュリティに関する認証や、品質に関する規格も数多く取得している。
寧ろ物理観点におけるセキュリティの基準は、日本より海外の方が厳しいことや、論理と物理が疎結合となっているクラウドの特徴からかなり高いといえる。

# awsが取得しているセキュリティ関連の認証
https://aws.amazon.com/jp/compliance/ にあるように、品質については以下の認証を取得している

- ISO 9001 : 製品とサービスの品質を管理するための規格
- ISO 27001 : グローバルのセキュリティ基準として知られている。
- SOC 1/ISAE 3402 : 内部統制基準。
- PCI DSS : クレジットカードのセキュリティ基準
- (FISC 安全対策基準) : 日本の金融機関がシステム構築を行なう際、広く指針として利用されているもの。aws単体では満たすことが出来ないが、後述する導入事例では、外部ベンダーと協力して、基準を満たしている。

# 金融機関導入事例
## 海外
- NASDAQ OMX(株価の過去の情報配信サービス)  
  https://aws.amazon.com/jp/solutions/case-studies/nasdaq-omx/
- Tradeworx: 分析基盤サービス  
  https://aws.amazon.com/jp/solutions/case-studies/tradeworx/

## 国内
- マネックス証券(ただし基幹システム含まず)  
  https://aws.amazon.com/jp/solutions/case-studies/monex/
- ソニー銀行(ただし基幹システム含まず)  
  https://aws.amazon.com/jp/summit2014-report/details/  
  http://www.publickey1.jp/blog/14/amazon_aws_summit_tokyo_2014.html
Rails4でFaceBookなどから取得した画像をAWS S3にリサイズして保存する処理をConcernに切り出す


##動機
omniauthでログイン処理を実装した際、ユーザの画像もデフォルトで保存しておきたい。
実装するのはよいが、モデルに実装してしまうと複数のモデルで使うときに、同じコードを書かないといけないので、S3への画像アクセッサとしてConcernに切り出しました。
また、rmagickを使ってリサイズできるようにもしました。

##前提
rmagcikはネイティブライブラリのImageMagcikに依存するのであらかじめインストールしておく必要があります。

[MacにImageMagickをインストールする方法](http://hisasann.com/housetect/2010/02/macimagemagick.html)

##コード

```ruby:GemFile

#ruby version
ruby '2.1.5'

#rails version 
gem 'rails', '4.2.1'

gem 'rmagick'
gem 'aws-sdk', '~> 1'
gem 'aws-s3', require: 'aws/s3'
```

```ruby:config/s3.yml
bucket:　保存したいバケット名を書いてください
access_key_id: アクセスキーを書いてください
secret_access_key: シークレットアクセスキーを書いてください

```

```ruby:S3Access.rb
module S3Access
  extend ActiveSupport::Concern

  included do
    require 'open-uri'
    require 'rmagick'
  end

  # クラスメソッド定義
  module ClassMethods
  end

  # インスタンスメソッド
  
  # 拡張子取得
  def image_types
    # code
    {'JPEG' => 'jpg', 'GIF' => 'gif', 'PNG' => 'png'}
  end

  #バケットのurlを返すメソッド
  #このurlをモデル側で永続化しておき、ビューにはこのurlを表示して画像を参照する
  def backet_url
    # code
    s3config = YAML.load_file(Rails.root.join('config', 's3.yml'))
    "http://s3-us-west-2.amazonaws.com/#{s3config['bucket']}"
  end
  
  #バケット名を返すメソッド
  def backet
    s3config = YAML.load_file(Rails.root.join('config', 's3.yml'))
    s3 = AWS::S3.new(access_key_id: s3config['access_key_id'], secret_access_key: s3config['secret_access_key'])
    s3.buckets[s3config['bucket']]
  end


  # url経由で読み込んだ画像をs3に保存する.
  # omniauth経由でのユーザ画像登録時はこれを呼び出す
  # uri : "https://graph.facebook.com/527606440739083/picture?width=200&height=200"
  # key s3に保存するファイルのパス
  # height, width リサイズする幅、高さを指定
  def save_from_uri(uri, key, width, height)
    open(uri) do |data|
      save_from_binary(data.read, key, width, height)
    end
  end
  
  #アプリないで画像再設定する場合はこちらを呼ぶ
  def update_from_binary(binary, key, width, height)
    b = backet
    object = b.objects["#{key}.jpg"]
    object.delete if object.exists?
    save_from_binary(binary, key, width, height)
  end
  
　private:
　#保存処理共通メソッド
  def save_from_binary(binary, key, width, height)
    # code
    img = Magick::Image.from_blob(binary).first.resize_to_fill(width, height)
    img.format = 'JPEG'

    b = backet
    object = b.objects["#{key}.#{image_types[img.format]}"]
    unless object.exists?
      object.write(
        img.to_blob, # 一つ目の引数でバイナリを渡してしまえば良い
        acl: :private, # 非公開にする場合、ここで:privateを指定しておく
        content_type: "image/#{img.format.downcase}",
      )
    end
  end
end

```
scala関数リテラル


scalaはファーストクラスの関数を定義できるが、valに代入してよく使われる。
defで定義されるものは関数とわけて考えるべきで、メソッドとよばれる。

```scala:func_a.scala
scala> val coneV = new Function2[Double, Double, Double] {
  def apply(r: Double, h: Double) = (1.0/3.0) * Math.PI * r * r * h
}

scala> val v = coneV.apply(3, 7)
v: Double = 65.97344572538566
```

```scala:func_b.scala
scala> val coneV = (r:Double, h:Double) => (1.0/3.0) * Math.PI * r * r * h
coneV: (Double, Double) => Double = <function2>

scala> val v = coneV(3, 7)
v: Double = 65.97344572538566
```

上記はどちらもファーストクラス関数の例で、どちらも全く同じ意味となる。
func_aが正式な関数定義の例だが、シンタックスシュガーとしてfunc_bの記法が用意されていて、こっちのほうが頻出する。
Function2や<function2>は、scalaが標準で用意している型で、2つの引数を受け取る関数を表している。
`coneV(3,7)`のようにメソッドをよべるのは実際にはapplyメソッドがよばれている。

ちなみに、標準でFunctionが受け付けられる引数は22個までらしい。

```scala
scala> val f = (aa:Int,ab:Int,ac:Int,ad:Int,ae:Int,af:Int,ag:Int,ah:Int,ba:Int,bb:Int,bc:Int,bd:Int,be:Int,bf:Int,bg:Int,bh:Int,ca:Int,cb:Int,cc:Int,cd:Int,ce:Int,cf:Int,cg:Int,ch:Int,da:Int,db:Int,dc:Int,dd:Int,de:Int,df:Int,dg:Int,dh:Int,ea:Int,eb:Int,ec:Int,ed:Int,ee:Int,ef:Int,eg:Int,eh:Int,fa:Int,fb:Int,fc:Int,fd:Int,fe:Int,ff:Int,fg:Int,fh:Int,ga:Int,gb:Int,gc:Int,gd:Int,ge:Int,gf:Int,gg:Int,gh:Int,ha:Int,hb:Int,hc:Int,hd:Int,he:Int,hf:Int,hg:Int,hh:Int) => aa+ab+ac+ad+ae+af+ag+ah+ba+bb+bc+bd+be+bf+bg+bh+ca+cb+cc+cd+ce+cf+cg+ch+da+db+dc+dd+de+df+dg+dh+ea+eb+ec+ed+ee+ef+eg+eh+fa+fb+fc+fd+fe+ff+fg+fh+ga+gb+gc+gd+ge+gf+gg+gh+ha+hb+hc+hd+he+hf+hg+hh
<console>:10: error: implementation restricts functions to 22 parameters
```
mbed LPC1768 RawSerial送信のFIFO動作

RawSerialを使った送信が、ブロックしたりブロックしなかったり、振る舞いが良く分からないので、詳しく調べました。

#サンプルコードで実験

RawSerial.puts()で10バイトを送信した場合、

```cpp:main.c
#include "mbed.h"

RawSerial pc(p9, p10);
DigitalOut send(p11, 0);

int main() {
    while(1) {
		send.write(1);
		pc.puts("0123456789");
		send.write(0);
		wait(1);
    }
}
```

実際の送信を待つことなく、一瞬でRawSerial.puts()が完了します。約10usec.。

![20160117D.png](https://qiita-image-store.s3.amazonaws.com/0/109634/03e5949f-70c1-3ffd-5930-8a54893ac93f.png)

送信するデータを20バイトに増やしてみると、

```cpp:main.c
#include "mbed.h"

RawSerial pc(p9, p10);
DigitalOut send(p11, 0);

int main() {
    while(1) {
		send.write(1);
		pc.puts("0123456789abcdefghij");
		send.write(0);
		wait(1);
    }
}
```

'f'(16バイト目)を送信開始したところで、RawSerial.puts()が完了しました。

![20160117E.png](https://qiita-image-store.s3.amazonaws.com/0/109634/4dcbbf0a-b801-e7c0-1cd0-5a829fa88730.png)

#実験から推測
送信10バイトのときはブロックしなかった。FIFOが10バイト以上と思われます。
送信20バイトのときは16バイト目が送信開始したところでブロック解除されたので、FIFOが4バイトと思われます。
って矛盾しているし。

#LPC1768のスペック
今回、使っているピンはp9 = P0_0で、ペリフェラルはUART3です。

```cpp:PinNames.h
 p9 = P0_0,
```
```cpp:serial_api.c
 {P0_0, UART_3, 2},
```

UM10360 LPC176x/5x User manualによると、Transmit FIFOsは16バイトです。
![20160117F.png](https://qiita-image-store.s3.amazonaws.com/0/109634/389d6751-a2bb-057c-be89-32d157a8c100.png)

ということは、FIFOは16バイトのはず!?

#mbedライブラリのソースコード
mbedライブラリのソースコードを、RawSerial.puts()から調べます。

```cpp:RawSerial.cpp
int RawSerial::putc(int c) {
    return _base_putc(c);
}

int RawSerial::puts(const char *str) {
    while (*str)
        putc(*str ++);
    return 0;
}
```
```cpp:SerialBase.cpp
int SerialBase::_base_putc(int c) {
    serial_putc(&_serial, c);
    return c;
}
```
```cpp:serial_api.c
void serial_putc(serial_t *obj, int c) {
    while (!serial_writable(obj));
    obj->uart->THR = c;
    uart_data[obj->index].count++;
}

int serial_writable(serial_t *obj) {
    int isWritable = 1;
    if (NC != uart_data[obj->index].sw_cts.pin)
        isWritable = (gpio_read(&uart_data[obj->index].sw_cts) == 0) && (obj->uart->LSR & 0x40);  //If flow control: writable if CTS low + UART done
    else {
        if (obj->uart->LSR & 0x20)
            uart_data[obj->index].count = 0;
        else if (uart_data[obj->index].count >= 16)
            isWritable = 0;
    }
    return isWritable;
}
```

発見! serial_putc()とserial_writable()のコードがポイントでした。

- serial_putc()で、FIFOsに突っ込んだ後にcount加算。
- serial_writable()で、countが16以上の場合は書き込み不可扱い。Transmitter Holding Register Emptyが1ならば、count=0。

#まとめ
- RawSerialで送信する際は、FIFOに16バイトまで書き込める。それ以上はブロックされる。
- FIFOが実際に送信されてカラになれば、ブロック解除されて再度16バイトまで書き込みできる。

#おまけ
RawSerial.attach(TxIrq)のタイミングも調べました。

```cpp:main.c
#include "mbed.h"

RawSerial pc(p9, p10);
DigitalOut tx_isr(p11, 0);

void TxIsr() {
	tx_isr.write(1);
	wait_us(1);
	tx_isr.write(0);
}

int main() {
	pc.attach(TxIsr, RawSerial::TxIrq);
    while(1) {
		pc.puts("0123456789abcdefghij");
		wait_ms(30);
    }
}
```
![20160117G.png](https://qiita-image-store.s3.amazonaws.com/0/109634/329bd48b-cd18-22dd-f377-85f4f4502261.png)
aタグのlinkを無効に。

# リンクをjQueryで動的に無効にしたい。

例えば、２つのボタンがあって片方を押されたらもう片一方を無効にする。
もう一回押されたら無効を解除する。みたいな仕様のとき

btn1(off)      btn2(off)

↓ btn1をclick

btn1(on)      btn2(diabled)

↓ btn1をclick

btn1(off)    btn2(off)

このような仕様をcssとjQueryでさくっと作る。

## 方針

押されたボタンにbtn-onクラス
無効になったボタンにbtn-disabledクラス
をjQueryで追加する。(クラス名はbootstrapなど利用するライブラリと被らないように。)

## HTML
単純に、aタグボタンを２つ。
idをつけておく

```html:btn.html
<a href="javascript:void(0)" id="btn1" class="btn">btn1</a>
<a href="javascript:void(0)" id="btn2" class="btn">btn2</a>
```

## CSS

disabled(押せない状態)のリンクに以下のcssを適用する。

```css:btn.css
.btn {
  /* 適当にボタンっぽいレイアウトにする。 */
}

.btn-on {
  color: #f00; /* わかりやすく色を赤に。 */
}

.btn-disabled {
  pointer-events: none; /* aタグのリンクを無効にする */
  cursor: default;  /* マウスオーバー時のカーソルをdefaultに固定 */
  text-decoration: none;  /* 下線等を消す。 */
}

```

## jQuery
押されたボタンともう片方のボタンをjQueryオブジェクトで取得して,classをadd, removeする。
また、btn1が押された状態なのかbtn2が押された状態なのか、どちらも押されていない状態なのか状態を持っていないといけないので,,,今回はクロージャで実現する。
なにも押されていない状態をstate = 0, 何か押されている状態をstate = 1とする。

idをbtn1, btn2とすると

```js:btn.js

$(function() {
  var state = 0;
  var button_ids = ['btn1', 'btn2']
  var btn_change = function() {
    var clicked_id = $(this).attr('id');
    var clicked = $('#' + clicked_id);
    console.log(button_ids);

    // clickされたボタン以外を取り出す
    disabled_buttons = button_ids.filter(function(v){
      return v != clicked_id;
    });

    console.log(disabled_buttons);
    var another = $('#' + disabled_buttons[0]); /*   複数ボタンがある場合はforなどですべてのボタンを取得*/
    if (state == 0) {
      clicked.addClass('btn-on');
      another.addClass('btn-disabled');
      state = 1;
    } else if (state == 1) {
      clicked.removeClass('btn-on');
      another.removeClass('btn-disabled');
      state = 0;
    }
  }
  $('#btn1').on('click', btn_change);
  $('#btn2').on('click', btn_change);
});
```


*********

以上で一応動的にボタンの管理ができるはず。
ボタンが複数ある場合や、サーバー側でボタンの管理をしたい場合はボタンの状態管理を工夫する。
OVAファイルをVMXファイルに変換してParallelsで使えるようにするまで

VMwareのovftoolをダウンロードする。アカウント登録が必要。

https://my.vmware.com/group/vmware/get-download?downloadGroup=OVFTOOL352

ダウンロードしてインストールしたらコマンドラインからOVAファイルのパスと変換後のパスを指定して実行する。

```
/Applications/VMware\ OVF\ Tool/ovftool --lax origin.ova output.vmx
```

サイズによって結構時間が掛かった。と言ってもMBAで30分くらい。

そして最後に出来上がったvmxをParallelsに食わせればいい。

新規追加ではなく、メニュ＞ファイル＞開くで選択すると変換モードになり、変換後立ち上がる。

以上〜。
MonoBehaviourを継承したシングルトンの実装

ベースとなるシングルトンクラス

```SingletonMonoBehaviour.cs
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;

/// <summary>
/// MonoBehaviourを継承したシングルトン
/// </summary>
public class SingletonMonoBehaviour<T> : MonoBehaviour where T : MonoBehaviour {
	/// <summary>
	/// インスタンス
	/// </summary>
	private static volatile T instance;

	/// <summary>
	/// 同期オブジェクト
	/// </summary>
	private static object syncObj = new object (); 

	/// <summary>
	/// インスタンスのgetter/setter
	/// </summary>
	public static T Instance {
		get {
			// アプリ終了時に，再度インスタンスの呼び出しがある場合に，オブジェクトを生成することを防ぐ
			if(applicationIsQuitting) {
				return null;
			}
			// インスタンスがない場合に探す
			if(instance == null) {
				instance = FindObjectOfType<T>() as T;

				// 複数のインスタンスがあった場合
				if ( FindObjectsOfType<T>().Length > 1 ) {
					return instance;
				}

				// Findで見つからなかった場合、新しくオブジェクトを生成
				if (instance == null) {
					// 同時にインスタンス生成を呼ばないためにlockする
					lock (syncObj) { 
						GameObject singleton = new GameObject();
						// シングルトンオブジェクトだと分かりやすいように名前を設定
						singleton.name = typeof(T).ToString() + " (singleton)";
						instance = singleton.AddComponent<T>();
						// シーン変更時に破棄させない
						DontDestroyOnLoad(singleton);
					}
				}

			}
			return instance;
		}
		// インスタンスをnull化するときに使うのでprivateに
		private set {
			instance = value;
		}
	}

	/// <summary>
	/// アプリが終了しているかどうか
	/// </summary>
	static bool applicationIsQuitting = false;

	void OnApplicationQuit() {
		applicationIsQuitting = true;
	}

	void OnDestroy () {
		Instance = null;
	}

	// コンストラクタをprotectedにすることでインスタンスを生成出来なくする
	protected SingletonMonoBehaviour () {}
}
```

このシングルトンを継承するクラスはこんな感じにする

```scoreManager.cs
using UnityEngine;
using System.Collections;
public class ScoreManager : SingletonMonoBehaviour<ScoreManager> {
	public int score;
	public void AddScore(int point) {
		score += point;
	}
}
```

使うときはこんな感じ

```Test.cs
using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {
	void Start () {
		Debug.Log(ScoreManager.Instance.score);
		ScoreManager.Instance.AddScore(100);
		Debug.Log(ScoreManager.Instance.score);
	}
}
```
Railsにbootstrap-colorpickerを導入


### 参考
+ [Bootstrap Colorpicker 2.3](https://mjolnic.com/bootstrap-colorpicker/)
+ [Rails4ではbackground_url(_assets_hoge.png_)の書き方は動かない話 - Qiita](http://qiita.com/wadako111/items/03bc00d914e62243a511)
+ [JavaScript - 背景色によって、字を白と黒どちらにするか判定 - Qiita](http://qiita.com/t_fujise/items/3346a54854bf3b1f5537)


2年ぐらい前に似たようなことやったのに覚えてなかったので今後のため


手順
------------------------
### 公式からDL
gemから入れれるのもあるがメンテされてないっぽい。compassは自分は親しくないので
[bootstrap-colorpicker](https://mjolnic.com/bootstrap-colorpicker/)からzipをDL。

+ bootstrap-colorpicker.min.css
+ bootstrap-colorpicker.min.js
+ imgもろもろ

をvendorの中に入れる

### application.css, application.js に追記
```application.css
*= require bootstrap-colorpicker.min
```

```application.js
//= require bootstrap-colorpicker.min
```

### bootstrap-colorpicker.min.cssの画像参照先を変更
```css
background-image:url("../img/bootstrap-colorpicker/saturation.png")
```

みたいになってるところを

```scss
background-image:image-url("saturation.png")
```

にする。
拡張子 `.css` を `.scss.css` に変更(*これをしないと `image-url()` が解釈されない)


### _form.html.erb
カラーピッカーをよびたいところを以下のようにする

```erb
<%= f.text_field :color, class:'colorpicker' %>
```

### 呼び出すためのJSを書く。
```app/assets/javascripts/colorpicker.js
var colorpicker = {
  init: function(){
    $("input[type='text'].colorpicker").colorpicker()
      .on('changeColor.colorpicker', function(event){
        var bgColor = event.color.toHex();
        if ($(event.target).val() == '') { bgColor = 'white'; }

        $(event.target)
          .css('background-color', bgColor)
          .css('color', colorpicker.colorOnRGB(event.color.toRGB()));
      });
  },

  colorOnRGB: function(rgb) {
    var
      red   = rgb.r,
      green = rgb.g,
      blue  = rgb.b;

    var color = 'black';
    if ((red * 0.299 + green * 0.587 + blue * 0.114) < 186) {
      color = 'white';
    }
    return color;
  }
}

$(function(){ colorpicker.init() });
```

最終的にこうなる

![スクリーンショット 2016-01-17 17.07.25.png](https://qiita-image-store.s3.amazonaws.com/0/3914/5723ad14-d471-f142-a1a3-d90672b63ea1.png)

![スクリーンショット 2016-01-17 17.25.56.png](https://qiita-image-store.s3.amazonaws.com/0/3914/55f3d35a-dff7-1cf6-2957-e481359986d7.png)
c言語の配列へのポインタ改良版

[前回の投稿](http://qiita.com/chesscommands/items/2cafa1ce8eb8412f7a45 "C言語のポインタ")で「charの配列へのポインタに代入」した値を表示させた時に,意図しない結果になった.
投稿した数十分後に回答を得られた.自分で解決したわけでは無くて[long_long_float](http://qiita.com/long_long_float)さんに[コメント](http://qiita.com/chesscommands/items/2cafa1ce8eb8412f7a45#comment-01851c37576e638f6e0e)を付けてもらえたため正しい表示ができました.
ありがとうございます.

早速ソースコードと結果を載せます.

#intの配列へのポインタ

```c
#include <stdio.h>

int main(void){
	int itmp[3] = {1, 2, 3};
	int (*p3tmp)[3];

	p3tmp = &itmp;
	printf("p3tmp[%d][%d][%d]\n", *p3tmp[0], *p3tmp[1], *p3tmp[2] );
	printf("p3tmp[%d][%d][%d]\n", *(p3tmp[0]), *(p3tmp[1]), *(p3tmp[2]) );
	printf("p3tmp[%d][%d][%d]\n", (*p3tmp)[0], (*p3tmp)[1], (*p3tmp)[2] );
	printf("p3tmp[%d][%d][%d]\n", p3tmp[0][0], p3tmp[0][1], p3tmp[0][2] );

	return 0;
}
```

![スクリーンショット 2016-01-17 15.16.22.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/01264f2e-02a9-a19b-0690-1ac67854e921.jpeg "スクリーンショット 2016-01-17 15.16.22.jpg")

指摘通り`*p3tmp[0]`と`*(p3tmp[0])`は同じ表示内容になりました.
そして訂正後は代入した内容と同じ内容が表示されました^^
コメントは`(*p3tmp)[x]`にすれば意図した内容が表示されるとのことで表示に成功しました.

#ポインタの配列

```c
#include <stdio.h>

int main(void){
	char *ptmp[] = {
					"hello",
					"World",
					"hello World"
				};
	char **phoge;

	printf("ptmp[0]\t⇒\t[%s]\n", ptmp[0] );
	printf("ptmp[1]\t⇒\t[%s]\n", ptmp[1] );
	printf("ptmp[2]\t⇒\t[%s]\n", ptmp[2] );
	printf("-----------------------------\n");
	phoge = ptmp;
	printf("phoge[0]\t⇒\t[%s]\n", phoge[0] );
	printf("phoge[1]\t⇒\t[%s]\n", phoge[1] );
	printf("phoge[2]\t⇒\t[%s]\n", phoge[2] );
	printf("-----------------------------\n");

	return 0;
}
```

※ソースコードに色が付かないorz

文字列を配列にいくつも格納し,メッセージ出力するときに活用する.
メッセージが固定されている場合に有効な技だと思っている.

個人的に`*ptmp[]`は多次元配列だと思っているのだが,宣言すら失敗してしまう.
`データ型 配列名[要素数1][要素数2];`
要素数がわからないため空にした状態で宣言するから失敗するのだが・・・.
2次元配列を宣言して代入しようとしても失敗する.

```c
	char pptmp1[3][1];
	char *pptmp2[3];
	pptmp1 = ptmp;
	pptmp2 = ptmp;
```

```コンソール表示
error: array type 'char [3][1]' is not assignable
        pptmp1 = ptmp;
        ~~~~~~ ^
error: array type 'char *[3]' is not assignable
        pptmp2 = ptmp;
        ~~~~~~ ^
```

残念だが`char **phoge;`の宣言をして代入できたため問題ないと判断する.


#参考サイト

* [4.3ポインタ配列](http://cai.cs.shinshu-u.ac.jp/sugsi/Lecture/c/e_04-03.html "c言語")
* [１０－４．ポインタのポインタ](http://www9.plala.or.jp/sgwr-t/c/sec10-4.html "初心者のためのポイント学習Ｃ言語")

#余談
[汎用ポインタ](http://wisdom.sakura.ne.jp/programming/c/c47.html)なるものがあるようだが,また後日だな^^

来月から違う現場だな.
現場が変わるのは派遣社員の悩みどころだな^^