#00 [foussin分室] ... [<<:home (index.html)] ... [<<:top (top.cgi)]
....... [<:prev (アマチュア・スタイル!)] ... [here: ecalc.pl] ... [フレーム解除]

アマチュア・スタイル!

[utl 01] ユーティリティ(コマンド)
ecalc.pl 簡易電卓(いわゆる calc コマンド)

updated: 2010/08/26 Thu 02:47 (JST-9)
©pablo foussin

#01 能書き: ecalc.pl とは
#02 能書き: モチベーション(ecalc.pl 作成の動機)
#03 ecalc.pl の使い方(1回だけ実行モード)
#04 ecalc.pl の使い方(繰り返し実行モード)
#05 注意事項(重要)
#06 ダウンロード
#07 小ネタ: calc.exe(電卓) について


[<:head #00] [here: #01] [>:next #02]

#01 能書き: ecalc.pl とは

ecalc.pl とは、作者が Perl 初級者の頃から、Perl の習熟のために作ってきた簡易電卓で、いわば習作程度のものだ。最初は、jperl 用のスクリプトとしてコーディングしていたので、名称を ecalc.jpl としていた。が、Perl 5.8 がリリースされた今となっては、もう jperl は使えない…。そんなわけで、『Perl 5.8』『Windows XP』対応にバージョンアップし、名称も ecalc.pl に変更した。

ecalc.pl は、一応 Windows 9x/NT/XP、UNIX系で動作可能だが、UNIX系の場合、bc コマンド(高機能電卓)が最初から実装されているので、ecalc.pl は要らないだろうな。


[<<:head #00] [<:prev #01] [here: #02] [>:next #03]

#02 能書き: モチベーション(ecalc.pl 作成の動機)

作成の動機(其ノ壱): 自分の欠点を補う

『パソコン』がパーソナル・コンピュータの略であることは、誰もがご存知だろう。つまり、パーソナル・ユース(個人用)のコンピュータということ。そのため、パソコンの使い方は『ユーザー次第』とよく言われる。が、こんなアドバイスでは抽象的すぎて、パソコンをどう使えば良いのか分からず途方に暮れてしまう…。

私は『個人用のコンピュータ』の条件として、何よりも重要なことは『自分の欠点を補えること』だと考えている。なので『自分の欠点は何か』…それを冷静に分析することが、パソコンを上手に使いこなせるかどうかを決める手がかりになると思っている。

私はハッキリ言って「頭の回転が鈍い」…例えば、暗算が苦手だ(すぐに答が出てこない)。自分の直感は当てにならない(←コレ、自分の人生で得た苦い教訓)… どちらかといえば論理的なほうだ(たぶん左脳型の人間だ)。グラフィック・デザイナーであった私が Mac よりも Windows に親近感を覚える理由も、『直感的インターフェース』の Mac より、『論理的インターフェース』の Windows の方が自分の気質に合っていたからだと思っている。Windows がパソコン業界で成功したのは、圧倒的多数の凡人に支持された結果だと思っている。一方の Mac は、少数派の『直感型』の人間(その多くが天才肌の人間だ)に支持された。それが色濃くシェアに現れている…でしょ?

作成の動機(其ノ弐): Windows の不備を補う

そんな私にとっての『理想的なパソコン』とは、コンピュータの概念そのものである『電子計算機』の機能に自由にアクセスできることだった。ところが Windows に用意されている『電卓』はオマケソフト程度のもので、電卓については Mac の方がずっと便利だった。どちらにせよ、電子計算機であるパソコンの全機能にアクセスできるシロモノではないし、これを「便利で有り難い」と思っているユーザーも多くはいないだろう。

皆さんは BASIC というプログラミング言語をご存知だろうか。BASIC は Perl と同様の『インタープリタ言語』だ。BASIC でプログラムを実行するには、最初にインタープリタを起動する。すると BASIC 専用の編集・実行画面が表示され、ユーザーの入力を待つ。この状態を『BASIC command level(コマンド入力待ち)』と言う。

コマンド入力待ちの状態で、半角数字(0-9)から始まる文を入力してEnterキー(RETURNキー)を押すと、インタープリタはそれを行番号付きのプログラム文(ステートメント)と解釈してメモリに格納する。この状態を『エディット・モード』と呼ぶ。

一方、数字以外の半角英字(a-zA-Z) から始まる文字列を入力して Enterキーを押すと、それはコマンドと解釈され、直ちに実行される。この状態を『ダイレクト・モード』と言う。

そして、ダイレクトモードで RUN というコマンドを実行すると、メモリに格納したプログラムを実行することができる。プログラム実行中の状態を『プログラム・モード』と言う。このように BASIC インタープリタは、ユーザーの入力を常に監視して、入力された文字列に対して適切なモードを自動的に切り替える機能を持っている。BASIC が主流だった当時のパソコンは『シングル・タスク』が当たり前だったので、このような方法で、複数の作業を切り替える機能が必要だった。

さて、プログラムを編集していると、検算を行うために電卓が必要になることがよくある。この時、BASIC のような『ダイレクトモード』があると、とても重宝する。BASIC のコマンド入力待ちの状態で、例えば『 ? 2^10 』と入力して Enterキーを押すと、直ちに 2 の 10乗の答『1024』が表示され、正常に実行されたことを示す『Ok』の文字列が続いて表示される。つまり『BASICインタープリタ』は、プログラムの編集中であっても、ダイレクトモードを使って電卓代わりに利用することができるのだ(下図参照)。

msx image
caption:
この画像は MSX-BASIC(エミュレータ) を起動して電卓代わりに使った例。ちなみに BASIC インタープリタでは 「?」を「print」の代用として使えるようになっている。

要するに「? 2^10」は「print 2^10」と同じだ。

このような略記法は、 タイピングの手間を軽減するために用意されているものだ。

Perl でもインタープリタを電卓代わりに利用できたら便利だと思いませんか? 実はできるんです。以下は、Windows XP のコマンド・プロンプトで、Perl を引数なしで起動する例。

G:\bat\prl>perl
print "2**16=",2**16,"\n";
print 2**10,"\n";

^Z
2**16=65536
1024

G:\bat\prl>perl
for ($j=0; $j<11; ++$j) {
        printf "2 ** %2d = %4d\n", $j, 2 ** $j;
}

^Z
2 **  0 =    1
2 **  1 =    2
2 **  2 =    4
2 **  3 =    8
2 **  4 =   16
2 **  5 =   32
2 **  6 =   64
2 **  7 =  128
2 **  8 =  256
2 **  9 =  512
2 ** 10 = 1024

G:\bat\prl>

Perlを引数なしで起動すると、Perl コードを標準入力から読み込む。最後に『^Z』を入力すると、記述した Perl コードをまとめて実行する(UNIX系の場合は『^D』)。次のようにして、実行結果を『リダイレクト出力』させることも可能だ。

G:\bat\prl>perl >bekijou.txt

for loop などを試すなら、これはかなり使える。しかし『^Z』が押されるまでは、途中経過を知ることは一切できない。手軽な電卓代わりに使えるほど、使い勝手が良いとはお世辞にも言えないだろう。

通常、Perl を電卓代わりに利用するには、コマンドラインから『ワンライナー(1行コマンド)』を打ち込む。しかし、GUI 環境に慣れきってしまった Windows ユーザーにとって、コマンドラインからワンライナーを入力するのは面倒なものだ。そこで電卓スクリプトを作ってみよう…という発想が生まれる。

BASIC のダイレクトモード風で構わないというなら、次のようなスクリプトでも十分に使える。たった 8行からなる while ループのスクリプトだが、これでも立派なプログラムだ。

# "ez_calc.pl"
while (1) {
    print STDERR "\n? ";
    $ezc_input = <STDIN>;
    chomp($ezc_input);
    $ezc_input || last;
    $ezc_result = eval($ezc_input);
    print "$ezc_result\n";
}

このスクリプトを実行すると、次のようになる。これも Windows XP で実行した例。偽値(空文字列 か 0) を入力すると実行終了する。

G:\bat\prl>ez_calc.pl

? 2**0
1

? 2**1
2

? 2**2
4

? $pi=3.14159265358979
3.14159265358979

? $r=5
5

? 2 * $pi * $r
31.4159265358979

? 0

G:\bat\prl>

ご覧のとおり、電卓として使える。

世の中には、いわゆる『calcコマンド』と呼ばれるものが数多く出回っている。calc とは calculator(計算機) の略で、フリーソフト、シェアウェア、有償、無償を問わず多数の calc コマンドが存在するが、そのほとんどはバッチやシェルスクリプト等で自動運転するために作られた『寡黙で小さなプログラム』だ。

上記の "ez_calc.pl" も、立派な calc コマンドといえるだろう。パワーユーザーにとっては、この程度でも十分に便利なのだろうが、私のようなアマチュアの場合、もっと操作性の良いものが欲しいと常々考えていた。

私は頭の回転が鈍いので、素早い暗算などはできない。が、プログラミングなら、じっくり時間をかけて作ることができる。なので、プログラミングは意外と自分に適していると思っている(アマチュアレベルだけど)。そんなわけで、自分自身の必要性から作ってみたのが、ecalc.pl という Perl スクリプト…というわけ。


[<<:head #00] [<:prev #02] [here: #03] [>:next #04]

#03 ecalc.pl の使い方(1回だけ実行モード)

使い方は簡単。『1回だけ実行モード』、『繰り返し実行モード』の 2種類の書式がある。

『1回だけ実行モード』は、このように使う。

G:\bat>ecalc.pl (6*4)/2
(6*4)/2 = 12

G:\bat>ecalc.pl 0+1 1+2 2+3 3+4 4+5 5+6
0+1 = 1
1+2 = 3
2+3 = 5
3+4 = 7
4+5 = 9
5+6 = 11

次のようにすると、『1回だけ実行モード』の help が表示される。

G:\bat>ecalc.pl -h

*** Bad argument error! 『式』を指定してください。

***『1回だけ実行モード』の書式 ***
  一般書式: perl パス/ecalc.pl [オプション] 式 [式 ...] [sum|avg]
オプション: -r(答だけ出力) -h(ヘルプを表示) が指定できる。
    備  考: 引数リストの末尾には sum または avg が指定できる。sum, avg の
            詳細は『繰り返し実行モード』の簡易ヘルプを参照してください。

-r オプションの実行例↓

G:\bat>ecalc.pl 0+1 1+2 2+3 3+4 4+5 5+6 -r
1
3
5
7
9
11

『sum(合計)』『avg(平均)』の実行例↓

G:\bat>ecalc.pl 0+1 1+2 2+3 3+4 4+5 sum
0+1 = 1
1+2 = 3
2+3 = 5
3+4 = 7
4+5 = 9
sum = 1+3+5+7+9 = 25

G:\bat>ecalc.pl 0+1 1+2 2+3 3+4 4+5 avg
0+1 = 1
1+2 = 3
2+3 = 5
3+4 = 7
4+5 = 9
sum = 1+3+5+7+9 = 25
avg = 25/5 = 5

[<<:head #00] [<:prev #03] [here: #04] [>:next #05]

#04 ecalc.pl の使い方(繰り返し実行モード)

次のように、引数を指定せずに ecalc.pl を実行すると『繰り返し実行モード』が起動される。

G:\bat>ecalc.pl
*** ecalc.pl (easy calculator) ver1.14 ***

『繰り返し実行モード』を起動。
ご自由に計算式を入力して Enter(Return)キーを押してください。
-h を入力すると簡易ヘルプを表示します。

0: 数式を入力> 0+1
0+1 = 1

0: 0+1=1

1: 数式を入力>

簡易ヘルプを表示してみる。↓

1: 数式を入力> -h

*** [ecalc.pl ver1.14]『繰り返し実行モード』簡易ヘルプ ***
● Perlの算術演算子・関数 早見表:
   加→ +   減→ -   乗(×)→ *   除(÷)→ /   剰余→ %   べき乗→ **
   平方根(√)→ sqrt(10進数)   小数点以下を切捨(整数値を返す)→ int(実数)
   16進数を10進数に変換→ 0xnn (nn:16進数)
    8進数を10進数に変換→ 0nn  (nn: 8進数)
● 終了方法:終了する時は 00 を入力して Enter(Return) キーを押す、
   又は sum 又は avg 又は help と入力して下さい。
   (sum と入力した場合、計算結果の合計を出力した後、実行を終了します)
   (avg と入力した場合、sum 値の平均値を出力した後、実行を終了します)
   (helpと入力した場合、簡易ヘルプを標準出力した後、実行を終了します)
● 画面のクリアと再描画:何も入力せずに Enter キーを押す(空行の入力)
● オプション:
   -h:簡易ヘルプを画面表示(Help)
   -r:計算結果のみ標準出力(Result)
   -n:メモリー番号を標準出力(index Number)
   -i:スカラー変数を展開(variable Interpolation)(デフォルト設定)
   -c[r][n][i]:設定済みオプションの解除(Cancel)
   -c:全てのオプションを解除する(-crni と同じ)
● 現在のオプション設定(Current Settings):
         -i:スカラー変数を展開(variable Interpolation)(デフォルト設定)

1: 数式を入力>

『1: 数式を入力>』の先頭の 1:メモリー番号を表す。市販の電卓には『MR』『M-』『M+』というメモリー計算用のボタンが付いている。ecalc.pl では、メモリー番号を使ってメモリー計算を行う。メモリー番号を次のように使うと、面倒な数式を何度も入力しないで済む。

1: 数式を入力> 3.14159265
3.14159265 = 3.14159265

0: 0+1=1        1: 3.14159265=3.14159265

2: 数式を入力> 2 * 1: * 5
2 * 1: * 5 = 2 * 3.14159265 * 5 = 31.4159265

0: 0+1=1        1: 3.14159265=3.14159265        2: 2 * 1: * 5=31.4159265

3: 数式を入力> 00

G:\bat>

↑プログラムを終了するなら、00 を入力する。↓計算結果をファイルに保存するなら、次のようにリダイレクト出力する。

G:\bat>ecalc.pl >result.txt
*** ecalc.pl (easy calculator) ver1.14 ***

『繰り返し実行モード』を起動。
ご自由に計算式を入力して Enter(Return)キーを押してください。
-h を入力すると簡易ヘルプを表示します。

0: 数式を入力> 1+1

0: 1+1=2

1: 数式を入力> 2*2

0: 1+1=2        1: 2*2=4

2: 数式を入力> 3/3

0: 1+1=2        1: 2*2=4        2: 3/3=1

3: 数式を入力> 2**10

0: 1+1=2        1: 2*2=4        2: 3/3=1        3: 2**10=1024

4: 数式を入力> avg

G:\bat>

『result.txt』の内容↓

1+1 = 2
2*2 = 4
3/3 = 1
2**10 = 1024
sum = 2+4+1+1024 = 1031
avg = 1031/4 = 257.75

計算式をテキストから読み込むには、入力リダイレクション(<)を使う。↓

c:\usr>copy con exp.txt
1+1
2*2
3**3
4/4
5-5
^Z
        1 個のファイルをコピーしました。

c:\usr>ecalc.pl < exp.txt
*** ecalc.pl (easy calculator) ver1.17 ***

『繰り返し実行モード』を起動。
ご自由に計算式を入力して Enter(Return)キーを押してください。
-h を入力すると簡易ヘルプを表示します。

0: 数式を入力> 1+1 = 2

0: 1+1=2

1: 数式を入力> 2*2 = 4

0: 1+1=2        1: 2*2=4

2: 数式を入力> 3**3 = 27

0: 1+1=2        1: 2*2=4        2: 3**3=27

3: 数式を入力> 4/4 = 1

0: 1+1=2        1: 2*2=4        2: 3**3=27      3: 4/4=1

4: 数式を入力> 5-5 = 0

0: 1+1=2        1: 2*2=4        2: 3**3=27      3: 4/4=1        4: 5-5=0

5: 数式を入力>
c:\usr>

入出力リダイレクションは、とても便利なんだけど、コマンドラインで入力するのは面倒…という人も多いと思う。そんな人のために、ecalc.bat というドロップレットも作ってみた(バッチ・ファイルなので、Windows 限定だが)。詳しくは…

utl 02 ecalc.bat

をご覧ください。


[<<:head #00] [<:prev #04] [here: #05] [>:next #06]

#05 注意事項(重要)

ecalc.pl を CGI スクリプトから呼び出すことは避けてください(非常に危険)

ecalc.pl は、eval を使って電卓を実現している。が、ユーザーが入力する文字列(数式もしくは文字式)に対して何の制限もしていない。これは Perl で扱えるあらゆる関数、演算子が使えることを意味している。つまり ecalc.pl は、ただの電卓ではない。ファイルを削除する事だってできるのだ。

これを CGI スクリプトから require('ecalc.pl'); で読み込むことは、セキュリティ上とても危険な行為となる。クラッカー(悪意ある訪問者)に侵入されたら最後、ecalc.pl が『セキュリティ・ホール』になってしまう。

そのため ecalc.pl では、require で読み込もうとすると『エラー終了』するようにした。とは言っても、エラー終了しないように改造するのは簡単なので、そのように改ざんした ecalc.pl を、無防備な CGI サーバに転送されてしまったら、もう後の祭りだ。CGI サーバの管理者は、セキュリティを厳重に構築してください。

ADSL のような常時接続の環境で Web サーバを公開している人は多いと思うが(いわゆる自家サーバ)、ここに書かれている意味がよく分からない人は CGI スクリプトは使わないほうが賢明だ。自分のスキルを客観的に捉え直し、検討を重ねた上で CGI スクリプトを導入してください。

危険な実例を示す(余計な情報は省略している)。↓

G:\bat>dir *.txt

 G:\bat のディレクトリ

08/06/18 (水)  22:41               142 euc.txt
08/07/01 (火)  10:55                89 result.txt
08/06/18 (水)  18:58                62 sjis.txt
08/06/18 (水)  19:00                70 sjis_12.txt
08/06/29 (日)  17:51               122 test.txt
               5 個のファイル                 485 バイト

G:\bat>ecalc.pl
*** ecalc.pl (easy calculator) ver1.14 ***

『繰り返し実行モード』を起動。
ご自由に計算式を入力して Enter(Return)キーを押してください。
-h を入力すると簡易ヘルプを表示します。

0: 数式を入力> unlink glob("*.txt")
unlink glob("*.txt") = 5

0: unlink glob("*.txt")=5

1: 数式を入力> 00

G:\bat>dir *.txt

 G:\bat のディレクトリ

ファイルが見つかりません

G:\bat>

[<<:head #00] [<:prev #05] [here: #06] [>:next #07]

#06 ダウンロード

ecalc.pl (最新版)
$VERSION= '1.18';
$UPDATE = '2010/07/21 Wed 03:31 JST';
$AUTHOR = 'pablo foussin(japan)';

ソース本体を見る: (12.1 KB / sjis テキスト)
説明書モドキ(?) を見る: (18.3 KB / sjis テキスト)

ダウンロード: [ ソース本体( ecalc.pl )と 説明書モドキ( ecalc.pl.commentful.pl )のアーカイブ ]
日本語 Windows 用(sjis/crlf): ecalc_1.18_sjis.zip (11.7 KB)
日本語 UNIX 用(eucjp/lf): ecalc_1.18_eucjp.zip (11.6 KB)
Linux 用(utf8n/lf): ecalc_1.18_utf8n.zip (12.3 KB)

[<<:head #00] [<:prev #06] [here: #07]

#07 小ネタ: calc.exe(電卓) について

2010/08/26 (木) 02:46 :追記

ここまで、『Windows の電卓(calc.exe)』を悪く言い過ぎたので、ちょっとだけフォローしておく。(^^;

簡単な計算をちょっとだけ行いたい…そんな時は、ecalc.pl を起動するより、『Windows の電卓(calc.exe)』を起動する方が手軽だ。こんな感じ。

1. 『ファイル名を指定して実行(R)』で『calc』と入力。
2. 『電卓』が起動する。
3. 『テンキー』を使って、例えば『1+1』最後に『Enter』キーを押す。
4. 電卓の表示欄に答『2』が表示される。
5. ここで [Ctrl]-[C] を押すと、クリップボードに答がコピーできる。

キーボードの『Num lock』が ON になっていれば、いちいちマウスで数字キーを押しながら入力しなくても良い。また、簡単な計算を記述したテキスト (例えば『1+2+3=』とか) を電卓のアイコンにドラッグすれば、その答を求めることもできる。まずは『ヘルプ』を表示してみよう。あなたの知らなかった機能があると思うよ。calc.exe は、意外と高機能なんだが、ヘルプの説明が素っ気なさ過ぎる。Web で『Windows 電卓』とか『calc.exe』という文字列で検索すると、もっと詳しい解説に巡り合えるので、一度試してほしい。

一応、このぐらいは書いておく。だが、総合的に見たら、やはり ecalc.pl の敵ではないね。何といっても、ecalc.pl のバックには、強力な『Perl インタプリタ』が控えているのだから…。プログラミング言語の中には、アプリケーションを構成するあらゆるパーツが既に組み込まれている。スクリプトは、言語の中にある一部のパーツを取り出し、コマンドの形式に整えて構成しているに過ぎない。Perl の機能に自由にアクセスできることが、ecalc.pl の強みになっている。悪く言えば『他力本願』とも言えるが…。

[<:head #00] ... [<<:prev (アマチュア・スタイル!)] ... [<<:home (index.html)] ... [<<:top (top.cgi)]

アマチュア・スタイル! に掲載の文書、プログラムは、 全て pablo foussin の著作物です。
ですが、プログラムについては改変自由のフリーソフトとします。