2016年4月23日土曜日

Elixir で Web スクレイピング

Webスクレイピングの本

Webスクレイピングの本といえば、「Rubyによるクローラー開発技法」が有名です。

今回は、先日発売された「PythonによるWebスクレイピング」を読みました。 Python本らしく、誰でも最短でやりたいことができるようになっています。

内容は、Webの情報を取得、蓄積、活用(組み合わせ)するというステップにそって、HTTPクライアントライブラリを使ったシンプルなプログラムから始めて、機能を追加しながらWebスクレイパーを作成します。

また、処理のコアとなる部分のコードは、エラー処理含めて載っていますし、実用的なコードを作る際に注意すべき点をアドバイスしていて、実践的な内容になっています。

説明は、必要にして十分といった感じです。分量的にも、200ページ程度で読みやすいので、Webを漁って断片的な情報を集めるより効率はよいと思います。

プログラミング初心者はもちろん、さっくりとこの分野を押さえたいエンジニアの方にもオススメできます。

Elixirで実装してみる

今回読んだ本を元に、ElixirでWebスクレイパーを実装してみたいと思います。

Elixirでスクレイパーを作る記事はすでにありますが、上記のWeb情報を活用するための手段としての、Webスクレイピングと捉えて、簡単なWebシステムを構築することを目指します。

Pythonの豊富なライブラリに対してどこまでElixirが実用的になっているかを検証するためにもよい題材と思います。

Webスクレイピングの基本要素

実装に入る前に、Webスクレイピングに必要な要素を見てみます。

HTTPクライアントや、HTMLパーサのほか、Web API関連とデータ保管もあげました。上記の本では、データ保管は、スクレイピングした情報を活用するためには不可欠とされていました。

実際に実用的なものを作ろうと考えると、これらがシームレスに連携しないと厳しいので、ここでもあげることにしました。

  • HTTPクライアント
  • HTMLパーサ(内部リンクと外部リンクの取得)
  • API(認証、クライアントライブラリ、JSON)
  • データ保管(DB、ファイル)

Elixirのライブラリ

上のそれぞれの要素を実現するライブラリです。有名なところだけでも2~3はライブラリがあるようです。
一通りは揃っているので、とりあえず基本的なシステムを構築するには問題ないと考えます。

Elixirプロジェクトのセットアップ

まずはmixを使って、プロジェクトを作ります。

$ mix new prj

次に、mix.exsに設定を追加します。
この際、applicationに、:httpoisonを追加しておくと自動でstartしてくれます。

def application do
  [applications: [:logger, :httpoison]]
end

defp deps do
  [{:httpoison, "~> 0.8.0"}]
end

依存ライブラリをインストールします

$ mix deps.get

実際のソースコードは、libs以下に作成します。
main関数を作っておきます。

defmodule Prj do
  def main([]) do
  # codes
  end
end

実行します

$ mix run -e "Prj.main([])"

コンパイルが開始し、Prj.main関数が実行されます。

プロジェクト周りは、このページがステップバイステップで解説していてわかりやすいのでオススメです。

http://etc9.hatenablog.com/entry/2015/08/04/004748

では、次回から具体的な実装に入っていきたいと思います。

Written with StackEdit.

2016年4月10日日曜日

Phoenixのtutorial

フレームワークをインストールしたら、一通りtutorialを試してみたくなると思います。
Phoenixのtutorialは、ネット上に充実したものがあるので、そのリンクをまとめました。
公式tutorialは英語ですが、1つずつ丁寧に説明してあり、コードもそのまま動くので、オススメです。

日本語

Phoenix入門

Phoenixを使ってChatアプリを作る
http://ruby-rails.hatenadiary.com/entry/20151011/1444560106

ElixirのRoR風フレームワークPhoenixのはじめ方

DB設定の仕方が詳しい
http://etc9.hatenablog.com/entry/2015/08/06/001906

超高速なJSON APIをElixirフレームワークのPhoenixでビルドしてテストしよう

REST Web APIを実装する。Phoenix上で開発する一連の流れがつかめて実践的。
http://postd.cc/testing-a-phoenix-elixir-json-api/

ここらで日本一わかりやすく「Phoenix + Webpack + React」を試してみようか

フロントエンドよりのtutorial。静的ページ、React連携など。
http://tech.donuts.ne.jp/articles/20

公式tutorial(英語)

アプリ起動(前回の起動までできてればOKだと思います)

http://www.phoenixframework.org/docs/up-and-running

ページを追加して、Hello, world してみる

http://www.phoenixframework.org/docs/adding-pages

ルーティング

http://www.phoenixframework.org/docs/routing
Written with StackEdit.
2016年4月7日木曜日

Elixir PhoenixFrameworkをdebian/ubuntuにインストールしました

最近話題のElixir & Phoenixをインストールしてみました。

Macの記事が多いので、debianで動かしてコマンドをまとめました。ubuntuでもほぼ動くと思います。
インストールした感じですが、とにかくインストール時間が短く快適でした。
いくつかエラーがでましたが、よい記事がいくつかあり、すぐに解決できました。感謝です。

興味のある方は、一度インストールしてみてはどうでしょうか。

環境

debian 8.3 Jessie
GCPで新規インスタンスを用意

参考記事

こちらを参考にしました。

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 -pr lib/* /usr/lib
sudo cp -pr share/* /usr/share
which node
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を使用しました
mix phoenix.new <prj> --database mysql

セットアップ

cd <prj>
npm install
# エラーがでたときはこれを実施: curl -0 -L http://npmjs.org/install.sh | sudo sh

起動

mix phoenix.server

# [info] Running PhTest.Endpoint with Cowboy using http on port 4000
2016年4月6日水曜日

Stackで開発

Stackは、Haskellのパッケージ管理システムです。

Stackの説明、導入方法はよい記事があります。私もそちらを参考にStackを使ってみたところ、快適に開発することができました。
実際にやってみて、便利なコマンドなども調べたので、まとめました。

Stack導入

こちらの記事が非常に参考になります。

Stackのテンプレートの作り方

早速テンプレートを作って開発を始めましょう。
シンプルなテンプレートもありますが、mysqlなど使用するものが決まっていれば、最初から全部入ったものを入れておく方がいいと思います。

stack templates
stack new <project_name> [template_name]
cd <project_name>

Hello, world

プロジェクトを作成したら、プロジェクトディレクトリ直下で、以下を実施しましょう。

# stackを初回実行する場合。結構時間がかかります
stack setup

# ビルド 
stack build --pedantic --haddock --test --exec "echo Yay, it succeeded"
# 実行
stack exec <project_name>-exe

ghci の注意点

とりあえず動きをみたいときにやってしまう、

ghci src.hs

ですが、stackベースのghciでは動かないことも。
その場合は、プロジェクト内で ghci しましょう。
プロジェクト.cabalで設定したライブラリが読み込まれます。

イテレーション

ファイル更新を検知して自動コンパイルももちろんできます。
このコマンドをバックグラウンドで実行しておきます。

stack build --haddock --test --exec "echo Yay, it succeeded" --file-watch
  • –pedantic オプションは、warning一つでもコンパイルできないので、開発中は停止しておいた方がいいです。

自作ライブラリを取り込む

Stackageにないライブラリを使いたい場合は、以下の設定をします。
自作のプロジェクトをライブラリとして使いたい場合などで使えます。

ローカルにあるライブラリ

stack.yaml の packages に設置したライブラリのパスを指定します。

packages:
- '.'
- '/path/to/package' 

Hackageにあるライブラリ

hackageの他のライブラリと同じです。
project.cabalのdependencyに追加します。

dependency:

(参考)

http://docs.haskellstack.org/en/stable/faq/

  • I need to use a different version of a package than what is provided by the LTS Haskell snapshot I’m using, what should I do?
    => LTSに乗ってないバージョンのパッケージを使う方法。
  • I need to use a package (or version of a package) that is not available on hackage, what should I do?
    => Hackageに乗ってないバージョン、パッケージを使う方法。

登録する

オープンソースプロジェクトならば、Hackage、Stackageに登録するのがオススメです。
githubで公開しておけば、だれでもダウンロードして使えますが、Hackage、Stackageにある方が断然使いやすいです。

Hackage

現在は、Webからアカウント登録/アップロードできます。

アカウント登録

以下のフォームから登録

http://hackage.haskell.org/users/register-request

アップロード

  • stack コマンドの場合
cd /path/to/project
stack upload .

Stackage

Hackageに登録したら、Stackageにも登録しましょう。
Stackageのコンセプトはコンパイルが通るライブラリということ。

GitHubのstackageリポジトリにプルリクをすると、TravisCIが走ります。
checkが通れば、mergeしてもらえます。

もし、errorになっても、Stackageのコントリビュータの方にアドバイスがもらえます。

その後は、Stackageのnightlyに!

  1. まずは、プロジェクト内でチェックコマンドを実行
cd /path/to/project
stack --resolver nightly exec stackage-curator check
stack --resolver nightly build
  1. 問題なければ、Stackageリポジトリをフォーク
    https://github.com/fpco/stackage
  2. パッケージ情報を追加してコミット、プルリク
    https://github.com/fpco/stackage/blob/master/build-constraints.yaml
"My Name myemail@example.com @mygithubuser":
    - package1
    - package2
    - package3
  • コミットメッセージ “add package name” にしてほしいということです。

(参考)
https://github.com/fpco/stackage/blob/master/MAINTAINERS.md