Author - Web Developer - Educator
Found 8 results for tag "html"
RSS Feed

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

RSS Feed

Introduction of the <ruby> tag

As much as I've wanted to write Japanese on the web, I never really knew how hiragana characters were written above kanji (see example).
NHK News Easy Website

I always thought that it was manually inserted with each set of characters a special <div> that showed the pronunciation, or there was a special engine or library that automatically did it.
Well, whether there is or there isn't, I have found a way: the <ruby> tag.

I always saw the <ruby> tag and thought it was for inserting Ruby on Rails code into HTML. I knew about merging Ruby and HTML codings, but never like this.
<ruby>愛
 
	<rt>あい</rt>
 
</ruby>
Produces this
あい


That is it. In order to insert special Japanese (or Chinese/Thai/Korean/etc) characters, you don't need to look up each special character code for each character if you already have access to it (like a Japanese IME or keyboard). Just copy and paste (or write) and the <rt> tags will put the special pronunciation over the selected character. Although, you may need to insert multiple <ruby> tags in order to write out a paragraph or something, but the concept is there.

I find it interesting that this is possible, and I may be late to the game, but it is nice to be able to do something like this.


Tags:#html #demos #tags #ruby #japanese

RSS Feed

HTML API: Intro to Web Notifications API

After taking some time to get back into my craft, I realized that I had missed a lot of advancements in the HTML world, especially the evolution of the HTML API. Yes, there actually is an HTML API.

While researching some of the "new" API, I came across a bunch of articles by Aurelio De Rosa via SitePoint (a lot of good stuff there), and one of the items that caught my attention was the "Web Notifications API." Now, I will say that this stuff is still experimental (see the W3C's Working Draft for Notifications, so it's not widely supported and may even disappear. But for now, it's pretty awesome!)

Anyway, I'm sure you're not here to hear read about my day, so let's get to the point of the matter: HTML API - specifically, the Web Notifications API.

I know a lot of you just want to get to the demo and play with it, so here's a Working Demo (Chrome, Firefox, and Safari 7+ only)


What are "Web Notifications"?


If you use an email system like Gmail or Outlook, chances are you've already seen something like this:
Web Notification in the wild!

Well, those are technically desktop notifications and are usually controlled by software, not browsers. (Prior to HTML5, in order to get Desktop Notifications for Gmail, you had to download the "Gmail Notifier" application, and Outlook is already a software program to begin with).

The main difference is that these notifications (like the one above) are controlled by the browser - yes, the browser can control (certain) desktop notifications, and it's actually quite simple.

How to Use It


In an HTML file, add this bit of Javascript:
var notification = new Notification("New Email Received", { icon: "mail.png" })
That's pretty much it. No external libraries to load, no frameworks to bend around your whim - it's automatically built in to most modern browsers. Now, I know what you're asking: "What? That seems too simple! There has to be more." Don't worry, that was just the extremely core concept (provided by W3C). Technically, there is one more step to do: your application must first ask for permission before doing anything with the visitor's computer. (Yes, I know this seems a bit backwards, but for privacy, I can understand - especially with all of the ActiveX IE vaulnerabilities out there). This seems that the W3C wants to get rid of, but for now, it stays. (W3C says: Warning: In designing the platform notifications are the one instance thus far where asking the user upfront makes sense. Specifications for other APIs should not use this pattern and instead employ one of the many more suitable alternatives. [ref])
Notification.requestPermission(function(){
 
    //we're declaring a new object here
 
    var notification = new Notification(title, options);
 
});
There are 3 states to the "Permission" request: default (equivilant to "denied", because a choice has not been made yet), denied (the user denied the access, and therefore the request cannot proceed), or granted (the green light). This is similiar to when a browser (and/or application) asks to automatically use your physical location to determine items near you, like so:

Geolocation API in use

If you haven't already allowed a site to display desktop notifications (or allowed for geolocation, as the above image), then it will ask you for permission before proceeding:

Asking Permission

Overall, in accordance with "best practices", here's what I have learned/uncovered/researched:

First, you need to check to see if the API is supported. As this is still in the works, it isn't fully supported everywhere (for example, only Chrome, Firefox, and Safari 7+ support this - see http://caniuse.com/#feat=notifications for the full supported range).

In order to detect if the API is supported, add this bit of JS before you go calling Notifications.
//check to see if the API is supported
 
if (!('Notification' in window)){
 
    //API not supported. Show a message or something
 
    ....
 
} else {
 
    // API is supported. Do things
 
    ....
 
}
Therefore, if you have any buttons, links, or other items that make the notifications appear based on calling them, then you can disable them safely (or, if you are basing it off of automatic notifications, like emails, scores, or calendars, you can safety defer the notifications instead of having an error thrown).

Let's get fancy


The above sample is pretty much all you need to know for calling Notifications. If you want to get a little fancy with things, try this:
title = 'Email Received';
 
options = {
 
    body: 'You have a total of 3 unread emails',
 
    tag: 'preset', //The UID of the notification
 
    icon: 'https://mail.google.com/mail/u/0/images/favicon2.ico'
 
};
Before we go into detail about this, let's break it down:

  • title: This is the title of the Notification (duh)

  • options: This outlines a few of the Instance options available in the API
    (technically, everything is optional)

    • dir: This determines the text direction that the notification will be displayed (options are auto, ltr (left to right), or rtl (right to left) (default: auto)

    • lang: The language that the notification should be displayed in (example: 'en' for 'english') - (default: default language for computer)

    • body: The message that is displayed in the notification, like the body of a letter (default: blank)

    • tag: I like to think of this as the UID (Unique IDentifier) of the notification. Examples in the W3C Draft Documentation show usage of multiple instances of notification windows, so if you want one for your Email, Calendar, Reminders, etc, you can name each appropriately instead of just having to fall back on just 1. (default: blank)

    • icon: If you have a jpg, png, ico, or any other image file to show with the notification, you can list it here (I'd recommend the full absolute path of a web file instead of locally) (default: blank)

Those are all of the options available for the Notification API right now. Maybe more will come in the future - it just depends on what the official word is on the development.

FAQ


Can the notification automatically close after a few seconds?

I'd like to say 'yes', but the answer is unfortunately, no - at least, not completely.

I've tested my demo in Chrome and Firefox and had different results. I set up a setTimeout right after the notification is shown and tested it.
notification.onshow = function() { setTimeout(notification.close, 15000) }
However, Firefox displays the notification and automatically dismisses it after 5 seconds, regardless of the timeout, and Chrome will display the notification until you close it. Apparently, the problem is that the drafted Event Handlers don't register in the browsers, yet. I've tried to implement a calling feature of event.type == 'onshow', then call the setTimeout function, but to no avail. I've also tried to match up the event.type prior to the forEach function, but yet again, nothing.

Demo

In case you missed it above, here's the live demo again. It provides a call button that calls the notification on demand. I'm sure you can play around with it and figure out how it works.

References

Mozilla Dev Documentation: https://developer.mozilla.org/en-US/docs/Web/API/Notification W3C Draft: w3.org/TR/notifications/ Articles by Aurelio De Rosa: sitepoint.com/author/aderosa/ Aurelio's Notifications API Demo: http://aurelio.audero.it/demo/web-notifications-api-demo.html "Can I Use" browser feature comparison: http://caniuse.com/#feat=notifications


Tags:#html #api #javascript #w3c #mozilla #demos #tutorials

RSS Feed

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

RSS Feed

Hittin' the Tracks with Rails

Well, more like a "Ruby" and "Ruby on Rails" scenario, if you know what I mean.

Anyway, here's a comic that I wish I could create:
FatCats


Getting back to the topic, I've been going through the Codecademy's track for Ruby to understand the concepts for Ruby (I went through all 10 courses they had within 11 hours), then studied up with RailsForZombies.org and Rails Tutorial book to get a grasp on Rails. I've been working on that book for about 2 days now, and it has really shown me the in's and out's of a basic dynamic rails structure. I'm on Chapter 7 right now.

All I can say is that Ruby seems very robust, but Rails seems very picky.

It is a different standard from what I'm used to with PHP. Whereas Rails is extremely picky with "only my way works" (kind of like older HTML), I'm used ti the PHP mindset where "if you have an idea, there are about 50 ways to create it". Personally, I still like the PHP way, but I haven't given up on RoR yet, but I like the MVC procedures that Rails incorporates (and now that I can finally use git for a good reason). You can checkout my progress at http://cdn.kmp.link:3000 or even view my github releases at https://github.com/kode29/sample_app.

On the lighter side, I've created a "Skillset Chart" on my blog showing off some of my skillsets and how experienced I am with them. Just view the middle right section of my blog layout to view it.


Tags:#fatcats #rails #ruby #ror #php #html #github

RSS Feed

HTML5 Canvas - Bouncing Ball Example

At this point, I'm trying to stay up with HTML5 programming, and I feel like I'm a little behind the times.

So, because I'm in a Python class (via Coursera by Rice University) learning about interactive programming (more specifically, "Pong" was this week's project) and seeing Google's anniversary edition of Breakout, I felt inspired to learn how innovative HTML5 could be, so I looked up some HTML5 references and thought I'd try my hand at it.

Well, I combined by Python experiences and some HTML5 canvas examples and created some ball-bouncing joy. Want a demo? Here's a demo!

Here's a screenshot of it:
Bouncing Ball
I've taken out the clear() function to show it in motion


Even though this is very simple (as compared to some more advanced HTML5 stuff), I thought I'd go ahead and put this here for others to view/use/learn from.

Here's the HTML:
 
<!DOCTYPE html>
 
<html>
 
	<head>
 
		<meta charset='utf-8'/>
 
		<title>Ball Canvas Test</title>
 
		<link href='main.css' rel='stylesheet'/>
 
		<!--[if lt IE 9]>
 
			<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
 
		<![endif]-->
 
		<script src='http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js'></script>
 
		<script src='main.js'></script>
 
	</head>
 

 
	<body>
 
		<div id='debug'></div>
 
		<div id='container'>
 
			<canvas id='scene'></canvas>
 
		</div>
 

 
		<footer>
 
			© 2013 - Kyle Perkins
 
		</footer>
 
	</body>
 
</html>
 


Here's the CSS: (this uses a standard Reset CSS, started by Eric Meyers)
 
@import url("//dev.shadowdev.com/reset.css");
 
html, body{
 
	display: block;
 
	text-align: center;
 
}
 
#debug{
 
	position: absolute;
 
	top: 50px;
 
	right: 50px;
 
}
 
canvas{
 
	margin: auto;
 
	display: block;
 
	border: 5px #000 solid;
 
	background-color: #efefef;
 
}
 


And here's the fancy-smancy Javascript:
var canvas, ctx;
 
var circles = [];
 
var circleCount = 4; 
 
var velocity_set = 2;
 

 
function oneorzero(num){
 
	// simple function to randomly get 0 or 1
 
	if (Math.round(Math.random())==1) num *= -1;
 
	return num;}
 

 
function Circle(x,y,radius, color){
 
	// get the information stored for eac ball
 
	this.x = x;
 
	this.y = y;
 
	this.radius = radius;
 
	this.color = color;
 
	var V1 = oneorzero(velocity_set);
 
	var V2 = oneorzero(velocity_set);
 
	// velocity is set as an array so we can have the [x,y] values
 
	// [5,5] means ^,>
 
	// [-5, -5] means V,<
 
	this.velocity = new Array(V1, V2);
 
}
 

 
function clear(){
 
	// clear the screen (prevent "dirty canvas")
 
	ctx.clearRect(0,0, ctx.canvas.width, ctx.canvas.height);
 
}
 

 
function getrand(){
 
	// function to randomly get a value between 0-255 (one value for R, G, and B each)
 
	return Math.floor((Math.random()*255)+1);
 
}
 

 
function drawCircle(ctx, x, y, radius, color) { // draw circle function
 
//	$('#debug').html("X:"+x+" Y:"+y);
 
//    ctx.fillStyle = 'rgba('+r+', '+g+', '+b+', 1.0)';
 
	ctx.beginPath();
 
	ctx.arc(x, y, radius, 0, 2 * Math.PI, false);
 
	ctx.fillStyle = "rgb("+color+")";
 
	ctx.fill();
 
	ctx.stroke();
 
//    ctx.closePath();
 
}
 

 
function drawScene(){ //main draw function
 
	clear(); //clear the canvas
 
	// this is only for additional draw functionality (testing only)
 
/*	ctx.beginPath();
 
      ctx.arc(canvas.width/2, canvas.height/2, 70, 0, 2 * Math.PI, false);
 
      ctx.fillStyle = 'blue';
 
      ctx.fill();
 
      ctx.lineWidth = 5;
 
      ctx.strokeStyle = '#fc0';
 
      ctx.stroke();
 
*/
 
	
 
	var ball_info ="";
 
	for (var i=0; i 0)
 
		$('#debug').html(ball_info);
 
}
 

 
////////////////////////////////////////
 

 
$(function(){
 
	// call these setup properties upon load
 
	canvas = document.getElementById("scene");
 
	ctx = canvas.getContext('2d');
 

 
	// this is to make sure the canvas spreads across the screen
 
	ctx.canvas.width = window.innerWidth-10; // the canvas has a 5px border
 
	ctx.canvas.height = window.innerHeight-50; // 50 is only for the footer info
 

 
	var circleRadius = 25;
 
	var width = canvas.width;
 
	var height = canvas.height;
 

 
	for (var i = 0; i < circleCount; i++){
 
		// start at random position
 
		var x = Math.random()*(width*.9);
 
		var y = Math.random()*(height*.9);
 
		var r = getrand();
 
		var g = getrand();
 
		var b = getrand();
 
		ballColor = r+","+g+","+b;
 
		// add circle to array
 
		circles.push(new Circle(x,y,circleRadius, ballColor));
 
	}
 
	setInterval(drawScene, 1); // loop drawScene - aka: "draw handler"
 
});
 

 
function animate(ball, canvas, context) {
 
	// this is for adding (aka: "move") the ball based on the velocity increase/decrease
 
	// velocity is an array
 
        ball.x += ball.velocity[0];
 
	ball.y += ball.velocity[1];
 
	
 
        if( (ball.x > (canvas.width - ball.radius)) || (ball.x < (0 + ball.radius))) {
 
		// bounce off left or right wall
 
		ball.velocity[0] *= -1;
 
        }
 
	if ( (ball.y > (canvas.height - ball.radius)) || (ball.y < (0 + ball.radius))){
 
		// bounce off top or bottom wall
 
		ball.velocity[1] *= -1;
 
	}
 

 
	// draw the circles with on the (canvas, x position, y position, radius, color)
 
        drawCircle(ctx, ball.x, ball.y, ball.radius, ball.color);
 
      }


I hope this works for some people learning how to use HTML5 and the "velocity effect"


Tags:#html5 #css #javascript #python #tutorials

RSS Feed

Simple but effective: <label for=''>

It's amazing how something so simple can go a long ways, especially when most people don't know about it.

I'm talking about labels. Specifically, the <label for=''> attribute.

Common sense says "If you have a radio button or a checkbox on an HTML form, give it a label so people know what it is for."

Experience says "Make sure that each item has an id and name so it's universally accepted."

Better experience says "Add the for attribute to the label so your visitors don't require a microscope to click in the teeny-tiny little circle/box."

I will admit that Matt Inman (The Oatmeal) said it best:
The Oatmeal describes what [for] is for


If you don't code, here's what it looks like (click the label - doesn't do anything):

<label>Check Me</label> 
 
<input type='checkbox' name='ckbx'/>


Here's what the difference is (click the label, see the difference?):

<label for='ck_box'>Check Me</label> 
 
<input type='checkbox' name='ckbx' id='ck_box'/>


I just wanted to get that out in the open.

In summary, if you hand-code forms (like me), use the for attribute in your labels. It makes everybody's lives easier.


Tags:#label #for #labelfor #html #oatmeal #rant #tutorials

RSS Feed

(A Small) Time to Breathe

First, here's a good comic to celebrate 4/20:
4/20 with Cats

I don't think the term "crazy" defines the past few weeks around here. It would be more like....chaotic, crammed, catch-up, compiling, compunding....any other "C" words go here?

Anyway, here's a quick rundown of what I've done, and what is yet to come:
Shadow Dev:

  • Fairview's site is coming along, and should be ready by May 1. I spent a little too much time on their scraper, but when it ran, it was a beauty!

    Here's what it was supposed to do: scan the site for links, find product pages, and archive their current product listing.

    Here's what it did: scan the site for links, create a database of the links that every page goes to, scan each of the pages for a common phrase that is on the product pages (since the product pages didn't have a commonality among url's), scrape the code and find the product name, default ID, and default photo, scan for further images (both small and large photos), find the area that lists prices, grab and store the different types of prices and "packages", optimize the database for remote links and make them local, download all images that are listed in the database, scan through the database and delete duplicate product entries, scan the stored images and delete duplicates, and set up a test page to choose a random product and show the different images, prices, and listings based on the information presented. Yeah - that's a mouthful!

    With our other basic developer out of the area for a while, I have to finish the rest of Fairview's site in order to be ready by May 1. Here's the todo list for the next 10 days: finalize the design tweaks, create additional pages, integrate the information into the new pages, create a formalized version of the product pages, order/integrate an SSL certificate, and integrate a Merchant account into the system ready for a May 1 launch. Yay....

  • We've hired another Developer, Cheryl Mason, and she is a real gift! She knows more SEO stuff that I could have ever guessed. She's also well prepped for Developmental work. Put it this way: I had to spend about 3 months training our other developers from basic HTML 4.01 to HTML5, CSS3, basic PHP, MySQL, and basic Javascript/AJAX/jQuery. My overall experience with Cheryl took about 2 weeks. It looks like I may have found my replacement in the Development area! YAY!

  • We've finally finalized the transfer for one of our "potential" clients. I won't go into details, but I'll say this: Potential client "Pete" owns a business. He's had this business for X years. His primary source of new business comes from people calling in (our reasoning: his site didn't work well, so people had to call). Pete knows that his site wasn't doing too hot, and wanted to discuss details about getting a new site. Bad news, his wife owns the domain. More bad news: it's his ex-wife, and they are not on good terms. So.....after about 4 months or so, Pete's domain expired and was available to the world. Pete told us to get it for him. Well, by the time it was available for us to get it, his ex-wife renewed the domain (we believe it was auto-renewed, and she didn't know/care). So....Pete finally talked to his ex-wife and his hosting company, got the domain released, and gave us the EPP. From there, we exchanged a number of emails confirming the transfer (which is another reason we recommend updating the nameservers instead of a transfer, as a transfer can be really confusing and frustrating depending on the technical experience of the transferee). After about a week, the transfer finalized and we got it updated to our servers. He should be signing within the next few days.

  • We are developing some new services to produce some additional income. These services include a: Site Usability Report, Competitor Comparison Report, and In-Depth Analysis (which we used to offer for free, but the time spent on generating these reports didn't produce the ROI we expected). More details to come soon.

  • We are also developing a Rewards Program for our clients. Can't say much, but it should be coming out soon

  • The role of "Presenter" may also be taken off of my plate. I've talked to Cheryl about it, and she's really excited to have control of an SEO Seminar that we put on a while back. If things go well, we should be able to schedule that during the summer or fall. Can't wait to see what she produces!

  • Been talking with AboutUs, seeing what they can do as far as a site comparision and competitor comparision, and we are in talks about a Partnership! Cool!

  • We've released the PR for our site contest. The "fishbowls" have been out since the beginning of February, and we now have all 10 placed, and the PR is out. I honestly didn't even know that we were published until Cheryl (the SMDC Secretary) came over and said that she saw our article. My original response was "We're in the paper?"



Personal:

  • I watched all of Heroes, again. Still a good series.

  • Finally get to watch all of Season 4 of Eureka! now I can see how they got to 1947 and the stories before and after that. I was really excited on Monday (wow, is it really Saturday already?) to see Eureka Season 5! That first episode was....a repeat of Season 4 (with the changing time frame), but still looks good. It really sucks that this is the last season. It seems like all of the good shows are cancelled before their time.

  • Mythbusters new Season! Yay! In addition, Jamie and Adam have a new series: Unchained Reaction, which is really awesome.

  • Psych had their season finale. Boo! I wish their seasons ran longer

  • We went to "Drums of War" earlier this month in Elkin. Didn't win anything, but had a great time shooting some targets and getting to see everyone again since October.



I think I'll call it a night with that. Between now and May 1, I may not be able to post again. I see a lot of sleepless nights in my soon-to-be future.


Tags:#lolcats #heroes #erueka #mythbusters #sca #paper #pr #aboutus #seo #services #epp #html5 #css3 #