マニュアルはIndesignで作成しよう!

マニュアルを作成する時どのようなソフトを使用しているでしょうか?
illustratorで作成している方もおられると思うのですが、InDesignで作成するメリットと方法をご紹介したいと思います。

InDesignで作成するメリット

InDesignで作成するメリットとして下記があります。

・ノンブル(ページ番号)が自動で記入される
・タイトルに基づいた目次が自動で記載される
・タイトルなど同じパターンの装飾がある場合はあらかじめ記載される

これらのメリットがあることによって、マニュアルを変更・更新する際の労力がかなり改善されると思います。
InDesignを普段使わない方はイラレと少し使い勝手が異なるので違和感があると思うのですが、一度使い始めるとだんだんなれてくると思いますので一度試してみることをおすすめします。

まずはファイルの新規作成

まずは新規ファイルを作成します。
新規ファイルを作成するときInDesignの場合「レイアウトグリッド」と「マージン・段落」の2つがあります。
特徴は下記のとおりです。

レイアウトグリッド・・・小説やエッセイなど本のようにテキスト主体でレイアウトが決まっている場合に使用します。
マージン・段落・・・パンフレットやカタログなど自由にテキストや写真などを配置したい時に使います。

今回は「マージン・段落」で作成します。
「方向」や「綴じ方」「マージン」などは作成するマニュアルの内容によって決めます。

ページの追加方法

新規作成時にページ数を決めれるのですが、後で追加・削除したい場合はページパネルを右クリックするなどして行います。「ページ」に「8」を入れると8ページ追加されます。

①「ページパネル」を選択します。
②「ページパネル」を右クリックし「ページを挿入」をクリックします。
③追加したいページ数を入力し、OKをクリックします。

ノンブル(ページ番号)の追加方法

まずはページ番号が自動で入るように準備を進めます。

①ページパネルで「A-マスター」をダブルクリックします。
②文字ツールでノンブルを設置したいところに、テキストエリアを作成し「A」と入力します。
③「A」を選択した状態で「書式 > 特殊文字を入力 > マーカー > 現在のページ番号」を選択します。
右側も同様に作成します。
※イラレで言うところの「ポイント文字」はなく「エリア内文字」のみです。

ページに「A-マスター」が適用されているとページがノンブルが記載されます。
※適用されていない場合は、「A-マスター」をページパネルの中のページにドラッグします。もしくはページを選択し、右クリックで「マスターページを適用」をクリックします。

以上でノンブルが自動で割り振られるようになります。

同じパターンのページタイトルの追加方法

同じパターンのページタイトルなどがある場合は、下記のようにします。

①「ページパネル」を右クリックし「新規マスター(B-マスター)」を作成します。
②タイトルを追加します。
③文字の大きさなど設定したら、「段落スタイル」パネルから「新規スタイルを作成」をクリックします。名前を「ページタイトル」など分かりやすい名前に変更します。(後で一括で変更できるようになります。目次作成の際も使用します。)

④「A-マスター」を「B-マスター」にドラッグ&ドロップします。これで「B-マスター」だとノンブルとページタイトルが適用されます。

⑤変更したいページを選択し、右クリック「マスターページを適用」を選択し、「B-マスター」に変更します。

各ページ(B-マスター適用ページ)にタイトルが追加されたと思います。A-マスターも適用されているのでノンブルも追加されています。

タイトルを変更する際は、変更したいページで「shift + command」を押しながらクリックするとタイトルが変更できます。
(そのままクリックしても何も反応がありません)

目次の作成方法

目次もあらかじめ用意しておくと、タイトルに合わせて自動で反映することができます。

①目次ページで長方形ツールで、図形を作成します。
②「レイアウト > 目次」を選択します。

③「目次スタイル」で「段落スタイル」で作成した「ページタイトル」を選択・追加します。
OKをクリックし、①の図形をクリックすると目次が追加されます。

④文字の大きさや色などを調整し、新しく段落スタイル「目次」を追加します。
追加した段落スタイル「目次」をダブルクリックします。
⑤段落スタイルを編集します。「タブ」を選択し、適当な位置(少し右側)にタブを追加し、リーダーに「・」を記入します。
OKをクリックします。

⑥目次とページ番号の間に「・・・」を追加する場合、文字の大きさや色などを調整し、
新しく文字スタイル「目次の点」を追加します。
※「段落スタイル」ではなく「文字スタイル」ということに注意してください。

下記画像のようになったと思います。

次に目次のスタイルを編集します。
「レイアウト > 目次スタイル > 編集」をクリックします。

⑥項目のスタイルを③で作成した「目次」に変更します。
⑦項目と番号間を「^y」に変更し、スタイルを⑥で作成した「目次の点」に変更します。

⑧OKをクリックします。
最後に目次の記載されている図形を選択し、「レイアウト > 目次の更新」をクリックすると変更が反映されているかと思います。

新たにページを追加して目次を変更したい場合は、同様に「レイアウト > 目次の更新」をクリックすると変更が目次に反映されます。

途中から1ページ目にする

表紙を最初に持ってきて、その次から1ページ目にする場合は下記のようにします。

①「ページパネル」のページを開始したい箇所で右クリックし、「ページ番号とセクションの設定」をクリックします。
②「ページ番号割り当て開始」を選択し「1」にしてOKをクリックします。

最後に

マニュアルを作成する際のInDesignの便利な機能をご紹介させていただきました。
慣れないうちは、ややこしいかもしれませんがこれらの方法を使うとマニュアルの更新や変更をする時の手間が大きく改善されると思います。
長くなりましたが最後まで読んでいただきありがとうございました。

[Solr]同じ内容のドキュメントの重複を防ぐ(De-Duplication)

はじめに

Solrでは基本的にIDフィールドの値でドキュメントを区別しているため、IDが異なれば同じ内容のドキュメントでも別々にインデックスされます。同じ内容のドキュメントの重複を防ぎたい場合はDe-Duplicationの機能を利用します。

De-Duplication の設定

De-Duplication を利用するためには、updateRequestProcessorChain に SignatureUpdateProcessor を組み込みます。

ここでは例として大阪の施設情報を利用します。以下のような文書構造になっています。

[
  {
    "id": "官公庁!1",
    "type": "官公庁",
    "area": "住之江区",
    "name": "軽自動車検査協会大阪主管事務所",
    "address": "住之江区南港東3-4-62"
  }
]

solrconfig.xml に以下を追加します。

   <updateRequestProcessorChain name="dedupe">
     <processor class="solr.processor.SignatureUpdateProcessorFactory">
       <bool name="enabled">true</bool>
       <str name="signatureField">signature</str>
       <bool name="overwriteDupes">true</bool>
       <str name="fields">type,name</str>
       <str name="signatureClass">solr.processor.Lookup3Signature</str>
     </processor>
     <processor class="solr.LogUpdateProcessorFactory" />
     <processor class="solr.RunUpdateProcessorFactory" />
   </updateRequestProcessorChain>
  <requestHandler name="/update" class="solr.UpdateRequestHandler" >
    <lst name="defaults">
      <str name="update.chain">dedupe</str>
    </lst>
  </requestHandler>

SignatureUpdateProcessor は、指定されたフィールドのハッシュ値を計算して一致すれば同一ドキュメントとみなすという動きになります。以下の3種類から選んで signatureClass プロパティで指定します。

  • MD5Signature
    • 128ビットのハッシュ
  • Lookup3Signature
    • 64ビットのハッシュ。MD5Signatureよりも高速
  • TextProfileSignature
    • 多少の曖昧さを許す

fieldsプロパティで、どのフィールドが同じなら同一のドキュメントとみなすかを指定します。
上の例では type と name が同一なら同じドキュメントとしました。

signatureField はハッシュ値を格納するフィールドを指定するものです。

overwriteDupes をtrue に設定すると、ドキュメントが同一と判定された場合に新しい方で古い方を上書きします。

実行例

上記の設定をした状態で以下のドキュメントをインデックスします。

[
  {
    "id": "官公庁!1",
    "type": "官公庁",
    "area": "住之江区",
    "name": "軽自動車検査協会大阪主管事務所",
    "address": "住之江区南港東3-4-62"
  }
]

検索結果は以下の通りです。signature フィールドが自動的に付与されています。

{
  "response":{"numFound":1,"start":0,"numFoundExact":true,"docs":[
      {
        "id":"官公庁!1",
        "type":"官公庁",
        "area":"住之江区",
        "name":"軽自動車検査協会大阪主管事務所",
        "address":"住之江区南港東3-4-62",
        "signature":"e3e630e5c046e6d3",
        "_version_":1701175515816132608}]
  }}

次に以下のドキュメントをインデックスします。名前と種別は同じで住所が変更になったという設定です。

[
  {
    "id": "官公庁!2",
    "type": "官公庁",
    "area": "港区",
    "name": "軽自動車検査協会大阪主管事務所",
    "address": "港区築港4-10-3"
  }
]

2番目のドキュメントをインデックスした後の検索結果は以下の通りです。

{
  "response":{"numFound":1,"start":0,"numFoundExact":true,"docs":[
      {
        "id":"官公庁!2",
        "type":"官公庁",
        "area":"港区",
        "name":"軽自動車検査協会大阪主管事務所",
        "address":"港区築港4-10-3",
        "signature":"e3e630e5c046e6d3",
        "_version_":1701175675284619264}]
  }}

期待通り上書きされています。idも新しいものになっています。

ちなみに、overwriteDupes = false で設定した場合には以下のようになりました。

{
  "response":{"numFound":2,"start":0,"numFoundExact":true,"docs":[
      {
        "id":"官公庁!1",
        "type":"官公庁",
        "area":"住之江区",
        "name":"軽自動車検査協会大阪主管事務所",
        "address":"住之江区南港東3-4-62",
        "signature":"e3e630e5c046e6d3",
        "_version_":1701175515816132608},
      {
        "id":"官公庁!2",
        "type":"官公庁",
        "area":"港区",
        "name":"軽自動車検査協会大阪主管事務所",
        "address":"港区築港4-10-3",
        "signature":"e3e630e5c046e6d3",
        "_version_":1701175519813304320}]
  }}

「上書きしない」というのは古い方のドキュメントがそのまま残るのかと思っていましたが、同じシグネチャのドキュメントが重複してインデックスされるということでした。

継続は力なり

本年もよろしくお願いいたします!
寒くてハクキンカイロが手放せません、マエダです。

リモートワークも板についてきてSlack上でみんなの書き初め(ボールペンでもデジタルでも可)発表会をしました。

昨年の書き初め記事はこちら。

初心忘るべからず

今年の僕の書き初めはこちら。

「継続」ってかんたんそうで一番むずかしいことだなって常々思います。
だって、にんげんだもの。

昨年の書き初めブログに書いた「初心」を忘れないことを継続します。
一昨年の書き初めブログに書いた「チャレンジすること」を継続します。
さらに前年ブログに書いた「感謝」の気持ちを持って気を引き締めて取り組ませていただくことを継続します。

スプラウトのミッションステートメントは「とりあえず、やってみよう」。※1
ビジョン実現まで諦めずに継続します。
今年も頑張ります!!!

サステナブル。



※ 1「THE VIRGIN WAY」をリスペクトさせていただいております。

Laravel APIがアクセスできなくなるとき

筋肉をバキバキにしてもコロナ禍だと海にいく予定がありませんよね〜。(そもそもぷよぷよ)
マエダです。

みんな大好きPHP LaravelでAPIを開発した際に急にアクセスできなくなることがありました。
これはLaravelが「429 (Too many requests)」のエラーを出していたためでした。

なぜこのエラーが発生するかと調査したところ1ThrottleRequestsという機能、スロットル、つまりリクエストの絞り機能がLaravelにはあり、デフォルトで1分間に同一IPアドレス・同一ドメインに対して60リクエストとなるように設定されていたためでした。

app/Http/Kernel.php

protected $middlewareGroups = [
'web' => [

],
'api' => [

'throttle:60,1',
],
];

1分間60リクエストを緩和するか、コメントアウトして制限しないようにするとエラーは解消されます。
そもそも制限にかからないようリクエスト回数を減らすことができないか見直すことが重要です。

みんな大好きAWSにて、ELB + EC2なシステム構成ではIPアドレスについても考慮が必要です。
ThrottleRequestsは、上述の通りで同一IPアドレスを以下のようにハッシュ値でカウントアップしています。

sha1($route->getDomain().'|'.$request->ip())

そのため正しくLaravelでIPアドレスが確認できること($request->ip())が必要です。
Nginx + php-fpmの構成などではNginxで以下設定をしましょう。

/etc/nginx/conf.d/realip.conf

set_real_ip_from 172.30.0.0/16; # ELBのIPアドレス
real_ip_header X-Forwarded-For;

※ 設定変更後は、設定反映のためNginxをreloadしましょう。

Nginxの設定は弊社メンバーの以下記事も参照してみてください。

知らないと損をするNginx設定