<?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>Michael Bianco&#039;s Blog</title>
	<atom:link href="http://mabblog.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://mabblog.com/blog</link>
	<description>Web, Software, and Design</description>
	<lastBuildDate>Thu, 17 May 2012 00:22:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Social Norms vs Market Valuation</title>
		<link>http://mabblog.com/blog/2012/05/social-norms-vs-market-valuation/</link>
		<comments>http://mabblog.com/blog/2012/05/social-norms-vs-market-valuation/#comments</comments>
		<pubDate>Thu, 17 May 2012 00:22:39 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Off Topic]]></category>

		<guid isPermaLink="false">http://mabblog.com/blog/?p=573</guid>
		<description><![CDATA[I&#8217;m reading Predictably Irrational a really fascinating book, especially for those who have any interest in economics. One of the chapters that I&#8217;ve just finished discusses the &#8216;two worlds&#8217; of valuation and exchange: one which is ruled by &#8216;social norms&#8217; and the other by cold rational market analysis. The interesting psychological element to these two &#8216;worlds&#8217; [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m reading <a href="http://www.amazon.com/Predictably-Irrational-Revised-Expanded-Edition/dp/0061353248/ref=sr_1_1?ie=UTF8&amp;qid=1337212455&amp;sr=8-1" target="_blank">Predictably Irrational</a> a really fascinating book, especially for those who have any interest in economics. One of the chapters that I&#8217;ve just finished discusses the &#8216;two worlds&#8217; of valuation and exchange: one which is ruled by &#8216;social norms&#8217; and the other by cold rational market analysis.</p>
<p>The interesting psychological element to these two &#8216;worlds&#8217; is that once you cross the threshold into the world of market analysis, you can&#8217;t go back. The author cites an example of a day care center which created a new rule which attached a monetary file to arriving late to pick up your child. Once the fine was implemented, more parents arrived later to pick up their children. The social cost of picking up their child late was not easily quantified and thus, most likely, it was greater than the fine attached. The most interesting part of the experiment is that they removed the fine, but <em>parent&#8217;s behavior did not positively improve – late pickups did not return to the previous levels</em>. Since parents knew what the cost was, even if it wasn&#8217;t charged anymore, it didn&#8217;t have a social cost associated with the action.</p>
<p>I&#8217;d be interested to see the average tip percentage in restaurants who include a base gratuity on the bill and those who do not. My guess would be those who include a gratuity lose out. Additionally, I wonder if the world of social costs exists in online commerce. Since we never really encounter any people-in-the-flesh online, it is easier to ignore social norms because there really isn&#8217;t any community to which establish them (although there are &#8216;ruled&#8217; written and unwritten in many online communities, I&#8217;m not sure if these could be categorized as social norms or costs). For instance I&#8217;ve talked to many friends who use <a href="https://www.noisetrade.com/" target="_blank">NoiseTrade</a> who uncomfortably admit (in a face-to-face conversation) that they have <em>never </em>&#8216;tipped&#8217; an artist on NoiseTrade.</p>
<p>Great book so far – excited to read the remainder of it.</p>
]]></content:encoded>
			<wfw:commentRss>http://mabblog.com/blog/2012/05/social-norms-vs-market-valuation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Convert MS SQL Database to CSV or MySQL</title>
		<link>http://mabblog.com/blog/2012/04/convert-ms-sql-database-to-csv-or-mysql/</link>
		<comments>http://mabblog.com/blog/2012/04/convert-ms-sql-database-to-csv-or-mysql/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 12:35:33 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[databases]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://mabblog.com/blog/?p=566</guid>
		<description><![CDATA[This is more of a thorny issue that you would at first expect – Microsoft does not provide an easy way out of their database if you are on a different platform. The open source (or paid!) tools available for interacting with Microsoft SQL databases on OS X are very limited. There are not any [...]]]></description>
			<content:encoded><![CDATA[<p>This is more of a thorny issue that you would at first expect – Microsoft does not provide an easy way out of their database if you are on a different platform.</p>
<p>The open source (or paid!) tools available for interacting with Microsoft SQL databases on OS X are very limited. There are not any native GUIs available (to my knowledge), I&#8217;ve found that getting TDS up and running is a pain, and it seems impossible to import a .bak or ms sql insert dump. Additionally, I&#8217;ve had weird encoding + CSV formatting issues when given a CSV exported from a dump given to me.</p>
<p>I&#8217;ve discovered a workaround to the issue that has worked reliable for very large data sets (30,000+ rows). <a href="http://www.oracle.com/technetwork/developer-tools/sql-developer/overview/index.html" target="_blank">Oracle&#8217;s SQL Developer</a> application <a href="http://thinkoracle.blogspot.com/2010/09/using-oracle-sql-developer-with-ms-sql.html" target="_blank">can connect to a ms sql database</a>. Once you have a connection established you can export to a bunch of different formats. However, I&#8217;ve had encoding issues when exporting as a CSV or other plain text format. However, exporting the ms sql from Oracle SQL developer as a XLS is very reliable (text with quotes, commas, and other characters are perfectly preserved).</p>
<p>Google has released a <a href="http://code.google.com/p/google-refine/" target="_blank">great tool for handling large CSVs</a>. The great thing about Google Refine is that it can import data from a variety of formats – one being XLS. If you import the XLS file into Google Refine and then export as an CSV you&#8217;ll have a data format which works great with libraries such as Ruby&#8217;s CSV class or CSV import functionality on software such as <a href="http://www.sequelpro.com/bundles/" target="_blank">Sequel Pro</a>. A multi-step process, but it has worked reliably.</p>
<p>If you are looking to convert a mdb (a Microsoft Access database) to SQL there is a great tool for converting a <a href="http://code.google.com/p/mdb-sqlite/" target="_blank">mdb to sqlite</a> which you can then easily export a MySQL compatible SQL dump or a plain CSV file either using a tool like <a href="http://menial.co.uk/software/base/" target="_blank">Base</a> or the command line.</p>
]]></content:encoded>
			<wfw:commentRss>http://mabblog.com/blog/2012/04/convert-ms-sql-database-to-csv-or-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Product Pricing in a Zero Marginal Cost Distribution Environment</title>
		<link>http://mabblog.com/blog/2012/04/product-pricing-in-a-zero-marginal-cost-distribution-environment/</link>
		<comments>http://mabblog.com/blog/2012/04/product-pricing-in-a-zero-marginal-cost-distribution-environment/#comments</comments>
		<pubDate>Sun, 15 Apr 2012 17:33:21 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[ebooks]]></category>
		<category><![CDATA[marketing]]></category>
		<category><![CDATA[pricing]]></category>

		<guid isPermaLink="false">http://mabblog.com/blog/?p=556</guid>
		<description><![CDATA[Jarrod Drysdale on digital product pricing: Our strategies were very different. Sacha wrote a book and priced it relative to the cost of other books, which is the strategy just about everyone follows. Instead of that, I wrote a book and priced it based on the value it provides. Choosing a pricing strategy based on [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.studiofellow.com/" target="_blank">Jarrod Drysdale</a> on <a href="http://blog.asmartbear.com/higher-pricing.htm" target="_blank">digital product pricing</a>:</p>
<blockquote><p>Our strategies were very different. Sacha wrote a book and priced it relative to the cost of other books, which is the strategy just about everyone follows. Instead of that, I wrote a book and priced it based on the value it provides.</p>
<p>Choosing a pricing strategy based on competition is a natural approach, but also a flawed one. Price competition implies scarcity—supply and demand market forces. There is no scarcity for ebooks because digital files are replicated practically for free.</p></blockquote>
<p>Seth Godin has <a href="http://www.thedominoproject.com/2011/12/how-much-should-an-ebook-cost.html" target="_blank">mentioned this before</a>: there seems to be a &#8216;race to the bottom&#8217; effect with a lot of eBooks, but many are doing fairly well with pricing way above the competition if they are in a market with scarce competition. Of course this is nothing new – small supply relative to demand results in a above market price.</p>
<p>If you not planning on growing a business or establishing a brand (including your own &#8216;personal brand&#8217; – your value in the marketplace) then selling a one-off book (or any sort of digital content) by estimating the intersection of supply and demand curves might work.</p>
<p>However, every product has some of auxiliary asset whose value is increased or decreased depending on a product is priced, designed and released.</p>
<p>Mailing list growth. Establishment of a respected voice in a niche market or field. Growth of enthusiastic fans. Possibility of a future acquisition.</p>
<p>All of these intangible assets are not easily valued because in most cases they are dependent on the future. However, they have a real value and possible growth in any of these assets can effect the short term pricing of a product or service. I think this is what makes digital good pricing challenging – why some books are on sale for <a href="http://www.amazon.com/gp/feature.html/ref=amb_link_361554162_2?ie=UTF8&amp;nav_sdd=aps&amp;docId=1000706171&amp;pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_s=center-1&amp;pf_rd_r=0Y6QGWE61JFYRBMG0594&amp;pf_rd_t=101&amp;pf_rd_p=1360243642&amp;pf_rd_i=507846" target="_blank">$3.99</a>, <a href="http://stopstealingdreams.com/" target="_blank">some free</a>, and some less that <a href="http://bootstrappingdesign.com/" target="_blank">150 pages and $50</a>. I don&#8217;t think there is ever going to be any one model that works – when you can slice and dice pricing into many different facets the possibilities are endless.</p>
]]></content:encoded>
			<wfw:commentRss>http://mabblog.com/blog/2012/04/product-pricing-in-a-zero-marginal-cost-distribution-environment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP, MS SQL, and Linux</title>
		<link>http://mabblog.com/blog/2012/04/php-mssql-linux/</link>
		<comments>http://mabblog.com/blog/2012/04/php-mssql-linux/#comments</comments>
		<pubDate>Fri, 06 Apr 2012 05:00:48 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[databases]]></category>

		<guid isPermaLink="false">http://mabblog.com/blog/?p=267</guid>
		<description><![CDATA[Note: this was a draft from 2009. I never finished documenting everything, and I (thankfully!) no longer have to integrate with the MS SQL database mentioned here. However, I figured I throw this information out there in case someone was running into the same configuration issues I was. &#8212; Usually I am lucky enough that [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Note:</strong> this was a draft from <strong>2009</strong>. I never finished documenting everything, and I (thankfully!) no longer have to integrate with the MS SQL database mentioned here. However, I figured I throw this information out there in case someone was running into the same configuration issues I was.</p>
<p>&#8212;</p>
<p>Usually I am lucky enough that most of my clients don&#8217;t have many of their internal operations tied into their web site&#8217;s databases; if they are using MS SQL or some other database engine that isn&#8217;t open source I&#8217;m able to easily convince them to transfer their data over to MySQL. Recently I was working with a client where this wasn&#8217;t the case, there was no way around it: I would have to integrate with a MS SQL database.</p>
<p>Information on connecting to MS SQL from PHP <em>exists</em> on the web, but most of it is either unclear, incomplete, or outdated. I hope to bundle together most of the information I found into one blog post to make it a bit simpler to compile a custom PHP installation with MS SQL capabilities using the <a href="http://www.freetds.org/">freetds</a> library.</p>
<p>In the <a href="http://wiki.dreamhost.com/Installing_PHP5#Alternative_PHP_5_install_scripts">PHP installation script</a> I changed/added the freetds installation line to this:</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #007800;">SYBASE</span>=<span style="color: #7a0874; font-weight: bold;">&#123;</span><span style="color: #007800;">$INSTALLDIR</span><span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<span style="color: #007800;">LD_LIBRARY_PATH</span>=<span style="color: #800000;">${LD_LIBRARY_PATH}</span>:<span style="color: #007800;">$SYBASE</span><span style="color: #000000; font-weight: bold;">/</span>lib<br />
<span style="color: #7a0874; font-weight: bold;">export</span> SYBASE LD_LIBRARY_PATH<br />
<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #800000;">${SRCDIR}</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #800000;">${FREETDS}</span><br />
.<span style="color: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--prefix</span>=<span style="color: #800000;">${INSTALLDIR}</span> <span style="color: #660033;">--with-tdsver</span>=<span style="color: #000000;">8.0</span> <span style="color: #660033;">--enable--msdblib</span> <span style="color: #660033;">--enable-sybase-compat</span><br />
<span style="color: #c20cb9; font-weight: bold;">make</span><br />
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></div></div>
<p><strong>References:</strong></p>
<ul>
<li><a href="http://www.freetds.org/userguide/config.htm" target="_blank">Free TDS User Guide</a></li>
<li><a href="http://www.linuxjournal.com/article/6636" target="_blank">Making PHP With An MS SQL Database</a></li>
<li><a href="http://www.dbapool.com/articles/06280701.html" target="_blank">ODBC and FreeTDS</a></li>
<li><a href="http://www.linuxfromscratch.org/blfs/view/cvs/general/unixodbc.html" target="_blank">Unix ODBC</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://mabblog.com/blog/2012/04/php-mssql-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MacRuby, CocoaPods, 10.7, and XCode 4.3</title>
		<link>http://mabblog.com/blog/2012/03/macruby-cocoapods-10-7-and-xcode-4-3/</link>
		<comments>http://mabblog.com/blog/2012/03/macruby-cocoapods-10-7-and-xcode-4-3/#comments</comments>
		<pubDate>Sun, 25 Mar 2012 18:59:39 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[macruby]]></category>
		<category><![CDATA[objc]]></category>

		<guid isPermaLink="false">http://mabblog.com/blog/?p=550</guid>
		<description><![CDATA[I have a MacRuby project that uses CocoaPods for many of its ObjC dependencies. I had a bit of trouble getting it to run properly with the latest version of Xcode (4.3). This had to do with a recent change I made to MABSupportFolder (use of isEmpty()) which triggered a fairly obscure bug in addition to [...]]]></description>
			<content:encoded><![CDATA[<p>I have a MacRuby project that uses CocoaPods for many of its ObjC dependencies. I had a bit of trouble getting it to run properly with the latest version of Xcode (4.3). This had to do with a recent change I made to MABSupportFolder (use of isEmpty()) which triggered a <a href="http://www.macruby.org/trac/ticket/1487" target="_blank">fairly obscure bug</a> in addition to the new XCode 4.3 organizational structure not being properly recognized at first.</p>
<p>The obscure MacRuby bug was being caused by running -count on an NSString. When using MacRuby if you test if a NSString responds to -count using -respondsToSelector: you&#8217;ll get true as the response because of Ruby&#8217;s String#count method. However, that method requires an argument, but running respondsToSelector:@selector(count) will return true for an NSString. This bug was triggered because of my usage of <a href="http://blog.wilshipley.com/2005/10/pimp-my-code-interlude-free-code.html" target="_blank">Will Shipley&#8217;s isEmpty()</a> function.</p>
<p>If you recently upgraded to Xcode 4.3, make sure you run this command (got this tip from <a href="http://watson1978.github.com/MacRuby-DoJo/blog/2012/03/09/intro-install/" target="_blank">here</a>):</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer</div></div>
<p>Or `pod install` will not run properly. Also, I just found out that <a href="https://github.com/CocoaPods/CocoaPods" target="_blank">CocoaPods</a> does not use macruby anymore – you can run it using the system ruby install.</p>
<p>For someone trying to get MacRuby working with CocoaPods here is my Podfile:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">platform :osx<br />
<br />
dependency 'FMDB'<br />
dependency 'ASIHTTPRequest'<br />
dependency 'MABToolkit'<br />
dependency 'KFAppleScriptHandlerAdditions'<br />
<br />
# Enable garbage collection support, which MacRuby requires.<br />
post_install do |installer|<br />
installer.project.targets.each do |target|<br />
target.buildConfigurations.each do |config|<br />
config.buildSettings['GCC_ENABLE_OBJC_GC'] = 'supported'<br />
end<br />
end<br />
end<br />
<br />
generate_bridge_support!</div></div>
<p>The top of your main.rb should look like this:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">framework 'Cocoa'<br />
<br />
load_bridge_support_file NSBundle.mainBundle.pathForResource(&quot;Pods&quot;, ofType:&quot;bridgesupport&quot;)</div></div>
]]></content:encoded>
			<wfw:commentRss>http://mabblog.com/blog/2012/03/macruby-cocoapods-10-7-and-xcode-4-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Create Gzipped Tar Archive Service for OS X 10.6 + 10.7</title>
		<link>http://mabblog.com/blog/2012/03/create-tgz-archive-service-10-6-osx/</link>
		<comments>http://mabblog.com/blog/2012/03/create-tgz-archive-service-10-6-osx/#comments</comments>
		<pubDate>Fri, 23 Mar 2012 05:00:56 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://mabblog.com/blog/?p=288</guid>
		<description><![CDATA[Although the tgz command line syntax is very simplistic, I&#8217;ve never managed to remember the exact flags for the command line interface. Additionally, if I&#8217;m clicking around in the Finder I don&#8217;t want to have to fall back to the command line to create a tgz archive. Inspired by this hint you can download a service [...]]]></description>
			<content:encoded><![CDATA[<p>Although the tgz command line syntax is very simplistic, I&#8217;ve never managed to remember the exact flags for the command line interface. Additionally, if I&#8217;m clicking around in the Finder I don&#8217;t want to have to fall back to the command line to create a tgz archive. Inspired by <a href="http://www.macosxhints.com/article.php?story=20050731011849803" target="_blank">this hint</a> you can <a href="http://mabblog.com/getfile.php?file=66" target="_blank">download a service to create a tgz archive</a> that works with Snow Leopard and Lion.</p>
]]></content:encoded>
			<wfw:commentRss>http://mabblog.com/blog/2012/03/create-tgz-archive-service-10-6-osx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scripting OmniGraffle: MySQL Visualization &amp; JSON Representations</title>
		<link>http://mabblog.com/blog/2012/03/scripting-omnigraffle-mysql-json-visualization/</link>
		<comments>http://mabblog.com/blog/2012/03/scripting-omnigraffle-mysql-json-visualization/#comments</comments>
		<pubDate>Fri, 16 Mar 2012 05:00:27 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://mabblog.com/blog/?p=254</guid>
		<description><![CDATA[OmniGraffle is a great tool for visually mapping out complex relationships or hierarchical structures. Often when working in groups where some of the personnel have no programming or mathematical background OmniGraffle is a great tool to bridge the gap. Converting OmniGraffle Hierarchy to JSON Often I&#8217;ll use OmniGraffle to map out site structures with non-programmers. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.omnigroup.com/products/omnigraffle/" target="_blank">OmniGraffle</a> is a great tool for visually mapping out complex relationships or hierarchical structures. Often when working in groups where some of the personnel have no programming or mathematical background OmniGraffle is a great tool to bridge the gap.</p>
<h2>Converting OmniGraffle Hierarchy to JSON</h2>
<p>Often I&#8217;ll use OmniGraffle to map out site structures with non-programmers. The challenge is once everything has been done in OmniGraffle it is normally a manual process to convert the data in OmniGraffle to a structured data representation, like JSON, that is easy to programmatically work with. Or, in my specific case, output the structured OmniGraffle document into a text document that could be reviewed and edited by others on a Google Doc. I wrote a script to <a href="https://gist.github.com/1487305" target="_blank">pull structured data out of an OmniGraffle document</a>.</p>
<h2>Visual MySQL Database Structure in OmniGraffle</h2>
<p>Pretty cool tool to visual a MySQL database in OmniGraffle (including foreign keys!). I did not write the original version, but I modified it to work with the latest version of OmniGraffle. Check out the modified <a href="https://gist.github.com/1486762" target="_blank">MySQL to OmniGraffle visualizer</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://mabblog.com/blog/2012/03/scripting-omnigraffle-mysql-json-visualization/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JPEG + PNG Color Management Strategies for the Web</title>
		<link>http://mabblog.com/blog/2012/03/color-management-web-color-profiles/</link>
		<comments>http://mabblog.com/blog/2012/03/color-management-web-color-profiles/#comments</comments>
		<pubDate>Fri, 09 Mar 2012 05:00:05 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://mabblog.com/blog/?p=157</guid>
		<description><![CDATA[The first step in the design process of any website is to mockup the design in Photoshop. One of the most frustrating parts of the design process can be converting your mockup into image slices whose colors mix well with native CSS styles. Mark Edwards, over at Bjango, has a great writeup on color profile [...]]]></description>
			<content:encoded><![CDATA[<p>The first step in the design process of any website is to mockup the design in Photoshop. One of the most frustrating parts of the design process can be converting your mockup into image slices whose colors mix well with native CSS styles. Mark Edwards, over at Bjango, has a great writeup on <a href="http://bjango.com/articles/photoshop/" target="_blank">color profile management and UI design</a>. The basic tenants are: don&#8217;t color manage, use native monitor color profile, use RGB, and do not attach color profiles to JPG or PNG images.</p>
<p>However, in my senario, I often work with graphics that have been designed by people who work in print and don&#8217;t understand web image generation in the slightest. Often I&#8217;ll receive unoptimized PNGs, JPGs in CMYK, images with color profiles, etc. This can cause image display issues in IE, color shifting, and generally hurt the performance of a website.</p>
<p>In order to help myself optimize images for the web I created a <a href="https://github.com/iloveitaly/Image2Web/downloads">small tool with an associated BASH script to convert CYMK images to RGB, strip color profiles, and optimize image file size</a>.</p>
<p>This tool arose from noticing that Preview.app seems to optimize file size pretty well for PNG and JPEG. I tried to mimick the Preview.app export and while looking through the NSImage APIs noticed you could pretty easily strip color profiles and convert CMYK to RGB.</p>
]]></content:encoded>
			<wfw:commentRss>http://mabblog.com/blog/2012/03/color-management-web-color-profiles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introduction to VOIP Telephony: Setting up a Business Phone System with Asterisk and Polycom</title>
		<link>http://mabblog.com/blog/2012/03/voip-business-system-asterisk-polycom-setup/</link>
		<comments>http://mabblog.com/blog/2012/03/voip-business-system-asterisk-polycom-setup/#comments</comments>
		<pubDate>Fri, 02 Mar 2012 12:56:10 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[telephony]]></category>
		<category><![CDATA[voip]]></category>

		<guid isPermaLink="false">http://mabblog.com/blog/?p=499</guid>
		<description><![CDATA[I was recently charged with picking out a new telephone system for a new office the company I work for was moving into. We were previously using a 3Com NBX 100. Inbound and outbound call volume for this company is relatively low. The needs of the company included: 1) easy + extensible conference calls 2) [...]]]></description>
			<content:encoded><![CDATA[<p>I was recently charged with picking out a new telephone system for a new office the company I work for was moving into. We were previously using a 3Com NBX 100. Inbound and outbound call volume for this company is relatively low. The needs of the company included: 1) easy + extensible conference calls 2) ability to use softphones (software) 3) good voicemail system 4) reliability. The company was not looking for a unified messaging system, video conferencing, color LCD phones with automatic VPN connections, etc. A basic PBX to support the phone needs of a small company was all that was needed.</p>
<p>Proposals from a couple providers yielded total costs of a 10 hard phone + 10 soft phone system to be around $8,000 &#8211; $12,000 with an ongoing contract. This seemed a bit high considering the simplicity of the needs of the company. After some research and a lot of trial and error I was able to get the entire phone system deployed for less than $2,100 ($350 POE switch, 10 phones * $85, ~$900 analog card, used an old Windows box lying around). It took me about a week of full-time work to figure out how all the peices fit together and deploy the system. Although VOIP may seem a bit intimidating with all the lingo and plethora of options, it isn&#8217;t as hard or mysterious as it may seem at first.</p>
<p>Hopefully this compilation of notes will help someone in a similar situation develop and deploy a VOIP Asterisk based solution. Enjoy.</p>
<h2>Vocabulary</h2>
<ul>
<li>POTS = Plain Old Telephone Service = Analog Lines = Copper Lines</li>
<li>SIP = Session Initiation Protocol. This is the traffic that will travel over your LAN and communicate with your office phones (in my case, Polycom 321s and Telephone.app)</li>
<li>SIP Trunk = A digital alternative to POTS. I did not utilize a SIP Trunk in my setup, but from what I understand you basically grab a special card that then connects through your WAN to a remote SIP Trunk provider. Essentially your phone lines are routed through your internet (similar to Skype).</li>
<li>PBX = Private Branch Exchange. This is box that sits between your telephone endpoints (SIP trunk or POTS) and your phones connected to your lan</li>
<li>POE = Power Over Ethernet. Many modern phones can be powered through the ethernet cable that they use to communicate with the LAN, this eliminates the need for power adaptors for each individual phone. Some &#8216;pre-built&#8217; / commercial PBXs have POE built in. In my setup I purchased a NetGear <a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16833122177&amp;Tpk=FS728TP" target="_blank">FS728TP-100NAS</a></li>
<li>TFTP = Trivial File Transfer Protocol. The Polycoms (and many other phones) use TFTP to pull their application binary, configuration settings, and other information.</li>
<li>ARP = Address Resolution Protocol. I don&#8217;t really understand this piece too much, but</li>
<li>FreePBX / Elastix = GUI for the Asterisk configuration files</li>
<li>DAHDI = software that integrates with <a href="http://www.digium.com/en/products/hardware/analog" target="_blank">Digium</a> (and other) analog and digital PCI hardware devices. This <a href="http://blogs.digium.com/2008/05/19/zaptel-project-being-renamed-to-dahdi/" target="_blank">used to be called Zaptel</a>. This software runs on the driver level of operating system (it isn&#8217;t a service like Asterisk). Essentially is bridges asterisk with POTS or SIP trunks.</li>
</ul>
<h2>Basic System Overview</h2>
<ul>
<li>Separate cat6 voice + data lines to each work station</li>
<li>Data lines connected to <a href="http://www.amazon.com/gp/product/B000M101ZQ/ref=oh_o01_s01_i00_details" target="_blank">gigabit switch</a></li>
<li>Voice lines connected to POE 10/100 switch referenced above</li>
<li>POE switch tied to the gigabit switch via 2 gigabit ethernet ports</li>
<li>Asterisk running on couple-year-old Dell dual-core 2.8ghz, 3GB of ram, gigabit ethernet</li>
<li>Asterisk box (PBX) connected to gigabit switch</li>
<li>6 POTS lines through Verizon</li>
<li>10 Polycom SoundPoint 321</li>
<li>10+ Softphones</li>
<li>Remote users accessing PBX via VPN</li>
<li><a href="http://betterthangrep.com/" target="_blank">ack</a> instead of grep on the command line</li>
<li>Asterisk 1.8.8.1, FreePBX 2.9.0.9, DAHDI 2.5.0.2, CentOS 2.6.18-274.17.1.el5 (`uname -r`)</li>
</ul>
<h2>Setting Up an Asterisk-Based VOIP System with Polycom Phones</h2>
<h3>Basic AsteriskNOW Installation Procedure</h3>
<div>There a couple ways to handle Asterisk installation, and a couple GUIs to choose from. I settled on <a href="http://www.asterisk.org/asterisknow" target="_blank">AsteriskNOW</a> + <a href="http://www.freepbx.org/" target="_blank">FreePBX GUI</a>. After downloading the image, burning it to disk, and booting from the disk on your asterisk box you still need to update to the latest versions of the software by running `yum update`. After running `yum update` you&#8217;ll have to update the FreePBX software. You can <em>sort of</em> do this through the FreePBX module interface, but there was an extra step involved that I couldn&#8217;t find my notes on.</div>
<h3>Duplicate IP Message on Polycom 321 Phones</h3>
<p>This message was caused because of an old Microsoft 2003 Business server that was still connected to the network. DHCP used to be handled by the server, but we switched DHCP to the SonicWall. Although DHCP was disabled on the MS server, it seemed to be sending out some sort of broadcast that caused the phones (and only the phones!) to report a duplicate IP. Eliminating the MS server was the only solution that worked (all services relating to DHCP had been turned off on the server.</p>
<h3>Updating Polycom 321 Firmware via TFTP</h3>
<p>The Polycom devices support both FTP + TFTP configuration + boot loading. However, I was trying to simply the setup as much as possible and <em>trivial </em>FTP sounded a bit more simple. However, a TFTP server is not configured by default on an AsteriskNOW installation. To enable TFTP, first run `nano /etc/xinetd.d/tftp` from the command line and then change `disable = yes` to `disable = no`; save the file. Finally, run `service xinetd restart` from the command line. The TFTP server should be up and running.</p>
<p>The TFTP server does not have `ls` and other FTP-like commands. The easiest way to test if it is working is to grab a file from it from another machine:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ tftp pbx.localhost<br />
tftp&gt; get LoudRing.wav<br />
Received 128810 bytes in 0.1 seconds<br />
tftp&gt;</div></div>
<h3>Sending Phone Boot Server via DHCP</h3>
<p>Apparently there <a href="http://www.networksorcery.com/enp/protocol/bootp/options.htm" target="_blank">are many parameters</a> you can send to clients via DHCP. DHCP was running on a SonicWall 210 in this specific configuration. I had a bit of trouble getting this working, but the following settings worked on the SonicWall for me:</p>
<ul>
<li>option 66: tftp://pbx.localhost</li>
<li>option 160: tftp://pbx.localhost</li>
<li>option 150: tftp://pbx.localhost</li>
</ul>
<div>Note that the &#8220;tftp://&#8221; is important. In this specific instance I had a local DNS server running on a Mac Mini Server (Lion) that all clients were configured to hit before hitting the external DNS.</div>
<h3>Upgrading the Polycom BootRom &amp; Sip.ld (Application)</h3>
<p>This was a bit tricky, and I did not document exactly how I got to it work, but here are some pointers. You&#8217;ll need to download &#8220;UC_Software_3_3_3_release_sig_split&#8221; the <strong>not </strong>the latest &#8221;UC_Software_4_0_1B_release_sig_combined.zip&#8221; from Polycom support. Looking at the <a href="http://www.provisioner.net/release/v3/polycom/polycom.json" target="_blank">end point manager&#8217;s package.json</a> it seems as though the latest supported version is 3.3.3. I tried downloading the split version but it didn&#8217;t seem to work as well for me. You&#8217;ll also need to download the latest BootRom &#8221;spip_ssip_BootROM_4_3_1_release_sig.zip&#8221;. After downloading these pieces you&#8217;ll have to send them to your /tftpboot folder (I used `scp sip.ld root@pbx.local:/tftpboot` to move the files over). After putting the pieces in place, `ls -l /tftpboot` should look something like this:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">-rw-rw-rw- 1 asterisk asterisk 2437 Feb 20 14:30 000000000000.cfg<br />
-rw-rw-rw- 1 asterisk asterisk 2079 Feb 18 15:39 0004f2a8077e.cfg<br />
-rw-rw-rw- 1 asterisk asterisk 7470 Feb 18 12:53 0004f2a8077e_reg.cfg<br />
# ... (more configuration)<br />
-rwxr-xr-x 1 asterisk asterisk 639624 Jan 27 14:27 2345-12360-001.bootrom.ld<br />
-rwxr-xr-x 1 asterisk asterisk 3322061 Jan 27 14:41 2345-12360-001.sip.ld<br />
-rwxr-xr-x 1 asterisk asterisk 7591196 Jan 27 13:45 bootrom.ld<br />
drwxr-xr-x 2 asterisk asterisk 4096 Feb 18 14:34 contacts<br />
drwxr-xr-x 2 asterisk asterisk 4096 Jan 26 14:59 licenses<br />
drwxr-xr-x 2 asterisk asterisk 4096 Feb 18 12:53 logs<br />
-rw-rw-rw- 1 asterisk asterisk 127966 Feb 20 14:30 LoudRing.wav<br />
drwxr-xr-x 2 asterisk asterisk 4096 Feb 13 16:12 overrides<br />
-rw-rw-rw- 1 asterisk asterisk 8537 Feb 20 14:30 sip.cfg<br />
-rwxr-xr-x 1 asterisk asterisk 14 Jan 27 14:41 sip.ver<br />
drwxr-xr-x 2 asterisk asterisk 4096 Jan 26 14:59 SoundPointIPLocalization<br />
-rw-rw-rw- 1 asterisk asterisk 95926 Feb 20 14:30 SoundPointIPWelcome.wav</div></div>
<p>I&#8217;m not sure if you needed an updated bootrom.ld and the specific 2345-12360-001.bootrom.ld; but it worked.</p>
<h3>Using End Point Manager to Generate Configuration XML for Polycom</h3>
<p>In order to install End Point Manager I had to upload the module via the FreePBX Module Admin. For my installation (details given above) I used version 2.9.2.9 (list of .tar.gz versions can be <a href="http://www.the159.com/endpointman/" target="_blank">found here</a>, GitHub repo <a href="https://github.com/tm1000/freepbx-endpointmanager" target="_blank">here</a>. After installing, go to advanced options and set &#8220;Time Server&#8221; to &#8220;pool.ntp.org&#8221; and nmap to &#8220;/usr/bin/nmap&#8221; (you may have to install nmap via yum, I can&#8217;t remember if it was installed by default or not). If you are using TFTP, make sure that configuration option is set as well. I could not get the automatic phone vendor packages to work. I had to <a href="http://www.provisioner.net/release/v3/polycom/polycom.tgz" target="_blank">download the &#8220;provisioner_net.tgz&#8221;</a> and manually upload the package via the &#8220;Manual Endpoint Modules Upload/Export&#8221; under &#8220;End Point Advanced Settings.&#8221;</p>
<p>At this point, with the DHCP options correctly set, for new phones you should be able to plug them into the network, run a scan using nmap, and add the phones via the end point manager GUI. Unplug &amp; replug the Polycom phone in and it should pull the configuration from the TFTP server (the PBX box) set in the DHCP options and startup just fine.</p>
<h3>Default &#8220;Phone Book&#8221; / Directory on Polycom</h3>
<p>Although the phones claim to support loading the `000000000000-directory.xml` file into all phones; I could not get this to work even after factory resetting the phones. I grabbed the XML for the polycom directory by using <a href="https://github.com/iloveitaly/printextensions/tree/prettyprint" target="_blank">this modified version</a> of the printextensions module, copying the XML into the `000000000000-directory.xml` file, and then running <a href="https://raw.github.com/gist/1860966/7ef9ae8f073afef09e2e3312c3105a3e92c69f80/copy-default-directory.bash" target="_blank">this BASH script</a> to copy the default to each of the phones custom directory.xml files. Do <strong>not </strong>use this with a production system as it will overwrite any users customizations.</p>
<h3>Installing Git on CentOS (Default AsteriskNOW OS)</h3>
<p>Yum is the default package manager on CentOS, but the default repos don&#8217;t contain git. I wanted to pull in <a href="https://github.com/iloveitaly/dotfiles" target="_blank">my dotfiles</a> to the Asterisk box as well as manage the custom print extensions repo that I was working on. Here are the two BASH lines you need:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">rpm -Uvh http://repo.webtatic.com/yum/centos/5/latest.rpm<br />
yum install --enablerepo=webtatic git-all</div></div>
<h3>Software vs Hardware High Performance Echo Cancellation (HPEC)</h3>
<p>This is specific to Digium based cards. I didn&#8217;t know this until after purchasing the TDM800 with hardware echo cancellation, but after talking with an Digium customer support representative I learned that the algorithm used for echo cancelation is the <em>same </em>for the software based and hardware based echo cancellation. The CPU load on my installation hovers around 1%, I&#8217;m guessing for a &lt; 20 person office environment the software based echo cancelation would of worked just fine (although I don&#8217;t have experiential evidence to support this).</p>
<h3>Call Logging</h3>
<p>Initially call logging did not work in my installation. You can check if call logging is configured correctly by running `asterisk -r` and then running `cdr show status` from the Asterisk prompt. You should see something like:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Call Detail Record (CDR) settings<br />
----------------------------------<br />
Logging: Enabled<br />
Mode: Simple<br />
Log unanswered calls: No<br />
<br />
* Registered Backends<br />
-------------------<br />
mysql<br />
cdr-custom</div></div>
<p>If your installation is working correctly. Mine wasn&#8217;t, working off <a href="http://forums.asterisk.org/viewtopic.php?f=34&amp;t=80169" target="_blank">this guide</a>, the following BASH commands worked for me:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"># check if the mysql addons are installed<br />
yum list installed|ack mysql<br />
<br />
# if they aren't, install the mysql addons<br />
yum install asterisk18-addons-mysql</div></div>
<h3>Digium Has Incredible Customer Support</h3>
<p>I was throughly impressed by the quality of Digium&#8217;s customer support. They answered non-hardware related questions, ssh&#8217;d into my machine to debug some issues, and there was a less than one minute wait time.</p>
<h3>Outbound Call Configuration</h3>
<p>This was something that ended up being a bit more tricky that I thought. I ended up configuring the dial patterns to force long distance formatting (01+xxx+xxx+xxxx) on all numbers. I wanted to ability for people to dial with and without the 1, this seems to be working fine so far:</p>
<p style="text-align: center;"><a href="http://mabblog.com/blog/wp-content/uploads/2012/03/asterisk_outbound_route.png" target="_blank"><img class="aligncenter size-medium wp-image-521" title="asterisk_outbound_route" src="http://mabblog.com/blog/wp-content/uploads/2012/03/asterisk_outbound_route-300x187.png" alt="Asterisk Outbound Route Configuration" width="300" height="187" /></a></p>
<p style="text-align: center;"><a href="http://mabblog.com/blog/wp-content/uploads/2012/03/asterisk_outbound_trunk.png" target="_blank"><img class="aligncenter size-medium wp-image-522" title="asterisk_outbound_trunk" src="http://mabblog.com/blog/wp-content/uploads/2012/03/asterisk_outbound_trunk-300x221.png" alt="Asterisk Outbound Trunk Configuration" width="300" height="221" /></a></p>
<h3>POTS Call Tuning</h3>
<p>Different POTS lines have different levels and other &#8216;analog stuff&#8217;. To clear out noise and optimize your configuration you need to run the following script (retrieved from a Digium rep):</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">service asterisk stop<br />
# tunes impendence on the analog lines<br />
fxotune -x -i<br />
<br />
# restart dahdi and start asterisk<br />
service dahdi stop &amp;&amp; service dahdi start<br />
service asterisk start</div></div>
<h3>Setting up IVR Auto Answer</h3>
<p>Configure your IVR, then go to Setup &#8211;&gt; Inbound Routes. Choose &#8220;any DID / any CID&#8221;. At the bottom of the page switch &#8220;Destination&#8221; to IVR + desired auto attendant.</p>
<h3>Configuring Backups</h3>
<p>I usually login to the Asterisk box as root. I configured the backups with my root SSH key, but the Asterisk backup process runs on the Asterisk user. Make sure that the <a href="http://www.freepbx.org/forum/freepbx/general-help/ssh-backup-job-not-transmitting-to-remote-server" target="_blank">SSH keys you hand off to FreePBX are readable by the asterisk process</a>.</p>
<h3>Inbound + Outbound Call Volume Tuning</h3>
<p>Word of warning: I haven&#8217;t actually done this yet. These are the notes I&#8217;ve compiled, but I wasn&#8217;t able to get all this information together before the phone system was deployed.</p>
<p>Most of the <a href="http://www.voip-info.org/wiki/view/Asterisk+zapata+gain+adjustment" target="_blank">guides</a> I was able to find were a <a href="http://www.mattgwatson.ca/2008/05/howto-tune-zaptel-dahdi-fxo-interfaces-on-asterisk-pbx/" target="_blank">bit out of date</a>. When reading through those resources recall that Dahdi is the new Zaptel. There are two gain adjustments: inbound (rxgain) and outbound (txgain). In order to test the levels run the following command: dahdi_monitor 1 -vv. These levels can be calibrated against a 102 milliwat test number, I found one here: <strong>670-234-0102</strong>.</p>
<p>For the TDM800, here are the instructions from Digium on how to edit the two gain levels:</p>
<blockquote><p>The gains are typically edited in /etc/modprobe.d/dahdi.conf. The parameters are set like:</p>
<p>options wctdm24xxp fxotxgain=&lt;value&gt;db fxorxgain=&lt;value&gt;db fxstxgain=&lt;value&gt;db fxsrxgain=&lt;value&gt;db</p>
<p>The default value is -4.5db (decibels)</p>
<p>They can also be edited in /etc/asterisk/chan_dahdi.conf</p>
<p>rxgain=&lt;value&gt;<br />
txgain=&lt;value&gt;</p>
<p>In this case the &#8216;db&#8217; is assumed by asterisk. In chan_dahdi.conf the default value is 0.0.</p>
<p>We encourage you to make small changes to any of these values as it can dramatically effect your audio.</p></blockquote>
<h3>Misc Tips</h3>
<ul>
<li>If calls are dropping after a couple seconds, check your external IP in Tools &#8211;&gt; Asterisk IAX Settings</li>
<li>Uninstalling Asterisk modules:
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">/var/lib/asterisk/bin/module_admin uninstall endpointman</div></div>
</li>
<li>The Music on Hold directory is
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"> /var/lib/asterisk/moh/</div></div>
</li>
<li>Grabbing the DAHDI version from the command line:
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">dmesg|ack dah</div></div>
</li>
<li>To add a invalid extension or timeout fallback to your IVR / autoattendant add two options in the IVR GUI: i &amp; t (you specify i or t instead of a number) and then specify a action just like you would a normal IVR option.</li>
<li>Restart DAHDI &amp; Asterisk in one line:
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">service asterisk stop &amp;&amp; service asterisk start &amp;&amp; service dahdi stop &amp;&amp; service dahdi start</div></div>
</li>
<li><a href="https://raw.github.com/gist/1860966/7ef9ae8f073afef09e2e3312c3105a3e92c69f80/copy-default-directory.bash" target="_blank">Copy default directory.xml</a> to specific directory.xml&#8217;s for all Polycom devices linked to the EndPoint Manager</li>
<li>Location of HPEC license(s):
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;/var/lib/asterisk/licenses</div></div>
</li>
<li>Convert standard wav files into Asterisk / POTS compatible wav:
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">sox autoattendant.wav  -r 8000 -c 1 -s -w auto-new.wav resample -ql</div></div>
</li>
<li>Caller ID is not consistent across carriers. Some carriers can disregard caller ID information altogether.</li>
<li>I had trouble with the built-in Polycom phone restart script contained in the endpoint manager. I <a href="https://gist.github.com/1860966" target="_blank">wrote a quick script</a> to work with someone&#8217;s Polycom restart script as a workaround.</li>
<li>I originally tested the system on an XP100 clone card, and I&#8217;m pretty sure that was the source of this issue, but <a href="http://forums.digium.com/viewtopic.php?f=1&amp;t=79524" target="_blank">this information</a> was helpful in temporarily resolving that issue before I purchased the TDM800.</li>
<li>FXO hardware&#8217;s context must be set to &#8220;from-pstn&#8221; for the IVR to be routed correctly</li>
<li>If all your inbound calls are coming in as &#8220;Unknown&#8221; you might want to check with your service provider. According to my Verizon account rep, inbound calls can sometimes come in as Unknown on new lines if your account is configured incorrectly</li>
<li>Dashes and parentheses outbound numbers inputted into softphones seems to cause issues with dialplans</li>
<li>You can <a href="http://mabblog.com/blog/wp-content/uploads/2012/02/audacity_asterisk_export.png" target="_blank">export Asterisk compatible .wav</a> files directly from Audacity without using any command line tools to post-process the audio.</li>
<li>To <a href="https://getsatisfaction.com/sutus/topics/how_do_i_factory_reset_a_polycom_phone_if_it_has_been_setup_to_work_with_a_different_ip_pbx" target="_blank">reset a Polycom 321 phone</a>, reboot the phone and hold 1 + 3 + 5 + 7. The default admin password on these devices is 456.</li>
<li>In order to enable the &#8220;Line 2&#8243; button on the polycom phones you&#8217;ll need to edit the master configuration file and change the &#8220;reg.1.lineKeys&#8221; preference to &#8220;2&#8243;</li>
</ul>
<h2>References</h2>
<p>Here is a list of links I found helpful while researching this stuff.</p>
<h3>Polycom Phones</h3>
<ul>
<li><a href="http://techanswers.co.uk/2011/10/13/auto-provisioning-polycom-soundpoint-321-phones-with-elastixtrixbox/" target="_blank">10/2011 &#8211; Provisioning Polycom SoundPoint IP 321 Phones &#8211; Elastix / Trixbox</a></li>
<li><a href="http://www.robpeck.com/2010/09/auto-re-provisioning-polycom-phones/" target="_blank">09/2010 &#8211; Auto Re-Provisioning Polycom Phones</a></li>
<li><a href="http://www.voipsupply.com/blog/how-to-upload-firmware-to-a-polycom-unit" target="_blank">06/2008 &#8211; Upgrading Firmware on Polycom Phones</a></li>
<li><a href="http://voipsetup.100webspace.net/ipphone.php?afiles=updatePolycomFirmware.php" target="_blank">(old) How to Update Polycom IP Phone Firmware via FTP</a></li>
<li><a href="http://www.savelono.com/linux/fedora-10-asterisk-and-dhcp-option-66.html" target="_blank">01/2009 &#8211; DHCP Option 66 &amp; Asterisk</a></li>
<li><a href="http://www.freepbx.org/forum/freepbx/users/tftp-issues" target="_blank">08/08 &#8211; TFTP Server Issues</a></li>
<li><a href="http://www.krisk.org/asterisk/pcom/" target="_blank">Example /tftpboot Directory</a></li>
<li><a href="http://www.voipsupply.com/blog/wp-content/uploads/2009/09/UsingPolycomPhonesWithAsterisk.pdf" target="_blank">09/09 &#8211; Using PolyCom Phones with Asterisk</a></li>
</ul>
<h3>Asterisk</h3>
<ul>
<li><a href="http://www.mehrdust.com/archives/fighting-echo-on-pots-lines" target="_blank">09/2011 Fighting echo on POTS</a></li>
<li><a href="http://www.asteriskguru.com/" target="_blank">Asterisk Guru</a> (great guide on misc Asterisk setup)</li>
<li><a href="http://www.eflo.net/presentations/MattFlorell_Astricon_2010_musiconhold.pdf" target="_blank">Music on Hold Setup Slides</a></li>
<li><a href="http://www.asteriskblog.com/" target="_blank">Asterisk Blog</a> (some tips &amp; tricks)</li>
<li><a href="http://docs.tzafrir.org.il/dahdi-linux/" target="_blank">DAHDI Manual</a></li>
<li><a href="http://jacolyte.posterous.com/tutorial-how-to-get-asterisk-set-up-and-makin" target="_blank">Asterisk Setup Guide</a> (great resource) and <a href="http://jacolyte.posterous.com/asterisk-notes-part-1" target="_blank">Asterisk Notes</a></li>
<li><a href="http://shyju.wordpress.com/" target="_blank">General Asterisk Blog</a> (some interesting tips &amp; tricks)</li>
<li><a href="http://www.digium.com/en/products/analog/8-port/#documentation" target="_blank">Documentation for TDM800</a> and <a href="http://kb.digium.com/" target="_blank">Digium Knowledge Base</a></li>
<li><a href="http://www.mehrdust.com/" target="_blank">Reza Samimi&#8217;s Blog</a> (incredible resource, probably the most helpful thing I was able to find)</li>
<li><a href="http://www.teamforrest.com/blog/" target="_blank">Team Forrest Blog</a></li>
<li><a href="http://astbook.asteriskdocs.org/" target="_blank">Online Asterisk Book</a></li>
<li><a href="http://www.freepbx.org/support/documentation/administration-guide/creating-an-ivr" target="_blank">Creating an IVR (auto-attendant)</a></li>
<li><a href="http://jeremy-mcnamara.com/asterisk/how-to-configure-asterisk/" target="_blank">How To Configure Asterisk</a></li>
<li><a href="http://www.freepbx.org/news/2010-05-30/high-availability-backup-and-restore" target="_blank">General Information on Asterisk Backups</a></li>
</ul>
<h3>Software</h3>
<ul>
<li><a href="https://github.com/iloveitaly/printextensions/tree/prettyprint" target="_blank">Print Well Formatted Extension + Feature Code Lists</a></li>
<li><a href="http://www.voip-info.org/storage/users/28/4028/images/645/polycomdir.sh.txt" target="_blank">Polycom directory.xml Script</a></li>
<li><a href="http://iCanBlink.com/blink-pro.phtml" target="_blank">Blink</a> - Mac VOIP client. Paid.</li>
<li><a href="http://www.counterpath.com/x-lite.html" target="_blank">X-Lite</a> &#8211;  Mac + PC VOIP client. Free with ads or Paid.</li>
<li><a href="http://www.tlphn.com/" target="_blank">Telephone.app</a> &#8211; Mac VOIP client. Really simple, integrates with address book + growl. However, it seemed to &#8216;drop&#8217; its connection to the Asterisk server (people would call the extension and it would respond as busy despite the fact that the Telephone.app was on)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://mabblog.com/blog/2012/03/voip-business-system-asterisk-polycom-setup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Copy Path / Directory to Clipboard OS X Lion Service</title>
		<link>http://mabblog.com/blog/2012/02/copy-path-directory-to-clipboard-os-x-lion-service/</link>
		<comments>http://mabblog.com/blog/2012/02/copy-path-directory-to-clipboard-os-x-lion-service/#comments</comments>
		<pubDate>Fri, 24 Feb 2012 18:20:55 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://mabblog.com/blog/?p=519</guid>
		<description><![CDATA[Someone at work recently wanted an easy way to get the path of a file in a format he could paste into an IM or an email. I wrote up a quick applescript and bundled it into a service which enables a user to easily copy the path of a file to the clipboard. The [...]]]></description>
			<content:encoded><![CDATA[<p>Someone at work recently wanted an easy way to get the path of a file in a format he could paste into an IM or an email. I wrote up a quick applescript and bundled it into a service which enables a user to <a href="http://mabblog.com/software/copy_path_clipboard_service.zip" target="_blank">easily copy the path of a file to the clipboard</a>. The package also includes a service that copies the directory path of a given file to the clipboard.</p>
<p>The biggest use case for this service is for an office environment where many people are connected to the same drive externally via VPN or internally via ethernet. It is challenging to easily point a colleague to a specific file if your shared drive is badly organized (which, odds are, it probably is). This tool mitigates most of that issue and works consistently across machines.</p>
]]></content:encoded>
			<wfw:commentRss>http://mabblog.com/blog/2012/02/copy-path-directory-to-clipboard-os-x-lion-service/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

