Saturday, August 7, 2010
Solving Outlook 2003 mess: "There was a problem reading one or more of your reminders. Some reminders may not appear"
* 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.
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
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)
- Install Zend CE, the free Zend Community Edition server, as explained in http://files.zend.com/help/Zend-Server-Community-Edition/deb_installation.htm
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>
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
Now you can access the project at http://localhost/myprojecturl
- Back in Studio, go to Run==>Debug Configurations. Configure this:
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.
Friday, June 26, 2009
Ubuntu/linux, how to fix error: "checking for zlib.h... no configure: error: You must have zlib.h and zlib installed"
sudo apt-get install zlib1g-dev
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.