PHPでXSLTを使ってみる
- 2012/02/16
- uchida
今回はPHPでXSLTを使ってみました。
1)XMLファイル「list.xml」
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?xml version="1.0" encoding="UTF-8"?> <list> <player> <no>2</no> <name>山田</name> <affiliation>沖縄</affiliation> </player> <player> <no>3</no> <name>田中</name> <affiliation>長崎</affiliation> </player> <player> <no>5</no> <name>佐藤</name> <affiliation>北海道</affiliation> </player> <player> <no>1</no> <name>斉藤</name> <affiliation>東京</affiliation> </player> </list> |
2)XSLTファイル「table.xsl」
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="yes" encoding="utf-8" /> <xsl:template match="/list"> <html> <head><title>list</title></head> <body> <table border="1"> <xsl:call-template name="table"></xsl:call-template> </table> </body> </html> </xsl:template> <xsl:template name="table"> <xsl:for-each select="player"> <tr> <td><xsl:value-of select="no"></xsl:value-of></td> <td><xsl:value-of select="name"></xsl:value-of></td> <td><xsl:value-of select="affiliation"></xsl:value-of></td> </tr> </xsl:for-each> </xsl:template> </xsl:stylesheet> |
3)PHPファイル「xlst_process.php」
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php $processor = new XSLTProcessor(); $xsl = new DOMDocument; $xsl->load('table.xsl'); $processor->importStylesheet($xsl); $xml = new DOMDocument; $xml->load('list.xml'); $result = $processor->transformToXml($xml); echo $result; |
4)結果

5)感想
これはすごく簡単に出来ていい!
Popularity: 3% [?]
『じゃばすく製作所(仮)ふたつめ。』いってきました
- 2012/02/12
- murabe
- JavaScript
- イベント
たのしくJavaScript勉強してきました。主催者レポートはこちら。
『例のあれ(仮題)- じゃばすく製作所(仮)ふたつめ。をこの際なのでやりました。』
配布ファイルやガイドブックも用意されてるので自習もできます、Canvasを用いて描画するアナログ時計作り。
私、一応時間内に動かせたんですが、Chromeで動かすと画面に収まらないという不具合がありまして、帰ってから調べたらメソッド呼び出しに()を付け忘れているという当日に何度も繰り返したミスが残っていました。
widthとかheightって名前だとプロパティと思っちゃうんだ。
ついでに同じような処理を関数に少しまとめたりした村部版はこんな感じ。
function SampleClock() { try { this.board = document.getElementById('board'); this.canvas = document.getElementById('time'); this.boardContext = this.board.getContext('2d'); this.context = this.canvas.getContext('2d'); this.board.width = this.canvas.width = window.innerWidth; this.board.height = this.canvas.height = window.innerHeight; this.boardContext.translate(this.width() / 2, this.height() / 2); this.context.translate(this.width() / 2, this.height() / 2); this.context.rotate(this.toRad(-90)); this.draw_board(); } catch (e) { alert('initialize error...'); } } SampleClock.prototype = { width: function () { return this.board.width; }, height: function () { return this.board.height; }, radius: function () { if(this.width() > this.height()) { return this.height() / 2; } else { return this.width() / 2; } }, toRad: function (angle) { return angle * (Math.PI / 180); }, hourRad: function (datetime) { var hour = datetime.getHours(); var minute = datetime.getMinutes(); var hour_for_disp = hour; if(hour > 12) { hour_for_disp = hour - 12; } return hour_for_disp * Math.PI / 6 + minute * Math.PI / 360; }, minuteRad: function (datetime) { var minute = datetime.getMinutes(); var second = datetime.getSeconds(); return minute * Math.PI / 30 + second * Math.PI / 1800; }, secondRad: function (datetime) { var second = datetime.getSeconds(); var millisecond = datetime.getMilliseconds(); return second * Math.PI / 30 + millisecond * Math.PI / 30000; }, draw_time: function () { this.context.clearRect(-this.width() / 2, -this.height() / 2, this.width(), this.height()); var now = new Date(); var draw_line_for_time = function(context, rad, lineWidth, lineLength, lineColor) { context.save(); context.beginPath(); context.lineWidth = lineWidth; context.rotate(rad); context.moveTo(0, 0); context.lineTo(lineLength, 0); context.strokeStyle = lineColor; context.stroke(); context.restore(); } draw_line_for_time( this.context, this.hourRad(now), this.radius() * 0.08, this.radius() * 0.6, '#000000' ); draw_line_for_time( this.context, this.minuteRad(now), this.radius() * 0.06, this.radius() * 0.8, '#000000' ); draw_line_for_time( this.context, this.secondRad(now), this.radius() * 0.03, this.radius() * 0.8, '#ff0000' ); }, draw_board: function () { this.boardContext.beginPath(); this.boardContext.lineWidth = this.radius() * 0.05; this.boardContext.arc(0, 0, this.radius() * 0.9, 0, Math.PI * 2); this.boardContext.stroke(); this.boardContext.beginPath(); this.boardContext.lineWidth = this.radius() * 0.1; this.boardContext.arc(0, 0, this.radius() * 0.05, 0, Math.PI * 2); this.boardContext.stroke(); this.boardContext.beginPath(); this.boardContext.lineWidth = this.radius() * 0.03; for (var i = 0; i < 12; i++) { this.boardContext.moveTo(this.radius() * 0.85, 0); this.boardContext.lineTo(this.radius() * 0.75, 0); this.boardContext.rotate(this.toRad(360 / 12)); } this.boardContext.stroke(); this.boardContext.beginPath(); this.boardContext.lineWidth = this.radius() * 0.03; for (var i = 0; i < 60; i++) { this.boardContext.moveTo(this.radius() * 0.85, 0); this.boardContext.lineTo(this.radius() * 0.80, 0); this.boardContext.rotate(this.toRad(360 / 60)); } this.boardContext.stroke(); } }; var clock = new SampleClock(); var timer; function tik() { clock.draw_time(); timer = setTimeout('tik()', 1000 / 60); } function tok() { clearInterval(timer); } tik();
Popularity: 3% [?]
CUI な Git ブラウザ tig を Homebrew で入れてみた
『CUI な Git ブラウザ tig を入れてみた』 を見て便利そうだったので Homebew にないかなーと。
$ brew search tig tig tiger-vnc
あった。
$ brew install tig ==> Downloading http://jonas.nitro.dk/tig/releases/tig-0.18.tar.gz ######################################################################## 100.0% ==> ./configure --prefix=/usr/local/Cellar/tig/0.18 ==> make install ==> make install-doc-man /usr/local/Cellar/tig/0.18: 8 files, 248K, built in 12 seconds
サックリ完了。
$ which tig /usr/local/bin/tig
はいってるはいってる。Gitのワークツリーに移動して
$ tig
起動!
日本語も出てるし大丈夫っぽい。変更を追っかけるのに便利な感じ。
使い方がわからなくなったらhを押すとヘルプがでるので困ったらhと覚えてれば大丈夫(たぶん)。
Popularity: 5% [?]
NetBeans のクリップボードでのイライラ解消に Copy and Paste History プラグイン
社内にNetBeans使ってる人、他にいないし、Eclipse使いが多いし、
Eclipseプラグインの作り方基本編
EclipseプラグインJavaEditorへの機能追加編
とEclipseプラグインを作ったりしてるしでNetBeansからEclipseに乗り換えようかとも思ったのですがやっぱりNetBeansが好き。
結局NetBeansを使っています。
そんなNetBeansが好きなわたしですが使っていてイライラすることがあります。
クリップボード拡張ソフトとの相性がわるいことです。
クリップボード拡張ソフトで履歴をさかのぼってペーストしようとしても直前にコピーした内容がペーストされてしまう。
イライラします。
を参考に(ありがとうございます!)NetBeans側の起動オプションで対策したりしていたのですが2つ目に書いてある方法、NetBeansのプラグイン Copy and Paste History (http://plugins.netbeans.org/plugin/33351/copy-and-paste-history-for-netbeans-7-0-and-later)を使うってところに落ち着きました。
プラグインのメニューから使用可能なプラグインで copy とでもでも検索すればでてきますので選択してインストールするだけです。
少しひっかかったのがMacの場合はキーアサインが説明に書いてある Alt+V ではなく Ctl+V だということでした。
NetBeansクリップボードにイライラさせられている方はお試しあれ。
Popularity: 3% [?]
mysqld_multiを使って同一マシンに複数のMySQLサーバを立てる
- 2012/01/30
- yoshida
業務で複数MySQLの開発環境が必要になりました。VM作っても良かったのですが、いちいち立ち上げたくなかったのと、Mac1台で完結させたかったのでTwitterでその旨つぶやいたら、とある方からmysqld_multiというものを教えて頂きました。
私はHomebrewでMySQL5.1を入れていたのですが、
$ ll /usr/local/Cellar/mysql51/5.1.58/bin/ | grep mysqld_multi -r-xr-xr-x 1 dataich staff 24334 11 1 14:17 mysqld_multi
おお、既に入ってました。
でmy.cnfに設定を書いてあげます。[mysqld1][mysqld2][mysqld3]という感じでオプショングループを書いてあげてそれぞれの設定を記述します。
この状態で
$ mysqld_multi start
とすれば全部立ち上がります。
またマニュアルにもありますが、特定のサーバだけ立ち上げることも可能です。
なんで今まで知らなかったのかと後悔してます。
まあアプリ側がちゃんとポート指定に対応していないと残念なことにはなりますが、非常に便利に使えそうです。
ちなみにWindows開発環境では、多分別の社員さんが書いてくれると思います。
Popularity: 3% [?]
OpenCOBOL活用セミナーで生みの親の西田さんと
OSSコンソーシアムに OSS COBOL ワーキンググループが設立されました(「【プレスリリース】OSS COBOL支援プロジェクト立ち上げ – OSSコンソーシアム」をご参照ください)。
これにともない、『フルオープンソースでCOBOLの基幹システムを実現!OpenCOBOL活用セミナー』が1/25に開催されました。長崎県からは長崎県総務部政策監の島村秀世様と弊社の峰松が長崎県での取り組みや展開について話しました。
ご参加いただいた皆様、ありがとうございました。
さて、堅い感じはおわり。本題にはいりますよー。
OpenCOBOLの生みの親、西田圭介さんに今回のセミナーのことを峰松からお話していたらなんとご本人が参加してくださったんです!
懇親会で二人が話してたところにちょっとお邪魔してパチリ(左が峰松、右が西田さんです)。
西田さんは現在、BizMobile株式会社のCTOだそうです。
OpenCOBOL開発当時のお話や著書『Googleを支える技術-‾巨大システムの内側の世界-』についてお話したり、OpenCOBOLの可能性について語りあったりととても楽しいひとときでした!
付記:
プレゼン直前にPowerPointが落ちて作っていた資料がほとんど消える。プレゼンの途中にプロジェクターへの接続がきれる。終了予定時間がすぎてからデモを始める。峰松は今回も絶好調でした。ざっつ、えんたーてぃなー。
Popularity: 3% [?]
PHPでbundlerぽいことを行うOnion、Composer
- 2012/01/12
- yoshida
pear.phpunit.de/PHPUnitを依存関係として設定する前提で、Onion、Composerを使ってみました。
Onion
PEARモジュールのビルド、コンパイル、そして今回の目的であるbundler的なことを簡単に行えます。
インストール
homebrewの場合
gistにFormulaを置きましたので使ってください。
# brew install --HEAD https://raw.github.com/gist/1594321/6769fa97864462c4813f06bbb08760630ba7c87f/onion.rb brew install --HEAD https://raw.github.com/gist/1594321/onion.rb # 2012/02/07 修正 実行ファイルがonion.pharからonionに変更になりましたので、Formulaを修正しました。
直接
onion.pharをパスの通ったディレクトリに置いて、実行権限を与えるだけ。
# curl https://github.com/c9s/Onion/raw/master/onion > ~/bin/onion curl -s http://install.onionphp.org/ | sh # 2012/02/07 修正 インストール方法が変更されてました。
使用方法
onion_sample
|– vendor
|– package.ini
プロジェクト直下にpackage.iniを作成し、ここに依存関係などを記述します。
packageセクションにあるname、desc、version、authorは必須となっています。(そもそもOnionはPEARパッケージを作る際にも使うためだと思われます。) requireセクションに使用したいPEARパッケージを記述します。 上記の状態で下記コマンドを実行することで、vendorディレクトリにPEARパッケージがインストールされます。
$ onion -d bundleいやー、インストールから実行まで非常に手軽。この手軽さが素晴らしいです。
Composer
こちらもbundler的な事を行えるのですが、Onionよりもその依存関係部分に注力したパッケージマネージャといった感じです。 PEARだけに限らず、gitのリポジトリを依存関係として指定したりもできます。ただその辺りはあまり調べていないので、今回はPEARパッケージのみ使う前提で試して見ました。
インストール
brew install --HEAD https://raw.github.com/gist/1574469/composer.rb
使用方法
composer_sample
|– vendor
|– composer.json
プロジェクト直下にcomposer.jsonを作成し、ここに依存関係などを記述します。
上記の状態で下記コマンドを実行することで、vendorディレクトリにPEARパッケージがインストールされます。
$ composer.phar installComposerはPEARモジュール以外も扱うためか、PEARモジュールそのものを扱うのに設定ファイルが少々複雑になります。
今回はpear.phpunit.de/PHPUnitを依存関係として設定していますが、まずそのためにrepositoriesにチャンネルを設定する必要があります。そこまではいいのですが、PHPUnitがpear.symfony-project.com/YAMLに依存しているので、そのチャンネルも記述しておく必要があります。つまり依存関係にある全てのチャンネルを設定しておく必要があるみたいです。これどうにかならないのでしょうか。
雑感としてはPEARモジュールさえ扱えればいいのであれば、Onionの方が簡単だと思いました。対してComposerはPEARモジュール以外にも使えるので、今後に期待できるのはComposerだと思いますが、現状は用途に合わせてといったところでしょう。また気になる動きとして、OnionのGithubリポジトリにcomposer-supportというブランチがあるのが楽しみです。
Popularity: 4% [?]
これだけで一応使える git-svn 入門
やぁやぁ、村部です。
分散バージョン管理はBazaarをずっと使っていましたが、世の流れには逆らえず現在やっているプロジェクトではGitを使うことにしました。
ソースコードを管理するのであればGitは強力ですしね。EclipseでもNetbeansでも使えるのも魅力。
ただし、中央リポジトリはSubversionです。ドキュメントも同じリポジトリ管理したいのでSubversionが便利なのです。
既に社内でgit-svnでの運用実績もありますので安心(Bazaar使いたい時はbzr-svnでやれますしね)。
社内Git派閥の方に聞いた所「基本trunkでやるなら下記覚えておけばOK」とのこと。
## ローカルでのコミット git add . git commit ## SVNへのコミット git svn rebase #一旦SVNのリポジトリから取り込み git svn dcommit #ローカルの変更を反映
しばらく使ってみて不便に感じたのが git commit 直後でないと git svn rebase や git svn dcommit ができないこと。すこしでも修正しているとだめ。 タースーケーテー
「git stash があるよ」
変更を退避するコマンドだそうです。てなわけでSVNへのコミットの基本はこんな感じ。
git stash save -u #commitしてない変更を退避 git svn rebase git svn dcommit git stash pop #退避から取り出し
git stash save の -u オプションは –include-untracked の省略形。add していない変更も退避します。
「このオプションを付けてないとよくわからないトラブルになりがち」だそうなのでつけときましょう。
以上、これだけで一応使える git-svn 入門でした。
※2012-03-21 追記
git stash save の -u オプションについてですが、新しいファイルを作成、編集してるときにadd前にこのオプションをつけて save すると pop 時にコンフリクトすることが多いです。その場合コンフリクトを解消するにはコンフリクトしているファイルをすべて削除(または他の場所に移動)して再度 pop します。正常に pop する前に git stash drop すると編集していたファイルを失って泣くことになるのでご注意を。
ということで一概に -u をつけたほうがいいとは言えないようです。
Popularity: 7% [?]
phpenv+php-build+pyrusでの複数バージョンPHP管理など
- 2012/01/12
- yoshida
必要なもの
- phpenv
PHPのバージョン切り替え(切り替えるのみ、PHPのインストールはできない。rbenvを流用) - php-build
複数バージョンPHPのインストールマネージャ - Pyrus
PEAR後継パッケージマネージャ
phpenvのインストール
$ curl https://raw.github.com/CHH/phpenv/master/bin/phpenv-install.sh | sh Installing phpenv in /Users/dataich/.phpenv remote: Counting objects: 1008, done. remote: Compressing objects: 100% (422/422), done. remote: Total 1008 (delta 633), reused 928 (delta 558) Receiving objects: 100% (1008/1008), 135.47 KiB | 124 KiB/s, done. Resolving deltas: 100% (633/633), done. Success. Now add /Users/dataich/.phpenv/bin to your $PATH, add "eval $(phpenv init -)" at the end of your ~/.bashrc and restart your shell to use phpenv.
最後の行で言われたとおり、.bashrcに追記します。
$ vi ~/.bashrc export PATH="/Users/dataich/.phpenv/bin:$PATH" eval "$(phpenv init -)"
phpenvは~/.phpenv以下にインストールされており、~/.phpenv/versionsにバージョンごとのPHPをインストールしてやることで切り替えが可能になります。
php-buildのインストール
$ git clone https://github.com/CHH/php-build.git $ cd php-build $ ./install.sh Installing php-build in /usr/local - Creating Directories... Done. - Copying files... Done.
これで必要なもののインストールは完了です。また、現状はインストールできるPHPバージョンが増えたりした場合は、git pullして./install.shを再度実行しないといけないと思います。
php-buildを使用してPHPをインストール
まずはインストール可能なバージョンを調べます。
$ php-build --definitions
5.2.17
5.3.2
5.3.6
5.3.8
5.3.9RC3
5.3snapshot
5.4.0RC1
5.4.0RC2
5.4.0RC3
5.4.0RC4
5.4.0alpha3
5.4.0beta1
5.4.0beta2
5.4snapshotでは上記から好きなバージョンを選んでインストールしています。今回は業務で必須なので5.3.8を。
とその前にApacheモジュールどうする?
php-buildはApacheモジュールのビルドに対応していません(GitHubにIssueにはFeatureとして登録されてます。)。
ソースを読んでみるconfigure_optionを呼び出してあげればよさそうです。なのでdefinitionsに定義してあるスクリプトに変更を入れてあげます。このdefinitions配下にあるスクリプトはいろいろビルド方法を調整する時に使えそうです(pyrusじゃなくてpear使いたかったらwith_pear書いて、install_pyrusコメントアウトするとか。)
$ vi /usr/local/share/php-build/definitions/5.3.8 configure_option "--with-apxs2" "/usr/local/Cellar/httpd/2.2.21/sbin/apxs" #この行を追加する。apxsへのパスは環境に応じて置き換えてください。 install_package "http://www.php.net/distributions/php-5.3.8.tar.bz2" install_pyrus install_xdebug "2.1.2"
まあPHPをビルドする度にlibphp5.soを上書きしてしまうだろうということと、phpenvで切り替えた時どうするのっていうのはありますが・・・。
気をとりなおしてphp-buildを使用してPHPをインストール
ではphp-buildを使用して5.3.8をインストールします。プレフィックスには~/.phpenv/versions/5.3.8を指定します。実はここでちょっとはまったのですが、最後の引数はプレフィックスなのでフルパスである必要があります。
$ php-build 5.3.8 ~/.phpenv/versions/5.3.8 Loaded pyrus Plugin. Loaded xdebug Plugin. php.ini-production gets used as php.ini Building 5.3.8 into /Users/dataich/.phpenv/versions/5.3.8 [Downloading]: http://www.php.net/distributions/php-5.3.8.tar.bz2 [Configure]: /usr/local/bin/../tmp/php-build/source/5.3.8 [Make]: /usr/local/bin/../tmp/php-build/source/5.3.8 [Pyrus]: Downloading from http://pear2.php.net/pyrus.phar [Pyrus]: Installing executable in /Users/dataich/.phpenv/versions/5.3.8/bin/pyrus [XDebug]: Downloading http://xdebug.org/files/xdebug-2.1.2.tgz [XDebug]: Compiling in /usr/local/bin/../tmp/php-build/source/xdebug-2.1.2 [XDebug]: Installing XDebug configuration in /Users/dataich/.phpenv/versions/5.3.8/etc/conf.d/xdebug.ini [XDebug]: Cleaning up. [Info]: The Log File is not empty, but the Build did not fail. Maybe just warnings got logged. You can review the log in /usr/local/bin/../var/log/php-build/error.5.3.8.20120106174319.log [Success]: Built 5.3.8 successfully.
ちなみにphp.iniは~/.phpenv/versions/5.3.8/etc配下のを使うようになっています。また~/.phpenv/versions/5.3.8/etc/conf.d配下のものも読むようになっており、xdebug.iniなどが置いてあります。バージョンごとにiniファイルを持っているので便利です。
phpenvを使ってみる
ではphpenvにて切り替えられるバージョンを調べてみます。
$ phpenv versions 5.3.8
先ほどインスールした5.3.8が使用できる状態になっていますので、グローバルに使うようにします。
$ phpenv global 5.3.8 $ phpenv versions * 5.3.8 (set by /Users/dataich/.rbenv-version) $ php -v PHP 5.3.8 (cli) (built: Jan 11 2012 23:20:46) Copyright (c) 1997-2011 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies with Xdebug v2.1.2, Copyright (c) 2002-2011, by Derick Rethans
また、下記のようにlocalを使うとカレントディレクトリに.rbenv-versionというファイルが作られ、そのディレクトリ配下では一度指定したバージョンが使われるようになります。
$ phpenv local 5.4snapshotphpenv rehashコマンド
phpenvでは.phpenv/shims/にパスを通すようになっており、そこを介してexecutableなコマンドを実行したりします。
$ ll .phpenv/shims何もないはずです。ここを構築するにはrehashを使います。
$ phpenv rehash $ ll .phpenv/shims/ total 56 -rwxr-xr-x 7 dataich staff 102 1 11 23:31 phar -rwxr-xr-x 7 dataich staff 102 1 11 23:31 phar.phar -rwxr-xr-x 7 dataich staff 102 1 11 23:31 php -rwxr-xr-x 7 dataich staff 102 1 11 23:31 php-config -rwxr-xr-x 7 dataich staff 102 1 11 23:31 phpize -rwxr-xr-x 7 dataich staff 102 1 11 23:31 pyrus -rwxr-xr-x 7 dataich staff 102 1 11 23:31 pyrus.phar
これを実行することでインストールされているPHPやPEARモジュールの実体を探してきて、シムリンクぽいシェルスクリプトが作成されます。新しいバージョンのPHPや、phpunitなどの実行モジュールをインストールした後には実行しておきましょう。
Pyrus
で次にPyrusです。PEARの後継にあたるパッケージマネージャです。使ってみます。
php-buildでインストールした際に既に使えるようになっています。
$ pyrus config-show Pyrus version 2.0.0a3 SHA-1: BE7EA9D171AE3873F1BBAF692EEE9165BB14BD5D Using PEAR installation found at /Users/dataich/.phpenv/versions/5.3.8/pyrus System paths: php_dir => /Users/dataich/.phpenv/versions/5.3.8/pyrus/php ext_dir => /Users/dataich/.phpenv/versions/5.3.8/lib/php/extensions/no-debug-non-zts-20090626 cfg_dir => /Users/dataich/.phpenv/versions/5.3.8/pyrus/cfg doc_dir => /Users/dataich/.phpenv/versions/5.3.8/pyrus/docs bin_dir => /Users/dataich/.phpenv/versions/5.3.8/bin/ data_dir => /Users/dataich/.phpenv/versions/5.3.8/pyrus/data www_dir => /Users/dataich/.phpenv/versions/5.3.8/pyrus/www test_dir => /Users/dataich/.phpenv/versions/5.3.8/pyrus/tests src_dir => /Users/dataich/.phpenv/versions/5.3.8/pyrus/src php_bin => /Users/dataich/.phpenv/versions/5.3.8/bin/php php_ini => /Users/dataich/.phpenv/versions/5.3.8/etc/php.ini php_prefix => /Users/dataich/.phpenv/versions/5.3.8/bin/ php_suffix => ...
パッケージのインストール先ディレクトリ等がphpenvで指定している現在のバージョン配下になっています、素晴らしい!これでPEARモジュールは現在使用中のPHPのバージョン配下に収まることになります。
pyrusコマンドは第一引数にディレクトリを渡してやることで、そのディレクトリローカルなパッケージ管理ができるようになるので、非常に便利です。ただphp-buildが生成するshimにバグがあって、使えない状態だったのですが、作者さんに投げたところ数時間で対応していただきました、これで常用できそうです。
#35: Cannot use pyrus locally – Issues – CHH/php-build – GitHub
ただし現状Pyrusだとプロジェクトローカルなインストールは簡単なのですが、依存関係の設定ファイルだけリポジトリに上げておいて、コマンド一発で全部インストールみたいなことが難しいです。package.xmlを作ればできるようなのですが、そもそもPEARモジュールのビルド用ぽくて、扱いが難しいです。次のエントリーではその辺りを上手く解決してくれる、Onion、Composer辺り扱ってみます。
参考
phpenv で複数の PHP 環境を管理する
php-build で PHP 5.4.0 beta1 をビルドする
Using Pyrus To Manage PEAR Installable Vendor Libs
Popularity: 3% [?]
EclipseプラグインJavaEditorへの機能追加編
- 2011/12/14
- uchida
- Eclipseプラグイン開発
EclipseプラグインのJavaEditorへの機能追加について書いていきます。
今回は次のようになっているソースを
「
String aaaa = null;
String b = null;
String ccc = null;
」
イコールの位置で整形する機能を追加してみます。
1.プロジェクト作成する。
1)Eclipseプラグインの作り方基本編を見てこの手順でプロジェクトを作成してください。
今回からActivatorにはちゃんとしたパッケージを指定します。

今回はテンプレートは選択しません。

2.plugin.xmlの編集
1)拡張タブを選択します。

2)追加ボタンを押します。

3)ポップアップメニューとして出す予定なので「org.eclipse.ui.popupMenus」を選択します。

4)「org.eclipse.ui.popupMenus」の上で右クリックし以下のように選択します。

5)以下のように値を入力します。
JavaEditorのIDは「#CompilationUnitEditorContext」になります。

6)追加したメニューの上で右クリックしactionを登録します。
これはこのメニューを選択したときどのclassが実行されるかなどを登録します。

7)追加したアクションには以下のように記述します。
idとclassには「com.lancard.editor.action.FormatAction」
menubarpathには「additions」と書きます。

2.クラスの作成
1)「com.lancard.editor.action.FormatAction」を作成します。

2)コードは以下のように書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | package com.lancard.editor.action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.ui.IEditorActionDelegate; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.texteditor.IDocumentProvider; import org.eclipse.ui.texteditor.ITextEditor; public class FormatAction implements IEditorActionDelegate { private IEditorPart targetEditor = null; public void run(IAction action) { ITextEditor textEditor = (ITextEditor)targetEditor; ISelectionProvider selectionProvider = textEditor.getSelectionProvider(); ISelection selection = selectionProvider.getSelection(); ITextSelection textSelection = (ITextSelection)selection; textSelection.getStartLine(); try{ execute(textSelection.getStartLine(),textSelection.getEndLine()); }catch(BadLocationException e){ //ログとか出したほうがいい。 } } private void execute(int startLine,int endLine) throws BadLocationException { ITextEditor textEditor = (ITextEditor)targetEditor; IDocumentProvider provider = textEditor.getDocumentProvider(); IDocument document = provider.getDocument(textEditor.getEditorInput()); int maxIndex = 0; for(int line=startLine;line<=endLine;line++){ int length = document.getLineLength(line); int offset = document.getLineOffset(line); String value = document.get(offset, length); int equalsIndex = value.indexOf("="); if(equalsIndex<0){ continue; } if(equalsIndex>maxIndex){ maxIndex = equalsIndex; } } for(int line=startLine;line<=endLine;line++){ int length = document.getLineLength(line); int offset = document.getLineOffset(line); String value = document.get(offset, length); int equalsIndex = value.indexOf("="); if(equalsIndex<0){ continue; } if(equalsIndex<maxIndex){ document.replace(offset, length, newValue(value, equalsIndex, maxIndex)); } } } private String newValue(String value,int equalsIndex,int maxIndex){ StringBuilder sb = new StringBuilder(); String prev = value.substring(0,equalsIndex); String next = value.substring(equalsIndex); sb.append(prev); for(int i=equalsIndex;i<maxIndex;i++){ sb.append(" "); } sb.append(next); return sb.toString(); } public void selectionChanged(IAction action, ISelection selection) { } public void setActiveEditor(IAction action, IEditorPart targetEditor) { this.targetEditor = targetEditor; } } |
3)一部見つからないクラスが出ると思います。

4)plugin.xmlに依存関係を登録します。
依存関係のタブを開きます。

以下のように2つ登録します。

3.実行してみる
1)適当にjavaファイルを作ります。
2)エディター上で右クリックします。
3)以下のようにメニューに機能が追加されていれば成功です。

4.使ってみる
1)整形する範囲を選択します。

2)ランカードコム整形を押します。

整形されていたら成功です。
5.プラグインファイルの作成
1)エクスポートウィザードを実行します。
plugin.xmlの概要タブの右下のボタンを押します。

2)以下のように入力し、完了を押したら完成です。

3)あとは解凍してpluginフォルダの中にあるjarファイルを自分のEclipseのpluginフォルダに入れたら
あなただけの独自機能の追加されたEclipseを使うことが出来ます。
6.ソースの説明
すごく簡単なソースなので、読めばわかると思うので今回はここまでです。
あとすぐ作りたかったので適当に書いたのですが、もうちょっと奇麗にかけるところがあるかもしれないです・・。
Popularity: 4% [?]


