ゆず日記

戦う Vimmer 兼 Dvorakユーザ 兼 Kinesisユーザ 兼 おぺらー が戦わないブログ

ドラえもん電子書籍化に寄せて: ドラえもんと私

書こう書こうと思いながら随分時間が立ってしまったけど、ドラえもん電子書籍化のニュースがあった。
「ドラえもん」電子書籍化、てんとう虫コミックス1〜45巻とデジタルカラー版Vol.1〜141を配信開始 -INTERNET Watch

現在既に電子書籍版が販売されており、気付いたらKindle版も販売されている。

元々 キンコーズで電子書籍用に1冊108円で断裁してもらったお話と個人的な自炊のお話。 - ゆず日記電子書籍への移行を進めていて、ちょっと前の50%還元セールの際にマンガもKindle版があるものはすべてKindleで買い直し、手元のコミックスはマーケットプレイスブックオフで売ってしまった。

OreillyはEbook Storeがあるし、他の技術書や新書はそのまま電子書籍版を買う。もし電子書籍がなければ紙の書籍を買って断裁しScanSnapで取り込んで...とすっかり本棚不要の生活になった。

出版社により書籍との遅れがある場合もあるが、自分が買っているマンガは最新刊発売日の0時頃に手元のKindleに配信されるし、自宅, オフィス, カフェ, 何処でもKindleから600冊強の書籍にアクセスできる環境が魅力である。
元々持ってたデカい本棚は引っ越しの際に処分した。

ちなみに、ジョジョのコミックスはアニメの影響もあってか1〜7部が高値で売れてしまった。 10年以上前から全巻新品で購入していた品で、(63 + 17 + 24)巻 * 420 = 43,680円掛かっていたが、30,000円で売却できた。 文庫本ベースのKindleモノクロ版を全部購入すると34,600円、50%ポイントセール時に買ったので携帯電話会社風にいうと実質17,300円だったので、手元のお金が12,700円増える形でKindle版に移行できたことになる。

カバー裏の荒木先生のコメントや、「あーん!スト様が死んだ!」とかが読めなくなるのはデメリットだが、本棚スペースが不要になるメリットの方が自分には大きかった。

15年程前から紙媒体で揃え続けていたけど、収支プラスで移行出来るとは不思議なものだなぁと思った。

話を戻して、これで自分にとっては本棚に最後まで残り続けたドラえもんコミックスとはお別れとなるので、ちょっとの間SF(すこし・ふしぎ)なドラえもん語りをしたい。

ドラえもんとの出会い

初めて読んだマンガはドラえもんだった。 何歳だったかはもう憶えてないが、物心ついた頃から家にはドラえもんがあった。
カバーが無いものや、汚れているものがあったので、兄の為に中古本も含めて親が買ってくれたものかも知れない。

最初はコマを追う順番も分からず、漢字のルビも言葉の意味もよく分からなかったが、少し大きくなってからは弟に読み聞かせをしたりしていた。小学時代の国語の音読がスラスラ読めたのはドラえもんのお陰だ。 夏休みにチョコアイスを食べながら読んでて落として5巻を茶色く汚してしまったのもいい思い出だ。

いろんなことを学んだドラえもん

日食*1 太陽と月の視直径の違いを知ったのはドラえもんである。
盲点*2の存在を知ったのもドラえもんである。
刷り込み*3も、亡命*4も、光ファイバ*5も、 水が酸素と水素から構成されていること*6を知ったのもドラえもんである。
あれもこれもすべてドラえもんである。

信長の野望で日本史を学び、桃鉄で地理を学ぶというが、ドラえもんは理科も社会も学べてしまうのである。凄い。

スネ吉の広角レンズの絞りの話*7なんて一眼レフを買った今年になって初めて意味が分かった。
のび太スネ夫がお互いにミサイルを所有しているシーンが冷戦*8を皮肉ったものだったりと、後になって気付かされるネタも多い。

ちなみに、しずちゃん*9が人間製造機*10の話でなぜあんなに怒るのか分かるまで10年位掛かった。

脱線

ちなみに幾つか版を重ねる中で、改変された内容がある。

28巻: 「なぜか劇がメチャクチャに」 は内容が大きく書き換えられている。
実家にあった版では、チビ黒サンボの劇を行うシーンがあるのだが、10年前に買い直した版ではそのシーンがまるまるカットされてしまっている。

参考: http://www.geocities.co.jp/Playtown-Dice/6159/d-28.html

他にも、ごみすてばがごみだしばになっていたりと、ドラえもんも差別問題による影響を大きく受けている。

参考: 復元光線 Case4

別にコレくらいいいのでは... と思うものも多いのだが、読者数が多く影響が大きいだけに気を遣わなければならないことも多いのかと思う。 元のものが読みたければ、今では藤子・F・不二雄大全集に、てんとう虫コミックス未収録の話も含めて全話掲載されているのでこちらもオススメ。(早く電子書籍化して欲しい。)

ドラえもん 1 (藤子・F・不二雄大全集)

ドラえもん 1 (藤子・F・不二雄大全集)

多分1番好きな話

23巻: 「ぼくよりダメなやつがきた」 である。のび太よりダメな多目くんが引っ越してくる話だ。

ドラえもん (23) (てんとう虫コミックス)

ドラえもん (23) (てんとう虫コミックス)

多目くんは名前通りダメな子で、のび太より勉強も運動もできない。
先生やジャイアンからいつもいびられてたのび太は、自分よりダメなやつが来たことで社会的カーストの最下層から脱するが、今までの劣等感の反動からか今度は多目くんを馬鹿にしだす。
一見仲良さそうに一緒に宿題をしだすが、モクモク頑張る多目くんと、すぐに飽きだすのび太ジャイアンに野球に誘われるが、自分は参加したくないので多目くんを代わりに推薦する。
見かねたドラえもんが、のび太の行動を省みさせることで過ちに気付かせ、ジャイアンに野球の責任を問われてバットで殴られそうな多目くんを、のび太が助けに入るという内容だ。

この話は子供ながらに深く考えさせられた。
また、この話の苦手な勉強でも投げ出さずにモクモク努力する多目くんの姿勢にも学ばされた。*11

藤子先生はよくインタビューで「のび太は私なんです。」という話をしていた。 藤子先生も小学生時代、勉強も運動もダメで、ドジでよく先生に叱られていたという。全国にいる悩める子供たちが、つらい時でもドラえもんを読んで、自分よりドジなのび太を見て元気を出して欲しい。といったメッセージだった。

私も小学生時代、勉強こそそれなりには出来たが運動がからっきしダメで、小学生時代に運動が出来ないというのは社会的カーストの下層になりがちである。当時はつらい思いをすることが多かった中で、のび太に自己投影していた1人として、ドラえもんに救われ、知識も得て、のび太の行動から学ぶ。

そういった経験をドラえもんは私に残してくれた。

流石にこのコミックスを処分してしまうのはしのびないので、実家に送って取って置くつもりだ。 ドラえもんが連載されていたのが19xx-19xx年、自分の生まれは1984年。それでも時代の変化に何の抵抗も無く読むことが出来た。 今の子供達がドラゴンボールを普通に受け入れてくれるのと同じくらい、違和感なく受け入れてくれる作品だと思う。

それはコミックスという媒体から電子書籍になっても変わらないものだと思っている。 いつか子供にもKindleとセットでプレゼントしたい。

最後に小学六年生の3月号に頻繁に掲載された話、つまり小学生がドラえもんの掲載誌から卒業する最後の号の話。また、大山のぶ代アニメドラえもん最終話としても放送された話である、「45年後・・・」*12から、あのセリフを引用させてもらって〆たい。

きみはこれからも何度もつまづく。 でもそのたびに立ち直る強さももってるんだよ。

私はまた一つ、ドラえもんという作品に救われたのかもしれない。

ぜひ ドラえもんプラス大長編ドラえもん、藤子F不二雄全集のKindle化も期待して筆を置こうと思う。

それではまだどこかで。

*1:ドラえもん30巻: 実物ミニチュア大百科

*2:ドラえもん40巻: モーテン星

*3:ドラえもん37巻: たまごの中のしずちゃん

*4:ドラえもん40巻: おこのみ建国用品いろいろ

*5:ドラえもんプラス2巻: 光ファイバーつた

*6:ドラえもん38巻: 物体変換銃

*7:ドラえもん32巻: 超リアル・ジオラマ大作戦

*8:ドラえもんプラス5巻: ペンシル・ミサイルと自動しかえしレーダー

*9:原作ではしずかちゃんでなく、しずちゃんである

*10:ドラえもん8巻: 人間製造機

*11:これの所為か、努力せずに諦めている人をちょっと嫌いになった(藤子先生ごめんなさい。)

*12:ドラえもんプラス5巻: 45年後・・・

Vim でjsonファイルを開いた時にチラつくダブルクォーテーションを何とかしたお話。

Vimjsonファイル編集時にダブルクォートが非表示になり、カーソル行だけダブルクォートが表示される(表示される分だけテキスト位置がズレる)現象が。

f:id:Yuzuemon:20150115034524p:plain

こんな感じ。ぶっちゃけかなりイライラする。

んーvim-jsonも入れてないけど何でだろ?ということで /Applications/MacVim.app/Contents/Resources/vim/runtime/syntax/json.vim を確認してみた所、

" NOTE that for the concealing to work your conceallevel should be set to 2

" Syntax: Strings
" Separated into a match and region because a region by itself is always greedy
syn match  jsonStringMatch /"\([^"]\|\\\"\)\+"\ze[[:blank:]\r\n]*[,}\]]/ contains=jsonString
if has('conceal')
> syn region  jsonString oneline matchgroup=jsonQuote start=/"/  skip=/\\\\\|\\"/  end=/"/ concealends contains=jsonEscape contained
else
> syn region  jsonString oneline matchgroup=jsonQuote start=/"/  skip=/\\\\\|\\"/  end=/"/ contains=jsonEscape contained
endif

とドンピシャな箇所がありまして、:help conceallevel してフムフムとしながら.vimrcに

autocmd Filetype json setl conceallevel=0

と書いたら解決した。

MacVimでは、Custom Version 7.4 (KaoriYa 20141204) にアップデートしたタイミングでjson.vimが更新されていた。

Conceal機能

concealは隠す、秘密にするの意。

要はjsonでいうダブルクォーテーションのような、構文としては必要だが視認性を妨げるものを非表示にできる機能のようだ。

後述の concealcursorconceallevel で挙動を変更可能。

concealcursor

カーソル行のテキストを Conceal表示するモードをセットする

concealcursor 説明
n ノーマルモード
v ビジュアルモード
i 挿入モード
c コマンドライン編集

試しに :set concealcursorしてみたらiがセットされていた。

conceallevel

conceallevel 説明
0 通常通り表示(デフォルト)
1 conceal対象のテキストは代理文字(初期設定はスペース)に置換される
2 conceal対象のテキストは非表示になる
3 conceal対象のテキストは完全に非表示

conceallevel=0 が従来通りの表示。

conceallevel=2 だとカーソル行がダブルクォーテーション分だけずれて見づらい。

conceallevel=1 はスペースで置き換わっているため、ズレがなくカレント行にした時のみダブルクォーテーションが表示され、スッキリしていて見易いので最終的にはこっちを使うことにした。

まとめ

最終的には以下の設定にして様子見することにした。

if has('conceal')
  set conceallevel=1 concealcursor=
endif

本来は conceallevel=0 concealcursor= の為、今回のMacVimのアップデートで同症状が出る人は限られると思う。

自分の環境では別のpluginの設定箇所で set conceallevel=2 concealcursor=i をしていたのでトラブルに見舞われた。

もし同様の症状が起きていたら、どこかでconceallevelを変更してないか確認してみるといいですね。

JSHintオプション一覧を纏めてみたお話。

JSHintオプション一覧

JSHint Options Reference を纏めてみた。(JSHint 2.5 現在)

ドキュメント化されてない隠しオプションも一部含みます。

制限系オプション

trueにするとチェックが厳しくなる

オプション名 default
bitwise true ビット演算子の禁止
camelcase false camelCase, UPPERASEの強制
curly true if, forのブロックスコープを必ず{}で括るよう強制
eqeqeq true 比較演算子は==, != ではなく===, !==を強制
forin true for...inループ内でhasOwnPropertyでのチェックを強制
immed false 括弧で括られていない無名関数の即時実行禁止 e.g. (function () { } ());
indent 4 インデント
latedef false var前の変数使用禁止 "nofunc"で関数は除外
maxcomplexity false 循環的複雑度 - Wikipedia の制限
maxdepth false 最大ネスト数の制限
maxerr 50 最大エラー数の制限
maxlen false 一行の長さ制限
maxparams false 関数の最大引数の制限
maxstatements false 関数ごとの最大行数の制限
newcap false コンストラクタ名は大文字に強制 e.g. new F()
noarg true arguments.caller and arguments.callee の使用禁止
noempty true 空ブロックの禁止
nonbsp true   の禁止
nonew false new の禁止
plusplus false ++, -- の禁止
quotmark false クォートの規定 true: どちらかに規定, false: 規定しない, "single", "double"
strict true use strict;の強制
trailing true 行末のホワイトスペース禁止
undef true 未定義変数の禁止
unused true 未使用変数を警告

許可系オプション

true にするとチェックが甘くなる

オプション名 default
asi false セミコロン抜けチェックの無効化
boss false ==を書くべき所に = が書いてないかチェック無効化
debug false debugger の許可
eqnull false == null の許可
es5 false ECMAscript 5 メソッド許可
esnext false ECMAScript 6 メソッド許可
evil false evalnew Function() の許可
expr false ExpressionStatement(式文) の許可
funcscope false 関数スコープチェックの無効化
globalstrict false グローバルな"use strict"許可
iterator false iteratorプロパティの許可
lastsemic false ワンライナーで書いた時の最後のセミコロン抜けチェックの無効化
laxbreak false 安全でない改行の許可
laxcomma false , を先に書くスタイルの許可
loopfunc false 関数の無限ループチェックの無効化
moz false FirefoxのJS1.7で追加されたメソッド許可 (有効時はesnextより優先される)
multistr false 改行を\でエスケープしていない複数行テキストのチェック無効化
proto false proto の許可
scripturl false javascript:...はじまりのURLの許可
shadow false 定義済み変数の再定義を許可
smarttabs false タブとスペースの混在許可
sub false 連想配列の厳密な呼び出し方チェックの無効化 e.g. person['name']とperson.name
supernew false new function () { ... };new Object; の許可
validthis false コンストラクタ関数以外の関数内でthis利用許可(strict modeの時のみ)

ライブラリ/フレームワークオプション

使用するライブラリ類をtrueにすると、そのライブラリで使用しているグローバル変数警告が出なくなる

オプション名 default
browser false ブラウザ (window, document, etc)
couch false CouchDB
devel false 開発, デバッグ用変数 (alert, confirm, etc)
dojo false Dojo Toolkit
jquery false jQuery
mootools false MooTools
node false Node.js
nonstandard false 非推奨のグローバル変数(escape, unescape, etc)
phantom false PhantomJS
prototypejs false Prototype.js
rhino false Rhino
worker false Web Workers
wsh false Windows Scripting Host
yui false Yahoo User Interface

レガシー

将来的に削除予定のオプション

オプション名 default
nomen false 末尾が`の変数名を禁止
onevar false 変数宣言を関数の最初に書くことの強制
passfail false 警告があった時点でJSHintを止める
white false Douglas Crockford氏のJavaScriptコーディングスタイルになってるかチェック

グローバル変数の追加オプション

オプション名 default
globals {} {}内にグローバル変数を定義できる. e.g. "globals": {"AjaxZip3":false}

設定例

.jshintrc として上記設定をjson形式で保存し、好きな所に配置する。 .jshintrc の利用される順序は、

  1. カレントディレクトリにある.jshintrc
  2. 親ディレクトリにある.jshintrc、なければ親の親ディレクトリにある.jshintrc、なければ親の親の親の(以下略)
  3. $HOME/.jshintrc

となっている。

{
  "maxerr"        : 50,

  // Enforcing
  "bitwise"       : true,
  "camelcase"     : false,
  "curly"         : true,
  "eqeqeq"        : true,

  // Custom Globals
  "globals"       : {"CKEDITOR": false, "jQuery": false}

}

公式のサンプルはこちらにあるよ jshint/.jshintrc at master · jshint/jshint · GitHub

Vim でオレオレ PHPCS とオレオレ PHPMD でチェックをするお話。

Syntastic を入れる

Vim の Syntastic で PSR-2 コーディング規約でチェックするお話。 - ゆず日記 を参考。

オレオレPHPCS

PSR-2 ベースに今回はルールを作るものとする

% pear install PHP_CodeSniffer # PHP_CodeSniffer インストール
% pear config-show # インストールパス確認
% cd ~/.phpbrew/php/php-5.4.29/lib/php/PHP/CodeSniffer/Standards

# PSR2 のルールセットをコピーする
% cp -r PSR2 OREORE
% vi OREORE/ruleset.xml

今回は試しにPSR-2ディレクトリをまるごとコピーして、インデントが2スペースでも警告が出ないようインデントルールを無視するセットを作ってみる。

# 2行目のrulesetをOREOREに
<?xml version="1.0"?>
<ruleset name="OREORE">
 <description>The OREORE coding standard.</description>


# 59-64行目をコメントアウト
 <!-- Code MUST use an indent of 4 spaces, and MUST NOT use tabs for indenting. -->
 <!-- <rule ref="Generic.WhiteSpace.ScopeIndent"> -->
  <!-- <properties> -->
   <!-- <property name="ignoreIndentationTokens" type="array" value="T_COMMENT,T_DOC_COMMENT"/> -->
  <!-- </properties> -->
 <!-- </rule> -->
 <!-- <rule ref="Generic.WhiteSpace.DisallowTabIndent"/> -->

% phpcs --standard=oreore ./hoge.php # インデント警告が無くなる。

.vimrc にはこんな感じで実行時のオプション指定できる。

" ルール名に依る指定
let g:syntastic_php_phpcs_args='--standard=oreore'

今見たら、--standardにはパス指定も可能だったので

" パスに依る指定
let g:syntastic_php_phpcs_args='--standard=$HOME/.conf/phpcs/ruleset.xml'

とかにして置くと dotfiles リポジトリや開発環境のリポジトリのルールセットを参照して警告がセットできる。

もっと詳しくは Manual :: A sample ruleset.xml file that describes all features of the format を見よう。

オレオレPHPMD

PHPMD - PHP Mess Detector の通りにインストール

Syntastic のデフォルト設定はこんな感じ syntastic/phpmd.vim at master · scrooloose/syntastic · GitHub

'post_args': 'codesize,design,unusedcode,naming'

phpmd にはもう1つ controversial-rules と呼ばれるルールがあるようだが、その名の通り賛否両論なようなので有効にされてないというところか。

なお、変数名が3文字以下の場合、 $db とかでも警告が出てウザいので、試しに naming ルールを消してみる。

let g:syntastic_php_phpmd_post_args='codesize,design,unusedcode'

これでVimを起動すると、naming ルールの警告がでなくなる。

ただし、これは naming-rules に載っている他の naming ルールも出なくなる。例えば、getX() などのメソッドなのに boolean を返すメソッドは命名箇所に isX() とかにしろよという警告がでなくなるため、厳密にやるのであれば creating-a-ruleset を参考に独自 ruleset を指定するべきである。

"べきである"とか言っちゃったのでやってみた。

let g:syntastic_php_phpmd_post_args='$HOME/.conf/phpmd/ruleset.xml'

とかにして、ruleset.xmlに以下のように書いてみる。

<?xml version="1.0"?>
<ruleset name="OREORE PHPMD rule set" xmlns="http://pmd.sf.net/ruleset/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd" xsi:noNamespaceSchemaLocation=" http://pmd.sf.net/ruleset_xml_schema.xsd">
<description>
  OREORE PHPMD rule set
</description>
<rule ref="rulesets/codesize.xml" />
<rule ref="rulesets/design.xml" />
<rule ref="rulesets/unusedcode.xml" />
<rule ref="rulesets/naming.xml">
  <exclude name="ShortVariable" />
  <exclude name="LongVariable" />
</rule>
</ruleset>

<exclude name="ShortVariable" /> でルールセット内の特定ルールのみ無効にしている。

もし無効にするのでなく、閾値を変更するには以下のようにするといい感じ。

<rule ref="rulesets/codesize.xml/CyclomaticComplexity">
  <priority>1</priority>
  <properties>
    <property name="reportLevel" value="5" />
  </properties>
</rule>