bashでbackspaceが動作しない場合の対処

April 11,2021 11:55 PM
Category:[bash]
Tag:[bash]
Permalink

bashでbackspaceが動作しない場合の対処方法を紹介します。

1.問題点

入力した文字を表示するという、簡単なスクリプト(test.sh)を作ってみました。

#!/bin/bash
 
while [ 1 ]; do
    read -p "> " line
    echo "$line"
done

このスクリプトで入力した文字をbackspaceで削除しようとすると、"^H"が表示されます。

# ./test.sh
>abc^H^H^H

ということで、bashでbackspaceが動作しない場合の対処方法を紹介します。

2.原因

まず、"stty -a"を入力して、端末設定を表示(抜粋)します。

# stty -a
speed 38400 baud; rows 24; columns 98; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>;

1文字消去のキーバインドは、

erase = ^?;

となっていますが、bashのbackspaceは"^H"が割り当てられています。

このため、backspaceを押下しても、割り当てられたキーが存在しないため、1文字消去ではなく、"^H"がそのまま表示されると思われます。

3.対処

スクリプト実行時にsttyコマンドを実施して、eraseのキーバインドをbackspaceに変更します。

#!/bin/bash
 
stty erase '^H'
 
while [ 1 ]; do
    read -p "> " line
    echo "$line"
done

追加するのは、

stty erase '^H'

の部分で、"^H"はシングルクォーテーションで括ります。

あるいはそのままの文字を入力したい場合、クォートせずに、Ctrl-v → Ctrl-hを入力します。

3.元のキーバインドに戻す

スクリプト内で設定したキーバインドは、終了後のターミナルに伝播されませんが、何らかの原因で戻らない場合、スクリプトの最後に、

stty sane

あるいは、

stty erase '^?'

を入力します。

#!/bin/bash
 
stty erase '^H'
 
while [ 1 ]; do
    read -p "> " line
    echo "$line"
done
 
stty sane

'^?'を直接入力したい場合は、クォートせずに、Ctrl-v → Ctrl-8を入力します。

Comments [0] | Trackbacks [0]

Workflowプラグインバージョンアップ(承認・差し戻し時の承認者へのCcメール追加等)

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

Movable Typeで承認ワークフローを実現する「Workflowプラグイン」をバージョンアップしました。

1.機能追加内容

承認時の承認メールをライターのみでなく、承認者にもCcで送信できる機能を追加しました。差し戻しメールについても、承認者にCcでの送信を選択できます。

Ccメールの送信する・しないは、承認者編集画面で承認順位別に行えます。

設定状態は承認者一覧画面で確認できます。

(クリックで拡大)

また、ライターや承認者が承認依頼する際の承認者の表示名を「ユーザー名」「表示名」から選択できるようにしました。

システム管理画面の設定画面

サイト別のプラグイン設定画面で設定することも可能です。

「ユーザー名」を半角英数、「表示名」を全角で運用している場合の表示は次のようになります。

「ユーザー名」を選択した場合の承認依頼画面

「表示名」を選択した場合の承認依頼画面

2.対象グレード

機能追加対象のグレードは、MT7の

  • 多段階承認版
  • 多段階承認版+日時指定版
  • 多段階承認+グループ・複数承認版

になります。

3.プラグインの詳細

Workflowプラグインの詳細については下記のリンクからどうぞ。

Workflowプラグイン
Workflowプラグイン

Comments [0] | Trackbacks [0]

MySQLで「The used SELECT statements have a different number of columns」となる場合の対処

March 30,2021 11:55 PM
Category:[MySQL]
Tag:[MySQL]
Permalink

MySQLで「The used SELECT statements have a different number of columns」となる場合の対処について紹介します。

1.問題点

MySQLで2つのテーブルを作りました、

mysql> create table foo ( id int, name varchar(32) );
 
Query OK, 0 rows affected (0.20 sec)
 
mysql> create table bar ( id int, name1 varchar(32), name2 varchar(32) );
Query OK, 0 rows affected (0.18 sec)
  :
(略)
  :
mysql> select * from foo;
+------+------+
| id   | name |
+------+------+
|    1 | aaa  |
|    2 | bbb  |
+------+------+
2 rows in set (0.00 sec)
 
mysql> select * from bar;
+------+-------+-------+
| id   | name1 | name2 |
+------+-------+-------+
|    1 | xxx1  | xxx2  |
|    2 | yyy1  | yyy2  |
+------+-------+-------+
2 rows in set (0.00 sec)

UNIONを使って2つのテーブルを結合し、表示させようとすると、「The used SELECT statements have a different number of columns」というエラーになります。

ということで、MySQLで「The used SELECT statements have a different number of columns」となる場合の対処方法を紹介します。

2.原因

エラーメッセージの内容より、SELECTで表示させるカラム数が異なっていることが原因です。

3.対処

SELECTで表示させるカラム数を一致させます。

(クリックで拡大)

Comments [0] | Trackbacks [0]

Movable TypeのDataAPIで「403 Forbidden」になる場合の対処

March 22,2021 11:55 PM
Category:[DataAPI]
Tag:[DataAPI, MovableType]
Permalink

Movable TypeのDataAPIで「403 Forbidden」になる場合の対処方法を紹介します。

1.問題点

MTから記事のタイトル一覧を取得するスクリプトを作成しました。

<script src="http://.../mt-static/data-api/v3/js/mt-data-api.min.js"></script>
<script type="text/javascript" src="http://.../mt-static/jquery/jquery.min.js?v=7.1.4"></script>
<script>
var api = new MT.DataAPI({
    clientId: 'foo',
    baseUrl: 'http://.../cgi-bin/mt/mt-data-api.cgi',
    format: 'json',
    async: true,
});
siteId=1;
api.listEntries(siteId, function(response) {
  if (response.error) {
    // エラー処理
    jQuery('#result').append($('<li>').append(response.error.code + ":" + response.error.message));
    return;
  }
 
  for (var i = 0; i < response.items.length; i++) {
      var entry = response.items[i];
      jQuery('#result').append($('<li>').append(response.items[i].title));
  }
});
</script>
<div id="result"></div>

が、実行すると、

403:Forbidden

となります。

スクリプトは問題ないと思いますが原因が分かりません。

ということで、DataAPIで「403 Forbidden」になる場合の対処方法を紹介します。

2.原因

MTでDataAPIの利用が有効になっていないのが原因として考えられます。

3.対処

DataAPIを利用したいサイトの「設定」→「Webサービス」をクリック。

「Data API のアクセスを許可する。」をチェックして「変更を保存」をクリック。

これで冒頭のスクリプトが正常に動作するようになります。

4.その他

システム関連のデータにアクセスする場合は、システム管理画面の「設定」→「Webサービス」をクリックして、「システム全般での Data API の利用を許可する。」をチェックして「変更を保存」をクリック。

これでシステム関連のデータにアクセスできるようになります。

なお、認証が必要なデータにアクセスする場合は「Movable Type Data APIの使い方:authenticate()」の設定を追加してください。

Comments [0] | Trackbacks [0]

Adobe Premiereで動画の一部にモザイクをかける方法

March 12,2021 11:55 PM
Category:[Premiere Pro]
Tag:[Adobe, Premiere]
Permalink

Adobe Premiere Proで動画の一部にモザイクをかけてトラッキングする方法を紹介します。

1.動画全体にモザイクを適用

メニューから「ウィンドウ」→「エフェクト」を選択。

「エフェクト」ウインドウから「ビデオエフェクト」→「スタイライズ」→「モザイク」を選択。

適用したいクリップにドラッグ&ドロップ。

(クリックで拡大)

2.モザイクの粒度を調整

エフェクトコントロールの「モザイク」にある、「水平ブロック」と「垂直ブロック」の値を80にします。値を大きくするとモザイクが細かくなります。

適用された動画は下のようになります。

(クリックで拡大)

3.モザイクを特定の箇所に適用

エフェクトコントロールの「モザイク」のアイコンをクリック。ここでは矩形のアイコンをクリックします。

動画に矩形のマスクが表示されます。

(クリックで拡大)

四隅をドラッグして位置を調整します。調整が完了したらリターン押下。

(クリックで拡大)

レンダリングが開始します。

4.モザイクのトラッキング

エフェクトコントロールの「モザイク」→「マスク(1)」の下にある再生アイコンをクリックすれば、モザイクのトラッキング(追尾)が開始します。

ただ、トラッキングの精度はいまひとつのようなので、フレームごとに微調整が必要かもしれません。

Comments [0] | Trackbacks [0]

Movable Typeでユーザー情報をCSVで管理できる「CSVAuthorDataImExporterプラグイン」

Movable Typeでユーザー情報をCSVで管理できる「CSVAuthorDataImExporterプラグイン」をリリースします。

1.機能

ユーザー情報をCSVでインポート・エクスポートが可能です。

エクスポート画面(クリックで拡大、以下同様)
エクスポート画面

インポート画面
インポート画面

インポート実行画面
インポート実行画面

管理対象の主なデータは下記のとおりです。パスワードの設定・変更も可能です。

  • id:ユーザーID(固定、新規登録時は未設定)
  • type:ユーザータイプ
  • status:ユーザー状態
  • name:ユーザー名
  • nickname:表示名
  • email:メールアドレス
  • url:URL
  • password:パスワード(インポートのみ)
  • preferred_language:使用言語
  • text_format:テキスト形式
  • date_format:日付
  • api_password:Webサービスパスワード(インポートのみ)

2.プラグイン詳細

プラグインの詳細ははCSVAuthorDataImExporterプラグインのページにアクセスしてください。

Comments [0] | Trackbacks [0]

mysqldumpで「Error: 'Access denied; you need (at least one of) the PROCESS privilege(s) for this operation' when trying to dump tablespaces」となる場合の対処

February 17,2021 11:55 PM
Category:[MySQL]
Tag:[MySQL]
Permalink

mysqldumpで「Error: 'Access denied; you need (at least one of) the PROCESS privilege(s) for this operation' when trying to dump tablespaces」となる場合の対処方法を紹介します。

1.問題点

MySQL(5.5)のバックアップは、

mysqldump -h <DBホスト> -u <DBユーザー> -p<DBパスワード> <データベース名> > backup.sql

で実行していました。

今回、MySQLを5.5から5.7にアップグレードしてバックアップしたところ、

% mysqldump -h <DBホスト> -u <DBユーザー> -p<DBパスワード> <データベース名> > backup.sql
mysqldump: Error: 'Access denied; you need (at least one of) the PROCESS privilege(s) for this operation' when trying to dump tablespaces

というエラーが表示されるようになりましたが、解決方法が分かりません。

ということで、mysqldumpで「Error: 'Access denied; you need (at least one of) the PROCESS privilege(s) for this operation' when trying to dump tablespaces」となる場合の対処方法を紹介します。

2.原因

MySQLを5.7にバージョンアップしたことで、PROCESS特権が必要になるようです。

以下、公式サイトの解説です。

INFORMATION_SCHEMA.FILESテーブルへのアクセスにPROCESS特権が必要になりました。この変更は、FILESテーブルのテーブルスペース情報にアクセスするmysqldumpコマンドのユーザーに影響するため、PROCESS特権も必要になります。

3.対処方法

テーブルスペース情報をダンプする必要がないユーザーは、-no-tablespacesオプションを指定してmysqldumpを呼び出すことにより、前述の要件を回避できます。

mysqldumpのパラメータに"--no-tablespaces"を付与します。

% mysqldump --no-tablespaces -h <DBホスト> -u <DBユーザー> -p<DBパスワード> <データベース名> > backup.sql

4.参考サイト

参考サイトは下記です。ありがとうございました。

Comments [0] | Trackbacks [0]

bashの変数から最後の1文字を取得・削除する方法

February 5,2021 11:55 PM
Category:[bash]
Tag:[bash]
Permalink

bashの変数から最後の1文字を取得・削除する方法を紹介します。

https://srad.jp/~cobonzu/journal/547921/

1.問題点

下記のスクリプト(test.sh)にある変数fooの最後の文字"g"を取得または削除したいのですが、方法が分かりません。

#!/bin/bash
 
foo=abcdefg

ということで、bashの変数から最後の1文字を取得・削除する方法を紹介します。

2.文字列の最後の1文字を取得する

文字列の最後の1文字を取得するには、下記のようにします。

#!/bin/bash
 
foo=abcdefg
echo ${foo: -1}

注:":"と"-1"の間にスペースをいれてください。

実行結果

# ./test.sh
g

これはbashの変数展開(部分展開)で、

${parameter:offset}

を利用したものです。

3.文字列の最後の1文字を削除する

文字列の最後の1文字を削除するには、下記のようにします。

#!/bin/bash
 
foo=abcdefg
echo ${foo/%?/}

実行結果

# ./test.sh
abcdef

これはbashの変数展開(後方一致除去)で、

${parameter%word}

を利用したものです。

Comments [0] | Trackbacks [0]

CSVDataImExporterプラグイン・機能拡張版リリース

February 3,2021 11:55 PM
Category:[インポート・エクスポート]
Tag:[CSVDataImExporter, MovableType, Plugin]
Permalink

Movable Typeの記事データ・コンテンツデータをCSVデータでインポート・エクスポートできる「CSVDataImExporterプラグイン」の機能拡張版をリリースしました。

1.追加機能

システム管理画面よりコンテンツデータのインポート・エクスポートが可能です。これを使用することにより、複数のサイトや複数のコンテンツデータを横断した操作が不要となります(システム管理画面で記事のインポート・エクスポートは行えません)。

エクスポート画面(クリックで拡大、以下同様)

インポート画面

また、ロール編集画面に「コンテンツデータのインポート・エクスポート」および「記事のインポート・エクスポート」権限を追加しました。

ロール編集画面

これにより、権限別にコンテンツデータ・記事のインポート・エクスポートを制御することが可能です。
注:「サイト管理者」ロールは対象外(システム管理者と同等の動作)です。


上記は権限は、権限を与えたユーザーに対し、サイト配下のすべてのコンテンツデータに適用されますが、さらにコンテンツタイプ別に権限を設定したい場合は、「コンテンツタイプごとの権限」での制御も可能です。

ロール編集画面

ユーザーに特定のコンテンツデータのみエクスポート・インポートを許容したい場合はこちらの機能をご利用ください。
注:「サイト管理者」ロールは対象外(システム管理者と同等の動作)です。

2.システム管理画面からコンテンツデータのエクスポート・インポートするCSVフォーマットについて

システム管理画面からのコンテンツデータのエクスポート・インポートのCSVフォーマットは、サイト管理画面からのエクスポート・インポートのCSVフォーマットと異なります。

具体的には、システム管理画面からのエクスポート・インポートのCSVフォーマットは、左の2カラムに、

site_id,site_name

を付与します。site_idはサイトID、site_nameはサイトの名前です。これはシステム管理画面から指定したコンテンツタイプのサイトと、CSVファイルのサイトが適正であることを検証するためです。

サイト管理画面からエクスポートしたCSVファイルをシステム管理画面からインポートするには、上記の2カラムを追加してください。

その他、複数コンテンツタイプの一括エクスポートは行えません。

3.コンテンツデータのインポート・エクスポートの権限設定について

ロール編集画面の「作成と公開」に表示された「コンテンツデータのインポート・エクスポート」権限をチェックすると、自動的に「コンテンツデータの管理」にチェックがつきます。

また、ロール編集画面の「コンテンツタイプごとの権限」の「コンテンツデータのインポート・エクスポート」権限をチェックすると、自動的に「コンテンツデータの作成」にチェックがつきます。

後者の方法で権限を設定した場合、権限が設定されていないコンテンツデータにも「xxxをインポート」「xxxをエクスポート」のリンクが表示されますが、クリックするとダッシュボードにリダイレクトされます。

4.記事のインポート・エクスポートの権限設定について

ロール編集画面の「作成と公開」に表示された「記事のインポート・エクスポート」権限をチェックすると、自動的に「すべての記事の編集」にチェックがつきます。

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

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

Comments [0] | Trackbacks [0]

bashのwhile文で利用した変数がループ外で反映されない場合の対処

January 22,2021 11:55 PM
Category:[bash]
Tag:[bash]
Permalink

bashのwhile文で利用した変数がループ外で反映されない場合の対処方法を紹介します。

1.問題点

次のようなスクリプト(test.sh)を書きました。

#!/bin/bash
 
counter=0
cat /etc/hosts | while read line; do
    counter=$(( counter + 1 ))
    echo $counter
done
 
echo $counter

このスクリプトを実行すると、最後のechoで/etc/hostsの行数が表示されるはずですが、次のように「0」と表示されます。

実行結果

# ./test.sh
1
2
3
4
5
6
7
8
9
10
0

ということで、bashのwhile文で利用した変数がループ外で反映されない場合の対処方法を紹介します。

2.対処

「cat /etc/hosts」はパイプを使わず、リダイレクトを使用します。

#!/bin/bash
 
counter=0
while read line; do
    counter=$(( counter + 1 ))
    echo $counter
done < <(cat /etc/hosts)
 
echo $counter

実行結果

# ./test.sh
1
2
3
4
5
6
7
8
9
10
10
Comments [0] | Trackbacks [0]

bashのechoでアスタリスク「*」がワイルドカードとして展開される場合の対処

January 18,2021 11:55 PM
Category:[bash]
Tag:[bash]
Permalink

bashのechoでアスタリスク「*」がワイルドカードとして展開される場合の対処について紹介します。

1.問題点

次のようなスクリプト「test.sh」を書きました。

#!/bin/bash
 
data='*** Error!! ***'
echo $data

が、実行すると期待しない結果になります。

実行結果

# ./test.sh
test.sh Error!! test.sh

具体的には、スクリプトを実行したディレクトリのファイル名が表示されます。

このディレクトリにはtest.shしかありませんが、例えば、test2.sh、test3.shがあると、

# ./test.sh
test.sh test2.sh test3.sh Error!! test.sh test2.sh test3.sh

となります。

2.原因

echoするときに、アスタリスク「*」がワイルドカードとして展開されている模様。

3.対処

echoするときの変数dataをダブルクォーテーションで括ります。

#!/bin/bash
 
data='*** Error!! ***'
echo "$data"

実行結果

# ./test.sh
*** Error!! ***
Comments [0] | Trackbacks [0]

bashの正規表現でスペース(空白)を判定する方法

January 12,2021 11:55 PM
Category:[bash]
Tag:[bash]
Permalink

bashの正規表現でスペース(空白)を判定する方法を紹介します。

1.問題点

bashで、下記のようなスペース(空白)を含む文字列を判定したいのですが、方法がわかりません。

#!/bin/bash
 
str="aaa bbb ccc"
 
if [[ $str =~ 'a{3} b{3} c{3}' ]]; then
    echo "yes"
else
    echo "no"
fi

実行結果

no

ちなみに単純な文字列であればマッチするようです。

#!/bin/bash
 
str="aaa bbb ccc"
 
if [[ $str =~ 'aaa bbb' ]]; then
    echo "yes"
else
    echo "no"
fi

実行結果

yes

ということで、bashの正規表現でスペースを判定する方法を紹介します。

2.bashの正規表現でスペースを判定する

正規表現でスペースを判定するには、スペースを"[^\S]"で表現します。

#!/bin/bash
 
str="aaa bbb ccc"
regex="a{3}[^\S]*b{3}[^\S]*c{3}"
 
if [[ $str =~ $regex ]]; then
    echo "yes"
else
    echo "no"
fi

実行結果

yes

"[\s]"ではマッチしない可能性があります。

正規表現は直接if文に書いても大丈夫です。直接記述する場合は正規表現をクォーテーションしないよう気をつけてください。

#!/bin/bash
 
str="aaa bbb ccc"
 
if [[ $str =~ a{3}[^\S]*b{3}[^\S]*c{3} ]]; then
    echo "yes"
else
    echo "no"
fi
Comments [0] | Trackbacks [0]

セレクトボックスのコンテンツフィールドに値を一括設定できる「SelectBoxBulkSetterプラグイン」

Movable Type 7のセレクトボックスのコンテンツフィールドの値を一括設定できる「SelectBoxBulkSetterプラグイン」を公開します。

この記事は 「Movable Type Advent Calendar 2020」、23日目の記事です。

1.はじめに

コンテンツタイプ作成で、コンテンツフィールドのセレクトボックスに値を設定する作業があると思いますが、「都道府県」など選択項目の多いメニューがある場合、手作業でひとつずつちまちま設定するのは大変では?という発想から作りました。

本業の方が超多忙で時間がとれず、ギリギリの完成になってしまいました。

需要があるかわかりませんがとりあえず。

2.機能

  • セレクトボックスの「選択状態」「名前」「値」を、プラグイン設定画面のテキストエリアから一括設定できます。
  • サイト別に内容を変更することができます。

3.プラグインのダウンロードとインストール

下記のリンクよりプラグインのダウンロードできます。

SelectBoxBulkSetter_0.01.zip

ダウンロードしたアーカイブを展開し、MTのpluginsディレクトリにSelectBoxBulkSetterフォルダをアップロードします。

システム管理画面の「設定」→「プラグイン」でSelectBoxBulkSetterが表示されればOKです。

4.使い方

サイト管理画面の「設定」→「プラグイン」→「SelectBoxBulkSetter」→「設定」に下記のフォーマットでデータを設定します(当初CSVを検討していましたが間に合わないので)。

"checked"が選択状態、"label"が「名前」、"value"が「値」です。選択状態は空("")または1("1")のみ設定可です。

[{
  "checked": "",
  "label":"北海道",
  "value":"1",
},{
  "checked": "",
  "label":"東京都",
  "value":"2",
},{
  "checked": "",
  "label":"愛知県",
  "value":"3",
},{
  "checked": "",
  "label":"大阪府",
  "value":"4",
},{
  "checked": "",
  "label":"福岡県",
  "value":"5",
}]

設定後、コンテンツタイプ設定画面で「カスタムセレクトボックス」をコンテンツフィールドにドラッグ。

設定した値が反映されます。

(クリックで拡大)

5.その他

事前に値を設定したプラグイン「DefinedSelectBoxプラグイン」も作りました。

DefinedSelectBox_0_01.zip

こちらは「都道府県」「職業」「業種」が予め用意されています(カスタマイズ不可)。

6.宣伝

コンテンツタイプをまとめて設定・管理したい場合は、「CSVContentTypeImExporterプラグイン」をご利用ください。

Comments [0] | Trackbacks [0]

bashで文字列の長さを調べる方法

December 7,2020 12:03 AM
Category:[bash]
Tag:[Linux]
Permalink

bashで文字列の長さを調べる方法を紹介します。

1.問題点

bashで変数に文字列を設定しました。

#!/bin/bash
 
foo=123456

この変数fooの文字列長を調べたいのですが、方法がわかりません。

ということで、bashで文字列の長さを調べる方法を紹介します。

2.文字列の長さを調べる

文字列の長さを調べるには下記のようにします。

${#変数名}

前述の例であれば下記のように記述します。

#!/bin/bash
 
foo=123456
echo ${#foo}
Comments [0] | Trackbacks [0]

bashで数値を判定する方法

December 2,2020 11:55 PM
Category:[bash]
Tag:[Linux]
Permalink

bashで数値を判定する方法を紹介します。

1.問題点

bashの標準入力で数値の標準入力を受け付けるスクリプトを作りました。

#!/bin/bash
 
read -p "> " data
echo $data

このスクリプトで数値以外の文字が入力された場合のチェック方法がわかりません。

ということでbashで数値を判定する方法を紹介します。

2.数値を判定する

数値を判定するには、exprコマンドを利用します。

#!/bin/bash
 
read -p "> " data
 
if expr "$data" : "[0-9]*$" >&/dev/null; then
    echo "number:$data"
else
    echo "not number"
fi

または

#!/bin/bash
 
read -p "> " data
 
if [[ "$data" =~ ^[0-9]+$ ]]; then
    echo "number:$data"
else
    echo "not number"
fi

3.参考サイト

参考サイトは下記です。ありがとうございました。

シェルスクリプトで数字かどうか判断する方法(exprだけじゃない)

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