<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
    <title>Goozbach's tech tips</title>
    <link rel="alternate" type="text/html" href="http://blog.friocorte.com/" />
    
    <id>tag:blog.friocorte.com,2007-12-22://1</id>
    <updated>2009-03-29T16:12:41Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Open Source 4.1-en-release-26-r1120-20071221</generator>

<link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><meta xmlns="http://pipes.yahoo.com" name="pipes" content="noprocess" /><link rel="self" href="http://feeds.feedburner.com/goozbachs_tech_tips-all" type="application/atom+xml" /><entry>
    <title>Movable Type dynamic pages</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/goozbachs_tech_tips-all/~3/1OdPTlJW7v0/movable-type-dynamic-pages.html" />
    <id>tag:blog.friocorte.com,2009://1.68</id>

    <published>2009-03-29T16:10:00Z</published>
    <updated>2009-03-29T16:12:41Z</updated>

    <summary>Keeping my site up to date I was having trouble keeping my Projects and Presentation pages up to date. I was always creating new projects, and presentation materials, however I always forgot to update the corresponding pages in Movable Type....</summary>
    <author>
        <name>goozbach</name>
        
    </author>
    
        <category term="openclue" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="personal" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="presentations" label="presentations" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="projects" label="projects" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="site" label="site" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.friocorte.com/">
        &lt;h1&gt;Keeping my site up to date&lt;/h1&gt;

&lt;p&gt;I was having trouble keeping my &lt;a href="/projects/"&gt;Projects&lt;/a&gt; and &lt;a href="/presentation/"&gt;Presentation&lt;/a&gt; pages up to date. I was always creating new projects, and presentation materials, however I always forgot to update the corresponding pages in Movable Type.  I decided to make it easier to keep those pages updated.&lt;/p&gt;

&lt;p&gt;The system I use is based on &lt;a href="http://httpd.apache.org/docs/2.2/mod/mod_include.html"&gt;Mod_Include&lt;/a&gt;, &lt;a href="http://fletcherpenney.net/multimarkdown/"&gt;MultiMarkdown&lt;/a&gt; and &lt;a href="http://www.movabletype.org/"&gt;Movable Type&lt;/a&gt;.&lt;/p&gt;

        &lt;h1&gt;Enabling per-directory Server-Side Includes&lt;/h1&gt;

&lt;p&gt;The first step in this process is to enable server side includes.  You can make it so &lt;em&gt;EVERY&lt;/em&gt; &lt;code&gt;.html&lt;/code&gt; page is parsed for SSI, but that can be a resource drain and cause slow page delivery times.  I chose to enable SSI for all &lt;code&gt;.shtml&lt;/code&gt; files in just two separate directories on my site.&lt;/p&gt;

&lt;h1&gt;Apache Config -- Enable SSI&lt;/h1&gt;

&lt;p&gt;The Apache configuration I use on my site is pretty simple. Here's how I enabled SSI on my &lt;code&gt;/projects/&lt;/code&gt; directory:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    &amp;lt;location /projects/&amp;gt;
        Options +Includes
        AddType text/html .shtml
        AddOutputFilter INCLUDES .shtml
        XBitHack Full
    &amp;lt;/location&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h1&gt;Filesystem tweaks&lt;/h1&gt;

&lt;p&gt;In order to make Movable Type "create" &lt;code&gt;.shtml&lt;/code&gt; files I cheated. I just created symlinks from the &lt;code&gt;index.html&lt;/code&gt; file to &lt;code&gt;index.shtml&lt;/code&gt; in each location I wanted my SSI to work.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    cd /var/www/blog/projects/
    ln -s index.html index.shtml
&lt;/code&gt;&lt;/pre&gt;

&lt;h1&gt;Apache Config -- Rewrite Fun&lt;/h1&gt;

&lt;p&gt;To make the request &lt;em&gt;ALWAYS&lt;/em&gt; use the &lt;code&gt;.shtml&lt;/code&gt; file I created a simple rewrite rule which invisbly proxied the requests for &lt;code&gt;/&lt;/code&gt; and &lt;code&gt;index.html&lt;/code&gt; to the proper &lt;code&gt;index.shtml&lt;/code&gt; file.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    RewriteEngine On
    # rewrite rule which makes /projects/index.html SSI enabled
    RewriteRule ^/projects/index.html  /projects/index.shtml [P,L]
    RewriteRule ^/projects/$  /projects/index.shtml [P,L]
&lt;/code&gt;&lt;/pre&gt;

&lt;h1&gt;Create your include&lt;/h1&gt;

&lt;p&gt;The next step is to actually create an include file which will be what is used when the SSI directive is parsed. As I'm trying to include the contents of a completely different &lt;a href="http://projects.friocorte.com/projects/"&gt;site&lt;/a&gt; (projects.friocorte.com VS blog.friocorte.com) I used &lt;code&gt;wget&lt;/code&gt; to fetch a copy of that page locally. I did this with a cronjob so the include is always up to date.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    0 0 * * * wget -q -O /var/www/html/blog/projects/projects-include.html http://projects.friocorte.com/projects/
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Movable Type page contents&lt;/h2&gt;

&lt;p&gt;The last step is to actually create an SSI directive in your Movable Type page. Here's the contents of my projects page:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    &amp;lt;p style="margin-top: 0px;"&amp;gt;As an opensource advocate I use, and suggest that others use opensource projects.&amp;lt;br /&amp;gt;
    Here are a few of my open source projects:
    &amp;lt;!--#include virtual="projects-include.html" --&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That's all there is to it. Now I have a site which keeps up with my projects, and my presentations automatically.&lt;/p&gt;

        
    &lt;img src="http://feeds.feedburner.com/~r/goozbachs_tech_tips-all/~4/1OdPTlJW7v0" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.friocorte.com/2009/03/movable-type-dynamic-pages.html</feedburner:origLink></entry>

<entry>
    <title>Cobbler Presentation and re-vamped pages.</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/goozbachs_tech_tips-all/~3/sXKQW1007_I/cobbler-presentation-and-revam.html" />
    <id>tag:blog.friocorte.com,2009://1.67</id>

    <published>2009-03-28T00:13:15Z</published>
    <updated>2009-03-28T00:21:21Z</updated>

    <summary>Cobbler presentation I've finally posted the first draft of my cobbler presentation materials. I'm not done with them, as I need to finish my remote-control system to do some screencasts. You can find the materials here. Re-vamped pages on my...</summary>
    <author>
        <name>goozbach</name>
        
    </author>
    
        <category term="openclue" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="personal" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="presentationssite" label="presentations site" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.friocorte.com/">
        &lt;h1&gt;Cobbler presentation&lt;/h1&gt;

&lt;p&gt;I've finally posted the first draft of my cobbler presentation materials.  I'm not done with them, as I need to finish my remote-control system to do some screencasts. You can find the materials &lt;a href="http://blog.friocorte.com/presentation-storage/cobbler/"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;Re-vamped pages on my site&lt;/h1&gt;

&lt;p&gt;Speaking of presentations, I've re-vamped some of the pages on this site.  The two I've updated are the &lt;a href="/presentation/"&gt;Presentations&lt;/a&gt; and &lt;a href="/projects/"&gt;Projects&lt;/a&gt; pages.  These pages were long neglected, and weren't updated as new projects or presentation materials were made available. Now these pages will no longer get out of date as I've made them automatically update as new projects or presentation materials are posted.  Watch for a forthcoming blog post about how to accomplish the same thing with your own Movable Type installation.&lt;/p&gt;

&lt;p&gt;Until next time. &lt;/p&gt;

&lt;p&gt;--
Goozbach&lt;/p&gt;

        

        
    &lt;img src="http://feeds.feedburner.com/~r/goozbachs_tech_tips-all/~4/sXKQW1007_I" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.friocorte.com/2009/03/cobbler-presentation-and-revam.html</feedburner:origLink></entry>

<entry>
    <title>Cookie lumps.</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/goozbachs_tech_tips-all/~3/fS8joT7GWYU/cookie-lumps.html" />
    <id>tag:blog.friocorte.com,2008://1.66</id>

    <published>2008-10-11T23:54:29Z</published>
    <updated>2008-10-14T15:51:49Z</updated>

    <summary>A chocolate chip cookie recipe Inspired by the likes of Joseph Hall and Alton Brown. I have spend the last few years working on a chocolate chip cookie recipe. People have been asking about how I make these cookies for...</summary>
    <author>
        <name>goozbach</name>
        
    </author>
    
        <category term="openclue" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="personal" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blog.friocorte.com/">
        &lt;h1&gt;A chocolate chip cookie recipe&lt;/h1&gt;

&lt;p&gt;Inspired by the likes of &lt;a href="http://blog.josephhall.com/2006/11/chocolate-chip-cookies.html"&gt;Joseph&lt;/a&gt; &lt;a href="http://blog.josephhall.com/2006/11/chocolate-chip-cookies-part-2.html"&gt;Hall&lt;/a&gt; and &lt;a href="http://www.foodnetwork.com/recipes/alton-brown/the-chewy-recipe/index.html"&gt;Alton&lt;/a&gt; &lt;a href="http://www.goodeatsfanpage.com/Season3/Cookie/CookieTranscript.htm"&gt;Brown&lt;/a&gt;. I have spend the last few years working on a chocolate chip cookie recipe.  People have been asking about how I make these cookies for a long while. To respond to all of them, I'm going to post my recipe and methods here.&lt;/p&gt;

        &lt;p&gt;While I do follow most of the guidelines of the above mentioned recipes. I'm not going to delve into what all of the terms mean. Read those links above and thereby learn how to do what I mention here. &lt;/p&gt;

&lt;h1&gt;The Stars (ingredients)&lt;/h1&gt;

&lt;h2&gt;The Dry&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;2 1/2 to 3 cups Bread flour&lt;/li&gt;
&lt;li&gt;1 tsp baking soda&lt;/li&gt;
&lt;li&gt;1 tsp salt&lt;/li&gt;
&lt;li&gt;2 cups semi-sweet chocolate chips&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;The Wet&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;1 stick (1 cup) butter flavour shortening&lt;/li&gt;
&lt;li&gt;2 large whole chicken eggs&lt;/li&gt;
&lt;li&gt;1 Tbsp Vanilla Extract&lt;/li&gt;
&lt;li&gt;1 Tbsp honey&lt;/li&gt;
&lt;li&gt;1 1/2 cups dark brown sugar (packed)&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Getting Started&lt;/h1&gt;

&lt;p&gt;Cream together the shortening and brown sugar, scraping the mixing bowl down a couple of times.  Take your time doing this.&lt;/p&gt;

&lt;p&gt;Add the eggs, one at a time. Scraping the sides after each one. Mix well.&lt;/p&gt;

&lt;p&gt;Add the honey and vanilla.&lt;/p&gt;

&lt;p&gt;Set this mixture aside.&lt;/p&gt;

&lt;h1&gt;Setting up the Dry&lt;/h1&gt;

&lt;p&gt;Sift together the flour, salt, and baking soda.  Do a good job here as the better it's mixed prior to being combined with the wet, the better the cookie is afterwords. I like to use a wire colander and a wire whisk.&lt;/p&gt;

&lt;h1&gt;Combining&lt;/h1&gt;

&lt;p&gt;Slowly add the dry ingredients into the wet, one half-cup at a time. Pause after each cup of flour and scrape down the sides of your bowl (seeing a pattern yet?).  I add just enough flour until the mixture pulls away from the sides of the mixing bowl and starts to form up.  I like a fairly dry dough.  Mix in the chocolate chips.&lt;/p&gt;

&lt;h1&gt;Portioning&lt;/h1&gt;

&lt;p&gt;Prepare a half baking sheet by lining it with parchment paper. Using a &lt;a href="http://www.thekitchenbox.com/view/product/7X4W-4X592846/_30_Disher.html"&gt;# 30 disher&lt;/a&gt;, not a spoon, form balls approx 1.5 inches in diameter and lay them all together on the baking sheet.  Freeze these cookie "lumps" solid(1 hour minimum). &lt;/p&gt;

&lt;h1&gt;Baking&lt;/h1&gt;

&lt;p&gt;Preheat your oven to 350&amp;deg; F. Place 6-9 frozen cookies onto a parchment lined baking sheet and bake from 10-12 minutes, until the tops of your cookies start to dry out and turn darker brown.  Immediately remove the cookies from the sheet to a cooling rack upon removing them from the oven. &lt;/p&gt;

&lt;p&gt;ENJOY!&lt;/p&gt;

&lt;h1&gt;The reasoning&lt;/h1&gt;

&lt;p&gt;If you've followed Alton Brown's show, or spent any time talking to any cookie fanatic, you'll notice that this recipe is pretty close to the Toll House one.  I've made a few adjustments. Here's the reasoning behind them.&lt;/p&gt;

&lt;h2&gt;Pure brown sugar and honey&lt;/h2&gt;

&lt;p&gt;I went with 100% pure brown sugar to up the molasses content of the cookie. Molasses helps keep your cookies moist. Honey is hygroscopic as well. This was a change I made for a chewier cookie which stayed moist for as long as possible.&lt;/p&gt;

&lt;h2&gt;Bread flour&lt;/h2&gt;

&lt;p&gt;Bread flour contains the proteins needed to develop gluten. Gluten helps make a baked good chewy.  By using 100% bread flour, and working the dough quite a bit(all the pausing and scraping, and mixing). You add a good deal of gluten.&lt;/p&gt;

&lt;h2&gt;Shortening vs butter&lt;/h2&gt;

&lt;p&gt;I decided to use shortening in my cookie because I like my cookies to not spread out very much. Shortening has a much higher melting point which allows the cookie to rise a bit before it finishes baking.&lt;/p&gt;

&lt;h2&gt;Freezing the partitioned dough&lt;/h2&gt;

&lt;p&gt;Freezing the dough solid also helps keep the cookie from spreading too much. If you partition the dough into balls prior to freezing it allows you to bake just the right amount of cookies. Frozen dough will keep for weeks in an airtight container in the freezer.&lt;/p&gt;

&lt;p&gt;I hope you enjoy these cookies.&lt;/p&gt;

        
    &lt;img src="http://feeds.feedburner.com/~r/goozbachs_tech_tips-all/~4/fS8joT7GWYU" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.friocorte.com/2008/10/cookie-lumps.html</feedburner:origLink></entry>

<entry>
    <title>MultiMarkdown Apache handler.</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/goozbachs_tech_tips-all/~3/2s3nWqxh7V4/multimarkdown-apache-handler.html" />
    <id>tag:blog.friocorte.com,2008://1.65</id>

    <published>2008-08-12T02:09:33Z</published>
    <updated>2008-08-12T03:07:46Z</updated>

    <summary>The "What?" and the "Why?" I've been a fan of the MultiMarkdown for quite a while now. I keep all of my important notes in this format, which is easy to write with just a simple text editor. I wanted...</summary>
    <author>
        <name>goozbach</name>
        
    </author>
    
        <category term="openclue" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="personal" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blog.friocorte.com/">
        &lt;h1&gt;The "What?" and the "Why?"&lt;/h1&gt;

&lt;p&gt;I've been a fan of the &lt;a href="http://fletcherpenney.net/multimarkdown/"&gt;MultiMarkdown&lt;/a&gt; for quite a while now. I keep all of my important notes in this format, which is easy to write with just a simple text editor.&lt;/p&gt;

&lt;p&gt;I wanted to be able to copy or sync my *.mark files to my web server and have them automatically be rendered as XHTML.  I looked into a couple of ways of doing this. One of which is the &lt;a href="http://search.cpan.org/~kulp/Text-MultiMarkdown-ApacheHandler-0.01/lib/Text/MultiMarkdown/ApacheHandler.pm"&gt;Text::MultiMarkdown::ApacheHandler&lt;/a&gt; Perl module Apache handler.   The downside is that this handler doesn't work out of the box in Apache2.2.&lt;/p&gt;

&lt;p&gt;Read on to see my solution.
I've also seen a cgi based apache handler done by &lt;a href="http://twitter.com/reppep"&gt;reppep&lt;/a&gt; as chronicled &lt;a href="http://www.extrapepperoni.com/2007/05/24/markdowncgi-using- markdown-in-apache-httpd/"&gt;here&lt;/a&gt;. The only problem is that he's using the original &lt;a href="http://daringfireball.net/projects/markdown/"&gt;Markdown&lt;/a&gt;. I've long been a fan of the extended syntax, and output formats I can get from MultiMarkdown. So I've build a similar script to what reppep has done.&lt;/p&gt;

        &lt;h1&gt;The "How?"&lt;/h1&gt;

&lt;h2&gt;Prereqs.&lt;/h2&gt;

&lt;p&gt;You'll need at least these Perl modules installed on your system.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;File::Slurp&lt;/li&gt;
&lt;li&gt;CGI&lt;/li&gt;
&lt;li&gt;Text::MultiMarkdown&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You'll also need Apache and mod_cgi installed.&lt;/p&gt;

&lt;h2&gt;The script&lt;/h2&gt;

&lt;p&gt;The CGI script I use is pretty straightforward. Here it is in it's entirety:&lt;/p&gt;

&lt;pre&gt;
&lt;code&gt;
#!/usr/bin/perl
use warnings;
use strict;
use CGI qw/:standard/;
use Text::MultiMarkdown qw/markdown/;
use File::Slurp qw/slurp/;

my $file = $ENV{PATH_TRANSLATED};
my $text = slurp($file);
my $mark;
if (param('_text')) {
  print header('text/plain');
  print $text;
} else {
  print header;
  $text .= "\n\n[See the Source](?_text=1)\n\n";
  if (param('_partial')) {
    ##TODO test for Format: complete header and warn
    my @lines = split /\n/, $text;
    if (@lines = grep (!/^([Ff][Oo][Rr][Mm][Aa][Tt]):\s*(.*)$/, @lines)) {
       print "&amp;lt;h4&amp;gt;Overriding metadata to generate partial XHTML&amp;lt;/h4&amp;gt;\n";
    }
    $text = join("\n",@lines);
    $mark = markdown($text);
  } else {
    $mark = markdown($text, {
      document_format =&gt; 'complete'
      }
    );
  }
  print $mark;
}
__END__

=head1 Name

multmd.pl

=head1 DESCRIPTION

A simple cgi script which is used as an action handler for the Apache HTTP
Server.

=head1 USAGE

Place this file into your cgi-bin directory and add a stanza like this to
/etc/httpd/conf/httpd.conf

    Action markdown /cgi-bin/multimd.pl
    AddHandler markdown .mark
    AddType text/html .mark

Now any MultiMarkdown file you serve which has the extenstion .mark will
automatically get rendered as xhtml.

This script will honor all of the metadata you place in your markdown file
with the exception of the Format: header which is always assumed to be 
complete

=head1 OVERRIDES

You can override the default actions of this script by passing some
parameters encoded into the URL.

=head2 TEXT

Pass a parameter of _text=1 to get the raw MultiMarkdown file.

    http://example.com/foo.mark?_text=1

=head2 PARTIAL

To override the default action of rendering an entire XHTML file, pass a
parameter of _partial=1 to get just the partial XHTML.

    http://example.com/foo.mark?_partial=1

This will override any Format: headers in your source MultiMarkdown file.
And the default format of the handler (which is complete).
&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;Place this script into your cgi-bin directory and make sure it's executable by your web server's process. I named mine &lt;code&gt;multimd.pl&lt;/code&gt;.  Here's a &lt;a href="http://blog.friocorte.com/2008/08/11/multimd.pl"&gt;downloadable link of multimd.pl&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;The config&lt;/h2&gt;

&lt;p&gt;To make your new script do exactly what you want it to (render *.mark files as XHTML to the browser), you'll need to modify your Apache config. I placed this config section into a file named &lt;a href="/2008/08/11/mulitmarkdown.conf"&gt;&lt;code&gt;/etc/httpd/conf.d/multimarkdown.conf&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;
Action markdown /cgi-bin/multimd.pl
AddHandler markdown .mark
AddType text/html .mark
&lt;/pre&gt;

&lt;h2&gt;Testing&lt;/h2&gt;

&lt;p&gt;Make sure your Apache configs are proper by running the command &lt;code&gt;apachectl configtest&lt;/code&gt;. If all checks ok, you should be good to restart your Apache server, upload a MultiMarkdown-formatted file to your web server with the extension of *.mark, and see it rendered in it's full XHTML glory.&lt;/p&gt;

&lt;p&gt;You can see examples of how this MultiMarkdown handler works by clicking on the links below.&lt;/p&gt;

&lt;p&gt;&lt;a href="/presentation-storage/presentation/index.mark"&gt;Presentation on presentations&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="/presentation-storage/presentation/README.2008-04-17.mark"&gt;After action report from my presentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you have probably noticed, there is a "See the source" link on each rendered page. This is part of the CGI script I created. Add the parameter _text=1 to the url and the handler passes the MultiMarkdown source file straight to the client without any rendering, &lt;a href="/presentation-storage/presentation/README.2008-04-17.mark?_text=1"&gt;like so&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I hope you enjoy the simplicity of editing decent web documents in a simple format.&lt;/p&gt;

&lt;p&gt;Next time I'll share how I keep all of my files in sync using Bazaar-ng and bzr-push-and-update.&lt;/p&gt;

        
    &lt;img src="http://feeds.feedburner.com/~r/goozbachs_tech_tips-all/~4/2s3nWqxh7V4" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.friocorte.com/2008/08/multimarkdown-apache-handler.html</feedburner:origLink></entry>

<entry>
    <title>Everybody Should go to UTOSC -- 2008</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/goozbachs_tech_tips-all/~3/8t9f2iGqWxY/everybody-should-go-to-utosc-2.html" />
    <id>tag:blog.friocorte.com,2008://1.64</id>

    <published>2008-07-31T21:15:29Z</published>
    <updated>2008-07-31T21:20:38Z</updated>

    <summary>This year I'm not going to be able to make it to the Utah Open Source Conference. This makes me sad. So to get everyone excited. I'm FINALLY blogging about the videos which were taken of my presentation at last...</summary>
    <author>
        <name>goozbach</name>
        
    </author>
    
        <category term="neverblock" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="openclue" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="utoscneverblockpresentations" label="utosc neverblock presentations" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.friocorte.com/">
        &lt;p&gt;This year I'm not going to be able to make it to the &lt;a href="http://2008.utosc.com/pages/home/"&gt;Utah Open Source Conference&lt;/a&gt;. This makes me sad.  So to get everyone excited. I'm FINALLY blogging about the videos which were taken of my presentation at last year's event.&lt;/p&gt;

&lt;p&gt;You can watch an interview which I gave for OpensourceTV here:&lt;/p&gt;

&lt;p&gt;&lt;object width="425" height="349"&gt;&lt;param name="movie" value="http://www.youtube.com/v/6BsUMuBmnQY&amp;amp;hl=en&amp;amp;fs=1&amp;amp;color1=0x234900&amp;amp;color2=0x4e9e00&amp;amp;border=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/6BsUMuBmnQY&amp;amp;hl=en&amp;amp;fs=1&amp;amp;color1=0x234900&amp;amp;color2=0x4e9e00&amp;amp;border=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="349"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;

&lt;p&gt;The first part of my presentation on Virtualization here:&lt;/p&gt;

&lt;p&gt;&lt;object width="425" height="349"&gt;&lt;param name="movie" value="http://www.youtube.com/v/7MONsLw77jU&amp;amp;hl=en&amp;amp;fs=1&amp;amp;color1=0x234900&amp;amp;color2=0x4e9e00&amp;amp;border=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/7MONsLw77jU&amp;amp;hl=en&amp;amp;fs=1&amp;amp;color1=0x234900&amp;amp;color2=0x4e9e00&amp;amp;border=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="349"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;

&lt;p&gt;and the second part here:&lt;/p&gt;

&lt;p&gt;&lt;object width="425" height="349"&gt;&lt;param name="movie" value="http://www.youtube.com/v/6sE11vzVEv4&amp;amp;hl=en&amp;amp;fs=1&amp;amp;color1=0x234900&amp;amp;color2=0x4e9e00&amp;amp;border=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/6sE11vzVEv4&amp;amp;hl=en&amp;amp;fs=1&amp;amp;color1=0x234900&amp;amp;color2=0x4e9e00&amp;amp;border=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="349"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;

        

        
    &lt;img src="http://feeds.feedburner.com/~r/goozbachs_tech_tips-all/~4/8t9f2iGqWxY" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.friocorte.com/2008/07/everybody-should-go-to-utosc-2.html</feedburner:origLink></entry>

<entry>
    <title>Powerful Presentations</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/goozbachs_tech_tips-all/~3/6HIz7h8Y36k/powerful-presentations.html" />
    <id>tag:blog.friocorte.com,2008://1.61</id>

    <published>2008-04-16T04:53:05Z</published>
    <updated>2008-04-16T05:02:02Z</updated>

    <summary>I'm doing a presentation for ALE Central this Thursday Here's the blurb In our professional lives we often spend a great deal of time in one sort of presentation or another. A PowerPoint slide show for work, a story to...</summary>
    <author>
        <name>goozbach</name>
        
    </author>
    
        <category term="neverblock" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="openclue" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blog.friocorte.com/">
        &lt;h2&gt;I'm doing a presentation for ALE Central this Thursday&lt;/h2&gt;

&lt;h3&gt;Here's the blurb&lt;/h3&gt;

&lt;p&gt;In our professional lives we often spend  a great deal of time in one sort of presentation or another.
A PowerPoint slide show for work, a story to our children at bedtime, "selling" your boss on your next big idea,
or simply "selling" yourself as an entrepreneur.&lt;/p&gt;

&lt;p&gt;A properly created presentation can be extremely powerful. It can mean the difference between getting that new
contract with the Johnson firm and spending the next four months trying to find new customers. Perhaps your sub-par
presentation is all that's keeping your small business from catching the eye of some big venture capital firm.&lt;/p&gt;

&lt;p&gt;Presentations are a big part of being involved in the Open Source movement. Conferences, user group meetings, etc.
Being a proponent of open source gives us quite a few opportunities to present.&lt;/p&gt;

&lt;p&gt;Come an learn how a proper presentation is more than "not putting everybody to sleep". We will cover everything from
preparation to handouts, PowerPoint decks to no slides whatsoever, handing "that guy in the second row" to "Wowing the
room. You might even learn what a "bathroom review" is.&lt;/p&gt;

&lt;p&gt;I promise you won't be disappointed. &lt;/p&gt;

&lt;h3&gt;And here's the important stuff&lt;/h3&gt;

&lt;h4&gt;Date and Time&lt;/h4&gt;

&lt;p&gt;Thurs April 17th 7:30pm to ~9:30pm&lt;/p&gt;

&lt;h4&gt;Location&lt;/h4&gt;

&lt;p&gt;Gambrell Hall Classroom 1C&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.ale.org/new/directions-to-ale-central/"&gt;Emory University School of Law&lt;/a&gt; &lt;br /&gt;
1301 Clifton Road &lt;br /&gt;
Atlanta, GA 30322&lt;/p&gt;

        

        
    &lt;img src="http://feeds.feedburner.com/~r/goozbachs_tech_tips-all/~4/6HIz7h8Y36k" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.friocorte.com/2008/04/powerful-presentations.html</feedburner:origLink></entry>

<entry>
    <title>Great Quote -- Sir Ken Robinson</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/goozbachs_tech_tips-all/~3/MjsenzjwVBg/great-quote-sir-ken-robinson.html" />
    <id>tag:blog.friocorte.com,2008://1.59</id>

    <published>2008-03-03T16:57:20Z</published>
    <updated>2008-03-03T19:04:31Z</updated>

    <summary>I had a great idea I've been a big fan of the TED talks for a while now and listening to them just inspired me to do something new. Every so often I will post to this blog one of...</summary>
    <author>
        <name>goozbach</name>
        
    </author>
    
        <category term="openclue" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="personal" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="greatquote" label="GreatQuote" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ted" label="TED" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.friocorte.com/">
        &lt;h1&gt;I had a great idea&lt;/h1&gt;

&lt;p&gt;I've been a big fan of the &lt;a href="http://www.ted.com/index.php/"&gt;TED&lt;/a&gt; talks for a while now and listening to them just inspired me to do something new.&lt;/p&gt;

&lt;p&gt;Every so often I will post to this blog one of the great quotes I've stumbled across during my day.&lt;/p&gt;

&lt;h1&gt;Sir Ken Robinson on creativity&lt;/h1&gt;

&lt;p&gt;Taken from his &lt;a href="http://blog.ted.com/2006/06/sir_ken_robinso.php"&gt;TED Talk&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If you are not prepared to be wrong; you'll never come up with anything original&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hope you enjoy this new feature of my blog.&lt;/p&gt;

&lt;p&gt;EDIT: 2008-03-03 14:00&lt;/p&gt;

&lt;p&gt;Fixed my links. Sorry&lt;/p&gt;

        

        
    &lt;img src="http://feeds.feedburner.com/~r/goozbachs_tech_tips-all/~4/MjsenzjwVBg" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.friocorte.com/2008/03/great-quote-sir-ken-robinson.html</feedburner:origLink></entry>

<entry>
    <title>Good "Hack Music"?</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/goozbachs_tech_tips-all/~3/a58HT3czU90/good-hack-music.html" />
    <id>tag:blog.friocorte.com,2008://1.58</id>

    <published>2008-02-27T18:29:30Z</published>
    <updated>2008-02-27T19:39:11Z</updated>

    <summary>I work in an office with four other people. This is a good thing when it comes to communicating and working together. However it can be a bit detrimental when it comes to entering into "The Zone". To combat this,...</summary>
    <author>
        <name>goozbach</name>
        
    </author>
    
        <category term="openclue" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="personal" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="musicwork" label="music work" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.friocorte.com/">
        &lt;p&gt;I work in an office with four other people.  This is a good thing when it comes to communicating and working together. However it can be a bit detrimental when it comes to entering into "The Zone". &lt;/p&gt;

&lt;p&gt;To combat this, I've been listening to music through headphones... There is a bit of a problem with the solution I have noticed, not all music is conducive to entering "the zone".&lt;/p&gt;

&lt;p&gt;Here's a list of artists whom I've decided are great for "Hack Music". Artists whose music is great for reducing ambient noise, while not distracting you too much.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Muse&lt;/li&gt;
&lt;li&gt;Blue Man Group&lt;/li&gt;
&lt;li&gt;Thievery Corporation&lt;/li&gt;
&lt;li&gt;MC 900ft Jesus&lt;/li&gt;
&lt;li&gt;Daft Punk&lt;/li&gt;
&lt;li&gt;Basement Jaxx&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What is your favorite "hack music"?  Post a comment and we'll make a big list for everyone's enjoyment.  &lt;/p&gt;

        

        
    &lt;img src="http://feeds.feedburner.com/~r/goozbachs_tech_tips-all/~4/a58HT3czU90" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.friocorte.com/2008/02/good-hack-music.html</feedburner:origLink></entry>

<entry>
    <title>Thoughts while working with a Cisco switch</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/goozbachs_tech_tips-all/~3/OxkD9YA__Yg/thoughts-while-working-with-a.html" />
    <id>tag:blog.friocorte.com,2008://1.56</id>

    <published>2008-02-05T19:51:53Z</published>
    <updated>2008-03-11T19:04:39Z</updated>

    <summary>I've just racked and installed my newest toy at the datacenter: a Cisco Catalyst 4948 switch . Prior to working here I have never had the experience of working with a Cisco switch other than to plug myself into it...</summary>
    <author>
        <name>goozbach</name>
        
    </author>
    
        <category term="neverblock" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="openclue" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blog.friocorte.com/">
        &lt;p&gt;I've just racked and installed my newest toy at the datacenter: a &lt;a href="http://www.cisco.com/en/US/prod/collateral/switches/ps5718/ps6021/product_data_sheet0900aecd8017a72e.html"&gt; Cisco Catalyst 4948 switch &lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Prior to working here I have never had the experience of working with a Cisco switch other than to plug myself into it and run on the network it provides.&lt;/p&gt;

&lt;p&gt;I'm keeping this log to document how I've set up my switch.&lt;/p&gt;

&lt;p&gt;Let's start out with what I've done up to this point.&lt;/p&gt;

        &lt;p&gt;I have unpacked, racked, connected power to, connected to the serial port and booted/powered on my new switch.&lt;/p&gt;

&lt;p&gt;In order to do this I've needed the following pre-requsites.&lt;/p&gt;

&lt;h2&gt;Pre Reqs&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;cisco switch&lt;/li&gt;
&lt;li&gt;console cable&lt;/li&gt;
&lt;li&gt;USB serial cable adapter&lt;/li&gt;
&lt;li&gt;minicom&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;First Time Configuration&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;You need to configure your terminal emulator of choice (I've chosen minicom) to listen with the following settings:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Machine-generated file - use "minicom -s" to change parameters.
pu port             /dev/ttyUSB0
pu baudrate         9600
pu bits             8
pu parity           N
pu stopbits         1
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure your switch's serial cable is plugged in to the console port on the switch, and into your laptop/desktop.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;Make sure you have your terminal emulator running.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Power on your switch.  You will see a great deal of text fly by on your terminal, you will have to wait for a few minutes as your switch does a power-on self test. Once the switch has finished booting and running its POST you should see some text like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Press RETURN to get started!
00:00:01: %C4K_IOSSYS-3-BLANKSTARTUPCONFIG: Blank or invalid startup-config, bos
00:00:16: %SPANTREE-5-EXTENDED_SYSID: Extended SysId enabled for type vlan
00:00:17: %C4K_IOSMODPORTMAN-6-MODULEONLINE: Module 1 (WS-C4948 S/N: FOX11440P2e
00:00:37: %SYS-5-RESTART: System restarted --
Cisco IOS Software, Catalyst 4000 L3 Switch Software (cat4000-I5S-M), Version 1)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2007 by Cisco Systems, Inc.
Compiled Thu 25-Oct-07 16:46 by kellythw
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;At this point your switch should be ready for your initial setup.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Press &lt;em&gt;ENTER&lt;/em&gt; to enable your switch's console. You should see a prompt like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Would you like to terminate autoinstall? [yes]:
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Press &lt;em&gt;ENTER&lt;/em&gt; again to terminate the autoinstall and bring up your command line interface (CLI)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This is your CLI:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Switch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Enter the command &lt;code&gt;enable&lt;/code&gt; to put the CLI into privileged mode. Your prompt should change like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Switch&amp;gt;enable
Switch#
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You may have to enter a password, if so, the default password is: &lt;code&gt;password&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The next step is to set the clock, which is done with the &lt;code&gt;clock set&lt;/code&gt; command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Switch#clock set 20:27:00 5 Feb 2008
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;you can check if your clock setting was successful by running the &lt;code&gt;show clock&lt;/code&gt; command: &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Switch#show clock
20:28:32.551 UTC Tue Feb 5 2008
Switch#
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You will want to give your switch a hostname do this with the &lt;code&gt;hostname&lt;/code&gt; command. The &lt;code&gt;hostname&lt;/code&gt; command only works in the configuration system.  Enter the configuration system by using the &lt;code&gt;configure&lt;/code&gt; command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Switch#configure terminal
Enter configuration commands, one per line.  End with CNTL/Z.
Switch(config)#
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Set the hostname:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Switch(config)#hostname gigswitch-02
gigswitch-02(config)#
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Your switch has two passwords, one for secure administration and one for clear text. you need to set them by using the &lt;code&gt;enable secret&lt;/code&gt; and &lt;code&gt;enable password&lt;/code&gt; commands:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gigswitch-02(config)#enable secret supersecretpasswd
gigswitch-02(config)#enable password notsosecretpasswd
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unless you want to always configure your switch using the serial cable, you'll want to create a management port on the switch. This port is usually the highest-numbered port on the switch. On my switch it is port 48. You change the network settings on a switch port using the &lt;code&gt;interface&lt;/code&gt; command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gigswitch-02(config)#interface gigabitEthernet1/48
gigswitch-02(config-if)#no switchport
gigswitch-02(config-if)#no shutdown
gigswitch-02(config-if)#ip address 10.0.0.42 255.255.255.0
gigswitch-02(config-if)#exit
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You are now done with the basic configuration. You'll want to exit configuration mode, check your settings, then apply them.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gigswitch-02(config)#exit
gigswitch-02#
01:07:06: %SYS-5-CONFIG_I: Configured from console by console
gigswitch-02#
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Check your settings using &lt;code&gt;show run&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gigswitch-02#show run
. . . &amp;lt;snip&amp;gt; . . .
line vty 0 4
!
!
end
gigswitch-02#
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Apply your settings using the &lt;code&gt;copy&lt;/code&gt; command&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gigswitch-02&amp;gt;copy system:running-config nvram:startup-config
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your switch is now ready to go.&lt;/p&gt;

&lt;h2&gt;Enabling ports 47 and 48&lt;/h2&gt;

&lt;p&gt;On my switch,  the copper Ethernet ports 47 and 48 are shared with the fiber-optic Base-X ports,  I purchased my switch without any fiber modules, therefore I want to enable the copper ports instead. I do this by changing the media type.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Begin by making sure you are logged into your switch, and have enabled privileged mode:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gigswitch-02&amp;gt;enable
Password: &amp;lt;enter your secret password here&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter configuration mode:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gigswitch-02#configure terminal
Enter configuration commands, one per line.  End with CNTL/Z.
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter the configuration mode for the interface you want to change:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gigswitch-02(config)#interface gigabitEthernet1/47
gigswitch-02(config-if)#
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change the media type&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gigswitch-02(config-if)#media-type rj45
01:46:59: %C4K_IOSINTF-5-RJ45ACTIVE: Slot= 1 Port= 47:  RJ45 connector has become active
gigswitch-02(config-if)#exit
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Repeat the last step for port 48.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Exit configure mode and save your changes.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gigswitch-02(config)#exit
01:49:17: %SYS-5-CONFIG_I: Configured from console by console
gigswitch-02#copy system:running-config nvram:startup-config
Destination filename [startup-config]?&amp;lt;enter&amp;gt;
Building configuration...
Compressed configuration from 2334 bytes to 1013 bytes[OK]
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Congratulations your switch is now configured, and all 48 ports are active.&lt;/p&gt;

        
    &lt;img src="http://feeds.feedburner.com/~r/goozbachs_tech_tips-all/~4/OxkD9YA__Yg" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.friocorte.com/2008/02/thoughts-while-working-with-a.html</feedburner:origLink></entry>

<entry>
    <title>Using Virt-clone</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/goozbachs_tech_tips-all/~3/hDhJUuUkqMw/using-virtclone.html" />
    <id>tag:blog.friocorte.com,2008://1.54</id>

    <published>2008-01-24T21:38:09Z</published>
    <updated>2008-01-24T21:40:52Z</updated>

    <summary><![CDATA[Using the libvirt tool virt-clone is pretty simple to make a new guest image.virt-clone -o ORIGINAL_GUEST -n NEW_GUEST_NAME -f /new/guest/disk/fileThere's not much more to it.&nbsp; Virt-clone takes care of all the unique stuff (uuid, mac address, etc)....]]></summary>
    <author>
        <name>goozbach</name>
        
    </author>
    
        <category term="neverblock" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="openclue" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="virtxen" label="virt xen" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.friocorte.com/">
        Using the libvirt tool virt-clone is pretty simple to make a new guest image.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;virt-clone -o ORIGINAL_GUEST -n NEW_GUEST_NAME -f /new/guest/disk/file&lt;br /&gt;&lt;/blockquote&gt;There's not much more to it.&amp;nbsp; Virt-clone takes care of all the unique stuff (uuid, mac address, etc).&lt;br /&gt; 
        
        
    &lt;img src="http://feeds.feedburner.com/~r/goozbachs_tech_tips-all/~4/hDhJUuUkqMw" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.friocorte.com/2008/01/using-virtclone.html</feedburner:origLink></entry>

<entry>
    <title>I am a genious (SIC) </title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/goozbachs_tech_tips-all/~3/dpCkiwyujMM/i-am-a-genious-sic.html" />
    <id>tag:new.friocorte.com,2008:/blog//1.52</id>

    <published>2008-01-07T23:54:10Z</published>
    <updated>2008-01-08T00:06:22Z</updated>

    <summary>I have two Debian servers, One is the old one, running on hardware that dell is no longer supporting (without us shelling out again) in a couple months. The other -- the new one-- is a virtual instance I have...</summary>
    <author>
        <name>goozbach</name>
        
    </author>
    
        <category term="neverblock" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="openclue" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blog.friocorte.com/">
        I have two Debian servers, One is the old one, running on hardware that dell is no longer supporting (without us shelling out again) in a couple months. The other -- the new one-- is a virtual instance I have just installed on top of Citrix XenServer. Both are running Debian 4.0 "Etch".&amp;nbsp; &lt;br /&gt;&lt;br /&gt;The application we have running on the old server has quite a few dependencies, and the Operating system hasn't been re-installed in quite some time. As a matter of fact, it is running an image which was based off an image which was based off an image.&amp;nbsp; In other words, I needed a quick and dirty way of installing all the packages which are needed on the new server, without using the old image.&lt;br /&gt;&lt;br /&gt;Here's what I did:&lt;br /&gt;&lt;br /&gt;First, on both servers I made a list of the packages which were installed. I did this by running the command:&lt;br /&gt;&lt;blockquote&gt;root@oldhost # dpkg -l &amp;gt; packages.old&lt;br /&gt;&lt;/blockquote&gt;and on the new server:&lt;br /&gt;&lt;blockquote&gt;root@newserver # dpkg -l &amp;gt; packages.new&lt;br /&gt;&lt;/blockquote&gt;I then combined the lists using text tools such as 'cat' 'sort' 'uniq' etc...&lt;br /&gt;Then I used vimdiff to find the differences between the two servers and make choices as to which packages I wanted installed.&amp;nbsp; All in all I ended up with a third list which was my cleaned list of packages.&lt;br /&gt;&lt;br /&gt;After copying the clean list to the new server, I ran this command:&lt;br /&gt;&lt;blockquote&gt;perl-01:/tmp# for i in `cat packages.final` ; do dpkg -l $i &amp;amp;&amp;gt;/dev/null &amp;amp;&amp;amp; echo "found package: $i, doing nothing" || apt-get install $i; done&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;This command will install a package if it's not currently on the system, and output "found package $foo, doing nothing" if it is already installed. You have only to sit at the prompt and answer any of the dpkg-configure questions which may pop up.&lt;br /&gt;&lt;br /&gt;Cool, no?&lt;br /&gt;
        
        
    &lt;img src="http://feeds.feedburner.com/~r/goozbachs_tech_tips-all/~4/dpCkiwyujMM" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.friocorte.com/2008/01/i-am-a-genious-sic.html</feedburner:origLink></entry>

<entry>
    <title>my dream home</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/goozbachs_tech_tips-all/~3/mjEdFaPM6-A/my-dream-home.html" />
    <id>tag:new.friocorte.com,2007:/blog//1.51</id>

    <published>2007-10-01T14:12:25Z</published>
    <updated>2008-01-05T04:55:11Z</updated>

    <summary>I was reading on of my favorite web comics this morning and found this gem: Your home is a Futuristic Headquarters Your kitchen consists of dilithium-powered food replicators, manned by obedient robot slaves, who are sure to never, ever rebel....</summary>
    <author>
        <name>goozbach</name>
        
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blog.friocorte.com/">
        &lt;p&gt;I was reading on of my favorite &lt;a href="http://www.schlockmercenary.com/"&gt;web comic&lt;/a&gt;s this morning and found this gem:&lt;/p&gt;

&lt;p&gt;&lt;BR&gt;&lt;BR&gt;&lt;table width=450 style='font-family:Arial; font-size:12px; background-color:#fff; border: solid 1px #000000; color:#000000' align=center cellpadding=0&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;center&gt;Your home is a &lt;h1&gt;Futuristic  Headquarters&lt;/h1&gt;&lt;/center&gt;                     &lt;table width=440 cellpadding=5 cellspacing=0 style='font-family:Arial; font-size:12px; background-color:#fff; color:#000000'&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt; Your kitchen consists of dilithium-powered food replicators, manned by obedient robot slaves, who are sure to never, ever rebel. I mean, it's preposterous to even consider it. There's a pantry stocked with beef jerky. Oh, and deer jerky. Your master bedroom has an on-call masseuse and sports therapist. Your study This includes all Star Wars novels cross-referenced by incongruities. One of your garages contains a life-sized X-Wing fighter, and KITT. (KITT was a gift from a well-meaning uncle.) &lt;br /&gt;&lt;br /&gt;Your home also includes a robot repair bay, where your mechanized servants are routinely fitted with new restraining bolts. (It's just a precaution.) Your guests enjoy your animatronic replica of the cantina at Mos Eisley. Outside is your radio telescope, listening constantly for alien transmissions. Especially invaders. They'll come eventually, even if nobody believes you. (Nobody does.)&lt;br /&gt;&lt;br /&gt;Below is a snippet of the blueprints:                     &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;img src='http://www.directhomefind.com/dream-home/images/image.php?topleft=locker_golf&amp;amp;topright=paintball_course&amp;amp;middleright=ai_lab&amp;amp;bottomright=theater2&amp;amp;bottomleft=garage_xwing'&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=center&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href='http://www.directhomefind.com/dream-home' target=_new&gt;Find YOUR Dream Home!&lt;/a&gt;
                        &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;

        

        
    &lt;img src="http://feeds.feedburner.com/~r/goozbachs_tech_tips-all/~4/mjEdFaPM6-A" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.friocorte.com/2007/10/my-dream-home.html</feedburner:origLink></entry>

<entry>
    <title>IRC’ing the night away</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/goozbachs_tech_tips-all/~3/gCRP5yqMP4Q/ircing-the-night-away.html" />
    <id>tag:new.friocorte.com,2007:/blog//1.50</id>

    <published>2007-09-29T02:22:18Z</published>
    <updated>2008-01-05T04:55:11Z</updated>

    <summary>IRC is a "chat" protocol which is fairly popular with the open source crowd. Most of the time getting an answer over IRC can be quicker and less painful than searching the internet, or posting to a mailing list, newsgroup,...</summary>
    <author>
        <name>goozbach</name>
        
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blog.friocorte.com/">
        &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Internet_Relay_Chat"&gt;IRC&lt;/a&gt; is a "chat" protocol which is fairly popular with the open source crowd.  Most of the time getting an answer over IRC can be quicker and less painful than searching the internet, or posting to a mailing list, newsgroup, or forum.&lt;/p&gt;

&lt;p&gt;Because IRC is such a ubiquitous communication channel, it is extremely useful for maintaining contact with others.  Often the creator of an open source project will create an IRC channel to facilitate communication with the users of his or her software.  I plan on showing you all how to safely create just such a channel.&lt;/p&gt;

&lt;p&gt;My example makes a couple of assumptions:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;IRC client knowledge&lt;/li&gt;
    &lt;li&gt;Connection to the &lt;a href="http://freenode.net/"&gt;Freenode&lt;/a&gt; network&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's create a new channel for our fictional open source project -- GreatProject.&lt;/p&gt;

&lt;p&gt;First, we need to make sure we have a registered nickname I won't go into great detail about this but you need to run a command like this one:&lt;/p&gt;

&lt;blockquote&gt;[freenode] /msg nickserv identify supersecretpassword&lt;/blockquote&gt;

&lt;p&gt;You should see output like this in your client:&lt;/p&gt;

&lt;blockquote&gt;20:59 -NickServ(NickServ@services.)- Password accepted - you are now recognized&lt;/blockquote&gt;

&lt;p&gt;To learn more about the NickServ service, and about registering your nickname visit the Freenode FAQ page about &lt;a href="http://freenode.net/faq.shtml#nicksetup"&gt;setting up your nick&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You need to first create your new channel, on Freenode at least this is as easy as joining your channel:&lt;/p&gt;

&lt;blockquote&gt;[freenode] /join #greatproject&lt;/blockquote&gt;

&lt;p&gt;That command should create the following output:&lt;/p&gt;

&lt;blockquote&gt;21:34 -!- friocorte [n=dcarter@dsl027-165-128.atl1.dsl.speakeasy.net] has joined #greatproject
21:34 -!- ServerMode/#greatproject [+ns] by niven.freenode.net
21:34 [Users #greatproject]
21:34 [@friocorte] 
21:34 -!- Irssi: #greatproject: Total of 1 nicks [1 ops, 0 halfops, 0 voices, 0 normal]
21:34 -!- Channel #greatproject created Fri Sep 28 21:38:21 2007
21:34 -!- Irssi: Join to #greatproject was synced in 0 secs&lt;/blockquote&gt;

&lt;p&gt;Now you should register your channel:&lt;/p&gt;

&lt;blockquote&gt;[freenode] /msg chanserv register #greatproject supersecretpasswordtwo&lt;/blockquote&gt;

&lt;p&gt;Here's what you should see:&lt;/p&gt;

&lt;blockquote&gt;21:57 -ChanServ(ChanServ@services.)- The channel [#greatproject] is now registered under your nickname.
21:57 -ChanServ(ChanServ@services.)- Your channel password is [supersecretpasswordtwo].  Please remember it for later use.
21:57 -ChanServ(ChanServ@services.)- Channel guidelines can be found on the freenode website
21:57 -ChanServ(ChanServ@services.)- (http://freenode.net/channel_guidelines.shtml).
21:57 -ChanServ(ChanServ@services.)- freenode is a service of Peer-Directed Projects Center, an IRS 501(c)(3)
21:57 -ChanServ(ChanServ@services.)- (tax-exempt) charitable and educational organization.&lt;/blockquote&gt;

&lt;p&gt;Don't forget your password, you'll need it to make any future sessions.&lt;/p&gt;

&lt;p&gt;Tomorrow, we'll show you how to control your channel and the users who will connect to it. So stay tuned.&lt;/p&gt;

        

        
    &lt;img src="http://feeds.feedburner.com/~r/goozbachs_tech_tips-all/~4/gCRP5yqMP4Q" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.friocorte.com/2007/09/ircing-the-night-away.html</feedburner:origLink></entry>

<entry>
    <title>Asterisk Queues REDUX</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/goozbachs_tech_tips-all/~3/Hv7gz9m3miU/asterisk-queues-redux.html" />
    <id>tag:new.friocorte.com,2007:/blog//1.38</id>

    <published>2007-05-10T21:54:48Z</published>
    <updated>2008-01-05T04:55:11Z</updated>

    <summary>I love tinkering with stuff. But sometimes it takes me too long to get something to work like it want it to. We bit off a little more than we could chew with this current Asterisk dialplan. I've solved most...</summary>
    <author>
        <name>goozbach</name>
        
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blog.friocorte.com/">
        &lt;p&gt;I love tinkering with stuff.

But sometimes it takes me too long to get something to work like it want it to.

We bit off a little more than we could chew with this current Asterisk dialplan. I've solved most of these problems as best I know how.

Here are the requirements (as far as I understand them):
&lt;/p&gt;

&lt;div class="list"&gt;
&lt;ul&gt;
    &lt;li&gt;Calls from queues should be distributed as fairly as possible&lt;/li&gt;
    &lt;li&gt;Calls from queues should cascade out to as many avalible agents as possible&lt;/li&gt;
    &lt;li&gt;Agents should be able to log into their assigned queues from any phone&lt;/li&gt;
    &lt;li&gt;Agents should be able to log into, and manage calls from multiple queues&lt;/li&gt;
    &lt;li&gt;Agent phones should only receive one call at a time from any of the queues they have logged into&lt;/li&gt;
    &lt;li&gt;Agent phones should be reachable via direct dialing, even when handling a call from a queue&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;
Let's look at each of these items one at a time:
&lt;/p&gt;

&lt;h4&gt;Calls from queues should be distributed as fairly as possible&lt;/h4&gt;

&lt;p&gt;The goal here is to give every agent at least a chance to answer a call if the agent before him/her doesn't.  You might think that the answer is to do round-robin queueing, however that is incorrect, as the first agent will always get the first call after a lull of calling. We chose to use &lt;strong&gt;rrmemory&lt;/strong&gt; queueing which is round robin with memory. Each time a call starts going around round robin, the system remembers where it last sent a call, and picks up from there the next time around.&lt;/p&gt;

&lt;h4&gt;Calls from queues should cascade out to as many avalible agents as possible&lt;/h4&gt;
&lt;p&gt;Originally in Asterisk the queues wouldn't send a call to another available agent until the first call had been picked up. To make a queue act more like a "queue should work" enable the option &lt;strong&gt;autofill=yes&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Here is a sample of my &lt;em&gt;queues.conf&lt;/em&gt; file:&lt;/p&gt;
&lt;blockquote&gt;
[general]
persistentmembers=yes              ; store agent login in astdb
autofill=yes                       ; automaticlly dial as many agents as there are phone calls
memberdelay=0                      ; how long to wait until the agent is connected to the caller
announce-frequency=90              ; how often do we announce "you are # in line"
periodic-announce-frequency=30     ; how often do we announce "your call is really important to us"
announce-holdtime=yes              ; announce hold time to caller
announce-round-seconds=10          ; do we round seconds?
joinempty=yes                      ; allow people into a queue when there are no agents?
reportholdtime=no                  ; tell agent how long the caller was holding
ringinuse=no                       ; do we ring a extension which is 'in use'?
retry=0                            ; how long to wait until we re-ring the queue with the call (after a deny or busy etc?)
timeout=20                         ; how long to ring the agent before trying someone else
wrapuptime=5                       ; how long to wait after the call is completed (allows agent to clean up ticket, etc)

[pineapple]
strategy=rrmemory

[1]
strategy=rrmemory
reportholdtime=yes

[2]
strategy=rrmemory
reportholdtime=yes

[3]
strategy=rrmemory
timeout=20
retry=15
joinempty=no
&lt;/blockquote&gt;

&lt;h4&gt;Agents should be able to log into their assigned queues from any phone&lt;/h4&gt;
&lt;p&gt;
To accomplish the truly mobile workforce we want, our agents need to be able to accept calls from various queues wherever they may be.  We've solved this problem by using strictly dynamic queue agents. This means we don't pre-define agents in &lt;em&gt;agents.conf&lt;/em&gt;.  An example of the function to log agents in and out of a queue will be provided below.
&lt;/p&gt;

&lt;h4&gt;Agents should be able to log into, and manage calls from multiple queues&lt;/h4&gt;

&lt;p&gt;We have need for persons sitting at the phones to be able to handle incoming calls from multiple queues. They need to be able to selectively log into and out of multiple queues easily.&lt;/p&gt;
&lt;p&gt;Here is the sample of the queue login logout function&lt;/p&gt;
&lt;blockquote&gt;
[macro-queueloginout]
; first argument is the queue to be added to, second(not yet implemented) is penality
exten =&gt; s,1,Answer()                                                           ; Pick up the phone
exten =&gt; s,n,Set(MYNUMB=${CUT(CHANNEL,-,1)})                                    ; clean up the channel name (remove unique id)
exten =&gt; s,n,Set(MYNUMBCLEAN=${CUT(MYNUMB,/,2)})                                ; clean up the channel name (remove technology)
exten =&gt; s,n,Verbose(99|mynumb is ${MYNUMB}  mynumbclean is ${MYNUMBCLEAN})     ; debugging output to see if VARS got set correctly
exten =&gt; s,n,Set(OUR_QM_LIST=${QUEUE_MEMBER_LIST(${ARG1})})                     ; assign member list to variable so it doesn't change
exten =&gt; s,n,Set(CHANNEL_TO_MATCH=${EVAL(Local/${MYNUMBCLEAN}@queueagents/n)})  ; set what we're matching against
exten =&gt; s,n,Set(X=1)                                                           ; initialize counter

; begin while loop
exten =&gt; s,n,While($[${EXISTS(${CUT(OUR_QM_LIST,\,,${X})})}])                   ; while we still have a value (not-null), loop
exten =&gt; s,n,Set(OUR_ITTR=${CUT(OUR_QM_LIST,\,,${X})})                          ; set our itterator to check
exten =&gt; s,n,Noop(prematch)                                                     ; debugging can probally be removed
exten =&gt; s,n,Set(MATCHED=${IF($["${OUR_ITTR}" = "${CHANNEL_TO_MATCH}"]?1:0)})   ; match against the channel
exten =&gt; s,n,Noop(postmatch)                                                    ; debugging can probally be removed
exten =&gt; s,n,Exec(${IF($[${MATCHED}]?ExitWhile():NoOp())})                      ; exit while loop on match
exten =&gt; s,n,Set(X=$[${X} + 1])                                                 ; increase the iterator
exten =&gt; s,n,EndWhile()
; end while loop
exten =&gt; s,n,GotoIf($[${MATCHED}]?100,1:400,1)                                  ; branch on match, 100 means yes 400 means no

exten =&gt; 100,1,noop(yup)                                                        ; agent is already logged in, log em out
; TODO add confirmation "do you really want to logout?"
exten =&gt; 100,n,RemoveQueueMember(${ARG1},Local/${MYNUMBCLEAN}@queueagents/n)    ; remove Local/*@queueagents instead of default
exten =&gt; 100,n,playback(agent-loggedoff)                                        ; tell them the agaent logged off
exten =&gt; 100,n,Hangup

exten =&gt; 400,1,noop(nope)                                                       ; agent is not logged in, log em in
exten =&gt; 400,n,AddQueueMember(${ARG1},Local/${MYNUMBCLEAN}@queueagents/n,0)     ; add Local/*@queueagents instead of default
; catch if queuemember breaks
exten =&gt; 400,n,Execif($[ ${AQMSTATUS} = ADDED ],Playback,agent-loginok)         ; let the agent know they have sucessfully logged in
exten =&gt; 400,n,Execif($[ ${AQMSTATUS} = NOSUCHQUEUE ],Playback,try-again)       ; if queue doesn't exist tell em to try again.
exten =&gt; 400,n,Hangup
&lt;/blockquote&gt;

&lt;h4&gt;Agent phones should only receive one call at a time from any queue&lt;/h4&gt;
&lt;p&gt;This requirement combined with the next one, became the biggest hurdle to overcome. If we restricted the number of calls via limits in &lt;em&gt;sip.conf&lt;/em&gt; then the requirement below was not met, and if we didn't use limits in &lt;em&gt;queues.conf&lt;/em&gt; then we had to disable any and all call-waiting on the phones(completely un-wanted side effect).&lt;/p&gt;
&lt;h4&gt;Agent phones should be reachable via direct dialing, even when handling a call from a queue&lt;/h4&gt;
&lt;p&gt;We ended up using the following tactic to satisify these two requirements. First, we didn't just add the channel that dialed the login macro, we added a related macro in the &lt;strong&gt;queueagents&lt;/strong&gt; context. This is done by the following line in the macro posted above:
&lt;blockquote&gt;
exten =&gt; 400,n,AddQueueMember(${ARG1},Local/${MYNUMBCLEAN}@queueagents/n,0)     ; add Local/*@queueagents instead of default
&lt;/blockquote&gt;
We used the following logic in the &lt;strong&gt;queueagents&lt;/strong&gt; context, which keeps track of which members are currently being called, and returns &lt;strong&gt;busy()&lt;/strong&gt; if needed.
&lt;blockquote&gt;
[queueagents]
exten =&gt; _XXXX,1,noop(${EXTEN})                                       ; queue agent context, extension is agent to call
exten =&gt; _XXXX,n,Set(GROUP(${EXTEN}@queueagents)=1)                   ; set the group to &lt;extension&gt;@queueagents
exten =&gt; _XXXX,n,Set(MYCOUNT=${GROUP_COUNT(${EXTEN}@queueagents)})    ; retrieve the number of active calls
exten =&gt; _XXXX,n,GotoIf($[${MYCOUNT} &gt; 0]?busy)                       ; if the number of calls is greater than zero, goto the busy priority
exten =&gt; _XXXX,n(avail),NoOp(avail)                                   ; Availble priority, can be used to override call limits eg( goto queueagents,${EXTEN},avail )
exten =&gt; _XXXX,n,Set(OUTBOUND_GROUP=${EXTEN}@queueagents)             ; Setup the magic OUTBOUND_GROUP varible, (increments the count next time someone attempts to call
exten =&gt; _XXXX,n,Dial(SIP/${EXTEN})                                   ; if we got to here, then it's clear to call, dial away. TODO: Make the technoligy dynamic to allow IAX agents etc
exten =&gt; _XXXX,n,Goto(done)                                           ; skip over the busy priority
exten =&gt; _XXXX,n(busy),NoOp(busy)                                     ; busy priority
exten =&gt; _XXXX,n,Busy()                                               ; send busy to the queue
exten =&gt; _XXXX,n(done),NoOp(done)                                     ; done priority
exten =&gt; _XXXX,n,Hangup()                                             ; all done
&lt;/blockquote&gt;
&lt;/p&gt;

&lt;p&gt;One last thing we did was to override the caller ID so the agent could answer the phone according to the type of call. We did this just before calling the &lt;strong&gt;Queue()&lt;/strong&gt; application in the dialplan.
&lt;blockquote&gt;
exten =&gt; _54XX,1,Answer
exten =&gt; _54XX,1,Wait(2)
exten =&gt; _54XX,n,Playback(you-entered)
exten =&gt; _54XX,n,SayAlpha(q)
exten =&gt; _54XX,n,SayDigits(${EXTEN:3:1})
exten =&gt; _54XX,n,Set(CALLERID(name)=Queue -- ${EXTEN:3:1})
exten =&gt; _54XX,n,Queue(${EXTEN:3:1})
exten =&gt; _54XX,n,Hangup
&lt;/blockquote&gt;
&lt;/p&gt;

&lt;h4&gt;Thanks and acknolegements&lt;/h4&gt;

&lt;p&gt;Getting this thing working wouldn't have been possible without &lt;a href="http://www.jaredsmith.net/"&gt;Jared Smith's&lt;/a&gt; help, both direct help via IRC or indirect help via his &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0596009623"&gt;book&lt;/a&gt;. If you're using Asterisk and don't have this book, you are working too hard. 
I would also like to thank those from the &lt;a href="http://www.utaug.org/"&gt;Utah Asterisk User's Group&lt;/a&gt; who chimed in the IRC channel.
Now go buy Jared's book to help me feel less guilty about bothering him every day for the past three weeks.
&lt;/p&gt;

        

        
    &lt;img src="http://feeds.feedburner.com/~r/goozbachs_tech_tips-all/~4/Hv7gz9m3miU" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.friocorte.com/2007/05/asterisk-queues-redux.html</feedburner:origLink></entry>

<entry>
    <title>Asterisk Queues</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/goozbachs_tech_tips-all/~3/GdOTBZktYy0/asterisk-queues.html" />
    <id>tag:new.friocorte.com,2007:/blog//1.37</id>

    <published>2007-05-08T18:14:56Z</published>
    <updated>2008-01-05T04:55:11Z</updated>

    <summary>I've been busy lately working on a rather big Asterisk installation. One of the bigger problems we've wanted to solve was our queue management. Here's the beginnings of a queue log in/out macro I've been fiddling with. oh, and a...</summary>
    <author>
        <name>goozbach</name>
        
    </author>
    
        <category term="neverblock" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blog.friocorte.com/">
        &lt;p&gt;I've been busy lately working on a rather big &lt;a href="http://www.asterisk.org/"&gt;Asterisk&lt;/a&gt; installation. &lt;/p&gt;

&lt;p&gt;One of the bigger problems we've wanted to solve was our queue management.&lt;/p&gt;

&lt;p&gt;Here's the beginnings of a queue log in/out macro I've been fiddling with.&lt;/p&gt;

&lt;p&gt;oh, and a super-big thanks goes to &lt;a href="http://www.jaredsmith.net/"&gt;Jared Smith&lt;/a&gt;, for the basis of what I've done here.&lt;/p&gt;

&lt;blockquote&gt;
; macros to do login and out of queues
[macro-queueloginout]
; first argument is the queue to be added to, second(not yet implemented) is penality
exten =&gt; s,1,Answer
exten =&gt; s,n,Set(MYNUMB=${CUT(CHANNEL,-,1)})
exten =&gt; s,n,Set(MYNUMBCLEAN=${CUT(MYNUMB,/,2)})
exten =&gt; s,n,Set(OUR_QM_LIST=${QUEUE_MEMBER_LIST(${ARG1})})    ; assign member list to variable so it doesn't change
exten =&gt; s,n,Set(CHANNEL_TO_MATCH=${CUT(CHANNEL,-,1)})          ; get rid of the unique identifier on the end
exten =&gt; s,n,Set(X=1)                                           ; initialize counter

exten =&gt; s,n,While($[${EXISTS(${CUT(OUR_QM_LIST,\,,${X})})}])   ; while we still have a value (not-null), loop
exten =&gt; s,n,Set(MATCHED=${IF($["${CUT(OUR_QM_LIST,\,,${X})"} = "${CHANNEL_TO_MATCH}"]?1:0)}) ; match against the channel
exten =&gt; s,n,Exec(${IF($[${MATCHED}]?ExitWhile():NoOp())}) ; exit while on match
exten =&gt; s,n,Set(X=$[${X} + 1]) ; increase the iterator
exten =&gt; s,n,EndWhile() ; End of the loop
exten =&gt; s,n,GotoIf($[${MATCHED}]?100,1:400,1) ;branch on match, 100 means yes 200 means no

exten =&gt; 100,1,noop(yup) ; agent is already logged in, log em out
exten =&gt; 100,n,RemoveQueueMember(${ARG1},Local/${MYNUMBCLEAN}@queueagents/n)
exten =&gt; 100,n,playback(agent-loggedoff)
exten =&gt; 100,n,Hangup

exten =&gt; 400,1,noop(nope) ; agent is not logged in, log em in
exten =&gt; 400,n,AddQueueMember(${ARG1},Local/${MYNUMBCLEAN}@queueagents/n,0)
; catch if queuemember breaks
exten =&gt; 400,n,Execif($[ ${AQMSTATUS} = ADDED ],Playback,agent-loginok)
exten =&gt; 400,n,Execif($[ ${AQMSTATUS} = NOSUCHQUEUE ],Playback,try-again)
exten =&gt; 400,n,Hangup
&lt;/blockquote&gt;

&lt;p&gt;It is still a work in progress, I'm hoping to get a penality overload built into the macro in the near future.&lt;/p&gt;

&lt;p&gt;Oh, yeah! I almost forgot to show you how to use the macro in your dialplan:&lt;/p&gt;

&lt;blockquote&gt;
exten =&gt; _77XX,1,Macro(queueloginout,${EXTEN})
&lt;/blockquote&gt;

&lt;p&gt;This extension, anything in the 7700 range, will log the currently calling phone into the queue specified, numbered by the extension dialed.
E.g. dial 7703 will log you into or out of queue 7703.&lt;/p&gt;

&lt;p&gt;UPDATE 2007-05-10&lt;/p&gt;

&lt;p&gt;I was fiddling with this, and realzed that only one agent could log in at a time.&lt;/p&gt;

&lt;p&gt;Thanks again to Jared for discovering that adding four little quote marks makes it work correctly.&lt;/p&gt;

&lt;p&gt;post above edited to show the new quotes.&lt;/p&gt;

        

        
    &lt;img src="http://feeds.feedburner.com/~r/goozbachs_tech_tips-all/~4/GdOTBZktYy0" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.friocorte.com/2007/05/asterisk-queues.html</feedburner:origLink></entry>

</feed>
