unix/linux:決められた時刻に処理を実行する(ワンライナー編)

unix/linuxの便利コマンドの紹介です。


テストや補正作業を行う際、決められた時刻に決められたコマンドを実行したい場合があります。
unix/linuxでは、atコマンドを使用することで、決められた時刻に決められたコマンドを自動的に実行するように登録することができます。

しかし、atコマンドを通常の使い方をする場合、対話式にコマンドを入力したりコマンドを記載したファイルを別途用意したりする必要があり、オペレータに作業を依頼したりシェルスクリプトに組み込んだりする場合に都合が悪い場合があります。
そこで、下記のようにプロセス置換(コマンドをファイルに見立てる記法)を用いることで、対話式のコマンド入力やファイルの用意をする必要がなくなります。

・20:00に/home/hoge/test.txt(空ファイル)を作成するように登録する例

#> at 20:00 -f <(touch /home/hoge/test.txt)


OSのバージョンやatコマンドの設定によっては、atコマンドを使用できない場合もあります。
その場合は、下記のようにループ処理とバックグラウンドを併用することで、atコマンドと同じようなことを実現できます。

・20:00に/home/hoge/test.txt(空ファイル)を作成するように登録する例

#> (TIME=date "+%H%M"; while[${TIME} -lt 2000]; do sleep 60; TIME=date “+%H%M”; done; touch /home/hoge/test.txt) &


いかがでしたでしょうか。

unix/linuxのコマンドを使いこなせるようになると、できる作業の幅が広がります。
今回紹介したコマンドも、使う機会が少なくないのではと思います。

これからも、便利コマンドを紹介していきたいと思います!

ウォーターフォールモデルとV字モデル

日本でシステム開発を行う場合、多くの場合は「ウォーターフォールモデル」と呼ばれるプロセスに従って開発を進めます。
ウォーターフォールモデルを知ることで、各々の工程を何のために行うのかを考えることができるようになります。
システム開発作業に参画する際は、ウォーターフォールモデルについて知っていることが望ましいです。

ウォーターフォールモデルでは、実際にプログラムを作るまでは「要件定義(基本計画)」→「外部設計(基本設計)」→「内部設計・プログラム設計(詳細設計)」→「プログラミング(製造)」といった工程を踏みます。
ユーザの要求からスタートし、段階的に詳細化しシステム化の方針を決めるといった形で、トップダウンで開発を行います。
プログラムを作り終えてからは、「単体テスト(UT)」→「結合テスト(IT)」→「システムテスト(総合テスト、ST)」→「運用テスト(UAT)」といった工程を踏みます。
バグ頻発でテスト進行が妨げられることを防ぐために、細かい箇所からテストを行い徐々に統合するという形で、ボトムアップで開発を行います。

開発工程とテスト工程は、以下のように連関しています。

プログラミングの内容は単体テスト、内部設計・プログラム設計の内容は結合テスト、外部設計の内容はシステムテスト、要件定義の内容は運用テストで検証します。
これをV字モデルと呼びます。

誤りを修正する場合、後の工程になるほど手戻り工数が増え、修正コストが増大します。
最悪なのは、リリース後に誤りが発見され、修正の必要が生じた場合です。
そのため、手戻りは原則として行わず、各々の工程を順番にこなしていくことが理想です。
(水が流れるように順番に工程をこなすことから、「ウォーター(水が)フォール(流れ落ちる)」と呼ばれるようになりました)

手戻りを防ぐためには、レビューを強化する等し、ある工程で埋め込んだ誤りはその工程の中でできる限り解消することが重要になります。
仮に後の工程で誤りが発見された場合は、その誤りについてなるべく早い段階で例外的に前工程に戻り、その誤りの修正に関わる要件・設計・実装を見直すことが重要になります。
大規模かつミッションクリティカルなシステム開発では特にこの原則を守ることが重要となります。
以下は東証のシステム更改の例で、前工程への手戻りを正式にプロセスに組み込むことで手戻り工数を削減する「フィードバック型V字モデル」が採用されました。
http://ac.nikkeibp.co.jp/cn/xdev10/pdf/10907-xdev-A-1.pdf

また、実現性が疑わしい箇所について開発開始前にプロトタイプを作成し、実現性をあらかじめ検証するという手法も使われます。
プロトタイプを作ることで、開発開始時に実現性の問題が出て手戻りが発生することを防ぐことができます。
(このような事前検証は「POC」と呼ばれることもあります)

ざっくりまとめると、先が見える場合は1つ1つの作業を確実にこなす、先が見えない場合は先回りして視界を良好にする、という姿勢がプロジェクトを円滑に進める上で重要になります。


いかがでしたでしょうか。

私も1~2年目だった頃は、手戻りのリスクを考えずに猪突猛進に作業を進めて、結局手戻りして先輩に迷惑をかけたことがあります。
若手なら先輩に迷惑をかける程度で済みますが、リーダーや管理者の立場で同じことをすればプロジェクト全体の進捗に影響してしまいます。

ウォーターフォールモデルはシステム開発のプロセスとしては基本的なものですが、基本だからこそないがしろにしてはいけないと思っています。
単純に各工程の名前と作業内容を覚えるだけでなく、その背景にある理念も含めて理解する必要があると思っています。

それではまた次回!

Excel:VLOOKUP関数と代替関数の使い方のまとめ

表題の通り、VLOOKUP関数とその代替関数の使い方をまとめました。

Excelであるキーに対応する値を取って来たい場合、多くの場合はVLOOKUP関数(第四引数FALSE)を使うと思います。
記述量も少なく関数の内容もわかりやすいので、VLOOKUP関数は広まっていますし、とりあえず検索したい時はVLOOKUP関数(第四引数FALSE)で事足ります。

しかし、高速化する必要がある場合や左側の項目を取得する場合、行と列の両方にキーが存在する場合は、他の方法で検索する必要があります。
一番汎用性が高いのはINDEX関数とMATCH関数の合わせ技です。
MATCH関数は第二引数で指定された範囲から第一引数が存在する位置を返すというもので、INDEX関数は第一引数の範囲から第二引数が示す位置を返すというものです。INDEX関数の第二引数にMATCH関数の結果を用いることでVLOOKUP関数と同じようなことができます。左側の項目を取得したい場合にも対応できます。
また、MATCH関数の第三引数(通常は0)を1にすることで、文字コードの昇順に並んでいる範囲を二分検索で高速で検索することもできます。
更に、INDEX関数は第二引数で行の位置、第三引数で列の位置を指定することもでき、この二つの引数を用いることで行と列の両方にキーが存在するケースにも対応できるようになります。
いざという時に使えるようにしておくと便利でしょう。


使い方をまとめた画像は以下になります。

以下、コピペ用にテキストでも記載します。
セル指定は適宜変更して下さい。

・キー項目が昇順・降順ではない場合の検索

VLOOKUP(B12,$B$3:$D$7,3,FALSE)
INDEX($D$3:$D$7,MATCH(B17,$B$3:$B$7,0))

・キー項目が昇順の場合の高速検索

IF(VLOOKUP(B21,$C$3:$C$7,1,TRUE)=B21,VLOOKUP(B21,$C$3:$D$7,2,TRUE),NA())
IF(LOOKUP(B25,$C$3:$C$7)=B25,LOOKUP(B25,$C$3:$C$7,$D$3:$D$7),NA())
INDEX($D$3:$D$7,MATCH(B28,$C$3:$C$7,1))

・キー項目が右側に存在する場合の検索

IF(LOOKUP(B35,$C$3:$C$7)=B35,LOOKUP(B35,$C$3:$C$7,$B$3:$B$7),NA())
INDEX($B$3:$B$7,MATCH(B38,$C$3:$C$7,1))

・列検索と行検索を同時に行う場合の検索

INDEX($B$2:$D$7,MATCH(C46,$B$2:$B$7,0),MATCH(B46,$B$2:$D$2,0))


いかがでしたでしょうか。

キーに対応する値を取って来るだけでも、意外と奥深いことが分かったと思います。
VLOOKUP関数(第四引数FALSE)で大抵の場合は事足りるとは言え、遅い、左側の項目を取得できない、行と列を同時に検索できない、という不満はいずれ持つと思います。
そのような時に、INDEX関数とMATCH関数の合わせ技でサクっと対応できることがあるので、覚えておくと便利だと思います。

次回も、役に立つ情報を提供していきたいと思います!

ExcelのVLOOKUP関数の高速化

今回はExcelの小技ということで、検索でよく使うVLOOKUP関数の高速化についてです。

VLOOKUP関数は、第四引数にTRUEかFALSEかを設定します。
通常はFALSEで使用すると思うのですが、TRUEを指定するとあいまい検索になります。
「あいまい検索」と言われると部分一致検索のようなものを思い浮かべるかもしれませんが、実際は二分検索だそうです。
二分検索については情報処理技術者試験でも出題されるので各自調べてほしいのですが、平たく言うと検索対象のデータが昇順にソートされていることを条件に高速に検索する方法です。
Excelの場合は文字コード(SJIS)の昇順に並べる必要があります。

FALSEの場合は線形検索(上から順次検索)になるので、検索対象のデータ量がN倍になると検索にかかる時間もN倍になります。
しかし、TRUEの場合は二分検索になるので、検索対象のデータ量がN倍になっても検索にかかる時間はlogN(底は2)倍の増加で済みます。
例えば、データ量が2倍になった場合は、FALSEだと2倍の時間がかかるようになりますが、TRUEだと1.414…倍になります。データ量が3倍になった場合は、FALSEだと3倍の時間、TRUEだと1.732…倍になります。

注意点としては、TRUEにした場合は満たす値が無かった場合にも値を返すようになるということがあります。
検索条件を満たす値が無かった場合は、満たす値未満の最も大きな値を返します。
例えば、以下のようにデータ並んでいて11を検索した場合は、けが返ります。
10 け
12 こ

FALSEの場合と同じように一致するデータが無かった場合に#N/Aとしたい場合は、以下のようにする必要があります。
=IF(VLOOKUP(検索値,範囲,1,TRUE)=検索値,VLOOKUP(検索値,範囲,列番号,TRUE),NA())
まずは検索条件と同じデータが存在するかどうかを調べ、存在する場合のみ検索をする、存在しない場合は#N/Aとする、ということをしています。
VLOOKUP関数を2回発行しているのでデータ量が少ないとFALSEの場合よりも時間がかかる場合もありますが、データ量が増えてくると効果を発揮します。

ここで注意点なのですが、漢字をキーにして検索する場合は、フィルタからの並び替えは不可です。
フィルタから並び替えると、文字コードの昇順ではなく、読み仮名の昇順に並んでしまうためです。

漢字を文字コードの昇順に並び替えるためには、以下の手順を踏む必要があります。

1.「データ」タブ→「並び替え」を選択

2.「オプション」を選択

3.「ふりがなを使わない」を選択

4.「列」を当該列、「並び替えのキー」を「値」、「順序」を「昇順」とする

5.「OK」を押下すると文字コードの昇順に並び替えられる


いかがでしたでしょうか。

VLOOKUP関数は普段の業務でも良く使用する関数だと思うのですが、調べてみると意外と奥深いことがわかります。
二分検索を使用した高速検索、漢字の文字コード順の並び替えについては、知っておいて損はないと思います。

業務で役に立つ小ネタがありましたら、また紹介しようと思います!

unix/linux:perlの複数命令を1行のコマンドで実行する(例:文字列のバイト位置走査)

perlはファイル操作や正規表現に優れているスクリプト言語であるため、コマンドライン上でperlを駆使することができれば作業の幅が広がります。
perlの-eオプションによりコマンドライン上で実行可能となり、1つ1つの命令を ; で区切ることで複数命令を記述可能となるため、これを使いこなすことでスクリプトを作らなくともperlの機能を作業に使うことができるようになります。
コマンドを予め作成して本番作業時にコピペしたい場合やオペレーターに作業を依頼する場合等、スクリプトを気軽に作れない場合も少なくないので、そのような場合に効果を発揮します。

以下は、ファイルの中から特定の文字列のバイト位置を走査する例です。
ファイルの先頭で見つかった場合は0、次のバイトで見つかった場合は1、…といった具合で値が返ります。
見つからなかった場合は-1が返ります。
(例えば、改行コード無しのファイルで特定のデータをcutで除外したい時に、除外する位置を確認するのに使えます)


いかがでしたでしょうか。
perlという言語自体は知っている方が多いと思いますが、それをコマンドラインから実行して作業を効率化できる、というのは盲点ではなかったでしょうか。

ちなみに、今回紹介しませんでしたが、perl -eには便利な追加オプションがいくつもあります。
(標準入力(インプット)を1行1行処理、改行の強制付与、等)
「perl ワンライナー」で検索すると参考になるページが出てくるので、更に複雑な操作を行いたい場合は調べてみると良いでしょう。

では、また来週!