CST offers technical consulting services, with a focus on Linux and Open Source technologies.
About Derek Simkowiak
CST’s owner and primary consultant is Derek Simkowiak. Derek has 17 years experience solving challenging technical problems, including 7 years as an independent consultant. Generally, consulting with CST means hiring Derek (or a team led by Derek), for a specific project or length of time.
CST also maintains a network of subcontractors for larger projects. These subcontractors are companies or individuals that CST has successfully worked with in the past: professionals who take pride in their work, enjoy what they do, and get it right the first time. CST can make vendor recommendations, or, if you prefer to work with just one vendor, CST can put together a project package that includes subcontractor services. Past projects have varied widely in size and scope, varying from one to twelve people per project team (and up to dozens on supporting teams).
Specific services include:
- Speaking Engagements
- Technical Training
- Project Management
- Document Authoring
- Agile Software Development, incl. Revision Control, Bug Tracking, and Release Management
- Protocol Design and Implementation
- Data Analysis and Reporting
- Hardware Engineering (incl. Special-Purpose Embedded Systems or Sensors)
- Rapid Prototyping
- Server Design and Deployment
- Rote Web Development, incl. PHP, Python, MySQL, WordPress, Drupal, Pylons, etc.
- Managed Servers
CST’s services can be contracted as an hourly (1099) consultant, to provide specialist knowledge on an hourly basis, or as a fixed-bid projects in response to a formal RFQ/RFP request.
Example Consulting Projects
The following example projects were done by CST.
Proprietary Proxy Server
Custom Software Development
The project was to develop a proxy server for a proprietary embedded device. CST developed software that takes data from a private wireless network, interprets the custom protocol, and generates an entry into a shared job queue. Advanced features include:
- RRDTool for statistics accounting
- Reliable packet delivery (and ACK confirmation)
- Memcached, Gearman, and simple MySQL polling for job queue backends
- Special-purspose “Offline” mode
- Web GUI with system status and queue sizes
- Versioned Protocols
- Logging (incl. mutable log levels)
This software was developed with Python on a tight schedule using Agile software development. From the initial on-site meeting to final delivery was just two weeks, and the final version included several revisions and features not mentioned in the original RFQ. The end result was 71 emails exchanged between CST and the client, and two thousand lines of code delivered.
Technical Service Analysis
Project Document Authoring
This was a technical document for an international services company. CST was hired to research the feasibility of developing a new online service for its customers. The pre-existing hardware, software, and network infrastructure was evaluated against a preliminary feature set, and an implementation guide was delivered.
This project required international travel and interviews with multiple technicians. The resulting document had 38 pages, 14 sections (and 41 sub-sections), and 10 diagrams. The client rated the document as “very good”.
Custom API Design
CST was hired to develop a custom API for a proprietary device to talk to high-speed scientific research cameras (a brand of camera also installed on the International Space Station).
Here is an edited snippet (with Doxygen documentation):
* A frame struct, including the pixel buffer,
* timestamp, and frame number.
* Frames are first created with the passed-in pixel buffer,
* and then enqueue'd to the camera. As soon as the camera
* takes a picture (based on the settings of PxCaptureMode)
* the Frame can be dequeue'd and the image will be found in
* @see px_frame_new()
* @see px_frame_destroy()
* @see px_camera_enqueue_frame()
* @see px_camera_dequeue_frame()
* @see px_camera_dequeue_frame_nowait()
char *buffer; /**< The capture image pixels */
int buffer_size; /**< The number of bytes in the buffer */
long int frame_number; /**< The auto-incrementing frame number */
struct timespec timestamp; /**< The datetime that the frame was captured, from the host computer */
struct PxFrame *next_frame;