EJB's aanroepen met Ruby

Geplaatst door Danny Lagrouw do, 13 apr 2006 13:25:00 GMT

Nadat ik een paar dagen geleden JRuby had geïnstalleerd en er wat mee had gespeeld, begon ik me af te vragen of je een EJB zou kunnen aanroepen vanuit een JRuby-script. De Java-code waarmee je een EJB aanroept is immers gewoon client code, die met de applicatieserver communiceert over een (in het geval van BEA) HTTP-achtig protocol. In mijn huidige project hebben we een OptimalJ-team dat alle domeincode (Java domeinmodel classes) genereert, en daarbij business services aanlevert (in de vorm van session EJB’s) aan ons, het web frontend team. We ontwikkelen de frontend met BEA WebLogic Portal. Als we nu die EJB’s zouden kunnen aanspreken vanuit JRuby, en Rails zou onder JRuby draaien (wat nog slechts een kwestie van tijd lijkt te zijn), dan zouden we zo’n frontend applicatie in Rails kunnen maken. Dat zou mooi zijn. Ik moet alleen de enterprise architect van het bedrijf in kwestie nog even overtuigen, en hij wordt al horenddol van mijn enthousiaste verhalen over Ruby en Rails…

Maar nu de code! Tot mijn verbazing (na 6 jaar ervaring met EJB’s is alles wat met EJB’s te maken heeft en meteen werkt een grote verrassing) was het slechts een kwestie van de Java-code voor het aanroepen van de EJB, omzetten in JRuby-code. En dan werkt het gewoon. Dit is een voorbeeld van de omgezette code:

require 'java'

include_class 'java.util.Properties'
include_class 'javax.naming.Context'
include_class 'javax.naming.InitialContext'

properties = Properties.new
properties.put(Context::INITIAL_CONTEXT_FACTORY,
    "weblogic.jndi.WLInitialContextFactory")
properties.put(Context::PROVIDER_URL, "t3://localhost:7001")
context = InitialContext.new(properties)
home = context.lookup("business-ejb-jndi-name")
business_ejb = home.create
result = business_ejb.someBusinessMethod(parameters)

Oke, er zijn wat kleine lettertjes. Het voorbeeld werkt op een BEA WebLogic applicatieserver. Voor een andere JEE applicatieserver moet je de classname van de juiste InitialContextFactory invullen. Vul ook de JNDI-naam van de EJB in (achter lookup). Bovendien moet je, vóór je het script draait, de juiste libraries in de CLASSPATH environment variabele zetten. Voor de BEA server moet je bijvoorbeeld weblogic.jar nemen en de EJB client jar (die de home interface van de EJB bevat). Maar als je dat hebt uitgezocht, zou het moeten werken; ik heb het bijvoorbeeld ook met JBoss aan de praat gekregen. Vraag eventueel een Java-guru in je buurt om hulp.

Ik heb de code verwerkt tot een JRuby module (die je hier kunt downloaden vanuit de (eindelijk werkende) RubyEnRails Subversion repository). Met deze module hoef je alleen nog het volgende te schrijven voor het aanroepen van een EJB naar keuze:

require 'rejb'
business_ejb = Rejb::ejb("business-ejb-jndi-name")
result = business_ejb.someBusinessMethod(parameters)

Geplaatst in  | geen reacties

RubyEnRails 2006 update

Geplaatst door Danny Lagrouw ma, 10 apr 2006 03:21:00 GMT

Locatie

Update: Omdat het aantal inschrijvingen voor RubyEnRails 2006 onze stoutste verwachtingen overtreft, zijn we genoodzaakt uit te wijken naar een andere, nog fraaiere locatie: Huis de Voorst bij Zutphen. Op de website van Huis de Voorst is een routebeschrijving te vinden. Voor wie met het openbaar vervoer komt wordt (vanaf NS-station Zutphen) vervoer naar het kasteel verzorgd.

Bevestiging

Update: Als je je hebt ingeschreven voor RubyEnRails 2006 ontvang je deze week (17) nog een bevestiging. Als je je hebt ingeschreven maar geen bevestiging ontvangt, laat dat dan weten via email (ruby AT profict nl). Als je je nog niet hebt ingeschreven, doe dat dan snel ; het aantal plaatsen is beperkt!

Programma

Het programma voor RubyEnRails 2006 op 18 mei begint langzaam maar zeker vastere vormen aan te nemen. Een aantal punten zijn onder voorbehoud, maar het programma zal er waarschijnlijk ongeveer als volgt uitzien. In de ochtend zal de nadruk liggen op sessies voor deelnemers met weinig of geen Ruby en Rails ervaring. ’s Middags plannen we meer geavanceerde onderwerpen. Dit is echter geen vaste regel. Tussendoor is er gelegenheid om informeel kennis en ervaring uit te wisselen. Voor een beschrijving van de verschillende sessies: zie www.profict.nl/ruby.
  • 09:00 – 09:30 Ontvangst
  • 09:30 – 10:30 Remco van ‘t Veer en Danny Lagrouw: Workshop On Rails
  • 10:30 – 11:30 Newminds: Ketenintegratie met Rails
  • 11:30 – 12:30 Michiel de Mare: Hoe Ruby Rails mogelijk maakt
  • 12:30 – 13:30 Lunch
  • 13:30 – 15:30 Stefan Kaes: Performance Rails
  • 15:30 – 16:30 Wilco Bauwer: Ruby-compiler voor het Microsoft .Net framework (onder voorbehoud)
  • 16:30 – 17:30 Erik Veenstra: Magie met meta-programmeren in Ruby
  • 17:30 Afsluiting

Geplaatst in , , ,  | geen reacties

Interactief Programmeren

Geplaatst door Michiel de Mare vr, 07 apr 2006 03:36:00 GMT

“Is er wel een goede ontwikkelomgeving voor Ruby en Rails, zoals Eclipse voor Java?” Dat is een van onze Veelgestelde Vragen. Tsja, wat heb je? TextMate is razend populair bij de “Core Developers”. RadRails, gebaseerd op Eclipse, wordt in een hoog tempo verbeterd. Er is natuurlijk altijd VIM. Zelf ben ik verslingerd aan IntelliJ – zelfs goed als je geen Java gebruikt.

Wanneer Ruby-goeroes mij vertelden dat het met Ruby niet zoveel meer uitmaakt welke editor je gebruikt haalde ik meewarig mijn schoulders op (misschien ben ik meer een Tool maven dan zij). Zeker nooit met IntelliJ gewerkt, dacht ik dan.

Toch heb ik de laatste tijd steeds meer het gevoel dat ook een IDE de verkeerde benadering is voor Ruby. IDEalisten (zucht – red.) wijzen je er eindeloos op dat een IDE voor een dynamische taal nooit zoveel kan bieden qua ondersteuning (code completion, refactoring) als een voor een statische taal als Java. Ze wijzen erop dat een IDE nooit kan weten welk type een variabele runtime zal hebben, laat staan welke methoden er runtime aan toegevoegd zullen zijn.

Maar Ruby heeft wel degelijk perfecte code completion! Alleen niet in een IDE, maar in irb (Interactive Ruby), waar je Ruby-process exact weet op welke methoden je object kan reageren. Sowieso breng ik steeds meer tijd door in de rails console. Ik test er mijn code, ik probeer nieuwe truukjes uit, ik voer CRUD-operaties uit via mijn model-classes. Soms gebruik ik mijn editor alleen om er code in te pasten die ik in irb heb geschreven.

Waarom geen ontwikkelomgeving die op dit principe is gebaseerd? (Waarschijnlijk ben ik nu opnieuw een wiel aan het uitvinden dat begraven ligt onder een hele zware grafzerk waar de inscriptie “SmallTalk – Only The Good Die Young” op gebeiteld staat. Het zij zo.) Een paar suggesties voor wat mogelijk zou moeten zijn in deze mythische omgeving:
  • operaties die werken op de project-source
  • refactorings
  • interactief testen van methoden en die kunnen extraheren naar unit tests
  • meerdere windows met syntax highlighting

Dit is maar een gedachtenkronkel, maar ik ben ervan overtuigd dat de toekomst van Ruby ligt in het benutten van haar krachten, en niet in een onmogelijke race om Java IDE’s in te halen.

Geplaatst in  | 2 reacties

From Ruby With With

Geplaatst door Danny Lagrouw vr, 24 maa 2006 12:10:00 GMT

Jarenlang was Pascal mijn favoriete taal, in verschillende verschijningsvormen: UCSD Pascal, Turbo Pascal, Object Pascal en tenslotte Delphi. Inmiddels is het zo’n 6 jaar geleden dat ik voor het laatst iets met Delphi heb gedaan, maar ik mis de taal niet echt. Pascal had echter één keyword dat ontzettend handig kon zijn, en dat (bijvoorbeeld) Java helaas niet heeft overgenomen: with. In Ruby is with niet ingebakken, maar met een trucje lukt het wel (zo las ik in een blogpost van Chris Eidhof, bedankt!). Breid eerst de Object class uit:

class Object
  def with
    yield self
  end
  # het kan nog anders, lees Chris' post!:
end

Daarna kun je with gebruiken op een willekeurig object:

Chatroom.find(1).messages.last.with do |m|
  m.created_at = Time.now
  m.save
  puts "Message: #{m.text} by #{m.user}" 
end

Je ziet, de elegantie zit in het feit dat je de opgezochte message niet in een tijdelijke variabele hoeft te bewaren; die krijg je automatisch in het with block.

Geplaatst in  | geen reacties

Veel te veelgestelde vragen

Geplaatst door Danny Lagrouw do, 23 maa 2006 05:55:00 GMT

Vorige week liep ik weer in de val. Omgeven door enthousiaste Java-ontwikkelaars liet ik me ontglippen dat ik enthousiast ben over Ruby en Rails. Sommige Java-ontwikkelaars reageren in zo’n geval uiterst cynisch: ze vinden Ruby vooral een hype. Anderen zijn wel belangstellend, maar lijken haast medelijden met je te hebben. In het uiterste geval wil iemand nog wel beweren dat “Ruby en(!) Rails zeker een niche-plekje zullen vinden, voor het ontwikkelen van standaard websites.” Misschien vind je dat ik me gewoon niet in zo’n discussie moet mengen. Laat de Java’ers maar lekker door-Eclipsen tot ze groen en geel zien van de getters en de setters. Maar nee, dat is mijn eer te na. Ik wil Ruby en Rails promoten in Nederland; dan moet ik ook tegengas kunnen geven. Keiharde argumenten!

Vandaar dat ik een FAQ-lijstje heb gemaakt, met vragen die je vaak om je oren krijgt als je het woord Ruby of Rails in de mond neemt. Ik heb een blog-page voor dit lijstje gemaakt, zodat ik het steeds verder kan in- en aanvullen. Als je zelf munitie bij wilt dragen, of andere vragen hebt: graag! Doe dat via commentaar op deze post, dan zal ik het verwerken in de FAQ.

  • Zijn Ruby en Rails geen hype, die volgend jaar weer voorbij is?
  • Zullen Ruby en Rails wel aanslaan in Nederland?
  • Maar zou je wel een bankapplicatie ontwikkelen met Ruby en Rails?
  • Zijn Ruby en Rails enterprise-ready?
  • We hebben strategisch gekozen voor Java/J2EE. We hebben veel geld geïnvesteerd in Java: opleidingen, infrastructuur… Dat gaan we niet zomaar overboord zetten voor een heel andere omgeving.
  • Ik heb al zoveel ervaring met Java/J2EE; ik heb geen zin om weer een andere taal te leren.
  • Is er wel een goede ontwikkelomgeving voor Ruby en Rails, zoals Eclipse voor Java?
  • Is Ruby/Rails niet net zoiets als PHP, dus voor het bouwen van simpele websites?
  • Achter Java staat een solide bedrijf: Sun. Ruby en Rails zijn open source. Daarmee heb ik geen enkele garantie dat de software geen bugs bevat, ik heb geen mogelijkheid om support te krijgen, ik weet niet of toekomstige versies van de taal backwards compatible zijn, enzovoort.

Geplaatst in ,  | 6 reacties

favoriete nieuwtje in rails edge

Geplaatst door Remco van 't Veer ma, 20 maa 2006 18:08:00 GMT

In de volgende versie van rails (1.1) worden veel nieuwe dingen geïntroduceerd. Zie voor een continue groeiende lijst het blog bericht van Scott Raymond. Er zitten waanzinnige dingen bij en ik hoop snel weer tijd te hebben (ik zit nu in een verhuizing) om met al dat moois te spelen.

M’n favoriet is delegate. Het is zo’n juweeltje, dat zó voor de hand ligt dat ik me meteen af vroeg waarom dat niet gewoon in ruby zit. Voorbeeldje:

Address = Struct.new(:city, :country)
class Person < Struct.new(:name, :address)
  delegate :city, :to => :address
end

remco = Person.new('remco', Address.new('Amsterdam', 'Nederland'))
p remco.city # => "Amsterdam" 

Dus; definieer twee classes Address en Person waar Person een Address bevat en geef in Person direct toegang tot het city attribuut.

Lees verder ››

Geplaatst in ,

RubyEnRails 2006 inschrijving geopend

Geplaatst door Danny Lagrouw zo, 19 maa 2006 11:45:00 GMT

De voorbereidingen voor de RubyEnRails 2006 dag op 18 mei a.s. zijn nog in volle gang. We zijn nog druk bezig om sprekers te vinden c.q. over te halen (suggesties zijn nog welkom). Naast de Workshop On Rails heeft in ieder geval Erik Veenstra toegezegd een sessie te verzorgen, over meta-programmeren met Ruby. De dag wordt gesponsord door Profict en mogelijk een tweede bedrijf.

Hoewel het programma dus nog niet definitief vaststaat, kun je je al wel inschrijven. Dat geeft ons een beter beeld van hoeveel bezoekers we kunnen verwachten. Voor alle duidelijkheid: deelname aan RubyEnRails 2006 is (dankzij de sponsoring) geheel gratis. Er zijn maximaal zo’n 70 plaatsen beschikbaar. Je kunt je inschrijven op http://www.profict.nl/ruby.

Houd voor nadere informatie deze site in de gaten!

P.S. Kom je ook? Plaats dan onderstaand logo op je site:

Geplaatst in , ,  | 5 reacties

Meta-programmeren met Ruby en Erik

Geplaatst door Danny Lagrouw za, 18 maa 2006 01:24:00 GMT

In de wervelende wereld van het webloggen zou je haast vergeten dat er ook nog dingen bestaan als mailinglists en nieuwsgroepen. En juist op het gebied van Ruby is daar vaak interessante informatie te vinden. Door Erik Veenstra (auteur van o.a. RubyScript2Exe) werd ik gewezen op zijn artikel over meta-meta-programmeren in Ruby, op comp.lang.ruby.

Meta-programmeren zou je kunnen omschrijven als ‘het schrijven van programmatuur die nieuwe programmatuur genereert’. Wie heeft nog nooit een programma geschreven dat een bestand wegschreef dat zelf ook weer programmacode bevat? In Ruby kan het bijvoorbeeld zo:

class Meta
  def test
    # laat random_cmd één van de drie expressies bevatten:
    random_cmd = %w(Time.now `dir` 12345)[rand(3)]

    # maak een nieuw bestand aan, testmeta2.rb:
    open('testmeta2.rb', 'w') do |f|

      # schrijf nieuwe programmacode die de expressie
      # print, weg in het bestand:
      f.print "puts #{random_cmd}" 
    end

    # bonus: voer het nieuw verkregen programma uit:
    system('ruby testmeta2.rb')
  end
end

Meta.new.test

Niet echt elegant, maar het toont het principe, het werkt, en het kan zijn nut hebben. Waarom krijgt dit binnen de Ruby-wereld zoveel aandacht?

Lees verder...

Geplaatst in  | Tags ,  | geen reacties

Ruby en de Zeven Deugden

Geplaatst door Michiel de Mare za, 11 maa 2006 08:52:00 GMT

Dit is een Nederlands blog, en wij citeren dan ook graag Nederlandse informatici:

Elegance is not a dispensable luxury but a factor that decides between success and failure.

Edsgar Dijkstra

Zeven fragmenten van Java-code en het alternatief in Ruby:

1. Short circuit bij nil

Java

if(foo != null) { 
  bar(foo); 
} else { 
  bar(""); 
}

Ruby

bar(foo || "")
Lees verder...

Geplaatst in  | 1 reactie

Opa vertelt...

Geplaatst door Michiel de Mare wo, 08 maa 2006 07:32:00 GMT


  def agenda
    (facade.sollicitaties + facade.agendaItems).
      sort_by {|x| x.datumTijd}.
      reject {|x| x.datumTijd - Time.now > 7.days }.
      map {|x| [x.id, x.datumTijd.strftime('%A'), x.onderwerp, x.typeName]}
  end

Maar Opa, hoe deed u dat vroeger dan?

Lees verder...

Geplaatst in  | geen reacties

Oudere artikelen: 1 ... 8 9 10 11 12