SlideShare uma empresa Scribd logo
1 de 11
Baixar para ler offline
2012-08/メディアクリエイティブDiv/WEB開発を加
速させる。アジャイル開発に最適なデータ構造とORマ
ッパの形(渡辺雄作)
概要
本稿では、JavaオブジェクトをJsonにシリアライズし永続化するフレームワークを実装しました。
本フレームワークでは、任意のJavaフィールドに@IndexedをつけることによりいわゆるPrimaryKeyだけではないフィールドでの検索を可
能にしています。
現在開発中のプロジェクトでは本フレームワークを利用して開発を進めており、グループの基盤データベース構築プロジェクトでの採用を
進めています。
WEBで提供するほとんどのサービスは本フレームワークを利用することにより非常に高い効率で開発できると考えています。
現在はデータストアとしてMySQL, MongoDB, HBaseに対応しています。

序論
BtoCで提供される多くのWEBサービスで求められているのは
サービスの開発速度
スケーラビリティ
高パフォーマンス
だと思います。
その中でアメーバピグで利用されているIndexPersister
FrameworkはKeyValueの形でデータをバイナリでストアするAPIを提供しており、ストアするデータベースの形は問わないアプローチを
採用しています。
実際アメーバピグでは現在の規模でもその形でサービスを提供し続けており、シンプルな(必要最低限な)データ永続化APIがあればサー
ビスを開発できることがわかります。

IndexPersisterは完全にkeyValueとしてデータアクセスしていますが、今回開発したJsonPersisterでは任意のJavaフィールドに@Indexed
をつけることによりいわゆるPrimaryKeyだけではないフィールドでの検索を可能にしています。
この形はFriendFeedで採用されていたり、最近ではサイボウズが提供しているクラウド型データベースKintoneでも同じアプローチをとっ
ているようです。
※サイボウズKintoneに関してはDevelopers Summitで発表がありましたが、発表資料が都合により削除されてしまっているようです。

現在開発中のプロジェクトではこのフレームワークを利用して開発を進めており、グループの基盤データベース構築プロジェクトでの採用
を進めています。
※現在のグループではJsonPersisterHBaseの採用を進めています。
WEBで提供するほとんどのサービスはこのフレームワークを利用することにより非常に高い効率で開発できると考えています。

目次
概要
序論
目次
内容
JsonPersisterの特徴
モジュール構成
json_persister_core
json_persister_mysql
json_persister_mongo
json_persister_hbase
シリアライズの流れ
主要なインターフェース
JsonPersister.save
JsonPersister.delete
JsonPersister.load
JsonPersister.list
JsonPersister.createTable
JsonPersister.dropTable
高度な使い方
複合インデックス
暗号化
キャッシュ
各モジュールについて
json_persister_mysql
データ保存形式
QuickStart
DIコンテナを利用しない場合
springでの利用
json_persister_mongo
json_persister_hbase
FAQ
このフレームワークを使うメリット・デメリットは?
トランザクション使えないんですか?
MySQL実装を使うメリットはなんですか?
まとめ
参考文献

内容
JsonPersisterの特徴
javaオブジェクトをjsonデータとして永続化するフレームワークです。
javaオブジェクトを直接save、loadするシンプルなAPIを提供し、データストア依存のプログラミングを減らすことにより超高速
にDB連携アプリケーションが開発できます。
特定のフレームワーク(springやseasarなど)に依存せずに利用できます。
データストアに依存せずに共通のインターフェースを通じてjavaオブジェクトをシリアライズすることを目指しています。
現在はMysql, MongoDB, HBaseに対応しています

モジュール構成
json_persister_core
コアロジックを定義しています

json_persister_mysql
mysql実装です

json_persister_mongo
mongo実装です

json_persister_hbase
hbase実装です

シリアライズの流れ
下記POJOを例に挙げる
--------------------------------------------------------------------------------------
UserData.java
@DataBaseId(id = 1)
@Persistable(name = "user_data")
public class UserData {
@PrimaryKey
private String userName;
@PrimaryKey
private String age;
@Indexed
private Date date;
private String address;
private Family family;
@CompositeIndexed(name={"userName", "age", "address"})
public void composite_index0() {}

public static class Family {
private List<String> familyNames;
public List<String> getFamilyNames() {
return familyNames;
}
public void setFamilyNames(List<String> familyNames) {
this.familyNames = familyNames;
}
}

public Family getFamily() {
return family;
}
public void setFamily(Family family) {
this.family = family;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}

上記のPOJOをjson_persister.save()すると以下のJavaオブジェクトが下記のようなjsonに変換される

{
"address": "setagaya",
"age": "33",
"date": 1341914556082,
"family": {
"familyNames": [
"masami",
"akari",
"sakutarou"
]
},
"userName": "yuhsaku"
}

主要なインターフェース
JsonPersister.save
javaオブジェクトを保存します

Sample.java
UserData userDataQuery = new UserData();
userDataQuery.setUserName("yuhsaku"); //@PrimaryKey(必須)
userDataQuery.setAge(32);
//@PrimaryKey(必須)
userDataQuery.setDate(new Date()); //@Indexedは(必須)
userDataQuery.setAddress("setagaya");
jsonPersister.save(userDataQuery);

JsonPersister.delete
@PrimaryKey指定で一意なjavaオブジェクトを物理削除します

Sample.java
UserData userDataQuery = new UserData();
userDataQuery.setUserName("yuhsaku"); //@PrimaryKey(必須)
userDataQuery.setAge(32);
//@PrimaryKey(必須)
jsonPersister.delete(userDataQuery);

JsonPersister.load
@PrimaryKey指定で一意なjavaオブジェクトを取得します
Sample.java
UserData userDataQuery = new UserData();
userDataQuery.setUserName("yuhsaku");
userDataQuery.setAge(32);
//第三引数は取得するデータの最新性を担保するかどうかです。(falseを指定するとmysqlの場合はslaveからデ
ータを取得します。masterから取得したい場合はtrueを渡してください)
UserData result_yuhsaku = jsonPersister.load(userDataQuery, UserData.class, false);

JsonPersister.list
javaオブジェクトを指定した条件でリスト取得します

Sample.java
//32才のUserDataオブジェクトをリスト取得します(5番目から10件をuserNameで降順で取得)
UserData userDataQuery = new UserData();
userDataQuery.setAge(32);
Criteria<UserData> criteria =
Criteria.createCriteria(UserData.class).andEquals(userDataQuery).offset(5).limit(10).orderBy("userName",
Criteria.ORDER.DESC);

//第三引数は取得するデータの最新性を担保するかどうかです。(falseを指定するとmysqlの場合はslaveからデ
ータを取得します。masterから取得したい場合はtrueを渡してください)
//Criteriaでlimitの指定がない場合は100件がデフォルトです(nullを明示的に指定すればlimitは指定されませ
ん = 全件取得になります)
List<UserData> resultList = jsonPersister.list(criteria, true);

Criteriaには他にもLesserThanやGreaterThanなどの比較条件のメソッドも用意されています。

JsonPersister.createTable
テーブルを作成します

Sample.java
jsonPersister.createTable(UserData.class);

JsonPersister.dropTable
テーブルをdropします

Sample.java
jsonPersister.dropTable(UserData.class);

高度な使い方
複合インデックス
以下のようなダミーメソッドを作成して@CompositeIndexedを指定するとcreateTable時に複合インデックスが作成されます

@CompositeIndexed(name={"userName", "age", "address"})
public void composite_index0() {}

nameに指定したプロパティ名の順番で複合インデックスが作成されます

暗号化
以下のようにフィールドに@Encryptoアノテーションをつけることによりそのフィールドが暗号化されて永続化されます。(String型のみ
対応しています)

@Encrypto(algorithm="AES", keyLength=256)
private String address;

暗号化を有効化するためにはそのクラスはAbstractEncryptoableを継承する必要があります。
以下サンプル

SecureInfo.java
@DataBaseId(id=0)
@Persistable(name="user_secure_info")
public class SecureInfo extends AbstractEncryptoable{
@PrimaryKey
private String userId;
@Encrypto(algorithm="AES", keyLength=256)
private String mailAddress;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getMailAddress() {
return mailAddress;
}
public void setMailAddress(String mailAddress) {
this.mailAddress = mailAddress;
}
}

保存、取得する際は暗号化キーをsetする必要があります
//保存
SecureInfo secureInfo = new SecureInfo();
secureInfo.setUserId("hogehoge");
secureInfo.setMailAddress("hogehoge@co.jp");
secureInfo.setCryptoSeed("hogehoge_key"); //暗号化、復号化する際のキー文字列
jsonPersister.save(secureInfo);
//取得
SecureInfo secureInfoQuery = new SecureInfo();
secureInfoQuery.setUserId("hogehoge");
secureInfoQuery.setCryptoSeed("hogehoge_key"); //暗号化、復号化する際のキー文字列
SecureInfo result = jsonPersister.load(secureInfoQuery, SecureInfo.class, false);

@EncryptoアノテーションにはDESやAESなどjavaでサポートされているアルゴリズムを文字列で指定できます。
※AES-256はJavaランタイムに無制限強度の管轄ポリシーの設定追加が必要です。
javaのインストールディレクトリ配下のjre/lib/securiy/以下に
http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
からダウンロードしたzipに入っているlocal_policy.jarとUS_export_policy.jarを上書きコピーしてください

キャッシュ
classに@Cacheableを指定するヒープに指定した時間キャッシュすることができます

@Cacheable(expire=5000)
@DataBaseId(id = 1)
@Persistable(name = "user_data")
public class UserData {
以下略

各モジュールについて
json_persister_mysql
データ保存形式
jsonに変換された後以下のテーブルに保存される(テーブルは事前にjson_persister.CreateTableExecuteインターフェースを通じて作成し
ておく必要がある)
-------------------------------------------------------------------------------------CREATE TABLE `user_data` (
`userName_index` text NOT NULL,
`age_index` text NOT NULL,
`date_index` datetime DEFAULT NULL,
`address_index` text,
`data` text NOT NULL,
PRIMARY KEY (`userName_index`(255),`age_index`(255)),
KEY `date_idx` (`date_index`),
KEY `composite_index0_idx` (`userName_index`(255),`age_index`(255),`address_index`(255))
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
--------------------------------------------------------------------------------------

QuickStart
DIコンテナを利用しない場合
ドキュメント整備中

springでの利用
springの設定方法は以下の通り

<bean id="perser" class="jp.co.cyberagent.persister.parser.JaksonPerser" />
<context:component-scan base-package="jp.co.cyberagent.persister" />

<bean id="masterConnectionHolder" class="jp.co.cyberagent.persister.mysql.SingleConnectionHolder" >
<property name="dataSource" ref="masterDataSourceHolder" />
</bean>
<bean id="slaveConnectionHolder" class="jp.co.cyberagent.persister.mysql.SingleConnectionHolder" >
<property name="dataSource" ref="slaveDataSourceHolder" />
</bean>
<bean id="masterDataSourceHolder" class="jp.co.cyberagent.persister.mysql.SingleConnectionHolder" >
<property name="dataSource">
<bean class="org.apache.commons.dbcp.datasources.SharedPoolDataSource">
<property name="connectionPoolDataSource">
<bean class="org.apache.commons.dbcp.cpdsadapter.DriverAdapterCPDS">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/ameba"/>
<property name="user" value="root"/>
<property name="password" value=""/>
</bean>
</property>
<property name="defaultAutoCommit" value="true"/>
<property name="maxActive" value="3"/>
<property name="maxIdle" value="1"/>
<property name="maxWait" value="500"/>
</bean>
</property>
</bean>
<bean id="slaveDataSourceHolder" class="jp.co.cyberagent.persister.mysql.SingleConnectionHolder" >
<property name="dataSource">
<bean class="org.apache.commons.dbcp.datasources.SharedPoolDataSource">
<property name="connectionPoolDataSource">
<bean class="org.apache.commons.dbcp.cpdsadapter.DriverAdapterCPDS">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3316/ameba"/>
<property name="user" value="root"/>
<property name="password" value=""/>
</bean>
</property>
<property name="defaultAutoCommit" value="true"/>
<property name="maxActive" value="3"/>
<property name="maxIdle" value="1"/>
<property name="maxWait" value="500"/>
</bean>
</property>
</bean>

json_persister_mongo
ドキュメント整備中
json_persister_hbase
ドキュメント整備中

FAQ
このフレームワークを使うメリット・デメリットは?
メリット
・シンプルなAPIで学習コストが低い
RDMSを操作するようなO/Rマッパーなどは豊富な機能を提供しているが故に慣れるまでそれなりに時間がかかります。
JsonPersisterはアメーバピグでの開発を踏まえ、必要最低限の機能を提供しているためシンプルなAPIでテンポ良く開発
ができます。
JavaObjectをsaveしたりloadしたり、listで複数取得するだけです。
データストアとのやり取りなんてそれぐらいできれば事が済んでしまうことがほとんどだからです。(実際アメーバピグ
もこれらのAPIだけでmysqlとやりとりしています)
・データストア依存のコードを隠蔽することにより開発速度が(非常に)高くなる
iBatisなどのO/Rマッパーを利用している人がほとんどだと思いますが、ユーザーサービスのアプリケーションにおいては
、複雑なSQLをonlineで発行することはほとんどないと思います。
データストアを意識したコード(SQLやデータバインドなど)を無くし、余計な手間を減らせるため非常に高い開発効率
を実現できます。
・データストアに依存しない共通のInterFaceでデータを扱う
データモデルによってはRDMSに向いているデータとNoSQLに向いているデータがあると思いますが、システム拡張によ
るデータストア切り替えや、データモデルによってはストア先を変更するなどの処理をアプリケーションレイヤからは意
識せずデータをストアすることができます
つまり、DIコンテナを使っていればデータストアを変更した場合(例えばmysql→mongodbとか)でもアプリケーション
側のコードの変更は一切必要ありません。(DIを使っていない場合はFactory依存のクラスを変更するだけで済みます)
デメリット
ユーザーサービスでの利用に特化しているためトランザクションやjoinなどのいわゆるRDMS的な豊富な機能はありません
。
それらの機能とトレードオフとしてシンプルなAPIを提供しています。

トランザクション使えないんですか?
トランザクションはDBのスケーラビリティを損なうのであえて外してあります。
RDMSで提供しているトランザクションを使うと垂直、水平分散を行う際に妨げになるため切り離して考えています。(スキーマをまたが
ったトランザクションを取得できないとかあるので)
代わりにグローバルロック機構をhazelcastを使って実現するというのはいかがでしょうか?
http://www.hazelcast.com/index.jsp
hazelcastではネットワークを介したクラスタ上でのグローバルロックを実現することも可能です。
http://www.hazelcast.com/docs/2.0/manual/single_html/#Lock
Sample.java
Lock lock = Hazelcast.getLock(myLockedObject);
lock.lock();
try {
// データ1をsave
// データ2をsave
} finally {
lock.unlock();
}

みたいな。
残念ながらhazelcastを使ってもロールバックはできませんが、mysqlのバックアップやバイナリログからの復旧ができるので障害時などは
運用でカバーできる範囲かと思っています。
トレードオフですが、個人的にはここらへんの機能を削ってでも得られる開発スピードのメリットを推しています。

MySQL実装を使うメリットはなんですか?
MySQLはamebaでも非常に実績のあるRDBMSです。
それをデータストアに使うことによって、安定性や運用ノウハウをそのまま利用することができます。
O/Rマッパー経由でMySQLを使うことはできますが、テーブル正規化や仕様変更によるテーブル構成変更はamebaの多くのWEBサービス
において運用ボトルネックになりやすいので
スキーマレスにデータを保存できるという点でjsonPersisterは優れています。

まとめ
現在進めているプロジェクトでの開発で実際に利用していますが、MyBatisなどを利用する場合に比べて非常に柔軟な開発が可能です。
PrimaryKeyだけは最初に決めておく必要がありますが、それ以外のデータは開発途中での要件変更やデータ構造の変更が容易だからです
。
Scrumなどアジャイルに開発しているプロジェクトではなおさら高い効率を出せるかと思います。
MyBatisなどのORマッパを使うぐらいならこれを利用するほうが断然がシンプルだと感じました。

参考文献
FriendFeed では MySQL を使いどのようにスキーマレスのデータを保存しているのかhttp://www.hyuki.com/yukiwiki/wiki.cgi?HowFri
endFeedUsesMySqlToStoreSchemaLessData

Mais conteúdo relacionado

Mais procurados

V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...
V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...
V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...junichi anno
 
リソーステンプレート入門
リソーステンプレート入門リソーステンプレート入門
リソーステンプレート入門junichi anno
 
安全なWebアプリケーションの作り方2018
安全なWebアプリケーションの作り方2018安全なWebアプリケーションの作り方2018
安全なWebアプリケーションの作り方2018Hiroshi Tokumaru
 
1/5 ADFS 2.0 を使用してWindows Azure との SSO を実現しよう v1.1
1/5 ADFS 2.0 を使用してWindows Azure との SSO を実現しよう v1.11/5 ADFS 2.0 を使用してWindows Azure との SSO を実現しよう v1.1
1/5 ADFS 2.0 を使用してWindows Azure との SSO を実現しよう v1.1junichi anno
 
Azure ADとIdentity管理
Azure ADとIdentity管理Azure ADとIdentity管理
Azure ADとIdentity管理Naohiro Fujie
 
OAuth2.0によるWeb APIの保護
OAuth2.0によるWeb APIの保護OAuth2.0によるWeb APIの保護
OAuth2.0によるWeb APIの保護Naohiro Fujie
 
MicrosoftのDID/VC実装概要
MicrosoftのDID/VC実装概要MicrosoftのDID/VC実装概要
MicrosoftのDID/VC実装概要Naohiro Fujie
 
文字コードに起因する脆弱性とその対策(増補版)
文字コードに起因する脆弱性とその対策(増補版)文字コードに起因する脆弱性とその対策(増補版)
文字コードに起因する脆弱性とその対策(増補版)Hiroshi Tokumaru
 
はじめてのOracle Cloud Infrastructure(Oracle Cloudウェビナーシリーズ: 2020年9月2日)
はじめてのOracle Cloud Infrastructure(Oracle Cloudウェビナーシリーズ: 2020年9月2日)はじめてのOracle Cloud Infrastructure(Oracle Cloudウェビナーシリーズ: 2020年9月2日)
はじめてのOracle Cloud Infrastructure(Oracle Cloudウェビナーシリーズ: 2020年9月2日)オラクルエンジニア通信
 
エンジニアのための Azure 基礎知識
エンジニアのための Azure 基礎知識エンジニアのための Azure 基礎知識
エンジニアのための Azure 基礎知識Daiyu Hatakeyama
 
セキュアコーディング方法論再構築の試み
セキュアコーディング方法論再構築の試みセキュアコーディング方法論再構築の試み
セキュアコーディング方法論再構築の試みHiroshi Tokumaru
 
Azure AD x LINE x Auth0
Azure AD x LINE x Auth0Azure AD x LINE x Auth0
Azure AD x LINE x Auth0Naohiro Fujie
 
XXE、SSRF、安全でないデシリアライゼーション入門
XXE、SSRF、安全でないデシリアライゼーション入門XXE、SSRF、安全でないデシリアライゼーション入門
XXE、SSRF、安全でないデシリアライゼーション入門Hiroshi Tokumaru
 
Share point における id管理と認証・認可
Share point における id管理と認証・認可Share point における id管理と認証・認可
Share point における id管理と認証・認可Naohiro Fujie
 
Azure active directory によるデバイス管理の種類とトラブルシュート事例について
Azure active directory によるデバイス管理の種類とトラブルシュート事例についてAzure active directory によるデバイス管理の種類とトラブルシュート事例について
Azure active directory によるデバイス管理の種類とトラブルシュート事例についてShinya Yamaguchi
 
ウェブアプリケーションセキュリティ超入門
ウェブアプリケーションセキュリティ超入門ウェブアプリケーションセキュリティ超入門
ウェブアプリケーションセキュリティ超入門Hiroshi Tokumaru
 
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理Yuki Hattori
 
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則Hiroshi Tokumaru
 

Mais procurados (19)

V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...
V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...
V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...
 
リソーステンプレート入門
リソーステンプレート入門リソーステンプレート入門
リソーステンプレート入門
 
安全なWebアプリケーションの作り方2018
安全なWebアプリケーションの作り方2018安全なWebアプリケーションの作り方2018
安全なWebアプリケーションの作り方2018
 
1/5 ADFS 2.0 を使用してWindows Azure との SSO を実現しよう v1.1
1/5 ADFS 2.0 を使用してWindows Azure との SSO を実現しよう v1.11/5 ADFS 2.0 を使用してWindows Azure との SSO を実現しよう v1.1
1/5 ADFS 2.0 を使用してWindows Azure との SSO を実現しよう v1.1
 
Azure ADとIdentity管理
Azure ADとIdentity管理Azure ADとIdentity管理
Azure ADとIdentity管理
 
OAuth2.0によるWeb APIの保護
OAuth2.0によるWeb APIの保護OAuth2.0によるWeb APIの保護
OAuth2.0によるWeb APIの保護
 
OCHaCafe#5 - 避けては通れない!認証・認可
OCHaCafe#5 - 避けては通れない!認証・認可OCHaCafe#5 - 避けては通れない!認証・認可
OCHaCafe#5 - 避けては通れない!認証・認可
 
MicrosoftのDID/VC実装概要
MicrosoftのDID/VC実装概要MicrosoftのDID/VC実装概要
MicrosoftのDID/VC実装概要
 
文字コードに起因する脆弱性とその対策(増補版)
文字コードに起因する脆弱性とその対策(増補版)文字コードに起因する脆弱性とその対策(増補版)
文字コードに起因する脆弱性とその対策(増補版)
 
はじめてのOracle Cloud Infrastructure(Oracle Cloudウェビナーシリーズ: 2020年9月2日)
はじめてのOracle Cloud Infrastructure(Oracle Cloudウェビナーシリーズ: 2020年9月2日)はじめてのOracle Cloud Infrastructure(Oracle Cloudウェビナーシリーズ: 2020年9月2日)
はじめてのOracle Cloud Infrastructure(Oracle Cloudウェビナーシリーズ: 2020年9月2日)
 
エンジニアのための Azure 基礎知識
エンジニアのための Azure 基礎知識エンジニアのための Azure 基礎知識
エンジニアのための Azure 基礎知識
 
セキュアコーディング方法論再構築の試み
セキュアコーディング方法論再構築の試みセキュアコーディング方法論再構築の試み
セキュアコーディング方法論再構築の試み
 
Azure AD x LINE x Auth0
Azure AD x LINE x Auth0Azure AD x LINE x Auth0
Azure AD x LINE x Auth0
 
XXE、SSRF、安全でないデシリアライゼーション入門
XXE、SSRF、安全でないデシリアライゼーション入門XXE、SSRF、安全でないデシリアライゼーション入門
XXE、SSRF、安全でないデシリアライゼーション入門
 
Share point における id管理と認証・認可
Share point における id管理と認証・認可Share point における id管理と認証・認可
Share point における id管理と認証・認可
 
Azure active directory によるデバイス管理の種類とトラブルシュート事例について
Azure active directory によるデバイス管理の種類とトラブルシュート事例についてAzure active directory によるデバイス管理の種類とトラブルシュート事例について
Azure active directory によるデバイス管理の種類とトラブルシュート事例について
 
ウェブアプリケーションセキュリティ超入門
ウェブアプリケーションセキュリティ超入門ウェブアプリケーションセキュリティ超入門
ウェブアプリケーションセキュリティ超入門
 
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
 
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
 

Semelhante a WEB開発を加速させる。アジャイル開発に最適なデータ構造とORマッパの形

Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略takezoe
 
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api   cms どうでしょう - 大阪夏の陣初めての Data api   cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣Yuji Takayama
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSAyumi Goto
 
初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API   CMS どうでしょう - 仙台編 -初めての Data API   CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -Yuji Takayama
 
デバッガでWordPress本体やプラグインの脆弱性を追いかけてみよう
デバッガでWordPress本体やプラグインの脆弱性を追いかけてみようデバッガでWordPress本体やプラグインの脆弱性を追いかけてみよう
デバッガでWordPress本体やプラグインの脆弱性を追いかけてみようHiroshi Tokumaru
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方linzhixing
 
HTML5でオフラインWebアプリケーションを作ろう
HTML5でオフラインWebアプリケーションを作ろうHTML5でオフラインWebアプリケーションを作ろう
HTML5でオフラインWebアプリケーションを作ろうyoshikawa_t
 
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration勉強会force#4 Chatter Integration
勉強会force#4 Chatter IntegrationKazuki Nakajima
 
MailFluteでメール送信を楽しもう!
MailFluteでメール送信を楽しもう!MailFluteでメール送信を楽しもう!
MailFluteでメール送信を楽しもう!p1us2er0
 
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章Insight Technology, Inc.
 
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(後編)
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(後編)【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(後編)
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(後編)日本マイクロソフト株式会社
 
Building React, Flutter and Blazor development and debugging environment with...
Building React, Flutter and Blazor development and debugging environment with...Building React, Flutter and Blazor development and debugging environment with...
Building React, Flutter and Blazor development and debugging environment with...Shotaro Suzuki
 
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Yuji Takayama
 
文字コードの脆弱性はこの3年間でどの程度対策されたか?
文字コードの脆弱性はこの3年間でどの程度対策されたか?文字コードの脆弱性はこの3年間でどの程度対策されたか?
文字コードの脆弱性はこの3年間でどの程度対策されたか?Hiroshi Tokumaru
 
msal.js v2を触る
msal.js v2を触るmsal.js v2を触る
msal.js v2を触るDevTakas
 
Ibm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコードIbm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコードK Kimura
 
GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発Fumihiko Shiroyama
 
今改めて学ぶ Microsoft Azure 基礎知識
今改めて学ぶ Microsoft Azure 基礎知識今改めて学ぶ Microsoft Azure 基礎知識
今改めて学ぶ Microsoft Azure 基礎知識Minoru Naito
 
Treasure data demo.0517
Treasure data demo.0517Treasure data demo.0517
Treasure data demo.0517BigData Sios
 

Semelhante a WEB開発を加速させる。アジャイル開発に最適なデータ構造とORマッパの形 (20)

Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略
 
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api   cms どうでしょう - 大阪夏の陣初めての Data api   cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
 
初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API   CMS どうでしょう - 仙台編 -初めての Data API   CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -
 
デバッガでWordPress本体やプラグインの脆弱性を追いかけてみよう
デバッガでWordPress本体やプラグインの脆弱性を追いかけてみようデバッガでWordPress本体やプラグインの脆弱性を追いかけてみよう
デバッガでWordPress本体やプラグインの脆弱性を追いかけてみよう
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
 
HTML5でオフラインWebアプリケーションを作ろう
HTML5でオフラインWebアプリケーションを作ろうHTML5でオフラインWebアプリケーションを作ろう
HTML5でオフラインWebアプリケーションを作ろう
 
Java EE8 Report
Java EE8 ReportJava EE8 Report
Java EE8 Report
 
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration
 
MailFluteでメール送信を楽しもう!
MailFluteでメール送信を楽しもう!MailFluteでメール送信を楽しもう!
MailFluteでメール送信を楽しもう!
 
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
 
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(後編)
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(後編)【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(後編)
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(後編)
 
Building React, Flutter and Blazor development and debugging environment with...
Building React, Flutter and Blazor development and debugging environment with...Building React, Flutter and Blazor development and debugging environment with...
Building React, Flutter and Blazor development and debugging environment with...
 
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界
 
文字コードの脆弱性はこの3年間でどの程度対策されたか?
文字コードの脆弱性はこの3年間でどの程度対策されたか?文字コードの脆弱性はこの3年間でどの程度対策されたか?
文字コードの脆弱性はこの3年間でどの程度対策されたか?
 
msal.js v2を触る
msal.js v2を触るmsal.js v2を触る
msal.js v2を触る
 
Ibm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコードIbm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコード
 
GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発
 
今改めて学ぶ Microsoft Azure 基礎知識
今改めて学ぶ Microsoft Azure 基礎知識今改めて学ぶ Microsoft Azure 基礎知識
今改めて学ぶ Microsoft Azure 基礎知識
 
Treasure data demo.0517
Treasure data demo.0517Treasure data demo.0517
Treasure data demo.0517
 

Mais de Yusaku Watanabe

組織をシステム化するReactiveManagement
組織をシステム化するReactiveManagement組織をシステム化するReactiveManagement
組織をシステム化するReactiveManagementYusaku Watanabe
 
エンジニアがプロダクトマネージャーに進化すると何が起きるのか
エンジニアがプロダクトマネージャーに進化すると何が起きるのかエンジニアがプロダクトマネージャーに進化すると何が起きるのか
エンジニアがプロダクトマネージャーに進化すると何が起きるのかYusaku Watanabe
 
Regional Scrum Gathering® Tokyo 2014
Regional Scrum Gathering® Tokyo 2014Regional Scrum Gathering® Tokyo 2014
Regional Scrum Gathering® Tokyo 2014Yusaku Watanabe
 
Jvm operation casual talks
Jvm operation casual talksJvm operation casual talks
Jvm operation casual talksYusaku Watanabe
 
PageRankアルゴリズムを使った人事評価についての実験
PageRankアルゴリズムを使った人事評価についての実験PageRankアルゴリズムを使った人事評価についての実験
PageRankアルゴリズムを使った人事評価についての実験Yusaku Watanabe
 
スケーラブルなアプリケーション開発を考える
スケーラブルなアプリケーション開発を考えるスケーラブルなアプリケーション開発を考える
スケーラブルなアプリケーション開発を考えるYusaku Watanabe
 
Pythonによる並列プログラミング -GPGPUも-
Pythonによる並列プログラミング   -GPGPUも- Pythonによる並列プログラミング   -GPGPUも-
Pythonによる並列プログラミング -GPGPUも- Yusaku Watanabe
 
実録 WEBエンジニアが Titanium Mobileアプリを開発するまで
実録 WEBエンジニアが Titanium Mobileアプリを開発するまで実録 WEBエンジニアが Titanium Mobileアプリを開発するまで
実録 WEBエンジニアが Titanium Mobileアプリを開発するまでYusaku Watanabe
 
GPGPUによるパーソナルスーパーコンピュータの可能性
GPGPUによるパーソナルスーパーコンピュータの可能性GPGPUによるパーソナルスーパーコンピュータの可能性
GPGPUによるパーソナルスーパーコンピュータの可能性Yusaku Watanabe
 

Mais de Yusaku Watanabe (11)

組織をシステム化するReactiveManagement
組織をシステム化するReactiveManagement組織をシステム化するReactiveManagement
組織をシステム化するReactiveManagement
 
エンジニアがプロダクトマネージャーに進化すると何が起きるのか
エンジニアがプロダクトマネージャーに進化すると何が起きるのかエンジニアがプロダクトマネージャーに進化すると何が起きるのか
エンジニアがプロダクトマネージャーに進化すると何が起きるのか
 
QCon SF-feedback
QCon SF-feedbackQCon SF-feedback
QCon SF-feedback
 
Regional Scrum Gathering® Tokyo 2014
Regional Scrum Gathering® Tokyo 2014Regional Scrum Gathering® Tokyo 2014
Regional Scrum Gathering® Tokyo 2014
 
Jvm operation casual talks
Jvm operation casual talksJvm operation casual talks
Jvm operation casual talks
 
PageRankアルゴリズムを使った人事評価についての実験
PageRankアルゴリズムを使った人事評価についての実験PageRankアルゴリズムを使った人事評価についての実験
PageRankアルゴリズムを使った人事評価についての実験
 
スケーラブルなアプリケーション開発を考える
スケーラブルなアプリケーション開発を考えるスケーラブルなアプリケーション開発を考える
スケーラブルなアプリケーション開発を考える
 
Pythonによる並列プログラミング -GPGPUも-
Pythonによる並列プログラミング   -GPGPUも- Pythonによる並列プログラミング   -GPGPUも-
Pythonによる並列プログラミング -GPGPUも-
 
実録 WEBエンジニアが Titanium Mobileアプリを開発するまで
実録 WEBエンジニアが Titanium Mobileアプリを開発するまで実録 WEBエンジニアが Titanium Mobileアプリを開発するまで
実録 WEBエンジニアが Titanium Mobileアプリを開発するまで
 
Ameba Piggの裏側
Ameba Piggの裏側Ameba Piggの裏側
Ameba Piggの裏側
 
GPGPUによるパーソナルスーパーコンピュータの可能性
GPGPUによるパーソナルスーパーコンピュータの可能性GPGPUによるパーソナルスーパーコンピュータの可能性
GPGPUによるパーソナルスーパーコンピュータの可能性
 

WEB開発を加速させる。アジャイル開発に最適なデータ構造とORマッパの形