Gliederung
----------
> 1. Die Kommandozeile
> 2. Ruby
> 3. Ein Programm: Kwic
> 4. Hilfe zur Selbsthilfe
Die Kommandozeile
=================
## Ein Relikt alter Zeiten?
> * Unix-Philosophie
> * Eine mächtige Programmierumgebung
> * Wird bleiben!
Ein paar wichtige Befehle
-------------------------
> - `ls` -- zeigt den Verzeichnisinhalt an
> - `cd` -- wechselt das Verzeichnis
> - `pwd` -- "present working directory"
> - `mkdir` - erstellt ein Verzeichnis
> - `touch` -- erschafft eine Datei
> - `cp` -- kopiert eine Datei
> - `mv` -- verschiebt eine Datei
> - `rm` - löscht eine Datei
> - `man` -- ruft die Hilfeseite auf
Ruby
----
> - Höhere Skriptsprache
> - Objektorientiert
> - Frei und open source
> - 1995 von Yukihiro 'Matz' Matsumoto veröffentlicht
> - Elemente aus Perl, Smalltalk, Ada und Lisp
> - Webentwicklung (Ruby on Rails) und Systemadministration
Note:
- Muss interpretiert werden vom Ruby-Interpreter</li>
- Alles in Ruby ist ein Objekt!</li>
- Ruby Community gilt als besonders freundlich. Als Grund wird immer genannt: Weil Matz freundlich ist.</li>
- Besonders einfache Syntax: beinahe wie Englisch zu lesen</li>
- Prinzip der geringsten Überraschung</li>
- Twitter und die meisten Online-Shops</li>
- Aufgaben zur Systemadministration lassen sich sehr leicht automatisieren.</li>
Ein Beispiel: Semesterdaten
---------------------------
``` {.ruby}
#!/usr/bin/env ruby
require 'date'
semester_start = Date.new(2017, 10, 9)
semester_end = Date.new(2018, 2, 2)
dates = []
day = ARGV.shift
if day.nil?
puts 'Outputs the dates of a given weekday in the winter semester 2017/18.'
puts
abort 'USAGE: semester_dates weekday'
end
(semester_start..semester_end).each do |date|
case day
when 'monday'
dates << date if date.monday?
when 'tuesday'
dates << date if date.tuesday?
when 'wednesday'
dates << date if date.wednesday?
when 'thursday'
dates << date if date.thursday?
when 'friday'
dates << date if date.friday?
when 'saturday'
dates << date if date.saturday?
when 'sunday'
dates << date if date.sunday?
else
abort 'ERROR: Please enter a weekday as an argument.'
end
end
# Delete the days during Christmas Holidays
dates.delete_if { |date| date > Date.new(2017, 12, 24) && date < Date.new(2018, 1, 6) }
# Delete if Tag der Deutschen Einheit
dates.delete_if { |date| date == Date.new(2017, 10, 3) }
# Delete if Allerheiligen
dates.delete_if { |date| date == Date.new(2017, 11, 1) }
# Format dates according to DD.MM.YYYY
dates.collect! { |d| d.strftime('%d.%m.%Y') }
puts dates
```
Note:
- Shebang</li>
- require für installierte Bibliotheken</li>
- ARGV und Fehlermeldung</li>
- Case für Verzweigung</li>
- Deten löschen</li>
- Collect, um die Daten zu formatieren</li>
- Ausgabe</li>
Keywords in Context mit Ruby
============================
Aufgabe
-------
> - Suchbegriff in seinem Kontext anzeigen
> - Von der Kommandozeile aufrufbar (Unix-Philosophie!)
> - kein allzu hoher Speicherbedarf auch bei großen Korpora
Objekt erschaffen
-----------------
``` {.ruby}
class Kwic
def initialize(keyword)
@keyword ||= keyword
end
end
concordance = Kwic.new("Suchbegriff")
```
Note:
- Klasse als Bauanleitung</li>
- initialize: Methode zum Erschaffen eines Objektes</li>
- `||=` entweder schon vergeben, oder wird jetzt festgelegt</li>
- Objekt wird erstellt</li>
Daten lesen
-----------
``` {.ruby}
def read_stream
ARGF.each do |line|
process(line)
end
end
```
Note:
ARGF und ARGV als Objekte
Zeilen lesen
------------
``` {.ruby}
class Kwic
def initialize(keyword)
@keyword ||= keyword
@wordlist = []
end
end
def read_stream
ARGF.each do |line|
process(line)
end
end
def process(line)
@wordlist = line.split
search_keyword
end
```
Note:
- `@wordlist` ergänzen</li>
- split, dann neue Methode: search_keyword</li>
Suche
-----
``` {.ruby}
def search_keyword
@wordlist.each_index do |i|
print_keyword_in_context(i) if @wordlist[i] =~ /#{@keyword}/i
end
end
```
Note:
- Each mit Index, dann Block und index übergeben</li>
- if entspricht Regex, nächste Methode</li>
Treffer ausgeben
----------------
``` {.ruby}
def print_keyword_in_context(i)
print_before_keyword(i)
print " #{@wordlist[i]} "
print_after_keyword(i)
end
def print_before_keyword(i)
if i < 4
printf '%*s', width_text_snippet, @wordlist[0, i].join(' ')
else
printf '%*s', width_text_snippet, @wordlist[i - 4, 4].join(' ')
end
end
def print_after_keyword(i)
if i + 4 >= @wordlist.length
last = @wordlist.length - 1
printf '%-*s\n', width_text_snippet, @wordlist[i + 1, last].join(' ')
else
printf '%-*s\n', width_text_snippet, @wordlist[i + 1, 4].join(' ')
end
end
```
Note:
- print im Unterschied zu puts</li>
- if entspricht Regex, nächste Methode</li>
Das ganze Skript
----------------
``` {.ruby}
class Kwic
def initialize(keyword)
@keyword ||= keyword
@wordlist = []
end
def read_stream
ARGF.each do |line|
process(line)
end
end
def process(line)
@wordlist = line.split
search_keyword
end
def search_keyword
@wordlist.each_index do |i|
print_keyword_in_context(i) if @wordlist[i] =~ /#{@keyword}/i
end
end
def print_keyword_in_context(i)
print_before_keyword(i)
print " #{@wordlist[i]} "
print_after_keyword(i)
end
def print_before_keyword(i)
if i < 4
printf '%*s', width_text_snippet, @wordlist[0, i].join(' ')
else
printf '%*s', width_text_snippet, @wordlist[i - 4, 4].join(' ')
end
end
def print_after_keyword(i)
if i + 4 >= @wordlist.length
last = @wordlist.length - i
printf "%-*s\n", width_text_snippet, @wordlist[i + 1, last].join(' ')
else
printf "%-*s\n", width_text_snippet, @wordlist[i + 1, 4].join(' ')
end
end
def width_text_snippet
(75 - @keyword.length) / 2
end
end
concordance = Kwic::Kwic.new(ARGV.shift)
concordance.read_stream
```
Hilfe zur Selbsthilfe
=====================
## Links
* [Ruby](http://www.ruby-lang.org/de/)
* [Ruby Docs](http://ruby-doc.org)
* [Why's Poignant Guide to Ruby](http://poignant.guide)
* [Stackoverflow](https://stackoverflow.com/questions/tagged/ruby)
## Bücher
* Thomas, Dave, Fowler, Chad, and Hunt, Andy: Ruby Programming. The Pragmatic Programmers' Guide [Pickaxe Book]. Dallas 2013.
* Miller, Rob: Text Processing with Ruby. Extract Value from the Data that Surrounds You. Dallas 2015.
* Olsen, Russ: Eloquent Ruby. Boston 2011.
## Mailing list
* ruby-talk@ruby-lang.org
* ruby-de@ruby-lang.org
## Wichtige Gems
* [Nokogiri](http://www.nokogiri.org)
* [Awsome NLP with Ruby](http://rubynlp.org/)
* [SciRuby](http://sciruby.com/)
* [Awesome Machine Learning with Ruby](https://github.com/arbox/machine-learning-with-ruby)
* [Ruby on Rails](http://rubyonrails.org/)