tag:blogger.com,1999:blog-75865939701002169942024-03-06T03:56:43.445-05:00Ruben Orduz's BlogThoughts, musings, opinions, reviews, rants and a dash of codeAnonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.comBlogger55125tag:blogger.com,1999:blog-7586593970100216994.post-79583511099069103422015-01-18T09:36:00.002-05:002015-01-18T09:36:52.301-05:00New Blog HomeJust FYI: a few months ago I moved my blog to <a href="https://blog.such.computer/">https://blog.such.computer</a>. Sorry for not having posted this notice before =(Anonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com0tag:blogger.com,1999:blog-7586593970100216994.post-11118379390562348842014-02-09T22:08:00.000-05:002014-02-09T22:08:30.578-05:00The Wild West Needs OrderWithout beating around the bush, if the world of crypto currencies is to stay for the long term there needs to be a shift in the community toward an even, fair playing field and a concerted effort to fringe the malicious and the ill-willing. In my opinion, this thriving "shadow" economic world needs the following changes, in no particular order:<div>
<br /></div>
<div>
<ul>
<li>A complete security audit of all the tools needed to mine, trade and exchange crypto currencies. From the OS, mining software, GPU drivers, exchanges, etc. Currently the vast majority of participants are trusting in the good will of the people who develop and maintain these tools, but there's nothing to say that the linux distribution we are using doesn't have a backhole or a trojan. Same goes for mining software, wallets, etc. </li>
<li>An exchange network infrastructure. Currently all exchanges are disconnected and often prices completely out of sync. This allows for people with time and resources to exploit the price difference to their advantage.</li>
<li>Faster way to confirm transactions. One of the theoretical advantages of crypto currencies is the minimal cost of transaction. However, this point is moot if it takes the network hours to confirm the transaction -- depending on the currency.</li>
<li>Developers need to have a "covenant" with the community assuring the following:</li>
<ul>
<li>Zero changes that affect the coin after coin public release. </li>
<li>Only bug fixes and maintenance to wallets.</li>
<li>Will not act as central banks and make monetary decisions after coin public release.</li>
<li>Will at least stick around for 6 months after coin public release.</li>
<li>Will make sure ALL required parts to use the coin are working before public release (i.e. wallets, miners, strata, etc.)</li>
</ul>
<li>A volunteer-based arbitrage board to resolve issues that arise between exchanges and their customers. </li>
</ul>
<div>
If the issues above are addressed, the world of crypto currencies will attain wide acceptance and increased legitimacy with the "mainstream" economies. Until that happens, crypto currencies will keep being seen as a monopoly economy mainly used for illegal activities.</div>
</div>
Anonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com0tag:blogger.com,1999:blog-7586593970100216994.post-39701086644327941432013-09-29T14:21:00.001-04:002013-09-29T14:21:58.786-04:00ChoreMonster: It Works.If you believe in the parenting philosophy of "Reward for Effort", especially when it comes to house chores, then <a href="http://choremonster.com/" target="_blank">ChoreMonster.com</a> is a web service you should consider. It currently is advertising-free with premium subscription options. You can use the service for free indefinitely, all the premium subscription gives you is extra virtual "rewards" for your kids. The service is divided in two main sections, one for parents and one for kids. The parents section has all the tools needed to create chores and rewards list as well as tracking and approval thereof, all in a very intuitive fashion. The kids section includes the list of chores, the choice of rewards, and, the premium-only section of monster carnival mini-game where kids can trade earned tickets for a chance to "unlock" new monsters. The customer service is top notch and very prompt, in our experience.<br />
<br />
It has worked fantastically in our family. Our oldest kid is totally into it, almost not caring what the rewards are, but just the sense of accomplishment and the chance to unlock monsters provides him with more than enough motivation to not only do his chores, but make sure he does them correctly (the parent has to approve each chore marked as complete). The parenting section also has something for numbers-oriented parents as well: chore tracking and velocity (i.e. you can see how many chores/day or points/day your kid is burning through) so you could determine and project forward your kid's baseline effort.<br />
<br />
All in all, I highly recommend using the service and if you find it useful, purchase a premium subscription. And just to be clear, I'm no way associated with them. I don't know anyone who works there and I have nothing to gain or lose. I just think it's a great service and deserves patronage.Anonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com0tag:blogger.com,1999:blog-7586593970100216994.post-75660660126746565122013-09-04T15:41:00.001-04:002013-09-04T15:41:56.898-04:00For Schema Migrations Use App Engine Task Queue instead of Backends Every application under iterative development, eventually is going to need a schema migration of some sort. In our case, we needed key/id field re-alignment as well as adding new common fields to all our models that needed to be populated. Given that even the most innocuous of migrations will probably take longer than the maximum time allowed by an HTTP request, our inclination was to resort to a GAE backend to do the hard work in the background independent of the HTTP requests deadlines. The problem with GAE backends is two-fold: the setup overhead and the dismal documentation and examples that the App Engine team provides -- although, to be fair, the former is exacerbated by the latter. <div>
<br /></div>
<div>
Backends have their own .yaml config file with several options that are not entirely clear and what side effect (if any) they have. The documentation for the backends.yaml is <a href="https://developers.google.com/appengine/docs/python/config/backends" target="_blank">here</a> and as you can see chasing down the different choices for a given option can feel like going down the rabbit hole. To make matters worse, you have to "wire" your app's app.yaml with backend.yaml and figure out how they differ and what is their role with respect to backends. Yet another issue that is not entirely clear is how to kick off a backend instance, assuming of course that you have all the pieces in the right place. The docs, again, are dismal, in my opinion. One passage mentions <span style="font-family: Courier New, Courier, monospace;">/_ah/start </span><span style="font-family: inherit;">as the way to kick start your backends; however, the docs also mention that a 404 HTTP error code is considered a success. Since there isn't a way to see whether the backend is doing anything or not, is outright confusing to consider a 404 a success. Eventually, after much searching, I came across a way to get the process going via a front-end request; unfortunately this ties the backend to the fron-end deadlines.</span></div>
<div>
<span style="font-family: inherit;"><br /></span></div>
<div>
<span style="font-family: inherit;">As I was about to /flipdesk, I walked through the dark caverns of App Engine's news group, I bumped into a post about best practices for schema migrations. The post mentioned <a href="https://developers.google.com/appengine/articles/update_schema?csw=1" target="_blank">this article</a> posted on Dec, 2012 that lo-and-behold precisely addresses the issues at hand. While it seemed trivial to copy-pasta, I knew this would not apply to our app since we use App Engine's nbd datastore abstraction module. Fortunately, someone put the time to write a ext.db -> ext.ndb <a href="https://docs.google.com/a/infotechfl.com/document/d/1AefylbadN456_Z7BZOpZEXDq8cR8LYu7QgI7bt5V0Iw/edit?ndplr=1&pli=1" target="_blank">cheatsheet</a> that made matters a lot easier. After moving things around a bit and switching the syntax to ndb and adding couple simple lines to app.yaml, I fired up my local dev server and tried it. It worked from the get go. I pushed to our staging server on App Engine's infrastructure, which contains ~40K records. Fired the process up and some ten minutes later, the migration was complete. The best part, I could see its progress and logs thereof through the admin console even how deep the Task Queue was and what task was next in line.</span></div>
<div>
<span style="font-family: inherit;"><br /></span></div>
<div>
<span style="font-family: inherit;">In all, setting up, changing code and testing schema migration thought Task Queue took roughly 1/5th the time I had thus far invested on getting this process running under a backend. So, my recommendation based on my experience is to avoid using backends unless you absolutely have to and instead leverage </span>Task Queue<span style="font-family: inherit;"> for all other asynchronous/long-running processes.</span></div>
<div>
<span style="font-family: inherit;"><br /></span></div>
Anonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com0tag:blogger.com,1999:blog-7586593970100216994.post-28715154299558861642013-06-12T15:57:00.002-04:002013-06-12T16:07:03.648-04:00Getting Started With Node.js Modules and npm (for developers) In spite of <a href="http://nodejs.org/" target="_blank">node.js</a>' wild popularity, finding good informative docs and tutorials as to how to develop and distribute apps for the platform can be a chore. Google searches on the matter tend to return either out-of-date or end-user results. So, as a service to the community and for my own edification, I'm going to show you how to get started developing node.js and packaging with npm.<br />
<br />
This tutorial assumes you have node.js version 0.8.1+ as well as npm version 1.2.18+ properly installed. It further assumes working on a POSIX-ish environment. Also assumed is that the reader has at least passing knowledge of JavaScript.<br />
<i><br />
</i> <br />
<h3>
<i style="font-weight: normal;">"Hello Google"</i></h3>
<div>
In order to better illustrate the steps, we are going to develop a super trivial app that will send a search query to google, retrieve the results in json format and then print the results to the screen. So, let's get moving:</div>
<div>
<br /></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;">1. Let's create a directory and cd into it:</span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;"><br />
</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> $ mkdir</span> <span style="font-family: Courier New, Courier, monospace;">hello-google && cd $_</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><br />
</span></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;">2. Now the crucial step to get your node module started:</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><br />
</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> $ npm init</span></div>
<div>
<br /></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;">This will create a file named package.json which should look something like this:</span></div>
<div>
<br /></div>
<div>
<div>
<span style="font-family: Courier New, Courier, monospace;">{</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> "name": "hello-google",</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> "version": "0.0.1",</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> "description": "A trivial app to illustrate node.js dev",</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> "main": "main.js",</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> "scripts": {</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> "test": ""</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> },</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> "dependencies": {</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> },</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> "repository": "",</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> "author": "Ruben Orduz",</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> "license": "MIT"</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">}</span></div>
</div>
<div>
<br /></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;">3. Install request module (easier to use than the default http client):</span></div>
<div>
<br /></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">$ npm install request</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><br />
</span></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;">4. Let's add request to the list of dependencies in package.json:</span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;"><br />
</span></div>
<div>
<div>
<span style="font-family: Courier New, Courier, monospace;">{</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> "name": "</span><span style="font-family: 'Courier New', Courier, monospace;">hello-google</span><span style="font-family: Courier New, Courier, monospace;">",</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> "version": "0.0.1",</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> "description": "</span><span style="font-family: 'Courier New', Courier, monospace;">A trivial app to illustrate node.js dev</span><span style="font-family: Courier New, Courier, monospace;">",</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> "main": "main.js",</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> "scripts": {</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> "test": ""</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> },</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> "dependencies": {</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> "request": ""</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> },</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> "repository": "",</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> "author": "Ruben Orduz",</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> "license": "MIT"</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">}</span></div>
</div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><br />
</span></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;">5. Let's create main.js and write some code (you can use your text editor of choice in place of 'open'):</span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;"><br />
</span></div>
<div>
<span style="font-family: Times, Times New Roman, serif;"> </span><span style="font-family: Courier New, Courier, monospace;">$ touch main.js && open $_</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><br />
</span></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;">6. Now copy and paste the following code in main.js:</span></div>
<div>
<script src="https://gist.github.com/rdodev/5768215.js"></script><br /></div>
<span style="font-family: Trebuchet MS, sans-serif;">7. Now, let's test everything is working (assuming you are inside hello-google directory):</span><br />
<br />
<span style="font-family: Courier New, Courier, monospace;"> $ cd ..</span><br />
<span style="font-family: Courier New, Courier, monospace;"> $ node hello-google/</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">In a few seconds, you should see something along the lines of:</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> <b>PRISM</b> (surveillanc -> http://en.wikipedia.org/w</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> Nine Companies Tied to <b -=""> http://www.usnews.com/new</b></span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> What Is <b>PRISM</b>? - G -> http://gizmodo.com/what-i</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> NSA slides explain the <b -=""> http://www.washingtonpost</b></span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">8. If you have never submitted any packages to npm before, you must register with the following command:</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> $ npm adduser</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">it will prompt you some questions and within seconds you will have your user and machine authorized to publish to npm's public servers.</span><span style="font-family: Times, Times New Roman, serif;"> </span><br />
<span style="font-family: Times, Times New Roman, serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">9. Once you are 100% ready that you want to publish a module for public consumption, you can run the following command:</span><br />
<span style="font-family: Times, Times New Roman, serif;"><br /></span>
<span style="font-family: Times, Times New Roman, serif;"> </span><span style="font-family: Courier New, Courier, monospace;"> $ npm publish</span><br />
<span style="font-family: Times, Times New Roman, serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">10. To make sure your module can be installed and run:</span><br />
<br />
<span style="font-family: Times, Times New Roman, serif;"> </span><span style="font-family: Courier New, Courier, monospace;"> $ npm install hello-google</span><br />
<span style="font-family: Times, Times New Roman, serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">11. Let's test it through node:</span><br />
<span style="font-family: Times, Times New Roman, serif;"><br /></span>
<span style="font-family: Times, Times New Roman, serif;"> </span><span style="font-family: Courier New, Courier, monospace;">$ echo "r = require('hello-google');" > test.js && node test.js</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Note that the name the module will be published as it's not the name of the directory, it's the name declared in the package.json</span>Anonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com0tag:blogger.com,1999:blog-7586593970100216994.post-28238707243310833222013-05-18T21:14:00.001-04:002013-05-18T21:14:59.171-04:00Can you hear me Major Tom? Chris Hadfield's Impact on Space ExplorationEarlier this week, International Space Station resident Commander Chris Hadfield, a Canadian citizen, came back to earth, but not without first creating a series of defining moments for modern space exploration. It was not because what he discovered while in his six month stay, but because he did what not many astronauts had done before: he made the ISS accessible to everyone, from the comfort of our earthly dwellings. He did a social media blitz of sorts. He would post daily pictures of fly-bys across the globe, short videos demoing how things we do on earth differ in space: how flame burns without gravity, how crying looks like in near-zero-G, how they sleep, how they use the bathroom, how they keep in shape and so forth. He did several social media <i>live</i> Q&A events, including a <a href="http://www.reddit.com/r/IAmA/comments/18pik4/i_am_astronaut_chris_hadfield_currently_orbiting/" target="_blank">reddit AMA</a> a few months ago.<br />
<br />
With millions of followers across the major social media outlets, Chris Hadfield (and a small pre- and post-production team on earth), released his grand finalé, his Opus Major, if you will: a cover of David Bowie's Space Oddity, filmed and performed by Hadfield himself aboard the ISS.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/KaOC9danxNo?feature=player_embedded' frameborder='0'></iframe></div>
<div style="text-align: center;">
<br /></div>
<br />
To date, more than 13,500,000 unique viewers have watched the amazing video Hadfield and co. put together. And I sure hope, for the sake of awareness and education that the video continues to spread like a wildfire in a hay farm.<br />
<br />
My description of the video, as I previously posted on Google+, goes as follows:<br />
<br />
<blockquote class="tr_bq">
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">I don't think a music video has moved me so much as Commander </span><span class="proflinkWrapper" style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"><span class="proflinkPrefix" style="-webkit-transition: color 0.218s; color: #427fed; transition: color 0.218s;">+</span><a class="proflink" href="https://plus.google.com/113978637743265603454" oid="113978637743265603454" style="-webkit-transition: color 0.218s; color: #427fed; cursor: pointer; font-weight: bold; text-decoration: none; transition: color 0.218s;">Chris Hadfield</a></span><span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"> 's cover of </span><span class="proflinkWrapper" style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"><span class="proflinkPrefix" style="-webkit-transition: color 0.218s; color: #427fed; transition: color 0.218s;">+</span><a class="proflink" href="https://plus.google.com/114752695947439887823" oid="114752695947439887823" style="-webkit-transition: color 0.218s; color: #427fed; cursor: pointer; font-weight: bold; text-decoration: none; transition: color 0.218s;">David Bowie</a></span><span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"> 's Space Odddity. I've watched it no less than 6 or 7 times since it was first released. It really is perfect, insofar as transporting you there without actually being there. The conflict between sheer beauty of earthly backdrops with the desolate, sterile blackness of space. The human desire to reach and live in space, away from earth, in a parallel dimension unbound from gravity and other quotidian earth-bound forces. The conflicting feelings of enjoying the moment on the station while fully aware the clock is ticking and finally the bittersweet realization that time has come to re-join the human race.</span></blockquote>
<br />
Now, what really matters though, is Commander Hadfield's impact on public and political perception of space exploration. If his sharing his experience with millions on a daily basis persuaded the constituency and politicians that space exploration is a worthy expense, that it's not just for the multi-millionaire elite, or for the erudite, that tangible benefits can be drawn from the mere fact of being in space for extended periods of time, then Chris Hadfield's efforts will not be for naught. The U.S. space program is currently in a fairly poor shape, and I hope what Commander Hadfield has done is the right medicine needed to revivify it.Anonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com0tag:blogger.com,1999:blog-7586593970100216994.post-358244746331472672013-03-23T09:51:00.000-04:002013-03-23T09:51:32.023-04:00PyCon 2013: an exhaustive, painfully comprehensive, encyclopedic, unabridged review Just kidding. I'm going to make it short and sweet.<br />
<br />
PyCon was the best tech conference I've been to. The sense of community that permeated the conference is simply bar none. The emphasis on helping out/charity/education like no other tech conference out there. The sponsor-organized after-parties were a blast and by in large, the talks and tutorials were of great value. As a relatively newcomer to Python, the conference was simply a resounding success, specially when you consider the shoestring budget it runs on and that it is organized and run by small contingent of community volunteers. PyLadies, a women's pythonistas outreach organization, was in large part to thank for a rather sizable female attendance to the conference (about twenty percent). Overall, while it's entirely too early to think about Montreal next year, I'm hoping I'll be able to not only attend but also help the community and organizers in whatever extent I can.<br />
<br />
But, I don't want to bore you any further, so below are two links. One is to see the slideshows of the sessions, the other one is to watch the videos of the sessions. Enjoy.<br />
<br />
Slides: <a href="https://speakerdeck.com/pyconslides/">https://speakerdeck.com/pyconslides/</a><br />
Videos: <a href="http://pyvideo.org/category/33/pycon-us-2013">http://pyvideo.org/category/33/pycon-us-2013</a><br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com0tag:blogger.com,1999:blog-7586593970100216994.post-38152575302068835482013-03-10T23:53:00.005-04:002013-03-10T23:53:40.664-04:00A Budget-Conscious Approach for the Photo EnthusiastI've been in love with photography since I have use of reason (or as far back and my memory goes). There have been times that I've been obsessed with it -- I remember shooting over two hundred shots of waves crashing on the Malecon in north Havana when I got my first SLR over 20 years ago (for a humanitarian trip) and loving each of those that came properly focused and exposed -- my mother, however, was not entirely happy I spent so much film and money on crashing waves instead of other, less mundane things. I remember, too, being camera-less for a long time in my college years and how frustrating that was. However, what has always remained true is that my wallet/pockets seem to always lag far behind my photography <i>needs. </i>I've been using a decent Tamron 28-75/2.8 for at least five years, probably longer. It gets the job done and has its moments of heroism when it simply takes the shot better than what I had envisioned. However, I've been wanting to get more than just "getting the job done". I wanted versatility, I wanted range, I wanted sharpness, I wanted ridiculous bokeh, I wanted natural softness and so forth. But, a brief look on Amazon or any other photography establishment will discourage most people with a tight budget, including yours truly. A decent lens runs at least $700, hundreds more if it's an premium line (i.e. "L" glass from Canon). So, I never really had the pockets or guts to splurge on my beloved hobby.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://pcdn.500px.net/26690105/89ee8b53277c7d37d8913e83ee65f3181093858f/4.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="http://pcdn.500px.net/26690105/89ee8b53277c7d37d8913e83ee65f3181093858f/4.jpg" height="425" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Yashica 135/28</td></tr>
</tbody></table>
<div style="text-align: center;">
<br /></div>
Then a few weeks ago, a co-worker and fellow photo enthusiast showed me some amazing results with a lens he had gotten off eBay for relatively very little money. I was, of course, very much apprehensive of buying anything off eBay having been burned a few times in the past -- let alone something as delicate as precision optics. But, if I was to get my photography needs met, I was going to have to take some risks. After researching what were the easiest lenses to adapt to the Canon EOS system, I settled for the Contax/Yashica. I bought the adapter for a little over $10 from Amazon. I then went on eBay and looked around for lenses for the C/Y mount. To my surprise there were literally hundreds of listings ranging from very inexpensive to quite pricey (for select Carl Zeiss lenses). A bit wary still I looked around until I found a good prime lens for under $50 (shipping included). I figured even if it was complete junk, $50 loss wouldn't be the end of the world. I narrowed it down to three or four candidates. They all met my price criteria and they were the same model (i.e. Yashica 135/2.8), so I went with the seller that had the best recent reviews/ratings regarding photo gear. A few days later, the lens arrived. I did an initial eyeball inspection looking for defects in the lens or lens assembly. All checked out. That day after work, took the lens for a spin. I took a few shots and came back to pixel peep on Lightroom. I was floored. The subject was tack sharp, the depth of field amazing. Alright, I officially contracted the photo bug. I went immediately on eBay this time with loftier goals: I wanted at least one Carl Zeiss glass in my repertoire. I looked and looked until I found the lens I wanted (50/1.7 Planar T*). I researched the closing price of similar lenses and I set my bid in the vicinity. I won the auction and a few days later the glass arrived. It passed my eyeball inspection and then blew my mind while looking through some of the test shots.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://pcdn.500px.net/27950685/7f01b1d4ed89fd6544935cceaadbee87811af7a5/4.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="http://pcdn.500px.net/27950685/7f01b1d4ed89fd6544935cceaadbee87811af7a5/4.jpg" height="400" width="266" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Carl Zeiss 50/1.7</td></tr>
</tbody></table>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
So, then the question became more of "what lenses do I want?" instead of "what lenses can I afford?" With the 135 prime, the 50 prime, I wanted a wider one. So, went ahead purchased a Yashica 28/2.8 and upon arrival and testing I was not disappointed. All mechanical systems worked flawlessly and the optical performance exactly as expected. After taking dozens, if not hundreds, of test pictures of different subjects, I was convinced that my investment had yielded positive ROI (in terms of satisfaction, not monetization, of course). </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
All set and done, I spent less than half (!) of what the cheapest "L" glass cost (which I believe it's the non-IS 70-200/4) and have three amazing lenses to play with. I feel photographically re-awakened and with the need to take pictures and visually express myself. I, of course, while highly encourage fellow photographers on tight-budgets to leverage eBay, it goes without saying to be very careful and selective when purchasing second- or third-hand glass. So here are my rules of thumb:</div>
<div style="text-align: left;">
</div>
<ul>
<li>Always, always look for not just good ratings, but <i style="font-weight: bold;">relevant </i>seller ratings. I don't care a seller has a million positive feedback selling stickers, I want to see past and recent photo gear ratings. </li>
<li>Look for the item description for condition and be fast and loose to ask questions to the seller.</li>
<li>Skip the canned item specs. They are of little use. Pay attention to the description as explained above.</li>
<li>Be in the lookout for copy-and-paste descriptions -- there were many. And, again, if ever in doubt ask away. Most legit sellers are all too happy to answer your queries in a timely fashion.</li>
<li>In order to avoid annoying and potentially expensive bidding wars, set your maximum bid to the maximum you're willing to pay. eBay's new automated bid system will always give you the lowest price up to the maximum you set.</li>
</ul>
<div>
Below is the whole set of test shots that I took with the above lenses. I have many more, but I think most people appreciate better inanimate subjects :)</div>
<div>
<br /></div>
<div>
<a href="http://500px.com/LosChachis/sets/lensdemos" target="_blank">http://500px.com/LosChachis/sets/lensdemos</a></div>
Anonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com0tag:blogger.com,1999:blog-7586593970100216994.post-90525438282896837272013-03-08T11:07:00.001-05:002013-03-08T17:21:44.031-05:00Pebble: not quite a "smart watch" ... yet?Sometime in the spring of 2012, myself along thousands of fellow tech enthusiasts, committed to back Pebble in their Kickstarter funding campaign. After months of delays, vitriol and nonsense in late January Pebble announced it would soon begin shipping. Earlier this week, nearly 6 months after their original estimated shipping date, my Pebble finally arrived.<br />
<br />
The watch looks pretty slick and has a "nerdy" chic design to it. The e-paper screen is pretty easy on the eyes and the initial setup/pairing as well as adding new watch faces with my iPhone was a breeze, so kudos to them in that regard. But, regretfully, that's all it does -- at the moment.<br />
<br />
The watch lacks many crucial features that would make it more than a mere tech novelty. For instance, the watch is just begging for a touch screen. The whole 3-button navigation interface feels almost anachronic. Pebble also lacks comprehensive notification settings -- it currently only supports phone Caller ID and incoming SMS. The watch lacks and badly needs a recent history of notifications: how good are notifications if you can only see the latest one?<br />
<br />
An important aspect that, in my opinion, Pebble either forgot or just didn't have the time to implement is the one-directional nature of Pebble. Pebble's use case is not very strong at the moment because of it. If Pebble was capable of, say, sending canned or predefined replies to text messages or if it was capable of sending a quick reply to a rejected phone call, it would have a place in the wrist of not only tech aficionados but also business types and the public in general.<br />
<br />
As of right now, however, Pebble is merely an accessory; a luxury, if you will. There really isn't any feature in it that, at the moment, makes it a requisite for daily life. For instance, my smart phone, my car, my computer and so on are things that I need in order to get things done. Pebble is nowhere close to that level of "neededness" (sic) and until it does it will remain nothing more than a glorified wrist watch.Anonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com0tag:blogger.com,1999:blog-7586593970100216994.post-78933497551810764612013-01-20T14:28:00.000-05:002013-01-20T14:28:52.763-05:00iPhone 5: a (somewhat) dispassionate reviewIn a <a href="http://ruben.orduz.info/2013/01/sending-my-money-to-cupertino-instead.html" target="_blank">previous</a> post I briefly explained why I decided to give iOS and iPhone 5 a chance after years of using Android devices. It has been a bit more than a week since I got my iPhone 5 and I've used it extensively since then. I have to say that I am fairly impressed with it so far.<br />
<br />
<u>Hardware Case and Design:</u> it's very light (and I mean about half as heavy as Galaxy Nexus) and feels super well built and durable. It feels right in my hands. The buttons are well placed and tucked away. Definitely an outstanding example of form and function.<br />
<br />
<u>Screen:</u> in one word, gorgeous. Both, when it's on and when it's off. When it's off, it melds beautifully with the case design (at least with the Black version), un-intrusive and well placed. When it's on, it's even more impressive: tack-sharp, well balanced colors, contrast and saturation. Under direct sun light, it's surprisingly useful, you can still read text well and see web sites and apps (mostly) alright.<br />
<br />
<u>Battery Life:</u> of all the features, I have to admit the one that has impressed me the most has been the battery life. After heavy 3G/4G usage, WiFi, camera both still and video, a few games, mobile banking plus my usual mobile activities, I charge my iPhone 5, literally, once every two days. That is approximately three times better than my Thunderbolt and about two times better than the Galaxy Nexus under similar usage.<br />
<br />
<u>Camera:</u> as a photography enthusiast, the camera on my phone is a very important feature. I was thoroughly disappointed on all the cameras of all the Android phones I owned. The shutter lag made it almost impossible to shoot anything that moved, the auto-focus was always way off, shutter speed was entirely too slow and exposure would be easily thrown off (and no way to override any of these settings). The iPhone 5's camera, on the other hand, has been great. Near zero-shutter lag, auto-focus works well, not excellent, but good enough for most of my usage, shutter speed is much better (although it could be improved) and auto exposure has proven to work about as good as a point-and-shoot camera. So, overall, I'm pleased with the iPhone 5's camera -- but I will not be completely satisfied until (some day) I can manually control every aspect of the on-board camera.<br />
<br />
<u>iOS:</u> is a very opinionated OS, but from my experience thus far, I'd say it has a reasonable and well thought out opinion. A beautiful, simple and intuitive UI, predictable gesture and navigation patterns, what you need right in front of you, anything you don't is stashed away. It feels very snappy and seamlessly integrated with most apps. One thing iOS lacks that Android OS is excellent at, in my opinion, is sharing assets among apps. For instance, in the Camera Roll I cannot select a picture or video to be opened with another app, be it Instagram or Pixlr and so forth. Instead, I have to go directly to the app I want to use and open the asset from within it. It's a minor inconvenience, but it's one feature I sure miss from the Android world.<br />
<br />
A valid argument could be (and has been) made about iOS's lack of user customization and why Android OS is better in this regard; but, I'm not big on UI customization neither on my PCs nor on my phones, so the lack of UI customization is not all that important to me. Although I can see how it will be a hinderance for those who do.<br />
<br />
Since I don't use and didn't use Apple Maps, I cannot comment on that fiasco, but I imagine that would have been annoying and disappointing to those who rely on Apple Maps. But Google Maps works fantastic, and, again, its look-and-feel is much better than Google Maps for Android (ICS and Jelly Bean).<br />
<br />
I hope this review will be useful to those researching before making their minds one way or the other. Comments/feedback from zealots on either side of the Apple vs. Google (imaginary war) will be deleted.<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com0tag:blogger.com,1999:blog-7586593970100216994.post-66095829092352338962013-01-11T16:30:00.000-05:002013-01-12T10:04:25.103-05:00Sending My Money To Cupertino (instead of Mountain View)Let me preface this post by saying that I've owned four different Android smart phones for the last four years. Beginning with the Eris, then to the Incredible, on to the Thunderbolt and a Galaxy Nexus as of late. And also, it's worth saying that in spite of my very recent jump to the iOS world, I still think AndroidOS has a great deal of potential and unparalleled access to its development tools.<br />
<br />
So, why did I send my hard-earned dollars to a corporation whose litigious "thermonuclear" war against all competitors I vehemently and fervently oppose?<br />
<br />
<ul>
<li>Because, in my opinion, they currently have the best <i>overall</i> smart phone. While it could be argued that late-version Android OS has a better feature set and some Android devices have superior hardware specs than iOS and iOS devices respectively, the end result of an Android device is much less than the sum of its parts.</li>
<li>Android's openness is actually too much of a good thing: while open source sounds great in theory, in practice it means that Google has very little control over the OS as it cascades downstream (the exception being Nexus devices). This means that, at the very least, the OS that finally makes it to the device has been modified and/or tweaked by both the hardware vendor and the carrier. This actually is a bigger deal than you would think. Often either the hardware vendor or the carrier add unremovable UI layers that are not aesthetically pleasing, intrusive, and resource hogs. Then, on top of that, the carrier usually loads your phone with an Imperial shittonne (pardon my French) of unremovable bloatware. So, you get a device and have to choose to either root it (and lose the warranty) or spend quite a bit of time deactivating each of the offending bloatware apps and then having to live with an inefficient and possibly unsightly UI layer.</li>
<li>Rooting/Modding: if you <i>must</i> root and mod your phone just to get decent performance and rid your phone off unneeded vendor UI layers, you are doing it wrong. People often see rooting as a solution, I see rooting and modding as solving one and opening two different problems. For one, you'll lose your device's warranty and secondly, you are now at the mercy of a fickle and capricious "community" that at least in my experience has shown itself to be rather ineffective and hostile. </li>
<li>Uniformity and predictability: although Google has made great strides in and is pushing hard for UI design and usability best practices as of late, there is no enforcement at the app submission level. This means that adherence to their guiding principles is completely voluntary and the end result is UI chaos. Developers each do things their way and often leave outdated apps in the market with no consideration for UI looks and usability. While many developers have complained about Apple's draconian manual app approval process (including myself), it results in a more cohesive, predictable user experience. I was a big believer of Google's "market self-policing"philosophy, but this has proven to be ineffective at encouraging developers to comply with Google's design guidelines and this very likely will remain to be the case.</li>
<li>Even Google's own apps look and work better in the iOS platform. Case in point, the gmail app, the Maps app, G+ app all look and work much better on iOS than on Android! No, seriously, some of them are not even a judgement call, they simply are heads and shoulders above their Android counterparts. Not really sure why Google doesn't use that same quality and UX emphasis on the Android versions. And just like that, at least in my experience so far, many other apps that exist in both platforms, they tend to have a much user experience in the iOS world. </li>
</ul>
<div>
There are other smaller factors, but the points above are the main drivers of my decision. For instance, Verizon thought it would be a wonderful idea to brand every single Android device with their horrible and gaudy red-black "DROID" looks and sounds. Although that's a Verizon-specific complaint, it highlights the root problem (which was mentioned above): Google has little control over the end product. And I'm guessing it has been the same issues for many people who have switched away from the Android platform. Perhaps in a few years' time Google will figure out a way to keep vendors' and carriers' hands off Android and they'll find an automated way to vet app submissions for UI/UX compliance. If and when that happens, there's a good chance I'll jump back into the Android bandwagon.</div>
Anonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com0tag:blogger.com,1999:blog-7586593970100216994.post-62750765893051849912012-11-08T00:19:00.003-05:002012-11-08T00:21:08.938-05:00A Humble Open Letter to the Republican PartyLast night's electoral vote trounce has surely left you thinking, soul-searching and (of course) trying to find an escape goat. But don't look at Romney's campaign for an answer or someone to blame.<br />
<br />
1. If you really want to know where the problem lies you need to look back at least four years back. Think how you collectively and myopically chose to fully embrace the "Tea Party" movement and all of its ilk for short-term congressional wins, disregarding the fact that such choice was sure to comeback and haunt you sooner or later. Not every conservative aligns him or herself with the "principles" and message of the Tea-Partiers, and as a matter of fact, some feel repulsed by them.<br />
<br />
2. Your talking-heads and leaders have sent the party into a negative downward spiral. Yes, your dear Rush-baugh, Hannity, Boortz, and so forth have actually done more harm than good. Their venomous vitriol and rhetoric has accomplished nothing other than to push off your ship all center-right and independent-minded voters. I distinctly remember a Rush Limbaugh speech nearly four years ago in front of the who's-who of the Republican party spewing negative and abrasive rhetoric against the Democratic party. He being the proverbial 800 lbs. gorilla, he persuaded your far-right base to think of the Democratic party as "the enemy", to think that "we're not their friends, we're at war with them, and I hope Obama is a failure" (paraphrasing, of course. Text of said speech can be found <a href="http://www.foxnews.com/politics/2009/03/01/transcript-rush-limbaughs-address-cpac/" target="_blank">here</a>). How can you expect people to vote for your candidate when your have these "talk masters" name-calling, cussing, insulting and verbally demeaning any voter who isn't your constituent on the TV and radio on a daily basis? How can you expect to reach to the swing voters with such caustic and divisive tone?<br />
<br />
3. For something more recent, you surely are aware that part of your constituents are Libertarian-leaning. You, as a party, spat and kicked dirt on their faces this election. You did everything you could to get Rep. Ron Paul off the map. You cast him out. You left him out. His integrity, impecable voting record, uncompromised principles and intelligence were apparently a threat too big to the Republican establishment. And then you are surprised when his supporters voted for someone else instead.<br />
<br />
As <a href="https://plus.google.com/u/0/117947028472042123536/posts/heq1dK3t81o" target="_blank">a colleague</a> mentioned today, your party is at a crux and, in my opinion, the possibilities range from healing the wounds with all constituents, bring the negative tone and venom of your talking heads down, expel the extreme and fringe elements, bridge and reach to the independents, the center-right and the youth factions to keep on the downward spiral you're in and risk becoming irrelevant in a few years time.<br />
<br />Anonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com0tag:blogger.com,1999:blog-7586593970100216994.post-25758499458811243052012-10-28T21:58:00.001-04:002012-10-28T21:58:57.063-04:00Never Underestimate the Learning Abilities of a 7-year-oldFirst of all, I'm not a teacher, cognitive scientist, or pedagogy specialist, so please don't take my experience described below to be anything more than a brief anecdotal narrative.<br />
<br />
So, as project for the day, I decided I would teach my second grader, 7-year-old son about functions (the math kind). He knows all the addition, subtraction and multiplication tables by heart and he knows how to solve math word problems and solve for unknowns and other "advanced" grade-school level math judo (for instance, he knows how to solve basic algebraic equations, he just doesn't know they are called that or any of the lingo involved). Even though he has the needed "machinery" to do advanced math (for his age and level), I forewarned him that he might not understand the topic and reassured him it was perfectly OK if didn't get a good grasp by the end of the class. Further, I emphasized that he was not going to be needing any of this knowledge for a few years, but I just wanted him to be acquainted with the basic concepts surrounding functions.<br />
<br />
So, the first thing we did was define what functions are (in a language he could understand). I diluted the definition to something to the effect of:<i> a function is like a machine that you feed it a number, it does stuff with that number and the gives back another number</i>. He looked a bit puzzled, so I went ahead and wrote down a concrete example:<b> f(x) := x, </b>then together we walked through a table like this:<br />
<br />
<pre>--------------
x | f(x)
--------------
0 0
1 1
2 2
3 3
4 4
</pre>
<br />
at this point I could tell he was trying to make sense of this stuff. So, instead of explaining more material, I gave yet another concrete example <b>f(x) := x + 1, </b>just as we had done with the previous example, we walked through filling a table with inputs and outputs. He still looked a bit confused, so we did yet another example, this time using multiplication <b>f(x) := 2 * x, </b>as we walked through the input and output table, I saw the light bulb lighting up on top of his head, so to speak. Shortly thereafter, he interrupted me as I was slowly going through the table and said something to the effect <i>so the 'x' gets switched out by whatever number you have 'f' thing. </i>I told him that it was very clever of him to see the pattern, but there was more to it than that (you see, positive re-enforcement it's a bit of a balancing act with him because if I would've told him that he was exactly right, he would've left thinking he was a math functions expert). So, I was pleased that he grasped the concept that here we have this math construct/machinery that you feed it a number, does something with that number<i> </i>and then spits out the result. I was also a bit surprised that he saw the pattern that the input was replacing the mysterious variable 'x' in a mere three examples. So, I was confident that I could introduce more material and not leave him in the dust. I taught him the concept of x and y- axis, again on terms he could understand. So, I drew a 10-line by 10-line chart in a piece of graph paper. Together we labeled the axes and the origin (which I had just explained) and added the line ticks. Then I had him read me the inputs and outputs for the <b>f(x) := x + 1 </b>from the table we had previously created. I plotted point by point and then had him draw the lines from dot to dot. I could see by his smile that he was understanding the material thus far. So with basic concepts, definitions, examples and charts under our belt I decided to see if it was true that he understood the material (as opposed to my biased opinion). I wrote a short quiz consisting of three functions <b>f(x) := 5 + x, f(x) := x * x and f(x) := x - 1 </b> and he was supposed to fill the tables from zero to five for each of them. A little over fifteen minutes later, he told me he was done. He got all the answers correct with the exception of two. The first one he wrote f (0) = 0 even though it should've been 5 and the other he left blank f(0) for the last function even though it should've been -1. However, my wife (and his full-time teacher) later told me they haven't done negative numbers yet. Of course, I was (secretly) super excited that he had just done so well with a brand-new topic and one that most of his peers won't see for a few years. At the same time, I was amazed at his learning abilities and given that he is not a genius or gifted (to be objective), this probably is a potential that many 7-year-olds have but due to the nature of mass education goes unused, or perhaps it just means I'm crazy for trying to tech things to my kid that are out of his league.<br />
<br />
Either way, before the Math Gestapo rears its ugly head, I will say that I'm well aware that there are many other facets and nuance to functions that were purposely left out of this lesson that I will try to introduce in time.Anonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com0tag:blogger.com,1999:blog-7586593970100216994.post-90349841310592667282012-10-20T12:13:00.000-04:002012-10-20T12:13:26.945-04:00Strange Loop 2012: Day 2Day 2 of Strange Loop 2012, in my opinion, was the best day of the conference proper: lots of good choices on each time slot and promising keynotes. Even though I attended great sessions in all time slots but two (due to health reasons), I'm going to highlight only three of those since they had the most impact or resonated with me the most.<br />
<br />
To kick things off, the morning keynote "Computing Like The Brain" was a tour de force of state-of-the-art Computational Neuroscience. The speaker, although limited in time, tried his best to give the audience a survey of basic Neuroscience and from these concepts he built models, constructs and abstractions that can be (and have been) implemented with computers. Overall a great presentation with tons of new concepts to mull about.<br />
<br />
"How Plato and Aristotle invented modern programming" was a session I attended in the lunch-time slot. This session resonated with me at many levels. For one, the speaker was well-informed and well-versed in the fields of Philosophy and Computer Science. He used that knowledge to beautifully craft his thesis: that the notions of Potentiality and Realization, from abstract thought to palpable implementation are the foundations of a programming language or even the computer itself. He was very attentive to the audience and always made sure we were following his argument and would stop and backtrack as needed. I got the sense the audience was left both marveled and very interested in the subject matter.<br />
<br />
To close the day and conference, a keynote by EcmaScript's inventor and designer Brendan Eich. Titled "The State of JavaScript", the presentation started as a Mea Culpa of sorts -- taking blame for some of ES/JS early and current problems. After that, he gave a brief history of the language and all the politics surrounding its development. About half-way through the talk, he delved into the good stuff: what's coming down the pipeline for ES specification version 6 (ES6). If you like or are curious about Python, ES6 will be right up your alley, so to speak, since it's heavily influenced by Python. Introduction of List, Sets, List and Set comprehensions, lambda expressions and a host of other language features that will be warmly welcome by the programmer community at large. The presentation definitely spurred the interest of many in the audience to keep an eye on the implementation of the spec.<br />
<br />
Then, to continue with the excitement, after a quick farewell from the organizers, we were told the area was under Tornado Warning and to take cover if things got ugly (at which time someone in the audience cheered). But, of course, the warning was ignored by most of the audience who left the opera hall with copious amounts of rain, wind and lightning overhead. :)<br />
<br />Anonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com0tag:blogger.com,1999:blog-7586593970100216994.post-64891184222230673822012-10-16T09:28:00.001-04:002012-10-16T09:55:36.998-04:00All Hail Explicit Garbage Collection Calls (and the logcat)!<span style="font-family: Trebuchet MS, sans-serif;">For the last few weeks we've been working on a mobile app that requires handling of large image files. We started developing it as a multi-platform app via PhoneGap/Cordova; however, the Android version just wouldn't work when it came to loading large images from the "gallery" and then turning them into a base-64 string for posting to a server. Looking through the logcat</span><br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://img717.imageshack.us/img717/39/logcat.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="161" src="http://img717.imageshack.us/img717/39/logcat.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">source: rootzwiki forum</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div style="text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;">we realized that there was a </span><span style="font-family: Courier New, Courier, monospace;">FATAL OutOfMemoryError</span> <span style="font-family: Trebuchet MS, sans-serif;">every time we tried to load large pictures into the app. After some digging around the Interwebz, StackOverflow and the </span><a href="http://simonmacdonald.blogspot.com/2012/07/change-to-camera-code-in-phonegap-190.html" style="font-family: 'Trebuchet MS', sans-serif;" target="_blank">blog</a><span style="font-family: Trebuchet MS, sans-serif;"> of Simon Mac Donald (one of PhoneGap's main contributors) we surmised that this problem could only be addressed at the native level. So, we started building a small proof-of-concept Android app to see how we could address this issue. After couple days of fiddling with different ideas, we were having the same problem caused by Android's inefficient Bitmap handling that made the app crash and burn when loading and encoding a large (8MP) image. Facing having to get down and dirty with multi-threading or AsyncTask (so we could offload the memory intensive parts), in a moment of lucidity (actually: desperation), I suggested my co-worker we try issuing explicit garbage collection calls. So, after adding a dash of </span><span style="font-family: Courier New, Courier, monospace;">System.gc()</span><span style="font-family: Trebuchet MS, sans-serif;">to the critical parts of our code and loading it up into the device (because the damn emulator is too damn slow, but that's a different rant) I was expecting it to have very little effect, if any, but it was worth the shot. But, to our bafflement, not only did it work, but also it actually fixed the OutOfMemoryError issues we were having completely. </span></div>
<div style="text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;"><br />
</span></div>
<div style="text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;">So, the main take-aways are: Android has memory-inefficient Bitmap handling. Possible memory inefficiency in the Base64 class. Explicit garbage collection calls are the bee's knees!</span></div>
<div style="text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;"><br />
</span></div>
<div style="text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;">P.S.: After the fact I looked around to see if using explicit garbage collection calls was a no-no, but on the contrary, it seems it is widely used and necessary for memory-intensive activities. Also, as per documentation, explicit garbage collection calls in the Dalvik VM don't force garbage collection; they just "nudge" the GC to look your app's way for possible memory cleanup.</span></div>
Anonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com0tag:blogger.com,1999:blog-7586593970100216994.post-28415510993589927872012-10-05T19:32:00.000-04:002012-10-05T19:32:16.501-04:00Strange Loop 2012: Day 1So, I'm going to change the pace of these Strange Loop blog posts a bit. I'm going to make them more of a narrative rather than technical reviews.<br />
<br />
After a rather unremarkable Continental breakfast, we were off to the main venue, the beautiful Peabody Opera House for the first "official" day of sessions at Strange Loop.<br />
<br />
To kick things off a keynote by Michael Stonebraker (of Ingres and Postgres fame) titled, "In-Memory Databases: the future is now". The talk was very illuminating in some respects with some interesting points, findings and solutions to the problem of large data transaction processing. However, things derailed a bit when the speaker made some rather contentious and controversial comments about NoSQL databases, which in the eyes of many attendees were either ill-informed or misguided. In essence, Mr. Stonebraker claimed that databases without ACID support aren't worth your while and data replication schemes of NoSQL databases all they do is "produce garbage".<br />
<br />
After they keynote, I decided to attend a session titled, "Monad Examples for Normal People [...]" which was rather disappointing. For one, the speaker flew through his presentation: he was done in about twenty-two minutes even though sessions are supposed to be fifty minutes. Secondly, the talk was highly technical and I would venture to say that less than five percent of all attendees actually understood the concepts being presented. It was not at all taught or designed for "normal people", it was designed around "normal people" who have a deep understanding of Monads.<br />
<br />
The second session I attended was named, "Renormalize -- the sequel to SQL". It was a fairly interesting presentation with the speaker proposing what amounts to cherry picking features from both SQL and NoSQL databases. The speaker was also promoting the Akiban database server that implements the concepts he spoke about during the presentation.<br />
<br />
The next session I went to was called, "As we may do -- Augmented Reality and Computer Vision" which was in the lukewarm side of things. The presenter, Neil Milsted, kept murmuring and speaking so softly that attendees had to ask him to speak louder a few times. He had a neat demo of a Rubik's cube solver using computer vision, but regretfully there wasn't enough light in the room for the computer to see the Rubik's cube, but after a few minutes the speaker managed to lit up the face of the cube and he was able to show off the solver to the audience.<br />
<br />
The next session, in my opinion, was the highlight of the day. "Relational Programming with miniKanren" simply blew my mind. miniKanren is not just a language, it's a meta-language that among other features generates programs that solve a given problem assuming such program exists! So, for instance the classic 5 + 1 = X, it will generate a program that will return 6. But what if you have X + 2 = 4? It will generate a program that will produce the value 2 and so forth. Mind you, they were not coding to solve the equation (that would be entirely too pedestrian), they were coding a program to write other programs that satisfy the relation or equation.<br />
<br />
Next up, was David Nolen's talk about ClojureScript which as you might surmise, it's an altJS language based on Clojure. David's presentation skills together with his deep understanding of Clojure and JavaScript made this session one of the best of the day, at least in my opinion.<br />
<br />
Following that, I decided to attend a session titled, "Type vs. Tests: an Epic Battle?" and left about ten minutes after it started.<br />
<br />
After waiting around and hawking some t-shirts from the few vendors present, I went to a presentation by Intel's Stephan Herhut about River Trail, a JavaScript library and firefox extension for enabling parallel processing in JS. It was actually very interesting to see the concepts and theory behind this library as well as seeing it in action through some impressive demos. For instance he showed a browser-based scene rendering with normal JS and it was crawling at a whooping three or four FPS. Then he showed the same scen rendering written on River Trail and the frame rate went up to nearly twenty FPS. He then showed other instances where the frame rate was many-fold increased from plain JS to River Trail. Good presentation overall and very interesting product.<br />
<br />
To close the first "official" day of sessions, a keynote by Google's Lars Bak on the history, present and future of virtual machines and more specifically virtual machines that live in the browser. A good mix of technical details and anecdotes, was a good way to close the day in a positive note.<br />
<br />
As if a long day full of sessions wasn't enough, the organizers put together what they call "unsessions" which are sessions led by either speakers, volunteers, locals or attendees about a wide variety of topics and in a more informal format. All the unsessions were packed to brim! (that should tell a lot about the highly motivated crowd that attends Strange Loop).<br />
<br />
Of all the options at hand, I attended a basic-level unsession about MongoDB. It was actually pretty fun with attendees and presenters sharing "war stories", lessons learned and tips dealing with Mongo.<br />
<br />
The last unsession I went to was "Mentoring Software Apprentices", which was fantastic. It was led by 8th Light's Doug Bradbury and was about how the best way to attract and keep talent in your organization is to "grow them". Techniques and suggestions as to how to create a solid relationship with the candidates and arm them with the tools to flourish in the organization. Lots of good information was shared and exchanged among the speaker and attendees.<br />
<br />
And as the cliché says, that's a wrap!Anonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com0tag:blogger.com,1999:blog-7586593970100216994.post-27472494451131758662012-10-02T20:12:00.000-04:002012-10-02T20:30:47.427-04:00Strange Loop 2012: Emerging Languages CampBeing this my first time at Strange Loop, I wasn't sure what to expect of the "pre-conference" offerings. I had the option of attending hand-picked workshops or a day-long event called "Emerging Languages Camp." Having never been to either, I decided to register for the ELC, and in retrospective, that was a good decision. Schedule for ELC can be found here: <a href="https://thestrangeloop.com/preconf-page/preconf-schedule" target="_blank">https://thestrangeloop.com/preconf-page/preconf-schedule</a><br />
<br />
The first thing I noticed is that the "Emerging" part of the name is not a marketing gimmick at all, it actually represents the true nature of the camp. Most languages presented there are in the early stages of development and a few are in the conceptual stage seeking fresh sets of eyes and ideas for further development.<br />
<br />
The camp has a fast-paced format with each presenter getting a maximum of thirty minutes, which means that presenters who lack the cadence, presentation skills or that veer off into platitudes wound up in bad shape in so far as making their case is concerned.<br />
<br />
The target niches for the languages presented is wide and vast so obviously many of them are outside my area of expertise or interest. Of those who I found interesting, the following are, in my opinion, a few notable ones that are worth keeping your eye on:<br />
<br />
<b>Elm:</b> a very interesting and nifty language (that transpiles to JS). Definitely one of the languages with clearest road map. Its home page can be found here: <a href="http://elm-lang.org/" target="_blank">http://elm-lang.org</a><br />
<br />
<b>Shen:</b> based on the popular Clojure, but with stronger type system, consistent lambda calculus support and even a fully functional embedded version of Prolog. More detailed info can be found at: <a href="http://www.shenlanguage.org/" target="_blank">http://www.shenlanguage.org/</a><br />
<br />
<b>Roy:</b> is one of the increasing number of languages (or dialects, if you prefer) transpiling to JS. However, Roy tries to augment and ameliorate some of the issues that people most often complain about JS in regards to lack of types and truthy syntax. <a href="http://roylang.org/" target="_blank">http://roylang.org</a><br />
<br />
<b>Julia:</b> if you've ever used/endured writing numerical analysis code in Matlab, Mathematica or any other number crunching languages, Julia will be a welcome sight. Optimized for numerical analysis and distributed execution, the language shows a lot of promise. For more details, check out their page <a href="http://julialang.org/" target="_blank">http://julialang.org/</a><br />
<br />
<b>Rust:</b> concurrency- and performance-optimized language with a syntax similar to that of C yet very different to C under the hood. For tutorials and docs, see <a href="http://rust-lang.org/" target="_blank">http://rust-lang.org</a><br />
<br />
Again, I'd like to emphasize that the above weren't the only interesting languages of the day. Far from it, there were many cool and intriguing languages that were showcased, but the ones above were "up my alley", so to speak.Anonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com0tag:blogger.com,1999:blog-7586593970100216994.post-69483978875197437852012-09-26T12:55:00.002-04:002012-09-26T12:55:46.235-04:00Strange Loop 2012: not your average "developers" conferenceBefore I wrote an extended review/retrospective of <a href="http://thestrangeloop.com/" target="_blank">Strange Loop 2012</a> I wanted to write a quick note as to what Strange Loop is all about and what it isn't. <div>
<br /></div>
<div>
<u>What Strange Loop is</u>:</div>
<div>
<br /></div>
<div>
<ul>
<li>Strange Loop <b><u>is</u></b> for people interested in Computer Science, Philosophy and other related inter-disciplinary sciences (Computational Neuroscience, Computational Linguistics, etc). </li>
<li>Strange Loop <b><u>is</u></b> about community and collaboration, a convergence point for programming language authors, collaborators, critics and so forth.</li>
</ul>
</div>
<div>
<br /></div>
<div>
<u>What Strange Loop isn't</u>:</div>
<div>
<br /></div>
<div>
<ul>
<li>Strange Loop <b><u>is not</u></b> a conference targeting marketing, project or product managers (or mangers at all, for that matter). If you are one of these, you will find yourself bored rather quickly, specially if your Computer Science knowledge is superficial or not up to snuff.</li>
<li>Strange Loop <u style="font-weight: bold;">is not</u> a conference where companies and corporations come to market, hawk or show off their wares.<b> </b>In fact, the conference organizers managed to have their corporate sponsors in the background and I think most attendees appreciated that very much.</li>
<li>Strange Loop <b style="text-decoration: underline;">is not</b> a conference where you'll get to see "pro-tips" or the next great thing in web frameworks or whatever mobile hype you hear about these days. Again, if you are looking for that type of experience, you'll find yourself in the wrong conference amongst the wrong crowd.</li>
</ul>
<div>
Strange Loop is a great (amazing, even) conference but is definitely more on the academic side of things, if you are the type looking for the latest buzz on tech, this is not the conference for you. If you love learning about the art and science of writing programming languages, the philosophy behind them then there's no better conference out there for you, in my opinion.</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com0tag:blogger.com,1999:blog-7586593970100216994.post-73211043537177914142012-08-11T11:38:00.000-04:002012-08-25T10:45:22.130-04:00A Little South of Perfection: Idealism vs. Pragamatism<span id="internal-source-marker_0.09681961847569487" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">So,
I woke up this morning musing about idealism vs. pragmatism in the
field of software development -- but also applies elsewhere. Many of us
at some point or another have had ideas, concepts, visions for a
product, bug fix, enhancement and so forth. Whether due to nature or
nurture, we tend to strive for perfection, but that’s a lofty (and often
impossible) goal to attain and one that’s likely to discourage you
somewhere along the way.</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">How
many times have you started a project (be it software or any other
kind), for some time you keep chiseling away your idea and then sometime
later look at all the work needed to get from where you are at all the
way to “perfection” and feel somewhat or completely discouraged (and
possibly abandon the idea altogether)? I know I have, many times. So, is
the mantra of “aim for the stars” actually a detriment or a
self-defeating ideal? Well, I wouldn’t say that; not in and of itself.
Aiming for perfection is a good and noble source of motivation, but
shouldn’t be your main goal, in my opinion. So, you may ask, “what
should my goals be?” Well, without know the specifics,all I can
recommend is: a little south of perfection and a bit north of “good
enough”.</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">In
the software world perfection might come in the form of 100% test
coverage, 100% feature-completeness, 100% automated deployments,
properly styled every nook and cranny of your web app and so forth. But,
in doing so we face a rather formidable law of nature (that Economists
borrowed): the law of diminishing returns and increasing marginal cost.
So, how much is it going to cost you to have 95% test coverage vs 91%?
How much effort it will take to have your product to be 100%
tested/deployed automatically as opposed to having all but two steps
being manual steps? How much will it cost you to have your app 100%
UI/UX reviewed/designed as opposed to having, say, the 75% most used
parts of the UI UX reviewed/designed and the rest get “generic”
treatment? In my opinion, even without knowing the process you use or
the funding style the answer to all of the above is: too damn expensive.
Perfection is expensive, very expensive. </span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Don’t
mischaracterize what I’m positing here. I’m not making an argument for
mediocrity and sloppy software. I’m putting forth the argument that a
little better than “good enough” is the so-called sweet spot and that
perfection, in as good and tantalizing as it sounds, is actually not a
place you’d want to pay your journey to. If you want a more concrete
example of the message I’m trying to convey, consider Google, for
instance. Google strives for “really good”, not perfection. All their
services are great (and many of them are right out mind blowing), but
none of them is perfect. Their services may lack a few “featurettes”,
might not enjoy perfect UI, might do unexpected things, have little
bugs, etc. and yet they still are, by any measure, really good products.
For something smaller, consider turntable.fm. They’re far from
perfect: they lack some key features that should be there for a social
app, their phone and tablet apps have a somewhat clunky UI and yet
people keep using the service. Why? because the service/app provides a
lot of value and works great at its core while leaving the imperfections
for “later.”</span><br />
<br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Just
to reiterate, perfection is great as motivation, not as an end-goal.
And don’t forget to head a little south of perfection and a little north
of “good enough” if you really want to get things done.</span>Anonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com0tag:blogger.com,1999:blog-7586593970100216994.post-90772067934017975852012-08-04T19:55:00.003-04:002012-08-04T19:55:46.989-04:00I'm sure CAPTCHA die-hards would say ...... that is totally my fault for not having an appropriate keyboard <br /><div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-e33AN1PGkQs/UB1qvo3ZUpI/AAAAAAAAFMw/rcri7CCGHHI/s1600/captcha.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="189" src="http://2.bp.blogspot.com/-e33AN1PGkQs/UB1qvo3ZUpI/AAAAAAAAFMw/rcri7CCGHHI/s320/captcha.png" width="320" /></a></div>
<div style="text-align: center;">
<br /></div>Anonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com0tag:blogger.com,1999:blog-7586593970100216994.post-42984385021064810732012-07-21T12:45:00.000-04:002012-07-21T12:45:42.836-04:00Thinking Outside The Box: JS Frameworks and LibrariesIt seems that everywhere you look nowadays, in terms of ECMA/JavaScript libraries and frameworks (jQuery, ember, Angular, lawnchair, etc.), it's all about fancy, minimal, simple, terse, expressive, consistent, predictable, easy-to-learn, multi-platform bullshit. I say let's think outside the box. Let's build something awesome. Here are a few tenets of Project Bloatrzr:<br />
<br />
<ul>
<li><i>Inconsistently inconsistent</i>: sometimes we follow a pattern, sometimes we don't.</li>
<li><i>Optimized for IE6 @ 800x600</i>: let's obey and pay homage to the one and true web browser, at SVGA resolution, the one and true resolution.</li>
<li><i>Humongous</i>: in terms of both size and memory footprint. Memory is cheap and abundant, and so is bandwidth. No need to cram and prune superfluous code we may or may not need in the future.</li>
<li><i>Syntactic sugar clusterf**k</i>: part Perl, part Lisp, Part Objective-C and part MIPS assembly.</li>
<li><i>Inherently incompatible</i>: why should we cram our style so that it can "play well with others"? That's obsolete thinking right there. Let's do our own thing and tough luck for the user if their other libraries break. Also, why corner ourselves into a corner? Let's do this in a forwards and backwards incompatible approach as well.</li>
<li><i>Documentation</i>: what documentation?</li>
<li><i>Changelogs</i>: why take the fun and the sense of adventure of finding out what was changed? Developers like challenges, let's give them one.</li>
<li><i>Git repo</i>: Nope. In fact, no version control at all. We'll e-mail Zip'd source trees to each other and we'll do a "good faith" effort to include important code from anyone else that was CC'd.</li>
<li><i>Blatantly insecure</i>: why spend precious time "securing" our code? We all know a determined hacker can and will find a way to find an exploit. So, might as well leave a few holes in our code the industrious hacker can inject his or her code.</li>
</ul>
So, let's get this ball rolling, shall we?Anonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com0tag:blogger.com,1999:blog-7586593970100216994.post-90289938624824863772012-07-07T15:17:00.001-04:002012-07-07T15:17:05.226-04:00How-To: Setting Up Multiple Custom Domains for a GAE ApplicationGoogle's platform-as-a-service (PaaS), <a href="http://http;//appengine.google.com" target="_blank">Google App Engine,</a> can be a great solution for web applications that require massive scaling (or the potential thereof) and the scaling needing to be largely transparent for both developers and end-users. With its free usage tier, App Engine also serves as a great platform for proof-of-concepts and "live" testing grounds. It currently has a fairly robust list of services and support to accommodate most web application needs and they are on a fairly aggressive release schedule fixing and adding features on a regular basis.<br />
<br />
In spite of all the work they, App Engine, have put into making the development and deployment of web applications easy, they have somewhat forgotten about one of the most important aspects of the whole process: custom domain setup. Not to say they have completely neglected the issue, but they have delegated all domain setup to Google Apps. This coupling means that you can't setup a custom domain for your app, unless you have that domain somehow "registered" with Google Apps. This also makes the workflow to add a custom domain to your app rather cumbersome requiring having a Google Apps account, singing in, adding, verifying, etc. What if you wanted to assign more than one domain name to your app? Well, the only documentation I could find was for adding a custom domain to an app, but it doesn't really explain the process or the requirements. So, to solve this problem I pretty much tried every trick in the book (and documentation) to no avail. After trying some clever permutations of steps and work-arounds, I was able to set up two custom domains for the same app and only one Google Apps account. Be advised that this work-around won't solve the problem of custom SSL certificates for your domains, for more info in this topic subscribe to their Google Groups group (google-appengine) which is usually brimming with Q&A's regarding SSL for applications. Below are the steps necessary to add multiple custom domains to the same application.<br />
<br />
What you need:<br />
<ul>
<li>An active App Engine application </li>
<li>You must be an "owner" of the App Engine app.</li>
<li>A Google Apps account (even if it's for a different domain) and you must have a domain admin or super admin role.</li>
<li>Access to your domain's DNS settings.</li>
</ul>
Steps:<br />
Interestingly enough, the simplest way to add custom domains to an App Engine app is to not deal with App Engine at all. All the steps below are accomplished from within Google Apps (and your domain registrar), not App Engine.<br />
<br />
<ol>
<li>Log into your Google Apps control panel</li>
<li>Click on <b>Domain Settings</b> </li>
<li>Click on <b>Domain Names</b> sub tab</li>
<li>Click on <b>Add a domain or domain alias</b></li>
<li>(Assuming the Google Apps domain is not the one you want associated with your GAE app) select <b>Add a domain alias of [domain.name]</b></li>
<li>Enter the domain alias in the text input below it</li>
<li>Click on <b>Continue and verify domain ownership</b></li>
<li>After you verify ownership of the domain and the domain alias has been successfully added, click on <b>Settings</b> on the top navigation bar of the Google Apps control panel.</li>
<li>On the left-hand vertical bar, click on the GAE application you want to associate the domains to (usually they are labeled as: <<i>appname (App Engine)</i>>)</li>
<li>In the <b>Web address</b> section, click on <b>Add new URL </b></li>
<li>A text box and a dropdown menu will show up prefaced by a "http://" enter the subdomain (i.e. www or such). This implies you cannot setup naked (i.e. http://domain.name) domains for App Engine apps, at least not directly.</li>
<li>Finally select the domain name from the dropdown menu and click on <b>Add</b><b> </b></li>
<li>Setup your domain's CNAME records as instructed.</li>
</ol>
You can repeat this process to add as many custom domain names to your GAE application as you wish. Now, as said above, you cannot add naked domains to your GAE apps; however, there's a trick you can use to accomplish the same effect. The specific steps change from registrar to registrar and also bear in mind that some DNS services take anywhere from a few minutes to a few hours for changes to be applied, but in essence you'd want to:<br />
<ol>
<li>Point your www.domain.name DNS to the CNAME that Google Apps provided you</li>
<li>Set URL-Forwarding on the naked domain to forward requests to www.domain.name</li>
</ol>
Assuming everything went as expected, you should now be able to reach your App Engine app at both http://www.domain.name and http://domain.name.<br />
<br />
I'll close by saying that most of the steps and work-arounds above would not be necessary if App Engine had its own domain/dns management service and here's to hoping they'll add such service to App Engine soon.Anonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com0tag:blogger.com,1999:blog-7586593970100216994.post-55979959212235079142012-07-03T22:18:00.000-04:002012-07-03T22:18:00.432-04:00Google Nexus Q: A product in search of a use caseGoogle is one of those companies that will innovate for innovation's sake. Sometimes they release products with no apparent market or demand and many times such "experiments" are only stepping stones toward bigger plans that aren't immediately palpable. Such is the case, IMO, with the <a href="http://www.google.com/nexus/#/q" target="_blank">Nexus Q</a>. In spite of its sleek, modern and enigmatic design, in reality it's a device that lacks a clear use case. With no life of its own, the Q in its current form is playing the role of a middle man and a fairly useless at that.<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="360" src="http://www.youtube.com/embed/6nhpXrVSZnE?rel=0" width="640"></iframe><br />
<br />
Google decided to market it as a "social" media player. But I don't think it's a particular strong selling point. For one, there are several services out there that can help managing and hosting video/music parties and doesn't require people to have their content stored/hosted on Google services. Secondly, although this might improve later on, pairing and joining a Q party is not the most straight-forward process. And lastly, the device requires a big TV screen or stereo to be within reach of its output cables in order for the whole "social" aspect to work.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiomzZyL9LmJjxHjNg7fBzSjEePjZAUAhJzhW26anZbOIc3mTfsIPV8WzQsQyO2SQcSH45qTgSBEhfGAspqqyrKfcukAXF2WVE1lY1QxIIU9UpC1RUY8UhhIw3zT15FCMYZvto5-t0L5xa_/s1600/IMG_2218.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiomzZyL9LmJjxHjNg7fBzSjEePjZAUAhJzhW26anZbOIc3mTfsIPV8WzQsQyO2SQcSH45qTgSBEhfGAspqqyrKfcukAXF2WVE1lY1QxIIU9UpC1RUY8UhhIw3zT15FCMYZvto5-t0L5xa_/s400/IMG_2218.jpg" width="351" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<br />
Also, as said above, the device has no life of its own, doesn't store the content (which is understandable given the copyright mess it would create otherwise), and generally speaking feels like noting more than an expensive hi-tech conversation piece. A Roku, for instance, although somewhat similar in functionality to that of the Q, has earned their place in the TV stand by providing streaming from different providers, very easy to use and setup and has a life of its own in that it doesn't depend on other devices to function.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTRe6nc-O6xy9NxzAHanXaSePJnnTMCkLmn71IO8K8kZtGUlxbq7sTmbr2JjOhAdmDFlipVkaaXCZWtJjKeLkMKoQ_sGnMCxQGXkrkkI-Zjs0mjslH0DZhIa1tYm7fE1xaSR8vOImpq5Wb/s1600/IMG_2219.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTRe6nc-O6xy9NxzAHanXaSePJnnTMCkLmn71IO8K8kZtGUlxbq7sTmbr2JjOhAdmDFlipVkaaXCZWtJjKeLkMKoQ_sGnMCxQGXkrkkI-Zjs0mjslH0DZhIa1tYm7fE1xaSR8vOImpq5Wb/s400/IMG_2219.jpg" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
So, I'm wondering what Google's ulterior motive is with the Nexus Q. Perhaps they want to start with the small scope of "social media player" and later use the Q as the platform for a home media hub? Given that it has the same chipset as the Galaxy Nexus (sans the GSM/CDMA/GPS radios) it would not be far fetched to think the player's OS and firmaware can be upgraded to add more functionality although it its current design it is somewhat limited in terms what can connect <i>to</i> it (1 Micro USB, 1 HDMI and WiFi), so there's a limit as to what they can do. Otherwise, I'm not really sure what they could be envisioning long term with Nexus Q, if anything.</div>
<div style="text-align: center;">
<br /></div>Anonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com5tag:blogger.com,1999:blog-7586593970100216994.post-74303210910345376902012-07-01T13:49:00.000-04:002012-07-01T13:49:02.795-04:00Google Nexus 7: Android's first true market shakerBy now you've probably seen and read all the rave reviews, tear-downs, and all the media coverage surrounding Google's new offering in the tablet market: the <a href="http://www.google.com/nexus/#/7" target="_blank">Nexus 7</a>. As an attendee of Google I/O, this year I received one of these devices. I wasn't particularly excited about the device given my experience with the tablet they gave out last year, the Galaxy Tab 10.1 which seemed (and probably was) like a rushed product. The build quality was iffy, Android Honey Comb seemed like a stop-gap measure rather than a true well optimized operating system, soon thereafter a number of people started reporting hardware problems ranging from screen glitches to batteries not holding a charge and so forth. Then sometime late last summer, I bought a brand new Acer Iconia A500, which was OK for the most part, but still, in my opinion, it didn't seem like a worthy competitor against Apple's offerings. I also tried out Amazon's Kindle Fire which was OK, except it didn't really feel like an Android product. It seems like Amazon really went to great lengths to use the OS, but remove as many references to Google's services as possible (including, of course, Google Play).<div>
<br /></div>
<div>
So, I waited until my last day in San Francisco to take some time to Play with the Nexus 7 (partially, too, in case something was wrong with the device I could get direct help form the techs on-site). The first thing I noticed is the high-quality, sleek packaging which definitely shows the care Google put into this product. After taking all the protective plastic sleeves around the the device itself, I could tell this was not a rushed product, at all. It feels like a solid well-put-together hardware. It also looks stylish and "sexy". It only has two buttons, up/down volume combo and on/off switch. It has a 1/8'' jack output for headphones and a standard micro USB port (a big omission on last year's Galaxy Tab) for charging and connecting to other devices. The screen is perfect: sharp, excellent colors, great brightness and contrast; it might not be technically a "Retina" display, but it surely feels that way. While some people might prefer the 10.1'' format, I personally prefer the compact 7'' form factor which is more portable and can be comfortable held in one hand (which is specially helpful for long reading sessions). The OS, though, is what makes the real difference. Android Jelly Bean is, what I think, the best Android OS to date. They have taken notice of all the gripes throughout the years and have fixed those and then some. The UI feels just right: consistent, stylish, and "buttery". The Android team finally realized that as far as the end-user is concerned, the UI/UX <u><b>is</b></u> the product and all other technical merits being secondary or non-existent, and they have applied this mantra to Jelly Bean to the extreme: everything seems to be where you expect it to, visual semantics remain the same throughout every nook and cranny of the system and out of the user's way. The device integration with Google Play is fantastic and adds a layer of "awesomeness" to the whole experience. Video playback is great: I watched Transformers: The Dark of The Moon" on high def and it was fantastic, I tried some of the free books on the Play store and they look handsome. Nice typography, excellent contrast and very "buttery" animations for flipping pages and so forth. </div>
<div>
<br /></div>
<div>
I could go on and on about the fantastic combination of software and hardware the Nexus 7 is, but I leave that to the plethora of reviews already out there. I prefer to close making the point that, in my opinion, Google Nexus 7, is hitherto the one true competitor against Apple's iPad, in spite of having a smaller screen size.</div>
<div>
<br /></div>Anonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com0tag:blogger.com,1999:blog-7586593970100216994.post-23928112807553397872012-06-22T20:18:00.000-04:002012-06-23T15:09:32.030-04:00MacBook Pro with Retina Display: a week laterLast week, I <a href="http://ruben.orduz.info/2012/06/macbook-pro-with-retina-display-review.html" target="_blank">wrote</a> a "first impressions"-style of review of my new MacBook Pro with Retina Display. In it I said that I needed to use the laptop more so that I could give a more educated opinion about certain aspects. So, here we go:<br />
<br />
<u>Performance</u>: the machine is very, very fast. Cold-boots in about 10 seconds (and this includes ~2 seconds of the grey bios screen). The SSD + fast ram + i7 Ivy Bridge processors combination works amazing. Anything that I've thrown at it hasn't slow it down. A VirtualBox instance + Adobe Lightroom 4 importing and pre-processing a few hundred RAW images, with a terminal having brew building several packages from source, all at the same time: no problem whatsoever. The computer was just as responsive as when I have a single browser instance open. You really can't tell the difference.<br />
<br />
<u>Retina Display</u>: simply put, and to reiterate, it's amazing. Vibrant, rich, contrasty colors. Excellent shadows and blacks. The text looks awesome (specially with Retina-enabled applications). When the screen is off it gives the impression of being incredibly glare-y, but when it's on, even at half brightness, the glare is negligible. Watched a dozen or so "4K" videos and the colors and details were astounding.<br />
<br />
<u>Gaming</u>: although gamers probably aren't the target audience of this machine, this machine is very competent in that regard. It played all the Humble Bundle games maxxed out @ 1080p resolution at very decent frame rates. When in boot camp mode, it played a few MMOs on High or Ultra High settings @ 40-50 FPS even on public instances and "hub" towns which is where frame rate drops dramatically on most MMOs. So the NVidia 650M definitely pulls its own weight.<br />
<br />
<u>Windows</u>: although Mac purists might chide at the notion of installing Windows on such new machine alongside their revered OS X, truth is, there are some things -- at least for those of us who work in the development arena -- that play nice on Windows. Another issue is games, specially with older titles that don't have Mac versions or if you don't want to spend more money on software you already own. I tried Parallels and CrossOver, but neither gave me the gaming experience I was looking for and both of them have hefty license prices specially considering I can boot camp for free with a Win license I already own.<br />
<br />
<u>Boot Camp</u>: The process was fast and flawless. I went from partition to fully installed windows in a matter of 20 minutes or so, no exaggeration. I then installed the Apple-supplied drivers and all was setup correctly: video, sound, trackpad, HDMI, etc.<br />
<br />
<u>* Noise</u>: I forgot to mention about cooling fan noise. Apple made a big fuss out of this issue in their marketing campaign and thankfully I don't find noise to be a make or break sort of thing. The machine runs very quiet
so long as the NVidia video card is not in use. As soon as the graphics
are switched to the NVidia whether for games or anything requiring 3D rendering, the fan noise is very noticeable and I would say it's equally bad as any other laptop sporting a powerful graphics card. <br />
<br />
So, after using for both work and fun, I have to say that I am very happy with the purchase. However, it's hard for me to issue a blanket statement whether I recommend it or not, mainly because it's quite pricey. So, all I can do is stand last week's opinion: it's a great machine that won't disappoint, and would definitely recommend it, if you can afford it and you are looking for a Mac.<br />
<br />
* added after publishingAnonymoushttp://www.blogger.com/profile/13431663237183791099noreply@blogger.com0