dari88's diary

これから趣味にするプログラミング/PHP/javascript/kohana/CMS/web design/

PHPでRSSフィードのXMLを処理する時のSimpleXMLの使い方

PHPのSimpleXMLでちょっと難儀したのでメモです。

次のコードはRSSフィードからタイトル、リンク、記事を抜き出して表示するものです。

 1 <?php
 2 $url = "http://foo.bar.com/feed.php";
 3 $contents = preg_replace('/xml:/', 'xml_', file_get_contents($url)); # Point-1
 4 $xml = simplexml_load_string($contents, 'SimpleXMLElement', LIBXML_NOCDATA); # Point-2
 5 $entrys = $xml->entry;
 6 foreach ($entrys as $entry) {
 7     $title = (string) $entry->title; # Point-3
 8     $href = (string) $entry->content->attributes()->xml_base; # Point-4
 9     $content = (string) $entry->content;
10     echo "<h3><a href='{$href}' target='_blank'>{$title}</a></h3>";
11     echo "<p>{$content}</p>";
12 }
13 ?>

 Point 1:

XML名前空間を使っている部分は単純にパースしてくれないので、事前に変換してしまいます。

 

Point 2:

CDATA要素をパースするにはこのおまじないが必要です。

 

Point 3:

オブジェクトになっている文字列は(string)でキャストします。

 

Point 4:

タグの属性データを取得するにはattributes()を使います。

 

予備知識ゼロでネットを頼りにXMLの処理に取り組むと意外に手間取りました。

 

 

CPU Mining用のVert-Minerの64bit版をコンパイルする方法

 Scrypt-Progressive-N algorithmを使用している仮想通貨(crypto coin)をマイニングするためにVert-Minerなるものが必要です。win32bit版のCPU minerはこちらから入手できます。高速化を狙って64bit版をコンパイルします。結論として、倍速になりました。

 

MinGW-w64/MSYSを構築する

・msysは下記からゲットします。

  http://sourceforge.net/projects/mingwbuilds/files/external-binary-packages/

MinGW-w64は下記を使用します。

  http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/4.8.2/threads-posix/seh/x86_64-4.8.2-release-posix-seh-rt_v3-rev3.7z/download

・構築については最近の日記に書いているので省略します。

 

最初にcURLコンパイルする

cURLのサイトからソースをゲットします。今回はcurl-7.35.0.zipを使用しました。

・ソースをホームの下に配置してコンパイルします。

cd curl-7.35.0
configure --host=x86_64-w64-mingw32 --disable-shared --with-winssl --enable-ipv6 --prefix=/home/curl64
make
make install

 

Vert-Minerをコンパイルする

ここからソースをゲットして、ホームの下に配置します。

・/home/curl64/share/aclocal/libcurl.m4 を /usr/share/aclocal にコピーします。

・/home/curl64/bin/curl-config を ~/cpuminer-vert-master にコピーします。

コンパイルします。

cd cpuminer-vert-master
sh autogen.sh
CFLAGS="-DPTW32_STATIC_LIB -static" configure --host=x86_64-w64-mingw32
make

・~/cpuminer-vert-maste/minerd.exe が完成品です。

 

 

rubyinstallerを使って完璧なRuby-2.1.0/2.1.1をコンパイル/ビルドする方法

 前の日記までの方法では限界があるのでRubyコンパイルする正解を探していたら、ついに発見しました。

 

oneclick rubyinstallerを使う

oneclick rubyinstaller のページからrubyinstallerをゲットします。

・解凍したら c:\rubyinstaller などに配置します。READMEを読みましょう。

UTF-8日本語を正常に扱うために、コンパイラはmingw64-32-4.7.2を使ってDevKitを構成することにします。

・既存のRubyにパスの通ったコマンドプロンプトを起動して先ずはDevKitを作ります。

cd c:\rubyinstaller
rake devkit DKVER=mingw64-32-4.7.2

・クロスコンパイル指定でconfigureしないとこけるので、config\ruby_installer.rbの130行目付近に下記を追加します。

        '--build=x86_64-w64-mingw32',
        '--host=i686-w64-mingw32',

Rubyの出力先を変更したい場合は、125行目付近の :install_target を変更します。

      :install_target => 'sandbox/Ruby210w',

コマンドプロンプトで作業すると見通しが悪いので、minttyを準備します。

・C:\rubyinstaller\sandbox\devkitにmsys.batがあるので、ショートカットを作ります。

・プロパティのリンク先に -mintty を追加します。ショートカットからminttyを起動して透過率・文字サイズ・画面サイズを設定します。

・再度minttyを起動して以下の手順でコンパイルします。

cd /c/rubyinstaller
PATH=/c/Ruby200/bin:$PATH
rake ruby21

Ruby-2.1.1をコンパイルする場合は、ソースをc:\ruby211cに置いたとして、次のような手順になります。

cd /c/rubyinstaller
PATH=/c/Ruby200/bin:$PATH
rake ruby21 LOCAL="c:\ruby211c" 

 

rubyinstallerについて

・config\ruby_installer.rbを見ると、拡張ライブラリは
   ffi, :gdbm, :iconv, :openssl, :yaml, :zlib, :tcl, :tk
 を使っています。

・また、通常のコンパルのあとで readline だけ特別に処理をしています。

・それぞれの外部ライブラリは以下から持ってきています。(config\dependencies.rb参照)(ライブラリはC:\rubyinstaller\sandboxにあります)

    :url => "http://packages.openknapsack.org/zlib",
      'zlib-1.2.7-x86-windows.tar.lzma'
    :url => "http://packages.openknapsack.org/openssl",
      'openssl-1.0.0l-x86-windows.tar.lzma'
    :url => "http://packages.openknapsack.org/libffi",
      'libffi-3.0.11-x86-windows.tar.lzma'
    :url => "http://packages.openknapsack.org/libyaml",
      'libyaml-0.1.5-x86-windows.tar.lzma'
    :url => "http://packages.openknapsack.org/libiconv",
      'libiconv-1.14-x86-windows.tar.lzma'
    :url => "http://packages.openknapsack.org/gdbm",
      "gdbm-1.8.3-x86-windows.tar.lzma"
    :url => "http://packages.openknapsack.org/pdcurses",
      "pdcurses-3.4-x86-windows.tar.lzma"
    :url => "http://packages.openknapsack.org/tcl",
      "tcl-8.5.12-x86-windows.tar.lzma"
    :url => "http://packages.openknapsack.org/tk",
      "tk-8.5.12-x86-windows.tar.lzma"
    :url => 'https://github.com/luislavena/rb-readline/archive',
    :target => 'sandbox/rb-readline',
      'v0.5.0.zip'

・通常のコンパイルの後で、各ライブラリのbinの中身をRuby210w/binにコピーしています。

・次に、rubyのソースファイルのbinの中身をRuby210w/binにコピーしています。

・次に、readlineの処理をしています。

・Historyを読むと、readlineRuby-2.0対応になっているようです。

 

ビルドの検証

UTF-8日本語の扱いは正常です。

railsのインストールは正常です。

rails new myapp で bundle のインストールも正常です。

・C:\Ruby210w\lib\ruby\gems\2.1.0\gems\sqlite3-1.3.9-x86-mingw32\lib\sqlite3\2.1に作成済みのsqlite3_native.soを入れてやります。

・Gemfileを書きなおしてbundle updateも正常です。

・scaffoldも正常に働きます。

・rake db:migrateも正常です。

rails sも正常、ユーザー登録も正常にできます。

・残念ながら'DL is deprecated, please use Fiddle'問題は解決していないので、Herokuにログインできません! herokuがdlを使っているのが問題なのだと思われます。

・総合的にはRubyInstallerのRuby-2.0.0並みの出来栄えだと思われます。

 

Windows7 64bit環境でi686-w64-mingw32を使ってRuby2.1.0をコンパイルする方法

 ※後日rubyinstallerを使ってコンパイルする方法を発見したので、この日記を全面的に書き換えます。(14/03/08)

 目標はUTF-8日本語の扱いが正常なRuby2.1.0をビルドすることです。

 64bit環境で正常なRubyを作るのに非常に苦労しました。狭き道です。

 

正しいコンパイラを使う

UTF-8日本語が正常なのは今のところrubenvb版のmingw-w64だけなので、これを使います。

mingw-w64 projectとは何か?

The mingw-w64 project is a complete runtime environment for gcc
to support binaries native to Windows 64-bit and 32-bit
operating systems.

・RubyInstallerがrubenv版のgcc-4.7.2を使っているので、これに習うことにします。

・するとこのページから正しいものを選ぶことになります。

・ファイル名規則はこうなっています

Packages are named as follows:
   [Target]-gcc-[Version]-release-[OS]-rubenvb.*
   [Target]-clang-[Version]-release-[OS]-rubenvb.*
Target: GCC triplet for the system this toolchain builds code for:
   x86_64-w64-mingw32: 64-bit Windows
   i686-w64-mingw32: 32-bit Windows 
Version: GCC version
OS: OS the toolchain is built for:
   linux64: 64-bit linux
   win64: 64-bit Windows
   win32: 32-bit Windows (also work on 64-bit Windows)
   cygwin: Cygwin (www.cygwin.com)
 

 ・普通に読むと次の名称のものが候補になります。
  i686-w64-mingw32-gcc-4.7.2-release-win32-rubenvb.*
  i686-w64-mingw32-gcc-4.7.2-release-win64-rubenvb.*

・release-win64を使うと、make中にmkmf.rbが
  The compiler failed to generate an executable file.
 というエラーを出すので、今のところ使えません。

 

MSYSはどこに配置すべきか?

・コンパラをいろいろ試しているとMSYSのアイコンがどんどん増えて大変です。

コンパイラの数だけMSYSを用意するのはHDD容量的に無駄です。

・MSYSはc:\の直下に配置するのが正解だと思います。

コンパイラはその下にmingwという名前で配置します。又は、fstabファイルを使ってコンパイラのフォルダをmingwにマウントします。

コンパイラを入れ替えてもMSYSをいじる必要はないことになります。アイコンも一つでOKです。

・因みに、etc/fstabファイルは現在こんな具合になっています。いろいろ試してみた結果です。

#Win_Path                      Mount_Point
C:\msys\i686-w64-mingw32-4.7.2-win32_rubenvb      /mingw
#C:\msys\i686-w64-mingw32-4.7.2-win64_rubenvb      /mingw
#MinGW/MSYS版
#C:\msys\mingw32-gcc-4.8.1      /mingw
#MinGWi686-w64
#C:\msys\i686-4.8.2-win32-dwarf-v3-2      /mingw
#TDM版32bit
#C:\msys\TDM-GCC-32      /mingw
#TDM版64bit
#C:\msys\TDM-GCC-64     /mingw

 

どのMSYSを使うか

・これでいいんじゃないでしょうか。
  msys+7za+wget+svn+git+mercurial+cvs-rev13.7z

このページmingw-w64プロジェクトのMSYSがあるのですが、make cleanでパラメータエラーを出すので採用していません。

 

拡張用ライブラリはどこに配置するか?

・LIBRARY_PATH、BINARY_PATH、INCLUDE_PATHといった環境変数を設定すればどこでも良さそうなものですが、コンパイル中に走っているRubyとの関係もあり、場所が限定されます。結論としてrubyのソースの直下に入れます。

 

適切な拡張用ライブラリを準備する

・RubyInstallerが使用しているライブラリを使います。

    :url => "http://packages.openknapsack.org/zlib",
'zlib-1.2.7-x86-windows.tar.lzma'
:url => "http://packages.openknapsack.org/openssl",
'openssl-1.0.0l-x86-windows.tar.lzma'
:url => "http://packages.openknapsack.org/libffi",
'libffi-3.0.11-x86-windows.tar.lzma'
:url => "http://packages.openknapsack.org/libyaml",
'libyaml-0.1.5-x86-windows.tar.lzma'
:url => "http://packages.openknapsack.org/libiconv",
'libiconv-1.14-x86-windows.tar.lzma'
:url => "http://packages.openknapsack.org/gdbm",
"gdbm-1.8.3-x86-windows.tar.lzma"
:url => "http://packages.openknapsack.org/pdcurses",
"pdcurses-3.4-x86-windows.tar.lzma"
:url => "http://packages.openknapsack.org/tcl",
"tcl-8.5.12-x86-windows.tar.lzma"
:url => "http://packages.openknapsack.org/tk",
"tk-8.5.12-x86-windows.tar.lzma"
:url => 'https://github.com/luislavena/rb-readline/archive',
:target => 'sandbox/rb-readline',
'v0.5.0.zip'

・上記のうちreadlineRuby専用の特殊なものです。readline抜きでビルドした後で使います。

 

コンパイル

・Ruby2.1.0のソース、拡張用ライブラリを配置します。

・以下の手順でビルドできます。

PATH=/c/Ruby200/bin:$PATH
export LIBRARY_PATH BINARY_PATH
LIBRARY_PATH=/home/ユーザ名/ruby210c/lib
BINARY_PATH=/home/ユーザ名/ruby210c/bin

cd ruby210c
configure --enable-shared --prefix=/Ruby210d6432 --disable-install-rdoc --build=x86_64-w64-mingw32 --host=i686-w64-mingw32
make
make install

・ビルド完了後、ruby210c/binの下にあるファイルを全てRuby210d6432/binの下にコピーします。

 

readlineのインストール

・解凍したrb-readline-0.5.0フォルダをホームの下に配置します。

・ビルド済のRuby210d6432にパスを通して使い方を確認します。

PATH=/c/Ruby210d6432/bin:$PATH
cd rb-readline-0.5.0
ruby setup.rb --help

・次のコマンドでインストールできます。

ruby setup.rb all

 

結果の検証

UTF-8日本語の扱いは正常です。

・前の日記に書いた方法でRuby-2.1用のsqlite3を準備すれば、railsをインストールしてDBを使うアプリの作成まで正常に動作します。

・rubyinstallerでビルドしたものと同等と思われます。

 

RubyInstallerのRuby DevKitを使ってRuby2.1.0をコンパイルする方法

 DevKitはRubyコンパイルにも使えます! DevKitの64-32版を使うのがベストです。

 

Ruby DevKit(32bit版)を使う方法

・環境: Windows7 32bit または 64bit

RubyInstallerが配布しているDevKitMingw/MSYSそのものです。

・まずはDevKit-tdm-32-4.5.2-20111229-1559-sfx.exe 使います。

・32bit版はTDM版のMinGWを使っている模様です。コンパイラはmingw32のgcc version 4.5.2 (tdm-1)です。ちょっと古いですね。

・c:\DevKit\msys.batのリンクを作り、プロパティのリンク先に -mintty を追加します。ついでに名前とアイコンも変えておきましょう。

c:\DevKit\msys.bat -mintty

・fstabファイルとかいじる必要はありません。

・入手してある拡張ライブラリのbin\,lib\,include\フォルダをc:\DevKit\mingw\にコピーします。

・minttyが起動したら透過率、文字サイズ、ウインドウサイズを変更しておきましょう。

・Ruby2.1.0のソースをc:\DevKit\home\ユーザー名 の下にコピーします。

・後の手順は前の日記のMinGW/MSYSと同じでOKです。もしかしたらbuildとかhostの指定は不要かもしれませんが、試していません。

・TDM版のMinGWによるビルドは外部のdllを要求しません。

・このビルドはUTF-8の日本語の扱いに問題があります!

・DevKitにパスを設定して、Railsのインストールまで問題なく行えます。

set Path=%Path%;C:\DevKit\mingw\bin;C:\DevKit\bin 

 ・パスの順番は重要です。DevKitにもいろいろ入っているので配慮が必要です! 間違えるとRubyの気が狂う可能性があります。

 

 Ruby DevKit(64→32bit版)を使う方法

・環境: WIndows7 32bit
・64bit環境ではopensslがうまく機能しません。また、VM上の32bit環境でもopensslに問題が残ります。

・今度はDevKit-mingw64-32-4.7.2-20130224-1151-sfx.exeを使います。

・このコンパイラi686-w64-mingw32でgcc version 4.7.2 (rubenvb-4.7.2-release)となっています。

・特にコンパイルオプションを気にしなくても32bitバイナリにコンパイルしてくれます!

・拡張用ライブラリはRubyのソースディレクトリ下に入れます。あとでlibとbinの環境変数の設定をします。

・旧版のopensslはインストールしてくれません!

OpennSSLから最新版を持ってきて、DevKitでコンパイルしたものを使います。

cd openssl
configure mingw64 no-asm shared --prefix=/home/openssl
make depend
make
make install

・あとは以下の手順でコンパイルできます。

PATH=/c/Ruby200/bin:$PATH
export LIBRARY_PATH BINARY_PATH
LIBRARY_PATH=/home/ユーザ名/ruby210c/lib
BINARY_PATH=/home/ユーザ名/ruby210c/bin

cd ruby210c
configure --enable-shared --prefix=/Ruby210d6432 --disable-install-rdoc --build=x86_64-w64-mingw32 --host=i686-w64-mingw32
make
make install
 

・最初に環境変数の設定をしています。

・configureではRdocをインストールしないように指示しています。

・このビルドは外部のdllを要求しません。

・このビルドはUTF-8の日本語表示が正常です!

・この方法が最も簡単に正常なRubyコンパイルする方法だと思います。

 

686-w64-mingw32
i686-w64-mingw32
i686-w64-mingw32
i686-w64-mingw32

Windows7 64bit環境でMinGW/MSYSを使ってRuby2.1.0をコンパイルする方法

 64bit環境でMinGW/MSYSでRuby2.1.0をコンパイルするにはちょっとした工夫が必要です。コンパイル中に作成されて動作するminiruby.exeがこけるのが問題です。

 

MinGW/MSYS(32bit版)

MinGW/MSYSのインストール、拡張ライブラリの準備等は前の日記を参照して下さい。

・configureスクリプトにクロスコンパイルであると認識させることがポイントです。コンパイラそのものがクロスコンパイルの機能を持っているわけではないのですけど・・・。

・configureスクリプトはクロスコンパイルの場合に旧版のRubyを要求するので、環境変数をセットします。

PATH=/c/Ruby200/bin:$PATH

・あとは以下の手順でOKです。

cd ruby210c
configure --enable-shared --prefix=/Ruby210 --build=x86_64-w64-mingw32 --host=i686-pc-mingw32
#==> checking whether the C compiler works... yes
make
make install main

・これでconfigureスクリプトは64bit環境で32bitバイナリを作ると認識し、コンパイル中に出来るminiruby.exeを使わずに、環境変数で指定した旧版のRubyを使って拡張ライブラリのコンパイルを行うようにMakefileを作ります。

・このビルドは libgcc_s_dw2-1.dll を必要とするので、MinGW\bin\ から Ruby210\bin\にコピーしておきます!

・このビルドはUTF-8の日本語処理に問題が見られます!

MinGW/MSYSにパスを設定して、Railsのインストールまで問題なく行えます。

gem update --system
gem update rake
SET Path=%Path%;C:\MinGW\bin;C:\MinGW\msys\1.0\bin
gem install rails --no-ri --no-rdoc

Railsを使う場合のsqlite3の問題については前の日記を参照してください。

 

MinGW/MSYSでRuby2.1.0をコンパイルしてRails4.0をインストールまで

 大きなプログラムのコンパイルのお勉強ということで、RubyInstallerがまだ配布していないRuby2.1.0をビルドしてみました。全てGoogle先生に聞きながらやっていて泥沼にずっぽしハマりましたので、メモしておきます。

 

はじめに

・環境はWindows7 64bit、VM上にXPの32bit版を入れてます。

Rubyコンパイルすることの概念を知る上で良かったのは、たむらけんいちさんのこの記事でした。

・RubyInstallerはMinGWコンパイルしているし、DevKitもMinGWだし、合わせておいた方が良いような感じがします。

・RubyinstallerのDevKitというのは殆どMinGWそのものですね。インストールするとコンパイラ用の環境変数とか自動的に設定されるようになるようです。その他にどんな機能があるのかはまだ分かりません。

・Ruby2.0用のDevKitは今回ビルドしたRuby2.1.0を認識してくれません。騙してインストールしても、機能しませんでした。Railsをインストールするには奥の手が必要です。

・configure時には--prefix=/Ruby210みたいに出力先を絶対パスで指定した方が吉です。

・64bit環境でRuby2.1.0をMinGWコンパイルするとio.cでエラーが発生します。しかたがないのでVM上のXP32bitでコンパイルしました。ちなみにMinGWの64bit版でもio.cで引っかかります。訳が分かりません!

CygWinは便利な感じですが、64bit環境で問題なくコンパイルできるものの、今の所使い物になりません。gemが動かない! これはgemに対応するgem.batを作ってくれないのが原因です。それが何故かは今の所謎です。

・Ruby2.1.0のソースはこちらからダウンロードします。

 

MinGW/MSYS

・32bit環境でないとRuby2.1.0はコンパイルできません!

・最新版はここからダウンロードします。しかし、MSYSを起動するアイコンを作ってくれないので初めての人は訳が分からないと思います。

・旧版はここからダウンロードします。インストールする時に、ライブラリをアップデートするように選択(ボタンをクリック)します。

・インストール先はデフォルトが吉です。

MinGWとMSYSの構成とか、MSYSの設定に関してはこの記事を読むと役に立ちます。ネットでは環境変数をあれこれ設定するような話が出てきますが、ウソです。シンプルな方が安心だし、この記事の通りで正しくコンパイルできます。

・追加のライブラリが必要です。

  http://gnuwin32.sourceforge.net/packages.html
   openssl の Binariesと Developer files
   readline の Binariesと Developer files
   zlib の Binariesと Developer files(もしかすると不要、試していません)

  http://jarp.does.notwork.org/win32/
   gdbm-1.8.3-1-mingw32.zip
   pdcurses-2.60-1-mingw32.zip

・これらを解凍して、bin\,lib\,include\をc:\MinGW\にコピペします。

・MSYSを一度起動するとユーザーのホームディレクトリが作成されるので、Rubyのソースをコピーしておきます。

・あとはGoogle先生が教えてくれるようにコンパイルします。

$ ./configure --enable-shared --prefix=/Ruby210 > log_conf.txt
$ make > log_make.txt
$ make install > log_inst.txt

・/Ruby210でc:\Ruby210に出力されます。

 

Rails4.0のインストール

・基本的な流れは前回の日記を見てください。

・旧版のRubyからsetrbvaes.batをコピーしてきて、Ruby2.1用のコマンドプロンプトを作ります。

・上記までのままですと、gemのシステムのアップデートとrakeのアップデートは通りますが、JSONのインストールができません。

・RailsInstallerのRuby2.0用のDevKitはこのビルドを認識してくれません。

・対策として導入済みのMinGWを利用します。一時的な環境変数のPATHの先頭にC:\MinGW\binとC:\MinGW\msys\1.0\binを追加します。setrbvars.batのPATHの設定部分に追加すると良いでしょう。

SET PATH=%RUBY_BIN%;%PATH%;C:\MinGW\bin;C:\MinGW\msys\1.0\bin

・以上でJSONのインストールからRails4.0のインストールまで進めます。さらにrails newでmyappを作ってbundle installも完了します。

・ここでrails sでWEBrickサーバーを起動すると、sqlite3が見つからないと言われてコケます!

Google先生に聞いてみると、Ruby2.1用のsqlite3のgemがサイト側で準備されていないのが原因らしい。対策はこの覚書に書いてありました。

・sqlite3のソースを入手してコンパイルなど準備をし、sqlite3のgemをuninstallしてから指示通りにインストールしたら動きました。

> gcc -O3 sqlite3.c -c
> ar rv libsqlite3.a sqlite3.o
> gem uninstall sqlite3 -a
> gem install sqlite3 --version=1.3.8 --platform=ruby -- 
        --with-sqlite3-include=C:\Ruby210\sqlite3080300 
        --with-sqlite3-lib=C:\Ruby210\sqlite3080300

・scaffoldでユーザーページを作って、db:migrateも完了。ユーザーページにアクセスしてユーザー登録も出来ました。

・しかし、bundle updateを行うとInstalling sqlite3 1.3.8となって、動かなくなります!

・対策:
 C:\Ruby210\lib\ruby\gems\2.1.0\gems\sqlite3-1.3.8-x86-mingw32\lib\sqlite3\2.1\
 フォルダーを作り、ここに
 C:\Ruby210\lib\ruby\gems\2.1.0\gems\sqlite3-1.3.8\lib\sqlite3\sqlite3_native.so
 をコピーします。

・これでbundle updateしてもOKです。

・ここまで動いているとなれば、今回のビルドはまず成功と言って良いのかと思われます。