14 Feb 2013, 13:05

[TopCoder日記] SRM 570, Division 2, Level 1 : Chopsticks

TopCoder SRM570に参加した記録です。

当日の感想

今回で3回目の参戦。
英語の問題文にひるまないだけの度胸はついた。
当初思っていたよりも難しくはないことは分かった。

プログラミングをしているよりも、白紙に向かっていろいろと数式を書いている時間の方が長い。プログラミングは、考えた解法をそのまま書くだけと言った感じ。

言語の壁という点では、英語よりもC++の知識が乏しいのがつらい。
vectorの使い方がわからなかったり。(配列のサイズの求め方がわからん!)

わからなくなったら独習C++を元にガンパル。

Level 1 : Chopsticks

問題

異なる長さの箸がN本ある。
同じ長さのペアの数がパーティーに招待できる人数。
さあ、招待できる人数の最大値を求めよ。

システムテストで落とされた。なぜだろう。
連想配列を利用して、参考書を見ながらもう少し綺麗に書きなおした。
連想配列が空気を吸うように使いこなせればいいな。

/*  TopCoder
 *  SRM       : 570
 *  Division  : 1
 *  Level     : 2
 *
 *  Created on: 2013/02/14
 *      Author: tsu_nera<fox10225fox@gmail.com>
 */
 
#include <algorithm>
#include <iostream>
#include <map>
#include <numeric>
#include <set>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
 
#define FOR(i,s,e) for (int i = int(s); i != int(e); i++)
#define FORIT(i,c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
#define ISEQ(c) (c).begin(), (c).end()
 
class Chopsticks {
 
public: int getmax(vector<int> length) {
 
  map<int, int> dic;
 
  for (int i = 0; i < (int)length.size(); i++) {
    dic[length[i]] = 0;
  }
 
  for (int i = 0; i < (int)length.size(); i++) {
    dic[length[i]]++;
  }
 
  int ans = 0;
  map<int, int>::iterator it;
  for (it = dic.begin() ; it != dic.end(); it++) {
    ans += ( (*it).second /2);
  }
 
  return ans;
 
}
 
};

Level 2 : RobotHerbDiv2

問題

ロポットが与えられた配列と規則に従って移動する。

最終的に移動した場所の原点からの距離を求めよ。

規則を漸化式に起こそうとしたが、途中で時間切れ。

11 Feb 2013, 22:35

gitを使って技術書を写経をするためのステップメモ

技術書の写経について、TDDで有名な@t_wadaさんのこんなツイートを発見した。

https://twitter.com/t_wada/status/9000231741

これを参考に、gitを使ってどのように写経をするか、個人用にまとめメモしとく。

ローカルで使えるSCMを用意

$ git init
$ git add .
$ git commit -m ‘first commit’
$ git checkout -b 1st

章ごとに”xst”というブランチを切っておく。

「ほんたった」などで対象の本を固定

たいていのお手本は電子書籍を利用するので、特に不要。
電子書籍化されていない写経本はScanSnapで電子化する。

ひたすらサンプルコードを写して実行

ガンバァ━━(`・д・´)ノ━━!!る

実行するたびにコミット(コミットログにページ番号を含める)

$git commit -m”xx”

xxはページ番号。加えて、コメントも書いてもよい。

疑問点があったらコミットログや本に書き込む

電子書籍を使っているので、Acribatのコメント機能を使って書き込んでしまいます。
コメントがあとで検索で引っかかるのが快適。

章ごとにタグを打つ

成果をmaster branchにマージ

$ git checkout master
$ git merge 1st

master branch にもどって、1st branchをマージする。

章ごとにタグを打つ

$ git tag -a -m ‘1st end’ 1st

章ごとにタグを打つ。節や区切りがいいところまででもいい。

githubにも反映

$ git push origin master

git pushでローカルからgithubに反映する。(githubとの連携はここでは省略)

新しい章に移るごとにブランチを切る

$ git checkout -b 2nd

 

以下、手順を繰り返して章ごとにイテレーションしていく。
今年の目標ははたくさん写経することなので、ガンバァ━━(`・д・´)ノ━━!!ります。

11 Feb 2013, 01:08

定時退社するための魔法のWindowsコマンドを教えよう

定時のベルがなる。しかし、帰れない。そんな日がいつも続く。
そこで、朝一にパソコンで叩くだけで定時退社できるという魔法のポポポーンコマンドを紹介。

Windowsのコマンドプロンプトから以下を管理者権限で実行だ。

at 17:40 SHUTDOWN /S /F /T 600

以下、解説。

環境

Windows 7

シャットダウン用コマンド shutdown

Windowsをコマンドラインからシャットダウンするためのコマンドは”shutdown”だ。

Win7JP RCウィンドウズ7の総合情報&カスタマイズ- Windows 7でコマンドプロンプトで電源操作を行うには(終了操作を禁止した状態でWindowsを終了するには)

 

いろいろと、指定オプションがあるが、今回は以下を使う。

/F :強制シャットダウン
/S: シャットダウン
/T : 時刻を指定する。

10分後に強制シャットダウンするためには、以下を実行。

SHUTDOWN /S /F /T 600

※大文字注意

指定時刻に実行するためのコマンド at

Windowsのコマンドプロンプトで指定時刻にコマンドを実行するためには、atコマンドを利用する。

スーパーユーザーのためのWindowsコマンド再入門:at――指定時刻にアプリケーションを実行 – ITmedia エンタープライズ

 

 

コマンドプロンプトを管理者権限で起動して、

at

と実行すると、登録されているタスクが表示される。

at [時刻] [指定コマンド]

で、指定時刻に指定コマンドを実行できる。

実行結果

C:\Windows\system32>at 17:40 SHUTDOWN /S /F /T 600
新しいジョブをジョブ ID = 1 で追加しました。

C:\Windows\system32>at
状態 ID     日付                    時刻          コマンド ライン
——————————————————————————-
        1   今日                    17:40         SHUTDOWN /S /F /T 600

C:\Windows\system32>

 

ナントいう屈辱!定時退社できない!そんなときの救済コマンド

魔法のコマンドが実行されたけれども、定時退社できないというポポポーンな状態のときの救済コマンドがこれ。

SHUtDOWN /A

救済コマンドというよりは、地獄落ちのコマンドだ(´・ω・`)

10 Feb 2013, 02:42

断片的なプロ意識に感銘!プログラマは[CleanCoder]でプロの感性を学ぼう。

ロバート・C・マーチン(ポブおじさん)の[CleanCoder]を読んだ感想を書きます。

 

ああ・・・あのときこうすりゃよかったよ、みたいな

先入観では、プログラマとはなにかを悟った筆者が”プログラマとはこうあるべきである”という結論をズバズバといっていくものと思っていた(帰納的)。

実際は、ポブおじさんの失敗談がこれでもかと紹介されて、”プロならばこう振る舞う”という感じで語られていく。

個人的体験を元に,”こうだ”と語られる(演繹的)。

全体を通して、断片的なエッセイが書くテーマに対してまとめられたようになっている。
プログラミングの本だけれども、コードはほとんど登場しない。コードを作るときの思想が語られている。

そんな断片的で、個人的にこころに残ったフレーズを引用しながら感想を書きます。

個人的に印象に残ったこと

テストの必要性について

自動テストユニットって、どのくらいのコードを書けばいいの?その質問に答える必要があるのか?全部だ!ぜ・ん・ぶ。

(第1章 プロ意識)

この言い切りが、潔かった!ぜ・ん・ぶだ!
TDDは規律で、どんなに追い詰められているときでも規律を厳守することで、自分のペースを保つのだと説明されてる。なるほど・・・。

ソフトウェアのプロが抑えるべき最低限のこと

プログラマがおされるべき最低限のこととして、以下の視点を上げている。

  • デザインパターン (Gof、POSA、など)
  • 設計原則 (SOLIDの原則、コンポーネントの原則など)
  • 方法論 (XP、アジャイル、ウォーターフォール、など)
  • 規律 (TDD、オブジェクト思考、構造化設計、CI、ペアプロ、など)
  • 成果物 (UML、DFD、状態遷移表、フローチャート、構造チャート、、ディシジョン・テーブルなど)

(第1章 プロ意識)

自分の場合は、知っているものもあれば、まだまだ知らないこともある。
プログラマの必須科目として、学び続けていきたい。

具体的には、今年はデザインパターンを勉強したい!

第2章「ノー」という

できないことに「ノー」ということについて、凄まじい体験談を引用しながら説明されている。

Is Good Code Impossible? | Rapture In Venice: iOS, Android Mobile Development Shop

 

 

こんな状況になっても、誰に責任があるのかといえば、”ノー”と言わなかった人に責任がある。プロのプログラマは、できないことには”ノー”という。

逆に”イエス”といったことは絶対にやり通す。そのため、安易な見積もりを元に”イエス”とは言ってはいけない。イエスの責任感が説かれている。

見積もりについて

見積もりに関するこんな視点も新鮮だった。

見積もりは数値ではない。見積もりは確率分布だ。

(第10章 見積もり)

工数は、楽観値、標準値、悲観値の3つの視点で考えることが大事だ。

自分の場合も、終わりますというのは標準値(楽観値?)を考えていたが、コレは3つの視点で考えることが必要だと思った。

練習について

日々の練習を通して、”型”を身につけることの重要性を解いている。

必要になった時に完全な動きが自動的にできるようになることが、最終的な目標である。

プログラミングの型というのは、プログラミングの問題を解くためのキーボードやマウスの動きの練習である。

解き方はすでにわかっている問題を解きながら身体の意思決定の練習をするのだ。

(第6章 練習)

型を身につける、キーバインドやホットキーの使い方に習熟するようにする。
いつも忘れないようにしたい。

個人的には、今年はTopCoderを頑張ろうと思っている。

TopCoder, Inc.TopCoder, Inc. | Home of the world’s largest development community

これは、アルゴリズムの勉強が第一の目的だ。
別の目的としては解けなかった同じ問題を繰り返して練習することで、その問題で使われているアルゴリズムを息をすうようにコーディングできるようにすることがある。

まとめ

断片的に、様々な発見がある。また時間を置いて読めば、別の発見が得られそうだ。

03 Feb 2013, 01:00

GoogleTestとEclipseのGDB機能の組み合わせが最強だった件

Eclipse CDTでデフォルトで付いているグラフィカルなGDB用のインタフェースと、GoogleTestなどのxUnitをあわせて利用するとデバッグが捗ったので、メモ。

基本は動的、バグったら静的

方法は以下の通り。

  1. GoogleTestを使ってテストを書いて実行。
  2. テスト失敗したら、失敗したテストケースでブレイクポイントをはる。
  3. GoogleTestを再実行して、ブレイクしたところからステップ実行して、テスト失敗の理由を調査。

基本的には、GoogleTestで自動テストを書いていく。
しかし、テストが失敗し、その原因がよくわからないときはGDBでメモリの値の変化をステップごとに追いながらデバッグをするというスタンスだ。

EclipseのGDB機能はスゴく高性能で、
構造体のネスト構造まで、スケスケ丸見えなのだ(下品 (・∀・)ニヤニヤにや)

キーバインドでパースペクティブを行ったり来たり

キーバインド的には、

GoogleTest実行時 =>「Ctrl+ F11」
GDB起動時          => 「F11」

というようにしている。すると、実行によってEclipseのパースペクティブが[C/C++]と[デバッグ]で切り替えることができる。

設定が必要な場合は、
[ウィンドウ] > [設定] > [実行/デバッグ] > [パースペクティブ]から[C/C++ Application]を選択し、適切に設定すること。

また、ブレークポイントを設定することで、自動的に実行時にはデバッグパースペクティブに切り替えることもできる。
[ウィンドウ] > [設定] > [実行/デバッグ] から設定。(多分、これはデフェルト設定)

セグメンテーション違反対策に効果バツグン!

個人的にとてもいいなと感じたのは、セグメンテーション違反するとその直前でGoogleTestの実行処理を止めることができること。

テストコードがないコードに修正をいれるのは怖いので、まずテストを書いてから修正を入れるようにしているが、このレガシーコードへのテストを書く際に、メモリ獲得を忘れて画面が真っ赤になることがすごくたくさんあるのだ!

この潰し込みが大変で、テストを書くことを諦めることが往々にしてある。
しかし、このgdbを使った方法をとれば、驚くほど効率が上がった。

まとめ

今まで、gdbを積極的には使って来なかった。
(使い方をあまり知らなかったという方が正しいかもしれない)
手動テストなんてありえない!という偏見があったのかもしれない。

物事に偏見をもってはいけないというお話でした。

チャンチャン( ゚∀゚ )

27 Jan 2013, 23:36

美しさってなに?リーダブルコードを読んで思ったこと。

リーダブルコードを読んだので、その感想を。

 

小ネタの玉手箱

本の内容は、ソースコードを読みやすくするためのちょっとした工夫が並べられている。
例えば、目次から抜粋すると、

  • 名前に情報を追加する
  • コメントのためのコメントをしない
  • コードの意図を書く

C言語、JavaScripなど、いろいろな言語で例が書かれているが、問題なく読める。
むしろ、わかりやすさとは言語共通なのだということに気づく。

論理的なif文、for文の作法に加え、コメントや名前の付け方など、見栄えの部分にもたくさんページ数が割かれているところが新鮮。

現実とのジレンマ

コードを書くには文系の才能が必要?

コードを書くことは、文章を書くことにより近いと、最近思う。
わけあって今度、TC検定(テクニカルライティング検定)を受験する。
わかりやすい文章を書くこととわかりやすいコードを書くということは似ているのだ。

プログラミングは理系の才能よりも、文系の才能の方が必要なのでは、と思う。

毎朝の決意表明のために

毎朝、仕事を始める前に15分間読むようにしてきた。
そのことで、毎日読みやすいコードを書くことを朝一に決意するためだ。
(その決意は時間が経つに連れて、”時間がない”という悪魔の囁きによって由来でしまう)

美しさと正しさについて

さあ、リーダブルコードを読んだ。
ソースコードに対する美的感覚を研ぎ澄ませた。
他人のコードに対する醜さにも敏感になった。

しかし、コードレビューで指摘をすることができない。

指摘はするのだけれども、少しだけ指摘する。
他人のコードの汚い部分がたくさんある場合は、遠慮してしまう。

リーダブルコードに書いてあったような、関数分割や命名規約、コメントを実践しようとすると「なんでそんなふうにするの?」と逆に指摘を受けたりする。
それが、「リーダブルコードに書いてあったからです、美しいからです」とはいわない。
「わかりやすいと自分が信じているからです」と応える。

長年の間に身につけた自分のスタイルがあると、そのスタイルに合致するものが美しいと感じて、それ以外のものは醜いと感じるのだろう。それを「間違っています、リーダブルコードに書いてあるこういう書き方の方が正しいんです」とは言えない。

自分は、リーダブルコードをもとに自分のスタイルを見なおそうと思う。

26 Jan 2013, 00:44

[Eclipse CDT]セグメンテーション違反した箇所をGDBで特定する

Eclipse+Cygwin環境でデバッグするとき、いつもはGoogleTestを使っている。

GoogleTestを実行してセグメンテーション違反をすると、Windowsは以下のエラーを返す。

 [main] sample 10968 exception::handle: Exception: STATUS_ACCESS_VIOLATION
1714 [main] sample 10968 open_stackdumpfile: Dumping stack trace to sample.exe.stackdump

例:こんなお粗末ソース

#include

int add(int x, int y)
{
int z;
char *p;

z = x + y;
*p = 1; /* ここでセグメンテーション違反 */
return z;
}

こんなとき、Eclipseの画面からGDBを起動して、どこで落ちたかを調べると便利だったので、メモ。

環境

  • Eclipse 4.2 Juno
  • GDB 7.5
  • Cygwin 1.7.17-1

EclipseでGDBを利用するための設定

コンパイルオプション

まずは実行ファイルを作るときにコンパイルオプションで以下を追加。

CPPFLAGS += -g -O0

-g : GDB用のデバッグ情報を実行ファイルに含める。

-Oo : コンパイラに最適化をさせない。

ルックアップパスの設定

デバッグ・パースペクティブにソースが現れないときは、ソースのパスが設定されていない。

Can't find a source file at : hogehoge...

[ウィンドウ] > [設定] > [C/C++] > [デバッグ] > [ソース・ルックアップ・パス] から追加したいソースがあるフォルダを追加する。

GDBを実行してみる

デバッグ・パースペクティブからF11を実行できればOK。

Defaultではmainでbreakするように設定されているので、[再開]F8する。

すると、STATUS_ACCESS_VIOLATIONが発生した場所まで移動して、

ソースを表示してくれる。

image

まとめ

今回、xUnitとGDBを組み合わせることでデバッグがさらに効率的になるのではと思い、記事にしてみた。

この方法の前は、いちいちテストやソースにprintやexitを仕込んでいたが、始めっからgdbを使えばよかったなと、今頃ながら気づいたのだった。

xUnitでテストするようになってから、さすがにもう手動でのテストをする気にはなれないが、こんな組み合わせもいいかもしれない。

Eclipse+Cygwin環境でデバッグするとき、いつもはGoogleTestを使っている。

GoogleTestを実行してセグメンテーション違反をすると、Windowsは以下のエラーを返す。

ツꀀツꀀツꀀツꀀツꀀ 1 [main] sample 10968 exception::handle: Exception: STATUS_ACCESS_VIOLATION
1714 [main] sample 10968 open_stackdumpfile: Dumping stack trace to sample.exe.stackdump

例:こんなお粗末ソース

#include

int add(int x, int y)

{

int z;

char *p;

z = x + y;

*p = 1;ツꀀツꀀツꀀ /* ここでセグメンテーション違反 */

return z;

}

こんなとき、Eclipseの画面からGDBを起動して、どこで落ちたかを調べると便利だったので、メモ。

環境

  • Eclipseツꀀ 4.2 Juno
  • GDB 7.5
  • Cygwin 1.7.17-1

EclipseでGDBを利用するための設定

コンパイルオプション

まずは実行ファイルを作るときにコンパイルオプションで以下を追加。

CPPFLAGS += -g -O0

-g : GDB用のデバッグ情報を実行ファイルに含める。

-Oo : コンパイラに最適化をさせない。

ルックアップパスの設定

デバッグ・パースペクティブにソースが現れないときは、ソースのパスが設定されていない。

Can’t find a source file at : hogehoge…

[ウィンドウ] > [設定] > [C/C++] > [デバッグ] > [ソース・ルックアップ・パス] から追加したいソースがあるフォルダを追加する。

GDBを実行してみる

デバッグ・パースペクティブからF11を実行できればOK。

Defaultではmainでbreakするように設定されているので、[再開]F8する。

すると、STATUS_ACCESS_VIOLATIONが発生した場所まで移動して、

ソースを表示してくれる。

image

まとめ

今回、xUnitとGDBを組み合わせることでデバッグがさらに効率的になるのではと思い、記事にしてみた。

この方法の前は、いちいちテストやソースにprintやexitを仕込んでいたが、始めっからgdbを使えばよかったなと、今頃ながら気づいたのだった。

xUnitでテストするようになってから、さすがにもう手動でのテストをする気にはなれないが、こんな組み合わせもいいかもしれない。

20 Jan 2013, 04:30

Windows7 でPCシャットダウン時にコマンドラインからミュートにするメモ

はじめに

Windowsをシャットダウンするとき、いつもはWindowsに標準であるシャットダウンコマンドを叩いていた。

C:\Windows\System32\shutdown.exe

ノートPCでYoutubeをボリュームMaxにして聞きながら作業し、その後PCをシャットダウンしたとき、次の起動時に大音量で起動音がなる。

電車の中だとけっこう恥ずかしいので、今日はこれを何とかしようと思った。

EcoMonitorをつかうという選択肢

windows7でミュートにするようなVBSを探してみたが、見つからない。(XPならあった)

代わりに、EcoMonitorというフリーソフトを利用するとできることをしった。

EcoMonitor – RedWingsソフトウェア公開場

 

 

EcoMonitorはインストール不要でコマンドラインからミュートを実行できる。
ミュートだけでなく、シャットダウンも実行できる便利なプログラム。

ダウンロードしたファイルを”C:\Program Files (x86)\“とかにおく。
C:\Program Files (x86)\ecomonitorv1003に以下のスクリプトを作成。

shutdown.vbs

Set wShell=CreateObject(“WScript.Shell”)
wShell.Run “EcoMonitor.exe -muteon -shutdown”

-muteonがミュートのオプション。-shutdownがシャットダウンのオプション。

shutdown.vbsのショートカットをデスクトップにおいたり、コマンドランチャーに登録して完了。

これで、電車の中でマナーを守ってプログラミングできるようになったお(^-^)

参考

17 Jan 2013, 22:49

hamcrestとJUnitの依存関係メモ

hamcrest関係のエラーでハマったので、メモ。

java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch

エラーメッセージ

java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V
     at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:18)
     at org.junit.Assert.assertThat(Assert.java:865)
     at test.endtoend.auctionsniper.FakeAuctionServer$SingleMessageListener.receivesAMessage(FakeAuctionServer.java:71)
     at test.endtoend.auctionsniper.FakeAuctionServer.hasRecievedJoinRequestFromSniper(FakeAuctionServer.java:51)
     at test.endtoend.auctionsniper.AuctionSniperEndToEndTest.sniperJoinnAuctionUntilAuctionCloses(AuctionSniperEndToEndTest.java:14)
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
     at java.lang.reflect.Method.invoke(Method.java:601)
     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
     at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
     at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
     at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
     at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

原因

junit.jarには、org.hamcrest.Matcher(aとする)ライブラリが一緒に入っている。
外部のhamcrest(bとする)を入れていると、JUNITはaではなく、bを参照しようとして、エラーする。

解決方法

junit.jar ではなく、 junit-dev-.jarを使う。
junit-dev.jarはhamcrestを含んでいないJUNITライブラリ。
こっちを利用することで、junitとhamcrestの依存関係は解消する。

参考

NoClassDefFoundError: org/hamcrest/MatcherAssert

エラーメッセージ

java.lang.NoClassDefFoundError: org/hamcrest/MatcherAssert
     at org.junit.Assert.assertThat(Assert.java:865)
     at test.endtoend.auctionsniper.FakeAuctionServer$SingleMessageListener.receivesAMessage(FakeAuctionServer.java:71)
     at test.endtoend.auctionsniper.FakeAuctionServer.hasRecievedJoinRequestFromSniper(FakeAuctionServer.java:51)
     at test.endtoend.auctionsniper.AuctionSniperEndToEndTest.sniperJoinnAuctionUntilAuctionCloses(AuctionSniperEndToEndTest.java:14)
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
     at java.lang.reflect.Method.invoke(Method.java:601)
     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
     at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
     at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
     at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
     at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.ClassNotFoundException: org.hamcrest.MatcherAssert
     at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
     at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
     at java.security.AccessController.doPrivileged(Native Method)
     at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
     … 28 more

問題

hamcrestのバージョンが古いのが原因。

解決

hamcreat を1.1から1.3にしたら解決。

参考

08 Jan 2013, 13:00

WordPress完全移行マニュアル(BackWPupでリストア)

前回のエントリで、BackWPupを利用してWordPressで構築したサイトのバックアップを作成できたので、今回はこのデータをリストアしてみます。

前回はロリポップサーバからバックアップしたので、これをさくらインターネットにリストアしてみます。つまり、WordPress移行作業をします。(移行しないけど)

 <a href="http://px.a8.net/svt/ejp?a8mat=25GJVU+5CZJE+D8Y+61JSH" target="_blank"><br /><img border="0" alt="" src="http://www20.a8.net/svt/bgt?aid=130102698009&wid=004&eno=01&mid=s00000001717001015000&mc=1" width="468" height="60" /></a>   

移行手順

  • リストア先の環境を用意
  • リストア先サーバへファイルをアップロード
  • リストア用のBackWPupスクリプトを実行する
  • wp-config.phpを編集する

リストア先の環境を用意

まずは、さくらインターネットの管理画面にアクセスして、 MySQLの新しいデータベースを作成します。

右のツールバーから[データベースの設定] > [データベースの新規作成]を選択。
データベース名を入力して、[データベースを作成する]を選択。

これで、データベースが作成できました。
以下の情報をメモしておきます。

  • データベースサーバ名
  • 作成したデータベース名
  • データベース ユーザ名
  • データベース パスワード

リストア先サーバへファイルをアップロード

あらかじめBackWPupでバックアップしておいたzipファイルを解凍します。

リストア先のさくらインターネットのWordPressを配置するディレクトリに、解凍したファイルをまるごとアップロードします。

リストア用のBackWPupスクリプトを実行する

リストアをするためにはBackWPupのスクリプトを実行します。
まずは、スクリプトを以下のサイトから手に入れます。

  • Download 窶コ BackWPup.com
    • backwpup_db_restore.php

ダウンロードしたら、WordPressを配置するディレクトリにこのスクリプトもアップロードします。

アップロードしたスクリプトにブラウザからアクセスします。
Select file to restore:と表示されるので、データベースにチェックをつけて、Nextを選択。

メモしておいた情報を元に、フォーマットを埋めていく。

  • データベースサーバ名
  • 作成したデータベース名
  • データベース ユーザ名
  • データベース パスワード

 

[Restore Done. Please delete the SQL file and this script.]と表示されてリストア終了。

 

追記:2013年6月

なんと、backwpup_db_restore.php がなくなっていた。以下のエントリをもとにsqlのリストアをしてください。

BackWPupのbackwpup_db_restore.phpが消えた!それでもリストアする場合の方法メモ | Futurismo

wp-config.phpを編集する

メモしておいた以下の情報を、WordPressを配置するディレクトリにあるwp-config.phpを開いて修正する。

  • データベースサーバ名
  • 作成したデータベース名
  • データベース ユーザ名
  • データベース パスワード

 

感動の瞬間

新規URLにアクセスして、リストア終了! (^ ^) vv

はじめてでも、簡単にバックアップできました。
これで、枕を高くして眠ることができます。