NUUG.topic = Ruby.new Johannes Brodwall Takk til Dave Thomas for bruk av enkelte slides.

Slides:



Advertisements
Liknende presentasjoner
Repetisjon innkapsling static tabell av primitiv datatype LC191D Videregående programmering Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring.
Advertisements

TDD over BDD why and how XP meetup Johannes Brodwall, Programming artist Steria Norway.
Ruby on Rails: Making simple stuff simple “Rails is a full-stack, open-source web framework in Ruby for writing real-world applications with joy and less.
Uke 10 - Sortering, og hvordan lage en klasse for et klassebibliotek 21 okt. 2003, Arne Maus Inst. for informatikk, UiO.
IBM Global Services JavaOne 2007 Ole André Scheie IBM GBS.
Uke 8 - Mer om: Objekter, klasser og pekere
The Trondheim Toll Ring System
Ledelsesinformasjonsystem
1 Java 6 Mer om metoder Tekster Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet i Oslo.
Test-Drevet Utvikling Bowling med
1 Litt om OO og programmering Arne Maus. 2 OO og Java (og C++, C#)  Arven fra Simula  Programstruktur i Java  Generering av objekter  Beskyttelse.
Web Services gjennom eksempler Johannes Brodwall.
Java 12 Mer filbehandling - skrive til fil HashMap Et større eksempel Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet.
Java 4 Mer om forgreninger While-løkker Ole Christian Lingjærde
Objekt, Instanser og referanser + litt til. Objekter  Instanser  En instans er et objekt av en bestemt klasse  Instanser blir laget ved å kalle klassens.
Java 14 Et eksempel fra bioinformatikk: analyse av biologiske sekvenser Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet.
Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Eiendomregister mars 2002 Arne Maus. import java.util.*; import inf101.*; /* Klasse med main() som starter hele programmet */ class EiendomsregisterMain.
Tema: Introduksjon Hvorfor Velocity? Installasjon Velocity VS. JSF / JSP Eksempler Oppsumering.
C# for javaprogrammerere
Åsmund Eldhuset asmunde stud.ntnu.no folk.ntnu.no/asmunde/algdat/
TDT4120 Algoritmer og datastrukturer Introduksjon til øvingsopplegg og programmering i Python Basert på foiler av Åsmund Eldhuset Flikket på og presentert.
En gang til!? .
Jæger: Robuste og sikre systemer INF150 Programmering mandag 2.10 Default values – standardverdier ved oppstart MER OM: Sub-prosedyrer og sub-funksjoner.
Objekt Orientert Programmering (OOP). Objektorientering (OO)1/6 Objektorientering er en grunnleggende måte å organisere komplekse fenomener på.
Web-applikasjoner Prosjekt3 Logging Gruppe 9 Malik Muhammad Naeem Kevan Qureshi.
Programmering i Java versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Objektorientert programmering
1 Information search for the research protocol in IIC/IID Medical Library, 2013.
Hello Again World Programmering for gøy. Innhold Installasjon av Ruby Oppvarming: Binærsøk Oppgave: Finn anagrammer For de interesserte: Gjenta i C For.
Forsommerdugnad I fjor hadde vi en meget vellykket dugnad like før St. Hans, der henslengt hageavfall rundt om.
ADA 95 – del3 Foreleser: Olaf Hallan Graven Bok: Programming in ADA95 (2nd) John Barnes.
Triggere Mutasjoner i basen. Triggers Triggers are stored procedures that execute automatically when something (event) happens in the database: : data.
  Den perfekte julegaven til Javakoden din Johannes Brodwall Steria.
Lightning Talks Oslo XP meetup juli Johannes Brodwall.
OOT Seminar H-97 CORBA Praktisk del. Valg av ORB implementasjon n Har valgt å bruke Visigenic sin ORB implementsjon n ORB’en er 100% Java kodet n Bygger.
Løsningsforslag til MOFScript oppgave. Metamodellen.
02 - Java datatyper Grundlæggende om datatyper og variable.
FINNMARK RUSSIA TROMS NORDLAND NORD- TRONDELAG SWEDEN ESTONIA FINLAND SOR- TRONDELAG MORE OG ROMSDAL OPPLAND HEDMARK SOGN OG FJORDANE TELEMARK HORDALAND.
1 Pointere, referencer, struct’s mv.. 2 Erklæringer Eksempel på erklæringer int i, *ip, f ( ), *fip( ), (*pfi) ( ); Erklærer en integer, en pointer til.
1 | 2010 Internetteknologi 2 (ITNET2) Kort teknisk ASP.NET introduktion Mandag den 4/ Jesper Tørresø.
INF2820 Datalingvistikk – V2012
Tabeller Dette er en tabell, eller array. Den kan defineres sånn som dette: public int[] heltallsTabell = new int[11]; //Her er 11 tabellens lengde for.
GPS simulator Et C# program som sender data fra en GPS fil til RS232 og simulerer en GPS engine. Tre linjer pr. sekund er satt opp.
Problem set 2 By Thomas and Lars PS: Choose the environment, choose many pages per sheet. Problem set 2 Exercise 11/29 Laget av: Thomas Aanensen og Lars.
Planning and controlling a project Content: Results from Reflection for action The project settings and objectives Project Management Project Planning.
 A fjord is a small bit of water between two mountains or cliffs and they are very famous in Norway.
Föreläsning 13 Programmeringsteknik och Matlab 2D1312/2D1305 Inläsning från fil Skriva till fil StringTokenizer Sortering.
INF1000 (Uke 14) Resten av eksamen H03 + del av V05 Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Are Magnus Bruaset og Anja B.
INF1000 (Uke 13) Resten av eksamen H03 + del av V05 Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Are Magnus Bruaset og Arild.
Objekt, Instanser og referanser + litt til. Objekter  Instanser  Kan sees på som det samme. Personen Per kan være både et objekt og en instans av klassen.
Indledende Datalogi /kelk 1 Need to know Løkker Klasser, instanser og Objekter Hvorfor objektorientering? Scope – hvor erklæres en variabel? ”Access Modifiers”
Main metoden n public static void main(String[] args){ } n Inni denne metoden skjer alt! n Det kan bare finnes en main metode per program. n Den kan ligge.
INF Objektorientert programmering
Object  Klassen i java  Alle klasser arver fra denne om ikke noe annet blir spesifisert  ArrayList.add(Object instans)  Alle elementer formes til Object.
INF1000 (Uke 14) Eksamen V06 Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Are Magnus Bruaset og Arild Waaler.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Section 5.4 Sum and Difference Formulas These formulas will be given to you on the test.
Inf1000 (Uke 10) HashMap og ArrayList
The Thompson Schools Improvement Project Process Improvement Training Slides (Current State Slides Only) October 2009.
Primary French Presentation 10 Colours L.I. C’est de quelle couleur?
Dette er et eksempel på plassering av logoene.
IS-102 Interaksjon med objekter
Using nursery rhymes and songs
BilSalg klassedatastruktur Bil klassedatastruktur
Course PEF3006 Process Control Fall 2018 Split-range control
Course PEF3006 Process Control Fall 2017 Split-range control
CMPE 152: Compiler Design April 23 Class Meeting
BilSalg klassedatastruktur Bil klassedatastruktur
Utskrift av presentasjonen:

NUUG.topic = Ruby.new Johannes Brodwall Takk til Dave Thomas for bruk av enkelte slides

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 2 Hva er Ruby? Et programmeringsspråk som er: •Dynamisk typet –Dynamiske variable –Modifiserbare klasser •Objekt-orientert •Script-basert •Transparent •Morsomt

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 3 La oss få bena våte! "Ruby".split(//).each { |c| puts "Give me a '#{c.upcase}'" } 3.times { puts "Ruby!" } String literal Regexp literal Blokk parameterIn string ”eval” Blokk Fixnum literal Iterator metode

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 4 Ruby som et bedre Perl •”ruby –e”, ”ruby –p”, ”ruby –n” •Et enkelt ruby-filter •Ruby-grep #!/usr/bin/ruby –p gsub ”perl”, ”ruby” #!/usr/bin/ruby –n BEGIN { $regex=Regexp.new ARGV.shift } print if $regex.match($_)

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 5 Hvorfor jeg like Ruby 1: Perl-ismer print while gets while gets do gsub ”perl”, ”ruby” end $_ =~ /[Rr]uby/ and print "#$`(((#$&)))#$'” Konklusjon! ruby –pe ’gsub ”perl”, ”ruby”’

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 6 Ruby som en bedre Java public class HelloWorld { public static void main(String[] args) { System.out.println(”hello world”); } puts ”Hello world!”

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 7 Ruby som en bedre Java public class MyComponent { private Color color; private int xpos; private int ypos; public Color getColor() { return this.color; } public void setColor(Color color){ this.color = color; } public int getXPos() { return this.xpos; } public void setXPos(int xpos) { this.xpos = xpos; } public int getYPos() { ZZZZZZzzzzzzzz

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 8 Ruby som en bedre Java public class MyComponent { private Color color; private int xpos; private int ypos; public Color getColor() { return this.color; } public void setColor(Color color){ this.color = color; } public int getXPos() { return this.xpos; } public void setXPos(int xpos) { this.xpos = xpos; } public int getYPos() { ZZZZZZzzzzzzzz class MyComponent attr_accessor :color attr_accessor :xpos attr_accessor :ypos def ypos=(new_pos) raise ”Yo!” if new_pos > = new_pos end c = MyComponent.new c.xpos = 4 c.ypos = 5 # will raise exception c.ypos = c.xpos – 1 c.xpos += 2

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 9 Hva liker jeg ved Ruby? •Enkelt å få interpreteren glad (i motsetning til Perl) •Leser som pseudokode •Super strenghåndtering •Lambda all the way down •Ren OO med godt metatype system

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 10 Strenger, Lister, hash •”hello”, ’hello ”this is quoted” hello’ •/literal reg[Ee]xp?/ (ingen escaping nødvendig) •a = [1, 2, 3, 4] –a[0] => 1 –a[1..3] => [2,3,4] –a[-2..-1] => [3,4] –a[1,2] => [1, 2] •h = { ’a’=>1, 1=>Color.new, [1,2] => ”a” } –h[’a’] => 1 –h[”dgnslgn”] => nil

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 11 Løkker, alternativer •for i in 1..3 do... end •(1..3).each { |i|... } •i=0; until i==3 do i += 1;... ; end •if (... ) { print } •print if... •... and print •print unless...

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 12 Hvorfor jeg liker Ruby 2: Irb, irb, irb irb(main):001:0> m = Hash.new => {} irb(main):002:0> m = { 'a' => 'b', 'r' => [1,2,3] } => {"a"=>"b", "r"=>[1, 2, 3]} irb(main):003:0> m['a'] => "b" irb(main):004:0> m['b'] => nil irb(main):005:0> m['r'] => [1, 2, 3] irb(main):006:0> m['c'] = 15 => 15 irb(main):007:0> m => {"a"=>"b", "c"=>15, "r"=>[1, 2, 3]} irb(main):008:0> m['a'] = "hello world" => "hello world" irb(main):009:0> m => {"a"=>"hello world", "c"=>15, "r"=>[1, 2, 3]} irb(main):010:0> m.delete("r") => [1, 2, 3] irb(main):011:0> m => {"a"=>"hello world", "c"=>15} irb(main):012:0>

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 13 Hvorfor jeg liker Ruby 3: Blokker •Blokker er objekter –Fullstendige medlemmer av språket •Kan evalueres nå, eller senere •Bruk: –Iterasjon –Callbacks –Ressurshåntering •Eksempler fra Dave Thomas’s Ruby presentasjon på rOOTs 2002 (used with permission)

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 14 Blocks and Iterators •Blocks and iterators are pervasive in Ruby 3.times { puts "Ho!" } IO.foreach("/etc/passwd") do |line| process(line) end hash.each { |key, value| puts "#{key} -> #{value}" }

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 15 Blocks and Iterators => one •Method calls block using "yield'' example { |txt| puts txt } def example yield "one" yield "two" end two

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 16 Iterators •Method that calls a block n times •Passes the block zero or more parameters fibUpTo(10) { |n| print n } =>

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 17 Iterators def fibUpTo(max) n1 = n2 = 1 while n1 <= max yield n1 n1, n2 = n2, n1+n2 end fibUpTo(10) { |n| puts n } =>

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 18 Blocks Everywhere DBI.connect("DBI:Pg:my_db") do |db| db.transaction do db.execute("SELECT...") do |stmt| stmt.each do |row| # Process Row end

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 19 Classes and Accessors class Song def = aTitle end attr_reader :title attr_accessor :artist end aSong = Song.new("As Time Goes By") aSong.title# => "As Time..." aSong.artist = "Sam" def end def = val end

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 20 Hvorfor jeg liker Ruby 4: Metakonstruksjoner def Module.once(id) module_eval <<-"end_eval” alias_method :__#{id.to_i}__, #{id.inspect} def #{id.id2name}(*args, = __#{id.to_i}__(*args, &block) def self.#{id.id2name}(*args, end end_eval end def columns # expensive DB-lookup end once :columns Hide old ”columns” for later Redefine ”columns” Redefine ”columns” again(!) Return to result of original ”columns” call

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 21 Utvidet eksempel: Kodegenerator Oracle Database Ruby MetadataKodegen SQL- scripts Arver fra klasse ”DatabaseClass” Instanser: ”Table”, ”View”, ”Column” Utvider de definerte klassene. Bruker ”here-documents”

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 22 Eksempel databaseklasse class Schema < DatabaseObject obj_table_name "ALL_USERS" make_key :owner collection :tables, :Table collection :views, :View collection :triggers, :Trigger collection :procedures, :Procedure collection_where :sequences, :Sequence, [ "SEQUENCE_OWNER" ] end Table to map to Creates attribute, used for SQL generation Creates lazy-loaded attribute that reads from the database using the definitions in class Table Lazy-loaded collection attribute using SQL Needed because ALL_USER has column ”OWNER”, ”ALL_SEQUENCES” has column ”SEQUENCE_OWNER”

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 23 Eksempel kodegenklasse class Table def createTable() "CREATE TABLE #{table_name} (\n" + columns.sort.collect { |column| column.column_def }.join(",\n") + "\n);\n\n" + constraints.values.collect { |cons| cons.alter_constraint_def(table_name) + ";" }.join("\n") end class Column def (other) self.column_id.to_i other.column_id.to_i end def column_def() “#{column_name} \t #{full_type} “ + ( (nullable == "N“) ? " \tNOT NULL" : "") end def full_type # long, boring method returning e.g. “NUMERIC(10,4)” end

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 24 Utvidet eksempel 2: 3-lags app •Database: MySQL •Forretningsobjekt •Dynamisk HTML-side: eruby eller amrita •Ruby HTTPD: WEBRick

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 25 Web Server Web Server 1½ Tier Architecture Business Objects Business Objects Database Application

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 26 Run the Application Web Server Web Server orders.rb Database Application (display.rhtml) Application (display.rhtml) ruby httpd1.rb

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 27 Hvorfor jeg liker Ruby 6: Helt opp, helt ned •Starter like enkelt som Perl •Kan bli mer avansert enn C++, Java, C#

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 28 Innføring av Ruby •Uten å komme i politiske situasjoner –Kodegenerering –Domenespråk •Build-verktøy – Rake •Mailfilter – Gurgitat –Testing –Tekstredigering a-la Perl •Dersom du har full kontroll –Lim-logikk –Web-applikasjoner –Hele programmet!

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 29 Links • • • • gIRuby/ gIRuby/ • •

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 30

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 31 Bonusmateriell •Noen viktige punkter om Ruby •Detaljer kodegenerering •Ruby versus Python, Ruby og andre språk •Make i Ruby: Rake •Procmail i Ruby: gurgitat

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 32 Dette må oxo med •Ruby kan extendes med C •Perl’s regular expression support •mod_ruby •$SAFE •druby •Ruby har et aktivt brukemiljø – men ikke nok brukere i Norge!

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 33 Eksempel databaseklasse class Table < DatabaseObject obj_table_name "ALL_TABLES" make_key :owner, :table_name collection_sql :primary_keys, :Column, "SELECT owner, table_name, column_name FROM ALL_CONS_COLUMNS “ + “where owner = ? AND table_name = ? AND NOT POSITION IS NULL“ collection :columns, :Column collection :constraints, :Constraint collection_where :triggers, :Trigger, ["table_owner", "table_name" ] def column_values columns.values.sort end def column_names column_values.collect { |column| column.column_name } end def pk_constraint constraints.values.find { |cons| cons.constraint_type == "P" } end

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 34 Eksempel kodegenklasse class Table def createTable(table_name = self.table_name) "CREATE TABLE " + table_name + " (\n" + column_values.collect { |column| column.column_def }.join(",\n") + "\n);\n\n" + constraints.values.collect { |cons| cons.alter_constraint_def(table_name) + ";" }.join("\n") end class Column def (other) self.column_id.to_i other.column_id.to_i end def column_def(include_nullable = true) column_name + " \t" + full_type + (nullable == "N" && include_nullable ? " \tNOT NULL" : "") end def full_type # long, boring method returning e.g. “NUMERIC(10,4)” end class Constraint def alter_constraint_def(table_name = self.table_name, ref_postfix = "") return "ALTER TABLE " + table_name + " ADD " + constraint_def(ref_postfix) end def constraint_def # long, boring code returning e.g. “FOREIGN KEY (key) REFERENCES other_tab (key) ON DELETE CASCADE” end

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 35 Alternative kodegeneringsmåter •Bruk here-dokumenter •Bruk eruby (”Embedded Ruby” – JSP- aktig)

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 36 Ruby versus Python Ruby •100% Ren OO •Sann GC •Blokker (versus Python lambda) Filosofisk: Mest mulig frihet til programmereren (som Perl) Python •Konsistent formattering og bruk (one way to do it) •Mer modent bibliotek •Mer (engelsk) doko Filosofisk: Konsistent og fornuftig

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 37 Ruby og andre språk •Perl: Ruby er ”neste skritt”. Lik filosofi. •SmallTalk: Ruby er en mer script-orientert SmallTalk. •Ruby: SmallTalk’s semantikk i perl’s språkdrakt

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 38 Bonus: Rake – Ruby Make # Example Rakefile -*- ruby -*- task :default => [:main] file "main.o" => ["main.c"] do |t| src = t.name.sub(/\.o$/, '.c') Sys.run "gcc #{src} -c -o #{t.name}" end OBJFILES = ["a.o", "b.o", "main.o"] task :obj => OBJFILES file "main" => OBJFILES do |t| Sys.run "gcc -o #{t.name} main.o a.o b.o" end task :clean do Sys.rm '*~', '*.o' end task :run => ["main"] do Sys.run "./main" end

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 39 Bonus: Gurgitat if from =~ /ebay.com/ then save("=ebay"); return; end if then save("=webmaster") return end friendsfile=homedir+"/.friends" if FileTest.readable?(friendsfile) then IO.foreach(friendsfile) do |friend| if from =~ friend.chomp then log "Mail from friend "+friend.chomp save("=friend") return end

Copyright 2004 – Brodwall IT Services (BITS) ANS Slide 40 Bonus: Amrita Order Lookup Order Lookup Description Price require "orders" require "amrita/template" include Amrita class Orders::LineItem include ExpandByMember end $file = TemplateFileWithCache[...] def display_customer(customer, out) o = Orders.new orders = o.orders_for(customer) data = { :rows => orders } $file.expand(out, data) end