Iloo

https://iloo.wordpress.com

Ruby on Rails: Simple Form, remover opción nula

Explicando un poco lo que sucede, si bien se tiene una colección de registro en un arreglo por ejemplo:

options = ["option1", "option2", "option3"].

Luego se genera el elemento en la vista:

= f.input :options_selected, as: :select, include_blank: false, collection: options, input_html: {multiple: true}

Si los elementos seleccionados son option1 y option3, la manera en que se almacena es:

["", "option1", "option3"]

Aun cuando se incluyo la opción include_blank se tiene un elemento nulo. Para solucionar esto es necesario agregar una opción mas, include_hidden, y el elemento seria:

= f.input :options_selected, as: :select, include_blank: false, include_hidden: false, collection: options, input_html: {multiple: true}

Y cuando se guarden las mismas opciones se almacenara sin el elemento nulo:

["option1", "option3"]

Desarrollo: Atom / Sublime Text / Brackets / VS Code

Al momento de escoger un IDE ligero y rápido se pueden encontrar estas cuatro alternativas, sin hacer un resumen demasiado detallado, haré mención de las características que me parecieron las mas importantes (pros y contras) en general de estos cuatro editores.

En primer lugar, fueron usados principalmente en:

  • PHP
  • Ruby on Rails.

Visual Studio Code

Creo que es el mas nuevo de los 4, ligero y con muchas extensiones (plugins), varias de estas para php y en especial para RoR (haml, coffeescript), algo que me llamo la atención es que solo se puede que trabajar en un proyecto, si se quisiera trabajar en mas de un proyecto, es necesario crear una carpeta y mover los proyectos a la carpeta creada.

Vs Studio Code

Atom

Una de las características unica de este IDE es el  manejo de dos temas, uno para editor y otro para el core, personalmente me parece que tiene demasiadas opciones para el desarrollo y le quita la esencia de ser un IDE sencillo y fácil de manejar.

Atom

Brackets

La cantidad de plugins es algo limitada, recién instalado no tiene varios detalles que ya se incluyen en los otros editores. El soporte para RoR igualmente se queda relegado creo que a dos o tres plugins.

Brackets

Sublime Text

Que decir de este editor, el mas completo sin duda, con una cantidad de plugins enorme, el único punto a tomar en cuenta seria a diferencia de los anteriores, no es gratuito, si bien hay un versión gratuita, este viene con una alerta que salta cada cierto tiempo, molesto sin duda.

Sublime Text

PHP: error al subir archivos por FTP

php-logo

 

En este caso las características son las siguientes:

  • Servidor CenOS 6 (origen).
  • PHP 5.5.
  • iptables activado.

El script (resumido) que se esta usando para subir el archivo es:

$connection = ftp_connect($hostname, 21);
ftp_login($connection, $user, $password);
ftp_put($connection, $ftp_path, $local_file, FTP_ASCII);

El problema es que el script se detiene en la tercera linea, no se corta ni muestra un mensaje de error y por tanto no se sube el archivo ni termina de procesarse todo el código.

El primer paso seria desactivar iptables y verificar el código:

service iptables stop

Y ahora si, el script funciona perfectamente.

En este caso el problema esta en iptables, probamos que activando el modo pasivo para ftp de la siguiente manera:

modprobe ip_conntrack_ft

Y volver a verificar el script, si funciona entonces agregar el modulo cada vez que se inicie iptables, editar el siguiente archivo:

nano /etc/sysconfig/iptables-config

Y agregar el modulo propiamente dicho:

IPTABLES_MODULES="ip_conntrack_ftp"

Y reiniciar el servicio:

service iptables start

 

PHP: tips, limpiar el codigo

0fd309979dce4933f1ae8fc364a9febe

Si bien los mensajes de tipo warning o notice no causando problemas “reales” en el funcionamiento de una aplicación o al menos la mayoría piensa eso, la realidad es que si causan problemas y bastante serios.

En primer lugar para cualquier aplicación se tiene que habilitar el registro de logs, la importancia de eso lo dejo para otro post, cuando este archivo es demasiado grande (experiencia propia) ocasiona que el servidor y por tanto la aplicación funcionen mas lentos de lo normal. A demás es una de las razones para el famoso 500 Internal Server Error.

Algunas alertas comunes son las siguientes:

PHP Notice: Undefined index: var1 in …

Obviamente se esta buscando el index en un array o una variable enviada por get o post que no existe.

por ejemplo este error se reproduciria de la siguiente manera:

$var_array = array('var2' => 2, 'var3' => 3);
echo $var_array['var1'];

O el mas común que el archivo espere recibir datos enviados mediante get o post y que estos no hayan sido enviados. Por ejemplo:

if($_GET['var1'])
  echo 'yes';

Si var1 no fue enviada por el método get en este caso produciría la alerta.

Para esto es mejor verificar antes si la variable esta “seteada”

if(isset($_GET['var1']) && $_GET['var1'])
  echo 'yes';

PHP Notice: Undefined variable: var2 in …

Muchas veces vi que código de esta manera:

if ($a == 1)
  $b = 2;
echo $b;

Pero en el caso que la variable $a sea igual a 2 entonces la variable $b nunca seria inicializada, una solución es definir la variable antes:

$b = 0;
if ($a == 1)
  $b = 2;
echo $b;

Esto también pasa cuando se usa un array sin haber sido inicializado, por ejemplo:

foreach($orders as $order)
  $var_array[] = $order;
print_r($var_array);

La solución seria tan simple como definir la variable antes de usarla.

$var_array = array();
 foreach($orders as $order)
 $var_array[] = $order;
print_r($var_array);

PHP Notice: Use of undefined constant var3 – assumed ‘var3’ in …

Este es un clásico, la regla es: si el index de un array es un entero no se necesita comillas, si es una cadena si necesita comillas.

echo $array[0]; // bien
echo $array['0']; // bien
echo $array['index']; // bien
echo $array[index]; // MAL

PHP Notice: A session had already been started – ignoring session_start() in …

Si la sesion ya ha sido iniciada no es necesario volver a iniciarla. Si uno no esta seguro de haber iniciado la sesión mejor verificar antes de iniciarla:

if(!isset($_SESSION)) 
  session_start();

Estos son algunas sugerencias para arreglar y limpiar los warnings y notices en el log de php.

Web Applications Security: Coteor (2)

Yendo un paso más allá, teniendo el acceso al modem, también se puede ver la línea telefónica  a la que pertenece la red wireless:

coteor4

Coteor usa la línea telefónica como el username, por tanto se puede conocer la dirección exacta de donde se encuentra la red wireless, para esto se puede buscar en la guía telefónica o usar el servicio que provee www.oruroweb.com.

Una vez teniendo las direcciones, mediante el API de Google maps se puede señalar donde se encuentra cada red, aquí un pequeño ejemplo de algunas redes disponibles:

coteor5