SlideShare une entreprise Scribd logo
1  sur  46
JPAの基礎と現場で役立つ開発Tips
SI-Toolkit for Application Development
• はじめに
• 環境構築
• JPA Programming
• JPA Configuration
• まとめ
はじめに
SI-Toolkit : SIプロジェクトで必要な道具一式
• Application Development : Java EE & CI/CD
• Web Testing : Test Automation
Concept:もっとSmartなSIを!
株式会社モノクレア
• SIプロジェクトの技術コンサルティング
• アプリケーションアーキテクチャ
• 開発方法論
• テスト自動化
• CI/CD
環境構築
構築する環境
Eclipse Project
pom.xml
src
main
java
a.b.c.myproject.domain.user
UserRepository.java
resources
META-INF
persistence.xml
test
java
a.b.c.myproject.domain.user
UserRepositoryTest.java
target/generate-sources/hibernate-tools
a.b.c.myproject.domain.user
UserEntity.java
tools
derby
migration
V1__create_user_and_group.sql
hibernate-tools
DB
(Derby)
Hibernate
Tools
Flyway
JPA, CDI1. create project
from
maven archetype
3. db migrate
4. reverse engineer
2. start db
プロジェクト作成 正式
• 手順詳細
• クイックスタート Eclipseで実行する場合
• 「ファイル」メニュー>新規>Mavenプロジェクト
• カタログ
• Remote http://repo.maven.apache.org/maven2/archetype-catalog.xml
• アーキタイプ
• グループId:org.sitoolkit.ad.archetype アーティファクトId:javaee7-web-tips バージョ
ン:1.1.1
プロジェクト作成 当勉強会用
• project-generator.zipをダウンロード
• https://github.com/sitoolkit/sit-ad-archetype-javaee7-web/issues/17
• Eclipseに既存プロジェクトとしてインポート
• 「ファイル」メニュー>インポート>既存プロジェクトをワークスペースへ
プロジェクト作成 当勉強会用
• 「Java EE」パースペクティブ「プロジェクト・エクスプローラー」ビューでproject-generatorプロ
ジェクトを右クリック>実行>Mavenビルド または Alt + Shift + X, M (alt + shift +
X, M)
• project-generatorプロジェクトを右クリック>リフレッシュ またはF5
• myprojectフォルダを右クリック>Import as Project
• project-generatorプロジェクトを右クリック>閉じる
derbyプロファイルをactivate
• myproject/pom.xmlを開く
• mysql以下のactivationをderby以下に移動
• derbyプロファイルのpropertiesにdb.catalogプロパティを空で設定
l.95
<profile>
<id>derby</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<db.catalog></db.catalog>
<db.client.groupId>org.apache.derby</db.client.groupId>
l.117
<profile>
<id>mysql</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
wildfly-testプロファイルをactivate
• プロジェクト右クリック>Maven>Mavenプロファイルの選択
• wildfly-testを選択
Derbyを起動
• プロジェクト右クリック>実行>Mavenビルド または Alt + Shift + X, M
• myproject_10_derby-runを選択>OK
• 「ウィンドウ」メニュー>パースペクティブ>パースペクティブを開く>その他
• DBViewerを選択>OK
• 「DBツリー・ビュー」で「データベース定義をインポート」をクリック
• myproject/target/test-classes/dbviewer/derby.xmlを選択
データベース接続定義をインポート
データベースを参照
• インポートしたデータベース定義をダブルクリック
db-migrateを実行
• myprojectプロジェクト右クリック>実行>Mavenビルド または Alt + Shift + X, M
• myproject_01_db-migrateを選択>OK
db-migrate後のデータベース
• APPを右クリック>更新 または F5
• USER_ENTITYをダブルクリック
db-migrate後のJavaリソース
• myprojectプロジェクトを右クリック>リフレッシュ または F5
Before After
サンプルテストを開く
• 「ナビゲート」メニュー>リソースを開く または Ctrl + Shift + R
サンプルテストを実行
• UserRepositoryTest.javaを開いた状態で右クリック>実行>Junitテスト または Alt +
Shift + X, T
JPA Programming
INSERT
• UserRepositoryTest.javaにEntityManagerフィールドとtestInsertメソッドを実装して実
行
• 「コンソール」ビューにINSERT INTO user_entityのSQL文が出力されることを確認
• USER_ENTITYテーブルにレコードが1件INSERTされていることを確認
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Inject
EntityManager em;
@Test
@Transactional
public void testInsert() {
UserEntity user = UserFactory.create();
em.persist(user);
}
}
O/R Mapping
• Hibernate ToolsでリバースしたUserEntity.java
@Entity
@Table(name="USER_ENTITY")
@Access(AccessType.PROPERTY)
public class UserEntity extends BaseEntity implements java.io.Serializable {
private String userId;
private Set<GroupEntity> groupEntities = new HashSet<GroupEntity>(0);
@Id
@Column(name="USER_ID", unique=true, nullable=false, length=10)
public String getUserId() {
return this.userId;
}
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name="USER_GROUP_RELATION", schema="APP", joinColumns = {
@JoinColumn(name="USER_ID", nullable=false, updatable=false) },
inverseJoinColumns = {
@JoinColumn(name="GROUP_CODE", nullable=false, updatable=false) })
public Set<GroupEntity> getGroupEntities() {
return this.groupEntities;
}
JPA 要するに
• DBのテーブルやカラムをJavaのクラスやフィールドとして扱うフレームワーク。
• テーブル、カラムとクラス、フィールドの対応はアノテーションで定義する。(※1)
※1 xmlファイルでも定義できますが当資料では言及しません。
DB Java
テーブル @Entityのついたクラス
カラム @Entityのついたクラスのフィールド
レコード @Entityのついたクラスのインスタンス
SELECT
• UserRepositoryTest.javaにtestSelectメソッドを実装して実行
• 「コンソール」ビューにSELECT FROM user_entityのSQL文が出力されることを確認
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Test
public void testSelect() {
UserEntity user = em.find(UserEntity.class, "user0001");
System.out.println(user.getUserId());
}
}
UPDATE
• UserRepositoryTest.javaにtestUpdateメソッドを実装して実行
• 「コンソール」ビューにUPDATE user_entityのSQL文が出力されることを確認
• JPAではトランザクション内でManagedな状態のエンティティのプロパティを変更すると自動で
UPDATE!
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Test
@Transactional
public void testUpdate() {
UserEntity user = em.find(UserEntity.class, "user0001");
user.setFirstName("name");
}
}
UPDATEしない
• @Transactinalをコメントアウト、またはEntityManager.detachでUserEntityをデタッチ
• 「コンソール」ビューにUPDATE user_entityのSQL文が出力されないことを確認
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Test
// @Transactional
public void testUpdate() {
UserEntity user = em.find(UserEntity.class, "user0001");
em.detach(user);
user.setFirstName("name");
}
}
DELETE
• UserRepositoryTest.javaにtestDeleteメソッドを実装して実行
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Test
@Transactional
public void testDelete() {
UserEntity user = em.find(UserEntity.class, "user0001");
em.remove(user);
}
}
Managed
• EntityManagerから取得したEntityインスタンスはManaged
• SQLの実行タイミングはJPAが管理する。
• トランザクション内でのEntityインスタンスのプロパティ更新は、DBも更新されることを
意識しましょう!
EntityManagerのメソッド 作用
persist(Object entity) INSERTしてentityをManagedにする。
find(Class entityClass, Object primaryKey) entityClassのインスタンスを取得する。
SELECTが実行される可能性がある。
merge(Object entity) entityをManagedにする。UPDATE、または
INSERTが実行される可能性がある。
remove(Object entity) DELETEが実行される可能性がある。
CRUD
• 問題:次のtestCrudメソッドで実行されるSQLとその順番は?
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Inject
EntityManager em;
@Test
@Transactional
public void testCrud() {
UserEntity user = UserFactory.create();
em.persist(user);
UserEntity userInDb = em.find(UserEntity.class, user.getUserId());
userInDb.setFirstName("user");
em.merge(userInDb);
em.remove(userInDb);
}
}
JPQL SELECT
• UserRepositoryTest.javaにtestJpqlSelectメソッドを実装して実行
import javax.persistence.Query;
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Test
public void testJpqlSelect() {
Query query = em.createQuery(
"SELECT u FROM UserEntity u WHERE u.userId LIKE :userId");
query.setParameter("userId", "user%");
List<UserEntity> users = query.getResultList();
System.out.println(users.size());
}
}
JPQL JOIN – NG example
• UserRepositoryTest.javaにtestJpqlSelectメソッドを実装して実行
• UserEntity.getGroupEntities()実行時にもSELECTされる!
@Dependent
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Test
public void testJpqlJoin() {
Query query = em.createQuery(
"SELECT u FROM UserEntity u JOIN u.groupEntities g");
List<UserEntity> users = query.getResultList();
System.out.println(users.get(0).getGroupEntities());
}
}
FetchType
• LAZY:getしたときにSELECTする
• EAGER:初回のJPQL実行時点でJOINする
@Entity
@Table(name="USER_ENTITY")
@Access(AccessType.PROPERTY)
public class UserEntity extends BaseEntity implements java.io.Serializable {
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name="USER_GROUP_RELATION", schema="APP", joinColumns = {
@JoinColumn(name="USER_ID", nullable=false, updatable=false) },
inverseJoinColumns = {
@JoinColumn(name="GROUP_CODE", nullable=false, updatable=false) })
public Set<GroupEntity> getGroupEntities() {
return this.groupEntities;
}
JPQL JOIN – OK example
A) 関連プロパティ(groupEntities)が必要な場合
• JOINの後にFETCHをつける。FETCHの有り無しでSELECTするカラムが変わる。
B) 不要な場合
• デタッチする。
• 注意:デタッチした後に関連プロパティにアクセスすると例外が発生する。
@Dependent
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Test
public void testJpqlJoin() {
Query query = em.createQuery(
"SELECT u FROM UserEntity u JOIN FETCH u.groupEntities g");
List<UserEntity> users = query.getResultList();
users.stream().forEach(u -> em.detach(u));
System.out.println(users.get(0).getGroupEntities());
}
}
A)
B)
JPQL UPDATE
• Entityを使わずにUPDATEする場合はJPQLでUPDATEする。
@Dependent
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Test
@Transactional
public void testJpqlUpdate() {
Query query = em.createQuery(
"UPDATE UserEntity u SET u.lastName = :lastName "
+ "WHERE u.userId = :userId");
query.setParameter("lastName", "name");
query.setParameter("userId", "user0002");
System.out.println(query.executeUpdate());
}
}
JPQL 要するに
• DBのオブジェクト名をO/Rマッピング後の名前で指定するSQL
SQL JPQL
テーブル名 Entityクラス名
カラム名 Entityクラスのフィールド名
JOIN table ON JOIN entity
Native Query
• SQLを実行することも可能。
• SELECT結果をEntityとして抽出することも可能。
• 主な利用場面
• データモデルが汚すぎて職人でないとSQLが組めない。職人はJPQLを知らない。
@Dependent
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Test
public void testNativeQuery() {
Query query = em.createNativeQuery(
"SELECT * FROM user_entity", UserEntity.class);
List<UserEntity> result = query.getResultList();
System.out.println(result.get(0));
}
}
JPA Configuration
persistence.xml
• src/main/resources/META-INF/persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<persistence-unit name="javaee7-web-tips-pu" transaction-type="JTA">
<jta-data-source>jdbc/javaee7-web-tips-ds</jta-data-source>
<properties>
<property name="eclipselink.logging.logger" value="JavaLogger" />
<property name="eclipselink.logging.level" value="FINE" />
<property name="eclipselink.logging.parameters" value="true" />
<property name="hibernate.dialect" value="${hibernate.dialect}"/>
<property name="hibernate.format_sql" value="true"/>
<property name="wildfly.jpa.default-unit" value="true"/>
</properties>
</persistence-unit>
:
:
Tips:実行SQLをロ
グ出力するように設定
persistence.xml 続き
:
:
<persistence-unit name="javaee7-web-tips-pu-non-ee-container" transaction-
type="RESOURCE_LOCAL">
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.jdbc.driver" value="${db.jdbc.driver}" />
<property name="javax.persistence.jdbc.url" value="${db.jdbc.url}" />
<property name="javax.persistence.jdbc.user" value="${db.username}" />
<property name="javax.persistence.jdbc.password" value="${db.password}" />
<property name="eclipselink.logging.logger" value="JavaLogger" />
<property name="eclipselink.logging.level" value="FINE" />
<property name="eclipselink.logging.parameters" value="true" />
<property name="hibernate.dialect" value="${hibernate.dialect}"/>
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
Tips:EEコンテナー外での
設定をテスト用として同一ファ
イル内に定義(次頁)
Tips:接続情報を開発
者ごとに切り替えられるよ
うに設定
テスト用のPUは何故必要?
• Entityクラスをスキャンする範囲
• META-INF/persistence.xmlがあるディレクトリ、jarまたはwar
• Mavenの作法に則ってテスト用persistence.xmlをsrc/test/resourcesに配置すると、
Entityクラスがスキャンされない!
src
main
java
my/package/structure
MyEntity.java
resources
META-INF
persistence.xml
test
resources
META-INF
persistence.xml
target
classes
my/package/structure
MyEntity.class
META-INF
persistence.xml
test-classes
META-INF
persistence.xml
build
スキャン対象
スキャン対象外
まとめ
今回学んだこと
Category Item Point
Programming O/R Mapping DBレコードをJavaオブジェクトとして扱うための定義 DB
テーブル構造をJavaクラスにマッピング
JPQL 単純CRUD以外のDBのデータ操作はJPQLで行う
Configuration persistence.xml DB接続情報やトランザクション管理方法などJPAの設
定はpersistence.xmlで定義する
Tips DB Migration Tool DDL、DMLをチームで共有し&個々人が実行できる環
境を作る -> Flyway
Reverse Engineering Tool EntityクラスをDBスキーマからリバースエンジニアリングで
きる環境を作る -> Hibernate Tools
SQL Log 実行SQLをログに出力するようにJPAプロバイダーを設定
する
Unit Test with CDI CDI、特に宣言的トランザクションが使える単体テスト環
境を作る -> DeltaSpike
発展内容
• JPA
• O/R Mapping
• @AttributeOverride、@Inheritance、@Convert
• EntityListener
• EntityGraph
• Criteria API (APIがわかりにくいのでSIT-ADに入れるかは要検討。。)
• Shared Cache Mode
• DeltaSpike
• Data Module
• https://deltaspike.apache.org/documentation/data.html
SIT-ADの活用方法
• JPAの練習
• DDL作成
• db-migration
• JUnit
• Tipsの参照
• Flyway
• Hibernate Tools
• DeltaSpike
ご清聴ありがとうございました!
SmartなSIを!

Contenu connexe

Tendances

社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI
Akihiro Ikezoe
 

Tendances (20)

SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
Jenkins使ってみた~Windows編~
Jenkins使ってみた~Windows編~Jenkins使ってみた~Windows編~
Jenkins使ってみた~Windows編~
 
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしようPHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
 
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpconokinawa
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpconokinawaクリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpconokinawa
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpconokinawa
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
 
ドメイン駆動設計入門
ドメイン駆動設計入門ドメイン駆動設計入門
ドメイン駆動設計入門
 
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web ServiceアプリケーションAngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
 
社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
PUC SE Day 2019 - SpringBoot
PUC SE Day 2019 - SpringBootPUC SE Day 2019 - SpringBoot
PUC SE Day 2019 - SpringBoot
 
Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話
 
PHPでマルチスレッド
PHPでマルチスレッドPHPでマルチスレッド
PHPでマルチスレッド
 
今さら聞けないDiとspring
今さら聞けないDiとspring今さら聞けないDiとspring
今さら聞けないDiとspring
 
LibreOffice API について
LibreOffice API についてLibreOffice API について
LibreOffice API について
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
react-scriptsはwebpackで何をしているのか
react-scriptsはwebpackで何をしているのかreact-scriptsはwebpackで何をしているのか
react-scriptsはwebpackで何をしているのか
 
Mavenの真実とウソ
Mavenの真実とウソMavenの真実とウソ
Mavenの真実とウソ
 

Similaire à JPAの基礎と現場で役立つ開発Tips

Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Akira Inoue
 
Getting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitGetting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnit
Atsuhiro Kubo
 
Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGood
Atsuhiro Kubo
 
How to django at first
How to django at firstHow to django at first
How to django at first
Maito Kuwahara
 
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
Akira Inoue
 

Similaire à JPAの基礎と現場で役立つ開発Tips (20)

Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624
 
Team Foundation Server ~ 今を生きるエンジニアのための開発基盤とは 【BPStudy #63】
Team Foundation Server ~ 今を生きるエンジニアのための開発基盤とは 【BPStudy #63】 Team Foundation Server ~ 今を生きるエンジニアのための開発基盤とは 【BPStudy #63】
Team Foundation Server ~ 今を生きるエンジニアのための開発基盤とは 【BPStudy #63】
 
ビルドプロセスとCI #STAC2014
ビルドプロセスとCI #STAC2014ビルドプロセスとCI #STAC2014
ビルドプロセスとCI #STAC2014
 
Ignite UI 2012 最新情報 jQuery Mobile 編
Ignite UI 2012 最新情報 jQuery Mobile 編Ignite UI 2012 最新情報 jQuery Mobile 編
Ignite UI 2012 最新情報 jQuery Mobile 編
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortem
 
Getting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitGetting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnit
 
2013 Ignite UI 最新情報 in 岡山
2013 Ignite UI 最新情報 in 岡山2013 Ignite UI 最新情報 in 岡山
2013 Ignite UI 最新情報 in 岡山
 
Java/Androidセキュアコーディング
Java/AndroidセキュアコーディングJava/Androidセキュアコーディング
Java/Androidセキュアコーディング
 
実践で学ぶ、効率的な自動テストスクリプトのメンテナンス
実践で学ぶ、効率的な自動テストスクリプトのメンテナンス実践で学ぶ、効率的な自動テストスクリプトのメンテナンス
実践で学ぶ、効率的な自動テストスクリプトのメンテナンス
 
Ignite ui 2012 最新情報 jQuery UI 編
Ignite ui 2012 最新情報 jQuery UI 編Ignite ui 2012 最新情報 jQuery UI 編
Ignite ui 2012 最新情報 jQuery UI 編
 
Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGood
 
How to django at first
How to django at firstHow to django at first
How to django at first
 
Road to UI Library
Road to UI LibraryRoad to UI Library
Road to UI Library
 
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
 
なぜソフトウェアアーキテクトが必要なのか - デブサミ2011
なぜソフトウェアアーキテクトが必要なのか - デブサミ2011なぜソフトウェアアーキテクトが必要なのか - デブサミ2011
なぜソフトウェアアーキテクトが必要なのか - デブサミ2011
 
Ldd13 present
Ldd13 presentLdd13 present
Ldd13 present
 
テスト自動化の現場で困ること SI-Toolkitが解決すること
テスト自動化の現場で困ること SI-Toolkitが解決することテスト自動化の現場で困ること SI-Toolkitが解決すること
テスト自動化の現場で困ること SI-Toolkitが解決すること
 
ここが変わったTizen sdk2.0alpha
ここが変わったTizen sdk2.0alphaここが変わったTizen sdk2.0alpha
ここが変わったTizen sdk2.0alpha
 

Dernier

Dernier (10)

論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 

JPAの基礎と現場で役立つ開発Tips