Programmers solve problems and most of the time use a keyboard to do so.
I firmly believe you need to be able to efficiently express yourself through typing. There’s probably nothing more fundamental in programming than being able to think of something and expressing it in code without losing your train of thought.
I say efficiently and not perfectly. You don’t have to be the fastest typist in the west but speed helps. I could make up a couple of “imagine a surgeon that didn’t know the way around a scalpel” or “a baseball player that didn’t know how to swing” but I wont, you probably get the picture.
I was lucky enough to take typing lessons back in computer class in school. They gave use those orange covers you placed on top of the keyboard to hide all the keys. We’d use this with Mavis Beacon Teaches Typing and some other variation as a fun game. While most people lifted up the cover while the teacher wasn’t looking I just simply dealt with the damn thing and learned how to type instead of hunt and peck typing my way through it.
A month ago I decided to take another stab at proposing a solution to allow all of us to keep working on great programming workshops.
Personally, the biggest headache in each and every one of the workshops that I have organized or participated in is the time and effort it takes to configure and setup the attendees’ computers. This results in attendees and instructors loosing valuable time that can be spent actually sharing knowledge. Various other people have shared the same worries and feelings about this, so might as well try and do something about it.
Juice Box is virtual machine with a common environment that every workshop attendee can download and use before ever getting to the actual workshop.
What’s installed by default in Juice Box
Python 2.7 with pip, virtualenv, and virtualenvwrapper
io.js with nvm
Sublime Text 3
What this project is trying to accomplish
Provide the most simple instructions possible so that attendees at every level can get started easily.
Reduce the need of a great network connection during the event.
Guarantee that all attendees have the same environment, tools and applications, making the process easier for all.
Reuse the same virtual machine between different groups and workshops.
We built OVA files for Juice Box which allows us to simply distribute one file that contains the virtual machine. This file can be imported to VirtualBox with few clicks. We’ll be building and uploading each release so attendees can just download the resulting OVA file. We’ve optimized the size of this file to achieve the smallest size possible but I’m sure it could be better. It’s smaller than an MP4 movie “shared” on TPB. Organizers might now require attendees to bring their Juice Box already downloaded and imported. Obviously, we might still have users that couldn’t download it, so just have a few USB flash drives with VirtualBox downloads for different operating systems and Juice Box’s OVA file.
Technical workshops shouldn’t be about installing a development environment in Linux, Windows, OS X, or whatever else. Unless that’s what they are about, this takes way to much time from everyone and it’s a pain. I propose that we organize InstallFests, events that are specific to helping users install development environments into their preferred operating system.
Juice Box is completely open source under The MIT License and everything used to create the virtual machine is available on GitHub. If you’re a workshop organizer, make sure you “watch” the repository, this way you’ll get notified of new releases.
Go download Juice Box and try it out out. This project might not be the best or correct solution, but it’s a start. Thanks to everyone that has already provided feedback. I’d love keep the conversation going and to have more feedback on this, wether you’re a workshop organizer or usually an attendee.
This project is sponsored by Blimp, a software products design and development agency. Blimp also organizes community workshops like Ember.js Puerto Rico and private trainings.
Three weeks ago today, on an unfortunate accident, Mako my 6 year old Siberian Husky escaped from home, and we noticed just a couple of hours later. After endless hours, driving around different possible routes, talking to people, calling out his name, posting hundreds of flyers, hundreds of people sharing on Facebook and Twitter, we haven’t found him yet.
Mako is more than a dog or pet to me, he’s a loyal friend, and we’ve been through a lot. This past weeks have been eternally tough for us. We’re still looking for him every day, we’re still receiving calls of people who’ve seen similar dogs around, I drive with my windows down in hope of hearing that beautiful distinct howl. We’re hopeful that perhaps a loving and caring family found him, rescued him, and has fallen in love with him. But we’re still not giving up.
While our search continues, we’ve brought along a new addition to the family to help. He’s not a substitute or replacement, nor is he a way to forget. Ana thought he’d be of great company, and surprised me with him. She was right and I’m so glad she did. We’ve name him Oliver. He’s a beautiful, happy, and intelligent 2 month old Miniature Dachshund. We’ve been together for two weeks now, he’s kept us company, brought us happiness and laughter, has helped make everything less bitter. He’s saved us and I love him so much.
In midst of it all, the people that really care about us have shined. I’ll be eternally grateful for everyone that showed support one way or another. And you, Ana, I love you so much, thank you for holding my hand along the way.
PS: Ana shared with me some helping points for when things don’t go your way. Might help you out some day too.
Take a step back and evaluate
Vent if you have to, but don’t linger on the problem
Realize there are others out there facing this too
Process your thoughts/emotions
Acknowledge your thoughts
Give yourself a break
Uncover what you’re really upset about
See this as an obstacle to be overcome
Analyze the situation – Focus on actionable steps
Identify how it occurred (so it won’t occur again next time)
Last year around this same date I started The Hacker and Designer News newsletter as a weekly curated recap of the what I thought were the best articles from Hacker News and Designer News on startups, entrepreneurship, hacks, programming, design, etc. I built and open sourced an aggregator to help me collect posts. I later built news.hdn.io using that same aggregator to view the current top posts on both sites side-by-side.
Learned a couple of things from building a newsletter, missed a couple along the way, but definitely looking forward to ramp up subscribers throughout 2015. If you still haven’t, feel free to check out past issues and subscribe.
Check out below the Top 20 Hacker and Designer News for 2014.
Supporting Internet Explorer is always kind of a drag, but sometimes you just have to. Adding to the mixture file uploads via AJAX and CORS only make it that much more fun.
When dealing with AJAX file uploads I always seem to keep going back to jQuery File Upload. Making these file uploads work on IE require fallback to using an iframe, which is supposed to work automatically almost right of the box. I encountered some issues, maybe it was the slack of sleep, reading outdated Stack Overflow answers or simply not understanding the documentation that well.
If the origin domain is different than the file upload server domain, CORS comes into play and there are some known limitations and issues on IE 8 and IE 9. In Internet Explorer 8, the XDomainRequest object was introduced to allow safe AJAX cross-origin requests directly by ensuring that HTTP Responses can only be read by the current page if the data source indicates that the response is public. Responses indicate their willingness to allow cross domain access by including the Access-Control-Allow-Origin HTTP response header with value *, or the exact origin of the calling page.This blog post lists and describes the restrictions and reasoning behind them, but these two are the ones that bit me recently.
Only text/plain is supported for the request’s Content-Type header – This means that your API endpoint will have to be adjusted to be able to parse whatever data you send in the request. In my case I was returning a JSON response with an application/json content type, but after figuring this out I had to change the content type of that response to text/plain. On the client side that meant manually parsing the response data as JSON using $.parseJSON.
Requests must be targeted to the same scheme as the hosting page – Once I thought I had everything working I was still getting hit by a couple of errors. Turns out I was generating a request from http to an https endpoint on different domain.
The target URL must be accessed using only the HTTP methods GET and POST
File Upload widget with multiple file selection, drag&drop support, progress bars, validation and preview images, audio and video for jQuery. Supports cross-domain, chunked and resumable file uploads and client-side image resizing. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.
Cross-domain file uploads on IE 8 and 9 use the Iframe Transport plugin that requires a redirect back to the origin server to retrieve the upload results. The example implementation includes a result.html that works for this. The repository includes the jQuery XDomainRequest Transport plugin which is required to enable cross-domain AJAX requests in IE 8 and 9. Internet Explorer 10 and above supports CORS using XMLHTTPRequest.
The tricky part here for me was ;“requires a redirect back to the origin server”. I had the results.html file in place but nothing was happening. Taking a look at the sample server implementations I noticed that in order for this to work I had to redirect the response to the location of the results.html including the response JSON I would normally return as a response but as a query parameter. The results.html enables jQuery File Upload to access the results from the iframe.
Here are a couple of excerpts that might help understand.