Windows7×JenkinsでAntで各種PEARが動かせない場合

本来は環境変数周りの問題だと思うのだけどあきらめた…

Antは使わずにcmdへコマンド投げる方法に切り替え

本来こうしたい所を

<target name="phpcpd" description="Find duplicate code using PHPCPD">
 <exec executable="phpcpd">
  <arg value="--log-pmd"/>
  <arg value="${basedir}/build/logs/pmd-cpd.xml"/>
  <arg path="${basedir}/src"/>
 </exec>
</target>

↓ ↓ ↓ cmdへ投げる形へ。

<target name="phpcpd" description="Find duplicate code using PHPCPD">
 <exec executable="cmd">
 <arg value="/c phpcpd --log-pmd ${basedir}/build/logs/pmd-cpd.xml ${basedir}/src" />
 </exec>
</target>

phpcpdでネストエラーが出てしまったら

phpcpdの仕様と前提となる環境がかみ合わないせいか、PHP5.4.3/PHP5.3.13で再現確認。

Fatal error: Maximum function nesting level of '100' reached, aborting! in C:\php\php5\pear\SebastianBergmann\Version\Version.php on line 125

Call Stack:
 0.0008 232488 1. {main}() C:\php\php5\phpcpd:0
 0.0102 632032 2. SebastianBergmann\PHPCPD\TextUI\Command->__construct(
) C:\php\php5\phpcpd:55
 0.0107 653600 3. SebastianBergmann\Version->getVersion() C:\p
hp\php5\pear\SebastianBergmann\PHPCPD\TextUI\Command.php:68
 0.0107 653824 4. SebastianBergmann\Version->getGitInformation() C:\wam
p\bin\php\php5\pear\SebastianBergmann\Version\Version.php:81
 0.0107 653904 5. SebastianBergmann\Version->isGitRepository() C:\wamp\
bin\php\php5\pear\SebastianBergmann\Version\Version.php:103
 0.0108 654104 6. SebastianBergmann\Version->isGitRepository() C:\wamp\
bin\php\php5\pear\SebastianBergmann\Version\Version.php:135
 0.0108 654224 7. SebastianBergmann\Version->isGitRepository() C:\wamp\
bin\php\php5\pear\SebastianBergmann\Version\Version.php:135
(以下延々)

PEARインストール先の問題のファイルを改変。
(gitリポジトリ内で呼ばれたら、最新のものを取ってくる判定をする部分なので挙動には支障ないはず)

例) C:\php\php5\pear\SebastianBergmann\Version\Version.php

//123行目付近
private function isGitRepository($path){
 return false; //動かないのだから仕方あるまい
...

今回調べ物してて思ったこと

Windows環境のオマケ扱いが加速している…。
Linux(Mac)表記が先で、Windowsの表記は「テストして無いけどこんな感じでしょ」みたいな書き方されてました。

Macを好きにならなければこの先苦労するのかもしれません。

WordPressのメディアアップローダー

WordPress3.5.1のメディアアップローダーでハマりかけてます。

ブラウザによりそうですが、80KB程度の画像300枚くらいまとめて上げようとすると挙動不審に。

使い方として、推奨されてないだろうことは重々承知の上で、なんとかまとめてアップロードしたいのだけど、40枚くらいが限界の模様。

さらに、アップロードが非同期だからデータベースに書き込まれる順序がバラバラになってしまう。

昔のバージョンのアップローダは、順序よく上がってくれたし、タイムアウトしても続きから送れば良かったので、大量に写真を送りつけても安心でした。

そのため、画像と1:1で結びつける投稿があっても、Excel+VBAで作ったデータとジェネレータを使ってWordPress形式インポート、というのが可能だったのです。

試してみたところ、少しずつ上げるとアップロード処理自体は行われるけれども、今度は順序の乱れが取り返しつかないレベルなりました。

枚数が少なければ、並び替えもしやすいインターフェイスなのですが…。

プラグイン使うとなると大抵表示側だと思うんですが、ギャラリー(表示)はデフォルトでもかまわないのに、今回はアップロードで難儀してます。

ファイルはFTPでアップロードして、ポチッとな→ファイル名降順でメディアギャラリーに差し込むWordPressプラグインとかないかな!

…プラグインではありませんが、昔だいたい同じようなもの作ったはずなので、発掘するのと新しく作るのだったらどちらが早いかで悩ましい夜明け。

今回はDropboxのWeb表示URL貼ってごまかすという手もあるので、どうしようか。

WordPressショートコードで投稿データ表示。

テンプレート面倒くさくていじりたくない…。
新しいテンプレート作るときコピペするの面倒だもの…。

そこで、今更感抜群のこちら!

ショートコード内でテンプレートと同じ記事のループ処理をしてるので、
投稿内容がthe_content()とかdo_shortcode(get_the_content())を通ると記事が表示できます。

使い方としては、Magic Fields2プラグインでpost_typeとcustom_taxonomyいっぱい作って、
管理画面の編集できる範囲を固定化した後に、ページの本文でこのショートコードを呼び出して
一部の必要な記事を表示する。

ショートコード外の装飾はビジュアルエディタである程度いじれるのがメリット。

[show_posts post_type="posts" length="1"]

とかで管理画面から特定ポストタイプの最新の投稿1件を出せます。
あと、taxonomyも1個だけ対応している。
(ある固定ページにポストタイプ「event」の「交流会」タクソノミーの最新1件だけを表示したいときとかに)

[show_posts post_type="posts" taxonomy="post-tax"]

中ではWP_Queryでテンプレートに書くループやってるだけなので、後はスタイルシートで頑張る。

あと、ページ送りとか使わないような1件抽出とか向きです。そのへんまったく考慮してません。

あっ、中でloopテンプレート呼んだりしたほうがいいのかな?

<?php
function shortcode_show_posts($atts, $content = null){
 $result="";
//ショートコードで使えるオプションたち
 extract(shortcode_atts(array(
 'post_type'=>'',//ポストタイプ
 'post_id'=>'',//ポストID
 'length'=>1,//=posts_per_pages、記事数
 'taxonomy'=>'',//タクソノミー
 'order'=>'date',//ソート基準
 'orderby'=>'DESC',//ソート順
 'show_post_title'=>1,//タイトル表示するか?
 'show_post_date'=>1,//日付表示するか?
 'show_post_body'=>1,//本文表示するか?
 'use_link'=>0,//タイトルにパーマリンクするか?
 'title_class' => '',//タイトルに追加CSSクラス
 'body_class' => ''),//本文に追加CSSクラス
 $atts));

//WP_Queryに渡すオプションを整理
 if(!empty($taxonomy)){
//taxonomyがあるときは大体他の条件無視する。
 $opt=array(
 'tax_query'=>array(array('taxonomy'=>$post_type.'s', field=>'slug', terms=>array($taxonomy))),
 'posts_per_page'=>$length,
 'order'=>$order,
 'orderby'=>$orderby,
 'post_status' => 'publish'
 );
 }else{
 $opt=array(
 'post_type' => $post_type,
 'p'=>$post_id,
 'posts_per_page'=>$length,
 'order'=>$order,
 'orderby'=>$orderby,
 'post_status' => 'publish'
 );
 }

 $query = new WP_Query($opt);

 if($query->have_posts()):while($query->have_posts()):
 $result.='<div>';
 $query->the_post();

 if($show_post_title){
 $result.='<h3>';
 if($use_link){
 $result.='<a href="'.get_permalink().'">'.get_the_title().'</a>';
 }else{
 $result.=get_the_title();
 }
 $result.='</h3>';
 }

 if($show_post_date){
 $result.='<date>';
 $result.=get_the_date('Y年m月d日 H:i 掲載');
 $result.='</date>';
 }

 if($show_post_body){
 $result.='<div>';
 $content=do_shortcode(get_the_content());
 $result.=str_replace("\n","<br />",$content);
 }

 $result.='</div>';
 $result.='</div>';
 endwhile;endif;

 return $result;
}
add_shortcode("show_posts", "shortcode_show_posts");
?>