sh1’s diary

プログラミング、読んだ本、資格試験、ゲームとか私を記録するところ

Unity 放置ゲームにおける「日付と時刻変更」基本的な対策

f:id:shikaku_sh:20210205155735p:plain

スマートフォンの放置ゲームを作ろうと思ったら、開発者が必ず注意することになる問題のひとつに、端末の時刻設定を故意に変更するチート行為が挙がると思います。

対応策として、NTP サーバーのようなサーバー時間を取得してローカル時間を比較する方法が最も安全ですが、サーバーを用意するものコストが掛かりますし、大学などの公開 NTP サーバーを(ゲームのような)私的に利用し続ける設計も、第一からしてモラルに欠ける感じです。

そんなわけで、スマートフォンの環境設定「日付と時刻」が自動的に設定されているかどうかを確認する、というのがインディーズのゲームだとよくある対策かと思います。Android 端末においてのやり方をメモします。

f:id:shikaku_sh:20210205154244p:plain:w600
これがゴール(左:ゲーム画面、右:Android 設定画面)

対策不足の一例を挙げると、放置系ハクスラモンスターズもリリース直後は、このあたりの対策が不十分だったため、端末内の時間を進ませるだけで、大きな放置時間を作りだすチート行為が横行し、Twitter の雰囲気は淀みました。また、対策を加えていく中で、チーターも周囲のチート行為に便乗する形でチートに手を染めだしたプレイヤーもまとめてアカウント BAN(プレイ制限)になり、スタート時点の混乱は見苦しいものだった記憶があります。
ゲームの本質的な部分でないといえば、そのとおりなのですが、ゲームを楽しめる環境を維持するために必要な開発コストなのかな、とそのとき思いました。

日付と時刻の設定値を取得するネイティブプラグイン

そんなわけなので、Unity というよりも Android ネイティブプラグインを作って、Android 本体の設定値を取得します。

Android ネイティブプラグインの作り方は過去の記事「Unity アプリケーションのメモリー使用量を可視化する」などを参照してください。

今回は Android の設定「日付と時刻」から次の2つの設定値を取得するようにします。

  • 日付と時刻の自動設定
  • タイムゾーンの自動設定
  • (ここでは省略しますが、ネットワーク接続の有無も必要かと)

とりあえず、これが自動設定になっていれば、端末の放置時間を直接編集するようなチートを防ぐことができそうです。

package com.sh1.androidnativeutil;

import com.unity3d.player.UnityPlayer;
import android.os.Build;
import android.os.Debug;
import android.os.Process;
import android.app.ActivityManager;
import android.content.Context;
import android.provider.Settings;

public class SystemSettings
{
    /**
     * ユーザーが日付、時刻、タイムゾーンの自動取得設定をしているかどうかを示す値を取得します。
     * @return true = ON, false = OFF
     */
    public static boolean IsAutoTime()
    {
        final Context context = UnityPlayer.currentActivity.getApplication().getApplicationContext();
        boolean isResult = Settings.Global.getInt(context.getContentResolver(), Settings.Global.AUTO_TIME, 0) == 1;
        /*
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
        {
            isResult = Settings.Global.getInt(context.getContentResolver(), Settings.Global.AUTO_TIME, 0) == 1;
        }
        else
        {
            // API level 17
            isResult = Settings.System.getInt(context.getContentResolver(), Settings.System.AUTO_TIME, 0) == 1;
        }
         */
        return isResult;
    }

    /**
     * ユーザーがタイムゾーンを自動取得設定をしているかどうかを示す値を取得します。
     * @return true = ON, false = OFF
     */
    public static boolean IsAutoTimeZone()
    {
        final Context context = UnityPlayer.currentActivity.getApplication().getApplicationContext();
        boolean isResult = Settings.Global.getInt(context.getContentResolver(), Settings.Global.AUTO_TIME_ZONE, 0) == 1;

        return isResult;
    }
}

用意したプラグインを Unity に設定します。「Android」専用のプラグインを使うときは、Android というフォルダー名にします。詳細は「AAR plug-ins and Android Libraries」を確認します。

Assets\Plugins\Android\プラグインファイル

f:id:shikaku_sh:20210205153738p:plain
直下に置いても動きます

ネイティブプラグインを利用する Unity スプリプト

Unity の UI Text コンポーネントに結果を単純に表示するだけのサンプルです。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Profiling;
using UnityEngine.UI;

public class TimeNetworkChecker : MonoBehaviour
{
    private AndroidJavaClass _NativeClass = null;

    private const string PACKAGE_NAME = "com.sh1.androidnativeutil";
    private const string CLASS_NAME = "SystemSettings";
    private const string METHOD_AUTO_TIME = "IsAutoTime";
    private const string METHOD_AUTO_TIME_ZONE = "IsAutoTimeZone";

    [SerializeField]
    private Text _Text = null;

    private void Start()
    {
        _NativeClass = new AndroidJavaClass($"{PACKAGE_NAME}.{CLASS_NAME}");
    }

    private void OnDestroy()
    {
        _NativeClass?.Dispose();
        _NativeClass = null;
    }

    private void Update()
    {
        var text = "";

        try
        {
            var isAutoTime = false; 
            var isAutoTimeZone = false;
#if UNITY_ANDROID
            isAutoTime = _NativeClass.CallStatic<bool>(METHOD_AUTO_TIME);
            isAutoTimeZone = _NativeClass.CallStatic<bool>(METHOD_AUTO_TIME_ZONE);
#endif
            text = $"Time:{isAutoTime}, TimeZone:{isAutoTimeZone}";
        }
        catch(Exception ex)
        {
            text = ex.Message;
        }

        if (_Text != null)
        {
            _Text.text = text;
        }
    }
}

Android の APK をうまく出力できないとき

f:id:shikaku_sh:20210205153427p:plain:w600
エラーウィンドウ

Native プラグインは、指定する APK のバージョンでないと出力の際にエラーになります。Unity かプラグインのバージョン指定を変更します。

f:id:shikaku_sh:20210205153642p:plain:w600
プラグインの最小バージョンを変更する例

動作のテスト

こんな感じです。各画像の左がアプリの動作画面で右が設定。

f:id:shikaku_sh:20210205154234p:plain:w600f:id:shikaku_sh:20210205154239p:plain:w600f:id:shikaku_sh:20210205154244p:plain:w600
動作テスト

環境設定に応じて、表示の true, false が切り替わっています。わりとよさそうですね。

対策の発展形

日付と時刻の設定が自動であること+ネットワーク接続が出来ているなら時刻はおよそ正常です。しかし、ゲームを起動するときに必ずネットワーク接続が必要になるのも困りものです。地下鉄に乗る合間にプレイしたいといったニーズに不都合です。

なので、オフライン状態でも特定条件なら可とするアイデアを考えてみます:

  • オンライン状態の確認を取得している時刻がある
  • その時刻から 24 時間以内であること(またはオフライン状態になって 24 時間以内)

フローチャートにするとこんな感じでどうでしょうか。仮のログイン期間を 24 時間以内としたのは、日本を基準にした世界のタイムゾーン)の差ぐらいまで、というアイデアから。

f:id:shikaku_sh:20210205155515p:plain

タイムゾーンの変化で時間が進んだときは、それだけ放置したと認めて、また日本に戻ってきたときに戻った時間だけ停止時間が発生する。 時間が戻ったときは、その時間だけ停止時間が発生するけど、また日本に戻ってきたときに停止時間分は放置した時間として戻ってくるはずです。およそ問題なさそう。

国外に退出して戻ってこない、またはその逆みたいなケースを例外としています。

サンプル

GitHub に「unity-network-time-check」というサンプルを公開しています。

参考

Unity エディタ拡張でスクリプトファイルのテンプレートを作成する

Unity のスクリプトファイルを標準の作り方だと「Create/C# Script」をつかうと思いますが、十分なフォーマットとは言えないですよね。ほかにも

  • 文字コードを OS にあわせたい
  • MonoBehavior を継承しないクラスでいいときがある
  • ときどきは最初から UniRx を using していたい

デフォルトは、Windows だと「Unityのインストールフォルダ\Editor\Data\Resources\ScriptTemplates」を利用します。

などなど、ひとつのテンプレートファイルでは要望を解決できない。

そんなわけで、ケースバイケースで生成するスクリプトファイルの雛形は、いくつかの選択があったほうが望ましそうです。そこで複数のスクリプトファイルを選択・生成するエディタ拡張を作成しました。

f:id:shikaku_sh:20210121190532g:plain:w600
やってみた雰囲気

わりといい感じ。最後に、アセットをパッケージ化して使い回せるようにしておきました。

スクリプトテンプレートを呼び出すエディタ拡張

まず、スクリプトファイルを保存するためのメニューを追加します。

f:id:shikaku_sh:20210121184545p:plain:w600
オリジナルのメニューを追加します

こんな感じで、「Create」メニューの中に Add Script Files というメニューを追加して、3パターンのファイルを選択できるようにしてみました。 パターンファイルは、別に用意しておいてパッケージに含めておけば、各プロジェクトで使い回せる&微調節も可能です。

使い回すことを目的にしているので、サンプルだと名前空間 (Sh1ch.Plugins) を設定しています。名前空間の指定がないと衝突が発生する恐れがあるので。(通常のプラグインは、名前空間を利用します)

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;

namespace Sh1ch.Plugins
{
    static internal class MenuItemSettings
    {
        private const string PLUGIN_PATH = "Assets/Plugins/ScriptFilesFromTemplate/";
        private const string NEW_FILENAME = "NewFile.cs";

        private const string MENU_ITEM_ROOT = "Assets/Create/Add Script Files/";

        private const string SimpleScript = "Simple Script";
        private const string MonoBehaviour = "MonoBehaviour";
        private const string MonoBehaviourWithUniRx = "MonoBehaviour (UniRx)";

        [MenuItem(MENU_ITEM_ROOT + SimpleScript)]
        private static void CreateSimpleScript() => CreateScriptFile("SimpleScript.txt", NEW_FILENAME);

        [MenuItem(MENU_ITEM_ROOT + MonoBehaviour)]
        private static void CreateMonoBehaviour() => CreateScriptFile("TemplateMonoBehaviour.txt", NEW_FILENAME);

        [MenuItem(MENU_ITEM_ROOT + MonoBehaviourWithUniRx)]
        private static void CreateMonoBehaviourWithUniRx() => CreateScriptFile("TemplateMonoBehaviourWithUniRx.txt", NEW_FILENAME);

        private static void CreateScriptFile(string templateFileName, string newFileName)
        {
            ProjectWindowUtil.CreateScriptAssetFromTemplateFile(System.IO.Path.Combine(PLUGIN_PATH, $"Templates/{templateFileName}"), newFileName);
        }
    }
}

拡張メソッドとしてのポイントは、ファイル追加を Unity の用意してくれているメソッド ProjectWindowUtil.CreateScriptAssetFromTemplateFile で済ませています。これ便利でテンプレートファイルを読み込んで、スクリプトファイルを追加してくれます。あと、既定の予約文字を使うことで自動的に変換してくれたりします。

  • #SCRIPTNAME#
  • #ROOTNAMESPACEBEGIN#
  • #ROOTNAMESPACEEND#
  • #NOTRIM#

#ROOTNAMESPACEBEGIN##ROOTNAMESPACEEND# はセットで、名前空間を作成します。名前空間のテキストは「Edit>Project Settings>Editor>Root namespace」 を参照しています。

f:id:shikaku_sh:20210126120217p:plain:w600
名前空間の設定

なお、プラグインはデフォルトの Assets\Plugins を利用しました。UniRx, Unity for Github なども同じやり方です。

Priority の設定

MenuItem 属性のパラメーターに Priority を設定することで、右クリックメニューの表示する並び順を変更することができます。

private const int SCRIPT_PRIOPRITY = 30;

[MenuItem(MENU_ITEM_ROOT_SCRIPT + SCRIPT_SIMPLE, priority = SCRIPT_PRIOPRITY)]
private static void CreateScript_SimpleScript() => CreateScriptFile("SimpleScript.txt", NEW_FILENAME);

設定変更しても反映されないことがあり、その際は Unity を再起動すると反映できました。

また、Priority の値は Unity のメニューの表示が変更されることもあって、確定させないほうが無難です。とりあえず、現状だと 30 に設定することで、「C# Script」の上に separator を挟んで表示することができるのでよい感じです。(おそらく、10 以上 priority が離れているため、separator が自動生成される)

テンプレートファイルのサンプル

こんな感じにしました。 #region の追加なんかもオススメです。

チームだと1ファイルのコード量がわからなくなる傾向があるので、region は注意が必要です。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;

#ROOTNAMESPACEBEGIN#
    /// <summary>
    /// <see cref="#SCRIPTNAME#"/> is the class that inherits from <seealso cref="MonoBehaviour"/> class.
    /// <para>
    /// <see cref="MonoBehaviour"/> is the base class from which every Unity script derives.
    /// </para>
    /// <see href="https://docs.unity3d.com/ScriptReference/MonoBehaviour.html">Unity Documentation - MonoBehaviour</see>
    /// </summary>
    public class #SCRIPTNAME# : MonoBehaviour
    {
        /// <summary>
        /// <see cref="Start"/> is called on the frame when a script is enabled just before any of the <seealso cref="Update"/> methods are called the first time.
        /// </summary>
        private void Start()
        {
            #NOTRIM#
        }

        /// <summary>
        /// <see cref="Update"/> is called every frame, if the <seealso cref="MonoBehaviour"/> is enabled.
        /// </summary>
        private void Update()
        {
            #NOTRIM#
        }
    }
#ROOTNAMESPACEEND#

Unity Package の作成

メニューから「Assets>Export package」を選択して、プラグインを作成します。この際は、プラグイン以外のファイルは除外するようにします。

f:id:shikaku_sh:20210121185418p:plain
あらかじめファイル選択してからメニューを操作すること

サンプル

参考

うたわれるものロストフラグ マツリ「花札」対策と攻略

1月なので 🎴 (花札)。

個人的に博打が好きじゃないので、正直どうかと思っていたくせ毎月必要になる報酬が大きくなってしまい、これはもうしっかりやらざるをえない……というか、本編のゲーム以上にマニュアルでやらざるをえないという意味不明な状況にあると思います。

そんなわけで、個人的な「マツリ」攻略をメモします。五光役は難しいですが、1週間に1回くらいは出せてるんで基本的なポイントをメモ。

やってみている感じだと毎月に数回程度は、150点くらい勝ち越す打ち方ができています。五光の10回クエストも全部マツリで達成しました。(というか、数十回は達成してる)

f:id:shikaku_sh:20210119104340j:plain:w580f:id:shikaku_sh:20210119104345j:plain:w580
花札好きでもない人にはつらいよな

所要時間は 5 ~ 20 分。通勤時間に処理できるとよし。(最近は通勤自体なくなったので、家でのんびり消化してるけど)

基本的な花札の流れ

基本的に運ゲー。なんで、ダメなときはどうやってもダメ。とくにマツリは1手目、2手目で即あがりになるケースがあり、体感値でも不快な程度に多いです。

このゲーム、相手も札を叩きつけるようにして取るんで気分わるい。

ともかく、ここでの花札は規定の局数(うたわれは3局)が終わったときに、相手より1点でも多くの点をとるゲーム。でも、うたわれるものデイリー花札は「3,000木札回収するまでが、ひとつの花札」ですよね。

個人的なおすすめは

  1. 10~500 木札以下になるまでオートで花札を終わらせる(おすすめは、50勝できていないキャラのクエスト自動消化)
  2. 100 枚単位の自動対局(対戦無し)でで木札と交換して残り取得できる枚数を 10~90 枚にする
  3. 「マツリ」と花札をして大きく勝つ

デイリー花札のポイントは、最後に大きく勝利することで一日の獲得上限の「3,000木札」を大きく超えて木札を獲得することができます。

最後の1回、マツリに大きく勝って大きく木札を取る。これ。

対マツリ

個人的にポイントは、こんな感じに今は思っています。

  • 1局、2局目で6点以上勝っているのが大切

マツリは通常だと「こいこい」をしません。しかし、3局目は同点になるまで、こいこいし続ける機械になるので、これを利用します。

具体的には、すこし無茶な状況でも「光札」「赤札」「青札」「猪鹿蝶」を待つような、手の遅い打ち回しが可能になります。

もっと言えば、相手のよい手を妨害しつつ、よい上がり手を狙った札の取り方ができる。

2局の間に6点以上の差をつけておけば、マツリお得意の酒構成も5点止まりなんで、「光札」「赤札」「青札」「猪鹿蝶」など狙えるところを狙いつつ、カス、タン、タネのどれかをじわじわ育てる方針。(点数に差がなければ、普通に打つしかない)

逆に素早くタンやタネなんかであがると、こいこいで相手に高い点入るケースをフォローしないといけないので積極策ではない。開始時点での手札がつまらないとき以外はやりたくない。

得点で勝ってる3局目は横綱ができる。だから、1局2局での得点がほしい。理想はこの形です。数千点を荒稼ぎする。

f:id:shikaku_sh:20210119104644j:plain:w580
月に1回あればいいなくらいのあがり

一局目で大きく勝っても、これくらいの点数になるんで面白くない。

f:id:shikaku_sh:20210119104726j:plain:w580f:id:shikaku_sh:20210119104730j:plain:w580
わりとよくあるあがりかも

花札の基本

花札の札の枚数は、1~12月にそれぞれ札が4枚ずつの合計48枚です。自分と相手と場に8枚x3の合計24枚消費された状況からはじまります。

この時点で、お互いにすべての札のうち33%(16/48)の札を把握しています。

山札には残り24枚(50%)の札が残っており、最大で16枚めくられます。残8枚(17%)はこの局では絶対に登場することがありません

そこに含まれてしまうと、どうしようも作れない役がある。残念。

最大で38枚(先攻)~40枚(後攻)くらいになるけど、相手よりも先に上がるゲームなんで、通常はここまでもつれにくいです。

1、2局目はマツリの打ち方を真似るとよいです。ただ、確定して取れる札は急いで取らないでいいです。なるべく残すことで、確定で取れる=確定で上がれる、こいこいできるシーンを作っておけると思います。(点数が欲しいので、確定こいこいが正義すぎる)

でも、3局目はそうではない。こいこいして消費できるやり方を知っていると、もうすこし長い局を打つことができます。(ただ、あっさり酒を引けたりすると、速攻がいいケースも当然ある)

細かい部分だと、タネとタンどっちも同じくらい伸ばせやすさがあるなら基本はタンかも。枚数の確率からするとタンは10枚でタネは9枚。複数役からもタンは赤・青あるのと、タネの複数役は猪鹿蝶と酒絡みで人気になりやすい。酒を引けてない+猪鹿蝶に目がないとうま味が薄い。

個人的に一番ムカついているのはマツリじゃなくて、毎日通常戦闘どころか調伏連合編成にすら顔を出さず、遠征にも適正がないのに、花札よわすぎ主人公。歴代最カス。

花札

f:id:shikaku_sh:20210119104910j:plainf:id:shikaku_sh:20210119104913j:plainf:id:shikaku_sh:20210119104916j:plainf:id:shikaku_sh:20210119104919j:plainf:id:shikaku_sh:20210119104922j:plainf:id:shikaku_sh:20210119104925j:plain
慣れるまで違和感のある札も

個人的に12月の光札かどこかウィツァルネミテアにしてほしかった。専用役はあってもよかっただろう。

2020 年 会社勤めの買ってよかったモノ、まとめ

12月です! なので、風物詩をば。

よく覚えてなかったので amazon の履歴と過去記事なんかのまとめ。個人的な記録にもなったので満足。

資格関係

色彩検定3級 本試験対策

色彩検定3級 本試験対策

今年は、例によって COVID-19 の影響でほとんど資格試験を受けに行く機会がありませんでした。個人的には、Python あたりも行きたかった気がしています。

私物

雑多に。今年はやはりテレワークの影響で家の環境にテコ入れした部分が目立つ気がします。クッションもゲーミング用のちょっといいやつに更新。背もたれクッションも検討中です。

とくに、わかりやすいのは指紋認証。顔認証ではないです。マスクをつけることが増えたので顔認証ではない方法を選択しました。あとは、メインの鞄を GREGORY に更新して、パーカーとダウンを NorthFace に更新しました。ほんとはマフラーも更新したかったんですが、売り切れてしまって失敗しました。ふるさと納税関係も今年はしっかりできたのはよかったな。

最近読んだものだけ。テレワークにあわせてゼロトラスト関係の知識を多く勉強した気がします。オンラインセミナーでもかなり増えた印象。個人的に、今年は歴史関係の読書があんまり充実していないな。失敗の本質くらいしか読めていないかも。

総括

今年は例年と比べて2倍の記事を書くことができました。例年は年末ごろに時間があったのですが、今年は COVID-19 の影響でまったく逆になった感じもあります。

会社への通勤量が減って、ライフワークバランスが本格的に考えられるようなったのはよいのですが、原因が原因だけに複雑です。なにか別の困難を乗り越えるような条件でもないと、この社会は従業員のライフスタイル改善に取り組めないものなのか、という体験でもあって複雑でした。

資格勉強は、取り組むことが減って(試験自体が中止になったり、受験場へ行くのが難しかった)色彩検定くらいになりましたが、Unity をそれなりに触ってみることができたのはおもしろかった。来年も継続したいと思っています。

私生活では、日常的な運動量が減って数キロ体重が増えました。ただ、ジムへ行く頻度自体は(下期にかけて)増えたので筋力量は増えつつあるんだけど、重たくもなってしまった感じ。

来年も資格試験はすこし控えて、Unity や技術系の参考書を読む時間を増やそうかな、と思っています。

履歴

Word ですこしデザインのよい資料を作成する

Word で資料を作成する際に、すこしデザイン性を上げるためのメモです。

なんだかんだで今も一部の資料を作る際は(慣例などによって)、Word が推奨されたりしますよね。といって、Word を雑に使うとヒドい見た目の資料になるので、ちょっとは見た目に気をつけよう、という内容です。

個人的には、word でマニュアルを作成するよりも InDesign を使ったほうがきれいでよいと思うし、簡単なものでいいなら markdown を使ったメモでいいと思う。

目次のデザイン

Word の目次は、単純にいれるだけだとシンプルな出来になってしまうので、個人的に好みではないです。でも、ユーザー設定の目次で、アウトラインレベルを「3」つくらいまでちゃんと自分で設定すれば、それなりに格好がつけられると思う。

f:id:shikaku_sh:20201221151731p:plain:w600
Word で生成した目次

これくらいの出来でも、参考書と見比べてもそれほど見劣りしないと思います。

  • 目次1
    • フォント:BIZ UDP ゴシック 12pt 太字
    • 段落:前と後に1行
    • 網掛け:下段に太さ 1pt のラインを追加
  • 目次2
    • フォント:BIZ UDP ゴシック 10pt 太字
    • 段落:前と後に 0.5 行
  • 目次3
    • フォント:游ゴシック 10pt、文字色(緑を使った)
    • 段落:左を2文字空ける

タブとリーダーの設定は、あとから「スタイル」で追加したほうが良い気がしています。「スタイルの右下」の矢印からスタイルの一覧を表示します。

f:id:shikaku_sh:20201221151919p:plain
ここ

スタイル書式の詳細 SHIFT + F1 を表示して、最後の微調節。

目次は他を完成させてから、最後に調整すること。「目次の更新」F9 で目次をすべて更新すると適用したスタイルが初期化されてしまう。

両面印刷用の余白設定

両面印刷するときの個人的デフォルトで、パンチ穴を空ける用です。

f:id:shikaku_sh:20201221151952p:plain:w300f:id:shikaku_sh:20201221151949p:plain:w300
両面印刷の設定例

ヘッダーとフッターに入れた文字との距離が 1.5 行くらい空いているものを好みます。ただ、デフォルトだとかなり広いので、すこし狭く設定しているかもしれません。

ヘッダーフッターの設定

ページ番号を挿入します。自動入力よりもマニュアルでフィールドを追加したほうがよい(できるようになったほうがよい)と思います。

f:id:shikaku_sh:20201221152140p:plain
こういうやつ

単純な資料だと { PAGE } だけでいいと思います。ときどき、「現在ページ / 総ページ」という書き方が好まれることがあります。このときは「 { PAGE } / { = { NUMPAGES } - n } 」の形式がよいと思います。この場合は現在ページよりも総ページは小さいフォントサイズにします。(現在ページも本文より小さいフォントがよいと思います)

f:id:shikaku_sh:20201221152159p:plain
複雑なページ表示

f:id:shikaku_sh:20201221152309p:plain
ヘッダーはこういうのが好き

個人的には、フッターにページ番号を入れて、ヘッダーには章などを表すテキストを入力します。

本文のデザイン

f:id:shikaku_sh:20201221152405p:plain:w600
本文は、左インデント6文字の例

本文は、左インデントを「6文字」追加するか、段落なしで書きます。文のはじまりを1文字落とすかどうかは好みですが、最近は落とさない設定も多くなっていると思います。(手元にあった参考書をいくつか参考にしました)

左インデントを「6文字」空けていると、あとでアイコンを強調しやすいと思うのです。また、余白部分が増えることでデザイン的な読みやすさがある気がしています。

f:id:shikaku_sh:20201221152448p:plain:w500
図を入れたときの雰囲気

「2行段組」も好みますが、Word は段組みがイマイチなので、段組みをするなら InDesign のほうがいいかも。

フォントの設定

本文のフォントは、こんな感じが今は好きです。

  • 本文「游ゴシック」、「ヒラギノ角」
  • 題名「BIZ UDP ゴシック」
  • ID など「HGP ゴシック M」
  • ページ番号「Lucida Console」など

参考

色彩検定3級 受験と合格

色彩検定(3級)を受験して合格したので結果を記録します。昨日、結果速報が公開されて、自分の試験番号も掲載されていました。

f:id:shikaku_sh:20201217183825j:plain:w600
届いた 12/17 日でした

これで、デザインに関して発生しがちな豪腕な立ち回り(個人的好き嫌い)に振り回される程度が軽減できそうです。

試験日は11月8日。結果発表が一か月後の12月7日。試験日を予定するのも面倒だし、結果が出るのも遅いというのが、どうにも。

f:id:shikaku_sh:20201207163226j:plain:w500
会場の建物。結構きれいなところでした

色彩検定PDCA 自己評価とかやってるけど、ここまで自画自賛してるの初めてみた。

f:id:shikaku_sh:20201207163412j:plain:w500
受験前の雰囲気

ちなみに、受験者の多くは珍しく女性でした。年齢層も若い傾向でしたが、30~40歳くらい人もそれなりにいる感じ。開始直前になるとわりと席は埋まった感じです。

そんな感じで、というわけじゃないけど、あんまりやる気がでていませんでした。でも、色彩のことはかじっておきたい。公式の参考書を買うモチベーションにも欠けたので、古本屋で 90円で購入(10% オフ だった)した試験対策本ひとつで受験してきました。(なお、公式資料は一度も手に取っていません。ちなみに熊谷 佳子さんの参考書でした)

ただし、当日の会場は公式の教科書を開いているひとが多かった中で、古い古い参考書を開くのは「勇気」が高まった。

ともかく、受験するために勉強したやりかたをメモ。

色の名前をおぼえる(期間中:全体)

ある程度覚える必要があるけど、モーブ菖蒲色のように似たような色の中から正しい色味を選択できないとダメ。なので、問題形式のアプリを使おう。

色相番号+トーン番号で記憶するとか、そういうのを通勤電車とか寝る前に毎日2,3回、10問クイズをやるようにする。問題となる可能性が高いので、やればやるだけ基本点が見込めるのでオススメ。

注意する必要があるのは、カラーチャートのように厳密な数値(例:#FF0000)に基づいたものよりも、それぞれの人が持つ色のイメージを包摂していることから、色相番号+トーン番号のような値で理解しておくといいかも。

桜色(さくらいろ)だと、つぎの4つの色が例に挙げられているなど、厳密で一意な RGB 値で表現されないです。

色相環を覚える(期間中:全体)

3級は、色相環マンセル表色系とは別で 24 個の色に分ける。R, yR, rO, O,... というやつ。小文字は修飾子(y:黄色味の~)のようになってて、大文字はその色自体を表す(BG:青緑)ので、「なんとか色の~」にはならない。

たまにペンタブでお絵描きする人なんかは、色彩検定を受けて一番メリットがあるのここかも。色相環の理解が深まる。長波長(赤系)~短波長(青系)とかも、理科に興味なかった人は理解の支えになるね。

桜色は「ごくうすい、紫みの、赤」と修飾語表現されます。このあたりから色相・明度・彩度を評価できるような理解が大切になっていると思います。

  • 「ごくうすい」明度:高、彩度:低
  • 「紫みの」色相を表す
  • 「赤」有彩色であること、基本色を表す

JIS Z-8102(物体の色名)も勉強はじめの参考にしました。ただし、修飾語や区分は PCCS とすこし違うので留意しましょう。

参考書の使い方雰囲気

私の参考書はほとんど問題形式になっていました。実試験でも簡単な出題が結構あるので、それは参考書でざっくりとカバーできてそうでした。

現在最新の色彩検定の参考書は、問題を結構掲載しているのも(ざっくりと立ち読みで)確認しました。なので、問題になっているポイントを押さえる傾向なのかも。

一応、重要になっている用語の意味は、誤解なく理解して自分の言葉で説明できるのが大切っぽいです。デザイン系なので、感覚的に捉えてしまいがちなんですが、それを体系化するのが本来の目的だったはず。理屈で解けることを増やす努力が尊い。とりあえず次のあたりで引っかかるところは無いようにしよう。

  • 色相
  • 彩度
  • 明度

どれかの要素を上下された色はどれか、みたいなのがわからないとダメ。ここがポイントだと思う。

最後まで問題を解ける割合がイマイチなら、色の名前をしっかりと覚えましょう。覚える数も決まっているし、色の名前を答えるタイプの問いはやっとくだけの問題なので、悩む余地がすくないのでオススメ。(詰めてやると苦痛だけど)

似たような色の中から選択する形式になっていても、ミスを減らす努力をしておくとベストです。私は、どうも彩度を見るのが下手だったので、色相と明度から選択肢を減らしてから彩度の評価をしていました。

問題用紙の中では、(問題の都合などで)何個かは色の名前を(問題が)示したものも当然あります。その色は自分の頭の中にある予定した色味と一致しているかはポイントです。そこから類推して別に問われる問題の色味が何色か、で考えたほうがよさそうです。当日の試験会場の照明・印刷の具合などで、アプリ・対策本と若干見え方・色味が違うかもしれないからです。

参考

色彩検定 公式テキスト 3級編 (2020年改訂版)

色彩検定 公式テキスト 3級編 (2020年改訂版)

  • 発売日: 2019/12/26
  • メディア: 単行本(ソフトカバー)

色彩検定3級 本試験対策

色彩検定3級 本試験対策

Visual Studio フォルダー検索で対象のファイルを除外条件に指定する方法

Visual Studio のフォーラムに「フォルダ検索で、対象のファイルに除外条件を指定したい」という質問が挙がっていました。

*.vb*.cs は検索対象にしたいが、*.Designer.vb*.Designer.cs は検索対象にしたくない

回答がついていたのですが、あまり適当なものとは思えず、自分なりにやってみたところの答えをメモ。

「検索と置換」でファイル種類でフィルタリングする

f:id:shikaku_sh:20201205151223p:plain
フィルタリング例

こんな感じで、「ファイルの種類」でフィルターを設定する。「!*\bin*;」のように「!」をつけることで排他条件になっている。(と思われる)

.Designer.cs ファイルと AssemblyInfo.cs ファイルを除外した cs ファイルの検索だとこんな感じでどうだろう。

  • !AssemblyInfo.cs;!.Designer.cs;.cs;

ショートカットキー

検索と置換

  • Ctrl + F
  • Ctrl + H

フォルダーを指定して検索

  • Ctrl + Shift + F
  • Ctrl + Shift + H

フィルタリングして検索したほうが使い勝手いいなら、shift キーも押して検索するようにしよう。

参考

Visual Studio パーフェクトガイド

Visual Studio パーフェクトガイド

Visual C# 2019パーフェクトマスター

Visual C# 2019パーフェクトマスター

プログラマーのためのVisual Studio Codeの教科書

プログラマーのためのVisual Studio Codeの教科書