Windows Phone and Open-Xchange: Syncing PIM data using HostEurope

Well over ten years ago, I did one of the stupidiest things in my life: I bought a Schroff eurorack 19″ server cabinet (>1000 euro) for my semi-indoor verandah, and signed up for a fixed SDSL Internet connection (300 euro/month, but oh my God was it fast: 1 Mb/s in both directions).

Sounds crazy, but remember kids: this was a decade before 20 euro/month virtual root servers, or 45 euro/month 50 Mb/s VDSL Internet pipes.

I actually had such a glass doored rack on my verandah!

In the rack I kept several linux computers, running my own name server, postfix smtp server, and cyrus imap server. I learned a lot, but as time went by I realized that my most scarce resource was time. And when I left Stockholm for Berlin, I couldn’t really bring all that stuff with me…

So I started to use the e-mail provider FastMail (highly recommendable!), and used its address book as contact manager. Worked fine until I bought an e-mail capable cell phone, so I added Memotoo (also an excellent service!) to my service provider portfolio.

But The Times Are A Changin’… and Memotoo turned out incapable to sync with the Windows Phone, unless one made a detour via Microsoft Live Hotmail.

No way I’d handle over my precious contact/calender/task data to some freebie “service provider” like Microsoft, Google, or Facebook. But I’ve also become lazy, so what to do?

The native sync method for the Windows Phone is (of course) the (Microsoft proprietary) Exchange ActiveSync protocol. But the idea of setting up and operating Microsoft Exchange, or using a Microsoft hosted service, didn’t appeal to me the least.

Then I learned about Open-Xchange. And all pieces fell in place!

So now I’m paying 3 euro/month to highly reputable Host Europe for their product Mail Basic with the Mobility Mailbox upgrade (warning: in German! but the OX gui can be made English speaking). I’m not using the mail account though, nobody beats FastMail.

It simply works, and syncing is more or less instantaneous.

Defected Linux Hippie recommends Windows tools: Virtual Desktops

Until two years ago I had only been using Windows if absolutely forced to. In fact I hadn’t really owned a DOS/Windows based desktop computer before.

My first own computer was a Commodore Amiga 2000, which I bought early 1987 for almost $ 6,000 (corrected for inflation). Admitted, that was with an optional second floppy drive, and a color monitor; my successful bargaining had even made the salesman throw in Lattice C Compiler. Nevertheless, it was a fortune to me.

Some years later, after having finished my Computer and Systems Science studies, I bought a Bridgeboard expansion card, with a 286 CPU running MS/DOS. I was using it for telecommuting (an extremely exotic thing at that time, kids!) to a mainframe using a 3270 emulator and an analog 9600 bps modem. And I learned some DOS.

As time passed, the Amiga was marginalized, so I sold my A 2000 and built my own PC. But I refused to buy Windows. Instead I placed my bet on IBM OS/2. A wonderful thing, especially with the GUI extension Object Desktop. OS/2 could run (most) Windows programs, so I got by without a Windows computer yet some more years…

My first laptop was a Siemens Nixdorf Scenic Mobile 800, an exquisite piece of German engineering. The first thing I did was to throw out Windows NT and replace it with Red Hat Linux. And I installed VMware (pretty new and sexy stuff then!) and run Windows there.

( almost ten years went… )

Late an evening, or early a morning, I sat by my n:th linux desktop and visited (not “played”!) Second Life, which places extreme demands on the graphics adapter. Too extreme, it turned out. Because suddenly the screen turned black, and the computer crashed. The buggy X drivers in SUSE Linux had caused my expensive Radeon adapter to fry. This was the tipping point to me, together with a number of signs hinting at a slow death for linux as a desktop operative.

A more conformist developer had taken the OS X path. But then again, I am what I am… So I built yet-another-pc and bought a Technet Windows 7 Ultimate license, well before it was available to the public. This was well over two years ago, which is probably how long time it actually takes to really get accustomed to a new part of your brain.

Finally the recommendation I promised:

One thing I immediately missed in Windows was virtual desktops. After having tried many free products, all more or less crappy, I finally decided to paid 25 euro for Dexpot. It has everything I need, and much more. Dexpot has been extremely stable, and updates come regularly. You’ll find some demo videos here.

Switching to WordPress

Planet Plone now lists the feed address to my new blog, thanks to Jon Stahl and Sean Kelly (and Mikko Wyn “asigottechOhtamaa, a.k.a. moo-_- Williams). “New” since I’m getting older and lazier, “having fun” no longer means “transmogrifying Plone into a blogging engine” to me. SimpleBlog and Scrawl have served very well, but life is just too short. And WordPress is just too good, php or not.

I’m hosting this blog, and several others for good friends, using an almost free off-the-shelf webhosting account. And yes, it is true: installing WordPress does actually take just five minutes.

Trying out WordPress also serves another purpose: Getting to know my enemy. I’ve lost several bread-and-butter accounts the last few months to WordPress shops. Let’s face it: Those days are over, when you could charge more than little for a simplistic website which the end-user can modify through the web…

(The images show legendary ugly Swedish ad postcards, from a time long gone.The slogan means “Start a computer course now!”.)

Windows findings, part one: Installation

Trying to fix #10441 (the single remaining blocker for Plone 4.0 rc1)

Everything below applies to the latest available Windows installer for Plone 4.0: http://launchpad.net/plone/4.0/4.0b3/+download/Plone-4.0b3.exe .

NOTE: Since beta 3, several Windows bugs have been fixed. If you want to try the Windows service, you might want to apply these to your beta 3 installation :

  • “console” mode (i.e. foreground without debug) now works (changeset 121480 in collective)
  • make the Windows Local Service start Zope in “console” mode rather than in “fg” mode (changeset 121463 in collective)
  • Windows service installed using incorrect service name (changeset 121449 in collective)
  • the button “View Plone” in the Plone controller renamed to “Create/View Plone site”, clicking it now opens the new fancy Zope root page (changesets 121433 and 121431 in collective)

Installation

Plone-4.0b3.exe is an Inno Setup installer, some notes about how it is put together are available here. (The mentioned “Enfold’s internal build system” is available here.)

I have used the (unofficial) “Inno Setup Unpacker” innounp to reverse engineer its content, which obviously is very similar to that of the unified installer. The most interesting of the extracted files is “install_script.iss”:

;InnoSetupVersion=5.3.6 (Unicode)

[Setup]
AppName=Plone
AppVerName=Plone (version 4.0.0) (build 36062)
DefaultDirName={pf}\Plone
DefaultGroupName=Plone
OutputBaseFilename=Plone-4.0b3
Compression=lzma

[Files]
Source: "{app}\LICENSE.GPL"; DestDir: "{app}"; MinVersion: 4.0,5.0;
Source: "{app}\plone.ico"; DestDir: "{app}"; MinVersion: 4.0,5.0; Flags: restartreplace ignoreversion
Source: "{app}\buildout-patch-script.py"; DestDir: "{app}"; MinVersion: 4.0,5.0; Flags: restartreplace ignoreversion
Source: "{app}\fixup-scripts.py"; DestDir: "{app}"; MinVersion: 4.0,5.0; Flags: restartreplace ignoreversion
Source: "{app}\runner.py"; DestDir: "{app}"; MinVersion: 4.0,5.0; Flags: restartreplace ignoreversion
Source: "{app}\README.txt"; DestDir: "{app}"; MinVersion: 4.0,5.0; Flags: restartreplace ignoreversion
Source: "{app}\bootstrap.py"; DestDir: "{app}"; MinVersion: 4.0,5.0; Flags: restartreplace ignoreversion
Source: "{app}\distribute_setup.py"; DestDir: "{app}"; MinVersion: 4.0,5.0; Flags: restartreplace ignoreversion
Source: "{app}\base.cfg"; DestDir: "{app}"; MinVersion: 4.0,5.0; Flags: restartreplace ignoreversion
Source: "{app}\buildout.cfg"; DestDir: "{app}"; MinVersion: 4.0,5.0; Flags: restartreplace ignoreversion
Source: "{app}\versions.cfg"; DestDir: "{app}"; MinVersion: 4.0,5.0; Flags: restartreplace ignoreversion
Source: "{app}\zope_versions.cfg"; DestDir: "{app}"; MinVersion: 4.0,5.0; Flags: restartreplace ignoreversion
Source: "{app}\buildout-cache\eggs\Acquisition-2.13.3-py2.6-win32.egg\EGG-INFO\not-zip-safe"; DestDir: "{app}\buildout-cache\eggs\Acquisition-2.13.3-py2.6-win32.egg\EGG-INFO"; MinVersion: 4.0,5.0; Flags: restartreplace ignoreversion

;;; almost seventeen thousand more files in "\buildout-cache\eggs\"

Source: "{app}\python\Lib\site-packages\distribute-0.6.10-py2.6.egg\EGG-INFO\PKG-INFO"; DestDir: "{app}\python\Lib\site-packages\distribute-0.6.10-py2.6.egg\EGG-INFO"; MinVersion: 4.0,5.0; Flags: restartreplace ignoreversion

;;; almost three thousand more files in "\python\Lib\"

[Dirs]
Name: "{app}\products";
Name: "{app}\buildout-cache\downloads";

[Run]
Filename: "{code:DirName|None}\python\pythonw.exe"; Parameters: "{code:SafeRunnerPrefix|None} ""{code:DirName|None}\buildout-patch-script.py"" -c ""{code:Dirname|None}\buildout.cfg"" -r ""plone.recipe.zope2instance"" -o ""user"" ""{code:GetUserName|None}:{code:GetPassword|None}"""; WorkingDir: "{app}"; StatusMsg: "Adjusting buildout configuration"; MinVersion: 4.0,5.0;
Filename: "{code:DirName|None}\python\pythonw.exe"; Parameters: "{code:SafeRunnerPrefix|None} ""{code:DirName|None}\bootstrap.py"" --distribute_setup-source=distribute_setup.py --version=1.4.3 --eggs=buildout-cache\eggs --download-base=buildout-cache"; WorkingDir: "{app}"; StatusMsg: "Running buildout"; MinVersion: 4.0,5.0;
Filename: "{code:DirName|None}\python\pythonw.exe"; Parameters: "{code:SafeRunnerPrefix|None} ""{code:DirName|None}\bin\buildout-script.py"" -q -U -N buildout:install-from-cache=true buildout:download-cache=buildout-cache"; WorkingDir: "{app}"; StatusMsg: "Running buildout"; MinVersion: 4.0,5.0;
Filename: "{code:DirName|None}\python\pythonw.exe"; Parameters: "{code:SafeRunnerPrefix|None} ""{code:DirName|None}\bin\cluster-control-script.py"" ""--cfg-file={code:DirName|None}\buildout.cfg"" remove install manual"; WorkingDir: "{app}"; StatusMsg: "Registering services"; MinVersion: 4.0,5.0;
Filename: "{code:DirName|None}\python\pythonw.exe"; Parameters: "{code:SafeRunnerPrefix|None} ""{code:DirName|None}\bin\cluster-control-script.py"" ""--cfg-file={code:DirName|None}\buildout.cfg"" remove install auto"; WorkingDir: "{app}"; StatusMsg: "Registering services"; Description: "Start Plone automatically when starting this computer"; MinVersion: 4.0,5.0;
Filename: "{code:DirName|None}\python\pythonw.exe"; Parameters: "{code:SafeRunnerPrefix|None} ""{code:DirName|None}\bin\plonectl-script.py"" init"; WorkingDir: "{app}"; StatusMsg: "Creating Plone Site"; MinVersion: 4.0,5.0;
Filename: "{code:DirName|None}\python\pythonw.exe"; Parameters: "{code:SafeRunnerPrefix|None} ""{code:DirName|None}\fixup-scripts.py"" ""{code:DirName|None}\bin"" ""{code:DirName|None}\python\Scripts"""; WorkingDir: "{app}"; StatusMsg: "Fixing scripts to point to the right Python executable"; MinVersion: 4.0,5.0;
Filename: "{code:DirName|None}\python\pythonw.exe"; Parameters: """{code:DirName|None}\bin\plone-controller-script.py"" ""{code:DirName|None}\buildout.cfg"""; WorkingDir: "{code:DirName|None}"; Description: "Start the Plone Controller"; MinVersion: 4.0,5.0;

[UninstallRun]
Filename: "{code:DirName|None}\python\pythonw.exe"; Parameters: "{code:SafeRunnerPrefix|None} ""{code:DirName|None}\bin\cluster-control-script.py"" ""--cfg-file={code:DirName|None}\buildout.cfg"" remove"; WorkingDir: "{app}"; StatusMsg: "Stopping and removing services"; MinVersion: 4.0,5.0;

[Icons]
Name: "{group}\Plone Controller"; Filename: "{code:DirName|None}\python\pythonw.exe"; Parameters: """{code:DirName|None}\bin\plone-controller-script.py"" ""{code:DirName|None}\buildout.cfg"""; WorkingDir: "{code:DirName|None}"; IconFilename: "{code:DirName|None}\plone.ico"; Comment: "Start/Stop Plone Services"; MinVersion: 4.0,5.0;

[Types]
Name: "full"; Description: "Full installation"; MinVersion: 4.0,5.0;

[CustomMessages]
NameAndVersion=%1 version %2
AdditionalIcons=Additional icons:
CreateDesktopIcon=Create a &desktop icon
CreateQuickLaunchIcon=Create a &Quick Launch icon
ProgramOnTheWeb=%1 on the Web
UninstallProgram=Uninstall %1
LaunchProgram=Launch %1
AssocFileExtension=&Associate %1 with the %2 file extension
AssocingFileExtension=Associating %1 with the %2 file extension...

Let’s now study the [Run] section…

The first three lines do something very similar to “install.sh” of the unified installer, the rest is Windows specific.

  • “bin\cluster-control-script.py” just sets sys.path and then calls collective.buildout.cluster.cluster.main() to install the Zope server as a Windows service. The actual service installation is done by collective.buildout.cluster.base.ClusterBase.install() using “win32serviceutil.InstallService()“.ASIDE: Compare the code in Zope2.Startup.zopectl.do_windows()which installs a Windows service when “bin/instance.exe install” is run. Or rather attempts to. This doesn’t seem to work.I don’t understand why this script is called two times… The first call installs a Windows service which is not started automatically when the computer starts. The second call first removes the service, and then installs it again in auto start mode.
  • bin\plonectl-script.py is supposed to create a Plone site (ultimately using mkPloneSite.py, which possibly is deprecated/obsolete). However, this fails (although the log messages claim otherwise).
  • bin\plone-controller-script.py starts the Plone Controller, which will be the subject of the next part. Stay tuned…

ERRATA: Sidnei “dreamcatcher” da Silva has kindly corrected a few details:

You shouldn’t need to unpack the installer to figure out what it does. In fact, it’s misleading because the unpacked iss seems to be missing some key information.

The original source can be found here: http://svn.plone.org/svn/plone/Installers/Windows/trunk/4.0/inno/plone.iss

The script to install the service is *not* called two times. There’s two separate lines in the [Run] section yes, but one of them is only run when the ‘Start Plone automatically when starting this computer’ is checked (or unchecked, can’t remember).

The ‘create a plone site’ part is inherited from the 3.0 installer, and should probably be removed or replaced with something else that works better.

hello, #plone

In which the author introduces himself, and shows how easily @font-face can be used with Plone.

I’ve been along in the outskirts of the Plone community for almost seven years now. So it’s about time I join Planet Plone… In a former life, my first name was Svante. After my computer science studies at Stockholm University, I spent many years working for the Swedish telecom company Ericsson. Since 1997 I’m self-employed. Until 2003 I was living in Stockholm, when I left the cold weather and the exorbitant taxes.

I’m no designer, but nevertheless I try to avoid ugliness no matter what shape it assumes. Hence, I’m very happy to see that “web fonts” slowly are becoming mainstream. The current balkanization (Microsoft with EOT vs. everybody else with WOFF) does however complicate matters for us. An even higher hurdle is the (well founded) fear of the font foundries, that their intellectual property will deflate the same way music and movies have done.

The solution seems to be FaaS (Fonts as a Service), and everybody is currently hyping typekit. Their font offering is huge and of excellent quality. However, I found their licensing terms somewhat draconic, and their technology too javascripty.

A less pricy solution would be KERNEST, but the quality of the fonts I tested didn’t impress me too much.

Finally, I decided to use Typotheque. A very limited set of high quality fonts. No JavaScript. Pay once, use the font forever on how many sites you like (traffic exceeding 500 MB/month costs 1 euro/GB). All I had to do in Plone, was to add a new stylesheet in the Stylesheets Registry (portal_css in ZMI) using the URL generated by Typotheque:

Web Font Project settings on typotheque.com:

portal_css in ZMI:

Finally: If the letters on this page look jagged, and you’re using Windows XP: please enable ClearType!