ブログ移転先の同記事へ 0 秒後にジャンプします。
自動的にジャンプしない場合は、こちらをクリック
☓ MyModel userData = Datastore.query(t) .filter("myname", FilterOperator.EQUAL, "hoge").asSingle(); ◯ MyModel userData = Datastore.query(t) .filter( t.myname.equal("hoge")).asSingle();なんでオレ、上の書き方してたんやろ・・・
Cipher Text
https://sites.google.com/site/slim3appengine/slim3-datastore/defining-data-classes/cipher-text
個人情報や機密情報を安全に扱うために暗号化をする必要がある場合があります。Slim3は暗号化機能をサポートしています。暗号化アルゴリズムと対象のフィールド型は次の通りです:
- アルゴリズム: AES (Advanced Encryption Standard)
- 暗号利用モード(Block cipher mode): CBC (Cipher Block Chaining)
- 暗号鍵: 128bit (192 bit と 256bit はサポートしていません)
- フィールド型: java.lang.String, com.google.appengine.api.datastore.Text
Slim3でBigtableのデータを暗号化するのはとても簡単です:
- 対象のフィールドに @Attribute(cipher = true) アノテーションを使用します。
- 暗号鍵をSlim3 Datastoreに設定します。
- Slim3 Datastoreを使用した操作をします。
モデル定義の例です:
@Attribute(cipher=true) private String myString; @Attribute(cipher=true, lob=true) private String myLobString; @Attribute(cipher=true) private Text myText;暗号鍵を設定する例です:
Datastore.setLimitedCipherKey("hogehogehogehoge"); Datastore.setGlobalCipherKey("hogehogehogehoge");setLimitedCipherKeyは、スレッドローカルの暗号鍵を設定します。その鍵は現在のスレッド内の暗号化・復号化で使用されます。
FrontControllerは各コントローラを呼び出した後に暗号鍵をクリアします。このメソッド(setLimitedCipherKey)はコントローラー毎に異なる暗号鍵を使用する場合を想定しています。
setGlobalCipherKeyは暗号鍵をスタティック領域に設定します。その鍵は全てのスレッドで使用されます。FrontControllerはsetGlobalCipherKeyメソッドで設定された暗号鍵はクリアしません。このメソッドはシステム内で固定の暗号鍵を使用する場合を想定しています。
LimitedCipherKeyの方がGlobalCipherKeyよりも優先されます。さらに両方の値が未設定の場合、例外がスローされます。128bit(16文字)の暗号鍵を設定してください。
GlobalCipherKeyの値は appengine-web.xml で指定できます:
<system-properties> <property name="slim3.cipherGlobalKey" value="hogehogehogehoge"/> </system-properties>暗号化と復号化は自動的に行われます。
暗号化フィールドに対して、インメモリのフィルタとソートは全てサポートされています。
暗号化フィールドに対するデータストアクエリのフィルタには制限があります。以下のフィルタがサポートされています:
- EqualCriterion
- IsNotNullCriterion
- NotEqualCriterion
データストアクエリのソートはサポートされていません。
[SLIM3GEN1011] The getter method[get_accountName] is not found.こんな感じ。存在しているgetterは「getAccountName」なので、見つからないといわれるわけです。
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Checktitle>head><body><p>Hello Check !!!p><div><form method="POST" enctype="multipart/form-data" action="/check/tweet"><div><h2 class="tweet_do"><span>POSTテストspan>h2>div><div><textarea name="maindata" rows="2" cols="10" wrap="on" style="width:635px;height:60px;">textarea>div><div><input type="hidden" name="url" value="/check" /><input type="submit" name="createArticle" value="POSTする" class="submit" />div>form>div><hr />key_getattlist_forward<ol><c:forEach var="att" items="${key_getattlist_forward}"><li>${att}li>c:forEach>ol><hr />key_getattlist_include<ol><c:forEach var="inc" items="${key_getattlist_include}"><li>${inc}li>c:forEach>ol><hr />key_getparamlist<ol><c:forEach var="prm" items="${key_getparamlist}"><li>${prm}li>c:forEach>ol><hr /><div>as_key : ${as_key}div><div>as_maindata : ${as_maindata}div><div>as_url : ${as_url}div><hr /><div>att_key : ${att_key}div><div>att_maindata : ${att_maindata}div><div>att_url : ${att_url}div><hr /><div>param_key : ${param_key}div><div>param_maindata : ${param_maindata}div><div>param_url : ${param_url}div><hr />body>html>
package jp.tyato.verify.controller; import org.slim3.controller.Controller; import org.slim3.controller.Navigation; public class CheckController extends Controller { final String KEY_NAME = "key"; @Override public Navigation run() throws Exception { try { requestScope("key_getattlist_forward", request.getAttribute("javax.servlet.forward.query_string")); requestScope("key_getattlist_include", request.getAttribute("javax.servlet.include.query_string")); requestScope("key_getparamlist", request.getParameterValues(KEY_NAME)); requestScope("as_key", asString(KEY_NAME)); requestScope("as_maindata", asString("maindata")); requestScope("as_url", asString("url")); requestScope("att_key", request.getAttribute(KEY_NAME)); requestScope("att_maindata", request.getAttribute("maindata")); requestScope("att_url", request.getAttribute("url")); requestScope("param_key", request.getParameter(KEY_NAME)); requestScope("param_maindeta", request.getParameter("maindata")); requestScope("param_url", request.getParameter("url")); } catch (Throwable e) { e.printStackTrace(); } return forward("Check.jsp"); } }
private String _name;メニューの「ソース」→「getter および setter の生成」で上記のフィールドのゲッターセッターを生成すると以下のソースになる。
public String get_name() { return _name; } public void set_name(String _name) { this._name = _name; }
これをgetNameやsetNameにしたい場合、
メニューの「ウィンドウ」→「設定」→「Java」→「コードスタイル」の「変数命令規則」の欄の「フィールド」を編集し「接頭語リスト」に「_」(アンダーバー)を入れて適用してからセッター、ゲッターを生成する。
public String getName() { return _name; } public void setName(String name) { _name = name; }
public class AaaController extends Controller { }か、
public class AaaController extends Controller { //これが必ず存在するようにする! public AaaController() { } public AaaController( type arg) { } }でないとダメと
というようにマッピングルールに基づいて、実行するコントローラが決まります。※slim3.rootpackage は web.xml で定義されています。
リクエストURLパス コントローラ / slim3.rootpackage.controller.IndexController /xxx slim3.rootpackage.controller.XxxController /xxx/ slim3.rootpackage.controller.xxx.IndexController /xxx/yyy slim3.rootpackage.controller.xxx.YyyController /xxx/yyy/zzz slim3.rootpackage.controller.xxx.yyy.ZzzController
コントローラを取得する前にリクエストURLパスの書き換えをすることもできます。
URLリライティングを使うには slim3.rootpackage.controller.AppRouter クラスを先に定義する必要があります。
package jp.tyato.test.controller; import org.slim3.controller.router.RouterImpl; public class AppRouter extends RouterImpl { Public AppRouter() { addRouting("/xxx/{key}", "/xxx?key={key}"); } }
final String KEY_NAME = "key"; @Override public Navigation run() throws Exception { Navigation result = null; try { String keyword = asString(KEY_NAME); if(keyword == null) { //getParameterで再度試行 keyword = request.getParameter(KEY_NAME); } if( keyword != null ) { keyword = keyword.toLowerCase(); } //Factoryパターン用コントローラ親クラスの定義 Controller con = this.GetFromFactory(keyword); result = con.runBare(); } catch (Throwable e) { e.printStackTrace(); } return result; } public Controller GetFromFactory(String keyword) { Controller con = null; try { if (keyword == null || keyword.isEmpty() || keyword.startsWith("index") ) { //keywordがnull、空文字、indexで始まる文字のいずれかである場合、Index表示処理 con = new ForDefaultController(); } else if (keyword.equals("yyy")) { //keyが「yyy」である場合、yyy用の処理へ con = new YyyController(); } else if (keyword.equals("zzz")) { //keyが「zzz」である場合、zzz用の処理へ con = new ZzzController(); } } catch (Exception e) { e.printStackTrace(); } return con; }後は実際に処理を行うControllerクラスを実装します。
package jp.tyato.test.controller.xxx; import org.slim3.controller.Controller; import org.slim3.controller.Navigation; import org.slim3.util.RequestLocator; import org.slim3.util.ResponseLocator; import org.slim3.util.ServletContextLocator; public class YyyController extends Controller { @Override public Navigation run() throws Exception { this.CheckParentMember(); //以降、実処理 } protected void CheckParentMember() { if( request == null ) { request = RequestLocator.get(); } if( response == null ) { response = ResponseLocator.get(); } if( servletContext == null ) { servletContext = ServletContextLocator.get(); } } }「ForDefaultController」「ZzzController」についても同様に定義してやります。
「容量が大きくなるほど、カットする周波数帯域?が下がる=低域が出る」
「一般論として、容量が大きくなると高域の特性が悪くなりやすい」
「一発目の充填に(余分に)時間がかかる分、ポップノイズにつながりやすい?」
ただ、濫用を防ぐ目的で、soft limitなるものが設定されている。Soft limitを越えると、こんな感じで警告っぽい表示が出る。ただ、だからといって、特に何かが起こるわけではない。
-javaagent:../../../dropins/MergeDoc/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
-Xmx512m
-startup
../../../plugins/org.eclipse.equinox.launcher_1.1.1.R36x_v20101122_1400.jar
--launcher.library
../../../plugins/org.eclipse.equinox.launcher.cocoa.macosx.x86_64_1.1.2.R36x_v20101019_1345
-product
org.eclipse.epp.package.java.product
--launcher.defaultAction
openFile
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.5
-XstartOnFirstThread
-Dorg.eclipse.swt.internal.carbon.smallFonts
-XX:MaxPermSize=256m
-Xms40m
-Xmx512m
-Xdock:icon=../Resources/Eclipse.icns
-XstartOnFirstThread
-Dorg.eclipse.swt.internal.carbon.smallFonts
-javaagent:../../../dropins/MergeDoc/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
https://dl-ssl.google.com/android/eclipse/