XML::Simpleのインストールでエラーになる場合の対処

January 11,2022 11:55 PM
Category:[Perl]
Tag:[Perl]
Permalink

PerlのXML::Simpleのインストールでエラーになる場合の対処方法を紹介します。

モジュールはyum等ではなく、makeでインストールしています。

1.問題点

XML::Simpleをインストールしましたが、エラーになります。

下記のスクリプトを実行します。

#!/usr/bin/perl
 
use XML::Simple;
 
$file = './test.xml';
my $data = XMLin($file);

実行結果

# ./test.pl
XMLin() requires either XML::SAX or XML::Parser at ./test.pl line 6
XML::Simple called at ./test.pl line 6

ということで、PerlのXML::Simpleのインストールでエラーになる場合の対処方法を紹介します。

2.対処

エラーの内容より、XML::SAXまたはXML::Parserが必要みたいなのでインストールします。

なおXML::Parserはexpat-develのインストールが必要なようです。ここではXML::SAXをインストールします。

https://metacpan.org/pod/XML::Parser

からtar.gzファイルをダウンロードして展開し、

# perl Makefile.PL

でMakefileを生成します。

# make
cp lib/XML/SAX/PurePerl/EncodingDetect.pm blib/lib/XML/SAX/PurePerl/EncodingDetect.pm
cp lib/XML/SAX/PurePerl/Reader/UnicodeExt.pm blib/lib/XML/SAX/PurePerl/Reader/UnicodeExt.pm
cp lib/XML/SAX/PurePerl/Reader/Stream.pm blib/lib/XML/SAX/PurePerl/Reader/Stream.pm
  :
Manifying blib/man3/XML::SAX::PurePerl.3pm
Manifying blib/man3/XML::SAX::DocumentLocator.3pm
# make install
Installing /usr/local/share/perl5/XML/SAX.pm
Installing /usr/local/share/perl5/XML/SAX/Intro.pod
Installing /usr/local/share/perl5/XML/SAX/ParserFactory.pm
  :
Can't locate XML/SAX/Exception.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/local/share/perl5/XML/SAX/ParserFactory.pm line 12.
BEGIN failed--compilation aborted at /usr/local/share/perl5/XML/SAX/ParserFactory.pm line 12.
Compilation failed in require at /usr/local/share/perl5/XML/SAX.pm line 18.
BEGIN failed--compilation aborted at /usr/local/share/perl5/XML/SAX.pm line 18.
Compilation failed in require.
BEGIN failed--compilation aborted.
make: *** [install_sax_pureperl] エラー 2

エラーが発生したので、さらにXML/SAX/Exception.pm(XML-SAX-Base-1.09)をインストールします。

https://metacpan.org/pod/XML::SAX::Exception

からtar.gzファイルをダウンロードして展開し、

# perl Makefile.PL

でMakefileを生成します。

# perl Makefile.PL
Checking if your kit is complete...
Looks good
Writing Makefile for XML::SAX::Base
# make
cp BuildSAXBase.pl blib/lib/XML/SAX/BuildSAXBase.pl
cp lib/XML/SAX/Base.pm blib/lib/XML/SAX/Base.pm
cp lib/XML/SAX/Exception.pm blib/lib/XML/SAX/Exception.pm
Manifying blib/man3/XML::SAX::Base.3pm
Manifying blib/man3/XML::SAX::BuildSAXBase.3pm
Manifying blib/man3/XML::SAX::Exception.3pm
# make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/00basic.t ............. ok
t/01exception.t ......... ok
t/01simpledriver.t ...... ok
  :
t/16gethandlers.t ....... ok
t/release-pod-syntax.t .. skipped: these tests are for release candidate testing
All tests successful.
Files=19, Tests=137,  1 wallclock secs ( 0.09 usr  0.03 sys +  0.50 cusr  0.09 csys =  0.71 CPU)
Result: PASS
# make install
Installing /usr/local/share/perl5/XML/SAX/Exception.pm
Installing /usr/local/share/perl5/XML/SAX/Base.pm
Installing /usr/local/share/perl5/XML/SAX/BuildSAXBase.pl
Installing /usr/local/share/man/man3/XML::SAX::BuildSAXBase.3pm
Installing /usr/local/share/man/man3/XML::SAX::Base.3pm
Installing /usr/local/share/man/man3/XML::SAX::Exception.3pm
Appending installation info to /usr/lib64/perl5/perllocal.pod

XML-SAX-Baseインストール後に再度XML-SAXのmake testを実施します。

# make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/00basic.t ....... Can't locate XML/NamespaceSupport.pm in @INC (@INC contains: /root/hoge/XML-SAX-1.02/blib/lib /root/hoge/XML-SAX-1.02/blib/arch /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /root/hoge/XML-SAX-1.02/blib/lib/XML/SAX/PurePerl.pm line 20.

エラーが発生したので、さらにXML/NamespaceSupport.pmをインストールします。

https://metacpan.org/pod/XML::NamespaceSupport

からtar.gzファイルをダウンロードして展開し、

# perl Makefile.PL

でMakefileを生成します。

# perl Makefile.PL
Checking if your kit is complete...
Looks good
Writing Makefile for XML::NamespaceSupport
# make
cp lib/XML/NamespaceSupport.pm blib/lib/XML/NamespaceSupport.pm
Manifying blib/man3/XML::NamespaceSupport.3pm
# make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/00base.t .. ok
All tests successful.
Files=1, Tests=49,  0 wallclock secs ( 0.03 usr  0.01 sys +  0.02 cusr  0.00 csys =  0.06 CPU)
Result: PASS
# make install
Installing /usr/local/share/perl5/XML/NamespaceSupport.pm
Installing /usr/local/share/man/man3/XML::NamespaceSupport.3pm
Appending installation info to /usr/lib64/perl5/perllocal.pod

XML-NamespaceSupportインストール後に再度XML-SAXのmake testを実施します。

# make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/00basic.t ....... ok
t/01known.t ....... ok
t/10xmldecl1.t .... ok
  :
t/42entities.t .... ok
t/99cleanup.t ..... ok
All tests successful.
Files=16, Tests=113,  2 wallclock secs ( 0.08 usr  0.03 sys +  1.60 cusr  0.18 csys =  1.89 CPU)
Result: PASS
# make install
Appending installation info to /usr/lib64/perl5/perllocal.pod
could not find ParserDetails.ini in /usr/local/share/perl5/XML/SAX

これでインストールでき、冒頭のスクリプトも正常に動作しました。

Comments [0] | Trackbacks [0]

Workflowプラグイン(コンテンツタイプ別の権限設定対応・その他)

December 27,2021 11:55 PM
Category:[ワークフロー]
Tag:[MovableType, Plugin, Workflow]
Permalink

現在販売中のWorkflowプラグイン(MT7版すべてのグレード)について、コンテンツタイプ別の権限設定に対応しました。

1.追加機能

ロール編集画面に「コンテンツデータの作成(承認つき)」および「コンテンツデータの承認」権限を追加しました。

ロール編集画面

この権限を選択した場合、すべてのサイトに適用されます(注:他のユーザーのコンテンツデータも一覧に表示)

また、ロール編集画面のコンテンツタイプ別の権限設定欄にも、「コンテンツデータの作成(承認つき)」および「コンテンツデータの承認」権限を追加しました。

ロール編集画面のコンテンツタイプ別の権限設定欄

この権限を利用した場合、適用したコンテンツタイプのみがユーザーの左メニューに表示されます。

また、「コンテンツデータの作成(承認つき)」を適用したロールのユーザーは、コンテンツデータ一覧には自分のコンテンツデータしか表示されなくなります。

今回の変更により、コンテンツタイプ処理の権限チェックを大幅に見直しました。

たとえば、コンテンツタイプAとコンテンツタイプBがあり、

  1. 承認者ロールX:コンテンツタイプAの承認権限
  2. 承認者ロールY:コンテンツタイプBの承認権限
  3. 承認者ロールZ:コンテンツタイプA・Bの承認権限

という紐づけを行っている場合、ライターがコンテンツデータAの作成を行い、承認依頼を行えるのは、承認者ロールX・Zのユーザーのみに制限されます。

もう少し複雑な設定で、多段階承認で同順位の承認者に上記のように異なる権限の承認者が混在していても、該当のコンテンツタイプに権限のない承認者に承認依頼メールは送信しないようにすることも可能です(=承認依頼時のチェックボックスが非表示になります)。ただし承認・差し戻し時のCcメールは送信されます。

2.その他の追加機能

ライターの編集画面で削除ボタン表示・非表示をプラグイン設定画面で選択可能にしました(お客様によって要望が異なるため)。

ロール作成で、ライター・承認者のロール名を自由に設定できるようにしました。

「多段階+グループ複数承認版」で、承認者が他グループの記事・コンテンツデータを開いた場合、「グループの承認者に属していません。」という警告を表示します。

承認者を設定する前に「ライター(承認つき)」のユーザーが記事を作成しようとした場合、「承認者が設定されていません。」という警告を表示します。

今回の機能追加に伴い、マニュアルも一部見直しました。

3.評価版ダウンロード・購入

評価版ダウンロード・ご購入はWorkflowプラグインのページにアクセスしてください。

Comments [0] | Trackbacks [0]

MTContentNextタグ、MTContentPreviousタグを出力ファイル名(ベースネーム)でソートする方法

December 14,2021 11:55 PM
Category:[コンテンツタイプ]
Tag:[MovableType]
Permalink

MT7のMTContentNextタグ、MTContentPreviousタグを出力ファイル名(ベースネーム)でソートする方法を紹介します。

1.問題点

MTContentNextタグ、MTContentPreviousタグは、デフォルトの機能では「出力ファイル名」でソートすることができないようです。

公式ページでは、MTContentNextタグ、MTContentPreviousタグに設定できるdate_fieldモディファイアの説明として次のようになっています。

'modified_on', 'authored_on', 'created_on' または 日付/時刻型のフィールドの ID, ユニークID, または名前を指定すると、指定されたフィールドの日時よりも新しいコンテンツデータを呼び出します。指定がない場合は、authored_onが利用されます。

ということで、別の手段を使って出力ファイル名でソートする方法を紹介します。

2.出力ファイル名でソートする

ここではMTContentNextタグ、MTContentPreviousタグの代わりに、テンプレートタグを使ってソートする方法を紹介します。

テンプレートは下記になります。このテンプレートをコンテンツタイプアーカイブの任意の位置に設定してください。赤字の「コンテンツタイプ名」には自コンテンツタイプ名を設定してください。

<mt:ContentIdentifier setvar="identifier">
<mt:setvar name="flag" value="0">
<mt:Contents content_type="コンテンツタイプ名" lastn="0" sort_by="identifier" sort_order="ascend">
  <mt:if name="flag" eq="1">
    <mt:setvarblock name="prev_page"><a href="<mt:ContentPermalink>">前のページ</a></mt:setvarblock>
    <mt:setvar name="flag" value="2">
  <mt:elseif name="flag" eq="0">
    <mt:if tag="ContentIdentifier" eq="$identifier">
      <mt:setvar name="flag" value="1">
    <mt:else>
      <mt:setvarblock name="next_page"><a href="<mt:ContentPermalink>">次のページ</a></mt:setvarblock>
    </mt:if>
  </mt:if>
</mt:Contents>
<mt:var name="next_page"> | <mt:var name="prev_page">

3.解説

まず、コンテンツアーカイブページの出力ファイル名をsetvarモディファイアで変数identifierに保持します。

<mt:ContentIdentifier setvar="identifier">

フラグとして使う変数flagに0を設定します。

<mt:setvar name="flag" value="0">

コンテンツデータの情報を取得するブロックタグを実行します。「sort_by="identifier"」を設定しているので、出力ファイル名でソートされます。

<mt:Contents content_type="コンテンツタイプ名" lastn="0" sort_by="identifier" sort_order="ascend">
    :
</mt:Contents>

ブロックタグ内部でMTIfタグを実行します。フラグはまだ0なのでブロック内は実行されません。

  <mt:if name="flag" eq="1">

次にMTElseIfタグを実行します。

  <mt:elseif name="flag" eq="0">

フラグは0なので、MTElseIfブロック内部を実行します。

MTElseIfブロック内部はさらにMTIf文になっています。

    <mt:if tag="ContentIdentifier" eq="$identifier">
      <mt:setvar name="flag" value="1">
    <mt:else>
      <mt:setvarblock name="next_page"><a href="<mt:ContentPermalink>">次のページ</a></mt:setvarblock>
    </mt:if>

MTContentsブロックタグ内で実行している出力ファイル名(tag="ContentIdentifier"の部分)が、現在再構築中のページの出力ファイル名(変数identifier)と等しいか判定します。

    <mt:if tag="ContentIdentifier" eq="$identifier">

等しくなければ、MTElseタグのブロックを実行し、MTContentsブロックタグ内で実行している出力ファイル名を使ったリンクを変数next_pageに保持します。この処理はMTIfタグの出力ファイル名がマッチするまで毎回実施します。つまりマッチする直前のリンクを取得している訳です。

    <mt:else>
      <mt:setvarblock name="next_page"><a href="<mt:ContentPermalink>">次のページ</a></mt:setvarblock>

出力ファイル名がマッチすると、変数flagに1を設定します。

    <mt:if tag="ContentIdentifier" eq="$identifier">
      <mt:setvar name="flag" value="1">

このMTIf文は変数flagが0の場合しか実行されないので、これでMTIf文の処理を終了します。

変数flagが1となったので、外側のMTIfタグブロックが実行され、MTContentsブロックタグ内で実行している出力ファイル名をリンクとして変数prev_pageに保持します。このリンクはつまり、マッチした直後のリンクとなります。さらに変数flagに2を設定します。

  <mt:if name="flag" eq="1">
    <mt:setvarblock name="prev_page"><a href="<mt:ContentPermalink>">前のページ</a></mt:setvarblock>
    <mt:setvar name="flag" value="2">

これでMTContentsブロックタグ内の処理は行われなくなります。

MTContentsブロックタグを抜け、最後に、変数next_pageと変数prev_pageの内容(前後ページのリンク)を出力します。

<mt:var name="next_page"> | <mt:var name="prev_page">

前後ページのリンクはMTContentsブロック内部で表示する方法もあると思いますが、出力ファイル名が最後にマッチした場合など制御が複雑になりそうなので、MTContentsブロック終了後に表示するようにしました。

Comments [0] | Trackbacks [0]
 1  |  2  |  3  |  4  |  5  | All pages