1.Think in (Pure)MVC
How do I start using PureMVC? Short answer: Just think in (Pure)MVC! As its named says, PureMVC based on the classic Model-View-Controller design meta-pattern. Using the Facade-pattern you don’t instantiate the core actors directly, but every member of PureMVC has its own and clear defined role:
- Proxies = Model
- Mediator and its ViewComponents = View
- Commands = Controller
2.Create an API for View Components
A View Component might be a standard UI component (e.g. DataGrid) or a custom component (e.g. a world within a game) or whatever. Don’t use its public methods directly. In order to change its state or behavior create an API.
One of the advantage of PureMVC is to be neutral to the technologies being used. An example: I’ve built a “pure” Flash application based on PureMVC without using the Flex Framework. The same app will be ported to an AIR application for using AIR’s great File system API. The View Components have to be changed using the Flex Framework, but not the Mediators or any other actors of PureMVC.
3.Use one Mediator for multiple View Components
To coordinate more than one View Component closely, use one Mediator only. In other words: Not all Views need a Mediator. For example: Assume a ApplicationControlBar containing a TextInput , and a Button or something else. Then create just one Mediator for the ApplicationControlBar called ApplicationControlBarMediator and refer to the missing components casted as a second, third, etc. View Component.
4.Let’s Events bubble up
What happens if you don’t want to use multiple View Components within a Mediator? In order to handle user interactions with multiple View Components let’s bubble Events from the nested children of a View Component up.
For example: Clicking any Button within a View Component will fired up a custom Event which the Mediator is listen to. So the Mediator don’t have to know about the existing Button or about any other child of its View Component, just about the custom Event bubbled up.
5.Communicate using Notifications as often as possible
Notifications are the “Events” of PureMVC. For communicating between the three tiers Model, View and Controller use Notifications for the following scenarios as often as possible:
(communication from -> to)
- Mediator -> Proxy (via mapped Commands)
- Proxy -> Mediator
- Proxy -> Command
- Commands -> Mediator
Even if it’s possible to retrieve a Proxy from a Mediator, don’t change the Proxy from a Mediator directly rather than sending a Notification using a mapped Command. It’s a bad practice to change a Proxy (Model) from a Mediator (View) directly without using a Command (Controller).
6.Use Commands / MacroCommands as often as possible
Commands are doing the job at the Controller side: Retrieving and interacting Proxies, communicating with Mediators or executing other Commands. Even if a Command used only once or it has only two lines of code, use it as often as possible. To execute a Command once again anywhere or anytime within your application, you have to send just a Notification. In the future it’s easy to enlarge the Command with more complex actions. And - that’s very important - you always know, who the actor for changing the Proxy (Model) is.
Question: Have you had to execute more than one Command in a particular order? Use MacroCommands to execute multiple SubCommands (which means “simple” Commands) sequentially.
7.Use Remote Proxy to send and receive server-side data
To send and receive data between the application tier use Proxies called “Remote Proxies”. That’s not a special kind of a PureMVC Proxy, just a location based on a Proxy to organize the server calls such as HTTPServices, RemoteObjects or whatever.
For example: To call a server-side RemoteObject to login a user create Proxy called LoginProxy. The LoginProxy does all the job to communicate with the server-side, which means sending and receiving data. Whenever you’ll change the server-side implementation for the LoginProcess, you’ll have to change one location within your application only - the LoginProxy.
8.Remove unused Mediators
In some cases you don’t use a Mediator and its View Components anymore. Then remove the Mediator using facade.removeMediator(MyMediator.NAME); in conjunction with a self created destroy() method to remove the ViewComponent including all listeners, timer, references, etc. for a successful garbage collection.
9.The Power of VO’s (Value Objects)
The place to store data within the Model are the Proxies - that’s right. The View Components have no need to know the Facade and the rest of the PureMVC application - that’s right, too. This means that the View Component has no access to the Model data directly.
To avoid this issue store within the View Component a reference to the data using Value Objects (VO’s). The VO’s are not a core actor of PureMVC and in conjunction with the Data Binding feature of Flex are a powerful way to react changes in the Model data without breaking rules.
10.Courseware available
Cliff Hall has done an awesome job: You’ll find not only excellent documentations about the “Framework Overview“, “Best Practices” and a “Conceptual Diagram“, also a very, very, very helpful Courseware. Check it out!
Tuesday, December 25, 2007
“Top 19″ best practices for J2EE
The list of the best of the best Java EE practices can be found at IBM web site:
1. Always use MVC.
2. Don’t reinvent the wheel.
3. Apply automated unit tests and test harnesses at every layer.
4. Develop to the specifications, not the application server.
5. Plan for using Java EE security from Day One.
6. Build what you know.
7. Always use session facades whenever you use EJB components.
8. Use stateless session beans instead of stateful session beans.
9. Use container-managed transactions.
10. Prefer JSPs as your first choice of presentation technology.
11. When using HttpSessions, store only as much state as you need for the current business transaction and no more.
12. Take advantage of application server features that do not require your code to be modified.
13. Play nice within existing environments.
14. Embrace the qualities of service provided by the application server environment.
15. Embrace Java EE, don’t fake it.
16. Plan for version updates.
17. At all points of interest in your code, log your program state using a standard logging framework.
18. Always clean up after yourself.
19. Follow rigorous procedures for development and testing.
Monday, December 17, 2007
Study tips
In my opinion, there is no set timeframe like months or days to prepare for Java Certification. It depends entirely on how you want to approach the whole subject. If you are well versed with Java language it might take you little effort to prepare for the Java Certification or else if you are new to Java the efforts can double. The objective for passing the certification is totally different then objective for learning Java language. There are certain Java topics which are not covered in the certification objectives like Swing, EJB, Servlets, JDBC just to name few. When I started learning Java language I realized that it is kind of cumulative language, which means the new concepts are added to and build upon previous concepts. It is very important that the early material be mastered thoroughly. So.... do some initial homework, see where you stand in terms of your Java expertise and approach this issue accordingly.
Tips:
(1) Before you think of appearing for the certification, make sure that you are aware of Java language concepts, syntax and object oriented concepts. Lay special emphasis on the certification objectives. This will give you some directions as to what Sun(TM) is expecting from you for getting certified.
(2) Do some initial investment and buy a good Java book. I bought Ivar Hortan's Beginning Java 2.
Carefully read over the sections and look carefully at the sample problems. (One nice aspect of this book is that the author uses real life scenarios to explain Java concepts) .If you go to a school which teach Java or have joined a Java course, then decide if you benefit more by reading before or after the instructor covers the material. If you know which skill areas are the weakest, you can then work to improve yourself in those areas, and you'll have a far better chance to reach your full potential for higher scores.
(3) There is simply no excuse for this.. write lots of code. As you start developing code, you won't necessarily get it right the first time, but you can improve as you find more about the underlying details. You will realize the importance of this when you go in the examination hall and see the code intensive questions in the new SCJP format. Writing and executing code will fine tune your theoretical concepts and get rid of any ambiguities. Questions in the certification often test you on 'compile time error' and 'run time error' in the code and you are expected to know the difference between the two types of errors, which will not come to you unless and until you have made an conscious effort to write and compile the code.
(4) Start making notes on piece of paper. Every time you find a concept which relates to the certification objective, jot it down. Put together all the notes pertaining to a topic in same folder in one place, so that you can refer to them at the appropriate time.
(5) Identify your scoring topics. These are some of the topics where you stand a good chance of scoring 95% - 100%. Concentrate more on these.
(6) Once you are confident that your level of comfort with Java language is fairly good, start taking the mock exams. You may have to do the exams test for more than once. Try to get score over 90% in this mock exams. The questions that are in the real exam can be a lot trickier than those you solve in mock exams. One area which can be tricky is declarations and access control, Operators and assignments. In case of multiple choice questions, you can go thru the possible answers real quick and eliminate the wrong ones which seem obvious. This is the most difficult exercise, but once you crack it (by practice) you can get the answer fairly quickly.
It is very very important that you continually review and practice the java concepts you already know and the new concept you acquire in the process of learning. Best way to do so is visit a Java forums on the web. Try to answer the questions raised by the fellow programmers. I have listed some forums here on my website.
(7) Week before the exam collect all your notes which you have filed in Step (4) and start breaking them into one liners, just the gist. This way you have only the important points and concepts in hand. Use this material one final time one day before the exam and keep it in safe place.
(8) Take a good night sleep before the exam day and appear with fresh mind.
(9) When you approach a question try to understand why has the question come in the examination, what is that 'they' want to test by posing this question. In the real exam the questions are worded clearly and without any ambiguity (no tricky questions) , so spend some time reading them.
(10) Haste will only makes waste!!. Rushing thru the questions and trying to complete the test will not improve your test score.
(11) One very counter productive approach is to time your questions. You will end up spending more time looking at your watch and less time concentrating on the questions. You may want to get to the "easier" questions first and then revisit the remaining ones.
(12) Never get frustrated or discouraged by unfamiliar or "hard" questions which come can come in the beginning. Just keep concentrating and working on the remaining ones.
(13) Not failure but low aim is a crime....
My Web Application Development Process
The First Step - Analysis and Planning
The planning stage is where you meet with the client and get t know exactly what they need. If they have an existing system in place — either a paper-based system, existing web-based or desktop system, have then run through their typical daily tasks and show you exactly what they do, and why they do it. The point here is not to start making recommendations but to get really inside their current system and get a complete understanding of how the system helps them. Almost assume you’re being trained for their job and have to do each of the tasks that they’re doing and why they’re doing it so you can start thinking about the system from their perspective.
You might be thinking that a lot of clients don’t currently have anything in place, but I’ve had clients to wrote down all their service calls on paper and then wrote them on a big white board before I worked with them. That was their system, and that’s the first place we started. The goal of any web-based application is to improve employee work flow, and subsequently increase productivity. Otherwise, it’s hard to make a business case to the client to spend thousands of dollars on your custom software.
Once you have a clear understanding of their business and how their existing system works you can start planning and making recommendations for improvements to the system. Start brainstorming with the client and ask them what immediately comes to their mind in an effort to start improving their current work flow. Here is where the documentation starts as well. Start off with a functional specification of the system that clearly outlines, in a high-level description, what the proposed system will do and how it will improve efficiencies and productivity. This does a couple things: it helps define the exact scope of the project at the start to help reduce any scope creep and change requests throughout the project, and also helps you define the project to include in your contract or service agreement.
A Note on Documentation:You might be thinking to yourself, that it sounds like a lot of documentation, and a lot to do up front. However, I’ve found that it is quite rare for a client to truly understand themselves what they want in a system when it is being developed, and the more discussion, brainstorming, and documentation you put in place it helps develop further discussion on the system, and finalize on a complete and accurate system spec. The more details you include in your up front documentation, the less questions and changes you’ll have down the road. For large complex systems, a lack of documentation and planning can mean stalled projects, delays in delivery (and payment), and unhappy clients due to confusion about the project.
Interface Design
Yes, the interface is the second step. Part of the planning should include how the client wants the interface to work. This is arguably the most important aspect of the development project, since the interface will effectively determine whether the application is a success or not. Keeping the users of the system happy is the single most powerful tool in turning a web application client into a long-term business relationship. If the users are constantly complaining to their boss about how difficult it is to use, then you’re going to have more minor fixes, and headaches than you’ll want.
They won’t have a clue about the technical underpinnings of the system like how the database is setup or structured, or whether you’ve coded it well or not. Although database and coding is equally important to the interface on your end, the clients really could care less.
During the interface design, you need to design every single screen from the login, to the user’s dashboard, reports, and forms. Each and every module should be clearly defined including mock error messages and notices. The reason for doing this separately before the actual programming is that you won’t be in a programming state of mind while designing the system. If you do all your mock ups in Photoshop or Fireworks you’re not thinking about how you’ll code the HTML or structure the database - you’re solely thinking about how the system works. If you do leave these elements out, while you’re programming it, you won’t give them the required time and attention and the entire application will suffer.
This also gives your user a way of seeing what the application will look like and give you very important feedback. You don’t want to have to re-work the interface once you’ve already coded it. That can be a huge hassle, and changing it at this step is simple.
As I’m drawing up mockups, I like to label them with their proposed URL structure. Rather than trying to set this up in the development stage, start thinking about it here. Label each of your screens as domain.com/app/module/function ex: domain.com/app/calendar/view and domain.com/app/calendar/edit/434. It doesn’t mean you need to split these functions into different actual web pages - through the use of mod_rewrite you can create some great-looking URLs.
Database Design
Now we can begin the database structure. Look at the proposed screens for the application and start grouping fields, entities, and the data you’ll be storing and create some high-level Entity-Relationship Diagrams or ERDs. Then get more detailed and create a complete database structure including the relationships between each table. I like to reduce to Third Normal Form (3NF), but you can go deeper if you want. You’ll find that this step is quite easy now that you’ve already done the interface design, as well, from doing the interface design, you’ll also have the fields and other data clearly outlined so you won’t have as many surprise changes to the structure of the data. You probably don’t want to show this document to the client as they most likely won’t understand it.
Class and Application Structure
At this point I like to start outlining any classes and data objects I’ll need in the system. Object-oriented programming (OOP) is always the way to go, especially in large, complex web applications since you’ll be maintaining the system for some time as well. The goal is to have as much code reuse as possible, and to come up with a logical set of programming objects to reduce the complexity of programming the system as well as the maintenance.
This doesn’t mean just coming up with standard database connection objects, and other standards libraries, you want to look at objects specific to functions of the application. For example, if the system includes an inventory module, you want to create one or more inventory objects so if you need to use an edit form in multiple places within your application you don’t need to cut and paste code, its a simple function call.
Directory Structure
Now I start planning my directory structure. I like to group my directories in a similar manner as the applications function, and I keep my images, javascripts, css, etc grouped as well. Here’s a sample:
• .htaccess
• /images
• /javascript
• /css
• /conf
• /includes
• /class
• /modules
• /tmp
• /files
o /images
o /documents
I like to have a temp directory for file uploads contained within the web application rather than uploading files to a server’s general temp directory, and I also like to put all uploaded files within the files directory and organize them accordingly witihin. The conf directory holds any configuration files (which will include system options and database connection variables). The modules directory will include folders and the files for each module within the system. Finally, the .htaccess file includes any rewrite rules and server configurations.
Development
Now we can start the development of the site. This consists of converting my mockups to HTML/CSS and getting the templates uploaded, then building the database and finally connecting the HTML templates to the database with code. I always work off my local file server and then do periodic uploads of the system to a web server where the client can play around with it while I’m developing off my own internal server. This way they can look at the system and do some testing while I’m developing. It also keeps them in the loop during the entire development process to ensure that you don’t go off track on the system.
Also, ensure that you have some sort of backup in place for your system while it’s in development. This is critical for the obvious reason that you don’t want to lose it and have to start over, but you’ll often mess something up and want to start over from the beginning of the day or earlier. In fact, setting up some sort of version control system like CVS or Subversion is your best bet, I recommend Subersion.
Quality Assurance and Testing
You’ll be testing while you develop the site, but you want to put aside some time to try and break your system once you have a working BETA of the application. This means entering invalid data, trying to hack into login forms, etc. Have your clients try the same, as they’ll probably think of entirely different methods of using the system since they haven’t been so close to the development of the system like you have.
During the development phase you should also be putting together a test plan to help test the system. This is where you’ll refine it and then run through your test plan and track any bugs as they are found. I like to track bugs in a spreadsheet using Excel or iWork Numbers.
Launch
Finally, launch the application. You’ll want to give your client a notice that there may be some minor tweaks to work out in the first couple weeks or months of using the system. Just have them track any issues and report back to you for fixing. I typically give them a period of 1 or 2 months where I’ll fix any other bugs they find, but after that point any fixes are billable to the client.
Maintenance
Now that the project is initially complete, you’ll want to setup a maintenance agreement with the client to maintain the system. THis means ongoing support and bug-fixes, web hosting for the system, and regular backups.
Web applications can be a lucrative part of your web development business, they have been for me, and I really enjoy the challenge of planning, designing and implementing the systems. As well from a business point of view, they’re a great source of continual revenue, and also a great way to build stable, long-term clients, which are essential to the long-term plans for your business.
Wednesday, October 31, 2007
WebOS
Với sự phát triển mạnh mẽ của Ajax, rất nhều ứng dụng web trở nên thân thiện hơn và dễ sử dụng hơn với người dùng. Và khái niệm WebOS xuất hiện, nó giúp chúng ta chạy nhiều ứng dụng website khác nhau trên 1 giao diện giống như 1 hệ điều hành trên máy desktop. Mình xin tổng hợp 1 số các website WebOS như sau:
Remotely Hosted WebOS
* AstraNOS - Picture Windows 98. Then picture an OS X dock. Then picture a night sky. Then throw them all together. You now have a pretty good picture of AstraNOS.
* BeDesk - Basic wrapper for other online tools.
* cmyOS - Free hosted webtop powered by eyeOS.
* Desktoptwo - Not only do you get 1GB of space, you get a fully-featured OpenOffice.org suite. No, not a basic online editor that has simple formatting options. The full OpenOffice.org 2.0 suite from Sun, converted into a Java applet.
* DoxBoard - Slick WebOS with some basic features.
* GCOE X - Nice WebOS with a powerful terminal and support for the iPhone.
* eyeOS - Beautiful webtop powered by the eyeOS software.
* Glide - Online operating system with support for BlackBerry, Palm, Windows Mobile, Symbian and iPhone users.
* G.ho.st - With 3GB of space, FTP access, and Zoho Office support, what’s not to like?
* goowy - Great webtop with your own email account (@goowy.com), IM, 1GB of space (via Box.net), and much more.
* jooce - Slick invite-only online OS.
* mybooo - Invite-only webtop with a ton of features.
* myGoya - Nice WebOS with PIM features, a media player, and much more.
* OOS - Basic online operating system that offers a personal webpage.
* Parakey - Not much is known about Blake Ross’s newest invention, but we do know that Facebook liked it enough to purchase it for an undisclosed sum.
* Psych Desktop - GPLed webtop with a powerful UNIX-like console.
* Purefect Desktop - Web desktop with a powerful IDE.
* SSOE - Flash-based webtop a lot of features.
* StartForce - Powerful WebOS with tons of apps and features makes the descendant of Orca Desktop a hit.
* Xindesk - File sync, a powerful API, and much more are included in this great WebOS.
* Webdesk - This Indian webtop includes 1GB of space, POP3 client, PIM, and a nice modules API.
* Webdows - We don’t know how long it will take Microsoft to sue these guys, but it’s a real enjoyment in the meantime. It has XP and Vista styles (including a few Vista effects), FTP, file sharing, IM, and much more.
* Widgets Gadgets - AJAX desktop with tons of apps and a working API.
* YouOS - File sharing, powerful shell, and 700+ applications are all available with this wildly popular operating system.
* ZimDesk - Slick WebOS with tons of apps.
Self-Hosted WebOS
* eyeOS - One of the most popular webtops on the planet, eyeOS boasts tons of apps, a booming community, and a lot more features.
* Fenestela - There’s still quite a few bugs to be ironed out in this French WebOS, but you get a cool XP interface and basic PHP apps.
* Psych Desktop - GPLed desktop with a powerful UNIX-like console.
* Purefect Desktop - Web desktop with a powerful IDE.
* Virtual-OS - Includes powerful API, web server sync, forum integration, and offline AJAX support.
* ZKDesktop - Powerful open source Java-based WebOS.
Remote Desktops
* DesktopOnDemand - A fully featured Linux-based desktop with Gnome, Gaim, AbiWord, Evolution, GIMP, WebDAV, VNC, web login, and much more.
* Free Live OS Zoo - Java applet
* Nivio - Subscription-based ($12.99/month) service that offers Windows XP, Adobe Reader, iTunes, Google Talk/aMSN/Windows Live Messenger, OpenOffice.org, Thunderbird, Nvu, and much more. All through a Java-based web interface.
Startpages
* Favoor - Basic startpage with a nice folder option.
* iGoogle (formerly Google IG) - Great startpage with the most amount of apps I’ve seen for a portal.
* iStyled - Simple startpage with basic customization.
* ItsAStart.com - Customizable page with basic features.
* Live.com (formerly Start.com) - Basic news page backed by Microsoft.
* My Yahoo! - Yahoo!’s entry into the startpage market isn’t bad: it offers news, Yahoo! Mail notification, podcasts, videos, and photo galleries to your startpage.
* Netvibes - There’s a reason everyone uses Netvibes. It has tons of apps, tabs, skins, and a great interface.
* Pageflakes - Popular, easy-to-use page with a simple interface.
* Schmedley - Powerful startpage with tons of features.
* Webwag - The main appeal here isn’t the widget on demand feature (a quick way to build a widget for the site of your choice), the toolbar, the apps, or the content directory. It’s the External widget feature, which allows you to convert and add Netvibes and iGoogle widgets to your Webwag page.
* Widgetop - Nice looking AJAX start page.
* yourminis - Great start page with tons of apps and a bunch of skins by the creator of goowy.
Wednesday, October 24, 2007
Tools dor web developers
Code Editors
1. Aptana
The Aptana IDE is a free, open-source, cross-platform, JavaScript-focused development environment for building Ajax applications. It features code assist on JavaScript, HTML, and CSS languages, FTP/SFTP support and a JavaScript debugger to troubleshoot your code.
2. Eclipse
Eclipse is an open-source software framework written primarily in Java. In its default form it is a Java IDE, consisting of the Java Development Tools (JDT) and compiler (ECJ). Users can extend its capabilities by installing plug-ins written for the Eclipse software framework, such as development toolkits for other programming languages, and can write and contribute their own plug-in modules. Language packs are available for over a dozen languages. (Source Wikipedia)
3. jEdit
jEdit is a mature programmer’s text editor with hundreds (counting the time developing plugins) of person-years of development behind it. Being a Java based solution it runs across multiple operating systems including; Mac OS X, OS/2, Unix, VMS and Windows.
4. NVU
A Web Authoring System for Linux desktop users as well as Microsoft Windows and Macintosh users to rival programs like FrontPage and Dreamweaver. Nvu (which stands for "new view") makes managing a web site a snap. Now anyone can create web pages and manage a website with no technical expertise or knowledge of HTML.
5. Quanta Plus
Quanta Plus is a highly stable and feature rich web development environment. The vision with Quanta has always been to start with the best architectural foundations, design for efficient and natural use and enable maximal user extensibility.
6. Amaya
Amaya is a Web editor to create and update documents directly on the Web. Browsing features are seamlessly integrated with the editing and remote access features in a uniform environment. This follows the original vision of the Web as a space for collaboration and not just a one-way publishing medium. Amaya started as an HTML + CSS style sheets editor. Since that time it was extended to support XML and an increasing number of XML applications such as the XHTML family, MathML, and SVG. It allows all those vocabularies to be edited simultaneously in compound documents.
Modelling Tools
7. Dia
Dia is inspired by the commercial Windows program ‘Visio’, though more geared towards informal diagrams for casual use. It can be used to draw many different kinds of diagrams. It currently has special objects to help draw entity relationship diagrams, UML diagrams, flowcharts, network diagrams, and many other diagrams. It is also possible to add support for new shapes by writing simple XML files, using a subset of SVG to draw the shape.
8. ArgoUML
ArgoUML is the leading open source UML modeling tool and includes support for all standard UML 1.4 diagrams. It runs on any Java platform and is available in ten languages.
9. StarUML
StarUML is an open source project to develop fast, flexible, extensible, feature rich, and freely-available UML/MDA platform running on Win32 platform. The goal of the StarUML project is to build a software modeling tool and also platform that is a compelling replacement of commercial UML tools such as Rational Rose.
10. MagicDraw
MagicDraw is a visual UML modeling and CASE tool with teamwork support. Designed for Business Analysts, Software Analysts, Programmers, QA Engineers, and Documentation Writers, this dynamic and versatile development tool facilitates analysis and design of Object Oriented (OO) systems and databases. It provides the industry’s best code engineering mechanism (with full round-trip support for J2EE, C#, C++, CORBA IDL programming languages, .NET, XML Schema, WSDL), as well as database schema modeling, DDL generation and reverse engineering facilities.
11. OpenOffice Draw
DRAW - from a quick sketch to a complex plan, DRAW gives you the tools to communicate with graphics and diagrams.
12. Kivio
Kivio is an easy to use diagramming and flowcharting application with tight integration to the other KOffice applications. It enables you to create network diagrams, organisation charts, flowcharts and more.
File Transfer Clients
13. FileZilla
FileZilla is a free FTP client and a server solution. FileZilla is open source software distributed under the terms of the GNU General Public License.
14. WinSCP
WinSCP is an open source SFTP client and FTP client for Windows. Its main function is the secure file transfer between a local and a remote computer. Beyond this, WinSCP offers basic file manager functionality. It uses Secure Shell (SSH) and supports, in addition to Secure FTP, also legacy SCP protocol.
15. CyberDuck
Cyberduck is an open source FTP and SFTP (SSH Secure File Transfer) browser licenced under the GPL with an easy to use interface, integration with external editors and support for many Mac OS X system technologies such as Spotlight, Bonjour, the Keychain and AppleScript.
16. FireFTP
FireFTP is a free, secure, cross-platform FTP client for Mozilla Firefox which provides easy and intuitive access to FTP servers.
Code Documentors
17. JSDoc
JSDoc is a tool that parses inline documentation in JavaScript source files, and produces an documentation of the JavaScript code. This is typically in the form of HTML, but XML and XMI (UML) export are also supported. JSDoc is based on the (very successful) javadoc tool that was created for the same purpose for the Java programming language.
18. Javadoc
Javadoc is a tool for generating API documentation in HTML format from doc comments in source code. It can be downloaded only as part of the Java 2 SDK.
19. PHPDoc
PHPDoc is an adoption of Javadoc to the PHP world. PHPDoc is written in PHP. It offers you a way to generate an API documentation of objectoriented and procedural code with certain markup in your source. PHPDoc is an Open Source Project and gets distributed under the PHP Licence. That means you can use it in commercials projects.
20. phpDocumentor
phpDocumentor, sometimes referred to as phpdoc or phpdocu, is the current standard auto-documentation tool for the php language. Similar to Javadoc, and written in php, phpDocumentor can be used from the command line or a web interface to create professional documentation from php source code. phpDocumentor has support for linking between documentation, incorporating user level documents like tutorials and creation of highlighted source code with cross referencing to php general documentation. A complete list of features is available.
Bowser Plugins
21. ColorZilla
Advanced Eyedropper, ColorPicker, Page Zoomer and other colorful goodies.
22. LiveHTTPHeaders
LiveHTTPHeaders displays http headers in real time (while pages are being downloaded from the Internet) letting you edit request headers and replay a URL.
23. DebugBar
The DebugBar V4.1.1 is an Internet Explorer plug-in that brings you new powerful features such as a DOM Inspector, HTTP Inspector, JavaScript Inspector, JavaScript Console and HTML Validator.
24. Firebug
Firebug integrates with Firefox to put a wealth of web development tools at your fingertips while you browse. You can edit, debug, and monitor CSS, HTML, and JavaScript live in any web page.
25. Firebug Lite
Well this one isn’t a browser plugin as such, however I think it goes nicely under Firebug.
Firebug Lite is a JavaScript file you can insert into your pages to simulate the Firebug console in browsers that are not named "Firefox".
26. FireBug Lite ++ (IE7Pro)
An amelioration of the FireBug Lite Script used as userscript for observing from all web sites. F12 to open the console
FireBug Lite ++ can :
- Observe errors
- Evaluate expression (console)
- Browse JavaScript Object (not in FireBug lite, added by this script !)
27. Internet Explorer Toolbar
The Microsoft Internet Explorer Developer Toolbar provides a variety of tools for quickly creating, understanding, and troubleshooting Web pages. This version is a preview release and behavior may change in the final release.
28. Firefox web developer toolbar
The Web Developer extension adds a menu and a toolbar to the browser with various web developer tools. It is designed for Firefox, Flock, Mozilla and Seamonkey, and will run on any platform that these browsers support including Windows, Mac OS X and Linux.
29. IE7Pro
IE7Pro is a must have add-on for Internet Explorer, which includes a lot of features and tweaks to make your IE friendlier, more useful, secure and customizable. IE7Pro includes Tabbed Browsing Management, Spell Check, Inline Search, Super Drag Drop, Crash Recovery, Proxy Switcher, Mouse Gesture, Tab History Browser, Web Accelerator, User Agent Switcher, Webpage Capturer, AD Blocker, Flash Block, Greasemonkey like User Scripts platform, User Plug-ins and many more power packed features. You can customize not just Internet Explorer, but even your favorite website according to your need and taste using IE7Pro.
30. Opera Web Developer Toolbar & Menu
The web developer toolbar is a menu and toolbar setup for Opera which brings together functions related to web development, validation services and links to standards and other documentation. It integrates parts of Toby’s W3-dev Menu, MooseCSS’s menu, and countless BookMarklets taken from various places (Jesse, Aleto, SlayerOffice, Tarquin and others).
31. Pearl Cresent
Pearl Crescent Page Saver is an extension for Mozilla Firefox that lets you capture images of web pages. These images can be saved in PNG or JPEG format. Using Page Saver, you can capture an entire page or just the visible portion. Options let you control whether images are captured at full size (which is the default) or scaled down to a smaller size.
32. Feng GUI FireFox Add-On extension
A plugin allowing you to easily find out how people View your website or image and which areas are getting most of the attention.
The ViewFinder Heatmap service, is an artificial intelligence service which simulates human visual attention and creates an attention heatmap.
33. Lorem Ipsum Content Generator 0.4
The Lorem Ipsum Content Generator creates placeholder content using latin pasages. This allows you to see what a page is going to look like with content before the copy is actually available.
34. FlashBlock
Flashblock is an extension for the Mozilla, Firefox, and Netscape browsers that takes a pessimistic approach to dealing with Macromedia Flash content on a webpage and blocks ALL Flash content from loading. It then leaves placeholders on the webpage that allow you to click to download and then view the Flash content.
Unit Testing
35. PHPUnit
I understand this is a framework, however, I think it’s a good tool to use in PHP development.
To make code testing viable, good tool support is needed. This is where PHPUnit comes into play. It is a member of the xUnit family of testing frameworks and provides both a framework that makes the writing of tests easy as well as the functionality to easily run the tests and analyse their results.
36. JUnit
JUnit is a simple framework to write repeatable tests. It is an instance of the xUnit architecture for unit testing frameworks.
37. JsUnit
JsUnit is a Unit Testing framework for client-side (in-browser) JavaScript. It is essentially a port of JUnit to JavaScript. Also included is a platform for automating the execution of tests on multiple browsers and mutiple machines running different OSs.
38. NUnit
NUnit is a unit-testing framework for all .Net languages. Initially ported from JUnit, the current production release, version 2.4, is the fifth major release of this xUnit based unit testing tool for Microsoft .NET. It is written entirely in C# and has been completely redesigned to take advantage of many .NET language features, for example custom attributes and other reflection related capabilities. NUnit brings xUnit to all .NET languages.
Load/Stress Testing
39. OpenSTA
OpenSTA is a distributed software testing architecture designed around CORBA, it was originally developed to be commercial software by CYRANO. The current toolset has the capability of performing scripted HTTP and HTTPS heavy load tests with performance measurements from Win32 platforms.
40. curl-loader
A powerful C-written HTTP, HTTPS, FTP, FTPS load generator, performance and stress testing tool. It uses real HTTP and TLS/SSL stacks, generating thousands of users each with own IP-address. Emphases is given to user authentication, login and statistics.
Usability/Accessibility and General Testing
41. Xenu
Xenu’s Link Sleuth (TM) checks Web sites for broken links. Link verification is done on "normal" links, images, frames, plug-ins, backgrounds, local image maps, style sheets, scripts and java applets. It displays a continously updated list of URLs which you can sort by different criteria. A report can be produced at any time.
42. Vischeck
Vischeck is a way of showing you what things look like to someone who is color blind. You can try Vischeck online- either run Vischeck on your own image files or run Vischeck on a web page. You can also download programs to let you run it on your own computer.
43. browsershots.org
Browsershots.org is a free open-source online service providing screenshots of your web site in a multitude of different browsers. It is not as advanced as BrowserCam but a fantastic tool none the less.
44. BrowsrCamp
If you need to test your websites on MacOSX browsers then this service is the perfect place for you. BrowsrCamp offers two services: a Safari screenshots generator (free) and a testing system based on VNC (paid).
45. Feng GUI
Find out how people View your website or image and which areas are getting most of the attention.
The ViewFinder Heatmap service, is an artificial intelligence service which simulates human visual attention and creates an attention heatmap.
46. Watchfire WebXACT
WebXACT is a free online service that lets you test single pages of web content for quality, accessibility, and privacy issues. It is very similar to Bobby and usefull to anyone wishing to check the accessibilty level of their templates/site.
47. DBMonster
DBMonster is a tool which generates random test data and puts it into SQL database. It helps to test how an application can deal with large database.
Regular Expressions
48. Expresso 2.1
Expresso is useful tool for learning how to use regular expressions and for developing and debugging regular expressions prior to incorporating them into your code. It provides a very cut down version of RegexBuddy but most importantly it is simple to use and free.
49. Regex Coach
The Regex Coach is a graphical application for Windows which can be used to experiment with (Perl-compatible) regular expressions interactively.
Image Editing
50. GIMP
The GNU Image Manipulation Program is a Photoshop replacement that doesn’t have "quite" as much functionality but it’s excellent for free. It comes installed by default on many Linux distros and is also available in Windows. Worth a look.
51. Inkscape
Inkscape is an Open Source vector graphics editor, with capabilities similar to Illustrator, Freehand, CorelDraw, or Xara X using the W3C standard Scalable Vector
Graphics (SVG) file format.
52. Paint.net
A really good, lightweight alternative to Photoshop. It offers layers, unlimited undo, special effects and a wide variety of useful tools. The download is around 2mb too so absolutely worth a look – I use this when Photoshop is playing up.
53. XnView
XnView is software to view and convert graphic files, apparently really simple to use and supports more than 400 graphics formats.
54. ImageMagick
A lesser known application but it offers the ability to "create, edit, and compose bitmap images. It can read, convert and write images in a variety of formats (about 100)". Use it to "translate, flip, mirror, rotate, scale, shear and transform images, adjust image colors, apply various special effects, or draw text, lines, polygons, ellipses and B?zier curves."
55. Blender
A 3D Studio Max alternative, very comprehensive and full-featured.
56. Pencil
Pencil is an animation/drawing software for Mac OS X and Windows. It lets you create traditional hand-drawn animation (cartoon) using both bitmap and vector graphics. Pencil is free and open source.
57. Artweaver
Artweaver is a simple Freeware program for creative painting, i.e. Artweaver offers you all artistic effects which you need for your work. You can create sketches from photos and experiment with a wide range of brushes. The brush simulation is thereby so realistic as possible.
Colour Matching and Sampling
58. ColorJack
ColorJack is an amazing online application providing users with the ability to match colours that work well together. Perfect for those developers who struggle to get a good colour scheme together.
59. Kuler
Kuler is a very nice application allowing you match colours that will “work well” together. Also allows you to see other people colour pallets. A good starting place and very cool.
60. Color Cop
A very handy tool for capturing colours anywhere on your screen. Color Cop makes it quick and easy in those situations where you need to know what colour is being used.
Database Design
61. DBDesigner 4
DBDesigner 4 is a visual database design system that integrates database design, modeling, creation and maintenance into a single, seamless environment.
It combines professional features and a clear and simple user interface to offer the most efficient way to handle your databases.
62. Clay
Clay is a database design tool that runs as a plug-in in the Eclipse development environment. Clay has an intuitive user interface for graphically designing database models. Clay can also create a database model by reverse engineering an existing database. Furthermore, Clay generates the SQL (DDL) code appropriate for your database.
Source Control
63. Subversion
The goal of the Subversion project is to build a version control system that is a compelling replacement for CVS in the open source community. The software is released under an Apache/BSD-style open source license.
64. CVS
CVS is a version control system, an important component of Source Configuration Management (SCM). Using it, you can record the history of sources files, and documents. It fills a similar role to the free software RCS, PRCS, and Aegis packages.
65. CVSNT
The CVSNT Versioning System implements a version control system: it keeps track of all changes in a set of files, typically the implementation of a software project, and allows several (potentially geographically separated) developers to collaborate. It is compatible with and originally based on Concurrent Versions System (CVS), which has become popular in the open-source world and is released under the GNU General Public License. (Source Wikipedia)
66. RapidSVN
RapidSVN is a cross-platform GUI front-end for the Subversion revision system written in C++ using the wxWidgets framework. This project also includes a Subversion client C++ API.
67. TortoiseSVN
A Subversion client, implemented as a windows shell extension. TortoiseSVN is a really easy to use Revision control / version control / source control software for Windows.
Since it’s not an integration for a specific IDE you can use it with whatever development tools you like. TortoiseSVN is free to use. You don’t need to get a loan or pay a full years salary to use it.
68. TortoiseCVS
TortoiseCVS lets you work with files under CVS version control directly from Windows Explorer. It’s freely available under the GPL.
With TortoiseCVS you can directly check out modules, update, commit and see differences by right clicking on files and folders within Explorer. You can see the state of a file with overlays on top of the normal icons within Explorer. It even works from within the file open dialog.
69. SmartCVS
SmartCVS is an innovative multi-platform CVS client. It has powerful features, like built-in File Compare/Merge, Transaction display or List Repository Files, and still is easy and intuitive to use. SmartCVS focuses on your day-to-day tasks and usability and is not limited to the available CVS command set.
SmartCVS is available in two versions, a free Foundation version and the powerful
Professional version.
70. Subclipse
Subclipse is an Eclipse Team Provider plug-in providing support for Subversion within the Eclipse IDE. The software is released under the Eclipse Public License (EPL) 1.0 open source license.
71. JCVS
JCVS is a CVS client package written entirely in Java. JCVS provides a complete CVS client/server protocol package that allows any Java program to implement the complete suite of CVS operations. JCVS also provides a Swing based client that provides a commercial quality GUI client for CVS. Finally, jCVS provides a Servlet that allows any Servlet enabled web server to present any CVS repository on the internet for browsing and download.
72. WinCVS
WinCvs is a CVS client that runs on the Microsoft Windows platform. CVS, Concurrent Versions System, is a centralized Revision Control System (RCS). SourceForge.net provides CVS service to all hosted projects. In order to access our CVS service, you will need to install a CVS client. CVS allows developers to keep a historical record of changes made to their source code tree, and to allow multiple developers to work on a single set of files at the same time without accidentally overwriting changes made by other developers.
HTTP Debugging
73. Fiddler
Fiddler is a HTTP Debugging Proxy which logs all HTTP traffic between your computer and the Internet. Fiddler allows you to inspect all HTTP Traffic, set breakpoints, and "fiddle" with incoming or outgoing data. Fiddler includes a powerful event-based scripting subsystem, and can be extended using any .NET language.
74. Fiddler 2
Fiddler is a Web Debugging Proxy which logs all HTTP(S) traffic between your computer and the Internet. Fiddler allows you to inspect all HTTP(S) traffic, set breakpoints, and "fiddle" with incoming or outgoing data. Fiddler includes a powerful event-based scripting subsystem, and can be extended using any .NET language.
Fiddler is freeware and can debug traffic from virtually any application, including Internet Explorer, Mozilla Firefox, Opera, and thousands more.
Servers
75. Apache
The Apache HTTP Server is an open-source HTTP server for modern operating systems including UNIX and Windows NT. It provides a secure, efficient and extensible server that offers HTTP services in sync with the current HTTP standards.
76. Apache Tomcat
Apache Tomcat is the servlet container that is used in the official Reference Implementation for the Java Servlet and JavaServer Pages technologies. The Java Servlet and JavaServer Pages specifications are developed by Sun under the Java Community Process.
77. XAMPP
XAMPP is an easy to install Apache distribution containing MySQL, PHP and Perl. XAMPP is really very easy to install and to use - just download, extract and start.
Databases
78. MySQL
MySQL is the world’s most popular open source database software, with over 100 million copies of its software downloaded or distributed throughout its history. With superior speed, reliability, and ease of use, MySQL has become the preferred choice of corporate IT Managers because it eliminates the major problems associated with downtime, maintenance, administration and support.
79. PostgreSQL
PostgreSQL, the highly scalable, SQL compliant, open source object-relational database management system, is now undergoing beta testing of the next version of our software: PostgreSQL 8.3.
80. Apache Derby
Apache Derby is an open source relational database implemented entirely in Java and available under the Apache License, Version 2.0. Some key advantages include:
• Derby has a small footprint — about 2 megabytes for the base engine and embedded JDBC driver.
• Derby is based on the Java, JDBC, and SQL standards.
• Derby provides an embedded JDBC driver that lets you embed Derby in any Java-based solution.
• Derby also supports the more familiar client/server mode with the Derby Network Client JDBC driver and Derby Network Server.
• Derby is easy to install, deploy, and use.
Database Administration
81. pgAdmin
pgAdmin III is the most popular and feature rich Open Source administration and development platform for PostgreSQL, the most advanced Open Source database in the world. The application may be used on Linux, FreeBSD, OpenSUSE, Solaris, Mac OSX and Windows platforms to manage PostgreSQL 7.3 and above running on any platform, as well as commercial versions of PostgreSQL such as EnterpriseDB and Mammoth PostgreSQL.
82. MySQL GUI Tools Bundle for 5.0
MySQL GUI Tools Bundle for 5.0 is available under the MySQL AB "dual licensing" model. Under this model, users may choose to use MySQL products under the free software/opensource GNU General Public License (commonly known as the "GPL") or under a commercial license.
This is the MySQL GUI Tools Bundle for 5.0. It includes the following products.
• MySQL Administrator 1.2 Generally Available (GA)
• MySQL Query Browser 1.2 Generally Available (GA)
• MySQL Migration Toolkit 1.1 Generally Available (GA)
83. phpMyAdmin
phpMyAdmin is a tool written in PHP intended to handle the administration of MySQL over the Web. Currently it can create and drop databases, create/drop/alter tables, delete/edit/add fields, execute any SQL statement, manage keys on fields.
Site Statistics
84. AWStats
AWStats is a free powerful and featureful tool that generates advanced web, streaming, ftp or mail server statistics, graphically. This log analyzer works as a CGI or from command line and shows you all possible information your log contains, in few graphical web pages. It uses a partial information file to be able to process large log files, often and quickly. It can analyze log files from all major server tools like Apache log files (NCSA combined/XLF/ELF log format or common/CLF log format), WebStar, IIS (W3C log format) and a lot of other web, proxy, wap, streaming servers, mail servers and some ftp servers.
85. phpMyVisits
phpMyVisites is a free and powerful open source (GNU/GPL) software for websites statistics and audience measurements.
86. Google Analytics
Google Analytics (GA) is a free service offered by Google that generates detailed statistics about the visitors to a website. Its main highlight is that a webmaster can optimize his/her AdWords advertisement and marketing campaigns through the use of GA’s analysis of where the visitors came from, how long they stayed on the website and their geographical position. (Source Wikipedia)
Other
87. Beautify PHP
This program tries to reformat and beautify PHP source code files automatically. It is a pretty printer for your php source code. The program is Open Source and distributed under the terms of GNU GPL. It is written in PHP and has a web frontend.
88. PuTTY
PuTTY is a free implementation of Telnet and SSH for Win32 and Unix platforms, along with an xterm terminal emulator. It is written and maintained primarily by Simon Tatham.
89. WinMerge
WinMerge is an Open Source visual text file differencing and merging tool for Win32 platforms. It is highly useful for determing what has changed between project versions, and then merging changes between versions.
90. DBG
DBG is a full-featured php debugger. It works on a production and/or development WEB server and allows you debug your scripts locally or remotely, from an IDE or console.
91. PHP Accelerator
The ionCube PHP Accelerator is an easily installed PHP Zend engine extension that provides a PHP cache, and is capable of delivering a substantial acceleration of PHP scripts without requiring any script changes, loss of dynamic content, or other application compromises.
92. ajaxload.info
Ajax Load is an online application providing the ability to easily create and download “ajax loading“ images for your website or application. Very Web 2.0
93. Stripemania
Ever wanted to create a cool background for your site? Well this site allows you to easily generate your perfect background to use as you wish.
94. FavIcon Generator
Does exactly what is says on the tin. You upload your desired image and the generator does the rest.
95. YAML Builder
Ever wanted a tool that could build a base HTML Template quickly by allowing you to define the basic layout? Well this is that tool and it works really well too. Definitely worth a look.
96. CSS Rounded Box Generator
A simple tool allowing you to quickly and easily generate rounded corners for your website.
97. CSS Optimiser
Online CSS Optimizer/Optimiser is a web tool for reducing the file size of cascading style sheets. In order to save more space optimized files would be messy even so you may output it as a file. Non-valid or hacked (for certain browsers) CSS files may result in error.
98. CSS Validator
Validates your CSS stylesheets against W3C standards.
99. Acrobot
To cut to the chase Acrobot is a tool that takes supplied content and adds in relevant abbreviation or acronym tags.
100. Markup Validation Service
This validator checks the markup validity of Web documents in HTML, XHTML, SMIL, MathML, etc. If you wish to validate specific content such as RSS/Atom feeds or CSS stylesheets or to find broken links, there are other validators and tools available.
Sunday, October 21, 2007
Java tools for small to medium websites
Since I stopped serving drinks and started building websites, I tried many different languages and frameworks, not because it was absolutely necessary, but because i like to try everything. After some years I think I finally have preferred language for the web, and it’s called Java. Probably it was my choice since the beginning, mainly because I always liked Java, and I know it since the beginning of the language itself, but now I have no doubts… I like Java, I wouldn’t marry Java but I dreamed with it sometimes.
I’ve seen some blog posts about why developers don’t use Java as a web development language. One of the top reasons is because there is a scripting language called PHP that makes everything look simple, and is supported for almost, if not all, web hosting companies. And now there is RoR or TurboGears and others, that makes the process of creating a full web page as short as 10 minutes. So, many people look to web development in Java as something that is meant to big projects and complicated stuff. But my view is a bit different, I have in my toolbox some cool stuff that helps me creating small to medium projects in no time using Java.
Database Connection
First of all, one of the things that scares people away is to put a Java webapp talking to a RDBM like MySql or Postgresql. We need to load the driver, make a connection create statements or prepared statments, we must use result sets to retrive the rows, etc, etc. Then there is the scaring world of connection pooling, that we must set up our selfs, and that can be a big headache… For that and a bit more I use a tool called Torque from the good people from Apache.
There is some configuration involved in our development machine, but nothing to complicated, we just need to download maven, set the JAVA_HOME and MAVEN_HOME environment variables, take a quick look at the examples and we’re ready to start developing applications using torque (it works on any kind of applications, not just web based ones). Torque makes the connection to the database, sets up a connection pool, builds the database, creates some java beans to use in our app, and does a foot massage in the end… Or not… Anyway, it’s a great tool, all we need is a properties file and a xml file, to do all that. And best of all, it’s cross RDBM, so, if we want to move from MySql to Oracle and then to Postgresql, and so on, all it takes is to change some lines in the properties file, and we’re set.
But don’t be fooled by it’s simplicity, use it in big projects as well, it won’t behave worst than Hibernate for example.
Templating System
In this matter, PHP by itself it’s not better than Java. RoR and TurboGears and their friends from the fellowship of the pre-cooked frameworks come with built in support for that, but those are not in the same level, since they are frameworks, and not the language itself. There are frameworks for Java and Php as well that do that and more, specially in Java… But my tool of election for my templating is SiteMesh.
Using SiteMesh involves putting some jar files in our WEB-INF/lib folder, and a small change in web.xml, namely, creating a page filter. Then we can use plain JSP, Velocity or Freemarker decorators as our templates. Because this post is about small projects, a simple JSP decorator, that fits for all pages usually is enough. But there are many options we can use with SiteMesh. We can have many decorators and have it chosen for each request based on the url, on request parameters, cookies, etc. Using JSP as the decorator language we can add some dynamic behavior to our template as well, so for example, a banner that randomly changes from request to request can be chosen directly on the decorator.
Once again, don’t be fooled and blah blah (yes, all this tools are great for great projects as well).
File uploads
Yes, file uploads are something that people who invented servlets and JSP. If we google for “uploading files with java” we see that ther is over 2.000.000 results, wath shows that there is lot of people asking how they can do that. Once again there are lots of free tools avaiable, and once again I have a favorite one and once again, it’s provided by our Apachian friends, and once again, it’s simple yet powerful. Actually is a sub-project from Jakarta Commons, called fileUpload (original uh?).
Setting up involves a couple of jar files on our WEB-INF/lib, and using it involves (as expected) some java coding, but not much, just take a look at the user guide on their site, and you’ll quickly learn the basic usage.
Handling images
Sometimes we need to manipulate some images even on a simple project, either for creating thumbnails of the uploaded images on the fly, or to create those cool anti-spam codes on forms. Java bundles with a great API for that, the Java 2D API. But if you’re running your application server on a server that is not running a graphical interface, it simply won’t work. Since Java 1.5 there is an option called headless java that prevents that issue, but in some hosts doesn’t allow us to change the java runtime parameters, or they run an older java version, so, in that cases I use a tool called PJAToolKit, a pure java library that doesn’t need any graphics resource on the system. All you need to do is to change java.awt system property to com.eteks.awt.PJAToolkit and you’re ready to roll. The rest works just like Java 2D.
The end
There are lots of alternatives for each of those tools, you just need to find the one that serves you better. I’m already used to that, and I have no reason of complaint. But what would be really cool, is a tool that makes all the job for us while we’re drinking a cold bear on our favorite pub in a hot day, but that would leaves without a job, I guess… Well, let’s keep it this way.
1 comment:
Hi, lâu lắm mới gặp người Đồng Tháp! Mình làm quen đi, tớ cũng ở Đồng Tháp đây. Đây là link của mình http://tongthethuong.blogspot.com Có gì mình cùng trao đổi kinh nghiệm làm blog nha!
Post a Comment