ラベル Java の投稿を表示しています。 すべての投稿を表示
ラベル Java の投稿を表示しています。 すべての投稿を表示

2018年2月25日日曜日

JavaServlet で日本語が「?」で表示されたときの直し方

How to fix the Garbled characters in Java Servlet

Eclipse で JavaServlet を作って実行したら文字化けしてしまいました。
そのときの文字化けの原因と直し方をまとめました。


環境

  • Windows 7
  • Internet Explorer 11
  • Eclipse Luna


JavaServlet で文字エンコードを指定する方法

JavaServlet で文字化けを起こさないためには文字エンコードを指定します。
文字エンコードの指定は Web ブラウザーに文字エンコードなどを伝える「ヘッダー」や、画面に表示する「本文」の meta タグなどで出来ます。
ヘッダーの文字エンコードは response.setCharacterEncoding や response.setContentType で指定します。


文字化けが起きた JavaServlet

ヘッダーと本文の両方に文字エンコードを指定したのに文字化けが起きた JavaServlet のソースは次の通りです。


UTF-8 で出力したいのでヘッダーには setCharacterEncoding と setContentType で、本文には meta タグで 指定したつもりですが実行すると下の画像のように日本語が文字化けしました。

blog.fujiu.jp JavaServlet で日本語が ?? で表示されたときの直し方


原因と直し方

原因は doGet メソッドで文字エンコードを指定する前に本文を出力していたためでした。

文字化けした JabavServlert は文字のエンコードを指定する response.setCharacterEncoding や response.setContentType を実行するよりも先に
response.getWriter().append("Served at: ").append(request.getContextPath());
を実行していますが、この response.getWriter() ... が 文字エンコードの指定前に HTML の本文を出力してしまい文字化けの原因となっていました。
response.getWriter() ... の行は Eclipse のウィザードで新規に JSP ファイルを作成するとはじめから記入されているのですが、消さずにコーディングを続けたために残ってしまいました。

response.getWriter() ... の行を response.setContentType ... の次の行に移動して実行した結果が次の通りです。

今回の文字化けは doGet や doPost で最初に response.setCharacterEncoding や response.setContentType で文字エンコードを指定することで直りました。


ブラウザーはどう解釈してるのか確かめる

文字化けするときとしないときとで Internet Explorer の F12 開発者ツールで応答ヘッダーがどう変わるのか見てみました。
文字化けしたときの応答ヘッダーは charset=ISO-8859-1 となっていました。
JavaServlet で本文を先に出力してしまうとヘッダーを正常に出力出来ないようです。
また、文字エンコードを meta タグに指定しても、今回のケースは効果がなかったうようです。

文字化けが直った方法で応答ヘッダーを確認すると charset が指定した通りに変わりました。


関連ブログ

JavaScript でグラフを作る方法 (Chart.js)
JavaScriptをWebコンテンツを見ながらデバッグする [Intenet Explorer] [firefox]
HTMLソースのミスやエラーを素早くチェックする


2016年6月25日土曜日

[Android] Xamarin で jar (Javaライブラリー) を実行する方法

How to run Jar libraries on Xamarin.Android

前回 Android Studioで作ったjarライブラリーファイル
をAndroid向けXamarinで実行します。


環境

  • Windows 10
  • Visual Studio Community 2015


既存のAndroid用ソリューションに Bindings Library を追加する

XamarinでJarライブラリーを実行するために Bindings Library プロジェクトを追加します。
Visual Studioを起動してAndroidアプリ用ソリューションを開きます。
ソリューションエクスプローラーのソリューションを右クリックして
追加 - 新しいプロジェクト
をクリックします。
blog.fujiu.jp [Android] Xamarin で jar (Javaライブラリー) を実行する方法

Bindings Library (Android) を追加します。
名前は BindingFujiuJar としました。

これでソリューションに BindingFujiuJar が追加されました。


Bindings Library プロジェクトにjarファイルを追加する

今回実行するjarファイルの中は StringDate というクラスに getNow() というメソッドがあります。 ソースはこちら

BindingFujiuJar の Jars フォルダーを右クリックして
追加 - 既存の項目
をクリックしてAndroid Studioで作ってjarファイルを追加します。


追加したjarファイルのプロパティのビルドアクションを EmbeddedJar に変更します。

今回のjarライブラリー化したクラスは Try-with-resources を使っているので、Xamarin.Androidプロジェクトのプロパティーの Compile using Android Versions を19以上に設定する必要がありました。
Android SDKの最新版をダウンロードし、「Use Latest Platoform」にしておきました。


既存のAndroid用プロジェクトの参照を設定する

Android用プロジェクト (先ほど追加したBindings Libraryではない方) の参照を右クリックして 参照の追加 をクリックします。

プロジェクト内にある先ほど追加した BindingFujiuJar をチェックしてOKをクリックします。

これで準備が整いました。


C#のクラスからJavaのjarライブラリーのクラスを実行する

オブジェクトブラウザーでJavaのパッケージ名はC#の名前空間に変換された結果を確認します。

jp.fujiu.fujiujp_jar
というJavaパッケージ名は
JP.Fujiu.Fujiujp_jar
という名前空間に変換されました。

C#のコーディングスタイルに合わせて1文字目とピリオドの次は大文字で書くとして、2文字目のPも大文字に変換されました。
またJavaの getNow() というメソッド(アクセサー)はC#の Now というプロパティに変換されます。

JavaのStringDateクラスのgetNow()メソッドを呼び出すActivityをXamarinのC#で書いてみました。
ボタンをクリックするたびに結果をToastに表示するActivityの例です。



実行結果

Docomo SH-06E (Android4.2、APIレベル17)で正常に実行できました。

Xamarin.Formsソリューションでは .Droidプロジェクトから実行することができました。


まとめ

  • jarファイルのビルドアクションはEmbeddedJarに設定する
  • Javaのパッケージ名はC#の名前空間に変換される。一部大文字に変換されるので注意
  • Javaのgetやsetで始まるメソッド(アクセサー)はC#のプロパティに置き換えられる
    例: getNow() → Now


注意点

C#からJavaのコードを実行するのにリフレクションを使っているようです。
リフレクションは非リフレクションと比較すると遅い実行方法なので速さが求められる処理には向きません。
C#への移植が困難で速さを犠牲にしてもいい場合以外は使用を控えた方が良さそうです。


トラブルシューティング

実行時に JNIEnv.FindClass ClassNotFoundException が発生する

プロジェクトのクリーンとビルドをし直したら発生しなくなりました。



関連ブログ

[Android Studio] Xamarin で実行可能な jar (Javaライブラリー) の作り方
[Android] Xamarin でアプリを作ってみました
Android Studioを使ってみました
[Unity3D] Unity5のプロジェクトをAndroid Studioにインポートする方法
[Java] Android StudioやEclipseのお節介な警告を消す方法
[Android] アナログ時計アプリをライブ壁紙に改造する

以上、参考になれば幸いです。

2016年6月18日土曜日

[Android Studio] Xamarin で実行可能な jar (Javaライブラリー) の作り方

How to create JAR libraries for Xamarin.Android

XamarinはC#でAndroidやiOSなどのアプリケーションを開発できるマルチプラットフォーム開発ツールです。
Android向けXamarinアプリは Bindings Library でjarファイルを実行することもできます。
jarファイルはJavaのコンパイル済みクラスをまとめたライブラリーファイルです。
ただしEclipseのみで作ったjarファイルは実行できませんでした。
Android向けXamarinで実行できるjarファイルをAndroid Studioで作る方法をまとめました。


環境

このブログを書いた時点の最新バージョンを使っています。
  • Windows 10
  • Android Studio 2.1
  • Java SE Development Kit 8u91


jarライブラリー化したいクラスを決める

今回はシンプルに現在日時を文字列で返すクラスをjarライブラリー化します。
ソースは次の通りです。

StringDate.java



Android Studio で クラスをjarファイル化する

プロジェクトにModuleを追加する

新規プロジェクトを作っても既存のプロジェクトを使ってもいいです。
Android StudioのProjectウィンドウを右クリックし、
New - Module
を追加します。
blog.fujiu.jp [Android] Xamarin で実行できる jar (Javaライブラリー) の作り方

Moduleの種類はAndroid Libraryを選びます。

Moduleの名前は fujiujp_libs としました。
今回jar化したいクラスは Try-with-resources を使っているので Minimum SDKは19以上に設定する必要がありました。
Minimum SDKはGradleのminSdkVersionを修正して変更することもできます。

ModuleにJavaクラスを追加する

Projectウィンドウのfujiujp_libsのツリーを開いてJavaクラスを追加します。

Gradleファイルにスクリプトを追記する

Projectウィンドウの Gradle Scripts のツリーを開いて build.gradle (Module: fujiujp_libs) を編集します。
このファイルに次のコードを追記します。




jarファイルをビルドする

Gradleウィンドウを開いて左上の Refresh All Gradle Projects をクリックします。

fujiujplibsというGradleが追加されるのでツリーを開いて
Task - other fujiuJpJar
をダブルクリックします。


これでプロジェクトフォルダーの fujiujp_jar\libs\ に FujiuJpLib.jar という名前でjarファイルができました。

次回はこのjarファイルのクラスをXamarinから実行します。



関連ブログ

[Android] Xamarin でアプリを作ってみました
Android Studioを使ってみました
[Unity3D] Unity5のプロジェクトをAndroid Studioにインポートする方法
[Java] Android StudioやEclipseのお節介な警告を消す方法
[Android] アナログ時計アプリをライブ壁紙に改造する
Live2Dを使ってみました

以上、参考になれば幸いです。

2016年5月14日土曜日

[Docker] Eclipse Che でプログラミングする方法 [Java]

How to program in Eclipse Che

Eclipse CheはDockerで稼働しWebブラウザーでプログラミングする統合開発環境です。
以前のブログ で書いたとおりインストールしてみたのでプログラミングしてみます。


環境

  • Windows 10
  • Eclipse Che 4.0.1
  • Webブラウザーは Microsoft Edge


Workspaceを作る

Eclipse Cheが起動したらダッシュボードの左上のハンバーガーボタンをクリックして
blog.fujiu.jp Eclipse Cheでプログラミングする方法

Workspaceをクリックします。

右上のプラスのボタンをクリックすると新しいWorkspaceを追加できます。

追加するWorkspaceを設定する画面が表示されます。
今回はJAVAを作ることにし、全て初期設定のまま一番下の CREATE WORKSPACE をクリックします。

Workspaceの名前設定の画面が表示されます。
自分でWorkspaceの名前を入力してRENAMEをクリックすると変更できます。
RUNボタンでWorkspaceが作成されます。

Workspaceの作成いつまでたっても終わらない場合はブラウザーをリロードするとWorkspaceが完成していることがあります。
OPEN IN IDEでWorkspaceを操作する画面に変わります。


新しいProjectを作る

画面左上のWorkspaceメニューから Create Project をクリックします。

今回はMaven Projectを作ることにし、Nameにプロジェクトの名前を入力して Next ボタンをクリックします。

Mavenの設定に必要なArtifact IDやGroup IDを設定します。今回はArtifact IDにパッケージ名(自分のドメイン名)を、Group IDにプロジェクト名を設定しました。
Createボタンをクリックするとプロジェクトが作られます。

ここまでできれば今までのEclipseと同じように操作できます。


Workspaceをローカルディスクに保存する方法

画面左上のWorkspaceメニューから Download as Zip でローカルディスクにzipファイルとしてダウンロードできます。


使い心地

Eclipse Marsに比べると動作は軽快で画面が見やすくデザインされています。

その一方でEclipse Che 4.0.1では
  • ProjectがWorkspaceに自動で保存されない
  • GitのInitializeができない
  • Workspaceのロードにネットワークの帯域を喰われる
  • ショートカットキーがWebブラウザーにフックされて別のURLに遷移してしまう
  • エクスプローラーからドラッグ・ドロップでProjectにファイルの追加ができない
などのデメリットが目立ちました。
特にネットワークの負荷は深刻で、別窓で起動したWebブラウザーでWebサイトを閲覧したくてもタイムアウトしてしまうほどです。

現時点では実用面はEclipse Marsに及びませんでした。


関連ブログ

[Docker] Eclipse Che をWindowsにインストールする方法
[クラウド] Bluemix にJavaアプリを実装するまで
[クラウド] BluemixのJavaアプリ開発ではまったところと対処方法
[Java] Android StudioやEclipseのお節介な警告を消す方法
Visual Studio Community 2015 をISOファイルからWindows10にインストールする方法

以上、参考に
以上、参考になれば幸いです。

2016年5月7日土曜日

[Docker] Eclipse Che をWindowsにインストールする方法

How to run Eclipse Che on Windows

2016年3月、Webブラウザーで利用できる統合開発ツール Eclipse Che が正式公開されました。
今までのEclipseと違い、仮想OSとアプリケーションをひとまとめにしたイメージ(コンテナ)を実行するDockerというエミュレーターで動作します。
コンテナ化によりEclipse CheはWindowsやMacに限らずクラウドで稼働させても全く同じように利用できとのことです。
実際に使ってみたのでインストールする手順をまとめてみました。


環境

  • Windows 10
    BIOSの仮想化支援機能を有効に設定済み
  • Eclipse Cheは初期設定で8080番のポートを使うので8080番を使うWebサーバー(IIS、apache、nginxなど)は稼働させない


Java1.8 と Docker Toolbox をインストールする

Eclipse Cheの動作に必要なJava1.8とDocker Toolboxをインストールします。

今回は下記サイトからJava SE Development Kit 8をダウンロードしてインストールしました。
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Docker Toolboxは公式サイトからダウンロードしてインストールしました。
Virtual BoxやGit for Windowsなどが含まれていますがそれらも必要なので全てインストールします。
https://www.docker.com/products/docker-toolbox


Eclipse Cheをダウンロードする

Eclipse Cheを公式サイトからダウンロードします。
http://www.eclipse.org/che/download/

今回はZIP Packageをダウンロードして
D:\eclipse-che-4.0.1
に解凍して使います。


環境変数を設定する

JAVA_HOME というJava1.8のインストールパスへの環境変数が必要です。
また、Git for WindowsのインストールパスがPATH環境変数に含まれている必要があるようです。


Eclipse Che を起動する

Dockerはコマンドラインで操作します。
Dockerを起動し、Eclipse Cheを展開したサブフォルダーの
bin\che.bat run
を実行します。

今回は D:\eclipse-che-4.0.1 に展開したので
/d/eclipse-che-4.0.1/bin/che.bat run
と入力します。
blog.fujiu.jp Eclipse Che をWindowsにインストールする方法

時間がかかりますがDockerのコンソール出力が落ち着いたら

Webブラウザーで
http://localhost:8080
を開いてこんな画面が表示されたらインストール成功です。

次回はEclipse Cheを使ってみます。
次回を書きました → [Docker] Eclipse Che でプログラミングする方法 [Java]


関連ブログ

[クラウド] Bluemix にJavaアプリを実装するまで
[Java] Android StudioやEclipseのお節介な警告を消す方法
[Azure] クエリちゃんの動画投稿数をツイートするサービス をGitHubに公開するまで
Visual Studio Community 2015 をISOファイルからWindows10にインストールする方法

以上、参考になれば幸いです。

2016年4月23日土曜日

[クラウド] BluemixのJavaアプリ開発ではまったところと対処方法

The programming pitfalls in Bluemix

コンソールJavaアプリとして開発した
クエリちゃんの動画投稿数をツイートするサービス
をIBMのクラウドサービス・Bluemixで実行してはまったところと対処方法をまとめてみました。

ソースはソースはGitHubにあります。
https://github.com/mtk-f/TweetNicoMovieForQuerychan


環境

  • Eclipse Mars. 2 でMavenプロジェクトとして開発したコンソールJavaアプリ


Bluemixの環境変数ではまった

このアプリはTwitter4jライブラリーを使ってツイッターに文章を投稿します。
投稿するにはツイッター用のAPI KEYを設定する必要があります。
API KEYは非公開パラメーターなのでソースに載せることができません。

Twitter4jライブラリーはAPI KEYをソースに書く以外に環境変数に設定する方法があり、Bluemixはダッシュボードから環境変数を設定できます。
Twitter4jの環境変数はピリオド(ドット)の文字を含むのですが、Bluemixはピリオドを含む変数名を設定すると実行時にエラーになります。
ピリオドを含む環境変数名はBluemixのbashでexportコマンドが失敗します。

例えば環境変数にこんな設定をすると
blog.fujiu.jp [クラウド] BluemixのJavaアプリ開発ではまったところと対処方法

こんなログが出力されます。
/bin/bash: line 20: export: `twitter4j.oauth.consumerKey=1234': not a valid identifier

対策としてピリオドを含まない環境変数を使うように対応しました。


Bluemixのログではまった

標準出力はBluemixのログに出力されるのですが、標準出力した順番とログに出力される順番は一致しないことがあります。
例えば次のJavaアプリを実行すると


Bluemixのログに次のように出力されました。


ログを読むときは時系列順に読み替える工夫が必要です。



関連ブログ

[クラウド] Bluemix にJavaアプリを実装するまで
[Java] Android StudioやEclipseのお節介な警告を消す方法
[Azure] クエリちゃんの動画投稿数をツイートするサービス をGitHubに公開するまで
C#のAzure用Webジョブ開発ではまったところ

以上、参考になれば幸いです。

2016年4月16日土曜日

[クラウド] Bluemix にJavaアプリを実装するまで

How to push java console applications for Bluemix

IBMのクラウドサービス・Bluemixを使って クエリちゃんの動画をランダムにツイート というアプリケーションを稼働させました。
blog.fujiu.jp [クラウド] Bluemix にJavaアプリを実装するまで

ソースはソースはGitHubに投稿してあります。
https://github.com/mtk-f/TweetNicoMovieForQuerychan

このアプリをBluemixで稼働させるまでの手順をまとめました。

環境

  • Windows 10
  • Eclipse Mars 2、Pleiades日本語化プラグイン


コンソールJavaアプリはjarファイルにエクスポートする必要がある

BluemixはEclipseで作ったJava EEアプリケーションをや配備するEclipse用プラグインが公開されていますが、コンソールJavaアプリはEclipseから配備することができませんでした。

今回作ったアプリケーションは、Main()メソッドから処理を開始するコンソールアプリケーションです。
BluemixにコンソールJavaアプリを配備するにはまずjarファイルにエクスポートします。
Eclipseでjarファイルにエクスポートする方法は次の通りです。

プロジェクトのプロパティーを開いてメイン・クラス項目にMainメソッドを持つクラスを設定します。

プロジェクトのエクスポートから 実行可能JARファイル をクリックしてjarファイルの保存場所とファイル名を指定するとエクスポートできます。


Bluemixにjarファイルを配備するにはcfコマンドを使う

Bluemixにjarファイルを配備するには cf.exe というコマンドラインインターフェイスをダウンロードして操作します。
コマンドプロンプトから文字入力による操作が必要なので難易度が高めです。

ダウンロードはこちら。
https://github.com/cloudfoundry/cli/releases

あらかじめWebのダッシュボードからBluemixのエンドポイントを調べておきます。
自分のエンドポイントはシドニーでした。

ここからコマンドプロンプトでcf.exeを使って操作します。

Bluemixのエンドポイントに接続します。
シドニーの場合の例:
cf api https://api.au-syd.bluemix.net

ログインします。
Bluemixにアカウント登録したメールアドレスが必要です。
例:
cf login -u メールアドレス -o メールアドレス -s dev
このあとパスワードを聞かれるので入力します。

jarファイルをアップロードします。
例:
fc push "アプリケーション名" -p "jarファイル名" -no-route

これでコンソールJavaアプリをBluemixに配備することができました。
配備したアプリケーションの開始や終了はcfコマンドからもWebのダッシュボードからも操作できます。


Bluemixを使ってみた感想

Azureに比べるとBluemixの日本人のユーザーは少ない印象ですが、丁寧に日本語翻訳された資料が公開されているので情報量には困りませんでした。
今回はコンソールアプリを試しましたが、Java EEアプリケーションを Websphere Application Server の仮想環境で運用すると威力を発揮しそうです。

なお、Azureには日本人がデザインした「クラウドガール・クラウディア窓辺」というイメージキャラクターがいてことあるごとにノベリティを配布いしていますが、Bluemixにはそのようなキャラクターはいません。


関連ブログ

[Azure] クエリちゃんの動画投稿数をツイートするサービス をGitHubに公開するまで
C#のAzure用Webジョブ開発ではまったところ
[Java] Android StudioやEclipseのお節介な警告を消す方法

以上、参考になれば幸いです。

2015年10月24日土曜日

[Java] Android StudioやEclipseのお節介な警告を消す方法

How to hide warnings on Java
Android StudioやEclipseなどの統合開発環境は一度も使われない変数や呼ばれないメソッド(関数)があると警告してくれます。
ミスを防ぐには強力な機能です。
しかし使わないクラスやメソッドをソースに残したいとき、統合開発環境が鬼の首を取ったような勢いで警告するのはお節介すぎます。



統合開発環境の設定次第では警告を表示しないようにできますが、アノテーションを使って警告を抑止することもできます。
アノテーションで抑止しておけばソースコードを設定の異なる統合開発環境にインポートしても警告を抑止することができます。


環境

・Windows8.1
・JDK 1.7
・Android Studio 1.4
・Eclipse Juno Service Release 2


警告を消す @SuppressWarnings アノテーション

未使用のクラスやメソッドの直前に次の1行を追記します。

@SuppressWarnings("unused")

これでAndroid StudioもEclipseも警告が消えました。


unused以外の警告も抑止できる

全て検証したわけではありませんが@SuppressWarningsは他の警告も抑止できるようです。

@SuppressWarnings("all")
というアノテーションで全ての種類の警告を抑止できます。

他にも次のように警告毎に抑止ができるようです。

@SuppressWarnings("static-access")
型 {1} からの static メソッド {2} には static を参照してください。
を抑止する

@SuppressWarnings("serial")
シリアライズ可能クラス {1} は long 型の static final serialVersionUID フィールドを宣言していません。
を抑止する

@SuppressWarnings("finally")
finally ブロックは正常に完了しません。
を抑止する

@SuppressWarnings("null")
null ポインター・アクセス: 変数 {1} はこのロケーションでは必ず null です。
を抑止する

@SuppressWarnings("deprecation")
{1} は使用すべきではありません。
を抑止する

@SuppressWarnings("unchecked")
型の安全性: メソッド {1} は raw 型 {2} に属しています。 総称型 {3} への参照はパラメーター化される必要があります。
を抑止する

@SuppressWarnings("rawtypes")
{1} は raw 型です。総称型 {2} への参照は、パラメーター化する必要があります。
を抑止する

抑止しすぎると本当に修正が必要な警告まで表示されなくなってしまうので要注意です。


参考にしたサイト

Eclipse警告抑制メモ(Hishidama's Eclipse error/warning Memo)
http://www.ne.jp/asahi/hishidama/home/tech/eclipse/warn.html

SuppressWarnings (Java Platform SE 7 )
http://docs.oracle.com/javase/jp/7/api/java/lang/SuppressWarnings.html


関連ブログ

[Java] Eclipseプラグイン開発のトラブルシューティング
[Java] 文字列がSQL ServerのDateTime型に適合するかチェックする
[Java] SwingのUIを無限ループで更新するには
[Android] Javaのstaticクラス(Handler)から非sataticクラス(Activity)のメソッドを呼び出すには(弱参照)
[Java] thisとは #2
[Blender] obj2opengl.plをJava用に改造する

以上、参考になれば幸いです。