Author - Web Developer - Educator
Found 9 results for tag "css"
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

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

RSS Feed

Mid-September Review

Bug Martini

It's halfway through September, and things have been less than calm. Ever had one of those days where nothing goes right and you pretty much have to change everything in order to fit one request/demand/requirement? Yeah, stretch that over about a week, and that is/was my past 2 weeks.

Here's the rundown:

Server Downtime, Transfer, and Remodification


Over the past week, I had to majorly downgrade/upgrade the primary hosting server for Shadow Dev. Since our primary hosting environment was costing us $200/qtr, we were looking for an alternate hosting environment. The requirements were simple: Linux hosting environment, ability to SSH into it from a remote location, and root access. You'd be amazed how many services out there offer a "Windows/Linux" environment for a much lower price, but no Admin/Root access. I'm sorry, but I need direct control over the server, and shouldn't be waiting on the hosting service to perform updates (especially security updates).

So, we had a partner company help us out. Over the past few months, we transferred all of our primary data to their hosting server, since they were helping us out. Things were going smoothly. Our old VPS system ended their service on September 1st, and we weren't going to renew. Things were going as expected.

Since our primary hosting environment was hosted semi-locally, I split off my personal stuff and the business stuff. I modified the DNS servers to point home so I could host my personal website (this one), and have the business stuff on a "business dedicated" server. Meanwhile, my plan was to relaunch the main Shadow Dev site with a new design and direction on September 1st, but that had to be delayed by a few days.....and then the problem started.

Do you recall my previous blog posting about the "Server Connection Confusion"? On September 2nd, I was trying to SSH/FTP into the server to update some business pages and could not get through. I could access the server via Port 80 (HTTP), but not 22 (SSH) or 21 (FTP), which meant that I could view what was on the server, but I could not modify it in anyway. There was one option: I could access Port 10000 (VirtalMin backend management) and download/upload one file at a time, but I had about 200 files to download, modify, and upload, so that would have taken forever. I kept trying over the next few hours with no success.

On September 3rd, I tried to access the server hoping that the Port 21/22 issue was just a fluke (as it sometimes happens). However, I could not access any part of the server. SSH, FTP, HTTP, VirtualMin backend, Email, anything (which meant that my primary email server was down as well). I sent an email to the company that manages the physical hardware and said that the server was down and if they could look into it. Their response: "Yes, it is down, [they] will boot it back up. You will need to start paying for this server or remove your content from it. Out accounting software has placed a hold on it. As we have decided our relationship has not been mutually beneficial." Long story short: our "tradeoff" was not paying off. The tradeoff was "website service" for "hosting space". I should have realized something when the person we were talking to said "You have creative freedom." In an inexperienced mindset, that means "YAY! I can do anything without limits and they will like it!" In an experienced mindset, that translates into "I don't know what I want. Read my mind, or I will turn down any ideas/suggestions you have" which, in a "web designers" standpoint, is a huge red flag. It also doesn't help that we only had one informal meeting about a new site for them.

Anyway, in my response to that email, I said "If that is the case, then we will remove our content from it. In our current state, we cannot afford $1200/year for hosting, as we were paying $800 before. / Please reactivate it so I can move all of the content from it within a reasonable timeframe, then you can do with it as you wish. / I wish our relationship could have been more beneficial."

Afterwards, I tried to re-login to the server (as I was told they would boot it back up). Same result: nothing.

I waited and tried to re-login to the server over a few hours. That turned into the next day. I sent another email to the company restating "Please reactivate the server so I can move all of the content from it within a reasonable timeframe".

Once again, nothing. This downtime was really starting to mess with our uptime records, which we try to strive for a 99.9% uptime record. This was not helping. However, I did get an idea; get a cache of our main site (CSS3 and minimal design concepts only), modify my home server to act as a proxy-hosting server, and get the uptime records going. It took about 3 hours to get (since the primary hosting server was pretty much "blocked"). Thanks to CloudFlare's uptime caching, I was able to get the egg, the egg shadow, and the CSS3 that I used to make it move. I made the DNS changeover, and our uptime was back up and going. It wasn't the full-fledge hosting server, but it's better than nothing.

Day 3 of primary server downtime: I sent yet another email to the hosting company and said "I have tried to be patient with you, but my patience is wearing thin. I have asked nicely in my previous emails to reactivate the hosting server so I can transfer our content off of it. I have not heard back from you since my email on the 3rd. Since it seems like you are holding our content hostage, we are facing our 52nd hour of downtime, and our clients (and ourselves) are suffering that have their sites hosted on this server. In addition, any one who has email being handled by the server is not receiving any emails, including myself, which is causing panic since the emails are not bouncing or anything." Seems like a mostly professional message, right? (By the way, we had about 25GB that we needed to get - note to self: don't have the primary hosting and backup services by the same 3rd party)

I received a response within minutes: "You patients is thin? It is your actions that caused your problem by not producing anything. If you are that poor of an admin and do not have a backup of your content sounds like a personal issue... However I have issued the boot command to your server. Remove your content asap." (yes, misspellings and typos are maintained). I will say that 'Yes, we did not have a primary backup, because you said that you were going to enable that for us, but never did after many months of saying you would.' Regardless, situation has passed.

Anyway, the server was booted back up, which meant that I could get the files....or so I thought. I tried to SSH into the server, but for some reason (whether through my own doing of automating a port blocker or not), I could not. After many hours of fiddling with system and network settings, I came to a conclusion: my IP address was being blocked via Port 22 (SSH). This meant that I could not SSH into my home server and initiate an SCP transfer (Secure Copy - basically a command-line FTP between two Linux-enabled boxes). However, FTP was still open, so I initiated a primary backup to my home desktop (not the home server). I had the max system simultaneous downloads set at "2". I increased it to "3". Yay, things were going faster. I increased it to "4". Even better. I increased it to "5", and things crapped out. I could not SSH/FTP/HTTP or anything into the remote server. Which meant that I was back at square 1.

Based on my previous experience, I knew that I could log in to the server via SSH using my phone (thank you ConnectBot) and the 4G connection. I did so and tried to initiate an SCP connection from the remote server into my home server (for some reason, incoming SSH connections from my IP weren't getting through, but outgoing's a whole new story - and before you bark at me, yes, I did check the iptables for an Incoming blocking rule. There were none. Anyway, I let that run since I thought things were going a bit slow, but better than nothing.

After about 30 minutes, ConnectBot just quit. No reason, no message, no disconnect dialog boxes. It just quit. Which meant that I couldn't SCP for more than 30 minutes, which was a problem.

I tried to FTP into the server again, and was able to. I decreased the amount of simultaneous downloads to "4" and let it run. It took about 8 hours to transfer everything, including the primary MySQL databases.

After everything transferred, I ran a rm -rf command in the /var/www/vhosts/ folder. I know it's not completely secure, but at least it gets rid of things on a first level basis (installing a secure command like shred was possible, but the documentation didn't say anything about shredding a folder - it was only 1 file at a time, which for 25GB, will take a very long time). I also dropped the primary MySQL database and let it. My last words: good riddance.

So, I had the primary hosting files on my home desktop. Now to begin the mega-upload to the home server. 3 hours later, transfer complete. Now for the fun part: setting up the "Linux Desktop" to operate as a "Linux Server" (which, by the way, is not GUI based anymore, so all of this was done via Command Line), to be able to handle multiple domains and subdomains, import the huge MySQL database dump, setup the permissions for the databases, files, and folders, and re-initiate the cron jobs to run. Let's just say that I'm 99% done all of that as of now.

One of the hardest portions I had to deal with was separating out all of the domains. Let me explain: on the old hosting environment, all of the domains (except for the primary shadowdev.com domain), were managed and recorded under one central apache2.conf file, which Apache looked for and loaded for all of the domains. My home server, although the same operating system, didn't like that. Therefore, I had to go into the primary apache2.conf file and separate out each domain into it's own file under /etc/apache2/sites-available/[site], then run sudo a2ensite [site] to make it enabled, then sudo service apache2 restart to allow for the webserver to reload and reread the configuration files. Yeah, that was fun.

I still don't have the Postfix/Dovecot system completely operational yet, but the server can now receive and forward emails. It can't 100% send emails yet, but I'm working on it. I also have some finer points of the cron jobs to figure out. Aside from that, the server (hopefully) should be back up and operational.

Liquidation Sale Troubles


On a related note, we had our Liquidation Sale on the 31st for the office. Let's just say that apparently this town doesn't like any "Liquidation Sale" signs around the area. I posted a few around town, hoping that they would allow them for just a few days (since the event was on the following Saturday). I can understand taking down signs that are for an event a few weeks away, or for personal services or hand-written items that are pretty much illegible. However, after checking on all of the signs I put up, all of them were taken down. Now, I want to hope that it was because people liked the event and wanted to make a note of when/where it was. Based on the attendance record of Saturday, it was obvious that the signs were removed. We only sold $110 worth of stuff, 1 buyer, and 2 browsers. I mean, it's better than nothing, but I wish that we sold more. Now, the agreement that I put in with the landlord was "Anything that we didn't sell on the 31st is free-for-all for any tenants." That didn't translate quite as I expected. It turned into "We [the landlords] will keep what we think is ours, but you have to remove everything else." So, I get a large box from Walmart and try to remove a bunch of the small stuff. I receive an email a few days later saying "We have a tenant that would like to move in, so please remove all small items from the office." So I have to get another box (luckily they are cheap) and go back and get the rest of the small stuff. So much for getting rid of all of the small stuff.

Let's just say that our home is overflowing with office-related stuff. I'm just glad that we don't have to bring any of the BIG stuff home - I have no idea where we would store it. So yeah - our nice, professional, dedicated office is now sitting at home.

Getting the main site back up


The new Shadow Dev site
Meanwhile, I got the new Shadow Dev site up and going and wrote a State of Shadow Development Address for the public. Basically, it says that "We did our best, it wasn't good enough, so we are changing directions to pursue new ideas." That's pretty much it summed up. You can read the rest if you want.

I've been working on finishing up the touches on the new Shadow Dev site (like cross-browser compatibility, improving it's performance on other connections, and finishing up the content distribution with the database. It's coming along a bit slower than I had hoped, but working at home has it's own pros and cons to it.

Personally, I'm having a hard time dealing with the major downsizing and removal of partner services. What I had to do 7 years ago in my dorm room (where I had the main hosting server sitting in my dorm and I was managing all of the services via Command Line Interface (CLI), I'm doing yet again. Although I'm more experienced in how to handle the technology, and the technology is a bit easier to handle, the amount of responsibility needed to make the server work like it was before is no short order.


Lunar Progress


Crystal Blaze
I'm trying to channel some creativity and write some storylines for Lunar Productions' mangas. I did create a new site for them using the old Shadow Dev design, and ramped up the interactivity and information distribution (see beta.lunar-productions.com for a preview), so that helped a bit. However, I can't launch the new site yet until we get some final items down pat. I did, however, completely revamp Death Rose into a new series. Any storywriter will tell you that there was a part in a story (or even the story itself) that seemed to make the storyline go off-track. Well, Death Rose wasn't going anywhere, and I was getting tired of forcing myself to write storyline that didn't fit. So, I revamped the whole thing: the primary storyline, the storyline concepts, the characters, the antagonists, the setting....everything! It's now called Crystal Blaze. Let's just say that it's like Sword Art Online/Matrix/StarCraft/Accel World/Star Trek mix. Yeah, I know it's a lot, but it is making sense, because I'm already on Page 19 of script. The story is unfolding in my head, and sometimes my fingers can't keep up to type the story fast enough. I will say that the beginning of the story is a bit slow, so I am thinking of adding some concepts in the beginning to make a more enticing "hook" to the story. We'll just see where it goes.

Wedding Ups and Downs


Colonnade
On a positive note, we have the Colonnade! (For the wedding, not permanently) The final "OK" was put forth by Keat's parents and we were able to sign the contract and put the downpayment in. That's just 1 of the multistep process that is wedding planning. (see more details at (temp site) kk.shadowdev.com - actual domain to come later) I will say that I knew the whole wedding planning process was going to be tough, but I thought the major disagreements and compromises would be between Keat and myself, not Keat and myself vs her parents. No matter how much planning we/I put in (I am saying "I" here because I have been self-designated as the primary planner since Keat is finishing up her last year of school. As anyone will say, "Put Education First". She's already taking 18 hours of classes, and my schedule is not set, so it's pretty much been put upon me to do most of the calling/negotiating/researching/quoting/etc for this event), it seems that her parents have some minute detail that they must demand. For example: the reception. During our discussions, Keat and I talked to the event planner at our location. She gave us a packet that outlined all of the details, prices, and items that would be provided for the reception. I had a few follow-up questions to clear up any non-clear items (like "when does the 4-hour reservation start: when the guests arrive, or when the crew starts to set up" and so on), and things were going well. Suddenly, Keat's parents demanded to have custom beer and wine at the event. They even "suggested" (kidded? I hope) to have a keg at the reception. I'm sorry, but if this was a frat party, a keg would be acceptable. At a wedding reception? I may not have been to many nor planned many, but I find a keg unacceptable.

Anyway, we asked our location how much it would be to have "a local microbrewery supply beer and a remote winery supply the wine". According to the planner, they had to purchase it because of their liquor license. Okay, understandable. I don't want to impede the liquor liability on any one unnecessary. After 2 months of asking that question, we finally received an answer: the microbrewery has to bottle their beer and ship the bottles. Our cost: $10/bottle. HOLY CRAP! $10 a bottle? That beer must be made of gold or some super rare gems! We still hadn't heard back about the winery question, so I contacted the winery directly. Within a few hours, I received a response and forwarded that to our planner. Still haven't received a response (I think at this point, they are starting to hate us and may force-cancel our penciled-in reservation with their location). After waiting so long, Keat's parents said "Let's forgo the custom wine and beer and just go with what they have. Can we get an itemized proposal for this?" At the absolute end of my frustration, I sent a calmly-worded email to the planner and asked the question. She pretty much responded with the exact same thing that the packet says that she gave us. The location, the DJ, the setup/cleanup, China, Silverware, chairs, linens, tables, etc, etc, etc, for the set price (tax and gratuity included as well). If they were getting mad at us, I don't blame them, but please don't kill the messenger. We're just passing the message along to get the check signed.

What we would like
We've also talked to the cake company that was highly, highly recommended and received a quote from our tastings. $800 for a custom, high quality, delivered day-of cake. Not a bad price. We told Keat's parents, and (I quote) the response was "Keep looking! That is out of sight!!!" Based on the amount of cake companies around here charge, yes, that is a bit high, but we're dealing with a high-quality cake here, not a "Let's go to Walmart and order a cake" kind of thing. Yes, Walmart makes great cakes. We even got our 7th Anniversary Cake from them, but I don't want to go to them for a wedding cake. That's like having a keg at the reception. At this point, it's either "go all in or get out" kind of deal. I don't (and Keat doesn't) want to compromise on a lower-quality cake that we will wish we could have improved 20 years from now just to save a few bucks. So, I contacted other cake companies around here and once you add in the amount of guests we will have along with the design concept we want (along with their delivery fee), it pretty much averages out to $800. (We had a "phone conference" (although if you call Keat's parents on 1 phone and Keat and I on another a "phone conference") about the overall budget. Basically, Keat's dad was mad that we had multiple versions of the budget. I thought he would be happy that I split the budget up into 2 categories (Estimated and Actual), then subsplit that into what Keat's parents would pay, my parents would pay, and we (Keat and I) would pay. That seemed acceptable, but he had made some adjustments that we didn't know of until he sent us his copy. I sent him our latest version (since we were the ones doing the research), and he seemed to get upset that there were multiple copies floating around, so he claimed "his" copy the official one, which means that any additions that we find due to research, we have to let him know instead of just using our own copy. I thought I could simplify things by using a Google Docs copy that would allow for simultaneous edits from multiple users, but that seems to have majorly backfired as they do not know how to use Google Docs, so we are back to "his copy being the only one that should ever exist" scenario. Yay.... I have, however, asked on multiple occasions "What is your optimal budget? What would you like to spend on an event like this? Therefore, we can stay within that range and know what the limits are." Seems like a reasonable question, right? I mean, we're trying to shoot for a $10k budget. Keat's dad is acceptable with a $15k budget (in passing conversation), but we aren't trying to spend millions upon millions on this thing. Heck, we're even below the average cost for a wedding Haywood County ($16-24k). The only answer we have received is "We don't have a set budget - we just want to make you happy", which means (yet again) "Read our minds or we'll turn down every idea and suggestion you have". Great.....)

So, if this whole wedding thing was a TL;DR for you, let me sum it up: we have the Colonnade for the ceremony, I think our Reception location hates us, we need to find a high-quality custom cake for less than $800 total, and the budget seems to be out of our hands.

Additional Money Needed


So, in order to gain some additional money in order to pay for this "seemly outrageous wedding", I decided that I should try to apply for some part-time work (heck, since I don't have to "go into the office" any more, my schedule is pretty freed up). I found out that there was a Trader Joe's opening in Asheville, so I tried to drop off an application last Tuesday. The website (which isn't 100% working) said that they were accepting applications Monday-Friday, 10-7. No problem, right? I arrived at 4:12pm on Tuesday. There was a whiteboard out by the front door that said "Accepting Applications: Tuesday - Thursday, 10-4", which meant that I was 12 minutes late. Well, that's pretty much a trip to Asheville wasted. However, thinking ahead of this process, I thought "Why not apply to Kitchen & Company?" (it's a kitchen supply company that offers a whole lot more than Walmart or other kitchen companies. Keat and I found a lot of good quality stuff in this store during our previous trips). I tried to contact the store via their website, but their careers section was on their parent company website (which was a pain to find), and they only have 1 job posting available. They said "Please contact our Admin offices to inquire about other positions", so I sent them an email inquiring about the question in hand. Within 30 minutes, I received a response basically saying "Walk into the store and bring a resume." Seems simple enough, right?

Well, I head on over to the store and start to walk in. Little did I know that there was a sign on the front door that said "Part Time Sales Associate: Must be energetic, ability to multitask, and passionate about cooking" (I may be paraphrasing here). Seems like my kind of day! (Since I do most of the cooking at home anyway). I walked in, asked for an application, filled it out, and talked to their manager. Since he saw that I had previous experience at Staples, he said that this would be pretty much the same thing (I hope so too). Although, if there is a "Kitchen Quiz", I should be ready. Questions like "How many teaspoons are in a tablespoon? What's the difference between a Santoku and a Chef's Knife? What does a 'sharpening steel' actually do?" and other questions should be easy, thanks to Alton Brown. I don't know if there will actually be a quiz, but can I say that I kind of hope so? Anyway, I received a letter in the mail today from Trader Joe's saying "Thanks for applying, but you have not been selected for an interview." Basically saying "Thanks for coming in, and we appreciate your interest, but we don't need you right now." Oh well - my dad did say to stay out of the Grocery business. I guess this is the Universe's way of keeping me out. No biggie - I have higher hopes for Kichen & Company anyway.


New Anime: Accel World


Accel World
In order to blow off some steam, I thought I would give "Accel World" another try (in laymen's terms: Accel World is by the same author as "Sword Art Online", but set about 20 years in the future (from SAO, so about 2046) where all of the <15 year olds have a digital device that allows them a "virtual environment" to type, send messages, view emails, save video, and even enter their own VR world. 'Accel World' is an advanced version of the VR world that heavily relies on a software called "Brain Burst", which allows your processing power of your brain to be increased 1000x. The (semi) downside is that in order to use it, you need to build up some "Burst Points" by fighting in the "Accel World". The theory seems legit). When I first tried it, I got about 5 minutes in and had to stop. I didn't watch the series again until this past Sunday. Throughout the week, I watched all 24 episodes (and got some great ideas for Crystal Blaze) up to Thursday evening/Friday morning.

I will say that it had some flavors of Sword Art Online, and I liked how it wasn't exactly the same (as the author wrote this post-SAO and submitted it first to a writing contest, where it won first prize) as SAO. The concepts portrayed in the series were unique enough to hold their own, but also reflected some traits of other series like Bleach), so I was able to find those traits and mold them into what Crystal Blaze (and other series) should offer. I was never in any "Creative Writing" classes, but I believe this gave me a better understanding of how to write a compelling storyline (although I still have the fan-crush on Asuna from SAO. Accel World didn't really have any characters that I could really connect with, but that's not necessarily a bad thing).

Is this the end?


That's it for now. I believe that 27,000 characters is pretty much my max limit on a blog posting like this. However, I hope this gives a better insight to what one chaotic, crazy week I have had.


Tags:#swordartonline #accelworld #wedding #colonnade #vr #kitchen&company #traderjoes #altonbrown #beer #crystalblaze #lunarproductions #shadowdev #design #server #hosting #sale #apache2 #sudo #scp #ftp #http #css3 #email #virtualmin #port #bug

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

(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 #

RSS Feed

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

RSS Feed

New Shirts!

It's the end of the week, so TGIF! Although it's been a pretty rough week, it's also been fairly productive. First, before I get into details, here's a comic:
Yellow Peril

I thought I'd offer a new comic. This one is Yellow Peril, a fairly new comic I've started liking.

Anyway, on to the activities: As the title conveys, we received a new shirt design today! YAY!
Front Back

Honestly, it was a prototype design, but it came out REALLY well! I've started offering it to people via inspiration from CloudFlare.com.

I've also become a big fan of 4 new bands: Porcelian Black (heard their new song on the radio when we picked up Pizza last week), Paramore (they are covered often on Pandora, so I thought I'd create a station for them - still good), Flyleaf (good stuff), and Fireflight (more good stuff). I've never been one to cling to new artists, but these guys do it right!

Anyway, I've re-connected with an old college friend today and found out that she joined the SCA yesterday! Small world, huh?

I'm having a small issue with SSL certificates for a client. I ordered it through our Server company, which orders it through a 3rd party, but it turns out the 3rd party either sent it to the wrong place or didn't sent it at all. Our server company is trying to help us solve the confusion (and I hope soon, because the client's temporary SSL expires on May 10).

I don't recall much of what happened yesterday, but all I know is that I'm working on a mobile version of this blog. It's not easy, since I have to deal with cached pages from CloudFlare (the "developer" option doesn't work as well as I'd hoped), but I'm working with a direct input of CSS instead of an external file. After it's ready, I'll switch the include with the and things should be good as gold.

Anyway (again), I'm off to Asheville to meet up with Keat and another friend at the mall. Till next week


Tags:#ssl #sca #css #cloudflare #yp #new #tshirts

RSS Feed

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

RSS Feed

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