753 karma · joined September 18, 2009
We are hiring front end engineers! We have a modern front end stack (ES6, React, Redux, Webpack) and a history of front end thought leadership and open source contributions.
We are also hiring mobile engineers with a focus on Android and iOS development. We build tools for our fellow mobile developers and write code that is deployed on billions of devices around the world.
To apply or learn more about either opportunity send an email to jobs@localytics.com Check out our engineering blog: eng.localytics.com
Not sure if it's just me, but when touching the menu controller on the top left, the dom slide over to reveal... nothing. Also, general weirdness using the gear button to change selection between all/enqueues only/ratings only/reviews only. Selecting something other than all does nothing and doesn't persist.
I'm on Android 2.3.3. My Touch 4g slide. Stock browser.
In fact, we open sourced our C2DM Ruby Gem: https://github.com/sghael/speedy_c2dm
Note: US-only for now & requires a phone (so no tablets.)
The stack & tools:
* Rails 3 (MRI) for our API servers.
* Worker nodes running Sinatra (JRuby) w/ Resque
* Monit for monitoring services / Fabric for quick provisioning
* The Android client is typical Java (using IntelliJ)
* iPhone development w/ Monotouch!
* S3 for storage, and our public website using Jekyll
* C2DM message delivery (our Gem: https://github.com/sghael/speedy_c2dm)
Lessons learned so far:- Fragmentation on Android is a b. Especially when dealing with hardware stuff like cameras, expect to do a lot of device specific coding. Front-facing cameras are a perfect example. Gingerbread solves these problems in theory, but not in practice.
- Uploading video files over mobile connection is non-trivial (duh) - We've put a lot of work towards reliable and efficient uploads and downloads (intelligent packetization, retry logic, etc). We solve for the "elevator scenario". User sends a message, but steps into an elevator half way through delivery. Aside from Gmail, most mobile apps suck at this.
- On the positive side, 4G+ speeds are really impressive.
- Creating a portrait oriented camera application for Android is way harder than it should be (really poor API implementation around camera rotations). Contrast to iOS where it's super easy.
- UX matters - A friction-free UX required a lot of work. We had many alpha testers (both family and friends & paid services like usertesting.com/mobile) that helped us find the sticking points.
We'd love your feedback on anything!
Another idea to grok: a checkerboard pattern image where every other pixel row and column are alternating full black and full white represents the "highest frequency" image possible at that sample rate (pixel density). This is the 2d equivalent of an alternating sinusoid +1,-1,+1,-1, etc
btw, props to Fog Creek and OP for airing their dirty laundry. They take some heat, but in the end we all learn from it.
But my gut feeling is that it doesn't matter. While I don't have any experimental data, I have to imagine this rendering penalty is in the noise of page/site performance. Asset packaging, gzip, using front end static server, etc are probably orders of magnitude more important for page rending speed than DOM traversal of CSS selectors.
This way, temporary memorization of passcode is avoided in both cases. The passcode is always rendered to pixels (computer screen or phone screen).
Performance wise, there aren't many bottlenecks right now. Switching in Resque for my job queue (replacing Delayed Job) will make everything a little faster. If the queue ever starts to get large, I can quickly fire up another server as a dedicated worker.
I am leveraging AWS Cloudfront as a CDN for the widget JS, so the widget will load super fast for everyone. I offload all static assets when I can. Google CDN for JQuery.
The only immediate point of concern is the real-time API. That will soon have some throttling/limits on it to prevent abuse. I highly prefer people use the Post-back method to get notified of verifications (push is always better than poll).
As for proving reliability, I'm thinking of putting up public Pingdom reports for transparency.
This may not be super important if all you want to do is prevent lowly Forum spam (ReCaptcha may be all you need in this case). But phone verification can be particularly useful when the cost of fraudulent transaction is high (like user purchasing goods on your site with a stolen credit card, etc).
As an aside, I saw Amazon and Craigslist now use phone verification for more critical parts of workflow. Which inspired me to build Phoneify as a JS widget than anyone could use.
Other than that its a lot of "I don't want to write this..."; Google: "[thing I don't want to write] gem rails 3 github"
I'm actually way more comfortable with Django, but the Gem eco-system with Rails is amazingly mature, and the Rack based approach of Rails 3 seems to have positioned the framework really well, architecturally. I found Ruby/Rails idioms pretty confusing when beginning. But most of the learning curve w/ simple projects is really about "where stuff lives", and that's the same effort to learn in any framework.
Django pros: Admin, Python, Explicit model definitions (not via introspection like Active Record), South > Rails migrations (IMO), easier to create relational models, query syntax rocks.
Rails pros: Gem ecosystem, Passenger, Capistrano, Haml/Sass, Mailers
re: Pricing - TBD :)
I probably should have put some thought into pricing before posting on HN, but pricing is one of those eternally difficult things so I punted for now.
International SMS verifications should work, but some people are currently reporting issues with that. No voice verification for International planned (for cost reasons).
gem 'rails', '3.0.4' gem "mysql", "2.8.1" gem 'capistrano', '2.5.19' gem 'capistrano-ext', '1.2.1'
gem 'awesome_print', '0.3.1' gem 'closure-compiler', '1.0.0' gem 'compass', '0.10.6' gem 'devise', '1.1.6' gem 'fancy-buttons', '1.0.4' gem 'jammit', '0.6.0' gem 'jquery-rails', '0.2.7' gem 'haml', '3.0.25' gem 'hpricot', '0.8.3' gem 'hominid', '3.0.2' gem 'kaminari', '0.10.4' gem 'postmark-rails', '0.4.1' gem 'ruby_parser', '2.0.5' gem 'twiliolib', '2.0.7' gem 'uuidtools', '2.1.2'
group :production do gem 'passenger', '3.0.4' end
On a related note: I have to say that I'm really flying with Rails 3. Typically I roll with Django, but have been super impressed with the Rails 3. Feels really clean, and there are some Gems that make the more mundane parts of the webapp construction fun and agile: Haml/Sass, blueprint, Fancy-buttons, Devise.
I'll probably write up a blog post soon on all the tricks & shortcuts I used to get this off the ground. Many of the shortcuts have to do with design and layout, and less so about backend coding.