メモ帳

やったことや思いついたことをメモする帳。技術系メイン

PC動作軽減大作戦

とあるPCゲームをやっていたところ、PCの挙動がやたらと重たくなってしまってまともにプレイできなくなってしまいました。 原因がわからなかったので、とりあえず軽くするためにやった方がよさそうなのを適当にやってみました。

クリーンアップ

HDD内をほぼ自動で綺麗にしてくれるありがたい機能です。 これをやってみるだけで大分軽くなりました。 OSとかでやり方は変わってくると思うのですが、

f:id:ashkeys:20140224004546j:plain

この画像の左側のタスク一覧の「ディスククリーンアップを開く」をクリックしたら、いきなりデータ整理?が始まりました。 そこそこ時間がかかります。

しばらく経つといくつか種類のあるデータの内の何を綺麗にするか聞かれます。 もちろん全部チェックしてやりました。ゴミ箱が12GBありました。

XPまでは「古いファイルの圧縮」という項目があって、それはあんまりやっても意味なかったり危険だったりするそうです。

以降の画像のOSはWindows Vistaです。右側のパフォーマンスは気にしないでください。

チェックディスク⇒デフラグ

HDDの中のデータが壊れてないかチェックして、その後デフラグをするとPCの動作が早くなることがあります。

f:id:ashkeys:20140224003948j:plain

画像の「エラーチェック」がいわゆるチェックディスクで、「最適化」がつまるところデフラグです。 このPCではデフラグが一か月ごとに定期的に行われる設定になっていたので、デフラグはやりませんでした。 画像はVistaのものです。

スタートアップの設定変更

PC起動時に勝手に動き出すプログラムがうっとおしかったりします。そいつらを切るために設定を変更することができます。 下の画像のところからできるようです。

f:id:ashkeys:20140224013109j:plain

大して使いもしないソフトのアップデートなんかは切ってしまいましょう。これをするとかなりストレスレスです。すとれすれす。

ちなみに、Windowsキー+Rキーから「ファイル名を指定して実行」を呼び出して、"regedit"と入力するとレジストリエディタが開いて直接レジストリの中を触ることができます。

f:id:ashkeys:20140224011036j:plain

レジストリは下手にいじるとPCが起動すらしなくなりますが、怖いものが見たい人は是非見てみてください。決していじってはいけません。

ほこり掃除

物理的にPCを綺麗にする作戦です。 今回はほこりが排気口に思いのほか溜まっててビックリしました。

ほこりをためておくと、PCが熱を持ちやすくなってしまいます。 すると、熱くなりすぎると危ないのでBIOSが勝手に処理速度を落としてくれます。

安全装置が働くことで、結果的に遅くなってしまうというわけですね。


こんな感じでいくつか試してみたわけですが、当初の目的であったゲームの動きはあんまり変わりませんでした。

おかしいと思ってゲーム内の設定を見てみたら、設定がリセットされてて処理の重たい設定に切り替わってました……。 設定を戻したら元通り。

結果的にPCの挙動自体はよくなったので、よしとします。

より詳しくは下記サイトやググって出てくるサイトを参考にしてみてください。

メンテナンス パソコン初心者講座

読書「誰のためのデザイン?」

読んだ本の紹介。

誰のためのデザイン?―認知科学者のデザイン原論 (新曜社認知科学選書)

誰のためのデザイン?―認知科学者のデザイン原論 (新曜社認知科学選書)

この本の主題ユーザ中心のデザインについてであり、とてもよいものです。 何かものを作ってる人にはすべからくオススメしたい本です。

書いてある内容の大半はある意味当たり前のことでもあるのですが、その当たり前が出来てない人にはもちろん役に立ちますし、 出来てる人にもこの一冊で大事なことは大体網羅されてるので、復習がてらちょいちょい見直すのに便利です。

単純に読んでて面白いので、長くても(400ページくらい)あんまり中だるみしないところもよいです。これは人によるかもですが。

特にデザインを行う上で、下記四つの事項がしっかり守られているかというのは大変わかりやすい指針であり役に立ちます。

  • 可視性
  • よい概念モデル
  • よい対応づけ
  • フィードバック

アフォーダンス」という言葉が広まったのもこの本がきっかけなんじゃないでしょうか。 しかしこの本での使い方としてはあまり正しくなかったと、著者自身が後で言っております。

正確には「知覚されたアフォーダンス」であり、現在では「シグニファイア」という新たな言葉で再定義されていますね。 この件については下記サイトがとてもわかりやすく解説してくださってます。

アフォーダンスからシグニファイアへ - A Successful Failure

最後に、この本の中で個人的にとても痺れた部分を引用して終わらせていただきます。 悪いのはユーザではなく、デザインであるという意識を持たねばなりません。

あるいは、普通の数学のカリキュラムを考えてみてほしい。 そこでは、容赦なく授業は進められ、新しい単元に入るときには、 それまでに学んだことのすべてを学生が理解していることを前提にしているのである。 一つひとつは簡単だったとしても、一度落後したら追いつくのは大変だろう。 そして、その結果数学嫌いが一人誕生する。 それは、教えられる題材が難しいためではなくて、ある段階において困難が生じると、 それ以降の進歩をはばんでしまうようなやり方で教えられるためなのだ。 いったん失敗すると、自分を責めるということによって数学一般にすぐ般化してしまうことが問題なのである。

同じようなプロセスが技術の分野でもよく見られる。悪循環は次のように始まる。 何かで失敗したとき、それは自分のせいであると考える。そのため、その作業は達成できないと思う。 その結果として、次にその作業をしなければならなくなっても、できないと思うのでやってみることさえしなくなる。 その結果、あなたが思った通り、できない。 こうして、あなたは、自分が予想した通りのことが、まさに予想したことによって実現してしまうという自己成就予言のわなに落ちてしまうのだ。

Steadicam カメラスタビライザー

最近取り組んでいるものについてご紹介を。

動画を撮影する際の手ブレや身体の揺れによって、撮影後に確認した映像がガタガタになってることがあります。 立ってるだけでも呼吸によるブレは起こりますし、歩いたり走ったりすればもうガックガクです。

実写と3Dの合成(マッチムーブ)するときなんかでも、撮影段階で動画がブレていると画像解析によるカメラのトラッキングが難しくなります。

そんなときにSteadicam(ステディカム)と呼ばれるものを使えば、とてもなめらかに映像を取ることができます。

実際に上手に撮影するとこんな映像が撮れます。

まるで低空を滑空してるみたいな映像とか撮れますね!

とはいえ、セットアップがかなり難しいです。一筋縄ではいきません。

↓の二つの動画が日本語でかつわかりやすかったので、リンクを張っておきます。 Steadicam Merlin Setup ステディカム マーリン セットアップ

Steadicam merlin取材風景

最後に代表的なSteadicamへのリンクを張っておきます。 他にも体と固定するベルト付きのものや、1万以下の安いものなどもあるようです。

【C++】演算子オーバーロード時の暗黙的アップキャスト

C++では、演算子をオーバーロードしてクラスの使い勝手をよくしたりすることができますが、 継承と一緒に使う時に発生したアップキャストに結構混乱した上まだわかってないところがあるのでメモ。

以下は、coordクラスとそれを継承したnyanクラスを利用して、オーバーロードの働き方を示すサンプルです。 nyanは特に意味のない、hogeとかpiyoみたいなものです。せっかくなので好きなものにしています。

ソースコード

#include <iostream>
using namespace std;

class coord
{
public:
    coord(){x = 0, y = 0;}
    coord(int i, int j){x = i, y = j;}

    coord operator+(const coord ob2);
    coord operator=(const coord ob2);
    
    int x, y; // coordinates
};

coord coord::operator+(const coord ob2)
{
    cout << "coord operator+(coord, coord)" << endl;
    coord tmp;
    
    tmp.x = x + ob2.x;
    tmp.y = y + ob2.y;
    
    return tmp;
}

coord coord::operator=(const coord ob2)
{   
    cout << "coord operator=(coord, coord)" << endl;
    
    x = ob2.x;
    y = ob2.y;
    
    return *this;
}

class nyan : public coord
{
public:
    nyan() : coord(0, 0){}
    nyan(int i, int j) : coord(i, j){}
    nyan operator=(const coord ob2);
    //nyan operator=(const nyan ob2);
};

nyan nyan::operator=(const coord ob2)
{
    cout << "nyan operator=(nyan, coord)" << endl;
    x = ob2.x;
    y = ob2.y;
    
    return *this;
}
/*
nyan nyan::operator=(const nyan ob2)
{
   cout << "nyan operator=(nyan, nyan)" << endl;
   
   x = ob2.x;
   y = ob2.y;
   
   return *this;
}
*/
int main()
{
    cout << "nyan o1(5, 5), o2(-1, 4), o3" << endl << endl;
    nyan o1(5, 5), o2(-1, 4), o3;

    cout << "# o3 = o1 + o2" << endl;
    o3 = o1 + o2;
    cout << "X: " << o3.x << ", Y: " << o3.y << endl << endl;
    
    cout << "# o3 = o1" << endl;
    o3 = o1;
    cout << "X: " << o3.x << ", Y: " << o3.y << endl;

    return 0;
}

出力結果

nyan o1(5, 5), o2(-1, 4), o3

# o3 = o1 + o2
coord operator+(coord, coord)
nyan operator=(nyan, coord)
X: 4, Y: 9

# o3 = o1
coord operator=(coord, coord)
X: 5, Y: 5

# o3 = o1 + o2

まず、演算子の順序から、o1 + o2の計算を行います。 o1, o2共にnyanクラスですが、(nyan, nyan)に対応する演算子がないので、暗黙的にアップキャストされて(coord, coord)の演算子が使われます。

次に、o3 = (o1 + o2)の計算が行われます。 o3はnyanクラス、(o1 + o2)は演算子の返り値より、coordクラスです。 したがって、(nyan, coord)の演算子が使われます。

# o3 = o1

o3, o1共にnyanクラスですが、(nyan, nyan)に対応する演算子がないので、暗黙的にアップキャストされて(coord, coord)の演算子が使われます。

ここで、なぜ(nyan, coord)ではなく、(coord, coord)が使われるのかが分かりません。

上記のコードのコメントを解除し、(nyan, nyan)対応の演算子を作成すると、

# o3 = o1
nyan operator=(nyan, nyan)
X: 5, Y:5

のように、(nyan, nyan)対応の演算子が優先されます。

優先順位としては、

  1. (nyan, nyan)
  2. (coord, coord)
  3. (nyan, coord)

のようになっているようです。

(nyan, nyan)は型にピッタリ適合しているから優先されるのはいいとして、残りの二つはどういう理由で選択されているのかが分かりません……。最適化?ウーン

ちなみに、ここで使わないからとうっかり(nyan, coord)を消してしまうと、先ほどのo3 = (o1 + o2)のときに(nyan, coord) がなくてエラーに引っかかります。

nyan は coordで代用できますが、coord は nyanで代用できません。


派生クラスは基底クラスで代用できますが、基底クラスは派生クラスで代用できません。


ということですね。

それ自体は当たり前のようですが、うっかり派生クラスの演算子を書き忘れた時に、コンパイラが気を利かして基底クラスの演算子を活用してしまったばっかりにバグに気付かない、なんてことが普通に起こりそうで怖いです。

今回は演算子を例に出しましたが、関数でもおそらく同じことが起こります。 継承は慎重に使う必要がありますね。

最後に話はそれますが、typeinfoヘッダを使って実行時に型を確認することもできます。

が、typeid(T).name()を使ってみたところ、出力結果にゴミが入ってたのでカットしました。 検索するとメモリリークの問題があるみたいなので、その関連かもしれません。

読書「プログラマの数学」

本について書くときは「書評」とかが一般的な感じですが、 そこまでする気もないので「読書」カテゴリで書いてみる。

今回はこの前読み終わった「プログラマの数学」について。

プログラマの数学

プログラマの数学

プログラマに向けた数学の本ですが実用的な内容というよりは、数学的素養を磨く、といった内容でした。

ゲームプログラミングだと、ベクトルとか行列を使った線形代数学が特に重要になってくるわけですが、そういった内容はでてきません。 剰余、順列・組み合わせ、数学的帰納法、再帰などについてプログラミングを絡めつつ解説してくれます。

難しい専門用語とか数式はほとんど出てこないので、数学苦手だけど興味がある人とか、復習したいと思っている人が対象として向いている気がします。僕みたいに。

プログラマに限らず広くオススメできます。

再帰のプログラムって結構苦手な人が多いと勝手に思ってるんですが、この本を読んでなんとなく克服できそうな気がします。 例にハノイの塔が出てくるのですが、こんな簡単に解けるのか!と思いました。

本全体を通しての一貫とした主張は、

「パターンを見ぬき、一般化する」です。

まさにプログラマに必要な力だと思います。

著者の結城さんは、Javaで学ぶデザインパターン入門や数学ガールなんかを書いてる人で、とても読みやすい文章を書いてくれる人です。 お気に入りです。

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

数学ガール (数学ガールシリーズ 1)

数学ガール (数学ガールシリーズ 1)

PC掃除

近頃PCの調子が悪くて急にブルースクリーンになったりするようになったので、 ケースを開けて中を思いっきり掃除しました。

f:id:ashkeys:20130922151156j:plain

掃除するために外せそうなパーツは大体全部外して、掃除機でホコリ吸い取ったりしました。 個々のパーツごとに写真でも撮っておけばよかったのですが、掃除するのに精一杯で忘れてました。

上の画像は掃除が終わってから撮った写真です。

6年半5年半前にドスパラでBTOで購入したパソコンなのですが、なんだかんだでよく持ってる方なのかなと思います。 6年半5年半って結構頑張ってる気がしますよね。 その間、掃除もほとんどしてないしパーツ入れ替えとかもちろんしてなかったのに。

最近になってようやくハードの方にも興味を持つようになってきたところです。 色々改造してみたい反面、もういっそ新しく買い替えたいという気持ちが強かったり……。

ちなみに構成は、

  • Core 2 Duo E6850 (4M L2Cache, 3.00 GHz, 1333 MHz FSB)
  • 2GB DDR2 SDRAM
  • P35 Express チップセット ATXマザー
  • GeForce 8800GT 512MB
  • EVERGREEN Silent King 4 550W

あたりです。

その他もろもろ(ディスプレイは別)ついて、当時は税込14万したようです。 グラボとかオーバースペック気味に買ったんですけど、今でも大抵のPCゲームなら動くのでありがたいです。

で、掃除の結果ですが、とりあえずは落ちなくなりました! 音も静かになったので、怪しいのは電源のホコリかなぁ。

お試しMarkdown記法

はてなブログにはブログ書くときの記法がいくつか用意されているようです。

今まで「見たままモード」で書いていましたが、ソースコード貼り付けたりするときは、 シンタックスハイライト機能が付けられるMarkdown記法とかを使うとよさそうです。

シンタックスハイライトというのは、↓みたいにソースコードを読みやすいように色をつけてくれる機能です。たぶん。テキストエディタとかIDEによくついてる機能ですね。

#include <iostream>

int main(){
  int i = 10;  // 意味のないコメント

  while(i > 0){
    std::cout << "Syntax Highlight: " << i << std::endl;
    --i;
  }

  return 0;
}
/* これはC++だけど、他の言語もたくさん対応している模様。 */

他にも色々な機能があって、↑でもやってますがソースコード部分だけ囲って表示したりもできて便利です。

見出しをつけたりも可能です。

見出し1号

2号

3号

4号

他にも学術論文に多用されるTexも書ける。

f(x)=\int_0^{x}g(t)dt

このブログで使う機会はそうそうないと思いますけど。

慣れれば楽ですし色々使いかたはあるようなので、 はてなブログではじめるMarkdown記法などを見てみると面白いかもしれません。