TOEICを受けてみたメモ(後編)

前編の続きです。

2010/04〜2010/05 仕事が忙しくなる。

DUOをやっていたのですが、この時期は仕事が忙しくて何もしませんでした。眠かったので、電車でも寝てたし。

2010/05 再開

さすがにやばいと感じて、仕事の合間を縫ってむりやり再開しました。連休明けくらいからです。
まずは残りのDUOをこなしました。たぶん2週間くらい。

CDも会社の往復中ずっと聞いていたのですが、やっぱりわかった感じがせず。耳では記憶している気がするのですが、英語として入っていかない印象でした。

2010/05〜2010/06 試験対策

そろそろ試験が近づいてきたので、試験対策を行いました。まず、DUOをやめて問題集をといてみました。

1日1分レッスン! TOEIC Test パワーアップ編 (祥伝社黄金文庫)

1日1分レッスン! TOEIC Test パワーアップ編 (祥伝社黄金文庫)

これはかなり効果が実感できました。最初、とけなかったページをマークしていたのですが、途中から「これってできたページをマークしたほうが早くね?」というくらいのできばえでしたが、かなり点数が伸びた気がします。

この本は2周しました。もっと時間があれば、このシリーズのほかの本をやれば手っ取り早くTOEICの点数が上がると思います。

2010/06 模擬試験

最終的には模擬試験をときまくればいいらしいので、これを買ってきました。

新TOEICテストスーパー模試600問 (TOEICテスト スーパーシリーズ)

新TOEICテストスーパー模試600問 (TOEICテスト スーパーシリーズ)

勉強開始前に買ってきて、点数を計ったのもこの本でした。

ラスト2週の週末でこれをといてみました。後は、解けなかった問題(特にリスニング)の復習とかやってました。
TOEICの時間配分が難しいのですが、ネットで調べたり友人に聞いたりした結果「後ろの長文からといて、文法問題は勘で埋める」ことにしました。このほうが点数よかったし。この時点ではあまり気づいていなかったのですが、文法弱いし。

点数は、最後の回が650とか。けっこういけてんじゃん。最終的には700近くまでいくんじゃね? という感じで終わりました。

本番

というわけで、本番に挑んでみました。結果ですが、Listening360, Reading265の635点。とりあえず当初の600点ラインはクリアしたのですが、投資した時間を考えるともう少しほしかったなという・・・ まぁいいか。

まとめ

結局は「ある程度基礎勉強をやって、模擬試験をひたすらときまくる」というありきたりな勉強方になった上、それほど点数が伸びないという話なのですが、曲がりなりにも半年やってみて反省点がいくつかあるので列挙してみます。

文法はもう少しやっておけばよかった。

文法の解説書は結構時間を使ってやったのですが、やっぱり文法わからん。解説読んだだけでは結局だめで、英文読解の本を読んで実際に文章で正確に読む練習とかをしたほうがよかったかなと。特に(小生のように)高校時代英語がさっぱりな人間は、文法の教科書をやった後は文章を読んだほうがいいかもしれません。

逆に今回文法がだめとわかり、普段読んでいる英語の解釈がいかにテキトウかと思い知ったのがよかったかもしれないです。

単語集は(小生には)向いていない

自分の向き・不向きとか、現時点の実力を分析すると、やはり(例文形式とはいえ)DUOはやらなくてもよかったかなと。読んでいても知らない単語ばかりなので、記憶にかなり負担がかかったために覚え切れなかったのではないかと分析しています。

それをやるくらいなら、(先の項目とつながるのですが)わからない単語がぽつぽつあるような本を多読するとか、精読するとか、そういう勉強法の方がよかったのではないかと思います。

たとえばこの辺とかで。

速読英単語1 必修編 改訂第4版

速読英単語1 必修編 改訂第4版

みるみる英語力がアップする音読パッケージトレーニング(CD BOOK)

みるみる英語力がアップする音読パッケージトレーニング(CD BOOK)

単語集をやるのは、文章をある程度読み込んだ人がやった方がいいと思います。ある程度読んでいる人の場合、文章中の知らない単語の量が減っているはずなので、単なる文章よりも密度の濃い本でやったほうがいいはず。

一日1分シリーズは即効性あり

これは普通に聞きました。このシリーズをひたすらときまくれば、TOEICの点数は伸びると思います。

あとは模擬試験をときまくる。

普通の試験勉強と同じですね。


英語はもちろんこれで終わりではなく、第二章「多少点数が伸びて、調子に乗って英会話学校に挑んで撃沈する」があるのですが、それはまた次の機会で。

TOEICを受けてみたメモ(前編)

今年の前半にTOEIC対策で英語を勉強していたときのメモが残っていて、しかもぜんぜん誰にも見せる機会が無さそうなので、適当に整理して貼っておきます。

実際にはたいした点数は取れていないのですが、ある意味失敗談として公開してみます。
ネットだとすごい人しか感想を書いていなくて、私のような凡人はいまいち参考にならんのですが、こういう話があってもいいのかなと思います。

2010/02 はじめる前の状態

そもそも英語を勉強し始めた動機は、会社命令でTOEICを受けることになったので、せっかくだからちゃんと勉強しようと思ったことです。「会社が受験料を出すんだし、これを機会に高得点とって、転職に役立てればいいんじゃね?」とか、そういう感じです。会社から見たら最悪な社員ですが。

勉強開始前のスペックは、

  • 英語は基本的に好きだけど、受験勉強ではぜんぜん点に結びつかず、足を引っ張っていた。(今考えてみると、文法と単語を知らないから)
  • 英語を読む機会は、プログラマなのでそこそこある。マニュアルなどは我流+Yahoo翻訳で意味をつかむが、英文メールが来て返信しなきゃならなくなると死にたくなる。
  • 勉強開始前にTOEICの模擬試験をやってみたところ、460点。時間が足りなくて呆然とする。

会社的には、目標600点らしいです。先は遠い。

2010/02 勉強法を探す

まず、英語を勉強するという決意を固めたものの、どう勉強していいのかわからなかったので、勉強法を探してみました。

もともと自分の勉強方などは持っていない、というか、そもそも確立した勉強法があるような人間なら、受験とかもうまく言っているだろうと思います。

検索したら、やたらとはてブがついたページが引っかかったので、この勉強を丸ごと採用することにしました。

http://d.hatena.ne.jp/bambix/20070312/1173628642

2010/02〜2010/03 文法の学習

上の勉強方のとおりに、まずは文法から勉強してみました。テキストも勉強方どおりで、こちらです。

TOEIC(R)TEST文法完全攻略 (アスカカルチャー)

TOEIC(R)TEST文法完全攻略 (アスカカルチャー)

文法は結構楽しくて、1日1時間くらいで1ヶ月で終了(正確には、2010/02/08〜2010/03/09まで)
反省としては、ある程度時間を置いてからもう一回復習すべきだったかなと思います。ただ、文法を先に勉強しておくという順番そのものはよかったと思います。

2010/03〜2010/04 単語を学ぶ

文法は一通り終わったものとして、次は単語をやります。

DUO 3.0

DUO 3.0

この本とCDを買ってきて、電車の中で読んで/聞いてみました。

が、やってみたのですがぜんぜん頭に入らない。

おそらく当時の実力に比べてDUO3.0の難易度が高かったことと、そもそも暗記物が苦手だったが理由だと思います。

もともと暗記物が苦手な上に、わからない単語がほとんどという単語集を頭から覚えていくという勉強法がどうもあっていないようでした。せめて単語をやるにしても、もう少し簡単な単語集にしておけばよかったかなと。

この時期に覚えた単語が、最終的に点数に結びついたかというと微妙な感じです。

(後編につづく)

最近のゲームとか

  • Red Dead Redemption買いました。西部劇は楽しいんですが、細部がちょっと荒いかなあと。字幕の字が小さくて見づらいのですが調整不能とか、夜の街の処理落ちがひどいとか。あと解像度が低いみたいで、ポリゴンが微妙にジャギります。でも面白いですよ。

  • 戦国IXAもやってます。これも面白いけど、結局「金をいっぱい使った人」と「時間をいっぱい使った人」が圧倒的優位というガチな感じで、しがない平凡なサラリーマンでしかない小生は終始蹂躙されっぱなしです。もうちょっと知恵とか工夫とかでなんとかなっても委員じゃないかなあという気もしますが。でも面白いですよ。

ゲームプログラマになるには

たまたま似たような質問

プログラマ、SE、ゲームプログラマについて
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1438427284

すごい要約すると、ゲームプログラマになりたくてどうすればいいのですかって話です。
おそらく質問者は高校生だと思うのですが、それに対するベストアンサー

1.とりあえずC言語。ポインタや構造体は完璧に理解できないとだめです。
「新版 明解C言語入門編」。
http://www.bohyoh.com/Books/MeikaiC01/index.html
「Cの絵本」http://www.seshop.com/detail.asp?pid=1806

1.5.DXライブラリの学習。ゲームプログラミングの楽しさを味わって下さい。
「DXライブラリ置き場 HOME」http://homepage2.nifty.com/natupaji/DxLib/
「ゲームプログラミングの館」http://dixq.net/g/
「ゲーム作りで学ぶ!実践的C言語プログラミング」http://karetta.jp/book-cover/game-programming

2.基本的なアルゴリズムとデータ構造の学習やデバッグ技法など。DXライブラリと並行で進めて下さい。
アルゴリズムの絵本」http://www.seshop.com/detail.asp?pid=4179
「新版 C言語によるアルゴリズムとデータ構造」http://www.bohyoh.com/Books/CAlgoData/index.html
C言語による最新アルゴリズム事典」http://www.amazon.co.jp/dp/4874084141
C言語 デバッグ完全解説」http://www.amazon.co.jp/dp/4774133620

ここまでが2D編です。プロを目指す人は下に続きます。

3.C++言語。最低限クラスは理解を。
「明解C++http://www.bohyoh.com/Books/MeikaiCPP/index.html
「独習C++」http://www.amazon.co.jp/gp/product/4798103187/
「ロベールのC++入門」http://www.amazon.co.jp/dp/4839926050/

4.WindowsAPI(OSの仕組み)の学習。途中までで良いですがWindowsのメモリ、プロセス/スレッドは理解してください。
APIで学ぶWindows徹底理解」http://software.nikkeibp.co.jp/software/backno/04apimook2.html
Windowsゲームプログラミング」http://wisdom.sakura.ne.jp/system/winapi/index.html

5.DirectXの学習。色々ありますので必要そうなのを。
「ゲームプログラミング入門」http://www.amazon.co.jp/dp/499050061X
ゲームプログラマになる前に覚えておきたい技術」http://www.amazon.co.jp/dp/4798021180
DirectX ゲームグラフィックス プログラミング Ver. 2.1」http://www.amazon.co.jp/dp/4797341874
「DirectX9必携」http://www.amazon.co.jp/dp/4990500601
「逆引きゲームプログラミングfor Windows DirectXhttp://www.amazon.co.jp/dp/479801169X

6.ゲームアルゴリズム、数学、AIの学習。必要なものを自分でチョイスしてください。
「ゲーム開発のための数学・物理学入門」http://www.amazon.co.jp/dp/4797329076
ゲームエンジンプログラミング」http://www.amazon.co.jp/dp/4797331976
「実例で学ぶゲーム3D数学」http://www.amazon.co.jp/dp/4873113776
「実例で学ぶゲームAIプログラミング」http://www.amazon.co.jp/dp/4873113393/
「ゲームプログラミングのためのリアルタイム衝突判定 」http://www.amazon.co.jp/dp/493900791X
「3D格闘ゲームプログラミング」http://www.amazon.co.jp/dp/4797341807
「3DRPGプログラミング」http://www.amazon.co.jp/dp/4797330465
「アクションゲームプログラミング」http://www.amazon.co.jp/dp/4797335971
「アクションゲームアルゴリズムマニアックス」http://www.amazon.co.jp/dp/4797338954
「パズルゲームアルゴリズムマニアックス」http://www.amazon.co.jp/dp/4797347090
シューティングゲーム プログラミング http://www.amazon.co.jp/dp/4797337214/
シューティングゲームアルゴリズムマニアックスhttp://www.amazon.co.jp/dp/4797327316
弾幕 最強のシューティングゲームを作る!」http://www.amazon.co.jp/dp/4797352299

7.リアリティのための3Dシェーダの学習。必要に応じて。最初はいらないです。
DirectX 9 シェーダプログラミングブック」http://www.amazon.co.jp/dp/4839912475
DirectXシェーダプログラミング 仕組みからわかるゲームエフェクトテクニック 」http://www.amazon.co.jp/dp/4797344962

オリジナルゲームの開発。会社によっては提出が必須です。

それとこちらのコラムもチェックしておくこと。
「3Dゲームファンのためのグラフィックス講座」
http://game.watch.impress.co.jp/docs/series/3dcg/
「3Dグラフィックス・マニアックス」
http://journal.mycom.co.jp/column/graphics/index.html

この回答は、2chかどこかのテンプレになっているみたいです。ま、それだけやれば、そりゃプロにもなれるでしょう。


これと似たような質問を別のサイト見つけました。

Good starting platform for a teenage games programmer

私の息子(15)は、ゲームプログラマになりたがっています。私はシンプルなゲームから始めるように言いました。
彼はまだプログラムの経験がありませんが、私はビジネスアプリのプログラマをやっていますので、彼にプログラミングを教えることができますが、彼がプログラムを始めるに当たって、よいプラットフォームはどれでしょうか? はじめは、彼の意欲を維持するために、早く結果が出るものを探しています。

何かおすすめはありますか?

http://gamedev.stackexchange.com/questions/4241/good-starting-platform-for-a-teenage-games-programmer

質問は似た感じなのですが、回答が違っていて面白い。(まあ、もともと人の数だけ回答があるような問題なのですが)

  • XNAとかいいんじゃない? UDKとかもいいし、ケータイで動かすならUnityもいいかもね。
  • Pythonやって、pygameとかいいんじゃないの? 楽だし。
  • ロボットとかもいいかも。シンプルだし。Lego Mindstormとか、Robocodeとか。

んで、洋の東西を問わず、こういう人もいるわけです。

ゲームを作るだけだったらXNAを使うべきだけど、ゲームプログラマになりたいんだったら、C/C++OpenGL/SDLDirect3Dを学ぶべきだよ。
(略)
自分としては、ゲームプログラマになりたいんだったら、C/C++を先に学ぶべきだと思う。その理由は、たとえ君がC#XNAを勉強したとしても、もし君が真剣にゲームプログラマになりたいのであれば、そのうちCかC++を学ばなきゃならなくなる。なぜなら、そうしないと誰も雇ってくれないからね。だから、もし君が真剣にプロになりたいのなら、先延ばしにしないほうがいい。

ただ、日本と違うのは、こういう意見が結構はっきり叩かれているなと。上の引用に対するReplyです。

15才の人がプロとして雇われる時点で(いまから8年後)、みんながC++を使っていると決めつけられない。
いまから8年前を考えると、C++はちょうどゲームに使われ始め最初の標準仕様が出てきたころで、大多数はCを使っていた。8年前のC++はゲーム用として考える笑っちゃうくらいの状態で、その時点ではCとasmが流行っていた。
今から8年後、多くのプログラマが今のC++03のようにXNAを見るんじゃないかな。

先ほどのYahoo知恵袋の回答も間違っていないと思うし、そもそもXNAがくるのかも疑問ですが、これからゲームプログラマになる人に、現在の技術ばっかり教えてもだめじゃないかなと思うんですよ。そういう視点が欠けているのが惜しいなあと思います。(おそらく8年後の未来では、WindowsプログラムとかDirectXシェーダとかが今ほど重要とは思えない)。

というわけで、私も8年先に向けて勉強します。今日はこの辺で。

boost::smart_ptrの排他制御を調べてみる(2)

つづきです。(前回:http://d.hatena.ne.jp/mojaro/20100207/1265524839

あのあとboostのソースを眺めていたら、気になる記述が。
boost/detail/sp_counted_base.hpp

#if defined( BOOST_SP_DISABLE_THREADS )
# include <boost/smart_ptr/detail/sp_counted_base_nt.hpp>

BOOST_SP_DISABLE_THREADS?? もしかしてと思い、頭に#defineを入れてみたら
普通にスレッド利用しない実装に変更できました。知らんかった・・・。

#include <iostream>	// cout
#define BOOST_SP_DISABLE_THREADS  // ここを追加。
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
// (後略)

これで、lock/unlockはかからなくなります。めでたしめでたし。(って、はやく教えてほしかった・・・)

ただ、ちょっと気になるのは、これを定義した上で、逆にshared_ptr側でロックしてもらいたい場合とかどうなるの? と。

shared_ptrに格納するクラスがすべてスレッドセーフになっているとすれば、shared_ptr側でlock処理を行う方が無駄もないし都合がいいです。また、すべてのクラスがスレッドアンセーフだったとすれば、どっちにしろ同期処理は自前で行わなければならないので、BOOST_SP_DIABLE_THREADSで問題ない。

ただ、現実問題として、少なくとも私の周辺ではそこまでスレッドセーフが徹底できてないし、スレッドセーフ・アンセーフに関わらず両方格納できたらいいなあと。(その辺がまずいのか?)

その辺の設定をpolicyでとるような実装にしちゃえばいいのに、と私なんかでも思うのですが、cppllのboostドキュメント和訳を見ると、

Q. なぜ shared_ptr は、拡張のためのポリシーや特性を与えるための テンプレートパラメータを持たないのか。

A. パラメータ化することは、ユーザを敬遠させることに繋がる。 この shared_ptr テンプレートは、 拡張可能なパラメータを必要とせずに一般的なニーズを満たすように注意深く設計されている。 いつかは、高い拡張性を持ち、非常に使い易く、且つ誤用されにくいスマートポインタが開発されるかも知れない。 しかしそれまでは、shared_ptr が幅広い用途に使用されるだろう。 (そのようなパラメータ化されたポリシー指向のスマートポインタについて興味があるならば、 Andrei Alexandrescu の Modern C++ Design を読むべきである。)

http://boost.cppll.jp/HEAD/libs/smart_ptr/shared_ptr.htm#FAQ

とか書いているので、難しいのかしらん。なにかいい方法あるのかな?

boost::smart_ptrの排他制御を調べてみる。

smart_ptr自体のパフォーマンスはそれほど問題なかったのですが、問題はweak_ptrが内部で取得しているmutexとかが思いっきり時間を食っている感じ。最後の追い込みでこの辺がネックになった。

http://d.hatena.ne.jp/mojaro/20100127/1264600563

・・・と、自分の記事ながら「なんでだろう?」と後から疑問になったので、boostの実装を勉強してみました。バージョンは、手元のUbuntuに入っていた1.35を元にしています。

排他制御のタイミング

shared_ptr、weak_ptrともに、保持している参照カウンタの増減のタイミングで排他をかけています。

参照カウンタは、shared_ptrではshared_count、weak_ptrではweak_countと異なるクラスのインスタンスをもっていますが、両方共メンバとしてsp_counted_baseというクラスへのポインタを保持していて、実質的な処理はsp_count_baseが行います。

sp_count_baseはプラットフォーム依存コードです。pthreadだとmutex、win32だとInterlockIncrementとか使って、インクリメント・デクリメントを排他制御しています。boost/detail/sp_counted_base_pt.hppだとこんな感じ。

    sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
    {
// HPUX 10.20 / DCE has a nonstandard pthread_mutex_init

#if defined(__hpux) && defined(_DECTHREADS_)
        pthread_mutex_init( &m_, pthread_mutexattr_default );
#else
        pthread_mutex_init( &m_, 0 );
#endif
    }

    virtual ~sp_counted_base() // nothrow
    {
        pthread_mutex_destroy( &m_ );
    }
//(中略)
    void add_ref_copy()
    {
        pthread_mutex_lock( &m_ );
        ++use_count_;
        pthread_mutex_unlock( &m_ );
    }

また、pthread実装の場合は、参照カウンタのアクセスにも排他制御を行っています。

具体的に、weak_ptrを使用した以下のソースコードの場合に、どのように制御されているかといいますと・・・

#include <iostream>	// cout
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
class Hoge {
public:
	Hoge() {
		std::cout << "Construct Hoge" << std::endl;	
	}
	~Hoge() {
		std::cout << "Destruct Hoge" << std::endl;
	}
	void Print() {
		std::cout << "Hoge!" << std::endl;
	}
};
int main(void) {
	boost::shared_ptr<Hoge> pHoge = boost::shared_ptr<Hoge>( new Hoge() );	//初期化はLockされない。
	pHoge->Print();
	boost::weak_ptr<Hoge> pwHoge(pHoge);	// WeakPtrのコンストラクタで1回排他
	boost::shared_ptr<Hoge> pHoge2 = pwHoge.lock();	// Lock内でshared_ptrを構築する時に一回排他(pthreadだとlock()内で呼ばれるuse_countでさらに一回排他)
	if (pHoge2) {					// (pthreadだと内部のuse_countで一回排他)
		pHoge2->Print();
	}
	return 0;
}

と言う感じになります。

これをweak_ptrを使わない形で書けば、

(前略)
int main(void) {
	boost::shared_ptr<Hoge> pHoge = boost::shared_ptr<Hoge>( new Hoge() );	//初期化は排他されない。
	pHoge->Print();
	boost::shared_ptr<Hoge> pHoge2 = pHoge;	// shared_ptrのコピーで一回排他
//	if (pHoge2) {				// shared_ptrからのコピーの場合、NULLである可能性は無いため、この行はいらない。
		pHoge2->Print();
//	}
	return 0;
}

となります。Windows実装だと回数は変わりませんが、pthreadな環境だとLock回数が2回減るという結論です。(Windowsだとかわらず)

所感

いちおう、Linux-x86でpthreadな環境だと遅くなるっぽいと言えると思うのですが、なんか無理やりな感じが自分でもします。
「10万行規模のプロジェクトをOProfileの関数単位出力で調べたらweak_ptrのlock処理で5%くらい持っていかれた」という印象があったので調査したのですが、これだけの差で5%もつかないようなきが・・・

また調査するかもしれません。(もう飽きたのでしないかもしれません)