¿ Desarrollar o no Desarrollar? He ahí el dilema

En que momento debemos desarrollar un software o simplemente usar una solución ya hecha anteriormente por la comunidad.

Recuerdo ya que hace muchos años mi primer blog fue programado 100% por mi, lo desarrollé en php siguiendo un tutorial que había en un libro que compré. Cuanto me arrepentí de haberlo hecho. Un par de años después de tenerlo funcionando un robot lo llenó de comentarios y la BdD colapsó, ni si quiera me di la oportunidad de recuperar el contenido que tenía en él. Estaba demasiado molesto…

Creo que poco antes de desarrollar este CMS ( la verdad ni si quiera se puede llamar así ) pensé en usar un sistema que ya existiera, pero en ese momento ganó el sentimiento de pertenencia y no la lógica por lo que terminé desarrollándolo. Si tuviera que elegir HOY si desarrollar un CMS para blogging personal ni si quiera pensaría en algo distinto a wordpress.

¿ Entonces cuando es necesario o no desarrollar un software ?

El lunes estaba dando una clase en la que hablábamos con los chicos de los beneficios de los frameworks y esto es muy similar. Es difícil encontrar un problema que tenga que solucionarse con un software que aún no haya sido creado. Existen soluciones para manejo de empresas, para ventas en línea, para manejo de contenido, para blogging, para redes sociales incluso para páginas de matchmaking. Estas soluciones pueden ser servicios o programas gratuitos, pagados, freemiums, etc.

Algunas ventajas del software que podemos encontrar en la red :

  1. Fácil y rápida implementación.
  2. No se requiere un equipo para poder hacerla funcionar.
  3. Costo bajo ( no necesariamente gratis, pero bajo )
  4. Independencia. No dependes de alguien más, de permisos ni de licencias.
  5. Fácilmente adaptable a tus necesidades. En muchos casos puede venir con un sistema de plugins para que desarrolles tus mejoras.
  6. Comunidades activas. Personas, foros, libros y otros blogs que pueden ayudarte a realizar lo que necesitas.

¿ Cuando desarrollar tu propio software ?

  1. Cuando la solución que queremos no existe.
  2. Cuando usar una solución existente es más costoso que desarrollar una propia.
  3. Cuando las soluciones que existen no se pueden adaptar a las necesidades que tenemos.
  4. Cuando el periodo de aprendizaje del código de la aplicación es mayor que el tiempo que requiere partir un software desde 0. Esto en general pasa cuando las aplicaciones no están desarrolladas de manera adecuada o pobremente documentadas.
  5. Cuando implementar las mejoras al sistema existente requiere más tiempo que crear todo desde 0.
  6. Cuando tenemos suficiente tiempo para realizarlo ! ( Vale la pena recalcar que muchos desarrollos no durarán una noche )

 

Recuerdo en un momento querer implementar un ERP OpenSource, en su momento eran pocos en español y mucho menos los que tenían el peso Chileno, sin contar que a las personas que puse a probarlo lo encontraron excesivamente complicado por lo que desechamos esa idea.

Al final la decisión siempre va a ir por nuestro lado, el sistema de inventario que usamos en la empresa fue desarrollado  debido a lo que necesitábamos en su momento  no me lo podía dar otro, desde las estadísticas necesarias hasta el entorno amigable.

Ojo, la idea de este post no es que NO desarrolles o que SIEMPRE uses software opensource, solo que simplemente veas los pros y contras de usar cada uno de ellos y elijas la mejor opción en cada caso. Tomando esto en consideración, ¿ Desarrollaras tu siguiente proyecto ?

¡Mantengamos el contacto!

Me encantaría que te mantuvieras al día con el contenido que estoy generando. Recuerda que no es solo el blog, son las redes sociales, libros, y distintos pódcast 😎.

Hago todo lo posible para no hacer Spam,

¡MANTENGÁMONOS EN CONTACTO!

Me encantaría que te mantuvieras al día con el contenido que estoy generando. Recuerda que no es solo el blog, son las redes sociales, libros, y distintos pódcast 😎.

Hago todo lo posible para no hacer Spam,

¿ Es necesario un framework ? Simplificando el desarrollo de software

Esta es una discusión que he tenido en bastantes ocasiones con pares y alumnos. La idea de este post es explicar un poco lo que se ha logrado con todas estas discusiones.

En muchos de los casos durante la universidad no hemos tenido la necesidad de desarrollar un software complejo, un software el cual deba de adaptarse a las necesidades del entorno, las modificaciones de ciertas librerías o simplemente al tiempo. La semana pasada le di el ejemplo a un alumno sobre codeignigter, en mi caso fue el primer framework que utilicé para desarrollo web utilizando php y actualmente ( no se si vaya a cambiar pronto) ya no es compatible con las nuevas versiones de php. Esto le puede pasar a cualquier desarrolo, la cantidad de actualizaciones, parches y modificaciones que salen anualmente son muchas más de las que podemos contar. Si esto le pasa a una aplicación que es mantenida por cientos de personas en la comunidad .. ¿Que nos espera a una aplicación desarrollada por nosotros ?

Ojo, esto no es para asustar a nadie, es simplemente para generar conciencia de lo que podría a pasar si no prevenimos.

Es solo cosa de mirar algunas de las aplicaciones más usadas del momento, como lo es Flickr y Facebook, ambas son en base a php y la verdad no creo que vayan a dejar de ser compatibles con sus nuevas versiones o no estén preparados para situaciones como esa. Deben de tener docenas si no cientos de desarrolladores con acceso al código que ocupan y tienen que además tener un estándar que seguir para publicar su código o simplemente para entender el que ya está escrito.

Lo bueno es que ya muchos desarrolladores han lidiado con los mismos problemas a los cuales podríamos enfrentarnos y han desarrollado frameworks en los cuales se han recopilado los conocimientos de muchos desarrolladores para hacer nuestras aplicaciones aún más fácil de realizar.

Ok, podemos decir que los frameworks están para hacer que un desarrollo complejo se convierta en un desarrollo simple. Es posible que para aplicaciones sencillas si agreguemos una complejidad innecesaria al implementar un framework, pero este post se basa en aplicaciones un poco más complejas, esas en las que se requiere ya de un equipo, en las que usaremos manejo de versiones, en las que dividiremos el código en hitos y cada uno de ellos se convertirá en un entregable de un proyecto.

Ok, ¿ pero que es un framework ?

Wikipedia : «A software framework is a universal, reusable software environment that provides particular functionality as part of a larger software platform to facilitate development of software applications, products and solutions. «

Personalmente me gusta el término de «un esqueleto que incluye lo básico para generar una aplicación compleja sin la complejidad requerida para realizarla«.

Si partimos de lo básico, un framework separa la lógica de las vistas, ordenando la forma en que desarrollaremos. De ahora en adelante hablaré un poco del Modelo Vista Controlador ( MVC ). En este modelo el framework provee una clara separación en 3 capas, y la posibilidad de interactuar entre ellas. Teniendo estas separaciones será muy difícil para nosotros desarrollar de manera inadecuada, aunque he visto casos que al no entender el concepto igual logran hacerlo pero se dan cuenta rápidamente que hay algo mal.

En general los frameworks se encargarán de conectar a la Base de datos por nosotros,  se encargan que los datos sean accesibles por las vistas y algunos incluso nos facilitan la generación de código CRUD ( Create Read Update Delete ) para poner nuestra aplicación en marcha lo antes posible. Si tuvieramos que implementar esto por nuestra cuenta ( créanme tuve que hacerlo hace años atrás ) nos demoraríamos mucho tiempo y agregaríamos esa complejidad al desarrollo que tanto tratamos de ignorar. Teniendo esto en cuenta nosotros o nuestro equipo de puede enfocar simplemente en el desarrollo y éxito de la aplicación olvidándonos de desarrollo que cientos de personas ya han hecho por nosotros.

Hay dos frases que me gusta recalcar cuando hablamos de un framework :

  1. No reinventar la rueda
  2. Enanos parados sobre los hombros de gigantes. ( nanos gigantum humeris insidentes )

Ambas se refieren a lo lejos que podemos llegar basándonos en conocimiento ya escrito. ¡ Imagínense que sería de la física si tuviéramos que descubrir la ley de gravedad por cada científico que quisiera explicar por que una manzana se cae al piso ! Ahora piensa nuevamente por que quieres desarrollar algo que ya cientos de personas lo han hecho antes que tu, ¿ ahora suena más ridículo no ?

¿ Como elegir un framework ?

Les recomiendo que cumpla la mayoría de los puntos a continuación.

  • Que sea sencillo de utilizar. La idea es simplificar, no hacer más complejo el desarrollo.
  • Mejore el rendimiento de la aplicación. Muchos framework por ejemplo usan caché para mejor rendimiento.
  • Asegure seguridad. Esto es muy importante y es una de las mejores razones de usar el framework.
  • Separe el lenguaje de las vistas.
  • Ojalá sea Orientada a Objetos !
  • Habilidad de poder configurar
  • Que tenga buena documentación.
  • Que tenga una buena comunidad. La comunidad es la que te ayudará cuando tengas problemas.

 

Ok, espero que con todo lo anterior ya puedas decir que un framework si es necesario no importando el lenguaje que utilizarás. Yo hace un tiempo que uso Yii y me he estado portando a Yii2, cumple con todas las características que dije anteriormente y al parecer se ajusta muy bien a mi mindset, ahora la pregunta es ¿ cual framework usarás tu ?.

 

 

¡Mantengamos el contacto!

Me encantaría que te mantuvieras al día con el contenido que estoy generando. Recuerda que no es solo el blog, son las redes sociales, libros, y distintos pódcast 😎.

Hago todo lo posible para no hacer Spam,

¡MANTENGÁMONOS EN CONTACTO!

Me encantaría que te mantuvieras al día con el contenido que estoy generando. Recuerda que no es solo el blog, son las redes sociales, libros, y distintos pódcast 😎.

Hago todo lo posible para no hacer Spam,

Calcular la máxima cantidad de clientes en Apache2 /prefork

En general la forma de calcular cuanta gente puede acceder de manera concurrente a mi servidor web ( MaxClients ) es sencilla pero bastante manual. Encontré un script en la web de referencia que me puede ayudar a hacerlo de manera más práctica así que lo comparto.

Hace algunos años desarrollando un sistema de regalos corporativos fue la primera vez que me encontré con este problema, si está mal definida la cantidad máxima de usuarios que pueden acceder al apache este consume mucha memoria y en el caso de que tengas el servidor MySQL en el mismo lugar este puede caerse sin ningún aviso.

La idea es que podamos definir bien la cantidad de usuario que puede manejar apache.

Este es el procedimiento que seguiremos.

  1. Definir cantidad de usuarios que pueden acceder concurrentemente al sistema.
  2. Modificar apache para que pueda soportar esta nueva cantidad de usuarios.

Definiendo cantidad de usuarios que pueden acceder

Antes que todo debemos saber cuanta Memoria Ram ( no Swap ! ) tiene nuestro sistema. Eso lo podemos lograr con el comando «free -m«.

ubuntu@ip-10-10-10-69:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          7983       6620       1363         63        183       5584
-/+ buffers/cache:        852       7131
Swap:            0          0          0

En mi caso mi servidor tiene 8Gigas de memoria. Ahora debemos revisar cuanto ocupa Apache ( Ojo, pestaña y ceja, la idea es que apache ocupe la menor cantidad de recursos posibles, para ello puedes optimizar tu sitio con herramientas para el cache).

Para definir la cantidad de memoria que ocupa Apache usaremos un script que nos dice la cantidad de memoria utilizada por proceso llamado ps_mem.py.

Antes de ejecutar esta herramienta simularemos tráfico con BlazeMeter ( ¡La versión gratuita deberá ser suficiente por ahora !), que para mi es la forma más sencilla de simular el  tráfico.

Una vez simulado el tráfico, o durante el utilizamos el script.

ubuntu@ip-10-10-10-69:~$ sudo python ps_mem.py 
 Private  +   Shared  =  RAM used    Program

172.0 KiB +  28.5 KiB = 200.5 KiB    acpid
188.0 KiB +  17.5 KiB = 205.5 KiB    sh
188.0 KiB +  27.5 KiB = 215.5 KiB    atd
256.0 KiB +  54.0 KiB = 310.0 KiB    upstart-file-bridge
256.0 KiB +  54.5 KiB = 310.5 KiB    upstart-socket-bridge
288.0 KiB +  54.0 KiB = 342.0 KiB    cron
288.0 KiB +  79.5 KiB = 367.5 KiB    upstart-udev-bridge
484.0 KiB + 180.0 KiB = 664.0 KiB    su
560.0 KiB + 127.5 KiB = 687.5 KiB    systemd-logind
760.0 KiB +  48.5 KiB = 808.5 KiB    dbus-daemon
788.0 KiB +  67.5 KiB = 855.5 KiB    systemd-udevd
  1.1 MiB + 264.0 KiB =   1.3 MiB    getty (7)
  1.5 MiB +  58.5 KiB =   1.6 MiB    rsyslogd
  1.0 MiB + 659.0 KiB =   1.6 MiB    sudo (2)
  1.6 MiB + 106.5 KiB =   1.7 MiB    init
  1.7 MiB +  49.0 KiB =   1.8 MiB    screen
  2.1 MiB + 128.0 KiB =   2.2 MiB    sendmail-mta
  2.6 MiB +  17.0 KiB =   2.6 MiB    dhclient
  1.3 MiB +   2.1 MiB =   3.4 MiB    sshd (3)
  9.0 MiB +   1.2 MiB =  10.1 MiB    bash (6)
 23.8 MiB +  93.5 KiB =  23.9 MiB    miniserv.pl
102.7 MiB +   1.6 MiB = 104.3 MiB    ajenti-panel
129.6 MiB + 242.5 KiB = 129.8 MiB    mysqld
  1.6 GiB +  59.7 MiB =   1.7 GiB    apache2 (61)
---------------------------------
                          2.0 GiB
=================================

En este caso tenemos que el sistema está usando 2G en total de memoria en donde apache lidera el consumo con 1.7G y 61 usuarios concurrentes.

Para calcular la memoria de apache2 tomaremos las siguientes consideraciones.

  1. Cuanta memoria reservaremos para el sistema.
  2. Cuanta memoria usaremos para mysql.
  3. Cuanta memoria usa en promedio un cliente conectado.
  4. La diferencia entre la memoria disponible y la usada por los otros servicios es la que usaremos para apache.

Por ahora asumiré que ningún otro proceso correrá en el servidor, por lo que 256 megas será suficiente para el sistema.

Mysql usa menos del 10% de apache para 61 usuarios. Es razonable asumir que no pasaremos del uso de 1GB, por lo que usaremos esa cantidad.

Con 61 usuarios conectados el sistema usa 1.7GB de ram, lo que es aproximadamente 28 Megas por cliente conectado. ( En el peor caso. )

La memoria aproximada disponible son los 8Gigas menos 1GB de Mysql menos 256 megas en ram menos 256 megas en ram para tener un margen de error considerable. Esto nos da 6.5GB de ram aproximados disponibles.

6.5*1024/28 = 237

Lo anterior nos da 237 usuarios concurrentes. En mi caso lo dejaré en 250 debido a que la ram ocupada por usuario en general sera menor que los 28 megas y estoy usando un buen sistema de cache para mi sitio.

Configurando el servidor con los nuevos datos.

En general puedes encontrar el archivo de configuración en /etc/apache2/apache2.conf o /etc/httpd/httpd.conf. En mi caso usando Ubuntu Server 14.04 la dirección para configurar el prefork aparece en la carpeta de configuraciones /etc/apache2/mods-enabled/mpm_prefork.conf .

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxRequestWorkers: maximum number of server processes allowed to start
# MaxConnectionsPerChild: maximum number of requests a server process serves


<IfModule mpm_prefork_module>
StartServers       15
MinSpareServers    15
MaxSpareServers    20
ServerLimit       250
MaxClients        250
MaxRequestsPerChild  4000
</IfModule>

Ok, ahora tenemos un servidor configurado para alojar 250 usuarios de manera concurrente. ¡Al mejorar el rendimiento de apache en el consumo de memoria pueden ser mucho más !

Origen: Fuscata Consulting :: Knowledge Base :: How To Set MaxClients in Apache/prefork

¡Mantengamos el contacto!

Me encantaría que te mantuvieras al día con el contenido que estoy generando. Recuerda que no es solo el blog, son las redes sociales, libros, y distintos pódcast 😎.

Hago todo lo posible para no hacer Spam,

¡MANTENGÁMONOS EN CONTACTO!

Me encantaría que te mantuvieras al día con el contenido que estoy generando. Recuerda que no es solo el blog, son las redes sociales, libros, y distintos pódcast 😎.

Hago todo lo posible para no hacer Spam,

Usando Linux y el portal de MiPyme del Sistema de Impuestos Internos.

GUÍA PARA INSTALAR EL CERTIFICADO DIGITAL LINUX UBUNTU

Uno de los problemas que había tenido para no migrar todos los computadores de Windows a Ubuntu era el no poder usar este último para poder generar las facturas electrónicas con el portal de MiPyme del Sistema de Impuestos Internos. Había estado ocupando Virtual Box para hacer esto personalmente ya que Windoes dejó hace muchos años de ser mi Sistema Operativo principal.

Hoy ingresé al portal del Sistema de Impuestos internos y «descubrí»  un mensaje que anteriormente no había hecho. «Para firmar el documento desde sus sistema operativo debe de subir la llave al servidor» o algo similar …

Esto despertó un poco mi curiosidad y empecé a revisar un poco sobre este tema, usando Google pude encontrar la página del Sistema de Impuestos internos que describía el procedimiento para la instalación de la firma en Linux. La firma ya la tenía instalada así que simplemente la subí al servidor como decía el manual.

A grandes rasgos el procedimiento que te da el manual es el siguiente :

  1.  Instalar el certificado digital.
  2. Subir el certificado al servidor del servicio de impuestos internos.
  3. Inscribirte en el portal de MiPyme del SII
  4. Y finalmente generar la documentación.

En mi caso tengo un certificado digital simple que obtuve de la Cámara de Comercio de Santiago a través del portal de e-certchile y ya lo tenía instalado en mi navegador ( Firefox ). Puedes encontrar una lista de proveedores de certificados digitales en el siguiente link : https://palena.sii.cl/dte/mn_Prov_CD.html

También ya era usuario del portal de MiPyme por lo que simplemente me faltaba subir el certificado al servidor del SII y firmar un documento ( DTE ) de pruebas. En mi caso una factura electrónica.

Subí el certificado digital en la siguiente dirección : https://www4.sii.cl/uploadCertDigitalInternet/ y luego procedí con generar un DTE en el portal para probar. La felicidad me invadió al poder proceder sin problemas y poder generar la factura con la llave que subí al servidor. Simplemente me pidió la clave de la firma para proceder y todo funcionó de maravilla.

Debo de admitir que inicié muy feliz esta semana con esta noticia.  Les recomiendo leer el artículo del SII para la instalación de las llaves.

Origen: GUÍA PARA INSTALAR EL CERTIFICADO DIGITAL LINUX UBUNTU

¡Mantengamos el contacto!

Me encantaría que te mantuvieras al día con el contenido que estoy generando. Recuerda que no es solo el blog, son las redes sociales, libros, y distintos pódcast 😎.

Hago todo lo posible para no hacer Spam,

¡MANTENGÁMONOS EN CONTACTO!

Me encantaría que te mantuvieras al día con el contenido que estoy generando. Recuerda que no es solo el blog, son las redes sociales, libros, y distintos pódcast 😎.

Hago todo lo posible para no hacer Spam,

MysqlPasswordReset – Cambiar la clave root de Mysql

Acabo de crear un servidor WordPress con on click deployment de Google y tuve el problema que la clave que me dieron de mysql para root no correspondía a la real.

El error que obtenía era el siguiente :

ERROR 1045: Access denied for user: 'root@localhost' (Using 
password: YES)

Estos son simples pasos para cambiar la clave root de Mysql bajo un servidor linux si es que posees el error anteriormente mencionado.

Leer más

Share to...