martes, 6 de agosto de 2019

Django ipdb with docker-compose

Algunas veces necesitamos hacer debug sobre una aplicación corriendo en Django en docker-compose. Por defecto ipdb.set_trace() o breakpoint() no funciona, para hacerlo funcionar debemos hacer lo siguiente:

Para habilitar el modo interactivo debemos añadir stdin_open y tty al docker-compose.yml.

Por ejemplo:
version: "3"
services:
  app_tests:
    build: .
    stdin_open: true
    tty: true
    command: ./run_my_tests.sh

Ahora cuando corras tests con tu máquina en docker-compose se va a detener al momento que encuentre un ipdb.set_trace() o breakpoint()
Como ultimo paso solo falta usar el comando de docker attach <container id> con esto estaremos conectados al proceso que corre dentro del contenedor y podremos interactuar con el proceso.

Nota:
Si queremos obtener el id del contenedor debemos correr docker ps
Si queremos desconectarnos del contenedor sin detenerlo debemos usar Ctrl+pCtrl+q

sábado, 19 de mayo de 2018

uWSGI limite de conexiones simultaneas

Cuando una aplicación posee gran numero de visitas, o de personas conectándose al mismo tiempo. Puede suceder que lleguemos al limite de conexiones simultaneas que posee uWSGI. Esto puede pasar también si en algún momento reiniciamos el servicio de uWSGI y hay mas de 100 personas esperando para conectarse, las primeras 100 serán atendidas pero las otras van a recibir un error del proxy. Cuando suceda este tipo de errores en el log vamos a ver un mensaje similar a este:

uWSGI listen queue of socket "0.0.0.0:xxxx" (fd: 6) full


Esto es debido a que uWSGI posee un limite de 100 conexiones simultaneas por defecto, este limite viene asi porque cada sistema operativo trae un limite de conexiones simultaneas, por lo general en Linux el limite por defecto es de 128 conexiones simultaneas por puerto.

¿Como podemos solucionar este error de uWSGI?

Para empezar antes de aumentar este limite, primero debemos chequear el tiempo que esta tomando uWSGI antes de dar una respuesta al usuario. Que no haya ningún bloqueo en la base de datos ni nada similar que este retrasando el tiempo de respuesta de la aplicación, no debemos aumentar este limite ciegamente y debemos chequear bien antes de modificar este limite.

Cuando estemos seguros de que el problema es causado por el numero de personas intentando conectarse a nuestra aplicación, debemos primero aumentar el limite de conexiones del sistema operativo. En el caso de Linux podemos revisar este limite en /proc/sys/net/core/somaxconn, y modificarlo cambiando el archivo o ejecutando sysctl -w net.core.somaxconn=1024. Si estamos usando docker podemos agregar como parametro con --sysctl net.core.somaxconn=1024 o si es con docker compose:
sysctls:
  net.core.somaxconn: 1024


Después de ajustar el limite del sistema operativo solo debemos debemos aumentar el limite añadiendo el parámetro --listen donde n es el numero máximo de espacios.

miércoles, 18 de enero de 2017

Android Dotted Vertical Line

To draw a vertical dotted lines in android using shapes. You can use the following code:

Dotted.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:right="-3px"
        android:bottom="-3px"
        android:top="-3px">
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">

            <stroke
                android:width="2px"
                android:color="@color/negro"
                android:dashGap="2px"
                android:dashWidth="3px" />
        </shape>
    </item>

</layer-list>


Layout

<ImageView
    android:id="@+id/dotted"
    android:layout_gravity="center"
    android:src="@drawable/dotted"
    android:layout_width="4dp"
    android:layout_height="match_parent"
    />


Result:

domingo, 2 de octubre de 2016

Nuevas caracterizticas en Codeigniter 3

La última versión estable 3.0.3 fue liberado el 31 de de octubre de 2015 (hace ya algún tiempo), pero no había hablado de ella. Así que quiero dejar mis comentarios. Una de las cuestiones mas importantes es el cambio de la licencia de MIT. Las nuevas versiones de CodeIgniter 3.0 se licenciaban bajo una licencia de BSD Apache . Esto significa que ahora se puede utilizar, combinar, copiar, modificar, publicar, distribuir y sub licenciar. Pero no se puede cambiar algunos de los archivos (* MY_).

Cambio de la versión PHP

Ahora requiere minimo PHP 5.2.4, aunque es recomendado usar PHP 5.4 o más nuevo.

Default driver para la base de datos

Ahora Codeigniter 3 cambio el drives para conectarse a la base de datos por 'mysqli' el antiguo driver quedo deprecado.

Actualizado y mejorado el soporte MIME

La lista es bastante larga de los tipos de archivos que se le a añadido soportate por codeigniter:


  • Añadido soporte para pem, p10, p12, p7a, p7c, p7m, p7r, p7s, crt, crl,rsa, der, kdb,sst, cer, csr Certs en mimes.php.
  • Añadido soporte para pgp, gpg, zsh and cdr archivos en mimes.php.
  • Añadido soporte para 3gp, 3g2, f4v, vlc , mp4, wmv Video archivos en mimes.php
  • Añadido soporte para m4a, xspf, au, aac, m4u, ac3, flac, ogg, wma archivos de audio en mimes.php.
  • Añadido soporte para kmz and kml (Google Earth) files, ics Calendar files, and rar, jar y 7zip archivos en mimes.php.
  • Codeigniter 3 a añadido soporte tambien a xml, xsl, doc, docx, php, zip y csv archivos en mimes.php

Output Minification

Nueva librería Output library tiene la función de minificar Javascript, CSS ae inclusive el HTML. Esta echa para compactar el codigo HTML,incluyendo cualquier linea JavaScript y CSS contenida dentro del archivo ayudando a ahorrar muchos bytes de data y mejorando la velocidad de descargar y analisis del navegador.

Minifying HTML Output

Para remover los espacios inútiles del código HTML, solo debemos modificar la configuración en config.php editamos minify_output, lo colocamos como true y listo.


$config['minify_output'] = TRUE;

Minifying JS/CSS

Para minificar CSS o JAVASCRIPT, solo necesitaras incluir dentro del controlador de Assets, o otra manera de hacerlos es manejar tus assets y mostrarlos no como archivos estáticos. Esto lo puedes hacer por que la clase Output tiene un método minify.

$css = $this->output->minify($style_content, 'text/css')
$scripts = $this->output->minify($script_content, 'text/javascript');

Si la configuración minify_output es TRUE, entonces cualquier contenido mostrado con la clase OUTPUT con alguno de los siguientes MIME sera minificado antes de ser enviado al navegador.
  • text/html
  • text/css
  • text/javascript
  • application/javascript
  • application/x-javascript

Nuevas opciones de routeo.

Hay dos opciones nuevas añadidas al area de routeo.

Callbacks

Si estas usando PHP 5.3 o mayor, tu puedes usar funciones anonimas para manejar las rutas similar a:

$route['pagina/(:any)'] = function ($page_slug) {     get_instance()->load->model     $data = array(         'page'  => get_instance()->page_model->find_by_slug($page_slug)     );     $this->load->view('page_wrapper', $data); };

Metodos HTTP  (GET, PUT, POST, etc)

Ahora puedes usar especificos HTTP-verb en especificas rutas en tu archivos routes.php, sin ningun tipo de caminos verdes. Esto es particularmente util cuando estas ahciendo un API Rest. Tu puedes usar metodos HTTP, propios o estandares, añadiendo el verbo al final de la ruta como un array hacia tu ruta. por ejemplo:

$route['products']['put'] = 'product/insert';

Codeigniter a echo multiples de pequeños cambios para volverse más eficiente y para mejorar la funcionalidad. 


Muchos mejoras en las conexiones a la base de datos a través de los drivers. 
Muchos cambios en las librerías ya existentes, como añadir la nueva librería de encriptación que reemplace todas las funciones inseguras que tenia la vieja. 
hay muchos cambios y actualizaciones en codeigniter si quieren ver la lista completa pueden verla aquí.

Si crees que me falto algo. Escribe lo en los comentarios. Saludos...

viernes, 3 de junio de 2016

Bases de Datos en Android, aumentando la velocidad de las inserciones.

La pantalla de inicio de una aplicación Android estaba demasiado lenta en el arranque, porque descargaba unos 900 sitios en la base de datos SQLite al comenzar la activad. Yo estaba haciendo una gran cantidad de inserciones SQL, con el propósito de llenar una tabla para poder tener la información disponible de manera offline. Buscando una solución encontré por internet el uso de transacciones explícitas en SQLite para aumentar la velocidad de la inserción en la tabla.

La lista que estaba insertando en la tabla contenía 900 sitios, que debían ser insertados en la base de datos, para después ser ubicados en el mapa. y el tiempo que tomaba era de 16 segundos. Este era mi código inicial:


public void createSites(List<Site> objs) {
    for (Site obj : objs) {
        ContentValues values = obj.getContentValues();
        long insertId = db.insertWithOnConflict(database.TABLE_TYPEPENDING,null,values,SQLiteDatabase.CONFLICT_REPLACE);
    }
}

Después de añadir transacciones explícitas en SQLite, el tiempo paso a menos de un segundo, y la información estaba disponible mucho más rápido.

public void createSites(List objs) {
    try {
        //Inicio la transacción
        db.beginTransaction();
        for (Site obj : objs) {
            ContentValues values = obj.getContentValues();
            db.insertWithOnConflict(database.TABLE_TYPEPENDING, null, values, SQLiteDatabase.CONFLICT_REPLACE);
        }
        //Marca la transacción actual como exitosa
        db.setTransactionSuccessful();
    }catch (SQLException e) {
        Log.e(toString(),"Sql error");
    } finally {
        //Termina la transacción
        db.endTransaction();
    }
}

sábado, 5 de marzo de 2016

Como conectar a Android con ADB sobre TCP?

Desde una computadora, si tienes el USB conectado

La forma más sencilla de conectarse mediante WIFI al teléfono, es si ya tienes el teléfono conectado a la pc con USB. Desde una linea de comandos en la computadora, tienes que escribir los siguientes comandos:

adb tcpip 5555
adb connect <IP Telefono>:5555

Asegurate de reemplazar correctamente la ip del telefono que actualmente tiene tu dispositivo.

Descubrir la ip manualmente:

Ve a la configuracion wifi de android, click en el boton de menu en la barra de aciones, as click en avanzado y mira la ip al final de la pantalla.




Usar adb, para descubrir la IP:

Ejecuta los siguientes comandos por adb

adb shell ip -f inet addr show wlan0
To tell the ADB daemon return to listening over USB
adb usb

Proceso manual, desde el telefono (SI el telefono esta rooteado)

Tu puedes habilitar la conexión ADB sobre WIFI desde el dispositivo si tu telefono esta rooteado.

su
setprop service.adb.tcp.port 5555
stop adbd
start adbd


Lo puedes desabilitar con los siguientes comandos:

setprop service.adb.tcp.port -1
stop adbd
start adbd

viernes, 18 de diciembre de 2015

Packt Publishing todos los libros a 5$

A partir del 17 de diciembre 2015 en el Año Nuevo, Packt Publishing está invitando a todo el mundo de la tecnología para explorar su extensa biblioteca de libros electrónicos y vídeo cursos por un precio increíble. Cada eBook y Vídeo que Packtpub ha creado alguna vez estará disponible por sólo $ 5!