lunes, 21 de noviembre de 2016

Android Http peticiones con variables muy largas en post se truncan


Problema: Cuando realizamos peticiones Http estas se truncan a un numero si no mal recuerdo a 2000, no importa el numero, el hecho es que las cadenas te las trunca al menos en las peticiones post, donde se suelen enviar cadenas largas de datos, esto es comun en consumo de Web Services Restful.

Solución: Por ejemplo si estamos usando la librería HttpClient de Apache, lo que debemos hacer es enviar la siguiente cabecera Http, aqui el codigo:




cl = new DefaultHttpClient();

post = new HttpPost("http://www.dominio.com");

post.setHeader("Content-Type", "application/x-www-form-urlencoded");


Nota: Esta es una entrada de una serie que constituirá una base de datos de soluciones a problemas con los que me ido encontrando como desarrollador, en diferentes tecnologías como PHP, JS, Android, Swift, Python, etc. Espero que también sea de utilidad para otros colegas. Aqui esta la pagina con el indice que iré actualizando.

domingo, 20 de noviembre de 2016

Plugins indispensables para Atom, que todo desarrollador web debe tener

Bueno esta es una recopilación de plugins que uso con Atom, el cual es mi editor definitivo, pienso que son indispensables para todo desarrollador Web, seguramente conocen muchos o conocen algunos mas, aquí van:

Autocomplete-PHP: Mas descriptivo que su nombre no puede ser, este plugin nos ayuda a autocompletar código PHP.

Color-Picker: Nos desplegara un selector de color, en los códigos CSS, evitando tener que apañarnos con otros malabares.

File-icons: este sencillo plugins nos pintara un icono por cada tipo de archivo (CSS, PHP, JS, etc.) dándonos una referencia visual mas cómoda y rápida para ubicar nuestros scripts.

Git-time-machine: Este maravilloso plugins nos abrirá en la parte inferior (alt+t) una linea del tiempo con los cambios que ha sufrido un archivo, siempre que tengamos Git en nuestro proyecto, mostrándonos las diferencias.

Goto-definition: Este plugin nos permitirá buscar la definición de una función en nuestro proyecto, muy útil para encontrar los métodos de nuestras clases en proyectos complejos, como por ejemplo un proyecto con diseño MVC donde podríamos estar usando un método de un modelo dentro de un controlador, ubicar lo sera mas fácil con este plugin

Highlight-line: Este plugin podría parecer inútil, pero nos facilitara bastante nuestro quehacer pues nos indica la linea actual donde se encuentra el cursor, algo que no hace Atom por defecto ¡muy raro!

Highlight-selected: Con el podremos ver resaltadas todas las coincidencias a lo largo de nuestro script de aquella palabra que hayamos seleccionado con doble clic, bastante útil.

Jquery-snippets: Nos ayudara a usar la famosa librería Jquery de una manera mas productiva.

PHP-Linter: este plugin corrige errores de sintaxis que podamos cometer mientras escribimos código, depende del plugin linter, como nota adicional para usuario Linux, si al princicipio no funciona o roja un error el plugin, puede ser porque tenemos instalado algún todo en uno como xampp, por lo que para solucionarlo habremos de crear un enlace simbólico en /usr/local/bin que apunte a nuestro binario PHP que usualmente esta en /opt/lampp/bin/

Minimap: Este plugin crea un mini mapa que nos ayuda a tener una referencia visual de nuestro código a través nuestro script, algo que yo he encontrado ya indispensable en mi trabajo, ya no puedo codificar de otra forma, me siento perdido sin este plugin.

Php-twig: Nos permite utilizar la sintaxis de Twig.

Pigments: colorea códigos de colores en HEX que usamos en los CSS.

Todo-Show: Muestra los todos (pendientes) al oprimir las teclas Alt+Shift+T. lo hace  en diferentes niveles, Script, Carpeta, Proyecto.

Este es especifico para desarrolladores que usan Codeigniter.

Codeigniter: Una serie de snippets que nos ayudan a escribir rápidamente código para este framework.


Saludos y felices codigos.

Atom, plugin php-linter no funciona o arroja error al iniciar

Problema: Para los usuario Linux que instalaron un todo en uno como Xampp y no el stack convencional, este instala el binario usualmente en la ubicación /opt/lampp/bin por lo que el plugin intenta llamar al binario php el sistema lo intenta localizar en /usr/local/bin

Solución: crear un enlace simbólico, abrir una terminal y teclear:



sudo ln -s /opt/lampp/bin/php /usr/bin/php


Nota: Esta es una entrada de una serie que constituirá una base de datos de soluciones a problemas con los que me ido encontrando como desarrollador, en diferentes tecnologías como PHP, JS, Android, Swift, Python, etc. Espero que también sea de utilidad para otros colegas. Aqui esta la pagina con el indice que iré actualizando.

domingo, 14 de agosto de 2016

Google ¿Perfecto?

No pero casi…

Todos los informáticos sabemos que Google esta rodeado de un halo de perfección que nadie o prácticamente nadie pone en duda, bien ahora les pondré la prueba de no es perfecto y que como todos comete errores.

Esta imagen fue tomada el 7 de julio del presente año y prueba que Google no revisa sus códigos jeje, todos los que conocen PHP sabrán que el trozo de código que exponen en la siguiente documentación tronaría como chinampina (disculpen la mala calidad de la imagen)






Fuente:  https://developers.google.com/api-client-library/php/guide/aaa_idtoken

jajaja ya se que es una nimiedad, es que no tenia nada mejor que hacer XD, algo de humor no viene mal.

Felices códigos.

domingo, 19 de junio de 2016

Opera esta de regreso?

Muy probablemente …

Hablare de algo un poco off-topic, se trata de mi navegador favorito, bueno de nuevo favorito jajaja, Opera. Seguramente a estas alturas todos saben de este navegador, pues de hecho no conozco programador, administrador de sistemas, administrados de bases de datos, etc. que no conociera este legendario navegador, parece ser el conocido de todo los profesionales de la rama informática.

No es para poco, pues ya todos sabemos su historia, por años marco el ritmo, marco la tendencia, Opera decía y todos los demás obedecían. Creo que esta ademas mencionar cuales hitos hicieron a los navegadores modernos lo que son y que se lo debemos a Opera. Cuando los responsables de este navegador anunciaron que abandonaban Presto para sumarse al barco de Webkit con Chrome a la cabeza, mas de uno pegamos el grito en el cielo y no fue exageración, pues sabíamos exactamente lo que eso significaría, Opera se estanco, paso ser uno mas.

 




Pero parece ser que lo tenemos de vuelta, hace unos días apareció una actualización con un par de características que si bien no son lo non plus ultra, si marcan desde mi punto de vista personal, el deseo de Opera por volver a ser el protagonista, por recuperar la vieja gloria. Las dos características de las que les hablo es de un ad-blocker, espera… ¡pero los ad-blocker ya vienen existiendo desde hace mucho! si pero no built-in esto le permite usarse también en la version para teléfonos ademas de que hizo la navegación un poco menos molesta y un poco mas rápida. La segunda característica que me pareció bastante útil (esto dependerá totalmente de cada persona) es la capacidad de ver videos, por ejemplo de youtube, en una ventana flotante y continuar navegando.

Bueno, pues en conclusión espero que esto sea el comienzo de parte de Opera para volver a sorprendernos con sus hitos históricos.

Saludos y felices códigos.

viernes, 22 de abril de 2016

Swift y la comprensión de listas

cada vez mas enganchado a este lenguaje

Ultimamente he estado sumergido en Swift, aprendiendo este nuevo y maravilloso lenguaje, como ya sabemos, Swift es el nuevo lenguaje de Apple, el cual fue inspirado por varios lenguajes, entre ellos Python. Como seguramente ya sabrán, una de las características que mas suelen ser útiles en Python y otros, es la comprensión de listas, pero nada como un ejemplo practico. Pueden usar un playground en Xcode para seguir estos ejemplos.

Primero partamos de una clase persons y un array de instancias de esta.

class person {
    var name = ""
    var age = 0
   
    // construct
    init(name:String, age:Int) {
        self.name = name
        self.age = age
    }
}

let persons:[person] = [person(name: "Ivan", age: 29),
                        person(name: "Rodrigo", age: 28),
                        person(name: "Juan", age: 15),
                        person(name: "Pedro", age: 10),
                        person(name: "Antonio", age: 18),
                        person(name: "Jose", age: 12),
                        person(name: "Ruben", age: 25)]


En Python estamos familiarizados con sintaxis como la siguiente:

minors = [ x for x in persons if p.age < 18 ]

En Swift podemos hacerlo por medio de las clausuras, usando la función filter de la siguiente forma:

let minors = persons.filter { $0.age < 18 }

Otro ejemplo para aclararlo aun mas, con la función map podemos incluso interactuar con el resultado:

let adults = persons.filter({ $0.age > 17 }).map({ $0.name + " Y es mayor de edad" }) // agrega la leyenda al nombre de los mayores de edad




Si bien la sintaxis no es tan clara como en Python, si que es posible y el poder alcanzado con Swift es asombroso. Hasta la próxima y

Felices códigos.

martes, 5 de abril de 2016

Conversor Divisas MX

Presentando mi primera app en iOS, toda una odisea subir la app, pero al fin lo logre :)

La publicacion en la AppStore esta pendiente.

Por cierto que ya tambien esta publicada la version para android, aqui:
https://play.google.com/store/apps/details?id=ivansoftmx.conversordivisasmx

A su vez esta es la agina de soporte para esta app, cualquier comentario es bienvenido aqui.

Saludos.

sábado, 19 de marzo de 2016

Programación orientada a protocolos

La nueva apuesta frente a POO

Todos conocemos a estas alturas en que consiste el paradigma de programación orientado a objetos, pero y el ¿orientado a protocolos? pues bien este nuevo paradigma fuertemente implementado en Swift el nuevo lenguaje de Apple, trae una serie de mejoras, digamos que es la “siguiente versión”, la evolución de la orientación a objetos ¡ya se habían tardado!. La orientación a objetos tiene algunas carencias, pero vayamos al grano a ver en que consiste este nuevo paradigma y en que se diferencia de la orientación a objetos.

Como sabemos la orientación a objetos no es mas que un modelo de abstracción, igualmente la orientación a protocolos, la diferencia importante consiste en que en orientación a objetos una variable guarda la dirección de memoria donde esta el objeto y cualquier nueva asignación solo copia dicha dirección y aumenta las referencias a este objeto, en Swift no sucede así, pues cada nueva asignación copia al objeto ¿Como lo lograron? básicamente sustituyeron clases por structs, al hacer esto se adquirió la “naturaleza” de los structs que principalmente consiste de las siguientes características:
1.- Son tipos de datos por valor y no por referencia.
2.- No necesitan inicializar sus propiedades cuando se crea su implementación.

¿Pero si los Structs no soportan herencia como accederemos a la abstracción? ¡a través de protocolos!

Los protocolos solo definen los métodos y propiedades que deberá tener nuestro struct, pero no incluye su implementación (el cuerpo del código) al igual que en las interfaces, con esto podemos crear cualquier estructura que adopte un protocolo y proporcionar un código diferente para cada método dentro de cada struct que creemos, algo parecido a un override de un método padre en el hijo, solo que aquí todos funcionan al mismo nivel.

Lo anterior nos trae un problema, ¿Debo implementar el código de cada método en cada struct que cree? ¡vaya avance, si parece que retrocedimos!. Es que esto no termina aquí, lo siguiente es el concepto de extension de protocolo, lo que hacen las extensiones no solo es indicar que métodos y propiedades han de incluirse por defecto si no también la implementación (el cuerpo del código), lo que hará que el código se “replique” en todos los structs que adopten un protocolo, por supuesto que podemos sobre escribirlos a nuestro gusto y lo útil en esto es que no es necesario incluir las propiedades y métodos implementados en la extension si no que son opcionales para cada adopción. Ademas a partir de Swift 2 se agrego un concepto un poco mas avanzado, la implementación de genéricos a través de la instrucción where, lo que permite acotar las extensiones a un determinado tipo de dato. Con esto tenemos cubierto perfectamente, el equivalente a la herencia, pero con un montón de nuevas posibilidades que no nos permite la orientación a objetos.

Para dejarlo mas claro, nada como un ejemplo practico, la siguiente url apunta a un blog donde se expone perfectamente:


 https://medium.com/ios-en-español/programación-orientada-a-protocolos-122f0bfa3cbf#.t9g4iqb6u

Como pudieron comprobar, este nuevo paradigma es muy potente aunque requiere cambiar un poco la forma de pensar. 


Hasta la próxima y felices códigos.

domingo, 6 de marzo de 2016

Xcode 7 cambiar la fuente a un textview

Bueno ahora les traigo este video, donde se muestra como cambiar la fuente a un textview cuando no es seleccionable ni editable, esto en xcode 7. Espero les sea de utilidad:



El código fuente es:

Swift 2
textview.selectable = true
textview.font = UIFont(name: "Papyrus", size: 18.0)
textview.selectable = false



Objective-C
[self.textView setEditable:YES];
[self.textView setFont:[UIFont fontWithName:@"Papyrus" size:16.0f]];
[self.textView setEditable:NO]; 


Saludos y felices codigos.

sábado, 27 de febrero de 2016

Atom el editor definitivo

o algo parecido

Pues ahora quiero compartirles una “pequeña” reflexión, les hablare de Atom un editor de código que me encanto, decidí darle una oportunidad y sencillamente para mi desbanco a Sublimetext no solo porque tiene una interfaz mas pulida, mas elegante, mas refinada, mas bonita, “mas mejor” jajaja. Para mi el pequeño pero gigantesco detalle, fue que cuando recién lo instale y abrí unos scripts que tenia para probarlo, este me mostró el split que hace del área de trabajo, si bien es cierto que Sublimetext hace esto también y muchos editores mas también, el hecho de que me mostrara esta capacidad recién instalado fue lo que me me hizo decantarme por Atom, pues esta técnica la ignore por mucho tiempo y luego llega este editor y de la mano me mostró el poder de esta sencilla pero poderosa idea.

Pero Atom no solo es split, también tiene cosas muy interesantes como la capacidad de indicarte con un código de colores, las lineas y archivos que acabas de modificar o

atom editor definitivo
agregar, su integración con git es fantástica para quienes usan de forma extendida este sistema de versionado, Atom tiene un instalador muy simple de usar que no requiere de ser instalado como en Sublimetext 2, un par de cosas que se echan de menos en Atom, son el minimap y el resaltado de palabras que se hayan seleccionado con doble clic, algo que resulta extremadamente útil, puedes hacer esto con la instalación de dos simples plugins, minimap y highlight-selected. En fin este editor es una excelente apuesta de la cual no se van a arrepentir, lo pueden descargar en su pagina oficial ah! y no se pierdan el video que tienen ahí, esta genial.

 https://atom.io/

Solo hay un pequeño problema con este editor, lo he visto en Linux al menos en Ubuntu, y es que genera una pequeña área totalmente transparente en la esquina inferior derecha que no permite interactuar con el apuntador del mouse en dicha área de la pantalla, un bug raro, pues al estar basado en webkit (chrome) afecta a este navegador. En fin espero no haberlos aburrido con mi rara reflexión jajaja, fue un ínter de tiempo y en preparación para otros post que estoy planeando con mas contenido, estoy intentando reanimar este blog, que si bien no tiene muchos lectores, es un espacio para escribir, que es algo que me gusta hacer :-)

Felices códigos y hasta la próxima.

lunes, 1 de febrero de 2016

¿Mac mini una mala opción? el punto de vista de un desarrollador

El Mac mini, sus características y otras cosas mas…

Después de pensarlo bien decidí entrar al mundo del desarrollo de software en Apple, así que mi reticencia a gastar en una marca que hasta hace poco consideraba bastante mala, me impulso a buscar la opción mas barata, pues no quería asumir mucho riesgo y esa en definitiva es el Mac mini. Debo reconocer que me equivoque en varios aspectos sobre Apple, aunque creo seguir teniendo razón en otros. Y es que casi en todas partes aseguran que las Mac mini son malas y pésimas compras.

Pues bien su relación precio/hardware es muy mala ¡pero eso es así en todos los modelos de Apple!. Es así el caso del equipo que adquirí, una Mac mini de gama media, con un hardware bastante pasado de años, un procesador que salió en 2013 para un equipo adquirido en diciembre de 2015, un disco duro de 1Tb a 5400 rpm. Para fines comparativos, mi PC adquirida en mediados de 2014 tiene un procesador AMD de igual o mejor desempeño que el Intel i5 que equipa el Mac mini, ademas mi PC tiene un disco de estado solido de 120Gb y un disco duro de 512Gb a 7200 rpm, ambos tienen la misma cantidad de RAM 8gb a 1600Mhz, mi PC tiene lector de CD, ademas y a pesar de que el procesador AMD tiene gráficos integrados por mucho superiores a los gráficos Intel iris del Mac, logre adquirir una gráfica dedicada, que según los benchmark triplican en desempeño a los del Intel iris que equipa la Mac y todo esto por la mitad de lo que me costo la Mac mini, mas claro ni el agua. Por supuesto hay que considerar otros factores muy importantes, mi PC es ensamblada NO es de marca y eso reduce muchísimo los costos, como son las licencias de software, en el caso de la Mac es su sistema operativo. En ambos casos solo estoy hablando de los gabinetes. Aunque eso si, algo a favor del Mac es su miniaturizaron y portabilidad pues cabe sobradamente en una mochila o en un portafolios, eso ni por asomo logra mi PC y ninguno otro.



Punto a parte, es muy molesta la cantidad de “candados” para evitar que una vez adquirida una Mac mini de X características, no puedas hacer mucho para expandirla, el procesador y la memoria RAM están soldados, el disco duro esta escondido y tienes que hacer malabar y medio para cambiar el obsoleto disco duro por uno de estado solido, desde comprar des armadores torx, así como improvisar algunas herramientas y seguir con mucho cuidado algún tutorial para llegar al escondido disco duro y cambiarlo, previamente habiendo clonado el disco, aunque eso si una vez hecho este cambio, la diferencia es muy notoria.

Lo anterior nos lleva a otro punto, hay quienes afirman que es el peor Mac de la manzanita, pero esto es incorrecto, si bien Apple nos tiene acostumbrados a que mas caro mejor, no es así el caso de las Mac mini con respecto a otras, en el caso de un Mac mini de gamma media revisando las características de otros Macs, en procesador, RAM y gráficas supera y/o iguala a las Mac book y Mac air (exceptuando el apartado de gráficos en las air) así como a las mas básicas de Mac book pro y iMac, todas estas notablemente mas caras, la ventaja de las mini radica precisamente en que si tienes ya el monitor, teclado y mouse, ahorras.



Pero Mac no es solamente hardware, ¡es mas que eso!, la historia ha demostrado que Apple es mas una empresa de software que de hardware, sus productos son exitosos por la experiencia de usuario, una de ellas es la experiencia “Out of the box” que en verdad es buena y es aquí donde entra en materia el enfoque de un programador. El objetivo inicial de mi compra era aprender a programar en esta plataforma y nunca había tenido tan agradable experiencia, instalar el entorno de desarrollo es tan simple como instalar una app de la AppStore y listo, ya en una anterior entrada había hablado de esto y lo vuelvo a reiterar, Xcode es una herramienta increíblemente bien lograda, la comodidad y simplicidad alcanzada en el entorno de desarrollo de Apple es simplemente canon y cátedra para el resto, esa es la verdad y mas ahora con el recién llegado Swift, un lenguaje que sin duda es de lo mejor que hay. Eso es lo que debe interesar a un desarrollador, centrarse en su trabajo y despreocuparse por su plataforma, centrarse en el modelo de negocio, el cliente paga por soluciones no por lineas de código ni por que tan complejo te resulto poner a punto tu entorno de desarrollo o su implementación, eficiencia y simplicidad se traduce en dinero.

En conclusión por el costo, ademas considerando la membresía anual de $99 y si es que se tomaran algunos cursos que son costosos, Mac mini es la opción inteligente para un programador que quiere ingresar al mundo del desarrollo en Apple y que ademas comprende que se trata de una inversión, por tanto calcula un determinado retorno, entre menos dinero invierta sin que se vea afectado este retorno, mejor, pues sus rendimientos serán mayores.

Finalmente un programador iOS es en promedio mejor pagado (siendo empleado) y sus apps mejor pagadas (siendo freelance) que los demás. Según estadísticas, Google play tiene mas apps y registra mas descargas que la App Store, pero irónicamente esta ultima tiene mayor capitalización y la razón es muy obvia, Apple a logrado capturar un mercado notablemente mas pudiente en términos económicos que el de Android y el resto, por tanto hay un fuerte incentivo para desarrollar en esta plataforma.

 

Felices códigos.