Posted by admin on October 18th, 2009
I’ve been working almost 5 years now on educational software in two companies (first Indie Group, now Televic-Education). We mainly created CD-ROMS (that were enclosed with schoolbooks) and online solutions. All those applications were not built from scratch, instead we created a framework that could read in all exercises and hierarchy of the exercises. Those exercises were created in a back end were you could assemble them in folders and export them in a format for our framework (xml) or other formats like SCORM.
I haven’t got any videos yet on those CD-ROMS, but you can see two of our online solutions in action. The first is Edumatic, the first application that was created and which has some 20 exercise types (multiple choice, fill in, cross word, dragndrop, translate, …). It can be used online or exported to be used in CD-ROMS. On the site of edumatic, you can try out an online example of a multiple set of exercises (for each exercise type there are a lot of exercises). Our senior product manager (;-) Piet Santy) also shows an example each day created with Edumatic which you can follow on Twitter –> link. Please follow and try out his examples! Some of his past examples are shown here and here and here and here(demo). Edumatic back end is created in ASP.NET, the front end in Flash (AS2). Together with Christophe Herreman we created the framework for it, but a lot of other persons contributed to the framework, back end and exercise types like Kristof Neirynck(current technical lead), Bert Vandamme, Piet Santy, Sofie Deparcq and others.
Our other product, which is newer than Edumatic, is called Edumatic Exam. It is now used by three customers and has a lot of potential. It’s more an assessment application than an exercise application and has currently some 15 exercise types. We are striving to support all exercise types from Edumatic, but that’ll take some more time (we’re nearly there). Client side is created in Flex, back end with .NET. This application is used by our government to test the knowledge of applicants. Daily there are multiple sessions with hundreds of candidates. We haven’t got a demo online yet, but if you subscribe yourself at Selor, you can practice some of the language assessments with our application (you need to go to Mijn Selor, subscribe and then choose Taaloefenpakket… all in Dutch or French…) Try it out! The product is also online, but currently you can not register for it. That’ll be something for the future. Currently working most on Edumatic Exam are Bert Vandamme, Sem Dendoncker, Wouter Vanden Berghe and me.
Cheers and practice!
<
Posted by admin on April 14th, 2009
Recently I saw a screencast from Deepa Subramaniam at Max2008 on how to create new components in Flex 3 (link). I would urge everybody to watch this video if you're not familiar with this topic.
Something I noticed in this video was the use of Bindable metadata tag with event name specified. If you make a setter Bindable, then it's kinda of a performance loss to trigger the binding if the new value that's being set is the same as the old value. Here's a way to improve this:
Actionscript:
-
[Bindable(event="xChanged")]
-
public function get x():Number{ return _x; }
-
public function set x(value:Number):void{
-
if(_x != value){
-
...
-
dispatchEvent(new Event("xChanged"));
-
}
-
}
<
Posted by admin on April 14th, 2009
Last week I searched a little on a problem with bindings in Flex. Seemed like I couldn't add a binding to an Array. After a question on Stack someone gave me the answer. Apparently it is well documented in the Flex 3 help (link)
Quote:
When defining a data binding expression that uses an array as the source of a data binding expression, the array should be of type ArrayCollection because the ArrayCollection class dispatches an event when the array or the array elements change to trigger data binding. For example, a call to ArrayCollection.addItem(), ArrayCollection.addItemAt(), ArrayCollection.removeItem(), and ArrayCollection.removeItemAt() all trigger data binding.
<
Posted by admin on April 11th, 2009
Yesterday I tried to implement Undo functionality with Command Patterns. The Memento pattern can also be used to do this. So what is the difference between the two?
Well, with Memento pattern the state of an object (the originator) is being stored by a Caretaker class. So if it's possible to Undo with returning back to a previous state, use Memento pattern. Sometimes however, the originator is too complex to save each time its state (it could be a composite for instance). In that case the undo facility can use commands. Whenever an action is received a compensating action is set up and stored in the undo facility.
Example in Flex of Memento Pattern. I haven't added too much comments because the code and example should speak for itself.
thx, Lieven Cardoen
Related: Command Pattern Undo Functionality
<
Posted by admin on April 10th, 2009
Yesterday someone asked me how to implement Undo functionality. I knew there was a pattern commonly used for this, but couldn't remember it. In my common sense I would keep track of previous states of properties (or actions). After some search I found that Command pattern is a good choice to implement the Undo functionality.
With some online examples I implemented an undo functionality pattern in Flex. Doing such an exercise makes me understand the theory behind it better.
Here's the first example. Right click on the swf to view the source.
Next is implementing redo functionality in it. In a third step I'll try to make some things more generic so I can use it easily in our product.
What would also be interesting is to make the example work in a way that only whole words are undone instead of single characters. I'll also look into that later on.
thx, Lieven Cardoen
Related: Memento Pattern
<
Posted by admin on March 6th, 2009
Had a problem starting the WebORB RTMPServer (in global.asax) today which was solved after adding the port as an exception in the Windows FireWall.
Log from WebORB:
[Thread-11] WEBORB INFO:6/03/2009 11:26:37:shutting down WebORB Message Server
[Thread-11] WEBORB EXCEPTION:6/03/2009 11:26:37:System.Net.Sockets.SocketException: A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied
at System.Net.Sockets.Socket.Shutdown(SocketShutdown how)
at Weborb.Messaging.RTMPServer.shutdown()
[Thread-15] WEBORB EXCEPTION:6/03/2009 11:26:37:System.Net.Sockets.SocketException: A blocking operation was interrupted by a call to WSACancelBlockingCall
at System.Net.Sockets.Socket.Accept()
at Weborb.Messaging.RTMPServer.run()
[Thread-11] WEBORB EXCEPTION:6/03/2009 11:26:37:System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Sockets.Socket'.
at System.Net.Sockets.Socket.Disconnect(Boolean reuseSocket)
at Weborb.Messaging.RTMPServer.shutdown()
Adding an exception in windows firewall is done in the "Windows FireWall Settings". Choose tab Exceptions and Add port... There you enter the port that you use for the RTMPServer (default 2037), give a name and choose TCP.
thx, Lieven Cardoen
<
Posted by admin on February 21st, 2009
Two weeks ago I had a lot of problems in a project of mine. Often some clients couldn't connect to weborb.aspx (actually 0.01% of the times). After a lot of searching we weren't really able to find the problem. It seemed to me that maybe it was a network issue. The customer had just changed a lot of servers and improved their network. What previously worked didn't seem to work anymore now.
We changed some things after which everything started to work smoothly again:
- When an error is thrown from the server or there's a network problem we invoke the server call again with Credentials. We use authentication, so if at a certain moment in time IIS decides to recycle, the next calls to the server will fail. So we implemented a fallback system. If a fault occurs we authenticate again and try the call a second time. If the second time would also fail, then we give the user an Alert with some information what to do.
- When profiling SQLServer2008 we saw that there were millions of logs being written to the database by WebORB. We had configured WebORB logging with Log4Net and set the Filter in Log4Net on INFO. Basically everything that was logged was written to the database. This meant a lot of overhead. After having put the Filter on Warning connections to database reduced by a factor 100.
Configuring WebORB Logging with Log4Net (in global.asax):
C#:
-
void Application_Start(object sender, EventArgs e)
-
{
-
log4net.Config.XmlConfigurator.Configure();
-
log4net.ILog log = log4net.LogManager.GetLogger("Global.asax");
-
log.Info("Application_Start(" + sender.ToString() + ", " + e.ToString() + ")");
-
-
//Configuring WebORB Logging with Log4Net
-
try
-
{
-
Weborb.
Util.
Logging.
Log.
addLogger("log4NetLogger",
new Edu3.
Util.
Logger());
-
Weborb.Util.Logging.Log.removeLogger("default");
-
}
-
catch (Exception exception)
-
{
-
log.Error("Application_Start", exception);
-
}
-
}
- We profiled IIS7 with some tools that were proposed on StackOverflow. These tools were very interesting, but still I thought to get much more information. Strange that there's not a professional profiling tool for IIS7. We used Administration Pack for IIS 7.0, the stackoverflow question is at link. The strange thing was that in 0.01% of the requests a 404 was returned. Even after having enabled Failed Request Tracing in IIS7, I couldn't find the reason for the 404.
- Recycling happens automatically @ 23 hours. (this was allready done earlier when I had problems in November).
After these tweaks everything is working fine again. Those 404's remain a mystery...
Ciao, Lieven Cardoen
<
Posted by admin on January 10th, 2009
Yesterday I was looking for a way to show multiple statistics next to each other. I had a component in mind that could contain Panels. The Panels would have to be divided over the available space. If there was one Panel, it would get all the space, with two Panels the space would be divided in two, ... Also you need to maximize, restore and minmize the Panels.
Thx to Tom Van den Eynde from VDE Projects I found a very nice example of such a component.
Here is the link: http://www.adobe.com/devnet/flex/samples/dashboard/dashboard.html. The Panels are also draggable.
I haven't begun to use it but I'm sure this will be a great example to start from.
Thx, Lieven Cardoen
<
Posted by admin on December 25th, 2008
Try hitting Ctrl-Shift-L and you'll see all the shortcuts available!
<
Recent Comments