Google App Engine (GAE) にJava Server Pages (JSP)ファイル込みのコードをデプロイ(アップロード)しようとすると、エラーが出て失敗するためその対処法メモ。
2018/02/23
2018/01/29
[Java] Google App Engine で管理者用ページを作る
Google App Engine でデータ登録などに使用する管理者用ページを作る
url-patternで管理者アカウントが必要なページを指定。
この場合は /admin/ 以下のページ全てが対象
role-nameを*にするとGoogleアカウントを持っている人すべてがログインできる。
projectを作成したオーナーはApp Engineの管理者権限がデフォルトで割り当てられているので追加の設定は無し

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


管理者アカウントだとhtml、jspページが表示される。
許可のないアカウントだと 403 Forbidden 「Error: Forbidden」が表示される
環境
- 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 64bitCPU: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 Conjecture | Collatz Sieve 1.21 (opencl_amd_gpu) | 97 | 594+222 |
Einstein@home | Gamma-ray pulsar binary search #1 on GPUs 1.18 (FGRPopenclK1_ati) | 63 | 2216+314 |
Enigma@home | Enigma GPU 1.11 (opencl_ati_101) | 96 | 801+220 |
MilkyWay@home | MilkyWay@Home 1.46 (opencl_ati_101) | 74 | 717+319 |
Moo ! Wrapper | Distributed.net Client 1.04 (open_ati_101) | 88 | 384+150 |
PrimeGrid | AP27 Search v2.02 (opencl_ati_AP27) | 97 | 1723+215 |
PrimeGrid | PPS (Siece) 1.41 (openclatiPPSsiece) | 50 | 1470+305 |
SETI@home | SETI@home v8 8.22 (opencl_ati5_SoG_nocal) | 80 | 755+260 |
Intel HD Graphics 530の場合
プロジェクト名 | タスク、アプリケーション名 | GPU Load (%) | Memory Usage (MB) |
---|---|---|---|
SETI@home | SETI@hime v8 8.20 | 95 | 266 |
SETI@home Beta | SETI@hime v8 8.20 (opencl_intel_gpu_sah) | 94 | 263 |
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を入れていると実行時に例外が発生する
入れていたライブラリとバージョン
調べてみると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
発生した例外
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* までのエンティティの一覧を返す。
SELECT * WHERE __key__>=KEY(kind_name, "20180101") AND __key__<KEY(kind_name, "20180201")
「__key__」は検索対象をキーに限定するワード。
Kind(種類)の文字が「kind_name」の場合、
キーが 20180101* から 20180201* までのエンティティの一覧を返す。
2017/10/14
StatusRuntimeException UNAVAILABLE の例外対処
Google Cloud Platform の Cloud Pub/Sub をJavaで動かそうとしたら、例外が出て動かなかった。以下にその対処法を書きます
使用したライブラリ
Google Cloud Java Client for Pub/Sub
https://github.com/GoogleCloudPlatform/google-cloud-java/tree/master/google-cloud-pubsub
開発環境
Windows 7 64bit
eclipse 4.6.1
com.google.cloud google-cloud-pubsub 0.25.0-beta
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
実行環境
CentOS 7
OpenJDK Runtime Environment (build 1.8.0_65-b17)
OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)
CentOS 7のOpenJDK環境でのみエラーが発生する。
yum update java を実行してOpenJDKをアップデート
アップデート後のopenJDK
OpenJDK Runtime Environment (build 1.8.0_144-b01)
OpenJDK 64-Bit Server VM (build 25.144-b01, mixed mode)
OpenJDKをアップデートしたところ、エラーが出なくなった。
使用したライブラリ
Google Cloud Java Client for Pub/Sub
https://github.com/GoogleCloudPlatform/google-cloud-java/tree/master/google-cloud-pubsub
発生した例外
Exception in thread "main" java.util.concurrent.ExecutionException: io.grpc.StatusRuntimeException: UNAVAILABLE at com.google.common.util.concurrent.AbstractFuture.getDoneValue(AbstractFuture.java:500) at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:479) at com.google.common.util.concurrent.AbstractFuture$TrustedFuture.get(AbstractFuture.java:76) at com.google.common.util.concurrent.ForwardingFuture.get(ForwardingFuture.java:62) at rkserver.BoincBigDataMain.publishMessages(BoincBigDataMain.java:51) at rkserver.BoincBigDataMain.main(BoincBigDataMain.java:77) Caused by: io.grpc.StatusRuntimeException: UNAVAILABLE at io.grpc.Status.asRuntimeException(Status.java:526) at io.grpc.stub.ClientCalls$UnaryStreamToFuture.onClose(ClientCalls.java:433) at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:422) at io.grpc.internal.ClientCallImpl.access$300(ClientCallImpl.java:61) at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.close(ClientCallImpl.java:504) at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.access$600(ClientCallImpl.java:425) at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:536) at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:102) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: javax.net.ssl.SSLHandshakeException: General OpenSslEngine problem at io.netty.handler.ssl.ReferenceCountedOpenSslContext$AbstractCertificateVerifier.verify(ReferenceCountedOpenSslContext.java:647) at io.netty.internal.tcnative.SSL.readFromSSL(Native Method) at io.netty.handler.ssl.ReferenceCountedOpenSslEngine.readPlaintextData(ReferenceCountedOpenSslEngine.java:481) at io.netty.handler.ssl.ReferenceCountedOpenSslEngine.unwrap(ReferenceCountedOpenSslEngine.java:1019) at io.netty.handler.ssl.ReferenceCountedOpenSslEngine.unwrap(ReferenceCountedOpenSslEngine.java:1126) at io.netty.handler.ssl.SslHandler$SslEngineType$1.unwrap(SslHandler.java:210) at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1215) at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1127) at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1162) at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:489) at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:428) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:265) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1342) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:934) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:134) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459) at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858) at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138) ... 1 more Caused by: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: algorithm constraints check failed at sun.security.validator.PKIXValidator.doValidate(PKIXValidator.java:352) at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:249) at sun.security.validator.Validator.validate(Validator.java:260) at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324) at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:281) at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:136) at io.netty.handler.ssl.ReferenceCountedOpenSslClientContext$ExtendedTrustManagerVerifyCallback.verify(ReferenceCountedOpenSslClientContext.java:221) at io.netty.handler.ssl.ReferenceCountedOpenSslContext$AbstractCertificateVerifier.verify(ReferenceCountedOpenSslContext.java:643) ... 26 more Caused by: java.security.cert.CertPathValidatorException: algorithm constraints check failed at sun.security.provider.certpath.PKIXMasterCertPathValidator.validate(PKIXMasterCertPathValidator.java:135) at sun.security.provider.certpath.PKIXCertPathValidator.validate(PKIXCertPathValidator.java:219) at sun.security.provider.certpath.PKIXCertPathValidator.validate(PKIXCertPathValidator.java:140) at sun.security.provider.certpath.PKIXCertPathValidator.engineValidate(PKIXCertPathValidator.java:79) at java.security.cert.CertPathValidator.validate(CertPathValidator.java:292) at sun.security.validator.PKIXValidator.doValidate(PKIXValidator.java:347) ... 33 more
環境
開発環境と実行環境は別です開発環境
Windows 7 64bit
eclipse 4.6.1
com.google.cloud google-cloud-pubsub 0.25.0-beta
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
実行環境
CentOS 7
OpenJDK Runtime Environment (build 1.8.0_65-b17)
OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)
原因と対処法
実はWindowsのJava(TM) SE Runtime Environment環境だと問題なく動く。CentOS 7のOpenJDK環境でのみエラーが発生する。
yum update java を実行してOpenJDKをアップデート
アップデート後のopenJDK
OpenJDK Runtime Environment (build 1.8.0_144-b01)
OpenJDK 64-Bit Server VM (build 25.144-b01, mixed mode)
OpenJDKをアップデートしたところ、エラーが出なくなった。
結論
ソフトウェアは最新の状態にしましょう2017/04/11
centos7にBOINCをインストール【更新:2017年4月】
yumを使ってBOINCをインストールできるようになっていたのでその方法をまとめました。
boinc-clientをインストール
ユーザboinc_userにログイン
作業用ディレクトリ(BOINC Data directory)を作成
BOINCをデーモンかつ、作業用ディレクトリを指定して起動(ユーザ boinc_user で起動)
「--allow_remote_gui_rpc」はboinccmdからの制御やBOINC Manager からのリモートアクセスを有効化するために必要
初期設定を行えばBOINC Managerから同じ操作でプロジェクトを追加できるため楽
登録済みの場合
新規登録
rootや管理者のアカウントにログインし以下のディレクトリに移動
viを使ってboinc.serviceを作成して開く
以下のテキストを書き込む
設定ファイルを読み込み認識できているか確認
boinc-client.serviceはBOINCインストール時に自動作成された設定ファイル。設定ファイルの場所は「/usr/lib/systemd/system/boinc-client.service」
BOINCを起動
「top」コマンドなどでboincプロセスが起動、停止をしているかを確認
確認できたらboinc.serviceの有効化を行う
BOINC client のインストール
boinc-clientをインストールできるか確認$ yum search boinc
.
.
.
============= N/S matched: boinc =============
boinc-client.x86_64 : The BOINC client core
boinc-client-devel.x86_64 : Development files for boinc-client
boinc-client-doc.noarch : Documentation files for boinc-client
boinc-client-static.x86_64 : Static libraries for boinc-client
boinc-manager.x86_64 : GUI to control and monitor boinc-client
Name and summary matches only, use "search all" for everything.
boinc-clientをインストール
sudo yum install boinc-client
環境設定
BOINC用ユーザーを作成sudo useradd boinc_user -m
sudo passwd boinc_user
(パスワードを2回入力)
ユーザboinc_userにログイン
su - boinc_user
作業用ディレクトリ(BOINC Data directory)を作成
mkdir /home/boinc_user/boinc_work
BOINCをデーモンかつ、作業用ディレクトリを指定して起動(ユーザ boinc_user で起動)
「--allow_remote_gui_rpc」はboinccmdからの制御やBOINC Manager からのリモートアクセスを有効化するために必要
boinc --daemon --dir /home/boinc_user/boinc_work --allow_remote_gui_rpc
プロジェクトの追加
2通り記述するので好きな方を選択してくださいBOINC Manager からのリモートアクセス登録
windowsマシンのBOINC Managerからリモート設定初期設定を行えばBOINC Managerから同じ操作でプロジェクトを追加できるため楽
リモートアクセス パスワード
boinc_workにあるgui_rpc_auth.cfgのパスワードを調べる。リモートPCからのアクセスでこのパスワードが必要になる。cat /home/boinc_user/boinc_work/gui_rpc_auth.cfg
ポート開放
TCP/31416 のポートを開放sudo firewall-cmd --permanent --add-port=31416/tcp
sudo firewall-cmd --reload
コマンドラインからの登録
アカウントキーの入手
プロジェクトの登録にはアカウントキーが必要になるため、以下のコマンドを入力してアカウントキーを入手登録済みの場合
boinccmd --passwd (gui_rpc_auth.cfgパスワード) --lookup_account (プロジェクトURL) (メールアドレス) (パスワード)
$ boinccmd --passwd (gui_rpc_auth.cfgパスワード) --lookup_account (プロジェクトURL) (メールアドレス) (パスワード)
status: Success
poll status: operation in progress
poll status: operation in progress
.
.
.
poll status: operation in progress
account key: (***アカウントキー***)
新規登録
boinccmd --passwd (gui_rpc_auth.cfgパスワード) --create_account (プロジェクトURL) (メールアドレス) (パスワード)
$ boinccmd --passwd (gui_rpc_auth.cfgパスワード) --create_account (プロジェクトURL) (メールアドレス) (パスワード)
status: Success
poll status: operation in progress
poll status: operation in progress
.
.
.
poll status: operation in progress
account key: (***アカウントキー***)
プロジェクト登録
boinccmd --passwd (gui_rpc_auth.cfgパスワード) --project_attach (プロジェクトURL) (***アカウントキー***)
BOINC clientの終了
boinccmd --passwd (gui_rpc_auth.cfgのパスワード) --quit
centos起動時にBOINCを起動させる
systemdを使う。rootや管理者のアカウントにログインし以下のディレクトリに移動
cd /etc/systemd/system/
viを使ってboinc.serviceを作成して開く
sudo vi boinc.service
以下のテキストを書き込む
[Unit]
Description=BOINC
[Service]
User=boinc_user
ExecStart=/usr/bin/boinc --dir /home/boinc_user/boinc_work --allow_remote_gui_rpc
ExecStop=/usr/bin/boinccmd --passwd (gui_rpc_auth.cfgのパスワード) --quit
Restart=always
RestartSec=30
[Install]
WantedBy=multi-user.target
設定ファイルを読み込み認識できているか確認
sudo systemctl daemon-reload
sudo systemctl list-unit-files | grep boinc
boinc-client.service disabled
boinc.service disabled
boinc-client.serviceはBOINCインストール時に自動作成された設定ファイル。設定ファイルの場所は「/usr/lib/systemd/system/boinc-client.service」
BOINCを起動
sudo systemctl start boinc.service
BOINCを停止sudo systemctl stop boinc.service
「top」コマンドなどでboincプロセスが起動、停止をしているかを確認
確認できたらboinc.serviceの有効化を行う
sudo systemctl start boinc.service
登録:
投稿 (Atom)