OmniAICreator/Qiita-1.07M huggingface dataset:
技術英語 > the building don't [look like] they came out of a computer. / [Make it look like] we're in serious trouble. / What do they look like?

@ AXIS Feb. 2016 > Cover interview: Frank Gehry

> the building don't <font color=red>look like<font> they came out of a computer.

フランクとその会社はコンピュータを建築に使用しているが、実際に作成する建物はコンピュータ設計のようには見えないようにしているということ。

[google image search](https://www.google.co.jp/search?q=%E3%83%95%E3%83%A9%E3%83%B3%E3%82%AF%E3%83%BB%E3%82%B2%E3%83%BC%E3%83%AA%E3%83%BC&espv=2&biw=1261&bih=1128&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjg-K3VuobLAhWHUqYKHb3ADc0Q_AUIBigB#imgrc=_)などでその例が見られる。

アントニ・ガウディ・コルネットによって設計されたサグラダ・ファミリア贖罪聖堂の柱などは単純な形状（８角形など）をうまく組合せて、これもやはりコンピュータ設計には見えないようなものが出来上がっている、というのを数年前のドキュメントでみたのを思い出した。

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

http://qiita.com/7of9/items/b6c10aed52b339d9446d
> <font color=red>Make it look like</font> we're in serious trouble.

敵の裏をかく作戦。

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

http://qiita.com/7of9/items/8820b61a8ff8c8c721b9
> What do they look like?

この元ネタは Voyager でナオミワイルドマンが 7of9 に童話のモンスターの形状を聞いていたのだったと思う。どのエピソードかは失念した。
クエリやファイル処理でメモリを抑える方法


DBテーブルやファイルからの読み込みの際、対象データが少ない時はいいのですが、データ量が多くなるとmemory_limitエラーとなったりします。そんなときの最低限度の対応方法について。

##DB編

###バッファしない

[ここ](http://php.net/manual/ja/mysqlinfo.concepts.buffering.php)によると、クエリは基本バッファされるようなので、明示的に非バッファクエリを実行します。

###fetchAll()を呼ばない

いろいろなサンプルはfetchAll()をするものが多いのですが、これはその名の通り、全部取ってくるようなので、ただのfetchを使うほうがいいようです（もしくは、単に($stmt as $row)などとする）。

融合すると下記のような感じ。

```php
<?php

	$dbh = new PDO('mysql:host=localhost;dbname=testdb','user','pass');
	//非バッファクエリの設定
	$dbh->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,false);

	$stmt = $dbh->prepare('select * from members');
	$stmt->execute();
	
	//fetchAllしない
	foreach($stmt as $row)
	{
		echo $row['name']."<br>";
	}
```

ループ部を、

```php
	while($row = $stmt->fetch())
	{
		echo $row['name']."<br>";
	}
```

としてもよい。

###Laravel

Laravelでは、QueryLogの記憶をdisableにする。

```php
DB::connection()->disableQueryLog();
```


##ファイル編

ファイルの読み取り事も対応はいろいろあるようですが、5.5以降であれば、ジェネレーターを利用するのが教科書通りなのかなと。
こんな感じ。

```php
<?php

	function readRows($filename)
	{
		//対象ファイルオープン
		$fp = fopen($filename,'r');

		//最初の1行を読む
		$row = fgets($fp);

		//最後のlineまでループ
		while($row !== false)
		{	
			//値を戻す
			yield $row;
			//次の行を読む
			$row = fgets($fp);
		}

		//ファイルクローズ
		fclose($fp);
	}

	//
	$rows = readRows('input.txt');

	foreach($rows as $row)
	{
		echo $row."<br>";
	}
```
kintone テーマ・プラグインの試作

#kintone テーマ・プラグインについて

新デザインがデフォルト設定になり、2017年2月には旧デザインが廃止されます。
しかし新デザインだと気に入らない点がいくつかあり、使いにくい気がします。

- ヘッダ部が大き過ぎ、無駄な領域が多い
- 全体に色が地味でなんか楽しくない

kintone標準の新テーマが用意されていればいいのですが今のところリリース予定は、なさそうです。
この対策として、とりあえず作ってみました。
ついでに、ついこの前プラグインの作り方を覚えたばかりなので、これもプラグイン化してみました。
css での変更だけでなく、DOM操作も行っていますので、もちろん非推奨の仕組みです。
旧デザイン廃止までには、標準で新デザイン・テーマ対応を行ってほしいものです。

#テーマ適用前後の表示比較
![theme1.png](https://qiita-image-store.s3.amazonaws.com/0/100572/8afa43a8-2ad4-7fca-2150-dd25cb9150d7.png)

- ヘッダ部を小さく、データ部を広くしました
- 色は灰色系からピンク系、アイコンの色も変更して明るめに
- ラベル表示は、旧デザインからのパクリ

#一覧画面
![theme2.png](https://qiita-image-store.s3.amazonaws.com/0/100572/e90b8706-fb03-f779-3a23-6ab1ccaafbaa.png)

#詳細画面
![theme3.png](https://qiita-image-store.s3.amazonaws.com/0/100572/d5964cbf-e897-3ae5-efef-9caae47445d1.png)

#編集画面
![theme4.png](https://qiita-image-store.s3.amazonaws.com/0/100572/7e83e275-ecbb-f5e8-f944-e1ddd7217953.png)

#テーマ・プラグインの設定
アプリの設定 > プラグイン　で、デザインテーマ・プラグインを追加します。
プラグインの設定は、何もありません。簡単ですね。
![theme5.png](https://qiita-image-store.s3.amazonaws.com/0/100572/d6040940-500f-2f80-5da5-d99cf9c1499f.png)

#KTABプラグインとテーマ・プラグイン同時使用
同時使用しても今のところ大丈夫そうです。
![theme6.png](https://qiita-image-store.s3.amazonaws.com/0/100572/c7d57521-fde1-a14a-9d4b-6bce03f36b05.png)

#課題
- 印刷にはcss の内容が反映されないため、独自の印刷機能を組み込むか検討要
- デザイン的に無理やり押し込めた弊害がところどころに出ている
- いくつかテーマ・プラグインの種類を作るか？

旧デザイン廃止まで約１年ありますので、ゆっくり考えます。
EC2の作成

#EC2の作成
EC2を初めて作成するので備忘録です。

**2016/12/09にVPCの作り方を下記にアップデートしました。VPCを作ってからEC2を作った方がいいと思います**
http://qiita.com/kite_999/items/babb0e8a26b2f32c674e

##EC2のリンクを押下

![image](https://qiita-image-store.s3.amazonaws.com/0/56889/4828e3f2-395f-3a7d-34d0-557400e3c0e0.png)

##ダッシュボードからインスタンスの作成を選択

![image](https://qiita-image-store.s3.amazonaws.com/0/56889/fc2d3259-ebba-a60b-28a1-7c5b38d3a2e8.png)

##Amazon Linuxを選択
今回は無料でredhat系のAmazonLinuxを選択

![image](https://qiita-image-store.s3.amazonaws.com/0/56889/6630ec45-1b7c-1fb2-a117-245c66db80d8.png)

##t2 microを選択

###次の手順：インスタンスの詳細の設定を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/56889/92447b75-613e-23dd-3fca-96fd505d229e.png)

###サブネットマスクを別途作成したもので選択する

[参考：VPCの作成](http://qiita.com/kite_999/items/9baf26bbecee3181cf1c)
![image](https://qiita-image-store.s3.amazonaws.com/0/56889/e62dc936-1a57-a368-90cf-0ef1bad71534.png)


##ストレージの追加

※メモ
General Purpose (SSD)　：スタンダード
Provisioned IOPS ：高性能ストレージ。高い。
Magnetic：安い。I/Oがあまりない場合用。

![image](https://qiita-image-store.s3.amazonaws.com/0/56889/db446186-1f77-08f3-6288-dee382fc11b9.png)

##インスタンスのタグ付け

![image](https://qiita-image-store.s3.amazonaws.com/0/56889/cb328720-5a61-5cb5-4e9f-44090380c63d.png)

##セキュリティグループの設定

とりあえずSSHだけ。SSHもあとでポートを変更する予定。

![image](https://qiita-image-store.s3.amazonaws.com/0/56889/ab092270-657c-5971-3dd4-2c69ce3fa4e7.png)

##公開鍵の作成
sshで接続するための秘密鍵を作成します。
デフォルトユーザはec2-user
※puttyの場合はputtygenで秘密鍵を再作成しなおす。

![image](https://qiita-image-store.s3.amazonaws.com/0/56889/b2f8b95d-12ed-1918-264a-38c13624640b.png)

以上
follow機能作成のおおまかな流れ。言葉による説明のみ。

#まずhas_many　throughを使うにあたっての注意事項
普通has_many throughは3つのモデルを必要とするが、このfollow機能に関しては、1つのモデルを別の見方をして３つのモデルとみなすところがややこしい。


それをふまえて作成のおおまかな流れを書いていく。
前提として、フォローすることを考えた時の能動的関係を表す時、relationshipモデルのことをactive_relationshipモデルとし、フォローされることを考えた時の受動的関係を表す時relationshipモデルのことをpassive_relationshipモデルとする。

生成する中間テーブルは１つ（relationshipsテーブル）だが、
場合によってこいつもまた２つの名前を使い分けるからややこしいから注意。

このテーブルの中にはfollower_idとfollowing_idのカラムがある。もちろんその他勝手に生成されるカラムもあるけどここでは省く。


今回の場合だと、
userモデルが２つあり（本当は一つだけど仮想的に２
つと考えている）、その間にrelationshipモデルが挟まっていて、フォローしている人とされている人の関係を仲介している状態を常に想像してもらうと良い。
非常に考えずらい。
そして、その２つのユーザーモデルはどちらか一方がfollowerならもう一方はfolloingとして考えるとすっきりする。



#1.まずフォローすることのみを考えたモデルの関連を考える。(1対多)

これは簡単に言えば、
`active_relationship.~`メソッドを作成することを考える。


たとえば
`active_relationship.following`で、あるユーザーA**が**フォローしているユーザーを返すメソッドや、
`user.active_relationships.build(following_id: user.id)`これで「フォローする」メソッドなどが作成できる。


もちろんその前に
relationshipモデルに
belongs_toを追加してからじゃないと使えないから注意。
まぁ1対多のモデルの関連づけの話しだから当然必要。
あくまでもおおまかな説明なので参考にする方にはすみません。
コードはまた別で投稿してあります。


#2.次にフォローされることのみを考えたモデルの関連を考える。

簡単に言えば、`passive_relationship.~`メソッドを作成することである。

例えば、`passive_relationship.follower`で、
あるユーザーAをフォローしているユーザー**を**返すメソッドなどである。



ここまではフォロー**する**こととフォロー**される**ことの動的関係を行うためのモデルの関連付けをした。

次からは上の定義したもので行われたフォローとフォロワーの集団を取り出す定義をする。


まず前提としては１人のユーザーにはいくつもの「フォローする/される（多対多）」のリレーションがある。


#あるユーザーがフォローしている集団を取り出す定義

```lang:user.rb

has_many :following, through: :active_relationships,  source: :following

```


この定義によってuser.followingで、あるユーザーAがフォローしている集団を取り出すことができるようになる。


#あるユーザーのフォロワーの集団を取り出す定義

```lang:user.rb

has_many :followers, through: :passive_relationships, source: :follower


```
これを定義することよって、
user.followersで、あるユーザーAをフォローしている集団（フォロワー）を取り出すことができるようになる。


ここがわかりにくいところで、本来のhas_many throughならば３つのモデルがあるので、これらの対になっている定義は別のモデルに書くはずだが、

これらの定義は両方とも同じモデルで定義されているので非常にわかりにくいので注意。
PythonでFlickr APIを使って画像URLを取得

#やりたいこと
Flickrから検索ワードに関連する画像を取得したい。


#事前準備
 - Flickrのアカウントを作成し、APIキーを取得。
  - [Flickr](https://www.flickr.com/services/developer)
 - Flickrに登録するためには、Yahoo.comのアカウントが必要。
  - [Yahoo.com](https://www.yahoo.com)

#開発環境
 - python 2.7.x系

#Requirement
```
pip install poster 
```

#プログラム
GitHubにも上げています。→ [getImageFromFlickr.py](https://github.com/ichiroex/getImageFromFlickr)

```lang:getImageFromFlickr.py
#coding: utf-8
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers
import json
import sys
import urllib2


def getImageUrlFromFlickr(API_KEY, query, N):

    NUM_OF_PHOTO = str(N) #取得する画像URLの数
    option = '&sort=relevance&privacy_filter=1&content_type=1&per_page='+ NUM_OF_PHOTO +'&format=json&nojsoncallback=1'
    url = 'https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key='+ API_KEY + option
    
    #JSON形式で結果を取得
    register_openers()
    datagen, headers = multipart_encode({'text': query})
    request = urllib2.Request(url,datagen, headers)
    response = urllib2.urlopen(request)
    res_dat = response.read()
    
    url_list = [] #URLリスト
    template_url = 'https://farm%s.staticflickr.com/%s/%s_%s.jpg' #URLのテンプレート
    for i in json.loads(res_dat)['photos']['photo']:
        img_url = template_url % (i['farm'],i['server'],i['id'],i['secret'])
        url_list.append(img_url) #リストに画像URLを追加

    return url_list

if __name__ == '__main__':

    API_KEY = 'XXXXXXXXXXXXXXXXXXXXXXXXXX'

    query = sys.argv[1]
    #API KEY, クエリ, 取得した画像数を渡す
    url_list = getImageUrlFromFlickr(API_KEY, query, 10)
    
    #取得した画像URLを表示
    for url in url_list:
        print url

```

#実行結果
```
>python getImageFromFlickr.py 寿司
https://farm6.staticflickr.com/5043/5203889493_b5a2feacf2.jpg
https://farm5.staticflickr.com/4021/4247841124_fd2f32222e.jpg
https://farm5.staticflickr.com/4082/4801051243_b439902670.jpg
https://farm4.staticflickr.com/3384/3472202216_090d54fb52.jpg
https://farm3.staticflickr.com/2265/2505551269_78f4cb8650.jpg
https://farm6.staticflickr.com/5296/5479083865_4e6ffa9553.jpg
https://farm3.staticflickr.com/2609/4008704322_b2c9a9895f.jpg
https://farm5.staticflickr.com/4117/4801046373_3e492b224d.jpg
https://farm5.staticflickr.com/4119/4801043517_d3bf9e38b9.jpg
https://farm5.staticflickr.com/4087/5025254420_131c78cb35.jpg
```

#取得した画像
https://farm6.staticflickr.com/5043/5203889493_b5a2feacf2.jpg
![alt](https://farm6.staticflickr.com/5043/5203889493_b5a2feacf2.jpg)
Crystalのベンチマークをしてみた

## 背景

Crystalは最近話題の、Ruby風の構文を持ちながらもコンパイルして機械語を生成する言語で、コンパイルされたコードの実行速度はC言語で書かれたものと変わらない。

Crystalの数値型はいくつかある。`Int32`や`Int64`のような具体的な型の他、`Int`というおそらく各数値型の基底っぽい型や、`alias Signed = Int8 | Int16 | Int32 | Int64` と定義されているUnion型等がある。

`Int`型や`Int::Signed`型は抽象化されているようなので、それによるパフォーマンス劣化は無いのか試してみた。

## 結果

Crystal言語では`Int`型を利用してもパフォーマンス劣化は起こらなかったので、特に理由がなければ`Int`と書いてよさそう。
Union型でも特にパフォーマンス劣化は起こっていないので、積極的に利用しても良さそう。
ついでに測定してみた`BigInt`はめちゃめちゃ遅かったので、Rubyが無限長整数だからってCrystalもそういう使い方をすると痛い目に合いそう。



## コード

```rb
require "benchmark"
require "big_int"

def fib_32(n : Int32)
  if n < 2
    n
  else
    fib_32(n - 1) + fib_32(n - 2)
  end
end

def fib_64(n : Int64)
  if n < 2
    n
  else
    fib_64(n - 1) + fib_64(n - 2)
  end
end

def fib_int(n : Int)
  if n < 2
    n
  else
    fib_int(n - 1) + fib_int(n - 2)
  end
end

def fib_signed(n : Int::Signed)
  if n < 2
    n
  else
    fib_signed(n - 1) + fib_signed(n - 2)
  end
end

def fib_big(n : BigInt)
  if n < 2
    n
  else
    fib_big(n - 1) + fib_big(n - 2)
  end
end

v = 0
N = 44
Benchmark.bm do |x|
  x.report("i32")           { v += fib_32(N.to_i32) }
  x.report("i64")           { v -= fib_64(N.to_i64) }
  x.report("i32 as int")    { v += fib_int(N.to_i32) }
  x.report("i64 as int")    { v -= fib_int(N.to_i64) }
  x.report("i32 as signed") { v += fib_signed(N.to_i32) }
  x.report("i64 as signed") { v -= fib_signed(N.to_i64) }
end
pp v

M = 33
Benchmark.bm do |x|
  x.report("i32")    { v += fib_32(M) }
  x.report("bigint") { v -= fib_big(BigInt.new(M)).to_i }
end
pp v
```

`fib_int`と`fib_signed`において、In32とInt64の両方を試しているのは、Crystalはコンパイル時に呼び出している型から関数の型を推測しているので、「`Int::Signed`って書いてあるけど、実際`Int32`だと思って最適化かけていいじゃん」ってコンパイラに思われるとまずいため。


```
$ crystal --version
Crystal 0.12.0 (2016年 2月18日 木曜日 01時39分06秒 UTC)

$ crystal run --release fib.cr
                    user     system      total        real
i32             3.780000   0.000000   3.780000 (  3.781702)
i64             3.740000   0.000000   3.740000 (  3.747735)
i32 as int      3.610000   0.000000   3.610000 (  3.607596)
i64 as int      3.660000   0.000000   3.660000 (  3.656115)
i32 as signed   3.810000   0.000000   3.810000 (  3.808917)
i64 as signed   3.740000   0.000000   3.740000 (  3.748444)
v = 0
             user     system      total        real
i32      0.030000   0.000000   0.030000 (  0.020068)
bigint   1.380000   0.810000   2.190000 (  1.650868)
v = 0
```
Electronでツイートするところまで最速でやる


ElectronでTwitterクライアント作る話良く聞くので何も考えずにツイート出来るまでやる。

##事前準備
- Node.js
- Twitterアプリ申請（キー4つ）


##ElectronでHello World!

```bash
$ git clone https://github.com/atom/electron-quick-start
$ cd electron-quick-start
$ npm install && npm start
```
![スクリーンショット 2016-02-21 23.56.57.png](https://qiita-image-store.s3.amazonaws.com/0/22392/63e3716b-2ee1-e12e-f369-93f8747d2a2f.png "スクリーンショット 2016-02-21 23.56.57.png")
起動した

##ツイート出来るようにする。
```bash
$ npm install twitter
```

```main.js
const Twitter = require('twitter');
const twitterClient = new Twitter({
  consumer_key: 'P',
  consumer_secret: 'I',
  access_token_key: 'Y',
  access_token_secret: 'O'
});

...

ipc.on('tweet', function(event, arg){
  twitterClient.post('statuses/update', {status: arg},  function(error, tweet, response){
    if(error) return mainWindow.webContents.send('tweet-res', '失敗');
    mainWindow.webContents.send('tweet-res', 'だん');
  });
});

```

これでレンダラプロセスから

```javascript
ipc.send('tweet', 'ぴよぴよ');
```

とかでツイート出来るようになった。
ちなみに今回tweetメッセージのやり取りは非同期で行うように実装したけれど、

```javascript
var response = ipc.sendSync('tweet', '同期');
```

とかくとシンプルになる。
でもレスポンスが帰ってくるまでブロック状態になるのでよくない。



##投稿画面(レンダラプロセス側)を作る
```index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>ついったするやつ</title>
    <script type="text/javascript" src="index.js"></script>
  </head>
  <body>
    <textarea id='tweet-box'></textarea>
  </body>
</html>

```

jqueryはよしなにする。

```index.js
const $ = require('./jquery.js');
const ipc = require('ipc');
$(function(){
  ipc.on('tweet-res', function(arg) {
    alert(arg);
    if(arg == 'だん') $('#tweet-box').val('');
  });

  $( '#tweet-box' ).keypress( function ( e ) {
  	if ( e.which == 13 ) {//Enterキーが押された時
      ipc.send('tweet', $(this).val());
  		return false;
  	}
  });
});

```


##完成
![スクリーンショット 2016-02-22 0.36.47.png](https://qiita-image-store.s3.amazonaws.com/0/22392/2908489d-c176-733a-f417-fd32592123d4.png "スクリーンショット 2016-02-22 0.36.47.png")
![スクリーンショット 2016-02-22 0.36.58.png](https://qiita-image-store.s3.amazonaws.com/0/22392/a1856071-593b-0db6-aed3-f0b9845ce906.png "スクリーンショット 2016-02-22 0.36.58.png")
ちゃんとツイート出来てる。
シェル芸人

/etc/passwd　と　/etc/group　のひも付きを確認したくて、
コマンドライン上で1行で書けないかとやってみたけど、結果長くなった。。

「1行で書くのが"シェル芸人"」ってどこかに書いてあったので、
シェル芸人になってみたってことにする・・。

## 自分に課していたお題
***
/etc/passwd と /etc/group のひも付けをする。
グループIDをキーにして、
以下の順で出力する。
1.GID  2.グループ  3.ユーザ  4.ホームディレクトリ  5.シェル

## 回答 ##

```sh
join -1 1 -2 1 <(cat /etc/passwd |sed 's=^#.*$==g'|grep -v ^$ |awk -F: '{print $4,$1,$6,$7}'|sort -t: -k1,1) <(cat /etc/group |sed 's=^#.*$==g'|grep -v ^$|awk -F: '{print $3,$1}'|sort -t: -k1,1) |awk '{printf("%-19s\t%-19s\t%-19s\t%-19s\t%-19s\n",$1,$5,$2,$3,$4)}'|more

```

## 解説 ##
```sh
USER1=/tmp/pd.key.user.$$
GRP1=/tmp/pd.key.grp.$$

cat /etc/passwd |
  sed 's=^#.*$==g'|
    grep -v ^$ |
      awk -F: '{print $4,$1,$6,$7}'|
        sort -t: -k1,1 >$USER1

cat /etc/group |
  sed 's=^#.*$==g'|
    grep -v ^$|
      awk -F: '{print $3,$1}'|
        sort -t: -k1,1 >$GRP1

join -1 1 -2 1 $USER1 $GRP1 |
  awk '{printf("%-19s\t%-19s\t%-19s\t%-19s\t%-19s\n",$1,$5,$2,$3,$4)}'
例外のスタックトレースに載るのはスローされた場所？生成された場所？

# 早見表

## スローされた場所に依存

<table>
<tr>
<th>静的型付言語</th>
<th>動的型付言語</th>
</tr>
<tr>
<td><ul>
<li>C#
</ul></td>
<td><ul>
<li>Ruby
<li>Python
</ul></td>
</table>

## 生成された場所に依存

<table>
<tr>
<th>静的型付言語</th>
<th>動的型付言語</th>
</tr>
<tr>
<td><ul>
<li>Java
<li>Scala
<li>D
</ul></td>
<td><ul>
<li>PHP
</ul></td>
</table>

## 特殊

### どちらの情報も残る

- JavaScript (`e.stack`として残るのは**生成された場所**のみ)

### 言語標準では例外が存在しない

- C
- Go (panicは構造体を伴わない)
- Perl
- Lua

### 言語標準ではスタックトレースが取れない

- C++

# 検証

コメント欄にて追加随時募集します！

```rb:Ruby
e = Exception.new
raise e

# test.rb:2:in `<main>': Exception (Exception)
```

```py:Python
e = Exception
raise e

# Traceback (most recent call last):
#  File "test.py", line 2, in <module>
#    raise e
# Exception
```

---

```php:PHP
<?php
$e = new Exception;
throw $e;

/*
PHP Fatal error:  Uncaught Exception in test.php:2
Stack trace:
#0 {main}
  thrown in test.php on line 2
*/
```

↑ **`thrown in`** って出るけどスローした場所じゃないので要注意

```java:Java
import java.lang.Exception;
class Main
{
	public static void main(String[] args) throws Exception
	{
		Exception e = new Exception();
		throw e;
	}
}

/*
Exception in thread "main" java.lang.Exception
	at Main.main(Main.java:6)
*/
```

```scala:Scala
object Main {
	val e = new Exception
	throw e
}

/*
Exception in thread "main" java.lang.Exception
	at Main$.delayedEndpoint$Main$1(Main.scala:2)
	at Main$delayedInit$body.apply(Main.scala:1)
        ...
*/
```

---

```js:JavaScript
e = new Error;
throw e;

/*
test.js:2
throw e;
^

Error
    at Object.<anonymous> (test.js:1:67)
    at Module._compile (module.js:413:34)
*/
```
Unity　uGUIのTextをα値で１文字ずつ表示

# 初めに
当たり前の方法なのかもしれませんが自分で思いついた方法が上手く動かせたのと
文章の書き方の練習もかねて記事にしておこうかと思います。

# 概要
![ss00-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/107156/9faf1049-5dbd-1239-db63-7f5992892f62.gif)


こんな感じのメッセージ表示をUnityで実装してみました。


# やり方
BaseMeshEffectを継承したクラスを用意しModifyMeshをオーバーライド
そのメソッド内で頂点のアルファを書き換えます。
ソースはこのようになります。

```
using UnityEngine;
using UnityEngine.UI;
using System;
using System.Collections;
using System.Collections.Generic;

public class TextAlphaSending : BaseMeshEffect
{
    private const int OneSpriteVertex = 6;
    private bool _isEnd = false;
    private float _alpha = 0f;
    private int _charaCount = 0;
    private Text _text;
    public Text Text
    {
        get{return _text ?? (_text = GetComponent<Text>()); }
    }

    /// <summary>
    /// 文字表示終了判定
    /// </summary>
    /// <returns></returns>
    public bool IsEnd()
    {
        return _isEnd;
    }

    /// <summary>
    /// 文字数カウント初期化
    /// </summary>
    public void Initialize()
    {
        _charaCount = 0;
        _isEnd = false;
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="vh"></param>
    public override void ModifyMesh(VertexHelper vh)
    {
        var input = new List<UIVertex>();
        var output = new List<UIVertex>();
        var text = Text;

        vh.GetUIVertexStream(input);
        var vertexTop = _charaCount * OneSpriteVertex;

        if (vertexTop >= input.Count) {
            _isEnd = true;
            return;
        }

        for (int i=0; i<vertexTop; ++i) {
            output.Add(input[i]);
        }
        
        for (int i=vertexTop; i<vertexTop + OneSpriteVertex; ++i) {
            var uiVertex = input[i];
            uiVertex.color.a = (byte)(255f * _alpha);
            output.Add(uiVertex);
        }

        _alpha += 0.1f;
        if (_alpha >= 1f) {
            _charaCount++;
            _alpha = 0f;
        }        

        vh.Clear();
        vh.AddUIVertexTriangleStream(output);
    }
}

```

```
using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class TextSenging : MonoBehaviour
{
    private Text _text;
    public Text Text
    {
        get
        {
            return _text ?? (_text = GetComponent<Text>());
        }
    }
    private TextAlphaSending _textAlphaSending;
    public TextAlphaSending TextAlphaSending
    {
        get
        {
            return _textAlphaSending ?? (_textAlphaSending = GetComponent<TextAlphaSending>());
        }
    }

	// Use this for initialization
	void Start ()
    {
        TextAlphaSending.Initialize();
        Text.text = "【王様】\nおお勇者よ,よくぞ参った";
	}
	
	// Update is called once per frame
	void Update ()
    {
        if (!TextAlphaSending.IsEnd()) {
            Text.SetAllDirty();
        }
	}
}
```

TextSengingのUpdateで表示される文字が残っている場合
Text.SetAllDirtyでModifyMeshが呼び出されるようにしています。


以上のような感じで1文字ずつα値を変化させて文字を表示することが出来ます。
問題点としてはα値の更新を行わないとならないため毎フレームSetAllDirtyで
頂点を更新しなければならないということです。
実際処理負荷を検証したわけではありませんがあくまでPC環境でちょっとした会話シーンなら問題にならないでしょう
モバイル環境だとさすがに厳しいかもしれません
uGUIの頂点は意外と簡単に編集できる一例として考えてください
[Django] POSTフォームで送信した後に前のページにリダイレクトさせる


環境
Python 3.5.0
Django 1.9.2

```template.html
<form action="./?next={{ request.META.HTTP_REFERER }}" method="post">{% csrf_token %}
    ケーキの数: {{ cake_form.cake_num }}
    <input type="submit" value="送信">
</form>
```

```views.py
from django.shortcuts import redirect

if 'next' in request.GET:
	return redirect(request.GET['next'])
```
AWS入門　VPCの作成

#VPCの作成
**2016/12/09に発展版を下記にアップデートしました。**
http://qiita.com/kite_999/items/babb0e8a26b2f32c674e



VPCを初めて作成してみました。
その手順をメモ。
[参考] http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Subnets.html#VPCSubnet

##リージョンの切り替え
リージョン（サーバーの所在地）を東京に切り替えます。

![image](https://qiita-image-store.s3.amazonaws.com/0/56889/a3263674-23fa-ae08-d946-aa741cf2ad7f.png)

##VPCをクリック

![image](https://qiita-image-store.s3.amazonaws.com/0/56889/6ba352f7-b2b9-7e42-6560-2e153d90900b.png)

##VPCの作成

![image](https://qiita-image-store.s3.amazonaws.com/0/56889/6d346fd9-56db-147a-4c65-f1d3874d9042.png)

##subnetの作成
こちらが実際のネットワークと考えてよいと思う
※アベイラビリティーゾーン：物理的なネットワークの箇所と考えてよい。
冗長化するときなどはアベイラビリティーゾーンを分けるとよい。

![image](https://qiita-image-store.s3.amazonaws.com/0/56889/77267522-e76e-4aee-d6e0-1edc8ba39f36.png)

##インターネットゲートウェイの作成

###定義の作成

![image](https://qiita-image-store.s3.amazonaws.com/0/56889/cc0aed7b-e4f5-e24c-6626-01e1e82a005a.png)

###VPCにアタッチ
先ほど作成したVPCに関連付けます。

![image](https://qiita-image-store.s3.amazonaws.com/0/56889/2263b851-0b20-9c2e-2f4d-6d5fafe8a183.png)


##ルートテーブルの作成
ルーティングテーブルを作成します。

###定義の作成
![image](https://qiita-image-store.s3.amazonaws.com/0/56889/2bafb99a-835b-7548-e930-17379e74346b.png)

###ルートの追加
ルートに「0.0.0.0/0」を追加します。

![image](https://qiita-image-store.s3.amazonaws.com/0/56889/a130770b-2b5a-dd01-51d0-2e152dc3f819.png)


以上
Docker Composeを使って管理してる時にファイル更新したい

例えばnginxのconfファイルを更新して反映させたい時ありますよね。

## 定義前提例

```docker-compose.yml
version: '2'
services:
    nginx:
        build: ./nginx
        container_name: nginx
        ports:
            - 80:80
    (以下略)
```

```text:nginx/Dockerfile
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
COPY default.conf /etc/nginx/conf.d/default.conf
EXPOSE 80 443
```

```text:Bash
$ docker-compose -p foo up -d
```

※ ```-p foo```オプションにつけるとイメージ名やネットワーク名やボリューム名に```foo_```という接頭辞が付きます。

## dockerコマンド

```text:Bash
$ docker cp default.conf nginx:/etc/nginx/conf.d/default.conf
$ docker exec nginx nginx -s reload
```

当然Docker Composeを使っていたとしても上記の方法でも更新・反映は出来ますがDocker Composeの機能を使う方が良さ気かな？って。


## docker-composeコマンド


```Bash
docker-compose -p foo build nginx
docker-compose -p foo up -d nginx
```

すると```Recreating nginx```と表示されます。
nginxのイメージのみ作りなおしてコンテナも新しく作って既存コンテナと入れ替えてくれます。
これなら、更新した```default.conf```がイメージに反映された状態になりますし、Docker Composeを折角使っているならこっちの方が良いのかなー？って気分に。

## 注意
ただし、コンテナを作りなおすわけなので一瞬とは言えnginxが止まる瞬間が出来ちゃうと思うのでそれが困る場合は使えないですね。そーゆー場合はdockerコマンドを使う方法しか無さ気？
UnityでLive2Dのモデルにマウスオーバーした時にそちらを向かせる

#はじめに
Live2D使って嫁とイチャイチャするのは楽しいです！
Live2Dでよりインタラクティブな表現をするために、
ドラッグよりも前、つまりマウスオーバーでモデルがグリグリ動いてくれたら楽しそうですよね！！
ということで実現してみます。

※前提としてSDKのsample/SampleApp1にコードを追加する形で実装しています
※また、frameworkやsample以下のファイルは触らず、別のスクリプトを作成してアタッチすることとします

#サンプルコード
以下のファイルを作成して、HierarchyのLive2D_Canvas_Haruへアタッチするだけです。
特に解説することはないかと思いますが、
Start()内でモデルを取得して、マウスオーバーした時にTouchesMoved(Vector3 inputPos)に今のマウスカーソルの位置を渡しているだけです。
LAppModelの中とLAppViewの中のTouchesMoved(Vector3 inputPos)を利用しています。

追記：マウスが離れた時や、クリックした時にモーションを再生させるために修正しました

```csharp:MouseChecker.cs
using UnityEngine;
using System.Collections;

public class MouseChecker : MonoBehaviour {

    private LAppModel model;

	// Use this for initialization
	void Start () {
        model = GameObject.Find("Live2D_Canvas_Haru").GetComponent<LAppModelProxy>().GetModel();
    }
	
	// Update is called once per frame
	void Update () {
        if (Input.GetMouseButtonUp(0))
        {
            //ちょっと無理やりかも…
            model.TouchesEnded(Input.mousePosition);
        }
	}

    void OnMouseEnter()
    {
        model.TouchesBegan(Input.mousePosition);
    }

    void OnMouseOver()
    {
        model.TouchesMoved(Input.mousePosition);
    }

    void OnMouseExit()
    {
        model.TouchesEnded(Input.mousePosition);
    }
}

```
HTTP経由でのNTP時刻合わせ(PowerShell利用)

Firewall に囲まれてて NTP が通らないので書いた。

HTTP(S)で日本標準時を文字列で返してくれるサービスが提供されているのでそちらを利用、対象 OS が Linux 系なら wget を使えばいいけど Windows にはそんなものは(標準では)無いので PowerShell から .NET を呼び出してどうにかする。


# コード
```powershell:ntpdate.ps1
# 管理者権限で実行すること
$ntpdatestring = (new-object System.Net.WebClient).DownloadString("http://ntp-a1.nict.go.jp/cgi-bin/time").Replace(" JST", " +0900").Trim()
$datetime = [DateTime]::ParseExact($ntpdatestring, "ddd MMM dd HH:mm:ss yyyy zzzz", [Globalization.CultureInfo]::CreateSpecificCulture("en-US"))

set-date $datetime
```


あとはタスクスケジューラにぶち込んだりすれば良いのでは。定時ダッシュの精度が高まりますね

## 実装時にはまった点
~~PowerShell 初めて書いた＆ そもそも .NET あんまり知らんのでそもそも全部ハマっ~~
WebClient#DownloadString() が 返す文字列の後ろに謎の改行文字が入ってることに気付かなくてパース出来なかった
DateTime#ParseExact() の時にロケール…じゃなくてカルチャに en-US を指定をしないといけない(自環境だとデフォルトのカルチャが ja-JP になるので ddd は "日曜" だの "月曜" だのが有効な値、"Sun" やら "Mon" は認識出来ない)ことに気付くのに大分時間が掛かった


## NTPリソース
[日本標準時プロジェクト　公開NTP サービス対応クライアントリスト](http://www2.nict.go.jp/aeri/sts/tsp/PubNtp/clients.html)
[日本標準時プロジェクト　https/http を介してアクセスされる場合](http://www.nict.go.jp/JST/http.html)


/cgi-bin/time は RFC1123 形式っぽいけど少し違う
/cgi-bin/ntp と /cgi-bin/jst は text/plain じゃないのでアレ


# 環境
OS: Windows 7 Pro

> Windows PowerShell
> Copyright (C) 2009 Microsoft Corporation. All rights reserved.
> 
> PS C:\\> $PSVersionTable
> 
> Name                           Value
> ----                           -----
> CLRVersion                     2.0.50727.5485
> BuildVersion                   6.1.7601.17514
> PSVersion                      2.0
> WSManStackVersion              2.0
> PSCompatibleVersions           {1.0, 2.0}
> SerializationVersion           1.1.0.1
> PSRemotingProtocolVersion      2.1


----
書いてから気付いたけど PowerShell で JSON 読めるならそれ使ったほうが楽だったのでは…？
→ [JSON 使えるやん…](http://blogs.gine.jp/kusa/archives/1850)
→ PowerShell 3.0 からだった。Windows 7 デフォルトは V2 なのである意味セーフ

st に UNIX 時間が入ってるから new DateTime(1970, 1, 1, 9, 0, 0) に AddSeconds() で良いのかなー
underscoreコードリーディング（clone）



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



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


##cloneとは


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

こんな説明。
>####_.clone(object) 
>Create a shallow-copied clone of the provided plain object.
>Any nested objects or arrays will be copied by reference, not duplicated.


```javascript
_.clone({name: 'moe'});
=> {name: 'moe'};

```

------------- 



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

```javascript
  // Create a (shallow-cloned) duplicate of an object.
  _.clone = function(obj) {
    if (!_.isObject(obj)) return obj;
    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
  };

```

objが_.isObjectに引っかからなかった場合はobjを返す。
objが_.isArrayに引っかった場合、sliceをしたものを返す。違う場合、_.extendを用いて空の配列に対してobjをextendすることによってコピーされたobjを返すことができる。
Freeplane を使っての Cyberfox カスタマイズ記録


先日、ザッハトルテを食べながら [Freeplane](http://www.freeplane.org/wiki/index.php/Main_Page) を使ってカスタマイズの Todo 管理や記録をとっているという話をしてきました。
昨日から Cyberfox でも同じように使っているので、例ということで挙げておきます。

![20160220_Firefox Cyberfox.png](https://qiita-image-store.s3.amazonaws.com/0/24711/a6e9acc8-b759-548b-4a16-5293a58a5cd0.png)
Android StudioでCardViewを扱えるようになるまで

Android StudioでCardViewを使ったアプリを作ろうとしたら案外苦労したのでその際のメモ
#たくさんのエラー
##よくわからんエラーその１：gradleのsyncエラー
```Error:その１
Error:(3) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Inverse'.
```
なるほど。わからんな。

ぐぐったら同じ事で困ってる人が多いらしい。

今回参考にしたのはこのサイト
[Android Studioのエミュレータでアプリを実行したらエラーになった件の対処法](http://terahit.com/2015/08/20/android-studio-emu-error/)

ふむ。やはり巷の噂で「SDKのv23には気をつけろ！」というのは本当だったらしい。

ということで、compileSdkVersionを23にすることで解決。

```lang:build.gradle
compileSdkVersion 23
buildToolsVersion "23.0.1"
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:23.+'
}
```

##よくわからんエラーその２：cardCornerRadiusなんて属性ﾈｰﾖ
よし、やっとCardViewが使えると思ってサンプルを作ってみる

```lang:card_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <android.support.v7.widget.CardView
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:id="@+id/card_view"
        android:layout_gravity="center"
        android:layout_width="200dp"
        android:layout_height="200dp"
        card_view:cardCornerRadius="4dp">

    <TextView
        android:id="@+id/info_text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="CardView"/>
    </android.support.v7.widget.CardView>

</LinearLayout>
```

よし、ビルドだ！と思ったらこんなエラーが発生

```Error:その２
Error:(5) No resource identifier found for attribute 'cardCornerRadius' in package 'hoge.sample.hoge.hoge'
```

どうやら「cardCornerRadiusなんてもんﾈｰﾖ！」と怒られているらしい。知るかよ。
試しにcard_view:cardCornerRadius="4dp"を消してみるとビルドが通った。ふむ。

ということでぐぐってみると、またもハマっている人が多いらしい。

今度はこのサイトを参考にした
[Card_view material design(stack overflow)](http://stackoverflow.com/questions/24994210/card-view-material-design)

なるほど、Support LibraryはappcompatだけじゃなくてCardViewのも入れなきゃダメなのね。

そういえばDroidKaigiでも
「Support Libraryの中でもCardViewは集合写真に欠席した人みたいに他のSupport Libraryとは依存関係にない」
って言ってたのを思い出した。なるほどこういうことか。可哀想なやつだ。

ということでgradleにCardViewを追加

```lang:build.gradle
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:23.+'
    compile 'com.android.support:cardview-v7:21.+'
}
```

これでうまくいった！
ということで、やっとアプリ作るのに専念できそう。
Ubuntu 14.04 LTS 開発環境構築ログ #02

 前記事：[Ubuntu 14.04 LTS 開発環境構築ログ #01](http://qiita.com/cazborg/items/91611233bb3ea6a91223 "#01")

# 作業用ユーザでログイン
指定のIPアドレス、ポート番号に TeraTerm等でSSH接続(#01で作成した作業用ユーザ)

# インストール済みパッケージを最新版に更新
## 最適なリポジトリからパッケージを取得するよう設定を変更

```
$ cd /etc/apt
$ sudo cp sources.list sources.list.org
$ sudoedit sources.list
$ diff -u sources.list sources.list.org
--- sources.list        2016-03-19 15:04:56.000000000 +0900
+++ sources.list.org    2016-03-19 15:03:21.000000000 +0900
@@ -1,5 +1,5 @@
-deb mirror://mirrors.ubuntu.com/mirrors.txt trusty main restricted universe
-deb mirror://mirrors.ubuntu.com/mirrors.txt trusty-updates main restricted universe
-deb mirror://mirrors.ubuntu.com/mirrors.txt trusty-security main restricted universe multiverse
+deb http://archive.ubuntu.com/ubuntu trusty main restricted universe
+deb http://archive.ubuntu.com/ubuntu trusty-updates main restricted universe
+deb http://security.ubuntu.com/ubuntu trusty-security main restricted universe multiverse
 deb http://archive.canonical.com/ubuntu trusty partner

$
```
## インストール済みパッケージを最新版に更新

```
$ sudo apt update
$ sudo apt upgrade
```
途中で入力を求められたら下記の通り対応

* Do you want to continue? [Y/n]　:arrow_right:　Y + Enter
* Postfix Configuration　:arrow_right:　No configuration + OK(Enter)

## インストール済みのパッケージをざっと確認
```
$ apt list | grep installed
```
CloudFront 設定時、オリジンへの直接のアクセスに Basic認証をかける (Nginx で)


## 前提
* CloudFront のエンドポイント: something.cloudfront.net
* オリジンとなる EC2 のドメイン: origin.example.com
	* ELB は設定されてない

## こうしたい
![CloudFront_Basic_Auth.png](https://qiita-image-store.s3.amazonaws.com/0/10160/34347212-eaef-5095-b939-6621c5d43897.png "CloudFront_Basic_Auth.png")


## 事情
* EC2 にしか権限がない
* 本当は ELB とか EC2 のセキュリティグループで対応すべき話な気がする

## 設定
* CloudFront 経由でのアクセス時、server_name は something.cloudfront.net になる
* server_name が something.cloudfront.net の場合、そのままアクセスさせる
	* アクセスさせたくない location も設定可能
* server_name が origin.example.com の場合、IP + Basic認証

```/etc/nginx.conf.d/something.cloudfront.net.conf
server {
  listen 80 default;
  server_name something.cloudfront.net;

  # path for static files
  root /path/to/html;
  
  # CloudFront 経由での下記のアクセスは禁止
  location /admin {
    return 403;
  }    
}
```

```/etc/nginx.conf.d/origin.example.com.conf
server {
  listen 80;
  server_name origin.example.com;

  # path for static files
  root /path/to/html;
  
  # Basic 認証 + IP, allow と deny の順番重要
  allow {許可したいIP};
  deny all;
  auth_basic  "Restricted";
  auth_basic_user_file "/path/to/.htpasswd";
}
```
ThinkVantageボタンでコマンドを実行する on Lubuntu

ThinkVantageボタンで端末を起動できるようにしたときのメモ。

まず、`xev`コマンドを使って、ThinkVantageボタンを押したときに、どんなキーコードが返ってくるか調べた。`XF86Launch1`というコードが返ってくるようだ。

キーコードがわかったら、Openboxの設定ファイル(`~/.config/openbox/lubuntu-rc.xml`)の、`<keyboard>`〜`</keyboard>`内に、`XF86Launch1`が押されたときの設定を追加する。

gnome-terminalを起動させる例:

```~/.config/openbox/lubuntu-rc.xml 
<keyboard>
  <!-- 〜省略〜 -->

  <!-- ThinkVantageボタンで端末を起動する -->
  <!-- Launch gnome-terminal when ThinkVantage is pressed -->
  <keybind key="XF86Launch1">
    <action name="Execute">
      <command>gnome-terminal</command>
    </action>
  </keybind>
</keyboard>
```

別のコマンドを実行したければ`<command>`〜`</command>`内を変えればよい。

設定ファイルの書き換えができたら、以下のコマンドを実行して設定を反映する。

```
$ openbox --reconfigure
```

LubuntuはLXDEをデスクトップ環境に使用しているが、キーボードショートカットの設定は、LXDEというより、その中に含まれているOpenboxの設定で行うようで、そこがわからず調べるときに少々時間がかかった。

**参考にしたページ**:

- https://help.ubuntu.com/community/Lubuntu/Windows
- http://rcmdnk.github.io/blog/2014/08/28/computer-lubuntu/
個人情報保護法改正後のゲノム情報学術研究利用に関する提言 (案)

個人情報保護法改正後のゲノム情報学術研究利用に関する提言 (案)
---
Feb 21,2016 H.Kawaji 私案

生命科学の進展によってヒトのゲノム情報を生活へ活かす術が見いだされつつあるが、我々が十分な根拠を持ってそれらを活用するためには我々日本人のゲノム情報の探求が必須である。一方、我々個人の人格は尊重されるべきとの理念に疑念を挟む余地はなく、これらの両立によって未来を切り開くことは現在を生きる我々の責務である。

「個人情報の保護に関する法律」が2015年に改正され (以降、改正法)、ここで規定される個人識別符号(2条1項,2項)や要配慮個人情報(2条3項)に該当する情報の範囲が現在議論されている。改正法は学術研究を適用除外対象と位置付けており(66条)、ゲノム情報を用いる学術研究を規制するものとして「ヒトゲノム・遺伝子解析研究に関する倫理指針」(以降、ゲノム指針)等の指針が現存する。改正法の運用や、これら学術研究を規制する指針等のあり方として、次を提言する:

* (明示的な学術利用規制) ゲノム情報が改正法における個人識別符号あるいは要配慮個人情報と分類される・されないに関わらず、**指針等の規制に適正に従うことでこれを学術研究に利用できると明示**すること



* (複数目的への利用) 学術研究目的と非学術研究目的の双方に同じゲノム情報を適正に利用できるよう、**学術利用規制と改正法の運用を整合させる**こと。特に、産官学連携等で実施される公益性の高い研究に民間からの貢献を萎縮させない配慮が期待される


* (国際連携) 規制体系が日本と異なる他国と共同した学術研究を妨げないよう、**学術利用規制の国際的な整合性**を保つあるいはその為の仕組みを整えること



これらの実現によって、より確かなエビデンスに依拠したゲノム情報利用が実現され、我々の生活がより豊かなものになることが期待される。また生命情報を探求する研究者として、研究活動に骨身を惜しまないことを改めて表明する。


参考URL

* [個人情報の保護に関する法律](http://law.e-gov.go.jp/htmldata/H15/H15HO057.html)
* [個人情報保護法改正部分概要](http://www.soumu.go.jp/main_content/000355092.pdf)
* [ヒトゲノム・遺伝子解析研究に関する倫理指針](http://www.mhlw.go.jp/file/06-Seisakujouhou-10600000-Daijinkanboukouseikagakuka/sisin1.pdf)
macにPythonの数値演算環境Anacondaを入れる(2)

# やりたいこと
[macにPythonの数値演算環境Anacondaを入れる](http://qiita.com/heptane/items/1f6be08cbf8d32b9ccd0)でAnacondaを無事入れられた．
けど，このままだと使えるのはpyenvのpythonとAnaconda3-4.3.0のpython3系なので，Anacondaでpython2系が動くようにする．

# やってみた
まずpythonを実行してみて，pyenvで動いているようだったら

```lang:tarminal
$ pyenv global anaconda3-4.3.0
$ which python
.pyenv/versions/anaconda3-4.3.0/bin/python
```

これでAnaconda上でpythonを動かせる．
次に，Anacondaでpython2系を動かすための準備．

```lang:tarminal
$ conda create -n python27 python=2.7 anaconda
```

上記コマンドを実行して，終わるのを待つ．
終わったら準備完了．
下記の各コマンドで2系3系の切り替えができる

```lang:tarminal
$ source ~/.pyenv/versions/anaconda3-4.3.0/bin/activate python27
$ source ~/.pyenv/versions/anaconda3-4.3.0/bin/deactivate
```
cloud9上のlinuxにLinuxbrewを入れる

teratailでcloud9にHomebrewを入れたいという質問があって、Homebrew入れれんだろという話をしてたのですがどうやらそうでもないようだったので久々にcloud9を使ってみた。

どうやら、いつのまにかcloud9はDockerのコンテナとしてアプリケーションが立ち上がるようになってました。凄いぞcloud9。

## Linuxbrewをインストール

Homebrewは入れれないのでLinuxbrewを入れます。

```
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/linuxbrew/go/install)"
==> This script will install:
/home/ubuntu/.linuxbrew/bin/brew
/home/ubuntu/.linuxbrew/Library/...
/home/ubuntu/.linuxbrew/share/man/man1/brew.1

Press RETURN to continue or any other key to abort
==> Downloading and installing Homebrew...
remote: Counting objects: 340632, done.
remote: Compressing objects: 100% (4397/4397), done.
remote: Total 340632 (delta 3079), reused 0 (delta 0), pack-reused 336215
Receiving objects: 100% (340632/340632), 66.19 MiB | 12.82 MiB/s, done.
Resolving deltas: 100% (256969/256969), done.
From https://github.com/Homebrew/linuxbrew
 * [new branch]      master     -> origin/master
HEAD is now at cefb848 expat: update 2.1.0_1 bottle for Linuxbrew.
Warning: /home/ubuntu/.linuxbrew/bin is not in your PATH.
==> Installation successful!
==> Next steps
Install the Linuxbrew dependencies:

Debian, Ubuntu, etc.:
  `sudo apt-get install build-essential`

Fedora, Red Hat, CentOS, etc.:
  `sudo yum groupinstall 'Development Tools'`

See http://brew.sh/linuxbrew/#dependencies for more information.

Run `brew doctor` before you install anything
Run `brew help` to get started
```

### 確認

```
$ brew doctor
bash: brew: command not found
```

パスが通ってない模様。

## パスを通す

一旦はそのまま通せばいいよね

```
$ export PATH=$PATH:/home/ubuntu/.linuxbrew/bin
```

### 確認

```
$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry and just ignore them. Thanks!

Warning: /tmp is world-writable but does not have the sticky bit set.
Please execute `sudo chmod +t /tmp` in your Terminal
```

## tmpディレクトリを書き込み可能にする

```
$ sudo chmod +t /tmp
```


## 確認

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

これで使えそう。  
これ時間経ったらコンテナ消えるのだろうか、どうなのだろうか。
【JS】イケてる企業はやっている！コードやコンソール上での変わったオリジナルメッセージの出力

そうなんです。やってしまってます。コードやコンソールでのお遊びを。
内容は企業によってそれぞれ違いますが、多くはサービスのロゴであったり、エンジニアの採用メッセージであったり、、
でも採用メッセージは利にかなってますよね。一般の人は決して覗くことの無い部分ですし、覗きに来るということは、多少なりとも興味を持たれているということなので。

こういうの海外のサービスで主にやってるイメージがあったのですが、調べてみると意外に国内でもやってる所がたくさんあったので、幾つかご紹介します。


#ChatWork

[https://www.chatwork.com](https://www.chatwork.com)
ビジネスチャットでおなじみのチャットワークさん。
こちらはシンプルな採用メッセージタイプです。
これぐらいなら明日からでも実践出来そうです。

![jjj.jpg](https://qiita-image-store.s3.amazonaws.com/0/67591/b20c5def-83be-8c49-1720-390ff79a347f.jpeg)

#ドットインストール

[http://dotinstall.com](http://dotinstall.com)
プログラミング学習サイトで有名なドットインストールさんです。
シンプル系ですが、リロードするたびにメッセージが変わるという一工夫が。

![スクリーンショット 2016-02-21 3.15.43.png](https://qiita-image-store.s3.amazonaws.com/0/67591/88775d3f-6daf-166f-fba4-329d8e9c56d8.png)


#クックパッド

[http://cookpad.com/](http://cookpad.com/)
言わずと知れた料理レシピサービスのクックパッドさん。
でかでかとロゴを出力しています。
コンソールでは、Facebookのようにセキュリティに関する警告メッセージを。
その下の「We're hiring.」は外国人向けのメッセージのようにも感じます。

![Developer_Tools_-_http___cookpad_com_.jpg](https://qiita-image-store.s3.amazonaws.com/0/67591/a30e46f2-f212-60bd-55c6-7bd0b9c1762e.jpeg)



#HOME's

[http://www.homes.co.jp](http://www.homes.co.jp)
不動産・住宅情報サイトのホームズさんです。
サイトのメインキャラクターがかわいらしく表示されていました。

![スクリーンショット 2016-02-21 3.03.59.png](https://qiita-image-store.s3.amazonaws.com/0/67591/c4f15845-a426-e68a-1a94-e16ed1ce8c61.png)

#食べログ

[http://tabelog.com](http://tabelog.com)
グルメ口コミサイトの食べログさんです。
こちらも、でかでかとロゴを出力しています。
ただ、横に広がりすぎるので開いた瞬間、崩れていたのが残念です。。

![スクリーンショット 2016-02-21 3.05.11.png](https://qiita-image-store.s3.amazonaws.com/0/67591/78ca4ea1-227d-a581-e886-138505fbb8c1.png)

#面白法人カヤック

[http://www.kayac.com](http://www.kayac.com)
面白い法人のカヤックさんのコーポレイトサイトです。
ソースを持ち帰りくださいという器の大きさ。
オープンにできる自信があるからこそのメッセージかなと。

![スクリーンショット 2016-02-21 3.47.38.png](https://qiita-image-store.s3.amazonaws.com/0/67591/36039465-2e96-8c0c-a40b-0640bbf6c9cd.png)


#株式会社ココノヱ

[https://9ye.jp/about](https://9ye.jp/about)

岡山の代表的な制作会社のココノヱさんのコーポレイトサイトです。
何とコンソールでテトリスが出来ました。面白さや個性では別格です。
「GAME OVER」になるとエラーとして「GAME OVER」が出てきます。

![スクリーンショット 2016-02-21 3.55.01.png](https://qiita-image-store.s3.amazonaws.com/0/67591/013f2231-fcaa-c483-06e2-7de6e3601b1b.png)


#まとめ
各社それぞれ、工夫を凝らしているのがわかりました。サービスロゴを出すのも、ひとつのブランディングなんだと思います。
細かい所にも手を抜かないという意思表示でもあるのかなと。
それと、覗かれた際にどう応対するのかという、これも接客ではないかと感じました。

#あわせて読みたい
- [JavaScript Consoleに面白い出力をしているサービス - Qiita](http://qiita.com/oohira/items/6c30bdf3636a134cf119)
Go言語で作った実行ファイルを小さくしよう！

#Go実行ファイルを小さくしたい！
Go言語で作った実行ファイルは基本的に外部のライブラリに依存せず、
静的にライブラリをリンクしてスタンドアローンな実行ファイルです。
そのため、hello worldアプリでもファイルサイズが余裕で2MBを超えたりします。
この実行ファイルを少しでも小さくしようーって事です。

方法は簡単。UPX使えばいいです（そのまんま）
UPXは実行ファイルを圧縮してくれる素敵ソフト。
もちろん圧縮されたそのままで実行ができます。
（一度圧縮した物を展開する方法は知らないです・・・）
#準備
Ubuntu環境であれば、
`sudo apt-get install upx-ucl`
これでUPXコマンドがインストールできます。
`upx [実行ファイル」`
で、実行ファイルを圧縮してくれるのですが、
Go言語実行ファイルはそのままでは圧縮後の実行ファイルが実行できません・・・
・・・の、はずだったんだけど、あれ？今テストしてみたら実行できるや・・・
少し前まで、圧縮に失敗して出来上がった実行ファイルが走らなかったんだけどなぁ・・・
それでGo言語用に修正してくれるgoupxってのを使って圧縮する感じだったんだけど・・・？

ちなみに、goupxは、
`go get github.com/pwaller/goupx`
これでインストールできます。
$GOPATH/bin にパスが通っていれば、そのまま goupx で実行できます。
環境によっては普通のupxでは実行ファイルが壊れるかも。
そんな時はgoupxを通して使えば解決です。

これだけでファイルサイズは元の実行ファイルの４０％くらいになります（すごい！）
#さらに小さくしよう！
しかし、さらに小さくできるのです！
upxで実行ファイルを圧縮する「前に」ストリップにかけます。
`strip [実行ファイル]`
stripコマンドは、ubuntuであれば普通は標準で入ってます。
stripコマンドは実行ファイルからデバッグ情報とか不要情報を削除するコマンド。
（・・・だと思っているけど、間違っているかも）
※「strip」だけのキーワードで検索するとえっちぃーのが出てきたりするので気を付ける事

#実行ファイルの圧縮で実行する順番
以上の事を次の順番でします。
１、go build で実行ファイルを作成。
２、stripコマンドで実行ファイルを掃除。
３、upxコマンド（goupxコマンド）で実行ファイルを圧縮。
※２番と３番を逆にするとゴミファイルが完成します。上記順番厳守です。
これで、元の実行ファイルの２０％くらいになります（超すごい！）

#実行ファイルを小さくする意味
ファイルサイズを小さくする利点はほとんどないです・・・
実行する時には圧縮されている実行ファイルをメモリ内で展開して実行しているらしいので、
利点どころか逆にその展開しないといけない分一手間増えて負荷が増えるらしいです・・・
今の時代、数十MBくらいなんともない大容量の時代ですし、ちょっと小さくなってもなんとも・・・
実行ファイル圧縮というのは浪漫機能なのかもしれません・・・
・・・それでもまぁ、俺は必ず実行ファイル圧縮してるけどね！

#注意
ちなみに・・・
上記の方法で圧縮した実行ファイルを使っても、俺の環境下では不具合や不思議挙動などは見られません。
しかし、もしも何か不具合などが発生したとしても俺は責任持てませんので自己責任で実行してくださいませ。

ちなみにちなみに・・・
上記方法は、Ubuntuで行う場合の方法です。
その他の環境では・・・ちょっとわかんないです。
WebサーバにアクセスするとArduinoでLチカ（HTTPS対応）

以前にPythonでサーバを立ち上げ、ブラウザからArduinoを操作するという仕組みについて書きました。

http://qiita.com/drafts/9abfa1a4b6bf66a5f8fa/edit

このときはBottleというフレームワークを使っていたのですが、getUserMediaなどJavaScriptで画像を扱うインタフェースがHTTPSでしか使えなくなり、BottleをHTTPSに対応させるのが難しいので、CherryPyというフレームワークに変えてみました。

まず、前作業として、下記を参考にオレオレ証明書を作っておきます。
http://docs.cherrypy.org/en/latest/deploy.html#ssl

```
$ openssl genrsa -out privkey.pem 2048
$ openssl req -new -x509 -days 365 -key privkey.pem -out cert.pem
```

このpemを指定してHello worldを表示するサンプルがこちら。Arduinoへ接続する前に、こちらで動作確認してみてください。

```py
import cherrypy
cherrypy.server.ssl_module = 'builtin'
cherrypy.server.ssl_certificate = "cert.pem"
cherrypy.server.ssl_private_key = "privkey.pem"

class HelloWorld(object):
    @cherrypy.expose
    def index(self):
        return "Hello world!"

if __name__ == '__main__':
   cherrypy.quickstart(HelloWorld())
```

ブラウザが怒りますが安心してください。~~履いてます。~~正常動作です。

これに、pyserialによるシリアル送信とCORS対応（HTTPヘッダにドメインを跨いでのアクセスを許容するための設定）を書き足したのがこちら。


```py
import cherrypy
cherrypy.server.ssl_module = 'builtin'
cherrypy.server.ssl_certificate = "cert.pem"
cherrypy.server.ssl_private_key = "privkey.pem"

import serial
ser = serial.Serial('/dev/tty.usbmodem1411',9600)

def multi_headers():
    cherrypy.response.header_list.extend(
        cherrypy.response.headers.encode_header_items(
            cherrypy.response.multiheaders))

cherrypy.tools.multiheaders = cherrypy.Tool('on_end_resource', multi_headers)

class CherryArduino(object):
    @cherrypy.expose
    @cherrypy.tools.multiheaders()
    def index(self,value='Hello'):
        cherrypy.response.multiheaders = [('Access-Control-Allow-Origin', '*')]
        ser.write(str(value))
        return value

if __name__ == '__main__':
    cherrypy.quickstart(CherryArduino())
```

これを実行して`https://127.0.0.1:8080/?value=1`にアクセスすると、Arduinoに「１」という値が送信されます。

Arduino側のスクリプトは、こちらを参考にしてください。

http://qiita.com/usopyon/items/aada42d44c6f2cd0a3ff

Githubにも置きましたので、こちらからもどうぞ。

https://github.com/usopyon/cherrypy_serial
iOS のゲームアプリについて教えてください。

ios ゲームアプリを作ろうと考えていて
これに似たアプリがあれば教えてください。
警察が部屋のドアを開けて入ってくるまでに
泥棒がどれだけ袋の中に財宝を入れられるかを試すゲームを作ろうと思っています。
警察はドアを開ける直前にガサっという物音を立てるので
それを聞いて泥棒はスライディングをして物陰に隠れられます。
見つからなかったら警察は部屋を後にし
また再度見回りに来るのですが、見つかるまでに
どれだけお宝ゲットできるかというアプリです。

もちろん、大まかな作り方だけを
参考にしようと思っています。
現在はspritekitの参考書を終わらせたばかりです。

簡単に言えば、見張りが来る前にどれだけボタンを連打できるかというアプリなのですが
何か大まかな作り方に関してだけでもヒントをもらえると幸いです。
[Django] ModelからFormに動的な初期値を与える


環境
Python 3.5.0
Django 1.9.2

```forms.py
class CakeForm(forms.Form):
    cake_num = IntegerField(label='ケーキの数', min_value=0)

    class Meta:
        model = Cake
```

```views.py
def edit(request, store_id):
	# cake を取得できれば初期値を設定
	try:
		cake = Cake.objects.get(store=store_id)
		cake_form = CakeForm(initial = {
		    'cake_num': cake.cakenum    # 初期値
		})
	# cake を取得できなければ初期値を設定しない
	except:
		cake_form = CakeForm()
```

※ こういう時は普通 ModelForm 使うだろうけど。。。

参考文献
[DjangoのFormに動的な初期値を入れる - i2bsの日記](http://i2bskn.hateblo.jp/entry/20120826/1345936779)
[Django] ChoiceFieldに初期値を与える


環境
Python 3.5.0
Django 1.9.2

```forms.py
CAKE_CHOICES = (
    (1, 'いちごケーキ'),
    (2, 'チョコケーキ'),
    (3, 'チーズケーキ')
)

class CakeForm(forms.Form):
	medal = ChoiceField(widget=Select, choices=MEDAL_CHOICES)
	
	class Meta:
		model = Cake
```

```views.py
cake_form = CakeForm(initial = {
	'selected_cake': 2	# チョコケーキを初期値に設定
})
```
Django「QuerySet, Object has no attribute 'foo'」の解決策


環境
Python 3.5.0
Django 1.9.2

指定した記事のカテゴリーを取得してメソッドを使いたい場合

```views.py
def edit(request, article_id):
	category = Category.objects.filter(article=article_id)
	category_foo = category.foo()
```

filter を

```views.py
def edit(request, article_id):
	category = Category.objects.get(article=article_id)
	category_foo = category.foo()
```

get に変更する。
【UE4 WGJ】１週間でUE4使ってゲームを作りました。

#いきさつ
Twitterでぶっさん（@Bussan_desu）さんがWeekly Game Jam（WGJ）を行うという話を耳に挟んだので、僕も参加してみました。
#製作期間
WGJ以外にも追い込み期間に突入しているプロジェクトがあったのでがっつり１週間触れませんでした。
実質3日～4日くらいです。
#ゲームについて
プロジェクトのリンクはこちらです
https://goo.gl/vc5qa0
（ダウンロード出来なかった場合コメント等で教えていただければ幸いです）
##どんなゲーム？
端的に言えば「セインツロウの保険金詐欺モード」です。
テーマが「ファンタジー(SF)✕破壊」だったので、プレイヤーを直接フィールドに点在している破壊オブジェクトにぶつけるゲームにしました。
##気合を入れた所
メインシステムそのものではなく、リザルトシーンに一番時間をかけました。
丁度UMGのアニメーションを触ってみたかったというのもあり、かなり微調整を重ねていて「これもしかすると一生調整し続けられるのでは...？」と不安になりました。
アニメーションのおかげで想定していたリザルトの動きが出来たので大変満足です。
UMGアニメーションだけではなくスコアについても色々と微調整していました。
想定していた加点方式としては「プレイヤーの加速度＋被破壊メッシュの破片数」でしたが、被破壊メッシュの破片数を取得する方法が見つからなかったため断念しました。
#おわりに
丁度何か小さいゲームをUE4で作りたいなと思っていたところにWGJのお話があったので、大変助かりました。@Bussan_desuさんありがとうございました。
UMGアニメーションや被破壊メッシュに関しても触ってみたかった項目だったため勉強が捗り今後もゲームで活用していきたいです。
今後、このゲームは時間があればゆっくりアップデートしていきます。ゲーム性に関しても変更を加えるつもりですので、その際はまたQiitaにて共有していきます。
ブックを保護するパスワード入力画面を表示するマクロ



```vbnet

Public Const MESSAGE_OF_PASSWORD_INPUT_TITLE As String = "Input Box"
Public Const MESSAGE_OF_PASSWORD_INPUT_CONTENT As String = "Please input password"

Public Sub protectBookMain()
    Dim passPhase As String

    passPhase = InputBox(MESSAGE_OF_PASSWORD_INPUT_CONTENT, MESSAGE_OF_PASSWORD_INPUT_TITLE)
    
    If passPhase <> "" Then
        Call protectBook(passPhase)
    End If
    
End Sub

Public Sub protectBook(passPhase As String)

    Dim savePath As String
    
    Application.DisplayAlerts = False
    With ActiveWorkbook
            savePath = .Path
            saveFileName = .Name
            .SaveAs _
            Filename:=savePath & "\" & saveFileName, _
            passWord:=passPhase
    End With
    Application.DisplayAlerts = True

End Sub
```

ショートカットキー、およびイベントプロシージャの登録。

```vbnet
' オープン
Private Sub Workbook_Open()
    ' キーバインドの設定
    Application.OnKey "^{m}", "protectBookMain"
End Sub

' 閉じる前
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call protectBookMain
End Sub
```
reStructured Text と MarkDownで使いたくなる入力をまとめる

# 背景
個人的に忘れがちなものを書いておく。

# reST
## 改行
行頭に「|」を入れる。

```
|こんな感じで
|改行テキストを打つ。
```

# MarkDown
## 改行
行末に「  」（半角スペース2つ）を入れる。

```
こんなかんじで  
改行するの
```

# 余談
本当は取り消し線とか下線とかを追加したかったけど、HTML5な時代にはそぐわないのでなくした。
ファイル一覧を拡張子でフィルタするスクリプト

カレントディレクトリにあるCソースファイルを抽出したくて調べてみると、バッチだと簡単なんだけど、VBSだと地味に面倒だったという話。

# 目標
コマンドプロンプトのカレントディレクトリにあるCファイル、Hファイルの一覧を取得して処理する。
例えば、カレントディレクトに下記のファイルがあるとき。
&nbsp; extract.bat
&nbsp; extract.vbs
&nbsp; hoge.txt
&nbsp; hoge.c
&nbsp; hoge.h
下記のような出力を返すのが目標。
&nbsp; [process] hoge.c
&nbsp; [process] hoge.h
ちなみに、一覧を取得するだけならdirコマンドで取得できる。
`dir /b *.c *.h`

# バッチファイル

for文１行でおｋ

```bat:extract.bat
@echo off
for %%A in (*h,*c) do ( echo [process] %%A )
```

# VBScript
今時バッチファイルじゃないだろ、とVBSで実装してみたらやたら長くなる。
ちなみにシェルに出力するコードになってるので、実行するには下記コマンドで実行してください。
`cscript <スクリプトファイル名>`

```vbnet:extract.vbs
Option Explicit

' 検索対象ファイル拡張子
Dim targetFileExp
targetFileExp = Array("c", "h")

' FileSystemObject
Dim objFso
Set objFso = CreateObject("Scripting.FileSystemObject")

' カレントディレクトリのファイルリストから抽出する
Dim exp, file
For Each exp in targetFileExp
  For Each file In objFso.GetFolder("./").Files
    if objFso.GetExtensionName(file) = exp Then
      WScript.StdOut.WriteLine "[process] " & objFso.GetFileName(file)
    End If
  Next
Next
```

VBAからShellコマンドを呼べばもっと短くなるんじゃね？という悪魔のささやきに従った結果。

```vbnet:extract2.vbs
Option Explicit

' dirコマンド
Dim command
command = "dir /b *.c *.h"

' Execオブジェクト
Dim objExec
Set objExec = CreateObject("WScript.Shell").Exec("cmd /q /c " & command)

' Execオブジェクトの標準出力を受け取る
Do Until objExec.StdOut.AtEndOfStream
    WScript.StdOut.WriteLine "[process] " & objExec.StdOut.ReadLine
Loop

```

# PowerShell
PowerShellも簡潔にかけるけど、ps1ファイルの実行権限与えるのがすこし面倒なので、一般配布には向かない。
`Get-ChildItem -include *.c,*.h -Name | %{"[process ]"+$_}`