tNGS - theNerdGirlSpace
openoffice stuck in “restore windows” dialog

recently openoffice (ver 3.3.0) crashed while i was filling up  my daily task times. nothing horrible happened ‘cause i’m a constant “cmd+s presser” :) so everything was saved.

as i tried to startup openoffice again, it showed a dialog which let me choose between “restore windows” or “don’t restore windows”. now the bad thing started… despite which button i clicked the dialog won’t disappear. seems, that this bug exists for a while, because even libreoffice has the same problem.

stuck in "restore windows" dialog

so, how can i fix this problem?
i just deleted the openoffice folder in the homedirectory’s application support folder and restarted the system. the exact path is 

~/Library/Application Support/OpenOffice.org

attention: in OSX Lion the homedirectory’s libary folder is hidden per default. so you first have to make all hidden finder entries visible. just open up a terminal window and enter this string.

defaults write com.apple.Finder AppleShowAllFiles YES 


for the more experienced users, who know what “rm -rf” really does :D, delete this folder at the console:

cd ~/Library/Application Support
rm -rf OpenOffice.org 


in any case, restart the system after you deleted the folder. afterwards openoffice should work again as expected :) have fun!

scannen mit hp laserjet 3055 unter osx 10.7 lion

was tun, wenn OSX major releases ins land ziehen und man aber seinen alten drucker mit all seinen funktionen weiter verwenden will? 

man muss erfinderisch werden :)

mein problem war, dass ich mit der install-sw von HP zwar ohne weiteres drucken kann, aber scannen war nicht mehr drin. der HP Director erkannte den drucker gar nicht mehr und somit war nicht mehr an scannen (und auch faxen, wer auch immer sowas heute noch braucht) zu denken.

ein kleiner trick jedoch überredet OSX 10.7, scannen mit dem laserjet 3055 doch noch anzubieten. wenn man die install von OSX 10.6 noch hat, dann braucht man nur folgendes zu tun:

  • auf der alten install (10.5 oder 10.6) unter /Library/Preferences die datei com.hp.LaserJetAIO.plist kopieren
  • und unter 10.7 einfach in den selben ordner wieder reinkopieren
  • HP Director starten und tadaaaa, scanner ist verfügbar
hilarious shell

when i tried to start a server today with the wrong user, i just used sudo to start him anyway.

sudo /etc/init.d/mainserver start

and that’s what the shell told me, before executing my command :D

We trust you have received the usual lecture from the local System Administrator.
It usually boils down to these three things:    
#1) Respect the privacy of others.    
#2) Think before you type.    
#3) With great power comes great responsibility.

root’s password:
customized sections in UITableView mit NSFetchedResultController

einen sectionHeader/footer anzupassen, ist an sich keine schwierigkeit, da es hierfür bequeme delegate-methoden des UITableViewDelegates gibt.

- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;

mein problem war, dass ich die daten des NSFetchedResultControllers nach einem wert gruppieren wollte, der sich selbst nicht als property im model befindet.

d.h. ich hatte z.b ein object mit einer startzeit, einer endzeit und einem beschreibungstext als modelobjekt. gruppieren wollte ich die daten im der UITableView jedoch nach dem start__tag__, an dem die objekte angelegt wurden, und nicht nach der start/endzeit (da diese ja von objekt zu objekt immer unterschiedlich ist und somit keine gruppierung zustande kommt). d.h. ich wollte die zeit ignorieren und einfach nur nach dem datum selbst gruppieren.

und da fing mein problem an :)

nehmen wir zuerst mal folgendes objekt als modelgrundlage für den NSFechtedResultController an.

@interface TestObject : NSManagedObject {
}

@property (nonatomic, retain) NSDate * starttime;
@property (nonatomic, retain) NSDate * endtime;
@property (nonatomic, retain) NSString * text;

@end

weiter nehmen wir an, wir wollen ganz simpel nach dem text gruppieren. so müssen wir lediglich bei der erstellung des NSFetchedResultControllers auf den __sectionNameKeyPath__ achten. bei default-initialisierungen kann der wert einfach NIL sein. so werden keine sections angelegt, also nicht gruppiert. will man jedoch nach einem property des modelobjekts gruppieren, gibt man einfach dessen namen an.

da wir als beispiel nach dem text gruppieren wollen, würde die initialisierung des NSFetchedResultControllers wie folgt aussehen:

NSFetchedResultsController *aFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:self.managedObjectContext
sectionNameKeyPath:@”text”
cacheName:@”Root”];

wenn man nun noch die tableView:tableView titleForHeaderInSection:section implementiert, werden die sections mit dem wert aus dem text-property des TestObject-objekts benannt.

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
id sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section]; return [sectionInfo name];
}

soweit sogut. nun wollen wir aber keinen direkten propertywert als gruppierungsgrundlage verwenden, sondern wie oben erwähnt z.b. nur das datum der starttime, damit man die objekte nach tagen gruppiert auffindet.

hierfür muss man schon etwas in die trickkiste greifen, wie ich meine. zumindest lag die lösung für mich nicht sofort auf der hand.

also zuerst gehen wir her und erweitern unser modelobjekt um das property day in der TestObject.h datei. das is deshalb ein string, da wir die datums/zeitinformation des NSDate objekts nicht brauchen, sondern nur eine kurze stringrepräsentation des datums. damit hat auch der NSFetchResultsController kein problem, wenn er danach gruppieren soll.

@property (nonatomic, retain) NSString * day;

für dieses property day müssen wir nun noch eine methoden verfassen, damit es auch mit einem wert belegt wird. das passiert in der TestObject.m datei. in diesem beispiel wird einfach nur der datumswert aus der starttime geholt und die zeit dabei völlig ignoriert. raus kommt dabei ein string wie “14. Aug. 2011”. also ein kurzer datumsstring, der auch einfach vergleichbar ist.

- (NSString *) day {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];
NSString *formattedDateString = [dateFormatter stringFromDate:self.starttime];
return formattedDateString;
}

nun haben wir also unser model um einen neuen pseudowert erweitert. d.h. es sollte nun auch ganz einfach möglich sein, danach zu gruppieren :) und was tun wir, damit nach unserem neuen property day gruppiert wird? klar! ganz einfach den sectionNameKeyPath beim initialisieren des NSFetchResultController anpassen. sieht dann aus wie folgt:

NSFetchedResultsController *aFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext
sectionNameKeyPath:@”day”
cacheName:@”Root”];

da wird bereits die tableView:tableView titleForHeaderInSection:section implementiert haben, sollte die UITableView nun tun, wie ihr befohlen wurde und die TestObject objekte nach dem datum der starttime zu gruppieren und zusätzlich dieses datum auch als sectionheader benutzen.

voila :) wieder ein problem gelöst!

Serverseitige Konvertierung von Dokumenten: OpenOffice und der JODConverter

Folgende Anleitung machts möglich, serverseitige Konvertierung von Dokumenten vorzunehmen, und zwar von gängigen MSOffice Formaten nach html/pdf und einige mehr.

Dazu wird OpenOffice und der JODConverter verwendet. OpenOffice unterliegt der LGPL und kann somit auch gewerblich uneingeschränkt genutzt werden. Der JODConverter ist im Grunde “nur” ein Wrapper über das UNO Framwork von OpenOffice, kann aber ganz einfach als JAR benutzt werden.

Die Anleitungs selbst bezieht sich auf eine Installation unter Mac OS10.6, OpenOffice 3 und JODConverter 2.2.2.

Natürlich funktioniert dieses Setup auch unter Linux und Windows, aber die genaue Konfiguration/Terminalaufrufe sind OSX spezifisch.

Erst musst OpenOffice installiert werden. Einfach unter www.openoffice.org unterladen und in /Applications kopieren. Dann muss  OpenOffice als Service konfiguriert werden:

  • Setup.xcu in /Applications/OpenOffice.org.app/Contents/basis-link/share/registry/data/org/openoffice öffnen
  • folgenden Abschnitt im Code suchen:
     <node oor:name=”Office”>
  • direkt darunter folgenden Code einfügen:
    <prop oor:name=”ooSetupConnectionURL”>
        <value>
    socket,host=localhost,port=8100;urp;StarOffice.ServiceManager
        </value>
     </prop>
  • Datei speichern und schließen

OpenOffice ist nun als Service konfiguriert. Um es nun auch als Service zu starten, muss es im Terminal mit folgendem Aufruf gestartet weren.

sudo /Applications/OpenOffice.org.app/Contents/MacOS/soffice -display :0 -headless -nologo -norestore

 Jetzt sollte sich im Dock das OpenOffice Icon auftun, aber keine Oberfläche erscheinen. Wenn dem so ist: Glückwunsch. OpenOffice läuft als Service

Dieser JODConverter ist eine Java-Library, die als JAR ausgeliefert wird und alle Konvertierungen vornehmen kann, die OpenOffice selbst zur Verfügung stellt, nur eben als Serverservice nutzbar.  

Der JODConverter ist hier zu finden: http://www.artofsolving.com/opensource/jodconverter

Einfach runterladen und entpacken. Im lib-Verzeichnis findet man dann das jodconverter-cli-<versionsnummer>.jar. Direkt im Terminal führt man eine Konvertierung von Format A nach Format B wie folgt aus:

java -jar jodconverter-cli-2.2.2.jar test.doc test.pdf

test.doc liegt in diesem fall direkt im lib-Verzeichnis und das test.pdf wird auch dorthin generiert. Klarerweise kann man die Files auch mit Pfaden versehen :) 

Welche Konvertierungen möglich sind, kann man auf der JOD-Webseite einsehen. Ich habs vor allem für doc -> pdf und doc -> html verwendet. Die Ergebnisse sind sensationell!