Prog-me.

Rails中心、機械学習も、インフラもセキュリティも

インフラの道 1-2

# DNSラウンドロビン

DNSを利用してひとつのサービスに複数台のサーバを分散させること

#サーバの数だけグローバルアドレスがいる
#サーバがダウンしても気づかない

また
# 3台以上サーバがあるとき、どのサーバが落ちたとき、どのサーバがVIP引き継ぐのか不定
など難点があって、

ロードバランサ
を使った方が楽にシステムを拡張できる。

【インフラ】環境構築・共有について、わかっておいた方がいいツールたち【Vagrant/Chef/Docker/Ansible/AWS】

Vagrant

VagrantはVirtual Boxなどの仮想化ソフトウェアと一緒に使うツールVagrantはプロバイダ(仮想化ソフトウェア)を選択できるので、他にもVMwareAmazon EC2で使うこともできる。

VagrantとVirtual Boxを使って何がしたいのか

  • 実行環境を開発と本番で揃えたい。
  • 開発環境を構築する際に個人のローカル環境に依存しないようにしたい。
  • すぐに使える仮想環境を構築したい。
  • 環境構築を自動化したい。
  • チームで同一の環境を簡単に構築したい。

環境構築の自動化

Vagrant は Chef、puppet などの構成管理ツールと連携して環境構築を自動化できる。 vagrant up した時点で自動で環境は構築される。

Virtual Boxのスナップショット機能を使えば、以前の状態に元に戻すことができる。

Chefとは

ruby製のサーバの構成管理ツールで、サーバ構築の自動化をしてくれるツール

ソフトウェアのインストールや設定などを設定ファイルに記述しておくことで、サーバをその設定ファイルの状態にしてくれる。設定ファイルにはサーバのあるべき完成状態を記述し、その差分をChefがうまいこと埋めてくれる感じ。

Chef用語

  • Node:Chef Serverに接続するClientの中で、Chefで管理するマシンのこと。
  • Client:Chef Serverに接続するもの全て。管理ツール(knife等)もClient
  • knife: Chefに付属するためのリポジトリ操作ツールです。このコマンドを使ってCookbookを作ったり、NodeとRecipeを関連付けたりします。

Dockerとは

  • Linux上で独立した別のLinuxシステムを起動することができる、コンテナ型の仮想化ソフトウェアの一つ
  • コンテナ型の仮想化では仮想的な物理マシンの構築は行わず、元のOS環境上に隔離されたエリアを作り、仮想的に新たなOS実行環境を作り出す。
  • OSの設定やアプリケーションソフトの導入の済んだLinux環境を丸ごと実行イメージとして保存する機能があり、別のマシンのDockerに持ち込んでそのまま実行することができる。これをソフトウェアの配布に応用すれば、複雑な導入・設定作業を省略し、元の環境との違いなどを意識しなくても簡単にソフトウェアを導入できるようになる。

Kobito.wp7YEc.png

Docker特徴

Dockerのメリット

  • アプリケーションを少ないリソースで効率良く実行できる
    => コンテナー型の仮想化はハイパーバイザー型の仮想化に比べ、CPUなどコンピューターリソースのオーバーヘッド(仮想化のために必要になる余分なリソース)が少ないため、リソースの少ないハードウェアでも実行できる。
  • githubで管理できる
    =>Dockerはコンテナーの構成を全て「Dockerfile」というテキストファイルに記述できるため、「Infrastructure as Code(インフラ構成をGitHubなどのコードリポジトリで管理)」を実践するツールとしても利用できる。

Ansible

Chefのとおなじく構成管理ツール

Ansible用語

  • モジュール -クライアント内での動きは「モジュール」として定義される。ソフトウェアをインストールしたり、サービスの起動をしたりするモジュールはあらかじめ用意されている。

-自分でモジュールを作成することも可能。

-このモジュールは何で作成してもいいので、Pythonの知識は必要ない。決められた出力形式(key-value形式かJSON)を守ればOK

  • Play book -Chefでいうところのレシピ。モジュール処理をまとめたものが「Play book」と呼ばれる。YAML形式で記述。

Google App Engine

App Engineは一般的なWeb技術をフルサポートし、ストレージ、ユーザー認証やメール送信用のGoogle API、自動的なスケーリングや負荷分散などを提供する。利用者はappspot.comドメイン上で自由なドメイン名を使って、あるいはGoogle Appsを使って自分のドメインでアプリケーションを提供できる。アプリケーションは公開することも、社内メンバーだけにアクセスを限定することも可能だ。対応言語は現時点ではPythonのみだが、今後サポートを拡大するという。

AWS

Amazon Web Services(アマゾンウェブサービス)の略称で、 Amazon.com社が行っているサービスの名称。てっとりばやいのはこの動画(http://aws.amazon.com/jp/getting-started/)

急激に成長しているサービスで、アメリカでは政府機関が使っているほど高いセキュリティを保っている。提供されてるサービスがとても多い。

Amazon EC2

  • 仮想化されたWebサーバのコンピュータリソースを自由に使え、わずか数分で起動させることができる重量課金制のWEBサービス
  • WEBサーバやDBサーバ、キャッシュサーバーなどなど色々な用途に使えるサーバ。

Auto Scaling

あらかじめ設定をしておくと、突然のサーバ負荷の際に自動的にサーバを増やしたり減らしたりしてくれる。

Amazon S3

データストレージサービスです。 データの格納と取り出しに特化。 コンテンツのストレージや配信する際などに使用される。

Amazon RDS

データベースとして使用される。

AWSの課金について

  • サーバの利用料は使った分だけお金がかかる従量課金。

  • 他にもディスク利用料、データ転送量などがかかるが、 サーバ利用料が8割を占めることらしいので、 サーバ利用料の仕組みをわかれば怖いものなし。

  • サーバ課金には以下の3つがある 1.オンデマンドインスタンス:サーバが起動している時間によってお金が増えていく。 2.リザーブドインスタンス:一定額の金額を先に払ってしまうことで、1時間あたりの単価を大幅に下げることができる。 3.ライセンス課金

参考・引用させていただいたサイト

Vagrantって流行ってるらしいけど何が便利なの? アプリ開発者もインフラ管理者も知っておきたいDockerの基礎知識 構成管理ツール Ansibleを使ってみる Webサービス開発に関わるなら知っておきたい「AWS」とは?

インフラの道 1-1

冗長化

障害が発生しても予備の機材で機能を継続できるようにするもの

Active/Back up構成

コールドスタンバイ:予備機を普段は使わない、危機で使う

ホットスタンバイ:現用機と予備機を常に同じ状態にしておく

フェイルオーバ:危機のさい自動的に処理を予備機に引き継ぐ

サーバをフェイルオーバするとき

現用機であるweb1に自己IPとはべつに仮想IP(VIP)割り当て webサービスはVIPで提供 危機のさい、web2(予備機)にVIP引き継ぎ

ヘルスチェック

現用機に障害がないかチェック * ICMP監視 echoリクエスト * ポート監視 TCP接続 * サービス監視 HTTPリクエストの反応

LANの世界では、IPアドレスではなくMACアドレス(media access control address)を使って通信をしている

他のサーバにパケットを送るさいには、 MACアドレスを取得するため、ARP(Address Resolution Protocol)を使う 取得したMACアドレスは一定のあいだARPテーブルに格納

=>なので、ほかのサーバのARPテーブルを更新してもらわないと、IPアドレス引き継げない。

=>そのため、gratutious ARP(GARP)をつかう。

通常のARPリクエストとはちがって、「私のIPアドレスMACアドレスはこれ」とほかのサーバに通知

API作成概要

API作成について

エンドポイントとは:

web APIにおけるエンドポイントは、アクセスするためのURIを指す。

エンドポイントの設計の原則:
覚えやすく、どんな機能をもつURIなのかすぐわかること

URI(エンドポイント)がAPIにおいて操作する対象(リソース)を表す
HTTPメソッドは何をするかを表す

メソッド

get リソース取得
post リソース新規登録
put 既存リソース更新
delete リソース削除
patch リソース一部変更
head リソースのメタ情報の取得

HTMLのフォームの仕様では、getとpostのみがサポートされているため、それ以外のメソッドを使うK十ができない。
そこで、
* X-HTTP-Method-OverrideというHTTPリクエストヘッダを利用
* _methodというパラメータを利用:
application/x-www-from-urlencodedという今テントタイプで表されるデータの一つとしてメソッドを送信する。
railsで利用。Formパラメータのひとつとして、_method=PUTなどとして指定

スペースやエンコードを必要とする文字をエンドポイントとしてつかわない 

URIでは利用できない文字があり、そういった文字はパーセントエンコーディングと呼ばれる文字コードを%つきで表した表記法を利用して表すが、よろしくない。
また、ホワイトスペースはURIでは+に変換される、kろえも見づらいからよくない。

検索と取得位置のパラメータ

アイテム数50個/ページ表示するとき、3ページめ(101個めのアイテムから表示)するならURI
per_page=50&page=3   や   limit=50&offset=100
が好ましい
どちらかというと、limit/offsetのほうがユーザの自由度は高い

絞り込み

名前検索
v1/people-search?first-name=Clair
タグ検索
v1/blog/pitchersandpoets.tumblr.com/posts?tag=new+york+yankees

twitter/1.1/search/tweets.json?q=%23freebandnames

OAuth

広く第三者に公開されるAPIにおいて認可を行うために利用される
自分がサービスを公開して、fbと連動させる場合に、
使用者がfacebookに登録している情報を利用していいか自身のサービスに許可を与えられる仕組みがOAuth

OAuthのポイントは、自身のサービスに対してユーザがfacebookのパスワードを入力する必要がないところ。
認可プロセスにおいて、fbの提供するウェブページを経由して認証するから。

データフォーマット

  • JSON
  • XML データフォーマットの主流はJSON ##データフォーマットのエンドポイントにおける表現 ?format=xml .json

この本から学んだことをまとめました.

SVMチューニングのさい、参考にしたサイトたち

 

gci.t.u-tokyo.ac.jp

xargs.hateblo.jp

akiyoko.hatenablog.jp

next.rikunabi.com

sucrose.hatenablog.com

散布図 | Python matplotlib によるグラフ作成

 

今度metaplotlibの描画についてまとめたい。

pythonはライブラリの扱いに苦戦するんだけど、先輩の話によるとyoutubeとか動画で見る方がわかりやすいっぽい

教師あり学習・教師なし学習 概要

教師なし学習

消費インテリジェンスの観点から言うと教師なし学習のほうが大事

クラスタリング 

イメージ
新宿や渋谷、早稲田など駅のクラスタリング

 使われ方

顧客購買履歴データを用いた、顧客セグメンテーション
マーケティングへの応用、広告配信

顧客のセグメンテーション
・やりくり上手層
・価格志向層
・贅沢ブランド層
伝統保守
とか

たとえばfbの日本人の音楽のlikeとかを分析すると、17のセグメンテーションが可能らしい

設計時の論点

各データをどのようにベクトルとして表現するか

教師あり学習

多クラス分類

多次元空間にデータを配置
境界平面を引く
未知データを投入=>自動判定
分類の数だけベクトルがある

アルゴリズムの工夫のほとんどは計算量をおさえるための工夫

どのようにデータを表現するか?:テキストデータ

形態素分析
形態素にわける
・辞書
Chasen, Mecab

どのようにわけるか?

選択するアルゴリズムにより分類、回帰制度が異なる

機械学習器構築において、チューニングする箇所は多く存在

まずは手を動かし、自ら組んでみることが大事

始め方の案

1 すべてスクラッチでプログラミング
2 機械学習ライブラリ scikit-learnなどを使いプログラミング
3 統計解析ソフトウェアをつかう

機械学習における7つの基本動作になれることが大事

1.データの入手
2. データ前処理
3. 手法の選択
4. パラメータの選択
5. モデルの学習
6. モデルの評価
7. チューニング 3から6を繰り返す

データの可視化について

データの可視化

なぜ必要か

  • 一言でいうと、何が見て取れるか?を示す
  • 表現の軸として、以下

比較

こう違う、こうにている、こう変化している

関係性

これとこれはこういう関係がある、ない

構成

これは、こういう要素で構成されている

分布

これこれの中身は偏っている、分散している

良い可視化、悪い可視化を見分ける

  • 全ての次元(軸)が意味を持っているか?:色、大きさ、x軸、y軸...
  • グラフのどこを見て欲しいか明確か?

例えば、この図.

f:id:it_memo:20150622213122j:plain

1. 円グラフはそもそもあまりよくない

 面積という情報が%と対応していないし、そもそも曲げているから角度もわかりにくい

2. 色のつけ方がわかりにくすぎる