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)

たかが文字列連結で上司に指摘された話

会社の先輩にレビューで指摘を受けた話。

備忘録として残します。詳しい解説は他サイトに任せます。

VB.NETで文字列連結してみよう

余裕でしょ

業務で以下のようなコードを書いたところ、先輩から指摘を受けました。

Public Class Application
    Public Shared Sub Main()
        Dim person As String = "キャル"
        Dim word As String = "ヤバイわよ!"
        
        System.Console.Write(person + "「" + word + "」" + vbCrLf)    
    End Sub
End Class

vbCrLfは改行コードです。

実行結果

キャル「ヤバイわよ!」

何がヤバイのか

2つの点を指摘されました。

  • 文字列連結にはプラス(+)ではなくアンパサンド(&)を使うこと。
  • 連結が多くなる場合は、StringBuilderを用いること。

文字列連結は+を使うってペコリーヌも言ってたよ

私の尊敬する方の一人にペコリーヌさんという凄腕プログラマーがいます。

ペコリーヌさんは食わず嫌いなので、数多のプログラミング言語を触っています。

ペコリーヌさん曰く、

文字列連結は+を使う言語が多いですね!JavaPythonC++JavaScriptRuby、Go、Scala、F#、...

後半の方はよく知らない言語が多く、聞き流してしまいました。

とりあえず文字列連結はプラス(+)を使っておけばOKだと思っていました。

VB.NETプラス(+)とアンパサンド(&)どちらも文字列連結に使えるから、わざわざ慣れているプラスから変える必要は無いよね?

ヤバイ落とし穴があった

実際のプログラムを見てみましょう。

Public Class Application
    Public Shared Sub Main() 
        Dim a As Integer = 2
        Dim b As String = "4"
       
        System.Console.Write(a + b)
        System.Console.WriteLine("歳、学生です。")
    End Sub
End Class

何も考えず、数値型と文字列型を文字列連結したいことってありますよね?

データの型を意識するのが困難なケースもあると思うので、サクッと書ければ嬉しいものです。

このコードを実行してみると...

6歳、学生です。

...普通だな!

下手すると、この子は学生ではなく児童かもしれません。

なぜか期待した結果と違いますね。

よく見てみると、数値型と文字列型の足し算が行われているようです。

最初はただ文字列連結がしたいだけだったのに...(東京神話)

段々と脱線してきました。プラスからアンパサンドに変えてみましょう。

Public Class Application
    Public Shared Sub Main() 
        Dim a As Integer = 2
        Dim b As String = "4"
       
        System.Console.Write(a & b)
        System.Console.WriteLine("歳、学生です。")
    End Sub
End Class

実行結果

24歳、学生です。

やったぜ。

文字列連結はプラスでもアンパサンドでもどっちでもOKと言っておきながら、Microsoftアンパサンドを推奨しています。

+演算子を使用すると、加算または文字列の連結が行われるかどうかを判断できない場合があります。 &演算子を連結に使用して、あいまいさをなくし、自己記述型のコードを提供します。

+ 演算子 (Visual Basic) | Microsoft Docs

詳しくは上記のサイトでご確認ください。

そんなにヤバくは無い方

2つ目の指摘、StringBuilderは実行時間で優位になるものらしいです。

あとはプログラムの見やすさも向上しますね。

気になる方は、下記のサイトが分かりやすいので見てみてください。

文字列処理を高速に行う - .NET Tips (VB.NET,C#...)

まとめ

公式ドキュメントはちゃんと読もう。

たかが文字列連結。されど文字列連結。。。

あとGoogleで検索して一番上に出てくる、最終的にプログラミング教室に誘うサイトは過信してはいけない。

はてなブログと無限アラート

こんにちは。せいんと(@773_Arihara)です。

今回は、はてなブログについての子ネタです。

技術者しか興味が湧かなそう話題ですが、後半には皆さんに是非知って欲しい話題に触れます。

はてなブログは最高だぜ!

そんなに記事書いてないクセに何を言ってるんだという感じですが、この記事で最高な点を確認したいだけです。ごめんなさい。

シンタックスハイライトだと...!?

C

#include <stdio.h>
int main(void){
    char *str = "Hello, World!";
    //文字列表示
    printf("%s¥n", str); 
}

VB

Sub Main()
    Dim str As String = "Hello,World!"
    'ダイアログ表示
    MessegeBox.Show(str) 
End Sub

古臭い言語なのはさておき、コードに勝手に色が付きます。

アウトプットに結構便利そうですよね。

Markdown記法が使えるだと...!?

f:id:Arihara:20190820230649p:plain
VSCodeでのMarkdownの編集画面

実はこの記事はプログラムを書くのに使うVisual Studio Codeというソフトで書いていたりします。

それは、はてなブログMarkdownというマークアップ言語に対応しているからです。

見出しや字のスタイルの設定、表の作成なんかが楽に出来ます。

githubでアプリケーションをダウンロードする時に、readme.mdという形式のファイルを目にする事が多いと思いますが、アレもMarkdownで書かれたものです。

あと数式も入力できます。理系ホイホイですね。

元コード(TeX)

\boldsymbol{F}\_{ped\_i}=
\frac{Q\_{ped}}{\|\boldsymbol{f}\_{ped\_i}\|^2}\cdot
\frac{\boldsymbol{f}\_{ped\_i}}{ \| \boldsymbol{f}\_{ped\_i} \|} 
\cdot \cos \theta\_{ped\_i}

出力結果


\boldsymbol{F}_{ped_i}=
\frac{Q_{ped}}{|\boldsymbol{f}_{ped_i}|^2}\cdot
\frac{\boldsymbol{f}_{ped_i}}{ | \boldsymbol{f}_{ped_i} |}
\cdot \cos \theta_{ped_i}

上式は私の卒論で出てきた式です。

JavaScriptが貼れるだと...!?

これは割と貼れるサイトが多いかもしれませんが、気にしないでおきます。

ということで、ひとつスクリプトを貼ってみます。

無限アラート事件って知ってる?

無限アラート事件(むげんアラートじけん)は、電子掲示板に不正プログラムを書き込んだとして5人が摘発された事件である。

無限アラート事件 - Wikipedia

いたずらごころ掲示板にURLを貼ったJCが警察に捕まっちゃった事件ですね。

私も子供時代にこういうイタズラしてたような気もしますが...

アラートというのは、ブラウザで最前面に表示されるメッセージの事です。

例えば、何かしらのサイトの会員登録をする時に電話番号が未入力だったりすると、『必須項目が未入力です。』などのアラートが表示されるケースが挙げられます。

無限アラートというのは、閉じても閉じてもアラートが出てくる嫌がらせのようなもので、電子機器を破壊するような類いのプログラム(=ウイルス)ではありません

というのが個人的な見解。

一方検察側は、こう述べているそうです。

ウイルス罪を成立させる要件の1つ『人が電子計算機を使用するに際してその意図に沿うべき動作をさせず、又はその意図に反する動作をさせるべき不正な指令を与える電磁的記録』の『意図に反する』の部分に抵触する。

どんなプログラムでも意図しない動作なんて幾らでもありますが...

プログラマーの間では、この件は結構物議を醸しています。

とりあえず利用者に意図させれば、無限アラートのプログラムを貼っても逮捕はされなさそうです(多分)。

実際のプログラムは?

こんな感じです。

    function onButtonClick() {
        for(;;){
            alert(" ∧_∧ ババババ\n( ・ω・)=つ≡つ\n(っ ≡つ=つ\n`/  )\n(ノΠU\n何回閉じても無駄ですよ~ww\nm9(^Д^)プギャー!!")
        }
    }

for文という繰り返しを制御する関数の中で、アラートを表示させるように書かれています。

本来for文はそのループを抜ける為の条件を指定するのですが、このプログラムでは省略されている為、無限にアラートが出る訳ですね。

この記事の最下部のボタンをクリックすると、この無限アラートのプログラムが実行されます

抜け出すには、タブを閉じればOKです。それでもダメならブラウザを落とす必要があります。

クリックして電子機器が壊れてしまった方は、せいんと(@773_Arihara)までご連絡ください。

そうなった場合は逮捕されちゃいますね...