Dragongoserver Gem bei Rubyforge

25 12 2007

Wenn es genehmigt wird, werde ich in Kürze mein fünftes Gem bei Rubyforge veröffentlichen: Ein Kommandozeileninterface fürs Go-Spielen bei Dragongoserver.net.

Das existiert jetzt schon als funktionierendes Ruby-Programm  – ich muß es nur noch schön als Gem verpacken.

Was es bis jetzt kann:

  • in regelmäßigen Abständen den eigenen Account bei Dragongoserver.net abfragen, ob eigene Züge in laufenden Partien anstehen. Die Abfragezeit wird dynamisch angepaßt, so daß, wenn bei den eigenen Partien längere Zeit keine Züge zu tätigen sind, die Abfragezeit laufend erhöht wird (bzw. wieder veringert, wenn in kürzeren Abständen Züge der Gegner erkannt werden).

Was es in Zukunft können soll:

  • Einstellen von neuen Partien in den Waitingroom mit vorgebbaren Parameteren (z. B. Spielfeldgröße, Gesamtspielzeit, etc.) Dies ist teilweise schon programmiert.




roo – Version 0.8.0 fertig

16 12 2007

Es ist vollbracht. Heute habe ich die Version 0.8.0 von Roo veröffentlicht. Die größte Neuerung daran ist, daß man mit roo nun auch auf Google Online Spreadsheets lesend und sogar schreibend zugreifen kann.

Desweiteren wurde die innere Strukur der Klassen etwas bereinigt, was für den Anwender jedoch keine Auswirkungen hat – mir hingegen war es wichtig, eine etwas bessere Struktur reinzubringen, was sich auch für die Zukunft bezahlt macht, wenn noch weitere Spreadsheet-Typen aufgenommen werden sollten.

Hiermit kann man jetzt von Ruby Programmen aus die eigenen Spreadsheets bei Google abrufen oder ändern. Außerdem kann man sogar fremde Spreadsheets von anderen Personen bearbeiten – soweit man dafür vom jeweiligen Eigentümer entsprechend authorisiert wurde.





roo – Version 0.8.0 (bald fertig)

9 12 2007

An diesem Wochenende, wenn im Büro sonst niemand anwesend war, habe ich mich hingesetzt und den größten Teil der Version 0.8.0 von roo geschrieben, mit der nun auch Google-Spreadsheets möglich sind.

Im großen und ganzen sieht es gut aus – kleinere Ungereimtheiten müssen noch getestet und korrigiert werden.

Aber es ist schon cool, wenn man von der irb aus auf seine entfernten Spreadsheets auf dem Google-Server zugreifen kann.





roo – Google Spreadsheets in Kürze auch möglich

8 12 2007

Lange aufgeschoben – habe ich mich in den letzten Tagen aufgemacht, jetzt auch den Zugriff auf Google-Spreadsheets von meinem gem “roo” zu ermöglichen.

Google-Spreadsheets sind wirklich eine coole Sache, zum einen, daß Spreadsheets von jedem Rechner aus aufzurufen sind und zum anderen kann man sich tolle Anwendungen ausdenken, bei denen Daten aus eigenen oder fremden Spreadsheets im Netz gelesen und sogar geschrieben werden können.

Habt noch etwas Geduld – in den nächsten Tagen wird roo auch Google-Spreadsheets bearbeiten können.





roo – Release 0.7.0 veröffentlicht

26 11 2007

Ich habe wieder etwas an roo weiter entwickelt und nach ausführlichen Tests die Version 0.7.0 veröffentlicht.

Die wesentliche Neuerung ist, daß alle Methoden, die bisher mit dem zuvor gesetzten Default-Sheet arbeiten, nun auch mit einem optionalen sheet-Parameter aufgerufen werden können, um ein sheet anzusprechen, das nicht das aktuelle Default-Sheet ist. Dies ist ganz praktisch, wenn man zusätzlich auf Werte eines anderen Sheets zugreifen möchte.

Desweiteren wurden folgenden kleinere Erweiterungen vorgenommen:

  • Excel: CSV-Export optimiert. Dies wirkt sich insbesondere bei etwas größeren Spreadsheets auf die Geschwindigkeit (positiv) aus.
  • column-Methode, um eine gesamte Spalte eines Spreadsheets anzusprechen
  • info-Methode – Liefert allgemeine Informationen über das Spreadsheet als Text zurück
  • find-Methode – eine GANZ SIMPLE Möglichkeit, mit Bedingungen a la Active-Record zu arbeiten. Wie diese anzuwenden ist: Siehe die mitgelieferten Testfälle.




Ruby OpenGeoDB

28 07 2007

Mein viertes Gem bei Rubyforge ist ein Gem, das Geoinformationen aus der freien OpenGeoDB Datenbank in Ruby verarbeiten kann. Siehe http://ruby-opengeodb.rubyforge.org/.

Bisher gab es für den Zugriff darauf nur Lösungen in PHP und nicht für Ruby (zumindest habe ich keine gefunden).

Das Gem kann zur Zeit noch nicht viel. Folgendes ist aber schon möglich: Anhand der PLZ können Ortsname, geografische Koordinaten ermittelt werden. Die Distanz zwischen zwei Objekten in Kilometern kann ermittelt werden.

Einsatzgebiete: Bestimmung des Standorts von Objekten, Personen, etc. anhand der PLZ. Entfernungsberechnung.





Go-Rank

28 07 2007

Mein drittes Gem bei Rubyforge ist eine ganz kleine Klasse, die zeigt, wie man Spielstärke Ränge beim Brettspiel Go in Ruby darstellen kann: http://rubyforge.org/projects/go-rank/





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.





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.








Follow

Bekomme jeden neuen Artikel in deinen Posteingang.