ruby gem of the week 2007/25

22 06 2007

RealRand Echte Zufallszahlen erzeugen

Installation:

Kein Gem im technischen Sinne, trotzdem paßt es ganz gut hier rein.

Download und nähere Erläuterungen auf der Seite http://realrand.rubyforge.org/

Wer, aus welchem Grunde auch immer, echte Zufallszahlen haben will, sollte sich diese Tool ansehen.

Herkömmliche Zufallszahlen, die man in den üblichen Sprachen ermitteln kann sind nur pseudo-zufällig bzw. können, von einer Anfangszahl ausgehend sogar exakt wiederholt werden. Unter Linux gibt es ein Zufalls-Device, welches Zufallszahlen zurückgibt, die aus verschiedenen Quellen ziemlich nahe an Zufallszahlen herankommen.

Bei dem Tool, das ich heute beschreibe, werden Zufallszahlen geliefert, die aus dem zufälligen radioaktiven Zerfall, atmosphärischem Rauschen, bzw. aus mehreren zufälligen Quellen ermittelt werden.

Es gibt verschiedenen Web-Interfaces bzw. Web-Seiten, die Zufallszahlen anbieten. Dieses „gem“ faßt diese unter einer einheitlichen Oberfläche bzw. API zusammen. Zu beachten ist hier natürlich, daß eine Online-Verbindung ins WWW zur Verfügung stehen muß, wenn diese Services genutzt werden sollen.

Näheres zu den einzelnen Seiten bzw. deren Services unter der oben angegebenen Adresse.

Man kann in diesem gem nun bestimmen, von welcher Seite man Zufallszahlen abrufen will, sowie Anzahl oder Wertebereich der Zufallszahlen.

Ein Beispiel des Autors:

require ‘random/online’

generator1 = Random::RandomOrg.new
puts generator1.randbyte(42).join(„,“)

# Roll the dice a 100 times.
puts generator1.randnum(100, 1, 6).join(„,“)

generator2 = Random::FourmiLab.new
puts generator2.randbyte(7).join(„,“)

generator3 = Random::EntropyPool.new
puts generator3.randbyte(5).join(„,“)

Die Beispiele dürften ziemlich selbsterklärend sein.

randbyte() und randnum() liefern Bytes bzw. ganze Zahlen zurück. Mehr Funktionen gibt es hier auch nicht – aber das reicht ja für dieses Tool aus.

Je nach Quelle gibt es unterschiedliche Parameter, was zum Beispiel den Wertebereich oder die Anzahl der zurückzuliefernden Zahlen angeht. Falls eine dieser Grenzen überschritten wird, wird von diesem Gem eine Fehlermeldung ausgegeben. Bei normalem Gebrauch sollten diese Grenzen aber nicht überschritten werden und nicht weiter interessieren.

Ausblick:

Gibt es Vorschläge, welches Gem ich nächste Woche hier beschreiben soll? Falls nicht, werde ich eines nehmen, das mir persönlich interessant erscheint.





ruby gem of the week

21 06 2007

Ich will versuchen, hier jede Woche ein interessantes Ruby-Gem vorzustellen.

In erster Linie orientiere ich mich daran, was für mich selbst interessant ist, oder in Zukunft vielleicht einmal verwendet wird.

Wenn von der Leserseite jedoch bestimmte Sachen vorgeschlagen werden, die ich mal beschreiben sollte, dann gehe ich auf solche Wünsche natürlich gerne ein, kann allerdings nicht garantieren, daß ich diese wirklich behandeln werde.

Bisher erschienene Artikel:





Roo

20 06 2007

Es ist ja grundsätzlich schon ziemlich interessant, woher ich Rückmeldung auf mein Ruby-Gem roo bekomme.

Zuerst jemand aus Deutschland aus www.rubyforen.de, dann jemand aus Brasilien und gerade noch jemand aus USA.





Wandert nach Belgien aus (flickr zensur)!

16 06 2007

Da flickr nun für deutsche Benutzer zensiert wird, was ich im Grunde weniger Flickr anlaste, sondern der deutschen Gesetzgebung, von der Flickr wohl eingeschüchtert wurde, bin ich Yahoo-ID mäßig nun nach Belgien ausgewandert – geht problemlos und ich kann dann bei meinen Einstellungen bei Flickr auswählen, welche Art von Bilder ich sehen will oder nicht.





ruby gem of the week 2007/24

15 06 2007

DateUtils

Installation:

gem install date_utils

Einbinden mit

require ‘rubygems’
require ‘date_utils’
include DateUtils

Was kann man damit machen? DateUtils erlaubt es, mit Jahres-, Monats-, Wochen- und Tagesobjekten zu arbeiten. Des ist vielleicht noch etwas nebulös, deshalb ein paar Beispiele.

# ein Year-Objekt anlegen
y = Year.new # aktuelles Datum wird verwendet
puts y.to_s
puts y.date
puts y.year
puts y.first_day
puts y.last_day

y = Year.new(Date.new(1961,11,21)) # bestimmtes Datum wird verwendet
puts y.to_s
puts y.date
puts y.year
puts y.first_day
puts y.last_day

y = Year.create(:year => 2007) # Year-Objekt ohne ein bestimmtes Datum
puts y.to_s
puts y.date # gibt den 1.1. aus
puts y.year
puts y.first_day
puts y.last_day

y = Year.new(Date.new(1961,11,21)) # bestimmtes Datum wird verwendet
m = y.get_month(2)
p m
puts m.first_day.to_s
puts m.last_day.to_s
puts m.month.to_s
puts m.num_days.to_s

w = y.get_week(23)
puts w.to_yaml
#— !ruby/object:DateUtils::Week
#date: &id001 1961-05-29
#first_day: 1961-05-29
#last_day: 1961-06-04
#month: !ruby/object:DateUtils::Month
# date: *id001
# first_day: 1961-05-01
# last_day: 1961-05-31
# month: 5
# num_days: 31
# num_week: 22
#
puts w.first_day.to_s
puts w.last_day.to_s

mo = y.months
#puts mo.to_yaml
mo.each {|monat|
puts monat.first_day.to_s
puts monat.last_day.to_s
puts monat.month.to_s
}

next_year = y.next
puts next_year.to_s
p next_year
p y.previous

we = y.weeks
puts we.last.num_week
puts we.last.date.to_s
puts we.last.last_day.to_s
monat_der_letzten_woche = we.last.month
puts monat_der_letzten_woche.to_yaml
#— !ruby/object:DateUtils::Month
#date: 1961-12-25
#first_day: 1961-12-01
#last_day: 1961-12-31
#month: 12
#num_days: 31

# Wochen Objekte
# Objekt mit aktueller Woche anlegen

woche = Week.new
p woche
puts woche.month.month
puts woche.month.num_days
puts woche.first_day.to_s
puts woche.last_day.to_s
puts woche.num_week

naechste_woche = woche.next
puts naechste_woche.to_yaml
vorherige_woche = woche.previous
puts vorherige_woche.to_yaml

tage = woche.days
puts tage.to_yaml

#include? anwendbar fuer Year/Month/Week-Objekte
puts woche.include?(Date.new(2007,6,7))
puts woche.include?(Date.new(2008,6,7))
puts y.include?(Date.new(2008,6,7))

offsets = DateUtils::GMTZone.offsets
puts offsets.to_yaml

Ich denke, die Beispiele sprechen für sich und müssen nicht großartig erklärt werden.

Falls doch noch eine Erklärung gewünscht wird, schreib mir oder kommentiere hier.

Wie man sieht, sind damit recht bequem Datumsberechnungen möglich, bei denen man bei den Standarddatumsfunktionen zuerst eigene Berechnungen schreiben müßte.

Ausblick:

Gibt es Vorschläge, welches Gem ich nächste Woche hier beschreiben soll? Falls nicht, werde ich eines nehmen, das mir persönlich interessant erscheint.





Testbericht W200i

14 06 2007

Insgesamt ein nettes Telefon mit vielen Möglichkeiten: Telefon, MP3-Player, Radio, Kamera.

Allerdings: wie ich gestern feststellte haben die Trantüten bei Sony-Ericsson ein Feature entfernt, das beim T610 noch drin war: Man konnte einmal Termine vom Typ ‘Meeting’ planen (neben anderen Typen), und sobald die Zeit erreicht war, wurde man ggf. daran erinnert (soweit eingestellt) und das Telefon hat automatisch in das Profil ‘Meeting’ gewechselt, in dem man je nach Vorlieben z.B. nur den Vibrationsalarm aktiviert hatte. Dieses Feature ist jetzt entfallen. Das W200i schaltet nicht automatisch in das Meeting-Profil um. Vielmehr muß man das manuell machen.

Ganz toll Sony-Ericsson! Ich habe das immer verwendet, wenn ich in Meetings oder auch ins Kino gegangen bin und das Telefon nicht laut klingeln sollte. Was soll das, so ein nützliches Feature wieder rauszunehmen?





Wagn

10 06 2007

Wagn ist eine Anwendung, ähnlich eines normalen Wikis, aber mit einem etwas anderen Konzept.

Aus der Originalbeschreibung:

Wagn is an innovative tool for gathering and structuring knowledge that is at once easy to use and very powerful. It brings the wiki spirit to structured data– making it accessible, organic, and evolvable.

Man kann damit Webseiten in der Art eines Wikis erstellen, kann es aber auch problemlos lokal verwenden.

Es ist eine Ruby on Rails Anwendung. Die Installation verlief mit der Anleitung auf der Projektseite (lokal) völlig problemlos. Der Autor verwendet standardmäßig eine Postgres-Datenbank – ich habe das in database.yml auf MySQL geändert, was auch problemlos funktionierte.

Informationen werden auf sog. Cards eingegeben. Dort kann mit Links auf auf anderen Cards verlinkt werden (wie bei einem herkömmlichen Wiki auch).

Jetzt könnte man das ganze als einfachen großen „Zettelkasten“ verwenden, bei dem jede Karte einen Titel und Textinhalt besitzt.

Standardmäßig ist nicht jeder Besucher schreibberechtigt. Neue Autoren können aber bequem per Email eingeladen werden und bekommen ein Passwort zugewiesen.

Darüber hinaus kann man jetzt sogenannte related cards anlegen, bzw. von einer Karte auf diese verlinken.Beim Anzeigen einer einzelnen Karte werden dann auch die damit verbundenen Karten angezeigt.

Man könnte beispielsweise auf einer Seite, die ein Projekt beschreibt auf die Liste der beteiligten Personen verweisen.

Scheint mir ein ganz interessantes System zu sein, allerdings habe ich noch nicht so ganz durchschaut, wie man solche Verbindungen richtig anlegt – da muß ich noch ein bißchen damit herumspielen.

Zur Zeit der Erstellung dieses Artikels war die Version 0.6.0 aktuell.

Download unter http://rubyforge.org/projects/wagn





ruby gem of the week 2007/23

10 06 2007

Money

Installation:

gem install money

Einbinden mit

require ‘rubygems’
require ‘money’

Wir legen uns als erstes drei Money-Objekte an:

us = Money.us_dollar(100_00)
cd = Money.ca_dollar(150_00)
eu = Money.euro(200_00)

Eines in der Waehrung US-Dollar, kanadische Dollar und eines in Euro.
Hierbei ist zu beachten, dass der Betrag in Cent angegeben werden muss. Die Notation mit dem ‘_’ ist eine bequeme Art, die Dezimalstellen abzutrennen. Der Unterstrich wird von Ruby bei Zahlen ignoriert und dient nur der besseren Lesbarkeit (kann übrigens auch zur bequemen Darstellung von großen Beträgen verwendet werden: 45_000_000).

Diese Werte koennen jetzt z.B. ausgegeben werden:

puts us.to_s
puts us.format
puts cd.to_s
puts cd.format
puts eu.to_s
puts eu.format(:with_currency)
puts eu.format(:html, :with_currency)

liefert uns:

100.00
$100.00
150.00
$150.00
200.00
$200.00 EUR
$200.00 <span class=“currency“>EUR</span>

letzteres ist fuer die Ausgabe in HTML-Seiten gedacht, und bietet hierfuer schon die class currency an, die in HTML-Seiten ggf. besonders markiert werden kann.

Bei der Ausgabe von Euro-Betraegen faellt auf, dass dieser Ausgabe ein ‘$’ vorangestellt wird, was bei Euro-Betraegen oder anderen Waehrungen natuerlich nicht korrekt ist. Dies muesste man sich ggf. bei der Ausgabe entfernen, indem man das erste Zeichen entfernt. Wahrscheinlich hatte der Autor hier nur den amerikanischen und kanadischen Markt im Auge.

Ein kleines Schmankerl:

kostenlos = Money.us_dollar(0)
puts kostenlos.format

liefert:

„free“

Addieren von Geldbetraegen:

eu = eu + Money.euro(57_00)
puts eu

liefert erwartungsgemaess:

257.00

jetzt wollen wir kanadische Dollars zu US-Dollars addieren:

us = us + cd

was passiert?

/usr/lib/ruby/gems/1.8/gems/money-1.7.1/lib/bank/no_exchange_bank.rb:5:in `reduce’: Current Money::bank does not support money exchange. Please implement a bank object that does and assign it to the Money class. (Money::MoneyError)
from /usr/lib/ruby/gems/1.8/gems/money-1.7.1/lib/money/money.rb:164:in `exchange_to’
from /usr/lib/ruby/gems/1.8/gems/money-1.7.1/lib/money/money.rb:75:in `+’
from money-demo.rb:25

was ist das?

Das heisst, es ist nicht bekannt, wie die beiden Waehrungen ineinander umzurechnen sind.

Was kann man machen?

Man muss eine fuer die Money-Klasse eine ‘Bank’ anlegen. Standardmaessig ist keine Umrechnung moeglich (siehe obige Fehlermeldung: ‘no_exchange_bank’).
Dann definiert man Wechselkurse und danach koennen Umrechnungen vorgenommen, bzw. mit verschiedenen Waehrungen gerechnet werden.

Money.bank = VariableExchangeBank.new
Money.bank.add_rate(„USD“, „CAD“, 1.24515)
Money.bank.add_rate(„CAD“, „USD“, 0.803115)
us = us + cd
puts us

Und siehe da, die Addition klappt nun. Man kann kanadische Dollar zu US-Dollar addieren.

Wenn man dies produktiv einsetzt, kann man sich die Umrechnungskurse aus einer offiziellen Quelle z. B. einmal täglich einlesen und in einer Datenbanktabelle zur weiteren Verwendung speichern.

Man kann auch ein Objekt einer Waehrung umwandeln in ein Objekt einer anderen Waehrung:

Money.us_dollar(100).exchange_to(„CAD“) => Money.ca_dollar(124)

Man kann auch ein Standard-Waehrung einstellen. Folgendes:

Money.default_currency=“EUR“

m = Money.new(123_45)
p m

liefert ein Euro-Money-Objekt

#<Money:0xb784cd28 @currency=“EUR“, @cents=12345>

Das wars in Kuerze zu diesem Gem. Weitere Moeglichkeiten, siehe die Dokumentation unter

http://dist.leetsoft.com/api/money/

Ausblick:

Gibt es Vorschlaege, welches Gem ich naechste Woche hier beschreiben soll? Falls nicht, werde ich eines nehmen, das mir persoenlich interessant erscheint.





Katzenfreundliche Wohnung

7 06 2007

Hi,

ich suche für die nächste Zeit eine neue Wohnung in Berlin. So weit noch nichts besonderes, aber sie sollte so liegen, daß ich meine beiden Kater auch nach draußen lassen kann, ohne daß sie gleich vom nächsten Auto überfahren werden.

Allerdings sollte die Wohnung für mich dann wieder nicht so weit außerhalb liegen, daß man auch gleich aus Land ziehen kann.
Wenn jemand da jemand etwas weiß, daß irgendwo eine Wohnung in einer ruhigen Wohngegend frei ist, würde ich mich über Tipps freuen.

Danke

-Thomas





roo – jetzt auch für Excel-Spreadsheets

1 06 2007

Gestern und heute habe ich noch Support für Excel-Spreadsheets eingebaut.

Dabei verwende ich aber ein anderes gem (parseexcel), welches die nativen Methoden zum Zugriff auf Excel-Dateien zur Verfügung stellt. Meine Methoden sind daher nur ein Wrapper um diese Funktionen, haben aber den Vorteil, daß beide Arten von Spreadsheets mit identischen Funktionen behandelt werden können.

Je nach Typ schreibt man entweder Openoffice.new(„dateipfad“) oder Excel.new(„dateipfad“).