<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>The Second Order Effect &#187; Tech Articles</title>
	<atom:link href="http://www.geekymedia.com/category/tech-articles/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.geekymedia.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Mon, 10 May 2010 01:47:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Getting chan_gtalk and res_jabber to work on AsteriskNOW 1.50</title>
		<link>http://www.geekymedia.com/tech-articles/getting-chan_gtalk-and-res_jabber-to-work-on-asterisknow-1-50/</link>
		<comments>http://www.geekymedia.com/tech-articles/getting-chan_gtalk-and-res_jabber-to-work-on-asterisknow-1-50/#comments</comments>
		<pubDate>Sat, 24 Apr 2010 03:42:27 +0000</pubDate>
		<dc:creator>Rizwan Kassim</dc:creator>
				<category><![CDATA[Tech Articles]]></category>

		<guid isPermaLink="false">http://www.geekymedia.com/?p=69</guid>
		<description><![CDATA[Some of my Asterisk servers (against all reason, it seems) are AsteriskNOW servers &#8211; which recently updated their asterisk16 branch to 1.6.2.6. chan_gtalk, and res_jabber &#8211; modules for installing Jabber and Gtalk access are missing. As I&#8217;ve learned, Asterisk Modules have to be built on the exact same platform/compile time switches as the asterisk executable, [...]]]></description>
			<content:encoded><![CDATA[<p>Some of my Asterisk servers (against all reason, it seems) are AsteriskNOW servers &#8211; which recently updated their asterisk16 branch to 1.6.2.6.</p>
<p>chan_gtalk, and res_jabber &#8211; modules for installing Jabber and Gtalk access are missing. As I&#8217;ve learned, Asterisk Modules have to be built on the exact same platform/compile time switches as the asterisk executable, so the only way I could get these modules was to recompile by source.</p>
<p>I had planned to ditch the AsteriskNOW packages, but I ended up modifying the packages to include these modules instead. These should install (somewhat seamlessly) over your current AsteriskNOW release. (The biggest issue is if you have other modules installed &#8211; they&#8217;ll have to be rebuilt. For Skype, install the -devel package, then rebuilt Skype from source direct from Digiums site.)</p>
<p>This repackage is a bit of a kludge, and will break ODBC or Speex.</p>
<p>Checkout my Repository &#8211; http://mirrors.geekymedia.com/centos/ &#8211; for the packages.</p>
<p>Below is a diff of the SPEC file. I told you it was kludgy.</p>

<div class="wp_syntax"><div class="code"><pre class="diff" style="font-family:monospace;"><span style="color: #440088;">19c19</span>
&amp;lt; %define arelease <span style="">1</span>_centos5 --- &amp;gt; %define arelease <span style="">2</span>_centos5
<span style="color: #440088;">23a24,28</span>
&amp;gt; # Disable non functioning modules for -<span style="">2</span> arch build
&amp;gt; %define _without_odbc <span style="">1</span>
&amp;gt; %define _without_speex <span style="">1</span>
&amp;gt;
&amp;gt;
<span style="color: #440088;">314a320,338</span>
&amp;gt; #  Chan Gtalk/Jabber subpackage
&amp;gt; #
&amp;gt; %<span style="">&#123;</span>?_without_gtalk:%if <span style="">0</span><span style="">&#125;</span>
&amp;gt; %<span style="">&#123;</span>!?_without_gtalk:%if <span style="">1</span><span style="">&#125;</span>
&amp;gt; %package gtalk
&amp;gt; Summary: Gtalk Jabber Channel module for Asterisk
&amp;gt; Group: Utilities/System
&amp;gt; Provides: asterisk-gtalk
&amp;gt; Provides: asterisk%<span style="">&#123;</span>astapi<span style="">&#125;</span>-gtalk
&amp;gt; BuildRequires: iksemel-devel
&amp;gt; Requires: iksemel
&amp;gt; Requires: %<span style="">&#123;</span>name<span style="">&#125;</span>-core = %<span style="">&#123;</span>actversion<span style="">&#125;</span>-%<span style="">&#123;</span>release<span style="">&#125;</span>
&amp;gt;
&amp;gt; %description gtalk
&amp;gt; Asterisk channel plugin for Google Talk, and res plugin for Jabber
&amp;gt; %endif
&amp;gt;
&amp;gt;
&amp;gt; #
<span style="color: #440088;">539a564</span>
&amp;gt; # from source/contrib/scripts
<span style="color: #440088;">1038a1064,1076</span>
&amp;gt; #  Chan Gtalk/Jabber subpackage
&amp;gt; #
&amp;gt; %<span style="">&#123;</span>?_without_gtalk:%if <span style="">0</span><span style="">&#125;</span>
&amp;gt; %<span style="">&#123;</span>!?_without_gtalk:%if <span style="">1</span><span style="">&#125;</span>
&amp;gt; %files gtalk
&amp;gt; %defattr<span style="">&#40;</span>-, root, root<span style="">&#41;</span>
&amp;gt; %<span style="">&#123;</span>_libdir<span style="">&#125;</span>/asterisk/modules/chan_console.so
&amp;gt; %<span style="">&#123;</span>_libdir<span style="">&#125;</span>/asterisk/modules/chan_gtalk.so
&amp;gt; %<span style="">&#123;</span>_libdir<span style="">&#125;</span>/asterisk/modules/chan_jingle.so
&amp;gt; %<span style="">&#123;</span>_libdir<span style="">&#125;</span>/asterisk/modules/res_jabber.so
&amp;gt; %endif
&amp;gt;
&amp;gt; #
<span style="color: #440088;">1120a1159,1168</span>
&amp;gt; * Fri Apr <span style="">23</span> <span style="">2010</span> Rizwan Kassim  - 1.6.2.6-<span style="">2</span>
&amp;gt; - Created additional package for Google Talk/Jabber client
&amp;gt; - Because these binaries don't match up with the Asterisk Released ones - will need to upgrade as many packages as possible
&amp;gt; - No spec file released for skype4asterisk, so just install manually form http://downloads.digium.com/pub/telephony/skypeforasterisk/asterisk-1.6.2.0/x86-<span style="">32</span>/ after asterisk-<span style="">16</span>-devel is updated.
&amp;gt; - Grep asterisk log for 'compile-time' for other possible module errors.
&amp;gt;
&amp;gt; * Thu Apr <span style="">13</span> <span style="">2010</span> Jason Parker  - 1.6.2.6-<span style="">1</span>
&amp;gt; - Update to 1.6.2.6
&amp;gt; - Assuming same details as in the past - Date is from SRPM http://packages.asterisk.org/centos/<span style="">5</span>/current/SRPMS/
&amp;gt;</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.geekymedia.com/tech-articles/getting-chan_gtalk-and-res_jabber-to-work-on-asterisknow-1-50/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RHEL5 / CentOS 5 Python 2.62 RPMs</title>
		<link>http://www.geekymedia.com/tech-articles/rhel5-centos-5-python-2-62-rpms/</link>
		<comments>http://www.geekymedia.com/tech-articles/rhel5-centos-5-python-2-62-rpms/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 02:53:34 +0000</pubDate>
		<dc:creator>Rizwan Kassim</dc:creator>
				<category><![CDATA[Tech Articles]]></category>

		<guid isPermaLink="false">http://www.geekymedia.com/?p=38</guid>
		<description><![CDATA[I created a repository at Geekymedia RPMs that contains : Bashton&#8217;s EL5 Python 2.5 My EL5 Python 2.6 Chris Lea&#8217;s EL5 Python 2.62 (http://yum.chrislea.com/centos/5/SRPMS/) Projects to do: Python 2.64 Asterisk 1.62 for AsteriskNOW! Download this repo file and place in /etc/yum.repos.d. Enjoy.]]></description>
			<content:encoded><![CDATA[<p>I created a repository at <a href="http://mirrors.geekymedia.com/centos/">Geekymedia RPMs</a> that contains :</p>
<p>Bashton&#8217;s EL5 Python 2.5<br />
My EL5 Python 2.6<br />
Chris Lea&#8217;s EL5 Python 2.62 (http://yum.chrislea.com/centos/5/SRPMS/)</p>
<p>Projects to do:<br />
Python 2.64<br />
Asterisk 1.62 for AsteriskNOW!</p>
<p>Download this <a href="http://mirrors.geekymedia.com/centos/geekymedia.repo">repo</a> file and place in /etc/yum.repos.d.</p>
<p>Enjoy.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekymedia.com/tech-articles/rhel5-centos-5-python-2-62-rpms/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>A few distractions&#8230; openwsman and SQL Server taming</title>
		<link>http://www.geekymedia.com/tech-articles/a-few-distractions-openwsman-and-sql-server-taming/</link>
		<comments>http://www.geekymedia.com/tech-articles/a-few-distractions-openwsman-and-sql-server-taming/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 04:51:19 +0000</pubDate>
		<dc:creator>Rizwan Kassim</dc:creator>
				<category><![CDATA[Tech Articles]]></category>

		<guid isPermaLink="false">http://www.geekymedia.com/?p=32</guid>
		<description><![CDATA[Tasks keeping me away from what I&#8217;d rather be doing this past few days : Did some updates on tardis, our general purpose linux server (all the servers have names from Dr. Who) &#8211; and updated the Dell OpenManage tools. Reboot. Simple, right? The machine responded to pings, and nothing else. It was 2pm. Traffic [...]]]></description>
			<content:encoded><![CDATA[<p>Tasks keeping me away from what I&#8217;d rather be doing this past few days :</p>
<p>Did some updates on tardis, our general purpose linux server (all the servers have names from Dr. Who) &#8211; and updated the Dell OpenManage tools. Reboot. Simple, right? </p>
<p>The machine responded to pings, and nothing else. </p>
<p>It was 2pm. Traffic in LA becomes a nightmare somewhere around 3:30pm. Jumped in the car to crash cart the server (because the tech on site didn&#8217;t know what a crash cart was and when I described it &#8211; said &#8216;that sounds complicated.&#8217; Not happy with our colo right now.)</p>
<p>Arrived to find the server paused &#8212; not hung, just waiting, on a &#8220;Starting openwsmand&#8230;&#8221; message. Turns out, there&#8217;s a new service in the latest version of OpenManage that requires a new OpenSSL certificate for functioning. This, on it&#8217;s own, is okay &#8211; but two problems :</p>
<ol>
<li>The cert is generated by the boottime init.d script if it&#8217;s missing.</li>
<li>The cert is generated using /dev/random as the entropy source</li>
</ol>
<p>The latter is a security concern, but should never be paired with the top. I&#8217;ve had servers hang for hours waiting for /dev/random to generate enough entropy. </p>
<p>This was easily enough fixed, but the stress of driving like a madman, (and back) to make it before traffic shut down all routes to West LA was something I could do without. I&#8217;m going to patch against the project and see if they&#8217;ll fix this ridiculous behavior, and I&#8217;ve started looking into a remote KVM solution like <a href="http://www.epiphan.com/products/frame-grabbers/kvm2ethernet/">kvm2ethernet</a> &#8211; just call the colo and ask them to plug into a particular server. Thanks to <a href="http://ckdake.com/content/2010/debugging-a-particular-failing-boot-service-on-linux.html">this post</a> for cutting the debugging time massively. </p>
<hr />
<p>The other issue was that customers weren&#8217;t able to sign up for bits of today because there was a lock residing on one of our DB tables. We purge our Database (about 50G) monthly, but the cruft of leftover billing records take up huge amounts of space and deleting them can be a problem &#8211; long table scans, and Microsoft SQL Server does a table lock &#8211; and that&#8217;s the ball game. The credit card server can&#8217;t track that a valid charge was placed, so it terminates instead. We started with a query from our Marketer/Data Analysis guy looking like :</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">DELETE</span> <span style="color: #993333; font-weight: bold;">FROM</span> billing <span style="color: #993333; font-weight: bold;">WHERE</span> 
			<span style="color: #993333; font-weight: bold;">AND</span> start_date_time <span style="color: #66cc66;">&gt;=</span> <span style="color: #ff0000;">'18-JUL-2009'</span> 
			<span style="color: #993333; font-weight: bold;">AND</span> start_date_time <span style="color: #66cc66;">&lt;</span> <span style="color: #ff0000;">'24-JUL-2009'</span>
			<span style="color: #993333; font-weight: bold;">AND</span> node_type <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>(He wanted to delete up until 30-AUG, but was slicing it up in the hopes of avoiding this problem.)</p>
<p>The above is about 300,000 rows. </p>
<p>A few issues, however :</p>
<ol>
<li>billing has a clustered index around account_id. This makes perfect sense, the data is almost always referenced with respect to a particular customer, and ensuring that those records are all adjacent to each other on storage is common sense. However, the above query would be running all around the 9Gb table removing rows.</li>
<li>billing doesn&#8217;t have an index on node_type, meaning each row has to be fetched before it can be selected for deletion. </li>
</ol>
<p>The latter is less of a problem if the select and the delete were separated, but the table lock existed throughout the query. </p>
<p>In looking to solve it, one approach was to force MSSQL to use ROWLOCK (and <a href="http://blogs.msdn.com/sqlserverstorageengine/archive/2006/05/17/Lock-escalation.aspx">disable escalation</a> from ROWLOCK to TABLELOCK), but this was going to be a performance hit. I considered trying NOLOCK, but I wasn&#8217;t sure of what the ramifications would be, and I really didn&#8217;t want to spend hours fixing a crash database/corrupted data.</p>
<p>The final solution was to carve up the deletes into more manageable bits. SQL Server Interactive can be set to execute on a limited number of rows &#8211; so we could delete, say, 1000 rows, pause (let other things have access to the table), and then continue. And, now that we know about the clustering, why make the DELETE run across the entire table &#8211; why not allow it to trim one section at a time? And thusly we have&#8230;<br />
(I&#8217;m not really familiar with SQL Server Syntax, so this is a first effort. It&#8217;s lousy code, but a decent query)</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
</pre></td><td class="code"><pre class="sql" style="font-family:monospace;">DECLARE @ACCOUNTSTEP int
DECLARE @WINDOWMIN int
DECLARE @WINDOWMAX int
DECLARE @ACCOUNTMAX int
DECLARE @WINDOWCOUNT int
DECLARE @STEPS int
&nbsp;
<span style="color: #993333; font-weight: bold;">SET</span> @STEPS <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">20</span>
&nbsp;
<span style="color: #993333; font-weight: bold;">SET</span> @ACCOUNTMAX <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span> max<span style="color: #66cc66;">&#40;</span>account_id<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">FROM</span> accounts<span style="color: #66cc66;">&#41;</span>
<span style="color: #993333; font-weight: bold;">SET</span> @ACCOUNTSTEP <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span>ceiling<span style="color: #66cc66;">&#40;</span>@ACCOUNTMAX <span style="color: #66cc66;">*</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">/</span>@STEPS<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #993333; font-weight: bold;">SET</span> @WINDOWMAX<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">0</span>
<span style="color: #993333; font-weight: bold;">SET</span> @WINDOWCOUNT<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">0</span>
PRINT CAST<span style="color: #66cc66;">&#40;</span>@STEPS <span style="color: #993333; font-weight: bold;">AS</span> CHAR<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">+</span> <span style="color: #ff0000;">'+1 Steps of Size '</span> <span style="color: #66cc66;">+</span> CAST<span style="color: #66cc66;">&#40;</span>@ACCOUNTSTEP <span style="color: #993333; font-weight: bold;">AS</span> CHAR<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">+</span> <span style="color: #ff0000;">' leading up to '</span> <span style="color: #66cc66;">+</span> CAST<span style="color: #66cc66;">&#40;</span>@ACCOUNTMAX <span style="color: #993333; font-weight: bold;">AS</span> CHAR<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #993333; font-weight: bold;">SET</span> ROWCOUNT <span style="color: #cc66cc;">2000</span>
&nbsp;
moreaccounts:
	<span style="color: #993333; font-weight: bold;">SET</span> @WINDOWCOUNT <span style="color: #66cc66;">=</span> @WINDOWCOUNT <span style="color: #66cc66;">+</span> <span style="color: #cc66cc;">1</span>
	<span style="color: #993333; font-weight: bold;">SET</span> @WINDOWMIN <span style="color: #66cc66;">=</span> @WINDOWMAX
	<span style="color: #993333; font-weight: bold;">SET</span> @WINDOWMAX <span style="color: #66cc66;">=</span> @ACCOUNTSTEP <span style="color: #66cc66;">*</span> @WINDOWCOUNT
	<span style="color: #993333; font-weight: bold;">IF</span> @WINDOWMIN <span style="color: #66cc66;">&gt;</span> @ACCOUNTMAX GOTO done
	PRINT <span style="color: #ff0000;">'Now processing accounts between '</span> <span style="color: #66cc66;">+</span> CAST<span style="color: #66cc66;">&#40;</span>@WINDOWMIN <span style="color: #993333; font-weight: bold;">AS</span> char<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">+</span> <span style="color: #ff0000;">' and '</span> <span style="color: #66cc66;">+</span> CAST<span style="color: #66cc66;">&#40;</span>@WINDOWMAX <span style="color: #993333; font-weight: bold;">AS</span> char<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
	deletemore:	
		PRINT <span style="color: #ff0000;">'Deleting 2000 rows.'</span>
		waitfor delay <span style="color: #ff0000;">'0:0:01'</span>
		<span style="color: #993333; font-weight: bold;">DELETE</span> <span style="color: #993333; font-weight: bold;">FROM</span> billing <span style="color: #993333; font-weight: bold;">WHERE</span> account_id <span style="color: #66cc66;">&gt;=</span> @WINDOWMIN <span style="color: #993333; font-weight: bold;">AND</span> account_id <span style="color: #66cc66;">&lt;</span> @WINDOWMAX 
			<span style="color: #993333; font-weight: bold;">AND</span> start_date_time <span style="color: #66cc66;">&gt;=</span> <span style="color: #ff0000;">'18-JUL-2009'</span> 
			<span style="color: #993333; font-weight: bold;">AND</span> start_date_time <span style="color: #66cc66;">&lt;</span> <span style="color: #ff0000;">'30-AUG-2009'</span>
			<span style="color: #993333; font-weight: bold;">AND</span> node_type <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span>
		<span style="color: #993333; font-weight: bold;">IF</span> @@ROWCOUNT <span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">0</span> GOTO deletemore
	PRINT <span style="color: #ff0000;">'Done with this set. Sleeping.'</span>
	waitfor delay <span style="color: #ff0000;">'0:0:03'</span>
	GOTO moreaccounts
done:</pre></td></tr></table></div>

<p>Which effectively breaks out to :</p>
<ul>
<li>Get the total number of accounts</li>
<li>For every twentieth window of accounts</li>
<ul>Delete 2000 rows. Wait a second. Repeat until all rows gone.</ul>
<li>Wait three seconds.</li>
</ul>
<p>Ran the query, no locking issues at all, Table purged in about an hour. Victory!</p>
<hr />
<p>I wanted to get Zabbix monitoring working for our Asterisk boxen &#8211; I went a bit overboard, and resulted in <a href="http://www.geekymedia.com/tech-articles/29/">zasterisk</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekymedia.com/tech-articles/a-few-distractions-openwsman-and-sql-server-taming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>zabbix-asterisk released.</title>
		<link>http://www.geekymedia.com/tech-articles/29/</link>
		<comments>http://www.geekymedia.com/tech-articles/29/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 04:12:13 +0000</pubDate>
		<dc:creator>Rizwan Kassim</dc:creator>
				<category><![CDATA[Tech Articles]]></category>

		<guid isPermaLink="false">http://www.geekymedia.com/?p=29</guid>
		<description><![CDATA[I whipped a script together that logs into the Asterisk AMI and returns some key Asterisk data for Zabbix, my favorite server management tool: Skype (Licenses,Calls) G729 (Licenses, Encoders,Decoders) Asterisk (Calls, Channels) This is all without the yucky launching of the asterisk CLI or dealing with sudoers. There&#8217;s a semaphore lock in place (making this [...]]]></description>
			<content:encoded><![CDATA[<p>I whipped a script together that logs into the Asterisk AMI and returns some key Asterisk data for <a href="http://www.zabbix.com">Zabbix</a>, my favorite server management tool:</p>
<p>Skype (Licenses,Calls)<br />
G729 (Licenses, Encoders,Decoders)<br />
Asterisk (Calls, Channels)</p>
<p>This is all without the yucky launching of the asterisk CLI or dealing with sudoers. There&#8217;s a semaphore lock in place (making this Linux/UNIX only for now) to prevent the AMI from being accessed by more than one check at a time.</p>
<p>Details are available here : <a href=" http://code.google.com/p/zabbix-asterisk/">Google Code for Zasterisk</a></p>
<p>As always, would love feedback, bug reports, patches, or suggestions for new features. It&#8217;s *very* raw, I&#8217;m just getting it out there to have it out there, but I know there&#8217;s stuff to clean up/fix. It&#8217;s missing an XML import file as well.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekymedia.com/tech-articles/29/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Replacing twisted if/else statements in Python&#8230;</title>
		<link>http://www.geekymedia.com/tech-articles/replacing-twisted-ifelse-statements-in-python/</link>
		<comments>http://www.geekymedia.com/tech-articles/replacing-twisted-ifelse-statements-in-python/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 03:02:36 +0000</pubDate>
		<dc:creator>Rizwan Kassim</dc:creator>
				<category><![CDATA[Tech Articles]]></category>

		<guid isPermaLink="false">http://www.geekymedia.com/?p=26</guid>
		<description><![CDATA[I&#8217;ve been having a growing love affair with Python for over a year, and now that I&#8217;ve got a few projects that I&#8217;m working on &#8211; I&#8217;m using Python as my primary language. I had a happy moment when refactoring a section of annoying if/then/else sections &#8230; if object.type == &#34;Vendor1&#34;: foo = Vendor1&#40;&#41; elif [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been having a growing love affair with Python for over a year, and now that I&#8217;ve got a few projects that I&#8217;m working on &#8211; I&#8217;m using Python as my primary language.</p>
<p>I had a happy moment when refactoring a section of annoying if/then/else sections &#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">object</span>.<span style="color: #008000;">type</span> == <span style="color: #483d8b;">&quot;Vendor1&quot;</span>:
    foo = Vendor1<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">elif</span> <span style="color: #008000;">object</span>.<span style="color: #008000;">type</span> == <span style="color: #483d8b;">&quot;Vendor2&quot;</span>:
    foo = Vendor2<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">elif</span> <span style="color: #008000;">object</span>.<span style="color: #008000;">type</span> == <span style="color: #483d8b;">&quot;Vendor3&quot;</span>:
    foo = Vendor3<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">else</span>:
    <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">Exception</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Not a handled type&quot;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Python is a functional language, and this means (among other things) that functions, classes, and all sorts of stuff can exist in dictionaries. So, instead, I can do</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">lookup = <span style="color: black;">&#123;</span> <span style="color: #483d8b;">&quot;Vendor1&quot;</span> =<span style="color: #66cc66;">&gt;</span> Vendor1, <span style="color: #483d8b;">&quot;Vendor2&quot;</span> =<span style="color: #66cc66;">&gt;</span> Vendor2, <span style="color: #483d8b;">&quot;Vendor3&quot;</span> =<span style="color: #66cc66;">&gt;</span> Vendor3<span style="color: black;">&#125;</span>
<span style="color: #ff7700;font-weight:bold;">try</span>:
    foo = lookup<span style="color: black;">&#91;</span><span style="color: #008000;">object</span>.<span style="color: #008000;">type</span><span style="color: black;">&#93;</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">KeyError</span>:
    <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">Exception</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Not a handled type&quot;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>It&#8217;s not a big thing, but it made me happy &#8212; and the example can be extended &#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">lookup = <span style="color: black;">&#123;</span> 
    <span style="color: #483d8b;">&quot;Vendor1&quot;</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: black;">&#123;</span> <span style="color: #483d8b;">&quot;url&quot;</span> =<span style="color: #66cc66;">&gt;</span> blah, <span style="color: #483d8b;">&quot;threads&quot;</span> =<span style="color: #66cc66;">&gt;</span><span style="color: #483d8b;">&quot;blah&quot;</span>, <span style="color: #483d8b;">&quot;obj&quot;</span> =<span style="color: #66cc66;">&gt;</span> Vendor1<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
lookup<span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;Vendor1&quot;</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;url&quot;</span><span style="color: black;">&#93;</span>
<span style="color: #808080; font-style: italic;">#equals blah</span></pre></div></div>

<p>Today, it&#8217;s all about the little things. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekymedia.com/tech-articles/replacing-twisted-ifelse-statements-in-python/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Fixing the front headphone jack on the Dell Dimension</title>
		<link>http://www.geekymedia.com/tech-articles/fixing-the-front-headphone-jack-on-the-dell-dimension/</link>
		<comments>http://www.geekymedia.com/tech-articles/fixing-the-front-headphone-jack-on-the-dell-dimension/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 21:16:00 +0000</pubDate>
		<dc:creator>Rizwan Kassim</dc:creator>
				<category><![CDATA[Tech Articles]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.geekymedia.com/?p=21</guid>
		<description><![CDATA[So, I&#8217;ve got a Dell Dimension 8400. One nice tidbit that they included was a front headphone plug that actually interrupts the speaker output; not a difficult thing to do, granted, but its nice. One thing that surprised me was that the Windows Startup sound WOULD be played out the main speakers no matter what [...]]]></description>
			<content:encoded><![CDATA[<p>So, I&#8217;ve got a Dell Dimension 8400. One nice tidbit that they included was a front headphone plug that actually interrupts the speaker output; not a difficult thing to do, granted, but its nice. One thing that surprised me was that the Windows Startup sound WOULD be played out the main speakers no matter what &#8212; making me realize that the interrupt was a software function, not a hardware switch.</p>
<p>Until it stopped working last week. Hours of time w/ Dell Support (which, by the way, seems to be outsourced to New Delhi and not a single person fully understood my problem), Dell forums and Google gave me little. The deal is, is that the Audigys normally come with a front panel with plugs; which isn&#8217;t available in the Dell world. And yet, it still uses that internal routing to handle the headphone plug.</p>
<p>So, has your headphone switch in stopped working? Reinstalling the Dell drivers does nothing. Google suggests that you turn on the setting in the AudioHQ control panel &#8212; but it isn&#8217;t there.<br />
<img class="alignnone size-full wp-image-23" title="dell_audigy" src="http://www.geekymedia.com/wordpress/wp-content/uploads/2009/11/dell_audigy.gif" alt="dell_audigy" width="843" height="416" /></p>
<p>Installing Creative&#8217;s stock drivers over your Dell drivers just gives me the shivers. Oh, and it doesn&#8217;t work. All I ended up doing was finding a driver package, say, for instance,<a style="font-family: verdana, arial, sans-serif; color: #003366;" href="http://www.google.com/search?sourceid=mozclient&amp;num=20&amp;ie=utf-8&amp;oe=utf-8&amp;q=SBA2_PCWDRV_LB_1_84_55-R1">SBA2_PCWDRV_LB_1_84_55-R1</a>. Extract the archive (run it and look in your temp directory while its running; or even better, just use WinRAR to extract it), and go to Drivers\WDM\Common\ and run CTPanel.exe. (Or just download my <a style="font-family: verdana, arial, sans-serif; color: #003366;" href="http://www.geekymedia.com/media/audigy_ctpanel.zip">copy</a>).</p>
<p>Run it, go to device settings, and voila! &#8220;Mute speakers upon Headphone Jack Detection.&#8221;</p>
<p><img class="alignnone size-full wp-image-22" title="creative_audigy" src="http://www.geekymedia.com/wordpress/wp-content/uploads/2009/11/creative_audigy.gif" alt="creative_audigy" width="601" height="556" /></p>
<p>That&#8217;s it!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekymedia.com/tech-articles/fixing-the-front-headphone-jack-on-the-dell-dimension/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>This American Life</title>
		<link>http://www.geekymedia.com/tech-articles/this-american-life/</link>
		<comments>http://www.geekymedia.com/tech-articles/this-american-life/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 20:56:50 +0000</pubDate>
		<dc:creator>Rizwan Kassim</dc:creator>
				<category><![CDATA[Tech Articles]]></category>

		<guid isPermaLink="false">http://www.geekymedia.com/?p=18</guid>
		<description><![CDATA[I used to host a large archive of &#8216;This American Life&#8217; in MP3 format before they had it available on their website as a podcast. I was contacted, quite politely, and asked to remove the files from access, and I complied. Go to TAL and stream down the eps or use the podcast.]]></description>
			<content:encoded><![CDATA[<p>I used to host a large archive of &#8216;This American Life&#8217; in MP3 format before they had it available on their website as a podcast.</p>
<p>I was contacted, quite politely, and asked to remove the files from access, and I complied. </p>
<p>Go to <a href="http://thislife.org">TAL</a> and stream down the eps or use the podcast.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekymedia.com/tech-articles/this-american-life/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP Serial Class for OSX</title>
		<link>http://www.geekymedia.com/tech-articles/php-serial-class-for-osx/</link>
		<comments>http://www.geekymedia.com/tech-articles/php-serial-class-for-osx/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 20:49:18 +0000</pubDate>
		<dc:creator>Rizwan Kassim</dc:creator>
				<category><![CDATA[Tech Articles]]></category>

		<guid isPermaLink="false">http://www.geekymedia.com/?p=13</guid>
		<description><![CDATA[Below is an archive of my PHP Serial Class page from my old site. The data below is still valid, but the project as a whole has been ported to Google Code. Check there for updates. Added support for OSX to RÃ©my Sanchez’s PHP Serial class. Original version Download php_serial.class.php.gz (3.7 kB) Description Gives serial [...]]]></description>
			<content:encoded><![CDATA[<p>Below is an archive of my PHP Serial Class page from my old site.</p>
<p>The data below is still valid, but the project as a whole has been ported to <a href="http://code.google.com/p/php-serial/">Google Code</a>. Check there for updates.</p>
<p>Added support for OSX to RÃ©my Sanchez’s PHP Serial class.</p>
<p><a href="http://www.phpclasses.org/browse/package/3679.html">Original version</a></p>
<h3>Download</h3>
<p><a href="http://www.geekymedia.com/php_serial.class.php.gz">php_serial.class.php.gz</a> (3.7 kB)</p>
<h3>Description</h3>
<p>Gives serial access to PHP under linux, OSX and Windows (write-only under Windows).</p>
<p>This class can be used to communicate with a serial port under Linux, OSX or<br />
Windows.</p>
<p>It takes the path (like &#8220;/dev/ttyS0&#8243; for linux or &#8220;COM1&#8243; for windows) of serial<br />
device and checks whether it is valid before opening a connection to it.</p>
<p>Once the connection is opened, it can send data to the serial port, and read<br />
answers (reading is only implemented for linux).</p>
<p>The class may also change connection parameters for the given serial<br />
device.</p>
<p>The example script:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">include</span> <span style="color: #0000ff;">&quot;php_serial.class.php&quot;</span><span style="color: #339933;">;</span> 
&nbsp;
<span style="color: #666666; font-style: italic;">// Let's start the class</span>
<span style="color: #000088;">$serial</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> phpSerial<span style="color: #339933;">;</span> 
&nbsp;
<span style="color: #666666; font-style: italic;">// First we must specify the device. This works on both linux and windows (if</span>
<span style="color: #666666; font-style: italic;">// your linux serial device is /dev/ttyS0 for COM1, etc)</span>
<span style="color: #000088;">$serial</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">deviceSet</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;COM1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
<span style="color: #666666; font-style: italic;">// Then we need to open it</span>
<span style="color: #000088;">$serial</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">deviceOpen</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
<span style="color: #666666; font-style: italic;">// To write into</span>
<span style="color: #000088;">$serial</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sendMessage</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Hello !&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
<span style="color: #666666; font-style: italic;">// Or to read from</span>
<span style="color: #000088;">$read</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$serial</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">readPort</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
<span style="color: #666666; font-style: italic;">// If you want to change the configuration, the device must be closed</span>
<span style="color: #000088;">$serial</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">deviceClose</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
<span style="color: #666666; font-style: italic;">// We can change the baud rate</span>
<span style="color: #000088;">$serial</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">confBaudRate</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2400</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
<span style="color: #666666; font-style: italic;">// etc...</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<h3>Changes in this version.</h3>
<p>List of Changes:</p>
<ul>
<li>Added OSX support</li>
</ul>
<h2>Copying</h2>
<p>Author Rémy Sanche</p>
<p>Thanks Aurélien Derouineau for finding how to open serial ports with<br />
windows</p>
<p>Thanks Alec Avedisyan for help and testing with reading</p>
<p>OSX tweaks added by Rizwan Kassim</p>
<p>copyright under GPL 2 licence</p>
<p>phpserial is free software; you can redistribute it and/or modify it under the terms of the<br />
<a href="http://www.gnu.org/licenses/gpl.html">GNU General Public License</a> as published by the Free Software Foundation;<br />
either version 2 of the License, or (at your option) any later version. For full license text see file <code class="fnm">COPYING</code> included in the source tarball.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekymedia.com/tech-articles/php-serial-class-for-osx/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>RHEL5 / CentOS5 RPMs for Python 2.5 and 2.6</title>
		<link>http://www.geekymedia.com/uncategorized/rhel5-centos5-rpms-for-python-2-5-and-2-6/</link>
		<comments>http://www.geekymedia.com/uncategorized/rhel5-centos5-rpms-for-python-2-5-and-2-6/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 20:06:07 +0000</pubDate>
		<dc:creator>Rizwan Kassim</dc:creator>
				<category><![CDATA[Tech Articles]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.geekymedia.com/?p=6</guid>
		<description><![CDATA[EDIT : Newer Instructions are here. this is a repost from my old site. I&#8217;ve created RPMs for RHEL 5.0, 5.1, 5.2 and 5.3, as well as CentOS 5.0, 5.1 and 5.2 for Python 2.5 and 2.6. The RHEL/CentOS line only supports Python 2.4, and as it&#8217;s an integral part of yum and many other [...]]]></description>
			<content:encoded><![CDATA[<p>EDIT : Newer Instructions are <a href="http://www.geekymedia.com/uncategorized/rhel5-centos-5-python-2-62-rpms/">here</a>.</p>
<p>this is a repost from my old site.</p>
<p>I&#8217;ve created RPMs for RHEL 5.0, 5.1, 5.2 and 5.3, as well as CentOS 5.0, 5.1 and 5.2 for Python 2.5 and 2.6.</p>
<p>The RHEL/CentOS line only supports Python 2.4, and as it&#8217;s an integral part of yum and many other packages, any installation of new Pythons will require parallel installation.</p>
<p>(Note : Currently, the 2.5 and 2.6 RPMs cannot both be installed without an RPM &#8211;force)</p>
<p>TODO : <a href="http://mirrors.geekymedia.com/centos/">Repository</a> URL &amp; GPG signing</p>
<p>As for the RPMs themselves :</p>
<h2>Download</h2>
<ul>
<li>Python 2.6 &#8211; Built from Fedora Core 11 Alpha
<ul>
<li><a href="http://mirrors.geekymedia.com/centos/python26-2.6-geekymedia1.i386.rpm">python26-2.6-geekymedia1.i386.rpm</a></li>
<li><a href="http://mirrors.geekymedia.com/centos/python26-debuginfo-2.6-geekymedia1.i386.rpm">python26-debuginfo-2.6-geekymedia1.i386.rpm</a></li>
<li><a href="http://mirrors.geekymedia.com/centos/python26-devel-2.6-geekymedia1.i386.rpm">python26-devel-2.6-geekymedia1.i386.rpm</a></li>
<li><a href="http://mirrors.geekymedia.com/centos/python26-libs-2.6-geekymedia1.i386.rpm">python26-libs-2.6-geekymedia1.i386.rpm</a></li>
<li><a href="http://mirrors.geekymedia.com/centos/python26-test-2.6-geekymedia1.i386.rpm">python26-test-2.6-geekymedia1.i386.rpm</a></li>
<li><a href="http://mirrors.geekymedia.com/centos/python26-tools-2.6-geekymedia1.i386.rpm">python26-tools-2.6-geekymedia1.i386.rpm</a></li>
<li><a href="http://mirrors.geekymedia.com/centos/tkinter26-2.6-geekymedia1.i386.rpm">tkinter26-2.6-geekymedia1.i386.rpm</a></li>
<li><a href="http://mirrors.geekymedia.com/centos/python26-2.6-geekymedia1.src.rpm">python26-2.6-geekymedia1.src.rpm</a></li>
</ul>
</li>
<li>Python 2.51 &#8211; Built from Fedora Core 10 (by <a href="http://blog.bashton.com/2008/python-25-rpms-for-rhel-5-centos-5/">Bashton</a>)
<ul>
<li><a href="http://mirrors.geekymedia.com/centos/python25-2.5.1-bashton1.i386.rpm">python25-2.5.1-bashton1.i386.rpm</a></li>
<li><a href="http://mirrors.geekymedia.com/centos/python25-debuginfo-2.5.1-bashton1.i386.rpm">python25-debuginfo-2.5.1-bashton1.i386.rpm</a></li>
<li><a href="http://mirrors.geekymedia.com/centos/python25-devel-2.5.1-bashton1.i386.rpm">python25-devel-2.5.1-bashton1.i386.rpm</a></li>
<li><a href="http://mirrors.geekymedia.com/centos/python25-libs-2.5.1-bashton1.i386.rpm">python25-libs-2.5.1-bashton1.i386.rpm</a></li>
<li><a href="http://mirrors.geekymedia.com/centos/python25-test-2.5.1-bashton1.i386.rpm">python25-test-2.5.1-bashton1.i386.rpm</a></li>
<li><a href="http://mirrors.geekymedia.com/centos/python25-tools-2.5.1-bashton1.i386.rpm">python25-tools-2.5.1-bashton1.i386.rpm</a></li>
<li><a href="http://mirrors.geekymedia.com/centos/tkinter25-2.5.1-bashton1.i386.rpm">tkinter25-2.5.1-bashton1.i386.rpm</a></li>
<li><a href="http://mirrors.geekymedia.com/centos/python25-2.5.1-bashton1.src.rpm">python25-2.5.1-bashton1.src.rpm</a></li>
</ul>
</li>
</ul>
<h2>Caveats</h2>
<p>Neither of these packages fully pass the Python test suite (<em>import test.autotest</em>).</p>
<p>That being said, we&#8217;ve been using the Python 2.5 package, released by Bashton, in production for a while now, and we haven&#8217;t seen any problems.</p>
<p><strong>4 tests failed: test_distutils test_email test_email_renamed test_nis</strong></p>
<p>I don&#8217;t know about email, but there are patches for CentOS/Fedora against distutils, so I expect that&#8217;s why it fails the test.</p>
<p>For Python 2.6, note the following :</p>
<ul>
<li>I had to gimp autoconf&#8217;s version detection to force it to use 2.59. This may have unintended consequences</li>
<li>This RPM uses patches from the Fedora Core 11 Alpha <a href="http://koji.fedoraproject.org/koji/packageinfo?packageID=130">release</a>. (python-2.6-4.fc11 specifically). As Fedora updates this package, I&#8217;ll release updates. (Feel free to email <script src="http://www.geekymedia.com/email.js" type="text/javascript"></script>to remind.)</li>
</ul>
<h2>Usage</h2>
<p>Just install the RPMs for the version that you want. You&#8217;ll need at least the base python version package and the libs package.<br />
To start Python 2.6, type python26 at your commandline rather than python. (Your original Python 2.4 is still installed.)<br />
If you&#8217;re installing packages with setuptools, make sure to use the correct python version. (i.e. python26 setup.py install)<br />
If you&#8217;d like to build an x86_64, call <em>rpmbuild &#8211;rebuild</em> with the appropriate arch setting.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekymedia.com/uncategorized/rhel5-centos5-rpms-for-python-2-5-and-2-6/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
