Fri, Sep 10, 2010
emailpassword
 
Remember
Blog Search
Blog Categories
Blog Latest Comments
Nice. Thanks for the update, Brian.
by Hunter Eskew on Friday, 03 September 2010
Fine question, Gadgeteer. We have recently implemented different security levels of dev keys; both a Read key which can...
by Dugan on Friday, 09 July 2010
hmm. isn't exposing the devkey to the javascript in the browser a security whole?
by gadgeteer on Monday, 07 June 2010
If the parent Div that holds your TriggerServerModule is initially hidden, the ajax will automatically be invoked when t...
by Anonymous on Tuesday, 25 May 2010
Minor correction: I didn't think it was easy to break out of a loop :)
by TJM on Monday, 01 March 2010
Page of Total items: 10

firstprevnextlast

Subscribe to this blogThePort Labs
Welcome to ThePort's Engineering Blog
Comments (1) | Add Comment
In our continuous effort to improve the platform one of our most valuable tools is feedback and ideas from you, our users. Over the years the majority of our best improvements have come directly from thePort's most creative and experienced collective brain - our customers.

As an example, several months ago we introduced the ability for administrators to create entirely new pages built around a library of draggable 'widgets' - removing the need for a skilled developer to hand-code new pages. After introducing our first drag and drop interface, we got a lot of positive feedback and suggestions for improving the tool to make it easier and more powerful.

This morning we pushed a hotfix that incorporates several improvements to the drag and drop functionality, most of which came from your feedback. One of the most difficult parts of the drag and drop concept is the need to satisfy two competing masters - the need to improve its power and flexibility while also keeping it simple and easy to use.

After listening it became clear to us that we needed to better communicate how it all worked so we've added a help feature to the drag and drop pages that provides some instructions. Admins see a more detailed version of these instructions than users do. Feel free to make suggestions about additions or clarifications to these instructions.

In addition we've provided more flexibility to the widgets themselves. Now the title bar on widgets can be hidden or shown to your end user, independent of if the widget is locked or not (previously, locked widgets never showed a title bar). The visibility of the title bar is indicated to you, the administrator, by a new icon in the upper left corner of the widget. You can also still customize the title's text and background color.

For consistency the widget titles themselves now automatically adopt the style of the rest of the titles on your site (previously they had their own style - now they use class=ContentTitle).

Also, the shape of the cursor will change when moving over an unlocked widget's title to indicate that the widget is draggable.

Being an interim release these are just a few of the ideas we got from you. Many of your ideas will come as improvements in future releases, but today's hotfix is an example of how important your feedback is to what we do here.

If you have ideas for product enhancements (or updates to existing features) check out our Feature Requests blog. You can vote on items you'd like to see or add your own.
TJM
Posted by: TJM
Monday, 23 August 2010
Comments (0) | Add Comment

ThePort is actively looking for a systems administrator.  If you're versatile (we're primarily a Microsoft shop but have MySQL, Java, and Apache to support as well), enjoy a good challenge (we handle 30 million page views a month and roughly 600 database transactions per second), and think you're good at foosball, you may be the perfect candidate. A little more about the job:
  1. We're located in Atlanta
  2. We have flex hours and a work from home policy
  3. We want to do more with virtualizing our platform
  4. We need a better staging environment
  5. We have good monitoring but want someone to take ownership of it
More can be found in our job requirements here

Send all resumes to tj@theport.com

p.s. We have beer in the fridge most Fridays. What's not to like about this job?
Categories:  Job Descriptions
Comments (0) | Add Comment
Let me ask you a few questions...

* Are you new to Selenium and not sure how to get started?
* Have you recorded some scripts but don't know how to edit them?
* Having a tough time moving your scripts into tools such as Selenium RC, SVN or NUnit?
* Not sure how to cross-browser test when Selenium runs in Firefox only?
* Is there an error in your script and you have no idea why?
* Not sure what you should automate first?
* No 'go-to' resources in your organization so not sure how to automate on your own?


Believe me, these are all questions we have all had while using Selenium. Soon after using Selenium, you find out it is not as easy as 'record and playback'. To get the full benefits of Selenium, you will be required to dive deeper into the tools. I know, I know, how do you do that? Don't be scared... I have done all the work for you. I'm going to direct you to tools, websites, blogs and training that can help!

Selenium Website - Get started here!

IDE - http://seleniumhq.org/projects/ide/
RC - http://seleniumhq.org/projects/remote-control/
Grid - http://selenium-grid.seleniumhq.org/

Support Groups
- If you don't do anything else, become a member of a Selenium User Group. Post your question and you will get the help you need from other Selenium users and Selenium developers/support staff. Its a must have people! Here are two that I recommend:

http://groups.google.com/group/selenium-users/topics
http://wiki.openqa.org/display/SIDE/Home

Documentation - user manuals and simple instructions on how to get started.

http://seleniumhq.org/docs/
http://www.codediesel.com/php/selenium-ide-tutorial-part-1/
http://www.codediesel.com/php/selenium-ide-tutorial-part-2/
http://www.jroller.com/selenium/
http://www.testinggeek.com/index.php/testing-tools/test-execution/99-selenium-remote-control-introduction

Video Tutorials


http://agilesoftwaredevelopment.com/videos/functional-testing-selenium-ide
http://vimeo.com/4671653
http://www.youtube.com/watch?v=JM4GldTw_Cw
http://www.testinggeek.com/index.php/testing-tools/test-execution/166-selenium-ide-rc-workshop-tutorial
http://www.mefeedia.com/watch/28363549

Add-ons and tools to use along with Selenium
- you will need many of these tools so check them out!

http://agiletesting.blogspot.com/2006/01/useful-tools-for-writing-selenium.html
http://saucelabs.com/blog/index.php/tag/selenium-rc/
http://robfletcher.github.com/grails-selenium-rc/docs/manual/index.html
http://getfirebug.com/
https://addons.mozilla.org/en-US/firefox/addon/1095/
http://www.kavinschool.com/Courses/Selenium/Day1/Selenium%20Tutorial%20Day%201-3%20-%20Useful%20Tools.pdf (its says for Ruby however the tools mentioned are great for all languages used)

Blogs
- very helpful information

http://googletesting.blogspot.com/2007/09/seleniums-inventor.html
http://blog.karit.geek.nz/2010/07/selenium-grid-part-1-getting-started.html

NUnit and Selenium RC

http://thetestingblog.com/2009/09/10/selenium-rc-in-c-using-nunit-an-end-to-end-example/
http://devio.wordpress.com/2008/09/30/automated-web-application-testing-using-selenium-and-nunit/
http://www.theautomatedtester.co.uk/tutorials/selenium/selenium_csharp_nunit.htm

Selenium Training - I found out the hard way that there is not much in the way of formal training for Selenium. But here are a few that I would recommend.

http://www.rttsweb.com/training/courses/selenium.jsp
http://marakana.com/training/testing/selenium.html
http://www.kavinschool.com/Courses/Selenium/Index.html (you can download all training material free in either PDF or PPT format)

Let me know how helpful this information is to you and rate my blog!


Categories:  selenium, training
Hunter Eskew
Posted by: Hunter Eskew
Monday, 19 July 2010
Comments (0) | Add Comment
Design By Contract is a fancy way of describing a really nice way of embedding logic within objects that ensure certain, necessary conditions are met within a method before (or after) underlying logic is called.   The embedded logic is the "contract" that is enforced whenever the method is called.  And it's far more effective than just commenting the code and hoping that callers use it the correct way.  The term Design By Contract was coined by Dr. Betrand Meyer with the creation of the Eiffel language, but the concept is language-agnostic to be sure. 

Preconditions checks determine if the caller obeyed the rules and postcondition checks determine if the method behaved properly.  I must admit that we use the precondition logic far more at this point.  
Read More
Brian Klippel
Posted by: Brian Klippel
Thursday, 15 July 2010
Comments (0) | Add Comment
Queuing means a lot of things to a lot of people. I'm going to explain what it means when we say we are introducing a queuing mechanism here at ThePort. This is a platform scalability and performance enhancement that has been highly anticipated internally.

The reasoning behind the queue is straight forward. Get slow track operations out of the user's fast track. This is especially viable when the operation is not particularly time sensitive. When an operation is queued the bulk of its work and time are taken out of band, and replaced with a simple and predictable write to the queue. Anything time consuming can fall into this category; be it database updates, photo conversions or bulk cache modifications. For example, a user should not need to wait on his last login date to be updated as he is logging into the site. They simply want the next page to load quickly. This is generally what we mean when we refer to the fast track, things that a user does frequently. Slow track operations are those that happen infrequently, and need immediate results. Administrative pages are often in this category, and queuing is undesirable because it could interfere with the timeliness of information.

Now, it's time for the technical highlights. A more complete name for our new queuing system might be a "generic object oriented method queue". The foundation is Microsoft SQL Service Broker. From our client, any object in our platform can be packaged with its data, a method to call, and any necessary parameters and sent to the queue. Using load balancers, multiple redundant queues may be used seamlessly to provide fault tolerance. In the queue, the operations are persisted to disk and inherit the stability and consistency of Microsoft SQL Server. Independently, an application server farm constantly polls the queue, or queues, for items to process via a Windows service. When an item is taken from the queue, the item is de-serialized, and reflection is used to invoke the desired method.

That's all there is to it. Our new queuing mechanism goes live with our Q3 release. 
 

Anonymous
Posted by: Anonymous
Tuesday, 25 May 2010
Comments (1) | Add Comment
Just a quick helpful hint on something I've been asked a few times of late. When executing a server module in our XSLT template system, you can do it one of two ways:

ProcessServerModule or TriggerServerModule

The difference between the two is subtle, especially if you're looking at it from the user's perspective. But under the hood, the different is definitely noteworthy.

ProcessServerModule
You want to use ProcessServerModule in most cases. This logic does the processing at the server and sends the output down as rendered HTML to the client. If you view source, you'll see the HTML of the module

TriggerServerModule
The TriggerServerModule is also rendered on the server, however, instead of sending rendered HTML down to the browser, it sends an AJAX call that can be triggered by some event (onClick, onBlur, etc). So if you do a view source, you'd only see the AJAX call and not the rendered output. This is a handy method to use if you're loading modules hidden behind tabs or other event driven code. 

Comments (2) | Add Comment
As you may be aware, we have been exposing Port2Port apis via xml for some time now. Xml is great for server-to-server calls where the caller (i.e. "you the developer") wants to fetch an xml representation of some object in thePort's system, do something with that xml, and then serve it out however you see fit. However, a question we had been getting quite often is "Sure, I can work with xml, but what I'd really like to do is more client-side calls directly to your api's and let my javascript process that data".

Enter JSONP or "JSON with padding". Our apis now allow you to submit the name of your method in the querystring:


Notice "callback" specified in the querystring. Supplying this will take the Json payload and wrap your method around it before it comes back to the client. That javascript method will then execute as expected.

Further JSONP reading here.

TJM
Posted by: TJM
Friday, 19 March 2010
Comments (0) | Add Comment
We just published a few new helpful debug commands for use by XSL authors.

tp_info=1

Need to know the unique identifier for a given group or user? Or the XSLT that's rendering that page? Or any other info that's passed in the querystring? Pass this in via querystring (http://community.theport.com/?tp_info=1), view source, and search for "URL::". You'll see the raw URL.

tp_script=1

Another querystring param, this will highlight all of the modules on the page and tell you their name. Very handy if you're looking at a page with a collection of modules and aren't sure of their name.

Hope this is helpful to all the template authors out there!


dbeachum
Posted by: dbeachum
Wednesday, 17 March 2010
Comments (0) | Add Comment
In order to stay competitive, our business is under tremendous pressure to continuously release new products and enhancements. Ensuring our testing processes are efficient and reliable can be a great challenge; it’s definitely a balancing act and one we take very seriously.

Quality is the number one requirement for any product or service. At ThePort Network, we believe if you’re out of quality, you’re out of business.

Our Quality Assurance team focuses on testing three main areas:

1) New Customer websites

2) New Products

3) Enhancements to our current platform

In all areas of testing, we provide comprehensive functional and regression testing using several methods. In the past, we have been a “manual” test shop, which has been incredibly time consuming. Adding tools, like Selenium IDE has given us the ability to streamline our regression testing processes, which will save us time and continue to ensure quality of our platform. Some of the advantages of automating our regression testing is it 1) gives us the ability to save time by reusing test cases and test scripts; 2) eliminates redundancy in the test process; 3) allows QA to focus more heavily on new product testing and our new customer sites.

Along with Selenium IDE, we use Trac for defect tracking. Our quality and development teams work closely so defects are identified and resolved as quickly as possible. Utilizing Trac has been extremely beneficial with tracking defects as well as providing complete ease of use in entering defect tickets. Since we are a relatively small business, having the ability to use ‘open source’ tools like Selenium and Trac is crucial. As we mature with automation, we will continue to look for new and innovative tools to help maximize our time and the quality of our products.

I recently read that “Superior quality is never an accident and achieving it takes the concerted efforts of creative, competent and dedicated professionals in both the development and testing arenas”. I agree whole-heartedly with that statement because that is exactly what you get at ThePort.

Denise Beachum/QA Manager
TJM
Posted by: TJM
Saturday, 13 March 2010
Comments (0) | Add Comment

One of the most recent additions to our platform is our announcement blocks. Announcement blocks are an easy to use part of our content management system that allow community admins to quickly and easily target messages at various portions of the system.

Out-of-the-box

Announcement blocks come pre-loaded in three areas of the site:

Community landing page – By default, this will only be shown to logged in users of your site. Use this announcement block to announce new features, talk about an upcoming promotion or campaign, or inform users of event

User dashboard – The dashboard block is a great place to encourage users to fill out their profile or upload a profile picture

Group dashboard – The group dashboard block has a similar purpose as the user dashboard. But instead of user features, this is great to inform groups about group functionality or inform group admins of best practices to growing their groups.

Custom

If you require more than the three standard announcement blocks, we can create more blocks for you to use.

For template authors

The code snippet below will pull a content block onto your page:

<xsl:value-of select="iPageInformation:ResetDictionary('dict_ContentBlock')"/>

<xsl:value-of select="iPageInformation:PutDictionaryKey('dict_ContentBlock','sName','CommunityContentBlock')"/>

<xsl:value-of select="iPageInformation:PutDictionaryKey('dict_ContentBlock','sParentID',$sControlID1)"/>

<!—This is one of the most important lines here: this tells which content block you’re using à

<xsl:value-of select="iPageInformation:PutDictionaryKey('dict_ContentBlock','sContentName','COMMUNITY')"/>

<xsl:value-of select="iPageInformation:PutDictionaryKey('dict_ContentBlock','sXslFileName','ContentBlock.xslt')"/>

<xsl:value-of select="iSMProcessor:ProcessGenericModule(iPageInformation:GetDictionaryCSV('dict_ContentBlock'))" disable-output-escaping="yes"/>

Webservices

Our REST APIs also implement announcement blocks for read-only use. This is an effective way to utilize the same content block from your community site anywhere else on the web. The call to pull the content blocks out is pretty straight forward:

/Community/ContentBlocks?devkey={DevKey}

Note that this pulls ALL of your content blocks. Since your content block is not likely to change often, you’ll want to cache this content in your system for a longer period of time to make sure you’re being as efficient as possible.

Also take note that all of our REST APIs can be returned as XML or JSON.

FAQs

I’m not seeing the content blocks appear on any of the pages you mention above? If this is the case, you will need to contact your account manager to have the content blocks retrofitted into your community template set

Do I need to know HTML to manage announcement blocks? No, our announcement blocks management area come with a lightweight WYSIWIG built on the popular CKEditor projectCKEditor project

Can I embed Videos in content blocks? Yes, use the “add a video” button.

How about cut and paste from Word? Yes, you can do that too. Use the “Paste from Word” option in the editor



TJM
Posted by: TJM
Monday, 01 March 2010
Comments (0) | Add Comment
One nifty trick that one of our customers showed me recently is how to control looping in XSLT. Previously, I didn't think it was possible to "break" out of a loop. That is, once you've reached 8 or 9 records, exit the loop. While the correct practice for exiting a loop is still to only ask for what you need, its still important to be able to control the ability to exit whenever you need / want to. So, without further ado, here's how you do it:

Let's assume you have an XSLT variable that contains your collection:

$SOCategories

This collection contains some number of group categories. If we only wanted to display the first two, we could do something like:

<xsl:for-each select="$SOCategories/SocialObjectCategories/SocialObjectCategoryCollection/SocialObjectCategory[position() &lt; 3]">

</xsl:for-each>

The [position() &lt; 3] XPath at the end tells the loop to only loop through the first two. Any subsequent items in the collection will be ignored.

You can use this to only display even numbered rows (using mod) or any such algorithm you wanted to craft.

Thanks to our user community for this helpful tip!
TJM
Posted by: TJM
Tuesday, 09 February 2010
Comments (0) | Add Comment
I'm in DC to meet with Partners and for the now cancelled ASAE Tech Conference. We decided to go forth with a very productive meeting with one of our partners even though John Patton, VP of Biz Dev and I had to trudge 12 blocks in this mess! We'll go the distance to meet w/ our partners.




TJM
Posted by: TJM
Friday, 22 January 2010
Comments (0) | Add Comment
ThePort's looking for qualified folks again. This time it's our Client Services team. They're looking for a seasoned project manager to come in and help manage new implementations. This person should be detail oriented, technically minded, and enjoy day-to-day interaction with bright, like minded folks. If you're good at foosball, that's a bonus too.

Job description can be downloaded here: http://bit.ly/6pTLU4


TJM
Posted by: TJM
Wednesday, 13 January 2010
Comments (0) | Add Comment
One handy trick you can take advantage of in our XSLT template system is calling out to a webservice to fetch XML. This can be ANY RSS, ATOM, or XML based publicly available feed out on the web. And it's super easy to use. See the code snippet below:
// Creating a variable that will contain the XML node iterator
<xsl:variable name="oXML" select="iPageInformation:UtilGetXMLFromUrl('your url here')"/>


// Using our show xml construct so we can debug and see the return
<xsl:value-of select="iPageInformation:ShowXML($oXML,'Show XML')" disable-output-escaping="yes"/>

// from here you can treat the return as any other XML node iterator. Loop, XPath, etc.
And it's that simple. One gotcha to be aware of is namespacing. For instance, if the below sample return is namespaced:

<StatusUpdates xmlns="http://services.theport.com">


When this is the case, you have to be sure to declare the namespace in your XSLT like so:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:theport="http://services.theport.com"

And then your XPATH must include the namespace like so:.

<xsl:for-each select="$oXML/theport:StatusUpdates/theport:StatusUpdate">

Hope this helps!

TJM
Posted by: TJM
Tuesday, 15 December 2009
Comments (0) | Add Comment
New documentation has been added here about our Search page. Check it out!


Showing items of 22