Ruby Workshop für Anfänger
Winfried Mueller, www.reintechnisch.de, Start: 28.04.2005, Stand: 29.04.2005
(Begleitendes Workshop Skript, erster Workshop war am 29.04.2005 bei der Dortmunder Linux Gruppe)
Lektion I - Überblick
- Ruby ist eine Skriptsprache, wie Perl, Python, PHP, Shell-Skript
- Quellcode wird intepretiert, nicht zuvor kompiliert
- Ursprung: Japan, erste Release 1995 von Yukihiro "Matz" Matsumoto (* 1965)
- Matz leitet auch heute noch das Ruby-Projekt
- in Japan so verbreitet, wie hier Perl und Python
- Sprachorientierung:
- konsequent objektorientiert -> alles ist ein Objekt
- Ideen aus Perl, Python, Smalltalk u.a.
- "principle of least surprise" - alles soll sich möglichst so verhalten, wie man es erwartet.
- wg. Sprachbarriere der Dokumentation (japanisch) erst stärkere Verbreitung um Jahr 2000 (erstes Ruby Buch in Englisch erscheint). Seither starkes Wachstum in der Anwendung weltweit.
- Ruby im weltweiten Kontext eine junge Sprache. Hat noch lange nicht die Bedeutung, wie Perl oder Python. Wird wahrscheinlich in 5 Jahren ähnlichen Stellenwert haben.
- Ruby ist wie Perl und Python seit Version 1.6 (2002) stabil und für den Produktiveinsatz bestens geeignet.
- plattformunabhängig: verfügbar für Linux, Windows, BSD, Mac OS X, *nix und weitere
- Einsatzgebiete: Wie Perl, Python und PHP auch:
- Werkzeuge Systemadministration
- webbasierte Anwendungen, Webentwicklung
- Prototypen
- Wegwerfskripte
- Kommandozeilen-orientiert und GUI-orientiert
- Netzwerk-Tools
- Datenbankunterstützung für alle gängigen SQL-Datenbanken vorhanden
Lektion II - Ausgabe
# -- Programm 1: Hello World
puts "Hello World!"
# --
# -- Programm 2: Ausgabe Experimente I
print "Hello World!\n" * 3
# --
# -- Programm 3: Ausgabe Experimente II
a = "World"
puts "Hello #{a}!"
puts "Hello " + a + "!"
puts "Hello " + a.upcase + "!"
# --
# -- Programm 4: Ausgabe Experimente III
a = "Hello"
b = "World"
c = 10
printf( "%s %s!\n", a, b )
printf "%s %s!\n", a.upcase, b.upcase
printf "%d x %s %s!\n", c, a.downcase, b.downcase
printf "Laenge a: %d Laenge b: %d\n", a.length, b.length
#--
# -- Programm 5: Ausgabe Experimente IV
printf "Laenge const: %d\n", "Ruby".length
printf "Ruby verschluesselt: %s\n", "Ruby".crypt( "salt" )
printf "Gefunden bei Stelle: %d\n", "Das ist Ruby".index( "Ruby" )
#--
# -- Programm 6: Ausgabe Experimente V
s = "Das ist Ruby"
printf "Ein Teilstring: %s\n", s[8..11]
printf "Ein Teilstring: %s\n", s[8..-1]
# --
Lektion III - Eingabe/Ausgabe
# -- Programm 7: Logdatei lesen und auswerten I
s = File.readlines( "syslog" )
puts s
# --
# -- Programm 8: Logdatei lesen und auswerten I
s = File.readlines( "syslog" )
s.each do |line|
puts line
end
# --
# -- Programm 9: Logdatei lesen und auswerten II
s = File.readlines( "syslog" )
s.each do |line|
if line =~ /cron/i
puts line
end
end
# --
# -- Programm 10: Logdatei lesen und auswerten III
s = File.readlines( "syslog" )
s.each do |line|
if line =~ /^(\w+) (\d+) (\d+):(\d+):(\d+) (\w+) (.*?): (.*)$/
tm = Time.local( "2005", $1, $2, $3, $4, $5 )
host = $6
prg = $7
msg = $8
puts "----"
puts tm
puts " Host: " + host
puts " Programm: " + prg
puts " Message : " + msg
else
raise "Falsche Syslog Zeile"
end
end
# --
# -- Programm 11: Logdatei lesen und auswerten IV
def writer1( tm, host, prg, msg )
puts "----"
puts tm
puts " Host: " + host
puts " Programm: " + prg
puts " Message : " + msg
end
def writer2( a, b, c, d )
printf "%s %s %s\n", a, c, d
end
def msg_select?( tm, host, prg, msg)
if prg =~ /cron/i
return true
else
return false
end
end
s = File.readlines( "syslog" )
s.each do |line|
if line =~ /^(\w+) (\d+) (\d+):(\d+):(\d+) (\w+) (.*?): (.*)$/
tm = Time.local( "2005", $1, $2, $3, $4, $5 )
host = $6
prg = $7
msg = $8
if msg_select?( tm, host, prg, msg )
writer1( tm, host, prg, msg )
end
else
raise "Falsche Syslog Zeile"
end
end
# --
# -- Programm 12: Logdatei lesen und auswerten V
class SyslogMsg
include Comparable
def initialize( tm, host, prg, msg )
@tm = tm
@host = host
@prg = prg
@msg = msg
end
attr_reader :tm, :host, :prg, :msg
def <=>( other )
@tm <=> other.tm
end
def to_s
"----\n" +
tm.to_s + "\n" +
" Host: " + host + "\n" +
" Programm: " + prg + "\n" +
" Message : " + msg + "\n"
end
end
s = File.readlines( "syslog" )
messages = Array.new
s.each do |line|
if line =~ /^(\w+) (\d+) (\d+):(\d+):(\d+) (\w+) (.*?): (.*)$/
tm = Time.local( "2005", $1, $2, $3, $4, $5 )
host = $6
prg = $7
msg = $8
messages << SyslogMsg.new( tm, host, prg, msg )
else
raise "Falsche Syslog Zeile"
end
end
messages.each do |msg|
puts msg if msg.prg[ /cron/i ]
#puts msg if msg > messages[messages.length - 10]
#puts msg if msg < messages[10]
end
# --
Lektion IV - Bisher eingesetzte Sprachmöglichkeiten
Ausgabe:
puts string
puts "Hello World"
puts "Hello" + " " + "World"
print "Hello World\n"
printf "%s %s\n", "Hello", "World"
Einlesen einer Text-Datei:
arr = File.readlines( filename )
Strings:
s = "Hello"
s.upcase
s.downcase
s.length
s[1..3]
s[2..-1]
s.crypt( salt )
s.index( string )
Reguläre Ausdrücke:
if s =~ /ausdruck/
if s =~ /ausdruck/i
Teilausdrücke: $1..$n
Ranges:
1..n
1..-1
Arrays:
arr = [1, 2, 3]
arr = Array.new
arr.each do |element|
...
end
puts arr[index]
arr[index] = object
arr << object
Methoden/Funktionsdefinition:
def my_methode( par1 )
return par1 + 1
end
Klassen:
class MyClass
def initialize( par1, par2 )
@obj_var1 = par1
@obj_var2 = par2
end
attr_reader :obj_var1, :obj_var2
def my_methode( par1 )
r = "Return Value"
return r
end
def +( other )
@obj_var1 + other.obj_var1
end
end
my_obj = MyClass.new( 10, 20 )
Kontrollstrukturen:
if ausdruck
...
else
...
end
puts "Hello" if ausdruck
Symbole:
:name
Fehlerbehandlung:
raise "Fehler"
Variablen:
lokale Variablen:
a = 10
s = "Hello"
globale Variablen:
$a = 10
$str = "Hello"
Konstanten:
A = 10
STR = "Hello"
Syntax-Infos:
- Bezeichner, die mit Großbuchstaben beginnen:
- Klassennamen
- Konstanten
- Bezeichner, die mit Kleinbuchstaben beginnen:
- lokale Variablen
- Methoden
- Objekt-Variablen
- Einrückungen nur für Lesbarkeit
- Kein Semikolon am Ende einer Anweisung (Perl, C, PHP)
- Blöcke entweder begin...end oder {...}
Lektion V - Ausblick
Grundlegende Klassen:
- String
- Array
- Hash
- Fixnum
- Float
- File, IO
- Dir
- Proc
- Range
- Regexp
- Time
- Module Comparable
- Module Enumerable
- Module Kernel
- NilClass
- TrueClass, FalseClass
Kontrollstrukturen:
- case
- if
- loop
- while, until
- for
- next, break, redo
- Fehlerbehandlung: rescue, ensure, raise
Gute Unterstützung in Ruby:
- Textmanipulation (regexp, Parser, Lexer, Formatierung, Konverter)
- Netzwerk
- Mail: smtp, pop3, IMAP, Mailmanipulation, Mailgenerierung
- Internet: http, ftp, ssl, eigenständiger Webserver (webrick), XML
- Shell: telnet, ssh
- Webentwicklung: mehrere Web-Frameworks (Ruby On Rails, Wee, Amrita, Nitro), Bildbearbeitung mit ImageMagick
- Client/Server Programming: Distributed Ruby (dRuby)
- Socket-Programmierung: tcpsocket, udpsocket ...
- Administration
- syslog
- tar, zlib
- Encryption
- Multithreading
- Server/Daemons
- XML
- Bildbearbeitung mit ImageMagick
- GUI
- Fox GUI
- Ruby TK
- Windows
- Zugriff auf Windows API, DLL-Zugriff, OLE-Zugriff
- Registry-Manipulation
- Datenbank
- Zugriff auf alle gängigen SQL-Datenbanken
- einheitliches Interface, Kapselung der darunterliegenden Datenbank
- objektorientierte Datenbankadapter (z.B. Nitro/ Og)
- Persistenz/Serialisierungssprachen
- PStore - Objekte auf Festplatte ablegen
- YAML - Serialisierungssprache, auch ideal für Configdateien
- IRB: interaktiv Ruby Shell
- Dokumentation:
Weblinks
- http://www.ruby-lang.org
- http://www.rubyforge.org
- http://www.rubyforen.de
- http://www.rubywiki.de
- http://www.wikidorf.de/reintechnisch/Inhalt/LinksRuby
- http://www.wikidorf.de/reintechnisch/Inhalt/RubyWeblog
- http://www.wikidorf.de/reintechnisch/Inhalt/EinladungInRuby
- http://www.wikidorf.de/reintechnisch/Inhalt/RubyOptParse
- http://www.wikidorf.de/reintechnisch/Inhalt/RSRsplitRb
- http://www.yaml.org