Ruby on Rails. für Java Entwickler - Ende der Schmerzen - first, last = :mariano, :kamp = #{first}.#{last}@de.ibm.com

Size: px
Start display at page:

Download "Ruby on Rails. für Java Entwickler - Ende der Schmerzen - first, last = :mariano, :kamp email = #{first}.#{last}@de.ibm.com"

Transcription

1 Ruby on Rails für Java Entwickler - Ende der Schmerzen - first, last = :mariano, :kamp = #{first.#{[email protected]

2 Ruby on Rails für Java Entwickler - Ende der Schmerzen - first, last = :mariano, :kamp = #{first.#{[email protected]

3 Es war einmal

4 Vor langer Zeit

5 1993

6 In einem fernen Land

7

8 Ein Ritter in schimmernder Rüstung

9

10

11 Yukihiro Matsumoto

12 Yukihiro Matsumoto Matz

13 Suche nach dem Edelstein

14 Ruby!

15 Smalltalk Perl + ~= Ruby

16 Smalltalk Perl objektorientierung + dynamik ~= Ruby

17 Smalltalk Perl objektorientierung dynamik + reguläre ausdrücke string manipulationen ~= Ruby

18 was ist ruby?

19 programmiersprache

20 for first

21 for human beings first

22 then computers Matz

23 objektorientiert

24 objektorientierung kapselung vererbung polymorphie

25 objektorientierung

26 objektorientierung everything is an object

27 objektorientierung ja, ja...

28 objektorientierung nein, diesmal wirklich!

29 objektorientierung >> "ruby".class => String

30 objektorientierung >> "ruby".class IRB-In => String

31 objektorientierung >> "ruby".class => String IRB-Out

32 objektorientierung >> 10.class => Fixnum

33 objektorientierung >> 10.class => Fixnum Java Primitives sind keine Objekte!

34 objektorientierung >> nil.class => NilClass

35 objektorientierung >> nil.class => NilClass Java Schlüsselwort null

36 objektorientierung >> true.class => TrueClass

37 objektorientierung >> true.class => TrueClass Java Schlüsselwort true

38 objektorientierung objekte senden und empfangen nachrichten

39 objektorientierung >> 10.div(2) => 5

40 objektorientierung >> 10.div(2) => 5 Java Nicht für Primitives

41 objektorientierung >> 10.send(:div, 2) => 5

42 objektorientierung >> 10./2 => 5

43 objektorientierung >> 10/2 => 5

44 objektorientierung >> 10/2 => 5 Java Nur für Primitives

45 objektorientierung >> 10.send(:/, 2) => 5

46 objektorientierung >> String.new "ruby" => "ruby"

47 objektorientierung >> String.new "ruby" => "ruby" Java Schlüsselwort new

48 objektorientierung >> class Dog >> def name=(new_name) >> end >> def name >> end >> end => nil

49 objektorientierung >> class Dog >> def name=(new_name) >> end >> def name >> end >> end => nil

50 objektorientierung >> class Dog >> def name=(new_name) >> end >> def name >> end >> end => nil

51 objektorientierung >> class Dog >> def name=(new_name) >> end >> def name >> end >> end => nil Define a setter

52 objektorientierung >> class Dog >> def name=(new_name) >> end >> def name >> end >> end => nil Define a getter

53 objektorientierung >> class Dog >> def name=(new_name) >> end >> def name >> end >> end => nil >> d = Dog.new => #<Dog:0x1d4bac> >> d.name="fluffy" => "Fluffy" >> d.name => "Fluffy"

54 objektorientierung >> class Dog >> def name=(new_name) >> end >> def name >> end >> end => nil >> d = Dog.new => #<Dog:0x1d4bac> >> d.name="fluffy" => "Fluffy" >> d.name => "Fluffy" Dog d = new Dog()

55 objektorientierung >> class Dog >> def name=(new_name) >> end >> def name >> end >> end => nil >> d = Dog.new => #<Dog:0x1d4bac> >> d.name="fluffy" => "Fluffy" >> d.name => "Fluffy" d.setname( Fluffy )

56 objektorientierung >> class Dog >> def name=(new_name) >> end >> def name >> end >> end => nil >> d = Dog.new => #<Dog:0x1d4bac> >> d.name="fluffy" => "Fluffy" >> d.name => "Fluffy" d.getname()

57 dynamisch

58 dynamik

59 dynamik everything is open

60 dynamik sogar die ruby libraries

61 dynamik >> class Fixnum >> def even? >> self % 2 == 0 >> end >> end => nil >> 10.even? => true >> 9.even? => false

62 dynamik >> class Fixnum >> def even? >> self % 2 == 0 >> end >> end => nil >> 10.even? => true >> 9.even? => false Java Subclassing, wenn erlaubt Helper Klassen -> StringUtil

63 dynamik und bereits lebende objekte

64 dynamik class << ActiveRecord::Base.connection alias : old_execute :execute def execute(statement, name) puts "Executing: #{statement" old_execute (statement, name) end end

65 dynamik class << ActiveRecord::Base.connection alias : old_execute :execute def execute(statement, name) puts "Executing: #{statement" old_execute (statement, name) end end

66 dynamik class << ActiveRecord::Base.connection alias : old_execute :execute def execute(statement, name) puts "Executing: #{statement" old_execute (statement, name) end end

67 dynamik class << ActiveRecord::Base.connection alias : old_execute :execute def execute(statement, name) puts "Executing: #{statement" old_execute (statement, name) end end

68 dynamik class << ActiveRecord::Base.connection alias : old_execute :execute def execute(statement, name) puts "Executing: #{statement" old_execute (statement, name) end end

69 dynamik class << ActiveRecord::Base.connection alias : old_execute :execute def execute(statement, name) puts "Executing: #{statement" old_execute (statement, name) end end

70 dynamik class << ActiveRecord::Base.connection alias : old_execute :execute def execute(statement, name) puts "Executing: #{statement" old_execute (statement, name) end end

71 dynamik class << ActiveRecord::Base.connection alias : old_execute :execute def execute(statement, name) puts "Executing: #{statement" old_execute (statement, name) end end >> Player.find(:all).size => 4

72 dynamik class << ActiveRecord::Base.connection alias : old_execute :execute def execute(statement, name) puts "Executing: #{statement" old_execute (statement, name) end end >> Player.find(:all).size Executing: SELECT * FROM players => 4

73 dynamik

74 dynamik weak typing

75 dynamik strong/static typing weak typing

76 dynamik strong/static typing dynamic typing weak typing

77 dynamik dynamic typing >> def sum(a, b) >> a+b >> end => nil

78 dynamik dynamic typing >> def sum(a, b) >> a+b >> end => nil >> sum(1,2) => 3

79 dynamik dynamic typing >> def sum(a, b) >> a+b >> end => nil >> sum("a","z") => "AZ"

80 dynamik dynamic typing >> def sum(a, b) >> a+b >> end => nil >> sum("a",2)

81 dynamik dynamic typing >> def sum(a, b) >> a+b >> end => nil >> sum("a",2) TypeError: can't convert Fixnum into String

82 dynamik :method_missing

83 dynamik >> class Receiver >> def method_missing(action, *args) >> puts "My method #{action was called," >> puts "with parameters: #{args.inspect" >> end >> end

84 dynamik >> class Receiver >> def method_missing(action, *args) >> puts "My method #{action was called," >> puts "with parameters: #{args.inspect" >> end >> end >> r = Receiver.new => #<Receiver:0x33d43c>

85 dynamik >> class Receiver >> def method_missing(action, *args) >> puts "My method #{action was called," >> puts "with parameters: #{args.inspect" >> end >> end >> r = Receiver.new => #<Receiver:0x33d43c> >> r.test My method test was called, with parameters: [] => nil

86 dynamik >> class Receiver >> def method_missing(action, *args) >> puts "My method #{action was called," >> puts "with parameters: #{args.inspect" >> end >> end >> r = Receiver.new => #<Receiver:0x33d43c> >> r.test My method test was called, with parameters: [] => nil >> r.add 1,"b", 2 My method add was called, with parameters: [1, "b", 2] => nil

87 dynamik >> class Receiver >> def method_missing(action, *args) >> puts "My method #{action was called," >> puts "with parameters: #{args.inspect" >> end >> end >> r = Receiver.new => #<Receiver:0x33d43c> >> r.test My method test was called, with parameters: [] => nil >> r.add 1,"b", 2 My method add was called, with parameters: [1, "b", 2] => nil Proxy? Mock? State Machine? CSV Reader? AOP?

88 dynamik meta programmierung

89 dynamik >> class Dog >> attr_accessor :name, :age >> def age=(new_age) >> end >> end => nil

90 dynamik >> class Dog >> attr_accessor :name, :age >> def age=(new_age) >> end >> end => nil Definiert on the fly : :name, :name=, :age, :age=

91 dynamik >> class Dog >> attr_accessor :name, :age >> def age=(new_age) >> end >> end => nil Überschreibt den setter für age.

92 dynamik >> class Dog >> attr_accessor :name, :age >> def age=(new_age) >> end >> end => nil >> d = Dog.new => #<Dog:0x318498>

93 dynamik >> class Dog >> attr_accessor :name, :age >> def age=(new_age) >> end >> end => nil >> d.name = "Fluffy" => "Fluffy" >> d.age = 2 => 2

94 dynamik >> class Dog >> attr_accessor :name, :age >> def age=(new_age) >> end >> end => nil >> d.age => 14

95 dynamik und vieles mehr...

96 blocks/closures (nur ganz kurz)

97 closures >> def log(name) >> puts "Now executing #{name." >> result = yield >> puts "Done with #{name." >> result >> end

98 closures >> def log(name) >> puts "Now executing #{name." >> result = yield >> puts "Done with #{name." >> result >> end

99 closures >> def log(name) >> puts "Now executing #{name." >> result = yield >> puts "Done with #{name." >> result >> end >> log("addition"){1+1 Now executing Addition. Done with Addition. => 2

100 closures >> def log(name) >> puts "Now executing #{name." >> result = yield >> puts "Done with #{name." >> result >> end >> log("addition"){1+1 Now executing Addition. Done with Addition. => 2

101 closures >> def log(name) >> puts "Now executing #{name." >> result = yield >> puts "Done with #{name." >> result >> end >> log("addition"){1+1 Now executing Addition. Done with Addition. => 2

102 closures >> def log(name) >> puts "Now executing #{name." >> result = yield >> puts "Done with #{name." >> result >> end >> log("addition"){1+1 Now executing Addition. Done with Addition. => 2

103 closures >> def log(name) >> puts "Now executing #{name." >> result = yield >> puts "Done with #{name." >> result >> end >> log("addition"){1+1 Now executing Addition. Done with Addition. => 2

104 closures >> def log(name) >> puts "Now executing #{name." >> result = yield >> puts "Done with #{name." >> result >> end >> log("addition"){1+1 Now executing Addition. Done with Addition. => 2 >> log("output"){puts "Chunky Bacon" Now executing Output. Chunky Bacon Done with Output. => nil

105 closures >> def log(name) >> puts "Now executing #{name." >> result = yield >> puts "Done with #{name." >> result >> end >> log("addition"){1+1 Now executing Addition. Done with Addition. => 2 >> log("output"){puts "Chunky Bacon" Now executing Output. Chunky Bacon Done with Output. => nil >> ["chunky","bacon"].each { element puts element chunky bacon

106 demo!

107 2000

108 Dave Thomas

109 Andy Hunt

110 Pragmatic Programmers

111 Pragmatic Programmers

112 Pragmatic Programmers "Learn at least one new [programming] language every year. Different languages solve the same problems in different ways. By learning several different approaches, you can help broaden your thinking and avoid getting stuck in a rut."

113 Pickaxe

114 Google Trends

115 Programming Language Trends

116 Script Kiddies...

117 ... Ritter...

118 Kent Beck

119 Kent Beck

120 Kent Beck

121 Kent Beck

122 Kent Beck I always knew one day Smalltalk would replace Java. I just didn't know it would be called Ruby.

123 Martin Fowler

124 Martin Fowler

125 Martin Fowler

126 Martin Fowler

127 Martin Fowler I like the ruby language for its rich yet uncluttered syntax and the well designed frameworks that come with it.

128 was ist nun Rails?

129 2004

130 der geistige vater

131

132 Google/O Reilly: Best Hacker

133 Google/O Reilly: Best Hacker

134 David Heinemeier Hanson (DHH)

135 rails ist...

136 mvc framwork

137 aus einem guss

138 extrahiert aus laufender anwendung

139 conventions configuration

140 conventions over configuration

141 opinionated software

142 zuckerbrot & peitsche

143 DRY (don t repeat yourself) drücke alles nur einmal aus

144 elegant

145 conventions

146 conventions Klassen- und Tabellen

147 conventions Klassen- und Tabellen Klassennamen sind Singular. Tabellennamen sind Plural.

148 conventions Klassen- und Tabellen Klassennamen sind Singular. Tabellennamen sind Plural. Klassennamen sind CamelCase. Tabellennamen sind Kleinbuchstaben, verbunden durch _.

149 conventions Klassen- und Tabellen Klassennamen sind Singular. Tabellennamen sind Plural. Klassennamen sind CamelCase. Tabellennamen sind Kleinbuchstaben, verbunden durch _. Bsp.: TurnState => turn_states OrderReceipt => order_receipts Person => people

150 conventions Spalten- und Attribute Spaltenname == Attributname Jede Tabelle hat eine id -Spalte

151 conventions Relationen Spaltennamen des foreign keys entspricht dem Namen der Klasse plus _id.

152 conventions Relationen Spaltennamen des foreign keys entspricht dem Namen der Klasse plus _id. Customer id name * Book id name author

153 conventions Relationen Spaltennamen des foreign keys entspricht dem Namen der Klasse plus _id. Customer id name * Book id name author Der Tabelle books wird die Spalte customer_id angefügt.

154 conventions... und mehr...

155 und? bringt s was?

156 JEE vs Rails

157 JEE vs Rails Java Beispielcode von Sebastian Hennebrueder id Customer name * Book id name author

158 /** * Sebastian Hennebrueder * created Mar 15, 2006 * copyright 2006 by */ package de.laliluna.library; import java.util.arraylist; import java.util.list; import java.util.set; JEE vs Rails import javax.persistence.cascadetype; import javax.persistence.entity; import javax.persistence.fetchtype; import javax.persistence.generatedvalue; import javax.persistence.generationtype; import javax.persistence.id; import javax.persistence.onetomany; import javax.persistence.sequencegenerator; import javax.persistence.table; /** hennebrueder @SequenceGenerator(name="customer_sequence", sequencename="customer_id_seq") public class Customer { private Integer id; private String name; Customer id name private List books =new ArrayList(); public Customer(){ super(); public Customer(Integer id, String name){ super(); this.id=id; fetch = FetchType.EAGER, mappedby="customer", targetentity=book.class) public List getbooks() { return books; public void setbooks(list books) { this.books generator="customer_sequence") public Integer getid() { return id; public void setid(integer id) { this.id = id; public String getname() { return name; public void setname(string name) { this.name = public String tostring() { return "Customer: " + getid() + " Name " + getname();

159 Model [..] public class Customer { Customer id name [..] Rails: class Customer < ActiveRecord::Base end Convention: Class Name = Customer => Table Name = Customers sonst: set_table_name( customer )

160 Primary Key sequencename="customer_id_seq") public class Customer { [..] Customer generator="customer_sequence") public Integer getid() { Rails: Entfällt. Convention: Primary Key => id, sequence

161 fetch = FetchType.EAGER, mappedby="customer", targetentity=book.class) public List getbooks() { return books; Customer id name public void setbooks(list books) { this.books = books; Rails: has_many :books Convention: targetentity = Singular des Entitätennames, sonst, :class_name = Book Getter/Setter dynamisch

162 Attributes private Integer id; private String name; private List books =new ArrayList(); public Customer(){ super(); public Customer(Integer id, String name){ super(); this.id=id; this.name=name; public Integer getid() { return id; public void setid(integer id) { this.id = id; public String getname() { return name; public void setname(string name) { this.name = name; Customer id name Rails: create_table :customers do t # keine id spalte t.column :name, :string end Convention: Name der Spalte = Name des Attributs Getter und Setter dynamisch

163 public String tostring() { return "Customer: "+getid()+" Name "+getname(); Customer id name Rails: Entfällt, Default: Duck", "id"=>"1"> Alternativ: def to_s Customer: #{id Name #{name end => "Customer: 1 Name Donald Duck"

164 CustomerDAO, CustomerDAOImpl save/persist merge findall findbyid findbycustomer (BookDAO...) Customer id name Book id name author Rails: Alle Methoden bereits im Framework generisch enthalten findbyx dynamisch -> findbyname, findbyauthor, findbycustomer, findbytitleandauthor...

165 Migration Customer id name * Book id name author class Initial < ActiveRecord::Migration def self.up create_table :books do t t.column :name, :string t.column :author, :string t.column :customer_id, :integer end create_table :customers do t t.column :name, :string end end def self.down drop_table :books drop_table :customers end end

166 Migration Customer id name * Book id name author class Initial < ActiveRecord::Migration def self.up create_table :books do t t.column :name, :string t.column :author, :string t.column :customer_id, :integer end create_table :customers do t t.column :name, :string end end def self.down drop_table :books drop_table :customers end end

167 Migration Customer id name * Book id name author class Initial < ActiveRecord::Migration def self.up create_table :books do t t.column :name, :string t.column :author, :string t.column :customer_id, :integer end create_table :customers do t t.column :name, :string end end def self.down drop_table :books drop_table :customers end end

168 Migration Customer id name * Book id name author class Initial < ActiveRecord::Migration def self.up create_table :books do t t.column :name, :string t.column :author, :string t.column :customer_id, :integer end create_table :customers do t t.column :name, :string end end def self.down drop_table :books drop_table :customers end end

169 Migration Customer id name * Book id name author class Initial < ActiveRecord::Migration def self.up create_table :books do t t.column :name, :string t.column :author, :string t.column :customer_id, :integer end create_table :customers do t t.column :name, :string end end def self.down drop_table :books drop_table :customers end end

170 Migration Customer id name * Book id name author class Initial < ActiveRecord::Migration def self.up create_table :books do t t.column :name, :string t.column :author, :string t.column :customer_id, :integer end create_table :customers do t t.column :name, :string end end def self.down drop_table :books drop_table :customers end end

171 Migration Customer id name * Book id name author class Initial < ActiveRecord::Migration def self.up create_table :books do t t.column :name, :string t.column :author, :string t.column :customer_id, :integer end create_table :customers do t t.column :name, :string end end def self.down drop_table :books drop_table :customers end end

172 Der Code Customer id name * Book id name author class Customer < ActiveRecord::Base end has_many :books class Book < ActiveRecord::Base end belongs_to :customer

173 Perfection in Design This Wikipedia and Wikimedia Commons image is from the user Chris 73 and is freely available at wiki/image:antoine_de_saint-exup%c3%a9ry_lyon.jpg under the creative commons cc-by-sa 2.5 license.

174 Perfection in Design Antoine de Saint-Exupéry This Wikipedia and Wikimedia Commons image is from the user Chris 73 and is freely available at wiki/image:antoine_de_saint-exup%c3%a9ry_lyon.jpg under the creative commons cc-by-sa 2.5 license.

175 Perfection in Design You know you ve achieved perfection in design, not when you have nothing more to add, but when you have nothing more to take away. Antoine de Saint-Exupéry This Wikipedia and Wikimedia Commons image is from the user Chris 73 and is freely available at wiki/image:antoine_de_saint-exup%c3%a9ry_lyon.jpg under the creative commons cc-by-sa 2.5 license.

176 JEE vs Rails Migration Customer Book

177 /** * Sebastian Hennebrueder * created Mar 15, 2006 * copyright 2006 by */ package de.laliluna.library; import java.util.arraylist; import java.util.list; import java.util.set; import javax.persistence.cascadetype; import javax.persistence.entity; import javax.persistence.fetchtype; import javax.persistence.generatedvalue; import javax.persistence.generationtype; import javax.persistence.id; import javax.persistence.onetomany; import javax.persistence.sequencegenerator; import javax.persistence.table; /** hennebrueder @SequenceGenerator(name="customer_sequence", sequencename="customer_id_seq") public class Customer { private Integer id; private String name; private List books =new ArrayList(); public Customer(){ super(); public Customer(Integer id, String name){ super(); this.id=id; fetch = FetchType.EAGER, mappedby="customer", targetentity=book.class) public List getbooks() { return books; public void setbooks(list books) { this.books generator="customer_sequence") public Integer getid() { return id; public void setid(integer id) { this.id = id; public String getname() { return name; public void setname(string name) { this.name = public String tostring() { return "Customer: " + getid() + " Name " + getname(); /** * Sebastian Hennebrueder * created Mar 15, 2006 * copyright 2006 by */ package de.laliluna.library; import java.util.list; import javax.ejb.stateless; import javax.persistence.entity; import javax.persistence.entitymanager; import javax.persistence.persistencecontext; /** hennebrueder * public class CustomerDaoImp implements CustomerDao private EntityManager em; public static final String RemoteJNDIName = CustomerDaoImp.class.getSimpleName() + "/remote"; public static final String LocalJNDIName = CustomerDaoImp.class.getSimpleName() + "/local"; /* (non-javadoc) de.laliluna.example.ejb.customerdao#save(de.laliluna.example.ejb.book) */ public void save(customer customer) { em.persist(customer); /* (non-javadoc) de.laliluna.example.ejb.customerdao#reattach(de.laliluna.example.ejb.book) */ public void merge(customer customer) { em.merge(customer); /* (non-javadoc) de.laliluna.example.ejb.customerdao#findall() */ public List findall() { return em.createquery("from Customer").getResultList(); /* (non-javadoc) de.laliluna.example.ejb.customerdao#findbyid(java.lang.integer) */ public Customer findbyid(integer id) { Customer customer = em.find(customer.class, id); return customer; /** * Sebastian Hennebrueder * created Feb 27, 2006 * copyright 2006 by */ package de.laliluna.library; import java.util.arraylist; import java.util.list; import javax.ejb.stateful; import javax.ejb.stateless; import javax.persistence.entitymanager; import javax.persistence.persistencecontext; import org.apache.log4j.logger; import sun.security.krb5.internal.crypto.bo; /** hennebrueder * public class BookDaoImp implements BookDao private EntityManager em; private Logger log = Logger.getLogger(this.getClass()); /* * (non-javadoc) * de.laliluna.example.ejb.bookdao#save(de.laliluna.example.ejb.book) */ public void save(book book) { log.debug("persist book: " + book); em.persist(book); public void merge(book book) { em.merge(book); public List findall() { log.debug("find All books"); return em.createquery("from Book").getResultList(); public static final String RemoteJNDIName = BookDaoImp.class.getSimpleName() + "/remote"; public static final String LocalJNDIName = BookDaoImp.class.getSimpleName() + "/local"; public Book findbyid(integer id) { return em.find(book.class, id); public List findbycustomer(customer customer) { log.debug("find by customer"); return em.createquery("from Book b where b.customer = :customer").setparameter("customer", customer).getresultlist(); package de.laliluna.library; import java.util.list; import javax.ejb.local; import public interface BookDao { public void save(book book); public void merge(book book); public List findall(); public List findbycustomer(customer customer); public Book findbyid(integer id); /** * Sebastian Hennebrueder * created Mar 15, 2006 * copyright 2006 by */ package de.laliluna.library; import java.util.list; import javax.ejb.local; /** hennebrueder * public interface CustomerDao { public void save(customer customer); public void merge(customer customer); public List findall(); public Customer findbyid(integer id); /** * Sebastian Hennebrueder * created Feb 27, 2006 * copyright 2006 by */ package de.laliluna.library; import java.io.serializable; import javax.persistence.entity; import javax.persistence.generatedvalue; import javax.persistence.generationtype; import javax.persistence.id; import javax.persistence.joincolumn; import javax.persistence.manytoone; import javax.persistence.sequencegenerator; import javax.persistence.table; import org.hibernate.annotations.genericgenerator; /** hennebrueder = = "book_sequence", sequencename = "book_id_seq") public class Book implements Serializable { private Integer id; private String title; private String author; private Customer customer; public Book() { super(); public Book(Integer id, String title, String author) { super(); this.id = id; this.title = title; this.author = "customer_id") public Customer getcustomer() { return customer; public void setcustomer(customer customer) { this.customer = customer; public String getauthor() { return author; public void setauthor(string author) { this.author = GenerationType.SEQUENCE, generator = "book_sequence") public Integer getid() { return id; public void setid(integer id) { this.id = id; public String gettitle() { return title; public void settitle(string title) { this.title = public String tostring() { return "Book: " + getid() + " Title " + gettitle() + " Author " + getauthor(); JEE vs Rails Migration Customer Book

178 /** * Sebastian Hennebrueder * created Mar 15, 2006 * copyright 2006 by */ package de.laliluna.library; import java.util.arraylist; import java.util.list; import java.util.set; import javax.persistence.cascadetype; import javax.persistence.entity; import javax.persistence.fetchtype; import javax.persistence.generatedvalue; import javax.persistence.generationtype; import javax.persistence.id; import javax.persistence.onetomany; import javax.persistence.sequencegenerator; import javax.persistence.table; /** hennebrueder @SequenceGenerator(name="customer_sequence", sequencename="customer_id_seq") public class Customer { private Integer id; private String name; private List books =new ArrayList(); public Customer(){ super(); public Customer(Integer id, String name){ super(); this.id=id; fetch = FetchType.EAGER, mappedby="customer", targetentity=book.class) public List getbooks() { return books; public void setbooks(list books) { this.books generator="customer_sequence") public Integer getid() { return id; public void setid(integer id) { this.id = id; public String getname() { return name; public void setname(string name) { this.name = public String tostring() { return "Customer: " + getid() + " Name " + getname(); /** * Sebastian Hennebrueder * created Mar 15, 2006 * copyright 2006 by */ package de.laliluna.library; import java.util.list; import javax.ejb.stateless; import javax.persistence.entity; import javax.persistence.entitymanager; import javax.persistence.persistencecontext; /** hennebrueder * public class CustomerDaoImp implements CustomerDao private EntityManager em; public static final String RemoteJNDIName = CustomerDaoImp.class.getSimpleName() + "/remote"; public static final String LocalJNDIName = CustomerDaoImp.class.getSimpleName() + "/local"; /* (non-javadoc) de.laliluna.example.ejb.customerdao#save(de.laliluna.example.ejb.book) */ public void save(customer customer) { em.persist(customer); /* (non-javadoc) de.laliluna.example.ejb.customerdao#reattach(de.laliluna.example.ejb.book) */ public void merge(customer customer) { em.merge(customer); /* (non-javadoc) de.laliluna.example.ejb.customerdao#findall() */ public List findall() { return em.createquery("from Customer").getResultList(); /* (non-javadoc) de.laliluna.example.ejb.customerdao#findbyid(java.lang.integer) */ public Customer findbyid(integer id) { Customer customer = em.find(customer.class, id); return customer; /** * Sebastian Hennebrueder * created Feb 27, 2006 * copyright 2006 by */ package de.laliluna.library; import java.util.arraylist; import java.util.list; import javax.ejb.stateful; import javax.ejb.stateless; import javax.persistence.entitymanager; import javax.persistence.persistencecontext; import org.apache.log4j.logger; import sun.security.krb5.internal.crypto.bo; /** hennebrueder * public class BookDaoImp implements BookDao private EntityManager em; private Logger log = Logger.getLogger(this.getClass()); /* * (non-javadoc) * de.laliluna.example.ejb.bookdao#save(de.laliluna.example.ejb.book) */ public void save(book book) { log.debug("persist book: " + book); em.persist(book); public void merge(book book) { em.merge(book); public List findall() { log.debug("find All books"); return em.createquery("from Book").getResultList(); public static final String RemoteJNDIName = BookDaoImp.class.getSimpleName() + "/remote"; public static final String LocalJNDIName = BookDaoImp.class.getSimpleName() + "/local"; public Book findbyid(integer id) { return em.find(book.class, id); public List findbycustomer(customer customer) { log.debug("find by customer"); return em.createquery("from Book b where b.customer = :customer").setparameter("customer", customer).getresultlist(); package de.laliluna.library; import java.util.list; import javax.ejb.local; import public interface BookDao { public void save(book book); public void merge(book book); public List findall(); public List findbycustomer(customer customer); public Book findbyid(integer id); /** * Sebastian Hennebrueder * created Mar 15, 2006 * copyright 2006 by */ package de.laliluna.library; import java.util.list; import javax.ejb.local; /** hennebrueder * public interface CustomerDao { public void save(customer customer); public void merge(customer customer); public List findall(); public Customer findbyid(integer id); /** * Sebastian Hennebrueder * created Feb 27, 2006 * copyright 2006 by */ package de.laliluna.library; import java.io.serializable; import javax.persistence.entity; import javax.persistence.generatedvalue; import javax.persistence.generationtype; import javax.persistence.id; import javax.persistence.joincolumn; import javax.persistence.manytoone; import javax.persistence.sequencegenerator; import javax.persistence.table; import org.hibernate.annotations.genericgenerator; /** hennebrueder = = "book_sequence", sequencename = "book_id_seq") public class Book implements Serializable { private Integer id; private String title; private String author; private Customer customer; public Book() { super(); public Book(Integer id, String title, String author) { super(); this.id = id; this.title = title; this.author = "customer_id") public Customer getcustomer() { return customer; public void setcustomer(customer customer) { this.customer = customer; public String getauthor() { return author; public void setauthor(string author) { this.author = GenerationType.SEQUENCE, generator = "book_sequence") public Integer getid() { return id; public void setid(integer id) { this.id = id; public String gettitle() { return title; public void settitle(string title) { this.title = public String tostring() { return "Book: " + getid() + " Title " + gettitle() + " Author " + getauthor(); class Customer < ActiveRecord::Base has_many :books end class Book < ActiveRecord::Base belongs_to :customer end class Initial < ActiveRecord::Migration def self.up create_table :books do t t.column :name, :string t.column :author, :string t.column :customer_id, :integer end create_table :customers do t t.column :name, :string end end def self.down drop_table :books drop_table :customers end end JEE vs Rails Migration Customer Book

179 /** * Sebastian Hennebrueder * created Mar 15, 2006 * copyright 2006 by */ package de.laliluna.library; import java.util.arraylist; import java.util.list; import java.util.set; import javax.persistence.cascadetype; import javax.persistence.entity; import javax.persistence.fetchtype; import javax.persistence.generatedvalue; import javax.persistence.generationtype; import javax.persistence.id; import javax.persistence.onetomany; import javax.persistence.sequencegenerator; import javax.persistence.table; /** hennebrueder @SequenceGenerator(name="customer_sequence", sequencename="customer_id_seq") public class Customer { private Integer id; private String name; private List books =new ArrayList(); public Customer(){ super(); public Customer(Integer id, String name){ super(); this.id=id; fetch = FetchType.EAGER, mappedby="customer", targetentity=book.class) public List getbooks() { return books; public void setbooks(list books) { this.books generator="customer_sequence") public Integer getid() { return id; public void setid(integer id) { this.id = id; public String getname() { return name; public void setname(string name) { this.name = public String tostring() { return "Customer: " + getid() + " Name " + getname(); /** * Sebastian Hennebrueder * created Mar 15, 2006 * copyright 2006 by */ package de.laliluna.library; import java.util.list; import javax.ejb.stateless; import javax.persistence.entity; import javax.persistence.entitymanager; import javax.persistence.persistencecontext; /** hennebrueder * public class CustomerDaoImp implements CustomerDao private EntityManager em; public static final String RemoteJNDIName = CustomerDaoImp.class.getSimpleName() + "/remote"; public static final String LocalJNDIName = CustomerDaoImp.class.getSimpleName() + "/local"; /* (non-javadoc) de.laliluna.example.ejb.customerdao#save(de.laliluna.example.ejb.book) */ public void save(customer customer) { em.persist(customer); /* (non-javadoc) de.laliluna.example.ejb.customerdao#reattach(de.laliluna.example.ejb.book) */ public void merge(customer customer) { em.merge(customer); /* (non-javadoc) de.laliluna.example.ejb.customerdao#findall() */ public List findall() { return em.createquery("from Customer").getResultList(); /* (non-javadoc) de.laliluna.example.ejb.customerdao#findbyid(java.lang.integer) */ public Customer findbyid(integer id) { Customer customer = em.find(customer.class, id); return customer; /** * Sebastian Hennebrueder * created Feb 27, 2006 * copyright 2006 by */ package de.laliluna.library; import java.util.arraylist; import java.util.list; import javax.ejb.stateful; import javax.ejb.stateless; import javax.persistence.entitymanager; import javax.persistence.persistencecontext; import org.apache.log4j.logger; import sun.security.krb5.internal.crypto.bo; /** hennebrueder * public class BookDaoImp implements BookDao private EntityManager em; private Logger log = Logger.getLogger(this.getClass()); /* * (non-javadoc) * de.laliluna.example.ejb.bookdao#save(de.laliluna.example.ejb.book) */ public void save(book book) { log.debug("persist book: " + book); em.persist(book); public void merge(book book) { em.merge(book); public List findall() { log.debug("find All books"); return em.createquery("from Book").getResultList(); public static final String RemoteJNDIName = BookDaoImp.class.getSimpleName() + "/remote"; public static final String LocalJNDIName = BookDaoImp.class.getSimpleName() + "/local"; public Book findbyid(integer id) { return em.find(book.class, id); public List findbycustomer(customer customer) { log.debug("find by customer"); return em.createquery("from Book b where b.customer = :customer").setparameter("customer", customer).getresultlist(); package de.laliluna.library; import java.util.list; import javax.ejb.local; import public interface BookDao { public void save(book book); public void merge(book book); public List findall(); public List findbycustomer(customer customer); public Book findbyid(integer id); /** * Sebastian Hennebrueder * created Mar 15, 2006 * copyright 2006 by */ package de.laliluna.library; import java.util.list; import javax.ejb.local; /** hennebrueder * public interface CustomerDao { public void save(customer customer); public void merge(customer customer); public List findall(); public Customer findbyid(integer id); /** * Sebastian Hennebrueder * created Feb 27, 2006 * copyright 2006 by */ package de.laliluna.library; import java.io.serializable; import javax.persistence.entity; import javax.persistence.generatedvalue; import javax.persistence.generationtype; import javax.persistence.id; import javax.persistence.joincolumn; import javax.persistence.manytoone; import javax.persistence.sequencegenerator; import javax.persistence.table; import org.hibernate.annotations.genericgenerator; /** hennebrueder = = "book_sequence", sequencename = "book_id_seq") public class Book implements Serializable { private Integer id; private String title; private String author; private Customer customer; public Book() { super(); public Book(Integer id, String title, String author) { super(); this.id = id; this.title = title; this.author = "customer_id") public Customer getcustomer() { return customer; public void setcustomer(customer customer) { this.customer = customer; public String getauthor() { return author; public void setauthor(string author) { this.author = GenerationType.SEQUENCE, generator = "book_sequence") public Integer getid() { return id; public void setid(integer id) { this.id = id; public String gettitle() { return title; public void settitle(string title) { this.title = public String tostring() { return "Book: " + getid() + " Title " + gettitle() + " Author " + getauthor(); class Customer < ActiveRecord::Base has_many :books end class Book < ActiveRecord::Base belongs_to :customer end class Initial < ActiveRecord::Migration def self.up create_table :books do t t.column :name, :string t.column :author, :string t.column :customer_id, :integer end create_table :customers do t t.column :name, :string end end def self.down drop_table :books drop_table :customers end end JEE vs Rails Migration Customer Book Conventions at work!

180

181 Signal / Noise

182 Signal / Noise public void testbook() { Book book = new Book(null,"My first bean book", "Sebastian"); em.persist(book); Book book2 = new Book(null,"another book", "Paul"); em.persist(book2); Book book3 = new Book(null,"EJB 3 developer guide","sebastian"); em.persist(book3); [..] def test_book book = Book.create(:name => "My first bean book", :author => "Sebastian") book2 = Book.create(:name => "another book", :author => "Paul") book3 = Book.create(:name => "EJB 3 dev guide", :author => "Sebastian") [..]

183 Signal / Noise public void testbook() { Book book = new Book(null,"My first bean book", "Sebastian"); em.persist(book); Book book2 = new Book(null,"another book", "Paul"); em.persist(book2); Book book3 = new Book(null,"EJB 3 developer guide","sebastian"); em.persist(book3); [..] def test_book book = Book.create(:name => "My first bean book", :author => "Sebastian") book2 = Book.create(:name => "another book", :author => "Paul") book3 = Book.create(:name => "EJB 3 dev guide", :author => "Sebastian") [..]

184 Signal / Noise [..] System.out.println("list some books"); List somebooks = em.createquery("from Book b where b.author=:name").setparameter("name", "Sebastian").getResultList(); for (Iterator iter = somebooks.iterator(); iter.hasnext();){ Book element = (Book) iter.next(); System.out.println(element); System.out.println("list all books"); List allbooks = em.createquery("from Book").getResultList(); for (Iterator iter = allbooks.iterator(); iter.hasnext();){ Book element = (Book) iter.next(); System.out.println(element); [..] puts "list some books" Book.find_all_by_author("Sebastian").each { book puts book.inspect puts "list all books" Book.find(:all).each { book puts book.inspect

185 Signal / Noise [..] System.out.println("list some books"); List somebooks = em.createquery("from Book b where b.author=:name").setparameter("name", "Sebastian").getResultList(); for (Iterator iter = somebooks.iterator(); iter.hasnext();){ Book element = (Book) iter.next(); System.out.println(element); System.out.println("list all books"); List allbooks = em.createquery("from Book").getResultList(); for (Iterator iter = allbooks.iterator(); iter.hasnext();){ Book element = (Book) iter.next(); System.out.println(element); [..] puts "list some books" Book.find_all_by_author("Sebastian").each { book puts book.inspect puts "list all books" Book.find(:all).each { book puts book.inspect

186 Signal / Noise [..] System.out.println("list some books"); List somebooks = em.createquery("from Book b where b.author=:name").setparameter("name", "Sebastian").getResultList(); for (Iterator iter = somebooks.iterator(); iter.hasnext();){ Book element = (Book) iter.next(); System.out.println(element); JDK 1.5 to the rescue (Generics, foreach) System.out.println("list all books"); List allbooks = em.createquery("from Book").getResultList(); for (Iterator iter = allbooks.iterator(); iter.hasnext();){ Book element = (Book) iter.next(); System.out.println(element); [..] puts "list some books" Book.find_all_by_author("Sebastian").each { book puts book.inspect puts "list all books" Book.find(:all).each { book puts book.inspect

187 Signal / Noise public void testrelation() { [..] Drei Books und zwei Customers angelegt customer1.getbooks().add(book); book.setcustomer(customer1); customer2.getbooks().add(book2); customer2.getbooks().add(book3); [..] Drei Books und zwei Customers angelegt customer1.books << book customer2.books << [book2, book3]

188 Signal / Noise public void testrelation() { [..] Drei Books und zwei Customers angelegt customer1.getbooks().add(book); book.setcustomer(customer1); customer2.getbooks().add(book2); customer2.getbooks().add(book3); [..] Drei Books und zwei Customers angelegt customer1.books << book customer2.books << [book2, book3]

189 Und mehr... class Book < ActiveRecord::Base belongs_to :customer has_many :chapters has_many :sections, :through => :chapters validates_presence_of :author validates_uniqueness_of :name validates_length_of :name, :within => 6..20, :too_long => "pick shorter name", :too_short => "pick longer name" end

190 Batteries included Rails bringt einiges mit: Struktur Build Testunterstützung Entwicklungs-, Test- und Produktionsumgebung Kein eigenes Denken notwendig Skripte und Automatismen verwenden gleiche Lokationen

191 Applikation

192 Applikation

193 Applikation

194 Applikation

195 Applikation

196 Applikation

197 Applikation

198 Applikation

199 Applikation

200 Applikation

201 Umgebung / Konfiguration

202 Umgebung / Konfiguration

203 Umgebung / Konfiguration

204 Umgebung / Konfiguration

205 Umgebung / Konfiguration

206 Umgebung / Konfiguration

207 Umgebung / Konfiguration

208 Umgebung / Konfiguration

209 Umgebung / Konfiguration

210 Umgebung / Konfiguration

211 Static Content / Skripte

212 Static Content / Skripte

213 Static Content / Skripte

214 Static Content / Skripte

215 Static Content / Skripte

216 Static Content / Skripte

217 Static Content / Skripte

218 Static Content / Skripte

219 Test

220 Test

221 Test

222 Test

223 Test

224 Test

225 Test

226 Test

227 wie geht s weiter?

228 Why The Lucky Stiff s: Inklusive Tutorial

229 A language that doesn t affect the way you think about programming is not worth knowing Alan Perlis

230 A language that doesn t affect the way you think about programming is not worth knowing Alan Perlis Jim Weirich s: 10 Things Every Java Programmer Should Now About Ruby Viele Dinge in dieser Präsentation dort geklaut.

231 Pickaxe 2nd edition Umfassend

232 The Ruby Way Umfassend Detailliert Zweites Buch?

233 Ruby for Rails Metaprogrammierung

234 Creating a Weblog in 15 Minutes

235 Agile Web Development with Rails (AWDR) 2nd Edition in Vorbereitung 1st Edition auch in Deutsch erhältlich

236 Rapid Web Development mit Ruby on Rails Deutsch 2nd Edition gerade erschienen

237 Weiterführend

238

239 ... und so lebten sie...

240 ... glücklich...

241 ... bis an s Ende ihrer Tage.

242 Danke! The text of this presentation is licensed under the Creative Commons License, Attribution-ShareAlike 2.5. As I don t have all the rights to the images in this presentation, the images and the Java source code are not covered by this license. I would also like to thank Babie Tanaka and the flickr users letioux and candiedwomanire that granted me the right to use their images. This work is licensed under the Creative Commons Attribution-ShareAlike 2.5 License. To view a copy of this license, visit or send a letter to Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA.

This tutorial explains basics about EJB3 and shows a simple work through to set up a EJB 3 project, create a entity bean and a session bean facade.

This tutorial explains basics about EJB3 and shows a simple work through to set up a EJB 3 project, create a entity bean and a session bean facade. First EJB 3 Tutorial This tutorial explains basics about EJB3 and shows a simple work through to set up a EJB 3 project, create a entity bean and a session bean facade. Do you need expert help or consulting?

More information

1. Was ist das? II. Wie funktioniert das? III. Wo funktioniert das nicht?

1. Was ist das? II. Wie funktioniert das? III. Wo funktioniert das nicht? RubyOnRails Jens Himmelreich 1. Was ist das? II. Wie funktioniert das? III. Wo funktioniert das nicht? 1. Was ist das? abstrakt RubyOnRails RubyOnRails Ruby Programmiersprache * 24. 2. 1993 geboren Yukihiro

More information

Ruby on Rails. Computerlabor

Ruby on Rails. Computerlabor Ruby on Rails Computerlabor Ablauf Einführung in Ruby Einführung in Ruby on Rails ActiveRecord ActionPack ActiveResource Praxis Ruby Stichworte 1995 erschienen, Open Source Entwickelt von Yukihoro Matsumoto

More information

Java Server Pages combined with servlets in action. Generals. Java Servlets

Java Server Pages combined with servlets in action. Generals. Java Servlets Java Server Pages combined with servlets in action We want to create a small web application (library), that illustrates the usage of JavaServer Pages combined with Java Servlets. We use the JavaServer

More information

We are not repeating all the basics here. Have a look at the basic EJB tutorials before you start this tutorial.

We are not repeating all the basics here. Have a look at the basic EJB tutorials before you start this tutorial. Creating Finder for EJB 2 with xdoclet Generals Author: Sascha Wolski http://www.laliluna.de/tutorials.html Tutorials für Struts, JSF, EJB, xdoclet und eclipse. Date: December, 06 th 2004 Software: EJB

More information

Hibernate Language Binding Guide For The Connection Cloud Using Java Persistence API (JAP)

Hibernate Language Binding Guide For The Connection Cloud Using Java Persistence API (JAP) Hibernate Language Binding Guide For The Connection Cloud Using Java Persistence API (JAP) Table Of Contents Overview... 3 Intended Audience... 3 Prerequisites... 3 Term Definitions... 3 Introduction...

More information

Developing an EJB3 Application. on WebSphere 6.1. using RAD 7.5

Developing an EJB3 Application. on WebSphere 6.1. using RAD 7.5 Developing an EJB3 Application on WebSphere 6.1 using RAD 7.5 Introduction This tutorial introduces how to create a simple EJB 3 application using Rational Application Developver 7.5( RAD7.5 for short

More information

How To Create A Model In Ruby 2.5.2.2 (Orm)

How To Create A Model In Ruby 2.5.2.2 (Orm) Gastvortrag Datenbanksysteme: Nils Haldenwang, B.Sc. 1 Institut für Informatik AG Medieninformatik Models mit ActiveRecord 2 Model: ORM pluralisierter snake_case Tabelle: users Klasse: User id first_name

More information

Intruduction to Groovy & Grails programming languages beyond Java

Intruduction to Groovy & Grails programming languages beyond Java Intruduction to Groovy & Grails programming languages beyond Java 1 Groovy, what is it? Groovy is a relatively new agile dynamic language for the Java platform exists since 2004 belongs to the family of

More information

Ruby on Rails is a web application framework written in Ruby, a dynamically typed programming language The amazing productivity claims of Rails is

Ruby on Rails is a web application framework written in Ruby, a dynamically typed programming language The amazing productivity claims of Rails is Chris Panayiotou Ruby on Rails is a web application framework written in Ruby, a dynamically typed programming language The amazing productivity claims of Rails is the current buzz in the web development

More information

Search Engines Chapter 2 Architecture. 14.4.2011 Felix Naumann

Search Engines Chapter 2 Architecture. 14.4.2011 Felix Naumann Search Engines Chapter 2 Architecture 14.4.2011 Felix Naumann Overview 2 Basic Building Blocks Indexing Text Acquisition Text Transformation Index Creation Querying User Interaction Ranking Evaluation

More information

6.170 Tutorial 3 - Ruby Basics

6.170 Tutorial 3 - Ruby Basics 6.170 Tutorial 3 - Ruby Basics Prerequisites 1. Have Ruby installed on your computer a. If you use Mac/Linux, Ruby should already be preinstalled on your machine. b. If you have a Windows Machine, you

More information

JAVA PROGRAMMING PATTERN FOR THE PREFERENCES USABILITY MECHANISM

JAVA PROGRAMMING PATTERN FOR THE PREFERENCES USABILITY MECHANISM JAVA PROGRAMMING PATTERN FOR THE PREFERENCES USABILITY MECHANISM Drafted by Francy Diomar Rodríguez, Software and Systems PhD Student, Facultad de Informática. Universidad Politécnica de Madrid. ([email protected])

More information

Update to V10. Automic Support: Best Practices Josef Scharl. Please ask your questions here http://innovate.automic.com/q&a Event code 6262

Update to V10. Automic Support: Best Practices Josef Scharl. Please ask your questions here http://innovate.automic.com/q&a Event code 6262 Update to V10 Automic Support: Best Practices Josef Scharl Please ask your questions here http://innovate.automic.com/q&a Event code 6262 Agenda Update to Automation Engine Version 10 Innovations in Version

More information

OTN Developer Day Enterprise Java. Hands on Lab Manual JPA 2.0 and Object Relational Mapping Basics

OTN Developer Day Enterprise Java. Hands on Lab Manual JPA 2.0 and Object Relational Mapping Basics OTN Developer Day Enterprise Java Hands on Lab Manual JPA 2.0 and Object Relational Mapping Basics I want to improve the performance of my application... Can I copy Java code to an HTML Extension? I coded

More information

Microsoft Certified IT Professional (MCITP) MCTS: Windows 7, Configuration (070-680)

Microsoft Certified IT Professional (MCITP) MCTS: Windows 7, Configuration (070-680) Microsoft Office Specialist Office 2010 Specialist Expert Master Eines dieser Examen/One of these exams: Eines dieser Examen/One of these exams: Pflichtexamen/Compulsory exam: Word Core (Exam 077-881)

More information

Comparing Dynamic and Static Language Approaches to Web Frameworks

Comparing Dynamic and Static Language Approaches to Web Frameworks Comparing Dynamic and Static Language Approaches to Web Frameworks Neil Brown School of Computing University of Kent UK 30 April 2012 2012-05-01 Comparing Dynamic and Static Language Approaches to Web

More information

Author: Sascha Wolski Sebastian Hennebrueder http://www.laliluna.de/tutorials.html Tutorials for Struts, EJB, xdoclet and eclipse.

Author: Sascha Wolski Sebastian Hennebrueder http://www.laliluna.de/tutorials.html Tutorials for Struts, EJB, xdoclet and eclipse. JUnit Testing JUnit is a simple Java testing framework to write tests for you Java application. This tutorial gives you an overview of the features of JUnit and shows a little example how you can write

More information

ida.com excellence in dependable automation

ida.com excellence in dependable automation IEC 61508 Maintenance Status IEC 61508 Maintenance Projekt ist aus dem zulässigen Zeitrahmen gelaufen Viele Baustellen auch durch neue Mitglieder (Frankreich, USA, IEC 61511 Team) Bestehende Anforderungen,

More information

Web Service Caching Using Command Cache

Web Service Caching Using Command Cache Web Service Caching Using Command Cache Introduction Caching can be done at Server Side or Client Side. This article focuses on server side caching of web services using command cache. This article will

More information

Dynamic website development using the Grails Platform. Joshua Davis Senior Architect Cognizant Technology Solutions joshua.davis@cognizant.

Dynamic website development using the Grails Platform. Joshua Davis Senior Architect Cognizant Technology Solutions joshua.davis@cognizant. Dynamic website development using the Grails Platform Joshua Davis Senior Architect Cognizant Technology Solutions [email protected] Topics Covered What is Groovy? What is Grails? What are the

More information

Thomas Rümmler AIT GmbH & Co. KG Christian Schlag AIT GmbH & Co. KG. Central Build and Release Management with TFS

Thomas Rümmler AIT GmbH & Co. KG Christian Schlag AIT GmbH & Co. KG. Central Build and Release Management with TFS Thomas Rümmler AIT GmbH & Co. KG Christian Schlag AIT GmbH & Co. KG Central Build and Release Management with TFS 2 OUR DAILY MOTIVATION It s hard enough for software developers to write code that works

More information

Embedded Software Development and Test in 2011 using a mini- HIL approach

Embedded Software Development and Test in 2011 using a mini- HIL approach Primoz Alic, isystem, Slovenia Erol Simsek, isystem, Munich Embedded Software Development and Test in 2011 using a mini- HIL approach Kurzfassung Dieser Artikel beschreibt den grundsätzlichen Aufbau des

More information

Is Cloud relevant for SOA? 2014-06-12 - Corsin Decurtins

Is Cloud relevant for SOA? 2014-06-12 - Corsin Decurtins Is Cloud relevant for SOA? 2014-06-12 - Corsin Decurtins Abstract SOA (Service-Orientierte Architektur) war vor einigen Jahren ein absolutes Hype- Thema in Unternehmen. Mittlerweile ist es aber sehr viel

More information

Kotlin for Android Developers

Kotlin for Android Developers Kotlin for Android Developers Learn Kotlin in an easy way while developing an Android App Antonio Leiva This book is for sale at http://leanpub.com/kotlin-for-android-developers This version was published

More information

Ruby on Rails. a high-productivity web application framework. blog.curthibbs.us/ http://blog. Curt Hibbs <[email protected]>

Ruby on Rails. a high-productivity web application framework. blog.curthibbs.us/ http://blog. Curt Hibbs <curt@hibbs.com> Ruby on Rails a high-productivity web application framework http://blog blog.curthibbs.us/ Curt Hibbs Agenda What is Ruby? What is Rails? Live Demonstration (sort of ) Metrics for Production

More information

Not your Father s. Java EE. Lars Röwekamp CIO New Technologies. @mobilelarson @_openknowledge

Not your Father s. Java EE. Lars Röwekamp CIO New Technologies. @mobilelarson @_openknowledge Not your Father s @mobilelarson @_openknowledge Java EE Lars Röwekamp CIO New Technologies May I submit my billing info to your merchant account via your payment gateway? Wo liegt das Problem... Too many

More information

Web Development Frameworks

Web Development Frameworks COMS E6125 Web-enHanced Information Management (WHIM) Web Development Frameworks Swapneel Sheth [email protected] @swapneel Spring 2012 1 Topic 1 History and Background of Web Application Development

More information

Kapitel 2 Unternehmensarchitektur III

Kapitel 2 Unternehmensarchitektur III Kapitel 2 Unternehmensarchitektur III Software Architecture, Quality, and Testing FS 2015 Prof. Dr. Jana Köhler [email protected] IT Strategie Entwicklung "Foundation for Execution" "Because experts

More information

How To Manage Build And Release With Tfs 2013

How To Manage Build And Release With Tfs 2013 #dwx14 [email protected] #dwx14 Central Build and Release Management with TFS Thomas Rümmler AIT GmbH & Co. KG Christian Schlag AIT GmbH & Co. KG 1 2 OUR DAILY MOTIVATION It s hard enough for

More information

Building and Deploying Web Scale Social Networking Applications Using Ruby on Rails and Oracle. Kuassi Mensah Group Product Manager

Building and Deploying Web Scale Social Networking Applications Using Ruby on Rails and Oracle. Kuassi Mensah Group Product Manager Building and Deploying Web Scale Social Networking Applications Using Ruby on Rails and Oracle Kuassi Mensah Group Product Manager The following is intended to outline our general product direction. It

More information

Jetzt können Sie den Befehl 'nsradmin' auch für diverse Check-Operationen verwenden!

Jetzt können Sie den Befehl 'nsradmin' auch für diverse Check-Operationen verwenden! NetWorker - Allgemein Tip 642, Seite 1/6 Jetzt können Sie den Befehl 'nsradmin' auch für diverse Check-Operationen verwenden! Seit einiger Zeit (NetWorker 8.2.0?) können Sie mit dem Befehl nsradmin -C

More information

Central Release and Build Management with TFS. Christian Schlag

Central Release and Build Management with TFS. Christian Schlag Central Release and Build Management with TFS Christian Schlag OUR DAILY MOTIVATION It s hard enough for software developers to write code that works on their machine. But even when it s done, there s

More information

APPLICATION SETUP DOCUMENT

APPLICATION SETUP DOCUMENT APPLICATION SETUP DOCUMENT HeiTek Software Development GmbH Add-Ons Oracle Application Change Layout in Receiving Personalisation Example Ref Prepared by HeiTek Software Development GmbH Author: : Georg

More information

Content Management System (Dokument- og Sagsstyringssystem)

Content Management System (Dokument- og Sagsstyringssystem) Content Management System (Dokument- og Sagsstyringssystem) Magloire Segeya Kongens Lyngby 2010 IMM-B.Eng-2010-45 Technical University of Denmark DTU Informatics Building 321,DK-2800 Kongens Lyngby,Denmark

More information

Dozer v.5.5.1 User's Guide

Dozer v.5.5.1 User's Guide ... Dozer v.5.5.1 User's Guide... Franz Garsombke, Matt Tierney, Dmitry Buzdin 2014-04-22 T a b l e o f C o n t e n t s i Table of Contents... 1. Table of Contents...........................................................

More information

Smalltalk in Enterprise Applications. ESUG Conference 2010 Barcelona

Smalltalk in Enterprise Applications. ESUG Conference 2010 Barcelona Smalltalk in Enterprise Applications ESUG Conference 2010 Barcelona About NovaTec GmbH German software consulting company Offering full IT services for complex business applications Software engineering,

More information

Open Text Social Media. Actual Status, Strategy and Roadmap

Open Text Social Media. Actual Status, Strategy and Roadmap Open Text Social Media Actual Status, Strategy and Roadmap Lars Onasch (Product Marketing) Bernfried Howe (Product Management) Martin Schwanke (Global Service) February 23, 2010 Slide 1 Copyright Open

More information

Ruby on Rails An Agile Developer s Framework

Ruby on Rails An Agile Developer s Framework Ruby on Rails An Agile Developer s Framework S. Meenakshi Associate Professor Department of Computer Applications, R.M.K. Engineering College, Kavaraipettai ABSTRACT Agile development framework is a free,

More information

Upgrading Your Skills to MCSA Windows Server 2012 MOC 20417

Upgrading Your Skills to MCSA Windows Server 2012 MOC 20417 Upgrading Your Skills to MCSA Windows Server 2012 MOC 20417 In dieser Schulung lernen Sie neue Features und Funktionalitäten in Windows Server 2012 in Bezug auf das Management, die Netzwerkinfrastruktur,

More information

C:\Documents and Settings\Gijs\Desktop\src\client\Client.java dinsdag 3 november 2009 10:50

C:\Documents and Settings\Gijs\Desktop\src\client\Client.java dinsdag 3 november 2009 10:50 C:\Documents and Settings\Gijs\Desktop\src\client\Client.java dinsdag 3 november 2009 10:50 package client; import hotel.bookingconstraints; import hotel.bookingexception; import hotel.costumersessionremote;

More information

SPICE auf der Überholspur. Vergleich von ISO (TR) 15504 und Automotive SPICE

SPICE auf der Überholspur. Vergleich von ISO (TR) 15504 und Automotive SPICE SPICE auf der Überholspur Vergleich von ISO (TR) 15504 und Automotive SPICE Historie Software Process Improvement and Capability determination 1994 1995 ISO 15504 Draft SPICE wird als Projekt der ISO zur

More information

Safe Harbor Statement

Safe Harbor Statement Logging & Debugging von M(obile)AF Applikationen Jürgen Menge Sales Consultant Oracle Deutschland B.V. & Co. KG Safe Harbor Statement The following is intended to outline our general product direction.

More information

1Copyright 2013, Oracle and/or its affiliates. All rights reserved.

1Copyright 2013, Oracle and/or its affiliates. All rights reserved. 1Copyright 2013, Oracle and/or its affiliates. All rights reserved. The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated

More information

LEARNING AGREEMENT FOR STUDIES

LEARNING AGREEMENT FOR STUDIES LEARNING AGREEMENT FOR STUDIES The Student Last name (s) First name (s) Date of birth Nationality 1 Sex [M/F] Academic year 20../20.. Study cycle EQF level 6 Subject area, Code Phone E-mail 0421 The Sending

More information

Implementing Data Models and Reports with Microsoft SQL Server

Implementing Data Models and Reports with Microsoft SQL Server Implementing Data Models and Reports with Microsoft SQL Server Dauer: 5 Tage Kursnummer: M20466 Überblick: Business Intelligence (BI) wird für Unternehmen von verschiedenen Größen aufgrund des dadurch

More information

Timebox Planning View der agile Ansatz für die visuelle Planung von System Engineering Projekt Portfolios

Timebox Planning View der agile Ansatz für die visuelle Planung von System Engineering Projekt Portfolios Agile Leadership Day 2015 Markus Giacomuzzi - Siemens Building Technologies Headquarters Zug Timebox Planning View der agile Ansatz für die visuelle Planung von System Engineering Projekt Portfolios structure

More information

Ruby & Ruby on Rails for arkitekter. Kim Harding Christensen [email protected]

Ruby & Ruby on Rails for arkitekter. Kim Harding Christensen khc@kimharding.com Ruby & Ruby on Rails for arkitekter Kim Harding Christensen [email protected] Aga Intro & problemstilling Introduktion til Ruby DSL er Introduktion til Ruby on Rails Begreber (MVC & REST) Demo Intro Kim

More information

Lecture 7: Class design for security

Lecture 7: Class design for security Lecture topics Class design for security Visibility of classes, fields, and methods Implications of using inner classes Mutability Design for sending objects across JVMs (serialization) Visibility modifiers

More information

Information Systems 2

Information Systems 2 Information Systems 2 Prof. Dr. Dr. L. Schmidt-Thieme MSc. André Busche Übung 9 0. Allerlei 1. Übung 2. Hands on some things 2.1 Saxon 2.2 Corba 28.06.10 2/ 0. Allerlei 1. Übung 2. Hands on some things

More information

JUnit. Introduction to Unit Testing in Java

JUnit. Introduction to Unit Testing in Java JUnit Introduction to Unit Testing in Java Testing, 1 2 3 4, Testing What Does a Unit Test Test? The term unit predates the O-O era. Unit natural abstraction unit of an O-O system: class or its instantiated

More information

Masters programmes in Computer Science and Information Systems. Object-Oriented Design and Programming. Sample module entry test xxth December 2013

Masters programmes in Computer Science and Information Systems. Object-Oriented Design and Programming. Sample module entry test xxth December 2013 Masters programmes in Computer Science and Information Systems Object-Oriented Design and Programming Sample module entry test xxth December 2013 This sample paper has more questions than the real paper

More information

CommVault Simpana 7.0 Software Suite. und ORACLE Momentaufnahme. Robert Romanski Channel SE [email protected]

CommVault Simpana 7.0 Software Suite. und ORACLE Momentaufnahme. Robert Romanski Channel SE rromanski@commvault.com CommVault Simpana 7.0 Software Suite und ORACLE Momentaufnahme Robert Romanski Channel SE [email protected] CommVaults Geschichte 1988 1996 2000 2002 2006 2007 Gegründet als Business Unit von AT&T

More information

Satzgliedstellung. Regel #4: Adverbien: Die Satzgliedstellung verändert sich nicht, wenn eine adverbiale Bestimmung vorausgeht.

Satzgliedstellung. Regel #4: Adverbien: Die Satzgliedstellung verändert sich nicht, wenn eine adverbiale Bestimmung vorausgeht. Satzgliedstellung Aussagen Die feste Satzgliedstellung im englischen Aussagesatz ist: Subjekt Prädikat Objekt (S P O) Bsp. Meg drinks tea. S P O wird im Hauptsatz auch dann beibehalten, wenn ein Nebensatz

More information

IAC-BOX Network Integration. IAC-BOX Network Integration IACBOX.COM. Version 2.0.1 English 24.07.2014

IAC-BOX Network Integration. IAC-BOX Network Integration IACBOX.COM. Version 2.0.1 English 24.07.2014 IAC-BOX Network Integration Version 2.0.1 English 24.07.2014 In this HOWTO the basic network infrastructure of the IAC-BOX is described. IAC-BOX Network Integration TITLE Contents Contents... 1 1. Hints...

More information

Specialized Programme on Web Application Development using Open Source Tools

Specialized Programme on Web Application Development using Open Source Tools Specialized Programme on Web Application Development using Open Source Tools Objective: At the end of the course, Students will be able to: Understand various open source tools(programming tools and databases)

More information

Vergleich der Versionen von Kapitel 1 des EU-GMP-Leitfaden (Oktober 2012) 01 July 2008 18 November 2009 31 Januar 2013 Kommentar Maas & Peither

Vergleich der Versionen von Kapitel 1 des EU-GMP-Leitfaden (Oktober 2012) 01 July 2008 18 November 2009 31 Januar 2013 Kommentar Maas & Peither Chapter 1 Quality Management Chapter 1 Quality Management System Chapter 1 Pharmaceutical Quality System Principle The holder of a Manufacturing Authorisation must manufacture medicinal products so as

More information

A: Ein ganz normaler Prozess B: Best Practices in BPMN 1.x. ITAB / IT Architekturbüro Rüdiger Molle März 2009

A: Ein ganz normaler Prozess B: Best Practices in BPMN 1.x. ITAB / IT Architekturbüro Rüdiger Molle März 2009 A: Ein ganz normaler Prozess B: Best Practices in BPMN 1.x ITAB / IT Architekturbüro Rüdiger Molle März 2009 März 2009 I T A B 2 Lessons learned Beschreibung eines GP durch das Business läßt Fragen der

More information

Agile Development with Groovy and Grails. Christopher M. Judd. President/Consultant Judd Solutions, LLC

Agile Development with Groovy and Grails. Christopher M. Judd. President/Consultant Judd Solutions, LLC Agile Development with Groovy and Grails Christopher M. Judd President/Consultant Judd Solutions, LLC Christopher M. Judd President/Consultant of Judd Solutions Central Ohio Java User Group (COJUG) coordinator

More information

STORM. Simulation TOol for Real-time Multiprocessor scheduling. Designer Guide V3.3.1 September 2009

STORM. Simulation TOol for Real-time Multiprocessor scheduling. Designer Guide V3.3.1 September 2009 STORM Simulation TOol for Real-time Multiprocessor scheduling Designer Guide V3.3.1 September 2009 Richard Urunuela, Anne-Marie Déplanche, Yvon Trinquet This work is part of the project PHERMA supported

More information

Implementing Rexx Handlers in NetRexx/Java/Rexx

Implementing Rexx Handlers in NetRexx/Java/Rexx Institut für Betriebswirtschaftslehre und Wirtschaftsinformatik Implementing Rexx Handlers in NetRexx/Java/Rexx The 2012 International Rexx Symposium Rony G. Flatscher Wirtschaftsuniversität Wien Augasse

More information

Language considerations for developing VoiceXML in German

Language considerations for developing VoiceXML in German Language considerations for developing VoiceXML in German This section contains information that is specific to German. If you are developing German voice applications, use the information in this section,

More information

Specialized Programme on Web Application Development using Open Source Tools

Specialized Programme on Web Application Development using Open Source Tools Specialized Programme on Web Application Development using Open Source Tools A. NAME OF INSTITUTE Centre For Development of Advanced Computing B. NAME/TITLE OF THE COURSE C. COURSE DATES WITH DURATION

More information

Testen mit Produktionsdaten Fluch oder Segen?

Testen mit Produktionsdaten Fluch oder Segen? Testen mit Produktionsdaten Fluch oder Segen? Thomas Baumann Die Mobiliar ISACA After Hours Seminar Dienstag, 30.Oktober 2012 2 Agenda PART I: Copy from Production to Test Requirements Solutions and experiences

More information

Mit einem Auge auf den mathema/schen Horizont: Was der Lehrer braucht für die Zukun= seiner Schüler

Mit einem Auge auf den mathema/schen Horizont: Was der Lehrer braucht für die Zukun= seiner Schüler Mit einem Auge auf den mathema/schen Horizont: Was der Lehrer braucht für die Zukun= seiner Schüler Deborah Löwenberg Ball und Hyman Bass University of Michigan U.S.A. 43. Jahrestagung für DidakEk der

More information

This tutorial has been designed for beginners who would like to use the Ruby framework for developing database-backed web applications.

This tutorial has been designed for beginners who would like to use the Ruby framework for developing database-backed web applications. About the Tutorial Ruby on Rails is an extremely productive web application framework written in Ruby by David Heinemeier Hansson. This tutorial gives you a complete understanding on Ruby on Rails. Audience

More information

Coffee Break German. Lesson 09. Study Notes. Coffee Break German: Lesson 09 - Notes page 1 of 17

Coffee Break German. Lesson 09. Study Notes. Coffee Break German: Lesson 09 - Notes page 1 of 17 Coffee Break German Lesson 09 Study Notes Coffee Break German: Lesson 09 - Notes page 1 of 17 LESSON NOTES ICH SPRECHE EIN BISSCHEN DEUTSCH In this lesson you will learn how to deal with language problems

More information

Introduction U41241-J-Z125-1-76 1

Introduction U41241-J-Z125-1-76 1 Introduction The rapid expansion of the Internet and increasingly mobile and more powerful end devices are the driving force behind development in information and communication technology. This process

More information

Mobile App Design Project #1 Java Boot Camp: Design Model for Chutes and Ladders Board Game

Mobile App Design Project #1 Java Boot Camp: Design Model for Chutes and Ladders Board Game Mobile App Design Project #1 Java Boot Camp: Design Model for Chutes and Ladders Board Game Directions: In mobile Applications the Control Model View model works to divide the work within an application.

More information

by Jonathan Kohl and Paul Rogers 40 BETTER SOFTWARE APRIL 2005 www.stickyminds.com

by Jonathan Kohl and Paul Rogers 40 BETTER SOFTWARE APRIL 2005 www.stickyminds.com Test automation of Web applications can be done more effectively by accessing the plumbing within the user interface. Here is a detailed walk-through of Watir, a tool many are using to check the pipes.

More information

Computer Programming I

Computer Programming I Computer Programming I Levels: 10-12 Units of Credit: 1.0 CIP Code: 11.0201 Core Code: 35-02-00-00-030 Prerequisites: Secondary Math I, Keyboarding Proficiency, Computer Literacy requirement (e.g. Exploring

More information

PASS Deutschland e.v. Regionalgruppe Köln/Bonn/Düsseldorf

PASS Deutschland e.v. Regionalgruppe Köln/Bonn/Düsseldorf PASS Deutschland e.v. Regionalgruppe Köln/Bonn/Düsseldorf dbwarden Agenda Vorstellung Überblick Installation Settings Jobs Health Report IT Leiter / zertifizierter IT Projektleiter IT Team mit 7 Mitarbeitern

More information

Canonical Text Service

Canonical Text Service Canonical Text Service Jochen Tiepmar BigData Competence Center ScaDS Naural Language Processing Leipzig University Survey From 20.06.2015 to 30.08.2015 Anonym, no tracking, skipping allowed Recall 25.06.2015

More information

Tobias Flohre codecentric AG. Ein Standard für die Batch- Entwicklung JSR-352

Tobias Flohre codecentric AG. Ein Standard für die Batch- Entwicklung JSR-352 Tobias Flohre Ein Standard für die Batch- Entwicklung JSR-352 Tobias Flohre Düsseldorf @TobiasFlohre www.github.com/tobiasflohre blog.codecentric.de/en/author/tobias.flohre [email protected]

More information

Exemplar for Internal Assessment Resource German Level 1. Resource title: Planning a School Exchange

Exemplar for Internal Assessment Resource German Level 1. Resource title: Planning a School Exchange Exemplar for internal assessment resource German 1.5A for Achievement Standard 90887! Exemplar for Internal Assessment Resource German Level 1 Resource title: Planning a School Exchange This exemplar supports

More information

O D B C / R O C K E T ( B S 2 0 0 0 / O S D ) V 5. 0 F O R S E S A M / S Q L D A T E : F E B R U A R Y 2 0 0 8 *2 R E L E A S E N O T I C E

O D B C / R O C K E T ( B S 2 0 0 0 / O S D ) V 5. 0 F O R S E S A M / S Q L D A T E : F E B R U A R Y 2 0 0 8 *2 R E L E A S E N O T I C E O D B C / R O C K E T ( B S 2 0 0 0 / O S D ) V 5. 0 F O R S E S A M / S Q L D A T E : F E B R U A R Y 2 0 0 8 *2 R E L E A S E N O T I C E RELEASE NOTICE ODBC/ROCKET (BS2000/OSD) V 5.0 1 General.......................

More information

Using Filter as JEE LoadBalancer for Enterprise Application Integration(EAI)

Using Filter as JEE LoadBalancer for Enterprise Application Integration(EAI) Using Filter as JEE LoadBalancer for Enterprise Application Integration(EAI) Traffic Web Protect Plus Overview The JEE LoadBalancer Filter is an pure JEE Web Component for high traffic environments. The

More information

Moving from CS 61A Scheme to CS 61B Java

Moving from CS 61A Scheme to CS 61B Java Moving from CS 61A Scheme to CS 61B Java Introduction Java is an object-oriented language. This document describes some of the differences between object-oriented programming in Scheme (which we hope you

More information

Die SharePoint-Welt für den erfahrenen.net- Entwickler. Fabian Moritz MVP Office SharePoint Server

Die SharePoint-Welt für den erfahrenen.net- Entwickler. Fabian Moritz MVP Office SharePoint Server Die SharePoint-Welt für den erfahrenen.net- Entwickler Fabian Moritz MVP Office SharePoint Server 1 SharePoint Object Model IFilter Webpart Connections Webparts Web Server Controls Custom Field Types Web

More information

Ruby in the context of scientific computing

Ruby in the context of scientific computing Ruby in the context of scientific computing 16 January 2014 1/24 Overview Introduction Characteristics and Features Closures Ruby and Scientific Computing SciRuby Bioruby Conclusion References 2/24 Introduction

More information

SPECTRUM IM. SSA 3.0: Service AND Event/Alert Umbrella DACHSUG 2011

SPECTRUM IM. SSA 3.0: Service AND Event/Alert Umbrella DACHSUG 2011 SPECTRUM IM Infrastructure Events and Alerts Overview Event Management and Correlation Event Rules Condition Correlation Event Procedures Event Integration South-Bound-GW Event Notifications SSA 3.0: Service

More information

FOR TEACHERS ONLY The University of the State of New York

FOR TEACHERS ONLY The University of the State of New York FOR TEACHERS ONLY The University of the State of New York REGENTS HIGH SCHOOL EXAMINATION G COMPREHENSIVE EXAMINATION IN GERMAN Friday, June 15, 2007 1:15 to 4:15 p.m., only SCORING KEY Updated information

More information

AnyWeb AG 2008 www.anyweb.ch

AnyWeb AG 2008 www.anyweb.ch HP SiteScope (End-to-End Monitoring, System Availability) Christof Madöry AnyWeb AG ITSM Practice Circle September 2008 Agenda Management Technology Agentless monitoring SiteScope in HP BTO SiteScope look

More information

Usability in SW-Engineering-Prozessen und in CMMI

Usability in SW-Engineering-Prozessen und in CMMI Workshop USABILITY VDE Prüf- und Zertifizierungsinstitut Strategiekreis i-12 Usability in SW-Engineering-Prozessen und in CMMI Helmut Thoma Schweizer Informatik Gesellschaft Lehrbeauftragter Universität

More information

Exchange Synchronization AX 2012

Exchange Synchronization AX 2012 Exchange Synchronization AX 2012 Autor... Pascal Gubler Dokument... Exchange Synchronization 2012 (EN) Erstellungsdatum... 25. September 2012 Version... 2 / 17.06.2013 Content 1 PRODUKTBESCHREIBUNG...

More information

Ruby on Rails Web Mashup Projects

Ruby on Rails Web Mashup Projects Ruby on Rails Web Mashup Projects A step-by-step tutorial to building web mashups Chang Sau Sheong Chapter No. 2 "'Find closest' mashup plugin" In this package, you will find: A Biography of the author

More information