OmniAICreator/Qiita-1.07M huggingface dataset:
Visual Studio 2010をDream sparkでインストールする際の注意点

Visual Studio 2010をDream Sparkを使ってインストールする方法について説明したいと思います。どうせならいいやつの方がいいだろう、ということで、Professional Editionを例に説明します。

#事前準備
ISOファイル内部のファイルを手順があるため、ISOファイルをマウント(ISOファイルをドライブとみなして動作させるようにする)できるようにする必要があります。そこで、マウントソフトVirtual CloneDriveをインストールしたいと思います。
1. [ダウンロードサイト](http://www.slysoft.com/ja/download.html)を開きます。
2. **Virtual CloneDrive**の横の下矢印をクリックし、Virtual CloneDriveをインストールします。

#Visual Studio 2010 Professional Editionのインストール
1. [ダウンロードサイト](https://www.dreamspark.com/Product/Product.aspx?productid=4)を開きます。
2. **ダウンロード**をクリックすると別ウィンドウが開きます(開かない場合は、このサイトのポップアップを許可してください)。
3. **Step1**の**SDMのダウンロード**をクリックし、Secure Download Managerをインストールします。
4. **Step2**の**.SDX のダウンロード**をクリックし、SDXファイルをダウンロードし、実行します。
5. Secure Download Managerが開くので、**ダウンロードの開始**をクリックします。
6. ダウンロードされるのをしばらく待ちます(2GBあるので割と時間かかります)。
7. **起動**をクリックすると、エクスプローラが起動します。
8. **Visual Studio 2010 Professional (x86) - DVD (Japanese)**フォルダを開きます。
9. その中に入っているISOファイルをクリックするとマウントされ、インストーラが起動します。
10. インストールを行います。
クリップボードをHTMLエスケープするコマンド

### 今となっては...

もう不要かもしれないが、クリップボードのテキストをHTMLエスケープするコードを昔書いたのでポストしておく。
クリップボードでコードをコピー・カットしたあとこのコードをコンパイルしてできるコマンドを実行するとクリップボードの中身がHTMLエスケープされる。
古いコードなのでいまどきのC++ではもっときれいに書けるかもしれない。

```cpp:escape.cpp
//
// escapeclipboard.cpp : クリップボードの中身をエスケープする
//

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
#include <WindowsX.h>
#include <string>

std::wstring replace(const std::wstring& source,const std::wstring& pattern,const std::wstring& placement){
std::wstring result(source);
  for ( std::wstring::size_type pos = 0 ;
        std::wstring::npos != (pos = result.find(pattern,pos));
        pos += placement.size() )
    result.replace(pos, pattern.size(), placement);
  return result;
}

int _tmain(int argc, _TCHAR* argv[])
{
  ::OpenClipboard(NULL);
  HANDLE text = GetClipboardData(CF_UNICODETEXT);
  if(text)
  {
      std::wstring clip_text((wchar_t*)::GlobalLock(text));
      GlobalUnlock(text);
      std::wstring replaced_data;
 
      replaced_data = replace(clip_text,L"&",L"&amp;");
      replaced_data = replace(replaced_data,L"<",L"&lt;");
      replaced_data = replace(replaced_data,L">",L"&gt;");
      replaced_data = replace(replaced_data,L"\"",L"&quot;");
      replaced_data = replace(replaced_data,L"'",L"&#39;");

      HGLOBAL replaced_data_handle = ::GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE,sizeof(wchar_t) * (replaced_data.length() + 1));
      wchar_t* dest = (wchar_t*)GlobalLock(replaced_data_handle);
      ZeroMemory(dest,sizeof(wchar_t) * (replaced_data.length() + 1));
      std::copy(replaced_data.begin(),replaced_data.end(),dest);
      GlobalUnlock(replaced_data_handle);
      EmptyClipboard();
      SetClipboardData(CF_UNICODETEXT,replaced_data_handle);
      CloseClipboard();
  }
	return 0;
}
```
### このポストは
昔の私のブログ記事より作成した。
[クリップボードの中身をHTMLエスケープする](http://sfpgmr.hatenablog.jp/entry/%E3%82%AF%E3%83%AA%E3%83%83%E3%83%97%E3%83%9C%E3%83%BC%E3%83%89%E3%81%AE%E4%B8%AD%E8%BA%AB%E3%82%92%E3%82%A8%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97%E3%81%99%E3%82%8B)
Pointerの超基礎学習#2

ポインタについての学習メモ。ポインタのポインタになると少しこんがらがる。

```c
#include <stdio.h>

int main(int argc, char *argv[]) {
	
	/*
	  文字列の配列
	*/
	//char型のポインタの配列
	char *strings[] = {"Hello", "Pointer", "World"};
	
	printf("%s %s %s\n", strings[0], strings[1], strings[2]); // -> Hello Pointer World
	
	/*
	  ポインタのポインタ（多重間接参照）
	*/
	int num = 100;
	
	//ポインタ変数宣言と初期化
	int *p = &num;
	
	//ポインタのポインタ変数宣言と初期化
	int **pp = &p;
	
	**pp = 150;
	
	printf("%d, %d, %d\n", num, *p, **pp); // -> 150, 150, 150
	
	
	/*
	  ポインタのポインタを使って配列の要素を間接参照する
	*/
	//ポインタのポインタ変数を宣言
	char **str1;
	
	printf("%s %s %s\n", strings[0], strings[1], strings[2]); // -> Hello Pointer World
	
	//アドレスを代入（配列の0番目のポインタのアドレスを入れている）
	str1 = &strings[0];
	
	//配列の0番目のポインタを変更
	//なぜ **str1 = "difficult"ではないのかを考えると**str1は文字列リテラルの0番目の文字へのポインタなので
	//配列内の文字列へのポインタを差し替えるには、配列の要素であるポインタを参照しなければならないため。
	// **str1 -> 配列の0番目のアドレスを参照して得た文字列の0番目のアドレスを参照（strings[0][0]）と一緒
	// *str1 -> 配列の0番目のアドレスを参照（strings[0]）と一緒
	*str1 = "difficult";
	
	//配列の要素が変更されている
	printf("%s %s %s\n", strings[0], strings[1], strings[2]); // -> difficult Pointer World
	
	//こちらからの変更も
	strings[0] = "Hello";
	
	//ポインタから得られる参照先も変更されている
	printf("%s\n", *str1); // -> Hello

	return 0;
}
```
Pointerの超基礎学習#1

ポインタについての学習メモ

```c
#include <stdio.h>

//ポインタの学習
int main(int argc, char *argv[]) {
	
	///////////////////////////////////
	// 基本
	///////////////////////////////////
	
	int value = 100;
	
	//変数pはポインタであるという宣言
	int *p;
	
	//ポインタ変数にアドレスを代入
	p = &value;
	
	printf("value: %d, *p: %d\n", value, *p); // -> value: 100, *p: 100
	
	//ポインタ変数宣言時に代入も出来る
	int *p2 = &value; 
	
	printf("value: %d, *p2: %d\n", value, *p2); // -> value: 100, *p2: 100
	
	//ポインタ変数宣言時の int *p;（ポインタ宣言）と参照時の *p = 1; （間接演算子）の「*」は似ているけれども文法上別物である
	//試しに*p2 = &value;とすると警告やエラーが出る。
	
	
	///////////////////////////////////
	// 文字列
	///////////////////////////////////
	
	/*
		文字列リテラルは書き込み禁止領域に確保されるため、
		str1[1] = "a"のように再代入が出来ない。
	*/
	char *str1 = "Hello Pointer";
	
	/*
		char str1[] = {'H','o','g','e','\0'};
		と同じ意味を表す。char型の配列を初期化する場合はシンタックスシュガーとして文字列リテラルが使える。
	*/
	char str2[] = "Hoge";
	str2[1] = 'a'; //こちらは再代入可能
	
	printf("%s\n", str2); //-> Hage
	
	
	///////////////////////////////////
	// 配列
	///////////////////////////////////
	
	//配列を宣言
	int arr[] = {1,2,3};
	
	//配列名arrは配列の先頭のアドレスになっている
	printf("配列のアドレス: %p\n", arr); //-> 配列のアドレス: 0x7fff575d9afc（アドレスの値はマシンによって違う）
	
	//配列の要素にアクセスする場合は添字をつかう。
	printf("0番目の値: %d\n", arr[0]); //-> 0番目の値: 1
	 
	//配列名は先頭のアドレスを表しているので先頭の要素は添字を使わずこういう風に取得もできる
	printf("0番目の値: %d\n", *arr); //-> 0番目の値: 1
	
	//上のようにarr[1]は間接演算子を使って *(arr + 1)と表すことも出来る
	//配列の先頭から要素の領域(int)分、アドレスがずれるという意味
	printf("1番目の値: %d\n", *(arr + 1)); //-> 1番目の値: 2

	return 0;
}
```
jQueryのプラグイン書き方についての覚書

後から状態が変化したり、振る舞いを操作したりするような複雑なプラグインをかくときのプラグインの初期化やメソッドの呼び出し方法についていろいろ調べてみて、こんな感じかなということでメモ。

[サンプル](http://codepen.io/bukurocci/pen/EaWNez)

```js
(function($, window, undefined) {
  
    "use strict";
    
    var _slice = [].slice;
    var _toString = {}.toString;
    
    var PluginName = (function() {
        
        function PluginName() {
            this._init.apply(this, arguments);
        }
            
        PluginName.dataName = 'pluginname';
        PluginName.defaultOptions = {
            optionA: 'aaa',
            optionB: 'bbb'
        };

        PluginName.prototype = {
            constructor: PluginName,
            
            _init: function($element, options) {
                console.log('initialize!!');
            },
            
            methodA: function(a, b, c) {
                console.log('methodA', a, b, c);
            }
        };
        
        return PluginName;
    })();
    
    var methods = {
        init: function(options) {
            options = $.extend(true, {}, PluginName.defaultOptions, options);

            this.each(function() {
                var $element = $(this);
                $element.data(PluginName.dataName, new PluginName($element, options));
            });
        },
        
        methodA: function() {
            var args = arguments;
            this.each(function() {
                var context = $(this).data(PluginName.dataName);
                
                context.methodA.apply(context, args);
            });
        }
    };


    $.fn.pluginName = function() {

        var args = _slice.call(arguments);

        //First argument may be Object or method name String.
        var first = args[0];

        //The rest is an array of an argument passed when a method is called.
        var rest = args.length > 1 ? _slice.call(arguments, 1) : [];

        //If no argument is passed, invoke 'init' method with no argument.
        if (!first) {
            methods.init.call(this);
        }

        //If Object is passed as first argument, invoke 'init' method with it.
        //Sometimes there are more than one argument.
        else if($.isPlainObject(first)) {
            methods.init.apply(this, args);
        }

        //If first argument is String, a method will be invoked.
        //The rest is passed as arguments.
        else if(_toString.call(first) === '[object String]' && (first in methods)) {

            methods[first].apply(this, rest);
        }

        //Otherwise, an error will be thrown.
        else {
            $.error('Failed to invoke a method or to initialise plugin.');
        }

        return this;
    };
    
})(jQuery, window);


$(function() {
  //initialize
  $('#someDiv').pluginName(); //-> 'initialize!!'
  
  //invoke a method
  $('#someDiv').pluginName('methodA', "a", "b", "c"); //->'methodA a b c'
});

```

実際の操作はnewで初期化したオブジェクトで行い、メソッドの呼び出しはプラグイン呼び出し時に文字列を渡して行う。外部から呼び出せるメソッドはmethods変数のメソッドに中継させる形。
jQuery.innerWidthでDOMに突っ込む前の要素を調べるとブラウザごとに帰ってくる数値が違う

CSSで指定した値が入ってくるかと思っていたのですが...。

```css
ul {
  padding-left: 77px;
}
```

というCSSがあったとして

```js
$('<ul />').innerWidth();
```
上のJSのjQuery.innerWidthの返り値は下の表のようにブラウザごとに違います。


Browser | value
:--------|:-------
IE      |40
Firefox |77
Safari/Chrome|0

IEではブラウザデフォルトCSS、Firefoxでは指定したしたCSS、safari/ChromeではそもそもCSSがあたっていないように観られます。

原因をもう少し深く追ってみましょう。

jQuery.innerWidthは内部ではoffsetWidthの値から左右のボーダー幅を取り除いた数値を返すか、offsetWidthの値が0の場合、左右のpaddingを足し合わせた数値を返すようになっています。

DOMに挿入されていない要素のoffsetWidthの値は0になるので、左右のpaddingを取得しているのですがこのときwindow.getComputedStyle（古いIEではHTMLElement.currentStyle）を使用してを取得しています。

そして、window.getComputedStyleで返却されるCSSStyleDeclarationオブジェクトのプロパティの値の仕様がDOM上にない場合それぞれのブラウザで違うことが原因となっているようです。

DOM上にない要素に対してこのような処理を行う場合は注意が必要みたいです。
CodeigniterでのNo input file specifiedの対処法

参考URL:http://p-note.info/?p=342

1.config.phpを設定する

application/config/config.phpを以下のように設定する。

$config['index_page'] = "";

$config['uri_protocol'] = "AUTO";

2.htaccessを設定する

CodeIgniterのフォルダの直下に以下の内容の.htaccessを置く

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/system.*
RewriteRule ^(.*)$ index.php?/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?/$1 [L]

最終行の「RewriteRule ^(.+)$ index.php?/$1 [L]」はドメイン直下にCodeIgniterがある場合。
ディレクトリ構成に合わせて要変更。
pythonでrubyのstructがほしい時

pythonでrubyのstructがほしい時に・・・

# 前提

Python 3.4.1

# namedtuple

namedtuple を使うらしい

```lang:ipython
>>> from collections import namedtuple
>>> f = ('Request', 'host sc  size')
>>> Request = namedtuple('Request', 'host sc size')
>>> r = Request('10.60.111.10', 200, 456)
>>> print (r)
Request(host='10.60.111.10', sc=200, size=456)
>>> print(r.size)
456
```

ただし変更をしようとすると AttributeError が発生

```lang:ipython
>>> r.size = 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
```

# サンプル

ホスト名・ステータスコード・サイズを namedtuple で宣言。
.host みたいにアクセスできる。

```lang:sample.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from collections import namedtuple

Request = namedtuple('Request', 'host sc size')
request = Request('10.60.111.10', 200, 456)
print(request)
# stdout: Request(host='10.60.111.10', sc=200, size=456)
print(request.size)
# stdout: 456
```

# リンク

書き換え可能なstruct

[PythonでRubyのStruct風の構造体を実現する](http://d.hatena.ne.jp/saitodevel01/20100605/1275728303)
Windowsのhostsファイル

Windowsのhostsをメモ

# 確認したOS

Windows7

# ファイルパス

C:\Windows\System32\drivers\etc\hosts

# デフォルト

変更していないと

```lang:hosts
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

# localhost name resolution is handled within DNS itself.
#	127.0.0.1       localhost
#	::1             localhost
```
# 必要に応じて修正

```lang:hosts
# localhost
127.0.0.1       localhost    dbserver
::1             localhost
# local computers
192.168.0.10     appserver   appserver.local
192.168.0.11     mailserver  mailserver.local
# remote netowork computers
10.60.111.10     appremote   appremote.remote.sample.com
10.60.111.11     appremote   appremote.remote.sample.com
```

# リンク

[@IT リモート・ネットワークの名前解決をhosts／lmhostsで行う](http://www.atmarkit.co.jp/fwin2k/win2ktips/445hosts/hosts.html)
Adobe製のJavaScriptデバッガTheseusがすごい

この前、研究室の先生に教えてもらったAdobe製のJavaScriptデバッガTheseusがかなり便利なのでご紹介します。

##Theseusとは
[Theseus](https://github.com/adobe-research/theseus)は、AdobeとMITの共同研究から生まれたJavaScriptのデバッガです（[→学会論文](http://alltom.com/pages/cv/chi-2013-theseus.pdf)）。ChromeとNode.jsの上で動きます。具体的に何をしてくれるのかをざっくり言うと、関数のコールを追跡して、[Brackets](http://brackets.io/)というAdobe製のエディタに下画像のような感じで表示してくれます。

![alt](https://camo.githubusercontent.com/07c3a68a12e6a819fdeaced255a28f325458cae0/68747470733a2f2f7261772e6769746875622e636f6d2f61646f62652d72657365617263682f746865736575732f67682d70616765732f73637265656e73686f742e706e67)

Theseusのすごいところは、コールバックの実行まで追跡してくれることです。もちろん、エラーが起きた箇所もすぐに見ることができます。また、デバッグをするとき、気になる箇所に```console.log```を挟むことがあると思いますが、Theseusを使えばその必要もありません。関数の横に表示されているコール回数をクリックすれば、その関数の実行ログを表示してくれるからです。

##導入方法

１、[Brackets](http://brackets.io/)のなるべく新しいバージョンをインストールします
２、Bracketsを起動し、「ファイル」の「拡張機能マネージャー」から、Theseus for Bracketsをインストールします
![img2.png](https://qiita-image-store.s3.amazonaws.com/0/6642/419991b4-313c-9be7-89e9-50e626169bd8.png)

![img1.png](https://qiita-image-store.s3.amazonaws.com/0/6642/257381fe-ad9f-be04-ec9d-5ae4341864a5.png)  
  
３、ブラウザ上で使いたい人はChromeが入っていれば大丈夫です。Node.jsで使いたい人は、```node-theseus```をnpmからインストールします

```sh:terminal
$ npm install -g node-theseus
```

４、拡張機能をアクティベートするために、Bracketsを再起動します。
５、ブラウザ上で利用する方はBracketsのライブプレビューを、Node.jsから利用する方は```node```コマンドの代わりに```node-theseus```コマンドを使ってプログラムを実行します。


```sh:terminal
$ node-theseus myapp.js

```

なお、Theseusでは結果をBracketsに直接表示するため、Bracketsの表示（テーマなど）をカスタマイズするプラグインに、一部衝突してしまうものがあり、僕も最初それが原因でうまく動きませんでした。すでにBracketsを自分用にカスタマイズしている方は、ご注意ください。

また、Theseusは実行過程のトレースに重きを置いているため、シンタックスエラーにめっぽう弱いです。僕のようなシンタックスクラッシャーな方には、併せてJSLintも入れておくことをお勧めします。

##対象外指定オプション

Theseusには対象にしたくないファイルの指定をするオプションが用意されています。何も設定をしないと、Theseusは読み込まれるすべてJavaScriptファイルについて、関数コールの追跡を行います。jQueryやD3.jsなど、サードパーティのライブラリを用いた開発においては、これでは必要以上の負荷がかかってしまい非効率的です。
###theseus=noオプション

```html:index.html
<script src="library.js?theseus=no"/></script>

```
Chrome上でTheseusを使う際のオプションです。対象にしたくないファイルのパスの後ろに、クエリとしてくっ付けて指定します。


###theseus-excludeオプション

```sh:terminal
$ node-theseus myapp.js --theseus-exclude='pattern*.js'
```
Node.js上でTheseusを使う際のオプションです。```theseus-exclude=```の後に、対象にしたくないファイル名をパターンで指定することができます。

###no instrumentコメント
```js:script.js
/*theseus instrument: false */
```
その他、最初から対象にしたくないファイルの先頭に、コメントで「対象外」と直に書いてしまうという手段もあります。

## まとめ

中身を読んだわけではない（読んでも多分理解できない）ですが、イメージ的にはNode.jsやChromeのJavaScript実行系の一部がパイプされてるような印象を受けました。
  
以上です。
ぜひお試しください

--
*追記*
Theseusの読み方は[テーセウス(テセウスとも)](http://ja.wikipedia.org/wiki/%E3%83%86%E3%83%BC%E3%82%BB%E3%82%A6%E3%82%B9)だそうです。
AWSから外部へ通信する時のGlobal-IPを固定させたい



##1.ユースケース

やりたいことはざっくり以下の図のとおりです。

![](https://s3-ap-northeast-1.amazonaws.com/kaojitario7/qiita-image/20141129/01_architecture-image.png)


で、細かい要件が以下になります。


>・AWS内のWebサーバからAWS外部のアプリケーションへアクセスする機能がある
・その外部アプリケーションサーバとは専用線接続などはできない（Private-ip通信ができない）
・外部アプリケーションでは、IPアドレスによるアクセス制限を行っている
・外部アプリケーション側は、IP制限設定を動的に処理させることができない（運用制約上）

IGWはいじれないので、EIPでなんとかする必要があります。。。



よくあるプラクティスは、「インスタンス起動時に新規でEIPをallocateしてassociateする」という方式になりますが、外部アプリケーション側に動的に設定を反映できないので、これは採用できませんでした。。。


##2.実現方式の候補

ではどうするか。。。やり方としては大きく3方式考えられると思います。
　①：NATサーバを立て、そこにEIPを割り当てる。
　　　Webサーバからのインターネットアクセスは、NATサーバを経由させる
　②：Direct Connectを使ってオンプレ側のデータセンターとつないでいるのなら、
　　　インターネットアクセスは全てオンプレ側のProxyを経由させる
　③：Webサーバ台数分のEIPをストックしておき、起動時にassociateするスクリプトを書く


①はNATサーバのインスタンスコストがかかるし、SPOF対策をすると、コストは2台分になり、動的ルーティング切換え処理も必要になってきます。このためだけにNATを立てるということなら、無しですね。
②は既存のオンプレ側のルーティング設定をいじることになるので、色々政治的な問題が発生したりしてしまいます。。。
③もEIPを遊ばせておくコストがかかってきますが、インスタンスコストに比べれば安いもんでしょう。

ということで今回は③のやり方を採用し、そのやり方をメモしておきます。



##3.予め取得しておいたEIPから、空きを自動でassociateするスクリプト
次のスクリプトをインスタンス起動時に自動実行するように仕込んでやります。

```Bash
#EIP割り当て処理
associate_eip()
{
  #インスタンスに割り当てられていないEIPを取得する
  ALLOC_ID_LIST=(`aws ec2 describe-addresses --query 'Addresses[?InstanceId=='null'].[AllocationId]' --output text`)

  #割り当て可能なEIPのひとつ（先頭）のAllocate-IDを取得
  ALLOC_ID=${ALLOC_ID_LIST[0]}

  #EIP割り当て（no-allow-reassociationを指定すれば、上書きされることがないので、衝突した場合はエラーが返される）
  `aws ec2 associate-address --instance-id <自分のInstance-Id> --allocation-id ${ALLOC_ID}  --no-allow-reassociation`
  if [ $? != 0 ]; then
    return 1
  fi
  return 0
}


# main

#EIP割り当て処理が成功するまで繰り返し（同時起動による衝突を考慮するため）
STATUS="failed"
while [ "${STATUS}" = "failed" ]; do
  #EIP取得処理の呼び出し
  associate_eip
  #成功したらSTATUSを更新してループを抜ける
  if [ "$?" -eq 0 ]; then
    STATUS="success"
  fi
done
```



<br>

空いているEIPを取得し、そのEIPをassociateします。
ただ、オートスケールで複数台同時に起動したような場合、複数のインスタンスで同じEIPを取得してしまう可能性があります。
このあたりの排他制御を厳密にやろうとすると面倒なので、とりあえず取得したEIPを割り当てようとします。
もし割り当てに失敗したら、空いているEIPを再度取得し直してassociateを試みる、
この繰り返しをしています。

<br>
エラー処理は別途必要ですが、こんなロジックで対応してみました。
もっと良いやり方があれば教えてください。
HTML Media Capture API  で画像を取得して Rekognition API で認識する

## 目標

デバイス付属のカメラから画像を取得して、
画像処理 API Rekognition に入れて認識させる。

## 制限

認識 API へのデータ送信は、現状 URL を指定する方法しか
動くことを確認していないので、1, 3 の間に 2 が必要。

1. カメラから画像取得
2. 手作業、ないしサーバ側のコードによる外部からアクセスできる場所への画像の保存
2. 認識結果の取得

## 方法

### カメラから画像取得

ブラウザによらずにオブジェクトを取得するために、名前を揃える。

```js
navigator.getUserMedia = navigator.getUserMedia       ||
                         navigator.webkitGetUserMedia ||
                         navigator.mozGetUserMedia    ||
                         navigator.msGetUserMedia;
window.URL = window.URL || window.webkitURL;
```

getUserMedia メソッドで画像を取得。
myVideo という id をつけた video 要素に対して、
カメラから取得した画像情報を流し込む。 (src の設定)
そして、再生を開始 (play)

```js
function getMedia() {
  navigator.getUserMedia(
    {video: true},
    function(localMediaStream) {
      myVideo  = document.getElementById('myVideo');
      stream = localMediaStream;
      src = window.URL.createObjectURL(localMediaStream);
      myVideo.src = src;
      myVideo.play();
    },
    function(err) {
      alert('カメラから映像を取得することができませんでした。');  
      console.log(err);
    }
  );
}
```

キャプチャ部分。
snap という id のボタンをクリックすると始まる。

```js
document.getElementById("snap").addEventListener("click", function() {
  // canvas オブジェクトの取得
  var canvas = document.getElementById("canvas");
  context = canvas.getContext("2d");

  // video に流されるデータを canvas に書き込み
  context.drawImage(myVideo, 0, 0, 640, 480);

  // canvas のデータを data URL に変換して href に設定
  $("#captured").attr("href", canvas.toDataURL("image/png"));
});
```


### 認識結果の取得

1. https://rekognition.com/user/create
ここからアカウントを作って API Key, API Secret を取得
API Key を kkk, API Secret を sss と仮定。
2. 画像を置く。
例えば http://example.com/example.png 
3. https://rekognition.com/developer/face
に従って Web URI にアクセスする。
例えば

```bash
http://rekognition.com/func/api/?api_key=kkk&api_secret=sss&jobs=face_emotion_part&urls=http://example.com/example.png
```

* api_key に API Key
* api_secret に API Secret
* urls に画像への URL
* jobs に走らせたいジョブを結合したもの (この場合 emotion, part なので face_emotion_part)
  結合できるジョブ (=機能) のリストは
  https://rekognition.com/developer/face
  ここの3行目 (jobs) を参照。

## 参考文献
* HTML5 Rocks
http://www.html5rocks.com/ja/tutorials/getusermedia/intro/
* Sample code
https://developer.mozilla.org/ja/docs/Web/API/Navigator.getUserMedia
* ReKognition API
https://rekognition.com/developer/face
制作効率をグッと上げてくれた素敵なフリーツールたち[win/mac]

#はじめに
はじめまして！今回初めてQiitaに投稿させていただきます！

私は普段web制作会社でデザインやフロント周りのコーディングを行っています。今まで面倒臭がって情報を外部に発信することはほとんどしてきませんでしたが、最近の成長具合に限界を感じ始めたこともあり、積極的にアウトプットしていこうと一念発起しました。もし何か少しでもお役に立つことがあれば幸いです。よろしくお願いします！

-----

今回は私の制作効率をグッと上げてくれている素敵なフリーツールをまとめてみます。

* win/mac 混在です
* Google日本語入力のように大分メジャーと思われるものは除いています
* 基本無料で使えるものですが、個人のみ無料など使用条件が制限されているものもあるかもしれません
* 各ツールのご利用/インストールは自己責任でお願いします


#仮想デスクトップ
ちょこちょこウィンドウのサイズや位置を変えていた手間が一気に解消され、シングルディスプレイでも十分に作業できるようになりました。このデスクトップはコーディング専用、こっちはチャットやメール専用、といった具合で切り替える度に頭が整理される気がします。

* mac: 現在のOSXでは標準装備
* win: [Dexpot](http://dexpot.de/)
    * 個人のみフリー
    * 私はデスクトップの切り替えに ctrl + shift + alt + 矢印を割り当てています（さらにマウスジェスチャーにも適用しています）

<こんな感じ　※デュアルモニタで4つのデスクトップ×2>
![仮想デスクトップイメージ.png](https://qiita-image-store.s3.amazonaws.com/0/58436/d38f8cca-0f7c-3678-619e-5227d44f23fa.png)


#キーボードランチャー
ホットキーでよく使うアプリケーションを起動することができます。検索してくれるのでアプリを登録する手間がないのも素敵です。

* mac: [Alfred](http://www.alfredapp.com/)
* win: [fenrir](http://www.vector.co.jp/soft/dl/win95/util/se362264.html)


#ウィンドウサイズおよび位置の自動調整
仮想デスクトップを使用していても、相変わらずウィンドウの調整は行っているので、助かっています。

* mac: [BetterTouchTool](http://blog.boastr.net/)
    * 画面の隅にウィンドウを持って行くといい感じでリサイズしてくれる機能があります
* win: [sizer](http://www.forest.impress.co.jp/library/software/sizer/)
    * あらかじめ登録したサイズと位置に2クリックで調整してくれます
    * 私はこんな感じ↓に設定しています(解像度によって調整必要)

![sizer_setting.png](https://qiita-image-store.s3.amazonaws.com/0/58436/1529560f-9b4c-84a7-20ce-4d8e9f562111.png)


#クリップボード拡張
入力の手間を省くのももちろんですが、万が一の時に助けて貰ったことが何度もあります。
バックアップの無いファイルを間違って空にして上書きしてしまったぁ！→クリップボードに残ってて助かった...
私は定型文の登録よりも、セーブ感覚で使うことが多いです(すぐにこの状態に戻せるように一旦コードを全選択コピーしておこう)。

* mac: [clipmenu](http://www.clipmenu.com/ja/)
* win: [clibor](http://www.amunsnet.com/soft.html)


#簡単なキーバインド
腱鞘炎がよくなりました。

* mac: [karabiner](https://pqrs.org/osx/karabiner/index.html.ja)
  * enthumbleのIJKL設定ができます
* win: [enthumble](http://jp.enthumble.com/)
  * 無変換 + IJKL = 移動
  * 無変換 + space = Enter
  * 無変換 + n(m) = BackSpace
  * 無変換 + <(>) = Delete
  * 無変換 + 変換 = Esc
  * 無変換 = 半角入力切り替え
  * 変換 = 全角入力切り替え


#マウスジェスチャー
進む(右クリック→)、戻る(右クリック←)、ホームを開く(右クリック↑)、更新(右クリック↑↓)、仮想デスクトップ切替(ctrl + 右クリック + 矢印)。これくらいしか設定していませんが、すこぶる快適です。

  * mac: なし(Trackpadで事足りてしまっているので)
  * win: [OpenMauSuji](https://bitbucket.org/openmausuji/openmausuji/wiki/Home)


#ディスプレイのブルーライトを軽減
これを使うようになってからは目の疲れがずいぶんマシになったと自覚があります。
私は常に3200kで使用しています。効果を無効にするのも簡単なので、デザイン作成時には一旦切ったりと使いやすいです。

  * OS共通: [Flux](https://justgetflux.com/)


#その他windows用アプリ
* [Rekisa](http://frozenlib.net/rekisa/) → 一度に3つ以上のファイル比較ができます。対応はファイル単位ですが、見やすく使い勝手が良いです。
* [WinMergeU](http://www.geocities.co.jp/SiliconValley-SanJose/8165/winmerge.html) → サブフォルダも含めて比較ができす。ざっと差異が無いか確認したい時に大活躍します。
* [grepReplace](http://services.dreamhive.co.jp/dhappli/grepreplace/) → 複数行をサブフォルダも含めて一括置換できます。分かりやすく使いやすいので重宝しています。
* [LICEcap](http://www.cockos.com/licecap/) → 画面上の動きをそのままgifアニメで録画できます。私はバグの報告として再現の様子をgifアニメ化して共有することが多いです。
* [Flexible Renamer](http://hp.vector.co.jp/authors/VA014830/FlexRena/) → 視覚的に分かりやすく、複雑な条件でも比較的簡単にリネームすることができ、使用頻度が高いです。
EC2インスタンス(RHEL6.5)起動時にUser-dataが実行されるタイミング


##1.User-dataとは？

AWSでは、インスタンス起動時に、User-dataという起動引数みたいなものを渡すことができます。
これは、初回起動時のみ実行される処理になります。
initプロセスの自動起動設定のように、起動時に毎回実行すべき処理と、
最初の1回だけ動けばいいものの棲み分けを行うことができます。

じゃ、具体的にUser-dataに記述した処理はいつ動くの？というのを整理してみました。


##2.S50cloud-init-localで実行される

User-dataで指定したスクリプトは、`/etc/rc3.d/S50cloud-init-local`で実行されます。
つまり、まず最初に`network`、`iptables`や`NFS`などのコアサービスを起動し、
その後にUser-dataが実行され、さらにその後に`SSH`や`LAMP系サービス`が立ち上がってくる、
という流れです。


##3.いつ実行されるのかを考慮した上で設定しよう

例えば、httpd.confを置き換える処理をUser-dataに記述したい場合、
　・htpd.confを置き換えるのが先か？
　・自動起動設定されたhttpdサービスが起動されるのが先か？
を知った上で設定しなさいよ、という話です。

もしhttpdの起動が先なのであれば、User-data側の処理にhttpd restartを追記しなければ、
そのconfigの設定は有効にならないからです。

httpdは自動起動設定を行うと`/etc/rc3.d/S85httpd`で起動されるので、
`/etc/rc3.d/S50cloud-ini-local`(User-data)が先、ということになります。

逆に、ネットワークマウントしているドライブのファイルへアクセスするような場合、
`S25netfs`は、`S50cloud-init-local`よりも先に実行されるので、
User-data側に`mount`コマンドを仕込む必要はありません。

なぜcloud-init-localで実行されるのかなど、もっと細かい挙動は、
[Amazon Linuxのcloud-initの動きについて調べてみた](http://dev.classmethod.jp/cloud/aws/probe-cloud-init/)を参照してください。
Dart1.8リリースノート

こんにちは、らこです。

昨日[Dart1.8のリリースノート](https://groups.google.com/a/dartlang.org/forum/#!topic/announce/OBhiFkSv28o)が発表されました。リリースノートでは標準ライブラリの改善のみということになっていますが、Dart1,8に同梱されるDartEditorに`enum`が使える機能が試験的に実装されています。残念ながら`async/await`はまだ先のようです。それでは以下、個別の解説です。

## dart:collectionに関する変更

### SplayTreeSetクラスにtoSetメソッドを追加
[SplayTreeSet](https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:collection.SplayTreeSet)クラスにtoSetメソッドが追加され、自身のクローンを返すようになっています。あまり馴染みのないクラスかと思いますがが、SplayTreeというのはキーを自動的に二分木にバランシングして二分探索できるようにしてあるデータ構造で、具象クラスはSplayTreeSetと[SplayTreeMap](https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:collection.SplayTreeMap)があります。用途としてはそこまで数が多くなく頻繁にアクセスするデータ、すなわちキャッシュ等が適しているかと思われます。

## dart:convertに関する変更
### JsonUTF8Encoderを追加
[JsonUtf8Encoder](https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:convert.JsonUtf8Encoder)がdart:convertに追加されました。今までUTF-8にエンコードされたJSONを生成するにはまずオブジェクトをJSON文字列にエンコードし、その後文字列をUTF-8のバイト列にエンコードするという２段階の処理が必要でしたが、このクラスはそれをまとめてやってくれます。

## dart:coreに関する変更
### RangeErrorの変更とIndexErrorの追加
[RangeError](https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:core.RangeError)の２つの名前付きコンストラクタ`RangeError.value`と`RangeError.range`に新しく`message`パラメータが追加されました。これですべてのコンストラクタでエラーメッセージを変更できるようになりました。また、`RangeError.index`コンストラクタが追加されました。このコンストラクタはfactoryコンストラクタになっており、内部ではこれまた新しいクラスである[IndexError](https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:core.IndexError)が返されるようになっています。IndexErrorはインデックスのあるオブジェクトに対する範囲外アクセスに特化したRangeErrorです。

### String.fromCharCodesコンストラクタにstartとend引数を追加
[String.fromCharCodes](https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:core.String#id_String-fromCharCodes)は文字コード列からStringオブジェクトを生成するコンストラクタですが、オプショナル引数として文字コード列の読み取り開始・終了インデックスを指定できるようになりました。

## dart:ioに関する変更
### HttpClient、HttpServerのTLSプロトコルでALPN extensionをサポート
これは標準APIの拡張ではなく内部実装の改善ですが、SPDYなどのTLSプロトコルの選択機構（？）であるAPLN(Application-Layer Protocol Negotiation)をサポートしたようです。

## 試験的実装
### enum
いよいよDartにもenumが実装されますが、現在はDartEditor上で、Tools > Preferences > Experimental にある “Enable Enums Support” を有効にしないと使えません。enumは次のようなコードが書けるようになります。

![enum](http://2.bp.blogspot.com/-qVk8g74GmvA/VHhvNVB1GGI/AAAAAAAACrs/CN7i2eJU5Sk/s1600/enums.png)


----
以上Dart1.8の主な変更点です。enumによってますますJavaらしさが増したような気がします。正式実装され次第詳しい仕様などはまとめようと思います。
Google MapsのマーカーをRetinaディスプレイにサクッと対応させる


Google Mapsのマーカー、Retinaディスプレイでそのままだと画像がボケちゃうのでその対策。

とは言えやることは、大きいサイズの画像を読み込む→縮小して表示させるといういつもの手順。でもまぁもう一度英文読むのとかイヤなので、マップ周りのコードごとまとめてストックしとこうそうしよう。


```javascript
var myLatlng = new google.maps.LatLng(34.687571, 135.526239);

function initialize() {
  var mapOptions = {
    zoom : 17,
    center : myLatlng
  };
  var map = new google.maps.Map(document.getElementById('map'), mapOptions);

  var image = {
    url : 'icon.png',
    scaledSize : new google.maps.Size(48, 48)
    // ↑ここで画像のサイズを指定
  }

  var marker = new google.maps.Marker({
    position : myLatlng,
    map : map,
    icon : image,
    title : "hogehoge"
  });
}
google.maps.event.addDomListener(window, 'load', initialize);
```

もちろん画像は、表示させたいサイズ×2とかで作りましょう。めんどｋ…


## 参考・引用

- [オーバーレイ - Google Maps JavaScript API v3 — Google Developers](https://developers.google.com/maps/documentation/javascript/overlays#Icons)
- [Markers - Google Maps JavaScript API v3 — Google Developers](https://developers.google.com/maps/documentation/javascript/markers#convertingtoicon)
RubyでUNIXTIME変換


よく忘れるのでメモ。

## 1. UNIXTIMEからDATETIMEへの変換

```ruby
Time.at(1414767600)
# => 2014-11-01 00:00:00 +0900
```

## 2. DATE(TIME)からUNIXTIMEへの変換
```ruby
require 'time'
Time.parse('2014-11-01 00:00:00').to_i
# => 1414767600

# Dateも可能
Time.parse('2014-11-01').to_i
# => 1414767600
```
Tizen IVI 3.0 on VMware を動かす

# 動機
最近の Tizen どうなの、Tizen IVI 3.0 どうなの、と気になったので、動かしてみた。

使ったのは、2014/11/28 現在最新版の、
Oct 28, 2014 3.0-M3-Oct2014 milestone
のもの。

# 使用機材

| 使用機材 | 注 |
|:--------|--:|
| Windows 7 64bit | VMware Player インストールしてある前提 |
| Ubuntu12.04 | vmdk イメージ作成用 |


# 手順

## Tizen IVI 3.0 image download
https://wiki.tizen.org/wiki/IVI/IVI_3.0_VMware
を起点に、
All Tizen IVI 3.x preview release notes can be found here: Tizen IVI 3.x milestone
↓
https://wiki.tizen.org/wiki/IVI#Tizen_3.x_codebase
Oct 28, 2014 3.0-M3-Oct2014 milestone
↓
https://wiki.tizen.org/wiki/IVI/Tizen-IVI_3.0-M3-Oct2014
32-bit Tizen-IVI 3.0-M3-Oct2014
↓
http://download.tizen.org/releases/milestone/tizen/ivi-3.0.m14.3/tizen-3.0.m14.3-ivi_20141028.3/images/atom/ivi-mbr-i586/
tizen-3.0.m14.3-ivi_20141028.3_ivi-mbr-i586-sdb.raw.bz2
をダウンロードする。

## vmdk ファイル作成

Ubuntu から以下実行。

```
$ sudo apt-get install qemu-utils
$ bunzip2 tizen-3.0.m14.3-ivi_20141028.3_ivi-mbr-i586-sdb.raw.bz2
$ qemu-img convert -f raw -O vmdk tizen-3.0.m14.3-ivi_20141028.3_ivi-mbr-i586-sdb.raw tizen-3.0.m14.3-ivi_20141028.3_ivi-mbr-i586-sdb.raw.vmdk
```

出来た vmdk ファイルを windows PC へ持っていく。

## VMware player 準備

以下、 Step1,2,3 はオリジナルのページ
https://wiki.tizen.org/wiki/IVI/IVI_3.0_VMware
をそのまま揃えるとして、

### Step1
VMware Player 起動
ファイル → 新しい仮想マシン
後で OS をインストール 次へ
ゲストOS: Linux
バージョン: Fedora
仮想マシンの名前
　適当につける。
　tizen-ivi-october-2014-milestone-mbr
　など。
ディスク容量の設定
　未変更（20GB）
　仮想ディスクを分割しないで実行
ハードウェアのカスタマイズ
　好きに設定。
完了


### Step2
設定
　ハードディスクを選択し、削除
追加
　ハードディスク
　IDE 次へ
既存の仮想ディスクを使用 次へ
　C:\<..>\tizen-3.0.m14.3-ivi_20141028.3_ivi-mbr-i586-sdb.raw.vmdk
を選択。
OK

### Step3
仮想マシンの再生

起動した。

## スクリーンショット
![tizenivi3.0_boot.png](https://qiita-image-store.s3.amazonaws.com/0/35514/968ae21f-4379-d7ee-9b53-53ad26740800.png)

![tizenivi3.0_terminal.png](https://qiita-image-store.s3.amazonaws.com/0/35514/429340ec-8b79-ca76-5aa3-bba59e7748b0.png)

![tizenivi3.0_ls_include.png](https://qiita-image-store.s3.amazonaws.com/0/35514/5e1b8629-422a-a2af-35bf-33f79996ae8f.png)

うん、シンプルでいいねぇ。って。。

# え！？

まさかのアプリアイコン無しで何も遊べない。
アプリビルドしようにも、ヘッダが efl と python しか入ってなくてビルドも手間そう。。

# 詰まったところ
> 仮想ディスクを分割しないで実行

最初は「仮想ディスクを複数のファイルに分割」
でやっていたが、起動できなかった。

# 続き
アプリを動かすまでを [crosswalk on Tizen IVI 3.0 を動かす
](http://qiita.com/naohikowatanabe/items/09991d7bf35ee3006b42) に書きました。
Erlang cowboy メモー

The **cowboy** application uses the Erlang applications **ranch** for listening and accepting TCP connections, **crypto** for establishing Websocket connections, and **cowlib** for parsing and building messages for Web protocols. These dependencies must be loaded for the cowboy application to work. In an embedded environment this means that they need to be started with the **application:start/{1,2}** function before the cowboy application is started.

The cowboy application also uses the Erlang applications **asn1, public_key and ssl** when listening for HTTPS connections. These are started automatically if they weren't before.

----

**Ranch** is a socket acceptor pool for TCP protocols.
Ranch aims to provide everything you need to accept TCP connections with a small code base and low latency while being easy to use directly as an application or to embed into your own.

Ranch provides a modular design, letting you choose which transport and protocol are going to be used for a particular listener. Listeners accept and manage connections on one port, and include facilities to limit the number of concurrent connections. Connections are sorted into pools, each pool having a different configurable limit.

Ranch also allows you to upgrade the acceptor pool without having to close any of the currently opened sockets.

----

The most basic handler in Cowboy implements the mandatory init/2 callback, manipulates the request, optionally sends a response and then returns.

This callback receives the Req object and the options defined during the router configuration.

A handler that does nothing would look like this:

```erlang
init(Req, Opts) ->
    {ok, Req, Opts}.
```
[Linux] wgetをプロキシ経由で実行する方法

必要に追われてwgetをプロキシ経由で実行する必要があり、調べてみました。
すでに各所で情報はありますが、折角なのでプロキシを通してwgetを実行する方法を紹介します。
（ 元記事：http://d.hatena.ne.jp/nuttinutti/20141128 ）

##ユーザ毎に設定したい場合

~/.wgetrcに以下を記述してください。

```shell-session:~/.wgetrc
http_proxy=http://${xxx.xxx.xxx.xxx}:${pp}/
proxy_user=${user}
proxy_password=${pass}
```

* ${xxx.xxx.xxx.xxx}：プロキシサーバのIPアドレス
* ${pp}：プロキシに利用するポート（基本的にはhttpのポート番号80を指定）
* ${user}：プロキシとして利用するユーザ
* \${pass}：${user}のパスワード

##全ユーザのデフォルト動作として設定したい場合

/etc/wgetrcに以下を記述してください。
この例では、httpsとftpについてもプロキシを設定しています。

```shell-session:/etc/wgetrc
http_proxy=http://${xxx.xxx.xxx.xxx}:${pp}/
https_proxy=http://${xxx.xxx.xxx.xxx}:${ss}/
ftp_proxy=http://${xxx.xxx.xxx.xxx}:${qq}/
```

* ${xxx.xxx.xxx.xxx}：プロキシサーバのIPアドレス
* ${pp}：プロキシに利用するポート（基本的にはhttpのポート番号80を指定）
* ${ss}：httpsのプロキシで利用するポート（基本的にはhttpsのポート番号443を指定）
* ${qq}：ftpのプロキシで利用するポート（基本的にはftpのポート番号21を指定）

##参考情報
* http://www.geocities.jp/gronlijus/skill/linux/linux-wget-proxy.html
* http://blog.rutake.com/blog/techmemo/2007/09/wgetproxy.html
PyData Tokyo Meetup #2 に参加してきた


[PyData Tokyo Meetup #2 - 新しいデータ解析インフラ](http://pydatatokyo.connpass.com/event/9923/)に参加してきました！
以下は聴講しながらまとめたメモなので，特にまとまってないです．

※PyData Tokyo自体については，以下のページを参照して下さい．
http://pydatatokyo.connpass.com/


## 内容

### Amazon Kinesisの紹介と使いどころ
Amazon Kinesisはハイボリュームな連続したデータをリアルタイムで処理可能なフルマネージドサービスです．

- ユースケース
	- サービスやシステムのリアルタイム状況把握
	- 異常検知 (e.g. 不正アクセス検知)
	- サービス向上 (e.g. ソーシャルデータを用いたリアルタイムサービス，直近の行動に基づくレコメンデーション)
- 構成
	- Streamを作成し，Streamは，1つ以上のShardで構成される
	- Shardは，データ入力側 1MB/sec，1000 TPS，データ処理側 2MB/sec，5TPSのキャパシティを持つ
- PutRecord APIでデータ入力が可能 (**Python**ももちろん利用できる(boto))
- パーティションキーを基にShardに分配するので，Shardingはパーティションキーの設計が肝
- KinesisがStream内でユニークなシーケンス番号を付与するので，シーケンス番号でデータが何回でも取得できる（24時間以内なら → 今後より柔軟に時間設定が出来るようになるかも）
- GetShardIteator APIでShard内のデータを取得し，GetRecords APIでデータ入力が可能

Kinesis Client Library (KCL) が **Python** に対応した話

- [Kinesis Client Library for Python](https://github.com/awslabs/amazon-kinesis-client-python)
	- KCL for Javaの'MultiLangDeamon'を常駐プロセスとして利用し，データ処理のメインロジックをPythonで記述できる
	- データ処理は，サブプロセスとして起動される
	- 'MultiLangDaemon'とサブプロセス間のデータ通信は，定義されたプロトコルでSTDIN/STDOUTを使って行われる

AWS+[Jubatus](http://jubat.us/ja/)の話が個人的には興味深かったです．
AWS re:Inventでは機械学習にフォーカスした話がそんなになかったので，今回の話でかなり期待度が上がりました．

### PyData NYC からのハイライト
[PyData NYC 2014](http://pydata.org/nyc2014)に行ってきた話です．

- どういう風にPythonを使ってビッグデータを扱っていくのか
	- PySparkが凄く熱かったらしい
	- データとオペレーションを分離する
		- DBへのインタフェースを統一
		- Mongoから取り出したデータをSparkに入れたり
	- [Advanced Scikit-Learn](https://github.com/amueller/pydata-nyc-advanced-sklearn): かなり分厚いチュートリアル
	- [Beaker Notebook](http://beakernotebook.com/): 様々な言語が同時に使えるNotebook (ローカルで動く)
		- Python → JavaScriptで変数を渡せたりする

SymPyの話がかなり面白かったです．Python → Fortranとか需要があるんですかね？
実はまだ使ったことないんですが[Caffe](http://caffe.berkeleyvision.org/)が凄く面白そう．使ってみよう．

## 感想
今回初参加だったんですが，PyDataすごく好きなので楽しかったです＼(^o^)／
自分の業務にも生かせそうな話が多く，色々試してみようと思います．
そしてPyData NYC，いつか行きたい．
また次回以降のイベントにも参加させて頂きたいと思いますmm ありがとうございました！

さてこれから懇親会なので飲んできます！
JavaScript SDK 変更について

バージョン1.0 から バージョン2.0 へのアップグレードに伴い
サイト内に設定する「いいね！」ボタンを書き換える件は、
Facebookページ内の JavaScript SDK（ページの高さを調整したり）も対象？と思ったのでまとめた件。
 
###（参考）
→JavaScript SDK を all.js からsdk.js に変更しましょう。（2015年4月30日までに） | Sunday In The Park
http://snowadays.jp/2014/11/3307
 
 
 
###※Facebook SDK 紹介ページ＠Facebook公式
→Quickstart: Facebook SDK for JavaScript
https://developers.facebook.com/docs/javascript/quickstart/v2.2?locale=ja_JP
→Facebook Platform Upgrade Guide
https://developers.facebook.com/docs/apps/upgrading/?locale=ja_JP


##【変更箇所】
・FB.init内の項目に「version: 'v2.1'」を追加
（直前の記述の最後に「,」を追加するのを忘れないこと）
・「all.js」→「sdk.js」
 
（記述例）

```
<div id="fb-root"></div>
<script type="text/javascript" src="https://connect.facebook.net/en_US/sdk.js"></script>
<script>(function() {
    var e = document.createElement('script'); e.async = true;
    e.src = document.location.protocol + '//connect.facebook.net/ja_JP/sdk.js';
    document.getElementById('fb-root').appendChild(e);
}());
window.fbAsyncInit = function() {
    FB.init({
        appId: '【アプリID】',
        status: true,
        xfbml: true,
        version: 'v2.1'
    });
    FB.Canvas.setAutoGrow();
};
</script>
```
 
（サンプルによっては「v2.0」だったり「v2.1」だったりしてるけど、最新はなんぼなんだろう…。）

###（2014.12.04.追記）
ここに書いてあった。
**Facebook Platform Changelog** ※日本語
https://developers.facebook.com/docs/apps/changelog?locale=ja_JP
> 最新のAPIは、2014年4月30日に導入されたバージョン2.0です。

###（2015.05.18.追記）
最新情報はこっちみたいです。
**This method is used to initialize and setup the SDK.**(Facebook Developers) ※英語
https://developers.facebook.com/docs/javascript/reference/FB.init/
> version    : 'v2.3' // or v2.0, v2.1, v2.0

＝「v2.x」で動作？（作成時点での最新のものを使っておくと安心？）
（コメント内 2つ目の「v2.0」は、「v2.2」のコピペミスかなー）


###（2016.02.16.追記）
今は「v2.5」みたい。
（久しぶりに調べた。）


###（2016.06.28.追記）
> APIの最新バージョンはバージョン2.6です。リリース日は2016年4月12日です。

※使用期限が迫っているので、チェックした方がよさそう。
v2.0　：　2016年8月7日
v2.1　：　2016年10月30日
AndroidのActionBarのThemeをカスタマイズする時にはまったこと

http://jgilfelt.github.io/android-actionbarstylegenerator

ここでthemeを作るじゃないですか

で ```Style name``` を ```"otdp"``` みたいなアルファベットの小文字にしたとします

で ```tiapp.xml``` を変更しますよね

```xml:tiapp.xml
<android xmlns:android="http://schemas.android.com/apk/res/android">
    <tool-api-level>19</tool-api-level>
    <manifest>
        <application android:theme="@style/Theme.otdp"/>
    </manifest>
</android>
```

でもこれじゃだめなんですよ

```
Error: No resource found that matches the given name (at 'theme' with value '@style/Theme.otdp')
```

ってなっちゃうんですね

でダウンロードしてきたresファイルの中をチラ見してみたら

```xml:res/values/styles_otdp.xml
<style name="Theme.Otdp" parent="@style/Theme.AppCompat.Light">
```

。。。

頭文字大文字になるんかい

ということで

```xml:tiapp.xml
<android xmlns:android="http://schemas.android.com/apk/res/android">
    <tool-api-level>19</tool-api-level>
    <manifest>
        <application android:theme="@style/Theme.Otdp"/>
    </manifest>
</android>
```

にしたらビルドできました
MySQLを毎日バックアップして、S3に同期するシェルスクリプト

MySQLのバックアップがローカルマシンだけでは不安でしたので、S3にバックアップと取る事にしました。
もしかしてS3自体でできたかもしれませんが、なんちゃって世代管理も一緒にしています。

## 前提条件
* AWSコマンドラインインターフェイスが導入されている( http://aws.amazon.com/jp/cli/ )

## スクリプト
```bash:backup.sh
#!/bin/bash

BACKUP_PATH="/your/backup/path/"
S3_PATH="s3://your-s3-bucket/"
FILE_NAME="mysql_dump_`date +%Y%m%d`.sql.gz"

AWS_CONFIG_FILE="/home/user/.aws/config"

cd $BACKUP_PATH
mysqldump -u mysql_user -p mysql_password --all-databases | gzip > $FILE_NAME

find $BACKUP_PATH -type f -name "mysql_dump_*.sql.gz"  -mtime +9 -daystart | xargs rm -rf

aws s3 sync $BACKUP_PATH $S3_PATH  --delete
```

## 細かい説明
 * BACKUP_PATHに、mysqldumpでダンプしたデータがgzipで圧縮されて保存されます
 * S3_PATHに指定したバケットやフォルダに、BACKUP_PATHの中身が同期されます
 * FILE_NAMEはお好みで。スクリプトのままですと、「mysql_dump_20141128_sql.gz」みたいなファイルが出来上がります
 * AWS_CONFIG_FILEには、aws configでアクセスキーやシークレットアクセスキーを設定すると保存される、設定情報へのパスを指定
 * mysql_userとmysql_passwordにはバックアップで使用するMySQLのユーザー名とパスワードを指定。--all-databasesなので全部バックアップしますが、特定のデータベースのみという場合はお好みで変更してください
 * ダンプしたデータはそのままgzipで圧縮されます
 * findで、10日以上経過しているバックアップデータを削除しています。
削除不要な場合は行毎コメントアウト、日数を変えたい場合は-mtimeの後の+9の部分を変更してください。ファイル名を変更している場合は-name の後も変更を忘れずに
 * 最後に、S3に同期します。--deleteオプションは、削除されたファイルをS3から削除するオプションです

## おわり
S3が思った以上に安かったので、バックアップとかは最適だと思いました。
早朝とかにcronで回しておきましょう。

## 参考
http://c-brains.jp/blog/wsg/12/03/28-120435.php
http://d.hatena.ne.jp/LukeSilvia/20100307/p1
Objective-CでAbstractっぽいクラス

[Objective-CでAbstractパターン](http://qiita.com/key/items/ebba2b1eb0dc05135074)ではコンパイル時に実装漏れを検知できない。
完全ではないですが、実装を強制する方法です。


# 基底クラスのヘッダー
実装を強制するためのプロトコルを定義する

```objc:Animal.h
@interface Animal

- (void)walk;

@end

@protocol AbstractAnimal <NSObject>

- (void)bark;

@end

```

# 基底クラスの実装

匿名カテゴリに先ほどのプロトコルを指定する

```objc:Animal.m
#import "Animal.h"

@interface Animal () <AbstractAnimal>

@end

@implementation Animal

- (void)walk {
     //do something.
}

- (void)bark {
    //定義しないと警告が出る。念のためエラーを投げる。
    [NSException raise:NSInternalInconsistencyException
                format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)];
}

@end

```

# 継承クラスのヘッダ
基底クラスを継承し、先ほどのプロトコルを指定する。
プロトコルを指定し忘れると、後の警告が出ないので、その部分が不完全。

```objc:Dog.h

#import "Animal.h"

@interface Dog : Animal <AbstractAnimal>

@end

```

# 継承クラスの実装

Abstractなメソッドを実装する。
そのメソッドを実装しないと警告が出ます。

```objc:Dog.m
#import "Dog.h"

@implementation Dog

- (void)bark {
    //do something.
}

@end

```
文字列をイイ感じにFixnum or Floatに型変換する


たとえば`CSV.read`とか全部`String`にされるので、
こういうメソッドを用意して使ってます。

```ruby
class String
  def is_number?
    # http://stackoverflow.com/questions/5661466/
    true if Float(self) 
  rescue
    false
  end

  def when_num_to_num
    self.is_number? ? Integer(self) : self
  rescue
    Float(self)
  end
end

"7".when_num_to_num #=> 7
"2.34".when_num_to_num #=> 2.34
"Serra Angel".when_num_to_num #=> "Serra Angel"
"Android No.17".when_num_to_num #=> "Android No.17"

```
yanked となった gem をインストールする方法

あるバージョンの gem が yanked 状態となってインストールできなくなる場合があります。
ですが、どうしてもそのバージョンの gem をインストールしたい場合に次のコマンドでインストールできます。

````````````````````````````
gem install LOCAL_GEM_FILE
````````````````````````````

例えば coffee-script-soruce のバージョン 1.1.3 は yanked となっていて通常インストールできません。
まだ RubyGems のページからダウンロードできるのであれば手動でダウンロードして以下コマンドでインストールできます。

``````````````````````````````````````````
gem install ~/Downloads/coffee-script-source-1.1.3.gem
``````````````````````````````````````````


**注意**
gem 作者はインストールさせたくないなにかの理由で yanked としているのでこの方法はあまりオススメしません。
Macでファイル保存時に、フォルダパスを指定して保存先フォルダに移動する方法

小ネタになりますが、Macでファイルを保存するときに、GUI操作をせずにフォルダパスを指定して一気に保存先フォルダに移動する方法です。

#####手順
1.ファイルの保存メニュー（command + S）を選択する
2.名前欄に表示されている初期設定のファイル名をすべて消してから、スラッシュ"/"を入力する
3.フォルダの場所を入力する画面（Finderの[フォルダへ移動]メニューと同じ入力画面）が表示されるので、保存したいフォルダパスを入力する
mod_rewriteでHTTP / HTTPSの切り替え

問い合わせフォームと管理画面だけ強制的に https でアクセスさせたい場合のメモ。
いろいろと調べて試行錯誤した結果、.htaccessに以下のように書いて実現した。

```/.htaccess
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /

  # HTTPでアクセスされた場合、
  RewriteCond %{HTTPS} off
  # 以下のURLは常に https にリダイレクトする
  RewriteCond %{HTTP_HOST} www.example.com
  RewriteCond %{REQUEST_URI} ^/admin/.*$ [OR]
  RewriteCond %{REQUEST_URI} ^/inquiry/.*$ 
  # ただし以下は除く
  RewriteCond %{REQUEST_URI} !^/assets/.*$
  RewriteCond %{REQUEST_URI} !^.*\.(js|css|gif|jpg|png|ico)$
  # https にリダイレクト
  RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

  # HTTPSでアクセスされた場合、
  RewriteCond %{HTTPS} on
  # 以下のURL以外は常に http にリダイレクトする
  RewriteCond %{HTTP_HOST} www.example.com
  RewriteCond %{REQUEST_URI} !^/admin/.*$
  RewriteCond %{REQUEST_URI} !^/inquiry/.*$
  # ただし以下は除く
  RewriteCond %{REQUEST_URI} !^/assets/.*$
  RewriteCond %{REQUEST_URI} !^.*\.(js|css|gif|jpg|png|ico)$
  # http にリダイレクト
  RewriteRule ^.*$ http://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>
```

* %{HTTP_HOST}でホストを限定してるのは、開発環境で無効化するため
* cssや画像ファイルをリダイレクトしてしまうと https ON のページで暗号化されてないコンテンツを読み込んでしまうので除外
Go言語でMongoDB使う ①インストール的なところ

追記

- 2019/01/20
    - https://github.com/go-mgo/mgo がもうメンテされてないそうので、サンプルでは、そのフォークである https://github.com/globalsign/mgo を使うようにしました。インターフェースは一緒です。
    - Thanks to @NishidaRyu416 

# Go言語でも

mongodb使いたいじゃないですか.

https://github.com/globalsign/mgo

> The MongoDB driver for Go

# とりあえず動く、まで

1. mongodbのインストール
    1. 割愛（`brew install mongodb`？）
    2. 個人的には `docker run -it -p 27017:27017 --rm mongo` がオススメです
2. Goのインストール
    1. 割愛（`brew install go`？）
3. mgoのインストール
4. サンプルコード

# mgoのインストール

おなじみの`go get`

```
% go get -v github.com/globalsign/mgo
```

おしまい

# サンプルコード

```go:hoge.go
package main

import (
	"fmt"
	"log"

	"github.com/globalsign/mgo"
	"github.com/globalsign/mgo/bson"
)

type Person struct {
	ID   bson.ObjectId `bson:"_id"`
	Name string        `bson:"name"`
	Age  int           `bson:"age"`
}

func main() {
	session, _ := mgo.Dial("mongodb://localhost/test")
	defer session.Close()
	db := session.DB("test")

	/**
	 * つくるところ
	**/
	ritsu := &Person{
		ID:   bson.NewObjectId(),
		Name: "田井中律",
		Age:  17,
	}
	col := db.C("people")
	if err := col.Insert(ritsu); err != nil {
		log.Fatalln(err)
	}

	/**
	 * みつけるところ
	**/
	p := new(Person)
	query := db.C("people").Find(bson.M{})
	query.One(&p)

	/**
	 * 結果
	**/
	fmt.Printf("%+v\n", p)
	// &{ID:ObjectIdHex("5478517a9871b9b8e42e2ee2") Name:田井中律 Age:17}
}
```

おしまいです. コピペして`go run hoge.go`してみてください.

# 以下、メモ

importのところ

```go
import (
	"fmt"
	"github.com/globalsign/mgo"
	"github.com/globalsign/mgo/bson"
)
```

structとmongo的なdocumentとのマッピングについて

```go
type Person struct {
	// encoding/jsonパッケージなどでおなじみの`tag`が使える
	// `bson:"field_name"`で指定したフィールド名で
	// mongodbのドキュメントが保存される
	// また、取り出すときもこのフィールド名に対応したものがマッピングされる
	ID   bson.ObjectId `bson:"_id"`
	Name string        `bson:"name"`
	Age  int           `bson:"age"`
}
```

参考: http://godoc.org/labix.org/v2/mgo/bson

hostとのコネクションとか

```go
func main() {
	// sessionはコネクションプーリングとかよしなにしてくれる
	session, _ := mgo.Dial("mongodb://localhost/test")
	// お行儀
	defer session.Close()
	// データベース名でDatabaseを取得
	db := session.DB("test")
```

参考: http://godoc.org/gopkg.in/mgo.v2#Session

Create系のメソッド

```go
	ritsu := &Person{
		ID:   bson.NewObjectId(),
		Name: "田井中律",
		Age:  17,
	}
	// コレクション名でCollectionを取得
	col := db.C("people")
	// Insertメソッドを使う
	col.Insert(ritsu)
```

参考: http://godoc.org/gopkg.in/mgo.v2#Collection

Find系のメソッド

```go
	// 参照用のstructを用意
	p := new(Person)
	// mongoのコンソールで{}で表現するものは
	// だいたい"bson.M{}"という形式で表現できる
	// bson.M{"created": bson.M{"$lt": time.Now()}} とか
	query := db.C("people").Find(bson.M{})
	// 遅延評価なので、実行されてない。Queryはあとから追加できる
```

参考: http://godoc.org/gopkg.in/mgo.v2#Query

```go
	// ここでQueryが実行される
	query.One(&p)
```

おわりです
Python で Project Euler #11「格子内の最大の積」

[Problem 11 「格子内の最大の積」](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2011)

> 上の 20×20 の格子のうち, 上下左右斜めのいずれかの方向で連続する4つの数字の積のうち最大のものはいくつか?

```py:Python
matrix = """
08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48
"""[1:-1]

data = map(lambda s: map(lambda n: int(n), s.split(" ")), matrix.split("\n"))
dim1 = len(data[0])
dim2 = len(data)

# 横方向
list1 = []
for i in range(dim2):
  for j in range(dim1 - 3):
    four_numbers = map(lambda k: data[i][k], range(j, j+4))
    list1 += [reduce(lambda a,b: a * b, four_numbers)]

# 縦方向
list2 = []
for i in range(dim2 - 3):
  for j in range(dim1):
    four_numbers = map(lambda k: data[k][j], range(i, i+4))
    list2 += [reduce(lambda a,b: a * b, four_numbers)]

# 右斜め方向
list3 = []
for i in range(dim2 - 3):
  for j in range(dim1 - 3):
    four_numbers = map(lambda k: data[i+k][j+k], range(4))
    list3 += [reduce(lambda a,b: a * b, four_numbers)]

# 左斜め方向
list4 = []
for i in range(dim2 - 3):
  for j in range(3, dim1):
    four_numbers = map(lambda k: data[i+k][j-k], range(4))
    list4 += [reduce(lambda a,b: a * b, four_numbers)]

result = max(list1 + list2 + list3 + list4)

print(result)
print(result == 70600674)
```

```:結果
70600674
True
```
Cocos Studio 2.0を使ってみる



## インストール

[Cocos2d-x Downloads](http://www.cocos2d-x.org/download)からダウンロードして、インストールする。
現在の最新バージョンは 2.0.6。


## サーチパス追加

```cpp
    std::vector<std::string> searchPaths;
    searchPaths.push_back("csb");
    FileUtils::getInstance()->setSearchPaths(searchPaths);
```


## csbファイルを使う

```cpp
#include "cocostudio/CocoStudio.h"

auto node = CSLoader::getInstance()->createNodeWithFlatBuffersFile("csb/MyNode.csb");
```

## アニメーション

```cpp
#include "cocostudio/CocoStudio.h"

Node* node = CSLoader::createNode("ActionTimeline/DemoPlayer.csb");
ActionTimeline* action = CSLoader::createTimeline("ActionTimeline/DemoPlayer.csb");
node->runAction(action);
action->gotoFrameAndPlay(0, 40, true);

    auto action = CSLoader::getInstance()->createTimeline("csb/MainScene.csb");
    mainScene->runAction(action);
    action->gotoFrameAndPlay(0, 60, true);
```

## フレームイベント

```cpp
    auto action = CSLoader::getInstance()->createTimeline("csb/MainScene.csb");
    mainScene->runAction(action);
    action->gotoFrameAndPlay(0, 60, true);
    using namespace cocostudio::timeline;
    action->setFrameEventCallFunc([this](Frame *frame) {
        EventFrame* eFrame = dynamic_cast<EventFrame *>(frame);
        auto eName = eFrame->getEvent();
        CCLOG("frame event: %d, %s", frame->getFrameIndex(), eName.c_str());
        auto target = eFrame->getNode();
        if (eName == "big") {
            target->setScale(1.5f);
        } else if (eName == "small") {
            target->setScale(1.0f);
        }
    });
```


## 参考

* [Cocos Studio v2をCocos2d-x3.3rc0で使ってみたメモ](http://kyokomi.hatenablog.com/)
* [Cocos Studio v2でpublish先のディレクトリを変更する方法](http://qiita.com/kyokomi/items/0dc691c52822f14cd62c)