bashの配列をjoinする方法

July 19,2019 12:03 AM
Category:[bash]
Tag:[bash]
Permalink

bashの配列をjoinする方法を紹介します。

1.問題点

bashで次のようなリストを作成しました。

#!/bin/bash
 
declare -a list=("a" "b" "c")

この配列変数listの各データをカンマで結合させて1つのデータにしたいのですが、方法がわかりません。

ということで、bashの配列をjoinする方法を紹介します。

2.bashの配列をjoinする

bashの配列をjoinするには、IFSを利用します。

#!/bin/bash
 
declare -a list=("a" "b" "c")
result="$(IFS=","; echo "${list[*]}")"
echo ${result}

実行結果

a,b,c

IFSは区切り文字の環境変数です。bashの場合、空白文字が区切り文字として初期設定されています。

これを強制的に書き替えたあと、配列を

${配列名[*]}

の形式で出力すると、書き替えたIFSを区切り文字と利用します。

ここではサンプルを簡単にするために区切り文字を書き替えたままにしていますが、処理のあとで空白文字を区切り文字として利用する場合は元に戻しましょう。

#!/bin/bash
 
declare -a list=("a" "b" "c")
backup=$IFS
result="$(IFS=","; echo "${list[*]}")"
IFS=$backup
echo ${result}
Comments [0] | Trackbacks [0]

コマンドの実行結果をdiffする方法

July 8,2019 12:03 AM
Category:[Linux]
Tag:[Linux]
Permalink

コマンドの実行結果をdiffする方法を紹介します。

1.問題点

次のlsコマンドの実行結果を2つ取得し、取得結果の差分をdiffで取得したいのです。

$ ls -1 /home/foo/test1
$ ls -1 /home/foo/test2

次のように実行結果をファイルに出力すれば簡単にdiffできるのですが、できればファイル出力なしで実施したいです。

$ ls -1 /home/foo/test1 > /home/foo/result1
$ ls -1 /home/foo/test2 > /home/foo/result2
$ diff /home/foo/result1 /home/foo/result2

ということで、コマンドの実行結果をdiffする方法を紹介します。

2.コマンドの実行結果をdiffする

コマンドの実行結果をdiffするには、リダイレクションを使って、コマンドの実行結果をdiffの入力にします。

$ diff <(ls -1 /home/foo/test1) <(ls -1 /home/foo/test2)
Comments [0] | Trackbacks [0]

bashのif文で正規表現を使用する方法

July 1,2019 11:55 PM
Category:[bash]
Tag:[bash]
Permalink

bashのif文で正規表現を使用する方法を紹介します。

1.問題点

#!/bin/bash
 
foo=abc123efg

変数fooの中から"123"だけを取り出したいのですが、方法が分かりません。

ということで、bashのif文で正規表現を使用する方法を紹介します。

2.if文で正規表現を使用する

if文で正規表現を使用するには次のようにします。

#!/bin/bash
 
foo=abc123efg
 
if [[ ${foo} =~ ^[a-z]+([0-9]+).*$ ]]; then
  echo ${BASH_REMATCH[1]}
fi

実行結果

123

ポイントは下記のとおりです。

  • if文はブラケット(大カッコ)を二重にする
  • 演算子は"=~"
  • 正規表現はクォーテーションで括らない(正規表現で特別扱いの文字がバックスラッシュでエスケープされるため)
  • 後方参照(カッコで囲った部分)は ${BASH_REMATCH[1]} で取得(複数ある場合、[2][3]…で取得)

Perl系の表記方法("\d"や"\w"など)は使えないみたいなので、POSIX表記を利用します。

\w→[:alnum:]
\d→[:digit:]
\s→[:blank:]

詳細は"info -f 'grep' -n 'Character Classes and Bracket Expressions"で確認できます。

if文の中でPOSIX表記を使う場合、さらに"[]"で括る必要があります。

上記のサンプルを一部POSIX表記に直したものが下記です。

#!/bin/bash
 
foo=abc123efg
 
if [[ ${foo} =~ ^[a-z]+([[:digit:]]+).*$ ]]; then
  echo ${BASH_REMATCH[1]}
fi

実行結果

123

3.参考サイト

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

Comments [0] | Trackbacks [0]

Movable Type「Workflowプラグイン」に記事単位のワークフロー機能追加

June 25,2019 12:03 AM
Category:[ワークフロー]
Tag:[MovableType, Plugin, Workflow]
Permalink

当サイトで販売中のMovableType・Workflowプラグインに記事単位のワークフロー機能を追加しました。

1.機能

これまでのWorkflowプラグインは、「ライター(承認つき)」というプラグイン特有の権限を持つユーザのみが作成した記事をワークフロー対象にしてきました。

今回の機能追加で、この権限をもたないユーザが作成した記事でも、記事単位にワークフロー対象にすることが可能になりました。

設定は簡単で、ワークフロー対象にしたいコンテンツデータや記事に表示された「ワークフロー対象にする」をチェックするだけです。

ワークフロー対象にする

これにより、既存の公開済の記事もワークフロー対象にすることができるようになりました。

さらに記事単位のワークフローは、システム管理画面およびサイト管理画面のプラグイン設定で有効・無効をきめ細かに設定できます。

プラグイン設定

それぞれのグレードに順次、機能追加していく予定です。

2.プラグインのダウンロード

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

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

Comments [0] | Trackbacks [0]

grepで行番号だけを表示する方法

June 19,2019 11:55 PM
Category:[Linux]
Tag:[Linux]
Permalink

grepで行番号だけを表示する方法を紹介します。

1.問題点

下記のtest.txtというファイルがあります。

test.txt

aaa
bbb
ccc
ddd
eee

このファイルをgrepコマンドで"ccc"を検索します。"-n"は行番号を表示するオプションです。

# grep -n ccc text.txt

実行結果

3:ccc

この検索結果に表示された行番号「3」だけを表示させたいのですが、方法がわかりません。

ということで、grepで行番号だけを表示する方法を紹介します。

2.grepで行番号だけを表示する

grepで行番号だけを表示するには、sedと組み合わせます。

# grep -n ccc test.txt | sed -e 's/:.*//g'

実行結果

3

sedでは、行番号以降のコロンから末尾までを削除しています。

Comments [0] | Trackbacks [0]

Movable Type 7の記事一括編集画面でユーザ変更できる「SelectUsers」プラグイン

June 11,2019 12:03 AM
Category:[記事一覧]
Tag:[MovableType, Plugin, SelectUsers]
Permalink

Movable Type 7の記事一括編集画面でユーザを変更できるようにするプラグインを公開します。

1.はじめに

記事の作成ユーザの変更は、記事一覧画面に表示されたユーザをクリックすることで可能になります。

詳細は割愛しますが、MT7-R4601に本プラグインを適用すれば、記事の一括編集画面でユーザ変更ができるようになります。

記事の一括編集画面

2.プラグインのインストール

下記のリンクをクリックして、SelectUsersのプラグインアーカイブをダウンロードします。

SelectUsers_0_01.zip

プラグインアーカイブを展開し、pluginsフォルダにあるSelectUsersフォルダをMovable Typeのアプリケーションディレクトリのpluginsディレクトリにアップロードします。

システム管理画面のプラグイン設定画面で「SelectUsers~」が表示されればインストール完了です。

プラグイン一覧画面

Comments [0] | Trackbacks [0]

自宅のBD(ブルーレイディスク)レコーダーに録画した番組をスマホから視聴する方法

June 7,2019 12:03 AM
Category:[小品文]
Tag:[Panasonic]
Permalink

自宅のBD(ブルーレイディスク)レコーダーに録画した番組をスマホから視聴する方法を紹介します。

Panasonic Media Access

キャプチャ画面での説明はありませんので予めご了承ください。

1.はじめに

自宅にPanasonicのBDレコーダー(DMR-BRG1030)があるのですが、外出先でスマホから視聴したいと思い、設定してみました。

2.スマホから視聴できる仕組み

PanasonicのBDレコーダー(以下BDR)の番組をスマホから視聴できるようにする手順は、おおむね下記のようなものです。

  1. BDRを自宅のネットワークに接続
  2. スマホに視聴用アプリ(Panasonic Media Access)をインストール
  3. スマホを自宅のネットワークに接続
  4. アプリを起動して表示された機器(DMR-BRG1030)を選択
  5. 視聴

4番目のペアリングのためには、1番目と3番目のネットワーク接続で、無線LANブロードバンドルータが必要です。

当初よくわからずに手元にあるWiMAXのルータで試してみたのですが、4番目の機器選択が行えませんでした(アプリに機器が表示されない)。

3.無線LANルータの購入

私は自宅で有線LANブロードバンドルータしか持っていなかったので、仕方なく無線LANルータを購入しました。

購入したのは、ElecomのWRC-1900GST2です。

速度がそこそこ出て、対応している無線LANの規格が多かった(5GHz:11ac/11n/11a、2.4GHz:11n/11g/11b)のが選んだ理由です。

ちなみに無線LANルータをモデムに直接接続して設定しようとしたのですが、何回トライしても失敗したので諦めてアクセスポイント(有線LANルータに無線LANルータを接続する形態)にすることで事なきを得ました。

4.BDRを自宅のネットワーク(WiFi)に接続

BDRの「機能一覧」→「ネットワーク設定(メニューの一番左側、一度横スクロールしないと出てきません)」を選択して、「かんたんネットワーク設定」を選択すれば無線LANと接続してくれます。

このあと「かんたんネットワーク設定」の下にある「ネットワーク通信設定」を選択して、「宅外リモート接続設定」を選択して、「宅外リモート接続機能」が「入」になっていることを確認します。

「切」になっていたら「入」に変更してください。

5.スマホに視聴用アプリ(Panasonic Media Access)をインストール

「Panasonic Media Access」は下記です。
Panasonic Media Access

機能の説明は下記にあります。
外からどこでもスマホで視聴

視聴だけでなく、番組一覧から録画の設定や録画した番組の消去も可能です。

6.スマホを自宅のネットワークに接続

アプリを利用するには「ディモーラ」の会員登録が必要です(この辺の手順は失念しました、すいません)。

登録後、スマホ(ここではiPhone)の「設定」→「Wi-Fi」で無線LANルータを選択します。Wi-Fiが優先させるのでモバイルデータ通信はオフにしなくても大丈夫だと思います。

会員登録や機器登録は登録時のメールアドレスに送信されます。

7.アプリを起動して表示された機器(DMR-BRG1030)を選択

アプリを起動すると接続するBDR機器の選択画面になります。ここではDMR-BRG1030を選択します。

これでスマホのアプリと自宅のBDRがペアリング?されるようです。一旦ペアリングされれば、スマホのモバイルデータ通信や他のWi-Fi環境で、自宅のBDRにアクセスできます。

8.視聴

機器選択後、アプリのメニュー(左上の3本線)をタップして、「機器別メニュー」→「録画一覧」を選択すれば、これまでに録画した番組の一覧が表示されます。

メニュー表示直後は何も表示されていません。情報を収集して表示されるまでに数分待たないといけないようです。

またセキュリティの甘いネットワーク(公衆向けWiFiなど)では視聴できないようです。

Comments [0] | Trackbacks [0]

MovableType 7のコンテンツデータのデータ識別ラベルを自動入力する方法

May 27,2019 11:55 PM
Category:[Movable Type]
Tag:[MovableType]
Permalink

MovableType 7のコンテンツデータのデータ識別ラベルを自動入力する方法を紹介します。

1.はじめに

MovableType 7のコンテンツデータのデータ識別ラベルは、デフォルトで手入力になっています。

データ識別ラベル

これを他のコンテンツフィールドの値を利用するように変更(=自動入力)することができます。下の例では「名前」フィールドの値をデータ識別ラベルとして利用しています。

名前の値がデータ識別ラベルとして利用されます

この設定を行うことで、データ識別ラベルを手入力する手間が省けます。

ということで、MovableType 7のコンテンツデータのデータ識別ラベルを自動入力できるようにする方法を紹介します。

2.データ識別ラベルを自動入力する

データ識別ラベルを自動入力するには、まずデータ識別ラベルとして適用するコンテンツフィールドを選択します。

データ識別ラベルとして適用可能なコンテンツフィールドは、

  • テキスト
  • URL

のいずれかになります。

それでは、下記の「商品」コンテンツタイプを例に手順を説明します。

コンテンツタイプ編集画面より、適用したいコンテンツフィールドを選択。ここでは「名前」フィールドを選択。

コンテンツフィールドを選択

フィールドを「必須」に変更して「保存」をクリック。

フィールドを「必須」に変更

続いて、コンテンツタイプ名の右側にある「編集」をクリック。

「編集」をクリック

編集用のダイアログが開くので、「データ識別ラベル」から「名前」を選択し、「閉じる」をクリック。元の画面で「保存」をクリック。

「データ識別ラベル」から「名前」を選択

これでコンテンツデータ作成画面のデータ識別ラベルに「名前の値がデータ識別ラベルとして利用されます」が表示されます。

名前の値がデータ識別ラベルとして利用されます

3.その他

この操作が可能な条件については、下記の公式ドキュメントに記載されています。

コンテンツデータの識別ラベルを設定する

Comments [0] | Trackbacks [0]

Bashで変数を大文字または小文字に変換する方法

May 13,2019 11:55 PM
Category:[bash]
Tag:[bash]
Permalink

Bashで変数を大文字または小文字に変換する方法を紹介します。

1.問題点

bashで次のサンプルを作りました。

#!/bin/bash
 
foo=ABC

変数fooの値をすべて小文字にしたいのですが、方法がわかりません。

ということで、Bashで変数を大文字または小文字に変換する方法を紹介します。

2.変数を大文字または小文字に変換する

たとえば、大文字の変数をすべて小文字に変換するには次のように、変数の後ろにカンマを2つ記述します。

#!/bin/bash
 
foo=ABC
echo ${foo,,}

実行結果

abc

変換のパターンは次の6種類があります。

パターンフォーマットサンプル結果
1文字目を大文字${foo^}foo=abc; echo ${foo^}Abc
すべてを大文字${foo^^}foo=abc; echo ${foo^^}ABC
1文字目を小文字${foo,}foo=ABC; echo ${foo,}aBC
すべてを小文字${foo,,}foo=ABC; echo ${foo,,}abc
1文字目を反転${foo~}foo=ABC; echo ${foo~}aBC
すべてを反転${foo~~}foo=aBc; echo ${foo~~}AbC

注意点は、変換する記号「^」「,」「~」はカッコで括ることです。

Comments [0] | Trackbacks [0]

bashの変数をsplitして配列を作る方法

May 9,2019 11:55 PM
Category:[bash]
Tag:[bash]
Permalink

bashの変数をsplitして配列を作る方法を紹介します。

1.問題点

bashで次のような変数を作成しました。

#!/bin/bash
 
foo=a,b,c,d,f,e,g

この変数fooを","でsplit(分割)して配列変数に代入したいのですが、方法がわかりません。

ということで、bashの変数をsplitして配列を作る方法を紹介します。

2.bashの変数をsplitして配列を作る

bashの変数をsplitして配列を作るには、文字列置換を利用します。

#!/bin/bash
 
foo=a,b,c,d,f,e,g
list=(${foo//,/ })
echo ${list[@]}
echo ${list[1]}

実行結果

a b c d e f g
b

3.文字列置換について

今回利用したbashの文字列置換のフォーマットは、

${変数名/置換前文字列/置換後文字列}

が基本です。

これで、変数の中にマッチする文字があれば1回のみ置換します。

#!/bin/bash
 
foo=a,b,c,d,f,e,g
list=(${foo/,/ })
echo ${list[@]}
echo ${list[1]}

実行結果

a b,c,d,e,f,g
b,c,d,e,f,g

マッチする文字をすべて置換したい場合は、2項のサンプルのようにスラッシュを2つにして、

${変数名//置換前文字列/置換後文字列}

とします。

"//"はsedの"/g"オプションと同じ意味になります。

Comments [0] | Trackbacks [0]

PythonでEUC-JPのファイルを読み込んで正規表現を使う方法

April 30,2019 11:55 PM
Category:[Python]
Tag:[Python]
Permalink

PythonでEUC-JPのファイルを読み込んで正規表現を使う方法を紹介します。

Pythonは2.x系です。

1.問題点

下記の、文字コードがEUC-JPのファイルがあります。

text.txt

テスト1
テスト2
テスト3

このファイルから「テスト2」の部分だけをマッチさせたいので、下記のスクリプトを作ったのですがマッチしません。

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
 
import sys
import codecs
import re
 
path = './test.txt'
f = codecs.open(path, 'r', 'euc_jp')
for line in f:
    result = re.search('テスト2', line)
    if result:
        print line

ということで、PythonでEUC-JPのファイルを読み込んで正規表現を使う方法を紹介します。

2.EUC-JPのファイルを読み込んで正規表現を使う

EUC-JPのファイルを読み込んで正規表現を使うには、search()の第1パラメータにuフラグを与えます。

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
 
import sys
import codecs
import re
 
path = './test.txt'
f = codecs.open(path, 'r', 'euc_jp')
for line in f:
    result = re.search(u'テスト2', line)
    if result:
        print line

これでEUC-JPのファイルで正規表現が使えるようになります。

Comments [0] | Trackbacks [0]

Pythonで正規表現を使う方法

April 24,2019 12:03 AM
Category:[Python]
Tag:[Python]
Permalink

Pythonで正規表現を使う方法を紹介します。

1.問題点

下記のスクリプトを書きました。

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
 
str = 'abc123def'
print str

このスクリプトを修正して、変数strに含まれる数字"123"だけを出力したいのですが、方法が分かりません。

ということで、Pythonで正規表現を使う方法を紹介します。

正規表現の詳細については、ここでは割愛します。

2.Pythonで正規表現を使う

正規表現を使うには次のようにします。

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
 
import re
 
str = 'abc123def'
result = re.search('\d{3}', str)
print result.group()

3.解説

Pythonの正規表現モジュール「re」をインポートします。

import re

パターンに一致するか調べるには、search()を使用します。

result = re.search('\d{3}', str)

フォーマットは次のとおりです。

  • 第1パラメータ:パターン
  • 第2パラメータ:対象の文字列または変数

戻り値のresultには一致結果がはいっています。group()メソッドを使うことでパターンにマッチした内容すべてを返却します。

サンプルでは数字3文字にマッチした"123"が出力されます。

パターンマッチの関数はsearch()の他にmatch()がありますが、これは文字列の先頭がパターンマッチするかを調べるためのものです。

Comments [0] | Trackbacks [0]

ansibleでファイルを書き替える方法

April 18,2019 12:03 AM
Category:[ansible]
Tag:[ansible]
Permalink

ansibleでファイルを書き替える方法を紹介します。

1.はじめに

ansibleでファイルの中身を書き替えたいのですが、方法が分かりません。

ということで、ansibleでファイルを書き替える方法を紹介します。

2.ansibleでファイルを書き替える

ansibleでファイルを書き替えるには、lineinfileモジュールを利用します。

下記にサンプルを示します。すいませんがhostsの部分は適宜直してください。

- hosts: localhost
  become: True
  tasks:
  - name: lineinfile
    lineinfile:
      path: /home/hoge/test.txt
      regexp: '^aaa'
      line: 'bbb'
  • lineinfile:ファイル書き換えのためのモジュール
  • path:書き替え対象のパス・ファイル名(必須)
  • regexp:書き替え前の内容(正規表現)
  • line:書き替え後内容

上記の例は、ファイル/home/hoge/test.txtの行頭が

aaa

という行を

bbb

に書き替えています。

なお、regexpの部分が見つからない場合、lineの内容がファイルの末尾に追加されます。

path、regexp、lineは適宜書き替えてお使いください。

3.ansibleでファイルの特定行を削除する

ansibleでファイルの特定行を削除するには、stateオプションを利用します。

- hosts: localhost
  become: True
  tasks:
  - name: lineinfile
    lineinfile:
      path: /home/hoge/test
      state: absent
      regexp: '^aaa'
  • state:行が存在するか・しないか(削除なので"absent")

これでregexpにマッチする行を削除します。

ちなみに書き替えでstateオプションをつけるのであれば、

      state: present

とします。

ただしデフォルト値がpresentなので、あえて記述する必要はありません。

Comments [0] | Trackbacks [0]

ansibleでvisudoする方法

April 16,2019 12:03 AM
Category:[ansible]
Tag:[ansible]
Permalink

ansibleでvisudoする方法を紹介します。

1.はじめに

サーバ設定作業でansibleを使うことになりました。

「ansibleを使ってこういうときにどうすればいいの?」っていう情報がネットを検索してもなかなかヒットしないので、分かる範囲で小出しにしていきます。

2.ansibleでvisudoする方法

ansibleでvisudoするには、下記のようなplaybookで対応します。hostsの部分は適宜直してください。

- hosts: localhost
  become: True
  tasks:
  - name: test
    lineinfile:
      path: /etc/sudoers
      state: present
      regexp: '^%ADMIN ALL='
      line: '%ADMIN ALL=(ALL) NOPASSWD: ALL'
      validate: '/usr/sbin/visudo -cf %s'
  • lineinfile:ファイル書き換えのためのモジュール
  • path:書き替え対象のパス・ファイル名(必須)
  • state:行が存在するか・しないか(書き替えなので"present")
  • regexp:書き替え前の内容(正規表現)
  • line:書き替え後内容
  • validate:書き替え後の検証。"%s"でpathの内容を指定

上記の例は、

%ADMIN ALL=

という行を

%ADMIN ALL=(ALL) NOPASSWD: ALL

に書き替えて、

# /usr/sbin/visudo -cf /etc/sudoers

で、書き替えたファイルの検証をしています。

regexpとlineを適宜書き替えてお使いください。

Comments [0] | Trackbacks [0]

Pythonで「SyntaxError: Non-ASCII character」というエラーの対処

April 9,2019 11:55 PM
Category:[Python]
Tag:[Python]
Permalink

Pythonで「SyntaxError: Non-ASCII character」というエラーの対処について紹介します。

1.問題点

Pythonで下記のようなスクリプトを書きました。

test.py

#!/usr/bin/env python2
print 'テスト'

このスクリプトを実行したところ、下記の「SyntaxError: Non-ASCII character」というエラーに遭遇しました。

$ ./test.py
  File "./test.py", line 3
SyntaxError: Non-ASCII character '\xe3' in file ./test.py on line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

2.「SyntaxError: Non-ASCII character」というエラーの対処

このエラーを解消するには、ファイルに下記の1行を追加します。

test.py

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
print 'テスト'

実行結果

テスト

この

# -*- coding: utf-8 -*-

という行は、

あるいは下記の記述でもOKです。

#!/usr/bin/env python2
# coding:utf-8
print 'テスト'

または、

#!/usr/bin/env python2
# coding=utf-8
print 'テスト'

3.注意事項

サンプルのようにshebang行がある場合は、その直後(2行目)に記述してください。

下記のように行を空けて記載するとエラーが解消されないようです。

test.py

#!/usr/bin/env python2
 
# -*- coding: utf-8 -*-
print 'テスト'
Comments [0] | Trackbacks [0]
 1  |  2  |  3  |  4  |  5  | All pages