Apache startet nach Time Machine Backup nicht mehr 0

Folgendes Problem:

Nach dem erfolgreichen einspielen eines Time Machine Backups läuft der Apache 2 nicht mehr.

Lösung:

Time Machine backuped keine log Dateien d.h. das error_log und access_log sind nicht vorhanden. (Bei mir waren die Ordner nicht mal mehr vorhanden). Diese muss man wieder neu anlegen:

mkdir /var/log/httpd 
touch /var/log/httpd/error_log 

In meinem Fall konnte der Apache allerdings immer noch nicht starten. Die Konsole spuckte nur noch:

com.apple.launchd108 (org.apache.httpd10348): Exited with exit code: com.apple.launchd108 (org.apache.httpd): Throttling respawn: Will start in 10

Um den Fehler zu finden in die entsprechende error_log schauen:

locate error_log  
#Die entsprechende Apache error_log raussuchen
tail /private/var/log/apache2/error_log

Vielleicht hilft es dem ein oder anderen evtl.

Software Qualität 0

Ich bin ein großer Fan von Douglas Crockford und seine Präsentation für YAHOO. Ich hab mir letztens seine Präsentation über Software Qualität angeschaut und war fasziniert.

Ich möchte nun einige meiner Notizen und Eindrücken posten.

Eine gute Software Architektur ist nötig um ein Programm genügend Struktur und Stabilität zu geben, damit die sie wachsen kann ohne dabei in eine Qual von Verwirrung zu stürzten.

Überflüssiger Quellcode

Dieser Quellcode entsteht meist durch unfertigen Optimierungen, Unerfahrenheit und Feature Verbesserungen. Ungenutzt Code Passagen entstehen und kein Programmierer weiß mehr “Ist dieser Code Block wichtig?”. Meist gibt es auch keine Dokumentation zu diesen überflüssigen Code. Und so bleibt der Code ganz nach der Manier “Dont change a running code” in der Software.

Zusätzlich zum überflüssigen Source Code, gibt es die Aufblähungen - der Krebs der Software Entwicklung. Unter Aufblähungen versteht man mehrere Kopien vom selbem Code oder der selben Lösung (Methode,Klasse).

Diese Aufblähungen entstehen sehr schnell, auch schon bei wenigen Programmierern. Ich gebe mal ein Beispiel:

  • verschiedene Programmierer entwickeln an einer Software
  • Programmierer A hat folgendes Problem und implementiert Methode X
  • Programmierer B hat bereits eine solche Methode geschrieben, da Sie aber nicht dokumentiert ist gibt es nun zwei methoden mit unterschiedlichen Namen mit der identischen Funktion.

Häuft sich der uberflüssige Quellcode an, steigt die Komplexität und ein Weiterentwicklung wird langsam und zäh bis zum kompletten Stillstand.

Lösung? Refactoring!

  • Formatierungen verbessern ( Coding Standards einführen )
  • Dokumentation  ( API Doku, Referenz Doku etc. )
  • entfernen von Überflüssigen Quellcode und den Aufblähungen
  • Neu Strukturierung

Feature Freeze! Und überlegen: Was wurde falsch gemacht - Wie kann man das verbessern.

Worst Case - Das unerträgliche

Das Software Schiff kann nicht gerettet werden und auch das Stopfen der Löcher durch Refactoring versagt. Neuer Kurs:  kompletter Neuanfang!
Verlust von Jahren, Monaten, Wochen von Arbeit. Der graus eines jeden Projektmanager - investierte Geld für nichts?

Nein,  den ein Team kann durch die Erfahrungen des “first system” profitieren und kann die Entwicklungszeit sehr stark verkürzen. Es muss aber darauf geachtet werden, das jedem Entwickler die bisherigen Fehler klar sind und der Fokus auf die Einfachheit liegt.

Crockford berichtet das er bisher drei-mal ein Software Projekt neugestartet hat. Von Jahren zu 5 Monaten von 5 Monaten zu 2 Wochen.

Natürlich hängen diese Zahlen mit der Erfahrenheit der Entwickler und deren Kapazitäten zusammen.

Ein Entwickler sollte nur das machen was er wirklich am besten kann - so arbeitet er wirklich 100% und produktiv. Ein Team sollte aus mehreren Spezialisten bestehen die sich Reibungslos ergänzen und vorranbringen. Das Spezialisten Team könnte z.B. GUI Designer, Database Engineer, Schreiber, Beta Tester, etc. diese Liste lässt sich beliebig ändern und erweitern.

Ein weiterer Punkt den Crockford anspricht ist die Sicherheit.

Wer Sicher programmiert - programmiert maintainable und vorausschauend.

Javascript MVC Framework with Google Gears ORM 0

Okay i know, i haven’t posted much in this blog. But in the last week with the release of Google Gears i came up with some ideas.

Jamal MVC:

Jamal is a set of conventions and small javascript libraries to archieve a complete separation of html, css and javascript in your web application. Jamal is built on jQuery and inspired by MVC frameworks like Ruby on Rails, CakePHP and its derivatives.

The MVC concept:

  • Controller: Interaction with the user interface (events)
  • Model: Business Logic and AJAX calls
  • View: DOM, CSS modifications

Google Gears just crys for a MVC Framework! It would be perfect to integrate Google Gears into Jamal.

After some research i found Google Gears Orm. The code looks pretty cool. So the idea is : integrate it into Jamal!

Model:

1
2
3
4
5
6
$m.Client = {
    table: {
        firstname : jamal.Fields.String({maxLength:70}),
        lastname   : jamal.Fields.String({maxLength:70}),
    }
};

Controller:

1
2
3
4
5
6
7
8
9
$c.Clients = {
index: function() {
$v.Clients.showList($m.Client.select());
$('#save').bind('click',function(){
$m.Client.insert([$('#firstname').val(),$('#lastname').val()]);
$v.Clients.showList($m.Client.select());
});
}
};

View:

1
2
3
4
5
6
7
8
$v.Clients = {
showList : function(array) {
$('#clients-list').empty();
for(i = 0;i < array.length;i++) {
$('#clients-list').append('<li>'+array[i].firstname+' '+array[i].lastname+'</li>')
}
}
}

looks pretty cool eh? :)

Demo: http://dev.floriansweb.com/upload/sandbox/jamal/

Sourcecode Download: http://dev.floriansweb.com/upload/jamal_mvc_orm.zip

But i got some more ideas: real offline/online support need data synchronizations!

1
2
3
4
5
6
7
8
9
 
$m.Client = {
externalData: '/ajax/clients/findAll',
syncEngine: '/ajax/clients/sync',
table: {
firstname     : jamal.Fields.String({maxLength:70}),
lastname      : jamal.Fields.String({maxLength:70}),
},
};

$m.Client.externalData could also be ‘index.php?model=client&action=getAll’. Its the method on the server which get all the server data and encode it into JSON. I get it with JQuerys $.getJSON. It should look like this:

1
$m.Client.download();

Synchronizations:

First time you start the Application you need to download all the data from the server. Every insert,update,delete,select goes to the local DB. Every time you call insert,update,delete from a model the jamal.History.log(action,model,id) method creates a log entry.

1
jamal.History.log("new","client",5)

Action is the action - new, updated or deleted , model is the Model - client, user etc.. and ID is the affected rowid.

After the log the sync method is called. The Sync Method sends via ajax all the changed data / log entries to $m.Client.syncEngine. The syncEngine on server should manage now the synchronizations with replaying the log. If it fails - timeout - the jamal online status is set to false. If the request is successful the jamal online status is set to true and all log entries will be deleted.

To sum up:

Scenario: The user is offline and goes back online after 2 inserts :

1
2
3
4
5
$m.Client.insert(["test1","test1"]); // new log entry  "new","client",lastInsertRowId
$m.Client.sync();  //  fail - status : offline
//User goes online
$m.Client.insert(["test2","test2"]);  // new log entry "new","client",lastInsertRowId
$m.Client.sync(); //  success - status online - delete log entries!

Okay thats for now! I hope you understood my idea. I’m trying to implement it right now.

I’m very thankful for every feedback.

Thanks! :)

Fensterlose Welt 0

Ich bin ein Switcher. Nun gut - das ich zum Mac geswitched hab ist schon etwas länger her, doch hatte ich immer noch meinen alten PC für Spiele, Daten und Photoshop. Da ich meine Arbeit immer mehr und immer mehr auf mein Macbook verlagert habe, hatte der PC nicht wirklich mehr eine große Funktion.

Darum hab ich Heute nicht lang überlegt und mir die aktuellste Ubuntu Version ( 7.04) installiert. Und wie man es von Linux gewohnt ist - war die Installation einfach und sofort ready to go mit allen wichtigen Programmen für Office/Internet/Email/Musik .

Halt! “Wie man es bei Linux gewohnt ist”? Ich rede sicher von ein Mac System? Nein!

Ich muss zugeben das ich seit Jahren kein Linux für den Desktop Einsatz verwendet habe. Und meine damaligen Errinnerungen sind recht ernüchternd. Doch hat sich da wirklich einiges getan.

Nach der Installation war Netzwerk eingerichtet, es wurden nach Updates im Internet geschaut und herruntergeladen. Mit 2-3 Klicks waren die üblichen Orderfreigaben für Musik und Daten eingerichtet. Fertig :)
Mit dem neuen Desktopeffekten die seit Version 7.04 built-in sind füllt sich Linux toll an - Allgemein ist das Handlung gut und man kommt schnell zurecht.

Eins stört mich aber etwas. Mir fehlt Spotlight! :O

Ich werde mein Linux System nun komplett einrichten und es wird wohl noch ein Erfahrungsbericht folgen.

Archives 0

Do not edit this page

How good software goes bad 0

Ich hab mich etwas länger nicht gemeldet. Hatte einiges zu tun und irgendwie nicht die Zeit was neues zu schreiben :-/

Aber hier ein Comic der mein Tag irgendwie gerettet hat :-)
bugbash-1.png

Stop Motion Fighter Video 0

Passt wohl wieder nicht in diesen Blog aber ich hab mal wieder unnütze Sachen produziert.

Ein Stop Motion Film - Viel Spaß beim anschauen - auch wenn er nicht lange geht.

[youtube zMbLl521dk8]

NSBrowser vs. YUI ColumNav 0

ColumNav ist eine Erweiterung für Yahoo UI und Bill Scott’s Karussell Komponente und sozusagen das Gegenstück zum Cocoa Element NSBrowser

web_columnav.jpg
ColumnNav

cocoa_columnav.jpg
NSBrowser

Als Datenquelle werden Verschachtelte HTML Listen verwendet.
[html]

  • Freunde
    • Hans Maulwurf
    • Lisa
  • Familie
    • blah
    • blah

[/html]
Die ColumnNav ( + Karussell Komponente ) wird so initialisiert (HTML)
[html]

[/html]
Jetzt noch alle Javascript Dateien einbinden.
[html]








[/html]
Und ein paar Zeilen Javascript
[javascript]
function init() {
var cn_cfg = { prevElement: ‘columnav-prev’, source: document.getElementById(’linkliste’) };
var cn = new YAHOO.extension.ColumNav(’columnav’, cn_cfg);

}
YAHOO.util.Event.addListener(window, ‘load’, init);
[/javascript]
Und schon haben wir eine NSBrowser Komponente fürs Web. :)

Zur Karussell Komponente hätte ich noch eine weitere Idee.
Zusammen mit der Reflection.js ( für Mootools ) würde man sicher einen sehr netten Coverflow a la iTunes hinbekommen.

Ich denke für YUI gibts wohl auch eine Reflection Komponente. Derzeit kenn ich nur script.aculo.us Reflector, einen unabhängigen Reflection Script und für JQuery hatte ich auch schon einen gesehen.
Wenn ich am Wochenende etwas Zeit finde werd ich so etwas mal ausprobieren.

Steve Jobs und Bill Gates 0

21-1441066228L.jpg

Keep your friends close, but your enemies closer.

Cocoa RSS Reader 0

Heute habe ich mir vorgenommen einen RSS Reader in Cocoa zu schreiben.

hackdev_rssReader.jpg

Nach etlichen lesen von Tutorials schreib ist sozusagen meine erste richtige Cocoa Application.
Als erster Schritt war für mich das User Interface und das gaze einrichten von CoreData. (Entities eingerichtet, Relationen erstellt, Bindings gesetzt etc. )
Das Interface war etwas komplizierter als ich gedacht hatte. Besonders die Toolbar und die Highlighted gradient Cells.
Für die Toolbar hab ich die IBPalette generictoolbar benutzt. Das mir einiges an Code Arbeit erspart.

hackdev_rssReader_add.jpg

Um neue Feeds hinzuzufügen klickt man auf “+ Subscribe” und es öffnet sich ein Sheet Window.
Für das Sheet Window hab ich einen eigenen Controller implementiert der für das öffnen und schließen zuständig ist.
[code]
// SheetController.h
@interface SheetController : NSObject
{
IBOutlet id mainWindow;
IBOutlet id subscribeSheet;
}
- (IBAction)closeSheet:(id)sender;
- (IBAction)openSheet:(id)sender;
@end

// SheetController.m

@implementation SheetController

- (IBAction)closeSheet:(id)sender
{
[subscribeSheet orderOut:nil];
[NSApp endSheet:subscribeSheet];

}

- (IBAction)openSheet:(id)sender
{
[NSApp beginSheet:subscribeSheet
modalForWindow:mainWindow
modalDelegate:self
didEndSelector:NULL
contextInfo:nil];
}
@end
[/code]
Das IBOutlet subscribeSheet ist das Fenster mit den Titel & URL Textfeldern - mainWindow das Hauptfenster (Eltern Fenster).

Allerdings habe ich noch große Probleme wie ich mit Cocoa die Feeds einlese und dann in CoreData speichere.
Mit der Refresh Funktion sollen alle Feeds geladen werden und neue Einträge in CoreData geschrieben werden.
Ich hab mir bisher NSUrl, NSXML und den Webservice Bereich in der Dokumentation angeschaut. Hab aber noch keine ideal Lösung gefunden - bzw. eine die ich auch verstehe ;-)

Next Page »