Tuesday, February 08, 2011

Zend_Gdata Lacks Document Download

I have had quite a time figuring out a way to auto-magically download docs from my Google docs account. ( I know links are annoying, but these are useful to me! )

The official Php framework for Google docs is Gdata framework which is integrated into the Zend Framework, but also available as a separate framework. Many samples of Google and Php integration are available online.

That said, I have made a class that will also download my docs from Google docs. I was able to do this thanks to stackoverflow and an answer I found to show how to download docs with curl and a few blogs that reference the same "download doc as xls" posting.

Here is an class I made using ClientLogin authentication. based on the Zend Framework Client library example available in the Google Php playground...
Hopefully it will show up ok in this blog with no script tags????

I have updated this to support temporary files...
there is a "bug" in the Zend_Gdata_Docs.
If you want to upload a temporary file, you need to set the mimetype.
Otherwise it tries to get the mimetype from the filename and FAILS with odd exceptions.

Updated again with better mimetype checking and error reporting.
<?php

require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata');
Zend_Loader::loadClass('Zend_Gdata_AuthSub');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
Zend_Loader::loadClass('Zend_Gdata_Docs');


class ConvertDoc{
    // holds the service tokens
    private $_serviceSessionToken = array();
    private $_user = '';
    private $_pass = '';
    private $_debug = false;
    private $_curl = false;

    /**
     * construct
     *
     * @param  string $user The username, in e-mail address format, to authenticate
     * @param  string $pass The password for the user specified
     * @param  array $tokens Array of tokens for clientlogin authentication
     * @return void
     */
    function __construct($username,$passwd,$tokens=array()){
        $this->_user=$username;
        $this->_pass=$passwd;
        foreach($tokens as $service=>$token){
            $this->set_service_token($service,$token);
        }
    }

    function debug($message){
        if($this->_debug)
            echo date('Y-m-d H:i:s').' :: '.$message."  <br/>\n";
    }

    /**
     * convert
     *
     * @param  string           $filename              the file name (either direct path to file or name of file with $tempfile holding the path to actual tmp file
     * @param  string           $newfilename           save as this file name
     * @param  string           $tempfile              file location if upload (/tmp/...)
     * @param  string           $format                format of file to download
     *                                                 http://code.google.com/apis/documents/docs/3.0/developers_guide_protocol.html#DownloadingSpreadsheets
     * @param  string           $gid                   The gid parameter is an absolute identifier for worksheets
     *                                                 for spreadsheets (if not numberic it will download entire workbook as one sheet)
     * @return void
     */
    function convert($filename, $newfilename='', $tempfile='',$format='csv',$gid=0){
        $this->debug('convert file');
        // authenticate to docs list (wordly)
        $client = $this->getClientLoginHttpClient(Zend_Gdata_Docs::AUTH_SERVICE_NAME);
        
        
        $docs = new Zend_Gdata_Docs($client);
        $this->debug('authenticated');
        
        // upload temporary file to ggl
        $newDoc = $this->uploadDocument($docs, $filename, $tempfile);
        $this->debug('uploaded');
        // get the content source url
        $src = $newDoc->content->getSrc();
        // download the data to the new filename
        if($this->_curl){
            $content = $this->curlSrc($src, $format, $gid, $newfilename);
        } else {
            $content = $this->downloadSrc($src, $format, $gid, $newfilename);
        }
        $this->debug('downloaded');
        // delete the temporary file on ggl
        $newDoc->delete();
        $this->debug('deleted');
    }

    /**
     * set_service_token
     *
     * @param  string $service Which service to authenticate against.
     * @param  string $token Token for the service identified
     * @return void
     */
    function set_service_token($service,$token){
        //echo "$service :: $token    <br/>\n";
        $this->_serviceSessionToken[$service] = trim($token);// make sure it is clean.
    }

    /**
     * get_service_token
     *
     * @param  string $service Which service to authenticate against.
     * @return string
     */
    function get_service_token($service){
        if(!empty($this->_serviceSessionToken[$service])){
            //echo "$service :: ".$this->_serviceSessionToken[$service]."    <br/>\n";
            return $this->_serviceSessionToken[$service];
        }
        throw new Exception("session token not found for service {$service}\n");
        return false;
    }

    /**
     * Returns a HTTP client object with the appropriate headers for communicating
     * with Google using the ClientLogin credentials supplied.
     *
     * @param  string $service Which service to authenticate against.
     * @return Zend_Http_Client
     */
    function getClientLoginHttpClient($service='writely'){
        try{
            $token = $this->get_service_token($service);
            $this->debug('token');
            $client = new Zend_Gdata_HttpClient();
            $client->setClientLoginToken($token);
        } catch(Exception $e) {
            // no token found so make it.
            $this->debug('newtoken');
            $client = Zend_Gdata_ClientLogin::getHttpClient($this->_user, $this->_pass, $service);
            $this->set_service_token($service,$client->getClientLoginToken());  
            /*
                    example on how to catch exceptions, not doing it here, the app needs to handle it.
                    try {
                        $client = Zend_Gdata_ClientLogin::getHttpClient($this->_user, $this->_pass, $service);
                    } catch (Zend_Gdata_App_AuthException $e) {
                        echo "Error: Unable to authenticate. Please check your";
                        echo " credentials.\n";
                        exit(1);
                    } catch (Zend_Gdata_App_CaptchaRequiredException $e) {
                        echo 'CAPTCHA answer required to login';
                        echo $e->getCaptchaUrl();
                        exit;
                        // http://code.google.com/apis/gdata/docs/auth/clientlogin.html
                    } catch (Exception $e) {
                        echo 'Unknown Exception';
                        exit;
                    }
            */
        }
        $config = array(
            'timeout' => 60 /* timeout after 60 seconds */
        );        
        $client->setConfig($config);
        return $client;

    }
    

    /**
     * Upload the specified document
     *
     * @param  Zend_Gdata_Docs $docs                  The service object to use for communicating with
     *                                                the Google Documents server.
     * @param  string          $originalFileName      The name of the file to be uploaded. The mime type
     *                                                of the file is determined from the extension on
     *                                                this file name. For example, test.csv is uploaded
     *                                                as a comma seperated volume and converted into a
     *                                                spreadsheet.
     * @param  string          $temporaryFileLocation (optional) The file in which the data for the
     *                                                document is stored. This is used when the file has
     *                                                been uploaded from the client's machine to the
     *                                                server and is stored in a temporary file which
     *                                                does not have an extension. If this parameter is
     *                                                null, the file is read from the originalFileName.
     * @return Zend_Gdata_Docs_DocumentListEntry
     */
    private function uploadDocument($docs, $originalFileName, $temporaryFileLocation=false) {
        $fileToUpload = $originalFileName;
        if ($temporaryFileLocation) {
            $fileToUpload = $temporaryFileLocation;
        }
        // get mimetype from original file name
        $filenameParts = explode('.', $originalFileName);
        $fileExtension = end($filenameParts);
        $mimeType = Zend_Gdata_Docs::lookupMimeType($fileExtension);
        if(!$mimeType){
            $mimeType = $this->mimetype($fileToUpload);
        }
        if(!$mimeType){
            throw new Exception("No Mime Type!");
            return false;
        }
        
        // Upload the file and convert it into a Google Document. The original
        // file name is used as the title of the document and the mime type
        // is determined based on the extension on the original file name.
        $e=true;
        $counter=0;
        while($e && $counter<10){
            try {
                $this->debug('upload');
                $newDocumentEntry = $docs->uploadFile($fileToUpload, $originalFileName, $mimeType, Zend_Gdata_Docs::DOCUMENTS_LIST_FEED_URI);
                $e=false;
            } catch (Zend_Gdata_App_HttpException $e){
                $r = $e->getResponse();
                if($r->getStatus() == '408'){
                    // timed out
                    $counter++;
                    $this->debug('try again');
                } else {
                    echo "<b style='color:red;font-size:1em;'>GOOGLE ERROR: ".$r->getMessage()." : ".$r->getBody()."</b><br/>\n";
                    $counter=10;// stop loop
                }                
                $e=true;
            }
        }
        if($counter==10){
            throw new Exception("failed to upload file");
            return false;
        }
        return $newDocumentEntry;
    }

    /**
     * get the mimetype for the file
     *
     * @param  string          $file               Link to the source file to download
     *
     * @return string
     */
    function mimetype($file){
        if(class_exists('finfo')){
            // new way, must be installed on php
            $this->finfo = new finfo(FILEINFO_MIME,'/usr/share/file/magic'); // use to return mime type ala mimetype extension
            if(!$this->finfo){
                $mimetype='unknown';
            } else {
                $mimetype = $this->finfo->file($file);
            }
        } else {
            $mimetype = mime_content_type($file);
        }
        return $mimetype;
    }

    /**
     * Upload the specified document
     *
     * @param  string          $src_url               Link to the source file to download
     * @param  string          $format                format of file to download
     *                                                http://code.google.com/apis/documents/docs/3.0/developers_guide_protocol.html#DownloadingSpreadsheets
     * @param  string          $gid                   The gid parameter is an absolute identifier for worksheets
     *                                                for spreadsheets (if not numberic it will download entire workbook as one sheet)
     *
     *
     * @return Zend_Gdata_Docs_DocumentListEntry
     */
    private function downloadSrc($src_url, $format='csv', $gid=0, $file=false) {
        // find service based on url
        $service = $this->src_url_service($src_url);
        // authenticate to service
        $this->getClientLoginHttpClient($service);
        // get the token from the service
        $sessionToken = $this->get_service_token($service);
        // now try to do our thing...
        $opts = array(  
            'http' => array(
                'method' => 'GET',  
                'header' => "GData-Version: 3.0\r\n".  
                "Authorization: GoogleLogin auth=$sessionToken\r\n"
            )  
        );  
        // BUILD URL
        $src_url =  $src_url . '&chrome=false';
        if($format){
            $src_url =  $src_url . '&format='.$format.'&exportFormat='.$format.'';
        }
        if(is_numeric($gid)){
            $src_url =  $src_url . '&gid='.$gid.'';
        }
        // GET DATA
        $data = file_get_contents($src_url, false, stream_context_create($opts));

        if($file){
            file_put_contents($file,$data);
        }
        return $data;
    }  

    /**
     * Upload the specified document
     *
     * @param  string          $src_url               Link to the source file to download
     * @param  string          $format                format of file to download
     *                                                http://code.google.com/apis/documents/docs/3.0/developers_guide_protocol.html#DownloadingSpreadsheets
     * @param  string          $gid                   The gid parameter is an absolute identifier for worksheets
     *                                                for spreadsheets (if not numberic it will download entire workbook as one sheet)
     * @param  string          $file                  location of the file to save the data to
     *
     *
     * @return Zend_Gdata_Docs_DocumentListEntry
     */
    // curl -o tmp1 -H "Authorization: GoogleLogin auth={authcode}" "http://spreadsheets.google.com/feeds/download/spreadsheets/Export?key={dockey}&exportFormat={format}"
    private function curlSrc($src_url, $format='csv', $gid=0, $file=false){
        // find service based on url
        $service = $this->src_url_service($src_url);
        // authenticate to service
        $this->getClientLoginHttpClient($service);
        // get the token from the service
        $sessionToken = $this->get_service_token($service);
        // now try to do our thing...
        if($file){ // open file if saving to file.
            $file = fopen($file,"w+");
        }
        // BUILD URL
        $src_url =  $src_url . '&chrome=false';
        if($format){
            $src_url =  $src_url . '&format='.$format.'&exportFormat='.$format.'';
        }
        if(is_numeric($gid)){
            $src_url =  $src_url . '&gid='.$gid.'';
        }
        // INIT CURL
        $curl = curl_init($src_url);
        // Setup headers - I used the same headers from Firefox version 2.0.0.6
        // below was split up because php.net said the line was too long. :/
        $header[] = "GData-Version: 3.0";
        $header[] = "Authorization: GoogleLogin auth=$sessionToken";
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);

        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);// follow redirects!!
        curl_setopt($curl, CURLOPT_POST, false); 
        curl_setopt($curl, CURLINFO_HEADER_OUT,true); // TRUE to track the handle's request string. 

        if($file){
            curl_setopt($curl, CURLOPT_FILE,$file); // file to write output to
            $data = curl_exec($curl); // execute the curl command
        } else {
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // output to variable
            $data = curl_exec($curl); // execute the curl command
        }

        // debug info
        if($this->_debug){
            echo curl_getinfo($curl, CURLINFO_HEADER_OUT);
            var_dump($data);
        }

        curl_close($curl); // close the connection
        return $data;
    }

    private function src_url_service($src_url){
        if(stristr($src_url,'spreadsheet')){
            return Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
        } else {
            return Zend_Gdata_Docs::AUTH_SERVICE_NAME;
        }
        // not sure how to handle pdg with Zend.
        
        // http://code.google.com/apis/documents/docs/3.0/developers_guide_protocol.html#DownloadingDocs
    }

}

Friday, October 17, 2008

Application Developer

Application Developer needed for a High Growth Internet company producing tremendous financial results

with ambitious growth plans located in Rochester, MN.


This position will be assist in developing applications for an international client chain and internal support systems. The duties for this position include simple troubleshooting and support
for existing web applications, development of exciting new applications and features, and documentation.

Qualifications include:

Degree or certification in related field.

2-3 years experience with L.A.M.P. development (Linux, Apache, MySQL, & Php)

2-3 years experience with Php and MySQL programming (or other relational SQL queries).

Prefered qualifications:

Knowledge of Perl, Bash scripting, JavaScript, or other programming languages

Zend Certified Engineer (ZCE)



This person must be flexible, team oriented, self motivated, excellent customer service and communication skills and capable of working in a very fast paced environment.

Send resume’ to: admin@brokerbin.com

Wednesday, August 06, 2008

Google Apps
Google Apps Demo
SETUP
Business Editions

PROS
  1. $50 / user / year ($1250 / 25 users / year)
    1. this is basically another..
      1. employee
      2. server
      3. backup system
      4. support
    2. ... for a very small cost.
  2. 24/7 support
  3. shared contacts with company

  1. Google Gears
    1. Allows to download most Google Apps so they are available offline.
  2. Gmail
    1. Mobile Access for most applications on Google Apps
      1. iPhone
      2. Blackberry
      3. other
    2. LARGE email storage (25 GB per user)
    3. shared contacts with company
    4. Security / Backup
    5. IMAP and Webmail support
    6. No VPN needed
    7. Google spam/phishing filtering
    8. Exchange Mail Migration Tool (move mails from Exchange to Gmail)
    9. Policy management and message recovery
    10. Automated backup of all accounts
    11. Shared Contacts
    12. No account limit
    13. Advanced Search options
    14. Integrated instant messaging (webmail)
    15. Ads are optional with Corp. Account
    16. VERY unlikely to get blacklisted being on Goggle servers
  3. Calendars
    1. Conference room and resource scheduling
    2. Shared Calendars
    3. Sync with Outlook
    4. Mobile access
    5. Integrated API (add callbacks to calendar, timoff...)
  4. Google Talk
    1. integrated into Gmail
    2. Shared contacts with Gmail
    3. VOIP chat with voicemail
    4. file transfers over chat
    5. Mobile Access (iPhone, Blackberry, other)
    6. No need for pigeon unless want other systems
    7. no need to update/save contacts to other system, available on any web browser
  5. Google Sites
    1. Intranet
    2. collabrative site pages for groups to edit
  6. Google Docs
    1. word documents
    2. spreadsheets
    3. presentations
    4. No need for purchase of Office Suites
    5. Supports uploading and saving as many standard formats (.doc, .pdf, .xls,...)
Custom urls (docs.brokerbin.com, sites.brokerbin.com, mail.brokerbin.com)
Tool to Remotely backup Google Accounts (not really needed since they do a backup also)

CONS
Additional login (unless using outlook with saved login)
Admin 2 systems
adding users
removing users


Monday, May 26, 2008

Thursday, October 18, 2007

Technical Support Professional needed for a High Growth Internet company producing tremendous financial results with ambitious growth plans located in Rochester, MN.


This position will be supporting an international client chain and internal support systems. The duties for this position include simple troubleshooting and support for a series of L.A.M.P. and Windows servers, switch / router settings, backup disks / tapes, Microsoft Active Directory and Group Policies, internal computers, phones, and documentation.


Ideal qualifications include: Degree or certification in related field. 1-2 years experience with L.A.M.P. or Microsoft servers and software. Prefered qualifications include: Basic Knowledge of PHP, Pearl, bash scripting, JavaScript, or other programming languages and one of the following certifications: Microsoft Certified Systems Engineer (MCSE) or Zend Certified Engineer (ZCE).

This person must be flexible, team oriented, self motivated, excellent customer service and communication skills and capable of working in a very fast paced environment.

Send resume’ to: admin@brokerbin.com

TechSupport Professional


High growth international internet company has an opening for a TechSupport Professional. Some knowledge for L.A.M.P. and Windows Servers along with other technical support is preferred. The duties for this position includes but is not limited to maintenance, documentation, servicing, and general up keep of internal hardware and software, networking, client services, and more.


Major challenges include: maintaining and creation of documentation, organization and execution of several projects in a quick paced environment, organizing and prioritizing projects on the fly, identifying problems and providing concise solutions in a timely manner.


This position will be an apprentice to either the programming or hardware teams, depending on the individuals interests. This may include company sponsored schooling and conferences in the related fields.


This position will be the lead for servers supporting an international client chain and internal support systems.

This person will provide, but is not limited to:

  • Simple troubleshooting and support for
    • a series of L.A.M.P. servers.
    • Exchange servers.
    • Windows 2003 Altigen servers.
    • Switch and Router settings.
    • Backup Disks / Tapes.
    • Microsoft Active Directory and Group Policies.
    • Internal computers
    • Phones
    • Documentation for all of the above.

Evaluations:
Utilizing support ticket tracking, time reports for work and team evaluations this position will be evaluated on:
  • All responsibilities listed above.
  • Proof of problem solving skills.
  • Ability to independently solve issues.
  • Time taken to resolve issues.
  • Attention to Detail.
  • Time saving implementations.

Ideal Qualifications for position:
  • Degree / certification in related field.
  • 1-2 years experience with L.A.M.P. or Microsoft servers and software.

Preferred Qualifications:
  • Basic knowledge of PHP, Pearl, bash scripting, JavaScript, or other programming languages.
  • One of the following certifications.
    • Microsoft Certified Systems Engineer (MCSE)
    • Zend Certified Engineer (ZCE)

Additional special skills required:
  • Individual must be hands on and work well under pressure.
  • Also must be a strong team player.
  • Excellent customer service skills.
  • Effective communication skills
  • Ability to work independently.
  • Ability to lift items weighing up to 60 pounds.

Email: admin@brokerbin.com

Senior Server Administrator


High growth international internet company has an opening for a Senior Server Administrator. Server support for Exchange, L.A.M.P., and Windows 2003 Altigen Servers along with other technical support is needed. These servers provide support to internal staff and a large number of clients, including membership web services, data mining services, and support services. The duties for this position includes but is not limited to maintenance, monitoring, servicing, backups, and general up keep of multiple data centers. There also may be support needed within the internal offices for high priority support issues including networking, client services, and more.


Major challenges include: maintaining and creation of documentation, organization and execution of several projects in a quick paced environment, organizing and prioritizing projects on the fly, identifying problems and providing concise solutions in a timely manner.


This position will be the lead for servers supporting an international client chain and internal support systems.

This person will provide, but is not limited to:

  • All aspects for maintaining and updating
    • a series of L.A.M.P. servers.
    • Exchange servers.
    • Windows 2003 Altigen servers.
    • Switch and Router settings.
    • Racks and Cabling.
    • Monitoring Software / Scripts.
    • Backup Disks / Tapes.
    • Virus Protection.
    • Patches.
    • Security.
    • Documentation for servers and procedures.
    • Microsoft Active Directory and Group Policies.
    • Alert Systems for Server Maintenance and Monitoring.
    • Backup Servers utilizing multiple methods.
      • Tape Backups
      • Networked backup solutions.
  • Installation for Servers including OS and Applications.
  • Third tier support for desktop, phone and networking.
  • Troubleshooting server failure.
  • Communication technology needs and visions with company officers and/or board members.
  • Advise company on technology needs.
  • Provide a vision for future technology needs.
  • Manage additional server support staff and outsource effectively.

Evaluations:
Utilizing support ticket tracking, time reports for work and server uptime, and monitoring logs this position will be evaluated on:
  • All responsibilities listed above.
  • Server Uptimes.
  • Proof of problem solving skills.
  • Ability to independently solve issues.
  • Time taken to resolve issues.
  • Attention to Detail.
  • Time saving implementations.

Required Qualifications for position:
  • Bachelor's degree in Computer Science, Software Engineering, Hardware Engineering or related field.
  • Minimum 3-6 years of experience in the field or in a related area required.
  • Experience with Active Directory, L.A.M.P. & Exchange a must.

Preferred Qualifications:
  • Moderate knowledge of PHP, Pearl, bash scripting, JavaScript, and other programming languages.
  • One or more of the following certifications.
    • Microsoft Certified Systems Engineer (MCSE)
      • Windows 2003
      • Exchange Small Business
    • MySQL DBA (CMDBA) Certification
    • Zend Certified Engineer (ZCE)

Additional special skills required:
  • A wide degree of creativity and latitude is expected.
  • Individual must be hands on and work well under pressure.
  • Also must be a strong team player.
  • Excellent customer service skills.
  • Effective communication skills
  • Ability to work independently.
  • Ability to lift items weighing up to 60 pounds.

Email: admin@brokerbin.com
Senior Server Administrator
Lead Server Administrator needed for a High Growth Internet company producing tremendous financial results with ambitious growth plans located in Rochester, MN.
The duties for this position includes but is not limited to maintenance, monitoring, servicing, backups, general up keep of multiple datacenters, maintaining and creation of documentation, organization and execution of several projects in a quick paced environment, organizing and prioritizing projects on the fly, identifying problems and providing concise solutions in a timely manner. There also may be support needed within the internal offices for high priority support issues including networking, client services.
Requirements include: Bachelor's degree in Computer Science, Software Engineering, Hardware Engineering or related field. Minimum 3-6 years of experience in the field or in a related area required. Experience with Active Directory, L.A.M.P. & Exchange a must.
This person must be flexible, team orientated, self motivated and capable of working outside the box in a very fast paced environment.
Send resume’ to:
Email: admin@brokerbin.com

Saturday, January 27, 2007

This book would be a great resource!
Applied Software Project Management

Software Development Process
  • Vision and Scope Document - ensures the project is launched effectively and that ALL parties have a common understanding of the project
  • Project Plan - Used to communicate the status of the project and plan activities in the Development Cycle
    • Statement of Work
      • Scope of Work, This describes the work to be done in detail and specifies the hardware and software involved and the exact nature of the work to be done.
      • Location of Work, This describes where the work is to be performed. This also specifies the location of hardware and software and where people will meet to perform the work.
      • Period of Performance, This specifies the allowable time for projects, such as start and finish time, number of hours that can be billed per week or month, where work is to be performed and anything else that relates to scheduling.
      • Deliverables Schedule, This part lists the specific deliverables, describing what is due and when.
      • Applicable Standards, This describes any industry specific standards that need to be adhered to in fulfilling the contract.
      • Acceptance Criteria, This specifies how the buyer or receiver of goods will determine if the product or service is acceptable, what criteria will be used to state the work is acceptable.
      • Special Requirements. This specifies any special hardware or software, specialized workforce requirements, such as degrees or certifications for personnel, travel requirements, and anything else not covered in the contract specifics.
      • This would be something that all projects should be required to provide before starting development.
        • Provides a means for verifying and restricting the work agreed to be done
        • (BWS)
  • Requirement Analysis - identify the requirements needed
    • This is a fine detail of the software requirements in order to have a more defined time-line and expectations
    • Use Cases for documenting potential requirements of a new system or software change
    • Requirement Workshops - brainstorming with users of the new software before development to get requirements.
  • Work Flow
  • Project Management - Defining the Project Time-line and Milestones
    • Status Reports
    • Time Estimation
    • Applications for Management
Launching
  • Risk Planning -
    • "
      • Brainstorm potential risks. The project manager leads a brainstorming session to identify risks. Team members suggest every risk they can think of; the project manager writes the risks on a whiteboard as they come up. Brainstorming should be reminiscent of microwave popcorn: a few ideas should “pop” at first, followed by a large number being fired rapidly, slowing down to a final few “pops”. The team will generally be able to judge when the risk identification is over.
      • Estimate the impact of each risk. The team assigns a number from 1 (highly unlikely) to 5 (very likely to occur) to represent the estimated probability of each risk. Similarly, impact should be estimated by assigning a number from 1 (for a risk with low impact) to 5 (for a risk which, if it occurs, will require an enormous effort to clean up).
      • Build the risk plan. The team identifies actions to be taken to mitigate high-priority risks and creates a risk plan that documents these actions.
    • "



Problem Areas - Using the following standards/ ideas will improve the Areas Concerned.
  • Note:
    • more defined expectations
      • allow for better communication, better development, less problems all around
  • Communication
    • Project Meetings
      • Weekly 1/2 hour meeting about Project Status with concerned parties.
      • Monthly Summary Meetings with Time line/ Milestone Updates.
    • SOW - more defined expectations
    • Requirement Workshops - Brainstorming
    • Project Plan - more defined expectations
  • Launching Standards
    • Requirement Analysis - more defined expectations
    • Time Estimation - more defined expectations
    • Test Driven Development - Tests can then be executed after each update to the code to verify all functionality still exists
    • Risk Planning - Identify, Reduce, and Plan for failures in development and software.
  • Development Cycle
    • Requirement Analysis - more defined expectations
    • Project Planning - more defined expectations
    • SOW - more defined expectations
    • Project Management - more defined expectations
    • Test Driven Development - Tests can then be executed after each update to the code to verify all functionality still exists
  • Time Management
    • Project Planning - more defined expectations
    • SOW - more defined expectations
    • Project Management - more defined expectations