<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Adhearsion Blog by Jay Phillips</title>
	
	<link>http://jicksta.com</link>
	<description>Adhearsion, Ruby, VoIP, Entrepreneurship</description>
	<pubDate>Wed, 22 Oct 2008 00:32:34 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/jicksta" type="application/rss+xml" /><item>
		<title>My Interview on the Rubyology Podcast</title>
		<link>http://feeds.feedburner.com/~r/jicksta/~3/373992870/rubyology-podcast-interview</link>
		<comments>http://jicksta.com/posts/rubyology-podcast-interview#comments</comments>
		<pubDate>Mon, 25 Aug 2008 05:39:13 +0000</pubDate>
		<dc:creator>Jay Phillips</dc:creator>
		
		<category><![CDATA[Adhearsion]]></category>

		<guid isPermaLink="false">http://jicksta.com/?p=218</guid>
		<description><![CDATA[Chris Matthieu of the Rubyology podcast interviewed me earlier today about Adhearsion. I was actually taking a nap just before he called me so the first few minutes of the podcast are me still waking up. Sorry that it starts out slow. It gets better further into the podcast, I promise.  
Listen to the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://jicksta.com/wp-content/uploads/2008/08/rubyology.jpg"><img class="alignright size-medium wp-image-219" style="border: 0pt none;" title="Rubyology Podcast" src="http://jicksta.com/wp-content/uploads/2008/08/rubyology.jpg" alt="" width="150" height="150" /></a>Chris Matthieu of <a href="http://rubyology.com/">the Rubyology podcast</a> interviewed me earlier today about Adhearsion. I was actually taking a nap just before he called me so the first few minutes of the podcast are me still waking up. Sorry that it starts out slow. It gets better further into the podcast, I promise. <img src='http://jicksta.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://rubyology.com/podcasts/show/69">Listen to the interview on the Rubyology website</a>.</p>
<p>On the phone interview, I was using my Apple Bluetooth headset which, in retrospect, was an awful idea. Sorry if my voice sounds muffled at times.</p>
<p>Many thanks go out to Chris for having me on the show! You can subscribe to their feed with <a href="http://rubyology.com/podcasts/rss">this</a> link.</p>
<hr />Quick Adhearsion update: Mark Spencer, creator of Asterisk, <a href="http://jicksta.com/posts/what-were-not-admitting-about-asterisk#comment-17">replied</a> to my blog post entitled <a href="http://jicksta.com/posts/what-were-not-admitting-about-asterisk">What We&#8217;re Not Admitting About Asterisk</a>. I&#8217;ll be posting a full response to his comment soon. I&#8217;ve been caught up in some professional obligations which have delayed the effort.</p>
]]></content:encoded>
			<wfw:commentRss>http://jicksta.com/posts/rubyology-podcast-interview/feed</wfw:commentRss>
		<feedburner:origLink>http://jicksta.com/posts/rubyology-podcast-interview</feedburner:origLink></item>
		<item>
		<title>Adhearsion is now on Github!</title>
		<link>http://feeds.feedburner.com/~r/jicksta/~3/361804817/adhearsion-is-now-on-github</link>
		<comments>http://jicksta.com/posts/adhearsion-is-now-on-github#comments</comments>
		<pubDate>Mon, 11 Aug 2008 09:48:35 +0000</pubDate>
		<dc:creator>Jay Phillips</dc:creator>
		
		<category><![CDATA[Adhearsion]]></category>

		<category><![CDATA[Announcements]]></category>

		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://jicksta.com/?p=161</guid>
		<description><![CDATA[I&#8217;ve migrated the hosting of the Adhearsion code base to Github.com, a site I&#8217;ve been super excited about and one which will immensely benefit the Adhearsion community. Github is the first site to get Web 2.0 right in the context of software development. If you haven&#8217;t heard of it before, you&#8217;re lucky you&#8217;re reading this [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve migrated the hosting of the Adhearsion code base to <a href="http://github.com">Github.com</a>, a site I&#8217;ve been super excited about and one which will immensely benefit the Adhearsion community. Github is the first site to get Web 2.0 right in the context of software development. If you haven&#8217;t heard of it before, you&#8217;re lucky you&#8217;re reading this post.  :)</p>
<p>You can <a href="http://github.com/jicksta/adhearsion/tree/master">click here</a> to go view the Github Adhearsion project.</p>
<p>If I had to boil down the benefits of Github into one quick point, it&#8217;s basically this: hosting with Github increases the frequency with which others contribute code to you. It does this by making it dead simple. I explain the development workflow later in this post to give you a better idea of what I mean.</p>
<p>Github is founded around <a href="http://git-scm.com">the Git SCM tool</a> originally developed by Linus Torvalds to handle the Linux kernel&#8217;s massive quantity of code and contributors. Unlike Subversion or CVS, Git is a <strong>distributed</strong> version control system, thereby empowering users to work independently from a centralized system and merge their own version of the repository with peers as appropriate. The fantastic features that Github offers would not be possible if it it weren&#8217;t for this distributed, non-linear SCM paradigm.</p>
<h3>Getting Adhearsion from Github</h3>
<p>There are now three ways to get Adhearsion:</p>
<ol>
<li>Install via RubyGems: <code>gem install jicksta-adhearsion --source http://gems.github.com</code></li>
<li>Clone a local Git copy: <code>git clone git://github.com/jicksta/adhearsion.git</code></li>
<li>Download a tarball of the latest code: <a href="http://github.com/jicksta/adhearsion/tarball/master">http://github.com/jicksta/adhearsion/tarball/master</a></li>
</ol>
<h3>The Github development workflow</h3>
<p>The development workflow of a Github project goes something like this:</p>
<p>Everything revolves around you, the user. Other users &#8220;fork&#8221; your project, make changes, commit to their own repository forked from yours, then send you a pull request when their contribution is implemented and tested. If you have doubts about their code you can view their commits&#8217; colorized changelogs by simply clicking a link within their account&#8217;s modified clone of your repository. If you wish to try their code out yourself, you simply clone their repository to your hard disk. If everything checks out with you, you issue a Git command to merge their histories into your repository&#8217;s own. If you find an issue with their code pre-merge, you can make comments on a particular changelog or <em>a particular line of code</em> in a changelog.</p>
<p>There&#8217;s a subtle bit of clever Web 2.0 trickery going on with this forking action. When a user forks a repository, let&#8217;s say Adhearsion, her account page displays &#8220;adhearsion&#8221; among her projects. Users who watch her receive a notification that she forked it. Users who watch her see each of her commits to the forked repository. Her changes accepted upstream fully reflect her commits with her full name, username, email, and even her account avatar. See how the social graph comes together with reputation incentives? It&#8217;s totally brilliant.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-171" style="border: 0pt none;" title="Github Forking Action" src="http://jicksta.com/wp-content/uploads/2008/08/github-forking-action.jpg" alt="" width="650" height="200" /></p>
<p>Other perks include:</p>
<ul>
<li>Interactive visualizations of forking activity, as seen above</li>
<li>For Ruby projects with a .gemspec in their repository, Github can automatically generate a RubyGem and store it on the Github gem server, accessible to anyone with the <code>gem</code> command.</li>
<li>Open-source projects are free to host with Github</li>
<li>Github projects can use &#8220;web hooks&#8221; which will notify other services of commits. For example, any commit to Adhearsion is logged in the Adhearsion IRC channel. Github also supports Basecamp, email notifications, Twitter, Lighthouse, a raw JSON HTTP POST, and more.</li>
<li>Giving commit rights is dead simple</li>
<li>Don&#8217;t have Git? Github lets you download a tarball of the code.</li>
<li>RSS feeds are generated for just about anything</li>
<li>Github will auto-detect README files and display them.</li>
<li>You can &#8220;watch&#8221; other repositories which interest you and others can &#8220;watch&#8221; you.</li>
<li>Syntax highlighting in the code browser</li>
</ul>
<h3>Fork Me!</h3>
<p>If you ever considered contributing to Adhearsion, it&#8217;s never been easier. Here are a few good Git resources:</p>
<ul>
<li><a href="http://github.com/guides/home">Github guides</a></li>
<li><a href="http://git-scm.com">Git-SCM.com</a></li>
<li><a href="http://peepcode.com/products/git">Git PeepCode Screencast</a> ($9 for a 1 hour screencast!)</li>
<li><a href="http://git.or.cz/course/svn.html">Git crash course for Subversion users</a></li>
</ul>
<p>Go <a href="http://github.com/signup/free">register a Github account</a>, fork <a href="http://github.com/jicksta/adhearsion/tree/master">the Adhearsion repo</a>, and give it a shot!</p>
]]></content:encoded>
			<wfw:commentRss>http://jicksta.com/posts/adhearsion-is-now-on-github/feed</wfw:commentRss>
		<feedburner:origLink>http://jicksta.com/posts/adhearsion-is-now-on-github</feedburner:origLink></item>
		<item>
		<title>“What is the next killer app for Ruby?”</title>
		<link>http://feeds.feedburner.com/~r/jicksta/~3/361432478/what-is-the-next-killer-app-for-ruby</link>
		<comments>http://jicksta.com/posts/what-is-the-next-killer-app-for-ruby#comments</comments>
		<pubDate>Sun, 10 Aug 2008 23:31:31 +0000</pubDate>
		<dc:creator>Jay Phillips</dc:creator>
		
		<category><![CDATA[Adhearsion]]></category>

		<category><![CDATA[Events]]></category>

		<category><![CDATA[Industry]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://jicksta.com/?p=152</guid>
		<description><![CDATA[The JAOO conference recently released the following video of Chad Fowler, Marcel Molina Jr. and Glenn Vanderburg answering the question &#8220;What is the next killer app for Ruby?&#8221; The video starts by them diving into a flattering discussion about Adhearsion as a candidate.

UPDATE: In response to this video and What We&#8217;re Not Admitting about Asterisk, [...]]]></description>
			<content:encoded><![CDATA[<p>The JAOO conference <a href="http://blog.jaoo.dk/2008/07/28/what-is-the-next-killer-app-for-ruby/">recently released</a> the following video of <a href="http://chadfowler.com/">Chad Fowler</a>, <a href="http://www.vernix.org/marcel/">Marcel Molina Jr.</a> and <a href="http://www.vanderburg.org/Blog">Glenn Vanderburg</a> answering the question &#8220;What is the next killer app for Ruby?&#8221; The video starts by them diving into a flattering discussion about Adhearsion as a candidate.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="700" height="420" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://blip.tv/play/6Va59CCJtgc" /><embed type="application/x-shockwave-flash" width="700" height="420" src="http://blip.tv/play/6Va59CCJtgc"></embed></object></p>
<p>UPDATE: In response to this video and <a href="http://jicksta.com/posts/what-were-not-admitting-about-asterisk">What We&#8217;re Not Admitting about Asterisk</a>, the <a href="http://radar.oreilly.com/2008/08/adhearsion-next-killer-app-for.html">O&#8217;Reilly Radar blog mentioned this</a> as well.</p>
]]></content:encoded>
			<wfw:commentRss>http://jicksta.com/posts/what-is-the-next-killer-app-for-ruby/feed</wfw:commentRss>
		<feedburner:origLink>http://jicksta.com/posts/what-is-the-next-killer-app-for-ruby</feedburner:origLink></item>
		<item>
		<title>What We’re Not Admitting about Asterisk</title>
		<link>http://feeds.feedburner.com/~r/jicksta/~3/361432479/what-were-not-admitting-about-asterisk</link>
		<comments>http://jicksta.com/posts/what-were-not-admitting-about-asterisk#comments</comments>
		<pubDate>Sun, 10 Aug 2008 07:00:00 +0000</pubDate>
		<dc:creator>Jay Phillips</dc:creator>
		
		<category><![CDATA[Adhearsion]]></category>

		<category><![CDATA[Industry]]></category>

		<guid isPermaLink="false">http://38.114.108.102/?p=115</guid>
		<description><![CDATA[It’s time to clear up several restraining misconceptions in the telephony space. These are points I outlined during my presentation at AsteriskTag in Berlin recently, though they bear repeating for everyone’s sake.
This post is not the end of the discussion. Please feel free to leave comments on this post and subscribe to my RSS feed. [...]]]></description>
			<content:encoded><![CDATA[<p>It’s time to clear up several restraining misconceptions in the telephony space. These are points I outlined during my presentation at AsteriskTag in Berlin recently, though they bear repeating for everyone’s sake.</p>
<p>This post is not the end of the discussion. Please feel free to leave comments on this post and <a href="http://feeds.feedburner.com/jicksta">subscribe to my RSS feed</a>. This post gets a lot off my chest but I’ve a growing list of things to address very soon.</p>
<p>If there’s one thing I want you to understand, it’s this:</p>
<h3>Asterisk Has Not Crossed the Chasm Yet.</h3>
<p style="text-align: center;">
<p style="text-align: left;"><img class="alignnone size-full wp-image-124" style="border: 0pt none;" title="Technology Adoption Curve" src="http://jicksta.com/wp-content/uploads/2008/08/chasm.jpg" alt="" /></p>
<p style="text-align: left;">I’m referring of course to the chasm in the technology adoption curve, best illustrated in the graph above (after which Geoffrey Moore’s book Crossing the Chasm was named).</p>
<p>To those unfamiliar with the concept, it defines five demographics of technological adopters. The first two, innovators and pragmatists (visionaries), give a new technology its first breaks; the bleeding edge is either a passion or a competitive advantage to them. Beyond these demographics exists a chasm which every technology must suffer and overcome to enter the lucrative early majority market.</p>
<p>One fascinating characteristic of technology adoption (which Geoffrey Moore introduces early in his book) is the false sense of security it can create when the rush of enthusiasm comes from the early adopters (left of the chasm). To the company, it’s easy to assume this adoption will continue linearly into eventual ubiquity. This misconception has crushed many a dream when the unsuspecting company ramps up just as their adoption profile plateaus at the chasm. I feel Digium has been caught up in this misconception.</p>
<p>I’m convinced because, in my 2.5 years of trying to make Asterisk better, I keep seeing the same kind of person approach me either online or offline at a conference. Let’s call him Otto. He’s the young, inspired hacker fascinated with the thought of controlling a phone. I was Otto once. He finds documentation, overcomes the installation, gets a “Hello World” working, then stops. Beyond that point Asterisk becomes prohibitively unintuitive and that impression sticks and becomes a reputation.</p>
<p>This quintessential newbie we’re calling Otto can then do two things: leave the community altogether or stick with it and complete a single project or even series of Asterisk projects. My experiences in the open-source telephony space have revealed two observations of mine you should consider:</p>
<blockquote>
<h3>The average amount of time a developer plays with Asterisk is less than one week.</h3>
</blockquote>
<blockquote>
<h3>The developer retention rate of Asterisk is less than 1%.</h3>
</blockquote>
<p>These observations encompass everyone who has ever considered toying with Asterisk and taken the first step. A first step may be an “apt-get install asterisk”, buying the O’Reilly Asterisk book or even cracking it open online. I’d love for you to prove me wrong on these with real market research. I actually think the median time spent using Asterisk is just one weekend and the retention rate is less than 0.1% when you consider international hackers (like those to whom I spoke in Germany recently). I passionately care about this issue because, for the time being, open-source telephony and Asterisk are virtually synonymous. I want to see the entire ecosystem ramp up their expectations. And I want to help us win this fight for the advancement of technology around the world. That’s really what’s at stake.</p>
<p>The error is not a marketing error. Digium is a multimillion dollar company with a clear image: they make hardware and appliances for the SMB PBX market. This brand extends to the open-source Asterisk software which inherits the reputation and the hardware from this umbrella company. People understand what it is. Otto was already sold when he dove in.</p>
<p>The error here &#8212; the reason why Asterisk has not crossed the chasm &#8212; is technological.</p>
<p>Digium and its surrounding ecosystem has not engineered a Tipping Point. Specifically, they have not engineered Asterisk to be “sticky” enough to spread like wildfire, a task which should be the core to any open-source umbrella company. After all, open-source’s strongest advantage is its propensity to cause a wildfire effect. Many companies open their source because it’s free help that has an inextricable marketing effect. (I’m loosely citing Malcolm Gladwell’s book The Tipping Point here, another must-read for technologists.)</p>
<p>So what the hell is wrong here? Below I enumerate four more misperceptions that I think are immensely damaging to the Asterisk ecosystem and are preventing Asterisk from becoming “sticky” enough to cross the chasm.</p>
<h3>Truth: If You Build an Asterisk System, You’re an Asterisk Developer.</h3>
<p>An improper (and more common) way to phrase this sentence would be “If you configure Asterisk, you are an Asterisk user.” Though only a subtle terminology difference, thinking of Asterisk “users” as “developers” opens the door for us to treat them as such.</p>
<p>Geeky internet citizens can likely remember seeing at some point the notorious video of Steve Ballmer running around a Microsoft stage screaming “DEVELOPERS! DEVELOPERS! DEVELOPERS!” Microsoft is starting to understand what has empowered the open-source world to become an unstoppable <em>deus ex machina</em>: it’s about the developers, man! Open-source is a philosophy which places developers at the forefront with the fewest restrictions. And it’s extremely successful! Last year Steve Ballmer said with a straight face &#8220;I would love to see all open source innovation happen on top of Windows.&#8221; He’s an enemy and, because he understands this principle, he’s an especially dangerous enemy. Microsoft has entered the voice market and is now competing with Digium. And Microsoft’s even doing many things right technologically! We need to react.</p>
<p>We can react by treating users of Asterisk as developers, not system administrators. This is a technological truth that has been glaringly obvious but shamefully ignored. By “developer” I do still mean someone who touches only the “configuration” files which Asterisk provides, not someone who modifies the C code with which Asterisk itself is written. I call these people developers for the following reason.</p>
<h3>Truth: When You Write extensions.conf, You Are Writing Software.</h3>
<p>To those unfamiliar with the technicalities of Asterisk, extensions.conf is the main “configuration” file in which the dial plan is written &#8212; the logic that controls the procedures that occur during calls that go through your Asterisk system.</p>
<p>My stating that extensions.conf is software always gets an amusing reaction from the average Asterisk hacker. It usually goes something like this:</p>
<blockquote><p>“When you write extensions.conf, you’re writing software.”</p>
<p>“Well, extensions.conf started out as a very simple solution to solve Asterisk’s initially simple problems. It was not designed to be a full-feature programming language.”</p>
<p>“But it’s now a language with functions, control statements, loops, labels, conditions, variables, even macros and subroutines!”</p>
<p>“Yeah, but it’s not a programming language. It wasn’t mean to be.”</p></blockquote>
<p>I’ve heard this from several people over and over. The Asterisk hacker with whom I’m conversing generally concedes the point after various facial color changes. Let’s at long last admit this, guys: the extensions.conf grammar (and the derived syntactical alternative AEL) are very poorly designed dynamically-typed scripting languages. Someone who modifies this file is called a programmer. The extensions.conf file is what we call <em>software</em>. A .conf file extension should only be used for configuration files. With these (irrefutable) assertions in place, we can start to frame the picture of what the next approach should be.</p>
<p>Our oversight of this subject has had an interesting effect. I’d say the biggest demographic of Asterisk users is the sysadmin type who feels no anxiety toward a “configuration file” but may feel a little anxiety toward modifying a “.c”, “.java”, “.rb” or “.py” file. This distinction between a .conf and “real code” is mostly superficial. I say “mostly” because, when the Asterisk developer must modify a C file which performs the same function as extensions.conf, the distinction <strong>is</strong> greater because she knows that there are a <strong>lot</strong> of ways to easily screw up the entire PBX, having disastrous consequences. This is exactly why Asterisk’s monolithic voicemail system has gained a bad reputation: it’s written in C and difficult or dangerous to modify.</p>
<p>When we acknowledge that extensions.conf is a scripting language, one abstracted deeply from the dangers of the machine language paradigm in an attempt to improve productivity, the discussions to “improve the Asterisk developer experience” inevitably conclude that a real scripting language must be used. For today’s and tomorrow’s complex uses of Asterisk, the scripting language in place now completely breaks down on several fronts.</p>
<p>This is not a blog post about Adhearsion, but this is where I have extensive experience on this subject through my years implementing it. When we take the first step and begin developing scripting language support for a telephony platform, I’ve found that what’s also really needed is a <strong>framework</strong> that further abstracts the legacy Asterisk paradigm into what <strong>should</strong> be a DRY (Don’t Repeat Yourself!) user experience. The framework can provide a plugin system so people can trade small units of functionality at little risk. The framework can allow better bundling of those applications. The framework can make deployment assumptions. The framework can evolve and provide new framework-level hooks into other disparate technologies that were previous unthought of.</p>
<p>I’m extremely passionate about this subject and can continue extensively on it. Let’s save that for later and continue. Grab my feed if you’re interested.</p>
<h3>There’s a Difference Between an “Asterisk Application” and an “Asterisk System”</h3>
<p>On this point it seems I diverge completely from the Asterisk status quo. During Mark Spencer’s great keynote at AsteriskTag, he gave a fun list of Asterisk applications as a way of inspiring the community to innovate. The list included about nine Asterisk “applications” such as the Botanicalls project to receive phone calls from your anthropomorphized plants when they’re thirsty, a tongue-in-cheek queue game “application” that makes people waiting in a queue play a game instead of hear music (winners move up in the queue), an application for pilots to get aviation reports from any cell or landline phone. These are all great examples of using Asterisk, but they’re not “applications.”</p>
<p>These are examples of Asterisk “systems.” A non-trivial use of Asterisk (such as these) usually requires many custom shell scripts that adhere your program to other technologies. Frequently they’re tightly coupled to machine-specific assumptions such as the Linux distro choice, use of CURL, directory paths, sip.conf trunk names, extensions.conf context names, hardcoded database information, IP addresses and so forth. This tight coupling prevents easy distribution, therefore no one trades implementations and everyone reinvents the wheel.</p>
<p>These “systems” of interlocked clockwork are required because of the deficiencies in the extensions.conf scripting language. If dial plans were written in a high-level language, there would be no need to shell out to accomplish some small unit of functionality. Everything would be a part of your dial plan <strong>software</strong>. For this reason, the solution to this tight coupling is for a scripting framework to standardize what’s most commonly done in an abstracted, high-level way. Features that were not thought of are implemented as plugins. Plugins are shared and configured to achieve the desired effect.</p>
<p>I think of an Asterisk application like a desktop application. If I want a call center with a sophisticated, fine-tuned web interface that shows agents prompts with AJAX from a MySQL database, I should be able to go online and click a “Download Now” button somewhere. If I run a skydiving dropzone and want an application to manage the jump schedules with telephone reminders, I should be able to go online and download something pretty close to that. This expectation of “yeah, someone’s probably thought of that &#8212; let me go check online” is one that we’ve all grown familiar with in the open-source economy. For desktop software, this expectation of abundance is fundamentally powered by the ease with which desktop applications are distributed. For telephony software, this is completely not the case.</p>
<p>This is also one of my motivations behind Adhearsion’s design. It should be a default expectation of an Adhearsion app that the author wants to eventually distribute it online and help build a greater telephony application community. If they don’t want to, that’s fine, but I shouldn’t stop them.</p>
<p>And if an open-source economy emerges around telephony applications, we’ll begin attracting people who would have never otherwise thought that they could actually use telephony to their advantage. By increasing our reach and relevance, we’ll be engineering a Tipping Point.</p>
<h3>Telephony is Too Complicated for Every Hacker to Have a PBX in Their Closet</h3>
<p>This is something that Asterisk has little control over. Someone building an experimental personal application inevitably must use one of these two technologies: SIP trunks or a POTS (Plain Old Telephone Service) line with an analog telephony PCI card. There are fundamental problems with both of these approaches unfortunately. I’ll start with SIP trunks.</p>
<p>SIP trunking is a way for any computer to terminate a call onto the Publicly Switched Telephone Network by using a premium service. The VoIP software you’re using (e.g. Asterisk) places a pure-VoIP call to this service using your account credentials. With metadata that comes along with the VoIP call, the service operates the other leg of the call and terminates your packets in a way that can reach any phone in the world.</p>
<p>The problem with SIP trunking is simple economics. The people making the real profits in PSTN termination realize it’s not worth the overhead to deal with small fries who push only 1,000 minutes a month through their service. Instead, they’re looking for three orders of magnitude more usage. Small fries like you and me get service through people who resell the real providers’ services and operate at scale. Most companies you’ll find online for SIP trunking are actually three to six companies downstream from one of the multi-billion dollar companies that are really doing the terminations.</p>
<p>The effect is poor support, poor quality, and poor features. It’s a race to the bottom and the solo telephony hackers lose most.</p>
<p>One thing that’ll definitely work reliably is an analog card (like those that Digium sells) that handles the analog signaling into the landline phone jack on your wall. Unfortunately, these require a considerable financial investment and, by nature, don’t spread like wildfire. One can’t take a wild ride through the world of telephony development for a weekend as just an experiment when one must to drop hundreds of dollars and spend hours configuring Linux kernel modules to get started.</p>
<p>I vent this here because it’s stifling the Tipping Point of open-source VoIP and there is a solution. I’ll mention that in my conclusion.</p>
<h3>Most people want something other than a PBX</h3>
<p>I’m going to cite another technology book to make my point here: The Long Tail by Chris Anderson.</p>
<p><img class="alignnone size-full wp-image-123" style="border: 0pt none;" title="The Long Tail of Telephony Markets" src="http://jicksta.com/wp-content/uploads/2008/08/long-tail-of-telephony-markets.jpg" alt="" /></p>
<p>The Long Tail is a graphical concept which visualizes diverse products in the same market. It’s a fascinating subject and is perfectly applicable to the telephony space. There are certain applications that everyone wants: they form the Big Head. Fixating on this space is the orthodox business model. Then are are thousands of niches in The Long Tail that have legitimate business needs but the demand for a product that fits their needs is much smaller. In the past, production costs made producing for these niches economically infeasible. Now, open-source, VoIP and the World Wide Web has made it possible to not only develop these niche applications on a dime but actually reach the customers as well!</p>
<p>This is where the importance of the application comes back around. The PBX, albeit important, is just one application and the aggregate demand of non-PBX voice apps <strong>exceeds</strong> the demand for PBXs. Voice is something that’s now universally accessible (thanks to cell phones) and universally understood (everyone understands how to make a phone call). Given the needs of the entire world in this space, it’s a no-brainer that the SMB market is a minority. If you can apply voice to a problem creatively, you can spin straw into gold. Consultants take note.</p>
<h3>The Manifest Telephony Destiny</h3>
<p>It’s absolutely inevitable that voice applications saturate the Long Tail over time. Thanks to the internet and the fruit it has borne, the niches will become much less ignored. Let me call this the Manifest Telephony Destiny. Just as the pilgrims settled along the east coast of America and dreamed about spreading the country’s borders across all the way to the Pacific Ocean, we’re now the pilgrims who’ve settled on the Big Head of the Long Tail graph peering toward and dreaming about what lies to the right. It’s our Manifest Telephony Destiny to reach across far, far to the right of the graph. If you’re a businessman or businesswoman in voice today, understand this principle and believe it. Talk about it at your next board meeting. It’s coming, there’s money in it, and it’s about to pass you up. Open-source telephony is the enabler and the experts will reap the rewards.</p>
<h3>The Bottom Line</h3>
<p>Hopefully this post shoos away the aforementioned elephants in the room. We must change these perceptions because they are <strong>damaging</strong> to the open-source space and, by association, the entire world. I really believe that.</p>
<p>I’ve been thinking very critically about this industry for over a year now with my entrepreneur hat on. Over the past eighteen months I’ve been to over fifteen states and six foreign countries almost entirely on Adhearsion-related business. I’ve talked to many industry visionaries, newbies, respected technologists, entrepreneurs, and the technologically illiterate. This post crystalizes some of the lessons I’ve learned on this amazing journey, but an even more amazing journey awaits in the new company I’ve formed to ameliorate in a fundamental way my many frustrations with this industry.</p>
<p>Here’s what I’ll let out: its name is Adhearsion Inc. and it’s not consulting. We’re currently seeking private funding. If you are or know of investors, send me an email at jay-at-adhearsion-dot-com. We think we know how to turn the industry around.</p>
<p>Stay tuned for more from my mind.  <img src='http://jicksta.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://jicksta.com/posts/what-were-not-admitting-about-asterisk/feed</wfw:commentRss>
		<feedburner:origLink>http://jicksta.com/posts/what-were-not-admitting-about-asterisk</feedburner:origLink></item>
		<item>
		<title>Blog Overhaul</title>
		<link>http://feeds.feedburner.com/~r/jicksta/~3/361432481/blog-overhaul</link>
		<comments>http://jicksta.com/posts/blog-overhaul#comments</comments>
		<pubDate>Sun, 10 Aug 2008 07:12:49 +0000</pubDate>
		<dc:creator>Jay Phillips</dc:creator>
		
		<category><![CDATA[Announcements]]></category>

		<guid isPermaLink="false">http://jicksta.com/?p=133</guid>
		<description><![CDATA[Lots of people have been asking me about this blog. When this site was actually up and reachable, which in itself was seldom, visitors would find that I&#8217;ve left it entirely untouched for over five months.
Well, it&#8217;s back and better than ever now. I&#8217;ve come full circle in my choice of blog engines:

 I initially [...]]]></description>
			<content:encoded><![CDATA[<p>Lots of people have been asking me about this blog. When this site was actually up and reachable, which in itself was seldom, visitors would find that I&#8217;ve left it entirely untouched for over five months.</p>
<p>Well, it&#8217;s back and better than ever now. I&#8217;ve come full circle in my choice of blog engines:</p>
<ul>
<li> I initially used Wordpress in the very early days</li>
<li>I then migrated to a blog engine I wrote with Ruby on Rails called Gosling in mid-2006</li>
<li>Frustrated by leaving features behind, I moved to Mephisto in its early days</li>
<li>I then tried Typo after finding Mephisto green at the time</li>
<li>And I&#8217;ve now switched back to Wordpress</li>
</ul>
<p>Wordpress is one of the few blogging engines that&#8217;s both open-source and has a profitable company backing its development. I&#8217;m impressed with what they and the amazing community around it have added in the past two years and I&#8217;m sure they&#8217;ll continue impressing me.</p>
<p>There were two initial compromises:</p>
<ul>
<li>Comments from before have been temporarily lost.</li>
<li>Your RSS reader may show every post on this blog to be new and unread.</li>
</ul>
<p>Apologies to those who care at all. Now onto blogging again!</p>
]]></content:encoded>
			<wfw:commentRss>http://jicksta.com/posts/blog-overhaul/feed</wfw:commentRss>
		<feedburner:origLink>http://jicksta.com/posts/blog-overhaul</feedburner:origLink></item>
		<item>
		<title>New Adhearsion Feature: Sexy Rails integration</title>
		<link>http://feeds.feedburner.com/~r/jicksta/~3/361432483/new-rails-integration</link>
		<comments>http://jicksta.com/posts/new-rails-integration#comments</comments>
		<pubDate>Mon, 25 Feb 2008 07:21:00 +0000</pubDate>
		<dc:creator>Jay Phillips</dc:creator>
		
		<category><![CDATA[Adhearsion]]></category>

		<category><![CDATA[Announcements]]></category>

		<category><![CDATA[Industry]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">urn:uuid:a2c5500a-cfc0-45c2-a741-9890a985a2c8</guid>
		<description><![CDATA[This feature has been in trunk for a while so it’s time to bring it into the limelight.
Let’s say you’ve a really fancy Ruby on Rails web application with which you wish to integrate your new Adhearsion app. Though you may only need five or so of the thirty models that exist within the app, [...]]]></description>
			<content:encoded><![CDATA[<p>This feature has been in trunk for a while so it’s time to bring it into the limelight.</p>
<p>Let’s say you’ve a <em>really</em> fancy Ruby on Rails web application with which you wish to integrate your new Adhearsion app. Though you may only need five or so of the thirty models that exist within the app, they’re inter-related somehow with <code>has_many :through</code>, <code>belongs_to</code> and a dozen other <span class="caps">SQL</span> fragments sprinkled about. That’s no good—looks like it’s all or nothing. Oh, and you’ve eight Rails plugins installed, of which five heavily modify ActiveRecord’s internals for your obscure purposes. That’s no good, either. Looks like it all of Rails or nothing.</p>
<p>You can now do this “all of Rails” integration extremely easily in Adhearsion. When you create a new Adhearsion app with trunk, you’ll see the following option in <code>config/startup.rb</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby">config.<span style="color:#9900CC;">enable_rails</span> <span style="color:#ff3333; font-weight:bold;">:path</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> “<span style="color:#006600; font-weight:bold;">/</span>path<span style="color:#006600; font-weight:bold;">/</span>to<span style="color:#006600; font-weight:bold;">/</span>your<span style="color:#006600; font-weight:bold;">/</span>rails<span style="color:#006600; font-weight:bold;">/</span>project”, <span style="color:#ff3333; font-weight:bold;">:env</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:development</span></pre></div></div>

<p>And voila! Just uncomment this line and point it to the appropriate path. Adhearsion will do the rest.</p>
<p>When the Rails application loads, Adhearsion doesn’t bother initializing any of the web servers that may slow it down. The only real penalty is the negligible consumption of memory it brings with it.</p>
<p>Still more features to blog about! Stay tuned…</p>
]]></content:encoded>
			<wfw:commentRss>http://jicksta.com/posts/new-rails-integration/feed</wfw:commentRss>
		<feedburner:origLink>http://jicksta.com/posts/new-rails-integration</feedburner:origLink></item>
		<item>
		<title>New Adhearsion Feature: Dialplan Menus</title>
		<link>http://feeds.feedburner.com/~r/jicksta/~3/361432487/menu-command</link>
		<comments>http://jicksta.com/posts/menu-command#comments</comments>
		<pubDate>Tue, 12 Feb 2008 03:23:00 +0000</pubDate>
		<dc:creator>Jay Phillips</dc:creator>
		
		<category><![CDATA[Adhearsion]]></category>

		<category><![CDATA[Announcements]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">urn:uuid:d91e03b4-bfeb-46bf-8c13-6c763e06b7a2</guid>
		<description><![CDATA[Those who watch the Adhearsion trunk commits probably noticed a new feature I snuck in recently: the menu() dialplan command. Now that I’ve had a chance to actually use the feature myself, it’s time I cover it in more detail here.
For the record, I’m totally excited about it. I’ve wished for something like this for [...]]]></description>
			<content:encoded><![CDATA[<p>Those who watch the Adhearsion trunk commits probably noticed a new feature I snuck in recently: the <code>menu()</code> dialplan command. Now that I’ve had a chance to actually use the feature myself, it’s time I cover it in more detail here.</p>
<p>For the record, I’m <em>totally</em> excited about it. I’ve wished for something like this for over a year and only recently did I discover a way to get around the one technical limitation to implement it.</p>
<h3>The problem</h3>
<p>The <code>menu()</code> command solves the problem of building enormous input-fetching state machines in Ruby without first-class message passing facilities or an <a href="http://www.martinfowler.com/bliki/DomainSpecificLanguage.html">external <span class="caps">DSL</span></a>. After completely scrapping the feature several times and starting over, I eventually settled on my design of a state machine using a second-class message passing pattern. I’ll be writing about this pattern soon here.</p>
<h3>Meet menu()</h3>
<p>For now, here’s an example of <code>menu()</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby">from_pstn <span style="color:#006600; font-weight:bold;">&#123;</span>
  menu <span style="color:#996600;">'welcome'</span>, <span style="color:#996600;">'for-spanish-press-8'</span>, <span style="color:#996600;">'main-ivr'</span>,
       <span style="color:#ff3333; font-weight:bold;">:timeout</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">8</span>.<span style="color:#9900CC;">seconds</span>, <span style="color:#ff3333; font-weight:bold;">:tries</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">3</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>link<span style="color:#006600; font-weight:bold;">|</span>
    link.<span style="color:#9900CC;">shipment_status</span>  <span style="color:#006666;">1</span>
    link.<span style="color:#9900CC;">ordering</span>         <span style="color:#006666;">2</span>
    link.<span style="color:#9900CC;">representative</span>   <span style="color:#006666;">4</span>
    link.<span style="color:#9900CC;">spanish</span>          <span style="color:#006666;">8</span>
    link.<span style="color:#9900CC;">employee</span>         <span style="color:#006666;">900</span>..<span style="color:#006666;">999</span>
&nbsp;
    link.<span style="color:#9900CC;">on_invalid</span> <span style="color:#006600; font-weight:bold;">&#123;</span> play <span style="color:#996600;">'invalid'</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
    link.<span style="color:#9900CC;">on_premature_timeout</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>str<span style="color:#006600; font-weight:bold;">|</span>
      play <span style="color:#996600;">'sorry'</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    link.<span style="color:#9900CC;">on_failure</span> <span style="color:#9966CC; font-weight:bold;">do</span>
      play <span style="color:#996600;">'goodbye'</span>
      hangup
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
shipment_status <span style="color:#006600; font-weight:bold;">&#123;</span>
  <span style="color:#008000; font-style:italic;"># Fetch a tracking number and pass it to a web service.</span>
<span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
ordering <span style="color:#006600; font-weight:bold;">&#123;</span>
  <span style="color:#008000; font-style:italic;"># Enter another menu that lets them enter credit card</span>
  <span style="color:#008000; font-style:italic;"># information and place their order over the phone.</span>
<span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
representative <span style="color:#006600; font-weight:bold;">&#123;</span>
  <span style="color:#008000; font-style:italic;"># Place the caller into a queue</span>
<span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
spanish <span style="color:#006600; font-weight:bold;">&#123;</span>
  <span style="color:#008000; font-style:italic;"># Special options for the spanish menu.</span>
<span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
employee <span style="color:#006600; font-weight:bold;">&#123;</span>
  dial <span style="color:#996600;">&quot;SIP/#{extension}&quot;</span> <span style="color:#008000; font-style:italic;"># Overly simplistic</span>
<span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<p>If you haven’t, take a minute to read the dialplan above before reading on.</p>
<p>The main detail to note is the declarations within the <code>menu()</code> command’s block. Each line seems to refer to a <code>link</code> object executing a seemingly arbitrary method with an argument that’s either a number or a <code>Range</code> of numbers. The <code>link</code> object collects these arbitrary method invocations and assembles a set of rules. The seemingly arbitrary method name is the name of the context to which the menu should jump in case its argument (the pattern) is found to be a match.</p>
<p>With these context names and patterns defined, the <code>menu()</code> command plays in sequence the sound files you supply as arguments, stopping abruptly if the user enters a digit. If no digits were pressed when the files finish playing, it waits <code>:timeout</code> seconds. If no digits are pressed after the timeout, it executes the <code>on_premature_timeout</code> hook you define (if any) and then tries again a maximum of <code>:tries</code> times. If digits are pressed that result in no possible match, it executes the <code>on_invalid</code> hook. When/if all tries are exhausted with no positive match, it executes the <code>on_failure</code> hook <em>after</em> the other hook (e.g. <code>on_invalid</code>, then <code>on_failure</code>).</p>
<p>When the <code>menu()</code> state machine runs through the defined rules, it must distinguish between exact and potential matches. It’s important to understand the differences between these and how they affect the overall outcome:</p>
<table border="0">
<tbody>
<tr>
<th>exact matches</th>
<th>potential matches</th>
<th>result</th>
</tr>
<tr>
<td style="text-align:center;">0</td>
<td style="text-align:center;">0</td>
<td>Fail and start over</td>
</tr>
<tr>
<td style="text-align:center;">1</td>
<td style="text-align:center;">0</td>
<td>Match found!</td>
</tr>
<tr>
<td style="text-align:center;">0</td>
<td style="text-align:center;">1</td>
<td>Get another digit</td>
</tr>
<tr>
<td style="text-align:center;">0</td>
<td style="text-align:center;">&gt;1</td>
<td>Get another digit</td>
</tr>
<tr>
<td style="text-align:center;">&gt;1</td>
<td style="text-align:center;">0</td>
<td>Go with the first exact match</td>
</tr>
<tr>
<td style="text-align:center;">1</td>
<td style="text-align:center;">&gt;0</td>
<td>Get another digit. If timeout, use exact match</td>
</tr>
<tr>
<td style="text-align:center;">&gt;1</td>
<td style="text-align:center;">&gt;0</td>
<td>Get another digit. If timeout, use first exact match</td>
</tr>
</tbody>
</table>
<h3>Database integration</h3>
<p>To do database integration, I recommend programatically executing methods on the <code>link</code> object within the block. For example:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby">menu <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>link<span style="color:#006600; font-weight:bold;">|</span>
  <span style="color:#9966CC; font-weight:bold;">for</span> employee <span style="color:#9966CC; font-weight:bold;">in</span> Employee.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:all</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    link.<span style="color:#9900CC;">internal</span> employee.<span style="color:#9900CC;">extension</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>or this more Rubyish way</p>

<div class="wp_syntax"><div class="code"><pre class="ruby">menu <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>link<span style="color:#006600; font-weight:bold;">|</span>
  link.<span style="color:#9900CC;">internal</span> <span style="color:#006600; font-weight:bold;">*</span>Employee.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:all</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">map</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&amp;</span>amp;:extension<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>If this second example seems like too much Ruby magic, let me explain — <code>Employee.find(:all)</code> effectively does a “<code>SELECT * FROM employees</code>” on the database with ActiveRecord, returning (what you’d think is) an <code>Array</code>. The <code>map(&amp;:extension)</code> is fanciness that means “replace every instance in this Array with the result of calling <code>extension</code> on that object”. Now we have an <code>Array</code> of every extension in the database. The splat operator (*) before the argument changes the argument from being one argument (an <code>Array</code>) into a <em>sequence</em> of <code>n</code> arguments, where <code>n</code> is the number of items in the Array it’s “splatting”. Lastly, these arguments are passed to the <code>internal</code> method, the name of a context which will handle dialing this user if one of the supplied patterns matches.</p>
<h3>Handling a successful pattern match</h3>
<p>Which brings me to another important note. Let’s say that the user’s input successfully matched one of the patterns returned by that <code>Employe.find...</code> magic. When it jumps to the <code>internal</code> context, <strong>that context can access the variable entered through the <code>extension</code> variable</strong>. This was a tricky design decision that I think, overall, works great. It makes the <code>menu()</code> command feel much more first-class in the Adhearsion dialplan grammar and decouples the receiving context from the menu that caused the jump. After all, the context doesn’t necessary need to be the endpoint from a menu; it can be its own entry point, making <code>menu()</code> effectively a pipeline of re-creating the call.</p>
<p>I encourage you to give this command a try and let me know what you think! Feel free to post on the mailing list or here on my blog.</p>
<p>Enjoy, folks!</p>
]]></content:encoded>
			<wfw:commentRss>http://jicksta.com/posts/menu-command/feed</wfw:commentRss>
		<feedburner:origLink>http://jicksta.com/posts/menu-command</feedburner:origLink></item>
		<item>
		<title>The Year of Adhearsion</title>
		<link>http://feeds.feedburner.com/~r/jicksta/~3/361432488/the-year-of-adhearsion</link>
		<comments>http://jicksta.com/posts/the-year-of-adhearsion#comments</comments>
		<pubDate>Thu, 27 Dec 2007 04:30:00 +0000</pubDate>
		<dc:creator>Jay Phillips</dc:creator>
		
		<category><![CDATA[Adhearsion]]></category>

		<category><![CDATA[Industry]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">urn:uuid:af1dc068-98da-475f-92d3-27b20e439a80</guid>
		<description><![CDATA[I get dizzy when I think of the flash flood of memories 2007 has been. I remember what I was doing precisely one year ago as if it were yesterday:
Sitting in my cozy dormitory bedroom, the first signs of relief set in as the stretch lasting almost two months was coming to an end&#8212;I was [...]]]></description>
			<content:encoded><![CDATA[<p>I get dizzy when I think of the flash flood of memories 2007 has been. I remember what I was doing precisely one year ago as if it were yesterday:</p>
<p>Sitting in my cozy dormitory bedroom, the first signs of relief set in as the stretch lasting almost two months was coming to an end&#8212;I was tying up the loose ends of my first publicly released version of Adhearsion. The start of the stretch was marked by my irreverent albeit desperate sneaking into Astricon 2006, the big Asterisk conference held ironically just six miles away in downtown Dallas at which security was surprisingly lax. It was there that I first demoed an alpha of Adhearsion to respected players in the telecom industry. My demo’s reception motivated me to pursue Adhearsion further, potentially toward something big. Through connections established there, I was invited to the headquarters of Asterisk’s corporation Digium twice, wrote an article for Linux Journal magazine, and got my first notable Adhearsion speaking opportunity at Emerging Telephony 2007. That was the tipping point.</p>
<p>Since those days I’ve spoken at eleven more conferences and tech meetups, collected hundreds of business cards, written an Adhearsion chapter for O’Reilly’s Asterisk book, and visited three other countries and fifteen states on Adhearsion-related business. To afford the absurd amount of travel, I took up an interesting style of living I later labelled peer-to-peer living: I had no fixed residence and considered myself, basically, homeless. Throughout my travels I managed to develop a support network of individuals with couches to spare for a few days or a few weeks. Needless to say, this all came as a shock to this boy from Texas who had never been out of the South.</p>
<p>This fruitful year is now over, the name Adhearsion is more widely known and, as  of last week, I live in a fantastic part of beautiful San Francisco. After twelve months of testing myself and countless days of personal reflection, I’ve confidently decided that <strong>Adhearsion is my career now</strong>.</p>
<p>Big ’08 holds a lot. In addition to continued development, I want to bring in sub-contractors to assist on increasingly substantial consulting projects and encourage others to start their own independent Adhearsion consulting practice. If you’re a Ruby developer either with VoIP experience or a genuine, keen desire to gain VoIP experience, talk to me. My email address is in the right column of this blog. If you’re a company needing a better phone system or a startup with some telephony component not yet developed, talk to me too and let’s see if using Adhearsion makes sense.</p>
<p>I’ll continue promoting Adhearsion in ways other than speaking at a dozen conferences. Think screencasts, video podcasts, writing, and a revamped website. Development will continue regardless of whether I have work. My first order of business is to get the version 0.8.0 gem out the door. For those that don’t want to wait, you can play with 0.8.0 in <a href="http://svn.adhearsion.com/trunk">Adhearsion&#8217;s trunk</a>.</p>
<p>Happy new year folks! Let’s make 2008 the year the telecom industry <em>really</em> changed.</p>
]]></content:encoded>
			<wfw:commentRss>http://jicksta.com/posts/the-year-of-adhearsion/feed</wfw:commentRss>
		<feedburner:origLink>http://jicksta.com/posts/the-year-of-adhearsion</feedburner:origLink></item>
		<item>
		<title>The Lack of Emerging Telephony</title>
		<link>http://feeds.feedburner.com/~r/jicksta/~3/361432489/the-lack-of-emerging-telephony</link>
		<comments>http://jicksta.com/posts/the-lack-of-emerging-telephony#comments</comments>
		<pubDate>Sat, 13 Oct 2007 19:43:00 +0000</pubDate>
		<dc:creator>Jay Phillips</dc:creator>
		
		<category><![CDATA[Adhearsion]]></category>

		<category><![CDATA[Announcements]]></category>

		<category><![CDATA[Events]]></category>

		<category><![CDATA[Industry]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">urn:uuid:89ca41a3-4d45-48a0-95f2-a155dfa98ef2</guid>
		<description><![CDATA[The telephony industry sickens me. I make it a point to follow things closely. I sift through the nauseatingly boring Del.icio.us VoIP feeds, catching the occasional library I hadn’t seen before that mildly captures my interest. I hear that SuperBigComm has bought TinySmallVox every week or so. I subscribe to the feeds of the VoIP’s [...]]]></description>
			<content:encoded><![CDATA[<p>The telephony industry sickens me. I make it a point to follow things closely. I sift through the nauseatingly boring Del.icio.us VoIP feeds, catching the occasional library I hadn’t seen before that mildly captures my interest. I hear that SuperBigComm has bought TinySmallVox every week or so. I subscribe to the feeds of the VoIP’s biggest bloggers (of which there are surprisingly few) and usually read their posts last, procrastinating the tedium. I don’t unsubscribe and keep the faith because I <strong>want</strong> to believe this industry is going somewhere.</p>
<p>But last night my feeds agreed with my doubts. Resounding through the VoIP blogosphere, O’Reilly <a href="http://www.oreillynet.com/etel/blog/2007/10/etel_2008_cancelled.html">announced</a> they have cancelled their Emerging Telephony conference and blog. To help paint the picture, Emerging Telephony was widely considered to be one of the actually fun, innovative conferences every year in this space.</p>
<p><strong>Therein lies the problem.</strong> Too little fun and innovation exists in this industry to make a full conference out of it.</p>
<p>Remember the last episode of Star Trek: The Next Generation where the omnipotent Q places all of humanity on trial for being a savage, inferior species? Q asserts that the years since the first time he placed humanity on trial has been squandered with virtually no progress toward enlightenment. I’m convinced Q was so pissed off because of this ridiculous blemish in our history. We <em>are</em> a savage, uncivilized race apparently.</p>
<p>This is a frustration I’ve had since I created Adhearsion. The framework’s name reflects my attempt to unify this godforsaken wilderness. I’m herding cats and fighting the good fight simultaneously.</p>
<p>But I’m not giving up yet.</p>
<p>There are many wonderful things brewing under the covers of the new version of Adhearsion. It’s a maverick, opinionated approach but it may just work. The effect could be truly disruptive:</p>
<ul>
<li>A significantly next-generation approach reaches hackers who can finally develop actual open-source VoIP applications.</li>
<li>An open-source ecosystem forms.</li>
<li>More people become professional VoIP developers.</li>
<li>Additional global expertise increases the number of open-source VoIP applications.</li>
<li>The ability to host the applications becomes predictable and inexpensive through standardization.</li>
<li>Startups form around new applications.</li>
<li>A few startups succeed and contribute back.</li>
<li>Years of contributions improves software quality and lowers barrier to entry.</li>
<li>Disruptively innovative companies catch big telecom companies with their pants down and chip away at their market share.</li>
</ul>
<p>The fight will be a long and difficult one, though the next baby step is to get Adhearsion v0.8.0 out the door. Near the end of the this month I’ll outline the changes in the new version of Adhearsion which should see a release by RubyConf on November 4th, 2007!</p>
]]></content:encoded>
			<wfw:commentRss>http://jicksta.com/posts/the-lack-of-emerging-telephony/feed</wfw:commentRss>
		<feedburner:origLink>http://jicksta.com/posts/the-lack-of-emerging-telephony</feedburner:origLink></item>
		<item>
		<title>Superators Add New Operators to Ruby</title>
		<link>http://feeds.feedburner.com/~r/jicksta/~3/361432490/superators-add-new-operators-to-ruby</link>
		<comments>http://jicksta.com/posts/superators-add-new-operators-to-ruby#comments</comments>
		<pubDate>Thu, 30 Aug 2007 02:51:00 +0000</pubDate>
		<dc:creator>Jay Phillips</dc:creator>
		
		<category><![CDATA[Announcements]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">urn:uuid:f6250ba3-a00c-4d56-adc5-1ea04a1eec5c</guid>
		<description><![CDATA[This one&#8217;s for the fellow DSL mavens. I&#8217;m releasing now a new library I&#8217;ve developed that adds new operators to Ruby. Install the superators gem and run the following code in irb:

require 'rubygems'
require 'superators'
&#160;
class Array
  superator &#34;&#60;---&#34; do &#124;operand&#124;
    self &#60;&#60; operand.reverse
  end
end
&#160;
&#91;&#34;jay&#34;&#93; &#60;--- &#34;spillihp&#34;

Dear demagogues of domain specificity! Yes, [...]]]></description>
			<content:encoded><![CDATA[<p>This one&#8217;s for the fellow <span class="caps">DSL</span> mavens. I&#8217;m releasing now a new library I&#8217;ve developed that <strong>adds new operators to Ruby</strong>. Install the <kbd>superators</kbd> gem and run the following code in irb:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rubygems'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'superators'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#CC0066; font-weight:bold;">Array</span>
  superator <span style="color:#996600;">&quot;&lt;---&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>operand<span style="color:#006600; font-weight:bold;">|</span>
    <span style="color:#0000FF; font-weight:bold;">self</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> operand.<span style="color:#9900CC;">reverse</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;jay&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&lt;---</span> <span style="color:#996600;">&quot;spillihp&quot;</span></pre></div></div>

<p>Dear demagogues of domain specificity! Yes, this actually works. Now, how about this cutie:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rubygems'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'superators'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#CC0066; font-weight:bold;">String</span>
  superator <span style="color:#996600;">&quot;++&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>operand<span style="color:#006600; font-weight:bold;">|</span>
    upcase <span style="color:#006600; font-weight:bold;">+</span> operand.<span style="color:#9900CC;">upcase</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  superator <span style="color:#996600;">&quot;-~+~-&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>operand<span style="color:#006600; font-weight:bold;">|</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Using pretty superators&quot;</span>
    <span style="color:#0000FF; font-weight:bold;">self</span> <span style="color:#006600; font-weight:bold;">+</span> operand
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">p</span> <span style="color:#996600;">&quot;Tangy&quot;</span> <span style="color:#006600; font-weight:bold;">++</span> <span style="color:#996600;">&quot;Erlangy&quot;</span>
p <span style="color:#996600;">&quot;Super&quot;</span> <span style="color:#006600; font-weight:bold;">-</span>~<span style="color:#006600; font-weight:bold;">+</span>~<span style="color:#006600; font-weight:bold;">-</span> <span style="color:#996600;">&quot;ators&quot;</span></pre></div></div>

<p>Superators are a <strong>superset</strong> of Ruby operators. And they&#8217;re pretty super too.</p>
<p><img src="http://jicksta.com/images/superators.gif" style="float:right"/></p>
<p>To elaborate more, they work by exploiting the way Ruby parses binary and unary operators. For example, the code <code>foo ++- bar</code> is equivalent to <code>foo.+(bar.-@().+@())</code></p>
<p>and the Superators library keeps track of the unary operators called on the operand in their appropriate order. A valid Superator&#8217;s format is simple: take (almost) any Ruby binary operator and tail on an indefinite number of unary operators after it.</p>
<p>These are the Ruby binary operators you can use:</p>
<p><kbd>**</kbd> <kbd>*</kbd> <kbd>/</kbd> <kbd>%</kbd> <kbd>+</kbd> <kbd>-</kbd> <kbd>&lt;&lt;</kbd> <kbd>&gt;&gt;</kbd> <kbd>&#38;</kbd> <kbd>|</kbd> <kbd>^</kbd> <kbd>&lt;=&gt;</kbd> <kbd>&gt;=</kbd> <kbd>&lt;=</kbd> <kbd>&lt;</kbd> <kbd>&gt;</kbd> <kbd>===</kbd> <kbd>==</kbd> <kbd>=~</kbd></p>
<p>And here are the unary operators: <kbd>-</kbd> <kbd>~</kbd> <kbd>+</kbd></p>
<p>The only operators you can&#8217;t use are the logical ones (e.g. &#38;&#38;, ||, !, and, or, not, etc.) Ruby offers no way of overloading these.</p>
<p>I&#8217;m releasing this into the wild to hopefully see what mischief it stirs. But take heed! Superators are second-class citizens still and are victims of vicious discrimination in certain circumstances. In the current implementation the second operand is <kbd>extend()</kbd>ed with a Ruby module (unobtrusively setting a flag for later inspection), therefore a Superator can only have a second operand capable of possessing its own eigenclass. <i>Superators will not work with second operands such as true, false, nil, Symbols or Fixnums</i> yet. I&#8217;m working on a branch that <i>could</i> fix this if my mad scientist lab experiments bear fruit (or a resentful monster whom I chase to the Arctic Circle after he destroys those I love). <a href="http://feeds.feedburner.com/jicksta">Stay tuned</a>.</p>
<p>Despite this limitation, Superators can still be used effectively! Use it when you expect the second operand to be an Array, String, Hash, Range, Regexp, Class, or whatever.</p>
<p>I should note that I strongly frown upon any use of Superators outside of the <span class="caps">DSL</span> space. Don&#8217;t use it in your company&#8217;s Rails app controllers. Use it in your tenderly crafted Ruby DSLs where they make sense.</p>
<p>Enjoy, comrades.</p>
<p><em>Update: There seems to be some confusion that Superators are a C extension that modify Ruby&#8217;s internals. A valid Superator is actually just valid Ruby&#8212;something we&#8217;ve had at our disposal this whole time!</em></p>
]]></content:encoded>
			<wfw:commentRss>http://jicksta.com/posts/superators-add-new-operators-to-ruby/feed</wfw:commentRss>
		<feedburner:origLink>http://jicksta.com/posts/superators-add-new-operators-to-ruby</feedburner:origLink></item>
	</channel>
</rss>
