l_n_m’s diary

よわい電気系の日記(本当にただの日記)

OCamlに触れる

OCaml on JUPYTER

いろいろなプログラミング言語を見てみるという大学の講義で、今回OCamlをやりました。
関数型言語に触れるのは初めてで、最初はどう書けばいいのか正直分かりませんでした。でも簡単なものは書けるようになったので復習がてら。

let x = 1;;
let f p = p mod 2 = 0;;

基本の定義。変数が値を持つのは当然ですが、関数も必ず値を返すというのがなかなか慣れません。
CとかJSとかの関数はいくつかの処理を並べたものであって、それぞれの処理の値を返そうとするものではないですよね、
for文なんかはその最たるものかなと思います。ついCならああ書くのになぁ、なんて考えてしまって。
でも変数も関数も同じように扱えるというのはかっこいい、というか凄い。

let l = [1; 5; 8; 2; 13];;
let rec evens l = match l with
  [] -> []
  | h::t -> if h mod 2 = 0 then h :: evens t
    else evens t;;

リストと関数の再帰的定義、パターンマッチング。
確かにその書き方ならそうなるね、と言われれば分かりますけど、関数型言語初心者にこれを思いつけと言うのは酷かも。
headとtailの扱い方を一度出来てしまえば大丈夫ですが、前から順にやっていくのは新しいというか。
括弧の付け方とか変数の数とかきっちりしているのはいいですね。関数型言語に限らずかもしれませんけど。日本語とかの方がよっぽど雑。
文学科の友人に言わせれば、日本語よりロシア語の方が格によって厳密な意味が定まる、というのと重ね合わせるかも。

型推論

関数型言語の一番凄いところでは!
いろいろ厳密な関数型言語なのに、型は殆ど気にせず書ける。頭の中にある関数の意味をそのまま書き出せば、そこで使う変数やら引数は勝手に推測してくれる。
なんと便利なことでしょう!! JSのような型の無い言語でも似た話は出来ますが、あっちは意図していない型の変数でも受け取ってしまうのが欠点。むしろそれらの、例えばstringを期待しているときにintが投げられたときの処理をいちいち書くのが面倒くさい。だからこそTypeScriptとかが生まれたわけですが。
C++ならautoが全てに書かれているようなもの。しかも関数は全てtemplate。
もっと真面目に書けと怒られそうなレベルの話ですが、これが関数型言語のデフォ……理想郷か……?
もっと使いこなせるようになったら、関数型言語マニアに目覚めるかもしれません。目覚めないかもしれませんけど。

課題

今週末までにやらなくちゃいけない課題として、

が与えられました。ぼちぼち手をつけなきゃ。
実はアルゴリズムの講義を受けていないのでいろいろ知識が雑(クイックソートって言われて一瞬戸惑ってしまったレベル)。
基本用語ですし、そういう手法もおさらい(勉強?)しなきゃいけないかなぁ……。
それじゃ、今週も頑張ろう。うん。

ゲーム! ゲーム! ゲーム!

一段落

今週はだいぶコーディングに時間を割いていましたが、なんとか一段落しました。

というわけでやるぜゲーム! 行くぜゲーセン!

そういえばあと1ヶ月でガンスト2が稼働終了、3になりますね。個人的には稼動直後はゲーセンが大混雑してプレイ出来なくなるのでなんだかなぁと思うところもありますが、新しいキャラクターやらシナリオやら、期待しているところです。

ランク……

ナナちゃん可愛い! けど使ったことない。今度使ってみようかな?

でも茉莉ちゃんをSに上げる方が先かな。前作しづねちゃんAAAが最高ランクだったので、Sを狙いたい。

DDR

いつ以来だろう。判定調整が入った当日以来なような。なんと大学の先輩の足神の人がライバルに入れてくださったので、ちょっと頑張りたくなってしまいました。

まずは足17を再クリア埋めするところからかな。

グリザイアの果実

こちらも進めております。地の文が堅い方が好きなので、個人的に凄いスピードで読めてます。途中でダレて他のゲームも始めてしまい、ゲーム1本に半年とかかけることもありますが、この作品はそんなことも無さそうです。

エクストリームスポーツのくだりをつい今朝読んで、天音ぇが気になり始めたところ。これからどうなるのでしょう。

 

明日

ひとまずDDRボルテ、余裕があればBMSや最近やれていないルーンファクトリーフロンティアをやりたい。弐寺なんて無かった。

思う存分遊び倒したい! けど月曜は2限があるのでほどほどにしなきゃ。それでは。

VS C++コンパイルエラー

C2065 定義されていない識別子です

確かに。これはコード中で「std::list」とかの「std::」が抜けていたときに出る。

名前空間が違うのだからそりゃ確かに定義されていない。その通りだ。

「std::」を書いて解決。

未解決の外部参照

関数名がちらっとエラーメッセージ中に出てくるのでその関数の定義部をみる。たぶん何処にも書かれていない。

というわけで関数を定義して終了。

……というのがいつもの流れ。今回はここで詰まった。プロジェクトが何故かcppやhを自動で追加してくれないので手動で追加している(原因探すのも面倒くさいしそんなによくあることではないので気に留めていない)けれど、それをやり忘れていた。

厄介なのは、#include "hogehoge.h"とかの部分ではエラーを吐かず、しかもインテリセンスは正常に動作すること。関数を呼び出しているところを見ても、エラーの表示は無い。

というわけで未解決の外部参照が出たらこのことも思い出したい。

C4430 型指定子が見つかりません

今回一番詰まったのがこのエラー。

関数の頭には戻り値の型を書くのが普通です。そんなことは知っています。流石にそれも分からないで「C++少しわかるよ!」なんて言う人がいたらデューオ先生のジャスティスワンでも食らってください。

これがコンストラクタで出てくるのだから困ってしまいます。コンストラクタに型指定子なんか無いのだから、正常なことをエラーだと検知しているのではないか、VSクソだ、と言ってしまいたくなるところ。

ですが実際にそこを見てみると、コーディングが間違っていました。コンストラクタの引数に、

class Hoge{ public: Hoge(list&) };

となっていました。そう。さっきのC2065が本当のエラーだったのです。

コンパイラが誤判断しているわけですね……わけの分からないエラーメッセージが出たときにはその周辺をよく見ると全然違うミスをしているかも。

 

おわりに

エラーの起きない書き方をしたいですね。using namespace std;を書かないなら絶対にstd::を忘れないようにとか。

あと……C++使うならC++11使おうよっ! 便利な書き方いっぱいです。いや、速さとかまで言われると分かりませんけど。

コメントの重要性

共同開発の要

コメントはコメントでも、プログラムのコード中のコメントのこと。ブログのコメントなんざ思ったことを好きなように書けばいいわけで、特に何か言いたいこともありません。

共同開発する上で重要なのは、自分以外の開発メンバー(以下メンバー)への説明です。プロジェクトの全容把握は大変。コードの書き方も人によって違いますから、いちいち全部読んで構造を把握するのは無駄な苦労を伴います。

そこでコメントです。一言、これは何をする関数である。これは何のための変数である。特に関数は、そういうことが書いてあるだけで内部を読まずとも動作が大まかに分かるのですから、非常に読み易くなります。

当たり前のことを突然どうした

なんでこんなことをぼやいているのか。

友人と一緒にやっているプロジェクトで、友人のコードに一切コメントが無く、変数名や関数名からおおよその動作を推測して、曖昧なら中身を読んで、……というのを1000行足らず*数ファイルやることになってしまったからです。

しかも使っているクラスやその継承元が別のファイルにあることも多々あり。VS先生が無かったら探すのも大変だったでしょう。友人は綺麗に分類してくれているので、スパゲッティなことにはなっていないのがとてもありがたいですが。

当たり前っちゃ当たり前です。面倒くさがらないで書けばいいのです。後でデバッグしたりリライトしたりするときに、自分の助けにもなります。というわけで書きましょう。どんどん書きましょう。

人のふり見て我がふり直せ

では自分を振り返ってみると。

関数の頭にほぼ必ずコメント付けます。それもしてないくせにこんなこと書いてたら何様だよってなります。ですが、それが本当に分かりやすいコメントなのかと言えば、その点はまだまだ改善の余地があります。

例えば純粋仮想関数には何を記述すればいいのか。仮想関数は仮想関数でまとめてヘッダに並べて書かれているか。

使いやすくするためにお節介な関数を定義する以上に、読みやすいコードを書くほうが親切だなと思いました。

自分で書いたコードを理解しているのは当たり前。その次の段階として、理解していない人でもすぐ理解できるような書き方が出来る、を目指したいです。まずは変数や関数の定義する順番なんかから気にしていけたらいいな。

ところで、日本語大丈夫?

読みやすいコメントを書くということは、人に読みやすい文章を書くということです。このブログもそういう文章のひとつ。ちゃんとした日本語を書く練習には持ってこいです。

夢中で書いていると言葉の順番がぐちゃぐちゃになってしまったり、主張が曖昧になってしまったりします。高校のときの作文なんて酷いものでした。思い出すと恥ずかしくて叫びだします。

トーク力にも通じるところがありますね。こんなんだから面白い話が出来ないんだろうな……。

言葉を伝えるのって難しいですね。頑張ります。

ところで、html大丈夫?

だめです。

レイアウト

デザインの重要性!

デザインって大事。同じ機能を持っているのにデザインが違うだけで評価が変わることも多々ある。

そんなわけで、何らかのアプリケーションを作るときにレイアウト考えましょうという話。いちいちプログラム組んで画像表示する位置を変えて動かしてみて確認して、なんてアホらしいのでひとまず画像作ってみようというところから。……常識すぎる。けどこれまでは面倒くさがってなんとなくで済ませてたんですよね……いい加減そんなのから卒業しようと思い立ちました。

GIMP

イラレなんて高くてちょっと使えない。昔とあるサークルにいたときに、製品版がインストールされているPCを使えたので触ったことはありますが、あまりに多機能で自分には勿体無い。持て余すばかりです。

とするとフリーソフトに落ち着くわけで。優良ソフトGIMPさんでさっとレイアウト考えるための覚え書きを残しておきます。

あくまでレイアウトであって、色合いとかのデザインは全く考えません。要するに、何処に何を配置するかだけを考える。

流れ

画像生成(Ctrl+N) > 塗り潰し(Shift+B) > レイヤー追加(Shift+Ctrl+N) > (矩形など)適当に範囲選択(矩形R、楕円E) > 範囲を数字で指定(?) > 塗り潰し(ry)

後から選択範囲をいじいじできるので、最初に適当にマウスでピッと選択してよい。

レイヤー一覧とかあるウィンドウの一番上のタブにある「ツールオプション」に矩形選択範囲の数字があるのでそれを変更すればよい。

塗り潰しとか生成とかレイヤー追加はそれっぽいところからすぐ見つかるので割愛。

レイヤーを分けるのは、部分ごとに分けて後で削除したりまとめて移動させたりしたいから。範囲選択がすぐ出来れば作り直しもすぐ出来るので、杞憂かもしれませんけど。

ところで

高校の友人(大学は別)が、大学の演習の時間にプログラムの設計書を書いたと言っていました。まともに設計書を書かず、大雑把に実装しては躓いてばかりの僕なので、寝耳に水というか。

外部仕様書(ユーザー向け資料)と内部仕様書(設計資料)のふたつ。こういうのもしっかり書いてから取り組んだほうが作業が早い。当たり前ですけど……

大学の演習でローグライクもどきを作ったときも行き当たりばったりで作って、途中で仕様を変えたりクラスを追加したりと次第にしっちゃかめっちゃかになっていきました。とはいえある程度綺麗にコードを書きたい気持ちはあるので、たびたび見直して余計な記述を削除したり設計を変えたり(これが最大の時間の無駄感ある)。

実際に書かないと分からないことも多いですけど、それは経験不足に由来するものが殆どだと感じてます。流石にある程度プログラムも書けるようになってきた今、設計することも上手にならないといけなさそうです。

……コード見れば分かりますけど、プログラムもまだまだ酷いもんです。CodeIQの問題解いたりして勉強していますが、経験値が足りない。そのくせに使える言語も少ない。高校時代にプログラムを勉強しておけば良かったと常々後悔しています。

反省

情報量の無い記事になってしまった……。

GIMPにせよ何にせよ、どんなソフトも使い慣れておくと便利ですよね。さらっと欲しいものを自分で作れたらどんなに楽なことか。

学科の友人にプログラム書けるシスグラ描ける曲書けるなんて人もいて圧倒されます。見習って努力しないとです。

というわけで、反省を活かしてアプリ開発速度を上げたいものです。研究でも試作がすぐ出来るに越したことはありませんしね。

ではでは。

生活リズム崩壊

寝落ち

習慣になりつつあるんですが、晩ご飯食べてる途中、ふと箸を置いたときに寝落ちしてしまいます。さっさと食えってのに。

その結果午前2時とかに起きてしまうわけで、まともな生活リズムからはだいぶ離れてしまいました。正直研究室のmtg中に眠くなってしまうので早く直したい。

 

それはそうと

研究室の研究チームの説明を聞いたところなので、ぼちぼち自分の研究テーマについて考えながら論文を読んで勉強しなければならないところ。

先輩方は割とゆっくりやっていたそうですが、ハイスペックな人が多いので、僕は前倒しでやらないと間に合わなさそうです……。

おそらくVM関連の研究をやることになります。努力したことを見せれば卒論は大丈夫だなんて話もありますが、せっかく研究するからにはある程度しっかりした成果を出したいですね。作品を作る心構え、みたいなのにも通じそうです。

 

お勉強

今日学んだことも書かないと、お前説明聞いただけで満足なのか、ああん? と怒られてしまいそうです。正直時間が無い現状、集中してやることをやらねば。

いや、blogはその日の復習と日記ですからいいんですよ。うん。

今日はOCamlに少し触れました。関数型言語は初めて触るのでいろいろ慣れません。内容についてはもう少しまともにコードが書けるようになったら書いてみようかな。

研究周りでふと気になったことで、「ゲームソフトの割れ」についてほんの少し調べました。昔からanti-piracyについての記事は存在していて、如何に悪意のあるユーザーからソフトを守るかは長年の課題なんだなぁと思わされました。

PSPの事案については先輩から聞きました。PSPソフトをPS3用に変換するサービスがあったとか? どちらも所有していないので詳しくは分かりませんが。暗号化されているものを「復号」・再暗号化するために公開鍵どころか秘密鍵が入っていたようで。いや、秘密鍵入ったものを公開しちゃだめですよね……。

そんなドジっ子はさておき、MOTHER2の話なんかも先日偶然目にしました。5段階くらいセキュリティ網が張られていたようで、驚くばかりです。しかも気付かれにくいセキュリティ動作をする。後半はただの嫌がらせですけど、客でもない人には嫌がらせしてナンボですよね。詳しくはリンクを見てください。

EarthBound’s Copy Protection « EarthBound Central

 

音ゲー

夜中に目覚めるとなんとなく音ゲーしたくなります。jubeat plusとかもちょこちょこ。

今日のチャレンジではアガット引けました! 難しいけど楽しい。絶賛金欠中の僕には無料で遊べるのはすごくありがたい。いや、だったらBMSもやれって話になってしまうんですけど……。

やること

いい加減やることが溜まってしまったので頑張らなくては。明日から講義もなく、次は月曜なので一気に片付けたい。いつもすぐゲームを始めてしまうのですが、控えめにしてタスク消化頑張ろう。うん。

……中学とか高校とかのときの集中力をまた発揮しなければ。

マザボの基本?

BIOSが起動しない

なんでやねん。

いろいろあってwakeonlanを使ってみることにしました。

wakeonlan超便利ですね。なんか遠隔操作感あって自分強そうって錯覚する。

小学生の頃、友達のSくんがwinのバッチファイルで遊んでたことを思い出しました。

小学生とは言わなくても、中学生の頃wakeonlanとかの設定が出来たらクラスの中で「すごいやつ」になったかも、なんて妄想したり。

もっと凄い人いっぱいいますけどね……競プロとかやばいじゃないですか。

 

それはそうと、winの設定やらwakeonlanをサーバーのhomeに置くとか、その辺はさらっと終わりました。

まだwin7。win10にしたらこういう設定吹っ飛んだりしそうで怖い。

大丈夫な気もしますが……ちょっとね。

 

そっちの設定が終わったらBIOSの設定もいじらなくては。

ついでにディスプレイが2つになったのでデュアルディスプレイと洒落こんでみました。

BIOSからデュアルディスプレイをenabledにし、ついでに給電設定も変えて消費電力を減らし。要となる電源オプションのResume from PCI-E をenabledにしたところ。

起動したときにBIOS画面に入れなくなりました。

一瞬Americanなんちゃら(アレ)が映るもののすぐに消えてOSは立ち上がらず、しかもdelete押してもentering setup....と表示されて動かなくなるだけ。

CMOSクリア(やったことも聞いたこともありませんでしたが、たまたまPC自作してる友達がいたので助けてもらいました)したものの起動したりしなかったり。

 

解決

結局悪さをしてたのは、ディスプレイポートとdviを両方繋いでデュアルディスプレイにしていたことでした。

どうやらBIOSがどっちをメインにするか決められず、どちらにも出力されないまま停止してしまったようです。

結局BIOSメニューでデュアルディスプレイをenabledにしたりdisableにしたりしてテストしたもののダメだったので、dviを外してディスプレイひとつで使うことにしました。

そのうちまたデュアルディスプレイに挑戦しようかなと思いますが、ひとまずこのままで。

 

参考

今回学んだのは、

  • BIOSの設定項目

でした。BIOSで給電やらなんやら設定するのは初めてでした。

CMOSクリアは特定のピンを短絡する、それ用のスイッチを押す、ボタン電池と電源コード引っこ抜いて放置。

PCI-Expressについては以下のリンクを見てみました。32bit以上がデフォルトになった現代のための規格ですね。8bitデバイスに対応するための機器とかバス切り替えしてた機器とかを取り払って効率化した規格……で合ってるかな?

だいぶデータ転送効率も上がっているようで、発展を感じます。

ISA、EISA、MCAといった昔の規格も名前くらいは覚えておきたいな。

PCIバスにはじめて関わる方 | ソリューションガイド | 株式会社PALTEK