OmniAICreator/Qiita-1.07M huggingface dataset:
DSL Study in ruby2


I don’t like the idea of variables and methods like monthly_sales and target_sales cluttering the top-level scope. 
Shall we rafactor it.


```ruby:setup.rb
def event(description)
  puts "ALERT: #{description}" if yield
end

def select_sales
  puts "SELECT DATA"
  @sales = 200
end

def set_sales
  puts "SET SALES"
  @target_sales = 100
end
```

```ruby:events.rb
load 'setup.rb'

select_sales
set_sales

event "sales is enough" do
  puts "SALES IS ENOUGH"
  @target_sales < @sales
end

event "sales is soso" do
  puts "SALES IS SOSO"
  @target_sales == @sales
end

event "sales is not enough" do
  puts "SALES IS NOT ENOUGH"
  @target_sales > @sales
end
```

```bash
ruby events.rb
```

Here are result.

SELECT DATA
SET SALES
SALES IS ENOUGH
ALERT: sales is enough
SALES IS SOSO
SALES IS NOT ENOUGH
DSL Study in ruby1


I implement basic DSL which Domain Specific Language

```ruby:events.rb
def event(description)
  puts "ALERT: #{description}" if yield
end

# We can select data from database.
def select_sales
  puts "SELECT DATA"
  200
end

target_sales = 100

event "sales is enough" do
  target_sales <= select_sales
end

event "sales is not enough" do
  target_sales > select_sales
end

```

```bash
ruby events.rb
```

These are result.

SELECT DATA
ALERT: sales is enough
SELECT DATA
Cloudera Manager で HDFSのディレクトリのクォータを一括設定する

HDFSのディレクトリにはクォータを設定することができる。
この機能により、ユーザごとの容量を制限することができるが、素のHadoopだとコマンドを一つ一つ入力しなければならず、面倒な作業である。
Cloudera Managerを使えば、HDFSのディレクトリクォータを一括設定できる。


# 環境

- Cloudera Manager 5.7 (注: 要 Enterprise 版)


# 技術説明

## Apache HDFS のクォータ機能

HDFSでは、ディレクトリ単位にクォータを制限することができる。
このクォータはファイル数単位、あるいは容量単位で指定することができる。
HDFSでコマンド実行する場合は以下のように実行する。

```shell-session
$ hdfs dfsadmin [-setQuota <N> | -setSpaceQuota <N> [byte] ] [dir1 dir2 ...]
```

詳細は[Apache Hadoop のクォータのページ](http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsQuotaAdminGuide.html)を参照のこと。


## Cloudera Manager におけるクォータ機能

上記の通りHadoop単体でもクォータの設定はできるが、一括設定をするにはディレクトリ名を一つ一つ並べなければならない。
また、一度設定したクォータの状況を確認するのも一苦労である。
Cloudera Managerにはクォータの一括設定などを行う便利機能が備わっているので、これを使うことで簡単にクォータの設定・管理を行うことができる。



# 設定方法

**クラスタ** → **レポート** → **Directory Usage** とクリックしていく。

![CM57_クラスタメニュー_レポートの場所.png](https://qiita-image-store.s3.amazonaws.com/0/17749/2539c407-9932-89c8-1ed5-af8fca2abf70.png)

![CM57_レポート_DirectoryUsageの場所.png](https://qiita-image-store.s3.amazonaws.com/0/17749/15c80805-d146-39ca-cb2f-0a562d0eaa13.png)

![CM57_ディレクトリ使用量とディスククォータ.png](https://qiita-image-store.s3.amazonaws.com/0/17749/09143d6a-c26e-899c-0c2d-2c2b221eb6a6.png)

設定したいディレクトリにチェックを入れ、 **選択内容に対するアクション** から **クォータの管理** を選択する。

![CM57_DirectoryUsage_クォータの管理.png](https://qiita-image-store.s3.amazonaws.com/0/17749/d5515312-59b7-0b75-7cb8-a3baba85af57.png)

ファイル数の制限とディスクスペースの制限の設定を行い、保存すれば完了である。
MySQLで大量のUPDATEを流したい時はELT、FIELDキーワードを用いたBULK UPDATEで高速化

タイトルの通りです。
こんなSQLを大量に流したい場合です。

```sql
UPDATE heyas SET yatin = 60000 WHERE id = 1;
UPDATE heyas SET yatin = 67000 WHERE id = 2;
UPDATE heyas SET yatin = 74000 WHERE id = 3;
.
.
.
```

まずINSERTにON DUPLICATE KEY UPDATEキーワードを使うやり方です。

```sql

INSERT INTO heyas (id, yatin) 
VALUES(1, 60000), (2, 67000) 
ON DUPLICATE KEY UPDATE yatin = yatin * 1.08;

```

REPLACE構文に近いイメージですね、しかしこれだと任意の値をセットしづらいです。
そこでELTとFIELDキーワードを使います。

```sql

UPDATE heyas
   SET yatin = ELT(FIELD(id, 1, 2), 60000, 67000)
 WHERE ID IN (1, 2)

```

良い感じですね、複数カラムを更新したい場合はこうなります。

```sql

UPDATE heyas
   SET yatin = ELT(FIELD(id, 1, 2), 60000, 67000), 
       kousinbi = ELT(FIELD(id, 1, 2), NOW())
 WHERE ID IN (1, 2)

```

BULK INSERTは結構知られてるのですが、BULK UPDATEはあまり知られてない感じです（私もでした）
数千件程度ならベタ書きで流せば良いのですが、UPDATEは結構コストがでかいので数万から数十万件になってくるとオーバーヘッドがバカにならないです。
実際に20万件程度のテーブルでクラスタリングして相互にUPDATEする様な処理で試したところ、順次UPDATEする処理に比べてBULK UPDATEは約1/50の時間で処理出来るようになりました！
Heroku の mLab (MongoDB) でローカル PC からサーバーのデータを Export する方法

Heroku で mLab 使用時にローカル PC からの mongoexport に詰まったので忘却録として。

Heroku の mLab のページで Tools タブを選択すると、以下のコマンドでローカル PC から export できるという内容が書かれている。

```
Export collection
mongoexport -h *** -d *** -c <collection> -u <user> -p <password> -o <output file>
```

collection: コレクション名
user: ユーザー名
password: パスワード
output file: ファイル名

collection はコレクション名を設定して、output file は [コレクション名.json]みたいな適当な設定でいけるのだが、

user, password を探すのに苦労した。

結論を言うと以下のスクショで囲んである部分にあった。Heroku の Dashboard で Settings 内にある Config variables の MONGOLAB_URI の値を見つける。

![スクリーンショット 2016-06-07 21.03.08.png](https://qiita-image-store.s3.amazonaws.com/0/19698/f7c9108f-4cbb-d852-5547-cef88023c15d.png)

この値が以下のような形式になっているので、この部分の user, password を利用すればいけた！

```
mongodb://<user>:<password>@***:***/***
```

本当は mLab のページ内にあってもいいのでは、と思うのだが。。。
もし知っている方がいたら教えて下さい。
【WordPress】テンプレート階層を利用して固定ページで自作テンプレートを呼び出す

#【WordPress】テンプレート階層を利用して固定ページで自作テンプレートを呼び出す

***WordPress独自の読み込み順序([テンプレート階層](https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E9%9A%8E%E5%B1%A4))を利用して、固定ページに自作したテンプレートを適用させる。***

・パーマリンク設定
管理画面の設定メニューから、パーマリンク設定へ。
パーマリンクの設定を投稿名に設定し、変更を保存します。

・テンプレートを作成する。
テーマの直下にpage-custom.phpというファイルを作成します。
~/wordpress/wp-content/themes/page-custom.php

今回はとりあえず、固定ページの投稿内容を無視し、
文字列を表示するだけのコードにします。

```lang:page-custom.php
<?php
get_header(); ?>

<div id="primary" class="content-area">
	<main id="main" class="site-main" role="main">
		<?php
		echo 'ちゃんと自作テンプレートが呼ばれてます！';
		?>
	</main><!-- .site-main -->

	<?php get_sidebar( 'content-bottom' ); ?>

</div><!-- .content-area -->

<?php get_sidebar(); ?>
<?php get_footer(); ?>
```
カスタムテンプレートとして、固定ページの編集画面で選択出来るようにしたい場合は、
以下のような記述を入れるのですが、今回はテンプレート階層を利用するので、記述しない。

```
/*
Template Name: カスタムテンプレート
*/
↑今回は記述しない
```

固定ページを作成し、パーマリンクをcustomと設定して、記事を公開する。
![kotei1 (1).png](https://qiita-image-store.s3.amazonaws.com/0/97158/f6f28818-33b0-e7a5-7461-3384572c4f14.png)


・指定したパーマリンクにアクセスしてみる。
![ok.png](https://qiita-image-store.s3.amazonaws.com/0/97158/cbcd1bee-dd6a-6899-697d-7758af90ad25.png)
投稿内容は非表示で、テンプレートに記述された文字列が出力されてます。
自作したテンプレートが呼び出されていますね！


ちなみに、パーマリンクの設定を合わせないと以下のようにデフォルトテンプレートが呼び出されてしまいます。
![no_temp.png](https://qiita-image-store.s3.amazonaws.com/0/97158/748bbb2f-799d-59d5-16e6-c9ad3772cb98.png)
ChromeでWebSocketの送受信フレームを見る

# 参考

http://stackoverflow.com/questions/26880943/how-to-debug-invalid-frame-header-websocket-issues-with-rails-websocket-rails

>Chrome developer tools now have the ability to list WebSocket frames and also inspect the data if the frames are not binary.

>Process:

>- Launch Chrome Developer tools
>- Load your page and initiate the WebSocket connections
>- Click the Network Tab.
>- Select the WebSocket connection from the list on the left (it will have status of "101 Switching Protocols".
>- Click the Frames sub-tab. Binary frames will show up with a length and time-stamp and  indicate whether they are masked. Text frames will show also include the payload content.
Route53でホステッドゾーンを作る（ついでに可能ならドメインも買う）


AWS SDKでRoute53の作業を横着するシリーズ

- 「route53domains.checkDomainAvailabilit」でドメインが購入可能か確認
- 取得可能なら「route53domains.registerDomain」でドメインを購入
- 取得できない場合は「route53.createHostedZone」でホステッドゾーンだけ作る

そんな感じのスクリプトです。

```
	var domain = "example.net";
	var AWS = require('aws-sdk');
	var route53domains = new AWS.Route53Domains({
		apiVersion: '2014-05-15',
    	accessKeyId: "ACCESS_KEY_ID",
    	secretAccessKey: "SECRET_ACCESS_KEY",
    	region: "REGION"
	});
	var params = {
	  DomainName: domain,
	};
	route53domains.checkDomainAvailability(params).promise().then( (data) => {
		var response = .domain + ' is ' + data.Availability;
		if ( data.Availability == 'AVAILABLE') {
			console.log('Register your Domain in Route53Domains');
			var params = {
			  AdminContact: contacts,
			  DomainName: domain,
			  DurationInYears: 1,
			  RegistrantContact: contacts,
			  TechContact: contacts,
			  AutoRenew: true,
			  PrivacyProtectAdminContact: true,
			  PrivacyProtectRegistrantContact: true,
			  PrivacyProtectTechContact: true
			};
			return route53domains.registerDomain(params).promise();
		} else {
			console.log('Create Route53 Hosted Zone');
			var params = {
			  CallerReference: "XXX",
			  Name: domain,
			};
			var route53 = new AWS.Route53({
				apiVersion: '2014-05-15',
				accessKeyId: "ACCESS_KEY_ID",
				secretAccessKey: "SECRET_ACCESS_KEY",
				region: "REGION"
			});
			return route53.createHostedZone(params).promise();
		}
	}).then( (data) => {
		console.log(data);
	});
```

## ドメイン取得した場合の戻り値
```
{ OperationId: 'fee25dbf-04d4-44df-8861-eff2312a4c8f' }
```

## HostedZone作った場合の戻り値
```
{
  Location: 'https://route53.amazonaws.com/2013-04-01/hostedzone/XXXX',
  HostedZone: {
    Id: '/hostedzone/XXXXXX',
    Name: 'example.net.',
    CallerReference: 'XXXX',
    Config: {
      PrivateZone: false 
    },
    ResourceRecordSetCount: 2 
  },
  ChangeInfo: {
  Id: '/change/XXXXXXXX',
     Status: 'PENDING',
     SubmittedAt: Tue Jun 07 2016 19:56:54 GMT+0900 (JST) 
  },
  DelegationSet:  {
    NameServers:  [
      'ns-XXX.awsdns-38.co.uk',
      'ns-XX.awsdns-01.com',
      'ns-XXX.awsdns-05.net',
      'ns-XXXX.awsdns-41.org' 
    ] 
  }
}
```
[Groovy]席替えスクリプトを実装


# 概要

[% assign.sh sheets namelist # 席替えスクリプト](https://gist.github.com/yurikazuna929/0be22250ec3307dfffe5af27c7ad8ef3)が面白かったので、Groovyでも席替えスクリプトを実装してみました。
ただ、このスクリプトはそこまで楽しいものではなく、自分が学生の頃に実際に有った教室の席順を模しています。

席順はよくある（今も？）タイプで、男性女性の組み合わせを1列として、その列が`numberOfDeskColumns`分教室にある。
以下のような感じ。（あぶれた生徒は単純に最後に追加）

```
 男 女  男 女  男 女
 男 女  男 女  男 女
 男 女  男 女  男 女
 男 女  男 女  男 女
 男 女  女
```

コレをGroovyで実装！

```groovy
class Person {
    def id
    def sex // 0==Man, 1 == Woman
    String toString() {
        "${sprintf('%2d', id)}(${sex?'女':'男'})"
    }
}

Integer numberOfStudents = 51
Integer numberOfDeskColumns = 3
Integer numberOf1Column = 2

// テストデータ生成
List<Person> persons = (1..numberOfStudents).collect {new Person(id:it, sex:it % 2)}
List<Person>men = persons.findAll{it.sex==0}
List<Person>women = persons.findAll{it.sex==1}

// それぞれの生徒の並び順をランダムに入れ換えて再結合
Collections.shuffle(men)
Collections.shuffle(women)
List<Person>shuffled = [men, women].transpose().flatten()

// あぶれた生徒の救出。。。
shuffled += men.findAll{ !(it in shuffled) } + women.findAll{ !(it in shuffled) }

shuffled.collate(numberOfDeskColumns*numberOf1Column).each {
    println it
}
```

実行結果は以下のような感じに。
なお、当然ランダムで席順を入れ換えているので実行結果は毎回異なります。

```
[50(男), 19(女), 42(男), 37(女), 12(男), 39(女)]
[24(男), 15(女),  4(男), 27(女), 36(男),  3(女)]
[ 6(男), 17(女), 46(男), 13(女), 30(男),  5(女)]
[22(男),  7(女), 44(男), 41(女), 32(男), 49(女)]
[34(男), 23(女),  8(男),  9(女), 20(男), 47(女)]
[18(男), 29(女), 10(男),  1(女), 26(男), 31(女)]
[38(男), 51(女), 16(男), 33(女), 28(男), 35(女)]
[48(男), 21(女), 14(男), 45(女), 40(男), 25(女)]
[ 2(男), 43(女), 11(女)]
```

特に目新しい部分はありませんが、始めて`transpose`メソッドのお世話になりました。
Why do we use block in ruby?


何で、rubyでblockを使うのかということについて、簡単な例を書きました。
例えば、1から10の数字を表示させる場合には、blockを使っても、使わなくても実装できます。

For example, I create the both function for showing number with block and without block.
This is common way.

```ruby:test.rb
def display_number2
  (1..10).each do |v|
    puts v
  end
end

display_number2
```

I implemented by using block.

```ruby:test.rb
def display_number1(&block)
  (1..10).each do |v|
    block.call v
  end
end

display_number1 do |num|
  puts num
end
```
It is same way. just display number.
###If we want to implenent 2 functions.
One is for to display number.
The other is for adding number.

####I can share codes which is to iterate number.

```ruby:test1.rb
def loop_1_to_10(&block)
  (1..10).each do |v|
    block.call v
  end
end

def display_number
  loop_1_to_10 do |num|
    puts num
  end
end

def sum_number
  s_v = 0
  loop_1_to_10 do |num|
    s_v += num
  end
  puts s_v
end
```

####というわけで、ある処理を共通化できるのがblockのいいところなのかと思います。
####As a result, commonalize codes is good point for block.
めざせpythonライブラリマスター （48）autopep8

#【ライブラリ説明】
　pep8のスタイルにコードを変更する

#【プログラム】
プログラム実行方法
　`autopep8 --in-place --aggressive --aggressive <filename>`

実行前

```py:autopep8_before.py
import math, sys;

def example1():
    ####This is a long comment. This should be wrapped to fit within 72 characters.
    some_tuple=(   1,2, 3,'a'  );
    some_variable={'long':'Long code lines should be wrapped within 79 characters.',
    'other':[math.pi, 100,200,300,9876543210,'This is a long string that goes on'],
    'more':{'inner':'This whole logical line should be wrapped.',some_tuple:[1,
    20,300,40000,500000000,60000000000000000]}}
    return (some_tuple, some_variable)
def example2(): return {'has_key() is deprecated':True}.has_key({'f':2}.has_key(''));
class Example3(   object ):
    def __init__    ( self, bar ):
     #Comments should have a space after the hash.
     if bar : bar+=1;  bar=bar* bar   ; return bar
     else:
                    some_string = """
                       Indentation in multiline strings should not be touched.
Only actual code should be reindented.
"""
                    return (sys.path, some_string)
```

実行後

```py:autopep8_after.py
import math
import sys


def example1():
    # This is a long comment. This should be wrapped to fit within 72
    # characters.
    some_tuple = (1, 2, 3, 'a')
    some_variable = {
        'long': 'Long code lines should be wrapped within 79 characters.',
        'other': [
            math.pi,
            100,
            200,
            300,
            9876543210,
            'This is a long string that goes on'],
        'more': {
            'inner': 'This whole logical line should be wrapped.',
            some_tuple: [
                1,
                20,
                300,
                40000,
                500000000,
                60000000000000000]}}
    return (some_tuple, some_variable)


def example2(): return ('' in {'f': 2}) in {'has_key() is deprecated': True}


class Example3(object):

    def __init__(self, bar):
        # Comments should have a space after the hash.
        if bar:
            bar += 1
            bar = bar * bar
            return bar
        else:
            some_string = """
                       Indentation in multiline strings should not be touched.
Only actual code should be reindented.
"""
            return (sys.path, some_string)

```

#【参考サイト】
　[pypi](https://pypi.python.org/pypi/autopep8/1.2.1)
　[github](https://github.com/hhatto/autopep8)
【開発環境構築】ローカルWindowsPC＞Docker＞Drupal【第二章：Docker上にLAMP環境を作る】

[【第一章：はじめてのDocker Toolbox】](http://qiita.com/Elarneb/items/6555aab461e933109d1b)
【第二章：Docker上にLAMP環境を作る】　　←いまここ

## [前回](http://qiita.com/Elarneb/items/6555aab461e933109d1b)まで

１．Docker Toolboxを使ってDockerをインストールしたぞ！
２．でっていうｗｗｗｗｗｗ

## LAMP環境を作りたい（ユーザーフォルダー）
本日の先生は[こちら](http://qiita.com/kazuma1989/items/e08e8475fc5126f2363f)
ああ、どうもCentOSしかり、MySQLしかりはどこからか引っ張ってこなくちゃいけないのか・・・

>ユーザーフォルダー配下の任意の場所（たとえばC:\Users\kazuma\work\2016\mar28）に、以下のファイルを用意します

ユーザーフォルダーとは・・・
今回はWindowsPC上なので、`C:\Users\（ログインユーザー）`とかです。
普通にエクスプローラーで見ればOK。
`.docker` `.nbi`など、見慣れぬフォルダとかができているはず。

私は脳味噌にカブトムシが詰まっているので、
仮想Linuxがあるからどこかにそんなディレクトリがあるのかとか１０秒くらい悩みました。

### 注意
会社であった（フケた。後悔。）Docker勉強会資料曰く、
>Docker-machineは/Usersを以下を自動的にマウントします。つまり
/Users以下以外は自動的にマウントされません。
他のディレクトリ下をマウントしたい場合には、設定が必要です。

だそうです。
まあ、そういう難しいことはとりあえずやらない方針で・・・


■■■■今後のために一応、Docker Quickstart Terminal上で作業してみます■■■■
前回の続きで、Docker Quickstart Terminalの黒い窓にコマンドを打てばディレクトリが作れます。
クソジャリである私はコマンドもうろ覚えアンドうろ覚えだったので、誰かの助けになると信じてクドく書きます。

１．とりあえず、黒い窓に`pwd`と打ち、＜Enter＞キー押下。
　　今いるディレクトリのフルパスが表示されます。
２．`mkdir -m+w dev`  `＜Enter＞`
　　`cd ~dev`   `＜Enter＞`
　　「~/dev」が画面に表示されました。
３．もう一度`pwd` `＜Enter＞`
　　１で確認したディレクトリ下に「dev」ディレクトリが作成され、そこに移動しました。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

ここまででユーザーフォルダ以下はこうなっているはず↓
![user.png](https://qiita-image-store.s3.amazonaws.com/0/128091/b3350523-94eb-7aec-e689-6bfc3895fb84.png)


## LAMP環境を作りたい（必要ないろいろのダウンロード）

さて、お手本のとおりにファイルを作りましたよ。
![dev.png](https://qiita-image-store.s3.amazonaws.com/0/128091/e42c8817-c9fd-89e8-66c7-fd6f38a40d31.png)

ファイルの中身はやる気が感じられないレベルでお手本のとおりです。文字コードはUTF8で保存してあります。
PHPのバージョンとかは必要になったらファイルをいじればいいんでしょう・・・きっと。

Docker Quickstart Terminal上で作業用のディレクトリに移動しておいて、
`docker-compose up -d`というふっかつのじゅもんを入力して、`＜Enter＞`

![gyaaa.png](https://qiita-image-store.s3.amazonaws.com/0/128091/2f66ec63-a4cd-5041-79c7-a95d79b7151d.png)

ぎゃああああなにこれめっちゃ流れてる！！！恐い！！！！
昔アダルトサイトの変なの踏んづけたときの思い出が蘇る！！！！！

（待つこと数分）
・・・・・・お、終わった・・・のか・・・？

## LAMP環境を作りたい（できたかな？つながるかな？）

お手本の言うとおり、次は`docker-compose ps`と叩いてみましょう・・・
![8080.png](https://qiita-image-store.s3.amazonaws.com/0/128091/16bee68c-571d-43e8-619c-5e8866eced13.png)

おお・・・確かにapacheやらmysqlやら入っています。
StateがUpになっているので、DL成功です。
PortはApacheはポート80、phpMyAdminはポート8080です。（←お手本と同じことを言っているカス）
確かSkypeとかIPMessengerとか使ってると80が塞がるから変えろとかそういうのがあったと思います。
まあそのへんはXAMPPと同じですね。

では、`docker-machine ip default`を叩いてみます。
XAMPPだったらブラウザでlocalhostにアクセスすればいいんですが、
仮想サーバーが立っているのでちゃんとIPでアクセスする必要があるんですね。
私は`http://192.168.99.100`がデフォルトIPアドレスでした。
先ほど確認したPortをくっつける、つまり
Apache・・・というか作成したWebページ（今は仮で置いてあるphp.iniの表示）が見たければ`http://192.168.99.100:80`、
phpMyAdminが見たければ`http://192.168.99.100:8080`をブラウザのアドレス欄に入力すればそれぞれにアクセスできます。

よし・・・次はDrupalを導入だ！

続く！！
Bluemixでデータ分析！「dashDB」：大量データロードその３　ー「Aspera」というツールを使ってみた。

dashDB、いろいろ試してみましたシリーズ！今回は、Asperaというツールを使った大量データロードしてみました。
以下URLにほとんど書いてあったので楽勝でした。
http://qiita.com/steel_mikan/items/2e1873ffa4dc37a41dc8

この方はwindowsでやられているようなのですが、自分はMac・・・Macでできるかなーと思いトライしてみました。できました。

**普通にブラウザ経由でファイルをアップロードするのと全く同じ感覚でロードが可能です。**
ただし、ブラウザ経由で数ギガバイトのファイルをアップすると絶対はんぐるorタイムアウト、でしたが、**このAsperaさんだとギガバイト級のファイルも超スムーズにできました。素敵すぎる！**

##イメージはこんなかんじ
![aspera.png](https://qiita-image-store.s3.amazonaws.com/0/119378/feff7dec-d8bc-dd6a-7ce2-dedd9863d541.png)

「Standard」というのが、普通にブラウザでアップするとき、
Asperaというところをクリックすると、Asperaが使えます。ファイルアップロードしている具合もパーセンテージで確認することができます。このインジケータが動くのが結構早いのです・・！

あ、クライアントPCにAsperaのインストールが必要でした。これをインストールしたからといって、PCも重くならないし、というか常時起動するものでもないので、気になりません。

なので・・・たとえば、クライアントPCにインストールしていいものが制限されている環境とかだとこれは使えないけど・・・

でもそういった制約がない環境なら、これはぜひおすすめです。


## これまでの、おさらい
その１、その２ときて、今日はその３。たぶんロード系はこれくらいですかね・・・（調べた限りは・・・他DBから移行、接続とかはもっと色々あるみたいですけども）
その１はスクリプトを使ったやり方。
http://qiita.com/azzeten/items/549be71e7317c34ea57b
その２はdb2のloadコマンドを使ったやり方。
http://qiita.com/azzeten/items/73b16fc032e0844f8e32
で、今回、最後として「Aspera」という高速にファイルをアップロードする方法でした！ちゃんちゃん。
IE10で<img>にwidth=""を指定するとwidth="1"になる件

タイトルの通り、IE10で `<img>` 要素に `width=""` や `height=""` などといった空の属性を指定すると `width="1"` や `height="1"` に**強制変更**されるので注意。

これが

```html
<img src="xxx.jpg" width="" height="" alt="">
```

↓

こうなる

```html
<img src="xxx.jpg" width="1" height="1" alt="">
```

&nbsp;  

すると

&nbsp;  

&nbsp;  

**＿人人人人人人人人人人人＿**
**＞　画像が表示されない　＜**
**￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣**

&nbsp;  

&nbsp;  

空の属性はバグのもとですので、使用は避けましょう。  
というかこんなバグ初めて知りました。
ほんとにあった、怖い話です。
【Swift】【Objective-C】一番上に、一番下にスクロールする方法


###UIScrollView で一番上にスクロールする

※ UITableViewはUIScrollViewの小クラスです。

####Objective-C（UITableView で一番上にスクロールする）

Swift2

```swift2:TopScrollView.swift
self.tableView.setContentOffset(CGPointMake(0,-self.tableView.contentInset.top), animated: false);
```

Swift3

```swift3:TopScrollView.swift
self.tableView.setContent(offset: CGPointMake(0,-self.tableView.contentInset.top), animated: false);
```


####Swift（UITableView で一番上にスクロールする）

```objective-c:TopScrollView.m
self.tableView.contentOffset = CGPointMake(0, -self.tableView.contentInset.top);
```



###UIScrollView で一番下にスクロールする

####Objective-C（UITableView で一番下にスクロールする）
```objective-c:MoreDownScrollView.m
self.tableView.contentOffset =
    CGPointMake(0, self.tableView.contentSize.height - self.tableView.frame.size.height);
```
####Swift（UITableView で一番下にスクロールする）

Swift2

```Swift2:MoreDownScrollView.swift
self.tableView.setContentOffset(
    CGPointMake(0, self.tableView.contentSize.height - self.tableView.frame.size.height),
    animated: false);
```

Swift3

```Swift3:MoreDownScrollView.swift
self.tableView.setContent(offset: 
    CGPointMake(0, self.tableView.contentSize.height - self.tableView.frame.size.height),
    animated: false);
```

## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/
めざせpythonライブラリマスター （47）deckor

#【ライブラリ説明】
　役に立つデコレータが使える

#【プログラム】
```py:deckor.py
# -*- coding: utf-8 -*-

import deckor

@deckor.timer
def fact(x):
    if x <= 0:
        return 1
    return x*fact(x-1)
    
fact(5)
'''
Time: 0.000000s
Time: 0.000000s
Time: 0.000000s
Time: 0.000000s
Time: 0.000000s
Time: 0.000000s
120
'''
    
@deckor.cacheit
def fact(x):
    if x <= 0:
        return 1
    return x*fact(x-1)
    
fact(5)
# 120
    
@deckor.trace
def fib(x):
    if x < 2:
        return x
    return fib(x-1)+fib(x-2)

print fib(5)
'''
|--> fib(5)
|    |--> fib(4)
|    |    |--> fib(3)
|    |    |    |--> fib(2)
|    |    |    |    |--> fib(1)
|    |    |    |    |    |--> return 1
|    |    |    |    |--> fib(0)
|    |    |    |    |    |--> return 0
|    |    |    |    |--> return 1
|    |    |    |--> fib(1)
|    |    |    |    |--> return 1
|    |    |    |--> return 2
|    |    |--> fib(2)
|    |    |    |--> fib(1)
|    |    |    |    |--> return 1
|    |    |    |--> fib(0)
|    |    |    |    |--> return 0
|    |    |    |--> return 1
|    |    |--> return 3
|    |--> fib(3)
|    |    |--> fib(2)
|    |    |    |--> fib(1)
|    |    |    |    |--> return 1
|    |    |    |--> fib(0)
|    |    |    |    |--> return 0
|    |    |    |--> return 1
|    |    |--> fib(1)
|    |    |    |--> return 1
|    |    |--> return 2
|    |--> return 5
5
'''
```

#【参考サイト】
　[pypi](https://pypi.python.org/pypi/deckor/0.0.1)
　[github](https://github.com/amitt001/deckor)
HTTP→Fluentd→S3&MySQL

PHPフロントエンドから内部ログをS3とMySQL(MariaDB)に格納するメモ。
S3の後にMySQLに入れようとして引っかかったので、その記録。

・使用するFluentdプラグインのインストール
/opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-s3
/opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-forest
/opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-uri_decoder
sudo yum install mysql-devel
sudo yum install gcc-c++
/opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-mysql
※mysql-develとgcc-c++はfluent-plugin-mysqlのインストールに必要

・送信側PHP
HTTP通信のレイテンシーを考えるとローカルにFluentd入れて経由させるべきなのかもしれないけど、
稼働中の本番環境を変更したくなかったのでHTTPで送信
$keywordはurl_encode()されている。

        $postdata = array(
           'keyword' => $keyword,
           'hogehoge' => $hogehoge,
           'mogemoge' => $mogemoge
        );
        $postjson = json_encode($postdata);
        $postoption = array('http' => array(
           'method' => 'POST',
           'content' => "json=".$postjson
        ));
        $posturl = "http://fluentdsrv:24225/geo.internal_log";
        $postrlt = file_get_contents($posturl, false, stream_context_create($postoption));

・受信側Fluentd
最初はmatchのタグを変えて
uri_decode→S3保存→MySQL保存
でやろうとしていたのだけど、S3とMySQLがシーケンシャルにできないことが判明。
http://qiita.com/nagais/items/ca96af840b8061102551
＞fluentdは一つのイベントに対して、先にマッチするものがあると後のmatch句は効かない。
今思うとremove_prefix,add_prefix後のタグでS3保存が動いていたので、後続のmatchが動いていなかったのだろう。
type forest利用時の注意点かと。
ともあれ、シーケンシャルに動作できないのならtype copyを使用して複数<store>で記載。

```xml
<source>
  type http
  port 24225
</source>
<match geo.internal_log>
  type uri_decode
  key_names keyword
  remove_prefix geo
  add_prefix decoded
</match>
<match decoded.internal_log>
  type copy
  <store>
    type forest
    subtype s3
    <template>
      aws_key_id IDだよ
      aws_sec_key 鍵だよ
      s3_bucket バケツ名だよ
      s3_region ap-northeast-1
      s3_object_key_format %{path}%{time_slice}_%{index}.log.gz
      buffer_path /var/log/fluent/s3/internal/
      store_as gzip

      path logs/internal/
      time_slice_format %Y%m%d/%H_internal
      time_slice_wait 10m
    </template>
  </store>

  <store>
    @type mysql_bulk
    host DBホスト
    port ポート番号
    username DBユーザー名
    password DBパスワード

    database データベース名
    table テーブル名
    include_time_key yes　※要らないかも

    column_names id, datetime, keyword, hogehoge, mogemoge
    key_names id, ${time}, keyword, hogehoge, mogemoge

    flush_interval 10s
  </store>
</match>
1クリックでイベントハンドラのコードを探す方法

Web のフロントエンド開発といえば、イベント処理を避けて通ることはできませんよね。UI 作っていて、こういうこと思ったことないですか？

「このボタン押した時、思ったのと違う動きしてるな」

こういうことを思う時は、大抵イベントハンドラが正しく設定されていません。そこで、その要素についているイベントハンドラを探すことになります。大抵はこんな感じでイベントハンドラを探すのではないでしょうか：

1. document.querySelector なんかを呼んで、その要素への参照を取得している部分を探して、要素の代入されている変数名を調べる
2. 調べた変数名でソースコードを検索して、イベントハンドラを設定している部分を見つける
3. 見つけたイベントハンドラの中身を読む

これは結構面倒です。まず、コードをたくさん読んだり探したりしなくちゃいけません。

そこで使えるのがインスペクタです。[Firefox の開発ツール](https://developer.mozilla.org/ja/docs/Tools)の[インスペクタ](https://developer.mozilla.org/ja/docs/Tools/Page_Inspector)を使うと、ソースコードを読まなくても、その要素についているイベントハンドラを見つけられます。

## 見つけ方

まず開発ツールを起動します。メニューのツールから、Web開発を選んで、その後インスペクタを選びます。

<img width="446" alt="スクリーンショット_2016-06-07_18_33_35.png" src="https://qiita-image-store.s3.amazonaws.com/0/46418/ccdfd94a-acbc-94b1-fd03-8a0626de7e5b.png">


そして開発ツールのインスペクタタブの左どなりにある、![スクリーンショット 2016-06-07 18.23.04.png](https://qiita-image-store.s3.amazonaws.com/0/46418/2b927aab-9cbe-45da-02c1-a701ccaae7c4.png)アイコンをクリックします。

そうするとブラウザの画面上でマウスポポインタが重なった要素が、インスペクタで表示されるようになります。

![select-element.png](https://qiita-image-store.s3.amazonaws.com/0/46418/75b7c00c-df71-fb68-5727-c6535047a304.png)

調査したい要素の上でクリックします。そうすると、インスペクタでその要素が協調されたままになります。その後、インスペクタの要素の横についている "ev" をクリックすると、その要素についているイベントハンドラがポップアップで表示されます。

![event-handler.png](https://qiita-image-store.s3.amazonaws.com/0/46418/83836be5-ed87-6aff-dadd-3bd892fdfca7.png)

ポップアップをクリックすると、展開されて、ハンドラのコードが表示されます。

![expand-handler.png](https://qiita-image-store.s3.amazonaws.com/0/46418/b63a80c7-8f2e-baf7-128b-24b195a98e71.png)

## まとめ

これでコードを読まなくても、イベントハンドラを探すことができるようになりました。

複数ハンドラが設定されれる場合はそれぞれ分けて表示されますし、ハンドリングするイベントもちゃんと表示されます（スクリーンショットのハンドラは click イベントをハンドリングしています）。変なハンドラが付いているときや、同じハンドラが二重についている場合なんかも、一目でわかって楽ですね。

みなさまのデバッグライフが、少しでも楽になれば幸いです。
JETSON TX1が来てやったこと（１日目）

注：筆者はLinux初心者のため、本記事には不正確な内容が含まれる可能性があります。
Host側PCのOSはUbuntu 14.04 LTS 日本語 Remix ですが
アップデートしてからディスプレイ周りの挙動がおかしくなった気がしています。ボスケテ！

#電源投入まで
開発キットの内容物確認
・本体（TX1＋開発ボード＋カメラモジュール）
・電源ケーブル
・Wi-Fiアンテナx2（黒いオールみたいなやつ）
・USBケーブル (A to micro-B)
・USB変換コネクタ (micro-A to A)
・ペラ紙２枚
このうち、USB変換コネクタ以外は使うので出しておく

自分で用意する必要があるものは以下
・USBキーボード
・USBマウス
・USBハブ（有ったほうが良い）
・HDMIディスプレイ（電源、ケーブル）
・Host PC (Ubuntu 64bit インストール済）

添付のQUICK START GUIDEを参考に各種ケーブルを接続して、電源を投入する。
Wi－Fiアンテナは別に付けなくても動く。電波強度次第？

（以下の処理は必要なかったらしいが、一応記載しておく）
CUIが起動するので、表示された通りにコマンドを打つと環境構築が進み、Ubuntuが起動するようになる。
電源を入れてもファンが回らないので少し焦る。常温だとファンは回らない、らしい。
あと、最初の再起動ではUbuntuが起動しない事があった、焦る。
（もう一度再起動すると問題なく起動した）

#開発環境インストール？
参考にさせて頂きました：[CB1300SFのある生活](http://cb1300sf.info/archives/category/programming/jetson-tx1)

ここからは、Host PCでの作業となります。
Deep Learning (DIGITS) で遊ぶためにUbuntuインストールしていたので致命傷は回避できました。

NVIDIAのサイトから「Jetpack for L4T」をダウンロードする。（要登録）
https://developer.nvidia.com/embedded/jetpack
以下、Jetpack 2.1 について記載

こいつをHost PCにインストールする。
（TX1にインストールしようとすると怒られます）
この時、TX1側のデータは全て上書きされるので電源投入時のインストール作業は無駄になる。
途中、TX1との接続を求められるので画面の指示に従う。具体的には
1. 電源を落とす（ケーブルも抜く）
2. Host PCとUSB接続する。TX1側は、micro-Bポートに接続する。
3. TX1の電源を立ち上げる。電源→リカバリ（押しっぱなし）→リセット→リカバリ（離す）の順
4. Host PC側でEnterを押すと、インストール処理が次へ進む
手順4において、Enterを押す前にターミナルで以下のコマンドを実行する。
```lsusb```
デバイス一覧に「NVidia Corp.」というのが見えていればOK。
インストールが完了するまで数時間掛かるので、のんびり待つ。

あと、インストーラがTX1側のIPアドレスを取得するシーケンスがあるので
Host側でメッセージが表示されたら、TX1側でネットワーク設定をする
（恐らく、HostとTX1を直結してる場合やパス無しDHCPの場合などは問題ない）

以上でTX1側にLinux+GPU動作環境の構築が完了
Host側にもクロスコンパイラ環境が構築されるようですが、まだ触ってないので全く実感が湧きません。

#動作確認
インストール後、TX1側のホームディレクトリに大量のデータが生成されています。
この中で、「NVIDIA_CUDA_*.*_Samples/bin/...」というフォルダにサンプルソフトが置かれているので、適当に動作させます。
分かりやすいのはSobelFilter、実行するとLennaさんが100FPSくらいで表示されます。

#カメラモジュールについて
[Enabling camera on Jetson TX1 board](https://devtalk.nvidia.com/default/topic/898129/enabling-camera-on-jetson-tx1-board/)
上記ページを参考に、何も考えず以下のコマンドを打ち込む（長いわ）
```    gst-launch-1.0 nvcamerasrc fpsRange="30.0 30.0" ! 'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, format=(string)I420, framerate=(fraction)30/1' ! nvtee ! nvvidconv flip-method=2 ! 'video/x-raw(memory:NVMM), format=(string)I420' ! nvoverlaysink -e```
壊れてなければ、カメラ画像が表示されるはず。カメラの保護フィルムは剥がしてね
で、このカメラ何者？下記ページによるとOV5693なのかな？
[TX1 camera driver source code](https://devtalk.nvidia.com/default/topic/904691/?comment=4761022)

#その他
ここからは、Linux経験者なら造作も無い手順だと思いますが

・ディスプレイ解像度について
　デフォルトだと800x600とか、小さすぎて満足に操作できない解像度になってて困るので
　System Setting → Displays から、解像度を変更します。
　ただ、解像度を変えても「Apply」ボタンが画面外に居るせいで押せないんだよなぁ……
　Shift+Tabでカーソルを移動して、無理やり押します。
　（Applyボタンは画面の一番後ろにあるので、見えなくても何とかなる）

・キーボード配列／日本語入力について
　デフォルトだと英語設定、キーボードも英語配列なので記号とかマトモに打てなくて困ります。
　当然、日本語入力も出来ませんので、まずは以下のページを参考に日本語配列に戻します。
　http://qiita.com/jjjiii26/items/af134896483ae9d32a7d
　続いて日本語入力のため、Mozc（Linux版のGoogleIMEらしい）をインストール。ﾓｽﾞｸ!（裏声）
　http://qiita.com/kazoo04/items/d8747aa0235d7dfef70c

初日の作業はこんなところ。
さて、ここから何をどう触ったらいいものやら……
HTMLの親子構造を無視したHTMLをinnerHTMLに入れたときの挙動

とあるHTMLテンプレートエンジンを使っているときに遭遇して2週間苦しんだので書く。

# 何があったのか

テンプレートにはしっかり書いたHTMLエスケープとメソッド。
しっかりとメソッドもテンプレート側にオブジェクトとして渡している。
が、何も表示されない。デバッグログにも何もなし。

# 結論

## tbody要素直下にエスケープ文字列を入れていた。

つまりこう書いていた。

``` template.html
<table>
<! -- 中略 -- >
  <tbody>
    {{this.hogefuga()}}
  </tbody>
</table>
```

## tbody直下には文字列なんて来ない。

ということでよろしくMozilla Developer Network先生。

[HTMLTableSectionElement - Web API インターフェイス | MDN](https://developer.mozilla.org/en-US/docs/Web/API/HTMLTableSectionElement)

とりあえず言えることは、こいつには **文字列を格納するプロパティはない** ということである。

そのため、それが処理できずに消失するという現象が発生したと思われる。

ということで、
詳しい方、もっと良い解説お願いしますorz
Chefを使ってOracle製品のサイレント・インストールの準備してみた


# 概要
Oracle製品をインストールする時にインストール・ウィザードを立ち上げて構成を決めながらインストールするのもよいですが、次のような場合は冗長な作業に思う事がないでしょうか

- 構成を予め決めている環境を作成する場合
- 同一の環境を複数作成する場合
- GUIがない状況で環境を作成する場合

そのような時には、**サイレント・インストール**が利用できます。
そのサイレント・インストールを実行するには、**Inventory Pointer Location File (oraInst.loc)**を事前に作成しておく必要があります。
このInventory Pointer Location Fileの作成をChefを利用して行ってみます。

# Inventory Pointer Location File
Oracle製品のインストーラは、**インベントリ・ディレクトリ**を利用して、システムにインストールしているOracle製品をトラッキングを行います。
このインベントリ・ディレクトリの情報を格納しているファイルが**Inventory Pointer Location File (oraInst.loc)**です。

## oraInst.locファイルの内容
oraInst.locファイルに含まれる情報は非常にシンプルで次の２行だけです。

```oraInst.loc
inventory_loc=インベントリ・ディレクトリのフルパス
inst_group=書き込み権限を持つグループ名
```

# Chefを使ってやりたい事
Chefを使ってoraInst.locファイルに設定するインベントリ・ディレクトリやグループ名をパラメータ化して生成できるようにします。

## 今回作成するRecipe
- oraInst.locファイルの作成
  - インベントリ・ディレクトリ及びインストール・グループ名のパラメータ化

# Recipe. oraInst.locファイルの作成
以下の３種類のoraInst.locファイルで作成します。
- Recipe
- Template
- Attribute

TemplateでoraInstの骨子を作り、Attributeでデフォルトパラメータを定義し、Recipeでパラメータを利用してoraInst.locファイルを生成・配置します。

- Template

```templates/default/oraInst.loc.erb
inventory_loc=<%= @inventory_location %>
inst_group=<%= @inventory_group %>
```

inventory_locationシンボルとinventory_groupシンボルで定義されているハッシュ値をそれぞれ取得して設定しています。

- Attribute

```attributes/default.rb
default['inventory']['group'] = 'oinstall'
default['inventory']['owner'] = 'oracle'
default['inventory']['oraInst'] = '/root/oraInst.loc'
default['inventory']['location'] = '/u01/app/oraInventory'
```

パラメータのデフォルト値を設定しています。

- Recipe

```recipes/deploy.rb
directory node['inventory']['location'] do
  owner node['inventory']['owner']
  group node['inventory']['group']
  recursive true
  mode 0775
end
template node['inventory']['oraInst'] do
  source 'oraInst.loc.erb'
  owner node['inventory']['owner']
  group node['inventory']['group']
  mode '0644'
  variables(
    inventory_location: node['inventory']['location'],
    inventory_group: node['inventory']['group']
  )
end
```

templateリソースを利用してoraInst.loc.erbを配置し、オーナー及びパーミッション設定を行います。

# まとめ
サイレント・インストールを行う際には必須になるので、Oracle製品環境を作るときには実行しておくとよいかもしれないですね。
実際に各製品のサイレント・インストールを行うには、oraInst.locに加えて各製品のレスポンス・ファイルが必要になります。

-[今回のレシピ：https://github.com/shinyay/chef-oracle-inventory/blob/publish_20160607](https://github.com/shinyay/chef-oracle-inventory/blob/publish_20160607 "chef-oracle-inventory")
H2+Slick設定メモ


# H2 Database

## 1.Download

* MACの場合

http://www.h2database.com/html/main.html
から
All Platforms (zip, 8 MB)
をダウンロードしてzipを解凍

## 2. 起動

zipを解凍したディレクトリ以下のbinディレクトリに移動

```
cd h2/bin
```


下記を実行して起動

```
bash ./h2.sh
```

### 管理画面

ブラウザに管理画面が表示される

![スクリーンショット 2016-04-05 17.38.14.png](https://qiita-image-store.s3.amazonaws.com/0/66839/10d8cbc2-19e2-c5c6-6479-ff5b7b8fd1e8.png "スクリーンショット 2016-04-05 17.38.14.png")

* 日本語に変更

![スクリーンショット 2016-04-05 17.39.23.png](https://qiita-image-store.s3.amazonaws.com/0/66839/c28e7fe4-052c-8493-e62d-d8923184cc32.png "スクリーンショット 2016-04-05 17.39.23.png")

#### 接続

* デフォルトはパスワードなし


## create table

```
create table USERS (
  ID INTEGER IDENTITY,
  NAME VARCHAR NOT NULL
);
```


# Slickコード生成

## slick-codegenを使う。

作業用ディレクトリにgit cloneする

```
$ git clone https://github.com/slick/slick-codegen-example.git
```

create.sqlを書き換える。

```
$ cd <work_dir>/slick-codegen-example/src/main/sql
$ ls
create.sql
```

```
$ cat create.sql
create table IF NOT EXISTS "USERS" (
  ID INTEGER IDENTITY,
  NAME VARCHAR NOT NULL
);

```

sbt gen-tablesを実行する。

```
$ cd <work_dir>/slick-codegen-example
$ sbt gen-tables
```

Tables.scalaが出来るのでプロジェクトにコピーして使う。

* デフォルトではpackageが「demo」になっている。

```
$ cd target/scala-2.11/src_managed/slick/demo
$ ls
Tables.scala
```
C > 範囲に入っているかどうか > [A,B)

```txt:動作環境
組込みC (ライブラリを極力使わない)
```

## 問題の定義

以下、`[`はclose, `(`はopenの領域として扱う。
関連 https://en.wikipedia.org/wiki/Interval_(mathematics)

### 設定項目

setting: [A,B)

A,Bはいずれも[0,360)の値が入る

- 例1: [10,100)
- 例2: [330,60)

### データ

data:[0,360)の範囲の値

- 例a: 100
- 例b: 359

etc.

### 範囲内の定義

dataがsetting:[A,B)に入っていること

ただし、A > Bの場合は以下のいずれかが成立すること

- A <= data < 360
- 0 <= data < B

## 実装

上記の処理を実装した。
エラー処理は省略。

実装方法の考慮点としては、checkInOut()内の処理を簡略化すること。
checkInOut()内のif文が複雑になってしまうと、settings[]を数十セット設定するときにカオスになりそうなため。

http://ideone.com/89GM6L

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

/*
setting: [A,B)
data: [0,360)
---
example of setting: [A,B)
  - Case A: [330, 60)
  - Case B: [ 10,100)
*/

void checkInOut(float data, float rng1[2], float rng2[2])
{
	if ( (data >= rng1[0] && data < rng1[1]) ||
		(data >= rng2[0] && data < rng2[1]) ){
		printf("%.0f inside\r\n", data);
	} else {
		printf("%.0f outside\r\n", data);
	}
}

void setRanges(float setmin, float setmax, float rng1[2], float rng2[2])
{
	if (setmin > setmax) {
		rng1[0] = setmin;
		rng1[1] = 360.0;
		rng2[0] = 0.0;
		rng2[1] = setmax;
	} else {
		rng1[0] = 0.0;
		rng1[1] = 0.0;
		rng2[0] = setmin;
		rng2[1] = setmax; 
	}
}

int main(void) {
	float rng1[2]; // range 1 [min,max)
	float rng2[2]; // range 2 [min,max)

	// Range A
	setRanges(/* setmin=*/10, /*setmax=*/100, &rng1[0], &rng2[0]);
	checkInOut(10, rng1, rng2); // inside
	checkInOut(100, rng1, rng2); // outside
	checkInOut(200, rng1, rng2); // outside

	printf("---\n");
	
	// Range B
	setRanges(/* setmin=*/330, /*setmax=*/60, &rng1[0], &rng2[0]);
	checkInOut(330, rng1, rng2); // inside
	checkInOut(359, rng1, rng2); // inside
	checkInOut(10, rng1, rng2); // inside
	checkInOut(60, rng1, rng2); // outside

	return 0;
}
```

```txt:結果
Success	time: 0 memory: 2160 signal:0
10 inside
100 outside
200 outside
---
330 inside
359 inside
10 inside
60 outside
```

それなりに動いている感じではある。
Cloudera DirectorでCDH5.7を入れる方法

AWSやGCPにさくっとHadoopクラスターを立てられるCloudera Directorですが、皆さん使っているでしょうか？

一つのDirectorサーバーからマルチCloudをまたいでクラスターを立てたり、ノード数の変更もお手軽にできたりととても簡単なので、是非試してみてください。
なお、僕はこの動画を見て試してみて、その日のうちにClusterを管理できるようになっていました。
https://vimeo.com/120721587

導入方法は以下が参考になります。

- 公式（英語だけど、step by stepでめっちゃ丁寧）
  - AWS: [Setting up the AWS Environment](http://www.cloudera.com/documentation/director/latest/topics/director_aws_setup_client.html)
  - GCP: [Creating a Google Cloud Platform Project](http://www.cloudera.com/documentation/director/latest/topics/director_gcp_setup.html)
- 日本語の説明（補足的に見るといい）
  - [Cloudera Director のインストール方法 - Qiita](http://qiita.com/shiumachi/items/90649830cb9b45726d99)

ちなみに、今回はAWSで試しましたが、インスタンスは以下のようにしました。
- Directorサーバー: c4.large
- Cloudera Manager, masterサーバー: m4.xlarge, root volume: gp2 50GB
- workerサーバー: m4.xlarge, root volume type: standard 100GB

この設定中で、一点だけハマったところがありました。
現在、最新のCDHは5.7.1なのですが、Cloudera Director 2.0ではCDH 5.5が入ってしまいます。
2箇所設定をするだけで、CDH 5.7が入れることができます。 **が、凄い気づきにくいので** やり方を共有します。

# 設定ポイント

- Cloudera ManagerのRepository URL
- Default ParcelのRepository URL

## Cloudera ManagerのRepository URL

デフォルトでは、レポジトリURLの設定が出てきません。
なので、`Configurations (optional)`を選び `Override default Cloudera Manager repository`というチェックボックスにチェックを入れます。

![Screen_Shot_2016-06-06_at_12_43_40.png](https://qiita-image-store.s3.amazonaws.com/0/11143/d7a76f1f-bb4f-cfb7-be4e-4bb0e9c12edf.png)

すると、Cloudera ManagerのレポジトリURLの設定が出てくるので、 Exampleをコピーして、`5.5` とあるのを`5.7`に置換しましょう。
今回は `http://archive.cloudera.com/cm5/redhat/6/x86_64/5.7/` としました。

![Screen_Shot_2016-06-06_at_12_43_53.png](https://qiita-image-store.s3.amazonaws.com/0/11143/b07f4d7f-dc56-f92e-7ca2-aeaf9c592063.png)

## Default ParcelのRepository URL

Cloudera Managerでは、HiveやSparkなどの各コンポーネントはParcelで管理されています。yumのrpmやapt-getのdebみたいな感じです。
それのリポジトリも、デフォルトだと5.5を向いているので、5.7にしないといけません。

Cloudera Managerの立ち上げ後、masterやworkerのインスタンスを起動する際にオプションで与えます。
例によって、`Override default parcel repositories`にチェックを入れます。

<img width="710" alt="Screen_Shot_2016-06-06_at_23_42_57.png" src="https://qiita-image-store.s3.amazonaws.com/0/11143/1bc6093b-2f5a-3a04-524f-5a9f0bb0068c.png">

すると、parcelレポジトリのURLが指定できるようになるので、Cloudera Managerと同様にExampleをコピーして`5.5`を`5.7`に置換します。
今回は `http://archive.cloudera.com/cdh5/parcels/5.7/` といれます。

<img width="788" alt="Screen_Shot_2016-06-06_at_23_43_03.png" src="https://qiita-image-store.s3.amazonaws.com/0/11143/de4b6ea3-a833-2db2-8429-5df7ece701e9.png">

これでCDH 5.7でGAになった Hive on Sparkも試したい放題ですね！
CakePHPの組み込み例外メモ

CakePHPの組み込みの例外

* MethodNotAllowedException
* NotFoundException
* ForbiddenException

HTTPレスポンスエラーを返したい時に上記の例外を使えばすっきり書ける

http://book.cakephp.org/2.0/ja/development/exceptions.html
Check! DC/OS CLI を Windows にインストールする

こんにちは、オークファンの @dz_ こと大平かづみです。


Prologue - はじめに
====
[DC/OS](https://dcos.io "The Definitive Platform for Modern Apps | DC/OS") の CLI を Windows にインストールしてみます。

以下のドキュメントを参考に進めました。このドキュメントには、 Mac, Linux でのインストール方法も記載があります。

- [Installing the CLI - Mesosphere DCOS Documentation](https://docs.mesosphere.com/usage/cli/install/ "Installing the CLI - Mesosphere DCOS Documentation")

前提条件
----

- `pip` がインストールされていること
- 管理者権限で PowerShell のプロンプトを使います

インストール手順
====
インストーラーの準備
----
```ps1
# virtualenv をインストールする
PS> pip install virtualenv

# インストール先のディレクトリを作成する
PS> mkdir dcos && cd dcos

# インストーラーをダウンロードする
PS> wget https://downloads.dcos.io/dcos-cli/install.ps1 -OutFile install.ps1

# インストーラーの実行権限を調整する
PS> set-executionpolicy Unrestricted -Scope Process
```

インストール
----
インストールする際は、「masterノードへのURL」を指定します。 [Azure Container Service](https://azure.microsoft.com/ja-jp/services/container-service/ "Azure Container Service | Microsoft Azure") を利用する場合は、SSHトンネル接続後 `localhost` で接続するので、 `http://localhost` としてください。

また、途中で環境変数の `PATH` に追加してよいか聞かれますので、 `Y` と答えて進めてください。
 
```ps1
# インストールを実行する
PS> .\install.ps1 . https://<masterノードへのURL>

True
True
Installing DCOS CLI from PyPI...

New python executable in C:\Users\user\dcos\Scripts\python.exe
Installing setuptools, pip, wheel...done.


    ディレクトリ: C:\Users\user


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2016/06/07     17:01                .dcos


    ディレクトリ: C:\Users\user\.dcos


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2016/06/07     17:01              0 dcos.toml
[core.reporting]: set to 'True'
[core.dcos_url]: set to 'http://<masterノードへのURL>'
[core.timeout]: set to '5'
Modify your Environment to add DCOS to your PATH?
[Y] Yes  [N] No  [?] ヘルプ (既定値は "Y"): Y    # <-- Y を入力


Finished installing and configuring DCOS CLI.

Run this command to set up your environment and to get started:
& activate.ps1; dcos help
```



```ps1
# dcos を有効にする
PS> & .\Scripts\activate.ps1; dcos help
```

これで、 `dcos` コマンドが使えるようになりました！

Epilogue - おわりに
====
`dcos` コマンドを使って何ができるかを、引き続き確認していきます。
踏み台のある環境で検証環境からmysqlのテーブルデータを取得するときの方法

#1.業務でたまにあること
本番や検証の環境から、mysqlのデータをパクリたいことが。。
踏み台サーバがあると少々めんどくさいことに。
なので、ローカルからデータを持ってくる方法を調べた

#2.コマンドたち

##2-1サーバへのトンネルあける
```sql:サーバへのトンネルあける
    ssh -f -N -L 3307:サーバのホスト:3306 -i /home/vagrant/.ssh/xxxxxx ユーザ@踏み台サーバのIPアドレスまたはFQDN
```
①ローカル側の3307のポートを3306(サーバにあるMysqlのホスト)にマッピングする。3307でなくてもOK
②xxxxxxの部分はサーバのキー。必要であれば指定する。

##2-2サーバに存在するテーブルから持ってくる
```sql:サーバに存在するテーブルから持ってくる
    mysqldump -u pユーザ -p -h 127.0.0.1 --port=3307 -S /var/run/mysql-default/mysqld.sock -t スキーマ テーブル名 > 　/home/vagrant/Desktop/test.log
```
①-S /var/run/mysql-default/mysqld.sock　こちらは必要あれば。

##2-3ローカルにリストア
```sql:ローカルにリストア
    mysql -u root -p -S /var/run/mysql-default/mysqld.sock スキーマ < /home/vagrant/Desktop/test.log
```

##2-4サーバへのトンネルをタスクkill
```sql:サーバへのトンネルをタスクkill
    ps aux | grep ssh | grep rdb | sed "s/\s/\t/g" | cut -f4 | xargs kill -9
```
#3.使い道
shell化すれば対象のテーブルを簡単に同期できそう。あまりデータ多いテーブルには使えないが。
git 

![Kobito.1Y3rIu.png](https://qiita-image-store.s3.amazonaws.com/0/121478/ad495582-93ea-500d-8acd-82e5b21ab3da.png "Kobito.1Y3rIu.png")

编辑模式（未提交）与本地仓库一样的情况。

![Kobito.Zr5srU.png](https://qiita-image-store.s3.amazonaws.com/0/121478/73092f72-6091-4d62-0f34-ca6e1eb0c78a.png "Kobito.Zr5srU.png")

编辑模式（未提交）修改文件，没有提交的情况（VS 本地仓库的对比）。

![Kobito.BIEZmm.png](https://qiita-image-store.s3.amazonaws.com/0/121478/733aa9be-f2e4-347c-5b12-52e39f2730a5.png "Kobito.BIEZmm.png")

第一个是从远程更新本地仓库，


修改代码的时候首先看一下  本地仓库 和 远程仓库的是不是同步的，比如  origin /xubin_dev
retrofit2.0:

 https://realm.io/cn/news/droidcon-jake-wharton-simple-http-retrofit-2/
 http://bxbxbai.github.io/2015/12/13/retrofit2/
 restful:
 http://www.ruanyifeng.com/blog/2014/05/restful_api.html
 retrofit 1.* 与retrofit2.0区别 
 http://www.ruanyifeng.com/blog/2014/05/restful_api.html
 retrofit源码
 
 http://www.cnblogs.com/angeldevil/p/3757335.html
google java 编码规范


＃文件名
  源文件以其最顶层的类名来命名，大小写敏感，文件扩展名为.java。
＃编码方式
  UTF－8
＃结构
一个源文件包含(按顺序地)：
许可证或版权信息(如有需要)
package语句
import语句
一个顶级类(只有一个)
＊＊＊以上每个部分之间用一个空行隔开。
＃package
(即package语句写在一行里)
＃import
不要出现类似这样的import语句：import java.util.*;
(每个import语句独立成行)
import语句可分为以下几组，按照这个顺序，每组由一个空行分隔：
所有的静态导入独立成组
com.google imports(仅当这个源文件是在com.google包下)
第三方的包。每个顶级包为一组，字典序。例如：android, com, junit, org, sun
java imports
javax imports
组内不空行，按字典序排列。
＃类声明
3.4.1 只有一个顶级类声明
每个顶级类都在一个与它同名的源文件中(当然，还包含.java后缀)。
例外：package-info.java，该文件中可没有package-info类。
3.4.2 类成员顺序
类的成员顺序对易学性有很大的影响，但这也不存在唯一的通用法则。不同的类对成员的排序可能是不同的。 最重要的一点，每个类应该以某种逻辑去排序它的成员，维护者应该要能解释这种排序逻辑。比如， 新的方法不能总是习惯性地添加到类的结尾，因为这样就是按时间顺序而非某种逻辑来排序的。
3.4.2.1 重载：永不分离
当一个类有多个构造函数，或是多个同名方法，这些函数/方法应该按顺序出现在一起，中间不要放进其它函数/方法。
＃大括号
4.1.1 使用大括号(即使是可选的)
大括号与if, else, for, do, while语句一起使用，即使只有一条语句(或是空)，也应该把大括号写上。
4.1.2 非空块：K & R 风格
对于非空块和块状结构，大括号遵循Kernighan和Ritchie风格 (Egyptian brackets):
左大括号前不换行
左大括号后换行
右大括号前换行
如果右大括号是一个语句、函数体或类的终止，则右大括号后换行; 否则不换行。例如，如果右大括号后面是else或逗号，则不换行。
示例：

``` java 
return new MyClass() {
  @Override public void method() {
    if (condition()) {
      try {
        something();
      } catch (ProblemException e) {
        recover();
      }
    }
  }
}; 
```
Cloud imageをCloudで使わずにqemu/libvirt(virsh)で起動させる

#Cloud imageをCloudで使わずにqemuで起動させる

本記事ではRedhat,Ubuntuが提供しているCloudイメージをlibguestfsを使って通常のQemu(libvirt)から起動できるようにします。

#はじめに
最近はAWS等のサービスもあって、またUbuntuのcloud-initの普及も相俟ってISOのCDイメージだけではなく、プリインストール済みのVMイメージも配布されるようになりました。その中でもCloudイメージはOpenStack/AWSで使えることもあって非常に一般的になっています。
ですがCloudイメージはcloud-initというツールが入っており、そのままqemu/virshで起動するとログインができません。まぁ、Cloudで動くことを前提としている訳ですから動きませんよね。
しかし、自宅のちょっとした環境などで毎回インストールをするのもめんどい訳ですし、せっかくあるこのCloudイメージを使って家でも簡単にイメージを起動したいと思うのは人の常なのではないでしょうか。

ということで、このページではそれらのCloudイメージを元に、cloud-initを外した上で通常のpassword認証を使ってqemu/virshで普通にログインする方法について説明します。

現在のところRHELとUbuntuですが必要に応じて増える予定です ;)

### (補足) Gentooの方へ
libguestfsのemergeの際には"ocaml"をUSEに入れてからemergeしないとvirt-customizeが入りませんのでご注意下さい。

# 手順

下の\<image file\>にqcow2(又は他の)イメージファイル、<password>にrootのパスワードを入れて実行して下さい。

## Redhat系列(RHEL, CentOS, Fedora)の場合
```lang:shell
virt-customize -a <image file> --run-command 'yum remove cloud-init* -y' \
 --root-password password:<password>
```

又は

```lang:shell
virt-customize -a <image file> --run-command 'touch /etc/cloud/cloud-init.disabled' \
 --root-password password:<password>
```

## Ubuntu (XenialXerus, 16.04の場合)
```lang:shell
virt-customize -a <image file> --run-command 'apt-get remove -y cloud-init' \
 --run-command 'apt-get purge --auto-remove -y cloud-init' \
 --run-command 'ssh-keygen -A' \
 --root-password password:<password>
```

## Gentoo ([Gentoo Cloud Image](http://gentoo.osuosl.org/experimental/amd64/openstack/)の場合)
かなり力技ではあるのですが、こんな感じでイケます。ログイン後に`emerge -C cloud-init`を使うことで削除も可能です。

```lang:shell
virt-customize -a <image file> \
--run-command 'rc-config delete cloud-init-local boot' \
--run-command 'rc-config delete cloud-init default' \
--run-command 'rc-config delete cloud-final default' \
--run-command 'rc-config delete cloud-config default' \
--root-password password:<password>
```

## sshdの設定
Cloudイメージの場合sshdはplain passwordの設定を無効にしています。
もしsshdでログインしたい場合には以下の設定を変更しましょう。セキュリティ的には問題があるとも思われますので、実際のネットワークに繋げる場合にはお気をつけ下さい。
### /etc/ssh/sshd_configの設定
```
PermitRootLogin yes
PasswordAuthentication yes
```
### 鍵の作成
```
ssh-keygen -f /etc/ssh/ssh_host_rsa_key -N '' -t rsa
ssh-keygen -f /etc/ssh/ssh_host_dsa_key -N '' -t dsa
```
【Python】コマンドラインパーサーclickのテスト方法

## なにこれ
Pythonで[click](http://click.pocoo.org/5/)をつかったコンソールアプリを作った時に、パラメータがちゃんと渡ってるかテストしたい時ありますよね。CliRunnerを使うと、clickで作ったアプリケーションのテストが出来ます。

## 基本的な例

```py
import click
from click.testing import CliRunner

def test_hello_world():
    @click.command()
    @click.argument('name')
    def hello(name):
        click.echo('Hello %s!' % name)

    runner = CliRunner()
    result = runner.invoke(hello, ['Peter'])
    assert result.exit_code == 0
    assert result.output == 'Hello Peter!\n'
```
anacondaでnumpyやscipyのインポートに失敗してしまうバグについて

#import numpyのエラー

Windowsでanacondaを入れて、numpyをインポートすると、
失敗してしまった。

![image](https://qiita-image-store.s3.amazonaws.com/0/128182/cdd7328f-2039-d211-bb41-c0b99ae3433f.png)

指定されたプロシージャが見つかりませんということだ。

またnumpyができたとしても、scipy.ioなどのインポートでも「指定されたプロシージャが見つかりません」というエラーが出てしまう。

同じようなエラーの人がいてこれかなあと思ったけど治らなかった。
http://qiita.com/eqs/items/79620732946939c7e3d1

こういうエラーではDependency Walker(http://www.dependencywalker.com/ )というツールを使うと原因がわかるということだ。

#Dependency Walker

ではどのファイルをDependency Walkerで開けばいいのか、
エラーがあったのは"C:\Anaconda3\lib\site-packages\numpy\core\__init__.py"でmultiarrayをインポートしてエラーしている
よって"C:\Anaconda3\Lib\site-packages\numpy\core\multiarray.pyd"を開いて確認する。

![image](https://qiita-image-store.s3.amazonaws.com/0/128182/ea857912-074d-39fa-e0d5-d5b663cc3b84.png)

こうしてみると、system32のmkl_intel_thread.dllがだめだということだ。

エラーしないマシンもあったので、比較すると、mkl_intel_thread.dllは赤くならない。
しかも！！そっちのマシンではmultiarray.pydに関連付けられているmkl_intel_thread.dllはsystem32にはなく"C:\Anaconda3\Library\bin"にある！

エラーするマシンでもmkl_intel_thread.dllはs"C:\Anaconda3\Library\bin"にある！

さらに、system32のmkl_intel_threadはバージョン10で、anaconda3のほうはバージョン11である。

これが原因だ！

#MKLとは

MKLはMath Kernel Libraryでintelが開発しているものだ。

最新のnumpyではどうやらこれが必要（しかもバージョン10ではだめ）である。

今回のエラーでは、System32の方を優先して参照していたようだ。

#結局

system32のmkl_intel_thread.dllを削除することで解決することができた。

![image](https://qiita-image-store.s3.amazonaws.com/0/128182/0e59d861-3039-4ac0-80f2-5791494dc1f5.png)