2018/08/30

[Java] Google App Engine で自作のJarライブラリを読み込ませる

はじめに

eclipseで自作jarライブラリをビルドパスに登録すると問題なくコンパイルされる。
ただGAEにデプロイすると「NoClassDefFoundError」と自作jarのクラスが見つからないという例外が発生する。

その対処法を調べたのでここにまとめる。
※他にもっと効率のいい方法があると思います。

手順

  1. 自作jarファイルをGAEにデプロイするプロジェクトのフォルダの「(GAEプロジェクト)/src/main/webapp/WEB-INF/lib/」フォルダへコピー
  2. eclipseを起動し、下記のように自作jarまで開く
  3. jarを右クリック -> ビルド・パス -> ビルド・パスに追加 をクリック
  4. これでGAEへデプロイしても問題なく動作するはず







[Java] Google App Engine で「No handlers matched this URL.」が出る

開発中突然、GAEにデプロイしたアプリが @webservlet で指定したURLを認識せず、404 not found を返すようになったので、その対処法メモ。

状況

  • デプロイ時にはエラーなどは出ない
  • htmlなどの静的ファイルにはアクセスできる
  • @webservlet で指定したURLにアクセスしても「404 not found」が返り。
  • Google Stackdriver Loggingのアクセスログを見ても「No handlers matched this URL.」のみでJavaのエラーが出ているわけではない。
    • 挙動的には@webservlet で指定したURLを読み取っていないイメージ
  • 別のプロジェクトを用意し、GAEにデプロイすると問題なく動作する。
    • eclipseのプロジェクトの設定が原因?

対処法

問題が出るプロジェクトのフォルダを見ると、「src」「target」「.setting (隠しフォルダ)」の他に正常なプロジェクトには存在しない「bin」というフォルダがあった。

binフォルダを別の場所に移動したところ、上記の問題が発生しなくなった。

binフォルダが悪さをしていたのが原因

以上




2018/02/23

[Java 8] JSPファイルをGoogle App Engineにデプロイできない

Google App Engine (GAE) にJava Server Pages (JSP)ファイル込みのコードをデプロイ(アップロード)しようとすると、エラーが出て失敗するためその対処法メモ。

表示されるエラー

Deploying to App Engine に問題が発生しました。
Process exited with error code 1


エラーログ

At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.

2018/01/29

[Java] Google App Engine で管理者用ページを作る

Google App Engine でデータ登録などに使用する管理者用ページを作る

環境

  • Google App Engine Standard
  • Cloud Tools for Eclipse
  • Java 8

web.xmlの設定

webapp/WEB-INF/web.xml に以下の項目を追記する
<security-constraint>
  <web-resource-collection>
    <web-resource-name>admin</web-resource-name>
    <url-pattern>/admin/*</url-pattern>
  </web-resource-collection>
  <auth-constraint>
    <role-name>admin</role-name>
  </auth-constraint>
</security-constraint>

url-patternで管理者アカウントが必要なページを指定。
この場合は /admin/ 以下のページ全てが対象

role-nameを*にするとGoogleアカウントを持っている人すべてがログインできる。

管理者の設定

管理者の設定はGoogle Cloud Console の「IAMと管理 -> IAM」から設定

projectを作成したオーナーはApp Engineの管理者権限がデフォルトで割り当てられているので追加の設定は無し


別のアカウントログインできるようにするには「追加」から以下の図のように「App Engine -> App Engine 管理者」で別アカウントのGmailのアドレスを入力して権限を与えること


アクセス

App Engine にデプロイしてから対応するページにアクセスすると以下の図のようなログイン画面が表示される


管理者アカウントだとhtml、jspページが表示される。

許可のないアカウントだと 403 Forbidden 「Error: Forbidden」が表示される

参考

web.xml による認証の設定、管理者の指定 - Google App Engine 入門

2018/01/25

[BOINC] GPUプロジェクトのGPU使用率とメモリ使用率

はじめに

BOINCでは数値計算にグラフィックボード(GPU)を使用できる。
ただ、プロジェクトによってはGPUの使用率が低かったり、GPUメモリの使用量が多く処理が遅くなることがあるため、各プロジェクトの大雑把なGPU使用率、メモリ使用量をまとめてみた。

BOINCでグラフィックボードを買うときの参考にどうぞ。

TechPowerUp GPU-Z

GPU使用率、メモリ使用量の測定にはTechPowerUp GPU-Zというソフトを使用。



環境

Windows 7 64bit
CPU:Intel Core i7 6700K + Intel HD Graphics 530
Memory:16 GB DDR4
GPU:Radeon RX 480 (4GB)

Radeon RX 480 (4GB)の場合

プロジェクト名タスク、アプリケーション名GPU Load (%)Memory Usage(Dedicated + Dynamic) (MB)
Collatz ConjectureCollatz Sieve 1.21 (opencl_amd_gpu)97594+222
Einstein@homeGamma-ray pulsar binary search #1 on GPUs 1.18 (FGRPopenclK1_ati)632216+314
Enigma@homeEnigma GPU 1.11 (opencl_ati_101)96801+220
MilkyWay@homeMilkyWay@Home 1.46 (opencl_ati_101)74717+319
Moo ! WrapperDistributed.net Client 1.04 (open_ati_101)88384+150
PrimeGridAP27 Search v2.02 (opencl_ati_AP27)971723+215
PrimeGridPPS (Siece) 1.41 (openclatiPPSsiece)501470+305
SETI@homeSETI@home v8 8.22 (opencl_ati5_SoG_nocal)80755+260

Intel HD Graphics 530の場合

プロジェクト名タスク、アプリケーション名GPU Load (%)Memory Usage (MB)
SETI@homeSETI@hime v8 8.2095266
SETI@home BetaSETI@hime v8 8.20 (opencl_intel_gpu_sah)94263

2018/01/21

[Java] Google Cloud ライブラリで例外 NoSuchMethodError が発生する問題

Google Cloud StorageのJavaライブラリを使用した時に、以下の例外が発生した際の対処法メモ

発生した例外
Caused by: java.lang.NoSuchMethodError: com.google.api.gax.core.GaxProperties.getLibraryVersion(Ljava/lang/Class;)Ljava/lang/String

MavenでCloud StorageとCloud Loggingを入れていると実行時に例外が発生する

入れていたライブラリとバージョン
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-storage</artifactId>
<version>1.15.0</version>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-logging</artifactId>
<version>1.15.0</version>

調べてみるとStorageとLoggingで使用しているgaxというライブラリのバージョンが異なっており、それが原因でエラーが発生したようだ。

仮対処として使用していないLoggingのライブラリを削除した所、例外は発生しなくなった。


参考
java.lang.ClassNotFoundException: com.google.api.gax.rpc.ClientSettings when using Firestore
https://github.com/GoogleCloudPlatform/google-cloud-java/issues/2496

2018/01/09

Google Cloud Datastore の GQL Query で Entity Key の範囲検索

以下の通り

SELECT * WHERE __key__>=KEY(kind_name, "20180101") AND  __key__<KEY(kind_name, "20180201")

「__key__」は検索対象をキーに限定するワード。

Kind(種類)の文字が「kind_name」の場合、
キーが 20180101* から 20180201* までのエンティティの一覧を返す。