当プラグインのMTクラウドのPerlバージョン5.38.2対応状況
当プラグインのMTクラウドのPerlバージョン5.38.2対応状況です。
1.はじめに
2024年9月4日、Movable Typeクラウド(MT7/MT8)の、Perl5.36.0からPerl5.38.2へのバージョンアップが行われました。
Movable Type クラウド版の Perl のバージョンを変更しました
バージョンアップにあたり、考えられる影響は以下の通りです。
- サードパーティー製プラグインおよび独自CGIスクリプトが正常に機能しなくなる
ということで、当ブログで販売している主なプラグインの動作確認状況です。
2.主なプラグインの対応状況
- Workflow(MT7/MT8):動作確認済
- CSVDataImExporter(MT7/MT8):動作確認済
- PublishDraft(MT7/MT8):動作確認済
- ListingFieldEditor(MT7/MT8):動作確認済
- PowerListingFieldEditor(MT7/MT8):動作確認済
- SaveWithoutRebuild(MT7/MT8):動作確認済
Finaleで2音のトレモロを入力する方法
Finaleで2音のトレモロを入力する方法を紹介します。
なお、米国時間2024年8月26日、Finaleの開発/販売終了がアナウンスされました。
国内販売代理店契約の即日終了に関して
1.問題点
Finale(バージョン27)で冒頭のような2音(またはそれ以上)のトレモロを入力したいのですが、方法がわかりません。
ということで、Finaleで2音のトレモロを入力する方法を紹介します。
2、Finaleで2音のトレモロを入力する
2音のトレモロを入力するには、トレモロさせたい音符を選択。
メニューバーより「プラグイン」→「TG Tools」→「簡易トレモロ...」を選択。
ダイアログが開くので、連桁(れんこう)の本数等を指定して「適用」をクリック。ここでは「2」を設定します。連桁とは連続した音符の旗をつないで記述することです。
これで2音のトレモロが設定できたので、ダイアログの「閉じる」または×印をクリックして閉じます。
3.連桁を符尾から離す
前述の手順では連桁と符尾がつながっています。
ここではさらに冒頭の画像のように連桁を符尾を離す手順を説明します。
連桁を符尾を離したい音符を選択。
メニューバーより「ウインドウ」→「道具箱ツール・パレット」を選択。
右側に表示された「道具箱ツール・パレット」のアイコンより「連桁伸縮ツール」を選択。
選択した音符の符尾の先端にハンドルが表示されるので、どちらかのハンドルをダブルクリック。ハンドルが表示されない場合、符尾のあたりをクリックしてみてください。
ダイアログが開きます。デフォルトでは「8分音符」のみにチェックが入っていると思いますが「16分音符」にもチェックをいれてOKをクリック。
これでハンドルをドラッグすれば連桁を伸縮できます。上下の移動はできないので、ドラッグ位置が上下にずれても問題ありません。
もう一方のハンドルもドラッグします。これで冒頭のトレモロ記号の入力が完成です。
なお、さきほどのダイアログで「16分音符」にチェックをいれずにハンドルを操作すると。一番上の連桁しか操作できません。
4.連桁を符尾から一部離さない
応用ですが、前項のダイアログで「8分音符」のチェックを外し、「16分音符」と「32分音符」をチェックすれば、一番上の連桁を符尾から離さないことも可能です。
セブンイレブンのネットプリント不具合でお金を多く取られた件
セブンイレブンのネットプリント不具合で、お金を多く取られた件の顛末です。
楽譜を印刷しようと、セブンイレブンのネットプリントアプリに、A3白黒、計21枚をに登録(下図)。
ファイルの詳細画面で、カラーモードは白黒に設定していることがわかります。
ネットプリントのA3白黒は、下の料金表にある通り、1枚20円です。
21枚なので合計420円ですが、お金が認識されないことも考えて、小銭で100円玉4枚に50円玉4枚と、やや多めの計600円を持ってセブンへ。
最初100円4枚を入れて、上から順番に印刷を開始すると、投入したお金の残額が早いことに途中で気づきました。
通常、1枚プリントされるごとに20円引かれていくのですが、3ファイル目か4ファイル目で残額が0になってしまったと思います。
なぜなら、プリントを実行しようとしたときに残額不足のエラーが表示されたからです。
最初に400円を投入しているので、21枚であれば、最後のファイル(計3枚)のプリント実行時まで残額不足のエラーは出ないはずです。
「おかしいな?」と思いながらも残りの50円玉も順次投入していき、5ファイル目のときに、たしか残額30円で、最後の50円を投入したと思います。
結局印刷できたのは18枚。最後の1ファイルが印刷できませんでした。
最後に領収書を印刷できるので、印刷すると「600円」と表示されていました。
投入金額は合っているのですが、それに見合う枚数がプリントされていません。
ということで、すぐに店員さんを呼びました。
私「1枚20円のネットプリントで、600円で18枚しか印刷できなかったんですが…」
店員「ちょっと別の者を呼びますのでお待ちください」
少し待って別の店員さんがきました。
私「1枚20円のネットプリントで、600円で18枚しか印刷できなかったんですが…」
店員「?」
この店員さん、店長さんかと思ったら違っていたようです。
また、私の言っていることを理解できていないのか、
店員「600円で18枚…そうですか…」
という感じで、お金を余分にとられていることをわかってもらえてないようです。
残りの1ファイルの印刷画面を見せて、
私「ほら、ネットプリントで3枚で60円なので、1枚20円ですよね?」
店員「あぁ、そうなんですか…」
私「はい、それで(600円の領収書をみせて)600円で18枚しかプリントできなかったんです。600円なら30枚プリントできるはずですよね?」
店員さん、私を疑っているようで、
店員「本当に600円いれました?」
と言われる始末。というか、領収書に600円と記載されてるんですが。
そういう押し問答が続いて、なかなかこちらの意図をくみ取ってもらえないようなので、
私「18枚だと360円なので、240円返金してもらえますか?」
と伝えましたが、お店側が客からお金を余分に取ってしまっている事を理解されてないみたいで、
私「18枚しかプリントしてないので、本来は360円のところ、600円も払ってますよね?」
とアプローチを変えて、なんとか理解してもらえたようで、
店員「本当に18枚ですか?」
私「はい」
店員「念のため数えますね」
と渡したA3用紙を1枚ずつ数えて、レジに現金を取りに行って、240円を返してもらいました。
返金はしてもらいましたし、決して店員さんが悪いわけではないのですが、
「すいませんでした」
という言葉をもらえなかったのは残念ですし、店員さんの態度も、私が悪いことをしたかのような対応で、しぶしぶ返金してくれた感じで、あの店舗にはしばらく行かないと思います。
気のせいかもしれませんが、返してもらった240円も、わざわざ汚い硬貨を選んだかのような汚れっぷりでした。
それよりも、この記事で一番伝えたいのは、セブンイレブンの関係者の方がこの記事を読まれましたら、ネットプリントシステムの不具合と思われるので、一度調査されることをお勧めします(タイトルもあえてそのようにさせてもらいました)。
600円の領収書は、終始不服そうな面持ちの店員さんに、無言で没収されました。
さて、残りの1ファイルですが、その店舗で印刷するとまた事件に巻き込まれそうなので別の店舗でプリントアウトしました。
念のため、残金が正常に表示されるか動画も撮りましたが、大丈夫でした。
みなさんも、セブンイレブンのネットプリントで余分にお金を取られていないか、気をつけてください。
Movable Typeコンテンツタイプの「テキスト表示エリア」について
Movable Typeコンテンツタイプの「テキスト表示エリア」について紹介します。
コンテンツタイプ作成画面の右側一番下に「テキスト表示エリア」というコンテンツフィールドがあります。
編集エリアにドラッグするとテキストエリアが表示されますが、「※このブロックはコメントのため、管理画面でのみ表示されます。」という注釈が記載されています。
ためしに「テスト」と入力して、保存します。
コンテンツデータ編集画面を表示すると、さきほど入力した文字がそのまま表示されました。
これでお分かりになったと思いますが、このフィールドは、コンテンツデータ編集画面に注釈をいれるためのもの、ということです。
脆弱性対応のため、残念ながらHTMLタグは使えない(そのまま表示される)ようです。
mysql_configのインストール
mysql_configのインストール方法を紹介します。
1.問題点
先日のPerl5.38.2のアップデートで、DBD-mysqlのモジュール不足が発生しました。
cpanでインストールできなかったため、アーカイブをダウンロードしてビルドしようとしたところ、下記のエラーが発生しました。
Can't exec "mysql_config": そのようなファイルやディレクトリはありません at Makefile.PL line 85.
色々調べてみて、下記のコマンドを実行してみたのですが、エラーになりました。
# dnf install mysql-community-devel
引数に一致する結果がありません: mysql-community-devel
エラー: 一致するものが見つかりません: mysql-community-devel
ということで、mysql_configのインストール方法を紹介します。
LinuxはCentOS9です。
2.mysql_configのインストール
まず、下記のコマンドでmysql_configが提供されているパッケージを探します。
# dnf provides mysql_config
私の環境では次の4つが表示されました。
# dnf provides mysql_config
メタデータの期限切れの最終確認: 0:23:38 前の 2024年06月14日 12時02分30秒 に実施しました。
mariadb-connector-c-devel-3.1.13-3.el9.i686 : Development files for mariadb-connector-c
Repo : appstream
一致:
ファイル名 : /usr/bin/mysql_config
mariadb-connector-c-devel-3.1.13-3.el9.x86_64 : Development files for mariadb-connector-c
Repo : appstream
一致:
ファイル名 : /usr/bin/mysql_config
mariadb-connector-c-devel-3.2.6-1.el9.i686 : Development files for mariadb-connector-c
Repo : appstream
一致:
ファイル名 : /usr/bin/mysql_config
mariadb-connector-c-devel-3.2.6-1.el9.x86_64 : Development files for mariadb-connector-c
Repo : appstream
一致:
ファイル名 : /usr/bin/mysql_config
この中から適合するパッケージをインストールします。
# dnf install mariadb-connector-c-devel-3.2.6-1.el9.x86_64
実行結果を掲載しておきます。
# dnf install mariadb-connector-c-devel-3.2.6-1.el9.x86_64
メタデータの期限切れの最終確認: 0:24:35 前の 2024年06月14日 12時02分30秒 に実施しました。
依存関係が解決しました。
====================================================================================================================================================================
パッケージ アーキテクチャー バージョン リポジトリー サイズ
====================================================================================================================================================================
インストール:
mariadb-connector-c-devel x86_64 3.2.6-1.el9 appstream 58 k
依存関係のインストール:
mariadb-connector-c x86_64 3.2.6-1.el9 appstream 198 k
openssl-devel x86_64 1:3.2.2-1.el9 appstream 4.4 M
zlib-devel x86_64 1.2.11-41.el9 appstream 45 k
トランザクションの概要
====================================================================================================================================================================
インストール 4 パッケージ
ダウンロードサイズの合計: 4.7 M
インストール後のサイズ: 5.8 M
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
(1/4): mariadb-connector-c-devel-3.2.6-1.el9.x86_64.rpm 443 kB/s | 58 kB 00:00
(2/4): mariadb-connector-c-3.2.6-1.el9.x86_64.rpm 1.3 MB/s | 198 kB 00:00
(3/4): zlib-devel-1.2.11-41.el9.x86_64.rpm 1.2 MB/s | 45 kB 00:00
(4/4): openssl-devel-3.2.2-1.el9.x86_64.rpm 6.8 MB/s | 4.4 MB 00:00
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
合計 3.0 MB/s | 4.7 MB 00:01
トランザクションを確認しています
トランザクションの確認に成功しました。
トランザクションをテストしています
トランザクションのテストに成功しました。
トランザクションを実行しています
準備中 : 1/1
インストール中 : zlib-devel-1.2.11-41.el9.x86_64 1/4
インストール中 : openssl-devel-1:3.2.2-1.el9.x86_64 2/4
インストール中 : mariadb-connector-c-3.2.6-1.el9.x86_64 3/4
インストール中 : mariadb-connector-c-devel-3.2.6-1.el9.x86_64 4/4
scriptletの実行中: mariadb-connector-c-devel-3.2.6-1.el9.x86_64 4/4
検証中 : mariadb-connector-c-3.2.6-1.el9.x86_64 1/4
検証中 : mariadb-connector-c-devel-3.2.6-1.el9.x86_64 2/4
検証中 : openssl-devel-1:3.2.2-1.el9.x86_64 3/4
検証中 : zlib-devel-1.2.11-41.el9.x86_64 4/4
インストール済み:
mariadb-connector-c-3.2.6-1.el9.x86_64 mariadb-connector-c-devel-3.2.6-1.el9.x86_64 openssl-devel-1:3.2.2-1.el9.x86_64 zlib-devel-1.2.11-41.el9.x86_64
完了しました!
3.参考サイト
参考サイトは下記です。ありがとうございました。
pip install mysqlclient returns OSError: mysql_config not found on CentOS9 with Python3.9
Perl5.38.2のインストール
Linux環境にPerl5.38.2をインストールしてみました。
ディストリビューションはCentOS8.1です。
1.ソースのダウンロード
ソースからビルドするので、「Perl Source」のページから「perl-5.38.2.tar.gz」をクリックしてダウンロードします。
2.ビルド
ダウンロードしたアーカイブを解凍して、ディレクトリに移動します。
# tar xvf perl-5.38.2.tar.gz
# cd perl-5.38.2
configureは次のオプションを追加しています。
# sh Configure -des -Dusethreads -Dinc_version_list=none
各オプションの意味は次の通りです。
- sh Configure:Configureをシェルで実行します。Configureはシステムに適したビルド設定を行うためのものです。
- -d:デフォルトの設定を使用することを指示します。ユーザーからの入力を求めずに進行します。
- -e:全ての設定を自動的に進めることを意味します。このオプションによりユーザーは一切の質問に対して「yes」と回答したことになります。
- -s:Silentモードを意味します。通常の動作では進行状況が表示されますが、-sを使用すると出力が抑制されます。
- -Dusethreads:Perlをスレッドサポート付きでビルドすることを指示します。これによりPerlでマルチスレッドプログラミングが可能になります。
- -Dinc_version_list=none:Perlインタープリタが特定のバージョンディレクトリを探さないように設定します。このオプションは、異なるバージョンのPerlモジュールが混在するのを防ぐために使われます。
下記のように実行されます。少し時間がかかります。
# sh Configure -des -Dusethreads -Dinc_version_list=none
First let's make sure your kit is complete. Checking...
Locating common programs...
:
If you compile perl5 on a different machine or from a different object
directory, copy the Policy.sh file from this object directory to the
new one before you run Configure -- this will help you with most of
the policy defaults.
#
完了したら、makeを実行します。これもかなり時間がかかります。
# make
# make test
# make install
パスはまだ古いバージョン(5.26.3)のままです。
# perl -v
This is perl 5, version 26, subversion 3 (v5.26.3) built for x86_64-linux-thread-multi
(with 51 registered patches, see perl -V for more detail)
今回インストールしたPerlは、/usr/local/binにインストールされたようです。
# which perl
/usr/local/bin/perl
# /usr/local/bin/perl -v
This is perl 5, version 38, subversion 2 (v5.38.2) built for x86_64-linux-thread-multi
シンボリックリンクを使って、perlのパスを新しいバージョンのものに書き換えます。古いバージョンのperlはリネームしてバックアップしておきます。
# cd /usr/bin
# ls -l perl
-rwxr-xr-x. 2 root root 14328 5月 12 2019 perl
# mv perl perl-5.26.3
# ln -s /usr/local/bin/perl perl
# ls -l perl
lrwxrwxrwx 1 root root 19 6月 13 22:30 perl -> /usr/local/bin/perl
最後にバージョン確認して、5.38.2になっていればOKです。
# perl -v
This is perl 5, version 38, subversion 2 (v5.38.2) built for x86_64-linux-thread-multi
3.参考サイト
参考サイトは下記です。ありがとうございました。
Movable Typeのブロックエディタ(MTBlockEditor)のカスタムブロックについて
Movable Typeのブロックエディタ(MTBlockEditor)のカスタムブロックの紹介です。
1.はじめに
Movable Type 8からMTBlockEditorがデフォルトのプラグインとなりました。
MTBlockEditorではデフォルトで用意されているブロックの他に、任意のブロック(カスタムブロック)を作成することができます。
ここでは、公式マニュアルに掲載されている「Markdown」ブロックを作ってみたいと思います。
参考:カスタムブロック機能を利用して高機能な Markdown を利用する
2.カスタムブロック(Markdown)の作成
左メニューより「ブロックエディタ」→「カスタムブロック」をクリック。
「新規作成」をクリック。
- 名前:Markdown
- 識別子:markdown
を設定。アイコンは設定しなくて大丈夫です。
「ブロック」の「+ブロックを追加」をクリック。
「テキスト(複数行)」をクリック。
- クラス名:source
- ブロック要素:P
- フォーマット:なし
を設定または選択。「ラベル」「説明」「規定値」は設定不要です。
「カスタムスクリプト」に下記の内容を設定。これがMarkdown記法に対応するためのスクリプトになります。
<script src="https://cdnjs.cloudflare.com/ajax/libs/marked/1.1.0/marked.min.js" integrity="sha256-POA+Q3FC8tyo/jZhQrw40H5mKcWAABdxNeUQ/uhIm4U=" crossorigin="anonymous"></script>
<script>
document.addEventListener("DOMContentLoaded", () => {
if (document.body.dataset.hasCompiledHtml) {
return;
}
const source = document.querySelector(".source").innerHTML;
MTBlockEditorSetCompiledHtml(marked(source));
});
</script>
「コンテナ要素で包む」の「編集した内容をDIV要素で囲む」と「ブロックの追加と削除」の「ブロックの追加と削除を許可する」のチェックを外します。「ブロックの追加と削除を許可する」のチェック有無の違いは3項で説明します。
「プレビューの表示」の「プレビューを表示する」はチェックします。チェックすることで、テキストエリアからフォーカスが外れると、プレビュー表示に切り替わりので分かりやすいと思います。
「保存」をクリックして作成完了です。
3.カスタムブロック(Markdown)の利用
ここではコンテンツデータの「テキスト(複数行)」から利用します。
「フォーマット」から「ブロックエディタ」を選択。
「+ブロックを追加」をクリック。
「Markdown」を選択(「名前」で設定した「Markdown」が表示されます)。
ここに表示されたアイコンは下記のSVGで生成されているようです。
data:image/svg xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'><style>text{font-family:'Arial';font-weight:bold;font-size:405px}</style><circle r='256' cx='256' cy='256' stroke='none' fill='#666'></circle><text x='256' y='274' text-anchor = 'middle' dominant-baseline = 'central' fill='white'>M</text></svg>
Markdown用のテキストエリアが表示されます。テキストエリアにフォーカスがあたったとき、「名前」で設定した「Markdown」がヘッダに表示されます。
設定画面で、「ブロックの追加と削除を許可する」のチェックを入れると、次のようにMarkdownブロック内に他のブロックが追加可能になります。
Markdown記法で入力してみます。「*~*」がイタリック、「**~**」が太字、「***~***」がイタリック+太字です。
フォーカスが外れると、プレビューが表示されます。
設定画面の「プレビューを表示する」のチェックを外せば、フォーカスが外れてもMarkdown記法がそのまま表示されます。
サイトの不具合について
2024年5月22日からページにアクセスすると、他のページに誘導される事象が発生しました。
切り分けのため、2024年5月23日の19時頃にサイトのすべての情報を削除しましたが事象が改善せず、24日にレンタルサーバ会社に問い合わせ、原因が判明したのがその日の昼頃。
24日の午後から手作業でデータを少しずつ復元させ、現在はほぼ通常運用に戻っています。
備忘録で状況を残しておきます。
1.事象の詳細
最初に気づいたのは、トップページ(index.php)の内容が書き換えられる事象でした。
その後、.htaccessが自動生成され、いくつかのページがトップページに誘導される内容が記載されていました。
そこからさらに(トップページに埋め込まれた、暗号化されたスクリプトで)別のページにリダイレクトされていました。
それらのファイルを削除したり、再構築で上書きしても、すぐに元の内容に書き換えられてしまいます。
topコマンドやpsコマンドでプロセスを確認しても怪しいプロセスはありません。
www配下のすべてのページをバックアップ後、削除しましたが、index.phpや.htaccessが自動生成される事象が解消ぜず、rootユーザーで実行されていると推測し、レンタルサーバ会社のサポートにチャットで問い合わせ。
借りているレンタルサーバのプランには、rootに昇格する権限はありませんでした。
上記の状況を伝えたところ、rootで不審なプロセスが動作していたようで、プロセスを削除して頂き、ようやく事象が解消しました。
その後、MTを新規インストールしてブログの再構築を実施し、画像等のアセットはバックアップデータから丸ごと復元せず、ひとつずつ確認しながら戻しています。
2.原因と対処
おそらく、契約しているアカウントのログインパスワードを破られた後、rootのパスワードも破られて該当のプロセスが仕掛けられたものと思われます。
サポートから「現在動作プロセスが残っております」と言われたのですが、こちらで確認できる範囲のプロセスに該当するものがないことを伝えたところ、サポート側でプロセスを削除して頂けました。
3.今後の対応
サーバログインパスワードはかなり強固なものを設定していましたが、今後は定期的に変更したいと思います。
Movable Typeのダッシュボードプラグインの作り方
Movable Typeのダッシュボードプラグインの作り方を紹介します。
1.はじめに
ダッシュボードプラグインを作る機会があったので、サンプルを使って作り方をまとめてみました。
ここでは下記のサンプルを紹介します。
ユーザーダッシュボードに「サンプルダッシュボードウィジェット」を表示します。
選択すると、下記のようにログインしたユーザー名を表示します。
×印をクリックすると、ウィジェットが削除されます。
このサンプルプラグインの構造は次の通りです。
DashboardSample
├ config.yaml
├ lib
│ └ DashboardSample
│ └ CMS.pm
└ tmpl
└ sample.tmpl
サンプルは下記のURLよりダウンロードできます。
以下、それぞれのファイルについて解説します。
2.config.yaml
下記にサンプルを示します。
name: DashboardSample
id: DashboardSample
widgets:
DashboardSample:
label: サンプルダッシュボードウィジェット
# plugin: $DashboardSample
template: sample.tmpl
order: 1000
singular: 1
set: main
handler: $DashboardSample::DashboardSample::CMS::test
view:
- user
主な項目の意味は次の通りです。
- template:ダッシュボード用テンプレートファイル名
- order:表示順序
- singular:単独表示("1"固定。プルダウンから選択・表示したあと、プルダウンの候補から外すためのもの)
- set:表示領域(main:中央/sidebar:右カラム)
- handler:ダッシュボード表示用ハンドラ名
- view:表示種別(user:ユーザーダッシュボード/system:システム管理画面/website:親サイト/blog:子サイト)
"plugin"という項目もありますが、記述無しでも動作するようなのでコメントアウトしています。
記述する場合は、サンプルのように「id:」の値を"$"つきで記述してください。
3.sample.tmpl
下記にサンプルを示します。
<mtapp:widget
id="DashboardSample"
class="widget DashboardSample"
label="サンプルダッシュボードウィジェット"
can_close="1">
<p><mt:var name="name"></p>
</mtapp:widget>
ここではパラメータ「name」の値だけを表示するようにしています。
<p><mt:var name="name"></p>
ダッシュボードを表示したあとに×印で削除できるようにするには、mtapp:widgetタグに「can_close="1"」を付与します。
4.CMS.pm
下記にサンプルを示します。
package DashboardSample::CMS;
use strict;
use warnings;
sub test {
my $app = shift;
my ( $tmpl, $param ) = @_;
my $user = $app->user;
}
1;
sample.tmplの"name"に値を渡すために、下記の1行を追加しています。
$param->{name} = $user->nickname;
Movable Type検索結果画面のMTIncludeタグでファイルを読み込む方法
Movable Type検索結果画面のMTIncludeタグでファイルを読み込む方法を紹介します。
1.はじめに
MTで再構築するファイルの拡張子を".php"にして、そのページの中で頻繁に更新される部分を、
<?php include('foo.html'); ?>
で読み込むことで、ページ全体の再構築不要で情報を更新することができます。
ただ、検索結果ページはPerlのCGIで動作するため、PHPの方法を利用することができません。
ということで、検索結果画面のMTIncludeタグでファイルを読み込む方法を紹介します。
2.検索結果画面のMTIncludeタグでファイルを読み込む
1項のfoo.phpのパスを、仮に「/var/www/html/foo.html」とします。
このファイルを検索結果画面のMTIncludeタグで読み込むには、下記の手順が必要です。
まず、mt-config.cgiに
AllowFileInclude 1
を設定します(注:4項参照)。
次に、ファイル読み込み部分を次のようにします。
<$mt:Include file="/var/www/html/foo.html"$>
これで、検索結果画面でも情報を更新する部品を利用することができます。
3.サイトパスにテンプレートタグを使用する
2項ではファイルパスに「/var/www/html」を直接記述しましたが、テンプレートタグでサイトパスを取得するには次のように記述します。
<mt:Setvarblock name="foo"><$mt:SitePath$>/foo.html</mt:setvarblock>
<$mt:Include file="$foo"$>
1行目のMTSetVarBlockタグで、サイトパスとファイル名を文字列結合したものを、変数fooに設定します。
2行目のMTIncludeタグで、fileモディファイアに「$foo」と書くことで、変数fooの内容が展開され、
<$mt:Include file="/var/www/html/foo.html"$>
と同じ結果となります。
4.注意事項
AllowFileIncludeはセキュリティ対策として、デフォルトで無効(=0)となっています。
理由は「テンプレート編集の権限だけをもつユーザーが、ファイルシステム上の任意のファイルを読み出せるのは問題であるため」のようです。
このカスタマイズを利用する場合は、上記のセキュリティに十分配慮してください。
ansibleのcopyモジュールでディレクトリを生成する方法
ansibleのcopyモジュールでディレクトリを生成する方法を紹介します。
1.問題点
ansibleのcopyモジュールでファイルをコピーしたいのですが、コピー先のディレクトリがなく、エラーになります。
試したのは下記の2種類です。
test.yml
---
- name: テスト
copy:
src: /tmp/hoge.txt
dest: /tmp/aaa/bbb/hoge.txt2
remote_src: yes
または
---
- name: テスト
copy:
src: /tmp/hoge.txt
dest: /tmp/aaa/bbb
remote_src: yes
これを実行すると、下記のように"Destination directory /tmp/aaa/bbb does not exist"というエラーになります。
$ ansible-playbook -i inventory test.yml
PLAY [act] ***************************************************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************************
ok: [server]
TASK [test : test.ymlをインクルード] *************************************************************************************************************
included: /var/tmp/ansible/roles/test/tasks/test.yml for server
TASK [test : テスト] *****************************************************************************************************************************
fatal: [server]: FAILED! => {"changed": false, "msg": "Destination directory /tmp/aaa/bbb does not exist"}
TASK [test : エラーが発生したため停止] ***********************************************************************************************************
fatal: [server]: FAILED! => {"changed": false, "msg": "ロール実行中にエラー発生"}
PLAY RECAP ***************************************************************************************************************************************
server : ok=2 changed=0 unreachable=0 failed=1 skipped=0 rescued=1 ignored=0
ということで、ansibleのcopyモジュールでディレクトリを生成する方法を紹介します。
2.ansibleのcopyモジュールでディレクトリを生成する
ansibleのcopyモジュールでディレクトリを生成するには、destオプションを"/"で終わらせます。
---
- name: テスト
copy:
src: /tmp/hoge.txt
dest: /tmp/aaa/bbb/
remote_src: yes
このansibleを実行すると正常にディレクトリを生成してくれます。
$ ansible-playbook -i inventory test.yml
PLAY [act] ***************************************************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************************
ok: [server]
TASK [test : test.ymlをインクルード] *************************************************************************************************************
included: /var/tmp/ansible/roles/test/tasks/test.yml for server
TASK [test : テスト] *****************************************************************************************************************************
changed: [server]
PLAY RECAP ***************************************************************************************************************************************
server : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
jQuery+ajaxでモーダルのコンテンツを取得する方法
jQuery+ajaxでモーダルのコンテンツを取得する方法を紹介します。
1.はじめに
モーダル表示の使い方は、たとえば商品ページで、その商品の詳細画像を表示するといったことが多いと思います。
その場合、HTMLページ内にすべてのモーダル用コンテンツを配置して、そこから取得・表示する実装になると思います。
ですが、ページ内にモーダル用のコンテンツをすべて記述すると、場合によってはページのサイズが大きくなり、ロード時間に影響します。
また商品ページではなく、たとえばモーダルをブログの記事ページとして表示させたい場合、上記の方法では大量のコンテンツをページ内に書き出す必要がありますが、現実的ではありません。
ということで、本記事ではモーダル用コンテンツをjQuery+ajaxで取得し、さらの前後リンクのコンテンツもjQuery+ajaxで取得する方法を紹介します。
2.サンプル
下記のリンクをクリックするとサンプルページに遷移します。
テキスト途中にある「ひらく」をクリックするとモーダルが表示され、前後リンクをクリックするとコンテンツをajaxで読み出して表示を切り替えます。
「あああ」のテキストを大量に挿入しているのは、モーダル表示後にスクロールしてもモーダルが移動しないことを示すためのものです。
サンプルはモーダルコンテンツの取得と前後リンクだけに着目しているので、CSSは最小限です。またアニメーションや「閉じる」ボタンの実装もありません。
以下、ソースとjQueryの解説です。
3.ソース
<meta charset="UTF-8" />
<style>
#modal {
display: block;
position: fixed;
opacity: 1;
z-index: 11000;
left: 45%;
margin-left: -77px;
top: 100px;
}
#modal_content {
border: 1px solid #000000;
padding: 30px;
}
#left {
position: absolute;
top: 100px;
left: -170px;
}
#right {
position: absolute;
top: 100px;
right: -170px;
}
</style>
<script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
<script>
$(function(){
$(".open_modal").on('click', function(){
var url = $(this).attr('data-url');
$.ajax({
type: "POST",
url: url,
dataType: "html"
}).done(function(data) {
let main = $($.parseHTML(data)).filter('#main').html();
let prev = $($.parseHTML(data)).filter('#previous').text();
let next = $($.parseHTML(data)).filter('#next').text();
$('#modal_content').html(main);
if ( prev ) {
$('#left').attr('data-url', prev);
$('#left').css('display', 'block');
} else {
$('#left').css('display', 'none');
}
if ( next ) {
$('#right').attr('data-url', next);
$('#right').css('display', 'block');
} else {
$('#right').css('display', 'none');
}
$('#modal').css('display', 'block');
});
});
});
</script>
r />あああ</p>
<p>あああ<br />あああ<br />あああ<br />あああ<br />あああ<br />あああ<br />あああ<br />あああ<br />あああ<b
r />あああ</p>
<p>あああ<br />あああ<br />あああ<br />あああ<br />あああ<br />あああ<br />あああ<br />あああ<br />あああ<b
r />あああ</p>
<p>あああ<br />あああ<br />あああ<br />あああ<br />あああ<br />あああ<br />あああ<br />あああ<br />あああ<b
r />あああ</p>
<div class="open_modal" data-url="https://www.koikikukan.com/samples/20240313/test1.html">ひらく</div>
r />あああ</p>
<p>あああ<br />あああ<br />あああ<br />あああ<br />あああ<br />あああ<br />あああ<br />あああ<br />あああ<b
r />あああ</p>
<p>あああ<br />あああ<br />あああ<br />あああ<br />あああ<br />あああ<br />あああ<br />あああ<br />あああ<b
r />あああ</p>
<p>あああ<br />あああ<br />あああ<br />あああ<br />あああ<br />あああ<br />あああ<br />あああ<br />あああ<b
r />あああ</p>
<div id="modal" style="display:none;">
<div class="open_modal" id="left" data-url=""><</div>
<div class="open_modal" id="right" data-url="">></div>
<div id="modal_content"></div>
</div>
4.解説
「ひらく」のclass属性"open_modal"をclickイベントで待ち合わせます。
<div class="open_modal" data-url="https://www.koikikukan.com/samples/20240313/test1.html">ひらく</div>
:
<script>
$(function(){
$(".open_modal").on('click', function(){
クリックされると要素内のdata-url属性値に設定したURLをattrメソッドで取得します。
var url = $(this).attr('data-url');
data-urlの値は下記のdata()でも取得できますが、この方法ではDOMのキャッシュが誤って取得されてしまうため、この記事の執筆時点ではdata()は絶対に使わないでください(この事象で2日ほど悩みました)。
var url = $(this).data('url');
取得したURLでコンテンツをajaxで取得します。
$.ajax({
type: "POST",
url: url,
dataType: "html"
$.ajax以外に$getでも取得可能です。
なお非同期による取得ではキャッシュが取得されてしまうこともあるので、POSTメソッドを使用する、cacheオプションをfalseにする等の対処を行ってください。
取得したコンテンツをそのままHTMLに展開できないケースを考慮して、部分取得を行います。
ここではコンテンツ部分と前後リンク部分をparseHTML()とfilter()を使います。この方法がベストプラクティスと思われます。
}).done(function(data) {
let main = $($.parseHTML(data)).filter('#main').html();
let prev = $($.parseHTML(data)).filter('#previous').text();
let next = $($.parseHTML(data)).filter('#next').text();
取得したHTMLをモーダルに反映します。
$('#modal_content').html(main);
URLを前後リンクに反映させます。このときも前述と同様の理由でdata()ではなく、attr()を使用してください。リンクがない場合は非表示にしています。
if ( prev ) {
$('#left').attr('data-url', prev);
$('#left').css('display', 'block');
} else {
$('#left').css('display', 'none');
}
if ( next ) {
$('#right').attr('data-url', next);
$('#right').css('display', 'block');
} else {
$('#right').css('display', 'none');
}
すべての設定が終わったらdisplayプロパティを使ってモーダル全体を表示します。
$('#modal').css('display', 'block');
ansibleでフィンガープリントを表示させない方法
ansibleでフィンガープリントを表示させない方法を紹介します。
1.問題点
ansibleでログイン経験がないサーバにログインをすると、下記のような「フィンガープリント」が表示されます。
The authenticity of host '[127.0.0.1]:22 ([127.0.0.1]:22)' can't be established.
RSA key fingerprint is SHA256:1pOx1qnpCf9UfJQPVaMRfJV/6LZkHWQXljHwwYGlN1g.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
ansible実行時にフィンガープリントを表示させないのですが、方法がわかりません。
ということで、ansibleでフィンガープリントを表示させない方法を紹介します。
2.ansibleでフィンガープリントを表示させない
ansibleでフィンガープリントを表示させないようにするには、ansible.cfgに下記の設定を追加します。
[ssh_connection]
ssh_args = '-o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null'
オプションの意味は次の通りです。
- ControlMaster=auto:sshのセッションが存在するときにそのセッションを再利用する仕組み
- ControlPersist=60s:ControlMasterをバックグランドにまわしてくれる機能
- StrictHostKeyChecking=no:ホストの~/.ssh/known_hostsに存在しないときに確認なしに接続し、フィンガープリントは確認なしにknown_hostsに記録されます
- UserKnownHostsFile=/dev/null:ホストの~/.ssh/known_hostsを常に空(/dev/null)にすることで、サーバ交換等でフィンガープリントが変わったときにエラーとなってしまうのを回避します
FFmpegをWindowsにインストールする方法
FFmpegをWindowsにインストールする方法を紹介します。
1.はじめに
Windows端末で「ScreenToGif」という、デスクトップキャプチャで取得した動画をMP4で保存しようとしたら、「FFmpegのパスが通っていません」と警告が表示されました。
FFmpeg自体インストールした記憶がないので、本記事でFFmpegをWindowsにインストールする方法を紹介します。
ちなみに、FFmpegはオープンソースのマルチメディアフレームワークで、主にコマンドラインツールとして動作し、多くの音声・動画フォーマットに対応した、ストリームの保存や変換が可能です。
2.FFmpegのダウンロード
FFmpegのページにアクセスして「Download」をクリック。
Windowsのアイコンをクリック。
「Windows builds by BtbN」をクリック。
「ffmpeg-master-latest-win64-gpl.zip」をクリック。
ダウンロードしたアーカイブを展開し、ここでは
C:\Program Files (x86)\ffmpeg
となるように配置します。
2.パスを通す。
タスクバーの検索フィールドに「システムの詳細設定」を入力して、「システムの詳細設定の表示」をクリック。
「環境変数」をクリック。
「xxのユーザー環境変数」の「Path」を選択した状態で「編集」をクリック。
「新規」をクリック。
今回は下記のパスを追加して「OK」をクリック。
C:\Program Files (x86)\ffmpeg\bin
前の画面も「OK」をクリックして、すべて閉じます。
3.動作確認
コマンドプロンプトを開いて、下記のコマンドを実行。
ffmpeg -version
パスが正常に通っていれば、下記のメッセージが表示されます。
これでFFmpegのインストール完了です。
シェルスクリプトのexpectで応答メッセージを振り分ける方法
シェルスクリプトのexpectで確認メッセージを振り分ける方法を紹介します。
1.問題点
シェルスクリプトを使ってパスワード入力が必要なコマンド(scp)を実行するためにexpectを使っています(下記)。
#!/bin/bash
expect -c "
spawn scp /home/foo/abc.txt foo@172.16.5.10:/home/foo
expect \"Are you sure you want to continue connecting (yes/no)?\"
send \"yes\n\"
expect \"password:\"
send \"hoge\n\"
interact
"
ですが、確認メッセージが2パターンあり、それらを振り分ける方法がわかりません。
具体的には、
% scp /home/foo/abc.txt foo@172.16.5.10:/home/foo
というコマンドを実行すると、初回は、
Are you sure you want to continue connecting (yes/no)?
と聞かれて、そのあと
password:
を聞かれるのですが、2回目以降は、
password:
しか聞かれません。
ということで、シェルスクリプトのexpectで確認メッセージを振り分ける方法を紹介します。
2.シェルスクリプトのexpectで確認メッセージを振り分ける
確認メッセージを振り分けるには、次のように書き換えます。
#!/bin/bash
expect -c "
spawn scp /home/foo/abc.txt foo@172.16.5.10:/home/foo
expect {
\"Are you sure you want to continue connecting (yes/no)?\" {
send \"yes\n\"
expect \"password:\"
send \"hoge\n\"
} \"password:\" {
send \"hoge\n\"
}
}
interact
"
具体的には、expect節で全体を括り、その中にifのthen節とelse節のように確認メッセージを分けて記述します。