見出し画像

プログラム可能な文書作成ツール、Quarkdown詳解

 Markdownを日常的に使っている方にとって、もう少し自由度が高ければいいのにと思った経験はないでしょうか。Quarkdownはそんなニーズに応える、多機能かつ柔軟な拡張Markdownツールです。

 シンプルに書き進められる一方で、スライド作成や動的な計算処理、グラフ描画までカバーし、さまざまなフォーマットへの出力が一括で行えます。本記事ではQuarkdownの機能概説からスライド・グラフ作成の方法、また他の文書生成システムとの比較や導入事例を踏まえ、その特徴と可能性を解説します。

Spotifyでわかりやすく音声配信:「らみのAIテックラジオ」


 世界経済フォーラムの調査では「2030年に必要なスキル」の第5位に「好奇心と生涯学習」がランクイン。好奇心は趣味ではなく経済的必須スキル
拙著『AI時代の最強スキル「好奇心力」』で詳説しています。



まえがき

 Quarkdownは、Markdownをベースとした現代的な組版システムであり、その中心的な設計思想は「多様性」にあります。このシステムは、印刷に適した書籍やインタラクティブなプレゼンテーションなど、単一のプロジェクトから複数の形式へシームレスにコンパイルすることを可能にします。

 これは、Markdownの強力なチューリング完全な拡張機能を通じて実現され、アイデアが自動的に紙面に反映されることを保証します。

 本稿では、Quarkdownの基本的な機能から、特にユーザーの関心が高いグラフ作成機能とスライド作成機能に焦点を当て、その詳細な使い方とカスタマイズ方法について専門的な観点から深く掘り下げて解説します。

 QuarkdownがどのようにしてMarkdownのシンプルさとプログラマブルな柔軟性を両立させているのか、そしてそれがドキュメント作成ワークフローにどのような変革をもたらすのかを明らかにします。


Quarkdownの概要

Quarkdownとは何か?

 Quarkdown(クアークダウン)は、Markdownをベースに多くの拡張機能を加えた強化版Markdownです。シンプルなテキスト記法で見栄えの良いスライドやウェブページを作成でき、Markdownの可読性を保ちながらLaTeXに匹敵する表現力を持つ点が特徴です。

 PDF出力・数式描画・グラフ描画・画像サイズ指定・関数の定義/呼び出しなど、多彩な機能が組み込まれており、1つのソースからプレゼン資料、記事、書籍まで対応する柔軟性があります。

 Quarkdownは、CommonMarkおよびGFM(GitHub Flavored Markdown)の拡張として誕生した、Markdownベースの先進的な組版システムです。

 その最大の特徴は、Markdownに「関数」の概念を導入し、その他多数の構文拡張を加えることで、従来のMarkdownでは不可能だった複雑で動的なコンテンツ作成を可能にする点にあります。

 この「チューリング完全」な拡張性は、Quarkdownが単なる静的なドキュメントジェネレーターではなく、プログラマブルなドキュメント生成環境であることを意味します。ユーザーは、レイアウトビルダー、I/O処理、数学演算、条件分岐、ループといった機能をMarkdown内で直接利用でき、必要であれば独自の関数や変数を定義することも可能です。

主な特徴

 Quarkdownは、ドキュメント作成を効率化し、表現力を高めるための多くの特徴を備えています。

関数呼び出し
 .somefunction {arg1} {arg2} Body argument のような直感的な構文で、豊富な標準ライブラリ関数や自作関数を呼び出せます。これにより、Markdownの記述性を損なうことなく、高度な組版制御や動的コンテンツ生成が実現します。

拡張可能な標準ライブラリ
 レイアウト構築、ファイル入出力、数学演算、条件文、ループ処理など、多岐にわたる機能を提供する標準ライブラリが用意されています。

カスタム関数と変数
 標準ライブラリだけでは不足する場合でも、ユーザーがMarkdown内で独自の関数や変数を定義できるため、プロジェクト固有の要件や複雑なロジックにも柔軟に対応可能です。

ライブプレビューと高速コンパイル
 -p(プレビュー)オプションと-w(ウォッチ)オプションを組み合わせることで、ソースファイルの変更を検知して自動的に再コンパイルし、ブラウザでリアルタイムに結果を確認できます。コンパイル速度も高速であり、快適な執筆環境を提供します。

多様な出力ターゲット
 HTML(プレーン、reveal.jsによるスライド、paged.jsによる書籍・記事形式)およびPDFへの出力に対応しています。HTMLでサポートされる全てのドキュメントタイプと機能は、PDFエクスポート時にも同様にサポートされます。

エラー処理
 デフォルトでは、エラーが発生した場合でもドキュメント内にエラー箇所がボックス表示されるため、全体を確認しながら修正作業を進められます。一方、--strictオプションを使用すると、エラー発生時にプログラムが終了します。

 これらの特徴により、QuarkdownはMarkdownの手軽さを維持しつつ、プログラマブルな文書作成という新たな次元を切り開いています。

 特に、カスタム関数を定義できる点は、Quarkdownを単なるツールから、ユーザーのニーズに合わせて進化するプラットフォームへと昇華させています。

 これにより、「必要に応じて複雑な」ドキュメント作成が可能となり、定型的なレポートから学術論文、技術書に至るまで、幅広い用途での活用が期待できます。

Quarkdownの目的と利点

 Quarkdownの根本的な目的は、Markdownの持つ記述の容易さと読みやすさを最大限に活かしつつ、LaTeXのような高度な組版制御とプログラマビリティを組み合わせることにあります。

 これにより、従来のMarkdownでは表現力に限界があった複雑なレイアウトや動的なコンテンツ生成、再利用可能なコンポーネントの作成などが、より直感的かつ効率的に行えるようになります。

 主な利点としては、以下のような点が挙げられます。

学習コストの低減
 Markdownの知識があれば、Quarkdownの機能の大部分はすぐに理解し、活用し始めることができます。

表現力の向上
 関数システムにより、レイアウト、メタデータ、コンテンツ生成を細かく制御でき、高品質なドキュメントを作成できます。

再利用性とモジュール性
 カスタム関数や外部ライブラリのインポート機能により、共通のコンポーネントやロジックを複数のドキュメントで再利用でき、効率的なドキュメント管理が可能です。

再現性の確保
 特に学術研究などにおいては、データ分析のコードとレポートを一体化させることで、研究の透明性と再現性を高める可能性が指摘されています。

多様な出力形式への対応
 単一のソースからHTML、PDF、スライドなど、目的に応じた形式で出力できるため、コンテンツの多用途展開が容易です。

 Quarkdownは、Markdownのシンプルさを愛好するユーザーが、より高度なドキュメント作成に挑戦する際の強力な選択肢となるでしょう。


基本構文と拡張機能一覧

 Quarkdownでは通常のMarkdown記法(CommonMarkやGitHub Flavored Markdown)をベースに、以下のような構文拡張が追加されています

ドキュメントメタデータ
.docname(文書名)、.docauthor(著者名)、.doclang(言語)などで文書タイトルや著者等を定義できます。例えば.docauthor {山田太郎}とすると文書全体の著者名に利用されます。

レイアウト制御
 .themeやlayoutでテーマ配色やレイアウトスタイルを指定可能です(例:.theme {darko}はダークテーマ、layout:{minimal}は余計な装飾を抑えたレイアウト)。段組みや配置も.row(横並びコンテナ)、.column(カラム)などの関数で柔軟にレイアウトできます。

見出し・ページ分割
 Markdownの見出し(# 見出し)はそのまま利用でき、目次も.tableofcontents関数で自動生成可能です。ページやスライドの区切りはドキュメント種別に応じ自動処理され、印刷用(ページ出力)の場合は見出しレベルに応じて自動改ページ(.autopagebreak設定)も可能です。

画像と図表
 標準の画像挿入に加え、サイズ指定付き画像挿入が可能です。例えば !(200x150)[代替テキスト](image.png) のように書くと、幅200px・高さ150pxに収まるサイズで画像を表示できます。また画像にキャプションや番号を付ける.figure機能も備わっています(キャプション付きで図番号を自動割当て)。

引用と警告枠
 通常の引用記法に加えて、引用文に出典を示す引用元表示や、ノート・警告・ティップスなどスタイル別の情報ボックス(Alert)が使えます。

 例えば、> Note: ~~のように書くと「Note:」と強調された注釈枠になります。引用の最後に「- 著者名, 出典」を付ければ出典付き引用も簡単に実現できます。

数式
 $ ... $でインライン数式、$$ ... $$でブロック数式を記述でき、内部ではKaTeXを用いて高速レンダリングされます。LaTeXライクな記法で複雑な数式も記述可能です。

プログラミング的拡張
 Quarkdown最大の特徴は関数・変数・制御構文をMarkdown内で使える点です。.function {名前}で独自関数を定義し、以降 .名前 {引数} で呼び出せます。

 変数は.var {名} {値}で定義し、.名で参照可能です。加えて.ifや.for(.repeat)による条件分岐・ループ処理も可能で、Markdown文書内で簡単な計算や繰り返し生成ができます。例えばFibonacci数列を計算して表に埋め込む、といった動的コンテンツも記述できます。

標準ライブラリ
 これら機能を支えるため多数の組み込み関数群(スタンダードライブラリ)が提供されています。文字列操作、日付・数値計算、配列操作、ログ出力、他ファイル読み込み(.include)、CSVやJSONの読み込み(.csv等)、配色やスタイル指定など多岐にわたります。ユーザは追加のQuarkdownスクリプトを.includeで取り込んでライブラリ拡張することもできます。

 以上のように、「Markdownの書きやすさ」と「LaTeXの柔軟な拡張性」を両立したのがQuarkdownの構文です。基本的な見た目の記法はMarkdown準拠なので直観的で、必要に応じてドットから始まる関数記法で高度なレイアウトやロジックを組み込めます。


インストールとプロジェクト設定

 Quarkdownを利用開始するためには、いくつかの基本的なステップが必要です。ここでは、システム要件からインストール、プロジェクトの作成とコンパイル方法、そして主要なコマンドラインオプションについて詳述します。

システム要件

 Quarkdownを実行するためには、Java 17以上の実行環境が必要です。主要なオペレーティングシステム(Windows, macOS, Linux)がサポートされています。

インストール手順

 Quarkdownのインストールは、以下の手順で行います。

ダウンロード
 最新の安定版リリースからquarkdown.zipをダウンロードするか、gradlew distZipコマンドを使用してビルドし、生成されたzipファイルを解凍します。

ディレクトリ構造
 解凍すると、以下の主要なディレクトリが展開されます。

 bin: 実行可能なスクリプトが含まれています。このディレクトリをシステムのPATH環境変数に追加すると、Quarkdownコマンドへのアクセスが容易になります。

 lib/qmd: プロジェクトにインポート可能な.qmd形式のライブラリが含まれています。

Javaの確認
 システムにJava 17以上がインストールされていることを確認してください。

プロジェクトの作成とコンパイル

 Quarkdownプロジェクトの作成は特別なコマンドを必要とせず、.qmdまたは.md拡張子を持つテキストファイルを作成することから始まります。コンパイルは、コマンドラインインターフェース(CLI)を通じて行います。

 基本的なコンパイルコマンドは以下の通りです。

quarkdown c <target_file> [options]

 ここで、<target_file>はコンパイル対象のQuarkdownソースファイル(通常はプロジェクトのルートとなるファイル)を指定します。

 プロジェクトが複数のソースファイルで構成されている場合、他のファイルをインクルードするメインのファイルを指定する必要があります。ファイルのインクルードは、Quarkdownの関数(例:.include関数)を使用して行います。

主要なコンパイルオプション

 Quarkdownのコンパイル時には、様々なオプションを指定することで出力形式や挙動を制御できます。以下に主要なオプションを示します。


グラフ作成機能の使い方

 Quarkdownではコードブロック内にグラフ記法を書くだけで図表を描画できます。特に対応している形式としてMermaid(マーメイド)があります。

 Mermaidはフローチャートやシーケンス図などをテキストで記述できる記法で、Quarkdownでは .mermaid ブロックを使ってMermaidコードを記述すると、その部分が対応するダイアグラムとしてレンダリングされます。たとえば以下のように記述できます

.mermaid
  flowchart TD
    A([Start]) --> B[ログイン画面]
    B --> C{認証成功?}
    C -- Yes --> D[ダッシュボードへ遷移]
    C -- No --> E[エラーメッセージ表示]

 上記のように.mermaidの下にMermaidのフロー図をインデントして書くと、矢印や分岐を含むフローチャートが描画されます。

 Mermaidの詳細な記法(フロー図・クラス図・ガントチャート等)は公式ドキュメントを参照できますが、Quarkdown上ではそのままMermaidの構文を埋め込めるため非常に手軽です。

 また、Mermaidコード中にはQuarkdownの関数を埋め込むことも可能で、フローチャートの中で計算結果や変数を表示させることもできます。

 さらに、Mermaid以外にも簡易的なグラフ描画関数として.xychartが用意されています。.xychartは折れ線グラフや棒グラフを描くための関数で、データ系列を直接指定して2次元グラフを生成します。例えば、以下のようにCSVデータを読み込んで2系列の売上推移グラフを描画できます。

.var {columns}
    .tablecolumns
        .csv {sales.csv}

.xychart xtags:{.columns::first} x:{年度} y:{売上}
    .columns::second
    .columns::third

 上記ではまず.csv関数でCSVファイル(例えば「年度,製品A,製品B」の形式)を読み込み、.tablecolumnsで列ごとのデータに展開しています。続いて.xychartでX軸タグに1列目(年度)、Y軸ラベルに「売上」、そしてプロットする値系列に2列目・3列目を渡すことで、製品AとBの売上推移を2本の折れ線として描画しています。

 .xychartはオプション引数で線グラフか棒グラフか(lines/bars)の指定、軸ラベル(x:/y:)、軸の数値範囲(xrange/yrange)やカテゴリタグ(xtags)の指定、キャプション(caption)の設定などが可能です。キャプションを付ければ図番号も自動管理され、レポート中で「図1」と参照することもできます。

 MermaidとXYチャート以外に、Quarkdown自体にはGraphviz (DOT言語) の直接的な埋め込み機能は言及されていません。しかし外部ツールの併用によりGraphvizの出力を画像として貼り付けたり、QuarkdownのHTML埋め込み機能(.htmlブロック)を使ってGraphvizの図を挿入することは可能です。

 実際、類似の統合環境であるQuartoではMermaidとGraphvizの両方をネイティブサポートしている例もあります。QuarkdownではMermaid記法でカバーできる図表が多いため、標準機能としてはMermaidでの図作成が中心となっています。

Mermaidダイアグラム (.mermaid)

 Quarkdownは、.mermaidブロック関数を通じて、Mermaid構文で記述された様々な種類のダイアグラムやチャートをドキュメントに埋め込むことを全面的にサポートしています。フローチャート、シーケンス図、ガントチャート、クラス図、円グラフなど、Mermaidが提供する豊富な表現力をQuarkdownドキュメント内で活用できます。

基本的な使い方

 .mermaid関数はブロック引数としてMermaidコードのコンテンツを受け取ります。

コード スニペット

.mermaid
  flowchart TD
    A([開始]) --> B{処理1}
    B -- Yes --> C[処理2]
    B -- No --> D[終了]
    C --> D

Quarkdown関数の利用

 Mermaidコード内でもQuarkdownの関数呼び出しを使用することが可能です。これにより、動的に生成された値をダイアグラムの要素として組み込むことができます。

コード スニペット

.var {node_text} {動的に生成されたテキスト}
.mermaid
  graph LR
    A[ノード1] --> B[.node_text]

ファイルからの読み込み

 .read関数をブロック引数内で使用することで、外部ファイル(例: chart.mmd)からMermaidの定義を読み込むことができます。

コード スニペット

.mermaid
 .read {path/to/your/chart.mmd}

キャプションと番号付け

 オプションのcaption引数を使用することで、ダイアグラムにキャプションを付け、ドキュメント内の図として自動的に番号付けすることができます。

コード スニペット

.mermaid caption:{システム構成図}
  graph TD
    User --> WebServer
    WebServer --> AppServer
    AppServer --> Database

 キャプションなしで番号付けのみを行いたい場合は、空の文字列をcaption引数として渡します (caption:{})。

 Mermaidの構文やカスタマイズオプションに関する詳細な情報は、Mermaidの公式ドキュメントを参照することが推奨されます。Quarkdownの.mermaid関数は、これらのMermaidの機能をシームレスに統合し、テキストベースのドキュメント作成において複雑な図表を容易に扱えるようにします。

 これにより、技術文書や設計書、プレゼンテーション資料など、視覚的な情報伝達が重要なドキュメントの品質と作成効率を大幅に向上させることができます。


スライド作成機能の使い方 (reveal.js連携)

 Quarkdownはプレゼンテーションスライドの作成を得意としており、簡単な設定でMarkdownテキストからスタイリッシュなスライドを生成できます。

 スライド用の出力を行うには、文書冒頭でドキュメント種別をスライドに指定します。具体的には.doctype {slides}と記述すると、そのドキュメントはスライドモードでコンパイルされます。

 スライドモードでは、Quarkdown内部でReveal.js(JavaScript製のスライド表示フレームワーク)が利用され、各見出しがそれぞれのスライドとして出力されます。例えば、以下のようなQuarkdownを書いたとします。

.docname {プレゼン資料タイトル} .doctype {slides}

# はじめに
本スライドではQuarkdownの紹介を行います。

## Quarkdownとは?
- Markdownベースの新しいドキュメント作成ツール
- **LaTeXより簡潔**に高度なドキュメントが作れる

 上記の例では、ドキュメント名を設定し、.doctype {slides}を指定しています。見出し# はじめにが1枚目のスライドのタイトルとなり、その下の段落が本文として表示されます。

 続く## Quarkdownとは?は2枚目のスライドのタイトルになり、箇条書きの内容が順次表示されます(階層的に深い見出しを使うとReveal.jsの垂直スライド機能でサブスライドを構成できます)。

 スライドの区切りは原則として最上位の見出し(または水平線区切り---)で判定されます。適宜スライドを分割したい位置で見出しレベルを上げるか、.pagebreak関数で明示的に改ページすることでスライドを増やせます。

 スライドのデザインについてもカスタマイズ可能です。QuarkdownにはReveal.jsの標準テーマに加えて独自のテーマやレイアウトが用意されており、先述の.themeやlayoutで指定できます。

 例えば.theme {darko}はダーク調のテーマ、layout:{minimal}はシンプルなレイアウトを適用します。

 また、.slides関数を使うことでスライド全体のオプション(縦方向中央寄せ表示、ナビゲーションコントロールの表示有無、スライド切替効果の種類と速度など)を設定できます。

 例えば、.slides transition:{zoom} speed:{fast}とすればスライド切替時にズーム効果(速め)で切り替わるようになります。

 スライド上の要素アニメーションもReveal.jsの機能(fragments)を利用できます。Quarkdownではリスト項目や任意のブロックに対して.fragment関数を付与することで、箇条書きの項目を一つずつ順番に表示させるといったアニメーションが可能です。

 さらに各スライドに共通のフッターやヘッダーを入れたい場合は、.footerや.header関数内に内容を書くことで全スライドにその内容を挿入できます(スライド番号や著者名などをフッターに毎ページ表示する、といった用途)。

 作成したスライドはHTMLファイルとして出力され、ブラウザで表示・発表が可能です。Reveal.jsによりキーボードやクリックでスライドを送ったり、フルスクリーン表示したりといった操作ができます。

 QuarkdownではこのHTMLをそのままPDFにエクスポートすることもでき、印刷配布用の資料としても出力可能です。実際、Quarkdownで作成したスライドをPDF化すればスピーカーノート付きのハンドアウトを配布するといった使い方もできます。

reveal.jsとの連携概要

 Quarkdownでスライドを作成する場合、出力形式としてreveal.jsが利用されます。これは、ドキュメント内で.doctype {slides}関数を呼び出すことで指定します。この宣言により、QuarkdownコンパイラはMarkdownコンテンツをreveal.jsが解釈可能なHTML構造に変換し、インタラクティブなスライドショーを生成します。

 Quarkdownの思想は、Markdownのシンプルさを保ちながらreveal.jsの強力な機能を活用することにあります。.slides関数や.fragment関数といったQuarkdown独自のラッパー関数を通じて、reveal.jsの主要な設定や機能をMarkdownらしい構文で制御できます。これにより、ユーザーはreveal.jsの複雑なJavaScript APIを直接操作することなく、高品質なスライドを作成できます。

スライドの区切り方

 Quarkdownにおけるスライドの区切りは、主にMarkdownの標準的な見出し構文を利用して行われます。これは、QuartoやR Markdownなど、他の多くのMarkdownベースのスライド生成ツールと共通のアプローチであり、コンテンツの論理構造をそのままスライド構造に反映させやすいという利点があります。

見出しレベルによる区切り

 通常、レベル1の見出し (#) は主要なセクションのタイトルスライドを作成し、新しい水平方向のスライドスタックを開始するのに使用されます。

 レベル2の見出し (##) は、セクション内の個々のスライドを作成します(2Dレイアウトを使用している場合は垂直方向のスライドになることもあります)。

 Quarkdownの公式デモ (demo.qmd) では、# Versatile や ## Functions といった見出しを使用してスライドが構成されています。

水平線による区切り

 水平線 (---) を使用して、ヘッダーなしの新しいスライドを作成することも可能です。これは、特にreveal.jsのオプションでslide_level: 0が設定されている場合に有効ですが、Quarkdownでこのオプションが直接公開されているかは不明です(reveal.js自体の機能です)。

slides関数によるスライドの外観と動作の設定

 .slides関数は、プレゼンテーション全体のデフォルト設定を上書きするために使用されます。この関数のパラメータはすべてオプションです。

パラメータ説明受け入れる値デフォルト値
 
centerコンテンツを垂直方向に中央揃えにするかどうか。Boolean現在のレイアウトテーマによるcontrolsナビゲーションコントロールを表示するかどうか。Booleantruetransitionスライド間のトランジションスタイル。none, fade, slide, zoom などslidespeedトランジションの速度。transitionの設定が必要。default, fast, slowdefault

Quarkdownのデモ (demo.qmd) では、.slides transition:{zoom} speed:{fast} のように使用されており、ズームトランジションを高速で実行する設定が適用されています。これらのパラメータはreveal.jsの同等のオプションに直接対応しており、Quarkdownを通じてreveal.jsの挙動を制御していることがわかります。

 .fragment関数によるインタラクティブなコンテンツ作成

 フラグメントは、スライド内の個々の要素を段階的に表示したり隠したりするためのインタラクティブなセクションです。Quarkdownでは.fragmentブロック関数を使用して作成します。

 この関数は、表示するコンテンツを本文引数として取ります。さらに、オプションのbehavior引数により、フラグメントの動作を指定できます。

behaviorオプション名説明
 
show (デフォルト)最初は非表示で、インタラクション時にフェードインします。hide最初は表示されており、インタラクション時にフェードアウトします。semihide最初は表示されており、インタラクション時に50%までフェードアウトします。showhide最初は非表示で、インタラクション時にフェードインし、次のインタラクションでフェードアウトします。

同じスライド内に複数のフラグメントが存在する場合、それらは記述された順序でトリガーされます。

 公式デモでは、箇条書きの項目を段階的に表示するために .fragment が使用されています(例: .fragment a distinguished book.)。この機能はreveal.jsのフラグメント機能に直接対応しており、Quarkdownはこれを簡潔な構文で利用可能にしています。

テーマとさらなるカスタマイズ (reveal.jsの機能を活用)

 Quarkdownは、スライドの視覚的なスタイルをカスタマイズするためのテーマ機能を提供しつつ、reveal.jsの広範なカスタマイズ能力を活用する道も開いています。

Quarkdownのテーマ機能

 公式デモ (demo.qmd) では、.theme {darko} layout:{minimal} という記述が見られます。これは、Quarkdownが独自のテーマシステムを持っているか、またはreveal.jsのテーマを簡単に適用するための仕組みを提供していることを示唆しています。

 「darko」や「minimal」は、Quarkdown固有のテーマやレイアウト、あるいはreveal.jsのテーマへのエイリアスである可能性があります。

reveal.jsのテーマ活用

 Quarkdownがreveal.jsを基盤としているため、ユーザーは原理的にはreveal.jsが提供する多様なテーマを利用できる可能性があります。Quarkdownの.theme関数で直接公開されていないカスタムreveal.jsテーマを適用する方法については、カスタムCSSのインクルードなど、さらなる調査が必要となる場合があります。

その他のreveal.js機能

 スピーカーノート、多重化(multiplexing)、チョークボードやメニューといったプラグインなど、reveal.jsの多くの高度な機能 は、Quarkdownが任意のreveal.js設定の引き渡しやカスタムJavaScriptのインクルードを許可していればアクセス可能かもしれません。

 .slides関数は一般的なオプションの一部をカバーしていますが、より深いカスタマイズのためにはreveal.js自体の理解 が有益です。

demo.qmdからの実践例

 Quarkdownの公式デモファイル (demo.qmd) は、スライド作成における多くの実践的なテクニックを示しています。

スライド用ドキュメントメタデータ
 .docname {Quarkdown demo}、.docauthor {iamgio}、.doclang {english} といったメタデータ関数を使用して、プレゼンテーションの基本情報を設定しています。

レイアウトと美的設定
 前述の .theme {darko} layout:{minimal} に加え、.pageformat {A4} orientation:{landscape} といった記述も見られます。これらは主にページ分割されたドキュメント(書籍や記事)向けの設定かもしれませんが、スライドデモ内に存在することは興味深い点です。

スライド特有のコンテンツ
 見出しをスライドタイトルとして、リストを箇条書きポイントとして、コードブロックや画像をスライドコンテンツとして効果的に使用しています。

 これらの例は、Quarkdownの機能を組み合わせて、構造的かつ視覚的に魅力的なプレゼンテーションを構築する方法を示しています。


対応プラットフォームと利用方法

 Quarkdownはオープンソース(GitHub上で公開)のツールで、現在コマンドラインアプリケーションとして提供されています。Java(JVM)で実装されており、Java 17以上がインストールされた環境であればWindows/Mac/LinuxいずれのOSでも動作します。

 公式サイトから配布されているZIPパッケージをダウンロードし、展開すると中に実行用のスクリプト(bin/quarkdown)が含まれています。これをPATHに通すとターミナル上でquarkdownコマンドが使えるようになります。

コマンドライン操作による基本的な利用方法は以下の通りです。

新規プロジェクト作成:quarkdown create プロジェクト名
対話的なウィザードが起動し、プロジェクト用ディレクトリと雛形ファイル(メタデータや章立てのテンプレート)が生成されます。手動で始める場合は空の.qmdファイルを作り、そこにMarkdown+Quarkdown記法で書き始めても構いません。

コンパイル(HTML/PDF出力):quarkdown c ファイル.qmd
 指定したQuarkdownファイルをコンパイルし、デフォルトではoutputディレクトリにHTMLを出力します。複数のソースファイルで構成する場合は、親となるファイルに他の.qmdを.includeで取り込んでから、その親ファイルをコンパイルします(親ファイルがエントリーポイントになります)。

プレビュー表示:quarkdown c -p -w ファイル.qmd
 -pオプションを付けると組み込みの簡易Webサーバーが起動し、コンパイル後に自動でブラウザでプレビューを開いてくれます。さらに-w(watch)を付けるとソースファイルの変更監視も有効になり、保存のたびに再コンパイル・プレビュー更新がされます。このライブプレビュー機能により、ブラウザで完成イメージを確認しながら執筆できます。

PDF出力:quarkdown c --pdf ファイル.qmd
 HTMLに加えてPDFも同時に生成します。-r html-pdfと指定するのと同等で、Chromeヘッドレス相当のレンダラでHTMLをPDF化します。スライドをPDF化する場合もこのオプションで可能です。

その他オプション
出力先ディレクトリの指定(-o)、ログレベル指定(-Dloglevel=info等)、出力HTMLの整形(--pretty)や毎回出力前にフォルダをクリーンする(--clean)、エラー検出時に処理を中断するストリクトモード(--strict)などのオプションがあります。

 エディタ連携について、現時点で専用のGUIエディタやVSCode拡張は提供されていません。しかし上記のようにライブプレビュー用サーバーを起動しておけば、VSCodeや好きなテキストエディタで.qmdファイルを編集しつつ、ブラウザでリアルタイムにレンダリング結果を確認しながら執筆できます。

 VSCodeであればビルドタスクにコンパイルコマンドを仕込んでおくことで、ショートカット一発でコンパイル→ブラウザ更新といった開発スタイルも可能です。今後コミュニティによってエディタプラグイン等が開発される可能性もあります。

 また、Quarkdownの出力するHTML/PDFは静的なファイルですので、生成物をウェブサイトやブログにそのまま利用することもできます。例えばQuarkdownで技術記事を書いてHTMLを出力し、自分のブログにアップロードするといった使い方も可能です。

 スライド出力の場合は単一HTML(+リソース)ですから、そのファイルを公開すれば誰でもブラウザでスライドを閲覧できます。特にGitHub Pagesなど静的ホスティングとの相性も良いでしょう。


Quarkdownテクニック

 Quarkdownの真価は、基本的なMarkdown構文の拡張に留まらず、ユーザーがシステム自体を拡張し、複雑なドキュメント作成ニーズに対応できる点にあります。ここでは、カスタム関数の定義方法と、効率的な開発ワークフローやデバッグのためのヒントを探ります。

カスタム関数の定義

 Quarkdownの最も強力な特徴の一つは、ユーザーが独自の関数を定義できることです。これにより、繰り返し使用するパターンを抽象化したり、ドメイン固有のロジックをカプセル化したり、複雑な出力を生成する再利用可能なコンポーネントを作成したりすることが可能になります。

構文

 カスタム関数は.functionキーワードを用いて定義されます。基本的な構文は以下の通りです。

.function {関数名} 仮引数1 仮引数2: 関数の本体(.仮引数1 や.仮引数2 を使用)

例:

公式デモ 2 には、挨拶メッセージを生成する簡単なカスタム関数が示されています。

コード スニペット

.function {greet} to from:
  **Hello,.to** from.from!

.greet {world} from:{Giorgio}

 この例では、greetという名前の関数を定義し、toとfromという2つの引数を取ります。そして、これらの引数を使用して整形された挨拶文を出力します。

 ユーザーによる実用的な例として、テーブルキャプションをシミュレートするための.mytable関数を作成する試みが挙げられます。これは、Quarkdownの標準機能だけでは満たせない特定のニーズに対して、ユーザー自身がシステムを拡張できることを示す好例です。

 このようなカスタム関数機能は、Quarkdownが「必要に応じて複雑な」ドキュメント作成に対応できると主張する根拠そのものです。標準ライブラリが提供するツール群に加え、ユーザーが独自のツールを作成できることで、Quarkdownは単なるマークアップ言語から、真にプログラマブルなドキュメント生成プラットフォームへと進化します。

効率的なワークフローとデバッグのヒント

 Quarkdownで複雑なドキュメントやプレゼンテーションを作成する際には、効率的なワークフローとデバッグ手法が重要になります。Quarkdownは、これを支援するためのいくつかの機能とプラクティスを提供しています。

ライブプレビュー
 -p (または --preview) オプションと -w (または --watch) オプションを組み合わせてコンパイルすることで、ソースファイルを変更するたびに自動的に再コンパイルされ、ブラウザで結果がリアルタイムに更新されます。これにより、変更の影響を即座に確認でき、迅速なイテレーションが可能になります。

quarkdown c your_document.qmd -p -w

エラー処理

非Strictモード
 デフォルトでは、QuarkdownはStrictモードで動作しません。エラーが発生した場合、コンパイルは中断されず、ドキュメント内のエラー箇所が目立つボックスとして表示されます。これにより、エラーを特定しつつ、ドキュメントの他の部分がどのようにレンダリングされるかを確認できます。公式デモ 2 にも、エラーメッセージがドキュメント内に表示される例があります。

Strictモード
 --strict オプションを使用すると、エラー発生時にプログラムが直ちに終了します。これは、CI/CDパイプラインなど、厳密なエラーチェックが必要な場合に有用です。 このエラー報告メカニズム、特に非Strictモードでのボックス表示は、開発プロセスを反復的に進める上で非常に役立ちます。エラーを一つずつ修正しながら全体像を把握できるため、複雑なドキュメントの構築が容易になります。

整形された出力 (Pretty Output)

 --pretty オプションを使用すると、生成されるHTMLなどの出力コードが整形され、可読性が向上します。これは、出力されたHTML構造を直接確認してデバッグする際に役立ちます。ただし、整形処理が意図しない視覚的影響を与える可能性もあるため、本番環境では無効にすることが推奨されます。

REPL (Read-Eval-Print Loop)

 quarkdown repl コマンドを実行すると、対話的な実行環境が起動します。これにより、Quarkdownの関数や構文をその場で試したり、小さなコードスニペットの動作を確認したりすることができ、学習や実験に便利です。

モジュラーデザイン

 .include 関数を使用して他のQuarkdownファイルをインクルードしたり、前述のカスタム関数を定義してライブラリ化したりすることで、大規模なプロジェクトを管理しやすく、再利用性の高いモジュール構造にすることができます。

ドキュメントと事例の参照

 公式ドキュメント (quarkdown.com/docs) は、標準ライブラリの各関数の詳細な仕様(入力、出力など)を提供しています。

 GitHub Wikiは、機能のユースケースやユーザー中心のガイドを提供しており、補完的な役割を果たします。

 GitHubリポジトリ内の mock ディレクトリには、Quarkdownで利用可能な視覚要素の包括的なコレクションが含まれており、具体的なコード例を通じて機能を理解するのに最適です。

 これらのテクニックとリソースを組み合わせることで、Quarkdownを用いたドキュメント作成の生産性と品質を大幅に向上させることができます。


主な活用事例・ユースケース

 Quarkdownは1つの文書ソースから複数形式の出力を得意とするため、以下のような様々な用途に活用できます。

講義・セミナー資料
 授業の講義スライドや技術セミナーのプレゼン資料作成に利用できます。Markdown感覚で内容を書きつつ、後から.doctype {slides}を指定すれば即座にスライド化できるため、準備時間を大幅に短縮できます。箇条書きのアニメーション表示やコード埋め込み、数式表示にも対応しているため、教育用途にうってつけです。

技術文書・レポート
 ソフトウェアのドキュメント、技術ブログ記事、研究レポートなどにも適しています。特に数式やアルゴリズムの説明、コードスニペットのハイライト表示、図表の番号管理など、技術文書に必要な機能が揃っています。

 .doctype {paged}を使えば論文や書籍のようなページ組みのPDFも作成できるため、研究論文やホワイトペーパーの執筆にも活用できます。実際、Quarkdownには定理や命題の書式を定義する「Paper」ライブラリも付属しており、数式を多用する専門文書のニーズにも応えます。

Webコンテンツ・ブログ
 出力されたHTMLをそのままWebページとして公開できるため、ブログ記事やドキュメントサイト作成にも使えます。Markdownベースなので記事本文の執筆に集中でき、完成後にHTMLに変換してスタイル調整する手間が省けます。画像のサイズ調整やキャプション、引用の装飾などもマークアップで簡潔に書けるため、記事のクオリティ向上に寄与します。

書籍・資料の出版
 Quarkdownは長文ドキュメントの編纂にも向いています。複数ファイルを.includeでまとめて1つの書籍PDFに出力したり、章ごとにファイルを分けて管理することもできます。

 ページ番号や目次、クロスリファレンス(相互参照)も自動処理されるため、大規模なドキュメントでも一貫性を保ちやすくなります。技術書やマニュアル、社内資料の作成に利用している例もあります。

 このようにプレゼンテーションから記事、書籍まで一貫して同じ書式で作れる点がQuarkdownの強みであり、使い慣れれば「Write once, Publish anywhere(一度書けばどこへでも公開できる)」を体現できます。


結論とさらなるリソース

 Quarkdownは、Markdownの簡便性とプログラマブルな組版システムの強力さを融合させた、革新的なツールです。本レポートでは、その基本的な機能から、特にグラフ作成とスライド作成に焦点を当てて詳細な利用方法を解説しました。

Quarkdownのドキュメントおよびプレゼンテーション作成における強力な機能のまとめ

 Quarkdownの核心は、Markdownをチューリング完全な言語へと拡張し、関数、変数、制御フローといったプログラミングの概念をドキュメント作成プロセスに導入した点にあります。

 これにより、静的なコンテンツ記述ツールであったMarkdownが、動的で複雑なドキュメントやプレゼンテーションを生成できる強力なプラットフォームへと変貌を遂げました。

 グラフ作成においては、.xychart関数によるMermaidベースの柔軟な2Dチャート生成や、.mermaid関数による多様なダイアグラムの直接埋め込みが可能です。データソースとして静的リスト、CSVファイル、さらにはQuarkdownの反復処理の結果を利用できるため、データ駆動型のドキュメント作成が容易になります。

 スライド作成においては、reveal.jsとのシームレスな連携により、Markdownの記述性を活かしつつ、トランジション、フラグメント(段階的表示)、テーマ設定など、本格的なプレゼンテーション機能を活用できます。.doctype {slides}、.slides、.fragmentといった専用関数が、これらの機能を直感的に制御する手段を提供します。

 カスタム関数の定義機能は、Quarkdownの拡張性を飛躍的に高め、定型的な作業の自動化や、特定のニーズに合わせた独自の組版ロジックの実装を可能にします。ライブプレビューや対話的なエラー表示といった開発支援機能も、効率的なドキュメント作成を後押しします。

 総じて、Quarkdownは、技術文書、学術論文、書籍、そしてインタラクティブなプレゼンテーションといった幅広い用途において、作成者に新たな表現力と生産性をもたらす可能性を秘めています。

公式ドキュメント、Wiki、コミュニティへのポインタ

 Quarkdownをさらに深く学び、活用するためには、以下の公式リソースが非常に役立ちます。

公式ドキュメント
quarkdown.com/docs (または quarkdown.com/docs/quarkdown-stdlib )

 標準ライブラリに含まれる各関数のパラメータ、入力、出力に関する包括的かつ詳細な情報が提供されています 。

GitHub Wikihttps://github.com/iamgio/quarkdown/wiki

 公式ドキュメントを補完する形で、ユーザー中心のガイド、機能のユースケース、具体的な使用例などが集められています。公式ドキュメントが関数の「仕様」を詳述するのに対し、Wikiは「使い方」に焦点を当てていると理解すると良いでしょう。

公式デモプロジェクト

 Quarkdownで構築されたデモプレゼンテーションとそのソースコードは、Quarkdownの機能を実際にどのように組み合わせるかを示す最良の教材の一つです。ソースコードはGitHubリポジトリのdemoディレクトリ (https://github.com/iamgio/quarkdown/tree/main/demo) から入手可能で、多くのREADMEやWikiページからも参照されています。

Mockディレクトリ

GitHubリポジトリ内のmockディレクトリには、Quarkdownが提供する様々な視覚要素のサンプルコードが含まれています。これは、特定の機能やレイアウトを実現するための具体的なコード例を探す際に有用です。

GitHubリポジトリ (Issues, Discussions) https://github.com/iamgio/quarkdown

 バグ報告、機能要望、Quarkdownに関する議論など、開発者や他のユーザーとのコミュニティ交流の場として活用できます。

 Quarkdownを習得する上では、公式ドキュメントで関数の詳細を理解し、Wikiで実践的な使い方を学び、デモやMockのコード例を参考にしながら実際に手を動かしてみることが推奨されます。

 これらのリソースを効果的に活用することで、Quarkdownの持つポテンシャルを最大限に引き出すことができるでしょう。


関連ツールや他技術との比較

 Quarkdownと類似の目的を持つツールやライブラリとの比較も押さえておきましょう。

Quarto
 QuartoはRStudio社が開発した統合ドキュメントシステムで、拡張子 .qmd を使いMarkdown文書からHTML/PDF/Word/PowerPointなど様々な形式に変換できる点でQuarkdownと似ています。

 大きな違いは、QuartoがPandocベースでR/Pythonなどのコード実行と組み合わせたレポート生成(動的レポート)に強いのに対し、QuarkdownはMarkdownそのものにプログラミング的拡張を内包している点です。

 Quartoではコードブロック内でRやPythonを実行しその出力を埋め込むアプローチですが、QuarkdownではMarkdown内の関数でロジックを記述します。

 またQuartoはLaTeXテンプレートを用いた高度な組版やMS Word・PPTXへのエクスポートも可能なのに対し、Quarkdownは現時点で対応出力はHTMLとPDFに限定されています(その代わり動作に外部ソフトを必要とせず、設定もシンプルです)。

 ファイル拡張子.qmdが偶然QuartoとQuarkdownで重複していますが、両者は無関係のプロジェクトです。総じて「プログラミング知識不要でリッチコンテンツ作成」という目標は共通しつつも、Quartoはデータ分析寄り、Quarkdownはドキュメントレイアウト寄りと棲み分けられるでしょう。

Reveal.js
 
Reveal.jsはHTMLプレゼンテーションを作るためのフレームワークで、Markdownからスライドを生成するツール(例えばMarpやQuartoのReveal.jsエンジン)でも利用されています。

 Quarkdownも内部でReveal.jsを使用しており、スライドモードでの出力はReveal.js形式のHTMLになります。ユーザが直接Reveal.jsを意識する必要はありませんが、利点としてReveal.jsの多彩なプラグインやテーマをそのまま利用できる点が挙げられます。

 例えば発表者ノート機能やレーザーポインタ機能、また社内標準のReveal.jsテーマへの変更なども、出力されたHTMLをカスタマイズすれば実現可能です。したがって「MarkdownベースでReveal.jsスライドを作る」のがQuarkdownでもできると言えます。

 対して、Quarkdown独自のメリットはMarkdown拡張によるレイアウト指定や関数機能が使える点で、純粋なReveal.jsより簡潔に複雑なレイアウトスライドを記述できます。

Marp
 Marp(Markdown Presentation Ecosystem)はMarkdownからスライドを作成するシンプルなツールです。MarpもReveal.js同様にスライド生成に特化しており、スライド毎に区切り記号(---)を使う方式です。

 Marpはシンプルで扱いやすい反面、レイアウトの凝った制御やスクリプト的処理はできません。その点QuarkdownはMarpの手軽さとLaTeX的な拡張性を兼ね備えた位置付けと言えます。

 例えば、複数段組やカスタムデザインの枠を使ったスライドを作りたい場合、MarpではCSSを自分で書く必要がありますが、Quarkdownなら.rowや.box関数でMarkdown内から実現できます。

Typst
 Typstは最近登場したLaTeX代替の組版システムで、Markdownライクな記法と組版コマンドで美しいPDFを作れる点が注目されています。Quarkdownとはアプローチが異なり、Typstは専用言語でレイアウトやスタイルを細かく指示する形ですが、QuarkdownはよりMarkdown寄りの文法です。

 機能的には両者ともプログラム可能な組版という共通点がありますが、TypstはPDF専用でスライド作成機能はありません。一方QuarkdownはスライドやWebにも対応します。

 表現力ではTypstも非常に強力で、数式や自動レイアウト機能がありますが、習得コストはQuarkdown(ほぼMarkdownそのまま)に比べると高めです。既存のMarkdown資産を活かしつつ高度化したいならQuarkdown、ゼロから新しい組版言語で最高品質のPDFを作り込みたいならTypst、といった使い分けになるでしょう。

Markdown拡張全般
 上記以外にも、AsciiDocやMDXなどMarkdownを拡張する文書フォーマットがあります。

AsciiDocはよりリッチな表現力を持つマークアップですが、静的構文が中心でプログラミング的な拡張はありません。

MDXはReactコンポーネントをJSX記法でMarkdownに埋め込む仕組みで、ウェブサイト向けですがブラウザ依存です。

 最後に付け加えると、Quarkdownはまだ若いプロジェクトであり今後機能追加や改善が活発に行われる可能性があります。「Markdownのゴリゴリ強化版」と呼ばれるだけあり、既に多くの機能が統合されていますが、その分学習コストもやや高くなります。

 しかし公式Wikiやドキュメント、コミュニティ(GitHub Discussionsなど)も整備されつつあるので、興味のある方はぜひ試してみてはいかがでしょうか。

 Markdownに「あともう一歩欲しい機能」を感じているユーザには、Quarkdownは理想的なパワフルツールとなるでしょう。


まとめ

 QuarkdownはMarkdownを基盤としながら、スライドやグラフ作成、動的変数や関数まで盛り込んだ「何でもできる拡張Markdown」といえます。単一ファイルからHTMLスライド・PDFドキュメント・ウェブ記事と用途に合わせて多彩なアウトプットを生み出し、複数ツールを連携させる手間を削減します。

 学習コストこそ初動で多少は必要ですが、Markdownユーザであれば比較的スムーズに取りかかることができるでしょう。コミュニティの拡大とともにプラグインやサンプルが充実すれば、さらに幅広い場面で利用されることが期待されます。

 ドキュメントを効率よく管理したいエンジニア、講義資料や研究論文の作成に時間を割いている学生・研究者、デザインに凝ったスライドをスマートに用意したいビジネスパーソン、こうした多くのユーザにとって、Quarkdownは次世代のドキュメント作成ツールとして十分に注目に値する存在です。


あとがき

 ここまでQuarkdownの概要と使い方、さらに他ツールとの比較や研究的意義についてお話ししました。統合的な文書環境を求めている方にとっては、強力な選択肢となる可能性があります。現時点では新興プロジェクトゆえドキュメント整備やコミュニティ面で発展途上ですが、その分伸びしろも大きいと言えるでしょう。ぜひ一度、試しに触れてみてはいかがでしょうか。

 本稿を通して得られたアイデアや知識が、あなたのビジネスに少しでも役立つことを願っています。もし、本稿が参考になったと感じていただけましたら、ぜひ「いいね」や「フォロー」をしていただけると励みになります。今後も実践的なノウハウや最新のAI最新動向を共有していきますので、引き続きお読みいただけると嬉しいです。


⚠️ 重要:ChatGPTを使いこなせる人は全体の3割以下
 なぜか?「質問力」の差です。
 実は、AIから10倍の価値を引き出す「問いの立て方」には科学的な法則があります。Googleが20%ルールで実証し、Amazonのベゾスも推奨する方法。全て『AI時代の最強スキル「好奇心力」』で公開中。
 AIが瞬時に「答え」を返す今、勝負の分かれ目は「問い」にある。その秘密と明日の仕事で使える13の実践ツールを凝縮した拙著『AI時代の最強スキル「好奇心力」』もぜひチェックしてみてください。


大規模言語モデルの仕組みを手を動かして完全理解

 本書は、PythonとPyTorchで実際にゼロからLLMを実装しながら、その内部構造を徹底的に理解できる実践的教科書です。トークナイザ作成から推論最適化まで段階的に解説し、研究・業務応用の土台を築けます。

 機械学習の第一人者Sebastian Raschka氏が、トランスフォーマーの基礎から、注意機構、学習アルゴリズムまで、段階的にわかりやすく解説。数式の羅列ではなく、動くコードを書きながら学べるため、エンジニアにとって最も効率的な学習が可能です。

 PythonとPyTorchの基礎知識があれば誰でも挑戦可能。「使うだけ」から「仕組みがわかる」エンジニアへステップアップ。AI時代の必須スキルを、確実に身につけられる決定版。生成AI開発に携わる全ての技術者におすすめします。


 本書は日本初のAIコードエディタCursor完全ガイド。基本操作から、ChatGPT連携、独自AIモデルの活用法まで、豊富なスクリーンショットで丁寧に解説。

 AIがコードを自動補完するだけでなく、あなたの意図を読み取り、バグを事前に指摘し、リファクタリングまで提案。まるで超優秀なペアプログラマーが24時間隣にいる感覚です。

 Cursorの全機能をハンズオン形式で網羅。実際のプロジェクトでの活用事例も収録。自動補完・デバッグ支援・チーム連携まで、開発フローが劇的に効率化します。Web制作者からエンジニアまで必携の一冊。


たった5行でコードが劇的に美しくなる魔法のルール

 「このコード、動くけど読みにくい…」そんな悩みを一瞬で解決する革命的手法がついに登場!本書が提唱する「5行ルール」は、どんなに複雑なコードも5行以内のメソッドに分割することで、驚くほど読みやすく、保守しやすいコードに生まれ変わらせます。

 理論だけでなく、実際のプロジェクトで頻出する「あるある」な汚いコードを、目の前でリファクタリング。Before/Afterの差分で「なぜ」を体得し、設計センスと読みやすさが劇的向上します。

 コードレビューで「美しい!」と言われたい、技術的負債に悩まされたくない、そんな全てのエンジニアへ。明日から使える実践テクニックが満載。あなたのコードが、チームの財産に変わります。



いいなと思ったら応援しよう!

コメント

コメントするには、 ログイン または 会員登録 をお願いします。
エンジニアを目指す社会人学生です。最新のAI論文をわかりやすく解説しています。発信は私自身の学習整理でもありますが、みなさんの理解の助けになれば嬉しいです。休日は愛犬と公園散歩が至福の時間です🐕
プログラム可能な文書作成ツール、Quarkdown詳解|らみ
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1