jueves, 24 de julio de 2025

KivStore: Biblioteca ligera de Kotlin que simplifica el trabajo con DataStore de Android



SharedPreferences no se recomienda usar por Google por ser bloqueante, no contar con type safety y disponer de un manejo de errores deficiente, en su lugar tenemos a DataStore, y bueno en tiempos donde lo que se tenía era SharedPreferences utilice la librería KotPref, la que proporcionaba un manejo práctico y además agregaba soporte para LiveData. Dicho esto y para proporcionar una migración super fácil me decidí por desarrollar lo que he llamado KivStore.

KivStore es una librería que envuelve a DataStore simplificando su uso, proporciona una api con seguridad de tipos basada en delegados, esto facilita la gestión de datos y observadores de tipo Flow y LiveData.

Todo es tan simple (Como con KotPref, ya que está inspirado en dicha librería), tan solo debemos crear nuestro modelo:


Y listo, ya podemos usarlo en nuestros proyectos:


Así mismo la reactividad, el observar valores es muy sencillo:

Con Flow:

Con LiveData:


Pero sobre todo hay que destacar que la librería mantiene en memoria los datos que se usa, así estos se mantienen actualizados y se sirven al instante, al mismo tiempo que se persisten.

Ya está perfecto, todo bonito, pero como lo instalo y configuro en mi proyecto?

También es sencillo, se instala a través de JitPack:


Y agregamos la dependencia:

implementation("com.github.darkzyrb.kivstore:kivstore:v1.8.1")
// Mirar en el repositorio la última versión

Luego se inicializa en el Application de tu proyecto:


Y listo, creas tus modelos y voila.

Más información en el repositorio: https://github.com/DarkzyRB/kivstore

viernes, 20 de junio de 2025

Soporte de tipos Double para SharedPreferences en Android Studio Kotlin (Y librería KotPref)

Hace poco implemente un flujo de datos de tipo Flow desde un source de datos (y consecuentes capas) hasta la vista de un composable en Android, y pues requería datos de tipo Double por su precisión en una de las propiedades del modelo, desde hace un tiempo vengo usando kotpref que es una excelente librería para el manejo de datos en local con SharedPreferences, el caso es que este no proporciona soporte para tipos Double, claro, porque directamente SharedPreferences no te da el soporte para ello, así que desarrolle la extensión para dicha librería.

Pero vamos por pasos, la raíz del tema es SharedPreferences, entonces debía soportar de forma limpia aquello, y pues la manera eficiente es usando bits, lo que guarda tal cual el contenido que es lo que deseamos, luego lo recuperamos como un double, peeeeeero como nos gusta la funcionalidad y usabilidad creamos la extensión para SharedPreferences primero:

De esta manera ya podemos y con confianza almacenar y recuperar de forma “nativa”:

preferences.putDouble(key, value)

preferences.getDouble(key, defaultValue)


Así que ya podemos continuar con el desarrollo de la extensión para Kotpref, comenzando con extender AbstractPref que es propia de la librería de Kotpref, y sobrescribimos sus métodos:

Y ahora los métodos de acceso:


Y voila, espero les sirva, dejo el link del repositorio de la extensión en cuestión:

https://github.com/darkzyrb/kotpref-extensions/tree/master/double-pref

domingo, 8 de junio de 2025

Ya era hora, WhatsApp para iPad oficial liberado

Era sumamente raro no encontrar la app nativa de WhatsApp en el iPad, pero después de tantos años, lama, nieve, sol y lluvía la han liberado, que me siento feliz? nah, bueno si un poco, (Uso más telegram pero igual me cae bien la noticia).

Como dije raro que una app diseñada específicamente para dispositivos móviles no dispusiera de una versión nativa para iPad, por ahí dicen las malas lenguas que Meta si cumple (Je je je), pero bien, que es lo que tenemos en esta versión:


  • Interfaz adaptada al iPad, con soporte para pantallas grandes y multitarea (Split View, Slide Over).  

  • Sincronización independiente: Funciona sin necesidad de tener el iPhone conectado.

  • Llamadas y videollamadas: Soporte para audio y video en alta calidad.  

  • Notificaciones en tiempo real: Igual que en el móvil.  

  • Cifrado de extremo a extremo: Lo mismo que en todos lados.  


La aplicación ya está disponible en la App Store y es compatible con iPads que ejecuten iPadOS 15 o superior. El proceso de configuración es sencillo, explicaría el tema de configuración y cómo descargarla pero eso ya lo saben.

Pero… Y por qué tardó tanto en liberarse? A diferencia de Telegram o Signal, que llevaban años con apps nativas para iPad, WhatsApp había priorizado su desarrollo en móviles y ordenadores, según fuentes internas el retraso se debió a desafíos técnicos en la sincronización multidispositivo (Pero, pero, pero...), que ahora han sido resueltos con la infraestructura mejorada de Meta.  

Cabe mencionar que aún no soporta temas personalizados ni accesos directos con el Apple Pencil, pero no se descarta que pronto lleguen incluidas en nuevas actualizaciones.

Por lo pronto a disfrutar de una versión que debió llegar hace mucho.


martes, 3 de junio de 2025

Solución al control de velocidad de ventiladores de tarjetas Nvidia en Ubuntu 22.04 LTS

 


Hace poco instale Ubuntu 22.04 LTS en uno de mis equipos, dicho equipo dispone de una Asus ROG STRIX RTX 3070, todo excelente en cuestiones de rendimiento hasta que... Me dio por revisar la configuración de NVIDIA X Server Settings y algo no estaba bien, la temperatura de la GPU se elevaba demasiado, así que decidí mirar a través del cristal del case y voila, los ventiladores estaban apagados.

Como todos busque información y soluciones en ChatGPT y DeepSeek, ambos me dieron respuestas similares, que re instalación de drivers, configuración xorg, etc, etc, etc. Que lo único que hicieron fue dar dolores de cabeza y empeorar el problema.

Y pues bueno me fui por la antigua, a buscar en Google, entre varias respuestas y comparando errores de la consola dí con esto:


sudo vim /etc/X11/Xwrapper.config

Luego agregar esta linea:


needs_root_rights=yes

Esta linea debe ir antes de allowed_users=console, de manera que queda así:


needs_root_rights=yes
allowed_users=console

Ahora se debe reiniciar y ya tienes el control de la velocidad de los ventiladores de tu RTX a través de la interface de configuración de Nvidia o mediante comandos. Y pasa que el problema se da por permisos en x11, lo que impide la modificación, a buena hora se resuelve así.

Ojo! Esto es usando X11 aclaro, espero esto les ahorre dolores de cabeza.

lunes, 2 de junio de 2025

Time Machine (Apple, Mac)

 


Time machine es de esas cosas que todos necesitamos pero no todos lo sabemos o conocemos, lastimosamente es algo que solo encontrarás en equipos Mac (Y sus variantes), a mi personalmente me ha salvado la vida, por ejemplo cuando me quede sin espacio en mi MacBook y requerí aumentarlo cambiando el M2 integrado, conectar un SSD externo para respaldar toda mi Mac fue de alivio, bueno es una costumbre para muchos sobre todo en el mundo del desarrollo, donde pese a contar con Git un backup local se hace necesario, pero Time Machine va más allá, porque te respalda absolutamente todo, TODO, de manera que al instalar el MacOS en la nueva M2 del equipo y restaurar TODO con el Time Machine la maquina quedo justo como estaba antes, era la misma con todos mis archivos, programas y configuración completas, pero ahora con muchísimo más espacio.


No me queda más que decir, gracias Time Machine!!


Y claro, no solo uso Mac, también utilizo Ubuntu, y pues indagando se que ahora se puede hacer lo mismo usando un par de herramientas, de las que debo documentar su uso en estas memorias, como no!


Gracias por leer un poco mi frustración y alivio.

lunes, 26 de mayo de 2025

DeepSeek / ChatGPT


Cuando apareció DeepSeek fue el boom, y cabe resaltar que su lógica de respuesta me pareció muy decente, lo poco que me contesto en las pruebas que hice fueron satisfactorias, bien estructuradas, muy similar a ChatGPT (Quizás mejor en dicho tiempo), no podía decir que era mejor o peor puesto que sufría problemas de saturación por la inmensa cantidad de usuarios. 

Han pasado meses desde entonces y la magia se ha desvanecido, al menos un poco diría yo, las respuestas siguen siendo buenas pero persiste el delay y ya poco frecuente pero aún presente el "The server is busy, Please try again later", el caso es que en el uso diario hasta el día de hoy ChatGTP ha mejorado mucho, dando mejores respuestas y agregando opciones, y me refiero a su versión gratuita, DeepSeek es bueno, pero no le he visto mejoras desde que lo probé hace ya unos meses.

Como es común en estos temas, hay que darle tiempo al tiempo y seguir usando ambos en las diferentes tareas.


miércoles, 31 de enero de 2018

Instalación de MariaDB en OSX High Sierra

Por las mejoras que supone MariaDB frente a MySQL y además del “escándalo” por formar parte ahora de Oracle me decidí a instalar y usar MariaDB en los proyectos futuros, además de las respectivas migraciones a otros ya establecidos, sin más el proceso de instalación:

En consola ingresamos el siguiente comando:


brew install mariadb
photo_2018-01-31_13-11-31

El servidor lo arrancamos con:


brew services start mariadb

Lo detenemos con:


brew service stop mariadb

Y bueno estando el servidor iniciado entramos a explorar, el comando en consola es el mismo que mysql:


mysql -u root

Notese que no ingrese el password, por defecto esta sin el, por lo que toca agregarle uno con el siguiente script dado por el mismo MariaDB:


/usr/local/bin/mysql_secure_installation

Lo primero que nos pregunta es el password actual, el cual obviamente no tiene así que solo damos enter, seguido nos pregunta si deseamos establecer un password para el usuario root, y vaya que si queremos, ingresamos el password que deseamos y luego lo confirmamos, el resto de preguntas se responden según las preferencias de cada usuario.

photo_2018-01-31_13-37-49

Y listo ya podemos trabajar con nuestra DB, todo es similar a MySQL por lo que no tendremos problemas al migrar o utilizar las herramientas a las que estamos acostumbrados.

photo_2018-01-31_13-41-56

Saludos!

jueves, 12 de enero de 2017

Respaldar y restarurar MongoDB en Ubuntu Server

Asumiendo que ya tienen el servidor activo de MongoDB vamos a proceder con los pasos respectivos para realizar el respaldo y restauración de nuestra base de datos:

Respaldo:

Ante todo necesitamos un directorio de almacenamiento, yo he creado el siguiente:

/home/backup_mongo

Resta decir que debemos situarnos en nuestro directorio de respaldo:

# cd /home/backup_mongo/

Y una vez ubicados en el sitio indicado procedemos a ingresar el comando para realizar el backup:

# mongodump --db nombre_base_de_datos --username tu_usuario --password tu_pass

Y suficiente, con ello se creara un directorio llamado "dump" conteniendo otro directorio con el nombre de nuestra base de datos y su respectivo contenido.


Restauración:

Primero es conveniente parar el servicio de MongoDB:

# service mongod stop

Nos situamos en nuestro directorio de respaldos e ingresamos el siguiente comando:

# mongorestore --db nombre_base_de_datos dump/nombre_base_de_datos

Y listo, se ha restaurado nuestra base de datos, saludos!

miércoles, 11 de enero de 2017

Bienvenido Open Live Write

Open-Live-Writer

Hace unos días buscaba una herramienta de escritorio que me facilite la tarea de publicar en mi blog, mi tiempo es bastante limitado pero se que estas memorias me sirven de ayuda, a mi y a otras personas que se topen con los mismos problemas.

El caso está en que busque un sin-numero de opciones y la mayoría no satisfacía mis necesidades, hasta que di con Open Live Write, un programa Open Source que solo te cuesta unos cuantos segundos para descargarlo y te da la facilidad de publicar contenido a tu blog de una forma más ágil.

El único problema es que solo está disponible para Windows (hasta donde se) y los que usamos Mac no se que alternativa tan eficiente y gratis tenemos, por lo pronto usaré este programa en Windows.

Saludos.

martes, 10 de enero de 2017

Instalación de módulo php para MongoDB (Ubuntu 14.04)

Para iniciar con el uso de  MongoDB con PHP es requerido instalar su respectivo módulo (como con todo), para ello agregamos el repositorio:


sudo add-apt-repository ppa:chris-lea/mongodb-drivers

Actualizamos:


sudo apt-get update

E instalamos el módulo:


sudo apt-get install php-mongodb

Y listo, revisamos en nuestro info.php y deberíamos ver los siguiente:

php-modulo-mongo-db

Ya con esto podemos trabajar con nuestras clases php en MongoDB

miércoles, 2 de noviembre de 2016

Solucion al problema de dependencia con GoogleMaps en iOS con Swift

Me tope con este error siguiendo la guia de instalacion del SDK de GoogleMaps para iOS:

"The dependency `GoogleMaps` is not used in any concrete target."

Eh indagando en la web y di con esta solución que me fue efectiva:

  1. Eliminar el archivo Podfile.
  2. Desde la consola ir a la ruta del proyecto.
  3. Escribir el comando "pod init".
  4. Escribir el comando "open -a xcode podfile"
  5. El comando anterior el archivo Podfile creado en el x-code, agregamos estas lineas al final:
    source 'https://github.com/CocoaPods/Specs.git'
    pod 'GoogleMaps'
  6. Grabamos el archivo Podfile.
  7. Vamos a la consola y escribimos el comando "pod install"
  8. Disfrutar de GoogleMaps.
Espero les sea de ayuda, saludos.

lunes, 18 de agosto de 2014

Solución a Error en Maverick: Command failed with rc=65536 python and mod_wsgi

EL modulo WSGI nos permite correr django desde Apache por lo que es muy importante su instalación, en OSX suele darnos problema instalar este modulo, y habiendo sido victima de uno de estos problemas y tras varios intentos y lecturas de otros blogs he logrado instalar WSGI en mi iMAC:

Cuando salta este problema es debido a que por alguna razón la ubicación de /Applications/Xcode.app/Contents/Developer/Toolchains/OSX10.8.xctoolchain/ es /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain por lo que basta crear un link simbolico para solucionar nuestro problema:

$ sudo ln -s /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/ /Applications/Xcode.app/Contents/Developer/Toolchains/OSX10.9.xctoolchain

Y con ello podemos seguir con make y make install, en unos segundos tendremos listo el modulo WSGI en nuestro Apache.

Espero está solución les sea útil.

Saludos.

martes, 12 de noviembre de 2013

Comprimir y descomprimir archivos mediante consola Ubuntu

Consola o terminal, como lo deseen llamar, el caso está que en ocasiones nos es necesario comprimir o descomprimir archivos usando esta potente herramienta, ya sea por que resulta mas rápido o por ser el único entorno disponible (como en los servidores), y pues bien aquí va la forma de hacerlo:

Comprimir:

$ tar -czvf nombre_archivo_salida.tar.gz directorio_o_archivo

Ese sencillo comando nos mostrará lo que se esta añadiendo (gracias a -v) y comprimirá el directorio o archivo que especifiquemos.

Ahora bien el proceso de descompresión es similar (obvio verdad?):

$ tar -xzvf nombre_archivo_a_descomprimir.tar.gz

Y listo nuestro archivo se descomprimirá, sencillo y muy util.

Saludos.

domingo, 21 de julio de 2013

Crear lanzador (acceso directo) de Android Studio en Ubuntu

Como todos sabemos, Android Studio no es necesario instalarlo en Ubuntu, simplemente se descomprime el paquete descargado desde el sitio oficial y se lo hace correr desde consola llamando al archivo studio.sh ubicado en la carpeta bin, pero suele ser molestoso  tener que abrir la consola para ejecutar el IDE, así que la manera mas rápida y fácil es hacerlo desde el lanzador de Unity, y es muy fácil agregarlo.

Primero abrimos la consola y digitamos lo siguiente:

$ sudo gedit /usr/share/applications/eclipse.desktop

Esto obviamente abrirá el gedit y en el ingresamos:

[Desktop Entry]
Name=Android Studio
Comment=Android Studio IDE
Exec=/home/tu_usuario/android-studio/bin/studio.sh
Icon=/home/tu_usuario/android-studio/bin/idea.png
Terminal=false
Type=Application


Cabe aclarar que donde dice "tu_usuario" me refiero a que debes reemplazar aquello por tu nombre de usuario, y pues yo decidí descomprimir el paquete de Android Studio en mi carpeta de usuario por lo que le di esa ruta en el archivo desktop, si descomprimiste en otro lado, debes dar la ruta adecuada.

Luego grabamos, reiniciamos Nautilus y en el buscador ya encontraremos a nuestro Android Studio, por lo que podemos añadirlo al lanzador de Unity o donde queramos.

Saludos.

viernes, 5 de julio de 2013

Instalación de Apache, PHP y Mysql en OSX (X Lion)

Usualmente por desconocimiento decidimos bajarnos el paquete XAMPP para poder desarrollar en OSX, sin embargo nuestro sistema operativo ya viene por defecto con el Apache y PHP instalado (fabulosamente), por lo que solo queda iniciarlo y hacer una que otra configuración desde la terminal para empezar a trabajar:

Apache:

Iniciamos: sudo apachectl start
Paramos: sudo apachectl stop
Reiniciamos: sudo apachectl restart

( Por si no lo sabias para estar evitando digitar sudo en cada comando, puedes correr en consola con privilegios root con esta linea: sudo su)

PHP (Activar soporte):

Editamos el archivo httpd.conf (/etc/apache2/httpd.conf) con nano o vi, según prefieras, buscamos la siguiente linea y la descomentamos (quitamos el #):

#LoadModule php5_module libexec/apache2/libphp5.so

Grabamos los cambios y procedemos a reiniciar el Apache.

Ruta http root por defecto:

En Linux estamos acostumbrados a la ruta /var/www/, pues bien en OSX es diferente, la ruta por defecto es:

/Library/WebServer/Documents/

Pero es muy fácil cambiarla y así ajustarla a nuestras preferencias, para ello en el archivo httpd.conf (/etc/apache2/httpd.conf) reemplazamos la linea:

<Directory “/Library/WebServer/Documents”>

por: <Directory “/Users/tu_usuario/carpeta_que_desees”>

Obviamente reemplazamos "tu_usuario" por el nombre de usuario de tu equipo y "carpeta_que_desees" por la carpeta que previamente hayas creado para usarla como root http.

En realidad puedes darle la ruta que se te ocurra, eso si, no olvides cambiar los permisos de la carpeta para que no hayan problemas.

MySQL:

Lastimosamente MySQL no viene incluido en el sistema por lo que será lo único que deberemos instalar, y para ello nos descargamos el DMG de MySQL desde:

http://dev.mysql.com/downloads/mysql/

Cuando le des click al paquete se abrirá una ventana con tres instaladores:
  • Mysql5.5.(version).pkg
  • MySQLstartupitem.pkg 
  • MySQLPrefPane
Y pues instalamos las cosas en ese orden, el primero es el server, lo segundo lo que permitirá que se inicie MySQL al arrancar el sistema, y por ultimo el panel de control que se agregará a Preferencias del Sistema para arrancar o parar el server.

Una vez listo, podemos iniciar el servidor desde el Panel de Preferencias, luego ejecutar unos cuantos comando en la consola para que todo marche en orden:

Agregamos la ruta al Path file:
export PATH="/usr/local/mysql/bin:$PATH"

Reiniciamos:
source ~/.bash_profile

Y creamos un enlace simbolico para los programas que necesiten del socket de MySQL (por ejemplo MySQLBrowser):

sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock

Y pues voala, ya tenemos nuestros servicios para desarrollo.

Hasta la próxima.

miércoles, 21 de marzo de 2012

Solución del uso de Query Browser en Mac (GUI Tools Mysql)

Para los que somos usuarios MAC y hacemos correr nuestra DB con el XAMPP esta es la solución para poder usar el MySQL Query Broswser y otras herramientas del GUI Tools Mysql:

Primero que nada, la linea de comandos:
Nos es necesario usar la terminal a muchos para hacer tareas de respaldo o restaurar backups de nuestras bases de datos, pero cuando digitamos "mysql" o "mysqldump" en la terminal (o consola) nos da un mensaje de error, esto pese a que tenemos activo el MySQL mediante el XAMPP, pues bien, se puede solucionar de 2  maneras:

1) Haciendo un alias:
En la terminal digitamos: alias mysql=/Applications/XAMPP/xamppfiles/bin/mysql
Y listo ya podremos usar el mysql desde la terminal.

2) Realizando un link simbolico (esta la recomiendo):
En la terminal digitamos: sudo ln -s /Applications/XAMPP/xamppfiles/bin/mysql /usr/bin/mysql
Y bien! así ya podremos usar nuestra terminal con mysql.

Ok, ahora si, vamos con la solución del problema de conexión del MySQL Query Browser:

El problema que siempre nos presenta al querernos conectar es el de socket, y solucionar esto es muy sencillo, simplemente digitamos en la terminal los siguiente:

sudo ln -s /Applications/XAMPP/xamppfiles/var/mysql/mysql.sock /tmp/mysql.sock

Y todo solucionado!!

sábado, 26 de noviembre de 2011

Configuración de Apache para uso de WebSocketen sitios HTML5

Antes que nada esto fue implementado en un servidor local Apache2 sobre Ubuntu 11.04.


Primero debemos elegir un directorio para descargar mediante svn el pywebsocket que es el que utilizaremos:


Eh elegido /var/ luego descargamos las fuentes:
sudo svn checkout http://pywebsocket.googlecode.com/svn/trunk/ pywebsocket-read-only


Una ves descargado, procedemos a ingresar al directorio contenedor:
cd pywebsocket-read-only/src/


Y ejecutamos:
sudo python setup.py build


Luego:
sudo python setup.py install


Y voala, ya tenemos nuestro pywebsocket instalado, ahora procedemos a configurar nuestro apache, para ello editamos el archivo /etc/apache2/httpd.conf agregando lo siguiente:


PythonPath "sys.path+['/usr/local/lib/python2.7/dist-packages/mod_pywebsocket']" PythonOption mod_pywebsocket.handler_root /var/websockets/ PythonHeaderParserHandler mod_pywebsocket.headerparserhandler


Bueno en la segunda linea eh dado como ruta para los archivos manejadores /var/websockets/ por razones de seguridad no usamos el directorio root http (var/www/) pero puedes eligir la ruta que mejor te plazca, otra cuestión es que debes chequear la versión de python instalada, en mi caso fue la 2.7 y el directorio lleva por nombre python2.7, pero es posible que instales una versión superior en cuyo caso este cambiaría, solo es cuestión de revisar las rutas desde la consola con nuestro famoso cd + tab.


Ahora bien, es obvio que usaremos python para gestionar nuestro websocket, por lo que Apache requerirá de el modulo de python para gestionarlo, por lo que lo instalamos:


sudo apt-get install libapache2-mod-python


Y luego lo agregamos a la configuración por defecto de sitios, editamos el archivo /etc/apache2/sites-available/default e incluimos estas 3 ultimas lineas en negrita:


Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all AddHandler mod_python .py PythonHandler mod_python.publisher PythonDebug On


A estas alturas te habrás fijado que van incluidas en el bloque /var/www/


Y para verificar que nuestro Apache procesa el python, reiniciamos el servidor y creamos un archivo en nuestro root apache (/var/www/) con el nombre de test.py incluyendo el siguiente contenido:


def index(req): return "Test completado"


Luego vamos al browser y lo probamos (localhost/test.py) y lo que debemos obterner es un print con la frase "test completado".


Con esto ya tenemos nuestro websocket listo para usar, ahora si toca un ejemplo:


En la ruta que definiste para el websocket (en mi caso /var/websockets) crea el siguiente archivo:


date_wsh.py con el siguiente contenido:


from mod_pywebsocket import msgutil from datetime import datetime import time _GOODBYE_MESSAGE = 'Goodbye' def web_socket_do_extra_handshake(request): print 'Conectado.' pass # Always accept. def web_socket_transfer_data(request): while True: time.sleep(1) date = datetime.now() hoy= date.strftime("%Y-%m-%d %H:%M:%S") msgutil.send_message(request, 'dataformat!%s' % hoy)




Y en el var/www/ el siguiente html:


prueba_websocket.html


<html> <head> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> <script> $(document).ready(function(){ var ws; if ("WebSocket" in window) { //debug("Horray you have web sockets. Trying to connect..."); ws = new WebSocket("ws://localhost/data"); ws.onopen = function() { // Web Socket is connected. You can send data by send() method. debug("connected..."); ws.send("hello from the browser"); ws.send("more from browser"); }; run = function() { var val=$("#i1").val(); // read the entry $("#i1").val(""); // and clear it ws.send(val); // tell erlang return true; // must do this }; ws.onmessage = function (evt){ //alert(evt.data); var data = evt.data; var i = data.indexOf("!"); var tag = data.slice(0,i); var val = data.slice(i+1); $("#" + tag).html(val); }; ws.onclose = function(){ debug(" socket closed"); }; }else{ alert("You have no web sockets"); }; function debug(str){ $("#debug").append("<p>" + str); }; }); </script> </head> <body> <h1>Interaction experiment</h1> <h2>Debug</h2> <div id="debug"></div> <fieldset> <legend>Clock</legend>
<div id="dataformat"></div>
</fieldset> </body> </html>




Carga el archivo html en tu browser y listo! veras como tienes un reloj informandote cada segundo su estado, directamente de tu servidor usando un websocket!!


Como nota adicional, esto solo funciona con Google Chrome, el resto de navegadores no fue testeado.


Saludos y mis disculpas por la poca redacción, es tarde y estoy muy cansado, pero queria compartirles esto.

martes, 9 de agosto de 2011

Instalando Python-Gammu en Ubuntu

Para los que hemos iniciado con la utilización de Gammu para diferentes gestiones con modems GSM, eh aquí los paso para su instalación por consola (que es lo más fácil a mi parecer):

Instalamos Gammu

sudo apt-get install gammu

Luego buscamos el puerto de nuestro modem conectado mediante:
dmesg|grep tty

Configuramos Gammu:
gammu-config

O creamos un archivo en el root de nuestro usuario Ubuntu:
~/.gammurc


Con el contenido siguiente:

[gammu]
port = /dev/ttyUSB0
model =
connection = at19200
synchronizetime = yes
logfile =
logformat = nothing
use_locking =
gammuloc =

Probamos su funcionamiento:
gammu getallsms

Y si todo va bien, instalamos python-gammu:
sudo apt-get install python-gammu

Saludos.

viernes, 15 de julio de 2011

INSERT INTO SELECT, Copiar datos de una tabla a otra

En ocasiones nos topamos con la tarea de tener que copiar datos desde una tabla a otra tabla dentro de nuestra base de datos, incluso suele suceder que los nombres de los campos varíen, pero eso no es un problema mientras el tipo de datos sea el mismo.

Eh aquí la solución rápida a esa labor (que se torna en problema si no sabemos los pasos indicados)

INSERT INTO tabla1(campo1, campo2, campo3)
(SELECT t2.campo1,  t2.campo2, t3.campo3
FROM tabla2 t2)


Como ven el insert se realiza de forma normal hasta el punto en donde tenemos que nombrar los campos, luego puede verse que no eh usado la instrucción VALUES, si no que directamente eh agregado entre parentesis una consulta SELECT.

En el SELECT eh especificado el nombre de los campos que tendran el valor, que en el mismo orden en que declare los campos de la tabla1 se iran llenando, cabe destacar que no importa si los campos tienen el mismo nombre, lo que debemos respetar es el orden, tal como si lo hicieramos agregando el VALUE.

jueves, 7 de julio de 2011

Permitir acceso remoto MySQL Servidor Ubuntu

Dado las multiples peticiones de un provedor de soluciones a uno de nuestros clientes por la implementación de un ivr, hubo la necesidad de ofrecer la posibilidad de conexión remota al servidor mysql, para lograr ello eh aquí los pasos:

­Acceder con un editor al archivo my.cnf:

sudo nano /etc/mysql/my.cnf

Comentar la linea donde dice, poniendo un # al inicio:
#bind­address = 127.0.0.1

Configurar mySQL para avisarle que se pueden conectar usuarios desde otras maquinas
ejecutar desde consola:

mysql ­u root ­p

Desde dentro de mySQL ejecutar:

GRANT ALL ON *.* TO root@numero_ip_remoto IDENTIFIED BY 'password_del_usuario';

Salir de mysql:quit

Reiniciar el server mySQL:

sudo /etc/init.d/mysql restart

Probando si es efectivo desde una consola remota:

mysql ­u root ­p ­h numero_ip_remoto

Y si entra a la consola mySQL todo OK!!!