目標を詳細に定義する

久しぶりにブログ書きます。
目標達成に関して役立ちそうな知見をちょいとばかり。

この記事を書くきっかけ

今年2018年の抱負、一応あるにはあるものの、ぼんやりしてて成就しそうにないなーと思ったので。改めて目標達成に向けての体制作りをしようと思い、書き連ねます。

この記事で言いたいこと

記事タイトルにあるように、「目標を詳細に定義すること」が目標達成上の重要行動であることです。
以下に理由を書きます。

背景

僕は高校時代から空手を始め、今も健康維持のため続けております。現在は全国大会クラスの選手を何人も輩出している道場にお世話になっております。その道場には月1ぐらいで、これまたド偉い空手の先生がご指導にいらっしゃいます。今回の記事は、この先生の指導方法から得られる知見です。

空手(伝統派空手)についてアレコレ

ここで空手ってどんなもの?という説明を。
僕が嗜んでいる空手は、バシバシ直接打撃アリのフルコンタクト空手ではなく、伝統的な技や技術を念頭に鍛錬する「伝統派空手」と呼ばれるものです。狭義では「寸止め空手」?
2020年オリンピックで採用されたのもこの伝統派空手です。

競技には2種類あります。
組手(くみて):テキトーに書くと所謂二人でバトルする形式。寸止め。所定位置に技が決まるとポイントが入り、勝敗を決する。
形(かた):仮想敵を想定し、決められた手順で技を繰り出す。どれだけ技が正確か、意味を理解した技を体現できてるかにより勝敗が決する。

この内、今回は形の話をベースに進めていきます。

技の正確さ、合理性

前述の通り、形は技の正確さや、意味を理解した技を体現しているかを競う競技です。

圧巻!空手少女、高野万優ちゃんの型 Mahiro Takano, Amazing Karate Girl

ここでちょっと物理のお話。
直立している相手に自分の突き(パンチ)や蹴りの威力を100%伝えるにはどの入射角が適切か?
f:id:minodriven:20180102112707j:plain
上図にもあるように、90度が正解ですね。赤矢印に示すような斜めの入射角では威力のベクトルが垂直方向に逃げてしまいます。実際突きの軌道も、基本的には90度(地面と水平軌道)であることが求められます。更に移動しながらの突きとなると、突きの軌道が上下に揺れ動かないよう、腰の高さを維持しながらの移動を要します(これがまた非常にムズカシイ)。
空手の技や動きは全てこのような物理的合理性のカタマリです。世間的なイメージとしてあるような気合いや根性の世界などでは決してなく、極めて物理的合理性が求められる理系向きスポーツなのです。

先生の教え

で、ここで冒頭の偉い先生の話です。
合理的な動作を求められる中、先生は言います。
「あなたが今やっているその動き、どうなったら理想なのか明瞭に定義できていますか。説明できますか。
「脚の向き、股関節の開き、筋肉のねじり具合、膝の位置、重心の位置、腕の角度、技の始動…。それぞれどうなっていれば理想なのか、そしてなぜそれが理想なのか理由を説明できますか。」

先生は更に言います。
「理想が明瞭に詳細に定義できているのであれば、私がいなくても一人で練習できる。理想に向かって練習すればいいんですから。たとえスランプに陥ったとしても、理想と比べてどう違うのか自分自身でチェックできる利点があります。
「逆に定義できていない内に練習するのは非常に良くない。なぜか。理想に近づいてるのか遠ざかっているのか判断できなくなるから。運良く近づければそれで良いかも知れないが、悪化した場合に悪化したことを自分自身で気付けない。更に悪化して悪循環に陥る可能性がとても高い。ゆえに理想形を描けてない状態での練習は、上達どころか逆に動作が悪くなる原因になる。練習しない方がマシ。」

このように、上達に向けて理想を明確に詳細に定義することの重要性を先生は説きます。
ちなみに先生のご指導もあって僕は空手道二段の獲得に至りました。

ここから得られること

2018年新年が明け、TwitterのTLにも新年の抱負が散見されます。「絵を上手く描けるようになりたい」「制作中のゲームを完成させる」「○○の技術を身につける」etc...。こうした様々な抱負や目標についても、空手の先生の教え、つまり「目標を詳細に定義する考え方」が活かせるのではと思います。

例えば「テストで90点以上とりたい」という目標があるとします。
その目標に向けて漫然と勉強するのではなく、

  • 出題範囲はどこか
  • どのような問題か、出題パターン等それぞれ全て列挙把握しているか
  • 各問題に対し、どう解答すれば正解となるのか
  • 難問は何に関するものか、その解答方法は
  • 各問題に対する、効率的な学習方法は
  • 苦手箇所の把握、及び対策は
  • 学習の障害要素(例えばゲームしたいネットしたい等の誘惑)への対策は

少なくとも以上を予め詳細に策定することが、目標達成に向けて肝要でしょう(よっぽど天才じゃない限り)。

僕の抱負

「クリーンアーキテクト(綺麗なソフトウェア設計をするエンジニア)として成果を出す」
……を一応抱負(?)としたいのですが、

  • そもそもクリーンアーキとはどのようなアーキテクチャを指すのか
  • テスト容易性、保守性、変更容易性、拡張性、疎結合性以外に目指す指標はあるか、そもそも全て達成可能なのか
  • クリーンアーキ設計する上での知識、知見を全て網羅しているのか
  • これらの知識知見、指標を踏まえた成果とは具体的にどのようなものか
  • 会社業務上出せる成果なのか

等々、お恥ずかしながら詳細策定が進んでない状態なので、全然エラそうなことを言えないのであります。
ですが、自分の強みや性格的特性とも併せてこれから策定を進め、着実に実行に移そうと思います。
まずは策定を第一のゴールとして進めます。

まとめ

目標達成のために必要なこと

  • 目標(理想)と目標達成に必要な事柄を明瞭に詳細に定義すること
  • その理由も併せて定義すること

世の中には様々なノウハウがありますが、まずはこれに基づき邁進していきたいと思います。

Yanfly先生の反撃カスタマイズプラグイン(YEP_X_CounterControl)を試してみた

ツクール界隈で有名なYanfly先生のプラグインです。
Yanfly先生の反撃プラグイン(YEP_X_CounterControl)に関してGoogle先生に尋ねてみたものの国内で誰も記事にしていないようなので私が記事にしてみます。
但しプラグインの全ての機能ではなく、あくまで私がゲーム内で実装した機能のみの解説なのでご了承下さい。

実装したゲームはこちらです。
minodriven.hatenablog.com

どういうプラグインなの?

ツクールMVではキャラやステートに対して「反撃率」なるパラメータを設定でき、敵から物理攻撃されたときにこの「反撃率」に応じて相手にカウンター攻撃を仕掛けることができる仕様になっております。
但しこの反撃仕様は限定的で、反撃可能なのは物理攻撃のみ、反撃時の攻撃はスキル0001番、即ち通常攻撃固定です。自由度がありません。

  • 魔法攻撃に対して反撃できるようにしたい
  • 反撃用の技は、通常攻撃じゃなくて魔法を使いたい
  • いくら反撃してくる敵といっても、主人公の必殺技は反撃されたくないなぁ…

などなど、こんな望みを叶えてくれるのが本プラグインです。

プラグインインポート方法

先生のサイトにもありますが、本プラグインはツクールMVのプラグイン管理画面においてYEP_BattleEngineCoreの下に配置しなければなりません。また、同様にYEP_X_BattleSysATBやYEP_X_BattleSysCTBを利用する場合もこれらの下に配置する必要があります。即ち、順番的にはこうなります。

  • YEP_BattleEngineCore (←必須)
  • YEP_X_BattleSysATB / YEP_X_BattleSysCTB (←使いたいならこの順で配置)
  • YEP_X_CounterControl (←本プラグイン)

反撃に使うスキルを指定する

ではでは早速使っていきましょう。
まずは簡単に反撃用の技をデフォルトの通常攻撃ではなく、使いたいスキルに指定する方法です。
反撃実験君として、彼に反撃してもらうことにしましょう。
f:id:minodriven:20160522220906p:plain
彼には、主人公側の攻撃を受けたときに所定のスキルで反撃してもらうことにします。

まずは反撃率を設定します。実験用に分かりやすく100%とします。
f:id:minodriven:20160523202044p:plain
次に反撃に使うスキルを設定します。ここでは下の写真にあるような0518番のスキル「炎上」にしてみます。
f:id:minodriven:20160523202546p:plain
反撃実験君カウンターマン(敵キャラ)のメモ欄に以下のように記述します。

<Counter Skills: 518>

早速動作確認。主人公側から反撃実験君へ攻撃。
f:id:minodriven:20160523204521p:plain
下写真のようにスキル「炎上」を使って反撃してきました。ね?簡単でしょ?
f:id:minodriven:20160523204607p:plain
このCounter Skillsタグは、アクター、職業、武器、防具、敵キャラ、ステートに対して設定可能です。
例えば「カウンターの構え」なるステートにCounter Skillsタグを設定し、なんらかのスキルやアイテムによって「カウンターの構え」ステートを付与するようにすれば、このステートが有効な間特定スキルで反撃を仕掛ける、ということも実現可能になります。

どんな攻撃に対して反撃するか指定する

さて、上記の設定のままでは、残念なことに必中だろうが魔法攻撃だろうがどんな攻撃に対しても反撃してきます。たまったもんじゃないですね!
物理攻撃にだけ反撃させたい、魔法攻撃にだけ反撃させたい。このように所定の条件を満たす場合にのみ反撃させるよう指定することができます。
これはスキル単位で設定可能です。反撃に用いるスキルのメモ欄に以下のように記述します。

<Counter Condition>
Magical Hit
</Counter Condition>

このように書くと、魔法攻撃を受けた場合にのみ反撃が発動します。必中や物理攻撃では反撃しません。
Counter Conditionタグには複数の条件を指定可能で、その場合指定した条件を全て満たす場合に反撃します。

<Counter Condition>
Magical Hit
Single Target
</Counter Condition>

例えば上記の条件では、「魔法攻撃で且つ単体攻撃である場合」に反撃が発動します。
Counter Conditionタグに指定可能な条件ワードの例を以下に示します。より詳細にはYanfly先生のサイトをご参照下さい。

条件ワード 意味
Certain Hit 必中攻撃を受けた場合
Physical Hit 物理攻撃を受けた場合
Magical Hit 魔法攻撃を受けた場合
Counter Hit 反撃を受けた場合
Not Magical Hit 受けた攻撃が魔法攻撃でない場合
Single Target 単体攻撃を受けた場合
Multi Target 全体攻撃など複数対象の攻撃を受けた場合

主人公の必殺技などに反撃させたくない場合

例えば主人公サイドのスキルに必殺技に相当するスキルを用意し、ここぞという場面で必殺技を使いたい!というとき、折角使った必殺技が敵に反撃されてしまっては幻滅もいいとこですよね…。というワケで反撃させない方法です。相手に反撃させたくないスキル、例えば必殺技に相当するスキルのメモ欄に以下のように記述します。

<Cannot Counter>

このタグはアイテムにも適用可能で、例えば爆弾のような、相手にダメージを与えるアイテムに適用するのもいいでしょう。

ダメージを受けて反撃するか、回避して反撃するか

敵の攻撃を受けてから反撃するか、それとも回避してから反撃するかを指定できます。
反撃用スキルのメモ欄に以下のように記述すると、ダメージを受けた後反撃します。

<Hit Counter>

反撃用スキルのメモ欄に以下のように記述すると、回避して反撃します。

<Evade Counter>

上記タグを指定せずとも本プラグインパラメータ「Evade Counter」にて、ダメージ受けて反撃するか回避して反撃するか、いずれかをデフォルト指定できます。
f:id:minodriven:20160525221432p:plain
プラグインパラメータ「Evade Counter」でfalseを指定すると、ダメージを受けてから反撃、trueを指定すると回避してから反撃がデフォルトとなります。
このパラメータをデフォルトとして、スキル個別にHit Counter、Evade Counterで指定する仕組みとなります。

説明は以上です。何かご質問がありましたら分かる範囲で回答致します。



再度お知らせですが、私の作ったゲーム「Bug Hunter」をやってみて下さい。
できればレビュー頂けると嬉しいです!
minodriven.hatenablog.com

基本情報技術者試験、応用情報技術者試験 合格体験記

昨年(2015年)の春、秋にそれぞれ基本情報技術者試験(FE)、応用情報技術者試験(AP)を合格したので、備忘録的に書いておきます。

そもそもキッカケは?

システムアーキテクト(SA)を取得したいと思ったからです。私も会社では立場的に中堅になりかけてますし、部署の先輩がSAを持っていたので願わくば昇進のために取っておこうかなと。
但し、情報処理資格は何ひとつ持っていなかったため、SA受ける以前に最低でもFE、APは取っておかんといけんやろ…と思い、腕試し的に(?)FE、APに挑みました。

いつから勉強始めたの?

FE、APどちらも試験日の4、5ヶ月前ぐらいから始めました。

いつ勉強したの?

毎日勉強しました。但しいくつか工夫しました。
午前問題と午後問題、どのように学習の時間配分をするか考えました。
午後問題は休日である土日それぞれ2~3時間充てました。学習にある程度まとまった時間が必要であったためです。
午前問題は平日を充てました。ひとつの設問が小さく、学習時間を結構フレキシブルに変更可能なためです。但し仕事から帰ってきてからはほとんど頭が働かないため、普段より1時間程早く起床して、会社に行く前の朝の1時間を午前問題の学習に充てました。

どうやって勉強したの? -午前問題-

もっぱらここの過去問Webアプリを利用しました。
www.fe-siken.com
www.ap-siken.com
出題年度やジャンルを設定できて、更に成績も記録できるので非常に便利です。
但し、何点か工夫しながら学習しました。

★出題年度を直近過去4年分(8回分)に絞った

過去問を解いてみて分かったことは、古すぎる年度の問題は近年ほとんど出題されない、ということでした。
後述するように出題パターンはだいたい何パターンかに決まっており、それらパターンを網羅するには直近過去4年分で十分だと判断しました。

★全分野満遍なくでなく、分野ごとに集中した

ある年度の過去問を全て満遍なく解いていくやり方ではなく、
分野ごとに(ネットワーク、システム開発技術など)直近過去4年分集中して取り組む方法でいきました。これには理由があります。

まず、全分野いっぺんに網羅しようとすると、覚える量が多すぎてほとんど記憶に定着しません。
特定分野に関し直近過去4年分の過去問をひたすら解きました。
上記のサイトでは過去問が分野ごとにまとめられており、便利です。
分野別過去問題 テクノロジ系|応用情報技術者試験.com
似たような問題にひたすら取り組むことになるので、繰り返し効果により記憶に定着しやすかったです。

正答率が8割ほどになったら次の分野を学習します。
というのも、どうやっても苦手な問題が出てくるので、解けずにこだわっていたら次の分野に進めなくなります。
苦手問題は後で集中的に対策するとして、さっさと次の分野へ進めます。

分野は、自分の得意なものから順に学習するのが良いと思います。
私は得意とするシステム開発技術から始めました。
こうして、ひとつの分野がだいたいできるようになってきて、「この分野だけは大丈夫!」と自信がついてきました。

★理解はテストファースト 正解に必要な知識だけを持ってくる

上記のようなやり方で、まずいきなり過去問へ挑みます。間違ってもいいです。
間違うことで、正解にどんな知識がどれぐらい必要なのかが把握できます。
正解に必要な知識について、上記Webアプリの解説なり、Google先生で調べるなりします。
半分ぐらいはこの2つの方法で十分でしたが、中にはそれでもよく分からないものがあったので、さすがに市販の教科書を参考にしました。
どれでも良いですが、僕が使ったのは技術評論社の教科書です。

図説もあるので分かりやすいです。
が、あくまで過去問が先です。
教科書からスタートするのは全然オススメできません。教科書には、正直問題を解くには不要とも思えるような詳細な記述が莫大にあります。教科書から始めても解き方はほとんど身につきませんし、まして全部覚えるのは時間の無駄です。

過去問を解く
 ↓
不正解だった/分からなかった
 ↓
正解に必要な知識を教科書から得る

まさにテストファーストですね。
この手順が短時間で効果を上げる王道だと思います。

出題形式にはパターンがある

過去問を何度も解いてると分かりますが、各分野ごとの出題形式は数パターンに限られています。いわゆる頻出問題というヤツですね。
低頻度の問題もある程度おさえておく必要はありますが、まずは頻出問題をおさえておくだけで8割カバーできると思います。
何度も解いて慣れてくれば、問題文の始めを読んだだけで答えが分かるようになってきます。
このように答えが即分かるレベルにまで昇華させるのがひとつの指標だと思います。
実際本番試験でもかなり時間的に余裕が持てました。午前問題で時間が足りない、ということはありませんでした。

午前問題 学習仕上げ

以上のように分野単位で順番に制覇したした後に、苦手問題に集中的に取り組みました。
全分野制覇後、今度は覚えたことを忘れないように年度単位で過去問を解いていきました。午前問題に関しては試験本番までこれを繰り返しました。
午前問題の学習方法に関しては以上です。

どうやって勉強したの? -午後問題-

午後に関してはiTECの参考書を使いました。
午前問題を解けるだけの基礎知識があれば、午後問題ははっきり言って国語の問題だと思います。
詳細な対策方法はiTECの参考書に譲るとして、これも基本的にテストファーストで、まずは設問を先に読んで、設問に必要な解を問題文から探してくる、という作業になります。
午前問題とは異なり出題パターンあるというわけではないので、こればかりは参考書のヒントを頼りに慣れていくしかないなという感触でした。実のところ過去問を解いても最後まで正答率が安定しませんでしたし、不安といえば不安でした。

そして結果は

こうなりました。
f:id:minodriven:20160522165240p:plain
f:id:minodriven:20160522165232p:plain

うーん午前は我ながらと思いますが両方とも午後は最後まで安定しませんでしたね、ちょっと危なかったですけどなんとか合格です。

合格して何か変わった?

知識としては、ソフト開発に関して不足分を少し補えたかな、だいたい広く浅くカバーできたかな、という印象です。ITエンジニアのくせしてネットワークやDBが苦手だったので、そのへん補えた感触。

「資格取ったら激烈に仕事ができるようになった!!」というのはないです。
「資格取ったらソフト開発スキルが上がって開発中のソフトウェアの品質がめちゃめちゃ上がった!!」というのももちろんないです。ソフトウェア技術は、やはり資格とは別にリファクタリング手法や設計手法等身に付ける必要があります。それに関しては私が制作したゲーム「Bug Hunter」をやって頂ければ、少しは体験できる(?)かと思います。是非やってみて下さい。
minodriven.hatenablog.com

社内立場的にも何も変わりませんでした。昇進昇給もなし。資格も結局仕事の成果を出すための材料のひとつに過ぎないわけですね。
一応受験料だけは支給されましたが。

最後に

こんなかんじでシステムアーキテクト取得の下準備は整いました。
SAも同様に効率を考えしっかり計画を立てて挑みたいと思います。

「Bug Hunter」 ツクールMVでゲーム制作しました。

f:id:minodriven:20160516104843j:plain

【作品概要】
迫り来るソフトウェア不具合に打ち勝つことができるか。
ITエンジニアとして様々なソフト開発スキルを駆使し、ソフトウェアバグを退治していくのが貴方の使命です。

【作品の特徴】
・クエスト型RPGです。作中内の部長から依頼を受けて遂行し、報酬を得る仕組みです。
・倒した敵から得られる「知識アイテム」を素材に、より強力なスキルを習得することで強くなっていきます。
・また、高価な武器を購入し装備することで、より強力な能力を使えるようになります。
ロマサガのようなLPシステムを採用しております。
・FFシリーズのようなATBシステムを採用しております。

f:id:minodriven:20160516104937j:plain
※知る人ぞ知る、巷で有名なおじさんも出てきます…

こちらからダウンロードできます。
www.freem.ne.jp

こちらからもダウンロードできます。
freegame-mugen.jp