telnetでSMTPサーバからメールを送る

たまにデバッグとかで使うので
備忘録です!
SMTPサーバ側の設定によりますが、基本はコレで大丈夫。

telnet XXX.XXX.XXX.XXX 25 *1

HELO localhost *2

MAIL FROM: test@localhost *3

RCPT TO: i_matsui@localhost *4

DATA *5
Subjet: test *6

hogehoge *7
. *8
QUIT*9

*1:まずはサーバに接続

*2:サーバに自分のホストを伝えてご挨拶。ホストは何でもいいみたいです

*3:送信元アドレスを指定。存在しなくてもOK

*4:送信先アドレスを指定

*5:ここからデータ部分だよ・・・という宣言

*6:件名

*7:1行改行を空けた後に本文

*8:DATE部終了を宣言

*9:サーバと切断する

【使い方】Selenium2 WebDriverが便利【JAVA】

テストの自動化ツールは色々ありますが、
Selenium2はとても便利です。
色んなバージョンがあってFireFoxのアドオンで
シナリオ作ったりできますが私はJAVAエンジニアなので
Javaで好き勝手にかけるSelenium2はとても便利です。

テストの自動化はもちろん、
試験データの作成などにも活躍しています。

Apache POIを使えばExcelから値を抽出したり結果を書いたりもできるので
設計書の項目一覧に文字数や必須有無なので
チェック仕様と正常系の値を記載して
設計書を書けば画面レベルの単体試験を自動化したり、
データパターンシートを作成して網羅チェックをしたりしています。

簡単な使い方を記載。

現場で使えるソフトウェアテスト Java編

現場で使えるソフトウェアテスト Java編


●まずはダウンロード
公式サイトよりselenium-java-2.35.0.zip(執筆時点)をダウンロードして
Zip内のselenium-java-2.35.0.jarとlibsの中にあるjarファイルを
クラスパスに追加

●ブラウザ用のドライバーをダウンロード
以下のサイトよりテストで使いたいブラウザのドライバーを
ダウンロードしてzipの中身を任意のフォルダに保存。

IE用ドライバ

Chrome用ドライバ

●実装する

?ドライバーのPATHの設定とインスタンス
System.setProperty("webdriver.chrome.driver","tmp/chromedriver.exe");
WebDriver webDriver = new WebDriver(new ChromeDriver());

IEの場合は以下となる。
System.setProperty("webdriver.ie.driver","tmp/IEDriverServer.exe");
webDriver = new WebDriverWrapper(new InternetExplorerDriver());


?ブラウザの操作

// 指定したURLを開く
webDriver.get("http://yahoo.co.jp");

// HTML上の要素を取得
WebElement element = findElementWrap(By.id("loginId"));
⇒By.nameやBy.xpathが利用可能。
 xpathは以下のようにChromeの要素を検証機能で簡単に取得できるので便利。
※該当要素が存在しないと例外が出るので注意!

// 要素を操作する
1: テキストエリアに値を入力
element.sendKeys("あいうえお");

2: クリックイベントを発生
element.click();

3: サブミットイベントの発生。(form配下の任意のタグでOK)
element.submit();

4: プルダウンを選択
new Select(element).selectByVisibleText("プルダウンのラベル");

5: フォーカスをあてる
Actions builder = new Actions(webDriver);
builder.moveToElement(element).perform();

6: 異なるフレームを選択
String currentWindowId = webDriver.getWindowHandle();
webDriver.switchTo().frame("フレーム名");

7: 別窓を開くイベントを実行して開いた窓を制御する
String currentWindowId = webDriver.getWindowHandle();
element.click();
(new WebDriverWait(this, 10)).until(new ExpectedCondition() {
public Boolean apply(WebDriver d) {
return d.getWindowHandles().size() > 1;
}
});
String newWindowId = null;
for (String id : this.getWindowHandles()) {
if (!id.equals(currentWindowId)) {
newWindowId = id;
}
}
webDriver newWindowDriver = new webDriver((
webDriver.switchTo().window(newWindowId)));


// ブラウザを閉じる
webDriver.quit();
※閉じないとプロセスが残り続けます。


要素がないとnullが出たり、
フレームやWindowの切り替えなど色々書かなきゃいけないので
私はWebDriverのWrapperクラスを自作して使っています。
このクラスを見てみたい方はコメント欄で連絡下さい。

Effective Java 第2版 (The Java Series)

Effective Java 第2版 (The Java Series)

IEでのモーダルウィンドウ

IE6でモーダルウィンドウを使う場合、
Z-INDEXをいくら指定してもテキストエリアやプルダウンなどが
それを突き破って表示してしまう。
IE6はINPUTのパーツをWindowsコンポーネント利用しているからみたいで、
これはけっこう有名な話。

jquery.bgiframe.jsなどのプラグインを使って、
モーダルエリアに対してiframeをかぶせることによって解決できるんだけど、
これを適用しても解決しない事象が発生。

色々調査したらStyleを「position: relative;」にしているブロックがあると
これが最前面に出てきてしまうみたい。
このスタイルを消したら直った。IE6とIE8で確認。

Internet Explorerなど消滅してしまえ。




以下では×ボタンとGmailっぽい詳細検索アイコンを表示させる為に
relativeにしてたのでテキストエリアがはみ出してる。


実践Webデザイン jQuery+CSSフレームワークでサクサクつくる「動き」と「仕掛け」

AXIS2でプロクシ環境でのWSDLからのソース自動生成

プロクシ環境でのWSDL2Javaではwsdl2java.batまたはwsdl2java.shを
以下のように修正しないとダメみたい。

%_RUNJAVA% -Dhttp.proxyHost=XXXX -Dhttp.proxyPort=XXXX %JAVA_OPTS% -cp "!AXIS2_CLASS_PATH!" org.apache.axis2.wsdl.WSDL2Java %*

HTTPSの場合は-Dhttps.proxyHost

HELPにはオプションに

    • http-proxy-host
    • http-proxy-port

ってあるのにコレをつけてもダメだった。
Webで調べてもSOAPのプロクシが出るし、プロキシって言う人もいるから
検索でなかなか見つからず、とりあえず↑を試したらいけた。
こんなことでハマりたくないよねー。

実践Webデザイン jQuery+CSSフレームワークでサクサクつくる「動き」と「仕掛け」

SOAP1.1と1.2について・・・

現場で久しぶりにSOAPサーバを作ることになったのでS2Axisを使って作成。
Axisクライアントとかではなく、自前のHTTP通信で送信する必要があったから
TCPMonのSender機能で動作確認してみたら↓のエラー。






soapenv:VersionMismatch
Transport level information does not match with SOAP Message namespace URI



バージョンがちげーゾと。
どうやらTCPMonはSOAP1.1の書式で送信するらしい。主流は1.2。
このバージョンによってSoapActionとContent-Typeの指定が違うみたい。
以下がその差異。

SOAP 1.1

POST /i_matsui/services/SampleSoap HTTP/1.1
SOAPAction: "urn:registOrder"
Content-Type: text/xml

SOAP 1.2
POST /i_matsui/services/SampleSoap HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8; action="urn:registOrder"

しょうがないからRestClient(http://code.google.com/p/rest-client/)で送信テスト。
互換くらいしてほしいなー。
あと1.2の書式で送信したらWebLogic標準エラー出力にUnsupportedEncodingExceptionを吐いた。
WebLogic9.2だとrequest.getCharacterEncodingの内部でaction属性まで文字コードの一部だと判断しちゃうみたい・・・
なんか気持ち悪いなー。

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

続・Google App Engineで1000件以上の大量データを取得する方法

きのうの記事で書いたやり方だと
元データが大量にあるとダメだった。
# 10万件中の真ん中10000件を取得したらエラー。。。

sinmetalがコメントで教えてくれたSlim3のS3QueryResultListで
カーソルを利用してクルクルまわしてみたら取れた!!
10万件全件のSelectはダメだったけど1万件ずつならいけそう。

int oneSelectNomber = 1000;
int loop = (10000 / oneSelectNomber) - 1;
S3QueryResultList resultL = Datastore.query(meta).filter(filters).offset(0).limit(oneSelectNomber).asQueryResultList();
boolean next = resultL.hasNext();
String cursor = resultL.getEncodedCursor();
String filter = resultL.getEncodedFilters();
for (int i = 0; i < loop; i++) {
if (!next) {
break;
}
S3QueryResultList appendList = Datastore.query(meta).encodedStartCursor(cursor).encodedFilters(filter).limit(oneSelectNomber).asQueryResultList();
next = appendList.hasNext();
cursor = appendList.getEncodedCursor();
resultL.addAll(appendList);
}

実践Webデザイン jQuery+CSSフレームワークでサクサクつくる「動き」と「仕掛け」

Google App Engineで1000件以上の大量データを取得する方法

Google App Engine for JAVAのBig Tableは
AppEngineの制約で1度のクエリーで1000件しか取ってこれない。
offset、limitをループでまわして取ってこようと思ったんだけど、

Datastore.query(meta).offset(30000).limit(1000).asList();


みたいな感じで大量データの中から1000件取る処理をすると内部では
31000件までを取得して30000件までのデータを破棄する・・・という
処理が行われているみたいなのでCancelledExceptionなるものが発生。
たぶんCPU使用時間オーバーとかでDataStoreへの
アクセスが強制終了したのかと。

色々探しても見つからなかったので、ゴリ押しで解決!
一度対象のKeyオブジェクトだけ全部取得して、
そこから分けてDataStoreにアクセス。
以下はSlim3での実装方法・・・。
# 職場で作ったのを思い出して書いたので
# 少し間違ってるかも。
# あとまだ検証途中なので取得対象が超膨大だと動かないかも。。。

// 取得したい件数
int getCount = 10000;
// DataStoreから1度に取得する件数
int base = 2500;
// DataStoreに問い合わせる回数
int loopCount = getCount / base;
// 対象のKEYを全部取得
List keyList = Datastore.query(meta).filter(filters).asKeyList();
// Keyを分割したリスト
List> readList = new ArrayList>();
// 検索結果を保持するリスト
List resultItems = new ArrayList();

int offset = 0;

boolean breakFlag = false;
for (int i = 0; i < loopCount; i++) {
int limit = (i + 1) * base;
if (keyList.size() <= limit) {
limit = keyList.size();
breakFlag = true;
}
readList.add(keyList.subList(offset, limit));
offset += base;
if (breakFlag) {break;}
}

for (List keySplitList : readList) {
resultItems.addAll(Datastore.get(Entity.class, keySplitList));
}

Google App Engineは色々トラブルがありすぎて嫌いになりそうだ。

>追記

このやり方だと大量データの場合ダメでした。。。
解決方法はこっちの記事を!

実践Webデザイン jQuery+CSSフレームワークでサクサクつくる「動き」と「仕掛け」