Author - Web Developer - Educator
Found 32 results for tag "q"

My Journey into Git

Git logo

My Journey


My journey to discovering git was not an easy one. Since git was not covered in my formal programming lessons, I had to learn "version control" the hard way - the very hard way.

When I started learning HTML back in 2001, I learned to save and modify local files only. In 2002, I learned PHP and MySQL by working on a team server, but version control was not introduced (git was introduced to the world in 2005, but options like CVS or SVK weren't taught). My first local server came in 2004, when I learned to FTP files, instead of testing local files only.

I quickly updated to SSH'ing into the server and editing the direct code, and backuped the files using a combination of file extensions (such as .bak, date stamps like.20150515, and "Backup 20140523" folders).

...and I used this method up to about a year ago, when I took a git intro course online. Unfortunatly, I didn't quite understand the purpose of git because the demos kept talking about files that either already existed, or branches that were made by someone else - never really diving into the underlying purpose of git, which was version control.

I also couldn't get used to the idea of uploading my database login information (along with other private code) to the public site GitHub, which is great for open-sourced projects (see mine here), but not great for a company version control backup. So I dabbled in git for a while, until it hit me about a month ago: I could use git on my own server(s) and not have to deal with private repositories on GitHub (or the prices).

So, I started using git on my server for backups of projects site-wide. Then, I wanted to deal with errors on a non-production server basis (I didn't want the world to see my error testing, because that would be unprofessional). After getting a local Apache server, and MySQL server, and installing PHP (on Windows), I thought that I could use the GitHub software to create backups - but that was only for the GitHub site; I needed something to work with my own existing servers. Therefore, I installed Cygwin and got the Linux-enabled commands with git to my production server.

Overall, this is what I learned, and I hope it helps others:
The Process
The "direct" process vs the git process

Usage


(If you don't already have git set up on your remote server, then please do so by installing it - I recommend sudo apt-get install -y git. Otherwise, this won't work, and it's just a bunch of lines of code)
The SetupRemote (seperate from production folder):
mkdir [dir].git && cd $_
 
git init --bare
 
cp ~/post-receive.sample hooks/post-receive

The hooks folder deals with webhooks to automatically catch incoming files and do something with them (or at least, that's what I've discovered). To make the hooks run properly, you need a post-receive file, and this is what it should look like:
post-receive.sample
#!/bin/sh
 
GIT_WORK_TREE=[absolute path to production] git checkout -f


Once you have that set up, you can work on your local machine to create and modify files.
Local development machine
# If files do not exist
 
git clone [email protected]:[dir].git 
 
cd [dir]
 
# If files DO exist/update
 
cd [dir]
 
git pull
 

 
# Time for editing
 
vim [file]
 
[...]
 
[work on files, test on development machine]
 
[...]
 
(Ready to upload to production server)
 
git add [file(s) - * works as well]
 
git commit -m "Relevant message to update"
 
git push


One important note: As I have learned, your Git folder is not your production folder. I had my .git folder in my production folder of a project, and it was good for local editing, but not remote pulling. If your project folder (example: project.git) is somewhere else, like your home folder, then you can use the post-receive webhook to automatically pull committed files to the production area

Bonus: SSH Login w/o PW


Unless you want to type in your login information every time you git push, I recommend setting it up so your local machine/development server can automatically upload to the production server. If you are running a Linux system (and I recommend you do), then you can do the following:
SSH Password-less LoginOn your local machine (hopefully a Cygwin or Linux/Mac Terminal)
ssh keygen -t rsa
 
ssh [email protected] 'mkdir -p .ssh'
 
cat .ssh/id_rsa.pub | ssh [email protected] 'cat >> .ssh/authorized_keys'
B = Remote server



Summary


There is still quite a lot I don't understand about git (like branches, merging, etc), but I am getting better. I've been using this guide as a resource, as many other guides are very technical for a non-git person.

My takeaway: Better integration into team development instead of just "solo development"


Tags:#git #development #php #mysql #html #linux

Update Youtube Video Privacy with API and OAuth

OAuthI posted this on my Facebook and Github, but I thought I'd post it here for a more public audience.

Recently, while working on Japanoblog, I realized that there was a problem: when we created videos, we would post them for our Patreon supporters 3 days early so they could get early access to them. However, I had a few options:
  1. I could post a separate video to Youtube/Vimeo/etc and share the link, but then wait 3 days and upload the real video and take down the temp one (which would mean 2x the work, and misleading stats)
  2. I could make the video "Unlisted" and share the link with our Patreon supporters, then wait 3 days and change the video to "Public" for all, or
  3. Do the 2nd option, but then have the server automatically change the status to "Public" when the video was ready to go public (as per the blog post publishing date

Well, being the pragmatic programmer that I am, I figured out how to make the server do it for me. But it was not an easy task (apparently, nobody had done this before - at least, on a public searchable point). After scouring the internet to dissect the Youtube API, Google OAuth (along with token creation), researching and pulling parts from about 7 different public user projects, and some patient testing, I finally have it...I hope.

This script is based on Dom Sammut's code and the Youtube Sample Code (PHP #1).

(Don't want to copy/paste? Here's the Github repository)

So, without further ado, here is what I have come up with:

First: get your tokens


You need to generate your tokens to get the process started.
<?php
 

 
#Primary code from https://www.domsammut.com/code/php-server-side-youtube-v3-oauth-api-video-upload-guide/
 
#Create Client ID and Client Secret by creating OAuth credentials 
 
# at https://console.developers.google.com/apis/credentials
 
# MAKE SURE YOU UPDATE YOUR REDIRECT URL TO MATCH!!!!!!!!!
 
$CLIENT_ID = "XXXXXXXXXXXXXX.apps.googleusercontent.com";
 
$CLIENT_SECRET = "XXXXXXXXXXX";
 
$application_name="APPLICATION_NAME";
 
 
 
// Call set_include_path() as needed to point to your client library.
 
#set_include_path($_SERVER['DOCUMENT_ROOT'] . '/directory/to/google/api/');
 
#Download the PHP Client Library from Google at https://developers.google.com/api-client-library/php/
 

 
#This has been installed using Composer - update if you download the files directly
 
set_include_path(get_include_path() . PATH_SEPARATOR . '/PATH/TO/vendor/google/apiclient/src/');
 
require_once 'Google/Client.php';
 
require_once 'Google/Service/YouTube.php';
 
session_start();
 
 
 
/*
 
 * You can acquire an OAuth 2.0 client ID and client secret from the
 
 * {{ Google Cloud Console }} <{{ https://cloud.google.com/console }}>
 
 * For more information about using OAuth 2.0 to access Google APIs, please see:
 
 * <https://developers.google.com/youtube/v3/guides/authentication>
 
 * Please ensure that you have enabled the YouTube Data API for your project.
 
 */
 
$OAUTH2_CLIENT_ID = $CLIENT_ID;
 
$OAUTH2_CLIENT_SECRET = $CLIENT_SECRET;
 
#$REDIRECT = 'http://localhost/oauth2callback.php';
 
$REDIRECT = 'http://YOUR_URL.com/oauth2callback.php';
 
$APPNAME = $application_name;
 
 
 
 
 
$client = new Google_Client();
 
$client->setClientId($OAUTH2_CLIENT_ID);
 
$client->setClientSecret($OAUTH2_CLIENT_SECRET);
 
$client->setScopes('https://www.googleapis.com/auth/youtube');
 
$client->setRedirectUri($REDIRECT);
 
$client->setApplicationName($APPNAME);
 
$client->setAccessType('offline');
 
 
 
 
 
// Define an object that will be used to make all API requests.
 
$youtube = new Google_Service_YouTube($client);
 
 
 
if (isset($_GET['code'])) {
 
    if (strval($_SESSION['state']) !== strval($_GET['state'])) {
 
        die('The session state did not match.');
 
    }
 
 
 
    $client->authenticate($_GET['code']);
 
    $_SESSION['token'] = $client->getAccessToken();
 
 
 
}
 
 
 
if (isset($_SESSION['token'])) {
 
    $client->setAccessToken($_SESSION['token']);
 
    echo '<code>' . $_SESSION['token'] . '</code>';
 
}
 
 
 
// Check to ensure that the access token was successfully acquired.
 
if ($client->getAccessToken()) {
 
    try {
 
        // Call the channels.list method to retrieve information about the
 
        // currently authenticated user's channel.
 
        $channelsResponse = $youtube->channels->listChannels('contentDetails', array(
 
            'mine' => 'true',
 
        ));
 
 
 
        $htmlBody = '';
 
        foreach ($channelsResponse['items'] as $channel) {
 
            // Extract the unique playlist ID that identifies the list of videos
 
            // uploaded to the channel, and then call the playlistItems.list method
 
            // to retrieve that list.
 
            $uploadsListId = $channel['contentDetails']['relatedPlaylists']['uploads'];
 
 
 
            $playlistItemsResponse = $youtube->playlistItems->listPlaylistItems('snippet', array(
 
                'playlistId' => $uploadsListId,
 
                'maxResults' => 50
 
            ));
 
 
 
            $htmlBody .= "<h3>Videos in list $uploadsListId</h3><ul>";
 
            foreach ($playlistItemsResponse['items'] as $playlistItem) {
 
                $htmlBody .= sprintf('<li>%s (%s)</li>', $playlistItem['snippet']['title'],
 
                    $playlistItem['snippet']['resourceId']['videoId']);
 
            }
 
            $htmlBody .= '</ul>';
 
        }
 
    } catch (Google_ServiceException $e) {
 
        $htmlBody .= sprintf('<p>A service error occurred: <code>%s</code></p>',
 
            htmlspecialchars($e->getMessage()));
 
    } catch (Google_Exception $e) {
 
        $htmlBody .= sprintf('<p>An client error occurred: <code>%s</code></p>',
 
            htmlspecialchars($e->getMessage()));
 
    }
 
 
 
    $_SESSION['token'] = $client->getAccessToken();
 
} else {
 
    $state = mt_rand();
 
    $client->setState($state);
 
    $_SESSION['state'] = $state;
 
 
 
    $authUrl = $client->createAuthUrl();
 
    $htmlBody = <<<END
 
  <h3>Authorization Required</h3>
 
  <p>You need to <a href="$authUrl">authorise access</a> before proceeding.<p>
 
END;
 
}
 
?>
 
 
 
<!doctype html>
 
<html>
 
<head>
 
    <title>My Uploads</title>
 
</head>
 
<body>
 
<?php echo $htmlBody?>
 
</body>
 
</html>


Now that that's all set, save the response to a file (I recommend "the_key.txt"), and modify and run the following:
<?php
 
/**
 
 * This code is to be run automatically to update a Youtube video's privacy status
 
 *
 
 * First, generate your key using "get-token.php" - read the notes below for generation
 
 * Next, update this file with the appropriate information (path to key file, Client ID, 
 
 *    Client Secret (OAuth Required), Application Name, Database Login, Database Query, and
 
 *    location of PHP Client Library - all download information is below)
 
 * 
 
 * @author Kyle Perkins
 
 * @site https://github.com/kode29/google-youtube-api-privacystatus
 
 * 
 
 * NOTICE: Rest of copyright should be in tact for other scripts (Dom Sammut (domsammut.com) and Ibrahim Ulukaya (Google)
 
 * Last Update: 20160108
 
**/
 

 
#Primary code from https://www.domsammut.com/code/php-server-side-youtube-v3-oauth-api-video-upload-guide/
 
# Mixed with sample code from https://developers.google.com/youtube/v3/docs/videos/update (PHP #1)
 

 

 
#Generate the "the_key" with get-token.php and store it into "the_key.txt" or wherever you want to store it BEFORE running this script.
 
# Also, make sure "the_key" has a REFRESH TOKEN!
 
$key_file = "/path/to/the_key.txt";
 

 
#Create Client ID and Client Secret by creating OAuth credentials 
 
# at https://console.developers.google.com/apis/credentials
 
# MAKE SURE YOU UPDATE YOUR REDIRECT URL TO MATCH!!!!!!!!!
 
$CLIENT_ID = "XXXXXXXXXXXXXX.apps.googleusercontent.com";
 
$CLIENT_SECRET = "XXXXXXXXXXX";
 
$application_name="APPLICATION-NAME";
 

 
#CHeck the DB for updated videos
 
$video_list=array();
 
    $dbh = new PDO('mysql:host=localhost;dbname=DATABASE_NAME', "DATABASE_USER", "DATABASE_PW");
 

 
	$sql="select `video` from `TABLE` where `stamp` like '".date("Y-m-d H:i:")."%'";
 
				$query = $dbh -> prepare($sql);
 
				$query->execute();
 
				if ($query->rowCount() > 0){ #rowCount() won't work on some databases
 
					$values = $query->fetch(PDO::FETCH_ASSOC);
 
					while (list($key, $value) = each($values)){
 
						$video_list[]=$value;
 
					}
 
				}
 
$key = file_get_contents($key_file);
 
if (count($video_list)>0){
 
foreach($video_list as $VIDEO_ID){
 
	$VIDEO_ID = str_replace("https://youtube.com/watch?v=", "", $VIDEO_ID);
 
	$VIDEO_ID = str_replace("https://youtu.be/", "", $VIDEO_ID);
 

 
#Sample $VIDEO_ID can be "gYY3fVz6PjY";
 
/**
 
 * This sample adds new tags to a YouTube video by:
 
 *
 
 * 1. Retrieving the video resource by calling the "youtube.videos.list" method
 
 *    and setting the "id" parameter
 
 * 2. Appending new tags to the video resource's snippet.tags[] list
 
 * 3. Updating the video resource by calling the youtube.videos.update method.
 
 *
 
 * @author Ibrahim Ulukaya
 
*/
 

 
// Call set_include_path() as needed to point to your client library.
 
#Download the PHP Client Library from Google at https://developers.google.com/api-client-library/php/
 

 
#This has been installed using Composer - update if you download the files directly
 
set_include_path(get_include_path() . PATH_SEPARATOR . '/PATH/TO/vendor/google/apiclient/src/');
 
    
 
require_once 'Google/Client.php';
 
require_once 'Google/Service/YouTube.php';
 
session_start();
 

 
/*
 
 * You can acquire an OAuth 2.0 client ID and client secret from the
 
 * Google Developers Console <https://console.developers.google.com/>
 
 * For more information about using OAuth 2.0 to access Google APIs, please see:
 
 * <https://developers.google.com/youtube/v3/guides/authentication>
 
 * Please ensure that you have enabled the YouTube Data API for your project.
 
 */
 
$OAUTH2_CLIENT_ID = $CLIENT_ID;
 
$OAUTH2_CLIENT_SECRET = $CLIENT_SECRET;
 

 
$client = new Google_Client();
 
$client->setClientId($OAUTH2_CLIENT_ID);
 
$client->setClientSecret($OAUTH2_CLIENT_SECRET);
 
$client->setScopes('https://www.googleapis.com/auth/youtube');
 

 
#$redirect = filter_var('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'], FILTER_SANITIZE_URL);
 
# If running via Cron, HTTP_HOST may be blank
 
$redirect = filter_var('http://YOUR_URL/' . $_SERVER['PHP_SELF'], FILTER_SANITIZE_URL);
 
$client->setRedirectUri($redirect);
 

 
$scope=array("https://www.googleapis.com/auth/youtube", "https://www.googleapis.com/auth/youtubepartner", "https://www.googleapis.com/auth/youtube.forcessl");
 

 
// Define an object that will be used to make all API requests.
 

 

 
#if (isset($_GET['code'])) {
 
#  if (strval($_SESSION['state']) !== strval($_GET['state'])) {
 
#    die('The session state did not match.');
 
#  }
 
#
 
#  $client->authenticate($_GET['code']);
 
#  $_SESSION['token'] = $client->getAccessToken();
 
#  header('Location: ' . $redirect);
 
#}
 
#
 
#if (isset($_SESSION['token'])) {
 
#  $client->setAccessToken($_SESSION['token']);
 
#}
 
$client_id = $CLIENT_ID;
 
$client_secret = $CLIENT_SECRET;
 
#var_dump($key);
 

 
  $client = new Google_Client();
 
    $client->setApplicationName($application_name);
 
    $client->setClientId($client_id);
 
    $client->setAccessType('offline');
 
    $client->setAccessToken($key);
 
    $client->setScopes($scope);
 
    $client->setClientSecret($client_secret);
 

 
// Check to ensure that the access token was successfully acquired.
 
if ($client->getAccessToken()) {
 
/**
 
         * Check to see if our access token has expired. If so, get a new one and save it to file for future use.
 
         */
 
        if($client->isAccessTokenExpired()) {
 
            $newToken = json_decode($client->getAccessToken());
 
            $client->refreshToken($newToken->refresh_token);
 
		#This is for debugging if your token is not regenerated
 
	    #var_dump($client->getAccessToken());
 
            file_put_contents($key_file, $client->getAccessToken());
 
        }
 

 
$youtube = new Google_Service_YouTube($client);
 

 
  try{
 

 
    // REPLACE this value with the video ID of the video being updated.
 
    $videoId = $VIDEO_ID;
 

 
    // Call the API's videos.list method to retrieve the video resource.
 
    $listResponse = $youtube->videos->listVideos("status", array('id'=>$videoId));
 

 
#	array( 'id' => $VIDEO_ID, 'status' => array('privacyStatus' => 'public')));
 

 
    // If $listResponse is empty, the specified video was not found.
 
    if (empty($listResponse)) {
 
      $htmlBody .= sprintf('<h3>Can't find a video with video id: %s</h3>', $videoId);
 
    } else {
 
      // Since the request specified a video ID, the response only
 
      // contains one video resource.
 
      $video = $listResponse[0];
 
	$videoStatus = $video['status'];
 
	$videoStatus->privacyStatus = 'public'; #privacyStatus options are public, private, and unlisted
 
	$video->setStatus($videoStatus);
 
	$updateResponse = $youtube->videos->update('status', $video);
 

 

 
#    $htmlBody .= "<h3>Video Updated</h3><ul>";
 
#    $htmlBody .= sprintf('<li>Tags "%s" and "%s" added for video %s (%s) </li>',
 
#        array_pop($responseTags), array_pop($responseTags),
 
#        $videoId, $video['snippet']['title']);
 
#    $htmlBody .= '</ul>';
 
$htmlBody = "We're Good!"; #Just a debug phrase to know that the script completed successfully. Not required to output
 

 
  }
 
    } catch (Google_Service_Exception $e) {
 
      $htmlBody .= sprintf('<p>A service error occurred: <code>%s</code></p>',
 
          htmlspecialchars($e->getMessage()));
 
    } catch (Google_Exception $e) {
 
      $htmlBody .= sprintf('<p>An client error occurred: <code>%s</code></p>',
 
          htmlspecialchars($e->getMessage()));
 
    }
 

 
    $_SESSION['token'] = $client->getAccessToken();
 
    } else {
 
      // If the user hasn't authorized the app, initiate the OAuth flow
 
      $state = mt_rand();
 
      $client->setState($state);
 
      $_SESSION['state'] = $state;
 

 
      $authUrl = $client->createAuthUrl();
 
      $htmlBody = <<<END
 
  <h3>Authorization Required</h3>
 
  <p>You need to <a href="$authUrl">authorize access</a> before proceeding.<p>
 
END;
 
    }
 
#      echo "<body>$htmlBody</body>";
 
}}
 
	?>
 

Again, Here's the Github repository)


Tags:#php #mysql #japanoblog #video #youtube #api #oauth

What I learned from my first Startup Failure

I was inspired to write this from many articles referenced in the December 21st Edition of Startup Digest. In that newsletter, I found many articles about "What I learned from my Startup Failure" (or along the lines). Therefore, I thought I would write this.

Work on the business, not in the business


As the quote from Michael Gerber goes, it is best to work on the business instead of in the business. In my college career as an aspiring Entrepreneur, I never really understood that quote. My logic consisted of the following phrase: "If you can do the task, then do it and market yourself. You are the business - it's your idea, it should be your fame." It took me roughly 7 years to understand that I was wrong.

From Day 1 up until the end of 2012, I was the "CEO/President" of Shadow Development (CEO from 2005-2009ish, when I learned that if I was a "CEO of a small company, then the credibility hasn't been built", so I downgraded to "President" thinking "Yeah, that'll work"; yeah right). In 2013, I stepped down from "President" to "VP of Operations" basically stepping aside from the Presidential duties and taking a look at the business as an outsider and not just as myself.

That was probably the best thing that I've ever done. Not in the "This was a great decision, it made a million bucks" kind of way, more of a "I see what is actually happening and not just want I want to happen."

I saw that the business had been running on my hopes, my dreams, and my stubbornness for far too long. I should have shut the doors a long time ago if I saw this happening. Even throughout the ups and downs, it was my stubbornness that kept my business up for so long.

What should I have done? Hired someone to take care of the project management, project development, and selling. I shouldn't have done those things back when the business was started. I should have managed the business, sought out investment, asked others for help, evaluate the cash flow, find ways to save money, establish marketing channels, etc; not become the primary developer.

Basically, I've learned that "If a person can't do the work, then they should be fired. Based on the logic, if you can't do the work, then fire yourself, but then the company will no longer exist." However, I couldn't fire myself because I was too damn proud.
Entrepreneur Fail


Surround yourself with like-minded people who can do the jobs you ask


After dealing with managing people, it's a lot harder than just "Do this task." You must take into account their schedule, their emotions, their skill sets, not "playing favorites", their quality, etc. I always thought that "If I surround myself with people that have the skill sets, I can delegate tasks to them" (see the next point as well). Well, I hired developers, designers, project managers, sales people, and interns. What did I get: next to nothing.

My designers didn't have anywhere near the skill sets that I had imagined. I thought "They have design experience and an eye for design. Their designs will be great!" What I received was "This is what I think will work", not what I had in mind.

My developers knew what they were doing (for their development levels), but they had a long way to go in order to provide what we promised the clients.

My sales people said they knew the material, they knew the sales process, they knew the contracts and services. However, they also fell short of expectation and probably couldn't sell water to a dying man in the desert. (Hell, neither can I)

My interns were treated as "gofers" instead of the "learn as you work" kind of experience. I didn't like that.

My project manager was great at managing projects, but we didn't have many projects to give them that weren't already being managed (or the budget to allocate to them).

In short: Just because the person you hired had the title "X" doesn't mean that they can do what you expected of your last "X".

(However,) Hire Slow and Fire Fast


Just because you are in a company doesn't mean you need to have 10 employees around you. Take your time to hire the right person for the right job. If you hire someone just because they have "X" in their previous title, that doesn't exactly mean that they know everything there is about X (for example: just because someone says they are a salesperson doesn't mean they can actually sell).

If a person isn't the right fit for a job, get rid of them. If a person isn't doing what you want them to do, get rid of them. If the person is trying to take over the company, get rid of them - quickly.

I know that many Managerial books have said "Hire Slow, Fire Fast", and I never really understood what that meant. However, now I know what they meant, and I have been burned in order to learn that.

Don't think that "If I just keep them on the payroll for another few days/weeks/months, things will turn around." That never worked for me. I also knew that my stubbornness got in the way for "being nice to people" because I wanted to see them come around, like in TV shows. Yeah right.

If a person isn't doing their job, you have 2 choices, and you better choose one fast. Either 1) Train them to do their job better, or 2) Fire them without resentment.

If I could go back in time and do one or the other, I would have chosen #2 in a heartbeat instead of waiting around for about a year to see what would happen. I would have rather hired the right person for the job, instead of someone who I thought would work based on their previous title.

Never expect to copy yourself


If you are super-skilled in X, don't expect others to be as well. They may have the same basis, but you can't expect them to know what you know in 24 hours - especially if you were trained over several years.

I have been studying Web Development since 2001, since my first HTML class in high school. Since then, everything else has been self taught: Advanced CSS, PHP, MySQL, jQuery, XML/XSL, DHTML, JavaScript, Python, Ruby on Rails, etc. So I've had over 10 years of experience in the field.

When I hired on extra developers, I had a high expectation: they were on the same level as myself and could crank out stuff just like me.

I could not have been more wrong.

Most of the developers I hired on worked under the premise that they would learn additional skills under my leadership. Well, I spent roughly 2 months teaching them the most common advanced PHP techniques, jQuery items, CSS3 markup, and even Database management with MySQL (as much as I could do). What did I expect? I expected them to come out of the training doing what I was doing. The actual result: I advanced their skill set a bit, but they were still a long way off from developing what we needed for our clients.

I always said "If I could copy myself, I would", but in today's technological era, that's an impossibility (unless you're a sheep).

Basically, it came down to the education gap between me and the other developers; I knew a lot more than they did, and they needed to know a lot more if they were to crank out stuff like me. That wasn't going to happen in 2 months or 2 years - they needed the "on-the-job training" like I had; they needed the "decade of wrong-doings" that I had; they needed to "do things the hard way before learning the ease of a shortcut" like I did (I spent nearly 2 months of nights and weekends in my room hand-coding a visual editor (without advanced PHP functions) because I "wanted to do it").

Location, Location, Location


Waynesville, NC, is not the place for a high-tech kind of company. It took me many years of trial and error (mostly error) to figure that out. As my business advisor once said, "I'm sorry you are in this area." If I was in Raleigh, Charlotte, Atlanta, San Francisco, New York, etc, it would make more sense, but you can't force a business model (or technique) into an area that isn't ready for it. Most of the businesses in this area are "Mom and Pop" stores with owners who are usually the ones behind the counter. While there isn't a problem with this kind of business operation, it isn't the kind of market that can allocate thousands of dollars towards marketing.

I also didn't find out until a few years in (after moving to a small office space in 2007) that we could not put up any additional advertising on the building we were renting, or near the building in general. The landlord did provide us with a large sign on the front that had all of the businesses listed that were inside our building, but any additional logos, signs, even something saying "HERE WE ARE" were prohibited.

My suggestions: prime location for exposure (like Main Street), a professional environment that you can advertise with/on, and/or an easy access office.

Price is not always a factor, but it is a big one


Price may be beneficial, but you can always set it too high or too low. Most people in this area want a low-cost solution, and if your only price range starts in the $1000's, you can easily price yourself out of a market, which is pretty much what we did. After calculating how many hours went into the research, the design testing, the development creation, the usability tweaking, and the launching of a site, $1000 was the bare minimum for the kind of work we produced. While a company in Atlanta wouldn't bat an eye at that, people up here would turn us away within a second. The people up here want the $5 solution, the "What can I pay you to do that won't cost me an arm and a leg" type of solution, the "I have $100, what can you do" kind of solution. Not the "$1000 will get you X, Y, and Z" kind of solution.

Create an enjoyable work environment


A happy team is a productive team. While I'm always the one to think of an enjoyable environment such as Google, IDEO, Patagonia, etc, we didn't really have that, and it showed. Although the extent of our budget allowed for the purchase of some darts with my own dart board, it didn't provide much of an "enjoyable environment" as it were. I also brought in my personal PS2, games, and TV to hopefully provide a few hours of entertainment for the staff. It was never touched. I would love to provide a ping-pong table, a pool table, a HDTV with PS3 entertainment, and more, but our budget didn't allow for it, because I didn't put the money aside to do so.

Don't grow too fast


Grow your company as needed. Don't expect to have your own glass-covered office in 5 years. Don't expect to have a pool table and 200" TV next year. Don't expect to have 30 employees and your own stock options next month.

If you grow too fast, your goals and focus will be thrown out of alignment and you will be focused on the end-goal, not the "right now" goal. So your company is 5 years old - does that mean you need your own conference room? No - invest that money into more marketing and product development, maybe even some staff training. If you absolutely need that conference room, then your company will tell you so. Until then, find a library meeting room, somebody's house, or even a coffee shop to meet at.

Don't get caught up in meetings


Just because you have meetings doesn't mean that they (or the people who attend them) will be productive. As I learned from my years at Last Minute Productions, the majority of items that were discussed in the board room usually stayed in the board room. During my reign as President, I vowed to change that, although my board didn't like the idea (they wanted more money for doing less). In most Board Meetings, assigning a task to someone that will get it done usually results in responsibility, accountability, reliance. If a task is not assigned, then it will not get done.

Also, I always thought it was a great idea to bring my board member attendees up to speed with what has been happening. Usually, that turned into 45 minutes of me blabbing about calls, meetings, and other items that didn't concern, relate, or include the other members. I could have just as easily summarized those blabbings, or even just said the end result and cut the time down to 5 minutes, but my stubbornness got in the way and I was too proud of myself for all of the work that I did (and nobody else). What I should have done is delegated out some of those items to the members so I wasn't always bogged down with items like that.

Don't over complicate things


When I first started my company, I thought that the idea of making websites easy to use would be easy. I mean, the whole world was doing it wrong: Geocities, Yahoo Sites, Homestead websites, even "Welcome! I'm HTML Code!" websites were designing things wrong. The wrong resolution, relying on "Best Viewed in Internet Explorer" tags, over complicating things with animated GIF's to make the site "cute", creating 5-minute flash "splash pages" that you had to sit through in order to get to the site's content, and the list goes on.

I thought I could change this. Instead, I made it more complicated.

In The Oatmeal's blog posting on "How A Web Design Can Go Straight To Hell", the artist/programmer/fun guy Matt Inman talks about exactly what I mean: taking a poorly designed website from the 90's and improving it with high-def graphics, a nice content flow, a beautifully laid out menu, and easy-to-read items. Instead, the client wants what they had: a poorly designed site from the 90's because that's what they had, and that's what they're used to (hence, the "cute kitty", the "mother who designed a Bake Sale flyer in the 80's", and the "pop" and "edgy" items that only exist in their mind). Personally, I also hated it when people would come into Staples (when I worked there) and acted like they knew more than I did in Technology - the same concept applies here: when clients think they know what they should based on the latest article, blog, or news report and want "Web 2.0 items" and "SEO Techniques" integrated into their sites, thinking that those are the most important and absolutely necessary items to have a great site.

I also tried to put too much focus on "how the site worked" and not so much on "how the site looked". My logic said that "if the site worked beautifully, we can design around it. Too many companies focus on how the site looks and not how it operates. Let's flip that." I was wrong. I knew that people went to websites because they looked great (the latest graphics, the flowing sections, even the effects on the photos). I also knew that people left websites because they operated poorly (bad links, page redirection went wrong, server errors that didn't make sense, etc). I wanted to focus on the development of the site to make it operate as expected.

What should I have done? Balanced the design and development, making sure that the design was exciting and the site operated as expected - nothing more.

Always have a backup. And when you do, backup some more


Having your hosting company hold your content hostage is bad business. Over the course of 8 years, I switched hosting companies 4 times. In 2005, I self-hosted, thinking that it wasn't that hard. I was wrong.

In 2006, I moved over to "Website Source" and it was pretty easy to manage, but it cost roughly $66/mth. I did lose some data while with them, and it cost me $50 to recover it from one of their backups.

I migrated to some larger systems while with Website Source, but in 2013, I had to call it quits. In early 2013, I switched to another company (I won't name names here) that would provide me with direct access to our server with backups.

In late 2013, they called it quits with us and froze our server, which meant that all of our data (ours, customers, databases, financial, emails, etc) was gone, and it took me nearly 4 days to get them to "unfreeze" the server so I could transfer the data off. And their "promise" of a backup system? Never happened, so the only place that our data existed was on one single hard drive.

Late 2013-now, I'm now back on my own hosted server (with a lot more experience for managing) and have a backup script to an external server running 2x/day, just in case.

Overall, backup all of your data. Once you do, back it up again, because you never know when you will need it.

If you are going for professional, don't cut corners


Even the iPhone 4 launch was pushed back due to some flaws. Back in 2005, our slogan was "We stay in the shadows, you get all the credit" which was okay. In 2007, our slogan changed to "Simply Professional, Professionally Simple." Personally, I liked it; it portrayed an image of professionalism along with the confidence of knowing that we would be simple (not to contradict a previous point, but that wasn't relevant right now). We even got some professionally printed white polo's that had our company logo on them to display our professionalism. Whenever I went to a client meeting, I made sure that I was clean shaven, my hair was washed, my teeth were brushed, my polo was clean and tucked, my pants were clean, and my shoes were shiny, along with other items to show that I was "A Professional." I thought that this image would be a standard and everybody who copied me would show that we were professionals.

My primary sales person thought otherwise. When I first brought on our primary sales person, I knew that he was a laid-back guy. He was my old freshmen english professor, and I thought that with his "relaxed state" and our "hardened professional mind", we could go far. I didn't expect him to cut so many corners in our "professional environment." For starters, he thought that just because we were a "company", we had millions of dollars sitting in the bank, and $20 meal wouldn't be missed. Little did he know that the $20 he just spent on a meal could have gone towards other resources, such as supplies (and we didn't have much in the bank to begin with, so $20 could have been all that we had!) To make matters worse, I had to order a button up shirt instead of a polo for him, because he didn't like things over his head. When he went to client meetings, he rolled up the long sleeves on his button up shirt. Sometimes he arrived with his button up shirt untucked from his pants, and even left it unbuttoned. He would approach potential clients like they were old friends, taking the conversation on completely irrelevant tangents, and even throwing in a few curse words to get his point across (playfully). Although I knew that we should have let him go a lot earlier, my stubbornness got in the way and thought "he can be reformed." Again, I was wrong...for 2 years (he finally left under his own accord).

Keep in touch with your team


Miscommunication (or lack of communication) can make team members drift apart, and if you constantly rely on them, then losing them is not an option. When I used to talk to my team members on a daily basis, it almost got annoying. However, going days, weeks, even months without any communication seemed like we were drifting apart, almost to the point of "Do I have a job anymore?" (which I have received a few times). Communication is key, but effective and frequent communication is better.

Make all of your goals and intentions clear


Stick to a timeline, schedule your goals and expectations, make sure that everyone knows what the result will be. Missing a deadline is a lot more than just a lowered grade on a test - in the real world, it can mean losing somebody's business.

Whenever I assigned a task to someone, I expected it to get done by the deadline set. When the person says "no problem", my expectation of getting the job done seems worthy. However, when the deadline comes along and there isn't a completed project (or even progress on said project), then my reliance becomes less and less, almost to the point of "If you can't do the task, then you're fired." But, once again, my stubbornness got in the way and I didn't fire anybody. However, when something is delegated out to a person, and that person hasn't completed the task, then the blame is put on the person that delegated the task in the first place, and personally, I'm tired of being blamed for delegating uncompleted tasks (which is why I would take the tasks in the first place, so that I knew it would get done on time, but then I was blamed for not giving anybody else any tasks and hogging everything). It's an endless cycle....

Basically, make the goals and intentions clear. Make the deadlines important, and the punishments clear. Don't allow anyone to slip by because of something that isn't understood.

Never stop seeking out investments


Bootstrapping is a great solution...if you are in your 2nd week of operations. But much later, you will need to seek out more investments in order to grow your business and can't always rely on bootstrapping. If you are taking in your income and only keeping 30% of it as profit, then you won't have enough to cover any additional items, such as moral-boosting get-togethers, upgraded office equipment, RENT, and more.
Also, make sure your team can get paid. Basically working a "freelance" job (or an on-call part-time job) isn't going to pay the bills. If your team isn't committed to you, they will seek out other opportunities for income and leave you.

Set the example


You are the boss. Show your team what you can do. Otherwise, you're just a team member. If you need to resolve a conflict, then resolve it peacefully. If you ARE the conflict, fire yourself or get a 3rd party arbitration.

If you expect your staff to be there on the holiday, you need to show up on the holiday(s). If you expect your team to be there at 7am, then make sure that you are there at 7am (preferably with a hot pot of coffee). If you expect your team to work 40 hours on a project, then you work 40 hours on a project.

Don't just sit back and expect to take the credit while your team does all of the dirty work.

Never expect someone to completely understand what you are offering, and the benefit of it, within the first few minutes of your presentation


Entrepreneur Fail

I expected people to see what we offered and go "Hey! That's what I need! And look at all of the great features!". Instead, I received glassy-eyed stares, basic technology questions, bored attendees, and other signs saying "I have no idea what you are talking about."

When we offered "Advanced, modern websites with the technologies of HTML, CSS, PHP, MySQL, jQuery, and more", I expected a bit of confusion among the crowd, especially at the acronym part, but that was to show our expertise in the technologies and show that "We know what we are doing." Therefore, the potential client would say "They know what they are doing - we should go with them." Instead, it resulted in "I have no idea what that means; therefore, I'm not listening to you anymore."

My expectation was that people would easily understand what we were offering by our presentations, our elevator pitches, and our portfolio. Instead, most people didn't understand or care what I had to say. It basically took an educational session to bring them up to the same level as us for them to understand what we were saying. Let's just say that it didn't turn out well.

Therefore, simplify your techniques. Don't throw in all of the bells and whistles just to impress people. Tell them what they want to know, not what they need to know. It's like an interview: tell the person interviewing you what they want to hear ("I can do the job"), not what they need to here ("With my three decades of experience in X, I suggest that you should do A, B, and C"). Even if it means that they are missing out on an important aspect (ie: security flaws), they want to hear what they want to hear.

Do research on your market, then create the product - not the other way around


I always thought "If you build it, they will come" (insert movie reference here). That may work for some items, but not everything, such as my business. I created a "modern, high-tech web design company" that I thought people would be busting my door down for us to work with them. Instead, of the clients that we found in the Western North Carolina area, most of them were busting my door down because they were unhappy with the service.

I also thought that if we created a service that cranked out quality websites and charged a monthly fee to maintain them, then we would be rolling in the profits. Easy as pie, right? Well, it wasn't so. First, we had to go out and almost physically drag the potential clients to sign with us. Then we had to make sure that we did almost every project underbudget, then provide continuous tech support for the most basic items, even if it went against our "best practice" recommendations. Yada yada yada.... Not really the best idea for starting a business, then sitting back and relaxing while the profits roll in.

Another developer wrote an article about a similar concept, and I agree with him: Research the market, then build the product. Just because you have the best designed, flashy, sparkly billboard in the desert doesn't mean that people will see it, or want to see it.

Don't screw up your credit


As an 18-year old, my first credit card was a surprise. I just entered college and had a personal banking account with Wachovia for a few months (there wasn't a branch of my local bank in my college town, so I switched). A few months in, I received a card from Wachovia saying "Your New Credit Card". I thought "My parents warned me about this. My sister had a bad experience with one. I should not use this unless it is an absolute emergency." So what did I do? I went to Taco Bell and got a drink to test the card out. It worked!

A month later, I used the card some more on a few small things, thinking "I'm getting paid, I can pay it off." I receive my first credit statement. "Amount due: $105. Minimum payment required: $5." When I saw this, I thought "Great! I can make the minimum payment and pay it off slowly." I would like to point out that this card had a limit of $10,000 because I used Debit since I opened the account.

Six months go by. I pay the minimum payment for six months. My credit bill is probably in the medium-to-high 100's. Suddenly, on my credit bill for the 7th month, minimum payment jumps to near $75 or so. In my mind, I'm thinking "Whoa! What happened? This is insane!" I call Wachovia asking about the jump in payment, and they say it's a "Promotional Period that has expired." I told them that I never heard of a promotional period when this started, and I was never offered it as the card was sent to me in the mail, which I never signed up for anyway. The lady was extremely persistent on the fact that since I had the card and was using it, that I was liable for any purchases, regardless of what the promotional period was or what the minimum payment was. I told her "I can't make the minimum payment right now! I don't even have a (well funded) job!" She basically said something along the lines of "Not my problem."

I will say at this point: I never expected my personal credit to cross paths with my investment record.

A few years go by, I get a job that pays roughly $150/mth. Not bad for a part-time gig. I start to pay off my credit bill little by little. Next thing I know, my minimum payment jumps to around $250/mth. I call again and complain, but I was told again by the bank "Not [their] problem". So, my credit bill keeps going up because I can't make the minimum payment, and 29% interest is gained on the bill because it hasn't been paid. At the $7,000 credit mark, I completely stopped using the card altogether. After all of the interest and "late fees" added up, my card topped the $10,000 limit within no time at all. I told Wachovia "I don't use the card. I will never use the card again. Please close the account and I will pay it off." They basically said "The account can't be closed until the card is paid off." So, the account stayed open and accrued interest. Just great. It finally got closed a few years ago, and I'm still attempting to pay it off, but I expect that will take about 10 years or so to pay it all off.

Later in my college career, I start to seek out additional funding for my business. The first few places I go say "Your business plan looks good, but in order to get you funding, we need to take a look at the Owner's credit report." What? This was never covered (in depth) in college!

Let's just say that pretty much every investor I talked to said "Yes" to the business, the plan, and everything else, then changed their mind to "No" once they saw my credit score.

I have never accepted another credit card since the first one, and never will again, regardless of any "offers", "Cash back deals", or "frequent flier points" they provide.

If I could go back and change history, I would have never bought that drink at Taco Bell and shredded the credit card. My credit score would keep going up because I was making so many on-time payments with debit, and I could probably have a few thousand (if not hundred thousand) in investments right about now.


Summary
I know that I've covered a lot of points in this entry. I just wanted to get most of them off my chest before I went to some type of therapy (Even referencing this article was a stretch). Hopefully, other entrepreneurs will read this and discover that not everything will work out like in the movies, the books, or even in the classroom scenarios. You are not indestructible. Your life does hold secrets that others will find. You cannot hide from everything. There is no "reset" button. And, you should fail before you succeed. I know many Venture Capitalists may not look at me because "I have a failed business", but you know what? So what. I've gone through 8 years of self-torment, stubbornness, hopefulness, and grief to know what to do and what not to do. If that means that you won't look at me because of that, then I will go elsewhere.

I'm not saying that you (as an entrepreneur) should read every business book out there. I'm not saying that every article on the internet is right. Go through your own experiences and learn the mistakes. Even Albert Einstein once said, "Anyone who has never made a mistake has never tried anything new." Therefore, I have learned many lessons through my mistakes?

Am I done learning mistakes? Not by a long shot.


Tags:#entrepreneur #fail #credit #php #html #xml #css #jquery #business #lessonslearned #server

Backup and Restore All MySQL Databases

I routinely make mass backups of all of my MySQL databases, but sometimes forget the syntax when doing so. Instead of creating a script to do it (which I will do in the future), I have to Google the syntax to find out what it is. Most of the time, I can only find one or the other, so I thought I'd gather these two commands here and hopefully provide a better reference for anyone else searching.

Making a Full Backup (All Databases)


Using a Linux Terminal:
$ mysqldump -u [username] -p[password] --all-databases > [filename].sql
notice that there is no space between -p and [password]

Restoring a Full Backup (All Databases)

Using a Linux Terminal:
$ mysql -u [username] -p[password] < [filename].sql
notice that there is no space between -p and [password] Hope this helps others that scour the internet looking for these two common commands.


Tags:#mysql #linux #backup #restore

My Thought Process

SALAD!
No, my thought process isn't this.....squirrel!

There have been many instances when people that know me very well start talking to me, and during the conversation, my eyes go back and forth very quickly. Some people may think I'm having a spasm. Technically, no. It's just my "Thought Process" starting up and going 1000MPH.

For the sake of understanding, I have (at least started) a list of items that my thought process goes through when it gets started. 99% of the time, it deals with a new website or web-based service. And to give you a better understanding about what my process goes through, instead of just staring at me with a quizzical look, here's (mostly) everything:

My Thought Process: (by the way, all of these happen at the same time)
- preestablished functions and methods required during the development process
- passing variables between applications/pages/databases/forms/etc
- best way to "write" the code
- memory consumption limits
- resolution flexibility
- information security (transmission and storage)
- "what will the end result be?"
- infinite loop restrictions
- shortening the "writing" process with custom functions
- function recursion process
- CSS formatting
- interactivity with jQuery
- script automation
- plausibility of completion
- requirements for device compatibility (mobile, tablet, phone, etc)
- legal hurdles
- usability practices
- SEO tactics
- overall user flow throughout the site/application
- mock designs
- database storage and retrieval designs

(Yes, it's a lot. What did you think, I just thought about the design?)

I may add more to this list as need be, but at least it's a start.


Tags:#thought #process #websites #webapps #css #jquery

Bachelor for a Week 2013: Day 4

Today was very unenthusiastic/lethargic. The thought of "something is missing" was always on my mind, and I didn't have the slightest idea why.

Here's a clue:
Squirrel


Yep, the internet was out at home, so I'm Internet/Email/TV/Server-less for the night. I don't know what the exact reason is, but I was told it will be back on tomorrow. (I'm writing this on my home server, so I still have access to that, but if you are reading this, then it means that the internet is back up)

On a better note, my order of Assimilation2 came in today! I can't wait to crack it open and see what happens to the Enterprise and the Doctor.

Since the Internet was out, I didn't really know what I was going to do. Netflix, Hulu, Pandora, iHeartRadio all require the internet, and I have limited data on my phone (which resets on the 21st, so just under a month away, and the only radio system in the house is in the attic). So I thought I would catch up on some Reboot for nostalgia-sake. Currently, I'm at the end of Season 2, and it's amazing how many adult themes/pop culture references/computer science jokes there are that I never caught as a kid (there was even a bit in AndrAIa where they have a Kirk and Picard reference!).

While I was waiting on dinner to be microwaved, I worked on some localhost files and retweaked my RSS parser. Apparently, anybody referencing my RSS feed was getting some incomplete parsed code, which looked very weird when processed. I believe I have fixed the problem, but I won't know officially until outside sources process the feed.

In addition, I have pretty much confirmed that CJ is coming up next tuesday. That will be exciting, although I expect some of my production to slow down since getting CJ+Keat+Me together can cause some rather long discussions (in a good way). Man, some stores can demonstrate that!

All things considered, Keat's vacation is half over. Optimistically, she is only 3 days away. I can't wait to (get the drive over with and) go to the Greenville airport on Friday night and pick her up. My expectation is for Saturday to be a super-lazy day and Sunday is a "you're back, let's celebrate" day (weather permitting).

Also, Doctor Who returns in 3 days as well! I won't be able to watch the live event, but I will sure find some resources to watch The Bells of St. John!

On a related note, here's this:
Dalek mania!


Tags:#internetisout #squirrel #cheezeburger #startrek #doctorwho #cj #rss #reboot #netflix #hulu #pandora #localhost #keat

Bachelor for a Week 2013: Day 2

I did not report in yesterday because I was in immense pain, almost flu-like symptoms. Needless to say, I spent most of the day in bed, surrounded by cats.

Today, however, was much better. For me, but not for the weather.
Garfield

(Seriously: a major downpour of rain today, snow last Thursday, great short-sleeve weather on previous weekends, then heavy gusts throughout the month....all that we're missing is hail)

I moved the Wii into the guest room/office so I could have some entertainment while I coded away. Let's just say that if I had a fridge and a toilet in this room, I'd never leave.

I watched a good chunk of Enterprise today. Now, I'm only 6 episodes away from the end. What's on my "To Watch" list next?

I also wrote 3 articles for Shadow Dev, which will be premiering over the course of the following week.

I worked on the small blurbs and larger fancyboxes of our new pricing page, which should also be premiering sometime soon.

I lastly worked on the Portal 2.0. I made some great stride with window.location.hash when trying to reload pages based on post-hash URI's. jQuery just became a lot better now.

Here's what I am happy about today:
 
$(function(){
 
	$('#db_menu').find('a').live('click', function(){
 
		var link_id = $(this).attr('id');
 
		$.ajax({
 
			type: "GET",
 
			url: "/get_box.php",
 
			data: { q: link_id },
 
			success: function(data){
 
				$('#db_box').html(data);
 
			}
 
		});
 
	});
 

 
	var path = window.location.hash;
 
	if (path==""){
 
		$('#main').click();
 
		window.location.hash = "#main";
 
	}
 
	else
 
		$(path).click();
 
});
 


I basically had to scrap the whole project and start from almost square 1. I kept the original login scripts along with the database structures in tact. My main starting point was from the Dashboard and so on.

My plan over the following week is to improve the new Portal to a point that it is ready to launch. The plan to launch Portal 1.0 with the new site launch had a small...drawback. It didn't convert with the new CSS well, and had a few delayed bugs in it, along with a good chunk missing for the Clients. My goal is for Portal 2.0 to fix that.

I don't usually like scrapping projects during development, but the pro is that the revamp comes out much cleaner than originally expected. Only time (and late nights) will tell if my feats become useful.

On a some-what related note, I was told by Keat (I don't recall if it was today or yesterday, as both days are a bit of a blur) that it is 4° out in Frisco right now. I would have been okay (that's a joke) with 4° Celsius, but we're in America, and that's 4° Fahrenheit. I do wish her the best in that frigid temperature. I'll stick with the rainy 40° here.

XKCD


Also, I used a gift code from StateFarm to order the next Star Trek/Doctor Who Crossover Vol. 2 comic book today. It only cost me $5.71 (and that was with shipping and tax). It would have cost me somewhere around $18 in a shop. Although I do support local shops, I had a gift code that I had to use or it would have expired.


Tags:#jquery #javascript #enterprise #startrek #projects #garfield #keat #articles #xkcd #doctorwho #comics

End of November Catchup


Where to begin, where to begin......

Ok, here's the rundown:

  • I've become a fan of Rules of Engagement. It's actually a pretty good show, and Patrick Warburton is doing well for a sitcom.

  • I participated in my Fraternity's Initiation Night on Friday, and since I can't tell too much, all I can say is that we finally used the FPAC for I-night and it was visually exciting! I wish that the planning was a little better so things went a little smoother than "Okay, it's been 2 hours! What are we supposed to do?" and turning into "We have 2 hours left! RUSH EVERYTHING!"

  • Keat and I were in charge of the Turkey for her parent's Thanksgiving. After all of the criticism, questioning, confronting, questioning, "process correction", questioning, and so on, we did the following:
    - Brined the Turkey for roughly 12 hours
    - stuffed it with an apple, onion, rosemary and other spices
    - baked at 500 for 30 minutes
    - put on a turkey triangle, baked at 350 for 1.5 hours
    - rest for about an hour
    - carved, eat, nap, repeat
    Overall, the Turkey was the best turkey we'd ever had! Now, my parents want us to do it for their Christmas, and Keat's parents have put us on permanent Turkey duty.

  • We are moving our office from the 200 sq ft space to (just under) 900 sq ft! Progress is really going well, and we should be done by Dec 20 (photos are here: flickr.com/photos/shadowdevelopment/sets/72157632013766916/ )

  • We landed a new client: Omega Safety, and a Contest Winner. PR will be released soon

  • Our facebook page reached 100 likes! Yes, through a combination of a Facebook Advertising Beta program (which gave us $100 worth of FB advertising) and some article sharing, we reached 100 likes today! Yay!

  • I created 2 items with jQuery that I thought were really cool: play sound with jQuery and Color blocks with jQuery - most jQuery "Masters" may think that they are super simple, but I thought they are great because I thought about them and created totally from scratch (although the blocks require the jQuery UI plugin)

  • My dad had a weird change-of-careers. Let's just say he doesn't have his job anymore, but has been hired back on with the same company with the same job responsibilities working his own hours at 3x the pay. Yeah, go figure. Apparently, his company got rid of his position, but hired him back on as a Consultant to do his same job. Yeah, that just happened.

  • Found a good solution for our online payment conundrum. WePay is an integrated payment system with an API for automatic charging. Otherwise: a solution to manually monitoring Paypal and manually typing into Square.

  • I started watching the classic Doctor Who episodes (at least, all of the ones available on Netflix Instant) from Hartnell through Baker (translation: First Doctor through Fourth)



I'll stop it there. November was busy, and I'm expecting December to be twice as busy (as always).

Until next update.....

Also, I found out that this blog is just over 2 years old. You can easily see what kind of updates I post on this thing.


Tags:#doctorwho #jquery #november #turkey #keat #dad #pilambdaphi #fpac #japan

Monday Rollercoaster

Since I seem to droll on with my previous catch-up posts, I promise to keep this one short and sweet:

Today:
  • Came in today, worked with Janet to get her new menu ready
  • Recorded/processed payments/invoices for 3 clients
  • Added rewards to said clients
  • Signed up for Basecamp, explored it a bit
  • responded to emails, including Tom, Kat (+debugging), client (previous system), client (current checkout system), client (invoice followup), Amazon Spoofing
  • Checked my backlogged Reader
  • Ordered mini-squishies
  • Scanned for Health Insurance quotes - couldn't find anything usable under $90/mthCompany insurance survey
  • reconciled accounts (both)
  • split insurance declarations into one document
  • updated SD's G+ page
  • added G+ to Blog and site (for Author Verification program)
  • updated Janet's site with new roll
  • explored IdeaPaint some more
  • worked on the Team Operating Manual a bit

Previous to today:
  • Rewatching the reboot of Doctor Who, got Keat hooked
  • Signed SD up for Pintrest, flickr
  • made some major progress on the SD Portal
  • became Google Engage partner
  • talked with White Fox Studios
  • went to family gathering, had fun
  • started going to N-Scale meetings
  • PiLam volunteer meetings
  • Interviewed two people
  • Southern Atlantian Archery Day (SAAD):, rain, bow broke, stayed a night at Keat's parent's place, got refund for busted bow
  • JapanFest!
  • Sacred Stone Baronial Birthday: fun, shot some, went and stayed the night at friends house b/c it was so humid
  • met with SMDC, we are moving! (videos)
  • SD now insured
  • Got award from Powder Creek Traditional Archery


See? Told you it would be short and sweet.

And here's a short and sweet comic to sum up what Niko has been doing when I'm not in the chair:
Kitty in Chair


Tags:#doctorwho #janet #invoices #basecamp #squishies #insurance #googleplus #ideapaint #pilambdaphi #saad #japanfest #trains

Summer is over...but it's not a bad thing

Garfield


It has been some crazy past few weeks. Let me do a quick summary of what's happened:


  • I got into work today at 9:45am. Yes, AM! I had a crazy idea (based on an American Dad episode - the one where Roger has the "Sidney" persona that takes the hit out on himself. You remember that one? Don't cha? Right? Anyway...) to place my glasses by my "alarm". I turned off the alarm at 8:15 this morning (because Keat had to get into school before 10), reset it for 9, and went back to sleep. I got up at 9, turned off the alarm, and put my glasses on. Somehow, I felt more....awake and didn't want to go back to bed. So I got dressed, shaved, etc, and went into work. Anyway, I spent 2 hours going through my Reader and finding a lot of interesting business- and website-related articles that I felt would be good resources to share with the interwebs. So I scheduled i-don't-know-how-many posts into the Shadow Dev facebook page all the way through August 30, posting 2 per day. I then got the green light from Tom to send out an intro letter to a potential client in Asheville (after much editing), and sending some carefully worded explanations out as well. Afterwards, I worked on the Analysis followup links (see more below) and created that from almost-scratch to finished; jQuery, Paypal, form creation, and all, in a matter of about 2 hours. I then worked on a setInterval() on the Shadow Dev β site making random testimonials show up in a testimonial box every 4.5 seconds. That took about an hour or so. I had the hardest time figuring out 1) how to have the loop continuous, then 2) having the previous entry fade out, then the new one fade in. Afterwards, I met with Marti (see below) at 2 and met with her until about 4:45ish discussing different and new Project Management techniques, forms, and methods, along with a "Project Closure" sequence, which is new to me. I was getting things prepped for my teleconference at 7 when Tom sent me some requested files for the Maintenance and Rewards programs. I used the files he sent over to create the Rewards and Maintenance pages (finally). After I got done with that, I realized that I was supposed to meet Eric at Frog Level at 5 for casual beers. I hope he doesn't feel bad that I stood him up...? It was about 6:40 when I was done with the previous item, and I thought I would lay down for about 15 minutes. I set a timer for 15 minutes, and an alarm that would wake me up at 6:55. I started it (I saw it counting down), then went to lay down. About ~15 minutes later, I wake myself up, thinking that I overslept...again (see below). I woke up a minute before 7pm. Freaking out, I go over to my phone and try to call in. I see that my phone had only count down 2 seconds (from when I put it down), so it never counted down from 15 minutes. Somehow, I don't think my phone doesn't like to set alarms on Wednesday nights (see below, again). I called in to the teleconference, participated, and we were done in about 45 minutes. I then took it upon myself to clean out the office fridge. Long story short: it was over-freezing, so we turned down the temp. and the ice melted - all of it, so I transferred some out and emptied it in the sink. I then went home and watched some Big Bang, Futurama, Big Bang, and Battlestar Galactica. And that's just TODAY!


  • So, my Wednesday went a little wonkier than usual. I'll skim through the rest:


  • I created a Quote Generation System for Shadow Dev. I also created a Automatic Quote Followup system to send an email to the person who generated the quote for a followup. Quite nice if I say so.


  • The HCC Student Incubator was delayed until the beginning of September.


  • We recieved a new client: Premier Vacation Rentals


  • We gained a new staff member: Marti Daves! She comes to us with plenty of Project Manager experience, with a fine interest in hand-coding web development. Certainly a great addition to our team.


  • We re-worked the packets, again. Removed some pages, added some, and added a design to some of the packet folders. Hopefully, the response rate will be better.


  • Ordered 20 more bowls and sign holders. I find it hard to believe that each GLASS bowl was $1.44 each, but each PLASTIC sign holder was $5.34 each. It was pretty expensive, but the source for the sign holders was the least expensive option out of all of them that were researched.


  • I modified our Quota page to show what the Quarterly bonus would be if Quota is met. Should make things easier to manage


  • I created a newer version of a Contract Creator. Adding in some new clauses, price modifications, and service inclusions, and the new created contract is better than ever!


  • We launched the new SMDC design. Now to implement the information.


  • Added something a little different to a client: Instead of processing credit cards (as expected), they wanted "House" accounts (as in, give us your name, and we process your card on file). That wasn't discussed during the project negotiations, so the checkout system wasn't developed with that in mind. But, we did it.


  • Our first Contest winner won the free website, and turned it down, which is good and bad for us. Good: we have less work and don't have to shell out a loss to cover it. Bad: the Winner doesn't get a new site or PR, and we don't get good PR for offering this. Let's see how Round 2 goes...


  • After the last Monthly Meeting, I delegated out "Drinks with Geeks" and "Hello World". Good news: less on my plate to take care of. Now just to train/help the delegatees on how to do that.


  • I also created an auto-followup for websites that are analyzed using our GetMyAnalysis.com analyzer. For the past few weeks, the followup email would say "Get ____ service!" with a link, but never went anywhere. Now, the ordering page has all 3 services available, along with a checkout system (see above for more detail).



That's it for business. If you got this far, I know you're tired of reading this. I'll finish the rest quickly.

First, a bonus comic:
The System


Personal:

  • I reworked my Magic deck using Core 2013 cards. My battles with Chip and Keat are going better, and I'm not being slaughtered as badly.


  • I am now the Project Manager for Pi Lambda Phi Internationals for the front-end portion of the website. I didn't know what to expect, but I thought it would be a good PR rep, along with experience in the PM world.


  • Allstate was charging me $51/mth for auto insurance. Peaking my curiosity, I searched for some quotes from other companies. Out of all of them, State Farm had the best rate at $37/mth. The rest were $44-84/mth (Geico, Nationwide, Progressive (which has a very flash-heavy version), Farmers (they operate as 21st Century around here), and more). I received an auto-followup email saying that my rate was $34/mth. I went to talk to the agent with a few questions, and she said that it was ~$32/mth. Maybe if I keep talking, it may drop below $0/mth! That'd be nice. Anyway, the same auto coverage I was getting from Allstate for $51/mth, I can get for $32/mth from State Farm. Talk about saving $100's (actually, about $240/yr). I have nothing against Allstate - I know my parents have been with them for years, and my policy was spun off about 6 months ago. My Allstate agent was super nice and helped me out a lot. State Farm just provided a better rate.


  • I tried watching the Doctor Who spin-off Torchwood. I'm sorry, but 5 episodes in, and I couldn't get into the storyline. It's too much like Warehouse 13, which I also couldn't get into.


  • I started watching Battlestar Galactica (the 2004 version, with Katee Sackhoff). I'm not totally immersed like I was with Doctor Who, but I like it. Maybe it's because I'm writing a futuristic space-based manga called Phoenix Eye. I don't know...


  • I visited a new Jamacian restaurant around here called One Love. I gotta say: for being out in the middle of nowhere, it was some pretty good food! And not badly priced, either! As soon as I get my paycheck, I know where I'm going again!


  • I gathered the stamina and finally went to a meeting of the "Smoky Mountain Model Railroad Club" 3 weeks ago. I've had their brochure for about 6+ months. The club was mainly about O-Scale trains. Those are nice, but I prefer my N-Scale. I met a guy named Eric there and we tried to go train-spotting during the following week. Due to some bad communication with the relays, our spotting turned up empty. Regardless, it was good to meet someone new. We went to a guy's house in Canton who had a super-ginormous N-Scale layout that he had been building for 20 years. Let's just say that it puts my old 4'x8' plastic-grass oval track to shame. No, worst than shame; I may be in the same "sport" as him, but my set would be "Here's how to play Tee-ball" while his was MLB Atlanta Braves (I'm no sports fan, so if my analogy is incorrect, please let me know). I brought out my N-Scale set and a few books and hope I can go back soon and run my set.


  • Keat and I helped Janet cater a super-fancy party for one of Janet's friends. Let's just say that this guy's garage was the size of our house! He was super-nice, and certainly blows away the "I have a vault-load of money, therefore I have the right to be snooty" stereotype. I don't think this guy could be more friendly. Regardless, the catering event was fun, even if we did walk around for about 8 hours.


  • I am working on a new service called CityFix. It's only in Phase 1 so far, and I'm doing some additional research in order to complete this service. Apparently, there is a need for this, but it hasn't been thoroughly met...yet!


  • I receive daily emails from Randy Glasbergen's publisher for his comic. I will say that I appreciate his humor and quick wit, he has some super-strict copyright policies. If his comic is republished on ANY format, it is $25 per showing. Thank you Randy, but I don't have the budget to shell out $25 per comic. Maybe later...


  • I found a new YouTube series I like: Doctor Whooves. Yes, you read that right. I think my "Brony" is showing...


  • Keat and I attended a MTN. RENDEZVOUS Archery event late July. Personally, I thought "Okay, I pay $10, I get to shoot 10, maybe 15 targets down a range. Not too bad." Instead, Keat and I found out that it was 40+ targets in a woods-style shoot (uphill, downhill, around trees, across creeks, etc). It was 1 arrow per target. 5 pts for the animal (ranging from a rabbit to a bear), 8 points for the inner ring, and 10 points for center ring. I don't recall our scores, but (I believe) Keat beat me during the first 20, and I beat hear during the last 20. $10 for 40+ challenging targets? I'd do that again! (Minus the ticks - I found one on our bed during the next day, and one under my nipple (stop laughing) later that same day). Keat also found a local supplier of traditional archery supplies! Not too bad for one crazy and tiring day!



Okay, that's enough from me for now. Ranting over. Enjoy this penguin:
Penguin!


Tags:#thesystem #garfield #penguin #facebook #reader #americandad #rewards #maintenance #futurama #bigbang #quote #client #hcc #packets #bowls #contract #smdc #contest #magic #mtg #allstate #statefarm #doctorwho #torchwood #galatica #onelove #nscale #janet #archery

Where has the time gone?

The past month has really flown by, hasn't it? Before I knew it, it's already a week before Valentines day and 2 weeks before I turn 25. Wow...a quarter of a century old. When it is put like that, I feel super old. No offense to the "old fogies" I know.

Anyway, here's a run-down of significant things that have happened between my last post and now:

- I'm finishing up DS9 on Netflix. I'm at the tail end of Season 6.

- Finally got my desktop at the house up and running. I can now work at home....into the wee hours of the morning. As I told Tom today, I work from 10-5(pm), and 10-5(am). Good? Maybe. But it beats staying at the office 24/7. Not that that's a bad thing, but I think Keat would miss me.

- Keat may be going to Japan for 2 weeks to a semester next year. On one side: I'm super happy for her (not sarcastic). Going to Japan for 2 weeks was an exhilierating experience for me, so I can only imagine what a semester could do. On the down side: I'll be left alone with 3 cats for a semester! I'm going to go insane.......again.

- We've launched a new "Fishbowl" contest in the area to get some leads. So far, it's looking good. We spent $100 on the materials, and should get more than 100% ROI on this. On a related note....

- Tom and I talked to the owner of Frog Level Brewery, a local brewery in Frog Level (next to Waynesville), about a potential event/conference for local geeks. The owner said "Yes" and planning hit full force. This event will allow the local non-techies to network and ask questions to the local geeks (and get a few beers while we're at it). It's called Drinks With Geeks, and it should be a great event! It won't happen in the immediate future, but maybe in April or May....

- We got a new client: ALP Systems Inc. The owner is a great guy, and it seems like we are copies of each other, if you know what I mean. He's a guy with a "No BS" attitude, and I want to make sure we keep it that way.

- We launched the TICS site on the 1st. So far, so good.

- Allan had a major computer virus that took out his PC for a bit. I'm still working on it after 48 hours, but I think this sums it up:


- Since my laptop finally called it quits, I was able to acquire some funds to get a new computer. I decided on a desktop for the office for the processing power and stability. I turned it on the first day I got it, and it hasn't been turned off since. I know it's Windows 7, but Quicken/QuickBooks doesn't run well on Linux, and I don't have the funds to get a Mac (although that is my wish)

- I'm working on a few new projects: Client Portal (project in progress), Sales Portal (planning has started), and a few others. I've been really preoccupied with other tasks at hand, but I think this sums it up well:
Ceiling Cat


- I found out about Star Trek RPG thanks to this little comic:
Real Life - Star Trek RPG

Since Kat's been helping us with WhiteWolf, I'm glad we are able to experience RPG gaming without having to worry about battling against super-experienced players.

That's it for now. The rest of the month looks pretty busy and my guess is that I'll have a lot more sleepless nights.


Tags:#ds9 #reallife #icanhascheeseburger #quicken #pc #whitewolf #tics #alp #facebook #drinkswithgeeks #fishbowl

Neat QR Trick for Printing

While watching an episode of Star Trek: The Next Generation (Season 3) on Netflix, I realized a great method to implement QR codes to connect offline content to its online material.

This method is implemented in 3 steps:


  1. Put this code in your footer files (PHP only):
    echo "";

    (this uses Google's API to automatically generate the QR code for each page. If you are using ASP, insert your own code)


  2. Put this in your main CSS file:
    #print_qr{ display: none; text-align: center; }
  3. Put this in your Print CSS file:
    #print_qr{ display: block }
    and if you haven't done so already, put a print-specific meta tag to enable print-specific CSS
And that's it! Now, when your users print your pages (hopefully they go green and won't print it), they can get direct access to the page by scanning the QR code instead of having to worry about typing in the URL, if it is even on the page You are free to change anything in the provided code. I'm not ©'ing the code, just providing a concept to help others.


Tags:#qr #print #css #php

Ponies vs Q

RealLife


Yes, I'll admit: I watch MLP:FiH. And best part of all, the newest episode (Return of Harmony (part 1)) has John de Lancie in it (the voice was too obvious)! If the ponies are going up against Q, they have no hope. But we'll see in Part 2.

On a semi-related matter, my favorite is Rainbow Dash!
Rainbow Dash
Credit goes to ~Creshosk


Tags:#ponies #mlp #Q #deviantart #rainbowdash #reallife

"Work Smarter, Not Harder"

My Favorite quote from my favorite cartoon character, Scrooge McDuck.

Work Smarter, Not Harder
-Scrooge McDuck


Scrooge McDuck

Original quote is assumed to be created by Carl Barks [reference]

I think this applies to much more than just Duckburg - as a developer, I've been told I am "the master of 1 step" by making a difficult process much easier (such as modifying one file to work across a whole website instead of modifying 37 different files to reflect the same change - thank you Dr. Hughes).


Tags:#ducktales #scroogemcduck #quote

Squishy Day!

The System

Today was Take your Squishy to Work Day, so I brought my Squishy to work. Here's a shot of my mini-fox hard at work:
Squishy!


Anyway, today was kind of a wasted day. I don't know why. After getting my notes together and corrected this morning about a client, I met KC at the office at 11, gave him his cards, then pretty much browsed the Internet for a few hours - mainly webcomics. Today seemed like a good day to browse the other 99% of webcomics that I had been missing from the outbound corners of the internet. I added a nice little "Favorite Webcomics" section to the blog (below the "Comments" section on the right side), which looks like this:
Favorite webcomics - in no particular order

The above webcomics are always listed in a random order, so don't think that I have a preference.

Anyway, after I got done browsing, KC finished his work on a client's site. I went in and tweaked it a bit, and it was officially classified as "Done!" so I moved the beta.php page to the index, and made a PR announcement on the Shadow Dev website.

I went back to browse some webcomics, and voted for a lot of my favorites on topwebcomics.com. So, that's it for my Wednesday. Hopefully I can be more productive tomorrow and Friday to call this week a success. 7 hours today + Mon and Tues = ~21 hours.


Tags:#thesystem #squishy #webcomics

What a day...EARTHQUAKE!!!

Working Daze

Wow, today has been a busy day. I came in this morning a little tired and expected to finish a few things that I started yesterday.

Anyway, here's the rundown of today:

  • Apparently, there was a 5.8 earthquake in Virgina around 2pm. I was unaware of it, but curious when my chair was moving under my desk without me moving it. I thought it was a low-flying plane or a big truck or a fast train, but when I went to go check outside, none of the above were present. After going through my emails, apparently Glenn Beck reported on it, but I was not aware. More details can be found on Google Maps and USGS. This makes the 2nd earthquake I've been through (and the 1st one I've been conscious for).

  • I am in the process of finishing the last episode of Voyager. It's still a good series, although it seemed like they ran out of material in the last season (as usual).

  • I called the Fox News guy back and began our ad run with them. I was contacted by Tom an hour or so ago with his expertise, and I'm glad that we were on the same page: it's a gamble, but hopefully it pays off

  • I talked to Janet today, and she's working on her new place. I can't wait till she's ready to open for business!

  • I was also contacted by Tom with a potential client connection. We have performed a site analysis and sent it over, all within 20 minutes

  • I finished the PiLam mobile site, and that worked out quite well. I used Shadow Dev's mobile site as a template, but overall, I think it works nicely

  • I received feedback from Lionel, and although I don't completely agree with the idea of switching from our current web development means to a mobile-only app development

  • I had a potential client walk in today and talk about his new service. His service sounds nice, and I told him I'd have his quote by Friday. I got it to him today. Hence the saying "Under-promise and over-deliver" - thank you Dad.

  • I sent an email to Dr. Lockwood for catchup and to get a meeting time for our monthly Shadow Dev meeting. Hopefully I get a response back soon.

  • I added images and information to a client's site and implemented a function to display September-only material in September. So far, it works well.

  • I finally received the new address for the Pi Lam house. Can't wait to see it!

  • A client had some images that they sent over that were too small. Apparently, they googled images and sent the thumbnails. To be honest, I'd really expect an organization to send over some higher-quality images for a site like this. Hopefully, we can get some better images soon.


Server says I've been signed on since 10:23. 7 hours later, I'm signing off. Same hours go for yesterday, so 14 hours thus far.


Tags:#earthquake #voyager #clients #lockwood #lionel #analysis #pilam

12 hour work day

PvP

To give you a good idea of the above comic, just imagine a Ren. Fair(e). Yes, I don't go to them, but the author of the comic did, and since Keat and I use long bows, I thought it would be nice.

Anyway, here's the lowdown on the 12 hour work day:

  • I came in to work a little after 10, to meet Tom and his mountain of business cards. When he came in for a quick sweep, I started on the Site Analysises of a few of the sites. A lot of them scored below 60%. Along the way, I thought I'd go ahead and score Shadow Dev's site, just to give a client the perspective. We are at a 90.1% (of course, this is with our current design - our beta design scores much higher). That was pretty much the extent of my day for that part

  • I kept watching Voyager. I'm on S6:E12. Not bad for a day of watching

  • I'm creating an analysis program to help me with the site analysises. So far, things are looking promising.

  • I go accepted into Forrst! A developer's social media network, if you know what I mean. The application process is extensive, and I almost forgot about it until I received an email saying I was accepted.

  • The book I am mentioned in officially shipped the edited copy today. I should get it in the mail in a week or so.

  • The kitties have been pretty spazzy the past 24 hours. I think Niko has seperation anxiety. He doesn't want me to go into a room without him, and when I'm home, he just loves to nuzzle.

  • Keat's not having a good time with her parents, as expected. I won't go into too many details since they might be reading this, but I will say that they peaked interest in Shadow Dev for the first time. The questions they asked this round were more in Keat's court, so she could answer them. Although when Keat's dad asks technical questions about the company, it seems like he knows what he is talking about although he doesn't have a grasp on the subject he's trying to prove he knows (for example: he thinks that every site has a Mobile application, and that the mobile application accesses a different database than the main site, and that creating a mobile application is easy to create - I mean, sure, if you are bilingual in PHP and Java, but if you aren't, creating an App is not as easy as it sounds). It would be like me asking him "What is the financial change of the Income Statement of your company for the first quarter of 2011, and what areas are affected by the change of command, and while you're at it, what is the maximum load bearing of the triangular struts used in the construction of the east wing of the Phoenix location, and why can't a company simply copy and paste the blueprints of one building to another in a different location of the country? (You get my drift)"

  • Had a discussion with a potential client today. I won't say much, but apparently we got to him too late. His current "Web Designer" got his hands full, and then his site got hacked by an SQL injection. So he signed a contract with Adobe and Capatan, and they're taking care of everything (I think).

  • As you may be able to tell, I discovered geekfeed this morning, and found a lot of good pictures. Here's one I couldn't pass up:
    Mythbusters go Boom!

    Lotta good stuff!

  • I also set up another Cron job to help with the optimization of tables. I thought I had one in the past, but I couldn't find it in the X amount of files I have. It won't be long now before the server can stand up on it's own and start demanding coffee!


That's it for my 12-hour day. Until tomorrow, and the rest of the week. G'Night!


Tags:#sql #mythbusters #voyager #renfaire #pvp

Bachelor for a Week

Well, it's here again. The week that I am alone. Keat's with her parents spanning the US (NC to CO, AZ, NM, and others). All I have is 3 cats and only 1 internet connection. This is going to be a LONG week. In addition to keat being gone for a week, our new sales person will be gone from Wednesday till next Thursday. So I will literally be alone from Wednesday till Saturday, when I pick Keat up at the Airport.

But enough griping....here's today's comic:

Non-Sequitor

In plight of the major downside, I've made some great improvements and completed some major work that I've been needing to complete over the past few weeks.


  • I've added a mobile image optimizer to my blog. The images will now be loaded to 10% of their original filesize for faster loading on mobile devices

  • I've finished work on NSMT's password complexity, as well as finished a 180-day expiration policy. It's taken a longer than usual, but it has been completed. Now, on to the rest of the to-do list

  • I've added shadowdev.co as an official URL shortener for Shadow Dev. There are more details on the Shadow Dev Blog. Right now, it's not really open to the public, but general readers can create shortened url's at shadowdev.co/shorten - we are working on some analytic procedures and may have those up within the next week or so (at least on a basic level)

  • I've also created a nice 404 page for our URL shortner. You can view it at shadowdev.co/nonfolder (this doesn't exist, so you should get a 404 error). Thanks to the @Oatmeal for those images
    TumblBeasts

  • I've created some HowTo articles on the Shadow Dev blog - mainly about some techno-babble like DNS systems, Proxy servers, and Email hacking solutions

  • I've been on a Voyager-trek (no pun intended) for the past few days, and without (borrowing) Keat's laptop, I can't watch it at home (and our PS3 has a faulty laser, so that's out of the question), so I've been watching it at the office all day. I am at the end of Season 5 and about to begin Season 6. I'm so glad that I've been able to watch all of the episodes in chronological order and without commercial breaks
    PvP
    Although this is from April, I thought this would be appropriate since I'm on a Voyager-trek

  • I received my new license in the mail today (with my updated address). However, my license still expires in Feb of 2012, so I still have to go get it updated then. So basically, my license is good for about 6 months

  • I've also created 3 major cron jobs: one to report 404 errors to me to see where people have been trying to access (and block attackers), one to update YUM on a nightly basis, and one to send weekly reminders to our Independent Contractors to send in their weekly status report

  • We've finally received info from one of our clients that has been pretty quiet. I hope that the rest of the information we receive should be able to make the site live (especially since they wanted it on July 15, but we had no information to go live)

  • I played WhiteWolf with Kat on Saturday, and we've progressed fairly far. I had 1 quest to get a Silver Braided Cord to trade for a skill, and now I/We had to go to a trailer park and "take care of it". Right now, we are stuck mid-dash trying to get away from the trailer park. We'll see what happens in a few weeks when the episode resumes


That's it for now. I'm sure this is a lot to read, so I'll leave you (the reader) with additional comics, one I think may make my generation cry a bit.

Corpse Run
Dilbert



Tags:#corpserun #cron #witewolf #url #shadowdev.co #dilbert #keat #non-sequitor

SSL Relief

After spending 1 week with email support from Website Source, Comodo, and enom, I finally have the SSL Certificate for a client that was assumed "lost". It turned out that after getting super-frustrated at being sent in circles, Comodo sent me an email saying "Please call support". So I called support and (finally) had my SSL Certificate within 10 minutes. 5 minutes later, I installed it on the client site and everything was at peace.

Here's an overview of what happened:
  1. Ordered a "Comodo Essential SSL Certificate" via our Control Panel (powered by Parallel's Plesk) which is through Website Source (aka: "WSS"), our reseller on May 6

  2. Comodo sent me a "Domain Verification Email". I clicked on the link, provided the code, and verified the domain.

  3. 24 hours later, I did not receive an email from Comodo with a "Here's your Certificate", so I contacted Comodo about it

  4. They said to contact my reseller (they said "enom", which isn't true)

  5. I contacted WSS about the issue, and they weren't sure about the WSS/Comodo relationship. They also said that I can contact Comodo and cc them on all correspondences in the future with Comodo

  6. I sent back an email with the instructions that I used to obtain the Certificate purchase procedure.

  7. It turns out WSS didn't even know that purchasing SSL Certificates through Plesk was possible (even though I did it a few months ago). This was their response:
    Well, that clears up our first source of confusion - buying SSL certs through the Plesk panel might be a new thing, we didn't know it was possible.
     
    SO- unfortunately it doesn't seem to do anything to clear up what happened after you ordered it.
     
    Perhaps you could write to Comodo again and say, basically- your last message didn't make a lot of sense, Enom shouldn't have anything to do with this transaction, could you please either tell me exactly where the certificate was sent, or just resend it to the proper address?
     
    As I said, feel free to cc us on this stuff. I hope that you can clear it up with Comodo. If not, then I imagine that we'll have to open a ticket with Parallels.

  8. I contacted Comodo again, and they sent over the same response ("The certificate has already been issued. Please contact your webhost reseller")

  9. I sent them a response saying "I know - I've contacted them and they said enom shouldn't even be part of this"). I also asked "Where did it go?"

  10. They responded with "Please be informed that i have sent the certificate once again to your account email id. Kindly contact your web host. Also for your information you can directly download your certificate from your account login."

  11. I tried to login to their "Account manager", but none of my login combinations worked. I tried their "Forgot your password" feature, but it said that all of my login information was wrong. SO...I contacted them about it

  12. They responded with:
    If you want to get the login detail, you will have to reset the password and get the login detail through the account admin email ids.
     
    You can reset the password by the given below link by entering the order number and account admin mail id and get the login detail through your account admin email id: [password reset link]

  13. I responded saying "THAT DIDN'T WORK! This is why I'm writing to Comodo - to say it didn't work!"

  14. They responded with "The certificate has already been issued. Please contact your webhost reseller (enom)" (sound familiar?)

  15. So, I set up a support ticket with enom and awaited a response.

  16. In regards to my "Account Manager" issue, I received
    an email saying the following:
    For this reasons you need to contact your webhost [Secure Business Services],they will assist you in better way.
    meaning I need to talk to enom
  17. I appended the ticket I sent to enom saying this
  18. I finally received a response from enom late last night saying
    Thank you for contacting eNom technical support. I will be glad to look into this for you, but I will need some additional information to better assist you. Unfortunately I was not able to locate the domain: #### or any account associated with it on our system. Do you have an account with eNom? And if so, what is your login ID? In order to 
     
    purchase this certificate, you would need to have had an account with eNom or eNom Central. Unfortunately without additional information I won't be able to find any additional information, and it is likely you did not purchase this directly through us.
     
    It is possible that you may have ordered this through a reseller that uses eNom as their backend service provider. In which case, you would want to contact them to find out more information, and for further assistance.

  19. I tried to respond to the ticket, but enom's ticket management system kept logging me out for some odd reason. I even tried a different computer and different browser, but it kept logging me out even when I wasn't logged in. I couldn't go anywhere or do anything, so I emailed them about it.

  20. I received an email from Comodo again (with the title "Password Reminder") saying that enom had the certificate and I had to go through enom to get it. I also received an email from WSS asking what the issues were with my password. I responded saying "I only cc'ed you on this. There aren't any troubles with my login"

  21. I responded to Comodo saying "I can't login to the account manager, I can't get access to the certificate, I can't get a straight answer!" (paraphrasing)

  22. Comodo responded saying "The instructions enom provided you were wrong" and some other @^(*&$! about how I have to go through enom to get it

  23. I said that the instructions were NOT provided by enom, they were provided by Comodo! I think this is the 3rd or 4th time I said "If I can't get a straight answer, I will demand a refund and go somewhere else" (at this point, I was ready to punch through my laptop - my mediation training from Martial Arts couldn't save me now!)

  24. Comodo sent me an email saying "Thank you for your reply, please call into our support staff for further assistance at US"

  25. I called Comodo support, and got the certificate emailed to me within 10 minutes

  26. I told WSS what had happened and cleared things up with them saying it wasn't their fault. I am still awaiting some type of answer from enom if I ever get it.

...and that was the past few days. May 6 to today to be exact. It feels good to get that off my chest and release some steam. I was driving like crazy today and about to rip something if I got my hands on it since nobody was paying attention and didn't understand what was going on.

ANYWAY, here's today's comic (which I think is very relevant):
SMBC
Is this the first time I've posted a SMBC comic?

That pretty much sums up my past few days. Keat and I went house hunting on Sunday and found a few houses that we liked. We sent the list off to her parents and are awaiting "the talk."

I also called my mother on Mother's day and wished her "Happy Mothers Day". Yay for mothers!

Also got Half-Life re-downloaded from my old Steam account and started that back up. By using a wireless mouse I have from ??? ago, I'm doing pretty well for not having played the game in about.....4 years? The CD didn't want to install on Vista 64, but luckily Steam had my account active and I was able to re-download the install files. Yay! Now to deal with all of the stuff that piled up over the past few days while I was dealing with the SSL stuff.

PS: Keat finished up her final semester at HCC today and graduates on Thursday! Hooray for her! Now on to Western to finish up her Bachelors.

PPS: I (and Keat) am on the Squishable Gallery! (2nd page) YAY!


Tags:#squishable #ssl #comodo #websitesource #enom #halflife #certificate #plesk #parallels #smbc

I had a case of the Tuesdays

I know it's Wednesday, but this first portion deals with YESTERDAY. Deal with it. After I posted yesterday's entry, Keat and I went home. Nothing super special, but it started raining. Hard. We went to Ingles to pick up some dinner, then got back out to the car, and the stupid car wouldn't start! Since the RKE doesn't respond anymore, we have to open the car with the key, which causes a mini-alarm to go off for a bit. After about 10-15 seconds, the full-on "HEY! I'M BEING STOLEN!" alarm goes off. Which it did. For 10 minutes. The stupid key wouldn't turn in the ignition. So here we are, holding groceries, in the hard, wet rain, trying to either disconnect the car battery and/or start the car. The car finally started and we were off. Soaked, but wet.

ANYWAY, there were a few comics in the past day that I liked, so I'll be posting them throughout the week. Here's the first one.
The System

Haven't posted a System comic in a while, but what the hey - I thought I'd do it.

On to more technical stuff(s), I had an idea for a developer-friendly MySQL error notifier, since mysql_error() only works on the front end. My proof-of-concept that I developed yesterday really worked! And I'm so happy! Here it is for anybody to use.
#notify developer(s) of MySQL Errors
 
#use: $result=mysql_query($sql) or die("Oops!".mysql_dev_error($sql));
 
#(c) 2011 - Shadow Development [http://shadowdev.com]
 
if (!function_exists(mysql_dev_error)){
 
function mysql_dev_error($sql){
 
        #get the php-generated mysql error
 
        $error=mysql_error(); 
 

 
        #get the database name
 
        $db_q=mysql_query("SELECT DATABASE()"); 
 
        list($db) = mysql_fetch_array($db_q);
 

 
        #get the top-level domain along with the page the 
 
        ## query is being executed on
 
        $page=$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']; 
 

 
        #send HTML email
 
        $headers  = 'MIME-Version: 1.0' . "
 
";
 
        $headers .= 'Content-type: text/html; charset=iso-8859-1';
 
        $headers .= "
 
";
 

 
        #generate message
 
        $message ="SQL Query:
$sql

"; $message.="Database:
$db

"; $message.="Error:
$error

"; $message.="Page: $page"; #send off mail("DEVELOPER_EMAIL", "MySQL Error for ". $_SERVER['SERVER_NAME'], $message, $headers); }}

BTW: Creative Commons License
MySQL Developer Error by Kyle "KP" Perkins - Shadow Development is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

I'm really surprised how well it works for just a proof-of-concept. I told Keat last night that I must be getting really good at this "programming" thing. I used to think of an idea, write it down, write the code in 15 minutes, then spend 2 weeks debugging it. Now, my 15-minute code sessions work like a charm from the get-go. I must be doing something right....

Here's the overview of what I got done today:
  • I got some minor edits done to the Shadow Dev Beta blog (added a side navigation like the on one this blog; had to make my own URL shortener for some URL-based comments).

  • Made some additions and edits to the Receipt Rescue.

  • Finally sent out May's newsletter and followups (I'm only 3 days late!).

  • Contacted a potential client to find out that my idea of a "potential client" turned into "We need an editor" - no fun.

  • Made a minor adjustment to my Cron job from last week (decided to have the IP addresses added to a DB log and see which ones were repeats - so far, it's blocked 29 addresses in just over a week; that's about an hour of free time I got back!).

  • Finished Rocko's Modern Life on Netflix (first 3 seasons were good, the last season got a little weak, like most final seasons do).

  • Added a Microtimer to the Main and Beta Shadow Dev sites to see the page generation time.

  • Found out about EchoSign.com - an electronic PDF signer for clients. Not a bad idea, and I may try it in the future.

...and that's about it for now. Till tomorrow!


Tags:#thesystem #php #creativecommons #mysql #car #alarm

Ketchup

Wow, has it really been over a month since I posted last? It seems like yesterday that I made my last post. Since then, it's been nothing but busywork and client jobs.

Here's a comic to help relate to my previous month+ of absence:
Dilbert

I won't bore anybody with the finer details of what has happened over the past month, but here's a quick overview (just to keep you entertained):

- last week was a week of bad luck: had a co-worker's computer crash (had to re-install A LOT of software and do a full hard drive backup since the backup manager wasn't syncing everything), had the roof of an office space collapsed and spewed water and insulation all over, the co-worker had to find an old copy of Office 2007 so his SBA software would work right (OOo didn't cut it, unfortunately), prepared for a client's Open House, worked at said client's Open House, had both of our PPT and SEO seminars (which went great, with the exception that our PR got out late (again) and the first attendee showed up before we did), had a confused conversation with a current client over a chart display, had a very odd sewer smell in the office all week (turned out to be a lack of water in the drainage system; finally solved that after playing the "blame game" with the building secretary), one of the units got a fresh coat of paint which made the whole building smell odd, our first marketing order arrived (YAY!) and a client got some custom t-shirts, Tokyopop shut down their US office (not relevant, but I thought it was important news to mention), switched our DNS servers to CloudFlare which made the response rate lower dramatically and the uptime much higher, helped a client with a business plan for a competition (after having to re-write most of it), had some confusion over a potential client website and the hosting issue, finally switched over 2 clients DNS records (one had a major pain trying to get her domain from her old provider), made a video for switching over DNS records for said (and future) clients, had a mixup of payment systems for a client (although they had an invoicing system from the credit processor, they wanted another one created from us; we got a call today saying they wanted to go with the credit processor's invoicing system instead of ours, which we are okay with), said client had confusion when issuing credit to organization payers, uploaded the financial reports for the past 4 quarters to the corporate site, had some SSH and FTP issues with the server (solved?), went to a new Thai restaurant in downtown, had a large influx of followers for both my and the business's twitter accounts, got a DM from George Takei on Twitter (YAY!), and that's about it for last week.
George Takei DM

- not much else happened in the past month, aside from getting some insurance quotes, WCU getting a new chancellor, offering remote tech support for some clients, received an email that was sent 7 months ago (talk about being lost in cyberspace), had a mis-payment of a license (which was fixed), participated in a ΠΛΦ ΩΖ initiation, had a hard communication with a client's old hosting service, attended my first MeetUp, uploaded a few videos of Niko and Chi, installed our first successful SSL certificate, got 2 new clients signed on, and worked on other client works (still have no time for other projects), wrote a few informational articles, and got a mini squishy fox!
Squishy Fox!


That's about it for the past month. I'll try to be better about posting on a regular basis and not every other month.


Tags:#dilbert #pilambdaphi #server #georgetakei #squishy #dns #ssh #ftp #sba #tokyopop #office #ppt #seo #pr #ssl #niko #chi #

Calling it a night

Dilbert

After 2.5 weeks working on the same thing, I'm calling it a night. I finally have the advanced record modifier done for a client. It uses jQuery to find eligible fields, turns them into a textbox on click, allows for editing of the content, and auto-saves it when the field is clicked out. I spent the past few weeks trying to get the .live function to work with the .bind function, only to have the whole system backfire on me. I finally did a small-scale model from scratch, and made the whole system work in 25 lines (with error trapping and notifications). I was baffled that I could get this 25-line jQuery to work properly and more, but couldn't get it in my original 200+ line script. I finally decided to scrap that and use my small scale model to do that. After some initial tweaking, it finally worked. I then had to add some features covering drop down boxes, and that worked as well. Afterwards, I made a tutorial video for the client showing the New system in action, and just emailed them about that. Here's the code now:
$(document).ready(function(){
 
  $("div.clickbox").live('click', function(){
 
    // find the box's name and value
 
    var boxname=$(this).attr('name');
 
    var boxval=$(this).text();
 
    if ($(this).has('form').length==0){ // dont add form if it exists
 
      $(this).html("
"); $("#box").focus(); } $("#box").blur(function(){ var boxname=$("#box").attr('name'); var boxval=$("#box").val(); $.post("save.php", {name: boxname, box: boxval}, function(data){ //alert(data); //troubleshooting }); $.get('fetch.php', false, function(data){ $("#results").html(data); //get the results as we add more }); // replace the text box with the value $(this).parent().parent().html($("#box").val()); }); //dont submit the form if someone presses Enter $('#boxform').submit(function(){ return false; }); }); $('#results').load('fetch.php'); //initially show the results });
I'm sure there is an easier way to do this, but for the basic jQuery knowledge I have, this works.

On the flip side, I have a lot to do for this client. My todo list is already growing, and it seems that they keep emailing me with new features and ideas. I hope they know that we have other clients waiting to get work done as well.

I came in this morning (early afternoon?) and was determined to finish the jQuery record modifier. I also received word that a tenant had some internet issues, so I made sure to take care of that first since I didn't get to see her Friday (like I promised). After about an hour of debugging and troubleshooting, I guessed that the wireless device was bad, so I went to the office, got a spare one (thank god), and replaced it. She was up and running in a matter of minutes.

I then got an email from the Executive Director of the building asking for some Tech help with installing a program. He was out of the office at the time, so I emailed him saying to tell me when he got back in and I'd take a look at it. I got a text from Keat saying to pick her up from school, and a short moment later, the Executive Director walks in and says he's here. I ask him to wait about 30 minutes, and I'll be right in. I went to go pick up Keat, got back, helped him install a piece of software, and got back in the office. By this time, it was 2:15. I hadn't even touched the system.

I finished up my Reader and went to tidy up some loose ends I had yesterday. IE was giving me a headache because of a new request the Client had asked (switching two sections on the main page). Everything was fine yesterday until I went to email them saying it was done, but I got the idea to check the page in IE first. I did that, and (of course) IE messed everything up. I tried to insert some IE-specific CSS, but IE didn't want that. I finally made the code inline, and still no luck - that's when I went home last night. After re-looking at it, I made one small change (deleting the space between -- and [ for the IE-specific CSS comment), and that worked. Finally, 1 task down. Time to work on the Record modifier.

...and that brings us to the beginning of the post. I'm glad to call that Task complete, but I can guarantee that for every 1 task completed for this client, I'm gonna get 2 more. It seems like my todo list will never end.

I'm trying to teach Keat how to do some basic coding (do cover some of the more basic work while I work on the advanced stuff), but it seems that we either can't find a common time to do it, or every time we CAN do it, something comes up and we can't train. We're looking to hire an additional developer soon (if this work load keeps up) and an HR person down the road. Don't know how salary will be, but I'll look into that once I'm done with this ever-growing todo list.

PS: I also beat R&C: Up Your Arsenal last night. It took forever to get R&C 1 to the point where I could get the 10% discount on weapons, and the boss fight only took me 4 tries, but I will give the overall game a 9/10 on fun.


Tags:#jquery #ie #css #dilbert #todo #video #ratchetandclank

February already?

Rudy Park
Squeezed this one before February hit with just a few hours to spare!

It seems like just yesterday I was making my last journal entry, but I mean WHOA! It's already February. My last entry was on Dec 11, the day that my internet provider left and I haven't had internet at home in.....wow, almost 2 full months. That's, like, forever in Internet-land. It's really a strain when you have a lot of work to do ON the "internets" and when your clients are breathing down your neck to get stuff done, but you can't get anything done because your only stable internet connection is 30 minutes away (I'm speaking of the Office, here) and you're snowed in so much you can't even leave the parking lot! Yeah, it's been a hard 2 months.

I won't go into any fine details, so I'll just cover the basics in 60 seconds or less (I hope). *big breath* Here I go: Keat and I went across the state (twice) for Xmas, had fun with my sisters and their signifiant others (and accompanying children), got a few gifts for Xmas, spent New Year's at Keat's parents' and met Thomas' new girlfriend, shucked oysters (fun), came back to Raleigh, found out that I mixed up my Secret Santa person (oh well), came back to Asheville, got snowed in for 2 weeks (not fun), got Chi fixed before Xmas (semi-tragedy; almost lost her (temporily misplaced, not due to surgery)), finally got into work and have been working for 2 weeks straight, Keat is back in school and it's kicking her butt, doing well with the Shadow Dev Newsletter (yay - committment!), got 2 new Ratchet & Clank games (spent many wee morning hours playing those), signed up for FourSquare over the holiday, got tired of it, stopped doing it, attended many, many seminars over the past few weeks, started a new service Receipt Rescue (which seems to be progressing well), worked on client stuff (did I say that yet?), trying to shrink my to-do list, worked on Neko Sentou and 50% through Vol 12 (YAY! Check our story progress at Lunar Productions), participated in my first PiLam Omega Zeta initiation after 2 years, and we are moving to Waynesville in the summer since Keat's transfering (hoping) to Western in the fall.

Was that 60 seconds? Probably not, but that's a lot easier than filling x number of pages with finer details.

Over the past few weeks, I've been working on NSMT's request system. After a (literal) system overhaul with some finer tweaking, the system is finally finished (99.9%). Technically, it's done, but I'm revamping a record modification system with jQuery and it's taking me longer than expected.

I've been working closely with QR codes on the Shadow Dev site for today (take a look at the QR Page I created - I think it's pretty cool), and replacing the images with image sprites (to reduce the server hit response; in laymen's terms: 10 images produces 10 hits, meanwhile 1 image sprite with 10 images used 10 times produces 1 hit - smaller server response time, faster loading, and more accurate analytics). I'm also working on NSMT's Shuttle Service, which is a new service they want. May take me a few more days to get that finished.

Just saw Inception, and that was pretty good. It took a while to get into it, but once you got into it, it's like a roller coaster ride (same goes with The Men Who Stare at Goats).

Oh yeah, I have been receiving a butt-load of spam-bot comments on the blog. I finally revamped the comment system to strip out a lot of what the spam-bots were sending in. I used to receive 1 email every 30 minutes saying "New Comment" with the content of (but not limited to): free poker online, certain underage adult actions, enlargements of a certain male body part, getting 1000 Facebook fans (tons with that), "I like your site and visit it daily" (if they really submitted that, they would realize that the blog hadn't been updated in 2 months), and various other spam-bot-like material. They're getting really desprate and/or creative. I like to think the first. Anyway, since I revamped the comment posting system and implemented some new filters, I get maybe 1 spam-bot a month now. Nice to have those multi-level filters in place.

One last thing: finally met Janet at the Specialty Sauce place down the hall. Turns out that she and her husband(?) owned the Sushi restaurant down the street for 16 years. They had to leave since a nail salon moved in next door and the toxic fumes were getting into the restaurant - not a good experience. However, it turns out that she's a semi-expert sushi and nigiri maker, and she's making/selling sauces since her restaurant is kinda downhill right now. She also said that people from all over the area went to her specifically to have sushi (even people in Sylva, Asheville, and even Robinsville (where the heck is that?)). Can't wait to try some of her sushi!

I'll try to keep up with the postings as much as I can. Till later.


Tags:#inception #xmas #rudypark #qr #hits #sprite #nekosentou #receiptrescue #chi #asheville #snow #shadowdev

Snow Day? Snow Way!

xkcd
(Snow comic for the Snow day)


Sorry for the bad pun, but that's the way it seemed today. We saw that it was snowing last night, so Keat got up a little early and found out that classes were on a 2-hour delayed schedule. So what did we do: we slept for 2 more hours. We finally got up at around 9:30 and got our things together to leave. I didn't want to get out of the comfy, thick, warm covers. I thought "the world can end before I'll get out," but Keat had to get to class.

There was snow on the ground, and more falling every minute. My hands were about to freeze off. After working up the courage to brave the cold, we went to my car only to find out that my doors were frozen shut. What luck. I went inside and got a pitcher of water to pour on the ice. I went back outside, and Keat had the passenger doors open. I guess that side was facing the sun. I focused back on the pitcher, and poured it on the driver-side windows and doors. After some wiggling, the doors finally opened and I started up the car. It was a little squeaky due to the cold, but we made it to HCC.

I dropped Keat off at class and I went to the Mill Pond to take some pictures of a snow-covered mill house on a pristine lake. What a picturesque moment! Too bad my phone doesn't take very good long-distance photos. I was driving to the office when Keat called me saying her class was over. Apparently, the teacher was just collecting papers. I went back to her and dropped some more stuff off. Then, I went to the office again.

I caught up on my email, RSS feeder, and other related interests. A few main things I wanted to take care of were the Uptime status report on the ShadowDev.com site, "Latest Comments" on the blog, and a few other items.

According to Pingdom, the new server has a surprisingly decreased downtime as compared to the old server. The report said that the old server had a 99% uptime ratings, and so far, the new server has a 74% uptime. So much for the guarantee...

I found out that there were a few things that didn't transfer from the old server to the new server, including some of the recent changes I made to the blog. I played "code catchup" for a few things (including re-referencing the format_link alrorithym from the old server to the new; apparently, the new server couldn't find the right file and couldn't parse the functions, so the Twitterfeed fetcher and RSS maker wouldn't work), then worked on the "Latest Comments" section, which took the most time. I put in the following code to retrieve the title of the responded entry the comment was left for:
$sql="select `title` from `journal` where id=$id";
 
list($title)=mysql_query($sql) or die("Error 30: ".mysql_error());
 
echo $title;

and ran the code. It didn't turn up what I expected. As a matter of fact, it didn't turn up anything! The source code, the output buffer, the error reporting...all were blank. I spent the next hour trying different things to figure out the issue. I finally gave up and referenced the PHP online documentation. What I found made me felt stupid. I had to add one line to the above code for it to work properly:
$sql="select `title` from `journal` where id=$id";
 
$result=mysql_query($sql) or die("Error 30: ".mysql_error());
 
list($title) = mysql_fetch_array($result);
 
echo $title;

Wow, did I feel stupid. I put that in, and it worked like a charm. Only then did I find out that there were 4 spam-based comments that I had to moderate.

Keat got out of class, we had lunch, then back to the office. We also found out that the next time our neighbors' dog starts being mistreated, we can call the Asheville Police and file a complaint, which allows the landlords to file a violation as well. This is great because now we have a plan of action instead of wildly guessing our next step.

Anyway, while she worked and took a nap, I watch Danny Phantom, Season 3 (which I have not seen before) and worked on the Expo report (which is due tonight) and the VIM coloration issue. On the old server, the VIM editor would automatically add colors to the proper code segments while editing. The new server didn't support this, and it was getting very confusing when I would edit files. After searching Google for about 10 minutes, nothing turned up. Apparently, I was calling it by the wrong name and should have been searching for "Syntax Highlighting." Long story short: the VIM version I had (7.0) was compiled with the TINY option, which is basically a minimalized installiation. I tried to re-compile it, but the configure file was missing. So, I tried to update it via yum, but yum said it was up-to-date. The latest version was 7.3, so I knew something was off. I downloaded and compiled VIM 7.3 and compiled it with everything under the sun. Therefore, I was guarenteed to get the Syntax higlighting I so wanted. After some initial testing, I also found out that the command vi was defaulted as a minimalistic editor (7.0), while vim is the full-fledge editor (7.3) with syntax highlighting included. So I fixed a few bugs and have the most up-to-date version for editing, along with a backup for emergency fixing. No harm done.

I then decided to check Facebook (for the heck of it), and while trying to get used to their new profile layout, saw that a friend of ours was having some trouble on the snowy roads in Asheville. I asked her to keep us updated, becasue we still have to come home. We had a small discussion and she posted photos of the snowy roads. After I saw the photos, all I thought was "Aw crap." Based on her reports, the roads were snowy and icy, and people were sliding all over the place. And me without my current car insurance card (it's in the mail and should be here within the next few days). Keat and I decided to try to find her teacher so she could possibly miss class if need be. We frantically searched the traffic reports and saw that I-40W was slow and I-40E was clear. However, that didn't say how the road conditions were. I was thinking back to last year when Keat and I had to walk to the nearest working grocery store, and how I didn't want to drive through that.

We drove to her school and tried to find her teacher. The roads weren't that bad (although that was a 5 mintue drive). After searching and waiting for about 45 minutes, the teacher finally arrived and wasn't too sure about class. We then decided to gain the courage and drive home. Keat didn't want to stay the night at the office.

We got on the highway and I followed a truck for about 10 miles. Thinking the roads got worse the further we got near the city, I was mentally prepared to face the icy roads. We finally passed the truck I was following since the roads weren't that bad (just a little snow dusting), and kicked it up the rest of the way home. Turns out the roads in West Asheville weren't bad at all, just had a little dusting. The roads in South Asheville had the brute of the storm and had icy roads. Luckily, we weren't in that area.

We got home, took care of the kitties, and Keat worked on a presentation and paper she had due. My laptop was used to catch up on our shows, and I played PS2 while I waited.

Chi's still in heat and it's driving us nuts! We are going to call the spaying service and get an appointment asap!

The temperature is in the mid-teens (with a wind chill of 3!) and there is a light flurry outside. This isn't right for NC! I just wonder how things will be different tomorrow with the class schedule. I still have to get the Expo report done and send it in before the SMDC meeting on the 8th. Wish me luck!


Tags:#xkcd #snow #class #pingdom #downtime #mysql #php #yum #vim

Bad day? That's okay! I have GENIES!!!

More Genies? Why not?
(edited from the original for audiences - view original)

Today seemed to start off good, but then it went down the hole.....fast. And it seemed like I had to build my own ladder to get out of the hole.

Anyway, onto the details: I woke up at about 10:30ish, because Keat had class at 11:30. After writing last night's entry, I wanted to sleep for as long as I could. However, after falling asleep to Futurama and hearing the "Anthology of Interest II" episode (the one where Leela finds her "true home" in a certain film containing lollipop children, a brain-less scarecrow, a squeaky 1930's android, an ironic lion, and an omnipotent wizard), and I realized, "If the Wicked Witch of the West melted with just a small amount of liquid, then does that mean that she never drank anything or ever took a shower? I mean, I can understand the 'no shower' thing because she's a wicked witch and that would make her ugly, but never showering? That's just down right repulsive!"

Anyway, Keat was dropped off at school, and I went to the office. I knew that the server transfer was taking place, and I really want to thank the support guy I'm working with at my hosting company. He's helping me out through the transistion from RHEL 3AS (cPanel) to CentOS 5 (Plesk). I thought that it would be a lot of work to transfer the files over, but I didn't realize it would take this much work (I'll get into one bugging detail at the end).

As I drove to the office, I received a call from Allan, the Executive Director of the building. I couldn't get to the phone before it went to voicemail, but he said that his computer wasn't connecting to the internet and his computer was "fading out." Wasn't quite sure what that meant, but I was only 5 minutes from the office.

I arrived and jumped straight into work. I opened the office door, placed my laptop bag on my chair, and went right into the server room to check the primary connection. It was working fine. So....what's up with Allan's computer?

I went back to my office and set up my laptop. After going through my daily emails and my DDN (or RSS as most know it, but I call it my "Daily Digital Newspaper"), I jumped back into the server transition. It seemed kind of slow since only 1 domain was being transfered at a time. Apparently, the MySQL databases weren't being moved until I said so. 1 task down.

I had a to-do list from a client from yesterday, so I took care of that while I had the chance. 2 tasks down.

After about 2 hours, I had an issue with the MySQL database transfer and credentials. I asked the support guy, and he fixed most of the issue. However, I found out that they want each site to have its own unique login to the database instead of 1 generic login. I went with 1 generic login for the longest time because it was quick. Security wise - that is a large risk. Now I know that Q&D (quick and dirty) isn't the best way to go.

After a while, I realized: "Hey, when they are transferring the shadowdev.com domain, my email system will be down!" So I sent an informative email to the support guy with my backup email address.

After a LONGER while, I was wondering what was taking so long. I hadn't heard anything from my support guy since 1pm (EST) and was wondering how things were going. I went to go pick up Keat at school, got some quick lunch (needed to get back in case there were more server issues), and got back to the office. Guess what: the internet goes out. I started to get furious! THIS IS JUST WHAT I NEEDED! Here I am trying to oversee a sensitive server transition, and the freakin' internet just went out. What a day.

I went to the main server room thinking the problem was local. Nope, the main server wouldn't connect either. Therefore, the problem was on our ISP's end. I tried to load the community college's website on my phone for a contact number (they're our ISP), only to find out that their main site is down. Great. So if their site is down, then the whole county is down. I called someone I knew over there only to get voicemail. I thought "If their phones are on a VoIP system, and the network is down, then their phones are out." Just great. I called again after 10 minutes just because I could, and got the person I was looking for. She let me know that the main internet supplier in the whole region had a fiber link cut and they didn't know how long it would take to fix. That was 3pm. I'm online now, so I hope they fixed it if the office and home use the same artery for the connection.

Keat asked me a few marketing budget questions while we were waiting, and then (after leaving an informational letter) we left for Keat's oil appointment. We pulled into the station to have her car serviced and went for a stroll downtown. Stopped by the library, then had a chocolate malted and a Cheerwine at the Woolworth's Sandwich bar in downtown. Add a Turkey sandwich, and that's good livin' right 'der.

We came home and I took a little nap. Got up, responded to some emails and checked by DDN, then did some laundry. However (here's the detail) I found out that the main reason why the server transistion is taking so long is because the server support guy is going through each of my database configuration files and changing the information to the site-specific login. All 11GB of files.

Honestly, I would have been happy if the files, databases, and domains were transfered as they are, and I would take care of the relative and absolute file location updates and database privileges. That's how I expected to spend Thanksgiving: updating server files.

However, the server support guy said that since so many sites depended on the main shadowdev.com domain, he was going to wait to transfer that until Friday or Saturday. One problem: most of the sites that have a news feature use a centralized function for parsing content links and link-like information - and that's in the main shadowdev.com files. Without the shadowdev.com files, the sites with news features can't parse the link-related content properly. It's going to be a long break.

But I found two things that cheered me up today. 1: the comic above. I can't believe nobody thought (and published) of it before! It all makes sense! and 2: Keat and I were finishing up our chocolate malt, and she stood up to go to the restroom. She put her phone on the table and said "You hold on to it if the car guys call." The moment she places it on the table, "RING RING RING". That was something you couldn't time if you had to do it again. She answered, her car was ready, and she ran to the restroom. She and I had a fun hypothetical conversation after that. Her: "HELLO! YOUHAVETHEWORSTTIMINGINTHEWORLD!" / Car guy: "Your car is ready." / Her: "THANK YOU!" That made me laugh.


Edit: 2010-11-23 22:14:32 Forgot one thing. This photo made me smile as well. Thought I'd share it around.


Enough for today. Time for a whatever-we-can-cook-up dinner. Then, off to Thanksgiving....yay.


Tags:#thanksgiving #cyanideandhappiness #genie #car #server #parse #oz #futurama #centos #internet #mysql

Coefficient x Progress

Coefficient x Progress- xkcd

As you may (or may not) know, I did work on the comment system this morning (last night?) and got it mostly, if not completely, done. The biggest issue I was running into last night was that Chrome and Safari were caching the old js file and I couldn't figure out why the cache wasn't being cleaned (after having extensions in Chrome clean it, and manually going in and cleaning it myself in both browsers, the cache issue was still there). Luckily, they finally gave up the cache and I was able to finish the comment system.

I was also informed by a family member that there was a small bug in the Tag system, but that was a quick 3-second fix. There was also an issue with the comments being inserted into the database, and that was solved as well. While on a roll, I also received my first spam bot, and implemented a feature to (hopefully) block spam bots.

After this morning's wake-up call, I dropped Keat off at school early and then went to the Ribbon Cutting ceremony at the newly remodeled Hardee's in Canton (Clyde? I don't know the exact town since both were being used interchangeably today). That was fun, although I didn't make any referrals or new business connections. I did get to meet a lot of the staff of the Champion Credit Union, since a lot of them recognized me but couldn't place what Champion did for us. That's another story for another time. After the ribbon cutting, we all went inside and the manager of the Hardee's allowed us to get a free lunch! Can't beat that: a free lunch at Hardee's! I wanted to try something new since this is a rare opportunity, but I ordered what I always order ($6 combo with a Monster Energy drink) since I didn't want to waste a free lunch. Not bad for a Thursday morning.

So that was this morning. Now onto the afternoon.....
I found a small issue with the Fire & Ice site after I implemented the new "Show More" jquery feature. Apparently, the slideshow feature that I have on a lot of sites uses the same commands as jQuery but didn't use the jQuery library, so it was getting confused and didn't work. Fixed that.

I'm also a part of the "Help a Reporter Out" (or HARO) community, and saw that a reporter was looking for "Freelance Web Designers" for a book. I thought, "What the hey?" and sent in a pitch to see if I could help out. I received an email about 10 minutes later saying that I was one of the few programmers that responded, the person was glad to have me contact them, the book deadline is at the end of this month, and I was given a 7-page interview sheet to fill out. Wow - didn't expect that.

I also received the check from a client today, so now we can upgrade the servers. Tomorrow's a little busy for me, so I'll have to do that next week. But at least we got the money to do that now.

Lastly, I paid my Progress energy bill last Thursday and the payment station we paid at said that they processed the full amount asked (I pay half, Keat pays half). Keat says that her bank account shows the check processed a few days ago. I checked my account, and no check had been processed (even after a week). I checked Progress's site and they said they received the full amount. Don't know what's going on with that. I'll contact the bank next week if it doesn't get processed by then.

After Keat and I got home, we slept for a bit since we were both tired. But it was hard to sleep when our neighbor decided to go outside and started singing. Ever heard nails across a chalkboard? Kinda like that. I'd rather take their dog howling for hours on end from separation anxiety (and being crated for hours) than her singing. But I won't go into details about that.

CJ says there is more trouble at LMP. Although I do feel somewhat responsible for the issues at LMP (since I put the new President in place), I can't help but think that I released an infection (the new president) there and everything has slowly deteriorated. I just wish I could have been there for another year (or more) to make sure things went smoothly.

That's it from me tonight. I'll see about adding a few more features to the blog and try to work on the accelerator. The server upgrade will have to wait until after the check processes (or else we can't pay the server company).


Tags:#xkcd #comment #hardees #champion #jquery #haro #progress #lmp

Wednesday is here, now it's gone...

I thought I'd go ahead and get this post out of the way before I forgot tonight (knowing how busy I'll be with cleaning the apartment for "Inspection" on the 30th). You may have also noticed that I'm including comics in the posts. I'm doing this not because I can draw (really, I can't), but these are some of my favorite comics from various sources. They may have something to do with the content of the post, they may not. It depends on what I find that day.
Pearls Before Swine - May 23, 2010

After I posted this morning's post, thing got crazy. First, the web server suffered from a MySQL hiccup. I couldn't get anything to load or edited, which got really annoying, especially since a lot of the sites I create run from our main MySQL database server. After multiple attempts to get it restarted (and stay ON), I sent an email off to my hosting provider, and they said "We restarted it, try it now." I did that, and same thing. Then it hit me: I'm doing a massive download of the main server to a backup server for the hosting server changeover. Could the FTP requests be hogging the sockets and denying MySQL the sockets it needs to access the page information? Maybe. So I slowed down the FTP service I had from 10 files at a time to 3, and limited the download speed. After about 15 minutes, no more MySQL errors. Crisis averted.....for now.

For the majority of the day, I worked on the Blog design and features. The main things I changed were the background (like it?), moved the Social Network features to the top, automatic syntax highlighting for source code, and the toggling (togglation?) of the archive listings (that took me all day). jQuery is certainly being challenging, but I think I'm getting the hang of the basics.

I also learned that the loan that we applied for (won't say though who) was turn down. This isn't the first time, but I'm a grown person, and instead of whining to some random Internet reader or forum list (or to the person's/committee's face), I'm going to say "Ok, thanks for the opportunity. What can I do to improve the business so I can reapply for the loan?" We'll see where it goes from there.

I'm still working on the "Projects" tab, and that should be up by next week (hopefully). I also worked on the F&I site, unifying the Ticket section along with writing a news which should help in the PR/SM department.

This is actually the first day in a month that I've worked without a TV show in the background. Exactly 1 month from yesterday, I started watching Heroes on Netflix and finished 16 days later. The next day, I started Eureka and finished yesterday. Today, I just listened to music on Pandora and worked. It's amazing what a non-distraction workplace can do for the attention span.

I was also asked why I am doing this blog. The purpose is actually 3-fold: #1) to provide family members with updates to what I am doing and the progress I have for our advisors/project owners, which mirrors #2) update our advisors and project owners on the status and progression of their projects, and #3) give myself a personal log to track what I've done over time and where I am going (just in case I forget - say, over a long vacation). I'm also using the Blog as a personal sandbox where I can test and refine new techniques and functions without having to mess up other sites. This way, I can show off what I know and nobody's site will go down because of it........I hope.

I had some criticism about the content of the blog, saying that it was not relevant to some of the viewers, but I want to assure you (generically) that this is more for the advisors and myself. If I include too much jargon in a post, please either let me know or Google it. It would be really stressful to maintain 3 separate blogs (if that many) to update the individual audiences, so I'm going to try to create a function which can extract the appropriate information per audience depending on what is searched. Maybe that's the wrong direction? I won't know until I get responses.

Since the Blog design is basically finished, I'm going to go back to working on the Accelerator. I have a new business idea in mind that I'm really excited about, but I'm not going to say anything until the idea is ready to go public (news-wise, not IPO).


Tags:#heroes #eureka #jquery #netflix #pandora #mysql #ftp #pearlsbeforeswine

Tueday's over already?

Laser Pointer

Yesterday seemed to fly by. Keat didn't have class in the morning, but she still had to be there to sign in, so we were up and out of the apartment by noon. I actually got a lot of sleep on Monday night, but I was always so tired during the day. Can't figure that out.

Anyway, after I got to the office, I decided to spruce up on th jQuery I'd been studying. I fixed a few Fire & Ice issues (along with implementing jQuery on the spot), and did a little sales work on the side. Didn't get 1 of our potential customers that I'd been working with for about 3 weeks, but that's okay. Sooner or later, we'll get more customers.

I also figured out that by using a border-code in CSS, I can eliminate the "rounded box images" I had been using so much. This actually makes it easier for me because I don't have to create custom-color images for each rounded box I want. The CSS automatically rounds the box for me, and uses the supplied div/img without any additional markup! What a time-saver!
.round_border, .round_box{
 
	-moz-border-radius:12px;
 
	-khtml-border-radius: 12px;
 
	-webkit-border-radius: 12px;
 
	border-radius:12px;
 
}

I also added a few features to the blog; the main one being the "Search" feature (others being the bottom gear margin fix and the Newer/Older buttons, but the Search feature took me the longest to add/fix). Using the round box CSS method, I also made that input field rounded as well. How cool is that? I wanted to use jQuery to automatically highlight the searched term when found in the context, but that took too long. With my limited knowledge and the examples from jquery.com, it turns out that the example I was using would actually go through the whole context and replace every word with &;lt;span>word, which can get very resource-heavy and it took about 10-20 seconds for the page to load. After unsucessfully finding a method for $('#content').find(':contains('+query+').replaceWith(''+query+''), only to find that the jQuery statement would end up in a recursive loop, I decided to make it server-side and have the replacement function in PHP instead of jQuery. That actually made things a lot faster and I found a case-insensitive function that allowed for replacement of the original capitalization (if existed). That saved me a few hours.

On to a different topic: I finally successfully implemented the Active/Inactive feature on the Business Accelerator form builder, but it took me forever to figure out why the variable wasn't being passed right. It turns out that I actually had my custom function get each array type in the form and (after passing it through a "Save" page with jQuery and AJAX), compile the whole thing into an orderly form with proper syntax. So in order to find the Active/Inactive variable, the function was trying to find a variable in an array that didn't exist, which is why the variable wasn't being passed. After I realized that, I took the custom parser out and made the Active/Inactive and Debug variables parse first (since they're only checkboxes), and parse the rest of the array-based form later. That solved that issue.

I'm still working on the form builder, and Milestone 4 should be done within a day or so (with respect to the world around me). If things go right, I should have it done by Spring. That'd be awesome.

I'm also going to be adding a "Projects" tab to this site for project tracking. Let's see how well that goes.

On another topic, I finished Eureka 3.5 and I'm excited to see what happens next. Season 4 isn't out on Netflix Instant yet, and Hulu only has episodes 5-9 until the season returns in 2011. I may watch 4:5-9 and watch 4:1-4 when Instant comes out, but I don't know right now. I may not be able to hold the excitement if Season 4 has 20 episodes, which means Instant is a ways off.

After yesterday's long work day (I got home around 9ish), Keat and I cooked dinner and watch the Eureka Pilot. It's a good series, I don't mind watching it again, plus Keat wanted to watch it from the beginning. She went to bed around 11 (maybe 12?), and I was up working on a few loose ends before I hit the sack around 2 (and missed the post for the day). Then, this mornings alarm woke me up around 8. Why must the winter be so cold? I wanted to call it a "sick day" and crawl back under the covers. But, work has to get done........


Tags:#eureka #netflix #xkcd #css #jquery #search #accelerator #hulu

It just had to be Monday

Garfield

Last night was fun for me, especially since I was on a roll with the .fadeIn()/.fadeOut() jQuery functions, along with a few animated sequences that I'm proud of. However, I was also working on making the .remove() function working as well with the "parent of the parent" issue. Luckily, I got that resolved.

However, I was up till about 4am last night working on the form builder, and I'm glad to see how far I am, but I regret staying up till 4. Keat had class this morning at 9:30, which meant that we had to get up at 8-ish. Knowing me, I usually kill the alarm and go back to bed till the last possible moment. And it doesn't help that Winter is unofficially here and it felt good to be under the nice warm covers and soft pillows. I wanted to call it a "sick day" if I could, but I knew that stuff had to be done and other requirements needed my attention, so cancel the "sick day" idea. How I desperately wanted to go back to sleep........

While Keat had class issues and presentation due at 7:30pm, I used the majority of the day fixing the data submission feature of the form, along with catching up on Eureka. I finished up Season 2, proceed to Season 3 3.5, and finished watching Ep. 7 earlier this evening, but let me back up a bit.

Since jQuery is still kinda new to me, I decided to study up on the form submission process, along with the AJAX background structure. I still prefer server-side coding to client-side, but getting to play around with a new, exciting language is just fun!

I found out about the .ajax() feature, and experimented with a lot of the .ajax() features, but the ones that interested me the most for this task were .submit(), .serialize(), and .serializeArray(), all of which come with their own pros and cons.

It turns out that I had to submit information via jQuery .ajax() method and send it in POST format, which was the idea until I saw that the original data stream for the tutorial was only in GET format (example: page.php?id=3&sel=Hi&p=4q), so I researched and found out that I could switch out the .submit() and .serialize() functions for .serializeArray(), which submitted the information in their original Array format instead of a serialized string (GET). Afterwards, I had to write a function that sorted through all of the fields (which were all arrays) and set up the database form structure based on the array placement, type, and name (along with maintaining the tableDnD library to allow the rows to be moved dynamically). Overall, it was quite a challenge, but I believe that Milestone 4 is 90% complete.

That brings me to about 7pm. Keat had to leave for class, and I thought about another sub-feature: What if the person designing the form needs to make a form go in-active, or they need to take it offline for a while to make some corrections? That's when I thought about adding a "Active" boolean variable to make forms active or not. And what better way to allow for this option (along with showing it off) than the iButton jQuery plugin! Most people see this on mobile versions of WordPress pages, but I found a custom library from Giva Labs which allows for custom iButtons side from the default On/Off.

Maybe a little show-y, but I like to test new features I learn.
Business Accelerator Progress - Form Builder:
78%


Tags:#jquery #eureka #netflix #ajax #miletsone #ibutton #garfield #tracker

Milestone 3: Complete!

YAY! I've successfully completed Milestone 3 of the Accelerator. It was a bit of a challenge, since I'm still learning jQuery, but I accept challenges for coding - especially when using a language that I barely know anything about and am willing to learn. Just to recap: M3 was to successfully remove a dynamically inserted row. Using a combination of .empty() .remove(), .parent(), and .live(), I was able to successfully remove dyanmicaly inserted rows using the .append() function and the tableDnD library.
$('.remove_box').live('click', function() { 
    /* get parent (td), then parent again (tr), and empty the tr */ 
    $(this).parent().parent().remove();  
});
Edit: 2010-11-14 20:12:35 .empty() was replaced by .remove() since the latter keeps the tableDnD library in place and requires the DOM features to be kept for the move features Now on to Milestone 4: field submission with database structure building rules - let's see how that goes....
Business Accelerator Progress - Form Builder: 60%


Tags:#milestone #accelerator #jquery #tracker #tutorials

What a way to end a week

Well, I finished Eureka Season 2 today. Gotta love Netflix and all of their Instant shows, right? I mean, I could have watched SyFy (or SciFi as it was known) when it came on, for example: Tuesdays at 9, and I usually operate on a "must have a time slot" schedule for most things, but not TV shows. Instead of waiting each week for a certain day at a certain time for a TV show to come on (if it comes on), I prefer to watch it online. Sure, I can't do that with current shows (waiting on new Psych episodes is killing me), but who else can say that they watched all 4 seasons of Heroes in 16 consecutive days? I know I can.

But on to more important things: Keat went out shopping with Kat today, which left me home alone for about 5-ish hours. My main goal was to figure out Milestone 3 of the form building algorithym. I found out about the .empty() portion of the jQuery binding function (example: $('.to_delete').click(function() { $('#box').empty(); });), which is 80% of the Milestone. Now all I have to do is get the form builder to have multiple fields recognize the self-emptying feature with 1 function instead of having 1 auto-built function per row (which can get very confusing and very redundant).

I'm still playing with jQuery to better understand it. Although I'm all for building my own functions and features from scratch, I gotta admit: jQuery is probably the best of AJAX scripting libraries I've ever come across. jQuery makes everything that I've done with AJAX (such as the repetitive function $(box){ return document.getElementById(box); }, which simplifies a lot of the element claiming) seem like 1st grade.

If I keep working at this tomorrow, I should have Milestone 3 done by evening (I hope). Although one thing that always bugs me about the Fall/Winter season is the shortening of daylight. In the Summer, I like how at 7pm, you can see the oncoming of the night, and by 9, the night us upon us. However in the Fall/Winter, it's day at 5:30pm, as soon as 6 o'clock, nighttime comes and it's pitch black.

So far, the progress is coming along nicely. I'm awaiting payment from a client, which will allow us to afford the server upgrade, and then I'll spend some time getting the cURL installed and getting their site up. After that's done (est. time: 1 week), I should be back on the Accelerator and hopefully have the form builder done by Xmas, which means the whole system (form builder, form editor, validation and submission, payment, and more) should be done by March.


Tags:#jquery #netflix #heroes #eureka #milestone #xmas #psych #curl

2 down, 3 to go!

I'm so excited about this, I have to talk about it!

The Business Accelerator I've been working on just passed it's 2nd major milestone! For the form builder, I wanted to merge the Field Adder (click "Add Field", a new text field is added to the form without erasing the current info) with the Row Mover (the "Netflix Queue" effect). In my mind, it worked perfectly. In real life, it was a pain to get to. But now that I made it, I'm excited!

Milestone 1 was getting the Field Adder put in place and tested. It worked right out of the box.

Milestone 2 was adding the Row Mover. After much testing, Milestone 1 had to be re-worked from scratch. After much testing and many, many edited pages, the Row Mover worked (many thanks to jsfiddle.net/pvpFU/2/ for the jQuery field adder and isocra.com/2008/02/table-drag-and-drop-jquery-plugin/ for the drag-and-drop jQuery feature). As of today: M2 has been reached and passed!

Milestone 3 will be for field deletion without messing up the current field structure. Should be easy (I hope)

Milestone 4 will be for field submission with database structure building rules (basically: taking the data and putting it in the database to be re-constructed as a form on the fly)

Milestone 5 will be testing the database insertion to make sure the form is built correctly.

Can't wait to get back in the code!
Business Accelerator Progress - Form Builder:
40%


Tags:#jquery #netflix #milestone #accelerator #tracker