« 2011年6月 | トップページ | 2011年8月 »

2011年7月の8件の投稿

2011/07/23

[読書]Hello, world!からはじめるCUDAプログラミング - CUDA by Example 汎用GPUプログラミング入門

CUDAプログラミング入門用に2冊購入しました。

 

「はじめてのCUDAプログラミング」の著者は東工大のGPUコンピューティング研究会の主査/幹事をされてたりする、GPGPU研究の第一人者の方たち、だそうです。

本書は日本語の書籍としては早い時期に出版され、web上で見ると当時の評判もかなり良いようです。ただ、出版された時期が早い分、今から読むと、現在のアーキテクチャ(compute capability 2.x(Fermi))やCUDA4.0のプログラミングモデルとは異なってしまっている部分があります。

また、GPU上での速度最適化を念頭に説明が進められていきますので、取り敢えずGPU上でプログラム動かしてみたいんだ!と考えているとちょっとじれったいです(GPU上で計算しようとする動機は実行速度を上げることであるのが普通なので、このアプローチが変なわけではないです)。

 

一方で「CUDA BY EXAMPLE」の方は、本当にハローワールドから始まります。普通のCプログラムを作る –> GPU上で動作するように変更する –> それを最適化する という順番で進めていきますので、手を動かしプログラムを動かしながら理解できます。ですのでまずプログラム動かしたいと考えている私のような人にはこちらの方がお勧めです。(ちなみに結構初っ端に出てくるプログラム(julia_gpu.cu)がコンパイルエラーになって焦ったりしますがこちらに対応方法が書いてありました。)

ちなみにこちらはcompute capability2.0以降ですが、CUDA4.0よりは前に出版されています。CUDA3.xとCUDA4.0で変わった部分についての言及は無かったように思います(が、言い切れるほどの知識はまだ無いです)。

 

いずれの本を読み終えたとしても、CUDA C Programming Guide(CUDA Toolkitをインストールしていればローカルにもあると思います)に書かれている内容の一部しかカバーできていないので、次はこのGuideを読むことになると思います。(はてなダイアリでid:nobnakさんが過去のバージョン和訳されていらっしゃるのを見つけましたが、現在の最新バージョンであるCUDA4.0とは異なる部分もあるようです。)

 

ついでに書いておくと、昨日NVIDIA GTC Workshop Japan 2011というのがあったそうで、飯塚拓郎さんがセッションで用いたソース(PDF資料)が4.0でのC++サンプルとして良さそうなので後日参照させてもらおうと考えています。

2011/07/19

[読書]誰を対象にした内容なのか不明確 “Java: The Good Parts”

立ち読みで済ませてしまった本です。

著者のJim Waldoさんという方はJava設計にも大きく貢献された方…だそうですが(確か著者紹介のところに書いてあったかな?)、本書の内容はその経歴が生かされていないと感じました。

タイトルからしてn匹目のドジョウ感がありますし、目次をみても、普通にJavaを学んでいく上で得られるような知識ばかりですし、他の言語から移ってきた人にとっても、大抵の機能は過去学んだ言語にもあることでしょう。敢えて言うとC以前の言語を学んで、さあ次はJavaだ!というような人にとっては有用でしょうか…?それにしては出版された時代が遅すぎるような気もしますが。

「Javaには他の言語と違ってこんな便利な機能が」「他の言語のやり方とは違ってJavaだとこうするのが良い」みたいなことが書かれていることを期待させるタイトルですが、もしタイトルを見てそのように感じたのであれば立ち読みしてみてから購入を検討することをおすすめします。

2011/07/17

Visual C++ 2010 でCUDAソースファイル(.cu)のシンタックスハイライトとインテリセンス有効化

これまたVC++2008の設定はWeb上で多く見つけることができるのですが、日本語でVC++2010について解説されたものが無かったので記載。

 

usertype.dat の作成と保存

usertype.datの説明はこちら。ただし、これは2003時代の説明で、保存すべき場所はdevenv.exeと同じディレクトリでなく、VC++ 2010 ExpressではVCExpress.exeと同じディレクトリ、つまり C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE になります。

GPU Computing SDK 4.0をインストールしている場合には C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\doc\syntax_highlighting\visual_studio_8 ディレクトリにusertype.datがありますので、前述のIDEディレクトリにコピーしましょう。SDKをインストールしていなければこちらをダウンロードして同ディレクトリに保存します。

 

VC++ 2010 Express の設定

2008まではレジストリを編集する必要があったようですが、2010では不要なようです。

VC++ 2010 Express を起動し、ツール > オプション... メニューを選択し、表示されたオプションダイアログ上でプロジェクトおよびソリューション > VC++プロジェクトの設定 ツリーメニュー を選び、含める拡張子に”.cu”を追加します。

01extension

続いて同じダイアログ上で テキストエディター > ファイル拡張子 ツリーメニューを選択し、拡張子入力欄に “cu”(こちらはドット無しです)を入力し追加ボタンを押します。

02editor

 

以上の設定で、.cuファイルでもsyntax highlightとintellisenseが有効になります。

 

ちなみに、cudaMallocやらcudaMemcpyやらの関数を補完するためには

必要があります(その他、 device_launch_parameters.h もインクルードしておいた方が良い?)。

…むしろcuda_runtime.hをインクルードしなくてもコンパイルが通ってしまう方が謎な気がするのですが、なぜなんでしょうね…?

 

参考:

2011/07/16

Visual C++ 2010 Express で GPU Computing SDK 4.0 (64bit)をビルドする

本エントリは以下の設定が完了していることを前提としています。

 

インストール

その1で記載したサイトからGPU Computing SDK code samples(64-bit) gpucomputingsdk_4.0.17_win_64.exe をダウンロードしてインストールします。

インストール時、アンチウイルスソフトは停止しておいた方が良いかもしれません

デフォルトでは C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0 にインストールされます。

 

ビルド設定変更

C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\CUDALibrariesCUDALibrariesSDK_vs2010.sln を開きます。アプリケーション選択ダイアログでは Visual C++ Express 2010 を選択しましょう。

01selectapp

 

VC++が起動すると、「ソリューションフォルダーはこのバージョンのアプリケーションではサポートされていません。」というようなメッセージが出て、common, CUBLAS Samples, CUFFT Samples, NPP Samples 計4つに対しエラーが出ますが無視します。

02solutionfoldererror

 

起動後、ビルドターゲットをx64にしておきましょう。

03x64

 

その2でも行ったように、全てのプロジェクトについて、プラットフォームツールセットをWindowsSDK7.1に変更します。前回も説明しましたが、このとき、ダイアログを開く都度、”全ての構成”にしてから項目値を変更するのを忘れないでください。

04windowssdk

 

ビルド

それではビルドしてみましょう。F7キーがソリューションビルドのショートカットキーです。…エラーが出ましたね。どうもソースコードが想定される箇所に無いようです。

C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\CUDALibraries\common\src にある stopwatch.cpp, stopwatch_win.cpp 2ファイルを双方 C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\shared\src にコピーしてください。

改めてビルド。…すべて成功しました。

gpucomputingsdk_4.0.17_win_64.exe がインストールできないのはウイルスバスターのせいだった

Visual Studio 2010 Express と CUDA4.0でプログラムを実行してみる その1 インストール: 雪羽の発火後忘失 で、GPU computing SDK インストーラが途中でフリーズしてしまってインストールが正常に行えない、と記載しました。

これはどうやらウイルスバスター2011(Trend Micro TITANIUM)の問題だったようで、ウイルスバスターを停止後インストーラを実行することで正常終了させることができました。

 

一応ウイルスバスターのサポートへ不具合報告しておこうと連絡してみましたが、返答は以下の通りでした。

4:39 PM トレンドマイクロ担当者:

失礼いたしました。
今回の件は、不具合ではございません。システムに影響のあるプログラムをインストールする際は、今回のような現象が発生することがございます。

しかしながら、今回はプログラム名をお知らせいただき、ありがとうございました。
お客様からのご報告、こちらで承らせていただきますので、今後ともよろしくお願いいたします。

 

参考:

2011/07/14

Visual Studio 2010 Express と CUDA4.0でプログラムを実行してみる その2 プロジェクト設定

その1でインストールを行いましたので、次にVisual C++の設定を行い、その後サンプルプログラムを作成・実行してみます。

 

VC6時代は全体に影響する設定が大半だった記憶があります。そのため、プロパティ画面からは設定せず(画面で設定してしまうと他のプロジェクトにも影響を与えてしまうので)、プロジェクトごとに起動用バッチファイルを作成し、そこに必要な環境変数などを設定して…というようなことを行っていました。

一方、現在のバージョンでは、プロジェクトごとに必要な設定はプロジェクト単位でしか設定できないような方針が採られているようです。この方針はVC++2008とVC++2010の差異としても現れ、現在Web上で多く説明されている2008用のインストール方法説明ではうまくいかない箇所がありました。

 

グローバル設定

Visual C++ 2010 Express の全体に影響する設定を行います。

  1. Visual C++ 2010 Express を起動します。
  2. ツール > 設定 > 上級者用の設定 を選択します。

…これくらいでしょうか。

 

CUDAサンプルプロジェクトの作成と設定

  1. ファイル > 新規作成 > プロジェクト... で”新しいプロジェクト”ダイアログを開き、”空のプロジェクト”を選択、名前を”HelloCUDA”としてOKボタンを押し、新しいプロジェクトを作成します。
  2. ソリューションエクスプローラーでHelloCUDAを選択し、 プロジェクト > ビルドのカスタマイズ... メニューを選択します。
  3. CUDA 4.0 にチェックをつけ、OKボタンを押します。

01buildcuda

これで簡単なプロジェクトが作成できました。続いて実行するcuファイルを作っておきましょう。書籍CUDA by Example(Amazon)のサンプルコードがこちらからダウンロードできます(Download source code for the book's examples (.zip)のリンク)ので、これを解凍し、chapter03\simple_kernel_params.cuをプロジェクトに取り込みます。インクルードファイルも必要なので、全体を解凍しておきましょう。

  1. ソリューションエクスプローラーでHelloCUDAプロジェクトのソースフォルダを右クリックし 追加 > 既存の項目... を選択します。
  2. simple_kernel_params.cu ファイルを選択します。

02source2

これでビルドする準備はできました。一応.cuファイルがビルド対象になっているか確認しておきましょう。

  1. ソリューションエクスプローラーでmyFirstKernel.cuを右クリックし”プロパティ”を選択します。
  2. ビルドから除外: いいえ項目の種類: CUDA C/C++ となっていることを確認し、ダイアログを閉じます。

03cudabuildprop

前述してきた手順と異なる順番で設定した場合(ビルドのカスタマイズを後から行った場合)は、.cuファイルがビルド対象になっていないかもしれません。その場合は上のような設定に変更しておきましょう。

 

プロジェクトプロパティ設定

  1. ソリューションエクスプローラで作成したHelloCUDAプロジェクトを右クリックしプロパティを選択します。
  2. ダイアログ左上にある“構成”プルダウンメニューで”すべての構成”を選択します。

04all

プロジェクトプロパティはこのダイアログで設定します。”すべての構成”を選択したのは、今回変更するものはRelease用/Debug用バイナリ双方で同一項目に対して同一値を設定するためです(Release用とDebug用それぞれ個別に設定しても良いですが、2度手間になりますので)。以降ではこのダイアログを開く都度この設定を行ってください。

 

x64バイナリ出力設定

その1でもリンクしたページ、「方法 : Visual C++ プロジェクトを 64 ビット プラットフォーム用に設定する」に記載されている設定です。

  1. プロジェクトプロパティダイアログ右上にある“構成マネージャー...”ボタンを押し、構成マネージャーダイアログを表示させます。
  2. ”プラットフォーム”プルダウンメニューで”<新規作成...>”を選択します。
  3. “新しいプラットフォーム”プルダウンメニューで”x64”を選択しOKボタンを押します。
  4. 構成マネージャーダイアログを閉じます。

05x64

CUDAの方の設定も変更しておきます。

  1. 構成プロパティ > CUDA C/C++ > Common ツリーメニューを選択します。
  2. Target Machine Platform 項目値を “64bit(—machine 64)” に設定します。

06cudax64

 

実行完了後コマンドプロンプトを閉じない設定

Visual Studio 2008 までとは異なり、Visual Studio 2010 ではデバッグなしで開始(Ctrl+F5)で実行した場合でも、デフォルトではプログラムが終了するとコマンドプロンプトが閉じてしまいます。コンソール出力した結果が見えませんのでこの動作を変更します。

  1. 構成プロパティ > リンカー > システム ツリーメニューを選択します。
  2. サブシステム項目値を “コンソール(/SUBSYSTEM:CONSOLE)” にします。

07console

 

Windows SDK 使用設定

  1. 構成プロパティ > 全般 ツリーメニューを選択します。
  2. プラットフォーム ツールセット の項目値を “Windows7.1SDK” に変更します。

08toolsetsdk

 

インクルードパス等設定

[追記: この設定を行わなくてもライブラリのリンクは正常に行えました。未確認ですがどこかで自動的にパスが設定されているのでしょう。従ってこの設定は必要無いと思います。[追記: nvcc.exe と同じ階層にあるnvcc.profileですね。]]

[追記2: こちらで説明している通り、インテリセンスを効かすためにはインクルードディレクトリの設定が必要です。]

  1. 構成プロパティ > VC++ディレクトリ ツリーメニューを選択し、実行可能ファイルディレクトリのプルダウンメニューから “<編集...>”を選択します。
  2. 表示されたダイアログで $(CUDA_BIN_PATH) を追加した後、OKボタンを押しダイアログを閉じます。
  3. 同様にインクルードディレクトリでは $(CUDA_INC_PATH) 、ライブラリディレクトリでは $(CUDA_LIB_PATH) を追加します。

なお、これらの環境変数は、先のCUDA Toolkit インストール時に自動で設定されています。

09include

 

リンクライブラリ設定

  1. 構成プロパティ > リンカー > 入力 ツリーメニューを選択します。
  2. 追加の依存ファイル のプルダウンメニューから “<編集...>”を選択します。
  3. cudart.lib と入力した後OKボタンを押しダイアログを閉じます。

10lib

 

Compute Capability 2.1 対応コード生成

これは必須ではないですが、せっかくGTS 450を選んだのですから設定しておきます(カーネル関数(GPU用コード)の中でprintfできたりメリットもあるようですし)。

  1. 構成プロパティ > CUDA C/C++ > Device ツリーメニューを選択します。
  2. Code Generation から <編集...> を選択します。
  3. “親またはプロジェクトの既定値から継承”のチェックを外し、入力欄に “compute_20,sm_21” を設定しOKボタンでダイアログを閉じます。

11codegen

nvcc.exeのヘルプを読むと、compute_20はvirtual architectureの指定、sm_21はreal architectureの指定、だそうですがvirtual/realが何を指しているのかイマイチ分かっていませんのでそれっぽいのを指定しています。

 

設定は以上です。この後、Ctrl+F5を推せばビルド、プログラムが実行されます。

 

参考:

Visual Studio 2010 Express と CUDA4.0でプログラムを実行してみる その1 インストール

Windows上でのCUDAプログラミングはVisual Studio上で行うのが便利そうなので環境を構築してみます。

現時点で日本語のblogやWeb上の記事を検索してみたところ、Visual Studio 2008 で行う方法の記載がほとんどでしたが、CUDA4.0からはVisual Studio 2010 に対応していますので、今回は表題のバージョンに挑戦します。安定性の面でVS2008&CUDA3.2を選択するのもアリだと思います。その場合は他の方の記事を参照ください。

構築する環境は以下の通りです。

 

Visual C++ 2010 Express と Windows SDK 7.1 をインストールする

64bitバイナリを作成するのにはWindows SDKが必要なので、VC++に加えてSDKのインストールも行います。ただし、このときインストールする順番を間違えるとx64コンパイラが削除されてしまうバグがあるそうですので注意してください。

  1. MicrosoftのサイトからVC++ 2010 Express のインストーラをダウンロードしインストールを行います。
  2. MicrosoftのサイトからWindows SDK のインストーラをダウンロードしインストールを行います。
  3. MicrosoftのサイトからVisual Studio 2010 Service Pack 1 をダウンロードしインストールを行います。
  4. MicrosoftのサイトからVisual C++ 2010 SP1 Compiler Update for Windows SDK 7.1 をダウンロードしインストールを行います。

この手順はVisual C++ Team Blogの記述を参考にしたもので、実のところ私が採った手順とは異なりますが、公式に説明されている以上この手順で行うのが確実でしょう。

 

CUDA Toolkit 4.0 (May 2011) をインストールする

NVIDIA CUDA Zoneのサイトからリンク “CUDA Downloads” –> “GET LATEST CUDA TOOLKIT PRODUCTION RELEASE”を辿ってダウンロードページに行き(現時点ではこちらのページ)、必要なバイナリをダウンロード後インストールを行います。

  1. Developer Drivers for WinVista and Win7 (270.81) 64-bit をダウンロードしインストールを行います。
    • このDeveloper Driverは不要で、nvidia.comやWindows Updateで入手できる普通のドライバでOKという話も。実際、私も間違えてWindows Updateから、より新しいバージョン(275.33)を上書きインストールしてしまいましたが、問題なく開発できています…
  2. CUDA Toolkit 64-bit をダウンロードしインストールを行います。
  3. CUDA Toolkit 4.0 Build Customization BUG FIX Update をダウンロードし、READMEの通りに、2ファイルを既存のファイルに上書きします。
  4. CUDA Tools SDK 64-bit をダウンロードしインストールを行います。

その他のバイナリも順にインストールしていこうと考えていたのですが、GPU Computing SDK code samples のインストーラがregistrationのところで固まってしまい強制終了するしか手段が無くなったのでここまでで止めました。[追記: ウイルスバスターを終了させるとインストールできました。]

ちなみに、CUDA ToolkitとSDKは以前までのバージョンとは異なり(?)、両方C:\Program Files\NVIDIA GPU Computing Toolkit以下にインストールされるようです。

 

CUDA 4.0.props を編集する

前述CUDA Toolkitインストール手順3. で上書きした C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations\CUDA 4.0.props ですが、Windows SDK を利用してビルドを行う場合にはこのままでは不具合がありますのでここで編集しておきます。

45行目,46行目をコメントアウトし、CudaClVersion が常に2010となるようにします。

編集後、該当行は以下のようになります。

<!--
        <CudaClVersion Condition="'$(PlatformToolset)' == 'v90'">2008</CudaClVersion>
        <CudaClVersion Condition="'$(PlatformToolset)' == 'v100'">2010</CudaClVersion>
-->
        <CudaClVersion>2010</CudaClVersion>

 

x64ビルド用環境設定batファイルを作成する

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64vcvars64.bat というテキストファイルを作成し、下記1行を記述して保存します。

CALL "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x64

参考: vcvarsall.bat no 64bit support vcvars64.bat missing

CUDA(GPGPU)をはじめようとグラフィックカードを購入した

Kinectの記事を読もうと日経ソフトウェア2011年8月号を購入したところ、別の特集記事「ケタ違いのパワーをC/C++で!これから始めるGPUプログラミング」に目移りしてしまい、勢い余ってグラフィックカードを購入してしまいました。

GPGPUの開発・実行環境でメジャーなものはCUDAとOpenCLの2種類があるようです。CUDAがNVIDIA社の独自規格である(対応グラフィックカードはNVIDIAのもののみ)のに対し、対抗規格である後発のOpenCLは共通規格団体によって制定されているそうです。ここだけ聞くとOpenCLの方が良さそうですが、プログラミングのしやすさはCUDAの方に一日の長がありそうでしたので、私はCUDAを選択することにしました。ちなみに、NVIDIAのカードだとCUDAしか無理なのかというとそういうわけではなく、OpenCL用の環境も提供されています(参考)。

また、CUDA/OpenCLともエミュレーション実行もできるようで、対応カードが無い場合でもCPU上でプログラムを実行することも可能なようです。ほんとにちょっと触ってみたいだけであればエミュレーションも一つの手かもしれません。[追記: CUDA3.0から(?)nvccのdeviceemuオプションがdeprecatedになって、CPUでエミュレーションすることはできなくなったようです(参考)。OpenCLも駄目?(参考)]

 

CUDA対応GPUカードの一覧はこちらにあります。TeslaQuadroという製品群はそれぞれ特定用途向けのカードのようでしたので、無難にGeForceから選択することに。

そして、Compute Capabilityが2.0以降のものはそれより前の製品と異なるFermiというコードネームのアーキテクチャが採用されているそうなのでその中から。

…ということでGeForce GTS 450で検索したところ、玄人志向のGF-GTS450-E1GHという製品が1万円を切っているようなのでこれにしました。高性能なカードは値段もさることながら、容量の大きい電源も要求するので、ちょっとそちらにも手を入れるのも面倒だな…ということもありました(4Gamer.netの記事によると、GTS450の最大消費電力は106W、推奨電源ユニットは400W以上、とのことです)。

« 2011年6月 | トップページ | 2011年8月 »

other sites

  • follow us in feedly
  • github
  • stackoverflow

ソフトウェアエンジニアとして影響を受けた書籍

  • Christain Bauer: HIBERNATE イン アクション

    Christain Bauer: HIBERNATE イン アクション
    理論と実践が双方とも素晴らしい製品であるHibernate。本書はそのプロダクトを書名に冠していますが、Hibernateを使うつもりがなく、ORマッピングの解説書として読むにしても十分な良書です。Second EditionとしてJava Persistence With Hibernateという書籍も出版されていますが、残念ながら現在のところ 和訳はされていません。-インアクションは2.xの、Java Persistence-は3.1の頃のものなので、最新版とはちょっと違うところもあることに注意。 (★★★★★)

  • アンドリュー・S・タネンバウム: 分散システム 原理とパラダイム 第2版

    アンドリュー・S・タネンバウム: 分散システム 原理とパラダイム 第2版
    クライアント/サーバシステムを構築する上で必要となる知識が総論されてます。Web技術者も、フレームワーク部分を開発するのであれば必読。 (★★★★★)

  • Joel Spolsky∥著: ジョエル・オン・ソフトウェア

    Joel Spolsky∥著: ジョエル・オン・ソフトウェア
    前述の書籍「ソフトウエア開発プロフェッショナル」をより砕いたもの、という感じでしょうか。 前書きではプログラマでなくSE向けの本のように書かれているが、プログラマが読んでも面白い本であると思われます。 SEになった新人(あるいはそういう会社に入る/入りたての人)にとっては、これからどういったことが仕事を遂行していく上で起こりえるのか、どのように考えて行なっていけばいいのか決定する助けになると思います。 元は″Joel on Software″というブログの記事で、web上でも一部日本語で読めます。 http://japanese.joelonsoftware.com/ (★★★)

  • ドナルド・C・ゴース,ジェラルド・M・ワインバーグ: ライト、ついてますか

    ドナルド・C・ゴース,ジェラルド・M・ワインバーグ: ライト、ついてますか
    問題解決(一昔前のの流行語で言うところの『ソリューション』)能力は、システムエンジニアのスキルとして備えるべきもののうちのひとつです。しかし、これは難しい。学校で出されるテストと違い、唯一の、(問題提出者が想定している)解を求めるだけが「問題解決」では無いからです。そもそも、何が問題なのか、それは本当に問題なのか、それは本当に解決すべき問題なのか、その問題解決方法は正しいのか、などを解決しなければ、「その解は正しいのか」に辿りつくことができません。この本の最も良いところのひとつは、本があまり厚くないこと。すぐに読めるし、何回も読み返す気になるでしょう。 (★★★★★)

  • スティーブ・マコネル: ソフトウエア開発プロフェッショナル

    スティーブ・マコネル: ソフトウエア開発プロフェッショナル
    コードコンプリートで有名なスティーブマコネルの著書。新人SEに読んで欲しい。個人として業界の中でどうあるべきか、組織としてどうあるべきか、SEのプロ意識とは?SEの心構え概論、といったところでしょうか。また、業界における資格の重要性についても説かれています。この業界では資格が特に軽んじられる傾向がありますが、この傾向はどんな弊害をもたらすのか、将来的にこの業界は資格に対してどのような姿勢で臨んでいくべきなのか。日経BP社では(他の出版社もだが)最近、似たような類いのあまり面白くない書籍が乱出版されていますが、この本は別格だと思うので安心して購入して欲しいと思います。 (★★★★★)

無料ブログはココログ