Archive for the ‘General’ Category

Our GORGES Adventure

Wednesday, October 27th, 2010
Chris climbing

Chris climbs the tower.

In October we engaged the Cornell Team & Leadership Center for our annual retreat.  We spent an afternoon at the Hoffman Challenge Course, located just a few miles outside of Ithaca.  The weather could not have been better.

Jim Volkshausen, Paul Louis, and the other Cornell Outdoor Education staff were great,. They led us in team building exercises as we pushed ourselves through new challenges.

The first was to add one person at a time to a giant teeter-totter.  It took a while, but we were able to get our entire team on a seesaw platform without it tipping.  As you can imagine, it took planning, communication, coordination, and (you guessed it) teamwork.

Mia climbing

Mia Climbs Wall

We moved on to other challenges, such as having four of us climb separately and then stand together on a very small platform on top of a tall pole while team members on the ground managing our safety ropes.  Once we were up, there was only one way down – trusting the rope team and just jumping! 

The Cornell Outdoor Education staff helped us understand our “high-functioning” team behavior. Every event challenged our communication and problem-solving skills. And, it was all great fun.

Other activities included climbing the 64-foot-high tower wall and shooting down the zip line. We jumping off the tower free-falling 10-15 feet before swinging in a giant arc through the tree tops.

Four Jump Together Backward from Pole

Our toughest moment wasn’t physical but emotional – Rasmus’s wedding ring flew off during a high-pole maneuver. We could not find it in the wood chips and leaves, but Chris and Paul succeeded the next day with a rented metal detector.

Belaying Team Supports the Jumpers

Belaying Team Supports the Jumpers

Alex caught the ring’s descent on video camera, and was able to send the movie to Chris’s smartphone to direct the search. It had flown much farther than anyone thought, and without the video help it could have been lost forever. Hurray for high-tech gadgets!

We love the Cornell Outdoor Education crew, and hope to keep going back.  Jim and his crew were quick to point out that we had only touched on a few of the many activities that they offer.

worked in academia, corporate research labs and several technology startup companies prior to GORGES. His expertise is software architecture, database development, and system administration. Matt brings GORGES over 25 years experience developing fast and robust software on a multitude of platforms and languages.

Introduction to data recovery using open source tools

Sunday, September 19th, 2010

I have an old hard disk with corrupt NTFS volumes. I’m not sure how they got corrupt but they cannot be fixed using the standard chkdsk /f command. Fortunately, there’s a plethora of open source data recovery tools available. Two such tools are foremost and photorec which specialize in combing through hard drive partitions to recover files based on header information. They can even recover files after the disk or memory card has been accidentally erase.

Foremost is a Linux command-line tool originally developed by the U.S. Air Force. If you’re using a debian-based Linux distribution (e.g., Ubuntu), you can grab it using the command sudo apt-get install foremost. Foremost can recover common file types such as txt, jpg, avi, and etc.. It was last updated in 2008 which means that its knowledge of file headers is, at best, two years dated.

Photorec is part of the testdisk suite, which is a set of Linux command-line tools. If you’re using debian-based Linux, you can install it using the command sudo apt-get install testdisk. Testdisk not only “tests your disk” but also rebuilds your partition table. This is the tool to use if your hard drive’s master boot record or partition table is corrupt. Photorec, like foremost, recovers files (not just photos) based on file headers. In fact, photorec supports more file types and is more up-to-date than foremost, which is evident by the fact that I was able to recover more files with photorec than foremost.

The problem with both foremost and photorec is that they recover file content but not file names. So you end up with directories of randomly named files with only the file extension preserved. It’s not ideal but it’s still better than not having the data at all.

See also:

http://help.ubuntu.com/community/DataRecovery

GORGES CEO meets with Congressman Hinchey about job creation

Wednesday, July 14th, 2010

Recently, I had the opportunity to meet with Congressman Maurice Hinchey and other Ithaca entrepreneurs, at an open forum organized by the incomparable Brad Treat (thanks Brad!).

GORGES CEO Chris Grant meets with Congressman Hinchey

GORGES CEO Chris Grant meets with Congressman Hinchey

When the Congressman asked me about GORGES, I let him know about our rapid business growth over the last 5 years, primarily due to our innovation in Internet technologies, and our ability to help our customers businesses grow.

I also mentioned that we are actively keeping software development work from heading to offshore development companies, as our expert developers, low cost of living, and proven processes compete very well on the global market.  While our hourly rates may be higher than India, for example, our total cost to complete a project is often lower.

There are many reasons for this, foremost among them dedicated project management, a willingness to understand our clients’ business needs to create the right-fitting solution, as well as in-house experienced web developers and designers.

After hearing this, the Congressman remarked ‘Now this is the kind of company that America needs to create jobs and move this economy along’.

Just what we were thinking….

Christopher Grant, CEO of GORGES, has been building Internet web sites and commerce applications since 1994, pioneering early database-driven Web application and e-commerce projects. He has been instrumental in the construction of hundreds of Internet projects, large and small.

What is a Framework?

Tuesday, June 15th, 2010

Given the diversity of packages that call themselves frameworks, the broadest description we can give, is that frameworks for web development are collections of reusable software components for building websites (or web-based applications).

Frameworks generally belong to one of two camps, “pure frameworks” and “full stack frameworks”.

Most frameworks don’t make a distinction between “framework” and “application” features, and as a result they become cluttered. They also become more daunting to newcomers, with their sheer volume of classes that attempt to solve every practical problem a web developer might ever encounter – user management, document and image handling, upload and downloading, etc.

My favorite PHP framework, Yii, is a pure framework – free from the burden that many frameworks drag around, namely a full “application stack”. Yii consists almost exclusively of components and features designed to support certain practices or paradigms.

One of my favorite things about Yii, as compared to “full stack” frameworks, such as Zend, is that Yii only comes with components and architecture that can be rightfully said to belong in the “framework” domain, and not the “application” domain.

Of course, it may be hard in some cases to draw an exact line between the two, and I think the first criteria for selecting features that belong in the framework, and not in an application stack, should be:

• Is it absolutely general-purpose?
• If not, is it fully extensible?

Certain features, like the URL manager or Active Record, are not absolutely general purpose, in the sense that they may not satisfy every possible need anyone could ever have. But they are sufficiently general purpose in the sense that almost everybody is going to need at least the core functionality of those components. And because they are fully extensible, developers can build on top of them, rather than having to replace them, if they find that a component does not fully cater to their specific needs.

The reason why I do not want application features in a framework, is because I know from experience that these will not meet my strict requirements. I will eventually end up replacing many of these features and the existing features provided by the framework are reduced to baggage.

Everybody is different – we all have different goals, and even if we share some goals, we usually have different means for reaching those goals.

I believe the reason why we web developers converge around a framework, is because we agree on certain practices. The framework is designed to leverage those practices in a convenient and streamlined way.

The subtle art of the framework is to achieve accepted practice, without getting in the way of individuality – to enable us to adhere to the good practices that we agree upon, while still allowing us to be as different, as versatile and as colorful as we can!

In short, frameworks enable us to focus our efforts on “business logic”, the functionality that has real value to the website users. Thanks to the framework, we can focus on the practical requirements, without sacrificing the values that professional software developers care about: clean, maintainable and extensible code.

With a good framework, we can deliver value and high code quality, without charging extra for quality!

Rasmus Schultz has worked for web development companies, advertising agencies and a music software company during his extensive development career. His main strengths are software development and database design. Rasmus has more than a decade of experience with many development platforms, languages and standards.

Passwords that are Used by Groups

Monday, April 12th, 2010

There are good reasons to not make group passwords, but then there are times when it is the best method, such as during web application development. Then, there is the problem of how to generate these strong passwords and how to communicate about them.

Strong passwords are essential to data security. Passwords are easy enough to produce, but they are not as effective as they should be because human foibles lead to compromises. Humans find strong passwords hard to remember so they write them down. They find them hard to say so they send them in email to coworkers.

These problems can be overcome and it can even be fun.

Make the strong password by making it along with a mnemonic. Like this:

Which bear ate up my donut holes
Wb8^mdOs

Now we can refer to this as the “donut” password without giving much away and it is memorable.

We can also make a family of passwords:

Bears do not care for those expensive holes
B!c4t$Os

Is it useful to have two related passwords that may be called “the bear question” and “the bear answer”? Say, for the admin password and the staff password?

Assigning words to the shift characters on the number keys is the trick here, but not too tricky. “^” is top or up or above. “@” is at or each. “$” is money or cash or dollars ……
You get it.

Now we have pass words that can be remembered without using word combinations, i.e., thefudge, or word bastardizations, i.e., es$enti@l, either of which is easily cracked.

Now we also have passwords that can be named even in the presence of strangers without giving them away, you could just say, “Try the bear answer.”

You may also use these ideas to make your own private passwords.

While you are thinking about this, it is also a great way to generate “family passwords.”

Jane never cared for asparagus
jnc4asparagus or jnc4agus

Have fun!

Asterisk and Cisco VOIP Phones

Saturday, April 3rd, 2010

A few years ago we needed an office phone system.  Having a limited budget and being a tech-head, I decided to deploy Asterisk, an open-source PBX solution.  The outlays were minimal since we only needed a telephony card (Digium TDM400P), several VOIP  phones (GrandStream 2000 – hello, eBay!), and an old PC.  We chose to install Trixbox, which is based on Asterisk and promotes itself as easier to install than Asterisk.

After perhaps too much futzing, we ended up with a small business phone system without any monthly PBX charges other than the analog phone lines from the phone company.  We had an automated phone directory, the phones worked as intercoms, voice mail turned into attached WAV sound files send as e-mail.  I was able to add phone extensions easily.  I love Asterisk!

Perhaps the success went to my head, since I set my sights on a fancy conference room phone for our growing business.  I bought a used Cisco Polycom CP-7935 phone for 1/3rd the price of a new device.  I’ll admit it – I’m an amateur at telephony and didn’t know the difference between SIP and SCCP.  It turns out that Trixbox only supports SIP extensions by default, and this conference room phone requires SCCP channel protocol.

So finally I am coming to the purpose of this post – simple instructions on to hook up a Cisco VOIP phone (that only uses SCCP protocol) to Trixbox version 2.8.  The following instructions were gleaned from some Google searches, and I am summarizing them since no one had simple steps online for the most-recent Trixbox version.

First we need to install some packages and retrieve the most-recent version of an SCCP solution from SourceForge.  Do the following commands signed in as root user on your Trixbox server:

# yum install asterisk16-devel gcc subversion
# cd /usr/local/
# wget http://sourceforge.net/projects/chan-sccp-b/files/V2/Chan_SCCP-2.0_Final.tar.gz/download
# tar xvfz Chan_SCCP-2.0_Final.tar.gz/download
# cd /usr/local/chan_sccp-b_20090602
# make

If you perform the above steps, you will see that the make operation will not work without modifying some source code.  Thanks to a posting (http://lostentropy.com/2009/09/28/making-chan_sccp-build-with-asterisk-1-6/) I learned that I have to change a reference to a constant from CS_AST_CONTROL_T38 to CS_AST_CONTROL_T38_PARAMETERS.  Make this change to the file /usr/local/chan_sccp-b_20090602/sccp_pbx.c on line 587 using your favorite text editor.

# make
# make install
# amportal restart

Now comes the hard part.  The CP-7935 gets its provisioning file from a TFTP server.  Reset the CP-7935 to its default factor settings.  Next use the device menu to set the TFTP server to your Trixbox IP address (follow steps in the manual from the Cisco website).  The Trixbox should have its TFTP service activated by default; for my server the TFTP directory on the server is /tftpboot/.

Monitor the TFTP log file (/var/log/atftp.log) while you reboot the CP-7935.  You should see a request in the format “SEP#.cnf.xml” in the log file, where the “#” is the MAC address of the CP-7935.  Now create the following file /tftpboot/SEP#.cnf.xml (mine is /tftpboot/SEP00e0752442c5.cnf.xml) with this content and replacing the TRIXBOX_IP_ADDRESS with your Trixbox server address:

<Default>
<callManagerGroup>
<members>
<member priority="0">
<callManager>
<ports>
<ethernetPhonePort>2000</ethernetPhonePort>
<mgcpPorts>
<listen>2427</listen>
<keepAlive>2428</keepAlive>
</mgcpPorts>
</ports>
<processNodeName>TRIXBOX_IP_ADDRESS</processNodeName>
</callManager>
</member>
</members>
</callManagerGroup>
<authenticationURL></authenticationURL>
<loadInformation</loadInformation>
<directoryURL></directoryURL>
<idleURL></idleURL>
<informationURL></informationURL>
<messagesURL></messagesURL>
<servicesURL></servicesURL>
<versionStamp>{Apr 03 2010 12:00:00}</versionStamp>
</Default>

The last configuration entry tag for <versionStamp> is important since it is used by the device to determine if the settings have changed.  Update this versionStamp value to a later date to force the device to reload the settings in the file.

Next we need to write the SCCP configuration file that Asterisk reads. First make a backup of the existing file, and then we will replace it with one tailored for our solution.

# mv /etc/asterisk/sccp.conf /etc/asterisk/sccp.conf.bak

Here are the new contents for the file /etc/asterisk/sccp.conf, and remember to replace the all-capital letter phrases but the specifics of your setup, for example TRIXBOX_SERVER_IP_ADDRESS is replace by the IP address of your trixbox, and the SEP00e0752442c5 with the string “SEP” and the MAC address of your Cisco phone.  Our phone model is 7935, so you will also need to change this to your phone type.

[general]
servername = trixbox
keepalive = 60
debug = 1
context = from-internal
dateFormat = M/D/YA
bindaddr = TRIXBOX_SERVER_IP_ADDRESS
port = 2000
disallow=all
;allow=alaw
allow=ulaw
firstdigittimeout = 16
digittimeout = 8
digittimeoutchar = #
autoanswer_ring_time = 1
autoanswer_tone = 0x32
remotehangup_tone = 0x32
transfer_tone = 0
callwaiting_tone = 0x2d
musicclass=default
language=en
deny=0.0.0.0/0.0.0.0
permit=TRIXBOX_SERVER_IP_ADDRESS/255.255.255.0
localnet = 192.168.93.0/255.255.255.0
dnd = on
rtptos = 184
echocancel = on
silencesuppression = off
trustphoneip = no
tos = 0x68
private = on
mwilamp = on
mwioncall = on
blindtransferindication = ring
cfwdall = on
cfwdbusy = on
[devices]
type = 7935
autologin = CONFERENCE_PHONE_EXTENSION
description = Phone7935
keepalive = 60
transfer = on
park = on
cfwdall = on
cfwdbusy = on
dtmfmode = outband
imageversion = P00308000100
deny=0.0.0.0/0.0.0.0
permit=192.168.93.3/255.255.255.255
dnd = on
trustphoneip = no
private = on
mwilamp = on
mwioncall = on
device => SEP00e0752442c5
[lines]
id = CONFERENCE_PHONE_EXTENSION
pin = 1234
label = CONFERENCE_PHONE_EXTENSION
description = Conference Room
context = from-internal
incominglimit = 3
transfer = on
cid_name = Conference Room
cid_num = CONFERENCE_PHONE_EXTENSION
trnsfvm = 1
secondary_dialtone_digits = 9
secondary_dialtone_tone = 0x22
musicclass=default
language=en
rtptos = 184
echocancel = on
silencesuppression = on
line => CONFERENCE_PHONE_EXTENSION

We’re almost done.  Now restart the asterisk service:

# amportal restart

Finally create an extension in the Trixbox administrator interface, and make sure it matches the value of the CONFERENCE_ROOM_EXTENSION in the sccp.conf file above (we used “30″).  Do a hardware reboot of the conference room phone.

Missing from this posting is any explanation about firmware and provisioning.  Cisco sells firmware upgrades to their devices, and we bet that the existing firmware on the used conference phone device was sufficient.  Our bet paid off.

In summary, this solution may still take a few hours of work for your particular Cisco phone.  The payoff is grand – our office Trixbox solution saves us money daily by not having to lease or maintain an expensive private PBX system.

worked in academia, corporate research labs and several technology startup companies prior to GORGES. His expertise is software architecture, database development, and system administration. Matt brings GORGES over 25 years experience developing fast and robust software on a multitude of platforms and languages.
©2012 GORGES - All rights reserved
where programming meets design and lives happily ever after