シェルスクリプトのexpectで応答メッセージを振り分ける方法

February 13,2024 11:55 PM
Category:[bash]
Tag:[bash, expect]
Permalink

シェルスクリプトの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節のように確認メッセージを分けて記述します。

Comments [0] | Trackbacks [0]

Adobe Acrobat Reader(Adobe Reader)で電子印鑑を押印する方法

January 30,2024 11:55 PM
Category:[Acrobat]
Tag:[Acrobat, Adobr]
Permalink

Adobe Acrobat Reader(Adobe Reader)で電子印鑑を押印する方法を紹介します。

1.電子印鑑の用意

電子印鑑は有料・無料など色々なサイトで作ることができます。

ここでは、画像の印鑑データを透過したり、テキスト打ち込みで印鑑が作れる「印鑑透過」で作ったものを利用します。

STORES」というサイトでも無料ダウンロードできるようです。

2.PDFに電子印鑑を押印する

印鑑を押印したいPDFファイルを開き、「すべてのツール」タブの「入力と署名」または「電子サイン」をクリック。

「イニシャルを追加」をクリック。

「画像」をクリック。

電子印鑑にしたい画像を選択すると枠内に表示されるので「適用」をクリック(ここでサイズ等の調整はできません)。

なお、この印鑑を毎回使いたい場合は画面左下の「イニシャルを保存」をチェックしておくと便利です。ここではチェックした状態で進めます。

「適用」をクリックすると、PDFに適用した電子印鑑が表示され、マウスで移動できる状態になります。

位置を決めてクリックすると印鑑が固定されます。

印鑑に編集ボックスが表示されます。「A」は印鑑の拡大・縮小、ゴミ箱は印鑑の削除です。

その右の「…」は印鑑ではないイニシャル等におきかえるものです。

これでPDFを保存すれば、電子印鑑が捺印された状態になります。

次回以降は「電子サイン」に選択した印鑑が表示されるので、印鑑をクリックするだけでPDFに表示されます。×印をクリックすれば登録を解除できます。

Comments [0] | Trackbacks [0]

ansibleのインベントリに設定した変数にアクセスする方法

January 26,2024 11:55 PM
Category:[ansible]
Tag:[ansible]
Permalink

ansibleのインベントリに設定した変数にアクセスする方法を紹介します。

1.問題点

ansibleで下記のインベントリを作成しました。

test00 ansible_host=192.168.0.10
test01 ansible_host=192.168.0.11
 
[all:vars]
ansible_user=test
ansible_ssh_pass=test
 
[server1]
test00
 
[server2]
test01
 
[server1:vars]
hoge=1
 
[server2:vars]
hoge=2

このインベントリでserver1ホスト指定で実行するときに、server2の変数hoge

[server2:vars]
hoge=2

の値を参照したいのですが、方法が分かりません。

ということで、ansibleのインベントリに設定した変数にアクセスする方法を紹介します。

2.ansibleのインベントリに設定した変数にアクセスする

ansibleのインベントリに設定した変数にアクセスするには、下記のように指定します。

hostvars[groups['server1'][0]]['hoge']

例:

- name: コマンド実行
  command:
    cmd: echo {{ hostvars[groups['server1'][0]]['hoge'] }}
  register: result
 
- name: "結果出力"
  debug:
    msg: "{{ result.stdout_lines }}"
Comments [0] | Trackbacks [0]

小粋空間プラグインのMovable Type8対応状況

December 31,2023 12:03 AM
Category:[自作プラグイン]
Tag:[MovableType, MT8, Plugin]
Permalink

小粋空間で販売させて頂いているプラグインのMovable Type8対応状況です。

Workflow

コンテンツデータ・記事・ウェブページで承認ワークフローを実現します。多段階承認やグループ別承認、複数承認も可能です。
すべてのグレードでMT8に対応しました。

CSVDataImExporter

CSV形式でMovable Typeのコンテンツデータ・記事・ウェブページデータのエクスポート・インポートが可能になるプラグインです。
通常版・機能拡張版、いずれもでMT8に対応しました。

SaveWithoutRebuild

Movable Typeでコンテンツデータや記事保存時に再構築を行わないためのプラグインです。
MT8に対応しました。

ListingFieldEditor

コンテンツデータや記事のカスタムフィールドのデータを一覧画面で編集できるプラグインです。
MT8に対応しました。

PowerListingFieldEditor

コンテンツデータや記事のカスタムフィールドのデータを一覧画面で一括編集できるプラグインです。
MT8に対応しました。

価格について

いずれも価格はMT7から据え置きですが、今後機能追加や機能差分等で改修を伴う場合は価格を変更させて頂くかもしれません。

その他

他のプラグインも随時、MT8に対応させて頂く予定です。

Comments [0] | Trackbacks [0]

VirtualBoxにisoファイルをマウントしてローカルリポジトリでdnfを利用する方法

December 28,2023 11:55 PM
Category:[VirtualBOX]
Tag:[]
Permalink

VirtualBoxにisoファイルをマウントしてローカルリポジトリでdnfを利用する方法を紹介します。

ここではWindowsマシンにVirtualBoxをインストールしてCentOSのゲストOSを作成し、Windowsのフォルダにisoファイルを配置している前提で進めます。

利用したいisoファイルは事前に入手し、Windowsの任意のフォルダにダウンロードしておいてください。

1.isoファイルのマウント

該当のゲストOSが停止・選択している状態で、VirtualBoxマネージャーの「設定」をクリック。

「ストレージ」をクリック。

「コントローラーIDE」にisoファイルを設定します。この例ではすでに設定してしまっているので、すいませんが他の記事を参考に設定してください。

また、このサンプルではCentOSのisoのみを設定していますが、デフォルトではVBoxGuestAdditions.isoがマウントされている可能性があります。その状態で後続のマウントを実施すると期待する結果にならないようなので、マウントしたいisoのみにしてください。

そしてゲストOSを起動して、/media配下にcdromディレクトリを作成し、mountコマンドを実行します。

# cd /media
# mkdir cdrom
# mount /dev/cdrom /media/cdrom
mount: /media/cdrom: 警告: デバイスは書き込み禁止です、読み込み専用でマウントします.

これで/media/cdrom配下が下記の状態になればOKです。

# pwd
/media/cdrom
# ls
AppStream  BaseOS  EFI  TRANS.TBL  images  isolinux  media.repo

2.リポジトリの設定変更

デフォルトでは外部のリポジトリを参照する設定になっているので、それらを変更します。

ちなみに、何も設定していない状態でdnf listを実行すると、次のようなエラーになります。

# dnf repolist
CentOS-8 - AppStream                              6.8  B/s |  38  B     00:05
repo 'AppStream' のメタデータのダウンロードに失敗しました。
エラー: repo 'AppStream' のメタデータのダウンロードに失敗しました。

/etc/yum.repos.d/CentOS-AppStream.repoのenabledを1(有効)から0(無効)に変更します(★の行、以下同様)。

/etc/yum.repos.d/CentOS-AppStream.repo

 :
[AppStream]
name=CentOS-$releasever - AppStream
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=AppStream&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/AppStream/$basearch/os/
gpgcheck=1
enabled=0★
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

/etc/yum.repos.d/CentOS-Base.repoのenabledを1(有効)から0(無効)に変更します。

/etc/yum.repos.d/CentOS-Base.repo

 :
[BaseOS]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=BaseOS&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/BaseOS/$basearch/os/
gpgcheck=1
enabled=0★
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

/etc/yum.repos.d/CentOS-Extras.repoのenabledを1(有効)から0(無効)に変更します。

/etc/yum.repos.d/CentOS-Extras.repo

 :
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/extras/$basearch/os/
gpgcheck=1
enabled=0★
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

/etc/yum.repos.d/CentOS-Media.repoのenabledを0(無効)から1(有効)に変更します。

/etc/yum.repos.d/CentOS-Media.repo

 :
[c8-media-BaseOS]
name=CentOS-BaseOS-$releasever - Media
baseurl=file:///media/CentOS/BaseOS
        file:///media/cdrom/BaseOS
        file:///media/cdrecorder/BaseOS
gpgcheck=1
enabled=1★
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
 
[c8-media-AppStream]
name=CentOS-AppStream-$releasever - Media
baseurl=file:///media/CentOS/AppStream
        file:///media/cdrom/AppStream
        file:///media/cdrecorder/AppStream
gpgcheck=1
enabled=1★
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

これで、dnfコマンドでローカルリポジトリが利用できるようです。

# dnf repolist
CentOS-BaseOS-8 - Media                         154 MB/s | 2.2 MB     00:00
CentOS-AppStream-8 - Media                      177 MB/s | 5.4 MB     00:00
repo id                          repo の名前                               状態
c8-media-AppStream               CentOS-AppStream-8 - Media                4,755
c8-media-BaseOS                  CentOS-BaseOS-8 - Media                   1,659
Comments [0] | Trackbacks [0]

MovableTypeプラグインの独自CGIをNginxに対応させる方法

December 24,2023 11:55 PM
Category:[トラブルシューティング]
Tag:[MovableType, Plugin, TroubleShooting, Workflow]
Permalink

MovableTypeプラグインの独自CGIをNginxに対応させる方法を紹介します。

これはMovable Type Advent Calendar 2023の24日目の記事です。

1.はじめに

以前、Workflowプラグインの独自CGI(mt-preview.cgi)がNginx環境に対応しておらず、アクセスすると「Not Found」というお客様からの申告があり、そのときの対処方法を備忘録で残しておきます。

MTプラグインで独自CGIを実装される方は、変更後または追加部分のみ参照されればよいかと思います。

冗長な修正があるかもしれませんが、実際に修正して回復した内容ということでそのまま掲載しておきます。

2.対処方法

まず。独自CGIの下記の1行を修正。

変更前

use MT::Bootstrap App => 'Workflow::App';

変更後

use MT::Bootstrap App => 'MT::App::Workflow';

config.yamlに"key"を追加。

key: Workflow

プラグインアプリケーション(独自CGI)の定義を丸々追加。ここでは、

  • handler
  • script
  • cgi_path

の3項目を定義します。

applications:
    workflow:
        handler: MT::App::Workflow
        script: '$Workflow::MT::App::Workflow::script_name'
        cgi_path: >
            sub {
                my $path = MT->config->CGIPath;
                $path =~ s!/$!!;
                $path =~ s!^https?://[^/]*!!;
                $path .= '/plugins/Workflow';
                return $path;
            }

エラーが発生した状態のCGI(Workflow.pm)はMT::App::CMSを継承していたのを、MT::Appを継承するように変更。

変更前

use base qw( MT::App::CMS );

変更後

use base qw( MT::App );

それに伴い、lib/Workflow/App.pm → lib/MT/App/Workflow.pm に移動。

移動したWorkflow.pm に、idとscript_nameを追加。

sub id {'workflow'}
sub script_name {'mt-preview.cgi'}

修正前はinit_requestしかなかったので、initを追加し、旧init_requestのadd_methodsをinitに移動。

変更前(抜粋)

sub init_request {
    my $app = shift;
    $app->SUPER::init_request(@_);
    $app->add_methods( preview => \&preview );
    $app->{ default_mode } = 'main';
    $app->{ requires_login } = 0;
}

変更後(抜粋)

sub init {
    my $app = shift;
    $app->SUPER::init(@_);
    $app->add_methods( preview => \&preview );
    $app->{ default_mode } = 'main';
    $app;
}
sub init_request {
    my $app = shift;
    $app->SUPER::init_request(@_);
    $app->{requires_login} = 0;
}

これで独自CGIがNginxで動作するようになりました。

Comments [0] | Trackbacks [0]

メール送信で「smtp-source: fatal: connect: Connection refused」となる場合の対処

December 14,2023 11:55 PM
Category:[VPS]
Tag:[VPS]
Permalink

メール送信で「smtp-source: fatal: connect: Connection refused」となる場合の対処方法を紹介します。

1.問題点

以前、「さくらのVPSに送信メールサーバを設定する方法」で紹介した、メールサーバからメールがとばなくなりました。

具体的には、テストメールを送信すると、下記のように「Connection refused」となります。

# smtp-source -v -f "" -t "hoge@xxx.so-net.ne.jp" 127.0.0.1:25
smtp-source: name_mask: all
smtp-source: fatal: connect: Connection refused

ということで、メール送信で「smtp-source: fatal: connect: Connection refused」となる場合の対処方法を紹介します。

2.原因

単純に、何かの拍子にサービスが停止してしまっただけのようです。

netstatで確認したところ、25番ポートも開いていないようでした。

# netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN
 :
tcp        0      0 :::80                       :::*                        LISTEN
tcp        0      0 :::22                       :::*                        LISTEN

ということで、サービス起動で解消しました。

# service postfix start
Starting postfix:                                          [  OK  ]

25番ポートも開きました。

# netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:25                  0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN
  :
tcp        0      0 :::80                       :::*                        LISTEN
tcp        0      0 :::22                       :::*                        LISTEN
tcp        0      0 :::25                       :::*                        LISTEN

ちなみにサービスを起動したところ、サービス停止で滞留していたメールが一斉に送信されたようです。

Comments [0] | Trackbacks [0]

MovableTypeのDataAPIでコンテンツデータをモーダル表示させる方法

December 7,2023 11:55 PM
Category:[DataAPI]
Tag:[DataAPI, MovableType]
Permalink

MovableTypeのDataAPIでコンテンツデータをモーダル表示させる方法を紹介します。

1.サンプル

下記のテンプレートをコピーしてインデックステンプレートとして再構築してください。

サンプルでは、デフォルトの「Site Page」コンテンツデータの一覧を表示して、リンクをクリックすると取得したデータ(JSON)をモーダル表示させます。

ユーザー、Webサービスパスワード、クライアントID、サイトID、コンテンツタイプIDは適宜書き換えてください。

<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.13.2/themes/smoothness/jquery-ui.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min.js"></script>
<script src="<$mt:StaticWebPath$>data-api/v4/js/mt-data-api.min.js"></script>
 
<mt:Contents content_type="Site Page">
<mt:ContentsHeader><dl></mt:ContentsHeader>
     <dt><$mt:ContentLabel$></dt>
     <dd><mt:ContentField content_field="Title"><a href="javascript:void(0);" class="mtlink" data-id="<mt:ContentID>"><$mt:ContentFieldValue$></a></mt:ContentField></dd>
<mt:ContentsFooter></dl></mt:ContentsFooter>
</mt:Contents>
 
<div id="main" style="display:none;">
<p id="hoge"></p>
</div>
 
<script>
$(function() {
    var accessToken;
 
    $.ajax({
        url: "<$mt:CGIPath$><$mt:DataAPIScript$>/v<$mt:DataAPIVersion$>/authentication",
        type: "POST",
        dataType: "json",
        data: {
            'username': 'ユーザー名',
            'password': 'ユーザーのWebサービスパスワード',
            'clientId': '任意のID'
        }
    }).done(function(data){
        accessToken = "MTAuth accessToken=" + data.accessToken;
    });
 
    $(".mtlink").click(function(){
        $('#hoge').text('');
        var content_data_id =  $(this).data('id');
 
        $("#main").dialog({
            open: function(event, ui) {
 
                // コンテンツデータ取得
                $.ajax({
                    url: "<$mt:CGIPath$><$mt:DataAPIScript$>/v<$mt:DataAPIVersion$>/sites/1/contentTypes/1/data/" + content_data_id,
                    type: "GET",
                    dataType: "json",
                    headers: {
                        'X-MT-Authorization': accessToken
                    }
                }).done(function(data){
                  $('#hoge').text(JSON.stringify(data));
                });
            },
            modal:true, //モーダル表示
            title:"テスト", //タイトル
            width: 900,
            height: 500,
        });
    });
});
</script>

2.解説

必要なライブラリを引き込みます。

<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.13.2/themes/smoothness/jquery-ui.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min.js"></script>
<script src="<$mt:StaticWebPath$>data-api/v4/js/mt-data-api.min.js"></script>

コンテンツデータの一覧を表示します。data-id属性にコンテンツデータIDを設定。リンクはページ遷移しないようにしておきます。

<mt:Contents content_type="Site Page">
<mt:ContentsHeader><dl></mt:ContentsHeader>
     <dt><$mt:ContentLabel$></dt>
     <dd><mt:ContentField content_field="Title"><a href="javascript:void(0);" class="mtlink" data-id="<mt:ContentID>"><$mt:ContentFieldValue$></a></mt:ContentField></dd>
<mt:ContentsFooter></dl></mt:ContentsFooter>
</mt:Contents>

モーダルとなるエリアです。

<div id="main" style="display:none;">
<p id="hoge"></p>
</div>

ページ読み込み時にアクセストークンを取得・保持します。

    var accessToken;
 
    $.ajax({
        url: "<$mt:CGIPath$><$mt:DataAPIScript$>/v<$mt:DataAPIVersion$>/authentication",
        type: "POST",
        dataType: "json",
        data: {
            'username': 'ユーザー名',
            'password': 'ユーザーのWebサービスパスワード',
            'clientId': '任意のID'
        }
    }).done(function(data){
        accessToken = "MTAuth accessToken=" + data.accessToken;
    });

リンククリックで前回のモーダル表示の内容をクリアし、コンテンツデータIDを取得します。

    $(".mtlink").click(function(){
        $('#hoge').text('');
        var content_data_id =  $(this).data('id');

dialogでモーダル表示を実行し、openイベントを使って、モーダルが開いたタイミングでDataAPIを起動してコンテンツデータを取得します。

        $("#main").dialog({
            open: function(event, ui) {
 
                // コンテンツデータ取得
                $.ajax({
                    url: "<$mt:CGIPath$><$mt:DataAPIScript$>/v<$mt:DataAPIVersion$>/sites/1/contentTypes/1/data/" + content_data_id,
                    type: "GET",
                    dataType: "json",
                    headers: {
                        'X-MT-Authorization': accessToken
                    }
                }).done(function(data){
                  $('#hoge').text(JSON.stringify(data));
                });
            },
            modal:true, //モーダル表示
            title:"テスト", //タイトル
            width: 900,
            height: 500,
        });
Comments [0] | Trackbacks [0]

Movable Type 8の共有プレビューでパスワードを設定する方法

November 15,2023 11:55 PM
Category:[共有プレビュー]
Tag:[MovableType, SharedPreview]
Permalink

Movable Type 8の共有プレビューでパスワードを設定する方法を紹介します。

共有プレビューの基本機能については下記の記事を参照してください。

Movable Type 8リリース

1.パスワードの設定

パスワードはサイト別に複数設定可能です。

サイト管理画面の「設定」→「プラグイン」→「SharedPreview x.x」→「設定」をクリック。

パスワード入力画面に任意のパスワードを入力して「変更を保存」をクリック。

「パスワードを追加」をクリックすれば複数のパスワードを設定できます。

不要なパスワードは「削除」ボタンで削除できます。

2.共有プレビュー時のパスワード入力

パスワードを設定すれば、共有プレビュー時にパスワード入力を求める画面が表示されます。

Comments [0] | Trackbacks [0]

Movable Type 8リリース

November 13,2023 11:55 PM
Category:[Movable Type]
Tag:[MovableType]
Permalink

遅ればせながら、Movable Type 8が11/1にリリースされました。

Movable Type 8リリース

ここでは主な機能を紹介します。

1.共有プレビュー

コンテンツデータや記事を下書き状態にすると「共有プレビュー」のリンクが表示されます。

共有プレビュー

リンクをクリックするとプレビュー画面が表示されます。

プレビュー画面

また、編集画面のリンクや、共有プレビューのリンク、公開ページのリンクも取得できます。

リンク

共有プレビューのリンク
共有プレビューのリンク

公開ページのリンク
公開ページのリンク

これまでのプレビューと異なるのは、コンテンツを編集して保存しても再度同じURLでプレビューを確認が可能です。

またパスワードも設定できるようです。

ちなみに共有プレビューは「mt-shared-preview.cgi」をキックしています。

2、新しいブロックエディタ

プラグインとして提供していた 新しいブロックエディタ(MTブロックエディタ)機能を同梱しました。

新しいブロックエディタ

既存のブロックエディタも同梱されてますが、デフォルトは無効になっています。

既存のブロックエディタ

「カスタムブロック」も作成可能です。

カスタムブロック

3.管理画面の多要素認証

プラグインとして提供されていた多要素認証機能が同梱されました。

現在は TOTP (Time-based One Time Password) による2要素認証に対応しているようです。

利用するには下記の認証アプリが必要です。

  • Google Authenticator ( iOS版 / Android版 )
  • Twilio Authy ( iOS版 / Android版 )
  • Microsoft Authenticator ( iOS版 / Android版 )
  • 2FA Authenticator (2FAS) ( iOS版 / Android版 )

設定方法は、各ユーザー編集画面に「認証デバイスの設定」が表示されます。

認証デバイスの設定

クリックするとQRコードが表示されるので、対応する認証アプリで読み込み、確認コードを入力。

QRコード

これで設定完了です。

QRコード

これで管理画面にログインすると、二段階認証画面に遷移するので、認証アプリに表示されたコードを入力すればログインできます。

二段階認証

解除したい場合は、ユーザー編集画面から解除できます。

二段階認証解除

4.ライセンス確認

システム管理画面の「設定」→「ライセンス確認」でライセンスを確認できるようになりました(手動で登録)、

ライセンス確認

5.検索機能への導線の改善

管理画面の左上に、検索ページへ遷移するボタンが設置されました。

検索ページへ遷移するボタン

Comments [0] | Trackbacks [0]

Movable Typeでイメージドライバ「GraphicsMagick」の設定方法

November 9,2023 11:55 PM
Category:[画像]
Tag:[GraphicsMagick, MovableType]
Permalink

Movable Typeのイメージドライバは「ImageMagick」が主流ですが、「GraphicsMagick」というものを試してみましたので、設定手順を紹介します。

サーバはAWSです。

1.インストール

GraphicsMagickとGraphicsMagick-perlの2つをインストールします。

# yum install GraphicsMagick
# yum install GraphicsMagick-perl

実際の実行画面は下記です。

# yum install GraphicsMagick
Loaded plugins: priorities, update-motd, upgrade-helper
amzn-main                                                                                                           | 2.1 kB  00:00:00
amzn-updates                                                                                                        | 3.7 kB  00:00:00
Resolving Dependencies
--> Running transaction check
---> Package GraphicsMagick.x86_64 0:1.3.38-1.1.amzn1 will be installed
--> Finished Dependency Resolution
 
Dependencies Resolved
 
===========================================================================================================================================
 Package                            Arch                       Version                              Repository                        Size
===========================================================================================================================================
Installing:
 GraphicsMagick                     x86_64                     1.3.38-1.1.amzn1                     amzn-updates                     1.6 M
 
Transaction Summary
===========================================================================================================================================
Install  1 Package
 
Total download size: 1.6 M
Installed size: 4.0 M
Is this ok [y/d/N]: y
Downloading packages:
GraphicsMagick-1.3.38-1.1.amzn1.x86_64.rpm                                                                          | 1.6 MB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : GraphicsMagick-1.3.38-1.1.amzn1.x86_64                                                                                  1/1
  Verifying  : GraphicsMagick-1.3.38-1.1.amzn1.x86_64                                                                                  1/1
 
Installed:
  GraphicsMagick.x86_64 0:1.3.38-1.1.amzn1
 
Complete!
# yum install GraphicsMagick-perl
Loaded plugins: priorities, update-motd, upgrade-helper
amzn-main                                                                                                           | 2.1 kB  00:00:00
amzn-updates                                                                                                        | 3.7 kB  00:00:00
Resolving Dependencies
--> Running transaction check
---> Package GraphicsMagick-perl.x86_64 0:1.3.38-1.1.amzn1 will be installed
--> Finished Dependency Resolution
 
Dependencies Resolved
 
===========================================================================================================================================
 Package                               Arch                     Version                               Repository                      Size
===========================================================================================================================================
Installing:
 GraphicsMagick-perl                   x86_64                   1.3.38-1.1.amzn1                      amzn-updates                   187 k
 
Transaction Summary
===========================================================================================================================================
Install  1 Package
 
Total download size: 187 k
Installed size: 358 k
Is this ok [y/d/N]: y
Downloading packages:
GraphicsMagick-perl-1.3.38-1.1.amzn1.x86_64.rpm                                                                     | 187 kB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : GraphicsMagick-perl-1.3.38-1.1.amzn1.x86_64                                                                             1/1
  Verifying  : GraphicsMagick-perl-1.3.38-1.1.amzn1.x86_64                                                                             1/1
 
Installed:
  GraphicsMagick-perl.x86_64 0:1.3.38-1.1.amzn1
 
Complete!

2.mt-config.cgiの修正

mt-config.cgiに下記を追加します。

ImageDriver GraphicsMagick

3.システム情報の確認

システム管理画面の「設定」→「システム情報」に「Graphics::Magick」が表示されます。

これでサムネイル作成等、ImageMagickと同様の効果が得られるようです。

Comments [0] | Trackbacks [0]

Movable Typeで「いいね!」ができる「Voteプラグイン」

October 18,2023 11:55 PM
Category:[コミュニティ]
Tag:[MovableType, Plugin, Vote]
Permalink

Movable Typeで「いいね!」ができる「Voteプラグイン」を作りました。

1.はじめに

Movable Type(ソフトウェア版やクラウド版)では「いいね!」の機能が提供されていません。

本プラグインを利用することで、「いいね!」ができるようになります。

2.機能

Movable Typeの記事やコンテンツデータ単位に「いいね!」ができます。

下は簡単なサンプルです。

コンテンツデータを作成した時点では「いいね!」の数は0です。

Voteプラグイン

リンクをクリックすると「1」にカウントアップします。

Voteプラグイン

もう一度クリックして、カウントダウンさせることも可能です。

Voteプラグイン

また、ブラウザでのカウント履歴はcookieで保持します。

提供するのはカウンタ機能になります。

HTMLマークアップは必要最低限の設定をしてもらえれば、「いいね!」ボタンのデザインは自由に作れます。

3.Voteプラグインについて

Voteプラグインの詳細は下記のリンクからご覧ください。

Voteプラグイン
Voteプラグイン

Comments [0] | Trackbacks [0]

Movable Type 8の新機能「コンテンツの分離」

October 13,2023 11:55 PM
Category:[インストール]
Tag:[Movabletype]
Permalink

Movable Type 8の新機能「コンテンツの分離」について紹介します。

1.はじめに

「コンテンツの分離」は、ユーザーのコンテンツとシステムファイルを分離するための機能です。

この機能は、インストールウィザードの中でそれぞれのパスを分離します。

以下、手順を説明します。

2.コンテンツの分離

新規でMT8をインストールして、cgi-bin配下のmt-staticにアクセスできない場合、次の「スタティックウェブパスの設定」画面が表示されます。

MT7までと同様にスタティックウェブパスの設定して「開始」をクリックすると次の「コンテンツの分離」画面が表示されます。

次のように記載されています。

従来アップロードしたファイルはmt-staticディレクトリ配下のディレクトリに入れられましたし、ユーザーのプラグインやテーマはMovable Typeのシステムファイルが存在しているディレクトリにインストールされていました。このやり方は簡単そうですが、Movable Typeを新しいバージョンにアップグレードするときに古いバージョンのファイルが残ったりアップロードしたファイルを消してしまうなどの問題が起こることもありました。

追加のパス設定をして、ユーザーのコンテンツとシステムファイルを分離することをお勧めします。

分離する場合はチェックボックスをチェックせずに「次へ」をクリック、既存通りの手順で進めたい場合(分離しない場合)はチェックボックスをチェックして「次へ」をクリックします。

ここでは、チェックボックスをチェックせずに「次へ」をクリックした場合の手順を説明します。

3.ベースユーザーディレクトリの設定

クリックすると「ベースユーザーディレクトリの設定」画面が表示されます。

ベースユーザーディレクトリの設定

次のように記載されています。

ベースユーザーディレクトリはユーザーの画像やプラグイン、テーマを(適切なサブディレクトリに)アップロードしたり格納したりする場所です。ベースユーザーディレクトリ自体はWebブラウザからアクセスできる場所にあってはなりません。また、Movable Typeディレクトリやそのサブディレクトリであってはいけません。配下にMovable Typeディレクトリを含まないようにするのがお勧めですが、必要なら含めるようにもできます。よくわからない場合、またご自身で細かく設定したい場合は設定を省略できます。

ということで、Webブラウザからアクセスできないパス(/var/www以外等)を作成し、「次へ」をクリック。

ここでは"/var/baseuser"というディレクトリを作成してクリックします。

ベースユーザーディレクトリの設定

4.ベースサイトパスの設定

クリックすると「ベースサイトパスの設定」画面が表示されます。

ベースサイトパスの設定

次のように記載されています。

ベースサイトパスは新規サイトのサイトパスの既定値となります。各サイトのサイトパスは必ずベースサイトパスの配下になります。

ベースサイトパスは設定された状態で表示されるので、表示されたパスのディレクトリを作成して「次へ」をクリックするか、パスを変更したい場合は、変更したいパスに対応するディレクトリを作成し、ベースサイトパス配下のパス名を変更して「次へ」をクリック。

5.サポートディレクトリの設定

クリックすると「サポートディレクトリの設定」画面が表示されます。

サポートディレクトリの設定

次のように記載されています。

サポートディレクトリはアップロードしたアセットファイルが入る場所です。Webブラウザからアクセスできる必要があります。従来はmt-staticディレクトリ配下にありましたが、別の場所に移すことをお勧めします。

ここでは、

  • サポートディレクトリURL:http://user-domain/support/
  • サポートディレクトリパス:/var/www/support

をそれぞれ設定して、「次へ」をクリック。

6.その他のパス設定

クリックすると「その他のパス設定」画面が表示されます。

その他のパス設定

次のように記載されています。

ユーザーのファイルとシステムファイルを分離するうえで設定した方がよいパスがいくつかあります。いずれもWebブラウザからアクセスできる場所にあってはなりません。

各パスはベースユーザーディレクトリ配下にデフォルト値が設定された状態で表示されるので、表示されたパスのディレクトリをそれぞれ作成して「次へ」をクリックするか、パスを変更したい場合は、変更したいパスに対応するディレクトリを作成し、ベースサイトパス配下のパス名を変更して「次へ」をクリック。

これでいつものインストール画面が表示されます。

システムチェック

Comments [0] | Trackbacks [0]

VMをundefineできない場合の対処

October 9,2023 11:55 PM
Category:[Linux]
Tag:[Linux]
Permalink

VMをundefineできない場合の対処方法を紹介します。

1.問題点

VMをundefineしようとしたら下記のエラーが発生しました。

# virsh undefine test-vm
エラー: ドメイン test-vm の定義の削除に失敗しました
エラー: 要求された操作は有効ではありません: 1 個のスナップショットを持つ停止状態のドメインを削除できません

2.原因

スナップショットが保存されているとundefineできないようです。

3.対処

下記の手順でスナップショットを削除します。

まずスナップショットの有無を確認します。

# virsh snapshot-list test-vm
 名前               作成時間              状態
------------------------------------------------------------
 test-vm_ss1        2023-09-08 09:23:27 +0900 shutoff

スナップショットが残っている場合、削除します(本当に必要であれば残すべきですが)。

# virsh snapshot-delete test-vm test-vm_ss1
ドメインのスナップショット test-vm_ss1 が削除されました

これで該当のVMをundefineできます。

# virsh undefine test-vm
ドメイン test-vm の定義が削除されました
Comments [0] | Trackbacks [0]

Perlでansibleライブラリを作成する方法

October 4,2023 11:55 PM
Category:[Perl, ansible]
Tag:[ansible, Perl]
Permalink

Perlでansibleライブラリを作成する方法を紹介します。

1.問題点

ansibleのシナリオを作成する中で、既存のansibleライブラリに存在しない処理をする必要が生じました。

が、ライブラリの作り方がわかりません。

具体的には、

  • 配置場所
  • 引数の送受信
  • 返却値の送受信

です。

ということで、Perlでansibleライブラリを作成する方法を紹介します。

ここではPerlで説明していますが、他の言語にも応用できると思います。

2.ansibleのディレクトリ構造

本題に入る前に、サンプルとして使用するansibleシナリオのディレクトリ構造を示します。

複雑ですいませんが、ansibleのベストプラクティスで記載しています。

ansible実行ディレクトリ/
  inventory
  send_user_password.yml
  roles/
    send_user_password/
      tasks/
        main.yml
      files/
        lib.tar.gz perlで使用するライブラリ
  library/
    send_user_password Perlスクリプト

このansibleシナリオの実行方法は下記です。

$ cd ansible実行ディレクトリ
$ ansible-playbook -i inventory send_user_password.yml

これで、roles/send_user_password/tasks/main.ymlが動作します。

そして、main.ymlの中でライブラリを使用します。

ansibleライブラリは"library"が該当します。詳細については後述します。

ここでは、ライブラリ以外の、各ファイルの内容を示します。

設定内容は環境に合わせてて適宜修正してください。

inventory

server_00 ansible_host=192.168.0.123
 
[all:vars]
ansible_user=root
ansible_ssh_pass=hogehoge
 
[server1]
server_00

send_user_password.yml

- hosts: server1
  roles:
    - role: send_user_password
      vars:
        work_path: "/tmp"

main.yml

- name: "Perlライブラリ転送"
  unarchive:
    src: lib.tar.gz
    dest: "{ work_path }"
 
- name: ユーザ・パスワード送信
  send_user_password:
    user: test
    password: hoge
  register: result
 
- name: "結果出力"
  debug:
    msg: "{{ result }}"

3.ライブラリ用Perlスクリプトのサンプル

Perlスクリプトのサンプル(send_user_password)を下記に示します。

このスクリプトは、受信した引数をそのまま返却するだけのものです。

#!/usr/bin/perl
 
use lib '/tmp/lib';
 
my $file = shift(@ARGV);
open( my $fh, "<", $file );
my $contents = do { local $/; <$fh> };
 
my @content = split( /\s/, $contents );
 
my $user;
my $password;
for my $data ( @content ) {
    my @tmp1 = split( /user=/, $data );
    if ( $tmp1[1] ) {
        $user = $tmp1[1];
    }
    my @tmp2 = split( /password=/, $data );
    if ( $tmp2[1] ) {
        $password = $tmp2[1];
    }
}
 
if ( !$user || !$password ) {
    print "{ \"msg\" : \"illegal parameter\", \"rc\" : 0, \"changed\" : \"false\", \"failed\" : \"1\" }";
    exit;
}
 
print "{ \"msg\" : \"OK\", \"user\" : \"$user\", \"password\" : \"$password\", \"rc\" : 0, \"changed\" : \"false\" }";

4.ライブラリの実行

まず、ansibleシナリオに記述した"send_user_password"が、そのままライブラリの実行ファイル名になります。

ansible実行ディレクトリ直下にlibraryディレクトリを配置することで、その配下のスクリプトがライブラリとして自動認識されます。

なお、このansibleのサンプルのライブラリ"send_user_password"は、ターゲットサーバに転送されて実行されます。

必要なライブラリがターゲットサーバに存在しない場合、ライブラリをlib.tar.gz等のファイル名でアーカイブして、roles/send_user_password/files/に配置し、unarchiveモジュールでターゲットサーバに転送・展開します。

- name: "Perlライブラリ転送"
  unarchive:
    src: lib.tar.gz
    dest: "{ work_path }"

展開されたPerlライブラリは、Perlスクリプト内のlibモジュールで追加して利用します。

use lib '/tmp/lib';

5.ライブラリの引数

send_user_passwordの引数となるuserとpassword(のキーと値)は、ファイルとして保存され、そのファイル名がPerlスクリプトに渡されます。

- name: ユーザ・パスワード送信
  send_user_password:
    user: test
    password: hoge
  register: result

サンプルの場合、ファイルの中身は次のようになるはずです。

user=test password=hoge

下記に引数を取得するサンプルを示します。

# 引数としてファイル名を取得
my $file = shift(@ARGV);
 
# ファイルオープン
open( my $fh, "<", $file );
 
# 中身をすべで取得
my $contents = do { local $/; <$fh> };
 
# 半角スペースで分割
my @content = split( /\s/, $contents );
 
# 引数を取得
my $user;
my $password;
for my $data ( @content ) {
    my @tmp1 = split( /user=/, $data );
    if ( $tmp1[1] ) {
        $user = $tmp1[1];
    }
    my @tmp2 = split( /password=/, $data );
    if ( $tmp2[1] ) {
        $password = $tmp2[1];
    }
}

6.ライブラリの返却値

返却値はJSON形式です。ダブルクォーテーション等にはエスケープが必要です。

ここでは受信した引数をそのまま返却しています。

print "{ \"msg\" : \"OK\", \"user\" : \"$user\", \"password\" : \"$password\", \"rc\" : 0, \"changed\" : \"false\" }";

サンプルのansibleでは、受信した返却値を変数resultに保存し、出力するようにしています。

- name: ユーザ・パスワード送信
  send_user_password:
    user: test
    password: hoge
  register: result
 
- name: "結果出力"
  debug:
    msg: "{{ result }}"

個別に出力したい場合は、result.userやresult.passwordとします。

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