2009年3月アーカイブ



Delphi 2009 handbook

著者:Marco Cantu

訳者:藤井 等

監修 エンバカデロ・テクノロジーズ

発行日:2009年4月

発行者:カットシステム

463ページ

5,000円+税

 

内容

Delphi最新プログラミングエッセンス

プログラム開発ソフトウェア「CodeGear Delphi 2009」についての書籍です。

本書では、Delphiによるプログラミング、Object Pascal言語やVisual Component Libraryの基礎には触れておらず、Delphi 2009 for Win32の各領域の新機能にターゲット絞り説明しています。

Delphi 2009のUnicodeサポート、ジェネリクスや無名メソッドなどの新しい言語機能、IDEの改善、ランタイムライブラリの新しいクラス、VCLの新しいコンポーネント(リボンコントロールなど)、そして、データベースアーキテクチャとDataSnap多層テクノロジーの拡張などに触れています。

理論を説明しつつも、多くのサンプルを紹介しており、それらをダウンロードして、自分自身で動作させてみることができます。Delphi 2009を持っていない場合には、トライアル版をダウンロードしたり、ビデオシリーズで、実際にプログラムが動作するのを見ていただくこともできます。

 

第I部 Unicode

  • 第1章 Unicodeとは?
    • 従来からの文字コード:ASCIIからISOエンコーディング
    • Unicode:世界中の文字に対応
    • Win32でのUnicode
    • 次は?

 

  • 第2章 UnicodeString型
    • AnsiCharからWideCharへ
    • 新しいCharacterユニット
    • StringとUnicodeStringについて
    • さまざまな文字列型
    • 文字列変換
    • 文字列および文字リテラル
    • ストリームとエンコーディング
    • UnicodeとVCL
    • 次は?

 

  • 第3章 Unicodeへのポーティング
    • 失敗するChar操作
    • 失敗する文字列操作、パフォーマンス低下する文字列操作
    • Unicode文字列とWin32
    • PCharとポインタ演算
    • 次は?

 

第II部 Delphi 2009とそのコンパイラ

  • 第4章 IDEの新機能
    • インストールと実行
    • Delphiプロジェクトの管理
    • プロジェクトマネージャ
    • IDEでのリソース管理
    • Delphiクラスエクスプローラ
    • エディタの新機能
    • デバッガ
    • 次は?

 

  • 第5章 ジェネリクス
    • ジェネリックKey-Valueペア
    • Delphiにおけるジェネリクス
    • ジェネリック制約
    • 既定のジェネリックコンテナ
    • ジェネリックインターフェイス
    • Delphiのスマートポインタ
    • 次は?

 

  • 第6章 無名メソッド
    • 無名メソッドの構文と意味
    • ローカル変数の使用
    • 無名メソッドの詳細
    • 無名メソッドの実際の利用
    • 次は?

 

  • 第7章 その他の言語およびRTLの変更
    • その他の言語新機能
    • TObjectの新しいメソッド
    • スレッドサポートにおける変更
    • 文字列の構築
    • ReaderおよびWriterの使用
    • 例外の強化
    • 新しいユニットと新しいRTLクラスのまとめ
    • 次は?

 

第III部 VCLとデータベース

  • 第8章 VCLの改善
    • VCLコアの改善
    • 標準コンポーネントの強化
    • コモンコントロールのアップデート
    • ネイティブVCLコンポーネント
    • Vistaサポートの拡張
    • 次は?

 

  • 第9章 Delphi 2009におけるCOMサポート
    • IDL、タイプライブラリ、RIDL
    • RIDL形式(COMサーバー)
    • 新しい「登録済みのタイプライブラリ」ペイン
    • COMとUnicode
    • 復活した機能:アクティブフォーム
    • 次は?

 

  • 第10章 リボンコントロール
    • Fluent User Interfaceの紹介
    • アクションとリボン
    • Ribbonコンポーネント
    • データベースアプリケーションでのリボン
    • 画面のヒント(ScreenTips)を使う
    • 次は?

 

  • 第11章 データセットとdbExpress
    • UnicodeのClientDataSet
    • データセットにおけるUnicode--テイク2
    • データセットのその他の強化
    • データセットの内部構造
    • Delphi 2009におけるdbExpress
    • データ対応コントロール
    • 次は?

 

  • 第12章 DataSnap 2009
    • 最初のDataSnap 2009デモの作成
    • 非データベースDataSnapサーバーのセッションとスレッド
    • 古いDataSnapデモのポーティング
    • DataSnapの管理インターフェイス
    • まとめ

 

ポイント

Delphiの、2009年3月29日時点で最新の書籍になります。

私も、最初に携わったプログラム開発がDelphiだっただけに思い入れはありますが、

現時点で最新版のDelphi 2009も評判は良いようですのでまた個人的に欲しいと

思っています。今回の発売についても評判と連動していると見てもよいのではない

でしょうか?洋書の発売から4か月程度での発売という点でも力の入れようが

わかります。

 

<html:base>タグ

<html:base>タグは、Struts1で用意されていたタグライブラリである。

このタグは、HTMLの<base>タグを出力するためのタグです。

<base>タグは、<head>タグ内で記述し、<base href="[絶対パス]"> という書式になります。このタグは、HTMLファイルに相対パスで記述されたURIの基準となるURIを指定します。基準となるURIは、[絶対パス] 部分で指定された絶対パスです。

 

Struts1

このタグは、リクエスト時にフィルターの機能を用い、URL書き換えをおこなう場合に便利です。URL書き換えをした場合に、見かけ上のURLの階層が変わってしまったりすると、相対パスで記述しているリンクや、画像ファイルが正しくリンクされないようになってしまうからです。

この時に<html:base/>タグを記述していると、相対パスの基準となるURIが固定される(出力されるファイルの階層に固定される)ため、URL書き換えで見た目のURLの階層がいくら変化しても、各リソースのリンクには全く問題がなくなります。

 

Struts2

Struts2のタグライブラリには残念ながら、<html:base>に代わるものが存在しません。これは、画像やリンクなどの各リソースのURLの指定をするために、<s:url value="[リソース]"> タグを使うことで、<base> タグを指定する必要がなくなるためだからだろうと思いました。

しかしながら、各リソースのURLを動的に指定する必要がある場合、value属性に、<s:property> タグを入れ込んだりしての、URLの動的作成がうまくいきませんでした(もしかしたら、うまくやれば可能なのかもしれません...) さらに、フィルターによるURLの動的書き換えを組み合わせると、URLが2重になったりと先が見えなかったので、Struts1のように<base>タグを自前で出力させる方法を考えました。

 

<base>タグの出力

発想はいたって単純ですが、フィルターの処理中に、ベースとなるURLをrequestオブジェクトに保存しておき、viewの部分でそれを取り出し、<base>タグのhref属性に指定してあげるという方法です。

ポイントはベースとなるURLをどのように作成するところですが、以下のようにすることで簡単に求められそうです。

 

  //ベースURLの設定
  String url = req.getRequestURL().toString();
  int len = url.length() - req.getRequestURI().length();
  req.setAttribute("htmlbase",  url.substring(0, len) + req.getContextPath() + "/");

 

そして、viewでは以下のように呼び出すだけです。

   

    <%@taglib prefix="s" uri="/struts-tags" %>

    <head>

        <base href="<s:property value="#request.htmlbase"/>"/>

    </head>

 

以上で、Struts1の<html:base/>の処理と同様のことができるようになりました。

※他にもっと良い方法があるかもしれませんが、リソースのURLを動的に作成したり、フィルターにてリクエストのURLを書き換えてフォワードさせたりという処理を組み合わせると、思うような処理ができませんでした。

 

また、Struts2で、リクエストのURLを書き換え、フォワードしてアクションを実行させようとしてもできないトラブルの解決方法は以下を参照ください。

Struts2 RequestDispatcher の動作について

 

getRequestDispatcher foward

Strutsをはじめ、上記のようにリクエストのフォワーディングをおこなうことは少なくないのではないでしょうか?URLReWriteのような形で特定のURLパターンにマッチした場合にアドレスを変換したり、*.html のアドレスでアクセスされた場合に内部的には、*.jsp や、*.do などの動的な処理に転送したい場合などが考えられる。

また、サイトにアクセス制御がかけられている場合は、認証されていない場合にログイン画面に転送するなどにも利用される。

 

Struts2での問題

ここで今まで利用してきた Struts1では、上記のような処理を、通常、web.xml で設定された、フィルターの機能を利用しておこなっていた方も多いのでしょうか?これは非常に簡単なコーディングにてリクエストの転送を問題なくおこなえていました。

 

web.xml

  <filter>
    <filter-name>accessFilter</filter-name>
    <filter-class>com.pg2se.AccessFilter</filter-class>
  </filter>
 
  <filter-mapping>
    <filter-name>accessFilter</filter-name>
    <url-pattern>/security/*</url-pattern>
  </filter-mapping>

  <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

com.pg2se.accessFilter#doFilter

  if (checkLogin == false) {

    request.getRequestDispatcher("/login.do").forward(req, res);

  } else {

    chain.doFilter(req, res); 

  }

 

同様の処理を Struts2 に移植または実装しようとした際に、何も考えずコーディングした場合に、リクエストのフォワードがうまく動作しない現象が発生してしまうのではないでしょうか?

 

具体的には、

request.getRequestDispatcher("/login.action").forward(req, res);

 

と記述しても、

"/logon.action" is not available

 

となってしまいます。最初は原因はわからなくて戸惑うかも知れませんが、これは、Struts1 と Struts2 のアクションが起動される仕組みが変更されているからです。

 

web.xml

 <filter>
  <filter-name>AccessFilter</filter-name>
  <filter-class>com.pg2se..AccessFilter</filter-class>
 </filter>

 

 <filter>
  <filter-name>struts2</filter-name>
  <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
 </filter>

 

 <filter-mapping>
  <filter-name>AccessFilter</filter-name>
  <url-pattern>/security/*</url-pattern>
 </filter-mapping>
 

 <filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

 

Struts2 では、一般的に、上記のように記述しているのではないでしょうか?

この、Struts1 の記述と、Struts2 での記述の違いをみると、アクションの起動が、Struts1 では、servlet-mapping が利用されているのに対し、Struts2 は、filter-mappping を利用しているという点です。

 

AccessFilter の中で、Struts1と同じように、getRequestDispatcherで、foward をおこなっても、アクションは起動されないようになっている。なぜなら、Struts2 では、アクションはフィルターで動作するようになっおり、デフォルトでは、リクエスト時にはフィルターが呼び出されるが、foward時にはフィルターが呼び出されないようになっているからである。

 

これを回避するのは意外と簡単で、web.xml で設定できる。

設定の詳細はこちらのページで詳しく書かれています。

 

web.xml

 <filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
  <dispatcher>FORWARD</dispatcher>
  <dispatcher>REQUEST</dispatcher>
 </filter-mapping>

 

アクションの、filter-mapping にて、<dispatcher>要素を記述する。

記述できる値は、REQUEST、FORWARD、INCLUDE、ERROR である。

ここで、FORWARDを指定すれば、getRequestDispatcher#foward をおこなった際にも、

該当のフィルターが起動され目的の処理をおこなうことができるようになる。

 

 

 

CakePHPポケットリファレンス

著者:株式会社ブルーオーシャン 岡田佳典

発行日2008年7月25日

発行者:片岡巌

発行所:株式会社技術評論社

447ページ

2,480円+税

 

内容

話題のフレームワーク、CakePHPでWebアプリケーションを高速開発!

 

  • 困った時にすぐに調べられる
  • メソッドや関数の使い方をサクッと逆引き
  • CakePHP1.1/1.2に対応
  • わかりやすいサンプルコード付き

 

第1章 インストール編

第2章 設定編

第3章 モデル編

第4章 コントローラ編

第5章 ビュー編

第6章 コンポーネント編

第7章 ヘルパー編

第8章 キャッシュ編

第9章 Sanitizeライブラリ編

第10章 アクセスコントロールリスト編

第11章 プラグイン編

Appendix 資料

 

ポイント

CakePHP1.1/1.2の両方に対応したリファレンスマニュアルです。内容については簡潔にまとめられ、カテゴリ毎にわかれて記述されているため開発の際に調べるのに役立ちそうです。サイズとページ数についても手頃な印象です。

機能的にも多くの内容が書かれており通常の開発の際に必要となる項目は網羅されているのではないでしょうか?ただしCakePHP1.2については、発行の時期的な兼ね合いもあり、一部がリファレンスとして書かれていない状態です。その内容については、巻末の資料欄に詳しく書かれています。

リファレンスや、CakePHPの命名規約、QAなど実際にCakePHPで開発をする際に参照するのに便利な内容となっていますが、CakePHPのフレームワークを利用したアプリケーション開発の手順については触れられていないため、書籍を読むだけで、CakePHPでの開発手法を学ぶというのは難しいでしょう。

CakePHPが影響を受けているフレームワーク「Ruby on Rails」の開発の経験者や、Struts,Struts2などのWebアプリケーションフレームワークの動作について理解している場合はイメージがつきやすいとは思いますが、CakePHPの開発手法に関しては別途書籍で学ぶほうがよいでしょう。

 

下記のように新しい書籍もどんどん発売され、PHPのスタンダードなフレームワークとしての地位を築いていきそうです。( ※2009年3月15日現在の新刊では以下が発売されています。)

CakePHPによるWebアプリケーション開発

 

また、2009年3月15日予約受付中ですが上記と類似の書籍が発売されます。

CakePHPによる実践Webアプリケーション開発

 

はじめに

今回はStruts2を利用した、より実践的なアプリケーションの作成をおこなってみたいと思います。今回も前回と同様、ZeroConfigurationで開発をおこなっています。

Struts2の開発の準備がまだ整っていない場合は以下も参考にしてください。

 

このアプリケーションの解説の中では今後さらにしっかりとしたアプリケーションを開発していくにあたってのポイント、改良点なども記述していますので是非参考にしてください。

 

アプリケーションの概要

このアプリケーションは、シンプルな掲示板アプリケーションです。

複数の端末から共通の掲示板に情報を書き込み、その内容を共有するという単純なものです。情報には、投稿者の名前とメッセージ、そして投稿日時と投稿した端末のIPアドレスを自動で取得した内容が含まれます。

アプリケーションの仕様について簡単にまとめます

  • 掲示板のURLにアクセスすると現在の掲示板の情報が一覧表示されます。
  • "更新"ボタンを押すと、掲示板の情報が最新表示されます。
  • 掲示板の情報は、投稿日が新しいものから順に表示されます。
  • "名前"と"メッセージ"を任意に入力し、"投稿"ボタンを押すと、掲示板に情報が
    登録され、掲示板の内容が最新表示されます。
  • "名前"、"メッセージ"のいずれかが未入力の場合はエラーメッセージが表示され
    掲示板に情報は登録されません。

 

  • アプリケーション画面

simple_board.jpg 

 

ソースコード解説

シンプルな機能の掲示板ではありますが、アプリケーションとしてはMVCモデルを意識し、今後の拡張性も含めながら作成してみました。

 

  • モデル

BoardData .java

掲示板へ登録する情報を格納するデータを保持するクラスです。

データの保持以外の機能は特にありません。  

package com.pg2se.sample.model.board;

public class BoardData {

    private String postDate;
    private String name;
    private String message;
    private String remoteAddress;
   

 public String getPostDate() {
  return postDate;
 }
 public void setPostDate(String postDate) {
  this.postDate = postDate;
 }
 
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 
 public String getMessage() {
  return message;
 }
 public void setMessage(String message) {
  this.message = message;
 }
 
 public String getRemoteAddress() {
  return remoteAddress;
 }
 public void setRemoteAddress(String remoteAddress) {
  this.remoteAddress = remoteAddress;
 }

}

 

Board.java

複数の端末で共有する掲示板のオブジェクトと掲示板に情報を登録する機能を持ったクラスです。

package com.pg2se.sample.model.board;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Vector;

public class Board {

    private static List<BoardData> board = new Vector<BoardData>();
    private static SimpleDateFormat sdformat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    
    public static List<BoardData> addChatData(String name, String message, String remoteAddress){
     BoardData data = new BoardData();
     data.setName(name);
     data.setMessage(message);
     data.setRemoteAddress(remoteAddress);
     data.setPostDate(sdformat.format(new Date()));
     board.add(0, data);
     return board;
    }
    
    public static List<BoardData> getChatData(){
     return board;
    }

}

 

  • ビュー
  • board/board.jsp

    掲示板への情報の投稿と掲示板の情報の表示をおこないます。

     

    入力エラーの内容は<s:actionerror/>タグによって出力されます。

     

    "ValueStack"をコードで記述している部分ですが、board.jspをアドレスに指定されて呼び出された場合にアクションが呼び出されず掲示板の最新情報が取得できていないため無理やり取得しています。Struts1の場合は、フォームに関連付けられたformbeanが初期化されるため初期表示も可能だったんですが...。もっと良い方法あればいいんですが。

     

    また、"remoteAddress"をここで取得していますが詳細は後述します。

     

    ボタンは情報投稿用のボタンと、最新情報取得用の更新ボタンがありますが、method属性を指定して、呼び出すアクションクラスのメソッドを指定できます。

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@page import="com.pg2se.sample.model.board.Board"%>
    <%@page import="com.opensymphony.xwork2.util.ValueStack"%>
    <%@page import="org.apache.struts2.ServletActionContext"%><html>
    <%@taglib prefix="s" uri="/struts-tags" %>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>シンプル掲示板</title>
    </head>
    <body>
        <h1>シンプル掲示板</h1>
        <h2>struts2で作成するサンプルアプリケーション</h2><hr/>
       
        <s:form action="board.action" theme="simple">
          <input type="hidden" name="remoteAddress" value="<%= request.getRemoteAddr() %>"/>
          <s:text name="名前"/> <s:textfield name="name" size="10"/>
          <s:text name="メッセージ"/> <s:textfield name="message" size="60" value=""/>
          <s:submit value="投稿"/><s:submit value="更新" method="update"/>
        </s:form><hr/>
       
        <s:actionerror/>
       
        <table border="1">
     <%
      ValueStack stack = (ValueStack)request.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
      if(stack!=null && stack.findValue("data")==null){
       stack.set("data", Board.getChatData());
      } 
     %>
        <s:iterator value="data" status="stat">
            <s:if test="#stat.first">
              <th>日時</th>
              <th>名前</th>
              <th>テキスト</th>
              <th>IPアドレス</th>
            </s:if>
            <tr>
              <td><s:property value="postDate"/></td>
              <td><s:property value="name"/></td>
              <td><s:property value="message"/></td>
              <td><s:property value="remoteAddress"/></td>
            </tr>
        </s:iterator>
        </table>
    </body>
    </html>

     

    • コントローラ

    BoardAction.java

    掲示板の情報の登録と最新表示をおこなうためのアクションです。

     

    メッセージの投稿用にはデフォルトのアクションexecuteメソッドを、最新情報取得用のアクションにはupdateを使用します。

     

    ActionSupportクラスを継承することで、validation(バリデーション:検証)やメッセージ・エラーメッセージを簡単に設定することができます。validateメソッドを実装するだけでよいのですが今回は使用しませんでした。理由は、validateメソッドはすべてのアクションに対して実行されてしまうため、今回バリデーションの必要がないupdateメソッドに適用されたくなかったためです。今回は自前のisValidメソッドで検証をおこなっています。※xmlファイルでバリデーションの定義をする場合は検証を除外するメソッドを設定できたりするようです。他にも方法はあるようなのですがわかりませんでした、

     

    "remoteAddress"についてはjspファイルから渡されるようにしています。本来はアクションクラスで、requestオブジェクトから取得したいのですがActionSupportクラスからは取得できないようです。取得するためには、ServletRequestAwareインターフェイスを実装する必要があります。そうすると実行時にHttpServletRequestオブジェクトが注入されるようです。

     

    今後の拡張として、掲示板の情報の編集・削除等のメンテナンスや掲示板の情報をデータベースへ保存し永続化するという点が考えられます。

    package com.pg2se.sample.action.board;

    import java.util.List;
    import com.opensymphony.xwork2.ActionSupport;
    import com.pg2se.sample.model.board.Board;
    import com.pg2se.sample.model.board.BoardData;

    public class BoardAction extends ActionSupport {

     private String name;
        private String message;
        private String remoteAddress;
        private List<BoardData> data;
     private static final long serialVersionUID = 1L;
       
     public String getName() {return name;}
     public void setName(String name) { this.name = name;}

     public String getMessage() {return message;}
     public void setMessage(String message) {this.message = message;}
     
        public String getRemoteAddress() {return remoteAddress;}
     public void setRemoteAddress(String remoteAddress) {this.remoteAddress = remoteAddress;}

     public List<BoardData> getData() {return data; }
     public void setData(List<BoardData> data) {this.data = data;}
     
     //execute
     public String execute() {

      if(isValid()){
      
          data = Board.addChatData(name, message, remoteAddress);
         
         } else {

          data = Board.getChatData();
         }
      
         return "success";
        }
     

     //update
     public String update() {
      
      data = Board.getChatData();
      
      return "success";
        }
     
     //validate
     public boolean isValid() {
      if(name == null || name.equals("")){
       addActionError("名前を入力してください");
      }
      if(message == null || message.equals("")){
       addActionError("メッセージを入力してください");
      }
      
      return !hasActionErrors();
     }
    }

     業務システムのためのユーザーマニュアル作成ガイド

    著者:黒田聡、雨宮拓、徳田直樹、高橋陽一

    発行日:2009年1月28日

    発行者:佐々木幹夫

    発行所:株式会社翔泳社

    243ページ

    2,480円+税

     

    ポイント

    最も大きなポイントとしては、この手の書籍が今までなかったことです。ITエンジニアとしてシステムを設計し、プログラムを作成し、テストが完了したシステムを納品する工程はとても重要な部分ですが、新しいシステムを構築する際には必ずと言って良いほど"マニュアル作成"の工程も含まれます。

    私も少なからず、マニュアル作成の担当をしたり、様々なシステム開発でマニュアル作成の指示を出したりしていました。しかし作成するにあたっては、既存のマニュアルを参考にしたり、以前のシステムのマニュアルの書き方を参考にしたりというのが大半ではないでしょうか?

    私もマニュアル作成については"本当にこんな書き方でよいのだろうか?""マニュアルの書き方を学びたい"と何度も感じていましたが、この書籍のように、システムに特化したマニュアル作成ガイドについては見つけられませんでした。

    内容についての詳細は後述しますが、私が求めていたマニュアル作成のノウハウについて、この一冊に多くが書かれている理想的な内容の書籍でした。

     

    内容

    ITエンジニア必携!システムを活かしてもらうマニュアルの作り方を徹底詳解。

    ユーザーの満足度を高める!ユーザーの誤操作を防ぐ!ユーザーの使いやすさを追求する!初めて作る人でもこの一冊ですべてがわかる。

    • マニュアル作成の「間違った常識」
    • マニュアルの企画はこう進める
    • マニュアルの文章はこう書く
    • マニュアルの仕様書をわかりやすくするビジュアル表現
    • マニュアルの校正・表現の校正はこう進める
    • マニュアルの保守管理はこうする
    • 部品化と構造化で効率アップ

     

    内容としては具体的な例や、図での説明も多く、解説書のわりには非常に読みやすい内容になっていると思います。まずマニュアルは何のために作成するのかという本質から始まり、業務システムのマニュアルが他のマニュアルと違う点。一般的な文書作成の常識とは違う、ユーザーマニュアル特有の書き方についてまとめられています。

    また文書の表現の仕方、ビジュアル(図や表など)の効果的な使い方などのテクニックについても具体的な例文を用いてわかりやすく解説されています。そしてマニュアルをひとつの成果物としてとらえ、いかに校正し、品質を高めるかについてのポイントがまとめられています。

    そして、実際の現場では、とりあえずマニュアルを作成し、そのあとは利用されようが利用されまいが放置されたままということも多いのではないでしょうか?そのならないための、マニュアルの保守管理の方法について書かれており、最後はマニュアル作成の効率化のための様々なテクニックや、知識が書かれています。

    作成したマニュアルが、本当に現場で効果的に利用されているか?内容はこれでよかったか?など、マニュアル作成に対する疑問に対する答えがたくさん詰まっている書籍だと思いまので、ぜひ読んでみてもらいたい一冊です。