CUPS

**CUPS**（**カップス**、以前の名称は**Common UNIX Printing System**）とはUnix系オペレーティングシステム (OS) 用のモジュール化された印刷システムである。CUPSは、Mac OSやWindowsの印刷機構に遅れをとっていたUnix系OSに強力な印刷機能をもたらすことになった。CUPSではUnix系OSでプリンターの形式・型ごとに独自に書き上げねばならなかったデバイスドライバの作成が極めて容易になり、過去にUnix系OSが対応していた特殊なラインプリンターとPostScriptプリンターのみならず、Macintosh/Windows向けに市販されているプリンターのほぼ全てがUnix系OS上から利用できるようになるとされている。

CUPSを運用しているコンピュータは、クライアントのコンピュータから印刷ジョブを受け取るサーバとなり、それらのジョブを処理して適切なプリンターへと送る。また、その際にはHTTPのBasic認証およびDigest認証、ローカル認証、128ビットTLS/SSL暗号化などを用いることもできる。

CUPSはUnixの印刷スプーラとスケジューラ、フィルタシステム、およびバックエンド・システムからなる。このうち、フィルタシステムは印刷データをプリンターが理解可能な形式へ変換することを受け持ち、バックエンドシステムはそのデータをプリンターへと送ることを受け持つ。CUPSは印刷ジョブとキューを取り扱う基盤としてIPP (Internet Printing Protocol) を用いている。またCUPSはUnixで伝統的なSystem V形式とBSD（バークレー）形式のコマンドラインインタフェースもサポートしており、さらにSMBプロトコルも部分的にサポートしている。CUPSが提供するデバイスドライバは、アドビのPPD (PostScript Printer Description) 形式のテキストファイルを用いて設定が可能である。CUPSを設定するためCUPS自身はウェブ (HTTP) を用いた組込みのインタフェースを有している。また多くのユーザインタフェースがさまざまなプラットフォームに対して用意されており、ESP Print Proといった商用パッケージだけでなく、KUPS、GtkLP、QtKUPS、XPPなどのオープンソースライセンスで開発されているGUIがいくつも存在する。CUPSはmacOS版のみプロプライエタリライセンス、その他のOS向けにはApache Licenseの元で配布されている。以前はGNU General Public LicenseとGNU Lesser General Public License, Version 2で配布されていた。

## 歴史
CUPSはまず、Easy Software Productsのマイケル・スイートとアンドルー・ゼンフトによって1999年の秋に作成された。最初のリリース版が公開されるまでのアルファ版とベータ版に2年間を要している。初期にはlpd (line printer daemon) を用いるよう開発努力が傾けられたが、ときとしてプリンターとの相性が悪いためにIPPも代替としてサポートされた。CUPSはすぐさま、Red Hat LinuxなどいくつかのLinuxディストリビューションで標準の印刷システムとして採用された。Apple ComputerはMac OS X v10.2のデフォルトの印刷システムとして2002年3月にCUPSを採用している。2007年2月にアップルは主たる開発者であるマイケル・スイートを雇用し、CUPSのソースコードを取得している。2019年12月20日、マイケル・スイートは自身のブログでアップルを退職したことを発表した。 2020年にはOpenPrinting organizationによりプロジェクトがフォークされ、マイケル・スイートはそこでCUPSの開発を継続している。

CUPSは当初、"Common UNIX Printing System" と呼ばれていたが、UNIX商標の法的な懸念からCUPS 1.4より "CUPS" と短縮されるようになった。

## 概要

CUPSは、標準的な方法で印刷ジョブをプリンターに送ることを可能とする機構を与えるものである。印刷データはまず*スケジューラ*へと送られ、スケジューラはジョブをプリンターが理解できる形式へと変換するため*フィルタシステム*に送る。さらにフィルタシステムはデータを、デバイスやネットワークへと送るための特殊なフィルタである*バックエンド*へと受け渡す。CUPSのシステムはデータをプリンターが理解できる言葉へと変換するのにPostScriptとラスタ・グラフィックスをフルに活用している。

CUPSの最大の利点は、それが、印刷サーバ上で様々なデータ様式を処理できる標準的でモジュール化された印刷システムであることである。CUPS以前には、それぞれ独自の言語と形式を用いていた様々な市場のプリンターに対応している標準的なプリンターの処理システムは見当たらなかった。例えば、System Vとバークレイの印刷システムは互いの互換性がほとんどなく、しかもプログラムのデータ形式からプリンターが理解できる形式へと変換するための複雑なスクリプトと急場しのぎの手段とを用意する必要があった。さらにこれらはしばしばプリンターへと送られているファイル形式を検出する手段を持たないために、データ列を正しく自動的に変換することができなかった。また中心となるサーバ上ではなく各ワークステーション上でデータの変換を行っていた。

CUPSでは、プリンターのメーカーやドライバの開発者が印刷用サーバで専用に動くドライバを製作することが以前よりもはるかに容易なものとなっている。また、サーバ上で処理が成されることによって、他のUnixの印刷システムで行われていたことと較べネットワークを介する印刷も非常に容易なものとなる。ひとつの利点はSambaを用いるときで、プリンターはリモートのWindowsコンピュータで用いられ、しかも一般的なPostScriptドライバをネットワークを介する印刷に用いることができる。

### スケジューラ
*CUPSスケジューラ*はIPP (Internet Printing Protocol) もしくはlpd (line printer daemon) プロトコルのどちらかを用いることができる。スケジューラはHTTP/1.1のリクエストを解釈し印刷ジョブの管理、サーバの設定、およびCUPS自体の説明資料のためにウェブを用いたインタフェースを提供している。

スケジューラは、IPPとHTTPのどのメッセージがシステムに受け渡せるかを制御するための*承認モジュール*を有している。IPP/HTTPパケットは一旦承認されると、やって来る接続を監視しそれを処理している*クライアント・モジュール*に送られる。クライアントモジュールはまた、必要に応じてウェブ基盤のプリンター、「クラス」、ジョブの実行状況のモニタと管理をサポートするための外部CGIプログラムの実行を受け持っている。クライアントモジュールがリクエストを処理すると、次にデータはさらなる処理のために*IPPモジュール*へと送られる。このモジュールは、クライアントがHTTPサーバ上のアクセス制限または認証を回避することを防ぐためにURI (Uniform Resource Identifier) の検証を行う。

スケジューラではプリンターが*クラス*を持つことを認めている。これは複数のプリンターをグループ化するひとつの方法であり、ジョブをあるクラスへと送るような用い方を可能としている。すなわち、スケジューラはクラス内で最初に利用できるプリンターを選び出してジョブをそのプリンターへと送る。*ジョブモジュール*は、最終的な変換と印刷のために印刷ジョブをフィルタやバックエンドの処理へと送ることで印刷ジョブを管理する。またそれらフィルタやバックエンドからのステータスメッセージも監視している。

スケジューラの*コンフィギュレーションモジュール*はCUPSのデータ構造を初期化するとともに設定ファイルを解析し、CUPSプログラムをスタートさせる。コンフィギュレーションモジュールは設定ファイルを処理している間はCUPSサービスを停止させ、処理が完了するとサービスを再開させる。

*ログ・モジュール*はアクセス、エラー、ログ・ファイル操作のスケジューラの事象のログを取り扱い、一方*メインモジュール*はタイムアウトとクライアントからの接続に対するI/Oリクエストの送出を受け持ち、またシグナルを監視し、必要に応じサーバの設定ファイルの再読み込み、さらに子プロセスのエラーと終了を取り扱う。

スケジューラで用いられているその他のモジュールには、印刷デバイスが理解できる形式に印刷データを変換するときのフィルター処理に用いられるMIME型と変換データベースを取り扱う*MIMEモジュール*、PPD (Postscript Printer Description) ファイルのリストを扱う*PPDモジュール*、システムで利用可能なデバイスのリストを扱う*デバイスモジュール*、CUPS内のプリンターとPPDを扱う*プリンターモジュール*がある。

### フィルタ・システム

CUPSの大きな利点のひとつは、様々なデータ形式を印刷サーバ上で処理できるということである。印刷ジョブは一連の*フィルター*を介してプリンターの最終的な言語・形式へと変換される。このデータ形式と変換方法はMIME型を利用して抽象化されている。CUPSは`mime.types`と`mime.convs`の2つのMIMEデータのファイルを使用する。`mime.types`はCUPSがファイルのMIME型を決定するために用いられ、`mime.convs`はあるMIME型を別のMIME型に処理するためのプログラムを定義している。

例えば、HTMLファイルを検出するための`mime.types`の行は、

 text/html&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;html htm \
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printable(0,1024) + (string(0,"") string(0,""))

となっている。これは、ファイルのサフィックス（拡張子）が`html`もしくは`htm`であるか、ファイルのテキストの始めの1KiBが印刷可能な文字からなっていて、かつ``か``から始まっているなら、ファイルはMIME型text/htmlであるものと見なされることを意味している。一方、`mime.convs`ファイルは以下のような行からなっている。

 text/plain application/postscript 50 texttops

1番目のカラムと2番目のカラムはともにMIME型であり、それぞれ変換前のMIME型と変換後のMIME型とを表している。3番目のカラムはファイルを変換するために支払うべき「コスト」を表し、フィルタ・システムがファイルを変換するときに別々のフィルタの組合せの中からどれを選ぶかを決定するための評価基準とされる。最後のカラムはデータを変換するためのフィルタプログラムを表す。よって、`text/plain`型のファイルはフィルタ`texttops`によってコスト50で`application/postscript`型に変換できることになる。

フィルタシステムは、プリンターキューまたは印刷フィルタの名前、印刷ジョブのジョブ番号、ユーザ名、ジョブ名、印刷部数、その他印刷のオプション、ファイル名（標準入力からリダイレクトされた場合は不要）の引数とともに入力データを受け取る。その後、上述のようにMIMEデータベースを用いて入力データの型と使用されるフィルタを決定する。例えば、画像データが検出されればそれ用の特定のフィルタで処理され、HTMLのデータならまた別の特定のフィルタで処理される。これらのデータはその後PostScriptデータに変換されるか、直接ラスタデータに変換しうる。PostScriptデータへ変換された場合には、*プレフィルタ*と呼ばれるさらなるフィルタが適用され、これは印刷するページ範囲の指定や、複数のページを1ページに埋め込むN-Upモードの設定などプリンターに特定のオプションを加えることができるようにPostScriptデータにたいして別のPostScript変換プログラムを適用する。

プレフィルタによる処理が終わると、PostScriptプリンタを用いている場合にはそのままデータはCUPSのバックエンドに送られ、そうでない場合には（linuxprinting.orgのFoomaticのような）別のフィルタかGhostscriptで処理される。これはPostScriptをプリンターに依存しない中間形式の*CUPS-raster*フォーマット（MIME 型 `application/vnd.cups-raster`）へと変換する。最後にこの中間ラスタ形式はプリンター個別の形式へと最終フィルタで処理される。

このラスタ形式からのフィルタとしてCUPSにデフォルトで含まれているものは、PCL (Printer Command Language)、ESC/PまたはESC/P2、およびDymoへのフィルタである。ただし、CUPSで用いることができるいくつかの代替フィルタもある。CUPSの開発元であるEasy Software Productsは独自のCUPSフィルタをリリースしている。Gimp-Printは幅広い範囲の（主として）インクジェット・プリンターに対する高精度なドライバであり、LinuxのTurbo-Printはやはり様々な種類のプリンターに対しての種々のドライバを有している。

### バックエンド
バックエンドはデータをプリンターに送る手段である。CUPSで有効なバックエンドには、パラレルポート、シリアルポート、およびUSBポートのプリンターとともに、IPP (Internet Printing Protocol)、JetDirect (AppSocket)、lpd (line printer daemon)、SMB (Server Message Block) プロトコルを介して処理されるネットワーク・バックエンドがある。

## 互換性
伝統的な印刷コマンドがCUPSでも用いることができるようにCUPSはSystem V形式とBSD形式の両方の印刷コマンドを与えている。CUPSは伝統的なlpdポートであるポート515を監視し、それを「バックエンド」として取り扱う。CUPSをインストールすると、System Vの印刷システムに対応する`lp`コマンドとBSDの印刷システムに対応する`lpr`コマンドとが互換プログラムとしてインストールされる。これらはCUPSへの標準的なインタフェースとなり、これらの印刷システムに依存する現存するアプリケーションとの最大限の互換性を保つ。

## 注釈

## 外部リンク
* 
*GitHub - apple/cups: Apple CUPS Sources
*OpenPrinting CUPS
* Project: Gimp-Print - Top Quality Printer Drivers: Summary
* 2ch Linux Beginners 印刷関連FAQ集