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.

Proposals from a couple providers yielded total costs of a 10 hard phone + 10 soft phone system to be around $8, 000 – $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’t as hard or mysterious as it may seem at first.

Hopefully this compilation of notes will help someone in a similar situation develop and deploy a VOIP Asterisk based solution. Enjoy.


  • POTS = Plain Old Telephone Service = Analog Lines = Copper Lines
  • 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)
  • 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).
  • PBX = Private Branch Exchange. This is box that sits between your telephone endpoints (SIP trunk or POTS) and your phones connected to your lan
  • 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 ‘pre-built’ / commercial PBXs have POE built in. In my setup I purchased a NetGear FS728TP-100NAS
  • TFTP = Trivial File Transfer Protocol. The Polycoms (and many other phones) use TFTP to pull their application binary, configuration settings, and other information.
  • ARP = Address Resolution Protocol. I don’t really understand this piece too much, but
  • FreePBX / Elastix = GUI for the Asterisk configuration files
  • DAHDI = software that integrates with Digium (and other) analog and digital PCI hardware devices. This used to be called Zaptel. This software runs on the driver level of operating system (it isn’t a service like Asterisk). Essentially is bridges asterisk with POTS or SIP trunks.

Basic System Overview

  • Separate cat6 voice + data lines to each work station
  • Data lines connected to gigabit switch
  • Voice lines connected to POE 10/100 switch referenced above
  • POE switch tied to the gigabit switch via 2 gigabit ethernet ports
  • Asterisk running on couple-year-old Dell dual-core 2.8ghz, 3GB of ram, gigabit ethernet
  • Asterisk box (PBX) connected to gigabit switch
  • 6 POTS lines through Verizon
  • 10 Polycom SoundPoint 321
  • 10+ Softphones
  • Remote users accessing PBX via VPN
  • ack instead of grep on the command line
  • Asterisk, FreePBX, DAHDI, CentOS 2.6.18-274.17.1.el5 (`uname -r`)

Setting Up an Asterisk-Based VOIP System with Polycom Phones

Basic AsteriskNOW Installation Procedure

There a couple ways to handle Asterisk installation, and a couple GUIs to choose from. I settled on AsteriskNOW + FreePBX GUI. 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’ll have to update the FreePBX software. You can sort of do this through the FreePBX module interface, but there was an extra step involved that I couldn’t find my notes on.

Duplicate IP Message on Polycom 321 Phones

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.

Updating Polycom 321 Firmware via TFTP

The Polycom devices support both FTP + TFTP configuration + boot loading. However, I was trying to simply the setup as much as possible and trivial 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.

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:

$ tftp pbx.localhost
tftp> get LoudRing.wav
Received 128810 bytes in 0.1 seconds

Sending Phone Boot Server via DHCP

Apparently there are many parameters 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:

  • option 66: tftp://pbx.localhost
  • option 160: tftp://pbx.localhost
  • option 150: tftp://pbx.localhost
Note that the “tftp://” 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.

Upgrading the Polycom BootRom & Sip.ld (Application)

This was a bit tricky, and I did not document exactly how I got to it work, but here are some pointers. You’ll need to download “UC_Software_3_3_3_release_sig_split” the not the latest ”UC_Software_4_0_1B_release_sig_combined.zip” from Polycom support. Looking at the end point manager’s package.json it seems as though the latest supported version is 3.3.3. I tried downloading the split version but it didn’t seem to work as well for me. You’ll also need to download the latest BootRom ”spip_ssip_BootROM_4_3_1_release_sig.zip”. After downloading these pieces you’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:

-rw-rw-rw- 1 asterisk asterisk 2437 Feb 20 14:30 000000000000.cfg
-rw-rw-rw- 1 asterisk asterisk 2079 Feb 18 15:39 0004f2a8077e.cfg
-rw-rw-rw- 1 asterisk asterisk 7470 Feb 18 12:53 0004f2a8077e_reg.cfg
# ... (more configuration)
-rwxr-xr-x 1 asterisk asterisk 639624 Jan 27 14:27 2345-12360-001.bootrom.ld
-rwxr-xr-x 1 asterisk asterisk 3322061 Jan 27 14:41 2345-12360-001.sip.ld
-rwxr-xr-x 1 asterisk asterisk 7591196 Jan 27 13:45 bootrom.ld
drwxr-xr-x 2 asterisk asterisk 4096 Feb 18 14:34 contacts
drwxr-xr-x 2 asterisk asterisk 4096 Jan 26 14:59 licenses
drwxr-xr-x 2 asterisk asterisk 4096 Feb 18 12:53 logs
-rw-rw-rw- 1 asterisk asterisk 127966 Feb 20 14:30 LoudRing.wav
drwxr-xr-x 2 asterisk asterisk 4096 Feb 13 16:12 overrides
-rw-rw-rw- 1 asterisk asterisk 8537 Feb 20 14:30 sip.cfg
-rwxr-xr-x 1 asterisk asterisk 14 Jan 27 14:41 sip.ver
drwxr-xr-x 2 asterisk asterisk 4096 Jan 26 14:59 SoundPointIPLocalization
-rw-rw-rw- 1 asterisk asterisk 95926 Feb 20 14:30 SoundPointIPWelcome.wav

I’m not sure if you needed an updated bootrom.ld and the specific 2345-12360-001.bootrom.ld; but it worked.

Using End Point Manager to Generate Configuration XML for Polycom

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 (list of .tar.gz versions can be found here, GitHub repo here. After installing, go to advanced options and set “Time Server” to “pool.ntp.org” and nmap to “/usr/bin/nmap” (you may have to install nmap via yum, I can’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 download the “provisioner_net.tgz” and manually upload the package via the “Manual Endpoint Modules Upload/Export” under “End Point Advanced Settings.”

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 & 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.

Default “Phone Book” / Directory on Polycom

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 this modified version of the printextensions module, copying the XML into the `000000000000-directory.xml` file, and then running this BASH script to copy the default to each of the phones custom directory.xml files. Do not use this with a production system as it will overwrite any users customizations.

Installing Git on CentOS (Default AsteriskNOW OS)

Yum is the default package manager on CentOS, but the default repos don’t contain git. I wanted to pull in my dotfiles 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:

rpm -Uvh http://repo.webtatic.com/yum/centos/5/latest.rpm
yum install --enablerepo=webtatic git-all

Software vs Hardware High Performance Echo Cancellation (HPEC)

This is specific to Digium based cards. I didn’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 same for the software based and hardware based echo cancellation. The CPU load on my installation hovers around 1%, I’m guessing for a < 20 person office environment the software based echo cancelation would of worked just fine (although I don’t have experiential evidence to support this).

Call Logging

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:

Call Detail Record (CDR) settings
Logging: Enabled
Mode: Simple
Log unanswered calls: No

* Registered Backends

If your installation is working correctly. Mine wasn’t, working off this guide, the following BASH commands worked for me:

# check if the mysql addons are installed
yum list installed|ack mysql

# if they aren't, install the mysql addons
yum install asterisk18-addons-mysql

Digium Has Incredible Customer Support

I was throughly impressed by the quality of Digium’s customer support. They answered non-hardware related questions, ssh’d into my machine to debug some issues, and there was a less than one minute wait time.

Outbound Call Configuration

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:

Asterisk Outbound Route Configuration

Asterisk Outbound Trunk Configuration

POTS Call Tuning

Different POTS lines have different levels and other ‘analog stuff’. To clear out noise and optimize your configuration you need to run the following script (retrieved from a Digium rep):

service asterisk stop
# tunes impendence on the analog lines
fxotune -x -i

# restart dahdi and start asterisk
service dahdi stop && service dahdi start
service asterisk start

Setting up IVR Auto Answer

Configure your IVR, then go to Setup –> Inbound Routes. Choose “any DID / any CID”. At the bottom of the page switch “Destination” to IVR + desired auto attendant.

Configuring Backups

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 SSH keys you hand off to FreePBX are readable by the asterisk process.

Inbound + Outbound Call Volume Tuning

Word of warning: I haven’t actually done this yet. These are the notes I’ve compiled, but I wasn’t able to get all this information together before the phone system was deployed.

Most of the guides I was able to find were a bit out of date. 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: 670-234-0102.

For the TDM800, here are the instructions from Digium on how to edit the two gain levels:

The gains are typically edited in /etc/modprobe.d/dahdi.conf. The parameters are set like:

options wctdm24xxp fxotxgain=<value>db fxorxgain=<value>db fxstxgain=<value>db fxsrxgain=<value>db

The default value is -4.5db (decibels)

They can also be edited in /etc/asterisk/chan_dahdi.conf


In this case the ‘db’ is assumed by asterisk. In chan_dahdi.conf the default value is 0.0.

We encourage you to make small changes to any of these values as it can dramatically effect your audio.

Misc Tips

  • If calls are dropping after a couple seconds, check your external IP in Tools –> Asterisk IAX Settings
  • Uninstalling Asterisk modules:
    /var/lib/asterisk/bin/module_admin uninstall endpointman
  • The Music on Hold directory is
  • Grabbing the DAHDI version from the command line:
    dmesg|ack dah
  • To add a invalid extension or timeout fallback to your IVR / autoattendant add two options in the IVR GUI: i & t (you specify i or t instead of a number) and then specify a action just like you would a normal IVR option.
  • Restart DAHDI & Asterisk in one line:
    service asterisk stop && service asterisk start && service dahdi stop && service dahdi start
  • Copy default directory.xml to specific directory.xml’s for all Polycom devices linked to the EndPoint Manager
  • Location of HPEC license(s):
  • Convert standard wav files into Asterisk / POTS compatible wav:
    sox autoattendant.wav  -r 8000 -c 1 -s -w auto-new.wav resample -ql
  • Caller ID is not consistent across carriers. Some carriers can disregard caller ID information altogether.
  • I had trouble with the built-in Polycom phone restart script contained in the endpoint manager. I wrote a quick script to work with someone’s Polycom restart script as a workaround.
  • I originally tested the system on an XP100 clone card, and I’m pretty sure that was the source of this issue, but this information was helpful in temporarily resolving that issue before I purchased the TDM800.
  • FXO hardware’s context must be set to “from-pstn” for the IVR to be routed correctly
  • If all your inbound calls are coming in as “Unknown” 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
  • Dashes and parentheses outbound numbers inputted into softphones seems to cause issues with dialplans
  • You can export Asterisk compatible .wav files directly from Audacity without using any command line tools to post-process the audio.
  • To reset a Polycom 321 phone, reboot the phone and hold 1 + 3 + 5 + 7. The default admin password on these devices is 456.
  • In order to enable the “Line 2″ button on the polycom phones you’ll need to edit the master configuration file and change the “reg.1.lineKeys” preference to “2″


Here is a list of links I found helpful while researching this stuff.

Polycom Phones



Average Rating: 5 out of 5 based on 191 user reviews.

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 package also includes a service that copies the directory path of a given file to the clipboard.

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.

Average Rating: 4.6 out of 5 based on 297 user reviews.

Recently I was involved in a project moving a company’s files from a old 2003 windows exchange server to a mac mini server setup. The first setup was to move from Exchange’s email and calendaring to Google Apps. After that step was complete we moved the shared files drive over to thunderbolt RAID 5 storage attached to a mac mini server device. The transition was pretty smooth, however there was one problem which wasted a significant amount of time.

The accountant’s in the organization use QuickBooks 2010 for all accounting purposes. Moving to a hosted solution was not an option, and they needed multi-user access to the file (2-3 people could be working on the same quickbooks file at any given moment). Our old 2003 server had quickbooks database server installed which seemed to work fine. Unfortunately, if you are not an ‘enterprise’ quickbooks customer there is no linux version of the database server available. There was an old windows box lying around (fairly fast: dual core 2.8ghz, 3GB ram) that would be a perfect fit (or so I thought…) for a quickbooks server. Wiped the box, installed Windows XP with all updates, removed all crapware, installed quickbooks database software, but had significant trouble getting quickbooks database server to work correctly.

I ran the QuickBooks Network Diagnostic tool, but it did not report any errors. When opening the QuickBooks file from a client machine in multi-user machine the login prompt would come up fine, but after entering the correct login information it would time out with an error message stating a connection issue (H202) and suggesting using an ‘alternative’ method (there was a significant delay in between initiating login and getting a response). Note that QuickBooks at this stage would correctly report an incorrect password.

The network setup in the location where this was occurring had a local server running DNS. The QuickBooks server had a static IP set.

Here are some general notes on setting up QuickBooks:

  • Some mentioned that anti-virus software on the client machine causes slow operation. This didn’t seem to make in a difference in my case.
  • Tried turning firewall off on server + client machines: no difference (proper port settings were already in place)
  • Pulling data off of the shared QuickBooks folder on the XP machine wasn’t bad: 15MB/sec on a badly engineered 10/100 network (there are 5-port 10/100 switches in probably 5-10 locations around the office)
  • Opening the QuickBooks file in single-user mode from a client machine worked fine
  • Launching QuickBooks 2010 on the server and opening the file in multi-user mode, then opening the file from client machines worked fine as well
  • The significant delay between the login screen and the error messages pointed to some sort of look-up timeout, but given that file access to the machine was fine, this didn’t make a ton of sense. However, this seemed to be part of the issue.
  • It is important that the daemon process for QuickBooks Database Server is part of the administration group
  • On another note: some great information on backing up QuickBooks
  • How to schedule backups of QuickBooks from the QB Pro interface

What finally fixed the problem was adding the computer-name (aka server name or BIOS name) to the hosts file. Opening up quickbooks is still painfully slow, but at this point it works.

Update 02/24/2012

After moving (and completely eliminating the windows server from the network) problems ended up cropping up again. QuickBooks seemed to rely on the WINS (a crappy windows replacement for DNS) server to some extent. After editing the lmhosts file (same location as hosts file in windows) and manually adding the NetBIOS entries everything seemed to work. Note that there is not a lmhosts file by default! There is a lmhosts.sam (should for sample). To active the file you have to remove the extension (watch out for hidden extensions). On the machines that are using quickbooks both the hosts and lmhosts file have manual entries for the QB server. Not sure if this is necessary, but it worked.

Update 08/25/2012

The Windows XP QuickBooks Server will seemingly disappear from the network. You can still ping the machine, still access it directly via mouse + keyboard, but accessing the file system or connecting to the quickbooks database will cease to work. I don’t have enough windows knowledge to know if this is a windows bug or not, but I’ve scheduled an automated restart twice a week and this seems to fix the issue.

Average Rating: 4.6 out of 5 based on 266 user reviews.

Recently I was part of transitioning the email system of a 20+ employee business off of a Microsoft Exchange 2003 server to Google Apps. Moving close to half a million emails to a new email service was a big decision. The transition tools that Google has in place are pretty good, albeit slow for that many emails, Google throttles email transfer to one each second after the first 500. However, the one piece that was missing was a good tool to transition outlook server rules. Many employees used those rules extensively and many had 50-100 rules. Outlook does not have any method in place for extracting those rules. There is no built in way to getting any sort of list or descriptions of the rules, if one wanted to transition the rules manually they would have to click on a rule, look at the pop-up window, and recreate the rules in Gmail using the filters functionality – repeating this two step process for each rule. Horrible.

This would waste many hours of valuable time so I started hunting for a better solution. There is an API in Outlook 2007 or higher that enabled access to rules. There isn’t much example code available, and to my surprise I couldn’t find any VB script to export a CSV of all the rules associated with an outlook account! I hacked together a really rough VB script which exports Outlook rules (only one rule type right now, thats all I needed for my use case) as a CSV and then wrote a small ruby script to generate a XML doc of the rules for import via Gmail’s import / export available through Gmail labs. It works fairly well assuming you have an updated version of Outlook 2007 or higher.

Google Apps Transition Notes

  • The server migration tool pulled in some calendar events that employees claimed they deleted long ago.
  • The Google Mail Uploader application for Mac is not consistent. It wouldn’t pickup mail on some computers. Doesn’t handle folder hierarchy (flattens everything). Use the server migration tool instead.
  • Mail.app folder doesn’t update folder’s unread count immediately. This might be an isolated issue with Lion.
  • I had a problem with one Mac machine (10.6) where the inbox would randomly appear blank. Clearing all Mail.app support / cache files and adding the mailbox with message + attachment cache disabled fixed the issue (after mail downloaded I enabled cache again).
  • Gmail doesn’t seem to handle lots of folders (labels) well. Mail.app seems to be a lot slower with multiple folders.
  • Hiding the automatic All Mail, Misc, Follow-up, etc folders was helpful for those who were not familiar with gmail.
  • Changing some of the local settings on Mail.app makes Gmail play a bit nicer.
  • Still can’t find a good solution to allowing a user that is an administrator of another user’s calendar to create an event with the organizer being marked as the calendar’s creator. Use case: administrative assistant managing an executive’s calendar.

Average Rating: 4.6 out of 5 based on 286 user reviews.

I’ve been throwing a decent amount of code on GitHub + Gist recently; I wanted to highlight a couple of the projects that the community might find useful.

eBay PHP Framework Wrapper

There isn’t a ton of documentation or examples around the eBay PHP Accelerator toolkit. Actually, I think it has been a couple years since the framework itself has been updated. I’ve put together a small eBay PHP library with some generic posting and searching wrapper functions. The code was pulled out of an active project and still has some references to the context in which it was situated, but it should provide a good starting point to anyone looking to work with the eBay PHP framework. In additional to providing some wrapper functions, it also has some fixes to the underlying eBat NS framework.

NetSuite PHP Framework Wrapper

Similar to the eBay wrapper library, I’ve made a wrapper around the PHP NetSuite framework. Although the library is structured as a Kohana 2 library, it would be fairly easily to rearrange the library for use in another PHP framework or as a standalone library. The wrapper provides some useful information about working with custom record types (reading + writing) and some wrappers around some trickier NetSuite functionality. The library also provides fixes to the underlying netsuite PHP framework . If you have been having trouble with the NetSuite framework throwing errors when returning a valid SOAP response, take a look through the commit log and pull out the patches.

Tumblr + Kohana

If you are looking to integrate a Tumblr blog with a custom design take a look the phumblr library which provides an easy way to integrate Tumblr via a PHP interface.

Average Rating: 4.7 out of 5 based on 204 user reviews.

After reading the official MacRuby docs on deployment, I read over this guide. Although the deployment build seemed to be working fine on my local machine when I dropped it on my laptop with a standard Lion install it crashed, claiming that there was an defined constant – but that constant was a class. How could it be undefined if it ran fine locally?

Looking into it a bit more the class that was undefined was being used as a superclass for another ruby class. Taking a look at rb_main.rb revealed that there is no specific load order. Since the load order was undefined, the class requiring the other ruby class as a superclass was being loaded before the superclass was loaded. I ended up tweaking the rb_main.rb file to allow for a manual load order, followed by the standard automatic load.

# Loading the Cocoa framework. If you need to load more frameworks, you can
# do that here too.
framework 'Cocoa'

# Loading all the Ruby project files.

# manual load allows up to specify the load order for some of the classes
manualLoad = ["VTiTunesHeader"]
for file in manualLoad
require file

manualLoad &lt; &lt; File.basename(__FILE__, File.extname(__FILE__))

# Auto load the direct of the files in the dir
dir_path = NSBundle.mainBundle.resourcePath
Dir.glob(File.join(dir_path, '*.{rb,rbo}')).map { |x| File.basename(x, File.extname(x)) }.uniq.each do |path|
if not manualLoad.include? path

# Starting the Cocoa main loop.
NSApplicationMain(0, nil)

You can grab the gist here.

Cocoa Resources

Some Cocoa libraries / snippet repos that I found during my latest dev session.

Random Tidbits

  • Although old news to most, you can grab the the last n bytes of a file using tail -c. Very useful for cutting down on the size of large text log files.
  • I pulled the build versioning code out from a project I was working on. Take a look at this build numbering gist, provides source to pull version number from git or svn and write it in your Info.plist
  • The Ruby logging class is more robust than the Log4r class and the built in logger class.
  • attr_accessor :variable makes a instance variable Key Value Coding compliant. Just set @variable in your initializer.
  • Awesome side-by-side reference sheet for PHP, Ruby, Perl, and Python. Handy reference to python to ruby conversion.
  • Obj-c blocks in MacRuby
  • Although you can `macgem install json`, macruby comes with a json library built in that seems to have tweaks for deployment. Don’t install the json gem
  • The Open3 Ruby library does not return subprocess status correctly when using MacRuby
  • Online version of “MacRuby: The Definitive Guide”
  • PyObjc on Lion is dead. Although you might get an application to run, there are so many bugs it really isn’t usable for production
  • Although macrubyd exists, it doesn’t seem to work with full-fledged Cocoa + MacRuby apps. There isn’t any Xcode integration. Ruby-Debug also doesn’t seem to be compatible with MacRuby. Bottom line: no strong debugging tools for MacRuby… yet.
  • The “throw your dotfiles on github” trend has been an interested learning experience for me

Average Rating: 4.4 out of 5 based on 267 user reviews.