A new commercial for T-Mobile myTouch 3G features an Android application made by Sibers.
The app is called Face-IT and it turns your Android device into a mouth that moves according to what you pronounce.
Russian Software Outsourcing Day by Day
A new commercial for T-Mobile myTouch 3G features an Android application made by Sibers.
The app is called Face-IT and it turns your Android device into a mouth that moves according to what you pronounce.
ASP.NET MVC Version 1 has just been released and we are looking at its benefits over standard ASP.Net Web Forms
- a clearer concept of code division (Model-View-Controller);
- powerful backing for unit tests. Such things as testing classes for generating a page layout has become simpler;
- more global and accurate control of HTML and JavaScript generated;
- coming up with a very user-friendly URL.
By Alexander Nemtsov
What is meant by correct development of programming systems? What is right? Be it a primitive “piece of cake” or an exotic product using modern RUP, XP, UML, or something still more sophisticated, when can we praise the development as correct and what are the criteria?
The leading question in the title is somewhat similar to a widely discussed holy war of Delphi’s superiority over C++ or vice versa. Quite a number of folks will ignore it and try to prove that all this sophistication is nothing but a bubble in comparison to Visual Basic, the best programming language of everything ever written with a skillful pen of a man. You know, it is so simple without any classes or something odd used to work with a strange, almost swear word UML.
Let such advocates stick to their point. It is a highly thankless task to argue a person out of their opinion. It is not our mission as well to explain which tools help create programs. We will focus on how programs are created, that is, highlight the process in question.
Fancy that! John Doe, a creative programmer, appears at work by noon but presses his computer buttons with great enthusiasm till 3 a.m. When John is in a great mood, he can develop a very sophisticated algorithm, a real thing to boast about. Being out of spirits or humor, he just plays Quake or chats with his buddies. In his free time or even hiding from all-seeing eyes of the boss John sometimes tailors small applications, say in Java/C#/Delphi (you can choose any you like and tick it). The applications are supposed to automate routine work in the accounting department where his girlfriend/grandma/friend works (go on ticking the variant you like). Avoiding any novelties and any help of testers or analysts – the latter will want to be paid, won’t they? – John gets a decent fee, which can be spent on beer with friends, and is absolutely happy about his life in spite of the crisis and all that stuff. Do you think such an approach without a line of official documentation or a UML diagram in Rational Rose or Visio,etc. is a correct way of developing programs? I believe it is, and I am going to argue it. Just go on reading. We will be back soon.
Let’s start thinking in terms of the development goal. It might be a bit unclear, but it always exists. In the case of John he did his work meaning to create a necessary product and get a deserved fee. If the fee is paid, the goal has been achieved successfully. The fee can be not only the money but also some useful experience, one’s friends’ praise, self-satisfaction with one’s wide intelligence and what not. However, the end user does not have a slightest interest in the inside of the product or the development itself. Nor are they going to distinguish between Delphi and Java. The program should work fast enough, take up modest resources and be worth the money paid. And the last but not the least – to perform all the desired functions. In such a case John will get his money.
So, John aims at getting an adequate fee enough to, say, visit a pub/restaurant/bowling/Hawaii in return for his efforts. (If you still tick variants, it is high time you went for a cleaning tissue and wiped your screen.) The fee is the indicator of good and correct work. If John does not receive any complaints or face angry customers, they can be thought of to be satisfied. So, John is on the right way.
Let’s now take a small developing company with 10-15 employees who write programs for small businesses trading goods, or furniture, or something else granted that Excel cannot cope with the amount of data to be analyzed. Should our company use object oriented programming, UML, RUP, MSF or anything else equally complicated? There is a trap here. We cannot be sure if a company needs such tools unless we consider the fee for the efforts. Suppose the customers’ needs are met. Then why invest additional money into expensive courses or buying new licensed products?
It is here when we come to the crucial question asked at the beginning – what is meant by correct software development? I guess now you are ready to answer. Correct development is the process helping the customer to get profit. The choice between waterfall or an iterative process as well as the degree of formalism and sticking to traditional processes is important only in terms of your client’s business.
The series of articles to follow will describe making a product for our needs called Sibers Meetings. You will see how the product grew from «we have a problem» phase to a «ready to use solution».
Sibers Meetings dates back to the moment Sibers expanded its power to a new city office. The office showed up with a number of problems the main being everyday communication. Using a traditional telephone soon became ineffective as public address equipment did not serve the purposes of project meetings. We realized a need in some environment for collective discussions on our customers’ projects. It became the basis for the product in question.
(to be continued)
By PHP Developer Alexey Zabaykin
How to list clients’ feedback in a way that shows that you have many clients and they are spread globally?
Thanks to the huge amount of feedbacks, our previous edition of References page turned to look like the Star Wars story-telling.
We decided that Google Maps will do the job. I should note that the site engine, developed by Sibers, was created using Sophit framework. This engine is very flexible and pretty simple for creating administrative solutions and fully separates HTML templates from PHP code. That’s why creation of PHP administrative part doesn’t cause any problems and webmasters enjoy a huge area for professional activities.

The next point was to research the necessary interactions with Google Maps. There is a lot of abilities provided by Google to change types of appearance and various features. So, to escape the mess, I investigated a bit in order to create the optimal solution. Thus, here is a list of crucial moments of creating our References page.
Backend
Simply put, we have to insert locations and link them with needed information. Administrator has two possibilities to manage the locations: automatically, through the function
geocoder.getLatLng()
- looks for the place by name only – and manually with function
GEvent.addListener(map, ‘click’, mapClick)
- sets latitude/longitude by a click on map; coordinates then are transferred into the form by
mapClick function.
Displaying
Ok, the administration form is done. Now, in order to display feedbacks on the map, we pass them to javascript in the cities array and Google Maps start to populate with our thankful customers. For further interactivity, let’s make the bubble images change when mouse hovers it.
GEvent.addListener(marker, “mouseover”, function() {
marker.setImage(pic_hand_up.src);
});
GEvent.addListener(marker, “mouseout”, function() {
marker.setImage(marker.getIcon().image);
});
And one more tweak, image preloading:
var pic_hand_up = new Image()
Now the little green person gladly greets us and does not disappear during first loading. The customer reference can be quite large, therefore its content dynamically loads by clicking on the icon:
_getFullReferences(city_id)
Also, references with phone numbers are displayed immediately below the map. When clicking on the address line, the map centers on this location via method map.setCenter()
Time to check it by yourself: http://www.sibers.com/portfolio/references/
By Sibers Senior C/C++/C# Developer Alexey Vasiliev
You are likely to know that RichTextBox supports word wrap. But not everyone has a clue how to actually manage word wrapping. Not long ago I faced the following problem: word wrap in this control automatically starts with a white-space symbol or a punctuation mark. So if we want to insert 100 symbols to display in three lines with random line breaking, then problems begin as soon as we insert a space or a hyphen in the middle. OK… looks not good :( I couldn’t find any useful information about it, though.
One would think it’s not a big deal and could be fixed, but it’s where the number of problems is just starting to grow: the control RichTextBox appears to have a Boolean feature WordWrap but no ways to change the behavior of this word wrapping. I’ve already exhausted all possible combinations. There is almost no documentation about word-wrapping, word-breaking or hyphenation. Is .NET simply not armed with it?
So, where can we investigate this component? Where does it come from on .NET? Exactly! On MFC they have already had a lot of headache about it. I can’t just forget the thought about having to load a special library for using you-know-which control! Moreover, the .NET component is only a cover for a very familiar thing. Thus, I turned to sources of this component, the file RichTextBox.h and MSDN :) Brief search produced the following results:
1. Message EM_SETHYPHENATEINFO and linked styles WBF_WORDWRAP etc.
2. Message EM_SETWORDBREAKPROC and function EDITWORDBREAKPROC.
The former was excluded immediately because according to MSDN it serves only in Asian Windows. The latter appeared to be more interesting because the parameters transferred to callback-function EDITWORDBREAKPROC included such styles as WBF_BREAKAFTER and WBF_ISWHITE, and the text indicator itself. It raised certain interest :) In other words, we can now create our own function with tailored definitions of where and how to carry the text over in the control. So, I threw together some code:
[DllImport("user32.dll")]
extern static IntPtr SendMessage(IntPtr hwnd, uint message, IntPtr wParam, IntPtr lParam);
const uint EM_SETWORDBREAKPROC = 0x00D0;
delegate int EditWordBreakProc(IntPtr text, int pos_in_text, int bCharSet, int action);
event EditWordBreakProc myCallBackEvent;
int myCallBack(IntPtr text, int pos_in_text, int bCharSet, int action)
{
return 0;
}
public Form1()
{
InitializeComponent();
richTextBox.Multiline = true;
richTextBox.WordWrap = true;
richTextBox.ScrollBars = RichTextBoxScrollBars.None;
myCallBackEvent = new EditWordBreakProc(myCallBack);
IntPtr ptr_func = Marshal.GetFunctionPointerForDelegate(myCallBackEvent);
SendMessage(richTextBox.Handle, EM_SETWORDBREAKPROC, IntPtr.Zero, ptr_func);
}
Thus, let’s see: I’ve created a delegate concurrent with definition EDITWORDBREAKPROC and subscribed its own function to it. Through the marshaling I got the indicator of my function – now it’s possible to make substitution. Then I took a handle of the control and sent it a message EM_SETWORDBREAKPROC for shifting the word wrap function. What is myCallBack function supposed to do? It is to return the position in which the line should be broken relatively to the current one. That is in fact we need to parse the entire text and according to some rule say – “here is the place for the word wrap”. For my task it was enough to return the zero position. So, the text just shifts to the next line without any rules for breaking. Yeah! This is exactly what I need!
As addition:
1. For other cases with the need to adapt lines and place hyphens, it’s recommended to gain the line from the callback function. It could be done with the aid of the following code:
int myCallBack(IntPtr text, int pos_in_text, int bCharSet, int action)
{
string str = Marshal.PtrToStringUni(text);
...
}
2. The control styles change after different window messages like changing focus, enable/disable and so on. Hence, for the above example to function properly the message EM_SETWORDBREAKPROC should be sent after all significant events. I wish I could forget about such little things. There is a way out! We make a new control, inherit from RichTextBox and… I think you’ll guess :)
3. The example on MFC would look much simpler :)
By Sibers CTO Andrey Gavrilov
Whatever they do, scripting languages all have a big flaw, namely interaction with the parent objects system. It so fell out, I am now scripting a Java application on JavaScript. If you don’t know, Mozilla Rhino is perhaps the strongest realization of script languages under Java. Full concordance to the ECMA standards, stability, optimizations etc. All you need.
As you understand, scripting language (also called an extension language) is used not alone by itself but to control some parent application. It means that it accesses Java classes. And that’s where rock-n-roll begins – some classes exist both in JavaScript and in Java. Like String. And these Strings are very very different Strings.
What comes next? Many methods of these classes match each other. For example there exists a method replace in both “Javas”. But again – these are very very different replaces.
And you know what? The script generates no errors – it just uses the Java’s replace because somewhere before it had used the wrong String. That’s it.
It’s all spiced with the fact that some allotted in API classes are accessed only by JavaScript and use classes of Rhino.
A workaround? Explicit definition of types – everywhere! It helps although it does annoy.

By Sibers Flash Team Leader Alexander Nemtsov
Mainframes. Remember the times.
Oldbies remember the times when terminals used to connect to powerful servers and the information was processed by mainframes, a thin client being essentially an input device to display data.
Gradually PCs were becoming smaller and more powerful, and it became possible to process information at work places. Thanks to traditional modern applications.

A huge Soviet supercomputer working at clock rate of 10 MHz – fastest in the 60’s. Now one of our offices is located in a room where such machine used to stay. Image courtesy of Novosibirsk Institute of Theoretical and Applied Mechanics.
Traditional Applications
It is traditional application that we access information through, are entertained by and get new potential for our work. Basically, they are the frameworks of our interaction with the PC. Any problems we might face while working with the computer arise from the way the applications were developed long time ago.
Traditional applications have been serving us faithfully for ages, but they are not absolutely devoid of drawbacks. They are tied to a certain machine and your operating and file system. They need installation, which requires special skills and takes time. Moreover, almost all the results of your work with applications are stored locally on the PC, and collective work with them runs into certain difficulties.
Thus, we have to think over main processes inside the applications. Except doing your work, you have to know something about file types, codecs, drivers and many more things having nothing to do with the task you are solving. Being an expert in your field is not enough any longer, you have to be an expert in computers as well.

Microsoft and Indian software companies are famous for developing software. This picture shows Indian developers at Microsoft. Courtesy of blogs.msdn.com/ie
Web Applications
The Internet changed an average person’s capabilities dramatically. Now we can easily find and use vast digital experience stored in the net. With standards for browsers developing, users can expect any content to be available for use any time and any place.
I realized the possibility of replacing traditional applications by web ones when I saw my friend using Gmail web interface instead of his mail client. He was not an expert in computers and I offered him my help in installing and tuning Thunderbird. My friend thanked me but politely declined the offer as the interface perfectly satisfied all his needs.
Web applications are a nice discovery, but they do not lack some problems, either.
Quite often we use the Internet as a source of information. It can as well be used as an effective tool for entertainment and improvement of our work facilities.
Just like this person in a Soviet poster says “Net” to alcohol, certain Internet users say “no” to desktop software and choose web-based applications.
RIA
Traditional web applications are built up on some well-known standard elements of interface. Hyperlinks, combo-boxes and forms are excellent for creating interactive pages, but unfortunately are not enough for editing images, showing video flow, displaying GPS data or making a phone call. Users are requiring more and more of the interface and make designers and developers provide new ways of interaction with different data and processes.
Rich Internet Applications are notable for providing you with a possibility to do your work in the Internet. The set of tools I need for my work is to be available for me everywhere regardless of the PC type or the OS version. The same refers to my data. All of my working environment is supposed to follow me like a cloud, RIA inherited this idea from traditional web applications and went further.

Unfortunately, we couldn’t find any image of a cloud of rich internet applications following their users wherever they go.
Symbiosis
Multipurpose RIAs are a new generation of applications evolving as a result of web application and traditional desktop application symbiosis.
When the applications and the data related to them are really “on a cloud”, we get radically new capabilities. It becomes much easier to share data or work in collaboration. Such collaboration can proceed either on- or off-line, with the use of audio or video flow and text to supplement the communication.
True RIAs make absolutely unnecessary an abstract concept of a file. Your data is saved and you can search it through. However, you never deal with “raw” files, you work with your “ideas” instead. Such work is much more effective as it focuses on the result and does not require a user to know something about computer processes.
The coral animal lives in symbiosis with small algae and other organisms – just like RIA with desktop applications! Courtesy of coral-reefs.org.
By Sibers CTO Andrey Gavrilov
Some time ago I ran across such or similar articles. In general, their idea is that we don’t need template engines in PHP since PHP is template-driven by itself (obviously, in fact, that’s true not only about PHP because there exist JSP, PSP etc. in other technologies). And of course, in all articles of this sort they throw mud at Smarty, the most popular template engine.
So what I am saying is that authors of these articles have no idea what template engines are for. But I agree that Smarty and 90% of similar engines suck because their authors have no idea, too.
A template engine is needed not for separating content from functionality: a good programmer can easily do this in pure PHP. We need templates in order not to allow designers touch any of server functionality – and no Smarty with its too rich feature set can help us here.
If you find this observation far-fetched, I can assure that such a requirement appears in every large project whose specifications I reviewed. No large well-established e-business company can permit their designers staff to get full access to system’s functionality – something that most template engines still allow! Needless to say about sites that allow users setting up their own themes.
Obviously, you can return: if you wanna set up your design, use CSS. That’s all fair, except for the fact that it raises some inconveniences:
So, an ideal template engine is the one that allows working only with data that was fed into it – and nothing more.
By Sibers CTO Andrey Gavrilov
Last week, Google Web Toolkit got into my hands so I’ve played around with it, read some info about it, checked out the other web frameworks and eventually decided to write a review on them all. Here it goes.
Google Web Toolkit
URL
The Google’s name in the title already guarantees some quality for the product. So I put it first in my review list. But truthfully, GWT functions in a horrible, horrible way: developer writes code in Java, which is then converted into JavaScript by a special compiler application, using a set of widgets. The compiler is closed code, and only its additional components are created in Open Source.
Advantages:
- Made by Google.
- A lot of PR around it.
- The result is executed completely on client and can function with different servers.
Disadvantages:
- Language conversion always means problems with the resulting code.
- Result is always executed on client and all RPC should be realized manually.
Echo2
URL
Echo2 is often compared to GWT. I bet that Google guys are simply paying other analysts to compare GWT with its weakest opponent. It works like this: developer writes Java code executed on server and creates RIA interface in Swing style. Open Source. Chargeable IDE.
Advantages:
- No language conversion.
Disadvantages:
- Large size of resulting files.
- Low quality of control over results.
- Functionality poor tools for client-server communication.
OpenLaszlo
URL
Initially it was used for creating Flash, but at present it is also able to create DHTML. Code executed completely on client, but special server can also be used for this as well as servlet for dynamic compilation and RPC simplification. OpenSource.
Advantages:
- Same code for DHTML and Flash.
- XML description of interface.
- It does not have to use server side.
Disadvantages:
- Language conversion. Although LaszloScript, JavaScript and ActionScript all belong to ECMA subset, so output losses are not so serious.
- Due to its compatibility with Flash, RPC is problematic.
ZK
URL
It works similar to Echo2, only instead of Java you can use XUL based XML interface.
Advantages:
- Speed of XUL development.
- Rich set of components.
- Ability to execute custom JavaScript.
Disadvantages:
- By default processing of all events is done on server.
- Loss in output during XUL execution due to script language is resolved by using richlets or by extracting performance critical functionality to Java.
Conclusion.
In my opinion, the leaders among reviewed frameworks are ZK and Open Laszlo. But I prefer ZK since it is more logic, so to speak. I approve the approach when you can quickly create whatever you need and then freely optimize its performance.
By Sibers CTO Andrey Gavrilov
Recently I’ve decided to make a short review of JavaFX which represents another case of a good idea implemented poorly.
The idea behind JavaFX is very simple – developer creates an interface oriented application using some script. Then this application can be launched from a web browser, desktop, or even from J2ME.
First point: JavaFX Mobile.
JavaFX is presented as an interface oriented language, and the interface is exactly the element which is copied with guarantee during its porting to a mobile phone. Why should be an extra extension for J2ME if mobiles have the issues with capacity even without such extensions?
Second point: Competition.
JavaFX functions on the regular Java machine, i.e. user of Windows XP and its higher versions should download full Java-Runtime in order to launch it. Taking its size into account, this is almost impossible to do. Actually it is better than Mozilla XUL, which works only in Mozilla, but worse than Microsoft Silverlight, which realizes absolutely the same ideas as Java FX but on any .NET platform. All these issues put together make JavaFX less suited for work than Adobe AIR, which is a desktop Flash, and can be launched on the web without any problems.
Third point: Extra layer.
JavaFX uses Swing which is launched on Java only. While everything functions stably, it can be used without any problems, but as soon as any errors or issues arise with Silver – all Hell breaks loose. I’ve encountered similar problems during my experiments with Grails.
It’s a pity that JavaFX has these problems because I can’t wait to see a cool Open-Source Flash Killer since I don’t trust any languages with proprietary kernel.