2015年8月17日月曜日

UPQ Phone A01の発売日が1ヶ月以上延期された件


UPQ Phone A01をご存知でしょうか?
元カシオの方がデザインされた格安スマフォです。
国内最安:“アキバ発”のSIMフリースマホ「UPQ Phone」とは? 新感覚の関連アイテムも注目 (1/3) - ITmedia Mobile

私も期待して、予約をしていたのですが、本日、販売サイトから残念なお知らせをいただきました。

以下、頂いたメールよりの引用です。
//引用(注文番号を改変)/////////////////////////
お世話になります。MyDMMサポートセンターです。

ご注文いただいた商品ですが
メーカーから発売日変更の連絡がありましたのでお知らせいたします。===================================================
注文番号:KC-XXXXXXXX

商品名:UPQ Phone A01(WH)|カラー:ホワイト  ×  1個
発売日:2015年8月28日 → 2015年9月30日
===================================================

//引用終わり/////////////////////////


あああああ!
発売が1ヶ月以上先になっちゃっいました!

これが予想以上に予約があったためなのか、それとも製造に何かあったのかはわかりませんが、1ヶ月先となると、噂の新型Nexusの発表予想日とも近くなってしまうので悩ましいところです。

予約された方の中で、もし、「延期のメールなんて来てないよ」や、「延期のメールが来たけど日付が違う!」などの方がいらっしゃいましたらコメントいただきたくお願いします。

2014年3月22日土曜日

Nashorn(Java 8のJavaScriptエンジン)の実力

Java 8 になって、JREに含まれるJavaScriptエンジンがRhinoからNashornに変わりました。
public class Inspector {
    public static void main(String[] args) {
        ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");
        System.out.println("engine = " + engine);
    }
}
>engine = jdk.nashorn.api.scripting.NashornScriptEngine@548ad73b

速くなったのかなー。ということで、RhinoとNashhornの実行速度を比較してみます。
コードはこんなシンプルなものです。

public class Inspector {
    public static void main(String[] args) throws ScriptException {
        ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");
        System.out.println("engine = " + engine);
        long startTime = System.currentTimeMillis();
        engine.eval("var count = 0;for(var i=0;i<100000;i++){count += i}");
        System.out.println("finish "+(System.currentTimeMillis() - startTime));
    }
}

Rhinoで実行すると、
engine = com.sun.script.javascript.RhinoScriptEngine@4fb3c3d9
finish 367

Nashoneで実行すると、
engine = jdk.nashorn.api.scripting.NashornScriptEngine@548ad73b
finish 117

Nashoneはやーい。

2014年3月8日土曜日

EclipseにWildFlyを設定する。

WildFlyってご存じですか?Java EE準拠のアプリケーションサーバです。GlassFishがこんな状況なので、移行先としていいかも。

本記事ではEclipse Kepler に WildFly 8.0を設定する方法を記載します。

EclipseはJ2EEが入ったものを用意します。WildFly 8.0はこちらからダウンロードして解凍しておきます。

「環境設定」 → 「Server」 → 「Runtime」 で「Add」を選択します。

「Download additional server adaptors」を選択します。

「JBossAS Tools」を選択し「Finish」を押します。表示されるまで少し時間がかかります。

再起動後、もう一度、「環境設定」 → 「Server」 → 「Runtime」を選択すると、「JBoss Community」> 「WildFly 8.0 Runtime (Experimental)」を選択します。

あとは、解凍したWildFlyを設定するのみで、EclipseとWidlFlyの設定完了です。Webアプリケーションを右クリック→Run As → Run on Serverなどで使えるようになります。

起動も早くていい感じ。Java EE 7をお探しの方はぜひお試しあれ。

2013年7月22日月曜日

Google App Engine for Java(GAE4J) で、datanucleusのエラーが出た時の対策

Google App Engine for Javaでデータベース系、datanucleusのエラーが出た時は、SDKをアップデートし、Eclipseで新しいSDKを設定し直すと、治るかもしれません。
私は、「org.datanucleus.store.types.TypeManager loadJavaTypes: User-defined type mapping class "org.datanucleus.store.types.sco.simple.List" was not found.」というエラーが出た時にこれで治りました。


SDKのアップデートは2つ、プラグインのアップデートと、SDKのアップデートをします。
プラグインのアップデートはEclipseのHelp→Check for Updatesからできます。
SDKのアップデートは環境設定(WindowsやLinuxだと、window→preferenceだったかな?)→Google →App Engineでダウンロードボタンを押すと、ブラウザが立ち上がってダウンロードサイトが開きますので、そこからダウンロードして設定を行います。

あとはプロジェクトをリビルドすると、datanucleus系のjarファイルがアップデートされ、エラーが解消されるかもしれません。

お試しあれ。

2013年6月13日木曜日

EclipseでAndroidのログが出力されなくなった時の対応。

Eclipseでは、LogCatで、Androidの実機のログを見ることができます。
そのログが出なくなったときは、DDMSパースペクティブを開いて、Deviceビューからログを見たい端末を選択すると、ログが出ることがあります。

お試しあれ。

2013年6月1日土曜日

Apache OpenMeetingsでビデオ会議をしてみませんか?


ビデオ会議とは、簡単に説明するとみんなでテレビ電話することです。
離れた場所にいる、複数の相手の顔を画面上で見ながら、お話すること。

Apache OpenMeetingsを使うと、無料でビデオ会議環境がつくれます。
画面共有もできるので、「見たいプレゼンがあるんだけれど、離れた場所でやるからなー。」
という時にも、プレゼンする人に画面共有をお願いすれば、プレゼンを聞くことができます。

Apache OpenMeetingsはセットアップも簡単!
ビデオ会議、試してみませんか?

□サーバーセットアップ
2つのソフトウェアをインストールするだけです。Javaをインストールして、Apache OpenMeetings(zip)を解凍して、設定するだけです。
記録機能を使うためには他にもいろいろと必要ですが、
テレビ会議をするだけなら、すぐにセットアップできます。

サーバはWindowsでも、Linuxでも、Macでも大丈夫です。Java最高。
ちょっと試してみたい場合にはWindows、みんなで使うときにはLinuxを使うと良いと思います。

では、セットアップ手順。
1. Javaのダウンロードとインストール
2. Apache OpenMeetingsのダウンロードとインストール
3. Apache OpenMeetingsの設定と起動

1. Javaのダウンロードとインストール
http://java.com/ja/download/ からJavaをダウンロードします。
exeファイルがダウンロードされるので、ダブルクリックで実行してください。

2. Apache OpenMeetingsのダウンロードとインストール
http://incubator.apache.org/openmeetings/downloads.html から Apache OpenMeetingsをダウンロードします。
zipファイルがダウンロードされるので、右クリックで解凍してください。

3. Apache OpenMeetingsの設定と起動
 Apache OpenMeetingsを解凍したフォルダにできる、binフォルダに移動します。
以下のコマンドをコマンドプロンプトにコピー&ペーストします。(下の行を選択して、右クリック→コピーした後に、コマンドプロンプトで右クリック。)
./admin.sh -i -email admin@example.com -group mygroup -tz "Asia/Tokyo" -user myadmin --password mypassword
↑のコマンドでは初期ユーザを作っています。メールアドレスがadmin@example.com, 会議室を共有するグループがmygroup、時間が東京時間、ログインIDがmyadmin、passwordがmypasswordのユーザを作っています。

最後に起動。
red5.sh
これだけ。
あとは、ブラウザで http://{hostname}:5080 にアクセスしてみてください。
ブラウザにFlash Playerが入っていれば、openmeetingsを使用することができます。
ブラウザはChromeで使用すると、音が割れる(というか、ぶつぶつになるというか。。。)ことがあるのでFirefoxやSafari等をおすすめします。
停止は
でできます。

テレビ会議、お楽しみあれ。

2013年3月16日土曜日

HomeBrewで環境を汚さずにRuby2.0をインストール

HomeBrewとは、Rubyで書かれたMac用パッケージ管理ツールです。
一番簡単なHomeBrewのイントールは、ターミナルから
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
でインストール出来ますが、/usr/local/binなどにいろいろインストールされます。
私は知らないファイルを知らない場所にいろいろインストールされるのには耐えられないので、場所指定でインストールします。
今回は/Applications/homebrewを作って、その中にインストールします。
事前にCommand Line Tools for Xcode か Xcodeをインストールしてください。

ではインストールをはじめます。
cd /Applications
mkdir homebrew && curl -L https://github.com/mxcl/homebrew/tarball/master | tar xz --strip 1 -C homebrew
認証Proxyを超える場合は、上記コマンド前に、
export http_proxy=http://{USER}:{PASS}@{PROXY}:{PORT}
export ALL_PROXY=$http_proxy
を設定しておきます。

これでhomebrewがインストールされるので、.bash_profileでPATHを設定しておきます。
echo "export PATH=/Applications/homebrew/bin:\$PATH" >> ~/.bash_profile
source ~/.bash_profile

brew のインストールは以上で終わりです。
あとはRubyのインストールを行います。
ruby install ruby

これでRubyが/Applications/homebrew/binにインストールされます。

2013年2月16日土曜日

Herokuにwarをデプロイ(With Eclipse)

Herokuって知ってますか?良い感じのPaaSです。Tomcatがセットアップされていて、作ったWebアプリケーションを動かすことができます。すでに有名なサービスなのですが、日本語でJavaのWebアプリをデプロイする方法を説明しているサイトが無かったので、ここで公開。

HerokuにJavaのWebアプリを載せる方法は、コマンドライン、Eclipseとあるのですが、ここでは一番簡単だとおもうEclipseの手順を載せます。

事前準備
Eclipse3.7以上を用意します。
Herokuでアカウントを作っておきます。

■ Eclipseのセットアップ
1. EclipseにHeroku用プラグインをインストールします。
ツールバーのHelp > Install new Software →Work with に https://eclipse-plugin.herokuapp.com/install を入れて、Enterキーを押します。

Heroku Eclipse Integrationが表示されるので、チェックを入れてNext>ボタンを押します。

あとは道なりでプラグインがインストールされます。

2. プラグインの設定
プラグインのインストールが終了したら、ツールバーのPreference(Eclipseなら、Eclipse→環境設定)→HerokuでHerokuのアカウント情報を入力して、Loginボタンを押します。

すると、API Keyに値が入ります。
続いて、General → Network Connections → SSH2で、Key ManagementからGenerate RSA Keyを押します。鍵が表示されるので、Save Private Keyを押します。

再びHerokuの設定画面に戻って、Load SSH keyボタンを押して、生成した.pubファイルを指定します。
OKボタンを押して、設定完了です。

■WARのデプロイ
1. Heroku Viewの表示
Window → Show View → OtherからHeroku→My Heroku Applicationsを選択します。My Heroku Application Viewが表示されます。

Herokuを使うのが初めてでしたら、ビューのテーブルには何も常時されません。

2. アプリケーションの作成
デプロイするアプリケーションをHerokuに作成します。ローカルにもWebアプリが作られますが、作られたWebアプリを使う必要はありません。手元にwarがあれば、それを使うことができます。
ツールバーのFile → Other から Heroku → Create Heroku App From Templateを選択します。

Application Nameに任意の名前(世界でユニークにする必要があります。)を選んで、左下の欄でどれか(なんでもいいです。)を選んで、Finishボタンを押します。
My Heroku Application Viewにアプリケーションが表示されるので、右クリック→Deployで、お好きなwarファイルを指定すれば、デプロイ完了です。

http://{Application Name}.heroku.com にアクセスすると、アプリケーションを確認することができます。

2013年1月31日木曜日

TwitterのoAuthで"Read, Write and Access direct messages"してもDMが使えない場合の対応

Twitterに連携するアプリからDMを使いたい場合は、https://dev.twitter.com でアプリを作って、"Read, Write and Access direct messages"を設定します。
しかしながら、時にその設定をしたとしても、ユーザが「ダイレクトメッセージを見る。」を許可されない場合があります。
その時は、oAuthの、twitterのログインページのURLを確認してみてください。
oAuthのログインURLは2パターンあって、
https://api.twitter.com/oauth/authorize
と、
https://api.twitter.com/oauth/authenticate
があります。
前者ならばDMは使えますが、後者は使えません。
Twitter4jを使っている場合は、前者はgetOAuthRequestToken().getAuthorizationURL()で、後者が、getOAuthRequestToken().getAuthenticationURL()で取得出来ます。前者じゃないと、DMは使えません。

困った場合は、是非お試しあれ。

2012年9月7日金曜日

Amazon Glacierで、Vault中のArchive一欄を取得する方法、または、ArchiveIDを紛失したり忘れた時の対応

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月1日土曜日

関数型言語っぽい言語

突然ですが、問題です。
↓は、ある言語の一部です。
さて、何言語でしょう?
{
 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。


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.証明書とサーバのホスト名がマッチしているかチェックしないようにする。

では、以下、実装方法です。

1.HttpsURLConnection.setSSLSocketFactoryに、証明書を確認しないようにした
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実装は見当たらなかったので、ここに乗せておきます。

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ファイルを取り込めていて、コンパイルもちゃんとできているのに、エミュレータや実機で動かした時に、

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);
で、非同期で処理したい内容を起動します。
例えば、↓みたいな感じです。
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);
        }
    }
 });


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">
というように設定します。
さらに、filterタグやservletタグの中で、非同期処理をすることを宣言します。

例えば
<servlet>
    <servlet-name>encodingfilter</servlet-name>
    <servlet-class>net.ukiuni.EncodingFilter</servlet-class>
    <async-supported>true</async-supported>
</servlet>
というようにasync-supportedタグを入れます。

この時に重要なのが、リクエストを受け付けるすべての処理(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の無料版を使いました。オシャレで便利です。
↑赤丸の部分を押していって、自分のメールアドレスにメールを送信すれば、CSVが書き出せます。

2. ファイルをgmailの連絡先にアップロード
↓GMailで、連絡先を開きます。

↑連絡先の左メニューの一番下、「連絡先のインポート」から、メールで送信したCSVをアップロードします。コレでiPhoneの連絡帳データがGmailに取り込まれました。

3. gmailの連絡先をAndroidに同期
Androidの設定→アカウントと同期から、連絡帳のデータを取り込んだGmailのアカウントを設定します。「連絡先を同期」にチェックを入れれば、完成です。

上記の手順で、iPhoneの連絡帳データがAndroidに引越しできます。
最近はやっとiPhoneよりも(私が)いい(なぁと思える)Android端末が出てきました。
ちょっとお試しに、Android端末を買ってみてはいかがですか?





2011年12月6日火曜日

GlassFish3.1.1 + SAStrutsの動かし方

GlassFish上でSAStrutsを動かすと、以下のようなエラーが発生することがあります。
java.lang.NullPointerException
at org.apache.jasper.compiler.TagLibraryInfoImpl.toString(TagLibraryInfoImpl.java:129)
at java.lang.String.valueOf(String.java:2826)
at java.lang.StringBuilder.append(StringBuilder.java:115)
at java.util.AbstractMap.toString(AbstractMap.java:490)
at java.lang.String.valueOf(String.java:2826)
at java.lang.StringBuffer.append(StringBuffer.java:219)
at org.seasar.extension.filter.util.RequestDumpUtil.dumpContextAttributes(RequestDumpUtil.java:86)
at org.seasar.extension.filter.RequestDumpFilter.dumpAfter(RequestDumpFilter.java:191)
at org.seasar.extension.filter.RequestDumpFilter.doFilter(RequestDumpFilter.java:129)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:79)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.seasar.framework.container.hotdeploy.HotdeployFilter.doHotdeployFilter(HotdeployFilter.java:86)
at org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployFilter.java:67)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:785)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:649)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:483)
at org.apache.catalina.core.ApplicationDispatcher.doDispatch(ApplicationDispatcher.java:454)
at org.apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.java:350)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:300)
at org.seasar.struts.filter.RoutingFilter.forward(RoutingFilter.java:219)
at org.seasar.struts.filter.RoutingFilter.doFilter(RoutingFilter.java:152)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:79)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.seasar.framework.container.hotdeploy.HotdeployFilter.doHotdeployFilter(HotdeployFilter.java:99)
at org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployFilter.java:67)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.seasar.extension.filter.EncodingFilter.doFilter(EncodingFilter.java:69)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:680)
原因を調べてった所、問題が2点あって、
①requestDumpFilterが動いてない。
②jar中のtld(タグライブラリの記述)を読み込めていない。

で、なおし方。
以下の2つをやるとうごきます。
①requestDumpFilterが動かないようなので、Webアプリの/WEB-INF/web.xmlの以下の場所をコメントアウトします。


<!-- requestDumpFilter が動かないので、コメントアウト
<filter-mapping>
<filter-name>requestDumpFilter</filter-name>
<url-pattern>*.do</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
-->

②jarの中のtldが読み取れないので、外に出します。
tldsa-struts-X.X.X-XXX.jar(Xはバージョン番号。多分皆さんのWebアプリのWEB-INF/libの中に入ってます。)をZIP解凍ツールで解凍して、中の/META-INF/s.tldと、/META-INF/f.tldを取り出します。で、WebアプリのWEB-INF直下においてください。同じく、struts-1.2.9.jarの中から/META-INF/struts-html.tld、/META-INF/struts-bean.tld、/META-INF/struts-tiles.tldを取り出して、WEB-INF直下においてください。
で、web.xmlのjsp-configタグの中に、以下を入れます。

<jsp-config>

<!-- ここから-->
<taglib>
<taglib-uri>http://struts.apache.org/tags-beantaglib-uri>
<taglib-location>/WEB-INF/struts-bean.tldtaglib-location>
<taglib>

<taglib>
<taglib-uri>http://struts.apache.org/tags-htmltaglib-uri>
<taglib-location>/WEB-INF/struts-html.tldtaglib-location>
<taglib>

<taglib>
<taglib-uri>http://jakarta.apache.org/struts/tags-tilestaglib-uri>
<taglib-location>/WEB-INF/struts-tiles.tldtaglib-location>
<taglib>

<taglib>
<taglib-uri>http://sastruts.seasar.orgtaglib-uri>
<taglib-location>/WEB-INF/s.tldtaglib-location>
<taglib>

<taglib>
<taglib-uri>http://sastruts.seasar.org/functionstaglib-uri>
<taglib-location>/WEB-INF/f.tldtaglib-location>
<taglib>
<!-- ここまで -->

<jsp-property-group>

これで動くようになります。
Glassfish3.1は、アプリケーションバージョニングがとても便利で、Webアプリケーションの無停止バージョンアップが可能になっています。
ぜひお試しあれ。

2010年12月7日火曜日

速報! Android2.3 Gingerbreadの新機能!

ついに、Android2.3 Gingerbreadが、Nexus S と共に公開されました。

新機能は以下の様になっています。

・UIの刷新 画面が、簡単で早くなった。
・新入力方式 入力方式が新しくなり、文字が選択できるようになった。
・バッテリー管理の改善 電池のもちがよくなった。
・VoIP もう、電話番号なんてなくても電話ができる。
・NFC お財布携帯になる!!(お財布携帯用アプリが載れば。。。載るかな?)。
・ダウンロード改善 WebやE-Mailのダウンロードがしやすくなった。
・マルチカメラ対応 画面側のカメラにも対応。(テレビ電話できる!)

また、上以外にも、ゲームが開発しやすくなったり、新しい動画方式(WebM)に対応するなど、新しい機能が目白押しです!

さあ、ついにくるぞ!Android!

最高のAndroid - Nexus S 発表!!

2010年の終わりに、ついに、ついに、最高のAndoird、Nexus SがGoogleから発表されました!

それは、最新のAndroid OS、Android 2.3 Gingerbreadを搭載し、
それは、1Gのプロセッサを積み、
それは、16Gのストレージを持ち、
それは、近接センサーを備え、
それは、新しい入力方式で構え、
それは、VoIPを標準で装備しています。



※画像はGoogleの紹介ページより

アメリカに居る人は、12/16から購入可能。
12/20からオンラインでも購入可能!!

未来に行くなら、Nexus Sを持て!!!