【C#】拡張メソッドについてのメモ

拡張メソッドについて

書き方

文字列を列挙型に変換する拡張メソッドの例

public enum Weapon {
    NONE = -1,
    HINOKINO_BOU,
    IRON_SWORD,
    EXCALIBUR,
}

public static class StringExtension {
    public static Weapon ToWeapon(this string self) {
        switch (self) {
            case "ひのきの棒":
                return Weapon.HINOKINO_BOU;
            case "鉄の剣":
                return Weapon.IRON_SWORD;
            case "エクスカリバー":
                return Weapon.EXCALIBUR;
        }
        return Weapon.NONE;
    }
}

呼び出し側

string weaponName = "エクスカリバー";

weaponName.ToWeapon();  // Weapon.EXCALIBUR

注意

nullを拡張メソッドに通すことができるが、内部でエラーする可能性がある

using UnityEngine;

public static class GameObjectExtension {
    public static Weapon ToWeapon(this GameObject self) {
        return self.name.ToWeapon();  // selfがnullの場合にnameにアクセスできない
    }
}
GameObject obj;

obj.ToWeapon();

対処法

  • nullの可能性がある変数などでは拡張メソッドを呼ばない
  • 拡張メソッド内でnullチェックを行なう
using UnityEngine;

public static class GameObjectExtension {
    public static Weapon ToWeapon(this GameObject self) {
        if(self != null){
            return self.name.ToWeapon();
        }
        else{
            return "";
        }
    }
}

参考リンク

https://ufcpp.net/study/csharp/sp3_extension.html

【グラブル】ストイベ編成

記録用

条件など

  • オメガ武器は渾身+奥義上限
  • コスモス武器はAT
  • 有利舟、炉あり
  • サポ石鰻で1番チェインの少ない編成
  • 玉0琴3

対有利

※ビストロフェードラッヘ(2018/10/31~2018/11/9)での編成

VH

f:id:hetima333:20181102220311p:plain

f:id:hetima333:20181102220704p:plain

サポ石鰻の場合、ヨダ奥義で倒せる

AT時は鰹召喚不要

EX

f:id:hetima333:20181102220340p:plain

f:id:hetima333:20181102220534p:plain

サポ石鰻の場合、ヨダ奥義で倒せる

HELL

f:id:hetima333:20181102220406p:plain

f:id:hetima333:20181102220448p:plain

サポ石鰻の場合、ヨダ奥義で倒せる

等倍

イベント来たら追記します

非有利

イベント来たら追記します

最後に

みんな、鰻凸ろう!

【VSCode】VSCode+C#を利用しているときに出てくる警告を消す

VSCode + Unityを利用しているときに出てくるこれ↓を非表示にする

Some projects have trouble loading. please review the output for more details.

VSCodeのsetting.jsonに以下を追加する

"omnisharp.disableMSBuildDiagnosticWarning": true

何故か日本語の情報がなかった(ヒットしなかっただけかも)ので

参考リンク

Add option to disable "some projects had problem opening" warning popup · Issue #2110 · OmniSharp/omnisharp-vscode · GitHub

【Discord】24時間365日動くDiscordのbotを作ってみる(eris+heroku)

botの準備

下記のリンクからbotを作成します https://discordapp.com/developers/applications/

Create an applicationからappを作成する f:id:hetima333:20181013200834p:plain

BotからAdd Botを選択

f:id:hetima333:20181013200917p:plain

OAuth2からbotを選択、下に表示されたリンクにアクセスし、botをサーバー招待します

f:id:hetima333:20181013200933p:plain

開発環境の準備

Node.jsのインストール

下記のリンクからNode.jsをDLし、インストールします

https://nodejs.org/ja/

LTSと最新版とありますが、特に理由がなければLTSでOKです

MacでHomebrewなどが入っていればbrew install nodeでもOKです。

インストールが完了したら、ターミナルで

npm --version

と入力し、6.4.1のように数値が表示されればNode.jsのインストールが正常に成功しています

herokuの登録&インストール

下記のリンクにアクセスしてサイトの案内通りに(なげやり)サインアップします

https://www.heroku.com/

登録が完了したら下記のリンクからインストーラーを選択してDLします

Getting Started on Heroku with Node.js

botを制作するための作業フォルダの作成

Finderまたはターミナルから作業フォルダを作成します 場所はどこでもいいです

今回は例として/Users/XXXX/discordbotに作成しました(XXXXはPCユーザー名)

実際に作ってみる

ここからはターミナルを利用するので開いておいてください

npm install eris

erisというdiscord.jsのラッパーライブラリをインストールします

cd /Users/XXXX/discordbot

作業フォルダに移動します

npm init -y

npmの初期化を行ないます これによってpackage.jsonが生成されます

code package.json

package.jsonを開きます codeの部分はお使いのPCに入っているテキストエディタに合わせて変更してください

開いたファイルのscripts内に,"start" : "node index.js"を追記します

"scripts" : {
    "test" : "~~~~~~"
    ,"start" : "node index.js"
}

上記のコードが追記後のイメージです

code index.js

ソースファイルを開きます

ファイルが開けない場合はエクスプローラー上でindex.jsを作成してからテキストエディタで開いてください

const eris = require("eris");

// botトークンのIDをTOKEN_IDに入力します
var bot = new eris("TOKEN_ID");

bot.on("ready", () => {
    console.log("botの準備が完了しました");
});

// Discordに接続します
bot.connect();

開いたソースファイルに上記のサンプルコードを入力します TOKEN_IDは冒頭で作成したbotのページにあるものをコピーします

git init

gitを初期化します コマンドがエラーする場合は、下記のリンクからgitをインストールしてください

インストール後、ターミナルを再起動することでコマンドが利用できます(はず)

Git --distributed-even-if-your-workflow-isnt

git add . && git commit -m "initial commit"

変更したファイルのステージとコミットを行ないます

&&が通らない場合は、git add .を実行したあとにgit commit ~~を実行することでも同じ結果が得られます

  • git addでステージするファイルを選択します。今回はすべてのファイルをステージするので . としました
  • git commitでステージしたファイルをコミットします。基本的にはコミットメッセージをつけてコミットするので-m “任意のメッセージ"とします
heroku create

herokuにアプリケーションを作成します

  • Creating foo… doneというメッセージが返ってきたら作成が成功しています。この場合fooが仮アプリケーション名になります(変更可能)
  • 作成が上手くいかない場合はherokuがメンテナンスをしている可能性があります。返ってきたメッセージで検索すると解決できるかもしれません

herokuへのログインが必要になる場合はheroku loginを実行してください

git push heroku master

herokuにプッシュを行ない、それをherokuが自動的にデプロイします

botがオンラインになっていれば成功です

git add . && git commit -m "initial commit"

ソースを変更するたびに上記のコマンドを実行して開発を進めます

heroku scale worker = 1

最後に、デフォルトの状態だと少し経つとbotが停止してしまうので上記のコマンドでworkerモードに変更する必要があります

ラヴニカのギルドプレリリースに行ってきた

プレリリース初参加、カードゲームのイベントへの参加も5,6年ぶりでした

参加費など

参加費は2500円でした。

内容物は

  • プロモパック(日付入りのカード1枚付き)
  • 20面ダイス
  • ラヴニカのギルドのパック5つ

でした。また、+500円で

  • 晴れる屋スリーブ(50枚入り)
  • めもんちょ(ライフ記録用のメモ帳)
  • ボールペン

のオプションがあったのでオプション付きにしました。

流れと結果

エントリー受け付け時間になったらDCI番号と氏名を記入して参加費を払い、プレリリースにエントリーしました。

このタイミングでプレリリースセットが渡されますが、指示があるまでは開封しないようにしましょう。

プレリリースのフォーマットは「シールド」でした。 指定時間内にパックを開封してデッキを構築して、スリーブに入れて準備を行ないました。 (この時焦りからか多色土地を入れ忘れた…)

プレリリースは全3回戦(店舗や参加人数によってことなると思います)で、1戦目は勝敗に関係なく1パック、2,3戦目は勝者に1パックもらえるというものでした。

結果は3勝と良い戦績を残すことが出来ました。

初めてのイベントで緊張していましたが、参加者のみなさんが非常にフレンドリーで楽しむことができました!

対戦相手の方に《パルン、ニヴ=ミゼット/Niv-Mizzet, Parun》を借りて撮影した如何にもイゼットな記念写真 f:id:hetima333:20181001225041p:plain

使用したデッキ

(黒をメインに据えたかったけど黒のカードがクリーチャーしか引けなかった…)

土地x15

  • 《山/Mountain》x6
  • 《島/Island》x6
  • 《沼/Swamp》x3

クリーチャーx13

  • 《火小僧/Fire Urchin》x1
  • 《気難しいゴブリン/Ornery Goblin》x1
  • 《突発的な兵長/Barging Sergeant》x1
  • 《ヘルカイトの仔/Hellkite Whelp》x1
  • 《跳び蛙/Leapfrog》x2
  • 《つぶやく神秘家/Murmuring Mystic》x1
  • 《隠された影/Veiled Shade》x1
  • 《背骨ムカデ/Spinal Centipede》x1
  • 《破滅を囁くもの/Doom Whisperer》x1
  • 《ゴブリンの電術師/Goblin Electromancer》x2
  • 《夜帷の捕食者/Nightveil Predator》x1

呪文x12

  • 《彩色の灯籠/Chromatic Lantern》x1
  • 《イゼットのロケット/Izzet Locket》x1
  • 《確実な一撃/Sure Strike》x1
  • 《直流/Direct Current》x2
  • 《危険因子/Risk Factor》x1
  • 《眩惑の光/Dazzling Lights》x1
  • 《原因不明の消失/Unexplained Disappearance》x1
  • 《悪意ある妨害/Sinister Sabotage》x1
  • 《高熱仮説/Hypothesizzle》x1
  • 《反転+観点/Invert+Invent》x1
  • 《巧みな叩き伏せ/Artful Takedown》x1

デュアルモニタを認識しなくなった時の対策

現象

デュアルモニタをする際にディスプレイ1枚しか認識されない。

もちろん認識されないほうのディスプレイは通電しているし、ケーブルを接続する場所も間違っていない。

環境

対処方法

2枚のディスプレイが同じ種類のケーブルを利用している必要がある。

  1. 通常通り2枚のディスプレイにケーブルを接続し、PCの電源を入れる。
  2. 認識されたディスプレイに接続されているケーブルと認識されていないディスプレイに接続されているケーブルを差し替える。

補足

この方法だとPCの電源を投入するたびにケーブルの挿し替え作業が必要になる。

内部的には1種類のディスプレイが2つ接続されていることになっている模様。 f:id:hetima333:20180922220724p:plain

【VSCode】UbuntuでVSCodeが真っ白になってしまう問題について

環境

発生した問題

仮想マシンUbuntu環境にインストールしたVisualStudioCode(以下VSCode)を起動するとVSCodeのウィンドウが真っ白になってしまう。
f:id:hetima333:20170424025522p:plain

テキストファイルなどを読み込むと、タイトルバーの文字が切り替わるので読み込みはできている模様。
どうやら描画がうまくいっていないようでした。

原因

VSCodeがデフォルトでGPUを使って描画を行うようになっており、3Dハードウェアアクセラレーションを有効にした状態でVSCodeをGPUを使って描画することにより発生していたようです。

解決方法

3Dハードウェアアクセラレーションを無効にする

この方法はあまりオススメではありません。
3Dハードウェアアクセラレーションを無効にすると動作が遅くなったりすることがあります。

VirtualBoxから、該当の仮想マシンのディスプレイをクリックし(画像参照)、3Dアクセラレーションを有効化のチェックを外します。
f:id:hetima333:20170424012538p:plain:w300 f:id:hetima333:20170424021755p:plain:w300

VSCodeでGPUを使わないようにする

VSCodeの描画にGPUを使わないように設定することで正常に描画することができました。

$ code

通常上のコマンドで起動するところを

$ code --disable-gpu

とすることでGPUを使わないように設定して起動することができます。
ひとまずはこれで解決です。

通常コマンドで起動した際にもGPUを使用しないようにする

毎回起動する際に --disble-gpu と入力するのは面倒なのでデフォルトで --disable-gpu が入力されている状態に設定します。
設定ファイルを変更するので慎重に!

# nano /usr/share/code/bin/code

上記コマンドでnanoでVSCodeの設定ファイルを開きます。
nanoの部分はgeditなどの他のテキストエディタでもOKです。

設定ファイルを開いたら、

ELECTRON_RUN_AS_NODE=1 "SELECTRON" "$CLI" "$@"

と書かれている部分を探し、

ELECTRON_RUN_AS_NODE=1 "SELECTRON" "$CLI" "--disable-gpu" "$@"

と書き換えます。
これで code コマンドだけで実行した際にGPUを使用しないように設定できました。

Lancherから起動した際にもGPUを使用しないようにする

Lancherから起動するとVSCodeはGPUを使用してしまいますので、こちらも設定が必要になります。
設定ファイルを変更するので慎重に!

$ cd /usr/share/applications
$ nano code.desktop

上記コマンドでnanoで設定ファイルを開きます。
nanoの部分は先程と同様にgeditなどの他のテキストエディタでもOKです。

設定ファイルを開いたら、[Desktop Entry]の少し下にある

Exec=/usr/share/code/code -- unity-launch %U

と書かれている部分を探し、

Exec=/usr/share/code/code -- unity-launch --disable-gpu %U

と書き換えます。
これでLancherから起動した際にもGPUを使用しないように設定できました。