December 3, 2009
Along with the Custom Components in Flex 4 presentation I shared yesterday, I also gave a 15 minute lightening talk at Adobe DevSummit on Keyboard Productivity in Flash Builder, this was just a quick show and tell where I walked people through various ways of what Jeff Atwood calls Going Commando … read more
December 1, 2009
I gave a presentation on Custom Components in Flex 4 at Adobe Devsummit last week in Chennai and today in Hyderabad, here’s the slidedeck where we create an Imperial StormTrooper component
November 28, 2009
I’ve been learning Erlang for the past few weeks and loving the simplicity and beauty of the language. As part of a discussion at SAP TechEd, last week, I ended up creating a simple, rather rudimentary prototype of a realtime messaging server that enables collaborative user interfaces where multiple users can simultaneously work with the same interface …
Here’s a video of the code in action …
As you watch the above video, note as I drag a rectangle in any one Flash application, its sends AMF encoded binary messages to the server and the server multicasts these messages to other connected clients and those clients update in almost realtime. While in the example above all the application instances are running on the same system, they could just as easily be running on different systems and still communicate via the server.
Here the code for the Erlang server …
0001 -module(server).
0002 -export([start/1,stop/0]).
0003
0004 -define(TCP_OPTIONS,[binary,
0005 {packet, 0},
0006 {active, false},
0007 {reuseaddr, true}]).
0008
0009 start(Port) ->
0010 Pid = spawn(fun() -> manage([]) end),
0011 register(client_manager, Pid),
0012 {ok, Socket} = gen_tcp:listen(Port, ?TCP_OPTIONS),
0013 accept(Socket).
0014
0015 stop() -> todo.
0016
0017 accept(Socket) ->
0018 {ok, NewSocket} = gen_tcp:accept(Socket),
0019 spawn(fun() -> recieve(NewSocket) end),
0020 client_manager ! {connected, NewSocket},
0021 accept(Socket).
0022
0023 recieve(Socket) ->
0024 case gen_tcp:recv(Socket, 0) of
0025 {ok, Data} ->
0026 client_manager ! {multicast,Socket,Data},
0027 recieve(Socket);
0028 {error, closed} ->
0029 client_manager ! {disconnect, Socket}
0030 end.
0031
0032 manage(Sockets) ->
0033 receive
0034 {connected, Socket} ->
0035 NewSockets = [Socket | Sockets];
0036 {disconnected, Socket} ->
0037 NewSockets = lists:delete(Socket, Sockets);
0038 {multicast,Socket, Data} ->
0039 multicast(Socket, Sockets, Data),
0040 NewSockets = Sockets
0041 end,
0042 manage(NewSockets).
0043
0044 multicast(FromSocket, ToSockets, Data) ->
0045 SendData = fun(Socket) -> gen_tcp:send(Socket, Data) end,
0046 Sockets = [ S || S <- ToSockets, S /= FromSocket],
0047 lists:foreach(SendData, Sockets).
September 8, 2009
James Governor of RedMonk yesterday kicked off an interesting discussion about the state of Enterprise User Interfaces, more specifically Enterprise Portals and points out …
“… That’s right- less painful for users. Products like IBM WebSphere Portal and SAP Netweaver Portal were supposed to bring much improved user interaction models to enterprise IT, but unfortunately traditional systems-focused IT departments, rather than user interaction specialists and their web brethren, did the work …”
James eludes to the crux of the problem in the above quote and Thomas Otter highlights it further in a comment saying …
I sense that most of the problems/challenges with enterprise UI are not just a tool challenge. It is a design thinking problem. Until design thinking permeates enterprise application development, UI will be a sore point.
Thomas is right, it is a design thinking problem, more precisely, the problem is that there are no design thinkers in most teams that build or customize enterprise software…. read more