Cloud platforms: nine reasons to consider Amazon Web Services

February 16th, 2017 by Silviu Stefanescu in General, Tremend

cloud technology partnerFigures prove it: cloud technology is on the rise. Dynamic companies understand that infrastructure as a service is becoming essential when they seek scalable optimization. The world’s largest cloud provider at the moment is Amazon. It had a 31% share of the global market in 2016, ten years after launching its cloud services. Amazon Web Services (AWS) is almost three times larger than the main competitor (Microsoft Azure), and quite far away from the next four players (source: Synergy Research). This rapid growth also shows in AWS’s revenue spike of 63% in August 2016, as compared to the previous fiscal year. Read the rest of this entry »

Rightsflow acquired by Google

January 13th, 2012 by Ioan Cocan in General, PHP, Startup

Congrats to the Rightsflow team for the recent acquisition by Google. We are glad that we were able to bring our contribution to this success. Tremend provided software services for implementation of Limelight (, Rightsflow’s main licensing tool.

Limelight allows music licesing for the song you want to cover either in digital, physical, streaming or ringtone format. You can enter the song information, pay the royalty fees and you will receive a PDF license after Rightsflow’s licensing department verifies the copyright ownership and pays the royalties on your behalf. The solution integrates with PayPal Pro for payment processing. You can also bulk upload songs for a faster experience.

Good luck to Rightsflow team, now part of YouTube!

Meet us at IDG Devworld 2010

October 26th, 2010 by Ioan Cocan in General

Marius will have a presentation about high traffic website, problems and solutions. Details here:

Javascript mp3 player

February 12th, 2010 by Marius Hanganu in General, Javascript
flash javascript mp3 player

flash javascript mp3 player

Seems impossible, right? Well, it is :-). The title is a bit misleading. You can’t play mp3 in javascript. Not yet at least. Not without a flash object behind the scenes.

But when it comes to searching a flash mp3 player that has also a customizable skin and javascript integration you won’t have so much luck. The players that allow flash – javascript communication are not skinnable, and the ones that are skinnable, don’t allow communication with javascript.

So after a bit of hacking here’s the final result:

The script is based on this excellent flash mp3 player which involves a hidden flash mp3 player. The main headache is actually not the UI which uses a simple scriptaculous effect for scrolling (just drag and drop the cursor to see it working), but actually making sure the commands from javascript to the flash player work on all browsers.

Another bonus feature added is the ability to jump to different sections of the audio file. The sections are described in a javascript configuration object. An UI for this feature can be easily built using your favorite UI framework.

File not found: transaction …, path …. SVN mysteries behind an Apache Reverse Proxy

December 6th, 2009 by Bogdan Nitulescu in General, Tools

We have an SVN server somewhere on our intranet, but since outside people want to access it, I put it behind an Apache reverse proxy. It was fairly straightforward. Here’s an excellent tutorial if you want to know how to do it: .

Basically, you have the intranet apache that’s configured to serve SVN, and you have an outside apache in your firewall’s DMZ that proxies the request:

ProxyPass /svn/

It was all fine when people checked out their sources, but there were strange errors during commits. 7 files commits worked ok. When you tried 8 files or more, you got something like…

File not found: transaction ‘431-12’, path ‘/parser/XMLparser/XMLparser.sln’

It took a lot of sweat to find out why 8 was the magic number – and after a lot of packet dumps and tracing, I found out that one of the servers used HTTP keepalives, and the other one rejected them.

So here’s a couple of rules not to be broken when proxying SVN requests:

Keep the same paths. Do not try something like ProxyPass /svn/ . It will fail with a cryptic error message at the worst of time.

Keep the same configuration.  Check your /etc/httpd/conf/httpd.conf on both servers for differences in your configuration. In my case, I had “KeepAlives On” in one server and “KeepAlives Off” in the other. When I put them both to On, it worked just fine.

Windows cannot find “url”

September 9th, 2009 by Marius Hanganu in General

If you’ve encountered this message: “Windows cannot find url” when clicking links in external applications (like for example Yahoo Messenger, Adobe Acrobat, etc), here’s the solution as stated here:

1. Open Explorer
2. Select Tools and then Folder Options
3. Select the File Types tab
4. Select Extension: (NONE), File Type: HyperText Transfer Protocol
5. Click Advanced toward the bottom of the window
6. In the Edit File Type window, select open and click Edit
7. Clear the DDE message box (which should contain “%1”)
8. Click OK, Click OK
9. Repeat for File Type: HyperText Transfer Protocol with Privacy

FLEX – live scroll datagrid

March 2nd, 2009 by alinca in General

A nice feature on search engines would be a live scroll, so right before you get to the end of the current page the next page is automatically loaded.

I’ve played a bit with Adobe Flex SDK and implemented a short proof of concept.

First you need a mx.rpc.http.HTTPService to map the search service. For the service I created a simple php page that returns some random list of data and mapped my HTTPService to it.

I created a list of type ArrayCollection to hold the search results, and a DataGrid component with the list binded as dataProvider.

When the application starts, the HTTPService sends a first request for data and after the result is received, it will parse it and add the data to the ArrayCollection which is binded to the DataGrid, so the results will show up in the DataGrid

For the moment, the application only loads the first page of results so we need to load the next page each time the user gets to the end of the results. This can be done by adding an event listener for the DataGrid scroll event. On this listener we check if the user scrolled down using the ScrollEvent direction and delta properties. If so, we check if the user is close to the end (there are 3 more results to show) and then we send a new request to the search service for next page o data.

Here you can checkout the example. (right-click on the flash to view the source code).

One problem that I was not able to solve was that when loading the first page with data the maxVerticalScrollPosition of the DataGrid does not get updated, I was using this in the status label from the bottom to show the index of data show in the DataGrid; maxVerticalScrollPosition was only updated when making the first scroll. For the status label, I used a hack that you can check in the code.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="" layout="absolute"
			import mx.controls.Alert;
			import mx.rpc.http.HTTPService;
			import mx.collections.ArrayCollection;
			private var loadingAnimation:Class;
			//keep a request count not to make new request until last request data is received
			private var loadRequests:int = 0;
			private var list:ArrayCollection = new ArrayCollection();
			//http service from where you get random data
			private var httpService:HTTPService = new HTTPService();
			 * after load complete add event listeners for httpService and make a first call 
			private function creationCompleteImpl():void
				//add an event listener for the httpService events
				httpService.url = parameters.serviceUrl;
				httpService.addEventListener(ResultEvent.RESULT, httpServiceEvent);
				httpService.addEventListener(FaultEvent.FAULT, httpServiceEvent);
			 * httpService event handler 
			private function httpServiceEvent(event:Event):void
				if(event is ResultEvent)//if we get a result from the httpService
					//parse the result and add the values to the datagrid
					//on a request the test php returns 50 random values
					var result:String = (event as ResultEvent).result as String;
					var values:Array = result.split("\n");
					for each(var value:String in values)
						if(value.length > 0)
							var props:Array = value.split(/(\d+)/);
							list.addItem({text:props[0], number:props[1]});
					//show an alert if error as FaultEvent).message.toString());
				if(loadRequests == 0)
					loadingImage.visible = false;
			 * call the php service 
			private function getNewData():void
				if(loadRequests == 0)
					loadingImage.visible = true;
			 * event handler for datagrid scrolling 
			private function listScrolled(event:ScrollEvent):void
				if(event.direction == ScrollEventDirection.VERTICAL && > 0)
					//if close to last item make a new call to get new results
					if(liveDataGrid.maxVerticalScrollPosition - event.position < 3)
	<mx:VBox paddingTop="10" paddingBottom="10" paddingLeft="10" paddingRight="10"
		width="100%" height="100%">
		<mx:Canvas width="100%">
			<mx:Label text="Live scroll" left="0" verticalCenter="0"/>
			<mx:Image id="loadingImage" source="{loadingAnimation}" right="0" verticalCenter="0" visible="false"/>
		<mx:DataGrid id="liveDataGrid" height="100%" width="100%"
		        <mx:DataGridColumn dataField="text" headerText="Text"/>
		        <mx:DataGridColumn dataField="number" headerText="Random value"/>
			visible="{list.length > 0}" 
			text="{'Showing ' + (liveDataGrid.verticalScrollPosition + 1) + ' to ' + (liveDataGrid.verticalScrollPosition + Math.round((liveDataGrid.height - liveDataGrid.headerHeight) / liveDataGrid.rowHeight) - 1)}" width="100%"/>

Link flash to html page

October 3rd, 2008 by Marius Hanganu in General, Javascript

This is a small one, but I banged my head several times now before fixing it. Although many have written about it, I decided to write also. More resources are always better than fewer resources :-)

So you’ve created the flash object, correctly set the URL, but when embedding it on the web page on your web server, the link doesn’t work. The solution is quite simple: you need to set allowScriptAccess to sameDomain or even always if sameDomain doesn’t do the job.

And of course, you need to do that for both the object and the embedtag. For example:

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase=",0,29,0" width="295" height="240">
    <param name="allowScriptAccess" value="always" />
    <param name="allowFullScreen" value="false" />
    <param name="movie" value="http://server/flash.swf">
    <param name="quality" value="high">
    <embed src="http://server/flash.swf" quality="high" allowScriptAccess="always" allowFullScreen="false"  pluginspage="" type="application/x-shockwave-flash" width="295" height="240"></embed>

Using this parameter, the flash object will now allow linking to the HTML page set in the flash object.

Blogged with Flock

Tags: , , ,

Google Talk in Yahoo Messenger

September 23rd, 2008 by Marius Hanganu in General, Javascript, Tools

Some time ago, when I first saw the Google Talk gadget is being released, I got this crazy idea of embedding the gadget in Yahoo Messenger as a plugin.

Once logged in, the gadget was displayed just fine as a plugin, but if the user was not logged in, he’d be taken to the google login page. So I started hacking and chopping and after half hour I finally got this version working. Click here to download the plugin.

After downloading it, unzip it into the C:\Program Files\Yahoo!\Messenger\Plugin\Test\ContentTab\ folder. UPDATE: after unzipping, rename the folder to test.plugin (thanks Tudor) The final path should look like: C:\Program Files\Yahoo!\Messenger\Plugin\Test\ContentTab\test.yplugin\.

Restart Yahoo Messenger, log-in and select Actions -> Load Test Plug-in, and the Google login page will show up in the plug-ins area. You can select the “remember me” box, so that after restart you will be automatically logged in.

The plugin is quite simple: it contains one simple HTML file with some Google styles, and the HTML code for the login page. On page load – a request is made to to check if the user is already logged in. This is achieved by parsing the response and checking for “Sign out” string – which means the user is logged in.

Surprisingly, from all the Google pages, the page was the only one (after 4 or 5 unsuccessful attempts) that could give me an indicator on whether the user is logged in or not.

In case user is logged in, the page is redirected to the URL containing the embeddable flash gadget for Google Talk:

Unfortunately, the administrators of Yahoo Messenger plug-ins at have rejected the application so far, so in order to use it, every time you start Yahoo Messenger, you need to select “Load Test Plug-in” to load this plugin.

Here are some images with the plugin:
Google Talk in Yahoo Messenger

Google Talk in Yahoo Messenger
And here’s the code for the plugin:

        body,td,div,p,a,font,span {font-family: arial,sans-serif;}
        body {margin-top:2}.c {width:4; height: 4}
        body { background-color:#E8EEFA; }
        A:link {color:#0000cc; }
        A:visited { color:#551a8b; }
        A:active { color:#ff0000; }
        .form-noindent {background-color: #ffffff; border: #C3D9FF 1px solid}
        .gaia.le.lbl { font-family: Arial, Helvetica, sans-serif; font-size: smaller; }
        .gaia.le.fpwd { font-family: Arial, Helvetica, sans-serif; font-size: 70%; }
        .gaia.le.chusr { font-family: Arial, Helvetica, sans-serif; font-size: 70%; }
        .gaia.le.val { font-family: Arial, Helvetica, sans-serif; font-size: smaller; }
        .gaia.le.button { font-family: Arial, Helvetica, sans-serif; font-size: smaller; }
        .gaia.le.rem { font-family: Arial, Helvetica, sans-serif; font-size: smaller; }
        .gaia.captchahtml.desc { font-family: arial, sans-serif; font-size: smaller; }
        .gaia.captchahtml.cmt { font-family: arial, sans-serif; font-size: smaller; font-style: italic; }
        .body { margin-left: 3em;margin-right: 5em;font-family: arial,sans-serif; }
        div.errorbox-good {}
        div.errorbox-bad {}
        div.errormsg { color: red; font-size: smaller; font-family: arial,sans-serif;}
        font.errormsg { color: red; font-size: smaller; font-family: arial,sans-serif;}
        hr {border: 0;background-color:#DDDDDD;height: 1px;width: 100%;text-align: left;margin: 5px;}
         div.errormsg { color: red; font-size: smaller; font-family:arial,sans-serif; }
         font.errormsg { color: red; font-size: smaller; font-family:arial,sans-serif; }
        .gaia.le.lbl { font-family: Arial, Helvetica, sans-serif; font-size: smaller; }
        .gaia.le.fpwd { font-family: Arial, Helvetica, sans-serif; font-size: 70%; }
        .gaia.le.chusr { font-family: Arial, Helvetica, sans-serif; font-size: 70%; }
        .gaia.le.val { font-family: Arial, Helvetica, sans-serif; font-size: smaller; }
        .gaia.le.button { font-family: Arial, Helvetica, sans-serif; font-size: smaller; }
        .gaia.le.rem { font-family: Arial, Helvetica, sans-serif; font-size: smaller; }
        .gaia.captchahtml.desc { font-family: arial, sans-serif; font-size: smaller; }
        .gaia.captchahtml.cmt { font-family: arial, sans-serif; font-size: smaller; font-style: italic; }
    <script type="text/javascript"><!--mce:0--></script>
<form id="gaia_loginform" action="" method="post">
<div class="loginBox">
<table id="gaia_table" style="display:none" border="0" cellspacing="0" align="center">
<td colspan="2">
                                    <img src="" alt="Google" />
<td valign="middle">
                            <span class="gaia le lbl">Email:</span></div></td>
<input id="continue" name="continue" type="hidden" value="" />
<input id="service" name="service" type="hidden" value="talk" />
<input id="skipvpage" name="skipvpage" type="hidden" value="true" />
<input name="GALX" type="hidden" value="aa3Jml3aMHk" />
<input id="Email" class="’gaia" name="Email" size="18" type="text" /></td>
<td align="left"></td>
<td align="right">
                        <span class="gaia le lbl"> Password: </span></td>
<input id="Passwd" name="Passwd" size="18" type="password" /></td>
<td align="left"></td>
<td align="right" valign="top">
<input id="PersistentCookie" checked="’checked’/" name="PersistentCookie" type="checkbox" value="yes" />
<input name="’rmShown’" type="hidden" value="1?/&gt;
                        &lt;span class=" />Remember me on this computer.</td>
<td align="left">
<input class="gaia le button" name="signIn" type="submit" value="Sign in" /></td>

A href vs onclick – performance test – IE6 vs IE7 vs FF3 vs FF2 vs Chrome vs Opera vs Safari

September 10th, 2008 by Marius Hanganu in General, Javascript

While optimizing some HTML code, I recently came across the question: when rendering anchors, which of the href and onclick are rendered quicker by the browsers. To find out, I created two files, each one with 330.480 anchors, one only with onclick event: onclick=’vc(\’4280220\’)’ and another one only with hrefs: href=’javascript:vc(\’4280220\’)’.

The files have over 17 and 14 megs (the one with hrefs being larger due to more text). Here’s the beginning of each files:

  • href:
        <a class="”td”">-</a>
        <a class="”td”">-</a>
        … 330.478 more
  • onclick:
        <a class="td">-</a>
        <a class="td">-</a>
        … 330.478 more

The “td” class used is necessary since rendering the anchors with href results in underlining the text, thus consuming more CPU power for drawing the page, than the anchors with onclick which do not get underlined.

The environment on which the test was performed is a Windows XP SP2 machine with Multiple IEs for testing on both IE7 and IE6 as well as Firefox 2, Firefox 3, Chrome, Opera and Safari. The rendering time on one browser is not important (which is why I don’t mention hardware indicators), but the actual time comparison between all the browsers. Let’s see the results first:

IE vs FF vs Chrome vs Opera vs SafariWith regards to the main purpose of this test: href vs onclick, it seems that for “small” HTML optimizations, the rendering times are about the same (keep in mind we’re talking about over 330.000 anchors – for several thousands, the difference is imperceptible).

If you however are a hardcore programmer who needs those extra seconds, Internet Explorer is the only one that renders href-s much quicker than onclick-s. All the other browsers render onclick-s faster than href-s. If your website will be accessed by a wide audience of users, given that IE has still the biggest share of the browser market, you may want to render your anchors using href-s.

Apart from the hrefonclick comparison, there are some surprises in this graph. For example FF3, although much faster than FF2 or IE at rendering complex pages and javascript, performs the slowest of all browsers. Opera is the fastest browser, while Firefox 2 does almost the same job as Internet Explorer 7.

IE6 renders the page with href-s incredibly faster, but in the same time, it took more than 5.5 minutes to render the page with onclick event (I eventually killed the process after 5.5 minutes). This may be due to Multiple IEs, so the second result for IE6 is questionable.

And the newest kid in the block, Chrome behaves better than Firefox 3, but much slower than Firefox 2.

While this test may give a slight idea of how fast these browsers performs with this specific test case, it is not relevant for regular HTML pages filled with various elements (div-s, span-s, br-s, p-s, etc). For those pages, as probably everyone has noticed, FF3 renders the page much faster than IE7, or IE6 or FF2.

Blogged with Flock

Tags: , , , , , , , ,

Meet us at CeBIT 2008

March 4th, 2008 by Ioan Cocan in General

Come meet us at CeBIT 2008. We are in Hall 4 (Business Solutions), Stand A54, Romanian pavilion, near Microsoft Stand.

Later edit: CeBIT in pictures

Change your Bluetooth address of your Linux machine

August 10th, 2007 by Bogdan Nitulescu in Bluetooth, General, Linux

Do you have Bluetooth on your computer? Is it a Linux machine? For some weird reason, do you need it to have a different address?

If you answered yes to the above, here’s the magic command:

bccmd -d 0 psset -s 0 bdaddr 0x44 0x00 0x66 0x55 0x33 0x00 0x22 0x11

…and your Bluetooth device address (BDA) becomes 11:22:33:44:55:66. Of course, you will replace the underlined numbers with the actual address that you want to write.

It does not always work. You need bluez-utils 3, and you need a CSR chip in your computer or USB dongle. To find out, type hciconfig hci0 version and the manufacturer should be Cambridge Silicon Radio. Last time I checked, they had~70% market share, so you have a good chance of having one.

If you have more than a single device, use “bccmd -d 1 …” for hci1, and so on.

The option -s 0 stores it into the default memory, which is usually RAM – so the new address may be lost after reboot. Your chip may have various ROM stores – use -s 1 to -s 3. If you want specifically to write your new address in ram, use -s 4. Note that the store with the highest number has priority (e.g. if an address is stored in both RAM and flash, RAM has priority)

For gory details about programming CSR chips, you can get documents from

Enumerating LAN and WLAN clients on a Linux router

April 20th, 2007 by Bogdan Nitulescu in General

A while ago I was asked to take a WiFi router and add some bell and whistles to its interface. It was one of those small NAT boxes – nothing more than a LAN switch and a WLAN access point strapped to a 200 MHz system-on-a-chip running Linux. ucLinux, to be exact.

The exact request was “list all the computers connected to our box – wired and wireless”. Not a lot of info – MAC, IP address, Windows computer name. But what does “connected” actually mean?

This wasn’t much of a question for the marketing people. Ideally, if you put a cable in the router, the computer will show as connected. Take the cable out, and it should show no more. Well, a lot easier said than done.

It’s easy to be accurate on the wireless side. The driver for the Marvell wireless chipset can be queried for the active connections, and you can retrieve the active MACs from /proc/net/mvwlan.

Read the rest of this entry »

Select/delete all items in Solr

March 2nd, 2007 by Sebastian Mitroi in General

To select all items for a field in Solr you can use the query : some_item:[* TO *], but if this field is missing from some documents you will not select those documents.

To select all documents you can use the id defined in /conf/schema.xml, for example: <uniqueKey>solr_id</uniqueKey> you can use solr_id:[* TO *].

Now that you have all documents selected you can delete them :D

To delete all documents in Solr use this update xml:

<delete><query>solr_id:[*TO *]</query></delete>

and of course you have to commit:

<commit />

That’s all !

Solution to a problem with VMware Server 1.0.1 on Linux kernel 2.6.19-1.2288.fc5 – ‘CHECKSUM_HW’ undeclared (first use in this function)

February 28th, 2007 by spostelnicu in General

Solution to the following problem with VMware Server 1.0.1 on Linux kernel 2.6.19-1.2288.fc5 : ‘CHECKSUM_HW’ undeclared (first use in this function)

I use VMware Server 1.0.1 on Linux (Fedora Core 5) and I recently updated the kernel to 2.6.19-1.2288.fc5 – the reason of the update is that my older kernel version did not have drivers for my onboard soundcard :)

After the update, I discovered that I had to reconfigure vmware by running the command


That was ok, as this is required with each kernel update (vmware is configured to a particular kernel version).

When running, I got the following message (normal again):

None of the pre-built vmmon modules for VMware Server is suitable for your
running kernel. Do you want this program to try to build the vmmon module for
your system (you need to have a C compiler installed on your system)? [yes]

The next step is:

What is the location of the directory of C header files that match your running kernel? [/lib/modules/2.6.19-1.2288.fc5/build/include]

Note that for this you need to download the sources for your kernel version. For me this was as easy as running “Add/Remove Software” and selecting kernel-devel-2.6.19-1.2288.fc5 from the list of packages.

After skipping the networking setup (as it was already setup by me some time ago), I got the following error:

….. /tmp/vmware-config2/vmnet-only/userif.c : ‘CHECKSUM_HW’ undeclared (first use in this function)

After searching the net a little, I found out this:

From kernel 2.6.19, the CHECKSUM_HW value has long been used in thenetworking subsystem to support hardware checksumming. That value hasbeen replaced with CHECKSUM_PARTIAL (intended for outgoing packetswhere the job must be completed by the hardware) and CHECKSUM_COMPLETE(for incoming packets which have been completely checksummed by the hardware).

For more see

So the solution to my problem was to locate the files where this values were used and replace CHECKSUM_HW with CHECKSUM_PARTIAL and linux/config.h to linux/autoconf.h

I found that the files were in /usr/lib/vmware/modules/source, inside the tar archive vmnet.tar

I unpacked the archive, replaced CHECKSUM_HW to CHECKSUM_PARTIAL in the files
bridge.c and userif.c, replaced linux/config.h to linux/autoconf.h in the file procfs.c, and then repacked the archive back to vmnet.tar (after renaming the old one to vmnet.tar.orig, just for backup)

Then I re-run and it worked fine.

« Previous Entries