<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-11075327</id><updated>2011-08-21T21:04:01.766-07:00</updated><category term='ruby'/><category term='subversion'/><title type='text'>sipXconfig</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>55</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-11075327.post-4585461240149346444</id><published>2007-12-06T12:56:00.001-08:00</published><updated>2007-12-06T13:00:05.254-08:00</updated><title type='text'>Things people are eager to tell you...</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span style="color:#16569e;"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;Damian:&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt; &lt;span style="color:#000000;"&gt;&lt;span back="#ffffff"&gt;I noticed that if one writes on the list "I am going to do this and this"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#16569e;"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;Damian&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#16569e;"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;:&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt; &lt;span style="color:#000000;"&gt;&lt;span back="#ffffff"&gt;it's better than "what should I do?"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#a82f2f;"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;Kevin:&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt; ok&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#a82f2f;"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;Kevin:&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt; people are always eager to tell someone they are a moron, but not as eager to answer questions :)&lt;/span&gt;&lt;span style="color:#16569e;"&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;p class="poweredbyperformancing"&gt;&lt;span style="color:#16569e;"&gt;Powered by &lt;a href="http://scribefire.com/"&gt;ScribeFire&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-4585461240149346444?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/4585461240149346444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=4585461240149346444' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/4585461240149346444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/4585461240149346444'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2007/12/things-people-are-eager-to-tell-you.html' title='Things people are eager to tell you...'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-5825018277000221051</id><published>2007-11-07T07:51:00.000-08:00</published><updated>2007-11-09T06:43:52.249-08:00</updated><title type='text'>Sketches of Frank Ghery</title><content type='html'>Coding is &lt;b&gt;not&lt;/b&gt; like building houses. The two are often compared. However, this comparison usually results in all kinds of design recommendation that effectively prohibit producing any usable software.&lt;br&gt;&lt;br&gt;If you want to see that metaphor reversed make sure to watch &lt;a title="Sketches of Frank Ghery" href="http://www.amazon.com/Sketches-Frank-Gehry-Sydney-Pollack/dp/B000GFRI6I/ref=pd_bbs_sr_1/102-4084564-6662567?ie=UTF8&amp;amp;s=dvd&amp;amp;qid=1194448040&amp;amp;sr=8-1" id="xeo4"&gt;Sketches of Frank Ghery&lt;/a&gt; movie. It shows the architect who design buildings the way that software should be written. There are of course beautiful buildings to watch: &lt;a title="Disney Concert hall" href="http://www.you-are-here.com/theatre/walt_disney.html" id="p:9:"&gt;Disney Concert hall&lt;/a&gt;, Bilbao Guggenheim.&lt;br&gt;&lt;br&gt;It's a movie about architecture, but more than that it's a movie about design process: iterative modeling, refactoring, debugging - it is all there. Gehry is definitely into refactoring. And into small iterations. It's fun to watch when Gehry and his team apply programming terminology to the models they create. Sidney Pollack could not possibly make a movie about a coders, but only because bunch of geeks arguing on the list or looking into Eclipse IDE is not as photogenic. But in our day to day job I find myself arguing about the same things as people in this movie.&lt;br&gt;&lt;br&gt;There is a question of recognizing good and bad design: knowing that you got it right, Admitting that you got it wrong. I do not care what people say but we all go by some sense of internal beauty here. You say that code is elegant or (more often) messy. You say that something feels right. That's exactly how people in the movie talk about their experience.&lt;br&gt;&lt;br&gt;In some way we - coders - have it easy: we work in a medium that translates directly into the resulting product. Software compilation is handled by computers; your design is expressed in code. You work in a strictly defined - and some say limited - vocabulary, but if you follow syntax rules you do not have to worry that someone misinterprets your vision. Not so much for architects, if they do not find a proper way to express themselves through drawings, models and design documents the resulting building might not be what they imagined. They show one of such buildings in the movie: it still looks great to me (but I did not "code" it).&lt;br&gt;&lt;br&gt;Architectures - like programmers - are hired help. The interesting thing is that in both cases frequent interactions with customers actually result in a better end product. It's not a one way street, but a learning process were vision shapes the expectations and expectations shape the vision. There is even a similar feeling of an establishment pressure. It's not easy to propose and build something different. Gehry's buildings are like Linux in Windows world. (And yes I have to say it: some of those buildings do not have windows - at least not in a traditional sense)&lt;br&gt;&lt;br&gt;Similarly to coding, in architecture one can do very little alone. You have to have a team of people. Organizing such team, making sure that people are motivated and happy to work on the same project is an art in itself. And in architecture - as in coding - you need to have proper tools. It's kind of sad that probably architects are better than us at using computers to develop their ideas. The stuff that they do with computers is amazing.  We live in the world of primitive editors, outdated version control system and sink under the code that has not been automatically tested.&lt;br&gt;&lt;br&gt;If you code for living this is a film for you. Even if you do not care for this obvious 'architecture is like coding analogy', even if you will not like the amazing buildings that it shows, you will appreciate the live demo of what computers can be used for. And you will feel proud that you are in this business.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-5825018277000221051?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/5825018277000221051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=5825018277000221051' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/5825018277000221051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/5825018277000221051'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2007/11/coding-is-not-like-building-houses.html' title='Sketches of Frank Ghery'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-759517168630251885</id><published>2007-08-18T05:52:00.001-07:00</published><updated>2007-08-18T05:52:09.057-07:00</updated><title type='text'>The last laptop I'll ever have?</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Recently I was changing laptops with a head spinning frequency. My old trusted Dell Latitude D600 decided to finally quit on me: with a whimper not with a bang. The relationship lasted 3 years so I was not really surprised.  It took me about 30 seconds to put my disk in a similar laptop, which unfortunately decided to quit as well. Than I found a HP Pavilion that weights about as much as baby elephant and makes sound similar to that of the starting jet engine. Applying adjective 'portable' to this beast is probably a text book example of unintended irony.  Finally I got a new HP Compaq nc8430. This wild ride made me realize couple of things.&lt;br /&gt;&lt;br /&gt;I take it for granted now that I can take my hard drive, pop it into completely different machine and my Fedora will wake up, dutifully discover everything and will start working. I might get suboptimal video or my wireless might be missing, but everything else will just be there. And whenever I cannot take the hard drive (apparently the standard changed when I blinked) I can take my trusted home directory.&lt;br /&gt;&lt;br /&gt;It sounds normal but when I mentioned it to my Windows based colleagues they were certain that grieving the loss of my Dell confounded my sense of reality. Everybody apparently knows that switching laptops can take weeks if not months of painful reinstalling, countless migrations application and hours on the phone with your friendly customer support transferring your software licenses. Why exactly people put up with it is beyond me.&lt;br /&gt;&lt;br /&gt;I am proud user of nv8430 these days. Switching to HP is a company mandate. I cannot really full-heartedly recommended it for daily hacking. Screen is gorgeous, but ATI video card does not really run well unless you install proprietary driver. No Beryl fun to be had, so I cannot show off to my Windows friends. The fan never switches off and runs quiet only if I set ARI card in a power saving mode. And apparently 'business class' is marketingese for 'ugly'. But with its dual core it's noticebaly faster than Pentium M Dell. Cuts sipXconfig the compilation time to about 70%, and I can run infamous sipXconfig's 'ant precommit' target (which cleans, compiles and run all kinds of tests, including database and UI tests) in about 5 minutes (used to be more than 10 recently). The battery life is decent too: measured in hours not in minutes.  &lt;br /&gt;I am yet to figure out how to put it to sleep or hibernate. Out of the box Gnome's sleep option makes X to go away and text console spitting some garbage (I am blaming the proprietary video, but I have noo proof yet).&lt;br /&gt;&lt;br /&gt;I certainly hope my hard drive changing behavior would soon become a norm. I will stop carrying laptops altogether. I will just carry my a flash disk with favorite Linux installation. There will be a powerful, generic diskless station in the office where I plug in my hard drive and after 10 second boot procedure I will have my familiar environment. And even that will be a short-lived fad because the internet will make it possible to store OS image on-line.&lt;br /&gt;So this might be the last laptop I'll ever have. I should be nicer to it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-759517168630251885?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/759517168630251885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=759517168630251885' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/759517168630251885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/759517168630251885'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2007/08/last-laptop-i-ever-have.html' title='The last laptop I&amp;#39;ll ever have?'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-4785538967966322804</id><published>2007-07-20T13:13:00.001-07:00</published><updated>2007-07-20T13:13:29.865-07:00</updated><title type='text'>Hold the Secret Sauce please</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Brian Rigss wrote a small piece on &lt;a href='http://voiploop.com/index.php?option=com_content&amp;amp;task=view&amp;amp;id=2030&amp;amp;Itemid=34'&gt;Nortel and SIPFoundry&lt;/a&gt;.  It's an interesting news for all VoIP fans and it's a very good news for SIPFoundry community.&lt;br /&gt;&lt;br /&gt;I was slightly surprised that open source hackers now apparently roam in &lt;cite&gt;loose-knit bands&lt;/cite&gt;. It is a quaint image evoking sorely missing sense of adventure. As charming images go, this one has little to do with reality and is easily dispelled by subscribing to any devel list - including sipX one - and counting the references to &lt;em&gt;my boss&lt;/em&gt; and &lt;em&gt;my company&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;I cannot resist having some fun with his &lt;em&gt;secret sauce&lt;/em&gt; metaphor. To quote Brian:&lt;br /&gt;&lt;cite&gt;&lt;br /&gt;[...] VoIP software has been sacrosanct. It’s the secret sauce. It’s the way IP PBX developers ensure that their customers have access to the most advanced sets of call features. It’s how they add value to their product, differentiate from competitors, generate the majority of their revenue, and transform themselves from providers of monolithic PBX cabinetry and into communications software developers of the future.&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;I happen to think that Secret Sauce turned out to be not what people hoped it to be. Actually, I think that it's not a sauce at all but a &lt;a href='http://en.wikipedia.org/wiki/Trans_fat'&gt;trans fat&lt;/a&gt;., which - at least according to wikipedia - is &lt;cite&gt;neither required nor beneficial for health&lt;/cite&gt;.&lt;br /&gt;&lt;br /&gt;If I were running a corporation, I would be suspicious of my communication system being dependent on a secret sauce. What happens if I get hooked and secret sauce provider goes out of business, what if their secret sauce does not mix well with the secret sauce of the other guy. Do I really want to take this risk?&lt;br /&gt;&lt;br /&gt;I prefer my secret sauce provider to start making money on something that I actually want to pay for: developing more features, faster and better than their competition. Without hiding behind a secret recipe.&lt;br /&gt;&lt;br /&gt;In several US states overactive legislatures &lt;a href='http://www.bantransfats.com/'&gt;banned trans-fats&lt;/a&gt;. I wonder if the Secret Sauce is next on the agenda. &lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-4785538967966322804?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/4785538967966322804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=4785538967966322804' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/4785538967966322804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/4785538967966322804'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2007/07/hold-secret-sauce-please.html' title='Hold the Secret Sauce please'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-8549946733202146090</id><published>2007-05-27T06:58:00.001-07:00</published><updated>2007-05-27T06:58:43.534-07:00</updated><title type='text'>subversion: overdue good-bye?</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I discovered subversion before it got to 1.0. I convinced people working with me then to switch. At that time we were using ClearCase. Simplicity and speed of subversion was in comparison exhilarating. I even wrote couple of simple ruby scripts to bridge &lt;em&gt;official&lt;/em&gt; ClearCase and our &lt;em&gt;subversive&lt;/em&gt; repository. Even the name was perfect. Let's just say that even my undeniable sense of humor and personal charm failed to mend strained relations with Release Engineering group (yeah - it was a big company).&lt;br /&gt;&lt;br /&gt;When I started working in Pingtel sipx developers already had been using subversion. Since it was about the time we needed to create our first real branch I took upon myself figuring out how to use svnmerge. We never looked back. &lt;br /&gt;&lt;br /&gt;If that was not enough &lt;a href='http://producingoss.com/'&gt;Producing Open Source Software&lt;/a&gt; that Douglas made me read at one point practically defined the way I think about my job. And it's written by Karl Fogel - yes - the subversion Karl Fogel.&lt;br /&gt;&lt;br /&gt;I am writing all that to prove that I really like subversion. So it saddens me to realize that my favorite tool is most probably no longer the best tool.&lt;br /&gt;&lt;br /&gt;As a part of my daily job I am committing patches sent by contributors. From time to time I create branches for people who want to experiment with sipx without breaking mainline. And slowly I begin to think that my job would be easier with a different tool. And that with a different tool sipXconfig and sipx would get more contributions and better contributions.&lt;br /&gt;&lt;br /&gt;With subversion - or any other centralized SCM - there are always two categories of people: those with commit access and everybody else. Committers and patch senders. In-crowd and followers. &lt;a href='http://en.wikipedia.org/wiki/Eloi'&gt;Eloi &lt;/a&gt; and &lt;a href='http://en.wikipedia.org/wiki/Morlock'&gt;Morlocks&lt;/a&gt;.&lt;br /&gt;As a &lt;em&gt;patch sender&lt;/em&gt; you have to create your working copy, make your changes, send the patch - and - never use this working copy again. At least not until someone with commit access actually commits your patch. If the patch gets not accepted in its original form and you want to fix it, you are losing the history. You cannot somehow save your changes locally and than make changes on top of your changes. At least if you only have one patch you can keep updating the working copy and track the mainline. If you have more than a single patch however you are doomed. Subversion does not make life easy for you. I wonder how many useful contribution sipx is losing just because it's too hard to contribute anything more than a simple patch.&lt;br /&gt;&lt;br /&gt;But even once you get commit access the problems do not stop. Before you get commit rights your every step is watched, every patch reviewed, every extra space corrected. Once you do not have to send patches for approval anymore it changes. It's not about becoming sloppy. It's about the lack of feedback. Even if someone does review your commits, and people do, once you check something in, it's &lt;strong&gt;in&lt;/strong&gt;. Official. With good chances to survive forever without being looked at. One of the biggest benefits of open source, constant peer code review, is not the default option.&lt;br /&gt;&lt;br /&gt;I started thinking about it after reviewing several patches last week. I took some. I rejected some. I sent comments or my own fixes on top of those patches for review. I knew what I was doing with subversion all the time but somehow it felt like I am working around my SCM rather than using it.&lt;br /&gt;&lt;br /&gt;I thought of darcs which I discovered when trying out buildbot (sipx nightlies are courtesy of buildbot). That lead me to git, mercurial and others. It quickly became obvious I was not alone. Mozilla &lt;a href='http://weblogs.mozillazine.org/preed/2007/04/version_control_system_shootou_1.html'&gt;chose Mercurial over Bazaar &lt;/a&gt;(both distributed). They did not even shortlist subversion. Linus with his usual flair refers to subversion as &lt;a href='http://www.youtube.com/watch?v=4XpnKHJAok8'&gt;the most pointless project ever started&lt;/a&gt;. He has a point. Open source project should &lt;strong&gt;never&lt;/strong&gt; use anything but distributed SCM.&lt;br /&gt;&lt;br /&gt;Source Control Management history follows the script leading to more freedom to modify and experiment: "lock-modify-commit" gets replaced by "copy-modify-merge-commit" (no locking) which in turn morphs into "pull-modify-commit-push" (no central repository). &lt;br /&gt;&lt;br /&gt;If only I could figure out how this tailor thing works, I would set up mercurial mirror of sipx and encourage contributors to use it.  Exciting.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-8549946733202146090?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/8549946733202146090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=8549946733202146090' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/8549946733202146090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/8549946733202146090'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2007/05/subversion-overdue-good-bye.html' title='subversion: overdue good-bye?'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-9083236171075432831</id><published>2007-05-21T06:48:00.001-07:00</published><updated>2007-05-22T04:48:54.617-07:00</updated><title type='text'>Sometimes it's just better to let go</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Contrary to what many people think open source applications are not created by a bunch of crazy, willing to work for free volunteers. At least not only by them. Read &lt;a href='http://www.thinkgeek.com/books/nonfiction/38b2/%20'&gt;Linus's biography&lt;/a&gt; to find out more. Often open source contributors are  engineers employed by big and small corporations.&lt;br&gt;&lt;/br&gt;There are many reasons why a for-profit corporation might consider sponsoring or developing open source projects. Ensuring support for a project that is outside of  company's core strategic interest and assuring the customers that they are not vendor-locked are the most commonly cited ones. Another reason - probably not so often discussed  - is cooperation with your business partners.&lt;br&gt;&lt;/br&gt;Software companies often engage in shared deals, shared developement, strategic partnerships. It's a not-so-well kept secret that deals like that often fail, generating little more than several widely discussed press releases. It's usually the clash between corporate cultures and internal politics that prevent even reasonable deal to go forward.&lt;br&gt;&lt;/br&gt;The situation changes when companies cooperate within the realms of on an open source project. Especially, if it is a well established project with wide community of users and developers. First of all the rules of cooperation are commonly understood, established and transparent. The roles of sponsors, contributors, reviewers, project coordinators are well defined. It's really no that different from having a standard API interface - only these times it gets applied to people and processes not to software components.&lt;br&gt;&lt;/br&gt;Simple things that can take ages to establish like 'how I can get your source code' and 'what format is your documentation' are already resolved.&lt;br&gt;&lt;/br&gt;The biggest improvement though is in the area of day to day communication. Engineers and product managers are forced to discuss their ideas openly to get them implemented. The usual management structures that in closed source world lead to exchanges like 'tell your boss to talk to my boss before talking to me' expose their absurdity under the open source light.&lt;br&gt;&lt;/br&gt;No side of the deal is afraid that the other side is going to steal IP. Reciprocate licenses eliminate the false temptation of competive advantage that can be allegedly achieved by stonewalling.&lt;br&gt;&lt;/br&gt;This is what big bosses like best: you reduce your risk by outsourcing your communication and product management to someone who just does it better than yourself. In this case it's an open source community.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-9083236171075432831?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/9083236171075432831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=9083236171075432831' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/9083236171075432831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/9083236171075432831'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2007/05/sometimes-it-just-better-to-let-go.html' title='Sometimes it&amp;#39;s just better to let go'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-2225627578343895120</id><published>2007-05-07T07:49:00.001-07:00</published><updated>2007-05-07T07:49:39.922-07:00</updated><title type='text'>AudioCodes gateways support is here</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I am kind of relieved that AudioCodes gateways support achieved the stage when it's actually useful. To tell the truth I had my doubts it would ever happen. Also the more I work on those blue boxes the less I understand how one can configure them without sipXconfig. There is so many settings that have to be set in a very specific way for the entire setup to work. Simplicity clearly was not a goal here.&lt;br /&gt;&lt;br /&gt;The good news is now you do not have to do that anymore.  There is some bootp/DHCP magic that I am going display on wiki, but once you configure that it becomes a plug-and-play affair. So call you proverbial mothers to setup your VOIP networks. See wiki for more info.&lt;br /&gt;&lt;br /&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-2225627578343895120?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/2225627578343895120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=2225627578343895120' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/2225627578343895120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/2225627578343895120'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2007/05/audiocodes-gateways-support-is-here.html' title='AudioCodes gateways support is here'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-123746094477553401</id><published>2007-04-05T11:26:00.000-07:00</published><updated>2007-04-05T11:33:44.156-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><title type='text'>RINCOR</title><content type='html'>...which of course stands for "Ruby is not C or Java"&lt;br /&gt;&lt;br /&gt;In the midst of programming sipXconfig I need to fix call resolver bug. I need to count 'setup' and 'end' for each call leg.&lt;br /&gt;&lt;br /&gt;I write my test. I add 4 lines of code. I end up with something like this:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;    @refcount--&lt;br /&gt;    if @end_time.nil? || @end_time &lt; cse.event_time&lt;br /&gt;      @end_time = cse.event_time&lt;br /&gt;    end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I run my test and Ruby complains:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Exception: undefined method `-@' for Thu May 17 19:30:00 UTC 1990:Time&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;To which I eloquently say: what???&lt;br /&gt;&lt;br /&gt;Couple of moments later with Douglas looking over my shoulder:&lt;br /&gt;&lt;br /&gt;Douglas: is @end_time even defined&lt;br /&gt;Me: scrolling to the definition&lt;br /&gt;Douglas: &lt;em&gt;silence&lt;/em&gt;&lt;br /&gt;Me: &lt;em&gt;silence back&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Desperate problems call for unusual measures. Let's print @end_time&lt;br /&gt;&lt;code&gt;&lt;br /&gt;   @refcount--&lt;br /&gt;   p @end_time&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Ruby move follows. And Ruby says: &lt;em&gt;syntaxt error&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Can you see it now?&lt;br /&gt;It took us about 30 seconds since &lt;em&gt;syntax error&lt;/em&gt;. Turns out &lt;code&gt;@refcount--&lt;/code&gt; is &lt;strong&gt;not&lt;/strong&gt; how you decrement in Ruby; &lt;code&gt;@refcount -= 1&lt;/code&gt; is. Which we always knew. Well: kind of...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-123746094477553401?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/123746094477553401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=123746094477553401' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/123746094477553401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/123746094477553401'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2007/04/rincor.html' title='RINCOR'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-2423580481211999971</id><published>2007-03-15T11:33:00.000-07:00</published><updated>2007-04-05T11:33:18.356-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><title type='text'>subversion 'since' trick or how to deal with short-term memory loss</title><content type='html'>I guess I always kind of knew that &lt;code&gt;svn log&lt;/code&gt; and some other subversion commands accept the date ranges instead of revision numbers. But the format is so quirky I suspect many people never use it.&lt;br /&gt;&lt;br /&gt;If you lucky enough to use newer client you can take a wild guess and say:&lt;br /&gt;&lt;kbd&gt;&lt;br /&gt;svn log --limit 10&lt;br /&gt;&lt;/kbd&gt;&lt;br /&gt;You'll get at most 10 changes this way. But if you want to find out what exactly changed since since March 1, 2007 you can say:&lt;br /&gt;&lt;kbd&gt;&lt;br /&gt;svn log -r {2007-03-01}:HEAD&lt;br /&gt;&lt;/kbd&gt;&lt;br /&gt;I usually want to check the changes since yesterday (you know short term memory loss attacks and I need to find out what I am doing). So I ran Google search and guess what! There is a way to convince bash to display yesterday's date.&lt;br /&gt;&lt;kbd&gt;&lt;br /&gt;date  -d "1 day ago"&lt;br /&gt;&lt;/kbd&gt;&lt;br /&gt;Of course this is not what subversion likes. But we can always specify format.&lt;br /&gt;&lt;kbd&gt;&lt;br /&gt;date  -d "1 day ago" +%Y-%m-%d&lt;br /&gt;&lt;/kbd&gt;&lt;br /&gt;There is no way I am going to type it every time but bash and its aliases comes handy:&lt;br /&gt;&lt;kbd&gt;&lt;br /&gt;alias svn.since="svn log -r {\`date -d '1 day ago' +%Y-%m-%d\`}:HEAD"&lt;br /&gt;&lt;/kbd&gt;&lt;br /&gt;This is one cryptic alias, at least to my untrained eye. What's more it's stuck on displaying yesterday's changes which does not help much good on Mondays.&lt;br /&gt;&lt;br /&gt;Aliases in bash apparently do not like parameters, but there is another handy feature: functions. Using it is as easy as adding the following to my .bahsrc:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;svn.since() {&lt;br /&gt;       since=`date -d "$1 days ago" +%Y-%m-%d`&lt;br /&gt;       svn log -r {$since}:HEAD&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;And now I can type:&lt;br /&gt;&lt;br /&gt;svn.since 3&lt;br /&gt;&lt;br /&gt;to remind myself what was going on in my favorite project over the weekend.&lt;br /&gt;I'll better code and check in something now...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-2423580481211999971?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/2423580481211999971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=2423580481211999971' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/2423580481211999971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/2423580481211999971'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2007/03/subversion-since-trick-or-how-to-deal.html' title='subversion &apos;since&apos; trick or how to deal with short-term memory loss'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-3267032973626980474</id><published>2007-02-28T10:51:00.000-08:00</published><updated>2007-02-28T11:06:51.294-08:00</updated><title type='text'>Why open source is so hard to use.</title><content type='html'>1.) Open source projects tend to be agile; do what's needed.&lt;br /&gt;2.) If your project generates revenue, you do what makes you money.&lt;br /&gt;3.) Once customers know how it works, why would they pay to make it easier (unless they are in a position to have to train others.)&lt;br /&gt;&lt;br /&gt;Each month we plan a scrum sprint, each month I tell myself to tell the product owner to select  usability related items from the backlog, and each time I talk myself out of it because __this month__ there is revenue directly tied to these new features.&lt;br /&gt;&lt;br /&gt;How does one go about addressing usability in an open source, scrum model? Should some percentage of sprint points be dedicated to usability concerns each month?  We did this once and it seemed to work, but it was very hard for product owner to swallow and would be very hard for him to swallow every knowing he'd have to do it every month.&lt;br /&gt;&lt;br /&gt;It does force a developer to be fairly creative about how to increase usability on a tight budget, which can be fun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-3267032973626980474?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/3267032973626980474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=3267032973626980474' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/3267032973626980474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/3267032973626980474'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2007/02/why-open-source-is-so-hard-to-use.html' title='Why open source is so hard to use.'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-116818339133071529</id><published>2007-01-07T07:23:00.000-08:00</published><updated>2007-01-07T07:29:23.306-08:00</updated><title type='text'>Sorry state of Tapestry</title><content type='html'>I still remember how about two years ago lazyboy and I spend an afternoon analysing pros and cons of various Java WEB frameworks. We were mostly choosing between Java Server Faces and Tapestry. We actually had a whiteboard and assigned points to various criteria such as open source community acceptance, syntax of meta files, testability etc. If I remember correctly the major strike against JSF was its lack of open source credentials (it was when &lt;a title="My Faces" href="http://myfaces.apache.org/"&gt;My Faces&lt;/a&gt;  were still before the first release). In the end Tapestry won, since lazyboy wanted to use it more than I wanted to use JSF. If I ever happen to have such discussion again, I will make sure to take into consideration &lt;span style="font-weight: bold;"&gt;release frequency&lt;/span&gt;. &lt;br&gt;&lt;br&gt;I was never sorry sipXconfig chose Tapestry. We had a major success with it. We rewrote seemingly un-rewriteable network of JSP, javascript and godknowswhat code. We reduced the code size, accelerated development, took full advantage of component reuse. It was not automatic, but we even upgraded from Tapestry 3 to Tapestry 4 on the way, since we wanted to take advantage of the new features. I always knew that Tapestry is an ingenious rather than an elegant framework. To use it effectively in non-trivial applications you have to look under the hood all the time. You have to understand its vagaries and you have to learn to like them. If you prepare to invest in such relationship, you'll be rewarded. However unless something major changes in the Tapestry governance I feel like we are nearing the end of the road. &lt;br&gt;&lt;br&gt;It is the well deserved right of project major contributors to run the project the way they see it fit. They can abandon community, write a new incompatible version, stop developing: there is nothing one can complain about. However the competitive edge that open source project enjoys lies in an ongoing dialogue with the users. When you stop regularly releasing the project the conversation breaks. Developers and users are speaking past one another. Developers are touting in-progress versions that users cannot deploy, users are asking for features and fixes in versions that developers have no intention to work on. It's no accident that agile methodologies with their release early and release often philosophy fit open source project better than a venerable &lt;span style="font-style: italic;"&gt;plan, design, code, fix, release and pray&lt;/span&gt; approach. They promote this precious dialogue.&lt;br&gt;&lt;br&gt;If you visit &lt;a title="Tapestry" href="http://tapestry.apache.org/"&gt;Tapestry&lt;/a&gt;  website now, you will notice that there are 4 streams of development: 3.x, 4.0.x, 4.1.x, 5.x. 3.x is an outdated legacy, 4.0.x is the official release, 5.x is a bright new world. Both 4.1.x and 5.x are under development but without any road-map in place. It's been already discussed on Tapestry list that Tapestry 5 is going to be a major departure from Tapestry 4 (just as Tapestry 4 required a non-trivial transition from Tapestry 5). If you are starting a new project you have to use 4.0. But if you do that you agree that at some unspecified point in future you'll spend energy on rewriting you project to upgrade to Tapestry 5. Even if you happy with what 4.x is offering today and you are willing to stay with it for the rest of your project life (which is always longer than expected), you cannot count on regular bug fix releases. I am not saying the bugs are not getting fixed: they are - but only in the development branches you cannot upgrade to, since those branches do not have stable releases.&lt;br&gt;&lt;br&gt;Again, there is really nothing wrong with having an experimental branch. I also think it's OK to fix bugs only in the latest stream that you consider stable. But you have to have a new, usable, stable release at least twice a year. Otherwise developers, users and contributors would look for a better place to channel creative energy.&lt;br&gt;&lt;br&gt;The way we are using Tapestry evolves. I changed my mind diametrically on annotations. I used to think they make code too Tapestry centric and that meta information is better left in external XML file. I do not believe that any more: Java class that represents Tapestry page or component is already heavily Tapestry centric. You do not give up much if you allow annotations there. And it is easier to code and debug 2 files (.java and .html) rather than 3 (.java, .html and .page). This is the lesson I am probably ready to take to Hibernate and maybe even Spring annotations.&lt;br&gt;&lt;br&gt;The other change is a new way of binding properties and parameters contained in &lt;a title="tapestry-prop" href="http://howardlewisship.com/tapestry-javaforge/tapestry-prop/"&gt;tapestry-prop&lt;/a&gt;   module. It ditches evaluating OGNL and uses byte code enhancement to achieve performance that rivals that of a native Java method call. I am not sure the performance gain is actually visible on most pages, but since I never liked having too much OGNL code, I want to give it a try.&lt;br&gt;&lt;br&gt;Both annotations and tapestry-prop are great examples of what Tapestry could be: not just a framework but entire ecosystem of third party components, modules, editors and various development tools. But with the current approach to the development process I doubt it will ever realizes its potential.&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-116818339133071529?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/116818339133071529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=116818339133071529' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/116818339133071529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/116818339133071529'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2007/01/sorry-state-of-tapestry.html' title='Sorry state of Tapestry'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-116666840024582434</id><published>2006-12-20T18:16:00.000-08:00</published><updated>2006-12-20T18:39:44.863-08:00</updated><title type='text'>Code implodes for second time at 80K lines of code</title><content type='html'>This line made me happy to execute today&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; [dhubler@penguin main-pingtel]$ svn rm sipXconfig&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;For quite some time, pingtel maintained a fork of sipfoundry code, Damian and I diligently synchronized back and worth.  Well Pingtel dropped it's dual license and now there's no need to keep a separate copy.&lt;br /&gt;&lt;br /&gt;Think about it, 80K lines of merge burdening code just vanished.  We haven't seen an implosion like this since sipXconfig 3.0 when we deleted legacy EJB code and went with Spring....which happened to be 80K lines of code too!  I had that honor of blowing that away too.  Damian deletes as much code but he prefers the old fashioned way: line by line and svn commit by commit.&lt;br /&gt;&lt;br /&gt;So rev 8320 on sipfoundry and 7705 on pingtel of sipXconfig are identical, now I delete sipXconfig on pingtel's side and make a svn external.  WHOO-HOOO!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-116666840024582434?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/116666840024582434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=116666840024582434' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/116666840024582434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/116666840024582434'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2006/12/code-implodes-for-second-time-at-80k.html' title='Code implodes for second time at 80K lines of code'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-116559134864275962</id><published>2006-12-08T07:22:00.000-08:00</published><updated>2006-12-08T07:23:28.533-08:00</updated><title type='text'>Missing link</title><content type='html'>This is not a post about evolution. Or maybe it is. sipXconfig just received a new small addition. Administrators can now easily see all the phones associated with the user. Let's say that lazyboy has a problem with his phone. Administrator can now type lazyboy in the search box, click on lazyboy user link from search results and click on Phones page to see all the lazyboy's phone. This is so much better than figuring out what is lazyboy's phone serial number and entering it in the search box. The only time you do need to know that serial number is when you are adding a new phone to the system. &lt;br&gt;&lt;br&gt;There is one more bonus. If lazyboy asks for another phone (he does have 5 already, but he does talk a lot (well not really: he does not talk at all (this is kind of internal joke) (joke with a touch of Lisp syntax)))... OK let me start this sentence again. If he asks for another phone, you can just add it right from the screen displaying his existing phone. What's the bonus? Well, since sipXconfig knows you are adding phone for lazyboy, it'll add a line on that phone automatically. And you can generate phone configuration with another click; you may be tempted to never again go to the old Manage Phones list page. That is of course, if you want to spend the rest of your life managing lazyboy phones...&lt;br&gt;&lt;br&gt;Why missing link? sipXconfig always allowed you to see the list of lines for each phone, now you have a link in the opposite direction. Why evolution? There is really nothing entirely new in this feature. All the components were already implemented in sipXconfig ecosystem. There was a "give all phones for this user" search, the was a phone list UI component, there were various actions like adding phones and generating configuration. All it took to implement new page was some factoring out of components and putting them together in a new way. &lt;br&gt;&lt;br&gt;You may ask why I am so proud of an obvious feature. It it's really that great why did not we implement it 2 years ago. Well apparently there were other priorities 2 years ago. We implemented a whole bunch of useful features since then. Just like evolution did not start with &lt;a title="scarlet tanager" href="http://www.birds.cornell.edu/BOW/SCATAN/"&gt;scarlet tanager&lt;/a&gt;, we never intended to start with a perfectly usable system. That's what agile approach is all about: you might be missing features, even important ones, as long as you can add them quickly when they are needed. So keep on adding missing links or risk becoming one.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-116559134864275962?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/116559134864275962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=116559134864275962' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/116559134864275962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/116559134864275962'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2006/12/missing-link.html' title='Missing link'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-116442147143020797</id><published>2006-11-24T18:15:00.000-08:00</published><updated>2006-11-24T18:24:31.443-08:00</updated><title type='text'>Big contract signed</title><content type='html'>I signed a 2 year contract w/cingular for my new cell phone.  My treo 600 phone quality was bad so i needed a new phone.  only thing I really used on the treo was the camera phone, so i got nokia 6102i, $50 w/2 year contract.  I wanted to get a mobile phone that does wifi, but I predict it will be 1yr before wifi outside home or office is remotely convienent(pardon the pun) and 4 yrs before, maybe, you can ditch the proprietary signal phones.  So I'll take my cheap $40 zyxel wifi phone as a toy on trips and not buy a mixed mode phone yet, or maybe ever.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-116442147143020797?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/116442147143020797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=116442147143020797' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/116442147143020797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/116442147143020797'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2006/11/big-contract-signed.html' title='Big contract signed'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-116378380664306091</id><published>2006-11-17T09:16:00.000-08:00</published><updated>2006-11-17T14:21:45.030-08:00</updated><title type='text'>Spring into Hibernate - and it hurts</title><content type='html'>It's been a long Spring debugging, google searching, forum scrubbing session. I just wanted sipXconfig to talk to CDR database in addition to SIPXCONFIG database. I thought I understood well what has to be done. New data source, new LocalSessionFactory, new HibernateInterceptor fine tuned for read only connection. I had everything wired in 10 minutes. I ran my test and spring surprised me with the following exception:&lt;br/&gt; &lt;br/&gt; &lt;code&gt;Initialization of bean failed; nested exception is org.hibernate.HibernateException: No local DataSource found for configuration - dataSource property must be set on LocalSessionFactoryBean&lt;/code&gt; &lt;br/&gt; &lt;br/&gt; &lt;br/&gt; I double checked everything, I borrowed Douglas, which usually helps. Nothing.&lt;br/&gt; &lt;br/&gt; Soon I was browsing in search of similar problems. I found out how to set up transaction spanning multiple sessions, but I did not need it. I found how to switch your data source based on what who is logged in, but I did not need it either. I just wanted to connect to &lt;/span&gt;&lt;span style="FONT-FAMILY:Fixedsys"&gt;the second &lt;/span&gt;&lt;span style="FONT-FAMILY:Fixedsys"&gt;database and it did not work.&lt;br/&gt; &lt;br/&gt; Finally I found &lt;/span&gt;&lt;a href="http://opensource.atlassian.com/projects/spring/browse/SPR-1633" title="SPR-1633"&gt;SPR-1633&lt;/a&gt; which was good in a "misery loves company" kind of way. Looks like Hibernate does not really provide any easy way for Spring to inject data source, so Spring has to define a static function getConfigTimeDataSource in order for Hibernate to retrieve the data source. As soon as Hibernate is done Spring would reset configTimeDataSource. It does seem strange (or as some people call it: ingenious) but as long as you do not want to initialize two LocalSessionFactory objects in the same thread at the same time it should work.&lt;br/&gt; &lt;br/&gt; Right. But it did not work for me. It was getting personal now: I know it's impossible to initialize 2 object at the same time from the same single thread. Everybody knows that...&lt;br/&gt; &lt;br/&gt; Unless... Unless of course in the middle of initializing the first object, we explicitly ask the other object to initialize. Which - as it turns out - is exactly what we do.&lt;br/&gt; &lt;br/&gt; We are way too smart to use standard Spring LocalSessionFactoryBean. We write our own extended factories. The coolest among them (the most ingenious one) is &lt;a href="http://scm.sipfoundry.org/rep/sipX/main/sipXconfig/neoconf/src/org/sipfoundry/sipxconfig/common/DynamicSessionFactoryBean.java" title="DynamicSessionFactoryBean"&gt;DynamicSessionFactoryBean&lt;/a&gt;. It extends LocalSessionFactoryBean to dynamically create Hibernate mappings for all gateway and phone plug-ins. Thanks to this trick plug-in developers do not have to modify Hibernate mapping files when adding new phone or gateway type. They do not even have to know sipXconfig  uses Hibernate. In order for that to work, in the middle of its initialization phase, DynamicSessionFactoryBean asks Spring to enumerate all the beans: to find all these plugged in phones. Well, whenever you call getBeanNamesForType, Spring will initialize the remaining beans (even the lazy ones). Which of course triggers initialization of the other LocalSessionFactoryBean, which promptly resets carefully wired data source. When we try to complete initialization of DynamicSessionFactoryBean it does not have DataSource any more...&lt;br/&gt; &lt;br/&gt; Now for the blame part. Hibernate should work better with Spring, so that Spring does not restore to ugly hacks. Spring should not restore to ugly hacks - it should find a way to influence Hibernate community to improve data source injecting. sipXconfig should find a better way to inject hibernate mappings - something that does not trigger initializing all the beans.&lt;br/&gt; &lt;br/&gt; For now I am just going to use JDBC for CDRs. This cool lazy data source proxy that I just noticed probably cannot wait to be abused...&lt;br/&gt; &lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-116378380664306091?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/116378380664306091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=116378380664306091' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/116378380664306091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/116378380664306091'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2006/11/spring-into-hibernate-and-it-hurts.html' title='Spring into Hibernate - and it hurts'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-115047790830832995</id><published>2006-06-16T09:54:00.000-07:00</published><updated>2006-06-16T10:11:48.323-07:00</updated><title type='text'>sipxunit?</title><content type='html'>As the web layer and library layer gets more mature, we need to unit test more complex situations. For example, here is a test that I recently wanted to write:  page X should be accessable to supervisor, supervisor is defined by having one or more users they supervise.&lt;br /&gt;&lt;br /&gt;Right now, we seed our data for unit test by using webunit to drive web pages.  This is very cumbersome because it can take a lot of time to write, prone to breaking (although also prone to inadvertant testing which is good), and against proper test driven principles using a layer to test the layer itself.&lt;br /&gt;&lt;br /&gt;In addition, there's some data that simply cannot be seeded, for example results from other servers.&lt;br /&gt;&lt;br /&gt;We knew about this limitation from the day we started, but it's unclear how to address this.  &lt;br /&gt;&lt;br /&gt;My latest thought:&lt;br /&gt;&lt;br /&gt;I think we need to come up w/our own unit test language, library.  For example I want to write this&lt;br /&gt;&lt;br /&gt;  new:user(mary) { set supervisors = new group(accounting) }&lt;br /&gt;  new:user(john) { groups = accounting }&lt;br /&gt;  system:statsServer { parameter:mockStatsServer }&lt;br /&gt;&lt;br /&gt;By definition, this language is customized to sipxconfig, but maybe the syntax and constructs do not have to be.&lt;br /&gt;&lt;br /&gt;Maybe spring w/it's near unlimited extensibility, and sophisticated AOP (support especically spring 2.0) will help here.  Challenge with this approach is "resetting" the environment between each test. Spring has application-like events, maybe that's an approach.  It's a language and constructs we already know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-115047790830832995?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/115047790830832995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=115047790830832995' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/115047790830832995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/115047790830832995'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2006/06/sipxunit.html' title='sipxunit?'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-114865675910078598</id><published>2006-05-26T08:17:00.000-07:00</published><updated>2006-05-26T08:21:46.256-07:00</updated><title type='text'>Java formatting progress</title><content type='html'>Java 1.4&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  private String getUrl() {&lt;br /&gt;      Object params = new Object[] {&lt;br /&gt;          m_host, Integer.toString(m_port)&lt;br /&gt;      };&lt;br /&gt;&lt;br /&gt;      return MessageFormat.format("ldap://{0}:{1}", params);&lt;br /&gt;  }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Java 1.5 argv and autoboxing...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  private String getUrl() {&lt;br /&gt;      return MessageFormat.format("ldap://{0}:{1}", m_host, m_port);&lt;br /&gt;  }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Java 1.5 String.format&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  private String getUrl() {&lt;br /&gt;      return String.format("ldap://%s:%d", m_host, m_port);&lt;br /&gt;  }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;you can get rid of String. using static import but I am not sure I like it&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import static java.lang.String.format;&lt;br /&gt;....&lt;br /&gt;&lt;br /&gt;  private String getUrl() {&lt;br /&gt;      return format("ldap://%s:%d", m_host, m_port);&lt;br /&gt;  }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;of course Ruby is still better:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt; def get_url&lt;br /&gt;   "ldap://#{@host}:#{@port}"&lt;br /&gt; end&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-114865675910078598?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/114865675910078598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=114865675910078598' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/114865675910078598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/114865675910078598'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2006/05/java-formatting-progress.html' title='Java formatting progress'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-114735525229762631</id><published>2006-05-11T06:16:00.000-07:00</published><updated>2006-05-11T06:47:32.326-07:00</updated><title type='text'>Settings Refactoring</title><content type='html'>sipXconfig can configure 6 different hardward devices and at least that many servers.  There are potentially thousands of settings that can be changed.  Naturally we invented a meta-model to describe these settings and how they work so we wouldn't have to code each setting in java.&lt;br /&gt;&lt;br /&gt;Typically the problem with meta-models is that when you actually *want* to code in java for a particular because of special handling you have to deal with a cumbersome syntax.  &lt;br /&gt;&lt;br /&gt;For example, let's say I want to convert the GMT offset from minutes to hours for a phone, in java I would like to do this:&lt;br /&gt;&lt;br /&gt;  public int getGmtOffset() {&lt;br /&gt;    return m_zone.getGmtOffset() / 60;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;but instead I have to do this:&lt;br /&gt;  Setting s = getSettings().getSetting("sntp/gmtOffset");&lt;br /&gt;  s.setValue(String.valueOf(m_zone.getGmtOffset() / 60));&lt;br /&gt;&lt;br /&gt;no big deal when it's just one or two setttings, but the more and more setting you write using the meta model language, the harder it is to maintain.&lt;br /&gt;&lt;br /&gt;So... I refactored settings so that you can write in java for most things.  It relies on Java annotations, it was pretty simple.  Now I'm converting all the old code, so I can simplify the system.  I was pleasantly please after refactoring the code for one of the more complex devices: Polycom Soundpoint with this warning from Eclipse:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/13269168@N00/144542780/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/52/144542780_73a2e2cb69.jpg" width="500" height="133" alt="no-settings" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-114735525229762631?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/114735525229762631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=114735525229762631' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/114735525229762631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/114735525229762631'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2006/05/settings-refactoring.html' title='Settings Refactoring'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-114458961786351089</id><published>2006-04-09T06:33:00.000-07:00</published><updated>2006-04-09T06:52:42.913-07:00</updated><title type='text'>Internet in Sopot</title><content type='html'>&lt;style type="text/css"&gt;.flickr-photo { }.flickr-frame { float: right; text-align: center; margin-left: 15px; margin-bottom: 15px; }.flickr-caption { font-size: 0.8em; margin-top: 0px; }&lt;/style&gt;&lt;div class="flickr-frame"&gt; &lt;a href="http://www.flickr.com/photos/pirxpilot/125641544/" title="photo sharing"&gt;&lt;img src="http://static.flickr.com/53/125641544_d17090b981_t.jpg" class="flickr-photo" alt="Internet w Sopocie" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;span class="flickr-caption"&gt;  &lt;a href="http://www.flickr.com/photos/pirxpilot/125641544/"&gt;Internet w Sopocie&lt;/a&gt;,&lt;br /&gt; originally uploaded by &lt;a href="http://www.flickr.com/people/pirxpilot/"&gt;pirxpilot&lt;/a&gt;. &lt;/span&gt;&lt;/div&gt;Spent couple of days in Poland's Tricity area (Gdańsk, Sopot, Gdynia). I was hoping for a vacation break but you know how it is. You meet your friends. Since you are a geek, most of your friends are geeks. You end up drinking beer and discussing ethernal Java vs. Ruby questions. &lt;br /&gt;&lt;br /&gt;There are obvious perks of being in this enviable position of someone who is paid for writing open source project. The drawback is that you are perceived as a member of interesting, but also a bit creepy cult. Your friends will proceed to quickly intoxicate you and ask tricky questions such as "How can you possibly make any money on it?". So thanks Eric Raymond for your &lt;a href="http://www.catb.org/~esr/writings/cathedral-bazaar/magic-cauldron/"&gt;Magic Couldron&lt;/a&gt; or I would not have escaped alive.&lt;br/&gt;&lt;br /&gt;For those who did not have a chance to visit Tricity - it's kind of similar to Boston. Old port, got rich on trade, very cosmopolitan place, old architecture next to shining new buildings, good restaurants, pubs filled with students and live music. Bay of Gdańsk is warmer than Bay of Boston, and windsurfing is more popular than sailing here. Poland's Cape Cod is called Hel (only one "l" here) Peninsula and Peer is Sopot is way longer than anything you can find on the East Coast but the same superiority feeling towards respectively New York and Warsaw might trick you into forgetting about 5 time zones in between.&lt;br /&gt;&lt;br /&gt;&lt;br clear="all" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-114458961786351089?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/114458961786351089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=114458961786351089' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/114458961786351089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/114458961786351089'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2006/04/internet-in-sopot.html' title='Internet in Sopot'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-114265703613061853</id><published>2006-03-17T20:39:00.000-08:00</published><updated>2006-03-17T20:43:56.143-08:00</updated><title type='text'>Betas are lame</title><content type='html'>Saw this and couldn't agree more with Microsoft&lt;br /&gt;&lt;br /&gt; http://news.yahoo.com/s/zd/20060315/tc_zd/173565&lt;br /&gt;    -- Mary Jo Foley - Microsoft Watch &lt;br /&gt;&lt;br /&gt;Select blubs I liked: &lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;"Beta builds are predictable milestones by which external and internal testers have measured their progress toward the delivery of final code. Betas are typically few and far between, and feedback on them tends to be late and sometimes lame. But they are nonetheless a known quantity, and one that software developers, OEM partners and customers of all sizes rely on in gauging when and how to support a new product.&lt;br /&gt;&lt;br /&gt;Open source turned the traditional software development paradigm on its head. In the open source world, testers receive frequent builds of products under development. Their recommendations and suggestions typically find their way more quickly into developing products. And the developer community is considered as important to writing quality code as are the "experts" shepherding the process."&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;"When a feature is ready, it will go into the product," Flessner explained. "I'd like to be in a situation where we can ship (a new release or update) in 120 days, due to market requirements, the team being tired or whatever."&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;The ability to install the latest CTP atop the most recent one is a priority, as well. "Customers need to be able to upgrade. When you can't upgrade from one CTP to the next, that is a definite problem," Flessner admitted.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-114265703613061853?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/114265703613061853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=114265703613061853' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/114265703613061853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/114265703613061853'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2006/03/betas-are-lame.html' title='Betas are lame'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-113824637542404257</id><published>2006-01-25T19:32:00.000-08:00</published><updated>2006-01-25T19:32:55.436-08:00</updated><title type='text'>Job openings at Pingtel</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;&lt;font face="Arial" size="3"&gt;&lt;b&gt;Senior / Principal Software Engineer &lt;br/&gt;(SIP Stack/Proxy Development)  &lt;br/&gt;&lt;br/&gt;&lt;/b&gt;Pingtel is looking for a senior/principal software engineer to join &lt;br/&gt;an energetic and talented team to participate in exciting open-source &lt;br/&gt;SIP communications servers (sipXproxy, sipXpublisher, sipXregistrar, &lt;br/&gt;etc.) and presence server development projects.  These servers &lt;br/&gt;form the core of a SIP message routing and service infrastructure, and &lt;br/&gt;are combined in a variety of ways to produce a number of different products.&lt;/font&gt; &lt;br/&gt;&lt;br/&gt;&lt;font face="Arial" size="3"&gt;&lt;b&gt;Qualifications:&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;ul type="disc"&gt;&lt;li&gt;&lt;font face="Arial" size="3"&gt;BSCS/CE/EE minimum &lt;/font&gt;&lt;/li&gt;  &lt;li&gt;&lt;font face="Arial" size="3"&gt;At least 7 years of commercial &lt;br/&gt;  software development experience &lt;/font&gt;&lt;/li&gt;  &lt;li&gt;&lt;font face="Arial" size="3"&gt;SIP, Datacom / Telecom development &lt;br/&gt;  experience &lt;/font&gt;&lt;/li&gt;  &lt;li&gt;&lt;font face="Arial" size="3"&gt;Solid Linux C/C++ development &lt;br/&gt;  experience &lt;/font&gt;&lt;/li&gt;  &lt;li&gt;&lt;font face="Arial" size="3"&gt;Experience in building and &lt;br/&gt;  maintaining complex multi-threaded software &lt;/font&gt;&lt;/li&gt;  &lt;li&gt;&lt;font face="Arial" size="3"&gt;Excellent software engineering &lt;br/&gt;  skills, including object oriented analysis and design &lt;/font&gt;&lt;/li&gt;  &lt;li&gt;&lt;font face="Arial" size="3"&gt;Able to investigate and recommend &lt;br/&gt;  technical solutions to complex problems with little direction &lt;/font&gt;&lt;/li&gt;  &lt;li&gt;&lt;font face="Arial" size="3"&gt;Excellent written and verbal &lt;br/&gt;  communication skills &lt;/font&gt;&lt;/li&gt;  &lt;li&gt;&lt;font face="Arial" size="3"&gt;Self-motivated, excellent &lt;br/&gt;  teamwork skills, and takes responsibility and ownership of development &lt;br/&gt;  areas &lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;font face="Arial" size="3"&gt;In addition, experience with any of the &lt;br/&gt;following is highly desirable:&lt;/font&gt;&lt;br/&gt;  &lt;/p&gt;&lt;ul type="disc"&gt;&lt;li&gt;&lt;font face="Arial" size="3"&gt;Experience with SIP stack &lt;br/&gt;  and proxy implementation&lt;/font&gt;&lt;/li&gt;  &lt;li&gt;&lt;font face="Arial" size="3"&gt;Experience with implementation &lt;br/&gt;  and deployment of IM and Presence protocols &lt;/font&gt;&lt;/li&gt;  &lt;li&gt;&lt;font face="Arial" size="3"&gt;Experience with XML tools &lt;br/&gt;  and technologies, especially XML Schema and validating parsers &lt;/font&gt;&lt;/li&gt;  &lt;li&gt;&lt;font face="Arial" size="3"&gt;Familiarity with autotools &lt;br/&gt;  and open source methodologies and conventions&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;font face="Arial" size="3"&gt;&lt;b&gt;&lt;br/&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Arial" size="3"&gt;&lt;b&gt;Senior / Principal Software Engineer &lt;br/&gt;(SIP-Based Application Development) &lt;/b&gt;&lt;br/&gt;&lt;br/&gt;Pingtel is looking for a senior/principal software engineer to join &lt;br/&gt;an energetic and talented team to participate in exciting open-source &lt;br/&gt;SIP-based application development projects.  The current SIP-based &lt;br/&gt;applications include a SIP-based media server for voice mail, auto-attendant, &lt;br/&gt;and IVR; a SIP-based ACD server; and a SIP-based Conference Server.  &lt;br/&gt;More exciting projects are being planned.  This individual will &lt;br/&gt;participate in the design and development of all existing and future &lt;br/&gt;applications.&lt;/font&gt; &lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Arial" size="3"&gt;&lt;b&gt;Qualifications:&lt;/b&gt;&lt;/font&gt;&lt;br/&gt;  &lt;/p&gt;&lt;ul type="disc"&gt;&lt;li&gt;&lt;font face="Arial" size="3"&gt;BSCS/CE/EE minimum with at &lt;br/&gt;  least 7 years of software development experience. &lt;/font&gt;&lt;/li&gt;  &lt;li&gt;&lt;font face="Arial" size="3"&gt;Solid Linux C/C++ development &lt;br/&gt;  experience. &lt;/font&gt;&lt;/li&gt;  &lt;li&gt;&lt;font face="Arial" size="3"&gt;Excellent software engineering &lt;br/&gt;  skills, including object oriented analysis and design. &lt;/font&gt;&lt;/li&gt;  &lt;li&gt;&lt;font face="Arial" size="3"&gt;Self-motivated, excellent &lt;br/&gt;  teamwork skills, and takes responsibility and ownership of development &lt;br/&gt;  areas. &lt;/font&gt;&lt;/li&gt;  &lt;li&gt;&lt;font face="Arial" size="3"&gt;Experience in building and &lt;br/&gt;  maintaining complex multi-threaded software. &lt;/font&gt;&lt;/li&gt;  &lt;li&gt;&lt;font face="Arial" size="3"&gt;Knowledge of network socket &lt;br/&gt;  level programming and operating system primitives. &lt;/font&gt;&lt;/li&gt;  &lt;li&gt;&lt;font face="Arial" size="3"&gt;Able to investigate and recommend &lt;br/&gt;  technical solutions to complex problems with little direction. &lt;/font&gt;&lt;/li&gt;  &lt;li&gt;&lt;font face="Arial" size="3"&gt;Excellent written and verbal &lt;br/&gt;  communication skills. &lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;font face="Arial" size="3"&gt;In addition, experience with any of the &lt;br/&gt;following is desirable:&lt;/font&gt;&lt;br/&gt;  &lt;/p&gt;&lt;ul type="disc"&gt;&lt;li&gt;&lt;font face="Arial" size="3"&gt;Telecom experience, preferably &lt;br/&gt;  in one or more Voice-over-IP technologies (SIP, H.323, RTP, MGCP, or &lt;br/&gt;  Megaco). &lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font face="Arial" size="3"&gt;  TTS, or voice recognition. &lt;/font&gt;&lt;/li&gt;  &lt;li&gt;&lt;font face="Arial" size="3"&gt;Software-based audio processing&lt;/font&gt;&lt;/li&gt;  &lt;li&gt;&lt;font face="Arial" size="3"&gt;ACD, Call center applications&lt;/font&gt;&lt;/li&gt;  &lt;li&gt;&lt;font face="Arial" size="3"&gt;Conference bridge&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-113824637542404257?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/113824637542404257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=113824637542404257' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/113824637542404257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/113824637542404257'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2006/01/job-openings-at-pingtel.html' title='Job openings at Pingtel'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-113630314201546769</id><published>2006-01-03T07:41:00.000-08:00</published><updated>2006-01-04T08:37:06.816-08:00</updated><title type='text'>A New Hope (i.e. maven2)</title><content type='html'>Our build system is getting more and more complicated. It seems that we&lt;br /&gt;achieved quite a lot by now:&lt;br /&gt;- full unit test integration&lt;br /&gt;- database and web unit tests&lt;br /&gt;- checkstyle and clover (test coverage) integration&lt;br /&gt;- support for Eclipse&lt;br /&gt;&lt;br /&gt;I feel good about how easy it is build sipXconfig now (building sipX is a different story altogether). Quick and dirty start on wiki even let's you do it on without compiling the rest of sipX family. And even on the system without autoconf toolset (i.e. Windows) &lt;br /&gt;&lt;br /&gt;There are things that are difficult still. Our Ant build scripts are a bit too complicated. You have to search for places to add new jars. It is easy to forget it in one place which usually results in problems after installation. Adding new modules is not as easy as it could be. We are slowly outgrowing neoconf/web structure but no-one seem to have the stomach to rip it apart. The dependencies are on the verge of being too difficult to manage.&lt;br /&gt;&lt;br /&gt;However I have a feeling that we can do better and the more I look at Maven2 the more I think that this may be the way to go. &lt;br /&gt;&lt;br /&gt;The big win is standardization. Sure you can run ant -p to find out what tasks are defined in the project but I suppose that few people will guess that ant precommit is what we usually run before svn ci, or that the ant run command has to be executed from web project to start jetty. Switching to maven would take care of these.&lt;br /&gt;&lt;br /&gt;If a new tool that I want to use appears I want to use this tool and not figure out how to seamlessly add it to build system. And with maven there is a chance that if tool is useful there is a plugin to support it.&lt;br /&gt;&lt;br /&gt;There are challenges of course:&lt;br /&gt;- we use slightly different directory structure that the one suggested by maven - I am sure that there is a way to express it in pom somehow but I'd rather switch to standard&lt;br /&gt;- we still need to place nice with make and autotools - sipXconfig is very often build as a part of entire sipX project and we do not want C/C++ developers to worry their pretty heads about our sophisticated and powerful build tools - let them stay in 20 century for couple of more years&lt;br /&gt;- we would have to find out how big of a dependency problem we are introducing for various Linux platforms: of course java is a big problem already but that's hardly an excuse to make things even worse - the good thing is that we could just distribute maven and let it download all dependencies: a big plus for people who want to look at the source but not necessarily build everything - out LIB directory is probable &gt;= 10MB and growing&lt;br /&gt;&lt;br /&gt;Anyway - I'll keep trying. Watch this space for more updates.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-113630314201546769?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/113630314201546769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=113630314201546769' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/113630314201546769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/113630314201546769'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2006/01/new-hope-ie-maven2.html' title='A New Hope (i.e. maven2)'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-113406124021469752</id><published>2005-12-08T07:43:00.000-08:00</published><updated>2005-12-08T09:03:15.843-08:00</updated><title type='text'>Culture clash - or java programmers in ruby world</title><content type='html'>If you live in a different country that you grown up in, you suddenly notice many things natives take for granted. There are of course differences in the way people dress, talk or eat. Some things are obvious: the mysterious correlation between a bad taste and programming skills among American hackers. But there is also many subtle and entertaining ways in which people behave, that provide endless conversation topics for expats. Laughing about it is a sweet revenge for all these situations in a restaurant when people are doomed to judge your IQ based on the familiarity with locally popular condiments.&lt;br /&gt;&lt;br /&gt;In sipXconfig work I recently had an eye opening experience of a similar kind when we started using Ruby. Douglas and Walter used it to test sipXconfig SOAP interface, I got my toes wet (or should it be fingers) trying to automate importing data.&lt;br /&gt;&lt;br /&gt;Since the novelty effect of a culture clash may wear off pretty quickly, I decided to record my experience while it's still fresh.&lt;br /&gt;&lt;br /&gt;Well, Ruby is no Java. Ruby is like snowboarding and Java is like skiing (hence the culture clash). With Java you know where you are and you know what you cannot have. A list is a list is a list in Java and it'll be a list even after you look at this after especially intensive "coding" party. Your methods will not multiply magically. Which is comforting, but in a way sad. In Ruby you can teach a list a new skills. Classes are never closed. You can add methods, you can redefine methods. You can call methods and if they are not implemented you have a chance to do something about it in runtime. This is exhilarating and scary.&lt;br /&gt;&lt;br /&gt;Some time ago I would not even dream about writing any serious code in a language like Ruby. I needed my compiler to catch as many problems as possible. I needed to guard my private data so that people like lazyboy do not break my beautiful code. But today I do not feel like that any more. Unit test provide me with all security I need. If it's not enough I can always write more unit test.&lt;br /&gt;&lt;br /&gt;I also realized I became addicted to source code. Eclipse makes Java source code wonderfully accessible. Quite often I used to read library code instead of reading library documentation. Not so much for Ruby code. I am not sure if the reason for that is that Eclipse plugin for Ruby is just not good enough yet, or if maybe just too much of a library is written in C and I simply do not have source code for it. But I am a bit lost.&lt;br /&gt;&lt;br /&gt;The good tool can make up for language real and perceived shortcomings. In Java you have to be more verbose. But that's hardly a problem if Eclipse nicely writes the most code for you. In Ruby there is a method for everything you can imagine. Finding this method name takes longer than most people would put up with.&lt;br /&gt;&lt;br /&gt;Which brings me to the entire issue of &lt;a href="http://martinfowler.com/bliki/HumaneInterface.html"&gt;Human vs. Minimal&lt;/a&gt; interface. Java users seem to be quite offended by Ruby classes with &lt;a href="http://www.cafeaulait.org/oldnews/news2005December6.html"&gt;75 methods&lt;/a&gt;. I kind of thing both sides are missing a point in this discussion. Culture clashes are not only entertaining. They also teach us new tricks. Java will benefit from Ruby, just a s Ruby already benefited from Java. And I am looking forward to using both.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-113406124021469752?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/113406124021469752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=113406124021469752' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/113406124021469752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/113406124021469752'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/12/culture-clash-or-java-programmers-in.html' title='Culture clash - or java programmers in ruby world'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-113280347384036009</id><published>2005-11-23T19:12:00.000-08:00</published><updated>2005-11-23T19:47:00.906-08:00</updated><title type='text'>Embedding ANT as automatic DB schema upgrader</title><content type='html'>Anyone who has developed code with other developers that uses a database can sympathize with this dialog&lt;br /&gt; Joe : "Hey, just checked in some code, you need to run this SQL script to create the new tables." &lt;br /&gt; Mary: "It's not working, my schema already has some of those tables from last time"&lt;br /&gt; Joe: "Drop all those, maybe you better drop entire db to be safe"&lt;br /&gt; Mary: "But I'm in the middle of developing something, dang I shouldn't have updated my code"&lt;br /&gt;&lt;br /&gt;sipXconfig went to use ANT to break up these little DB schema upgrades into "patches" that are intelligent enough to know when to run and remember when they've been run before.  I'm very happy with this and it actually required ZERO java coding! &lt;br /&gt;  http://scm.sipfoundry.org/rep/sipX/main/sipXconfig/neoconf/etc/database/database.xml&lt;br /&gt;&lt;br /&gt;Rule was you never edited a patch once it was checked in, you only patched other patches.  It was still difficult in early development stages when your portion of the schema changed drastically and you left a long string of patches behind. So I came up with a patch that clears itself and applies itself everytime the application runs.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;target name="drop-firmware" if="firmware"&amp;gt;&lt;br /&gt;    &amp;lt;sipx-sql&amp;gt;&lt;br /&gt;      drop table firmware;&lt;br /&gt;      drop sequence firmware_seq;&lt;br /&gt;      delete from patch where name = 'firmware';&lt;br /&gt;&amp;lt;/sipx-sql&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;target name="firmware" depends="drop-firmware"&amp;gt;&lt;br /&gt;    &amp;lt;db-patch patch="firmware"&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;sipx-sql&lt;/code&gt; runs a SQL script and &lt;code&gt;db-patch&lt;/code&gt; does the same but also marks that the script has been applied before so that next time this ant file is run "if=firmare" will be true.  Details are in the &lt;code&gt;database.xml&lt;/code&gt; from above.&lt;br /&gt;&lt;br /&gt;At some point when these tables stablize, I can just change it to this&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;target name="firmware" unless="firmware"&amp;gt;&lt;br /&gt;    &amp;lt;db-patch patch="firmware"&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-113280347384036009?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/113280347384036009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=113280347384036009' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/113280347384036009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/113280347384036009'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/11/embedding-ant-as-automatic-db-schema.html' title='Embedding ANT as automatic DB schema upgrader'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-113228042214530592</id><published>2005-11-17T18:10:00.000-08:00</published><updated>2005-11-17T18:20:22.160-08:00</updated><title type='text'>Waiting for remote video</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://static.flickr.com/32/64351510_88887b6dca_m.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px;" src="http://static.flickr.com/32/64351510_88887b6dca_m.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;somebody w/video call me...&lt;br /&gt;&lt;br /&gt;Compusa had a sale on webcams, 2 Creative labs Live web cams for $70.  Other one will be xmas gift so someone will call me, maybe my brother will use it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-113228042214530592?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/113228042214530592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=113228042214530592' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/113228042214530592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/113228042214530592'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/11/waiting-for-remote-video.html' title='Waiting for remote video'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-113217442179751021</id><published>2005-11-16T12:50:00.000-08:00</published><updated>2005-11-16T12:53:41.810-08:00</updated><title type='text'>Please, all sales final</title><content type='html'>It's how I remember what order to put my java method and field modifiers&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold;"&gt;p&lt;/span&gt;ublic &lt;span style="font-weight: bold;"&gt;a&lt;/span&gt;bstract &lt;span style="font-weight: bold;"&gt;s&lt;/span&gt;tatic &lt;span style="font-weight: bold;"&gt;f&lt;/span&gt;inal ...&lt;/blockquote&gt;I say it to myself half-dozen times a day, so I thought I'd share.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-113217442179751021?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/113217442179751021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=113217442179751021' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/113217442179751021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/113217442179751021'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/11/please-all-sales-final.html' title='Please, all sales final'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-113159793763650712</id><published>2005-11-09T20:45:00.000-08:00</published><updated>2005-11-09T20:55:33.436-08:00</updated><title type='text'>SOAP Authentication</title><content type='html'>&lt;b&gt;Decisions, decisions&lt;/b&gt;&lt;br /&gt;&lt;p&gt;As a web services rookie, authentication is a challenging assignment.  First question: whether to use &lt;a href="http://java.boot.by/wcd-guide/ch05s03.html"&gt;HTTP auth&lt;/a&gt; at the transport level, or &lt;a href="http://www.devx.com/Java/Article/28816/0/page/1"&gt;WS-Security&lt;/a&gt; at the message level.  Decision: use HTTP auth. It is simpler, mature and widely supported, and meets our current needs well.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Given the four types of HTTP auth:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;HTTP Basic&lt;/li&gt;&lt;br /&gt;&lt;li&gt;HTTP Digest&lt;/li&gt;&lt;br /&gt;&lt;li&gt;HTTPS Client&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Form-Based&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;which should we use?&lt;/p&gt;&lt;br /&gt;&lt;p&gt;We're using HTTP/SSL as the transport since sipXconfig data is the customer's private information and should be protected on the wire. So HTTP Digest auth offers no advantages over HTTP Basic. HTTPS Client auth, a.k.a. "client certificate authentication" has the extra security afforded by PKI integration, as well as extra complexity. Form-Based auth is interactive and therefore not suitable for web services.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Decision: start with HTTP Basic and support HTTPS Client later.&lt;/p&gt;&lt;br /&gt;&lt;b&gt;Implementing HTTP Basic authentication with Jetty&lt;/b&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://jetty.mortbay.org/jetty/"&gt;Jetty&lt;/a&gt;, the web container used by sipXconfig, is a great open source product, but the documentation is a bit scanty.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Step 1: Add security-related deployment descriptors to &lt;code style="font-family: courier;"&gt;web.xml&lt;/code&gt;:&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; &amp;lt;security-constraint&amp;gt;&lt;br /&gt;   &amp;lt;web-resource-collection&amp;gt;&lt;br /&gt;     &amp;lt;web-resource-name&amp;gt;SipXconfig Web Services&amp;lt;/web-resource-name&amp;gt;&lt;br /&gt;     &amp;lt;url-pattern&amp;gt;/services/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;   &amp;lt;/web-resource-collection&amp;gt;&lt;br /&gt;   &amp;lt;auth-constraint&amp;gt;&lt;br /&gt;     &amp;lt;role-name&amp;gt;admin&amp;lt;/role-name&amp;gt;&lt;br /&gt;   &amp;lt;/auth-constraint&amp;gt;&lt;br /&gt; &amp;lt;/security-constraint&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- Use HTTP Basic authentication. --&amp;gt;&lt;br /&gt; &amp;lt;login-config&amp;gt;&lt;br /&gt;   &amp;lt;auth-method&amp;gt;BASIC&amp;lt;/auth-method&amp;gt;&lt;br /&gt;   &amp;lt;realm-name&amp;gt;jetty realm&amp;lt;/realm-name&amp;gt;&lt;br /&gt; &amp;lt;/login-config&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;security-role&amp;gt;&lt;br /&gt;   &amp;lt;role-name&amp;gt;admin&amp;lt;/role-name&amp;gt;&lt;br /&gt; &amp;lt;/security-role&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href="http://e-docs.bea.com/wls/docs81/security/thin_client.html#1045995"&gt;BEA&lt;/a&gt; has a good explanation of what goes in web.xml. Briefly,&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;The &lt;code style="font-family: courier;"&gt;security-constraint&lt;/code&gt; above protects all the URLs associated with web services, declaring that only clients with the admin role have access.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The &lt;code style="font-family: courier;"&gt;login-config&lt;/code&gt; element declares that HTTP Basic authentication will be used.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The &lt;code style="font-family: courier;"&gt;security-role&lt;/code&gt; element declares the admin security role.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;Step 2: Now how do we change the sipXconfig Java code to make the web application support this properly? Turns out that this is completely web container-dependent, sad to say, and the Jetty documentation offers little advice. By talking to my friend Damian, grepping around the Jetty distribution, and looking at the sipXconfig 2.8 code, I figured it out.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;You have to create a class that implements the &lt;a href="http://jetty.mortbay.org/javadoc/org/mortbay/http/UserRealm.html"&gt;UserRealm interface&lt;/a&gt; and add it to your Jetty Server, as in the following new line in the sipXconfig &lt;a href="http://scm.sipfoundry.org/rep/sipX/main/sipXconfig/web/test/org/sipfoundry/sipxconfig/site/JettyTestSetup.java"&gt;JettyTestSetup class&lt;/a&gt;:&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    m_server.addWebApplication("/sipxconfig", war);&lt;br /&gt;&lt;b&gt;    m_server.addRealm(new JettyUserRealm());&lt;/b&gt;&lt;br /&gt;    m_server.start();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Here &lt;a href="http://scm.sipfoundry.org/rep/sipX/main/sipXconfig/web/test/org/sipfoundry/sipxconfig/site/JettyUserRealm.java"&gt;JettyUserRealm&lt;/a&gt; is that class. If you now run sipXconfig in test mode and browse to the web services URL, http://localhost:9999/sipxconfig/services, the browser will prompt you to log in. Of course, this is just for testing, real use of the web services API is from a client application, not a user through a browser. The &lt;code style="font-family: courier;"&gt;JettyUserRealm&lt;/code&gt; test class is just a dummy implementation, real authentication via the password tokens stored in the database is the next step in our plan.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-113159793763650712?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/113159793763650712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=113159793763650712' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/113159793763650712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/113159793763650712'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/11/soap-authentication.html' title='SOAP Authentication'/><author><name>Walter</name><uri>http://www.blogger.com/profile/02500896821199823733</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-112991494651457010</id><published>2005-10-21T10:12:00.000-07:00</published><updated>2005-10-21T10:15:46.523-07:00</updated><title type='text'>Document-centric SOAP</title><content type='html'>I'm finding a lot of notes about SOAP like this&lt;br /&gt; http://searchwebservices.techtarget.com/qna/0,289202,sid26_gci1098415,00.html?bucket=NEWS&lt;br /&gt;&lt;blockquote&gt;In encouraging developers to think of Web service development as no more than development of a Java class with annotations, an RPC-centric approach does not encourage good service architecture, nor is interface stability likely to be maintained. The lure of a familiar paradigm attracts developers down this route, but ultimately that familiarity is an illusion: A Web service is fundamentally not like an object instance that might throw RemoteExceptions every now and then.&lt;/blockquote&gt;I need to do some more research and blows some of my illusions of grandure.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-112991494651457010?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/112991494651457010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=112991494651457010' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/112991494651457010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/112991494651457010'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/10/document-centric-soap.html' title='Document-centric SOAP'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-112942596464357157</id><published>2005-10-15T17:31:00.000-07:00</published><updated>2005-10-15T20:44:31.083-07:00</updated><title type='text'>Broke ground w/SOAP, found Rubies and still not happy</title><content type='html'>Being new to SOAP, XFire and Ruby, I finally got my first SOAP call the way I wanted it:&lt;br /&gt;- No SOAP specific code&lt;br /&gt;- No getting dirty w/writing WSDL or reading/writing XML the wire&lt;br /&gt;- Unit tests that are quick and easy to write&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Java Service Implementation:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So I have a Service&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class UserServiceImpl implements UserService {&lt;br /&gt;    public void createUser(String username, String pin) {&lt;br /&gt;        // do it&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Unit test in ruby:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class UserServiceTestApi &lt; Test::Unit::TestCase&lt;br /&gt;  def setup&lt;br /&gt;    @userService = SOAP::WSDLDriverFactory.new(SERVICE_WSDL).create_rpc_driver&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def test_createUser&lt;br /&gt;    @userService.createUser(:in0 =&gt; 'testApiUser', :in1=&gt; '1234')&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Wow, that's hot.&lt;br /&gt;&lt;br /&gt;But I'm still not happy. Now I have to start passing objects: user objects, phone objects. And object graphs would be nice: users and their phones. SOAP can handle objects, that's why you'd use SOAP in the first place over XML-RPC or the like. I've seen XFire automatically describe objects I use in my API in the WSDL, but how does it do the object graph. Collections of other objects. Xfire can do all this, but I'll need to understand more here. This is where I fear the community arguments like "SOAP is not pure RPC, it's a way to send XML back and forth" come into play. I'll be fighting the WSDL and giving up 1 XML element at a time.&lt;br /&gt;&lt;br /&gt;On a different note, up until now we've been writing a web site. I've been happy with the natural layers of abstraction :&lt;br /&gt;&lt;br /&gt;[HTML Templates] + [Business Objects]&lt;br /&gt;[Web Components] + [Business Objects]&lt;br /&gt;[Data Access Objects] + [Business Objects]&lt;br /&gt;&lt;br /&gt;Notice [Business Objects] live thru all layers&lt;br /&gt;&lt;br /&gt;So a natural copy would be&lt;br /&gt;&lt;br /&gt;[Web Client] + [Business Objects]&lt;br /&gt;[Web Service] + [Business Objects]&lt;br /&gt;[Data Access Objects] + [Business Objects]&lt;br /&gt;&lt;br /&gt;Two problems with this:&lt;br /&gt;1.) [Business Objects] contain code, that doesn't get sent over the wire. They turn into dumb bags of data, linking to other dumb bags of data.&lt;br /&gt;2.) [Web Service] ends up duplicating every method in the [Data Access Objects] layer and end up being dumb data movers. Anying good in the [Web Service] layer you could argue would be more reusable in the [Data Access Object] layer.&lt;br /&gt;&lt;br /&gt;This is what I want:&lt;br /&gt;[Web Client] + [Business Data]&lt;br /&gt;[Data Access Objects - Stuff] + [Business Data]&lt;br /&gt;[Data Access Objects] + [Business Objects]&lt;br /&gt;&lt;br /&gt;So I want to stip off methods in DAO that shouldn't be accessable via web service, and I need to strip business objects of all functionality, typically non-accessor methods so it's just a bag of properties.&lt;br /&gt;&lt;br /&gt;I just have to write code that unwrites code.&lt;br /&gt;&lt;br /&gt;The Data Access Objects, Xfire already does this via annotations, let's you take an existing DAO and mark methods as @WebMethods. Great, now I have to figure out how to describe the objects. Annotations seem like a good way, but hard part would be getting inside xfire wsdl and xml marshalling code to translate.&lt;br /&gt;&lt;br /&gt;This is a lot of design in new areas for me and w/o a lot of examples, so I'm going to trudge thru a few DAOs and see how it goes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-112942596464357157?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/112942596464357157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=112942596464357157' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/112942596464357157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/112942596464357157'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/10/broke-ground-wsoap-found-rubies-and.html' title='Broke ground w/SOAP, found Rubies and still not happy'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-112312817594252474</id><published>2005-08-03T21:01:00.000-07:00</published><updated>2005-08-03T21:02:55.946-07:00</updated><title type='text'>VoIP Developer conference update</title><content type='html'>This week I'm attending the VoIP developer conference in San Francisco. Over all, a great show. 1000 people are supposedly attending.&lt;br /&gt;&lt;br /&gt;I gave a talk about sipXconfig. About 30 people showed up. I want to thank Scott and Martin for pluging the session earlier in the day as much as they did.&lt;br /&gt;&lt;br /&gt;Questions that came up after the session were:&lt;br /&gt;&lt;br /&gt;- Question about running sipXconfig as stand-alone. I said there was no packaging as such right now, but that it would be possible very easily.&lt;br /&gt;- Alan Percey from AudioCodes said firmware was important so bootp would be nec.&lt;br /&gt;- Question about running TFTP server on different machine. I said you could use NFS, or write a TFTP service bean that used TFTP's write mechanism to send profiles&lt;br /&gt;- Concern that unsolicted sip NOTIFY to signal phone restart required a proxy. (This can be resolved if we knew the IP address of the phones which is not easy on a brand new phone out of the box. If solved this would remove restriction that a phone needs to be registered inorder to restart but finding the ip address.)&lt;br /&gt;&lt;br /&gt;The keynote from one of the large PBX vendors mentioned how they were going to a web services model to give a higher level API to handling call control. So you could issue a SOAP command to call someone. Obvisously the call doesn't originate from your phone, but if it calls your phone and the other endpoint you wish to talk to, then it's kinda interesting.&lt;br /&gt;&lt;br /&gt;Right now we're using SOAP to configure the system, but this is where I see our web services direction going. Leverage the SIP stack to build a business applications api.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-112312817594252474?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/112312817594252474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=112312817594252474' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/112312817594252474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/112312817594252474'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/08/voip-developer-conference-update.html' title='VoIP Developer conference update'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-112156903028396952</id><published>2005-07-16T19:37:00.000-07:00</published><updated>2005-07-17T17:56:42.070-07:00</updated><title type='text'>sipXconfig code implosion</title><content type='html'>After 1 year and 1 month, sipXconfig developers are almost done rewriting entire application from the ground up(rewrite was not main focus, many features were added in this time). Because all the new code was written parallel to legacy code, there was an implosion last week when all the legacy code was deleted and all that was left was the new code. I had to accumulate some source code metrics to capture this effect.&lt;br /&gt;&lt;br /&gt;This shows LOC (Lines Of Code) for sipXconfig Version 2.8 v.s. Upcoming 3.0 Version. This does not include unittest code, I'm hoping to post code coverage metrics if I get some time. We've reduced codebase by 75%. We still have a number of features to re implement, but i do not predict this number changing that dramatically.&lt;br /&gt;&lt;br /&gt;Lines Of Source Code&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/13269168@N00/26442015/" title="Photo Sharing"&gt;&lt;img src="http://photos22.flickr.com/26442015_5511fcfe7c.jpg" alt="sipxconfig-code-metrics" height="350" width="399" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-112156903028396952?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/112156903028396952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=112156903028396952' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/112156903028396952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/112156903028396952'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/07/sipxconfig-code-implosion.html' title='sipXconfig code implosion'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-112156417900057399</id><published>2005-07-16T17:52:00.000-07:00</published><updated>2005-07-17T06:18:12.543-07:00</updated><title type='text'>it's the aspect, stupid!</title><content type='html'>My infatuation with Spring is official. My significant other knows. We have an understanding. (Which is a lot of fun, since it makes my fellow programmers quite jealous.)&lt;br /&gt;&lt;br /&gt;It turns out that the way to coder's heart goes through aspect oriented programming. This great technique, let's you solve one problem at a time. And Spring empowers you to use it.&lt;br /&gt;&lt;br /&gt;Let's say you have this lengthy operation that should be done asynchronously. In sipXconfig world it usually means replication and until recently no-one dared to speak this term aloud without paying tribute to programming gods. By I digress...&lt;br /&gt;&lt;br /&gt;I get to work. I write the tests. I write the code. After couple of iterations things start working. And now for something completely new. I cannot possibly run replication - which involves opening HTTP connection to sipX servers - in the same thread that builds WEB pages. The last thing our users need is extra coffee breaks, while they wait for page refresh. So I dig out my Java and threads books and start worrying... And then it hits me. The fact that my code runs in a different thread in not a property of my code. It's not even the property of the code that calls my code. It's a different ASPECT (and when I say ASPECT you need to visualize it as a fifth spatial dimension in the coding time-space). I repeat this couple of times in my head. Then I repeat this couple of times to lazyboy, who - as usual - looks unfazed. Just in case he might want to say something, I pretend that I am really busy and I run back to my computer.&lt;br /&gt;&lt;br /&gt;It turns out Spring lets me to write little pieces of code called &lt;a href="http://scm.sipfoundry.org/rep/sipX/main/sipXconfig/neoconf/src/org/sipfoundry/sipxconfig/common/BackgroundTaskInterceptor.java"&gt;interceptors&lt;/a&gt;. I can intercept any method call and do something extra. For example spin the thread, or even better tell a thread pool to do something for me.&lt;br /&gt;&lt;br /&gt;The callers do not see anything different. They call the functions as they always did. Just by changing Spring beans configuration I can change all my beans to asynchronous. Aspect of &lt;i&gt;replicating data&lt;/i&gt; is isolated from aspect of &lt;i&gt;doing things in the background&lt;/i&gt;. And you code, test and implement one aspect at a time.&lt;br /&gt;&lt;br /&gt;This experience comes handy couple of days later when I integrate Apache XML/RPC client. This is how sipXconfig will communicate with sipX servers in future. But I do not want to expose this fact in every sipXconfig corner. I do not want to write entire isolation layer of code either. Turns out I do not have to. Again thanks to the ASPECT. Just as calling stuff asynchronously, calling stuff through XML/RPC can be handled by Invoker. Good Spring people do not have XML/RPC invoker, but writing one turns out to be &lt;a href="http://scm.sipfoundry.org/rep/sipX/main/sipXconfig/neoconf/src/org/sipfoundry/sipxconfig/xmlrpc/"&gt;trivial&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And again - the code that calls my beans does not even know that implementation of the interface lives on sipX server. Xmlrpc-iness is magically injected in the configuration file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-112156417900057399?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/112156417900057399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=112156417900057399' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/112156417900057399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/112156417900057399'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/07/its-aspect-stupid.html' title='it&apos;s the aspect, stupid!'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-112156066966600211</id><published>2005-07-16T17:02:00.000-07:00</published><updated>2005-07-16T17:46:46.260-07:00</updated><title type='text'>may be it is rocket science after all</title><content type='html'>It's 2005 and you still cannot spend weekends on the &lt;a href="http://en.wikipedia.org/wiki/Asteroid_Belt"&gt;Asteroid Belt&lt;/a&gt;. Every geek I know is seriously depressed by that. Instead, bunch of smart people is spending weekend debugging stupid fuel indicator on Discovery.&lt;br /&gt;&lt;br /&gt;That made me think about unit testing. Pretty much eveything does these days. Some time ago I have read &lt;a href="http://www.theatlantic.com/issues/2003/11/index.htm"&gt;Columbia Last Flight&lt;/a&gt;. By now everyone knows about that fatal piece of foam that smashed into Columbia's wing during lift off. Apparently for a long time, despite of increasing evidence, some NASA engineers could not accept that. They decided to test the "foam did it" hypothesis. They were actually shooting foam pieces into shuttle panels and monitoring the damage. William Langewiesche in his Atlantic Monthly article describes the critical test: &lt;span style="font-style:italic;"&gt;The gun fired, and the foam hit the panel at a 25-degree relative angle at about 500 mph. Immediately afterward an audible gasp went through the crowd. The foam had knocked a hole in the RCC large enough to allow people to put their heads through.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I like to think that this is what happens when you type "ant test-all". A gun is fired, big piece of foam hits sipXconfig code, damage is assesed. There are no gasps, just test report. And if there is a hole, no-one's life depends on it. (Well, there is this e-mail from lazyboy with your morning coffee.)&lt;br /&gt;&lt;br /&gt;Now the sick part: it almost makes the lack of Asteroid Belt vacation package bearable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-112156066966600211?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/112156066966600211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=112156066966600211' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/112156066966600211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/112156066966600211'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/07/may-be-it-is-rocket-science-after-all.html' title='may be it is rocket science after all'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-111971161022158104</id><published>2005-06-25T07:52:00.000-07:00</published><updated>2005-06-25T08:08:59.646-07:00</updated><title type='text'>resonance</title><content type='html'>Contributing to sipXconfig is one of the most exciting things in my career as a software developer. I blame “open source resonance” for that. We programmers are a lazy bunch. It’s a good thing too. I did work in the past with coders that were not lazy and could write code faster than I could delete it – what a pain!&lt;br /&gt;&lt;br /&gt;And, since we are lazy, we hate doing stuff over and over again. This is what computers are for. People are for pressing buttons and enjoying a nice glass of their favorite non-alcoholic beverage on quiet evenings on the shore of &lt;a href="http://en.wikipedia.org/wiki/Image:Lake-geneva.jpg"&gt;Lake Geneva&lt;/a&gt; (not that I ever enjoyed a quiet evening there, but I suppose every lake deserves a mention in our blog from time to time).&lt;br /&gt;&lt;br /&gt;Here’s the impressive list of libraries and tools that sipXconfig is benefiting from. I cannot possibly enumerate all, but I’ll try:&lt;br /&gt;&lt;br /&gt;The “big three”:&lt;br /&gt;- Spring – &lt;a href="http://news.bbc.co.uk/2/hi/europe/4115164.stm"&gt;a new plumbing&lt;/a&gt; of sipXconfig – declarative dependency manager that behind the scenes performs a magical incantations on our humble Java objects&lt;br /&gt;- Hibernate – crosses the digital divide between object universe of Java and table universe of databases&lt;br /&gt;- Tapestry – encapsulates weird WEB protocols and technologies into cute reusable components meaning there is a chance we will finally have a consistent UI and will be able to forget about copy and paste option in our text editors&lt;br /&gt;&lt;br /&gt;Silent friend:&lt;br /&gt;Eclipse – our development environment with refactoring support, amazing code browsing capabilities, supernatural auto-completion, and last but not least a satisfied green bar of all test passed. Everyday is discovery, every versions brings a new set of goodies meaning that more can be done in less keystrokes. Suddenly your typing skills are less important than the problem you are attempting to solve.&lt;br /&gt;&lt;br /&gt;The risk enablers:&lt;br /&gt;JUnit and family – DBUnit, XMLUnit, WebUnit, HTTPUnit etc. - these guys are responsible for the fact that we can add features and fix bugs till the very late in the release cycle, they ensure that 95% of our nightly builds are actually quite usable, they empower bold architecture changes, they ban code areas that no-one wants to touch because the last person who understood how they worked died in the &lt;a href="http://en.wikipedia.org/wiki/Great_Fire_of_London"&gt;Great Fire of London&lt;/a&gt;; they improve our design, and - if we do stupid things - they leave light out there so that we know how to safely back off&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Also all jakarta libraries, checkstyle, dom4j, xerces, digester, postgres, jetty, tomcat, cglib, ognl, subversion: none posible without open source. Open source friendly bug track and test coverage tool (JIRA and clover) deserve an honorable mention too.&lt;br /&gt;&lt;br /&gt;So we are indebted: and that’s why we post from time on Tapestry or Spring list showing others how we solved some problems. (Well that, and the fact that we are terrible show-offs and attention seekers.)&lt;br /&gt;&lt;br /&gt;And that’s why we hope that more and more people will want to contribute to sipXconfig – filing bugs, implementing new phones or gateways, writing wiki notes. We want to get to the point the resonance works for us too. And when we get there, you’ll be able to manage your toaster with sipXconfig. That reminds me of something. I wonder what is this strange smell from the kitchen....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-111971161022158104?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/111971161022158104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=111971161022158104' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111971161022158104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111971161022158104'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/06/resonance.html' title='resonance'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-111825512924152357</id><published>2005-06-08T11:21:00.000-07:00</published><updated>2005-06-09T05:53:33.116-07:00</updated><title type='text'>Where Were You When sipXconfig Hit 1000</title><content type='html'>&lt;pre&gt;&lt;br /&gt;Transmitting file data ......&lt;br /&gt;Committed revision 991.&lt;br /&gt;&lt;br /&gt;Transmitting file data ......&lt;br /&gt;Committed revision 992.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Where were you when sipXconfig hit it's 1000th checkin? Well it hasn't happened yet, but like Dick Clark's reflection on the year leading up to New Year's Day, it's time to reflect on all the special events that have happened to sipXconfig in it's life inside subversion.&lt;br /&gt;&lt;br /&gt;And so it started 11 months, 343 days ago.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;r1 | bob | 2004-06-21 12:01:50 -0400 (Mon, 21 Jun 2004) | 3 lines&lt;br /&gt;&lt;br /&gt;initial check-in&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Damian joins the fray.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;r86 | dkrzemin | 2004-10-18 15:37:29 -0400 (Mon, 18 Oct 2004) | 4 lines&lt;br /&gt;&lt;br /&gt;XCF-40 fix:&lt;br /&gt;- subant redefinition pulled out of subant-defs target and replaced with my.subant definition&lt;br /&gt;- subant-defs target removed&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Checkstyle was added, what a beautiful thing.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;r150 | dkrzemin | 2004-11-17 19:39:32 -0500 (Wed, 17 Nov 2004) | 1 line&lt;br /&gt;&lt;br /&gt;Initial support for running checkstyle during build added.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Immediately after, Neoconf what is now half way to becoming complete replacement of all previously existing EJB code, then just a gleam in my eye.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;r151 | lazyboy | 2004-11-18 11:09:42 -0500 (Thu, 18 Nov 2004) | 1 line&lt;br /&gt;&lt;br /&gt;Add Neoconf module (at this time optional see neoconf in manual) the evolution revolution! &lt;br /&gt;Add hooks to turn debugging on thru env. var.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Tapestry introduced, what is also now half way to becoming complete replacement of all JSP pages.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;r255 | lazyboy | 2004-12-15 18:15:52 -0500 (Wed, 15 Dec 2004) | 1 line&lt;br /&gt;&lt;br /&gt;Include some experimental tapestry code - coexists with JSF&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;JBoss is upgraded from 2.4.4, to 4.0. The "Mount Everest" of challenges Damian met face-to-face! This was the first on ongoing ripples in the JBoss upgrade pond.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;r228 | dkrzemin | 2004-12-10 20:05:57 -0500 (Fri, 10 Dec 2004) | 1 line&lt;br /&gt;&lt;br /&gt;JBoss4 upgrade: unused tags referencing removed classes deleted&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;HTTP Unit tests were added, another beautiful thing.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;r318 | dkrzemin | 2005-01-06 19:11:41 -0500 (Thu, 06 Jan 2005) | 2 lines&lt;br /&gt;&lt;br /&gt;httpunit tests added - for now can be run from Eclipse only&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Damian he's so honest...I would try to claim I was fixing a bug.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;r569 | dkrzemin | 2005-02-28 14:02:20 -0500 (Mon, 28 Feb 2005) | 2 lines&lt;br /&gt;&lt;br /&gt;undoing erroneous commit&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;On our way to 3.0 release, best one yet.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;r626 | ajorde | 2005-03-14 10:30:45 -0500 (Mon, 14 Mar 2005) | 1 line&lt;br /&gt;&lt;br /&gt;Bumping version up to 2.9.0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Code contribution from Hannu Strang, sipXconfig's first from community.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;r838 | lazyboy | 2005-04-30 01:57:08 -0400 (Sat, 30 Apr 2005) | 1 line&lt;br /&gt;&lt;br /&gt;XCF-306 Initial support for Cisco 7960, 7940, 7912, 7905 and ata18x devices in neoconf library. &lt;br /&gt;Integrated contribution from Hannu Strang.  Still a lot of work to do to replace support for&lt;br /&gt;cisco devices in old model including group support.  Stilll need to refactor to reuse code&lt;br /&gt;between polycom, add encryption support and fix settings losing order&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Run in with the law.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;r850 | dkrzemin | 2005-05-03 16:04:41 -0400 (Tue, 03 May 2005) | 1 line&lt;br /&gt;&lt;br /&gt;subversion police: unix specific files should have LF as a newline characterr&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Remove nasty requirement to install generated certificate authority into Java's VM.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;r951 | lazyboy | 2005-05-31 15:52:16 -0400 (Tue, 31 May 2005) | 1 line&lt;br /&gt;&lt;br /&gt;XCF-397 - Separate truststore into separate file&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Damian finds ingenious way to configure hunt groups using aliases and flexible SIP messaging techniques&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;r983 | dkrzemin | 2005-06-06 19:22:05 -0400 (Mon, 06 Jun 2005) | 1 line&lt;br /&gt;&lt;br /&gt;XCF-343 - generate aliases with sipx-noroute parameter&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-111825512924152357?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/111825512924152357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=111825512924152357' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111825512924152357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111825512924152357'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/06/where-were-you-when-sipxconfig-hit.html' title='Where Were You When sipXconfig Hit 1000'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-111668011146603912</id><published>2005-05-21T05:35:00.000-07:00</published><updated>2005-05-21T07:27:53.493-07:00</updated><title type='text'>Our baby needs a type system</title><content type='html'>sipXconfig is growing up. And looks like it needs a setting type system. It's a frightening moment in the lives of proud parents. The teething problems are over (meaning we have settings), and it's time to start saving for college. The panic starts: which bank (which types we support), which tax deductible option (XML mark-up anyone?) and finally: where to take the money from (we do have so many other things to work on).&lt;br /&gt;&lt;br /&gt;OK. Enough with the lousy metaphor... &lt;br /&gt;&lt;br /&gt;The problem at hand: all our settings are strings. And I do not mean internal representation only. We treat them as strings across the board. Which makes it really cumbersome to implement any type of input validation or custom renderers. The natural solution would be to allow model designers to specify the type of the settings and the constraint of this type in the XML file. The problem is there is so many options to choose from. We want flexibility and extensibility: user defined enumerations that can be reused for multiple settings. But most importantly we want simplicity. We certainly do not want to roll out a new "type markup" language. One can very easily go overboard with that - just look at XML schema.&lt;br /&gt;&lt;br /&gt;So I am thinking we start small and see where it takes us:&lt;br /&gt;&lt;br /&gt;- number (integer) with min and max constraints&lt;br /&gt;- string with regular expression constraint&lt;br /&gt;- string with password constraint&lt;br /&gt;- enumeration with labels and values&lt;br /&gt;&lt;br /&gt;Every type will have a preferred renderer - in case of Tapestry widgets that would be NumericField, ValidField and PropertySelection. With time we figure out how to allow for custom renderers, user defined types etc.&lt;br /&gt;&lt;br /&gt;This should keep us occupied for a while...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-111668011146603912?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/111668011146603912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=111668011146603912' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111668011146603912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111668011146603912'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/05/our-baby-needs-type-system.html' title='Our baby needs a type system'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-111516761818992295</id><published>2005-05-03T17:40:00.000-07:00</published><updated>2005-05-03T18:23:53.166-07:00</updated><title type='text'>Ajax and Tapestry</title><content type='html'>Looks like &lt;a href="http://www.adaptivepath.com/publications/essays/archives/000385.php"&gt;Ajax&lt;/a&gt; and similar technologies (partial page rendering, micro posts and other kind of magic) are becoming more and more popular. They look cool, they are fast, and at least when one uses proper technology they are not difficult to implement.&lt;br /&gt;&lt;br /&gt;I was a bit envious about Ajax components implemented in the world of JSP and &lt;a href="http://www.ajaxfaces.com/"&gt;Java Server Faces&lt;/a&gt;, but I also found &lt;a href="http://tacos.mine.nu:8080/tacos-demo/app?service=page/Home"&gt;this&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Partial Form and Partial Rendering is exactly what I needed for some time. I am going to try it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-111516761818992295?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/111516761818992295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=111516761818992295' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111516761818992295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111516761818992295'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/05/ajax-and-tapestry.html' title='Ajax and Tapestry'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-111336475315356230</id><published>2005-04-12T19:59:00.000-07:00</published><updated>2005-04-12T20:59:13.156-07:00</updated><title type='text'>Folders v.s. Tags</title><content type='html'>Flickr, Del.icio.us and gmail use a concept called "tags" or "labels" to organize images, bookmarks and email respectively.  Create tags as you go, items can have mulitple tags giving you a cross index. Not a new concept, but an "advanced" one,  for the general public.&lt;br /&gt;&lt;br /&gt;sipXconfig uses the classic Folders everyone understands, but there are a couple of limitations I hate.  You create folders first then add items.  Items can only be in one folder. &lt;br /&gt;&lt;br /&gt;So in sipXconfig's situation, if a admin is trying to manage 10,000 users and their phones clearly they need two things above all else:&lt;br /&gt;    Organize items  so even someone who didn't setup the system can find things (drill down)&lt;br /&gt;    Allow admins to share settings between the items. &lt;br /&gt;&lt;br /&gt;The only customer in the thousand item range has done what most admins would do, create 100 folders in preparation for settings that may need to be different.   Like single-heirarchy systems, it's relatively straightforward, if not cumbersome, to find items by drilling thru nested folders, but it's hard to change how settings are shared between folders without major restructuring.  In addition, restructuring may be in conflict with goal to organize items so they're easy to find.&lt;br /&gt;&lt;br /&gt;sipXconfig as Tags provides a lot of flexiblity when applying settings.  An admin can add  phones to the system and tag them with as many qualifiers that match their need at the time  Example  tags: "sales experimental"  or "downstairs lobby 340-ata" or "engineering george".  Physical location, models, user or users audience. &lt;br /&gt;&lt;br /&gt;Million dollar questions: if search is good enough, do you have provide users the ability to "drill-down" through items and would it confuse them that items may show up in multiple places.  Is this a user issue or a presentation issue?  Also, I hesitate using the word "tag" and would like to use "folder" but this may be trying to pass an old dog as a new pony and confuse everyone.&lt;br /&gt;&lt;br /&gt;Writing out load, do both.  Use folders, first, as a organizational mechanism. Folder names are unique across the system, items can only be in one folder.  If an admin wants to attach additional "tags" to an item, they can do that w/o affecting it's folder heirarchy. Kinda like ruby language, single inheritence but has mixins.  Best of both worlds, but not clear how to convey this concept even to the advanced admins.  Of course, in agile terms, sipXconfig could just support folders for now but design in a way to  leave opportunity for "tags" if/when there's a demand.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-111336475315356230?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/111336475315356230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=111336475315356230' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111336475315356230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111336475315356230'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/04/folders-vs-tags.html' title='Folders v.s. Tags'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-111299310054462966</id><published>2005-04-08T13:28:00.000-07:00</published><updated>2005-04-12T19:59:40.883-07:00</updated><title type='text'>XFire SOAP support is nice</title><content type='html'>Currently we're using Axis SOAP that comes w/JBOSS. We're moving away from JBoss and all the code written in JBoss so it's as good as time as any to seek alternatives. Using Spring has made me lazy. Create classes and interfaces for what I do and everything else is just configuration of what to do w/those interfaces. So XFire is all about that too, give it the interfaces and let it register it as SOAP service, generated the WSDL, and even generate the client stubs which I plan to use for testing right now. Real SOAP clients are in C++ and perl. I hope XFire plays nice with C's csoap library implementation and Perl's SOAP::Lite.&lt;br /&gt;&lt;br /&gt;So in my business library project, neoconf, I don't have any SOAP library dependencies&lt;br /&gt;&lt;br /&gt;interface  MyService {&lt;br /&gt;    void String basicMethodWithBasicParams(String basic, int basicToo);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;and it's not until my web project that I expose this interface in web.xml and myservice-xfire.xml and that contains no code.&lt;br /&gt;&lt;br /&gt;NICE!&lt;br /&gt;&lt;br /&gt;Took some doing to get XFire to build. Followed directions on website w/a little help from mailing list about maven issues, of which I know little about.&lt;br /&gt;&lt;br /&gt;I am a bit worried about all the dependencies:&lt;br /&gt;file="${wsdl4j.jar}"&lt;br /&gt;file="${wsdl4j-qname.jar}"&lt;br /&gt;file="${stax.jar}"&lt;br /&gt;file="${stax-api.jar}"&lt;br /&gt;file="${javamail.jar}"&lt;br /&gt;file="${activation.jar}"&lt;br /&gt;file="${yom.jar}"&lt;br /&gt;&lt;br /&gt;for client&lt;br /&gt;file="${xbean.jar}"&lt;br /&gt;file="${velocity.jar}"&lt;br /&gt;&lt;br /&gt;But worth the price, and can't complain I'm sure it make the library very capable by leveraging other libraries.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-111299310054462966?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/111299310054462966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=111299310054462966' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111299310054462966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111299310054462966'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/04/xfire-soap-support-is-nice.html' title='XFire SOAP support is nice'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-111266668391015782</id><published>2005-04-04T19:03:00.000-07:00</published><updated>2005-04-04T19:04:43.913-07:00</updated><title type='text'>JBOSS in anger, years after</title><content type='html'>Starting with sipXconfig 2.8, progess has been made towards porting  existing codebase from JBoss and JSPs to Spring Framework, Tapestry and  Hibernate (TapSprHib).  It's not that JBoss is an inferior technology,  it just doesn't meet   sipXconfig requirements anymore. Here my current  comparison&lt;br /&gt;- Memory requirements&lt;br /&gt;   o 400MB RAM with JBoss - JBoss 4.0.1 currently starts at 320MB and  can grow to 400MB shortly after running.  It can grow even more  depending on what you're doing&lt;br /&gt;   o 60MB RAM with TapSprHib, this will grow as more is code is ported  and libraries evolve but should stay in 100MB ballpark&lt;br /&gt;- Startup times&lt;br /&gt;   o 1 minute, 57 secs with JBoss. This has already come down from even  longer startup times by disabling many services. It's possible a few  more could be disabled&lt;br /&gt;   o 11 seconds with TapSprHib&lt;br /&gt;- Installation/Deployment&lt;br /&gt;   o installing jboss from tarball requires many manual steps including:&lt;br /&gt;      - patching JBoss installation&lt;br /&gt;      - copying in certs.&lt;br /&gt;      - setting file system permissions properly&lt;br /&gt;     Binary (e.g. RPM) installation is easier but this has other issues&lt;br /&gt;       - maintenance of custom RPM for SIPfoundry&lt;br /&gt;       - availability on other distributions is limited or behind in  versions&lt;br /&gt;       - either limits development to work on 1 copy at a time or  complicates&lt;br /&gt;           develop environment&lt;br /&gt;   o none  - embedded Jetty jar file with 1 embedded configuration file&lt;br /&gt;- Download/HD requirements&lt;br /&gt;  - 60MB+ as separate download for JBoss&lt;br /&gt;  - 4MB as part of sipXconfig download. This is a total of Jetty,  Tapestry and Spring jars. Hibernate not included because its required  for both&lt;br /&gt;&lt;br /&gt;From these numbers, JBOSS is better suited for high-end enterprise  systems, not as a transparent, integrated, web admin tool.  EJB 3.0 spec  and subsequently JBoss is evolving in an encouraging direction but it  may be too little and it's certainly too late for sipXconfig.  &lt;br /&gt;Damian and I have already ported roughly 20%  when refactoring daling  plans, gateway management, managed polycom phone support.  Damian and I  will take a similiar tactic for sipX 3.0.  Unfortunately users won't see  the fruits of our labor until JBoss can be removed entirely. I logged  the remaining portions of the port in the sipXconfig bug database as  tasks: XCF-293 through XCF-306.  I roughly estimated 60 man days to port  remaining portions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-111266668391015782?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/111266668391015782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=111266668391015782' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111266668391015782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111266668391015782'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/04/jboss-in-anger-years-after.html' title='JBOSS in anger, years after'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-111236963372871092</id><published>2005-04-01T07:27:00.000-08:00</published><updated>2005-04-01T07:41:32.153-08:00</updated><title type='text'>FireFox for WEB developement</title><content type='html'>&lt;a href="http://www.chrispederick.com/work/firefox/webdeveloper/"&gt;WebDeveloper&lt;/a&gt; is an extremely useful FF extensions that help with WEB pages design, reverse engineering and specifically with testing CSS.&lt;br /&gt;&lt;br /&gt;My favorite feature: you can get click on any item on the screen and see all CSS styling that influence its apperance (CSS-&gt;View Style Information)&lt;br /&gt;&lt;br /&gt;You can hide the toolbar if you happen to use FF just for browsing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-111236963372871092?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/111236963372871092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=111236963372871092' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111236963372871092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111236963372871092'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/04/firefox-for-web-developement.html' title='FireFox for WEB developement'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-111204358785661852</id><published>2005-03-28T12:53:00.000-08:00</published><updated>2005-04-01T07:27:05.026-08:00</updated><title type='text'>reasons not to overuse XSLT</title><content type='html'>I fixed a &lt;a href="http://track.sipfoundry.org/browse/XCF-112?page=comments#action_12326"&gt;bug&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This is why I dislike overusing XSLT. We take the data from couple of different sources, cram it into XML document and generate HTML page through XSLT transformation. There are at least two really bad things here:&lt;br /&gt;&lt;ol&gt;   &lt;li&gt;We are passing data between different application components as XLOBs (XML Large Objects (tm) &lt;span style="font-style: italic;"&gt;&lt;/span&gt;). I do not care about how ineffective it is, I do care about how non-transparent it is. You never know what someone decided to put into that XML and you never know who and what depends on its content.&lt;/li&gt;   &lt;li&gt;We are using XSLT to apply bussines logic. In this case to decide which components are editable and which are read only. Aa a result our &lt;span style="font-style: italic;"&gt;UI code&lt;/span&gt; is hopelessly hidden in the ocean of bussiness logic writen in poorly designed and not especially convenient programming language (XSLT).&lt;/li&gt; &lt;/ol&gt; The bottom line is template based approach (JSP, Velocity, XSLT) quite often degenerates in the heavy proprietary scripring, where template stops resembling your destination document (which is the main reason to use the template after all). I think I prefer Tapestry to JSP, DOM4J/JDOM/Xstream to Velocity, Java/Python/Groovy to XSLT. Also &lt;a href="http://nobelprize.org/literature/laureates/1996/poems-4-e.html"&gt;I prefer cats&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-111204358785661852?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/111204358785661852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=111204358785661852' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111204358785661852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111204358785661852'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/03/reasons-not-to-overuse-xslt.html' title='reasons not to overuse XSLT'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-111169419878604307</id><published>2005-03-24T11:48:00.000-08:00</published><updated>2005-03-24T11:56:38.786-08:00</updated><title type='text'>Tapestry components repositories</title><content type='html'>Since Tapestry related tools are using a lot of real world terminology it's virtually impossible to look for anything Tapestry related on google (try Tapestry, Spindle, Tassel and see what you find).&lt;br /&gt;&lt;br /&gt;This is a list of Tapestry components repositories that I know of:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;&lt;a href="http://tapestry-bayeux.sourceforge.net/"&gt;http://tapestry-bayeux.sourceforge.net/&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://equalitylearning.org/Tassel/app"&gt;http://equalitylearning.org/Tassel/app&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://www.t-deli.com/"&gt;http://www.t-deli.com/&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://wiki.apache.org/jakarta-tapestry/ExtraComponents"&gt;http://wiki.apache.org/jakarta-tapestry/ExtraComponents&lt;/a&gt;&lt;br /&gt;  &lt;/li&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-111169419878604307?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/111169419878604307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=111169419878604307' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111169419878604307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111169419878604307'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/03/tapestry-components-repositories.html' title='Tapestry components repositories'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-111109769652430791</id><published>2005-03-17T14:03:00.000-08:00</published><updated>2005-03-17T14:14:56.526-08:00</updated><title type='text'>Tapestry in anger: pitfall #12141</title><content type='html'>You cannot validate your page when the form tag is in an embedded component because the IValidationDelegate.hasErrors() will not process the components form elements until it's too late.&lt;br /&gt;&lt;br /&gt;So mypage.page (pseudo code)&lt;br /&gt;&lt;blockquote&gt; mycomponent&lt;br /&gt;submit button [w/listener=page.doit]&lt;/blockquote&gt;&lt;br /&gt;mycomponent.jwc&lt;br /&gt;&lt;blockquote&gt;form tag&lt;br /&gt;form element w/validator defined&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;MyPage.java&lt;br /&gt;&lt;blockquote&gt; doIt() {&lt;br /&gt;    IValidationDelegate delegate = (IValidationDelegate) getBeans().getBean("validator");&lt;br /&gt;    // INVALID: form elements in component has not asked to validate yet!&lt;br /&gt;    boolean save = !delegate.getHasErrors();&lt;br /&gt; }&lt;/blockquote&gt;&lt;br /&gt;So I rewrote this so the form tag is in the page and now it works fine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-111109769652430791?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/111109769652430791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=111109769652430791' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111109769652430791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111109769652430791'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/03/tapestry-in-anger-pitfall-12141.html' title='Tapestry in anger: pitfall #12141'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-111108688378240215</id><published>2005-03-17T11:12:00.000-08:00</published><updated>2005-03-17T11:14:43.783-08:00</updated><title type='text'>Tapestry: accessing validators from components</title><content type='html'>binding name="validator" expression="page.global.validXXX"&lt;br /&gt;&lt;br /&gt;This works for accessing all global data from components, use judicisouly, as components make assumptions about page they're in&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-111108688378240215?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/111108688378240215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=111108688378240215' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111108688378240215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111108688378240215'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/03/tapestry-accessing-validators-from.html' title='Tapestry: accessing validators from components'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-111055595634844989</id><published>2005-03-11T07:42:00.000-08:00</published><updated>2005-03-11T07:45:56.350-08:00</updated><title type='text'>logging according to lazyboy</title><content type='html'>Apparently this is how one should use commons logging in sipXconfig:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;// define logger as private static final field&lt;br /&gt;private static final Log LOG = LogFactory.getLog(SipServiceImpl.class);&lt;br /&gt;&lt;br /&gt;// use it&lt;br /&gt;LOG.info("blah");&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The output goes to server.log&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-111055595634844989?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/111055595634844989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=111055595634844989' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111055595634844989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111055595634844989'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/03/logging-according-to-lazyboy.html' title='logging according to lazyboy'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-111042669014744588</id><published>2005-03-09T19:50:00.000-08:00</published><updated>2005-03-09T19:55:55.500-08:00</updated><title type='text'>Damian's flowers</title><content type='html'>&lt;img src="http://photos4.flickr.com/6231289_f7b972acd5_m.jpg"/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-111042669014744588?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/111042669014744588/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=111042669014744588' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111042669014744588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111042669014744588'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/03/damians-flowers.html' title='Damian&apos;s flowers'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-111040851795588931</id><published>2005-03-09T17:48:00.000-08:00</published><updated>2005-03-09T14:48:37.956-08:00</updated><title type='text'>Strategy for binding Interface implementations from Spring with Hibernate object</title><content type='html'>This is a very esoteric blog, it's more of a mental memory dump for myself incase I ever need to recall this "design pattern"&lt;br /&gt;&lt;br /&gt;Actors:&lt;br /&gt; 1. Phone interface&lt;br /&gt; 2. Vendor's Phone interface implementation&lt;br /&gt; 3. PhoneData hibernate object  w/access to perisent data for all phones&lt;br /&gt; 4. Line interface&lt;br /&gt; 5. Vendor's Line interface implementation&lt;br /&gt; 6. LineData hibernate object w/access to perisent data for all lines&lt;br /&gt;&lt;br /&gt;Goals:&lt;br /&gt; 1. Let interface be service driven, easy to implement&lt;br /&gt; 2. Let database store simple properties and not burden implementation with menial getter and setters and allow interface and persistent objects to evolve independently of each other&lt;br /&gt;&lt;br /&gt;Challenge:&lt;br /&gt;Phones have 1-to-many relationship with lines and hibernate is great at dealing w/that however hiding data objects at least when it comes to adding and deleting lines becomes very difficult.&lt;br /&gt;&lt;br /&gt;Knowns:&lt;br /&gt;Dao needs to wrap each read/write of data objects to return interface implentations. Therefore fancy queries that return complex object graphs are not really useful.&lt;br /&gt;&lt;br /&gt;Solution:&lt;br /&gt;Given that all queries need to be "wrapped" advantage of having hibernate manage the collection is minimal.  Therefore, if phone interface manages a "simple" collection, Dao can read/write collection in only a few isolated places.  I say "simple" because one trick is being able to recall what lines need to be deleted. A simple Collection subclass handled this trick.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-111040851795588931?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/111040851795588931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=111040851795588931' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111040851795588931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111040851795588931'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/03/strategy-for-binding-interface.html' title='Strategy for binding Interface implementations from Spring with Hibernate object'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-111040675052037179</id><published>2005-03-09T13:40:00.000-08:00</published><updated>2005-03-09T14:19:10.520-08:00</updated><title type='text'>hibernate: deleting objects w/unsaved references</title><content type='html'>Hibernate Gotcha #104312&lt;br /&gt;&lt;br /&gt;  Error: object references an unsaved transient instance - save the transient instance before flushing&lt;br /&gt;&lt;br /&gt;  Senario: I was deleting an object that had a reference to an unsaved object.  Why would i try to add a new object to an object that's about to be deleted? Improper logic, but, not exactly illegal.  Now I null out the reference and it's happy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-111040675052037179?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/111040675052037179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=111040675052037179' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111040675052037179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111040675052037179'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/03/hibernate-deleting-objects-wunsaved.html' title='hibernate: deleting objects w/unsaved references'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-111039674062345057</id><published>2005-03-09T11:15:00.000-08:00</published><updated>2005-03-09T13:12:59.736-08:00</updated><title type='text'>DBUnit seed data, use high primary ids</title><content type='html'>Using dbunit w/postgres, or any db that uses sequence numbers, is challenging. I just spent half a day finding out why seed data should contain primary keys starting at high numbers, say 1000.&lt;br /&gt;&lt;br /&gt;Senario:&lt;br /&gt;1.) create new db&lt;br /&gt;2.) insert a new row with primary key = 1 in dbunit seed file. NOTE: Dbunit does not update sequence numbers. (if this scares you, it should, almost ditched it thinking it was going to be useless, but for some reason I decided this could be worked around)&lt;br /&gt;3.) write a test that adds a new object from db business layer, if this is your first unittest, it will pick primary key = 1 as well and will throw an error. You would think the error would be obvisous, but I didn't "get it" from this hibernate/spring but from lot of debugging:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;pre&gt;org.springframework.orm.hibernate.HibernateSystemException:&lt;br /&gt;a different object with the same identifier value was&lt;br /&gt;already associated withthe session: 1,of class:&lt;br /&gt;org.sipfoundry.sipxconfig.phone.LineMetaData; nested&lt;br /&gt;exception is net.sf.hibernate.NonUniqueObjectException:&lt;br /&gt;a different object with the same identifier value was&lt;br /&gt;already associated with the session: 1, of class:&lt;br /&gt;org.sipfoundry.sipxconfig.phone.LineMetaData&lt;br /&gt;net.sf.hibernate.NonUniqueObjectException: a different&lt;br /&gt;object with the same identifier value was already&lt;br /&gt;associated with the session: 1, of class:&lt;br /&gt;org.sipfoundry.sipxconfig.phone.LineMetaData&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-111039674062345057?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/111039674062345057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=111039674062345057' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111039674062345057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111039674062345057'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/03/dbunit-seed-data-use-high-primary-ids.html' title='DBUnit seed data, use high primary ids'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-111002003485375996</id><published>2005-03-05T02:53:00.000-08:00</published><updated>2005-03-09T11:15:36.246-08:00</updated><title type='text'>Spring's AOP Major limitation</title><content type='html'>&lt;p class="mobile-post"&gt;Apparently Spring with only affect bean classes it loaded thru it's application context files. Considering it weaves code at runtime, this makes sense. Knowing this, it can still be useful, but it's not in the same league as AspectJ.&lt;/p&gt; &lt;p class="mobile-post"&gt;So using Spring's AOP to dump particular Hibernate exceptions that wrap SQL exceptions in unittests won't be that straigtforward, I'd have to wrap each DAO with yet another proxy layer. It won't be long before people start talking about the "AOP Proxy Stack".&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-111002003485375996?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/111002003485375996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=111002003485375996' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111002003485375996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/111002003485375996'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/03/springs-aop-major-limitation.html' title='Spring&apos;s AOP Major limitation'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-110989513294137498</id><published>2005-03-03T16:01:00.000-08:00</published><updated>2005-03-03T16:12:12.943-08:00</updated><title type='text'>Tapestry contrib:Table without paging</title><content type='html'>Turns out the default page size of the &lt;a href="http://jakarta.apache.org/tapestry/doc/ComponentReference/contrib.Table.html"&gt;table&lt;/a&gt; component is 10. It is controlled by pageSize parameter. I could not locate any documentation on how to turn off paging altogether. In the code it looks like any negative value should result in rendering only one (possible long) page.&lt;br /&gt;&lt;br /&gt;I am not sure if we should increase the default to some reasonable value (25, 50?) or just set it to -1 on the tables that we pretty much know are not going to have many entries (Gateways, Dial Plans).&lt;br /&gt;&lt;br /&gt;I do not think there is a way to change the default globally (it's a static constant). So it looks like we are have to touch the code on all the pages...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-110989513294137498?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/110989513294137498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=110989513294137498' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/110989513294137498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/110989513294137498'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/03/tapestry-contribtable-without-paging.html' title='Tapestry contrib:Table without paging'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-110972276949955186</id><published>2005-03-01T15:57:00.000-08:00</published><updated>2005-03-01T16:19:29.503-08:00</updated><title type='text'>autowire mode for spring beans and unit testing</title><content type='html'>I was playing with several ways of setting up 2 slightly different Spring application context. One for Unit testing, another for real application. I guess classical way of doing it is to split bean factory xml into 3 parts - one that is common, the second that is used in unit test only, and the third one used in application only.&lt;br /&gt;However in some cases when application context for unit test can be a subset of real application context, one can use autowire trick. Setting bean &lt;span style="font-style: italic;"&gt;autowire&lt;/span&gt; attribute to &lt;span style="font-style: italic;"&gt;byType&lt;/span&gt; will cause Spring to locate the singletons of a given type to initialize bean properties automatically. If there is more than one candidate Spring will complain. However if there are none, no error is reported and the property remains uninitialized.&lt;br /&gt;We could employ this trick by defining "application only" beans (for example beans than need JNDI) in a separate file and include this file only in real application context. Unit test application context will not find it and as a result some bean properties in common files remain unset (null). You can either mock them, or ignore the fact that they are null if they are not needed.&lt;br /&gt;I have some misgivings about using autowire mode in general, but something has to be said about more concise bean definition. For example one does not have to explicitly initialize hibernate session in each DAO.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-110972276949955186?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/110972276949955186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=110972276949955186' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/110972276949955186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/110972276949955186'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/03/autowire-mode-for-spring-beans-and.html' title='autowire mode for spring beans and unit testing'/><author><name>Damian</name><uri>http://www.blogger.com/profile/13846398723927532974</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_ib_P-BLTaFo/TH-5By-hO9I/AAAAAAAAGZM/C__vogGgx_E/S220/Profile.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-110933928254460440</id><published>2005-02-25T05:24:00.000-08:00</published><updated>2005-02-25T05:48:02.546-08:00</updated><title type='text'>Latest thinking on hibernate session</title><content type='html'>Spring's Hibernate interceptors and FlushingSpringSessionInViewFilter are really incompatible.  According to Hibernate manual "9.4.1 Updating in the same Session" and "9.4.2 Updating detached objects"  UI's are more inclind to open/close session at DAO interface thus requiring save and flush methods.  The FlushingSpringSessionInViewFilter would allow you to avoid having to write save/update methods which is cool in theory, but forms ought-not edit real business objects attached to session because they will get peristed on every form submit!  Even worse a harmless query can trigger an automatic save (See javadoc on FLUSH_AUTO, I tested this and it does as it says).&lt;br /&gt;&lt;br /&gt;Alternative include delegating every form input to business methods  only when there's a ok/apply is maintenance nightmare as can be seen in PetStore sample app.  Manually dettaching and attaching objects from session when a save is required is an approach but when you think about it, we've replace one simple call to save, with two calls to dettach then reattach.  Where's the savings?  Plus, calling save is more more natural.&lt;br /&gt;&lt;br /&gt;So if we go back to open/closing session at DAO, lazy loaded references throw exceptions because they're no attached session.  Which orignally lead me down the path to using FlushingSpringSessionInViewFilter.  I'm inclined to solve this with an AOP interceptor for each method that requres lazy loading, right now only one, I may just hack it until I can get my head around Spring's AOP.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-110933928254460440?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/110933928254460440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=110933928254460440' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/110933928254460440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/110933928254460440'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/02/latest-thinking-on-hibernate-session.html' title='Latest thinking on hibernate session'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11075327.post-110933784796564861</id><published>2005-02-25T05:23:00.000-08:00</published><updated>2005-02-25T05:24:07.966-08:00</updated><title type='text'>Resetting database on sipxchange 2.4</title><content type='html'>I had to find out how to reset db on 2.4 system, here's how:&lt;br /&gt; su - postgres&lt;br /&gt; dropdb PDS&lt;br /&gt; cd /home/sipxchange/configserver/etc/db/pgs&lt;br /&gt; ./p_xchange.sh&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11075327-110933784796564861?l=sipxconfig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sipxconfig.blogspot.com/feeds/110933784796564861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11075327&amp;postID=110933784796564861' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/110933784796564861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11075327/posts/default/110933784796564861'/><link rel='alternate' type='text/html' href='http://sipxconfig.blogspot.com/2005/02/resetting-database-on-sipxchange-24.html' title='Resetting database on sipxchange 2.4'/><author><name>Lazieburd</name><uri>http://www.blogger.com/profile/05664179126586295050</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_s8Zon-XCiCI/S8cpkNjX8wI/AAAAAAAAAUU/KBVMlsAnqvM/S220/avatar3-larger.jpg'/></author><thr:total>0</thr:total></entry></feed>
