金融と工学のあいだ

興味関心に関するメモ(機械学習、検索エンジン、プログラミングなど)

Chainer導入

前提

Python

  • Python 2.7.6+, 3.4.3+, 3.5.1+, 3.6.0+が入っている
  • NumPy 1.9, 1.10, 1.11, 1.12が使える
  • six 1.9が使える
  • cythonが入っている
  • virtualenvが使える

CUDA

  • CUDA 8.0のインストールが済んでいる
  • g++ 4.8.4+が入っている

Install

手順

  1. 適当な場所でgit clone git@github.com:pfnet/chainer.git
  2. virtualenvの環境作成
~/dev/chainer$ virtualenv venv --python=/usr/bin/python3.4
~/dev/chainer$ source activate venv/bin/activate
  1. cuDNN用の環境マネージメントツールcudnnenvでcuDNNを入れる
$ pip install cudnnenv
$ cudnnenv install v5-cuda8
$ cudnnenv activate v5-cuda8
$ cudnnenv version
v5-cuda8
  1. 必要な環境変数を設定する
$ tail -n 11 ~/.bashrc 
#path for cuDNN
export LD_LIBRARY_PATH=~/.cudnn/active/cuda/lib64:$LD_LIBRARY_PATH
export CPATH=~/.cudnn/active/cuda/include:$CPATH
export LIBRARY_PATH=~/.cudnn/active/cuda/lib64:$LIBRARY_PATH
# path for chainer
export PATH=/usr/local/cuda-8.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH
export CFLAGS=-I~/.cudnn/active/cuda/include
export LDFLAGS=-L~/.cudnn/active/cuda/lib64
export LD_LIBRARY_PATH=~/.cudnn/active/cuda/lib64:$LD_LIBRARY_PATH
  1. 開発者ようにchainerをビルドする
    ~/dev/chainer$ python setup.py develop
    ...
    ...
    Finished processing dependencies for chainer==1.21.0

これからのパーソナルデータの話(1) ~はじめに~

はじめに

個人の情報の活用が進む現在

日々、SNSWebサービスを利用する中で、私たち自身の個人の情報がサービス提供者に収集され、私たちユーザーの利便性向上のために活用されていることを感じます。例えば、Twitter広告[1]では、広告主がユーザーの性別、行動履歴、興味などで広告を出したいユーザー層を指定することができます。これは、Twitterがユーザーの情報を収集することで実現ができています。同様のサービスは、GoogleFacebook、国内ではヤフーなども提供しています。

個人の情報を利用してユーザーの利便性を向上を目指す動きは、広告分野だけではなく他の分野でも行われています。amazonなどのeコマース分野、AppleYoutubeなどの音楽・動画配信分野、Facebook・LINEなどのSNS分野も挙がるでしょう。

個人の情報の活用の背景

上記を見るとわかるように、Webサービスを提供する大企業のほとんど全てが、個人の情報を用いてユーザーの利便性の向上を目指しています。この理由として、様々な要因が挙げられますが主に以下の3つが要因だと考えられます。

  1. スマートデバイスの普及
  2. 深層学習に代表される機械学習、AI技術の進化
  3. ハードウェア・ソフトウェア技術の進化

今回は項目として上げるだけで詳しくは話しませんが、簡単に説明します。上記3つの要因により個人のデータに対して以下のような変化が生まれました。

  1. スマートデバイスの普及」により大量のデータが生成されるようになった
  2. 「深層学習に代表される機械学習、AI技術の進化ハードウェア・ソフトウェア技術の進化」により対象のデータを分析できるようになった
  3. 「ハードウェア・ソフトウェア技術の進化」により大規模なデータを高速に利用できるようになった

このように、大規模なデータを生成・分析・利用できるようになったことが背景にあると考えられます。

この文章を書く理由

まだ、しっかりと書きたいことの方向性が決まっていませんが、以下のような疑問を持つようになり、それについて調べたいと思っています。

  1. パーソナルデータって何なの?
    • 個人情報とパーソナルデータの法律的解釈
    • 企業のプライバシポリシーの変遷
    • これからのパーソナルデータの定義
  2. パーソナルデータはどのように活用されるの?
  3. パーソナルデータは大企業に専有されていいの?
    • 大量のデータを持つ企業が勝ち残るのか
    • 他の企業は生き残れないのか
  4. 個人としてパーソナルデータを活用するには?
    • パーソナルデータの持ち主はだれか
    • パーソナルデータをユーザー自ら活用できないのか

参考文献

[1]

JavaによるRESTfulシステム構築(2) ~RESTfulサービスの設計~

目的

  • RESTfulな分散システム構築の勉強がしたい
  • Restの実現方法の1例を学習したい
  • Javaに触れてみる

概要

  • 架空のEコマースWebストアを設定し、簡単なオーダーエントリーシステムに対応するRESTfulインタフェースを定義してみる
    1. オブジェクトモデルをチェック
    2. 分散IFを追加
    3. URI定義
    4. データフォーマットの定義
    5. HTTPメソッドの設計

オブジェクトモデル

  • ユーザー機能駆動等でオブジェクトを列挙したい
    • Order
    • Customer
    • LineItem
    • Product

URIのモデル化

  • 分散IFを作成するためには、システム内に分散する各エンドポイントを定義することが必要。
  • RESTfulでは通常エンドポイントをリソースと呼び、URIを使って表現する。
    • /orders
    • /orders/{id}
    • /products
    • /products/{id}
    • /customers
    • /customers/{id}
  • URI設計について
    • URIはミニRPCメカニズムとして使用されるべきではなく、各操作(関数)を示すべきではない
    • HTTPメソッドとデータ構造を組み合わせて、分散RESTfulシステムの操作が一意に鳴るように設計すべき

データフォーマットの定義

  • ネットワーク経由でクライアントに送るリソースを決める必要がある。
  • 通常はschemaでデータ構造を定義し、そのデータ構造にあったデータをやり取りする。

選択肢

HTTPメソッドの割当

  • 個々のリソースに公開するHTTPメソッドと、その役割を定義する。
  • 必要十分な機能を各リソースに割り当てるために必要である

全オーダー、全顧客、全製品の参照

  • リソース
    • /orders
    • /products
    • /customers
  • GET
    • GET /products HTTP/1.1
    • GET /products?startIndex=o&size=5 HTTP/1.1

各オーダー別、各顧客別、各製品別のデータ取得

  • リソース
    • /orders/{id}
    • /products/{id}
    • /customers/{id}
  • GET
    • GET /orders/232 HTTP/1.1

オーダー、顧客、製品の作成

PUT

  • リソース
    • /orders/{id}
    • /products/{id}
    • /customers/{id}
  • PUT
    • PUT /orders/233 HTTP/1.1

POST

  • リソース
    • /orders
    • /products
    • /customers
  • POST
  POST /orders HTTP/1.1
  Content-Type: application/xml

  <order>
    <total>199.02</total>
    ...
  </order>

オーダー、顧客、製品の削除

  • DELETEを使う

オーダーのキャンセル

DELETEの意味のオーバーロード(あんまりよくない)

  • リソース
    • /orders
  • DELETE
    • DELETE /orders/233?cancel=true

状態と操作

  • ある操作がリソースの状態である場合、その状態をデータフォーマット内に定義するべき
  PUT /orders/233 HTTP/1.1
  Content-Type: application/xml

  <order>
    <total>199.02</total>
    <cancelled>true</cancelled>
    ...
  </order>
  • cancelledのデータを一掃する
    • POST /orders/purge HTTP/1.1

keyword

  • エントリーポイント
    • エントリーポイントとは、プログラムを実行するうえで、プログラムやサブルーチンの実行を開始する場所のこと。プログラム全体のエントリーポイントとなる場所を含むルーチンがメインルーチンである。C言語の標準では、mainという名前の関数(の先頭)がエントリーポイントであり、各関数のエントリーポイントは、それぞれの関数の先頭である。

  • エンドポイント
    • エンドポイント、というのは「きわ」という意味。クライアント側とサーバ側の境界線のところがエンドポイント。

JavaによるRESTfulシステム構築(1)

目的

  • RESTfulな分散システム構築の勉強がしたい
  • Restの実現方法の1例を学習したい
  • Javaに触れてみる

まえがき

RESTの恩恵

JAX-RS(Java API for RESTful Web Service)

1章 RESTについて

アドレス可能性

制約された統一IF

統一IFがなぜ重要なのか

  • 親密性
    • あるリソースに対してどのメソッドが利用できるか正確にわかる
  • 相互接続性
  • 拡張性
    • GETはべき等かつ安全な読み取りメソッドであるため、キャッシュを使える

表現指向

  • 適切な表現を選択できる

ステートレスな通信

HATEOAS

  • アプリケーション状態エンジンとしてハイパーメディアを使用するとうい考え
  • ハイパーメディア
    • ドキュメントフォーマット内に外のサービスへのリンクと情報を埋め込むため追加サポートを持つドキュメント指向のアプローチ

AWSでWebサーバーを立ててみた(2)

CGIを動かす

CGIとは[1]

ウェブサーバ上でユーザプログラムを動作させるための仕組み。現存する多くのウェブサーバプログラムはCGIの機能を利用することができる。

チュートリアル[2]

  • sudo vi /etc/httpd/conf/httpd.conf
  • 下記が書いて有ることを確認
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
  • 上記フォルダにperlのコードを置く
$ cat /var/www/cgi-bin/test 
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World.";
  • 全ユーザに実行権限を渡す

リンク

[1] Common Gateway Interface - Wikipedia

[2]Apache Tutorial: CGI による動的コンテンツ - Apache HTTP サーバ バージョン 2.2

AWS上でTensor FlowのUdacityのチュートリアルを動かす

背景

  • 自宅にメモリ8G以上あるLinuxマシンがないのでマシン買わないといけにかなと考えていた。
  • よくよく考えると、AWSとかで使用するときだけインスタンス作ればいいな!ということで、やってみることにした。

目的

手順

インスタンス作成

  • awsで8G以上のインスタンスを作る(無料プランじゃないのでどれくらいかかるのか計算した所、1時間1ドルもかからないよう。)
  • Led Hatでつくった。
  • sshでログインできることを確認。
  • 任意の8888番ポートに対するTCPアクセスを許可

Dockerのインストール

Tensor Flowのコンテナの展開

sudo docker run -p 8888:8888 --name tensorflow-udacity -it gcr.io/tensorflow/udacity-assignments:0.6.0
  • http://{hostname}:8888 でアクセス f:id:kumechann:20161119130502p:plain

リンク

github.com

docs.docker.com

AWSでwebサーバーを立ててみた

目的

  • webサーバーを立てたことがないので立ててみる
  • ついでに色々動かして遊んで見る

手順

  • リンクの1に従って作業する。

ネットワーク設定

VPC作成

  • [VPCの作成]で作成

サブネット作成

  • [サブネット]->[サブネットの作成]でサブネットを作成
  • この時、10.0.1.0/24をwebサーバーを置く、publicなサブネットワークとして作成

インターネット接続

  • 上記vpcにインターネットを接続する

ルーティング情報を設定

サーバ設定

インスタンス作成

ssh接続

ファイアウォール設定

  • インバウンドルールでHTTPによるポート80のアクセスを許可

調べたこと

VPCとは

  • Amazon Virtual Private Cloud のこと

    独自の IP アドレス範囲の選択、サブネットの作成、ルーティングテーブルとネットワークゲートウェイの設定など、仮想ネットワーク環境を完全にコントロール

VPC作成したらいろんな項目が出てきた

  • CIDR
    • Classless Inter-Domain Routingのこと。

      Classless Inter-Domain Routing(CIDR、サイダー)は、インターネット上のルーターにおけるルーティングテーブルの肥大化速度を低減させるための機構であり、ISPや組織にクラスA、B、Cを全部ではなく部分的に割り当てることでIPアドレスの浪費を防ぐ機構である。CIDR記法でアドレスを記述でき、アドレスの集約的表現が可能で、アドレスブロックの委譲も容易である。

  • DHCPオプションセット
    • デフォルトでは、デフォルトではない VPC 内のすべてのインスタンスが、AWS によって割り当てられた解決できないホスト名を受け取ります (ip-10-0-0-202 など)。
    • インスタンスに独自のドメイン名を割り当て、独自の DNS サーバーのうち 4 台までを使用できます。そのためには、特別な DHCP オプションセットを指定する必要があります。
  • ルートテーブル
    • 各サブネットのルーティングに関するルール
  • ネットワークACL
  • デフォルトVPC
    • すぐにインスタンス作成可能なデフォルト設定のVPC
    • アカウント作成時からある

リンク

qiita.com

qiita.com