Amazon Glacierって御存知ですか?
Amazon Web Servicesの一ストレージサービスで、1Gを1ヶ月1円で使えるのです!
データのバックアップ用途に使えるストレージです。
Amazon Glacierでは保存する場所のことをVaultといい、
保存するファイルのことをArchiveと言います。
Archiveにはアップロード時にユニークなID=ArchiveIdが振られます。
Archiveを取り出したり、削除したりするときにはArchiveIdが必要になります。
Archiveは、基本的には利用者側で控えて置かなければなりません。
で、ここで今日のお題です。
Glacierに保存したArchiveのIDを忘れてしまったり、紛失したりした時にどうするか、です。
実は私も、Glacierの試用中にArchiveIDを忘れてしまい、アップロードしたファイルを消せなくなってしまいました。
激安とはいえ、不要なファイルのためにお金を取られ続けるのは悲しいですよね。
上記の様に、Archiveは基本的には利用者側で控えておくべきものですが、
Amazonにも保存されています。
それを取り出す方法は、↓のURLに記載されている、AmazonGlacierDownloadInventoryWithSQSPollingを実行することです。
http://docs.amazonwebservices.com/amazonglacier/latest/dev/retrieving-vault-inventory-java.html
実行すると、JSONフォーマットのファイルがローカルに出力され、その中にアップロードしたArchiveのIdが記載されています。ただ、結果を得る(JSONファイルがローカルに出力される)ために4時間ぐらい待つ必要があります。。。
ArchiveIdはしっかりと控えておくほうが無難ですね。
バックアップって、テープに取ろうにも、オートローダやテープ媒体は結構高いし、
ハードディスクはちょっと不安だし、ブルーレイも容量少ないし。。。で、コレまでは悩みが多いものでした。
Amazon Glacierはそのソリューションになり得ると思います。
Amazon Glacierは中小企業やWebサービス運営のバックアップにとても有用です。
しかしながら、ちょっとクセがあります。
何かお困りごとがあれば、コメントいただければお力になります。
(宣伝みたいになっちゃったけれど、私はAmazonとは何の関係もありません。。。)
2012年9月7日金曜日
2012年9月1日土曜日
関数型言語っぽい言語
突然ですが、問題です。
↓は、ある言語の一部です。
さて、何言語でしょう?
JavaScriptと答えてくれたあなたを僕は大好きです。
で、答えはJavaでした。無理やりJavaScriptっぽく書いています。
全文は以下です。ちゃんと1秒後に「3」って表示されます!
「だから何」って。。。別になんでもなんですが。。。。
↓は、ある言語の一部です。
さて、何言語でしょう?
{ var myFunction = new function() { var execute() { i = 1; j = 2; console.log(i + j); return null; } }; setTimeout(myFunction, 1000); }
JavaScriptと答えてくれたあなたを僕は大好きです。
で、答えはJavaでした。無理やりJavaScriptっぽく書いています。
全文は以下です。ちゃんと1秒後に「3」って表示されます!
public class FakeJavaScriptTimeout { class var { var execute(){return new var();} } class function extends var { public int i, j; } static class console { static void log(Object o) { System.out.println(o); } } public void setTimeout(final var function, final int time) { new Thread(){ public void run() { try { Thread.sleep(time); } catch (InterruptedException e) {} function.execute(); }; }.start(); } { var myFunction = new function() { var execute() { i = 1; j = 2; console.log(i + j); return null; } }; setTimeout(myFunction, 1000); } public static void main(String[] args) { new FakeJavaScriptTimeout(); } }
「だから何」って。。。別になんでもなんですが。。。。
自己署名証明書(別名:オレオレ証明書。もしくは適当証明書)でHttpsUrlConnectionを使ってSSL通信する方法。
Javaでは、
new URL(ENDPOINT).openConnection()で、ENDPOINTに「https://」プロトコルを指定すると、サーバとSSL通信ができます。
SSL通信するためには、サーバ証明書が必要なんですが、買おうとするととても高い。(無料でSSL証明書がつくれるサービスもありますが、ちょっと手間。)
なので、開発時においては、keytoolなどを利用して自分で証明書を作成したり、サーバデフォルトのSSL証明書を使ったりします。
その際、証明書が正式なものでないため、証明書認証でExceptionが発生しちゃいます。以下のようなException。
とか、
java.io.IOException: HTTPS hostname wrong: should be
本投稿ではそれの対処方法をご紹介します。
証明書で無視する項目は以下の2つです。
1.証明書が信用できるかをチェックしないようにする。
2.証明書とサーバのホスト名がマッチしているかチェックしないようにする。
では、以下、実装方法です。
1.HttpsURLConnection.setSSLSocketFactoryに、証明書を確認しないようにした
new URL(ENDPOINT).openConnection()で、ENDPOINTに「https://」プロトコルを指定すると、サーバとSSL通信ができます。
SSL通信するためには、サーバ証明書が必要なんですが、買おうとするととても高い。(無料でSSL証明書がつくれるサービスもありますが、ちょっと手間。)
なので、開発時においては、keytoolなどを利用して自分で証明書を作成したり、サーバデフォルトのSSL証明書を使ったりします。
その際、証明書が正式なものでないため、証明書認証でExceptionが発生しちゃいます。以下のようなException。
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
とか、
java.io.IOException: HTTPS hostname wrong: should be
本投稿ではそれの対処方法をご紹介します。
証明書で無視する項目は以下の2つです。
1.証明書が信用できるかをチェックしないようにする。
2.証明書とサーバのホスト名がマッチしているかチェックしないようにする。
では、以下、実装方法です。
SSLSocketFactoryを渡します。
2.HttpsURLConnection.setHostnameVerifierにサーバをチェックしないようなX509TrustManagerを渡します。
例えば、以下のようなソースです。public static String doGET() throws Exception { HttpsURLConnection connection = (HttpsURLConnection) new URL("https://google.com").openConnection(); connection.setSSLSocketFactory(createNoCheckSSLFactory()); connection.setHostnameVerifier(new NoCheckHostnameVerifier()); int responseCode = connection.getResponseCode(); if (200 != responseCode) { String errorMessage = streamToString(connection.getErrorStream()); throw new IOException("status = " + responseCode + ", message = " + errorMessage); } return streamToString(connection.getInputStream()); } private static SSLSocketFactory createNoCheckSSLFactory() throws Exception { TrustManager[] trustAllCerts = new TrustManager[] { new NoCheckX509TrustManager() }; SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); return sc.getSocketFactory(); } private static class NoCheckX509TrustManager implements X509TrustManager { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted(X509Certificate[] certs, String authType) {} public void checkServerTrusted(X509Certificate[] certs, String authType) {} } private static class NoCheckHostnameVerifier implements HostnameVerifier { public boolean verify(String hostname, SSLSession session) { return true; } }
2012年8月29日水曜日
GCM(Google Cloud Messaging for Android) のサーバサイド(Java)
GCM、Google Cloud Messaging for Androidをご存知でしょうか?
Androidをサーバから呼び出す処理です。
以前はC2DMという仕組みを使ったのですが、C2DMはすでに無効になっていますので、サーバからAndroidを呼び出したい時はC2DMを使います。
GCMの使い方は、
1.Google APIsでコードの取得
2.Androidアプリの作成
3.サーバサイドアプリの作成
です。
1.2.はGoogleで「Google Cloud Messaging for Android」で検索するとたくさん出てきます。
しかしながら、3.サーバサイドのJava実装は見当たらなかったので、ここに乗せておきます。
Androidをサーバから呼び出す処理です。
以前はC2DMという仕組みを使ったのですが、C2DMはすでに無効になっていますので、サーバからAndroidを呼び出したい時はC2DMを使います。
GCMの使い方は、
1.Google APIsでコードの取得
2.Androidアプリの作成
3.サーバサイドアプリの作成
です。
1.2.はGoogleで「Google Cloud Messaging for Android」で検索するとたくさん出てきます。
しかしながら、3.サーバサイドのJava実装は見当たらなかったので、ここに乗せておきます。
package com.blogspot.ukiuni; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; public class GCMPush { private static final String GCM_ENDPOINT_URL = "https://android.googleapis.com/gcm/send"; private static final String API_KEY = "{API-KEY(Google APIsのコンソールで得られる文字列)}"; private static final String CHARSET = "UTF-8"; private static final int BUFFER_SIZE = 1024; public static void main(String[] args) throws IOException { String registationId = "{REGISTATION_ID(Androidでregistした際に得られる、スゴク長い文字列)}"; String message = "Androidへの送信メッセージ"; GCMPush.push(registationId, message); } public static String push(String registationId, String message) throws IOException { URL url = new URL(GCM_ENDPOINT_URL); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + CHARSET); connection.setRequestProperty("Authorization", "key=" + API_KEY); String postParameter = "registration_id=" + URLEncoder.encode(registationId, CHARSET) + "&collapse_key=update&data.message=" + URLEncoder.encode(message, CHARSET); PrintStream ps = new PrintStream(connection.getOutputStream()); ps.print(postParameter); int responseCode = connection.getResponseCode(); if (200 != responseCode) { String errorMessage = streamToString(connection.getErrorStream()); throw new IOException("status = " + responseCode + ", message = " + errorMessage); } return streamToString(connection.getInputStream()); } private static String streamToString(InputStream in) throws IOException { byte[] buffer = new byte[BUFFER_SIZE]; int readed = in.read(buffer); ByteArrayOutputStream bout = new ByteArrayOutputStream(); while (readed > 0) { bout.write(buffer, 0, readed); readed = in.read(buffer); } return new String(bout.toByteArray(), CHARSET); } }
2012年8月16日木曜日
Androidでjarを使った時にNoClassDefFoundExceptionが出てしまう時の対応
Androidで外部jarファイルを使うときに、Eclipseではjarファイルを取り込めていて、コンパイルもちゃんとできているのに、エミュレータや実機で動かした時に、
その対応策ですが、
Eclipseのプロジェクト→Build Path→Configure Build PathのOrder and Exportタブで、使いたいjarファイルにチェックを入れてください。
その後、Projectツールバー→Cleanで、プロジェクトをクリーンビルドすれば、問題は解決します。
java.lang.NoClassDefFoundError
が出てしまうことがあります。その対応策ですが、
Eclipseのプロジェクト→Build Path→Configure Build PathのOrder and Exportタブで、使いたいjarファイルにチェックを入れてください。
その後、Projectツールバー→Cleanで、プロジェクトをクリーンビルドすれば、問題は解決します。
2012年8月9日木曜日
GlassFishで非同期処理(AsyncContext)
J2EE6(Servlet3.0)で、Servletで非同期処理ができるようになりました。
ここでは、GlassFish3.1でServletの非同期処理の設定方法についてご紹介します。
■非同期処理って何?
Servletは通常、ブラウザからリクエストを受け付けたThreadでServletが処理をしてレスポンスをブラウザに返します。
コレが同期処理です。
同期処理で困るのが、Servletでの処理時間が長いと、ブラウザが待たされることです。
コレに対応するのが、非同期処理です。
非同期処理では、ブラウザがらリクエストを受け付けたThreadとは別のThreadで処理をすることができます。
非同期処理は、時間のかかる処理を行うのに使ったり、
Chatなど、レスポンスのタイミングをコントロールしたい時に使用します。
では、非同期処理の実装の仕方。
やることは2つです。
1. HttpServletRequest#startAsync()を使う。
2. web.xmlをServlet3.0対応にし、非同期処理を扱うすべてのルーティーン(FilterとServlet)で非同期処理を有効にする。
では、詳細を。
1. HttpServletRequest#startAsync()を使う。
filterやservletのリクエストを受け取るメソッドの中で、
AsyncContext asyncContext = request.startAsync();
を呼び出します。
それから、
asyncContext.start(Runnable);
で、非同期で処理したい内容を起動します。
例えば、↓みたいな感じです。
2. web.xmlをServlet3.0対応にし、非同期処理を扱うすべてのルーティーン(FilterとServlet)で非同期処理を有効にする。
web.xmlをServlet3.0設定にします。
web.xmlのルートノードを、
さらに、filterタグやservletタグの中で、非同期処理をすることを宣言します。
例えば
この時に重要なのが、リクエストを受け付けるすべての処理(FilterやServlet)でasync-supportedタグを入れる必要がある、ということです。
Servletで処理をする前に、Filterでエンコーディングを設定したり、セキュリティーをかけてることがありますが、そのFilterにもasync-supportedタグを入れる必要があります。
これで、非同期処理ができるようになります。
■追記
あんまりGlassFishっぽくない、汎用的な説明になったので、GlassFishの情報を一つ。
GlassFishには、管理コンソールから「Cometを有効にする」設定ができますが、この設定をOnにしなくても、AsyncContextは使うことができます。
ここでは、GlassFish3.1でServletの非同期処理の設定方法についてご紹介します。
■非同期処理って何?
Servletは通常、ブラウザからリクエストを受け付けたThreadでServletが処理をしてレスポンスをブラウザに返します。
コレが同期処理です。
同期処理で困るのが、Servletでの処理時間が長いと、ブラウザが待たされることです。
コレに対応するのが、非同期処理です。
非同期処理では、ブラウザがらリクエストを受け付けたThreadとは別のThreadで処理をすることができます。
非同期処理は、時間のかかる処理を行うのに使ったり、
Chatなど、レスポンスのタイミングをコントロールしたい時に使用します。
では、非同期処理の実装の仕方。
やることは2つです。
1. HttpServletRequest#startAsync()を使う。
2. web.xmlをServlet3.0対応にし、非同期処理を扱うすべてのルーティーン(FilterとServlet)で非同期処理を有効にする。
では、詳細を。
1. HttpServletRequest#startAsync()を使う。
filterやservletのリクエストを受け取るメソッドの中で、
AsyncContext asyncContext = request.startAsync();
を呼び出します。
それから、
asyncContext.start(Runnable);
で、非同期で処理したい内容を起動します。
例えば、↓みたいな感じです。
final AsyncContext asyncContext = request.startAsync();
asyncContext.start(new Runnable() {
@Override
publicvoid run() {
try {
//処理時間時間のかかる処理や待ち合わせ処理
//例えば、チャットの相手の文字入力を待つとか。
//・・・・
OutputStream out = asyncContext.getResponse().getOutputStream();
out.write("complete".getBytes());
asyncContext.complete();
} catch (Exception e) {
log.fatal("exception on wait", e);
}
}
});
asyncContext.start(new Runnable() {
@Override
publicvoid run() {
try {
//処理時間時間のかかる処理や待ち合わせ処理
//例えば、チャットの相手の文字入力を待つとか。
//・・・・
OutputStream out = asyncContext.getResponse().getOutputStream();
out.write("complete".getBytes());
asyncContext.complete();
} catch (Exception e) {
log.fatal("exception on wait", e);
}
}
});
2. web.xmlをServlet3.0対応にし、非同期処理を扱うすべてのルーティーン(FilterとServlet)で非同期処理を有効にする。
web.xmlをServlet3.0設定にします。
web.xmlのルートノードを、
<web-appversion="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
というように設定します。xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
さらに、filterタグやservletタグの中で、非同期処理をすることを宣言します。
例えば
<servlet>
<servlet-name>encodingfilter</servlet-name>
<servlet-class>net.ukiuni.EncodingFilter</servlet-class>
<async-supported>true</async-supported>
</servlet>
というようにasync-supportedタグを入れます。<servlet-name>encodingfilter</servlet-name>
<servlet-class>net.ukiuni.EncodingFilter</servlet-class>
<async-supported>true</async-supported>
</servlet>
この時に重要なのが、リクエストを受け付けるすべての処理(FilterやServlet)でasync-supportedタグを入れる必要がある、ということです。
Servletで処理をする前に、Filterでエンコーディングを設定したり、セキュリティーをかけてることがありますが、そのFilterにもasync-supportedタグを入れる必要があります。
これで、非同期処理ができるようになります。
■追記
あんまりGlassFishっぽくない、汎用的な説明になったので、GlassFishの情報を一つ。
GlassFishには、管理コンソールから「Cometを有効にする」設定ができますが、この設定をOnにしなくても、AsyncContextは使うことができます。
XperiaをPCが認識しない時の対応
XperiaをPCと繋ぎたい時があります。
・Xperiaに音楽を入れたい時
・Xperiaから写真を抜き出したい時
・Xperiaをアップデートしたい時
そのために使うソフトはコチラ。
・Windows PC Companion(Xperiaの設定→Xperia→接続設定→PC Companionのインストールにチェックを入れて、XperiaをPCにつなぐとインストールされます)
・Mac Sony Bridge for Mac http://www.sonymobile.com/gb/tools/bridge-for-mac/
で、以下が本題なんですが、
私がやったときは、Windowsで試しても、Macで試しても、Xperiaを認識しない。認識しても、処理途中でアプリが止まっちゃったり、Xperiaが落ちる。
対応として、Xperiaの設定→アプリケーション→開発→USBデバッグのチェックを外したら、無事認識しました。
同様の事象に陥っている方、ぜひお試しあれ。
2012年7月29日日曜日
iCloudを使わずに、iPhoneからAndroidに無料で連絡帳を移行する。
iPhone5、、、出ないなぁ。。。
ということで、スマートフォンをAndroidに代えて見ることにしました。
で、最初に必要なのが連絡帳のお引越しですね。
巷ではiCloud使ったお引越しが主流みたいなんですが、私はちょっとした理由でiCloudが使えませんでした。
試行錯誤の末、iCloudを使わずに、iPhoneからAndroidに連絡帳を引越しすることに成功したので、手順をここで公開します。もちろん、無料でできます。
ざっくりとした手順は、
1. iPhoneの連絡帳データをファイル(CSV)に書き出し+メールで送信。
2. ファイルをgmailの連絡先にアップロード
3. gmailの連絡先をAndroidに同期
です。
必要なのは、連絡帳データをファイルに書き出すアプリと、gmailのアカウントです。
手順詳細
1. iPhoneの連絡帳データをファイル(CSV)に書き出し+メールで送信。
iPhoneの連絡先をCSV出力してくれるiPhoneアプリを使います。私はIS Contacts Kitの無料版を使いました。オシャレで便利です。
ということで、スマートフォンをAndroidに代えて見ることにしました。
で、最初に必要なのが連絡帳のお引越しですね。
巷ではiCloud使ったお引越しが主流みたいなんですが、私はちょっとした理由でiCloudが使えませんでした。
試行錯誤の末、iCloudを使わずに、iPhoneからAndroidに連絡帳を引越しすることに成功したので、手順をここで公開します。もちろん、無料でできます。
ざっくりとした手順は、
1. iPhoneの連絡帳データをファイル(CSV)に書き出し+メールで送信。
2. ファイルをgmailの連絡先にアップロード
3. gmailの連絡先をAndroidに同期
です。
必要なのは、連絡帳データをファイルに書き出すアプリと、gmailのアカウントです。
手順詳細
1. iPhoneの連絡帳データをファイル(CSV)に書き出し+メールで送信。
iPhoneの連絡先をCSV出力してくれるiPhoneアプリを使います。私はIS Contacts Kitの無料版を使いました。オシャレで便利です。
↑赤丸の部分を押していって、自分のメールアドレスにメールを送信すれば、CSVが書き出せます。
2. ファイルをgmailの連絡先にアップロード
↓GMailで、連絡先を開きます。
↑連絡先の左メニューの一番下、「連絡先のインポート」から、メールで送信したCSVをアップロードします。コレでiPhoneの連絡帳データがGmailに取り込まれました。
3. gmailの連絡先をAndroidに同期
Androidの設定→アカウントと同期から、連絡帳のデータを取り込んだGmailのアカウントを設定します。「連絡先を同期」にチェックを入れれば、完成です。
上記の手順で、iPhoneの連絡帳データがAndroidに引越しできます。
最近はやっとiPhoneよりも(私が)いい(なぁと思える)Android端末が出てきました。
ちょっとお試しに、Android端末を買ってみてはいかがですか?
登録:
投稿 (Atom)