投稿日:

一般的な日本の名刺(縦向き)を作った時の作業ログ。

確認環境

Windows 11 Pro環境下の、以下のバージョンで確認。

  • Inkscape 1.3.2 (091e20e, 2023-11-25, custom)
  • Inkscape 1.4.3 (0d15f75, 2025-12-25)

手順

1. Inkscapeを起動し、テンプレートから名刺を選ぶ

印刷→名刺を選択。

サイズ選択ダイアログが出るので91x55mm (日本)を選ぶ。

2. 制作画面に遷移し、基本設定を行う

制作画面に遷移したら、ファイル→ドキュメントのプロパティを開く。

枠→影を表示をOFFにし、方向を縦にする。

3. 外枠を作る

矩形ツールで用紙ぴったりの矩形を作る。

矩形を選択したままメニューからオブジェクトを開き、オブジェクトをガイドにする。

これによって外枠に背景などを吸着できる状態になる。

4. 余白を作る

一般的に紙の縁スレスレまで文字を入れないので余白を作る。

矩形ツールで矩形を書き、外周5mmを余白にするため、上部のバーから矩形のサイズを50x86mmにし、右の整列と配置からページ基準で上下左右中央寄せに配置する。

外枠を作った時と同様に、矩形を選択したままメニューからオブジェクトを開き、オブジェクトをガイドにする。

ここまですると作業ベースができる。

5. 名刺本体を作る

ここまで出来たら後は名刺本体を作るだけなのでいい感じに作っていけばよい。

6. 名刺を印刷できる状態にする

右パネルのエクスポートタブを開き、PDFに設定する。

歯車ボタンをクリックし、テキストをパスに変換にチェックを入れる。

エクスポートボタンを押すとPDFが出てくるので、これを印刷するなり、名刺屋に持っていけばよい。

7. 作業ファイルの保存

作業ファイルはInkscape SVGとして保存できるが、一般的にブラウザが扱うSVGとの互換性はないため、ブラウザで開くと崩れることがある。

またInkspace上のレイヤーデータなどが保持されていて極めて冗長であるため、Web用に使う場合、中身を適当にいじってゴミを消したほうが良い。

トラブルシュート

絵文字に色がつかない

Inkscapeでは絵文字の色はサポートされていないようなので、SVGの絵文字を入手する必要がある。

Windowsの絵文字を使う方法

Windows標準の絵文字を使う場合、Character Map UWPというツールを使うことで取り出すことができる。

まずはインストールし、起動したら、フォント一覧からSegoe UI Emojiを選び文字コードで検索するなどし、絵文字を見つける。

次に右下の保存ボタンから「Save as SVG Image」の「Colored Glyph」を選ぶとSVGで出力される。

Googleの絵文字を使う方法

noto-emojiから文字コードでSVGを当てて拾ってくれば取得できる。

SVGの拾い方としてはLet's EMOJI辺りで使いたい絵文字を探してきて、文字コードで引っ掛けたら簡単に見つかる。

この二つの絵文字はライセンス上、ノークレジットで印刷利用が可能

フォントなのでライセンスが心配だが、noto-emojiであれば特に何も考えなくてよい。これは、noto-emojiがSIL Open Font License, version 1.1を採用しているため、クレジットの表記が不要であるためだ。

Segoe UI Emojiの場合も印刷に使う分には問題なさそうに見えるので大丈夫だろう。Claude Opus 4.6も大丈夫だと言っていたので、きっと大丈夫なはずだ。(まさかMSのライセンス条項でハルシネーションは起こさないだろう)

Microsoft supplied font. You may use this font to create, display and print content as permitted by the license terms, or terms of use, of the Microsoft product, service or content in which this font was included. You may only (i) embed this font in content as permitted by the embedding restrictions included in this font; and (ii) temporarily download this font to a printer or other output device to help print content. Any other use is prohibited.

openmojitwemojiはCC BY-SA 4.0やMIT、LGPL v3.0なので、クレジット表記が必須であり、名刺には向かないと思う。少なくともopenmojiにはクレジットの記載が明確に求められている

macOSでPDFを開いたときに絵文字の見た目が変わる

絵文字を文字ではなく、SVGとして入れれば解決する。

文字として絵文字を入れている場合に、Windows環境ではフォント埋め込みでPDF出力すると色付きの絵文字が出るので、一見これでよさそうに見えるが、macOSで開くと絵文字の形が変わってしまうので、SVGで埋め込む必要がある。

文字としての絵文字を「テキストをパスに変換」で出力すると白黒になるため、絵文字を本来の形かつ、色付きにしたい場合はSVGファイルを埋め込むのが最も無難と思われる。

どうしてもWindowsの絵文字を使いたい場合、グリフを抜いて自分で着色するか、模写するかになると思う。手軽な手段では超拡大したスクショを撮って縮小してごまかすのが無難だとは思うが、印刷時の品質は微妙になると思う。

ラスタイメージに角丸を付けたい

Inkscapeでオブジェクトをクリッピングする(角丸を付けたり、切り抜く)を参照のこと。

あとがき

今回はこれまでHTMLで作っていた名刺を、ある程度ちゃんとした環境で作ってみようということでInkscapeを使った挑戦をしてみたが、結果としてまぁまぁよかった気はする。まだ入稿してないのでアレだが…。

内容としては、今使っている個人用の名刺にはXやGitHubのこと、自分のスキルを書いているのだが、Xを使わなくなったことや、個人事業主でもないのにスキルを書いてもなぁ…?という部分や、名前やアイコンをもう少し大きくして目立たせたいなどがあり、今回作り直すことにした。

結果として、前よりは何が言いたいのかがわかる内容になったと思うし、名前とアイコンの主張度も上げられたと思う。そして今回はQRコードの変更もしたため、こないだ作ったQRコードジェネレーターも早速活躍してくれてよかった。というか、こいつはそのために作った部分が大きい。

これまでの名刺 今回作った名刺
今までの名刺
今回作った名刺

没にした名刺

おまけで、絵文字選定で最初Windowsの絵文字を使う方法が見つけられず、noto-emojiで作った時の名刺も没案として残しておく。

投稿日:

この記事ではラスタ画像に角丸を付ける方法について説明するが、切り抜くということであれば、その他も多分同じ要領でできる。

確認環境

Windows 11 Pro環境下の、以下のバージョンで確認。

  • Inkscape 1.3.2 (091e20e, 2023-11-25, custom)
  • Inkscape 1.4.3 (0d15f75, 2025-12-25)

やり方

  1. 切り抜きたい画像を配置する
  2. 切り抜きたい画像と同一サイズの矩形オブジェクトを重ねて配置する
  3. 矩形ツール状態で矩形オブジェクトを選択し、垂直半径を入力して角丸を付ける
  4. メニューからオブジェクト→クリップを設定
  5. 画像がクリッピングされる

元に戻す場合は、クリップを解除すれば元に戻る。

関連記事

最近二つほどツールを作り、Webツール置き場に配置したので、そこで得た学びや、作る時に意識したことについても書いてゆく。

ENV Checker

まずENV Checkerを作った話。

端的に言うとCyberSyndrome : ENV Checker - 環境変数チェッカーのパクリである。但しJSがないと動かない。

違いとしてはCyberSyndrome側で見れる情報のうち、ユーザー環境に起因しない情報を大幅に削り、ユーザー環境をメインに出せるようにしているほか、IPv4とIPv6の表示にも対応している。

作りとしては必要な情報を返すAPIを3つ用意し、ページを表示したときにJSがそれぞれを叩きに行き、その結果を表示している。

Get Enviroment APIはIPアドレス以外の環境変数を返却するもので、Get IPv4 APIはIPv4アドレスとホスト名、Get IPv6 APIはIPv6アドレスを返すように作ってある。

なぜこの様な分け方にしたかというと、Get Enviroment APIはIPのバージョンを問わない情報しか返さないが、IPアドレスまで返すようにするとIPv4に付随する情報やIPv6アドレスを返すことになるため処理が煩雑になる。

これは実装としてはCGIの環境変数をそのまま返しているのでREMOTE_ADDRに:が含まれているかどうかを見てIPv4か、IPv6かを振り分ける処理が必要になるからだ。

一方でGet Enviroment APIが環境変数だけを返すことに専念できるのならば、IPv4に付随する情報はGet IPv4 APIを叩けば取れるし、IPv6はGet IPv6 APIを叩けば取れるため、分岐処理が不要になる。

これによって各APIは単一の責務だけを持つことになり、コードの複雑化を回避できるといった寸法だ。この程度のシンプルな実装に求めることではないし、現状では無価値ではあるのだが、常日頃から意識することで、より複雑なものを作る時にも生かせるだろうし、将来何か改修するときにも作りが単純なほうが理解しやすいと思うので、こうしている。

IPv4とIPv6のAPIをどう分けているかというと、これはDNSレベルで解決している。Get IPv4 APIのエンドポイントにはAレコードのみを、Get IPv6 APIのエンドポイントにはAAAAレコードのみを設定することで、クライアントが接続する際に使用するIPバージョンを強制している。

こうすることで、各APIは単純にREMOTE_ADDRをそのまま返すだけでよくなり、IPバージョンの判定ロジックを一切持たなくて済むのが利点だ。欠点としてはAPIの数が一つ増えるため、管理コストは増えているといえるだろう。しかし分岐ロジックというのは往々にしてバグを生む存在であり、ないに越したことはないと思い、こういう設計にした。

また画面の描画をJavaScriptにさせているのも、こういったいわゆる関心の分離の思想によるところが大きい。やろうと思えばIPアドレス以外はCGIで表示して、IPアドレスのところだけをJSで書き換えることも、当然できる。出来るのだが、責務を分けるにはデータを返すだけのエンドポイントと、それを受けてJSで書き換える手法のほうが、より責務がはっきりしていて、わかりやすいのでこうしている。疎結合ということでもある。

項目値をダブルクリック・タップすることで値をコピーできるようにしているのも、地味だがこだわりポイントだ。

余談だが、先日Value-DomainでcertbotのDNS Challengeをやるスクリプトを書き直したのは、このドメインにTLS証明書を付与したり、DDNSできるようにする目的があったのが大きい。

というのも、このENV Checkerの開発にはipv4.lycolia.infoipv6.lycolia.infoというドメインが関係しており、私の自宅サーバーの環境はIPv4がコロコロ変わるためDDNSが必須だった。

私が利用しているDNSレジストラであるValue-DomainはDDNS用のエンドポイントがあるのだが、1回1ドメインしか更新できず、60秒に1度しか叩けないという制約があり、これを回避するためには、Value-DomainのDNS APIに対して、一回で複数ドメインのAレコードを書き換える必要があった。

また同時に、以前使っていた、TLS証明書更新ツールである、value-domain-dns-cert-register (vddcr)はNode.jsのアップデートなどに伴う頻繁なメンテナンスが必要だったり、動作検証不足があったり、様々な面倒ごとがあり、これ以上触りたくなかった

そんなこんなの流れがあり、ENV Checkerを作る中でOpenWrtからValue-Domainに複数サブドメインのDDNSを行うツールを作ったり、新たなTLS証明書更新ツールを作り、その検証をしたりしたのだ。

QRコードジェネレーター

もう一つはQRコードジェネレーターを作った話。

QRコードジェネレーターなどググれば無数に出てくるわけだが、意外と読み取り可能な最小サイズかつ、それをSVGで出力できるものを見つけることができなかった。そこで作ることにした。

とはいえ、作ったのはフロントエンドだけで、QRコードの生成自体はqrcode-svgを使わせてもらっている。これはこのライブラリのデモサイトで、理想の要件のものが作れることが分かったからだ。

なぜデモサイトで使えるのに、わざわざ作ったかだが、まずこのデモサイトでは最小サイズのQRコードを簡単に得ることが困難だったほか、256px以下のサイズにすることが想定されていないように見えたからだ。少なくともUIをクリックしてDIMENSIONを256px未満にしようとしても出来なかった。

また、デモサイトはいつか消える可能性もあるし、ブックマークするのも面倒なので、自分でホスティング出来るなら、それをするに越したことはなかったというのもある。

これを作っている中で得た学びとしては、カラーパレットの入力UIがWeb標準で可能になっていたことだ。そこら中で見かけるし標準であるんちゃうか?と調べたらあったので採用した。こういう複雑なものは昔であれば恐らく何かしらのライブラリを使うか、気合で作る必要があったと思うが、全く世の中は便利になったものだ。

また、こちらの実装方法については、HTMLの標準機能でカラーパレットを使ったカラーコード入力UIを作る方法の記事で紹介している。

他にもQRコードの周りには余白が必要ということも知れた。QRコードの開発元であるデンソーウェーブでは余白の求め方の計算式が解説されている。仕様上は適切な余白がない場合、読み込めない可能性があるようだ。これは恐らく周囲の図形とQRコード本体を光学的に分けて認識させるために必要なのだと思う。

なお、今回作成したQRコードジェネレーターには余白の自動調整機能は実装していない。理由は単純でサイズを自由に変えられる仕様上、帳尻をつけるのが面倒だからだ。要は手抜きである。

ついでにWebツール置き場の保守性や解りやすさを少し上げたりした

Webツール置き場のドメイン配下は元々全てペラのHTMLで実装していたのだが、ページが増えるごとに共通部分のhead要素の管理が煩雑になっていた。そこで、PHPに置き換えることにした。

結果として、以下のように、head要素の中身を共通化することができた。

まぁやっていることとしては高校時代にPHPで静的HTMLの内容を共通化していたのと何ら変わらないので、何故今更そんなことを…という感じだが、元々は静的HTMLで済むものは静的HTMLのほうが表示速度が速くシンプルでよいよなという意図で、静的HTMLにしていたのだが、数が増えてくるとそうも言ってられないということで対応した形だ。こういうのは事前に考慮しすぎると、早すぎる共通化やKISSの法則的なリスクを孕むと思っていて、定期的に振り返り、都度対応するほうが良いと感じている。いや、この程度の内容でそこまで考える必要はないと思うが…w

 <!DOCTYPE html>
 <html lang="ja">
 <head>
-  <meta charset='utf-8'>
-  <meta http-equiv='X-UA-Compatible' content='IE=edge'>
-  <title>Slackのリマインダーコマンドを作るやつ</title>
-  <meta name="referrer" content="no-referrer-when-downgrade"/>
-  <meta name="viewport" content="width=device-width, initial-scale=1">
-  <meta name="author" content="Lycolia Rizzim">
-  <meta property="og:image" content="https://tool.lycolia.info/slack-remider-creator/OGP.png">
-  <meta property="og:site_name" content="Lycolia">
-  <meta property="og:title" content="Slackのリマインダーコマンドを作るやつ">
-  <meta property="og:description" content="必要事項を埋めることでSlackの/remindコマンドを生成するやつ">
-  <meta property="og:type" content="website">
-  <meta property="og:image" content="https://tool.lycolia.info/slack-remider-creator/OGP.png">
-  <link rel="stylesheet" href="style.css">
-  <script src="check.js"></script>
-  <!-- Matomo -->
-  <script>
-    var _paq = window._paq = window._paq || [];
-    /* tracker methods like "setCustomDimension" should be called before "trackPageView" */
-    _paq.push(['trackPageView']);
-    _paq.push(['enableLinkTracking']);
-    (function() {
-      var u="https://analytics.lycolia.info/";
-      _paq.push(['setTrackerUrl', u+'matomo.php']);
-      _paq.push(['setSiteId', '3']);
-      _paq.push(['enableHeartBeatTimer', 10]);
-      var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
-      g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
-    })();
-  </script>
-  <!-- End Matomo Code -->
+<?php
+require_once('../template.php');
+
+renderCommonHead(
+  thumbnail: 'https://tool.lycolia.info/slack-remider-creator/OGP.png',
+  title: 'Slackのリマインダーコマンドを作るやつ',
+  description: '必要事項を埋めることでSlackの/remindコマンドを生成するやつ'
+);
+?>
 </head>

template.phpの中身

関心ごとに関数を切り分け、呼び出される側は呼び出す側に依存するように設計することで、親が子の変更に引きずられないように保守性を意識した設計にしている。他にもほとんど固定値であるものについては運用を平易にする観点からOptional化して、初期値を設定している。

<?php

function buildMatomo() {
    return <<<END
  <script>
    var _paq = window._paq = window._paq || [];
    /* tracker methods like "setCustomDimension" should be called before "trackPageView" */
    _paq.push(['trackPageView']);
    _paq.push(['enableLinkTracking']);
    (function() {
      var u="https://analytics.lycolia.info/";
      _paq.push(['setTrackerUrl', u+'matomo.php']);
      _paq.push(['setSiteId', '3']);
      _paq.push(['enableHeartBeatTimer', 10]);
      var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
      g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
    })();
  </script>

END;
}

function buildCommonMeta(string $title, string $thumbnail) {
    return <<<END
  <meta charset='utf-8'>
  <meta http-equiv='X-UA-Compatible' content='IE=edge'>
  <title>$title</title>
  <meta name="referrer" content="no-referrer-when-downgrade"/>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="author" content="Lycolia Rizzim">
  <meta name="thumbnail" content="$thumbnail">
  <link rel="icon" href="https://lycolia.info/assets/brands/lycolia-32x32.png" sizes="32x32">
  <link rel="icon" href="https://lycolia.info/assets/brands/lycolia-192x192.png" sizes="192x192">
  <link rel="apple-touch-icon" href="https://lycolia.info/assets/brands/lycolia-180x180.png">

END;
}

function buildOG(
    ?string $thumbnail,
    ?string $site_name,
    ?string $title,
    ?string $description,
    ?string $type
) {
    $tags = "  <meta property=\"og:type\" content=\"$type\">\n";
    $tags .= "  <meta property=\"og:site_name\" content=\"$site_name\">\n";

    if ($thumbnail !== null) {
        $tags .= "  <meta property=\"og:image\" content=\"$thumbnail\">\n";
    }
    if ($title !== null) {
        $tags .= "  <meta property=\"og:title\" content=\"$title\">\n";
    }
    if ($description !== null) {
        $tags .= "  <meta property=\"og:description\" content=\"$description\">\n";
    }

    return $tags;
}



function renderCommonHead(
    ?string $thumbnail = 'https://lycolia.info/assets/brands/lycolia-OGP.png',
    ?string $site_name = 'Lycolia.info',
    ?string $title = null,
    ?string $description = null,
    ?string $type = 'website'
) {
  $head = buildCommonMeta($title, $thumbnail);
  $head .= buildOG(
    thumbnail: $thumbnail,
    site_name: $site_name,
    title: $title,
    description: $description,
    type: $type
  );
  $head .= buildMatomo();

  echo $head;
}

また他にも、ドメイン直下にあるページの構造を見直した。

具体的にはulとliでリストにしていた部分をdl dt ddに直し、各ツールの内容を少し解りやすくした。ただ余りにも見た目が殺風景すぎるので、liに戻してカードUIをはめ込むようにするかもしれない。

変更前 変更後
投稿日:

なんかこんな感じのやつの作り方。

内容

左側にあるカラーパレットを出すボタンはinput type="color"で実現できるので、単純なカラー入力だけならこれでも構わない。現時点ではAndroid版Firefoxを除き、主要ブラウザは

ただ、コードも欲しいことが往々だと思うので、その場合は横にinput type="text"を生やして、次に示すサンプルコードのように双方の入力値をバインディングしてやればよい。

サンプルコード

動きはデモページで確認できる。

<input id="palette" type="color">
<input id="code" type="text">
<script>
  const getInput = () => {
    return {
      palette: document.getElementById('palette'),
      code: document.getElementById('code')
    };
  };

  const registerHandlers = (paletteEl, codeEl) => {
    paletteEl.addEventListener('input', (e) => {
      codeEl.value = e.target.value;
    });
    codeEl.addEventListener('input', (e) => {
      paletteEl.value = e.target.value;
    });
  };

  window.addEventListener('DOMContentLoaded', () => {
    const input = getInput();
    registerHandlers(input.palette, input.code);
  });
</script>

Safariでも表示できるが見た目がだいぶ異なる

PC Safari 18.2とiOS 26.3のSafariで確認した見た目。

一行目が初期表示、二行目がカラーパレット展開表示。iOS Safariの方は素の状態だとUIが小さすぎて見えないので、かなり拡大して表示している。

PC Safari iOS Safari
PC Safari初期表示
iOS Safari初期表示
PC Safariカラーパレット展開表示
iOS Safariカラーパレット展開表示
更新日:
投稿日:

いい感じのオフィスチェアが欲しいや、ゲーミングチェアなどの調査をしてきたまとめで椅子探しをしていたが、いったん区切りがついたのそのことについて書く。端的に言うと椅子を修理する当てを見つけたので、修理することに掛けてみることにした。

現状の椅子と修理について

まず座面の状態は急速に劣化しており、椅子のフレームから脱落しかかるほどになっていた。これは単にここ最近変な座り方をしているせいなのだが、なってしまったものはどうしようもない。

しかしニトリではもう売ってないし、修理依頼は断られるし、どうしようもなかった。

そこでどうにかならないかと調べていたら、革製品の修理を専門とする革研究所 神戸店というお店を発見した。

椅子の修理実績もあったため、早速声をかけてみたところ最大五万程度で修理できるだろうという見積もりが出たので依頼してみることにした。

しかし、現在は先客で埋まっているので、現物確認と作業可否判断は来月以降という話になった。何はともあれ、いったんこの椅子を使い続けられそうな光明が見えたのはありがたい。

とはいえ、この状態の椅子を使い続けるのは難しく、現物確認までの間や修理中に使える椅子は必要だったので、追加で椅子探しをすることにした。

新たに見てきた椅子

前回、ゲーミングチェアなどの調査をしてきたまとめでゲーミングチェアは不適当だろうということになったので、オフィスチェアを見ることにした。

家具屋を探しつくしている中、どこに行けば椅子があるだろう?と考えた時に思い付いたのがホームセンターだ。

LIFELEX ラウンドキャスターチェア パドリア

コーナン 灘大石川店にて確認。

項目 詳細 備考
座面高 43-55cm かなり座面を高くできる
素材 PUレザー
あぐら × 座面が狭すぎる
価格 4,378円 非常に安価
  • 座り心地は悪くない

LIFELEX ゆったりレザー調チェア ニネヴェ

コーナン 灘大石川店にて確認。

項目 詳細 備考
座面高 44-54cm かなり座面を高くできる
素材 PUレザー+塩化ビニル
あぐら
価格 16,280円 やや高め
  • 見た目に反してクッションが硬く、尻が痛くなる
  • 肘当てを跳ねあげることができ、胡坐をかくことに支障がなく、座高を上げたまま机の下に入れるのも容易
  • 手前より奥のほうが低く、ややふんぞり返る形になるため、作業向きではない

LIFELEX アンティークチェア クラロスII

コーナン 魚崎店にて確認。

項目 詳細 備考
座面高 45-53cm
素材 PUレザー
あぐら × 肘当てが邪魔
価格 10,780円
  • 座り心地が良い

最終的に買った椅子

最終的にはLIFELEX ゆったりレザー調チェア ニネヴェを買うことにした。

座り心地だけを見ればLIFELEX アンティークチェア クラロスIIが一番よく、価格も安いからこれにしたかったが、肘置きの高さが机と衝突する高さだったため、値は張るが肘当てを跳ね上げることができるため、こちらを購入した。

この椅子は16,280円とやや高いが、それでもニトリのOC520と比べれば安価で、椅子の修理中にさえ使えるなら問題ないと判断した。

背中が群れるし、尻は痛いし、イマイチだが、価格からすれば及第点だ。せめてニトリのOC115 PVCの座高がもう少し高ければこちらにしたかったのだが、仕方ない。