A few days ago I released my first ever “real” swift app. The app is called MongoDB.app and it’s just a thin wrapper around the official MongoDB binaries that you can download from their site. The app will add a status menu icon which will allow you to start and stop a local MongoDB server visually. All data saved by the server will be stored to ~/Documents/MongoData.
Tag: hacking
Building Ember.js Applications for Production
UPDATE: You should use ember-cli the official build tool for Ember.js.
Developing Ember.js apps for production is nothing like what you see on the tutorials or guides around the interwebs. Most guides just throw some code on an HTML file and maybe two or three extra JavaScript files. That’s not how it works in a real world scenario.
If you are working with any of these client side JavaScript frameworks you need to deal with modules, pre-compiling templates, source maps, css pre-processors, linting and minification of files. It’s a lot of stuff.
Lucky for us in the Ember.js camp there’s a lot of stuff going on.
I’ve tried all of them and they are cool. But after a year of using Brunch on Backbone.js and more recently Ember.js projects they all feel either, incomplete or slow. I’ve also tried using Grunt but the Gruntfile became huge and over complicated really fast. It felt like I had more Grunt code than Ember code and worst of all: GRUNT IS SLOW! Really slow if you want to watch your files and re-build on changes. SUPER SLOW.
Brunch is blazing fast, mature (older than Grunt) and it has all the features you might ever need.
Builder, linter, concatenator, minifier
Brunch can compile your JS, CoffeeScript, Stylus, Sass (+ Compass), LESS, Handlebar, (and much more) files, concatenate output to and minify it. It just doesn’t care about languages or frameworks you use.
File watcher
Brunch recompiles and concats all your stuff automatically on any change, headlessly. No more need in compacted Makefiles and watchers.
Auto-reload
Brunch reloads your browser window every time you change stuff (with auto reload plugin).
Auto-support for modules
All script and template files may be wrapped in modules (CommonJS or AMD) to prohibit global public access and encapsulate code. Brunch may also do the job of r.js optimizer automatically.
Blazing fast
Speed is important for app watchers. Usual brunch compilation takes less time than you need to alt-tab to browser window. Unlike Grunt, Brunch recompiles only changed parts of your app and extensively uses caching for others.
Incredibly simple
All you need to do with Brunch is run one command and everything will be managed for you, without need to write sophisticated 300LOC build configs.
Headless Bower integration
Brunch supports headless integration with Bower package manager. Unlike with Grunt, you don’t need to specify all used files in details — brunch will auto-detect them in most cases and automatically concat in correct order.
Headless source maps generation
Brunch automatically generates source maps for all your files so debugging becomes very simple even when all files are concatenated and minified.
ES6 Module Syntax
Just today I created a 26 line plugin that adds ES6 module syntax to brunch It was incredibly easy to write, and share using npm. Other plugins.
Skeletons
Brunch can generate your project from predefined template. There’s a lot of great skeleton projects you can use already, including a bunch made just for Ember.js.
- Brunch with Ember
- Brunch with Ember Reloaded (I made this one)
- Brunch with Ember Reloaded ES6 Branch
- Tapas with Ember
- Sassy Brunch with Ember and CoffeeSoup
- Brunch with Ember Sideloaded
- Brunch with Ember and Bootstrap
- Other skeletons
So there you have it. Brunch is a great option for building Ember.js or any other kind of apps. I recommend you take it for a spin before making a decision about what tools to use. Let me know how it goes.
Photo credit: http://bit.ly/I8is4J
Making iTerm 2 work with normal Mac OSX keyboard shortcuts
Today I found out how to map common Mac keyboard shortcuts to work like they should inside iTerm. The ones that I needed most where ⌥← (Option-Left Arrow) to move left one word, ⌥→ (Option-Right Arrow) to move right one word, ⌘← (Command-Left Arrow) to move to the beginning of the line and ⌘→ (Command-Right Arrow) to move to the end of the line.
Optimizar para la felicidad
Estoy convencido que es posible hacer pequeños cambios en la rutina diaria que pueden tener un gran impacto en nuestra vida. Recientemente he estado utilizando una técnica para manejar el tiempo que se llama Pomodoro que me ha ayudado mucho a enfocarme. También hice una agenda diaria muy detallada que sigo al pie de la letra y me ha permitido tener tiempo para casi todas las cosas que quiero hacer cada día. Aunque hacer estos pequeños ajustes ha contribuido a hacer mis días mucho más productivos hay una decisión que tomé hace poco menos de un año que ha cambiado mi vida por completo en todos los aspectos.
Tengo una capacidad de atención limitada (bastante limitada) y lograr concentrarme, es bien difícil. Creo que me toma por lo menos 45 minutos de enfoque ininterrumpido poder llegar a concentrarme lo suficiente para poder hacer trabajo de calidad. Lo más triste es que una simple llamada telefónica, una alarma o cualquier otra interrupción puede revertir el proceso, haciendo que tenga empezar de nuevamente.
La lógica me dice que si así funciona mi mente en pequeños espacios de tiempo, seguramente funciona de forma similar en periodos te tiempo más largos. Cuando hablo de periodos de tiempo más largos me refiero a 10, 20 o 30 años, por evitar decir la vida. Para optimizar estos periodos de tiempo la solución es simple. Hay que escoger que aspecto de nuestra vida queremos optimizar. No se puede optimizar todo, hay que enfocarnos. Optimizar todos es sinónimo de no optimizar. Aunque admito que la decisión ahora parece evidente, cuando la tomé no lo era. Me decidí a optimizar para la felicidad. Se lo que estás pensando ahora mismo, “ahora este tipo escribe sobre mierdas de auto-ayuda” y no te culpo. Pensaría exactamente lo mismo si me encontrara leyendo este post pero resulta que es imposible hablar de este tema sin sonar así de mamón.
Estoy seguro que se puede optimizar para muchas cosas. Hay gente que optimiza para el dinero, otros para la fama, otros para ser los mejores en algún deporte y supongo que para miles de otros intereses. Cada una de esas optimizaciones son válidas y las respeto. Para mi optimizar para la felicidad significa varias cosas y la más importante es la libertad en todos sus aspectos. Quiero poder decidir que hacer con mi tiempo, quiero decidir con quien trabajo y quiero poder decir lo que quiera, cuando quiera aunque atente contra mi bienestar. Necesito tener control de todos los aspectos de mi vida profesional y quiero ser presentado con retos nuevos todos los días para tener la oportunidad de superarlos o de fracasar en el intento, sabiendo que hice todo lo que podía para superarlo y que el fracaso o el éxito es mi responsabilidad absoluta. Quiero no tener que tomar mis decisiones pensando sólo en el dinero o sólo en los intereses de otra persona que no comparte mis gustos, necesidades y valores.
Optimizar para la felicidad significa que cada vez que tengo que tomar un decisión lo primero que me pregunto es cuál de las opciones no me resta felicidad y si tengo suerte cual de las opciones me suma felicidad.
Un ejemplo. Hace un tiempo tenía en una situación económica complicada (estaba pelao’ como el culo de un mono) y necesitaba generar dinero, rápido. Por suerte apareció un cliente con un trabajo que aparentaba ser simple y que pagaría muy bien. Luego de dos minutos en una reunión estaba convencido de que esta persona no compartía mi visión de mundo. Bueno, en realidad tenía una visión de mundo opuesta a la mía. La reunión estuvo llena de comentarios con respuestas tipo “jajaja eso no me gusta” y de chistes sin risas. Al final sin muchas ganas pero obligado por la situación el cliente me hace una muy buena oferta económica por el trabajo y yo obligado por la situación la acepto, sabiendo que no quiero trabajar con esta persona. Para hacer corto un cuento largo, este proyecto fue una de las experiencias más traumáticas de mi vida profesional e incluso causó problemas en el resto de mi vida. No había forma de estar de acuerdo en nada y finalmente por primera vez en mi carrera tanto el cliente como yo decidimos que no podíamos continuar trabajando juntos, porque nos mataríamos tarde o temprano.
Tome ese trabajo usando como factor principal el dinero que necesitaba en ese momento y no puedo estar más arrepentido. Mi respuesta debía haber sido: “Lo siento, no creo que debamos trabajar juntos, gracias por la oportunidad”. Aunque esta respuesta en lo inmediato parece una decisión que restaría felicidad (por no tener dinero para pagar las deudas) no lo es. Es la decisión que me permite ser libre de escoger con quien uso mi tiempo sin importar el dinero. El pensar que el trabajo o cualquier otro aspecto de la vida debe ser “una medicina amarga” es lo que nos tiene como nos tiene.
Debo admitir que hablo desde un lugar privilegiado. No tengo ahorros, propiedades, un bote, ni ningún lujo que mantener y por el momento nadie depende económicamente de mi. Básicamente no tengo nada que perder así que no tengo que preocuparme por esas cosas ahora. Tengo la libertad de quedarme sin dinero, que me boten de donde vivo alquilado, me quiten el carro y me dañen el crédito sin sufrir ningún daño a mi felicidad. Tengo esa libertad porque estoy tomando mis decisiones pensando en que el producto de cada una de esas decisiones debe ser hacerme más feliz en lo que finalmente un día muero y lo pierdo todo sin excepciones.
Desde donde miro las cosas me queda claro que prefiero vivir haciendo cosas que me hacen feliz que vivir tratando de lograr metas para luego tratar de ser feliz. Si todavía estás leyendo este viaje de auto-ayuda en el que me fui, te invito a que no seas pendejo o pendeja y busques todas las cosas que te restan felicidad y las elimines, hoy. ¡Ahora!
Social Engineering
Este tema me tiene fascinado hace tiempo. Social Engineering es el arte, talento o habilidad de hacer que las personas hagan lo que uno quiere. En otras palabras engañarlas sin que sospechen nada.
Lo más comico es que la mayor parte del dinero que gastan las empresas en seguridad IT y no para entrenar a los usuarios del sistema. Esta es la vulnerabilidad más grande y la que se puede explotar usando algunas técnicas de social engineering.
Aquí un ejemplo clásico de un hack de este tipo. Un hacker llama a un centro de customer service de una empresa.
Hacker: Hola tengo un problema con mi servicio y quiero hablar con el supervisor
Representante: Si, no hay problema
Hacker: Una pregunta como se llama el supervisor de turno
Representante: Juan del Pueblo
Con esta información el hacker cuelga y genera otra llamada.
Hacker: Hola le habla “Fulano de tal” y trabajo para SecureTech la compañia que hace auditorias de seguridad para su empresa, estoy tratando de contactar a Juan del Pueblo pero no logro encontrar su teléfono directo, ¿usted puede transferirme?
Representate: Si, como no.
Juan del Pueblo: Hola, Juan del Pueblo
Hacker: Hola le habla “Fulano de tal” y trabajo para SecureTech la compañia que hace auditorias de seguridad para su empresa. Supongo que está pasando un día dificil
Juan del Pueblo: Eh, no ¿dificil porque?
Hacker: Bueno es que se calló el sistema hace un rato, deben tener un caos ahi.
Juan del Pueblo: No, el sistema está funcionando perfectamente, todo el día
Hacker: No es posible estamos viendo desde acá que no funciona. Vamos a hacer una prueba puede hacer logout y login a ver si eso arregla este problema.
Juan del Pueblo: Ok. Si todo bien
Hacker: Esto es muy extraño, creo que vamos a tener que hacer un restart del sistema pero eso puede tomar un par de horas. Puede tratar una vez mas de hacer logout y login.
Juan del Pueblo: Si. Me deja entrar sin problemas.
Hacker: Wow esto es bien raro. Vamos a hacer algo dame tu username y password y yo trato desde acá a ver si tengo el mismo problema
Juan del Pueblo: juanp y el password es XXXXX
Hacker: Ok. Deja tratar… Ah ok listo ya está arreglado. No deben tener problemas. Gracias
Juan del Pueblo: Gracias, adiós.
Obviamente este es un ejemplo muy simple pero puedo jurar que es más efectivo de lo que uno piensa.
Aquí un video de unos hackers del mundo real.