ラベル インストール の投稿を表示しています。 すべての投稿を表示
ラベル インストール の投稿を表示しています。 すべての投稿を表示
2017年7月1日土曜日

JSプロジェクトのテンプレートを公開しました

  • フロントエンドを改めて調べた。
  • 各種ツールを組み合わせる必要があり、公開されてるテンプレートが非常に役に立った。
  • やりたいことが一通りできたので、テンプレートを公開します。
  • リポジトリ https://github.com/ynishi/riot-firebase-es6

概要

やりたかったこと

  • ES6でできるだけ記述
  • テスト可能にする
  • npmパッケージを使用する
  • 学習コストの低い軽量ライブラリ/サービスを使う

使用フレームワークと対応仕様

  • Riot(tag & route) => ES6
  • Firebase => ES6
  • Karma => ES6
  • Rollupで上記ES6 => ES5 => test & build & deploy => ブラウザで閲覧
  • npm => npm-scriptで簡易ビルドコマンド

参考になった記事

  • npm とか bower とか一体何なんだよ!Javascript 界隈の文脈を理解しよう http://qiita.com/megane42/items/2ab6ffd866c3f2fda066
  • Riot+Firebase APIをたたくhttp://qiita.com/tomomichi/items/43da4d35007e69d0f484
  • Riot+Webpack https://github.com/esnunes/riotjs-loader
  • Riot+Rollup http://qiita.com/cognitom/items/c20c22614560627062cb
  • Riot+Rollup Example http://qiita.com/cognitom/items/c20c22614560627062cb
  • Firebaseにデプロイする http://qiita.com/kohashi/items/43ea22f61ade45972881
  • SAMモデル(SPA/Reactをモデル化) https://www.infoq.com/jp/articles/no-more-mvc-frameworks

よきES6ライフを!

2016年9月28日水曜日

Elixir/Phoenixを何度もインストールする時に

少し前にインストールした、Elixir/Phoenixを再利用しようとしたら、動かないところがあったので、記事にします。

対応としては、mixphoenixをリインストールします。ただし、以前構築したphoenixは動かなくなることがあります。

mix archive.install https://github.com/phoenixframework/archives/raw/master/phoenix_new.ez

以下は詳細です。

phoenix_ecto, phoenix_htmlのエラー

mixでプロジェクトを作成して、mix phoenix.serverしたところエラーが出ました。

mix phoenix.new prj --database mysql
cd prj
mix phoenix.server

依存性エラーが出ます。

== Compilation error on file lib/phoenix_ecto/html.ex ==
** (CompileError) lib/phoenix_ecto/html.ex:7: unknown key :model for struct Phoenix.HTML.Form
    (elixir) src/elixir_map.erl:185: :elixir_map."-assert_struct_keys/5-lc$^0/1-0-"/5
    (elixir) src/elixir_map.erl:62: :elixir_map.translate_struct/4

could not compile dependency :phoenix_ecto, "mix compile" failed. You can recompile this dependency with "mix deps.compile phoenix_ecto", update it with "mix deps.update phoenix_ecto" or clean it with "mix deps.clean phoenix_ecto"

mix.exsを以下のように変更したら依存性はOKになる。

{:phoenix_ecto, "~> 3.0"},
{:mariaex, ">= 0.0.0"},
{:phoenix_html, "~> 2.6"},

phoenixをリインストールしてOKならば、上記のようにリインストールする。 ただ、リインストールすると、当然古いphoenixプロジェクトは動かなくなることがある。

dev.exsの設定

つい忘れがちなconfig設定も行います。 localhostで動かないときは、netstat -an | grep 3306などで解放ホストとポートを確認すると良いです。 今回は、外部IPで開いていて、localhostでは通りませんでした。 mysqlクライアントからは、localhostで入れてもectoからはいけない時があります。

config :word_prj, WordPrj.Repo,
  adapter: Ecto.Adapters.MySQL,
  username: "XXX",
  password: "XXX",
  database: "XXXDB",
  hostname: "XXX.XXX.XXX.XXX",
  pool_size: 10

あとは、migrateして

MIX_ENV=dev mix ecto.migrate

起動します。

mix phoenix.server

ページを追加

ページ追加については同じコマンドで動きました。

# テンプレート作成
phoenix.gen.html Repos table col1:string col2:string
# DBにマイグレート
MIX_ENV=dev mix echo.migrate
# router追加
vi web/router.ex

 scope "/", Prj do
   pipe_through :browser # Use the default browser stack

   get "/", PageController, :index
   resources "/card", CardsController
 end
# サーバー起動
mix phoenix.server

今時、一つのサーバに複数のWEBアプリを入れることは稀なケースかと思いますが、一つのサーバに複数世代のphoenixを混在させる場合は注意が必要です。

2016年9月20日火曜日

Hadoop クラスタ管理ツール ambari を試す

ambariを使ったhadoopクラスタ構築は、1からHadoopクラスタを構築するよりもかなり楽ですが、実際には色々とハマリどころがあります。ネット上に情報も少ないので、意外と手間取ります。

Hadoopクラスタ管理ツールのAmbariをGCPで試す場合、最もおすすめの方法は、bdutilです。

HORTONWORKSとGCP謹製のambari構築用エクステンションが用意されています。

GCPを日常的に使っている方ならば、ごく簡単にambariを試すことができます。

bdutil HDP

手順

基本は、上記の通りですが、いろいろと説明が含まれてるので、手順をまとめます。

  1. projectIdをセットする

    gcloud config set project ${projectId}
  2. Storageでバケットを作る

    gsutil mb -p ${projectId} gs://${bucketName}
  3. bdutilをクローンする

    git clone https://github.com/GoogleCloudPlatform/bdutil
    cd bdutil
  4. バケットを以下のように設定します

    grep BUCKET= bdutil_env.sh
    CONFIGBUCKET=${bucketName}
    
  5. ambari.confを確認する
    ambari.conf

    # チェックすべき箇所は、ワーカー数(+1マスターが立ち上がる)と、マシンタイプです。
    デフォルトで起動すると、月間110ドル程度のインスタンスが5個立ち上がります。
    NUM_WORKERS=4 
    GCE_MACHINE_TYPE='n1-standard-4'
  6. deployする

    # bdutil以下で。
    ./bdutil -e ambari deploy
  7. SSHトンネルを設定する

    gcloud compute config-ssh
    ssh -L 8080:127.0.0.1:8080 hadoop-m
  8. 管理画面にアクセスする

    open http://localhost:8080/
  9. インスタンスにアクセスする

    gcloud compute ssh hadoop-m
    # ここでHadoopクラスタを使うことができます
  10. deleteする

    # bdutil以下で。
    ./bdutil -e ambari delete

公式ambari をDebian 8に入れる時に

ambari 2.2.2 install ambari 2.2.2 は、Debian7のリポジトリしか載っていませんが、Debian8でもそのままインストールできます。

BigQueryや、トレジャーデータなど、フルマネージドのサービスでは、ニーズに合わないということで、自前のクラスタを立ち上げる場合に、このような管理ツールはかなり役立ちます。

2016年9月11日日曜日

Phoenix framework をDebianで試す

ElixirのRails風フレームワークPhoenix frameworkをDebianで試したときの手順です。

Nodejsのセットアップなど幾つか必要な手順があります。

こちらはDebianで試しましたが、apt-getが使えるubuntuでも基本動くと思います。

環境

Debian 8 jessie

参考記事

  • Phoenix 公式インストール手順
    http://www.phoenixframework.org/docs/installation
  • nodejs 公式インストール手順
    https://nodejs.org/en/download/
  • 日本語記事 Install elixir & phoenix framework
    http://qiita.com/oikyn/items/738fcad11549593111b9 Phoenix入門1 - Hello Phoenix
    http://ruby-rails.hatenadiary.com/entry/20151011/1444560106#phoenix-tutorial-1-insatall-phonix

nodejsのインストール

nodejsを使っているので事前にインストールしておきます。v5.0以上です。 公式のインストール手順を参考に、バイナリ設置でインストールしました。 パッケージ管理を使ってインストールもできます。

wget https://nodejs.org/dist/v5.10.1/node-v5.10.1-linux-x64.tar.xz
tar xvf node-v5.10.1-linux-x64.tar.xz
cd node-v5.10.1-linux-x64
sudo cp -p bin/* /usr/bin
sudo cp -p lib/* /usr/lib
sudo cp -p share/* /usr/share
which nodejs
which npm

inotify-toolsのインストール

サーバーを立ち上げた時にエラーが出る場合があります。

sudo apt-get install inotify-tools

Elixir/Phoenixのインストール

準備ができたのでElixir/Phoenixをインストールします。

Elixir

wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb
sudo apt-get update
sudo apt-get install esl-erlang
sudo apt-get install elixir

Hex

mix local.hex

Phoenix

mix archive.install https://github.com/phoenixframework/archives/raw/master/phoenix_new.ez

Phoenixの起動

プロジェクト作成

mysqlを使用する場合は、--database mysqlが必要です。

また、事前にapt-get install mysql-serverでmysqlをインストールしておきます。

mix phoenix.new <prj> --database mysql

npmでセットアップ

cd <prj>
npm install

Phoenix起動

mix phoenix.server

[info] Running PhTest.Endpoint with Cowboy using http on port 4000
2016年9月10日土曜日

tomcat7 を CentOS7 に入れる時のメモ

今更ながら、CentOS7tomcat7をインストールして確認するメモです。

Tomcat7のインストール

yumでそのまま入る。

yum update
yum install tomcat*
tomcat version
systemd start tomcat
systemd status tomcat
curl -v localhost:8080

起動しない場合は、JAVA_OPTSを設定する。

vi /etc/tomcat/tomcat.conf
# 以下を追加
JAVA_OPTS="-Xmx512m -XX:MaxPermSize=256m"

Javaのインストール(Tomcat7は、6以上ならOK)

JRE1.8は自動で入る。そのため、1.8でコンパイルしたものは、そのまま動く。

使いたいバージョンのJDKがある場合は指定して入れる。

yum install java-1.6.0-openjdk-devel
java -version
javac -version
# 必要に応じてalternativesで設定
systemd restart tomcat
curl -v localhost:8080

servletの動作確認

cat > HelloServlet.java << EOF
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloServlet extends HttpServlet {
    public void service(HttpServletRequest req,
        HttpServletResponse res)
        throws ServletException, IOException {

        PrintWriter out = res.getWriter();
        out.println("Hello World!");
        
    }
}
EOF

javac -classpath '/usr/share/tomcat/lib/*' HelloServlet.java 
mkdir -p /usr/share/tomcat/webapps/ROOT/WEB-INF/classes
cp HelloServlet.class /usr/share/tomcat/webapps/ROOT/WEB-INF/classes/.
cat > /usr/share/tomcat/webapps/ROOT/WEB-INF/web.xml <<EOF
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>HelloServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/HelloServlet</url-pattern>
    </servlet-mapping>
</web-app>
EOF
systemctl restart tomcat
curl -v localhost:8080/HelloServlet

Contextの設定と確認

cat > /etc/tomcat/Catalina/localhost/mycontext.xml <<EOF
<Context path="/mycontext" docBase="/tmp/mycontext" workDir="/tmp/mycontext/work" />
EOF

mkdir -p /tmp/mycontext/WEB-INF/classes
cp HelloServlet.class /tmp/mycontext/WEB-INF/classes/.
cp /usr/share/tomcat/webapps/ROOT/WEB-INF/web.xml /tmp/mycontext/WEB-INF/.
curl -v localhost:8080/mycontext/HelloServlet

firewallの設定をする

  • クラウドならば、Security Groupなどを設定
  • インスタンスのfirewallを開く(CentOS7はfirewalld)
  • 外部からアクセスできるようにする場合は注意

トラブルシューティング

500系エラー

  • ログを見て対処。
  • ClassNotFound系は、classファイルの設置場所が正しいか確認。

400系エラー

  • web.xmlの指定が正しいか確認。
  • web.xmlの設定が壊れている場合は、どこをたたいても400系エラーが出る。
2016年8月28日日曜日

GCPのBigQueryを使ってみました

BigQueryを使ってみたので、関連情報をまとめました

GCP NoSQL を使ってデータ処理したい時

主なサービスはこの辺りだと思います。

今回は、格安で比較的枯れているBigQueryを使ってみました。 以降の記事はBigQueryについてです。

オライリー本もあります。 Google BigQuery

課金について

ビッグデータをCloudサービスで使う時、課金方式をよく把握しておくのは必須です。

  • データ保存による: 1TB 1ヶ月 $20
  • スキャンデータ量による
  • BigQueryで150万円溶かした人の顔
  • 300GBに対して、フルスキャンを数百回繰り返した。(テーブル切り分けのために、select insert)
  • 価格体系が今後変わる。computing量による感じに。
  • ストリーミングは課金: 10万行単位などバルクインサートより高い。
  • 費用的には、Cloud Storageなどにデータを置いて、バルクインサートが良い。
  • ストリーミングの方が手間は少ない(Fluentdや、以下のPandasなどで直接インサートできる)
  • ストリーミングはデータ落ちなどが発生する模様。

BigQuery の課金仕様と注意点をまとめてみた(2015-07 時点)

課金対策ツール

使い方

Pythonから使う場合がメインです。

データ分析基盤としての BigQuery 運用のベストプラクティス Python使いのためのBigQuery連携

また、SDKが提供されてない言語でも、REST APIから使えます。 BigQuery クライアント ライブラリ

その場合、OAUTH2認証が必要です。

CLIで使う

Googleが提供している、基本のbqコマンドです。

bq コマンドライン ツール クイックスタート

インタラクティブに使う

GCPのコンソールからのやり方です。

Quickstart Using the Web UI

Jupyter(IPython)ベースのインタラクティブツールもあります。
Betaですが、Jupyterはかなり使いやすいので、こちらもオススメです。

Google Cloud Datalab 上のページのCLOUD DATALAB を起動は使えなくなってる模様。立ち上げはこちらから。dockerを使って起動する。 quickstart

アプリで使う(ライブラリ)

  • Pandas: io.gbqパッケージがあり、read_gbqto_gbqが用意されてます。pandas使っている方ならこれ一択かと。かなり使いやすいです。
  • Pythonのclientライブラリ: BigQuery-Pythonがあります。Pandas使ってない方はこちらが候補になると思います。使いやすいです。
  • 公式API:上記でできないことがある場合以外、直接触ることはないです。ライブラリ作成者向けだと思います。
Pandas

to_gbqinsertすると、ストリーミングになり、課金対象になります。
大量データを入れる場合は計算した方が良いです。

pandas連携が詳しく載ってるので再掲します。

Python使いのためのBigQuery連携 pandas.io.gbq.read_gbq pandas.io.gbq.to_gbq

Python client

BigQuery-Python PythonからBigQueryを操作するときは BigQuery-Python が便利だった

公式API

BigQuery API クイックスタート BigQuery API Client Library for Python getting_started.py Google Application Default Credentials

Google Compute Engine インスタンス間でやり取り(service account と mysql in Debian)

Google Compute Engine間でやり取りをするときの設定です。

gcloudを既存のインスタンスで使う

Service Accountsを作って、その認証情報をgcloudに設定します。

認証エラーが出ます

認証設定してない時は、このようなエラーが出ます。

$ gcloud compute instances list
ERROR: (gcloud.compute.instances.list) Some requests did not succeed:
 - Insufficient Permission

auth loginでセットアップしようとすると...

$ gcloud auth login

You are running on a Google Compute Engine virtual machine.
It is recommended that you use service accounts for authentication.

service accountsを使った方が良いと勧められます。

サービスアカウントを作成

今回は、コンソールからサービスアカウントを追加しました。 詳細手順は、公式ドキュメントのCONSOLEタブにあります。

Creating and Managing Service Accounts

gcloudの設定

上記で取得した、キーファイルをインスタンス上に設置して、アクティベイトします。

$ vi ~/.cred.json
$ chmod 400 ~/.cred.json
$ gcloud auth activate-service-account --key-file ~/.cred.json
$ gcloud compute instances list
...

参考: gcloud auth activate-service-account Creating and Enabling Service Accounts for Instances

MySQLをインスタンス間で接続する

MySQLを設定して、インスタンス間のネットワークを設定します。

とりあえずつなぐと疎通出来ませんでした。

$ telnet 10.240.0.4 3306
Trying 10.240.0.4...
telnet: Unable to connect to remote host: Connection refused

Compute Engine

  • インスタンスのネットワーク設定を確認する
  • デフォルトで、default-allow-internalがついてる。変えて無ければOK。

How to Set Up Remote Access to MySQL on Google Compute Engine Google Compute Engineのファイヤーウォールを理解する

mysqlの設定

クライアント側でmysql-clinetをインストール

sudo apt-get install mysql-client

Debianでは、セキュリティ上の理由から、MySQLサーバは、デフォルトでリモートアクセスを停止しています。

  • /etc/my.cnfbind-address=${instance-ip}に設定します
  • mysqlをリスタートします。

    $ sudo systemctl restart mysql
    $ systemctl status mysql

mysql server

あとは、ユーザの権限を確認します

select user, host from mysq.user

確認

クライアント側のtelnetで疎通確認

$ telnet XXX 3306
Trying XXX...
Connected to XXX.
Escape character is '^]'.

クライアント側のmysqlコマンドで接続

mysql -u xxx -p -h xxx
2016年8月21日日曜日

tensorflow の sample を動かす

以下は、tensorflowの公式チュートリアルの一つ、手書き数字認識のサンプルです。

TensorFlow MNIST tutorial

インストール時にエラーが出る場合があります。 最新版を入れて、protobufを入れ直して解決しました。

インストール

このsampleを試す場合、tensorflowのインストールは、このやり方がオススメです。

少し古いバージョンを直接指定したところ、input_dataのパッケージパスの指定が、tutorialのやり方ではうまくいきませんでした。 また、最新が欲しい方は、githubからcloneする方法もあります。 https://github.com/tensorflow/tensorflow/issues/890

export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.10.0rc0-cp27-none-linux_x86_64.whl
pip install --upgrade $TF_BINARY_URL --trusted-host storage.googleapis.com

データインポート

tutorial に従ってデータをインポートすると以下のようなエラーが出ました。

> from tensorflow.examples.tutorials.mnist import input_data
...
ImportError: Traceback (most recent call last):
  File "/home/YutakaNishimura/tensorflow/lib/python2.7/site-packages/tensorflow/python/__init__.py", line 52, in <module>
      from tensorflow.core.framework.graph_pb2 import *
        File "/home/YutakaNishimura/tensorflow/lib/python2.7/site-packages/tensorflow/core/framework/graph_pb2.py", line 6, in <module>
            from google.protobuf import descriptor as _descriptor
            ImportError: No module named google.protobuf


Error importing tensorflow.  Unless you are using bazel,
you should not try to import tensorflow from its source directory;
please exit the tensorflow source tree, and relaunch your python interpreter
from there.

protobufを確認すると入ってました。
インストールし直しました。

pip uninstall protobuf
pip install protobuf

再度実行すると成功しました。

In [1]: from tensorflow.examples.tutorials.mnist import input_data

In [2]: mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Extracting MNIST_data/train-images-idx3-ubyte.gz
Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Extracting MNIST_data/train-labels-idx1-ubyte.gz
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Extracting MNIST_data/t10k-images-idx3-ubyte.gz
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting MNIST_data/t10k-labels-idx1-ubyte.gz

Pandasの基本的でよく使いそうな機能のメモ

Pandasの基本的ですが、実際によく使いそうな使い方のメモです。

インストールについて

こちらが非常に詳しいです。 anacondaを使って環境構築します。

Google Compute Engine + Debian で実行しましたが、問題なく動いてます。

データサイエンティストを目指す人のpython環境構築 2016

csv形式のStringからデータを読み取る。

Stringから直接csvデータを読み込むこともできます。 http://stackoverflow.com/questions/22604566/how-to-create-a-pandas-dataframe-from-string

import sys
from io import StringIO

d = StringIO("""a,b,c
1,2,3
11,12,13
""")

df = pd.read_csv(d)

データフレームを連結する

Python Pandasでのデータ操作の初歩まとめ − 前半:データ作成&操作編 pandasでindexの連番を振り直す

concatもしくは、append関数を使います。

行を追加する場合も、DataFrameの連結で行います。

  • concatは対象とするDataFrameをリストにして渡します。
  • appendはdf.appendという書き方になるので、直接行を追加する場合に便利です。
  • どちらもデフォルトでは、非破壊的な動作になっています。

行方向に追加

concatを使って連結

// axis=0 (デフォルト。省略可能)
concated_df = pd.concat([df1, df2])

ちなみに、カラム名が異なると、カラムは全て残り、互いの欠損箇所には、NA値が挿入されます。

欠損値を埋めたい場合は、fillnaを使います。統計処理で必要とされる、平均値補完、線形補間なども簡単にできます。

// 0埋め
df.fillna(0)
// 平均値
df.fillna(df.mean())
// 線形補間
df.interpolate()
// na値削除(行ベース)
df.dropna()
// na値削除(列ベース)
df.dropna(axis=1)

appendを使って行をその場で追加

// columnsを既存のものから取ってきて同じ構造にします
appended_df = df.appned(pd.DataFrame([[1,2,3]], columns = df.columns.tolist())

列方向に追加

pd.concat([df1, df2], axis=1)

同じくインデックスが違うと列方向にNA値が挿入される。

新しい列をその場で追加する方法は、こちらが簡単です。 ただ、dfを直接書き換えるので注意が必要です。

df['c_new'] = [1,2,3]

インデックス・カラムの貼り直し

行番号の貼り直し

concated_df.reset_index(drop=True)

//直接生成時に貼り直すこともできる
pd.concat([df1,df2]).reset_index(drop=True)

カラム名の貼り直し

// dfインスタンスに対して設定
concated_df.columns = ["c1","c2","c3","c4","c5","c6"]

表記ブレをなくすよう変更

// 全て小文字にして、スネークケースにする。記号も開きました。
df.columns = [s.lower().replace(' ', '_').replace('?', '_bool') for s in df.columns.tolist()]

SQLのような処理を行う

よくまとまっていてオススメです。

pandasにsqlでよくやる処理をやらせてみる

sort

sort_valuesを使う方が推奨のようです。

df.sort_values(by="col1")

ERROR

CSVのパースエラー

CSVを読み込む時に、パースエラーが発生しました。

> df = pd.read_csv("file.csv")

pandas/parser.pyx in pandas.parser.TextReader.read (pandas/parser.c:8748)()

pandas/parser.pyx in pandas.parser.TextReader._read_low_memory (pandas/parser.c:9003)()

pandas/parser.pyx in pandas.parser.TextReader._read_rows (pandas/parser.c:9731)()

pandas/parser.pyx in pandas.parser.TextReader._tokenize_rows (pandas/parser.c:9602)()

pandas/parser.pyx in pandas.parser.raise_parser_error (pandas/parser.c:23325)()

CParserError: Error tokenizing data. C error: EOF inside string starting at line 244276

ここで line 244276 は、ファイル上の行数でないので注意が必要です。

この時は結果的に、csvファイルの最終行のデータがおかしくなっていためエラーになっていました。

それでも解決しない場合は、この辺りが参考になると思います。

ISSUEが立っていますが、この問題は現在は、フィックスされてるよう。 https://github.com/pydata/pandas/issues/5501

カラムが多すぎるとExceptionを吐くが、それらを削除して読み込む。

pd.read_csv("file.csv", error_bad_lines=False)

エンコーディングとエンジンを指定する

pd.read_csv("file.csv", encoding='utf-8', engine='c')
pd.read_csv("file.csv", encoding='utf-8', engine='python')

quotingを指定する

import csv
pd.read_csv("file.csv", quoting=csv.QUOTE_NONE)

文字列として読み込んで解析する

f = open("file.csv")
s = f.read()
l = f.readlines()
2016年8月20日土曜日

Pandasで実践的(というか実務的)なデータを扱う

実務的なデータをさっと処理したい場合、

  • SQL
  • スクリプト言語
  • Shell/AWK
  • Excel

あたりがよく使われると思います。

ここでは、スクリプト言語の一つになると思いますが、Python+Pandas紹介します。

Pandasは、Pythonのデータ処理用ライブラリで、DataFrameというExcelのスプレッドシートのようなオブジェクトを使って処理します。DataFrameはもともとS言語/Rに実装されていたものです。

Pandasの特徴である強力で豊富な統計処理の紹介が多いですが、実務データの処理もかなり使えます。

準備

ipython

pythonの対話実行環境としては、ipythonは必須です。 ファイルのタブ補完も効くのでサクサクできます。

pip install ipython

Pandasのimport

ここからは、事前にこのようにimportしていることを前提とします。

import pandas as pd
import numpy as np

データ読み取り

csvファイルの場合。

df = pd.read_csv("a.csv")

URLや桁区切りのカンマにも強いtsvファイルはこちら。

df = pd.read_csv("a.tsv", sep="\t")

ファイルにはヘッダを入れた方がいいです。

PandasのDataFrameはヘッダ情報もきちんと読み取り、列名称で値を指定することが可能なためです。

マージ(join)

現実の業務処理では、joinはかなり需要があると思います。

Pandasももちろんできますが、どちらかというと、統計処理で必要な行を追加していく(union系)の処理の紹介が多いと思います。

Pandasでのマージの仕方。

// キー名が違う場合
merged = pd.merge(df1, df2, left_on = 'id1', right_on = 'id2')
// キー名が同じ場合
merged = pd.merge(df1, df2, on = 'id') 

mergeメソッドは、オプションも豊富です。

行ごとに処理

必要なデータが一つの表にまとまったら、行ごとに処理をしたいですね。

しかもこのロジックはかなり複雑になることがあります。

SQLで複雑なCASE文を書くよりもスクリプト言語で書いた方がすっきりする場合も多いです。

オススメはiterrowsを使うことです。applymapを使うと、関数を渡してシンプルに記述できるのですが、カラム名が使えなくなります。

df['new'] = ""
for key, record in df.iterrows():
  if record["column1"] in ["a", "b"]:
    ...複雑なロジック
    df.loc[key, 'new'] =  "column1 is " + record["column1"]

また、ここはPandasの強力なスライシング処理によって、必要なデータを取得することが可能なのでロジックを簡潔にすることが可能です。

こちらはapplyを使って行ごとに処理する場合。

def f(s):
  print s

df.apply(f, axis=1)

csv/tsvへの出力

非常にシンプルです

csv

df.to_csv("b.csv")

import csv
df.to_csv("b.csv", quoting=csv.QUOTE_ALL)

tsv

df.to_csv("b.csv", sep="\t")

まとめ

各ステップでは、そこに強い言語やツールがあるかと思います。

Python+Pandasは一通り扱えることがメリットだと思います。

一旦、DataFrameに取り込んでしまえば、手続き的な処理、集計処理ともにかなり柔軟に処理ができます。

2016年8月14日日曜日

Google Container Engine(kubernates)をDebianで試すときのポイント

kubernatesは現在も活発に開発が進んでいるプロダクトです。

コンテナを日常的に使っていると前提条件になっていることは省略されていて、意外とまとまったものが出てきません。

初めてセットアップするときのポイントをまとめました。

セットアップの流れ

  1. dockerのインストール
  2. Google Cloud Platformのクライアント(gcloud)をインストール
  3. kubernates(kubectl)のインストール(gcloudで入らない場合)
  4. Googleの公式ドキュメントに従う
  5. kubernatesのサンプルに従う

その他注意点

  • 数百MB〜数GBのデータ通信が発生する
  • dockerイメージを使ってるとすぐに数GB~数十GB使う

参考

kubectl リファレンス Quickstart Google Container Engine

dockerのインストール

  • apt-get では、docker.ioをインストールする必要がある。

    $ sudo apt-get install docker.io
  • インストールしたら、rebootしてください。(日常的に使ってないとつい忘れて諸々エラーが出る)

    $ sudo reboot
  • dockerグループに追加しておく。

    $ sudo gpasswd -a ${user} docker 
  • dockerコマンドはきちんと設定すれば、基本sudoなくてOKです。

    $ docker info

ここまでやったら、Googleの公式ドキュメントに従って進める。

Container Engine 開始方法

  • gcloudからkubectlを入れる箇所がありますが、できない場合は、次のkubernatesのインストールをします。

    $ gcloud components update kubectl
    $ rehash
    $ kubectl version
  • gcloud とGKEを組み合わせるとかなり簡単にクラスターを作れる。
  • CoreOSを複数立ち上げて、その上にクラスターを乗せるのは、GKEができてからでいいと思います。

kubernates(と関連ツール)のインストール

kubectlのインストールをしておきます。

gcloudコマンドでkubectlがインストールできれば、この箇所は飛ばして問題ないです。

  • パッケージ管理では提供されてないです。
  • githubのリリースから取ってきます。(以下はv1.3.5)

    $ curl -OL https://github.com/kubernetes/kubernetes/releases/download/v1.3.5/kubernetes.tar.gz
    $ tar xzvf kubernetes.tar.gz
  • リリースには、ビルド後の全てが入ってます。
  • kubectlのインストールです。

    $ sudo cp kubernetes/platforms/linux/amd64/kubectl /usr/local/bin/kubectl
    $ sudo chmod +x /usr/local/bin/kubectl
  • 参考: Installing and Setting up kubectl

kubernates サンプルを試す。

上記ページの一番下に、kubernatesのサンプルのリンクがあります。 例えばnode.jsを使ってみるなどがあります。

node.jsを使う例

2016年8月11日木曜日

Apache Beam in Debian で Word count

Apache Beamでword countしてみました。

なぜ Apache Beam なのか : Dataflow のライバル参入を促す理由 http://googlecloudplatform-japan.blogspot.jp/2016/05/apache-beam-dataflow.html

Cloud Dataflow の Python SDK がベータに http://googlecloudplatform-japan.blogspot.jp/2016/08/cloud-dataflow-python-sdk.html

Dataflow Quickstarts https://cloud.google.com/dataflow/docs/quickstarts/quickstart-java-maven?hl=ja

Apache Beam は、Google Cloud Dataflow をオープンソース化したプロジェクトです。

http://beam.incubator.apache.org/

ビッグデータ処理の最も抽象化の高い層に位置するフレームワークです。

ビックデータのバッチ処理とストリーミング処理双方をサポートし、 処理基盤としてApache Sparkなどを使えます。

また、Googleの各種ビッグデータ処理サービスと連携して機能します。

現在は、Apache incubator プロジェクトで、ドキュメントは必要最小限です。 また、日本語の資料も少ないのが現状です。

Mavenを日常的に使っていればすぐに試せますが、Hello worldがサクッとできるREADMEが用意されているわけではないので、まとめました。

環境について

今回は、Cloud Dataflow を処理基盤(Runner)に指定しました。 そのため、Dataflowジョブを実行するプロジェクト内に、GCEインスタンス、Storageの作業バケット/ディレクトリを作りました。

maven-3.3.Xをインストールする

apt-get install mavenでは、3.0.5など古いのが入ました。これだとBeamのビルドができません。

以下を参考に、最新のMavenをインストールします。

http://maven.apache.org/install.html http://maven.apache.org/download.cgi

$ curl -OL http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.zip
$ unzip apache-maven-3.3.9-bin.zip
$ sudo mv apache-maven-3.3.9 /opt
$ PATH=$PATH:/opt/apache-maven-3.3.9/bin
$ mvn -v

Maven3のはじめかた https://www.gitbook.com/book/kengotoda/what-is-maven/details

Beam のセットアップ

githubから取得して、実行してみます。

$ git clone https://github.com/apache/incubator-beam.git
$ cd incubator-beam
$ mvn test

Spark関連のテストでエラーが出てしまいました。 が、コンパイルは通っているようなので、一旦進めました。

 -------------------------------------------------------
   T E S T S
 -------------------------------------------------------
 Running org.apache.beam.runners.spark.EmptyInputTest

サンプルを動かす

example内にサンプルコードがあります。 ここにもpom.xmlが設定してあるので、必要な箇所を修正すれば、実際に動かすことができます。

GCP Dataflowをrunnerとして設定する

基本、コメント欄のコピペでいいのですが、以下のsetTempLocationが使えなくなっています。

    //   dataflowOptions.setTempLocation("gs://SET_YOUR_BUCKET_NAME_HERE/AND_TEMP_DIRECTORY");

setGcpTempLocationを使用します。

dataflowOptions.setGcpTempLocation("gs://SET_YOUR_BUCKET_NAME_HERE/AND_TEMP_DIRECTORY");

また、必要なライブラリをimportします。

+++ b/examples/java8/src/main/java/org/apache/beam/examples/MinimalWordCountJava8.java
@@ -28,6 +28,9 @@ import org.apache.beam.sdk.transforms.MapElements;
 import org.apache.beam.sdk.values.KV;
 import org.apache.beam.sdk.values.TypeDescriptors;

+import org.apache.beam.runners.dataflow.options.DataflowPipelineOptions;
+import org.apache.beam.runners.dataflow.BlockingDataflowRunner;
+

あとは、プロジェクトID, Storageのパスを設定します。

 import java.util.Arrays;

 /**
@@ -53,8 +56,14 @@ public class MinimalWordCountJava8 {
     // for more details.
     //   options.as(FlinkPipelineOptions.class)
     //      .setRunner(FlinkRunner.class);
+    DataflowPipelineOptions dataflowOptions = options.as(DataflowPipelineOptions.class);
+
+    dataflowOptions.setRunner(BlockingDataflowRunner.class);
+    dataflowOptions.setProject("project-id");
+    dataflowOptions.setGcpTempLocation("gs://");

-    Pipeline p = Pipeline.create(options);
+    Pipeline p = Pipeline.create(dataflowOptions);

     p.apply(TextIO.Read.from("gs://dataflow-samples/shakespeare/*"))
      .apply(FlatMapElements.via((String word) -> Arrays.asList(word.split("[^a-zA-Z']+")))
@@ -66,7 +75,7 @@ public class MinimalWordCountJava8 {
          .withOutputType(TypeDescriptors.strings()))

      // CHANGE 3/3: The Google Cloud Storage path is required for outputting the results to.
-     .apply(TextIO.Write.to("gs://YOUR_OUTPUT_BUCKET/AND_OUTPUT_PREFIX"));
+     .apply(TextIO.Write.to("gs://"));

     p.run();
   }

compileして確認します。

$ mvn compile

認証設定をする

JavaからCloud Storageにアクセスするために、認証情報を設定します。 まず実行してみます。

$ mvn exec:java -Dexec.mainClass=org.apache.beam.examples.MinimalWordCountJava8

認証がうまくいってないと、ERRORメッセージが出ます。解消方法の例も出るので、参考にします。

今回は、GCEのインスタンスからアクセスしたので、gcloudコマンドで認証をしました。

$ gcloud auth login

再度、上記コマンドで実行します。SUCCESSになったら、GCP上で結果を確認します。

  • Cloud Dataflowのジョブ一覧に出てきます。
  • アウトプットは、Storageにでます。

上記でうまくいかない場合は、GCP SDKの認証方法が幾つかあるので、この辺りが参考になりそうです。

Google Cloud Dataflowを試してみた http://qiita.com/harukasan/items/019da8a6e76b341f6c73

Mavenリポジトリにもあります

すでに、Mavenリポジトリに上がっているので、ライブラリはそのまま使うことも可能です。

https://mvnrepository.com/artifact/org.apache.beam

2016年8月4日木曜日

Elixir 1.3 を OTP18指定でDebianにインストール

Elixir1.3 + OTP19 は、一部ライブラリがコンパイルできない問題があります。
早晩、対応されると思いますが2016年8月3日時点でちゃんと動くインストール方法です。

今回出たのは、これです。結局OTP19にElixirが対応してないので、示されてるコマンドでは復旧できなかったです。

** (Mix) Could not compile dependency :erlware_commons, "/home/YutakaNishimura/.mix/rebar3 bare compile --paths "/home/YutakaNishimura/scrape_exs2/_build/dev/lib/*/ebin"" command failed. You can recompile this dependency with "mix deps.compile erlware_commons", update it with "mix deps.update erlware_commons" or clean it with "mix deps.clean erlware_commons"

インストールのポイントは、ErlangのOTP18を先に入れておくことです。
公式の手順通りにいきなりElixirをインストールすると自動的にOTP19が入ってしまって、復旧に手間取ります。

Erlangのインストール

以下ライブラリが入ってないとインストールに失敗するので入れておきます。

$ sudo apt-get update
$ sudo apt-get install -y libwxbase3.0-dev libwxgtk3.0-dev

Erlang Solutionsのページから自分のプラットフォームにあったOTP18のdebを探します。

https://www.erlang-solutions.com/resources/download.html

$ wget https://packages.erlang-solutions.com/erlang/esl-erlang/FLAVOUR_1_general/esl-erlang_18.3.4-1~debian~jessie_amd64.deb && sudo dpkg -i esl-erlang_18.3.4-1*
$ # check
$ erl -v

Elixirのインストール

Erlang Solutionsのリポジトリを登録して、Elixirをインストールします。

$ wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb
$ sudo apt-get install -y elixir
$ # check
$ iex -v

トラブルした時のコマンド

dpkgとaptコマンドを駆使します。

$ # リスト 
$ dpkg -l | grep erlang
$ # 削除
$ dpkg -r ${pkg}
$ # パッケージ名検索 
$ apt-cache search ${pkg}
$ # 削除
$ apt-get remove ${pkg}

詳細はここ http://qiita.com/white_aspara25/items/723ae4ebf0bfefe2115c

2016年8月3日水曜日

tensorflow を Debian にインストール

tensorflowをインストールしました。

tensorflowは、Googleが作った機械学習ライブラリです。ティープラーニングに強いことで有名です。

いつもながら、Ubuntuの記事はよく出てきますが、Debianは出てきません。 Debianでも動作することを確認しました。

とりあえずインストール

Ubuntuにとあるが、debianでも問題ない
http://qiita.com/yudsuzuk/items/092c38fee18e4484ece9

virtualenvを使った場合
http://blog.btrax.com/jp/2015/11/29/tensorflow/

virtualenvの使い方
http://www.lifewithpython.com/2013/08/virtualenv.html

SSLエラーが出たとき

Google Cloud Platform の インスタンスからアクセスしたら、以下が出ました。

SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)

以下、SSLエラーを出さないコマンド(--trusted-hostを追加)です

(tensorflow) % pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl --trusted-host storage.googleapis.com

よい tensorflow life を!

2016年6月5日日曜日

debianをさっくりノートPCにインストールする

debian 8 jessie を wifi と USB で ノートPC に

最近は、VMやクラウドを使うことが多くなって、PCに直接インストールする機会は減ってきたと思います。

久しぶりにdebianをインストールしましたが、以前とは、状況がかわっていました。

対象がノートPCのため、

  • インストールメディアはUSBがいい
  • wifiでインストールしたい(有線LANがない)

また、このあたりはそろそろ卒業したくなってきます。

  • 全部入りのイメージファイルをダウンロードして使う
  • ドライバファイル用のメディアを別に用意して抜き差しする
  • とりあえずインストールして、後からwifiとかを設定する

ということで、wifi経由でさっくりとインストールできないかやってみました。

やり方

公式手順にあります。

debian を日常的に使っている方にとっては、当たり前かもしれません。

https://www.debian.org/releases/stable/amd64/ch04s03.html.ja#usb-copy-isohybrid

別の方法として、とても小さな、サイズが数メガしかない USB メモリ用に、netboot ディレクトリから mini.iso をダウンロードできます (場所については 「どこでインストールイメージを探すか」 に記載があります)。
(中略)
USB メモリに配置したハイブリッドイメージは、ストレージの領域すべてを専有するわけではありません。そのため、ファームウェアファイルやパッケージ、その他選んだファイルを保持するために、空き領域を使用するのを、検討する価値があるかもしれません。あなたが、ひとつしか USB メモリを持っていないか、ひとつのデバイスにすべて格納する必要があるときに便利です。
USB メモリに ふたつ目の FAT パーティションを作成し、パーティションをマウントしてから、ファームウェアのコピーや展開をそこに行います。以下に例を示します。

# mount /dev/sdX2 /mnt
# cd /mnt
# tar zxvf /path/to/firmware.tar.gz
# cd /
# umount /mnt

これならば、20MB程度のisoファイルを書き込んで、余った領域に、ドライバを書き込めばインストールメディアが完成します。

稼働しているLinuxが必要と書いてありますが、isoをUSBに書き込める環境があればできます。
今回は、Macで作業しましたが問題なくできました。

ちなみに、なぜドライバが必要かというと、debianでは、Non-Freeのドライバはデフォルトで入らないので自分で用意するためです。

手順

1. wifiのドライバがdebianのFreeにあるか確認する。

  • インテルの内蔵LANは基本ないです
  • 機種を確認して、ドライバ状況を確認
    • 元々Windowsが入ってれば、デバイスマネージャで
    • Unix系ならばlspci | grep Network

2. debianのFreeにない場合

dpkg -i firmware-iwlwifi_20160110-1_all.deb
ls /lib/firmware

3. mini.isoを取得。

4. mini.isoの書き込み

  • unix系は、ddで。
sudo dd if=mini.iso of=/dev/diskN bs=1m
# 一度コンバートしないといけない
hdiutil convert -format UDRW -o debian-8.4.0-amd64-mini.img mini.iso
sudo dd if=debian-8.4.0-amd64-mini.img.dmg of=/dev/diskN bs=1m

5. ドライバのコピー

  • 4で作った残りのパーティションをマウントして、ドライバをコピー。
# fdisk -l などでパーティション状況確認

mount /dev/sdX2 /mnt
cp /path/to/driver /mnt
umount /mnt

6. 作ったUSBを外す(Macはイジェクト、umountなどして)

あとは、作ったUSBを使って、インストールしたいPCを起動すれば、インストール画面に入れます。
インストール手順を進めると、ネットワーク設定のところで、Wifiネットワークを選択して、キーを入れれば繋がります。

もし、ネットワーク設定のところでドライバがないというエラーが出たら、以下でエラーを確認できます。

  1. 一旦「戻る」を選択してメニューに戻る
  2. シェルを起動
  3. ドライバ関連のメッセージを見る dmesg | grep -i wifi
  4. 上記で必要なファイルがUSBにあるか確認する

その他インストールの時の注意点

  • ネットワークから随時ダウンロードしながらなので、安定したところからダウンロードしたいです。拡張パッケージの接続先は、riken様のサイトがおすすめです。
  • USBベースだとインストール先のパーティションがどうしてもわかりにくくなります。Windowsとデュアルブートにしたいなどの時に、間違ってインストールしないように注意してください。
  • 上記に関連して、デフォルトになっているのが、ディスクを丸々すべてフォーマットして使うようになっていて、これだとパーティション分けておいてもすべて上書きされますので、ここも注意が必要です。

インストールしてみて

とても快適です!

GNOMEを入れましたが、デスクトップとしても随分洗練されています。

debianは、Ubuntuの元になったディストリビューションです。今はUbuntuの方がかなり有名ですが、debianは、安定性の高さや、パッケージ管理のしやすさ、Freeにこだわるポリシーなど、あえて言うまでもなく、かなりよいディストリビューションです。

今時のwifi(Wimax OnlyでもOK!)+ USB環境でも、さっくりとインストールできるので、試してみてはいかがでしょうか?

よいdebian生活を!

Written with StackEdit.