martes, 20 de agosto de 2019

Decompilando Java

Disclaimer: Este post es sin animo de incitar a usos indebidos de las herramientas.

En estos días he tomadoun sistema legado de un cliente, el sistema funciona en tomcat y obviamente esta escrito en java y como la mayoría de las veces pasa no existen las fuentes del proyecto así que me di a la tarea e investigar como hacer para darle mantenimiento.

Después de mucho investigar aquí va la receta por si algún día tienen un problema similar

1. Hacer una copia del proyecto, generalmente es un archivo war
2. Descompilarlo con Java decompiler (http://java-decompiler.github.io)
3. Desde Java decompiler guardar las fuentes de todos los archivos. (esto genera un archivo .zip)
4. Descomprimir el zip en un directorio
5. Limpiar la basura generada por Java decompiler.

Para este paso usaremos las siguientes lineas de código (se asume para este ejercicio una consola de linux)

find . -type f -exec sed -i 's/\/\*\s*[0-9]*\s*\*\///g' {} \;
find . -type f -exec perl -i -0pe 's/\/\*\s*Location.*\n\s*\*\s*\Java compiler version.*\n\s*\*\s*JD-Core Version.*\n.*\*\///gm' {} \;

Estos archivo, supongo pueden cambiar de acuerdo a la versión de Java decompiler, este ejercicio se realizo con JD-Core Version:       1.0.7

6. Importar el proyecto en el IDE de su preferencia.


martes, 19 de noviembre de 2013

Agregar usuarios terminal mac os x

Agregar usuarios en una máquina con Mac OS X desde la terminal es una tarea un tanto compleja, estos son los pasos que me han funcionado.

mkdir /Users/usuario
dscl . -create /Users/usuario
dscl . -create /Users/usuario UserShell /bin/bash
dscl . -create /Users/usuario RealName "datos usuario"
dscl . -create /Users/usuario UniqueID "id usuario"
dscl . -create /Users/usuario PrimaryGroupID idgrupo

dscl . -passwd /Users/usuario "clave usuario"
chown usuario:grupo /Users/usuario
dscl . -create /Users/usuario home /Users/usuario

dscl . -create /Users/usuario NFSHomeDirectory /Users/usuario

dseditgroup -o edit -a usuario -t user com.apple.access_ssh


jueves, 31 de octubre de 2013

Como cambiar charset linux ^M

Cuando se edita un archivo de una máquina linux con WinSCP, este programa le cambia el charset agregando un ^M al final de cada linea como texto por lo que hay que cambiar todas las apariciones de esos caracteres en el archivo por un retorno de caroo con la siguiente instrucción dentro de vi

:1,$s/^M/\n/g

miércoles, 7 de noviembre de 2012

MySQL - Permitir conexiones remotas

Si queremos que otras maquinas puedan ver nuestras bases de datos tenemos que crear un usuario y permitirle conectarse desde una maquina remota tanto en la base de datos como en el firewall.

En MySQL

mysql> GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'IP' IDENTIFIED BY 'PASSWORD';
mysql> FLUSH PRIVILEGES;

Nota: el parámetro IP puede ser % para permitir conexiones desde cualquier servidor.

En IPTABLES

Para permitir que cualquier maquina pueda conectarse a mysql

iptables -p tcp -m tcp --dport 3306 -j ACCEPT

Para permitir que una maquina especifica pueda conectarse a mysql
iptables -p tcp -m tcp -s x.x.x.x --dport 3306 -j ACCEPT

x.x.x.x - dirección ip de la maquina que se conectara a mysql

Nota: Hay que procurar usar direcciones IP para no tener problemas de conexión en caso de fallo del DNS

martes, 6 de noviembre de 2012

Certificados SSL

Si queremos registrar nuestro sitio para que acepte conexiones SSL debemos generar los certificados de la siguiente manera: 1. Generamos el par de llaves openssl genrsa -des3 -out www.mydomain.com.key 2048 2. Generamos el certificado openssl req –new –key www.mydomain.com.key –out www.mydomain.com.csr Este último archivo debe enviarse a alguna agencia verificadora para que el navegador al acceder al sitio sepa que es un sitio seguro y no mande mensajes de alerta. Fuente: http://toolboxnet.blogspot.mx/2012/06/pasos-para-generar-llaves-ssl-en-apache.html#.UJloq3VmLSg

Verificar crontab de un usuario

Si somos administradores de un sistema podemos revisar los comandos que cada usuario tiene en su crontab. crontab -u -l

Ver Usuarios Mac OS X Server

Si queremos listar rápidamente todos los usuarios del servidor tenemos que aplicar el siguiente comando en la consola. dscl /LDAPv3/127.0.0.1 -list /Users RealName Referencia: https://discussions.apple.com/thread/1392481?start=0&tstart=0

lunes, 5 de noviembre de 2012

Acceder a MySQL con un “too many connections”

Si no es posible reiniciar el servicio por ese error, este comando permite aumentar el numero de conexiones para acceder y pararlo. gdb -p `cat /var/run/mysqld/mysqld.pid` -ex "set max_connections=1000" -batch Fuente: http://dmnet.bitacoras.com/archivos/software/acceder-a-mysql-con-un-too-many-connections.php

domingo, 21 de agosto de 2011

Instalar Eclipse en ubuntu

sudo apt-add-repository "deb http://archive.canonical.com/ natty partner"
sudo apt-get update
sudo apt-get install sun-java6-jre sun-java6-plugin sun-java6-fonts

sábado, 16 de octubre de 2010

Botones de stock de glade en ubuntu

Para que se vean los botones de stock generados con galde y pygtk en ubuntu se debe hacer lo siguiente

en gcon-editor activar

/desktop/gnome/interface/{buttons_have_icons,menus_have_icons}

Fuente

http://www.mail-archive.com/pygtk@daa.com.au/msg18483.html

domingo, 10 de octubre de 2010

Webkit en windows

Para usar webkit en windows usaremos gtk y python

Python puede descargarse en binario desde

Descargamos el run-time de gtk de la siguiente liga

Descomprimimos el zip en algun directorio, por ejemplo C:\gtk, y lo agregamos al path de windows

Las bibliotecas de gtk para python se pueden descargar de http://www.pygtk.org/downloads.html

se deben descarga e instalar los archivos siguientes

Nota: Es importante que la versión de las bibliotecas de gtk sean para la versión de python que este instalado.

El run-time de Webkit se puede descargar de la siguiente liga

Descomprimimos el zip en algun directorio, por ejemplo C:\webkit, y lo agregamos al path de windows

Las librerias de webkit para python pueden descargarse de la siguiente liga

Instalamos el binario del zip y tenemos nuestro sistema listo para trabajar con webkit

jueves, 24 de junio de 2010

Compilando en Flex

Para compilar una aplicación en flash en linux sin tener que estar recurriendo a la consola cada vez, podemos usar el siguiente script de bash que debe agregarse en las herramientas externas de gedit.

#!/bin/bash
if (/ruta/a/flex/bin/mxmlc -library-path+=/ruta/a /librerias/libs/lib/map_flex_1_18.swc "$GEDIT_CURRENT_DOCUMENT_PATH")
then
/usr/bin/firefox "`echo $GEDIT_CURRENT_DOCUMENT_PATH | awk -F.mxml {'print $1'}`.swf"
fi

En mi casi uso F11 como atajo pero pueden poner la tecla que prefieran

lunes, 24 de agosto de 2009

Parser sencillo Python


#!/usr/bin/python
# -*- coding: iso-8859-15

import re
import os
import sys
import fileinput
import time

from datetime import date
from datetime import timedelta

conrec = 1
conart = 1

gtipo = ""
gunidad = ""
greceta = ""

tipos = {"Individual":"I","Colectivo":"C","Colectivas":"C"}
estampas = {}

frec = open('recetas.txt','w')
fart = open('articulos.txt','w')

def procesar_tipo(m):
global gtipo

if gtipo <> m.group(1):
gtipo = m.group(1)

def procesar_unidad(m):
global gunidad

if gunidad <> m.group(1):
gunidad = m.group(1)

def procesar_receta(m, archivo, fecha, hora):
global greceta, gunidad, gtipo, tipos, conrec, frec

if greceta <> m.group(1):
greceta = re.sub('\|','',m.group(1))

conrec += 1
if len(m.groups()) == 3:
nombre = ""
else:
nombre = re.sub('\|','',m.group(3).strip())

fecha_rec = m.group(2)

if (fecha == ''):
estampa = fecha_rec.split("/")
estampa = date(int(estampa[2]),int(estampa[1]),int(estampa[0]))
estampa = estampa + timedelta(days=1);
else:
estampa = fecha

cadena = "%s|%s|%s|%s|%s|%s|%s|%s|%s" % (conrec,greceta.strip(),gunidad,tipos[gtipo],nombre,fecha_rec,archivo,estampa,hora)
#print cadena
frec.write(cadena + "\n")

def qcomas(cadena):
return re.sub(',','',cadena)

def procesar_articulo_cp(m):
global conart, conrec, fart

conart += 1
cadena = "%s|%s|%s|%s|%s|%s" % (conart,conrec,m.group(1).strip(),qcomas(m.group(4)),qcomas(m.group(5)),qcomas(m.group(3)))
#print cadena
fart.write(cadena + "\n")

def procesar_articulo_sp(m):
global conart, conrec, fart

conart += 1
cadena = "%s|%s|%s|%s|%s|%s" % (conart,conrec,m.group(1).strip(),qcomas(m.group(3)),qcomas(m.group(4)),0.0)
#print cadena
fart.write(cadena + "\n")

def parse(linea, archivo, fecha, hora):
tipo = "Reporte de\s+(\w+)"
tipo_surtimiento = "Reporte de Surtimiento\s+(\w+)"
unidad = "UNIDAD\s+(\d+)"
receta = "([\w|\s|\-]+)\s+(\d+\/\d+\/\d+)\s+([\w|\s|\À|,|\(|\)|\.|\Ñ|\/|\`|\-]*[\w|\.]\s\s\s)\s+(\w+)"
#receta = "([\w|\s|\-]+)\s+(\d+\/\d+\/\d+)\s+(\w+)"
receta_sn = "([\w|\s|\-]+)\s+(\d+\/\d+\/\d+)\s+(\w+)"
articulo_cp = "((\w+[\s|\/|\.|\-])*\w+)\s+[\w|\d|\s|\:|\.|,|\;|\(|\)|\/\%|\-|Á|É|Í|Ó|Ú|Ü|á|é|í|ó|ú|ü|À|È|Ì|Ò|Ù|à|è|ì|ò|ù|Ñ|ñ]*\s+\$\s+([\d+,]*\d+\.\d+)\s+([\d+,]*\d+)\s+([\d+,]*\d+)\s+\$\s+([\d+,]*\d+\.\d+)"
articulo_sp = "((\w+[\s|\/|\.|\-])*\w+)\s+[\w|\d|\s|\:|\.|,|\;|\(|\)|\/\%|\-|Á|É|Í|Ó|Ú|Ü|á|é|í|ó|ú|ü|À|È|Ì|Ò|Ù|à|è|ì|ò|ù|Ñ|ñ]*\s+([\d+,]*\d+)\s+([\d+,]*\d+)"
patrones = {"tipo":tipo,"tipo_surtimiento":tipo_surtimiento,"unidad":unidad,"receta_cn":receta,"receta_sn":receta_sn,"articulo_cp":articulo_cp,"articulo_sp":articulo_sp}

for llave,patron in patrones.iteritems():
m = re.match(patron, linea)

if m <> None:
if llave == "tipo_surtimiento":
procesar_tipo(m)
elif llave == "tipo":
procesar_tipo(m)
elif llave == "unidad":
procesar_unidad(m)
elif llave == "receta_cn":
procesar_receta(m, archivo, fecha, hora)
elif llave == "receta_sn":
procesar_receta(m, archivo, fecha, hora)
elif llave == "articulo_cp":
procesar_articulo_cp(m)
elif llave == "articulo_sp":
print "Holas"
procesar_articulo_sp(m)
break

def recorrer_lineas(path, archivo, fecha, hora):
for line in fileinput.input(path + archivo):
parse(line, archivo, fecha, hora)

def recorrer_archivos(directorio):
global frec, fart, estampas

for base, dirs, files in os.walk(directorio+"txt/"):
for f in files:
#print "parsing: %s ..." % (f)
estampa = estampas[f[:-3]]
recorrer_lineas(base,f,estampa['fecha'],estampa['hora'])
#recorrer_lineas(base,f,'','')

frec.close()
fart.close()

def obtener_estampa(directorio):
global estampas
estampa = {}

for base, dirs, files in os.walk(directorio+"pdf/"):
for f in files:
tiempo = os.stat(base + f)
estampa['fecha'] = time.strftime("%Y-%m-%d",time.localtime(tiempo.st_mtime))
estampa['hora'] = time.strftime("%I:%M:%S",time.localtime(tiempo.st_mtime))
estampas[f[:-3]] = estampa

def main():
if len(sys.argv) >=2:
obtener_estampa(sys.argv[1])
recorrer_archivos(sys.argv[1])
else:
print "Debe indicar la ruta de los archivos pdf y txt"

if __name__ == '__main__':
main()

jueves, 30 de julio de 2009

PostgreSQL Encoding

If you have an old postgres database that is still stored in SQL_ASCII and you want to move to one stored in UTF-8 (which is the standard for OpenACS), you can do the following:

- pg_dump -f your_db.dmp your_db
- iconv -f ISO8859-1 -t UTF-8 your_db.dmp > utf.dmp
- psql your_utf_db < utf.dmp

This assumes, that SQL_ASCII has been storing the content in ISO8859-1, which is a safe bet if you are in the US or western Europe. But don't nail me on that, if it does not work, try different source character sets (manual for iconv: http://www.mkssoftware.com/docs/man1/iconv.1.asp)

sábado, 14 de febrero de 2009

Serpientes y Escaleras 2a parte

Hola a todos mis posibles lectores, ya estuve trabajando el proyecto de Serpientes y Escaleras y ahora pongo una imagen de mis avances.

Quite el fondo para hacer pruebas y porque estoy pensando en retirarlo y poner algo mas llamativo, esto porque posiblemente pase todo a pygame para darle mayor versatilidad, pero eso ya lo veré en la semana.

Pondré los fuentes en la próxima entrega, donde también tratare de explicar un poco como fue codificado el juego.

domingo, 8 de febrero de 2009

Serpientes y Escaleras

El primer juego que haré sobre el tablero que mencione en el post anterior es el de Serpientes y Escaleras, del cual a continuación pongo el diagrama que guiara la programación, si alguien lee el blog y de casualidad tiene un comentario no dude en ponerlo.

Como se ve en el diagrama, el flujo del juego es de izquierda a derecha en algunas lineas y de derecha a izquierda en otras de manera alternada. Habra un dado, aunque en la figura se muestran dos, o un papelito que asomara de un jarrito para seguir las reglas de la página del ILCE, puede haber de manera simultanea 6 jugadores, que podrán estar en la misma máquina o conectados por red.

La reglas del juego pueden leerse aquí

lunes, 2 de febrero de 2009

Juegos en Python

Estoy haciendo unos juegos que me propuse hacer hacer algún tiempo y que por varios motivos había pospuesto, pero bueno, ahí va avanzando la cosa, lo que quiero mostrar en este post es el tablero que usare para poner los juegos, lo copie de los juegos de Gnome pero aun tiene fallos, iré mostrando los avances y al finalizar publicare el código.

De momento les dejo una imagen del tablero en su estado actual.


jueves, 29 de enero de 2009

Bot MSN

Estos días he estado haciendo programas pequeñitos en python, que iré publicando según me dé tiempo y me acuerde.

En esta ocasión pondré un programa que es una vil copia del sitio de la biblioteca de msnp pero corregido para que reflejen los cambios en las listas de los contactos del bot.

Sin más preámbulo ahí va el código :)
# echobot.py -- echo messages back to sender

import msnp
import time

class MsnChatListener(msnp.ChatCallbacks):
def message_received(self, passport_id, display_name, text, charset):
print '%s: %s' % (passport_id, text)
self.chat.send_message(text, charset)

class MsnListener(msnp.SessionCallbacks):
def chat_started(self, chat):
callbacks = MsnChatListener()
chat.callbacks = callbacks
callbacks.chat = chat

msn = msnp.Session(MsnListener())
msn.login('tlahtoa@hotmail.com', 'password')
msn.sync_friend_list ()

while True:
msn.process(chats = True)
time.sleep(1)