bashのwhile文で利用した変数がループ外で反映されない場合の対処
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
bashのechoでアスタリスク「*」がワイルドカードとして展開される場合の対処
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!! ***
bashの正規表現でスペース(空白)を判定する方法
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
セレクトボックスのコンテンツフィールドに値を一括設定できる「SelectBoxBulkSetterプラグイン」
Category:[コンテンツタイプ]
Tag:[DefinedSelectBox, MovableType, Plugin, SelectBoxBulkSetter]
Permalink
Movable Type 7のセレクトボックスのコンテンツフィールドの値を一括設定できる「SelectBoxBulkSetterプラグイン」を公開します。
この記事は 「Movable Type Advent Calendar 2020」、23日目の記事です。
1.はじめに
コンテンツタイプ作成で、コンテンツフィールドのセレクトボックスに値を設定する作業があると思いますが、「都道府県」など選択項目の多いメニューがある場合、手作業でひとつずつちまちま設定するのは大変では?という発想から作りました。
本業の方が超多忙で時間がとれず、ギリギリの完成になってしまいました。
需要があるかわかりませんがとりあえず。
2.機能
- セレクトボックスの「選択状態」「名前」「値」を、プラグイン設定画面のテキストエリアから一括設定できます。
- サイト別に内容を変更することができます。
3.プラグインのダウンロードとインストール
下記のリンクよりプラグインのダウンロードできます。
ダウンロードしたアーカイブを展開し、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プラグイン」も作りました。
こちらは「都道府県」「職業」「業種」が予め用意されています(カスタマイズ不可)。
6.宣伝
コンテンツタイプをまとめて設定・管理したい場合は、「CSVContentTypeImExporterプラグイン」をご利用ください。
bashで文字列の長さを調べる方法
bashで文字列の長さを調べる方法を紹介します。
1.問題点
bashで変数に文字列を設定しました。
#!/bin/bash
foo=123456
この変数fooの文字列長を調べたいのですが、方法がわかりません。
ということで、bashで文字列の長さを調べる方法を紹介します。
2.文字列の長さを調べる
文字列の長さを調べるには下記のようにします。
${#変数名}
前述の例であれば下記のように記述します。
#!/bin/bash
foo=123456
echo ${#foo}
bashで数値を判定する方法
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.参考サイト
参考サイトは下記です。ありがとうございました。
Windows10でPerlにDBD::MySQLをインストールする方法
Windows10でPerlにDBD::MySQLをインストールする方法を紹介します。
1.問題点
Windows10にXAMPPをインストールしました。
XAMPPのMySQL(phpMyAdmin)やCGIはなにごともなく起動できましたが、Movable Typeでmt-check.cgiを確認したところ、DBD::mysqlがインストールされていないことが分かりました。
2.DBD::MySQLをインストールする
ActivePerl 5.24.xをインストールします。これより新しいバージョンは、次に説明するPerl Package Managerが起動しないので注意してください。
2020年4月現在、5.24は下記のURLからダウンロードできます。
https://downloads.activestate.com/ActivePerl/releases/5.24.3.2404/
インストール後、スタートメニューから「ActivePerl 5.24.x」→「Perl Package Manager」をクリック。
左上の「View all packages」をクリック。
Perlにインストールされていない、すべてのパッケージが表示されるので、上部の検索フィールドに「DBD-m」を入力。
DBD-mysqlをクリック。これでパッケージが選択されました。
「Mark for install」のアイコンをクリック。これでインストール対象としてマークされました。
「Run marked actions」のアイコンをクリック。これでインストールが開始します。
確認ダイアログが表示されるので「OK」をクリック。
インストールが開始します。状況は下の「Status」に表示されます。
完了しました。DBD-mysqlの左側のアイコンがグレー(未インストール)からイエロー(インストール済み)に変わりました。
冒頭のmt-check.cgiを確認したところ、DBD::mysqlが無事にインストールされていました。
Windows10で「休止状態」を電源オプションに追加する方法
Windows10で「休止状態」を電源オプションに追加する方法を紹介します。
1.はじめに
Windows7までは電源オプションに「休止状態」がありました。
が、Windows10には電源オプションにこの「休止状態」がありません。
スリープを使えばいいと思われるかもしれませんが、スリープではメモリなどに少なからず電流が流れてしまうため、バッテリーが消費されてしまいます。
休止状態にすれば、メモリの内容などはディスクに保存されるので、電源オフと同程度のバッテリー消費に抑えることができます。
ということで、Windows10で「休止状態」を電源オプションに追加する方法を紹介します。
2.「休止状態」を電源オプションに追加する
「休止状態」を電源オプションに追加するには、「スタート」→「Windowsシステムツール」→「コントロールパネル」をクリック。
「システムとセキュリティ」をクリック。
「電源オプション」の「電源ボタンの動作の変更」をクリック。
「現在利用可能ではない設定を変更します」をクリック。
「休止状態」をチェックして、右下の「変更の保存」をクリックしてウィンドウを閉じます。
これで電源オプションに休止状態が表示されました。
cronの「tput: No value for $TERM and no -T specified」というエラーの原因と対処
cronの「tput: No value for $TERM and no -T specified」というエラーの原因と対処方法を紹介します。
1.問題点
Linuxのcronでtputコマンドを含むbashスクリプトを実行すると、「tput: No value for $TERM and no -T specified」というエラーが発生します。
test.sh
#!/bin/bash
export PATH=$PATH:/usr/sbin/
tput cub 1
注:実際は標準入力を伴うカーソル移動スクリプトですが、問題点を明確にするために最小限の記述にしています。
参考:シェルスクリプトで動作するコマンドラインインタフェース>
cronメールの結果
Date: Fri, 16 Oct 2020 17:22:01 +0900 (JST)
Status: RO
tput: No value for $TERM and no -T specified
このエラーを解消する方法がわかりません。
ということで、cronの「tput: No value for $TERM and no -T specified」というエラーの原因と対処方法を紹介します。
2.原因
tputは、$TERM変数を調べて現在のターミナルを判別し、正しい制御シーケンスを生成できるようにしています。
cronから実行されているときはターミナルが存在ないため、tputでエラーが発生するようです。
3.対処方法
TERM変数をcronに記載します。
00 * * * * export TERM=xterm; /home/foo/test.sh
cronメールの結果
Date: Fri, 16 Oct 2020 17:36:01 +0900 (JST)
Status: R
?[1D
"?[1D"はtputが正常に動作した結果です。
4.参考サイト
参考サイトは下記です。ありがとうございました。
Adobe Premiere Proで「A low-level exception occurred in:Adobeプレイヤー(Player:x)」となる場合の対処
Adobe Premiere Proで「A low-level exception occurred in:Adobeプレイヤー(Player:x)」となる場合の原因と対処方法
1.問題点
Adobe Premiere Proでテロップを挿入しようと思い、新規タイトルを作成して、タイムラインパネルにドラッグしたところ、「A low-level exception occurred in:Adobeプレイヤー(Player:5)」というエラーが発生しました(キャプチャは「Player:6」ですが発生時は「Player:5」)。
エラーが発生するとテロップ表示もできませんが、再生もできなくなります。
ということで、Adobe Premiere Proで「A low-level exception occurred in:Adobeプレイヤー(Player:x)」となる場合の原因と対処方法を紹介します。
2.原因
原因はAdobe Premiere Pro v14.1のバグのようです。
参考サイト:エラーがでて映像が再生されない
3.対処方法
レンダラーを「Mercuy Playback Engine - ソフトウエア処理」に変更します。以下変更手順です。
「ファイル」→「プロジェクト設定」→「一般」をクリック。
「レンダラー」をクリック。
「Mercuy Playback Engine - ソフトウエア処理」を選択して「OK」をクリック。
これでタイトルを作成して、タイムラインパネルにドラッグしてもエラーが発生しなくなります。
ノートン製品の自動延長を停止する方法
ノートン製品の自動延長を停止する方法を紹介します。
1.はじめに
ノートンからメールが届いて、そのとき製品が自動延長になっていることを知りました。
ということで、ノートン製品の自動延長を停止する方法を紹介します。
2.ノートン製品の自動延長を停止する
ノートン製品の自動延長を停止するには、「【シマンテックストア】自動延長サービス・課金完了のご案内」というメールを開き、メール本文にある「保険詳細ページ」のリンクをクリック。
開いたページの右上にある「注文情報の確認」をクリック。ページのURLはhttps://www.nortonstore.jp/orderstatus/です。
注文番号とメールアドレスを入力して「次へ」をクリック。
入力する注文番号は、メール本文の「自動延長サービス対象製品」の「自動延長加入時のご注文番号」を設定します(次の画面で「自動延長サービスの申込状況確認・停止手続き」が表示されなければ、もうひとつの注文番号でやり直してみてください」)
「自動延長サービスの申込状況確認・停止手続き」をクリック。
「自動延長」の「停止」をクリック。
「自動延長サービスを停止してもよろしいですか?」というポップアップが表示されるので「はい」をクリック。
停止が選択されたことを確認して、一番下の「停止」をクリック。
自動延長サービスの停止内容確認画面になります。
アンケートを入力して一番下の「停止」をクリック。
ポップアップが表示されるので「停止する」をクリック。
自動延長サービスの停止完了画面が表示されます。これで作業完了です。
iPhoneのsafariで日本語に翻訳する方法
iPhoneのsafariで日本語に翻訳する方法を紹介します。
1.翻訳手順
設定の前に翻訳手順を示します。
任意の海外サイトを開いて、URL欄をタップ。
お気に入りの一覧が表示されるので「Google翻訳」をタップ。
これで翻訳されました。
ということで、2枚目のスクリーンショットに表示された「Google翻訳」の設定方法を次項で紹介します。
2.設定方法
まず「Google翻訳」の元になるページを「お気に入り」へ設定します。ここではGoogle検索のページを開き、下にある真ん中のアイコンをタップ。
「お気に入りに追加」をタップ。
右上の「保存」をタップ。
次に、保存したページをGoogle翻訳用の内容に変更します。下にある「ブックマーク」アイコンをタップ
ブックマーク一覧画面が表示されるので、右下の「編集」をタップ。
保存した「Google」が一番下に表示されているので、それをタップ。
ブックマーク編集画面が表示されるので、名前を「Google翻訳」に変更。
URL欄をタップして、右側の×印をタップ。
これでURLが削除されるので、タップして下のURLをペーストしてください。
javascript:q=location.href;void(location.href='http://translate.google.com/translate?hl=ja&sl=auto&u='+q);
このように表示されたことを確認して、左上の「お気に入り」をタップして前の画面に戻ります。
編集した「Google翻訳」の右側にあるアイコンを長押しタップして一番上にドラッグ。
一番上に移動したら、右下の「完了」をタップ。これで設定完了です。
Windows10+XAMPP起動時に「Error: Cannot create file "C:\xampp\xampp-control.ini". アクセスが拒否されました」となる不具合の対処方法
Windows10+XAMPP起動時に「Error: Cannot create file "C:\xampp\xampp-control.ini". アクセスが拒否されました」となる不具合の対処方法について紹介します。
1.問題点
Windows10にインストールしたXAMPPの起動(xampp-control.exe)時、言語選択のダイアログが表示されます。
が、このあと、「Error: Cannot create file "C:\xampp\xampp-control.ini". アクセスが拒否されました」というエラーが表示されます。
ただしXAMPP自体はこのあと正常に立ち上がります。
ということで、Windows10+XAMPP起動時に「Error: Cannot create file "C:\xampp\xampp-control.ini". アクセスが拒否されました」となる不具合の対処方法について紹介します。
2.原因
おそらく原因は管理者権限でXAMPPが起動できていないためと思われます。
3.対処方法
管理者権限でエディタを開きます。ここではメモ帳で行ってみます(他のエディタでも構いません)。
「スタート」→「Windowアクセサリ」をクリックして開き、「メモ帳」を右クリックして「その他」→「管理者として実行」を選択。
「このアプリがデバイスに変更を加えることを許可しますか?」と聞かれるので「はい」をクリック。
メモ帳の「ファイル」→「開く」を選択。
右下のファイルの種類を「すべてのファイル」に変更して、C:\xampp直下にあるxampp-control.iniを選択して、「開く」をクリック。
「Language=」の行を「Language=en」に変更して保存します。
これでXAMPPを起動すれば言語の選択やエラーが表示されずに起動します。
4.その他
XAMPPを起動する場合、xampp-control.exeを右クリックして「管理者として実行」を選択すると、日本語の画面が表示されます。
ただしこの方法ではMySQLやApacheが正常に起動しないようです。
Workflowプラグイン(個別多段階承認版)
Movable Type 7対応のWorkflowプラグイン(個別多段階承認版)を現在開発中です。
1.機能
以前、「Movable Type「Workflowプラグイン」に記事単位のワークフロー機能追加」をリリースしましたが、今回は記事単位のワークフロー用の多段階承認グループの作成機能を追加します。
グループ作成で下記の用に多段階承認ユーザーを改行区切りで設定します。
記事をワークフロー対象にします。
この記事を承認待ち状態にすると「承認依頼」フィールドが表示され、承認グループを選択します。
さきほど作成した承認グループを選択すると、グループに登録されているユーザーが表示されます。一番上のユーザーから多段階承認になります。
承認依頼をするとステータスが承認待ちになります。
2.プラグインのダウンロード
Workflowプラグインの詳細については下記のリンクからどうぞ。
Windows10+XAMPP+Merburyでメールを送信する方法
Windows10+XAMPP+Mercuryでメールを送信する方法を紹介します。
1.はじめに
Windows10+XAMPPでメールを送信する必要が生じました。
調べたところ、XAMPPにバンドルされているMercuryというメールソフトを設定すれば送信可能になるようです。
ただ現在、ほとんどのISPは、「OP25B(Outbound port 25 Blocking)」というスパムメール対策のため、ポート25番を利用したメールを遮断しています。
そこでMercuryは、PC内部からの送信メールを、ISPのメール送信サーバにめがけて送信することで、外部へのメール送信を実現しているようです。
ということで、Windows10+XAMPP+Mercuryでメールを送信する方法を紹介します。
2.Windows10+XAMPP+Mercuryでメールを送信する
XAMPPを起動後、Mercuryの「Start」をクリック。
セキュリティ警告が表示されるので「アクセスを許可する」をクリック。
Mercuryの「Admin」をクリック。
「Configuration」→「Protocol modules...」をクリック。
「MercuryS SMTP server」と「MercuryC SMTP relaying client」の2つをチェックし、他のチェックを外して「OK」をクリック。
「Configuration」→「MercuryS SMTP Server」をクリック。
「Connection control」タブの「Do not permit SMTP relaying of non-local mail」のチェックを外して「OK」をクリック。
これで設定画面をすべて閉じます。Mercuryが停止するので、Mercuryをもう一度起動して「Admin」をクリック。
「Configuration」から「MercuryC SMTP Client」をクリック。
「SMTP "Smart" Host details」に中継する送信メールサーバの情報を設定します。ここでは私の利用しているSo-netの送信メールサーバの情報を設定します。
Smart host name:ISPの送信メールサーバを(ここでは"mail.so-net.ne.jp")設定
Connection port/type:"587"および「SSL encryption via STARTTLS commanmd」を設定
また、「Credentials for SMTP Authentication if required」に中継する送信メールサーバの認証情報を設定します。
Login username:ユーザー名
Password:パスワード
設定完了後、Mercuryが停止するので、Startをクリックして再度起動します。これで今までの設定が反映された状態でMercuryが起動します。
最後に、メールを送信するアプリケーションにMercuryの送信メールサーバ情報を設定します。PHPを利用する場合は、php.iniに次の内容を設定します。
[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = localhost
; http://php.net/smtp-port
smtp_port = 25
; For Win32 only.
; http://php.net/sendmail-from
sendmail_from = (送信元メールアドレス)
私はMovable Typeから送信するため、mt-config.cgiに下記の設定を追加します。
MailTransfer smtp
SMTPServer localhost
SMTPPort 25
これでPHPアプリケーションやMovable Typeからメールを送信し、送信先のメールアドレスに届いていればOKです。
4.参考サイト
参考サイトは下記です。ありがとうございました。