jueves, marzo 14, 2013

Access Violation

De vez en cuando me toca hacer de Informático a domicilio para la familia. Los gafes del oficio...
De nuevo por enésima vez instalar 3DMax y VRay 64 bits piratas en Windows 7 (ultimate). Vamos... algo que no es muy complicado. Pero esta vez cuando iba a generar el código de activación, me sale una ventanita dichosa... "Access Violation". Crash!!!!

Chachi! Me lo voy a pasar teta... Brown para el informático! Tipicos pensamientos: "cagüen..., y ahora que hago..., como tenga que instalar el windows de nuevo..., ...".

Y que es lo que hace un profesioná? Pues a googlear. Y me encuentro con que no soy la única persona humana a la que le ha pasado. Parece ser que el crack para 3DMax 2013 da mas problemas que los anteriores (nunca tuve problemas con 2011 y 2012).

Parece que hay gente que lo solventó desactivando DEP (data execution prevention):

Panel de control\Sistema y seguridad\Sistema => Configuración Avanzada => Rendimiento

Ahí puedes tener una 'whitelist' the aplicaciones para cuales desactivarlo.
A mi no me funcionó. Ni la desactivación completa (a ejecutar como admin):

bcdedit /set nx AlwaysOff

Ojo! No olvidar volverlo a restaurar.

bcdedit /set nx AlwaysOn

Tras indagar un poco mas, parece que gente lo ha logrado solventar desactivando servicios de Microsoft. msconfig to the rescue...

Primera prueba: cargar solo servicios básicos. Crash! Umm, sigue sin funcionar...
Segunda prueba: desactivar todos los servicios de Microsoft. Guala!!!!!!! Brown quitado de encima.

Tras la instalación del crack, hay que restaurar activar 'Inicio normal' en msconfig, y ya que estáis  pues yo le echaría un ojo a que servicios se están levantando que seguro que hay cosillas que no usáis y que os ralentizan el ordenador y el arranque.

Fin.






miércoles, febrero 13, 2013

Tus aliados en windows 7

Desde Enero del 2011 llevo dandole caña a mi último portatil un Sony Vaio VPCZ1. Mi idea era haberle metido Linux, pero tras pelearme un poquillo desistí y me quedé con el no deseado Windows.

La verdad... es un pepinaco. Yo no lo puso disco duro SSD para abaratar, pero con 8Gbs era un pepinaco que ni los MacBook Pro de la epoca... Por no hablar ya del peso.
Llevo dandole caña (de la buena) mas de dos años y ahí sigue sin darme apenas problemas.

Mis aliados para hacerme la vida un poco mas fácil son VirtualWin (antiguo pero funciona sin problemas), VirtualBox y que Windows 7 tiene shortcuts (resumé) para  colocar y distribuir ventanas. Con eso y con putty ya mas o menos te añapas bien.

Hasta esta semana... Que el tema al final ha resultado un problema de configuración de red, que se le hacía ir la pinza al cliente de VPN (openvpn). Yo estoy usando el cliente estable de openvpn.se, pero hay uno mas estable de desarrollo. Es el que me paso Matias... en su momento. También podéis conseguir clientes mas recientes en openvpn.net.

Tras la intro... De lo que va es post. Que tienes ya disponible en Windows para ayudarte a determinar que está pasando (desde consola)?

  • ipconfig - para ver tu configuración de red
  • netstat - para ver tus conexiones de red
  • route - para ver tu table de rutas (también puedes usar netstat -rn)
  • taskmgr - el archiconocido Task Manager (al primer sitio que irás para ver si algo está pasando con algún proceso, como era mi caso) - Shortcut: Ctrl + Shift + Esc
  • resmon - Complementa a taskmgr (hace uso de perfom). Te permite por ejemplo ver si un determinado proceso está accediendo a la red. 
Otro sitio al que tendrás que ir para ver los adaptadores de red es a 'Panel de control\Redes e Internet\Conexiones de red'. Donde puedes eliminar, desactivar o modificar la configuración de los diferentes adaptadores.
Y ya puestos en 'Panel de control\Redes e Internet\Administrar redes inalámbricas'. Tienes todas las configuraciones wifi que has usado en algún momento :p.

¿Y cual era mi problema?
Pues que tenía dos rutas por defecto...
Al final resulta que el adaptador de la LAN tenía metida una configuración a piñón para asignarle una gateway diferente a mi router actual (se ve que se quedó ahí tras configurar un repetidor wifi).

Por lo menos hemos aprendido algo nuevo...
Otra cosa aprendida, es que si quieres dar una IP fija, en lugar de hacerlo en la pestaña 'General' de las propiedades de TCP, puedes hacerlo en la pestaña 'Configuración Alternativa', que se usará si la primera falla.


miércoles, enero 23, 2013

Problemas en PHP

Tenía en mi colección de enlaces uno sobre los problemas que tiene PHP. Tras haber recibido otro enlace interesante comparto ambos aquí:

  1. PHP: a fractal of bad design
  2. PHP Sadness

lunes, enero 14, 2013

Escogiendo plataforma para una tienda online

Independientemente del motivo por el que llegues a la necesidad de tener que montar un tienda virtual, lo primero que tendrás que decidir es si vas a ir a por una solución SaaS o Hosted.

El usar un SaaS o no va a depender sobre todo de la funcionalidad que quieras ofrecer. Lo mas normal es que sirva un SaaS, como a mi.

Hosted

Te pueden llevar varios motivos a la decisión de no usar un SaaS. Yo diría que el principal es que lo que quieres implementar tenga unos flujos que no se van a adaptar a un producto ya enlatado.
Si optas por esta opción necesitarás o bien alguien técnico en el equipo  o tener algún contrato de mantenimiento para poder garantizar que la tienda esté online.

Posiblemente la decisión mas importante a tomar es en que lenguaje quieras trabajar: java, python, php, javascript, ...

En cualquier lenguaje vas a tener varias soluciones ecommerce [wikipedia](nada de python???), para poder escoger.
Si el lenguaje te da igual, la decisión se te complicará puesto que el abanico de productos se te abre. Es increible que incluso hoy en día siguen surgiendo productos nuevos... (no todo está en la wikipedia.. :p - ejemplo)

El siguiente paso será valorar cual de los diferentes productos ecommerce usar. Lo suyo será valorar cuales son tus necesidades e ir analizando producto por producto.
Una vez seleccionados los finalistas lo suyo sería hacer una prueba de concepto mínima, para ver con que se está mas cómodo (si hay tiempo).

Ojo! normalmente los CMS también tienen pluggins para convertirlos en una plataforma ecommerce.
Ver que opciones tenemos en los diferentes lenguajes daría para un post específico, que no de este.

Los machotes, podrán pasar de todo, y montarselo todo a pelusqui.

Ah! uno de los motivos por los cuales te podría interesar montarte tu mismo la tienda es porque quieras integrar alguna pasarela de pago distinga de la que ofrecen las plataformas. En otras palabras... que quieras integrar directamente alguna pasarela de pago de algún banco para abaratar costes. Esto lo recomendaría como una evolución a una tienda la operativa y justificándolo ya con datos reales.

SaaS

Si tienes claro que lo tuyo es un SaaS el siguiente paso es ver que opciones hay en el mercado.
Tras preguntar por aquí y por allá, ver que han usado conocidos, y buscar un poco por la red mis finalistas fueron:

  • Mangento go: el posible lider open source (como hosted) ya tiene solución SaaS.
  • Bigcartel: Un producto sencillo, ligado al mundo del arte (el de lo que estoy montado), y parece que bien valorado.
  • Shopify: Posiblemente el lider SaaS en cuanto a sencillez/funcionalidad.
  • Volusion: Una inclusión de última hora, por haber leído algunas reviews buenas sobre él.
Para decidir al igual que que si no usas un SaaS, hay que analizar las diferentes soluciones frente a los requisitos que uno tenga. Los requisitos pueden ser técnicos, funcionales, económicos, ... Es un tema ya personal.
Mis finalistas fueron Shopify y Bigcartel y al final que he quedao con Shopify. Acabo comentado lo que opino de cada uno... Podeis complementar la información buscando comparativas en la web...

Bigcartel

Fue el primero que probé. Inicialmente pensaba sólo comparar entre Magento y Shopify, pero me decidí a probarlo por su precio, que es realmente bueno. Un acierto.
Me sorprendió su sencillez. Me fuí encontrando dudas que el soporte me resolvió rápidamente y muy amablemente. Da buen rollo.
A nosotros nos servía porque cuadra perfectamente con el negocio a montar. Si el negocio es otro, en lugar de artistas habrá que trabajar con 'vendors', pero vamos... lo mismo da, ya que todo el css/html es modificable (un ejemplo de un site currado).
En principio y según reza en su pagina tienen un límite de 300 productos. Para nosotros ahora mismo no es un problema. Si algún día lo es dependerá del crecimiento. Sólo soporta Paypal como pasarela de pago lo que para nosotros tampoco es un problema ya que es lo que vamos a usar inicialmente. Aunque Shopify soporte mas pasarelas de pago hay que ver si en el pais de aplicación están disponibles...
Mi decisión en usar Shopify se basó en que la template basica de Shopify me gusta mucho más que la de bigcartel y ahora mismo no tengo tiempo de andar lidiando demasiado con el html/css/templates.
Otro detalle importante es que sólo puedes exportar las ordenes. No puedes exportar por ejemplo los productos. En Shopify puedes exportar los clientes, las ordenes y los productos.  

Shopify

Al igual que con Bigcartel es trivial poner el site a andar. El único pero que me encontré es que en la versión de prueba, no puedes probar pagos, con lo cual me quedé sin probar como es la generación de recibos. Al menos te muestran como son los pantallazos de la pantalla de ordenes cuando estas existan.
Aunque es mas caro que Bigcartel, si echas número el coste es razonable. Cuando ni siquiera has empezado es prematuro andar racaneando. Hay otros factores mucho mas importantes que ahorrar unos centimos por transacción. Ya habrá tiempo para eso...
Por lo demas... ningún pero. La funcionalidad que te da por defecto es muy buena y aparte puedes extender la funcionalidad con apps/pluggins. Hay muchas disponibles.
Tiene una fuerte comunidad alrededor y bastante documentación.
El coste inicial $29 + 2.0% por transacción está bien para empezar, y probar (coste de 5% aprox. contando paypal). Si las cosas van bien enseguida compensará migrar al siguiente escalón $59 + 1%.

Un detalle a tener que cuenta, que podría hacer que necesitéis una tarifa más alta de la que esperáis  Shopify cuanta cada variante de un producto, como producto. Si tenéis un producto con dos colores para Shopify serían dos productos. Si vais a manejar un gran número de productos con multiples variantes el número de productos se puede dispara rápidamente (imaginar una tienda de ropa con colores y tallas).

Magento Go

Sólo entrar en magento ya ves que el interfaz es mucho mas complicado y feo. Tiene mas opciones que el resto de los productos, pero para mi caso de uso innecesarias.
Las templates por defecto son mas féas.
La usabilidad también es peor. La creación de productos y categorías por defecto (puede que se pueda tunear para simplificar, no lo se...) es mas compleja.
Descartado por overkill y necesitar mas tiempo de diseño.
Su única ventaja actual para mi sobre shopify sería el precio.
Una ventaja futura sería la facilidad teorica de migrar de SaaS a Hosted.

Volusion

Volusion ni llegé a probarlo. Por un motivo, su precio para mi no era competitivo. Puede ser interesante en el caso de que requieras alguna funcionalidad que las otras plataformas no tengan; pero no era mi caso. 
No me gustó en que los comerciales me contactaron tanto por email como por teléfono.

I18n

Con respecto a los idiomas hay algunos peros: ninguno de los productos probados tiene el panel de administración en Español. Para mi no es un problema, pero para alguien podría serlo...

Y un pero bastante gordo para Bigcartel y Shopify. No soportan multilenguaje. Si queréis tener la tienda en mas de un idioma tendréis que montar mas de una tienda, con las implicaciones que tiene sobre todo a nivel de gestión (mas de un inventario, ...).

En este tema Magento Go, es el claro ganador.

viernes, diciembre 21, 2012

Websockets

A raiz de mi post anterior (Asyncronous web frameworks). Me ha dado por mirar el soporte a websockets en el mundillo python.

Node.js lo soporta con socket.io.
Play también tiene soporte para websockets (verdad que Play2 es muy interesante?).

En cuanto a python, hay varias opciones. Enlazando con el post anterior lo mas interesante sería combinarlo con gevent. Podemos usar tanto gevent-websocket como gevent-socketio.

Aquí tenemos otro post, en el que ademas usa zeromq.

Mas opciones pythoneras:


Por otro lado, la versión 1.3 de nginx incluirá websockets. Aunque parece que se puede hacer que lo soporte.

Referencias




Asyncronous web frameworks

Ahora mismo una de las guerras que tengo es progresar en javascript. Cosa que ya estoy haciendo sin necesitar empezar un nuevo proyecto, gracias a una migración que tenemos ahora entre manos en Youzee.

Dentro del mundo javascript, uno de los productos que están en ebullición es node.js. Y la pregunta que me hago es... ¿Me interesaría usarlo para futuros proyectos?

Estamos hablando de servir miles de peticiones concurrentes por segundo. Escalar puedes hacerlo con un webserver normal. Simplemente tienes que echarle dinero al tema y ya está. Se trata de poner mas hardware y a balancear. Pero porque vas a tirar dinero innecesariamente...

Por otro lado, tenemos el caso de uso del long polling, donde las conexiones son persistentes. Para este caso un servidor multithread no va a ser capaz de escalar con un gran número de clientes. Necesitaremos ir a un servidor basado en eventos y llamadas asíncronas  Ahí es donde node.js entra de lleno. node.js tiene la asincronía en su adn.

node.js claramente es una opción realmente interesante:

  • la comunidad de javascript está realmente activa y el lenguaje está cobrando mucha fuerza
  • node.js es realmente muy muy eficiente.
  • tienes la ventaja de poder compartir código con la parte cliente
  • nunca vas a tener el problema de bloqueos por llamar a código síncrono.

Ahora bien... ¿Que alternativas tenemos a node.js? A mi particularmente me interesa python. Es mi debilidad. Parece que la mejor opción sería usar gunicorn junto con gevent (pero no es la única, tenemos twisted, tornado, ...)

Creo que sólo una restricción me harían decantarme por gunicorn+gevent que el código tenga que ser python ya que lo mas eficiente a dia de hoy es node.js. Lo cual no quita a que el resto de servicios puedan ser python. Sólamente necesitaríamos que el frontend fuera node.js. 

Como ultima nota comentar que si no nos importa perder un poco de rendimiento gevent proporciona algo interesante y es que sin cambiar el modelo de programación consigues asincronía.

Otro lenguaje interesante es scala. Me apunté al curso de coursera, pero por falta de tiempo no puede realizarlo. Si podeis no dejeis de hacerlo que por lo visto es muy bueno.
Y en scala tenemos play2
Si hoy en día tuviera que usar algo corriendo sobre la jvm (restricción), lo tendría claro. Este sería el lenguaje. Se diferencia de javascript y python en que tiene tipado estático (y fuerte como python). Auna en él, la programación OO y la funcional.
¿La desventaja? Un lenguaje mas complejo de aprender que python y javascript. Pero play2 tiene una pinta fantástica.


Conclusión

play2, para mi ahora mismo tendría una curva de aprendizaje mas largo, por lo que para proyectos personales ahora mismo no lo consideraría. Eso si, gente que conozco que están empezando a trastear con play2 están encantados. 
A falta de ver mas comparativas a nivel de framework (por que a nivel de lenguaje, Scala tiene mejor rendimiento que python y javascript), profesionalmente lo consideraría si a nivel corporativo está como requisito que corra bajo jvm. 
Cuando me meta con Scala, fijo le doy una probazón.

A nivel general veo lo mas atractivo tanto para proyectos personales, como profesionales node.js. No sólo porque es el que da mas rendimiento, sino por que es ahora mismo lo está muy en boga. La opción de compartir código entre cliente y servidor es también muy interesante.

Python (gunicorm + gevent) lo usaría sin duda si el código tiene que ser python o sino quieres complicarte en crear servicios adicionales (nodejs + python services). La diferencia de rendimiento con node.js es pequeña. Vamos.. que es una combinación totalmente acertada.

Y no quería acabar sin comentar que se está trabajando sobre un estándar asíncrono para python 3.

Referencias

Javascript



Python



Scala









lunes, noviembre 19, 2012

Python + excel

La verdad... no se que fue primero si mi pensamiento en que estaría muy bien algo tipo excel en un entorno python o ver este artículo de Techcrunch, sobre DataNitro.

En Techcrunch referencian a:

Habrá que echar un ojo en profundidad para ver que ofrece DataNitro sobre ellos. Para usos comerciales ni Pyxll ni DataNitro son gratis, y parece muy similares.
Pyvot permite leer y manipular excel desde python, pero sin embargo no permite definir funciones en python que sean invocadas desde excel.

Echando un vistazo a este link del artículo,  me he encontrado con PyTools. Un plugging de Visual Estudio para python.

Buscando spreasheets en python sólo he encontrado:

Vamos... el único interesante parece Pyspread.

martes, noviembre 13, 2012

utc and localtime

Ayer vi una presentación muy interesante: Python for Humans.
En ella se comenta que a pesar de que python tiene su Zen (import this) hay modulos de la librería estándar que o bien no son simples o se podrían mejorar.

Un claro ejemplo es datetime. ¿Porque no se incluye la timezone por defecto?
En el momento que quieres hacer conversiones entre timezones, necesitas de modulos externos. Y de nuevo nos encontramos con otro de los problemas de python. La multitud de opciones... ¿Cual usar pytz o dateutil?

Os dejo con un programilla que convierte de utc a localtime usando los dos.


from datetime import datetime
import pytz
from dateutil import tz

# The problem with now and utcnow is that they don't set set tzinfo to None
now = datetime.now()
utcnow = datetime.utcnow()

# Wit this one, we are setting the tzinfo (using dateutil)
summertime = datetime(2012,7,1,23,30, tzinfo=tz.gettz('UTC'))

#--- Converson using dateutil
#    We are using naive timezones with the exception of summertime
#    Instead of using local datetime with tz.tzlocal() we are hardcoding it
print "*** Conversions using dateutil"
print 'now:', now.strftime('%Y-%m-%d %H:%M:%S')
print 'utc:', utcnow.strftime('%Y-%m-%d %H:%M:%S')
print 'summertime:', summertime.strftime('%Y-%m-%d %H:%M:%S')

UTC = tz.gettz('UTC')
HERE = tz.gettz('Europe/Madrid')
utcnow2 = utcnow.replace(tzinfo=UTC)
print 'utc localized:', utcnow2.astimezone(HERE).strftime('%Y-%m-%d %H:%M:%S')
print 'summertime localized:', summertime.astimezone(HERE).strftime('%Y-%m-%d %H:%M:%S')

#--- Converson using pytz
#    Pay attention to how we can create a utc datetime with timezone using now()
#    Instead of using pytz.utz we could also use pytz.timezone('UTC')
madrid = pytz.timezone('Europe/Madrid')
utc_with_timezone = datetime.now(tz=pytz.utc)
utc_withouth_timezone = datetime.utcnow()

print
print "*** Conversions using pytz"
print 'with:', utc_with_timezone.strftime('%Y-%m-%d %H:%M:%S')
print 'withouth:', utc_withouth_timezone.strftime('%Y-%m-%d %H:%M:%S')
print 'with localized:', utc_with_timezone.astimezone(madrid).strftime('%Y-%m-%d %H:%M:%S')

# astimezone cannot be applied to a naive time zone so we need to do like with dateutil
# and firtsly we need to localize the datetime
utc_withouth_timezone = pytz.utc.localize(utc_withouth_timezone)
print 'without localized:', utc_withouth_timezone.astimezone(madrid).strftime('%Y-%m-%d %H:%M:%S')
print 'summertime localized:', summertime.astimezone(madrid).strftime('%Y-%m-%d %H:%M:%S')

Salida:

*** Conversions using dateutil
now: 2012-11-13 12:17:01
utc: 2012-11-13 11:17:01
summertime: 2012-07-01 23:30:00
utc localized: 2012-11-13 12:17:01
summertime localized: 2012-07-02 01:30:00

*** Conversions using pytz
with: 2012-11-13 11:17:01
withouth: 2012-11-13 11:17:01
with localized: 2012-11-13 12:17:01
without localized: 2012-11-13 12:17:01
summertime localized: 2012-07-02 01:30:00

Vamos que da un poco igual usar uno que otro...
En el caso de pytz en lugar de usar localize() podríamos haber hecho uso de replace() como si se hace con dateutil.

Si teneis que usar offets, en lugar de zonas, dateutil los soporta. Mi balanza a priori se inclina para dateutil por ese motivo. Ejemplo:


from datetime import datetime
from dateutil import tz

HERE = tz.tzlocal()
OFFSET = tz.tzoffset(None, 3600)
UTC = tz.gettz('UTC')

now = datetime.now(UTC)
here = now.replace(tzinfo=HERE)
offset = now.replace(tzinfo=OFFSET)

print 'here:', here.astimezone(HERE).strftime('%Y-%m-%d %H:%M:%S')
print 'offset:', offset.astimezone(OFFSET).strftime('%Y-%m-%d %H:%M:%S')