$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

最近読んで面白かった漫画

最近読んだおもしろ漫画を紹介。

百万畳ラビリンス

このマンガ大賞2016か何かで10位以内に入っていたので見つけた作品。ゲーム好きの女の子が変な世界に迷い込んでいって、いろいろ試しながら世界のことを知っていく構成になっている。これまでRPGゲームとかをやっていると、その流れがRPGゲームに近くて面白かった。最後の最後は個人的にはあまり好きではなかったけど、それでも面白いのでオススメ。2巻完結。

ボールルームへようこそ

本屋でなんとなく見つけた競技ダンス漫画。たぶん僕は「これまで何もできなかったけどいきなり才能を発揮するパターン」のような王道パターンが結構好きみたいで、これもそういう感じだった。題材としてはジャンプの「背筋をピンと」と同じだけど、こちらは絵によって躍動感を伝えてくる感じが好き。既刊8巻。

外天楼

それでも町は廻っている」の石黒正数さんの漫画。5巻以内のおすすめ漫画スレみたいなので見つけた気がする。一件短編の繰り返しの様に見えるんだけど、実は一つのストーリーというのが面白くて良かった。1巻完結。

かくかくしかじか

ママはテンパリスト」とか「東京タラレバ娘」を書いている東村アキコさんの漫画。創作ではなくてエッセイで、作者が師事していた先生コミックエッセイのようなもの。1巻から先生がずっと言っている「描け」という言葉が巻を追うごとに全然違う言葉に聞こえてきて最後泣きそうになった。5巻完結。

九井諒子さんの作品


ダンジョン飯」で有名な九井諒子さんの短編はどれも面白かった。個人的には「ひきだしにテラリウム」が一番好き。「ひきだしにテラリウム」は現実では日常ではないファンタジーやSFの世界の日常、みたいなのを描いている感じで、それぞれが独特だし、考えさせられるものもあって良い。あと絵がうまくて、それぞれの短編で絵柄がぜんぜん違うというのもすごい。

HUNTERxHUNTER

ひさびさに連載が再開したHUNTERxHUNTER。なんかひさびさに1巻から読みたくなって5巻まで読んだけどやっぱり面白い。面白い漫画は第1話から面白くてすごい。久々に読んでると、小学校の時に友達の家で初めて読んで、一心不乱に数巻読んだことを思い出した。

宇宙兄弟

結構前に途中まで読んでいたので、読むのを再開した。これも主人公ムッタが才能を発揮しているところが好き。ようやく主人公が宇宙に行ってくれたのだけど、宇宙に行くまでの間もずっと面白かったし、これからも買い続けそう。

ちひろさん

会社の同僚のブログで見つけた漫画。元風俗嬢がお弁当屋でバイトしながら町の人と関わっていく話。絵が独特で良いな―と思って1巻買って読んでみたけど、ちひろさんのキャラに引きこまれて一瞬で読んでしまった。

弟の夫

このマンガがすごい!とかで見つけた作品。ゲイをテーマにした漫画。自分は同性愛とかに偏見を持っていないつもりでいたけど、この漫画を読んでいると、確かに自分も主人公と同じ反応をとってしまうかもしれない...という気持ちにさせられた。対照的にこの漫画の主人公の娘の反応こそが偏見がないということなのだろうなと考えさせられたのが良い。他にも自分が思い描いていたゲイはこんな感じだろうか、というイメージとは違うことが漫画中の会話から伝わってくるのも良かった。

BLUE GIANT

ジャズ漫画。なんか夜中に間違って買ってしまって気づいたら朝4時とかだった。漫画で音を表現するのが難しい中でいろいろと表現してるのもすごいけど、20ページくらい全く文章がなく日常的なシーンを書いていたのが印象に残っている。

響 小説家になる方法

これもこのマンガがすごい!で見つけたもの。純文学がテーマの漫画。主人公が小説の天才みたいな設定なのだけど、そのいろいろな意味での異端性が伝わってきて良い。また主人公よりも、その先輩で友人であるキャラクターの心の動きが、「天才ではない人」を代弁していて、個人的にはこの漫画の中で一番おもしろい。

ハピネス

吸血鬼の漫画。絵がうまい、表現がうまい、そしてそれぞれの巻の最終話の引きが強い。とにかく次が早く読みたい。

志乃ちゃんは自分の名前が言えない

「ハピネス」と同じ作者の漫画。吃音症、いわゆるどもりという病気をテーマに書いている。作者がその病気であったために、その症状や辛さなどがよく伝わってくる。漫画は「自分の興味がなかったこと」を突然教えてくれるから嬉しい。

まとめ

最近面白かったのはこんな感じ。もっといろいろ読みたいので、おすすめ作品あったら教えて下さい。

「オブジェクト指向入門 第11章 契約による設計」を読んだ

これまでの続きで、「オブジェクト指向入門 第11章 契約による設計」を読んだ。「オブジェクト指向入門 第6章 抽象データ型」を読んだ - $shibayu36->blog; で紹介した抽象データ型と同様に非常に面白い章であった。プログラムの設計を考える時に役立ちそうな知識が自分の中で言語化されたので、今後の設計時や、コードレビューの指摘の時にも役に立ちそう。


この章は信頼性の高いソフトウェアを記述するために、表明という概念を解説してくれる。例えば、ソフトウェアが正しいとは何かについての議論や、事前条件・事後条件・クラス不変表明のような表明の種類の説明、それぞれの表明の役割、表明の使いみち、表明の監視などについてのトピックがあった。

僕はこの章を読んでいて、

  • 事前条件と事後条件による義務と利益
  • 表明を満たさない時にどうするべきか

という部分が印象に残ったので、この話題について自分なりの言葉でメモしておく。自分なりの言葉でメモしているので、もしかしたら解釈が間違っている場合があるので、その時は指摘してもらえるとありがたいです。

事前条件と事後条件による義務と利益

事前条件、事後条件とは

まず事前条件とは、あるルーチンを適切に機能させるための制約を表したものである。例えばSTACKの例であれば、「スタックがいっぱいならばputは正しく機能しない」などといったものがある。抽象データ型のPRECONDITIONSに対応している。

事後条件とは、事前条件を満たした状態でルーチンを呼んだ場合に、そのルーチンが実行した後に保証される性質を表したものである。例えば、putの実行後には、「スタックは空でない」、「スタックの一番上の要素は今putされたものである」、「要素数は1増加している」という性質を満たす、というもの。抽象データ型の記述のFUNCTIONSやAXIOMSという部分を実装に落とし込んでいくと、事後条件となる。

事前条件と事後条件による義務と利益

ルーチンに対して事前条件と事後条件を定義するということは、ルーチン(提供者)と、それを呼び出すもの(顧客)の間で契約を結んだ、と言える。契約文書に直すと、「もし顧客が事前条件を満たした状態でルーチンを呼んでくれるならば、事後条件を満たす状態を最終的に実現することを約束します」という契約を結んでいるということになる。

契約を結ぶということによって、顧客側、提供者側、双方に義務と利益を与えることとなる。顧客側、提供者側のそれぞれの義務と利益は以下のとおり。

  • 顧客(ルーチンを呼び出す側)は、事前条件に示されている制約を必ず満たした上でルーチンを呼び出す義務がある。その代わりにそのような呼び出しをすれば、ルーチンの実行後必ず事後条件のような状態になることを提供者が保証してくれるという利益を得られる。
  • 提供者(ルーチン)側は、事前条件が満たされた状態でルーチンが呼ばれたならば、ルーチンの実行後に必ず事後条件のような状態にする義務がある。その代わり、顧客が事前条件を満たしてくれるため、その状態は保証されていると考えて、様々な状態について考慮する必要がなくなり、ルーチンをシンプルに記述できるという利益を得られる。

このように契約を正しく結ぶことによって、顧客側、提供者側双方に利益をもたらすことが出来る。またきちんと義務を明文化することにより、バグがあった時にどちらの責任かをはっきりさせることが出来る。バグが起こった時に、もし顧客が事前条件を満たさない状態でルーチンを呼んでいるならそれは顧客の責任であり、事後条件を満たさない状態で返しているならそれは提供者の責任である。


この辺りの説明を読んだ時、僕はこの考え方は非常に役に立つと感じた。設計の時に、渡ってきたものが妥当かをどこまでチェックすべきか、どちら側でチェックするかなど迷うことが多い。そのようなときは、まず顧客側、提供者側ではっきり区別し、この事前条件というものを考え、どちらに持たせるかということを考えれば良さそう。さらに事後条件をはっきりと考えることによって、顧客側で結果について無駄にチェックするということも防げる。

また顧客、提供者の関係はクラス間だけではなく、同じクラス内のメソッド間にも適用できるように見え、それもどちらで保証するかを考えるための参考になりそうと思った。

表明を満たさない時にどうするべきか

事前条件や事後条件、またクラス不変表明といった表明の種類は分かった。ただ、それを見た時に「ではそれが満たされない時にどうなると良いのか」という疑問を持った。特に事前条件を満たさなかった場合でもルーチンを実行してしまうと、そのルーチンを実行しただけでデータが壊れてしまう場合があるが、どうすればよいのか。データが壊れる例としては、配列の範囲外アクセスをすることにより、別のメモリ空間を壊してしまう、などといったことである。

このことについては、「実行時に表明を監視する」という項に言及があった。表明を定義したら、それを監視する必要があり、その監視をどこまでするかは実際のクラステキストを変えなくても、設定ファイルなどにより変更できるべきと書かれていた。例えば設定ファイルで全ての表明をチェックするようにしておくと、事前条件・事後条件・クラス不変表明などが満たされない場合に全て検知してくれる。このようにしておくことで、環境によって事前条件のみチェックするようにするなどの事ができる。

またさらに、ではどこまで監視を有効にしておくべきかという疑問も持った。監視することは信頼性を向上させる一方でコストの問題(パフォーマンスの劣化など)にもつながるので、どこまでやるべきなのか。これに関しては以下の様なことが書かれていた。

  • 開発時やデバッグ時には全ての表明を監視させるべきである
  • 効率重視のアプリケーション領域(100万分の1秒の時間が惜しいとか)で、システムを十分信頼している場合は、全ての監視をとっても良いだろう
    • ただし、表明を監視しなければ、システムを十分に信頼することはめったに出来ない(実行中に無限にある可能性をテスト時に網羅することは不可能だが、意図しないケースでも正しく動くことを信頼できるのか)
  • 事前条件のみをチェックするだけでも、ルーチンの呼び出しで悲劇的なことになる(例えばデータを壊すとか)ことを防ぐことができ、さらにそのチェックコストは大変少ないので、一つの可能性として面白い
    • クラス不変表明は全てのメソッド呼び出しでチェックしなければならないのでコストが大きい


以上のことが書かれていたので自分が疑問に思っていたことはある程度解消された。しかし監視でエラーが検知された時に実際にシステムはどうなれば良いのか、についてはこの章で特に扱われていなかった。その部分に関してはまだわからないが、次の章のタイトルが「契約が破られるとき:例外処理」というものなので、そこで明らかにされるだろう。

まとめ

今回は「オブジェクト指向入門 第11章 契約による設計」を読んで、自分なりに印象に残ったところをまとめてみた。「第6章 抽象データ型」の章のもう少し実践よりの章という位置づけで、6章と同じくらい参考になった。特に事前条件・事後条件といった表明の話と、その表明を満たさない時の選択肢について解説されていた部分が面白かった。

次の章は「契約が破られるとき」にどうするかが書かれているようなタイトルなので、楽しみに見たいと思う。また早く継承に関する章が読みたい。

Emacsで英和辞書や和英辞書をすぐに引けるようにしたい

ちょっと調べてたら、

というような記事を見つけて、google-translate.elというのを見かけたので導入してみた。特にrubikitchさんの記事は自動で日本語か英語かを判定してくれるので、そのまま導入した。

動作

キーバインドはほぼ一つで以下の動作が出来ます。
f:id:shiba_yu36:20160529122730g:plain

インストール

M-x package-install google-translateで。

設定する

(require 'google-translate)
(require 'google-translate-default-ui)

(defvar google-translate-english-chars "[:ascii:]"
  "これらの文字が含まれているときは英語とみなす")
(defun google-translate-enja-or-jaen (&optional string)
  "regionか現在位置の単語を翻訳する。C-u付きでquery指定も可能"
  (interactive)
  (setq string
        (cond ((stringp string) string)
              (current-prefix-arg
               (read-string "Google Translate: "))
              ((use-region-p)
               (buffer-substring (region-beginning) (region-end)))
              (t
               (thing-at-point 'word))))
  (let* ((asciip (string-match
                  (format "\\`[%s]+\\'" google-translate-english-chars)
                  string)))
    (run-at-time 0.1 nil 'deactivate-mark)
    (google-translate-translate
     (if asciip "en" "ja")
     (if asciip "ja" "en")
     string)))

(push '("\*Google Translate\*" :height 0.5 :stick t) popwin:special-display-config)

(global-set-key (kbd "C-M-t") 'google-translate-enja-or-jaen)

このgoogle-translate-enja-or-jaenはほぼrubykitchさんのをパクりました。ただ、regionを指定していない時の挙動は現在位置のセンテンスより現在位置のワードのほうが嬉しかったので、(thing-at-point 'word)を利用。

これで、

  • 英語か日本語かは自動判定してくれる
  • region指定してC-M-tすると、そのregionの翻訳をしてくれる
  • region指定せずにC-M-tすると、現在位置のwordを翻訳してくれる
  • C-u C-M-tすると、自分で調べたいものを入力できる

という最高環境ができあがりました。