Saturday, August 7, 2010

Solving Outlook 2003 mess: "There was a problem reading one or more of your reminders. Some reminders may not appear"

I tried many things that did NOT work:
* scanpst.exe
* Deleting all reminders
* Create a new Mail profile
* Reinstall office 2003

Finally, I solved the problem by importing the Office settings from another computer. I run the "Save my Settings Wizard" on the other computer, exported the settings, and then imported those settings in the troubled computer, thereby losing all Office configuration. That way at least Outlook would start without complaining about the reminders problem (the reminders problem didn't seem to be related to the actual PST file, since creating a new Mail profile created a brand new PST file and the problem wasn't solved by that).
Finally, I could run File->Import and import everything from the old PST file!

Tuesday, July 7, 2009

Java thread pooling and connection pooling: How to handle proper connection cleanup on thread exit.

I wanted to have a fixed pool of threads for executing tasks that needed MySQL database access. Also, I couldn't afford to create and destroy a connection for each task; I needed to have up to one persistent connection per thread, so that the many tasks that will successively execute on that thread, will re-use the same connection.
Another problem that I had was how to clean up the connection if the ThreadExecutor decides to close my thread. It's all solved in the following code.

The following codes runs OK for me in Java 1.6 SE. Please do let me know if you find flaws with it.


import java.sql.Connection;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;

public class MyManager {
    private ExecutorService pool;

    public static void main(String[] args) throws Exception {
        (new MyManager()).run();
    }

    private void run() throws Exception {
        pool = Executors.newFixedThreadPool(10 /* thread pool size */,
                new MyThreadFactory());

        WorkerCounter counter = new WorkerCounter();

        while (true) {
            for(int i = 1; i < 1000; ++i)
                pool.execute(new AngolanTask(counter));

            /*
             * This is a requirement I had; you may not need this: I had to execute 1000
             * tasks (for loop above), then way for every task to finish, and loop again (while loop).
             * That's why I need the WorkerCounter class I created.
             */
            counter.blockTillEveryonesDone();
        }

        // You may care to:
        // pool.shutdown();
    }
}

/**
 * The actual task run code.
 */
class AngolanTask implements Runnable {
    private WorkerCounter counter;

    public AngolanTask(WorkerCounter counter) {
        this.counter = counter;
    }

    /**
     * Called by the thread pool's thread
     */
    public void run() {
        counter.workerStarting();
        try {
            /*
             * Put your actual task code here. In particular, I need my thread-local connection.
             */
            Connection conn = DbDispenser.getDB();
        } finally {
            counter.workerDone();
        }
    }

}

/**
 * Allow the master to know when all threads have finished. Inspired on
 * http://www.ibm.com/developerworks/library/j-thread.html
 */
class WorkerCounter {
    private int activeWorkers = 0;

    public synchronized void blockTillEveryonesDone() {
        while (activeWorkers > 0) {
            try {
                wait();
            } catch (InterruptedException e) {
                // keep trying
            }
        }
    }

    public synchronized void workerStarting() {
        activeWorkers++;
    }

    public synchronized void workerDone() {
        activeWorkers--;
        if (activeWorkers == 0)
            notify(); // alert a thread that's blocking on this semaphore
    }
}

/**
 * Creates threads that clean up connection if finalized.
 *
 * Copied from Executors.defaultThreadFactory()
 */
class MyThreadFactory implements ThreadFactory {
    static final AtomicInteger poolNumber = new AtomicInteger(1);
    final ThreadGroup group;
    final AtomicInteger threadNumber = new AtomicInteger(1);
    final String namePrefix;

    MyThreadFactory() {
        SecurityManager s = System.getSecurityManager();
        group = (s != null) ? s.getThreadGroup() : Thread.currentThread()
                .getThreadGroup();
        namePrefix = "pool-" + poolNumber.getAndIncrement() + "-thread-";
    }

    public Thread newThread(Runnable r) {
        Thread t = new AngolanThread(group, r, namePrefix
                + threadNumber.getAndIncrement(), 0);
        if (t.isDaemon())
            t.setDaemon(false);

        // Set thread priority here, if needed
       
        return t;
    }

    class AngolanThread extends Thread {
        public AngolanThread(ThreadGroup group, Runnable target, String name,
                long stackSize) {
            super(group, target, name, stackSize);
        }

        @Override
        public void run() {
            try {
                super.run();
            } finally {
            }
        }
    }
}

// Connection's are not thread-safe.
// http://www.ibm.com/developerworks/java/library/j-threads3.html
class DbDispenser {
    private static class ThreadLocalConnection extends ThreadLocal {
        public Object initialValue() {
            try {
                return null; // Create your connection here.
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }

    private static ThreadLocalConnection conn = new ThreadLocalConnection();

    public static Connection getDB() {
        return (Connection) conn.get();
    }
}

Saturday, June 27, 2009

How to debug a Zend Framework application in Ubuntu

Why I wanted to debug Zend Framework
I got started with CodeIgniter, and I later found out that it's designed to not work well with debuggers. There are CodeIgniter forum posts dating as far back as 2007 where you can get instructions on how to patch the source code and tweak the config files so that query string (GET params) work, which XDebug and Zend Debugger both need to work. I spent hours trying to debug with Aptana PHP (plugin 1.0 and 1.1 Beta) and Eclipse PDT, and failed. I decided to trash a framework so backwards as CodeIgniter.

How to
If you don't want to install Zend Platform (the paid PHP server), it may not be much too intuitive how to hit the ground running with a sample Zend Framework project and be able to debug it. Here's who I finally managed. (I use Ubuntu 9.04)

echo 'deb http://repos.zend.com/deb/ce ce non-free' | sudo tee -a /etc/apt/sources.list
wget http://repos.zend.com/deb/zend.key -O- | sudo apt-key add -
sudo aptitude update

sudo apt-get install zend-ce

Add PHP to your path:
sudo ln -s /usr/local/zend/bin/php /usr/local/bin/php

  • Install Zend Studio for Eclipse from http://www.zend.com/en/products/studio/downloads. I used Studio 6.1. Zend Studio is not free! It costs $400 and comes with a 30-day trial. You can try also with Eclipse PDT, which is the free (scaled-down) version of Studio.
  • Download the project Zend Quickstart and unzip it. I renamed my directory zend-quickstart. We'll call the root <path to project's root>
In <path to project's root> run, as instructed by the README.TXT file:
php scripts/load.sqlite.php --withdata
chmod -R a+rwX data
  • Counter intuitively, the Debug command in Zend Studio doesn't actually deploy your project to the PHP server, so you need to do that yourself. By default the document root for Zend CE is /var/www
ln -s <path to project's root> /var/www/myprojecturl   (you can change myprojecturl obviously)
Now you can access the project at http://localhost/myprojecturl
  • Back in Studio, go to Run==>Debug Configurations. Configure this:
File: zend-quickstart/public/index.php
Server Debugger: Zend Debugger

Click PHP Server Configure. Go to Path Mapping tab, and Add:
* Path on Server: myprojecturl
* Local path: /zend-quickstart

Make sure the URL generated is correct. Should be /myprojecturl/public/index.php
  • Cool! Click the Debug button now, and the debugger should be stopped at the first line of the index.php script. Breakpoints should work.

My favorite Firefox addons

To add a Firefox addon, go to the Tools->Addons menu, and on the first (Get Addons) tab, search for the name of the addon.

  • Cookie Swap: Instantly switch between different accounts in the same web site (e.g., Gmail). Forget about logging off and back.
  • Firebug: No web developer can do without it.
  • Google Toolbar: It's good to know the PageRank of the company you're checking out. It's like asking the rest of the world how good they are, and getting a single digit for an answer.
  • NetVideoHunter: Download videos from video sharing sites (e.g., Youtube and others)
  • TabGroups Manager: Organize your zillions of open tabs!
  • Tabs Open Relative: Who at Mozilla came up with this idea that when you open a link in a new tab it should open at the far right? Fix it with this plugin.
  • Restart Firefox: Don't want to close all your open firefox windows before restarting? Use this. (You should have many firefox windows if you're using TabGroups, but...)
  • Tiny Menu: Reclaim your valuable vertical screen space.

Saturday, June 20, 2009

"Facebook API "Fatal error: Call to undefined method FacebookRestClient::stream_get() in ..."

Fatal error: Call to undefined method FacebookRestClient::stream_get() in /home/aptana/domains/x.aptanacloud.com/web/htdocs/index.php on line 18



NOTE: If you're using the official PHP client library and you downloaded it from the example code link on the Developer Application, you may have gotten an outdated release that doesn't contain the stream_get method and others released recently, and thus you'll get runtime errors. Use the official Facebook PHP Client Library package from SVN for the latest code.

Monday, May 25, 2009

Export Microsoft Outlook contacts and calendar into Evolution

Using Evolution 2.26.1, if you go to the program's help and search for "outlook", you'll get instructions to export your contacts & calendar from outlook as CSV (DOS). In Outlook 2003, doing that for contacts doesn't work (when you import, you get thousands of bogus contact data); doing that for calendar doesn't work either (nothing gets imported).
Also using Outport for exporting calendar didn't work for me; evolution didn't recognize the ics file as valid.

The solution I found was to install Outlook 2007 (if you don't have it, grab the free Trial from Microsoft), and:
- Export contacts as CSV as before

- Export calendar by using Save As, as explained here. This way, not only did it work well, but also avoided problems with recurring events, which don't get exported correctly by exporting to CSV.

You can import these into Google Calendar (nice to have SMS notifications!) and Google Mail contacts. The only problem seems to be that characters like "ñ" get scrambled.