Narendra Dhami

My Site

Archive for July, 2008

AMF – Problems When Serializing Between Java and ActionScript

Posted by Narendra Dhami on July 31, 2008

Below are some tips and tricks when dealing with serialization between Java and ActionScript. I’ve spent some time and encountered some frustrations (especially when I was too tired) trying to understand why the value is not properly sent over the wire so I decided to document all of my mistakes. Over the time I will edit this post to add new insights

  • if something seems wrong turn on debugging in services-config.xml
  • a property must have a public getter and setter in order to be serialized. I know that is strange (why should I have a setter when it’s not needed?) but that’s it. I do not like it all because sometimes it breaks encapsulation
  • you should take care to map the ActionScript class with the corresponding Java class using the metadata. For example [RemoteClass(alias="")]
  • verify that the ActionScript object is included in the SWF file. If your project does not have a reference to the AS file then it will not be included in the resulting SWF so the Java class will be serialized to a generic object
  • you cannot serialize maps that have integers as keys See this bug
  • when serializing Hibernate entities be sure that all of them are initialized or use some kind of Open Session in View pattern – or better build a value object to contain only the data you really need.
  • a NULL number in Java is converted to 0 in ActionScript
  • a Long number from Java cannot be properly converted to Number in ActionScript – you will lose precision, so you should send it packed in a different way



Posted in Java | Leave a Comment »

Reducing software defects: 10 things to keep in mind

Posted by Narendra Dhami on July 29, 2008

  1. Finding and fixing a software problem after delivery is often 100 times more expensive than finding and fixing it during the requirements and design phase.
  2. About 40-50% of the effort on current software projects is spent on avoidable rework.
  3. About 80% of the avoidable rework comes from 20% of the defects.
  4. About 80% of the defects come from 20% of the modules and about half the modules are defect free.
  5. About 90% of the downtime comes from at most 10% of the defects.
  6. Peer reviews catch 60% of the defects.
  7. Perspective-based reviews catch 35% more defects than non-directed reviews.
  8. Disciplined personal practices can reduce defect introduction rates by up to 75%.
  9. All other things being equal, it costs 50% more per source instruction to develop high-dependability software products than to develop low-dependability software products. However, the investment is more than worth it if significant operations and maintenance costs are involved.
  10. About 40-50% of user programs enter use with nontrivial defects.

More on each of these points can be found in this expanded article entitled, Software Defect Reduction Top-10 List, by Barry Boehm, USC and Victor Basili, U. of Maryland.

Posted in Web | Leave a Comment »

50+ PHP optimisation tips revisited

Posted by Narendra Dhami on July 29, 2008

After reading an article some time ago entitled “40 Tips for optimizing your php Code” (and some others that are suspiciously similar), I decided to redo it, but properly this time with more accurate tips, providing references and citations for each and every one.

The result is this list of over 50 PHP optimisation tips…


  1. echo is faster than print. [Citation]
  2. Wrap your string in single quotes (’) instead of double quotes (”) is faster because PHP searches for variables inside “…” and not in ‘…’, use this when you’re not using variables you need evaluating in your string. [Citation]
  3. Use sprintf instead of variables contained in double quotes, it’s about 10x faster. [Citation]
  4. Use echo’s multiple parameters (or stacked) instead of string concatenation. [Citation]
  5. Use pre-calculations, set the maximum value for your for-loops before and not in the loop. ie:
    for ($x=0; $x < count($array); $x), this calls the count() function each time, use $max=count($array) instead before the for-loop starts. [Citation]
  6. Unset or null your variables to free memory, especially large arrays. [Citation]
  7. Avoid magic like __get, __set, __autoload. [Citation]
  8. Use require() instead of require_once() where possible. [Citation]
  9. Use full paths in includes and requires, less time spent on resolving the OS paths.
  10. require() and include() are identical in every way except require halts if the file is missing. Performance wise there is very little difference. [Citation]
  11. Since PHP5, the time of when the script started executing can be found in $_SERVER[’REQUEST_TIME’], use this instead of time() or microtime(). [Citation]
  12. PCRE regex is quicker than EREG, but always see if you can use quicker native functions such as strncasecmp, strpbrk and stripos instead.
  13. When parsing with XML in PHP try xml2array, which makes use of the PHP XML functions, for HTML you can try PHP’s DOM document or DOM XML in PHP4. [Citation]
  14. str_replace is faster than preg_replace, str_replace is best overall, however strtr is sometimes quicker with larger strings. Using array() inside str_replace is usually quicker than multiple str_replace. [Citation]
  15. “else if” statements are faster than select statements aka case/switch. [Citation]
  16. Error suppression with @ is very slow. [Citation]
  17. To reduce bandwidth usage turn on mod_deflate in Apache v2 [Citation] or for Apache v1 try mod_gzip. [Citation]
  18. Close your database connections when you’re done with them. [Citation]
  19. $row[’id’] is
    7 times faster than $row[id], because if you don’t supply quotes it has to guess which index you meant, assuming you didn’t mean a constant.
  20. Use <?php … ?> tags when declaring PHP as all other styles are depreciated, including short tags. [Citation]
  21. Use strict code, avoid suppressing errors, notices and warnings thus resulting in cleaner code and less overheads. Consider having error_reporting(E_ALL) always on. [Citation]
  22. PHP scripts are be served at 2-10 times slower by Apache httpd than a static page. Try to use static pages instead of server side scripts. [Citation]
  23. PHP scripts (unless cached) are compiled on the fly every time you call them. Install a PHP caching product (such as memcached or eAccelerator or Turck MMCache) to typically increase performance by 25-100% by removing compile times. You can even setup eAccelerator on cPanel using EasyApache3. [Citation]
  24. An alternative caching technique when you have pages that don’t change too frequently is to cache the HTML output of your PHP pages. Try Smarty or Cache Lite. [Citation]
  25. Use isset where possible in replace of strlen. (ie: if (strlen($foo) < 5) { echo “Foo is too short”; } vs. if (!isset($foo{5})) { echo “Foo is too short”; } ). [Citation]
  26. ++$i is faster than $ i++, so use pre-increment where possible. [Citation]
  27. Make use of the countless predefined functions of PHP, don’t attempt to build your own as the native ones will be far quicker; if you have very time and resource consuming functions, consider writing them as C extensions or modules. [Citation]
  28. Profile your code. A profiler shows you, which parts of your code consumes how many time. The Xdebug debugger already contains a profiler. Profiling shows you the bottlenecks in overview. [Citation]
  29. Document your code. [Citation]
  30. Learn the difference between good and bad code. [Citation]
  31. Stick to coding standards, it will make it easier for you to understand other people’s code and other people will be able to understand yours. [Citation]
  32. Separate code, content and presentation: keep your PHP code separate from your HTML. [Citation]
  33. Don’t bother using complex template systems such as Smarty, use the one that’s included in PHP already, see ob_get_contents and extract, and simply pull the data from your database. [Citation]
  34. Never trust variables coming from user land (such as from $_POST) use mysql_real_escape_string when using mysql, and htmlspecialchars when outputting as HTML. [Citation]
  35. For security reasons never have anything that could expose information about paths, extensions and configuration, such as display_errors or phpinfo() in your webroot. [Citation]
  36. Turn off register_globals (it’s disabled by default for a reason!). No script at production level should need this enabled as it is a security risk. Fix any scripts that require it on, and fix any scripts that require it off using unregister_globals(). Do this now, as it’s set to be removed in PHP6. [Citation]
  37. Avoid using plain text when storing and evaluating passwords to avoid exposure, instead use a hash, such as an md5 hash. [Citation]
  38. Use ip2long() and long2ip() to store IP addresses as integers instead of strings. [Citation]
  39. You can avoid reinventing the wheel by using the PEAR project, giving you existing code of a high standard. [Citation]
  40. When using header(’Location: ‘.$url); remember to follow it with a die(); as the script continues to run even though the location has changed or avoid using it all together where possible. [Citation]
  41. In OOP, if a method can be a static method, declare it static. Speed improvement is by a factor of 4. [Citation].
  42. Incrementing a local variable in an OOP method is the fastest. Nearly the same as calling a local variable in a function and incrementing a global variable is 2 times slow than a local variable. [Citation]
  43. Incrementing an object property (eg. $this->prop++) is 3 times slower than a local variable. [Citation]
  44. Incrementing an undefined local variable is 9-10 times slower than a pre-initialized one. [Citation]
  45. Just declaring a global variable without using it in a function slows things down (by about the same amount as incrementing a local var). PHP probably does a check to see if the global exists. [Citation]
  46. Method invocation appears to be independent of the number of methods defined in the class because I added 10 more methods to the test class (before and after the test method) with no change in performance. [Citation]
  47. Methods in derived classes run faster than ones defined in the base class. [Citation]
  48. A function call with one parameter and an empty function body takes about the same time as doing 7-8 $localvar++ operations. A similar method call is of course about 15 $localvar++ operations. [Citation]
  49. Not everything has to be OOP, often it is just overhead, each method and object call consumes a lot of memory. [Citation]
  50. Never trust user data, escape your strings that you use in SQL queries using mysql_real_escape_string, instead of mysql_escape_string or addslashes. Also note that if magic_quotes_gpc is enabled you should use stripslashes first. [Citation]
  51. Unset your database variables (the password at a minimum), you shouldn’t need it after you make the database connection.
  52. RTFM! PHP offers a fantastic manual, possibly one of the best out there, which makes it a very hands on language, providing working examples and talking in plain English. Please USE IT! [Citation]

If you still need help, try #PHP on the
EFnet IRC Network. (Read the !rules first).

Also see:

Posted in PHP | Leave a Comment »

Motoko Hunt on Search Engine Optimization in Japan

Posted by Narendra Dhami on July 29, 2008

Motoko Hunt is originally from Japan and has been doing business in the US and Japan for two decades. She founded her company in 1998 and provides Japanese search marketing services in the US, Europe and Asia. She’s also the co-chair of the upcoming Search Engine Strategies Tokyo conference and will be speaking at the SES in San Jose. Motoko loves scuba diving, heavy metal music and Guinness.


By your estimate, what are the most popular search engines in Japan?

Yahoo has been the most popular search portal in Japan for years, but Google has been catching up. Right now, while Yahoo still is the #1 property in Japan, Google and Yahoo share the search market almost 50/50.

What are some of the things that can go wrong when a website owner merely translates their English content into Japanese?

There are many issues that I know of, but the keyword placement would be the most important issue with website localization.

Translators usually have no knowledge of SEO/SEM [search engine optimization/ search engine marketing]. Good translation doesn’t mean that the translators used the keywords that have the most search demands in Japan. You should always conduct the Japanese keyword research first, and give a list of important words that you’d want the translator to use.

Another big problem is when English text is translated into Japanese, often times it doesn’t sound naturally to Japanese. Grammatically, a Japanese sentence is structured almost backward of an English sentence. The keyword may be pushed to the end of the sentence or the paragraph after it’s translated, which could have an negative impact on the ranking.

Also, Japanese don’t speak as direct as Americans do, and Japanese audiences may react differently to your messages on the website. I always review and re-write my clients PPC ads instead of just translating them from English to Japanese.

Are there any layout pitfalls when creating a website that is supposed to work in Japan too? Like when it comes to fonts, colors and so on?

Since Japanese characters are double byte characters, if you don’t adjust the font size on Japanese pages, it would appear way too big. Many site owners forget to change the character settings and font settings as well as the country code setting on Japanese site. Japanese don’t like too much of [bright] colors on web site. Many American businesses who are successful in Japan use different color scheme – more calming colors – on their Japanese websites.

Are there crucial differences in Japanese searching when compared with search behavior in other countries?

Japanese are searching just about everything online, too. The search has become the number 1 source of information, and everyone goes online to research products and services that they consider purchasing. Perhaps the biggest difference would be that many Japanese use mobile search.

How big is mobile search in Japan, and do you think websites should have a special mobile version to be popular in Japan?

Very big, and we have a long history of mobile Internet in Japan. It’s not something just came up in past a few years. If your target market is 25 and younger, I highly recommend that you go after the mobile market in Japan. If your target market is female 25 and younger, you should create a mobile site sooner than later.

Do Japanese searchers on average search a lot in English, too, or relatively little? What about other foreign languages?

Japanese search using Japanese characters in most cases. Even the brand names such as Sony and Panasonic, more Japanese type them in Japanese characters.
If they are looking for French site, they may type French keywords to find French sites. If they want white paper in English, they’d use English keywords.

What are some of the important things to understand about Japanese language in terms of search, search engine optimization, and building an accessible website?

Unlike other languages, we use 4 sets of letters and characters to write in Japanese, and we use all of them together. Some words may be written in using any of these letters and characters each with spelling variations, but one of them would have the most search demand. Finding the right keyword (letters/characters & spelling) is one of the key elements in conducting successful SEO/SEM campaigns.
Since Japanese use double byte characters, once English file is translated into Japanese, the file size could double, which may slows down the page download time.

What can you tell us about message boards like 2channel and Futaba Channel? How important are these boards in the overall Japanese online world, and are they important to make a website known in Japan?

While blogs and SNS sites are very popular in Japan, it haven’t quite replaced these popular BBS sites. People go to BBS sites to exchange information, gossip and just chit-chat with others often times [anonymously]. Many Japanese business owners keep an eye on these sites to see what people are talking about their services and products. Many word-of-mouth information started to flow from these sites.

These sites could make a huge impact on your business in Japan, don’t try to market or to communicate with people as a business there. It takes an art form of how to participate in these sites especially if you are on the corporate side. If you don’t know exactly how to dance there, you’ll definitely get hurt.

Other than message boards, could you name some highly popular websites in Japan?

mixi is the most popular SNS sites, which can be accessed from both PC and mobile, and Mobaga-Town is one of the biggest gaming-SNS portal mobile sites. Yahoo Shopping is very popular as it’s the number 1 reason why people go to Yahoo Japan site, and Rakuten is the biggest e-commerce sites in Japan. They are #3 biggest site by property in Japan.

What are some of Japan’s social news [sites] which let you upvote stories, the kind like or Reddit? How popular are they?

We have many popular social news/bookmarking sites such as Hatena, Yahoo bookmark, FC2 bookmark and Livedoor Clip. They are very popular, but haven’t seen many Japanese businesses using these services to push or to communicate with customers.

What are the first things you look for when you try to search engine optimize a site for the Japanese market?

Placing the right keywords in right places.

Is search engine optimization as big in Japan as it is in some other countries? And is Japanese search engine spam as much of a problem as it is in other countries?

Every businesses know that SEO is important regardless of the size of the business, but the average skill level of agencies and the average knowledge level of clients in Japan are not as sophisticated as in US and Europe. For example, many people are still wasting time in creating a link-farm, and many clients don’t know that their agency stuffed keywords and added links to agency’s other client sites on their website.

Are there any popular stereotypes about the Japanese online world which you’d like to debunk?

Yahoo is not dominating Japanese search market any longer!

Posted in Web | 1 Comment »

iBATIS, Hibernate, and JPA: Which is right?

Posted by Narendra Dhami on July 28, 2008

Object-relational mapping in Java is a tricky business, and solutions like JDBC and entity beans have met with less than overwhelming
enthusiasm. But a new generation of ORM solutions has since emerged. These tools allow for easier programming and a closer
adherence to the ideals of object-oriented programming and multi-tiered architectural development. Learn how Hibernate, iBATIS,
and the Java Persistence API compare based on factors such as query-language support, performance, and portability across
different relational databases.

In this article we introduce and compare two of the most popular open source persistence frameworks, iBATIS and Hibernate. We also discuss the Java Persistence API (JPA). We introduce each solution and discuss its defining qualities, as well as its individual strengths and weaknesses
in broad application scenarios. We then compare iBATIS, Hibernate, and JPA based on factors such as performance, portability,
complexity, and adaptability to data model changes.

If you are a beginning Java programmer new to persistence concepts, reading this article will serve as a primer to the topic
and to the most popular open source persistence solutions. If you are familiar with all three solutions and simply want a
straightforward comparison, you will find it in the section “Comparing persistence technologies.”

Understanding persistence

Persistence is an attribute of data that ensures that it is available even beyond the lifetime of an application. For an object-oriented
language like Java, persistence ensures that the state of an object is accessible even after the application that created
it has stopped executing.

More …

Posted in Java | Leave a Comment »

Opinion: How to make better decisions

Posted by Narendra Dhami on July 25, 2008

Good leaders need to think beyond what’s known to the unknown. Here’s how.

In 1999, a three-year-old girl in London named Isabel received a diagnosis of chicken pox. Overnight, she took a turn for the worse and at the hospital was diagnosed with a deadly flesh-eating disease. Fortunately, she recovered, but her stockbroker father, Jason Maude, wanted to develop a way to prevent such misdiagnoses. Along with Joseph Brito, a doctor who had treated his daughter in intensive care, Maude developed a diagnostic decision-based software tool that would help physicians make more accurate diagnoses. He called it Isabel.

Isabel is not the only tool of its kind, but it does have an interesting feature that Ian Ayres describes in his book, Super Crunchers. As Ayres writes, “The biggest reason for misdiagnosis is ‘premature closure.’ Doctors think they have a bead on the correct diagnosis … and close their minds to other possibilities.”

That’s exactly what Isabel is designed to prevent. Ayres describes Isabel as a “reminder system” that prompts a simple question, “Have you considered …,” followed by a list of possible diseases to consider for diagnosis. This feature helps doctors think beyond what’s known and consider the unknown.

Good leaders also need to think about the unknown in order to plan for the future of their organization. For that reason, you may wish to employ you own “have you considered” questions when making an important decision. Start the process by asking yourself the following:

What have we missed?

One of the greatest dangers facing any team is groupthink, or everyone adopting the same point of view. Sometimes this occurs malevolently; the boss makes it uncomfortable for people to disagree. But it also happens without malice; people all agree on something because it makes sense.

Inviting others (ideally those without bias or exposure to the issue) to examine the decision is good practice. Consumer products companies regularly show prototypes to customers to gauge their reactions; often, their input is completely different from that of anyone on the team.

What if we did the opposite?

Turn the problem upside down. Consider doing the exact opposite of what you have done. That is, if you are about to implement a process, consider not doing it or doing something completely different.

Again, getting an outsider’s point of view is worthwhile. You don’t have to stretch the problem to absurd lengths, but you can invite people to comment on the assumptions you made. Ask them to challenge your data, research, pricing, market or whatever. Yes, it can be tedious and even annoying, but it may reveal something you overlooked.

What happens if we’re wrong?

Projecting the worst-case scenario is not fun; it is daunting and may reveal things about your processes and your people that you may not want to know. Your processes may not be as robust as you think; your people may not possess the skills you think they do. Better to understand these things now rather than later. This way you can make adjustments and find new sources of talent, maybe just another specialist to round out your team.

Decision-making isn’t cut and dried

Keep in mind that if any of these questions provoke controversy, it doesn’t mean the entire decision is wrong. It may simply mean you need to do more research, adjust an assumption or investigate another possibility. Such rigor may also validate your decision, and that can be very satisfying.

Decision-making is not always a cut-and-dried proposition. Dealing with ambiguity is part of every leader’s job. For example, the go/no go decision on product development may be based on consumer research, but it must always be balanced by experience. Henry Ford is famously quoted as saying, “If I’d asked my customers what they wanted, they’d have said, a faster horse.”

Bob Lutz, vice chairman at General Motors Corp. and a legendary car guy, argues in his book, Guts, that consumers are not always right; sometimes you have go with your intuition. The creation of breakthrough products comes from doing something new and different; this is also true in the world of hardware and software development.

For that reason, asking yourself or your team the “have you considered” questions can avoid linear thinking and may even help executives decide what to do next, or not at all.

John Baldoni is a leadership and communications consultant who works with Fortune 500 companies as well as with nonprofits, including the University of Michigan. He is a frequent keynote and workshop speaker, and author of seven books on leadership. His latest, Lead By Example: 50 Ways Great Leaders Inspire Results, will be published in October. Visit his leadership resource Web site at

Posted in General | Leave a Comment »

Some Notes

Posted by Narendra Dhami on July 24, 2008

Here are some useful links for you:
1. XML Notes

    Refer to my XML notes which are based on my experiences with the use of 3 differenet parsers, namely, Apache’s Xerces parser, Sun’s JAXP and Mind Electric’s Electric XML parser. Here you will learn what an XML document is, how is it used in practice, and important tips to get you started fast with the use of my favourite Xerces parser. The notes include good codes and references to some other worth-reading materials on XML.

2. CVS Notes
    You are new to configuration management? Then here is some notes of mine which will help you get started with the use of CVS (both using command line interface and WinCVS for Windows platform). It also has some good material which delves into the theories related to CVS, how it replaced RCS, its benefits and what features it offers. Check this out!

3. Chat Software
    Its very usual for someone new to network, or lets say, distributed programming to want to write a program which is useful and at the same time a fun way to learn. One such program is a chat software which is easy to code, covers most of the fundas of distributed computing and is very impressive when it starts to work. I have developed two chat programs, one using raw socket programming and another using CORBA technology. If you want to see the source and want to have a hands on with it then feel free to download the CORBA version.

4. Use Cases
    The use cases are part of UML which are used at the time of requirements analysis in the software process. They help you describe your systems requirements in a pictorial and/or step-wise manner. Each requirement is broken into a series of steps, clearly identifying the actors which interact with the system for that use case and the flow in which the use case progresses. Often you find that a use case has a common all-goes-well case, and many alternatives that may include things going wrong and also alternative ways
that things go well. Read to find out all there is in the use of Use Cases to describe your system requirements.

Swing Notes

    Here i have captured the details almost always not required by a general Swing programmer but definitely this knowledge will help you define for yourself an edge over your peers. So, read to learn better what
you already might be thinking you know/understand well. This document is a work-in-progress!

J2EE Notes

    A descriptive notes on J2EE technology. This page is a work-in-progress. A real big one this will be…keep visiting!

Telecom Notes

    Its a work-in-progress. I promise to make it availablesoon.

8. Using Log4J
    Its a work-in-progress. It will be made available soon.

9. CORBA Notes
    Some good tips for beginners of CORBA. This document is a work-in-progress! Not properly formatted at present as it was written in a training class using vi editor and i am still to put it in proper shape. Its the same notes which you get with the above corba version of chat software.

Posted in General | Leave a Comment »

Open-source Web applications, PHP vs. Java (Part 2 of 2)

Posted by Narendra Dhami on July 23, 2008

The first part of this article reviewed some elevant open-source Web applications in both the PHP and Java worlds. The conclusion was that there are massively popular PHP projects and somewhat popular if not obscure Java counterparts. I’m a Java fan and it pains me to discover this reality. The user comments also underlined this feeling.

Is it the technical merits of PHP?

In my experience, the technical merits
of PHP are below those of Java as a language and as a runtime environment (standard API, virtual machine).

Compared to Java, the code quality of PHP projects has a faster decreasing rate as the codebase size grows. The root cause is that PHP was created to solve small size problems and
this makes it difficult to manage larger projects.

PHP 3 and 4 had basic object-oriented
features, while PHP 5 improved them considerably, both at the language and the runtime level. There are several PHP MVC frameworks to ease the structuring of larger projects, but these are most effective when running on PHP 5. Most popular open-source PHP projects still run on PHP 4 and tend not to use MVC frameworks at all.

Looking at the staggering number of plugins available for the popular PHP open-source projects, one could conclude that their code is easily understandable and that PHP has well-rounded application extension mechanisms. Well, not exactly true.

The typical PHP extension mechanism is procedural and works like this:

  • list the subdirectories of the extensions directory,
  • analyze the predefined directory structure for each extension,
  • execute some predefined PHP files that should auto-register their resources and actions.

More …

Posted in Java, PHP | Leave a Comment »

Open-source Web applications, PHP vs. Java (Part 1 of 2)

Posted by Narendra Dhami on July 23, 2008

It is common knowledge that PHP does well in the open-source Web applications space. PHP has numerous representatives for most application categories, and for some it provides a clear leader, like WordPress. On the other hand, most Java counterparts have apparently failed to reach the same popularity.

Below is an overview of the existing open-source PHP and Java implementations for the following categories of applications: forum, blog, wiki and content management systems (CMS). These are among the most commonly used types of on-line software. More…

Posted in Java, PHP | Leave a Comment »

FileSyncTask: Using Phing to synchronize files and directories

Posted by Narendra Dhami on July 23, 2008


FileSyncTask is a Phing extension for Unix systems which synchronizes files and directories from one location to another while minimizing data transfer. FileSyncTask can copy or display directory contents and copy files, optionally using compression and recursion.

Rather than using FTP or some other form of file transfer, FileSyncTask uses rsync to copy only the diffs of files that have actually changed. Only actual changed pieces of files are transferred, rather than the whole file, which results in transferring only a small amount of data and are very fast. FTP, for example, would transfer the entire file, even if only one byte changed. The tiny pieces of diffs are then compressed on the fly, further saving you file transfer time and reducing the load on the network.

FileSyncTask can be used to synchronize Website trees from staging to production servers and to backup key areas of the filesystems. More…

Posted in Web | Leave a Comment »