Monday, May 24, 2010
I was reading about more software development anti-patterns because on Tuesday I'll have to conduct a code review for a particular client. I managed to somehow stumble on to Tester-Driven Development. I honestly thought it was a typo and assumed they meant Test-Driven Development. I started laughing at the fact that there are projects that allow QA to drive the requirements of the application--but hey? Sometimes projects are so terribly managed that it happens!
If you ever find yourself on a project where production-level people (Developers, QA, Designers) are creating the requirements instead of the primary stakeholders, you better take a step back and think about how bad that could turn out. Oh wait, I forgot you could be telepathic and just automagically know what the client wants.
Here's my two cents.
When a web project starts, the respective discipline leads (developer, QA, design, project management, stakeholders) need to figure out what their strategic goals are whether they are long-term or short-term. The reason why we have QA in at the start is to ensure that a lot of the functionality being built is not going to be a bug. Two really good examples I can think of off the top of my head would be scrollbars and IE6 graceful degradation. When running through a website that has a lot of transparencies, rounded corners, and drop shadows in Internet Explorer 6, you're bound to run into a "wat teh fuk" moment.
The best thing to do is to ensure that everyone (even the client) is aware that IE6 is an archaic web browser and doesn't support certain functionality without spending an extensive amount of effort hacking it into the application. This is why we employ graceful degradation on the agreement that there will be some 'weird' things happening for any IE6 users. The application will continue to function normally but there will be quirky things in the view, such as, fonts won't look anti-aliased or drop shadows won't be fully supported or transparencies won't be fully supported. Even Facebook, the biggest social network with over 300+ million members has decided to drop support for IE6. You can use this argument when you're explaining to the client. If they are hard set on supporting IE6, then it will impact both QA and Development time. Ultimately, depending on how complex the application you're trying to build, it could even double your hours just having IE6 being fully supported. Adding to this, you should definitely look into the web traffic metrics to see which browsers their customers are using. If IE6 is a minority, use this to your advantage in your argument towards partially supporting IE6.
Once the client understands that their customers using IE6 are a minority or it just isn't worth it, we can filter that down to the rest of the team. I truly believe that QA is underestimated in all agency work that I've dealt with. Most people above production-level work (project managers and up) just think QA click the application and try to break it. That's probably only 5% of the work they can actually do. Since we're bringing in QA at the start of the project, it allows them to write clear and concise acceptance tests for the requirements, as well as, prepare their automation tools for upcoming features.
Sadly, from what I've seen, they aren't utilized for those roles. They are simply clickers and subject to late hours because defects need to be regressed. If it was up to me, I'd have the whole team test the application--you'd be surprised to know how many project managers don't even know how to use the product they're building.
I recently stumbled upon this video showing the power of Starcraft 2's new map editor. Blizzard intends to have a "map store" much like the Apple iTunes app store for people to buy and download maps to play. Based on a little bit of research, it turns out SC2's map editor will be using Blizzard's version of C called Galaxy. This is actually pretty awesome compared to their older games.
Warcraft III Map Editor JASS is terribad
Warcraft III's map editor uses JASS which terribly fails in all angles. Firstly, its context free, allowing developers to run rampant with their spaghetti code. Secondly, it's infested with memory leaks. Thirdly, it has the shittiest, dumb down syntax that you'll ever see.
Let's check this out:
function Trig_JASS_test_Actions takes player p returns nothing local integer i=0 loop exitwhen i==90 call DisplayTextToPlayer(p, 0,0, "Hello, world! "+I2S(i)) set i=i+1 endloop endfunction
"takes player p returns nothing". Terribad. Go away.
Wishlist for Starcraft 2 Map Editor
Easy to use API for Data StoresEven if Blizzard just sell hosting for a database on Battle.net, this would allow map editors to essentially create persistent stats for players. For example, in the 3rd person shooter, what if the map editor expanded towards providing rankings for each player? I ran into this problem while building a World of Warcraft addon. All the persistent data would be saved to a SavedVariables.lua file, which is absolute shit because clients that use the addon won't be able to synchronize their data unless they redownload the file from some shady website.
Verbose usage statistics for Maps (much like Omniture, but for maps)As many of you know, starting out with a Map may be fun but to really achieve success you have to keep constantly measuring its performance. If you find that certain players like one aspect of your map, perhaps you could invest more time into that particular feature so that you can keep your customers happy. If you're a sole developer trying to make money off the Battle.net Map Store, you would definitely agree with for this reporting software.
Not so shitty debugging toolsThe xcode tools provided for iphone app development allows developers to constantly monitor their application's performance in real time. Subsequently, you can easily fuzz out memory leaks with these kinds of tools.
Each update to the Map should not charge the userIf a user on Battle.net decides to purchase your map for $5 USD, they shouldn't have to repurchase it when you roll out hotfixes.
Fast approval process for deploying new mapsWe all know about Apple's retarded approval process for applications. As a developer, we need to be able to deploy hotfixes or major patches without having to wait 6 months for some asshole to approve it.
Open source MIT Maps if they are freely downloadableAll maps that are free should have their source released to the public. I believe this won't happen because of their digital download business model; could you imagine if Apple iTunes Apps had their source released? :) It's all good though--that's what de-compilers are for.
Can't wait for the SC2 Map Editor.
Sunday, May 23, 2010
- Self-Confidence: This dimension was created to measure the extent to which an individual feel comfortable with him or herself. The items in this dimension reflect elements of self-confidence in both private and public contexts.
- Family Orientation: This dimension was developed to assess the degree to which a person possess a family orientation.
- Self-Control: This dimension measures the extent to which a person exerts control over sundry aspects of their lives and the lives of others.
- Social Dependency/Openness: This dimension measures the extent to which a person is open to and dependent upon other people.
- Easygoingness: This dimension taps into characteristics associated with being relaxed and psychologically flexible.
- Married couples who met online have an average courtship period of 18.5 months. Married couples who met offline courtship period last on average 42 months.
- The Better Business Bureau in the US said in 2009 they received 2,660 compaints about dating services. In 2005 they received 824 and only 126 in 2004
- The online dating industry is now worth $4 billion worldwide.
- In 2010 it is estimated that Craigslist will earn $122 million with $88 to $99 million being profit. The Adult Services listings make up 30 percent of the revenue.
- In the last year 17% of couples who married met on a dating site.
- 1 in 5 singles have dated someone they met on a dating site.
- 1 in 5 singles are currently in a committed relationship with someone they met on a dating site.
In episode 3, we go over the following:
1) Creating the markup for our application
2) Enabling the templating feature in Blast Mojo
3) Creating a dummy data provider
4) Implementing a Service Locator
5) Invoking the web service within a Command
6) Rendering that data from the web service into the view
As for episode 4, I've started to employ full screen code in the recordings, overviews where I go over the parts in the video, as well as, copy pasting more and then explaining what the code does. In Episode 2, I did a lot of coding on the fly which led to spelling mistakes or syntax errors. Thanks for the feedback Loyal! That said, episode 4 has hit a snag. It turns out that Mojo's Standard Library is not open source, so I can't go about writing public code tutorials--so I've decided to change its topic from "Using Mojo's Reusable Controllers in Standard Library" to "Creating Your Own Reusable Controller".
Wednesday, May 19, 2010
I've been playing around with ScreenFlow.app for a while now and I recently started becoming more and more passionate about creating tutorials for aspiring web programmers. Even though this is just my first tutorial video (doing random episodes before I do episode one, as episode one will be quite heavy on the theory portion of Blast Mojo), I've learned a few things:
- Use a higher zoom on TextMate so that the viewers can see the code more clearly
- Use better transitions in between cuts, it seemed very jagged playing it through
- Be consistent--you'll see that iTunes appears in the 2nd take
- Increase microphone volume, the music started to overtake my narratives
Sunday, May 16, 2010
If you watch the video you'll see that Markee produced it because of a mishap recently. After a "customer" made about $20,000 in purchases for virtual goods, they did a reversal essentially having that amount of money returned. Incidentally, there is a certain amount of time that a user can reverse purchases ( I don't believe a user can reverse a purchase that was made 3 years ago)---in this particular case, the amount it was stopped at was approximately $13,000.
In the end, notice that Markee's message is about stealing from companies that sell virtual goods and how the level of honesty in parents can directly affects their children's perspective on stealing. Although his company did take a large financial hit for the customer's reversals, it is more of an issue for his company to step up their legal strength.
Lesson learned--that goes to tell you that there are many dishonest and dishonourable people on the Internet and companies (in sales for virtual goods) need to take the necessary steps to establish a higher level of legal control.
Monday, May 10, 2010
1) Click the + sign on the bottom left and click New Command.
2) Paste this into the editbox and make sure you name your command "Strikethrough".
For the input field, select WORD in the drop down.
For the output field, select "insert as snippet".
As for the keybind, you can totally map it to whatever you're comfortable with but I chose Command-D as it is the same thing in Microsoft Word.
After discovering AceGUI, I can easily start developing UI components in no time! As of right now, I've got it saving data in between game sessions--the interesting part will come when I'll have to develop the web service that will parse the SavedVariable.lua, eliminate duplicate entries, as well as, do a huge merge between their copy and whats on the server's (per realm basis of course).
Here's a screen shot of the responses when adding new Ninjas to your list:
Now if you want to save data to it (or insert a row), do the following
If you want to read off of the data store, do the following
The reason why I put 'global' is because global signifies storing data for all characters between the account. As the developer, you have a choice of scoping:
Sunday, May 9, 2010
- If you're going to ask a trivial question, ensure that you sign up as a troll. Name yourself: "lolyougotowned" or "trollpride" or "trollingftw". Don't put your real name down when you're asking technical questions. I'm sure that these search results will be detrimental to my career down the road.
- If you're going to ask a trivial question, ensure that you've taken the necessary steps to hide your tracks (using a troll email address, etc).
- Given the fact that all technical interviewers will Google your name, ensure you can 'seed' your results to be in your favour. Use your SEO skills here! If you can somehow tilt the results in your favour (linking to your latest projects or a really intelligent response to an open source technical topic)--DO IT! A true Ninja will always tilt the situation in his favour for positional advantage over his enemies!
Whenever they show Iron Man or War Machine's HUD user interface, you'll see at the very bottom it said:
Are we to believe that Tony Stark was adamant about Apache configuration file syntax? Just joking--the person who designed it from a movie was probably being creative, so he copy pasted some stuff from his Apache configuration file.
I don't want to spoil it for you but I felt like I had to talk about this: whenever someone non-technical tries to be technical. A perfect example of this was the Hammer Industries CEO. When Ivan "hacks" his encrypted software and the Hammer Industries CEO says, "Wow, you totally bypassed the firewall so fast". Wait a second. Firewalls essentially protect the system from outside attackers (emphasize outside trying to come in). So why would they even care if it was a terminal INSIDE the corporate infrastructure. Totally defeats the purpose of network security.
If you haven't seen Iron Man 2, go watch it--it's a great entertaining movie. I watched it with my family for Mother's day.
So, after a terrible experience on Ubuntu for my father, I've decided to just go buy him a Mac Mini. Firstly, before I pull out the credit card, the first thing I do is go to MacRumors and look up the last update date for the Mac Mini. Incidentally, the Mac Mini was last updated on October 2009. That said, I'll be holding off on my purchase for a while as Apple may be updating these machines sometime within the next few months.
After buying so many Apple products, I've come to realize that if you're going to buy any Apple hardware, you need to buy it ASAP after it comes out. I made the huge mistake of buying an Intel Core Duo Macbook a few years ago, receiving it, and then 4 days later Apple releases an Intel Core Duo 2 Macbook with a bigger hard-drive and a lower price tag.
It's okay though--Pudge (the name of my old Intel Core Duo Macbook) lasted for a good 3+ years until he passed away from an accidental swim in "diet coke".
After doing a simple 1-2 hour install on a new Ubuntu box, I decided to surf a few HD videos on YouTube. The reason I installed Ubuntu is because I wanted to test out the user experience of 'web surfing' on a Linux platform. Turns out, Adobe Flash Player has terrible performance when loading anything labeled "HD" on YouTube.
At first I thought it was just YouTube's video player, but I went to Vimeo and tested a few of their high definition videos and the same issues occur:
- Ridiculous CPU spiking to 95%
- Framerate for videos drop to 1-3 FPS
If you take the same box and view the videos on WIndows or Mac OS X, you can see such a huge difference in performance. Since pretty much every video site you'll ever encounter is powered by a Flash player (instead of HTML5 video!) I doubt that Linux will ever be a great user experience for a casual user (only watches videos, reads news, checks email).
Now that I've mentioned HTML5 Video, go check out my fork for HTML5 video implementation with Flash fallback for the poor IE users.
If you've checked out the code on my github, you can see that it's already setup to take commands and start saving names in between game sessions. Incidentally, this doesn't exactly solve the problem with providing users with an early warning system of any ninjas in tehir raid group (for themselves yes, but for others no). To solve this problem, I thought of a web service that I'd have to build that gave users the ability to upload their .lua file of SavedVariables. Essentially, the following flow would happen:
- A user will upload their WTF\Account\ACCOUNTNAME\SavedVariables\Ninjalist.lua file to the web service
- A user will then have to specify what realm they are on in order to scope the query
- The web service will take their Ninjalist (Table variable type in Lua) and merge it with any other Ninjas in the database but is specifically scoped to only those within the same Realm.
- The web service will return a new Lua file with the merge completed and the user can place the newly generated Ninjalist.lua file into their SavedVariables folder
Does this seem complicated? The reason why I'm building this web service is because if you've read the first post, addons don't have any API of invoking anything external to the game.
Part 3: Merging and the construction of the web service--Coming soon!
PS: Here's some sweet programming music: http://www.youtube.com/watch?v=E3jHvvn-vFQ&playnext_from=TL&videos=t-btgKVpdwk
This song is actually from the Oceans 12 movie (the laser dancing scene)
Contextually speaking, Ninjas in the World of Warcraft are people who purposely make the effort of lying to 24 other people (a raid) about fair looting rules when in reality their intention is to steal all the items.
Can software really solve the inherent problems in World of Warcraft's social system?
The problem with World of Warcraft's social system is there are no enforcers that punish people for stealing. Can you imagine a world where anyone could steal from you because there was no law enforcement?
As soon as I saw my distressed guild mate say that in chat, I started to think: if there's no enforcement on who steals something in WoW, could a tool be made to at least warn the user before cooperating with a ninja so he/she could avoid getting stolen from? Ding.
After I gathered my thoughts, I said to myself that I would create a World of Warcraft addon that will query a remote database for a subset of names inside their current raid (when the user enters a raid group). Ultimately, the addon would verify if any participants in the raid group have any accusations of stealing items. Little did I know, the following would happen to me:
Part 2, coming soon! I have the code that I've written so far on Github.
I'll document my trials and tribulations of solving this social fail in World of Warcraft. Believe it.