Spring Fest 2019ランチセッションにてSpring Bootで構築したDocurainサービス運営で得たノウハウを発表します。 以下がスライドになります。
Spring Fest 2019ランチセッションにてSpring Bootで構築したDocurainサービス運営で得たノウハウを発表します。 以下がスライドになります。
前回更新から時間が空いてしまいましたが、1ヶ月前くらいに新しい成果が出たのでご報告します。
我々の開発している帳票システム、Docurainですが、日々パフォーマンス向上・安定性向上・機能拡張に勤しんでおります。 パフォーマンスに関しては前回約5,000ページのPDFファイルをExcelファイルから9秒で出力しましたが、よりパフォーマンス向上を目的としてチューニングと試験を繰り返してきました。
我々の帳票生成エンジンは分散処理をすることが可能です。理論的には、処理するマシンの数に応じて青天井でパフォーマンスが伸びていきます。が、実際に数百というオーダーのサーバを束ねて運用した経験のある方なら分かってもらえると思いますが、実際は様々なボトルネックがあらゆるところに存在し、「分散処理できれば性能は青天井」などというのは夢物語であります。
そういうわけで我々は分散処理できてるからOK、ではなく、理論通りにサービスがスケールしていくこと、そこでクリティカルなエラーが発生しないことを実際に何度も試験しています。
というわけで前置きが長くなりましたが、この度の試験で実測値で
395Mpph
という結果を得ることができました。
pphというのは何かと申しますと、これは分かりやすく「帳票のパフォーマンス」を測定する指標が無いので「1時間あたりPDFを何ページ出力できるか」を表した単位を作り、社内で使用しています。「pph」は「Pages Per Hour」の略です。
なので395Mpphというのは1時間に3億9500万ページ、約4億ページ弱のPDFを出力できるということになります。繰り返しますが、これは 理論値ではなくて実測値 です。
日本国内でPDF形式の帳票が何ページ出力されているかはよくわからないのですが、1時間4億ページ弱も出力できたらもしかしたら日本の国内需要を満たしてしまうのでは…?と考えてしまいますね。いや、根拠は無いですが。でもまぁ私個人の気持ちとしてはゆくゆくは日本全部は非現実的としても、日本の帳票出力の何割かの出力を担えるようになりたいと思い、開発を続けています。
あと、これは十分にバックエンドのサーバがスケールした状態での結果なので常時この値が出るわけではありません。が、我々は高いパフォーマンスが必要とされているのならば、何としてでもそれを提供したいと思っています。
以上、Docurainは1時間あたり4億ページ弱のPDFを出力し続けますよ!という紹介でした。
こういうニュースを見ました。
タイトルの通りでございますが、経産省3600ページのPDFでキャッシュレス還元対象店一覧を公開したとして、「読みにくい」「CSVかExcelにしろ」と文句を言われております。結構話題になったので、CSVとかExcelとかもそのうち公開されるんだろうなーって思ってたらこんなことになってました。
9月5日時点の加盟店登録申請は全国で約58万店。今後これを1ファイルで全て網羅すると、PDFファイルは1万ページの大台を超えてくるかもしれません。
すごい!少年漫画でよくある戦闘力のインフレみたいな感じですね。さすが、これでこそ我らが愛すべき日本国行政機関です。
まぁ本ブログにたどり着くような方々はおそらくITリテラシもお持ちでしょうから、こんな記事を見ると「これだから日本はIT後進国なんだ!さっさと検索機能を付けるとかマップ表示するとかしろ!!」と思うことでしょう。私もそれは思います。ちなみに記事執筆時点で確認した所、「9月中下旬には地図上に対象店舗を表示するウェブ機能やアプリを公開予定」と書いていますね。開発中のエンジニアの心労を察するに色々とアレですが…。
でも、こういうのって話題になってないだけで結構ありますよね。市町村のホームページとか、さすがに数千ページは無いにしても数十ページ、ずっとこういう店舗情報的なものがずらずらと並んでるPDFがあったりします。一方で厚労省の統計情報みたいなものはExcel形式でも配布されてますし、この差はなんなのかなーと昔から不思議でした。おそらくは、CSVやExcelといったファイルを扱えるのもそれなりのITリテラシがある人なので、こういうファイルを公開すると電話の問い合わせで
「お前のところでダウンロードしたエクセルが開けない」
「それは大変失礼しました、閲覧にはExcel 2007以降がお使いのPCにインストールされている必要がございます」
「なんだそれは、エクセルなら入っているぞ、バカにするな」
「申し訳ございません、エクセルの中でも2007というバージョン以降という制限がありますが、それに引っかかっているかも、と」
「なんだその2007とかいうのは。俺のパソコンにはそれが入っていないというのか。どうやったらわかるんだ」
「ええっと、まずはExcelを起動してですね…」
「だからそのファイルをダブルクリックしてもExcelが起動しないんだからしょうがないじゃないか」
「そうでしたね、ではスタートメニューから…」
「スタートメニューとは何だ」
という「誰でも簡単!パソコン教室電話サポートコーナー」みたいな地獄のやり取りを公務員の方々が対応するということになることは想像に容易いわけです。であるならば、PDFで公開しておけばスマホでもPCでもまず間違いなく見れるし、面倒くさいことを言われなそうという判断になっても仕方ないのかなーと思いましたが。一方で統計情報を参照したいなんて人は当然、Excelなんかも使いこなせてるでしょうから厚労省とかではExcelでも配布してるんでしょう。多分。全部想像ですが。でも私が上司で部下がこういう電話の対応に苦慮してたら、「いいよもう、PDFで公開しろよ。PDFに検索機能はあるんだから、それで十分じゃん」って言いますね。きっと。
話が逸れましたが、で、まぁ6360ページのPDFで、今後は1万とかになるかもしれないということですね。よく分からないですが、この経産省の中の人も何らかの事情があってPDFで公開する作業をしているのでしょう。そして、この地図表示するアプリとやらの開発状況によっては、暫くはこの方法を継続することになり、その都度PDFを何度も更新してアップロードするという作業が必要なわけで、ちょっと面倒ですよね。6360ページともなると、PDF出力するのも時間がかかりますし…。試しに、手元で5,000ページ位のExcelファイルを、Excelの機能でPDFへ変換した所、15分かかりました。毎回これをやるのはちょっと…。
…えっ、時間がかかる?本当に?
9秒でできますよ。そう、Docurainならね。
ExcelをテンプレートにしてJSONのデータを流し込み、帳票を作成するサービスのDocurainですが、処理速度にも気を配って開発しております。具体的には、こういった数千ページにも達する大量のPDFを出力する際は複数台のサーバーで分散処理が行えるようになっています。この分散処理を担当するサーバは負荷状況によって自動でスケールするようになっているので、理論的にはネットワーク容量の限界までどこまでも性能が向上していきます。(厳密には「分散した1個のタスクの完了+ネットワーク転送時間」以下には出来ませんが)
というわけでDocurainで同様の帳票を作成してみました。Excelのテンプレートとjsonのデータを利用して作成した出力結果は以下のようなものになります。
このテンプレートで経産省で公表された店舗データ(EC店舗除く)をすべて表示した所、5534ページのPDFとなりました。このとき、十分にスケールしたという状況を再現してのテストではありますが、先程説明した性能(9秒)が達成できました。
使用したテンプレート、JSONデータと出力データは以下です。CSVデータもこちらに含まれているので、必要な方は使ってください。JSONデータは50件に件数を減らしたものを同封しています。
50件のデータならば登録不要でお試し頂けるこちらの体験ページでもJSONとExcelテンプレートからPDFを出力できます。
また、Docurainは単一リクエストの早さだけでなく大量のリクエストを同時に処理したときのスループットの早さも売りです。こちらも同様に今回のテンプレートで試してみた所、 30,546ページ/秒 という速度が出ました。すごい。
しかも、まださらに性能向上の余地があるので近々もっと良い結果を報告できるかも知れません。
ただ、いくつか注意事項があります。まず、この分散処理は有償オプションです。使用する場合は別途お申し込みが必要です。また、先程説明したとおりサービスは負荷状況によってスケールしていく仕組みなのでいつでもこの性能が出来るわけではありません。大量の帳票を出したい!という場合は詳しくはご相談ください。
ちなみにこういう何百何千ページにも達する帳票を印刷する必要が本当にあるのか?と思う方も多いと思いますが、我々は実際にそのような要望を複数の顧客から受けています。 「そんな大量のPDFを出力しても誰も見ないでしょ」という指摘が真っ当な場合もあるでしょう。一方で、最大で数千ページのPDFを出力できることが仕様として定められているシステムがある場合、実際にそういう使う方をするか否かとは無関係に、その機能が実際に動作するようにしなければなりません。例えばext4ファイルシステムにおける仕様上の最大ファイルサイズは16TiBですが、その時「実用上は16TiBのファイルなんてありえないから、1TiBが現実的な最大ということでもいいよね」という話はビジネスシーンでは通用しません。仕様とは約束事だからです。
そういうわけで、大量のページを出力するニーズが実際にあるので、Docurainは現実的なコストと時間でそれを実現する手段を提供しています。
詳しくは公式ページの情報もご参照ください。みんなの連絡待ってるぜ!!
DocurainはExcelで帳票テンプレートを作れるサービスです。
が、色んなところでデモをさせていただくと、「今は別の帳票ツールを使っているから、それをExcelに移行するのはしんどいな…」という反応を頂くことがたまにあります。
一から帳票を作る場合、またはそもそも既に現在Excelで帳票を作っている場合にはExcelで帳票テンプレートを作るというのは大変楽なのですが、既に何らかの別の帳票ツールを使っているという場合は「これを一からExcelで作るのは面倒だな…」というふうになってしまいます。これは仕方ないことです。その乗り換えのコストを支払ってあまりあるメリットがある、というのが見えないと導入することは難しいですからね。
どんな帳票ツールでもPDF形式では出力できるはずなので、今回公開した機能を使えば、PDF帳票をExcelに簡単に変換できてしまいます。もちろん乗り換えに関わらず、今PDF形式の帳票は既に存在するというシーンではこの機能を活用出来ます。
ただ、ここまで書いたら、そんなにきれいに変換できるのか?と疑問に思う方もいるかと思われます。
自由にコンテンツを配置できるPDFから行列が定まったグリッド形式のExcelに変換するわけですから、人間が見て完全に満足できるほどにきれいなExcelファイルに変換するのは正直難しいです。
が、変換したあとで人間が手をくわえてちょっと修正することを前提にすれば、十分実用になるレベルだと我々は考えています。では実際の帳票を見ましょう。
以下が元々のPDF帳票(車検証)です。
Excelに変換したあとがこちらです。
どうでしょうか?かなり高精度に変換されています。
Docurain開発チーム内で本機能を使用し、ネットに公開されている市町村の申請書PDFファイルなどを変換して色々試してみましたが、いずれもテンプレートを作るベースとしては十分実用になると判断しています。アカウントを無料登録して頂ければ試すことができます。ご興味があればぜひお試し下さい!!
小改良です。
現在、Excel形式での出力を行う場合のエンドポイントは、事前に保存されたテンプレートの場合
https://api.docurain.jp/api/xls/[テンプレート名]
となり、インスタントAPIだと
https://api.docurain.jp/api/instant/xls
を指定します。
ただ、これはExcel 2007以降の拡張子(xlsx)と紛らわしく、 xls
を xlsx
と誤記してしまいがちなため(私自身もやってしまったことがあります…)、 xlsx
を xls
と指定したときと全く同じ動作をするようにしました。
つまり、上記のエンドポイントは
https://api.docurain.jp/api/xlsx/[テンプレート名]
https://api.docurain.jp/api/instant/xlsx
と完全に同一です。
この二つは出力タイプをExcel 2007形式で出力するか、それとも97-2003形式で出力するのかを選択するものでは ありません ので注意してください。
Excel形式で出力した結果がExcel 2007形式であるのか、それとも97-2003形式であるのかは使用したテンプレートがどちらであったかに依存します。Excel 2007形式のテンプレートを使用して出力すればExcel 2007形式で出力されます。97-2003形式のテンプレートを使用して出力すれば97-2003形式で出力されます。
こういった細かい変更はブログでは紹介せずドキュメントの更新にとどめていましたが、これからは積極的にブログでも告知していきますので、Docurainユーザーの方はぜひ当ブログも継続的にウォッチして頂ければ幸いです。
よろしくお願いします!
近日公開予定の新機能です。DocurainはExcelを帳票デザインに使用することができる帳票出力サービスですが、この度Word形式のテンプレートでも帳票出力が可能になりました。
最初に実装された機能は、プレースホルダにデータを差し込み、 PDF / Word (docx) / SVG / その他画像形式で出力するというものです。
今回は機能を使って見るために、以下のような簡単な契約書のようなものを作成してみました。
動的に値を差し込む部分には %{date}
のようにプレースホルダを記述しておきます。スタイルが適用されていてもそれが保持されたまま出力されることを確かめるために、書面下部にある住所氏名などの欄は適当にスタイルを適用させています。
また、これは1ページのみですが、もちろん複数にまたがるような文書も出力可能です。
差し込むデータはExcelテンプレートを使用するときと同じように、任意の形式のJSONとして記述します。今回は以下のようなデータを使用してみます。
{ "date": "令和1年8月1日", "contractor": { "address": "東京都 新浜区 風の谷 12丁目34", "name": "猫丸商事", "representativeName": "多摩 三毛太郎" }, "orderer": { "address": "東京都 勝節市 崖の上 2丁目3-1 10F", "name": "株式会社 ピッコロ", "representativeName": "紅豚 三郎" }, "content": [ "猫じゃらしにじゃれつく", "愛想をふりまく", "頭を撫でさせる" ], "payDateLimit": "当日の業務終了", "fee": "カリカリ1日分", "courtName": "勝節市動物愛護センター" }
以上のWord文書とJSONデータを使用してPDF出力用のAPIを叩くと…
こういった感じでPDFのデータがレスポンスとして返ってきます。
罫線や表で構成されるいわゆる「帳票」はエディタがグリッドで構成されるExcelと相性が良いのですが、Excelで一般的な「文書」を使うのは不可能ではないものの使いづらいシーンがあります。
具体的には、Docurainではこれまでも契約書の類を出力されるような用途で使われることがありました。契約書を書くのにExcelを使うというのは、不可能ではないものの普通は正当な文書作成ソフトであるWordを使いたいですよね。今回、Word文書をテンプレートに使用できるようになることで、より広いシーンでDocurainが便利に使えるようになるはずです。
こんにちは。久しぶりの投稿となってしまいました。 Docurainに関しては順調に利用量が増えつつあり、嬉しい限りです。
この度、SVG形式の出力とSVG形式の画像の差し込みに対応しました。
Docurainでは元々、PDF / Excel / PNG / JPEG / GIF 形式での出力が可能でしたが、ここに今回SVGが加わったことになります。
一応説明しますと、SVG(Scalable Vector Graphics)は汎用的なベクターグラフィック形式で、レイヤーやラスタ画像の埋め込みなどにも対応しています。ベクター形式なので印刷や高DPI環境でもきれいな表示が可能です。XMLで定義されており、HTML上にインラインで埋め込むことも可能で、JavaScriptやCSSとの親和性も高いです。
Docurainからの出力でベクタ形式での出力ではPDFが存在しましたが、PDFは単体でダウンロードして扱うには特に問題ないものの、何か既存のシステム(Webシステム、Windowsクライアントアプリなど)と組み合わせると面倒です。帳票を出力したいというシステムでは、既存の自システム上でプレビューを表示させたいとかいう要求はよくあることでしょう。
Webブラウザ上で別ウィンドウで開くのではなくページの一部分に表示させたいといった場合は不可能ではないものの、ブラウザごとの挙動の差が大きいのである程度の試行錯誤が必要になると思われます。各種ネイティブアプリにおいても、PDF表示のためのコンポーネントを使用するか(有償のものが多い印象)、もしくはWebView的なもの(C#ならばWebBrowserコントロール)を利用することになると思われます。後者の場合はやはり試行錯誤が必要になるでしょう。
そこでSVGであればHTML上では通常の画像とほぼ同じように利用できるため、かなり扱いやすくなります。帳票としての用途だけでなく、1日単位、1時間単位などで更新される1複雑なグラフをWebシステム上で表示したい、といった用途でも使いやすくなります。
ということで使ってみます。使うデータは前回の記事で作成したものです。
出力した結果は以下です。
おっ、余談ですがSVGな画像にCSSでshadowを落としていると要素ごとにちゃんと影が落ちるんですね。考えてみれば当たり前なのですが、初めて見たので感動しました。これを覚えていると表現の幅が広がりそうだな~と思いました。
ページを拡大表示して描画がなめらかになっていることを確認してみて下さい。
ちなみに出力ファイルサイズはPDFよりも大きくなる傾向があります。PDFの場合はテキストはそのままテキストデータ(と埋め込みフォント)として残っていますが、SVGの場合はすべての文字がパスに変換されますので。たとえば上記のガントチャートは310KBですが、PDFで出力したところ17.4KBで済みました。
続いて、SVG形式の画像の埋め込みを試してみます。
Docurainでは帳票テンプレートをExcelで、データをJSONで流し込みます。BASE64エンコードした画像をJSONに設定することで画像も動的に帳票に流し込むことができます。たとえば、何かの帳票の担当者氏名の横にそれぞれの担当者の印影を出したいとか…言われそうだよね?それ、意味あるの?って思うかも知れないけど、とりあえず言われそうだよね?そんなときでも大丈夫です。
ただ、SVG画像を動的に流し込む場合は、画像はラスタ形式に変換されます。これは、ExcelがSVGに対応していないためです。
とりあえずやってみましょう。以下のSVG画像を表示してみます。
使用するのは下記のようなごく簡単なテンプレートです。
実際にSVG形式で出力した画像が以下です。
拡大すると、テキスト部分はベクターになってますが、差し込んだSVG画像はラスタライズされているのがわかると思います。
今回使用したデータはこちらからダウンロードできます。
登録不要のお試しページではSVG画像が出力できないため、アカウント登録が必要です。
こちらから登録して、ぜひお試し下さい!
Docurainは出力回数とデータ転送量に応じた課金方法なので、リアルタイムに更新されるデータを表示するには注意が必要です↩