Tuesday, June 09, 2009

Time-out when calling file_get_contents on PHP scripts hosted on Godaddy accounts

I noticed that if you're using a Godaddy shared web hosting plan you're limited to calling file_get_contents only on URLs that use the standard HTTP port 80


It may be a firewall rule that they have in place.


So if you have an url like http://app.example.com:8080/do?param=value, 

the call to file_get_contents will hang and eventually timeout, 

even if the same url is accessible directly from within a browser.


If you control the called web component you may be able to change it 

so that it would listen on the standard port 80.

Class name is wrong or classpath is not set for : com.mysql.jdbc.jdbc2.optional.MysqlDataSource

If you get this error when trying to ping a newly created JDBC connection pool from within GlassFish admin console, it's likely because you're missing the JDBC driver mysql-connector-java-5.1.*-bin.jar under the lib/ext folder on your domain. 


To fix it copy that file there (e.g. ~/glassfish-v2ur2/domains/domain1/lib/ext/mysql-connector-java-5.1.5-bin.jar ), restart the domain and try again.

You can get the latest copy of the driver from here.


Update: There was at least a comment below, indicating that this method may not work for GlassFish version 3.1.1 and the more recent JDBC connection drivers. Your best bet may be to use the official docs, for the particular version of GlassFish you're running. For 3.1.1 one doc and another doc indicates that mysql-connector-java-5.1.14-bin.jar should be placed under the lib folder, not under lib/ext folder. 

Saturday, June 06, 2009

How to troubleshoot the bootup of GlassFish + MySQL image on OpenSolaris

I've been using an Amazon image with GlassFish+MySQL+OpenSolaris. As I'm no sysadmin, I relied on a prebuilt image furnished by Sun as a base for my development.

Still I've been experiencing  various issues at bootup, when the app server wouldn't start. This is especially true when you reboot the instance with Amazon EC2 tools. It behaves better if you terminate and restart the instance.

So I devised a set of steps to ensure that the thing gets working. 


Check if the services are running:

svcs  | grep mysql

svcs  | grep glassfish


If not, start them:

svcadm restart svc:/application/mysql:default

svcadm restart svc:/application/glassfish/domain1:default


Keep an eye on the server log

e.g. tail -f /opt/gf21/glassfish/domains/domain1/logs/server.log


If that reports failure, you have work to do.


Sometimes the app server can't start due to a previous process not having released the essentials TCP ports. Do a

netstat -a | grep 3700 



if it shows some daemons listening do a

ps -ef

look for usr/jdk/instances/jdk1.6.0/jre/../bin/java -Dcom.sun.aas.instanceRoot=/opt/gf2


That may be a stale instance. Try to kill -9 and look for the process above to be vanished and the port 3700 to be free.


Try again 

svcadm restart svc:/application/glassfish/domain1:default


transient error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

While experimenting with an Amazon OpenSolaris+GlassFish+MySQL AMI. I have been getting some weird errors when launching mysql. 

-bash-3.2$ mysql -u root -p

Enter password: 

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)


I don't know if it has to do with this particular image (install/config issue) or if it's a side effect of the fact that's run on a virtual server, but a quick workaround seems to be:

svcadm restart mysql ran as root 

Friday, June 05, 2009

error when bundling OpenSolaris - based AMI on Amazon EC2

I needed a server in the cloud for a project, with Glassfish and MySQL installed. Having found a pre-built AMI (Amazon Machine Image) based on OpenSolaris it seemed to be fit for my purpose.

After kicking its tires I decided to place my customizations and re-bundle an image that would have them on upon reboot.

So I followed along the instruction from the Getting Started guide (http://docs.amazonwebservices.com/AWSEC2/latest/GettingStartedGuide/). Well, no good. The bundling failed with the following error reported by ec2-bundle-vol:


Cloning / into image file /mnt/ptmpimage...
Excluding:
/export/home
/rpool
/export
/
/mnt
/mnt
/mnt/ptmpimage
/mnt/ec2-bundle-workspace
Creating flash archive of file system...
Time: 0.086058s
Time: 0.023259s
Time: 0.229003s
Time: 0.023268s
Time: 0.113336s
Time: 0.023153s
Time: 0.036836s
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
devfsadm: disk_link: invalid disk device number (2051)
Time: 0.400378s
ERROR: Failed to evaluate 'flar create -n ec2.archive -S -R / -x /export/home/gf21 -x /export/home/mysql -x /rpool/boot -x /rpool/etc -x /export/home -x /bin -x /boot -x /dev -x /devices -x /etc -x /export -x /home -x /kernel -x /lib -x /lost+found -x /media -x /mnt -x /net -x /opt -x /platform -x /proc -x /.profile -x /root -x /rpool -x /sbin -x /sysbench -x /system -x /tmp -x /usr -x /var -x /mnt/cert-SGB3LC7W3STUADHK6YLJGLH45V6NGQQU.pem -x /mnt/ec2-bundle-workspace -x /mnt/pk-SGB3LC7W3STUADHK6YLJGLH45V6NGQQU.pem -x /mnt/cert-SGB3LC7W3STUADHK6YLJGLH45V6NGQQU.pem -x /mnt/ec2-bundle-workspace -x /mnt/pk-SGB3LC7W3STUADHK6YLJGLH45V6NGQQU.pem -x /mnt/ptmpimage -x /mnt/ec2-bundle-workspace /mnt/ec2-bundle-workspace/archive 2> /dev/null'. Reason: .




It turns out that Solaris AMIs have a different bundling procedure, so the instructions provided by Amazon in their guide don't apply (I think they're for Fedora (or other RedHat derrivatives) images).

For instructions specific to Solaris see
this.

Sunday, May 31, 2009

"The directory or file cannot be created (0x52)" error while installing S60 5th Edition SDK


While installing some of the newer SDK from Forum Nokia I'm getting greeted by the following error:



Nice, after looking at that bloated folder it's clearly that my FAT32 partition can't cope with the multitude of files that Nokia chose to dump there.

A quick look at FN reveals that others have the same problem (see here) and a suggestion for a fix, by deleting the resources for languages other than English.

So I went ahead an wrote the following script that does the trick:



import fnmatch
import os
import time

path = 'C:\\S60\\devices\\S60_5th_Edition_SDK_v1.0\\epoc32\\release\\winscw\\udeb\\z\\resource'

while True:

try:
for file in os.listdir(path):
if (fnmatch.fnmatch(file, '*.r0[023456789]') or
fnmatch.fnmatch(file, '*.r[123456789][0123456789]') or
fnmatch.fnmatch(file, '*.r[123456789][0123456789][0123456789]')):
print file
os.remove(path + '\\' + file)

except IOError as (errno, strerror):
print "I/O error({0}): {1}".format(errno, strerror)
except WindowsError as (errno, strerror):
print "Windows error({0}): {1}".format(errno, strerror)
except:
print "Unexpected error:", sys.exc_info()[0]
raise

time.sleep(10)



Update the path variable with your installation path and run this script after you hit the first error and chose retry. When you're done with the install kill the script.

Monday, May 25, 2009

missing WRT widget components when packaging with Aptana Studio

I've been using the Aptana Studio Community Edition and its plugin for creating S60 WRT widgets. It has a few good features that increase productivity, like a decent editor with code formatting, integrated contextual help, packaging and deploying functioning.

One annoying issue I found was that after adding new components to the widget, e.g. new .js, .png files, they are not picked up for packaging, unless you do a project refresh (right-click on the project in the project pane on the left side of the screen and chose "Refresh").

Failing to do this may result in wasting time debugging the unexpected behavior. One such step in debugging could be renaming the .wgz package to .zip and exploring that zip's content to check for the newly added components. If they are missing, surely a refresh is needed.

Friday, May 15, 2009

Unneeded white space in textarea

I noticed an annoying behavior of textarea elements that have white space between the opening and closing tags. That space shows up as the initial value of that element in the browser. 

I've been using an edit control built on top of a textarea for a recent project and I noticed that upon clicking on the control to get focus, the caret cursor would not land in the top let corner of the control, instead it would have a few characters of left padding. 

That's because my Komodo Edit IDE was formatting the code by putting the end tag on a different line and would add sufficient white space for a balanced indentation. That was causing the padding to appear. 

The workaround is to keep the textarea element with a truly empty value like this:
<textarea></textarea>

Wednesday, May 13, 2009

How to install GlassFish on CentOS and other Redhat derivatives

First you need to have Java installed, I prefer OpenJDK, which is available from EPEL , a community-run project which makes Fedora packages available to users of Red Hat Enterprise Linux 5, CentOS 5, and other RHEL 5 derivatives. First install the package that enables the EPEL repository:

su -c "rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-2.noarch.rpm"


Then fetch the packages needed:

su -c "yum install java-1.6.0-openjdk"

su -c "yum install java-1.6.0-openjdk-devel"


Set the JAVA_HOME environment variable to point to the location of the JDK installation. To find that location you can do a which java and repeated  ls -l to follow the links to the concrete location.

Do the installation, e.g.:

java -Xmx256m -jar glassfish-installer-v2.1-b60e-linux.jar


Add the as-install/bin/ directory to the PATH environment variable.

To connect to the admin console, open a web browser to on http://hostname:4848

For login, the default admin user name is admin and the password is adminadmin






  

Tuesday, May 12, 2009

How to enable access logging in GlassFish

For debugging, monitoring and audit purposes it's sometimes useful to analyze access logs. 

By default Sun's GlassFish server has such logging disabled. It can be enabled by editing the domain.xml file (e.g. domains/domain1/config/domain.xml) and changing the accessLoggingEnabled attribute of the http-service element to true.

Following the restart of GlassFish the logs are available under the logs/access folder, (e.g. domains/domain1/logs/access/).

Driving Recorder at 5000 downloads

Following the posting of my Driving Recorder application on GetJar at the beginning of the year I just went through the milestone of passing the 5000th download. 

So far the feedback from these people trying the app has been mute. The popularity seem to be holding steady, but the lack of feedback, and purchases :), makes me think that either their reporting system is broken or those numbers are mostly the result of site duplication robots.

How to install VMWare tools on CentOS 5.0

VMWare tools are needed for a smooth integration between the guest and host OS. I'm currently using VMWare Fusion for Mac, and I needed CentOS for a project. Here are the steps I went through:

In CentOS do yum install gcc kernel-devel

Compare the version of OS, reported by the uname -r with that of kernel headers, reported by rpm -q kernel-devel. If there's a mismatch, update the headers with yum -y upgrade kernel kernel-devel and reboot.

In WMware Fusion go to the Virtual Machine menu -> Install VMware Tools. 

In CentOS do a mount /dev/cdrom /mnt. Now you should have a gzipped tar with the tools in /mnt. Extract them into the /tmp folder with tar -C /tmp -zxvf /mnt/VMwareTools*.tar.gz

cd /tmp/vmware-tools-distrib
./vmware-install.pl and follow the prompts.



How to hide the .php extension in your URLs

Sometime you could implement web components that expose public REST-ful interfaces implemented in PHP. In those cases it may be useful to expose end points that are technology-agnostic. 

So, for example, instead of http://example.com/handler.php?param1=val1&param2=val2 you'd have http://example.com/handler?param1=val1&param2=val. Thus, you could later on decide to switch the underlying technology to something like servlets and reuse the old format for the URLs.

An easy way to accomplish this is using Apache's ability to do URL rewriting. Simply edit the .htaccess file in the root folder of your web directory and place the following directives:

RewriteEngine on 
RewriteRule handler handler.php

How to install MySQL on CentOS and other RedHat derivatives

One simple solution is to rely on yum and do:

sudo yum install mysql-server.i386


To ensure that the daemon starts automatically at boot-up you can do:

sudo chkconfig mysqld on

Where is httpd.conf located on Ubuntu ?

/etc/apache2

Saturday, April 25, 2009

"Update error" when installing SIS or SISX bundles

I came across a really useful service provided by Nokia, which gives you access to a pool of devices (real hardware) for testing.

Although I intended to use that for a different project, I thought I might try an app that I developed earlier, to see how it looks on different screen resolutions. To my surprise, the app failed to install on some phones, with the insightful error message "Update error". This is as bad as it gets in terms of usability on Nokia's side. It would have been nice to get a more detailed explanation to speed up the progress.

After a bit of digging it turns out was because my package had a file that already existed on the phone, that special c:\resource\errrd which, ironically, enables more detailed error messages. 

One lesson learned would be to ensure that all files installed by the app have a unique id, usually the app UID, somewhere in their full name (path included), to avoid collisions. Also, in hindsight I should have made a separate "enableDetailedErrMessages.sis" that would install c:\resource\errrd.

The other important lesson is to be more specific in the error messages. If there are more details that could assist the user, by all means be forthcoming.

Saturday, January 10, 2009

JSM messages left in queue, not consumed

I've been working on a project involving a servlet that had to consume messages from a JMS queue and dole them out to the requesting client as they arrived. For this I chose the asynchronous message consumption, to avoid blocking the servlet thread, to allow for other processing that had to be done while waiting for messages to arrive.

When testing I noticed that the servet would pick up the messages as they arrived in the queue, but for some reason they would be left there. At the same time the following exception would appear in the server log:

DirectConsumer:Caught Exception delivering messagecom.sun.messaging.jmq.io.Packet cannot be cast to com.sun.messaging.jms.ra.DirectPacket
.

After doing some investigations I found this notice in the J2EE tutorial: "The Java EE platform specification does not impose strict constraints on how web components should use the JMS API. In the Application Server, a web component can send messages and consume them synchronously but cannot consume them asynchronously".

Switching to synchronous consumption, using a timed receive took care of the problem.

Saturday, June 14, 2008

Reformatting the Economist web page to fit small screens

I've been a reader of the Economist magazine, using the Opera browser on my Nokia 770 Internet tablet. The recent changes in the layout of the page introduced the need for horizontal scrolling when zooming the view to make the fonts larger. This affects the usability quite severely.

I implemented a workaround for that, as a bookmaklet which increases the font size of the main pane without increasing its width, so the content reflows nicely within the screen bounds.

Here's the code; add it as the "url" field in your bookmark, then simply load the bookmark once you're on the page you want magnified.

javascript:function k34(){c = document.getElementById('content'); d=c.getElementsByTagName('div');for(i=0;i<d.length;i++){
if(d[i].className=='col-left'){d[i].style.fontSize='x-large';break;}}}; k34();


Note: this should be a single line, no breaks

Sunday, November 04, 2007

The need for technology

I've been thinking on how technology, particularly software, has been satisfying the basic human needs and what areas hold potential for further developments.

1. The need for certainty and security - usually involves basic surviving needs (food, shelter, clothes, etc). Since lots of people drive their security from a steady job or income, anything that can help them do their job better would satisfy this need. No wonder that business software has such success. In the same category would also go tools for managing personal finances and finding investment opportunities.

2. The need for uncertainty, adventure, novelty. This area is mostly satisfied by entertainment applications (games, media distribution/consumption) and e-commerce promoting travel and adventure.

3. The need for uniqueness, appreciation and social proof. This can explain the success of services that allow users to create content and claim ownership and enhance status (blogs, media sites, discussion groups).

4. The need for community, belongging and intimacy is covered by participating in social networks, dating services, etc.

5. The need for growth and learning is met by online education and news feeds. This is probably the area that's currently best served by the avalanche of information that can be accessed online. The challenge is how to filter that based on individual interests.

6. The need to contribute and make the world a better place. This could explain the widespread of open-source projects and people contributing their expertise without immediate payoff. The web also helps spread awareness about worthy innitiatives in need of resources.

Wednesday, September 05, 2007

privacy with Google

Many people are using Google applications like Gmail, Docs and Calendar to store and transmit confidential information. However many are not aware that using such apps over networks that are routinely monitored (e.g. your employer's network) may expose that information.

That's because by default people use the plain "http" URI scheme when accessing Google's apps. As a result the information between your browser and Google's server flows in clear.

A straightforward solution is to use the "https" scheme, which results in the same information flowing encrypted using SSL/TLS, providing much better security.

I tried some of the apps I use and it works well (e.g. https://www.gmail.com, https://docs.google.com, https://www.google.com/calendar)