将来RTX3090ユーザーになるVRChatterのあなたへ

ななみ(@773_Arihara)です。

VRChatにお熱でブログの事を忘れていたのは秘密です。

良いものを買ったので自慢します。

購入の参考になれば幸いです

前置き

買いました

Geforce RTX 3090を買いました。

究極のゲーム体験が出来るそうです。

何と言ってもビデオメモリを24GBも搭載しているのが魅力です。

ライバルAMDの12/8(火)発売のグラフィックボード、Radeon RX 6900XTは16GB搭載なので、性能で負けてもこの点だけはマウントを取ることが出来ます。(ぶっちゃけ16GBで十分な気はしますが、後半で触れます。)

価格は約20万円です。

これ以上のGPUは無い、という心の安寧を金で買うことが出来るのでオススメです。

何で買ったの?

衝動買いです。

以前はGTX 1080を使っていたのですが、VRChatで話してる途中に急に落とされるのが本当に嫌だったんですよね。

話してたフレンドさんが、自分が戻ってくると既に別のフレンドさんのところに移動してたりすると本当に悲しいです。

なので、ここは金をかけるべきだろうと思って買いました。

VRChatで色々試してみる

検証環境は以下の通りです。

Ryzen 9については以前記事にしていますが、最近は自作PCに強いフレンドが増えてきたので見られるのが怖いです。

また、Indexのリフレッシュレートは120Hzに設定しています。実験的な144Hzモードもあると公式サイトに書いてありますが、謎です。デメリットがあるのでしょうか。

検証では内部解像度 (Super Sampling)を以下の値に設定して測定しています。

  • 100%(片目当たりの解像度:2016×2240)
  • 200%(片目当たりの解像度:2848×3168)
  • 500%(片目当たりの解像度:4508×5008)

内部解像度については、以下の記事で詳しく扱われています。

今回は4つのワールドで検証しています。

VRChat Home

いつもの

ミラー前で検証です。

f:id:Arihara:20201206173436p:plain
こんな感じです。

内部解像度100%

f:id:Arihara:20201206173758p:plain

値の意味は以下の通り。

  • GPU 左から順に温度、GPU使用率、VRAM使用率、コアクロック
  • VRAM ビデオメモリ使用量
  • CPU 左から順に温度、CPU使用率、コアクロック、CPUの消費電力
  • RAM メモリ使用量
  • FPS 現在のフレームレート
  • FPS AVG 平均フレームレート
  • FPS 1% LOW 下位1%のフレームレートの平均

この場合、余裕で120FPS出てますね。GPU使用率も60%と力を余らせている感じです。

たまにフレームレートが下がって90FPSぐらいになることもあるみたいですね。

VRAM使用量は約5.8GB。

内部解像度200%

f:id:Arihara:20201206175109p:plain

100%の場合と比較して、GPUの負荷が若干増えていますが、フレームレートには影響していません。

VRAM使用量は約6.7GB。

内部解像度500%

f:id:Arihara:20201206175856p:plain

フレームレートが60FPSに半減してしまいました。

恐らくモーションスムージングをオンにしていたからだと思います。(オフにしておけば良かった)

f:id:Arihara:20201206180509p:plain

要は、120FPSは出せないから、60FPSに半減させてフレーム補間を行う機能です。

詳しくは以下の記事で。

GPU使用率はそのせいか、200%の場合と同程度です。

VRAM使用量は約9.6GB。VRAM10GB搭載のRTX3080等ではちょっとつらいかも。

エルフの森 ElfForest TreeHouse

重いワールド

f:id:Arihara:20201206182112p:plain
こんな感じです。

リスポーン地点で検証。

内部解像度100%

f:id:Arihara:20201206182238p:plain

GPU使用率97%、平均フレームレート37FPS。。。

Bloomが効いててかなり重めです。

RTX3090でもダメなワールドはダメです

内部解像度200%

f:id:Arihara:20201206182510p:plain

平均フレームレート32FPS。

内部解像度500%

f:id:Arihara:20201206182838p:plain

平均フレームレート23FPS。きびしい。

VRAMも約12.2GB食っています。。。

内部解像度の違い

文字の見易さがかなり違ってくると思います。

f:id:Arihara:20201206183042p:plain
内部解像度100%

f:id:Arihara:20201206183320p:plain
内部解像度200%

f:id:Arihara:20201206183126p:plain
内部解像度500%

100%ではあまりやりたくないかな、といった印象。

あとはアバターもめちゃくちゃ綺麗に見えます

Sushi Buffet

お寿司は食べられないワールド

f:id:Arihara:20201206183906p:plain
こんな感じです。

VRChatで最も重いワールドではないか?との声も囁かれるほどのワールドですが、その理由はこちら。

f:id:Arihara:20201206184252p:plain

なんとこのボタンを押すと150枚のミラーが出現してしまいます。

押すなと書いてありますが、押してみます

f:id:Arihara:20201206184611p:plain

分かりづらいですが、ミラーがいっぱい出てきます😂

内部解像度100%

f:id:Arihara:20201206184836p:plain

100%でもVRAMを約7.9GB使用しています。

並みのグラフィックボードでは押さないほうが良いのかもしれません。

当たり前のように平均フレームレートが20FPS台で悲しいです。

内部解像度200%

f:id:Arihara:20201206185026p:plain

平均フレームレートはさほど変化せず。

VRAM使用量は約9.3GB。

内部解像度500%

f:id:Arihara:20201206185206p:plain

平均フレームレート22FPS。とてもつらい。

VRAM使用量は約13.4GBとバカ食い。

ポピー横丁-Poppy Street-

いつもの

f:id:Arihara:20201206185750p:plain
言わずもがな。

Publicインスタンスで検証です。インスタンスの人数は20人程度。制御出来ないので参考程度にしてください。

内部解像度100%

f:id:Arihara:20201206190213p:plain

60FPSは出てますね。GPU使用率が低いので、これもモーションスムージングの影響っぽいです。

内部解像度200%

f:id:Arihara:20201206190410p:plain

平均フレームレートは51FPS。GPUはほぼフルで回っていますね。

最低1%フレームレートが21FPSと低いですが、誰かがインスタンスに入ってくるとこのくらいになる、という事だと思います。

VRAM使用量は約8.8GB。

内部解像度500%

f:id:Arihara:20201206190738p:plain

平均フレームレート32FPS。

VRAM使用量は約13.1GB。

ポピ横は意外といけます。ただ人数が増えてくると、200%で30FPS前後くらいといった感じです。

まとめと所感

RTX 3090でも重いワールドは重いです。

ただ安定感は抜群に良いです。

1週間近く触っていますが、VRChatがクラッシュする事は1回も無くなりました

周りの人が一瞬の負荷で「重い!」と言ってるときも、全然重くありません

それが共感できないのは少し寂しくもありますが。

VRChatで満足する没入感を得たい人は、VRAM10GB以上のグラフィックボードを買うべきだと思います。

内部解像度が上げられる点は、没入感に大きな影響を与えます。

RTX3090はその選択肢の一つではありますが、割高感は否めません。

ただし、VRChatはRAM及びVRAMをある分だけ食らい尽くす化け物なので、多いに越した事はありません。

VRAM24GBの安心感に20万円払えるかどうかが、ポイントだと思います。

RTX3090所有者になって、心の安寧を手に入れましょう

ちなみに普通のプレイであればVRAM使用量16GBを超えることはないと思うので、Radeon RX 6000シリーズはかなり魅力的な製品だと思います。。。

全然売ってないけどね!!!!!

以上です。

ここまでご覧頂きまして、ありがとうございました。

ぬるぬるした物を噛み砕く

せいんと(@773_Arihara)です。

新年度がいよいよ始まりますね。

1年目新人プログラマーの成果発表みたいなノリで書いてみました。

nullnullした物を噛み砕く

キーワード

  • null安全
  • null許容型
  • Optional

null安全な言語でのnullの扱い方について、ざっくり噛み砕いて記します。

この記事では、こういうパターンの時に使えそう、という例を挙げてみます。

Swiftに馴染みが無い方に向けて色々な事をつらつら書き並べた所為で、前半は本題から大きく外れています。ゴメンなさい。

もっと詳しく知りたい方は、諸先輩方の素晴らしくまとめられた記事を後半に載せていますので、そちらをご覧ください。

※この記事では、PythonNone、Swiftのnilをnullと呼称しています。

前座

普通の動きが分かって頂ければOKです。

要件

以下に示す、CHARACTER表があります。

id name
1 モニカ
2 サヨリ
3 ナツキ
4 ユリ

任意の整数を与えると、CHARACTER表から該当するidnameを返却するような関数を作成してください。

ただし、与えた値がCHARACTER表のidに存在しない場合、「モニカ」を返却してください。

上記関数を用いて、それぞれのキャラクター名(name)を以下の形式で表示してください。

nameが取得されました。

SQLなら

CHARACTER表からの取得は下記のようなSQL文で定義出来そうです。

SELECT name FROM CHARACTER WHERE id = 1

引数でidを渡したいのであれば、最後の1をプレースホルダに変えれば良いと思います。

ただし、これだけだと該当するidが無い場合の要件が満たせていないので、なんとかしなければいけません。

下記サイトを参考に作成しました。

SELECT name FROM CHARACTER WHERE id = 1
UNION ALL
SELECT 'モニカ' WHERE NOT EXISTSSELECT name FROM CHARACTER WHERE id = 1

PostgleSQLで動作確認を行いましたが、問題ないようです。

プレースホルダーの件は上記同様。

もっと上手い方法があるかもしれませんが、これ以上は脱線するのでやめておきます。思いついた方はコメントください。

実装

DB接続は面倒なので、今回はやりません。ごめんなさい。

Pythonの例

#idからnameを取得する関数
def get_name(id: int) -> str:
    if id == 1:
        return "モニカ"
    elif id == 2:
        return "サヨリ"
    elif id == 3:
        return "ナツキ"
    elif id == 4:
        return "ユリ"
    else:
        return "モニカ"

#関数を呼び出して名前を表示
print(get_name(1) + "が取得されました。")
print(get_name(2) + "が取得されました。")
print(get_name(3) + "が取得されました。")
print(get_name(4) + "が取得されました。")
print(get_name(5) + "が取得されました。")

get_name関数は、DB接続を行って該当idnameを取得する物だと考えて頂けるとありがたいです。

関数の引数にはint型、戻り値にはstr型とするように明示しています。

ただし、これはIDE上の補完機能が効くのみで、型を制限する物ではないそうです。

試しに、

print(get_name(2.5) + "が取得されました。")

と変えても、コンパイルエラーとはならず、「モニカ」が取得されます。

引数を整数のみに制限するには、何かしら工夫が必要だと思われます。

ちなみに本プログラムの、実行結果は以下の通りです。

モニカが取得されました。
サヨリが取得されました。
ナツキが取得されました。
ユリが取得されました。
モニカが取得されました。

上手く動いているようですね。

Swiftの例

//idからnameを取得する関数
func getName(id: Int) -> String {
    switch id {
    case 1:
        return "モニカ"
    case 2:
        return "サヨリ"
    case 3:
        return "ナツキ"
    case 4:
        return "ユリ"
    default:
        return "モニカ"
    }
}

//関数を呼び出して名前を表示
print(getName(id: 1) + "が取得されました。")
print(getName(id: 2) + "が取得されました。")
print(getName(id: 3) + "が取得されました。")
print(getName(id: 4) + "が取得されました。")
print(getName(id: 5) + "が取得されました。")

まず関数名がPythonと異なっていますが、命名規則に基づいた物です。

こっちのキャメルケースの方が個人的には馴染み深いです。

そしてPythonとは対照的に、関数の引数及び戻り値の型制限が掛かります。

Pythonの場合と同様に、

print(getName(id: 2.5) + "が取得されました。")

と変更すると、こちらはコンパイルエラーとなります。

Cannot convert value of type 'Double' to expected argument type 'Int'

噛み砕くと、小数値(Double)は整数値(Int)に変換出来ませんよ、というエラーです。

また、Pythonでは使用出来なかった、switch文がSwiftでは使用可能です。(くどい等価演算子が避けられるくらいのメリットしかないかも。)

そしてそして、関数の呼び方も少し違っています。

getName(id: 1) 

引数にラベル名が必須となっています。

個人的には、視認性の向上に繋がり、良いと思います。

ただ、いちいちラベル名を残したくないという意見もあります。(そもそも、Swift2.xまでは省略出来ていた)

ラベル名を省略させる為には、関数定義の際に以下のようにアンダースコア(_)を付けて、明示する必要があります。

func getName(_ id: Int) -> String {

このようにすれば、以下のように関数呼び出しが行えます。

getName(1) 

ちなみに、明示を行わないまま、上記の形式で関数呼び出しを行うと、コンパイルエラーとなります。

Missing argument label 'id:' in call

大分脱線しましたが、実行結果はPythonの時と同じです。

モニカが取得されました。
サヨリが取得されました。
ナツキが取得されました。
ユリが取得されました。
モニカが取得されました。

本題

やっとnullが出てきます。

要件その2

CHARACTER表から サヨリ」を消去します

ただし、消すのはレコードではなく、nameのみです。

多分忘れてるだけなので。

id name
1 モニカ
2 null
3 ナツキ
4 ユリ

この状態で、以前と同様の要件を満たすように実装してください。

実装

何も変えないでも行けるやろ〜と思うと痛い目に。

Pythonの例

CHARACTER表の状態をコードに反映させます。

#idからnameを取得する関数
def get_name(id: int) -> str:
    if id == 1:
        return "モニカ"
    elif id == 2:
        return None
    elif id == 3:
        return "ナツキ"
    elif id == 4:
        return "ユリ"
    else:
        return "モニカ"

#関数を呼び出して名前を表示
print(get_name(1) + "が取得されました。")
print(get_name(2) + "が取得されました。")
print(get_name(3) + "が取得されました。")
print(get_name(4) + "が取得されました。")
print(get_name(5) + "が取得されました。")

サヨリNone(≒null)に変更しただけで、処理は一切変更していません。

実行してみましょう。

モニカが取得されました。
Traceback (most recent call last): File "test.py", line 14, in print(get_name(2) + "が取得されました。") TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'

id=1のモニカは取得出来ているようですが、nullに変更したid=2の取得でエラーとなっているようです。

それ以降のnameについても取得されず、強制終了してしまっています。

エラー内容を噛み砕くと、nullstr+で結べません、といった感じです。

+は文字列同士を連結させる為に使用していましたが、nullが入ってしまうとNGという事です。

つまり、nullでない場合のみ処理を実行するように制限すれば良いのです。

if  get_name(2) is not None:
    print(get_name(2) + "が取得されました。")

プログラミング経験者の方なら、そんなの当たり前じゃないか!と思う方もいるかも知れません。

ただ、このnullチェックを忘れてしまうケースが多々あるかと思います。

例に示したコードでは、コンパイルエラーとはならず、エラーとなる箇所を実行して初めて、過ちに気がつきます

このような小規模なプログラムならすぐにエラーが発生する事がわかりますが、大規模なプログラムになると、リリースしてから数ヶ月後、数年後に発覚する事なんかもあったりします。

なんとも悲しい。

Swiftの例

Pythonの場合と同様に、サヨリnil(≒null)に変更します。

//idからnameを取得する関数
func getName(id: Int) -> String {
    switch id {
    case 1:
        return "モニカ"
    case 2:
        return nil
    case 3:
        return "ナツキ"
    case 4:
        return "ユリ"
    default:
        return "モニカ"
    }
}

//関数を呼び出して名前を表示
print(getName(id: 1) + "が取得されました。")
print(getName(id: 2) + "が取得されました。")
print(getName(id: 3) + "が取得されました。")
print(getName(id: 4) + "が取得されました。")
print(getName(id: 5) + "が取得されました。")

これはなんと、コンパイルエラーになります

'nil' is incompatible with return type 'String'

噛み砕くと、nullは定義した返却値の型Stringと矛盾してますよ、という意味です。

一体どういう事なのか、見ていきましょう。

そもそも、SwiftではString型にnullを代入する事が出来ません。

もっと言うと、特別な事をしない限り、全ての型にnullを代入する事が出来ません。

以下は、いずれもコンパイルエラーとなる例です。

var str: String = nil
var char: Character = nil
var arr: Array<String> = nil
var some = nil

最後は型を指定せずに、型推論での変数定義を試みていますが、エラーとなります。

このように、特別な事をしていない型の事を非Optional型と呼びます。

非Optional型にはnullを代入する事が出来ません。

どうしてもnullを代入する必要がある場合は、Optional型で定義する必要があります。

定義方法は以下の通りです。

var str: String? = nil
var char: Character? = nil
var arr: Array<String>? = nil

型の後ろに?を付けるとOptional型となり、コンパイルエラーになりません。

なお、型推論の記法でOptional型を定義する事は出来ません。

さて、本題の関数ですが、戻り値に非Optional型(String)を指定しているのがエラーの原因のようです。

関数の定義を以下のように変更してみます。

func getName(id: Int) -> String? {

すると、こうなります。

f:id:Arihara:20200331200041p:plain

エラーが大量発生しました。

Value of optional type 'String?' must be unwrapped to a value of type 'String'

直訳すると、Optional型String?の値はString型の値にアンラップされる必要があります、といった感じです。

アンラップとは、Optional型から非Optional型に変換する処理のことです。

Optional型は、ラッピングが施された箱のような物と考えると分かりやすいかと思います。

中身を使いたい場合には、ラッピングを取り除く(アンラップする)必要があります。

ただし、箱の中には、何も入っていない可能性があります。

この状態がnullです。

アンラップの方法は様々あります。

  • 強制アンラップ
print(getName(id: 1)! + "が取得されました。")

Optionalな変数の最後に!を付けると強制的にアンラップされます。

ただし、その変数がnullだった場合、ランタイムエラーとなり、アプリが強制終了してしまいます。

基本的には推奨されない方法です。

  • nullチェック
if getName(id: 2) != nil{
print(getName(id: 2)! + "が取得されました。")
}

条件を追加して、nullでない場合のみアンラップします。

!=はアンラップではなく、Not Equalの意味なので注意してください。

  • デフォルト値を与える
print((getName(id: 3) ?? "知らない人") + "が取得されました。" )

nullでなければアンラップした値、nullなら"知らない人"を返します。

演算子??三項演算子の省略型です。

getName(id: 3) != nil ? getName(id: 3)! : "知らない人"

と同一の意味です。

??を用いる方が、断然直感的で分かりやすいかと思います。

if let name4 = getName(id: 4){
    print(name4 + "が取得されました。")
}

Optional変数をアンラップし、変数に代入可能(=非null)であれば、代入を行った後にTRUEが評価されます。

代入を行った変数は、if文の中でのみ利用可能です。

nullの場合は、FALSEが評価され、if文の中は実行されません。

  • guard-let構文
guard let name5 = getName(id: 5) else { exit(1) }
print(name5 + "が取得されました。")

オプショナルバインディングとほぼ同じですが、こちらは変数がguardブロックの外でも利用可能になります。

この特性から、 nullの場合に実行されるelseブロックの処理では、その変数が使用出来なくなるように工夫する必要があります。

上記の例では、プログラムを終了させています。

関数単位では、returnさせるなどの処理が考えられます。

最後に、修正したコード全体をもう一度見てみましょう。

//idからnameを取得する関数(型をOptionalに変更)
func getName(id: Int) -> String? {
    switch id {
    case 1:
        return "モニカ"
    case 2:
        return nil
    case 3:
        return "ナツキ"
    case 4:
        return "ユリ"
    default:
        return "モニカ"
    }
}

//関数を呼び出して名前を表示

//1.強制アンラップ
print(getName(id: 1)! + "が取得されました。")

//2.nullチェックしてアンラップ
if getName(id: 2) != nil{
    print(getName(id: 2)! + "が取得されました。")
}

//3.デフォルト値を与える
print((getName(id: 3) ?? "知らない人") + "が取得されました。" )

//4.オプショナルバインディング
if let name4 = getName(id: 4){
    print(name4 + "が取得されました。")
}

//5.guard-let構文
guard let name5 = getName(id: 5) else { exit(1) }
print(name5 + "が取得されました。")

実行結果は以下の通りです。

モニカが取得されました。
ナツキが取得されました。
ユリが取得されました。
モニカが取得されました。

null安全はいいぞ!

長々書いていきましたが、結局はこれが言いたい事です。

null安全とは、値がnullかどうかのチェックをコンパイラが強制してくれる機能の事です。

Swiftの例で、関数の型をOptionalに変更した際にエラーとなったのは、この機能による物です。

また、非Optional型はnullを全く意識する事なく、使用する事が出来ます。

変数の定義の際は、基本的には非Optional型で定義を行い、nullが入る可能性のある物に限り、Optional型で定義する、と言う方針が良いと思います。

nullはあまりに多くのバグを生み出してきた厄介者なので、null安全の流れには是非とも乗っていきたいところです。

参考にさせて頂いたサイト

もっと深く知りたい方は、こちら。

あとがき

ネタが伝わってれば目標達成です。

ちなみにエアプです。

ナツキ派だと思います。

忠実に再現するのであれば、idに何を与えても「モニカ」を返す方が良かったかしら。

さて、この記事ではSwiftとPythonを対比させて、null安全って凄いでしょ!と示しているところですが、実はPython拡張機能をインポートすることにより、null安全になる事が出来ます。

詳細は以下のサイトに載っています。

ここまで長い記事は書いた事が無かったので、全然まとまりませんでした。

これから精進していきたいと思います。多分。

最後まで読んで頂いた方からは是非ダメ出しをして頂きたいところです。

それにしても、この辺をきちんと理解しているプログラマーはどのくらいの割合で居るのかが気になります。

個人的には知らない人のほうが多数だと思うのですが、どうでしょう。

普及度的に考えるとPythonC#がnull安全普及の先駆けとなって欲しいです。

ただ、この2つは選択的対応なので、そもそも設計者がnull安全の存在を知らないと意味無いですが。

やっぱりネイティブ対応の言語が一番嬉しいんですよね。

私がnull安全の恩恵を受けられるのは何十年先になるやら・・・

誰か良い職場教えてください。

ここまで読んでいただき、ありがとうございました。

Ryzen 9 3900Xポチったので新年初投稿。。。ども

あけましておめでとうございます。

四季ナツメ(@773_Arihara)です。

今更ながらRyzenをポチったので旧CPUに哀悼の意を表しつつ、つらつら書いていきます。(この記事は旧CPUの載ったデスクトップPCで書いています。)

導入

自作PCに詳しい人は読み飛ばしてね。(間違いがあったら指摘お願いします。)

Ryzenって何ですか?

ライゼンです。IntelのライバルであるAMDという半導体製造会社が開発したCPUです。

CPUは永らくIntelが覇権を握っていましたが、性能、コストパフォーマンスの面で対抗できるCPUが2019年7月に登場しました。(第三世代Ryzen、いわゆるZen 2)

Zen 2の登場により、IntelのCPUは価格改定を余儀なくされました。

今、最もアツいCPUと言えます。

インテル入ってなくて良いの?

インテル、入ってる。」というフレーズはCMでもお馴染みですね。(最近はあまり聞かないかも)

当然RyzenAMD製ですので、インテルは入ってません。

インテルが入っていなくても、出来ることは基本的に同じです。(アーキテクチャの互換性があるので)

AndroidとかWindowsタブレットとかで耳にするであろうSnapdragonというCPUは、アーキテクチャが異なる(ARM)ので、動かないアプリが有ったりします。

詳しいことは下記サイトにお任せします。

技術面以外で言うと、Intel製CPUは長年にわたる信頼と実績を誇っている為、安定性を重視される方はRyzenでは無く、IntelのCoreシリーズを採用する方も多いかと思います。

実際私が現在使用しているCPUはIntelのCPUです。

ただ、最近はIntel製CPUに多くの脆弱性問題が発生しており、その信頼性も危ぶまれています。

また、脆弱性の対応により、CPUの性能が低下するという報告もあります。

Intel製CPU及び使用している人を非難するつもりはさらさらありませんが、私は脆弱性の問題とコストパフォーマンスの点からRyzenを選択しました。

自作PC界隈では、Intel信者とAMD信者の醜い争いが繰り広げられる事もありますが(ゲームハードの任天堂VSソニー程では無いと思う)、自作なんだから好きなの使えば良いじゃん!というのが個人的な意見です。

本題

君に決めた!

Ryzen 9 3900Xです。(アフィ無いので安心して踏んでください)

12コア24スレッド駆動の化け物です。

今までは4コア8スレッドのCPUを使っていたので、3倍です。

コアとかスレッドが分からない人は、Windowsを起動してCtrl+Shift+Escキーを押してパフォーマンスタブを見てみましょう。

f:id:Arihara:20200210184758p:plain
タスク マネージャー

コアがコア数で、論理プロセッサ数がスレッド数です。

Macの人は、意識高そうなのでその辺の調べ方知ってるでしょ(自分は知らない)

PC持ってない人は、キンタマの数だと思っておけばまず問題ないでしょう。

要するに、コアが多いほど仕事が出来るという事です。ただ、コアが増えるほど値段が上がり、消費電力が上がり、発熱が増えます。

自分が選択した3900Xの上にも、3950Xという16コア32スレッド駆動のCPUがありますが、そこまでは要らないかなと自分に言い聞かせました。(価格がね。。。)

経済を回したい方には、当ブログではこちらを推奨します。

価格.comの人気売れ筋ランキング6位の商品となっております。是非お買い求め下さい。

64コア128スレッドです。絶倫ですね。

何で買ったの?

色々と理由があります。

乗るしかない!このビックウェーブに!

現在のPCのCPUはCore i7-2700Kです。

8年以上前のCPUですね。

でもVRも遊べる素晴らしい子なんです!

この世代のCPUは出来が良く、通常の用途なら今でも現役でバリバリ戦えるCPUです。(今のCore i3程度)

そのことから、しばらく買い替えないでいる人の事を、この世代のCPUのコードネーム(Sandy Bridge)から取ってSandyおじさんと良く呼ばれます。

つまり私もSandyおじさんでした。

しかし、Sandyおじさんの同志たちが軒並みRyzenに乗り換えていくではないか!

もうおじさん疲れたので、便乗します。

8年間よく頑張ってくれました。

ありがとうSandyちゃん。

性能もちょっと厳しい

たまには配信もしたいけど、ゲーム配信はまともに動かない。。。

(時間指定してるけど、スマホだと反映されないかも 1:06:50あたり)

配信せずにBMSだけやってても時間経過で落ちる、カクつく。

VR(ビートセイバー、VRChat)も同様の傾向。(メモリかCPUパワー不足?)

配信だと8コア以上は欲しいですね。。。

メモリだけ増設しようとしてもダメだった

大方メモリ不足なのは分かっていたので、メモリを増設して16GBにしようと思い、Amazonで注文しました。

でも、届きませんでした。

しばらくすると警察から落とし物の連絡アリ。

それ私のメモリ!

住所と違う区の警察署までわざわざ取りに行き、受け取ると箱がボロボロ...

大丈夫かな?と思いつつマシンに刺してみると、ブートしませんでした。

これは、神様か仏様が「買い替えろ!」と言っているんじゃないかなと思い、その日にすぐポチりました。

欲を満たしたかった

自作欲。散財欲。

組み立ては、1年前大学の金で10万のCPU使って組ませてもらったのが最後です。

なかなか良いCPUですが、今回購入した奴の方がスペック高いです。

時代の流れは怖いですね。

でも自分の金でPC組みたいじゃない!

散財欲は、どうしようもない。

雑記

他にもいろいろと。

CPUだけじゃダメなんだ

頭だけ買ってもどうしようもないので、Ryzenに相応しい台座を購入しました。

f:id:Arihara:20200210205856p:plain

選んだ理由は、かわいいからです。

ただそれだけ。

悪くないでしょ?

f:id:Arihara:20200210214112p:plain

このIOパネルの部分とか本当にかわいい。最高。

あとメモリはコレにしました。

白系だから良いよね~ってのと、今ドキはDDR4-3600や!という理由です。

ちなみにRyzenはメモリ4枚刺しより2枚刺しの方がメモリクロック的にアドが取れるので、同じ容量で2枚に出来るならそうしたほうが良いです。

もう少し落ち着いたら白系のケースとかNVMeのSSDとか色々欲しい。

飢え

やると決まったらすぐ行動するタイプです。

とにかく明日手元に届くように急いで注文しました。

余裕があったらまた記事を書きたいです。

可愛いマザーボードはあんまり情報無いようなので、自慢したいですね。

あと、周りでパソコン欲しい人をちらほら見かけるので、自分で良ければ相談に乗ります。というか乗らせてください!

PCに飢えている人でした。

大学の講義と実際の業務のギャップについて

在原七海(@773_Arihara)です。

何人かから聞かれたのでちょっと書き記してみます。

背景

大学

情報系の学部卒です。

いわゆる四工大といった理系専門の大学では無かったので、その辺りで差があるかもしれませんね。

ぶっちゃけMARCHって文系メインみたいな所があるので、微妙に評価されない気がしてます。就活も上手くいかなかったし。(自分の能力が低いのを大学のせいにするオタク)

大学では不真面目な学生生活を送っていました。

1年目で10単位も落としてしまい、サークルの先輩に目をつけられた記憶があります(良い意味で)。

ただ、日本語をちゃんと話してくれている教授の講義はちゃんと聞いてました。

研究も結構頑張りました。

別の研究室の院生に、「在原くんは院に進まないのが勿体無い」と言われたのがうれしかったですね。GPAが足りなかったんや。あともう勉強したくなかった

業務

SEです。もうちょっと言うと、SESです。

察してくれ。と言いたい所ですが、分からない人もいると思うので。

SE(システムエンジニア)は、要件定義、設計、プログラミング(製造)、テスト、運用保守の一連の作業を担当する人のことです。 PG(プログラマー)は製造中心という点で違いがあります。

SESについてはなかよし先生(@nakayoshi251)の4コマ漫画に説明を委ねます。

f:id:Arihara:20191021213059p:plain

イラストは誇張されてる気もするけど、概ね正しいです

有休取ったらその分残業しなきゃいけないとか意味不明ですよね。

偽装請負は普通に違法だけど、ぶっちゃけ当たり前になってるし。黒い

愚痴はこの辺にしておいて、具体的な業務内容について軽く触れます。

業務では、業務アプリの製造を行っています。

業務アプリは、会社の中で使用するアプリケーションで、一般の人が使うものではありません。

例えば、コンビニのPOSシステムとか、従業員の勤怠管理システムとか、そう言った類のものです。

ユーザビリティに注意しなければいけない点ではスキルアップが図れますが、新技術などは当然使わないので、ある程度で成長が止まります。AI?何それ美味しいの?

本題

大学の講義と実際の業務とのギャップについてです。

業務に活かされてるかそうでないかという観点でつらつらと。

活かされてそうな講義

プログラミング

全くの未経験だった僕をにしてくれた大学に圧倒的感謝😤

大学でC言語を教えるなんて古臭いと批判する方もいますが、初めて触る言語を短時間で会得できるスキルが身に付く所に意味があるんですよね。

とりあえず手続き型とオブジェクト指向の言語は大体の大学で教えているはずなので、それが分かればプログラミングは大丈夫だと思います。

自分も業務で初めてVBを触りましたが、なんとかなっています。

ギャップという点では複数人での開発を経験していなかったので、ちょっとしんどかったですね。選択科目ではあったと思うんですが。

とりあえず他人のコードを読むのは最初は大変でした。

あと自分のコードの汚さにいつも頭を抱えてます。

アルゴリズム

講義で教わった内容を使う訳では無いですが、アルゴリズムを理解する機会は重要だったと感じています。

このあたりの経験がプログラムの設計やコーディングに影響を与えていそうです。

とりあえず処理速度は意識しながら設計しないといけません。過去記事でも触れたけど。

ビートマニアのスコアデータCSV出力に1分とか掛かったら嫌ですよね。

まあそんな感じです。

データベース

ゴリゴリに使ってます。

講義では基礎知識は教えてくれると思うんですが、研究とかではそんなに触らないイメージ。

結局この辺は情報処理試験の勉強とほぼ変わらないので、わざわざ大学で受ける意味が無いなと思ってます。

実際の業務でのデータベースは複雑すぎて割とヤバイです。

基礎知識が無かったら終わってたので、その点では助かりました。

研究

講義じゃ無いけど。研究はほぼ業務みたいなものです。

ずっと自席に座ってコード書き続けるのも、教授に指摘されるのも、論文書くのも、教授に指摘されるのも...

業務内容とほぼ変わり無いので、大学に行っていて一番良い経験になったと感じてます。

ただ勉強しているだけではアウトプットが無いですから、技術的(専門的)なコミュニケーション力を鍛えられるのは大きいですね。

活かされてなさそうな講義

数学、物理

使ってない。

研究開発系の仕事なら使うんじゃないですかね。

映像系

興味はあったけど、職種が違った

外国語

調べたら英語のドキュメントしかないとかもたまにありますけど、Google翻訳使えばいいしね。

ただ入手資料等の内部文書が英語の場合、セキュリティ上の理由でGoogle翻訳が使えないパターンも有ります。

中国語は、「私は日本人です。」しか喋れません。第二外国語の講義マジで要らない。

75コマも中国語の講義を受けたことに今更ながら恐怖を感じています。

その他変なやつ

  • 哲学 死にそうになったら役に立つかも
  • 芸術 ジジイになったら役に立つかも
  • スポーツ科学 ジジイに(以下略)

あとは覚えてないです。

総括

大学に行ったのはいい経験になったし、業務で活かされてると感じています。

ただ、SEは日々勉強を続けなければいけない職業だと思うので、大学はほんのわずかな土台を作ってくれただけに過ぎないのかも知れないです。

在学生の皆さんは講義を受ける際のモチベーションにつながればと思います。役に立たないと分類してしまった講義は、頑張ってください。

あとがき

SESを避けるにはメー子かユー子に入るしかないんでしょうか。

社内SEって新卒でもなれるんかな。

大学院に行った方が良いかという質問もされるんですが、大学院に行っていないのでわかりません。

就活的観点から言うと、行った方が良さそうに感じるって回答しか出来ないですね。

院行ってる人のTwitter大体病んでるかイカれてるかのどちらかなので(偏見)安易に勧められないです。

あと自分語りが苦手なのでこの記事は書きづらかった。酒飲みながら書けばよかったかも。

それに硬いし。

もうちょっとふわふわな白猫きゃらめる夢幻のわたあめな記事を書きたい。

2ヶ月で10kg痩せちゃった話

お久しぶりです。せいんと(@773_Arihara)です。

お仕事が忙しくて全然更新出来ていませんでした。

あとあんまり新しい技術を学んでいないので、備忘録として書き留めることが無いんですよね。

この記事を書くことにより、執筆モチベが上がり小さなことにも気がつける人間になれる事を期待しています。

タイトルの通り

10kg痩せました。

エビデンス

f:id:Arihara:20191016223343j:plain:w200
Before

f:id:Arihara:20191016223258j:plain:w200
After

この写真はiPhoneからMacAirdropで送ったのですが、拡張子がHEICとかいう謎のモノになってて困惑しました。はてなブログに貼れないし。

$ sips --setProperty format jpeg ***.heic --out ***.jpg

を叩けばJPEGに変換できました。

今やもう「エビデンス」というワードを普通に使う社会人になってしまいました。

業務ではエビデンスをガシガシ作ってます。

Windows10をお使いの方はキーボードで Win+Shift+Sを打ってみましょう。

これを1日100回くらい押してます。

ホントは65kgあったんですが、エビデンスは改竄してはいけないので、ありのままを貼りました。

体重公開恥ずかしい😣

何があったのか

最近お仕事がホントにしんどいです。

残業時間が36協定に引っ掛かりかけたし、有休は1日も取れてないし、毎日単調作業の繰り返し...

アホみたいに暇だった大学生活から強制的に週5日労働生活に切り替わったらストレスで痩せる人続出じゃないでしょうか。社会人ダイエットとか流行らないかな。

実際周りで痩せていく人も見かけるんですが、私は仕事が理由で痩せた訳ではありません(多分)。

散々前振りしておいて、心配してくれた方がいたらごめんなさい。むしろ4月から5kgくらい太りました。それがきっかけで痩せようと決意しました。

あと某ダンベルアニメの影響も少なからず受けてます。まだ全部見れてないけど。URLがdumbbell-animeと直球で思わず笑ってしまう。

何したのか

ズバリ筋トレ、と言いたいところですが、2、3週間くらいで辞めちゃいました。

というのも、エアロバイクをガシガシ漕いでたら、股関節のところが腫れ上がってしまい、一時期まともに歩けなくなってしまいました。

「股関節 腫れ」で検索したら悪性疾患だとか出てきて焦った記憶があります。病院行かなかったけど。

初心者がいきなりレベル12に手を出してはいけなかったですね。

なので、ズバリ糖質制限をやってます。

お米やパン、麺類といった炭水化物や糖分の摂取量を減らすダイエットですね。

最初の1ヶ月は上記のものはほとんど口にしていませんでした。

オススメはすき家の「牛丼ライト」です。 米の代わりに豆腐が使用された牛丼です。あとブロッコリーなどの野菜も入ってます。

平日はほぼ毎日すき家に行って食べていました。

あとは吉野家にも「ライザップ牛サラダ」というメニューがあるのでこちらも糖質制限には良さそうですね。あんまり好みじゃなかったけど

コンビニとかだと意外と糖質だらけで食べる物が見つけづらいんですよね。惣菜は少ない割に値段が張りますし。

最初は炭水化物が食べられないのはキツかったですが、慣れれば案外無くても平気になります。

ただ、甘いものはどうしても食べたくなりますね。大学生の頃チョコ食い散らかしながら研究してた日々が恋しくなってました。

副作用:多分ある

実は糖質制限は医師の中でも賛否両論あるみたいですね。 世界仰天ニュースで聞きました。

ストイックにやるのは危険そうです。

でも私もこの体重から2ヶ月で10kg落とすって結構ストイックじゃないですか? 仰天ニュースの女性は3ヶ月で14kg落としたらしいですし。

これからは私のことをストイック七海とお呼びください。

はい。

それで、副作用が多分あると感じる理由ですが、頭が悪くなったからです。

物忘れやモノを無くしてしまう事が最近結構あります。

悲しいことに、久しぶりに会った伯父に、「ボケた顔になってきたな」と言われる始末。

老化ではないと信じたいのですが、恐らく糖質制限の影響ではないかと思っています。

なので、最近は1日1食は炭水化物は取るようにしています。

ボケが治ってくれるとありがたいのですが。

おわりに

ブログ休んでたのはダイエットしてたからです(?)

時期的にはぴったりなんです。実は。

せっかく痩せたので今度こそ筋トレリベンジしたいですね。

ダンベルの影響でプロテイン買ってみたり、一人でプール行ったりしてたんですけど、モチベーションの維持が難しいですね。

ビートトレーニングは毎日欠かさずやってます。

MacでBMSやってみた(beatoraja 0.7.2)

Macでも動くはずなのに、何故か動かないという話を色々聞いていたので興味本位でやってみた。

環境

目次

beatoraja(0.7.2)のダウンロード

ここからダウンロード

起動

beatoraja-config.commandを右クリックして開く。

  • 設定画面が立ち上がった人
    • おめでとう! この記事は参考になりません。
  • エラーが出た人
    • 私と一緒です。

エラー内容は以下の通り。

エラー: メイン・クラスbms.player.beatoraja.MainLoaderを検出およびロードできませんでした

このエラーって大体クラスパスとかJAVA_HOMEが設定されてない時に出るやつですね。

設定してない人は、調べてやってみてください(投げやり)

とりあえずJavaのバージョン確認

ターミナル開いてjava -version

MacBook-Air% java -version
java version "12.0.2" 2019-07-16
Java(TM) SE Runtime Environment (build 12.0.2+10)
Java HotSpot(TM) 64-Bit Server VM (build 12.0.2+10, mixed mode, sharing)
  • バージョン8未満だった人
    • JDKをインストールしてください。特に気にしなければ8が良いと思います。
  • バージョン8~10だった人
    • それ動いてない?
  • バージョン11以上だった人
    • 私と一緒です。

Java11からはJavaFXが同梱されていないらしい。

別途インストールが必要。

JavaFXのインストール

下記を参考にインストール。

beatorajaのコマンドファイルを編集

beatoraja-config.commandの4行目を以下のように変更。

exec java --module-path $PATH_TO_FX --add-modules=javafx.controls,javafx.fxml -Xms1g -Xmx4g -cp beatoraja.jar:ir/* bms.player.beatoraja.MainLoader

改めて起動

beatoraja-config.commandを右クリックして開く。

多分これで開くと思います。

BMSファイルを開いてみる

カラフル・サウンズ・ポート先生のETERNAL DRAINを開いてみます。

f:id:Arihara:20190825141522g:plain

とりあえず動きました。スキンは気が向いたら入れようと思います。

おまけ

今日久しぶりにBMSをやったらDAOコンの皿の隙間に小指の爪が引っかかってしまった★3elegante。

f:id:Arihara:20190825153325p:plain

VB.NET基本メモ

昨日VBネタが出てきたので、いつの日か自分用に書いたメモを転記。

基本的には、Microsoft@ITから引用した内容だったと思います。

間違いあるかもしれません。

VBまとめ

命名規則

Microsoftから引用。

  • 名前の中の各単語を大文字で始める。

    • 例えば、FindLastRecodeRedrawMyFormのようにする。
  • 関数やメソッド名は動詞で始める。

    • 例えば、InitNameArrayCloseDialogのようにする。
  • クラス、構造体、モジュールやプロパティ名は名詞で始める。

    • 例えば、EmployeeNameCarAccessoryのようにする。
  • インターフェイス名はプレフィックス"I"を付けて始め、後に名詞、名詞句を続ける。

    • 例えば、IComponentなど。
    • インターフェイスの動作を説明する形容詞を続ける場合もあり。 例えば、IPersistableなど。

データ型

タイプ サイズ 格納できる値の範囲
数値型 整数型 SByte 1バイト -128~127(符号付き)
Byte 1バイト 0~255(符号なし)
Short 2バイト -32,768~32,767(符号付き)
UShort 2バイト 0 ~ 65,535 (符号なし)
Integer 4バイト -2,147,483,648 ~ 2,147,483,647 (符号付き)
UInteger 4バイト 0 ~ 4,294,967,295 (符号なし)
Long 8バイト -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (9.2...E+18 †) (符号付き)
ULong 8バイト 0 ~ 18,446,744,073,709,551,615 (1.8...E+19 †) (符号なし)
浮動小数点型 Single 4バイト ±3.40282347E+38~±1.40239846E-45
Double 8バイト ±1.79769313486231570E+308 ~ ±4.94065645841246544E-324
10進型 Decimal 16バイト 0 ~ +/-79,228,162,514,264,337,593,543,950,335 (+/-7.9...E+28) † (小数点なし)
0 ~ +/-7.9228162514264337593543950335 (小数点以下 28 桁)
0 以外の最小数は +/-0.0000000000000000000000000001 (+/-1E-28) †
論理型 Boolean ※1 true または false
日付型 Date 8バイト 0001 年 1 月 1 日 0:00:00 (午前 0 時) ~ 9999 年 12 月 31 日 11:59:59 PM
文字型 Char 2バイト 0~65535 (符号なし)
String ※1 0個~約20億個のUnicode文字
Object型 Object ※2 任意の型を格納可能

※1 実装するプラットフォームに依存。

※2 32ビットプラットフォームでは4バイト/64ビットプラットフォームでは8バイト。

コレクション

コレクションとは、同じ型のデータをまとめて管理するためのデータ構造を総称したもの。

Visual Basic 2005からは、System.Collections.Generic名前空間で、ジェネリックを使ったコレクションクラスが提供されている。

ジェネリック:クラスやメソッドのパラメータにおいて、処理対象とするデータ型を特定することなく汎用的な形で記述できるしくみ。

コレクションの種類
(アルゴリズムによる分類)
System.Collections System.Collections.Generic
リスト ArrayList List
双方向連結リスト LinkedList
ソート済みリスト SortedList SortedList
スタック Stack Stack
キュー Queue Queue
ハッシュテーブル Hashtable Dictionary
二分探索木 SortedDictionary

コレクションクラスの主要なプロパティとメソッド

コレクション名 プロパティ・メソッド 概要
List Count 実際に格納されている要素の数を返す
Add(item) 末尾にオブジェクトを追加する
Clear() すべての要素を削除する
Insert(index,item) 指定したインデックスの位置に要素を挿入する
Remove(item) 最初に見つかった特定のオブジェクトを削除する
Stack Count 格納されている要素の数を返す
Contains(item) ある要素がスタック内に存在するかを判断する
Peek() 先頭にあるオブジェクトを削除せずに返す
Pop() 先頭にあるオブジェクトを削除し、返す
Push(item) 先頭にオブジェクトを挿入する
Queue Count 格納されている要素の数を返す
Clear() すべてのオブジェクトを削除する
Dequeue() 先頭にあるオブジェクトを削除し、返す
Enqueue(item) 末尾にオブジェクトを追加する
Peek() 先頭にあるオブジェクトを削除せずに返す
Dictionary Add(key,value) 指定したキーと値を追加する
Clear() すべてのキーと値を削除する
TryGetValue(key, out value) 指定したキーに対応する値を取得する
ContainsKey(key) 指定したキーが存在するかどうかを判定する
ContainsValue(value) 指定した値が格納されているかどうかを判定する
Remove(key) 指定したキーを持つ要素を削除する

List

以下サンプルコード。

Class MainClass
  Public Shared Sub Main()

    'String型のListとしてインスタンス化
    Dim SampleList As New List(Of String)

    SampleList.Add("Hello")
    SampleList.Add("World")

    'インデックスによる参照(キャスト不要)
    Dim s As String = SampleList(1) ' 出力値:World
    Console.WriteLine(s)

  End Sub
End Class 

List(Of String)とすると、String型のListクラスになる。

型推論を利用すれば、以下のようにも書ける。

Dim SampleList = New List(Of String)

LinkedList

双方向リンクリストのクラス。

配列がベースのListクラスとは異なり、インデックスによるデータの参照はできない。

その代わり、リストの途中への要素の削除と挿入が高速にできるという特徴がある。

以下サンプルコード。

Class MainClass
  Public Shared Sub Main()

    ' LinkedListクラスの利用
    Dim SampleList = New LinkedList(Of String)

    ' 1つ目の要素を追加
    SampleList.AddFirst("First")

    ' 2つ目の要素を追加
    SampleList.AddFirst("Last")

    For i As Integer = 0 To 2
      ' 先頭の要素の後にiの値を文字列に変換したものを追加
      SampleList.AddAfter(SampleList.First, i.ToString())
    Next

    ' すべての要素を順番に表示
    For Each s In SampleList
      Console.WriteLine(s)
    Next

  End Sub
End Class 

実行結果

Last
2
1
0
First 

Listを全件ループで処理する場合は、注意が必要。(詳細)

値渡しと参照渡し

メソッドに引数を渡す方法は、「値渡し」と「参照渡し」がある。

値渡し

Public Shared Sub DoSomething(ByVal arg1 As Integer)
    'パラメータの値を変更する
    arg1 += 1
End Sub

'エントリポイント
Public Shared Sub Main()
    Dim val1 As Integer = 0

    'DoSomethingメソッドを呼び出す
    DoSomething(val1)

    '引数として渡した変数が変化したかを確認する
    Console.WriteLine(val1)
    '「0」と表示される

    Console.ReadLine()
End Sub

VB.NETではByValは省略できるが、できるだけ省略しないこと。

参照渡し

Public Shared Sub DoSomething(ByRef arg1 As Integer)
    'パラメータの値を変更する
    arg1 += 1
End Sub

'エントリポイント
Public Shared Sub Main()
    Dim val1 As Integer = 0

    'DoSomethingメソッドを呼び出す
    DoSomething(val1)

    '引数として渡した変数に変わりがないか確認する
    Console.WriteLine(val1)
    '「1」と表示される

    Console.ReadLine()
End Sub

ByValByRefに変わっただけ。

プロパティプロシージャ

Javaでいうところのゲッター・セッターはプロパティで定義するらしい。

ゲッターとセッターを定義する場合

Public Class SampleClass1
    Private _number1 As Integer = 0
    Public Property Number1() As Integer
        Get
            Return _number1
        End Get
        Set(ByVal value As Integer)
            _number1 = value
        End Set
    End Property
End Class

ゲッターのみ

Public Class SampleClass2
    Private _number2 As Integer = 0
    'Getしかない時はReadOnlyを付ける
    Public ReadOnly Property Number2() As Integer
        Get
            Return _number2
        End Get
    End Property
End Class

セッターのみ

Public Class SampleClass3
    Private _number3 As Integer = 0
    'Setしかない時はWriteOnlyを付ける
    Public WriteOnly Property Number3() As Integer
        Set(ByVal value As Integer)
            _number3 = value
        End Set
    End Property
End Class

オブジェクト指向

クラスの定義

Public Class Employee
    'フィールド
    Private employeeNameValue As String
    'プロパティ
    Public Property EmployeeName() As String
        Get
            Return employeeNameValue
        End Get
        Set(Value As String)
            If Value.Length <> 0 Then
                employeeNameValue = Value
            End If
        End Set
    End Property
    'コンストラクタ
    Public Sub New(employeename As String)
        employeeNameValue = employeename
    End Sub
    'メソッド
    Public Function ShowEmpName() As String
        Return employeeNameValue
    End Function
End Class

インスタンス化・プロパティ使用

'インスタンス生成
Dim emp As Employee
emp = New Employee("FLM01")

'プロパティを使用する(参照)
MassageBox.Show(emp.EmployeeName)

'プロパティを使用する(更新)
emp.EmployeeName = "FLM02"

'メソッドを呼び出す
Dim name = emp.ShowEmpName()
MessageBox.Show(name)

名前空間

名前の衝突を防ぐために必要なもの。

詳しくは、ここを読んでください。

'名前空間の定義
Namespace MySpace1
    '同じクラス名
    Public Class MyClass1
        Public Shared Sub MyMethod1()
            Trace.WriteLine("MySpace1.MyClass1.MyMethod1 called")
        End Sub
    End Class
End Namespace

'名前空間の定義
Namespace MySpace2
    '同じクラス名
    Public Class MyClass1
        Public Shared Sub MyMethod1()
            Trace.WriteLine("MySpace2.MyClass1.MyMethod1 called")
        End Sub
    End Class
End Namespace

Public Class Form1
    Inherits System.Windows.Forms.Form
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'メソッド呼び出し
        MySpace1.MyClass1.MyMethod1()
        MySpace2.MyClass1.MyMethod1()
    End Sub
End Class

LINQ

Language INtegrated Queryの略。直訳すると、「統合言語クエリ」。クエリは「問い合わせ」の意味。

以下公式(MSDN)から引用。

統合言語クエリ (LINQ: Language-Integrated Query) は、クエリ機能を C# 言語 (および Visual Basic や場合によってその他の .NET 言語) に直接統合する一連の技術の名前です。 LINQ を使用すると、クエリは、クラス、メソッド、イベントなどと同じように、高度な機能を備えた言語構成要素になります。 クエリを記述する開発者の場合、LINQ で最も違いを認識できる "統合言語" 部分はクエリ式です。 クエリ式は、C# 3.0 で導入された宣言クエリ構文で記述します。 クエリ構文を使用すると、データ ソースに対する複雑なフィルター処理、順序付け、およびグループ化の操作を最小限のコードで実行できます。 同じ基本的なクエリ式のパターンを使用して、SQL データベース、ADO.NET データセットXML ドキュメントとストリーム、および .NET コレクション内のデータを照会および変換します。

クエリ構文とメソッド構文

LINQ の書き方には「クエリ構文」と「メソッド構文」の 2 種類がある。

Dim list = New List(Of Integer)(New Integer() {1, 84, 95, 95, 40, 6})

'クエリ構文
Dim query = From x In list
            Where x Mod 2 = 0
            Order By x
            Select x * 3

'メソッド構文
Dim query = list _
            .Where(Function(x) x Mod 2 = 0) _
            .OrderBy(Function(x) x) _
            .Select(Function(x) x * 3)