今回は古くからあるカレンダーを表示するコマンドcalです。カレンダー、日本語だと暦(こよみ)ですが、日常的に使っていますが実に奥深いものです。現在使用されているのはグレゴリオ暦ですが、この暦になったのは割と最近です(人類の歴史の長さからして)。特に日本だと明治以降に改暦されているため、西洋諸国と比べても最近といえます。暦に興味ある方は調べてみるとよいでしょう。
今回もこれまでのようにサンプルで利用するファイル・ディレクトリはデスクトップのsampleディレクトリとしています。デスクトップにsampleディレクトリがない場合は作成しておいてください。(コマンド入力ならmkdir ~/Desktop/sampleとして作成することができます)
calコマンドが見つかりません!?
それでは早速calコマンドを使ってカレンダーを表示してみましょう。ターミナルを開いてcalと入力すると入力した時点での1ヶ月分のカレンダーが表示されます。
cal
calと入力したのに表示されない場合はncalと入力してみてください。それでもコマンドがないというメッセージが表示されたりするかもしれません。
ncal
そのような場合はncalをインストールしてください。以下の図にUbuntuでの手順を図で掲載しておきます。インストールされたらcalかncalコマンドを入力して動作を確認します。
カレンダーを表示
すでにコマンドを入力してしまいましたが、calとだけ入力すると今月のカレンダーが表示されます。
cal
今年の特定の月のカレンダーを表示する場合はmオプションを使います。-mの後に表示したい月を示す数値を指定します。-m 1なら1月、-m 9なら9月のカレンダーが表示されます。
cal -m
特定の年のカレンダーを表示するにはcalの後に年数を指定します。cal 2022なら2022年のカレンダーが表示されます。calでの年数は西暦1年から9999年まで指定できます。
cal 2022
cal -m 12 2022
今月から数ヶ月分先のカレンダーを表示することもできます。この場合はAオプションを指定します。-Aの後に5とすると今月と来月から5ヶ月分のカレンダーが表示されます。
cal -A 5
今月から数ヶ月分前のカレンダーを表示することもできます。この場合はBオプションを指定します。-Bの後に5とすると今月と先月から5ヶ月分さかのぼってカレンダーが表示されます。
cal -B 5
calをどう利用する?
古くから存在するcalコマンドですが、カレンダーなら壁にある紙のカレンダーを見てもいいですし、パソコンやスマートフォンにあるカレンダーを利用した方が便利です。Webでcalコマンドで検索するとカレンダー表示されたけど、だから何なのみたいな感じな文章も散見されます。確かに、このままでは役立たないように見えます。
そこで、どうにかcalコマンドを利用したいということで見回すと壁にかけてある紙のカレンダーが目に・・・この紙のカレンダーを作っている人(デザイナー、DTP関連業)にとっては役立つ可能性があるかもしれません。特に指定した年の一年分のカレンダーがテキストでまとめて手軽に生成されるのは他にはない便利さがあります。
ここからはDTP関連ということでmacOS上で動作するコマンドを利用します。
まず、生成されたカレンダーをテキストファイルで保存します。テキストファイルとして保存するにはリダイレクトを使います。以下のようにするとカレントディレクトリに2022.txtという名前のファイルが保存されます。
cal 2022 > 2022.txt
保存されたテキストファイルをテキストエディタで開いて確認します。
テキストになってしまえば後はマイクロソフトワードでもエクセルでもAdobe IllustratorでもAdobe InDesignでも読み込んで利用することができます。
ちなみにプレーンテキストからワード文書に変換するにはtextutilを使います。以下のようにすると2022.txtがワード文書(docx)形式に変換されます。ワード文書で送ってください、というクライアントがいたら、このコマンドを使えばよいでしょう。
textutil -convert docx 2022.txt
macOSでは標準ではマイクロソフトワードは入っていませんが、ワード文書を開くことができるPagesがあります。以下のようにコマンドを入力するとPagesで2022.docxが開かれます。openコマンドはアプリケーションや書類、URLなどを開くことができます。-aを指定した後に起動するアプリケーション名を指定します。ただし、/Applicationsディレクトリ以下にないアプリケーションは-aを指定せずに直接アプリケーションがある絶対パス(フルパス)を書きます。
open -a pages 2022.docx
そのまま開くとフォント(書体)の関係で文字が綺麗に揃っていません。calコマンドで生成されたカレンダーは等幅フォントにする必要があります。
月ごとにファイルを生成する
カレンダーによっては表紙部分に一年分の日付が記載され、残りは一ヶ月ごとの日付が記載されているものがあります。そこで、次に1月から12月分のカレンダーを生成し、それぞれテキストファイルとして保存します。
まず、今年の1〜12月のカレンダーを表示してみます。この場合forを使って変数の値をcalの月のパラメーターとして渡します。以下のコマンドはbashでもzshでも動きます。
for i in {1..12};do cal -m ${i};done
次に1.txt〜12.txtとしてカレントディレクトリに保存するようにします。
for i in {1..12};do cal -m ${i} > ${i}.txt;done
テキストファイルであれば応用範囲は広くなります。が、ここはもう少し頑張ってデザイン・DTP業界で使われているAdobe Illustratorで編集できるようにしてみます。Adobe IllustratorはPDFを編集することができるので(PDF内容によりますが)、テキストファイルからPDFに変換することにします。
できればコマンド一発でやりたいところですが、そんな便利なコマンドが・・・あります。cupsfilterを使えばテキストファイルを簡単にPDFに変換できます。以下のようにすると1.txtファイルがPDFに変換され1.pdfという名前のファイルが生成されます。
cupsfilter 1.txt > 1.pdf
コマンドを入力するとデバッグメッセージなどが表示されてしまうので、これが嫌なら以下のようにします。
cupsfilter 1.txt > 1.pdf 2>/dev/null
生成されたPDFを確認しましょう。そのままFinderからダブルクリックすると対応したアプリケーションが開きます。デフォルトではPreview.app(プレビュー.app)が開きます。そうでない環境の人もいるでしょう。そういう環境であってもPreview.appで開くには以下のようにコマンドを入力します。
open -a preview 1.pdf
次にAdobe Illustratorで生成されたPDFを開いて編集できるか確認します。一応、文字編集はできるようですので、これでよしとしましょう。ちなみにAdobe Illustratorもスクリプトによって自動処理できるので興味ある方は調べてみるとよいでしょう。
ここまでできたらあとはループで1〜12月分のテキストファイルをPDFに変換するだけです。
for i in {1..12} ; do cupsfilter ${i}.txt > ${i}.pdf 2>/dev/null;done
複数のPDFを1つにまとめる
最後にバラバラになっているカレンダーを1つのPDFにまとめましょう。macOSにはPythonでPDFを連結するスクリプトが用意されています。実際にはAutomator(オートメーター)内にあるスクリプトを利用します。
1.pdfから12.pdfまでをcal.pdfという名前で1つのPDFにするには以下のように入力します。
'/System/Library/Automator/Combine PDF Pages.action/Contents/Resources/join.py' --output cal.pdf {1..12}.pdf
生成されたcal.pdfをPreview.app(プレビュー.app)で開いて確認してみましょう。ちゃんと1月から12月までのカレンダーが1つのPDFになっています。
役に立ちそうもないコマンドであっても、他のコマンドと組み合わせたり発想の転換によって有益になる場合もあります。最後にcal 9 1752とコマンドを入力してみてください。
cal 9 1752
あれ?と思うかもしれません。Wikiに詳細が掲載されているので興味ある方は読んでみるとよいでしょう。
cal (UNIX)
https://ja.wikipedia.org/wiki/Cal_(UNIX)
著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。