JavaでBase64文字列をエンコード/デコードする

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2010年10月19日 火曜日 1時01分17秒

今回はプチネタ。
Javaで、Base64エンコードをしたり、デコードしたりする。
これには、Commons Codecというライブラリを使う。

こいつにはBase64エンコード/デコード他、色々と便利な機能がある。
例えば、byte[]型の値を、16進文字列に変えてくれる機能もある。

では、以下にサンプルを示そう。

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;

public class Base64Samples {
    public static void main(String[] args) {
        String str = "あいうえお";
        byte[] encoded = Base64.encodeBase64(str.getBytes());//エンコード処理
        String encodedStr = Hex.encodeHexString(encoded);//エンコード結果のbyte[]を文字列にする
        byte[] decoded = Base64.decodeBase64(encoded);//デコード処理
        String decodedStr = new String(decoded);//デコード結果のbyte[]を文字列にする
       
        System.out.println(encodedStr + ":" + decodedStr);
       
    }
}

このようになる。以下に詳しく説明していく。

オープンソース徹底活用 Slim3 on Google App Engine for Java
著者/訳者:ひが やすを 小川 信一
出版社:秀和システム( 2010-07-30 )
Amazon価格:¥ 2,730
ISBN-10 : 4798026999
ISBN-13 : 9784798026992

(続きを読む...)

Mac OS X用Eclipse(Gallileo)の「HTTPプレビュー」機能が動かない件

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2010年8月9日 月曜日 22時43分58秒

Eclipseのサーバー機能の一つに、HTTPプレビューってのがあるんだが、

EclipseのMac版Gallileoでこれを実行しようとしても、
エラーが出て全く動く気配がない。

で、原因を探るためにエラーで調べてみたら、こんなページが。
あるJavaのソース。

http://eclipsesrc.appspot.com/jsrcs/org.eclipse.wst.server.preview.adapter/src/org/eclipse/wst/server/preview/adapter/internal/core/PreviewLaunchConfigurationDelegate.java.html

ログにも、この「org.eclipse.wst.server.preview.adapter」のプラグインが、
エラーの原因となっているということだったので、多分関係あると思われる。

で、例のエラーメッセージがある部分のコード。
getJavaExecutableメソッドの返り値がnullだったらこの例外が出るっぽい。

File java = getJavaExecutable();
if (java == null)
     throw new CoreException(new Status(IStatus.ERROR, PreviewPlugin.PLUGIN_ID, "Could not find JRE executable"));

で、肝心のgetJavaExecutable();のコードはこちら。

protected static File getJavaExecutable() {
    // do not detect on the Mac OS
    if (Platform.getOS().equals(Constants.OS_MACOSX))
        return null;

うわー。
Macだと強制nullですな。

あと、Eclipseのバグ293398に、このエラーが登録されている。
何か、最終的には担当者がMac持ってないからとかでストップしている。

ということで、結論としてはMac版Eclipse Gallileoでは
HTTPプレビュー見れないっぽい。

PowerMockでprivateもstaticもコンストラクタも単体テストする

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2010年8月4日 水曜日 0時24分00秒

Javaでの単体テストといえばJUnitだが、テストを実行するには色々と壁がある。
実行したいメソッドが内部で呼び出すメソッドが環境依存で、
テストのために環境を準備しないと実行できない事がある場合などだ。

そこで、モックオブジェクトを作成し、関係ないメソッドについては
実行した事にして先に進む事が出来るようにする方法がよく取られる。
JUnit用に、モックを簡単に作れるようなライブラリも幾つかある。

だが、staticなメソッドや、privateなメソッド、コンストラクタなど、
モックを作るのも難しいようなメソッドもあり、どうしても実行できないようなメソッドも存在する。

そこで、最終兵器「PowerMock」の出番だ。
PowerMockは、上述したような、本来Javaの制限で実行出来なさそうなメソッドですら、
モックとして簡単に実装出来る。これを使えば、ほぼどんなテストでも実行可能と言っていい。

しかも、EasyMockというモックライブラリと連携できるので、非常に使いやすい。
出来る所はEasyMockで実装し、難しい所だけPowerMockを使えばよいのだ。

ということで、PowerMockについて少し説明する。

なお、この説明は俺の経験談に基づいて作られている。
そのため、誤りがあったら指摘をして欲しい。
この記事の最大の目的は、PowerMockの日本語記事を増やす事だから、
指摘はこの記事へのコメントの他、あなたのブログでしていただけるととても有難い。

経験ゼロでもできるプログラミング現場の単体テスト
著者/訳者:片桐 一宗
出版社:翔泳社( 2009-05-29 )
Amazon価格:¥ 2,625
ISBN-10 : 4798118915
ISBN-13 : 9784798118918

(続きを読む...)

久々にゴリゴリしたJavaをやっている。といってもAnt

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2010年4月21日 水曜日 1時29分12秒

今日は仕事でAntのタスクを書いてた。
その中で自分の中でタメになったものを紹介。

<copy todir="コピー先ディレクトリ" flatten="true">
    <fileset dir="コピー元ディレクトリ">
        <include name="**/*.java">
    </fileset>

ってやると、コピーする対象のファイル(今回はコピー元ディレクトリ以下の全Javaファイル)を、
元のディレクトリ構造を無視してフラットにコピー先に放り込んでくれる。

やるじゃん!Antって思った。

GAE/Jの画像APIにハマりまくる

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2010年2月16日 火曜日 1時06分47秒

ハマりまくったので、雑多なメモだけ残す。
まず、ImagesServiceFactory.makeCropの4つの引数は、
画像位置を割合で表したものである。
例えば、幅100の画像において、(50,50)から(75,75)の正方形を
切り取ろうとしたら、

ImagesServiceFactory.makeCrop(0.5, 0.5, 0.75, 0.75);

としてCropを作成する必要が有る。全く直感的ではない。
どんな大きさの画像にも対応するためなんだろうが、そんな工夫はいらない。
だったら6引数にして、最初に画像の幅と高さ、残り4つに割合表記じゃない
座標を入れさせてほしい。

次に、Cropを使ってapplyTransformすると、元画像の大きさが変わってしまう。

ImagesService imagesService = ImagesServiceFactory.getImagesService();
Image image = <何かしら、Imageを取得する>;
imagesService.applyTransform(ImagesServiceFactory.makeCrop(0.5, 0.5, 0.75, 0.75),image);

ってやると、前と後ではimageが異なるものになっていた。
何でだ?納得できない。
だったら、戻り値で返さないで欲しい。返してくるから、元画像が守られると思い込んでしまうんだろうが!

APIドキュメント読めとか、素人みたいな事言うな!!
APIドキュメント読まなくてもわかるAPI作れ!!!

Google App Engine for Java [実践]クラウドシステム構築 (WEB+DB PRESS plus) (WEB+DB PRESSプラスシリーズ) (WEB+DB PRESS plusシリーズ)
著者/訳者:(株)グルージェント
出版社:技術評論社( 2009-09-10 )
定価:¥ 2,604
ISBN-10 : 4774139858
ISBN-13 : 9784774139852

Blobstoreは有料です

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2010年1月2日 土曜日 1時37分55秒

今、Google App Engine Java(GAE/J)を弄っているんだが、その中で気付いた事を書く。
画像など、ファイルを効率的に扱う「Blobstore」なる
機能が有るんだが、実はそいつはまだ試験段階で、しかも課金を有効にしないと使えないらしい。
ローカルの試験環境だと使えるのでつい使いがちだが、本番では使えない。

使うと、以下のようなエラーになる。
Blobstoreは、「mediastore」というデモで使われているんだが、
これをまねて作るのは、よした方が良さそうだ。

Uncaught exception from servlet
java.lang.ClassCastException: com.google.apphosting.api.ApiProxy$FeatureNotEnabledException cannot be cast to javax.servlet.ServletException
    at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:754)
    at org.apache.jsp.xxx_jsp._jspService(xxx_jsp.java:NN)←この部分に、Blobstoreを使おうとした所が入る
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093)
    at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:97)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
    at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:238)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
    at org.mortbay.jetty.Server.handle(Server.java:313)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:830)
    at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381)
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:135)
    at com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:235)
    at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:5235)
    at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:5233)
    at com.google.net.rpc.impl.BlockingApplicationHandler.handleRequest(BlockingApplicationHandler.java:24)
    at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:363)
    at com.google.net.rpc.impl.Server$2.run(Server.java:838)
    at com.google.tracing.LocalTraceSpanRunnable.run(LocalTraceSpanRunnable.java:56)
    at com.google.tracing.LocalTraceSpanBuilder.internalContinueSpan(LocalTraceSpanBuilder.java:536)
    at com.google.net.rpc.impl.Server.startRpc(Server.java:793)
    at com.google.net.rpc.impl.Server.processRequest(Server.java:368)
    at com.google.net.rpc.impl.ServerConnection.messageReceived(ServerConnection.java:448)
    at com.google.net.rpc.impl.RpcConnection.parseMessages(RpcConnection.java:319)
    at com.google.net.rpc.impl.RpcConnection.dataReceived(RpcConnection.java:290)
    at com.google.net.async.Connection.handleReadEvent(Connection.java:466)
    at com.google.net.async.EventDispatcher.processNetworkEvents(EventDispatcher.java:759)
    at com.google.net.async.EventDispatcher.internalLoop(EventDispatcher.java:205)
    at com.google.net.async.EventDispatcher.loop(EventDispatcher.java:101)
    at com.google.net.rpc.RpcService.runUntilServerShutdown(RpcService.java:251)
    at com.google.apphosting.runtime.JavaRuntime$RpcRunnable.run(JavaRuntime.java:394)
    at java.lang.Thread.run(Unknown Source)

Unexpected exception from servlet: java.lang.ClassCastException: com.google.apphosting.api.ApiProxy$FeatureNotEnabledException cannot be cast to javax.servlet.ServletException

Beginning Java Google App Engine
著者/訳者:Kyle Roche Jeff Douglas
出版社:Apress( 2009-12-30 )
Amazon価格:¥ 2,518
ISBN-10 : 143022553X
ISBN-13 : 9781430225539

Google App Engine for Java [実践]クラウドシステム構築 (WEB+DB PRESS plus) (WEB+DB PRESSプラスシリーズ) (WEB+DB PRESS plusシリーズ)
著者/訳者:(株)グルージェント
出版社:技術評論社( 2009-09-10 )
定価:¥ 2,604
ISBN-10 : 4774139858
ISBN-13 : 9784774139852

Eclipse Galileoのupdateでエラーが出るので回避

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2009年9月26日 土曜日 16時12分52秒

前回のエントリで出ていたエラー群だが、回避方法が判明。
というか、もしかしてMacって全体的にそうなのか?

回避方法は簡単で、ユーザディレクトリ以下に実行ファイルをおくとか
そんなもん。
これでCyberduckも動いたからなぁ。

Eclipse Galileoのあまりの駄目さに、福山もガリレイも怒り心頭だろ

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2009年9月25日 金曜日 22時31分12秒

Eclipseの最新版、GalileoをMacにインストールして、
早速色々とアップデートしようとしたんだが、色々改悪されてた。
まず、アップデートのUIがFirefoxに続いてゴミ化していた。
なんか、以前のようなサイト毎に選択できる方が全然よかったんだが。



ガリレオ DVD-BOX
Amazon価格:¥ 18,330

ガリハバラ!(DVD付) / スウィングメイツK
コロムビアミュージックエンタテインメント( 2009-07-22 )
定価:¥ 1,785

(続きを読む...)

久々のStaxで、Antのコンパイル時文字コードにハマる

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2009年8月22日 土曜日 1時27分55秒

久しぶりにStax触ったら大分バージョンが上がってて、最新は0.3.7だった。
DL用リンクは全く無くて、WikiからDL可能な0.3.5を実行したら、
もっと新しいのがあるとか言われて0.3.6をDLし出す。
そのとき出てくるURLをコピーしてブラウザに貼って、6になってる所を7に変えてみると
DLできる。
http://stax-downloads.s3.amazonaws.com/sdk/stax-sdk-0.3.7-dist.zip

で、ゲットしてコンパイルしたら文字化けしまくる。

警告:この文字は、エンコーディング MS932 にマップできません。

どうも日本語WindowsだとMS932になってしまうらしい。
プロジェクトフォルダ内にあるstax-build.xmlを書き換える。

<target name="compile" depends="init" description="compile the source ">
    <javac encoding="utf-8" srcdir="${src}" destdir="${build}" classpathref="webapp.classpath" />
    <copy todir="${build}">
        <fileset dir="${src}" excludes="**/*.java" />
    </copy>
</target>

javacタグに「encoding="utf-8"」を追記してやる。
これで、UTF-8でコンパイルしてくれる。

目下の問題は、以下2点。
1.Web上に上げといたRSSが、いつの間にか文字化けしてない。
2.最新版でコンパイルしなおしたRSSが、動かない

クラウドコンピューティング―技術動向と企業戦略
著者/訳者:森 洋一
出版社:オーム社( 2009-05-12 )
Amazon価格:¥ 1,680
ISBN-10 : 4274502325
ISBN-13 : 9784274502323

Staxで今度こそRSSフィードを纏め上げる(後は文字コード問題)

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2009年5月6日 水曜日 1時14分32秒

前回のエントリで脆くも砕け散ってしまったお勉強テーマである、
俺が所有する、現在アクティブな4つのブログのRSSフィードを、
Stax+Wicketで纏めようと言う試みがようやく形になってきた。

こちらにその結果がある。

まぁ、5月5日時点では見ての通り日本語が無茶苦茶ですよ。
ただ、これはStax+Wicket+ROMEの連携には、まったく関係の無い
別の所にある問題なので、RSSフィードを出す方法はわかった。

と言うことで、解説を書きまーす。

なお、今回は
Javaウェブフレームワーク「Wicket」の使い方 RSS Readerを作る その2 - フィードの取得と表示
を参考にした。
(続きを読む...)

« 前ページへ次ページへ »

HTML convert time: 4.876 sec.