SpiderMonkey試してみた
JavaScriptの勉強し始めたのですが、基本的な構文試すのにconsole.logに出力して確認するのが面倒だったのでSpiderMonkey使ってみました。
ターミナルの中だけで完結できると楽ですよね。
お使いのパッケージマネージャーに多分入っていると思うので、各自サーチアンドインストールしてみてください。
//perfume.js var perfume = ["かしゆか", "のっち", "あーちゃん"]; var value; for (var i = 0; i < 3; i++) { value = perfume[i]; print (value + "です"); } print (perfume.length + "人合わせてPerfumeです!" );
js -f perfume.js
こんな感じでオプションを追加するとファイルに記載されたJavaScriptを実行することが可能です。
printだと改行してくれて、putstrだと改行なしです。
詳しくはマニュアルのBuilt-in functionsを参照してみてください。
https://developer.mozilla.org/en-US/docs/SpiderMonkey/Introduction_to_the_JavaScript_shell
Sinatraの始め方
Ruby初心者がSinatraを使い始めてみたのでお勧めの本などを紹介します。
公式サイト
http://www.sinatrarb.com/
とりあえず公式サイトを見ながら、Hello World!をやってみて「おお、なんか簡単そう!」と感じたものの、なにか処理するには最低限Ruby書けないとやっぱりダメだなあと思い、一旦Sinatraから離れてRubyの初心者本を読み始めました。
『作りながら学ぶRuby入門』、本当にオススメです!
蔵書管理プログラムを作るために適宜それに必要な知識を順を追って少しずつ紹介してくれてくれるので挫折しにくいかと。
この本は言語関係なくプログラム初心者にもおすすめしたいです。
なんせプログラミング苦手な自分にでも理解しやすかったもので(;´Д`)
それとドットインストールのRuby入門とSinatra入門も必見ですね。
http://dotinstall.com/
Webでちまちま情報集めるのダルかったので以下の2冊を購入。
個人的にはPackt PublishingのInstant Sinatra Starterの方がハンズオン形式で環境構築からHerokuへのデプロイまでシンプルに書かれていてわかりやすかったです。なのでこちらの本を先に読んだほうがいいと思います。
Oreilly.comでPackt Publishingの電子書籍も扱い始めて半額セールやっていたので、ついでにCloning Internet Applications with Rubyも購入してみました。
こちらはSinatraを利用して、TinyURL/Twitter/Flickr/Facebookのクローンサービスを作ってみようという内容です。
まだ読み始めたところですが、こちらもハンズオン形式なのでわかりやすいです。
Sinatraとはちょっと話しズレますがHeroku便利ですねぇ。
ちなみにDigitalOceanと言うVPSでArchLinux使っているのですが、アップデートしたらPassengerが動かなくなって、しょうがなく自分でコンパイルしようとしたら512MBのメモリーじゃ足りないよってエラーが出てマジ勘弁して〜(;´Д`)ってなりました。
書籍代はかかりましたが、これらの知識で作ったサイトのアサマシで一ヶ月もせずに回収できたのでいい投資だったと思います。クソサイトなのでここでは紹介はしません・・。
OpenShift OnlineでMojolicious::Liteを動かしてみたい!
OpenShift Online
http://www.openshift.com/
OpenShift Onlineは、RedHatが提供するPaaSで、Java,PHP,Python,Ruby,Perl,Node.jsなどのプログラミング言語とMySQL,PostgreSQL,MongoDBのデータベースを利用できます。
https://www.openshift.com/products/pricing
Gearと言う名称がインスタンスの単位で、Free Planを選択すると3 Small Gearsまで無料で使えます。
もちろんFree Planはノーサポートですが、無料で使えるのですしマジリスペクトですよね!
ちなみに、1 Small Gearの中身はMemory 512MB、Storage 1GBになっています。
Gearの構築
今回はPerlで環境構築してみたいと思いまーす。
会員登録して、Create Applicationをクリック。
上記に記載したプログラミング環境などのミドルウェアはCartridgeと言う名前で提供されています。
Perl 5.10を選択します。
あとはPublic URLを入力すれば環境が完成です。簡単!
URLはこんな感じになります。
http://ApplicationName–YourID.rhcloud.com
ローカル環境の構築
gem install rhc
管理ツールをgemからインストールします。
rhc setup
インストールが完了したら、続いてセットアップです。
OpenShift Client Tools (RHC) Setup Wizard
This wizard will help you upload your SSH keys, set your application namespace, and check that other programs like Git are properly installed.
Login to openshift.redhat.com:
Password: ********OpenShift can create and store a token on disk which allows to you to access the server without using your password. The key is stored in your home directory and should
be kept secret. You can delete the key at any time by running 'rhc logout'.
Generate a token now? (yes|no) yes
Generating an authorization token for this client ... lasts about 22 hoursSaving configuration to /Users/otaku/.openshift/express.conf ... done
Your public SSH key must be uploaded to the OpenShift server to access code. Upload now? (yes|no) yes
Since you do not have any keys associated with your OpenShift account, your new key will be uploaded as the 'default' key.
Uploading key 'default' ... done
Checking for git ... found git
Checking common problems .. done
Checking your namespace ... sample
Checking for applications ... found 1
first http://momoclo-sample.rhcloud.com/
You are using 1 of 3 total gears
The following gear sizes are available to you: smallYour client tools are now configured.
ウィザードの指示する通りにログインして、トークンを生成して、公開鍵をアップします。
gitや公開鍵などは先に自分で用意しておいてくださいませ。
これでローカルの環境構築は完了です。
rhc Getting started: setup Connects to OpenShift and sets up your keys and domain create-app Create an application apps List all your applications cartridges List available cartridges add-cartridge Add a cartridge to your application server Display information about the status of the OpenShift service. logout End the current session Working with apps: tail Tail the logs of an application port-forward Forward remote ports to the workstation threaddump Trigger a thread dump for JBoss and Ruby apps snapshot Save the current state of your application locally git-clone Clone and configure an application's repository locally Management commands: account Display details about your OpenShift account alias Add or remove a custom domain name for an app app Commands for creating and managing applications authorization Show the authorization tokens for your account cartridge Manage your application cartridges domain Add or rename the container for your apps sshkey Add and remove keys for Git and SSH
rhcの管理ツール、とても便利ですね。
git clone ssh://foobar@momoclo-sample.rhcloud.com/~/git/momoclo.git/
cd momoclo/
gitでひな形を取得します。
perl/ For not-externally exposed perl code
libs/ Additional libraries
misc/ For not-externally exposed perl code
.openshift/ Location for OpenShift specific files
action_hooks/ See the Action Hooks documentation [1]
markers/ See the Markers section [2]
ディレクトリ構造はこんな感じです。
perl/index.pl
このファイルをいじればいいみたいです。
#!/usr/bin/env perl use strict; use warnings; use Mojolicious::Lite; # Route with placeholder get '/' => sub { my $self = shift; $self->render(text => "Yes! Yes! We are the ももいろクローバー れに かなこ しおり あやか ももか"); }; # Start the Mojolicious command system app->start;
Mojolicious::Liteのサンプルまんまを動かしてみます。
ローカル環境で表示できることを確認したら、OpenShift Onlineにデプロイしてみましょう。
git add .
git commit -m 'Initial Commit'
git pushCounting objects: 7, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 570 bytes, done.
Total 4 (delta 2), reused 0 (delta 0)
remote: Waiting for stop to finish
remote: --> Working on Mojolicious::Lite
remote: Fetching http://mirror1.ops.rhcloud.com/mirror/perl/CPAN/authors/id/S/SR/SRI/Mojolicious-4.16.tar.gz ... OK
remote: Configuring Mojolicious-4.16 ... OK
remote: Building Mojolicious-4.16 ... OK
remote: Successfully installed Mojolicious-4.16
remote: 1 distribution installed
remote: skipping R/RJ/RJBS/perl-5.18.0.tar.gz
remote: skipping R/RJ/RJBS/perl-5.18.0.tar.gz
master -> master
これで動くはずだったんだけど、Internal Server Error〜(;´Д`)
rhc tail momoclo
管理ツールからログを確認してみると、[error] Can't locate Time/HiRes.pm in @INCと表示されていました。
モジュールが入ってないよってことなんだろうけど、どこからインストールするのが正しいのかよくわからなかったけど、
use Time::HiRes;
単純にソースにモジュールの記述追加して、デプロイしたらモジュールをインストールしてくれるみたいです。
サーバー設定する手間考えたらすごいお手軽だし、ちょっとしたデモプログラムをネット経由で人に見せるためとかに最適ですね!
Herokuでも頑張って設定すればPerl動くみたいですけど、デフォルトで対応してくれているOpenShift Online、なかなかいいのではないでしょうか。まぁ、Herokuのように色んなアドオン使えるようにならないとしんどいですが。
Mac上でのPerl環境
殴り書きメモっす。
Perlbrewを利用。
インストールする。
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed## Download the latest perlbrew
## Installing perlbrew
perlbrew is installed: ~/perl5/perlbrew/bin/perlbrewperlbrew root (~/perl5/perlbrew) is initialized.
Append the following piece of code to the end of your ~/.zshenv and start a
new shell, perlbrew should be up and fully functional from there:source ~/perl5/perlbrew/etc/bashrc
Simply run `perlbrew` for usage details.
Happy brewing!
## Installing patchperl
インストール完了。
使っているシェルにパスを追加しておく。
perlbrew available
perl-5.19.0
perl-5.18.0
perl-5.16.3
perl-5.14.4
perl-5.12.5
perl-5.10.1
perl-5.8.9
perl-5.6.2
perl5.005_04
perl5.004_05
perl5.003_07
利用可能なバージョンを表示。
perlbrew install perl-5.19.0
好きなバージョンのPerlをインストールする。
必要なコンパイルオプションあったら、その都度調べれば十分。
perlbrew switch perl-5.19.0
インストールしたバージョンに切り替える。
perlbrew install-cpanm
cpanmもインストールしておく。
find `perl -e 'print "@INC"'` -name '*.pm' -print
モジュールの位置を確認。
基本、Perlbrewのcpanm、この下にモジュールを追加するっぽい。
perlbrew lib create momoclo
みたいな感じで、モジュール環境分離できるみたい。
/.perlbrew/libs/perl-5.19.0@momoclo/lib/perl5/
モジュールがインストールされるパスはこんな感じ。
Google App Engine for PHP試してみたぉヽ(゚∀゚)ノ
Installing Python 2.7
何もいじってなければそのままで問題ないかと。
PHP
MacPortsを使えとのことですが、メインで使っているのがHomebrewなのでこっちで動かします。
brew tap homebrew/dupes
brew tap josegonzalez/homebrew-php
brew install php54 --with-cgi --with-debug --with-homebrew-openssl
brew install php54-apc php54-intl php54-oauth
チュートリアルに載っているけどHomebrewで見つからないパッケージに関しては今回無視します。
PHPのMac上での環境構築、よくわかってないんです・・(;´Д`)
export PATH="$(brew --prefix josegonzalez/php/php54)/bin:$PATH"
インストールができたら上記のコマンドを叩くか、お使いのシェルにパスを追加します。
こんな感じになればOKです。
SDK
%curl -O http://commondatastorage.googleapis.com/appengine-php/appengine-php-sdk-1.8.0.zip
%unzip appengine-php-sdk-1.8.0.zip
単純にダウンロードして展開するだけです。
Hello, World!
https://developers.google.com/appengine/docs/php/gettingstarted/helloworld
%tree helloworld/
helloworld/
├── app.yaml
└── helloworld.php
上記のような感じでファイルを配置します。
helloworld.php
<?php echo 'Hello, World!';
app.yaml
application: helloworld version: 1 runtime: php api_version: 1 handlers: - url: /.* script: helloworld.php
コピペします。
google_appengine/dev_appserver.py --php_executable_path=/usr/local/opt/php54/bin/php helloworld/
早速、動かしてみるぞ!
あれ・・、画面が真っ白・・(´;ω;`)
google_appengine/dev_appserver.py --php_executable_path=/usr/local/opt/php54/bin/php-cgi helloworld/
よく見たら、
おっちょこちょい!
うん、これで動きますね。
https://gaeforphp.appspot.com/
実際にデプロイしてみたかったのですが、現状人数制限しているそうなので、適当なアプリケーション名で新規作成して、上記のURLからとりあえず申請してみました。
しばし待ちましょうぞ。
Debian上でのiptablesの設定方法の続き
Apacheの設定ファイル、多すぎ〜(;´Д`)
Debian(Ubuntuとかも)を使い始めて、面食らうのがApacheの設定ファイルの構成かと思います。
- apache2.conf
- conf.d
- envvars
- httpd.conf
- magic
- mods-available
- mods-enabled
- ports.conf
- sites-available
- sites-enabled
とか分割されすぎ〜(;´Д`)ってなると思います。
慣れると分割されている方が、合理的でわかりやすいなぁとか思うようになったりします。
そもそもavailableとかenabledって何じゃこりゃって感じですよね。
availableの方に設定自体を書き込んで、有効化したいものだけenabledの方にシンボリックリンクします。
設定ファイルと、その設定の有効無効を分離しているのです。
まず、mods-ですが、Debianでは専用のコマンドが用意されています。
a2enmod rewrite
例えば、インストールしただけではApacheのモジュールは有効化されないので、上記のコマンドを打つ必要があります。
a2dismod rewrite
なんかエラーが発生した場合は、上記のように無効化して調べてみたり。
コメントアウトするよりはスマートですよね。
分割されていることによって、エラーの原因も把握しやすいですし。
sites-の方は、バーチャルドメインでたくさんのサイトを管理する際には便利だと思います。
a2ensite www.sample.com
a2dissite www.sample.com
とは言うものの、どのファイルにどの設定したかとかいちいち覚えてはいないので、
などと打ち込むはめにはなります(´Д⊂ヽ
vsftpdの設定方法
vsftpd (Very Secure FTP Daemon) を選択した理由は、まぁなんとなくなのですが、どのディストリビューションにもパッケージあるので汎用性高いし、かなり細かく設定ができるので、使い方を覚えておいて損はないとは思います。
設定項目自体は、ArchLinuxのwikiをおすすめします。
https://wiki.archlinux.org/index.php/Vsftpd
セキュリティーを考慮しつつ必要最低限の設定で動くというのがいい感じです。
man 5 vsftpd.conf
もっと細かい設定項目は、マニュアルに詳しく載っているのでそれを参考にしつつ。
iptables使っている場合に、FTPS接続にする場合は
pasv_enable=YES
pasv_min_port=xxxxx
pasv_max_port=xxxxx
のようにパッシブモードの設定が必要です。
ちょっとハマった点としては、FTPクライアントとしてFileZillaを利用しているのですが、「GnuTLS error -12: A TLS fatal alert has been received.」のようなエラーが出て接続できなかったところです。
ssl_ciphers=HIGH
を追加することによって、正常に接続できるようになりました。
デフォルトがDES-CBC3-SHAなのですが、これがよろしくないようで。
man ciphers
詳しいオプションを知りたい場合は上記のマニュアルを参照してみてください(そこまで調べる人はあんまりいなそうですけど・・)。
追加ですが、AndroidアプリからFTPS接続しようとするとエラーが出るのでマニュアルを確認したところ、require_ssl_reuseがデフォルトのYESだとダメなクライアントがあるから注意って書いてありました。
https://security.appspot.com/vsftpd/vsftpd_conf.html
If set to yes, all SSL data connections are required to exhibit SSL session reuse (which proves that they know the same master secret as the control channel). Although this is a secure default, it may break many FTP clients, so you may want to disable it. For a discussion of the consequences, see http://scarybeastsecurity.blogspot.com/2009/02/vsftpd-210-released.html (Added in v2.1.0).
require_ssl_reuse=NO
と書き込んで解決しました。これはもうNOにするしかしょうがないですよねぇ。
crontabのあんちょこ
minute (0-59),
hour (0-23), day of the month (1-31), month of the year (1-12), day of the week (0-6 with 0=Sunday). commands
自分の場合、/home/mercysluck/syncと言う同期用のディレクトリを作っているので、そこにcrontabheader.txtなんかで保存しておいて、新しい環境に移ったら、sync以下に保存してある設定ファイルをコピペして使ってます。
minute (m), hour (h), day of month (dom), month (mon), day of week (dow)
長ったらしくて一行がいいという人はこれで
m h dom mon dow
さらに短くしたい人は、これでもいいかも。
man 5 crontab
man 8 cron
詳しくは上記マニュアルで。
Debian上のパッケージ管理方法
Debianにインストール済みのパッケージをリスト化して、他のマシンでも同一の構成にしたい場合
dpkgベース
dpkg --get-selections > package.txt
パッケージリストをテキストでエクスポートする。
dpkg --set-selections < package.txt
dselect-upgrade
移行先のマシンでパッケージリストを読み込んで、それらをインストール。
aptitudeベース
今時はこちらのコマンドを使います。
aptitude-create-state-bundle package
環境をエクスポート。
aptitude-create-state-bundle --print-inputs /root/.aptitude /var/lib/aptitude /var/lib/apt /var/cache/apt/pkgcache.bin /var/cache/apt/srcpkgcache.bin /etc/apt /var/lib/dpkg/status
ちなみに、上記のような構成になっています。
aptitude-run-state-bundle package
移行先のマシンにインポート。
Debian上でのiptablesの設定方法
ネットでググると古い記事が多いので、Debian Wikiを参考に簡単な方法を書いてみます。
まず、iptablesとiptables-persistentをインストールします。
iptables-persistentは後で役立ってきます。
iptables -L
早速、現在の設定を見てみると
Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
このように空っぽの状態だと思います。
テスト用に設定ファイルを作ります。
vi /etc/iptables.test.rules
今回は、Debian Wikiに書かれているサンプルを利用してみます。
各自、SSHD_CONFIGのポート番号に書き換えましょう。
*filter # Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0 -A INPUT -i lo -j ACCEPT -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT # Accepts all established inbound connections -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Allows all outbound traffic # You could modify this to only allow certain traffic -A OUTPUT -j ACCEPT # Allows HTTP and HTTPS connections from anywhere (the normal ports for websites) -A INPUT -p tcp --dport 80 -j ACCEPT -A INPUT -p tcp --dport 443 -j ACCEPT # Allows SSH connections for script kiddies # THE -dport NUMBER IS THE SAME ONE YOU SET UP IN THE SSHD_CONFIG FILE -A INPUT -p tcp -m state --state NEW --dport 30000 -j ACCEPT # Now you should read up on iptables rules and consider whether ssh access # for everyone is really desired. Most likely you will only allow access from certain IPs. # Allow ping -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT # log iptables denied calls (access via 'dmesg' command) -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 # Reject all other inbound - default deny unless explicitly allowed policy: -A INPUT -j REJECT -A FORWARD -j REJECT COMMIT
テスト用の設定を適用させてみましよう。
最初との違いがわかると思います。
iptables -L
/etc/network/if-pre-up.d/
/etc/network/if-post-down.d/
上記に設定をして、インターフェイスが立ち上がる前にiptablesを適応するようにしている記事が多いのですが、今回はiptables-persistentを利用します。
iptables-save > /etc/iptables/rules
service iptables-persistent start
これだけでOKです。
起動スクリプトを自分で用意する必要がないのでお手軽ですね。
後は、各自でiptablesの設定を調整してみてください。
ちなみに/etc/init.d/iptables-persistent、中身はシンプルなシェルスクリプトでした。
#!/bin/sh # Written by Simon Richter <sjr@debian.org> # ### BEGIN INIT INFO # Provides: iptables-persistent # Required-Start: mountkernfs $local_fs # Required-Stop: $local_fs # Default-Start: S # Default-Stop: # Short-Description: Set up iptables rules ### END INIT INFO case "$1" in start) if [ -f /etc/iptables/rules ]; then iptables-restore </etc/iptables/rules fi ;; stop|force-stop|restart|force-reload|status) ;; *) echo "Usage: $0 {start|stop|force-stop|restart|force-reload|status}" >&2 exit 1 ;; esac exit 0
情報が古くなったので、追記しておきました。
http://d.hatena.ne.jp/mercysluck/20121212
CPAN関連のお手軽管理法
acotieさんが書かれた記事をまず読みましょう。
第7回 新人さんのための仕事で使えるPerl基礎知識(1)
http://gihyo.jp/dev/serial/01/perl-hackers-hub/000701
cpanm(App::cpanminus)、軽くて早いし便利!
cpanmを使ったインストール方法
cpanm Acme::MomoiroClover
普通に使う分には単純にモジュール名を指定するだけでインストールしてくれて楽チン。
URLやローカルファイルからもインストールできるし、特定のディレクトリーにインストールすることも可能と納得の高性能。
モジュールの一覧保存とインポート
perl -MExtUtils::Installed -e 'print "$_\n" for ExtUtils::Installed->new->modules' > modules.txt cpanm < modules.txt
このワンライナーで普段使っているモジュール一覧をまとめておけば、どこに行っても同じ環境を使えますね。
モジュールのアップデート
cpanm App::cpanoutdated cpan-outdated | cpanm
モジュールのアップデートもこれでお手軽。
モジュールのバージョン確認
perl -MAcme::MomoiroClover -le 'print $Acme::MomoiroClover::VERSION'
以前はこのようなワンライナー使っていたのですが、
cpanm pmvers pmvers Acme::MomoiroClover 0.2
pmversモジュールをいれたほうがシンプルでいいかも。
モジュールの削除
cpanm App::pmuninstall pm-uninstall Acme::AKB48
逆にモジュールを削除したくなった時には、App::pmuninstallと言うモジュールをインストールすればpm-uninstallを使えるようになります。
モジュールとかそれほど容量食わないからそれほど使用頻度は高くないでしょうけど、泣く泣くお別れしたいモジュールが出てきた時とかに便利そうです。
Perl CPANモジュールガイドがおすすめです。
ペラペラめくるだけでも発見があります。
XML::RSS::Parserを使っているとXML::SAX::PurePerlがコケる
単純にサンプルのソースみたら簡単そうだったので、XML::RSS::Parserを使ってみたのですが、ある程度の量のRSSをさばいていたら
utf8 "hogehoge" does not map to Unicode at /usr/local/share/perl/5.10.1/XML/SAX/PurePerl/Reader/Stream.pm line 37.
と言うエラーを吐き出しはじめて、そのうち停止してしまう・・。
XML::SAX::PurePerlと言う部分が悪そうなので検索してみると以下のような記事が。
[perl] ある日 XML::Simple がいきなりこけて泣かないために
http://d.hatena.ne.jp/sfujiwara/20090730/1248959524
モジュールのインストールの順番によってデフォルトのパーサーが変わってしまうとのこと。
かなり前にnaoya氏のブログで見かけたようなネタだ!
XML::Simpleのようにパーサーを指定すればいいのだとわかったわけだけども、XML::RSS::Parserでのパーサーの指定方法がわからない・・。
XML::RSS::ParserのDEPENDENCIESを見ると、XML::SAXが使われているそうなのでこちらを見たら指定方法が書いてあった!
#!/usr/bin/env perl use strict; use warnings; use utf8; use Encode; use XML::SAX; use Data::Dumper; # get a list of known parsers my $parsers = XML::SAX->parsers(); warn Dumper $parsers;
実行してみると、やはりXML::SAX::PurePerlが指定されていた。
$VAR1 = [ { 'Features' => { 'http://xml.org/sax/features/namespaces' => '1' }, 'Name' => 'XML::SAX::PurePerl' } ];
パーサーにXML::LibXML::SAXを設定してみる。
#!/usr/bin/env perl use strict; use warnings; use utf8; use Encode; use XML::SAX; use Data::Dumper; # get a list of known parsers my $parsers = XML::SAX->parsers(); # update a parser XML::SAX->add_parser(q(XML::LibXML::SAX)); warn Dumper $parsers; # save parsers XML::SAX->save_parsers();
パーサーにXML::LibXML::SAXが追加されたことまでは確認できたものの、保存してみようとしたところ権限がないと言うエラーがでてしまった。
$VAR1 = [ { 'Features' => { 'http://xml.org/sax/features/namespaces' => '1' }, 'Name' => 'XML::SAX::PurePerl' }, { 'Features' => { 'http://xml.org/sax/features/namespaces' => 1 }, 'Name' => 'XML::LibXML::SAX' } ]; Cannot write to /usr/local/share/perl/5.10.1/XML/SAX/ParserDetails.ini: Permission denied at /usr/local/share/perl/5.10.1/XML/SAX.pm line 191.
パーサーの指定をファイルに保存せずにつど指定するか、rootになってParserDetails.iniを書き換えるかすれば解決です。
perl -MXML::SAX -e "XML::SAX->add_parser(q(XML::LibXML::SAX))->save_parsers()"
http://perl-xml.sourceforge.net/faq/#parserdetails.ini
ちなみにDebian環境なので、他のOSやperlbrewとかの環境の場合は適宜パスを読み替えてください。
よくよく確認してみると、oreilly.comで買ったPerl & XMLのChapter 5:SAXに書かれていました・・。