Archiv

Posts Tagged ‘Diverses’

Prolog: Kleine Unterschiede, grosse Wirkung

7. September 2011 1 Kommentar

Beim Durcharbeiten der “Hausaufgaben” von „Sieben Wochen, sieben Sprachen“ hatte ich beim Kapitel zu Prolog einige Schwierigkeiten zu lösen. Da ich mich sonst nicht mit Prolog beschäftige dauerte es recht lange bis ich meinen Fehler finden konnte. Auch wenn ich diesen Blog-Eintrag primär als Gedankenstütze für mich selber schreibe, so würde es mich freuen wenn andere Prolog-Neulinge auch davon profitieren könnten.

 

Die Aufgabe


An sich war die Hausaufgabe recht einfach: Die vorgegebene Lösung für ein 4×4 Sudoku muss so erweitert werden damit man ein reguläres 9×9 Sudoku lösen kann. Neben dem grösseren gültigen Zahlenbereich mussten vor allem mehr Spalten, mehr Zeilen und mehr Blöcke eingefügt werden.

Mein (fehlerhaftes) Resultat sah so aus:

valid([]).
valid([Head|Tail]) :-
        fd_all_different(Head),
        valid(Tail).

sudoku(Puzzle, Solution) :-
        Solution = Puzzle,


        Puzzle = [S11, S12, S13, S14, S15, S16, S17, S18, S19,
                  S21, S22, S23, S24, S25, S26, S27, S28, S29,
                  S31, S32, S33, S34, S35, S36, S37, S38, S39,
                  S41, S42, S43, S44, S45, S46, S47, S48, S49,
                  S51, S52, S53, S54, S55, S56, S57, S58, S59,
                  S61, S62, S63, S64, S65, S66, S67, S68, S69,
                  S71, S72, S73, S74, S75, S76, S77, S78, S79,
                  S81, S82, S83, S84, S85, S86, S87, S88, S89,
                  S91, S92, S93, S94, S95, S96, S97, S98, S99],

        fd_domain(Solution, 1, 9),

        Row1 = [S11, S12, S13, S14, S15, S16, S17, S18, S19],
        Row2 = [S21, S22, S23, S24, S25, S26, S27, S28, S29].
        Row3 = [S31, S32, S33, S34, S35, S36, S37, S38, S39],
        Row4 = [S41, S42, S43, S44, S45, S46, S47, S48, S49],
        Row5 = [S51, S52, S53, S54, S55, S56, S57, S58, S59],
        Row6 = [S61, S62, S63, S64, S65, S66, S67, S68, S69],
        Row7 = [S71, S72, S73, S74, S75, S76, S77, S78, S79],
        Row8 = [S81, S82, S83, S84, S85, S86, S87, S88, S89],
        Row9 = [S91, S92, S93, S94, S95, S96, S97, S98, S99],

        Col1 = [S11, S21, S31, S41, S51, S61, S71, S81, S91],
        Col2 = [S12, S22, S32, S42, S52, S62, S72, S82, S92],
        Col3 = [S13, S23, S33, S43, S53, S63, S73, S83, S93],
        Col4 = [S14, S24, S34, S44, S54, S64, S74, S84, S94],
        Col5 = [S15, S25, S35, S45, S55, S65, S75, S85, S95],
        Col6 = [S16, S26, S36, S46, S56, S66, S76, S86, S96],
        Col7 = [S17, S27, S37, S47, S57, S67, S77, S87, S97],
        Col8 = [S18, S28, S38, S48, S58, S68, S78, S88, S98],
        Col9 = [S19, S29, S39, S49, S59, S69, S79, S89, S99],

        Square1 = [S11, S21, S31, S12, S22, S32, S13, S23, S33],
        Square2 = [S41, S51, S61, S42, S52, S62, S43, S53, S63],
        Square3 = [S71, S81, S91, S72, S82, S92, S73, S83, S93],
        Square4 = [S14, S24, S34, S15, S25, S35, S16, S26, S36],
        Square5 = [S44, S54, S64, S45, S55, S65, S46, S56, S66],
        Square6 = [S74, S84, S94, S75, S85, S95, S76, S86, S96],
        Square7 = [S17, S27, S37, S18, S28, S38, S19, S29, S39],
        Square8 = [S47, S57, S67, S48, S58, S68, S49, S59, S69],
        Square9 = [S77, S87, S97, S78, S88, S98, S79, S89, S99],

        valid([Row1, Row2, Row3, Row4, Row5, Row6, Row7, Row8, Row9,
                Col1, Col2, Col3, Col4, Col5, Col6, Col7, Col8, Col9,
                Square1, Square2, Square3, Square4, Square5, Square6, 
                Square7, Square8, Square9]),

        write( '\n' ), write( Row1 ),
        write( '\n' ), write( Row2 ),
        write( '\n' ), write( Row3 ),
        write( '\n' ), write( Row4 ),
        write( '\n' ), write( Row5 ),
        write( '\n' ), write( Row6 ),
        write( '\n' ), write( Row7 ),
        write( '\n' ), write( Row8 ),
        write( '\n' ), write( Row9 ).

 

Kompilierfehler


Als Arbeitsumgebung nutze ich meinen Linux-PC mit Ubuntu 11.4 und GNU Prolog 1.3.0. Nach dem Start von gprolog gab es beim Laden der Datei diese Fehlermeldung:

jgr@R:~/BLOG/$ gprolog
GNU Prolog 1.3.0
By Daniel Diaz
Copyright (C) 1999-2007 Daniel Diaz
| ?- ['sudoku.pl'].
compiling /home/jgr/BLOG/sudoku.pl for byte code...
/home/jgr/BLOG/sudoku.pl:6-23: warning: singleton variables [S31,S32,S33,S34,S35,S36,S37,S38,S39,S41,S42,S43,S44,S45,S46,S47,S48, S49,S51,S52,S53,S54,S55,S56,S57,S58,S59,S61,S62,S63,S64,S65,S66,S67, S68,S69,S71,S72,S73,S74,S75,S76,S77,S78,S79,S81,S82,S83,S84,S85,S86, S87,S88,S89,S91,S92,S93,S94,S95,S96,S97,S98,S99,Row1,Row2] for sudoku/2
/home/jgr/BLOG/sudoku.pl:24-64: warning: suspicious predicate (',')/2
/home/jgr/BLOG/sudoku.pl compiled, 64 lines read - 22767 bytes written, 187 ms

yes
| ?- 

Wer wie ich vor allem in C# entwickelt wird beim ersten Zusammentreffen mit so einer Fehlermeldung wenig anfangen können. Es stehen aber alle nötigen Informationen drin – nur muss man diese erst einmal „entschlüsseln“.

 

sudoku.pl:6-23: warning: singleton variables [S31,S32,S33,...] for sudoku/2

 
Laut dieser Fehlermeldung verwendet die Regel sudoku (mit 2 Parametern) die Variablen S31, S32, usw. nur 1 einziges Mal. Schaue ich den Inhalt meiner sudoku-Regel an, sollten diese Variablen aber alle mehrmals verwendet werden.

Auch die Zeilennummern erscheinen auf den ersten Blick nutzlos. Weder in Zeile 6 noch in Zeile 23 sehe ich etwas was nach einem Fehler aussieht. Meldet Visual Studio „; expected Line 97 Column 76“ weis ich das ein „;“ in Zeile 97 fehlt. Prolog ist ein wenig anders.

Die Fehlermeldung kann man aber auch so übersetzen:
„In der Regel sudoku mit 2 Parametern, die zwischen Zeile 6 und 23 definiert ist, werden die Variablen S32, … nur 1 Mal verwendet.“

Für den Interpreter ist meine Regel zwischen den Zeilen 6 und 23 definiert. Für mich müsste diese aber bis zu Zeile 64 gehen – und hier liegt die Ursache der Fehlermeldung. Prolog nutzt einen Punkt um einzelne Fakten und Regeln zu trennen. Schaut man meinen Regelsatz noch einmal genau an findet man auf Zeile 22 am Ende der Definition von Row2 auch ein Punkt statt einem Komma.
Dieser „kleine“ Unterschied hat aber grosse Wirkung. Sind die Regelsätze unvollständig wird Prolog damit kein Sudoku lösen können. Macht man trotzdem weiter sind die Folgefehler kaum mehr zu durchschauen.

Nachdem ich den Punkt durch ein Komma ersetzt hatte liessen sich meine Regeln fehlerfrei laden:

| ?- ['sudoku.pl'].
compiling /home/jgr/BLOG/sudoku.pl for byte code...
/home/jgr/BLOG/sudoku.pl compiled, 64 lines read - 19963 bytes written, 13 ms

yes
| ?- 

Um ein Sudoku zu lösen genügt es nun die bekannten Zahlen sowie ein _ für alle offenen Felder einzugeben. Prolog löst das Rätsel im Handumdrehen – oder noch schneller:

| ?- sudoku([_, _, _, 2, 4, _, 8, _, _,
             _, _, 2, 3, _, _, _, 6, _,
             _, _, _, 7, _, _, 9, 3, _,
             _, _, _, _, 9, _, _, _, 1,
             _, 9, _, 1, 2, 4, _, _, 3,
             _, _, 1, _, _, _, _, _, _,
             3, _, _, _, _, 8, _, 1, _,
             _, 8, 6, 4, 1, _, _, 5, _, 
             _, 7, 4, _, _, 5, _, _, _], Solution).

[6,3,9,2,4,1,8,7,5]
[7,5,2,3,8,9,1,6,4]
[4,1,8,7,5,6,9,3,2]
[2,6,3,8,9,7,5,4,1]
[5,9,7,1,2,4,6,8,3]
[8,4,1,5,6,3,7,2,9]
[3,2,5,9,7,8,4,1,6]
[9,8,6,4,1,2,3,5,7]
[1,7,4,6,3,5,2,9,8]

 

Tipps für die Problemlösung


Zum Abschluss möchte ich 2 Punkte herauspicken die ich im Nachhinein als besonders wichtig erachte:

  1. Im Fehlerfall immer erst den 1. Fehler beheben. Viele Folgefehler werden damit auch gleich beseitigt.
  2. Für Sprachen wie Prolog muss der Texteditor oder die Konsole unbedingt eine Schrift verwenden die Punkte und Kommas deutlich differenziert. (Monospace ist dafür nicht geeignet)

 

Fazit


So richtig spannend wird es erst wenn man vor Probleme gestellt wird. Eine ganz einfache uns simple Aufgabe (eine Lösung von 4×4 auf 9×9 erweitern) verwandelte sich in eine veritable Herausforderung. Wenn man die Antwort kennt ist es banal. Muss man sich aber durch die Fehlermeldungen und unzählige falsche Ansätze kämpfen beginnt erst das eigentliche lernen.

Auch kleine Aufgaben können einem viel beibringen.

Schlagworte: ,

Wieso ich gerne bei Brack.ch einkaufe

Anfangs April bestellte ich mir Komponenten für einen neuen PC. Wie immer machte ich dies bei Brack.ch. Die Lieferzeiten sind dort enorm kurz und auch preislich ist das Angebot sehr gut.

Beim einbauen der RAM stellte ich leider fest, das egal wie ich die Module drehe, diese einfach nicht passen wollen. Ich überprüfte ob das was ich bestellte auch geliefert wurde. Die Bezeichnung der RAM war die gleiche wie auf dem Lieferschein, der Bestellbestätigung und auf der Webseite.

 
Was ein fehlendes “non-” so alles machen kann
Da ich den Fehler nicht finden konnte, rief ich die Technik-Hotline von Brack an. Der sehr freundliche Techniker konnte mir gleich helfen. Ich hatte RAM mit ECC statt non-ECC bestellt. Der Error Correction Code ( oder kurz ECC) würde dabei helfen Bitfehler zu beheben. Nur brauchen diese einen anderen Steckplatz als ihn das Mainboard anbietet. Somit hatte ich nun RAM die mir nichts nützen.

Ich hatte allerdings Glück. RAM ist eines der Produkte, die zurückgenommen werden können. Einfach zurückschicken und ich würde eine Gutschrift erhalten. Im gleichen Anruf ich konnte auch die korrekten RAM bestellen, um diese tags darauf abzuholen.

Die Rückgabe in Mägenwil verlief so einfach wie am Telefon angekündigt. Der Hinweis ich solle die ursprüngliche Rechnung (mit all den anderen Teilen) erst bezahlen wenn ich die Gutschrift in der Hand halte, würde ich befolgen.

Nach rund 3 Wochen war die Gutschrift bei mir und ich bezahlte die Rechnung. In der Konto-Übersicht im Webshop konnte ich sehen, dass alles wie erwartet verbucht wurde. Wenn es am Ende auch ein wenig länger dauerte, so ist alles wie angekündigt abgelaufen.

 
Eine positive Erfahrung
Mich hat das Verhalten von Brack positiv überrascht. Obwohl es mein Fehler war, wurde alles unternommen um für mich eine Lösung zu finden. Was mir am Telefon erzählt wurde hat dann auch am Schalter und mit der Buchhaltung genau so funktioniert. (Dies grenzt in der heutigen Zeit schon fast an ein Wunder.)

Bei diesem super Kundenservice bin ich gerne bereit ein wenig mehr für die Produkte zu bezahlen. Daher ein grosses DANKE von mir für das Team von Brack!

Schlagworte:

Hosting-Anbieter für (Open Source) Projekte

15. Februar 2010 Kommentare aus

Vor 10 Jahren war es relativ einfach, einen Hoster für sein Open Source-Projekt zu finden. SourceForge war was den Leistungsumfang und die gebotenen Möglichkeiten betraf der mit Abstand führende Anbieter. Seither ist auch in diesem Bereich die Zeit nicht still gestanden. Neue Anbieter kamen und versprachen revolutionäre neue Ansätze. Wie sieht es heute aus? Wo sollte man mit seinem Projekt hin?
Dies ist für mich nicht nur eine theoretische Frage. Für AtaraxiS brauchen wir einen neue Heimat. Daher habe ich mich umgeschaut und eine Zusammenstellung der meiner Meinung nach derzeit wichtigsten Hoster erstellt.

 
SourceForge
SourceForge ist auch heute noch der grösste Hoster für Open Source Projekte. Derzeit werden wohl gegen 300’000 Projekte gehostet. SourceForge ist sehr bekannt und beherbergt eine ganze Reihe bedeutender Projekte wie Notepad++, phpMyAdmin, SquirrelMail oder CDex.

 
Origo
Origo ist ein relativ junger Dienst, der von der ETH Zürich betrieben wird. Derzeit werden rund 4000 Projekte gehostet, von denen 770 Open Source sind. Als einer der wenigen Hoster ist es bei Origo möglich, auch Closed Source Projekte kostenlos zu hosten.

 
Google Code
Google bietet unter code.google.com seit Mitte 2007 ebenfalls die Möglichkeit, Open Source Projekte zu hosten. Um den Dienst zu nutzen braucht man einen Google-Account, aber nicht zwangsläufig GMail. Derzeit gibt es eine Begrenzung von 1GB für Code und 2 GB für Downloads.

 
CodePlex
CodePlex ist die Hosting Plattform für Open Source Projekte von Microsoft. Neben SVN kann man auch über Mercurial und dem Team Foundation Server auf seine Projekte zugreifen. Der TFS ist eine Plattform für die Softwareentwicklung. Neben der Versionsverwaltung ermöglicht der TFS auch die Generierung von Reports, Issue Tracking und integriert sich voll in Visual Studio. CodePlex ist nicht auf Programmiersprachen von Microsoft begrenzt, sondern steht allen Open Source Projekten offen.

 
GitHub
GitHub bietet einen neuen Ansatz für die Entwicklung. Ähnlich Twitter gibt es eine Timeline und Follower, mit der man sich über den Fortschritt der Entwicklung der einzelnen Projekte auf dem laufenden halten kann. GitHub bietet nur Git als Versionierungssystem an und limitiert die Open Source-Projekte auf 300 MB. (Bei Bedarf kann mehr verlangt werden)

 
Bitbucket
Bitbucket ist für Mercurial was GitHub für Git ist. Auch was das Preismodell betrifft lassen sich die beiden Anbieter vergleichen. Bitbucket ist aber günstiger und bietet derzeit mehr Speicherplatz. Wer mit Mercurial entwickelt sollte Bitbucket als Hoster in Betracht ziehen.

 
Vergleich

Source Forge Origo Google Code Code Plex GitHub Bitbucket
Betreiber Geeknet Inc ETH Zürich Google Microsoft GitHub Inc. Avantlumiere
Hosting Open Source? Ja Ja Ja Ja Ja Ja
Hosting Closed Source? Nein Ja Nein Nein ab 7$/Monat ab 5$/Monat
SVN? Ja Ja Ja Ja Nein Nein
Andere VCS? Git, Mercurial, Bazaar Nein Mercurial Mercurial, TFS Git Mercurial
Wiki? Ja Ja Ja Ja Ja Ja
Issue Tracker? Ja Ja Ja Ja Ja Ja
Forum? Ja Ja Nein Ja Nein Nein
Mailing-Liste? Ja Nein Nein (Google Groups) Ja Nein Nein
File Release? Ja Ja Ja Ja Ja Ja

 
Fazit
Der Leistungsumfang zwischen den einzelnen Anbieter variiert nur minimal. Ein Wiki und ein Issue Tracker gehören ebenso wie der Download-Bereich zum Grundangebot. Subversion wird abgesehen von Bitbucket und GitHub von allen unterstützt.

Die gute Nachricht: Das Grundangebot deckt die meisten Anforderungen ab und man kann frei zwischen den Anbietern wählen. Erst wenn man nicht mit Subversion entwickeln will oder ein Closed Source Projekt hat, lichtet sich der Markt.
Dies bedeutet aber auch, dass es nicht mehr wirklich einen Standardanbieter gibt. Bei den heutigen Suchmaschinen ist es aber kein Problem ein passendes Projekt zu finden, egal wo dies liegt.

Wo soll man nun also mit seinem Projekt hin? Dorthin wo es einem am besten gefällt. AtaraxiS wird aus dem Grund in den nächsten Wochen zu Origo umziehen.

Schlagworte:

Katana – wie ein Kunstwerk entsteht

21. Januar 2010 1 Kommentar

(C) Rama, licensed: Creative Commons Attribution-Share Alike 2.0 France
3Sat zeigte in der Reihe “Im Fokus: Japan” die Dokumentation “Das Schwert der Samurai”. Darin wird gezeigt wie ein japanisches Langschwert, das Katana, erstellt wird.

 
 
Ein gewaltiger Aufwand
Der Aufwand um ein Katana zu erstellen ist enorm. Es gibt kein “schnell, schnell” und mal eben ein Schwert “machen”. Bei der Auswahl des Tamahagane, dem Rohmaterial, beginnt ein Prozess, der in jedem einzelnen Schritt Perfektion verlangt. Um nur schon den Stahl zu gewinnen, braucht man 3 Tage – am Stück, ohne Unterbruch.
Erst dann kann man mit dem Schmieden beginnen. Allerdings nicht mit dem Schmieden des Schwertes, sondern mit dem Falten des Stahls. Das Falten dient der gleichmässigen Verteilung des Kohlenstoffgehalts. Ohne diesem Vorgang könnte bei der Belastung das Schwert sonst brechen. Danach erst wird der Stahl in die Form des eines Schwertes gebracht. Damit ist die Arbeit aber noch lange nicht fertig. Es folgt noch das Härten und das Gravieren, bevor der Meisterpolierer sich dem Schwert annimmt.

 
Perfektion: Ein Muss und keine Option
Mich faszinierte die Präzision, mit der gearbeitet wird. Jeder Arbeitsschritt muss perfekt ausgeführt sein, immer die richtige Aktion im richtigen Moment. Zu spät und die ganze Arbeit ist für nichts. Zu früh und es bricht beim nächsten Schritt. Alles muss zusammen passen. Eine Unachtsamkeit und man produziert teuren Abfall. Alles ist darauf ausgerichtet das Schwert perfekt zu machen. Ein Ziel, eine Richtung, ein Kunstwerk.

Nur die Erfahrung dient als Wegweiser. Die Färbung des Stahls und des Feuers zeigen an wann der richtige Zeitpunkt gekommen ist. Jedes Schwert wird ein Unikat. Und so ist auch der Weg dorthin immer ein wenig anders. Ein stures festhalten am letzten Durchgang und man kann es wegwerfen. Man muss sich immer mit dem Schwert auseinander setzen.
Hunderte Jahre an Erfahrung wurden von Meister zu Meister weitergegeben, ergänzt und verbessert. Flexibilität und der auf Erfahrung gegründete Prozess müssen sich unterstützen und ergeben nur gemeinsam ein Produkt auf diesem hohen Niveau.

Erst wenn jeder daran beteiligte sein Bestes gibt, wird aus einem Stück Stahl nicht nur ein Schwert, sondern ein Mythos. Hat aber auch nur einer das Gefühl, er könne eine schlampige Arbeit abliefern, wird aus dem Kunstwerk im besten Fall noch ein übergrosses Brotmesser.

Schlagworte:

Colin McRae: DiRT 2 – eine Review

14. Dezember 2009 Kommentare aus

Colin McRae: DiRT war eines der besten Rally-Spiele. Mit DiRT 2 ist nun seit September 2009 der Nachfolger für die PS3 erhältlich. Die Frage ist nun, kommt DiRT 2 an den Vorgänger heran?

 

Das Positive
Die Grafik ist umwerfend. Auf der PS3 wird aus dem vollen geschöpft und die Autos und Landschaften sind so realistisch wie selten zuvor. Der Sound und die Atmosphäre ist grossartig gemacht und man fühlt sich als sei man wirklich mitten drin.

Die Idee mit der Weltkarte im Trailer ist deutlich interessanter als die Pyramide in DiRT 1. Allerdings sieht die Welt draussen abgesehen vom Hintergrund immer gleich aus.

Die Fahrphysik ist sehr gut. Verliert man seinen Spoiler oder Diffusor spürt man das veränderte Verhalten des Autos sofort. Das driften macht riesigen Spass und man “spürt” die unterschiedlichen Bodenbeläge sehr gut.

 

Das Negative
Die Autos: So toll sie auch aussehen, so gibt es ein Problem beim Autokauf. Man will ja mit dem verdienten Geld bessere Autos kaufen um seine Chancen auf den Sieg zu erhöhen. Nur hat man von Beginn an ein Auto, das vielen der freischaltbaren Autos überlegen ist. So geht der Reiz verloren, weitere Autos zu kaufen. Man kauft bald nur noch Autos, die einem als Voraussetzung für die Rennen fehlen.

Die Strecken: Die Orte auf der Weltkarte sind zugleich auch die Rennstrecken. Jeder Ort ist zwar sehr unterschiedlich und bietet andere Eigenschaften. Wählt man aber ein Rennen mit mehreren Teilen, wird man die Strecke einmal im Uhrzeigersinn, einmal im Gegenuhrzeigersinn und einmal mit einiger wenigen zusätzlichen Kurven fahren. Somit hat man immer die fast gleiche Strecke vor sich. Immer und immer wieder an dem Ort.

Die Kommentare der Mitfahrer: Diese wiederholen sich leider noch mehr als die Strecken. Wenn man zum X-ten Mal gehört hat das es an diesem Ort heiss ist, regt einem das vor allem auf.
Das Wetter: Das Wetter ist immer gleich: Kein Schnee, kein Regen, die Pfützen sind immer am gleichen Ort und hat man mal alles angespielt, bleibt es bis ans Ende gleich.

Fehlende Auswahl: Je nach Quelle gibt es zwischen 25 und 40 Autos in 7 Kategorien. Das sind angesichts der für Grand Turismo 5 angekündigten 1000 Autos eine mickrige Auswahl. Die 9 Orte sind ebenfalls deutlich zu wenig.

 

Fazit
Die überwältigende Grafik täuscht leider nicht darüber hinweg, das DiRT 2 kein Rally-Spiel mehr ist. Die immer gleichen Strecken mit den immer gleichen Kommentaren trüben sehr schnell den Spielspass.

Beim Spielen dachte ich häufig an DiRT 1 und wie viel mehr Abwechslung die Strecken und Autos boten. DiRT 2 ist ein gutes Autospiel, aber in die Colin McRae Rally Serie passt es nicht hinein. Somit bleibt für mich DiRT 1 das beste Rally Spiel.

Schlagworte:
Folgen

Erhalte jeden neuen Beitrag in deinen Posteingang.

Schließe dich 297 Followern an