やはりネコネタは最強のようで調子にのって投稿します。
以下、右からミミ、クークー、シマです。まるでジェットストリームアタックの如く嫁さんはやられてしまいました。
ちなみに、シマ(左)、クーク(右)は姉妹で、シマは姉でクークーが妹になります。
最近、なぜかアクセス数が増えているのですが、どうも、リピーターが来ているようなのですが、
何か書こうかと思っていたところ、某クラブの部長から『最近ネコ感がたりない』とご指摘受けたので、うちのシマを紹介します。
盆踊りを踊っているようですが、おもちゃに飽きてそのまま寝てしまったらしい。
こちらはふつうに寝ているところですが、どうもこの猫は丸まって寝ないようだ。
忙しさにかまけてブログの更新を怠っておりますが、毎年恒例のイベントなので感想がてら最近の英語学習(悩み)の記録もします。ちなみにテストは8/25でこれをアップしたのは8/26です。
今年の案内士の試験ですが、少し変化がありました。
1つは英語の問題に一部マークシートが取り入れられ、50点分がマークシートで残りが筆記となりました。
全体的な問題の構成は去年から変わっていないかと思いますが、設問で漢字を書く必要がないとか、単語の問題が選択式になり、難易度は少し下がるのでは?とは思いました。漢字が掛けなかったり、単語のスペルに無頓着な私にとってはありがたい変更だったりまします。一方で並べ替えは単語の数が増えて難易度があがったような気がします。
もう1つは、アンケートがつきました。『今後の案内士制度の参考にする為』的なことを言っておられました。このあたりは好感が持てるのですが、『英語の問題の難易度は?』的な質問については当の受験者から聞いてどのように参考にするのか興味があるところです。後、『資格を取った後就業しますか?』的な質問があり、いわゆるペーパー通訳案内士について気にかけるようになったみたいです。
ちなみに通訳案内士ですが、働くというか稼ぐのは難しいようで、その辺りの話は、
http://blog.goo.ne.jp/guide289/e/5c72d3ad5b81103fa10ad97903b0e88d
が詳しいですね。
さて、肝心の試験の手応えですが、去年よりは出来たと思うけど、結果はどうだろうという感じです。
もっとも、最近、英語に関しては実践が少ないなと思っていまして、例えば情報処理の試験の場合、普段から仕事でプログラムを組んだり、サーバーをセットアップしたり、実務をおこなった上で試験を受けるわけですが、英語の場合、読みは確かにするのですが、その他のスキル(聞く、話す、書く)は勉強オンリーなのでこのあたりの実践不足を強く感じる次第です。最近、たまたま外国の方と話す機会があったのですが、こんにちは、どういたしまして、ぐらいしか言えず、『これで結構な金額を投入したんだな・・・』と思うと少し凹む次第です。
その読みの方も専門分野の場合はまだましですが、テストになるとしばしば誤読をするので、このあたりも精進が必要だとおもとります。
つまりまだまだ道半ばといったところで、今後も精進します。
補足、以下、多くの方には関係ない話ですが、このブログにちょっとしたフアンがつきまして、表面的な言葉尻を間違ってとらえて変な書き込みをされ、『テストになるとしばしば誤読をするので』とか書くと変なことを書かれないとも限らないので、面倒ですがちょっと補足します。
私が英語の文章を読んだときにしばしば誤読するということですが、当然ですが、日本語の文章ではわりとまともに読んでいるつもりです。もちろん人間ですから間違いはあるでしょうが、例えば、
http://www.ohfuji.name/?p=1902
のコメント欄ではCMPさん、επιστημηさんと特に大きな誤解もなく議論ができているかと思います。
ちなみに、2013-2-11 の私の発言を捉えて、誤解に基づく非難をしている人がいるのですが、いい加減な判断で余計なことを書かないでもらいたいものです。細かい点については機会があれば別途書きます。
例年4月以降は、仕事にゆとりができるのですが、今年は忙しく(アベノミクスとは関係はなく)、せいぜいゴールデンウィークにメインマシンをWindows8にした程度で、いろんなものができずじまいで滞っているのですが、これ以上放置する訳にもいかないので0.85をリリースします。
主な変更点は以下のとおりです。
・バグフィックス
・パフォーマンスアップ
・Windowsの開発環境をVisualStudio2008 → VisualStudio2012
本来なら0.85というキリのよい数字なので、ロードマップで示している機能(リソースの解放機能)を入れようかと思っていたのですが、アーキテクチャの改修は進んだのですが、時間的な問題でリソースの解放機能は入れずじまいになりました。
ただ、アーキテクチャの改修のおかげでパフォーマンスがさらにアップしました。
また、OSのバージョンアップ(Windows7→Windows8)に伴って開発環境が変わりました。このあたりは別途レポートしたいのですが、多分しばらくは無理でしょう。
例によりベンチマークを行ってみました。
◆Windows上でのJavaScript vs ADP
■マシン
・CPU Core i7-980X(3.33GHz HT OFF / Turbo Boost OFF)
・メモリ 48GB(DDR3-1600 8GB × 6)
・OS Windows 8 Pro (x64) 電源管理:高パフォーマンス
■結果
28のフィボナッチ数を求める時間
| IE 10(JavaScript) | 35ミリ秒 |
| FireFox 22(JavaScript) | 70ミリ秒 |
| ADP 0.82(32ビット) | 202ミリ秒 |
| ADP 0.85(32ビット) | 171ミリ秒 |
JavaScriptとの対決ですが、桁が違うので更なる改善が必要ですが、少し気になるのが、FireFox22で、
以前、測ったときはFireFoxは圧倒的な強さを見せたのですが、ここに来て失速がみられます。なにが要因なのか興味深いところではあります。
ちなみにテスト環境を整備していて気が付いたのですが、CPUのHTがONの状態のときのJavaScript(IE,Firefox共に)パフォーマンスが1.5~2程度低下していました。JavaScriptを高速で動かしたい場合は、HTはOFFの方がよいかもしれません。
◆CentOS6.4上でのPHP,Java,ADP
■マシン
・CPU Core i7-980X(3.33GHz HT OFF / Turbo Boost OFF)
・メモリ 24GB(DDR3-1066 4GB × 6)
・ホストOS Windows 2008R2(Hyper-V)
・ゲストOS CentOS 6.4(実行環境)
■テストコード
テスト1:28のフィボナッチ数を求める
PHPソース(Test1.php) Javaソース(Test1.java) ADPソース(Test1.p)
テスト2:10万までの素数を求める
PHPソース(Test2.php) Javaソース(Test2.java) ADPソース(Test2.p)
テスト2のPHPのコードですが、
Stackoverflowさんのコードを使わせて頂きました。
■結果(timeコマンドのuser部分を抜き出した)
Linux(CentOS6.4 x64)上でのPHP(5.3.3)、Java(1.6)、ADP(0.85)の比較
| | テスト1 | テスト2 |
| PHP(5.3.3) | 201ミリ秒 | 33.5秒 |
| Java(1.6) | 44ミリ秒 | 5.0秒 |
| ADP(0.82) | 186ミリ秒 | 3.7秒 |
| ADP(0.85) | 157ミリ秒 | 2.4秒 |
OS以外は、
以前のテストと同様の環境ですのでPHP、Java、ADP 0.82はあまり変化はありません。ADP 0.85は順当にパフォーマンスが上がっていることが解るかと思います。
ADPの開発が滞っていますが、思わぬところで話が進んでしまい、今年最後の記事になります。
社会人であり、技術者でありのコメント欄で結合について話が盛り上がったのですが、『私がHitAndBlowを作ったらどんなコードになるか?』ということで作成してみました。Visual C++ 2008で動作確認しました。
επιστημηさんの真似だと芸がないので、出題者・回答者をそれぞれ人間・コンピュータから選べるようにしました(大掃除をさぼったので嫁に怒られながら作りました・・・)。
それにしてもC++のコードは人によって個性が出ますね。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <math.h>
#include <ctype.h>
#include <time.h>
using namespace std;
class HABReferee {
vector<int> answer;
vector<bool> blowtable;
public:
bool prepareAnswer(const vector<int> &answer_) {
blowtable.assign(10, false);
for ( size_t i = 0; i < answer_.size(); i++ ) {
if ( blowtable[answer_[i]] ) {
return false;
}
blowtable[answer_[i]] = true;
}
answer = answer_;
return true;
}
bool submitAnswer( const vector<int> submit, int &hit, int &blow) {
if ( answer.size() != submit.size() ) return false;
hit = 0;
blow = 0;
for ( size_t i = 0; i < submit.size(); i++ ) {
if ( answer[i] == submit[i] ) {
hit++;
} else if ( blowtable[submit[i]] ) {
blow++;
}
}
return hit == submit.size();
}
};
static vector<int> inputNumbers(int N) { // N桁の数値の入力を行う(違った場合はやり直し)
vector<int> result;
string str;
do {
result.clear();
cin >> str;
for ( size_t i = 0; i < str.size(); i++ ) {
if ( isdigit(str[i]) && str[i] != '0' )
result.push_back(str[i] - '0');
else
break;
}
} while ( result.size() != N );
return result;
}
class HABContributor { // 出題者(人間)
public:
virtual vector<int> prepareAnswser(int N) {
cout << "各桁が1~9である" << N << "桁の数を入力してほしい。各桁で数が重複するのは避けてくれ" << endl;
return inputNumbers(N);
}
};
class HABContriburerComputer : public HABContributor { // 出題者(乱数生成)
public:
virtual vector<int> prepareAnswser(int N) {
vector<int> digits;
for ( int i = 1; i < 10; i++ ) {
digits.push_back(i);
}
vector<int> result;
srand((unsigned int)time(0));
for ( int i = 0; i < N; i++ ) {
vector<int>::iterator itor = digits.begin() + rand() % digits.size();
result.push_back(*itor);
digits.erase(itor);
}
return result;
}
};
class HABSolver { // 回答者(人間)
public:
virtual void prepare(int N) {}
virtual vector<int> getAnswer(int N) {
cout << "答えを予想してくれ" << N << "桁の数だ。" << endl;
return inputNumbers(N);
}
virtual void giveHint( int hit, int blow) {
cout << hit << "Hit" << " / " << blow << "blow" << endl;
}
};
class HABSolverComputer : public HABSolver { // 回答者(コンピューター)
HABReferee checker;
vector<vector<int>> candidate;
public:
void recur(vector<int> &answer, int N) {
if ( N == 0 ) {
candidate.push_back(answer);
} else {
for ( int i = 1; i < 10; i++ ) {
if ( find( answer.begin(), answer.end(), i) == answer.end() ) {
answer.push_back(i);
recur( answer, N-1);
answer.pop_back();
}
}
}
}
virtual void prepare(int N) {
vector<int> answer;
recur( answer, N);
}
virtual vector<int> getAnswer(int N) {
cout << "答えは";
for ( int i = 0; i < N; i++ ) {
cout << candidate.back()[i];
}
cout << "かな?";
return candidate.back();
}
virtual void giveHint( int hit, int blow) {
HABSolver::giveHint( hit, blow);
checker.prepareAnswer(candidate.back());
for ( vector<vector<int>>::iterator i = candidate.begin(); i < candidate.end(); ) {
int ahit, ablow;
checker.submitAnswer( *i, ahit, ablow);
if ( ahit != hit || ablow != blow ) {
i = candidate.erase(i);
} else {
i++;
}
}
}
};
class HABGame {
int N;
HABReferee referee;
HABContributor *c;
HABSolver *s;
public:
HABGame(int N_, HABContributor *c_, HABSolver *s_) : N(N_), c(c_), s(s_) {};
void play() {
// 出題者から問題をもらいレフリーに渡す。
while ( !referee.prepareAnswer(c->prepareAnswser(N)) )
; // 規格にあったものが出てくるまでループする
bool endflag = false;
int hit;
int blow;
s->prepare(N); // 回答者に準備をさせる
while ( endflag == false ) {
// 回答者から回答をもらい判定する。
endflag = referee.submitAnswer( s->getAnswer(N), hit, blow);
// 回答者にヒントを言う。
s->giveHint( hit, blow);
}
}
};
int main()
{
HABContributor hc;
HABContriburerComputer cc;
HABSolver hs;
HABSolverComputer cs;
HABContributor *c;
HABSolver *s;
string str;
while ( true ) {
cout << "メニュー" << endl
<< "1:出題者(Human) vs 回答者(Human)" << endl
<< "2:出題者(Human) vs 回答者(Computer)" << endl
<< "3:出題者(Computer) vs 回答者(Human)" << endl
<< "4:出題者(Computer) vs 回答者(Computer)" << endl
<< "0:終了" << endl;
cin >> str;
switch( str[0] ) {
case '0' :
return 0;
case '1' :
c = &hc;
s = &hs;
break;
case '2' :
c = &hc;
s = &cs;
break;
case '3' :
c = &cc;
s = &hs;
break;
case '4' :
c = &cc;
s = &cs;
break;
}
HABGame g(3, c, s);
g.play();
}
return 0;
}