Kompottkins Weisheiten

••• NEU! Jetzt mit mehr als 3 % Uptime! •••
Flattr this.

Church-Numerale in C++

Vielleicht nicht die idiomatischste Implementierung, aber durchaus von einem gewissen Unterhaltungswert — Church-Numerale in C++0x:

#include <cstdlib>
#include <functional>
#include <iostream>

using namespace std;

template <typename T>
struct church {
 
// ----- Typen -----
 
typedef function<T(T)>         fn;
 
typedef function<fn(const fn)> numeral;

 
// ----- Null und Nachfolger -----
 
static fn zero(const fn f) {
   
return [](T x) -> T {
     
return x;
   
};
 
}

 
static numeral succ(const numeral num) {
   
return [=](const fn f) -> fn {
     
const numeral num_ = num;
     
return [=](const T x) -> T {
       
return f(num_(f)(x));
     
};
   
};
 
}

 
// ----- Hilfsfunktionen -----
 
static numeral make_numeral(unsigned int n) {
    numeral num
= zero;
   
for (int i = 0; i < n; i++) {
      num
= succ(num);
   
}
   
return num;
 
}
};

// ----- Hauptprogramm -----
int twice(int n) {
 
return 2*n;
}

int main(int argc, char **argv) {
 
auto eight = church<int>::make_numeral(8);
 
auto ten = church<int>::succ(church<int>::succ(eight));
  cout
<< "ten(twice)(1) = " << ten(twice)(1) << endl;
 
return EXIT_SUCCESS;
}

Weitere Implementierungen von Church-Numeralen gibt's bei Christoph:

PostgreSQL für Ad-Hoc-Daten

Für mein nächstes Websitedesign suche ich momentan unter anderem nach dem richtigen Datenmodell. Das ist deshalb nicht ganz einfach, weil mir sowohl das relationale als auch das „document-store“-artige zusagen, wenn auch jeweils aus verschiedenen Gründen. Sowohl die eine wie auch die andere Wahl wäre jeweils gut zu rechtfertigen. Einerseits werden viele der Daten nämlich immer gleicher Art sein: Artikel mit Veröffentlichungsdatum und Urheber, Kommentare, verschiedene Sprachversionen zu jedem Artikel. Andererseits gibt es sicherlich auch Ad-hoc-Daten, die entweder nur selten auftreten, oder derer ich mir zu Anfang noch gar nicht bewußt sein kann.

Die Wahl fällt also nicht leicht. Wäre es nicht schön, gäbe es ein relationales Datenbanksystem, das auch Ad-hoc-Daten sinnvoll modellieren und abfragen kann — jedenfalls, wenn man auf die leichte Skalierung, die „richtige“ NoSQL-Systeme bieten, verzichten kann?

Interessanterweise tut PostgreSQL das. Es gibt ein Modul namens „hstore“, das es ermöglicht, einfache Schlüssel-Wert-Paare in eine Extraspalte einer Tabelle zu legen. Das ist nun zunächst nichts Besonderes — man könnte auch ohne spezielle Unterstützung durch das Datenbanksystem auf die Idee kommen, beispielsweise zusätzliche JSON-Daten in eine eigens dafür vorgesehene Spalte abzulegen. hstore erlaubt es aber auch, die Daten in Queries zu verarbeiten und abzufragen:

=> CREATE TABLE people (id   SERIAL PRIMARY KEY,
                        name TEXT
,
                        info HSTORE
);
=> INSERT INTO people(name, info)
     VALUES
('Heinrich',
             hstore
(ARRAY['age', '25',
                         
'hobbies', '{science,chemistry,math}',
                         
'town', 'Munoca']));
=> INSERT INTO people(name, info)
     VALUES
('Andrius',
             hstore
(ARRAY['age', '24',
                         
'hobbies', '{magic,science,languages}']));
=> INSERT INTO people(name, info)
     VALUES
('Nathalie',
             hstore
(ARRAY['age', '22',
                         
'favorite_meal', 'Schlutzkrapfen']));
=> SELECT * FROM people;
 id
|   name   |                                 info                          
----+----------+----------------------------------------------------------------------
 
1 | Heinrich | "age"=>"25", "town"=>"Munoca", "hobbies"=>"{science,chemistry,math}"
 
2 | Andrius  | "age"=>"24", "hobbies"=>"{magic,science,languages}"
 
3 | Nathalie | "age"=>"22", "favorite_meal"=>"Schlutzkrapfen"
(3 rows)
=> SELECT name FROM people WHERE (info->'age')::INTEGER < 25;
   name  
----------
 
Andrius
 
Nathalie
(2 rows)
=> SELECT name FROM people WHERE 'chemistry' = ANY ((info->'hobbies')::TEXT[]);
   name  
----------
 
Heinrich
(1 row)

Wie man sieht, besteht ein Nachteil von hstore gegenüber JSON oder ähnlichem darin, daß alle Daten untypisiert als Zeichenketten gespeichert werden müssen. Da man solche in SQL in fast alles Erdenkliche casten kann, hat man dagegen ein Mittel zur Verfügung, schöner wäre eine irgendwie geartete Typisierung der Daten aber natürlich trotzdem.

Eine spätere Version von PostgreSQL (9.1?) könnte da zumindest etwas Abhilfe schaffen: Wie man hört, soll JSON in Zukunft nativ unterstützt werden.

Wenn man ein bißchen herumspielen möchte, kann man Views verwenden, um aus den im hstore gespeicherten Daten tabellarische zu machen:

=> CREATE OR REPLACE VIEW people2 AS
     SELECT id
,
            name
,
           
(info->'age')::INTEGER AS age,
            info
->'town'           AS town
       FROM people
;
=> CREATE OR REPLACE VIEW hobbies AS
     SELECT id
, unnest((info->'hobbies')::TEXT[]) AS hobby
       FROM people
;
=gt; SELECT * FROM people2;
 id
|   name   | age |  town  
----+----------+-----+--------
 
1 | Heinrich |  25 | Munoca
 
2 | Andrius  |  24 |
 
3 | Nathalie |  22 |
(3 rows)
=> SELECT name, hobby FROM people2, hobbies WHERE people2.id = hobbies.id;
   name  
|   hobby  
----------+-----------
 
Heinrich | science
 
Heinrich | chemistry
 
Heinrich | math
 
Andrius  | magic
 
Andrius  | science
 
Andrius  | languages
(6 rows)

In dem Fall bekommt man die Typisierung und angenehme Syntax wieder zurück. Dafür hätte man die Daten hier auch gleich tabellarisch speichern können; allerdings handelt es sich bei dem Beispiel freilich um ein didaktisches. In der Praxis können tabellarische Views in Ad-hoc-Daten sich durchaus als nützlich erweisen, besonders wenn eine Abwärtskompatibilität des Datenbankschemas gewährleistet werden muß oder eine schrittweise Umstellung der Ad-hoc- auf tabellarische Daten geschehen soll.

META: Neuer Server

Meine Website ist auf einen neuen Server umgezogen. Falls es deshalb in der letzten Zeit technische Probleme gab, entschuldige ich mich hiermit dafür. Eigentlich sollte das Ganze jetzt wieder einigermaßen robust laufen.

Immerhin sollten mit der mit dem Serverumzug einhergehenden Datenbankmigration auch die ganzen Zeichenkodierungsprobleme der Vergangenheit angehören. Ab jetzt darf folglich in der Kommentarfunktion nach Lust und Laune mit Unicode-Zeichen um sich geworfen werden. Ich wünsche dabei viel Spaß!

Neu ist zudem die Möglichkeit, die Website (inklusive Newsfeeds) verschlüsselt zu erreichen, wenn einem danach ist.

Der Mac ist tot

Die vergangene Woche markiert allem Anschein nach den Anfang vom Ende des Macs, wie wir ihn kennen.

Vergangene Woche kündigten Steve Jobs und seine Gefolgsleute Mac OS X 10.7 „Lion“ an. In typischer Apple-Manier wurden alle vorgestellten Neuerungen wahlweise als awesome , incredible oder revolutionary angepriesen. Im wesentlichen handelte es sich dabei um Mission Control , eine in kuriosem Maße an die GNOME Shell erinnernde, doch eigentlich konsequente Weiterentwicklung von Exposé , sowie den lange erwarteten App Store für den Mac.

Der App Store ist ein offensichtlicher Schritt in Richtung Apple-kontrollierter Monokultur.

Ebenfalls in dieser Woche wurden zwei weitere Ankündigungen gemacht.

Im Zuge eines Java-Updates für Mac OS X erfuhr man, daß Java nicht weiter aktiv von Apple unterstützt werden wird — ein Schritt in Richtung Apple-kontrollierter Monokultur.

Schließlich wird Flash nicht mehr mit neuen Macs ausgeliefert — ein Schritt in Richtung Apple-kontrollierter Monokultur.

Sieht jemand ein Muster?

Natürlich wird die Umstellung des Macs auf ein kontrolliertes, abgeschlossenes System nicht von heute auf morgen geschehen (daher auch die bewußt betonten vorläufigen Einschränkungen, Java und Flash nachinstallieren und Software am App Store vorbei aus Fremdquellen beziehen zu können). Apple, eine Firma, deren Erfolg nicht zuletzt darauf beruht, daß sie zugleich einen Kult mit einer unüberschaubaren Zahl von loyalen Anhängern pflegt, kann es sich nicht leisten, seinen treuesten Fans vor den Kopf zu stoßen, indem abrupt die Richtung geändert wird.

Schrittweise lassen sich ideologische Veränderungen aber grundsätzlich immer durchsetzen — nicht nur die stetig voranschreitende ideologische Abwertung der Solidargemeinschaft in Deutschland ist dafür ein eindrucksvolles Beispiel. Genug ehemals überzeugte Fans der (Individualismus predigenden, kreativitätsorientierten) Mac-Philosophie werden so lange ausharren, bis sich in ihren Köpfen der Wandel schleichend vollzogen hat und sie ebenso überzeugte Verfechter der (bevormundenden, konsumorientierten) i-Philosophie geworden sind.

So paßt es nur allzu gut ins Schema, wenn Apple gleich einen ganzen Abschnitt der Keynote der Beteuerung widmet, der Mac sei ein ach-so-wichtiges Standbein der Firma.

Der „Mac“ (das Produkt) — freilich. Aber der Mac ?

Die Hoffnung stirbt bekanntlich zuletzt; man sollte nur aufpassen, daß man von ihr nicht allzu sehr geblendet wird.

Merke: Keine CD-Abbilder auf die Festplatte dd'en (Mac)

Aus der Beschreibung zu den CD-Abbildern für die Arch-Linux-Installation:

All available images can be burned to a CD, mounted as an ISO file, or be directly written to a USB stick using a utility like ‘dd’.

Aus der Möglichkeit einer USB-Stick-Variante schloß ich, daß es nicht schaden könne, doch einfach einmal zu versuchen, das Abbild stattdessen direkt in eine Partition auf meiner Festplatte zu dd'en.

Weit gefehlt.

Nach einem Reboot stellte sich heraus, daß der Bootloader meines Macs (MacBook Pro 13" (Mid 2009)) nicht nur nicht in der Lage ist, von einer so präparierten Partition zu booten, sondern auch gleich den Dienst ganz verweigert, wenn eine vorhanden ist. Praktischerweise schließt das sowohl das Booten von der Festplatte als auch das von CDs ein (welche, nebenbei bemerkt, auch nicht mehr durch Mausklick ausgeworfen werden konnten) — und den Target Disk Mode obendrein.

Ein Glück, wenn man noch einen ausrangierten Laptop mit demselben Festplatteninterface und einem guten, alten (und weniger absturzgefährdeten) BIOS hat.

Ältere Einträge

Alle Einträge vollständig anzeigen (langsam!).

Einträge nach Datum
TitelDatumKommentare
Church-Numerale in C++13.2.2011, 0:250 Kommentare
PostgreSQL für Ad-Hoc-Daten7.12.2010, 19:500 Kommentare
META: Neuer Server20.11.2010, 21:070 Kommentare
Der Mac ist tot24.10.2010, 17:372 Kommentare
Merke: Keine CD-Abbilder auf die Festplatte dd'en (Mac)22.9.2010, 17:451 Kommentar
Produktivitätssteigerung vs. Lohn- und Arbeitszeitentwicklung 1991-200619.9.2010, 18:230 Kommentare
Google Street View vs. Gemeinden15.8.2010, 15:091 Kommentar
Das Metaobjektsystem von ECMAScript Harmony und das CLOS-MOP: ein Vergleich31.7.2010, 1:130 Kommentare
Eduroam/802.1X mit dem Palm Pre (speziell LMU/TU/LRZ München)14.7.2010, 22:015 Kommentare
Multiple Dispatch in JavaScript (ECMAScript 5)3.6.2010, 16:060 Kommentare
Äquivalenz von Daten und Code — in Lisp und anderswo18.5.2010, 21:260 Kommentare
Ein Tool-Wrapper als Programmiersprachentest30.3.2010, 18:380 Kommentare
Die Dualität zwischen Conditions und dynamischen Variablen26.3.2010, 20:101 Kommentar
Pre-Scheme und Freunde: doch noch richtiges Low-Level-Lisp16.2.2010, 12:420 Kommentare
Low-Level-Lisp16.2.2010, 0:002 Kommentare
Das bayerische Studentenwerk wird ab sofort kaputtgespart30.1.2010, 11:441 Kommentar
„Aber was ist mit denen, die sich dann einfach durchfüttern lassen?“ — Eine Verteidigung des Rechts auf Faulheit23.1.2010, 19:173 Kommentare
Ein Rat für Android-Freunde: Wartet auf das Nexus One.19.1.2010, 20:270 Kommentare
Chaosradio Express zu: Mut zur Freiheit18.1.2010, 21:150 Kommentare
Eindrücke vom Notizenprogramm Circus Ponies NoteBook17.1.2010, 17:500 Kommentare
myBlogEdit — ein einfacher Desktop-Blogging-Client, der seine Arbeit tut17.1.2010, 16:120 Kommentare
Die Welt der freien Software vor dem Scheideweg14.1.2010, 18:251 Kommentar
Syntaxhervorhebung von Lisp-Code im Web8.12.2009, 1:560 Kommentare
Stilistische Unterschiede zwischen Clojure und Common Lisp anhand von HTML-Generierung3.12.2009, 15:500 Kommentare
Backups auf einen Dateiserver18.10.2009, 3:240 Kommentare
ecto — Sinn und Unsinn eines Desktop-Blogging-Clients9.10.2009, 19:320 Kommentare
Implementierung eines Atom-basierten Webdienstes9.10.2009, 2:270 Kommentare
Deutsche Kleinparteien: Ökologisch-Demokratische Partei23.9.2009, 4:190 Kommentare
Deutsche Kleinparteien: Liberale Demokraten21.9.2009, 12:251 Kommentar
Serie: Deutsche Kleinparteien21.9.2009, 11:512 Kommentare
Befehls- als partielle Metataste in iTerm12.8.2009, 2:392 Kommentare
Lisp im Chaosradio Express11.8.2009, 1:392 Kommentare
Transfinite Wahrscheinlichkeitslogik online10.8.2009, 17:182 Kommentare
Monaden in Scala31.7.2009, 19:411 Kommentar
Bearbeiten von Tabellen in Numbers mit AppleScript19.7.2009, 2:370 Kommentare
Ad-hoc-Polymorphie in Scala: besser als Haskell?25.6.2009, 23:080 Kommentare
Funktionale Programmierung ist algebraische Programmierung21.6.2009, 18:071 Kommentar
Scala21.6.2009, 18:070 Kommentare
Entwurf einer auf natürliche Weise homoikonischen objektbasierten Sprache31.5.2009, 2:120 Kommentare
.tar.bz2/.tar.gz in .lzma.io (cpio/afio) umwandeln28.3.2009, 20:594 Kommentare
Interaktive GUI-Programmierung mit SLIME, Clojure, Qt und Swing11.3.2009, 15:073 Kommentare
Lektionen aus dem Erfolg von Clojure und dessen Bedeutung für Lisp20.2.2009, 17:392 Kommentare
Öffentliche Petition zum bedingungslosen Grundeinkommen17.2.2009, 20:410 Kommentare
Freitag31.1.2009, 22:400 Kommentare
Kryptofaschistische Blut- und Bodenideologie des Sportfanatismus11.1.2009, 19:541 Kommentar
Inkscape5.1.2009, 16:230 Kommentare
Dovecot, launchd und die Leopard-Firewall4.1.2009, 16:190 Kommentare
F-Spot und ipernity31.12.2008, 20:240 Kommentare
Diskret-topologische Wahrscheinlichkeitslogik und die transfinite Behandlung endlicher Gruppen21.12.2008, 2:005 Kommentare
Wörter zählen mit Common Lisp16.12.2008, 17:592 Kommentare
Genossenschaften vs. öffentliche vs. Privatunternehmen15.12.2008, 23:021 Kommentar
Feministische Doppelmoral15.11.2008, 18:130 Kommentare
Dresden for the win!15.11.2008, 17:410 Kommentare
Verschiedene Beweisstrategien in der Mathematik und ihre Anwendungen13.11.2008, 0:360 Kommentare
Die universelle Eigenschaft der Klumpentopologie1.11.2008, 22:570 Kommentare
Ein weiterer Klassiker18.10.2008, 18:270 Kommentare
Vorträge über Clojure18.10.2008, 17:130 Kommentare
Backquote in Clojure und die Referenztransparenz14.10.2008, 22:340 Kommentare
Clojure12.10.2008, 19:040 Kommentare
Das deprimierende Thema der Familienpolitik24.9.2008, 23:230 Kommentare
SOLID, ein SLIME für O'Caml6.9.2008, 20:460 Kommentare
Das schöne C-Interface von Objective Caml1.9.2008, 20:260 Kommentare
Survey: Mehrsprachendokumentationsgeneratoren29.8.2008, 23:440 Kommentare
Die Objective-C-Runtime als Compilertarget25.8.2008, 19:360 Kommentare
FIXNUMs für Toilet Lisp4.8.2008, 20:430 Kommentare
Toilet Lisp: MACROLET als COMPILER-LET-Ersatz4.8.2008, 0:070 Kommentare
OpenJDK und libmawt.so22.7.2008, 17:470 Kommentare
Adé, Bill2.7.2008, 22:350 Kommentare
Toilet Lisp: der Code22.6.2008, 21:240 Kommentare
Toilet Lisp22.6.2008, 12:562 Kommentare
Die Avantgarde schlägt zurück21.6.2008, 22:070 Kommentare
Étoilé nähert sich Smalltalk an7.6.2008, 16:420 Kommentare
Systemupdates mit NetBSDs pkgsrc-System31.5.2008, 16:030 Kommentare
Warum ich gegen den Antifaschismus-Vorschlag gestimmt habe27.5.2008, 22:030 Kommentare
Die USA, erklärt21.5.2008, 23:060 Kommentare
Smalltalk als Standardsprache für Étoilé19.5.2008, 23:100 Kommentare
Paketmanagement unter Mac OS X3.5.2008, 23:481 Kommentar
CamlP4 und CamlP529.4.2008, 16:060 Kommentare
Lesbare Syntax für OCaml27.4.2008, 19:310 Kommentare
Ad-hoc-Polymorphie: Gut? Schlecht? Keines von beiden?23.4.2008, 17:070 Kommentare
Leseprobe: Der gebrauchte Mann19.4.2008, 15:560 Kommentare
Qualität in der Wikipedia, continued14.4.2008, 21:110 Kommentare
Pico Lisp, Fenster in eine andere Welt?2.4.2008, 14:070 Kommentare
Lisp-Einführung1.4.2008, 22:141 Kommentar
Objective-CL 0.2.06.3.2008, 0:170 Kommentare
SpamAssassin-Migration zwischen Rechnern30.12.2007, 23:240 Kommentare
Eine Projektseite für Objective-CL24.12.2007, 17:230 Kommentare
Formulierungsspießertum9.12.2007, 17:470 Kommentare
GNUstep: Menüleistenstile25.11.2007, 17:460 Kommentare
Gezwungen, Subversion zu verwenden? git-svn bringt den Spaß zurück.24.11.2007, 16:100 Kommentare
Wer sind die Alt-Katholiken?6.11.2007, 1:140 Kommentare
Perl-Einzeiler für Multiline-Regexps4.11.2007, 23:340 Kommentare
Gedenkt unser jemand?3.11.2007, 21:300 Kommentare
Qualität? In der Wikipedia? Auf welchem Planeten leben Sie?3.11.2007, 20:090 Kommentare
CL-ObjC — freundliche Konkurrenz zu Objective-CL2.11.2007, 0:406 Kommentare
Mit kleinen Schritten in die Utopie — sozial wie ökologisch15.10.2007, 20:060 Kommentare
Denkwürdige Merkmale der Sprache C: #import versus #include14.10.2007, 15:220 Kommentare
Denkwürdige Merkmale der Sprache C: dynamische Speicherreservierung einmal anders11.10.2007, 21:202 Kommentare
Denkwürdige Merkmale der Sprache C: getc liefert keinen char zurück11.10.2007, 21:000 Kommentare
Kampf dem Spam!7.10.2007, 21:120 Kommentare
Objective-CL, eine Objective-C-Brücke für Common Lisp26.9.2007, 2:580 Kommentare
Mulkutils: Version 0.2.013.7.2007, 18:160 Kommentare
Optimierungsflags für den Intel Core Duo11.7.2007, 22:540 Kommentare
DellfanD für Solaris28.6.2007, 17:530 Kommentare
Mulkutils: kleine Werkzeuge für Common Lisp28.6.2007, 17:180 Kommentare
MAPCAN, ein kleines Juwel10.6.2007, 19:430 Kommentare
Zurück aus der Dunkelheit30.5.2007, 23:461 Kommentar