OmniAICreator/Qiita-1.07M huggingface dataset:
カンマ区切りのセルの中身をソートし直して返すSQL

# カンマ区切りのセルの中身をソートし直して返すSQL

- カンマ区切りデータを1カラムに持つことの是非はともかく、事実としてデータが存在する
- カンマ区切りのセルの中身をソートした状態でレコードを取得したい

## 実行前データ
```
-------------------------------------
id         |  comma_column
-------------------------------------
1          |  linux,apple,windows
-------------------------------------
2          |  yamada,tanaka,aso
-------------------------------------

```

```
SELECT
     main.id,
     -- 文字列で返す
     array_to_string(
          -- 配列に閉じ込めて
          ARRAY(
               SELECT 
                    -- カンマ区切りをレコードに変換
                    regexp_split_to_table(comma_column,',') as sort
               FROM
                    tableA as sub
               WHERE
                    main.id = sub.id
               ORDER BY 
                    --カンマ区切りでソート
                    regexp_split_to_table(comma_column,',')
          ) ,','
     )as hoge
FROM TableA as main
ORDER BY main.id
```
## SELECTデータ
```
-------------------------------------
id         |  comma_column
-------------------------------------
1          |  apple,linux,windows
-------------------------------------
2          |  aso,tanaka,yamada
-------------------------------------

```
１対多 関係から多の結果を1レコード別カラムに返すSQL（上限有り前提）

# １対多 関係から多の結果を1レコード別カラムに返すSQL（上限有り前提）

- select結果を普通縦にレコードが伸びますが横に伸ばしたいときに利用できます。
- crosstabとか利用するのが面倒なときにエイヤッと書けます。

## テーブル例
- １：membersテーブル
- 多：member_hobbies テーブル
- 1人が複数の趣味を持っている

![説明](/system/media/files/000/000/220/original/teble.png?1414644267)

- 普通にJOINすると右表のように返ってくる
![説明](/system/media/files/000/000/222/original/%E5%9B%B31.png?1414644879)
## 返したい結果表
- 一人ごとに複数有る趣味を横に伸ばして返したい
![説明](/system/media/files/000/000/221/original/kekka2.png?1414644268)

## SQL　（どちらも同じ結果が返ります）

### シンプルSQL
- 伸ばしたいカラム数分、SELECT句に副問合せを記述

```
select
( SELECT member_hobbies.name
           FROM member_hobbies
          WHERE member_hobbies.fda_member_id = fda_members.id
     ORDER BY member_hobbies.id
         OFFSET 0
         LIMIT 1 ) AS hobby_1,
( SELECT member_hobbies.name
           FROM member_hobbies
          WHERE member_hobbies.fda_member_id = fda_members.id
     ORDER BY member_hobbies.id
         OFFSET 1
         LIMIT 1) AS hobby_2,
( SELECT member_hobbies.name
           FROM member_hobbies
          WHERE member_hobbies.fda_member_id = fda_members.id
     ORDER BY member_hobbies.id
         OFFSET 2
         LIMIT 1) AS hobby_3,
( SELECT member_hobbies.name
           FROM member_hobbies
          WHERE member_hobbies.fda_member_id = fda_members.id
     ORDER BY member_hobbies.id
         OFFSET 3
         LIMIT 1) AS hobby_4,
     *
FROM
     members


```


### 配列利用SQL
- FROM句にて副問合せで、人ごとに趣味を配列化して保持する
- 伸ばしたいカラム数分、SELECT句に配列を指定する

```
--SQLがすっきりする。
--副問合せが一回で済み速度も速くなる可能性有り
--WHERE句が書きやすい
--SELECT句に指定が必要
select    
     hobby[1] as hobby1,
     hobby[2] as hobby2,
     hobby[3] as hobby3,
     hobby[4] as hobby4,
     hoge.*
FROM
     (
     select
          *,
          (
               select ARRAY ( select name FROM member_hobbies where fda_member_id = members.id ORDER BY id)
          ) as hobby
     FROM
          members
     ) as hoge

```
DjangoでHTTPのレスポンスとしてファイルの内容を返す

Djangoでファイルの内容を結果として返したい場合がある。よく見かけるサンプルでは`f`をfile-likeオブジェクトとして

```py3
res = HttpResponse(f.read(), content_type="text/csv")
```

などとしているのを見かけるが、これはファイル全体を一度に読み込むため (メモリ) 効率が悪い。`HttpResponse`の第1引数はイテレータでもOKなため、これは単純に

```py3
res = HttpResponse(f, content_type="text/csv")
```

とすればよい。
PostgreSQL  TEMPORARY TABLEの実用例 (Glue SQL)

# PostgreSQL  TEMPORARY TABLEの実用例 (Glue SQL)

```
TableAとTableBでそれぞれデータが入っており、
TableA id=1　と　TableB id=4
TableA id=2　と　TableB id=5
TableA id=3　と　TableB id=6
　　　　　　　　・
　　　　　　　　・
　　　　　　　　・
のデータをそれぞれ結合して集計したい
```
みたいなわがまま仕様に対応する時のSQL

イメージとしては
```
TableA   ＜JOIN＞ tempテーブル　＜JOIN＞ TableB
```

みたいな感じ


```
-- テンポラリテーブルを作成
-- 対応表としてのデータを入れる
CREATE TEMPORARY TABLE hoge As SELECT 
	*
FROM  
	(VALUES
		(1, 4), 
		(2, 5),
		(3, 6)
	) AS t (id, cid);


-- 同一トランザクション内なら、テンポラリテーブルにインサートも可能
INSERT INTO hoge values (100,200);


-- TMPテーブルを後付のHBTMテーブルみたいに使えます
SELECT
	*
FROM
	-- テーブルA
	tableA
LEFT OUTER JOIN 
	-- Temporaryテーブル
	hoge 
ON (hoge.id = users.id)
LEFT OUTER JOIN 
	-- テーブルB
	tableB
ON (hoge.id = tableB.id)
ORDER BY
 	hoge.id;
```
PostgreSQL　INSERT／UPDATE／DELETE　結果の行を１SQLで取得

# PostgreSQL　INSERT／UPDATE／DELETE　結果の行を１SQLで取得

INSERT／UPDATE／DELETE後に、更新結果を取得するには

再度SELECTでid指定で更新結果データを取得しているかと思いますが、

PostgreSQL8.2から、おまじないを書くことでINSERT／UPDATE／DELETE文だけで更新結果を取得できます。

末尾に``` returning * ```を追加するだけ


```
UPDATE users set loginid = 'admin' where id = 1 returning *
```

SQLを実行する回数が減るので、場合によっては動作が早くなるかもですね
Visual Studio Communityを受託開発で使うのは要注意

要約：大企業から開発委託された案件でもCommunity使えないっぽい。

# まえがき

他人の書いた文章を鵜呑みにせず、必要ならMSに問い合わせてくださいね。

- 2015/11/24 VSC2015がRTMになってたりEULA公開されてたりしたので全面的に改訂。オチは変わってないです。

## 併せて読みたい

[Visual Studio Community 2013のライセンス条項にみる利用可能ユーザについて - 新・日々録 by TRASH BOX@Eel](http://d.hatena.ne.jp/eel3/20141121/1416581499)

# EULAを読む

日本語版 https://www.visualstudio.com/ja-jp/mt171547.aspx
英語版 https://www.visualstudio.com/en-us/mt171547.aspx

> お客様がエンタープライズである場合、お客様の従業員および契約社員は本ソフトウェアを使用して、お客様のアプリケーションを開発またはテストすることはできません。ただし、上記で許可されているオープンソースおよび教育目的の場合を除きます。「エンタープライズ」とは、合計で (a) 250 台を超える PC がある、もしくは 250 人を超えるユーザーがいる、または (b) 年間収益が 100 万米ドル (もしくは他の通貨での相当額) を超える、組織およびその関連会社のことです。「関連会社」とは、組織を (過半数所有により) 支配している法人、組織が支配している法人、または組織と共通の支配下にある法人を意味します。

過半数所有ってグループ会社とかそういう・・・？？？

# ライセンスホワイトペーパーを読む

日本語版 http://www.microsoft.com/ja-jp/download/details.aspx?id=13350
英語版 http://www.microsoft.com/en-US/download/details.aspx?id=13350

> エンタープライズではない組織において 5 ユーザーまでは Visual Studio Community を利用できます。エンタープライズ組織（ PC 台数 250台以上または年商 100 万ドル以上）は上記の教室の研修環境、学術的調査、オープン ソース プロジェクトへの貢献以外では従業員や請負契約者ともに利用を認められません。

> 例 2: Fortune 500 のある企業は、店舗地図モバイル アプリケーションの開発を小さな企業に委託している。このアプリケーションは、オープン ソース プロジェクトではない。この小さな企業は 5 名がこのプロジェクトに就業しており、Visual Studio Community 2013を利用したい。この小さな企業は Fortune 500 企業のアプリケーションの開発受託者であり、かつ、このアプリケーションはオープン ソース プロジェクトではないため、この小さな企業は Visual Studio Community 2013 をアプリケーションの開発やテストに利用することができない。

例がクリーンヒットしてますね。

# まとめ

結局仕事に使うなら製品版買うのが安心っていういつものパターン。

個人なのか個人事業主なのか法人なのか非営利団体なのか・・・なんてことはどうでもよくて、でかい金儲け（やそれに加担するの）に使うなら製品版買えよっていう感じのような気がします。憶測ですが。
[Spider]新しい?AltJS「Spider」でHelloWorldを動かしてみる


## Spiderとは？


Spiderは、AltJSと呼ばれる言語のひとつです。

AltJSは、コンパイルするとJavascriptに変換されるものです。

ここではテーマとそれるため言及しませんが、
詳しく知りたい方は検索してみてください。


### Spider公式ドキュメント

 http://spiderlang.org/

> Spider is a programming language that compiles to JavaScript. It takes the best ideas of Swift, Python, C# and CoffeeScript.
 
 
Spiderは、SwiftやPython, C#, CoffeeScriptなどを参考に
開発されたそうです。


では、さっそくインストールしてみましょう！


## Spiderのインストール


インストールはnpmですぐにできます。簡単ですね。

```
npm install -g spider-script
```

Spiderをコマンドラインから実行するには
下記のコマンドを実行します。

ファイルの拡張子は「.spider」です。


```
spider /path/to/script.spider
```

Javascriptに変換する時はこちら。

```
spider -c /path/to/script.spider
```

> The compiler will generate the output JavaScript file and a source map file for debugging. Note that the original spider file and the source map file aren't necessary for production.

Spiderのコンパイラーは、
Javascriptとソースマップファイルを出力してくれますが、

生成物はJavascriptファイルだけ動きます。

.spiderファイルやソースマップファイルは
プロダクトに必要なものではないということです。


## spiderでHello Worldを動かす

では、Hello Worldを作っていきます。


まずは animal.spiderファイルを作成し、
そのなかに、Animalクラスを作ります。

（ func で定義するが、クラスのような扱い方をする ）


また、メンバ関数は「this.~」で定義できます。

```
func Animal(name) {

  this.hello = func () {
  
    ::console.log('Hello everyone! My name is \(name) ');
    
  };
  
}
```

※ここのconsole.logについている「::」は、
グローバルスコープに出力することを示しています。
  
***

作ったクラスは、「extends」で拡張できます。

Animalを拡張して、Cat、Dogを作成しましょう。

親のAnimalクラスの関数を呼ぶには、「super.~」を使います。

```
func Cat(name) extends Animal(name) {

  this.hello = func () {
    super.hello(name);
  };
  
}

func Dog(name) extends Animal(name) {

  this.hello = func () {
    super.hello(name);
  };
  
}
```

***


次は、作ったCat, Dogを実行する命令です。

こちらは一般的な書き方ができますね！

```
var cat = new Cat('Kitty');
var dog = new Dog('Shiba');

cat.hello();
dog.hello();

```


### 作ったファイルを実行する

コンソール上で実行するには、下記のコマンドをたたきます。

```
spider animal.spider
```

すると、console.log() が実行されて文字が出力されるはずです。

```
Hello everyone! My name is Kitty 
Hello everyone! My name is Shiba 
```

***


なお、.jsファイルに変換する方法は -c　をつけて実行するだけです。


```
spider -c animal.spider
```
***


いかがでしたでしょうか。

まだまだ、ドキュメントがありませんし、
上手く動かない部分もあるようですが、

これから、どんどん改善されていくことを期待します！


## 今回つくったものまとめ


```animal.spider
func Animal(name) {
  this.hello = func () {
    ::console.log('Hello everyone! My name is \(name) ');
  };
}

func Cat(name) extends Animal(name) {

  this.hello = func () {
    super.hello(name);
  };
}

func Dog(name) extends Animal(name) {

  this.hello = func () {
    super.hello(name);
  };
}


var cat = new Cat('Kitty');
var dog = new Dog('Shiba');

cat.hello();
dog.hello();
```
有名な会社のOSS まとめ

まだ途中

# Microsoft #
| 名前 | ソース | 備考 |
|:----|:-------|:-----|
| .NET Core | [GitHub](https://github.com/dotnet/corefx) |  |
| .NET Reference Source | [GitHub](https://github.com/Microsoft/referencesource) |  |
| TypeScript | [GitHub](https://github.com/Microsoft/TypeScript) |  |


# Google #
* [Dart](https://code.google.com/p/dart/)
* [Mozc](https://code.google.com/p/mozc/)
* [Blink](http://www.chromium.org/blink)


# Twitter #
* [util](https://github.com/twitter/util)
* [Effective Scala](https://github.com/twitter/effectivescala)
* [finagle](https://github.com/twitter/finagle)
* [Hogan.js](https://github.com/twitter/hogan.js)

# Facebook #
* [HHVM](https://github.com/facebook/hhvm)
* [React](https://github.com/facebook/react)
* [Folly](https://github.com/facebook/folly)


# Mozilla #
* [Servo](https://github.com/servo/servo)
*
Laravelはじめました（インストール編）

Laravelはじめました
=======

Mac（OS X Mavericks 10.9.4）にLaravel4をインストールしてみました。

インストール手順
--------

基本的にはココ↓を参考にすると出来ます。とても分かりやすいです。
http://www.monster-dive.com/blog/web_system/20140328_001128.php

僕の環境ではうまく出来なかったので、頭の整理も兼ねて以下に手順をまとめます。
（VH等の設定は済んでいる前提です。）

### ①プロジェクトのトップディレクトリに移動

ディレクトリは適宜変更してください。
以下の操作は全てこのパスから行ってください。

```
$ cd /hoge/project/workspace/laravel
```

### ②Composerのインストール

```
$ curl -sS https://getcomposer.org/installer | php
```

### ③mcryptのインストール

僕の環境では④を実行すると、mcryptがない！というエラーが出たので、ない場合はインストールする。

```
$ brew install php54-mcrypt
$ php -m | grep mcrypt
mcrypt
```

### ④Laravel4のインストール

プロジェクト名"sample"は適宜変更してください。

```
$ composer create-project laravel/laravel sample --prefer-dist
```

### ⑤設定ファイルの変更

**app/config/app.php**

参考サイトでは"key"も変更していましたが、ひとまず変更しなくても動きました。

```
// URL設定
'url' => 'http://www.hoge.com/',
 
// ロケール設定
'locale' => 'ja',
```

**app/config/database.php**

MySQLを使う場合

```
'mysql' => array(
    'driver'    => 'mysql',
    'host'      => 'localhost',
    'database'  => 'DBname', // DB名
    'username'  => 'username', // ユーザ名
    'password'  => 'password', // パスワード
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => ''
),
```

### ⑥パーミッションの変更

キャッシュ用のディレクトリのパーミッションを変更します。
（Cakeで言うtmpフォルダ）

```
$ chmod -R 777 app/storage
```

### ⑦AllowOverrideの設定変更

このままアクセスするとInternal Server Errorが出るので、httpd.confか対象VHのAllowOverrideに以下の設定をする。

```
AllowOverride AuthConfig FileInfo Indexes Limit Options=All,MultiViews
```


**再度アクセスして、"You have arrived"が表示されればOK！**


参考URL
--------
最新鋭のPHPフレームワーク「Laravel4」でWeb開発 | (1)導入編：
http://www.monster-dive.com/blog/web_system/20140328_001128.php
macosxのphpにmcryptをインストール：
http://qiita.com/MasatoYoshioka@github/items/1b4de4249dc40ff1d902
Apache の .htaccess で Multiviews オプションを使えるようにする：
http://d.hatena.ne.jp/ymd_mkhk/20110721/1311255903
sudoedit で vim を拡張付きで使う

どこかでも見た気がしますが `export EDITOR=vim` し、 `sudoedit` で適当なファイルを開くと動いてるのわかると思います。

`.profile` / `.bashrc` / `.zshrc` あたりで `export EDITOR=vim` したりとか良いのではないでしょうか。 (僕はこうしてる)

参考: [sudoedit(8) - Linux man page](http://linux.die.net/man/8/sudoedit)
Intel Edisonにntpdateコマンドをインストールする

Intel Edisonにネットワーク時刻合わせのコマンドである`ntpdate`コマンドをインストールするメモ。

# 環境

使用した環境は以下の通りです。

```
root# uname -a
Linux nayutaya-edison-001 3.10.17-poky-edison+ #1 SMP PREEMPT Tue Oct 14 15:19:49 CEST 2014 i686 GNU/Linux
root# cat /etc/version
edison-rel1-maint-weekly_build_16_2014-10-14_14-56-19
```

# opkgリポジトリ

opkgリポジトリを設定します。`/etc/opkg/base-feeds.conf`ファイルの内容は以下の通り。

```
root# vi /etc/opkg/base-feeds.conf
root# cat /etc/opkg/base-feeds.conf
src/gz all http://repo.opkg.net/edison/repo/all
src/gz edison http://repo.opkg.net/edison/repo/edison
src/gz core2-32 http://repo.opkg.net/edison/repo/core2-32
```

# ntpdateコマンドをインストール

`opkg`コマンドを使って`ntpdate`コマンドをインストールします。

```
root# opkg update
root# opkg install ntpdate
```

# おまけ: ntpdateコマンドを使って時刻を同期

NTPサーバ`ntp.nict.jp`を使って時刻を同期する例：

```
root# ntpdate -v ntp.nict.jp
```
elasticsearch-knapsack pluginインストール


* ローカルファイルからのインストール手順です。
* knapsack plugin Ver2.1.5前提です。

## 事前準備
1\. 下記URLからzipをDLする。

[http://dl.bintray.com/jprante/elasticsearch-plugins/org/xbib/elasticsearch/plugin/elasticsearch-knapsack/2.1.5/elasticsearch-knapsack-2.1.5.zip]

## インストール作業
1\. DLしたzipをelasticsearchサーバの/tmpにULする。

2\. 下記コマンドを実行する。

```
# /usr/share/elasticsearch/bin/plugin --install knapsack --url file:///tmp/elasticsearch-knapsack-2.1.5.zip
```

3\. 出力結果に下記が表示される事を確認する。

```
Installed knapsack into /usr/share/elasticsearch/plugins/knapsack
```

おわり
Cocos2d-x v2.2.5 のCCHttpRequestのレスポンスにNULL終端文字が付加されない問題


今更だけどCocos2d-x v2.2.5のCCHttpRequest::getResponseData()でレスポンスを受け取り、JSONに解析するコードを書いてたんだけど、JSON文字列の末尾に変な文字列が付加されてしまう。これは前述のメソッドがレスポンスボディ終端にNULL文字を付加しないためらしい。


```
void HelloWorld::sendReqeust()
{
    std::string url = "http://example.com/path/to/api";
    
    CCHttpRequest *request = new CCHttpRequest();
    request->setUrl(url.c_str());
    request->setRequestType(CCHttpRequest::kHttpGet);
    request->setResponseCallback(this, httpresponse_selector(HellowWorld::requestHandler));
    
    CCHttpClient *client = CCHttpClient::getInstance();
    client->send(request);
    request->release();
}

void HelloWorld::requestHandler(CCHttpClient *sender, CCHttpResponse *response)
{
    int responseCode = response->getResponseCode();
    if ( responseCode != 200 )
    {
        CCLOG("Request Error: Code: %d", responseCode);
        return;
    }

    // レスポンス取得
    std::vector<char> *buffer = response->getResponseData();
    
    // 手動で終端NULL文字を追加するとうまくいく（これはつらい）
    buffer->push_back('\0');
    
    CCLOG("Response string: %s", &(*buffer)[0]);
    
    // parse json
    rapidjson::Document json;
    json<rapidjson::kParseDefaultFlags>(&(*buffer)[0]);
    if ( settings.HasParseError() )
    {
        CCLOG("JSON Parse Error");
        return;
    }

    ….
}
```

3系では起こらないみたいだけど、何かの役に立つかもしれないのでメモ。

#### 追記と理由

終端文字列を付加しないのは、画像のレスポンスを考慮してのことかもしれない、らしい。
なのでこれはこれで正しい実装なのかもしれない

または、

```
std::string(buffer->begin(), buffer->end());
```

とすればうまくいくみたい。
Xcode6でiOSライブラリのロジックテストを行うときの注意点

XcodeでUnit Testを実行するには、iOSデバイスで実行するアプリケーションテストと、mac上でそのまま実行するロジックテストの二種類がある。

スタティックライブラリを対象にしてロジックテストを行う場合は次のようにする。

1. Targetを追加する

「File→New→Target→OS X→Other→Cocoa Testing Bundle」でNext。
「Target to be Tested」を「None」にする。


ここで「Target to be Tested」でライブラリを選択してしまうと、ライブラリ自体はiOSデバイス用にしかコンパイルされないため、
<pre>
ld: library not found for -l(ライブラリ)
</pre>
というエラーが発生する。

その場合は、「Build Phases→Link Binary With Libraries」からライブラリを削除する。

2. テストコードを追加する

「(プロジェクト名)_Test.m」というファイルが追加されているので、そこに「test〜」というファンクションを追加していく。
または.mファイルを追加して、XCTestCaseを継承していく。

テストしたいモジュールの.mファイルを「Build Phases→Compile Sources」より追加して、コンパイル対象とする。
この*.mモジュール単位でリンクを行い、実行していく形になる。

対象モジュールがkeychainやstorekieを使っている場合は、それらのモジュールでエラーが出る場合があるので、そのときはSecurity.frameworkやStorekit.frameworkなどを「Link Binary With Libraries」に追加していく。
SDAccel：FPGAを利用したFPGA経験不要なアクセラレーション

- OpenCL、C、C++、カーネルを混在させて扱える
- FPGA設計経験がなくても使えるらしい
- 異なるFPGAに簡単に移行できるらしい

スマホにも自由に使えるFPGAが積まれないかな？


 http://forums.xilinx.com/t5/Xcell-Daily-Blog/bg-p/Xcell

----
(雑訳)

OpenCL, C, C++向けのCPU/GPUライクなソフトウエア開発環境が、ワットあたり２５倍の性能向上を図れるFPGAベースのアプリを提供

by Xilinx Employee sleibso on 11-17-2014 06:57 AM

新しいXilinxのSDAccel 開発環境は、データセンター向け開発者に、ソフトウエアのみで定義されたCPU/GPUでの開発と同様の環境で、消費電力あたり性能を２５倍向上させる完璧なFPGAベースのアプリケーションアクセラレータを提供します。

SDAccelは、以下を含みます。

* FPGAリソースを効率的に利用できる高速で、賢い最適化コンパイラ
* コード開発、プロファイリング、デバッグ向けにEclipse IDEによる、CPU/GPU環境の開発と同様のなじみ深いソフトウエア開発フロー
* 異なるデータセンターアプリケーション向けに最適化される、オンザフライで交換可能な動的再構成アクセラレータ

アプリケーションは、サーバCPUとFPGAとのやりとりを中断させることなく、FPGA上で動作中に交換される複数のカーネルを持つことができるため、ノンストップのアプリケーションアクセラレーションが可能になります。
 
 ![alt](http://forums.xilinx.com/t5/image/serverpage/image-id/19465iEBEEB32AC2E6A5DA/image-size/original?v=mpbl-1&px=-1)
 
SDAccelコンパイラは、 OpenCL, C, C++, カーネル、高性能Xilinx FPGAを組み合わせを使ったソースコードをサポートします。

SDAccelコンパイラは、ハイエンドCPUを10倍凌駕する性能と、GPUに比べて1/10の消費電力を提供する一方、コンパチビリティを保ったコード管理と、従来同様のソフトウエアプログラミングモデルによって、容易なアプリケーションマイグレーションとコスト節約が可能になります。

パートナーによるベンチマークに基づくと、SDAccelコンパイラは、競合するFPGA環境に対して３倍の性能・リソース効率を提供します。

SDAccelコンパイラによる自動生成されたデザインは、手で書いたRTLベースのデザインより良い性能（いくつかのケースでは20%良い）を提供します。

開発者はアプリケーションの最適化になじみ深い作業フローを使うことができ、
ほんの少しまたは全くFPGAの経験がなくてもFPGA環境を活用することができます。

IDEは、コードテンプレートとSWライブラリを用意し,さらに、コンパイル、デバッグ、プロファイリング、x86プラットフォーム上でのFPGAエミュレーションを可能にします。

開発開始時には、自動のインスツルメンテーション挿入を備えたデータセンター向け民生用FPGA上にアルゴリズムを実装します。

データセンター向けアクセラレーションボードは、Convey Computer, Alpha Data Parallel Systems, and Pico Computingの各社からリリースされています。更なるCOTSパートナーは、2015年の速いうちに追加される予定です。

SDAccelライブラリは、高性能、低消費電力実装のためのOpenCL plus DSP, ビデオ、線形代数ライブラリを含んでいます。

XilinxアライアンスメンバーのAuviz Systems社は、最適化された、ドメイン特化型OpenCVとSDAccel向けBLASライブラリを提供しています。
 
アプリケーション開発者は、機能性を確認可能なx86エミュレーション空間のみで、SDAccelを使い始めることができます。

アルゴリズムに確信が持てたら、アクセラレーションが効くコード領域を探すためにプロファイリングすることができます。

そして、開発者は、これらの最適化対象領域を取り出し、高速な、自動生成されたカーネル（ハードウエアアクセラレーションをデバッグ、最適化するため）のサイクルベースシミュレーションをシームレスに使うことができます。

これら最初の２つのフェーズの間は、FPGAを必要としません。
アプリケーションは、ホスト/FPGAシステムへのポートの準備ができています。

SDAccel開発環境は、これらの活動のすべてを単一のプログラマフレンドリなコックピットを提供します。

SDAccelは、リアルタイムなCPU/GPU風システムの実行時更新が可能な、唯一のFPGAベース動的再構成アクセラレータを提供します。

FPGAベースのハードウエアアクセラレーションによる方法に特有ですが、
SDAccelは、カーネルが新たなハードウエアアクセラレータカーネルをロードできるFPGAベース動的再構成機能（CPU/GPUアクセラレータの機能と同様）でアップデートしている間も、システム機能を保ちます。
その一方、クリティカルシステムのインタフェースと機能、例えば、メモリ、イーサネット、PCIe、パフォーマンスモニタは動作させ続けます。

このオンザフライのシステム再構成は、データセンターにおける計算の需要と負荷に応じた即時アップデートに理想的です。

この機能が戦略的な利点をもたらすアプリケーションの例として、画像検索、ビデオ変換、画像処理をオンザフライで切り替えることが挙げられます。

このすべてが、ハードウエア再利用を通して、リソース最適化につながります。
このことは、データセンター環境では非常な利点となります。

簡単にいえば、SDAccelベースのシステムは、今日の時点ではあるアプリケーションをアクセラレートすることができ、明日他のタイプのアクセラレーションが必要になれば、システムは素早く、かつスムーズにアップグレードできます。
Swiftでデリゲートによる画面間での値の受け渡し

以前作成したのObjective-CのプロジェクトをSwiftに書き直していたらdelegateによる画面間の値の受け渡し部分の書き方が若干異なったので修正をメモ。

基本的にはObjective-Cと同様です。


#目的#
StoryBoardで作成した画面Aと画面Bでのシンプルな値のやりとり。
ここでは、値を送る画面のクラスをSenderViewController、値を受け取る画面をReceiverViewControllerとし、NSString型のmessageを送っています。


![storyb.png](https://qiita-image-store.s3.amazonaws.com/0/57702/d5bf9af7-0694-76d5-a93c-fecb237eabbc.png)

*左：受け取る画面,右:送る画面　をsegueで接続*





###値を送る画面クラス###

まずは値を送る画面です。
値をやりとりするためのデリゲートとデリゲートメソッドを使用を先に宣言します。
ここでは、メッセージを受信するreceiveMessage()とoptinalReceiveMessage()を作成しました。
前者のメソッドは、受け取る側で必ず実装しないといけないメソッドであり実装しないとエラーとなります。
一方後者のoptinalなメソッドの実装は任意となり実装しなくても構いません。

senderViewControllerは単純なクラスでsendeMessage()を利用し、それぞれメッセージを送っています。

```swift:SenderViewController.swift

//protocolを定義
//値を渡すために使うメソッドを宣言します
@objc protocol senderDelegate{
    func receiveMessage(message:NSString)
    optional func optinalReceiveMessage(message:NSString)
}

class SenderViewController: UIViewController{
    weak var delegate :SenderDelegate?
    let message = "you got a message"
    let optMessage = "you got a optinal message"

    func sendMessage(sender: AnyObject) {
        delegate?.receiveMessage(message)
        delegate?.optionalReceiveMessage!(optMessage)
    }
}
```


###値を受け取る画面クラス###
画面を受け取る画面では、SenderViewControllerクラスを作成したSenderDelegateを宣言しています。
また、prepareForSegueを画面遷移時にインスタンスを生成しデリゲートをセットしています。


```swift:ReceierViewController.swift
class ReceiverViewController: UIViewController,SenderDelegate {
    
    //画面遷移時に呼ばれる
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

            //segueのidentifierを特定
            //今回は画面間のsegueを"messageSegue"
            if segue.identifier == "messageSegue" {
                var senderViewController:SenderViewController = segue.destinationViewController as SenderViewController
                senderViewController.delegate = self
　　　　　　}
        }
    }
```


![segidf.png](https://qiita-image-store.s3.amazonaws.com/0/57702/fd8fd8b5-ca1d-2d66-b0e8-0cb2aa5355fd.png)


*StoryBoardのUtilitiesでIdentifierを設定*



そして、同クラス内でSenderViewControllerで宣言したデリートメソッドを実装します。
これで、SenderViewControllerからsendMessage()を呼べがReceiverViewControllerにmessageが送られます。

```swift:ReceierViewController.swift

    func receiveMessage(message: NSString) {
        println(message)
    }
    func optionalReceiveMessage(message: NSString) {
        println(message)
    }
```

また、値を渡しそのままSenderViewControllerを閉じたいときは、デリゲートメソッド内で、dismissViewControllerAnimated()が利用できます。


ほぼObjective-Cのときと同じく書け、値を受け渡しが簡単に行えました。
未実装のoptionalなデリゲートメソッドを呼ぼうとするとメソッドの実装の判定からメソッド自体が呼ばれないようです。
!で強制的に呼ぶと例外が発生し止まります。
*11/19修正*
AndroidでManifestにIntentFilterを記述してもBroadcast Intentが受け取れない



Androidでは、[Intent.ACTION_BOOT_COMPLETED](http://developer.android.com/reference/android/content/Intent.html#ACTION_BOOT_COMPLETED)など、AndroidManifest.xmlに\<intent-filter\>を記述するだけでOSや他のアプリが発行するインテントを受け取ることができます。
(PackageManagerの[queryBroadcastReceivers()](http://developer.android.com/reference/android/content/pm/PackageManager.html#queryBroadcastReceivers(android.content.Intent,%20int))でリストアップされるようになる)

```xml:AndroidManifest.xml
        <receiver android:name=".MyReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BATTERY_LOW"/>
            </intent-filter>
        </receiver>
```

一方、[Intent.ACTION_SCREEN_ON](http://developer.android.com/reference/android/content/Intent.html#ACTION_SCREEN_ON)などはContext.registReceiverで明示的に登録しないと受け取れるようになりません。

```MyActivity.java
    @Override
    public void onResume() {
        super.onResume();
        registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF));
    }

    @Override
    public void onPause() {
        super.onPause();
        unregisterReceiver(mReceiver);
    }
```
        
        
この違いはBroadcast Intentを発行するとき、[Intent.FLAG_RECEIVER_REGISTERD_ONLY](http://developer.android.com/reference/android/content/Intent.html#FLAG_RECEIVER_REGISTERED_ONLY)フラグが付けられているかどうか、のようでした。

[【BroadcastReceiverについて】](https://plus.google.com/100361886804733292754/posts/TM7o5LYVYdN)

FLAG_RECEIVER_REGISTERD_ONLYが付与されているIntentを受け取るにはContext.registerReceiverが必要なようです。
ActivityやServiceなどのContextのライフサイクルにそってregisterとunregisterをしなければいけないので少し面倒ですが、余計なBroadcastを受け取らずに済みます。


# Context.registerReceiverが必須なシステムのintent
システムが発行しているBroadcast Intentのなかだとどれが当たるんでしょう。。
githubのmasterを検索すれば見つかると思いますが、使いそうなものを自分用メモとして残しておきます。

https://github.com/android/platform_frameworks_base/search?utf8=%E2%9C%93&q=FLAG_RECEIVER_REGISTERED_ONLY

	Intent.ACTION_DREAMING_STARTED
	Intent.ACTION_DREAMING_STOPPED
	Intent.ACTION_SCREEN_ON
	Intent.ACTION_SCREEN_OFF
	Intent.ACTION_MANAGED_PROFILE_ADDED
	Intent.ACTION_BATTERY_CHANGED
	Intent.ACTION_POWER_CONNECTED
	Intent.ACTION_TIME_TICK
	Intent.ACTION_HEADSET_PLUG
	
	AudioManager.ACTION_USB_AUDIO_DEVICE_PLUG
	AudioManager.ACTION_USB_AUDIO_ACCESSORY_PLUG
	AudioManager.ACTION_ANALOG_AUDIO_DOCK_PLUG
	AudioManager.ACTION_DIGITAL_AUDIO_DOCK_PLUG
	AudioManager.ACTION_HDMI_AUDIO_PLUG
	
	// あまり使わなそうなACTION
	DropBoxManager.ACTION_DROPBOX_ENTRY_ADDED
	DisplayManager.ACTION_WIFI_DISPLAY_STATUS_CHANGED
	NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED
	DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED	PowerManager.ACTION_POWER_SAVE_MODE_CHANGING
	PowerManager.ACTION_POWER_SAVE_MODE_CHANGED
	NetworkStatsService.ACTION_NETWORK_STATS_UPDATED	
	
結構ありますね。。
アプリを起動していないのにManifestに書かれただけで、頻繁に呼ばれることでシステムリソースを無駄に消費しないような工夫かと思います。
Intent.ACTION_BATTERY_CHANGEDやIntent.ACTION_SCREEN_ONなどは時々使いそうです。

Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOTという@hideなフラグもありましたが、端末ブート後には関係なさそうですね。
Intent.ACTION_DATE_CHANGEDなどはmanifestに記述するだけで、ちゃんと受信できていました。
『ソフトウェアシステムアーキテクチャ構築の原理(第2版)』読んだ

[『ソフトウェアシステムアーキテクチャ構築の原理(第2版)』](http://www.amazon.co.jp/dp/4797376724/)を読んだので、メモとして内容の一部を紹介します。

[![image](https://qiita-image-store.s3.amazonaws.com/0/51055/8d677101-7c69-fc88-509c-975e3014a901.png)](http://www.amazon.co.jp/dp/4797376724/)


# 原書、著者など
* Software Systems Architecture (2nd Edition)
* 著者 Nick Rozansky, Eoin Woods
* 監訳 榊原さん

# 何が書いてある?

「ソフトウェアシステムのアーキテクチャとは？」という深淵な課題について書いています。アーキテクチャ、システムとその関連概念群を定義しようという取り組みは古く、

* 1970s David Parnas 
* 1990s Dewayne Perry, Alexander Wolf
* 1995 Philipe Kruchten, RUP ([The “4+1” View
Model of Software Architecture](http://www.cs.ubc.ca/~gregor/teaching/papers/4+1view-architecture.pdf)) ... 論理/プロセス/物理/開発 + シナリオ(Use Case)

これが、元となり、

* 2000 IEEE1471 ===> [ISO/IEC42010](http://en.wikipedia.org/wiki/ISO/IEC_42010)

となるのですが、この本は、上記の中で現れてきた概念である__「ビュー」__に加えて新しく、__「パースペクティブ」__を加えてカタログ化したものです。

すごくざっくり言うと、よく、

```
「非機能要件がシステムのアーキテクチャに影響を与える」
```

と言いますよね？本書は、この言説を徹底的に解説したものです。(非機能要件に限らず、横断的な視点を__「パースペクティブ」__として捉えている)

アーキテクチャは判断の連続であり(帯には、"Architecture is Decisions"とある)、その判断の原理を体系化（Systemize）しよう、ということです。

# アーキテクチャとは何かを少しだけ形式的に

## アーキテクチャの話をする時に核となる概念群

![image](https://qiita-image-store.s3.amazonaws.com/0/51055/b4ca2476-0988-6df7-e6b1-92e050bb3d77.png)

UML で描くとこう読める。

* __「システム」__は__「アーキテクチャ」__を持つ。（真ん中の段）
* __「アーキテクチャ」__は、__「アーキテクチャ要素」__と__「要素間関係」__からなる。（上の段）
* __「システム」__は複数の__「ステークホルダー」__のニーズに対応する。（右下）
* __「アーキテクチャ」__は__「アキーテクチャ記述」__によって文書化される（かもしれない）。（左下）
* __「アキーテクチャ記述」__は__「ステークホルダー」__のために文書化される。（下の段）


しかし、実際にアーキテクチャを記述しようとすると、１つの文書ではとっても複雑で巨大な説明になってしまいます。そこで、__「ステークホルダー」__の__「関心事」__毎に分割する必要が出てくる。ここに__「ビュー」__と__「ビューポイント」__を導入してみよう。

## 「ビュー」と「ビューポイント」

![image](https://qiita-image-store.s3.amazonaws.com/0/51055/4a3f184a-1cca-e548-902b-b0b2dec1c607.png)

* __「ビュー」__は__「ビューポイント」__に従う。
* __「ビューポイント」__は１つ以上の__「関心事」__をカバーする。

ここで、ビューとは、Krushten であれば、論理/プロセス/物理/開発の4のビューとなります。これらはカタログ化され、本書では

* コンテクスト
* 機能的
* 情報
* 並行性
* 開発
* 配置
* 運用

とグルーピングされています。

## パースペクティブ

さて、本書の白眉は「アーキテクチャパースペクティブ」です。これを入れた概念図は、このようになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/51055/a7e457e4-4355-b8dc-26f4-1bc2df974379.png)

「パースペクティブ」は、従来の言葉で近いものとして「非機能要求」「横断的関心事」がある。本書ではこの「ビューポイント」と「パースペクティブ」のカタログを作っています。

* セキュリティ
* パフォーマンスとスケーラビリティ
* 可用性とレジリエンス
* 発展性
* アクセシビリティ
* 開発リソース
* 国際化
* 配置場所
* 規則
* 使用性

そして、本書の後半のほとんどをこのカタログの記述に当てています!

# まとめのマインドマップ(メモ)

![Architecture.png](https://qiita-image-store.s3.amazonaws.com/0/51055/7067264b-59b6-73a2-ce97-0b1db1c1d4a2.png)

参考

* The 4+1 View
http://www.cs.ubc.ca/~gregor/teaching/papers/4+1view-architecture.pdf
* 『アーキテクチャとは？ Grady Booch によると』
 http://blogs.itmedia.co.jp/hiranabe/2008/10/grady-booch-dd7.html
* ISO/IEC42010
 http://en.wikipedia.org/wiki/ISO/IEC_42010

# メモ(本書の間違いかぼくの考え違いか分からない点)

特にUMLでかかれたコンセプトクラス図で気になった点。

* 日本語版の図、「アーキテクチャ」から「アーキテクチャ要素」へ向かう関連の多重度を1..nとして追加した。(多分、「アーキテクチャ」から「要素間関連」へ向かう関連の多重度と位置がずれたのだと思っている。ちなみに原著も日本語版と同じ。)
* 図の中のUMLの関連は、Navigabiity で記述されているが関連の方向で示した。
* 多重度の1は常に省略されている、と解釈している。
* 「ビュー」と「ビューポイント」の関連の関連端の多重度は、[ISO/IEC42010](http://en.wikipedia.org/wiki/ISO/IEC_42010)では、しっかり 1:1 なのに、ここでは、違っている。どうしてだろう。。。

もし榊原さん真相ご存知なら、教えてください。
completefunc=syntaxcomplete#Complete^@^ILast

## 概要
vim で rails アプリを書こうと起動すると、毎回下記のエラーが発生してしまったため、その対策をしました。

>completefunc=syntaxcomplete#Complete^@^ILast set from ~/Dropbox/git/dotfiles/dot.vim/bundle/neocomplete.vim/autoload/neocomplete/init.vim

## 対策
tpope/vim-rails と Shougo/neocomplete.vim を使っていると、上記のエラーが出て、neocomplete が使えなくなってしまうようです。

vim-rails が completefunc を上書きしているために起こっているエラーらしいです。
.vimrc に以下の設定を追加することで直りました。

```vim
let g:neocomplete#force_overwrite_completefunc=1
```

参考: [https://twitter.com/masawada/status/389306142230208512](https://twitter.com/masawada/status/389306142230208512)
decltypeの小技

C++11の目玉機能のうちのひとつに、decltypeというものがありますね。
`decltype( expression )`　で式の型を得ることができる機能です。

今回は、これによる小技をさらっと紹介したいと思います。


***

* プロトタイプ宣言に使うことができる。
主に関数のフックなどで役に立ちます。

`decltype( MessageBoxA ) HookedMessageBoxA;`
ちゃんと呼び出し規約なども合わせてもらえるので確実です。
`decltype( MessageBoxA )* pHookedMessageBoxA;`
ポインタをつけると関数ポインタに。


* 関数の戻り値の型を得ることができる。

`decltype( dosomething() ) result;`
メタプログラマにはお馴染みの技。
この時、dosomethingは実行されるわけではないので、定義がなされている必要はありません。

```

int dosomething( int );
double dosomething( double );
decltype( dosomething( 1 ) ) n; // n is int
decltype( dosomething( 1.0 ) ) df; // df is double

```

std::declvalとコンビを組んだSFINAEが非常に強力なテクニックです。

```

hoge dosomething( hage );
huge dosomething( hige );
decltype( dosomething( std::declval < hage >() ) ) abc; // abc is hoge
decltype( dosomething( std::declval < hige >() ) ) xyz; // xyz is huge

```

ううむ、パッと思いつくのはこれくらい。
もっとあると思って書き始めたのに。
UnityのSpriteEditor上のPosition,PivotとSpriteクラスフィールドの関係

備忘録
UnityのSpriteEditor上での値と、Spriteクラスのフィールドから取れる値の変換式です。

|SpriteEditor|Spriteフィールド|
|:--|:--|
|Name|name |
|Position|rect|rect|
|CustomPivot.x|-bounds.center.x / bounds.size.x + 0.5f|
|CustomPivot.y|-bounds.center.y / bounds.size.y + 0.5f|
【C言語】Intel EdisonでPWM出力

ざっとWebを見た限りでは，EdisonをC言語で扱おうという人間は少数派なのかもしれない・・．

Intel謹製のHAL(Hardware abstract layer)らしい，[MRAA](https://github.com/intel-iot-devkit/mraa)を使ってみました．

https://github.com/intel-iot-devkit/mraa/blob/master/docs/edison.md
のページに，Edison breakout boardのピンマップが書いてあるので，その表の中から使用したい物理ピンのMRAA Numberを調べて， *mraa_hoge_init* にわたすようです．hogeの部分はgpio,pwm,spi,uartなど．

MRAAには，C以外にもC++やPython，JavaScript用のインタフェースもそろっているので，お好みな言語をお使いくださいな．

```cpp:pwm.c
#include <stdio.h>
#include <syslog.h>
#include <mraa.h>

int main(int argc, char *argv[])
{
	mraa_result_t ret;
	mraa_init();

	ret = mraa_set_log_level(LOG_DEBUG);
	fprintf(stdout, "Hello mraa.\nVersion: %s\n", mraa_get_version());

	mraa_pwm_context pwm;

	// The physical pin mapping is defined at 
	// https://github.com/intel-iot-devkit/mraa/blob/master/docs/edison.md
	//
	// For example,
	// MRAA Number(20) => Physical Pin(J18-7)
	pwm = mraa_pwm_init(20);
	if(pwm == NULL){
		return 1;
	}

	mraa_pwm_period_us(pwm, 15*1000);	// 15[ms]
	mraa_pwm_enable(pwm, 1);

	int i;
	for(i=0;i<20;i++){
		mraa_pwm_write(pwm, 0.05*i);
		usleep(1000*1000);	// 1[s]

		float out = mraa_pwm_read(pwm);
		fprintf(stdout, "PWM0 : %f\n", out);
	}


	mraa_deinit();

	return ret;
}

```

```Makefile
CC = gcc
MRAALIBS = -lmraa

.PHONY: all clean pwm

all: pwm

clean:
	rm -f ./*.o
	rm -f pwm

pwm: pwm.o
	$(CC) -O4 $(MRAALIBS) -o $@ $^

%.o: %.c
	$(CC) -Wall -g -c $<
```
strict 拡張モジュールを導入してスカラー型のタイプヒントを利用する

PHP 5.6 で標準モジュールとして導入された phpdbg の作者である Joe Watkins さんが [strict](https://github.com/krakjoe/strict) 拡張モジュールを公開しました。くわしい経緯に関しては Joe さんの[ブログ記事](http://blog.krakjoe.ninja/2014/11/strictly-research-released.html)をご参照ください。このモジュールを導入すると、次のスカラー型のタイプヒントが利用できるようになります。

  * string
  * integer, int
  * float, double
  * boolean, bool
  * resource

まだ正式バージョンはリリースされていないので、モジュールの利用は学習や評価を目的としたローカル環境にとどめておいたほうがよいでしょう。

## インストール

strict モジュールをインストールするには次のコマンドを実行します。

```bash
pecl install strict-beta
```

Windows 版は準備中とのことです。パッケージ情報の<a href="http://pecl.php.net/package/strict">ページ</a>によると 0.2.0 では PHP 5.4.0 とそれ以降のバージョンを対象としてます。

php.ini もしくは スキャンの対象となるディレクトリの ini ファイルに次のコードを追加します。


```bash
extension=strict.so
```

ini ファイルのパスを調べるには次のコマンドを実行します。

```bash
php --ini
```

モジュールが読み込まれるかどうかを調べるには次のコマンドを使います。

```php
php -m
```

## 試してみよう

### string
ユーザー関数を定義して、string 型のタイプヒントを試してみましょう。

```php
var_dump(
    foo('bar'),
    foo(10)
);

function foo(string $str) {
    return $str;
}
```

実行すれば、次のエラーメッセージが表示されます。

```
PHP Catchable fatal error:  Argument 1 passed to foo must be string, integer given in /Users/masakielastic/test/test.php on line 8

Catchable fatal error: Argument 1 passed to foo must be string, integer given in /Users/masakielastic/test/test.php on line 8
```

### boolean、bool

0、0.0、"0"、null、[]、など empty 関数が false と判定する「falsy value」(false っぽい値)をユーザー関数の引数に渡すとエラーになることを確認してみましょう。

```php
function accept_bool(bool $bool) {}
accept_bool(null);
```

### resource

cURL ハンドルを受け取り、それ以外のリソースが来たときはエラーにしてみましょう。

```php
function accept_curl_resource(resource $ch) {

    if ("curl" !== get_resource_type($ch)) {
        exit("$ch is not curl handle.\n");
    }

}

$ch = curl_init();

$file = "test.txt";
touch($file);
$handle = fopen($file, "r");

accept_curl_resource($ch);
accept_curl_resource($handle);
```

## 制限事項

このモジュールの制限事項はデフォルトの値に null しか指定できないことです。Joe さんのブログ記事によれば、対策を考え中とのことです。

```php
var_dump(
    foo()
);

function foo(string $str = null) {

    if ($str === null) {
        return 'bar';
    }

    return $str;
}
```

## 今後の対応

今後、追加する予定の機能として、PHP 7 に向けて提案されている安全な型変換関数 (<a href="https://wiki.php.net/rfc/safe_cast">RFC: Safe Casting Functions</a>) が挙げられています。この RFC が通った場合、PHP 5 系でも利用できるようにし、RFC が通らなければ strict_cast という名前の関数を導入するとのことです。また、戻り値の型宣言 (<a href="https://wiki.php.net/rfc/returntypehinting">RFC: Return Type Declarations</a>) の RFC が通った場合にも対応するとのことです。
SQLでURLの一部だけを切り出す


# SQLでURLの部分的切り出しを行う

## 背景
DB内にURLを格納しており、取り出してから文字列操作を行わず、SQLで対応する

## 対象DB
RedshiftとPostgreSQLで動作確認済
※ RedshiftはPostgreSQLをベースにしている様です。

## 切り出し
### プロトコル部分をなくす
```sql:Redshift
LTRIM(LTRIM(url, 'http://'), 'https://')
```
[2015/03/02追記]
上記の内容では、domain部分の一部まで切り取られてしまいます。
なぜなら、___LTRIMは指定した文字列が連続する限り取り除く___からです。
なので、正しくは以下の内容です。

```sql:Redshift
LTRIM(LTRIM(url, 'htps'), ':/')
```

### ドメイン部分切り出し
```sql:Redshift
REGEXP_SUBSTR(url, '(http://|https://)[^/]*')
```
* `http`と`https`の2つのプロトコルをまとめて取り除く
* `[^/]*`でプロトコル以降、初めての`/`部分までを切り出す

### クエリパラメータを削除する
```sql:Redshift
SPLIT_PART(url, '?', 1)
```
* 1がマッチした部分をとりだし、ここでは、`?`より前
tmuxでconsoleのスクロール(not mouse)を行う方法


コンソール上で大量に流れるログなどを、tmux上だと戻ってみることが出来なかった。


* `C-b` -> `[` を押す  
右上に色のついた `[0/0]` の表示が現れる
* `PgUp`, `PgDn` や 矢印キーが出来る
* 戻りたいときは、`q` を押す

マウススクロールもしたいけど、とりあえずPageup,PageDown出来るので問題解決。

tmux弱者なので、他に方法があったら教えて欲しい。

参考サイト様
[How do I scroll in tmux?](http://superuser.com/questions/209437/how-do-i-scroll-in-tmux)
Ubuntuでruby-switchを使ってRubyの複数バージョンを導入する


rbenvより簡単に使えるような感じがしたのでメモしておきます。

## インストール

公式リポジトリだと最新のものが入らないので、PPAから非公式リポジトリを追加します。

```
add-apt-repository -y ppa:brightbox/ruby-ng
apt update
apt install ruby-switch
```

後は適当に欲しいバージョンのRubyをインストールします。

```
apt install ruby1.9.3
apt install ruby2.1
apt install ruby2.2
```

## インストールされているRubyの一覧

```
ruby-switch --list
```

## バージョン切替

```
ruby-switch --set ruby1.9.3
ruby-switch --set ruby2.2
```

## 確認

```
ruby -v
```

switchしていないrubyもバージョン番号を付けて使えます。

```
ruby1.9.3 -v
```
library not found for -lPods-<プロジェクト名>-<pod名>

xcodebuildで上記エラーが出てビルド失敗するようになった（exit codeは65）
以下の二つのどちらかで治った
・対象podを#import
・対象podをPodfileから削除

要は使わないものがあると失敗するらしい

[追記]
今もう一度やったらできなかった。なんなんだ…
WordPressで、エラー表示を画面に表示せずに、ログに出力する方法

WordPressで、画面にエラー表示をさせずに、ログに出力する方法は以下の設定をwp-config.phpに記述することで実現出来ます。

※define('WP_DEBUG_LOG', true);を記述することで、WP_CONTENT_DIR . '/debug.log'にエラー出力することが出来ますが、ログが分散するのが嫌なので、それはやらずに、通常のログファイルに出力します。

```
ini_set('display_errors', 0);
ini_set("log_errors", 1);
ini_set("error_log", "/var/log/nginx/error.log");
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', false);
define('WP_DEBUG_DISPLAY', false);
```
FreeBSD 9.2-RELEASE を入れたときにした初期設定

## 概要
FreeBSD 9.2-RELEASE を VirtualBox に入れてみたので、自分が初期設定をどうしたのか、残しておこうと思います。

## Install
bsdinstall を使ってインストールしました。  
参考: [公式のハンドブック](http://www.freebsd.org/doc/ja/books/handbook/using-bsdinstall.html)

気をつけたことは、インストールするコンポーネントでは何も選択しなかったことです。
なるべく minimal 構成にするためと、Ports Collection はあとで最新版を取ってきたかったからです。

## Ports Collection を取得して、展開

```console
# portsnap fetch extract
```

すでに extract しているなら、update で更新。

```console
# portsnap fetch update
```

## Ports からいろいろインストール
portinstall を使うと依存関係を解決してインストールできるらしいです。
portupgrade を入れるときに portinstall が入るらしいので、portupgrade を入れます。

```console
# cd /usr/ports/ports-mgmt/portupgrade
# make install clean
```

無事インストールが終わっても、コマンドが見えないので、rehash します。

```shell-session
# rehash
```

あとは、適宜必要なものをインストールします。
メモとして残しておくと、初期にインストールしたのは以下のものです。

```console
# portinstall shells/bash editors/vim security/sudo ftp/wget ports-mgmt/portaudit ports-mgmt/portmaster
```

rehash を忘れると、コマンドが見えなくて、焦ります。（焦りました）

## sudoers の編集
root で作業するわけにも行かないので、sudo を使えるようにします。
user: misaki は wheel グループに入れてあるので、sudores を編集して、wheel グループのユーザに sudo を許可します。

```bash
# visudo
+ %wheel ALL=(ALL) ALL
```

あとは、reboot して、今度は一般ユーザでログインします。

## shell を bash に変更
zsh でも bash でもいいのですが、先ほどインストールした bash に変更します。

```console
$ chsh -s /usr/local/bin/bash
# reboot
```

## 時刻合わせ
参考: [推奨公開サーバ](http://wiki.nothing.sh/page/NTP/%BF%E4%BE%A9%B8%F8%B3%AB%A5%B5%A1%BC%A5%D0)  
上記のサイトを参考に、ntp サーバの設定をします。

```bash
# vi /etc/ntp.conf
+ server ntp.nict.jp iburst maxpoll 9
+ server ntp.jst.mfeed.ad.jp iburst maxpoll 9
```

/etc/ntp.conf は root 権限でなければファイル保存できませんが、sudo vi とか、sudo vim みたいなことをしなくても、vim で sudo を使ってファイル保存ができます。

```console
:w !sudo tee %
```

参考: [sudo.vimを使わないでvimでsudoを使ってのファイル保存](http://secondlife.hatenablog.jp/entry/20050428/1114685380)

あとは、起動時に時刻合わせをするよう、/etc/rc.conf を設定します。

```bash
# vi /etc/rc.conf  
+ ntpdate_enable="YES"  
+ ntpd_enable="YES"
```

## root へのメール設定
root のメールアドレスを設定します。
root への log メールなどを受け取るためです。

```bash
# vi /etc/aliases  
+ root: ${mail address}  

# newaliases
```

今回した初期設定はこのくらいです。
nginxとngx_mrubyのrpmパッケージを作成する

環境はCentOS6.6です

mruby-redis依存のhiredisをリビルドしてインストール

```
$ wget http://ftp.riken.jp/Linux/fedora/releases/20/Everything/source/SRPMS/h/hiredis-0.11.0-3.fc20.src.rpm
$ rpm -ivh hiredis-0.11.0-3.fc20.src.rpm
$ rpmbuild -ba ~/rpmbuild/SPECS/hiredis.spec
$ sudo yum localinstall ~/rpmbuild/RPMS/x86_64/hiredis-0.11.0-3.el6.x86_64.rpm ~/rpmbuild/RPMS/x86_64/hiredis-devel-0.11.0-3.el6.x86_64.rpm
```

SOURCESディレクトリ配下にngx_mrubyのtarballを作成する
バージョンは現在の最新1.6.6を指定

```
$ cd ~/rpmbuild/SOURCES/
$ git clone https://github.com/matsumoto-r/ngx_mruby.git ngx_mruby-1.6.6
$ cd ngx_mruby-1.6.6
$ git submodule init
$ git submodule update
$ cd ..
$ tar cvfz ngx_mruby-1.6.6.tar.gz ngx_mruby-1.6.6
```

nginx公式からsrpmを持ってきてリビルドの準備

```
$ cd ~
$ wget http://nginx.org/packages/centos/6/SRPMS/nginx-1.6.2-1.el6.ngx.src.rpm
$ rpm -ivh nginx-1.6.2-1.el6.ngx.src.rpm
```


specファイルを下記の感じで書き換える

```
@@ -42,12 +42,18 @@
 Requires(pre): pwdutils
 %endif

+%define ngx_mruby_var 1.6.6
+Requires: hiredis
+BuildRequires: git
+BuildRequires: ruby-devel
+BuildRequires: hiredis-devel
+
 # end of distribution specific definitions

 Summary: High performance web server
 Name: nginx
 Version: 1.6.2
-Release: 1%{?dist}.ngx
+Release: 1%{?dist}.mruby
 Vendor: nginx inc.
 URL: http://nginx.org/

@@ -61,6 +67,7 @@
 Source7: nginx.suse.init
 Source8: nginx.service
 Source9: nginx.upgrade.sh
+Source10: ngx_mruby-%{ngx_mruby_var}.tar.gz

 License: 2-clause BSD-like license

@@ -82,11 +89,20 @@
 Not stripped version of nginx built with the debugging log support.

 %prep
-%setup -q
+%setup -a 10 -q

 %build
+
+cd %{_builddir}/%{name}-%{version}/ngx_mruby-%{ngx_mruby_var}/
+./configure --with-ngx-src-root=%{_builddir}/%{name}-%{version}/
+make build_mruby
+make generate_gems_config
+
+cd %{_builddir}/%{name}-%{version}/
 ./configure \
         --prefix=%{_sysconfdir}/nginx \
+        --add-module=./ngx_mruby-%{ngx_mruby_var}/ \
+        --add-module=./ngx_mruby-%{ngx_mruby_var}/dependence/ngx_devel_kit \
         --sbin-path=%{_sbindir}/nginx \
         --conf-path=%{_sysconfdir}/nginx/nginx.conf \
         --error-log-path=%{_localstatedir}/log/nginx/error.log \
@@ -126,6 +142,8 @@
         %{_builddir}/%{name}-%{version}/objs/nginx.debug
 ./configure \
         --prefix=%{_sysconfdir}/nginx \
+        --add-module=./ngx_mruby-%{ngx_mruby_var}/ \
+        --add-module=./ngx_mruby-%{ngx_mruby_var}/dependence/ngx_devel_kit \
         --sbin-path=%{_sbindir}/nginx \
         --conf-path=%{_sysconfdir}/nginx/nginx.conf \
         --error-log-path=%{_localstatedir}/log/nginx/error.log \
```


必要モジュールをインストールしてリビルドする

```
$ sudo yum-builddep ~/rpmbuild/SPECS/nginx.mruby.spec
$ rpmbuild -ba ~/rpmbuild/SPECS/nginx.mruby.spec
```


これでビルドできましたが、
まだうごかしてません！
次は動かします

追記

この記事で作ったものです
http://packages.bitbucket.org/centos/6/rpms/nginx-1.6.2-1.el6.mruby.x86_64.rpm
http://packages.bitbucket.org/centos/6/rpms/hiredis-0.11.0-3.el6.x86_64.rpm
http://packages.bitbucket.org/centos/6/srpms/nginx-1.6.2-1.el6.mruby.src.rpm
Railsのコントローラーの仕事は何か？

誰も読んでいない[ブログ](http://mat-aki.net/post/53115477961/rails)からの転載

---

最近MVCがどうとかという内容が話題になっていますが、ちょっと乗っかった内容です。

Railsで初心者によく見られる良くないコードは、コントローラーでたくさんの処理を実装してコントローラーの一つのアクションが30行、40行になってしまうことです。それに対して、モデルに適切に処理を移すのが良いんだということを言うんですが、”適切に”って何？じゃー、コントローラーには何を書くのがいいの？っていう質問への僕なりの回答です。

## 良いメソッドとは？

直接回答する前に、まずは前提の共有から、プログラムにおいて良いメソッドとはどのようなメソッドでしょうか？僕の解は、以下です。

> "引数と返り値が最小限になっているメソッドです"

（この部分については別途説明が必要な気がしますが、まぁなんとなくご理解いただけるかなと思います。）

## Railsのコントローラーの仕事？

では、Railsのコントローラーの仕事において、まず引数について考えてみます。コントローラーのアクションの引数ですが、一般的なrubyのメソッドの引数としては何も渡って来ません。では何を元に処理を行うかというとparamsなどのインスタンスメソッドから取得する値を元に処理を行いますね。よくアクセスするのは、以下の３つくらいでしょうか。

- params
- session
- request

RailsではコントローラーがHTTPの仕様を吸収する部分になっているので、柔軟に処理する必要があるのは仕方のないことだと思います。良いメソッドの前提からすると、引数が最小限になっていないのです。これがコントローラーを肥大化・難しくさせる原因の一つかもしれないですね。

さて、返り値はなんでしょうか？コントローラーのアクションでは以下の２つが返り値です。

- レンダリング先 render / redirect_to
- @ view とのデータのやり取りのためのインスタンス変数

まずは、レンダリング先について。どのviewを利用してレスポンスを返すのかを指定することが必要です。redirect_to もこれに含まれます。これはわかりやすいですね。

もう一つの返り値はインスタンス変数ですが、これをどう考えるかが難しいところだと思います。良いメソッドの前提からすると、返り値も最小限になるべきなのです。つまり、本当に必要なものしか設定すべきではありません。しかし、＠がいっぱい設定されている悪いコードはたくさん見たことがあります。viewとの受け渡しする必要があるものが増えるということは、間違い・不具合を生みやすくなるでしょう。

まとめると、Railsのコントローラーは、params, session, requestなどを引数にとって、レンダリング先と＠を設定することが仕事です。良いメソッドは、両方共最小限にする必要があるのですが、ともに複数あるので、難しいんですよねー。

## 良いアクションにする方法

という事を踏まえて、引数と返り値を最小限にする方法を考えていきます。良い実装にするために、工夫して減らす事が必要なんですね。

まず、メインのアクションでは、本当に扱いたいオブジェクトのみを扱うようにすべきです。paramsから、もう少しいうとparams[:user] と一つのキーだけを使うようにして、それをモデルに引き渡して、返り値を `@user` に入れる。その `@user` を元にどうレンダリングするか決めるという事だけにできると最小限になります。Scaffoldで出力されるコードはまさにそうなっているので、お手本だと思います。

では、例えば /posts/1/comments/4 というようなpathを組んだ時には params[:post_id] というパラメータも飛んできます。これはどのように扱うと良いかというと、 before_filter を使うとうまく処理できます。

````ruby
def set_post
  @post = Post.find params[:post_id]
end
````

という感じですね。このように、メインで扱う以外のparamsや@は別のところで処理するように工夫していくのです。こうすることで、メインのアクションが肥大化するのを防げます。

では、sessionはどうするかですが、認証系のプラグインでもよくやられているように current_user というようなヘルパーメソッドでアクセスできるようにしておくと便利です。

他によく問題になるのが、メインのオブジェクトではないが、画面上に必要となるほかのオブジェクトをどうするかです。例えば、おすすめ○○といったものかもしれません。どうすると良いかは、そのオブジェクトが何の情報から生成されるかを考えることから始めます。例えば、時間に応じて表示するのかもしれませんし、そのログインしているユーザから表示するかもしれません。

そのオブジェクトを生成するためにparamsの情報を一切利用しないというのであれば、viewから直接modelを呼んでも良いです。変にコントローラーで定義するとviewとの接続が複雑になり、コードが複雑になって不具合を生む原因になります。

paramsを元に生成される情報なのであれば、コントローラーで処理すべきことだと思います。そうすると、メインのオブジェクトともう一つのオブジェクトを一つのアクションで設定することになります。その場合は、良いメソッドの前提からすると２つのメソッドに分けてしまうというのも手だと思います。

このように、工夫することでコントローラのアクションの行数を減らすして、よりよいコードにすることができます。安易にコントローラーのアクションの行数を増やすことはやってはいけません。皆さん気をつけましょう！

## まとめ

コントローラのアクションの引数は params, session, rquestで、返り値はレンダリング先と @を設定すること、それが仕事。

よいアクションのメソッドにするには、アクションでメインの操作対象としているオブジェクトの params[:user] と絞って、@は極力少なくする。

メインの操作対応以外のオブジェクトの操作は、before_filterやヘルパーメソッドを使って、処理するように工夫する。
bootstrap-wysiwygで画像アップロード対応してみた。（fuelphp）


bootstrap-wysiwygのダウンロード先: [mindmup/bootstrap-wysiwyg](https://github.com/mindmup/bootstrap-wysiwyg/ "GitHub")

bootstrap-wysiwygの画像挿入はデータURIスキームでテキスト化されているので、
これをアップロードに変更してみた。

#1. Rangeの取得#
挿入時、キャレット位置に挿入する為、Rangeを取得する。
※editor内を操作したときのみに取得する。

```js:
var range = null;

$("#editor").bind("keypress click", function(){
	var sel = document.getSelection();
	range = sel.getRangeAt(0);
});
```

#2.画像のアップロード#
ajaxで送信をおこなう
（ファイルとファイルタイトル（任意）を送信）

```js:ajax処理
$.ajax({
	url: $form.attr('action'),
	type: $form.attr('method'),
	contentType: false,
	processData: false,
	data: fd,
	dataType: 'json',
	timeout: 10000,  // 単位はミリ秒
            
   .....
 });
```

```php:送信先コード(fuelphp使ってます)
public function action_index(){
　　　　　
        $new_name = 'img_'.date('ymtHis');
        $config = array('path' => DOCROOT.'assets/img/upload/',
            'new_name'=>$new_name,
            'ext_whitelist'=> array('jpg','jpeg','gif','png','JPG'));
                
        \Fuel\Core\Upload::process($config);
        
        if(\Fuel\Core\Upload::is_valid()){
            \Fuel\Core\Upload::save();
            $files = \Fuel\Core\Upload::get_files();
            foreach ($files as $file){
                 $file_name = preg_replace('/.jpg|.jpeg|.gif|.png|.JPG/', '', $file['name']);;
                $new_name = $new_name.'.'.$file['extension']; 
                break;
            }    
        }else{}
       \Fuel\Core\Input::post('img_title') ? $img_title = \Fuel\Core\Input::post('img_title') : $img_title = $file_name;

       $data = array('url'=>Uri::create('public/assets/img/upload/'.$new_name),'title'=>$img_title);
       
       //ファイルURLとファイルタイトルをjsonで返す。
       return json_encode($data);
    }

```






#3.画像の挿入　処理#
```js:ajax処理
$.ajax({
	......
            
    // 通信成功時の処理
    success: function(data) {
    	if(!range){
             //Rangeを取得していない場合、(#editorを操作していない場合)
    		var code = '<img src="'+data.url+'" title="'+data.title+'"/>';
             //#editorの最後に追加.
    		$('#editor').append(code);
    	}else{
    	    //Rangeを取得している場合
            //エレメント生成
			var newNode = document.createElement('img');
			newNode.setAttribute("src", data.url);
			newNode.setAttribute("title", data.title);
            //Rangeの開始境界点に挿入
			range.insertNode(newNode);
        } 	
	},
    // 通信失敗時の処理
    error: function(xhr, textStatus, error) {
        alert('ファイル送信に失敗しました。');
    }
 });
```

無理やり感がありありですが、これでアップロード対応できました（笑）
【Android】Android 5.0 Lolipop に対応するには【cocos2d-x】

# Android 5.0 Lolipopに変わって
各社共に色々と問題が起こっているようです。
[主なAndroidアプリのAndroid 5.0(Lollipop)対応状況まとめ](http://octoba.net/archives/20141109-android-feature-lollipop.html)
自分のアプリも例に漏れず問題が発生しましたが、
どうやら対応出来たみたいですので、ここにメモしておきます。

# 問題その1 起動出来ない
Android 5.0 Lolipop の端末で起動した直後に
**「アプリケーションに問題が発生しました」**
とネイティブダイアログが表示されて起動出来ませんでした。

エラー内容は
**JNI DETECTED ERROR IN APPLICATION : illegal class name "jp.co.game.hoge"
art/runtime/check_jni.cc(65)**
このような感じでした。

その原因は**JNI**の記述法にありました。

今まで

```cpp:AndroidBridge.cpp
    JNIEnv *pEnv;
    //～～～
    jclass cls = pEnv->FindClass("jp.co.game.hoge");
    //～～～
```

と書いていてAndroid4系まで問題なく動作してましたが、これを

```cpp:AndroidBridge.cpp
    JNIEnv *pEnv;
    //～～～
    jclass cls = pEnv->FindClass("jp/co/game/hoge");
    //～～～
```

このようにスラッシュ区切りに変更。

また、jboolean型の値を取得するのに

```cpp:AndroidBridge.cpp
    JNIEnv *pEnv;
    jclass classId;
    jmethodID methodId;
    //～～～
    jboolean flg = (jboolean)pEnv->CallStaticIntMethod(classId , methodId);
    //～～～
```

とintから受けてもAndroid4系までは大丈夫でしたが、
これも5.0ではエラーになりました。

```cpp:AndroidBridge.cpp
    JNIEnv *pEnv;
    jclass classId;
    jmethodID methodId;
    //～～～
    jboolean flg = (jboolean)pEnv->CallStaticBooleanMethod(classId , methodId);
    //～～～
```

と、**CallStaticBooleanMethod**に変えればOKです。

# 問題その2 BGMが鳴らない
もう一つ問題が発生しました。
SEは鳴っているのですが、BGMが再生されていませんでした。
こちらはすでにcocos2d-x公式で修正されておりました。
[cocos2d-x github](https://github.com/cocos2d/cocos2d-x/pull/9088)

こちらの
**Cocos2dxMusic.java**
を
自分のプロジェクトの**org/cocos2dx/lib/Cocos2dxMusic.java**
に上書きまたは書き換えで無事にBGMが鳴るようになりました。
BGMの切り替わりも問題なく切り替わりました。

# とりあえず以上
自分の対応はこれでひとまず完了となりました。
その他全体的に触ってみましたが、特に問題は無さそうです。
が、
が！
が！！！
ケース・バイ・ケースな所もあると思いますので、
あくまで参考程度にとどめて頂けると助かります。