Mostrando entradas con la etiqueta evolución. Mostrar todas las entradas
Mostrando entradas con la etiqueta evolución. Mostrar todas las entradas

viernes, 4 de enero de 2013

VIM - Personalización y Adiciones

Después de cierto tiempo usando VIM como mi editor de texto me ha parecido conveniente crear un artículo para aquellos que estén dispuestos a experimentar un poco con este editor. Y para otros con recursos limitados en una máquina en que el usar nuestro IDE favorito puede resultar tedioso o bien solo les interesa aprender al usar VIM, este artículo puede resultarles de interés.

El gran potencial de vim reside en la posibilidad de extender su funcionalidad o bien el uso correcto de las funcionalidades que ya integra. Para cada tipo de necesidad existe una funcionalidad o un complemento que puede satisfacerla. Así pues, podemos pasar de nuestro aburrido y simple editor a un IDE bastante completo que trabaja en la linea de comandos.

Veremos como pasar de un uso simple del este potente editor, a uno que integra características de un IDE, como explorador de archivos, explorador de código, listado de archivos recientes, múltiples pestañas, resultados de búsqueda, linea de comandos integrada, temas de colores, reconocimiento de sintaxis, auto-completado, división de espacio de la ventana y más.


Funcionalidad Integrada


Aunque en las versiones que he conocido VIM cuenta con opciones para integración con el ratón, este es un editor en que suele usarse el teclado como principal o único medio de entrada. Así que la mayoría de la información que encuentren estará orientada al uso del teclado, esto lo hace que si pretendemos usarlo como IDE veremos que tendremos que deberemos acostumbrarnos un poco más al uso del teclado.

Vim es un editor modal, lo que significa que se puede trabajar en diferentes modos para realizar una tarea determinada. Para ver en qué modo se encuentra Vim se debe de tener activada la opción showmode. Pueden obtener más información acerca de los modos y algunas características leyendo la Wiki - Vim (http://es.wikipedia.org/wiki/Vim).

La verdad es que no hay mejor manera de iniciar que experimentar nosotros mismos con el editor así que les dejare algunos enlaces donde podrán encontrar información para su iniciación con vim.

Vim, el editor de texto (http://tuxfiles.wordpress.com/2012/01/17/vim-el-editor-de-texto/) es un post para que inicien con el manejo elemental del editor. Acá se muestran algunos de las operaciones elementales, como navegar (h,j,k,l), insertar (i), reemplazar (r), borrar (d,dd), copiar (y,yy), agregar nuevas linea antes (o, O) y después de la posición actual, búsqueda y reemplazo dentro de un archivo.

Notaran que algunos de los comandos tienen versiones cortas que pueden usarse con una linea mediante la repetició del comando (yy, dd, cc) por ejemplo copiar borrar y cortar.

Graphical vi-vim Cheat Sheet and Tutorial (http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html) acá encontraran una guía visual de iniciación con vim las imágenes suelen ayudar mucho.

Finalmente esta guía de referencia rápida que pueden imprimir les sera de mucha utilidad mientras memorizan los comandos básicos. Todo está bien explicado, es una guía de referencia muy clara. Una vez dominado lo elemental pueden tener la sensación de que ya están quedando algo limitados pero verán que este editor tiene aun mucho que ofrecerles.

Yo siento cada vez más que este editor tiene una o varias soluciones a las necesidades que se me presentan en el camino, algunas de las cosas que verán adelante las he descubierto por mi cuenta, otras por lo que me preguntan algunos compañeros que quieren iniciar con vim, cosas que luego termino usando. Lejos de pretender ser una extensa guía quiero que se animen a continuar descubriendo su potencial por cuenta propia.

Es molesto tener que abrir múltiples ventanas de la terminal para editar múltiples archivos a la vez, pueden hacer esto con vim usando tabs. Con el siguiente comando pueden abrir múltiples archivos en pestañas separadas.

vim -p file1 file2 file3

Una ves dentro del editor, descubrirán la forma de listar, navegar, mover y buscar una pestaña en particular.

tabs, tabedit, tabnew, tabm, tablist

moverse entre pestañas puede parecerles un misterio pero pueden usar tabfirst, tablast, tabnext, tabprevious en modo comandos para ir a la primer, ultima, siguiente y anteriores pestañas. También pueden usar las combinaciones gt, gT, gt + tab_number  para ir a la siguiente y anterior o bien una pestaña especifica.

Luego de las pestañas podemos aprender a dividir la ventana actual en múltiples partes de forma vertical u horizontal, esto puede resultar de utilidad si contamos con espacio suficiente y queremos inspeccionar múltiples archivos o el mismo archivo en diferentes puntos. Por acá les dejo un enlace a un artículo muy bueno que trata de ello. [Vim Splits: A Guide to Doing Exactly What You Want](http://technotales.wordpress.com/2010/04/29/vim-splits-a-guide-to-doing-exactly-what-you-want/)



La búsqueda a través de múltiples archivos es algo que es frecuente realizar en proyectos con un numero considerable de archivos fuente. Podemos hacer esto con los comandos vimgrep y cw combinados.

:vimgrep /busqueda/j ./directorio/**/*.tipoarchivo | cw

esto realiza una búsqueda en todos los archivos de un tipo dado dentro de un directorio específico y muestra los resultados en un split en la parte inferior pueden obtener mas información sobre estos comandos usado la ayuda del VIM seguramente encontraran muchas opciones útiles.

Extensiones útiles


Ademas de la funcionalidad integrada VIM dispone de una gran cantidad de extensiones útiles de las que podemos hacer uso para facilitar nuestro trabajo. Hablaremos de algunas cosas que todos debemos tener a mano un explorador de archivos, explorador de etiquetas, lista de tareas historial de archivos recientes, entre otros.

Most Recently Used (MRU) files: esta extensión permite llevar un historial de los archivos accedidos que se despliega en una ventana temporal y nos permite desplegar el archivo seleccionado en la ventana actual, una pestaña o división nueva. Es posible personalizar la longitud de la lista, el tipo de archivos a incluir o excluir, el cierre automático del la ventana auxiliar y otras.

Tag List: este complemento permite explorar de forma eficiente el código fuente de archivos de diferentes lenguajes de programación. En el manual de este complemento [Tag List Manual](http://vim-taglist.sourceforge.net/manual.html) seguramente encontraran muchas opciones para personalizarlo a su gusto.

NERDTree and tabs: [NERD tree](https://github.com/scrooloose/nerdtree/blob/master/doc/NERD_tree.txt) permite explorar el sistema de archivos, el cual se muestra en forma de un árbol, y abrir archivos o directorios por medio del teclado o ratón, además permitir realizar acciones básicas sobre el sistema de archivos. [NERD Tree Tabs](https://github.com/jistr/vim-nerdtree-tabs) permite convertir el explorador de archivos en un verdadero panel independiente de la pestaña y mantener sincronizado el árbol a través de las pestañas.



Existen muchos otros complementos para completado, GIT, terminal, libro de notas, gestión de sesiones, comentarios. Con algo de curiosidad y un archivo .vimrc pueden ir "enchulando" su VIM y convertirlo en un verdadero IDE con una ligereza sin igual.


Un toque personal



Ahora nos falta darle un toque personal a nuestro editor con algunos temas de colores, es posible crear sus propios esquemas de colores. Pero para aquellos que nos hemos aventurado en ello no tendremos que crear uno, podemos elegir entre los muchos esquemas disponibles.


 

 







Ya sea de la pagina oficial de VIM ORG

[vim.org](http://www.vim.org/scripts/script_search_results.php?&script_type=color%20scheme&order_by=rating&show_me=20&result_ptr=0)

O bien desde este repositorio en que pueden encontrar muchos esquemas de colores.

[Vim colorschemes](https://github.com/flazz/vim-colorschemes)

Espero que este post les sea de utilidad y los insto a utilizar VIM como su editor e IDE, y que "sean uno con su código".

viernes, 11 de noviembre de 2011

PHP 5.+ el C++ de la web

Me parece una analogía interesante este título, porque C++ es uno de los lenguajes de programación mas extendidos de geográficamente hablando y en lo que a usos y aplicaciones compete. Casi cualquier software que podamos imaginarnos que utilizamos hoy guarda alguna relación con este lenguaje. Esto es porque compiladores, interpretes, maquinas virtuales, frameworks o sistemas operativos esta desarrollado usando C, C++ o algún descendiente o derivado de estos.

Pero el objetivo no es hablar de C++, hablaremos de PHP. Entonces ¿porque la analogía? se preguntaran algunos. Pues básicamente porque PHP es el lenguaje más extendido en la web. Cuando el internet era como el viejo oeste, antes de que se descubriera el oro en el, PHP hacia su debut en este terreno. La evolución de PHP me parece un tanto curioso ya que nace para la web y luego se va convirtiendo en un lenguaje de propósito general. Casi la mayoría de los lenguajes de programación ha seguido un curso inverso al de PHP, desde lenguaje de propósito general hasta desarrollar extensiones o versiones para web. Mucho de lo que se usa en la web esta escrito en parte en PHP, entre esto encontramos paneles de administración, clientes de bases de datos, clientes de correos, servicios de datos, gran parte de nuestras páginas favoritas, CMS, etc.. para darnos una idea.

Un dato curioso

Casi siempre que me encuentro con un viejo desarrollador que programa con PHP noto en el una cierta resistencia al uso de las nuevas características del lenguaje. Las encuentra poco relevantes o simplemente no esta interesado en ello. Es como si para ellos el tiempo se hubiese congelado en la evolución de este lenguaje, y avocan siempre por sus ancestros menos evolucionados. Pues les tengo una noticia, la extinción es algo inminente, porque es el curso que toma todo en el mundo, desde los seres vivos hasta la tecnologías se ven relegados por sus versiones mejor adaptadas, y el rechazar esta realidad nos convierte en parte del conjunto destinado a extinguirse. No digo que no haya que saber de lo que precede a lo actual, "nunca hay que olvidar de donde se viene", pero al igual que la vida en nuestro entorno de trabajo no podemos vivir en el pasado mientras el mundo exterior continua su marcha.


Continúan las semejanzas

Dirán algunos ¿en que se parece PHP a C++? Pues les diré que tienen algunas características comunes. Ambos soportan programación procedimental, funcional y orientado a objetos, aunque hay diferencias en la forma en que implementan la orientación a objetos dado que este desarrollo de PHP se ha visto más influenciado por lenguajes como Java. Al igual que C y C++, PHP cuenta con un gran conjunto de librerías y extensiones para todo tipo de interacciones, servicios web, interacción con el shell del sistema operativo, manipulación de archivos, edición de imágenes, tratamiento y manipulación de cadenas y más.

Creo que una de las grandes ventajas de en lo que a funcionalidad se refiere es el número de librerías para interacción con bases de datos. En este sentido el desarrollo de PDO puede darle una ventaja más en esto al pasar de muchos controladores para cada SGBD a una capa de abstracción de acceso a datos más ligera y fácil de implementar para cada manejador, es lo que JDBC en Java, provee por ahora menos funciones pero permite una interacción mas limpia y resulta fácil de migrar. Algunos aducirán que MDB solucionaba esto, pero esto es algo que no es un script es parte del lenguaje en si mismo, así que dejemos de intentar reinventar la rueda.

Otras de las similitudes es que PHP esta disponible en casi todas las plataformas, puede bien ser usado como interprete o como modulo con un servidor web entre estos IIS y Apache. es decir que pueden correr sus programas en donde sea. Gracias a algunas extensiones es posible programar aplicaciones de escritorio utilizando PHP GTK.

El soporte para programación orientada a objetos es relativamente reciente, en las últimas versiones estables disponibles, estas características están bastante maduras. Aunque para aquellos que conocieron como se trabajaba con clases y objetos ne la versión 4 se darán cuenta de que es algo muy distinto en versión 5 o superior. Pero no es mi objetivo mostrar acá las nuevas características del lenguaje, es mejor si eso lo investigan uds. mismos consultando el manual siempre disponible en php.net. Hablaremos sin embargo de algunas de las características y tecnologías prometedoras y algunos buenos y malos hábitos.



Dejando los malos hábitos


Otras de las semejanzas PHP - C++ es que si no se tienen buenos hábitos de programación y codificación, y no suele documentar mucho su código, el mantener y depurar un programa o modulo puede resultar una tarea infernal. Para los que han trabajado con C o C++ se darán cuenta de que muchos de los errores provienen de aspectos mal gestionados o no gestionados por el programador como la memoria, los tipos de datos, lo valores contenidos en  las variables en un momento dado y otros. En PHP se tienen casi una cantidad de problemas semejante, el hecho de que PHP sea un lenguaje débilmente tipado conlleva una cantidad de problemas con ello, es una arma de doble filo.

Por ejemplo, si bien puedo utilizar una variable para contener distintos tipos de dato al realizar operaciones con la misma necesito validar el tipo de dato contenido, su previa declaración y existencia, para saber si es posible o no aplicarle o utilizarla con una función en particular. Igualmente el retorno de funciones y métodos no tiene un tipo especifico, si lo tiene. con lo que no se puede tener certeza del resultado o del valor retornado, si se desea utilizar posteriormente. Existe ademas una cierta cantidad y tipos de errores que pueden producirse en tiempo de ejecución que no causan un termino o la no ejecución de un bloque de código, lo que puede resultar en que se llegue a un resultado no deseado o se desencadene un error que se pueda frenar la ejecución.

Análogo a los punteros de C++ en PHP el uso extensivo de matrices es uno de sus grandes potenciales y también una de los grandes problemas, por falta de una correcta gestión. Debemos tener presente siempre que en entornos de producción hay limites a la cantidad de memoria disponible, aunando a esto el uso incorrecto de las claves se pueden llegar a tener muchos problemas al usar matrices. PHP no es Fortran en lo que a gestión de matrices y potencia de cálculos vectoriales se refiere, pero cuenta con una gama de funciones bien surtida para la manipulación, búsqueda y ordenación ser refiere.

Otra mala práctica, remanente en unos pocos programadores, es el embeber html  u otro código dentro del script php. He dicho embeber html en el php y no embeber php en el html que resultan dos cosas diferentes, algo que algunos terminan confundiendo. El embeber es una práctica que debe limitarse al mínimo posible. No solo porque no es "elegante", sino porque ya hay motores de plantillas más o menos maduros que facilitan esto, porque facilita el dar mantenimiento al código y separar nuestras capas de datos o modelo de negocios de nuestra capa de presentación, hace mas simple los desarrollos futuros.

Debemos aprender a escuchar y poner en práctica las recomendaciones de Zend y la comunidad de desarrolladores. Si una función esta obsoleta, créalo es obsoleta y use el reemplazo. Si se dicen que una determinada variable es el remplazo de otra úsela en sus programas. Si esta usando una versión de PHP no intente hacerlo funcionar como una versión inferior a menos que sea absolutamente necesario. Al menos lea las referencias de funciones, novedades y diferencias de la versión que utiliza. Usemos las cosas para lo que son y como debe ser, las expresiones booleanas deben recibir valores o expresiones booleanos, los que lo hacen saben de lo que les hablo, usar variables no definidas, con valores nulos, numéricos o de cadena cuyo valor pueda ser evaluado como booleano. Se deben usar los tipos de dato correctamente, validar o forzar su tipo si es necesario y evitar las asignación de datos de otro tipos en esas variables. Debe tenerse presente la versión para la que se esta escribiendo el código. A partir de PHP 5 existe un nuevo nivel de error E_STRICT que incluye tipos de errores de tipo estricto de la versión esto puede ayudarnos a detectar y corregir aquellos segmentos en que estamos usando código no acorde a las últimas versiones estables, también esta disponible la función version_compare que algunos herramientas CASE incluyen en el código generado para validar la ejecución del en dependencia de la versión del interprete.

Aprendamos a trabajar con objetos, como debe ser. No mezcle sintaxis de versiones diferentes.  Establezca el tipo de objetos en los argumentos de los métodos. Saquemos provecho real de características como la visibilidad, la unificación de constructores y los métodos especiales, asignemos los valores por defecto a los parámetros que puedan ser opcionales. Dejemos de usar los objetos como arreglos, prácticas como la asignación y uso de atributos no declarados no son recomendables. Procuremos mantener separadas nuestras capas de presentación, modelo de negocios y acceso a datos. Saquemos máximo provecho de los paradigmas de programación soportados por el lenguaje utilizando el tipo adecuado al contexto o problema solucionar.

Buenas prácticas

Finalmente creo que estos dos lenguajes (PHP y C++) si tienen varias similitudes, no solo en los problemas que se presentan al programar con ambos, sino también en las bondades que cada uno provee. PHP es un lenguaje con gran potencial, pero al igual que las demás cosas creadas por el ser humano todo depende del uso que se le de. Con el Objetivo de que mejoren en los aspectos que necesiten les dejo un par de enlaces donde pueden explorar las mejoras prácticas que cada quien puede usar en sus proyectos o en su estilo de programación. Mejores prácticas de desarrollo en PHP, Guía de buenas practicas en PHP, Manual de phpDocumentor, Zona PHP - ¿Qué esperar de PHP 5 ?.