Blogs : Latest entries
|
|
|
I started writing a comment on Patrick's post, and it become so large that I'm making a seperate blog post out of it: Lucas, while there are definitely advantages to providing sensible default behavior through an implicit approach, your example is so ridiculous that it's difficult to give your statement any credibility. Any micro comparison of source code length, or even the simple fact that you're comparing number of lines should make many developers look away. It's utterly ridiculous to compare how long it took you to bash a simple application together. What is important (to me) is that I will be able to maintain that application for years and years, that other developers can easily find their way and take it over, that there's no doubt, that the maintenance cost doesn't get too high for the customer, that I don't have to spend days to just try to unravel what I did years ago and that I can easily call someone to help me out for a brief period when I find that the workload is too high. I agree that many frameworks went a bit overboard in the configuration department, but starting off with implicit 'magic' behavior doesn't really rock my boat either. About tadalist, that application is so stupid that I'm wondering how the hell it could have taken him 600 lines to write it. Also, the hugely hiped 'killer application' of RoR, Basecamp, is a total fraud imho. The screenshots look nice, and are nicely presented. So I did make an account and started using it. And honestly, everything they say is true, it sets itself apart in simplicity. Not difficult to write that in a few weeks. At least I hoped that the critical errors that I got during the testing would have disappeared after so many months of hyping. This made me really wonder about the maintainability and the transparency of a system written in RoR. If the demonstration application about which workshops are given refused me to perform work by spewing critical errors, I get rather suspicious. I revoked my account since I felt quite cut down in productivity by using it. Lastly, I think that driving a web application from a database structure is totally backwards. It makes it very difficult to migrate to other structures over time and you're limited by the meta-data that your database supports. If you want to base yourself on a data structure, you should use domain objects with appropriate meta-data. Of course, then you get some kind of configuration and your precious line count might increase. While RoR is greatly marketed and that Active Records nicely uses some of Ruby's features, I yet have to see something that really impresses me. Writing Ruby code in the middle of your HTML certainly didn't. |
|
Another chapter in the software patents story of Europe is being written. On Monday, the next threat will happen and if people don't take action, it's possible that software patents will appear even after all the previous protest and vetos. It's very important that you fax a personal letter to the following Belgian and Dutch ministers. While it's possible to send an email or to sign online petitions, these actions are too easy and are rarely taken seriously. Please take the time to write a personal letter today. You might find some inspiration on our forum, or post your own. More information can be found on:Dutch summary: http://www.ffii.be/landbouwraad Dutch newsitem: http://webwereld.nl/nieuws/20597.phtml Dutch analysis: http://www.softwarepatenten.be/raadtekst English summary: http://demo.ffii.org/cons0501/ English analysis: http://swpat.ffii.org/papers/europarl0309/cons0401/ BelgiumMinister van Energie en Economie Marc Verwilghen Fax: 02-213.09.22 Tel: 02-213.09.11 Minister Sabine Laruelle Ministerie van Middenstand en Landbouw Fax: 02-219.09.14 Tel: 02-250.03.03 Netherlands Minister Cees Veerman Ministerie van Landbouw, Natuur en Voedselkwaliteit Fax. 070-3786100 Tel. 070-3786868 Mail through this form You can also fax by mailing to remote-printer.Minister_Veerman@31703786100.iddd.tpc.int |
|
Drone is a Java IRC bot written with the RIFE framework. It has a modular API that makes it possible to easily extend and customize the active feature set. It sports a modern web administration interface to handle all common tasks and a public logging section with an advanced web search. It also provides a remote IRC messaging REST API to allow easy integration with notification services. Installation is done by simply dropping a war in your servlet container or by running it straight from the standalone distribution. The highlights of this release are:
Visit the homepage at for more details: You can see it running at: Download it from: Have fun! |
|
For more information about RIFE go to the project's page. Below are the highlights of this release.
Support for Derby and One$DB/DaffodilDB databasesRIFE now fully supports Derby and One$DB/DaffodilDB in the database query builders and in every integrated framework:
Support for Cloudscape has been removed and has been replaced by the Derby support. Important bugfixes and reduced memory usageAll known bugs have been fixed and many areas of the framework have been profiled in production to reduce memory usage as much as possible. Many thanks go to YourKit for providing our developers with free licenses. Due to these fixes and improvements, everyone is urged to upgrade to this version. Support for constrained beansBesides the constrained properties, RIFE now has constrained beans. These constraints provide meta-data that isn't related to a single property but rather provides information about the entire bean instance. Some of these have been integrated with the database query builders (multi-column unique and default ordering), but others have been added for the benefit of external libraries like RIFE/crud and currently have no concrete interactions inside the core framework (associations and textual identifiers). Constrained beans are declared is a completely similar manner as constrained properties, for example: public class Personal extends Validation
{
private String mFirstname = null;
private String mLastname = null;
private String mCity = null;
public Personal()
{
}
protected void activateValidation()
{
addConstraint(new ConstrainedBean()
.unique("firstName", "lastName")
.defaultOrder("city")
.defaultOrder("lastName")
.defaultOrder("firstName"));
}
public void setFirstname(String firstname) { mFirstname = firstname; }
public String getFirstname() { return mFirstname; }
public void setLastname(String lastname) { mLastname = lastname; }
public String getLastname() { return mLastname; }
public void setCity(String city) { mCity = city; }
public String getCity() { return mCity; }
}This will put a unique constraint on the new CreateTable(datasource)
.table("personal")
.columns(Personal.class);Additionally, class-aware
new Select(datasource, Personal.class)
.from("personal");Detection of URL length overflowThere is no standard limit for the maximum length of an URL, but currently the lowest common threshold seems to be 2048 bytes for Internet Explorer (http://support.microsoft.com/kb/q208427/). Since RIFE by default stores the state in the query string, there's a possibility that a query string makes this URL length limit overflow. RIFE now detects such an overflow and uses session state storage for that request only while logging a warning about it. This enhances the reliability of RIFE applications by picking the most REST-aware state storage method that's technically feasible without compromising the application's robustness. Automatic preservation of serializable properties in the data flowBefore, RIFE's data flow only supported
the automatic preservation of bean properties with types that could be
mapped directly to Addition of database capabilities and compensatorsRIFE has always had a layered approach to database interaction and persistence. We firmly believe that you need to know SQL and your target database before being able to make your applications perform as fast as possible. However, there are many basic operations that are totally analogue amongst database back-ends but differ in syntax. This is why we created the database query builders, which allow you to build your queries through a uniform API and rely on the engine to translate the queries into the appropriate syntax for your target database. However, to collect the results of your queries, many common
patterns exist that you shouldn't have to write manually. We collected
those in the In this release we're taking the database layer one step
further and are starting to abstract functionalities that each database
should have, but that not all of them provide easily. We call these
functionalities 'capabilities'. If a database doesn't natively support a
capability, it will use a compensator to still provide the requested
functionality. RIFE knows for each supported database which capabilities
are natively available and which ones need to be compensated for.
Currently, the only available capabilities are ' Capabilities are only used when you use
RIFE's database query builders and execute them through the
Support for internationalized requests and query stringsUnless you explicitly specify the character set
in the content type attribute of an element declaration or set it
explicitly in your code, each response will now default to the UTF-8
encoding. RIFE now also expects post requests to be in the UTF-8 encoding
and you have to do nothing to your application to make this happen. All
Sadly there's no standard for the character set encoding of URLs and it's not possible to reliably pass non-ascii data through the query string. Since RIFE has total control of your data flow, we are however capable to provide a workaround for this. All parameters that RIFE puts in URLs that are intended for itself, are now checked for non-ascii characters. If any of these are present, RIFE will use a custom encoding scheme to guarantee that your data is transferred along correctly. While those parameters will now not be human readable anymore, it allows international applications to be developed without worrying about possible data corruption while still behaving in a standard manner when only ascii values are transferred. Complete isolation of embedded elementsRIFE now makes sure that any submission will only be handled by its originating element or those within its conceptual context (parent elements or preceeding elements). So if you have several submissions with the same name, it will not be picked up by an embedded element or a sibling element. For this to work, RIFE needs to be able to identify elements in a unique manner and it uses a method that respects server restarts or code maintainance. This means that active users of the web application or bookmarks will still continue to work when the application is maintained over time. If you have several instances of the same embedded element in one template however, RIFE needs help to be able to differentiate the instances. This is simply done by appending a differentiator string like this: <!--V 'ELEMENT:.THEELEMENTID:differentiator'/--> This
new submission behaviour might however conflict with some existing code
that you have written, or you might want to actually have embedded
elements react to a submission of an embedding element. Therefore, you're
able to revert back to the previous behaviour by declaring the
submission's |


