Teil 2 ======
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 ====
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/)
# Danke!