<?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-2820719305895422701</id><updated>2011-11-27T18:32:47.397-06:00</updated><title type='text'>Raka's</title><subtitle type='html'>trail of... stuffs.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>38</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-6268488270689695705</id><published>2011-09-26T01:32:00.047-05:00</published><updated>2011-09-28T22:56:39.887-05:00</updated><title type='text'>VoiceXML Automated Testing, using JVoiceXML</title><content type='html'>Okay, just some quick &amp;amp; drafty entry here. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I needed a way to automate the testing of IVR applications (VoiceXML). Quick googling will take us to &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/tellmestudio/thread/31f162e7-2f0a-4224-a46a-a2c6b95ef71f/"&gt;this&lt;/a&gt; (Microsoft) and &lt;a href="http://www.empirix.com/products/hammer_on_call.asp"&gt;this&lt;/a&gt; (Empirix). I can't make any comment on either of those options, because I haven't used any of them; Tellme retired its free-developer account service, so I can't access Tellme Studio any longer. As for Empirix, based on what I read on its webpage, I don't think it's exactly the one I was looking for (it talks about recognition error rate, prompt quality, etc., while my concern is mainly about the flow of the dialogs).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/b&gt;&lt;blockquote&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;UPDATE:&lt;/span&gt;&lt;/b&gt; I guess this product named "Voiyager" is close to what I'm looking for. Link: &lt;a href="http://www.syntellect.com/pages/products/voiyager_eng.aspx"&gt;http://www.syntellect.com/pages/products/voiyager_eng.aspx&lt;/a&gt;&lt;/blockquote&gt;&lt;a href="http://www.syntellect.com/pages/products/voiyager_eng.aspx"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What I want is really simple (to begin with): I want to verify (quickly) that if I press "1" in a dialog that asks &lt;i&gt;"What do you want to drink? Press 1 for coffee, Press 2 for tea."&lt;/i&gt;, then the next prompt would be &lt;i&gt;"You selected coffee. What type of coffee? Press 1 for cappuccino, press 2 for espresso"&lt;/i&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is based on my observations on how clients specify their expectations..., as a theater script with two actors in it, the IVR and the user. Like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;IVR:&lt;/b&gt; What do you want to drink? Press 1 for coffee, Press 2 for tea.&lt;/i&gt; (or: &lt;i&gt;audio_01.wav&lt;/i&gt;)&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;User:&lt;/b&gt; Press 1&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;IVR:&lt;/b&gt; &lt;/i&gt;&lt;i&gt;You selected coffee. What type of coffee? Press 1 for cappuccino, press 2 for &lt;/i&gt;&lt;i&gt;espresso. &lt;/i&gt;(or: &lt;i&gt;audio_02.wav&lt;/i&gt;) &lt;/div&gt;&lt;i&gt;... (and so on).&lt;/i&gt;&lt;/blockquote&gt;&lt;div&gt;So I thought it would be nice, if we can make a little program that takes that script and check it against a running IVR. &lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;I've seen some people attempt to automate the test using automation tool like &lt;a href="http://www.autoitscript.com/site/autoit/"&gt;AutoIt&lt;/a&gt;, that basically (1) starts a softphone, (2) dial the IVR, (3) input DTMF (by pressing buttons in the softphone app), and that's it.&lt;br /&gt;&lt;br /&gt;The problem with that is:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;There's no (easy) way to verify the prompts. Tool like AutoIT is a GUI test tool, designed for testing desktop applications, to check properties of GUI elements in the application. You can't use that to capture audio, let alone to compare it against our expectation (which would be expressed in a text format). &lt;/li&gt;&lt;li&gt;Without a way to verify the prompts, the test is useless.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;And then I came across &lt;a href="http://jvoicexml.org/"&gt;JVoiceXML&lt;/a&gt;, an open-source VoiceXML interpreter, written in Java. Somebody else came up with the idea for the test-tool ( described here: &lt;a href="http://sourceforge.net/apps/mediawiki/jvoicexml/index.php?title=UnitTest"&gt;http://sourceforge.net/apps/mediawiki/jvoicexml/index.php?title=UnitTest&lt;/a&gt; ). I simply took that idea, and implement part of it. I started with something really simple: I want to be able to express each scenario in the following format (plain text file):&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;i.Please enter 1 to go to formB, or 2 to go to formC%1&lt;/div&gt;&lt;div&gt;a.You are in prompt B&lt;/div&gt;&lt;div&gt;i.Please enter 34 followed by # to go to formD, or 35 followed by # to go to formE%34#&lt;/div&gt;&lt;div&gt;a.You are in prompt D&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;The line that starts with "i." means: an input collection is expected, where user will prompted with the question to right of the first "." &amp;amp; the left of "%", and user will respond by pressing sequence of digits specified to the right of "%". The line that starts with "a." means: user will be prompted with the question to right of the first ".".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And, to run the test (scenario), I would only have to type this command in the console:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;java JVoiceXmlTest http://mywebserver/index.jsp scenario_01.txt&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;Where the first parameter (http://mywebserver/index.jsp) is the URL of the landing page of the IVR, and the second parameter (scenario_01.txt) is the name of the text file that contains the scenario.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, here's what I got so far (video below). Nothing interesting :) yet, just some scrolling text in a console. What's more interesting is some findings I made when I was modifying JVoiceXml source code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;iframe width="420" height="315" src="http://www.youtube.com/embed/cnFQpi-_fyk" frameborder="0" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ok, now the findings (I hope this can be a useful feedback for JVoiceXml team in refactoring effort):&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;JVoiceXml has a dependence to RMI (i.e.: it binds itself to the JNDI during startup). It maybe fine for the intended use of JVoiceXml (as a networked application). However, for testing tool like this one here, I just want to run it as a standalone component. Particularly, I'm only interested in the voicexml interpreter core. For now, I simply comment out the lines of code related to JNDI and RMI. I hope future versions will be refactored to let us use the voicexml interpreter as a plain java object.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;JVoiceXML has this architecture that allows you to change the "platform factory". A platform factory is basically an object that creates other objects that know how to obtain and process the (spoken) input and (audio) output. Inputs and outputs go through an instance of "Telephony" (it's the canal).&lt;br /&gt;&lt;br /&gt;The good thing is JVoiceXML comes with a "text platform factory" that takes inputs as texts and produces outputs as texts. A slight modification was needed to that "text platform factory", because its telephony read input / write output from / to server socket. I don't need that; I needed to by-pass that and use simple method invocations. So I created a wrapper around it, that's the &lt;i&gt;PruebaPlatformFactory&lt;/i&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Another finding (lengthy one, and the most challenging), the issue with semantic interpretation of grammar.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Currently the implementation of its GrammarChecker does not support semantic interpretation. So, you can not associate a (custom) value to phrases supported by your grammar. This limits the use of JVoiceXML.&lt;br /&gt;&lt;br /&gt;In my case, for example, I need to capture a 4-digits pin number. Well, for that actually you can simply take the "utterance" and treats it as the value. Let's suppose user is required to complete the input by pressing the # after the fourth digits. Well, for that you can also simply take the utterance, and (in your "business logic" you drop the trailing #). You don't need semantic interpretation for such case.&lt;br /&gt;&lt;br /&gt;Anyway, semantic interpretation is important; any decent VoiceXml browser must support it (conforming to a specification like &lt;a href="http://www.w3.org/TR/semantic-interpretation/"&gt;SISR&lt;/a&gt;). So I set out to solve this, as part of an exercise. I ran into some difficulties, because I still don't have a good grasp on how the &lt;i&gt;GrammarChecker&lt;/i&gt; and (to lesser degree) &lt;i&gt;SrgsXmlGrammarParser&lt;/i&gt; work; what's the principles &amp;amp; logic. I guess the difficulties stems from the fact that the tree structure in the static model (the SRGS grammar)  is transformed to a linear structure when the input is checked against the grammar.&lt;br /&gt;&lt;br /&gt;So I just put my modifications in some sensible places in the code where I can intercept the event of "&lt;tag&gt; node is visited". My code simply collects the content of those &lt;tag&gt; (which basically is line of JavaScript code) , and stitch those lines of JS code (in some order) when the walk is completed. The code then feeds those lines of JS code to the embedded JS-engine (Rhino), and I simply take the return value of the execution of the JS code, and assign it as the "semantic interpretation".&lt;br /&gt;&lt;br /&gt;Take the following grammar for instance (click to enlarge).&lt;/tag&gt;&lt;/tag&gt;&lt;/div&gt;&lt;div&gt;&lt;tag&gt;&lt;tag&gt;&lt;br /&gt;&lt;/tag&gt;&lt;/tag&gt;&lt;/div&gt;&lt;img src="http://3.bp.blogspot.com/-L2Wb8YP2Vdk/ToBDkHGonkI/AAAAAAAAAOo/98tBrEegbZE/s320/grammar_1.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5656595419638570562" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 320px; height: 127px; " /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;tag&gt;&lt;tag&gt;&lt;br /&gt;&lt;/tag&gt;&lt;/tag&gt;&lt;/div&gt;&lt;div&gt;&lt;tag&gt;&lt;tag&gt;&lt;br /&gt;&lt;/tag&gt;&lt;/tag&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If the input from user "34#", then the JS-codes that the &lt;i&gt;GrammarChecker &lt;/i&gt;will produce would be:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;var digits = new Object();&lt;/div&gt;&lt;div&gt;digits.MEANING='D';&lt;/div&gt;&lt;div&gt;var root_rule = new Object();&lt;/div&gt;&lt;div&gt;root_rule.MEAN2=digits.MEANING;&lt;/div&gt;&lt;div&gt;root_rule.MEAN1='form';&lt;/div&gt;&lt;div&gt;root_rule.whereToGo=root_rule.MEAN1+root_rule.MEAN2;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;The return value from the JS execution is always the value of the last line, so effectively we will get the string "formD". &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My current fix is kind of hackish. I just did the minimal thing to make the cases listed in &lt;a href="http://box.net/files#/files/0/f/0/1/f_945790295"&gt;http://box.net/files#/files/0/f/0/1/f_945790295&lt;/a&gt; pass. The ideal solution would be the one that passes SISR 1.0 conformance tests. For that I will need to take a closer look at the &lt;i&gt;SrgsXmlGrammarParser &lt;/i&gt;and &lt;i&gt;GrammarChecker&lt;/i&gt;, and the related classes &amp;amp; interfaces. I feel the need for refactoring in that area. The way &lt;i&gt;GrammarNodes&lt;/i&gt; and &lt;i&gt;SrgsNode&lt;/i&gt; are (currently) structured doesn't make it easy to navigate through the tree / walk, which might be required for efficient implementation of semantic interpreter. I was also thinking, why not use &lt;a href="http://www.antlr.org/"&gt;ANTLR&lt;/a&gt; for generating the bulk of the grammar interpreter? I guess that would be easier &amp;amp; produce cleaner code.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Last finding: this time about notification. I need a way to get notified whenever any of these two things occurs:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;The interpreter is waiting for input, so that I can put code that pro grammatically feeds the input in.&lt;/li&gt;&lt;li&gt;The interpreter is playing a prompt, so that I can put code that compares the prompt with the one specified in the scenario file.&lt;/li&gt;&lt;/ol&gt;JVoiceXml employs &lt;a href="http://en.wikipedia.org/wiki/Strategy_pattern"&gt;strategy design pattern&lt;/a&gt; (see interface &lt;i&gt;TagStrategy&lt;/i&gt;), which I exploits here to achieve those two things mentioned above; I simply implements a TagStrategy that wraps around the default strategy, so I can do some interceptions, and fire the notifications from there. Hmm, well, I was lying. I mean, that would be the right way to do it, but for now (because I don't have much time), I simply modified the implementation of the default strategies. Told you, it was hackish :).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The modified JVoiceXml is available &lt;a href="http://www.box.net/shared/mjcb2x8u4vzr2v8y3qfy"&gt;here&lt;/a&gt; (it is based on JVoiceXml 0.7.4.1). Actually, it's of little use for public right now (it's really yucky!); I will have to modify it anyway sometime later, only after I get a firm understanding of the grammar interpreter, in order to make it SISR 1.0 compliant. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Okay, that's all for now!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/KCxz3XqCE2U" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&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/2820719305895422701-6268488270689695705?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/6268488270689695705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=6268488270689695705' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/6268488270689695705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/6268488270689695705'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2011/09/jvoicexml-autotest.html' title='VoiceXML Automated Testing, using JVoiceXML'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/cnFQpi-_fyk/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-1356420989133273652</id><published>2011-05-16T09:50:00.004-05:00</published><updated>2011-09-26T05:17:46.773-05:00</updated><title type='text'>Hmm.... Pretziiii....</title><content type='html'>Just toying around with Prezi....&lt;br /&gt;&lt;br /&gt;&lt;div class="prezi-player"&gt;&lt;style type="text/css" media="screen"&gt;.prezi-player { width: 550px; } .prezi-player-links { text-align: center; }&lt;/style&gt;&lt;object id="prezi_h3u4umdjhhwc" name="prezi_h3u4umdjhhwc" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="550" height="400"&gt;&lt;param name="movie" value="http://prezi.com/bin/preziloader.swf"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="bgcolor" value="#ffffff"&gt;&lt;param name="flashvars" value="prezi_id=h3u4umdjhhwc&amp;amp;lock_to_path=0&amp;amp;color=ffffff&amp;amp;autoplay=no&amp;amp;autohide_ctrls=0"&gt;&lt;embed id="preziEmbed_h3u4umdjhhwc" name="preziEmbed_h3u4umdjhhwc" src="http://prezi.com/bin/preziloader.swf" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="550" height="400" bgcolor="#ffffff" flashvars="prezi_id=h3u4umdjhhwc&amp;amp;lock_to_path=0&amp;amp;color=ffffff&amp;amp;autoplay=no&amp;amp;autohide_ctrls=0"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="prezi-player-links"&gt;&lt;p&gt;&lt;a title="No description" href="http://prezi.com/h3u4umdjhhwc/the-software-map/"&gt;The Software Map&lt;/a&gt; on &lt;a href="http://prezi.com/"&gt;Prezi&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-1356420989133273652?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/1356420989133273652/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=1356420989133273652' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/1356420989133273652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/1356420989133273652'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2011/05/just-landed.html' title='Hmm.... Pretziiii....'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-5450662150126854603</id><published>2010-06-20T18:12:00.009-05:00</published><updated>2011-01-06T11:14:56.199-06:00</updated><title type='text'>Microsoft Lifecam Cinema Component for Windows Embedded Standard 2009</title><content type='html'>I have a need to have Microsoft Lifecam Cinema (high-definition PC camera) working on Windows Embedded Standard 2009.&lt;br /&gt;&lt;br /&gt;I'm aware that several people in the internet is also looking for a solution for that task. Well here it is: &lt;a href="http://www.box.net/shared/jbe644tmfq"&gt;download the component design file (SLD) here&lt;/a&gt;. You can then simply import it to your component repository, and use it in your target design (search for "Lifecam" in the component list). &lt;a href="http://www.box.net/shared/764mbiv4qk"&gt;Download the zipped folder that contains the Lifecam's driver here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In your target design, don't forget to add the following components as well: &lt;b&gt;PNP (User-Mode)&lt;/b&gt; and &lt;b&gt;DirectShow Capture&lt;/b&gt;. I still have to analyze if they both should go into the SLD file.&lt;br /&gt;&lt;br /&gt;I'm writing "from the ground up" document with topic: building a lean custom image of Windows Embedded Standard 2009 that supports Microsoft Lifecam Cinema. Stay tuned. Will have it ready this weekend. Cya! In the meantime, enjoy the music :) -- a composition by &lt;a href="http://en.wikipedia.org/wiki/Colin_McPhee"&gt;Collin McPhee&lt;/a&gt; (read &lt;a href="http://www.overgrownpath.com/2007/12/colin-mcphee-east-collides-with-west.html"&gt;this one&lt;/a&gt; as well) from his work Tabuh-Tabuhan.&lt;br /&gt;&lt;br /&gt;&lt;object height="340" width="560"&gt;&lt;param name="movie" value="http://www.youtube.com/v/h-T-ls5EiIs&amp;amp;hl=es_MX&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/h-T-ls5EiIs&amp;amp;hl=es_MX&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="340" width="560"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;UPDATE&lt;/span&gt;:&lt;/span&gt; here it is!&lt;br /&gt;&lt;a title="View Microsoft Lifecam on Windows Embedded Standard 2009 on Scribd" href="http://www.scribd.com/doc/46423101/Microsoft-Lifecam-on-WIndows-Embedded-Standard-2009" style="margin: 12px auto 6px; font: 14px Helvetica,Arial,Sans-serif; display: block; text-decoration: underline;"&gt;Microsoft Lifecam on Windows Embedded Standard 2009&lt;/a&gt; &lt;object id="doc_709586433673102" name="doc_709586433673102" type="application/x-shockwave-flash" data="http://d1.scribdassets.com/ScribdViewer.swf" style="outline: medium none;" height="500" width="100%"&gt;  &lt;param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf"&gt;  &lt;param name="wmode" value="opaque"&gt;   &lt;param name="bgcolor" value="#ffffff"&gt;   &lt;param name="allowFullScreen" value="true"&gt;   &lt;param name="allowScriptAccess" value="always"&gt;   &lt;param name="FlashVars" value="document_id=46423101&amp;amp;access_key=key-q6zhm92zwi7a8swyvlc&amp;amp;page=1&amp;amp;viewMode=list"&gt;   &lt;embed id="doc_709586433673102" name="doc_709586433673102" src="http://d1.scribdassets.com/ScribdViewer.swf?document_id=46423101&amp;amp;access_key=key-q6zhm92zwi7a8swyvlc&amp;amp;page=1&amp;amp;viewMode=list" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" bgcolor="#ffffff" height="500" width="100%"&gt;&lt;/embed&gt;  &lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-5450662150126854603?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/5450662150126854603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=5450662150126854603' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/5450662150126854603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/5450662150126854603'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2010/06/microsoft-lifecam-cinema-component-for.html' title='Microsoft Lifecam Cinema Component for Windows Embedded Standard 2009'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-3886861284831126571</id><published>2010-04-05T00:35:00.019-05:00</published><updated>2010-04-06T17:31:03.665-05:00</updated><title type='text'>Continuing DBConan Zeta....</title><content type='html'>Alright,&lt;br /&gt;&lt;br /&gt;I changed the implementation of the domain model of DBConan Zeta. &lt;a href="http://jananuraga.blogspot.com/2010/03/dbconan-zeta-right-now-im-porting.html"&gt;In the previous entry&lt;/a&gt; I mentioned the domain object (Schema, Table, Column, etc.) will make use of &lt;a href="http://doc.trolltech.com/4.5/qexplicitlyshareddatapointer.html"&gt;QExplicitlySharedDataPointer&lt;/a&gt;. Well..., I decided this weekend to use &lt;a href="http://doc.trolltech.com/4.5/qshareddatapointer.html"&gt;QSharedDataPointer&lt;/a&gt; instead. More on that later.&lt;br /&gt;&lt;br /&gt;Second, on the trick to avoid that "field has incomplete type". In the previous entry I said "use pointer". Now I decided to get rid of pointers altogether. It looks so un-QT-ish :) to me. I might be wrong here..., but the * signs hurt my eyes :).&lt;br /&gt;&lt;blockquote&gt;Oh no, I'm slowly becoming a QT zealot. It reminds me of my early days learning Java 12 years ago....&lt;/blockquote&gt;Source code here: &lt;a href="http://www.box.net/shared/8zt5p6u9vz"&gt;http://www.box.net/shared/8zt5p6u9vz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ok, on the jump from QExplicitlySharedDataPointer to QSharedDataPointer. Why? At first I thought QExplicitySharedDataPointer is the way to go, because -- the way I understand it --  it practically gives the effect of "pass-by-reference", which is the default mode of Java / C#.&lt;br /&gt;&lt;br /&gt;For those who are not familiar with QT: QSharedDataPointer means &lt;a href="http://doc.trolltech.com/4.5/shared.html#implicit-sharing"&gt;implicit sharing&lt;/a&gt;..., while QExplicitlySharedDataPointer means explicit sharing.&lt;br /&gt;&lt;br /&gt;In practical terms, implicit sharing means: when you modify an object, from within a function (that gets passed in the object), the caller of the function -- the one that passed the object into the function -- will not see the change you made on that object. Surprise (!). The reason is, at the point a non-const function is invoked on that object, the sharing is automatically broken; a deep copy is made, which means that object now has its own set of data, so that any changes made by that function would not ripple (inadvertently) to other part(s) of the program.&lt;br /&gt;&lt;br /&gt;Hmm..., actually I'm not very happy with the way I explain it :). So, please head over to the &lt;a href="http://doc.trolltech.com/4.5/shared.html"&gt;authoritative source (in QT ref.)&lt;/a&gt; instead.&lt;br /&gt;&lt;br /&gt;Ok, sounds like implicit sharing is not-intuitive (at least for Java / C# programmers). In Java / C#, by default, we expect the change we made in an object to ripple through the program (and we do some tricks when we want otherwise).&lt;br /&gt;&lt;br /&gt;Here, with implicit sharing, it's exactly the opposite. So, why not use explicit sharing instead? Well, in a few words: I found it hard to achieve consistency with explicit sharing, partly because my domain objects have member fields of types that use implicit sharing (e.g.: &lt;a href="http://doc.trolltech.com/4.5/qstring.html"&gt;QString&lt;/a&gt; and &lt;a href="http://doc.trolltech.com/4.5/qlist.html"&gt;QList&lt;/a&gt;). &lt;span style="color: rgb(255, 102, 0);"&gt;Mixing implicit sharing and explicit sharing, in my opinion, is not a good thing. It will only lead to confusion.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ok, let's suppose the Schema object is explicitly shared. Suppose you pass that Schema to a function (&lt;span style="font-style: italic;"&gt;xxxFunc&lt;/span&gt;). Inside the function you obtain the list of Tables that belong to the schema. Then, you append another instance of Table to that list. You would expect that change to be seen from the part where you invoke the &lt;span style="font-style: italic;"&gt;xxxFunc&lt;/span&gt;. Chance is: that's not the case. Because QList is implicitly shared.&lt;br /&gt;&lt;br /&gt;So..., I thought "I don't want to mess with that. Let's stick with one approach only, implicit sharing". The (only) problem, or I'd rather say "consequence", with that decision is...: it requires a shift in my way of thinking (in the rest of the program). I will have to keep in mind (everytime I pass an object to a function): it's a pass-by-value, it's a pass-by-value.&lt;br /&gt;&lt;br /&gt;That may not be as bad as it sounds. I think it has something to do with immutability. I remember &lt;a href="http://en.wikipedia.org/wiki/Joshua_Bloch"&gt;Joshua Bloch&lt;/a&gt; in his book (&lt;a href="http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1270448941&amp;amp;sr=8-1"&gt;Effective Java&lt;/a&gt;) mentions "favor immutability". Maybe this pass-by-value will force us to lean ourselves more toward that principle. I don't know..., we'll see. I'll report back on that later.&lt;br /&gt;&lt;br /&gt;In the meantime you can download the &lt;a href="http://www.box.net/shared/8zt5p6u9vz"&gt;C++ source code&lt;/a&gt;. Compare it with dbconan_schema.py below (complete python source: &lt;a href="http://jananuraga.blogspot.com/2008/12/db-conan-10.html"&gt;here&lt;/a&gt;). You see, there are many checks -- that are available in the python version -- currently not implemented in the C++ port. I'll get to that later. Ciao!&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;UPDATE:&lt;/span&gt; I also decided to change the target database from Oracle to Postgre. The reason: I don't have time to (re)compile QT on my Ubuntu Linux in order to have the QT's Oracle SQLDriver. On the other hand, Postgre SQLDriver comes out of the box (when we install QT SDK from the repository).&lt;br /&gt;&lt;br /&gt;In the Python+Oracle version the program makes heavy use of &lt;a href="http://w2.syronex.com/jmr/edu/db/oracle-data-dictionary/"&gt;Oracle Data Dictionary&lt;/a&gt; (that's how it learns the structure of the database).&lt;br /&gt;&lt;br /&gt;The equivalent of it in Postgre is "&lt;a href="http://www.postgresql.org/docs/8.0/static/information-schema.html"&gt;information schema&lt;/a&gt;". Here are a few tables in the information_schema that I think will be useful for the program:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;select * from information_schema.tables where table_schema = 'public' -- public is the default schema name&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;select * from information_schema.columns where table_name = 'table_a'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;select * from information_schema.constraint_column_usage&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;select * from information_schema.key_column_usage&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;select * from information_schema.referential_constraints&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;select * from information_schema.constraint_table_usage&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;select * from information_schema.table_constraint&lt;/span&gt;&lt;br /&gt;&lt;!--EndFragment--&gt;&lt;/blockquote&gt;&lt;a title="View dbconan_schema.py on Scribd" href="http://www.scribd.com/doc/29415105/dbconan-schema-py" style="margin: 12px auto 6px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;"&gt;dbconan_schema.py&lt;/a&gt; &lt;object id="doc_925517556288354" name="doc_925517556288354" type="application/x-shockwave-flash" data="http://d1.scribdassets.com/ScribdViewer.swf" style="outline-color: -moz-use-text-color; outline-style: none; outline-width: medium;" height="500" width="100%"&gt;  &lt;param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf"&gt;  &lt;param name="wmode" value="opaque"&gt;   &lt;param name="bgcolor" value="#ffffff"&gt;   &lt;param name="allowFullScreen" value="true"&gt;   &lt;param name="allowScriptAccess" value="always"&gt;   &lt;param name="FlashVars" value="document_id=29415105&amp;amp;access_key=key-199oui40inzm57pv04rm&amp;amp;page=1&amp;amp;viewMode=list"&gt;   &lt;embed id="doc_925517556288354" name="doc_925517556288354" src="http://d1.scribdassets.com/ScribdViewer.swf?document_id=29415105&amp;amp;access_key=key-199oui40inzm57pv04rm&amp;amp;page=1&amp;amp;viewMode=list" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" bgcolor="#ffffff" height="500" width="100%"&gt;&lt;/embed&gt;  &lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-3886861284831126571?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/3886861284831126571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=3886861284831126571' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/3886861284831126571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/3886861284831126571'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2010/04/continuing-dbconan-zeta.html' title='Continuing DBConan Zeta....'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-4735092108751459205</id><published>2010-03-29T01:38:00.018-06:00</published><updated>2010-03-29T23:03:54.087-06:00</updated><title type='text'>DBConan Zeta</title><content type='html'>&lt;p&gt;Right now I’m porting &lt;a href="http://jananuraga.blogspot.com/2008/12/db-conan-10.html"&gt;DBConan&lt;/a&gt; to C++, specifically using the &lt;a href="http://en.wikipedia.org/wiki/Qt_%28framework%29"&gt;QT framework&lt;/a&gt; (version 4.5.3). I’ve never programmed in C++ before, so the problem I’m posting here actually is an (embarrassing) basic problem in C++: it doesn’t compile :), with error message “file f_primaryKey has incomplete type”. The source code of the &lt;a href="http://www.box.net/shared/8zt5p6u9vz"&gt;domain model is available here&lt;/a&gt; (yes, as a devout OO programmer I always start with the domain model) :D.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_M06zGolBz4A/S7BY-2LmEpI/AAAAAAAAAK0/mSwME3JjDyQ/s1600-h/screen_dbconanzeta%5B9%5D.png"&gt;&lt;img style="border: 0px none ; display: inline;" title="screen_dbconanzeta" alt="screen_dbconanzeta" src="http://lh4.ggpht.com/_M06zGolBz4A/S7BZA-2MNQI/AAAAAAAAAK4/elViSXQtq8s/screen_dbconanzeta_thumb%5B7%5D.png?imgmax=800" border="0" height="340" width="550" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;For those who are experienced in C++, please help me identify what exactly is the problem. I did all I knew: I’ve forward-declared the class PrimaryKey (see the top of DomainModel.h). No luck.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;UPDATE:&lt;/span&gt; Found why. &lt;a href="http://www.box.net/shared/53n367k7ps"&gt;Here is the fixed code&lt;/a&gt; (separate file, those interested -- including myself, for not getting into the same issue -- can compare it with the earlier version). In a few words,&lt;span style="color: rgb(255, 102, 0);"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(255, 102, 0);"&gt;it's another wrinkle I just learned in C++&lt;/span&gt;: when you declare "PrimaryKey primaryKey;" as an instance variable of "Table", I guess the compiler will look for the empty-args constructor of PrimaryKey, somewhere in the code, before the declaration of class Table. Of course, in this case, the forward declaration of PrimaryKey doesn't help as it only declares the type, not the constructors. &lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;So, the solution:&lt;/span&gt; use pointer. So, instead of "PrimaryKey primaryKey;", try "PrimaryKey* p_primaryKey;". Another possible way out (I think): partial class..., but &lt;a href="http://stackoverflow.com/questions/140935/partial-class-definition-on-c"&gt;there's no such thing in C++&lt;/a&gt; :). &lt;span style="font-weight: bold; font-style: italic;"&gt;Keywords for google:&lt;/span&gt; +"field has incomplete type" C++&lt;br /&gt;&lt;br /&gt;Hope that helps (I also googled using that phrase, but I didn't really find a direct / specific answer). I figured out what I explained above by doing some quick experiments.&lt;br /&gt;&lt;/blockquote&gt;Ok, why C++? Well, I’ve never programmed in C++, though I always wanted too. The original DBConan – the prototype – was writen in &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; because I had to run it on a UNIX machine, on which I didn’t have permission to install Java…, python was my only choice. It turned out to be a good thing for me, I could appreciate python more.&lt;p&gt;&lt;/p&gt;  &lt;p&gt;Then, as I already stated in the presentation, this DBConan will have to have a GUI. For usability, analytic functions (which would be really difficult to use without GUI), eye-candies, etc. I decided not to use Java (swing) simply because… I’ve done Java for too many years. I need some change :). I’ve heard that QT is one of the better GUI framework out there, and it’s in C++. I read the book on programming QT (3 years ago), I liked it, and finally now I have a good excuse to use it :).&lt;/p&gt;  &lt;p&gt;One of my first concerns was: memory management. &lt;a href="http://jananuraga.blogspot.com/2009/06/little-note-on-c.html"&gt;As I wrote in my earlier post, in my understanding, in (standard) C++ we have to worry about who is responsible for deleting objects created&lt;/a&gt; (e.g.: the calling functions? or the one got passed in the object?). I know there’s auto_ptr in standard C++, but since I’m in QT why don’t we use what QT provides (and work well with the rest of QT framework). So I skipped auto_ptr entirely and go straight to QSharedData and &lt;a href="http://doc.trolltech.com/4.5/qshareddatapointer.html"&gt;QSharedDataPointer&lt;/a&gt;. In my case I decided to use &lt;a href="http://doc.trolltech.com/4.5/qexplicitlyshareddatapointer.html"&gt;QExplicitlySharedDataPointer&lt;/a&gt;, since I think it’s the model that resembles most closely the model in Java / C# that I’m familiar with.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;Ok, I’m thinking here, guys, especially uni students: if you are interested in building something useful, using QT, for your thesis maybe, why not consider working with me on this?&lt;/blockquote&gt;Well, I found DBConan quite useful. In my previous project in Nextel Mexico, the vendor required us to include relevant snapshot of the database whenever we report an issue / finding. Initially I did it the “normal way” (during learning phase): I did the querying manually, hoping from one table to another, and stop when I think I’ve covered the required subset. I quickly realized it was a waste of my time, so I wrote DBConan that allowed me to “slurp” the data quickly. I think this can be used in other situations that involve working with large and complex database structure.&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Please email me if you’re interested. Favor de escribirme si te interesa. Silahkan menyurati saya (email) jika anda tertarik. &lt;a href="mailto:raka.angga@gmail.com"&gt;raka.angga@gmail.com&lt;/a&gt;. It has to be in QT 4.5.x.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-4735092108751459205?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/4735092108751459205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=4735092108751459205' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/4735092108751459205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/4735092108751459205'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2010/03/dbconan-zeta-right-now-im-porting.html' title='DBConan Zeta'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_M06zGolBz4A/S7BZA-2MNQI/AAAAAAAAAK4/elViSXQtq8s/s72-c/screen_dbconanzeta_thumb%5B7%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-5128076329753408165</id><published>2010-03-11T15:30:00.004-06:00</published><updated>2010-03-23T17:35:43.258-06:00</updated><title type='text'>My current flow of thinking (related to charging)</title><content type='html'>I'm digging old archives again, reviewing several charging scenarios I implemented in the rating &amp;amp; biling project in a mobile operator in Mexico throughout 2008-2009 (that uses a product named &lt;a href="http://www.lhsgroup.com/products/bscs-ix/"&gt;BSCS iX&lt;/a&gt; from &lt;a href="http://www.lhsgroup.com/"&gt;LHS&lt;/a&gt;), trying to recall / rediscover the usage parameters that matter for telco operators (one of my current company's target market).&lt;br /&gt;&lt;br /&gt;From there, try to understand why those parameters -- and relevant charging rules -- matter to them. That's the high-level objective.&lt;br /&gt;&lt;br /&gt;Once we have a better / more solid idea about parameters &amp;amp; the charging rules, we can go backward, to identifying places in our application where we can / should tap those parameters from. The objective is to make the application "charging friendly". By that I mean, the design facilitates the need to provide the usage parameters asked by the charging system (supposedly owned by the telco operator).&lt;br /&gt;&lt;br /&gt;After that, go forward again (to the middle). At that point we will have to verify if the data we have tapped from our application really is useful / usable. A test bed will be required. In this case, the test bed would a charging system, similar to the one(s) used by the telco operators. I will be looking into &lt;a href="http://www.open-rate.com/"&gt;OpenRate&lt;/a&gt; soon.&lt;br /&gt;&lt;br /&gt;Coming out of that we will have more confidence that we have more / sufficient knowledge to be able to deal with requests from the client (telco operator) for anything related to their charging requirements.&lt;br /&gt;&lt;br /&gt;I'll post again once I have managed to try out OpenRate.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-5128076329753408165?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/5128076329753408165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=5128076329753408165' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/5128076329753408165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/5128076329753408165'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2010/03/my-current-flow-of-thinking-related-to.html' title='My current flow of thinking (related to charging)'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-5619929065254475794</id><published>2010-03-10T15:43:00.015-06:00</published><updated>2010-03-11T14:12:07.141-06:00</updated><title type='text'>List of things I tend to forget how to do....</title><content type='html'>&lt;ul&gt;&lt;li&gt;Configuring DNS + SRV records for SIP.&lt;/li&gt;&lt;li&gt;Using tcpdump (command line).&lt;/li&gt;&lt;li&gt;Using sox to convert wav to gsm.&lt;/li&gt;&lt;/ul&gt;I guess I have to put a quick note for oft-used commands somewhere..., here.&lt;br /&gt;&lt;br /&gt;Right now I'm trying to get AG-Project's &lt;a href="http://ag-projects.com/CDRTool.html"&gt;CDRTool&lt;/a&gt; working on a Debian. It works together with &lt;a href="http://www.opensips.org/"&gt;OpenSIPS&lt;/a&gt;. I will use it as a testbed for charging alternatives we're trying to come up with for our solution offering. We're heading toward Diameter-based solution (since Diameter is the thing recommended for IMS). However, we're still in search for an opensource / free diameter server component (specifically CDF), and we haven't found one. So, we'll use this CDRTool (together with OpenSIPS and it's Radius accounting module) as a temporary solution. Let's see if it works.&lt;br /&gt;&lt;br /&gt;Now, first I need to get this OpenSIPs taking registration for a domain (e.g.: mytelco.net). For that I need to create SRV records, somewhere in the BIND configuration. Done that before, but already forgot how. Geez :). I hope this one would work: &lt;a href="http://www.anders.com/cms/263"&gt;http://www.anders.com/cms/263&lt;/a&gt; ... or this... &lt;a href="http://sipx-wiki.calivia.com/index.php/DNS_Configuration"&gt;http://sipx-wiki.calivia.com/index.php/DNS_Configuration &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;UPDATE: &lt;/span&gt;Ok, done. At least now my OpenSIPS handles registrations &amp;amp; requests for domain "mytelco.net". I put here screenshots and quick notes. They summarize a couple of things I learned from various resources on the web during the setup (useful for future reference).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;(1) Get OpenSIPS installed.&lt;/span&gt; For basic usage (as simple forwarding proxy) it is pretty straightforward, just follow the instructions on this page: &lt;a href="http://bit.ly/cgFNxy"&gt;http://bit.ly/cgFNxy&lt;/a&gt;. I used version OpenSIPS 1.6.1 on Debian 5, by the way. &lt;span style="font-style: italic;"&gt;Please note,&lt;/span&gt; there's a little error in that manual: the author mistyped the db password for user 'opensips'. The two GRANT lines at the end, they should've been like this:&lt;br /&gt;&lt;blockquote&gt;GRANT ALL PRIVILEGES ON *.* TO opensips@localhost IDENTIFIED BY 'opensipsrw';&lt;br /&gt;GRANT ALL PRIVILEGES ON *.* TO opensips@127.0.0.1 IDENTIFIED BY 'opensipsrw';&lt;/blockquote&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;(2) Install BIND9:&lt;/span&gt; &lt;span style="font-style: italic;"&gt;apt-get install bind9&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;(3) Configure BIND9:&lt;/span&gt; create zone files (forward and reverse), register them (in named.conf.local), reload bind (&lt;span style="font-style: italic;"&gt;/etc/init.d/bind9 reload&lt;/span&gt;). See picture:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://jroller.com/vulcanslair/resource/raka_debian_1.png" /&gt;&lt;br /&gt;&lt;br /&gt;Right after that, modify resolv.conf (so that your Debian use the local DNS you just configured), and verify. See picture:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://jroller.com/vulcanslair/resource/raka_debian_2.png" /&gt;&lt;br /&gt;&lt;br /&gt;One obvious caveat here: if you use use dynamic IP (as in my case), you will have to repeat doing those steps (in the two pictures above) everytime you restart your machine (change the IP in the bind conf, and re-edit the resolv.conf).&lt;br /&gt;&lt;br /&gt;Link to pages I read for configuring this thing:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://mit.edu/sip/sip.edu/dns.shtml"&gt;http://mit.edu/sip/sip.edu/dns.shtml&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.debian.org/doc/manuals/network-administrator/ch-bind.htm"&gt;http://www.debian.org/doc/manuals/network-administrator/ch-bind.htm&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://linux.justinhartman.com/DNS_Installation_and_Setup_using_BIND9"&gt;http://linux.justinhartman.com/DNS_Installation_and_Setup_using_BIND9&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://sipx-wiki.calivia.com/index.php/DNS_Configuration"&gt;http://sipx-wiki.calivia.com/index.php/DNS_Configuration&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;(3) Modify OpenSIPS config files:&lt;/span&gt; (1) &lt;span style="font-style: italic;"&gt;/usr/local/etc/opensips/opensipsctlrc&lt;/span&gt;, and (2) &lt;span style="font-style: italic;"&gt;/usr/local/etc/opensips/opensips.cfg&lt;/span&gt;. In the first file, modify the value of the property named SIP_DOMAIN to mytelco.net. In the second file, add this line:&lt;br /&gt;&lt;blockquote&gt;alias=mytelco.net&lt;br /&gt;&lt;/blockquote&gt;That's it, and finally start your OpenSIPS: &lt;span style="font-style: italic;"&gt;/etc/init.d/opensips start&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The modification for file #2, I learned it from &lt;a href="http://advantia.ca/references/opensips-1.5/INSTALL"&gt;http://advantia.ca/references/opensips-1.5/INSTALL&lt;/a&gt; . Prior to doing that, I always got error 483 (too many hops) when trying to register from my SIP phone. I guess putting that alias is a quick fix (hey it works!), I yet have to see the surprises though (hope there's none!).&lt;br /&gt;&lt;br /&gt;Finally, here's the configuration on the client side (X-Lite 3.0 on MS-Windows):&lt;br /&gt;&lt;br /&gt;&lt;img src="http://jroller.com/vulcanslair/resource/xlite.png" /&gt;&lt;br /&gt;&lt;br /&gt;Now, on to the ugli(er) part: getting CDRTool working. I did that once as well, partially, also, forgot how to do it.... I will post the result once I get it done. Documentation was really scarce and inaccurate :|.&lt;br /&gt;&lt;br /&gt;Alright, no I'm going to create a copy of my Debian's virtual harddisk. Chau!&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;UPDATE:&lt;/span&gt; This is so dissapointing. I thought after a year the situation of OpenSIPS &amp;amp; CDRTool has improved. Nope. &lt;a href="http://cdrtool.ag-projects.com/wiki/Install"&gt;Install guide of CDRTool&lt;/a&gt; is still inaccurate. Furthermore, although the latest release of CDRTool seems to be built in 2010, the install manual is still linked to FreeRadius 1.1.3!!! The latest version of Freeradius we have in Debian repository is: 2.0.x. Worse, CDRTool install guide doesn't mention that fact (you'll notice it only if you open the readme of the patch it provides for freeradius).&lt;br /&gt;&lt;br /&gt;Gee.... Ok, I think I should forget CDRTool. All I need from OpenSIPS is just the usage data, raw CDR as generated by the OpenSIPS (which I will feed in to a better, more professionally-documented rating engine). So, goodbye CDRTool, adios, chau chau. I really doubt the authors if the authors of CDRTool spent some efforts to make sure it's usable for ordinary people like me.&lt;br /&gt;&lt;br /&gt;Right now I'm reading the manual for enabling radius accounting in OpenSIPS: &lt;a href="http://www.opensips.org/Resources/DocsTutRadius"&gt;http://www.opensips.org/Resources/DocsTutRadius&lt;/a&gt; ... Alas! found some typos (filename, section 3.2., they should have typed &lt;em&gt;radiusclient.conf &lt;/em&gt;instead of &lt;em&gt;&lt;/em&gt;&lt;em&gt;radiusclient-ng.conf&lt;/em&gt;). Also, in that same section, I'm kind of stuck trying to figure out what line to put in &lt;em&gt;/etc/freeradius/clients.conf&lt;/em&gt;. Why, oh, why can't they reach the level of Asterisk (I'm referring to availability of QUALITY manuals / references).&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-5619929065254475794?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/5619929065254475794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=5619929065254475794' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/5619929065254475794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/5619929065254475794'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2010/03/list-of-things-i-tend-to-forget-how-to.html' title='List of things I tend to forget how to do....'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-6963777626289635205</id><published>2010-03-08T01:36:00.010-06:00</published><updated>2010-03-08T11:55:23.026-06:00</updated><title type='text'>Cataroo Presentation – Part 2 – Test cases</title><content type='html'>&lt;p&gt;Here it is, part 2 of the presentation about &lt;a href="http://jananuraga.blogspot.com/2010/02/cataroo.html"&gt;Cataroo&lt;/a&gt;. In this part I explain a couple of points related to defining test-cases for the sample application (callback). While I’m at it, I also touch a couple of relevant points about the design of the sample application. I believe, to excel, a Software Development Engineer in Test (SDET), just like his SDE counterpart, has to have a firm knowledge of software design.  Without further ado, I hope you enjoy this part!&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; display: inline; float: none;" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:91e1c7f2-a597-4d9e-a61e-69762b34ff30" class="wlWriterEditableSmartContent"&gt;&lt;div id="7acc7adc-0568-43c8-a26c-5867059aa3bf" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=VuWty0Dd-XI" target="_new"&gt;&lt;img src="http://lh3.ggpht.com/_M06zGolBz4A/S5SpA0yjJXI/AAAAAAAAAKY/r8nUot6XxbQ/video3f976369f194%5B3%5D.jpg?imgmax=800" style="border-style: none;" galleryimg="no" onload="var downlevelDiv = document.getElementById('7acc7adc-0568-43c8-a26c-5867059aa3bf'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/VuWty0Dd-XI&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/VuWty0Dd-XI&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;That stylistic figurine in the video-still is &lt;a href="http://en.wikipedia.org/wiki/Wayang"&gt;wayang&lt;/a&gt; (shadow puppet, a form of art spread throughout Asia. It flourishes especially in Java and Bali).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Just came to know a couple of days ago (from youtube) a very cool group based in the US that innovates on wayang, &lt;a href="http://www.shadowlight.org/"&gt;ShadowLight Productions&lt;/a&gt;. &lt;a href="http://www.youtube.com/watch?v=FZ91LEOv8k8"&gt;Thirty years perfecting the techniques, onward&lt;/a&gt;. &lt;span style="font-style: italic;"&gt;That&lt;/span&gt; is dedication. I invite you to check out one of their works, &lt;a href="http://www.youtube.com/watch?v=v3ttXhQeAWc"&gt;Ambrosia of Immortality&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;The short clips I used in my video are Punjabi songs I like a lot (for the beat &amp;amp; also for the dancing):&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=ha-uSc7eE7k"&gt;Jind Mahi&lt;/a&gt; – Malkit Singh.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=Lv3sKnCSAGE"&gt;Babe Bhangra Pounde Ne&lt;/a&gt; – Gurdas Mann.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Ok, back to tech topic :), just realized that this small series of presentations about Cataroo is actually what I had in mind for segment 2 of my &lt;a href="http://jananuraga.blogspot.com/2009/02/preview-of-section-2-ims-app-dev.html"&gt;IMS video-series&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-6963777626289635205?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/6963777626289635205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=6963777626289635205' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/6963777626289635205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/6963777626289635205'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2010/03/cataroo-presentation-part-2-test-cases.html' title='Cataroo Presentation – Part 2 – Test cases'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_M06zGolBz4A/S5SpA0yjJXI/AAAAAAAAAKY/r8nUot6XxbQ/s72-c/video3f976369f194%5B3%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-8536936747484307151</id><published>2010-03-01T01:32:00.007-06:00</published><updated>2010-03-23T17:36:56.547-06:00</updated><title type='text'>Sharing: SIP-based call-recording application</title><content type='html'>&lt;div style="text-align: left;"&gt;I found this when I was digging my old archives last weekend:&lt;br /&gt;&lt;/div&gt;&lt;div style="width: 425px;" id="__ss_3303759"&gt;&lt;strong style="margin: 12px 0pt 4px; display: block;"&gt;&lt;a href="http://www.slideshare.net/raka.angga/call-recording-design" title="Call Recording Design"&gt;Call Recording Design&lt;/a&gt;&lt;/strong&gt;&lt;object height="355" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=callrecordingdesign-100301012554-phpapp02&amp;amp;stripped_title=call-recording-design"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=callrecordingdesign-100301012554-phpapp02&amp;amp;stripped_title=call-recording-design" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding: 5px 0pt 12px;"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/raka.angga"&gt;raka.angga&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;It was a quick slides I made to highlights the design of a (prototype of) call-recording application we implemented in late 2008. As you can see in the slides, this application facilitates both manual and automatic recording of calls made with contact-center agents.&lt;br /&gt;&lt;br /&gt;The recording itself is achieved by dragging the contact-center agent and the customer into a dynamically-created conference room, and have a silent-participant in the room, taping the conversation.&lt;br /&gt;&lt;br /&gt;It is a sub-optimal solution. A better one would be to use things like &lt;a href="http://mediaproxy.ag-projects.com/"&gt;mediaproxy&lt;/a&gt; or &lt;a href="http://www.rtpproxy.org//"&gt;rtpproxy&lt;/a&gt; (have the RTP streams in the call go through that proxy, and tap the packets right there). The reason we designed it that way -- using conference -- is because they wanted to make use of the media server (with support for conferencing) that they have bought.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.box.net/shared/5gxbhxg98i"&gt;The source code is opened now&lt;/a&gt;; should serve as an additional resource for you who just started SIP-application development. I don't have time at this moment to write a how-to deploy and run it, less the detail of the design &amp;amp; code.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;I invite you to do it.&lt;/span&gt; If you'd like to take that invitation, please write me an email at raka.angga@gmail.com or you can simply drop a comment here. Your help on this will be greatly appreciated, and it would really help fellow engineers out there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-8536936747484307151?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/8536936747484307151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=8536936747484307151' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/8536936747484307151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/8536936747484307151'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2010/03/sharing-sip-based-call-recording.html' title='Sharing: SIP-based call-recording application'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-4616776459194354716</id><published>2010-02-26T09:52:00.005-06:00</published><updated>2010-03-08T01:54:27.244-06:00</updated><title type='text'>Cataroo presentation -- part one.</title><content type='html'>&lt;p&gt;Just uploaded the first part of the presentation of &lt;a href="http://jananuraga.blogspot.com/2010/02/cataroo.html"&gt;Cataroo&lt;/a&gt;. &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:0bdbddd0-265d-41d6-867d-6c4ba2fc4ac6" class="wlWriterEditableSmartContent"&gt;&lt;div id="b3f999db-8fd9-4579-9a5b-c67e14df090b" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=RLXztxWPSSw" target="_new"&gt;&lt;img src="http://lh5.ggpht.com/_M06zGolBz4A/S4fuWHe9dmI/AAAAAAAAAIk/aplqXZi43M4/videod4633a9426b5%5B3%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('b3f999db-8fd9-4579-9a5b-c67e14df090b'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/RLXztxWPSSw&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/RLXztxWPSSw&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;I already have the screen-recordings of the manual executions of the test-cases. I need to edit them to present of a single, coherent story. I still have to think about a couple of points to say especially in the design of the test-cases section and data analysis section. I might be able to post the narration for the second (hopefully final) part tonight.&lt;/p&gt;  &lt;p&gt;In the meantime, I hope you find this one useful!&lt;/p&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Update:&lt;/span&gt; Just uploaded another video in this series, &lt;a href="http://jananuraga.blogspot.com/2010/03/cataroo-presentation-part-2-test-cases.html"&gt;part 2 of cataroo presentation&lt;/a&gt;.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-4616776459194354716?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/4616776459194354716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=4616776459194354716' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/4616776459194354716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/4616776459194354716'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2010/02/cataroo-presentation-part-one-just.html' title='Cataroo presentation -- part one.'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_M06zGolBz4A/S4fuWHe9dmI/AAAAAAAAAIk/aplqXZi43M4/s72-c/videod4633a9426b5%5B3%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-2273798807856206033</id><published>2010-02-22T19:23:00.019-06:00</published><updated>2011-06-01T09:48:20.707-05:00</updated><title type='text'>Cataroo</title><content type='html'>&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 236px; height: 377px;" src="http://1.bp.blogspot.com/_M06zGolBz4A/S4MxY-6Mv8I/AAAAAAAAAIQ/TwAlKDYa1Qk/s400/cataroo.jpg" alt="" id="BLOGGER_PHOTO_ID_5441247080067416002" border="0" /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight:bold;" &gt;UPDATE&lt;/span&gt;: &lt;a href="http://jananuraga.blogspot.com/2010/02/cataroo-presentation-part-one-just.html"&gt;The video is available in another blog entry&lt;/a&gt;.&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;&lt;span class="Apple-style-span" &gt;UPDATE&lt;/span&gt;&lt;/b&gt;: &lt;a href="http://jananuraga.blogspot.com/2009/10/automated-scenario-test-descriptor.html"&gt;The user manual of Automated Scenario-Test Descriptor is available in another blog entry&lt;/a&gt;.&lt;/blockquote&gt;&lt;br /&gt;At this very moment I'm making a video presentation of a test-tool I just made. It is a cross-breed between &lt;a href="http://jananuraga.blogspot.com/2009/10/automated-scenario-test-descriptor.html"&gt;that bastard thing&lt;/a&gt;, and a great test framework named &lt;a href="http://echarts.org/Downloads/View-document/KitCAT_techreport_2008.html"&gt;KitCAT&lt;/a&gt; (Kit for Converged Application Test).&lt;br /&gt;&lt;br /&gt;What's cataroo, you might ask. Well, here's the story. First, I named it BastardizedCAT (from Bastard + KitCAT). But then I found the name a bit ugly (it doesn't sound funny). A lookup in dictionary gave me this:&lt;br /&gt;&lt;blockquote&gt;bastardized adj. (Arts): deriving from more than one source or style. impure (vs. pure) --- (combined with extraneous elements) [WordNet 1.5].&lt;/blockquote&gt;So, it's cross-breed, sort of. Coincidentally, when I was thinking of a better name, my cat was doing weird poses on my bed (please don't get me wrong). I was like: "Huh? Is that a kangaroo lying on my bed?". That's how the name cataroo came up (a cross-breed between cat and kangaroo).&lt;br /&gt;&lt;br /&gt;Alright, here's the storyboard, with narration, of the presentation:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;UPDATE:&lt;/span&gt; because I wouldn't be able to finish the video tonight, I decided to uploaded the scenario.xml (that contains the automation code) here. Look for it at the end of this posting. This is to give a sneak peek of what is to come....&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;(1) What's the purpose of this presentation.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In this presentation I'm going to show a way we can automate the testing of converged application. As in &lt;a href="http://jananuraga.blogspot.com/2009/02/preview-of-section-2-ims-app-dev.html"&gt;my other presentations&lt;/a&gt;, I will still be talking about telephony application, specifically the ones that use SIP as the signaling protocol.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(2) What's the story line of this presentation.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Before we get to the point of crafting the automation of our tests, we certainly have to start with an understanding of what we will be testing. Therefore I'm going to start with an explanation of the application I use as the vehicle in this presentation. You can take it as a quick-briefing about the requirement of the application.&lt;br /&gt;&lt;br /&gt;Then, based on the understanding, we will move on to defining the test cases. We are not going to go in depth here with the techniques of designing system test-cases for this kind of application. So, we will just settle with a couple of basic / normal use-case scenarios.&lt;br /&gt;&lt;br /&gt;Once we have the test-case defined, we, ourselves, will have to run it. This activity is useful, obivously, to validate the test-case. We might learn that we have missed a couple of steps, made several wrong assumptions, etc. Related to the automation, one of the aspect we will have to learn / investigate by manually executing the test-case is the data. At the end of the day, I think, an application is about consuming, processing, and producing data. So, we want to make sure all the elements involved in the scenario that we are testing are producing and getting the correct data, which implies -- to some degree -- it processes the data correctly. Analyzing how the data is being processed, however, is another topic. We are not going to spend much time on it in this presentation.&lt;br /&gt;&lt;br /&gt;Assuming that the test-case passed, our aim from learning the data is to know for a fact what constitute the "correct data". Of course, ideally, a major part of that knowledge should be obtainable from the requirement or design document. However, there is always a possibility that a couple of details are missing from those places. Hopefully we will be able to find out about it by manually executing the test-cases and doing data inspection.&lt;br /&gt;&lt;br /&gt;So, in this presentation I will show you how to obtain the data (specifically the SIP messages), and how to relate them to the steps in the test-case.&lt;br /&gt;&lt;br /&gt;Finally, we compile all that knowledge and transform them into the the automation code.&lt;br /&gt;&lt;br /&gt;That would be it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(3) Explain the application.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The application we will be testing is basically a SIP server that is capable of making a callback to someone (let's call it partyA) whenever someone else (partyB) is available. Here is the case:&lt;br /&gt;&lt;br /&gt;There's a person Alice, who is very excited about an important business opportunity she just identified. She wants to tell her colleague, Bob, right away, on the phone. Bob was busy doing house chores. Being a responsible and honest person, he set his presence status to BUSY. The call from Alice, obviously, wouldn't get through.&lt;br /&gt;&lt;br /&gt;Without this application, Alice would hear the ringing tone on her phone, which after 20-30 seconds would go away. No call is made. Alice, can retry later, of course, as long as she doesn't forget to do it.&lt;br /&gt;&lt;br /&gt;With this application, Alice would be presented with an IVR that will ask her if she wants to be called back whenever Bob is available to take calls. Let's suppose Alice says "yes" (by pressing a key on her phone to indicate the choice). For Alice, it means one less thing to carry around in her head; "call bob, call bob later today". What a relief.&lt;br /&gt;&lt;br /&gt;Now imagine Bob has finished washing the dishes, and ready to take calls. He will announce it on the web, saying "hey guys, I can to take calls now.". Well, for now, it actually will be as simple as picking AVAILABLE from the list statuses in a webpage that comes with the application, and specifying his SIP URI. [show screenshot].&lt;br /&gt;&lt;br /&gt;At the very moment Bob makes that change, the application will establish a call with Alice, play an announcement to her ("Alice, we're going to connect you with Bob now. Please stay in line"),  establish another call with Bob, and finally bridge the two calls, resulting in Alice and Bob talking to each other.&lt;br /&gt;&lt;br /&gt;This application is a good vehicle for this presentations, because it has the following characteristics I'd like to show that we can write the automation for, using the tool I will present at the end of this presentation:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It involves interaction with IVR, and there's a need to pass DTMF signal from a caller to the application. This is quite common in telephony applications, and we would like to know if the test tool we will be using allows us to do that, easily.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;It involves interaction using SIP (on the phone) as well as HTTP (using the web-browser). Furthermore, those two are interlinked. By that I mean an action performed during the call session (on the phone), will affect the state the application, and _that_ can be observed from the other side (the web browser). Vice versa. We _will_ see that the test tool allows us to automate the interaction from both sides.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(4) Explain a simple (basic / normal) test case&lt;/span&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(5) Guide the audience through executing the test case manually &lt;/span&gt;&lt;br /&gt;...&lt;br /&gt;Also explain how to gather the data we need, and relate them to the steps in the test case.&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(6) Guide the audience through crafting the automation  &lt;/span&gt;&lt;br /&gt;...&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;UPDATE:&lt;/span&gt; Date 25 Feb. 2010. Just uploaded the &lt;a href="http://jananuraga.blogspot.com/2010/02/cataroo-presentation-part-one-just.html"&gt;first part of Cataroo (video) presentation&lt;/a&gt;.&lt;/blockquote&gt;&lt;a title="View scenario2.xml on Scribd" href="http://www.scribd.com/doc/27314290/scenario2-xml" style="margin: 12px auto 6px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;"&gt;scenario2.xml&lt;/a&gt; &lt;object id="doc_869137039739289" name="doc_869137039739289" type="application/x-shockwave-flash" data="http://d1.scribdassets.com/ScribdViewer.swf" style="outline-color: -moz-use-text-color; outline-style: none; outline-width: medium;" height="600" width="100%"&gt;  &lt;param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf"&gt;  &lt;param name="wmode" value="opaque"&gt;   &lt;param name="bgcolor" value="#ffffff"&gt;   &lt;param name="allowFullScreen" value="true"&gt;   &lt;param name="allowScriptAccess" value="always"&gt;   &lt;param name="FlashVars" value="document_id=27314290&amp;amp;access_key=key-1o51otf56v19ibhbs62y&amp;amp;page=1&amp;amp;viewMode=list"&gt;   &lt;embed id="doc_869137039739289" name="doc_869137039739289" src="http://d1.scribdassets.com/ScribdViewer.swf?document_id=27314290&amp;amp;access_key=key-1o51otf56v19ibhbs62y&amp;amp;page=1&amp;amp;viewMode=list" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" bgcolor="#ffffff" height="600" width="100%"&gt;&lt;/embed&gt;  &lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-2273798807856206033?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/2273798807856206033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=2273798807856206033' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/2273798807856206033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/2273798807856206033'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2010/02/cataroo.html' title='Cataroo'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_M06zGolBz4A/S4MxY-6Mv8I/AAAAAAAAAIQ/TwAlKDYa1Qk/s72-c/cataroo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-6426841677180270967</id><published>2010-01-15T17:56:00.004-06:00</published><updated>2011-02-01T23:44:59.586-06:00</updated><title type='text'>Bastard (Big Automated Scenario-Test Active Runtime-Director)</title><content type='html'>&lt;p&gt;&lt;b&gt;&lt;span class="Apple-style-span" &gt;UPDATE:&lt;/span&gt; The source code of bastard lib is now available&lt;a href="http://www.box.net/shared/q0f90dmmx4"&gt; http://www.box.net/shared/q0f90dmmx4&lt;/a&gt; &lt;/b&gt;&lt;/p&gt;&lt;p&gt;Anything goes just to have a nasty-sounding product name, eh? :D &lt;/p&gt;  &lt;p&gt;Ok, so this entry is highly related to the &lt;a href="http://jananuraga.blogspot.com/2009/10/automated-scenario-test-descriptor.html"&gt;previous entry&lt;/a&gt; where I post a documentation that explains (mostly) the format of the XML file in which you describe your test scenario. In this entry I'm posting the Java library I wrote that consumes the XML and runs the scenario. Download it from here: &lt;a href="http://www.box.net/shared/nfns0u79k9"&gt;http://www.box.net/shared/nf&lt;/a&gt;&lt;a href="http://www.box.net/shared/nfns0u79k9"&gt;ns0u79k9&lt;/a&gt; . &lt;/p&gt;  &lt;p&gt;Well, it's not the library per se. Instead it's a little test project that uses the library. The library itself is included in that project (look for a file named bastard_api.jar in that ZIP; that's the library you would import into your project).&lt;/p&gt;  &lt;p&gt;Alright, time for a quick explanation. Basically you will have to create a little program -- which I refer to as "Director" -- in order to use the Bastard API. It is typically very simple. Basically what it does are: &lt;strong&gt;(1)&lt;/strong&gt; Loads the content of the XML file (whose name is passed in as an argument to the program execution). Then you &lt;strong&gt;(2)&lt;/strong&gt; feed that XML string into a method named loadScenarioDef that belongs to the library class named ScenarioRunner. In return you will get an instance of ScenarioDefinition. Further you &lt;strong&gt;(3)&lt;/strong&gt; create an instance of ScenarioRunner and spawn a thread to run it. There's an instance method named run that belongs to ScenarioRunner, into which you will have to pass the scenario definition you created in step 1 and the instance of mediator (see the doc in the &lt;a href="http://jananuraga.blogspot.com/2009/10/automated-scenario-test-descriptor.html"&gt;previous entry&lt;/a&gt; to understand the meaning of it) .&lt;/p&gt;  &lt;p&gt;Some screenshots...:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step (1)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border: 0px none ; display: inline;" title="frijoldirector_01" alt="frijoldirector_01" src="http://lh4.ggpht.com/_M06zGolBz4A/S1EAlwX3BzI/AAAAAAAAAHA/7A1NYYG4CJQ/frijoldirector_01%5B11%5D.jpg?imgmax=800" border="0" height="206" width="561" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step (2)&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="border: 0px none ; display: inline;" title="frijoldirector_02" alt="frijoldirector_02" src="http://lh6.ggpht.com/_M06zGolBz4A/S1EAmD-oFlI/AAAAAAAAAHE/qY2o-A8-_3c/frijoldirector_02%5B8%5D.jpg?imgmax=800" border="0" height="292" width="561" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step (3)&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="border: 0px none ; display: inline;" title="frijoldirector_03" alt="frijoldirector_03" src="http://lh6.ggpht.com/_M06zGolBz4A/S1EAmhHiE6I/AAAAAAAAAHI/57SqDOuHBjE/frijoldirector_03%5B8%5D.jpg?imgmax=800" border="0" height="299" width="560" /&gt; &lt;/p&gt;  &lt;p&gt;As you see in the screenshot of step 1, you will have to pass the path to the scenario XML file as the argument to the program execution. The project comes with several XML files that you can use to play with. Try &lt;em&gt;duh.xml&lt;/em&gt; first (for its nice name). If you’re using Netbeans, use the following screenshot as a reference.&lt;/p&gt;  &lt;p&gt;&lt;img style="border: 0px none ; display: inline;" title="frijoldirector_05" alt="frijoldirector_05" src="http://lh6.ggpht.com/_M06zGolBz4A/S1EAnOQ4pgI/AAAAAAAAAHM/RFraT9CEIMs/frijoldirector_05%5B4%5D.jpg?imgmax=800" border="0" height="174" width="558" /&gt; &lt;/p&gt;  &lt;p&gt;By running &lt;em&gt;FrijolDirector&lt;/em&gt; with &lt;em&gt;duh.xml&lt;/em&gt;, you should see this in the output console:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_M06zGolBz4A/S1EAnqnHYuI/AAAAAAAAAHQ/uBUmlOMr71k/s1600-h/frijoldirector_04%5B6%5D.jpg"&gt;&lt;img style="border: 0px none ; display: inline;" title="frijoldirector_04" alt="frijoldirector_04" src="http://lh4.ggpht.com/_M06zGolBz4A/S1EAoyjv9UI/AAAAAAAAAHU/sg50jRfKZyA/frijoldirector_04_thumb%5B4%5D.jpg?imgmax=800" border="0" height="491" width="561" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Okay. That’s all for today. Feel free to mail me in case you have trouble running / trying / using it. Saludos.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-6426841677180270967?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/6426841677180270967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=6426841677180270967' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/6426841677180270967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/6426841677180270967'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2010/01/anything-goes-just-to-have-nasty.html' title='Bastard (Big Automated Scenario-Test Active Runtime-Director)'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_M06zGolBz4A/S1EAlwX3BzI/AAAAAAAAAHA/7A1NYYG4CJQ/s72-c/frijoldirector_01%5B11%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-2292469365878243155</id><published>2009-10-26T22:25:00.004-06:00</published><updated>2011-06-01T09:38:34.093-05:00</updated><title type='text'>Automated Scenario-Test Descriptor</title><content type='html'>Hi,&lt;br /&gt;&lt;br /&gt;It's been a long time, can't do much right now, lottachanges, will write about that later. However, I feel the need to share this document I wrote a little while ago; it's a documentation of a test-tool I wrote for the work.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;&lt;span class="Apple-style-span" &gt;The context of this post:&lt;/span&gt;&lt;/b&gt; &lt;a href="http://jananuraga.blogspot.com/2010/02/cataroo.html"&gt;Cataroo&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;Well, through the process, I learned two things, I believe:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I kind of see the value of functional programming now.&lt;/li&gt;&lt;li&gt;I feel the need to learn Scala, for its promise of better support for conccurency / parallelism.&lt;/li&gt;&lt;li&gt;I see the value of Continuation. I had to keep the number of active threads below certain limit. There are situations where a thread have to wait, but I can't simply use sleep(), because it would't release the thread. So, in Java, without Continuation, I had to do some tricks to achieve the effect pausing / resuming thread (basically I had to make the thread stores its current state somewhere, before entering "paused mode", and immediately exits its run() method. Later, when the thread has to be resumed, another process will retrieve its current state, kick it to run, and pick up from where it left off. Tricky, could've been easier with Continuation, I guess).&lt;/li&gt;&lt;/ul&gt;So here it is (can't share the code right now, but I hope you still find value in the documentation). Feel free to ask me if you want to know more how it was designed and implemented.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;UPDATE:&lt;/span&gt; the JAR of the library can be downloaded from &lt;a href="http://jananuraga.blogspot.com/2010/01/anything-goes-just-to-have-nasty.html"&gt;http://jananuraga.blogspot.com/2010/01/anything-goes-just-to-have-nasty.html &lt;/a&gt;&lt;br /&gt;&lt;a title="View Automated Scenario Test on Scribd" href="http://www.scribd.com/doc/21680455/Automated-Scenario-Test" style="margin: 12px auto 6px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;"&gt;Automated Scenario Test&lt;/a&gt; &lt;object codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" id="doc_814239676519618" name="doc_814239676519618" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="450" align="middle" height="500"&gt;  &lt;param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf?document_id=21680455&amp;amp;access_key=key-bxyhlut3j1e90yaxqur&amp;amp;page=1&amp;amp;version=1&amp;amp;viewMode=list"&gt;   &lt;param name="quality" value="high"&gt;   &lt;param name="play" value="true"&gt;  &lt;param name="loop" value="true"&gt;   &lt;param name="scale" value="showall"&gt;  &lt;param name="wmode" value="opaque"&gt;   &lt;param name="devicefont" value="false"&gt;  &lt;param name="bgcolor" value="#ffffff"&gt;   &lt;param name="menu" value="true"&gt;  &lt;param name="allowFullScreen" value="true"&gt;   &lt;param name="allowScriptAccess" value="always"&gt;   &lt;param name="salign" value=""&gt;            &lt;param name="mode" value="list"&gt;       &lt;embed src="http://d1.scribdassets.com/ScribdViewer.swf?document_id=21680455&amp;amp;access_key=key-bxyhlut3j1e90yaxqur&amp;amp;page=1&amp;amp;version=1&amp;amp;viewMode=list" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" play="true" loop="true" scale="showall" wmode="opaque" devicefont="false" bgcolor="#ffffff" name="doc_814239676519618_object" menu="true" allowfullscreen="true" allowscriptaccess="always" salign="" type="application/x-shockwave-flash" mode="list" width="450" align="middle" height="500"&gt;&lt;/embed&gt; &lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-2292469365878243155?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/2292469365878243155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=2292469365878243155' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/2292469365878243155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/2292469365878243155'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2009/10/automated-scenario-test-descriptor.html' title='Automated Scenario-Test Descriptor'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-1870289119510560876</id><published>2009-08-06T13:51:00.013-05:00</published><updated>2009-08-07T08:10:47.839-05:00</updated><title type='text'>Another random stuff; randomness continued....</title><content type='html'>&lt;span style="font-weight: bold;"&gt;[This is a continuation of &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://jananuraga.blogspot.com/2009/07/random-stuffs-1.html"&gt;this entry&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I just finished (quick)reading a book titled &lt;a href="http://www.amazon.com/Charging-Telecommunications-Wireless-Communications-Computing/dp/0470775653/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1249584706&amp;amp;sr=8-1"&gt;"Charging for Mobile All-IP Telecommunications"&lt;/a&gt;..., and I think it's a good book. It helps me get a little more into the detail of diameter (protocol). Well, this book does not only explain &lt;a href="http://en.wikipedia.org/wiki/Diameter_%28protocol%29"&gt;diameter&lt;/a&gt; / charging in &lt;a href="http://www.information-age.com/articles/282661/what-is-ims.thtml"&gt;IMS&lt;/a&gt; network; it also has chapters on charging in GSM and GPRS network. But the part that interests me more of course are the parts on IMS. What I like about the book: it explains the message-exchange for each charging scenario, step-by-step, with some concrete example values to further illustrate the point(s). It helps a lot.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Charging-Telecommunications-Wireless-Communications-Computing/dp/0470775653/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1249584706&amp;amp;sr=8-1"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/41iDbKyZ4HL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Well, that's all my review :). Ok, I'm not so good at it. Anyway, this charging stuffs is a soup of acronyms (yuck). Here are the acronyms I think I need to know / care about for this moment: CDF, &lt;a href="http://en.wikipedia.org/wiki/Online_charging_system"&gt;OCS&lt;/a&gt;, Ro, Rf, and HSS.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;CDF (charging data function):&lt;/span&gt; the element that receives charging events from various other elements in the (IMS) network, and constructs the complete CDR, before (eventually) handling it over to the billing system.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;HSS (home subscriber service):&lt;/span&gt; the element that stores user's profile (authentication info and subscription profile). The authentication server queries this element (that goes without saying).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;OCS (online-charging system):&lt;/span&gt; the element that calculates service-usage charges. It is primarily used in prepaid-charging scenarios. So, whenenever a service is to be consumed by a subscriber, the SIP proxy / AS sends a request to the OCS, that will trigger a price-calculation on the OCS. Assuming the subscriber still has credits left in her account, the OCS will return a success response, containing the amount of time / volume granted, and the service starts being delivered. In case the service is session-based, the SIP proxy / AS will periodically send other requests, similar to one sent at the beginning, asking for additional credit-usage, to the OCS. All those message-exchanges go through the Ro reference point.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Ro:&lt;/span&gt; the "reference point" between the CDF and SIP proxies (and the SIP application server) in the (IMS) network. It is used in &lt;a href="http://www.tmforum.org/Community/groups/revenue_management_group/wiki/online-versus-offline-charging.aspx"&gt;offline charging&lt;/a&gt;. The way I understand "reference point": diameter defines various reference points. I visualize a reference point as a line that connects two elements in the network, and it defines its own set of messages that can be / should be exchanged between those two elements, and in what order. Well, if diameter is a protocol, then I'd say "reference point" is a protocol inside the protocol..., or sub-protocol. So, for each event / session each it manages, those SIP proxies and application server (AS) sends a message to the CDF. Using some correlation mechanism, the CDF builds the complete CDR based on the messages it receives from those proxies and AS.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Rf:&lt;/span&gt; the "reference point" between the OCS and the SIP proxies and SIP AS.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Ok, those are the factoids. How am I going to use them? Well, I was trying to estimate the development effort for the teleconference system, especially the parts related to charging. First, I need to know what needs to be built. Let's go over them again:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;CDF:&lt;/span&gt; I think we need to develop it. But I guess the "correlation function" would be quite tricky to implement; making it conform to a standard / RFC needs bunch of love, I mean, verifications and validations. I was wondering if there's any open source project, that can be used as a reference / example / base / building block. So far I haven't seen any. Anyway, if we have to build it we need a way to communicate with the SIP proxies / AS (to receive diameter requests, process them, and send the responses), and libraries like jdiameter (or openblox) can be very useful (we'll be using the diameter server library, particularly the one that abstracts away the Rf reference point).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;HSS:&lt;/span&gt; is there such thing as "standard of  structure of user profile, subscription profile, etc" for HSS? I guess there is none. At the end, it's "just another database application" in my opinion. You have more freedom in the implementation of your HSS, as long as it can be accessed through Sh reference point. Hmm.... On a second thought, implementing HSS should not be our priority. There are two possible situations: (a) the buyer does not have HSS already, or (b) the buyer already has HSS (e.g.: a telco operator that owns an IMS-network).&lt;br /&gt;&lt;br /&gt;In case (b) we'd better spend our effort more on making sure our teleconferencing system will be able to exploit the richness in the structure of the operator's user / subscription profile (which reflects the operator's charging requirements)..., and vice versa: making sure the operator can exploit the exploit the richness of "chargeabilities" (and functionalities) of our teleconferencing system. In short, we'll have to build an adaptor, a two-way adaptor I'd call it. My tactic would be: (1) brainstorm and investigate the possible ways of charging the users of our teleconferencing system, (2) obtain all the information we can have regarding potential buyer's charging requirements / capabilities, (3) prioritize the list we made in step 1, taking into account the information we obtained in step 2.&lt;br /&gt;&lt;br /&gt;Hmm..., allright, what about case (a)? My short answer for this moment: implement our own HSS. I mean, we define our own schema for storing user and subscriptions profile (just a database application, really, in my view), and provide a thin wrapper around it such that it can be queried using diameter protocol (through Sh reference point). The design of that schema would go in lockstep with the design of the functionalities (thus chargeabilities).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Back to CDF:&lt;/span&gt; I think the situation is quite similar to that of HSS: (a) the buyer does not have CDF, or (b) the buyer already has CDF. Frankly, I have a couple of doubts related to CDF. First: so, this CDF is the one responsible for the construction of the complete CDR out of the events received from various nodes, by executing the correlation function. But who defines the format of the CDR? Is it tied to the billing system that is used? I guess the answer is no, because there's a &lt;a href="http://en.wikipedia.org/wiki/Billing_Mediation_Platform"&gt;mediation element&lt;/a&gt; (part of the billing solution) that performs the translation / mapping of the CDRs it receives (in any format) to a format suitable for that billing system. So..., who? Some standard body? I tried googling for it, including looking at the Parlay specs., but nada. Is it the operator (that owns the entire system)? So, in that scenario, the service provider will have to deliver CDRs according to the format specified by the operator. Hmm..., I guess the answer is no, for the same reason: that's why they have the mediation element. What is left then: the service provider itself, us (with close collaboration with the operator, supposedly).&lt;br /&gt;&lt;br /&gt;For the sake of discussion let's assume the latter is true. In that case, the CDF will produce CDR in various formats (one for each service). To me that implies: there are several "correlation functions" installed in that CDF. I picture this "correlation function" as a plugable module (one for each service). Who then is responsible for the implementation of the correlation function of a service? I guess the answer is the service provider itself (again, with close collaboration with the operator), because it posses a better knowledge of the events generated by the service (and their correlations).&lt;br /&gt;&lt;br /&gt;Eh, wait a second..., am I wrong to think that CDF overlaps with meditation in several areas / tasks? But, hey, there's another element between the CDF and the billing system; the "charging gateway function" (CDF)..., and to me (again) it overlaps with billing mediation. This starts to confuse me.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;This whole questioning got me thinking:&lt;/span&gt; wouldn't it be easier (and better) if we get a copy of a charging platform that has CDF and HSS, evaluate it, see how it works, see how it can / should be customized or extended in order to make it work with our teleconferencing system. That strategy will help us cast our doubts more quickly. After all, we're not in the business of charging platform (eventhough an intimate knowledge of such platform will be very helpful in designing and selling our solution).&lt;br /&gt;&lt;br /&gt;So I googled around, and here are what I found:&lt;/li&gt;&lt;/ul&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.digitalroute.com/product/productsolutions/ims/"&gt;http://www.digitalroute.com/product/productsolutions/ims/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.sitronicsts.com/en/products_and_solutions/telecoms_and_media/bss_oss_product_lines/foris_charging_and_billing.html"&gt;http://www.sitronicsts.com/en/products_and_solutions/telecoms_and_media/bss_oss_product_lines/foris_charging_and_billing.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.intecbilling.com/Intec/Products+Services/Products/Charging+and+Billing/Intec+IMS+Charging+Solution.htm"&gt;http://www.intecbilling.com/Intec/Products+Services/Products/Charging+and+Billing/Intec+IMS+Charging+Solution.htm&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.openet-telecom.com/"&gt;http://www.openet-telecom.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=2820719305895422701&amp;amp;postID=1870289119510560876#%20http://advoss.com/IMS_offlinecharging.htmlhttp://www.marben-products.com/diameter/overview.html"&gt;http://advoss.com/IMS_offlinecharging.htmlhttp://www.marben-products.com/diameter/overview.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.tieto.com/default.asp?path=1%3B93%3B16080%3B124%3B16837%3B17193%3B16242%3B36978%3B37078"&gt;http://www.tieto.com/default.asp?path=1%3B93%3B16080%3B124%3B16837%3B17193%3B16242%3B36978%3B37078&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I had to check the whole set of returned links by google queries: +IMS +charging and "charging data function" just to get that list :).&lt;br /&gt;&lt;br /&gt;Allright..., next what? Hmm.... well, I guess I'll just leave it here for now. On to OCS.&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;OCS:&lt;/span&gt; Well, like I already stated, if the 3rd-party charging system we use already has it, then fine, not much to say here. But if not, no other choice we'll have to build it in-house. It is a component that resides very close to the billing system (where subscriber's account information is managed), so I think the OCS can be made as an extension to or something that is built on-top of the billing system. I don't have much time right now to do some more research on this, but if you'd like to know some more, here is an interesting, relevant wikipage: &lt;a href="http://en.wikipedia.org/wiki/Online_charging_system"&gt;http://en.wikipedia.org/wiki/Online_charging_system&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Finally, I'd like to turn our attention to the application server,&lt;/span&gt; where the core of our conferencing server, supposedly, will be deployed. The application will be sending events to various charging elements. It is quite likely that it would be something that changes quite often (i.e.: we add / change feature, we change the structure of service and user profile, etc..., and somehow it would impact the chargeability of the application, hence the the events need to be sent). I was thinking: how to design and implement the application such that those changes in charging would not imply direct change in the main code (whose concern is mainly the administration of live conferences and activities within the conference room). Could it be that &lt;a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming"&gt;aspect-oriented programming&lt;/a&gt; is the right answer?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Lastly, for those who like to see things explained with lines of code (me too),&lt;/span&gt; here's a nice article from Oracle: &lt;a href="http://www.oracle.com/technology/pub/articles/dev2arch/2007/07/IMC-charging-architecture.html"&gt;"Understanding IMS Charging Architecture"&lt;/a&gt;..., and the use of diameter API in BEA (oracle) Weblogic SIP server is detailed here:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://e-docs.bea.com/wlcp/wlss30/programming/diameterrf.html"&gt;Using the Diameter Rf Interface Application for Offline Charging&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://e-docs.bea.com/wlcp/wlss30/programming/diameterro.html"&gt;Using the Diameter Ro Interface Application for Online Charging&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;One last note:&lt;/span&gt; I don't mean to suggest that this conference solution will be designed specifically for deployment in IMS network (only) with this whole rambling about charging-related IMS elements. We should take it at the conceptual level. &lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;I mean, at least we should know what things we need to be considered as far as charging is concerned:&lt;/span&gt; there should be something that stores user and service profile (HSS), there should be something that correlates the charge-inducing / charging-related events sent by the conference server (CDF), and there should be something that calculates the charge, on-line (OCS). That's all. The names don't really matter. However, by following / learning from how those elements are organized in an IMS network, it will be easier for us to deploy our solution in an IMS network (when the need / opportunity arises). Beside that organization is pretty common I believe, and makes a good sense.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;Alright, another last note :):&lt;/span&gt; &lt;/span&gt;(and this is more a reminder to myself)&lt;span style="font-weight: bold;"&gt;:&lt;/span&gt; this whole desk-research over charging elements should not distract us from our main objective that is "to make our conferencing solution (more) appealing, also from charging and billing perspective". I think one way to achieve is by making sure (in the design) that our solution allows us / whoever buy this solution to be as creative / innovative as posssible in charging the users :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-1870289119510560876?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/1870289119510560876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=1870289119510560876' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/1870289119510560876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/1870289119510560876'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2009/08/another-random-stuff-randomness.html' title='Another random stuff; randomness continued....'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-2957093835147999298</id><published>2009-08-03T11:15:00.003-05:00</published><updated>2009-08-07T08:12:46.779-05:00</updated><title type='text'>Yet another segment of chapter 4</title><content type='html'>&lt;p&gt;Another little chunk, still in chapter 4, on implementing click-to-dial application using SIP Servlet. In this chunk the use of Re-INVITE message is shown and explained for the first time. &lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; display: inline; float: none;" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:5d7134d6-ae34-4a98-88e7-dbe9c4f27e8b" class="wlWriterEditableSmartContent"&gt;&lt;div id="37d8a7fd-58c7-4201-b931-7b2aedb9c466" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=zK1aFPLK9ZI" target="_new"&gt;&lt;img src="http://lh5.ggpht.com/_M06zGolBz4A/SncNGYGMuPI/AAAAAAAAAGA/lBu2EBq7CvQ/video47767ac971f1%5B3%5D.jpg?imgmax=800" style="border-style: none;" galleryimg="no" onload="var downlevelDiv = document.getElementById('37d8a7fd-58c7-4201-b931-7b2aedb9c466'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/zK1aFPLK9ZI&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/zK1aFPLK9ZI&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;As usual, we scrutinize-and-map the SIP-flow diagram before doing any actual coding. I hope you like this one, as well ;).&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;[Context: &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://jananuraga.blogspot.com/2009/02/preview-of-section-2-ims-app-dev.html"&gt;video series&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;]&lt;/span&gt;&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/2820719305895422701-2957093835147999298?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/2957093835147999298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=2957093835147999298' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/2957093835147999298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/2957093835147999298'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2009/08/yet-another-segment-of-chapter-4.html' title='Yet another segment of chapter 4'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_M06zGolBz4A/SncNGYGMuPI/AAAAAAAAAGA/lBu2EBq7CvQ/s72-c/video47767ac971f1%5B3%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-369264180899382196</id><published>2009-07-29T11:06:00.012-05:00</published><updated>2009-08-07T08:11:45.105-05:00</updated><title type='text'>Random stuffs #1</title><content type='html'>Tired.&lt;br /&gt;&lt;br /&gt;I feel like crawling to finish the chapter 4 of my video series. Well, to be perfectly honest I haven't done anything about it in the last two weeks. Sigh. I feel exhausted. I need &lt;a href="http://www.globalgourmet.com/destinations/indonesia/gadogado.html"&gt;gado-gado&lt;/a&gt;, &lt;a href="http://carolineveronica.com/recipes/2006/09/sate_babi.html"&gt;sate babi&lt;/a&gt;, &lt;a href="http://www.baliguide.com/balicooking/sate.html"&gt;sate lilit&lt;/a&gt;, &lt;a href="http://www.whittycute.com/2008/11/masbar-tum-ayam.html"&gt;tum ayam&lt;/a&gt;, &lt;a href="http://www.fineliving.com/fine/mings_quest/article/0,,fine_15676_2728056,00.html"&gt;ayam betutu&lt;/a&gt;, nasi padang, nasi kuning, &lt;a href="http://www.baliguide.com/balifood/lawar_ayam.html"&gt;lawar bali&lt;/a&gt;, &lt;a href="http://chriswillard.multiply.com/recipes/item/31/Chicken_Steamed_Rice_Nasi_tim_ayam"&gt;nasi tim ayam&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Uduk_%28cuisine%29"&gt;nasi uduk&lt;/a&gt;, etc. They're all my fave indonesian foods :). Ok, one more saturday for chapter 4, and that's it. I will have to use a different strategy for chapter 5 (the final chapter) that talks about &lt;a href="http://en.wikipedia.org/wiki/VoiceXML"&gt;VoiceXML&lt;/a&gt;. I probably will record directly the training session on VoiceXML I'll try to set-up in the new company I'm working for. That will save time.&lt;br /&gt;&lt;br /&gt;Anyway, news: I just changed workplace. I have done my service as system analyst (on the side of nextel mexico) in the implementation of their new rating and billing system (using a product named &lt;a href="http://www.lhsgroup.com/products/"&gt;BSCS iX&lt;/a&gt; from a company named LHS). It was a 11-month assignment and it served me well, I got to know the possible parameters &amp;amp; scenarios for charging and reference about a commercial system for that purpose among other things.&lt;br /&gt;&lt;br /&gt;Now, still in Mexico City, I work for a startup company that specializes in development of VoIP system, and more specifically teleconferencing.&lt;br /&gt;&lt;br /&gt;In this entry I'd like to sum up a couple of things I've been thinking the last couple of days. First: I want to unify the knowledge I've gathered so far in rating &amp;amp; billing, SIP servlet, and VoIP in general in my effort of designing a complete teleconferencing solution (and business). Here's the list of technologies I'm currently looking at:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(1) Conferencing bridge&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We have things like Asterisk (with &lt;a href="http://www.voip-info.org/wiki/view/Asterisk+cmd+MeetMe"&gt;MeetMe&lt;/a&gt; or &lt;a href="http://www.voip-info.org/wiki/view/Asterisk+cmd+ConfBridge"&gt;ConfBridge&lt;/a&gt;), &lt;a href="https://jvoicebridge.dev.java.net/"&gt;jVoiceBridge&lt;/a&gt;, and some other commercial solutions (e.g.: &lt;a href="http://www.google.com.mx/url?q=http://www.avaya.com/gcm/master-usa/en-us/corporate/pressroom/pressreleases/2004/pr-041004.htm&amp;amp;sa=U&amp;amp;start=1&amp;amp;ei=SXRwSrCCBZTANdac2OgI&amp;amp;usg=AFQjCNEAQuJ09FV0McBAETxKpjgh1Ani6Q"&gt;Avaya's spectel&lt;/a&gt;). I know a little about how to use MeetMe in Asterisk, I played around a bit with it in 2006.&lt;br /&gt;&lt;br /&gt;jVoiceBridge provides &lt;a href="http://wiki.java.net/bin/view/Communications/jVoiceBridge"&gt;a good documentation at architectural level&lt;/a&gt; that helps me get a better idea of the functions / possible uses of a conferencing bridge. Additionaly, someone wrote &lt;a href="http://www.teknopipo.nl/archives/94"&gt;a nice intro to jVoiceBridge&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The design of the conferencing solution, of course, will have to accomodate the need to interface with several conferencing-bridge products. So, we'll have to build an abstraction layer. But, still, I need to know how those choices compare against each other in term of feature-set and performance, in order to be able to define a lowest-common denominator and prioritize the development effort.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(2) Rating-and-billing (including online-charging, which requires the use of AAA protocol).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is important because... well, it goes hand-in-hand with the business-model. I mean, the business-model dictates the requirement for the rating and billing system. This is a top-down view in my opinion.&lt;br /&gt;&lt;br /&gt;On the other hand, the more well-designed (flexible, extensible) the rating-and-billing system is, the more room is there for the business model to grow / move. This is the bottom-up view.&lt;br /&gt;&lt;br /&gt;I'm wearing the engineer hat at this moment; I'm taking the bottom-up view. I need to know what level of flexibility in rating-and-billing is possible with current (readily available) tools; how far we can go. So..., I tried getting &lt;a href="http://www.opensips.org/"&gt;opensips&lt;/a&gt; + &lt;a href="http://freeradius.org/"&gt;freeradius&lt;/a&gt; + &lt;a href="http://www.ag-projects.com/CDRTool.html"&gt;cdrtool&lt;/a&gt; installed. The reasons: (a) that's the first one that appear on google for my query :), and (b) I've heard good comments about opensips, especially when it comes to performance.&lt;br /&gt;&lt;br /&gt;I got opensips installed without problem on my debian linux. But it's completely a different story with CDRTool. The installation guide is not complete (a couple important stuffs are skipped. Apparently it assumes reader's familiarity with integration of freeradius with opensips). At the end, I failed to get it working. I wish somebody had written a better, more thorough, well-written and well-tested manual. Please let me know. I decided to drop it for a while; it already took my entire sunday last weekend!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(3) Still in rating-and-billing.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To my understanding, the combination of opensips + freeradius + cdrtool provides us only a way to decide whether a call is allowed (by querying freeradius), collect the SIP trace, store them in the database, correlate the INVITE and the BYE of a SIP session, calculate the duration, and apply the rating formulas to the session.&lt;br /&gt;&lt;br /&gt;Another component is needed for enabling online charging, that allows the call to be terminated once the credit reaches certain threshold. &lt;a href="http://www.ag-projects.com/"&gt;AG-Projects&lt;/a&gt; (the same company that produces CDRTool) has a product named "&lt;a href="http://callcontrol.ag-projects.com/"&gt;Call Control&lt;/a&gt;" just for that. It works together with CDRTool (as the rating engine) and opensips module named &lt;a href="http://www.opensips.org/html/docs/modules/1.5.x/call_control.html"&gt;callcontrol&lt;/a&gt; that queries the "Call Control" application every predetermined amount of time to find out whether or not the call should be dropped. That's how I see it.&lt;br /&gt;&lt;br /&gt;However, I just get the impression that CDRTool + CallControl only address the basics of rating. In order to make it commercially viable, it has to be augmented with other software packages that allow us to work with concepts like rate plan, rating package, promotion, free units, hierarchical account, etc. Please note I'm using my knowledge of BSCS iX as a reference.&lt;br /&gt;&lt;br /&gt;I came across this one &lt;a href="http://www.jbilling.com/"&gt;JBilling&lt;/a&gt;, an open-source billing software. From a quick glance, it seems to be feature-full enough. My upcoming tasks would be: buy the manuals of jbilling which in total would cost around 140 USD (or 40 USD without the extension and integration guide), evaluate it, and later investigate if it makes sense &amp;amp; worth the effort integrating it with opensips + cdrtool + freeradius + callcontrol.&lt;br /&gt;&lt;br /&gt;Worth the effort? Well..., I was a bit put off by the difficulties in getting opensips + freeradius + cdrtool to work, so I started to think: "If it's only about collecting SIP traces, detecting the start and stop of a call, and applying some simple rating functions then what's the big fuss about?". Allright, rating might be the not-so-easy part, but -- assuming jbilling is the right thing -- rating engine is already part of jbilling (see the &lt;a href="http://www.jbilling.com/product"&gt;general architecture diagram of jbilling&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;So, what is missing are CDR collection, online-charging (ability to disconnect the call once the credit is up), and authentication-and-authorization. Doing all of them in-house doesn't sound unreasonable to me. I think we can use SIP-servlet to implement them, and deploy them together with jbilling as a single deployment unit.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(4) Newer AAA (authentication, authorization and accounting) protocol: &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://en.wikipedia.org/wiki/Diameter_%28protocol%29"&gt;diameter&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My last concern about opensips + freeradius is the protocol it uses: &lt;a href="http://en.wikipedia.org/wiki/RADIUS"&gt;radius&lt;/a&gt;. Well, there's a newer protocol, diameter. What's the real advantage it offers to the conferencing system I want to build? I don't know yet, but if we plan to sell this solution to telco operator that uses IMS then I believe we have to work with diameter (as diameter is the AAA protocol of choice in the IMS architecture).&lt;br /&gt;&lt;br /&gt;So, again, that is another reason not to use opensips + freeradius + cdrtool combo in our solution, but instead implement the interfacing with diameter-based AAA system on our own. Furthermore, I have to think about providing a layer of abstraction in our code that would allow us to sell this solution to two kinds of customer: (a) those who don't have rating-and-billing system, and (b) those who do. For customers of type "a" we can bundle it together with our rating-and-billing system (based on jbilling, for example).&lt;br /&gt;&lt;br /&gt;Ok, again, assuming this part of the conferencing solution will be implemented as an enterprise java application containing SIP servlet components, then the availability of diameter stack in the SIP servlet container will be very much welcome. Fortunately that's how it is now: &lt;a href="https://sailfin.dev.java.net/"&gt;Sailfin&lt;/a&gt; will (or already?) have diameter stack (using &lt;a href="http://www.traffixsystems.com/site/Content/t2.asp?pid=241&amp;amp;sid=49"&gt;OpenBlox&lt;/a&gt;), read it here: &lt;a href="http://blogs.sun.com/theaquarium/entry/sailfin_diameter_support_online_charging"&gt;http://blogs.sun.com/theaquarium/entry/sailfin_diameter_support_online_charging&lt;/a&gt;. The same thing with &lt;a href="http://www.mobicents.org/"&gt;Mobicents&lt;/a&gt; from Redhat, it comes with diameter stack from &lt;a href="https://jdiameter.dev.java.net/"&gt;jdiameter&lt;/a&gt;. More detail here: &lt;a href="http://groups.google.com/group/mobicents-public/web/mobicents-diameter"&gt;http://groups.google.com/group/mobicents-public/web/mobicents-diameter&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Update: continued on &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://jananuraga.blogspot.com/2009/08/another-random-stuff-randomness.html"&gt;this entry&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;]&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-369264180899382196?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/369264180899382196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=369264180899382196' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/369264180899382196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/369264180899382196'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2009/07/random-stuffs-1.html' title='Random stuffs #1'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-3741257039531064875</id><published>2009-07-05T14:41:00.006-05:00</published><updated>2009-07-06T10:46:19.357-05:00</updated><title type='text'>First stab at chapter 1</title><content type='html'>&lt;p&gt;Where do I start? Allright, this picture. &lt;/p&gt;  &lt;p&gt;&lt;img style="border: 0px none ; display: inline;" title="diagramku_kecil" alt="diagramku_kecil" src="http://lh5.ggpht.com/_M06zGolBz4A/SlEB47i8uSI/AAAAAAAAAF8/OVn8n8i_yNI/diagramku_kecil%5B12%5D.png?imgmax=800" width="397" border="0" height="248" /&gt; &lt;/p&gt;  &lt;p&gt;Now the context: last monday we met in my place in mexico city. By we I mean: me, Eric, and Antonio. For the recording of chapter one of the &lt;a href="http://jananuraga.blogspot.com/2009/02/preview-of-section-2-ims-app-dev.html"&gt;video series&lt;/a&gt;. There was an interesting talk (platica), mostly between Eric and Antonio. &lt;/p&gt;  &lt;p&gt;Ok, this should've been in the video, but we simply didn't / forgot to do it :) No introductions recorded. Therefore allow me to put a brief one here. &lt;/p&gt;  &lt;p&gt;Antonio Echeverria works as a solution architect in one of those vendors that are pushing IMS. We knew each other when I was working in a project for an (fixed) operator in mexico. His role / job in the company allows him to get some insights of the current situation of the IMS, business and technical-wise, especially for the mexican market. He's been a telco domain for quite a long time, and I'm fortunate to be able to learn things from him. &lt;/p&gt;  &lt;p&gt;Eric Werkhoven was my colleague in the company we used to work for during 2005-2006. The company was developing a hosted call-center solution. Currently he works for another VoIP company producing &amp;amp; providing outbound / predictive dialing solution. A deep understanding and appreciation of the technical challenges in developing and deploying of large-scale VoIP solution is something that I learn from him now and then. &lt;/p&gt;  &lt;p&gt;Antonio and Eric are from two different worlds that are colliding (or converging?). I was happy to be able to get them together and talk, exchanging their views, which might not be completely aligned to each other. &lt;/p&gt;  &lt;p&gt;The talk we had last Sunday was mostly about the business-models / opportunities around IMS. We think that's the most important point to grasp before delving into technical discussion. I personally am interested to know the value-chain; to see where I -- viewing myself as a (potential :D) service provider -- might be able to fit in, and how to profit from it. That's what I would like to share with others in the video(s). Of course we don't pretend to become an authoritative source for that kind of information. We just wanted to capture our learning process. Here's the unedited conversation I managed to record (only 38 minutes). &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/p/7EFFCB1888D2D85E&amp;amp;hl=es&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/p/7EFFCB1888D2D85E&amp;amp;hl=es&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Unfortunately, we only had an hour to get together on that day. Because of my stupidity I also forgot to record the first 15 minutes of the conversation (when we were discussing the flow of the dialog); some interesting points were brought up there. &lt;/p&gt;  &lt;p&gt;So here I am now, grappling to collect those points and make up for the lacks. I'm trying to back up some of those points with some references I can find on the internet / other sources. Hopefully this can improve the value / usefulness of the information I'm going to provide in the video. &lt;/p&gt;  &lt;p&gt;Ok, so that's the context. I promise to post those points as a written text in a couple of days, before presenting them as a video. The point I'm presenting here -- just one point -- is a prelude to that post. &lt;/p&gt;  &lt;p&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;Content proxy.&lt;/span&gt; That's one thing that came up during the discussion. We were exploring the scenario where the operator acts as a proxy to the contents in the internet. In Eric's opinion, telco operators are not capable to compete with the internet. The rate of innovation that's happening in the internet is unparalleled. So the operator is not supposed to go down the path trying to (re)create the existing successful services / content on the internet. Basically he considers the thinking that "with IMS the telco operator can be like Google" is misguided at best. &lt;/p&gt;  &lt;p&gt;So, being a content proxy might be their (only?) option. Let's go back to the diagram. First and the foremost, IMS is supposed to provide the same set of basic telephony services that people already enjoyed with the current, non-IP, technologies. &lt;span style="color: rgb(204, 0, 0);"&gt;That's what line A represents.&lt;/span&gt; &lt;/p&gt;  &lt;p&gt;IMS lives in an IP network (after all IMS is an abbreviation for IP multimedia subsystem :P). In order to be able to fully deliver its promise(s), the clients also need to be in the IP network and have SIP-stack installed (among other things that make them IMS-capable). There aren't enough mobile devices in the market with such characteristics. In fact, it is an obstacle to a wide-spread adoption of IMS. &lt;/p&gt;  &lt;p&gt;However, people can already enjoy high-speed access to IP network; 3G. Mobile devices have improved significantly. Things like iPhone, for example, turn lack of screen-space and crippled web browsers into things of the past. People can have direct, unabridged access to services like YouTube, Last.FM, etc. &lt;span style="color: rgb(204, 0, 0);"&gt;That's what line B represents. &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-weight: bold;"&gt;The "content proxy" idea, to my understanding, is like trying to drive the subscribers away from line B to line C.&lt;/span&gt; People will do that willingly if they perceive additional values. &lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;What kind of additional values can be provided (with access through line C)? What does IMS -- and only IMS -- have to offer that enable such services?&lt;/span&gt; There was a relevant point raised during our discussion (that might provide an answer to those questions). It has to do with subscribers' profile (stored in the HSS) or rating &amp;amp; billing system (that is a complex stuff to install, configure, and manage correctly). Operators might be able to bank on it in their IMS offerings. That idea is still not perfectly clear to me, give me time to investigate it further. &lt;/p&gt;  &lt;p&gt;In the meantime, please chip in, help me enrich the discussion, help me arrive to the right conclusion. &lt;/p&gt;  &lt;p&gt;Thanks in advance and best regards,&lt;br /&gt;Raka&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;UPDATE:&lt;/span&gt; When the recording started we were talking about &lt;a href="http://www.ericsson.com/developer/sub/articles/other_articles/090119_connected"&gt;Connected Home&lt;/a&gt; that Antonio mentioned to us. It got me thinking of the effort from Ericsson to push further the widespread of this telco 2.0 app. development, by providing hosting for SIP-servlet applications (on Sailfin), and some helper APIs and other stuffs. Check it out on the &lt;a href="https://labs.ericsson.com/apis/mjcf"&gt;Ericsson Labs&lt;/a&gt; page.&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/2820719305895422701-3741257039531064875?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/3741257039531064875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=3741257039531064875' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/3741257039531064875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/3741257039531064875'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2009/07/first-stab-at-chapter-1.html' title='First stab at chapter 1'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_M06zGolBz4A/SlEB47i8uSI/AAAAAAAAAF8/OVn8n8i_yNI/s72-c/diagramku_kecil%5B12%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-3711134392070201793</id><published>2009-06-27T09:18:00.008-05:00</published><updated>2009-06-27T09:47:33.056-05:00</updated><title type='text'>A little note on C++</title><content type='html'>&lt;p&gt;I just did a little rehearsal, as part of bit-by-bit effort to revive the old plan of (re)implementing &lt;a href="http://jananuraga.blogspot.com/2008/12/db-conan-10.html"&gt;DBConan&lt;/a&gt; (this time with GUI). I plan to implement it using &lt;a href="http://www.qtsoftware.com/products/"&gt;QT framework&lt;/a&gt;, and that also means the programming language will be C++. &lt;/p&gt;  &lt;p&gt;Why QT? It looks neat and I need that because I will be very much concerned with interactivity, ease-of-use, graphical presentation of data, some (cool) animations maybe, and all that stuffs. QT seems to be a great choice. &lt;/p&gt;  &lt;p&gt;And why C++? I want to take advantage of &lt;a href="http://www.blogger.com/Oracle%20OCCI"&gt;Oracle OCCI&lt;/a&gt;, because this tool (in its first version) will be made specific for Oracle database. I haven't got a chance to check if there is something similar to &lt;a href="http://oreilly.com/catalog/9780596005177/"&gt;Oracle Data Dictionary&lt;/a&gt; -- which is vital for DBConan -- in other RDBMS..., let alone study them. &lt;/p&gt;  &lt;p&gt;Before anything else, &lt;a href="http://www.box.net/shared/poz0m0j5lc"&gt;here's the code&lt;/a&gt;, and below is the screenshot from running the code. I don’t have time and space right now to explain it. In fact, I don't think any explanation is needed. It's just some test-code I used to confirm / disprove my worries and cast my doubts.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_M06zGolBz4A/SkYqhmcVzHI/AAAAAAAAAFk/HU4-9usMqYQ/s1600-h/sontoloyo.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 227px; height: 320px;" src="http://4.bp.blogspot.com/_M06zGolBz4A/SkYqhmcVzHI/AAAAAAAAAFk/HU4-9usMqYQ/s320/sontoloyo.png" alt="" id="BLOGGER_PHOTO_ID_5352011963919879282" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Designing and writing program in C++ is one thing I don't feel very confident about myself. Well, the last time I programmed in C++ was in 2006, using &lt;a href="http://www.wxwidgets.org/"&gt;wxWidget&lt;/a&gt; and &lt;a href="https://developer.skype.com/"&gt;Skype API&lt;/a&gt; for the early prototype of &lt;a href="http://peerant.com/"&gt;peerant&lt;/a&gt;'s client application, which was not a lot of code, and lasted only for 6 months. So it's not enough. &lt;/p&gt;  &lt;p&gt;I've always been a &lt;a href="http://en.wikipedia.org/wiki/Defensive_programming"&gt;defensive programmer&lt;/a&gt;; I always try (up-front) to avoid making silly mistakes that can be hard to spot when the codebase gets big. To me, the keyword is "consistency". I remember my lecturer in the university taught me to be consistent in my choice of words, structure, and style in writing papers / technical documentations. I think the same exact principle holds true for software codes. First I need to know the field, understand the rules of the games, know the potential issues, make up some rules for avoiding the potential issues, and follow / apply them in a consistent manner. &lt;/p&gt;  &lt;p&gt;Straight to the core of the matter: I worry about object-lifetime management in C++. I want to minimize the likeliness of (me) making mistakes on that area. I need to clearly describe my worries, organize / structurize them, and hopefully come up some simple rules for avoiding the pitfalls..., or at least a kind of lookup-table for scanning such mistakes during code reviews. &lt;/p&gt;  &lt;p&gt;In Java / C# I don't remember I ever worried (too much) about this. It doesn't mean memory-related problems can not exist in applications written in those languages. Memory leaks can still occur, especially whenever in some parts of our code we cache objects (in containers like map or list) and forget to remove the cached object whenever we no longer use it, keeping the reference count from reaching 0..., and GC is of no help in that situation. &lt;/p&gt;  &lt;p&gt;But, in my understanding, it's relatively easier to detect (and avoid) that kind of problems with those languages. Beside, those languages have been designed in such way that there are less paths to getting into trouble with object-lifecycle management. &lt;/p&gt;  &lt;p&gt;"Less ways to get ourselves in trouble"? How come? One of the reasons, I think: in those languages we only deal with one thing, (object) reference. When we pass an object as function argument or return value, we always pass the reference to the object..., and that's the default behavior. Whenever we want to pass a copy of the object instead, we have to make that copy explicitly. &lt;/p&gt;  &lt;p&gt;It's quite different in C++; where we have both choices. We can declare the function this way: &lt;/p&gt;  &lt;p&gt;(a) void aFunction(Buck buck) //pass-by-value. The arg will be a new instance, whose internal values will be initialized through the copy-constructor. &lt;/p&gt;  &lt;p&gt;or this way: &lt;/p&gt;  &lt;p&gt;(b) void laFuncion(Buck&amp;amp; buck) //no copying here, it's pass-by-reference. &lt;/p&gt;  &lt;p&gt;How does it lead to problems? Hmm..., well, it lies in the assumption that the client programmer might use. Let's suppose we go the (a) way. &lt;/p&gt;  &lt;p&gt;If the client programmer does not read the method signature carefully enough, she might think / assume that the buck being used inside the laFuncion is exactly the same buck that she has within her code (outside the laFuncion). This assumption (mis)leads her to think the modification she made to the buck (outside the laFuncion) will be seen from inside the laFuncion. Bla bla bla, error. &lt;/p&gt;  &lt;p&gt;Of course it is her mistake for being such a sloppy programmer. But let's not be so quick to judge (and punish). Maybe she's a decent programmer actually. It's just that she's coming from Javaland, or C#land (which is exactly my case). Well, with the intention to help her (or myself), then I thought: "Why don't we simply go the (b) way? That's the Java way she's familiar with. That would eliminate the issue, right?". Could be. But before we get to that, I'd like to review why would we consider the (a) way at the first place? &lt;/p&gt;  &lt;p&gt;Apart from presenting the issue above, it is copious, unnecesarrily copious. That buck in the function argument is an instance whose lifetime is limited to the scope of the function; it will be automatically destroyed whenever the function returns. What's the point of creating a new instance which will be destroyed in such a short time anyway? I'm thinking of flies (I just learned that a fly lives only for a day from watching the obamaninja video). Why did She create flies? They're so useless.&lt;br /&gt;&lt;/p&gt;  &lt;p&gt;To make the point clearer, let's get down to the code.&lt;br /&gt;---------------&lt;br /&gt;class ObjectA&lt;br /&gt;{&lt;br /&gt;private:&lt;br /&gt; Buck buck;&lt;br /&gt;public:&lt;br /&gt; ObjectA(Buck buck) {&lt;br /&gt;   this-&amp;gt;buck = buck;&lt;br /&gt; }&lt;br /&gt;}; &lt;/p&gt;  &lt;p&gt;class ObjectB&lt;br /&gt;{&lt;br /&gt;private:&lt;br /&gt; Buck buck;&lt;br /&gt;public:&lt;br /&gt; ObjectB(Buck&amp;amp; buck) {&lt;br /&gt;   this-&amp;gt;buck = buck;&lt;br /&gt; }&lt;br /&gt;};&lt;br /&gt;--------------- &lt;/p&gt;  &lt;p&gt;When we create an instance of ObjectA, passing along an instance of Buck, the following things will take place: &lt;/p&gt;  &lt;p&gt;(1) An instance of Buck, that corresponds to the argument "buck", will be created. The copy-constructor will be used for the creation.&lt;br /&gt;(2) An instance of Buck, that corresponds to the instance variable "buck" of ObjectA, will be created. The default (no-arg) constructor will be used.&lt;br /&gt;(3) When the assigment occurs, the assignment operator of of the instance variable "buck" will be called. That's how the internal values of the argument "buck" get copied to the instance variable "buck".&lt;br /&gt;(4) When the function returns, the buck that corresponds to the argument "buck" will be destroyed. &lt;/p&gt;  &lt;p&gt;On the other hand, when we create an instance of ObjectB, passing along an instance of Buck, the following things will take place: &lt;/p&gt;  &lt;p&gt;(1) An instance of Buck, that corresponds to the instance variable "buck" of ObjectB, will be created. The default (no-arg) constructor will be used.&lt;br /&gt;(2) When the assigment occurs, the assignment operator of of the instance variable "buck" will be called. That's how the internal values of the argument "buck" get copied to the instance variable "buck". &lt;/p&gt;  &lt;p&gt;See, an (extra) invocation of copy-constructor is involved in the pass-by-value case; and the final effect is the same for both cases: either ObjectA or ObjectB will have its own instance of Buck, whose internal values are the same as that of the instance of Buck passed in by the client programmer. In Java speak: value equality, but not reference equality. So I declare (b) way as the winner; same effect, less steps. &lt;/p&gt;  &lt;p&gt;But wait, I was supposed to come up with an answer for "why would we consider the (a) way at the first place?". Hmm, I just mentioned the key idea of the answer: owning. My initial goal was to ensure the object that gets the value (buck) passed-in, will _own_ the buck. In other word that object will be the one responsible for the lifecycle of the buck. Keyword: composition (instead of aggregation). &lt;/p&gt;  &lt;p&gt;Well, we just saw the (b) way accomplishes that goal, as well. So I think we can completely discard the (a) way now. &lt;/p&gt;  &lt;p&gt;Going a little further: if that object is supposed to be responsible for the lifecycle of the buck, then (ideally) it should be responsible for it from the beginning (right?); that is to say: wouldn't it be better if that object instantiates the buck (instead of being fed with it)? "Factory method" comes to mind. I think I will consider this as one of the rules for my code. &lt;/p&gt;  &lt;p&gt;---&lt;br /&gt;class ObjectB&lt;br /&gt;{&lt;br /&gt;private:&lt;br /&gt; Buck* pBuck;&lt;br /&gt;public:&lt;br /&gt; ObjectB() { }&lt;br /&gt; Buck&amp;amp; getBuck() {&lt;br /&gt;   if (pBuck == 0) {&lt;br /&gt;     pBuck = new Buck();&lt;br /&gt;   }&lt;br /&gt;   return *pBuck;&lt;br /&gt; }&lt;br /&gt;};&lt;br /&gt;--- &lt;/p&gt;  &lt;p&gt;On the flip side: in the cases where we want to state that the object will not / is not supposed to be responsible for the lifecycle of the the buck, then we can use this form: &lt;/p&gt;  &lt;p&gt;----&lt;br /&gt;class ObjectC&lt;br /&gt;{&lt;br /&gt;private:&lt;br /&gt; Buck&amp;amp; buck;&lt;br /&gt;public:&lt;br /&gt; ObjectC(Buck&amp;amp; buck) : buck(buck) {&lt;br /&gt; }&lt;br /&gt;};&lt;br /&gt;---- &lt;/p&gt;  &lt;p&gt;The steps involved:&lt;br /&gt;(0) None of the four things above (mentioned in the (a) way). &lt;/p&gt;  &lt;p&gt;Now the problem: this code assumes the buck gets passed into it the instance of ObjectC wouldn't get destroyed before the ObjectC itself is destroyed. I'd say, in a more concrete terms, the buck must be allocated with the new operator, like this: &lt;/p&gt;  &lt;p&gt;---&lt;br /&gt;ObjectC* otroFuncion() {&lt;br /&gt;...&lt;br /&gt;Buck* pBuck = new Buck();&lt;br /&gt;ObjectC* pobjC = new ObjectC(*pBuck);&lt;br /&gt;return pObjC;&lt;br /&gt;}&lt;br /&gt;--- &lt;/p&gt;  &lt;p&gt;Instead of...&lt;br /&gt;---&lt;br /&gt;ObjectC* otroFuncion() {&lt;br /&gt;...&lt;br /&gt;Buck buck();&lt;br /&gt;ObjectC* pobjC = new ObjectC(buck);&lt;br /&gt;return pObjC;&lt;br /&gt;}&lt;br /&gt;--- &lt;/p&gt;  &lt;p&gt;Hmm..., I think that's not a safe assumption. How to enforce it? But wait..., if the object (ObjectC) is "conscious" that it is _not_ responsible for the lifecycle of the the buck (thus has no control over it), then it is its responsibility to do the checking to see if the buck is still alive, before it does something with it.  Hmm..., I guess that's a fair rule. &lt;/p&gt;  &lt;p&gt;Argh.... :D. I think that's all. I write down this train-of-thoughts here just in order not to repeat doing this next time. If you think there's something inaccurate / misleading / just plain non-sense here, please let me know. Thank you in advance.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-3711134392070201793?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/3711134392070201793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=3711134392070201793' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/3711134392070201793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/3711134392070201793'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2009/06/little-note-on-c.html' title='A little note on C++'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_M06zGolBz4A/SkYqhmcVzHI/AAAAAAAAAFk/HU4-9usMqYQ/s72-c/sontoloyo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-7679350208742577815</id><published>2009-06-22T08:09:00.002-05:00</published><updated>2009-08-07T08:13:20.486-05:00</updated><title type='text'>The third (last) example – click-to-dial.</title><content type='html'>&lt;p&gt;This is the part of section 4 (on SIP servlet programming), where the audience is guided through implementing a click-to-dial application. &lt;/p&gt;  &lt;p&gt;Hopefully by this the audience get a her first taste of "third-party call control", and begin to see the potential of the "convergence" between the telephony and web, that is becoming even more practical with protocol like SIP and programming framework like SIP-servlet.&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; display: inline; float: none;" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:53623880-9932-4395-add1-67c48e5fbec3" class="wlWriterEditableSmartContent"&gt;&lt;div id="303a41ea-d3bd-4b70-bfc6-994c7e17d7db" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=SOb9XLC-FWI" target="_new"&gt;&lt;img src="http://lh4.ggpht.com/_M06zGolBz4A/Sj-DBXiTs_I/AAAAAAAAAFg/jEfs0hSljM0/videoc8d4c840a314%5B2%5D.jpg?imgmax=800" style="border-style: none;" galleryimg="no" onload="var downlevelDiv = document.getElementById('303a41ea-d3bd-4b70-bfc6-994c7e17d7db'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/SOb9XLC-FWI&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/SOb9XLC-FWI&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;As usual, can’t write a lot right now; will update this entry later. I hope you like this one, chau!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The usual notice:&lt;/strong&gt; The source code for chapter 4 is available in this URL: &lt;a href="http://www.box.net/shared/tk4ghghllg"&gt;http://www.box.net/shared/tk4ghghllg&lt;/a&gt;. It’s a netbeans’ project folder. Use Netbeans 6.x and follow the instruction in this video in order to be able to compile those codes successfuly.&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;[Context: &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://jananuraga.blogspot.com/2009/02/preview-of-section-2-ims-app-dev.html"&gt;video series&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;]&lt;/span&gt;&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/2820719305895422701-7679350208742577815?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/7679350208742577815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=7679350208742577815' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/7679350208742577815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/7679350208742577815'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2009/06/third-last-example-click-to-dial.html' title='The third (last) example – click-to-dial.'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_M06zGolBz4A/Sj-DBXiTs_I/AAAAAAAAAFg/jEfs0hSljM0/s72-c/videoc8d4c840a314%5B2%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-484702237346347527</id><published>2009-06-15T01:54:00.005-05:00</published><updated>2009-06-15T13:31:48.000-05:00</updated><title type='text'>(An attempt) to answer Eric….</title><content type='html'>&lt;p&gt;Allright, a couple of weeks ago I had a chat with a friend, Antonio, here in Mexico City, who works for a company that provides IMS platform to telco operators, in my attempt to get another perspective on IMS. &lt;/p&gt;  &lt;p&gt;Remember, &lt;a href="http://jananuraga.blogspot.com/2009/05/my-skepticism-over-ims.html"&gt;on the earlier chat with another friend&lt;/a&gt;, Eric, who comes from a different background, all we got was skepticism. Basically the questions he posed were: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Why trying to be an "app-store", another "me too"?&lt;/li&gt;    &lt;li&gt;Why transmiting the voice -- between the mobile 3G handset and the operator -- in IP, when the infrastructure for voice transmission (non IP) is already there, working just fine? Plus we know what it takes to transmit voice over IP... serializing, packetizing, unpacketizing, deserializing, etc. It sounds like a lot of things to do, compared to simply transmiting the voice signal as, you know, waveform (that's how they basically do it, right?). &lt;/li&gt; &lt;/ol&gt;  &lt;blockquote&gt;   &lt;p&gt;Yadda-yadda from me: this skepticism here is not nay-saying; quite the contrary. I am enthusiastic about this whole IMS thing, and I do plan to put (some of) my eggs in it. But I need to validate some of my assumptions; "this will definitely work and become a boom very soon :-)" being one of them. I would say I'm trying to do some reality checks.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;For the second question above, the way I see it: if it's doable why not? I mean, the cost of operating a single infrastructure (IP for all) should be cheaper, right? I need some hard facts, some figures might help. If you have happen to have a link to that information, please share it with us. &lt;/p&gt;  &lt;p&gt;Assuming that is true, then the next question would or should be: why haven't they done it? Why are voice calls still transmitted over non-IP channel? Allright, I don't know the answers, so I asked my friend Antonio. Here are the answers, verbatim copy, which to my (momentarily) lazy mind boil down to "it's all about money": &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Mobile networks are good businesses even if they don't use IP. Operational margin in most MNOs (such as Telcel, for example) is so good, that the supposed savings coming from the IP change don't look so compelling. At least, not yet. SDH is still being supported and it does not imply large OPEX (yet).&lt;/li&gt;    &lt;li&gt;Elaborating on the previous reason. Even though IP-based transport is said to be cheap, so it is the TDM-based one. SDH and WDM technologies have improved and became cheaper a great deal during the last 3-5 years. Many network operators have made large investments in TDM-based transport less than 3-4 years ago. In their view, that investment has not paid off enough as yet. The ROI (Return on Investment) has not been satisfactory enough in many cases. Many MNOs are waiting for their SDH/WDM networks to depreciate even more.&lt;/li&gt;    &lt;li&gt;Paraphrasing some famous TV program: "what is the other option, anyway?"... what I mean by this is: if the MNO is supposed to throw away its SDH network, what is he supposed to buy instead? the common word in the last years is called Metro Ethernet. The truth is: even if Metro Ethernet can look as cheap as SDH in terms of $$$ per Mbps, it doesn't look as mature in other aspects, especially regarding O&amp;amp;M capabilities. The ones who are operating SDH networks are today very familiar with its ways of operation and maintenance, and know very well how to troubleshoot these circuit-based networks. It just does not look as clear in the case of Metro Ethernet.&lt;/li&gt;    &lt;li&gt;Lack of know-how on IP-based technologies. Even if the change seems inevitable (it really is), there is a lot of reluctancy within the engineering and operation organizations of the MNOs to move towards the all-IP paradigm. They just don't know enough of IP to take such an important decisions. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I'll process those information later. I keep it here for my future references. Now, where am I heading, or where am I in my train of thoughts? Allright, I guess the question #2 by Eric has been addressed (more or less). &lt;/p&gt;  &lt;p&gt;However, I really don't understand why should I be concerned (too much) about this? I mean this whole rant I'm putting here is actually just a prelude to the point I want to bring up: the switch to IP is inevitable, they're going to do it, just wait (1-2 years, depends on which country you live in), and IMS is there just waiting for adoption, as it provides the architectural framework for their needs (by the time they've switched to full IP). For me -- as software developer trying to profit from that -- that means: my investment in learning SIP Servlet, IMS, and stuffs wouldn't become a waste. That's all I wanted to say. Well, that's what I want to believe. &lt;/p&gt;  &lt;p&gt;The kind of application I'm thinking of that I can develop is some mobile applications (together with some server side components implemented as SIP Servlet) that enables funky (yet useful) interaction scenarios (voice, image, video, etc), connected to things like social network, document management, customer management, etc., taking advantage of the nature of the protocols that enables that kind of service convergence. For that kind of applications I don't think I really need to care whether the voice is transmitted over IP or TDM. Or am I wrong? Can you tell me what kind of scenarios wouldn't be possible if the voice / video is not transmitted over IP? &lt;/p&gt;  &lt;p&gt;Anyway, let's move on to the question #1 from Eric: why trying to be an "app-store", another "me too"? &lt;/p&gt;  &lt;p&gt;I don't know :) So please chip in here. Anyway, in the process of trying to find the answer / get some insights, I came across this thing called SDP (service delivery platform). I was looking at a product from a company JNetX.com. Hmm, well it seems to be one of the building-block for an "app-store" of telco. I need to find out how they go, the clients they have, the reasons those clients use their product, maybe that way I'll arrive at the answer for question #1. &lt;/p&gt;  &lt;p&gt;Wrapping up..., I need to:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Find an information that says : the cost of using IP for all their service is be cheaper.&lt;/li&gt;    &lt;li&gt;Try to process the points mentioned by Antonio.&lt;/li&gt;    &lt;li&gt;Keep this question alive: what scenarios would be made possible (only) if the voice &amp;amp; video is transmitted in IP?&lt;/li&gt;    &lt;li&gt;Dig service delivery platform (SDP).&lt;/li&gt; &lt;/ul&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;UPDATE:&lt;/span&gt; I will put my notes and the notes of some collaborators, over our findings / study of VoIP, SIP, IMS, mobile, etc in a wiki workspace here: &lt;a href="http://jananuraga.pbworks.com/"&gt;http://jananuraga.pbworks.com&lt;/a&gt;. I also added a link to that wiki workspace in the menu bar. Look for this image:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://jananuraga.pbworks.com/"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 97px; height: 25px;" src="http://2.bp.blogspot.com/_M06zGolBz4A/SjaS905WnaI/AAAAAAAAAFU/zIaMmDiDS08/s320/pbworks.jpg" alt="" id="BLOGGER_PHOTO_ID_5347623198417919394" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-484702237346347527?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/484702237346347527/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=484702237346347527' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/484702237346347527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/484702237346347527'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2009/06/attempt-to-answer-eric.html' title='(An attempt) to answer Eric….'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_M06zGolBz4A/SjaS905WnaI/AAAAAAAAAFU/zIaMmDiDS08/s72-c/pbworks.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-2911732013417099547</id><published>2009-06-15T01:05:00.002-05:00</published><updated>2009-08-07T08:14:13.465-05:00</updated><title type='text'>YAC (yet another chunk) of section 4</title><content type='html'>&lt;p&gt;In this 8-minutes video we learn how to deal with the provisional responses (such as the ringing signal), success responses (such as OK), and the bye requests. This is the continuation of &lt;a href="http://jananuraga.blogspot.com/2009/06/another-chunk-of-section-4.html"&gt;this video&lt;/a&gt;, where the application we’re developing is explained, and the way we handle the initial invite-request from the caller is explained.&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; display: inline; float: none;" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:6b0058b0-013e-4f52-85b6-f66d4e5097c5" class="wlWriterEditableSmartContent"&gt;&lt;div id="b7e0c154-2202-411e-876b-1186f4ef559d" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=KHcpGnehD20" target="_new"&gt;&lt;img src="http://lh3.ggpht.com/_M06zGolBz4A/SjXkrcvEbVI/AAAAAAAAAFQ/emU-rmzq__A/videobea843379710%5B3%5D.jpg?imgmax=800" style="border-style: none;" galleryimg="no" onload="var downlevelDiv = document.getElementById('b7e0c154-2202-411e-876b-1186f4ef559d'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/KHcpGnehD20&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/KHcpGnehD20&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;The upcoming video will be about implementation of click-to-dial application, and it would conclude chapter 4.&lt;/p&gt;  &lt;p&gt;I also decided to create a mini chapter that follows chapter 4 – I’ll name it… chapter 4 extra – where I make the test calls to and trace analysis for each SIP servlets explained in chapter 4.&lt;/p&gt;  &lt;p&gt;There’s one more thing: the source code for chapter 4 is available in this URL: &lt;a title="http://www.box.net/shared/tk4ghghllg" href="http://www.box.net/shared/tk4ghghllg"&gt;http://www.box.net/shared/tk4ghghllg&lt;/a&gt;. It’s a netbeans’ project folder. Use Netbeans 6.x and follow the instruction in &lt;a href="http://jananuraga.blogspot.com/2009/05/chapter-4-first-part-intro-of-sip.html"&gt;this video&lt;/a&gt; in order to be able to compile those codes successfuly.&lt;/p&gt;  &lt;p&gt;I hope you enjoy the videos! Zaijian!&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;[Context: &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://jananuraga.blogspot.com/2009/02/preview-of-section-2-ims-app-dev.html"&gt;video series&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;]&lt;/span&gt;&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/2820719305895422701-2911732013417099547?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/2911732013417099547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=2911732013417099547' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/2911732013417099547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/2911732013417099547'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2009/06/yac-yet-another-chunk-of-section-4.html' title='YAC (yet another chunk) of section 4'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_M06zGolBz4A/SjXkrcvEbVI/AAAAAAAAAFQ/emU-rmzq__A/s72-c/videobea843379710%5B3%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-6923234520702814966</id><published>2009-06-08T07:38:00.003-05:00</published><updated>2009-08-07T08:14:45.917-05:00</updated><title type='text'>Another chunk of section 4</title><content type='html'>&lt;p&gt;This is the part of section 4 (on SIP servlet programming), where the audience is guided through coding her second SIP Servlet, which acts as a back-to-back user agent. This second SIP servlet simply connects the caller to one specific destination (a person named alice).&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; display: inline; float: none;" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:62db7e86-5b91-49a3-af53-e5d4ee40c6fb" class="wlWriterEditableSmartContent"&gt;&lt;div id="24c35733-869f-485c-bd29-fec946d1d17c" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=hlk3dqZEenk" target="_new"&gt;&lt;img src="http://lh5.ggpht.com/_M06zGolBz4A/Si0GXpbN_vI/AAAAAAAAAFM/EgJVqeOxnPI/video14a5ce10094b%5B3%5D.jpg?imgmax=800" style="border-style: none;" galleryimg="no" onload="var downlevelDiv = document.getElementById('24c35733-869f-485c-bd29-fec946d1d17c'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/hlk3dqZEenk&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/hlk3dqZEenk&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;In this 8-minutes video I can only explain the way we handle the initial invite-request coming from the caller; which we do inside the doInvite method of the SIP servlet. The upcoming video will cover the way we handle the other methods (doProvisionalResponse, doSuccessResponse, and doBye).&lt;/p&gt;&lt;p&gt;That's all. I hope you enjoy this video. Chau!&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;[Context: &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://jananuraga.blogspot.com/2009/02/preview-of-section-2-ims-app-dev.html"&gt;video series&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-6923234520702814966?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/6923234520702814966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=6923234520702814966' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/6923234520702814966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/6923234520702814966'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2009/06/another-chunk-of-section-4.html' title='Another chunk of section 4'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_M06zGolBz4A/Si0GXpbN_vI/AAAAAAAAAFM/EgJVqeOxnPI/s72-c/video14a5ce10094b%5B3%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-7892589743132218665</id><published>2009-06-03T08:19:00.003-05:00</published><updated>2009-08-07T08:15:15.075-05:00</updated><title type='text'>Section 4 part B.1 – programming the first SIP servlet.</title><content type='html'>&lt;p&gt;Here it comes, the first SIP-servlet, a very simple one that simply accepts INVITEs (thus starting a dialog with the caller). The audience will also learn how to deploy a SIP-servlet application into BEA Weblogic SIP Server.&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; display: inline; float: none;" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:570ac6af-3e79-47c2-8697-c4ba867ed3cb" class="wlWriterEditableSmartContent"&gt;&lt;div id="426a8ae8-0359-4264-a56d-1dd7a97ba5e9" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=XBEM87hla6g" target="_new"&gt;&lt;img src="http://lh6.ggpht.com/_M06zGolBz4A/SiZ4aJv_MKI/AAAAAAAAAFI/RgGjSdmJyps/videof8a05426d05b%5B3%5D.jpg?imgmax=800" style="border-style: none;" galleryimg="no" onload="var downlevelDiv = document.getElementById('426a8ae8-0359-4264-a56d-1dd7a97ba5e9'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/XBEM87hla6g&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/XBEM87hla6g&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;Sorry, this is such a quickie entry, I’m so not imaginative at this moment. I will update it later tonight (or tommorow :D). Enjoy, chau!&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;[Context: &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://jananuraga.blogspot.com/2009/02/preview-of-section-2-ims-app-dev.html"&gt;video series&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;]&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-7892589743132218665?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/7892589743132218665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=7892589743132218665' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/7892589743132218665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/7892589743132218665'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2009/06/section-4-part-b1-programming-first-sip.html' title='Section 4 part B.1 – programming the first SIP servlet.'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_M06zGolBz4A/SiZ4aJv_MKI/AAAAAAAAAFI/RgGjSdmJyps/s72-c/videof8a05426d05b%5B3%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-4030950089211406452</id><published>2009-05-31T12:31:00.001-05:00</published><updated>2009-05-31T12:31:20.136-05:00</updated><title type='text'>Chapter 4, first part (intro. of SIP-servlet programming).</title><content type='html'>&lt;p&gt;Finally, here it is: the first part of chapter 4 (crashcourse on SIP-servlet programming). This 7-minutes video is basically a warming up before we perform the programming activities in the next part. Here we also set up our development environment (Netbeans 6.5); registering the BEA weblogic server in the IDE, setting Java platform to 1.5, and importing sipservlet JAR.&lt;/p&gt;  &lt;p&gt;   &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:765d5057-fbe7-4f11-911a-a6771b7bcfe1" class="wlWriterEditableSmartContent"&gt;&lt;div id="592c37d2-b74e-4ca2-9eaa-b52af2a0b32c" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=LWcO0BZaMos" target="_new"&gt;&lt;img src="http://lh3.ggpht.com/_M06zGolBz4A/SiK-56URWrI/AAAAAAAAAFE/Uh0gwuA5t5I/videod46f40989996%5B3%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('592c37d2-b74e-4ca2-9eaa-b52af2a0b32c'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/LWcO0BZaMos&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/LWcO0BZaMos&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt; &lt;/p&gt;  &lt;p&gt;I’m at this moment editing the second section of this chapter…, so, well, see you soon. I actually wanted to upload the complete narration of the chapter 4, but the upload is very slow at this moment. Please check back later tonight.&lt;/p&gt;  &lt;p&gt;Context: &lt;a title="http://jananuraga.blogspot.com/2009/02/preview-of-section-2-ims-app-dev.html" href="http://jananuraga.blogspot.com/2009/02/preview-of-section-2-ims-app-dev.html"&gt;http://jananuraga.blogspot.com/2009/02/preview-of-section-2-ims-app-dev.html&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-4030950089211406452?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/4030950089211406452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=4030950089211406452' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/4030950089211406452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/4030950089211406452'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2009/05/chapter-4-first-part-intro-of-sip.html' title='Chapter 4, first part (intro. of SIP-servlet programming).'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_M06zGolBz4A/SiK-56URWrI/AAAAAAAAAFE/Uh0gwuA5t5I/s72-c/videod46f40989996%5B3%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-2332205684098695020</id><published>2009-05-25T13:01:00.005-05:00</published><updated>2009-05-25T13:20:00.369-05:00</updated><title type='text'>Request for help: CSS stuff</title><content type='html'>Dear reader,&lt;br /&gt;&lt;br /&gt;I'd really appreciate it if you can help me with the following thing.&lt;br /&gt;&lt;br /&gt;I need to improve the visual balance this blog with the hope of seeing an improvement of the level of interactivity. I was thinking of moving some widgets to the right. Those widgets also should be hidden initially, and there will floating tabs, one for each widget. I hope the following figure illustrates my point.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_M06zGolBz4A/ShrejTZWrBI/AAAAAAAAAEc/CNXJ2ulf12c/s1600-h/requirement_1.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 146px;" src="http://4.bp.blogspot.com/_M06zGolBz4A/ShrejTZWrBI/AAAAAAAAAEc/CNXJ2ulf12c/s320/requirement_1.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5339825006284549138" /&gt;&lt;/a&gt;&lt;br /&gt;By clicking the tab, the widget will displayed, also floating on the page. Additionaly, scrolling the page wouldn't change the location where the widget (and the tabs) are displayed on the screen. Another requirement is: only one of those tabs can have its widget displayed at a time.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_M06zGolBz4A/Shrf76O-3VI/AAAAAAAAAEk/94mpUqrfRls/s1600-h/requirement_2.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 146px;" src="http://2.bp.blogspot.com/_M06zGolBz4A/Shrf76O-3VI/AAAAAAAAAEk/94mpUqrfRls/s320/requirement_2.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5339826528538516818" /&gt;&lt;/a&gt;&lt;br /&gt;I've been trying to look for the answers in some CSS / web-design / blogger tricks sites, no result so far. I mean, I was not sure what the correct search expression would be.&lt;br /&gt;&lt;br /&gt;If you have some clues please drop me a comment. Thanks in advance.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-2332205684098695020?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/2332205684098695020/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=2332205684098695020' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/2332205684098695020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/2332205684098695020'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2009/05/request-for-help-css-stuff.html' title='Request for help: CSS stuff'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_M06zGolBz4A/ShrejTZWrBI/AAAAAAAAAEc/CNXJ2ulf12c/s72-c/requirement_1.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-682974299963266665</id><published>2009-05-20T02:17:00.004-05:00</published><updated>2009-05-20T02:22:17.270-05:00</updated><title type='text'>My skepticism over IMS</title><content type='html'>I guess this is the first entry in my blog where I actually try to recall things and organize them into a more or less coherent rambling... :D. I need to write it down so I wouldn't forget these interesting (and possibly valid) points...; mostly skepticisms. A healthy dose of it :). And when I say skepticism what I really mean is: I need some education. So, please, feel free to chip in.&lt;br /&gt;&lt;br /&gt;Allright, so I just had a talk in &lt;a href="http://en.wikipedia.org/wiki/Zona_Rosa"&gt;zona rosa&lt;/a&gt;*) with one of the guys who are going to help me with the production of chapter 1 (it's going to be a dialogue, a bit of change in the plan: from interview to a dialogue; more persons will be involved).&lt;br /&gt;&lt;br /&gt;Where do I start? Ok: bit pipe. I picked that term from a paper that explains a couple of (suggested?) business models around IMS (IP Multimedia Subsystem). Backtrack: you know the title of this video series I'm making is "IMS Application Development using SIP Servlet and VoiceXML". Lately I think the title is a bit inaccurate though. &lt;br /&gt;&lt;br /&gt;The production of video series was actually started from the idea to share some experience and knowledge I've acquired in developing application using SIP Servlet and VoiceXML. It just happen to be the most recent project where I used those stuffs has something to do with IMS, in the sense that the application was deployed in the IMS network of a telco operator (in mexico). &lt;br /&gt;&lt;br /&gt;SIP Servlet, SIP, and VoiceXML, they're all internet technologies, it's not exclusively IMS (i.e.: we can use those stuffs for developing telecomunication services outside the context of / that have little to do with IMS). Anyway, I'm just trying to put some context around SIP Servlet and VoiceXML programming, and I picked IMS. Beside, I think it's useful to know / keep an eye of what those telco operators are up to, what are they going to do this IP thing (3G, etc).&lt;br /&gt;&lt;br /&gt;That's it: what are they going to do? Actually -- according to that paper -- this is one of the business motivations for telco operators to adopt IMS: to avoid the gloomy fate of degenerating into a mere bit-pipe. Basically, what they would like to be: a kind of marketplace for the services -- IP based services -- and profit from it (that's how I understand it).&lt;br /&gt;&lt;br /&gt;That sounds reasonable to me. The paper went on by stating this IMS will provide a framework for achieving that objective. I vaguely recall it's mentioned somewhere that the centralistic nature of the framework fits in very well with the tendencies / preferences / (or habit?) of those operators: maintaining as much control as possible. &lt;br /&gt;&lt;br /&gt;With the subscriber base in their hands, the service providers that are hooked to them, and the premise that the subscribers are more likely to their trust their sensitive data in the hand of telco operators: throw the single sign-on thing in, and voila, the telco operator turn into a hub. Money. Money?&lt;br /&gt;&lt;br /&gt;Somehow it reminds me of portal. I was wondering if the paper is suggesting something similar to it, but for telco. I'm quite skeptical. To begin with, portal to me is useless. I don't want to be confined in one single page with all the stuffs fitted into those small boxes throughout my browsing session. Instead, I have lots of tabs in my browser, and my homepage is set to Google. What else do I really need? I find that a more effective way of navigating this mish-mash of information. I believe unproportionately large population of netizens think that way too. So, portal is a NO to me in my browser..., and so is it in my handset (phone).&lt;br /&gt;&lt;br /&gt;Another example closer to telco is this walled-garden approach, where the telco operators basically tries to hide the internet from the user. Yes, they tried that and they failed. Simple: lack of content only generates lack of interest. If we try again today in the age of 3G and iPhone, we will fail again, in a much harsher way. Lesson learned: don't fight the internet. Just don't.&lt;br /&gt;&lt;br /&gt;Seriously I don't think that is they path they are going to (re)take. I mean: I don't want to believe it is the case. So I must be missing something here. Anyone?&lt;br /&gt;&lt;br /&gt;This boils down to a (temporary) conclusion: this push to avoid "becoming a bit pipe scenario" is misguided. I mean, why should they try to become something that they are not? Their business has always been providing access, so why not focus on it. It's fine becoming a "mere" bit pipe. Just win the market by building bigger, better pipes. Right?&lt;br /&gt;&lt;br /&gt;I have more to say but it's very late now. I'm sorry I can't provide the link to the paper I mentioned, I'm too tired to look for it. Again, please chip in, I'd love to hear your opinion or the facts you might have.&lt;br /&gt;&lt;br /&gt;Oh, one last thing: the chapter 4, the introduction to SIP Servlet programming. Yes, I already have the video recordings and also the voice recordings. Now comes the tedious task of cuting-and-pasting those video and voice recording segments. I really do want to finish doing it this Saturday.&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;*) Why all the cantinas are closed tonight, that we had to walk to zona rosa just to find a place to drink and talk?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-682974299963266665?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/682974299963266665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=682974299963266665' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/682974299963266665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/682974299963266665'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2009/05/my-skepticism-over-ims.html' title='My skepticism over IMS'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-6564884030194964025</id><published>2009-05-03T14:59:00.005-05:00</published><updated>2009-08-07T08:16:19.813-05:00</updated><title type='text'>Chapter 3 is completed! – Installing and configuring Asterisk.</title><content type='html'>&lt;p&gt;The final step in chapter 3 (on setting up the lab): installing and configuring asterisk, which we will utilize as the media gateway in our lab. &lt;/p&gt;  &lt;p&gt;I split it into two separate videos (because of youtube’s 10-minutes constraint). This video below is for the installation:&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:4338331a-01cd-4c62-bd75-3db2b389d32a" style="margin: 0px; padding: 0px; display: inline; float: none;"&gt;&lt;div id="f45afb89-d4cb-4241-b443-aeff2e25ca1b" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=87Z8nYVhI5g" target="_new"&gt;&lt;img src="http://lh4.ggpht.com/_M06zGolBz4A/Sf33gKAeykI/AAAAAAAAACs/x6PXWz5ROm4/video486f2bd74ff4%5B5%5D.jpg?imgmax=800" style="border-style: none;" galleryimg="no" onload="var downlevelDiv = document.getElementById('f45afb89-d4cb-4241-b443-aeff2e25ca1b'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/87Z8nYVhI5g&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/87Z8nYVhI5g&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;I simply followed the step-by-step installation procedure available on the &lt;a href="http://www.the-asterisk-book.com/unstable/installation-1.4-debian-4.0.html"&gt;Practical Asterisk 1.4&lt;/a&gt; website.&lt;/p&gt;  &lt;p&gt;Finally, this video below covers the configuration and quick-test (to see if we’ve installed and configured the asterisk correctly).&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:5a175c6e-2aad-4a47-8130-4351ab633d6e" style="margin: 0px; padding: 0px; display: inline; float: none;"&gt;&lt;div id="e5d968ef-e5c8-460c-bece-8cc38e99ad4d" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=MzSwDrWeRVs" target="_new"&gt;&lt;img src="http://lh5.ggpht.com/_M06zGolBz4A/Sf33hDi_8wI/AAAAAAAAACw/_iUzbcKHmHs/video45c7d068c5cb%5B5%5D.jpg?imgmax=800" style="border-style: none;" galleryimg="no" onload="var downlevelDiv = document.getElementById('e5d968ef-e5c8-460c-bece-8cc38e99ad4d'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/MzSwDrWeRVs&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/MzSwDrWeRVs&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;Even if you’re not into the IMS, SIP Servlet programming, or VoiceXML, you can still use this video as a quick intro to the asterisk (just enough to get you up and running in no time). I’d recommend the book &lt;a href="http://astbook.asteriskdocs.org/"&gt;Asterisk: the future of telephony&lt;/a&gt; for you who want to dig deeper into it.&lt;/p&gt;&lt;p&gt;I'd also recommend a booklet I wrote in 2006 on &lt;a href="http://jananuraga.blogspot.com/2008/08/booklet-telephony-application.html"&gt;telephony application development using Asterisk and Java&lt;/a&gt;. It might be a good companion to these videos, especially for you who'd like to program something with Asterisk.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I hope you enjoy the videos and find them useful. Coming up: section 4, on introduction to SIP Servlet programming. Stay tuned!&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;Update:&lt;/span&gt; chapter 4 has just taken off. This way: &lt;a href="http://jananuraga.blogspot.com/2009/05/chapter-4-first-part-intro-of-sip.html"&gt;http://jananuraga.blogspot.com/2009/05/chapter-4-first-part-intro-of-sip.html&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;[Context: &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://jananuraga.blogspot.com/2009/02/preview-of-section-2-ims-app-dev.html"&gt;video series&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;]&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-6564884030194964025?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/6564884030194964025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=6564884030194964025' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/6564884030194964025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/6564884030194964025'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2009/05/chapter-3-is-completed-installing-and.html' title='Chapter 3 is completed! – Installing and configuring Asterisk.'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_M06zGolBz4A/Sf33gKAeykI/AAAAAAAAACs/x6PXWz5ROm4/s72-c/video486f2bd74ff4%5B5%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-5091233933772183175</id><published>2009-04-20T01:01:00.001-05:00</published><updated>2009-04-20T01:01:48.291-05:00</updated><title type='text'>Section 3 A – Setting up the lab.</title><content type='html'>&lt;p&gt;Allright, another bit just came out of the oven :). This one contains the quick guide of the installation of BEA Weblogic SIP Server and Voxpilot Media Server.&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:b7d94d8d-6cd0-4c84-bf47-aa3d569894af" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;div id="42b5e674-7b1b-400f-bd36-76225465c91a" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=TBI2_6DHU_I" target="_new"&gt;&lt;img src="http://lh6.ggpht.com/_M06zGolBz4A/SewPywyWLwI/AAAAAAAAACo/AGC6Gh248X4/video82688fd2e134%5B3%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('42b5e674-7b1b-400f-bd36-76225465c91a'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/TBI2_6DHU_I&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/TBI2_6DHU_I&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;Enjoy! Coming up next: quick guide of the installation of Asterisk (and right after that we’ll start coding, the SIP Servlet, in section 4).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-5091233933772183175?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/5091233933772183175/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=5091233933772183175' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/5091233933772183175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/5091233933772183175'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2009/04/section-3-setting-up-lab.html' title='Section 3 A – Setting up the lab.'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_M06zGolBz4A/SewPywyWLwI/AAAAAAAAACo/AGC6Gh248X4/s72-c/video82688fd2e134%5B3%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-4850162174960823434</id><published>2009-03-27T13:27:00.004-06:00</published><updated>2009-03-27T13:42:38.967-06:00</updated><title type='text'>Section 2 is finished – finally.</title><content type='html'>These two videos below close the chapter 2 of the “IMS application development tutorial” video series.&lt;br /&gt;&lt;br /&gt;In the first we make a comparison between the call we made through SIP proxy and the call through back-to-back user agent. At the end of it I explain the reason why – in my opinion – we are more likely to develop back-to-back user agents (using SIP servlet technology).&lt;br /&gt;&lt;br /&gt;&lt;div class="wlWriterEditableSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:ae93f526-de68-4f90-b954-90f1aab703c5" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;embed src="http://www.youtube.com/v/6Ap2iNKTKaU" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The second video contains the demo of the EZ-IVR application (that's the complex application we are going to develop at the end of this video tutorial -- chapter 6, 7, and 8 -- utilizing all the knowledge we acquire throughout the preceeding chapters). In addition to the demo, the video also gives a quick overview of the interaction between the elements that make up the application.&lt;br /&gt;&lt;br /&gt;&lt;div class="wlWriterEditableSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:0388f450-2757-4362-9a91-c68ff9dc25cd" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;embed src="http://www.youtube.com/v/r32rDCYgC5Q" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Well, that's all for section 2. I learned something from this process: I did it the wrong way (I mean, the technique of making the video), that's why the process was slower than I expected. In the upcoming chapters I'm going to record all my activities on the screen first (without saying anything), and do the voice-overs after that.&lt;br /&gt;&lt;br /&gt;What about chapter 1? A good news: a friend of mine is going to help me with that. He's more knowledgable and experienced in this area. I'm glad and honoured to have him in this video. Chapter 1 is going to be an interview with him. We're still working on the script, expect to see the video in 7-10 days from now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-4850162174960823434?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/4850162174960823434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=4850162174960823434' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/4850162174960823434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/4850162174960823434'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2009/03/section-2-is-finished-finally.html' title='Section 2 is finished – finally.'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-8516124442526456739</id><published>2009-03-14T09:29:00.001-06:00</published><updated>2009-03-14T09:32:48.498-06:00</updated><title type='text'>IMS Application Development - Section 2 part C - 2</title><content type='html'>&lt;p&gt;Here comes other chunk…. In this part, we make a call through a &lt;a href="http://www.voip-info.org/wiki/view/SIP+proxy"&gt;SIP proxy&lt;/a&gt;, and followed by another call through &lt;a href="http://en.wikipedia.org/wiki/Back-to-back_user_agent"&gt;back-to-back user agent&lt;/a&gt;.&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:1284615b-e288-459c-a48c-87d3e95c5a33" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;div id="3d1f628a-8ced-44fc-a1e8-3abbd64d319d" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=ZFHTpHDzceI" target="_new"&gt;&lt;img src="http://lh4.ggpht.com/_M06zGolBz4A/SbvNQx-VCjI/AAAAAAAAACI/BKtbURL67kQ/videoe0ddb2a8c989%5B9%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('3d1f628a-8ced-44fc-a1e8-3abbd64d319d'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/ZFHTpHDzceI&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/ZFHTpHDzceI&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;Sorry for the short commentary; I’m still working on the editing of this video series. *Phew*. Hang on, we’re almost there. One more part, where we’ll make a comparison between the two calls in the video above followed by short demo of EZ IVR, and we’ll be done with section 2.&lt;/p&gt;  &lt;p&gt;Be right back. Chau.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-8516124442526456739?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/8516124442526456739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=8516124442526456739' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/8516124442526456739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/8516124442526456739'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2009/03/ims-application-development-section-2.html' title='IMS Application Development - Section 2 part C - 2'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_M06zGolBz4A/SbvNQx-VCjI/AAAAAAAAACI/BKtbURL67kQ/s72-c/videoe0ddb2a8c989%5B9%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-3998055636329961801</id><published>2009-02-24T08:32:00.001-06:00</published><updated>2009-02-24T08:32:53.491-06:00</updated><title type='text'>IMS Application Development - Section 2 part C - 1</title><content type='html'>&lt;p&gt;Wow..., editing video is not as quick &amp;amp; easy as I thought before. This is what I managed to come up with last weekend.&lt;/p&gt;  &lt;p&gt;   &lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:55624739-5310-434d-a1cd-2fc8f10f485d" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;div&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/eoRL7FeaIKY"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/eoRL7FeaIKY" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt; &lt;/p&gt;  &lt;p&gt;Actually I planned to stuff all the remaining of section 2 in the same video..., but due to time constraint, I decided to cut it at the end of the explanation of the SIP signals exchanged during the demo direct-call we saw in section 2 part B.&lt;/p&gt;  &lt;p&gt;That means, two parts are still missing from section 2:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Demo of call through back-to-back user agent (along with some explanations).&lt;/li&gt;    &lt;li&gt;Demo of call through sip proxy (+ explanations).&lt;/li&gt;    &lt;li&gt;Quick demo of EZ IVR (I hope it will serve as a teaser / another dose of dope..., for motivation).&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;They all will be available in the upcoming section 2 part C-2 (which I'm going to start editing this Saturday). &lt;/p&gt;  &lt;p&gt;I hope you enjoy this part, and..., until next week!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-3998055636329961801?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/3998055636329961801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=3998055636329961801' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/3998055636329961801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/3998055636329961801'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2009/02/ims-application-development-section-2_24.html' title='IMS Application Development - Section 2 part C - 1'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-8270059804873525865</id><published>2009-02-16T08:46:00.002-06:00</published><updated>2009-04-20T01:09:06.178-05:00</updated><title type='text'>IMS Application Development - Section 2 _PREVIEW_ (B)</title><content type='html'>&lt;p&gt;This is the second chunk of section 2. I decided to deliver series of small chunks (3-4 minutes). Psychologically it's a better way to go, I believe :). In this chunk a little demo of basic SIP call is presented. &lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:756b4a45-a4d0-4515-87d2-6788c5e021dc" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;div&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/tpebahEpvi0"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/tpebahEpvi0" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;Coming up next (in the other chunk -- taping is already done, missing the editing):&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;SIP Headers and SDP &lt;/li&gt;    &lt;li&gt;Call through SIP Proxy &lt;/li&gt;    &lt;li&gt;Call through Back-to-back User Agent &lt;/li&gt;    &lt;li&gt;Demo of EZ IVR (motivation) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;..., and that would conclude section 2.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Side note&lt;/em&gt;&lt;/strong&gt;: the videos in this series are put together in a play list titled &lt;a href="http://tinyurl.com/cjcjd3"&gt;IMS Application Development using SIP Servlet and VoiceXML&lt;/a&gt; on &lt;a href="http://www.youtube.com/user/rakabali78"&gt;my channel on youtube&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-8270059804873525865?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/8270059804873525865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=8270059804873525865' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/8270059804873525865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/8270059804873525865'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2009/02/ims-application-development-section-2.html' title='IMS Application Development - Section 2 _PREVIEW_ (B)'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-1952580363531304079</id><published>2009-02-11T16:26:00.016-06:00</published><updated>2010-03-08T01:57:06.055-06:00</updated><title type='text'>Preview of section 2 – IMS App. Dev. Tutorial</title><content type='html'>&lt;p&gt;This is a 5-minutes preview of section 2 of the video series "IMS application development using SIP Servlet and VoiceXML. The video series will have 8 sections, with the following organization:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Segment I      &lt;ol&gt;       &lt;li&gt;Overview of IMS and the series: &lt;a href="http://jananuraga.blogspot.com/2009/07/first-stab-at-chapter-1.html"&gt;this entry&lt;/a&gt; is our first stab at it. &lt;/li&gt;        &lt;li&gt;Brief introduction to SIP: this entry, &lt;a href="http://jananuraga.blogspot.com/2009/02/ims-application-development-section-2_24.html"&gt;this one&lt;/a&gt;, &lt;a href="http://jananuraga.blogspot.com/2009/03/ims-application-development-section-2.html"&gt;this one&lt;/a&gt;, and &lt;a href="http://jananuraga.blogspot.com/2009/03/section-2-is-finished-finally.html"&gt;this one&lt;/a&gt; :). &lt;/li&gt;        &lt;li&gt;Installation of servers (SIP Servlet container, VoiceXML server, Asterisk as media gateway, and sip softphones): &lt;a href="http://jananuraga.blogspot.com/2009/04/section-3-setting-up-lab.html"&gt;here&lt;/a&gt; and &lt;a href="http://jananuraga.blogspot.com/2009/05/chapter-3-is-completed-installing-and.html"&gt;here&lt;/a&gt;. &lt;/li&gt;        &lt;li&gt;Programming SIP Servlet quick course: (so far) &lt;a href="http://jananuraga.blogspot.com/2009/05/chapter-4-first-part-intro-of-sip.html"&gt;this&lt;/a&gt;, &lt;a href="http://jananuraga.blogspot.com/2009/06/section-4-part-b1-programming-first-sip.html"&gt;this&lt;/a&gt;, &lt;a href="http://jananuraga.blogspot.com/2009/06/another-chunk-of-section-4.html"&gt;this&lt;/a&gt;, &lt;a href="http://jananuraga.blogspot.com/2009/06/yac-yet-another-chunk-of-section-4.html"&gt;this&lt;/a&gt;, &lt;a href="http://jananuraga.blogspot.com/2009/06/third-last-example-click-to-dial.html"&gt;this&lt;/a&gt;, and &lt;a href="http://jananuraga.blogspot.com/2009/08/yet-another-segment-of-chapter-4.html"&gt;this&lt;/a&gt; :).&lt;br /&gt;&lt;/li&gt;        &lt;li&gt;Programming VoiceXML quick course. &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt;    &lt;li&gt;Segment II      &lt;ol&gt;       &lt;li&gt;Designing of the EZ IVR &lt;/li&gt;        &lt;li&gt;Implementing EZ IVR &lt;/li&gt;        &lt;li&gt;Testing EZ IZR &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;div style="margin: 0px; padding: 0px; display: inline; float: none;" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:7e134575-abb5-4fe6-b4f3-a94aae0ac196" class="wlWriterEditableSmartContent"&gt;&lt;div&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/p/61532581CF023E4A&amp;amp;hl=es&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/p/61532581CF023E4A&amp;amp;hl=es&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="http://tinyurl.com/cjcjd3"&gt;Playlist available on YouTube&lt;/a&gt;.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The source code of the SIP-servlet crashcourse: &lt;a href="http://www.box.net/shared/tk4ghghllg"&gt;http://www.box.net/shared/tk4ghghllg&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;They're all brewing. Up to this date I already have the narrations done for section 1-5. All the parts for section 2 have been fully recorded, but most of them have not gone through editing room. What I’m showing here is what I managed to come up with last night. When completed, this section 2 will have a demo (and explanation) of SIP calls (various scenarios) and call-tracing (with wireshark). &lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;UPDATE:&lt;/span&gt; Date 25 Feb. 2010. Just uploaded the &lt;a href="http://jananuraga.blogspot.com/2010/02/cataroo-presentation-part-one-just.html"&gt;first part of Cataroo (video) presentation&lt;/a&gt;. The video is still related to this series (also talks about SIP application development). This time it's about a technique to test such applications, specifically on automating the testings.&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Update:&lt;/span&gt; I just realized that the series of Cataroo presentation is actually what I had in mind for segment II of this IMS App. Dev. Tutorial. Oh, well.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-1952580363531304079?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/1952580363531304079/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=1952580363531304079' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/1952580363531304079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/1952580363531304079'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2009/02/preview-of-section-2-ims-app-dev.html' title='Preview of section 2 – IMS App. Dev. Tutorial'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-1800829128632985363</id><published>2008-12-10T05:19:00.002-06:00</published><updated>2009-10-30T20:21:44.168-06:00</updated><title type='text'>Xpectador 1.0</title><content type='html'>&lt;p&gt;Xpectador is a command-line tool for verifying the content of XML-documents, any XML-documents. It's very easy to use, and requires almost zero learning.&lt;/p&gt;  &lt;p&gt;Suppose we expect our XML document to have the following "profile":&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;root&amp;gt;    &lt;br /&gt;    &amp;lt;element_a attr_1="X"&amp;gt;value_a&amp;lt;/element_a&amp;gt;     &lt;br /&gt;    &amp;lt;element_b&amp;gt;     &lt;br /&gt;        &amp;lt;element_c&amp;gt;value_c&amp;lt;/element_c&amp;gt;     &lt;br /&gt;    &amp;lt;/element_b&amp;gt;     &lt;br /&gt;&amp;lt;/root&amp;gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;What we would do is: save that expectation as an XML file, and executes Xpectador the following way:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;xpectador my_expectation.xml document_tobe_verified.xml&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;That is all. In case xpectador finds that your document doesn't meet the expectation, it will exit with code -1, and print out some messages, such as: &lt;em&gt;"Expected element could not be found: &amp;lt;element_b&amp;gt;...&amp;lt;/element_b&amp;gt;"&lt;/em&gt;. That will help you identify the issue in your document more quickly.&lt;/p&gt;  &lt;p&gt;Note that I used the word "profile" instead of "content" because Xpectador performs more than simple text-comparisons.&lt;/p&gt;  &lt;p&gt;It allows you to express the following expectations:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;em&gt;Positive expectation&lt;/em&gt;: I want to see this particular element that contains these attributes, etc.&lt;/li&gt;    &lt;li&gt;&lt;em&gt;Negative expectation&lt;/em&gt;: I don't want to see this particular element.&lt;/li&gt;    &lt;li&gt;&lt;em&gt;Don't care&lt;/em&gt;: I don't care whether the document contains this element or not.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The neat thing about Xpectador: you don't need to learn any new syntax (format). You state your expectations -- as XML document -- using the same format as the document that you want to verify.&lt;/p&gt;  &lt;p&gt;You've seen the an example of "positive expectation" above. To state a "negative expectation", in the expectation file you only need to insert a special attribute in the element that you don't want to see. Example:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;root&amp;gt;    &lt;br /&gt;    &amp;lt;element_b&amp;gt;     &lt;br /&gt;        &amp;lt;element_c Expected="N"&amp;gt;value_c&amp;lt;/element_c&amp;gt;     &lt;br /&gt;    &amp;lt;/element_b&amp;gt;     &lt;br /&gt;&amp;lt;/root&amp;gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;That's a way of saying "I don't want to see element_c whose value is value_c, inside element_b". In case that expectation is not met, you will get the following message from the xpectador: &lt;em&gt;"Non-expected element was found: &amp;lt;element_c&amp;gt;...&amp;lt;/element_c&amp;gt;".&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;"Don't care"? Well, it's the easiest: just omit the element from your expectation document.&lt;/p&gt;  &lt;p&gt;You can specify a different name for that special attribute. You do that by specifying the third in the execution of xpectador. Example:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;xpectador my_expectation.xml document_tobe_verified.xml esperado&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;We'll, I guess that's all for the intro. There actually isn't much to talk about how-to-use this application due to its simplicity. However I know you will ask "can I trust the outcome?". That was also my concern, and I do have the list of test-cases for this application. I'll try to find a time sometime next week to be able to write a couple of things about it. &lt;/p&gt;  &lt;p&gt;In the meantime, feel free to use it. &lt;a href="http://www.box.net/shared/t6y6ifxxh2"&gt;Grab it from here&lt;/a&gt; (box.net). Just unzip the file, you'll find one EXE file in there (xpectador.exe). You will reap the real benefit of this kind of tool if you integrate it to your chain of automated-tests.&lt;/p&gt;&lt;p&gt;The source: &lt;a href="http://www.box.net/shared/u55s51p9hf"&gt;http://www.box.net/shared/u55s51p9hf&lt;br /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Feel free to drop me an email if you have any question regarding this tool or in case you find anything that looks like a bug. My email: &lt;a href="mailto:raka.angga@gmail.com"&gt;raka.angga@gmail.com&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Credits: this tool is written in &lt;a href="http://www.blogger.com/www.python.org"&gt;Python&lt;/a&gt;, with a 3rd-party library for XML-processing (&lt;a href="http://www.blogger.com/codespeak.net/lxml"&gt;lxml&lt;/a&gt;), and compiled to EXE using &lt;a href="http://www.blogger.com/www.py2exe.org"&gt;py2exe&lt;/a&gt;..., on &lt;a href="http://www.microsoft.com/windows/windows-vista/default.aspx"&gt;Vista&lt;/a&gt; :D&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-1800829128632985363?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/1800829128632985363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=1800829128632985363' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/1800829128632985363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/1800829128632985363'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2008/12/xpectador-10.html' title='Xpectador 1.0'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-5718371747331388907</id><published>2008-12-02T10:55:00.003-06:00</published><updated>2009-10-30T20:19:54.866-06:00</updated><title type='text'>DB Conan 1.0</title><content type='html'>&lt;p&gt;DB Conan is a data-retrieval tool. It's named after a manga character, &lt;a href="http://es.wikipedia.org/wiki/Detective_Conan"&gt;Conan&lt;/a&gt;, kind of little Sherlock :).&lt;/p&gt;  &lt;p&gt;This tool allows you to define a subset of the database that you're interested in (so you wouldn't be bogged down by unnecessary details / information overload during your testing / investigation activities). Once you have your subset-of-schema --  and some filters that you can also define -- set, you can load the data again and again, without typing any SQL query. This can potentially save your time.&lt;/p&gt;  &lt;p&gt;The following slides provide a more detailed description of this application (download the PowerPoint file from &lt;a href="http://www.box.net/shared/l9kcr8opid"&gt;Box.net&lt;/a&gt;):&lt;/p&gt;&lt;div style="width: 425px; text-align: left;" id="__ss_809517"&gt;&lt;a style="margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;" href="http://www.slideshare.net/raka.angga/db-conan-10-presentation?type=presentation" title="DB Conan 1.0"&gt;DB Conan 1.0&lt;/a&gt;&lt;object style="margin: 0px;" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=dbconan10slides2003-1228227235884600-9&amp;amp;stripped_title=db-conan-10-presentation"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=dbconan10slides2003-1228227235884600-9&amp;amp;stripped_title=db-conan-10-presentation" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;View more &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/raka.angga"&gt;raka.angga&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;p&gt;The application itself is available on the following URL: &lt;a title="http://www.box.net/shared/5ag8ja4eli" href="http://www.box.net/shared/5ag8ja4eli"&gt;http://www.box.net/shared/5ag8ja4eli&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The source: &lt;a href="http://www.box.net/shared/k00tkdmhza"&gt;http://www.box.net/shared/k00tkdmhza&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Its current status is prototype. Anyway, it's usable; I'm already using it in my daily work. I hope you'll find it useful as well.&lt;/p&gt;  &lt;p&gt;I do plan to further develop it (with GUI, etc), but only after I've finished my other project that has been pending for so long (a series of video on how to develop IMS application using SIP-Servlet and VoiceXML). Once I've finished it -- hopefully within this one month period -- I'll get back to this DB Conan. In the meantime, feel free to drop me some &lt;a href="mailto:raka.angga@gmail.com"&gt;feedbacks / questions&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-5718371747331388907?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/5718371747331388907/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=5718371747331388907' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/5718371747331388907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/5718371747331388907'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2008/12/db-conan-10.html' title='DB Conan 1.0'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-8271918269116388044</id><published>2008-08-13T03:08:00.001-05:00</published><updated>2009-06-15T00:34:29.955-05:00</updated><title type='text'>Quick showcase - demo EZ-IVR application</title><content type='html'>&lt;p&gt;&lt;object height="308" width="384"&gt;&lt;param name="movie" value="http://www.youtube.com/p/8E8CE2E222750F91"&gt;&lt;embed src="http://www.youtube.com/p/8E8CE2E222750F91" type="application/x-shockwave-flash" height="308" width="384"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;&lt;p&gt;Hover your mouse over the video to see the thumbnails / shortcuts to the other videos in this series.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color:#66ff99;"&gt;Troubleshooting:&lt;/span&gt;&lt;/strong&gt; if you see "the video is no longer available" message, try to refresh this web page. Hope that solves the problem for you. Otherwise, you can go directly to the &lt;a href="http://www.youtube.com/watch?v=W6JEyjkt7RM&amp;amp;feature=PlayList&amp;amp;p=8E8CE2E222750F91&amp;amp;index=0"&gt;YouTube page here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The images displayed in Part 1 in this video presentation can be downloaded from: &lt;a href="http://www.box.net/shared/vkyu7w1s00"&gt;http://www.box.net/shared/vkyu7w1s00&lt;/a&gt;&lt;/p&gt;&lt;p&gt;A friendlier-for-the-eyes version of this blog entry is available at the following URL: &lt;a href="http://www.geocities.com/rakabali78/ezivr.html"&gt;http://www.geocities.com/rakabali78/ezivr.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;This is a series in progress, more videos are coming up starting next month.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color:#66ff99;"&gt;The following is the brief overview of each video in the series (so far):&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.youtube.com/watch?v=W6JEyjkt7RM"&gt;Part 1 : Domain overview.&lt;/a&gt;&lt;/strong&gt; In this part the (business) use of this application is explained. The domain model of this application is also explained here.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.youtube.com/watch?v=GdgU_YEzyQA"&gt;Part 2.a : Demo execution - intro.&lt;/a&gt;&lt;/strong&gt; In this part the cases that will be demo-ed in the subsequent videos are explained.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.youtube.com/watch?v=QsLnwuPMfwY"&gt;Part 2.b : Demo execution - call transfers.&lt;/a&gt;&lt;/strong&gt; For case 1 &amp;amp; 2, the call transfer is answered by the callee. For case 3 &amp;amp; 4, the call transfer is rejected by the callee. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.youtube.com/watch?v=mzmU9WfUMvg"&gt;Part.2.c : Demo execution - call transfer and queue.&lt;/a&gt;&lt;/strong&gt; For case 1 &amp;amp; 2, the call transfer failed because the callee is busy, so the caller is asked whether she wants to wait in the queue. There's a timer for each element in the queue, that timeouts after a couple of seconds (45 in this demo), and checks the current position in the queue; if it's the 1 (the first) the call-transfer will be retried.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.youtube.com/watch?v=SnxwNENKev0"&gt;Part.2.d : Demo execution - call transfer and queue (two callers).&lt;/a&gt;&lt;/strong&gt; It's the same as case 5, but with two callers. Here we verify that the positions are calculated correctly, and that the queue actually moves (so when the element that was first in the queue terminates the call, the element that directly followed it will move forward in the queue).&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.youtube.com/watch?v=mWVrXUYjIX4"&gt;Part.2.e : Demo execution - play a message in the IVR.&lt;/a&gt;&lt;/strong&gt; In the IVR tree you can configure some "messages node". The subscriber can use it to allow callers access announcements / advertisements through the IVR.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.youtube.com/watch?v=XcAPOXY3wEc"&gt;Part 3 : Brief development info.&lt;/a&gt;&lt;/strong&gt; Here I explain briefly the modules that make up this application. I also explain the pattern that I employed when I implemented this application. Lastly, I glazed over some testing concerns &amp;amp; challenges.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-8271918269116388044?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/8271918269116388044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=8271918269116388044' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/8271918269116388044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/8271918269116388044'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2008/08/ez-ivr-series-of-video-ims-application.html' title='Quick showcase - demo EZ-IVR application'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-5347274786235194069</id><published>2008-08-13T03:00:00.024-05:00</published><updated>2011-03-15T08:24:18.044-06:00</updated><title type='text'>Raka's Core Competencies</title><content type='html'>Below is a document I wrote explaining my core competencies, and the traits I have, and why I can be a good fit for the job you might have. Your browser must have Adobe Reader. You can also download the PDF document by clicking on this link that will take you to Scribd's site: &lt;a href="http://tinyurl.com/rakacompetencies"&gt;http://tinyurl.com/rakacompetencies&lt;/a&gt; .&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My curriculum vitae can be obtained from &lt;a href="http://tinyurl.com/resumeraka"&gt;http://tinyurl.com/resumeraka&lt;/a&gt; (the link will take you to Box.net, an online-storage service).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Feel free to drop me some comments or questions regarding my experiences and core competencies on this email: &lt;a href="mailto:raka.angga@gmail.com"&gt;raka.angga@gmail.com&lt;/a&gt; .&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a title="View Cokorda Raka's Core Competencies on Scribd" href="http://www.scribd.com/doc/50724525/Cokorda-Raka-s-Core-Competencies" style="margin: 12px auto 6px auto; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block; text-decoration: underline;"&gt;Cokorda Raka's Core Competencies&lt;/a&gt; &lt;object id="doc_80851" name="doc_80851" height="600" width="100%" type="application/x-shockwave-flash" data="http://d1.scribdassets.com/ScribdViewer.swf" style="outline:none;" &gt;            &lt;param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf"&gt;             &lt;param name="wmode" value="opaque"&gt;             &lt;param name="bgcolor" value="#ffffff"&gt;             &lt;param name="allowFullScreen" value="true"&gt;             &lt;param name="allowScriptAccess" value="always"&gt;             &lt;param name="FlashVars" value="document_id=50724525&amp;access_key=key-1m98iu16fx8xk6cquhe&amp;page=1&amp;viewMode=list"&gt;             &lt;embed id="doc_80851" name="doc_80851" src="http://d1.scribdassets.com/ScribdViewer.swf?document_id=50724525&amp;access_key=key-1m98iu16fx8xk6cquhe&amp;page=1&amp;viewMode=list" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="600" width="100%" wmode="opaque" bgcolor="#ffffff"&gt;&lt;/embed&gt;         &lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-5347274786235194069?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/5347274786235194069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=5347274786235194069' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/5347274786235194069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/5347274786235194069'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2008/08/career-highlights-and-objectives.html' title='Raka&apos;s Core Competencies'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2820719305895422701.post-5162491513807281985</id><published>2008-08-13T02:58:00.001-05:00</published><updated>2009-05-09T10:11:04.213-05:00</updated><title type='text'>Booklet: Telephony application development with Asterisk, Java, and SIP</title><content type='html'>The booklet takes you through the process of developing a simple telephony application made using the stuffs mentioned above. Along the way (I hope) you'll develop a firm basic understanding of those stuffs, and be ready for your further adventure in telecommunication application development.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.box.net/shared/j3dpaeqokc"&gt;Download the booklet&lt;/a&gt; (PDF, 5 Mb).&lt;br /&gt;&lt;a href="http://www.box.net/shared/6jpogn38k0"&gt;Download the source code of the application explained in the booklet&lt;/a&gt; (TarGz, 1.5 Mb).&lt;br /&gt;&lt;br /&gt;&lt;a title="View Booklet: telephony application development using Asterisk, Java, and SIP on Scribd" href="http://www.scribd.com/doc/15113222/Booklet-telephony-application-development-using-Asterisk-Java-and-SIP" style="margin: 12px auto 6px auto; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block; text-decoration: underline;"&gt;Booklet: telephony application development using Asterisk, Java, and SIP&lt;/a&gt; &lt;object codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" id="doc_845833800648094" name="doc_845833800648094" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" align="middle" height="500" width="100%" rel="media:document" resource="http://d.scribd.com/ScribdViewer.swf?document_id=15113222&amp;access_key=key-nc17bjrh5oari9lzm5z&amp;page=1&amp;version=1&amp;viewMode=" xmlns:media="http://search.yahoo.com/searchmonkey/media/" xmlns:dc="http://purl.org/dc/terms/" &gt;  &lt;param name="movie" value="http://d.scribd.com/ScribdViewer.swf?document_id=15113222&amp;access_key=key-nc17bjrh5oari9lzm5z&amp;page=1&amp;version=1&amp;viewMode="&gt;   &lt;param name="quality" value="high"&gt;   &lt;param name="play" value="true"&gt;  &lt;param name="loop" value="true"&gt;   &lt;param name="scale" value="showall"&gt;  &lt;param name="wmode" value="opaque"&gt;   &lt;param name="devicefont" value="false"&gt;  &lt;param name="bgcolor" value="#ffffff"&gt;   &lt;param name="menu" value="true"&gt;  &lt;param name="allowFullScreen" value="true"&gt;   &lt;param name="allowScriptAccess" value="always"&gt;   &lt;param name="salign" value=""&gt;        &lt;embed src="http://d.scribd.com/ScribdViewer.swf?document_id=15113222&amp;access_key=key-nc17bjrh5oari9lzm5z&amp;page=1&amp;version=1&amp;viewMode=" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" play="true" loop="true" scale="showall" wmode="opaque" devicefont="false" bgcolor="#ffffff" name="doc_845833800648094_object" menu="true" allowfullscreen="true" allowscriptaccess="always" salign="" type="application/x-shockwave-flash" align="middle"  height="500" width="100%"&gt;&lt;/embed&gt;             &lt;span rel="media:thumbnail" href="http://i.scribd.com/public/images/uploaded/27719412/zKRugNtEq67WBl0eu_thumbnail.jpeg"&gt;       &lt;span property="media:title"&gt;Booklet: telephony application development using Asterisk, Java, and SIP&lt;/span&gt;   &lt;span property="dc:creator"&gt;raka.angga&lt;/span&gt;       &lt;span property="dc:type" content="Text"&gt;    &lt;/object&gt; &lt;div style="margin: 6px auto 3px auto; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block;"&gt;    &lt;a href="http://www.scribd.com/upload" style="text-decoration: underline;"&gt;Publish at Scribd&lt;/a&gt; or &lt;a href="http://www.scribd.com/browse" style="text-decoration: underline;"&gt;explore&lt;/a&gt; others:            &lt;a href="http://www.scribd.com/explore/HowtoGuides-Manuals/" style="text-decoration: underline;"&gt;How-to-Guides &amp; Manu&lt;/a&gt;                  &lt;a href="http://www.scribd.com/tag/java" style="text-decoration: underline;"&gt;java&lt;/a&gt;              &lt;a href="http://www.scribd.com/tag/voip" style="text-decoration: underline;"&gt;voip&lt;/a&gt;       &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2820719305895422701-5162491513807281985?l=jananuraga.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jananuraga.blogspot.com/feeds/5162491513807281985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2820719305895422701&amp;postID=5162491513807281985' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/5162491513807281985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2820719305895422701/posts/default/5162491513807281985'/><link rel='alternate' type='text/html' href='http://jananuraga.blogspot.com/2008/08/booklet-telephony-application.html' title='Booklet: Telephony application development with Asterisk, Java, and SIP'/><author><name>Raka</name><uri>http://www.blogger.com/profile/09870287772817271904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='17' height='32' src='http://1.bp.blogspot.com/_M06zGolBz4A/TCwbBcRJMUI/AAAAAAAAALs/j12-lod2ipw/s1600-R/douchebag.jpg'/></author><thr:total>0</thr:total></entry></feed>
