Monday, 2 September 2013

Our Favorite Images from August 2013

Our Favorite Images from August 2013

September 1st, 2013 by Sarah
So long summer, and thanks for all the images.
Many years ago my great grandmother made a promise that if she made it to her 100th birthday she would ride her first motorcycle, that day has come
Favorite comment by Ulken : Great grandmothers of Anarchy

So my parents took a beach vacation with their dog and sent me this pic.
Favorite comment by Baugoti : 4 hot dogs.. 2 slim jims.

I made this gif of Miley twerking and I’m not even sorry.
Favorite comment by morgeb : i think this captures the essence of Miley and how hard she tries to be edgy and sexy. Beautiful.

It’s fire season in my hometown, Highway to Hell?
Favorite comment by cyclone : You know it’s time to move when your town has a “fire season”

Ball point tattoo
Favorite comment by gman103 : You just blue yourself

So my friends accidentally shot a firework into their box of OTHER fireworks…
Favorite comment by lucky141 : fixed: http://imgur.com/PJmGGSP

So my friend rode an ostrich in Africa…, might be the happiest a person can be.
Favorite comment by TheFuckingCatalinaWineMixer : An ostrich is the closest thing to a live raptor we have. Up to 9 feet tall. 340 pounds. Aggressive. Sharp beaks. Long claws. Terrifying.

Tried to take a photo of a grasshopper on my windshield, but it looks like its giant and destroying the town
Favorite comment by AllRin : Ohmagod, the whole town’s been destroyed! Who did this?! —> Katydid.

IT’S HAPPENED. Chinese person with a random English word as a tattoo.
Favorite comment by NotImgurAdmin : “It means ‘Peace’ in English.” – Chinese Girl

Now that Ben Affleck is Batman, this can only mean one thing.
Favorite comment by THEANGRIESTPERSONONIMGUR : MY BOY ROBIN IS WICKED SMAHT.

Tech Tuesday: Technical Debt

August 27th, 2013 by Sarah
I want to talk about technical debt, which is a phrase coined by Ward Cunningham to describe what happens to software projects over time when an approach to solve a problem is chosen by virtue of being the most expedient. The quick and dirty hack solves the problem now but has costs associated with it later, including maintenance and learning. There are some great articles (including one by Steve McConnell ) that describe it at length. I want to focus on why I agree with Jeff Atwood that “technical debt is unavoidable on any real software project,” and identify a new category of technical debt not addressed by McConnell.
Steve McConnell rightly distinguishes between two kinds of debt: intentional and unintentional. The latter is simply the result of unintentional errors. This happens when a design “just turns out to be error-prone,” or a junior programmer “just writes bad code.” More broadly, this kind of debt is the result of incomplete information when making a decision, such as what design to use or knowledge about what’s good and bad practice. We never make decisions with full information so it is necessarily true that there will be debt like this. I think McConnell underplays the prevalence of this kind of debt; he spends most of the article discussing intentional debt but unintentional debt is just as prevalent. All code is written with some assumptions, so if any of those assumptions turns out to be false then the code must be changed and your company has acquired debt.
There is another kind of technical debt that accumulates necessarily in software projects, which is code whose requirements have changed. All code is written with some requirements in mind. It might seem reasonable at one stage to only target MySQL as your database, but if at any point the requirements change so that you need to support multiple databases, then not only do you have to go out and write the new code, you also need to go back and fix the old code where it assumed that there would only ever be one database, and that that database would only ever be MySQL. The implicit assumptions generated by requirements can be pervasive — if you switch to SQL server then you can’t be using backticks in your queries . Requirements that change are a bit different than assumptions that turn out to be false, because at some point it was perfectly valid to, for example, use backticks in your queries. Requirements changes also almost always incur technical debt, and can invalidate swaths of code. This ends up being the reason why contract workers are so fickle about requirements.
Technical debt is largely unavoidable. Requirements change, and decisions are made which turn out to be based on bad reasons, which all incur indebtedness. The only way to service technical debt is to go back and rewrite it the right way. McConnell suggests a few eminently reasonable things to do if you’re worried about technical debt, one of which is just doing some basic accounting of your time. How much time are you spending on “servicing the debt” versus actual product development? If you aren’t worried about technical debt, maybe you should be. McConnell warns of the risks of unaddressed technical debt:
If the debt grows large enough, eventually the company will spend more on servicing its debt than it invests in increasing the value of its other assets. A common example is a legacy code base in which so much work goes into keeping a production system running (i.e., “servicing the debt”) that there is little time left over to add new capabilities to the system. With financial debt, analysts talk about the “debt ratio,” which is equal to total debt divided by total assets. Higher debt ratios are seen as more risky, which seems true for technical debt, too.
Most of all, it’s important to have the problem of technical debt be visible and addressed. The language of technical debt is a great way to convey to even non-technical managers and executives the nature of the problem, which is one step closer to fixing it.
Jake
Front End Engineer

Imgur sponsors FXOpen e-Sports

August 15th, 2013 by Sarah
Competitive gaming has evolved since the video game industry’s revenue surpassed that of Hollywood, and it now features full-time gamers competing for millions of dollars each year. This competition is called e-Sports.
FXOpen e-Sports is one of the most recognized names within the gamer demographic, and is home to over fifty of the world’s best players. The full team, including 12 staff and 39 players, are spread all over the globe and include three squads. The North American squads includes players from Mexico, USA and Canada who train from home in League of Legends , Starcraft 2 , and Dota2 . The Korean Starcraft 2 squad trains from a team house.
Imgur is proud to be a team sponsor! Until we chatted with Elliot Smith,* Business & Sponsorships Director for FXO e-Sports, we didn’t know a lot about the e-Sports world, and figured many Imgurians may feel the same way. Read the interview below for a glimpse into this gaming subculture.

What does it mean to be a pro gamer? Is it a full time job?
Being a pro gamer is something that really varies; it all depends on your following as well as your results. For example, our Korean Starcraft players treat it as a full-time job and live in a team house, training every day for about as long, if not longer, than most people would spend in a 9-­5 job. Several of the more notable ones who put out more results like FXOLeenock make a full salary as part of their contract with us, and also gain a lot from tournament winnings [current ranked 5th in career earnings with over $200,000].

FXOLeenock
The culture in Korea is very different regarding video games. Team houses and such are a relatively new thing in America, at least in comparison to Korea. Our North American players, for example, are usually part-­time players who play from home. Some of those part-­time players are still good enough to gain a fan base and build results, and those players also earn a salary, but at the moment the only people we have treating it as a full time job are the Koreans.
Also, all our players get a full gear setup, which is basically keyboard, mouse, headset, and other bells and whistles. Depending on results or following we send them to different events and travel them around.

What is the team house like?
All the players live in shared rooms with bunk beds, except for their head coach who has a single. I believe there are eight or so players living there right now. They keep things very tidy and organized, and have a room that is dedicated just to practice. In it they have a gaming computer set up for each player. They will train for 10+ hours a day, taking breaks for workouts or time outside. The time they spend training is part of their job, and they take it seriously. Part of what helps them to be the best is that they train with each other and build a competitive atmosphere through the house. They sit on the floor when they eat.
Take a look inside the team house:


Can you describe how they train in the team house?
Our Korean players are really good, so it’s often hard for them to find consistent quality opponents just playing ladder matches [where you get a random opponent based on rank]. So, they often train against each other, and that’s part of why they are able to get to such a high level. Playing against really good players repeatedly is something only a team house can really achieve effectively without a bunch of wasted time. The League of Legends team often scrims [plays practice games] against other teams. They can’t scrim against each other since they are a team of five.
In our Starcraft team house, there are quite a few players who are just there for training, and then a few other star players who travel around to events and just train at the team house when they are home from competitions. The Korean team house does act as a sort of training ground for up‐and­‐coming players who take the game seriously, but those players, of course, have to pay their way for food and rent, and things like that.
Some players present cost benefit through their fan base and results, and those are the ones we can pay to live at the house and travel around, and others just come purely for the experience.

How often and how far do the top players travel?
All over the world. Leenock, for example, has been flown to Europe and the USA to attend big events. Our League Of Legends team is very regionally focused. If they qualify for an event, we will fly them to the event and pay for their hotel and food.

What’s the main event for which the players strive toward and train?
In Starcraft 2, the biggest events are Major League Gaming (MLG), IPL Team League and other IPL Tournaments, as well as Dreamhack , which is huge.
In League Of Legends, the biggest events take place through Riot [the company that created the game] sponsored tournaments, and those tournaments are growing faster than any other in the industry, with prize pots over a million dollars. The FXO LoL team has not yet qualified for that tournament, but it is obviously a goal for any team. Their value right now is in their streaming numbers.

The FXOpen Korean StarCraft 2 team celebrating its second consecutive GSTL Championship

How can the Imgur community get involved, and why should gamers care about Imgur?
You can follow team FXOpen on Twitter or Facebook for community announcements and updates. Subscribe to the YouTube channel .
Everyone uses Imgur in the gaming scene because it’s the best, most reliable image uploading site. Lots of communities like teamliquid.net have forums where Imgur uploads are useful. You can upload an image, and then just paste the BBcode into the forum.

Look, Ma! We’re on the shirt!


What percentage of the time do you think the North American players who play from home are playing without pants?
Let’s see, I’d say 10-­15% of the time? I have absolutely no realistic clue. You have a dirty mind, I suppose.

Anything else you’d like to mention?
Well, just a shoutout to all our sponsors: Imgur, you guys have been supporting me and the evolution of this team since the beginning. FXOpen , Twitch.tv , Razer , and 300apm apparel . Also, thanks to all our fans for supporting us and making the dreams of our players and staff come true!
*At the time of this posting, Smith no longer works with FXO e-Sports.

Tech Tuesday: Ad Team Takeover

August 13th, 2013 by Sarah
We are always seeking ways in which to engage, entertain and involve Imgurians with all things Imgur. Over the past several months, we’ve had a couple opportunities in which to do that using galleries. Using the same underlying infrastructure that powers our front page gallery, we created individual galleries to host contests.
The first opportunity happened after a chance meeting with Doug, from the Awkward Family Photos team during the AdTech weekend here in San Francisco. The resulting collaboration asked fans of both websites to recreate selected photos from the Awkward Family Photos archives and use Imgur to share them with your friends and (maybe) family. The result was more awkward than we could have imagined.

And our winner is:
null
Building on the success of this contest, we followed up by asking our community to ‘model’ Imgur merchandise for use in our store. Again Imgurians grabbed the giraffe by the monocle and delivered some great shots of themselves showing off their Imgur gear.

You can view the latest Imgur merchandise here to see your fellow Imgurians in action.
As we continue to move forward, we are always looking for new, fun ways in which we can engage and involve Imgurians using galleries. Please take a moment to drop us a comment with your ideas on how we can use galleries for contests, campaigns, promotions or any other awkward ideas you may have.
Brad Kessler
Inside Sales Manager, Imgur

Our Favorite Images from July 2013

August 1st, 2013 by Sarah
Not only did July bring with it the usual fireworks, cookouts and hot weather, but this year we also got Sharknado , In the Way Guy , and a bunch of people “not caring” about the royal baby. Plus, the noble NobodyN0se saved a life . Nice job, July! Forget about your Imgur World Problems and enjoy our favorite ten images from the past month.
My cat sneezed at the wrong moment
Favorite comment by horizontalcracker : NERRRRRRRRR

All my friends r dead. Noooooo!!!
Favorite comment by nobodyeverexceptthatguy : I guess their fates were…sealed. Goodnight.

Disney used to be a scary place
Favorite comment by UmbraHunter : Why the **** is he kneeling? This photo is one blindfold away from a ransom demand.

My boyfriend is scared of our fetus.
Favorite comment by MeSoMerry : THE CALL IS COMING FROM INSIDE YOUR UTERUS

Infinity pools mess with my head
Favorite comment by Glcondray : He needs to pool himself together.

So a frog jumped on my window and I decided to take a picture. No effects but flash. I present Spacefrog.
Favorite comment by CptTightPants : …But is he a battletoad?

This shirt better open up that safe.
Favorite comment by cantthinkofacoolusername : This shirt better get me to the front page

So my aunts bff, who lives in Florida, had a waterspout touch down in his “backyard” today.
Favorite comment by TheMeanestPea : Florida – The state with the most ways to die.

Cat Bath Returns!
Favorite comment by double0drifter : They washed me in water, so I bathed in the their blood

“Bringing 9 lbs. of camera gear on a backpacking trip is stupid.” they said…
Favorite comment by debunker : “We were wrong. Send us a copy.”

Tech Tuesday: iOS Programming

July 30th, 2013 by Sarah
In my time as an Intern at Imgur, the one job I found myself doing most often was learning.
My job was creating an entirely new iOS app * from the ground up – one that not only differed from existing apps, but was also written in a language that I didn’t fully know: Objective C. Previously, I had written my apps entirely in Javascript and used wrappers such as Titanium and Phonegap to compile and translate from Javascript to native Objective C. These wrappers have their benefits; they allow for simpler, faster development, without any prior knowledge of device-specific languages such as Apple’s Objective C. Ultimately, however, they add an unnecessary layer of abstraction that (usually) degrades performance.
For these reasons, Imgur decided that the new app should be native. The only problem with this was that I had never programmed a native iOS app before. Fortunately, tutorials, guides, and references on iOS programming are not hard to find. After a few weeks browsing Apple’s developer library, following courses on Codeschool , and reading answer after answer on Stack Exchange , I was ready to begin.

The Technicals

At its heart, Objective C is an extension of C. Anything library, class, function, or piece of code that is written in C can function fully and well in an Objective C program.
Objective C, however, adds a great deal to the C language. The core differences that come to mind are:
  • ARC – Automatic Reference Counting: A method of automatic memory management handled by the compiler.
  • Loose type casting – objects in Objective C can be cast as "id"s, essentially meaning an object of unknown type.
  • Messaging – A method of invoking functions on objects by sending "messages" rather than calling class methods (similar to Smalltalk).
As a whole, the extra functionality provided by Objective C allows for more dynamic, flexible programming than is possible in pure C. For example, consider the task of creating an array of integers and words:


Objective C:

NSMutableArray * array = [[NSMutableArray alloc] init];
[array addObject:@"Five"];
[array addObject:[NSNumber numberWithInt:5]];


C:

char * string = "Five";
int * integer = (int*)malloc(sizeof(int));
*integer      = 5;
void ** array = (void**)malloc(sizeof(void*)*2);
array[0]      = (void*)string;
array[1]      = (void*)integer;
Note: This could also be achieved in C by using a Union; however, this would lead to unused memory in an array (due to how Unions are allocated) and still restricts the data types allowable.


In this example, not only is the Objective C code simpler and easier to read, it is also enormously more flexible. The Objective C array can store an arbitrary number of objects, each of arbitrary class or type. In contrast, the C array must be reallocated whenever its size is changed, and can only store objects of a single type. This single type requirement can be circumvented by casting objects to void pointers (void*), but there is no way of then determining the original type of a void pointer. Lastly, the array must ultimately be freed in C, so as to avoid a memory leak.

Performance

Though Objective C has some benefits over C, there are some tradeoffs in terms of performance. In benchmarks, Objective C has been shown to be consistently slower than equivalent C or C++ code, by roughly a 20-30% speed difference:

Source: http://rmarcus.info/?p=488

This makes it slightly faster than bytecode languages such as Java, and significantly faster than interpreted languages such as Ruby or Python. These statistics, however, are highly dependent on compiler, language implementation, platform, and even purpose of the program. For certain applications, Objective C can be faster than C, while for others it may take twice as long.

Conclusion

Ultimately, Objective C is a superset of C that provides great improvements in ease and readability of programs at a fraction of the performance costs that come with interpreted languages such as Python or Ruby. On top of this, tools provided by Apple such as the "Interface Builder" and Grand Central Dispatch (a convenience thread toolkit) make Objective C an extremely easy and convenient language, well worth taking the time to learn.
Spencer
Summer Intern

* The new app will supplement the existing Imgur app, rather than replace it.

Additional Links:

Objective C Performance: http://rmarcus.info/?p=488
Java / C / C++ Performance: http://benchmarksgame.alioth.debian.org/u32/java.php

New Imgur mobile site

July 29th, 2013 by Sarah
There’s a new Imgur mobile site, and it’s way better than the last one.

The new mobile version features full site functionality and a faster, easier browsing experience. Check it out on your mobile device! Feedback is welcomed at mobilefeedback@imgur.com.

Meet Refurb the Cat

July 24th, 2013 by Sarah
Meet Refurb, the three-legged, loud-mouthed rescue cat whose images have graced the Imgur front page an impressive nine times, and whose endearing personality has inspired people across the Internet to donate to their local animal shelters and rescues.
Refurb was rescued from the Animal Humane Society in Minnesota by her current owner, Akslfak . She was brought in to the shelter after being stomped by a horse when she was a month old, which required an amputation to her back right leg. “The Humane Society did a great job with her and she recovered admirably well, so she’s Refurbished (aka Refurb). Just as good as a brand new model!” Akslfak commented.
Refurb first gained fame on Imgur in January 2013 for her love of meowing at cameras.

Then for playing with her best friend (and favorite toy), Tycho.

Sometimes she catches the derp…

…and sometimes she forgets that she’s missing a leg.

But our favorite Refurb story is of her “Refurbographs.” Akslfak writes, “One of the users [on Something Awful ] joked that he’d pay for a Refurb autograph – just a little paw print or something. I replied, somewhat sarcastically, that if he were to donate $10 to his local animal shelter, post proof, and email me his address, I would mail him a Refurb autograph. I figured he wouldn’t do it. Less than a week later, there had been 35 donations from all over the US, and six different countries across four continents. Donations are still coming in, too.”

Refurb put up with the paw-printing like a champ, and, currently, $1000 has been donated to animal shelters and rescues all over the world.

When asked about his reaction to Refurb’s fame, Akslfak said, “The overwhelmingly positive response, along with dozens of people offering to make donations after reading my story, is truly inspiring. I hope that everyone who still wants to help remembers that they have the power to do so, be it financially through donations, adopting an animal in need, or just by donating a few hours of their time to go to their local shelter and play with the cats and dogs. There’s a lot of abused and abandoned animals out there who need us, and spending an hour petting cats at a rescue seems like a better reward than being mailed a paw print any day.”
Congratulations to Akslfak for inspiring others to help animals, and thank you for sharing Refurb’s adventures on Imgur!
We welcome you to shower them in much deserved upvotes. Refurb will be waiting.

Tech Tuesday: Using Grunt to Simplify Build Processes

July 16th, 2013 by Sarah
Albert Einstein once said, it’s important to “make things as simple as possible, but not simpler.” Simplicity is a virtue and literally part of our motto. We had a variety of tools to pick and choose from while building the mobile app. Ultimately, something had to fold all our code together in various forms and act as an all-purpose build process. We found these qualities in Grunt . Following the instructions on its Getting Started pages, the system was in place in a matter of minutes.
Here are some of the things we wanted to do originally:
  • Preprocess the index.html template
    This lets us distinguish between builds for different platforms. E.g. Android vs. iOS vs. Web
  • Compile the templates into a single template file
    Less requests means faster load times. The single most important load time to minimize is the first one.
  • Minify the CSS and JS
    Both are interpreted languages which parse and run faster when there’s less characters to be parsed.
  • Lint the existing codebase for semantic gotchas
    A standard software engineering practice that catches subtle kinks in the code before they get out of hand.
  • Run shell tasks as build phases
    Handy for moving files around or further automation during intermediary stages of a build process.
  • Connect to the PhoneGap Build system
    We used this system in the early stages of the app to keep things relatively uniform across Android and iOS platforms.
The process had to be fast so that devs wouldn’t be reluctant to iterate and build quickly. It would also need different build profiles for whether the app was being built for testing (debug), as a pre-release stage (to be tested by non-devs), or as a release (for potential submission to app stores).

A typical Gruntfile

A Gruntfile is a file that lives in the root directory of your project repo and contains all the info needed for the Grunt tool to do whatever it is you want it to do, which means tasks need to be defined (tells it how things are going to be done) and registered (tells it what things are going to be done). When you run Grunt, you pass it an argument that tells it which task you want it to perform. Leaving this argument blank means you want it to run the default task.

Sample Gruntfile.js

module.exports = function(grunt) {

  grunt.initConfig({
    pkg : grunt.file.readJSON('package.json'),
    
    preprocess : {
        dev : {
            options : {
                context : { ENV : 'dev' }
            },
            src  : 'template.html',
            dest : 'base.html'
        },
        production : {
            options : {
                context : { ENV : 'production' }
            },
            src  : 'template.html',
            dest : 'base.html'
        }
    }
    
    shell : {
        clean : {
            command : 'rm build/release/*.min.js ; rm *.zip ; rm index.html'
        }
    },
    
    uglify: { ... },
    
    'phonegap-build' : { ... },
        
    zip : { ... }
    
  });

  
  grunt.loadNpmTasks('grunt-shell');
  grunt.loadNpmTasks('grunt-contrib-uglify');
  grunt.loadNpmTasks('grunt-preprocess');
  grunt.loadNpmTasks( ... );

  grunt.registerTask(
      'default',
      ['preprocess:dev', 'shell:compileTemplates']
  );

  grunt.registerTask(
      'production',
      ['shell:clean', 'preprocess:production', 'uglify', 'zip]
  );
  ...
  
};
In this sample Gruntfile, there are 3 distinct sections that pertain to configuring tasks.

Section 1 : Task configuration

Inside the CommonJS module wrapper module.exports = function(grunt) { ... }; , we have our first function call which defines the task namespaces and the options that are passed to each task under those namespaces.
For instance, process : { ... } is a task namespace which has the option to be run in dev mode or
production mode, each with different options. In layman’s terms, this is a recipe page for the baker which has
the instructions to “put icing on the cake”, which can be done with “chocolate icing” or “vanilla icing”.

The great thing about Grunt is the namespacing of these tasks which lets us reuse parts of one task namespace to accomplish the same thing for another task. e.g. Both “Bake me a birthday cake for Joe” and “Bake me Sue’s favorite cake” involve the task of “putting the cake into the oven”. To refer to the different modes within a task, think of the task string as a JSON property path (JSONObj.Key.Value) but instead of periods, use colons: JSONObj:Key:Value.
This not only makes it easy to reuse code from one task to another but it makes writing the configurations for new tasks effortlessly simple. The bulk of the Gruntfile lives in this section.

Section 2 : Plugin registration

Next, we have to tell Grunt what plugins we’ve installed and when we do particular things that refer to them; telling the baker there’s a large spatula in the kitchen to spread the icing. This section is simple, since all we need to do is install the plugins and tell Grunt that they’re there.
grunt.loadNpmTasks('grunt-preprocess');
Load the “preprocess” plugin and combine it with the arguments we set up in section 1.

Section 3 : Task registration

Finally, Grunt needs to know in what order to complete the tasks. This section is all about registering a “recipe” so that tasks are sequential.
grunt.registerTask('production', ['shell:clean', 'preprocess:production', 
'uglify', 'zip]);
Register ‘production’ as a recipe. First clean up, then uglify, then bundle all the stuff into a zip.

Running Grunt

Running Grunt is as easy typing grunt production . That would run the “production” recipe.
Here are the plugins we’ve found to be useful:
Thus far, we’ve found Grunt to be a wonderful tool that ties it all together. It’s simple and it just works. Moreover, there’s a huge collection of open source projects and a vibrant community that we can turn to for help if need be.
Jim
JavaScript Engineer

Note: Tech Tuesday will now be bi-weekly.

Imgur Model Call

July 15th, 2013 by Sarah
We’re looking for images of Imgurians wearing or using their Imgur merchandise to feature in the store . From July 15- July 19 August 2 ( entry deadline has been extended ), submit your image to the Store Gallery . Everyone who enters will get a free Imgur sticker! Those who submit the images chosen for the Imgur store will also receive a $25 Imgur store credit.
We’re looking for images that look something like this:

HOW TO ENTER: To enter the Contest, visit the gallery located at imgur.com/g/store during the contest period and upload your image directly into that gallery. Make sure you are on the Store Gallery page while uploading. Select “add to gallery” and ensure the message “you are adding _ image(s) to the store gallery” appears. Help on uploading an image can be found here: imgur.com/help . Your entry is accepted when it appears on the Store Gallery.
To redeem your free sticker:
Step 1: Upload your image to the Store Gallery .
Step 2: Send an email to store@imgur.com with your name, address* and a link to your store gallery post.
Step 3: ???
Step 4: Profit.
*We won’t do anything weird or malicious with your name or address. We won’t even keep it. It’s just for us to send your sticker!
**By submitting your image to the Store Gallery, you are agreeing to the terms of service , gallery rules , and granting Imgur permission to use it for store purposes.

No comments:

Post a Comment